AWS Summit 2015 - Day1 - Aurora Deep Dive
- AWS 星野さん
Auroraについて
- RDSの5番目のエンジン
- クラウド時代に特化した新しいDBエンジン
previewだが、5/20からproduction環境に移行
料金体系
- R3シリーズのみの提供
- ライセンス料は不要
- MySQLとのコンパチブルを保つ
- ロックインはない
特徴
なぜデータベースを再考したか
モノリシックなDB
- 複数の機能レイヤーが1つのアプリケーションになっている
- スケールアウトする場合、このセットで増やす必要がある
- コスト・可用性・柔軟性の問題
今、再実装するならどうなるか?
- 1970年代の方法では実装しない
- スケールアウトが簡単で、セルフヒーリングなもの
- AWSと簡単に連携したい
これをフルマネージドで提供する
アーキテクチャ
- ログレイヤ
ストレージレイヤ
- バックにスケールするストレージサービスを採用
- EC2 / Dynamo / SWF などを管理コンポーネントに採用
キャッシュレイヤの分離
- キャッシュをDBプロセスの外に置いた
- DBを再起動しても、キャッシュが残る
ストレージ
リードレプリカも同じストレージを参照
- 壊れた場合も再ストレイピング、ミラーの修復なども自動で走る
Log Structured Storage
- 追記型のストレージシステム
- 常に末尾にデータ追加
- GC
- 新規データは末尾に追記
- これが10GBのチャンクごとに書き込みが行われる
- 追記型のストレージシステム
ディスク障害検知
- 2つのコピーに障害があっても読み書き可能
- 3つ障害があっても読込は可能
- 自動検知して修復
-
- Binlogによるレプリケーションではない
- 同一のディスクを見ている
- マスターの負荷を最小限にしつつ、15台のリードレプリカを作成可能
- 同じデータのディスクを参照しているので、フェイルオーバーしてもデータロスがない
- Binlogによるレプリケーションではない
セキュリティ
- データの暗号化
- SSL
- 直接ログインは不可
DBクラスタ
- DBクラスタという概念を持っている
- マスタとリードレプリカ
- DB Parameter Group / Cluster Parameter Group
- DBクラスタという概念を持っている
新しいメトリクス画面
- キャッシュ・CPU使用率についてわかりやすくなる
フェイルオーバーとリプレース
- リードレプリカがある場合は1分程度でフェイルオーバー可能
- 優先的にフェイルオーバーさせるノードを指定可能
- ノードリプレース時の起動先AZを指定可能
クラスタエンドポイント
- WriterのCNAMEになっていて、壊れたら別の新しいノードに切り替わる
- Readerはそうはなっていないので、アプリケーションで対応
高速なデータ修復
- 並列、分散、非同期で行われる
Streaming snapshotとPITR
- バックアップを残す期間を指定可能
- 任意の時間に秒単位で戻すことが可能
- 現在では、2分前のデータから可能
SQLによるフェイルオーバーのテスト
- 擬似的に障害をシミュレート
パフォーマンスを引き出すために
- クエリ並列度が高い、データサイズが大きいケースで効果を発揮
ロックやQuery Cacheに手を入れて、性能を向上
CPU利用率はMySQLに比べて効率化
パフォーマンス
-
- MyISAMのテーブルは無いのでコンバートされる。1.5TB異常な以下は確認
Auroraの使いドコロ
AWS Summit 2015 - Day1 - Amazon CloudSearch Deep Dive
- AWS 篠原さん
SnapDish事例
ランチセッション
- ランチといえば
- お弁当どうしよう
CloudSearchで検索を入れてる
そもそもどういうさーびす?
フルマネージドな検索エンジン
- 多言語対応 34言語
- ハイライト、サジェスト、地理など
AWSの中ではマイナー
Amazonで買い物すると。。。検索の下でA9というのが出る
- スタンフォードにA9.com
- そこで作ってる
どう使う?どういうもの?
南北線の検索をしたい
- 海外で発表したら、東京都地下鉄やばいという話になった
検索ドメインの作成
- 南北
- JSONで駅のコード、駅名などのデータファイルを作成(SDF)
- upload
- すると、勝手にスキーマ定義
- フィールド指定にDynamic Fieldも使える
プルダウンで選ぶだけで、日本語でのトークナイズができる
あとはもう、検索すれば出る
- OR検索とかも出来る
-
- 辞書のカスタマイズが可能
- きゃりーぱみゅぱみゅ、とか
- データファイルを作って、定期的に辞書に取り込んだり
- 辞書のカスタマイズが可能
シノニム・類義語
- これらもWebやCLIから登録できる
Bi-gram Index
- 言語をMultiple Languageにセットすれば使える
- 2文字ずつで切るとノイズが発生
- 東京都と京都
形態素解析とBi-gramを組み合わせて使う
- SourceField
- 両方でor検索的にして、形態素解析側を優先する
ソート順はTF-IDF
- ドキュメントにその言葉がいっぱい出てくるなら、高スコアにする
様々なexpression
- 結果の重みづけ、調整ができる
A/Bテスト機能
- 重み付けを変えた場合の結果を比較する機能
複数の方の組み合わせ
よみがなをベースとしたSuggestion
可用性、IAMによる管理
- AWS Security Blogにもいい例がある
Inside Amazon CloudSearch
フルマネージド
- Auto Pertitioning
- Auto Scaling
中身がどうなっているのか?
Indexing
- 中身はELBがいて、その裏にEC2が並んでる状態
- データを保存する場合に、どれかのノードに送られる
- そのノードが、ひとまずレスポンスを受け取った上で、DynamoにUpload。その後は非同期処理
- 定期的にS3/Dynamoにポーリングして、担当の処理があれば処理・Indexを作る
Query
- 受け付けるところまでは同じ
- 一般的なEC2の場合と同じAutoScalingが動いている
- クエリの量が増えると、それによって増える
AutoPertitioning
- データ容量の増加にどうやって対応してるか
最初はスケールアップ
- なので、ダウンタイムはないが切り替わり中はIndexingが反映されないことがある
1ノードでまかないきれなくなったら、スケールアウト
検索ドメインの変更など
- 同様にEMRで
初期のデータを投入する場合
大量のリクエストに備えて事前対応
導入事例
schoo
- 爆速で導入
- リリースまで1週間
nanapi
- デフォルトのまま使ってる
- それでもいい感じに検索できている
Chatwork
- 日本最大級の利用例
- 5億件以上のデータ
- 運用はほぼメンテナンスフリー
- CloudSearchにして速度はかなり改善した
更に知りたい方に
- DocValues
- CloudSearch SAのビデオ
- たとえば、普通のqとfq(filter query)の性能差とか
AWS Summit 2015 - Day1 - keynote
Keynote のメモ
AWS Japan CEO 長崎さん
昔Jeffが書いたメモ
- 低コスト構造を作り、それをローコスト化につなげることで、顧客満足度が高まる
- この構造がアマゾンのモデル
スケール、スピード、イノベーション
-
- 店舗がないので、テクノロジーが命
- サーバが間に合わない、などは命取り
- 顧客の価値にフォーカスしろ!
- 社内調査した所、開発者の時間のほとんどが、サーバのおもりに費やされていた
- ビジネスをより早く
- ワンクリックでサーバの準備が出来るようにし、インフラをプログラマブルにすることで価値にフォーカスできる
S3は年間102%の成長率
- EC2も93%の成長率
- 100万のアクティブユーザー
- 多くのパートナー企業
- 増え続けるAWSソフトウェアとSaaS
- ESP
- 冊子にしました
ユーザーコミュニティ
クラウドは今やニューノーマルに
- 特定の先進的な企業が使うものから、普通の企業が使う当たり前のソリューションに
スタートアップによるビジネスの開始
- やりたいことが即座に低コストに、初期投資を抑えて変動費に
- スピードを重視
aribnb
- 5人のエンジニアがAWSを使って運用している
- Dropbox
クラウドワークス 吉田さん
昨年上場
- 36で一度ビジネス失敗
- そこから再スタート
- AWSで始めて、3年でここまできた
クラウドソーシングとは
- 新しい外注方法
- 個人に対する発注
- 個人の労働力を企業が活用できる
歴史的に、経営は持たざる経営が進む
- 利用は9万社を突破
- 時価総額ランキングトップ10中8社が利用している
東証の鐘はユーザーに叩いてもらった
年収1000万でクラウドワークスで稼いでいる人もいる
新しい形の地方創世
ガイアの夜明けで次回取り上げてもらえる予定
- 錦織の試合が無ければ、今夜w
100% AWS上で完結している
リクルートテクノロジーズ 中尾さん
- 海外に1000拠点
ビジネスは「リボンモデル」
2年半前に分社
- その一つがリクルートテクノロジーズ
リクルートは400以上のサービスを展開
- テクノロジーズは、そのITを支える
- 現在400名の会社
どうつかっているか?
Speed
- Flexbility
Fanctionality
キャンペーン等のトラフィックが予想できない場合に有効
- 同時にpush通知を送る場合
- 秒間に14000に送れる
長崎さん
- 素早いプロビジョン
それをすぐに縮退できるか
コアなサービス部分
既存の資産を容易にするサービス群
Gartner
実際の業務のサイズ・形は千差万別
ニーズに合ったプラットフォームを用意することで、これを解決してきた
共有ファイルシステムの課題
9年の運用実績
- 既存の資産を運用するのとは、全く違う規模感
データの収集・保管・分析・共有はとても困難だった
機械学習を利用する顧客が急増中
- Amazonは元々レコメンデーションで機械学習を利用
これをもっと社内で活用できないか?
Amazon Machine Learning
- フルマネージド型機械学習サービス
- ハードウェアも気にしなくて良い
Aurora
Amazon WorkSpaces
- ソフト・ハードの管理不要
- 様々なデバイスからアクセス可能
- 月額利用オンプレより半分の価格
Amazon ECS
Amazon Lambda
- コンピューティングリソースを極小化
- イベントをトリガーにコンピュータを起動
- そのイベントの時間しか課金されない
- 今までだと、インスタンス単位での課金(1h)だった
- 100msならその分だけ
第三者認証と監査により証明された、高いセキュリティ基準と運用基準
ファーストリテイリング CIO 玉置さん
売上高1兆3800億円!
作るシステムは最初からグローバル
- 直感的に、マニュアルいらずでどのデバイスでも動く
スピードに応えるクラウド
なぜAWS?
- 重視しているのは、Large Community
- エンジニア・デベロッパーを惹きつけて、自発的なエコシステムを作る魅力がある
- ここに非常に魅力を感じている
瞬間で、11万リクエスト/sec
正直、サイジングがきちんとあたった覚えが殆ど無い
そんなものよりAWSのスケーリングにかけている
マルチリージョン
Now Hiring!
長崎さん
- 「重力」には逆らえない
- 変化や未知のものはだれでも怖い
画像変換Nightに行ってきた
- http://connpass.com/event/11516/
- とりあえず、見つかった限りのスライドは載せました。
- 発表者のみなさま、会場のGREEさん、ありがとうございましたm( )m
感想・まとめ
- 全体的に濃い話だった
- go-thumber使ってみたい
- 基本的にみんなImageMagick大好き
- というか、あまり他に優秀なインターフェースがないんだな、の印象
- yoyaさんは神
- 自力でやりました、という話が中心で、こうやって楽にやってますという話はなかった
- 切り出しとか考えると、ASPつらいのかもね
- でもCloudinaryすごいよ?
- ImageHayabusaへの期待感すごい
サムネイルマスタとgo-thumber
- はるかさんさん
pixivのひと
オリジナル画像をそのまま配信
- 転送量がめちゃ多い
- デザイン大変
- 後からサムネイル作るの大変
- サービスが大きくなるにつれ、つらくなる
アップロード時にサムネイル生成
- アップロード処理が大変
- 非同期処理必要になる
- そうしないと待たせちゃう
- サイズ変更が大変
- アップロード処理が大変
リクエスト時にサムネイル生成
- 動的変換
- デザイン変更が簡単
- キャッシュしてくれればリクエストも少ない
動的生成で困ること
- 生成元画像に依存
- サイズもバラバラでメモリ量もバラバラ
- 処理が面倒
- フォーマットの問題
- 加工とかとか。。。
- 生成元画像に依存
サムネイルマスタ
- サムネイル生成元となる画像マスタ
- リクエスト時の生成の負荷を軽減
- 他のサムネイルよりでかい
- 長年培われたcrop技術により。。。縦長は下が切られる
画像はJPEG保存
-
- ブラウザによってICCプロファイルを解釈したりしなかったり
どうすればよいのか
- カラーマネジメントできるエンジニアが不在
- ユーザー環境がただしいプロファイルを扱っているかわからない
これらの問題をサムネイルマスタで解決
go-thumber
- サムネイルマスタをいい感じに作ってくれるプロキシ
- はやい
- LibJPEGv6 APIを生で叩いて書き込み
- LibswscaleでImageMagickと同等の精度
-
mod_smalllight(imlib2 / imagick)
と比較- Apacheはあんまり頑張ってない
- だいたいimlib2と同じくらいの速度になった
ブラインドテストをやった
- 50%ぐらいの人が、go-thumberのサムネイルを一番きれいだと選択した
何故綺麗に出たか?
スケーリングデコードのサイズ最適化
- libJPEGは1/1 - 1/8の好きなスケールでデコードできる
- go-thmberでは必ずサイズの2倍に設定してる
次はwebp-thumbersを目指してる
Q: URLにパラメータが直接見えると、だれでも変換できるが?
- A: nginxのrewriteで特定のものだけ通してる
- 開発環境ではフリーに通してる
- A: nginxのrewriteで特定のものだけ通してる
実践ngx_small_light
入門
- bokkoさん
Mercari, Inc.
ngx_small_light
- Imagemagick / imlib2 / GD
- PNG / JPEG / GIF / WebP
setup / install / 設定
small_light on;
small_light_pattern_define
で名前を付けられる基本的なパラメータ
- dw,dh
- of
- q
- p
- e (defaultはImageMagick)
small_light_getparam_mode on;
- query stringから指定できる
- デフォルト off
- 設定すると
small_light
関数は使えなくなる
S3にある画像を
ngx_small_light
でリサイズ- リゾルバの設定が抜けてた
画像ライブラリの比較
- それぞれ特色ある
その他のモジュールについて
mod_small_light
ngx_small_light
のポーティング元
ngx_image_filter
- 標準で付いているimage filter
go-tumber
- pixiv制
Image最適化について
worker_(processes|connections)
- worper_processesは多めに
- worker_connectionsは少なめに
- nginxとは逆w
- nginxがイベント駆動であることは忘れるw
- JPEG Hinting
- 本当は早いImageMagickでググれ!
jpeghint=y
- JPEG以外では無視される
- libjpeg-turbo
- OpenMP
- WebP
- JPEG / PNGと比べて軽量
- ImageMagickとGDで使える
- Cache
ImageMagick + WebP
mirakuiさん
WebP
- ウェッピーです!!!!!!
なぜWebP?
- 小さい
- JPEGに比べて画質が劣化しにくい
- 半分以下ぐらい
WebPの欠点
- 対応環境が少ない
- 右クリックで画像を保存、でJPEGが欲しい人達がいる
- Webだと変な不評がでる
ネイティブアプリなら。。。
- Android 4.0以降なら大丈夫という噂もあるが。。。真に受けない方がいい
- 4.4以上で有効にしてる
Tofu
- ImageMagickが対応してる
- 調査すればノーコーディングでいけるのでは
yoyaさんのブログを見る
- 6.6.8から対応してた!
ただ6.6.8でのWebPはぶっ壊れてる
ChangeLogを追う
- 6.8.6-8まで。。。
ImageMagickのバージョンアップ怖すぎ問題
- 絶対避けたいこと
- ImageMagickのバージョンアップで画像の色味が変わってしまうこと
- 全てをチェックするのは無理
yoyaさんに相談
- 6.8.7からは色空間の扱いが変わった
- ここで色味が変わる可能性がある
- 6.8.7からは色空間の扱いが変わった
WebPにはどのバージョンを使えばいいか
- 6.8.6-8まで上げれば、必要十分
- 6.8.7からは色味が変わる可能性がある
- これから使う人は、最新を。
- 6.8.6-8まで上げれば、必要十分
ImageMagickアレコレ
- http://diary.awm.jp/~yoya/data/2015/02/18/ImageMagick-something.pdf
- yoya
今回はImageMagick 6だが、本家は既に7前提
6と7の違い
- ディレクトリ名が違うだけ。。。
ImageMagickってなんだっけ
- 画像を処理できる何か
- コマンドがある
- いろんな言語から使える
- フォーマットがたくさん
- 100種類以上のマイナーなものまで
- cssのinlineフォーマットまで対応してる
ImageMagickの開発傾向
- 活発すぎる
- APIのバイナリ互換とか気にしない
- コレに切れてforkしたのがGraphicsMagick
バージョン毎に声質が違う
- 全バージョンをそろえるwww
- 600ぐらいビルドw
全バージョンで実行
QuantumDepth
- Q8/Q16
- RGBの各値を8bit/16bitのどっちで持つか
- 普通の人間の目なら8bitで十分
- ImageMagickはデフォルトQ16
Q8の問題点
- 医療用画像などではQ16なので使えない
- HDR等のフィルタでちょっと荒くなる
OpenMPが重い
JPEG画像変換
- 何故JPEGHintが早いのか
最近のトピック
- 6.8.7-4がエポックメイキング
- 6.8.8-2
- icoファイルをauto-resizeできるように
6.9.0-4
GIFアニメ最適化
- 変化のある部分を切り出して、透明にして軽量化
GraphicsMagickは?
- GIFアニメ生成が早いのは、実は単にエンジンが古いだけ
- GraphicsMagicはQ8デフォルトなので、比較するなら同一にしないとアンフェア
ImageMagickを弄りたくなった人へ
- Cristyさんはコミットコメントを書かないw
- コードはきれいなので、意図は伝わる。。。
RICOH THETAの全天球画像でペーパークラフト
- ちはやふるさん
全天球画像をつくる
RICOH THETAの静止画保存形式を切り取り、印刷
- iOSアプリ PazuCraft
- ペーパークラフトになるの面白い!
1px interpolation
https://docs.google.com/presentation/d/1R4htUndRQonOeTg35t17J8Lw4hWiHje0fWtm1xdIkds/edit#slide=id.p
Greeのひと
宮崎さん
- JS書いてる
1px interpolation
- 1pxの線を描画する際に、レンダラがどのドットに割り当てるか悩んで憤死するw
- ブラウザのバグ
再現方法
とあるECサイトに動的画像変換を導入した話
GMOペパボ yano3
カラメル
- ショッピングモールサイト
動的画像変換はしてなかった
- 提供元によって画像の仕様はさまざま
おから(仮)
- 動的画像変換サーバ
ngx_small_light
ハッシュ値があってたら、動的生成に投げる
今後
- WebP
ngx_small_light
の利用事例
- 導入の経緯
- バックグラウンドジョブで変換してたが、時間かかる
WebPの経緯
- 通信の改善
VagrantでCore OS VMからPushして、infratasterでCI、Merge押すとQuary.ioでビルド
CoreOSインスタンスを立てて切り替えて古いものを消す
- どのサーバでも同じフローで
遭遇した問題
- WebPの変換がおかしい
- mirakuiさんにきいたw
- nginxがcoredump吐く
- ImageMagickの初期化タイミングの問題だった
- nginx異常に高負荷になる
- WebPの変換がおかしい
JPEGのDCTブロックでコンテンツ指向のトリミング
4_suke
さんコンテンツの場所を考慮して切り取ってくれたらいいのに!
-
- 顔認識の結果をベースとしているらしい
- 顔認識は計算リソース必要
- 保存するとしても、ストレージ必要
- 顔以外は認識してくれない
JPEGエンコーダに手を加えればいいんじゃね?
- DCTブロックを直接参照すれば!
JPEGデコードの過程でDCT変換したデータが得られる
- 高周波成分が集まってるところが、経験則的には中心ぽくなる
ハフマン展開 + 逆コサイン変換を DCT変換の後に追加
- 人がたくさん入ってくると、平均化されて真ん中が切り抜かれがち
まとめ
- ナマの画像にそのまま使うので、計算量が少ない
- 追加実装も少ない
- 顔認証と違い、なんでも大丈夫
- JPEGにしか適用できない
- 文字が入ってると弱い
jpgjsに手を入れた
pixiv方式とどちらがいいか?
- どれだけコンテンツに対する仮定を置くか
- 何がメインか、によって違う
- 仮定を踏まえて定量評価するしかない
ImageHayabusa
Guntherさん
デザイン作業効率化
- 素材の切り出しや必要な素材サイズを毎回デザイナーにお願いしないといけない
- これを一発で
メリット
- 作業が楽になる
パラメータで様々な変換ができる
- PSDの特定のレイヤーを指定して書き出しもできる
初回は生成、2回目以降はキャッシュ
- CSSも出力し、中で使っているフォントもわかる
8086命令セットの細かいメモ(2)
今日もまた、細かいけどためになる話を教えてもらったのでメモ。 自分で事後補足として調べたものも含むので、用語が正確じゃないかも。ツッコミ希望。
NASMがpushf(9C)/popf(9D)の機械語をpushfw/popfwとディスアセンブルするのはなぜか?
これはすごく歴史的経緯が深いやつで、16/32/64bitのCPU命令の拡張に伴う変更に起因するもの。 inc/dec命令その他複数の命令も同様の事情を持っている。
instruction prefix
この話に関係するのは、instruction prefix(命令プレフィックス)と呼ばれる、16/32/64bitの切り替えと互換保持などのために用いられる機能。
特に16/32bitの命令切り替えに関連してくるのは、
- The operand-size prefix (66H)
- The address-size prefix (67H)
といった、オペコードの前に置かれるprefix。これが配置されることで、その後ろの命令のオペランドサイズを切り替える。
pushf/popfにおける具体例
表題の疑問の回答。例えば、
bits 16 pushf pushfw pushfd
は、アセンブルすると
9C 9C 669C
となるが、
bits 32 pushf pushfw pushfd
は、
9C 669C 9C
となる。
逆アセンブルの場合も同様で、-b 16
では
9C pushfw 669C pushfd
だが、-b 32
では
9C pushfd 669C pushfw
という解釈になる。 ちなみに、16bit命令のpushf/popfと等価なものはpushfw/popfwであり、pushfd/popfdは32bit用命令セット。
64bitになると、32bit時代の命令であるpushfd/popfd
は廃止され、64bit用にpushfq/popfq
が加わる。
予想だが、16bitのものが残って32bitのものが消えたのは、 16bit機能がリアルモード/プロテクトモードの切り替えで意識する必要があるからではないか、と思っている(正解はまだ知らない)。
REXプレフィックス
64bit化の際には、このprefix以外に、さらにREX prefixが導入された。 その導入のために、inc/dec命令の領域を再配置し、その一部がprefix用に再利用されている。
同じ命令が複数の方法で表現可能な理由
例えば、
mov ax,0x12
は、以下の2通りで表現可能。
B012 C6C012
このように、なくなってもいい or 他の方法で表現できる命令が時々存在する。
何故こんなのがあるかというと、よく使われる命令セットを1つのショートカット機能で実現することでbyte数の節約に役立てる、というのが存在理由らしい。
ここは自分の推測だが、CISCの思想というのはつまり、こういうことなのかもしれない。メモリ大事。
addのImmediate to Register/Memory
命令でs:w = 10
が無い & s:w = 11
でdataが1byteなのはなぜか
フラグの意味は以下のとおり。
加算命令ではあるが、コンピューターの世界では桁あふれと補数の存在によって減算も行われる、というところまでが前提。
sフラグは、wordの世界での下桁1byte分の減算を実現している。
計算としてはsのフラグなしでも全て成り立つのだが、sを導入することで0XFFxx
と加算する場合と比べて1byteが節約できる、というのが(おそらく)このフラグの目的で、同時にs:w = 11
でdataが1byteだった理由。
そして、byteの演算にはsignedを持ち込む必要性がなかったために、s:w = 10
の演算は定義されなかった、ということのようだ。
ざっくりまとめると
- 1byte + 1byte なら引き算考えるときsignとか不要
- 2byte + 2byte も同じくsign不要
- 2byte + 1byte分の引き算をする時、signedで考えると1byteケチれる
という話。
ちょっとした感想
こうしてアセンブラと機械語の対比を見つつ歴史的経緯を知っていくと、一見なんだか意図の読めない命令セットの中の、CPUの進化・効率化と互換性確保のバランスを綱渡りしてる感じが垣間見えて、非常に面白い。
全命令セットを実装していくのは冗長な作業では、と最初は思ったけど、このへんを知るにつけ意味のある作業だと実感が強まってて良い。
8086命令セットの細かいメモ
勉強会で教えてもらったので、忘れないようにメモ
pop csが無い理由
- 8086にはあったが、使われることがなくて廃止された。
- その結果、別の命令が割り当てられた。
- 参考
xchg ax,ax -> nop
の理由
- エイリアス
- 何もしない命令なので、エイリアスがついた
- 昔からある仕様
xchg ax,ax
自体はアセンブル可能- 実は、
90
以外もある- 2byte以上の
nop
- 複数の
nop
を呼ぶコストを削減するため - http://blog.livedoor.jp/blackwingcat/archives/1598318.html
- 2byte以上の
lea ax,ax
などの命令が割り当てられていないのはなぜか
lea ax,[bx]
ax = bx
の代入- カッコを外して代入をする命令
lea ax,[bx+5]
と、ディスプレースメントつきの場合ax = bx +5
の計算が1命令で出来て便利、という使い方
- そのため、
lea ax,ax
の命令だと、そもそもカッコがないので、この命令はありえない。- なので、この命令はない
in, out命令のword/byte切り替えについて
portの指定が1byteのままなのは何故か?
I/O空間自体は、0000 - FFFFまである
- しかし、この中で即値で指定できるのは00FFまで。
- それより上については、
dx
に入れて(Variable Portで)使う。- おそらく、8080とか8bit時代の仕様を引ずっているのでは。
Go Conference 2014 autumn に参加してきた
GoCon2014秋にいってきたよ! とりあえず、まとめと見つけられた分のスライド載せました。
先にまとめ
- 朝から全開で実用的な話が多く、ためになる話多かった。
- Goの哲学をRob Pike先生本人から聞けるなんてなかなか無いですよね。
- 8時間ハードだった
- ケツ痛い
- 英語力磨かねば。。。
- スタッフの皆さん、発表者のみなさま、会場+協賛をしてくださった楽天さん、Klabさん。素晴らしいイベントを有難うございました!
Keynote
- Rob Pike
Goはなぜ成功したか
- シンプルさ、こそが本質
- 他の様々な言語は、複雑すぎる
各言語は、他の言語のいいところを吸収しあうことで大きくなり、複雑化して発展してきた
Goはそれをしない
Go1の時点で言語機能は固定化された。
- 色々な機能を追加してほしい、という声がある、が、それは追加しない。
もちろん、いくつかの機能は必要
- 正しい機能を実装する!
可読性
プログラミングにおいて非常に重要
言語が難しいことによって、様々なやり方が生まれてしまい、あとで何故コレが動くのかわからなくなる。
言語がシンプルなら、書き方は絞られる。
可読性は信頼性
表現力が高いからといって、可読性が高いとは限らない。
- 実装コストが高くなったり、パフォーマンスも予測しづらくなる。
正しい言語機能
- 機能のための機能ではない
- 目的を正しく認識し、必要な機能を
Goの目的
- サーバソフトウェアを強力に作るためのもの
各要素がそれぞれ単純に組み合わさっている
Gopherってシンプルだよね!(笑
単純さ
- Goは実際には複雑だけど、シンプルにする仕組みがある
- GC
- goroutines
- constant
- interface
- package
GC
- 複雑さを隠す最たるもの
- コレのお陰で、コードがシンプルに書ける
- メモリの管理や、データのやり取りの厄介なことを隠蔽してくれる
並列性
プログラムを独立実行しているようにかける
- goroutine
- channel
- select
goroutine
定数
- ただの数!!
- 無限の精度整数型
- 無限の浮動小数点型
- etc...
- 完璧にできてるわけではないが、かなり普通の数字のようになってる
- こうすうるのはややこしかったけど、その代わりGoはシンプルになった
interface
- メソッドの集合体
- 想像以上に複雑
型アサーションと型switchは本来の予定にはなかった
Goの最も特徴的な機能
- io.Reader / io.Writerなどは、パイプのように扱えて、複雑さを隠蔽した
package
- ライブラリ構成の設計
- これの設計には非常に時間がかかった
まとめ
- 単純さは設計が難しい
- コレのために戦う価値がある
Goに入ってはGoに従え
- うかいさん
- Goの可読性について
Go Readability Approver
- Go言語のReadabilityをレビューするチーム
- より良いGo言語の書き方を教える
- メインのプロジェクトではないコードを見る
Readabilityスキルとは
Goのコード
- 明瞭・簡潔
- 使いやすいAPI
- 適切なコメント
- 素直なコードフロー
- goroutineなどのお陰で、コードの流れが読みやすくなる。
- コードの実装を読むのに、Goの実装を読むのが一番理解しやすい。
優れたツール
- ツールによるサポートを常に適用するカルチャー
- go fmt
- go vet
- golint
- godoc
ツールだけでは十分ではない
- 読みやすいコード == 情報が認識しやすい/脳に負担がかからない
- Goはシンプル
Readability Reviews
- ミス・バグチェック
- 見やすくレイアウトされているか
- コードフローはわかりやすいか
APIはわかりやすいか
気になってきた点を紹介
ミス/バグ
errorチェック
- regex.Compileのerrorチェックを飛ばす人がいる
regex.MustCompileでエラーチェック
- やっていいのは、初期化の時(varかinit())のみ
deferを使ったcloseのチェック
- close自体もエラーチェックする
値自体で
-1がエラー
みたいな判定をさせるのではなく、値とエラーを分ける。- error毎のデータを定義して、それを判定する
errorの設計
-
- 値と型が共にnilの場合
- 間違えやすいので注意
interface実装の型チェックには、structにinterfaceを実装するのではなく。。。
_ scan.Write =
などのようにすることで、型チェックだけできる
見やすく
- structフィールドのレイアアウト
- 関連が深いものをブロックに分ける
- 長い行
- 長さ制限はないので、1行に
- なので、名前は簡潔に
- 与えられたコンテキストのなかで、わかり易い名前にする
- 長い名前がわかりやすいわけじゃない
- 冗長な名前をさける
- レシーバ変数は数文字で良い
素直なコードフロー
基本のコードパスのインデントは最小に
- errorの分岐もシンプルに
- funcを分割したり
- if else並べるぐらいならswitch
time.Duration
- constは型を持たないので、time.Durationにする型変換は不要
chanを使えば、sync.Mutex, sync.Condが不要な時がある
型がわかっているようなときにreflectを使わない
テストコード
- わかりやすいテストメセージ
- 独自アサート関数を定義するより、言語の機能を使う
- コメントにAPIの使い方を書くくらいなら、Exampleテスト
コメント
- packageコメントを書く
- mainパッケージは、コマンドのコメント
- Exportしている名前にはコメントつける
- 対象の名前を先頭に
コメントがわかりにくかったり書きにくい場合は、API設計を考えなおした方がいい
APIデザイン
- 適切な名前のpackageを作る
- APIをシンプルにする
- 返り値は複数使えるので、出力変数としてポインタを使わない
- Cとかでよくある
- 非同期APIより同期API
- chanをpackageを超えて使わない
- 非同期化は使う側がgoroutine + chanで制御
読みやすいコードを書くには
- 明瞭に表現すること
質問
- 名前付き戻り値について、いつ使うか
- コメントで補足しないとわからなくなるような場合(string, string, intなどのようになって、1つめ2つなんだっけ?としまう場合)
- deferの中で、返り値を弄りたい場合などは、名前がついていないとそもそもいじれない
Gardner & Go
- Tシャツ作ったよ
- とあるゲームの色を。。。w
- FreeGuhoでEC販売してるよ
- 1500 + 160だよ
- Golang Tシャツもあるよ
- 2500 + 160
App Engine for Golang Preformance
- 普段はApp EngineでJava書いてる
App Engine for Go
- 最初の呼び出し部分はmain()じゃない
- init() -> http.HandleFunc("/", handler)とかしていく
App Engine for Goの微妙な所
- Version upが遅い
- GOMAXPROCS = 1限定
- Goが本気出せない
Managed VMとは
- Google Compute Engine上でApp Engineのコンテナを動かす事ができる
- dockerで動いてる
GOMAXPROCSも挙げたりできる
- 本気出せる
微妙な点
- deployが遅い
- autoscaleの最小値が1
- 常時課金発生
Performance
Golang@ISUCON
なんでGo?
- 改善効率の高さ
取り組んだこと
- プロセスキャッシュ
- タスク分散処理
プロセスキャッシュ
- データをプロセス上に全て保持しておく
永続化は適度なタイミングでRedisに保存したりする
グローバルに変数置いて。。。とかやると、Goroutine複数作ると整合性の保証が必要になる
Race Condition
syncパッケージ
- 各種ロックを使う
- sync.RWMutek
- sync/atmic
atomic.Value
- golang 1.4
- プロセス上にatomicにデータ更新できるストア
- シンプルにかける
タスクの分散処理
- 画像・動画などは重複処理したくない
Task Queueing
- goroutineとchannelでそのまま使える
- goroutineの本数で調整できる
重複処理
処理先を振り分ける
- consistent hashライブラリ
- stathat/consistent
mackerel-agent徹底解説
Mackerel
- サーバ監視・管理ツール
- エージェントがGo
mackerel-agentとは
- 1分毎にAPIにメトリクスをPOSTするエージェント
なぜGo?
- マルチプラットフォーム対応
- シングルバイナリ
- フットプリントが小さい
プラグインもGo
- sensu互換の出力
ソースコード解説
- 外部への依存: tomlを利用
windowsで動かなくなるオチを防ぐため、シグナルハンドルではos.Interruptを使う
chan chan
- チャンネルでチャンネルを渡す
- 複雑なので、シグナルハンドルもメイン処理に入れたほうがいいんじゃないか?というのはある
loopの状態管理
- enumっぽくtype作って処理
なんか色々改善点あればご指摘ください
Why my Go program is slow?
- methaneさん
- CPUプロファイラの話
runtime/pprof
- サンプリングプロファイラ
- モンテカルロ法に似てるやり方だよ
- 計測方法として、実行時のサンプルを大量にとって、重い箇所を特定する
net/http/pprofなんかがHTTPではおすすめ
解析するプログラムもpprofという名前
- google preftools
- Go 1.4からはGo版になってる
- ぐっと便利になってるので、ここだけでも1.4にするといいよ
デモ
- webで展開できたり、アセンブリ単位で見れたりしてすごい
どこが重いか
- GC
- memory copy
- function call
GC
- GOGC=400とかすると、急激な負荷に唐突に突っ込むとGC頑張っちゃって負荷が高くなってしまうので、それを遅くする
memory copy
- 文字列便利だからってコピーしまくると大変
- []byteとか使おう
function call
- 引数がレジスタじゃなくてスタック渡し
Golang JP Community
- 日本のGolang JPのコミュニティの紹介
Go at Gengo
- Gengoの中の人
- 中でめっちゃ使ってる
the early days
GoShip
- Goベースのデプロイメントツール
- なぜGoを使った?
- productionに入れる前に、試しに作ってみるのに調度良かった
Go API
どこから入れるべきか
- まず、クリティカルじゃない所から入れよう
- 全てを一度にrewriteしようとしないほうがいいよ
Dive in
Managing dependencies
- まず試したのはここら
- go get
- gom
- godep
- 結局シンプルなshellscriptになった
- godepが標準ぽいけど。
- まず試したのはここら
Test Fixtures
reflect
をつかって頑張ってる- Gorpの`Insertable`を使うと簡単にできる
- LoadFisturesみたいなの定義して使ってる
- ただ、fixtureテストが並列化できないよね
- go test -p 1してる。。
Quick Wins
- graceful shutdownの例
- gofmt -s / gofmt -w は走らせよう
- go test -race / go importsしよう
- go vet 大事
One Year Down
- 抱えてる問題
- logging
- slow build times
- test fixtures
NSQ-Centric Archtecture
- Greg
- Gunosyの人
chatサーバをGoで
- Go + webview + websocket
NSQ
- message queue
- SPOFなしでスケーラブル
プッシュ型のメッセージ通知
- データフォーマットはなんでも良い
問題点
- メッセージが1回以上とどく
- 順序保証がない
NSQのアーキテクチャの話
自作したChatアプリのアーキテクチャの話
面白そうだけど。。。話が飛んじゃって流れがわかんなくなった。。。
Hacking Go Compiler Internals
- moriyoshi
対象の人
- Go に拡張いれたいなー、コンパイラーどうなってんのかなーって人
Lexer
Parser
- Lexerが作ったTokenを抽象構文木(AST)に変換する
yaccで作られてるよ
Braket operator overloadの例
- typecheck 型推論の部分
- walk
print()関数はdebugの時に便利だよ
- printfっぽいやつ
Roll-up
- 一見大変そうだけど、中身は凄くシンプルでhackしやすいよ!
nginx-build
- bokkoさん
- mercariのひと
本題
Go製のnginxビルドツール
nginxのビルドするのがつかれたので、作った
nginxのビルドは、現実的にはいろいろなものをダウンロードしてきたりしないといけない
- configure optionsを大量に追加しないといけない
しかもそのビルドスクリプトをメンテしないといけない
これらまとめて解決してくれる
使い方
- binary を持ってきて、mkdir work -> nginx-build -d work みたいにする
- 3rd partyモジュールを、iniファイルに指定しておくと、まとめてダウンロードしてくれる
なんでGoで?
Terraformで始めるGo言語
- @tkak
- 楽天の人
楽天のInfrastracture as Code
- サービスいっぱい = サーバの種類が多い
- 最下部のインフラ層に向いてそうなterraformがリリースされたので使ってみた
Terraform
- オーケストレーションツール
- Go製
- 様々なクラウドサービスをコードで管理
TerraformとGo
- Terraform Plugin開発
v2.0からフレームワーク機能をサポート
やりやすいから、このへんから始めてみては。
Goでビルドパイプラインツールを書いた話
ainoyaさん
walter
- CIでのビルドパイプラインを実現する
なんでGo?
- ジョブの実行をgoroutineで
- データの受け渡しをするのにchannel
- このへんが扱いやすそうだったので
その他Tips
プロジェクト構成について
- coreos/etcd を参考にした
- テスト、ビルドはshell
package管理
- submoduleでやってたけど辛かった
- Godep
ログ出力
- どこも軒並み自前で用意してた
- golang/glogを利用
Goの所感
- Object指向的な書き方をしてしまって、ぎこちない感じになった
- channelをつかってみた、厳しくなったらsync.Mutex
go/parser go/astの話
- http://yuroyoro.net/gocon_2014_autumn_lt/#/
yuroyoroさん
GoのASTをビジュアライズするツールを作った
- ASTって何が嬉しいっけ
- 静的解析
- Altjs
- golint
- GopherJS
I/Oに依存したテスト
I/Oに依存したテストをどうするか
- RubyだとStringIO
- Goでは、bytes.Buffer がある
bytes.Buffer
- []byteにいろいろメソッドが生えた感じ
io.ReadWriter
テストコードの実践
ポイント
- I/O依存部分を切り出す
インターフェースに依存して書く
ここまでー
Destributed system
- marioさん
- 分散システムの話
Consul
- 実装の例の話