CentOS 7 に PHP 7.0, nginx, MariaDB を Ansible でインストールする

前回の投稿でこの休み中にやることを決めました。

今日で冬休みも終わるので、成果をここで公開します。

  • 4年ぐらい前に借りたさくら VPS をずっと使っていた
    • CentOS 5, PHP 5.5, Apache, WordPress 3.9 というもはやレガシーな環境になってしまっていた
  • VPS を借り直すだけで同じ料金で VPS のスペック自体が 2 倍になる

というわけで、新規で VPS を構築しつつ Ansible で初期セットアップの自動化と、各種ミドルウェアのセットアップも自動化しました。

  • CentOS 7
  • PHP 7.0
  • nginx 1.8
  • MariaDB 5.5

初期セットアップについては、この記事が大いに参考になりました。とても助かりました。

Ansible でさくらのVPS の環境構築を自動化 ~ハマりポイントとともに~

初期セットアップでやっていることは、作業用ユーザ作成、SSH ポート変更、root でのパスワードログイン禁止、firewall の設定あたり。細かいことは上の記事を読んだほうが絶対に良いので、そちらにお任せ。

特筆すべきは、CentOS 7 になって iptables というより firewalld を使ったほうがよさげだったので、playbook でもその点は playbook にも反映しておきました。
firewalld は iptables のラッパー的な存在のようです。

さくら VPS のコントロールパネルからカスタム OS で CentOS 7 を選んで、minimal インストールを選択、root パスワードだけインストール中の画面で設定しておきます。

ミドルウェアインストールの playbook については、PHP 7 をやっぱり入れたかったのであえていうならそこくらい。
remi-php70 が既に公開されており、日々更新されているので、こちらを使いました。

New “remi-php70” repository

あと、Wordpress で ftp の代わりに ssh2 を使いたくなったんですが、現状、ソースからインストールしないと使えないらしいので、ssh2 は諦めました。

Solution : How to install ssh2 php7 extension.

(playbook 中で、sed を使いまくってるけど lineinfile に置き換えたい…けどまぁそこは今度)

WordPress 4.4 を使っていますが、今のところ問題なく PHP 7 で動作しています。
ベンチマークをとりたかったんですが、VPS 自体のスペックもかなり上がってしまったので、純粋に PHP の性能測定はできないかなと思い今回はやっていません、が体感早くなった気がするのでおすすめです。

ちなみに、どちらも playbook を github で公開しました。
細かいところはまだ全然出来てないですが、「完璧を目指すよりまず終わらせろ」とザッカーバーグ先生が言っていたのでこれで良しとします。

serima/centos7-initalize-ansible
serima/centos7-php70-nginx-mariadb-ansible

1日2〜3時間ほど作業時間を捻出してくれた妻に感謝!

冬休み中にやりたいこと

すでに仕事納めも終わっているので、あとはなんとかして空き時間を確保して以下をやりたい。

  • プライベートなサーバを、CentOS 7 にアップグレード
    • おそらく OS インストールから各種ミドルウェアセットアップも行うことになるので、Ansible 使ってみる
  • WordPress を PHP 7 で動作させる
  • nginx に移行
  • Let’s Encrypt で SSL/TLS 対応

(以下、余力があれば)

  • HTTP/2 対応
  • ローカルから簡単にデプロイできる仕組みを作る
  • Public repo な自分の project の CI 整備

出産タイミングでの転職について

これは、子育てプログラマ・ITエンジニア・Webデザイナー Advent Calendar 2015 の 23 日目の記事です。

今年の 10 月に第一子が産まれ、11 月に転職しました。

一般的には生活上の大きな変化を2つ以上重ねないほうがいいといわれますが、
このタイミングの転職は大丈夫なのか、実際にしてみてどうだったかという点を書きたいと思います。

実は、転職活動自体は 5 月ぐらいからゆっくりと始めており、出産前に良い所が見つかればなーと思ってました。

