#pyfes 2013.11に遊びに行ってきました。

pyfes/201311.rst at develop · pyspa/pyfes

Python Developers Festa 2013.11 - connpass

Pyfesに行ってきました。土日に昼まで寝ている自分としては9時45分の開場期限に間に合っただけで快挙でしたが、Go, HTTP2.0, ストレージ, 構成管理と、今個人的に興味のある分野の話が聞けて有益な一日でした。会場のオラクル青山センターはトイレがオシャレでした。以下、発表内容メモ(聞き漏らし聞き間違いあり)

Go ハンズオン @ymotongpoo

教材:Talks - The Go Programming Language

P2Pチャットシステムを実装するハンズオン。自分は参加資格であるA Tour of Goが半分までしか終わらなかったので、参加するでもなく話を聴いてました。A Tour〜終わらせてから改めて挑戦したいです。Goは書けるようになりたいですね。

LT

原稿募集のお知らせ(Sphinx可)@turky氏(オライリー・ジャパン)

原稿募集のお知らせ // Speaker Deck

  • オライリー・ジャパンがあなたの原稿を電子書籍にします。
  • 達人出版会だけじゃないんですよ!
  • 数十ページから200ページ位の分量でOK
  • テーマ選択や構成案から相談に乗ります
  • 今ならAuthorキャップが貰える!
  • ReVIEW でやってるけどSphinxでおk
  • 編集者がアドバイス/サポートします
  • 連絡ください

Pythonistaもlsを読むべきか? @flyingfoozy

Pythonista も ls を読むべきか?

PythonでのファイルシステムAPIの性能の話

PyConJP2014 開催に関するお知らせ @shkumagai

  • PyCon JP 2014スタッフ・メディアチーム
  • 座長が変わり、動き始めたところ
  • 小さな組織で動いていく
  • スタッフ募集中

HTTP2.0 概要 @jxck_

HTTP2 & HPACK #pyfes 2013-11-30

  • 2013年11月にdraft-08策定。今日はその話
  • HPACK(ヘッダ圧縮)が途中から別のRFCに分かた
  • HTTP/1.1はドキュメントベースだった。ステートレス。
    • pipelining/keep-aliveで延命してきたよね
  • HTTP2は今は割とSPDYとは違う感じになってる
  • 2014年春に決まる予定だが無理なのでもっと先になる
  • Google的にはどこかでSPDYを切ってHTTP2.0にしていきたい
  • HTTP2.0のRFCはGithubで管理されてる。議論はML
  • ネゴシエーション、ALPN/Update
  • HTTP/2.0始め方
    • http:// の場合 Upgrade Header
    • https:// の場合 ALPN (application layer protocol negotiation)
    • 対応が自明な場合は最初なからhttp2.0でしゃべってもいい
  • TLS-ALPN、クライアントが喋れるプロトコルのリストを提出し、サーバーが選ぶ。(Accept-*みたいな?)
    • 虚偽申告なクライアントを叩き落とすMagic Octetsを使う
  • サーバープッシュ、必要になるリソースをクライアントのキャッシュに突っ込んでおく
  • 以前送ったヘッダーとのdiffだけ送る。スタティックなテーブルが定義されておりインデックスで送る(ハフマン圧縮)
  • ヘッダ、63byte→16byteに
  • HTTP2.0実装
    • 日本は世界で1番か2番目に実装の多い国に
    • wireshark + TCP dumpで実装しよう
    • nghttp2
      • 世界標準のCインプリ
    • HTTP2Cat
      • Webツールで試せるようにしたもの
  • オライリー High Performance Browser Networking

HTTP2.0 クライアント nghttp2プロジェクト @tatsuhiro_t

