Get Adobe Flash player

プログラミング

kindle2到着っ!

日本時間の、24日土曜日の早朝に、Amazon.comで注文、現地時間では23日ということになっている。が、なにしろ発送が遅い。結局、現地時間の26日午後3時に発送となった。あれ?こうやって書くとあまり遅い感じがしないな?まぁ、しかしいまどき国内のネットショップなら、当日発送も珍しくないし、在庫があるなら、翌日発送が当たり前みたいになってきている。

とは言うものの、やはり、どうも3Gの設定が外部委託になっているようで、そっちが土日を挟んで動かなかったという感じのようだ。で、結局週明けの現地時間26日午後発送なんだけど、日本時間だと27日の早朝かな?そこからは、恐ろしく早い、なんと日本時間の28日朝には大阪に着いていて、めでたく本日29日の夜に手元に届いたというわけ。

期待通り、画面は光っていないし落ち着いた感じで読みやすいのだが、ページめくりで画面が一瞬グチャっとなるのがおしゃれじゃないっていうのが気になる。もちろん、日本語は出ないっていうか、そもそも日本語のKindle Bookは売ってない。だから、日本語表示はなくてもこれに関しては問題ない。

あと、驚いたというか、どうなんだろうと思っていたのだが、メニューの experimenal の中に、Webブラウザがあって、そこから普通にいろんなwebページを見ることができる。もちろん、日本語は白箱表示となってしまうが、絵とかは普通に表示されるので、英語のページだったら、問題なさそうだ。で、これ接続料は無料なんですけど…。っていうか、これだと逆にいつまでも公式には日本語表示できるようにはならんかも知れんな…って気がしないでもない。

一応、hackingして、日本語フォントデータを組み込んで表示できるようにするパッチはあるようだが、最新のバージョンでは、このhackが動かなくなっているらしい。しかし、こうなると、切に日本語フォントを積んでくれることを祈るなぁ~。

まぁ、がんばってもうちょっとスラスラと英文が読めるようになるのが、いろんな意味で「前向き」ではあるが。一応、英英辞書は使えるので、それでなんとかならんかと…。しかし、英英辞書使っていると、ある単語を辞書で引く、その説明に出てきた単語をまた辞書で引く、さらにその説明に出てきた単語を辞書で引く、さらに…と続いて、そのうち、元の単語に戻って無限ループということになったりしそうだ。

まぁ、まずは最大の目的であった .NETというか、最近のMicrosoft製品の開発パラダイムを包括的にも、さらに.NETでのORマッピングとも言える、LINQそしてEntity Frameworkに関すること、M-V-VMパターンに基づく開発のこととかは、ちょっと掘り下げ気味にお勉強するのが目的なので、それらの本を探して、読んでみなくては。(さすがに小説ほど苦しまないだろうとは思っているのだが)

と、言いつつ、初ダウンロードは、Ursula K. Le Guinの「所有せざる人々」(The Dispossessed)のsampleだったりする。頑張れば読めそうなので、Buyをクリックしちゃおうかと思っていたりするけど(それほどには高くない―$7弱だったと思って、いまamazon.comでみたら$8.39だった、う~む、800円弱かな、今のレートだと)。

コンピュータ関係の書籍は、さすがにちょっと高くて、安いものでも$20~$30で、大体は$35前後のようだから、それほどホイホイと買える値段ではないな。翻訳が出ているものも、特に評価の高いものではあるにはあるが、レビューを見るととにかく翻訳の質が悪いらしい。なら、頑張って原書をって思っちゃうわけで、値段的には1000円ほどお得かなって感じで、それほど劇的に変わるわけではない。あとは、kindleで常に持ち歩けるっていうのは、かなり武器だけど。大体はハードカバーなので、数冊でも持ち歩くなんて考えられないので。

ってわけで、これから、いろいろ気づいたことなど書いていけたらいいなと、思っていたり。

最近の衝動買い

ここのところ、ずいぶんおさまっていたのだが、職場異動のストレスなのか、今度の仕事内容がちょっと楽しみなのでハイになっちゃっているのか、またぞろ衝動買いの病気が発症している。

デザインも悪くない

デザインも悪くない

