2009-08-30

Snow LeopardのExposéのGrid表示

Snow LeopardのExposé
グリッド配置される (約60アプリ)
LeopardのExposé
(有名な150アプリ表示)
前者の2.5倍あるが個々のウィンドウを区別しやすい
Snow Leopard (Mac OS X 10.6) のExposé (Expose) の表示がグリッド配置に変更されてしまいました。
私はTigerやLeopardの表示スタイルの方が好きです。
グリッド配置には次に挙げるような欠点があると思います。
  • 全てのウィンドウが同じサイズにそろえられてしまうので、目的のウィンドウを探しにくい。
    例えばSafariの大きなウィンドウとステッキーズの小さなウィンドウが同じ大きさになってしまうので一見して区別しにくい(右の図でもSafariの大きめのウィンドウがどれなのか見つけられない)。
  • ウィンドウの大きさという情報が欠落する。
  • グリッド配置事体にあまり意味がない。
    グリッド配置は一見整理されて表示されいるように見えますが、元々のウィンドウの並びがアナログ的なのを無理矢理直線的にしているのでかえって分かりにくい。
  • 画面上の無駄な隙間が多くなり、個々のウィンドウの表示がさらに小さめになってしまう。
  • 何より、面白みが少なくなってしまった。
ぜひとも、元のような表示モード(グリッド配置OFF)も復活してほしいものです。

[English version]

Snow Leopardのプロセス一覧;64bitだらけ

Snow Leopard (Mac OS X 10.6) のプロセス一覧を見てみると、ほとんど64 bitプロセスです。
個人向けパソコンもいよいよ本格的に64bitの時代になったことを実感しました。

2009-08-23

今日の気になるPodcast;Macを使いこなそうGarageBand編、iPod touchゲームギャラリー

2009-08-19

Blogspot/Bloggerで、よりお手軽に投稿 その2

