Showing posts with label Programming. Show all posts
Showing posts with label Programming. Show all posts

2014-03-08

Excel の worksheet を逆順に並び換える AppleScript

毎月一枚ずつワークシートが増えていく Excel のブックを使っている。毎月毎月シートを最後尾に追加していったのだけど、実際に作業するのはほぼ最新のシートだけなのにそれが最後にあると使いにくい。けれども、何十枚もシートがたまってしまっていると、手で移動するのも億劫なので AppleScript で移動してみた。

tell application "Microsoft Excel"
 
 activate
 set display alerts to false
 set num_sheets to count worksheet
 repeat with i from 1 to num_sheets
  set orig to sheet i
  set n to the name of sheet i
  copy worksheet orig before the first worksheet
  delete sheet (i + 1)
  set the name of the first worksheet to n
 end repeat
 set display alerts to true
 
end tell

Excel の AppleScript 対応ではワークシートの移動ができないので、コピーと削除を組み合わせて使っている。

ワークシート間で参照があると当然おかしくなってしまうので、そのあたりは要注意。

2010-06-05

Flickr のページを Flickriver で見るための Bookmarklet

Flickr を使い出してずいぶんたつけど、自分以外のいろんな人が撮ったいろんな写真をぼーっと眺めているのもいいもの。

Flickr の標準のユーザインタフェースだと、写真以外の情報が目に入ったり、何枚見つづけていると必ずページを繰るためのクリックが必要になる。そのために専用のアプリケーションやら、ブラウザ側での拡張やら(Autopagerizeとか)、Flickr Viewer とでも言えるようなページ などがたくさんあるみたいだけど、最近の私のお気に入りは Flickriver

Flickriver は、余計なものが表示されないし、写真がブラウザのウインドウに適切な大きさで表示されたり、クリックなしでスペースを叩くだけで連続して写真を表示できたり、(若干不満点はあるながら)キーボードでのナビゲーションができたりなど、なかなかいい感じ。

で、閲覧中のページの URL で "Flickr" の部分を "Flickriver" に書き換えるだけで使えるなど使い方も簡単なんだけど、もっと簡単にするための bookmarklet を書いてみた。

View in Flickriver

これをブラウザ のブックマークに登録しておけば、Flicckr で写真を見ているときにこの bookmarklet をクリック(あるいはメニューから選択)するだけですぐに Flickriver での閲覧に切り替えることができる。

やっているいことはそのまんま URL の書き換えだけでなんの芸もないんだけど、これで少しは便利になるかな。

ただ、全ての Flickr の写真ページで有効なわけではない(これはもともとそういうもの)ので、その点は了解してください。

ちなみに JavaScript でコード書くのこれが初めてかも(^^;)。

2009-07-24

/Volumes に残ってしまった不要なディレクトリを削除する

Mac OS X では、外付けディスクや USB メモリ、イメージファイルなどを自動でマウントするときに /Volumes に適切なマウントポイントが作られるようになっている。その仕組はともかく(実はよく知らない)、普通はマウントポイントはマウントされるボリュームの名前と同じ名前のディレクトリになる。

また、Mac をシャットダウンしたり、外付けディスクや、USB メモリ、イメージファイルなどを取り外すと、マウントポイントになってたディレクトリも自動的に削除されるようになっている。

ところが、たまに /Volumes の下にマウントポイントになっていたディレクトリが残ることがあって、さらにそのディレクトリになぜか .vbt5などというファイルが残っていて、ディレクトリ自体が残ることがある(空でないディレクトリは削除しないようになってる?)。そうなると、次に同じボリュームをマウントするときには新たに別の名前でディレクトリが作られ、残っていたものは使われないままずぅ〜っとそのままになってしまう。

例えば Logi160 という名前を付けたディスクは普通 /Volumes/Logi160 というディレクトリにマウントされるが、このディレクリがうまく消えてくれないと、次にマウントするときには "/Voluems/Logi160 1" のようなディレクトリにマウントされることになる。ただ、この場合でも Mac のデスクトップに見えるディスクの名前はもともとの Logi160 のまま変わらないので普通は問題になることはない。

ただ、shell script など UNIX よりの世界から POSIX パスに依存してなにかをしようとする場合には当然同じボリュームなら同じところにマウントされるほうが都合がいいわけで、そのために /Volumes の不要なディレクトリを削除する小さなシェルスクリプトを書いてみたわけ。


#!/bin/sh
# $Id: clean_volumes_dir.sh,v 1.2 2009/07/23 16:10:44 rok Exp rok $

OIFS=$IFS
IFS='
'
voldir=/Volumes
cd $voldir

dirs=`ls`
mountpoints=`df | grep $voldir | sed -e 's/.*Volumes\///'`

