Tokyo Rubyist Meetup -- tDiary + Engine Yardのこと

6/27(水)に開催されたTokyo Rubyist Meetupですが、非常に楽しめました。
人との交流、興味深いプレゼン、英語を使える場を提供してもらった上に、
ピザ+飲み物付きで1000円(当日券は少し割高)くらい。
もの凄くコストパフォーマンス高いと思うのですが、いかがでしょうか。
今回から日本語案内文の翻訳も担当させてもらえて嬉しい限りです。

さて、今回のプレゼンで、Engine YardのTimさん(気軽に書いていますが、おそらく凄い方。。)
へ素朴な疑問をぶつけてみました。「一番オススメの本を1冊紹介して下さい」と。
というのも彼のプレゼン内容から、彼が読書家であることの察しがつきましたので、
何とか聞き出してみたい衝動にかられてしまいました。(会場にいた多くの人も望んでいたはずと勝手に思ってます。)

最終的には、2冊オススメしてくれたのですが、若干、スピーキング速度が早く、聞き逃した方も多いかと思います。
僕もその一人で、懇親会中にTimさんから直接メモを頂きました。ここに記載させて頂きたいと思います。

※よくよく考えると本人に許可を取った方が良さそうなので、少々お待ち下さい。

※2012/07/04追記
無事にTimさんから許可が下りました。ありがとうございます!

まずは1冊目。

Crossing the Chasm: Marketing and Selling Disruptive Products to Mainstream Customers (Collins Business Essentials)

Crossing the Chasm: Marketing and Selling Disruptive Products to Mainstream Customers (Collins Business Essentials)


この本は日本語版も出版されていますね。
キャズム

キャズム


Timさん曰く、英語の難易度は高いとのこと。なので、日本語版がオススメかもしれません。
個人的には原書にチャレンジしてみたいですが。。

マーケティング系の本で、MBAでは定番の書籍みたいですね。
マーケティングと聞くと、お金儲け的な臭いがプンプンしますが、
知っていると知っていないでは大違いですので、積極的に読んでみましょう。
個人的にもこっち系の本はあまり読みませんので、この本の存在すら知らなかったのですが、
これを機に読んでみたいと思います。

次に2冊目。
[rakuten:book:12787030:detail]
※楽天のリンクが切れていますので、編集しておきます。
 原因不明でAmazonへのリンクが上手く行きませんので、直接リンクを記載します。(2012/08/12)
タイトル:Zig Ziglar's Secrets of Closing the Sale
リンク:http://amzn.to/PbqnMq

こちらは、少しマニアックな感じでしょうか。ただ、内容はもの凄く良いみたいです。
Timさん曰く、英語の難易度は低いとのこと。日本語版は出ておりませんので、
コレは原書でチャレンジしてみましょう。

この本もマケーティング系でしょうか。「売る」ということに特化した内容なのかなと思います。

***最後に
年上の方がどんな本を読んで来たかを聞くのは、凄く楽しいことですし、有益ですよね。
教えて頂いた本は、しっかりと読んでみましょう。絶対に何か発見があるはずです。

僕も以前は、「ビジネスは敵!」みたいなことを考えた時期もありましたが、
やっぱり敵のことも知らないと戦えないわけで。(戦うという表現嫌いですが。。)
敵を知って、軽やかに生きて行かないと、いつまでも苦しい状態から抜け出せない気がしています。
積極的にビジネス書にも手を出してみましょう。今回紹介した本が良い機会になればと思っています。

『明日から部下にイライラしなくなる本』

明日から部下にイライラしなくなる本 「上司の仕事」を自信をもって続けていくために

明日から部下にイライラしなくなる本 「上司の仕事」を自信をもって続けていくために


皆さんは、日々、本をどのくらい読みますでしょうか。

僕は、週に少なくとも2〜3冊は読みます。
全てを紹介して行く時間はありませんが、今回は久しぶりに良書というか、
自分の悩みを解決してくれる・くれた本に出会いましたので、
紹介して行きたいと思います。

〜内容は後日、書きます。が、非常にためになる本なので、
タイトルから推測して頂き、同じような悩みを抱えている方は、
読んでみて下さい。一先ず、タイトルの紹介だけでも先行してと思います。

※2012/06/16追記(良かった・気付きのあった箇所を箇条書きにして行きます。)
・部下に任せて、後で大変な思いするくらいなら自分でやった方が良いと、部下の仕事まで抱え込んでしまう。
・一緒に気持ちよく働くためには、お互いを良く知り、助け合い、協力し合える良好な関係を作り出す必要がある。
・上司が日々の仕事で最も接するのは目の前に座っている部下です。その相手から心を閉ざされてしまう。
 これほど孤立無援の気持ちになることはありません。
