@m_seki の

I like ruby tooから引っ越し

とちぎRuby会議07書籍プレゼント紹介翔泳社編

とちぎRuby会議07に参加のみなさんへ、書籍プレゼントの紹介です。

とちぎRuby会議の「パーティー & Lightning Talks」では、スポンサー様からの書籍をLT発表順にプレゼントします。

LTは当日募集します。参加者の皆さんもスピーカーの皆さんも、LTを2, 3用意してきてね! # LTできずに余った書籍は親(@m_seki)の総取りです。

参加しないみなさんは金で買おう!

 

翔泳社

翔泳社様からは以下の書籍をご提供いただきました。

どの本も私が欲しい本なので、要らない本をgetした人は私にあげよう!

 

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

 

初版のオブジェクト指向入門 (ASCII SOFTWARE SCIENCE Programming Paradigm)をボロボロになるまで読んで酒匂さんのファンになりました。これは10年前(もう!?)に訳された第2版の原則・コンセプト編です。方法論・実践は自分で買おう!

 

数学パズルが70問、何度順に集められています。 CodeIQの連載を元に作られたそうです。問題のページをめくると、解説やコードがあらわれます。回答の多くはRubyで書かれてます。

 

C#逆引きレシピ

C#逆引きレシピ

 

artonさんにサインをもらうために逆引きレシピをgetしよう!(逆引きしてみた)。ちょまどさんが参加されるのでC#成分をアップしました。artonさんはtoRuby最初の大きなイベントで登壇してもらいました。今回も楽しみ。*1

 

ルビィのぼうけん こんにちは!  プログラミング

ルビィのぼうけん こんにちは! プログラミング

 
ルビィのぼうけん コンピューターの国のルビィ

ルビィのぼうけん コンピューターの国のルビィ

 

ふつうの人々に大人気のルビィのぼうけん、続編もあわせて提供いただきました。れんしゅうもんだいをちゃんとやろうとするとなかなか手強い。 訳は鳥井雪さん。前回のとちぎRuby会議、前回のRubyKaigiの懇親会など、笹田さんからたびたびご紹介いただいことを決して忘れません > 鳥井さん。

 

VDM++によるオブジェクト指向システムの高品質設計と検証 (IT architects’ archive)

VDM++によるオブジェクト指向システムの高品質設計と検証 (IT architects’ archive)

 

酒匂さんファンなのでもう一冊追加してもらいました。VDM++を用いた具体的なフォーマルメソッドの本です。訳者あとがきに「訳者は21世紀初頭からVDM++を使った2つの大きな実プロジェクト」...「モバイルFeliCaチップのOS開発プロジェクトです」!...「仕様の回帰テスト」!!!...とあってしびれます。

 

 

なっとく!アルゴリズム

なっとく!アルゴリズム

 

すてきなイラストが魅力的なアルゴリズムの紹介の本。イラストからうけるカジュアルな印象とちがって、ビッグオー記法から入るあたり古典的なガチな本じゃないだろうか(斜め読みなのでちょっと自信ない)

 

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

 

またまたアルゴリズムっぽい本。iOS, Androidのアプリ「アルゴリズム図鑑」をベースにされた本です。この本もイラストが特徴です。カラーをうまく利用してアルゴリズムを説明しています。ソートの各手法もそのアルゴリズムのコンセンプトをうまく図で表現しています。

 

Effective Ruby

Effective Ruby

 

 Rubyの本もありますよ!監修がartonさんということでチョイス。ネタを48個もよく思いつくなー。

 

アジャイル時代のオブジェクト脳のつくり方 Rubyで学ぶ究極の基礎講座

アジャイル時代のオブジェクト脳のつくり方 Rubyで学ぶ究極の基礎講座

 

オブちゃんのビジュアルが刺激的なオブジェクト脳の本。「大崎瑶」ってyouchanか?ということでご提供いただきました。Matzが監修でさらに推薦もMatzなのおもしろいなー。「本書に寄せて」の牛尾さんはちょまどさんとマイクロソフトエバンジェリストつながりだ!(ちょっと強引)

 

 

*1:この逆引きレシピを使って任意の言語の逆引きレシピつくれないかしら。

とちぎRuby会議07書籍プレゼント紹介オライリー編

とちぎRuby会議07に参加のみなさんへ、書籍プレゼントの紹介です。

とちぎRuby会議の「パーティー & Lightning Talks」では、スポンサー様からの書籍をLT発表順にプレゼントします。

LTは当日募集します。参加者の皆さんもスピーカーの皆さんも、LTを2, 3用意してきてね! # LTできずに余った書籍は親(@m_seki)の総取りです。