まずは、あれだけエスプレッソ、エスプレッソと言っていたくせに(実際、出勤の前は今でもエスプレッソは欠かせないが)、珈琲問屋さんからのメールで紹介(というか宣伝なのだが)されていたmelitaのコーヒーメーカーに突然ムラムラと来てしまった。普通のコーヒーメーカーと何が違うかというと、ドリップしたコーヒーがステンレス製の保温ポットに落ちていってくれるところ。この仕組みのおかげで、ポットの下に電熱器とかはなくて、そのため煮出しコーヒーになっちゃうこともないし、自室にそのままポットを持っていっても、しばらくは熱々のコーヒーが楽しめるというところ。

とはいっても、もちろんそんなに保温効果が高いわけではないが、熱々を一気に飲み干すような飲み方はしないので、風味が損なわれない程度に保温してくれるのはかなりありがたい。

さらにちょっと驚いたのは、さすがmelitaってわけなのかどうか、このメーカーで淹れたコーヒーがとってもおいしいってこと。まぁ、ここのところ、コーヒーといえば、カップの上にのっけるティーバッグタイプのものしか、飲んでいなかったから、そう感じるのかもしれないが。

でも、このメーカーが届く直前に買ってきたコーヒーを普通にドリッパーで淹れたものより、同じコーヒーなのに断然おいしかった…。ってことで、とりあえず、ここのところ夕食の後とかに、こいつで淹れて一服するのが、なかなか幸福な一瞬だったりする。

まだ使ってはいない

まだ使ってはいない

続いて、出勤前の十数分の間に思いつきでポチってしまったのが、このEZ-dock。ベアドライブを、そのまま差し込んで使うもの。「裸族のお立ち台」とかと言うのがどっかのメーカーから出てたと思うけど、まぁ、コンセプトはまったく同じ。対応するドライブは3.5″/2.5″のSATAハードディスクドライブで、PCとの接続は、USB/e-SATAに対応。自分は、e-SATAで接続する予定、スピード的にも有利だろうし、usbは貴重な資源だからなるべくふさぎたくない。

前のpcにつないでいた300GBくらいのSATAハードディスクをはずしてきて使用する予定。

その他に、amazonのマーケットプレースで、「夜のピクニック」のインスパイアアルバムとかいうものとか、「.NETのアプリケーションアーキテクチャ―アプリケーションとサービスの設計 (Patterns & practices)」という書籍など、五月雨式に注文しちゃったりして…。

そして、今朝、大物をポチってしまった。ポチるつもりはあまりなくて、決心もできていなかったのだが、ちょっとした思い違いというか「そんなつもりじゃなかったのに~、ま、いいかー」みたいな感じで。もちろん、キャンセルしようと思えば、できた(できる)わけで、それでも「ま、いいか~」と思うのは、やっぱり欲しいレベルが高いのだろう。同じくらいのコストなら、ここのところ、相当に気になっていたものとして

  1. BDプレーヤーとしてのPS3
  2. 出先でのwebビューアーとしてのNetWalker
  3. プロジェクタをつけずにながら観するための液晶モニタ

なんてのが、候補に挙がり続けていて、ずっと「いやいや衝動買いはダメダメ」と言い聞かせていたにもかかわらず、いきなりのダークホースがぁ~。

日本語はでないのよ~

日本語はでないのよ~

本当に突然だぁ~

Cmockeryって何?

仕事がらみなのだが、Cソースのプログラムでいわゆる単体テストについて、話をふられた。そう言えば、実のところ、コーディングで単体テストというのをあまりまじめにやってこなかった。

言い訳がましいけど、テストよりもコーディング段階でロジックミスをつぶすのが基本だったと思う。マシン性能に頼って、トライアンドエラーの繰り返しで、そういうミスというか間違いを追い込んでつぶしていくという、まぁ趣味プログラマにはありがちな手法が中心だったのが、おそらくおもな理由。

しかし、それでもあまり大きなバグを出さないですんできたのは、コーディングスタイルとか、ロジックの方で工夫をして、ロジックミスを見つけやすかったり、出にくかったりする方法を身につけてしまっているからじゃないかな。

あ、もちろん、コードの目視だけでは追い切れなかったり、自身がなかったりするところは、モジュールを切り出して、テストアプリを別に作ったりはしていたが、あくまで、コーディングやレビューでは追い切れないと判断した時だけだった。

