RubyPico開発日記1 - iOSからWebサーバーを起動する

RubyPicoが内部で使っているmrubyを1.2に上げたのでmatsumoto-r/mruby-simplehttpserverコンパイルできるようになった。以下のようなプログラムを書くとイントラネット内でwebサーバーを起動できるようになる。

# 
# Server Configration
# 

server = SimpleHttpServer.new({

  :server_ip => "0.0.0.0",
  :port  =>  8000,
  :document_root => "./",
})


#
# HTTP Initialize Configuration Per Request
#

# You can use request parameters at http or location configration
#   r.method
#   r.schema
#   r.host
#   r.port
#   r.path
#   r.query
#   r.headers
#   r.body

server.http do |r|
  server.set_response_headers({
    "Server" => "my-mruby-simplehttpserver",
    "Date" => server.http_date,
  })
end

# 
# Location Configration
# 

# /mruby location config
server.location "/mruby" do |r|
  if r.method == "POST"
    server.response_body = "Hello mruby World. Your post is '#{r.body}'\n"
  else
    server.response_body = "Hello mruby World at '#{r.path}'\n"
  end
  server.create_response
end

server.run

iOSデバイスのIPをアドレス確認して、

http://111.111.111.111:8000

をブラウザに打ち込むと他のマシンでアクセスできるようになる。(エミュレータの場合はlocalhost:8000で同一マシン上の他のブラウザからアクセス可能)

mattn/mruby-sinaticみたいなWebアプリをさくっと書くための薄いラッパーがほしい。(mruby-uvがiOSでビルドできるならむしろmruby-sinaticも組み込んでしまうのがいいのかもしれない)

ブログが続かないので環境を整える

RubyPicoの開発日記を定期的に書きたいと思いつつ、なかなか続かないので環境を整備した。

デザインを変更

見た目が変わればやる気が増える。

CONTENTS - テーマ ストアがなかなかよかったので変更。

CONTENTSテーマはレスポンシブデザインに対応しているのでスマホのデザインも一緒に変わるのがありがたい。

カテゴリの整理

「エッセイ」、「テックログ」などのカテゴリが細かすぎて振り分けが難しかったのですべて「diary」にまとめた。

  • 基本はdiaryカテゴリで書く
  • rubypico, milkode など主題がはっきりしているものは専用カテゴリで書く

これで書くときにいちいちカテゴリ分けに迷わないようになった。

専用アプリ

ブラウザで書くと重いので専用アプリで書けるときは書く。

スマホはてなの公式アプリがあるのでそれを使う。

MacだとMochaというのがあるようなので今度試してみる。Windowsだと何がいいのかなあ。

mocha

mocha

  • Reo Hokazono
  • ライフスタイル
  • ¥120

書いた記事のSNSへの投稿

書いた記事をTwitterはてブ、Bufferなどに出すのが面倒なのでこの辺りはコマンドラインなどでそのうち自動化したい。

後は日記くらいならTwitterに1回投稿して終わるくらいにしておこう・・。

これでも買ってみますかね。

はてなブログ Perfect GuideBook

はてなブログ Perfect GuideBook

Milkode 1.8.9 リリース - キーボードショートカットがより便利に

ひそかに1.8.8もリリースしていたのですがブログ書いてなかったのでまとめて。

リリースノート

変更点

特に"ショートカットキーの s が押されると、ページトップにスクロール"と"相対URLモードで起動していると、ショートカットキー S による新タブ検索が行えない問題を修正"のおかげでショートカットキー(milk webを起動して[ヘルプ]->[キーボードショートカット])が大分使いやすくなりました。ぜひお試しください。

インストール

行指向のソースコード検索エンジンと検索アプリです。 数万オーダーのファイルから、目的のキーワードを含む1行を瞬時に検索することが可能です。

$ gem install milkode

http://milkode.ongaeshi.me/

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 : 型は書きたくないでござる(内部に型があるのはよい)