http2client-pyfes2013 - Google ドライブ

  • draft-06/07/08対応
  • libnghttp2はフレーミングの実装
  • HTTPセマンティクスやネットワークIOはアプリケーションの仕事
  • src/nghttp -nv http://twitter.com
  • ダイレクト接続
    • クライアント接続ヘッダー(24バイトのマジックオクテット)を送信。
  • NPNはALPNの逆。標準化されない
  • HTTP2におけるリクエスト/レスポンスの1トランザクションはストリームと呼ばれる
    • HTTPヘッダー → HEADERSフレーム
    • HTTPボディ → DATAフレーム
    • フレームにはサイズ16383バイト制限
      • 複数のフレームに分割して送れる
  • HTTPリクエストの多重化(これがHTTP2.0の本領)
    • 2では1サーバーに対して原則1接続。
    • リクエスト順にレスポンスを返す必要がない
    • クライアントはリクエストの優先度を設定できる(無視可)
  • プロキシ
    • CONNECTも問題なく多重化
  • フローコントロールの考慮
  • Firefox(try-build)がお手軽なクライアント実装
  • node-http2, http2(ruby)

nginx + mruby @cubicdaiya

mruby_nginx_module at pyfes 2013.11

  • https://github.com/cubicdaiya/mruby_nginx_module
  • mruby_nginx_module
  • ngx_mrubyとの違い
    • (mod|ngx)_mrubyはApacheとNginxと同じように書くのが目的
  • mruby
    • 軽量Ruby、組み込み向け
    • Luaから見るとCとの連携が非常に楽
      • Luaのスタック操作と比べると直感的
      • Luaはtableしかなくてつらい。
  • ngx_luaと のちがい
  • ngx_lua
    • nginxの設定ファイルをLuaで書く
    • nonblockingアーキテクチャと親和性が高い
    • lua-jitと比べると強い
    • 色んな物をまとめたものがOpenResty
  • mruby_nginx_module
    • まだまだ発展途上。とりあえずノンブロッキングにしたい
    • 今のところ使える機能
      • コードキャッシュ
      • ハンドラフック
      • nginxの各種機能へのアクセス
  • 記述例
    • 各処理フェーズでデータを共有できる
  • (mod|ngx)_access_token
    • S3のクエリ文字列認証っぽ機能を提供
    • 特定のアクセストークンにも基づいた認証
    • リソースの有効期限設定
    • 認証方式
    • Text = Method + Uri + Expires + AccessKey
    • hmac_sha1 = hmac_sha1(text, secretkey)
    • *_access_tokenと比べて10行で書けた

pixiv を支えるインフラの技術 @harukasan

  • PixivではGoがプロダクションに投入されました→拍手
  • 拠点、オフィスとIDCF+新DCに画像クラスタ
  • オフィス拠点ではベニアサーバーをラックにマウントしてる
  • pixiv Image Cluster

    • 画像配信クラスタ
    • 2010年から運用開始
    • メインコンテンツであるイラストを超高速に処理するために最適化
    • 2,30台、二段キャッシュ
      • 表がnginx、裏がATS
    • ユーザーIDベースでサーバーを分散
      • img1xx.pixiv.net
      • 40-60回のDNSリクエストが発生して家庭用ルータがDNS解決できなくなっていた
    • キャッシュ戦略
      • メモリキャッシュ + ディスクキャッシュ
      • スイッチ間トラフィックを削減するため
      • メモリ価格の定価
      • ioDrive2とか高いけど1/5、1/6の性能で良ければ安いSSDでいい -新イメージストア
    • 作成日 + IDベースのシーケンシャルなURI
    • nginx_luaがkyototycoonにオブジェクトのステータスを聞く
  • pixivのログ解析基板

    • PHPアプリケーションのログ、MySQL/neoagentのスロークエリログ、Front ServerのAccess Log→Fluentd→File System/MongoDB/ElasticSearch(kibana使いたいので)
    • Error Viewr
    • Slow Query Viewer
    • Kibana 3
    • エラー時にログがバーストしてFluentdが死ぬ対策でログをJSONにしてからFluentd ?
    • Munin/Nagios/Monit/Cron
    • Cluster Admin
    • Capistrano/Subversion
    • /etc/以下の設定ファイルがそのままSubversionの管理下のディレクトリに。
    • / 設定反映はCapistranoを使用して全台にデプロイ
    • LVS管理画面
    • MySQLの遅延監視
    • 「尖ったことはせず、無理せず運用出来る状態にもっていく」

