僕は発展途上技術者

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

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

いままでのエントリーはこちら↓

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

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

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

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

その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)

今回は 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)

スクラッチの変数の情報を 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)

ポート番号 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 “◯◯(送るメッセージの内容)” というメッセージが送られてくる、ということがわかったかと思う。

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

スクラッチ(1.4)で Romo を動かしたり、Sphero を動かしてみたりしている。

» iPhone がロボットになる Romo を Scratch でコントロールしてみました

» Sphero を Scratch(スクラッチ)から動かせるようにしたのでこどもでもプログラミングできるよ

「凄い!これってどうやっているんですか?」とその仕組みを大人からもこどもからも良く聞かれる。「スクラッチの「遠隔センサー接続」を使っていて、詳しくはScratch Wikiに載っています」と答えてはいたのだが、ページは英語で書かれているし解説もかなりシンプル過ぎていて、これでわかってください、というのも酷だったので、これから何回かにわけて「遠隔センサー接続」の仕組みについて日本語でできるだけ丁寧に解説してみたいと思う。

なぜ「遠隔センサー接続」を使うとスクラッチ以外のものが動かせるのか?

そもそもなぜ「遠隔センサー接続」を使うとスクラッチ以外のものが動かせるのか、説明しよう。

たとえばスクラッチから Romo を動かすには、スクラッチから Romo に何らかの命令を送る必要があるのだが、そのためにはスクラッチと Romo が何らかの形でつながっていなくてはならない。

しかし、スクラッチでの操作は、いつもはスクラッチの中で閉じている。何のことを言っているかわからないかもしれないが、たとえば、「制御」カテゴリのなかの「○○を送る」というブロックで考えてみよう。

「○○を送る」ブロックで送った命令は、同じ「制御」カテゴリの「○○を受け取ったとき」ブロックで受け取る。これがスクラッチの中で閉じている、ということだ。スクラッチで送った命令は同じスクラッチの中でしか、普通は受け取れない。

けれどもスクラッチの「遠隔センサー接続」を有効にすれば、「○○を送る」ブロックで送った命令がスクラッチの中だけではなく、スクラッチ以外の別のプログラムでも受け取れるようになるのだ。

たとえば「前進」という命令をスクラッチから受け取ったら Romo を前進させるプログラムをスクラッチとは別に用意しておく。「遠隔センサー接続」を有効にしたスクラッチの「『前進』を送る」ブロックを使えば、「前進」という命令が Romo を動かすプログラムに届き、そのプログラムが Romo を前進させる。

スクラッチから Romo を動かすのに必要な Scratch2Romo や、Sphero を動かす Scratch2Sphero などはすべて、スクラッチからの命令を受け取ってそれぞれ Romo や Sphero など対応するものを動かす橋渡しをするプログラムなのだ。

「遠隔センサー接続」でできること

「遠隔センサー接続」を有効にしたきに、スクラッチとつながったプログラムに対してできることは以下の2つだ。

  1. いままで説明したように「○○を送る」で送った命令をスクラッチ以外のプログラムにも送ることができる

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

スクラッチとつながったプログラムから逆に、スクラッチに対して以下の2つのことができるようにもなる。

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

  2. 自分で好きに名前を付けたセンサーをつくり、その値をスクラッチとつながったプログラムから変えることができる。スクラッチでは、「調べる」カテゴリの「○○センサーの値」ブロックで値を受け取ることができる

このように「遠隔センサー接続」を有効にすれば、スクラッチ → スクラッチ以外のプログラム という一方向だけでなく、スクラッチ以外のプログラム → スクラッチ という方向に対しても情報を送ることができ、双方向のやり取りができるようになる。

「遠隔センサー接続」を有効にするには

スクラッチの「調べる」カテゴリの一番最後の2つのブロック「○○センサーの値」か「ボタンが押された」のブロックの上で右クリックして現れる「遠隔センサー接続を有効にする」を選ぶ。

次回予告

