RubyPico近況 - main不要で書けるようにしたい

よりRubyらしく書けるように色々と手を加えています。

  • (済) main不要に
    • 人に見せると一番突っ込まれるのがここ
    • やっぱり分かりにくい
    • 直接トップレベルを実行できるようにする
  • (済) mrubyをサブスレッドで実行する
    • 今までYieldを使っていたような処理を全てやめる
    • 代わりにUIとのやりとりはメインスレッド(UI制御)に dispatch_sync or dispatch_async して行うことにする
  • (済) 無限ループの場合もUIは止まらないように
    • サブスレッドで動かすことで実現できた
    • これでmruby-simplehttpserverのようにずっと待ち受けるようなライブラリも動くようになる
  • 画像の表示
    • pやputsでテキストと一緒に表示するようにしたい
    • これで関数の戻り値で返す必要がなくなる
  • チャットビューコントローラのようなUIの作り方
    • ナビゲーションコントローラにmrubyのオブジェクトを渡すことで実現したい(Rackがcallに反応するものならなんでもいいような感じにしたい)
    • mrubyはスクリプト実行中は常に1つだけ動く
    • ビューコントローラは対応するmrubyオブジェクトを自身の寿命中ずっと保持しておく(GCで回収されないように)
    • このへんはまだ構想止まり

進捗

こんな感じに書けるようになります。def main不要だとやっぱりすっきりしますね。

p "hi"
p 1 + 2 + 3 + 4

(1..3).each do
  p Time.now
end

# loop do
#   p Time.now
# end

# 1 + nil

p 1 + 2 + 3

(1..10).each do |e|
  p e
end

nil + "A"

実行結果です。

エラー表示も実行結果と一緒に表示されるようになってよりわかりやすくなりました。無限ループしてもメッセージがつらつらと表示されるだけでBackボタンを押せばいつでもmrubyの実行を停止することができます。

f:id:tuto0621:20160704230108p:plain

リリースにはもう少し時間がかかりそうですが大分使いやすくなると思いますのでご期待ください。

最新はfeature/remove-mainブランチで開発しているのでビルドすれば手元で動かすことも可能です。

作っているものがもやもやしたら、やりたいことと役に立つことの2軸で分析してみる

東京Ruby会議11の感想

いい機会なので自分が作っているものの中から、自分が本当にやりたいこと、たくさんの人もしくは特定の誰かにとって役に立つ(自分でもよい)ことはあるのか、振り返ってみようと思います。

みたいなことを書いたので気持ちが冷めないうちにやってみようと思う。

RubyPico

RubyPicoを App Store で

役に立つこと

分かりやすいのでこっちからはじめてみる。色々な人に話して割とそれはいいよね、と言ってもらえるのは

  • PCを使わずにRubyを学ぶことがができる

だ。お古のスマートフォンで簡単にRubyを学ぶことができたら素晴らしいだろう。そのためには

  • チュートリアル的なドキュメント
  • irbなどを簡単に使えるようにするためのToolタブ
  • 関数の使い方を調べるためのヘルプ

などが足りない。逆にいうと上のような補助システムが整備されれば20分ではじめるRubyなどで書かれている内容を実践するための機能はすでに一通り入っている。なるほど、分析してみると必要な作業がちょっと見えてきた気がする。

さっそくホームページを他言語対応してマニュアルを追記できるようにしてみた。まずは日本語でマニュアルを書けるか挑戦してみよう。

やりたいこと

次に自分のやりたいことベースで考えてみる。

せっかくmrubyを覚えたので、スマホRubyを書いたり動かせるようにしてみたい、というのが一番の動機だった。ということはすでに目的は達成してしまっている!(やってみるものだ) 最初の技術的好奇心はすでに満たしてしまっていて、これでたくさんの人が興味を持ってくれたらいいなぁと期待していたけどそれにはもう一工夫必要そうだ。そして自分のモチベーションを維持するためにも新しい目標が必要なのだ。

役に立つことベースで分析したやつでもそれなりに好奇心は刺激されそうだけど、やりたいことベースの好奇心もせっかくなのでもう少し考えてみる。

