データ転送ミドルウェア勉強会参加メモ

キャンセル待ち25番目で絶対無理だろうと思っていたら当日の午前10時過ぎに繰り上げで参加できることになったので、

データ転送ミドルウェア勉強会 - dots.[ドッツ]

に急遽参加したのでメモ。 まさか参加できると思わなかったのでノートPCを持っておらず、nexus7でひたすらメモ取ったのでフリッカー入力のレベル向上につながった2時間であった。

『バルクデータロードツール「Embulk」リリース 〜 fluentdの柔軟性と堅牢性をバルクでも』

Embulk, an open-source plugin-based parallel bulk data loader

話者はトレジャーデータ創設者かつ多数のOSSに関する活動でも著名な古橋さん。

embulk/embulk · GitHub

コードはこちら。デザインについては、fluentdのバッチ版という感じ。 SIerをしていると壮大な構成のIFサーバ群&お手製データローダーというものを多数見てきていて問題意識をもっていたのでうまく成長するといいなぁと思った。

  • Input
  • Decode
  • クレンジング
  • エラーハンドリング(リトライ)
  • 転送処理の並列度
  • 転送処理に使うプロセッシング機構
  • Encode
  • Output

等のデータ転送にありがちなさまざまな要素をうまく抽象化して自由に組み合わせるようにしよう、という思想のようだ。

どのあたりの用途に最初に挿すといいのかなぁ。

個人的には Apache Kafka -> HDFS への書き込みを行う Camus という Hadoop distcpのKafka版みたいなツール(というかMRv1ジョブ)が使いにくかったので、そこがうまく動いたらすぐに飛びつきたいかも..。 (distcpを完全にembulkで代替実装してみるのも面白いかも。)

ただ、リストに乗ってるサイト全てからFTPでデータとって失敗したところだけResumeできるセットとかの方が嬉しい気もする。

エンタープライズレベルの送達管理とか言い出すとOutputとInput両方から仕掛り管理みたいなことをしないといけないとか色々と難しそう。

しかし、一昔前までメッセージングのシステムだと思っていたものが次々とプロセッシング機能をもったり、永続化機構を持ったりしてきてややこしいなぁ。

なお、embulkはembark((荷物等を)乗船させる)にbulkロードのbulkをかけた造語とのこと。

実装言語がJavaなのは個人的には嬉しい。あと、guess機能とかで自動的にスキーマ抽出したりDecodeしてくれたりと導入を容易にしてあるのとか、やり方うまいなと感じた。

『世界で利用されるファイル転送ツールHULFT

資料の公開はまだされていないみたい。話者はセゾン情報システムズの方(当初発表予定の方が病欠ということで代理でこられたそう。)

fluentdやembulkが柔軟な粘土のようなフレームワークとしたらHULFTは硬質的な一枚岩を目指したようなガチンコエンタープライズミドルウェアという印象。

20年間、さまざまな逡巡を繰り返しながら「ファイル転送」という部分のみを追い続けたという話にはある種の畏怖を感じざるを得なかった。

作ってる人たちはどのような破壊的イノベーションを持ってすれば、HULFTのような鉄壁の防御を崩せるかとか逆に考えたりしているのだろうか。

Fluentd 2015 - v1に向けて

Fluentd - road to v1 -

話者はトレジャーデータの中川さん。 FluentdのAPIを変更することの困難さであるとか、0.10以降に追加された新機能の話等。

(ちょっとこのあたりから気力が尽きていてフリッカー入力したメモの内容が薄い..。)

Fluentdのフィルター機能などがかなりこなれてきており、at-least-onceセマンティクスと組み合わせてうまく制御できるようになっている話など地味に重要な情報が多かった印象。 (matchをたくさん作らずにフィルター処理をパイプラインで実行させられるらしい。)

td-agentも最新版を使ってほしいとのことだった。なお、googleナノ秒間隔でのデータ転送を求めていてどうしようか悩んでいるのだとか。ナノ秒とか高級言語でどこまで追求できるのだろう。

『H2O - HTTPを、より便利に、より速く』

H2O - making HTTP better

話者はディー・エヌ・エーの奥一穂さん。

非常に多種多様な用途で使われているHTTPの2.0が普及した先の未来を分かりやすく感じることができる講演だった。

現時点でnginxより2倍近い性能を出していたり、SSL周りの機能がやたらいっぱいあったりと勢いを感じるプロダクトという印象。

個人的には設定がYAMLでかけるのが最高と感じた。 WAN側を流れるデータはIoT向けの軽量プロトコル以外はHTTPのみみたいな世界になるのだろうか。

懇親会