・どこかできちんと部下と向き合ってみることが必要です。
・上司の仕事がつらくて仕方ない、本当は降りたいと思っている人達も多いと思います。
・自分の上司からは追い込まれ、部下からは突き上げられる。気付くと、上司と部下の間に挟まれて、押しつぶされそうに
 なっている人も多いと思います。
・「できて当たり前」と思うから苛立ってしまう。
・出来ないと不安を抱えている部下を、自分で考えてやりなさいと突き放しても、上手く行かない。
 部下はますます自信を失い、臆病になるだけです。
・逆に、もう一人前だ、任せてほしいと思っている部下に、いちいち指示をしていたら、認めてくれていない、
 信頼してくれていないとなる。
・こういった各個人毎の成長フェーズを理解し、私はあなたをこんな形で支援しますという認識をお互いに合わせること。
・日々のマネージメントは4つのステップで回す。
 (1)成長目標と支援方法、(2)仕事の付与、(3)指導、支援、(4)フィードバック
・部下が良い仕事をする、レベルアップするために何が必要か、自分はどう関わればいいのか、
 ぜひ一人一人考えてみて下さい。
・相手が心を閉ざした理由、出来事を聞くという姿勢も必要です。
・結局は、成果が出ている、使える・使えないで部下を判断していませんか。
 成果が出ない人をダメだと決めつけている。こうした感情が、溝を作っている可能性があります。
・「なぜ、わからないのか」を繰り返していると、部下はますます焦り、落ち込むだけです。
・「私ばかり大変」「仕事が集中している」の被害者意識や、上司は都合よく使っているという不信感がある場合、
 仕事の状況を確認を一緒に行おうというコミュニケーションを徹底することです。
 このタイプの一番の不満は、上司が自分の置かれている立場を理解していないということ。
 まずは部下が何に困っていて、どこで時間を取られてしまうのかをじっくりと聞いて上げて下さい。
・勤務時間以外にも、よく話す努力をしてみることも必要です。
・自分が思いつきで色々な指示を出していないかを振り返ってみて下さい。
・指示したことの状況確認を行う。そうしないと部下は、流すクセがつく。
・気持ちよく働くために、お互いの「これをされたらイヤだ」と思うことを部下と共有する。
・問題が起きたときに、逃げない、部下に責任を押し付けない、自分だけが有利になるような振る舞いをしない、
 嘘をつかない。
・部下が目指す姿、目標へ道筋や計画の「方向を示す」、その方向へ向かう行動を引き出し、達成を支援する「人を導く」
・部下が知りたいのは壁の乗り越え方。「自分の経験」を伝えたらどうでしょうか。

Tokyo Rails Meetupのこと〜後編

後編は、行きたいと思っていても中々行けないという人を、特に対象にして
書いてみたいと思います。

(前編からの続き)
Paulからのメールには簡素にTokyo Rails MeetupのURLが記載されていました。
http://www.meetup.com/tokyo-rails/

このページを見て、僕は愕然としました。
「滅茶苦茶レベル高そう。。」「場違い過ぎる。。」

そこで、再度Paulへメールを送りました。この状況では少なくとも
Paulが一緒に参加してくれないと参加は無理だと。以下、原文。
"I'm a little bit shy guy...
I've never joined this kind of event before.
Are you going to go there?
If you're there, it's easier for me to join the event."

するとPaulから返事があり、
「うん。参加する予定。心配しないで、僕を含め多くの技術者がシャイだから。」
とあり、参加を後押ししてくれたのです。何と優しい人でしょう。

***
それから2週間後、僕はMeetupの開催場所である白金台にいました。
ドキドキだった記憶があります。白金台に来るのも久しぶりで土地勘も無いし、
向かう先は、誰かが言っていた「日本最高峰のRails使い達が集う」クックパッド。。

緊張のあまり、クックパッドまでの道のりが長いこと、長いこと。。
やっとの思いで到着し、会場へ向かうエレベーターに乗り込みました。
そしてエレベーターが指定の階に止まり、扉がが開いた次の瞬間、
奥のフロアから何やら楽しげな会話が聞こえて来たのです。

さらに緊張は高まります。会話が聞こえてくる奥のフロアは
全くこちらかは様子を伺うことができない建物の作りとなっています。
引き返すこともできないので、思い切ってフロアに入ってみました。
するとそこには既に50名くらいの参加者が!

