ラベル NerdTool の投稿を表示しています。 すべての投稿を表示
ラベル NerdTool の投稿を表示しています。 すべての投稿を表示

2013年6月8日土曜日

icalBuddyをバージョンアップ [追記: 6/8 18:00]

icalBuddyというコマンドラインプログラムを使って、GeekTool, NerdToolで予定やTo Doを表示しています。
でも、Mountain Lionにしてから予定(カレンダーのデータ)が表示されなくなっていました。やっと重い腰を上げて解決することにしました。といっても結局バージョンアップしただけですが。
icalBuddyは、http://hasseg.org/icalBuddy/ で、Ali Rantakariさんが公開されています。
まず、動作しない原因ですが、icalBuddyがAddress book (連絡先)のデータにアクセスするときに拒否されてクラッシュしているためのようです。

2013-06-08 06:01:53.330 icalBuddy[99070:2623] Address book access is denied for executable at path: /usr/local/bin/icalBuddy
2013-06-08 06:01:53.331 icalBuddy[99070:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSConcreteMutableAttributedString initWithString:: nil value'

上記のエラーメッセージと共にスタックダンプも表示されます。想像ですが、アドレスブックにアクセスしようとして拒否され、そのデータが取れずにnilになってicalBuddyが終了というかクラッシュしたように見えます。
icalBuddyのウェブを見るとFAQにエラーメッセージを表示させないための解決方法が載っていました。
  1. icalBuddyにAddress bookのアクセス権を与える
  2. エラーメッセージを/dev/nullに送る
のどちらかを実行すればいいと書いてありますが、2番目はクラッシュを回避できないように思います。
気になったのは、カレンダーのデータを表示するのになぜAddress bookにアクセスする必要があるのかですが、特に記述はありませんでした。誕生日データを参照しようとしているのでしょうか。

1番目の解決策を試す前に、現在使っているバージョンが1.7.19と古いので最新版(1.8.8)にアップデートすることにしました。
今まではコンパイル済みのバイナリをインストールしていたのですが、ソースコードも欲しいと思い上記サイトのgitのアドレスから入手、コンパイルすることにしました。

念のためですが、以下の手順は普通にicalBuddyのサイトからコンパイル済みのバイナリ入りZIPファイルをダウンロードすることで全然かまわないです。

あらかじめ、Xcodeとcommand line toolをインストールしておく必要があります。
ビルド、インストールは以下のようにしました。

$ git clone http://hasseg.org/git-public/icalBuddy.git/
$ make 64BIT=1

単純なmakeだと32bit バイナリが生成されたので、気分的に64bitを指定してみました。
すると、今度はuniversal binaryになったので、上記makeのコマンドをコピペして、-arch i386を削って直接実行しました。複数行になっていますが、一行です。

$ clang  -O3 -Wall -std=c99 -force_cpusubtype_ALL -mmacosx-version-min=10.5 -arch x86_64 -framework Cocoa -framework CalendarStore -framework AppKit -framework AddressBook -o icalBuddy icalBuddy.m icalBuddy[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*.m ANSIEscapeHelper.m HG*.m IcalBuddy*.m *+HGAdditions.m

元のi386のままでも構わないのですが気分の問題でこうしてみました。
[* 次の文は、修正しました。クラッシュはなくなったのですが、system.logにaccecc deniedというメッセージは出ていました。6/18 18:0]
icalBuddyを実行してみるとエラーが出なくなっています。FAQの1番目のアクセス権を与えることも必要なさそうです。
その後インストールしようと思ったらMakefileの中にinstallターゲットがありません。
packageターゲットでZIPファイルを作り、そこから展開してインストールすることにしました。

$ mkdir deployment   # あらかじめ作っておく必要があるみたい
$ make package # 最後にエラーが出ますが関係なさそうなので気にしないことにします
$ cd deployment/1.8.8/
$ unzip icalBuddy-v1.8.8.zip
$ ./install.command    # /usr/local以外の場合はこのコマンドを修正する必要があります
=================================

This script will install icalBuddy and related files:

(icalBuddy installation found in:
 /usr/local
 -- using same path for updating:)

/usr/local/share/man/man1/icalBuddy.1
/usr/local/share/man/man1/icalBuddyLocalization.1
/usr/local/share/man/man1/icalBuddyConfig.1
/usr/local/bin/icalBuddy

We might need administrator privileges to install to
this location so please enter your password if prompted.

Input y to continue installing, c
to change the installation path or q to quit.
[y/c/q]: y
- Copying icalBuddy.1 to /usr/local/share/man/man1
Password:
  copied.
- Copying icalBuddyLocalization.1 to /usr/local/share/man/man1
  copied.
- Copying icalBuddyConfig.1 to /usr/local/share/man/man1
  copied.
- Copying icalBuddy to /usr/local/bin
  copied.

icalBuddy has successfully been installed.

以上で、icalBuddyがクラッシュしないようになりました。
ソースコード(何故連絡先にアクセスする必要があるのか)は、Cocoa, Objective-Cをよく知らないので見ていません。

2013年2月24日日曜日

花粉シーズンになったのでデスクトップに花粉情報予測マップを表示しました[修正:2013/2/27]

花粉症の人も多いと思いますが、本格的にスギ花粉のシーズンになりましたね。
わたしも花粉症のひとりです。長い時は5月連休明けくらいまで症状が出ます。スギ以外にヒノキも持っているようです。

わたしはプロフィールに書いていますが、散歩が好きで昼休みに散歩したりすることも多いのですが、この季節は花粉が心配です。そのため、会社のMacのデスクトップに花粉予報のマップを表示するようにしました。出かける前後に目薬や点鼻薬、マスクに気をつけるようにしています。

表示に使ったツールは、定番のGeekToolです。画像は、日本気象協会( tenki.jp )のサイトの花粉飛散メッシュ画像(花粉情報予測マップ/地図)から自分の住んでいる地域のものを表示しています。他にもいいサイトがあるかもしれませんね。

上が大きいサイズのマップで、下が小さいサイズのマップです。2種類で試していますが、今のところ小さいサイズに落ち着きそうです。 

tenki.jpのサイトでは、1日1回、朝6時にマップがアップデートされているようです。設定は以下のようにしています。

[修正/追記:
アップデートは朝6時と夕方6時の2回のようです。
また、URLの最後は、?20130227060000のようなクエスチョンマーク以降は削除して指定してください。
]

リフレッシュ間隔は、昼休み前までに花粉状況がわかればいいので、今は1時間弱ですがもう少し長く、2時間弱ぐらいにしようかと思います。


そういえば、一時期、GeekToolからNerdToolに乗り換えていたのですが、会社のMacはGeekToolに戻しました。
外付けディスプレイを使っていて、Macを会議などで取り外し(ノートなので)、会議終了後に再接続するというような使い方をしています。NerdToolの場合、再接続した後外付けディスプレイに、NerdToolの表示内容が重なって出力されるという症状が出たためです。
自宅の方は、ディスプレイは1枚なのでNerdToolを引き続き使っています。NerdToolの方が少しだけ軽いようです。

2013年1月13日日曜日

.MaxOSX/environment.plistからPATH変数が読まれないことへの対処 [一部修正]

去年(2012年)の前半頃(まだ、Snow Leopardを使っていた頃)のことですが、NerdToolやcrontabから起動しているスクリプトの一部が動かなくなっていることに気づきました。


暫定的な対応


動いているスクリプトと動かないスクリプトを見比べると、スクリプトをフルパスで起動したり、PATH環境変数を再設定しているものは動いていました。PATH変数が何らかの原因で設定されていないようです。とりあえずスクリプト内の動かなかったコマンドが起動できるようにPATH変数を修正して動くようにしていました。
例えばこんな感じです。

修正前
#!/bin/sh
site_check.sh

~/bin ディレクトリにsite_check.shスクリプトを置いていますので、HOME変数を追加します。HOME変数は設定されていました。また、このスクリプト内から/opt/local/binあるコマンドを起動できるようPATHに追加します。

修正後
#!/bin/sh
PATH=/opt/local/bin:$PATH
$HOME/bin/site_check.sh

原因と対応

PATH環境変数が設定されなくなった原因は、Mac OS Xのセキュリティアップデートでの仕様変更のように思われる(どこかで読んだ記憶がある)のですが、ソースを見つけられませんでした。Security Update 2012-002による変更で、ログインした際に、~/.MacOSX/environment.plist内のDYLD_*変数を読み込まないようにしたという記述はあるのですが、PATH変数については記載されていませんでした。[Appleのリンク]

対処については、

  1. アプリケーション内でのInfo.plistでのLSEnvironmentキーを設定する方法
  2. /etc/launchd.confを作成する方法
  3. 個別のアプリケーション毎にlaunchd.plist (ファイル名は別にするようです)を記述する方法

などがあるようです。

1)は、最も安全だそうですですが、アプリケーションのバージョンアップ等で変更を忘れてしまいそうです。また、アプリケーションによっては使えません。2)は、今までログイン時(個別ユーザ用)に設定していたものを、他ユーザにも影響がでるような形で設定するのは、若干抵抗があります。設定自体は、シェルスクリプトの記法に近く楽そうでよいのですね。
3)は、設定がアプリケーション単位で個別にできるのがよい点です。記述は若干面倒そうです。(使い方はLaunchDaemons (launchctl, launchd.plist) の使い方にわかりやすくとめられていました)

