2015年12月23日水曜日

プログラミング教育について

本エントリは特に技術的な内容ではない。

技術畑なので偉そうなことも言えないが、プログラマ/エンジニア的視点で見えている社会というものも、それなりにある。

今日は、最近よく話題に上る、プログラミング教育について私の考えていることを書きたい。

長いので読んでられない人向けに3行のまとめも付けておいた。下から2つ目の副題にある(なお最後の副題は日記である)。

プログラミング教育がもたらすもの

私がプログラマだから思うのだろうか、プログラミング教育にみんな過剰に期待し過ぎに思える。

プログラミングを学ばせたからといって論理的に考えたりできるようになるわけではない。もちろん別に非論理的になるわけでもない。

少なくとも、よく言う「理屈に沿って物を考える」という意味における論理的な態度と、プログラミングが、特に結びつくように私には思えない。

しかしながらプログラミング教育は意味があることだと私は思う。なぜなら、現代の多くのものは、プログラムされて動いているからである。

多面視的な態度

教育の効能とはなんだろうか。教育の段階に応じて様々にあるだろうが、重要なもののうちの一つに、物の見方が増えるという効果が挙げられるだろう。

例えば一台の自動車がある。内燃機関で燃料が起こす燃焼の物理的・化学的な理論。前進しながらハンドルをを切ったときの軌跡を描く数式。自動車やエンジンが変えた社会ともたらした新たな問題、それ以前、以降を比較する歴史の知識。

このように、高校卒業程度の教育によって、一つのものに対して、その構成する要素や、する挙動、それにより構成されるより大きな構造に思いを巡らすことができる。

ところで、現代の自動車とセットになるのは、大抵カーナビゲーションシステムだろう。ところがこのナビゲーションシステムの「システム」がどう構成されどう動いているのか(念のため言っておくと、GPSがなぜ動くかとか相対性理論とか、そういう話ではない)思いを巡らせるための教育というのは、現在のところあまり充実していない。少なくともいわゆる「5教科」より充実していないだろう。

教育の効能の一つが、現代の様々な事象の見方を増やすことであるとするならば、その教育の一つに現代の構成要素の一つであるプログラミングが含まれないことが、そろそろ問題視されてくる頃合いではないだろうか。少なくとも情報技術はその著しい成長速度によって、ずいぶんと成熟した技術・産業となっている。

教育の効能を保ち続け欠けさせないために、教育が教育であるために、プログラミング教育という要素を取り入れなければいけない時代になってきているわけである。

論理的な態度

プログラミング教育によって論理的な態度が身に着くわけではないように思える、と言った。しかし、現代のこの状況において、プログラミング教育は結果として、論理的思考力を高めることもあるだろう。

私の考える理由はこうだ。

まず、単純に言って、多面視的態度を身に着けることは考える量が増えることであり、同時に論理的思考力も鍛えられる。これを疑ってかかる人は少ないと思う。見える面が増えれば、理屈も増え、理屈同士の繋がりを筋道立って考えられる力も鍛えられる、そういうわけだ。

次に、プログラミングすることは、要素の繋がりと動きの手順を考えてシステム(物事の進行の仕組み)を形作ることである。そして現代はシステム化が重要な社会で、秀でている人間は論理的だとみなされやすい。もちろんシステムを作ることに精通するためには、多面的な視点を持つことは最重要とも言える程度に重要なわけだから、先に挙げたものを別の言い方をしただけとも言えるが。

まとめ

私たちの身の回りは、既存の教育カリキュラムには乏しい「プログラミング」によって構成されるものがほとんどを占める社会になっている。

教育が、その効能の一つである「物の多面的見方を養うこと」を保ち続けるために、カリキュラムを現実の社会に即したものに更新していくのは大事なことである。

論理的思考能力は、プログラミング教育そのものではなく「現代の物事を多面的に見られること」で養われる。

日記:鬼は笑えど

日記のようなものは最後に書くのがこのブログのスタイルである。

このブログをたくさんの人に読んでほしいとかはもう始めから考えてなかったのだけど、とある友人が最近ブログを始めて、そこそこに読んでもらえていると聞き、にわかにブログを書こうという気力が出てきた次第、というわけだ。

昔から文章を書くのは好きな方なので、なるべく読んでくださるであろう方々のほうを向きながら、書いていきたい所存である。

もっとも、明日にはやる気をなくしているかもしれないが、そんなことはこの副題の通りである。

2015年11月13日金曜日

Box2D.jsとjQueryを共存させて使う場合、読み込みの順序に注意が必要である

どのような状況で何が起きどうすると解決できるのか?

そもそもBox2DのJavaScript実装に様々なものがありすぎてどれのことを言っているのかわからないことが多いので、先にはっきりさせておこう。

