第3回MetaNightに参加してきました

この記事はよちよち.rb Advent Calendar 2014 4日目の記事です。
昨日は@katorieさんによる第47回ミートアップの様子も交えつつ、よちよち.rbをご紹介したい #yochiyochirbでした。

@katorieさんは、仕事は非エンジニアであるにも関わらず、誰よりもよちよち.rbや各種勉強会に参加してメキメキ成長されている方で、凄まじい勢いに日々刺激を受けております。 (よちよち.rbの参加メンバーについて、詳しくはは2日目の@odaily_jpさんの記事で!)

私も普段よちよち.rbに参加させて頂いていますが、最近は同じくよちよちメンバーである@ta1kt0meと@5t111111が開催している【MetaNight:Metaprogramming Ruby 2 読書会】にも参加していますので、第3回MetaNightの内容について簡単に纏めます

やっていること

『Metaprogramming Ruby 2』という英語の技術書の読書会です。

範囲を決めて各自で黙読しつつ、Trelloに分からなかった英語表現や技術内容について記載しておいて、時間が来たら各自内容をシェアしつつディスカッションしています。

おもしろいところ

第3回の内容(抜粋)

読書範囲

The Problem with Open Classes から モンキーパッチのコラムまで

話題になったこと

  • perplexingってconfusingとかで良いんじゃないの(ニュアンスどう違うんだろう)
  • derogatoryって言われてみれば否定的な意味な気がするけど、次に否定的だと思える自信が無い
  • piqueの読み方は(カタカナ英語で)「ピーク」
  • モンキーパッチは昔はゴリラパッチと呼ばれていた(Wikipediaより)
  • Scrumとアジャイルはどう違うのか
  • tapの使い方
  • エディタ何使ってますか
  • 配列でとっさにgrepを使えるBillは出来るやつ感がある
  • replaceは破壊的メソッド。Silverによく出る
  • Refinementsは2.0で試験導入、2.1から正式導入。Goldで出そう。

感想

毎回、本の内容もおもしろいんですが、英語の和訳(ニュアンス)を色々言い合ったり、雑談が弾むのが楽しいです。

これは『Metaprogramming Ruby 2』というRubyの楽しさが盛りだくさんの本を使っているところが絶妙なのかなと考えています。
いつもお世話になってるRails Turorialも英語で読むとまた違った楽しさがあるような予感もします。

あと、今回は新しい参加者の方もいらっしゃって、また違った観点での話も弾み、良い感じでした。

メタプログラミングRuby

メタプログラミングRuby

初めてのGem作りの思い出メモ

完全社内限定利用であるものの、初めてGemを作ったので、その内容をメモします

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

参考資料

作業のゴール

BitbucketにGemファイルをおいて、bundlerで使えるようにする

やったこと

パーフェクトRuby13章の「gemパッケージの作り方」を見ながら順次実施しました。

  1. gemspecファイルの記述。それほど迷う部分はありませんでしたが、設定項目がたくさんあるので、何か不足しているのでは、という不安と常に戦っていました。ただ、最初から公にはしないつもりだったので、当たって砕けろの精神でもりもり進めました。
  2. gemパッケージの作成。元々別で書いたコードをGem化する形だったので、コピペで完了。
  3. Rakeタスクの実行。rake buildのみ実行しました。
  4. gemの公開。ここでやり方が分からなくてちょっと調べましたが、結果、Bitbucketにリポジトリを作ってそこにPushで完了。
  5. 動作確認。bundle install でちゃんとgemとして使えることを確認。感動。
  6. Gemの内容を修正して、Bitbucketに再Push。バージョンを変えないとbundle updateしても修正内容が反映されませんでした。

思ったこと

  • bundle gemのコマンドで雛形が作れるのですが、色々最初から書いてもらえていて、必要最低限のコードだけ書けば大丈夫だよ、という印象を受けました。最近bundle initから始める自分の手作業を続けていたので、人の優しさに触れた感じがしました。
  • .gitignoreに最初からGitに登録したくないファイル、フォルダが登録されてる
  • READMEに最初から基本的な内容が書かれている
  • パッケージ用のファイルとかバージョン管理用のファイルとか用意されている
  • gemspecに書く内容がいまいち自信が持てなかったので、これは、人様のgemspecで勉強させて頂くのが良さそう
  • プロジェクトフォルダに色々コードを書いて、rake buildも出来たものの、その後のリリース作業がrake releaseだと本家に行ってしまいそうだったので、Bitbucketにだけアップする方法が分からず、Google先生に質問しました。結果、単にリポジトリ作ってpushするだけで、特別な手順は一切必要ありませんでした。(Gemfileで指定するだけ)
  • これまで「Gemを作ろう」みたいなLTを何度か聞かせて頂いて、作りたいとは思っていたものの、やっぱり難しそうなイメージがあって二の足を踏んでました。でも、実際やってみると、思ってた以上に簡単に出来て、かつ、自分のコードがgemとして使える感動が思った以上に大きいので、作ったこと無い方は是非一度挑戦されると良いと思いました。(私も1個作っただけで偉そうですが)

今後やりたいこと

一度Gemを作るとやり方分かった感が半端ないものの、gemspecの中身とか一般公開に向けては不安なところもあるので、しっかりと復習をして、次は世のため人のためにもなるような俺得gemを作りたいと思います。

よちよち.rbの第22.5回(もくもく会)に参加しました

今週もよちよち.rbに参加してきました。今週は月に一度のもくもく会ということで22.5回となっています。よちよち.rbのレギュラー回は初参加の第7回以降皆勤を続けていますが、イレギュラー回に参加したのは初めてでした。(たまたま休む日がいつもイレギュラーの日だっただけですが)

やったこと

今回はもくもく会ということで、やりたいことを自分で決めてもくもくと勉強することになっていました。いくつかやりたいことはあったのですが、Vimの師と仰ぐto0526先生が隣だったので、途中で止まっていた.vimrcの整理をすることにしました。

ちなみに、他の方々は、「Railsチュートリアルの復習」「Git」「Haml」「Ruby認定試験の勉強」「Rack」「自宅学習」などをされているようでした。

.vimrcの整理

とにかく昔々に作った.vimrcが乱れていたので、それの整理をしたかったのと、いくつか便利そうなプラグインは使えるようになりたい、ということで色々触りました。

unite

ファイルを便利に開けるuniteを使えるようになりたい、ということで、キーマッピングを設定しつつ確認しました。バッファーとかまだまだ使えていない感が強いですが、日々使って身につけていきたいと思います。

unite-rails

Railsを書くならunite-railsということで、こちらもキーマッピングを設定しつつ動作確認をしました。:Unite rails/controllerでコントローラーの一覧が出てきたり、と、使いこなせば相当生産性は上がりそうだな、という感じです。こちも日々使って身につけないと。

vim-fugitive

vimでGitの操作が出来るfugitiveもキーマピングしながら動作確認しました。Gblameでgit blame相当だったりして、エディタで開きながらそのままblame出来るのは便利です

よくやる操作のキーマッピング

<Space>.で.vimrcを開いたり、<Space>s.source $VIMRCしたりという感じで、よくやる操作をキーマッピングに登録すると色々捗るようです。

基本操作に感動

散々.vimrcを触っていたわけですが、一番テンションが上がったのは、下記のvimの基本操作を知った瞬間でした。

私は.vimrcを.vimrc.bundleみたいな感じでいくつかのファイルに分けて管理しているのですが、せっかく<Space>.で.vimrcが開くようになったのに、.vimrc.bundleをさらに立ち上げるのは億劫だな、と思っていました。ところが、

source ~/dotfiles/.vimrc.bundle

のように記載している部分のファイルへのパスの部分にカーソルがある状態で(ノーマルモードで)、「gf」と入力するとファイルに移動してくれることが分かり、一気に便利さが広がりました。

プラグインも大事ですけど、まずはvim標準の動作を覚えなくてはですね。

実践Vimが欲しいです。

実践Vim 思考のスピードで編集しよう!

実践Vim 思考のスピードで編集しよう!

もくもく会感想

いつもはRailsチュートリアルをやっていて、それはそれで大変勉強になっているのですが、月に1回ぐらいこうした機会でなかなかやれていなかった勉強をやれると、非常に充実するな、と思いました。よちよち.rbで話をしていると色々と知らないことが多いので、Railsに限らず勉強が出来ると学習の幅が広がって良いことだと思いました。ただ、あくまでも基本はRailsだと思うので、月に1回ぐらいがちょうど良い気がします。

パーフェクトRuby on Rails読書メモ

パーフェクトRuby on Railsを読んで学んだことをメモしていきます

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

1章 Ruby on Railsの概要

rakeコマンド

rakeはmakeのruby版という覚え方をしているのですが、『実際のところその他の定型処理を実行するためのコマンドとして利用されることもよくあります。』という記載で理解が深まった気がしました。「rake task名」と思っておくと良いのかな、と。

そしてそのtaskを定義しておくのが、Rakefileで、

desc 'タスクの説明'
task タスク名(シンボル) do
  タスクの処理内容
end

という形で定義出来るようです。定義したtaskの一覧はrake -Tで確認出来ます。descの内容がrake -Tので出てくるタスクの#以降の記述になる、ということも知りました。

ちなみに、Railsで最初から出来てるrakeタスクの定義が見たいなーと思ったのですが、 Rakefileには

 require File.expand_path('../config/application', __FILE__)
 
 <%= app_const %>.load_tasks

こういう形でしか書かれていなくて、load_tasksを調べてもどこに定義されてるのか分からずでした。。。

migrationファイル

Railsチュートリアルの中でこれまでrake db:migrate などを実行したことはありましたが、migrationファイルの中身についてはあまり掘り下げたことが無かった気がします。

  • migrationファイルはDBの操作を行うもので、作られるファイルは複数人での開発でもファイル名が重複しないようにファイル名に数値が付けられる
  • 自分で定義したもの以外に「t.timestamps」が自動的に記述されていて、これは「created_at」と「updated_at」を作るもの
  • さらにidがmigrationファイルに書かれることもなく定義される
  • rake db:migrateを実行するとmigrationファイルの内容が実行されるが、migrateの実行状況はschema_migrationsテーブルで管理されているので、同じCREATE TABLE文が何回も実行されるようなことはない
  • rake db:migrate:statusを実行すると状況が確認できる

sqlite3コマンドを使うと実際に流れたCREATE TABLE文が確認出来るということです。

sqlite3 db/development.sqlite3 ".schema テーブル名(複数形)"

sqlite3のコマンドについては全く触れたことすらないので、別途学習が必要です。。。

PATCHメソッド

よちよち.rbでも話題になったのですが、Rails4.0からupdateアクションに対応するHTTPメソッドがPUTからPATCHになったようです。

PUTとPATCH、何が違うの?というのがいまいち分かっていなかったのですが、この内容がコラムに書かれていました。

PUTは「リソースの置き換え」を意味して、PATCHは「リソースの部分更新」を意味するということで、大体のupdateアクションはリソースそのものを置き換えるというより、リソースの一部(例としてUserリソースのパスワードが書かれていました)を更新するものなので、PATCHの方が適切、ということなのかな、と理解しました。

2章 Ruby on RailsMVC

とりあえずP54の「モデルを操作する」の前まで読みました。とりあえずモデルの話から。

ActiveRecord::Relation

正直、Railsチュートリアルもまだまだ途中の自分にとって、若干時期尚早感が初っぱなからありましたが、せっかくなので、とりあえず読んでみてます。

