[[12_Inou]]

* Touch UI Programing [#m182ee7f]


*「タッチUIのプログラミング環境が必要」 [#k12710bf]

** 仮説:「今後3年間でキーボード端末は駆逐される」 [#z29f5297]
- 根拠:Windows8、iPad等、タブレット端末は増える一方。
- 小仮説:タブレット端末のカジュアル性(いつでもどこでも)の利便性がキーボートによる入力の高速性を上回る。
-- 根拠:初代iPadを一年半使ったことによる経験。

** 仮説:「日常的にプログラミングに触れる必要性の増大」 [#l8957fcf]
- 根拠:安価なスマートフォン「FirefoxOS」の普及。(このOSはすべてがHTMLで作られている)
- 根拠:ユビキタス社会が実現するとプログラミングの必要性が増える
- 根拠:小中学校へのプログラミング教育の普及(プログラミングを知らないと生きていけない)
- 問題点:「プログラミング言語の学習コストよりも環境の構築の方が困難」
- 根拠:中学校のころLEGO Mindstormを触った経験。
-- 根拠:楽譜はプログラミング言語とほぼ同じ機能を持っている。(むしろ音楽はプログラムである)
--- 根拠:小学生でも楽譜読めるのにプログラミング言語が読めないはずがない。

** 仮設:「プログラム実行環境はWebへ移る」 [#xae20375]
- 根拠:HTML5の普及
- 根拠:マルチデバイス対応の解決策としてのブラウザで動くWebアプリ。

** 結論 [#b32f6a63]
- 仮説:「今後3年間でキーボード端末は駆逐される」
- 仮説:「プログラミングの必要性は増え続ける」
- 仮説:「日常的にプログラミングに触れる必要性の増大」
-- 故に「タッチUIのプログラミング環境が必要」である。


* タッチUIのプログラミング環境とは [#b657bb59]

** 要件 [#z4280276]
+ プログラミングにキーボードが不要、あるいはほとんど使わない。
-- バーチャルキーボードによるコーディングは難しい。
--- 特殊文字が打てない。
-- カーソルの移動が困難。
--- コピペですら困難。

** つまり [#m2c1b02b]
+ プログラミングのコード入力はタッチUIが基本
-- キーボードは補助的なもの

** 問題点 [#p164c476]
- タッチUIにするにはIDEが必要
-- CUIの時代にはキーボードに特化したプログラミング環境、いわゆる「エディタ」が流行った。(Vim、Emacs等)
-- GUIの時代にはキーボードとマウスを併用したプログラミング環境、いわゆる「総合開発環境」が流行った。(Eclipse、VisualC++等)
-- TouchUIの時代にはタッチ操作に特化したプログラミング環境が必要とされる。
--- マウス主体となるグラフィカルプログラミング環境はマウスの不便さ故廃れた。(LEGO Mindstorm等)
--- が、今後タッチUIの普及で復活する見込みがある

** これまでの状況 [#y33ce311]
- Editor
-- Vim
-- Emacs
-- Notepad++
-- SublimeText2
- IDE
-- VisualBasic
-- Xcode
-- Eclipse
- [[ビジュアルプログラミング言語 - Wikipedia:http://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E]]
-- LEGO Mindstorm
--- ブロック方式。逐次処理向け。
-- PureData
--- 矢印方式。関数型向け。
- スマホ、タブレット
-- Textastic
--- 補助キーボード付きエディタ。超便利。けれどやはり無理がある。
-- CoffeeAtOnce
-- Processing
-- [[マイクロソフトの「TouchDevelop」:http://www.publickey1.jp/blog/12/touchdevelopwebui.html]]
- Webアプリ
-- jsdoit
-- [[jsFiddle:http://jsfiddle.net/]]
-- [[Code9leap:http://code.9leap.net/]]
--- 上記3つはどれもHTML+CSS+JSをWeb上で編集してプレビュー。
-- [[前田ブロック:https://sites.google.com/site/purogi2012/jie-shuo/qian-tianburokku]]
--- GUI。専用言語
-- [[マイクロソフトの「TouchDevelop」:http://www.publickey1.jp/blog/12/touchdevelopwebui.html]]
--- GUI。専用言語。正直先を越された。
* othres [#f28a67ba]
-- [[スクイークEtoys:http://etoys.jp/squeak/squeak.html]]
-- [[前田ブロック:https://sites.google.com/site/purogi2012/jie-shuo/qian-tianburokku]]
-- [[blocky:https://code.google.com/p/blockly/]]
-- [[Scratch:http://scratch.mit.edu/]]
-- [[ビスケット:http://www.viscuit.com/]]
-- [[プログラミン:http://www.mext.go.jp/programin/]]
-- [[タッチでHTML5アプリが作れるTouchDevelop超入門:http://www.atmarkit.co.jp/ait/articles/1302/28/news036.html]]
-- [[jsmaker:http://jsmaker.com/jsmaker/]]
-- [[snap!Build Your Own Blocks:http://byob.berkeley.edu/]]
-- [[kodu game lab:http://fuse.microsoft.com/projects/kodu]]
-- [[MIT App Inventor:http://appinventor.mit.edu/explore/]]
-- [[Minibloq:http://blog.minibloq.org/]]
-- [[stencyl:http://www.stencyl.com/]]
-- [[starlogo:http://education.mit.edu/starlogo/]]
-- http://jp.franz.com/base/seminar/2010-11-19/seminar10-dfvpl.pdf
-- http://togetter.com/li/394716
-- [[GTEdit:http://www-ui.is.s.u-tokyo.ac.jp/~hara2001/research/gtedit/gtedit.html]]
-- [[Lisping:http://slidetocode.com/]]
--- まったく同じもの。詰み。→違った
-- [[VPL ビジュアルプログラミング言語:http://matome.naver.jp/odai/2133681463955711401]]
-- [[関数型言語の図解:http://qiita.com/items/008c8a3859d432c39823]]
-- [[データフロー型のプログラミング言語を作ってみる:http://www.sunny-grove.net/articles/dataflow/]]
-- [[関数型とデータフロー:http://modegramming.blogspot.jp/2012/03/1_12.html]]
-- [[L-System:http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%83%87%E3%83%B3%E3%83%9E%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0]]
-- [[項書き換え:http://ja.wikipedia.org/wiki/%E9%A0%85%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88]]
-- [[「tree programming」画像検索:https://www.google.co.jp/search?q=tree+programming&safe=off&tbm=isch]]
-- [[「data flow」画像検索:https://www.google.co.jp/search?safe=off&q=data+flow&tbm=isch]]



* ぼくの提案 [#ra0f482c]

** ぼくが求めているもの [#v4908d23]
+ あらゆるデバイスで開発、あらゆるデバイスで実行。
-- Web上で開発、Web上で実行。
+ HTML+CSS+JSというWebアプリで完結した開発環境。
-- 環境の導入はブラウザでサイトにアクセスするだけ。
+ タッチパネルでも、キーボードでも、ゲームパッドでも快適なプログラミング環境。
-- あらゆるデバイスに対して最適
+ ゆるふわな専用言語(Processing等)ではなく、ローレベルAPIにアクセス可能な言語。
-- JavaScriptと等価な言語。
+ タッチUIに対応しつつも、キーボードでも編集可能な言語

** 上記条件をすべて満たしている「Lisp」 [#mde7a6a8]
[[LISP - Wikipedia:http://ja.wikipedia.org/wiki/LISP]]
- 最古参にして現代の言語に負けない(というかもう絶対に負ける見込みのない)最強言語。
- Lispに特徴的な(((括弧)))を多用したコードが、タッチUIに向いている。
-- 括弧を単位としているので、それをブロックと見なせる。
--- 括弧ごとドラッグ&ドロップ=コピペ可能。
- JavaScriptはLispを元に作られた。
-- Lispのほぼすべての機能をJavaScriptは持っている。
--- JavaScriptとLispの相互変換は容易。

** 先行研究 [#x8f3b78e]
- ClojureJS
-- Lisp -> JavaScriptの唯一の実装。
-- でもJVMで動く言語を無理やりJSに当てはめているだけなので無理がある
--- 新言語開発の必要性

* プログラミング言語「Pebble(仮)」 [#n1aa8319]

- [[できました:https://github.com/legokichi/pebble]]
** デモ [#f82ffd18]
 (= fizzbuzz (fn (n)
   ([1..n] 'map (fn (i)
     (if
       (=== (% i 15) 0) "fizzbuzz"
       (=== (% i 5) 0) "buzz"
       (=== (% i 3) 0) "fizz"
       i)))))
 (console 'log (fuzzbuzz 10))
これが
 var fizzbuzz = function(n){
   return (function(a, b){
     var __ary = [], __i;
     for(__i=a; __i<=b; __i++){
       __ary.push(i);
     }
     return __ary;
   }(1, n)).map(function(i){
     return (function(){
       if(i%15===0){
         return "fizzbuzz";
       }else if(i%5===0){
         return "buzz";
       }else if(i%3===0){
         return "fizz";
       }else{
         return i;
       }
     }());
   });
 };
 console.log(fizzbuzz(10));
こうなる。おわかりいただけただろうか。

** Lispを使うことの利点 [#w2925054]
- Lispはその括弧の多さで嫌われるが、括弧があることによって「コードを手で操作」しやすい。
- Lispによる簡潔な記述でコード量が削減できる
-- JavaScriptもLispを元に作られているので柔軟でなんでもできるが、無理に見た目を手続き型のC言語にしてしまったためコード量が増えがち。
- Lispの最大の利点「マクロ」が利用できる。
-- マクロ使えるJSとか世間に非常に必要とされているのでこれ発表するだけでも反響はすごいはず。

** Lispを使うことの欠点。 [#a78f7c8c]
- Lispの学習コスト。
-- 解決策:実体はJavaScriptなのでJavaScriptの知識をそのまま使える。
- Lispの(関数名 引数)という独特の記述は慣れるまでは見にくい。
-- 解決策:慣れれば生JavaScriptを読むよりもはるかに読みやすい
- Lispの「マクロ」には専門の知識が必要
-- 解決策:excelの「マクロ」と一緒。使える人が使えばよい。


* 開発工程 [#deb012ee]
- 12月
-- Pebbleの仕様決定:済
-- parserの開発:開発中
-- compilerの開発:開発中
-- TouchUIの仕様決定
-- REPLの開発
- 1月
-- 試作の発表
-- debuggerの開発


* 今後の野望 [#j2e98309]

- ソーシャルコーディングシステム
-- 関数を登録しシェアできるシステム。
-- 「引数の型と返り値の型が一致する関数」あるいは「単体テスト形式でテストをパスする関数」を検索できるシステム。
++ Aさんは「これを入力したら、これを出力する関数」がほしくなった。
++ 「これ作って!」とWebサービスにポスト。
++ そのまま開発を続ける。
++ すると、このアプリ使っている他の人にパズル形式で出題される。
++ パズル好きで暇をもてあましているBさんがサクっと実装。
++ Aさんのコードにはいつの間にかそのコードが実装されている。
--- Idle状態の生体CPUに手伝ってもらえる!!!すげぇ!

- P2P通信
-- 正確には「サーバーサイドプログラミングを必要としない」システム。
-- 時代に逆行しているように見えるが、サーバー管理コストが浮く。
--- ぼくみたいな弱小シュミグラマには必要。

- 多画面多デバイス同時開発
-- エディタ画面はこのノートPC、
-- 実行画面はこのスマホ、
-- マニュアル等のブラウジングはこのデスクトップPC
-- デバッグ画面もこのデスクトップPC
--- たくさんのデバイスの画面を最大限に活用する仕組み。

- 並列プログラミングの推奨
-- 時代はメニーコア。
-- データフロープログラミングはVPLに向いていて、
-- さらに関数型に近いので並行性も高い。

- クラウドコンピューティング
-- モバイル端末で重い処理が必要になったとき、通信速度が十分であれば
-- クラウド上の超高速マシン、あるいは充電中の他端末に計算を代理する仕組み。

- 手続き型、オブジェクト指向、関数型、データフロー、
-- それぞれの得意分野で得意分野の言語を使う。


* 感想、要望等 [#wff09d55]
- なんかあればここに -- [[12_Inou]] &new{2012-12-27 (木) 01:56:57};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS