去年の12月にLet’s Encryptがパブリックベータ版に移行したというのがニュースになったとき、管理しているサイトの1つ(stingrays.tokyo)を使って試してみようかなぁと思ったものの、いろいろ忙しかったのもあり早2ヶ月が経ってしまったが、FacebookのTLでちょうど環境が一致するチュートリアルのブログポストを見つけたので、本家のドキュメントを読みつつ手を動かしてみた。
結論を先に言うと、ちょっとつまづいたけど簡単にできた。
去年の12月にLet’s Encryptがパブリックベータ版に移行したというのがニュースになったとき、管理しているサイトの1つ(stingrays.tokyo)を使って試してみようかなぁと思ったものの、いろいろ忙しかったのもあり早2ヶ月が経ってしまったが、FacebookのTLでちょうど環境が一致するチュートリアルのブログポストを見つけたので、本家のドキュメントを読みつつ手を動かしてみた。
結論を先に言うと、ちょっとつまづいたけど簡単にできた。
状況に応じてフォームの送信先URL(formタグのaction属性値)のクエリーストリングを書き換えるという処理をするために、こんなJavaScriptを書いてみた。
function updateQuery(query) { var form = document.forms[0] , action = document.createElement('a') ; // オリジナルの送信先URLからパス部分を切り出して、クエリーストリングだけを書き換える。 action.href = form.getAttribute('action'); form.setAttribute('action', action.pathname+'?'+query); }
しかし、
という条件下では、フォームを送信した時にIEでだけ「404 Not Found」になってしまった。
Zend FrameworkでWebアプリを作ることになり、久しぶりにZend Frameworkのリファレンスを見ながらコードを書いていたのだが、ものすごく単純なことなはずなのにZend_Db_Select
の仕様(?)のせいでちょいとハマっていた。
Webアプリではお決まりのユーザー管理機能なんだが、話を単純にするためにやりたいことだけに焦点を当てるために、以下のようなroles
テーブルとusers
テーブルがあるとしよう。
CREATE TABLE roles ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE ); CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE role INT FOREIGN KEY REFERENCE );
ユーザーにロールを割り当てる典型パターン。
で、やりたいことは、
ロールの一覧表示をする際に、そのロールが割り当てられているユーザー数も出したい!
本ブログをホストしているサーバー業者内でプランをアップデートしたのでWordPressを旧サーバーから新サーバーへ引っ越しをした。旧サーバーのMySQLのバージョンが古かったせいで、ずっとWordPressを3.1からアップデートできない状況だったが、新サーバーに引っ越したら最新バージョン(本エントリの執筆時点では4.0)にようやくアップデートできるようになる。ただし、今回はサーバー移転がメインなので、WordPress自体は同じバージョンのまま移行。
WordPressの引っ越しの手順はググればいくらでも見つかるが、
というのが大まかな流れ。
自分の知らないところで、あるコマンドが実行されているということはLinuxでは珍しいことではない。代表的なのはcron
だ。ただ、cron
ならcrontab -l
をしたり、直接/var/spool/cron/crontabs/*
を調べれば、どんなコマンドが実行されるかすぐに調べがつく。しかし、あるイベントが発生したことをトリガーにしてコマンドが実行された場合、なぜそのコマンドが突然呼ばれたのかということに困惑することがある。
例えば、ifup
コマンドが実行された場合、/etc/network/if-pre-up.d
と/etc/network/if-up.d
配下にあるコマンドが、ifup
の実行中に呼び出されるようになっている。あるコマンドが実行されていることはログなどからわかっているが、どのような経緯で実行されるに至ったかがわからない、という場合には、そのコマンドの親プロセスを辿っていけば調べることができる。
公開鍵/秘密鍵を使ってリモートのSSHサーバーにアクセスする場合、秘密鍵にアクセスするためのパスフレーズを聞かれるようになる。Xが立ち上がっている端末であれば、初回の秘密鍵アクセス時にのみパスフレーズを聞かれるのだが、例えばリモートのSSHサーバーから更に別のSSHサーバーにアクセスしたい場合は、SSHで接続する都度パスフレーズを聞かれて面倒になることがある。
今使っている環境では、メインのLinuxマシンの上で仮想マシン(Linux)を動かしていて、仮想マシンにSSHで入って開発をしている。gitリポジトリはまた別のサーバーにあって、そこにもSSHでつなぐ必要がある。リモートのgitリポジトリにアクセスする度に、パスフレーズを聞かれるのがウザかったので、仮想マシンにSSHでログインした後、手動でssh-agent
を立ち上げてssh-add
で秘密鍵を登録(このときパスフレーズを聞かれる)していたのだが、この手作業自体がまた面倒になった。
express-resourceを使って効率よくREST APIを実装できるようにするためのexprestというnodeパッケージをNPMで公開してみた。と言っても、リリースしたのは2ヶ月も前の話。使い方などはREADME.mdに英語で書いておいたが、英語が苦手な人のために日本語の対訳を書いておこう。
設計編からだいぶ間があいてしまったが、routes/auth.js
に枠組みだけ作ったauth
モジュールの実装を埋めていこう。
スタート地点はこの段階。
module.exports = function(models) { var User = models.user; return { signup: function(req, res) { } , login: function(req, res) { } , logout: function(req, res) { } }; };
久しぶりにC++ネタ。JSONを生成するプログラムをC++で書こうなんて人がそもそもいない気もするが、boost::property_tree::write_json()
を使うと簡単にJSON出力ができる。
#include <iostream> #include <sstream> #include <boost/property_tree/json_parser.hpp> using namespace std; int main(int argc, char *argv[]) { if(argc < 2) { cerr << "Usage: " << argv[0] << " message" << endl; return 1; } boost::property_tree::ptree pt; pt.put("message", argv[1]); boost::property_tree::write_json(cout, pt, false); return 0; }
Sequelizeを使う準備が整ったところで、どんなWebアプリを作るにしても避けて通れないであろうユーザー認証の仕組みを実装していく。
大まかな流れはこんな感じ。
User
モデルを定義する