Hatena::ブログ(Diary)

ガーデンパス/迷子の記録

 

20120531

はてなブログ

はてなブログに本ダイアリーを移行できるようになったので、

http://mint.hateblo.jp/

に移動しました。

20120522

REPL での編集を motion-live で楽にする

RubyMotion では、rake コマンドでエミュレータを起動するとコンソール側は対話モード(REPL)になり、あるラベルの背景色を黄色から赤色に変えるといったことをシミュレータの再起動なしで可能にする。

どんな風に使うのかというと、例えばシミュレータ上のラベルを command キーを押下しつつクリックすると、REPL での文脈が、クリックして選択したラベルの文脈になるので(self がラベルとして生成されたインスタンスになる)、self.textColor = UIColor.redColor とすれば文字が赤色になる。

これはとても便利だし、RubyMotion の目玉機能だと思うのだけれど、如何せん、コンソールでの編集がめんどくさい。そこで「自分の好きなエディタで編集できたらいいのに」という要望を叶えたのが motion-live になる。

使用方法はリンク先に書いてあるとおり、gem で motion-live をインストールし、プロジェクトの Rakefile で require "motion-live" とする。その後、プロジェクトのルートに LiveScratchpad.rb というものを作成し、rake live でシミュレータを起動すればライブ編集が可能になる。

ラベルの文字色を赤色に変える例では、変更したいラベルを選択して、LiveScratchpad.rb に self.textColor = UIColor.redColor と書いて保存すると REPL に編集した内容が送信・評価される。青色に変えたかったらエディタで red の部分を blue に編集して保存すれば、また送信されて評価される。

LiveScratchpad.rb は diff がとられていて、編集していない部分は送信されないようになっている。編集する毎に LiveScratchpad.rb の内容を全部送信したいのだったら、マジックコメントとして #nodiff をファイルの先頭に書いておけば良い。

これで REPL を使ってボタンの位置調整とかをしやすくなるし、すごく便利だと思う。

テストで色付け

RubyMotion のテストを色付けできるライブラリ rm-redgreen は Github でクローンできるが、gem 化したので

$ gem install motion-redgreen

でインストールできる。インストール後、Rakefile 等で require するだけで使える。

20120519

tmux 上でエミュレータが起動しない

tmux 上で iPhone エミュレータが起動しないのは、ノーパッチの tmux / screen でペーストボードにアクセスできないかららしい。メーリングリストでも回ってきていたけど、reattach-to-user-namespace というものをインストールして、rake を reattach-to-user-namespace -l rake で起動すればエミュレータが起動する。

20120517

OtaQ iPhone クライアント

RubyMotion での習作、そして初めての iPhone アプリとしてこの前作ったクイズゲーム OtaQ の iPhone 版クライアントを作ってみた。

https://github.com/jewel12/MobileOtaQ

見た目も相当ひどいし、コードも目を背けたくなるけど、動くところまで動いたので github に上げておく。http 通信とか JSON のパースとか相当にだるかったので BubbleWrapper を使わせてもらった。便利。

インターフェース周りでもいろんなライブラリが出てるみたいなので、それらの練習の場として MobileOtaQ をリファクタリングしていきたい。あと、他の人がどんなテスト書いてるのかも興味ある。

次はマーケットに登録できるように、前から作りたかったタイマーアプリを作る。

20120515

iOS SDK のドキュメントを MacRuby での形式で表示

Chrome を使っている人は↓にある macruby-docs.user.js をインストールすると良い。

https://github.com/joakimk/macruby-docs-js

例えばNSStringだと、メソッドの説明のところに MacRuby という箇所が出てくるのでそれを読む。便利。

ちょっといじって強調表示とかすると良いかも。

20120509

Timer サンプルを読む

なかなかアクティベートされなく、手持ち無沙汰なのでとりあえずサンプルを読んでみる(https://github.com/HipByte/RubyMotionSamples)。今日読んだのは Timer というストップウォッチアプリ。実際に動かしていろいろ試しているわけじゃないので、自信がない。

Timer/app/app_delegate.rb

application:didFinishLaunchingWithOptions 起動完了時の動作

UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)

UIWindow alloc] initWithFrame:UIScreen mainScreen] bounds?;

に対応する。

