2014年8月11日月曜日

codesign を version 1 から version 2 にコマンドで更新する方法

2014年8月4日、アップルから突然メールがきた。codesignの仕様がMac OS 10.9.5以降はversion 2のものでないと認証されなくなり、これまでの codesign version 1の製品では、アプリケーション起動時に「認証していないアプリ」として警告がでるようなる。

codesign version 2にするには、Mac OS 10.9 以降の xcode で build しなおせば,自動的に version 1から version 2 に切り替わる。

しかし、古いアプリケーション(たとえばPPCにも対応しているアプリ)などは Mac OS X 10.7 の xcode 3でないと build できない。Mac OS 10.9 の環境ではbuild できないのだ。

MacApp Store を経由しないで直接配布している Developer ID アプリの場合は、 Mac OS X 10.7 の xcode 3 で build した アプリケーション(たとえば foo.app )を以下のように  Mac OS X 10.9 上のコンソールからコマンドで version 2に変更できる。


$ codesign --verbose --force --sign "Developer ID Application: your company" --deep foo.app 

終了したら、以下のコマンドで version 2 になっているかどうか、確認できる。

$ codesign -dv foo.app
[......]
Sealed Resources version=2 rules=xx files=xx
[......]

また以下のコマンドで GateKeeper が受け付けてくれるかどうか、チェックできる。

$ spctl -a -t exec -vv foo.app
foo.app: accepted
source=Developer ID

では、MacApp Store で配布する製品の場合は、どうしたらいいのだろか。MacApp Store で配布する製品でも、いろいろな理由で Mac OS X 10.9 の xcode で build できない場合がある。

うーむ。やっぱりその場合は、で Mac OS X 10.9 の xcode で buildできるようにソースコードを修正するしかないのか?







2012年7月13日金曜日

AppleScript や Automator の CodeSign

Mac OS X 10.8 (Mountain Lion)からは、Appleから認証されたDeveloper IDのCode Sign のないアプリケーションをダウンロードするとデフォルトの状態では起動できない。

通常、Developer IDのCode Signは、Xcode のbuild 時に付加される。


ところで、AppleScript のアプリケーションや Automatorのワークフローも Developer IDのCode Sign がついていないと同じように起動できない。
ところが、これらのアプリケーションの作成には Xcode は使わない。AppleScript のアプリケーションは AppleScript Editor で、Automatorのワークフローは Automator.app で作成する。

では、どうやってAppleScript や Automator に CodeSigin を付加するのか。以下のようにすると Xcodeを使わず codesign コマンドを使って直接アプリケーションに CodeSign を付加することができる。

AppleScript アプリケーション

1) CodeSignのためには、アプリケーションパッケージ内の info.plist のなかに Bundle Identifier が定義されていなければならない。AppleScriptアプリケーションには一般にBundle Identifierが定義されていないので、以下のようなBundle Identifierを追加する。

           <key>CFBundleIdentifier</key>
            <string>jp.co.yourCompany.applescript.foo</string>

Bundle Identifierの追加はテキストエディタとかplistエディタを使う。なお、Mountain LionのAppleScriptエディタには新たにBundle Identifierの編集機能が追加されているので、この機能を使っても行える。

2) アプリケーションパッケージ内のmain.scpt を chmod コマンドで書き込み禁止にする。

$ chmod a-w foo.app/Contents/Resources/Scripts/main.scpt

3 ) codesign コマンドで CodeSign を書き込む。

$ codesign --sign 'Developer ID Application: YourCompany.' 
-i jp.co.yourCompany.applescript.foo -f foo.app 

4 )うまく CodeSign が付加されたかどうかは以下のコマンドで確認できる。

$ codesign --display -vvv foo.app

Automator ワークフロー

1) Bundle Identifier の修正。Automator のワークフローのパッケージ内の info.plist には、すでに Bundle Identifier が備わっているので、それを希望の文字列、たとえば
jp.co.yourCompany.automator.foo
に書き換える。

2) codesign コマンドで CodeSign を書き込む。

$ codesign --sign 'Developer ID Application: YourCompany.' 
-i jp.co.yourCompany. automator.foo -f foo.app 

3)うまく CodeSign が付加されたかどうかは以下のコマンドで確認できる。

$ codesign --display -vvv foo.app


Xcode 3.2.6 と Gate Keeper

Mac OS X 10.8 (Mountain Lion)では、ダウンロードされた不正なアプリからシステムを防御するため Gate Keeper という機能が新設された。デフォルトのシステム設定では、Appleから認証されたCode Sign (Mac Developer ID)が付加されていないアプリをダウンロードし起動しようとすると、以下のようアラートが出て起動することができない。


