2017-06-18: VPN 越しの Cisco WLC で WPA2 の SSID に associate できない時の罠

フレッツ光特有の話だと思うので日本語で書きます。

WLC において WPA2 などをかけた SSID に端末が association できず、WLC の syslog に下記のようなエラーが表示されて困る、という奴:

*Dot1x_NW_MsgTask_1: Jun 15 18:59:55.112: %DOT1X-3-PSK_CONFIG_ERR: 1x_ptsm.c:730 Client 08:de:ad:be:ef:00 may be using an incorrect PSK

tl;dr

これは下記の環境の場合、ESP パケット (IPsec の場合) の IPv6 DSCP 値の関係でフレッツ網に一部の CAPWAP パケットを落とされているのが原因であると見て良い気がします。

  • WLC がトンネルや VPN 越し
  • トンネルの経路にフレッツ IPv6 IPoE NGN が挟まっている

NGN に繋がっているインタフェースから送出される DSCP を全部 0x00 にセットしてしまいましょう。ひかり電話を使っているならもうちょい工夫は必要そう。

状況の詳細

実際の MacBook Pro ←→ Cisco Aironet との 802.1X 通信は下記のスクショの通り。Mac からの返答パケット Key (2 of 4) が届いておらず、Cisco から Key (1 of 4) が再送され続けていることがわかる。

実際の通信

VPN 対向ルータでキャプチャするとこうなる。

VPN対向ルータでのキャプチャ

一部の 802.11 フレームを含む CAPWAP パケットに DSCP 値が設定されていて、箱物ルータだと気を効かせて tunnel outer packet に DSCP 値が伝搬される事により、NGN の仕様に従い NTT 局側で drop されることでこうなっていると見られる。ちなみに何故か iPhone 7s は問題なく assoc ができた。

(手元側での CAPWAP パケットのキャプチャはあるけどもう残ってませんでした)

NGN の仕様

にある通り、

尚、各サービスにおいて許容されたプロトコルと転送優先度の組み合わせ以外のパケットに転送優先度を指定することは許容しません。

なので、DSCP 値をよく考えずに NGN 網に流すと黙って局側で drop される事が多いです。OpenSSH とかでも ssh_config, sshd_config で IPQoS オプションを指定しとかないとハマる、というのがありますね。

Published at 2017-06-18 23:36:38 +0900

2017-02-19: フレッツ光ネクスト (ひかり電話あり) 回線において、ひかり電話と自前の設備を IPoE IPv6 的な意味で仲良くさせる

tl;dr ひかり電話ルータ (HGW) のひかり電話だけを生かしながら DHCPv6-PD を自前設備で喋りたい場合、ひかり電話ルータ部の送受信するパケットのうち IPv6 パケットだけフィルタすれば良い。具体的には IPv4, PPPoE だけブリッジすれば良い。一切保証はしないけど…。

近年ではひかり電話はルータ・ONU機能と一体となったホームゲートウェイあるいは「ひかり電話ルータ」 (以下 HGW) から提供される。こちらとしては得体のしれない HGW は使用せず、直接フレッツ NGN 網と通信したい需要しかないので、どうにかする必要がある。

実際、HGW 内部で、ONU とルータ部自体は分離されており、ルータ部と ONU 部の接続を利用者側で奪う事ができる (小型 ONU 不採用 HGW の場合 UNI ポート)。なので、 ONU の接続されているフレッツ NGN に自前の設備を直接ぶら下げる運用は可能とされている。

が、この場合、ひかり電話を生かしたい時に若干面倒になる。HGW ルータ部は通常のルータ同様の挙動を取るため、L2 レベルで ONU の下、自前機器の真横に HGW ルータ部を接続した時に IPv6 について問題が発生する。

これはフレッツ光ネクストにおいて提供されている所謂 IPoE 方式の IPv6 接続性について、ひかり電話契約の有無によって挙動が異なるため。

ひかり電話契約が無い場合は NGN から Router Advertisement (prefix /64) が送出されて SLAAC で IPv6 アドレスを確定、フレッツ側ルータと端末毎に直接通信する形となる。日本の各種家庭用ルータに「IPv6 パススルー」機能がついているのはこのため。このオプションを使用すると L2 レベルで v6 パケットのみ上流 (WAN ポート) とブリッジ (あるいは NDP proxy?) され、無事 NGN 側のルータと直接通信する事ができるようになる。

一方、ひかり電話契約が有る場合、NGN からは Router Advertisement が降ってくるものの m-flag がついていて、DHCPv6-PD の利用が必要になる。現時点で /56 の prefix 委譲がなされ、DHCPv6-PD クライアントはルータとみなされ、委譲された prefix への経路はそのルータに向くようになる。そのため、自前の設備を利用したい場合、だいたいの場合はひかり電話契約を付けて /56 の prefix 委譲を受けたほうが圧倒的に便利。電話として使わなくてもひかり電話には絶対加入しましょう。

しかし今回の回線は諸処の事情により "ひかり電話" も電話としてちゃんと運用する必要があったので、ひかり電話を生かしながら DHCPv6-PD を自前の機器で受ける必要が出てきた。

前述のように HGW ルータ部は通常のルータと同様の挙動を取る。つまり、DHCPv6-PD クライアントとして機能してしまう -- ONU から L2 レベルで直下にいるルータが DHCPv6-PD を喋って prefix 委譲を受けても、HGW ルータ部の気分次第で HGW ルータ部に prefix 委譲が移動して、取り合いが発生してしまう。DHCPv6-PD クライアント機能は無効化できそうになくて不便。

というわけで、IPoE 方式で DHCPv6-PD を自前機器から喋りながら、ひかり電話を利用するための方法を探した。