for dir in ${dirs}; do
if readlink $dir > /dev/null; then
# echo $dir is symlink
continue
fi
dontremove=YES
for mp in $mountpoints; do
if [ "$dir" = "$mp" ]; then
dontremove=NO
break;
fi
done
if [ "$dontremove" = "YES" ]; then
echo rm -r "'"$voldir/$dir"'"
fi
done

IFS=$OIFS

このスクリプトを実行すると、/Volumes にある不要なディレクトリを削除するコマンドを出力するので、それを sh にくべてやればいいようになっている。

実行時に使っているディレクトリは削除しないので、いつ実行しても安全なはず。でも、できれば勝手にやって欲しいとは思うので、システムの終了時に実行するのがいいとは思う。やりかたは…… launchd 使うのだと思うけど、実はまだよく分からない……

2009-04-30

ハードディスクが壊れたので NAS を導入してみた

バッファロー(メルコ?)の NAS (LS-QL/1D) というやつをセットアップしてみた。

IMG_0817もともとは Ubuntu 8.04 Server(LTS) のサーバーに USB 接続のディスクをつないで使っていたところ、そのディスクがあれよあれよというまに読めなくなってしまったのがことの発端。

実は異常に気付いたときには、まだそれとなくファイルシステムは読み出せていて、read-only でマウントされているような状態だった。それを fsck しようとして、どんどん深みにはまり、最終的にはディスクラベルからなにから全く読めなくしてしまった。あのとき、速攻で救えるだけのバックアップだけでも取っておいたらよかったんだけど……。

バックアップは、pdumpfs を使って一日に一度別のディスクにコピーを取り、さらに、大事なファイル(というか自分で必要なもの)のみをネット経由で毎日別のマシンにコピーするという二本建になっていた。ところが、pdumpfs を使う方がこの数ヶ月正しく動作しておらず、結果として他の人が使う・作ったファイルがかなりの量失われることになった。まぁ、仕方ない。業務を続けるのに必要なだけのものは残っていたので皆には我慢してもらうことになった。

で、代替のファイルサーバとして、Web インタフェースで Linux や Samba の知識がなくても使えるものをということで、バッファロの LS-QL/1Dというのを買ってきた。確かにセットアップは簡単でweb経由で誰でもできる。でも、附属のユーティリティは殆ど使いみちがない(LAN 上に NAS を探して、それぞれに http できるようにするだけ。一度 IP アドレスを固定してしまえば用なし)ばかりか、不要なプログラム(/Library/StartupItems/NASPower/……)をバックグランドで走らせたままにするなどという行儀の悪さもありあまり感心できない。いろいろ調べて、このプログラム自体はディレクトリごと /Library/StartupItems(Disabled)/ に移動しておくことにした。

この NAS、まだ全然使いこんでないのだけど、RAID を組み かえたときには、中身は消えちゃうとか特に目立った特徴のない普通のものだと思う。ただ、OMRON や APC の UPS が素で繋がるという点はなかなかいいなと思う点で、自分も OMRON の UPS (BZ35T) を一台使わずに余らせていたので、寄付することにいた。テストもしてみたけど、停電するとちゃんとシャットダウン処理するみたいだし、復電時にもしっかり再起動するのを確認した(UPS の再起動にはけっこう時間がかかるようで、気長に待つ必要はあるみたいだ)。

ハードウェアの障害に対しては、RAID1 で対処するとして、間違ってファイルを削除・上書きしてしまうなどのヒューマンエラーにはやはり世代ごとのバックアップが必要。もちろん、標準ではこんな機能はついてないので自前でなんとかすることになる。UNIX ライクな OS で世代バックアップを手軽に取るにはやはり pdumpfs が便利なので、これを使うことにした。以前は Linux マシンのディスク間でやっていた pdumpfs を samba 経由でやるように小さなシェルクリプトを書いた。取りあえずの版なので、いい加減なままだがおいおいまともにしていくつもりだけど、だいたい下に引用したような感じになる。NAS(IP アドレスが NAS_IP_ADDR) の SHARE という共有上の DAIJI_FOLDER というディレクトリを、このスクリプトを動かすマシンの /pdumpt/DAIJI_FOLDER というディレクトリに pdumpfs を使って世代バックアップする。

#!/bin/sh

mounted=YES
mountpoint=/mnt_for_backup
mountoptions=ro,credentials=/usr/local/etc/cifs.cred,iocharset=utf8
destroot=/pdumped
exec 1>${destroot}/log 2>&1

SRCDIR=`mount | awk '/^\/\/NAS_IP_ADDR\/SHARE/ {print $3;}'`
if [ x"$SRCDIR" = "x" ]; then
# must umount after backup
mounted=NO
mount -t cifs //NAS_IP_ADDR/SHARE $mountpoint -o $mountoptions \
|| exit 255
else
mountpoint=$SRCDIR
fi

DEST=$destroot'/DAIJI_FOLDER'
SRC=$mountpoint'/DAIJI_FOLDER'
/usr/bin/pdumpfs $SRC $DEST