恥ずかしながら、何をして良いものか検討もつかないので、
iPhoneをモジモジといじっていた記憶があります。(あー、本当に恥ずかしい。。)
チラッチラッと会場の様子を伺うと、そこには見覚えのある顔が。Paulがいました!
彼は既に他の人と話し込んでいたので、こちらは話が途切れるのを待ちます。
(この間、基本的に一人ぼっち。。心が折れ、逃げ出したい気持ちにもなりました。)

しばらくして、話が終わりました。僕は思い切ってPaulに近づき、
"You must be Paul!"とわざとらしい感じではありますが、声を掛けてみました。
するとPaulも気さくに挨拶をしてくれるではありませんか。
参加の日まで10通くらいメールをやり取りしていたので、初めて会う感じはしません。
その後は、英語と日本語のコミュニケーションの問題について長々と話したと思います。
凄く充実した時間でした。

Paulとの会話の後、緊張が和らぎ、日本人、外国人に関わらず、
色々な人とコミュニケーションを取ることができました。

こうして初参加のMeetupは無事に終了し、
楽しかった!という気持ち一杯で会場を後にしたのでした。
※この日以降、一度も欠席せずMeetupへ参加するようになるとはつゆ知らず。。

***
ここまでが僕の体験談となります。
が、このMeetup、初参加者には大きな2つの壁があると思います。

・1つ目の壁=「英語」
行けば分かるのですが、日本人もそれなりにいます。なので、まずは日本の方から
話してみても良いかもしれません。ただ、原則英語を使いましょう。そうしないと
他の勉強会と変わりません。また、英語圏以外の外国人(中国、ロシア、ヨーロッパ各国等)も
結構いるので、基本的にブロークンな英語で全然行けると思います。

・2つ目の壁=「クックパッドでの開催」
クックパッドと聞くだけで、何やら技術力が高そうです。
ただ、コレも行けば分かるのですが、自分も含めRails使いだけが参加者では無いです。
色んな業界から来ている感じで、PHP界隈の人とか、営業マンっぽい人とか、経理の人とか。。
プログラムすら書けない人も多い印象です。なので、がっつり技術の話をするというわけではないです。
ただ、Railsに少しでも興味が無いとNGだと思います。

どうでしょうか。少しは安心できましたでしょうか。

***
Tokyo Rails Meetupは、僕がRuby会議2011で感じたもどかしさを
解消する凄くいい場だと感じています。

ボロボロでもいいので、まずは技術者に英語を使って参加してほしいなと思います。
外国の方とコミュニケーションが取れることで、間違いなく世界が広がります。
また我々日本人がそうすることで、Rubyはもっと世界に出て行けるとも思うのです。

ボロボロの英語でいいと思います。
僕のRailsアプリケーションなんてボロボロもいいところです。
それでもHerokuに上げたり、we love herokuに登録したりすると、
それなりにリアクションがあって世界が広がります。これと同じだと思います。

周りから馬鹿にされることもあるかもしれません。でも、馬鹿にされたっていいじゃないですか。
周りが馬鹿にするということは、あなたが行動できている証拠でもあると僕は思います。

まずは一歩踏み出してみましょう。

(終わり)
※Paulへはブログで名前を使用する旨伝え、許可済です。

***
参考情報

準備しておくと良いもの
・名刺(英語版があると良いと思います)
・英語での自己紹介や簡単な会話

注意しておきたいこと
・8時までに必ず来ること。8時以降、オフィスの正面玄関が閉まって基本的に入ることができません。

