ドミニオン好きが高じて、ドミニオン箱を作ってしまった

Kirika2011-12-31

 2010年の年末ぐらいから、ドミニオンというゲームを始めたのですが、趣味が高じてDIYのド素人が専用の箱を自作するに至ったので、その経験を記録に残しておきます。なんとか2011年内に完成して良かった。

 その1 http://d.hatena.ne.jp/Kirika/20111231
 その2 http://d.hatena.ne.jp/Kirika/20120101
 その3 http://d.hatena.ne.jp/Kirika/20120102

続きを読む

TokyuRuby会議04に参加してきた

 前々から気になっていたTokyuRuby会議に参加してきました。
 
 実はRegional勉強会への参加は初めてで、前からAsakusa.rbに参加したいと思っていても場所的に遠かったり、近所のMitaka.rbに参加しようと思っていても時間が取れなかったり、いつの間にか開催されていたりと、中々Regional Ruby会議への参加の機会がなかったのですが、Ruby会議で主催者グループの@kishimaさんにお会いしたときに、次回開催予定の日程をしっかりと教えてもらえたお陰で、今回参加することが出来ました。(この場を借りてお礼いたします)
 
 TokyuRuby会議は前回タイムラインを見ている限り、LTを肴にひたすらビールを飲む会という印象だったので、それなりに覚悟していたのですが、受付開始予定時間よりも早く入っているのにもかかわらず、プレミアムモルツが振舞われ、会場の本気度を感じました。
 自分もビールの中ではプレモルが一番好きなので、今回のスポンサーであるサントリー様には頭の下がる思いです。(お土産にプレモル2本+おつまみまで頂きました)
 
受付前にも早くも配られ始めるプレミアムモルツ
f:id:Kirika:20111029135641j:image
 
 会場に食事を持ち込むと書かれていたものの、イマイチ加減が分からず、無難に会場提供用に塩けんぴ、オニオンフライ、自分用にピザポテトとチーズを買って持っていったのですが、実際はもっと自由で、ケンタッキーのフライドチキンを持ち込む人もいれば、カップラーメンを作り始める人が居たり、手作りの弁当・ご飯が振舞われたりと、想像を超える自由度でした。自分もこれを見習って、次回はもっとがんばろうと思います。
 
今回の飯王@2celebさんのアンコウ鍋(美味しかったです!)と途中から出てきたプレモル黒
後ろは同席されていた@emasakaさんの持ち込まれていた食材ですが、全体的にこんな感じ。
f:id:Kirika:20111030183009j:image
 
 会場は旧ECナビこと、Vayage Group様の会社の一会場を提供だったのですが、これもまた凄く、こんな会社があるのかという感じの、自由なレイアウトでびっくりしました。写真を勝手に撮ったら駄目かな、と思ったので写真はありませんが、会場提供していただいたVoyage Group様にも感謝ですね。ちなみに酔いつぶれた人は、和室の会議室に運び込まれてぶっ倒れてました。

おそらくVoyage Group様の備品だと思われる大型ドラ
大きなドラを叩くというのは一回やってみたかったので、自分も盛大に叩かせてもらいました。良い経験が出来ました。
f:id:Kirika:20111029164724j:image

 さて、肝心のLTですが、はじめ発表者の方々のタイトルを見た限りでは、どちらかというと緩めのタイトルが多かったので、どんなものかと思ったのですが、お酒が入るにつれて、会場のカオス度が高まり、あまり難しいことを考えられなくなってくるので、これぐらいのほうがちょうどいいのかと思いました。全体的に緩く、楽しい話を、時には参考になる話が聞けました。
 抽選LTに当たったら、と作っておいた資料も、残念ながら抽選LTには当たらなかったものの、Accept LTという形で自主的に発表したいという人の中に混じって発表することができたので、良かったです。 

 多くの方との出会いもあり、非常に楽しい会でした。また5回目があれば是非参加したいです。出来ればLTも。

 最後になりましたが、TokyuRuby会議の主催者の方々、スポンサーのサントリー様、会場提供のVoyage Groupの皆様には改めてお礼を申し上げる次第です。