if [ $mounted = 'NO' ]; then
umount $mountpoint
fi
この NAS の Samba のバージョンはそこそこ新しいらしく、Ubuntu 8.04 の mount -t cifs できちんとマウントできるので助かっている(自分の普段の職場の NAS だと、これができないので……)。

なにはともあれ、これで一段落。RAID0 と UPS による対障害性と、pdumpfs による世代バックアップで、少しは安心できるようになっているはずだ。

2009-02-23

コマンドラインで Growl

コマンドラインで Growl を利用してメッセージを表示するようなプログラムを作ろうとして四苦八苦していた(ちょっと大袈裟)。大きめのプログラムを make してるときなどに、その終了を Terminal が隠れているような状態でも確認できたりすると便利だなと思ったので。

で、いろんな困難を解決して(ちょっと大袈裟に書いてる)、だいたい仕上がりが見えてきたなと思ったところで、気付いた(というか見付けたというか)のが、Growl の Perl インタフェースと AppleScript インタフェース。

なんとか Growl.framework を内蔵させたり、CLI 用のコマンドを自動でインストールしたりとか、たくさん苦労(大袈裟に書いてる)したけど、Perl や AppleScript(を osascript 経由で利用する SHell Script) を使えば、そんな苦労は結局全然必要なかった。

まぁ、それはともかくとして、成果物(大袈裟に書いてる)は、そのうちMy Programs ‎(Programming Memo)‎ あたりで公開すると思うけど、やっぱり誰の役にも立たないだろう。

いろいろ調べながらプログラムしているときは楽しいんだけど、やっぱ、ちょっと徒労感が……(ここもやっぱり大袈裟に書いている)。

2009-01-25

QuadCamera で遊ぶ

今、メインマシンが使えなくて不自由してるけど、まぁ、それはさておく。

iPhone で手軽に連続写真が撮れる QuadCamera というアプリケーションがある。はっきり言ってとても遊べる。紹介は本家 Art & Mobile にまかせるとして、連続写真が撮れるとなるとやってみたくなるのがそれを動画にすること。で、やはりご本家がやってくれました、その名も QuadAnimator 。QuadCamera で撮影した写真を GIF アニメにしてくれる。

QuadAnimator は iPhone のアプリケーションではなくて、Flash を使った Web アプリケーションの形を取っている。いろんな事情はあるのだろうけど、iPhone で アニメーション GIF をうまく扱えない(本体内に保存できない)のが大きな理由のひとつらしい。しかし、まだ Labo にある段階とはいえ、ちゃんと使いやすい GUI がついていて、手元の PC/Mac にある連続写真から、GIF ファイルを手元の PC/Mac のディスクに(たぶん)直接生成できるのは素晴らしい。(以下一文 2009-01-26追記) とかなんとか書いていたら、Art & Mobile で WIndows 用と Mac OS X 用のスタンドアロン版が公開されてた。素早い。

実は自分も同じようなこと(分割してアニメ化)を考えていて、QuadCamera (に限ったものでもないけど)の写真を分割するだけの超単機能なプログラムを書いてはいた。アニメーション GIF の作り方が分からなくて、大げさにも Flash CS4 を使ってGIF化してたりはしたんだけど、出遅れ感ありあり(そのうち気が向けばゆっくりと外堀を埋めていってスタンドアロンのアプリにできるかなくらいは考えてたかなぁ)。というか全然勝負になってないなぁ、負けすぎ……。

QuadCamera関連に限った話ではなくても、今本当に iPhone のまわりには楽しいことがいっぱいだ

2008-07-23

もっとオープンに --- Open more...

Mac OS X には open というコマンドがあって、引数として渡されたファイル や URL を適切なアプリケーションで開いたり、-a オプションで直接アプリケーションを指定して開いたりすることができる。これは、コマンドラインでの作業が多いととても便利で、alias や関数、ルスクリプトなどに利用することでさらに有難かったりもする、利用頻度の高いコマンド。

つい最近、 -a オプションであるアプリケーションを起動しようとして、引数にアプリケーションを指定せずそのまま実行してしまったら、以下のようなヘルプメッセージが表示された。

[mbp15:~] rok% open -a
open: option requires an argument -- a
Usage: open [-e] [-t] [-f] [-W] [-n] [-g] [-h] [-b ] [-a ] [filenames]
Help: Open opens files from a shell.
By default, opens each file using the default application for that file.
If the file is in the form of a URL, the file will be opened as a URL.
Options:
-a Opens with the specified application.
-b Opens with the specified application bundle identifier.
-e Opens with TextEdit.
-t Opens with default text editor.
-f Reads input from standard input and opens with TextEdit.
-W, --wait-apps Blocks until the used applications are closed (even if they were already running).
-n, --new Open a new instance of the application even if one is already running.
-g, --background Does not bring the application to the foreground.
-h, --header Searches header file locations for headers matching the given filenames, and opens them.

