読者です 読者をやめる 読者になる 読者になる

過去と未来が出会う場所

「ひと」の場を構築するために

Twitter_botアプリが(ほぼ)完成しました。

開発

5ヶ月ほどかかり、やっと自分が納得する作品ができあがりました。

いい経験ができました。 いろいろと調べながらやりましたが、とくにはまったポイントとしては、

1.Rails軽量Ver.のSinatra+ActiveRecordを使用したところ。  
2.Herokuにデプロイするところ。  
3.TwitterAPIとメディアツイートの際、データ格納にAmazon S3 を利用したところ。  
4.Gemfileのbundlerが古かった。gemリストの一部を更新したら、整合性が合わなくなった。  
(bundle updateの後、うまくbundle installできた。)
5.Heroku:pgにmigrateした時、うまくテーブルができていなかった。  
(db/migrateフォルダ内を更新しまくったため。  
 => \copy (テーブル名) from '(テーブル名).csv' CSV;  
 でエラーが頻発。)
6.開発環境をきちんと整える。  
(libフォルダがローカルと開発環境で分離させていないとうまく参照されない。仮想環境内で開発する。)

いじるのがNGのファイルをいじって墓穴を掘っているパターンが多いですね。(苦笑)

さらに、改良ポイントは

1.Tweetクラスをもっとコンパクトにする。(tweet.rb)
(例:sliceメソッドを使っているところとか、うまくまとめられそう。)  
2.ActiveRecordを勉強する。  
(カラム値の取得に苦労した。tweet.rb内でfind_by_sqlでごまかしているところなど。  
アソシエーションなどのアクションを追加で記入。)  
3.heroku run bundle exec rake db:migrate で、エラー。  
((日付)create_(テーブル名).dbと(日付)modify_(テーブル名).dbを正しく書き直す)  
4.README.mdの編集(repositoryからDLした後のアプリの作成の流れを確認)

などですかね。

ソースコードはこちら。 github.com

次は、Androidアプリ開発をします。

これからのプログラミング教育(3)

前回の続き。 私が、ちょっと勘違いをしていたようで。。

プログラミング教育の落とし穴 - WirelessWire News(ワイヤレスワイヤーニュース)

要するに、私が言いたいのは、 結局初めてのプログラミング経験は、ビジュアルプログラミング言語を使って概念的に学べばよいのだが、そこからどうしたら熟練のプログラマーを育てることができるのか?ということにかかっています。

おさらいがてら、まとめてみると、、

ビジュアルプログラミング言語→分かりやすい。見た目が可愛いらしい。初心者が学びやすい。

古典的言語→分かりにくい。構造上古いバージョンとの互換を考慮するため複雑怪奇になる、パッと見てわかるような仕様になっていない。

ここで、こんな考えがあります。

不便から生まれるデザイン: 工学に活かす常識を超えた発想 (DOJIN選書)

不便から生まれるデザイン: 工学に活かす常識を超えた発想 (DOJIN選書)


この本は、不便益論(あえて不便にさせることで、習熟の喜びを得られるという、逆転の発想)という考え方に基づいた事例集です。例えば、年季の入ったデザイン(長く愛される道具)が、独特の風合いをもつ一方で、コンビニエントな道具はすぐに使えなくなるだけ、というような。プログラミングにあえて適用すると、自分に最適の道具(プログラミング言語)を探し求め、長く使用することが挙げられます。

分かりやすい、ビジュアルプログラミング言語の教育は先ほどのブログに譲るとして、ここではどうすれば初心者が挫折せず複雑に見える言語を学ぶ意欲が湧くかを考えます。

こんな考え方に登場してもらいましょう。

実践 行動経済学

実践 行動経済学


この、行動経済学とはなんぞや、ということですが…

人は、今を過大評価してしまう生き物なのです。

人間は、経済的に不合理な判断を下したり、直感的に素早い思考をしたりする傾向があります。そのため、ナッジ(うまく先回りして、「人を『正しい行動』に導こう」とする試み)を有効に活用しましょう、ということが基本的な考えです。

 

そこで、分かりにくいプログラミング言語を学ぶような「ナッジ」を、修得者が考えるとすると…。つまり、C++,Javaなどのオブジェクト指向言語を修得へと向かわせるきっかけとなるもの。すなわち、メタ認知(個々人の学習の障壁を事前に察知し対処したり、学習の方略とスキルを変更したりすることで目標を達成することができるようにする教育。)の試みを考えてみます。

1.体感としてのプログラミング


知覚ー行動カップリング( 『不便から生まれるデザイン』192ページ)によるプログラミング。 ざっくり言うと、その場で作った動作のプログラムが、デバイスがちゃんと認識すれば、作った本人に即座にフィードバックされるという仕組みを作って体感してみる。 いきなりハードルが高すぎますね。(汗)

2.分かりにくいことは確実なのだから、あえて分かりにくさを出す


1つは、最初に完成品のソースを見せる。(いかに多くの手間暇がかかっているのかを知る→社会科見学(工場見学)に似ている)

まあ、教習所で見せられるリアル事故動画のようなものと思ってもらえれば(笑)


3.熟練の技を見せる


実は、数分でゲームは作れる(らしい)
当然、教える側に高い技術が必要。

4.現状維持


もうすでに、老若男女がプログラミングを修得することがステータスとなるような時代が来ています。

Fab ―パーソナルコンピュータからパーソナルファブリケーションへ (Make: Japan Books)

Fab ―パーソナルコンピュータからパーソナルファブリケーションへ (Make: Japan Books)


パーソナル・ファブリケーションの時代へ(個人がより容易に、高度な創作に取り組むことができるという発想。 もちろん、このなかにプログラミングで「もの」を動かすことも含まれる。)

とりあえず、こんな感じです。

これからのプログラミング教育(2)〜プログラミングにまったく触れたことのない人へ〜

さて、前回の続きです。

前回の最後で、私は「プログラミング教育を通して、教育の概念を変える。」と言いました。

きっと、4年前の私(プログラミングをまったく知らなかった)のように、

それは言い過ぎじゃない?たんに、(他の教科と同列に)必修化になるだけじゃん

と突っ込んだでしょう。
そんな方へ、読んでいただきたい本があります。



2ヶ月前に出た本なので、書店にまだ並んでいるかと思います。

ぜひ、手にとって読んでいただきたい。

ネタバレになるので、 
ここでは、共感点と疑問点を、簡潔に述べます。

賛成
プログラミングは全ての教科に通底する考え方がある。



はい。一番大切なことです。
理系(数学や物理、生物)での実践的な使用例はともかく、 文系(特に国語)教科とプログラミングがどう結びつくのか。 それは、大げさに言うと、

これまでの価値観が崩壊し、人々の生き方が多様になるにつれ、新たな価値を持ち出す ということです。

例えば、次のような流れがあります。
(1)これまでは当たり前のように人の手で行われていたことが、消えていく。 (他にも、きっかけは数多く考えられます)

(2)それに伴い、これまで当たり前と思われていた「常識」が、必ずしも正当なことではなくなる。

例えば、「知的」であるということは、今の使われ方で良いのでしょうか?
「知的」というのは、今でいえば「情報を多く蓄積している」とか、「情報を素早く処理できる」といったことに使われます。
でも、それば「データベース」や「CPU」の仕事と変わりないでしょう。

(3)プログラマ思考で、社会(一般常識)を「デザイン」する能力が問われていく。

詳しくは、著書にあたっていただきたいのですが、

理系としてのプログラミング思考だけでは社会の変化に必ずしも対応できない。
ということです。
一例として、著書では、会社を長く経営できている経営者には、プログラミング経験者が多いとして、
「会社経営やリーダーとしての素質をプログラミングで磨くことが可能である」ことが挙げられています。



疑問
プログラミングは、どんどん簡単にできる。
今後、ビジュアル言語が主流となる。



著者のこれまでの仕事に、文句をいうわけではありません。

ただ、教育で必要なことは、結局のところ

「ひらめき(アハ体験)を多く経験させる」

ことだと思います。

ビジュアルプログラミング(処理の流れをブロック単位でビジュアライズしたソースコードのいらない言語) と、呪文のようなプログラムで書かれた言語は、わかりやすさから言えば当然前者でしょう。

でも、

与えられたものだけでわかってしまうというのは、結局能力のごくわずかしか使っていないのです。
簡単にわかる水準のところで能力を出すことしかしていないのです。
わかるというのは本来そんな簡単なことではありません。

また、プログラミングは、あくまで完成作品の「プロセス」であるため、そこに多様性をもたせた方が良いと思うのです。

例えはおかしいかもしれませんが、
ソースコードで記述されたプログラムは、原材料から吟味されてできた料理。
ビジュアルプログラミングは、既製品を元に作られた料理。
というような?

次回につづく...

これからのプログラミング教育

プロコン

私は、2012年から独学でプログラミングのスキルを身につけてきました。
前々から気になっていた情報処理の資格を今年こそ取る!と、その年の元旦に一念発起したのです。

それまでは、プログラミングとは全く無縁の生活をしていました。
影響といえば、テレビドラマで描かれていたハッカーたちの、とても人間業とは思えない活躍を見て惹かれたことくらい。

ブラッディ・マンデイ DVD-BOX I

ブラッディ・マンデイ DVD-BOX I


とても、じぶんがたどり着けない次元の世界に見えていたのですから、カッコイイなくらいしか考えていませんでした。(そして、閉鎖的な世界)

その後、何度かの合格、不合格を経て、徐々にレベルの高い試験を勉強し、先人の偉大な背中を見ながら、自然と違和感を感じるようになってきました。

そして、IT系の資格でありながら、試験会場におもむき、与えられた問題を頭で考え、解答を記述する(選択する)ことが、この世界に求められていることなのか?

という疑問がふと頭をよぎったのでした。
パソコンを持ち込み、プログラムを自分で作って動かしてみるという経験こそがまず最初にやるべきことなのではないか。

そこでたくさんの失敗をして、なぜ間違っていたのかということが分かるまでトコトンじぶんの力で考える。

当然のことながら、かなりの忍耐が必要です。はじめは、バグを発見するまで、何時間もかかるのは日常茶飯事。
でも、ある時から、飛躍的にその時間が短縮されます。
今では、質問サイトがあり、じぶん一人の力ではなく、多くの知恵が結集される環境が整っていますが、
これまでの先人たちは、今よりはるかに、おのれの知恵のみで鍛え上げられたのです。

さて、そんなこんなで、じぶんがこれまでやってきたことをまとめてみました(反省の意味も多々あります)



1. Webを作成すること、ビッグデータを分析することだけがプログラマの役目ではない。


これからの時代。小・中学生もプログラミングが必修となります。 (2020年から) ニュースをざっと見た限りでは、小学生ではプログラミング言語を打ち込むのではなく、GUI的に処理する(Scratchとかなのかな?)ことで、その基礎を学ぶようですが。 www.sakana.tech 与えられたことを処理することが、次の時代に求められているとは思えません。 それは、パターン化された方法で処理すればよく、どんどん人の手を介在しないで自動化していきます。
もっと、広い意味でのアーキテクチャー(デザイン)思考が求められていると思います。

2.プログラミングは、向き不向きがある。


wakuwakustudyworld.co.jp とはいえ、わからない人にとっては苦痛でしかない呪文のような言葉を学ぶことが、重要である、そして基本であることは、今後ずっと変わりないと思われます。(コピペすればいいじゃんという方は、この世界には向いていないでしょう。)

そこで、言語とお友達になった人、ハマった人のためにオススメなのが、プログラミングコンテスト(通称プロコン)の問題を解いてみることです。

知らない人にとっては、とても敷居が高いと思われがちですが、なんのことはなく、プロコンに参加しなければいいのです。(私も参加したことがありません。)タダで、時間を気にせず良質な問題を解くことができるのですから。 そして、ある程度自信がついたら、自分の回答をさらしてみましょう。
初期の解答と今の解答を見比べると、自分のレベルが上がっていることがすぐわかります。

オススメは、
1.AtCoder

AtCoderとはなんぞや? →社長さんのブログ

chokudai.hatenablog.com

2.Aizu Online Judge

過去のプロコン大会の過去問が1000問以上あり、
登録すればじぶんの提出履歴がまとめて見られる。 また、解答数、レイティングなどが定期的に更新され、ほかの人との比較ができ、モチベーションが上がる。


自分がやった工夫は、
ただ漫然と説くのではなく、履歴を作ることです。 f:id:aweshin:20160607214153p:plain

解法をまとめることで、例えば、
再帰ダイナミックプログラミング(DP)は、見た目は違う解き方だが、結局同じことをやっている。(問題によって、あるいは言語によって使い分ける) ということが、自然とわかってきます。 わからなかったものは、ほかの人のacceptされた解法を元に、じぶんの書き方で必ず解答を提出してみましょう。



3. ものづくりを通して、自分の主張を多くの人に伝える。


1.twitterbotを作る。(このブログの埋め込みTweetは、自分がこれまでに見てきた、感銘を受けた言葉を集めたものです。
つぶやきを見てくれている、言葉の発言の当事者からRTやいいねを受けると、単純にうれしい)

2.実態を持たない主義、主張を、実態を持たせてみる。(IoTを、モノから得られる情報を元に分析すること(ハードからソフトへ)としてではなく、頭のなかで考えたデザインを実態化する(ソフトからハードへ)として用いること)
今であれば、Raspberry Pi や Arduino といった製品から簡単に作ることができる(環境が整ってきた)。


4.プログラミング教育にはそれ以外の教養が非常に大事。


プログラミングとは、何か新しいものを生み出すことですが
何か新しいものを生み出すためには、技術だけでなく、文化から哲学まで、幅広い知見を導入することが求められると思います。
プログラミング教育を通して、教育の概念を変える。そんな時代が、きっとこれから訪れるでしょう。

Raspberry Piの覚え書き

電子工作

Raspberry Pi(以下、Raspi)とは

2006〜2007年 小型PCボードがケンブリッジ大学で開発される。
2008年 財団設立
2011年〜 世界中で流行となる
2013年 開発者の来日とともに、日本で関連本が出回り始める

開発のきっかけ

  • 1990年代の8bitや16bitのマイコンがwin/macに取って代わられた。
  • それに伴うプログラミング離れ
    • 教育の現場では、Word/ExcelやWebデザインに偏った教育が現状で、ハードウェアを操る教育がなされていない。

Raspiのコンセプト

  • 可能な限り多様な言語でプログラミングができること

    • Pi=Pythonが利用される言語の中心になるが、他の言語でプログラミングされることも念頭に置いている。
  • 子供達にとって楽しいもの。ゲームやビデオを楽しむように使えるもの

  • 小さくで頑丈。子供達が学校にも持っていけるもの

  • 低価格で学校の教材となりうること。

    • 今日では、産業用の用途が増えているため、当初の目論見とはやや外れている。

Raspiに必要なもの

1.電源ケーブル
2.microSDカード(RaspberryPi2以降)
3.画面出力ケーブル
4.キーボードとマウス
5.Wi-fiドングル(かLANケーブル)

モノづくりの哲学

読書

1.Fab ―パーソナルコンピュータからパーソナルファブリケーションへ (Make: Japan Books)

Fab ―パーソナルコンピュータからパーソナルファブリケーションへ (Make: Japan Books)

