2015-02-09: haproxy の優雅な再起動

tl;dr haproxy -sf による再起動では SO_REUSEPORT が使えないと瞬断が発生する。SO_REUSEPORT は Linux 3.9+ か、CentOS, RHEL 6 では最新のカーネルに上げると利用できる。


haproxy は自分自身の設定を reload するみたいな便利な機能はない。 そのかわりに、 -sf オプションへ既存の pid を渡して新しく起動してあげると、入れ替わってくれる機能がある。

なんだけど、なぜか手元の環境だと ECONNREFUSED とかが発生するタイミングがあったので調べた。環境によってはならないこともある。

まず、最近の Linux には SO_REUSEPORT がある。sockopt で SO_REUSEPORT をつけていると同じ port に対して複数の fd が bind する事が許容される (The SO_REUSEPORT socket option [LWN.net]) オプションで、haproxy は勝手に利用してくれる

haproxy は起動するとまず必要なポートの bind を試みる。SO_REUSEPORT が利用できない場合は初回の bind は成功しない。そのため、新 haproxy は SIGTTOU を旧 haproxy へ送信、tcp_pause_listener 関数を実行させる。一定時間ごとに bind を再試行し、成功したタイミングで SIGUSR1 を旧 haproxy へ送信する。

一方 SO_REUSEPORT が利用できる環境では、新 haproxy の初回 bind はあっさり成功する。そのまま旧 haproxy へは SIGUSR1 が送信される。これによってダウンタイム無しに haproxy の入れ替えが完了する。この場合 SIGTTOU は送信されない。

どちらの場合も既存のコネクションは触られないため維持される。SIGUSR1 を受け取った旧 haproxy は、既存のコネクションを全て処理した段階で終了する。

そして SO_REUSEPORT が利用できない場合、 SIGTTOU → bind (再試行) → SIGUSR1 の間に新規の接続に対する ECONNREFUSED が発生する模様。このへんの処理は src/haproxy.c:L1554-1577 にある。

実際、再現しない環境でも手で SO_REUSEPORT の利用箇所をコメントアウトしてビルドすると再現した。

対応としては、新しい Linux を使う (Linux 3.9 以降)。しかし実は SO_REUSEPORT は最近の RHEL 6 (CentOS 6 では 2.6.32-417.el6?) で手に入る最新のカーネルへバックポートされている模様。なので RHEL 6, CentOS 6 をご利用の方々もどうにかなる気はする。

もう一個としてはhaproxy を立ち上げる親プロセス側であらかじめ bind した fd を持っておき、それを haproxy に渡す方法。bind fd@30 とかすると haproxy 側から利用できる。

楽しくなってちゃんと真面目に書いた実装がこちら。いちおう、bind に失敗した時や haproxy -c に失敗した時は死なないようになってたりします。 https://github.com/sorah/sandbox/tree/master/ruby/haproxy-master


あとこれは未だに良く分かってないので TCP_LISTEN な fd に対する shutdown(2) の挙動・このコードの意味を教えてください。とりあえず accept(2) できなくなるというのは軽くカーネル読んで確認しました。

追記: @pandax381 さんが教えてくださいました!

(ただし Linux のばあい)

(記事タイトルの元ネタ: nginxの優雅な再起動 )

Published at 2015-02-09 23:59:58 +0900

2015-02-01: 私設インフラ業, ストライクウィッチーズ OVA 2

なんかいろいろやっていた。どようびは 23 時起床でどこかへ消えました。

