2010年8月29日日曜日

Kindle3 使ってみた

Kindle2と比較してみて

- 縦横とも1cmほど小さくなった。
これによって、片手でつかみやすくなった。
DSCN1681

- コントラストの改善
今回購入した理由の一番にこれを期待して、購入した。
家の証明は暖色系が多く、Kindleで本を読むと暗く感じるときがある。あとひっくり返ってよむとどうしても暗くなってしまうので、画面がより「白い」方が良い。ただ確かによくはなっているものの改善はわずかだった。左の画像がKindle2、右の画像がKindle3。右の画像の方がわずかに白くなっているのが分かると思う。もっと「白く」なって欲しいと思う。
DSCN1679DSCN1680

- 軽くなった
実際に計ってみたところ、Kindle2は293g、Kindle3は226グラムと67g(23%)ほど軽くなっている。実際に持ってみたところ、小さくなった関係もあり、Kindle2より大分軽く感じる。持って読むときも大分腕の負担が軽くなる。
DSCN1683 DSCN1684

- ページ送りが速くなった。
大分速くなったように感じる。iPadのiBookでPDFを見た場合、ページ送りの時表示されるまでそこそこ時間がかかるが、それよりも速いかもしれない。

- 容量が増えた。
Kindle2の1.48Gから3.09Gに増えている。自炊したファイルはサイズが大きいので大きい方が良い。

- ある程度日本語に対応した。
日本語ファイル名が表示可能になった。自炊していると非常にありがたい。ただ、PDFの日本語はフォントが埋め込みでなければ相変わらず表示できないようだ(未確認)。あとブラウザも日本語入力は出来ないが日本語の表示が出来るようになった。googleを使った場合、ちゃんとサジェストも動作するのでローマ字入力だけでもそこそこ使える。また3Gモデルであれば、ブラウザの機能は現状はExperimental(実験)とされているので、通信料も取られない。(多分。Kindle3になって変わっていたりするかもしれない。念のため。)
Evernoteが読めれば結構最高なんだが、Webからではちょっと重くて使い物にならなかった。今後に期待!

- PDFファイルのコントラストの変更が可能
自炊したファイルをKindleで閲覧していて良く困るのが、字が薄すぎて読めない!ということがよくあること。スキャナにScanSnapを使用している場合、読み取り方式を「白黒」にして、読み取り濃度を濃く、にすれば特に問題ない。しかしその場合、「白黒」のため途中に画像などが挿入されていると画像が潰れてしまう。かといって読み取り方式を「自動」にすると、今度は「画像」があるページがカラーで読み込まれKindleで見た場合、画像は見やすくなるが、字が薄くて読みづらくなる。
この場合、Kindle3ではコントラストの設定の、lightest lighter default darker darkestと選択できるなかのdarkestを選ぶと薄い文字が濃く表示され、ある程度読みやすくなる。

- まとめ
全体的に良くなったと思う。とはいえ、未だに日本語の本の電子書籍は販売されないし、その予定もない。早くそのあたり解決されるともっと良い。また、日本語対応やコントラストの変更など、ソフトウェアで対応できるものは、Kindle2でアップデートできるようにして欲しい。

2010年6月15日火曜日

iPad使ってみた

今回購入は見送ろうと思っていたが、気になってしかたないので、購入してしまった。買ったのはWiFi 16Gモデル。正直このエントリーを書くのは、iPad発売から大分時間がたってるし、もうじきiOS4が出るわでタイミングが悪い、、

結論

ここ一週間ほど使ってみた感じ、まだまだ改善点は色々見られるものの、今後のOSアップデートによるサポートもあるし、また飽きて使用済みになれば、親にでもあげて使ってもらえばいいと思う。高級なフォトフレームにもなるし、レシピブックにもなるだろう。
トイレやお風呂場にでも貼り付けておいても良いかもしれない。WLAN経由で動画も見れるし、音楽も聞ける。
自分の場合昔からタブレットPCにはあこがれのようなものがあり、以前使っていたノートPCは8.9inch液晶のコンパーチブル型のタブレットPCだった。これはこれで面白いPCだったが、ネックになったのは重さ(1.23kg)とバッテリー(二時間弱)だった。そのタブレットPCを買った当時は12万ほどした。それから3年ほどでiPadが登場し重さは680gになり駆動時間が10時間になり、価格は5万円になった。
PC(Windows)以上のことが出来るかというと、それは人によるから何とも言えないし、仮にPCを使ったことがないユーザにiPadを無条件に進めれるかというとそういうわけでもない(iTunes必須だし)。ただマウスとキーボードというインターフェースから切り離されるだけで、ベッドでごろごろしながら使ったり、車の中で使ったり、使い方は人それぞれだが可能性は広がる。興味があるのであれば買ってしまっても良いと思う。逆にあまり興味がわかないのであれば無理して買う必要も無い。多くの場合iPadは自分で使い道を探さないといけないから。

iPod touchとの比較

  • 純正メールアプリ
    画面が大きくなり使いやすくなった。横画面状態であれば、メールのリストと内容が同時に表示できる。これとGmailがあれば、PC版のメールソフトなんか要らなくなるんじゃないかと思う。Gmailについてはアーカイブにする操作ができないので惜しいが、、
  • 純正写真アプリ
    画面が大きくなったことで、より細かくきれいに見れるようになった。特に人に見せるとき、iPod touchでは画面が小さく、出来ればPCの高解像度画面で見て欲しいときがあると思う。そのような場合に、さっと相手に渡して操作させることの出来るiPadはとても良いと思う。
  • 純正ビデオアプリ
    今回購入したのは16Gモデルなので、音楽を入れてとか、動画を入れてとかは余り考えていなかった。いつも家で動画を見るときは、主にDLNAを使ってPS3で見ている。やはり洋画などはこの方式で見た方が、映像もきれいだし、音も5.1chのAVアンプで再生されるので良い。純正ビデオアプリではDLNAは再生できないが、他のアプリを使って、主にアニメ等、映像も音もそこそこ見れれば良い場合など、ソファーにごろんと座ってDLNA経由でiPadで再生するようにすると、ファイルの一元管理も出来るし、意外と快適だった。
  • 純正iPodアプリ
    iPod touchがあるので、さすがに使っていない。少し試して見たところ、よりiTunesに近いようなインターフェースになっているように感じる。アルバムアートワークがとても大きく表示されるので、iPod touch用に用意した解像度の低い画像では粗く表示されるじゃないかと思う(ここは試してない)。
  • Webブラウザ(Safari)
    ブラウザは基本的に画面が大きくなっただけだろうか。個人的には別画面への移動や、画面を閉じるのが意外と面倒で、リンクを行ったり来たりするのに時間がかかるのを何とかして欲しい。あとiGoogle使ってると別画面に移動して戻ったときに再読み込みがかかるような挙動になるのを何とかして欲しいところ。Safari5からは拡張機能が使えるようになるという話なので期待。
  • 電子書籍
    画面が大きくなった分とても見やすい。ただ雑誌のようなA4サイズを拡大縮小なしで読もうとすると少し厳しい場合がある。拡大縮小しながら読むのはめんどくさい。
    また液晶の品質は良くも悪くもiPod touchと同じように感じる。自分の場合この液晶を長時間見ていると目が若干ちかちかして集中して読めなかったり、目が疲れたりする。この原因(推測)としては、画素が粗くドットが見える、液晶が手前のガラス面より少し奥まったところにあり、手前のガラスの写り込みと液晶面がずれる、iPadのような端末は画面を近くで見る為右目と左目で感じる輝度に違いがある。これらの原因で焦点を合わせずらくなり、結果目が疲れるんじゃないかと考えている。
    ホリエモンやその他の人達が、携帯やパソコンなど、みんなずっと液晶見てるんだから、目が疲れるなんて事はないと言ってたりするが、確かに自分も一日中PCの液晶を見ているがそう疲れを感じることはない。なのでiPadやiPod touchはこれらとはまた違うように思う。ただ次期iPhone4の液晶は凄く良さそうだ。期待。
    写真 
  • Bluetoothキーボードが使える
    今この文章の下書きはiPadに接続したBluetoothキーボードで書いているが、意外と快適。使っているキーボードは以前Windows Mobileに接続して使っていた変則配置のキー四段しかない折りたたみ式のキーボード(iGo Ultra-Slim Keyboard)。ソフトウェア(ディスプレイ)キーボードについては、慣れればそこそこ入力できるかもしれないが、今のところはそこまではためしていない。少し使ってみた感じ、画面の上に手を乗せると手が邪魔になってしまいキーが見えなくなり、また通常のキーボードとは配置が違うので、ブラインドタッチが出来ないので、結構ストレスが溜まる。慣れてブラインドタッチが出来るようになればそこそこ快適になるかも知れない。また、ソフトウェア(ディスプレイ)キーボードが意外と不便に感じるのは横画面だと画面の半分近くがキーボードで埋まってしまうこと。
    Bluetoothキーボードについては、iOS4でiPod touchでも使えるようになるかもしれない。
    DSCN1606
  • ファイルの連携が出来る。
    iPod touchではzipファイルが添付されてきた場合などどうしようもなかったが(多分)、これがiPadでは特定の関連したプログラムにファイルを渡せるようになった。これにより、zipファイルを添付されてきた場合でもGood Readerなどのアプリにファイルを渡し展開し、閲覧することが可能になった。また、Good Readerからほかのアプリにファイルをコピーして開くというようなことも可能になった。

Kindleとの比較

  • 重さ・大きさ
    まず最初に持って見た感じ「重い!」。Kindleが289グラムに対して、iPadは680グラムもありずっしりしている。これはある程度最初から予想はしていた。よくノートPCと比較して軽いと言われるが、やはりKindleや普通の本と比較すると重く感じる。またiPadは形状的に片手では持ちにくい形をしている。片手で持とうとすると淵の部分をつかむ感じになり、この持ち方だと回転方向にテコの原理が働き意外と握力がいる。Kindleはもともと軽いのもあるが、下にキーボード部分があり、その上のスペースの辺りを掴むと自然な感じで掴める。また横幅が13.5cmなので手の幅に収まりガシッと片手で掴める。
    また今回はApple純正のケースを使用しているが、これが意外と重く合計すると874グラムもある。正直重くて参ったが、他の背面につけるタイプのケースも100グラム程度あるのと、純正ケースの場合ふちの部分に引っ掛かりが出来、若干持ちやすくなるので、まぁ良いかなということにした。
    DSCN1623
    DSCN1607 
  • 見やすさ
    総合的に見れば、iPadの方が上だろう。ただKindleの方が手軽な場合があり、これは例えば、白黒でKindleの画面に1ページが収まるような、文庫本サイズや文字の大きい本など、また自分の場合、Kindleの方が目との相性がよいのでKindleで読めるものはKindleで読むスタイルにした。

