僕は発展途上技術者

リングフィットアドベンチャーを入手して本日8日目だった...

リングフィットアドベンチャーを入手して本日8日目だったんだけれど、ちょうど良い頃合いに今日はここまでにしましょう、とか、腕の運動が多めだったので腕のストレッチをやりましょう、とかアドバイスしてくれて、トレーナーがいるかと錯覚するような作りはさすが任天堂だと思う。

このクイズ、景品は結構豪華なんでぜひチャレンジしてみて...

このクイズ、景品は結構豪華なんでぜひチャレンジしてみてください。 https://t.co/ztmrwwlR1q

今週末の予定をGoogleカレンダーでみてみたら、松本...

今週末の予定をGoogleカレンダーでみてみたら、松本で開催されるRuby会議と夢の島でおこなわれるパラリンピックのアーチェリー観戦とでダブルブッキングしていた。どちらもなくなっちゃったけど、どうするつもりだったんだろう?

Facebook->Twitter->ブロ...

Facebook->Twitter->ブログへの連携テスト
うまくいけば、FacebookとTwitterへ両方投稿する面倒問題と、最近ブログをほとんど書かずFacebookやTwitterへの投稿で済ませてしまうため、それらのサービスがなくなってしまうとここ5年くらいの近況やアウトプットが失われてしまう問題を解決できる

子供の科学 2020 9月号掲載「はじめようジブン専用パソコン 第42回 ジャバスクリプトでスクラッチを拡張しよう」を読みました

子供の科学 2020 9月号掲載「はじめようジブン専用パソコン 第42回 ジャバスクリプトでスクラッチを拡張しよう」が僕のブログ記事「Scratch 3.0 の Extension(拡張機能) を試してみた」を参考に書かれているということで、献本をいただきました。どうもありがとうございます。

JavaScript(ジャバスクリプト)を使い、通常のScratchにはないべき乗を求めることができるブロックを実際に作ってみるというのが記事の内容になっています。僕も一通り写経してみた上で、小文字に変換するブロックと文字列を置換するブロックも作ってみました。

僕が作ったブロックは https://sheeptester.github.io/scratch-gui/?url=https://champierre.github.io/stretch/index.js で試すことができます。

Scratch の拡張機能の作り方をこのように詳しく紹介している一般にでている書籍はおそらくこれが日本で初めて(もしかすると世界でも初めて?)ではないでしょうか。興味ある人はぜひ書店にて購入してもらうと良いと思います。

また、子供の科学の記事の最後にもありがたく紹介してもらっているのですが、さらに本格的に拡張機能をつくってみたいという方は、オンラインの有料コンテンツ(途中までは無料で読めます)ですが、技術書展のために書いた「Scratch を改造しよう」を参考にしてみてください。

「ScratchでAIを学ぼう ゲームプログラミングで強化学習を体験」感想

「ScratchでAIを学ぼう ゲームプログラミングで強化学習を体験」を読了しました。

元々買おうと思っていたので自分で発売前から予約していたのと、出版社の日経BP様より献本をいただいたので、2冊揃いました。どうもありがとうございます。一冊は CoderDojo 調布用にでもしようかと思っています。

Amazon のページに発売前から掲載されていた書籍の説明や目次を見ていて、だいたい予想はしていたのだが、Scratch を使っているとはいえ、全編なかなか骨太な内容となっています。

よく一緒に購入されている商品としても表示される拙著「Scratchではじめる機械学習 ―作りながら楽しく学べるAIプログラミング」で言えば、上級編としている第5章の「遺伝的アルゴリズムでネコの動きを進化させよう」と同等かそれ以上のレベルの内容を厚くして、しっかりと理論も理解しながら読み進めていこうという内容だ。

Scratch を使うから簡単というわけでは決してない。そういう見方をしている特に大人の方は大きく裏切られるだろう(そういう方はそもそもこの本を手に取らないような気がするが)。Scratch を使っている利点は、たとえば同じことを Python でやろうと思ったら環境構築が必要でそこでつまづく可能性があるし、Scratch だとプログラムを動かしながら各パラメーターを少し変えてみて、すぐその場で結果を確かめることができるという手軽さがある。そういう意味では、これまでプログラミングしたことがない方が強化学習を学ぶための入門書として適している。

書籍で使っているサンプルは、Scratch のサイト上で動かすことができるし、リミックス(Scratch の世界では、プログラムをコピーして自分で自由に変更できるようにすること)することもできるので、全部一から作る必要はない。僕も、サンプルをリミックスして、実際に動かしたり、コードの中身を覗いてみたり、書籍でも勧めているように、パラメーターをちょくちょく変えてみて読み進んでいった。報酬確率と報酬予測を表示してみて、報酬確率にだんだんと報酬予測が収束していくのを眺めるのは見ていて面白い。

機械学習にはいろいろなアルゴリズムがあるが、どれも大まかには、解決したいある問題があり、始めに大まかに決めた予測をもとに行動を繰り返し、得られた結果をもとに少しずつ調整していって、最後は問題の正解に収束させていく、という似たような方法なんだな、ということを感じた。それは、僕が「Scratchではじめる機械学習」を書きながら学んだことと本書で学んだことの類似点、共通点を見いだせたからであり、このように同じテーマを違った角度から観察することで得られる学びというものがある。そういう意味で、機械学習 + Scratch をテーマにした類書がこれからどんどん出てくる気がするのだが、一冊読んだだけじゃわからなくても別の本を読んでみるということができるようになるのは良いことだ。

少し残念なところがあるとすれば、どのサンプルのゲームも、最初に人間がやってみて、次に強化学習をおこなうコンピューターがやってみて、お互いのスコアを競うという形で進むのだが、レベル1からレベル3までやっても、人間が圧勝してしまい、「強化学習すげー、賢い!」という印象を持ちにくい点だ。おそらく本書の範囲内の入門で扱える方法ではそこまでコンピューターを強くすることができない、あるいは人間のカンってなかなかのものだ、ということだと思うのだが、ゲームの内容やルールを工夫するなどしてなんとか強化学習側が得意なゲームに持っていけなかったものかとは思う。そこは、自分でそうした課題を自分でみつけて、次は読者が強化学習を実装してみなさい、ということなのかもしれない。

強化学習ってどんなものなのかを知りたい方やこれから学ぼうという方には良い入門書、教科書であると思います。

Circle CI で rspec を並列で動かす

Circle CI で rspec をたとえば2個とか3個のコンテナーで並列で動かす方法を調べた。

Circle CI の公式ドキュメントを始め、役立つ記事はいくつかあったのだが、それぞれ少しずつ情報が足りなかったりあるいは一部の手順はすでにわかっているものとして書かれていたりする。全部をひっくるめて総合しないとうまく動かすことができなかったので、自分用のメモのためにも完全な手順を書き残しておく。

タイミングデータを出力する

rspec を並列で動かすには、テスト対象の全ファイルをうまく分けて、2個あるいは3個のコンテナーそれぞれで実行する rspec に配分しなければならない。

この分け方には、単純にファイル名をアルファベット順に並べて均等に分けたり、ファイルサイズで分けるなどいくつかあるのだが、一番効率がいいのが、実行時間が均等になるように分ける --split-by=timings だ。

しかし、この方法を採用にするには、あらかじめ全テストの実行時間を記録したタイミングデータというものが必要で、いくつか設定を行わなければならない。

まず、Gemfile に

group :test do
  gem 'rspec_junit_formatter'
end

を追加し、bundle install する。

rspec を実行したときにタイミングデータを xml ファイルに出力するためには、この rspec_junit_formatter gem が必要だ。

.circle_ci/config.yml の設定

次に .circle_ci/config.yml の設定を以下のように変更する。 変更した部分だけを書き出している。

jobs:
  build:
    parallelism: 2

    steps:
      - run:
          name: Parallel RSpec
          command: |
            TESTFILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings --timings-type=filename)
            bundle exec rspec --format progress --format RspecJunitFormatter -o tmp/test-results/rspec.xml -- $TESTFILES

      - store_test_results:
          path: tmp/test-results

parallelism オプションでは、いくつのコンテナーで並列処理を行ないたいかを設定している。2 と指定すれば、2台のコンテナーで並列処理をおこなう。

Parallel RSpec と名付けたステップでは、タイミングデータを元にして全対象ファイルを実行時間がなるべく均等になるように分割している。次に bundle exec rspec で rspec を実行しているのだが、各オプションを指定することでテストデータを tmp/test-results/rspec.xml に出力している。

タイミングデータを出力するだけでは駄目で、次に rspec を実行するときにこのタイミングデータを利用できるように保存しておく必要がある。その保存先を指定しているのが、store_test_results オプションだ。

設定を変更した直後、1回目に rspec を実行するときは、過去のタイミングデータはまだ保存されていない状態なので、timing data が見つからない旨のメッセージがログ画面に流れる。タイミングデータを利用してファイルを分割できるようになるのは第2回目からである。

以上の設定で、CircleCI 上で rspec を並列に動かすことができる。

rubocop も並列で動かす

rspec の前に rubocop を実行している場合、各コンテナーで同様に全ファイルをチェックするのは無駄に思える。

そこで、以下の設定を .circle_ci/config.yml に追加し、rubocop の対象ファイル app と spec 以下の全 *.rb ファイルをファイルサイズを元に分割して、実行するようにした。