誤ったオプションや、使い方を間違えたときにヘルプメッセージが表示されるようにするのはよくあることで、それ自体はなというほどのこともでないのだが、明かにオプションの数が増えている。

以前(不確かだけど Tiger 時代まで)は、アプリケーションを指定する「-a」、TextEdit.app で開くことを指定する「-e」、標準入力からの入力を利用するための「-f」くらいしかなかったものが、さらに多くのオプションが追加されたようだ。「-t」と「-e」なんて微妙な違いだし、「-b」ではアプリケーションバンドルの ID を使ってアプリケーションを開いたりするのも一部の人を除いては手軽とも言難いし、なんだか不思議な機能追加ではある。

ただ、プログラムを Xcode などを使わずに書いていると -h オプションはけっこう重宝しそうではある。たとえば、「open -e -h NSURLConnection」を実行すれば、NSURLConnection.h を TextEdit.app で開いてくれるし、「open -e -h NSURL」のように不完全なヘッダファイルの名前を指定すれば、候補となりそうなファイルをリストアップしてくれる。
[mbp15:~] rok% open -e -h NSURL
NSURL?
[0] cancel
[1] all

[2] /System/Library/Frameworks/Foundation.framework/Headers/NSURL.h
[3] /System/Library/Frameworks/Foundation.framework/Headers/NSURLAuthenticationChallenge.h
[4] /System/Library/Frameworks/Foundation.framework/Headers/NSURLCache.h
[5] /System/Library/Frameworks/Foundation.framework/Headers/NSURLConnection.h
[6] /System/Library/Frameworks/Foundation.framework/Headers/NSURLCredential.h
[7] /System/Library/Frameworks/Foundation.framework/Headers/NSURLCredentialStorage.h
[8] /System/Library/Frameworks/Foundation.framework/Headers/NSURLDownload.h
[9] /System/Library/Frameworks/Foundation.framework/Headers/NSURLError.h
[10] /System/Library/Frameworks/Foundation.framework/Headers/NSURLHandle.h
[11] /System/Library/Frameworks/Foundation.framework/Headers/NSURLProtectionSpace.h
[12] /System/Library/Frameworks/Foundation.framework/Headers/NSURLProtocol.h
[13] /System/Library/Frameworks/Foundation.framework/Headers/NSURLRequest.h
[14] /System/Library/Frameworks/Foundation.framework/Headers/NSURLResponse.h

Which header(s) for "NSURL"?

最後の「Which header(s) for "NSURL"?」というプロンプトに対して、対応する番号をタイプしてやるとそのファイルを開くことができる。Mac OS X のアプリケーションじゃなくて、less とか lv で開ければもっと便利になりそうなのが惜しいところ。

2008-07-05

続「神(示申)」と「神」

承前。

Firefox 3 をインストールしたので、kazuho さんの追試。


ちゃんと表示は区別されている。けれど、「示申」をコピーしてみると確かに、
[mbp15:~] rok% pbdutil -r text | hexdump
0000000 e7 a5 9e
0000003
となって、「神」に変わっているのが確認できた。

Firefox の挙動を整理すると、
  • Firefox 2 → 表示は「神」だが(日本語のフォントは ヒラギノ角ゴにしてあるので「示申」はあるはずなんだけど……)、コピーした内容はもとのままの「示申」
  • Firefox 3 → 表示は正しく「示申」だが、コピーした内容は「神」

となっていて、もしかしてバグなんでしょうかね。

Safari 3.1.1 だと表示もコピーも正しい(というか普通に期待される)挙動を示すのだけど、Blogger の投稿エディタで「示申」(一文字)で書いたものは投稿時に Safari か Blogger かが「神」に変換(NFC?)してしまうみたいで、これはこれでちょっと気にいらない動作。

なんというか、漢字というか文字の取り扱いは難しいもんなんだというのを再認識した。

2008-07-04

「神(示申)」と「神」

Twitter で、kazuho さん曰く

・kazuho 例: Mac 版 Firefox では「示申」をクリップボードへコピーすると「神」になる about 7 hours ago from web
・kazuho Mac 版 Firefox からクリップボード経由でコピーする際に NFC が行われて異体字が変換されてしまうのか about 7 hours ago from web
ということなので、文字コード関連は苦手なのだけど、ちょっと実験してみた。

だいたい書き終わって下書きを保存すると「示申」が全部「ネ申」に書き換えられてしまっていた。しかたがないので、上の引用も以下の本文も「示申」と「ネ申」と書き直したが、本当はどちらも一文字のもの。これは Blogger の問題か、Safari の問題か、あるいは Mac OS X の方の問題かよく分からないけど。