アプリケーションのウィンドウはUIWindowのインスタンスで表現できる。Objective-CではClass alloc] init]でインスタンスを生成する([Class new]でもOK)。allocでメモリ領域を確保し、initで初期化だが、initは引数を取らない。引数を渡せるイニシャライザが欲しかったら、引数付きのイニシャライザを作る必要がある(指定イニシャライザ)。

initWithFrameでは画面サイズを渡す必要があり、UIScreen.mainScreen.boundsで取得できる。ここで生成したウィンドウにボタン等のビューを追加していく形で画面に表示していく。

@window.rootViewController = TimerController.alloc.init

TimerControllerはUIViewControllerを継承している。UIViewControllerはビューの管理を行う。Viewガイドによれば、ビューは階層構造を持っており、ビューコントローラがビューの表示を行う。ウィンドウはルートビューオブジェクトを1つ持っているので、これを制御する rootViewControlleを設定してあげる必要がある。それにしてもいちいち.alloc.initと書くのは野暮ったい。

@window.makeKeyAndVisible

メインとなるウィンドウを作成して描画する。

ビューコントローラの管理サイクル

Viewガイドによると、ビューの管理ではロードサイクルとアンロードサイクルという2つのサイクルが独立して発生する。コントローラが管理するビューオブジェクトが必要になった時、オブジェクトがメモリ内に存在しない場合にロードサイクルが発生する。

ロードサイクルでは、ビューがメモリ内に存在しない場合、loadViewメソッドを呼び出し、ビューをロードする。ロード時に実行する処理として、viewDidLoadメソッドが読み出される。

メモリ不足によりビューを解放する必要が出てくるとアンロードサイクルが発生する。ロードサイクルと同様に、ビューの開放と開放した後の処理が呼び出される。

Timer/app/timer_controller.rb

viewDidLoad でロード時に実行する処理を記述

UILabelは文字を表示させる時に私用する。UILabelはUIViewを継承しているので @state.frameで位置と大きさを指定できる。このストップウォッチ以外のUILabelの例を見るとCGRectでサイズをしているけど、ここでは配列で指定されている。このメソッドでのviewはビューコントローラが担当しているビュー、即ちウィンドウ。

view.addSubviewでラベルを追加。

setTitleでボタンの文字をセットする。forStateにはUIControlStateを設定する。addTargetでイベントリスナをセットする。1個目の引数がアクションメッセージを送る対象、:actionはイベントが発生した時の処理、:forControlEventsは補足するイベント。

actionTapped

NSObjectはルートクラス。NeXTSTEPの略らしい。@timerが存在していたらタイマーを止めて、自身をnilにする。scheduledTimerWithTimeIntervalの1番目の引数が繰り返しの時間(秒)。

@action.selectedのデフォルトはfalse

timerFired

0.1秒ごとに呼び出される。

String#%でフォーマットされた文字列が返ってくるんですね。知らなかった。

Timer/spec/main_spec.rb

RubyMotionはBaconというテストフレームワークを使用する。まんまRSpec。 UIApplication.sharedApplicationはアプリケーションインスタンスで、今回はウィンドウがひとつであるかを確認している。

RubyMotion における Objective-C インスタンスメソッドのモデリング

先日、RubyMotion を買った。iOS SDK を触ったことはないけど、ドキュメントを見て適当に Ruby のコードにらくらく変換できるかなという淡い期待があった。そんなことは無かったけど、楽しくやっていきたい。

メソッドはオブジェクトに対するメッセージとされ、[Object message];みたいな感じで呼び出しできる。角括弧での記法によるメソッド呼び出しが面白いのは置いといて、メッセージセレクタが独特だと思った。

motion create App でデフォルトで生成される AppDelegate のインスタンスメソッドである

application(application, didFinishLaunchingWithOptions:launchOptions)

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

と定義されているみたい。 application で始まる同名メソッドがたくさん定義されているのがよく分からなくて、渋々 Objective-C の入門サイトを見ていたら、この定義の解釈は

application_didFinishLaunchingWithOptions( application, launchOptions )