んなもんだから、単体テストの手法とかについて相談されてちょっと困ってしまったわけだ。実効性うんぬんの前に、とにかく「やるべきもの」としての単体テストをどう効率的にやるか?っていう相談だから、自分的には、最低限、開発者が必要と思う単体テストをやることで、品質を保てる開発体制がいいのになっていう立場だから(って、そんなダメそうな主張をおおっぴらには口にできないんだけど)…。

で、じゃぁ、今までの開発では、どんなふうに単体テストをしていたのかと聞くと、どうもデバッガで止めて、変数の値とかをすり替えて…みたいなことを、各自にやらせていたらしい…。まぁ、自分もそういう評価をやらんでもないが、どちらかというと、結合テスト段階で、もう単体テストなのか結合テストなのかわけわからんわって時だったような気がする。

そこで、ではCにおける単体テストを支援するツールというか、そういう「便利な何か」はないのか?あるとしたら、どんなものがあるのか?について、調べてみた。そうすると、CUnitみたいな感じの「単体テスト用フレームワーク」っていうのが、いろいろ見つかる。どのページでもとりあえず「単体テスト」とは何かっていう講釈があるので、これは自分にとっては意外と役に立った。今まで「単体テスト」って何か?という命題に対して、明確な「答え」を持っていなかったんだと、いまさら気付かされた、そういう感じ。

で、全部を細かく見ていったわけではないけれど、あるユニットをテストするには、それを組み込む「テストアプリケーション」を作成して、走らせなければならない。そのテストアプリの中で実行された各テストの結果が単体テストの結果セットとなるというのが基本らしい。

で、テストアプリの作成を支援するのが「単体テストフレームワーク」ってことになるようだ。で、あるユニットをテストするには、それを組み込むアプリケーションの他のモジュール群とは完全に分離された環境でテストするのが「筋」なのだそうだ。

しかし、実際のところ、ふつうアプリの一部のルーチンやクラス、モジュールというものは、だいたい他のモジュールの関数や、他のクラスのメソッド、グローバル変数、もちろん、標準や非標準のライブラリにある関数などをコールしているので、「完全に分離された環境」ってできんやろ!と思いがち。

で、「完全に分離された環境」となるテストアプリではそういった外部の関数やメソッドをアプリ内ででっち上げてあげてテストすることになる。まぁ、でっち上げた関数は、引数を受け取って、適当に返値を返してくれればいい。

で、「単体テストフレームワーク」では、この関数でっち上げと、その返値、副作用のでっち上げのコントロールの支援というのが、主な機能になるようだ。もちろん、テスト結果の出力とかの支援もあるだろうが。

そこで、いろいろある中、活きのいいものを選んでちょっと遊んでみようと思って、選んだのが昨年発表されたばかりの、Cmockeryという単体テストフレームワーク。Googleラボで作られたものだそうで、あまりごちゃごちゃしていなさそうで、simple is best.みたいな感じだったのが選択動機の大部分。

だが、残念ながらパッと見では、日本語ドキュメントがないようだ。仕方ないので、Cmockery-Manual を和訳してみた。

結果、Cmockeryに限らず、こういうフレームワークを使って、テストそのものをテストアプリ作成(ともちろん実行だが)としてしまうと、単体テストというのはすなわち「テストアプリの作成」となるし、単体テストの成果物は「単体テストアプリ」とその結果ってことになるわけで、これだと、テスト内容のレビューもやりやすいし、テストの「実際にどういう手順で何をして、結果がどうなったのか?」という、実は「テスト結果表」にはあまり表れない部分とかのあいまいさの残る余地がなくなるわけで、悪くない気がした。というか、まともな開発現場ではこんなことは、とっくに当たり前だったのかもしれないが。

ということで、単体テストについては、Cmockeryを使ったテストアプリの作成と実行ってことにしたら、いいんじゃな~い?って提案してみようかと、まぁ、そんなことをしたり、思ったりしていて写真撮りに行けなかったと…(笑)。

TinyMe – Linux LiveCD ディストロ(1)

言うまでもなくログイン画面。日付が中途半端に日本語化されていたり。

言うまでもなくログイン画面。日付が中途半端に日本語化されていたり。

メモリが512MBしか積まれていない、CPUもセレロンとか…なんて2003年モデルくらいのノートPCの Windows XP上でどうにかLinuxを走らせたいなんて、結構無茶な要求なのはわかっているのだが…。