Flybook(8.9inch液晶 コンパーチブル型タブレットPC Windows7)との比較

DSCN1299

  • ブラウザ(Safari)はいまいち
    やはりPCのChromeやFirefoxのブラウザと比較すると物足りない。拡張機能が使えないためAutoPagerのような拡張機能や、タブの使いやすさなど不満が残る。Windows7(Vista)のタッチパネルの場合、8方向のフリック(指をはじく操作)に機能を割り当てることが出来、これにそれぞれ、戻る、進む、ページスクロール、ページを閉じる、拡大、縮小などを割り当てて操作していたが、これはこれで快適だった。
  • IMEが頭悪い。
    時々閉口する。我慢すれば何とか使えるレベル。
  • 電子書籍
    WindowsでPDFを見ようとすると、主にAdobe Readerを使うと思うが、タブレットで操作した場合これの操作性が悪いこと、、正直スペックが下(多分)のiPadでこれだけなめらかに操作できるのに。iPad(Apple)を見習って欲しいところ。
    ただ、PCの場合Windows SearchでPDFの横断検索が出来るため、まだまだ捨てられない。なのでiPadは電子書籍を読むことには向いているが、電子書籍から何かを探そうとするのには全然向いていない。
  • バッテリーが持つ
    バッテリーが凄くもつのはとても良い。一日の使用であれば気にすることは無いと思う。ただ、寝るときに充電し忘れると、通常のUSBポートではスリープ状態にしないと充電できないし、スリープにしたとしても、満充電までは凄く時間がかかる。これは通常のUSBポートでは5Aまでしか電流が流せないためで、よくUSB HDD等に付いている、USBを2つのポートを占有して電源を確保するケーブルがあるが、あれのiPad版は発売されないだろうか。
  • 使いやすさ
    WindowsはWindows7になって大分改善されたが、元々タブレット用には作られていないため、やはり使いにくい。また、ハードウェアの使いやすさとして、車の中で使ったりする場合、iPadであればダッシュボードの上にぽんと置いておいたり、運転席でハンドルが邪魔でも操作できたりするが、ノートPCの場合ダッシュボードに置いておくのは何かと気を遣うし、運転席側でキーボードを打って操作するというのは厳しい。

2010年5月20日木曜日

Doctrine 関係リンク集

次のプロジェクトはDoctrineでいくことにしたのでメモ。
Doctrine2ではマジックメソッド(findBy~)が使えなくなるらしいし、そもそも処理が重いらしいので開発では使わないことにした。

初級編

上級編

2010年3月25日木曜日

symfony 1.4 + Propel 1.4 でメモリリーク?

さて、以前とあるWebサービスをsymfony 1.0からsymfony 1.4へアップデートを行ったが、バックエンドのバッチ処理は1.0のまま稼働させていた。また、とある事情でこのWebサービスを整理する必要があったため、バッチ処理の1.4化を行っていた。

いくつか、1.4化のための作業(ログ関係とヘルパー関係の修正等)を行いバッチ処理を開始!様子を見ていると1.0時代より非常に時間がかかる。さらに待っていると、良くあるメモリが足りないよ!というFatal Errorで死亡してしまった。あれ-、、と思いつつメモリの様子を見て見ると・・・

memory_leak

美しすぎるメモリリークの図

メモリリークしてる!あーこんな情報前に何処かで見たなと思いつつ検索してみるも発見できず、、

仕方ないのでソースコードを少しずつ実行して原因となる場所の特定をする。複数箇所で起きているようで、どうもPropelのオブジェクトを生成するときにリークするようだった。

この時点でもしかしたらリークしているわけではなく、なんらかのキャッシュ機構が働いているのかもなぁ、と思い検索して見るも発見できず。グーグルで「Propel 1.4」で検索するとこのブログが上から三番目に出てくるという、情報のなさっぷりを嘆く。

ここまでくるとソースを見るしかない。オブジェクトの生成部をたどっていくと、Propelが自動生成したBaseDataSourcePeer.phpで以下のようなソースを見つけた。

	public static function populateObjects(PDOStatement $stmt)
	{
		$results = array();
	
		// set the class once to avoid overhead in the loop
		$cls = DataSourcePeer::getOMClass(false);
		// populate the object(s)
		while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
 			$key = DataSourcePeer::getPrimaryKeyHashFromRow($row, 0);
 			if (null !== ($obj = DataSourcePeer::getInstanceFromPool($key))) {
 				// We no longer rehydrate the object, since this can cause data loss.
 				// See http://propel.phpdb.org/trac/ticket/509
 				// $obj->hydrate($row, 0, true); // rehydrate
 				$results[] = $obj;
 			} else {
				$obj = new $cls();
				$obj->hydrate($row);
				$results[] = $obj;
        DataSourcePeer::addInstanceToPool($obj, $key);
 			} // if key exists
		}
		$stmt->closeCursor();
		return $results;
	}

注目して欲しいのはDataSourcePeer::addInstanceToPoolというメソッドで、名前からして、キャッシュしてますよ!という香りが漂ってくる。試しにPropel1.2で生成したモデルと比較してみると、1.2移行のバージョンで新しく追加されたことがわかった。また上記メソッドを使用している部分を全てコメントアウトしてみると、メモリが異常に消費されることは無くなった。

さてここまでわかれば、検索でさらにキーワードを絞ることが出来る。再度検索してみると、原因はdatabases.ymlでpooling:trueと設定していることであった!(参考)databases.ymlに書いてあるあたり基本中の基本だ!何となく、へーpoolingするんだ?速そうだからtrueにしとけ、的な感覚でtrueにしたのを思い出した、、

まとめ

マニュアルはちゃんと読もう。

少し追記。場合によっては、オブジェクトをプールした方が高速になる場合があるのはわかる。しかし自動でORMで処理してしまうのは費用対効果(メモリ消費とCPU・ディスク負荷の軽減)を考えるとあまり良い方法ではないように思う。今Propel1.4で実装されているような処理では、私が遭遇したような問題が起こるかも知れないし、キャッシュヒット率を考えると、ヒット率が良いと考えられる場合はアプリーケーションレベルで都度実装した方が多くの場合よりよいだろう。

また単純に何も考えずにアプリケーションを実装した場合、今回のようなオブジェクトプールにメモリを回すよりはDBにメモリを回した方がより効果は得られるだろう。なぜなら、各種DBはメモリをより効率的に使うため極限まで最適化され、常に開発が続けられているからである。またPHPのプロセスと違い常に起動しているものなのでよく使われるデータのみをキャッシュするなど最適化もしやすい。例外的にCPU負荷がとても高く、メモリが余っておりオブジェクト生成がボトルネックになっているような場合はオブジェクトプールをtrueにしても良いと思う。

2010年3月19日金曜日

Google App Engine + Windows

  • dev_appserver.py すると HTTPSHandlerがないよって言われる。
    ActivePythonのx64版をインストールしているならx86版をインストールする。
  • 公式のチュートリアルを一通りやる。
  • 本番にアップしようとappcfg.py updateをするとSSLモジュールがないよって言われる。
  • http://pypi.python.org/pypi/ssl をインストールしてねって言われるので、ダウンロードして
    python setup.py install
    するとこのPythonはVisual Studio 2003でビルドされてるよ!Visual Studioでコンパイルするかcygwinでためしてね!っていわれる。
  • しかたないのでcygwin版でやってみる。すでにpython2.5がインストールされていた。
  • ActivePythonはとりあえずアンインストールする。
  • cygwin版pythonで
    python setup.py install
    すると成功した。
  • appcfg.py updateも成功して無事本番にアップ完了した
    http://hanger35.appspot.com/

まとめ

Google App Engineを使うときはcygwin版pythonを使おう。

2010年3月4日木曜日

symfony1.0 から symfony1.4 への移行メモ

メモ書きなので品質低
まずsymfony1.0を1.1にアップグレードプロジェクトを1.2から1.3/1.4にアップグレードする1.3の廃止予定および削除される機能に目を通す。バージョンが違うが参考になると思う。翻訳して頂いた方々に感謝。
OpenPNE プラグイン開発者のみなさんにsymfony1.4 対応のお願いもちょっと参考になる。

pluginが読み込まれない

symfony1.4では一つ一つ手動でconfig/ProjectConfiguration.class.phpに設定する必要がある。
Symfony tutorial参照

また、フォルダの名前を何とかPluginにする必要がある。1.0はplugins/testのような名前でも大丈夫だったが、ソースを見た感じplugins/testPluginのように、Pluginという文字がフォルダに付いてないと認識しない。

Propel

PropelはPrope1.2.1-devlからPropel1.4にバージョンが上がっている。

1.4ではDB抽象化レイヤに使っていたCreoleをやめて、PDOを使うようになっているので、PDOのExtensionをインストールする。config/databases.ymlはdsnという項目が追加されている。generate:projectしたときに作成されているサンプルを参考にdsn形式で書く。

クエリを直で実行したいときに使う、Propel::getConnection()で帰ってくるインスタンスが、以前のCreoleのインスタンスからPropelPDOと変更になっているのでこれに依存してるコードはエラーになる。自分のコードの場合、ExecuteQueryみたいな関数を用意していたので、とりあえずNextやgetRow関数等を実装したアダプタを間に挟んで返すようにして対応した。また、build-modelで自動生成したモデルの何とかPeerクラスのdoSelectRSはなくなり、代わりにdoSelectStmtが追加されている。他ORM経由でクエリを処理する場合はいまのところ特に問題ないと思う。

稼働中のDBからモデルを再生成する。propelのDB設定ファイルconfig/propel.iniは1.0のものをそのままコピーしてもbuild-model時にエラーになるので、公式ページを参照して再設定する。 
symfony propel:build-schema --xml
symfony propel:build-model
以前のバージョンのPropelでもbuild-schema時に生成されるschema.xmlをそのままbuild-modelしようとするとエラーに成る場合があるが、今回のバージョンでもやはり直ってないようだ。DBはMySQL。その場合、schema.xmlのDATEやTIMESTAMPのdefault=””を削除したり、CURRENT_TIMESTAMPとあるところを'0000-00-00 00:00:00'とすると直るかも知れない。

TEXTで定義したフィールドは自分の環境だとCHARSETをbinaryにしているためか、propel:build-schemaで自動生成した場合BLOBになってしまっている。その場合Propel1.2.1-devの時は問題なかったが、単純に->getFieldName()とした場合リソースが返されるだけで、値が取得できなくなっている。その場合fgets( $resouce )等すれば取得できが、今回はbuild-schema --xml時に生成されるXMLを編集して、type=”BLOB”と成っているところを、type=”LONGVARCHAR”と変更して対応した。

web debugツールバーで実行したクエリを表示するにはログを取る必要がある。ログを取る場合は、databases.ymlでDebugPDOを指定する。

Propel1.4の新機能については下記のブログが参考になる。
Propel 1.4のWhatsNewの超訳

フォーム・バリデータ関係

1.0でのvalidater.ymlやhandleErrorメソッドなどのVlidate処理は、sfForm関に吸収されたような形になっている。

このあたりは気合いを入れて書き直すしかないと思う。フォームが多いシステムの場合移行に際して一番大変になると思う。sfFormはなれれば割と使いやすいと思うが癖が強い。ただフォーム処理なんて言うのは大体こういうものなので気にしないこととする。自分の場合表示には使わずバリデータにしかつかっていない。フォームをプログラムで自動生成するのはデザインとの関係もあるので余り好きではない。

ビュー関係

component slotを使用していて、ビューをmodule.ymlで変更しているとき、別のモジュールから他のモジュールのcomponent slotを呼ぶとビューの変更が適用されず、デフォルトのsfViewPartialで実行されエラーになる。この辺の設定はモジュールごとに設定されているためだが、カレントのモジュールの設定しか読み込まれないためエラーになる。仕方ないのであまり良い方法とは思えないが、defaultモジュールを別途設定するために適当な場所に下記のコードを入れて対応した
sfConfig::set('mod_default_view_class','hrPHPTAL');
sfConfig::set('mod_default_partial_view_class','hrPHPTAL');

また、デフォルトのビュー(sfPHPView)を使用している場合、デフォルトで自動的にエスケープされるよう修正されているので修正する必要がある。

 

ルーティング関係

クラス構成やメソッドが大きく変わっているため、依存しているコードがあれば作り直しが必要になる。大体代わりの機能は用意されているので頑張って書き換える。

YAML関係

YAMLのパーサがSPYCからsfYAMLとなり、YAML1.2の仕様となった。大きな変更点として、offやnoは文字列として扱われるようになり、修正が必要になる。一部symfony側でoffやnoの場合でも、偽となるよう処理されているところもあるが、cache.ymlでoffと指定しているのにキャッシュされてしまうなどの問題もあったので、offやnoは全部falseに書き換え、onやyesはtrueに書き換えた。
またSPYCで通っていたものがsfYamlでエラーになる。
自分のパターンでは、正規表現を指定する部分で、例えば、 type: [a-z]{1,3}と指定しているとエラーで、これをtype: “[a-z]{1,3}”と指定してやれば問題なくなった。{}はYAMLでは連想配列を指定するのに使うので微妙な扱いの変更だと思う。

キャッシュ関係

CacheHelperについては以前書いたのでこちらを参照。

アクションキャッシュについては、sfViewCacheManager->setSuffix()(違うかも)が無くなってしまったため、ログインが必要なページでログイン前とログイン後で別々のキャッシュファイルを生成するようにしていが、それが出来なくなってしまった。そのため別途FileCacheクラスを作成して対応した。

まとめ

今回symofny1.4へ移行した理由は、symfony1.0のサポートが切れ、今後も長く続くプロジェクトでシステムの拡張・修正が必要だったため。Propel関係はうまくやれば修正にそれほど時間はかからないが、フォームの修正、キャッシュ関係の修正、動作確認にかなりの時間が必要だった。特に理由がない限り既存のプロジェクトをsymfony1.4に移行するのはあまりオススメできない。
そういえば上記には書いていなかったが、admin generatorも移行に相当時間が必要そうだったため、symfony1.0のまま運用してお茶を濁している、、これも追々移行したい。

2010年2月18日木曜日

symfony 1.4 CacheHelper(cache関数) のその後

前回のまとめ

symfony 1.4のCacheHelperには余分なキャッシュを保存してしまう問題がある(多分)。sfViewCacheManagerのソースを見た感じでは、module名とaction名のみを基準にキャッシュ管理をしており、独自の内部URI(default/indexのような)をもたないcacheは制御が行えず、action cacheも同時に保存してしまうような仕様になっている。

対策

結局別にCacheHelperを作成する事で対応した。元々symfony 1.0の時からCacheHelperでは対応できない機能があったので、別途CacheHelperを作成して対応していた。

ソース github ライセンスはMIT

追加した機能は

  1. 前回のブログで書いた余分なキャッシュを保存しないようにした。
  2. 別途引数にinternalURIを追加して、複数のページで同一のキャッシュを使用できるようにした。
  3. すでにキャッシュ済みか調べるための関数の追加した。

使い方

  • cache関数の代わりにhr_cache関数を使用する。
  • cache_save関数の代わりにhr_cache_save関数を使用する。
  • hr_is_cached()関数はactionですでにキャッシュ中か調べて余分な処理を行わないようにするようなときに使用する。hr_is_cachedを実行した際の結果はstatic変数に保存され、その後hr_cacheが使用されたときと結果が同じになるよう保証する。(実行されるタイミングが異なるため、lifetimeが切れて結果が異なる場合があるため)
  • 第三引数のinternaURIは例えば、URIが値を取る場合、’default/index?a=123’と’default/index?a=abc’では別のキャッシュが保存されるが、internalURIに’default/index’と指定することで共通のキャッシュが使用される。

効果

  • ディスク領域の節約になる。
  • internalURIを適切に設定するとキャッシュヒット率が上がり各種負荷が下がる。

本来であれば、componentを使えば良いが、componentを使うとtemplateファイルが分離され、設定も多少煩雑になるため、自分の場合どちらかというとCacheHelperを好んで使っている場合が多い。

ただ、殆どの場合通常のCacheHelperで問題はないと思う。効果があるのはページ数が数万~数十万単位あるサイトで、キャッシュ書き込みによりディスク負荷があがり、キャッシュファイルの増大によって(Linux等のOSの)ページキャッシュが圧迫されパフォーマンスが急激に低下するような場合それなりの効果があると思う。

2010年2月12日金曜日

symfony 1.4.1 fragment cache(cache関数)のよくわからない挙動について

 

テスト用のapp testを追加

symfony generate:app test
symfony generate:module test default

apps/test/config/settings.ymlのprodにcache:true追加。apps/test/modules/default/actions/actions.class.phpのexecuteindexをreturn sfView::SUCCESS;に書き換え。

1 この状態でアクセスしてみる。

ブラウザで/test.php/を開く。

キャッシュされたファイルを調べる。
find cache/test/prod/template/ -type f

(何も表示されない)

2 indexSuccess.phpでfragment cacheを使って見る。

例えばapps/test/modules/default/templates/indexSuccess.phpを下記の内容にする。

<?php if( !cache('cachename', 600) ):?> 
cache time - <?php echo date('Y-m-d H:i:s')?> 
<?php cache_save()?> 
<?php endif;?>

ブラウザで/test.php/を開く。

キャッシュされたファイルを調べる。
find cache/test/prod/template/ -type f

cache/test/prod/template/localhost/all/default/index/_sf_cache_key/cachename.cache - これは良いとして、、
cache/test/prod/template/localhost/all/default/index.cache - これは何?

 

3 GETで値を投げてみる。

ブラウザで/test.php/?a=1を開いてみる。
ブラウザで/test.php/?a=2を開いてみる。

キャッシュされたファイルを調べる。
find cache/test/prod/template/ -type f

cache/test/prod/template/localhost/all/default/index/_sf_cache_key/cachename.cache
cache/test/prod/template/localhost/all/default/index/a/1.cache - 増えてる!
cache/test/prod/template/localhost/all/default/index/a/2.cache - 増えてる!
cache/test/prod/template/localhost/all/default/index.cache


4 まとめ

もしかしたら根本的に勘違いをしているのかも。そもそも1.4だとhttp://www.symfony-project.org/jobeet/1_4/Propel/ja/21 に特にcache関数の説明がないからサポートしてない?

追記 1

symfony 1.0で同じ事をすると、
cache/test/prod/template/localhost/all/test.php/symfony/index/_sf_cache_key/cachename.cache
というファイルしかできない。個人的にはこれが理想。
現状だと、symfony1.4の挙動が仕様なのか、バグなのわからない。

cache()関数使用後に、sfViewCacheManager->isCachable(‘default/index’)するとこれがtrueを返す。symfony1.0だとそもそもcache()関数後(action実行後)にisCachableは呼び出されない。lazy_cache_key(ビューキャッシュのために遅延キャッシュキージェネレーション)の関係で後から呼び出されるのかもしれない。lazy_cache_keyの意味はわからないが、、

追記2

今のsfViewCacheManagerだと、複数回cache関数を実行すると一番最後に実行したcache()関数のlifetimeでdefault/indexのキャッシュが作成される。これは仕様としてどうなのか。(注:後から気付いたがこれは間違い)

プログラムを見た感じ、moduleとactionでisCachableを切り分けていて、cache関数を実行すると、currentのmoduleとactionでcacheがonになり、actionがキャッシュされてしまう。

追記3

sfCacheFilterのexecute()を$filterChain->execute();return;としてもキャッシュが生成される。どのタイミングで生成してるんだろう。余分に作られている(と思っている)キャッシュはactionキャッシュと同じものだが、上記のテストの方法で作った場合default/indexのcacheはenabled:falseになるので、sfCacheFilterがキャッシュチェック時(sfExecutionFilterの実行前)にはisCachableはfalseとなり、キャッシュを使用することはないし作ることに意味がないように見える。

追記4

sfFileCache::write()で書き込み状態を調べてみると、余分に作られている(と思っている)キャッシュは、ブラウザでリロードするたびに書き込まれる、、

追記5

余分に作られている(と思っている)キャッシュは、最終的にsfPHPView::render()の、
$content = $viewCache->setActionCache($uri, $content, $this->isDecorator() ? $this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate() : false);
上記の部分で書き込まれている。setActionCache()はソースを見た感じ、そのアクションがisCacheableでwithLayoutの場合のみキャッシュとして保存するようになっている。本来であれば、cache.ymlで特にenabled: trueとしているわけでもないので、キャッシュとして保存されるはずはないが、cache関数を実行した時に実行されるaddCache関数がactionキャッシュのキャッシュ情報を上書きするような動作になっており、action cacheも保存ししまっているように見える。

 

全体的に見た感じバグっぽいが、、対応は後日検討。新たにcache関数の代わりのヘルパーを作るか、sfViewCacheManagerの動作を変えるか、sfPHPViewの動作を変えるかして対応することにする。

追記6

cache.ymlにてdefault/indexをenabled:trueを指定した場合cache/test/prod/config/module_default_config_cache.yml.phpに下記の内容が追加される。

$this->addCache($moduleName, 'index', array('withLayout' => false, 'lifeTime' => 600, 'clientLifeTime' => 600, 'contextual' => false, 'vary' => array ()));

ヘルパーのcache関数を実行した場合、下記のような内容が実行される。

$cache->addCache($params['module'], $params['action'], array('withLayout' => false, 'lifeTime' => $lifeTime, 'clientLifeTime' => $lifeTime, 'vary' => $vary));