これでもかというくらいのビールとピザがトレジャーデータからのスポンサードで振舞われた!ビールも発泡酒とかじゃなくて恵比寿とか一番しぼりとか。すごい。会場もピッカピカだし、ソフトドリンクも無料だし。

関係者の方々どうもありがとうございました。

「はじめてのClojure」の読書メモ (その1)

こないだ参加したClojure夜会 vol.1 で入手した、

はじめてのClojure (I・O BOOKS)

はじめてのClojure (I・O BOOKS)

についての読書メモ。

本の中のコードはnyampass/BeginningClojureで公開されている。 また、本についての正誤表もここで配布されているので事前に手元に持ってきておいたほうが良い。

なお、開発はWin7(64bit)上のLightTable0.6.7を使った。

2章

  • clojureのコメントに3種類の記法があるが、式として完全でないとだめなタイプのコメントにはどのような使い道があるのだろうか。
 (comment (+ 1 2))
 #_(+ 1 2)

clojure-style-guideのここにちょっとだけ利用例があったがいまいちわからん。特定のフォームをコメントアウトする際に使うとのことだが特定のフォームって何?

4章

いきなり本では初見の関数/スペシャルフォームを含むソースコードが出てきたので備忘メモ。

(defn char-range [[first-char end-char]]
  (map char (range (int first-char) (int end-char))))

与えられたchar文字2文字の文字コード間を含むcharのリストを返す関数。

(def key-characters (apply concat (map char-range [[\0 \9] [\a \z] [\A \Z]])))

key-charactersは数字とアルファベットを全て含むcharのリスト。 (map char-range ..) が 3つのリスト(数字、小文字alpha、大文字alpha)を返し、それをconcatでリスト連結している。

(defn index->key [index]
  (loop [index index acc []]
    (if (zero? index)
      (-> acc reverse join)
    (recur (long (/ index (count key-characters)))
      (conj acc (nth key-characters
        (mod index (count key-characters))))))))

index(数字)からkey(文字列)を取得する関数。clojureではこの手の射影関数名に -> をつける慣習がある。

基本的に数字がでかくなると長い文字列を返す。たぶん、key-characters全てを数値とみなした59進数に変換しているような感じ。 urlを登録するたびに払い出す短縮URLを順番に増えていくcurrent-id(index)を59進数であらわした文字列で表現するというわけだ。