幸い、妻のつわりはとても軽く、妊娠前とほぼ変わらない生活を送ることが出来ました。

10 月に子どもが産まれる旨は面接の前から再三伝えるように心がけ、そこを考慮してもらえるような職場でなければ、やっぱり厳しいと思いながら転職活動はしていました。

しかし、条件面含め、もろもろ考慮した上でしっくりくるところが見つからず 7 月が終わってしまいました。

そろそろ見つからないと時期的にも出産と被ってしまうし、いったんステイかなーと思っていた矢先、偶然今の職場を知る機会がありました。

家庭の状況も考慮してもらえる(僕がさんざん言ったからかもしれませんがw)、職務内容も自分のやりたいことにマッチしており、運良く内定をいただくことが出来たのが 8 月下旬。

産前 1 ヶ月と産後 1 ヶ月半ぐらいは妻は実家に帰省する予定だったので、その間は一人暮らしとなります。
そのタイミングを入社時期と被せてしまえば新しい会社に慣れるまでの期間、家族に負担を強いることもないので、むしろそっちのほうが都合がいいことに気付きました。

さらに、有給が 1 ヶ月分ぐらい残っていたので、有給消化中は妻の実家で産前産後直後は一緒に過ごすこともできるし、このタイミングでの転職は結果的にベストじゃないかなと思いました。

今の職場は、その日の家族の体調次第でリモートワークに切り替えることもできますし、子持ちのエンジニアの方が割と多いので理解も得やすい環境なので、転職して良かったなと思っています。

確かに転職先やタイミングを間違えると、本人にとっても家族にとっても辛い時間を過ごすことになってしまいそうですが、エンジニアならではのリモートワークな環境を慌ただしくなる出産前に手に入れておくことはその後の生活が大きく違ってくるかもしれません。

子どもと一緒に妻が帰ってきてからは確かにプライベートな時間は本当になくなりました。
なにか新しい技術をちょっと休日に触ってみるなんてこともできなくなってしまっている状況なので、この AdventCalendar を書いてる先輩方の記事を大いに参考にして、時間を作っていきたいと思います。

今、妻は買い物に出掛けているので子どもはこんな感じで膝の上に乗せながらこの記事を書いていますw
足がしびれてきたので体勢を変えたいが、変えたら起きてしまう…そんな葛藤の毎日です。Evernote-Camera-Roll-20151223-123901

 

Mac の Chrome で、キーボードのフォーカスをページに戻したい

Mac の Chrome では、Cmd + l で、アドレスバーにフォーカスされるようになっていますが、逆の動作はしないようになっています。つまり、フォーカスをページに戻したくても、Cmd + l 押しても戻らない。
ページをクリックすればもちろん戻るけど、当然ながら、キーボードだけで完結させたいじゃないですか。
特に vimium とか入れてれば尚更。vimmer としては、Esc 押下すればページにフォーカスされるのが一番自然なんですが、それは API のコントロール外にあるらしく変更できないらしい。

で、みんなどうしているのか…とググッてみたところ出てきましたよ。やっぱり悩んでる人はいるらしい。

http://superuser.com/questions/324266/google-chrome-mac-set-keyboard-focus-from-address-bar-back-to-page

簡単に言うと、アドレスバーに「javascript:」って打ってエンター押すと、ページにフォーカス戻るよ。この機能を使って、検索エンジン追加して、「u」を入力してエンターしたら「javascript:」って打ったことにできるよということですね。

なんという hack。これぞ hack って感じですね。

やり方は以下。

1. chrome://settings 開く
2. 検索 の「検索エンジンの管理」開く
3. こんな感じのを追加
chromesearchengine

4. アドレスバーに u と打つとこんなふうに出てきてくれるので、すかさず enter

chromesearchengine2これで、完了です。u じゃなくて、なんでもいいと思いますが、とりあえず僕も前例に倣っておきました。