この場合両者とも、module = default, action = index,となるため、cache関数を実行した場合もcache/indexをenable:trueとした場合と同じになり、default/indexのaction cacheが保存される事になる。

 

まとめ2

sfViewCacheManagerのソースを見た感じでは、module名とaction名のみを基準にキャッシュ管理をしており、独自の内部URI(default/indexのような)をもたないcacheは制御が行えず、action cacheも同時に保存してしまうような仕様なのかも知れない。
ただキャッシュファイルは保存されるが、sfCacheFilter実行時にはまだcacheヘルパーは実行されておらず、addCacheされていないためそのキャッシュファイルは使用されない。ようするにキャッシュファイルがあってもsfExecutionFilterは実行されるし、保存されたaction cacheは特に意味はない。

対策!

現状1.0から1.4へ移行しようとしているサイトは、1.0で運用している現在のキャッシュファイルだけでも数十ギガあるため、このまま1.4に置き換えるとそれだけでさらにキャッシュファイルのサイズが数倍になってしまうことが予想される。

対策として、CacheHelperの動作を変更した。ソースは後日アップ予定。

2010年1月21日木曜日

twitterでキーワードを検索して、その結果を出力するPHPスクリプト

<?php  
$keyword = 'ソフトバンク';  
$query = 'http://search.twitter.com/search?q='.urlencode($keyword);  
$dom = new DomDocument('1.0','UTF-8');  
@$dom->loadHTML( file_get_contents( $query ) );  
$xpath = new DomXPath( $dom );  
foreach( $xpath->query('///span[@class="msgtxt ja"]') as $element ){  
 echo $element->nodeValue."\n\n";  
} 

2010年1月20日水曜日

DELL PowerEdge 2970にdebian lennyでLAMP(Linux Apache PHP MySQL)設定メモ

主に自分用なので読みにくいのはごめんなさい。また下記の設定だけで設定終了というものではありません。

サーバスペック

メモリ16G Six Core Opteron 2.2GHz x 2 SAS 146G 3.5inch 15000rpm x 2 (RAID 1) X25-E 64G x 2 SATA 1T 3.5inch 7600rpm x 2(RAID 1) X25-EとSATA 1Tは後付けした。3.5inchのHDDを選択した場合、もともとSASx6のバックプレーンが付いているので、そこにSAS-SATA変換ケーブルでSATAのHDDをつないだ。この場合、BIOS画面でバックプレーンにケーブルが刺さってないとエラーが表示され、この状態だとIPMIの設定画面にいけなくなるので注意する。X25-EはSSDのためハードウェア障害はないものとしてRAID 1の設定はしていない。ただ、何らかの原因で壊れることも予想されるので、予備にもう一つつけてある。SATA 1Tはデータ保存用。

ディスク、パーティションの設定など

全HDDでLVMを設定。その上でSAS 146Gはext3。X25-Eはxfs。SATA 1Tはext3で設定。RAIDコントローラにバッテリーが付いているので、より高速化させるためにext3はdata=writeback、xfsはnobarrierでマウント。

各ディスクのスケジューラがデフォルトでcfqになっているので全てdeadlineに変更。HDDはデフォルトのキューサイズが128になっているので1024に変更。SSDはデフォルトのまま。 echo deadline > /sys/block/sda/queue/scheduler echo 1024 > /sys/block/sda/queue/nr_requests

Xen

前書いたDebian GNU/Linux 5.0(Lenny)でのXenの設定メモを参照

DELL OMSA、IPMI関係

IPMIでSOL(Serial Over LAN)の設定。ネットワーク越しにBIOSの操作ができたりする。
BIOSで以下の値を設定。 Serial Communication を On with Console Redirection via COM2 External Serial Connector を COM2 Failsafe Baud Rate を 57600

BIOSでIPMIを有効にして静的IPアドレスを割り振る。パスワードは記号を使うとうまく認証できない場合があった(DELL SC1435とか、、)ので、最初はアルファベットだけのほうが無難かも。

ここまでの設定で、ipmitoolからsolでBIOSの設定が出来るようになる。実験するにはサーバ再起動直後にipmitoolからsolでつないでみる。さらにipmitoolのsolからLinuxのログインコンソールまで表示させるには

/boot/grub/menu.listのXen以外のkernel行の後ろに、rhgb console=tty console=tty console=ttyS1,57600n8を追記。 Xenをインストールしたり、カーネルのアップデートをしたりすると消えるので注意。 後はdebianインストール後/etc/inittabに下記の行を追加。 co:2345:respawn:/sbin/getty 57600 ttyS1 vt100-nav これでipmitoolからsolを使ってログインすることが出来る。Xenカーネルについては設定が面倒そうなのでやり方を追求していない。緊急時はとりあえず通常カーネルが動けば良いのでよしとする。ipmitoolのsolはよくSegmentation faultするので、した場合、一回deactivateしてからactivateする。solから抜けるには~.と入力する。

debian設定関係
公開鍵の設定 wget http://ftp.sara.nl/debian_sara.asc apt-key add debian_sara.asc /etc/apt/sources.listに追加 deb ftp://ftp.sara.nl/pub/sara-omsa dell sara 時間帯によっては重くてアクセス出来ないため注意。 apt-get update apt-get install dellomsa apt-get install ipmitool これで各種ハードウェアの状況を確認するための、omreportとipmitoolコマンドが使える。 omreport chassis ipmitool sesnor nagiosやcactiで監視するときは以下のスクリプトを使用する。

- omreport chassisのOKを数える。/etc/snmp/omreport.sh #!/bin/sh omreport chassis | awk '/^Ok/ {LINE+=1} END{print LINE}'

- 指定した項目の値(Sensor Reading)を取得する。/etc/snmp/ipmi.sh #!/bin/sh /usr/bin/ipmitool sdr get "$@" | grep 'Sensor Reading' | awk '{ print $4 }'

SNMP(XenのホストOS上での設定)

apt-get install snmpd /etc/default/snmpd の127.0.0.1を削除(ローカルからのみのアクセス制限) /etc/snmp/snmpd com2secのpublic行をコメントアウトして、private行のコメントアウトを解除。ファイヤーウォールは適切に設定すること。 disk / 10000 のコメントアウトを解除。

omreportやipmitoolの設定をして、外部から値をとれるようにする。下記サンプル。/etc/snmp/snmpd.confに追記。 extend .1.3.6.1.4.1.2021.54 Temp /etc/snmp/ipmi.sh 'Temp' extend .1.3.6.1.4.1.2021.55 Temp /etc/snmp/ipmi.sh 'Ambient Temp' extend .1.3.6.1.4.1.2021.60 FAN /etc/snmp/ipmi.sh 'FAN 1 RPM' extend .1.3.6.1.4.1.2021.61 FAN /etc/snmp/ipmi.sh 'FAN 2 RPM' extend .1.3.6.1.4.1.2021.62 FAN /etc/snmp/ipmi.sh 'FAN 3 RPM' extend .1.3.6.1.4.1.2021.63 FAN /etc/snmp/ipmi.sh 'FAN 4 RPM' extend .1.3.6.1.4.1.2021.70 DELL_OMSA /etc/snmp/omreport.sh

MySQL関係(XenのゲストOS上での設定)

今までTritonnを使用してきたがMySQLのバージョンが古くなってきたため、最新が使いたいのものあり、MySQL最新版とTritonnを併用することにした。

MySQL最新版インストール

MySQL5.5最新版ダウンロード 解凍後、/usr/local/mysqlに移動。 support-filesコピー cp support-files/myなんとか.cnf /etc/mysql/my.cnf cp support-files/mysql.server /etc/init.d/mysql

必要に応じてDB初期化 cd /usr/local/mysql; ./bin/mysql-install-db –-user=mysql /etc/init.d/mysqlを編集 basedir=/usr/local/mysql datadir=/var/lib/mysql startの処理をしているところの、$bindir/mysqld_safe の直後に—defaults-file=/etc/mysql/my.cnfを足す。- あと何故か/etc/init.d/mysql stopがエラーになるので、 /etc/init.d/mysqlのstopの処理をしているところの、 if (kill -9 $mysqld_pid 2>/dev/null) を if trueに置き換える どうもkill –9 $mysqld_pidするとmysqlのpidが変わってその後のkillがうまくいってないようだ。原因不明。

ユーザ、グループの追加 /usr/sbin/groupadd mysql /usr/sbin/useradd -g mysql mysql データベース初期化 scripts/mysql_install_db --user=mysql cp -a data /var/lib/mysql /etc/init.d/mysql startで起動。 特に問題なければサービスとして登録して、自動起動させる。 update-rc.d –f mysql defaults
Tritonn最新版インストール

Tritonnは通常ポート3306のところを、3307にして起動する。

Tritonn最新版ダウンロード 解凍後、/usr/local/tritonnに移動。

support-filesコピー cp support-files/myなんとか.cnf /etc/mysql/tritonn.cnf cp support-files/mysql.server /etc/init.d/tritonn

必要に応じてDB初期化 cd /usr/local/tritonn; ./bin/mysql-install-db –-user=mysql ※/usr/local/mysql以外の場合mecabが正しく動かないため下記の操作が必要。 cp –a /usr/local/tritonn/etc/ /usr/local/mysql/etc/ cp –a /usr/local/tritonn/lib/mecab/ /usr/local/mysql/lib/mecab/ /etc/init.d/tritonnを編集 basedir=/usr/local/tritonn datadir=/var/lib/tritonn startの処理をしているところの、$bindir/mysqld_safe を書き換え./bin/mysqld_safe —defaults-file=/etc/mysql/tritonn.cnfにする。 その直前の行に、cd $basedirを足す。こうするとmecabにパスが通るようになる。

/etc/mysql/tritonn.cnfを編集 portを3307に。socketを/var/run/mysqld/tritonnd.sockに修正 /etc/init.d/tritonn startで起動。 問題があれば、起動時のオプションに—senna-log –senna-log-level=DEBUGを追加して、様子を見る。

特に問題なければサービスとして登録して、自動起動させる。 update-rc.d –f tritonn defaults

Apache関係(XenのゲストOS)

今回はコンテンツ配信用とプログラム処理用にApacheのインスタンス二つを一台のサーバ上で起動するように設定する。コンテンツ配信用はapache2lightとし、プログラム配信用のポート番号は8080とする。二つに分ける理由は、同時アクセス数が極端に増えた場合に、プログラム処理用のインスタンスだけではmod_phpでメモリが大量に消費され効率よく同時アクセス数を増やせないため。

Apache2台構成設定

apt-get install apache2

cp –a /etc/apache2 /etc/apache2light cp –a /etc/init.d/apache2 /etc/init.d/apache2light

/etc/apache2/ports.confのポート番号を8080にする。 /etc/apache2/sites-available/defaultのポート番号を8080にする。

/etc/apache2light/apache2.confの/etc/apache2/のパスを/etc/apache2light/に置換する。Pidファイルを/var/run/apache2light.pidとする。