「git-flow は死んだ」@troter

git-flowは死んだ - Google ドライブ

  • git-flow = A successful Git branching model
  • git-flowはブランチの命名規則、マージ方法を決めて管理するブランチ戦略の名前
    • masterはタグ専用、developは統合用…
  • メインラインモデルより「安定trunkパターン」に近い
  • git-flowはgit-flowをサポートするgit用のコマンド群
  • git flow master develop finish ← master,developにマージする
  • でも…git-flow使ってる?
  • git-flowの辛いところ
    • 操作が抽象化されてる、gitが上達しない
    • 実装上の制限、2つのブランチにしか同時にマージできない
    • ちょっとおおげさ
  • みんなはブランチ管理したくない。コードに集中したい。
  • ブランチを増やさないGithub-flow的な運用が流行ってるらしい
  • Github-flow
    • masterは常にデプロイ可能、開発はmasterからブランチを切る
    • 開発が進んだらmasterにPR
  • git-flowが発表された当時、GithubはPRをサポートしていなかった。git-flowはPR出現以前の開発フロー
    • PRでもっと軽量に
  • git-flowは死んだの?
    • もともと特定のプロジェクト用の運用方法だった
    • 運用できるかはプロジェクト次第
  • 巨大リポジトリの復権

nginx+Lua @moriyoshi

nginx_luaモジュールの技術解説/モジュール紹介

  • rewrite_by_lua
    • 認証のかかったS3コンテンツを転送
  • access_by_lua
    • 日本時間の9時〜21時以外のアクセスを禁止する
  • header_filter_by_lua
    • X-Powered-Byを強制付加して、PHPで書かれているように演出したい時に便利

組み込み関数

  • nginx.location.capture
    • 内部的にHTTPリクエストしてその結果でハンドリングできる
  • ngx.shared
    • 共有メモリで簡単なキャッシュで
  • Lua文法解説

Ansible入門 @r_rudi

Ansible入門...?

  • ロゴがかっこ悪いのは誤解
  • Chef/Puppet/Salt/cfengine/jujuとかと同じ構成管理ツール、プロビジョニングツール
  • 例のvelocity 2010のLee Thompsonの図
  • Ansibleはオーケストレーションコンフィギュレーションをカバー
  • 本日の前提知識
    • Ansibleはタスクを実行する
    • Playbook == Taskのセット
    • 必ず上から順に実行される
    • % ansible-playbook hoge.yml
      • -i inventry file -u username -k ssh pass -C check mode -D diff表示
  • モジュール
    • unarchive
      • untarする
    • shell module
      • ローカルのfoo.shをリモートにコピーして実行
      • fabricとかは、pythonで書く必要が。
    • 起動モジュールたくさん
    • 全部のモジュールが冪等性があるわけではない。
  • deployのしかた
    • wait_for = 「8080ポートが立ち上がるまでまつ」みたいな指定ができる。10秒くらいスリープしとこうみたいな感じじゃない。
  • rolling update
    • serial: 1 ←1台ずつ実行できる。10にすれば10台ずつ。
  • Python API
    • Ansible + Flask
  • AnsibleWorks AWX
    • きれいな画面でリリースできたり、権限管理とかできる。
    • 10台まで無料。
  • demo
  • 何台くらい扱えるの?
    • 5000台のサーバーに使ってるユーザーがいる
  • Accelarated mode
  • Arista networks
    • スイッチ製品
    • SSH/Python ready。スイッチもAnsibleで制御可能。かっこいい。
  • DBを扱うモジュールも多い。
  • Notification
  • まとめ
    • 自動実行ツールとしても使えるよ
    • moduleたくさん
    • 簡単に作れる
    • python不要
    • 実行速度も十分速い
  • 最近Ansible本が出た
    • 100ページくらいの平易な英語の本
    • Ansible Configuration Management