Google に bug report っていうか issue は出してるみたいだけど長らく放置されてるのかな(よく読んでない)

「良い戦略、悪い戦略」読後メモ。

久々にビビッと来るビジネス本に出会えたので、すこしばかり引用を。

それは「われわれの基本戦略は、顧客中心の仲介サービスを提供することである」というものである。「仲介サービス」というのはなかなか響きの良い言葉だが、要は金を預かって貸し出すということで、銀行の本業にほかならない。「顧客中心」は最近の大流行の言葉で、サービス業なら改めて言うまでもないことである。ひょっとすると、より良いサービスを提供して顧客拡大をめざすという意味かもしれないが、そうだとしてもどこでもやっていることで、これだけで差異化が図れるとは思えない。要するに「顧客中心の仲介サービス」はまったく中身のない言葉である。この銀行の戦略から厚化粧をはがせば、「われわれの基本戦略は銀行であることである」となってしまう。

痛快。顧客中心ってバズワードになっているが(今はもう落ち着いたかな?)、よくよく考えたら顧客中心じゃないビジネスっていったい何なんだという話。
ただ、いままで顧客中心なビジネスをしていなかった業界に斬りこむ場合もあるので、そういうときに差異化になるのかな。

がんばることは人生において大事ではあるが、「最後のひとふんばり」をひたすら要求するだけのリーダーは能がない。リーダーの仕事は、効果的にがんばれるような状況を作り出すことであり、努力する価値のある戦略を立てることである。

その通り、という感じ。

分権化が進んだ企業の場合、新製品が投入されると、製品群の位置づけや棲み分けは曖昧になりやすい。

権限委譲のデメリットのひとつ。意識しないとなー。

シャーロック・ホームズがワトソンによく言うように、「見ているだけではだめだ、観察しなければいけない」。

これはかっこいいなと思ってメモった。

目先のことや最初の思いつきに迷わされずに自分の考えを導くためには、三つの習慣をつけるとよい。第一は、近視眼的な見方を断ち切り、広い視野を持つための手段を持つこと。たとえばリストは良い方法である。第二は、自分の判断に疑義を提出する習慣をつけること。自分からの攻撃に耐えられないような論拠は、現実の競争に直面したらあっさり崩壊してしまうだろう。第三は、重要な判断を下したら記録に残す習慣をつけることである。そうすれば、事後評価をして反省材料として活用できる。

第三が特に気になった。失敗を推奨する会社はこのところ多いけども、きちんと振り返りを行わないと会社としてのノウハウとして積み上がっていかない。

最近読んだ本リスト

このところ、割と時間があったのでいろいろと本を読んだ。以下の本を読んだのですが、この周辺に興味ある人とディスカッションしたい。

  • 「納品」をなくせばうまくいく
  • ワーキングカップルの人生戦略
  • ザッポス伝説
  • トヨタ生産方式
  • 入門 組織開発
  • チームの力
  • ALLIANCE
  • スーパーエンジニアへの道
  • ライト、ついてますか
  • 良い戦略、悪い戦略
  • WORK RULES!
  • 弁護士ドットコム 困っている人を救う僕たちの挑戦
  • メンバーの才能を開花させる技法

しばらくしたらまたブログ書きます。

Laravel のログインパッケージ Confide のパスワードリセット通知メールをテキストメールとして送信する

仕事で関わっているプロジェクトで Laravel のログインパッケージ Confide を使用しているのですが、パスワードリセット操作をした際にユーザに送信されるメールは、デフォルトだと Content-Type: text/html で送信されてしまいます。
これだとなにがまずいかというと、ユーザが @softbank.ne.jp などのキャリアメールを使用している場合に本文が添付ファイルとして送信されてしまいます。
さらに、charset が UTF-8 に設定されているため文字化けしていて読めないメールが届いてしまいます。

そこで、パスワードリセットの通知メールなんて、Content-Type: text/html で送るほどでもないので、text/plain に変えたいなーと思いました。

最初は、メール送信をしているメソッド ConfideUser#forgotPassword をオーバーライドしないとダメかなーと思っていたのですが、コードをよくよく読んでいくと config 変更するだけでいけそうということでやってみました。

結局、Confide も Swift Mailer を使ってメールを送信しているだけなので、渡す view の中身に気をつけてやればよしなにやってくれるということでした。

関係しそうなコードはこのへん。

https://github.com/Zizaco/confide/blob/master/src/Confide/EloquentPasswordService.php#L176
https://github.com/illuminate/mail/blob/master/Mailer.php#L328-L330

というかんじでした。
もちろん、text/html メールを送りたければ key の名前を html にすれば良いと思います。

なお、Confide の導入については @localdisk さんのLaravel のログインパッケージ Confideの解説(実践編)がとても親切です。

忘備録も兼ねてのポストでした。

VPN接続後、Vagrantに立てたホストにブラウザ経由でアクセスできなくなる問題

VPN クライアントは、Cisco AnyConnect Secure Mobility を使用しているのですが、
VPN 切断後に毎回 Vagrant に立てた環境に ssh はできるもののブラウザからアクセスできなくなってしまい、こうなってしまうと、vagraht halt -> vagrant up しても問題が解決せず、毎回 PC を再起動していました。

状況としてはこんなかんじ。

vagrant up -> (ブラウザアクセス可能) -> VPN 接続 -> VPN 切断 -> (ブラウザアクセス不能)

これだと本当に不便だし面倒なので良い解決策はないのかとググってみたところ、バッチリな回答が見つかりました。

http://stackoverflow.com/questions/24281008/vagrant-box-not-reachable-after-vpn-connection

I have the same problem – the only solution I got so far is to:

$ sudo ifconfig vboxnet0 down
$ sudo ifconfig vboxnet0 up

vboxnet0 というのは VirtualBox のホストオンリーネットワークというもので、仮想マシンを動作させているホストと、仮想マシンをつなぐネットワークインターフェースです。
(詳しくは、このあたりをご覧ください。)

http://kledgeb.blogspot.jp/2012/10/ubuntu-virtualbox-11.html

僕の環境では、これだけでは足りず vboxnet1 も同様に down up を行なうことで解消しました。

Laravel 4 から Slack へメッセージを投げる

この記事は Laravel Advent Calendar 2014 の 24日目のエントリーです。

はじめに

11月から、仕事で Laravel 4 と 話題の Slack を使うようになりました。

ChatOps の第一歩として、 Slack の Integrations の機能を使って、メンバーの Commit / pullreq を #github channel に垂れ流すようにしました。
これがとっても便利で、他のエンジニアの方が何をしているか可視化されることで、業務効率も上がりました。
なにより、単純に楽しいということが大事ですよね。

こうなってくると、プロダクトのアラートメールなども一元的に Slack で受け取れるようにしたいな…と思ってきてしまいました。

Slack API の Incoming WebHooks

Slack は API を提供しており、自由に外部サービスからメッセージを投げることができたりします。
Incoming WebHooks を登録すると、token 込みの WebHook URL を取得できるので、それを使って、まずは試しに自分の Team の #general channel にメッセージを投げてみましょう。

webhookbot

こんな感じでメッセージが投げられたでしょうか。

Laravel 4 から メッセージを投げてみる

PHP から Slack へメッセージを投げるプラグインは、このページを見る限りでもずいぶんたくさんあります。
https://api.slack.com/community

この中でも、Laravel 4 で一番使いやすそうな maknz / slack を使わせてもらうことにしました。

インストールは README を見れば簡単にできます。
試しに Laravel から送信してみるための artisan command を書いてみました。
Webhook URL は、別途 Config から取得するようにしています。

README を見ればわかると思いますが、以下のように chaining して書くこともできます。

アラートメールの代替手段としての Slack

Slack の API は、1 request / sec までのリクエストしか受け付けてません。
厳密にコントロールされているかは分かりませんが、大量に送るのは考えものです。

https://api.slack.com/docs/rate-limits

今回は、アラートメールの代替手段として考えていたので、デプロイ直後などにアラートが飛びまくる可能性があることも念のため考慮しました。

以下のような感じで、 SlackHelper クラスを作ってしまい、Slack へのメッセージングはここで管理するようなイメージです。
連投を防ぐ手段としては、Slack にメッセージを投げるたびに /tmp/postslack という空ファイルを touch して、その最終更新日時を見ることで、メッセージを投げていいか判定しています。

エラーハンドリングは、 Laravel のドキュメントにある通り、ログリスナーを登録する形で行っています。
http://laravel.com/docs/4.2/errors#logging

Slack 最高

これで無事にアラートが Slack に投げられるようになりました。
アラート以外にも他の通知系でメールを使用している部分も少しずつ Slack に寄せたいなと思ったりしています。

余談

この package ですが、 json_encode の UTF-8 問題で、最初は日本語文字列が含まれている場合 false が返ってきてしまう不具合があり送信できなかったのですが、 issue 登録したら、すぐに対応してくれました!

https://github.com/maknz/slack/issues/4

さいごに

明日はついに最終日ですね!
@localdisk さんのポエムに期待しつつ、みなさん良いクリスマスを!

UNIX/Linux環境でcsv/tsvにクエリを投げることができるqが便利すぎて生きるのが辛い

UNIX/Linux環境でSQLコマンドが使えたらいいのに、と思ったことはありませんか?
私はあります。

10万〜100万行レベルのデータを集計したいけど、わざわざDBにぶっ込むほどではない。
そんな時は、awk, join, grep, paste, wc, uniqなどなどの各種コマンドを駆使して集計しています。

ちなみに、joinコマンドに関してはここに大変お世話になりました。
本当に便利すぎて生きるのが辛いです。

◆joinコマンドが便利過ぎて生きるのが辛い
http://d.hatena.ne.jp/yutakikuchi/20120907/1346975281

ただ、これが複数ファイルにまたがって処理をしたりして、複雑になってくるとだんだん何のデータを操っているか混乱してきます。
そんなときに、カジュアルにtsv, csvファイルに対してqueryを投げられたらいいのになぁと感じていました。

そんなときに、これを見つけました。

◆q – Treating Text as a Database
https://github.com/harelba/q

q という超絶短いコマンドのため、単語のググラビリティ(単語のググられやすさ/ググりやすさ。)が悪すぎて、あまり発見されないかもしれません。

俺が求めていたのはコレだぁ!
ということで、実務でも使っています。

もっと普及して欲しいので、インストール手順からちょっとした実行サンプルを紹介します。

久々に見てみたら、brewでインストールできるようになってました。下記インストール手順参照のこと。(2015/07/24 追記)
http://harelba.github.io/q/install.html

必要環境はPython 2.5以上か、SQLite3モジュールがインストールされているPython 2.4以上です。
(Python 2.5は、SQLite3が標準バンドルされています)

中身を見てみると、1行目にインタプリタの指定があります。
自分の環境は、2.4.3と2.7.1の両バージョンがインストールしてあるため、2.7.1で実行されるように変更します。

実行してみます。

動きました。

PATHを通します。

.zshrcに以下を追記。

パスが通りました!

Examplesが載っているので、試しにそのまま入力してみます。

おー!
素晴らしい。

% seq 1 1000

1
2
3
4
5
(略)
1000

を出力して、
これを標準入力として q に渡す。
c1というのが、カラムの1番目という意味なので、
avg(c1)で、1〜1000の総和の平均
sum(c1)で、1〜1000の総和が出力されています。

こんな風にgroup byも使える!

ちなみにawkでやろうとするとこうですか。

joinも書けます。

SQLに馴染みのある人はqを使ったほうがサクッと書けていいですね。

terminal