前提

  • フレッツ光ネクスト ファミリー・ギガラインタイプ (栃木県宇都宮市)
    • 2017/01 オーダ、02/15 開通
  • ひかり電話ルータ PR-400MI
    • 小型ONU。
    • 直近の契約だと黙っていると小型 ONU 採用タイプが来るので、明示的に小型ONU不使用タイプの払出しを希望した

(小型 ONU 採用タイプでは NGN と直接通信するためには SFP 対応スイッチ・ルータが必要になる。さらに auto negotiation 対応が必須の模様で、安い SFP 対応スイッチは対応してない事もあるみたいなので消耗の対象です。)

調査

雑に HGW ルータ部のパケットを覗いて確認すると、

  • ひかり電話自体の通信は IPv4 のみ
  • NGN にいる設備と DHCPv4 で通信している
  • IPv4 で SIP の通信が発生している
  • PPPoE は確認できなかったけど発生する事もある模様? [要出典]

という状態だった。

実装

IPv6 パケットだけフィルタしてみる。NGN と DHCPv4 通信が必要っぽいので一旦 NGN 直下に収容。DHCP relay でもうまく動くのかもと今は思うけど、試してない。

  • HGW の ONU 部 UNI ポートと、ルータ側 UTP ケーブルを取り外す。UNI ポートには自前のスイッチを接続し、ルータ側の UTP ケーブルは RJ-45 中継アダプタを通して別のスイッチあるいは VLAN へ接続する。
  • ONU 部とルータ部を L2 ブリッジして IPv6 のパケットだけフィルタする。
    • 当初は ebtables でも使うかと思っていたけど、通信速度いらないし IX2015 で十分だと気付いたので、HGW 収容・NGN 収容の 2 VLAN を用意して IX2015 でブリッジ設定をした。
bridge irb enable
no bridge 1 bridge ipv6

! Fa0/0 untagged (NGN)
interface FastEthernet0/0.0
  no ip address
  bridge-group 1
  no shutdown
! Fa0/1 tagged dot1q id=3 (HGW)
interface FastEthernet0/1.3
  encapsulation dot1q 3 tpid 8100
  auto-connect
  no ip address
  bridge-group 1
  no shutdown

結果

ひかり電話は上手く動いた。ファームウェア自動取得とかは死んでるのでそこは諦める方向で。

ついでに HGW ルータ側についている LAN スイッチから自前設備への接続を増やしておくとリモートからメンテできたり SIP 接続できて便利だよ。

再起動時、DHCPv6-PD をある程度の時間待つらしく、起動までの時間がやたらかかる様になってしまったのと、起動後も DHCPv6-PD をすごい頑張っていて可哀想な HGW ルータ部を眺める事ができます。

繰り返すけど一切保証しません。ある日とつぜん動かなくなったら困るなあ、とおもいながら設定しました。

その他

Published at 2017-02-19 06:36:16 +0900

2016-10-14: systemd-nspawn で portage の binary package (binpkg) ビルドをいい感じにする

この記事は KMC アドベントカレンダー 2016 の 12 日目です。前日は spi8823 の「Unityでパーティクルをドット絵風にするShader」 でした。
… 2 日遅れです。完全に登録してた事わすれとった。すいませんでした。休暇でシドニー放浪してました。

みなさんは Portage もとい Gentoo 使ってますか? 選択肢がたくさんあり、最新のパッケージがわりとすぐ降ってきて、その上何か足りないものがあっても ebuild 書いて転がしとくだけで気楽にインストールできるの便利ですよね。

わたしはサーバーで Gentoo を使うようになってからかれこれ 4〜5 年ほど経過しています。ただ、まあ、問題となるのは emerge にかかる時間と CPU リソースですよね。VPS の上での emerge -uDNav @world は割と億劫だしつらいものになる。

今年の初めくらいからゆっくりとご家庭インフラの式年遷宮を進めるなかで、運用を見直してちゃんとうどん回せるようにしよう、と Binary package 導入をしてみたのでそのはなしです。

binary package

Portage には binary package 機能 が存在します (以後 binpkg)。Gentoo Wiki にある通り、複数のシステムがあるなかで何度もビルドするのは無駄・ハードウェアのスペックの問題でビルドが困難、といった状況をサポートするためにあります。便利ですね。これを使わない手はない。

そして実際 AWS t2.micro インスタンスで手元の base cookbook を完走させるには swap が数 GB 必要…。さらに 2 時間くらいかかる。なので、何かテストするためにインスタンス立ち上げてセットアップしてもやってられるかって感じである (AMI を作れという話はあるけれど)。つらい。