業界団体の運営について @aishimau

  • OEM Device Sales for Consumer market
    • 「だれが」「なんの」「なにを」「どうする」組織か
    • PC業界の マーケットの 拡大を 目指す
    • スポット的な季節労働
  • 会社のゴール設定を理解することが大切
    • サポート切れるXPどうするのか、とか
  • 業界団体の問題は、人が少ないので人がいなくなると回らない
  • 何にしても大事なのはこれら。これができればなんの仕事でもできる
    • 話を聞く
    • 理解する、傾聴する
    • 整理する
    • 考える
    • 説明する
  • さらに何を言われてもブレない心が大事。
  • 硬軟取り混ぜる。

定期プレゼン

Python 3.4 @torufurukawa

  • 構文/文法の追加無いけどライブラリいろいろ追加
  • asyncio
    • シングルスレッドで並行処理する。未ドキュメント
  • enum
    • 列挙型。定数を安全に評価できる。name,valueもてる
  • ensurepip
    • pipがインストールされた状態にする
  • pathlib
    • パス/ディレクトリ/ファイルをオブジェクトっぽく操作する
    • p = Path(file).parent.resolve()
    • dirname / filename ←でjoinするという… (エー)
  • selectors
    • selectモジュールは低レベル
    • selectのファクトリっぽい
  • statistics
    • 簡単な統計計算
  • tracemalloc

gemのslideshowでMarkdownからスライドショーを作る

gemのslideshowを使ってMarkdownファイルをスライドhtmlに変換する

slideshowとは?

slideshowは、Markdownファイルを様々なJavaScriptスライドライブラリを使ったhtmlファイルをビルドするgem。 一つのMarkdownからいろいろなテンプレートのスライドを生成出来るので便利。

インストールとサンプル

$ gem install slideshow
$ slideshow help  #オプションを確認
$ slideshow help build #buildオプションを確認
$ slideshow new   #サンプル用のwelcom.txtファイルが出力される。中身はMarkdownテキスト。
$ slideshow build welcome.txt

スライド.htmlファイルが出力されるので、ブラウザで開いてデフォルトテンプレート(s6)でスライドがレンダリングされるのを確認する

f:id:ono_matope:20131018174904p:plain

他のテンプレートを使ってみる

$ slideshow install shower
$ slideshow build welcome.txt -t shower

showerテンプレートでレンダリングされる

f:id:ono_matope:20131018175406p:plain

revealテンプレートを使ってみる

ここを参考に

$ slideshow update
$ slideshow install plugins
$ slideshow install reveal
$ slideshow build welcome.txt -t reveal

f:id:ono_matope:20131018175603p:plain

以上。remark.jsテンプレートがほしい。

Blenderでボーンをミラーするメモ

Blender 2.67使用

こういう鳥の翼を作りたいとする。ただしメッシュはポーズ作業以降もX軸ミラーModifierを維持し、ポーズも左右反転コピーを使っていきたいものとする。

左半分のメッシュとボーンを作り、ウェイトをペイントして調整する。

f:id:ono_matope:20130718004129p:plain