まずは Safari。ちゃんと表示は区別されている。「示申」をコピーするとその中味は以下の通り。
[mbp15:/tmp] rok% pbdutil -r text | hexdump
0000000 ef a8 99
0000003
次に「ネ申」だとこう。
[mbp15:/tmp] rok% pbdutil -r text | hexdump
0000000 e7 a5 9e
0000003
ちなみに、Sarafi からテキストをコピーすると、以下のように 16種類のデータが入っている。
[mbp15:/tmp] rok% pbdutil -lvvv
Available type(s):
com.apple.webarchive (size: 918)
Apple Web Archive pasteboard type (size: 918)
public.rtf (size: 195)
NeXT Rich Text Format v1.0 pasteboard type (size: 195)
public.utf8-plain-text (size: 3)
NSStringPboardType (size: 3)
dyn.agu8y63n2nuuha5dbrf1ca2pxqry0wkduqf31k3pcr7u1e3basv61a3k (size: 1)
NeXT plain ascii pasteboard type (size: 1)
public.utf16-external-plain-text (size: 4)
CorePasteboardFlavorType 0x75743136 (size: 4)
dyn.agk81n65yru (size: 148)
CorePasteboardFlavorType 0x7573746C (size: 148)
com.apple.traditional-mac-plain-text (size: 1)
CorePasteboardFlavorType 0x54455854 (size: 1)
dyn.agk81g7d3ru (size: 22)
CorePasteboardFlavorType 0x7374796C (size: 22)
これらの中から貼り付けられる側のアプリケーションが適切なタイプを指定して取り出すことになる。例で pbdutil コマンドで -r text と指定して取り出しているのは NSStringPboardType のもの。TextEdit.app をリッチテキストの編集モードにしていたり、ワープロなんかにペーストすると RTF のデータが使われるのだと思う。

さて、自分が使っている MacBook Pro には Firefox は 3.0 をインストールしていないので 2.0.0.15 で試してみる。
こちらは表示上は区別されずにどちらも「ネ申」になってしまっている。フォントはヒラギノ角ゴProW3(のはず)。さきほどと同じように前の「神」 (Safari で「示申」と表示されている方)をコピーすると、その中味は以下のように Safari から「示申」をコピーした場合と変わらない。
[mbp15:/tmp] rok% pbdutil -r text | hexdump
0000000 ef a8 99
0000003
「神」をコピーしたときも Safari と同様に 「e7 a5 9e」となる。

というわけで、ペーストされる側のアプリケーションが NSStringPboardType のデータを要求する限りにおいては Firefox 2.0 では表示上は区別できていなくても実データは区別できているみたいだ。ちなみに、VMware 上の Windows XP で動作している Firefox では Safari と同じ挙動を示す。kazuhoさんの言われるような挙動が観察されるということは Mac 版の Firefox 3 が変わっているのかもしれない。時間ができたら Firefox 3 をインストールして試してみよう。

参考: pbdutil コマンドについては 6 x 3: コマンドラインでコピペ あたりから手繰ってください。

追記: Blogger Draft と標準の Blogger の投稿エディタは混ぜて使わないほうがいいみたい。改行が全部なくなって大変なことになってしまった。しばらく使うのはやめておこう。なんか画像の配置もむずかしい……。これももしかして Safari 依存の問題?

2008-06-26

Twiter CLI Tool Set

以前にちょっと書いたけど、Twitter にコマンドラインからアクセスするための小さなツールのセット(Mac OS X 専用)を若干更新した。

今回は、ユーザ情報を得るためのコマンド(twu)を追加しただけ。「twu -user hoge」のように使うけど、手抜きでユーザ名とパスワードを指定するオプションを付けてないので、~/.twitterpass が必須。

Twitter CLI Tool Set (Programming Memo) に簡単な説明とソースコードが置いてある。

中味はほとんど Tiwtter の API を叩くだけなので、curl とか wget とかを使ったシェルスクリプトや、Ruby や Perl でも同じようなことはできると思う。まぁこんなものでも、たまにプログラムを書くのは楽しいのでそれでよしとしておく。

2008-06-13

コマンドラインで Twitter を読む

Mac OS X のコマンドラインで Twitter のタイムラインにアクセスする小さなツールのセットを書いている。

自分の発言を全部取り出したかったのが作成のもともとの理由。とりあえず目的を達成することができたので、ちょっとだけ機能追加して公開してみる。「tw」では今のところはタイムライン(public, user, friends, replies, archive(厳密にはタイムラインと区別すべき?) )を、xml, rss, atom, json などのフォーマットで取り出すことができる。rss や atom の場合は、ファイルに保存して Safari で開けば読むことができる。

自分の発言のアーカイブは xml か json でしか取り出すことができない。json は無視するとして、xml フォーマットでの出力からタブ区切りで時刻・発言内容・名前(name)・スクリーン名(name) を出力するプログラム 「twxml2tvs」も合わせて作ってみた。
# 自分の発言のアーカイブを表示する
# (文字のエンコーディングはUTF8)。
tw -t a -u 名前 -p パスワード | twxml2tsv