「会社を選ぶということ」の反応に対する返信

kasihara1 言ってることはその通りだと思うんだけど、そんな今の日本社会に問題あるなーと思ってる。 入る前にあまりにも仕事内容と職場の雰囲気が分からないのに、辞めることが一大事ってことがおかしい。

 大きな会社は現場に人事権が無いところが多いので、それがまた悲劇を大きくしている所はあると思います。ただ、人事は人事で会社全体の人材の流出・流入を見ながら、データを元にバランスよく採用しているので、一概に悪いとも言えません。
 自分の会社では現場の課長レベルの人が面接をするけれども、結局その課長の下で働くことになるわけじゃないし、その人が適する部署を一つ一つ探すのも非効率なので、学歴や人当たりの良さを重視して、どこに配置されてもそれなりに上手くやっていくような人を集めるという方法が効率的なのかなと思います。
 辞めるのが一大事、というのは社会的な問題なのかどうかはちょっと分かりませんね。そもそも日本人の多くは保守的ですし……。

会社を選ぶということ

 最近会社の採用の手伝いをしていて、内定が出たけど、まだ内定承諾を迷っているという学生の相談に乗ってたりするんだけれども、そこでよく学生に言っている内容をまとめてみる。あくまで持論なので、私が発した言葉、という以上に文章の責任は持てないし、「それは違うよ」と思う人はブクマコメントなり、ブログコメントなり、Twitterなりで伝えてください。
 あと、他の会社のことは分からないので、あくまで自分の会社の中の話、ということで。
 
(1)会社選びで最後に自分が幸せになれるかどうかは運である、ということ
 規模数十人の小さな会社であれば社風が合うか合わないかが重要かもしれないけれども、従業員が1000人とか5000人とかになってくると、もうそれは一つの社会で、色んな人がいるし、色んな部署がある。例えば、よく学生に「この会社はサービス残業がありますか?」とか聞かれるけれども、自分はサービス残業はしたことがないよ、としか言えないし、会社のコンプライアンス的にはそう言うのを厳しく取り締まっているので、殆どの部署はないと思う。ただ、社員が多くいれば例外的にルールを違反している部署がある可能性もあるわけで、100%ないかと言われれば、無いとは言い切れない。配属される場所・上司による、と答えてます。
 同様にやりたい仕事が出来るかどうか、も結局運じゃないかなぁ……と。
 
(2)ただし、自分が幸せになる確率を上げることは出来る
 運とは書いたけど、自分の行動次第で幸せになる確率を上げることは出来ると思う。例えば自分のやりたい仕事について、なるべく上手く相手に伝えるとか。そもそも学生の現時点の志望を聞くと「公共系の仕事がやりたい」とか「流通系の仕事がやりたい」程度で具体的に自分がそこでどんな仕事をするのか、などのイメージは持っていないことの方が多い。実際そのレベルでの希望が叶って配属されてみたら、あまりにも自分が想像した世界とかけ離れてて、辞めてしまう人だっている訳で。それは会社・当人両方にとって不幸なことなわけです。
 自分が思っているイメージの仕事が出来るかどうかを調べてから選択すれば、幸せになる確率は増えていくと思う。逆に先入観を殆ど持たずに、配属された場所に順応する、という人も居て、自分を納得させながら仕事をしている人もいる。実は、これが大多数のような気もするけど。
 
(3)まとめ
 というわけで、最近の自分が感じていることをまとめると以下のような感じになります。

  • 自分が会社に入って、配属されて本当に希望の叶った仕事が出来るかどうかは運である。
  • ひいては部署選び、会社選びの地点で、既に運の要素が絡んでいる。
  • ハズレくじを引かないようにするためには、なるべく自分の希望を詳細に定義して、採用面接時に問いかけていくことが重要。

 なんか普通の結論になってしまった。足りないところがあれば、また補足していきます。