とすると分かりやすいみたいだ(http://blog.livedoor.jp/faulist/archives/904887.html)。

Objective-C におけるメッセージの送信(呼び出し?)はメッセージ式を使って

[string drawAtPoint:point withFont:font];

と書く。先の解釈だと Ruby では string.drawAtPoint_withFont( point, font ) みたいなことになりそうだけど、 RubyMotion ではメッセージ式に似せたモデリングをしており、

string.drawAtPoint(point, withFont:font)

となる。send を使って

string.send(:'drawAtPoint:withFont:', point, font)

とすることもできるみたいだ。メッセージを送信してる感覚が増す。面白い。

20120506

情熱プログラマー - Chad Fowler

プログラマーの意識が高〜くなる本。効果は絶大です。

以下は気になった部分とコメント。

自分を製品とみなす「市場を選ぶ」「製品に投資する」「実行に移す」「製品を売り込む」

一番下手くそになる

初心を忘れないとかの心持ちの話ではなく、実際に自分が最も下手くそと言える場に身を置こうという話オープンソースプロジェクトに参加すると手軽に下手くそになれる。学生とかはバグフィックスで手っ取り早く修行できて良いよなあという話をどっかでした記憶がある。

新しいプログラミング言語を学ぼう

新しいことを知るのは楽しいだけでなく、市場の拡大と投資になる。今まで使用してきたプログラミング言語とは発想や文化の違うものを選ぶ。自分だったら HaskellErlang あたりだろう。

「継続的日和見主義者でいる」僕は、自分自身を自分のスキルによって定義したことはない。いつも、自分がやってきたことは何か、次にやりたいことは何かによって定義してきた。スキルは目的を達成するための手段のひとつにすぎない。

ビジネスの仕組みを学ぶ

自分がどのように企業に関わっているのか分かるようになる。

ビジネスの仕組みを知りもしないで、ビジネスが利益を上げるために想像力を働かせて協力できるだろうか?

「デイリーヒット」報告できる成果を毎日あげろ

先ず、自分が何をして「どういう結果」が出たのか知ることが必要。何をすれば給料が上がるのか分かるだけでなく、足踏みをしなくなる。目的を分割して俯瞰し、全体像を把握するということにも繋がる。

「今の職務を全力で」

夢ばかり見ていると取り逃がしてしまう。いつも大きなことばかり追いかけていると、自分の仕事の価値を照らしてくれる日々の小さな幸せが目に入らなくなる。

「今日どれだけうまく仕事ができるか?」

どんな楽しくないことでもやらなければならない。そういう時は「今日はうまく仕事をこなしてみせる」という気持ちの切り替えができると良い。

「バケツ一杯の水の中の小石ひとつ」

現状に満足せず、いつでも自分は取り替えのきく存在であるという意識を持っていると、自己に投資したくなる。流速の速いIT業界では実際に取り替えがきくことが多い。

「8時間燃焼」

短期時間の集中力だけで一日の仕事が大きく進んだという感覚はよくある。決めた時間に詰め込みを課すことで、時間の質を高める。そのためには一日の計画を入念に立てる必要がある。

「できないことはできないとはっきり言う」

身に染みる話。確信のない「できます」は嘘になることが多く、相手と自分を失望させる。抽象的な事柄への問いに「できます」と答えるのではなく、具体的に何ができるのかという話をすれば良さそう。

「世界を変えよう」

流速の速いこの業界で生きていくためには自分を変える必要があるが、周りの環境も変わることが望ましいこともある。環境を自分の手で変えたいのなら、信念を持ち、どういう理由でこれをやっているのかということを周りにアピールしていかないといけない。

「自分のブランドを築こう」

自分のブランドを築くためには認知と尊敬が必要になる。その話は置いといて、そのブランドが大きかろうが小さかろうが、ブランドを傷つけるのは自分自身であることを忘れない。

「自分のロードマップを作る」

知っておくと良いことはいくらでもあるけど、時間には限りがある。ノウハウの効果的な組み合わせ方は必ず存在する。ちゃんとしたロードマップのために、今一度、自分のやってきたこと、やることについて考えてみると良い。「やること」ではなく、「やりたいこと」については素直に実行すれば良いと思う。

「昨日よりよく」

20120505

iPhone Developer Program へのアクティベーション

GW 後半のお遊びにと RubyMotion を買ってチュートリアル通りに動かしていたら、エミュレータでの実行でアプリが動かない。 provisioning profile が無いからみたいなので、 iPhone Developer Program へ登録。RubyMotion とあわせて 2万円……

噂通り、日本語名の関係でアクティベーションに失敗するのでコンタクトをとっているところ。多くの人が引っかかってるのにどうにかならないものかな。ノリで動いているデベロッパがお金払った後に冷静になって賢者モードになったところでどうしようもない。

小さな行動への具体性

なまけ癖を一瞬でなくすためには脳を具体的モードに切り替えようという記事が人気。

Blogger Alliance | 404 Not Found

行動の捉え方として具体的に捉えるというのはやる気云々の前に効果的だろうけど、じゃあ具体的に「具体的に捉える」にはどうすればよいかという枠組みがあると良さそう。アジャイルサムライにあるインセプションデッキがそういう枠組みだろうけど、小さな行動に対しての具体性には少し大げさすぎる。小さな行動というのはGTDとかであるような、あるひとかたまりの目的・行動をもう少し小分けしたものとする。小さな行動の具体性を高める枠組みとして、以下のようなものを考えてみた。

[今の行動]をしてから、[目的]ために[行動]しよう。終わったら[次の行動]をしよう。

[今の行動]は[行動]をするタイミングを明確にして、[目的]が動機付けとなる。[次の行動]では休憩をする。具体的には

「次の行動を具体的に考えることをしてから、Section 12 の英単語を今日中に全部覚えるために 20 単語記憶しよう。終わったらケーキを食べよう。」

そして休憩中に次の行動について考えると、「ケーキを食べてから〜」という文になる。ウォーリー探すのも、こんな文を考えるのも、結局は具体的モードに切り替えるための儀式みたいなものだと思う。

AquaSKKを使う

SKKはちょっと使っただけですが、慣れると小気味良い。NLPの人が SKK を使うなんてとよく聞くけど、使用感などの議論が抜けている気がする(普通はGoogle IME とかの方が使いやすい……)。

以下のことを覚えておくと便利っぽい

    • スラッシュで変換モードに入ると、半角英字入力に切り替えなくても入力できる
    • カタカナを入力したい時はカタカナ入力モードに入らなくても、変換モードで単語を入力した後、 q を入力で変換できる
    • 三点リーダーは z. で打てる(よく使うので便利)

20120504

Pry で次のブレークポイント

binding.pry でデバッグするとき、次のブレークポイントへ飛ぶみたいなことをする時は、 pry-nav を読みこめば良い。step, next, continue が利用できるようになる。

いつも忘れる。

20120429

Niigata.pm tech talk #1 に行ったです

こんばんは。 4/28 に行われた Niigata.pm tech talk #1 に参加して発表してきました。

発表内容は OtaQ (http://otaq.jewelve.com/) という自動生成の4択クイズゲームです。普段は Perl を使わないのですが、単語のスコアを計算するところだけ Perl で作ることで発表ノルマをクリアし、無理やり発表してきました。

Niigata.pm とは別にギークハウス新潟で無限カレーなるものをやっていたので、id:aokcub とグリーンカレーを食べて美味いと唸ってきました。人間がたくさんいたのでとても楽しかったです。GW中はずっとカレーを作っているみたいなので、近場の人は行ってみると美味しい思いができます(http://atnd.org/events/28227)。

以下は発表内容の感想。

@hayajo さん

Perl のモダンな開発環境について。手軽に開発環境について知りたい初心者には美味しい発表でありがたかったです。 Mojolicious 良さそう。

@civic さん

新潟技術者勉強会(NDS)代表の方で、SeatNext(http://www.seatnext.com/) の自作アプリについて発表されていました。

@isiduca さん

ライブラリ間で Cookie jar の取り扱い方が違うのでどうしようという内容でした。スクレイパを作ったりすることがよくあるので、息抜きに Perl で作ってみるのも良さそう。

@CLCLCL さん

クロネコヤマトの配達状況が分かるライブラリ WebService::KuronekoYamato について。適当な番号を入れて配達完了だったら最強みたいなゲームが良さそう。

@hide_o_55 さん

カジュアルでとても良かった。node.js 関連のライブラリをたくさん作ってて素晴らしい。

@aokcub さん

なんか機械が喋ってた。

@neko_gata_sさん

Emacs の環境について。yasnipet はあんまり使わないのですが、おまじないが多いと便利そう。

という感じです。発表も面白いし、飲み会も楽しかったです。主催者の @neko_gata_s さんに感謝!これからも続けていくみたいなので、近隣の方はカジュアルに参加すると楽しいと思います。

OtaQ
View more presentations from jewel12

日本語 Wikipedia のダンプデータから TF-IDF を計算するやつ: https://github.com/jewel12/Wikipedia-TFIDF-Perl

 

Written by jewel12