僕は発展途上技術者

東京にいながらにしてインターナショナルな環境でプログラマー(Rubyist)として働くというお話

今年も RubyKaigi の日がやってきた。

RubyKaigi が終わると、だいたい決まって皆、「あー、もっと英語ができたらなあ」とか言うのがお決まりだ。初めて Ruby 会議に参加したのはもう7年前になるのだけど、その頃から比べると、海外からの参加者がたくさん増え、セッションもほぼ半分は英語でのものになった。そんな中、僕も含めてだが、自分の英語の未熟さを改めて痛感する機会なのではないだろうか。

そんな人たちにオススメの方法を紹介したい。それは「インターナショナルなメンバーで構成される開発チームの会社で働く」ことだ。いま、コントラクターとして開発のお手伝いをさせてもらっている MediWeb での経験を実例に書いてみる。

9月から MediWeb でお世話になっており、Gold Sponsor 枠で RubyKaigi に参加させてもらったのでそのお礼という意味もあるが、あくまで個人の見解で、この働き方がエンジニアにとっては結構いいんじゃないかと思っているので、勝手に個人のブログで紹介しています。

英語に慣れることができる

まず、僕のバックグラウンドを紹介しておくと、2000年 - 2004年の4年間、サンフランシスコに本社を置くソフトウェアの会社で国際化やローカライズをおこなう QA のエンジニアとして働いていた。なので、一応英語でエンジニアとして仕事をすることは経験している。とはいえ、同僚はネイティブではなくロシアやウクライナ出身のソフトウェアエンジニアばかりだったので、一番聞き取りやすいのはロシア語なまりの英語という感じだった。普通の人よりは、そりゃあだいぶしゃべれるとは思うが、自分的には4年間住んでいたわりには、うーんあまりうまくなってはいないなあ、という自己評価だった。

さらに10年以上のブランクでだいぶ僕の英語力は落ちていたのだが、MediWeb で働き始めて3ヶ月経ち、だいぶ元に戻ってきたかなあと実感している。

3Beesというクリニック向けに予約管理や順番管理の機能を提供するクラウドサービスを Rails で開発しているのだが、本番環境にデプロイするコードは必ずペアプログラミングで書くということが徹底している。開発チームの出身は、フランス・ウクライナ・ポーランド・アメリカ・カナダなど国際色豊かで、そのメンバーと変わるがわるペアを組む。なかには日本語ペラペラの方もいるとは言え、ほぼコミュニケーションは英語、さらにランチも開発メンバーと一緒に行けば英語しばりなので、毎日英語のフリーレッスンを受けているのと同じだ。他にもソースコードのコメント、PRのコメントなど、デフォルト言語は英語だ。

正直最初の2週間とか知恵熱出そうだったが今はもうだいぶ慣れてきた。お金払ってフィリピン留学などして英語を勉強する人がいる中、お金もらっている上に英語も勉強できるなんて、なんともお得な環境だと思う。

今までにない笑いのセンスとかが新鮮、色々な価値観に触れることができる

開発はスクラムの手法にのっとって行なわれ、1週間が1スプリントなため、毎週金曜日にレビューをおこない計画をおこなったあとに、ときにはオフィスで軽くビールを1杯2杯飲んで祝ったりする。

ビールが入れば酔拳よろしく、僕もだいぶ話せるようになり、そんななかである時、フランス語の R の発音は日本人には難しい、みたいな話をしたら紹介された動画がこちら↓

いやあ、これだいぶツボに入って笑ったんだが、こうした笑いの感覚が日本人とはちょっと違っていて面白い。ほかにも北欧の国のどこかのコメディ番組でしかけるドッキリとかも見せてもらい新鮮だったり、CSS で手こずっているときには、Slack で「これ見ろ!」とか言ってこんな Gif 画像が送られてきたり。。こういうのを何と言えばいいのか、上品というかなんかウィットに富んでいる感じだ。

View post on imgur.com

なかには、え?まったくわからんよ、というものもあったりはするが、それも含めて楽しめることができる人には良いんじゃないかなと思っている。

日本的ブラックさが皆無

