satococoa's blog

Ruby, Rails, JavaScript, iOS開発などなど

RubyMotion Conference #inspect 2013

3/28, 29 にベルギーのブリュッセルで開催された RubyMotion Conference #inspect 2013 に参加しました。

英語力にだいぶ不安がある中、頑張って聴き取ってきた内容をメモしたいと思います。

1 日目

A Brave New World: Learning iOS for the Ruby Refugee - Nick Quaranto さん

37signals で働く Nick さんがいかにして RubyMotion で Basecamp for iPhone を作って、どういうことを感じたのか、というお話でした。

Nick さんにとっては Objective-C で開発するということは Xcode というツールを強制されることが苦痛であり、自分の好きなツールを使って自由に開発ができる RubyMotion 無くして Basecamp for iPhone は作れなかっただろう、と話していました。
Interface Builder を見たときに、まるで Visual Basic を思い出すようだったというところで笑いを取っていました。

また、有用な gem や community のリソースの紹介もされました。

Community
Gem

ちなみに質疑応答で「テストは書いているか?」という質問がされ、Basecamp アプリはテストを書いていないそうです。
その後、「テストを書いていますか?」 -> 「書いてないです」というやりとりはほぼ全部の発表後に様式美的に繰り返されることになります。 (1日目後半からは「ノベルティの T シャツはあるのか?」という質問も決まり文句として繰り返されて、笑いを誘っていました。)

RubyMotion でテストを書くときに参考にすべき良いアプリとして、TinyMon というアプリが挙げられました。

Behaviour Driven Motion using Calabash - Karl Krukow さん

Carabash というテスティングフレームワークのお話とデモでした。

会場にその場で挙手を求めてアンケートをとったところ、約 30% の人が RubyMotion のプロジェクトではユニットテストを書いていて、Acceptance Test を書いている人はたったの 2 人でした。

Carabash は Cucumber を利用して受け入れテストを記述するフレームワークで、マルチプラットフォームであることも特徴です。

また、client-server の構成を取っていて、リモートでテストを実行することも可能です。実際にリモートの実機で動作している様子も映像で見せてもらいました。

デモで動かしていたテストのリポジトリは以下です。(RubyMotion-Samples にある Beer アプリに対して受け入れテストを実行しました。) https://github.com/krukow/motion-calabash-inspect2013

Controlling the Real World with RubyMotion - Rich Kilmer さん

bluetooth のお話でした。

bluetooth の出始めの頃のお話から最近の bluetooth4 の仕様の話という歴史をおさらいするところから始まって、Apple 公式のドキュメントには全く記載のない (でもなぜかサンプルコードは配布されている) bluetooth を使って iPhone をサーバとして周囲の機器をスキャンし、その値を受け取ることもできるそうです。

これも実際にデモをされていました。

Elevate your Intent - Matt Green さん

ソフトウェアの設計のお話でした。(RubyMotion に特化した訳ではなく、一般的な概念)

責任の所在をドメインに応じて適宜分散し、小さくてシンプルなクラスを定義することで意図を明確に伝えるソースコードが書けるというお話でした。

Dependencies (依存関係) は複雑さを生み、バグを生み出すので、それをドメインに合うように分離することが大事と説いていました。

結局、依存は厄介なものであって、特に MVC の境界 (サービス層にあたるようなもの) はその依存関係が発生してしまうのでしいですが、それをうまく切り分けてシンプルにし、ドメインに基づいた名前を与え、エラー時には派手にエラーを挙げる (fail loudly) というのがうまく設計するポイントだと話していました。

また、それを支援するライブラリとして Elevate という gem を作って公開されました。

スライド: Elevate Your Intent

Accessibility and RubyMotion - Austin Seraphin

アクセシビリティについての話でした。

生まれつきの全盲である Austin さんの生活がいかにして iPhone の登場によって快適になり、さらに RubyMotion のおかげでいかにソフトウェア開発が容易になったか、というお話をまずはされました。

『カメラを使って色を認識し、その色を音声で教えてくれるアプリを使ってみたけど、何にかざしても “Black!” としか認識されず、最初はアプリが壊れているのかと思ったら、実は夜で電気をつけていなかったために “Black” と認識されていたと気づき、電気をつけた』というエピソードが印象的でした。

Xcode の Interface Builder は全く全盲者にとってはアクセシビリティに乏しく、とても辛いものだそうです。しかし、自分の好きなツールを自由に選択でき、コードで開発ができる RubyMotion はそんな方にも可能性を与えるものとして素晴らしいとのことでした。

その話の後は、実際に開発者はどんな所に気をつけて開発すればいいのか、というところを具体的にレクチャーして頂きました。

スライド: RUBY MOTION & ACCESSIBILITY

Core Data For The Curious Rubyist - Jonathan Penn さん

資料 (PDF): Core Data For The Curious Rubyist

Core Data についてのお話でした。

「Core Data は SQLite の ORM ではなくオブジェクトグラフである」という話から始まり、Core Data を使う上で理解する必要のある以下の 5 つの概念についての説明がありました。

  • Context (NSManagedObjectContext)
  • Object (NSManagedObject)
  • Model (NSManagedObejctModel)
  • StoreCoordinator (NSPersistentStoreCoordinator)
  • FetchedResultsController (NSFetchedResultsController)

特に非同期処理周りはややこしそうですね。。。iOS 5 以上からは parentContext というプロパティができてやりやすくはなったらしいですが。

Core Data のモデルファイルをコードから生成できる Motion Migrate という gem も紹介されました。

あとは RubyMotion 用の Core Data のラッパーとして以下の2つの gem が挙げられました。

The Life and Times of an Object - Josh Ballanco さん

gdb を使った RubyMotion のデバッグの仕方の紹介とデモでした。

RubyMotion では以下のコマンドで dbg が起動します。

$ rake debug=1

また、gdb 上で bt(backtrace), b(breakpoint), p(print), pro(print-ruby-object), x(x/4w と打っていた) などを使って実際のデバッグ風景を見せてくれました。

僕が一番驚いたのは、p (char *)class_getName(<address>) のようにして Objective-C Runtime の関数が呼べることや、(char *)[[$1 keys] inspect] のようにして Ruby のメソッドも呼べてしまうことでした。Ruby 処理系が Objective-C Runtime 上で実装されているおかげなんですね。

最後に MallocStackLoggingNoCompat=YES rake debug=1 でデバッガを起動した後で malloc_history を使ってメモリの確保 / 解放の履歴を見る方法の説明がありました。

Concurrency in RubyMotion: Use the Multicore Luke! - Mateus Armando さん

GCD, NSOperationQueue を使った非同期処理についてのお話でした。

GCD, NSOperationQueue の使い方についての全般的な説明、GCD / NSOperationQueue の比較もありました。

Mateus さんのブログには他にも GCD 関連のわかりやすい記事が掲載されています。

スライド: CONCURRENCY PATTERNS IN RUBYMOTION

Get More From RubyMotion with RubyMine - Dennis Ushakov さん

RubyMine での開発、デバッグなどのデモでした。

デバッグ用途だけで RubyMine を使うというのも割とありな気がします。

Crafting iOS Dev Tools in Redcar - Delisa Mason さん

Ruby で実装された Redcar というエディタの紹介でした。

実際に HTML でプラグインを書くライブコーディングによるデモと、エディタ上でドキュメントを見られたり、デバッグができると言った特徴の説明がありました。

スライド: Crafting iOS Dev Tools in Redcar, the Ruby Editor

以上で 1 日目が終わり、その日の夜は @watson1978 さんとムール貝食べてきました。

2 日目

NSRevolution: How Ruby hackers built the new Objective-C Open Source community - Mattt Thompson さん

Ruby, Objective-C 双方の歴史などを振り返るところから話が始まりました。

Ruby は Smalltalk, perl, eiffel, lisp から強く影響を受けていて、ObjC は Smalltalk, C から影響を (C は影響というよりは、親みたいなものですが) 受けていて、双方ともメッセージパッシングについては Smalltalk の影響が大きいといった感じです。

そして Ruby の影響で Objective-C での開発フローやツールも変わってきているという話に移り、以下のライブラリやツールの紹介がありました。

CocoaPods

Bundler for Objective-C

ReactiveCocoa

Functional Reactive Programming Framework

NUI

Stylesheets for iOS

KIF

Testing framework

Frank

Cucumber for iOS

Cupertino

CLI for Apple Developer Shenzhen, Houston, Venice, Dubai

More Than You Need to Know About CocoaPods - Eloy Duran さん

CocoaPods についての説明と、今後の展開についてのお話でした。

例えば AFNetworking を使おうとした場合、通常は Xcode であちこちをいじらないといけないところ、CocoaPods を使えばとても簡単に使えるというのを実際に動画であらかじめ撮影したデモを見せてもらい、CocoaPods 無しのライブラリのインストールのあまりの煩雑さに会場は大ウケでした。

CocoaPods の .podspec ファイルの運用については、従来は GitHub の Pull Request ベースで人力で運用していたところを、GitHub API と TravisCI API を使って、自動的に Pull Request を出してマージするサーバを作るようにする、というお話がありました。

また、CocoaPods でインストールできるライブラリのドキュメントを集約する CocoaDocs というサイトができました。(Ruby で言うところの RubyDoc.info ですね。

Wrapping iOS in RubyMotion - Clay Allsopp さん

RubyMotion でより Ruby らしくアプリケーションを作るためのラッパーを作るコツのお話でした。

例えば delegate の代わりに callback を使うという例で以下のコードが挙げられていました。

1
2
3
4
# CoreLocation delegate
Location.get do |location|
  p location[:to]
end

Location.get メソッドはブロックをインスタンス変数に入れて保持し、delegate を self として delegate メソッド内でそのブロックを call しているといった具合です。

また、ブロックを書くときも ->(arg1, arg2) {} の記法を使ったり、成功時と失敗時に別々のブロックを渡すような ObjC のメソッドをラップするときには Ruby では一つのブロックを渡すようにしてブロック中で if request.success? みたいにして分岐する方が Ruby らしくなる、という話もありました。

あとは定数や ENUM は Symbol で指定できるようにすると使いやすいね、とか camelCase は snake_case に、演算子のオーバーロード、メタプログラミングなどの話もありましたのでスライドを参照してください。

スライド: Wrapping iOS with RubyMotion

Goodbye IB, Hello Teacup - Colin Gray さん

まずは teacup gem の紹介でした。

Layout と Style というオブジェクトを使ってロジックと見た目を切り離して書くことができます。

また、sweettea も使うことで、Style をより CSS っぽく書くことも可能になります。

この場で実機で UI を Firebug や Chrome の開発者ツールのようにデバッグができる Kiln (今は名前が変わって motion-xray になっています) という gem の発表がありました。

Using BubbleWrap to Quickly Build RubyMotion Apps - Marin Usalj さん

BubbleWrap の各モジュールの紹介と簡単な使い方のお話でした。

Mixing CoffeeScript in RubyMotion apps - Michael Erasmus さん

cross platform の開発のために Web と Native のハイブリッドアプリを作っていて、Web の部分では CoffeeScript を使っているよ、という内容でした。

まだ試しているだけの段階で深いところまではやっていないけれども、ロジックを Web の中の CoffeeScript で書くことで各プラットフォームで再利用できるようにしたい、という狙いだそうです。

Native と CoffeeScript (JavaScript) とのやりとりは iframe を使っているそうです。

Building Interactive Data Visualization Charts - Amit Kumar さん

Data visualization ということで、いくつかのグラフを描画するライブラリについての紹介の後、ご自身で作られた gem の紹介でした。

UIWebView を使うもの
Native
  • Shinobi (有償)
  • iOS:Charts (有償)
  • CorePlot

このうち、Native かつ Open Source の CorePlot のラッパーが motion-plot です。

スライド: RubyMotion - Building Interactive Data Visualization Charts

Cocos2D, an Easier Way - Juan Karam さん

ゲーム開発用のフレームワークである Cocos2D と、それとよく組み合わせて使われる物理演算エンジンの Box2D についてのお話でした。

Box2D は C++ で書かれているためにそのままでは RubyMotion から扱うことが出来ず、Objective-C でラッパーを書いてあげる必要があります。

そのあたりに手をつけ、RubyMotion から扱いやすくした gem がこの場で発表された Joybox です。

ライブコーディングであっという間にゲームを作っていた様子が圧巻でした。

まだまだ未実装だったり、ドキュメントが全然なかったりするので協力者を募集しています。

Let’s Move with CoreMotion - Akshat Paul さん、Abhishek Nalwaya さん

正直、内容をあんまり覚えていません。

iPhone の Prezi アプリでプレゼンをしていたのですが、途中で Push 通知が来たり、電話がかかってきたりして爆笑した記憶が強く。。。

iOS での加速度センサやジャイロスコープの扱いの話でした。

RubyMotion: Past, Present and Future - Laurent Sansonetti さん

Laurent さんのこれまでの半生と、今後の RubyMotion のロードマップについての発表がありました。

ロードマップ
  • Toolchain improvements
  • Code generators
  • Profiler (CPU, Memory)
  • Code reloading (REPL)
  • Static code analysis
  • Tutorials
  • Enterprise support
  • More platforms

この中では、やはり More platforms が気になりますね。(BlackBerry ではないそうです/笑)

あとは Code reloading が便利そう。ちょっとした View の変更とかが再ビルドしなくても確認できるとなるとなかなか嬉しいですね。

次回のカンファレンス、#inspect 2014 は NewYork city か Mexico あたりで開催される予定らしいです。

まとめ

暗い場所だったのでだいぶブレましたが、アフターパーティで Laurent さんと撮りました。

英語力の不足をひしひしと感じる中、なんとか発表の内容を理解しようと必死の2日間でした。なかなか参加者の方とコミュニケーションを取ることも大変だったのですが、最終日のアフターパーティではお酒の勢いを借りて色んな人とお話しできてよかったです。

日本でも 5/29 に RubyMotion Kaigi 2013 というイベントを予定していて、Laurent さんにもしゃべってもらう予定です。

15 年以上ぶりの海外で色々戸惑うところも多かったですが、記念すべき初めてのカンファレンスに参加できてとてもよかったです。

あわせて読みたい: RubyMotion Conference 2013 - Watson’s Blog

Rails Girls Tokyo 2nd に参加しました

LT枠だけでの参加でしたが、Rails Girls Tokyo 2nd に混ぜてもらいました!

参加者の方が継続的に勉強を進められるコミュニティのご紹介として #p4d の宣伝をさせていただきました。

発表資料置いておきます。(スライドのページ にある Download PDF のリンクから PDF をダウンロードすればリンクも動作します。)

【私撰】次のステップとしておすすめの Ruby コミュニティ【おまけ】

個人的に僕がよく顔を出すコミュニティのうち、Rails Girls の参加者にお勧めできるコミュニティを挙げてみます。

昨日の帰り際に @yotii23 さんともお話したのですが、まずは今回のコーチのいるコミュニティ(のコーチがちょうど参加している回)に行ってみるとすんなりとけ込めるのでは。と思います。

コメントは全て僕の主観ですのでご注意を。


RailsGirls, More

公式なので、間違いなくここがおすすめ。参加方法はFBグループかメールで参加者の方に届くそうです。

お問い合わせ先は @yotii23 さんか @publichtml さんでいいのかな?


P4D デザイナー向けプログラム部

LT させてもらったので概要は省略。

会える人


Sendagaya.rb

毎週月曜日に meetup を開催している Ruby コミュニティです。今は新宿で毎週やっているのでアクセスの良さもポイント!

僕がいるときに来てもらえれば普通に Rails も教えたりできます。

紹介スライド -> ボクが東京に来て作ったモノ by @fukajun

会える人


Yokohama.rb

毎月第2土曜日あたりに横浜駅の一つ東京側の東神奈川駅から徒歩10分ほどの場所で開催しています。

東京から参加している人も多く、僕も1時間ちょいかけて通っています。

土曜日開催 & Ruby レシピブック読書会などもあり、Ruby ビギナーにもとても参加しやすい雰囲気がポイントです。

会える人


それぞれのコミュニティですごい人がたくさんいるのですが、失礼ながらとりあえずパッと頭に浮かんだ人だけ書かせていただきました。

では、またどこかのコミュニティでお会いしましょう!

RubyFriendsCamera Has Been Released!

Today I released RubyFriendsCamera and now available on AppStore!

This application is a client app for #RubyFriends.

Using RubyFriendsCamera, you can easily share your photos to twitter with #RubyFriends hashtag.

RubyFriendsCamera is developed with RubyMotion and Pixate.

I’d like to say thank you to @ken_c_lo and @machida. They created a great application icon, splash screen, toolbar icons, background images.

Source code is available here.

Enjoy!


RubyFriendsCamera というアプリケーションをリリースしました。

AppStore からインストールできます。

このアプリは #RubyFriends のクライアントアプリです。

RubyFriendsCamera を使うと簡単に #RubyFriendsCamera ハッシュタグをつけて twitter に写真を UP することができます。

RubyFriendsCamera は RubyMotionPixate を使って開発しています。

突然の依頼にもかかわらず、アイコンや画像などを作っていただいた @ken_c_lo さんと @machida さん、本当にありがとうございました。

ソースコードも公開されています。

たくさんの方に楽しんでいただけると嬉しいです。 (ところで、どなたかAndroid 版作りませんか?仕様や画像など、必要でしたらシェアします。)

RubyMotion のデバッグで NSZombieEnabled を使う

RubyMotion でアプリをつくるとき、デバッグがやはり大変です。

例えば GCD など非同期で実行されるブロック内で参照されるオブジェクトをインスタンス変数に入れていない場合、実際にそのブロックの処理が実行されるときには既にそのオブジェクトが解放されてしまっているというケースがあります。
これが RubyMotion を使う上での一番厄介なハマりどころといえると思います。

そのケースにハマった場合、何も有用なログを残さずにすとんと落ちてしまうことがありとても萎えます。

例えば以下の例はあまりに単純すぎますが、当然アプリがすとんと落ちます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    main = MainController.new
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = main
    @window.makeKeyAndVisible
    true
  end
end

# main_controller.rb
class MainController < UIViewController
  def viewDidLoad
    super
    label = UILabel.new.tap do |l|
      l.frame = [[10, 30], [300, 60]]
      l.text = 'hoge'
    end
    label.release # アプリを落とすために意図的に入れてます。
    view.addSubview(label)
  end
end

実行するとこうなります。

1
2
3
4
5
6
7
8
9
10
11
12
$ rake
     Build ./build/iPhoneSimulator-6.1-Development
   Compile ./app/main_controller.rb
      Link ./build/iPhoneSimulator-6.1-Development/DebugDemo.app/DebugDemo
    Create ./build/iPhoneSimulator-6.1-Development/DebugDemo.dSYM
  Simulate ./build/iPhoneSimulator-6.1-Development/DebugDemo.app
((null))> *** simulator session ended with error: Error Domain=DTiPhoneSimulatorErrorDomain Code=1 "シミュレートした App は終了しました。" UserInfo=0x10014db60 {NSLocalizedDescription=シミュレートした App は終了しました。, DTiPhoneSimulatorUnderlyingErrorCodeKey=-1}
rake aborted!
Command failed with status (1): [DYLD_FRAMEWORK_PATH="/Applications/Xcode.a...]
/Library/RubyMotion/lib/motion/project.rb:101:in `block in <top (required)>'
Tasks: TOP => default => simulator
(See full trace by running task with --trace)

このとき、少なくともどのオブジェクト(どのクラスのインスタンス)にアクセスしようとして落ちたのかがわかるだけでもデバッグの助けになります。

以下のように NSZombieEnabled=YES という環境変数をつけるとその情報を出すことが出来ます。

1
2
3
4
5
6
7
8
9
10
$ NSZombieEnabled=YES rake
     Build ./build/iPhoneSimulator-6.1-Development
  Simulate ./build/iPhoneSimulator-6.1-Development/DebugDemo.app
2013-02-20 20:38:53.449 DebugDemo[21494:c07] *** -[UILabel superview]: message sent to deallocated instance 0xf1c9f40
(main)> *** simulator session ended with error: Error Domain=DTiPhoneSimulatorErrorDomain Code=1 "シミュレートした App  は終了しました。" UserInfo=0x102252cc0 {NSLocalizedDescription=シミュレートした App は終了しました。, DTiPhoneSimulatorUnderlyingErrorCodeKey=-1}
rake aborted!
Command failed with status (1): [DYLD_FRAMEWORK_PATH="/Applications/Xcode.a...]
/Library/RubyMotion/lib/motion/project.rb:101:in `block in <top (required)>'
Tasks: TOP => default => simulator
(See full trace by running task with --trace)

2013-02-20 20:38:53.449 DebugDemo[21494:c07] *** -[UILabel superview]: message sent to deallocated instance 0xf1c9f40 って出ていますよね?これで、UILabelクラスのインスタンスが原因であることがわかります。

NSZombieEnabled については NSZombieEnabled - CocoaDev がわかりやすいです。
ざっくり説明すると、解放されたオブジェクトのクラスを動的に _NSZombie に変更し、そのメモリ領域を解放させないようにしているおかげで上記のような情報をログに出してくれているようです。

あとは Debugging RubyMotion applications のページを参照していただいて、debugオプションを使ってステップ実行したりするとより詳しくデバッグすることが出来ます。

DashDoc を入れてみた

Dash を Sublime Text からワンタッチで引くことができる DashDoc というプラグインを入れてみた。

インストールはいつも通り Package Control からで OK。

デフォルトで ctrl+h が割り当てられてしまっていたので、変更した。
(この方法だと日本語入力時に不具合があります。追記をご参照ください。)

Preferences > Package Settings > DashDoc > Key Bindings - User

1
2
3
4
5
6
[
  { "keys": ["ctrl+h"], "command": "left_delete"},
  { "keys": ["shift+command+h"], "command": "dash_doc"},
  { "keys": ["ctrl+command+h"], "command": "dash_doc",
                            "args": { "syntax_sensitive": "true" } }
]

あと、RubyMotion のドキュメントを直で引きたかったので追加した。 Preferences > Package Settings > DashDoc > Settings - User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "syntax_sensitive": false,
  "syntax_docset_map":
  {
    "ActionScript": "actionscript",
    "C"           : "c",
    "C++"         : "cpp",
    "Clojure"     : "clojure",
    "CSS"         : "css",
    "Erlang"      : "erlang",
    "Groovy"      : "groovy",
    "Haskell"     : "haskell",
    "HTML"        : "html",
    "Java"        : "java7",
    "JavaScript"  : "javascript",
    "Lisp"        : "lisp",
    "Lua"         : "lua",
    "Perl"        : "perl",
    "PHP"         : "php",
    "Python"      : "python2",
    "Rails"       : "rails",
    "Ruby"        : "ruby",
    "Scala"       : "scala",
    "ShellScript" : "manpages",
    "SQL"         : "psql",
    "TCL"         : "tcl",
    "RubyMotion"  : "rubymotion"
  }
}

しばらく使ってみよう。


2013-02-20 追記:

left_deletectrl+h に割り当てると、日本語の入力時におかしなことになってしまいました。具体的には、確定前の日本語を ctrl+h で消したときに次の文字を入力すると復活してしまうという使いにくい状態になってしまいました。

結局、以下のようにしました

Preferences > Package Settings > DashDoc > Key Bindings - Default

1
2
3
4
5
6
# 全部コメントアウト
[
  // { "keys": ["ctrl+h"], "command": "dash_doc"},
  // { "keys": ["ctrl+alt+h"], "command": "dash_doc",
  //                           "args": { "syntax_sensitive": "true" } }
]

Preferences > Package Settings > DashDoc > Key Bindings - User

1
2
3
4
5
[
  { "keys": ["shift+command+h"], "command": "dash_doc"},
  { "keys": ["ctrl+command+h"], "command": "dash_doc",
                            "args": { "syntax_sensitive": "true" } }
]

第4回 Rails Girls, More 勉強会

2/16(土) に万葉さんで開催された第4回 Rails Girls, More 勉強会に僭越ながらコーチ役として参加させていただきました。

勉強会のスタイルは、最初に参加者の方々に今日やりたいことを聞いて、それに合わせてコーチを割り当てて進めていくというなかなか贅沢なスタイル。

この日は参加者のみなさんの進捗が比較的揃っていて、controller, view を経て model へと進む方が多かったです。

コーチ役とはいえ、僕も初参加で何からどう教えていいかよくわかっていませんでしたが、そこは @igaiga555 先生の作られたしっかりした資料があったおかげで特に困ることもなく進めることが出来ました。

資料から脱線した部分

資料にある部分は参加者の方もあとでそちらを見直せばいいと思うので、資料にはなく、僕が脱線して話したことについて少しメモします。

Sublime Text 2

今使っているエディタが使いにくい、という方がいらっしゃったので、Sublime Text 2 をダウンロードしてもらいました。Windows版もあって素敵。

今とても人気のあるエディタの一つで、vim や emacs よりはとっつきやすいエディタですので、エディタ選びに迷っている方は一度使ってみて下さい。有料ですが、お試し期間でも機能制限無し、お試し期間の期限もなし、という太っ腹なエディタです。(気に入ったら買うといいと思います。)

GitHub の使い方

お仕事で GitHub に触れる方もいらっしゃったので、リポジトリの作り方を一通りお見せしました。

「Git, GitHub の勉強会もやれるといいよねー」と、勉強会後に夕食を食べながらコーチ陣で話をしていましたので、そのうちやれるかも?

schema_migrations

たまたま僕が担当させていただいたお二人が SQL をご存知の方だったので、DB に schema_migrations というテーブルができていて、そこに適用済みの migration が記録されているおかげで、適切に rake db:migrate, rake db:rollback できるんですねー、といったお話をしました。

RailsGuides

RailsGuides の中でも、Active Record Query Interface のページを紹介し、コンソール上で order メソッドや where メソッドで遊んでみていただきました。

あと、Getting Started with Rails のページを上から順にざっと、「このセクションにはこんな内容が書いてあって…」といったレベルで説明させていただきました。今後自学自習される場合に、チュートリアルとしてすごくいい題材だと思ったので。

まとめ

初参加だったのでむしろ自分の方が緊張していましたが、とても和やかな雰囲気で楽しく参加させていただきました。

今後も Validation, Relation, テスト, Git など色々盛りだくさんの内容でやっていくようですので、またお手伝いさせていただければ、と思います。

RubyMotion もいつでも教えますよ!

宣伝

RailsGirls を入り口として色んな勉強会へ参加されるようになると、継続的に学習できていいのではと思います。

ということで自分の主催するコミュニティを宣伝して終わります。

P4D(デザイナー向けプログラム部)

僕が主催させていただいているコミュニティで、プログラムもやりたいデザイナさんにプログラムを教えよう、という会です。

最近は嬉しいことにプログラマがデザインを教えていただく逆パターンもよく見るようになってきて、プログラムについてもデザインについても気軽に相談できるコミュニティになりつつあります。

デザイナさんが恒常的に少なめなので、ぜひお気軽にご参加ください。

主に facebook グループ の P4D デザイナー向けプログラム部 でやりとりしてます。

MySQL の Max_allowed_packet を設定

ActiveRecord で Mysql2::Error: MySQL server has gone away と言われて困ったのです。

さっぱり原因がわからずに同僚の @DianthuDia 先生に聞いてみたところ、どうやら大きなデータを MEDIUMTEXT 型のカラムに保存しようとしたときに、以下の MySQL の設定にひっかかって失敗していたらしいです。

1
2
3
4
5
6
7
> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.01 sec)

max_allowed_packet は mysql サーバがクライアントから受け付けることの出来るパケット量の設定です。

1
2
3
4
5
6
# brew で入れた mysql の場合
$ cp /usr/local/Cellar/mysql/5.5.29/support-files/my-small.cnf /usr/local/etc/my.cnf
$ vim /usr/local/etc/my.cnf
# [mysqld] 中に以下を追加
[mysqld]
max_allowed_packet=16M

MySQLを再起動して設定完了です。

再起動無しで設定するには GLOBAL VARIABLES を設定します。

1
2
3
4
5
6
7
8
9
$ mysql -uroot -p
> set global max_allowed_packet = 16 * 1024 * 1024;
> show global variables like 'max_allowed_packet';    
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.01 sec)

大丈夫になったっぽいです。ありがとうございました。
詳しい人が社内にいると安心感がすごい。

東京 Ruby 会議 10 3日目に参加しました

先日の東京 Ruby 会議 10 では大雪のため幻のスピーカーになってしまったのですが、今日はちゃんと発表してきました。

発表内容

RubyFriendsCamera の宣伝

気軽に #RubyFriends するためのアプリを #p4d のメンバーと一緒に作っています。2/23 の Ruby 20周年パーティに間に合うように AppStore でリリースしたいと思っています。

ライブコーディング

rails で scaffold したサーバサイドのデータを CRUD するクライアントアプリを RubyMotion で作りました。

本当はデータの作成 / 更新 / 削除も実装したいと思って、実際に一度最後まで作ってみたりはしていたのですが、さすがに全然たどり着かなかったです。

完成例のコードも公開してありますので参考にしていただければ幸いです。今日は見せられなかった Formotion gem を使った更新フォームも作ってあります。 (実はグダグダになったとき用に完成版も clone して手元に持っていたのです。)

もしこの発表で RubyMotion に興味を持ってくださった方がいらっしゃれば、ぜひお気軽に RubyMotion もくもく会 に遊びに来ていただけると幸いです。

まとめ

スタッフのみなさんはこの短い期間で 3日目の開催となって、準備とか色々大変だったと思います。貴重な発表の機会を頂けてとても感謝しています。

今日発表された他の方の話も、コミュニティの話あり、技術の話あり、スピリチュアルな話あり、とバランスがとれていてとても参考になる話ばかりでしたね。 (Ember.jsもさることながら、あのチャットシステムが気になる!)

参加者の皆様含めて、本当にありがとうございました。今後ともよろしくお願いします。

Qiita 2-day Hackathon

Qiita 2-day Hackathon に参加しました。

このイベントはGitHub APIを使って何らかのアプリケーションを開発しよう!というハッカソンです。

詳しいテーマは当日発表され、「プログラマの問題を解決するサービス」とのことでした。

当日の様子は公式のブログを見ていただくのがいいかなと思います。

スペシャルゲストも登場して盛り上がったQiita 2-day Hackathon総まとめ!

僕の作ったもの

全くアイディアを持たずに参加したので、一日目は GitHub API を一通り眺めてターミナルからcurlhttpclient で叩いてみただけでほとんど終わっちゃいました。

全体的に GitHub API で何が出来るのかを把握できた後で、残り半日くらいで出来そうなものを考えたところ、自分の GitHub のプロフィールページを簡単に表示できて、 QR コードでシェアできるものならばデモまでもっていけそうかな、ということで作ってみました。

リポジトリはこちらです。(READMEも何もなくてちょっと不親切ですが。)

RubyMotion + Pixate です。せっかくここまで作ったので、Twitter、Facebook、GitHubのプロフィールを表示・共有できるアプリに仕上げて無料で公開したいなぁと思っています。

まとめ

GitHub API を使うという点、そして2日間という制限の中で各チーム結構アイディアがかぶったりしたのですが、その中でも「おっ」と思うアプリをつくったチームは本当にすごいなぁと思いました。