いろいろ考えた末、以下の方針にしました。方針というほど大げさなものでもないのですが。
  1. /etc/launchd.confを使用するが、設定は最小限にする。特に、セキュリティのため、自分のIDの書き込み権がある場所は指定しない。
  2. 個別のアプリケーション内の環境設定等で対応できるものは、そこで対応する。NerdToolのシェルスクリプト等、手間がかからないものも各スクリプトで設定する。
  3. 1.〜2.で対応できない場合、そのアプリケーション用のlaunchd.plistを作成し、ユーザ領域の~/Library/LaunchAgents で管理する
  4. アプリケーション内のInfo.plistを修正は、バージョンアップ時に修正を忘れたり管理が大変なため行わない。

/etc/launchd.confを設定する前に、現在のlaunchdのPATH設定を調べたところ、以下のようになっていました。
$ sudo launchctl getenv PATH
/usr/bin:/bin:/usr/sbin:/sbin

/etc/launchd.confは存在していないのでこれらは、デフォルトで設定されているのでしょう。また、/etc/pathsは以下のようになっています。

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

自分のPATH設定に入っている$HOME/bin, /opt/local/bin, /opt/X11/bin, /usr/local/clamXav/binが含まれていませんが、これらはログイン後シェルで使うものが多いので/usr/local/binだけを設定することにしました。それ以外は、.bash_profile等で変更します。