ずっとぼんやり考えている課題として「スマホでプログラムを書きたいシチュエーションってなんだろう」というのがある。私のようにPCでもプログラムを書くような人がスマホで書きたくなるタイミングとは何か、もうちょっと詰めるとスマホで書かざるをえない状況や特性とは何か、という感じか。すぐに答えが出なそうなのでここは引き続き考えていこうと思う。(例えば満員電車の中でPCを開く人はごく少数だけどスマホを開いている人はたくさんいる、とかに何かヒントがあるだろうか)

まとめ

  • (役に立ちそう) PCを使わずにRubyを学ぶことがができる
  • (やりたいこと) スマホRubyを書けるようにしたい(達成)
  • (やりたいこと2) スマホでプログラムを書かざるをえないユースケースとは何か?

この2軸で分析するのはなかなかよさそうなので壁にぶつかったときはまたやってみよう。何か感想やご意見がありましたら是非。

東京Ruby会議11でプログラミングの難しさと楽しさを再発見した

1日がっつりとテックトークが続いてかなりの疲労感。でもそれ以上の充実感でよかった。

相変わらず須藤さんにはお世話になりっぱなしでOSS Gateのブースの端っこにRubyPicoを置かせてもらったりした。その場でダウンロードしてくれる人もいて嬉しかった(キーボードからRun対応もしなければ)。ずっとお話してみたかったwatsonさんとも話すことができた。他の言語のインタプリタ積んだアプリってiOSでリリース出来るの?みたいな話をした(ネットワーク上のスクリプトを直接実行しなければよいと言う認識)。裸じゃない生mattnさんを遠目に見ることができてよかった。(お話できなかったのが残念。)

発表者の人達はみな自分がやりたいことを自分のスタイルで楽しくやっているから生き生きとしているなー、と感じた。聞いている方もそれが伝わって楽しくなってくる。そして結果として大勢の人に役立つものが作れているのはすごいと思う。卵と鶏の議論になってしまうけどどちらを先に考えているのだろう?

終わってみて本当にすごいなーという気持ちと一緒に、同世代や、少し上、下の人達が(こんな大きな会が開催されていることも含めて)すごいことやっててくやしいな、という気持ちも少しあったことに気がついた。もちろん努力の量が全然違うからなのだけど、もっと自分が超楽しいことなのか、それともRubyコミュニティの人達に役立ちたいのか割合はよく分からないけど、色々負けないように頑張ろうと思えた。いやー来てよかった。

昔「ペナントレース 山田太一の奇跡」って漫画がジャンプでやってて、主人公は野球の才能全然ない(そして兄弟は天才という設定)のだけどすごく努力をしてプロ野球選手になるという話。その中のセリフに「プロってのは上手い下手だけじゃなくてどれだけ自分が野球を好きかってのも1つの才能なんだ。だとすると太一(主役ね)はプロ中のプロなんじゃないか」みたいな感じのセリフ(うろ覚え)があるんだけど、子供ながらに「流石にこれは漫画だよなー」って思ってたのね。でも改めて大人になってみるとすごい人ってのはみんなそれがどれ位好きなのかで勝負しているようなところがあってやっぱり世の中は面白いです。ちょっと話が散らかったけどまあそんな感じです。

エモい話禁止のカンファレンスで恐ろしくエモい感想になってしまったのは電車の中で飲んだビールのせいでしょう。いい機会なので自分が作っているものの中から、自分が本当にやりたいこと、たくさんの人もしくは特定の誰かにとって役に立つ(自分でもよい)ことはあるのか、振り返ってみようと思います。

最後になりますが

技術的好奇心を改めて呼び起こし、
プログラミングの難しさ、
そして楽しさを再発見する場を目指します。

は、とてもよいスローガンでいいなぁと思いました(再発見できた気がします)。来年も楽しみにしています。

東京Ruby会議11の感想(途中)

Tokyo RubyKaigi 11 #tkrk11

HowTo禁止、楽しくハックする発表中心のカンファレンスというコンセプト最高です。質問時間も長めで大量の質問がなされていました。