にわかJavaScripterにお薦めの1冊「JavaScriptパターン」

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

 JavaScriptの基礎を学ばずにjQueryとかのライブラリで表層的なJavaScriptしか書けない、まるで私のようななんちゃってJavaScripterにはお薦めの一冊。jQueryを使ったWebページが書けるなら、さほど躓くことなく、JavaScriptの上級者テクニックを身につけることが出来ると思います。

 jQueryなら使えるけど、クロージャ?カリー化?prototypeって美味しいの?な人に是非オススメです。

Android上でRubyアプリケーションが開発できるRubotoについて書いてみる

 ちょっと前にRubotoの記事を某雑誌に掲載するということで、色々準備していたのだけれども、Titanium Mobileとか、他にも魅力的な開発環境がたくさん出てきたので、結局Rubotoの記事を掲載するのはお流れに。とはいうものの、Ruboto自体は今後も発展するだろうし、国内のブログ記事を見渡しても、Rubotoの記事は殆ど無くて、あってもHello Worldを書いた程度だったりするので、ここにまとめておくことにします。
 雑誌に載せるレベルの量は書ききれないですが、雰囲気でも掴んでいただけると幸いです。
 
1.Rubotoについて

 Rubotoの紹介自体は、ちょっと調べてくれば出てくるので割愛しますが、参考リンクとしてここを挙げておきます。

 http://octoba.net/archives/20100305-ruboto-irb-android-427.html

 あまり語られることもありませんが、RubyRails)の世界では有名なEngineYard社がバックアップしているプロジェクトで、JRuby開発者のCharles Nutter氏などが参画しています。Titanium程の盛り上がりはありませんが、今も活発に開発が続いています。

 http://www.engineyard.com/open-source
 http://groups.google.com/group/rubotoGoogle Group)
 
2.Rubotoの特徴

 RubotoはAndroid上でRuby言語を使って開発が出来る環境です。
 Rubotoにはruboto-irbとruboto-coreというものがあります。

 ruboto-irbrubyで開発したことがある人なら、パッと想像がつくかと思いますが、irbという対話式のインターフェースを持ったアプリケーションです。ruboto-irb上でプログラムを入力すると、即座に結果が返ってくるというシンプルなアプリケーションです。Android上で直接アプリ開発をしたり、動作確認をしたいときは、ruboto-irbを使います。

 一方ruboto-coreは、直接rubyファイルを解釈して、単体のアプリケーションとして動作させるエンジンとして動作します。そのため、開発はAndroidの外のPCで行い、付属のantビルドスクリプトを動作させることで、apkファイルを生成します。

 RubotoはJRubyを内蔵し、Javaで実装されたRubyインタプリタによりRubyプログラムを解釈します。
 そのため、RubyプログラムからJavaのライブラリを呼ぶことも出来ます。もちろんAndroidAPIを呼び出すことも可能です。
 ただし、少し凝ったことをするためにはRuboto側から開発する場合であっても、Anrdoid開発のルールを理解する必要があります。物によってはそのままJavaで書いてしまったほうが早く実現できることもあると思います。

 またパフォーマンスですが、JRubyはCで書かれたRubyよりも早く動作することもある言語なのですが、JRubyの初期化は遅く、ruboto-irbを起動したときのJrubyの初期化は非常に遅い物となっています。これは思いついたことをすぐに実現したいというモバイルアプリケーションを開発するには、致命的です。今後改善により初期化が早くならなければ、普及は難しいと思います。
 
3.RubotoによるHello World

 手っ取り早くRubotoでアプリケーションを動作させたいのであれば、ruboto-irbに付属しているtoast.rbが参考になると思います。

#displays a 'Toast'
import 'android.widget.Toast'