/etc/apache2light/envvarsのPidファイルを/var/run/apache2light.pidとする。

/etc/init.d/apache2lightの/etc/apache2/のパスを/etc/apache2light/に置換する。$APACHE2CTLでconfigtest以外のコマンドを実行している行を、$APACHE2CTL –k コマンド名 –f /etc/apache2light/apache2.confに修正する。

起動テスト等行ってみて、特に問題がなければ、 update-rc.d –f apache2light defaults

Apache設定(プログラム処理用)

主にプログラム処理用。KeepAliveをオフにする。

mod_statusを入れる。ExtendedStatusをOnにする。 mod_deflateを切る(PHPが処理するため) mod_rpafを入れる(リバースプロキシを使った際の環境変数HTTP_HOSTの自動書き換え) mod_php5を入れる。 mod_rewriteを入れる。

Apache Light設定(コンテンツ配信用)

主にコンテンツ配信用。こっちはKeepAliveをオン。PHPの処理はプログラム処理用のApacheに投げる。動的に作成した画像などは最初だけプログラム処理用にアクセスし、その後はコンテンツ配信用から生成されたキャッシュを送る。キャッシュ機構自体はPHPのフレームワークSymfonyのものを使い、Apacheのモジュールは使わない。キャッシュフォルダにすでに画像が作られていれば、プログラム配信用にアクセスせずにその画像を送るというような設定にする。

mod_statusを入れる。ExtendStatusをOnにする。 mod_deflateを切る(PHPで処理するため) mod_expireを入れる(cssや画像などに適切にExpireを入れる。YSlowやPage Speedで見ながら調節する) mod_rewiteを入れる。
Apache二台体制の考察

現在すでに本稼働中で、その様子を。 コンテンツ配信用はサーバは17.9リクエスト/秒、プログラム処理用は8.73/秒となっている(ピーク時はこれの二倍ぐらい)。ただ処理中のプロセス数は、プログラム処理用はKeep AliveをOFFにすることにより、プログラム処理用はコンテンツ配信用の1/5程度のプロセス数しかない。 http://d.hatena.ne.jp/naoya/20080212/1202830671 また上記ブログを参考に、各Apacheプロセスの消費メモリは下記の通り。 # ./apache_shared_memory_size.sh PID RSS SHARED 22825 63028 35756 (56%) 22827 63520 36824 (57%) 22836 53004 35076 (66%) 22848 45608 36936 (80%) 22850 45224 34760 (76%) 全7プロセス。 (MaxRequestsPerChild 100のためSHARED数値が安定していない多分)

# ./apachelight_shared_memory_size.sh PID RSS SHARED 22129 3892 3524 (90%) 22583 3628 3240 (89%) 22597 3676 3256 (88%) 22726 3896 3536 (90%) 22789 3612 3252 (90%) 22790 3620 3212 (88%) 全33プロセス。 上記のように、コンテンツ配信用は1プロセスあたり大体360kしか消費していないのにたいして、プログラム処理用は1プロセスあたり9M~28Mほど消費しているのがわかる。これがもしプログラム配信用のみで運用しているとした場合ざっとした計算で3~4倍ほどメモリを消費することになる。

簡単にApacheの全プロセスの合計消費メモリ調べたい場合は下記ブログが参考になる。 http://d.hatena.ne.jp/kazuhooku/20091221/1261392787 上記ブログのスクリプトを何回か走らせると、150M~180Mと表示される。 現状ではサーバに大分余裕があるので、今の10倍ぐらいの同時接続数までならなんとかなると思う。

Apache二台体制とキャッシュについて

このApache二台体制の場合、いかにプログラム処理用を使用しないかで、メモリ消費量が大きく変わってくる。たとえば、動的に生成する画像が一つのWebページに10枚はってあるとすると、これだけでプログラム処理用のプロセスを10も起動しなければならなくなり大量のメモリを消費する。この場合、この動的に生成する画像がリアルタイムに生成する必要がなければ、キャッシュすることで、コンテンツ配信用のみで処理することが出来、より高速化できメモリの節約にもなる。 この場合、Apacheのレベルで処理するのであれば、mod_cache、mod_disk_cache、mod_mem_cache等のmoduleをコンテンツ配信用サーバに組み込んでキャッシュ処理を行う。 またPHPのフレームワークsymfonyでsfSuperCachePluginつかうことにより、一回目のアクセスのみ、プログラム処理用サーバで画像を生成しキャッシュすることで、二回目のアクセスからはコンテンツ配信用サーバからそのキャッシュされたファイルを直接配信するよう設定することも出来る。symfonyに詳しくない方もいると思うので、簡単に内部処理を説明すると、特定のキャッシュ保存用ディレクトリにファイルがあるかないかをmod_rewriteのRewriteCond -fで調べ、もしファイルがあればそのファイルをクライアントに送り、無ければPHPで処理する。Apacheのmoduleを使用するよりこちらのやり方の方が無駄がないが、運用方法によってどちらが良いかは変わってくると思う。

以上、、

2009年12月22日火曜日

Kindle使ってみた

!!アップデートされたKindle2やKindle3ではすでに古い情報が含まれています!!

勢い余ってKindleを買ってしまった。前々から興味はあったものの、有効活用できないことは目に見えていたため、購入していなかったが、この度仮対応だがPDFが読めるようになったのと、タイミング良く円高と値下げで結構お手軽価格になっていたのもあり購入してしまった。

DSCN1272 
郵送用のダンボールと一体化したKindleのケース

Kindleの詳細については下記のサイトが詳しいと思う。
【Kindle】 Amazon Kindle FAQ – 購入前情報からJailbreakまで 【まとめ】

購入してから一ヶ月ほど立つが、かなり気に入った。もともとiPod touchで本(PDF)を読んでいた。

- iPod touchで本(PDF)を読む場合のデメリットとして、

  1. 横書きなら横書きの幅を、iPod touchの小さい画面に納めなければならないため、字数が多い本だと非常に細かくなる。480ドットだと解像度が若干足りない場合がある。(Kindleは800ドット)
  2. 図を解説しているようなページの場合、図と文章が一つの画面に収まらないため、読みづらくなる。
  3. 何かiPod touchで本を読んでいると目が疲れる。

Kindleを気に入った主な理由は3で、どうもiPod touchで本を読んでいると目が疲れてストレスを感じる。また、iPod touchを使い始めてから、平日は起きている時間は常に液晶を見ているような感じになってしまった。仕事中は液晶を常に見ているし、電車のなかでiPod touch、お風呂の中でiPod touch、、これでは正直ちょっと目が心配だ。その点Kindleは電子ペーパーということもあり、表示が自然でストレスを感じにくいと思う。この辺は個人差はあると思うが、自分の場合はそうだった。ただ、Kindleといってもやはり、紙の本と比べるとコントラストが低く、紙の方が読みやすいのには変わりない。

逆にiPhone OSの方が良いなと思う場合もある。iPhone OSに最適化された、子飼弾さんの弾言や決弾は非常に読みやすいと思うし、産経新聞等の新聞や、A4サイズの雑誌など、Kindleでも一画面に収まらないような書籍は、ズームやスクロールがスムーズなiPod touchの方が読みやすい。

DSCN1279 
同じページをiPod touchとKindleで比較
(参考:クリスアンダーソン - フリーからお金を生み出す新戦略)

紙の本の電子書籍化(PDF化)

話は変わるが、もともとKindleとは関係なく紙の本の電子書籍化を進めていた。自分の生活として出張が多いが、技術書は結構厚みがあり重く、正直持ち歩いて読むのは非現実的だった。また出張先で、あ!あの本読みたい(参考にしたい)!というときに紙の本だと不可能だ。これが電子書籍であれば、常に全て持ち運べるし、iPod touchやKindleがあれば何時でも何処でも好きな本が読める。また最近のOCRは優秀で日本語もそこそこ認識し、アルファベットについてはかなりの認識率で、紙の本から取り込んだPDFを検索可能なPDFにすることが出来る。技術書を検索するときはアルファベットが多いため便利だ。また、Windows SearchやGoogle Desktop SearchもPDF検索に対応しているため、全ての電子書籍を横断検索することも可能だ。自分の場合Windows Searchを設定してあるので、スタートメニューに単語を入れれば該当するpdfが数秒で検索される。自分にとっては紙の本よりも電子書籍の方が価値がある。

電子書籍化については、裁断機とScanSnapというドキュメントスキャナを使用して行っている。ググってみるといろいろと情報が出てくるので、興味がある方は調べてみると良い。

Kindle最適化PDFの作り方

さてここまで、べた褒め?のKindleだが、Kindleで美しくPDFを表示するにはこの最適化作業が必須だ。そのため、KindleでPDFを見てみようかな?という人もいると思うが正直オススメしづらい。

- Kindleで本(PDF)を読む場合のデメリットとして、

  1. 容量が2Gしかない。ユーザが使える領域は1.4G(多分)しかない。全ての書籍は入りきらないため、iPod touch(64G)のように、何も考えずに同期すればよいわけではない。
  2. 拡大縮小が行えない(画面を横にローテートすることは出来るが)。単純に取り込んだPDFがヘッダやフッタなど含めて全画面で表示されてしまう。さすがにKindleの画面が広いとはいえこれでは肝心の文章が小さく表示されしまい、まだiPod touchの方がましだ!という状況になってしまう。
  3. カラーページなどで薄く取り込まれたページは、そのままKindleで表示しようとすると薄すぎたり、表示ががたがたになってしまったりする。

1はある程度しかたがない。どうしても容量を節約したい場合は、最適化PDFを作成する際に、圧縮率を高めにすると容量を節約できる。
2,3のデメリットを克服するためにPDFをKindle用に最適化する作業が必要になる。2,3に関してはソフトの問題が大きいと思う。Kindle2にはARM系のプロセッサが搭載されており、またクロック数は前世代のiPhone 3Gより速いらしいので、PDFを処理するには十分なスペックだと思う。今後のファームウェアのアップデートに期待したい。
今後のファームウェアのアップデートの内容によっては、この方法は最適では無くなる可能性があるので注意して欲しい。