参加しないみなさんは金で買おう!

 

オライリー

オライリー様からは以下の書籍をご提供いただきました。

どの本も私が欲しい本なので、要らない本をgetした人は私にあげよう!

ギークマム ―21世紀のママと家族のための実験、工作、冒険アイデア (Make: Japan Books)

ギークマム ―21世紀のママと家族のための実験、工作、冒険アイデア (Make: Japan Books)

 

 「本書をすべてのギークなママに捧げます」ママはもちろんパパが読んでも大丈夫。Make: Japan Booksのシリーズ。

 

子どもが体験するべき50の危険なこと (Make: Japan Books)

子どもが体験するべき50の危険なこと (Make: Japan Books)

 

 米澤くんが買ってたのを借りて斜め読み。これは危険! こちらも Make: Japan Books。

 

パブリックスピーカーの告白 ―効果的な講演、プレゼンテーション、講義への心構えと話し方

パブリックスピーカーの告白 ―効果的な講演、プレゼンテーション、講義への心構えと話し方

 

プレゼンは練習だ。スピーカーの一人、酒匂さんの訳された耳の痛くなる本。あー、RubyKaigiの準備しなきゃ。getしてサインをねだろう!!

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

 デブサミの授賞式(ITエンジニアに読んでほしい!技術書・ビジネス書 大賞 2017)で知りました。欲しい。関係ないけど20世紀は複素数のBPやってたんだよ(自慢)

 

 最近SPAでアプリ書いてたので読みたくなった本です。「サーバーレスとは、サーバーを抽象化することで、...」そういう意味だったのかー。

 

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

 

 Goだいすき。アプリケーションの例をもっと知りたくてこの本をチョイス。プレゼントしたくない(自分がほしい)

 

SQLアンチパターン

SQLアンチパターン

 

 id:t-wada が参加するものとばっかり思ってリクエストした本。SQLアンチパターンの本としてだけでなく、アンチパターンの記述パターンとしても参考になるし、@t_wada にサインをねだることができるし、おすすめ。(自分はもってるのでみんな持って行って!)

 

続・インタフェースデザインの心理学 ─ウェブやアプリに新たな視点をもたらす+100の指針

続・インタフェースデザインの心理学 ─ウェブやアプリに新たな視点をもたらす+100の指針

 

水曜日のお昼休みに読書会している本(インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針)の続編。

 

Make: Analog Synthesizers (Make: PROJECTS)

Make: Analog Synthesizers (Make: PROJECTS)

 

 これね、欲しいんですよ!私が!株式会社コルグの方の監訳だよ!

 

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

 

 toRubyと関係の深い渋川くんの本。最近の渋川くんはgiven nameが「よしき」表記なんだなー。HTTPの歴史をGoで追いかけます。

 

プログラミングC# 第7版

プログラミングC# 第7版

 

ちょまどさんがいらっしゃるのでC#方面にもリーチ。私の能力はC#はなんとか読めるけどちっとも書けない程度。なのでオススメポイントがわからないけど、凶器になりそうな厚さです。

 

書籍のほか、Tシャツ(130cmのビビッドなシャツもあります!)などもご提供いただきました。お楽しみに!

高さん、たまには遊びに来てくださいね。

 

 

 

re: 反復開発(イテレーション2, 3)をやりました。

エンタープライズアジャイル勉強会の再演をyahooでやりました!前回とほとんど変わっていませんが、資料を公開します。

再演にも関わらず、たくさんの人が来てくれてうれしかったです。質問もたくさん。次回は九月かなあ。

 

 

speakerdeck.com

re: 反復開発(イテレーション2)

エンタープライズアジャイル勉強会でやった反復開発についての講演を再演します。かっこよく言うとイテレーション2!

 

connpass.com

 

 

なお、前回の資料はこちら。*1

druby.hatenablog.com

 

 

*1:そうそう。資料も再演も金で買えるよ!

selectっぽい字面

goのselectっぽいやつ、実装できそうな気もするけど字面がなあ。

a. 引数に操作オブジェクトを渡す