さて次回は、スクラッチからスクラッチとつながった他のプログラムに対して命令を送っている様子、反対にスクラッチとつながった他のプログラムからスクラッチに対して命令を送っている様子を実際に見てみたいと思う。

デジラボおきなわ第3弾「クリエーターズキャンプ」にメンターとして参加してきました

先週末ですが、沖縄で開催されたデジラボおきなわ第3弾「クリエーターズキャンプ」にメンターとして参加してきました。

デジラボおきなわ クリエーターズキャンプは、第1弾、第2弾でソフトウェア、ハードウェア開発を学んだ小・中・高校生達が2日間の合宿で一からプロダクトを作る、あるいはそれまでの準備期間で作り上げたプロダクトの仕上げをおこない、最終日に発表するというハッカソン形式のイベント。

CoderDojo Okinawaの主催者であり、Ruby on Rails チュートリアルを翻訳した Yasslab こと安川さんと僕は、主に小学生を対象とした「スクラッチでピタゴラ装置を作ろう!」(Making Rube Goldberg Machine with Scratch) というプロジェクトのメンターとして参加しました。

2日間といっても最初の日はイベントの説明や各プロジェクトの紹介などがメインだったので、開発期間は実質1日。最初に定番のねこ逃げでスクラッチのおさらいをした後、それぞれの担当部分のプロジェクトを作り上げていきます。

ピタゴラ装置は全員のプロジェクトがうまく連携しあわないと成功しないので、自然と直接つながる隣同士とは協力しあわないと完成しないところがミソ。とかくプログラミングというと、集中してのめりこんでしまうので、ワークショップ中まったく参加者同士の交流がないといったことになりがちなのですが、このテーマだとコミュニケーションが必須というところが良いところだと思います。

こうして完成した作品を動画におさめ、発表のときに使用しました。

ゴールしたときのこども達の歓声に何度観ても笑みがこぼれます。

成功の裏側には数多くの失敗が。。。成功版もいいですが、こちらの NG 版も僕は好きです。エンジニアリングとは失敗の連続だということも学んでもらえたんじゃないかなあ。

「スクラッチでピタゴラ装置を作ろう!」NG集 from Yohei Yasukawa on Vimeo.

2年前 Scratch@MIT でおこなわれ、僕も参加した教師向けのワークショップを参考に、OtOMO でおこなったスクラッチでピタゴラスイッチマシーンを作ろうを、今回は Raspberry Pi の上で動くスクラッチと電子部品数点で実現してみました。

安価にとても手軽に実現でき、ワークショップのネタとしておすすめで、安川さんがインストラクター向けのドキュメントを用意しているので興味ある方はぜひ参考にしていただきたい。

» ラズベリーパイ版「スクラッチでピタゴラ装置を作ろう!」(インストラクター向け)

さてさて最終発表会では、各プロジェクトが発表し、最後には各スポンサーから賞が手渡されたのだが、残念ながら「ピタゴラ装置」チームは賞を逃してしまいました。

まあ確かに、イベント概要に

自分自身のアイデアを活かして、実際に社会や家庭の課題を解決する製品、「プロダクト」の開発にチャレンジ

とあり、

おうちの人、地域の人、世界の誰かの課題や悩み、困っていることを解決したり、誰かをハッピーにするものが望ましい

とあるので、「ピタゴラ装置」には分が悪かったかな?

でも、発表会の聴衆を楽しませ、そして何より参加している子供たちがハッピーなのは負けていないと思いました。

しかし、大賞を勝ち取った沖縄県西原市西原東中学校チームの「Scratch GPIO + Raspberry Pi でドラムの自動演奏」は文句なく圧巻でした。

Scratch GPIO を使ってドラムをスティックを動かすことを想像するのはそれほど難しくありません。そのアイデアを思いつくことは簡単かもしれない。しかし、それをここまで完成度高く実現した例は初めて見ました。アイデアよりも実践が大切、MIT も説くDemo or Die の精神を目の当たりにした思いで、演奏中感慨で思わずちょっと泣きそうになってしまいました。