(この本では途中までは index = current-id という名前で話が進んでいたのだが急にindexに一本化された。)

  • char

    • charに変換する関数
  • apply

    • 1引数の関数をリストに対して適用する関数。
    user=> (apply + '(1 2 3 4 5)) ;リストの先頭に引数の関数を挿入するイメージ。
    15
    user=> (apply + 1 2  '(1 2 3 4 5)) ;関数の引数を渡すこともできる。
    18
  • loop

    • let句のようにbindingを指定してbodyを実行する。
    • ただし、最後の recur で自loopを再帰的に呼び出すようなイメージでループ処理を書ける。

      • recur に渡す引数は最初のloopのbindingと同じ個数になる。
    • loopは極力使わずにリストへのmapや->の方が関数型プログラム感があって個人的にお洒落には感じる。複雑な条件でリストから実行対象を取捨選択したい場合は使わざるを得ないのだと思うが。

  • conj

    • 第1引数のコレクションに第2引数以降の引数を要素として追加する。
    user=> (conj [1 2] 3)
    [1 2 3]
    user=> (conj [1 2] [3 4])
    [1 2 [3 4]]
    user=> (conj '(1 2 3) 1)
    (1 1 2 3)
    user=> (conj '(1 2 3) 4)
    (4 1 2 3)
    user=> (conj '(1 2 3) 4 5)
    (5 4 1 2 3)
  • ->

    • 第一引数をリスト化して後続の関数の第一引数として順番に渡していく。
    • 入れ子構造をストリームにかけるので鬼便利。
    user=> (-> [1 2 3] (conj 4) (conj 5))
    [1 2 3 4 5]
    
    ;もし -> を使わないと以下のようになって括弧の一番内側から
    ;読み解かないといけない。
    user=>(conj
            (conj [1 2 3] 4)
           5)

なお、instarepl中で (doc 関数名) とやると説明がでる。 (ただし、LightTableは若干コンソール出力が小さいので読みにくいかったのでローカル環境で実行した lein repl で見たほうが良いかも。)

Clojure 夜会 第一回の参加メモ

第一回Clojure 夜会(Evening Party)に参加したのでそのメモ。

私のClojureに関するスペックは以下。

  • Clojure関連のイベントに参加したのは初めて。
  • Clojureには興味はあるけどアプリ開発とかをしたことがあるわけではない。
  • 仕事で使ったことのあるStormというフレームワークのコアがClojureで書かれていたので興味を持った。
  • よく使っている構成管理ツールのPuppetの開発母体であるPuppet LabsがClojureを開発言語にしているので興味を持った。
  • Clojure in Actionを一通り読んだ。

    • なお、この本は0からClojureを学ぶにはなかなか良い本だったように思う。英語はちょっとつらかったけど。
    • 第一版がPDFダウンロードできるっぽい。
  • インフラ中心の仕事が多かったのでアプリ開発自体にあまり詳しくない。JSとかもあまり書いたこと無い。

以下、発表のメモです。

Clojure入門

[発表資料]は公開されていないみたい。

  • 話者は(株)にゃんぱすの登尾さん。Tokyo.cljを主催されている方。
  • baasdayというサービスをやっている。

    • AWSを利用
    • 会員数10万強のサービスでも使われている?

よく聞くClojureの誤解

誤解その1: Lispでしょ。括弧多すぎ。

  • () リスト, [] ベクタ, {} マップ, #{} セット で見れるから普通のLispより見やすい。
  • 括弧多いのは慣れる。

結局、Clojureのコードをエンジニアに見せたら括弧多いと言われたらしく括弧はやや多めなのはまあ仕方ないぽい。

誤解その2: フルスタックなやつなさそう

  • Luminus

    • ウェブアプリケーションフレームワーク
    • (後の発表でもこれを使って数時間程度でシステム作った的な話があった。)

Twitter上では、「シンプルなパーツを組み合わせて簡単にフレームワーク的なコードが書けるから逆に無い」みたいな話も出ていた。

誤解その3: 日本語情報少なすぎ

  • 6冊もある。十分じゃないですか。
  • 英語情報は豊富。

Clojureをはじめるにはどうしたらいいか

  • Leiningen
  • Light Table
  • Emacsならcider

ほか、東京近郊で何かをしようとされているとのこと。

2日ガチ開発合宿で作ったWebアプリケーション2選

発表資料

  • 話者は株式会社テンクー(Xcoo)の青木さんと竹内さん。

  • Clojure Cupという48時間 Webアプリケーション開発コンテストがある。 以下の二つのアプリを作った。

    1. news.async
    2. AstroCats

Clojure Cupの紹介

  • 今年で2回目
  • 48時間でWebアプリケーションを1つ作る
  • 1チーム4人
  • 9/27 0:00 UTC ~ 9/28 24:00 UTCで実施。

news.async

  • 世の中のnewsを自動的に音声合成して流す。
  • the guardian というところからとって実装 text to speach というライブラリがあるらしい。
  • core.asyncがgoライクに使えて便利

Clojureの苦労した点

  • Google Cosure compilerがかってに変数名を変えてJS化するので外部ライブラリを使う場合に問題があった。
  • extern というものを使う必要があった。

AstroCats

  • 猫アクションゲーム
  • WebSocket, compojure/ring

Clojureでよかった点

  • STM (dosync/ref/atom)

    • スレッドセーフな実装が短くかける。
  • REPLでゲームロジックをデバッグ

  • 描画周りの実装がない状態でデバッグ可能。
  • 小さく作って、小さくテスト

(JavaとUTとかと比べて何がうれしい?REPLだとインタラクティブにテストができるか ら?)

Clojureで苦労した点

  • WebSocketのいいライブラリがない。
  • ClojureScriptのREPLが無い。

  • Clojureはプロトタイピングも早い。

  • ライブラリも多いし、JavaJavaScriptから持ってこれる。
  • core.asyncは便利
  • ClojureScriptの開発環境はまだいまいち

Clojureでエクセルスクショをとる

発表資料

  • 話者はKawasimaさん。

  • 世界にエクセルスクショを取るという仕事をしているSIerは3000万人くらいいる。 (らしい)

  • teslogger

    • エクセルスクショを取るための別窓をIE,firefox,chrome向けに立ち上げられる。
    • 長い縦長なスクロールも一枚絵で取れる。

DBのスクショを取る

  • teslogger-db-inspection

    • DBの差分を可視化してスクショを取れる。
    • OracleのDBの変更検知を使ってスクショが起動する。

      • Oracle側の設定変更を伴う状態でテストとして認めてくれない顧客いそう。
    • WebSocketを使っている。

    • html2canvas.jsでスクショ化
  • ulon-colon

    • websocketのラッパ?
    • 異なるプロセス間の通信を楽にするライブラリ。
  • OmというClojureScriptの便利なライブラリがある。

    • Facebookのreact.jsのラッパらしい。

スクショを集める

  • 改ざんの余地を与えずに集める。
  • テストケースごとにエビデンスギャラリーを作る。

スクショに注釈をつける

  • ブラウザ上でそのまま注釈をつけられるようになる。(鋭意開発中)

スクショをエクセルにはる。

  • エクセル方眼紙につけるのがマナー
  • マス目にぴったりのエクセルスクショを出力できる。
  • axebomber-cljは環境定義書とかの自動化にめちゃくちゃ使えそう!

LT1 (タイトル見逃しました)

発表資料の公開はされていないみたい。

  • ログからのアクセスを抽出して攻撃検知とメール通知
  • Luminusだと数十分~数時間で実行可能jarが作れる。慣れてきたら。
  • Selmer, compojure lib-nor ring-server Korma を利用。
  • Intellij + La Clojure で開発。
  • 苦労したところ

    • 立ち上がりに時間がかかる。Java8 -> Scala -> Clojureに触ると楽。
    • Javaと同じ速度にチューニングするのが結構大変。
  • リクルートテクノロジーの人だったみたい。

  • 会社でClojureいきなり使わせてもらえた。

SIer的な具体的なアプリケーション開発の事例で非常に良かった。 途中に出てきたメールをリストから送るコード美しかった。

LT2 女子力のあるsyobochimがClojureはじめてみた

発表資料

  • ショボチムさん
  • Clojure暦3週間
  • 顔文字を関数名にしたらかわいい
  • マルコフ連鎖でそれっぽい文章をつくれるbotclojureで作った
  • Clojureアイドルが誕生した瞬間」by 登尾

女子力ネタはとても面白かったがgithubを見たらコード量もそれなりだったのでclojureの印象とかを深堀して聞いてみたかったかも。

LT3

  • 話者はねこはるさんという方らしい。

  • 3つのライブラリの紹介。

    • unapply: パターンマッチライブラリ
    • cont: 限定継続。 DSLの作成に向いている。
    • clog: 作りたてほやほや。

難しくてよくわからなかったけどすごそうだった。 パターンマッチとか言語の標準仕様のように追加できるマクロ機能は強力。

LT4 REPLライフをもっと快適に

発表資料

  • 話者はえいとす@athos0220さんという方
  • 裏でファイルを書き換えながらリロードしてテストとかしてるとうまくいかずに困ることがある。
  • leiningenのREPLは起動が遅い。
  • リロードがうまく動かない。

    • プロトコルやマルティメソッド、マクロに対する変更が正しく反映されない。
    • 名前空間のロード順の制約がうまくいかないことがある。
    • 通信コネクションの切断・接続やスレッドの停止開始が正しく実行されない。
  • 大事な3ステップ

    • tools.namespaceを使おう。

      • (require .. :reload)の強化版
      • ライブラリのリロード時に前回ロードした変なライブラリとかをオフロードする
    • user.clj

      • tools.namespaceがリロード時に消しちゃうREPLで定義した名前をリセットしちゃう。
      • user.cljに書いておくと自動的に再読み込みするので楽。
      • leiningenの profile :devを使うと開発環境でしか読まないとかできる。
  • コンポーネント単位でシステムを作ろう

    • Componentライブラリ
    • トップスコープに名前を作るとREPLのリロード時にぶっ壊れるのでComponentに入れる。

LT5 CodinGameチュートリアルをライブ

  • 話者は tnoda_ さん。

  • CodinGameとはオンラインジャッジ

  • HackerRank CodinGame 4clojureはClojureでかけるよ

  • whileとかclojureで使ったら負け。そこはスレッディングマクロでしょ。

  • MBA12incが欲しい。

LT6 JavaOneでリッチヒッキーの話を聞いてきた

  • 話者はリクルートテクノロジーの方。名前はメモれず..。
  • リッチヒッキー苦労人。エンタープライズもやっていた。
  • Javaがクラス毎に専用の操作用メソッド用意するのやめて欲しい。
  • データのカプセル化のやりすぎは紐で人形を操作するようなわずらわしさ。シンプルが良い。(このストーリー展開はhadoop conference japan 2013 winterのTreasure Dataのスイスアーミーナイフとナタの対比を思い出した。)
  • 近々リッチヒッキーを呼べるかも!

懇親会

  • おしゃれなポップコーンを私費提供していた人がいた!(東京駅で1時間待ちのポップコーンらしい。)
  • Webアプリなどのフロントエンド側を作っている人が多かった印象。
  • rubyistが海外ではclojureに流れるパターンが多いらしい。

    • だが、日本では赤い言語に流れる人が多いらしい。
  • インフラ屋さんは少なそうだった。

  • はじめてのClojure即売会で著者の登尾さんにサインをもらえた。

はじめてのClojure (I・O BOOKS)

はじめてのClojure (I・O BOOKS)

  • 話者の方々と色々と話せて楽しかった。

色々と抜けや間違い多いと思いますので何かあればご指摘ください。

会場提供されていたリクルートテクノロジー様、運営者の皆様ありがとうございました。