コンピュータやソフトウェアのあれこれ@道民(&元道民)
Archive for 9月, 2011
[レポート][haskell]今日は第2回スタートHaskell の日です
9月 11th
第2回スタートHaskellに来ていますので、レポートします。といっても、中身は全てProgramming in Haskell の話なのですが。
宿題の解説 / @yuzutechnology さん
宿題の答え合わせ。
- 問題2 : カリー化の問題。
- 問題3 : フレームレートやビットレートの計算。
- 非圧縮のサイズをレートなどから計算し、ファイルサイズと時間から単位をあわせて圧縮後のビットレートを出す。ただし、ビデオだけの計算なので音声の分を引く必要がある。
- 音声のビットレートは圧縮率なの? → 議論は後から
- fromIntegral ってのはわかるの? → 演習問題で出ていた。IntとFloatの型を合わせる。
- ある型から自型へ変換するのは fromXXXX、自分の型からある型へ変換するのは toXXX
- 型は合わせなければ成らないが、多相なのである程度だけ覚えておけば後は勝手にイイカンジの定義が使われる
- 問題4
- length が 4未満かの確認のコストは、長さによって変わるのでは? → その通り。長くなると不利。違う実装も考えられる
- かっこ要らないのでは? → hlint をcabalで入れておくとよい(インストールに3時間くらいかかる)。構文的に冗長な部分があればアドバイスをくれるっぽい?
- 問題5
- この問題は必要とされる数学の知識のレベルが高い。今回からは数学の問題は少なめになる。
- 各点が求められる平面上にあること、
- 点が時計回りに配置されること
- 外積ベクトルを出して同じ向きであること、辺のベクトルが外積と平行であること
- Haskell では where で式をたくさん並べられる。順番に実行されるわけでもなく、そこが面白い
第5章 リスト内包表記 / @dekosuke さん
- 前回 矢印 Prelude と 型クラス、多相型、カリー化、ガード、パターンマッチ
- なぜリスト操作が必要なの?
- 関数型には一般的 にはforループがない
- forやwhileはリスト、Iterator はFunctor
- リスト内包表記は、リストからリストへの演算。
- 無名関数+map+filterでも書ける。ケースバイケース。
- [x^2 | x <- [1..5 map の例
- [x | x <- [1..6], mod x 2 == 0] filter の例
- [(x, y) | x <- [1..3], y <- [x..3 複数の生成器を使う例
- リストを1つの値にまとめる関数(reduce(fold) など)とあわせて使うとよい
- length xs = sum [1 | _ <- xs]
- zip → 2つのリストを、1つのタプルのリストに
- 文字列の内包表記 → type String = [Char] なので
- take 2 "hoge" は "ho"。文字列のリストは、Char
- シーザー暗号を作って解読
- encode n "..." はn文字ずらす
- shift n c は、小文字だけをn文字ずらす
- encode n xs = [shift n x | x <- xs]
- table として英文でのアルファベットの頻度表を用意
- 25パターンのズラす量を全てχ2乗検定にかけ、誤差がもっとも低い物を採用すれば、シーザー暗号は解ける
- Haskell で内包表記はあまり使わないのでは? → プロジェクトオイラーとかでは使う。Pythonに比べるとあまり使わないイメージ
発表:第6章 再帰関数 / Lost_dogさん
- 再帰的定義 → 定義の中に自分自身が現れる
- 私の友達を「私の友達と話したことがある人」と定義してはいけない
- 循環を止める定義が必要「私。または私の友達と話したことのある人」
- "私"が基底部、"私の友達と話したことのある人"を再帰部と呼ぶ
- 数学的帰納法に似ている
- 定義の中に自分自身が現れる関数を、再帰的関数と呼ぶ
- frac 0 = 1; frac n = n * frac (n-1)
- 再帰的関数の作り方
- 1. 型を作る : product :: [Int] -> Int
- 2. 基底部と再帰部を作る product [] = ??? ; product (n:ns) = ???
- 3. 楽な方を先に実装(だいたいは基底部) product [] = 1
- 4. 大変な方を実装。productはもう動く物と思って作る product (n:ns) = n * product ns
- 補足
- RWHでは、先に再帰部を書き、下に基底部を書く
- マッチする回数の多い方が上の方が効率がいい? → GHCだと、基底部を先に書いた物としてコンパイルされる
- (RWH はスピードおたくが書いてるんだけど、その効果はなさそう)
- 再帰は再帰の度に型チェックがあるのがありがたい(なのでLISPで再帰だとちょっと意味が・・・)
- 最終的には再帰はなるべく書かない。foldやfilterやmapで力不足のときだけ。ただ、最初は練習した方がよい
- なぜ再帰は書かないのか → 意味が分かりにくい。fold などの方が意味はわかりやすく間違いも入りにくい
- Q. for がよくないってのはどういう話?
- for のbreakやcontinue で型チェックはしてない
- for の中でも、変数の型のチェックがあるのでは? → そこまで簡単だとそうだけど、複雑になると・・・
- 関数と文(for)を比較しているのが問題なのでは → 大事なのは、全てが"式"である、ということ
- for は構文であって副作用を期待しており、何を計算しているのかが不明確、ってことでは?
- OCaml とかでは、forの中にはinitを返す式しか書けなかったりもする
発表:再帰関数(補足) / トラビスさん
- factorial → 負の数を渡すと、無限ループ
- これは"部分関数"という。終了しないのは危険なので、error を使った方がいい
- n | n <= 0 = error "...negative"
- ケース文にて、頻度が高い物は上にした方がいい*1 → n > 0 を一番上
- Q. Haskell の仕様で、"ケース文を上から下にチェックする"という仕様が残っているのはなぜなの? 最適化の邪魔では?
- if 文のネストを書くときのようにケース文を使うには、これは必要
- 「と同じになるように」
- 本にあるreverse の実装は遅い
- haskellは連結リスト
- consは早い(リストは永続するので、残りの部分を再利用できる)
- tail も早い。
- 末尾に値を加えることはできない(永続性が崩れる)。この場合はコピーが必要。
- 本のreverse の定義の ++ [x] は毎回コピーするのでヤバい
- ヘルパ関数reverse' を定義する。acc(アキュミュレイター)という引数を増やす
- acc に結果をためていく。結果としてconsだけで実現できる
- reverse = reverse' [] where reverse' acc (x:xs) = reverse' (x:acc) xs ...
- Haskell は遅延評価のために、末尾再帰はすこし複雑。
- reverse' は末尾再帰にならない。評価が残っているので
- Q. アキュムレーターって何?
- A. 返したい値を少しずつ集めるもの。集めた後に、最後に変換することもある。
- A. 末尾再帰だと、結果を捨てられる。なるべく末尾再帰に直すのがよい。その解決手段として、アキュムレーターを追加することがよく行われる
- アキュムレータ(acc)を第一引数にすると、カリー化が使えてよい。
発表:第7章 高階関数 / @imagawa_yakata さん
- 公開関数とは関数を引数・戻り値とする関数。ここでは前者
- リストを処理する関数 : or , sum など
- 例えば、リストに10未満の数があるかを調べるには?
- filter even [1 .. 5] (evenが関数)
- map (+1) [1 .. 5] (+1 が関数)
- 10未満の偶数があるかをチェック → or $ map even $ filter (\n -> n < 10)
- 合成演算子 : 「.」 → f . g = \x -> f (g x)
- sum のような感じで、関数を集約できる関数はないの?
- foldl → foldl (+) 0 [1 .. 3] : 0がアキュムレーターとなっている
- foldl (.) id [or, map even, filter (\ n-> n < 10)] はできるのかな?
- できない。Listの中身の型がバラバラ
- 同じ方の関数ならできる
第2部(演習)
えんしゅうするっぽいです。
- import Char は非推奨。import Data.Char
- リストの変数名の末尾には「s」を置く
- elem は `elem` の中置きの表記で書く。バッククォートは結合が弱いので、括弧が要らなくなることがある
- Hoogle を使うとよい。作ってるのはhlint を作った人。
- seq や ! を使って正格評価させて、数値を潰してスタックを食いつぶさないようにする
- ghcではBangPatterns プラグまで、引数に!をつけるようにできる
- モジュールのあるパッケージを特定するいい方法がない(Hoogleを使う?)。コメントにbaseやmtlなどと書くとよい
- -Wall をつけて、警告は全て消すとよい
- ghc で -O -ddump-simpl をすると、中間コンパイルの状態を見れる
- ++ は左の要素のみをコピーする。よって、[..]++([..]++[..]) を ([..]++[..])++[..] と書くと、コピーの量はO(n)からO(n^2)へ増える。
*1:先のGHCでは変わらないという説はあるが、さっきのはパターンマッチの話。また、最適化などで変わるかも
Galaxy S2+HID+Debian = Perfect Handheld Computer(後編)
9月 11th
Galaxy S2が面白くて仕方がないよシリーズの後編記事です。
前編は、IS01での挫折の顛末〜Bluetooth Keyboard + MEDIAS N-04C、そしてGalaxy S2(SC-02C)への道程についてでした。後編では、主にSC-02Cのお話が出来ればと思います。
ふつうにHIDとして使う
そんなわけで勢いで機種変更してしまったGalaxy S2、まずはHIDデバイスの使い勝手が気になります。
うん。大変快適でした。キーボードもマウスも認識するっていいよね。Androidをスマホ用OSとして認識している人にとっては、マウスポインタが表示されるという事それ自体が新鮮かもしれません。どちらかと言うと組み込み系の汎用OSという出自で捉えると納得しやすいかと思います。
リモートデスクトップクライアントにしてみる
標準状態のAndroidでも、キーボードとマウスが使えるなら、リモートデスクトップは大いに実用になるはず、と踏んでいました。
早速試してみたところ、
- まあ普通に使える
- 画面解像度が合わないのが辛い。RDPは自由な解像度を許してくれないのだろうか、あるいはクライアントアプリの問題だろうか。
- キーボードもマウスも無い状態で使うRDPよりは100倍快適と思われる
という感触でした。概ね、思惑通りです。
そんなことより、とりあえずroot
で、買って半日もしないうちに、root権限を取るための作業を始めました。そもそも、rootedであることを前提として端末を買っているので、ごく自然な流れです。
※ここから先の話は、見よう見まねでやるとGalaxy S2がゴミになる(文鎮化する)可能性が非常に高い作業ですので、わかる人には参考になるであろう程度に大雑把に書きます。読んでも判らない人には、お勧めしません。このページだけ見てやろうとしても無理です。それでもやろうということであれば、その心意気はとても良いと思いますが、壊れたことを人のせいにするような人は絶対に手を出さないようにしましょう。ジコセキニンってやつです。
作業自体は先達諸兄の足跡をなぞっただけですので、詳説はしません。要するにカスタムROMを書き込むことになります。Galaxy S2は、ht-03aのような状況で、カスタムROMはCPU電圧を調整したりディスプレイ輝度を調整したり、もろもろ手が入ったカスタムROMが何種類もある状況のようです。某巨大掲示板群の当該スレッドを読めば概ね把握できるのではないかと思います。というか僕はそこしか読んでいません。また、ROMイメージの転送方法については、ぐーぐる先生にお伺いを立てれば回答が得られる程度の難度ですので、各自で把握頂ければと思います。
それでどのイメージを転送するかという話になりますが、標準状態のGalaxy S2をちょっと触ってみて、パフォーマンス等々には全く不満を感じなかったので、あくまで標準ベースでrootだけ取れる、というイメージを書き込みました。最近は書き込みのことを「煮る」と言ったりするんでしょうか、それは一部だけでしょうか。その辺はついていけていません…。
カスタムROM制作にトライしている諸兄には篤く御礼申し上げます。
※ところで、カスタムROMを取得して導入するのって、著作権的には違法になるんでしょうか。海外ではカスタムROMを書き込みできるように開放する、といった動きもあるようで、黙認なのかなあと思っているんですが(純正ROMの製造コスト自体は端末の料金に含まれているわけだし)、もし法に触れる(あるいは誰かの迷惑になる)ようであれば、本意ではないので、このエントリは削除します。
そんなわけで無事にrootを取得できました。
なんてお手軽なんでしょう、感動的です。ハックしてる感は、全くありません。ていうかハックしてません。
Debianイメージの作成
続いて、Debian の準備を行います。基本的なアイデアはここに説明されている通りです。ざっと見てもらえればわかると思いますが、要するに
- debootstrapでarm用バイナリを指定してextのイメージファイルを作る
- 作ったイメージファイルをloopback mountして、そこにchrootする
という、それだけの話です。その筋の方なら難しくも何ともないと思います。逆に、先のページの内容を理解出来ないようだと、苦労すると思います。とはいえ、やってみないといつまで経っても出来るようにはならないので、リスクを承知でトライするのは面白いと思います。root取るのさえ失敗しなければ、この作業は失敗したところでdebianが立ち上がらないだけで、Android環境までは壊さない・・・いや/system/ を書き換えて壊そうと思えば壊せるか・・・まあたぶん、よほどじゃなきゃ壊さないと思います。知らん。
で、おいらはdebianを普段使っていないので、ESXiにさくっとdebian環境作って作業しましたよ。CDブートでいいんじゃね?とか、なんか別にCentOS上でも何とかなるんじゃね?って気もしたんですが、debianのインストールって、いま、酷く簡単だし、仮想化のおかげで物理マシンも用意しなくていいし。ラクな方に流れました。
debian.img の作り方はもう手引きの通りです。留意する点としては、
- おそらくSDカード上にイメージを配置しようと考えていると思います。ファイルシステムを確認してください。
- fat32であれば、1ファイルのサイズ上限は4GBまでです。
- 謎の数字で言うと 4194304000 ぐらいの感じです。
あとは特に何もなかった気がします。
ちなみに、armバイナリがあるディストリビューションでいまもアクティブに保守されてるのって、どれぐらい選択肢あるんだろうと思ってwikipediaを見てみたところ、うーん。Debianのほかには、GentooとSlackwareだけですか。さすがにクロスビルドする気合いはありません。
そう・・・玄箱にVineを入れていてね・・・アップデートできなくなって悲しい気持ちになってたんですよ。玄箱うぉううぉうさんのアレです。その玄箱も、半年ほど前、ものすごく忙しいさなかに華麗に逝きました。臭いからして、電源系のコンデンサとかそんな感じで。でも丸6年以上動いたのかな。彼はえらかった。
Debianイメージを端末に持ち込んでchrootする
このステップさえ乗り越えてしまえば勝ったも同然ですね。とりあえず作ったdebian.imgをscpなりで作業端末経由でSDカードに書いてあげて、端末に置いてあげて、までは誰でも出来ると思います。問題は、先の手引きで”bootdebian”として紹介されているシェルスクリプトですね。
答えは載せませんが、要点だけ
- chrootコマンド自体は、Androidマーケットからbusyboxを導入することでわき出てきます。
- 僕はStephen(Stericson)さん作のBusyBoxというのを導入しています
- このアプリはBusyBoxのInstallerということらしく、起動すると導入するBusyBoxのバージョンを選べるのですが、最初導入を選択した1.18.xのバージョンでは、chrootが導入されませんでした。
- v1.17.1 を導入するとchrootのsymlinkが出来ていました
- chrootが無くてすんげーハマった。知らんがな
- まさかyaffs2そのままでやろうって人はいないよね。/dev/block/mtdblock3 とかそのまま使おうって人はいないよね。自分の端末のmountの結果見てから考えるよね。
- そういえばext4にびびった
- Galaxy S2は内蔵ストレージと外付けストレージ(micro SD)がある
- 内蔵ストレージ: /mnt/sdcard
- micro SD: /mnt/sdcard/external_sd
- /system に書きたければ、
mount -o remount,rw -t ext4 /dev/block/mmcblk0p9 /system
大体これぐらいの情報でいけるんじゃないかと思います。行けない人はやめといた方が(略)。いやだってさあ、ここを無理に進めたとしても、X11環境をイチから作ることになるんすよ。.Xresourcesとかxinitとか@im=とか、解ってないと相当辛いと思うんですよね。。。(やったことあっても苦労する)
ちなみに僕のbootdebianは、
export img=/mnt/sdcard/external_sd/debian.img
export home_img=/mnt/sdcard/external_sd/root_home.img
:
losetup /dev/block/loop5 $img
losetup /dev/block/loop6 $home_img
:
mount -t ext2 -o noatime,nodiratime /dev/block/loop5 $mnt
mount -t ext2 -o noatime,nodiratime /dev/block/loop6 $mnt/root
ということになっております。4Gじゃ足りなかったの。
debootstrap –second-stage する
いやもうここまで来ちゃえばね。
眺めてるだけ。特に問題なく終了してくれました。
つまり、
まるっとdebianな訳です!やったね!
環境構築
正直ここから先なんてどうでもいいっていうか、もうAndroid関係ないしおまけみたいなもんです。
- とりあえず # apt-get install gnome とかやってみました(←
- sslcert の導入でコケました。$TEMPDIRが定義されていないのが問題だったので、適当に.bashrcこさえました。
mtabが無いおかげでdfコマンドが使えません。ln -s /proc/mounts /etc/mtab という大味な回避策を取ってみました。いいのかこんなんで。
- Xのビデオドライバなんてあるわけないのでvncサーバを使う。
- tightvncserverしか選択肢がないので、それで。
何か残ってた謎のメモ文字列。
# export USER=root # touch /root/.Xresources # vncserver -geometry 800x480 -depth 24 :1 (なんかパスワード訊かれるから適当に) # export DISPLAY=:1 # vncserver -kill :1 (tightvncの止め方)
gnomeは、使えなくはないんだけど重たいので、WindowManagerはXfce4に落ち着きました。あとはまあ、フォント関係(unifont ttf-kochi-gothic ttf-kochi-mincho ttf-vlgothic)導入したり、日本語入力環境整えたり、ですね。
- http://wiki.debian.org/JapaneseEnvironment
- http://www.softel.co.jp/blogs/tech/archives/2589
- http://www.h7.dion.ne.jp/~maruyosi/pasocom/debian_trial_52.html
意外と難しいのが、AndoroidアプリのVNCクライアントですね。試した中では「アンドロイドのVNC」というアプリが一番良かったです。難しさとしては、
- 2ストロークキーが入力されない
- 画面サイズが上手く指定できず全画面表示に出来ない
- マウスでアプリケーションのウインドウを掴む操作(移動、リサイズなど)が出来ない
- localhostへの通信なのに再描画が入ったりストレスを感じる
という類のモノがあると感じました。その中で一番バランスが良かったのが、アンドロイドのVNCという、直訳ロックなソフトでした。このアプリで不満なのは、Shift+Spaceが認識されないことだけです。(僕は10年前のkinput2の時代からimのスイッチをShift+Spaceでやっている。Windows/Mac環境下ではCtrl+SpaceでIMのスイッチをしている)これは、Shift+↑がなぜか認識されるので、とりあえずそっちに振り分けて妥協することにしました。いいの、非常用だし。Alt+Escとかそんな非人道的なキーよりはいいと思う。あれは指がつると思うんだ。
現状のパフォーマンス
結局どんなもんか、見てもらうのが早いでしょうか。
ごめん、ちょっと作業環境が良くなくて、あまりきれいなビデオ撮れなかったんですが、大体どの程度の感覚なのかはつかめるかと思います。
まず、sylpheed を立ち上げています。キータッチが遅いのは、手前に漫画を積んで、その上にビデオカメラを置いているから。1分前後のあたりで受信箱を開いてから少し待ちがありますが、これは3GでIMAPアクセスをしているからです。通信は全てdocomo 3Gです。
1:30あたりから、firefox (iceweasel)を立ち上げています。これは普通に新聞社サイトを閲覧しています。3G待ちの時間が多い感じですね。
最後に、3:20あたりから、OpenOffice.orgを立ち上げている感じです。
正直、sylpheed とfirefox ぐらいなら全然イケちゃうなあ、という感想です。いや、そりゃ、画面の狭さは如何ともし難いものがありますが、体感的にはPentium2-400MHzよりは早いんじゃないだろうか、と思っています。
まとめ
どうですかね。普通のキーボードとマウスがあって。画面こそ狭くて小さいけれども、これぐらいの処理能力があるコンピュータが、常に携帯できるとしたら。結構魅力的じゃないかと思うんです。正直、F-07Cよりこっちの方がいいんじゃないかと思うんです。だって、Windowsモード時にbluetooth使えないって、あんまりだよF-07C。買う気満々だったのに。
キーボードとマウスが重たいじゃん一緒じゃん、という向きもあるかと思うんですが、考えてください。スマホはいずれにせよ常に持ち歩いてますよね。なので、重量増分は0グラム。僕の場合、AC-USB(iPhone用)と、USBケーブルも常に持ち歩いているので、充電分まで含めて重量増分ナシです。で、キーボードがRBK-2000BT3で、重量は電池含まず180g。電池は単4が2本なので、おおよそ20g、それにケースで20gを見てざっくり220gぐらいでしょうか。マウスがiBuffaloのBSMLB06NWHで、重量が18g。電池2本入れて40gぐらいでしょうか。キーボードとマウスの総計で260gを持ち歩くということになります。
いかにVAIO typePが軽いとはいえ、600gはあるんです。それに、ACアダプタが100gちょいでしたか。そのほかケースだケーブルだ、と考えると、なんだかんだで800gぐらいにはなるんじゃないでしょうか。そう考えると、500gぐらいは違うわけですよ。いつも500mlペット一本無駄に持ち歩く感じな訳です。重いって。普通のPC(レツノとかMBAとか)は本体だけで1kgを軽く越えちゃいますからねえ。ACアダプタまで入れたら1.3kgでもまあ軽いんじゃないでしょうか。1kg違うわけです。
もちろん、かなり制約は厳しいです。非力だし画面は狭いし字は小さいし。でも、最低限出来ないと困ることは提供してくれている、そこに価値があると思うんです。繰り返しになりますが、計算機を使うと解ってるなら、最初っからThinkPadなりTypePなり持参すれば済む話なんですよ。まず使わないけど、最悪の場合のために・・・という理由でPCを持ち歩く事情がある人には、理解してもらえるんじゃないかと思っています。
ところで、僕の中ではGalaxy S2いじりはまだ終わっていなくて、以下のネタがあります。
- USBホストケーブルを使って
- SDカードからデジカメ画像を取り込んでflickrに上げてみる
- セルフパワーのHDDをつなげてみる
- 無理だと思うけど手当たり次第USBデバイスをつないでみる
- HDMI出力ケーブルを使って
- OpenOffice.org の Impress、またはAdobe PDFの最大化表示を使ってプレゼンに挑戦
- qemu動いたりしないかなー
- ビデオとかどうでもいいからエミュレートだけ走ってくれればなあ
- XPをRDPサーバにできれば、描画はAndroidアプリのRDPクライアントを使えばいいよね
- まあ実用になるかというと、アレだけど。
特にqemuの件は先に検証してから日記を書きたかったわけですが、いかんせん最近忙しくなってしまい、まとまった時間を取るのが1ヶ月後ぐらいになりそうなため、pendingのまま日記を上げてしまおうと思います。どなたか時間ある方いらっしゃったら、試してみませんか。すごい面白いと思うんですけど、ダメっすかね。Galaxy S2でエロゲの一本でも動かせば、それなりにインパクトのある感じになると思います。
そんなわけで、Galaxy S2、すごくいいです。Android端末、特にdocomoのAndroid端末を使っている人は、spモードメールアプリの遅さにイラッ☆と来てるに違いないと思いますが、Galaxy S2で使うと超快適です。ブラウザもtwiccaもアホみたいに早いです。iPhone3GとiPhone3GSぐらいの違いがあると思います。きっと、来年あたりは、デュアルコアCPUが主流になるんだろうなあと予感せずにはいられない一台でした。あと、スマホに関して言えば、現時点では国産はダメかもしれない。いままでいいなと思った端末は全部洋物な気がしてきました。MEDIAS(N-04C)は、いつになったら2.3に更新してもらえるんだろう。
それではみなさん、よいモバイル・ライフを。
Galaxy S2+HID+Debian = Perfect Handheld Computer(前編)
9月 11th
Galaxy S2買っちゃったー&そっこーでオモチャにしちゃった。
今回は、なんで唐突にGalaxy S2を買っちゃったのか、そこに至る経緯と、Android はそのままに、Debianのユーザランドを動かす話について書くよ。意外と長くなっちゃったので、前編はGalaxy S2(SC-02C)購入に至るまでのアレコレ、後編はSC-02Cを触ってのアレコレ、という構成になっています。
プロローグ
そもそも僕はハンドヘルドコンピュータが大好きなのです。今にして思えば、PC-9801NS/Tを背負って中学校に通ったあたりから僕のモバイルコンピューティングが始まりました。電子手帳やらpremini(初代)やらSigmarion3やらLibretto50やら、大好きなのです。Willcom D4も当然買いました。IS01も当然に乞食しました。
僕がモバイルに求めるのは、
- 何も考えずに常に持ち歩けること。
- いつ何時必要になるかわからない。
- 必要になると最初からわかっているなら、ThinkPadを持っていけばよい話でしかない
- フルコンピュータとして、一通りの事が出来ること。
- ssh接続して一通りのサーバ保守作業
- SDカード読みこんで画像をflickrに上げたりメール添付したりぐらいは出来ること
- 打ち合わせメモをストレスなく取れること
- メールを見られること。添付で付いてきた.xlsぐらいは読めること。
- I/Oは今ならUSB必須。有線LAN、外部モニタ出力は欲しい。RS-232Cあればなお可だがUSBで逃げてもよし。
- フルキーボード必須。
- マウスポインタはトラックポイント(または準ずるもの)が望ましい
- 最低電池駆動1時間
です。
これらの条件を満たすため、現在はVAIO typePを携帯しています。
この子には基本的に何も不満が無いのですが、最近これですら「重たい」と感じるようになってきました。「いつ必要になるか判らないから常時携帯していたい」ので、常に持ち歩いている訳ですが、言い換えると「9割方使わない」わけで、やっぱり使わないとなると、無駄な重量だと感じてしまうのです。歳のせいにしておきたいと思います。
そんな折、IS01でDebianが使える、という記事を見かけました。VNCをXサーバとして使うことで、X11環境も構築できるようです。
IS01でX11 環境の夢を見た
「ほうほうこれは興味深い、では僕も早速・・・」ということで、購入後一度もファームアップしていない自慢のIS01を掘り出してきてですね
MobileHackerzさん謹製「IS01 rooter」を
いやーなんてお手軽なんでしょう。もう、ハックなんて恥ずかしくて呼べないレベルまでお手軽になっちゃってます。ただの設定、ですね。だってもう、本スレのログ読む必要すら無いレベルですよ。
ありがたや。指示通りに操作するだけで何の問題もなくroot取れました。あ、01.00.07 でも問題なく特権取れてます。留意点は、せいぜい、super userは別途導入してあげないといけない、ってぐらいでしょうか。とにかく簡単すぎて、もうあまり記憶がありません。
さて、まあとにかくrootは取れたので、次はdebianのイメージを作って。。。って、このキーボード、パイプ(|)入力できないのかよ!!!!
あー、ごめん、無理。一時的にはソフトキーで逃げれるけど、、、
僕の目的は前述の通り、linuxのシェルぐらい操作出来ないと困るわけで、パイプがソフトキーとか、ちょっと考えたくないです。 ps -ax | grep hoge って入力するのに、ソフトキーボードは、ねえ。大体、外でターミナル開かないといけないってのは、割と平時な状況ではないわけでして、あんまりのんびりもしてられないわけで。
じゃあ、IS01にキーボードだけ外付けすればいいじゃん、と考えるわけです。Bluetoothキーボードをですね・・・って調べてみたら、IS01はHIDをサポートしてないんですね。そうですかそうですか。確かに、標準のキーボードとトラックボール、いいですもんね。外付けキーボードなんていらないですよね。
そんな理由でIS01にDebianを載せるのはやめちゃいました。IS01には、このまま主に車載マルチメディア端末として活躍していただこうと思います。彼がいないと、渋滞したときにNHKニュースすら見られなくて困るのです。
なぜかBluetoothキーボードを買ってMEDIAS N-04Cで活用してみる
ところで、Bluetoothの外付けキーボードを調べていくと、HID非対応、SPPプロファイル対応、という端末でも(無理やり)キーボードを使える製品というのがいくつかあるのですね。その中でも、リュウドのRBK-2000BT3あたりは、僕が使っているMEDIAS N-04Cも(非公式)対応しており、そこそこ安価なようです。打ち合わせメモぐらい取れるようになるといいなーと思い、ぽちったのが先々週?の話です。
到着したら、張り切って使うわけじゃないですか。
そんなわけで打ち合わせメモをMEDIAS N-04Cで取ってみた感想は・・・
- とりあえず使える
- 使えないわけじゃない
- Androidスマホ単体で使う事を考えたら遥かに快適だ
- キータイプに微妙についてこない事がある
- やっぱ打ち合わせメモだけ取れても仕方ないかなあ・・・
というものでした。まあ、概ね予想通りというところですね。入力を実現するためにBlueKeyboard だっけな、そういったアプリを使うのですが、キーボードの切り替えを毎回意識しなければならないのが手間なのと、タイプについてこない事があるのとがストレスかなあ、と感じました。
ここでやめておけば良かった。「ちなみに、HIDをサポートしているスマホって何があるんだろう」と、docomoの公式をつらつらと見てしまったのが悪かった。圧倒的なスペックで話題のGalaxy S2のBluetooth欄には「HID」としっかり書いてあった。そして、Galaxy S2は、既に先達により、rootedだった。この状況で、僕が物欲を抑えることが出来るだろうか。
結論から言うと、3回目のヨドバシカメラで、屈した。だって、デュアルコアだし。
書いてて思ったんですが、わりとココまで全てどーでもいい内容ですね。前後編に分けた方が、見る人にとって優しい気がしてきました。そんなわけで、全六部作は無理ですが、全二部作にしようかと思います。
つまり、後編に続きます。
[perl+web]Tengのソースを読む(1)
9月 8th
次はORMの最近の事情を知りたいのでTeng-0.11(ただし、「> IT'S IN ALPHA QUALITY. IT MAY CHANGE THE API WITHOUT NOTICE.」)。今日はTengクラス周り。
Tengでは Teng->new で得られるオブジェクトを起点に様々な操作を行う。DBやテーブルやカラムの情報を設定するスキーマクラスがデフォルトで「クラス名::Schema」となるようになってるので、Tengを継承してYourModel.pm を作っておくのがよい(そうすれば、YourModel::Schema にスキーマ情報を書ける)。スキーマは Class::Load::load_class を使ってロードされ、instance でインスタンスが作られ保持される。テーブルの情報はスキーマに書かれるので、DBからのロード時に各レコードに対応するオブジェクトを作るには schema->get_table して $tabel->row_class->new するのが基本。
コンストラクタでは他に、起動時のpidを保存している。これは$dbhがforkを跨いで利用されないように監視するため。また、DBへの接続がまだな場合は接続も行われる。このとき、TransactionManager が古い$dbh を握っているので、こいつも一旦破棄する。ここでon_connect_do フィールドにフックを仕掛けておくと、接続後に割り込めそうだが、ドキュメント化はされてないっぽい? on_connect_do にはSQLも直接仕掛けることができる。接続後に_prepare_from_dbh 内では接続後の初期化として Teng::QueryBuilder をDriverに合わせて作成する。Teng::QueryBuilder はまんまSQL::Maker 。
SQLの実行はほとんどの場合_execute メソッドを経由するが、ここでsql_comment パラメータ、またはTENG_SQL_COMMENT があるとスタックを辿って呼び出し元を特定し、SQLのコメントにその情報を追記する。これ、面白い。
insert は SQLMaker 使ってinsert した後、row_class->new して返す。ただし、主キーが指定されていればsingle でSELECT を発行して読み直す。それが鬱陶しければ fast_insert すれば余計なことは一切やらない。insert 時には_insert 内でschema->get_table の持っている情報を使って 値の deflate などを行う。なお、_last_insert_id では各RDBMSごとの差異を吸収しているが、Oracleだけ実装されてないようなので注意。
Teng クラスの持つupdate() やdelete() はバルクアップデートで、更新した件数を返す。do() はDBI->do のラッパーだが、0.11 の実装では_executeを経由しないのでTENG_SQL_COMMENT の恩恵は受けられない。row_class もこれらのメソッドを持つようだが、それは次回以降。
search(), search_named(), single() はsearch_by_sql() のラッパーという構成。single() はlimit => 1 を指定しているだけで実態はsearch()。search_by_sql() では$table の指定を省略された場合でもrow_class と紐づけを行うため、_guess_table_name でSQLからテーブル名を認識させている。ただ、from を拾うだけなのでサブクエリがあるSQLだとしくじるかも?
トランザクションはほぼDBIx::TransactionManager に丸投げ。connection() 時にトランザクション中だとまずいのでエラーを出すコードがあるのと、txn_scope でcaller を適切に詰め直す処理が追加されているくらい。txn_begin でcaller の詰め直しが要らないのかはちょっと疑問。
最後にpluginを読み込むためのload_plugin。+をつけないとTeng::Plugin:: が名前空間のベースになる。プラグインはExporter.pm は使ってないが、@EXPORT にエクスポートするメソッドを指定しておくとload_plugin メソッドがメソッドを生やしてくれる仕組み。load_pluginを経由せずにプラグインをuse しても意味ないし、プラグイン内で@EXPORT_OK などは使えない。
ITで釧路をデベロップするイベント!
9月 6th
LOCAL DEVELOPER DAY 2011 / Fall in KUSHIRO
2011年9月17日土曜日今年は まなぼっと で開催!!
登録がまだの方はお急ぎ下さい!
詳しくは公式サイト http://blog.kushi.ro/ldd11f/ をご覧ください。
LDDミーティングを行いました。
9月 6th
LDD’11/Fall in KUSHIRO 開催まで残すところあと2週間を切りました。
9/6 釧路市民活動センターわっとにてLDDのミーティングを行いました。
当日用意するものやオペレーション、担当を確認、粛々と準備を進めます!
終了後はもちろん地域経済に貢献をして参りました!
ブロックを取るメソッドを理解するとっかかり
9月 6th
ブロックを取るメソッドを理解するとっかかり
たぶん色々間違っているけど、僕は動きの理解としてこういうのをとっかかりにしました。 ツッコミお待ちしています。
- yield = メソッド(def ~ end)を展開してくれるマクロ
- 展開したいメソッド = ブロック
- 展開したいメソッドが受け取る引数 = yield の引数
と考える。
def any @file.open yield @file ensure @file.close end
というメソッドと
any{ |f|
f.do_something
f.do_other_thing
}
というメソッド呼び出しがあるとすると
こんな風に展開されて実行されているイメージ
def any
@file.open
# yield @file だから f=@file
def no_name f=@file # any{ |f|
f.do_something # f.do_something
f.do_otherthing # f.do_otherthing
end # }
ensure
@file.close
end
中で展開するメソッド名は使い捨てなので適当に被らないものが自動でつけられる。
[perl+web]DBIx::TransactionManagerのソースを読む
9月 5th
今日はDBIx::TransactionManager-1.09。1ファイルしかないのでさっくりと。
中では2クラス定義がされていて、DBIx::TransactionManager と DBIx::TransactionManager::ScopeGuard。前者がメインで、後者はスコープガード用のクラス。
txn_begin の中では$dbh->begin_work をしていて、こいつは$dbh->{AutoCommit}を一度無効にして、トランザクションが終わったら自動で$dbh->{AutoCommit} を有効にしてくれるという優れもの。なんだけど、begin_work はネストして呼べないのでそれを可能にするのが TransactionManager のお仕事。active_transactions フィールドがミソになっていて、txn_begin されるごとにここへcaller の情報を貯めていく。このフィールドを見ればネストしているか分かるので、ネストしている場合はbegin_work はしない。
txn_begin へcaller を外から引数として渡せるようになっているのは、TransactionManager のラッパーを作る場合を考慮してのこと。ラッパーを作るときは正しい呼び出し元をcaller パラメータへ渡すようにするとよい。
txn_commit は、ネストの内側で呼ぶと何もしない。ネストの一番外で呼んだときのみ$dbh->commit をする。ネストの途中で txn_rollbackされていると、エラーで落ちてしまう*1。同様にtxn_rollback で実際にrollback が走ってくれるのは、ネストの一番外で呼んだときのみ。
::ScopeGuard は基本的にTransactionManager へ処理を委譲する。が、各スコープに対して2度以上commit やrollback をするとtxn_begin の呼び出し回数と矛盾してしまうので、一度しか効果を及ぼさないようにフラグで管理している。rollback も commit もしないでインスタンスが解放される場合には、DESTROY 内でwarning を出しつつ txn_rollback している。
*1:ネストの深ーいとこで誰かがrollback した場合に、一番外側でcommit ではなくrollback を呼ぶ必要があると思うんだけど、commit しちゃあイカンのだってことをどうやって知るのがいいんだろう。



