kripken/box2d.js 今回問題とするBox2DのJavaScriptバインドはこちらである。Emscriptenとかいう、C/C++をJavaScriptに変換する 黒魔術 技術を用いた何か、らしい。

これとjQueryを共存させて使う場合、Box2D.jsをscriptタグで読み込んだのちにjQueryを読み込むようにしないといけない。

    <script src="js/Box2D_v2.3.1_min.js"></script>
    <script src="js/jquery-2.1.4.min.js"></script>

上記のようにする。

    <script src="js/jquery-2.1.4.min.js"></script>
    <script src="js/Box2D_v2.3.1_min.js"></script>

もし逆にすると、jQueryの$関数がうまく動いてくれない。具体的には

Uncaught TypeError: Cannot read property 'ready' of undefined

このようなエラーを

$(document).ready(function(){console.log('foo');});
のようなエラーを$関数を使ったコードで発生させる(Chromeコンソール上での表記)

日記

みんな(書くのは)大好き(読むのは苦痛な)日記のコーナーである(から後半に置いた)。

#1 無所属

最近半年ほど業務委託を受けていた企業との契約が終わりとなり、完全にフリーになった。といってもまだきちんとした個人事業主届け…といったか、を出してないので、無職とも言える。つまるところ働いているという状態を定義するのは実に難しいことだとわかる。

#2 ホワイトボード

フリーになった記念(?)にホワイトボードを買った。自宅で仕事してるっぽさも出るし、無駄紙を出さずにアイディアを適当に書ける/描けるので便利である。もし保存したいときはスマホで撮れば良いのだ。

#3 経験

業務委託先ではゲーム系のエンジニアをやっていたのだが、今個人でやっている何かではガチガチのWebをやっている。経験を活かして~などと軽々しくいう人を雇いづらいのがわかる。未経験のジャングルを切り開いた経験以外を経験と呼ぶのは避けたいと思った。メタ経験か。

クライアントサイドもサーバサイドも一人でやっていると、言語がコロコロと変わって面白い。嘘をついた。面白くもなんともない。次のPJではサーバサイドでもnode.jsを使いたい。

#4 開発環境

最近はWebということでAtom(のキーバインドをぎったんぎったんにこねくり回した何か)を使っている。

それと、このエントリを書くときに思った以上にHTML上にHTMLを書くのは面倒だとわかったので、使ったツールを張っておこうと思う。便利だった。

HTML entity encoder/decoder

#5 ニュータイプ(他者とわかりあうために)

人が人をわかったような気になるのは簡単なことだ。僕らはわかりあえないことをわかりあおうじゃないか。

2015年10月23日金曜日

Unityで値リンクするものを作った の解説

値リンク 概説

まず値リンクとは何か説明しよう。
値リンク、値バインドともいう(というかそちらのほうがメジャーな言い方だ)が、つまりこれは、「特定の値」が変更された際、ほかの値に変更を及ぼすコードをラップしたライブラリのこと、である。
値リンクが最も威力を発揮するGUIアプリケーションの場合、上記の特定の値とは、つまるところモデルデータであることが多い。
UnityのようなゲームにおいてはMVCが単純には適用できない(この話はまた今度したい)ためにその限りではないが、この特定の値はおおよそほかのオブジェクトに影響を与えたい根幹オブジェクトの値そのものであったり、あるいはモデルデータであったりする。
リンクすると言っても特に特別なことをしているわけではない。基本的な構造は以下のとおりである。
  1. 影響を及ぼしたい特定の値をラップしたクラスを作成する
  2. 特定の値のラップクラスにGetter,Setterを設定する
  3. ラップクラスにイベントリスナを設定する、この登録されたイベントリスナがほかの値に影響を及ぼし、値を伝播させる
  4. Setterに値が渡された際にイベントリスナを、変更された値(ライブラリによっては変更前の値も渡すことがある)と共にコールする
と、ざっと簡単だ。Setterがイベントリスナをコールし、そのイベントリスナの実装がほかの関連する値に、変更された値を伝播させる。
実際のコード上ではこういうことが起きており、これにより値は変更時に瞬時に他の関連する値に伝播する(なお、JavaFX等高度なライブラリではより効率的に値を伝播させるために値の伝播のコールを伝播先の値が評価されるまで遅延させたりする場合もある)。

値リンクの使いどころ

この値リンクはどこで使われているか。最も身近な例としては、色選択のスライダである。

このようなUIがあるとしよう。R,G,Bのそれぞれのスライダを動かすと、プレビューの色は瞬時に反映され変更された色が表示される必要がある。
これらをシンプルな値リンクを用いて解決すると以下のようになる
  1. R,G,Bのカラー値をそれぞれモデルとしてとり、スライダの移動に合わせて変更する
  2. モデルは変更に合わせてプレビューの色のデータを連動させる