ActionView::Template::Error (Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. のエラー

少し長いエラーメッセージですが。。
Macで開発したアプリケーションがローカルでは動いていたのに、
Herokuへdeploy後、動かなくなることがありました。

そこでいつものように、heroku logsでログを確認したところ、

ActionView::Template::Error (Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

のエラーが。。「JavaScriptを実行するためのランタイムがありませんよ。」と言われています。

当然と言えば当然で、開発しているMac端末では初期出荷状態でJavaScriptを実行出来る環境が整っていますが、
Heroku側は、JavaScriptを実行するための何かしらのランタイムが必要となるわけです。
(MacにはJavaScriptCoreが初期セットアップされています。)

調査した結果、Heroku側のJavaScriptエンジンとして無難そうな「therubyracer」を使うことにしました。
(今勉強中のCedar Stackを使えば済むんでしょうが、いまいち移行方法が分からず。。)

ローカルで開発しているアプリケーションのgemfileへ

gem 'therubyracer'

を追加後、bundle installコマンドを実行します。

bundle install vendor/bundle

※個人的に最近は「vendor/bundle」と付けるようにしています。

ここまでで、エラーが出なければ、後はいつもの流れですね。
最終的にHerokuへpushします。

どうでしょう?エラーが解消されるはずです。

↓下記の情報が役に立ちました。
https://github.com/sstephenson/execjs/issues/39

※Herokuでは、「therubyracer」非推奨という情報もありましたので、
早めにCedar Stackへ移行したいと思います。

Tokyo Rails Meetupのこと〜前編

皆さん、ご存知でしょうか。
東京に住んでいて、かつRuby on Railsに興味がある
日本人、外国人、問わず交流できる場があるのを。
Tokyo Rails Meetupという場がそれです。

今日は僕がこの会に参加するようになった経緯や場の雰囲気等を
お伝え出来ればと思い、書いてみようと思います。
(ちょっと長くなりそうなので、前編・後編に分けようかと思います。)

***参加への経緯〜
今でも鮮明に覚えています。
自分がRubyRailsに興味をもの凄く持ち始めてから、
初めて参加したRuby会議2011にて感じたもどかしさ。
そのもどかしさとは。。

***
Rubyという素晴らしいプログラミング言語が開発された、ここ日本。
Rubyの簡潔かつ英語の構造に近い形で記述可能な優れた点に
強く魅了されたであろう外国の方々が開発したRuby on Rails

Railsが、諸々のWebアプリケーションで採用され、世界中で
大ブレークを果たしていたので、案の定、Ruby会議2011は
日本人、外国人が入り乱れた会議となっていました。

僕も偶然、会場へ向かう電車の中でカナダ人、オーストラリア人の方と
仲良くなり、このインターナショナルな感じがとても気に入り、
高揚した気分で会場へ向かったのを覚えています。
Rubyってこんなに世界中に知れ渡っているんだ!と)

が、実際に会議に参加してみて感じたのは、日本人と外国人の距離。。
基本的に外国の方は英語でプレゼンなり交流を行うのですが、
どれも聞いていて感じたのは、日本人と外国人のコミュニケーションを
円滑に行うにはどのようにすれば良いかということ。
(結局、どの議論もこの点に行き着いていたような気がします。)
外国人の中には、Rubyのことを理解するために日本語を勉強している
人もいましたが、僕は逆に、日本人がもっと英語を使えるようにならないと
駄目だと感じ、とにかく現状がもどかしくて、もどかしくて、悶々とした気分で
会場を後にしたのでした。

***
話は変わりますが、現在の僕の職業はプログラマーではないのです。
ただRubyRailsへの興味は人一倍あり、少しずつ分かる範囲で勉強を続けています。
技術力は劣るかもしれませんが、僕にはある程度の英語力があります。
このRubyRailsへの強い興味と英語力で、Ruby会議2011で感じたもどかしさを
解消できないか、さらには、もっと日本人の技術者へコントリビュートできないかと
日々考えるようになっていました。

***
あれは、去年の10月頃だったでしょうか。
Ruby会議2011を思い返し、HPをチェックしていたところ、
あるではないですか、僕が貢献できそうな場が!

RubyKaigi2011 ビデオ音声書きおこし&翻訳プロジェクト!
https://github.com/ruby-no-kai/rubykaigi/wiki/VideoSubtitleJobs

よく観察すると皆さん大変なのでしょうプロジェクトの進捗状況が思わしくありません。。
その中に、Ruby会議2011で僕が特に魅了された
Aaron Patterson (tenderlove) さんの「Ruby Ruined My Life」が
進捗ほぼゼロの状態で残っているではないですか!

僕はすぐに飛びつきました。そこには担当者の欄に「pwim」とだけありました。
この「pwim」という人物が誰なのか皆目検討もつきません。。
そこで活動を行っている実際の場所を訪問してみました。
http://www.universalsubtitles.org/ja/videos/S7kXNINs9XRG/

そこには、「Paul Mcmahon」なる人物の名前があり、日本人ではないようです。
Paulのことを検索してみると、本人のHPが見つかりました。
http://www.tokyodev.com/

このHP上にコンタクト情報が記載されていたので、早速英語のメールを送ってみました。
そうするとPaulからも返事が。ここからPaulとの関係が始まりました。
彼とメールをしていると、どうもTokyo Rubyist Meetupなるイベントを
主催しており、近日中に開催されるとのこと。「来てみれば?」とのお誘いを受けることに。
ただ、その開催日は僕にとって一番大事な「Album Leaf」というバンドの来日公演が重なっていたのです!

Tokyo Rubyist Meetupへ行けない旨、Paulへ伝えたところ、
今日の本題、「Tokyo Rails Meetupはどう?」となったのでした。。

(続く)
※Paulへはブログで名前を使用する旨伝え、許可済です。

Ruby Twitter Gem -- 特定ユーザーがフォローしているユーザーの情報を100件以上集める方法

Twitter APIを使ってある特定ユーザーがフォローしているユーザーの情報を集める場合、
(ややこしいですね。。)
基本的に100件を超える取得は出来ないとあります。
https://dev.twitter.com/docs/api/1/get/users/lookup

個人的に開発しているアプリで100件を超えるユーザー情報を、
一度に取得したい場合が発生しました。
そこでロジックを少しばかり考えてみましたが、
以下のようにすれば取得は可能でした。
(コレが正しい方法なのか、如何せん現場でゴリゴリWebアプリとかを
作っているわけでは無いので、ご了承&ご指摘下さい。)
Twitter Gemを使用しています。

1)irbを起動します。