ウェイトペイントすると*Lの頂点グループができるが、ここで同名のRの頂点グループを作っておく。_Rの頂点グループは空のままでよい。これをしておくと、Mirrorモディファイアを維持したまま左右反転のポーズが付けられる。(参考:Blenderで3DCG制作日記 操作メモ - Mirrorのまま左右非対称にポージングなど

f:id:ono_matope:20130718004443p:plain

Mirrorモディファイアを適用する。Vertex Groupsチェックはオン。Armatureモディファイアの上に配置。

f:id:ono_matope:20130718005335p:plain

ボーンも_LボーンをShift+Dで複製し、Bone -> Mirror -> X GlobalでX軸反転し、Flip Namesする。 ウェイトも右側にミラーされ、左右非対称のポーズも取れるのでミラーリング成功かとおもいきや…

f:id:ono_matope:20130718005634p:plain

今度は左右対称のポーズを取らせようと、振り上げたHumerus_L(左翼付け根)のポーズをHumerus_RにX軸反転ペーストしたところ、見当違いな方向に回転してしまう。わーっ

f:id:ono_matope:20130718010035p:plain

これを防ぐためには、Rのボーンを選択し、Ctrl+N → Reculculate Roll → X Axis で右側ボーンのロールを再計算すると回転方向がそろう…

f:id:ono_matope:20130718010515p:plain

はずだったのだけど(一回そろった)、記事を書くために二度試したら全く揃わなかった。仕方なく、全てのRボーンのRollを、対応するLボーンのRollを正負反転したものに手動で設定したところ、パーペキな左右反転ポーズコピーが成功した。おわり。

f:id:ono_matope:20130718013732p:plain

FireWire800外付け2.5インチHDDケースを買ってSSDを入れた。

(このエントリーは1年くらい前に書きました)

HD画質の動画をコンポジットするにあたり、USB 2.0の外付けHDDの低速さに耐えられず、2.5インチのFireWire800のポータブルHDDケースを買ってきて中にSSDを突っ込み、作業用ドライブとした。本当はUSB 3.0がよかったけど、うちのMacにはついておらず、まだ買い替えの時期でもない気がしたので。

ケース4,980円。このケースはFireWire 800/400/USB 2.0が刺せるので、FWのついていない端末でも一応使える。SSDは使わなくなって床に転がっていたintel X-25M(80GB)なのでタダ。USB 3.0対応ホストマシンを持っていない場合、FireWire800ケース+SSDは最速の外部データドライブになる。ついでに落としても安心、低消費電力。

f:id:ono_matope:20120420202730j:plain

以下ベンチマーク

f:id:ono_matope:20120420231223j:plain

床にSSDが転がっていないご家庭でも、Crucialのm4とか安いし買っておけばいいと思う。

Crucial 2.5インチ 内蔵型 SATA3.0対応 M4 SSDシリーズ 128GB CT128M4SSD2

Crucial 2.5インチ 内蔵型 SATA3.0対応 M4 SSDシリーズ 128GB CT128M4SSD2

Crucial  V4  256GB  2.5inch  SSD  SATA3Gbps  9.5mm厚 CT256V4SSD2

Crucial V4 256GB 2.5inch SSD SATA3Gbps 9.5mm厚 CT256V4SSD2

 iMacほしい。

Scientific Linux 6.1にrbenvでbundlerなRuby 1.9アプリケーションをインストールする手順

やりたいこと。

表題どおり。やるごとに手順をネットで調べてるのでまとめた。

  • 検証環境はScientific Linux 6.1だけどCentOSでもいける。
  • Rubyバージョンはrbenvで管理されたruby1.9.3
  • アプリケーションはBundlerで構成管理されたSinatraアプリケーション

作業履歴

事前準備

Rubyのビルドに必要となるパッケージを入れておく

$ sudo yum install zlib-devel
$ sudo yum install openssl-devel

Install rbenv

まずはrbenvを入れる

https://github.com/sstephenson/rbenv/ のBasic GitHub Checkout に従う。

$git clone git://github.com/sstephenson/rbenv.git ~/.rbenv 

$echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
$echo 'eval "$(rbenv init -)"' >> ~/.zshrc

$exec $SHELL -l
$rbenv install --list

Install ruby-build

ruby-buildを導入する(rbenvでRubyを手早くビルドするために使う)。 https://github.com/sstephenson/ruby-build の Install as an rbenv plugin に従う。

$git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Install ruby

RubyとBundlerをインストールする。

$rbenv install 1.9.3-p392
$rbenv global 1.9.3-p392
$rbenv rehash
$ruby -v  # バージョン確認

$gem install bundler

gem installで次のような警告が出た場合、openssl-devel のyumパッケージをインストールした上で上記ステップでRubyを再インストールする

ERROR:  Loading command: install (LoadError)
    cannot load such file -- openssl
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

Install application

$ exec $SHELL -l
$ cd /path/to/your/application
$ bundle install --deployment

Could not load OpenSSL.とか言われたらやっぱりopenssl-develをインストールしてやりなおし。

MySQLのスレーブを再起動しても勝手にレプリケーションが再開しないようにする

MySQLで、マスタ系を動かしたまま、スレーブの更新を一時的に止めたいという状況はよくあります。スレーブ群の中から一台だけサービスアウトし、STOP SLAVE;してテーブル変更やリペアテーブルしてからSTART SLAVE;するというやつです。

このSTOP SLAVE;ですが、MySQLプロセスを再起動すると勝手にSLAVEが再開してしまいます。ですので、テーブル変更時にうっかり(ディスク増強などのために)MySQLを再起動するといつの間にかレプリケーションが始まってウワーッとなります。悲しいですね。

my.confにこのようなレプリケーションの自動開始の抑制オプションがないか探してみましたが、ないようです。skip-networkingを有効にしておけばスタンドアローン化するかと思いましたが、これは「TCPをリッスンしない」オプションなので、リッスン側のマスターでレプリケーションを抑止するのに役にたっても、スレーブ側の抑止には役に立たないようです。

CHANGE MASTER TO構文でわざと存在しないホストをマスターに指定することも考えましたが、正しい設定をどこかにメモっておかなければならないので若干面倒くさいです。ですので、master.infoファイルを一時退避することで「MySQLのスレーブを再起動しても勝手にレプリケーションが再開しないようにする」が実現できることを確認しました。

mv master.info master.info.bk

 

mysql> show slave status\G;
Empty set (0.00 sec)

ERROR: 
No query specified

あんまり安全では無さそうですが、やむを得ずスレーブ停止中に再起動が必要になった時には自己責任でお試しください。あともっとマトモなやり方を知っていたら教えてください

 

追記

ありがとうございます。

Dynamoの論文を訳した


Dynamo: Amazonの高可用性Key-value Store[和訳] — Gist

 

DynamoDBとかも出てきた事だし、MySQL以外のデータベースに興味が出て来たのでNoSQL的な流れの源流っぽいDynamoの論文を読んでみることにしました。十日くらい掛けて一通り読んだものの、時間がかかりすぎて何が書いてあったのか全く覚えていなかったので、論文の抄訳的なものをサラリと書き出して理解に努めようと思ったのだけど、残念ながらサラリとエッセンスを抽出出来るほど頭がよくなかったので、しょうがないのでカッとなって全訳しました。

 Dynamoは、「顧客は例えディスクが壊れていようが、ネットワーク経路が断線しようが、データセンターが竜巻で破壊されようが、彼らのショッピングカートを閲覧したり、アイテムを追加したりできるべきです」とか、その可用性のためにバージョン衝突とその調停を受け入れ、カートに追加したアイテムが消えたりはしないが、カートから削除したアイテムがいつの間にか復活する事態は許容する、みたいな決断をしているあたりがかっこいいなと思いました。

ECのデータ永続化に関してそんな設計に承認したりするのは怖くてそうだと思うのだけど、技術的な限界点とECサービスとしてのビジネス要件を高度に判断する企業なんだなーという印象を持ちました(ECサービスに関わったことがないので素人の見解です)。トランザクション処理や原子性保証が自明でないNoSQL時代においてスケールするシステムを構築するためには、そういった判断が重要になってくるのかなと思いました。

 

ところで落ち着いて読んでみたらDynamoとDynamoDBは思いのほか別物だったのでいま泣いてます。