というわけで、Mac OS X 10.8 からはデベロッパーは自分の製品を「Mac Developer ID」で Code Sign しないといけなくなった。


まず、Mac Developer ID をAppleから発行してもらう。Mac Developer ID をどうやって発行してもらうかは、この投稿の本題ではない。Mac Developer IDをまだもっていないひとは以下のページを参照して取得してください。
Developer Certificate Utility - Mac Developer Program - Support - Apple Developer

無事、Mac Developer ID が取得できたら Xcodeで目的の製品をbuildするときに、buildオプション CodeSign にMac Developer ID :Application を指定しbuildすればよい(詳しくは以下を参照)。
Tools Workflow Guide for Mac: Distributing Outside the Mac App Store

以上でめでたく Mac Developer ID でCode Sign された製品ができる(はずな)わけである。(だったら、なんでわざわざこんな投稿をする必要があるのか。)


それがどっこい、そうではないのだ。


Mac Developer ID で Code Sign をするときは、
Xcode 4.3 でないといけないのだ!!

Xcode 4.2 とか Xcode 3.2. でbuild してしまうと、付加される Code Sign の内容が異なり、Mac OS X 10.5あるいは Mac OS 10.6 で動作させたときMac Developer ID がシステムに正しく認識されないという問題が生じる。
Mac Developer ID が認識されなくとも、もともと、Mac OS X 10.5/10.6 では Gate Keeper が動作していないので問題ないではないか思うかもしれないが、そうではない。

たとえば KeyChain に登録されているベーシック認証のページを開こうとすると、初めて開くときだけ 開くかどうか許可ダイアログで聞いてくるが、2回目以降は許可ダイアログなしに直接開くことができる。


Xcode3.2.6やXcode4.2 で Developer ID のCodeSign でbuild したアプリでは、システムに正しく認証されていないので、ベーシック認証のページを開こうとすると、毎回、許可ダイアログが表示されてしまうのだ。このようなアプリのもとでは KeyChain が正しく動作しないのだ。


では、実際に Xcode4.3でbuildされた場合と、Xcode3.2でbuildされたときで、Mac Developer ID のCode Signのどこが違うのか、ターミナルから コマンド「codesign -d -r-」で直接みてみよう。


Xcode3.2.6 でビルドされた foo.app では
$ codesign -d -r- foo.app 
Executable= foo.app/Contents/MacOS/foo
library => identifier "com.apple.Cocoa" and anchor apple or identifier "com.apple.Carbon"  <--  略 --> and anchor apple or identifier "com.apple.Foundation" and anchor apple
# designated => identifier "jp.co.artman21.foo" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = F8FSQZCDV7


緑の字の部分[ designated record ]は、ルート証明書「anchor apple generic」と中間証明書「certificate 1[field.1.2.840.113635.100.6.2.6] 」そして自分のDeveloper IDの証明書「certificate leaf[field.1.2.840.113635.100.6.1.13]が存在しなければならず、Developer IDのの値はF8FSQZCDV7 であると指定している。
ところが、なんと中間証明書 certificate1[field.1.2.840.113635.100.6.2.6]は、Mac OS 10.5/10.6 ではシステムに実装されていないだ。これが foo.app がシステムに正しく認証されない原因だ。

一方、Xcode 4.3 でビルドされた bar.app では

$ codesign -d -r- bar.app  
Executable= foo.app/Contents/MacOS/bar
library => identifier "com.apple.Cocoa" and anchor apple or identifier "com.apple.Carbon"  <--  略 --> and anchor apple or identifier "com.apple.Foundation" and anchor apple
designated => anchor apple generic and identifier "jp.co.artman21.bar" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = F8FSQZCDV7)

緑の字の部分[ designated record ] の内容が Xcode3.2.6 の場合とちがって、中間証明書が「(certificate leaf[field.1.2.840.113635.100.6.1.9] または certificate 1[field.1.2.840.113635.100.6.2.6] 」のどちらかとなっている。中間証明書 のどちらかが存在すればエラーにならない。すなわち、bar.app はMac OS 10.5/10.6 でもシステムに正しく認証される。

でも、Xcode 4.3 に移行できない
ときはどうすればいいのだ 

新製品はともかく、昔からある製品は、過去のしがらみがあって、Mac OS X 10.4 もサポートしなければいけなかったり、ppc もサポートしななればいけなかったりで、Xcode 4.3 に移行できない場合も多い。

そんなときは、とりあえず Xcode 3.2.6 でbuild して、CodeSign の[ designated record ]の部分だけ、以下のように Xcode4.3 の[ designated record ]に入れ替えるとうまくいく。

まず、Xcode4.3 でbuild した bar.app[ designated record ]をもとに foo.app の[ designated record ]を以下のように作成しファイル「fooDR.txt」として保存する。

designated => anchor apple generic and identifier "jp.co.artman21.foo" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = F8FSQZCDV7)