Fab ―パーソナルコンピュータからパーソナルファブリケーションへ (Make: Japan Books)

パーソナル・ファブリケーション(個人的な欲求を起点として、身近な問題の解決から、結果としてものづくりを体得すること)の紹介や、その「ものづくり」の教育モデルの紹介。 「技術と職人が密接不可分に結びついていた時代[…]の工業の原点に立ち戻ることができる。」というようなことが言及されている。

今のテクノロジーは、手段が目的化されている。


「現在私たちが当たり前のように利用している大量生産のインフラストラクチャがなかった頃のものづくりは、プロフェッショナルの仕事というよりはサバイバル(生き延びるための)手段だった。」 「道具を自宅で製作できるようにする目的は、テクノロジーを創造する力をテクノロジーの利用者の手に取り戻すことにほかならない。」 (「ものづくりとは」の章)


また、LISP言語から、LOGO言語という子供向けの言語が開発されている。 人工知能モデルの開発を子供たちにやらせることを目指して開発されたらしい。 (「仕事の中の遊び」の章)


(本当は17台もの埋め込みコンピュータが、テーブルの裏面の何百個ものセンサーマイクロコントローラと接続されているのに)「コンピュータがないのはよいわ。」 (「美術と武器」の章) といった反応は、人と機械の関係を考えさせられる。そもそも何をやっているのかよくわからないのが機械なのである。


”(データアプリケーションというものは)ソーセージのようなものだ。 作られているところは、見ないほうがよい。”


2.人と「機械」をつなぐデザイン

生態心理学者の佐々木正人と著者の対談が終章に掲載されている。この中で、劣化のポジティブな価値というものが、今のエンジニアにとって有用かどうかという発想が面白い。

ドッグイヤーと称されるようなエンジニア業界で、それこそ35才引退説などと巷で揶揄されているような環境で、この発想は出てこないであろう。

芸能における人間国宝のような存在や、使い古して味の出る工業製品のようなものが重宝されるような世界が、はたしてできるのか。

人工知能は敵か味方か」というような発想を超え、AIはもはや当たり前のように介在し、遍在化してきていて、我々の意思決定や行動のきっかけを(良くも悪くも)与えてしまう存在となってきている。 今はまだ「便利」だとか、あるいはロボットの「かわいらしさ」だとか、「有用」なことが善であるような環境のものづくりの世界から、徐々に、いろいろな技術が蓄積されていき、学ぶは「まねぶ」という発想の徒弟制度のような世界が立ち現れてくるかは、未だ不明である。



3.ヒトと機械のあいだ―ヒト化する機械と機械化するヒト (シリーズ ヒトの科学 2)

「認知=脳」という考え方を超えた、身体そのものの特性(環境との接続)を活かす研究が紹介されている2007年の著作。

機械は、単独で存在する冷徹なイメージから、ヒトと共に進化を歩む道に徐々に近づいてきている。

一方で、急速な情報インフラの整備によって、身体の消滅(実際に行って、見聞きしていないような情報でも信じることがあたりまえとなるように)であったり、巨大なデータを解析できるようになって、身体に関わる全ての行為が、(生身の身体さえも)データとして扱われてしまうようになった。

その中で、システマティックな方法とは異なる、身体に根ざしたラディカルな方法論で情報社会を捉える研究が盛んになってきている。



4.触楽入門

触楽入門

触楽入門

もっとも根源的な感覚は、触覚である。 (赤ちゃんの知覚) 母体の中は暗闇なのだから、まあ当然のことです。 しかし、大人になると、触覚が退化(?)し、視覚聴覚優位となります。

私たちは、触覚という感覚を通して、忘れてしまった過去の歴史を発掘する作業をしなければいけません。 視覚は攻撃的な側面もある(何も考えずに見ているときでさえ、見られる側は何かのメッセージを受け取っていることもある)のだけれども、触覚は情報として伝えることが容易ではない感覚でのため、そのさわり心地を言語化してみることが大切です。