# 同2ページ目
# (ユーザ名とパスワードは ~/.twitterpass に改行で区切って書いておくことができる)
tw -t a -page 2 | twxml2tsv

# zsh で複数ページを取り出す
# (注: API の制限があるので sleep を適当に挟む必要がある)
$ for page in {1..10}; do
tw -t a -page $p | twxml2tsv; sleep 1;
done > /tmp/tw_archive.txt

# public timeline を RSS で取得する(デフォルト動作)。
# public timeline の時はユーザ名とパスワードは不要(~/.twitterpass も要らない)
tw > /tmp/tw_public.rss
# Safari で表示
open -a safari /tmp/tw_public.rss

# friends timeline を取得。
tw -t f
tw には、タイムラインを指定する-tオプション(引数には archive(a), public(p), friends(f), replies(r)を指定)、引数にユーザ名を指定する -u オプション、パスワードを引数にする -p オプション、出力フォーマットを指定する -fオプション(引数は xml, atom, json , rss を指定)、ページを指定する -pageオプション(引数はページ番号) などのオプションがある。組み合わせによっては使えないものもあるけど、厳しいチェックはしていないので、なにが起こっても気にしないことが大事。

ユーザ名とパスワードの組は、上の例にも書いたけど、~/.twitterpass に改行で区切って書いておくことができ、この場合は -u や -p オプションは不要。人に見られないようにアクセスの権限を調整しておいた方がいいが、これもプログラムではチェックしないので要注意。

twxml2tsv は、xml で出力されたものを、一エントリ一行で出力する。オプションはない。出力内容は今は固定で、文字のエンコーディングも UTF8 固定なので、他のソフトウェアで出力を使う場合には変換する必要があるかもしれない。タブ区切なのでEXCEL でも使えるけど、一度ファイルニ出力したものを使うには EXCEL 2004 の場合は ShiftJIS に変更する必要があった。

あと、よく分からないのだけど NSURLRequest とか NSURLConnection とかを使っているからか、時々キーチェーンへのアクセス許可を求めるダイアログが表示される。とりあえず「許可」ボタンを惜せば問題なく動作はするけど、これはうっとうしいのでそのうちキーチェーンは使わないようにするつもり(できるかな?)。

Google Sites 上にもページを作ってみたのだけど、本当にどう使い分けるのがいいのだろう……

2008-06-08

Google Site を試してみる

Google Site が一般人にも開放されたというので、とりあえず試してみた。

http://sites.google.com/ にアクセスして、Google Account で Sign In して、あとは指示に従うだけで簡単。作ったあとも基本的には Wiki みたいなものなので、更新も Blog なみに容易だし、複数人でのサイトの運営をするように設定することもできる。

さて、新しいサイトを作るにあたってはやはりネタが必要なわけで、今回は自分がプログラムを書くにあたって調べたことを主に 備忘録的なものにすることにした。(ほとんど空っぽながらも)数分で出来上がったのが Programming Memo

まだ Google Sites ならではの特徴などは全然使えてないけど、これから少しずつ充実させることができるといいな。もともとは主に自分のためのメモという位置付けだけど、少しは人の役に立てばいいとも思う。

ただ、ブログとの使い分けなどもちゃんと考える必要はあるけど、どうしようかなぁ。

2008-05-08

IDE は難しいので make でビルド

GUI とか、そもそもユーザインタフェースを作るのが苦手なので、自分で使う小さなツールはコマンドラインで使うように作る。

Goolle の GData API の Object-C 版を試してみようと思って、ソースをダウンロードしてきた。サンプルが付いてくるのだけど、これが Xcode のプロジェクトになっている。*.xcodeproj というのを開けば、普通に使えるようになっている。

実際にビルドしてみると去年野良ビルドした libjpeg をリンクしようとして、まずリンクできない。libjpeg はなんに使ったのか覚えてないのだけど、i386 用のものしかインストールされていなくて、これに対して GDataAPI のサンプルのプロジェクトはユニバーサルバイナリを作ろうとする(10.4u の SDK をリンクする)ために ppc 用がないと文句を言うということらしい。しかし、GData のサンプルがなぜ libjpeg をリンクしようとするのかは謎。試しに 10.5 の SDK を使うようにターゲットの設定を変更すると無事ビルドできた。当然のことながら ibjpeg はリンクされていない(SDK を替えるとなぜ libjpeg をリンクしようとしないのかも謎)。

サンプルで一番簡単そうなのは、CalendarHelloWorld というコマンドラインのツールで、Google Calendar に "hello world" という予定を一つ追加するプログラム。これも Xcode のプロジェクトになっているので、Xcode でビルドしてみた。前述のようにしてなんとかビルドできたものの、コマンドラインに引数を与えて実行する方法が分からず(前にやったことがあるのに)、結局 Terminal.app のお世話に……。後で調べなおしたのだが、引数は該当する実行ファイルの情報ウインドウの「引数」タブで設定するらしい(下図)。