Toast.makeText($activity, "Hello Ruboto!", Toast::LENGTH_LONG).show

 1行目のimport文はいきなりJavaの呼び出しです。
 android.widget.Toastクラスを呼び出せるようにインポートします。

 http://developer.android.com/reference/android/widget/Toast.html

 呼び出すとToastクラスが直接使えるようになります。
 4行目のmakeTextはToastクラスのインスタンスを直接生成します。
 最後のshowでToast#showメソッドが呼ばれて、表示を行います。

 $activityグローバル変数は、rubotoアプリで利用出来る変数で、$activityはRubotoで表示するアクティビティのインスタンス変数が入っています。このような形で、Rubotoが管理する変数が用意されており、JavaAndroid APIに直接渡すことができます。
 
4.RubotoによるGPSアプリケーション開発

 ここまでは、いくつかのブログでも紹介されていますが、ここから更に踏み込んで、少し複雑なアプリケーションを作りたいと思います。折角Androidのアプリを作るので、GPSを使ったアプリケーションを作りたいと思います。

 本当はruboto-coreを使って、単体で動作するアプリケーションの手順を書きたいのですが、ruboto-coreの環境構築なども説明が必要なので、今回はruboto-irb上で動作するものを作りたいと思います。

 下記のサンプルでは、GPSから位置情報を得て、その情報を記録し位置情報をGoogle Mapに引数として渡し、Google Maps上で移動経路を表示するというアプリケーションです。

 画面にはボタンが3つ表示され、Create Tableで得たデータを表形式で表示し、Create Routing Pathを使うことでGoogle Mapでの表示を行います。またClear Location Tableを押すことで移動経路情報を削除します。

f:id:Kirika:20110327222103j:image

require 'ruboto.rb'
require 'pathname'
import "android.widget.Toast"
import "android.webkit.WebView"
import "android.content.Context"

ruboto_import "org.ruboto.callbacks.RubotoLocationListener"
ruboto_import_widgets :TextView, :LinearLayout, :Button, :TableLayout, :TableRow


$activity.start_ruboto_activity "$test" do
  $data = nil
  pathname = Pathname.new("data")
  if pathname.exist?
    pathname.open("rb") do |f|
      $data = Marshal.load(f)
    end
  end
  $data = Array.new if $data.nil?

  setTitle "This is the Title"
  setup_content do
    linear_layout :orientation => LinearLayout::VERTICAL do
      button :text => "Create Table", :width => :wrap_content
      button :text => "Create Routing Path", :width => :wrap_content
      button :text => "Clear Location Table", :width => :wrap_content
    end
  end
  handle_click do |view|
    if view.getText == "Create Table"
      self.start_ruboto_activity "$table" do
        setup_content do
          table_layout do
            $data.each do |d|
              table_row do
                text_view :text => d[0].to_s, :padding => [3,3,3,3]
                text_view :text => d[1].to_s, :padding => [3,3,3,3]
              end
            end
          end  
        end
      end
    elsif view.getText == "Create Routing Path"
      self.start_ruboto_activity "$map" do
        map_path = "http://maps.google.com/maps/api/staticmap?size=320x480&sensor=true&" +
        "path=color:0x0000ff|weight:5|" + $data.map{|d| "#{d[0]},#{d[1]}"}.join("|")
        webview = Java::AndroidWebkit::WebView.new(self)
        webview.loadUrl(map_path)
        setContentView(webview,
           ViewGroup::LayoutParams.new(
          ViewGroup::LayoutParams::FILL_PARENT,
          ViewGroup::LayoutParams::WRAP_CONTENT))
      end
    elsif view.getText == "Clear Location Table"
      $data = Array.new
    end
  end

  @location_listener = RubotoLocationListener.new.handle_location_changed do |location|
    $data.push([location.getLatitude, location.getLongitude])
    pathname = Pathname.new("data")
    pathname.open("wb") do |f|
      Marshal.dump($data, f)
    end
  end

  @manager = getSystemService(Context::LOCATION_SERVICE)
  @manager.requestLocationUpdates("gps", 0, 0, @location_listener) if @manager.present?
