Wander-Z

2009-04-23

ひとりデスマーチ

カテゴリー Hacks — wander-z @ 22:10

懸案のiPhoneアプリの制作は、プログラム部分は8割ほど完成しつつもコンテンツとデザイン周りの整備がだいぶ残っててその作業はまだ骨が折れそう。ていうかAppStoreに登録する手続きがまた大変だとかなんだとか。いずれにしろSDK3.0ベースだからリリースできるのは6月以降なのでまぁぼちぼち進めてるんだけど、そうこうしているうちにGWはすっかり何の予定もなく、いくつかお誘いがありつつも、どうしようかなぁと・・・。ていうか孤高のソロハイカー(笑)のつもりだったんですけど今年はパーティー志向に転向かもしれない。

お休みに遊びにいくためにも、どうすれば効率的にソフトウェアを作れるのかが今の最大の関心事。ていうか基本の骨組み部分は本来は一夜のうちに作ってしまいたい。

そもそもプログラミングがソフトウェアの品質にとって重要になるのは、パフォーマンスチューニングしたり独自のアルゴリズムを実装したりとかしなければいけないときだけで、そうでなければあまりプログラミング自体に手間をかけずサクッと作れることが理想なんだよなぁと。むしろインターフェースや導線の設計、ユーザビリティ、コンテンツの精査なんかのほうがよっぽど重要でそっちに力を入れたい。ていうかプログラミングの腕ではそもそも勝負できないからそういうものは作らないし。

以下、いくつか疑問点。

・ウォーターフォールか?プロトタイピングか?

頭のなかで実現したい方向性は見えていて、でも細かい仕様は漠然としてるんだけど、だいたいのイメージを持ってから作りはじめる。で、大抵は何度も一から作り直すはめになるorz。実際に画面に表示して操作してみるとやっぱりこうすればいいじゃんとか、ここは不自然だなとか、いろいろ出てくる。データモデルもテストデータの段階で想定していたものから違ってくることも多いし、技術上のハードルなんかも想定していなかったものがボロボロ出てきたり、そうこうしているうちにコードが荒れてきて全面的に土台部分から設計見直しを余儀なくされると。

じゃあ最初からかっちり仕様を固めて、細部の画面設計まで落としてから作り始めるか?というとそんなヒマがあったらコードを書いてプロトタイプ動かしながらあれこれ悩んだ方が早いわというか、どうせ一人なんだしとかって思ってしまう。

じゃあ仕様の不確実性を見越して、最初からかなり抽象度の高い設計にしておけばいいんじゃね?とかやってると、コードが複雑になって可読性も悪くなり、扱うファイルもどんどん増えていって手に負えなくなる。ひとりデスマーチなんかしゃれにならんわけで。

・抽象化か?ハードコーディングか?

あらゆるものはオブジェクトであるとかなんとかいってクラス作りまくってサブクラスのサブクラスとかどんどん増えていくクラスバブルに陥るのは愚行だとして、じゃあ一つの汎用的なクラスでif文で分岐させてグリグリとハードコーディングしていくべきなのかというとそれも醜いわけで。どこで抽象化の断を下すのか、それもある程度進んでみないとわからない。やはり最初は手っ取り早くハードコーディングしてまずはモノを動かしつつ、ある程度仕様が固まってきた段階で全面的にリファクタリングをかけてデザインパターンを整備していくんだけど、なんだかムダというか面倒だというか、最初からDRYなコードを書ければ手間も減るんじゃないかとか。

イメージが漠然とした段階から一発で最適なクラス設計ができればいいんだけど、とはいえそうすると最初から設計が構造化されてコードが分散してプロトタイプを初動するまでのコーディング量が増えるからいきなり連結テスト?みたいなことになって崩壊してしまうんじゃないかと。モジュールごとに単体テストしながらとかできればいいんだけどGUI型のイベント駆動のアプリケーションってそういうのどうやるの?ていうかテスト駆動でモジュールごとにちまちま作っていくのが苛立たしいというか性に合わないというか、画面にバーンと表示してくれないとモチベーションが上がらないというか、やはりエンジニアじゃないので、バラバラのモジュールからボトムアップしていく思考体系というよりかは最終的なのUIから発想していく作り方にならざるをえないんだよなぁと。で、一足飛びにUIに到達するにはハードコーディングせざるをえないというジレンマ。

・マイライブラリをどこまで作る?