スケジュール

スケジュール - Tokyo RubyKaigi 11 #tkrk11

Streem

スピーカー: まつもとさん

インタビュー matz/streem: prototype of stream based programming language

言語作成には言語デザインに関する話題と言語実装に関する話題があるが、言語デザインに関する話題が少ない気がする。(まつもとさんは言語デザインの方が好き)

  • デザイン
    • 汎用言語を目指さない
    • 可能であればRubyと変える(Mustな部分とNot Mustな部分がある)
    • 20年の経験の反映
    • 関数型(的)プログラミング
    • イミュータブルデー
    • コンカレンシー
    • ストリーミングプログラミング(ループがない, if文はある)

実例

stdin | stdout
["Hello World"] | stdout
# Simple echo server
tcp_server(8007) | each { |sock| sock | sock }

Streemを使って欲しい、というのもあるけどプログラミング言語を一からデザインすることの楽しさを伝えたかった。

プログラミング言語をデザインするのは楽しいよ。

mruby/c

九州工業大学 田中 和明さん

mrubyc/mrubyc インタビュー

mrubyよりももっと小さな環境で動かしたい。 OS不要、ドライバなしで動きます。

mrubyバイナリ。CPUに依存しない互換性あり。最初のRITEの4文字を見て、エンディアンやアライメントを理解しているらしい。

  • GC
    • No GC
    • プログラムが終了するたびにメモリ初期化する。
  • Concurrency
    • 複数のプログラムをVMが1命令ずつ交互に動かす
  • Boot
    • 通常のRuby
      • VMの起動
      • クラスの作成
      • 全てのメソッドをクラスに登録
    • mruby/c はこれらのメソッド登録を実行まで遅らせている

Rubyに型があると便利か

spice life 栗原 勇樹 さん

インタビュー

型システム入門 - プログラム言語と型の理論 という本がよい。(でも難しい。)

type_struct

ksss/type_structを作った。Keyword Arguemts が使える struct。

Point = TypeStruct.new{
  x: Integer,
  y: Integer,
}

これ単体だと以外と使えなかった。

TypeStructでJSONの型チェック

Ruby版の機能をTypeStructに機能追加しては。JSONのValidateをTypeStructでかける。安心感がある。

ArrayやHashはArrayOfみたいな便利クラスを作った。

class ArrayOf
  def initialize(type)
    @type = type
  end

  def ===
    self.all? { |e| e === @type }
  end
end

refinementsを使ったUnionの実装格好やInterfaceの実装もすごい。

Ruby3の型システム

Ruby3の型について

  • 静的チェック -> methodが呼べるかの事前check
  • No Annotation
  • Cでは頑張ってAnnotation書く

今後、静的解析に挑戦してみたい。型システム入門よりも簡単な本があったら教えてほしい。

matz : 型は書きたくないでござる(内部に型があるのはよい)

RubyPicoのスクリプト開発にBluetoothキーボードを使うと捗る

RubyPicoで色々書けるようになってきて、大きめのスクリプトを全てソフトウェアキーボードを使って開発するのが辛くなってきた。iOSのソフトウェアキーボードはそれなりによくできていて当初思っていたよりもRuby書ける。後はコピペさえ何とかなれば・・。

そこでiOS用の物理キーボードを購入してiPod touch + 物理キーボードの組み合わせでプログラムを書く環境を構築する。

本当に大きなスクリプトはPCで書いてクリップボード共有やiTunes file sharingを使ってコピーした方がEmacsで書けるので便利だけど、これはその中間を狙う。居間でビデオ見ながら書けるのもよい。

購入したキーボード

iPadスタンド内蔵、薄型軽量だけどキーの配列やサイズはちょうどいいBluetoothキーボード ELECOM TK-FBP073IBKを買った - 今日覚えたことが大変参考になった。色々迷ったけど汎用性の高さでキーボード単体のタイプ(TK-FBP083BK)を購入。