最初から最初まで、ドラムを演奏しているのは人間ではなく Raspberry Pi の上で動くスクラッチのプログラムです。

教えにいったのに、実際には沖縄の子どもたちにいろいろと教えてもらった感じです。

おまけ↓ 沖縄の海はやっぱり綺麗でした。

【大人のためのスクラッチ】スクラッチからブラウザを全自動でコントロール - scratch2web

こども向けのプログラミング学習がちょっとしたブームのようだ。

夏休みの自由研究にということだろうか、Amazon の 実用・工作・趣味 の ベストセラー ランキングで小学生からはじめるわくわくプログラミングは上位だし、拙著Raspberry Piではじめる どきどきプログラミング (はじめるプログラミング シリーズ)の方もブログラミングの本としてはそこそこ売れているようだ。両方とも扱っているプログラミング言語はスクラッチだ。

「さあプログラミングを勉強しなさい」ということで、親御さんはこれらの本をこどもに買い与えてはい終わり、というケースが多そうなのだが、ちょっと待って欲しい。スクラッチをこどもだけに使わせておくのはあまりにもったいない。

「え?でもスクラッチってどうせこども向けでしょ」というのは大きな誤解だ。次に多い誤解は、「スクラッチでできることってちょっとしたゲーム作りでしょ。実用的なものでないと大人としてはちょっと…」だ。

スクラッチはゲームを作る以外、実用的なプログラミングだって何でもできる、ということを証明するためにこれから「大人のためのスクラッチ」というシリーズでいくつか例を示していこうと思う。

スクラッチからブラウザを全自動でコントロール

ブラウザを開いてインターネットにつなげ、何らかのページに情報を入力し、ボタンを押すという作業が会社のお仕事の一部になっていることは多いと思う。

そうした作業のなかで、いつも同じ繰り返しになっている部分はないだろうか。毎日ポチポチ手作業でおこなっている操作があるなら、それをプログラムで自動化することで、チリも積もれば何とやら、で節約できる時間は結構なものになるのではないだろうか。

スクラッチでブラウザを全自動でコントロールする方法を以下に紹介しよう。

スクラッチだけではインターネットにつなげることはできないのだが、ruby の watir というライブラリをつかったプログラム(scratch2web と名づけた)を実行しておき、それをコントロールする形で実現してみた。

ブラウザで特定のアドレスを開くには、「goto」という命令をスクラッチから送る。

テキストフィールドに文字を入力するには、「input」という命令を送る。

ボタンを押すには、「click」という命令を送る。

これらを全部組み合わせて、スクラッチのページを開いて「マリオブラザーズ」と検索する操作をスクラッチから自動で行ってみる。

応用すれば、ブラウザでできるほぼどんな操作でもスクラッチから全自動でできる。

突貫で作ったので、ドキュメントが未整備な上にまだ使い勝手が悪いが github に公開しておく。

» scratch2web

順次呼べる命令を増やしていって、普通に使えるツールにしていきたいと思う。

iPhone がロボットになる Romo を Scratch でコントロールしてみました

Romo とは

Romo(ロモ)はiPhoneなどで動く「体感型のエデュケーショナルロボット」で、誰でも動かすことが可能です。iPhoneアプリが頭脳の役割になり、様々な感情や動きを表現することができます。楽しみながら子どもの論理的思考や想像力、思考力を育むことができ、遊びや学びの幅がさらにひろがる可能性を秘めています。

Romo のページ の動画をみれば、どんなことができるのかがわかります。

簡単に言ってしまえば、iPhone にキャタピラがくっつき自在に動き回れるようになる。iPhone のカメラが目になり、マイクは耳に、スピーカーは口に、画面は表情豊かな顔に。ガンタンクのようにキャタピラを付けてみたら、高性能なロボットになった、というコロンブス的な発想が面白い。

Romo の SDK を使えば、Romo を自在にコントロールするアプリを自分で作ることができます。Scratch(ブロック型の命令を組み合わせて簡単にプログラミングできる教育用プログラミング環境) から Romo を動かすために、Scratch からの命令を受け付けて Romo を動かすコントローラーとなるアプリを作ってみました。