性格的に結構遠慮がちで、意外と気をつかってしまう。ちょっときついこと言われると気にしちゃったり、「あの人、僕のことどう思っているのかなあ?」とついつい気にしてしまう性格なのだが、そんな僕がアメリカで働いていたときは、正直相手がどう思っているのかとかまったく察しがつかないため、そうした気遣いがほぼ不要で、人間関係で悩むことなく、楽だったことを覚えている。

インターナショナルな開発チームだと、それとかなり似た感覚で仕事ができ、僕にとっては懐かしく心地よい。

新卒で入った会社はそれなりに日本的で、「飲みにいくぞ」と言われたら必ず行かないといけないみたいな上司部下、先輩後輩の間柄というのがあり、大学で一応体育会系の、例えばビール瓶はラベルを上に向けて注ぐといったしきたりを経験してきた僕にとっては、それはそれで楽しくもあり苦ではなかったのだが、継続的に心おだやかでいられるには、欧米式のいい意味でドライな関係というほうが向いている。たぶん多くのソフトウェアエンジニアと共通する価値観じゃないかと思う。

それぞれ自分の時間を大切にするという価値観を持っており、むしろ定時で帰ることがよしとされる。睡眠不足や働き過ぎ、体調崩して、普段のパフォーマンスが出ないのならプロフェッショナルではない、とみなされるようだ。

プロフェッショナルであるという感覚、チームで開発しているという意識が強い

コードは必ずペアプロでおこなう、Pull Request は必ずペアに入っていない別の人にレビューしてもらうなど、開発をすすめていく上でのルールをきっちり守るという雰囲気がある。アメリカで働いていたときにも良く思っていたことだが、決めたルールには皆ちゃんと従うんだなあという印象を持っていた。その理由ははっきりしないのだが、アメリカでもそしてインターナショナルなチームでも言えることであるが、価値観の違う様々なバックグラウンドを持つ人同士で仕事をするには、明文化されたルールだけが唯一の共通のよりどころになるため、よりきっちり守るのだろうかと思っている。

日本的感覚だと、「なにも杓子定規にきっちりしなくても」とか、「融通利かせようよ、こういうときは例外ね」とか言って、なあなあになってどんどん例外が増えていき、破綻し始めるということがある。一方、少しずつルールを最適化していきながら、それにはきっちり従うということを続けていくと、うまく回り始めた時に、特にソフトウェア開発ではとても効率的に物事が進むようになる。

一方で、いい意味でドライということと一見矛盾するかもしれないが、スプリントが終わったときの軽い打ち上げや、障害対応でランチとれなかった時には皆でピザを注文してオフィスで食べるなど、チームで開発しているなあと感じることも多い。

誕生日のときに覚えのない Pull Request がアサインされていて、開いてみたらこんな感じの内容で↓ 粋な感じだ。

まとめ

ソフトウェアエンジニアとして働くなら、海外の会社が環境的に良いと思うのだけれど、たとえばアメリカで働くとなると生活のこととか、こどもがいたら教育のこととかそれなりに大変だ。加えて、サンフランシスコはまだだいぶましだとは思うのだけれど、メシがあまりよろしくない。

「インターナショナルなメンバーで構成される開発チームの会社」でならこれまで挙げた外国で働いたときには得られるメリットを享受しつつ、東京ならおいしいところはたくさんあるし、治安が最高の日本という環境で生活できる。

Ruby/Rails で開発をおこなっているインターナショナルな会社は、探せば存在するので、これまで紹介した環境にあいそうだなあと思う人は、そうした会社で働くことにチャレンジしてみてはどうだろうか。

MediWeb もそうした会社のひとつで、RubyKaigi ではチームのメンバーがウロウロしているはず。僕も参加するので、もし興味があったら @jishiha にメンションをくれれば、どんな感じで働いているのか紹介しますし、開発チームの人にもつなげます。

あるいは本気に正式にコンタクトしたいという方は、こちらへ↓

» 医療クラウドのメディ・ウェブ | 採用情報

BASE ショップの運営をエンジニア力を発揮し、Greasemonkey などで全自動化する

BASE でショップを作って物を売るという初めての経験をしていて、これが結構楽しい。



始めは購入者の情報を別のオーダー用ページにコピペとかしていたが、Greasemonkey などを駆使して全自動で転記できるようにしていたりで、エンジニア力の発揮し甲斐がある。