上の記事でも書かれているけどJIS配列でiOSでもちゃんと使えるBluetoothキーボードはかなりレア(というかほぼELECOM一択)なのでやっと見つけることができた。(ASCII配列の人は選択肢が多くてうらやましい。

購入したスタンド

DAISOで100円だった。

f:id:tuto0621:20160511230118j:plain

構築完了

f:id:tuto0621:20160511225632j:plain

感想

キーボードが使えるだけでこんなに快適になるとは。最近はブログもiPod touch + 物理キーボードでおおまか文章は書いてリンク、整形、画像挿入などの編集作業だけPCでやるようになってきた。

小さな端末でも楽しくプログラミングできる RubyPico(旧PictRuby) 0.6 がリリース

PictRubyはRubyPicoという名前に変わりました!対象を画像に限らず「PC以外のスマートフォンタブレットなど小さな端末で動くRuby」という印象にしたかったためです。

アンケートではSmartRubyが有力でしたがその後にいただいたPicoRubyという名前も評判がよく、最終的にひっくり返してRubyPicoにしました。

0.6では待望の正規表現がサポートされました。

RubyPico

RubyPico

  • ongaeshi
  • 仕事効率化
  • 無料

正規表現

正規表現が書けるようになりました。/.../リテラル以外にもString#matchString#gsubのようなRegexpを渡せるメソッドも使えるようになります。

def main
  url = Popup.input "url?"
  title = Browser.get url
  m = title.match /<title>(.*?)<\/title>/
  puts m[1] if m
end

Chat#timer

Chatクラスにtimerというメソッドを定義すると(ユーザーの入力を待たずに)一定間隔でbotがメッセージをしゃべることができます。

以下は3秒おきに"Hi"を出力するボットプログラムです。

nilを返したときは何も出力しません。

class Chat
  def initialize
    @prev = Time.now    
  end
  
  def timer
    t = Time.now
    if t - @prev > 3
      @prev = t
      return "Hi"
    else
      nil
    end
  end
end

はてなブックマークボットに記事の自動読み上げ機能を追加

はてなブックマークのTOP5をスマホがしゃべりはじめるPictRuby botを書いた - ブログのおんがえしにtimerを使った「自動読み上げ機能」を追加してサンプルに収録しました。

RubyPicoを起動して [Sample] -> [hatena_bookmark_bot.rb] を実行してください。[総合]で記事一覧を表示したのち、[all]と入力すると・・

f:id:tuto0621:20160510222554g:plain

ご覧のように記事のdescriptionをしゃべりはじます。

iTunes経由でPCと端末間でスクリプトのコピーができるように

0.5からiTunes file sharingに対応していたのですがリリースのときに連絡を忘れていました。

過去の記事

仕事ですぐ役立つ Vim&Emacsエキスパート活用術 を買った

本屋に立ち寄ったら見かけたので購入。すっかり買うのを忘れていたけど、こういうことを思い出させてくれるのでリアル店舗は必要。

Emacs + evil-mode を使っている自分には夢のような本だと思った。

まだ読み始めたばかりだけどさっそく結城浩さんのコラムが役立った。最近秀丸エディタからVimに乗り換えてVimの挿入モードにEmacsキーバインドを組み込んだそうな。がっつり文字を打ち込むときは挿入モードでEmacsキーを使ってカーソル移動、文章を俯瞰して編集したいときはVimキーバインドでまとめて操作するらしい。

???あれ、それってまんまEmacs + evil-mode じゃないかと気がついた。今Vimに矯正中なので編集が終わったときは必ずEscを押してノーマルモードに戻っていたけどしばらく文字入力に集中したいときはそのままEmacsを使ってもいいんだなーと。(evil-modeではCtrl-zEmacs(<E>)とVim(<N>)の入力方式を簡単に切り替えできる)

そういえば昔Emacsでもview-modeのときだけvi風の操作系にするカスタマイズが流行ったりしてたなー。私自身もvim-regionというプラグインを作ったりしてた。

結城さんのコラムは他にも環境切り替えのときに頑張った様々な工夫の話が書いてあって面白かったです。evil-modeの新しい使い方を(何故かVimユーザーの方に)気づかせてもらいすでに買った甲斐がありました。おすすめです。