Scratch と Romo が動く iPhone とをつなげるために、iPhone には Romo をコントロールできるようにした簡易 Web サーバーを立ち上げておき、PC 上では Scratch の命令をこの Web サーバーに対するアクセスに変換するブリッジプログラム Scratch2Romo を動かします。

構成はこんな感じです。

iPhone の IP アドレスを 10.0.0.2 とすると、http://10.0.0.2/forward というアドレスにアクセスすると Romo が前進します。PC 上では、遠隔センサー接続で接続した Scratch2Romo が Scratch から forward の命令を受け取ると http://10.0.0.2/forward に対してアクセスするという仕組みです。

Romo を正方形を描くように動かす Scratch のプログラムは以下になります。

以下が実際に動いているところです。

PC 上で動くブリッジプログラムと、iPhone 上で動かす Romo をコントロールする Web サーバーアプリのソースコードを GitHub 上に置いておきます。

» https://github.com/champierre/scratch2romo/

iPhone 上で動かすアプリは、Romo を動かすだけでなく、カメラのシャッターを切ったり、ライト代わりにフラッシュを点灯できるようにしています。機能を増やせばもっといろいろなことができそうなので、ドキュメントを順次用意していくとともにこれから改良していきたいと思います。

MacOS X 10.9.3 で nokogiri gem がインストールができないときの対処方法

MacOS X 10.9.3 Mavericks で bundle install を実行したところ

An error occurred while installing nokogiri (1.6.2.1), and Bundler cannot
continue.

nokogiri がインストールできない。良く見る光景です。

libiconv is missing.

とエラーログに表示されているので調べてみると、gem をインストールするときに –use-system-libraries を指定する必要があるとのことなので、

%bundle config build.nokogiri --use-system-libraries 

を実行して、bundle install で nokogiri gem をインストールするときに上記オプションが指定されるようにする。

結果、やはりエラーが起こるのだが、メッセージは変わっている。

You have to install development tools first.

という表示があるので、調べてみると、

%sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2

と、gcc を gcc-4.2 にシンボリックリンクする必要があるとのこと。上記を実行して再度 bundle install を試みると、今度は、

libxml2 version 2.6.21 or later is required!

と表示される。再度調べると、libxml2 のライブラリの場所を下記のように指定する必要がある。

%bundle config build.nokogiri --use-system-libraries --with-xml2-include=
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/
Developer/SDKs/MacOSX10.9.sdk/usr/include/libxml2

上記を実行して、再々度 bundle install を実行してようやく成功。

うーん、環境構築って大変。

原宿を侵略するインベーダーを探しだせ

原宿が密かにスペースインベーダー達に侵略されているということをご存知だろうか?

街のあちこちに写真のようにタイルで描かれたインベーダーを見つけることができます。

どうやらフランスの Invader(インベーダー) と名乗る匿名のアーティスト(日本語での紹介)の仕業のようで、彼のサイト URBAN INVASION DETECTED によれば、東京以外でもすでにパリ・ロンドン・ニューヨークなどなど各国の主要都市のいくつが侵略済みのようです。

これらのインベーダーがどこにいるかは、オフィシャルサイトより購入可能なマップで知ることができるようです。(2014.6.30 時点でショップは Temporary Closed となっていました)

原宿を家族と散歩してきて、いくつか見つけてきたので「まちクエスト」に登録してきました。(まちクエストは自分が開発運用している、スマホを使ってまちを歩きながらクイズに答えて楽しむことができるアプリ/ウェブサービスです)

家族と原宿界隈にでかけたとき、あるいはデートのときなどに探すと楽しいかと思いますので見つけてみてください。

また、クエストと呼んでいる謎解きポイントはユーザーなら誰でも追加できるので、他のインベーダーを見つけたら、よかったら登録してみてください。その際に「インベーダータイル」でタグ付けすると、グループ化されて探しやすくなります。

Recent Entries

Tags

Archives

Admin