アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

YAPC::Fukuoka に行ってきてベストLT賞を貰った!

こんにちは。 @codehex です。
6/30 に前夜祭、7/1 にカンファレンスに参加してきました。

前夜祭

前夜祭で grep.metacpan.org で typemap を検索するために使うといった話をしました。 LT の内容は、トップページの右下にファイルの拡張子を指定して絞り込み検索ができるのですが、そこに typemap を指定すると typemap 一覧が表示されますよ!といった感じでした。

そのあと

Text::CaboCha について skaji さんと話をしていたのですが、その中で Text::CaboCha に合せた encoding の正しい行い方を pod ドキュメントの synopsis などの部分に、利用者のために開発者が意図した動作を、詳しく書いてあげたほうがいいといった良い指摘を貰ったので後日直していこうと思います。

カンファレンス

聞きに行って良かったトークは 2 つありました。

プログラマ三大美徳をグラウド面に当てはめて考られた面白いトークでした。
僕も Perl をやり始めた頃にプログラマ三大美徳を知って、それの「怠惰」「傲慢」の部分をかなり意識して開発を行うようにしていたのですが、最近そういったこと忘れてたなと、考え直すことができた良い機会でした。

  • @moznion さんの「Web application good error messages and bad error messages」

Go 言語に触れていると、エラーメッセージを考えることが多く、最近では exitcode までを意識したパッケージを作るほどでした。

github.com

話の中で、「エラーを解消するために、どういったことをすべきか提案を出してくれるエラーは最高」といった話が出てました。それは git のエラーメッセージを例に挙げていたので、git のエラーを表示する思想はみんなも真似していくべきだなぁと感じました。

LTで賞を貰った

How to make Perl Mongers group といったタイトルで発表してベスト LT 賞を頂きました。
Okinawa.pm は世界一オーガナイザーが多いといったことを示すために、以下のワンライナーをスライドに仕込んで見せたのですが、反応がイマイチだったのが正直ショックでした…(完全に僕の話し方が悪かったので反省)

perl -MXML::Simple -E '%h=%{(%{XMLin("perl_mongers.xml")})[1]}, say+grep+keys%{$h{$_}{tsar}}>4,%h'

これは Okinawa.pm の Slack に参加してる皆さんが協力をしてくださってここまで短くなりました。Okinawa.pm の Slack に参加したい方はこちら から参加できるので、どしどし参加してください。

解説をすると、この perl_mongers.xml
wget https://github.com/perlorg/www.pm.org/raw/master/perl_mongers.xml でダウンロードしてきたファイルに対して実行しています。
このファイルは世界中の Perl コミュニティの情報が入っていて、上記のワンライナーではオーガナイザーの数が 5 人以上の Perl コミュニティを列挙していくといった動作をします。このスクリプトを整形するとこんな感じになります。

use XML::Simple;
use feature 'say';

my $xml = XMLin("perl_mongers.xml");
my %group = %{ $xml->{group} };

# %group はハッシュであり、配列として扱う場合
# キーが奇数番目、値が偶数番目の添字となる。
# $_ が %group のキーではなく値の時、keys( %{ $group{$_}{tsar} } ) > 4 は false になる。
my @mongers = grep { keys( %{ $group{$_}{tsar} } ) > 4 } %group;
say @mongers;

記号をふんだんに使っていると、Perl Monger はワクワクするのかな?と個人的に思ってました。

最終的に、コミュニティ運営は「きっかけ」で大きく傾くので、その「きっかけ」を手に入れるためにイベントを開催して行くことが大事だと思っているということを伝えました。その後に YAPC::Okinawa の宣伝を行いました。

会場は OIST (沖縄科学技術大学院大学)で行うんですが、どういった場所なのか気になる方はこちらから良い感じの写真を見ることができます。

感想

懇親会(ってかこれが本番)も沢山の Perl Hacker とか変わることができました。その中で @yappo さんから、餃子の王将を芝の上で食べたいなどの注文をもらったので実現できるように頑張ります。 YAPC::Fukuoka の運営に関わった皆さん、お疲れ様でした。学生交通費支援をしてくださったスポンサーの皆様、毎回感謝しています。

恩返しの意味を込めて次の沖縄頑張ります。

ハッカーズチャンプルー 2017 の合宿 + カンファレンスに参加してきた & ボランティアスタッフもやった!

凄く濃ゆい日々を久しぶりに過ごしたので、これは是非書こうと思いました。
ハッカーズチャンプルーは合宿 + カンファレンス構成となっており、合宿に関しては Okinawa.rb, IT カレッジ沖縄 がスポンサーとなってくれたおかげで、学生は合宿の宿泊代が無料といった形となっていました。そのため、今回は合宿 + カンファレンス参加、沖縄の IT コミュニティへの恩返しのつもりで、ボランティアスタッフとしても参加しました。