(余談だけれど、 https://github.com/sorah/gentoo-build というのがあって、systemd based Gentoo box を作るためのシェルスクリプト集と、AMI 作成用の packer script があってめちゃくちゃ便利です。)

binpkg の作り方

いくつかあります: quickpkg コマンド、emerge --buildpkg オプション、または FEATURES=buildpkg

quickpkg はシステム上にインストールされたファイルをパッケージにしてくれます。この方法だと config を含めようともクリーンでない場合があるのでオススメできないとのこと (使ったことないから分からん)。

emergeFEATURES あるいは --buildpkg で渡した場合、ビルドディレクトリからパッケージ生成をするのである程度クリーンになります。

作例

これだけ。

sudo emerge --buildpkg dev-libs/boost

すると、 /usr/portage/packages/dev-libs/boost-1.56.0-r1.tbz2 とかが生成されます。メタデータである /usr/portage/packages/Packages には、

BUILD_TIME: 1480786879
CPV: dev-libs/boost-1.56.0-r1
DEFINED_PHASES: compile configure install preinst prepare setup test
DEPEND: virtual/libiconv[abi_x86_64(-)] app-arch/bzip2[abi_x86_64(-)] sys-libs/zlib[abi_x86_64(-)] !app-admin/eselect-boost =dev-util/boost-build-1.56*
EAPI: 5
IUSE: context debug doc icu +nls mpi python static-libs +threads tools python_targets_python2_7 python_targets_python3_4 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64
KEYWORDS: alpha amd64 arm ~arm64 hppa ia64 ~mips ppc ppc64 ~s390 ~sh sparc x86 ~ppc-aix ~amd64-fbsd ~x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x86-solaris ~x86-winnt
LICENSE: Boost-1.0
MD5: b3720e94e07a32c7c076cec4c1c0207c
PROVIDES: x86_64: libboost_atomic.so.1.56.0 libboost_chrono.so.1.56.0 libboost_container.so.1.56.0 libboost_date_time.so.1.56.0 libboost_filesystem.so.1.56.0 libboost_graph.so.1.56.0 libboost_iostreams.so.1.56.0 libboost_locale.so.1.56.0 libboost_log.so.1.56.0 libboost_log_setup.so.1.56.0 libboost_math_c99.so.1.56.0 libboost_math_c99f.so.1.56.0 libboost_math_c99l.so.1.56.0 libboost_math_tr1.so.1.56.0 libboost_math_tr1f.so.1.56.0 libboost_math_tr1l.so.1.56.0 libboost_prg_exec_monitor.so.1.56.0 libboost_program_options.so.1.56.0 libboost_random.so.1.56.0 libboost_regex.so.1.56.0 libboost_serialization.so.1.56.0 libboost_signals.so.1.56.0 libboost_system.so.1.56.0 libboost_thread.so.1.56.0 libboost_timer.so.1.56.0 libboost_unit_test_framework.so.1.56.0 libboost_wave.so.1.56.0 libboost_wserialization.so.1.56.0
RDEPEND: virtual/libiconv[abi_x86_64(-)] app-arch/bzip2[abi_x86_64(-)] sys-libs/zlib[abi_x86_64(-)] !app-admin/eselect-boost
REQUIRES: x86_64: ld-linux-x86-64.so.2 libbz2.so.1 libc.so.6 libgcc_s.so.1 libm.so.6 libpthread.so.0 librt.so.1 libstdc++.so.6 libz.so.1
RESTRICT: test
SHA1: bebdceba8188c82399a7d655d97315c79a2a0454
SIZE: 9514605
SLOT: 0/1.56.0
USE: abi_x86_64 amd64 elibc_glibc kernel_linux nls python_targets_python2_7 python_targets_python3_4 threads userland_GNU
MTIME: 1480786898
REPO: gentoo

のように記録される。

あとは /usr/portage/packages を http(s) で見えるところに置いて make.conf の PORTAGE_BINHOST に書いて FEATURES=getbinpkg を指定すれば、emerge 時に Packages ファイルをとりにいって binpkg が利用可能であればそれを利用するようになる。

These are the packages that would be merged, in order:

Calculating dependencies... done!
[binary  N     ] dev-libs/boost-1.56.0-r1:0/1.56.0::gentoo  USE="nls threads -context -debug -doc -icu -mpi -python -static-libs -tools" ABI_X86="(64) -32 (-x32)" PYTHON_TARGETS="python2_7 python3_4" 0 KiB

ちなみにわたしは S3 に置いてます。

binpkg の落とし穴

ビルド時の依存や USE フラグが異なると利用されません。

たとえば、 icu USE flag がオンになっていない binpkg がある状態で、USE=icu emerge -av dev-libs/boost とかするとこうなる。

Calculating dependencies... done!
[ebuild  N     ] dev-libs/icu-58.1-r1:0/58.1::gentoo  USE="-debug -doc -examples -static-libs" ABI_X86="(64) -32 (-x32)" 0 KiB
[ebuild  N     ] dev-libs/boost-1.56.0-r1:0/1.56.0::gentoo  USE="icu nls threads -context -debug -doc -mpi -python -static-libs -tools" ABI_X86="(64) -32 (-x32)" PYTHON_TARGETS="python2_7 python3_4" 0 KiB

Total: 2 packages (2 new), Size of downloads: 0 KiB

!!! The following binary packages have been ignored due to non matching USE:

    =dev-libs/boost-1.56.0-r1 -icu

NOTE: The --binpkg-respect-use=n option will prevent emerge
      from ignoring these binary packages if possible.
      Using --binpkg-respect-use=y will silence this warning.

--binpkg-respect-use=n--binpkg-changed-deps=n を指定すれば存在する binpkg を常に利用しようとするけれど、USEフラグは反映されることはない。依存はABI差で苦しんだり可能性があるってくらいかな。オススメはしない。

なお、複数の USE フラグのコンビネーションが想定される場合は FEATURES=binpkg-multi-instance を有効にすると良い。 (make.conf(5) を参照)
最新 1 binpkg だけでなく、同じバージョンに対するビルドが複数保持されるようになります。そのかわりクリーニングは自分でやらなくちゃいけない、という感じ。

binpkg を便利に運用する

binpkg はうまく運用すれば便利ですが、実際の運用はどうするのが良いでしょう? というのがこのポストの本題です。

需要

  1. emerge -uDNav @world をばしばし実行したいので binpkg 最新のがいろいろ常にあってほしい
  2. 依存が変わった・更新されたら binpkg 更新されてほしい

前者に関しては binpkg 実行するホスト用意して定期的に叩けば良い。
後者が問題で、そもそもサーバーやマシンによっては不要なパッケージハあるし、システムにインストールするのは微妙。 --buildpkgonly でも結局 build dependencies は必要になってしまうのでこれもだめ。

そこで systemd-nspawn を使う

systemd-nspawn とは

systemd-nspawn は systemd が提供している、Linux の namespace を活用したコンテナを実行するためのツールです。シンプルでたいへん便利。init プロセスを実行させ、さらに個別の IP を持たせて実際の仮想マシンの用に使えるコンテナを作る事もできれば、単純に chroot では実現できないので namespace を使ってコマンドを実行したい、といういろんな需要に対応できます。

ArchWiki の systemd-nspawn 記事も参考にすると分かりやすいと思う。

これをいい感じに使うと binpkg 運用に便利ができそうです。自力で chroot するより楽なのもあるし。

やってみる (emerge -uDNv world)

./base に stage3 を展開した物、 ./etc-portage/etc/portage 相当の物がある事が前提にしています (/etc/portage と読み替えても良いが、コピーを推奨。理由は後述)

まずは emerge -uDNav @world の場合。

sudo systemd-nspawn \
  --register=no \
  --bind=/usr/portage:/usr/portage \
  --bind-ro=$(pwd)/etc-portage:/etc/portage \
  --directory=./base \
  emerge --buildpkg -uDNv @world

--bind, --bind-ro は Docker でいう -v で、ホストシステムのディレクトリをコンテナ内でマウントできる。
/usr/portage はバイナリパッケージが置かれるのと、そもそも repo もホストシステムのを使えば良いので書き込み可能で --bind している。 /etc/portage は書き込み不要なので --bind-ro 、という具合。

これで ./base の上にある Gentoo システムを更新しつつ binpkg のビルドもされます。まずはこれを定期実行する事で上記需要の (1) は達成できます。既存のシステムと隔離されていることから、cron (あるいは systemd.timer) で実行する事もできるはず。

やってみる (個別にインストール)

./etc-portage/make.conf に適切な PORTAGE_BINHOSTFEATURES=getbinpkg などを設定した上で、単純に下記のように実行すれば OK。

sudo systemd-nspawn \
  --register=no \
  --bind=/usr/portage:/usr/portage \
  --bind-ro=$(pwd)/etc-portage:/etc/portage \
  --directory=./base \
  --ephemeral \
  emerge --buildpkg -v dev-libs/boost

--directory に実際にファイルの変更を反映させない状態でコンテナを起動できる --ephemeral を指定するのが良いです。これでまずビルド用の rootfs は綺麗に保たれます (なお ./base の親ディレクトリは btrfs である必要があります)。

また、ビルド環境の make.confFEATURES=getbinpkg を指定しておく事で、既にある binpkg が利用可能であればそれが利用されるし、なければ更新が走るという挙動になります (依存含めて)。これで (2) もおおむね達成できる。

ビルド環境の /etc/portage の管理

正直ここはまだ固まっていません。少なくとも、

  • USE フラグ (package.use) は依存含めて揃えておく必要がある
  • package.mask, package.unmask, package.accept_keywords も揃えておいた方が良い、あるいはインストール時に個別に指定しておく

というのが必要です。

つまり、想定しうる全部の package.use 等に書かれる指定をビルド環境の /etc/portage には含めておく必要がある。
全システムで一緒ならそれを使い回せばいいですが、実際場合によって USE フラグが異なる事もしばしばあるでしょう。たとえば net-analyzer/zabbix では agent, server, proxy といった具合に、役割毎に必要となるフラグが違います。

わたしは /etc/portage 以下の変更を itamae と sorah/itamae-plugin-resource-portage で書き換えています。itamae レシピを解析をするのはややしんどそうなので、今のところは全サーバーから package.use などを集めてきて手で整理してます。

(
  for x in rin udzuki mio; do
    ssh -T "${x}" 'sh -c "cat /etc/portage/package.use/*"'
  done
) | sort --key 1 | uniq > /tmp/package.use
vim /tmp/package.use
cp /tmp/package.use ./etc-portage/package.use/hoge

なお先に例に上げた net-analyzer/zabbix を USE=server としているサーバーはまだ式年遷宮されてない…。やるとしたら --ephemeral で実行しつつ emerge 実行前に設定を変更するしかない。

こういうケースを含め、自動実行を踏まえて通知がいい感じに欲しいとか、いろいろ欲求がでてきているので、なんか便利なラッパーツールでも書くかぁ、という気持ちになっています。

まとめ

わたしの運用は現状こんな感じになってます。みなさんも Gentoo でたのしくインフラ運用しましょう。

ツールたぶんそのうち作ります (いや、リポジトリはもうあるんだけどまだいい感じになってません)。

UPDATE (Feb 27, 2017): つくった sorah/binpkgbot

なお、このアドベントカレンダーの翌日担当は walkure の「ゼネコン辞めた話」 だそうです。

Published at 2016-10-14 23:59:59 +0900

2016-04-10: Windows Server 2012 R2 と strongSwan + Quagga で IPsec の Site-to-Site VPN 接続を張る

Remote Access 情報無さすぎてウケる。

さくらの VPS for Windows Server がどうやら無印な VPS とローカルネットワークが別物っぽくて、VPN 張らないと連携が取れないので必要に迫られた (バックエンドが Hyper-V ベースだったりするらしいからその関係なんだろうなあ)。

既に quagga の ospfd と strongSwan と VTI でいくつかのネットワークを結んでるので、まあそこにいい感じに乗っける。ハマりどころとしてはとにかくドキュメントが足りていない RRAS と仲良くすることと、RRAS が投げる IKEv2 Proposal の内容を把握すること。

実験は Windows Server 2012 R2 を AWS の t2.micro インスタンスでたててやりました。接続先はさくらの VPS。

... Continue Reading...
Published at 2016-04-10 08:43:20 +0900

2016-02-05: 19 になったので 2015 年まとめ

2/4 にとりあえずまた年を重ねてしまったのでとりあえず去年のまとめをします。干し芋とかは http://amzn.to/sora_h にあります。なんかくれるとよろこびます。

tl;dr

今年は大きなアウトプットがなかったのが悔しいところ。コードとしては残してないけど、成果としては ISUCON 5 準優勝がでかいんじゃなかろうか。あとは仕事が普通に忙しくなって家のマシン環境とかも崩壊しつつあるのが課題となっている気がする。

2016 年もまあ生きる事を抱負とします…。家が物理的にも論理的なのどうにかしたいとは思ってるんだけど。

エンジニア面

仕事

まあ Twitter や sorah.jp、社の開発者ブログにはちらっと書いていたけれど、2015 年 4 月を持って技術部開発基盤グループを離れ、インフラストラクチャー部に異動した。ボスが @mirakui になり、まあ仲良くやってます。

そもそも production を弄ることが増えていたり、仕事の内容がインフラ寄りになりつつあったところ機会が降ってきたというのが経緯。
仕事内容はもちろん production を見るのもそうだけど、今迄通り開発基盤としての仕事も割合が変わったと言え継続している。なので現在は「インフラストラクチャー部 開発基盤エンジニア」と名乗ってる。

まあ、仕事量が増えました。が、開発基盤グループにも @k0kubun とか優秀な人が増えたりしているので、予想よりは増えず 1.5 倍くらいといったところ。責務が増えたぶん、裁量も広がって動きやすいです。裁量があるとどう動いたもんかたまに停止することもあるけれど、去年の評価を見れば改善点はあるがうまく立ち回れている模様。

一方で、仕事が増えたこともあり日々の production および開発環境の構築・運用・改善業がメインになってしまっていた。

今年は何か大きな新しいプロダクトを完成させたい。去年からぼちぼち作ってはいるのだけど、完成させるには至らなかったのだった。

... Continue Reading...
Published at 2016-02-05 08:00:00 +0900

2015-09-28: ISUCON5 予選に参加した (白金動物園) #isucon

A photo posted by Shota Fukumori (@sora_h) on

ISUCON 5 予選に白金動物園として @mirakui, @rosylilly と参加してきました。結果は 15666 点で両日通したランキングの内 top 4 を除いて 5 位 で本戦にはなんとか出場できそうって所。

問題

高負荷に耐えられるSNSコミュニティサイトへようこそ!

まあそのうち公式で解説・講評あがってくると思うから詳しくは書かないけど、ISUxi という SNS Web アプリで、予選にしてはそこそこ MySQL のテーブル数が多くて複雑なもの。 (users, salts, profiles, entries, comments, footprints, relations)

ログイン・ログアウト・プロフィールページ・友達・日記 (友達限定公開あり) の個別ページ、ユーザー日記リスト・足あと、諸々の情報を全部見れる便利なトップページ、などなど。

個人的に問題を読んだ限り倒すべき鍵となりそうなポイントは is_friend?get_user あたり。初期実装ではどちらも愚直に SQL を叩いていて、どちらも N+1 問題らしい感じになっていた。

特にトップページがそれにより重いコードになってて、とりあえずそのへんを潰す事に集中してた。

なおチームの暗黙的了解としていざ仕事で書くとさすがにそれはみたいな感じの奴は避ける、ってのがあった気がする。具体的には過剰なオンメモリとかね。ただアプリケーション仕様を考えて妥当だな、という類のキャッシュはアリ。

やったこと

... Continue Reading...
Published at 2015-09-28 08:15:00 +0900

2015-07-06: #kosendj #kosenvj を支える技術 (バックエンド編)

2015-06-27 16.42.40

#kosenvj を支える技術(フロント編) のバックエンド編です。 高専DJ部 (kosendj-bu) 御用達の「GJ」とよばれる VJ もどきシステムのバックエンドについて説明したい。

GJ? VJ?

詳細は ↑ の @neo6120 が書いたエントリを見てほしいのだけど、簡単に言うとインターネットにありふれた gif を適当につかって VJ をしようみたいな試み。 ↓ の動画をみるとなんとなくわかるかも。

やばいかんじある #kosendj

A video posted by yuya fujiwara (@asonas) on

現場の様子です #kosendj

A video posted by yuya fujiwara (@asonas) on

... Continue Reading...
Published at 2015-07-06 08:11:29 +0900

2015-05-23: TrySail 1st live 2015 "Sail Out!!!"

(しまった写真的なのがない)

TrySail の記念すべきファーストライブ Sail Out!!! の昼・夜公演にいってきた。

座席は両方とも A ブロック。昼が 25 列の左方、夜は 15 列の真ん中。AA ブロックはつぶされているとかなんとかで、9 列目が最前…つまるところ 15 列はかなり良い席だった。最近運がよすぎて今年の後半がはやくも不安。

シングルはまだ Youthful Dreamer 1 枚しかだしてなくて持ち曲といえる持ち曲は 2 曲しかない状態、どうやって時間持たせるんだろう? とおもったら新曲を 3 つ投入・伊福部さん脚本の劇 30 分、という形で 2 時間 40 分くらい持たせてた。正直予想の斜め上をいっていた。後は例によってカバーコーナーね。もちょとナンスもソロでなんか曲持てるといいね。ソロデビューまだですか?

最高だったし 2nd ライブも絶対行こうな。

劇 (Yesterday Diver)

  • 夜は近かったのもあってまじまじといろんなところを見てた。表情とかがおもしろかった。やっぱりカメラにうつってないところまでしっかり見えるのは最高やな。
  • 放送部の豊崎愛生さん
  • 昼公演でロッカーを強く叩きすぎて「自分を大事にね」と天ちゃんから言われるナンス
    • 一瞬そういうネタなのかようわからなかったけど 2 回目でハプニングだったとわかった。ナンちゃん自分を大事にね
  • スタンガン演出 (1 回目) でもちょが倒れこむ時、昼公演ではちゃんと椅子に着地できたけど夜公演では失敗していた。つらそう…
    • 「威力…つよすぎたかな?」
  • もちょの「全然面白くない」を思い出しました (ミリオン 2nd)
  • 伏線回収よかった。

そのほか

時系列順じゃないです

  • もちょ「文字が飛んでいく〜」
  • もちょ「TrySailは、海!」ナンス「いま 2 つくらい飛ばした」
  • 天ちゃんとナンスの 2 人でのトークのときに天ちゃんが「ナンちゃん^^」って声かけてるのよかったです
  • ナンス「さっそきゅ」「これ一生言われるんだろうなぁ」
    • 「一生」という言葉の重み。ながく一緒に活動してほしいなぁ。
  • もちょ「からあげクン食べていい?っていったら良いって」
    • もちょ「みんな喋ってて〜」
    • 黙っておちついて食べてるときのもちょ可愛かったなあ
  • 水の取り違え
    • 昼公演ではもちょがずっとナンスの水を
    • 夜公演では途中ナンスがもちょの水を -ナンス 「もしそらくじけそうになっても私たちがいるから!」
    • 前回の公録の時の告白しあうのもそうだけど、こういうのよい。絆だ。
  • まさかのウィッチ☆アクティビティ - もちょソロコーナーからナンスが登場する…みたいな流れだけど呼ぶときの紹介が盛りすぎである
    • 真顔よかった
  • もちょ「不良だったっていうひとー!」「結構いるー(*゜0゜)」「だめだよー(。`・∀・´)つ」
  • ナンスのポニテ
    • もちょ「リハ中ずっと見れたの! いいだろー!」
Published at 2015-05-23 23:00:00 +0900

2015-05-11: GW を利用して家のネットワークを再構築した

GW を利用して家のネットワークを再構築した。

再構築前

  • VDSL modem
    • WG1800HP (PPPoE client, Wi-Fi AP, router)
      • (機器いくつか)
      • Netgear GS108
        • Thinkpad X60 (OpenVPN client, DHCP, DNS)
        • (機器いくつか)

クライアントが利用するサブネットとサーバー類が利用かつ VPN 越しにアクセスできるサブネットが同居していて、クライアント類はルーティングの都合上 VPN 接続先に出ていくときは NAPT されるみたいな構成になってた。同居してるのが一番気持ちわるかった…。あとは WG1800HP の IPv6 パススルーを有効化して上流からの ICMPv6 RA などを通してるんだけど、外部からの接続拒否がなかったりしてちょっと不安だな〜という状態にもなっていた。

それと IPv6 のために FiberAccess/NF 契約しつつ固定 IPv4 のために Livedoor プロバイダを契約してたので、クライアントとサーバーで出ていく IP も変えたりとかそういう遊びもしたいなあとか。

これをなんとかした。

再構築後

A photo posted by Shota Fukumori (@sora_h) on

  • VDSL modem
    • IX2015 (PPPoE client, router)
      • GS108Tv2
        • Thinkpad X60 (OpenVPN client, router, zabbix-proxy, DHCP, DNS)
        • (vlan 300)
          • WG1800HP (Wi-Fi AP, switch)
            • (機器いくつか)
        • (vlan 100)
          • GS108
            • (サーバー類いくつか)

IX2015 はちょっと前に買って転がっていたの、GS108Tv2 は wishlist で送られてきたのを…。ギガビットルータが良いけど結局上流は 100Mbps だし。家庭内のルーティングはまあ 500Mbps くらいになってしまうけど Thinkpad X60 にやらせている。インターネットへのパケットは X60 を通るけど、インターネットからのパケットは直接 IX2015 から流れていく。IX2015 は家庭内のセグメントのルーティングはさせないである。 (細かいアクセス制御を iptables でさせてるので設定の分散を防ぐため)

あと Livedoor プロバイダがサービス終了するらしいので So-net 固定 IP プランに入れ替えた。契約したはいいものの下りが遅くて困る…

IX2015 の設定はこんな感じ。 https://gist.github.com/sorah/c8f335169742472585f4 v6 は PPPoE とか通さなくて流れてくるので適当に VLAN な if に bridge しつつ bridge ipv6 filter で VLAN によっては外部接続拒否してる。

監視

IX2015 と GS108Tv2 は SNMP で監視できるので監視している (zabbix)。SNMP 難しいからようわからんなあと思いつつ network interfaces の監視とメトリック収集は有効にした。

その他

  • いろんな VLAN に顔を出している X60 は IPv6 autoconf 自分との衝突を検知して dadfailed になってしまうのがつらいので固定割り当てにした
    • これどうしようもないですか、というか netifrc で autoconf を無効化できればいいんだけど…。
  • 802.11q 解釈できる Wi-Fi AP が欲しい
  • これの他にもう一個 802.11q 解釈できるスイッチが眠っているけど、イベントとかでちょっと使う気がするので今回は組込まなかった。
  • ケーブリング上手になりたい…
  • OS X で 802.11q 使うのは Network.prefpane の Manage virtual interfaces から
    • 無効化は同じメニューの Make service inactive でできるので IP アドレスの設定とか保持したまま無効化したいときとかはそれで。
    • X11 要らなくなった Wireshark (OS X) 最高です
Published at 2015-05-11 04:23:25 +0900

2015-04-15: ドキュメントの件

http://yoshiori.hatenablog.com/entry/2015/04/14/171326

実際にちゃんと日程決めて 1 日なるべくドキュメンテーションする日にしようという事にしてやりました。
ターゲットは主に社内の各種サービス。内部 API とかライブラリとか、そういう類の。

「今日はみんなこれをやる」と決めると、やるかー、っていう気分になるじゃん。いろいろやらなきゃいけないタスクはあるけど、それは置いておいて みんなで やるという空気にするとわたしはやるかーってなる。一人でやるぞーってなるより、やるかー! ってなるんだよな。

どこをとりあえず見ればいいか分かりにくい、ドキュメントのある場所がまちまち、そもそもドキュメントがない! という状態を改善していく。具体的には

  • 置き場所がバラバラ
    • 基本的に、概要や運用寄りの情報は社内 Wiki に統一。みんなだいたい、まずここを検索するような習慣があるから
    • Pull Request して実装の変更とともにレビューできたほうがよい、API リファレンスとかは Git リポジトリに突っ込んで管理。GitHub Enterprise の web view を通して読む (Markdown)
  • どこを見ればいいのか分かりにくい
    • Wiki ページ先頭を見て概要と、Getting Started / Tutorial 的ページへのリンクを置いておく
      • Getting Started ページにもだらだらと書かない、細かい tips はリンクなどに留めて別のところに置いていてスッキリさせる
    • 加えてページを分割する、1 ページにだらだらと書かない
    • Tutorial も体裁を整えて見やすく
  • そもそもドキュメントがない
    • 概要しかない…
    • outdated がすぎる…
    • というわけで書く。

…とはいうもののまだ完璧になっている訳じゃないのでこれからも精進が必要だしわたしも自分の管轄するところで書かれていないドキュメントを書かなきゃならない…。

しかし社内ブログに載せられたやつも自分の口頭での発言がテキストに起こされていた…ってやつなんだけど、これはさすがに美化されすぎなきがする。こんな綺麗な口調で言った覚えはない…ないぞ…

あとはドキュメントを書く習慣を付ける、第三者から見てわかりやすいドキュメントを書くみたいなのはいまだに下手だなぁと思ってるので、なんか良い文献や方法などあったらおしえてくださいませ。

Published at 2015-04-15 01:49:12 +0900

2015-04-02: クックパッドに入って 3 年が経った

2012/4/2 にクックパッド株式会社に入社して 3 年が経過して、今日から 4 年目になった。

わたしはこの会社で中学卒業以降 3 年、つまり高校入学〜卒業くらいの時間を過ごしたことになる。この 3 年間実際ほとんど普通の高校生とかがするような勉強はほとんどできなかった。が、かわりに周囲の強いエンジニアにボコボコにされたおかげでなんとかエンジニアとして生きていけている。…いや、とりあえず数学とかに関してはちゃんとキャッチアップしないと死ぬとは思ってますよ。

そして去年、一昨年の日記あさったけど節目のまとめ書いてなかったんだなぁ、ということでここ数年の動きをまとめてみる。

1 年目 (2012) は前述のようにフルボッコにされていた年。うーん、主に負債返済業をしていた気がする。具体的に何やったとかはもうあまり覚えていないのだった。当時のコードを見ると結構笑える事がある。

2 年目 (2013) は転機があって正社員になり、いろいろやれる事が増えた結果、アップグレード業を自分主導で進めたりとか、開発・テスト系サーバー、GitHub Enterprise の運用改善などをやった。開発系サーバーについてはアラートとかそういうものが存在しなかったので、インフラ部で整備されつつあり自分も家でつかいつづあった Zabbix を利用して開発系サーバーもちゃんとアラートを上げられる環境を整えた。これらは今でも自分やチームメイトが運用している。ここで整備して運用をいろいろしっかりしたお陰なのか、ここ最近は開発系サーバーの運用で変な苦しみがなくなったと思ってる。割と放置してても元気に動いている。

あとこの年は外に出してない社内ツールつくりして、後は負債返済をしてたので比較的外に向けたアウトプットが少なかったなぁとおもう年。ここでつくった社内ツールは EC2 インスタンスをサクッと立ててアプリデプロイするだけでよしなに動く! みたいなものなんだけど、今は better な方法 (Vagrant とか Docker とか) があるので、もう御蔵入りだろうなぁ。

3 年目 (2014) はいろいろあって開発系以外のサーバーもちょくちょく手を入れるようになったし、インフラ部の面々とやり取りする事がぐっと増えた。主にいろんなサーバーの ops 業を日中にする傍ら、mamiya をつくって国内外 (RubyKaigi, RubyConf) でトークする、みたいな事をした。実際 mamiya は今でも cookpad.com で利用されていて、日々のデプロイを支えている。他のサービスにも拡張したいところなんだけど、改善点がいろいろ見えてるので時間を見つけて改善したい…(が取り組めてない。)

今年からは Microservices するぞ! という勢いが高まっているので、そのために必要になりそうなものを作る、という仕事をしている。またいろいろ外に出せる成果はある気がするのでどんどん外へ出していきたい。去年からは外に出せる成果が多かったので GitHub の commit streak もそれなりに長くなってるからこのまま維持できたらいいなぁとおもったりもしつつ。あとはここ最近負債を自分は返してないのでまた何かやってもいいのかもなあ。一時期負債しか返してない時期があってしばらくやりたくないみたいな気持ちはあるんだけど、他人に押し付けてばかりではいられないし。

今のポジションはインフラ寄りの事を触りながら、かつ新しいアーキテクチャを考えて作るという事もできていて、どっちも楽しく興味のある分野なので大変わたし得な状況。数年前より会社どんどん大きくなってるし何がおこるかわからないけど、たぶんもうすこし居れるなら居るんじゃないかなー。

あとは mamiya を作る過程や microservices について考える上で分散システムに関しての興味が強まっている気がするのでそのへんについても勉強してみたいと思ったりしている。

社歴 3 年とかになってくるとそろそろ社内的にも老な気がするけど老害にならないように頑張って新しい事やっていきたいなあ。しかしいわゆる同学年のひとたちはそろそろ B1 なわけで…。このままだとそろそろあちこちからまた殴り倒されてもおかしくないので精進しつづけなければならないなぁ、と感じる日々をおくってます。

それと 3 年経ってもいまだに苦手なのはタスクにかかりそうな時間の見積りと、あと自分の生産性の異常な低さ。これどうすればいいんだろう。とりあえずなんとか活躍している人材になれてるとは思いたいけど、強い自信はないんだよなぁ。

まあまぁ、とりあえずまた目の前の事倒して生きるのにがんばろう…。


追記: 進路に関する FAQ というのがあります。

Published at 2015-04-02 23:24:33 +0900

2015-02-15: 劇場版 "THE IDOLM@STER MOVIE 輝きの向こう側へ" 打ち上げパーティー

P2164880

横浜ブルク13 の LV…もといシアタービューイングで参加してきた。

  • 社長がジューシー言うとる…チアキングか
  • 私服みんなかわいいなあ
    • TrySail のみなさんやっぱり良いなあ。天ちゃんかっこういいきれいかわいい、ナンスは天使だしもちょはもちょだなあ。
    • 中村先生、Jawbone UP つけていたのが目につきました。
  • キャスト自己紹介
    • とちゅうからまったりしすぎて何人か自分の名前を言ってなかった
    • この件に関しては、もちょが一番深刻だった…(*゜0゜)
    • くぎゅ「酔ってもいいの?」ミンゴス「ご、ご用意しましょうか??」
  • 赤羽根P、拍手で迎えられ登場する中、いいとものようなやり方で拍手を止める (チャ・チャチャチャ)
  • アタック 765 問題がおもしろすぎる
    • 景品だいたい酒のつまみでは…
    • ミンゴス「もちょはまだ酒飲めないよね」もちょ「いやもうガンガンですよ!!!」
    • ガミP の好きなおにぎりの具とか知らんがな
    • 劇マスのバックダンサー挨拶シーン絵コンテでの星梨花の演技メモむずかしい… 正統派、正統派な。
    • 舞台挨拶の総移動距離…
    • ラムネ色 青春の振り付け由来
    • ↑これしかしミリオン組が正解して「ナンスとみっくが即答してて立派」とか天ちゃんがいっていたけれど、天ちゃんも若いでしょ…
    • 天ちゃん、ぴょんぴょん跳ねててかわいいなぁと思ってたけど危ない気がするなぁと思っていたらやっぱり危なかったらしい(スカート)。気をつけてね…
  • 祝電
    • 祝電とか聞くとデレパを想像するよね
    • 錦織監督「もうムックとかいろんなところで喋りきってしまった」 …ですよね
    • チアキング…
    • アッキー+あさぽん「二人合わせてアーツビジョンです」 何をいうのかとおもったらこれか…
    • 若林さんの映像はまぁ、予想はしてたけどなかった。ひろりん、最初に言葉を発したときそれに言及するのかとおもったらチアキングの件の謝罪をはじめておもしろかった。「うちのたかはしが」
    • (若林さん出産おめでとうございます!)
    • そのかわりに手紙が。中村先生、ゆまさんの方に駆け足で取りにいって奪って席にもどっていった。
  • 全国 13k 人の打ち上げ…
  • 女性キャスト陣お色直し中のスタッフトーク
    • アイマス、制作スタッフもとにかく近いのが良い、と思ってる。
    • いろいろ面白い話がきけた。楽曲系譜の話とか…
  • 朗読劇
    • 貴音さん、食事……
    • ガヤの最後で貴音さんの「お肉…」やばすぎる
    • ひびき「たかねはぜーんぜんミステリアスなんかじゃないぞ! 意外と泣き虫だし!」たかね「営業妨害ですよ^^」
    • デレる志保さん\かわいいよ/ …かわいい。
    • 百合子「伊織さんと志保のカップリングも良いんですけど………!」カップリングの話をしだしてどうなるかとおもった。公式からカップリング名をコールしろと言われるのはめちゃくちゃ面白い体験だ。\ちーはしほ/
  • 記録映像完全に涙腺を殺しにきた
    • 大きくなったなぁ。もうアニマスから少なくとも 3 年はたってるんだよな…
  • THE IDOLM@STER M@STER OF IDOL WORLD!! 2015, 07/18-19 西武ドーム
    • ドーム、ドームか
    • MAIN STAGE、ということは主役はそれだけど一応他に混ぜてきたりするのかな
    • 2 日目すごい濃そうだなぁ
    • チケット…
    • デレマス終了後でやばそう
    • さらに 7/19 がアケマス稼動 10th な日っぽくてやばそう
  • ハッピーバースデーゆきまこ (の中の人)
    • あずみん、ひろりん、誕生日おめでとうございます。
    • 錦織監督からの色紙かわいい。
    • あずみんが速攻でひろりんの方に近付いていったの良かった。というか雪歩の色紙より真の色紙を狙っていたような気がする(記憶が曖昧)
  • M@STERPIECE → 虹色ミラクル
    • ナンスがなんどかパーカーが肩からズレるのなおしててかわいい。
  • エンディング挨拶
    • 「バネPいいかんじにして」
    • ひろりん、メイク直しできる事を知ったのでこれからは泣くそうです
    • ゆいトンが先輩に勝負宣言してたの、良かった。がんばれミリオン
    • (↑個人的にはそろそろ先輩の事は言及しなくてもいいとおもうんだよネ)

打ち上げという場を用意するの、コミュニティ全体の空気として、2014 年がやっと締められたような感じがすごいあってよかった気がする。うまく表現できないけれど。あと、765 キャストのこの安定感はこれはこれですごい良いんだよなぁ。それと、ミリオンのキャスト陣はいろんな場所で活躍するようになっているし、去年の SSA や、ちょうど今頃やっていたミリオンチームの舞台挨拶の頃よりすごい成長しているように見えた。なんか、うれしいよね。

それと、わたしのなかではやっぱり「西武ドーム」と聞いた時に終着点なんじゃないかと不安になる気持ちは正直あった。その中、中村先生がちゃんと不安を解いてくれたのはよかったな。765 もまだ進むだろうし、デレマスとミリマスはまだまだこれから大きくなっていくだろうし。

これからもついていくしかない。今日も完全に心打たれてしまった… #ありがとうアイドルマスター

(まわりの感想を見ているとカメラにうつってないときのキャストの動作が見れなくて LV は悔しい思いをするな…)

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