しかし、もしかするとその願いをかなえてくれるかもしれないLinuxのディストリビューションというか、リマスターというのだそうだが、最近は、なんでかというともともとのディストリビューションは PCLinuxOS というLinuxのディストリビューションなんであって、それを1CD にまとめなおした、ってことだかららしい。すなわち、TinyMe は、1CD サイズの iso ファイルとして配布されているわけ。VMware image もあるのだが、それは、このisoファイルを CD にマウントしてあるだけの仮想マシンイメージだし。なんと、HDDさえない仮想マシンだったりする。

しかし、この TinyMe のすごいところは、そのコンパクトさ。見ての通り、ちゃんとXも走っていて、Disktop もそれなりにちゃんとしている。メモリは128MBの仮想マシンでも特にストレスなく走っていたりする。

が、さすがに、そのままでは、少ない128MBのメモリのうちのそれなりの領域をRAMディスクに使っているだろうし、新たに何かをインストールしても電源を切ると全部消えてしまうというのも悲しい、っていうか、それじゃ実質実用には具せないので、HDDにインストールすることになる。

もちろん、仮想マシンにインストールするので、フリーのVMware Server 1.0.8 のLocal Console で新規の仮想マシンを作成し、それにはHDDを8GBほどつけて、メモリも最初は余裕で512MB程にして、もちろん CDドライブには TinyMeのisoファイルをマウントする。

それでおもむろにCDから起動するようにして、起ちあがった後に「Install to HDD」のアイコンをクリックする…。そうするとWizard風のアプリが起動するのだが、最初HDDを見つけることができずに何度やっても「インストールする領域がない」と怒られてばっかり。結局、TinyMe LiveCD は scsi のドライバを標準では持っていないので、仮想マシンのscsiのHDDを見つけることが出来なかったのが原因だった。

面倒なので、結局 VM Server の仮想マシン側で、IDEのHDDを作成することにして解決。すんなり、HDDにインストールできて、CDなしでもHDDから起動するようになった。

が、もう一息環境を整えたい、まずはそんなに完全でなくていいのだが、そこそこの日本語環境。せめて日本語が表示できるくらいは最低でもないと使えない。ってことで、locale-ja とか、scim や scim-anthy とかをインストール。システムロケールを locale-ja にセットすることで、それなりに日本語化出来てきた。微妙に中途半端というか、おかしなところも多々あるが、とりあえず、そんなに気にならないのでよしとする。

また、Emacs派の自分としては emacs を入れなければならないのだが、どうもこれが思いきり不安定。おそらくライブラリの問題だと思われるが、Ctrl+マウスクリックとかで、すぐSegmentation Fault してしまうので、使いものにならない。とはいえ、Emacsなしで我慢できるわけもなく、次善ではあるが XEmacsを入れてみた。もちろん、XEmacs-Muleも。

こちらは幸か不幸か、emacsほどの不安定さもなく順調に動いている。coding-systemにutf-8系を選べずに最初困ったが、とあるblogで、.xemacs/init.el に