ちなみに販売しているのは iPhone がロボットになる Romo とそれを Scratch からコントロールできるようにする Scratch2Romo の導入マニュアル。導入マニュアル自体も販売しているが、つくる社ショップから Romo を購入してもらえば、導入マニュアルは無料でプレゼントとお得です。



» つくる社ショップ



Greasemonkey スクリプトを Chrome で動かすために Tampermonkey を使っていて、BASE の管理画面にアクセスすると、専用の Greasemonkey スクリプトが「購入者情報取り込み」と「マニュアル送信」というボタンを表示してくれる。





「購入者情報取り込み」ボタンを押すと、管理画面に表示されている購入者情報のうち、氏名や住所、メールアドレスなどを取り込むことができる。





また、「マニュアル送信」ボタンを押すと、購入者情報から取得したメールアドレスを宛先にして、販売しているマニュアルのダウンロードリンクを送る定型文のメールを宛名を入れた状態で Gmail の画面を開けるようにしている。





購入者情報を取り込んだ状態で、今度は Romo の送付を手配するための専用のオーダーページにアクセスすると、お届け先が自動で入力されるのでとっても楽ちん。





BASE では開発者向けAPIを提供しており、そちらを使った方が筋がいいのかもしれないのだが、Greasemonkey でいまのところ事足りているし、手軽に自動化できて気に入っている。



差し障りない形で BASE の購入者情報を取得できるサンプルの Greasemonkey スクリプトを用意したので公開しておきます。



» base_order_info_retriever_sample.user.js



BASE で物販を運営していて、こんな感じで自動化したいというショップの方がいらっしゃったら、スクリプトを再利用できるかもしれないので、お問い合わせ先までご相談ください。

脳波で Scratch をコントロール - Mind2Scratch

MindWave Mobile という脳波センサーがついたワイヤレスヘッドセットを使って脳波データを取り出し、Scratch 1.4(教育用プログラミング環境)に送って、だれでも脳波データを使ったプログラムを作れるようにしてみました。





MindWave Mobile で計測できる脳波データはいくつかあるのですが、このうち比較的コントロールしやすい Attention と Mediation を使っています。Attention は集中したときに値が高くなります。一点をみつめて「上がれ、上がれ」などと念じると高くなります。Mediation はリラックスしたときに値が大きくなります。目をつぶってリラックスすれば上がりやすいです。



Attention があがると黄色いネコが上に上がり、Mediation があがれば青いネコが上がるようにしています。



両方の値とも 0 - 100 の間で MindWave Mobile で計測することができ、Bluetooth 接続した iPhone で動かしている自作アプリ Mind2Scratch(仮) に送ります。NeuroSky の SDK を組み込んだ Mind2Scratch で脳波データを取得します。



取得した脳波データを、Scratch のリモートセンサ接続(詳細はこちら → Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する)を利用して、Scratch に送ります。



Scratch で動かしているプログラムはこんな感じ↓ これは黄色いネコのプログラムです。





MindWave Mobile のような一般の人でも気軽に手に入れることができる脳波センサーの存在は、福祉用具や医療機器の設計やコンサルティングをおこなわれている 株式会社モノ・ウェルビーイング の榊原さんに教えていただきました。



榊原さんは、手足を自由に動かすことができない障害を持っているような方でも、脳波を使って意思表示することができるのではないかということを考えられており、それならそういうアプリをスクラッチを使って作ってみましょう、ということで実験してみました。



実際に自分の脳波を計測しながら練習を繰り返していると、比較的簡単に集中・リラックスを切り替えることができるようになってくるので、これでいろんなものを自由にコントロールできるかも、と思えてきてワクワクします。



今後は Scratch2Romo ともつなげてみたりして、念力(?!)で Romo を動かすとかもやってみたい。



MindWave Mobile と一緒に、榊原さんからお借りした本を読んで勉強中です。



(MindWave Mobile と Scratch をつなげる Mind2Scratch はまだ絶賛開発中です。体裁を整えたら App Store からダウンロードできるようにします)



 






Show & Tell(ショーアンドテル) at Scratch Day Tokyo 2015 振り返り