合宿

合宿は 3 泊 4 日でした。
場所は「かりゆしコンドミニアムリゾート北谷 マリーナベイ美浜」でした。コンドミニアムってなんだ!?ってなってて、別のコンドミニアムに着いたのは内緒

Day 1 Welcome Party 🎉

イベントページです。 hackers-champloo.doorkeeper.jp

沖縄 地ビール酒場~Beer Rize 北谷 というめっちゃくそオシャレな酒場でお酒を飲みながらワイワイ騒いでました。外人も結構多く、まさに沖縄のチャンプルー文化を味わえる場所でした。
この場で話したこととしては、Okinawa.pm を運営しているから、実は Go の人ではないですよ!といった自己紹介をきっかけに、Go の話を沢山してもらえました。 技術的な話では、Perl のウェブフレームワークの話や MVC に関する話をしました。
エモい方では、コミュニティを運営していくのって難しいよねっていう話で盛り上がったように感じました。
例えば、少数の人数(オーガナイザーやスタッフ)がメインでやっていたけど、みんな忙しくなってしまって、誰かに運営を変わってもらいたいとなった時に人を探すのが難しい、ならばコミュニティイベントに参加している人に頼んで貰えばいいのでは?といった声や、運営協力する立場と運営していくという立場では、かなりハードルが変わるよねーなどといった議論をしてました。

僕も何回かコミュニティなんて参加しなくてもいいだろうと思った時期もありましたが、参加することによって、いろんな人に出会えたり、自分の感覚では手に入れられなかった新しい知見を得ることができたりするので、コミュニティっていいなと今は凄く思っています。

Day 2 モノづくり

僕は研究室の Slack で動かすための bot を作っています。
普段はこんな感じに動いています。(以下 bot を「ちひろ」と呼びます) f:id:codehex:20170626153129p:plain

ですが、ちひろに @deeeetさんが書いたGolangでSlack Interactive Messageを使ったBotを書くを参考に Slack Interactive Message を使った参加可否メッセージを送る機能を搭載したくて頑張ってました。 完全に完成したわけではないですが、こんな感じで動きます。

f:id:codehex:20170626153355p:plain

常に@aokabin_さんと一緒に作業してました。@aokabin_さんは AWS を使った案件に着手していて、面白そうだと側から見ていたのですが全くわかりませんでした(AWS の知識が乏しいので…)

Day 3 isucon 練習

素敵なブログを見つけたので、こちらも是非

masa-world.hateblo.jp

こんな感じでやってました!

上のブログのように文系チームと勝負をして負けたので、精進していこうと思いました orz
行ったこととして、

  • データベースに突っ込まれている画像のバイナリデータを引っ張ってきて、ディレクトリに書き出す
  • js, css などといったファイルを nginx でキャッシュさせる
  • N + 1 をできる限り削る

といった感じです。

後から、まだチューニングできたかなと思ったところは

  • バイナリデータを抜かしたスキーマの変更
  • メモリをアロケートしないようにコードを修正する
  • DB のデータをオンメモリにする(1 万件しかないのでできたはず)

一番感じたのは isucon は準備していればスコアが上がるものなんだなと思ったので、そこを頑張っていきたいです。

Day 4 起きてカンファレンスへレッツゴー

今回僕はボランティアスタッフとして参加したので、駐車場誘導してました。
こんな感じの服がスタッフTシャツです。(めっちゃ沖縄!!)

全部の LT と トーク面白かったし、本当に最高でしたが、

個人的に @tenntenn さんの「Goにおける静的解析と製品開発への応用」が楽しみだったので、聞けて静的解析やっていきたいといった気持ちになれました!(帰ってコード書きたいくらいの気持ち) 次の日に Golang Okinawa でハンズオンも出来たのでかなりの Go の知見を得ることができました。

それと沖縄の ruby ハッカーペン さんの「javascript無しで無理やり作るリッチなWEBアプリ」を聞いてて、どうやったらそんな発想が生まれてくるのか気になって仕方ありませんでした。そんなスライドはこちらです。

カンファレンスの様子や合宿中につぶやいたまとめはこちらにあるので、宜しければどうぞ!

本当にペンさんの LT は毎回感動してるw

後夜祭

後夜祭はどんちゃん騒ぎしてましたw
Go の話したり、Perl の話をしたりと…

感想

去年のハッカーズチャンプルーでの開発合宿で pget を開発しました。 そのためがっつり合宿と言った感じでしたが、今年は沢山の人と出会い、もっと知見を貯めていくことが目標だったので、それは達成できたかなと思っています。

本当にめっちゃ楽しかったのと、来年もあれば行きたい気持ちしかありませんでした。

運営の皆さん、スタッフの皆さん本当にお疲れ様でした!

ubuntu に mongodb をインストールする