言語やフレームワークの仕様に絶望して、マイライブラリなんかで拡張整備しはじめると泥沼にハマっていくというか。しかも自分で作ったライブラリの仕様は翌日には忘れてるわけで二度と再利用されなかったり、ドキュメントなんかも残さないし。でもとはいえObjective-Cはあんまりだというか、配列扱うのにfor文を何度も何度もぐりぐり書かないといけないのは耐えられないので、NSArrayにRubyで言うところのfind、map、select、reverse、uniqなんかのメソッドは追加してみたりして、これでループは8割方削減されたのは良しとして、これに味をしめてライブラリ作りに精を出しはじめたりするともう二度と戻って来れなくなるアワワ恐ろしや。。。

・言語とフレームワークの仕様はどこまで把握すべきか?

これを全て把握しておけば早くはなると思うけど、それはどだいムリというもの。そんなものに分けてやる脳内スペースはない!もうここに関してはいかに素早く調査するかという能力が重要というか。でもとはいえある程度は知っておけば有用だとか言って、ポインタのポインタとは何ぞやとか、関数型マクロがどうとか、C言語教書を読みふけりはじめると本来の目的を忘れて心神喪失への道をまっしぐらなわけで。

・名付けの問題

クラスやメソッドに最適な名前をつけるのが本当に難しい。Javaあたりでよく見かけるような冗長な名前付けは本当にカンベンして欲しくて、なるべく手短かで的確かつ整合性のとれた名前をつけたい。そしていったん名付けてしまうと、そのクラスのあり方やふるまいは名前に支配されてしまうようになる。むしろ的確な名前がつけられればコードを付け足すのは雑作もないこと、とか。なんかもう、かなりの思考が名前を考える事に費やされてるような気がする。自動名付けツールみたいなものってないかしら?

プログラミングの素人が一夜にして素晴らしいソフトウェアを書ける画期的な開発手法について知っている方がいればぜし教えてくださいm(_ _)m。

アジャイルはしょせんアジャイルでしかないというか、もっとすごい銀の弾丸をよこせと。

結局はRailsのような完全無欠のフレームワークを待ち望むしかないのかとか、環境構築まで含めて15分でWebアプリを作れるという。

あ、InterfaceBuilder使えばいいんじゃね?とか今思いついた。

2009-04-08

Objective-C雑感

カテゴリー Hacks, Mac/iPhone — wander-z @ 19:58

外遊びにかまけてここ半年ほど放置してきたiPhoneアプリ開発を再開、すっかりハマってインドアな日々を送っていますよ。

連日明け方までコードと取っ組み合いをして、昼間の仕事は居眠り。一度やりはじめると手を離してもしばらくは頭の中をソースコードがぐるぐるしてそれ以外考えられなくなるので他のことに手が付かない。よって外遊びもブログもおろそかになっていますよ。このままだとGWも投入しかねない勢いであります。

めざすリリースは6月を予定。これを新たな財源として来シーズンの買物をするのだ!というのはさておき、本格的に操るのはほぼはじめてのObjective-Cについて。

iPhoneの開発言語であるObjective-Cは、C言語の土台の上にオブジェクト指向の上物を被せたハイブリッド言語なので、Cのソースがそのまま動くとか。しかしCを使わない僕にはまったくありがたさが分からない。以下ダメなところ。

[ x ] ヘッダーファイルとかいちいち用意するのはめんどくさすぎ。全体的にメソッド名とかも冗長すぎる。同じ動的型言語のRubyと比べるとかなり書き込まないといけない印象。

空の配列を作るだけでこれだけ書き込まないといけない。なんてこった!

NSMutableArray* arr = [ NSMutableArray arrayWithObjects: nil ];

Rubyならこれだけ。行末のセミコロンがいらないのもポイント。

arr = []

オブジェクトを作るときも

SampleObject *obj = [ [ [ SampleObject alloc ] init ] autorelease ];

Rubyなら

obj = SampleObject.new

[ x ] ポインタとは何なのか、そんなことみじんも考えたくもない。頼むからエラーでそういう用語を表示しないでほしい。ちょっと*をつけ忘れただけじゃない。

[ x ] 最大のハードルはメモリ管理!release、retain、autorelease。いつそれらのメソッドを呼ぶべきなのかそれを判断できるようになるまでかなりの悪戦苦闘を強いられる。そのうえメモリの状況はブラックボックスなので、最後まで正しいのかどうなのか確信がもてない。property設定でretainになっていないインスタンス変数に代入するときとかハマった。

[ x ] 動的型言語といいつつ、コンパイラはしっかり型チェックしてエラーはいてくるのはうざいのやらありがたいのやら、Rubyのような動的型の鮮やかさがないのはto_sとかto_iみたいな共通変換メソッドがないからか?そもそも変数の型を宣言しなきゃならんとは、idですらめんどくさいわけで。

[ x ] intとNSIntegerとか、Cのプリミティブな型とFoundationのオブジェクト型を行き来するのに変換が必要なのは最初意味分からんかった。もうFoundationを言語仕様に取込んじゃえばいいじゃん。