さてKindle最適化PDFの手順は以下。

  1. まず、PDFを用意する。
    - ScanSnapで取り込む場合は、白黒のスーパーファインで文字をクッキリに設定して取り込むと良い。PC用にカラーで取り込みたい場合はカラーでも良い。
  2. Adobe Acrobatが使える場合は、あらかじめ文章の部分のみおおざっぱにトリミングすると良い。特に色が薄いページがなく文字が大きめの書籍であれば、このままKindleにコピーしても十分読める。
  3. いったん画像として保存する。Acrobatを使うか、なければフリーのPDF-XChange Viewer等で保存する。Jpeg等で保存する場合、画質を最高にしておく。
  4. この項目は手順が煩雑なので飛ばしてもかまわない。文字を可能な限りクッキリさせるため3の手順で作成した画像を、ImageMagicで変換する。5で使用するeTilTranというソフトでも画質の調整はできるので殆どの場合それで事足りるとは思う。
    - ImageMagicをインストールする。自分の場合Windows版を使っている。
    - コマンドラインから各画像をconvert –modulate 110 –gamma 0.3/0.3/0.3ぐらいで変換する。modulateは光を当てる処理。gammaはガンマ補正をかける。
    参考までにカレントディレクトリの画像を変換するRubyスクリプトは下記。convertの引数は日本語が通らないので「各画像のファイル名」を「ファイル名に含まれるページ数」に変換している。convertディレクトリに出力する。
    require 'fileutils'
    Dir.open('.').each do |file|
      if file =~ /(\d\d\d)\.jpg/
        num = $1
        puts file
        FileUtils.mv( file, num + '.jpg' ) if file !~ /^(\d\d\d)\.jpg$/
        `convert  -modulate 110 -gamma 0.3/0.3/0.3 #{num}.jpg convert/#{num}.jpg`
      end
    end
  5. あとはKindleDX用小説レシピ最終版?を参考にeTilTranというソフトで3,4で作成した画像を変換する。このソフトは、例えば画像の文章の部分を自動で認識して、その部分を拡大するという処理を自動でやってくれる。すばらしい!ただこのソフト使い勝手に癖があるため色々試してみて欲しい。上記ブログにはKindleDXの場合のDot-by-Dotは784x1142とあるが、Kindle2では色々試してみた結果560x742のようだ。最終的に出力する画像のサイズを、縦742ドット、横560ドットに設定するとKindle上で拡大縮小が行われないためきれいに表示することが出来る。
  6. あとは変換された画像を、PDFとしてまとめる。自分の場合Acrobatを使っている。

DSCN1290-1291
写真の例だとわかりづらいが最適化した場合(右)は読みやすさが違う。
(参考:可知 豊 - ソフトウェアの基礎知識)

 

まとめ

現状電子書籍はまだまだ発展途上であり、Kindleについてはまだ買い!とはいえないが、色々と可能性を感じさせてくれる。現状でも様々な方法で電子書籍が販売されているが、自分的に必須な、横断検索が可能、様々なデバイスで使用できるというようなものは無い。このあたりが満たされない限りは、電子書籍は自分で作り続けると思う。ただ作るの面倒なので、仮にちょっと高くても良いのでこれらの機能を満たすような電子書籍が早々に販売されることを願う。


防水ケースはお風呂用に。Kindle用ではないがサイズがぴったし。フィルムは丁度なサイズなので長い縦の辺から合わせて張るとうまくはれると思う。ケースはKindle用に買ったがちょっと大きかった。Kindle用に良いサイズのケースを探し中。

2009年12月17日木曜日

読書メモ - ソフトウェアの基礎知識

  1. コピーレフトの意味を今まで知らずにすませていた。GPLのような修正した場合も同じライセンスを適用しないさいよ的なライセンスをコピーレフトという。逆にBSDのようにそのような条項がないライセンスはコピーレフトではない。
  2. 修正BSDライセンスの「修正」は広告条項(著作者の名前を載せなさい!)を外したもの。
  3. まず著作権があり、その上で利用規約(ライセンス)がある。それとは別に特許がある。それぞれを分けて考えるとわかりやすいかなと思った。
  4. それにしてもやはりライセンスの文章は理解しがたい、、
  5. フリーウェア(無料ソフト)と宣言しただけでは、著作権の範囲内での使用が可能なだけであり、無断で配布したり、改変した場合は違法となる。なのでソフトウェアの公開者は可能な限り正しくライセンスの宣言をしなければならない。
  6. MySQLをPHPから使っても(動的ライブラリによる接続)コピーレフトの条項を守らなくても大丈夫というような、特別なライセンスの記述がなかったのがちょっと気になった。
  7. ラスト100ページぐらいはライセンスの文章が載っているが、やはり難しい、、

ネットでちょくちょくGPLライセンスや、BSDライセンスの記述などは読んだことはあったが、やはりライセンス関係は難しく、その場では何となくわかった気になるが、一度まとまった情報を読んでおくと理解が深まると思った。

読書メモ - フリーからお金を生みだす新戦略

  1. 無料化することで、生まれる価値と失う価値がある。
    - 需要が急激に増える。見えない新たな価値を生み出す。
    - 価値が無いものとして乱雑に扱われる。
  2. どんなものでもコモデティ化(その辺に良くあるもの化)すると価値を失う。情報はコモデティ化する。
  3. フリーの中での有料とはある意味動的な金額
    - (iTunes)自分でファイルを整理するのが大変ならば、購入すればよい。「ファイルを整理する」という価値は人によっていくらか異なる。学生ならばただに近いし、時間が無い人であればそれなりに価値がある。他の多くのフリーと有料版(フリーミアム)もこのようなバランスで成り立っている。
  4. オンラインゲームの課金方法もある意味iTunesと同じ。 LV上げするのがいやであれば購入すれば良い(価値がある)。移動するのが面倒であれば購入すれば良い(価値がある)。アバターの見た目を変えたければ購入すれば良い(価値がある)。
  5. 中国、ブラジルの事情(音楽がただ同然)。その上でのビジネスモデル。価値が無料に流れやすい文化。 今後コンテンツはフリーへと向かっていくが、そのような意味では中国、ブラジルは時代の先端を行っていると言って良い。
  6. フリーミアム - 多くの無料ユーザ(フリー)と、一部の有料ユーザ(プレミアム)から成り立つ市場。
  7. 人に信頼されること。たとえフリーだとしても多くの人から信頼を得られれば、その信頼をお金に換える方法はなにかしらある。また、ソーシャル~のように、人と人との信頼で築くメディアも同様。
  8. たとえあるコンテンツが無料になったとして、GDPは下がるわけでなくむしろ増える場合もある。その分の価値は他のところへと流れていく。

現場で今まさにフリーと付き合っている人には良い本だと思います。翻訳文章独特の読みにくさはありますがオススメです。

2009年11月27日金曜日

読書メモ - 夢をかなえる打ち出の小槌(堀江貴文)

  1. お金 = 信用
  2. 信用を得るには自信が必要
  3. 目に見えない物に投資する

プログラマの給料というのも結局は信用の上に成り立っている。労働量=給料と成るような職業と違い、自分の経験上プログラマの作業を正しく評価するのは、ほぼ不可能なため、信頼されている=給料が多いと言うことだろう。ただ日本ではプログラマの作業が正しく評価できないため、信頼されづらく、世界的に見て割を食っているように感じる。

2009年11月20日金曜日

読書メモ - iPhone Style Book / iPhone情報整理術

どちらの本も、基本的にアプリを紹介している本と思って良い。iPhoneの使用目的が余り決まっていなくて、何か良い使い方ないかな?と思っている人には丁度良いと思う。逆に何か目的を持ってiPhoneを使用しているのであれば、やりたいことをググった方が速いかも知れない。

iPhone Style Book

流し読みした。カラーで画像が多く見やすい。覚えているのは、

  1. SafariのWebクリップ機能(ホーム画面にアイコンを追加して、タップするとSafariでそのホームページを開く)。Safariでお気に入り画面を開いた後、ホーム画面について。
  2. キーボードの設定で、特定のキーボードの設定のみを表示するように出来る。標準では入力画面で、地球儀?をクリックするとqwertyキーでの日本語入力画面が表示されるが、それは必要なかったためOFFにした。


iPhone情報整理術

ScanSnapで本を取り込む方法に興味があり購入したが、ページ数が少なく余り参考にならなかった。どちらかというと、資料や名刺の管理方法などどちらかというと営業さん向けかも知れない。GTDの紹介やアプリも多いが、GTDのような仕事ハック?は人によって合ったり合わなかったりするし、やはり自分で良い方法を模索するのが良いと思う。

2009年11月13日金曜日

Debian GNU/Linux 5.0(Lenny)でのXenの設定メモ

設定後、思い出しながら書いたので間違いがあった場合ご容赦ください。

  1. XenのKernelをインストールする
    apt-get install xen-linux-system-~(環境に合わせて)
    インストール後新しいKernelで再起動。

  2. xen-tools(DomUのディスクイメージの作成等のツール)のインストール
    apt-get install xen-tools

  3. 今回はloopbackデバイスとしてDomUのディスクイメージを作成する。その場合loopbackデバイスの数がデフォルトでは8で制限されているため修正する。

    A - /etc/modulesに下記の行を追加。もしくは修正
    loop max_loop=255

    B - /etc/modprobe.d/loopに下記の行を追加。もしくは修正
    options loop max_loop=255

    C - moduleの再起動
    rmmod loop
    modprobe loop

    D - /dev/loopにデバイスが255あるか確認
    ls /dev/loop*

  4. 今回は外部ネットワークとローカルネットワーク用に二つの仮想ネットワークデバイスを使うため、そのための修正をする。BRIDGE接続で設定を行う。

    A - /etc/xen/scripts/network-bridge-my を新規作成し下記の内容を書き込む。その後実行権限を設定。
    #!/bin/sh
    dir=$(dirname "$0")
    "$dir/network-bridge" "$@" vifnum=0 bridge=xenbr0 netdev=eth0
    "$dir/network-bridge" "$@" vifnum=1 bridge=xenbr1 netdev=eth1 

    (注!他のdebian lennyで試したところ、bridge=xenbr0の記述あるとネットワークが繋がらない状態になってしまったので、そこの部分は消すと良い。2009/12/18)

    B – Xen設定ファイルを書き換える。/etc/xen/xend-config.sxpを編集。
    (network-script network-dummy)
    と書かれた行をコメントアウト。
    新たに下記の行を追加。
    (network-script network-bridge-my)

    C - xendを再起動する。
    /etc/init.d/xend restart

    D - ifconfigを実行して、peth0とpeth1が追加されていれば成功。(etchではxenbr0、xenbr1も見えていたような気がするがlennyで変わった?)

  5. DomUのディスクイメージの設定を行う。/etc/xen-tools/xen-tools.confの設定を編集する
    A - dist = etchと書かれた行をdist = lennyにする。
    B – dist = lennyの行の周辺にmemoryやdiskの設定があるので希望の値に設定する。
    C – mirror = http://~/の行が接続できないサーバになっているので下記の設定に変更した。
    mirror = http://ftp.jp.debian.org/debian/
    D - LVMを使用する場合は、lvm = でコメントアウトされている行があるので、lvm = Volume Group名を指定する。

  6. DomUのディスクイメージを作成する。Dom0のクローンが作成される。
    xen-create-image --verbose --hostname ホスト名 --ip IPアドレス --role=udev
    この処理はネットワークの状態?によって時々失敗するため、うまくいかなかったら何度か実行してみると良い。

  7. 6の実行後、/etc/xen/ホスト名.cfgというファイルが作成される。そのファイルを修正する。
    A - kernel、ramdisk行の、バージョンが誤っているため、現在インストールしているバージョンに修正する。
    B - 一番最後の行にextra  = ‘xencons=tty’を追加する。これがないと起動後ログインプロンプトが表示されなかった。
    C - 仮想ネットワークインターフェースを二つ認識させるため、vifを下記の値に修正する。
    vif         = [ '', 'bridge=xenbr1' ]

  8. 仮想マシンを起動する。-cのオプションをつけると仮想マシンのコンソールに接続される。コンソールから抜け出す場合はCtrl+]。
    xm create ホスト名.cfg -c
    仮想マシン起動後、ネットワークの設定がされていないため設定する。
    xm listで仮想マシンの状態を確認出来る。
    xm console ホスト名で仮想マシンのコンソールに接続する。
    xm dmesgで仮想マシン起動時のメッセージが確認出来る。AMD-V/Intel-V等の仮想化技術が有効になっているか確認すると良い。