前置きが長くなったけど、自分で書くようなプログラムでは、ソースファイルの数も限られているし、細かなオプションも指定しないし、プログラムのソースは vi(vim)で書いて、昔ながらの make を使ってコンパイルしている。

Mac OS X の場合で違うのは gcc に -framework とか -isysroot などのオプションを使うくらいで、他は普通の UNIX と変わらない。 Cocoa のフレームワークを使うファイルが一つだけのプログラムなら、Makefile を書くまでもなく以下のようにするだけ。

cc -framework Cocoa SourceFile.m -o Executable
GData API のサンプルの CalendarHelloWorld をコンパイルするなら次の通り(ただしビルド済みの GData.Framework が既に /Library/Frameworks にインストールされていること)。
cc -framework Foundation -framework GData CalendarHelloWorld.m -o a.out
実際、自分のプログラムはソースの数が極めて少ないので(単純なツールだけど Foundation フレームワークなどの恩恵は受けたい……)、依存関係の記述に困ることもないし、Xcode の IDE を使うよりもずいぶん気楽だ。もちろん、細かい設定をしたいなら、いろいろと詳しいことを調べて正しくたくさんのオプションを設定したりする必要はあるけど……。

参考までに、Xcode のプロジェクトが出来上がっていて、単にビルドするだけなら xcodebuild というコマンドが使える。プロジェクトの設定通りにビルドしてみるだけなら、Xcode を立ち上げなくていいのでこれも手軽。

というわけで、Mac OS X でも簡単なプログラムを書くだけならコマンドラインでもけっこういけますよ、ということと、実は Xcode の IDE の変化についていけてません、という告白。

2007-12-19

MacにRailsをゼロからインストールするもっと簡単な方法


Locomotive を使うのがもっと簡単ではないかと。

これなら Drag & Drop だけで済んじゃう。MacPort のインストールからやらせておいて「一番簡単」なんて……。あとあとのことを考えると MacPorts を導入して損することもないとは思うけど。

それにしてもこの二日ほど Safari がよく落ちる。どうしちゃったんだろう。

2007-12-07

Google Chart API

グラフを書くための API が Google から発表されている。

API に従って URL を作って、Google に投げれば、PNG でグラフを作ってくれるらしい。実用性はともかくインターネットにつながっていれば、自作プログラムからも使えて面白い。

2007-09-14

エイリアスを実ファイルに (iPhotoのファイル管理)

iLife '08 を購入したので iPhoto を中心にちょろちょろと試している。

iPhoto は自前でのファイル管理が前提になっていたのだけど(自分のライブラリに画像ファイルのコピーを抱えこむ)、途中のバージョンからファイルの実体をコピーするのではなくて、エイリアスを作るよう設定もできるようになった。普段は自前でフォルダ管理をしていて、ときどきアルバムを作ったり、ブックを印刷したりするような用途の時だけ一時的に iPhoto を使ったりする場合や、別のアプリケーションでの管理がメインの場合は、いちいちコピーを作って二重に管理するようりもエイリアスを作るほうが適している。

自分の場合も、これまでは、必要に応じてライブラリを作る(必要なくなったら削除する)というやり方だったので、コピーでなくエイリアスを作るように設定していた。

しかし、iLife '08 になって使い勝手も向上し、また、Web Gallerey などとても魅力的な機能も加わって、μ770SW で撮影した画像に関しては主に iPhoto を使って管理することにしたのは、いつか書いた通り。……なんだけど、以前の設定がそうだったからなのか、iPhoto '08 のデフォルトがそうなのか、コピーでなくてエイリアスで管理するようになっていた。

で、iPhoto Library の中に、オリジナルの画像ファイルへのエイリアスが大量にあることになるのだけど、どうせ iPhoto をメインにするのだから、これらのエイリアスを全部実ファイルに置きかえたく(そしてダブったファイルは削除したく)なった。でも、自動化しようとするとちょっと面倒っぽい。

エイリアスかどうかは Developer Tools に入っている GetFileInfo コマンドの -aa オプションで判別できるのだけど、エイリアスからオリジナルのファイルのパスを知るためにはどうやら osascript コマンドなんかで AppleScript を呼出す必要があるかもしれない。などと考えながら Google で検索してみたら、まさにこのためののプログラムが!

AppleScript ゆえの遅さはあるけど、素晴しい。めでたく iPhoto Library 中のエイリアスが実ファイルに置き換わった(^_^)。作者のくりたさん、ありがとう。

中を ScriptoEditor でのぞいてみると、思ったより大変そう。それに自分がいかに AppleScript を分かってなかったかもよく分かる。

2007-07-07

notifiedexecd: ネットワーク変更時などに指定したプログラムを実行する