そして、ターミナルから以下のコマンドで

$ codesign -r fooDR.txt -s "Developer ID Application: Artman21 Inc." -f foo.app
foo.app: replacing existing signature

うまくかきかわったかどうかは、

$ codesign -d -r- foo.app 

で調べられる。
ー 以上 ー

<謝辞> 今回の投稿の作成にあたっては、BRadikoの作者 bui さんからいろいろ貴重な示唆をいただきました。また、Daniel Jalkut さんの Red Seater Blog の投稿 Developer ID Gotcha も非常に参考になりました。


2012年3月5日月曜日

Tweet 読み上げスクリプト つぶやき Kyoko


Twitterタイムラインに届いた新着ツイートをリアルタイムにKyokoの声でつぶやきます。

以下からダウンロードできます。


<<動作環境>>
Mac OS X 10.7 以上、Twitter.app が必要です。
システム環境設定「スピーチ>テキスト読み上げ」で日本語音声読み上げの"Kyoko"、英語は"Alex"をあらかじめオンにしてください。

<<特徴>>
日本語のtweetは"Kyoko"で、英語は"Alex"で読み上げます。
tweet中のURLやハッシュタグは除外して読み上げます。
AppleScripエディタで「つぶやき Kyoko」のソースリストを参照できます。

<<修正履歴>>
12.03.05 いくつかのバグを修正し、アプリケーション名を「つぶやき Kyoko」に変更。
12.02.11 ツイート末のにあるハッシュタグやアドレスの最後の1文字を発音してしまうバグを修正。
12.02.10 Twiittererを公開

<<制作/著作>>
松本慧 satoshi@mac.com  Twitter:@cometheart http://cometheart.blogspot.com/

ソースリスト

property enableF : true
property intervalSec : 1
property lastUpdate : 0

on run
set intervalSec to 1
tell application "Twitter" to activate
delay 3
set enableF to true
end run

on idle
if enableF = true then
set enableF to false
idleMain() of me
set enableF to true
end if
return intervalSec
end idle

on idleMain()
tell application "Twitter"
set ca to count of every account
if (ca is greater than 0) then
tell account 1
repeat
set ht to a reference to home timeline
--set mt to a reference to mentions timeline
set now to last update of ht
if now is not lastUpdate then
set lastUpdate to now
set n to name of ht
set ss to a reference to (every status of home timeline)
set s to a reference to item 1 of ss
set t to full name of author of s
smartSay(t) of me
set t to text of s
set t to filter(t) of me
smartSay(t) of me
else
exit repeat
end if
end repeat
end tell
end if
end tell
end idleMain

on smartSay(s)
set len to length of s
set i to 1
repeat while (ilen)
if character i of s > "z" then
say s using "Kyoko"
return
end if
set i to i + 1
end repeat
say s using "Alex"
return
end smartSay

on filter(s)
set len to length of s
set t to ""
set i to 1
repeat while (ilen)
if i < len - 6 then
set substring to (characters i thru (i + 6) of s) as string
else
set substring to ""
end if
--display dialog text of substring
if substring is "http://" then
set i to i + 6
repeat while (ilen)
if character i of s > "z" then exit repeat
set i to i + 1
end repeat
else if character i of s is "#" or character i of s is "@" then
set i to i + 1
repeat while (ilen)
if character i of s > "z" then exit repeat
set i to i + 1
end repeat
else if character i of s is "…" then
set i to i + 1
else
set t to t & character i of s
set i to i + 1
end if
end repeat
return t
end filter



2011年12月12日月曜日

突然 Lionの起動が不安定になった...

半月くらいまえにLionをクリーンインストールして、徐々にいろいろなソフトをインストールしながら使っていた。

ところが、今朝そのLionの起動が、突如不安的に。。。