先日 ubuntu を 17.04 へアップデートしてしまい、インストールする時にしまったと思ったのですが、何も問題なかったので晒していきます。
インストールここの 16.04 の方を参考にした。理由は 17.04(zesty) 用のリポジトリを未だに提供してないからです。(もし 17.04 用のリポジトリが提供されたら、17.04 専用のリポジトリから使うようにしてください。)

sudo apt update && sudo apt install -y mongodb-org

のあとに sudo systemctl start mongod を行い、 mongo で起動する。

$ mongo
MongoDB shell version v3.4.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.3
Server has startup warnings:
2017-04-17T22:16:47.289+0900 I STORAGE  [initandlisten]
2017-04-17T22:16:47.289+0900 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-04-17T22:16:47.289+0900 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten]
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten]
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten]
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-04-17T22:16:48.496+0900 I CONTROL  [initandlisten]
>

こんな感じで warnings が発生します。
2 つ目以降の warnings を潰すだけでなぜか全ての warnings が消えたのでその方法を書きます。

WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.

これは以下のページを参考に行いました。

askubuntu.com

この後に sudo reboot を行うと warnings が 1 個減っています。

WARNING: Access control is not enabled for the database.

  • mkdir /etc/mongod
  • openssl rand -base64 741 > /etc/mongod/mongodb-keyfile
  • chmod 600 /etc/mongod/mongodb-keyfile
  • chown mongodb.mongodb /etc/mongod/mongodb-keyfile

これが完了したら vim /etc/mongod.conf 以下を追記します。

security:
  keyFile: /etc/mongod/mongodb-keyfile

これで sudo systemctl restart mongod

管理ユーザの作成

admin データベースにユーザを管理する権限を追加しておきましょう。 userpwd は各自修正してください。

> use admin
switched to db admin

> db.createUser({user:"YOURUSERNAME",pwd:"PASSWORD",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
    "user" : "YOURUSERNAME",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

そのあと

vim /etc/mongod.conf
security:
  keyFile: /etc/mongod/mongodb-keyfile
  authorization: enabled

へ変更しておきましょう。 詳しくは以下の記事を参考にするといいです。

qiita.com

後から助かる設定

Ubuntu Firewall を使用している場合、mongodb サーバーのためにポートを許可しておかなければいけません。

ufw allow 27017

また、ubuntu を起動した時に自動で mongodb を起動したいという場合は

sudo systemctl enable mongod

を行っておきましょう。

Mac で SSTP 方式の VPN に接続する

研究室で VPN Azure Cloud を扱うことになって Mac でどうやるんや!?と格闘していて、解決したのでメモ。
sstp-clientbrew 経由でインストールするという方法があったけど、使い方が載ってねぇということで、GUI 探したら iSSTP といういいアプリがあった。

www.axot.org

開発者は日本人っぽいです。
使い方はこのブログが分かりやすい。(めっちゃシンプルなので見ないでもよさそう)

yesppp.me

そして実装に swift が使われてるっぽいです。

IPアドレスとサブネットマスクの考え方

久しぶりに考える機会を得たのでメモ。
@aokabin_ さんに教えてもらいました。

ネットワークアドレス 133.13.50.110 を与えられていて、サブネットマスク 255.255.255.0 を与えられている時、で降るとゲートウェイはどれくらいの範囲を割り当てられているかという考え方ですが、

255.255.255.0 を 32 bit の 2 進数へ修正すると 11111111 11111111 11111111 00000000 となる。この時下位 8 bit は 0 なので 255 - 0 = 255 なので 133.13.50.0 ~ 133.13.50.255 まで得ることが可能。

サブネットマスク 255.255.192.0 を与えられている時、同様に 2 進数へ変換すると
11111111 11111111 11000000 00000000 となる。この時 9 bit ~ 16 bit は 192 なので 255 - 192 = 63 そしてこの時下位 8 bit は 0 なので 255 - 0 = 255。つまり 133.13.0.0 ~ 133.13.63.255 まで得ることができる。

goveralls で カレントディレクトリのみ coverage を出したい

goveralls ってこれ。 github.com

よく travis-ci で goveralls を使って coverage を出すようにしてますが、今回プロジェクトディレクトリ内に example ディレクトリを入れてて、いつも通り goveralls を実行すると example ディレクトリ内まで見てしまい coverage を出すことができない問題がありました。
そのプロジェクトがこれ。 github.com

このプロジェクトの詳細は後日書きますが、goveralls の問題は以下に実行するようにすれば解決できました。
goveralls -package "."

最終的な .travis.yml はこんな感じになりました。

language: go
sudo: false
go:
  - 1.7
  - 1.7.5
  - 1.8
  - tip
script:
  - make test
after_script:
  - go get github.com/mattn/goveralls
  - goveralls -package "." -service=travis-ci