なお、より強くUI系にも結び付いた値リンクシステムであれば、スライダの移動データ自体がモデルになっており、そのモデルとカラーモデル、さらにプレビューの色のモデルをそれぞれにリンクさせるようなことをする場合もある。
もちろんシステムと十分に強くモデル的に結びついた値リンクシステムは、Unityで構成するようなゲームにはあまり向いていないので、より柔らかく必要なときにのみ必要な利用ができるようなシステムのほうが良いが、GUIアプリケーション系ではそういうシステムのライブラリもある。

Unityでどんな時に値リンクがあると便利か

基本的にはユーザインタフェースコードの煩雑さを防ぐために用いるのが最も良い適用例である。
なんにでもこれを適用しよう、というのはあまり良い手法ではない。
特にゲームにおいて、ゲームのロジック記述は「コードによる文で語られるべき」箇所もあり、かといって「値のリンクによるデータで記されるべき」個所もある。
このあたりの見極めは大事で、ともすればいったい何をしたいコードなのかが霧散しているような状態を作り出してしまう。
上に、ユーザインタフェースコードの煩雑さを防ぐために~と書いたが、より一般化して言えばこういうことである
同じ内容のデータの表示を多様な手法で行いたいが、データは一つであり、それは与えられたり変更されたりする
こういう状況が起きているとき、値リンクは最も威力を発揮するだろう。
簡単に例示するとこういう状況だ。

ここではAliceがクリックなどのアクションで選択されており、このAliceを選択することは「選択中のキャラクター」というモデルに変更を加えることになる。およそこのモデルはenum等で表される値だろう。これで、キャラクターのUIに対してモデルより伝播させた値により、選択中のキャラクターをハイライトすることができる。
さらに可能なアクションが引き出される。これは、Aliceを選択した際に、Aliceのオブジェクトにあるアクションリストを「利用可能なアクション」のモデルに適用したことによって反映されるだろう。
さらにここで会話を選んだとする。この会話アクションが必要なデータとしてキャラクターの名前があるとしたら、それは「選択中のキャラクター」モデルより引き出すことができるだろう。
あるいはさらに、この会話アクションのクラスデータに対して「選択中のキャラクター」が変更された際に「キャラクターの名前」のデータを伝播させることもできる。これによってクラス依存関係の逆転を起こせば、よりすっきりしたクラスの参照関係を作れるかもしれない。
この状況ではAliceというキャラクターがいくつかのデータを持ち、そのデータが色々な表現方法で表現されている。まさに先に挙げた状況にマッチするだろう。

最後に多少別の話題を - 相互リンクはどのように行われるか?

たとえば、先のRGBスライダの話で、プレビューをクリックするとランダムにプレビューの色が変わり、それがカラーモデルに反映され、さらにそのモデルよりRGBのスライダを動かしたい、という状況を想定する。
これは、カラーモデルとRGBスライダの相互リンクに他ならない。JavaFX等では双方向値バインド bidirectional value bind と呼んだりする。
ところで、値の変更時にはイベントリスナがコールされる。片側が変更されたときにもう片側を変更し、それがさらに伝播すると無限にイベントリスナがコールされ、メソッドのコールスタック領域を食いつぶしてしまう。
これを防ぐため、特殊なイベントリスナを用いて、片側からもう方側へ変更が伝播したらそこで止めるようにする。特殊な、と言っても単純だ。以下に示す。
  1. イベントリスナの実装クラスが値Aよりコールされる
  2. 値Bへ値を伝える前に、あらかじめフラグを立てておき、値Bへ値を伝播する
  3. 値Bでも同じイベントリスナがコールされるが、あらかじめ立てておいたフラグにより値Aへの伝播は抑制され、またフラグは回収されて下ろされる
これだけである。値BからAでも同じことが起きる。
このイベントリスナは、一度にきちんと2つのモデルにまたがって登録されなければいけないため、大抵の場合staticなメソッドによって、隠蔽されたコンストラクタが呼び出され、そこで生成されたオブジェクトが2つのモデルに登録される、という形式を踏むのが一般的なようだ。

2015年9月23日水曜日

Unity 上で値リンクするものを作った

作った。こちら。

Github - TakafumiFukuyo/UniDLink

Unity 上で値をリンクするライブラリである。

JavaFX の value-bind 機構に近い、といえばわかりやすいだろうか?(むしろ余計にわかりづらいだろうか?)

この下にいろいろと解説を書いたが、今は脳みそが回らなくて微妙な文章が生成されてきたので消した。また次辺りのpostで解説するかもしれない。

2015年5月25日月曜日