なんかそのハイブリッドさの恩恵に今のところあずかれていないばかりか、細やかなところでデメリットが多いので、Objective-CからC言語の要素を抜き取った純粋動的型オブジェクト指向言語が欲しい。意味ないかな?「Objective-X」とか。

2009-02-13

Ruby 1.9.1 挫折してみる

カテゴリー Hacks — wander-z @ 16:12

とりあえず1.8の環境は残しつつインストールしてみた。

wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.zip
unzip ruby-1.9.1-p0.zip
cd ruby-1.9.1-p0
./configure –prefix=/usr/local
make
sudo make install

つまづいたところ。

1) 全部のソースコードの$KCODEを削除してマジックコメントとやらを書かないといけない。

2) case/whenの構文でthenのかわりに’:'を使ってたところは全部エラーになった。orz…

3) x = y rescue return nil みたいな構文もエラーになる。rescue以降も必ずxに代入される値が返るようにしないといけないようで、( x = y ) rescue return nil みたいにすればokのようだ。それくらい融通きかしてくれてもいいのに、ガンコになった。

4) gemでRedClothがインストールできなくてそれに依存している各種ライブラリが全滅。

と、ここまででもうやめ。少なくともgemパッケージがひととおり対応してくれないとやってられませんよ。

2009-02-12

そりゃ移行したいけどさ、Ruby 1.9.1

カテゴリー Hacks — wander-z @ 22:38
Tags:

ようやくというかなんというか、1年がかりでやっと1.9系の安定板がリリースされたので自分の環境も移行したいなぁと思いつつ、1.8系とは後方互換がないというので不安も大きい。

ノンプログラマーのバリバリ文系ワーカーですが、定期レポートをコマンド一発で作成したり、データ分析を自動化したり、ニュース記事を横串でクロールしてPDFで加工出力したり、いろいろ社内外のサーバと連動したりと、とにかくRubyの自作ツールに煩わしい定型業務の部分を深くアウトソースしてしまったので移行作業には難儀しそうな予感。

とくに日本語処理系がヤバそうな気がしている。Kconvとか使いまくってるんですけどどうすればいいのかしらん?各種の自作ライブラリもオブジェクト指向のデザインパターンがなんたらで律儀にやってみたりしたからかなり膨らんでしまっていたり、そいつらが相互依存してたりしてもう大変だったり。とはいえミーハーなので古い環境のままでいるのは我慢ができないたちでして、いっそPythonに、とか思いつつもやはり文系ワーカーにとっては新たな言語の学習コストは果てしなく高すぎるわけで、そんなヒマはありませんよ。

そういえばMatz聖下はついにMacを手に入れられたとか。

2009-02-07

アフィリエイトとか (2)

カテゴリー Hacks, Lifelog — wander-z @ 14:29

今日はいい天気ですね、もう絶好の仕事日和でありますよ、なんて言いながら現実逃避したりしてます今日この頃。先日のアフィリエイトネタのアクセスが意外と多いのはみなさんわりと興味津々なのかしらと思ったりして、続いてみます。

楽天のアフィリエイトなのですが、リンク切れするのがかなりモチベーションの低下要因になってたわけなんですけど、今回久しぶりにいろいろと探ってみるとURLからリンクを作成するフォームなんかできたのかー、とか発見しまして、そうするとリンク先を検索結果画面にしておけばリンク切れすることないじゃん、と思いついてみましたよ。でもですね、そうすると商品画像付きのコードは生成してくれないのが難点でありまして、テキストリンクじゃ訴求力ないですしね、うまいこといかないものだなーと思って自前でブックマークレットを作ってみましたよ。

ボタン一発で、画像付きの検索結果アフィリエイトリンクを生成してくれます。

javascript:rakuten_id='09729bba.80c592d9';if(document.URL.match(/^http\:\/\/esearch\.rakuten\.co\.jp\/rms\/sd\/esearch\/vc.*$/)){keyword=document.title.match(new RegExp(decodeURIComponent('^【楽天市場】(.*) の検索結果:通販・インターネットショッピング$'),''))[1];if(imgsrc=document.body.innerHTML.match(/<a\shref="http\:\/\/[a-z]*\.rakuten\.co\.jp.*"\starget="_top"><img\ssrc="(http\:\/\/image\.rakuten\.co\.jp\/wshop\/data\/ws\-mall\-img\/.*\.jpeg|http\:\/\/thumbnail\.image\.rakuten\.co\.jp\/.*)"\sborder=/)){txt='<a href="http://pt.afl.rakuten.co.jp/c/'+rakuten_id+'/?url='+encodeURIComponent(document.URL)+'" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc='+encodeURIComponent(imgsrc[1].replace('img64','img128').replace('64x64','128x128'))+'&amp;m='+encodeURIComponent(imgsrc[1])+'" alt="'+keyword+'" /><br />'+keyword+'</a>';}else{txt='No items found!'};}else{txt='This is not Rakuten search result page!'};alert(txt);