jobs:
  build:
    steps:
      - run:
          name: Parallel rubocop
          command: |
            PROJECTFILES=$(circleci tests glob "app/**/*.rb" "spec/**/*.rb" | circleci tests split --split-by=filesize)
            bundle exec rubocop -c .rubocop.yml -- ${PROJECTFILES}

参考にした記事

『子供の科学』4月号の特集で「Scratch で機械学習にチャレンジ」という記事を書きました

『子供の科学』4月号の特集で、Scratch でつくったゲームを「ML2Scratch」という独自拡張機能を使って、手のジェスチャーで操縦できるようにするという記事を書いた。『子供の科学』Webサイトの「ここだけの話」というコーナーでは、その「ML2Scratch」の裏話として、「Tsukuba Mini Maker Faire」で展示されていた「ワガラザウルス」という恐竜型ロボットの動きを制御するのにも使われているという話題が取り上げられています。

» 子供の科学 2020年4月号(「ここだけの話」はページ中段あたり)

「ワガラザウルス」の開発者の 網野 梓 (Azusa Amino) さんとは、昨年 ML2Scratch を展示するために参加した上海で開催された Shanghai Maker Carnival 2019 で出会ったのが縁で、そのとき ML2Scratch を見せたらとても面白がってくれた。帰国後、ML2Scratch で制御できるように改造された「ワガラザウルス」の動画を見ました。

» ML2Scratchでワガラサウルスを動かしてみました!

僕自身は ML2Scratch のような開発者が面白がって使ってくれるツールを作るのは得意なのかもしれないが、上海のこどもたちやその親御さんたちにも大人気だった「ワガラザウルス」みたいな作品を作る才能もアイデアも持ち合わせてはいない。ですが、上海では網野さん自身が操縦していた「ワガラザウルス」が ML2Scratch の画像認識により誰でも操作できるようになっていると聞いて、見る人を楽しませるのに少しでも貢献できているのかなと思うととても嬉しく思う。

ところで『子供の科学』は、先日吉川英治賞文化賞を受賞されました。子供たちに科学の楽しさを96年間伝え続けている、というのが受賞理由です。96年間も!!すごすぎる。その雑誌の数ページに、僕も書かせていただけるなんてとても光栄なことだと思っています。今回の記事を書くきっかけも作ってくださった 阿部 和広 (Kazuhiro Abe) 先生は、教育に取り組むには長い時間がかかることを覚悟する必要があるというようなことをおっしゃっていたと記憶するのだが、96年間は、まあまあ長いと言えるのではないだろうか。

僕自身は、本業の傍ら片手間に、もともとは自分のこどもたちにプログラミングの楽しさを伝えるのがきっかけで、プログラミング教育に興味を持ち始め関わっています。そろそろそれから10年が経とうとしていますが、まだまだこれと Scratch をつなげたら面白そうと思うアイデアは尽きてはいないので、色々と面白く楽しいものを作ったり発信していこうと思っている。

カリフォルニア5日目 振り返り

日本からの往路を羽田 -> サンフランシスコ、復路をシアトル -> 羽田にしてしまうと、航空券の費用が高くなってしまうので、往復とも羽田 <-> サンフランシスコにしました。このため、シアトルのコミュニティカレッジ巡りを終えてまたサンフランシスコに戻って来ました。最後は空港近くのホテルで一泊したあと明日、日本へ帰国します。

Keep

  • Expedia のポイントが使え、空港近くで安く予約できたので、最後は AirBnB でなくホテル泊にしました。綺麗なモーテルといった感じ。AirBnB はサンフランシスコもシアトルも当たりでとても良かったのですが、やはり少しは気を遣ったりもするので、準備を行い日程をちゃんとこなした息子に良いご褒美となったんじゃないかと思う。疲れて一瞬で寝てしまい、明日朝はすぐ空港に向かうので満喫はほとんどしていないのだけど。
  • このブログエントリーを読んでくださった方が、De Anza に通う日本人の学生を紹介してくださり、滞在中に急遽調整して、ハッカソンに参加中だというところを時間を少しとってもらって、サンフランシスコSOMAのカフェで会って来ました。日本人の学生から日本語でいろいろと情報を聞くことができて、大変ありがたかった。息子とは1歳違いなのに、留学生活で鍛えられているのもあるのだろう、だいぶしっかりされていて、息子もおそらく大きな刺激を受けたことだと思います。息子も彼のように成長してくれるといいなと思いました。
  • ハッカソンの場所も少し見させてもらって雰囲気を感じることができた。
  • ハッカソンに一緒に参加しているという彼の友人のロシア人(同じく De Anza に通っている)も紹介してれて、留学生活に関するアドバイスをもらった。コンピューターサイエンスを学ぶのなら、事前に C++ または Java あるいは Python をやっておいた方がいい、英語は映画やドラマなどを観てとにかくたくさん聞くこと、とにかく準備を怠ってはいけない、という貴重なアドバイスをもらう。あとで聞いたら、まだ長男と同じ年齢だとのことでびっくりした。
  • Uber を初めて使い、空港からホテルへ、そして帰りのサンフランシスコからホテルへ。ドライバーがフレンドリーに身の上話をしてくれてサービスの質が良い上に安い、アプリもとても便利、これを知ったらもうタクシーは乗らないだろうな。

