僕は発展途上技術者

僕が読んでいたFlutter本を借りていく長男、モバイ...

僕が読んでいたFlutter本を借りていく長男、モバイルアプリ何か作ろうかなあと言っているので「きみ学生でしょ、10万円でゴースト・オブ・ツシマっぽい中世日本の世界観のフォートナイトみたいなゲーム作ってよ」と、クラウドソーシングシミュレーションゲームをやってあげた。

「Scratchではじめる機械学習」が発売されて一ヶ月...

「Scratchではじめる機械学習」が発売されて一ヶ月とちょっとですが、早くも2刷が出ることになりました。初版を買ってくださった方どうもありがとうございます。この間にもほんの少し修正しているので貴重な初版を持っていると自慢してください:) https://t.co/RT63mYeC2j

https://t.co/8i0sHkgvza 10年...

https://t.co/8i0sHkgvza 10年早かったですね :) @yoski @jokerracer

リングフィットアドベンチャーを入手して本日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}

参考にした記事

プロフィール

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

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

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

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

Email: webmaster at champierre dot com

Twitter @jishiha

最近のエントリー

アーカイブ