仮想マシンの仮想ディスクの中身を直接修正したい場合は、mount –o loop /home/xen/domains/ホスト名/disk.img /mnt/でマウント。

仮想ネットワークインターフェースが一つでよい場合、4-Bを(network-script network-bridge)にしてxendを再起動。7-Cの設定をvif = [ ‘’ ]にする。多分。

参考元

2009年11月9日月曜日

Windows7 使ってみた

Windows7を実際に使って見た感想など箇条書きで。元々のOSはVista Bussiness x64からのアップグレード。前のノートPC FlybookにRC版をインストールして使っていたことはある。そういえばRC版の壁紙に居たベタ(魚)はどこに行ってしまったのだろう。結構気に入っていたのに。

  1. iTunesが初期化される
    違うPCとして認識されたらしく、iTunesに四台目として登録されてしまった。iTunesはiPodとは一台のPCとしか同期できないため、音楽ファイル等は同期し直した。同じアカウントでは五台までしか登録できないらしく、残り一台。話は変わるが、Windowsのライセンス認証は場合によってはPCが変わると電話しないといけない。めんどくさい。一回MSの人にOEM版はパーツと一緒じゃないとライセンス違反ですよと念を押された。
  2. タスクバー
    タスクバーは文句ない。Windows7の売りの一つ。ただ一つのアイコンにまとまる条件が良くわかっていない。Google ChromeのWebページをアプリケーション化する機能で、ウェブページをタスクバーの一つのアイコンにしたかったが、うまくいかなかった。詳細は後述。
  3. Windows サーチ
    この機能は正式名称がWindows Desktop Searchなのかよくわからない。OSアップグレード後インデックスが初期化され、また、メールフォルダがインデックス化の対象に入っていなかったため手動で設定する必要があった。この機能でメールを検索するために、Windows Live メールでメールを受信している。本当はThunderbirdとか使いたい。
  4. エクスプローラー
    エクスプローラも結構動作が変わっている。とりあえず、Vistaの時に愛用していたQTTabBarはうまく動作させることが出来なかったため、タスクバーをうまく使うことで代用した。詳細は後述。
    またエクスプローラ上でPDFのサムネイルが表示されなかった(これはどうもVistaの時からのよう)。これはx64化の弊害のようでAdobe Acrobat(Reader)がx64に対応してないためらしい。ネットで検索すると対処法も出てくるが、どうもうまくいかない。最終的にはPDF X-Change ViewerというフリーのソフトをインストールしてAcrobatの代用にしたら解決した。Acrobatは普通に買うと数万するソフトなのでしっかりやって欲しいところ。Flashもx64に対応していないため、事実上各種ブラウザもx64版が使い物にならない(Flashが表示されないため。)
    細かいところでは、コントロールパネルを開いたり、検索画面を開いたりしたときにフォーカスが自動的に検索ボックスに移動するようになった。Vistaでは手動で移動しなければならず、細かい修正だがありがたい。
  5. VMWare OpenVPN
    アップグレード時に仮想ネットワークが全消しされているようなので、修復インストールしないとネットワークが繋がらない。OpenVPNも同様で、一回アンインストールしてから、インストールプログラムをVista互換モード、管理者権限で実行してインストールし直したらうまくいった。普通にインストールすると接続時に余ってる仮想ネットワークがないよって怒られる。
  6. Poderosa TeraTerm cygwin
    これはWindows7で一番困ったかも知れない。PoderosaやTeraTerm上で、cygwinを起動すると余分なウィンドウが二つ表示される。
    image 
    一応cygwin1.7にアップグレードすれば大丈夫という記述は見つけたが、アップグレードしてもうまくいかなかった。よほど我慢して使おうかと思ったが、耐えられなかったため、minttyという非タブ式のターミナルを使うことにした。なれると意外と使いやすかった。

Windows7 タスクバー

Windows7の売りの一つ。細かい解説などは他のサイトに譲るとして、自分の場合の使い方、キーボードショートカットでの操作方法を説明したいと思う。Windows7のタスクバーはプログラムランチャーと、タスク管理を同時に行えるようになっている。今までのOSではタスクバーには起動したプログラムしか表示されなかったが、これがタスクバー上にショートカットを表示しておき、このショートカットから起動すると、そのショートカットがそのままボタンのような表示になり、起動状態になる。このような動作になり、いままで動的に移動していたタスクバーの起動したプログラムの位置をほぼ固定することが出来る。このあたりの詳細な説明は下記サイトなどを参照。

http://www.itmedia.co.jp/news/articles/0811/22/news006.html

このタスクバーの機能で自分に重要なポイントとして、タスクバーのショットカットには、それぞれキーボードショートカットとして、上から順番にWinキー+1~9-0が割り当てられる。要するにタスクバーで一番上のショートカットはWin+1を押すと、プログラムが起動してなければ起動、そうでなければ起動中のプログラムを表示するという動作になる。今このブログはWindows Live Writerというソフトで書いているが、このプログラムにはWin+9というキーボードショートカットを割り当てており、Win+9を押すと何時でもブログをかける状態になる。

また一つのプログラムを複数起動している場合は、Win+数字キーを押した回数によって、1回押した場合 - 最初に起動したプログラム、2回押した場合 - 二番目に起動したプログラムというような動作になっている。この動作を覚えておくと、タブがないようなプログラムでも3つぐらいまでであれば、十分タブの代用になる。またWin+数字キーを押した際に、Winキーを押しっぱなしにしておくことにより、Windows Aero Peekが働き、対象になっているプログラム以外は透明化するため、これもわかりやすい。

すでにプログラムを起動しているが、二つ目のプログラムを起動したい場合、Win+Shift+数字キーで二つ目のプログラムが起動する。

Windows Aero フリップ3Dは相変わらず使えないと思われるため(Windows7のバージョンは一度も見てないが、、)、Win+TabはSwitcherに置き換えると良いと思う。

http://insentient.net/ (Switcher Mac OSXのexposeクローン)

image

このソフトが入れてあれば、Win+TabでSwitcher起動後、writerと入力してEnterすれば、Windows Live Writerの画面に移動できる。この際のwriterはプログラムのタイトルを検索してるので、プログラムのタイトルに表示されている文字列を入力する。Vistaの時はこの方法を主に使用していたが、Windows7ではタスクバーがメインなりそう。

Windows7 エクスプローラ

Vistaの時は、QTTabBarというソフトを入れてタブ化していたが、それがWindows7では動作しなくなったため、前述のWin+数字キーでタブの代用をしている。ただタブはあった方が便利だとは思う。

エクスプローラの変更点の一つとして、項目の表示方法(中アイコン、詳細などの)にコンテンツという項目が追加された。このコンテンツ表示はVistaにはなかったため、検索結果の表示が格段に見やすくなった。

image 
(lenovo 製品 で検索した場合の検索結果表示。クリックで拡大。)

このコンテンツ表示では、コンテンツの一部が表示され、検索にマッチした部分がハイライトされる。またVistaでは同じファイル名が複数検索された場合、どれがどのファイルか判別する方法がなかったが、コンテンツ表示では格納されているフォルダまで表示されるため、そのような問題がなくなった。個人的な使い方として、プログラムのファイルを検索する場合など、フォルダ名が表示されることで検索しやすくなった。

動作について

全体的に軽くなっているとは思う。もともとVistaでもメモリが大量に積んであれば、重いとは感じなかった。XPでメモリ4G積んであるマシンもあるが、XPはどうもメモリ管理が下手なようで、むしろ体感ではVistaの方がストレスは感じない。起動時間等は、様々なサイトで検証されているので、そちらを参照してもらった方が良いと思う。参考までにBIOSから、ログイン画面までの時間はだいたい17秒程度。ただログイン後のようこその画面で時間がかかる。これはApacheや、MySQLサーバなど起動している関係もあり、あまり参考にはならないと思う。バッテリーの持続時間は若干良くなったように思う。今まで新幹線東京-名古屋間ではギリギリ持つか無くなるかだったが、若干余裕があるような気がする。もともとVista x64バージョンはバッテリーが持たないという話だったので、多少改善されたのかも知れない。

動作については体感なので参考までに。

まとめ

今ネットブック等でWindows XPを使用している人には、オススメするほどでもないが、今現在Vistaを使用している人にはオススメしても良いかと思う。

ただ、下のAmazonのような値段だと正直オススメしづらい。ファミリーパックや優待版を利用するとHome Premiumが7000円程度でアップグレード出来たが、今は無理してアップグレードする必要はないかも知れない。

2009年10月30日金曜日

Lenovo ThinkPad X200s

lenovo もう三ヶ月ほど前ですが。買いました。当時使用していたFlybook V33iが壊れたこともあり。何か良いノートPCないかなと探していた。

Flybook V33iはA5サイズで簡単に言えば今でいうネットブックのようなPC。

dialogue_2 

コンパーチブルタイプで、液晶はタッチパネルになっています。スペックも今のAtomと同じような性能でPentium M 1.2MHz、メモリ 1GBでした。使っていませんでしたが、SIMスロットが付いており、DoCoMoのSIMをさして通信したり出来るへんなノートPCでした。奥行きが丁度片手でつかめる幅で、立ちながら片手でつかんでタッチパネルつついたり、変な使い方ができて結構気に入っていました。

当時新たに購入するノートPCの候補として、このノートPCの後継機Flybook V5がありましたが、もともと余り出回らないノートPCで新品の価格は下がらず、割高に感じ候補から外しました。

購入するに当たって検討した条件として、

・常に持ち運びできる大きさ重さ。

大きさの目安はだいたいA4(幅30cm未満、奥行き22cm未満)サイズ以下。重さは1.3kgまで。

・開発が出来る

Flybookではとても無理だった。メモリは4Gは欲しい。CPUは最低Core 2 Duo の1.2GHz以上。

・静か。

Flybookは結構うるさい。

・出来るだけ安く。