1)オートログインすると、Finderが「予期せぬ原因で終了」していまう。もう一度トライすると起動できるときもある。
2)オートログインをオフにしてログインウインドウを表示するようにして起動したら、ログインウインドウまではたどりつくが、パスワードを入力しようとすると、最初の一文字目で落ちてしまったり、入力できても、真っ白なスクリーンが現れてから、再度丸いプログレスインディケータのスクリーンに切り替わって、ログインウインドウがまた現れたりする。
3)2回目のログインウインドウが表示されてから、再度パスワードを入力すると、なぜか、だいたい起動できる。
4)クラッシュログのライブラリを覗いたら、何度もトライしたので以下のようなクラッシュレポートがいっぱいたまっていた。

SystemUIServer_2011-12-12-110203_matsumoto-satoshi-no-Mac-Pro.crash
TISwitcher_2011-12-12-110203_matsumoto-satoshi-no-Mac-Pro.crash
fontworker_2011-12-12-110202_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-110153_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110142_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110131_matsumoto-satoshi-no-Mac-Pro.crash
fontworker_2011-12-12-110121_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110121_matsumoto-satoshi-no-Mac-Pro.crash
UserNotificationCenter_2011-12-12-110121_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110111_matsumoto-satoshi-no-Mac-Pro.crash
Dock_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
mdworker_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
SystemUIServer_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
fontworker_2011-12-12-102335_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-102325_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-102315_matsumoto-satoshi-no-Mac-Pro.crash
Dock_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
SystemUIServer_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-101723_matsumoto-satoshi-no-Mac-Pro.crash
Dock_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
SystemUIServer_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-101713-1_matsumoto-satoshi-no-Mac-Pro.crash
LCCDaemon_2011-12-12-100125_matsumoto-satoshi-no-Mac-Pro.crash

talagentというのがあるが、再起動で前回動作していたアプリを自動立ち上げる resume 機能と関係しているらしい。Lion: What is Talagent? - MacRumors Forums

5)別volumeのSnow Leopardからは全く問題なく立ち上がるので、ハードウェアの原因ではないようだ。また、Lionのドライブを検証してみても異常は見つからなかった。

6)ドライバ関係に問題あるかもしれないとおもい、先日インストールした Logicoolのコントロールセンター lcc351j をアンインストール。これがいちばん臭い。最初に落ちているのがこの LCCDaemon だ。しかし、現象は改善しない。アンインストーラーに問題があってアンインストールできていない可能性もあるか。

7)結局 Lionを再インストールすることに。オプションキーを押しながらMacの電源を入れて、起動ディスクの選択スクリーンから、"Recovery HD"を選択。Lionの再インストールを選択。「インターネットにつながっていないと」とおこられる。メニューバー右のWi-Fiアイコンを選択し、Wi-Fiのパスワードを入力し、無事、約1時間かかって Lionのインストールが完了。

8)Lionの再インストールで問題は解決したようだ。 Lionの"Recovery HD"を初めて体験した。とりあえず、めでたし。めでたし。かな。


2011年11月25日金曜日

Airtel SIM カードで「インド、どこでも iPhone4S」

せっかく Sim Free の iPhone4S をもっているので、インドで SIM カードを購入し、インターネット共有を ON にして、インドのどこからでも Mac からインターネットにアクセスできるようしよう。 インドの田舎でも使えるように、キャリアは携帯電話利用者数は国内1位の Airtel を選択。

(注意)Softbank の iPhone4S は SIM ロックがかかっているので Softbank 以外の SIM は使えません。超高い定額海外ローミングで我慢するか、脱獄して SIM ロックを解除する必要があります。

1)日本での準備:あらかじめ出発前に SIM カードを購入するときに必要な以下の書類を揃える。
   パスポートの写真のページのコピー
   パスポートのインドのビザのページのコピー
   パスポートサイズの写真1枚

2)インドに到着したら以下の情報も購入に必要になる。
滞在先のホテルの住所、電話番号、部屋番号

3)携帯ショップへ行き上記の書類を提出し SIM カードを購入する
今回は チェンナイの Spencer Plaza というショッピングセンター3F にある携帯 Shop で購入。店の対応も基本的に親切だった。最初 こちらの働いている会社の証明書が必要などと言われたが、上記の1)2)の書類で購入できることが店のひとにも解って購入できた。でも、それがわかるまでいろいろ問い合わせしていたので、30分くらいかかった。

4)Airtel の SIM を20ドルをだして購入した。以下がそのときのレシート。金額はルピーで表示されている。今回はリチャージ分の250ルピーが追加されている。追加しなければ15ドルくらいか。SIM カードのカット代185ルピー(350円くらい)がちょっと高いかも。





