2017/10/23

CentOS7 で VLAN を設定する

オンプレサーバ + VLAN で区切られた network を想定します。
オンプレサーバで VM を提供する場合、1つの NIC が複数の VLAN に足が生えてる状態する必要があります。
その設定をした時のログ。


環境

  • OS: CentOS Linux release 7.2.1511 (Core)
  • Kernel: 3.10.0-327.10.1.el7.x86_64


VLAN に足が生える想定の Interface (Bridge)を作る

VLAN 1つに対して1つの Bridge を作成します。
例えば VLAN 111 に足を生やすとしたら

などを /etc/sysconfig/network-scripts/ifcfg-br111 として作成します。
brctl とかで状態を見られたりしますね。


VLAN を指定して、実 Interface から Bridge する

VLAN に足を生やす元の Interface は bond0 としましょう。
先程作った br に対して実際の Interface の VLAN=yes 版をブリッジします。

とかを /etc/sysconfig/network-scripts/ifcfg-bond0.111 に書きます。
これで br111 は VLAN 111 に通信できます。
こちら側のファイルも VLAN ごとに設定を作成する必要がありますね。

  • # systemctl restart network
してきちんと network が上がってきて通信できるか確認しましょう。
複数の VLAN が1ポート内で入り混ざることを、スイッチ側にも設定しないといけない気もしますが、そこは私がやらなかったので割愛。


参考





CentOS7 で複数の NIC を束ねて bonding する

オンプレのサーバだと複数の NIC を積んでいることがあります。
それらの NIC を束ねて帯域幅を増やしたり、NIC を冗長化するなど活用法は多々あります。
今回は束ねて帯域幅を増やす設定のログを残しておきます。


環境

  • OS: CentOS Linux release 7.2.1511 (Core)
  • Kernel: 3.10.0-327.10.1.el7.x86_64
  • NIC: ifcfg-(p2p1|p2p2|p3p1|p3p2) として認識している


束ねる集約先になる、仮想の Interface を作る

まずは集約先の Interface を作ります。

とかを /etc/sysconfig/network-scripts/ifcfg-bond0 に作成。
mode=4 だと LACP で束ねてくれます。


物理NIC の Interface で集約先を指定

物理NIC の Interface で集約先を指定。
とかを /etc/sysconfig/network-scripts/ifcfg-p2p1 に作成。
具体的には Master に bond0 を指定して、SLAVE=yes にします。
これを ifcfg-(p2p1|p2p2|p3p1|p3p2) 全てに適用してみます。そうすると4本を1つに束ねられる。
最後は、設定をファイルに書き込んだ後に
  • # systemctl restart network
で適用。これできちんと network が上がってきたらOK。
単純に考えると帯域幅が4倍になってるはずです。

参考

2017/10/17

問答無用でテキストファイルの文字コードを UTF-8 にする

この記事 を見ていて文字化けとかつらいよなー、と思うなど。
私だったら nkf を CLI で使うかな、と思ったのでそれを書いておこうかなと思います。


コマンド