成功したチャネルの操作オブジェクトと値を返すやつ。
同じチャネルに複数の操作したときにwhenでマッチさせにくい。selectの実引数の操作オブジェクトを別途メモする必要があるため。
(チャネルは操作オブジェクトと===でtrueになるようにしてはある)

  Fiber.new do
    while true
      c, value = Bartender::select(quit.pop!,
                                   chan[0].pop!,
                                   chan[1].pop!,
                                   chan[2].pop!,
                                   chan[3].pop!,
                                   chan[4].pop!,
                                   ch2.push!(:x))
      case c
      when chan[0]
        p [0, value]
      when chan[1]
        p [1, value]
      when chan[2]
        p [2, value]
      when chan[3]
        p [3, value]
      when chan[4]
        p [4, value]
      when ch2
        p [:ch2, value]
      when quit
        p [:quit, value]
        break
      else
        p :else
      end
      Bartender.sleep(rand)
    end
  end.resume

b. selectコンテキスト

selectコンテキストオブジェクトに操作とチャネル、成功した時のブロックを渡す。
文字数多くてキモい。

  Fiber.new do
    catch(:quit) do
      while true
        Bartender::select2 do |select|
          select.read(quit) do |value|
            p [:quit, value]
            throw(:quit)
          end.read(chan[0]) do |value|
            p [0, value]
          end.read(chan[1]) do |value|
            p [1, value]
          end.read(chan[2]) do |value|
            p [2, value]
          end.read(chan[3]) do |value|
            p [3, value]
          end.read(chan[4]) do |value|
            p [0, value]
          end.write(ch2, :x) do
            p :ch2
          end.else do
            p :else
          end
        end
        Bartender.sleep(rand)
      end
    end
  end.resume

まだありそう

いずれにしても、操作もさせつつ待つ(遅れた方は却下する)のでインターフェイスが固定的になっちゃうのかなあ。

エンタープライズアジャイル勉強会の資料

エンタープライズアジャイル勉強会という勉強会に呼んでいただけたので資料公開しますね。広島の旅費が苦しいのでこういうのうれしい!

 

Gumroadからの課金勢のみなさんへ

 

お話したこと

 

反復開発は全工程やって1ターンだよっていうみんなが知ってる(けど、ある方面のScrumではやられていないことが多いらしい)ことを45分間ずっと説明しました。

 

その結果チームの境界(サブシステムとか工程別チームとか)がどうでもよくなると思う(実感してる)んだけど、Scurm Incの説明だと階層がたくさんある例を示していたし、永田さんはQA部門にこだわりがあるのがおもしろいなー。自分も含めて、みんな自分の状況が好きなんだな。いいことだ。

 

再演バイト待ってます。 (再演したいんじゃなくて、RubyKaigiの旅費かせぎたいので!)

 

speakerdeck.com

合わせて読みたい

 

 

EventMachine入門を読みながら書くBartender入門 

keijinsonyaban.blogspot.jp

EM入門の日本語訳を読んで、初めてEMのコードを見ました。読みながらBartenderを説明するといいんじゃないだろうか。

飽きたので途中で公開します。

なによりも先に

今年もよろしくお願いします。

Introduction

BartenderはFiberを使ったシングルスレッド向けIOの多重化のライブラリです。
ユーザーのコードで様々なプロトコルに対応するためにBartender自体はIOの待ち合わせだけを担当します。

ポート10000で受信したデータを読んで、送り返すサーバーの例。

Bartender::ServerはTCPのacceptのループの準備をするコンビニエンスクラスです。*1

require 'bartender/bartender'

Bartender::Server.new(10000) do |client|
  while true
    begin
      data = Bartender._read(client, 255)
      Bartender._write(client, data)
    rescue
      client.close rescue nil
      break
    end
  end
end

Bartender.run

acceptのたびに与えられたブロックを実行するFiberを作ります。
複数のターミナルからtelnetして実験しましょう。

$ telnet localhost 10000
Trying ::1...
Connected to localhost.
Escape character is '^]'.
31
231
31
231
32
3^]
telnet> quit
Connection closed.

以下は空行が入力されるまで待ってからechoするバージョンです。Bartender::Reader, Writerというコンビニエンスクラスを使います。
複数の端末がechoサーバーに接続している状態で、それぞれ空行を読むまで正しく動いてる部分を確かめてください。

require 'bartender/bartender'

Bartender::Server.new(10000) do |client|
  reader = Bartender::Reader.new(client)
  writer = Bartender::Writer.new(client)
  
  while true
    begin
      data = reader.read_until("\r\n\r\n")
      writer.write(data)
    rescue
      client.close rescue nil
      break
    end
  end
end

Bartender.run

EMとちがうのは、プロトコルの実装などはユーザーのコード側で書くことを想定してるところです。任意のプロトコルはBartenderの上に乗せてくださいね。

Getting Started

require 'bartender/bartender'

Bartender.run