今年も Scratch Day Tokyo 2015 が大盛況と言ってんじゃないだろうかという盛り上がりで終わりました。
主催側だとステージ上でのプログラムがなかなか見られないのですが、今年はニコニコ生放送で全編放送されていたおかげで、
それのタイムシフト視聴で存分に楽しめることができました。いまさっき観終えたところです。



僕は昨年、一昨年に引き続き、こどもたちが自分で作ったスクラッチの作品を自分で紹介する Show & Tell を担当しました。さっそく振り返ってみたいと思います。



KEEP(今年できて、今後も続けていきたいこと)




  • このエントリー同様に、昨年も振り返りを残しています。

    きちんと振り返ることで、KEEPで挙げていた点は継続し、PROBLEMに挙げていた点に対しては確実に対策できていると思うので、
    引き続き今年も、もしあれば来年以降も続けていきたいと思っています。

  • 昨年のPROBLEMに挙げていた、オンライン環境が不安定な場合にそなえて作品をあらかじめダウンロードしておくべきだった
    という反省を活かし、作品の差し替えは前日の 20:00 までという制限を設けた上で、それ以降にすべてダウンロードしておきました。
    ダウンロードしたファイルおよびあらかじめ提供してもらった動画ファイルも含めて、発表順に、1番は 1_◯◯ ではなく 01_◯◯ のように
    0 始まりの二桁で番号付けしておくことをきちんとおこなっていたので、この点では手間取ることはありませんでした。

  • Show & Tellに参加したこどもたちの交流の機会をまったく用意することができなかったという昨年の反省があったので、
    Show & Tellが終わって、参加者にもう一度整列してもらったあと、ステージ横に一度集まって写真撮影をする機会を設けました。
    こうすることで参加者同士の顔を覚えたり、Scratch ID を交換するきっかけになったらと思ったのですが、お膳立てはここまで、
    あとはこどもたちにおまかせしました。
    倉本さん中心にOtOMOメンバーで用意したスクラッチIDが書かれたシール、実はプログラミングバトルとShow&Tellに出たこども達は
    ブルーのシールで一般参加者のオレンジのシールとは別だったのです。これによって誰が登壇者なのかがわかるような仕掛けになっていて、
    これも交流の一助になることができたんじゃないかと思います。
  • マルチプレイの模様など、当日のデモでは見せることが難しい部分はあらかじめ動画を用意してもらい送ってもらっていました。

    これは阿部先生にもらったアドバイスに従ったものだったのですが、Facebook グループにて Show&Tell 選考の模様を逐一報告していたために
    もらえたアドバイスなんじゃないかと思います。

  • 申し込みフォームはこれまでの
    フォーマット
    を利用したりとこれまでの資産を存分に利用しました。採用通知に関しても
    Gistに共有
    しているので、来年以降もこれを参考に利用できるようにしています。採用の過程や、特に文面に神経を使う不採用通知はあらかじめ
    Facebook グループでスタッフ間で共有し、チェックしてもらうことでトラブルになりそうなところを事前につぶせたんじゃないかと思います。



PROBLEM(来年以降、今後解決していきたいこと)




  • オフラインエディタで発表することという条件だったので安定した環境は作ることができたのですが、クラウド変数を使いたかったりなどオンラインでないと
    披露できない機能を持った作品に関しては、ブラウザで発表してもらっても良かったなあと思っています。

  • ターボモードでないとストレスなく動かないという作品に関しては、あらかじめ聞いておき、オフラインエディタでもターボモードに切り替えて
    あげて発表してもらえたら良かった。配慮が足りませんでした。

  • スクラッチの日本語フォーラムをきっちりとフォローしておくべきでした。Show&Tellに関する質問を結構フォーラムで
    受けていたのですが、阿部先生にこんな質問来てますよーと教えてもらってから答えるみたいな感じになってしまい、
    レスポンスが悪かったように思います。

  • 相変わらず大人顔負けのMCぶりを披露してくれた宮島くんに安心しきってしまったのですが、今回から手伝ってもらう
    ことになったIくんのフォローが足りず、結果的にちょっとつらい思いをさせてしまいました。事前にきちんと運営側で打ち合わせを
    すべきで、役割をきちんと決めておくべきだったし、簡単なところから手伝ってもらうみたいに緩やかに慣れてもらう手段を
    取るべきだったなと思っています。

  • こちらが用意した環境でない、自身が用意した特別な環境での発表も認めていたのですが、どうしても
    発表に手間取り、結果的には割り当てられていた時間をオーバーしました。ちょっとどう解決すべきか
    まだ具体策が思いつかないのですが、次回までには何らかの策を用意しておきたいです。

  • [追記] ニコニコ生放送は、かなりクオリティが高く、後から視聴できる僕にとってはありがたい限りなのだが、一方で一部登壇している僕でも、コメントを見るのはかなり勇気がいる。こどもにとっては結構酷なコメントも散見されるので、特に登壇しているこどもが後から観る場合には、心ないコメントはゴミみたいなものだから全く気にしなくて良いということをきちんと説明する必要があるし、必要ならば、コメントをオフにして観てもらう、あるいはそのことを親御さんにあらかじめ説明しておくべきだったと思っている。