(require 'un-define)
(unless (emacs-version>= 21 5 6)
  (require 'mule-ucs-unicode "unicode"))
(set-coding-category-system 'utf-8 'utf-8)
(set-coding-priority-list '(utf-8))

なんて書いておけばOKとあったので、そのままパクらせてもらった。うちでは emacs-versionの比較の部分がエラーになるので、無条件に require するようにしたけど。

ちなみに XEmacsでの日本語入力は skk を使っていたりする。scimで入力できるようにするのを調べるのが面倒だったというのが一番の理由。っていうか、そもそも可能なのかもよくわからないし。

実は、当初の目的はこれでほぼ達成。この段階で仮想マシンのHDDは約900MBを消費している。しかし、これは自分でも驚いたのだが、この状態の仮想マシンイメージフォルダを、そろそろ主流に躍り出もいいのでは?と思える新興圧縮アーカイバーの「7zip」を使い、「高圧縮」で固めると、なんと200MBほどになってしまう。すごいな、この圧縮率って感じ。まぁ、圧縮に15分ほどかかっちゃうのが難点だけど。

だが、その後でやっぱ symfony の開発環境も欲しいやと思い立った…のだが、なんと、さすが TinyMe、Apache も PHP さえも、もちろん MySQL も入ってない…。

to be continued…

たまにはプログラミングネタ

こんなもんを作ってみたり

こんなもんを作ってみたり

かなり、久しぶりだが、プログラミングネタ。

symfonyによるwebアプリで、郵便番号から住所を引いてくるおまけ機能を実装しようと思って、とりあえず郵便ホームページから、いつもの郵便番号と住所の収められているCSVファイルをゲット。都道府県ごとに別になっているファイルもあるのだが、面倒なので、全国版をもらってきた。

んで、これをもとに
Zip:
id:
zip7: varchar(16)
jusyo: varchar(1024)
jusyo_kana: varchar(1024)

ってな感じのテーブルに格納していきたいわけだが。
まぁ、一応 schema.yml とかは出来上がっているので、$data->loadData(以下略)ができればいいわけ。symfony1.1になって、askeetの内容のまんまではうまくいかないが、1.1に合わせていくらかいじれば、これはすんなり動く。っていうか、その他のテストデータをぶっ込むために、この壁は乗り越え済み。

てことで、あとはcsvファイルからZip:
zip_00000:
zip7: 8200701
jusyo: 福岡県飯塚市長尾
jusyo_kana: フクオカケンイイヅカシナガオ

ってな感じのレコードを全国分作成すればいいだけ…。だけなのだが…。

先ず、csvデータの面倒なところなのだが、その1は住所のカタカナ表記がいまどき半角カナとなっていること。

さらに、都道府県と市町村とそれ以降が三つのフィールドに分けられていて、まぁ、それだけだったら別に問題ないのだが、なんと「それ以降」の部分が76バイトを超えると、複数レコードに分割されるという仕様。分割されたフィールド以外は、同じ値が入っている。で、連続行がどうかって、普通に考えて「7桁郵便番号」がプライマリーキーになっていて、それで判断するんだろうと予想したのだが、見事に裏切ってくれる。だいたいは、これでいいのだが、同じ郵便番号であるにも関わらず、住所が明らかに連続ではないデータが入っている部分がいくつかあるようだ。

なんで、こんな解釈が一意にできないデータを平気で公開できるんだろうなぁ~。とか、思ったりするのだが、まぁ、いいや。とりあえず、その辺を「善きにはからい」ながら、perl でせっせと yml ファイルを吐き出させた。途中、multi-byte<=>single-byte の正規化など、いろいろ最近のperlのコード変換事情なども勉強させてもらいながら。しかし、もうお役御免とも思われる jcode.pl の記事や最近のUnicode::Japanese に記事など、かなり混沌としていて、なかなか大変なことになっているなぁ~というのが率直な感想。

で、郵便番号レコードは12万件ほどあって、上記のようにymlでは1レコードが5行ほどになるので60万行以上の巨大なファイルになる。さすがにこれを1レコードずつpropelのオブジェクトモデルに従って、いちいちハイドレートしながらsave()していくと思いきり時間が、そしてリソースが必要となる。

で、windows上のちょっと古めの環境でやっていた時は、時間はかかったが、特に問題なく終わったのに、こんど同じymlをUbuntu8の環境で実行すると、途中からymlの内容を標準出力に吐き出して、さらにはそれも途中で終わってしまう。

当然、commitされないので、dbの中はからっぽ。読み込ませる yml が小さい分には問題なさそうなので、どうも使用リソースで制限がかかっているくさい。ってことで、つらつら見ていると、/etc/php5/cli/php.ini にResource Limits なんてブロックを発見。ここに、memory_limit = 32M なんて記述がある。ymlだけで16Mあるのに、これで足りるわけがない。んで、これを128MにUP。して再実行。おぉ、標準出力へのお漏らしは止まったぞ!が…、結局しばらくすると、勝手に終了してしまう。最初は、おぉ、えらく早く終わったぞと感心したのだが、mysqlでのぞいてみると、やはりcommitはされていないようだ…。しくしく。

で、再度、さっきのResource Limitsのブロックを見てみると、なんと「max_execution_time」なんてのがあって、これが30とかになっている。もちろん、30秒のことなので、これではお話にならない。こんどはこれを3600に書き直して、再チャレンジ。やはり、時間がかかったが、なんとか12万件のレコードを登録することができた。

以外と、いろんなところではまるなぁ~。としみじみ。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes