「RubyでつくるRuby」を読んだ

ラムダノートから出版されている、RubyでつくるRubyを読んだ。

とちぎRuby会議07で、同書籍の一部を学び、そこからまるっと学んだ感じ。ElixirのMacroやLispがこの木構造と同じ形をとるので、木構造に分解された抽象構文木を見てもさほど読みにくさはなかった。

大学の頃、コンピュータサイエンス系をかじると大体はこういう分解された処理機構に触れるのではないかなと思います。それをRubyを使い、わかりやすく表現している書籍。プログラミングにまだ慣れていない人でも、読みながらインタプリタを書き、どういう形で構文が解析され、実行されるかを観察することができるとても良い書籍だと思います。

良い復習になったと思う。

Advertisements

minimal ruby client for WebDriverAgent

WebDriverAgent developed by Facebook is one of WebDriver tool which run on iOS.

Previous some posts, I investigated this module. And now, I develop minimal wrapper Ruby cli client to help some operations.

I implemented some operations such as taking screenshots, getting source tree, status about the driver and install arbitrary app to the launched iOS target and get its session id. This minimal library will support some tasks for handling iOS applications.

This library does’t have concrete plan to develop as testing library for WebDriver for now. Just helping some operations against WebDriverAgent.

If you’d like to run tests via WebDriverAgent, please use Appium and it’s ruby binding. Because Appium will support WebDriverAgent in the future. (https://github.com/appium/appium-xcuitest-driver)

some references

『dRubyによる分散・Webプログラミング』を読んで分散処理を思い出す

dRubyによる分散・Webプログラミングを読みました。

この書籍ではdRubyのモジュール解説だけでなく、処理の中心となる考え方や参照渡しと値渡し、マルチスレッド、排他制御、Webアプリケーション実装など含めて、分散処理を考える上で基本的な考え方を網羅しています。dRubyは、 require "drb/drb" すると得られるRubyにおける分散処理環境を提供する機構です。

分散処理を考えるとき、遠隔で処理を行うための規格としてRPC(Remote Procedure Call)なんかがあります。それらはクライアント/サーバのスタブを提供し、ネットワーク越しの分散処理環境の構築を支援します。一方、dRubyでは、オブジェクト同士の通信の概念をネットワーク越しにまで拡張して、分散処理機構を構築します。Pure Rubyで実装されている、というところもとても素晴らしいですね。

私はここ半年いかないくらいの間、Erlang/Elixirをざっと学んでいました。なので、分散オブジェクト同士のコミュニケーションの取り方やLindaのRuby版であるRindaのTupleSpaceなんかの役割など、プロセス間のメッセージパッシングやETSを対比として理解を深めることができました。

この書籍、2005年の段階で関さんによって書かれていることがすごいですね。(その頃はまだ私は大学に入りたてでコンピュターにさえ慣れていなかったな…)

GooglePlay/AppStoreのレビューを取得するスクリプトを少し整えた

過去、GooglePlayのレビューを新着順に取得するみたいな雑な記事書いていたのですが、気晴らしに少し書き換えてみました。

Nokogiriとか使っていたのですが、たかだか性能も求めない処理にNokogiriは重たいのでOgaを使ってみることにしました。Bundlerだけで完結できる環境です。楽だ。

ついでに、引数にjpやenなどの言語を与えることで、その言語に対応したレビューを取得できるようにしました。ページングのようなちょっと面倒なことはしていないので、本当に単純なものです。

こんな感じで使える。

require './app_review.rb'

google_reporter = AppReview::GooglePlay.new('com.android.chrome', 'jp')
google_result = google_reporter.latest_reviews_upto 5

app_reporter = AppReview::AppStore.new('375380948', 'jp')
app_result = app_reporter.latest_reviews_upto 5

https://github.com/KazuCocoa/simpleAppReviewReporter

GitHub API v3のWebHookと戯れてみた

最近、GitHub API のWebHookを使っていろいろ自動化をトライしてみてます。なので、少し調べてみた。

WebHook自体は以下のURLを参照ください。
https://developer.github.com/webhooks/

ここでは、私が実際に行った作業の備忘録かねて残していく、というスタンスで記載します。

WebHookの登録

通常のGitHubなら、SettingのWebhooks & ServicesからWebHookを登録することができます。(2014/07/06時点)

Continue reading “GitHub API v3のWebHookと戯れてみた”

GooglePlayのレビューを新着順に取得する

ちまたで見られるGooglePlayのレビューを取得する記事の多くは、GetリクエストからHTMLのページを取得、その要素から必要なものを取得するという方法でした。

ただし、GooglePlayはデフォルトではレビューの並びが新着順ではありません。
一方、私は新着順の情報が欲しい。

そこで、簡単なスクリプトを作ってみました。

すんなりいくかと思っていたら、Net::HTTPから取得しいたNet::HTTPResponseのbodyをNokogiriに読み込ませていたのですが、うまくパースされない。
そこで解決に至ったまでの作業を備忘録として残しておきます。

Continue reading “GooglePlayのレビューを新着順に取得する”

EveryDayRailsSpecを復習がてらやった、Cucumberは白痴?

https://leanpub.com/everydayrailsrspec
https://github.com/everydayrails/rspec_rails_4

これは、RailアプリをSpec含めてまるっと学ぶために良い知見を与えてくれます。
Code School もやってみようかな。

Continue reading “EveryDayRailsSpecを復習がてらやった、Cucumberは白痴?”

QuickCheck on RSpec

CIで何回も回すから味の出てくるテストケースを考えてみる にも書いたように、同値に区分されるテストデータの集合に対してテストを実施する場合、ランダムな値でテストデータのバリエーションを増やすことは現実的な選択肢としてありと思う。また、全網羅が難しいテスト対象の領域に対してこのようにランダムな値を適用することは現実的な選択肢になる。
※ランダム性は議論の範囲外

ここでは、以前から知られているQuickCheckを以下でRubyのコードを使ってためしていく。
また、先日書いた RSpecによるテストコードでパラメタライズドテストを記述していく と少し比較もしてみる。

Continue reading “QuickCheck on RSpec”

RSpecによるテストコードでパラメタライズドテストを記述していく

以前、FitNesseなどによるSpecification By Exampleで少し示した keyword driven testingは、入力値とその操作まで変数としてテストコードに与えることができていました。

このような形式で記述するテストは、「テストしたい対象のメソッドの入力とその期待値が異なる組み合わでいくつも存在するが、それらのテストを可読性の高い状態、簡潔な表現で保ちたい」というような場合に使えます。実際、開発速度が速い場合、仕様書を別ドキュメントとして厚く保つことは難しいと思います。その対策として、可読性の高いテストで低レベル(メソッドの入出力レベル)のテストはテストを仕様書に見立てていく、というアプローチが重要な一手となります。

以下は、パラメタライズドテストと呼ばれます。rspec-parameterized’というgemを使ってます。

Continue reading “RSpecによるテストコードでパラメタライズドテストを記述していく”

ruby console による、コマンドライン越しのAppiumによる画面要素取得

Appiumのチュートリアルが充実してきましたね。

中でも、以下のconsoleによるチュートリアルは役立ちそう。
まだチェックしてないですが、チェック。

https://github.com/appium/training/blob/master/modules/source/appium/01_ruby_appium_native_ios_automation/02_appium_ruby_console/04_starting_the_console.md

あと、動作確認しましたがSelenium 3に向けて、以下のようにcapabilityは修正されていく模様。動作確認も、一応してみました。

Continue reading “ruby console による、コマンドライン越しのAppiumによる画面要素取得”