モデルのクラス(ActiveRecord::Baseを継承しているだけの今のところ空っぽのクラス)でもActiveRecordメソッドを使ってデータの操作が出来ます。とりあえず出てくるメソッド名はほぼSQLそのまま感が強いので、抵抗なく使えました。

さらにこのメソッドたちは、重ねて使う(チェーンさせる)ことが出来て、これをQuery Interfaceと言うそうです。あとで読む

Query Interfaceによる操作結果は、ActiveRecord::Relationのオブジェクトとして扱われます。

ここからは、ちょっと自信なくて、今後いろいろやりながら理解を深めたいところですが、解説の文を読んだところでは、一度作ったActiveRecord::Relationのオブジェクトに、さらにQuery Interface(要するにSQL)を加えられるので、一気にSQLを書くのではなく、組み立てて最終的に出来上がったSQLを流す、みたいなことが出来るようになる、のかなと思いました。

若干内容についていけていない部分があったので、もうちょっと経験を積んだ後に読み直したいです。

scopeを定義する

よく使う条件などは名前を付けて呼び出すことが出来るようです。

Book.costly.written_about("Java")

みたいな書き方が例として記載されていました。これのcostlyとかwritten_about("")の部分を事前にモデルクラスに記載しておくことで、便利かつ可読性の高い書き方が出来る、ということのようでした。しかもこの結果もActiveRecord::RelationとなってQuery Interfaceの流れに乗れるみたいです。各モデルクラス用のメソッドを実装するみたいな感じなのかな、という印象でした。

ちなみにdefault_scopeという指定で常に適応される条件も指定出来るようですが、使いどころには注意とのこと。確かに落とし穴になりやすそう。。。

selenium webdriverについてのメモ

業務のちょっとした都合でseleniumを結構触ったので、忘れないようにメモしておきます。Rubyでかきました。

ギョウミーなコードだったので、コード自体はアップ出来ていません。。。

事前準備

gem install selenium-webdriver

リファレンス

http://selenium.googlecode.com/svn/trunk/docs/api/rb/index.html

やったこと

ドライバーの取得

driver = Selenium::WebDriver.for :firefox

これでdriverが取得出来て、driverを使ってあれやこれやが出来ます。

リファレンスを見ると:profileの設定とかも出来るみたいですが、やっていないです。

ページ遷移

driver.navigate.to url

urlには適当なテキストを入れてください。ページ遷移します。

今いるページのURLを取得してあれこれ

これはselenium関係ないのですが、動作環境の違いでドメイン名だけ変えたい、というのがあったので作りました。

require 'url'

scheme = URI(driver.current_url).scheme
host = URI(driver.current_url).host

url = "#{scheme}://#{host}/hoge/hoge/"

ページ内の要素への入力

find_elementメソッドでページ内の要素を見つけてテキスト入力

driver.find_element(:id,"text_box").send_keys "text input test"

find_elementメソッドでページ内の要素を取得してあれこれ出来るようになります。find_element内の指定はhtmlとかcssの要素を指定して結構色んなパターンが書けて、:idとか:classとか:cssとかを第1引数に書いた後、指定する要素の内容(idだったらid名)を第2引数に記載します。

ちゃんと要素が見つかれば要素のelementオブジェクトが返ってきて、見つからないとエラーが返されます。

ちゃんと要素が見つかった後は、今回はテキストボックスだとすると、elementの持つsend_keysメソッドにテキストを渡すと、その値をテキストボックスに入れてくれます。

テキスト入力はsend_keysですが、ボタンとかはclickで押せます。セレクトボックスは

Selenium::WebDriver::Support::Select.new(Element).select_by(:text,'hogehoge')

みたいな感じで選択します。リファレンス

※Elementはfind_elementとかで見つけることを想定しています

要素を見つけるのが結構めんどうくさい

私はHTMLが不得意なのでそのせいかもしれないですが、idで指定出来ないときのfind_elementの引数作りに結構苦戦しました。xpathを指定するとだいたい行けるのですが、xpathの作成に苦労したり。。。逃げ道として、IDEでサンプルを作ると要素の指定の方法が出力コードから結構分かるので、参考にしました。

pryがめちゃくちゃ便利

これに限ったことではまったくありませんが、上述のように要素を見つけるのに苦労したので、どの書き方でどの要素が見つかるのか、というのをtry-errorするのに、pryはめちゃくちゃ便利でした。

ポップアップした画面にdriverを移動させる

driver.switch_to.window driver.window_handles.last

windows_handlesメソッドでwindowハンドルの配列が取得出来るので、lastで最近開いたwindowハンドルを取得します。そこにswitchするように書くと、ポップアップした画面に移動して続きの操作が出来ました

その他

yamlを使いました

結構多くの要素に値を入れなくてはいけなかったのと、色々なパターンで値を設定したかったので、実行プログラムでは、yamlファイルに各要素に指定する内容を書いておいて、そのハッシュをループしてどんどん入力する感じで作りました。

driver.find_element(param[:selector],param[:value]).send_keys param[:text]

みたいな感じで書いておいて、yaml側でこつこつ設定を書くようにしました。

それなりに使えていますが、きっと改善の余地はたくさんあるのだろうと思います。

よちよち.rbの第22回に参加しました

自分の中でのライフワークとしてすっかり定着しつつある、よちよち.rbの 第22回ミートアップに参加してきました。

よちよち.rbでは毎週それなりにしっかりと時間を取って自己紹介をしているのですが、 その中で、このブログが話題に上がったこともあり、参加の記録を書き残そうと思います。

自己紹介

先述の通り、よちよち.rbでは毎回それなりに時間をかけて(30〜40分程度)自己紹介をしています。 事前にその週に話すお題が決められているのですが、毎月最初は今年の目標の進捗確認をするのが定番になっています。

私の今年の目標は、「アウトプットをする」「何かアプリを作る」にしていて、 このブログもアウトプットの目標による実行結果の1つになっています。(あまり更新出来ていませんが。。。)

ブログはあまり更新出来ていなかったのですが、最近、LTをもっとやりたい、ということから、 社内で「LT大会」を企画して実行した、という話をしたところ、思いの外好評なリアクションをたくさん頂きました。

ちなみに、この「LT大会」はtokyu.rbからヒントを頂き、基本的に参加者は必ずLTをする、 持ち時間5分で強制終了、というシステムを取っています。あとLT王も投票で決めています。 月に1回ぐらい開催する予定で、あまり弊社にはエンジニアがいないのですが、非エンジニアにも参加頂き、すこぶる好評でした。 これを書きながら思いましたが、次回の開催後にはブログに様子を書きたいと思います。

あと、よちよち.rb終了後に、@altarf8先生と話していたら、先生も社内で同様のことを実施されているそうで、 合同開催とかもおもしろそうですね、というなかなか熱い話が広がってきました。

そもそもLTとかブログとかを始めるきっかけがよちよちだったりするので、 よちよち.rbを通じて良い経験をたくさんさせて頂いているな、とつくづく感じました。

@odailly_jp先生を祝う

これはもう純粋に記録なのですが、@odailly_jp先生がめでたくRailsエンジニアになられることが決まったようで、大変にめでたいことです。もしかしたら仕事で絡む機会もあるかもしれないので、そちらも楽しみにしたいと思います。

Railsチュートリアル

ここからは本編のRailsチュートリアルで勉強した内容のメモです。

今回は 3.2.1テスト駆動開発 から

DSLって何者なのか

RSpecのお勉強をしていて、RSpecDSLを定義していることで、自然言語っぽく書ける・読める、という内容は良いんですが、 よく聞くDSLっていったい何者なのかがそこまで腑に落ちていない感じがします。

Ruby以外で使うDSL自然言語っぽいのか、Rubyだから自然言語っぽいのか、とか、疑問もあるので、後日もうちょっと調べてみたいなと思います。

test-unitとRSpecの違い

これも結論は出ていないんですが、test-unitとRSpecは何が違うのか、という話題が出ました。以前のよちよちでも同様の話題が出ていてそのときIssueにもなっていて当時調べたのですが、test-unitはTDDでRSpecはBDDみたいな印象を持ちました。
※TDDの文脈でRSpecが出てくることもあるので、これは正確な整理ではないと思います。

RSpecではクラス内のprivateメソッドのテストはしないけど、test-unitはする、とか、
test-unitはベタでRSpecの方がメタ、とか、色々な話を見聞きしましたが、

結局目的に合った選択をするのが一番だろうということで、まずはやってみたいと分からない、という結論が良いのかな、と今のところは考えています。

ヘルパーとは?

引き続き答えのない記述が続きますが、色々話を聞く中で「ヘルパー」という単語に何度も遭遇していますが、これの意味が良く分かっていません。ヘルパーファイルとかヘルパーメソッドとか、何をヘルプしているのか、Ruby用語なのか他の言語にもある存在なのか、、、

これも後日調べてみたいと思います。

TDD楽しい

はじめてのTDDという感じでRailsチュートリアルに沿って「Red」→「Green」の流れを実行しましたが、期待動作を先に書いて実装をしていく、という噂に聞いたこの手順を実施するのがとても楽しかったです。こうした手順を踏んで、一刻も早く恥ずかしくないコードが書けるエンジニアになりたいものです。

Capybara と Selenium

今回の範囲ではCapybaraを扱ったので、他の参加者の方々は結構Capybaraの持ってるメソッドとかを掘り下げたりしていました。

今回、私自身はあまりCapybaraを調べたりはしなかったのですが、今ちょうど業務でSelenium WebDriverを書きまくっているので、Capybaraの話を聞きながら、Selenium WebDriverと持ってるメソッドが似てるなーと感じていました(当たり前ですが)

それで、実際、CapybaraとSelenium WebDriverは何がどう違うのかな、という疑問が生じました。capybaraの方がcucumberとかと連携しやすかったりするんでしょうか。これも書いてみるのが一番ですかね。

その他

  • 今までは、20時スタート21時30分終了でしたが、今回から30分延ばして22時まででした。個人的にはまだまだやりたいぐらい充実はしているので、他の方々で不評でなければこの時間は継続したいな、と思いました。

  • 「まちなみくん」とGithub kaigiで配られていたオクトキャットのステッカーを頂きました。どちらもかわいい。

  • 次回はRailsチュートリアルはお休みで、もくもく会。私自身は初のもくもく会なので、何をしようか迷いますが、多分vimrcの続きをやります。

.vimrcを学んだメモ

vimを使っているものの、あまり使いこなせていない感が強いので、.vimrcを育てつつ、vimと触れ合おうという作戦を実施中です。

色々知ったことをメモ。

とりあえずの目標

以前、コピペで作ってしまった.vimrcの記述が謎だらけなので、ちゃんと作り直してgithubに上げる

記述内容のメモ

set nocompatible
viとの互換モードをOFF
vi互換で起動すると、pluginとか動かなくなってしまう可能性大とのこと

sourceコマンド
外部ファイルを読み込むときに使用する。
vimrcを内容ごとに分けて整理するのに使用した
例えばsource ~/dotfiles/.vimrc.keymapで、キーマッピングを記述する用のファイルを読込

if has('vim_starting')
起動時のみ読込みたい内容を記述するときの書き方

やり途中

NeoBundleは入れていたのですが、pluginがよく分からない状態だったので、整理を開始。
まずはuniteとunite用のキーマッピングを作るところで力尽きたので、続きはまたの機会に。