Macでプログラミング{3}

このエントリーをはてなブックマークに追加
952名称未設定:04/03/16 00:27 ID:ucsM2FuC
>>951
その方法は俺も一通り調べたけど、分からなかった。
本当はソフトの側からことえりの入力モードを操作したいのだけど

俺の場合はCarbonなのでTSM周りかなぁと思ったんだけどね
953名称未設定:04/03/16 14:50 ID:AJdn+IWr
>>951
あっちに書いたのはダメだったんすか? 10.3のTSMに変更/追加されたAPI
954名称未設定:04/03/16 23:55 ID:840aPt/a
おい、誰か951の質問に答えてやれよ?
知らないのか?
955名称未設定:04/03/17 01:04 ID:LoyE8T92
入力モードって何?
平仮名とかそういうこと?
956名称未設定:04/03/17 01:26 ID:N20DvEjf
>>953
俺もそれ使いたいんだけど、サンプルとかないですかねぇ。

>>955
そうそう。ひらがな、英数、半角カナなど
957名称未設定:04/03/18 01:31 ID:MTJM+0Dd
全然見当もつかん。
ことえりってAppleEvent受け付けたっけ?
958名称未設定:04/03/18 01:48 ID:fdp+Ji1L
OSXは知らんが、OS9時代はAEでコミュニケーション取ってたような。
959名称未設定:04/03/19 00:21 ID:bcCIC+lF
色々とレス感謝です。

再度TSM調べてみましたが、ダメそうです。入力モード情報のDictionaryを取るまでは
できたのですが、そこには現在のモードがどれであるかの情報は含まれてませんでした。

ヘッダとリファレンスを読む限りでは kTSMDocumentInputModePropertyTag か
kTextServiceInputModePropertyTag を使えば現在のモードが取れそうなんですが、
実際いくつかの関数で使ってみても、他の必要な引数が間違っているようで、エラーに
なってしまいます。
また、Component Managerの型を多用しているので、そちらも組み合わせたりすると、
出来たりするのかもしれません(調べ疲れた...)。

結局、Script ManagerでキーボードのScriptを取得すると、今のモードが半角英字か
それ以外かの判定はできそうなので、とりあえずそれで一段落してるとこです。

>>955
そうです。入力モードパレットと同じことをアプリケーションで出来ないかと。

>>957-958
確かにTSMには、IM側からアプリケーションにAEかCarbonEventを投げる関数が
用意されています。
コンポーネント(っていう表現でいいのかな?)に対してAEを投げるのは、アプリケーション
に対して投げるのと同様の手順でいいのでしょうか?(送信先をクリエータで指定するとか)

その辺の関連する情報ご存知でしたら教えていただけたら幸いです。
960951:04/03/19 00:25 ID:bcCIC+lF
失礼。959=951 です。念のため。
961951:04/03/19 00:44 ID:bcCIC+lF
>>952
やや技巧的な方法ですが、入力モード変更のショートカットと同じキーボードイベントを
発生させる、ってのもあるかもしれません。
962名称未設定:04/03/19 00:57 ID:4BBNvjNX
>>951
僕が作るとしたら、TSMは分かんないんで、MenuExtraのsetImage:にパッチして、
NSImageをそのまま流用、とかかな。
うまくパッチできるかどうかが問題だが
963951:04/03/19 01:15 ID:bcCIC+lF
>>962
パッチってよく分からないんですが、関数やメソッドを横取りするようなことですよね?
そういうことってOS Xでも出来るんですか?
ちなみにその方法は、メニューに表示してなかったらアウトですよね?
964名称未設定:04/03/19 01:27 ID:4BBNvjNX
>>963
メニュー出してることが必須ですね(´д`;)
パッチはUnsanityのApplication Enhancer使えば簡単です。
ただしこの場合、最初にパッチを仕掛けるタイミングでMenuExtraが
まだ読み込まれていないと思うので面倒そう
965名称未設定:04/03/19 01:37 ID:S2OvSQyj
>>960
おれも試してみたよ。
CopyTextServiceInputModeList()は確かにうまく動く。
問題はkTextServiceInputModePropertyTagの場合のGetTextServiceProperty()だ。
間違ったパラメータを渡しようがないのにKotoeriComponentDispatchで落ちちゃうね。
kTextServiceJaTypingMethodPropertyTagは'roma'しか返らないようだしな。
ことえりしか持ってないから他のはしらん。
966名称未設定:04/03/19 02:17 ID:jTiQHXBZ
別の質問だけどいいかな?
PowerPlantでアプリ作ってるんだけど、LEditTextにインライン入力を可能にしようと思ったところで
壁にぶつかっちゃった。
もしかしてインライン入力対応ってすんげーめんどくさい?
LMLTEPaneはIn Progressらしいので使うの恐いし。(CW8です。9でもin progressのまま?)
何かお手軽な方法があったら教えてホスィのですが。。。
967名称未設定:04/03/19 08:31 ID:efh7naSE
>>959 最後のやつ
TextServiceEventRef()でCarbon Eventを投げる。

>>969 全然、求める答えじゃないけどw
これ使うならそうでもない。
http://developer.apple.com/technotes/te/te_27.html
使わずにTSMのhilite rangeとか覗いたりしてインライン入力風に見せるのはちょっと面倒。
968名称未設定:04/03/19 08:36 ID:efh7naSE
間違えた… >>967の下のやつは>>966
969951:04/03/20 01:46 ID:n5RzCrmH
>>959 でScript Managerで云々と書きましたが、、、
具体的には、GetScriptManagerVariable(smKeyScript); で、半角英字か
それ以外かを判定できるはずだったんですが、それが機能するのはアプリが
手前に来ている場合だけでした(それ以外はsmRomanしか返りません)。

もう八方塞がり気分なのであきらめます。今週ずっと仕事の合間にコツコツ調べたのに(´・ω・`)