end
  • 初期化処理

 まずruboto.rbをrequireします。ruboto.rbはrubotoの提供するヘルパークラスで、Androidアプリケーションを作る際の色々な決まりごとを簡単に書くためのメソッドを提供してくれます。
 その他アプリケーション内で使用するクラスなどを行頭でまとめてimportしておきます。

  • GPSの呼出処理(+リスナーメソッドの実装)

 次にruboto_importを使って、RubotoLocationListenerをインポートします。
 Androidでリスナークラスを使うようなアプリケーションを作ったことがあるなら分かりますが、GPSなどの外部から得られる情報をアプリケーション内で受け取るためにはリスナークラスを実装する必要があります。
 RubotoではAndroidで利用する汎用的なリスナークラス1つ1つに対して、Rubotoのヘルパークラスが用意されており、リスナークラスの実装メソッドであるonXXXXXという名前のメソッドがすべて、handle_XXXXXという名前でアクセスすることが出来ます。
 上記のサンプルアプリでは@location_listener = RubotoLocationListener.new.handle_location_changedという部分がそれに当たります。

 Listenerの種類はrubotoが用意してくれているもの以外は自前で用意する必要がありますが、rubotoがデフォルトで用意してくれているListenerだけでも、下記のURLで示すだけの量があり、Androidの基本的なアプリケーションであれば、自作の必要がありません。

https://github.com/ruboto/ruboto-irb/tree/master/src/org/ruboto/callbacks

 LocationListenerクラスのヘルパーを利用し、onLocationChangedを使ってGPSの位置情報が変更されたときの動作を記述しています。位置座標を記録したArrayクラスに位置座標を追加し、dataという名前のファイルに出力するように書いています。

 最後にgetSystemServiceにてLOCATION_SERVICEを呼び出して、requestLocationUpdatesで、位置情報を更新するように書いています。

  • UI周りの実装

 rubotoの画面はすべて$activity.start_ruboto_activityメソッドのブロックに記述します。

 start_ruboto_activityの中のそれぞれのメソッドについて説明します。

    • setup_content

 setup_contentは初期化処理を行うメソッドです。このサンプルでは、画面の構成を行うlinear_layoutを呼び出して、画面にボタンを作成する処理を行っています。また、普通のAndroidアプリケーションと同じようにレイアウトXMLを利用することも出来ます。

    • handle_click

 handle_clickは先程のGPSの項でも書きましたが、JavaのonClickメソッドを呼び出すためのRuby側のハンドラです。このサンプルでは各ボタンをクリックしたときの処理について記載しています。

 GPSで取得したデータを引数にGoogle Mapsのアドレスを使って、Google Mapsに移動経路を表示しています。AnrdoidにはWebViewというブラウザをビューとして利用する機能があるので、それを利用しました。import文でandroid.webkit.WebViewを呼び出すことで利用できます。

 こんな感じで呼び出したGoogle Map上の移動経路は以下のように表示されます。
f:id:Kirika:20110327222104j:image
 
5.まとめ
 こんな感じでJavaに比べて、短いコード量でAndroidアプリケーションを作成できるのがRubotoの強みです。とはいうものの、実際には分からないことはrubotoのソースコードを読まないといけなかったり、rubotoでうまく動かない場合に初めにJavaで組み立てて、rubotoの上でどう動かせばよいかを考えないといけなかったり、と課題が多くあります。
 まだrubyAndroid開発を行うというのは実用的ではありませんが、いずれAndroid開発の一手段となることを望みながら、この記事を締めくくりたいと思います。

 また、今回は諸事情により流れてしまいましたが、実際雑誌の記事になるときには、開発環境の構築方法、開発の進め方、よりrubotoの実装に突っ込んだ話なども書いていく予定でした。もし、今からでもどこかの雑誌で紹介してもらえるのであれば、喜んで書きますので、その際にはTwitter(@Kirika_K2)もしくはkirika.k2(gmail)にご連絡ください。