5) 店のひとにセットするしてもらうまえに、iPhone の言語環境を 設定>一般>言語環境で「英語」にしておく。

6) 店のひとに日本で使っていた日本通信の SIM から Airtel の SIM に入れ替えてもらう。(帰ったときに、成田で日本通信の SIM に戻すために、SIM を取り出すためのピンを持参することをおすすめする)

7) 以上でとりあえず音声通話は可能になる。電話番号「*123#」にかけると以下のように現在のチャージ残量を参照できる。なおアカウント情報は「*121#」で確認できる。




2012年1月6日まで99ルピー、2014年8月18日まで181.24ルピーとある。250ルピー追加したはずなのに、181.24ルピーしか表示されなかったので店の人に文句を言ったら、そうゆうものらしい(納得は行かなかったが)。また、リチャージの追加分が表示されるのには 開通してから30分くらいかかった。

8)データ通信のためにまず、Phone の 「設定>一般>リセット>ネットワーク設定をリセット」でネットワーク設定をリセット。

9) APNナンバーをセットしようとして「設定>一般>ネットワーク>モバイル通信ネットワーク」をひらこうとしたが「モバイル通信ネットワーク」の項目がない!! うーむ。店の人に聞いてみても iPhone4S ははじめてなのでよくわからないという。これでは肝心のデータ通信ができないではないか!!

10) 店のひとが Airtel のサポートに問い合わせたが解決せず。あとで、サポートから返事が iPhone に SNS で送られてくるということで、とりあえずそれを待つことに。


11) とりあえず店からでて、いろいろ試しているうちに、突然データ通信ができるようになった。とうやら、iPhone4S の Airtel の場合は APN 番号は自動的にセットされてユーザーが入力する必要がないようだ。
データ通信でできるようになるまで2時間くらい待つことが必要らしい。

12)以上で、インドで iPhone4S で Airtel の SIM を使ってデータ通信が無事できようになった。めでたし、めでたし。

<<注意>> 店のひとによると、AirtelのプリペイドSIMは、今回2014年8月16日までの期限があるものの、6ヶ月に1回はアクセスしないと契約がクリアされて使えなくなってしまうらしい。アクセスは日本からでもいいので、最低半年に1回はこのSIMを使ってどこかにアクセスする必要がある。「*123#」とか「*121#」へ電話をかけるといいかも。


2011年11月1日火曜日

Xcode 3.2.6 インストール 顛末記

Snow Leopard, Xcode 3.2.5 で正規表現のライブラリ OgreKit を更新しようと思って、OgreKit最新版をダウンロード。

 OgreKit:http://web.me.com/oasis/ogrekit/About.html 

トラブル1: buildエラー 

buildしようとしたら以下のエラーを先頭に500以上ものエラーメッセージの嵐にみまわれた。

 error: can't exec '/usr/bin/make' (No such file or directory) 

たしかにそのpathにはmakeは存在しない。
どうも以前XcodeをインストールしたときにUnix Toolをインストールしなかったのが原因らしい。

トラブル2:iTunesが原因でインストールが完了できない 

そこで、 Xcode 3.2.5を再インストールしようと思ったが、Xcode3.2.6もでているので、Xcode3.2.6をインストールすることにした。

インストーラがもうすぐ終了というところで、以下のメッセージがでた。

quit iTunes 

しかしiTunesを止めても上記のメッセージはでたままで先にすすまない。
しかたなく、cmd+option+ESCでインストーラを強制終了。

システムを再起動し、こんどは iTunesが動いていないのを確認してインストーラを起動。ところが、iTunesが動いていないのに、またおなじ

quit iTunes 

のアラート。うーむ。Googleで調べたら iTunes Helperというプログラムがバックグランドで動作していることが原因らしいことがわかり、

ユーティリティ>アクティビティモニタ

で、 iTunes Helperを強制終了したらインストールが完了した。

トラブル3:Xcodeが起動しない。 

さて、Xcodeを起動すると、こんどは以下のエラーでXcodeが強制終了してしまう。

Exception caught: Couldn't load plug-in 'com.apple.Xcode.iPhoneSupport' 

うーむ。

googleで同じようなトラブルを探すと iTunes を再インストールすると直るらしい。 そこで、Apple のページから iTunes 10.5をダウンロードして iTunes を再インストール。

 http://www.apple.com/jp/itunes/download/

 iTunes をインストール後、マシンを再起動し、おそるおそる Xcodeを起動。
今度は Xcode が無事起動し、目的のOgreKitも正常にbuildできた。 

めでたし、めでたし。