予算は決めてないが、出来るだけ安く。

・ちゃんと打てるキーボード。英語キーボード。

プログラム書くなら英語キーボード(HHKB)になれすぎてて、日本語じゃ厳しい。

 

最終的に候補に挙がったのはVAIO Type T、ThinkPad X200s、DELL Latitude E4200。英語キーボード必須にすると結構絞られてしまう。Let’’sノートは解像度が低いため対象外。東芝Dynabookや、富士通Looxも魅力的な製品があるが、英語キーボードが選択できないためアウト。

購入の決め手になったのは、ThinkPadのメンテナンスのしやすさと、コストパフォーマンスの良さ。性能の高さ。ただ他社の同系列のノートPCと比べると、大きく重い。

このサイズになると、殆どのノートPCが1.8インチのディスクを使用しているが、ThinkPad X200sは2.5インチで、換装はねじ一本で可能。2.5インチの方が値段も安いし種類も豊富で、換装前提でバックアップ用ディスクの運用を考えるとありがたい。液晶も高解像度液晶WXGA+(1440x900)で12.1インチの液晶だとThinkPadしかない。ドライブは付いていないが特に使用しないのでよしとする。また、CPUがSL9600(2.13GHz)なため、候補に挙がっていたVAIOやLatitudeと比較しても1.5倍以上の性能がある。VAIOはメモリ8G、SSD500Gが良かったが値段が跳ね上がる。また周辺機器が高い。VAIOの大容量バッテリーは2万5千ほどするが、X200sの大容量バッテリはヤフオクで純正品が8000円台で売っている。

ThinkPadにはX200もあるが、高解像度液晶が選べるのと、X200のCPU P8700がそれほどSL9600とスペック的に変わらないため、より軽量なX200sにした。(今Lenovoのサイトを見るとP8800が選べるためまた違うかも。CPUにT9900あたりが選べるとX200を選んだかも知れない)

現状はメモリを増設し、ディスクをIntel X25-M 160GのSSDに換装している。

Lenovo ThinkPad X200s

Intel Core2Duo 2.13GHz 6MB

DDR3 S.O.DIMM 8GB

SSD Intel X25-M G2 160G

実際使って見て驚いたのは、デスクトップに使用していた、Athron X2 3GHzよりスーパーπ(CPUベンチマーク)の値が1.5倍ほど良かったこと。Athron X2もそれほど新しいCPUではないが、クロック数から見て多分同じぐらいかなと思っていた。今ではすっかりデスクトップの出番がなくなってしまった。またファンの音は凄い静か。もちろん負荷をかければ音はするが、省電力モードであれば、静かな場所でも音は聞こえない。

また見た目より軽いので持ってみた感じは軽い。実際に重さをはかってみた。

DSCN1220

実際に使って見るとプログラムを書くには最高のモバイルノートPCかも知れない。今のところCPUがもっと速ければなぁと思うのと、額縁(液晶周りの縁)がもっと細ければなぁと思う以外特に不満はない。

が、、早速先日、高さ60~70cmほどから落下した。手前の角の部分が割れてしまったが特に問題はなさそう、、拡張保証はかけてあるが、保証期間が終わりそうになったら修理に出そうと思う、、

2009年10月21日水曜日

iPod touch 使ってみた - 動画編

EM ONE(Windows Mobile 6.0)からiPod touch(以下touch)を使い始めて、最初は動画の扱いが意外と面倒だと思った。

-USB経由でそのままコピーできない

-iTunesが認識しない動画が多い。

Windows Mobile端末の場合適当にファイルを放り込んでおけば、flvでもmp4でも再生してくれる(プレイヤーは非MSのTCPMPを使っていた)。普段の使い方と言えば、ウェブで後で見たい動画があればダウンロードし、暇な時にEM ONEで見るというのが多かったが、iTunesが認識しない動画が多いため、そのような使い方が出来なかった。ただこのような仕様も、Windows Mobileでは端末で再生してみた時まともに再生できない動画も多いため、iTunesで認識できる物はiPodで再生できると保証されていればユーザビリティ的にはよりよいと思う。

touchで動画に関していろいろ検索してみたが、めんどくさくない方法が見つからなかったため、以下の方法をとることにした。

-SmileDownloader(youtube,ニコニコ動画)で動画をダウンロードする

-ffmpeg(動画エンコーダー)で適当に変換する

-iTunesに登録する

まずSmileDownloaderで動画を「特定のフォルダ」(今後download_pathとする)にダウンロードする。今は、クリップボード監視をONにして、URLをコピーしている。なんかエラーのダイアログがよく表示されるが気にしないことにしている。

次にiTunesが認識するようにffmpegで変換をかけるが、どうも最新番のffmpegでは音声のaacエンコードがうまく行かないようなので、Area61というソフトをインストールして添付のffmpegを使用する。後は下記のrubyスクリプトを実行すれば、「download_path」にダウンロードした動画を自動的に「conver_path」のフォルダにエンコードして、iTunesに登録してくれる。スクリプト中の各種パスは適当に修正してください。下記の例では1024kと高めのビットレートになっているので低めが良ければ、512kぐらいに修正してください。変換元のファイルは削除するので注意!

$stdout.sync = true
download_path = 'C:/Users/takeda/Videos/SmileDownloader/'
convert_path = 'C:/Users/takeda/Videos/SD2IP/'
itunes_path = 'C:/Program Files (x86)/iTunes/'
ffmpeg_path = 'C:/bin/ffmpeg.exe'

Dir::glob(download_path+'*').each do |file|
  next unless file =~ /^(.*)\.(.*)$/
  ofile = $1.sub(download_path,convert_path) + '.mp4'
  puts file
  puts '=>' + ofile
  query = "\"#{ffmpeg_path}\" -y -i \"#{file}\" -s 480x320 -level 13 -vcodec libx264 -acodec libfaac -b 1024k -ab 128k -ar 44100 -ac 2 -f mp4 \"#{ofile}\""
  `#{query}`
  File.unlink( file ) if 0 < File.size( ofile )
end

puts "finish. push any key ..."
gets
Dir.chdir(itunes_path)
`iTunes #{convert_path}`

 

上記のやり方で一週間ほど過ごしてみたが、下記のような問題が発生している。

-iTunesになぜか同じファイルが二つずつ登録されている。同期した場合touchのほうではちゃんと一つだけ。

-動画ファイルが増えた場合、touch上では目的の動画を探すのが大変になる。現状は50音順で並んでいるようなので、自動的に連番をつけてソートしようか迷っている。

-見た動画を削除する場合、iTunes側で削除しなければいけない。これが結構めんどくさい。iPod上で削除しただけだと、再同期したときに復活する。

本当はtouchだけで、ダウンロードから再生までやってしまうのがスマートなのかも知れない。ただ自分のスタイルだと、PCがある場合はたいていPCを使ってしまうため、見たい動画があった場合、そのままPCでダウンロードした方が面倒がない。Apple的には動画ファイルが多くなったら最新の10件のみ同期するなどの設定を使ってねということなのかも知れない。ふと思ったが、touch単体でyoutubeなどダウンロードして再生できるのに、PCでダウンロードしたyoutubeの動画がiTunesから同期して再生できないのは腑に落ちない、、

また、AirSharingのような、WiFi経由でファイルを共有するタイプで管理しようかとも思ったが、これも大きいファイルを転送しようとするとどうも動作が安定しないため、お蔵入りとなっている。GoodReaderでも試してみたがどうもうまくいかない。

何か良い方法があれば教えて欲しい、、

結論 動画ファイルの管理はめんどくさい。動画はきれいに再生できる。

2009年10月9日金曜日

iPod touch 使ってみた

iPod touchの価格が改訂されて安くなったこともあり、前から気になっていたこともありついつい購入してしまった。購入したのは第三世代の64G。CPUやメモリはiPhone 3GSと同等の物が搭載されている。これまでは、オーディオプレイヤーとしてはgigabeat F60、PDAとしてWindows Mobile のEM ONEを使用していた。

運用方法としては、EM ONEをモバイルルータ化して、一応どこにいてもネットに繋がるようにはしている。めんどくさいがとりあえず我慢。東京都内にいるときは行動範囲が狭いため、意外とホットスポットで間にあう。

まず使っていてビックリしたこと

・スリープ?から起動して無線LANをつかむまでが速い!

速い!スリープから起動してSafariを起動してインターネットしても特にストレスは感じない。PCやEM ONEではこうはいかない。ハードとソフト一体化して設計しないとこうはいかないと思う。

・Safariが速い!予想以上!

EM ONEでOpera Mobile 9.7が出て結構高速化されて、しばらくそれで満足していたけど、Safari Mobileはその比ではなかった。

・Safariでyoutubeが再生できる!

Flashはみれない物だと思ってたのでビックリした。巡回するサイトにyoutubeが結構埋め込まれているので助かる。

・大容量のPDFが普通にみれる!

PDF ViewerとしてGood Readerを使用しているが、30MByteのファイルでも特にストレスなく起動する。起動した後もヌルヌル動く。すばらしい。EM ONEではこうはいかない。

使っていて残念なところ

・EM ONEで使っていた、Bluetooth オーディオレシーバが正しく動かないこと。

Bluetooth オーディオレシーバについてはJabra BT3030を使用しているが、touch本体で音量が調整できなかったり、曲の先送りが出来なかったりしていまいち。Bluetooth自体、柔軟にプロファイルが作成できる分相性問題が他の機器とでもよく発生するが、もうちょっと頑張って欲しいところ。ずっと無線で音楽を聴いていたが、久しぶりに有線で聞いてみたら音の良さに感動した。利便性とともに何かを失っていたようだ。touchのヘッドフォンジャックはカチっとはまってストラップの代わりにも使えそうなので、しばらく有線で使って見るつもり。

・ウェブブラウズ、PDFを見ているときにもうちょっと解像度が欲しい。

解像度については、EM ONEが800x480と画素数だけで比較するとtouchの2.5倍ある。EM ONEの解像度だと殆どの横幅1000px程度のPCサイトだと若干縮小しただけでスクロールなしで文字が読めるがtouchだとちょっと厳しい。PDFももうちょっと解像度があると縮小した状態でも文字が読めるため良いと思う。メールも横が800pxあるとPC用のメールが改行されないため見やすい。

ぐらいか、、とりあえず完成度は予想よりも高かった。iPhone OSがバージョンアップして安定したのかも知れないが、トータルでみればすばらしい完成度だと思う。EM ONEももう二世代ぐらい前の機体なので比較するのもかわいそうだが、一度iPod touchになれてしまうと。もう使う気にはなれないというのが正直な感想。ただモバイルルータとしても活躍できるEM ONEの汎用性は良いと思う。イーモバイルから新しい機種がでれば乗り換えるかも知れないが、、でそうにない、、iPhoneに乗り換えるのも時間の問題かもしれない、、