TRY(次回挑戦したいあらたな試み)




  • PROBLEMというにはあまりに贅沢な悩みなのでTRYに挙げるのですが、年々作品のレベルが上がるし、応募数も
    増えてきて、このままだと次回どうなってしまうのだろうという感じです。これまで基本、ほぼ応募してくれた
    作品は受け入れてきたのですが、来年以降どうしても選考に漏れてしまうという作品がでてきそうです。
    しかしそれは正直やりたくない、応募するというだけでもかなりの勇気が必要で、
    そのすべてに発表する機会をあげたいと願っています。また、今年はびっくりするくらいレベルが高い作品が
    めじろ押しで、そのこと自体は本当に凄いことなのですが、あまりに Show&Tellの作品が凄すぎて、
    「ぼくの、わたしの作品ではダメだわ」とはなからあきらめてしまう子供がでてきてしまうのでは
    とも危惧しています。僕がMITで観たアメリカのShow&Tellでは、天才的な凄い作品もあればそうでない
    作品も等しく受け入れられ評価されていたのを覚えていて、そこが素晴らしいと思い日本でもやりたいと
    思ったわけで、その原点に立ち返り何か良い方策を用意したいと考えています。

  • [追記] 来年は壇上とは別で、ミニShow & Tellコーナーを設けて、初心者でも参加できる雰囲気を作り、そこでひたすら Show & Tell をやるという企画を検討したい。スクラッチデーに来られない人でもリモートで接続できる環境を用意する。さらにひろげて、show & tell の動画を自分で撮って投稿できるサイトを用意し、マイクラ紹介動画のような感覚でこどもたちが気軽に自分のスクラッチ作品紹介動画を投稿できるような場を用意する。

  • 昨年に引き続きやはりゲーム主体、男の子が応募しやすい形式にしてしまっているなあと思っています。
    昨年と同じTRYです。「ゲーム部門、ストーリー部門、音楽部門、ツール部門のように部門をいくつか作る必要があるかもしれません。
    女の子の応募をしやすくする工夫も必要そうです。」

  • PROBLEMにあげたことの解決策もTRYも、もしかしたら大人だけで考えているから良い解決策が思いつかないのかも
    しれません。スクラッチの日本語フォーラムを通して、現役スクラッチャーのこどもたちに助けを借りるのが
    いいのかもしれません。また、スクラッチデーの運営、その中の Show&Tell の運営にも、もう少し
    こどもたちが関われるような工夫をしていく必要があるのかもしれません。

MacOS で rbenv install 2.1.2 しようとすると The Ruby openssl extension was not compiled. Missing the OpenSSL lib? エラー

MacOS で rbenv install 2.1.2 しようとすると The Ruby openssl extension was not compiled. Missing the OpenSSL lib? エラーがでる場合の対処方法。


% CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.2


でインストールすることができました。

iPhone が Xcode から見えなくなったときの対処法

iPhone 6 にしてから、ことあるごとに iPhone が Xcode から見えなくなるという問題に悩まされていた。

Mac の方を再起動すれば直るというのを経験的に知ってはいたが、いちいち面倒。

Stack Overflow で探してみたらあっさり解決。


% sudo pkill usbmuxd