そうすることによって、多くの感覚を発見することができる訳です。

そのためのアイデアがいっぱい詰まっている本です。また、たくさんのイラストが、イメージを膨らます手助けとなってくれることでしょう。



5.情報を生み出す触覚の知性:情報社会をいきるための感覚のリテラシー (DOJIN選書)

触覚の特徴を確認してみる。

1.「モノを見る」と「モノに触れる」ということの違い。 視覚は一挙にわかるが、触覚はそうではない(目隠しをしてモノに触れて、それが何かを当てるゲームがあるように)

2.不要なものは無視して対象化しない働きがある。(足の裏の感覚)→意識せずに「分かっている」ことがある。

3.触れる、触れられるという図式は、身体と文字通り「密接」している。(触れられる感触が心地よく感じる効果がある) 他の感覚はどちらかといえば、支配、被支配の関係である。

4.皮膚感覚は、「分かる」手前で起きている。(とっさに避ける行為と同じように、不気味なモノに遭遇すると鳥肌が意識せずに立つ)

5.情報として拡散されない。(この本がはじめての「触知情報学」の試みであるように)

6.分析することが容易でない。この本のように、分析ということがそのまま、触覚の世界の内実を発見し、構成する試みとなっている。

例えば、「触譜」という試みがある。これは、映画鑑賞や音楽鑑賞のように、触覚を鑑賞する試みである。楽譜のように「触譜」を書く。この開発で、なんらかのイメージや感情を伝達することができる。

また、巻末の紹介本も有用である。 行動神経科学者ダマシオのソマティック・マーカー仮説や、西垣通の基礎情報学なども取り上げられている。



6. 第三の脳――皮膚から考える命、こころ、世界

第三の脳――皮膚から考える命、こころ、世界

第三の脳――皮膚から考える命、こころ、世界

常識を打ち破るためのエッセンスが多く詰まっている。

・生体の内部環境では、因果律、時間(過去が未来を決定する)の概念が通用しない可能性がある。(p.204)

・絶対(常識)などということは、生物の進化を見ても存在しない。マトゥラーナとヴァレラのオートポイエーシスの概念は、外部からシステムの組織構成への何らかの介入が生じた場合、それは単にシステム自体の損傷を意味するだけである。→非因果律(p.208)

・目で見た世界では説明がつかないことが、皮膚から考えると理解できる。(皮膚感覚は暗黙知)(p.217)

・生命と環境の物理的境界が、皮膚である。皮膚が、感じ、判断し、形を変えるシステムを持つ。内と外を区別することは、自律的である。(表皮の形成)(p.206)

手で動かして学ぶデータサイエンス本(データ取得、加工、解析)

データサイエンス

とっつきやすさ順に…

1.Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

web api関連の学習本。 Anemoneでクローリングするものが多い。



2.JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

機械学習とその学習のためのデータをどのように取得するかが学べる。



3.関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

scalaの学習にも使える本。 最終章のディープラーニングの実装は、やや本格的。



4.フリーソフトではじめる機械学習入門

フリーソフトではじめる機械学習入門

フリーソフトではじめる機械学習入門

機械学習関連のトピックスを網羅的に紹介している。



5.Think Stats 第2版 ―プログラマのための統計入門

Think Stats 第2版 ―プログラマのための統計入門

Think Stats 第2版 ―プログラマのための統計入門

Pythonを使い、実際に手を動かしながら統計が学べる。 Anaconda、pandasなどのライブラリを学べる。

6.Sparkによる実践データ解析 ―大規模データのための機械学習事例集

Sparkによる実践データ解析 ―大規模データのための機械学習事例集

Sparkによる実践データ解析 ―大規模データのための機械学習事例集

自分で何かを作ってみようとするときに、有用なアイデアがたくさん詰まっている本。 何か一つでも気にかかった章があれば、そこから自分の作りたい構想を膨らませていけば良い。