特に僕と同じようにプロフィールを交換できるアプリを作ったチームのうち、音でデータのやりとりを実装されたチームがいて、その発想は全くなかったので驚きました。

音とか光、使ってみたいなぁ。。。

とても刺激になりました。

Dash で Gem のドキュメントを参照する

こんな話から、インストールした gem のドキュメントが見られる風な Docset が Dash にあったのを思い出してちょっと調べてみました。

以下の手順に沿ってちょこちょこっと設定をすると、RDoc で生成された gem のドキュメントが見られました。

設定方法

  1. Preferences… -> Downloads から “Ruby Installed Gems” というdocsetをインストール
  2. Preferences… -> Docsets に Ruby Gems という docset があるので、その一番右にあるギヤのボタンからrdocが置かれているパスを設定する。gem env gempath というコマンドで rdoc の置かれるパスがわかります。
  3. “index” ボタンを押すと Dash で使えるようになります。

gem をインストールするときには .gemrc なりオプションなりで --no-ri --no-rdoc を指定している人が多いと思います。以下のコマンドで任意の gem の rdoc を生成することが出来ます。

1
$ gem rdoc --rdoc bubble-wrap

結果

こんな感じです。

ついでに

横道にそれますが gem に限るのでしたら yard もおすすめです。

1
2
$ gem install yard
$ yard server --gems

gem rdoc コマンドで rdoc を生成しておく必要もありません。