で usbmuxd(MobileDevice(iPhoneとか)とコンピュータをやりとりしているところ) のプロセスを kill すれば良い。(usbmuxd は自動的に再起動する)

» Xcode doesn't see my iOS device but iTunes does

スクラッチからツイートするよ - Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

Scratch Advent Calender 9日目は、3日目に書いた「Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)」の続きになります。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどI とつなぐ「遠隔センサー接続」を解説する(その5)


その1からその4までに解説した方法を使い、Ruby とスクラッチを連携させて、スクラッチだけではできないことを実現してみたいと思います。

Twitterにつぶやく



スクラッチからTwitterにつぶやいてみましょう。

まずは Ruby だけでTwitterにつぶやくプログラムを書いてみます。

こんな感じです↓



上記プログラムを実行するには、


gem install twitter


で twitter gem をインストールしておく必要があります。

また、Application Consumer Key (API Key) などの各設定値は、自分のものに書き換えてください。

各設定値は Twitter にアプリケーションを登録して取得する必要があります。

取得する方法は、

» Twitter(Gem) - 逆引きRuby

などで調べて下さい。

スクラッチからTwitterにつぶやく



スクラッチから命令を送ったらつぶやくようにするには、その2で解説した方法で、スクラッチから Tweet という命令を Ruby に送るようにし、Ruby 側でこの命令を受け取ったら、つぶやく部分を実行するようにします。

プログラムはこんな感じになります↓



実際に実行してみましょう。



スクラッチから Tweet という命令を送ったら「こんにちは」とつぶやくことができました。

Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

Scratch Advent Calender 3日目は、スクラッチのちょっと高度な使い方「遠隔センサー接続」についてです。

» Scratch Advent Calendar 2014

「遠隔センサー接続」はスクラッチと外部のプログラムや機器とをつなげることができる仕組みです。仕組み自体はシンプルなので、比較的簡単にスクラッチとほかのものを連携させることができ、たとえばスクラッチからツイートしたりとか、モーターを動かしたりといったこともできます。

遠隔センサー接続について、このブログでこれまでシリーズで書いてきたので、興味がありましたら その1 から読んでみてください。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

今回は Advent Calender の力を借りて、なかなか筆が進まなかった遠隔センサー接続シリーズの続きを書きたいと思います。

センサーの値を外部のプログラムから変更する



シリーズの最初で遠隔センサー接続でできることを4つ挙げたのですが、そのうちの最後の1つ、スクラッチにカスタムなセンサーをつくってその値を外部のプログラムから変える、ということをやってみます。

スクラッチのセンサーの値を変更する Ruby のプログラムは次のように書けます。



その3で紹介した、スクラッチに命令を送る Ruby プログラムを一行変更したものです。


broadcast "a"


というメッセージの代わりに


sensor-update "a" 1


というメッセージをスクラッチに送っています。

その3で、スクラッチの変数の情報を送るために、スクラッチから Ruby のプログラムに送られたメッセージと実は同じなのだが、Ruby のプログラムからスクラッチに送った場合には、センサーの値を変更することに使われます。

実際にこのプログラムを実行してみましょう。



a という名前のセンサーの値を 0 から 1 に変更することができました。

その1からその4までで、遠隔センサー接続でできる4つのことを実際に Ruby のプログラムを使ってやってみました。

次回はこれらを応用して、Scratch と Ruby のプログラムを連携させて何か作ってみましょう。

Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

2ヶ月近くのブランクがあいての続編。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

スクラッチの変数の情報を Ruby のプログラムに送ってみる



前回まででスクラッチの「◯◯を送る」ブロックを使って、スクラッチから Ruby のプログラムに対してメッセージを送ってみた。

次に、スクラッチの変数の情報を Ruby のプログラムに送ってみよう。

前回同様、スクラッチの遠隔センサー接続を有効にし、スクラッチからのメッセージをのぞき見る Ruby のプログラムをスタートさせる。

スクラッチで「a」という変数を「すべてのスプライト用」に作る。



すると、変数を作った瞬間


0000001473656e736f722d75706461746520226122203020


というメッセージが Ruby のプログラムに送られる。

これを前回同様、ASCII文字コードをたよりに解読すると、