2)Twitter Gemをrequireします。

require "twitter"

3)特定ユーザーの情報を取得します。※ユーザー名は任意で変更して下さい。

user = Twitter.user("XXXXX")

4)特定ユーザーがフォローしているユーザー数を取得します。

user_friends_count = user.friends_count

5)ハッシュ「friend_ids」に特定ユーザーがフォローしているユーザー情報を格納します。

friend_ids = Hash.new
friend_ids = Twitter.friend_ids("XXXXX")

6)上記で取得したユーザー情報の中からユーザーIDのみを配列「ids」に格納します。
 ※ここはもっと奇麗なやり方あるんだろうなあと。

ids = Array.new
ids = friend_ids["ids"]

7)最後に上記で取得したユーザーID分の情報を配列「users」に格納して行きます。

i = 0
users = Array.new
cnt = user_friends_count / 100
cnt.times do |cnt|
  users.concat Twitter.users(ids[i..i + 99])
  i = i + 100
end
mod = (user_friends_count % 100) - 1
users.concat Twitter.users(ids[i..i + mod])

ここまでで、100件を超えるユーザー情報を取得出来たはずです。
あとは、配列「users」に格納された情報を自由にお使い下さい。

はてなブログへTwitterウィジェットを追加するとエラーが発生する

何でも書いて行こうということで。
今回は、はてなブログTwitterウィジェットを追加する際、
ちょっとハマったので、お助けになればということで書いてみます。

前から追加しよう、しようと思っていたこのウィジェット
(このブログの右側に表示されているような画面)
まずは下記のサイトにアクセスし、スクリプトを取得するわけですが。。
https://twitter.com/about/resources/widgets/widget_profile

生成されたスクリプトを管理画面→デザイン→詳細タブのページフッタへ
埋め込みます。一端、「プレビュー」なり「この内容に変更する」ボタンを
押すわけですが、そうすると下記のエラーが発生します。
「ご指定のscriptタグは許可されていません。詳しくははてなダイアリーで使えるブログパーツをご覧ください」
。。

2012年4月現在、Twitterのオフィシャルで生成されるスクリプトでは、
登録時、このエラーが発生するようです。

どうすることも出来なかったので、一先ず諸々調べたところ、
Twitterが生成するスクリプトを旧バージョンのもので使用するのがベストと判断しました。
下記のスクリプトを使用してみて下さい。※ユーザー名は変更して下さいね。
(改行コードがNGなこともあるようなので、改行コードを削除してます。)
参照元はYahoo知恵袋です。。orz

<script src="http://widgets.twimg.com/j/2/widget.js"></script><script>new TWTR.Widget({ version: 2, type: 'profile', rpp: 10, interval: 2000, width: 'auto', height: 300, theme: { shell: { background: '#333333', color: '#ffffff' }, tweets: { background: '#000000', color: '#ffffff', links: '#4aed05' } }, features: { scrollbar: true, loop: false, live: true, hashtags: true, timestamp: true, avatars: false, behavior: 'all' }}).render().setUser('iwhurtafly').start();</script>

開発の現場でも良くあるパターンですよね。ちょっと仕様変えると、それ以外の機能が引きずられる。
これを解決するだけで軽く1時間30分は浪費しました。。