UTF-8 + 改行コードを unix にする、だと
  • $ nkf -wLu --override **/*.html
とか。 glob が長いと怒られるのなら
  • $ find -name '*.html' | xargs -L1 nkf -wLu --override
とか。 git 管理下にあるのなら
  • $ git ls-files | xargs -L1 nkf -wLu --override
とかでも良いでしょう。

meta タグの置換はとりあえず単に Shift_JIS を UTF-8 にするだけでいけると仮定。
それなら
  • $ sed -i -e 's/Shift_JIS/UTF-8/'
でいけます。 確か -i オプションは GNU 版の sed にしかなかったはず。
meta タグを検出する必要があったら正規表現を複雑にする必要がありますね。


おまけ

このファイルの文字コード何だ? となったら
  • $ nkf -g file.txt
で分かります。


環境

  • OS: macOS Sierra 10.12.6
  • nkf: Network Kanji Filter Version 2.1.4 (2015-12-12) 
  • sed: gsed (GNU sed) 4.4

2017/10/13

VALU で貰ったビットコインを換金する

VALU にアカウントを作っていたのですが、私のVALUを買ってくれる人がいました。
もちろん VALU でのやりとりは bitcoin 。
とりあえず遊びで仮想通貨に触れてみるのも良いかなと思って換金してみました。


ビットコイン購入/販売所 のアカウントを作る

まずは貰った bitcoin の送り先を確保します。
銀行に口座を作るみたいな感じですね。
とりあえず国内取引量最大らしい bitFlyer にアカウントを作る。


ビットコインアドレスを確認する

次に送信先のアドレスを確認します。
口座番号みたいなものですね。
bitFlyer だと
  • 設定 > bitFlyer アカウントご登録内容
にあります。
例えば「3K61u2B3k5bGmwCyDSMKyL8uF5xi7z863D」といった3から始まる長い文字列です。


VALU から bitFlyer に送金する

VALU で貰った bitcoin を確認したアドレス宛に送信します。
  • メニュー > 口座の管理 > 送金
で先程確認したアドレスを指定して、送金する bitcoin の数を決めます。
手数料で 0.0005 bitcoin ほど VALU に取られるので注意。
手数料は 2017/10/13 の時点だと300円ちょっとくらい? ですね。


bitFlyer で着金していることを確認する

bitcoin の送金には時間がかかります。
私の場合だと1時間くらいかかりました。
あとは bitFlyer で日本円に換金して終わりです。やったね。


最後に

このような手順で VALU でもらった bitcoin を日本円に換金できます。
また、もしこの記事に価値を感じた方は「3K61u2B3k5bGmwCyDSMKyL8uF5xi7z863D」に bitcoin を送ってくれると幸いです。

2017/10/12

systemd 制御下のプロセスの SEGV を追う

systemd で起動したプロセスがいつの間にか死んでる。
systemctl status を確認すると SEGV している。SEGV ......
SEGV の原因を追うために systemd 管理下のプロセスで core を取る方法とかのログ。
ちなみにそのプロセスは FreeRADIUS ですね。


コアを dump するように

  • $ vim /etc/security/limits.d/core.conf
  • $ vim /etc/sysctl.d/core.conf

コアを取るように設定。
  • $ reboot
したら設定の適用完了。


動作確認

きちんと取れるか、死んでたプロセスに

    • $ kill -11 <pid>
    とかしたら core が取れるか確認できます。


    その後

    取れたコアを使って gdb で原因を追っていく。
    その際に bt などが使えないのがつらいので
    • $ yum --enablerepo='*debug*' install /usr/lib/debug/.build-id/9c/hogehogefugafuga

    とかしておく。
    こうすると freeradius-debuginfo が入って bt とかを見られるようになる。
    とかとかしながらデバッグして原因を突き止めたのがこの記事です。


    環境

    • OS: CentOS Linux release 7.4.1708 (Core) 
    • kernel: 3.10.0-693.2.2.el7.x86_64
    • systemd: 219 +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
    • FreeRADIUS: 3.0.4

    Amazon Mastercard ゴールドを無料で再発行してもらった

    東京に引っ越してから Amazon を使う機会が増えたので Amazon Mastercard ゴールド を作りました。
    プライムユーザが Amazon で買い物をすると 2.5% ポイントとして還元してくれる。
    普通に使っても 1% 還元なのでその辺のポイントカードを持ち歩くよりは楽。

    という感じでクレカライフを楽しんでいたのですが、財布を洗濯するという悲劇が発生。
    結果クレカは無惨にも曲がってしまい、どう見ても使えない状態に。
    サポートデスクに電話したら「ゴールドカードの会員様は無料で新しいカードを発行させて頂きます」と。
    紛失した訳ではないので、番号とかもそのまま、カードを再発行してもらえました。

    手厚いサポートという感じだ。こういう面も含めて便利で良い。

    zmv を使ってまとめてファイルを rename する

    zsh には zmv という機能があって、glob で指定した部分を置換できます。
    例えば *.jpg というファイル群をまとめて *.jpeg に変換できます。

    仮に以下のようなファイル群があったとして

    • ls

    bar.jpg foo.jpg fuga.jpg hoge.jpg piyo.jpg
    • zmv -w  '*.jpg' '*.jpeg'
    すると以下のようになります。
    • ls
    bar.jpeg foo.jpeg fuga.jpeg hoge.jpeg piyo.jpeg
    便利。zmv を使うには .zshrc に
    autoload -Uz zmv
    と書く必要があります。

    ちなみに dry-run option も存在していて、 -n で dry-run ができます。
    • zmv -n -w  '*.jpg' '$1.jpeg'
    mv -- bar.jpg bar.jpeg
    mv -- foo.jpg foo.jpeg
    mv -- fuga.jpg fuga.jpeg
    mv -- hoge.jpg hoge.jpeg
    mv -- piyo.jpg piyo.jpeg

    以上、ちょっとした小技 zmv でした。-w とか -W は help を読んでみてね。
    man zshall とかを読んでも良いかも。


    環境

    • zsh: 5.4.2 (x86_64-apple-darwin16.7.0)

    CentOS7 で GFS2 を構築/本番運用したノウハウまとめ

    GFS2 を構築したり運用した時のノウハウを共有。
    どちらかと言うと「こういう事もあったなー」的なエピソードのまとめです。


    systemctl restart network はしてはいけない

    死にます。
    単一ノードの reboot は問題無くできます。
    といって network の restart はノードが fence されてしまってクラスタから切り離されます。
    クラスタから切り離されるのはまだ良い方で、最悪 HACluster 全体を巻き込んで死にます。
    具体的には gfs2 を mount しているディレクトリに ls したら永遠に返ってこない。
    全体を reboot で復活します。
    network の configuration を変える時は pcs stop --all とかしてくださいね。


    fsck.gfs2 は(直る時もある|直らない時もある)

    死んだ時にはファイルが壊れたりするのですが、場合によれば fsck.gfs2 で直ります。
    ただし、直らない時もあります。具体的には24時間以上かかっても終わらない。
    gfs2 のサイズを大きく(テラオーダー)作ったのが原因かもしれませんが、直らない時は直らないです。
    gfs2 を作った後に小さくすることはできませんが、大きくすることはできるます。
    なので、最初は小さいサイズから作るのが良さそうです。


    CPU/Network の利用率が100%になると fence される

    各ノードの死活管理には fence というものを使います。
    初期設定だと Network の利用率が100% になった時、ノードがクラスタから外されます。
    あとは CPU の使用率が高すぎる時とか。
    VMイメージのバックアップを取るためにノードが死んだりしました。
    まー1ノードくらい落ちても動くための HACluster だから良いのかもしれないけれど。


    umount までできるスクリプトを組んでおく + PowerChute との連携はしっかり

    当然ですが、gfs2 上にあるファイルに読み書きしている時には umount できません。
    例えば VM を gfs2 に置いてると、destroy する必要があります。
    停電した際に電源が UPS に切り替わった時、 umount できないと焦ります。
    スクリプトとかを書いておいて、よしなにしてくれるようにした方が良いでしょう。
    出来れば pcs で管理して、gfs2 を止める時に kvm で動いている VM を全て destroy した方が良いです。
    あとは停電対策として PowerChute とかとも連携すると良いですね。


    scsi-shooter は暇なノードに置いておくと良い

    fence を行なうノードはクラスタに1つで良いです。
    なので、全ノードが fence 用のプロセスを起動している訳ではない。
    死活監視のプロセスなので忙しいノードよりは暇なノードに置いた方が良いことが多いです(さっきの100%問題とか)。


    公式ドキュメントを読もう

    というかgfs2の参考文献とかだと公式ドキュメントしかなかったりします。
    設定から何から書かれているので読みましょう。


    環境

    • OS: CentOS Linux release 7.2.1511 (Core) 
    • Kernel: 3.10.0-327.10.1.el7.x86_64
    • pcs: 0.9.143


    参考

    2017/10/10

    Docker でデータの保存先をデフォルトの場所から変更する

    Docker は CentOS7 だと image などを /var/lib/docker 以下に保存します。
    しかし、その場所を使わずに他の場所へと変更することも可能です。
    例えば、SSD のドライブに置くようにしたらイメージの読み書きが早くなるでしょう。
    データの場所を変更するには /etc/sysconfig/docker を編集して -g オプションを追加します。
    具体的にはこんな感じ。

    これで

    • # systemctl restart docker
    すると、 -g で指定したディレクトリにデータが保存されるようになります。やったね。


    環境

    • OS: CentOS Linux release 7.2.1511 (Core)
    • Kernel: 3.10.0-327.10.1.el7.x86_64
    • Docker: version 1.12.6, build c4618fb/1.12.6


    参考

    2017/10/09

    virsh vol-create-from を使って異なる storage pool 間でイメージをコピーする

    libvirt はVMイメージの置き場として Storage Pool というものを提供しています。
    Storage Pool は libvirt が操作可能な記憶領域です。
    例えば、 Akatsuki による VM 貸し出しのフローは

    • テンプレート用のVMイメージをテンプレートのストレージプールから読み取る
    • 貸し出し用ストレージプールにテンプレートのVMイメージをコピー
    • 貸し出しインスタンスとしてコピーされたものを起動する
    といった形式になっています。



    状況

    • ストレージプール a と b がある
    • ストレージプール a に hoge.img がある
    • hoge.img をストレージプール b に fuga.img として複製したい


    状況を再現するコマンド

    とりあえず前提条件のストレージプール a と b を作ります。
    今回のストレージプールはディレクトリタイプ。
    他にも特定のデバイスをプールにするタイプなどいろいろあります。
    • # virsh pool-define-as a dir - - - - /path/to/a
    • # virsh pool-build a
    • # virsh pool-start a
    • # virsh pool-autostart a
    • # virsh pool-define-as b dir - - - - /path/to/b
    • # virsh pool-build b
    • # virsh pool-start b
    • # virsh pool-autostart b
    これで2つのストレージプールができました。

    そして a に hoge.img を作ります。
    • # virsh vol-create-as  --pool a hoge.img 10G
    イメージができました。vol-list で確認します。

    この hoge.img を b にコピーしたい。

    やり方はいくつかありますが、今回は vol-create-from を使う方針でいきます。
    その場合は xml が必要なので dumpxml で作っておきます。
    • # virsh vol-dumpxml  --pool a hoge.img > fuga.xml
    fuga.xml  の key や path を hoge の情報から、所望の情報に変更しましょう。
    今回は /path/to/b/fuga.img になるように書き換えます。

    そして vol-create-from でコピー。
    • # virsh vol-create-from --inputpool a --vol hoge.img --pool b  --file fuga.xml 
    再度 vol-list で確認します。

    fuga.img が作成できていることが分かります。やったね。


    環境

    • OS: CentOS Linux release 7.4.1708 (Core)
    • Kernel: 3.10.0-693.2.2.el7.x86_64
    • virsh: 3.2.0


    参考

    TimeMachine の Local Backup を無効にする

    作業中に df したら謎のボリュームが増えている。
    どうやら TimeMachine の Local Backup というやつらしい
    MBP の中に Backup 用のデータを溜めておいて、 TimeMachine の Disk 無しで復元などができるらしい。
    私の Backup の運用としては邪魔なので無効化。
    SSD の容量持ってかれるのは嫌なので。

    • $ sudo tmutil disablelocal
    これで消える。


    参考


    2017/10/07

    Akatsuki を OSS 化した

    Akatsuki を OSS 化して GitHub で公開しました



    Akatsuki とは琉球大学情報工学科のシステムです。具体的には
    • 学生のIP申請
      • 対応するドメインを内向き DNS へと登録
      • その IP を DHCP で配れるように
    • 学生のVM新規作成/起動
    • 学生のパスワード変更
      • unix login
      • 802.11X で無線に繋ぐ際の RADIUS を提供
    といったことができます。


    つまり今まで記事で部分部分を解説していたものの本体です。
    関連している記事は以下。


    公開にあたって

    もちろん大学の内部情報をそのまま GitHub に投げるわけにはいきません。
    なので、こいつは OSS 化用にいじってあります。
    具体的には漏れたらまずい情報を消してあります。
    あとライセンスは MIT だし気にせず自分でいじって公開していく。

    その手順として
    • $ git rm very-important-information
      • で公開してはいけない情報を消して
    • $ git commit
      • コミットします。
    • $ git rebase -i --root
      • その後に rebase します。
      • 全部 fixup して一つのコミットにまとめてしまいます
      • fixup しないと復元ができてしまうので、消しても意味がない。
      • ということで、逆に言えばこの手順を踏めばアカンやつを隠蔽できます。


    まとめ

    所謂実績の一つとして見てもらえると良いかなー、と思って OSS 化しました。
    ということで、大学生/大学院生時代にしていた仕事の1つが OSS になりました。

    2017/10/06

    Heroku の Hobby プランの PostgreSQL が一杯になったので Standard にアップグレードした

    Rails を使った Web application を heroku の hobby プラン(無料枠) で運用中、DBへの書き込みができなくなる。

    • $ heroku logs

    を漁ると

    ActiveRecord::StatementInvalid (PG::InsufficientPrivilege: ERROR:  permission denied

    とある。何事だろう。
    調べたら、レコードが多すぎる時に発生するらしい。

    • $ heroku pg:info

    すると無料枠の 10k レコードを越えていました。
    というかぴったり 10k 制限じゃないんだ。優しさなのかなんなのか。

    参照した記事の場合、レコードを消して対応していました。
    私の場合、レコードを消すわけにはいかないので、 hobby からの upgrade をすることにしました。


    コマンド

    正直なことを言えば公式のドキュメントが最強です。
    指示通りでそのまま問題なくアップグレードできます。
    なので、コメント付きで公式ドキュメントをなぞるくらいの気持ちでログを残します。
    • $ heroku maintenance:on
      • Application を止めます。メンテナンスモードですね。
      • おお、これは所謂「停止メンテ」だ。何が起こるか分からないのが良いですね。
    • $ heroku addons:create heroku-postgresql:standard-0
      • DB を新規に作成。プランは standard にしました。
    • $ heroku pg:wait
      • 新規作成したDBを使えるようにします。
    • $ heroku pg:info
      • を見ると DB が増えています。
    • $ heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_BLACK_URL
      • 古いDBから新しいDBにコピー。
      • DATABASE_URL は置換するとかではなく、この文字列で正しい。
      • なので postgresql-lively-12345 とかに書き換える必要は無いです。
      • 公式ドキュメントだと PINK とかだったかな。どうやらネーミングは色らしい。
    • $ heroku pg:promote HEROKU_POSTGRESQL_BLACK_URL
      • 新しい standard の方をメインのDBにセットします
      • これで DB の移行は終わり
    • $ heroku maintenance:off
      • メンテナンスモード終了
      • これで DB がアップグレードされた状態で Web Application が上がります。
    流石 PaaS 。サクサクメンテができるのでインフラに手間がかからない。
    ということで淡々とアップグレードができたのでした。ぱちぱち。



    参考

    2017/10/03

    私がフリーランスになってから行なった手続き

    さて、私は 2017/08/10 からフリーランスのエンジニアになった訳ですが、その際の手続きを残していこうと思います。
    これはフリーランスになりたい人向けの先人のログです。
    もちろん当時の状況を反映したものなので、貴方がフリーランスになる時は話が違うかもしれませんが、それは御愛嬌。


    はじめに

    まずフリーランスという単語ですが、特定の組織に所属しないという意味だそうです。
    なので法的には個人事業主という立場になる場合が多いと思います。


    個人事業主になるには

    税務署に開業届を提出します。
    開業freeeなどを使うと質問に答えるだけで開業届を作成してくれます。便利。
    これを所轄の税務署に提出すればあなたも個人事業主。
    ただし、今まで会社が行なってきた税金や保険や年金の支払いを自分で行う必要があります。


    確定申告と会計ソフト

    まずは税金について。個人事業主になると確定申告が必要になります。

    確定申告は、収入や経費などを計算して所得税を計算し、それを収めることらしいです。
    確定申告には白色申告と青色申告があって、青色の方が複雑な分65万円分の控除が受けられるようです。
    また、青色申告をしますよ、という事前届けが必要。
    ちなみに開業freeeでは青色申告の申請書類も作ってくれるので便利。
    青色申告をするためには開業後から一定期間内に提出する必要があったはずです。
    私は開業届と一緒に提出したので気にしていない。
    なので青色申告の申請書類も税務署に申告ですね。

    流石に自分で帳簿をつけたくないので会計ソフトを使うことにしました。
    使うのは freee 。開業freee でお世話になりましたからね。


    健康保険

    会社にいた時は、会社の健康保険で通院費用負担が3割でした。
    しかし個人事業主は全額負担しなくてはなりません。これは恐ろしい。
    それを回避するために誰でも入れる国民健康保険があります。
    計算すると場合によっては結構高くなる場合もあるらしいです。

    別の手として、会社に所属していた時の健康保険を継続する方法があります。
    任意継続呼ばれるもので、2年間だけの制限付きですが同じ健康保険を続けられます。
    ただ、会社時代は会社が半分保険代を出していたので、負担額は倍になります。
    しかし、病院代全額負担にはかえられない。
    任意継続申請の期限は退職日から2週間以内なので早めに動いた方が良いです。

    ドワンゴでは、関東ITソフトウェア健康保険(ITS)に加入していました。
    エンジニアの初任給は30万円だったので、それに対応する等級だと 25k とか。

    私は任意継続を選びました。
    ある意味、2年後にまた今後どうするか考える機会が発生することになります。
    退職時に貰った書類を提出して口座振り込みで任意継続は完了。

    なお、保険証は一旦返却するので、保険証が存在しない恐怖の2週間が存在します。


    国民年金

    年金などの手続きも自分でやる必要があります。
    これも退職から2週間以内。手続きを行うのは市町村役場。
    離職表などを持っていく必要があります。
    ちなみに私の退職日は 08/09 なのですが、厚生年金は7月まで加入扱いで、8月から国民年金という形になります。

    ねんきんネットで手続きできるかと思いましたが、項目が無い。
    担当の年金事務所に電話したら、窓口での対応になるとのことでした。

    ということで年金事務所へ。

    • 身分証明書
    • 年金手帳
    • 離職票
    を持っていきました。

    国民年金への切り替えとして「国民年金被保険者関係届書」を作成して提出しました。
    これで切り替えはOK。この手続きには身分証明書と年金手帳のみでOKでした。


    国民年金保険料免除(失業時)

    切り替え自体はこれで終わりですが、担当者から失業時の保険料免除について教えてくれました。
    学生特例制度みたいなものですね。
    年金を納めなくて良いのは同じですが、免除になると半額を国が出した扱いにしてくれます。
    学生特例制度だと受給期間だけしか増えないのでこれは大きいですね。
    失業時は前年の所得を減らして計算するそうです。
    あと、人によっては失業保険とかも受けられると思います。
    有効期間は1年間。16k * 12 は大きい。申請しました。
    結果が出るのは二ヶ月後とのこと。


    まとめ

    フリーランスになってからの方が社会制度とかをいろいろと知った気がします。
    やはり必要になると人間調べるものです。
    あと、世の中は知らないと損をすることが多い。
    また、こういう制度もあるよ、という助言はいつでも歓迎です。
    この記事が、フリーランスになりたい貴方の参考になれば幸いです。


    おまけ: 毎月かかる費用

    さて、一応書いておかねばならないのは出費。
    開業届けに関しては費用はかかりません。
    健康保険は月 25k ほど。これは収入に対して比例するので増減します。
    国民年金は月 16k ほど。これは固定。
    両方とも前納制度とかがあるのでちょっとお得になる時もあります。
    税金は収入次第。

    ということで、私だと毎月40kくらいが無くなります。
    その分も踏まえて仕事ができるとうれしいものです。

    なお、この記事を書いている 2017/10/03 時点ではフリーランスを続けられています。頑張ってる。


    参考

    2017/09/23

    RGhost に PR を送ってマージされた

    現プロジェクトで画像を扱う機会があって RGhost を使っていました。
    その時以下のようなエラーが。パッと見て何が起きたか何も分からない。

    具体的にその時は Tempfile を渡していたのですが、nil 関係無くても出てくる。

    ちょっと困ったなー、ということで調べてみる。
    具体的にエラーが発生しているのは shellescape というメソッド。
    これを呼んでるのはこことかこことかここ
    RGhost は ImageMagick を使って画像を変換するのでそれ用に引数を shellescape しているようです。
    (書いてて思ったけれど ImageMagick 側は何もAPIとか提供してないのかな)

    それで、よくよく見てみると file_in は case を使って @document のクラスで確定するらしい
    あー、それなら Tempfile は扱えないな。
    ということで File にして一時の問題は解決。
    他の人にも同じ轍を踏んで欲しくないので、対応してないのならメッセージが出るとかした方が良いな、と思う。

    ということで PR にしてみました
    やったことは単純で、case に else 節を足して例外を投げるように変更。
    RGhost::Document と File と String しか対応してないよー、と例外経由でメッセージが出るようになった。
    RSpec ももちろん追加。
    gemspec に RSpec のバージョンが指定されていないのが若干ひやひやものである。
    3.0 未満の RSpec だと raise_error とか無かった気がする。
    あと浮動小数の値がちょっと違う。なんか最近YARVに変更入ったっけ。分からない。
    そのあたりも含めて最新に合わせつつ、バージョン情報とかを PR に書いて投げた。
    そしたら一晩でマージしてくれた。対応早くてうれしい。

    という訳で Rubykaigi の熱がさめないうちに OSS 活動をしたのであった。まる。

    2017/09/22

    Rubykaigi 2017 に行ってきた #rubykaigi

    2017/09/18-20 にあった Rubykaigi 2017 へと行ってきました。


    所感

    完全にお祭り。インターネットでよく見掛ける人がその辺にごろごろいるし、毎晩ご飯とお酒が振る舞われるし。
    ちょっと所用のせいで二日目からの参加になりましたが、みんな毎晩呑んで寝不足ー、みたいなお祭り騒ぎ状態でした。


    真面目な感想

    全体的に発表のクオリティが高い。
    個人的には海外から来ている方々の発表がジョーク含め、センス良い感じがあった。
    日本人の発表は良くも悪くも淡々としたので文化を感じる。
    淡々と恐しいことをさらっとやってのける感じは流石だが。
    この辺は文字通り国際会議的な感じはあった。文化のごった煮だ。
    と言いつつ一番印象に残ったのは@syouhei さんの「Glitching ruby script」。
    American Fuzzy Lop という Glitch するアルゴリズムをコードに適用して、「ちょっと変更されたけれど、実行結果は変わらない」みたいなコードを作成できる。
    んでそれがコーナーケースとして刺さったりするらしい。面白い。
    あと American Fuzzy Lop の画像検索結果が良いね。
    感想としては、視野の広さと応用力を感じた。いやーそうくるか、みたいな。

    一日目に参加できなったので笹田さんの発表が気になっている。
    二日目以降の発表で「前に笹田さんが発表していたのでスキップ」が数度あった。何を話されていたのだろう。
    あとは vs The World が聞けなかったのも痛いか。

    実は LT に応募してたのだが、「僕らからすると別に特別目新しい内容でも無いので reject 」と言われてしまった。
    メールが来た時はちょっと残念だったが、実際のLTを見るとレベル高かった。
    仮に採用されていた時には確かに場違い的な内容になりかねなかった。危ない。


    個人用な雑な感想とちょっとしたイベントメモとか

    • 『二つ名を得よ。』
    • 翻訳業界ではその辺で神が降臨したりしてビビる
    • 背後に隠れているコンテキストの方が話す内容に影響するというか単語の意味を決める
    • お前の単価は(高すぎる|適切|低すぎる)
    • 「我々は賢いので」
    • 「ぬるかるさん遅いですね」「あの子は最近帰ってくるの遅いから」「言い方が不良息子の母」
    • 名刺を渡そうとして名刺入れをズボンのポケットから取ったら勢い良く渡す相手のご飯の皿にダイブ。
    • 「Why did you think this idea?」
    • 「なんで髪伸ばしてるんですか」「地毛で女装するためです」
    • 「女装するとメイクスキルが上がって、顔を見るとどのくらい加工しているかが分かるようになる」
    • 超ハイテンションで帰ってきたぬるかるさん、10m歩いてクールダウンして真顔。
    • 「スピノザは良いぞ」
    • 「良く分かんねーことが発生すると神なんだよ」
    • 「聖書は自己言及もするし矛盾もしてる」「クソリプ対策みたいですね」
    • MessagePack の作者と遭遇して名刺交換。 Alice で採用していると伝える。
    • OC さんを知る者と遭遇する。世は狭い
    • 雑談していると思ったら妻帯者からの高度なのろけが飛んでくる
    • 「マイノリティに立っていきたい」「実際面倒が多い」
    • 「家って何?」
    • 君は(雑魚|普通の人|ヤバいやつ)
    • 「社交性発揮してきます」
    • 荷造り5分で東京駅に行ったら広島駅につける。4時間と2万円かかるけれど。飛行機か。
    • でも足元はゆったりで快適で読書が捗る
    • 「いやー酒が呑めるようになっちゃって」
    • 「若いっていつまで名乗って良いのですかね」「若くても老害はいる。逆もしかり。そういうことだ」
    • 唐突の「デカ外人クイーズ」
    • アメリカだと公園で飲酒は違法だったりする(ので日本で呑みに行くぜ)
    • 「Github という小さい会社で働いています」
    • データの可視化は重要だ……(メモリのフラグメンテーションを見ながら)
    • 「Type? Compile Time が無いなら Run Time で取れば良いじゃん(テスト動かしながら)」
    • 「あー草Tシャツの人ね」
    • 「今日一日で一生分の「うぇーい」を使った」
    • 超高速で便器の蓋が開くレゴ
    • 「やんちゃハウスは治安が悪い」「前は川沿いが治安悪かった」
    • 「論理やんちゃハウスと物理やんちゃハウスがある」
    • 「Typhoon season is very risky」
    • 寝不足だと眠い


    まとめ

    という感じで完全に祭り気分でした。実際そんな感じで過ごしてる人のが多かった印象。
    体力がゼロだったので観光はしなかったが、広島限定茶葉も買ってお好み焼きも食べて広島もちょっとエンジョイした。
    わいわいしてたなー。運営の皆様ありがとうございました。

    2017/08/31

    Rails 5.1 の form_with に remote: false を指定する時に気をつけること

    Rails で form を書いていて、「ここは非同期に ajax にしよう」となった時は form_for などに remote: true を渡すと実現できます。
    逆に、同期の POST にしようと思ったら明示的に remote: false とする訳ですが、 Rails 5.1 で form_with に remote: false を書いても POST にならない。
    調べてみると、local オプションというものになったようです
    加えてどうやらデフォルトが ajax の様子。ちょっと引っかかりました。

    とはいえ実態は data-remote に false を設定しているだけなので

    のどちらで書いても同期のPOSTリクエストになります。


    環境

    • macOS Sierra 10.12.6
    • ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
    • Rails 5.1.3


    参考

    2017/08/23

    MoneyForward Meetup vol.12(Cashless Talk Night) に行ってきた

    2017/08/22 に開催された MoneyForward Meetup vol.12(Cashless Talk Night) に行ってきました。
    東京に来てから始めてのイベント参加かな。

    MoneyForward のプレミアムユーザ + ヘビー(?)ユーザなのでどんな感じか軽く覗く程度の気持ちで行きました。
    現時点で14サービス連携していた。結構使ってる方に入るのかな。そうでも無いのかもしれない。

    Cashless の Cash は現金での支払いとかのことを指すようです。
    そもそもお金という概念がー、みたいな話が聞けたらと思っていたのは内緒。
    みんな現金についてどう考えていたり、どう Cashless 生活をしているのか、をお酒を飲みながらわいわい話そう、という会でした。
    そういう点では思想が近い人が多かったかな。
    現金面倒、とりあえずクレカで、みたいな。

    普段の meetup は tech な話もするようですが今回はどっちかと言えば意見交換メイン。
    グループワークで発表なんかもして学生気分していました。
    ちなみに発表は良かったと褒められました。わーい。お世辞かもしれないけれどね。

    VALU の話やビットコイン、Cash (写真取って査定できる方) とか Kyash、 Paymo とかの話が当然のように出ていて、流行を感じました。
    私としてはとりあえず全部触ったことはあるのかな?
    そういう意味では強烈に目新しいものは無かった。
    ただ、それにも意味はあると思っていて、最近の流行りを軽くは追えている根拠になる。
    流行りとかは場所の雰囲気で強烈に感じるものなので、感じ取れるだけ上々かな、と。

    Fintech って単語がありますが、私自身は tech だけの人間。
    話を聞くだけで帰るつもりでしたが、グループワークもあり、結構話した感があります。
    そういう意味では若干 Finance の方に足を突っ込んでたりするのだろうか。NISAとか開設したし。不労所得欲しい。
    私の情報源は MoneyForward のコラムだったりするので、中の人たちと話ができるのは当然と言えば当然かもしれない。

    でもやっぱりクラスタに違いはあって、アカウント名(あっとん)で参加登録しているのは私だけでした。みんな本名。
    名刺も渡したのですが、アカウント名義の名刺なので並べたら浮くはず。
    あとイベントの参加率は登録人数に対して少なかったのかな?
    とりあえず登録するだけする人がいる、みたいな話はTLで目にしたことはあるが実在していたのか。

    フリーランスになったので、イベントで営業とかするべきなのかもしれないけれど特にしなかったかな。
    軽く名刺渡す時にフリーランスですと名乗りはした。
    ちょっと愉快だったのが、受付で滞在時間などを書く紙があったて、その欄に所属会社が必須項目として存在していた。でも書けないので白紙で出した。
    あとは名刺交換していたら前職の人がいた。世の中は狭い……

    という感じで話をしながらただ飯を食べてきたのでした。ありがとう MoneyForward さん。ごちそうさまでした。

    2017/08/15

    GitHub のアカウント名を atton にしてもらった話

    GitHub のアカウント名は前々までは atton- だったのですが、atton-.github.io が URLとして認識されづらい問題があったので変更をお願いしてみました。

    GitHub には Name Squatting Policy なるものがあり、名前を取るのは早いもん勝ちだけれど流石に使ってない奴に名前を使われ続けるのも何なので、全然使われてないアカウントなら消してあげるよ、みたいなもののようです。

    参考にもあるようにテキトーに英文をちょちょっと書いて送る。
    実名も載せたのでここでは公開できませんが、

    • atton github で検索すると私が出る
    • 他のサービスでも私がだいたい atton として通っている
    と主張してみたらものの1時間くらいであっさり開放してくれました。
    その後は名前変更から atton に変更してしまっておしまい。
    ということで使いやすい atton.github.io が使えるようになりました。やったね。
    しかし、このブログから参照していたURLが404になる可能性もあるのでその辺りは補完して欲しいです。


    参考

    2017/07/31

    株式会社ドワンゴを退職します

    まさかこんなに早く退職エントリを書くとは。
    表題の通り、株式会社ドワンゴを退職します。

    いろいろと働くことについて考えることが増えたため、一旦辞めて整理をしようと思い、辞める流れとなりました。
    何度も相談にのってくれた上長、自分と長く話して思考の整理を手伝ってくれたメンターさん、これからの将来について相談してくれたmesoさん、仕切り直しを提案してくれた人事さんには感謝しています。
    これだと何か強制操作されて良いイメージだけ書くようにしてるみたいですが、そんなことはもちろん無いです。

    まー書けないような複雑な事情とかもあって、人生相談みたいなことをされたり、心配されたり、後押しされたり、無反応だったり、といろいろありました。
    そのあたりも含めて話をしてくださったみなさんには感謝しかありません。
    いろいろと考えた結果、一度はおもしろそうな方向にサイコロを振りたくなったのです。

    ということで宣伝をば。
    しばらくは東京でフリーランスのエンジニアとして活動していこうと思います。
    なので

    • リモートワークのお仕事を依頼したい
    • リモートワークのお仕事を一緒にやって欲しい
    • 社員として雇いたい
    • 養いたい
    といったことがあれば、おいしい御飯の奢りと一緒ならお話を伺います。
    ちなみに Rails とか書けます。その辺りのスキルは github.io にまとめてあります。

    色々とありますが、おもしろいことになれば良いな。の一言です。

    最後に、退職エントリ恒例の欲しいものリストを貼っておきます。
    この記事を書いた段階ではレビュー待ち状態なので無理ですが、 VALU で直接支援してくれても喜びます。


    それでは、ありがとうございました&これからもよろしくお願い致しします。

    2017/07/21

    Laravel 5.1 の quickstart を Laravel 5.4 で実行する

    Laravel には tutorial 的な quickstart があるのですが、ドキュメントは 5.1 までしか提供されていない。
    5.4 の tutorial 的なものは laracast という形で動画で提供されています。
    動画を見てコードを書くのが性に合わなかったので 5.4 で 5.1 の quickstart をやってみたログ。
    ちなみに作るものは所謂 TODO リストというやつで、よくチュートリアルで作るやつですね。
    index, create, delete があるだけ、って感じ。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • PHP 5.6.30
    • Laravel 5.4.22
    • Apache httpd 2.4.26


    5.1 -> 5.4 変更点

    具体的な変更点は実は1つしかなくて、Routing の `app/Http/routes.php` の内容を `routes/web.php` に置くだけ。
    どうやら Laravel 5.4.22 は api/web/console/channel ごとに routes を分けられる構成になっているっぽい。
    書いてて思ったけれど割とモダン。
    OR-mapper も extends するだけて使えるタイプっぽいし。
    個人的には Routing 部分に処理が出てきたりするのは Sinatra っぽいな、と感じました。
    あと html template の名前が blade でかっこ良い。が、宿命的に書きづらい。
    ということで作った Repository はこちら。5.4 環境でも何ら問題無く動きます。



    Apache 2.4.26 で動かす

    Apache 2.4.26 で動かすためには `public` を DocumentRoot にする必要があります。
    例えば
    DocumentRoot "/home/atton/quickstart/public/"
    <Directory "/home/atton/quickstart/public/">
    とか。 permission もきちと整えておくこと。
    あと DirectoryIndex は index.php にしておいた方が良いかも。
    それと AllowOverride All と Requite all granted を書いておくこと必要があります。
    加えて LoadModule rewrite_module modules/mod_rewrite.so をコメントインしておく。
    .htaccess とかは Laravel が用意してくれるので問題無し。

    さらに言えば、使うDatabase が MySQL なら MySQL の PDO が必要なので ./configure の段階で
    • ./configure --with-openssl --with-zlib --enable-mbstring --enable-zip --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
    とかしておく必要があります。つまり前記事の段階ではオプションが足りていなかったってことですね。
    ということで 5.1 の quickstart を 5.4 で動かしたログでした。


    参考

    2017/07/18

    ActiveLDAP が Timeout Module を使っていた

    かなり前の記事になりますが、ActiveLDAP が Process.fork を使っているせいで PostgreSQL との相性が悪いバグがありました。
    具体的には Timeout を指定すると fork したプロセスを使って Timeout を確認しているせいで pg の connection を使いはたしてしまう、というのが原因でした。

    本当に具合が悪い時は Ruby がコアダンプを吐いて死ぬ時もあったので、直してしまってRuby会議2017のLTネタ にでもしようと思って調査を続行。
    最新版では再現しないのでソースを読んでみたらそもそも Process.fork をしていない。
    Timeout というものに block を渡している
    なんと Timeout なる Module があるようで、それに時間の処理を一任しているようです。

    Timeout Module 知らなかった。
    Timeout の処理って面倒なので自分が次に Timeout の処理を書くことがあったら使おうと思いましたまる。
    ソース読むのはおもしろかったけれどネタが無くなってしまったな。どうしようかな。

    2017/07/13

    Scientific Linux 7 に NeoVim を入れる

    これまたタイトル通りの作業ログ。
    CheckHealth が通る NeoVim にプラグインを入れるまで。

    環境

    • Scientific Linux release 7.3 (Nitrogen)
    • NeoVim 0.1.7


    インストール方法

    NeoVim 公式ドキュメントを見るとどうやら epel から入れられるっぽい?
    • # yum -y install epel-release
    • # curl -o /etc/yum.repos.d/dperson-neovim-epel-7.repo https://copr.fedorainfracloud.org/coprs/dperson/neovim/repo/epel-7/dperson-neovim-epel-7.repo
    • # yum install --enablerepo=epel jemalloc
    • # yum -y install neovim
    で NeoVim 0.1.7 が入った。


    CheckHealth を通す

    どうせなので CheckHealth が通るように gem とかを入れる。
    • # yum --enablerepo=epel install -y python-neovim msgpack msgpack-devel ruby ruby-devel python2 python2-devel python34 python34-devel python34-pip
    • # gem install neovim
    • # easy_install pip
    • # pip install neovim
    • # pip3 install neovim
    これで CheckHealth で怒られなくなった。


    dein.vim を入れる

    NeoVim に移った際にプラグインマネージャを dein に変更したのでそれのインストールも。公式の通り
    • $ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
    • $ sh ./installer.sh ~/.config/nvim
    としておしまい。
    あとは :call dein#install() として他のプラグインをインストールして環境構築完了、と。

    2017/07/12

    PHP 5.6.30 + Laravel 5.4 の環境を整える

    タイトル通りな環境を作った時のログ。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • composer 1.4.2
    • PHP 5.6.30
    • Laravel 5.4


    PHP の再ビルド

    最初からネタバレ全開でいくと、前回入れたPHPでは Laravel は動きません。
    openssl や zlib や mbstring や zip が必要らしい。なので正解な最小の config は
    • ./configure --with-openssl --with-zlib --enable-mbstring --enable-zip --with-apxs2=/usr/local/apache2/bin/apxs
    っぽい。こいつで再 make + make install



    Composer を入れる

    Laravel 公式の Installation を見ると composer という package manager を使うと良いらしい。
    書かれている通りに
    • $ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    • $ php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    • $ php composer-setup.php
    • $ php -r "unlink('composer-setup.php');"
    とすると composer.phar なるファイルが直下にできる。
    これが package manager の実行ファイルっぽい。
    適当な場所に放置して大丈夫かと思っていたら /usr/local/bin とかに置くと良いっぽい。
    • # mv composer.phar /usr/local/bin/composer
    これで package manager が入った。


    Laravel を入れる

    composer が入ったのであとは
    • $ composer global require "laravel/installer"
    する。
    ログに "Changed current directory to /home/atton/.config/composer" とか出ているので config は $HOME/.config/composer あたりに書かれるらしい。
    その下を漁ってみると .config/composer/vendor/bin に laravel があるのを発見したので
    • export PATH=$HOME/.config/composer/vendor/bin:$PATH 
    とかして PATH に追加。これで laravel が使えるようになった。試しに
    • $ laravel new blog
    すると blog が生成されたので動いているっぽい。


    参考

    Apache Solr 6.6 を Scientific Linux 7.2 にインストールする

    表題の通り。インストールしたログです。あとちょっと遊んだログ。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • Apache Solr 6.6


    インストール

    • # yum install -y java
    • # wget http://ftp.jaist.ac.jp/pub/apache/lucene/solr/6.6.0/solr-6.6.0.tgz
    • # tar xzf solr-6.6.0.tgz
    • # solr-6.6.0/bin/install_solr_service.sh solr-6.6.0.tgz
    でおしまい。service にも systemctl にも登録されている。便利。


    チュートリアル

    QuickStart が用意されているので遊んでみる。
    xml とか json とかのデータを食わせることができて、それらを検索できるっぽいです。
    • # systemctl start solr
    しておいて
    • $ /opt/solr/bin/solr create -c gettingstarted
    とかでコレクションを作る。コレクションに情報を集約する感じかな。
    ちなみに root で bin/solr create とかすると怒られる。
    su - solr するとデータのディレクトリとかがあるので、ここにデータが入るのだろう。

    QuickStart を参考に
    • /opt/solr/bin/post -c gettingstarted /opt/solr/docs
    • /opt/solr/bin/post -c gettingstarted example/exampledocs/*.xml
    • /opt/solr/bin/post -c gettingstarted example/exampledocs/books.json
    • /opt/solr/bin/post -c gettingstarted example/exampledocs/books.csv
    とかでデータを食わせる。食わせたデータは RESTful に検索できるとのこと。

    ということでいろいろと検索してみる。
    • $ curl "http://localhost:8983/solr/gettingstarted/select?indent=on&q=*:*&wt=json"
      • でとりあえず何にでもマッチするクエリを投げる
      • 検索は key:value ってフォーマットらしい
      • なので *:* はなんでもマッチする感じですね
    • $ curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation"
      • で "foundation" を含むデータを探す。
      • 返ってくるデータの形式は json
      • たぶん json 以外にも対応している
    • $ curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation&fl=id"
      • 返すフィールドを id のみに制限。
      • fl が field の略か。
    とかとかいろいろあるらしい。

    ブラウザからもアクセス可能でその場合はデフォルトだと 8983 番で listen している。
    マルチバイト文字の扱いが地味に気になるがその辺りも対応しているのなら便利そうだ。
    でも始めて聞いたな Solr 。界隈では有名なのだろうか。


    参考

    2017/07/07

    Redis 3.2.x を ScientificLinux 7 に入れる

    表題の通り。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • Redis: 3.2.9


    インストール

    • # wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    • # tar xzf redis-3.2.9.tar.gz
    • # cd redis-3.2.9
    • # cat INSTALL
      • see README とある
    • # make
      • いきなり make で良いらしい
      • あと make test してね、と
    • # make test
      • tcl が無いとテストしてくれないらしい。
    • # yum install -y tcl
    • # make test
      • 通った
    • # make install
      • /usr/local/bin/redis-server とかに入っている。
      • redis-cli が  client かな


    systemd 管理下に置く

    どうやら init.d 用のスクリプトはあるらしいが systemd の unit  は無いっぽい。
    それはともあれ install_server.sh があるので設定くらいは置いて欲しいので実行


    service は当然無いので abort したが /etc/redis/6397.conf とかは作ってくれた。
    作られた conf を適当なところに置いて service ファイルを書く。

    • # mv /etc/redis/6397.conf /etc/redis.conf
    • # rm -rf /etc/redis
    • # vi /usr/lib/systemd/system/redis.service
    • # systemctl daemon-reload
    • # systemctl start redis
    で動いた。
    ちなみに --daemonize no を消すと起動してくれなかった。


    参考

    MySQL 5.7.x を rpm から入れる

    タイトルの通り。MySQL 5.7 系の最新版を rpm から入れます。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • mysql-5.7.18


    インストール方法

    今回は結構シンプルで、公式 が rpm を提供しています。
    今回必要なのは mysql-client と mysql-server なので、この二つとその依存先を入れます。
    rpm -i した時に依存先が無いよって怒ってくるので、そのあたりを察すると良いです。
    • $ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
    • $ tar xf mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
    • # rpm -i mysql-community-common-5.7.18-1.el7.x86_64.rpm
    • # rpm -i mysql-community-libs-5.7.18-1.el7.x86_64.rpm
    • # rpm -i mysql-community-client-5.7.18-1.el7.x86_64.rpm
    • # rpm -i mysql-community-server-5.7.18-1.el7.x86_64.rpm
    くらいで。


    MySQL を使う

    まずは起動。 systemd 登録とかしてくれるので楽だ。
    • # systemctl start mysql
    公式によれば
    • # grep 'temporary password' /var/log/mysqld.log
    すれば temporary password があるのでそれを使ってログインしろ、と
    • # mysql -u root -p
    先程 grep したパスワードを入れてログイン。パスワード変更のために
    • mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'hogehoge';
    とかする。結構パスワード強度に厳しい。
    これで MySQL 5.7.x が使えるようになった。
    チュートリアルとかも充実しているのでサポート強い。


    参考

    2017/07/06

    php 5.x + apache httpd 2.4.x を make する

    php 5.x 系の最新版と httpd 2.4.x 系の最新版を make したログ


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • Apache httpd 2.4.26
    • php 5.6.30



    httpd 2.4.26 の make

    • # yum install -y wget apr apr-devel apr-util apr-util-devel gcc pcre pcre-devel perl perl-devel libtool libtool-devel systemd-devel
    • # wget http://ftp.tsukuba.wide.ad.jp/software/apache//httpd/httpd-2.4.26.tar.gz
    • # tar xzf httpd-2.4.26.tar.gz
    • # cd httpd-2.4.26
    • # ./configure --enable-rewrite
      • とりあえず rewrite くらいで。
      • 必要なものは ./configure --help にあるものから確認して追加していけば良い
    • # make
    • # make install
    ちなみに /usr/local/apache2 の下に bin とかが入ります。


    httpd を systemd 管理下に置く

    このままだと起動するのが面倒なので systemd 経由で起動できるように。
    この記事を参考に service を作る。
    私は apr も apr-util も pcre も yum にあるものを作ったのでこんな感じ。


    こいつで systemd に認識させてやるといつも通りの
    • # systemctl status httpd
    • # systemctl start httpd
    とかできるようになります。

    • $ curl http://localhost
    して It Works! が出たら httpd が動いています。



    php 5.x を make する

    • # yum install -y libxml2 libxml2-devel
    • # wget http://jp2.php.net/get/php-5.6.30.tar.gz/from/this/mirror -O php-5.6.30.tar.gz
    • # tar xzf php-5.6.30.tar.gz
    • # cd php-5.6.30
    • # ./configure --with-apxs2=/usr/local/apache2/bin/apxs
      • ポイントはここ。
      • libphp5.so を作るために apx を指定します。
      • これを書いておくと httpd.conf で LoadModule できる場所に libphp5.so ができる。
    • # make
    • # make test
    • # make install
    これで php が入りました。
    /usr/local/apache2/modules/libphp5.so とかができているはずです。


    httpd に php を認識させる

    両方とも make できたのであとは設定。
    httpd の DocumentRoot はデフォルトでは /usr/local/apache2/htdocs/ なので
    • # vi /usr/local/apache2/htdocs/hoge.php
      • <?php phpinfo() ?>
      • とか。
    • # vi /usr/local/apache2/conf/httpd.conf
      • LoadModule php5_module modules/libphp5.so
      • <FilesMatch \.php$>
      •     SetHandler application/x-httpd-php
      • </FilesMatch>
      • あたりを追記。
      • LoadModule は勝手に追記されてたりします。
    • # systemctl restart httpd
    • $ curl http://localhost/hoge.php
    大量の html が流れてきたら php が動いています。
    ブラウザからアクセスすると php の情報が見られるはずです。やったね。



    参考

    2017/07/05

    rpm を tar.bz2 や .spec ファイルからビルドする

    rpm ファイルをビルドする機会があったのでそのログ。


    環境

    • Scientific Linux release 6.8 (Carbon)
    • rpmbuild 4.8.0(たぶん)
    • httpd 2.4.26
    • distcache 1.5.1


    tar.gz ファイルから直接ビルドする

    アーカイブ内部に *.spec ファイルがある場合は直接 rpmbuild で指定できます。
    • $ wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.26.tar.bz2
    • $ rpmbuild -tb httpd-2.4.26.tar.bz2
    /root/rpmbuild/RPMS 以下に .rpm ファイルが作成されます。
    アーカイブ指定の時は -tb オプション。


    .spec ファイルからビルドする

    アーカイブに *.spec が無かったりする場合もあります。
    その場合は *.spec ファイルを作ってそれを指定してビルドします。
    例えば distcache 1.5.1-1 の spec ファイルはこちらのブログ にサンプルがあります。
    *.spec ファイルから rpm を作る場合は SOURCES に必要なソースを配置します。
    • $wget https://downloads.sourceforge.net/project/distcache/1.%20distcache-devel/1.5.1/distcache-1.5.1.tar.gz
    • $ mv distcache-1.5.1.tar.gz ~/rpmbuild/SOURCES/
    •  wget -O /root/rpmbuild/SOURCES/distcache-1.5.1.patch https://ja.osdn.net/users/matsuand/pf/LFScripts/scm/blobs/master/BLFS/patch/distcache-1.5.1.patch?export=raw
    • $ rpbuild -bb distcace.spec
    スペックファイル指定の場合は -bb オプション。

    rpm のインストール

    rpm -i とか。消す時は rpm -e。
    リストは rpm -aq とかなので rpm のオプションは結構素っ気無い感じ。


    参考文献

    2017/07/03

    NeoVim に移行した

    そろそろ NeoVim に移行したいなー、と思っていたので気合を入れて移行しました。


    環境

    • macOS Sierra 10.12.5
    • NeoVim 0.2.0
    • Homebrew 1.2.3-121-gb5529084
    • Homebrew/homebrew-core (git revision 72126; last commit 2017-07-02)
    • tmux 2.5 + EastAsianAmbiguous Patch


    やったこと

    まずは neovim の install 。
    • brew tap neovim/neovim
    • brew install neovim
    くらいで。

    その後は NeoVim の CheckHealth が通るようにいろいろと。
    • tmux.conf の default-terminal を screen-256-color に変更
    • gem install neovim
    • python2 を入れて easy_install neovim
    • python3 を入れて pip3 install neovim
    とかとか。自己診断機能便利。

    次に .vimrc の移動。
    neovim はデフォルトで ~/.config/nvim/init.vim を読みにいくのでそこに元の .vimrc を配置。
    .vimrc は source ~/.config/nvim/init.vim を見るようにした。
    それからプラグインの変更。
    • NeoBundle から dein へ
    • neocomplete から deoplete へ
    • Unite から Denite へ
    Unite 以外はそんなに問題無く移行できました。
    Unide は file_rec のオプションとか grep のオプションとかを denite 用に書き直す。
    あとは自作していた unite command を denite に対応させる。
    help が充実していてありがたいですね。流石は暗黒美無王さん。

    とかなんとかしていたgitのログはこの辺からこの辺までかな。


    まとめ

    移行にかかった時間は合計して丸一日くらい?
    file_rec が超高速になったのでうれしい。
    Unite とちょっと使い勝手が違うけれど、その辺りも変更するオプションがありそう。
    help の example が大変ありがたかった。
    あと先人の知恵は貴重だった。質問に高速で返答が来るのはありがたい。

    ということで Vim から NeoVim へと移行しました。

    2017/06/22

    blogger を https 対応させる

    タイトル通り。 自分のブログのポストを見たら http だったので今の時代これはまずいなー、と。

    どうやら http -> https のリダイレクトもしてくれるようなので設定しない手は無い。
    blogger > 設定 > 基本 > HTTPS > HTTPSリダイレクト にチェックを入れる。
    これで https 対応とリダイレクトもしてくれる。便利。

    参考

    Jenkins でビルドの情報を Slack に投稿する

    Jenkins ネタでもう一つ。
    ビルドの開始や失敗、成功を Slack に流したくなったのでそのログ。


    環境

    • CentOS Linux release 7.0.1406 (Core)
    • Docker version 1.12.6, build 1398f24/1.12.6
    • Jenkins ver. 2.46.3
    • Slack Notification Plugin 2.2


    構築方法(Slack)

    • Slack 側の Add Integration で Jenkins を指定
    • 通知させたいチャンネル名を指定
    • 発行された token をコピーしておく


    構築方法(Jenkins)

    • Manage Jenkins > Plugin Management > Available
      • Slack Notification Plugin をチェック
      • install without restart 
    • Manage Jenkins > Plugin Management
      • team subdomain: 通知したい Slack の subdomain
      • 例えば hoge.slack.com なら hoge
      • Integration Token は先程コピーした  token で
      • Channel は通知したいチャンネル
      • Is Bot User ? にはチェックを入れない
    • Test Connection できちんと Slack にポストされていれば設定はOKです


    構築方法(Jenkins Project)

    • 通知させたい Project の Configure を開く
    • Post-build Actions
      • に Slack Notifications を追加
      • 通知させたいイベントにチェックを入れる
    • Project > serval > Post-build Actions > Advanced
      • は特別設定しなければ先程のグローバル設定が使われるので空白で良いです
      • 私は Notification message includes を commit list with authors only に設定しました


    まとめ

    この設定をすることで  Jenkins がビルドした時に Slack へ通知が行なわれます。
    今回面倒だったこととしては、 Is Bot User? にチェックを入れていた時、Test Connection ではきちんと通知がされるのに、ビルドした時だけは通知がされないという絶妙な状態になることがありました。どうしてチェックを入れたらダメなのだろ。


    参考

    2017/06/20

    Docker で古いコンテナとイメージを消す

    Docker で適当にコンテナを作っていたり、CI とかをしていると使われなくなったコンテナが大量に積もっていきます。
    それを適当に消したのでそのメモ。


    環境

    • CentOS Linux release 7.0.1406 (Core)
    • Docker version 1.12.6, build 1398f24/1.12.6


    コマンド

    • docker ps -aq | tail -30 | xargs  docker rm
    基本的には古いものから消していく方針で。
    images の option で -q を付けると hash だけを出してくれます。
    あと -f で特定の条件のみで絞りこみをしてくれるようです。
    • docker ps -qaf "status=exited"
    とかすると止まってるのだけ出してくれる。
    動いてるコンテナは -f を付けない限り消さないので、 とりあえず全部 rm に渡してしまうのもありかも。

    あとはイメージを消すだけです
    • docker images -aq | xargs docker rmi
    こいつも使われているイメージは -f を付けない限り残してくれる。
    なのでとりあえず消せそうなもの全部消そうとしてみる、とか可能です。

    • docker images -qf dangling=true
    とかでタグが付いていないイメージだけを対象にする、というコマンドが参考記事にありましたが、今回はタグが付いているイメージもあるので -aq で。


    まとめ

    • docker ps -aq | xargs  docker rm
    • docker images -aq | xargs docker rmi
    とかでとりあえず起動していないコンテナ以外消えます。
    新しい docker だと docker image prune とかあるらしいのでもっと楽かも。


    参考文献

    2017/06/13

    Volume 指定を忘れた Docker からデータを取り出す

    Jenkinsをたてた時、最初はボリュームを指定せずに docker run していました。
    後からポートフォワードを追加しようと思って、一旦イメージを commit 。
    そのイメージにオプションを追加して起動しても Jenkins が初期化されている。

    どうやらボリュームを指定していないとどこかにボリュームを勝手に作るらしい。
    なので今まで作業していた分を commit してもコンテナに反映されない。
    ということでどこかに作られたボリュームを探せればデータを復旧できそう。

    • docker inspect <container-name>
    するといろいろ出てくるがその中に怪しいものが。
    Mounts の Source にパスがあるのでこいつっぽい。

    • cp -r /var/lib/docker/volumes/98ef888300af713d65b6d7534d835c7bd2e95270ad5eb016da749bbbb5f6d409/_data hoge
    • docker run -itd -P -v /foo/bar/hoge:/var/jenkins_home jenkins
    とかすると復活。やったね。

    環境

    • CentOS Linux release 7.0.1406 (Core) 
    • Docker version 1.12.6, build 1398f24/1.12.6

    GitHub に push された時に Docker 上の Jenkins から SSH 越しでコマンドを実行する

    長いタイトルですがやりたい事は以下です。

    • Jenkins 経由でデプロイ
    • デプロイするタイミングは GitHub の master が更新された時
    • Jenkins は Docker で起動しておく
    • デプロイに使用するコマンドは SSH 経由で本番サーバに適用

    さて、タイトル通りややこしい状態なので記事もだいぶ読み辛いものになりそうです。


    環境

    • CentOS Linux release 7.0.1406 (Core) 
    • Docker version 1.12.6, build 1398f24/1.12.6
    • Jenkins 2.46.3


    Docker でやること(Jenkins を起動する)

    • docker run -itd --privileged --name kaban -v /hoge/fuga:/var/jenkins_home -P jenkins
      • これで Jenkins が立ち上がります
      • --name で名前を付けておくと楽です。とりあえずかばんちゃんです。
      • Jenkins はデータの永続化のためにボリュームを使っています
      • 適当なディレクトリを /var/jenkins_home にマウントしてください
      • Jenkins は uid 1000 なので chown 1000 -R <dir> などをしておくと良いです
      • もしくは chmod で適切な permission を与えてください
      • -P でポートマッピングを適当にやってもらいます。
    • docker exec -it kaban cat /var/jenkins_home/secrets/initialAdminPassword
      • 後で Jenkins を起動した際に要求される初期パスワードです。


    Jenkins でやること(初期設定)

    • docker ps をして、8080 がどのポートに割り当てられているか確認します。
    • ブラウザから Jenkins にアクセスします (http://localhost:32769 とか)
    • まず初期パスワードを使って Jenkins を起動します
    • 適当に Install Suggested Plugin を選択します(これに Github Plugin とか入ってたので)
    • 管理者ユーザを作ります
    • Manage Jenkins > Manage Plugins から Available > Publish over SSH を選択します
      • Publish over SSH プラグインを使ってデプロイします
    • Install without restart で Publish over SSH を入れます
    • Configure System > Publish over SSH でデプロイ用サーバに SSH できる設定をします
      • SSH Servers > Add でサーバを追加します
      • Name や Hostname や Username 、 Key か Password を設定します
    • これで土台ができました。


    GitHub でやること

    • デプロイ対象のプロジェクトのリポジトリページに行きます
    • Settings > Hooks&Services > Add Service から Manage Jenkins(Github Plugin) を入れます
      • Git Plugin もありますが今回は GitHub Plugin なので間違えないように
    • Jenkins hook URL に Jenkins の URL を指定します
      • http://192.168.0.1:32769/github-webhook/ とかです
    • これで push された際に Jenkins へ通知がいきます。


    Jenkins でやること(プロジェクトの設定)

    • New Project から Freestyle Project を作ります
    • GitHub Project に check をいれます
      • なので最初から GitHub Project で作っても良いかも?
      • Repository URL は GitHub の Project URL を指定してください
      • Branch Specifier は */master で良いです。 master に変更があった時のみにデプロイなので
    • Build Triggers で GitHub hook trigger for GITScm polling に check を入れます
    • Build で Send files or execute commands over SSH を指定します。
      • SSH Server は先程 Configure で追加したデプロイサーバを指定します。
      • Transfars: Exec command で SSH 後に実行したいコマンドを指定します。
    • これで完了です。 GitHub の master が更新されると自動で SSH 経由でコマンドが発行されます。


    長い道のりでしたがこんな感じで。

    ウィンドウマネージャの Spectacle.app を入れてみた

    普段はデュアルディスプレイ環境での作業が多いのですが、最近はシングルディスプレイ環境での作業も増えてきました。
    私は大体のウィンドウを最大化して使うので、基本 Terminal.app + ブラウザ で二つのディスプレイが埋まっています。
    Terminal.app を透過させる手もあるのですが、ちょっと私には向かなかったです。
    シングルディスプレイ環境だと、どうしてもウィンドウを切り替えまくる必要があって面倒です。
    ということで、この際思い切ってウィンドウマネージャを入れてみました。
    今回入れたのは Spectacle.app というやつです。 @_akiyoshiaki_ さんに教えてもらいました。


    環境

    • macOS Sierra 10.12.5
    • Spectacle.app 1.2


    導入方法

    cask に入っているので
    • $ brew cask install spectacle
    で導入できます。
    あとはディスプレイを動かすことを許可させるために
    • System Preference > Security & Privacy > Accessibility
    の Spectacle のチェックを入れます。


    設定

    私は基本的に二つの画面が見えたら良いので、画面を縦か横に二分割するアクションのみ設定しています。
    具体的な設定としては以下のような感じ。 Cmd + 矢印を使っています。

    • Left half : Cmd + ←
    • Right half: Cmd + →
    • Top half: Cmd + ↑
    • Bottom half: Cmd + ↓
    • Full Screen : Cmd  + Enter

    設定したものの、実際一番使うのは分割ではなく Full Screen だったりします。
    この Full Screen は Mac の Full Screen とは別で、ウィンドウを画面いっぱいに表示する方の Full Screen です。
    昔の Mac ではウィンドウの緑のボタンをクリックするとなるやつです。
    Sierraだと option を押しながら緑をクリックするやつ。
    とりあえずウィンドウを操作する手間を省けそうなのでしばらくは使ってみようと思います。

    2017/06/08

    GitHub Badge なるものを設定してみた

    GitHub Badge なるものを設定してみた。

    一応このブログの右側には私の各種アカウントを書いているのだけれど、リンクを列挙しているのみなのでちょっと素っ気無かった。
    どこかのブログで Github Badge を使っているのを見付けて、単なるリンクより見栄えも良さそうなので使ってみることにしました。

    ちなみにこういうものです。

    どのリポジトリでも .DS_Store や swp ファイルを git に commit しないようにする

    git init する度に .gitignore を設定するようにしているのですが、迂闊に git add . とかをして .DS_Store などの入れたくないファイルを git に commit してしまうことが何度も発生。

    何回も発生するのなら対策しておこう、ということで、どの git リポジトリでも特定のファイルを ignore するようにしました。

    とはいっても ~/.config/git/ignore に ignore するファイルを指定するだけ。
    これでどのリポジトリでも .DS_Store などの指定したファイルが ignore されます。便利。

    にしても ~/.config で書く流儀だと ~/.gitconfig はどう書いたら良いのだろうか。


    参考文献

    2017/06/02

    tmux 2.5 を全角記号対応させる

    2017/05/13 に tmux 2.5 が Release されていたので、2.3を全角記号対応させた時のパッチを 2.5 にも当てました。
    tmux 2.5 の border-ascii + EastAsianAmbiguous を強制2幅 版です。

    作業としては rebase のみでパッチそのものの変更点はありません。

    環境

    • macOS Sierra 10.12.5
    • Homebrew 1.2.1-143-gdaa67886
    • Homebrew/homebrew-core (git revision cce65; last commit 2017-06-02) 
    • tmux 2.5 (hash だと ae2c5ad76852d6d2e2463e45b13fc8c15b66e4b7 )
    • utf8proc 2.1
    • フォントは Ricty

    インストール手順

    • $ brew tap atton-/customs
    • $ brew install atton-/customs/utf8proc
    • $ brew install --HEAD atton-/customs/tmux

    過去のバージョンが利用したい方は /usr/local/Homebrew/Library/Taps/atton-/homebrew-customs
     などにある atton-/customs/tmux の git repository から古いバージョンを checkout してください。
    他にも昔のバージョンを参照する方法はあると思いますがちょっと把握していません。

    2017/04/22

    tmux 2.4 を全角記号対応させる

    2017/04/20 に tmux 2.4 が Release されていたので、前回の記事に書いたパッチを 2.4 にも当ててみました。
    tmux 2.4 の border-ascii + EastAsianAmbiguous を強制2幅 版です。

    作業としてはは rebase したただけなので修正点は全くありません。

    環境

    • macOS Sierra 10.12.4
    • Homebrew 1.1.12-40-g02f018933
    • Homebrew/homebrew-core (git revision 5559; last commit 2017-04-15)
    • tmux 2.4 (正確には 2.4リリース以降の fd13731049148d0205fa6ed1843041dad0573677)
    • utf8proc 2.1
    • フォントは Ricty

    インストール手順

    • $ brew tap atton-/customs
    • $ brew install atton-/customs/utf8proc
    • $ brew install --HEAD atton-/customs/tmux


    atton-/customs/tmux の formula は HEAD build しか対応していないので、もし 2.3 のパッチ版が使いたい場合は tap したリポジトリを巻き戻すことで 2.3 が使えるはずです。
    おそらくもっと楽な巻き戻し方があると思いますが、個人的には最新しか使っていないので調べていません。

    2017/04/16

    tmux 2.3 を全角記号対応させる

    tmux 2.3 をちょっといじって全角記号の幅を2にした版を作ってみました。


    環境

    • macOS Sierra 10.12.4
    • Homebrew 1.1.12-40-g02f018933
    • Homebrew/homebrew-core (git revision 5559; last commit 2017-04-15)
    • tmux 2.3 (正確には 2.3リリース以降の 640666fb36d7465b188f9d0bedc83ad60b83a1d7)
    • utf8proc 2.1
    • フォントは Ricty



    状況

    tmux を使っていると ─(U+2500) や(U+25bd) な文字の幅が半角扱いになってしまい、表示がおかしくなる時があります。
    例えば、画面を縦2つに分割すると



    のように線が何故か二本表示されたり、記号の表示が変になってしまいます。

    これは分割に使用されている文字(─)の幅の扱いを tmux が勘違いしているために起こる問題です。
    ─ といった記号は EastAsianAmbiguous といった種類に区分され、言語圏によって文字幅が違います。
    例えば英語圏では基本的に使う文字幅は1なので ─ の幅は1ですが、日本語圏では全角が基本なので文字幅は2となります。
    この問題に関しては https://github.com/hamano/locale-eaw などが詳しいです。


    解決法

    これは Terminal の設定と locale の設定とフォントに依存するので解決方法はいくつかあります。
    今回は
    • Terminal は EastAsianAmbigous を Full-Width にしている
    • フォントは日本語フォント( EastAsianAmbiguous は幅2)
    • locale には依存しない (en_US.UTF-8 でも ja_JP.UTF-8 でもOK)
    の時を想定しています。
    具体的には tmux が文字幅の取得に使っている utf8procちょっといじって、EastAsianAmbiguous の幅を強制的に2にしています。
    あと、画面分割に使う文字を ascii にしています。


    インストール方法

    formula にしてあるので

    • $ brew tap atton-/customs
    • $ brew install atton-/customs/utf8proc
    • $ brew install --HEAD atton-/customs/tmux
    でインストールできます。
    縦に分割した時に


    のようにきちんと線が1本になるはずです。



    まとめ

    強制的に EastAsianAmbiguous の幅を2にして日本語フォントとの相性を良くしました。
    実はこれは対処療法的な解決案で、根本的な解決ではありません。
    その辺りは結構長くなると思うので書くなら別の記事で書きます。


    参考文献