以前、Bloggerの投稿ページをブックマークしておくと、Tumblrのブックマークレットと同じようにワンクリックでBloggerに投稿できて便利、という小ネタを書きました
でも、その方法では、ブラウザの今見ているウインドウが投稿ページに置き換わってしまって、Tumblrと同じように、とはいきませんでした。
単純にURLをブックマークするのではなく、Javascriptで一工夫することで、別ウィンドウでの投稿が出来る方法が分かりました。
  1. まず、Bloggerの投稿ページをブックマークします。
  2. ブラウザのブックマークの管理ツールを開きます。
  3. URLが http://www.blogger.com/post-create.g?blogID=xxxx になっていることを確認します。
  4. このURLの前に以下を挿入します(最後のシングルクォートを忘れずに)。
    javascript:void(window.open('
  5. URLの最後に以下を挿入します。
    ',null,'width=750,height=700,scrollbars=yes'))
  6. 結果として下記となっているかを確認します。
    javascript:void(window.open('http://www.blogger.com/post-create.g?blogID=xxxx',null,'width=750,height=700,scrollbars=yes'))
よろしければ、お試しください。

[2009-08-29] scrollbars=yes を追加

2009-08-18

メモ同期アプリ Notes Upload Build #004

iPhone OS 2.0以降で動作しなくなっていたメモ同期アプリ(旧バージョン)が、iPhone 3.0でやっと復活の日を迎えることができました。
前回はJiggyという独自のGUIツールを使用していましたが、今回はXcodeでGUIを作成しました。
DB操作やネットワークアクセスには前回と同様、Pythonスクリプトを使用しています。

メモ同期 Notes Upload (build #004 2009-08-18) [Download]

できること
  • メモアプリのエントリをIMAPプロトコルで、メールのフォルダに同期(現バージョンではアップロードのみ)します。同期先のメールフォルダはあらかじめメールソフト(メーラー)で作成しておいてください。
  • 無線LAN (Wi-Fi) 接続で同期を行えます。
  • GUIは今回は英語のみです。
  • Last Uploadの日時を指定して、部分的な同期(新しいエントリのみ)ができます。同期完了後、Last Uploadの日時は自動的に更新されます。
  • 今回はプログレスバーをつけてみました。
インストールの仕方
  • 事前にPythonをCydia等でインストールしておいてください。パッケージ名「iPhone/Python」を選ぶと必要な周辺パッケージも一度にインストールできて便利です。
    tar (Tape Archive) も必要なのでインストールしてください。
  • 上記キットをiPhone/iPod touchに適当な方法でコピーします(いったんPC/MacにコピーしてからscpでiPhone/iPod touchにコピーする、など)。ファイル名は NotesUpload004.tar.gz です。
  • iPhone/iPod touchにログインして、rootユーザになります(suコマンドやsudo shコマンド)。
  • iPhone/iPod touchの /Applications/ フォルダ配下に展開します(/var/mobile/Applications/ ではありません)。念のため、コマンドは下記です。
    cd /Applications/ ; tar xzvf ~mobile/NotesUpload004.tar.gz
  • コピーしたアプリをiPhone/iPod touchに認識させるためにrespringまたは再起動します。
お願い
初めて作ったXcodeアプリなので、まずは、動いたかどうか(正常に起動したらPreference画面が表示されます)をお知らせいただけると、とてもありがたいです。
自分の環境では動いていますが、それがそのまま他の環境で動くかどうかが全く分からないからです。
よろしくお願いします。

(noets.dbの内容を読み込んでIMAPにエントリを作るだけで、削除処理は全く行わないアプリなので、安全に実行していただけます。ただし、業務等重要な用途で使用することは今の段階では避けてください。)

開発後記
Pythonスクリプトを使用しているのは、とても容易に使えるIMAPライブラリを利用したいがためです。
Pythonにはあらかじめ何でもそろっています(Batteries included;バッテリも入っています(おもちゃなどがバッテリ付きで、他に何も買いそろえなくても、すぐに遊べるようになっている状態をたとえにしている))。
今回が初めてのXcodeプログラミングだったのですが、Objective-CおよびCocoa Touch独自のお作法に、最初確かに、めげそうになりました。
(なお、App Storeに登録していませんので、iTunesで探しても見つかりません、念のため。)

iPhone 3.0のnotes.dbの変更点

iPhone/iPod touch 3.0のメモアプリ (MobileNotes.app) のsqlite3テーブルスキーマが1.1の頃に比べて拡張されています(2.xからかもしれません)。
$ sqlite3 notes.db
sqlite> .tables
Note
_SqliteDatabaseProperties
NoteChanges
note_bodies
sqlite> .schema
CREATE TABLE Note (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, creation_date INTEGER, title TEXT, summary TEXT, contains_cjk INTEGER, modification_date INTEGER, author TEXT, content_type INTEGER);
CREATE TABLE NoteChanges (record INTEGER, type INTEGER);
CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key));
CREATE TABLE note_bodies (note_id INTEGER, data, UNIQUE(note_id));
CREATE TRIGGER delete_note_bodies AFTER DELETE ON Note
BEGIN
DELETE FROM note_bodies WHERE note_id = OLD.ROWID;
END;
sqlite>

変更点は、
  • Notesテーブルの追加カラム:
    contains_cjk:cjk文字が含まれているかどうか。1でYes。漢字の有無でフォントが切り替わる謎がこれで解けた。
    modification_date:最終修正日時。1.1ではcreation_dateでmodification_dateを代用していた。
    author:おそらく、Sync時にサーバ側のFrom:ユーザがストアされる。
    content_type:不明。メモアプリで作ったアイテムは、全て0のようだ。
  • 追加テーブル:NoteChanges
    アイテムを編集したり削除した履歴。編集の度にレコードが追加される。おそらく、type=1は編集、type=2は削除。Syncすると履歴が削除されると思われる(後で実験)。

2009-08-15

iPhoneシミュレータでのアプリの実行環境

  • $USER:Mac OS Xのログオンユーザ
  • $PWD:/
  • $HOME:/Users/$USER/Library/Application Support/iPhone Simulator/User/Applications/$UUID/
  • アプリのUUIDはXcodeでビルドして実行するたびに変化する
  • $HOME配下にあるもの:Documents/、Library/、tmp/、appl.app/
[2011-05-14] 2009年に記事を書いてからXcodeを更新していない (3.1.3) ので、いまは変わっているかもしれませんが...
  • シミュレータでのユーザのホームディレクトリは、
    ~/Library/Application\ Support/iPhone\ Simulator/User/
    この下に、Media や Library や Applications がある。
  • シミュレータでのファイルシステムのルートは、
    /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulatorX.Y.sdk/
    例えばこの下の Applications にi386用にビルドした? アプリをコピーして実行することもできる。
  • シミュレータ本体の起動は、
    open "/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app"

2009-08-12

今日の気になるiPhone OSアプ;Ustream、Read It Later、Color Chart、HTML Mail

  • Ustream 3G S Recorder
    ちまたで話題のUstreamへ3GSから直接動画をアップするためのアプリ。まだ評価が付いていません。
  • Read It Later Free
    FirefoxのAdd-on、スクリプトレット、およびクラウドからなるブックマークサービスおよびオフラインリーダー
  • Color Chart2
    色見本その2
  • HTML Mail Editor、HTML E-mail (www.westernits.comリンク切れ?)
    こういうのも欲しいと思っていました。
今日の気付き1;アプリアイコンはとても大事。何をするアプリかはっきり分かって、かつ使いやすそう、面白そう、頼りになりそうなどのイメージを表現できて、なおかつ目を引かないといけない。アプリの第一印象は確かにアイコンですから。
今日の気付き2;母艦のiTunesのiTunes Storeでは新しいアプリを探しにくい。iPhone/iPod touchのApp Storeアプリだと、おすすめ、トップ、有料、無料、新着、で分かりやすく一覧表示されるのに、母艦のは、変なスクロール表示で、なおかつ一覧上での情報量が少ない。

2009-08-10

/Applicationsのアプリと、/var/mobile/Applicationsのアプリの出来ることの違い

/Applicationsのアプリで出来て、/var/mobile/Applicationsのアプリ(Xcodeで開発する一般アプリ)で出来ないこと。
  • NSThreadは使えるが、popen()はPARENTAGE_FORK DENY 1のエラーで阻害される。やはりバックグラウンド処理はFrameworkの範疇のお行儀の良いものでないと許されない(ちなみにバックグラウンド実行のNSTaskはiPhone OSのFrameworkから元々外されている;参照noviさんのBlogエントリ)。
  • Shellのターゲットは作成できるけれど、デプロイ時に実行権が外される(chmod -x)。
逆に、/Applicationsアプリで出来ないこと。
  • Settings Bundleによるアプリ設定アプレットが効かない。一般アプリはplistを作成するだけで、設定アプリ(Preferences.app)に組み込まれた設定項目と画面を、非常に容易に生成することができますが、/Applicationsのアプリはこの機能を使えないようです。
  • SpringBoardによるアイコンの自動iPhone化(rounded border と glossy effect) が利かない。一般アプリではべた塗りのアイコンを作成すれば済むが、/Applicationsアプリでは自分でアイコンのiPhonne化をしないといけない。(逆に、一般アプリでアイコンの自動いPhone化を抑止するにはInfo.plistにUIPrerenderdIcon属性を設定する。)
[2011-05-14] アイコンの自動iPhone化を追記。これが分からず、1週間くらい悩みました。一般アプリと/Applicationsアプリのアイコンpngを入れ替えたりして確かめました。

Xcodeで実機デバッグの初級編

XcodeのiPhoneシミュレータでの開発は、すんなりいきましたが、今回、実機デバッグを初めて体験しました。
Xcodeで [Device 3.0 - Debug] をターゲットに選んで [ビルドして進行] を実行すると、iPhoneまたはiPod touchの実機でアプリの実行が始まります。
デバッグモードでは通常より起動が少し遅いので落ち着いて待ちます。

下記3つのウインドウは、実機デバッグ中にいつでも開いておくと便利。
  • [ウインドウ] メニューの [オーガナイザ] を開き、[DEVICES] から実機を選び、[Console] を選ぶと、何がおこっているのかのログが表示される。
  • [実行] メニューの [コンソール](またはメインウインドウのgdbのボタン)はgdbのコンソールで、アプリが落ちたときのステータスなどが表示される。
  • [実行] メニューの [デバッガ](またはメインウインドウの殺虫スプレーのボタン)はGUIデバッガで、コールスタックから調査したいプロシージャを選んで、ソースコードや変数を見たりできる。
シミュレータで一通りうまく動いても、実機では動かないケースがやはりあります。
私がいきなり経験したのは、
NSStringでstringByAppendingString: の引数がnilだと NSInvalidArgumentExceptionで落ちるケースと、
NSDateでdateFromString: でこちらも引数がnilだとEXC_BAD_ACCESSのシグナルで落ちるケース。

2009-08-05

今日の気になるiPhoneアプリ;SNS Contact、ColorBinder、Instaviz

  • SNS Contact~連絡先にフレンドアイコン
    どれだけの一般人がSNSに鮮明なプロフィール写真を開けっぴろげにしているか、多少疑問が残りますが、着想はすばらしいと思いました。
  • ColorBinder
    いろいろな色をRGBやHSVやCMYKで作成して表示するアプリは、Motifの時代から一度私も作ってみたいアプリです。
  • Instaviz
    Newton Message Padのように手書き入力の図が自動的に清書されるアプリ。iDiskへの書き出し機能あり。ただしエンジンが高級なためか高価。

2009-08-02

グレーなiPhoneアプリ;MemoryInfo

iPhoneアプリは、他のアプリに影響を及ぼしてはいけないはずなのに、MemoryInfoは(おそらく)他のアプリプロセスを強制終了させて、空きメモリを増やしてくれます。
初回起動時にネットへの接続が要求されるようですが、何をやっているのかも謎(ユーザ一覧を更新?、強制終了させてはいけないプロセスの一覧を取得?、など?)。

類似のアプリとして、同じ作者のFree Memory、Mac版で有名なiStatMemory Sweep Lite(App Storeのダウンロードがおかしい)、Memory Status(iPhone 3.0対応審査通らず)があります。
SysStats Liteのkimadaさんは、いろいろ試行錯誤されていますが、メモリ解放機能は正式審査には至っていないようです。

[2009-08-09] MemoryInfoとFree Memoryの両方が恐れていた通り「Apple has demanded that we remove the feature to Free Memory from all our apps.」となってしまいました。
代わりにMemory Sweep (Lite)のダウンロードが開始されました(まだアプリ名がScanとなって怪しいままですが、機能します)。Memory Sweepはプロセスの終了ではなく、自分のメモリを15MBまたは30MB確保した結果空きができるようにしているようです。

2009-08-01

今日の気になるiPhone OSアプリ;NetSketch、DocScanner、Blue Reversi、Free Memory、MemoryInfo

  • NetSketch - Collaborative Drawing for the iPhone and iPod Touch
    無限大のドローイングエリアを持つドロー系アプリ
  • DocScanner, iPhone as a Scanner
    iPhoneのカメラをスキャナとして使用し、PDFやJPEGとして保存。自動歪み補正(キーストーン)機能もある。
  • Blue Reversi
    レベル指定可能なオセロ
  • Free Memory 1.5, MemoryInfo 1.1
    他のアプリの強制終了、空きメモリの最大化(Game Mode Free Memory)機能を持つシステム使用状況表示ツール