Problem

  • 機内の映画で目についた「トロン」を見始めたのですが、英語のみ字幕なしは流石に厳しく始まってすぐに寝落ちした。で、起きたらトラブルか何かでまだ機は離陸しておらず、次に目についた Google のインターンシップに営業マンのおっさん2人が挑戦するという「インターンシップ」を見始めたら、見知った景色がよく出てくるし、とても面白かったのに、トラブルの遅延を挽回したのか、あっという間にサンフランシスコ に着いてしまって、半分をちょっと過ぎたところで終了してしまった。続きが気になる。
  • ホテルからサンフランシスコ へは、一度は経験しておいた方が良いと思い BART を使って移動。しかし、少し薄汚い雰囲気にセンシティブな長男は気疲れしてしまったよう。また時間がかかり約束の時間にかなり遅れてしまって申し訳ないという思いもあったのだろう。なぜか Uber が高いという間違ったイメージを事前に持っていて、近くのBARTの駅までしか乗せてもらわなかったのだけれど、こんなに時間がかかるなら、ホテルからサンフランシスコへ直接 Uber で移動すべきだった。
  • 最初に渡されたホテルのキーがちゃんと動かず、フロントに戻って取り替えてもらったのだが、車移動前提のモーテルだもんだから、行って戻ってくるのも一苦労。時間をロスしてしまった。まあアメリカあるあるだ。

シアトル2日目 振り返り

シアトルのコミュニティカレッジ訪問2日目の振り返りです。

Problem(悪かったこと)

  • 午後に Edmonds Community College のキャンパスツアーを息子が予約していたのだが、前日にキャンセルのメールが来ていたのに気づかず、キャンパスに到着して初めて気づくことになってしまった。
  • ワシントン大学近くのカフェに行くときに停めた駐車場が若干汚くやばい感じだったのだが、昼間ならば良かろうと思い駐車したが、少し離れたところで怒声をあげているホームレスの人がいたために、長男を怖がらせてしまった。しかしまあ、アメリカで生活しているとどうしてもこういう状況に出会ってしまうことはあるので、良い経験にはなったのではないかと思う。

Keep(良かったこと)

  • 午前中は、シアトルのコミュニティカレッジからの転入先(Transer という)として人気のあるワシントン大学を見てきました。どこか中世のお城のような荘厳な建物が多く、難関ではあるけれど、もしかしてここで学ぶことになるのかもと思い描くことができれば勉学に励む良いモチベーションになるのではないかと思う。カリフォルニアでの人気の Transfer 先である UC バークレーも見ることができたし、コミニュティカレッジがゴールではない息子にとって、その先の進路を何となく思い描けるようになったらいいなと思う。

  • ドタキャンとなってしまった Edmonds Community College、近くのスタッフらしき人を捕まえて事情を説明すると、日本人のスタッフがいらっしゃる International Students Service に連絡してくれ、その場所まで親切に連れてってくださった。残念ながら日本人の方は不在で、それならばこの人に相談すれば良いよと ESL(English Second Learning) の担当の方を紹介してくれた。
  • ESL(English Second Learning) の担当の方はものすごくゆっくり、長男がわかるように話してくれ、長男や僕からの質問に懇切丁寧に答えてくれる。全般的に Community Colleges の関係者は、アメリカではなかなか見られないくらいに親切丁寧で、長男が一人でもやっていけそうかどうか始めは心配であったが、諦めることなく、スクールカウンセラーへの相談や、チューターに教えを請うシステムを遠慮なく利用すれば、問題を一緒に解決してくれそうだという安心感を得ることができた。
  • Google Maps に出て来るレビューを見て、昼は学生が集まるワッフルが美味しいカフェを、夜は良さそうなイタリアンレストランを選んで行ったのだが、両方とも当たり、たいへんおいしく非常に良かった。約20年前カリフォルニアに住んでいた時は、アメリカで美味しい場所を探すのは難しかったのだが、Google がその状況を変えてくれた。

プロフィール

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

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

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

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

Email: webmaster at champierre dot com

Twitter @jishiha

最近のエントリー

アーカイブ