ずいぶん前に 6 x 3: notifiedexecd とか 6 x 3: Mac OS X 上で configd を使って ntpd の再起動をしてみる という記事を書いた。持ち歩いている PowerBook でネットワークへの接続状況が変わると ntpd がうまく時刻を同期してくれなくなるのをなんとかしたいというのがもともとの動機だった。結局、自作の notifiedexecd というプログラムでは、他の通知(distributed notification)は受け付けられるものの、ネットワークの接続状況の変更に関してはうまくいきそうで、ダメだったというのがそのときの状況。

で、一月半くらい前に MacOSXHints で見たこの記事( macosxhints.com - How to perform an action on change of network)をヒントにして件の notifiexecd を改訂してみた。実際には、ここで紹介されている IXSCNotificationManager というクラスを Google で検索して見つけたCocoaDev: NotificationOnNewNetwork を参考にしている。というかサンプルをそのまま埋め込んだだけというか。とりあえずソースコード を置いておく。配布に特に制限は付けないけど、どこかで紹介するときにはこの記事を参照してもらえるといいかなぁ。

IXSCNotificationManager 自体は配布しているソースコードには入れていないけど、"make fetch" するとネットワーク経由で配布元から入手することができるようにはしてある。そのあとで make all; make install すれば /usr/local/bin に notifiedexecd がインストールされる。

使い方は、前に6 x 3: notifiedexecd で説明したのとほぼ同じで、普通の通知(distributed notification) ならそのまま。前はネットワークの変更を知るにはこれではダメだったので、今度は SystemConfiguration Framework からの変更通知を知る -s オプションを使うことになる。例えば IPv4 の状態?が変わったときに /usr/local/bin/restart-ntpd を実行したいならば、

notifiedexecd -s State:/Network/Global/IPv4 /usr/local/bin/restart-ntpd
のようにすればよい。

-s オプションを使うときに通知の名前の代わりに使うキー(上の例だと State:/Network/Global/IPv4)は、コマンドラインで scrutil を実行して、list サブコマンドの結果として得られたものが使える。State:/Network/Global/IPv4 はちょと意味が違うような気もするけど、ntpd を再起動するという今回の用途にはとりあえず足りてる。

2007-06-15

charならそれは……

404 Blog Not Found:紹介 - 「再帰呼出」デビュー曲"Hello World" で紹介されていた、再帰呼出というユニットの Hello World という曲。これは楽しい。ラップは普段はあまり聞かないけど、気に入りました。

ちなみに私は「キャラ」派ですけど「シャーならそれはアズナブル」というくだりで吹き出してしまいました。

2007-03-09

ATEN CS-1734A納品

6 x 3: 不思議な amazon で例に上げた、ATEN CS-1734A と PS/2 対応のケーブル二本が納品された。……のはいいんだけど、ちょっと失敗しちゃったかも。

まず一点目。購入を検討している段階では HP 1x4 USB/PS2 コンソールスイッチと比較していた(たぶん HP のは ATEN の OEM)。主な違いは附属するケーブルで、ATEN のが USB 対応が四本なのに対して、HP のは PS/2 対応のが二本で、どちらにしてもうちで使うにはケーブルを何本か追加しなければいけない。で、追加ケーブルの分まで足した値段で ATEN を選んだわけ。でもいざ納品されてみると、HP の方では附属していることになっている、PS/2 -> USB の変換アダプタが付いてないことに気づいた。確かに ATEN のサイトを見ると Pure USB だとかなんとか書いてあってちょっと盲点だった。USB 接続のキーボード・マウスも持ってはいるのだけれどあんまり出来が良くないので、変換アダプタを別途買ってこないといけない。

2点目。さっき HP のページでなにげに「コンソールスイッチ」で検索してみると、HP KVMサーバ コンソール スイッチ(1x4)なんてものが! 内容的にはあまり変わらないんだけど、USB が 2.0 対応になってポート数が増えていたり、ラックマウント兼用の筐体になっていたり、電源が AC 直結になっていたりして、大きさを除けば使い勝手はよさそうだ。Web に記載された日付からすると、ATEN のを Amazon で注文したのとほぼ同時に発売(発表?)されているようで、なんとも悔しい。

ポチるまえにもう一度調べればよかったよ。

2007-02-10

Shell script を html 化する

前のエントリを書くときに、シェルスクリプトを html 化しようと思った。で、いろいろ探していて見付けたのが face2html.el という Emacs 用のプログラム。

リンク先にある face2html.el は、Emacs のバッファの face 情報を使ってバッファ内のテキストを html 化するもの。

face情報は、実際に表示されるまで生成されない(?)のか、画面に表示されない程度の大きさのファイルで試すとファイルの後半(一度も表示されなかった部分)の色とかが付かないことがあるけれど、気を付けて必ず一度表示させれば大丈夫みたい。

いろんなプログラミング言語で書かれたソースを html 化するプログラムがあるようだけれど、シェルスクリプトを html 化するものがあまりないのはちょっと意外だった。