特定の実行環境上かつ Unity 5.0.2f1 上で Scroll Rect と Mask コンポーネントを用いた際に起きるバグについて

Unity 5.0.2f1(記憶の限りでは1f1でも同様だったように思える)上で、Scroll Rect Component と Mask Component を用いて、そのMaskに用いた Rect をはみ出るような構成をした上で Scroll すると、はみ出た部分がきちんと Mask されずにちらついて見えるバグを発見した。

これは私の持っているデスクトップPC(AMD Radeon HD 7850を用いている)で起きた。Intel チップの載ったラップトップPCや Android(少なくともNexus 7) では起きなかった。

ドライバの構成は以下のとおりである。

iPhone や nVidia チップに関しては試験環境がなく不明であるが、少なくとも環境依存するバグのようである。

--以下個人的日記--

近くバグ報告をしたい。が、英語力がない。ほんやくチーム…いやチームまでは要らないか…ほんやくマンが必要だ。

2015年4月16日木曜日

Unity uGUIのMoveイベントはポインタがMoveしたときのイベントではない

--要約を本文より抜粋--

そう、イベント「Move」は確かにカーソルが動いたときに発動する…発動するがカーソルがマウスカーソルだともタッチのポインタカーソルだとも言っていない…つまりUnityがそう指定すればカーソルは現在選択中のGUIカーソル、つまりTabやArrow Keyで移動できるカーソルが「Move」したときに発動させることも可能だと言うこと…ッッ!!!

--以下が本文だが日記を含むので不要な場合は読む必要はない--

最近uGUIで仕事をしている。

ポインターの動きを追って、それによってこちらで動きを知りたかった。

ドキュメントやVisual Studioのコード補完でMoveというものがあったので使う。

うんともすんとも言わない。

そう、Moveは確かにカーソルが動いたときに発動する…発動するがカーソルがマウスカーソルだともタッチのポインタカーソルだとも言っていない…つまりUnityがそう指定すればカーソルは現在選択中のGUIカーソル、つまりTabやArrow Keyで移動できるカーソルが「Move」したときに発動させることも可能だと言うこと…ッッ!!!

つまるところそういうことだ。

マウスが動くだけならOnEnter等、タッチしてどうこう、であればOnDrag等を用いるべきだと言うことがわかった。

余談だが源典を読んだことがなくても様々な創作物のネタを理解することができるのはインターネット時代以降に限ることなのだろうか。それはそれとして、寝る。

2015年3月26日木曜日

Arduino LeonardoでApple Extended Keyboard IIをUSBで繋ぐ

Apple Extended Keyboard IIというものを、少し前に入手した。引っ越しの少し前だったので今USB化するのも運ぶ手間もあると思ってしなかったのだが、引っ越しが終わってひと段落した。東京である。

というわけでApple Extended Keyboard IIのUSB化である。日本語で出る情報で適当にググるとDa Vinciというボードを用いたものに当たる。だが今回はArduino Leonardoを用いることにした。理由は特にない。しいていえばたまたま入手できたからである、

こことかここを見ながら配線とtmk_keyboard内のadb_usbのmake、avrdudeによる書き込みを行う。

なお、WinAVR20100110版をWindows 8.1に普通に入れて普通にmakeするとmakeがerrorを吐いて止まる。エラーコード(戻り値?)は -1073741502 だった。

適当にググるこんなサイトに当たる。

このファイルをWinAVRのutils/binにぶち込め、と言ってmsys-1.0.dllを添付している人がいるが、いくらなんでも怖すぎるので自分でmsysを落としてくる。msysの落とし方は適宜ググってほしい。そこまで解説するのはつらい。

mingw-getでmsys-baseあたりを適当にインストールすると、msys/1.0/binにmsys-1.0.dllがたぶん公式から落ちてきているであろうと思われる雰囲気で存在している。少なくともさっきのより怖くない。

これをさっき言われた通りutils/binに入れるとmakeが走るようになる。

そこから先はだいたい先に挙げた日本語の情報に従う。DINコネクタの配線には注意する。

さて、makeも、配線も、avrdudeによる書き込みも終わったと思う。ところでこのDINコネクタのADBピンは、いったいArduino Leonardoのどのピンにつなげれば良いのだろうか?

結論から言うと、Arduino Leonardoのシルク印刷にSCLと記述されているピンにつなげばよい。

この情報は、先の日本語情報や、tmk_keyboardのgithubにあるPD0ピンがデフォルトだよ、という情報と、Arduino公式の32u4とArduinoボードのピンアサインマッピングのページを見ると良い。PD0はSCLにつながっている、との記述があるので、ADBピンをSCLに、Vccを5Vに、GNDをGNDにそれぞれつなげる。

これで完成だ。