00 00 00 14 | 73 65 6e 73 6f 72 2d 75 70 64 61 74 65 20 22 61 22 20 30 20
長さ20バイト s e n s o r - u p d a t e SP " a " SP 0 SP
(SP はスペース)


となる。

sensor-update(センサーの値を更新、という意味)という命令に続いて、スペースを一つおいて変数名 a を " (ダブルクオート)で囲み、変数の値 0 に続いてスペースという順に並んでいる。

スクラッチで新しく変数を作ると、最初は自動的に 0 が入ったよ、という情報が Ruby のプログラムに送られたのだ。

試しに変数を変えてみよう。



まず a の値を 1 に変えたあと、次に 2 に変えてみた。

最初に変えたときに送られたメッセージは、


00 00 00 14 | 73 65 6e 73 6f 72 2d 75 70 64 61 74 65 20 22 61 22 20 31 20
長さ20バイト s e n s o r - u p d a t e SP " a " SP 1 SP
(SP はスペース)


次に変えたときに送られたメッセージは、


00 00 00 14 | 73 65 6e 73 6f 72 2d 75 70 64 61 74 65 20 22 61 22 20 32 20
長さ20バイト s e n s o r - u p d a t e SP " a " SP 2 SP
(SP はスペース)


変数の値の部分が最初は 1 に、次に 2 に変わっているのがわかる。

『「すべてのスプライト用」の変数に値を入れると、その変数の名前と新しくセットされた変数の値の情報を、スクラッチ以外のプログラムに送ることができる』ことがわかった。

Ruby のプログラムからスクラッチに命令を送ってみる



今まではスクラッチから Ruby のプログラムに命令や情報を送る例を見てきた。

今度は逆に、Ruby のプログラムからスクラッチに命令を送っている様子を見てみよう。

スクラッチに命令を送る Ruby のプログラムは次のように書ける。



コメント行を抜かした最初の2行は、前回までのスクラッチからの命令を受けるプログラムと一緒だ。

外部のプログラムからスクラッチに送るメッセージの形式は、いままでのスクラッチから外部のプログラムに送られるメッセージの形式と同じで、最初の4バイトは命令文の長さを表しており、その後に命令文自体が続く。


broadcast "a"


という命令の長さを


length = command.length


で求め、


bytes = [length].pack("N")


でバイト列に変換している。

そして最後に


socket.write(bytes + command)


でこの Ruby プログラムがつながった先、つまりスクラッチに命令を送っている。

スクラッチに送った命令の内容は、


broadcast "a"


Scratch Wiki に書かれている情報から組み立てたものなのだが、これはスクラッチの「a を送る」ブロックと同じ命令だ。

つまり、スクラッチの「a を送る」と同じことを、スクラッチではない Ruby のプログラムから実行できるということだ。

「a」を受け取ったら「こんにちは」とネコが言うスクリプトを作ってみて、Ruby のプログラムからネコに「こんにちは」と言わせてみよう。



『スクラッチとつながったプログラムからスクラッチに対して、「○○を送る」と同じ仕組みの命令を送ることができる。スクラッチではこの命令を「○○を受け取ったとき」ブロックで受け取ることができる』ということがわかった。

Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

のんびり書こうかなとも思っていたが、こちらの記事 →Pyonkeeで遊ぼう! でも紹介されたりと期待もされているようなので続けざまに2回目を書きます。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

ポート番号 42001 を開放



前回の記事で、スクラッチの「遠隔センサー接続」を有効にする方法を書いた。

「遠隔センサー接続」を有効にするとスクラッチは TCP のポート番号 42001 を開放する。

スクラッチのユーザーを意識して、コンピューターのことにまだ詳しくない人にも、できればスクラッチ中上級者になったこどもたちにもわかるようにと思ってこの記事を書いているが、とはいえ全部を説明しだすとキリがないので、TCP について、あるいはポート番号についてもっと詳しく知りたかったら Wikipedia などで調べて欲しい。

ポート番号というのは、語源が port(船の荷物の出入口)であることから連想できるように、プログラム同士をつなげて通信するときの出入口の番号だと思ってもらいたい。ポート番号というのは実はたくさんあるのだけれど、42001 番の出入口だけが開いて、そこからだけ通信できるようになると想像してほしい。