TSMちなみに、>>965にあるように、GetTextServiceProperty()も機能してくれませんし、
また、GetTextServiceProperty()に kTextServiceInputModeRoman か
kTextServiceInputModeJapanese を渡すことでモード変換が出来そうなんですが、
実際はモードの表示のみが変わっているだけできちんとモード変換されていません。
(バグだらけなんじゃネェの?あぁ?)
970951:04/03/20 02:22 ID:n5RzCrmH
>>969 を訂正

× GetTextServiceProperty()に kTextServiceInputModeRoman か...
○ TSMSelectInputMode()に kTextServiceInputModeRoman か...

 ∧||∧
(  ⌒ ヽ 俺もバグばっか
 ∪  ノ
  ∪∪
971名称未設定:04/03/20 02:30 ID:6AfqNYDO
>>966
ぐぐったらこんなん出てきた。

 http://www.jwwalker.com/pages/ccarbonedittext.html

実際に使ったわけじゃないけど。
あと、WASTEのPowerPlantラッパがあったような気がする。
やや大げさだけどインライン入力できるはず。
972名称未設定:04/03/21 15:11 ID:yNHB9Eai
初歩的な質問2つです。

1) mi や Xcode で、C言語の超基本的なお遊びサンプルPGを作って
遊んでるのですが、えーと、たとえばこんな奴、

int main(){
printf("Hello MacWorld¥n");

return 0;
}

こういうのを Terminal や Xcode(もちろん ZeroLink オフ)でコンパイル
して実行ファイルを作りますよね。その実行ファイルを友達に送信して、
試してもらったりしても、Terminal が起動するだけで何も起こりません。
これって、要するに何がイカンのでしょうか?

2) コード中に"gets" を記述したプログラムをコンパイルして実行すると、
"gets は危ないですよ" 的な警告メッセージが表示されます。ラインバッファ
方式が云々で危ないのだという話はなんとなく理解できるのですが、
getsの代わりにもっと使い勝手の良い関数があるのでしょうか?
getchar(getche) は conio.h が必要らしく、OS X環境では初心者には
扱えないようなので。

よろしくお願いします。
973名称未設定:04/03/21 15:14 ID:yNHB9Eai
間違って age ちゃいました。

あ、あと、適当に書いた int main 以下の部分は、もちろん #include あたりを
省略したつもりで、「自分の環境ではきちんと期待どおりに実行できるのに」、
という意味での質問です。
974名称未設定:04/03/21 15:33 ID:YbrGpW4M
1)
Terminalが起動するだけで何も起こりませんといっても
Terminalを起動してから実行するものではないでしょうか。
よく分かりません

2)
getsの代わりはfgetsですね。
getcharもstdio.hがあれば使えるはずです。
975名称未設定:04/03/21 15:47 ID:yNHB9Eai
>>974
音速レスどうもです。
1) に関して詳しく書きますと、

miでコード記述 → Terminal でコンパイル →
特に指定しなければ実行形式としてカレントディレクトリに "a.out" ができる

で、自分の環境ではこの a.out(白紙アイコン) をダブルクリックする事で、
Terminal が起動し、しょうもない自作プログラムが開始されるわけなんです。

で、Finderの「情報を見る」でこの "a.out" をTerminal で起動するように設定して
(↑これが意味のある操作かどうか、よくわかってませんが)、"a.out" をメールで
送信して友達に試してもらおうとしますと、
「"a.out" のダブルクリックで Terminal が起動はするけど、何も起こらない」
と、こういう話の流れなんです。