/etc/launchd.confには、

setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

と設定しました。また、/etc/pathsもそれに合わせて/usr/local/binを先頭に持ってきました。

また、crontabやNerdToolなどのシェルは、必要に応じてPATHを追加する方針ですが、現状既にそのように修正しているので基本的にはそのままです。PATHの追加が必要になるのは、ほとんどの場合、$HOME/bin か /opt/local/bin (MacPorts用のパス) です。

感想

environment.plistがサポートされなくなった背景には、Flashbackマルウェアの発生などMac OS Xでもセキュリティを厳しくする必要があるということが挙げられます。Mountain Lionでのsandbox化や承認されたアプリケーションしか基本的にはインストール・起動できないというのもその流れですね。もっと自由にしたいとか、いろいろ意見もあるようですが、今後ますますユーザレベルでも気を付けなければならないのではと思います。

[追記 2013/1/16 ] http://jvn.jp/cert/JVNTA13-010A/ によると、JAVAにまたセキュリティホールが見つかっていますね。注意したいものです。

2012年9月18日火曜日

Spirited Awayで集中。便利です。

Spirited Awayというアプリケーションを使っていますが意外と便利です。だいぶ前の、2chのおすすめアプリ紹介で知りました。Spirited Awayとは神隠しという意味らしいです。

機能ですが、起動しているアプリケーションが設定している時間操作されないと自動的にそれを隠してくれる(command + Hと同じ)というものです。
何がいいかというと、

  • 今やっている作業(Wordやエディタでのドキュメント作成でも、ウェブ検索でも)に集中できる点
  • 意図的に他のアプリケーションを隠す操作をしなくても自然に使える点
  • しばらく席を外したりしていると、デスクトップピクチャやNerdToolで設定した内容が見えるようになる点

などです。以前は、すぐにブラウザに目が行って必要もないのにニュースを見たりすることがありました。また、デスクトップピクチャもお気に入りのものがランダムに変わるようにしたりしていますが、以前はいろいろなアプリケーションでデスクトップは大体隠されていて、あまり見えなかったのですがよく見えるようになりました。
デスクトップが見えるようになると、逆にデスクトップにアイコンを置きたくなくなりました。スクリーンショットも生成場所を変更し、ディスクボリュームも表示しないようにしています。Finderで不可視ファイルを表示するようにしていますが、Desktopフォルダに何も作られないので .DS_Store ファイルもできなくなりました。

良くない点としては、隠れていたアプリケーションを表示した時に、すぐにまた隠れてしまい、もう一度表示しないといけない場合があります。

どちらでもない点としては、隠れているアプリケーションを呼び出すために、Quicksilverやcommand + tabキーの出番が増えたことが挙げられます。私にとっては、キーボード操作の方が好きなので良い点かもしれません。

現在は、隠す時間を10分にしています。あまり間隔が短いとそれも気になりますので。

2012年7月22日日曜日

Nerdtool/GeekToolでYahooのお天気アイコンを表示

Macの手書き説明書さんなどを参考に、NerdToolでYahooのお天気アイコンをデスクトップに表示させていたのですが、いつの間にか表示されなくなっていました。

weather.yahoo.comのHTMLコードが修正されているようです。
以下のように修正したらまた表示されるようになりました。


今日はくもりです。

GeekToolを使っている人も同じような修正で、アイコンが表示されるようになると思います。
NerdToolの方がほんのちょっとCPU負荷が低かったのでGeekToolから乗り換えました。と言っても、2%ぐらいですが。
私のMacは、Mac Mini Core 2 Duo 1.83GHzの非力マシンなので。。