なにもしないBartenderです。Bartenderを使うには'bartender/bartender'をrequireしてください。
Bartender.runはIO待ちのループを行う無限ループです。1度目の繰り返し以降で待つものがなくなったとき、終了します。*2

Timers

Bartenderにはalarmが用意されてます。指定した時刻にコールバックを呼びます。

require 'bartender/bartender'

Bartender.context.alarm(Time.now + 1,
                        Bartender.context.method(:stop))

Bartender.run

1秒後にBartender.context.stopを呼びます。stopが呼ばれると、次のターンにrunは終了します。

contextはスレッドごとに作られる、Baretender::Contextを返すメソッドです。Bartenderの待ち合わせのコアとなる部分はContextの中にあります。
.contextを毎度書くのはめんどくさいので、よく使うメソッドはBaretnderモジュールのmodule_functionとして定義されてます。stopはたいてい使わないだろうと思って、module_functionになっていません。

require 'bartender/bartender'

Fiber.new do
  n = 0
  while true
    puts n
    Bartender.sleep(1)
    n += 1
  end
end.resume

Fiber.new do
  while true
    Bartender.sleep(3)
    puts 'Fizz'
  end
end.resume

Fiber.new do
  while true
    Bartender.sleep(5)
    puts 'Buzz'
  end
end.resume

Fiber.new do
  Bartender.sleep(15)
  Bartender.context.stop
end.resume

Bartender.run

単にFiberをsleepさせるメソッドも用意されています。周期的なタイマーはありませんが、上のように何度もsleepすれば実現できると思います。
sleepはBartenderのmodule_functionにもあります。alarmはコールバックを登録するけど、sleepは単に休みます。でもalarmはmodule_functionに入っていません。
なにが言いたいかというと、sleep推奨ってことです。BartenderはFiberの習作ですから、できるだけアプリケーションのコードにはコールバックを書かせたくないのです。
一直線の単純なコードを書いても、なんとなく複数のFiberが譲り合って動くようなものが私のテーマです。

sleep(0)を使うと、やることがなければただちに、もし別のIOがあればそのあとに、sleepが解除されます。これを利用すると、ひまな間はがんがん計算するぞ!といった繰り返しが書けます。
XtでいうWorkProc、EMならnext_tickに相当します。

require 'bartender/bartender'

Fiber.new do
  Bartender.sleep(2)
  Bartender.context.stop
end.resume

$n = 0
Fiber.new do
  while true
    Bartender.sleep(0)
    $n += 1
  end
end.resume

Bartender.run

p $n

ThreadTask

Fiberでやりくりしていても、やっぱり遅い処理は存在するので、Threadに逃がしたいものが出てきます。おまけのコンビニエンスクラスにThreadTaskを用意しました。
ThreadTaskはブロックを与えて生成します。直ちにサブスレッドでブロックを実行します。タスクのvalueを呼ぶと、Thread#valueのように処理を待ってから値を返します。
ThreadTask#valueがブロックしそうなときは、別のFiberに実行権を譲ります。

そうそう。Bartender::ThreadTask.newのスペルが長いので、Bartender.task(&blk)で生成できるようにしました。

require 'bartender/bartender'

queue = Queue.new
Thread.new do
  5.times do |n|
    sleep 0.3
    queue.push([:que, n])
  end
end

Fiber.new do
  tt = Bartender.task {sleep 2; 'hello 2'}
  p tt.value
end.resume

Fiber.new do
  tt = Bartender.task {sleep 3; 'hello 3'}
  p tt.value
end.resume

Fiber.new do
  tt = Bartender.task {raise('hello 0')}
  (tt.value rescue $!).tap {|it| p it}
end.resume

Fiber.new do
  tt = Bartender.task {sleep 1; 'hello 1'}
  p tt.value
end.resume

Fiber.new do
  ary = 5.times.collect {
    Bartender.task {queue.pop}
  }
  ary.each { |x|
    p x.value
  }
end.resume

Bartender.run

Clients

飽きてきた!

require 'bartender/bartender'

Fiber.new do
  while true
    p :tick
    Bartender.sleep(0.05)
  end
end.resume

Fiber.new do
  c = Bartender.tcp_socket('www.druby.org', 80)
  writer = Bartender::Writer.new(c)
  reader = Bartender::Reader.new(c)

  writer.write("GET / HTTP/1.1\r\nHost: www.druby.org\r\n\r\n")
  while true
    puts reader.readln.size
  end
rescue
  c.close
  Bartender.context.stop
end.resume

Bartender.run

*1:WEBrickを読みながら書きました。

*2:この仕様は正しいのかなあ。一回目も終了するべきかも。