たぶん根本的なところがわかってないんだろうとは思うのですが、
上記のような考え方は、そもそもの発想が間違ってますか?

2)
ありがとうございますです。調べてみます。
976名称未設定:04/03/21 16:02 ID:YbrGpW4M
>>975
話が分かりました。Terminalに関連付けしておくとダブルクリックで起動できるんですね。
今まで知りませんでしたw
で、おそらく原因は送った際にパーミッションの情報が失われたからだと思います。
相手に手動で直してもらうか、送る際にtarで固めて送るなりすれば大丈夫かと思われます。
977名称未設定:04/03/21 16:22 ID:YJqBUYpL
>>976
おお。なるほど。

cc test.c
で作成された a.out は関連づけした後 Terminal で実行できるのに、
cc test.c > b.out
で作成された b.out はそれができないというのも疑問だったんです。
ls -l で見てみたら、確かに、後者のファイルは実行権が不可でした。
UNIXの理屈もほとんど知らないんですが、勉強になります。どうも。
978名称未設定:04/03/21 17:39 ID:R9DKCzbV
>>977
コマンドラインアプリは素直に Terminal から起動する習慣をつけた方が
いいような気がする。

対話シェルに何を使ってるのか知らないけど

alias run ./a.out

みたいなことをやっとくと便利かもね。
979名称未設定:04/03/21 18:23 ID:z72rqY93
>>977
書き間違いだと思うが、
cc test.c > b.out
でなく
cc test.c -o b.out
では?
980名称未設定:04/03/21 18:48 ID:BbnFfYuX
tarで固めるとファイル個別の関連づけは消えると思うから注意してね
981名称未設定:04/03/21 23:12 ID:HBQylBSn
みなさんどうもです。
原則的にWin向けの超初歩教科書みたいなのを参考に遊んでるんで、
UNIX的な部分の無知でひっかかるとは考えに入っておりませんでした。

>>979
その通りでありました。書き間違いじゃなくて真性というやつです。
UNIXのコマンドもまだ ls、rm、mkdir、cp ぐらいしか知らないアホなのです。

前述>>976さんのパーミッションの話、
いくつかのサイトで tar の使い方から調べてみたのですが、たとえば
~/sample/a.out
なんて所に実行ファイルを作りまして、cd ~/sample でその階層をカレント
ディレクトリにしてから、
tar cvf ~/Desktop/sample_out.tar . -p
(パーミッションを保持したまま、カレントディレクトリの内容を書庫として
 デスクトップに sampl_out.tar という名前で作成する)
とし、この sample_out.tar をWeb経由で他人のMacで実行してもらったのですが、
やはり「exit;」と出ただけで終了してしまいました。

と、ここまで書いた時点で>>980さんの書いて下さったアドバイスが、つまり、
こうなるから気をつけたまえ、という事ですね。うむ、なるほど。

>>978
相手方が全くUNIX的な知識がなくて、私の作ってるプログラムというのも
本当に小学生レベルのしょうもないモノなので、ただ単に何も知らない人でも
ダブルクリックして遊べたら良いんだけどな、程度の質問だったんです。
しかし確かにおっしゃる通りなようで。ありがとうございます。
982名称未設定:04/03/21 23:43 ID:vz6Wp3k/

OS X 同士でやりとりするなら、下手に tar とか使わず読み書き可能の
ディスクイメージ作ってそこにコピーして、.dmg をやりとりした方が
便利だよ。

gzip で圧縮かければそこそこ縮むし、HFS+独自の属性も残るし、また、
気になるなら ディスクユーティリティで読み込み専用に変換すれば
自前圧縮(ZLib)かけた .dmg を作ってくれる。

983名称未設定:04/03/22 00:52 ID:pq09S50w
tar.gzipでバックアップしちまってえらい目にあったことあるよ。
984名称未設定:04/03/22 01:08 ID:rDrT5mci
DropTar使え
985名称未設定:04/03/22 23:05 ID:+cQ7B7pc
すみません。誰か教えて下さい。

ある特定のアプリケーションが動作しているかを
チェックしたいのですが、MacOS 10.3で別のユーザが
起動しているプロセスを見つける方法がわかりません。
別のユーザが起動しているプロセスを取得する方法を
どなたか、ご存じないでしょうか?

ちなみに、GetNextProcess()では自分のプロセスしか
見つけられませんでした。
986名称未設定:04/03/22 23:15 ID:QUfmNPsv
Terminalからps -ax と言ってみるテスト。

987名称未設定:04/03/23 08:43 ID:lTV8oTxK
その次にGetProcessForPID()を使うと、もしかして…

でもダメそうだなw
988985:04/03/23 11:14 ID:hXPY2qrZ
レスありがとうございます。

自己レスですが、↓こういうのがありました。
http://developer.apple.com/ja/qa/qa2001/qa1123.html

でも、2重定義だって怒られて、ビルドできない…
CFMアプリで上記のコードは使用できるのかな?
Macプログラミング初心者でスマン。
989名称未設定:04/03/23 11:35 ID:JP1hKVvX
>2重定義だって怒られて、ビルドできない…

そこまで試す気なし
そのまま示されい
990985:04/03/23 14:05 ID:hXPY2qrZ
エラーはこんな感じで、
-----------------------------------------------
エラー:識別子'int32_t'が再宣言されています。
最初の宣言:'long'
現在の宣言:'int'

types.h 行73 typedef int int32_t;
-----------------------------------------------
エラー:識別子'u_int32_t'が再宣言されています。
最初の宣言:'unsigned long'
現在の宣言:'unsigned int'

types.h 行74 typedef unsigned int u_int32_t;
-----------------------------------------------
エラー:名前のオーバーロードが不当です。

time.h 行22 using std::clock_t;
-----------------------------------------------
エラー:マクロ'CHAR_BIT'が多重定義されています。

limits.h行 45 #define CHAR_BIT 8
-----------------------------------------------
最初の二つは、
{Compiler}MacOS Support/Universal/Interfaces/CIncludes/CGBase.h

{OS X Volume}usr/include/ppc/types.h
がぶつかっているようです。
991985:04/03/23 14:05 ID:hXPY2qrZ
とりあえず、インクルートシステムパスは以下の通りです。
-----------------------------------------------
{Compiler}MacOS Support/PowerPlant
{Compiler}MacOS Support
{Compiler}MSL
{OS X Volume}usr/include
-----------------------------------------------
開発環境はCW8です。
992名称未設定:04/03/23 14:53 ID:qgLU3io5
う…、CW知らん
よーわからんけど、CFMってとこは問題ないの?OSXだけで良いんだろうからMach-Oは?
993名称未設定:04/03/23 15:39 ID:U5BV4NAH
http://developer.apple.com/ja/qa/qa2001/qa1123.html
ためしにこのサンプルコードの#include 行を全部削除してみたら?
ここらへんのよく使われるヘッダファイルはPowerPlantが勝手にincludeしてるから、コードで明示的に
includeする必要は無いってことでしょ
994985:04/03/23 15:46 ID:hXPY2qrZ
Mach-Oもダメでした。
でも、試しにProjectBuilderでCarbonアプリの
プロジェクトを作って、そこに放り込んだら
ビルドできました。

う〜ん、ProjectBuilderへの移行はちょっと
難しいなぁ。
CWではsysctl()を呼べないのかなぁ...

>>992
レス、ありがとうございます。
もう少し調べてみることにします。
995985:04/03/23 15:56 ID:hXPY2qrZ
>>993
とりあえず、全部削除すると未定義だって
怒られました。
PowerPlantのヘッダに置き換えれば良いって
事ですか?
996名称未設定:04/03/23 17:25 ID:U5BV4NAH
>>995
それで、未定義なシンボルはどれかエラーメッセージを見て判断して、
そのシンボルが入っている.hをインクルードしてやればいいかと
どの.hに入っているかは、適当に検索でもかけて調べる、と

0から始めて積み上げていけば、二重定義になることはないはずですよね?
997名称未設定:04/03/23 17:40 ID:DZMZFgWF
このサンプルコードってProjectBuilder用じゃないの?
二重定義ではねられるんならプリコンパイルドヘッダを空にしたらどうだ?

CWでMach-O使ったことないからわからんけど、それなりに手直しは
必要かも。
998985:04/03/23 18:44 ID:hXPY2qrZ
>>996
とりあえず、↓この定義を外せば
#include <sys/sysctl.h>
二重定義のエラーはなくなりますが、
未定義エラーで怒られます。
って言うか、二重定義であって
二重インクルードではないので、
その方法では無理があると思います。

>>997
そうですね。ProjectBuilder用だと思います。
プリコンパイルドヘッダを空にするって
どうすれば良いんですか?
999名称未設定:04/03/23 18:50 ID:DZMZFgWF
>>998
プロジェクトの設定でC/C++ Languageを選ぶとPrefix Fileを指定する
テキストフィールドがあるので、それを空欄にする。
1000名称未設定:04/03/23 18:53 ID:U6w662KX
つづく
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。