私設インフラ業

  • zabbix の discovery をちゃんと書いたことがなかったので fluentd で書いてみた。めっちゃアイテムとトリガーが増えたけど… http://blog.sorah.jp/2015/02/01/monitoring-fluentd-with-zabbix
    • trigger の初回 OK (recover) メッセージなんとかならんのか、とずっと思っていたけど、Recovery message ON の状態で condition に "Trigger value = PROBLEM" 追加で回避できるらしい (情報ありがとうございます)。 http://twitter.com/qryuu/status/561788623754780672
  • fluentd を全ホストに導入した
    • 諸々のログ転送にちゃんとつかっていきたい (今のところ通知系と nginx ログくらいでしかつかってなかったので nginx ないホストとかには入っていなかった。)
    • 適当に他ホストでつかっていた puppet module 突っ込んで、設定ファイルを配置したら動いた。便利。過去のわたしはえらい。
  • fluentd の fluent-plugin-rewrite.gem を fluent-plugin-rewrite-tag-filter.gem にリプレースした。
    • fluent/* 配下にコードがあったから、というのが大きな理由
    • nginx のアクセスログを virtual host ごとにタグ分けるのにつかっている。
    • 今回の変更から、見知らぬホストは other とかいうタグをつけて一個にまとめた。なんかたまによくわからない host ヘッダつけてくる人がいるので…
    • ↑雑に sorah.jp とかのドメイン配下でやってたので sorah.jp 以下に適当なサブドメインつけてアクセスしてくるとやっぱり増えてしまうので、結局 LTSV で server_name:$server_name みたいなフィールドを増やして、それで分岐させるように変更した。
    • $server_name を log_format で見ると、server_name ディレクティブの第一引数になって便利。
  • glibc を上げたり…
    • なにが GHOST だ

fluentd の nginx まわりはいまのところこんな感じ。

<source>
  @id in:nginx
  type tail
  path /var/log/nginx/access.ltsv.log
  pos_file /var/log/fluentd/pos.nginx
  tag nginx.access
  format ltsv
  time_format %d/%b/%Y:%H:%M:%S %z
</source>

<match nginx.access>
  @id nginx.access:rewrite
  type rewrite_tag_filter
  rewriterule1 server_name ^((?:.+\.)?(?:sorah\.jp|sorah\.me|ajunk\.org|privs\.net|her)|localhost)$ nginx.access-sites.$1
  rewriterule2 server_name ^(.+)$ nginx.access-sites.other
</match>

<match nginx.access-sites.**>
  @id nginx.access-sites:copy
  type copy

  <store>
    @id nginx.access-sites:forest
    type forest
    subtype s3

    remove_prefix nginx.access-sites

    <template>
      @id nginx.access-sites:s3:__TAG__

      aws_key_id ...
      aws_sec_key ...
      s3_region ...
      s3_bucket ...

      path nginx/__TAG__/

      buffer_path /var/log/fluentd/s3.buffer.nginx.access-sites.__TAG__

      time_slice_format %Y%m%d
      time_slice_wait 10m
      utc
    </template>
  </store>

  # あとは file とか色々あるけど割愛
</match>

tmux の syncronize-panes にも限界があるなあという所で何か便利なソリューションを導入したい。Rundeck とかかなぁ。

次は nginx の discovery を書きたい。サイトあたりの rps とか response code 状況を勝手にグラフつくって出してほしいんだよなあ。

ストライクウィッチーズ Operation Victory Arrow Vol.2 エーゲ海の女神

vol. 1 に引き続き ('14/09/21) 見てきた。起床時間 (土曜 23 時) 的に、日曜夕方くらいには寝るつもりだったんだけど日曜夕方の枠でいくことになった

  • こんなパンツおおかったですっけ
  • 「このキャラ見たことない…」「小説版に出てきた気がする」「なるほどな〜〜」
  • フランチェスカの CV 斎藤千和だったのか。
  • シャーリーかっこういい。
  • 良い話だった。

角川シネマ新宿、前回もここでみたんだけど今回はめっちゃスクリーンちいさいし座席も少ないなぁと思ったらおおきい方の部屋ではラ! の SSA LV やってたみたい。どうでもいいけれど、ラ! のライブ一度くらいはいってみたい気がする (また揉めてて大変そう)

帰りはなぜか「Java は Vim でかくの辛い気がするけれど Go はメンタリティ java なのに vim-gocode とか godef のおかげでなんとか vim でもやっていけてすごい、というか無いとつらいんだけれど。型付きのエディタサポート最高〜」みたいな話をした。「なんで型がない Ruby のコードメンテできてるんですかねえ」「Ruby は 1 class 1 file の文化あるけど Go は 1 interface の関係物が複数ファイルに跨っていたりファイル命名規則が特になかったり、あとは異常に変数名省略してるからでは」などなど。

Published at 2015-02-01 23:59:59 +0900

2015-01-20: gocode とか整備していた, k8s に pull request を投げた

gocode を godeps とか gondler とかそういうツールと仲良くさせる

GoogleCloudPlatform/kubernetes で gocode がうまく動かなくてあれ〜ってなったので tips を書いた。

kubernetes に pull request を投げた

一週間ちょいくらい前に投げた issue へのパッチをいい加減に書いた。images GC を止めるための手段を用意した。 地味に開発環境用意するのが一番面倒だった。hack/* 系スクリプトの使い方覚えたりとか、あとはコード読んだりだとか… godep と gocode は便利だな。

GHE 2.1.0

Announcing GitHub Enterprise 2.1.0

モニタリングツールずっとまってた。

Published at 2015-01-20 23:59:59 +0900

2015-01-17: StarryDream* #stdr に行ってきた, Star!! の CD 予約した, SideM 特番, MBA11" (Late 2010) に Gentoo を入れる

休日だ。

StarryDream* に行ってきた

StarryDream* に行ってきた。ゲストに AJURIKA とちょこたんがいるというのに惹かれた。

「また声優かよ」とおもうじゃないですか、誤解しないでください、AJURIKA の方が目的としては大きくて、ちょこたんとかは見れたらいいな〜程度に思っていたんだけど、普通に最前近くにいる事ができてみれた。oath sign カバーめっちゃよかったし、かわいかったですね。

リアニの時も同様に最前にいたんだけど、すみぺが出てきた時の物理的圧迫による厳しさが印象に強くのこっていて不安だったけど全然平和な現場だった。

AJURIKA さんの時間は例によって最高だった。それとその前の薔薇さんの時間は懐かしさが多くてよかった。あの曲に PPPH を入れることになるとは〜系の出来事。曲きいたことあるレベルのも当然多かったしセトリがみたい気がする。あとは hirotch さんがシンデレラガールズ以外の曲を多くかけているの初めてみました。

どうでもいいけど stdr がスタドリにしか読めない。運営のみなさまがたお疲れさまでした、楽しかったです。

Star!! の CD を予約した

THE IDOLM@STER CINDERELLA GIRLS ANIMATION PROJECT 01 Star!!【初回限定盤CD+Blu-ray】
CINDERELLA PROJECT
日本コロムビア (2015-02-18)
売り上げランキング: 6

デレマス (アニメ) の OP であるところの Star!! を予約してきた。ただしイベントがある関係でまずは Tower Record で 2 枚予約。4k かぁ

明日かどこかで秋葉原でアニメイトでも予約する。横浜厳しい気がするけど。ついでに歌姫爆宴いきたいんだけど、今日の疲れもあるしスルーかなぁ…

(完全に 2 月に払うつもりでいたけど今月払う事になるとは思わなんだ… :money_with_wings:)

THE IDOLM@STER SideM ニコ生特番

寺島さんが場なれしているというのもあるけど、すごい楽しい特番だった気がする。Jupiter のキャスト方仲良すぎ… あとガミPが「346プロとか315プロとか3被り勘弁してくれ」とか言いだして面白かった。

新キャストも決まったみたいだし今後これも普通にコンテンツとしてどんどん強くなっていくんだろうなぁ。まれいたそ弟であるところの内田雄馬 さんが決定していて、姉弟でアイマスキャストすごいみたいな感じ。新キャストのみなさん、場なれしてない感じがすごい出ててかなり好感。たのしみ。

CD シリーズがどうやらはじまるっぽいし、価格感的には今の THE@TER HARMONY シリーズと同じ感じになるんだろうか。SideM 用の財布が必要になる予感がする。

MacBook Air 11" (Late 2010) に Gentoo を入れる

11" のマシン軽くてよいんだけど手元にあるのは Core 2 Duo で OS X そろそろ限界なので Gentoo を入れてみる事にした。今回は UEFI + systemd に挑戦。

  • インストールは systemrescuecd の USB stick から EFI で起動できるのでそれでやった。
    • WPA2 の Wi-Fi ネットワークへの接続は nmcli dev wifi connect <SSID> password <KEY> で出来た。
  • カーネルオプションは make localyesconfig をベースに iptables 周り全部有効、docker で要求されるやつ全部有効, Mac 向けにいくつかいれた。なんか覚えてないので後で忘備録もかねて .config 上げるか。
  • ブートローダは GRUB2. EFI よくわからない上に Mac っていう特殊ハードだし、Arch の wiki にも gentoo の wiki にも書いてあるが分かりにくくて緊張感たかかった。
    • 結論としては sda1 (disk0s1) を /boot/efi にマウントして grub2-install --target=x86_64-efi /dev/sda を実行、OS X のリカバリで起動して Terminal から sudo mkdir /Volumes/efi && sudo mount -t msdos /dev/disk0s1 /Volumes/efi した上で sudo bless --folder /Volumes/efi/EFI/gentoo --file /Volumes/efi/EFI/gentoo/grubx64.efi で大丈夫だった。
  • systemd のブート爆速すぎる...

まだ X とかは入れてない。どうせサーバーじゃないからサービスレベルは大したことないので、実験場代わりにこいつの構成管理から Itamae でも使ってみるかな。徐々に puppet から itamae によせたい。

ruboty-songinfo, ruboty-irc

ruboty-irc リリースした。なんか既存のがあったけど微妙なところがおおいし inactive なようだったし gem push されてなかったので適当に書き直してしまった。

あとは ruboty-songinfo を書いた。未 gem push。なんか適当なサイトから曲のメタ情報を引っぱってきてくれる handler。現状歌詞タイムのみ対応。作曲・作詞が誰か引くのに便利になった。

Published at 2015-01-17 23:59:59 +0900

2015-01-13: いちがつじゅうさんにち: GHEv2 の話, Jenkins の groovy script console 便利

GitHub Enterprise v2 の話

http://techlife.cookpad.com/entry/20150113/104500/ghe-v2

社の技術ブログに、いままでオフィスのしょぼいマシンで稼動していた GitHub Enterprise v11.10.xxx シリーズの installation を AWS 上に新規構築した GitHub Enterprise v2 へ移行した話を書いた。

はてブおもったより稼いでるけどみんな GHE の運用にそんな興味あるのかな…?

Jenkins の groovy script console が便利

Java 上のメソッドだいたい叩けるからドキュメントみながら適当にいじっていた。ラベルの整理とか (利用しなくなったラベルを全台から剥奪したり、ラベル状況みたり)、スクリプト一括置換とか。スクリプトに関しては run_ci.sh みたいなのをリポジトリにコミットしてる例もあるから完璧とはいかないけど。

// show node and labels
Jenkins.instance.computers.each() { cmp ->
  // assignedLabels
  println("${cmp.node.displayName}: ${cmp.node.labelString}”)
}
// replace labels in jobs
Jenkins.instance.items.each { job ->
  if ( ! job.assignedLabel ) return

  newLabelExpr = Label.parseExpression(job.assignedLabel.expression.replaceAll(‘foo’,’bar’))
  job.assignedLabel = newLabelExpr
  job.save()
  println("${job.displayName}: ${job.assignedLabel}")
}
// Replace build scripts
Jenkins.instance.items.each { job ->
  println("${job.displayName}:")
  list = job.buildersList
  builder = list.get(tasks.Shell) 
  if ( builder && (builder.contents =~ /FOO/) ) {
    println("match.”)

    newBuilder = new tasks.Shell(builder.contents.replaceAll(/FOO/, ‘BAR’))
    list.replace(newBuilder)
    job.save()
  }
  println("-")
}
// Grep label expression in all jobs
Jenkins.instance.items.each { job ->
  if ( ! job.assignedLabel ) return
  if ( ! (job.assignedLabel.expression =~ /java/) ) return

  println("${job.displayName}: ${job.assignedLabel}")
}

// remove specific label from all nodes.
labelToRemove = 'java'

labelAtomToRemove = new labels.LabelAtom(labelToRemove)

Jenkins.instance.computers.each() { cmp ->
  if ( ! cmp.node.assignedLabels.contains(labelAtomToRemove) ) return

  cmp.node.labelString = cmp.node.labelString.replaceAll("(^|\\s+)${labelToRemove}(\\s+|\$)",' ').replace(/^\s+/,'').replace(/\s+$/,'')

  println("${cmp.node.displayName}: ${cmp.node.labelString}")
}

Jenkins.instance.save()
Published at 2015-01-13 23:59:59 +0900

2015-01-13: 忘備録: Samba 4 AD ドメインコントローラ構築

Windows を再セットアップがてらそういえば LDAP 的な物に触ってみてもいいかもしれないと思って Samba 4 AD DC をセットアップしたので忘備録。ふつうの LDAP とはこれはこれでちょっと違うので難しいところがある。

そしてわりと面倒だった。Puppet manifest に落とすのが割とだるい気がしている。

... Continue Reading...
Published at 2015-01-13 02:46:22 +0900

2015-01-10: k8s 0.8.0, 2015 新春アニメ, デレマス アニメ#1

止まっちゃってたけど日記再開したい。ぼちぼち。

kubernetes 0.8.0

なんか出てたので試した。kube-proxy の iptables の扱いが変わってたり (chain が 2 つになった) した。例によって ebuild は sorah-overlay にあるので気になる人はお試しあれ。

後は skydns を使って services の portal IP を引く DNS サービス が入ったりしていた。まだ addons で自動設定とかされる訳じゃないみたいだけど。とりあえず起動してみて、内部 DNS にだけ portal_net への route を設定して stub-zone してみた。

ついでに kube-proxy へのアクセスをローカルネットワークとコンテナに絞る tip をブログに書いた。kube-proxy の listen するポートは把握できないし、DNAT か REDIRECT で destination IP は書き変わるしでちょっと面倒だった。結局 portal_net の宛先で mark つけてやるみたいな方法で解決。しかし kube-proxy への routing、一極集中する訳にもいかないから面倒くさいんだよなあ... 必要なマシンにだけ個別に設定して周る方向でとりあえずはどうにかする。

アニメ

  • アイドルマスターシンデレラガールズ: 後述
  • SHIROBAKO #13: 第2クール。ミニファンブックの通り企画段階の話をするっぽい。みゃーもりデスクがんばってほしい。
  • 冴えない彼女の育てかた #0: まだなんとも…
  • 幸腹グラフィティ #1: 飯テロ。おいしい物って不健康だよねえ。自炊頑張りたくなる…
  • 神様はじめました◎ #1: やっぱり神様はじめましては良いなあ。かわいいし格好いいしなあ。
  • ユリ熊嵐 #1: ナニコレ…ガウガウ。#3 くらいまではとりあえず見たいかも。
  • 艦隊これくしょん-艦これ- #1: キャラが多すぎて覚えられる気がしない。まあこれきっとデレマスでもそう思ってる人は一杯いるんだろうな。大井さんと北上さん差して「二人でいる時は声かけない方がいいっぽい」って言及してるのがおもしろかったです。
  • 暗殺教室 #1: OP が激しく動くやつだ… 渚くん(かわいい)の CV はまいまいなんだなー。フジテレビだけどノイタミナじゃない枠。久々?
  • デュラララ!!×2 承 #1: デュラララ!! 1期の内容も原作の内容ももうほとんど覚えてない。まあ見る。なんか携帯周りの描写が半年しか経ってないはずなのに…まあいいや。あとなんで深雪さん でてきてるんだ…痛車として。
  • アルドノア・ゼロ #13: 相変わらず俺TUEEEを感じる。
  • DOG DAYS″ #1: あの落下の仕方でよく無事でいられましたね…
  • アブソリュート・デュオ #1: まだよくわからない…

アニメ アイドルマスターシンデレラガールズ #1

涙腺やられるかなぁと思ってたけどその場ではやられずに、あとでじわじわきて涙目になる程度くらいだった。アニメ化発表の時は PV みながら涙腺をやられていました (日記 4/5)。しかし発表からあっというまに放送開始だなー。8ヶ月ほどって短い。

あのスタッフからくる安心感はあったけど、実際すごい描写細かいし、例によって 876 + 新幹少女から 765, Jupiter までカバーしていろいろ出してきたところは素晴らしいなあって。シンデレラプロジェクト外のアイドルとはどれくらい絡みがあるのかなぁ (それなりにあってほしい)。小日向ちゃん可愛かったね。 一話はしまむらさんがただ前向きで眩しいのと、うづりん回だった気がする。ぶい! 凛ちゃんもかわいいよ。

2 話も楽しみですね。

(そういえば作画ミスでままゆの服が消えている件、コラかと思ったら本当だった…。あと、NOMAKE の配信元が Akamai + Amazon S3 だった。デレマスでも AWS 使いはじめたんだなあ。)

Published at 2015-01-10 23:59:59 +0900

2014-09-21: RubyKaigi 2014 #rubykaigi

P9203808.jpg

RubyKaigi 2014 に参加して、話したりなどしてきた。

写真: RubyKaigi 2014 #rubykaigi - an album on Flickr

写真や各セッションのこまかいのは下記へ。

... Continue Reading...
Published at 2014-09-21 23:59:30 +0900

2014-08-29: YAPC::Asia 2014 1日目 #yapcasia

(前夜祭は0日目とのことでタイトルを修正しました http://twitter.com/tagomoris/status/506500379782037504 )

YAPC::Asia 2014 行ってきた。

インフラエンジニア(狭義)は死んだ

http://yapcasia.org/2014/talk/show/df196eac-fb65-11e3-b7e8-e4a96aeab6a4

さいしょは @studio3104 さんのトーク。すごい部屋の広さ以上に人がはいってきてstudioさんすげーとおもったけど、後になってそもそも全体的に席が足りてないという事をしった。

エモかった。コードを書こうという思いがつたわってきました。

完成されたシステムなどない。完成された人間もいない。あるのは成長し続ける未完成なシステムと、それを支える未完成な人間だけだ

http://yapcasia.org/2014/talk/show/4c7651e8-ed53-11e3-9faf-6ba36aeab6a4

@kenjiskywalker おじさんの LT。これは…

午前中はエモいのだけ見て終わってしまった。アブストラクト…

YAPC::Asia2014会場ネットワークのツクリカタ

http://yapcasia.org/2014/talk/show/d1f29686-edeb-11e3-b7e8-e4a96aeab6a4

CONBUチーム の人の。今回のネットワーク全部 VPN を通して外に出てるらしいときいてびっくりした。ネットワーク疎いけどちゃんとしたハードウェアだとそれでも普通に帯域稼げるんだなぁ。 あと、100Mbpsでたりないから10Gbpsって飛躍しすぎじゃあありませんかね…趣味なんだろうけど…

個人的にネットワークちょっとたのしそうだなってたまに思うけど、クラウドとかでわりとブラックボックス増えてきてもにょっとしている最近です。あでもオンプレはオンプレで厳しそうだから(略) (矛盾)

WHERE狙いのキー、ORDER BY狙いのキー

http://yapcasia.org/2014/talk/show/e495bc1a-f30d-11e3-b7e8-e4a96aeab6a4

MySQL のインデックスの話。めっちゃ参考になった。スライドみたほうがはやいと思うのでリンクをはります: http://www.slideshare.net/yoku0825/whereorder-by

馬鹿だからかわいいわけじゃなくて、かわいいイルカがたまたまバカだった

これ名言だと思ってる。

ウェッブエンジニアのローレベルプログラミング

@cho45 さんの。座席確保に失敗して床に座ってたけど、楽しかったのでよし。 どんどんレイヤがさがって物理に攻めてたのがおもしろかった。AVRマイコンでArduinoとかを通さず震えるマウスデバイスつくって、実際に刺してマウスポインタ震えさせてるあたりがでchoさんのテンションが最高になっていた気がする。

choさん、ブログとかどんどん低レベルになっていて見ていて楽しい。Bare Metal ras-pi とか、ARM アセンブリたのしそう。

まとめ

他にも motemen さんのやつ, hakobe さんのやつ, CLI ツールのやつ、あたりもみようとおもっていたけどマジで会場混みすぎていた + HUB にちょうどよく大御所が揃っていたので席取りがんばらないで諦めて hub で交流してた。あまりよくないと思うんだよなぁ。さすがにキャパシティプランニングまちがえているようには思えてしまった。 (こういう類で頑張るのはライブとかアニメ系のイベントで十分だよ!)

CLI ツールの、スライドはみたけど基本だけどだけど大事な事がかいてあったので便利開発ツールつくってるひとは見るといいかもしれない。 https://speakerdeck.com/tcnksm/komandorainturunituiteyu-rutokinipu-falseyu-rukoto-number-yapcasia

夜は懇親会には行かず社内のイベントに出るため抜けてしまった。その疲れもあってか2日目行こうとしたけど動けなかった… legacy の話 とかぜんぜん GitHub のやつって認識してなかったし、ちょっと後悔してる。くやしい。うずらさんのPHPのやつとかモリスさんのビッグなやつも…

Published at 2014-08-29 23:00:00 +0900

2014-07-24: しちがつにじゅうよっか

社内 systemd 勉強会があった。

無茶振りしてみたら @Yuryu さんが講師としてきてくださった。てきとうに CentOS 7 で遊びながら、systemd 便利〜とか yum history 便利〜とかやってた。ありがとうございました。

systemd、言われている程一見不便そうには見えない (むしろ supervisord とかを捨てられてスッキリしそう) んだけど、ログ管理が journalctl に一任されていて、永続化の実態はバイナリデータだったりするのがとっつきにくいのかもしれない。

でも基本的には便利ぽかった。実用段階はもうちょいかな…実運用してみないとなんとも言えないのかもしれないけど…

あと Gentoo で普通につかいたい気がするんだけどまだまだ OpenRC の方が良さそうでふむーんという感じ。ディストロ変えるのも億劫だしなぁ。


夜、雨ふってて雷もやばかったけど、雨上がった後そとがすごい霧かかってる感じだった。なんだこれは…

Published at 2014-07-24 23:00:00 +0900

2014-07-17: しちがつじゅうしちにち

あつい。

aws4_signer.gem

https://github.com/sorah/aws4_signer

aws-sdk-core-ruby とか aws-sdk とか使わないで S3 にリクエストを送りたいという需要があったので Authorization ヘッダ生成するシンプルなのをつくった。

ついでに minitest 5 をちょっと使ってみたけど、minitest-reporters っていう gem は必須な気がするなぁ。 全然情報が揃ってないのでただただ辛い。RSpec がこの先も独占しつづけるという状態より、RSpec 3 にみなさんが絶望して新しい流れ、っていうのはある程度健全だと思うけど、「コレダ!」っていう移民先がないのが微妙かなーって思っています。

RSpec 2.14.x を fork してメンテしつづけるのがいいんじゃないかとか思ったりはするけど、ちょっと自分からメンテする気はないですね。

ingress

恵比寿ガーデンプレイスがそこそこ密集していて AP 稼ぐのにちょうどよく、しかもそれなりの頻度で色が変わっているので最適だった。周辺の agent のかたがたにアイテムなどサポートしてもらいつつ、Agent Level 3 (A3) の半ばから、A5 まであと 10000 AP というところまですすめられた。

周囲ぐるっと Glyph Hack + Deploy + Link → 内側 Hack + Deploy → 内側に Link 形成して field 作り、という流れでやったけどだいたい 1 時間。終わってすぐに破壊活動が開始されていて、人間の暖かみを感じた。

YAPC::Asia Tokyo 2014 に行くことにした

トーク採択結果が発表されたりしてたので YAPC::Asia Tokyo 2014 に行くことにしました。

↑このアンケートに悩んだ。Web ってほど Web アプリ書いてないし、かといってインフラをがっつりやっているわけではないし。インフラ選んだけど…

Published at 2014-07-17 23:00:00 +0900

2014-07-04: ページャNight, BigQuery を試す(1)

ページャNight <[1]> にいってきた。uzulla さんの LT が良かった。 あまり調子が良くなかったのであまり覚えてないのが申し訳ない感じ。

a_matsuda さんのトーク、Rails 1.x 時代を振り返っていて面白かった。さすがに 1.x は知らなくて 2.x をちょっと触った事がある程度なんだよな。まともにつかい始めたのも Rails 3.0.0.beta1 からだし…

BigQuery をためす 1

Google BigQuery、個人で扱いやすいのではないかと調べはじめた。相変わらず Google の API ってめちゃくちゃ難解で、いやドキュメントちゃんと読み込めばいいんだけど、難しい。認証周りだけが突出して難解なんだけど…

BigQuery を触るための認証情報は Service Account ってやつで、Developer Console の Create new Client ID からつくればいい。

あとは p12 ファイルをもっておいて

Google::APIClient.new(
  application_name: APP_NAME,
  application_version: VERSION,
).tap do |client|
  key = Google::APIClient::KeyUtils.load_from_pkcs12(
    '/path/to/your.p12',
    YOUR_KEY_PASSPHRASE
  )

  client.authorization = Signet::OAuth2::Client.new(
    token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
    audience: 'https://accounts.google.com/o/oauth2/token',
    scope: 'https://www.googleapis.com/auth/bigquery',
    issuer: YOUR_SERVICE_EMAIL,
    signing_key: key,
  )

  client.authorization.fetch_access_token!
end

こんな感じで client を生成してつかえばいい。

aws-sdk-ruby, aws-sdk-core-ruby はパッケージに API 定義を含んで動的にどうこうしているけど、google-api-ruby-client は外から API 定義持ってくる。ただし、メソッドとかは生えなくて、APIClient#execute に API 名とかを渡す。 エラーとか例外にならなくてちょっと不便。

Published at 2014-07-04 23:00:00 +0900