Ruby のプログラムをスクラッチにつなげる



これ以降の説明では Ruby が登場する。Ruby がわかっているのが望ましいが、遠隔センサー接続の仕組み自体は実はそれほど難しいわけではないし、説明にはアニメーションgifを使って実際に動いている様子を見せるようにするので、Ruby がわかっていなくても何となく雰囲気だけでもわかってもらえるかもしれない。

Scratch につなげる Ruby のプログラムは以下の通り、コメントを抜かせばたった2行だ。



localhost とは、プログラムを動かしているマシンのそのもののアドレスだ。スクラッチとこの ruby のプログラムは同じマシン上で動いているので、つなげる接続先は、同じマシン上の TCP 番号 42001 となる。

これを実行してみても、特に何も起こらない。プログラムをスクラッチにつなげただけで何もせず終了しているからだ。



スクラッチからのメッセージを覗き見る



スクラッチにつなげたあと、送られてきたメッセージを読み込んで表示するプログラムを追加した。



loop do と end で囲む部分はスクラッチでいえば「ずっと」のブロックだ。囲まれた部分はプログラムを中断するまでずっとループし続ける。

socket.recv(100) で、ポート番号 42001 から流れてくるメッセージを十分な長さ(100バイト)受け取っている。

そして puts message.unpack("H*")[0] でメッセージをバイトで表示している。unpack("H*")[0] は16進文字列に変換する命令だ。

これを実行して、試しに「◯◯を送る」ブロックで a というメッセージを送ってみる。



「a を送る」をクリックするたび、何やら謎めいた文字列が表示されているのがわかるだろうか。メッセージの内容は良いとして、どうやらスクラッチから Ruby のプログラムに何らかのメッセージが送られているらしいということはわかってもらえたと思う。

メッセージの内容を読み解く



「a を送る」をクリックしたときにスクラッチから送られてきたメッセージは


0000000d62726f61646361737420226122


だ。これは送られてきたメッセージを16進文字列で表示したものだ。

読みやすくするため数字2つずつで区切ってみる。


00 00 00 0d 62 72 6f 61 64 63 61 73 74 20 22 61 22


Scratch Wiki の Remote Sensors Protocol の説明を読めばわかるのだが、スクラッチとの間でやり取りされるメッセージは、最初の4バイトとその残りとに分けられ、最初の4バイトは残りのメッセージが何バイトなのかの長さを示している。

上記の例では


00 00 00 0d


が残りのメッセージのサイズを示している部分だ。これを10進数で表すと 13、つまりその後に続くメッセージの長さは 13 バイトであることを示していて、0d に続く 62 以降のバイト(2つの文字または数字のかたまり)を数えてみれば 13 個であることがわかる。

残りのメッセージの部分


62 72 6f 61 64 63 61 73 74 20 22 61 22


は、ASCII 文字列(本当は UTF-8 なのだが英数字しか登場していないので ASCII 文字列と考えて良い)の16進数表示だ。

ASCII文字コードを頼りに、置き換えてみよう。

62 → b、72 → r、.... 20 → スペース、22 → " と置き換えていくと、


62 72 6f 61 64 63 61 73 74 20 22 61 22
b r o a d c a s t " a "


のように暗号が解ける。

スクラッチから送られてきていたメッセージは broadcast "a"(a をブロードキャスト、放送する)だったことがわかる。

「制御」カテゴリの「◯◯を送る」ブロックは実は英語では「broadcast ◯◯」ブロックなのだ。スクラッチの言語を英語に切り替えてみればそれが確認できる。

これで、「◯◯を送る」を実行すると、スクラッチから broadcast "◯◯(送るメッセージの内容)" というメッセージが送られてくる、ということがわかったかと思う。

プロフィール

株式会社まちクエスト代表、つくる社LLC代表。

Scratchで楽しく学ぶ アート&サイエンスRaspberry Piではじめる どきどきプログラミングを書きました。

オンラインコンテンツ: 大人のためのScratch

Amazonから図書館検索 Libron、iPhoneアプリ ひらがなゲーム かなぶん を作っています。

Email: webmaster at champierre dot com

Twitter @jishiha

最近のエントリー

アーカイブ