使い方

1) ブラウザのブックマークメニューバー上に新規のブックマークを作成して、URLのところに↑このコードをペタっと貼付けます。rakuten_id=のところは自分のものに書き換えてね。

2) 楽天で商品を検索します。

3) お気に入りの検索結果が得られたら、ブックマークボタンをクリックします。

4) ↓のようなダイアログが現れてリンク作成用のソースコードが表示されるので、にゅるにゅるっとコピーして自分のブログ上にぺたっと貼付けます。

rakuten_afi.png

5) 検索結果の一番上の商品画像を使ったアフィリエイトリンクが現れます。訴求力のある画像が使えて、クリックすると楽天の検索結果画面に飛んでいくので、リンク切れする心配もありません。

GoLite ファントムジャケット
GoLite ファントムジャケット

SafariとFirefoxではいちおう動いたみたいだが、IEでは未検証。コード自体もかなり適当なので不具合もいろいろとあるかと思いますがそこらへんは空気を読んで使っていただければ。

本当はサーバ側と連携して自動的にアップロードまでできれば相当に楽なんですけど、ASP型のブログサービスではそこらへんの工夫を施すのがまわりくどくて面倒だ。

果たして、このブログは大量のアフィリエイトで汚されてしまうのか!?

2009-01-14

CLIの復権 Google Quick Search Box

カテゴリー Hacks — wander-z @ 18:25
Tags: , , , , ,

Google QuickSearchBox

200901141815.jpg

まだMac用だけみたいです。私はこれと同等の機能を持ったQuickSilverをインストールして使ってるんですけどね、衝撃的に使いやすいといいますかもはやこれなしには生きていけません。そのQuickSilverの開発者がGoogleに移って同じものを作っているのがこのQuickSearchBoxらしいのでかなり期待してます。

ようはPCを操作するときに、マウスでウィンドウ開いてアイコンをクリックしてみたいな操作をするのではなく、UnixやMS-DOSさながらにコマンドをバシバシと打ち込んで操作するためのツール。CLI (コマンドライン・インターフェース)を現代のGUI (グラフィカル・ユーザ・インターフェース)なOS上で実現してしまいましょうというものです。WindowsでもSkylightという同種のソフトがあるみたいですね。仕事でもっとPCを快適に操作できないかと思い悩んでいる方にはまさにうってつけのツールでしょう。

だってさ、アプリケーションを起動するときって、アプリケーションフォルダ開いて、アイコンの場所を目で確認して、マウスをぐぐっと動かして、カチカチっとダブルクリックするわけでしょ?ごくたまにやることであればこれでもいいけどさ、もうね毎日何回も何回も同じ動作してるとイライラしてくるわけですよ。

これがCLIだとどうなるかというと、ショートカットキーでさくっとインターフェースを呼び出して、キーボードでアプリの名前の最初の何文字かをブラインドタッチでパタパタっと打ち込むとコレですか?って確認してくれるのでバシッとリターンキーを押すとアプリが起動すると。まぁ実際にやってみないとこの軽快感は分からないと思うんですけど。

で、アプリを起動するだけじゃなくていろいろなことがコマンド操作でできるようになる。Google検索はまさにその一つだし、他にもはてなだとかYouTubeだとかの検索プラグインなんかを入れたりしてる。もちろんPC内のファイル検索にも使えるし、バシッと一発でフォルダを開いたりとかも。あとはブックマークを開くときなんか圧倒的に早い!例えば「yahoo」だとか「mixi」とか入力してバシッとやるとすぐに開くようにしている。いちいちブラウザのメニューから開いて・・・みたいなことをしなくてもいいので、これは超絶に便利です。

その他にもいろいろなアプリと連携してコマンドを流し込める機能があって、単なるアプリケーションランチャーと言うよりももはやOSと呼んでしまってもほどの機能を持ち合わせていますよ。

まぁ最初はとまどうと思います。以前このQuickSilverを身近のMac使い3人に進めましたけど、1人はもう最初からあきらめやる気なし、2人はインストールだけしたけど使いこなせず放置してたのを見かねて使い方を教えてあげたら今はウホウホ言いながら使うようになっていますよ。だまされたと思って使ってみたら、あなたのコンピューティングライフは劇的に変化します。

GUIこそが現代のパーソナルコンピューティングの大前提になってしまっていますが果たして本当なのか?世の多くの単純作業の効率性を考えたらCLIを見直す価値は十分にあるんじゃないかと思ったりしますよ。

WordPress.com Blog.