インデントの深さで色を変えるEmacs拡張つくりました

https://github.com/laysakura/indent-color-el
にて,インデントの深さに応じて背景色を変えてくれるEmacs Lispを公開しました.

深いインデントであっても色付けすれば見やすく「JavaScript Scope Context Coloring」 という記事を見て,「それってエディタでやることでしょ!!」と思ったときには気付いたらできてました.
手抜きスクリプトですが使ってあげてください.

改良して欲しい点

どんどんforkして改良して教えてください.
ダメな部分はこんな感じ.

  • 配色の設定が全然フレキシブルじゃない
  • そもそも配色がきもい
    • 途中から16進カラーコード考えるのすら諦めてる
  • インデント = 2個半角スペースという大胆さ
    • タブインデント派,4スペース派,8スペース派を断固無視
  • マイナーモードにするのがベストじゃないか説
    • メジャーモードごとのインデント方法に綺麗に対応
  • こんなの10行あれば書けるだろ

改良を切に願っております.

MySQL 5.6 で EXAMPLE ストレージエンジンを使ってみる

EXAMPLE ストレージエンジンは,ストレージエンジンを作成する人のためのテンプレートです.詳しくはこちら.
http://dev.mysql.com/doc/refman/5.6/en/example-storage-engine.html

今回は,MySQL 5.6 をソースからインストールすることを前提に EXAMPLE ストレージエンジンの導入について記します.
MySQL 5.6 の基本的なインストール方法はこちらをどうぞ.
http://d.hatena.ne.jp/laysakura/20130209/1360422816

インストール時の設定

インストールの際,cmake のフラグに "-DWITH_EXAMPLE_STORAGE_ENGINE" を付けます.

$ cmake -DWITH_EXAMPLE_STORAGE_ENGINE

あとは通常通り make && make install です.

インストール後の設定

mysqld サーバが立ち上がっていて,mysql クライアントで接続できていることを前提とします.
MySQL で使用できるストレージエンジンの一覧は,"show engines" コマンドで確認できます.

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

多分現時点で EXAMPLE ストレージエンジンは見えていないと思います.ですので,これから EXAMPLE ストレージエンジンを使用可能にする方法を書きます.

まず,"$basedir/lib/plugin/ha_example.so" が存在してることを確認して下さい.当環境では "/usr/local/mysql/lib/plugin/ha_example.so" がありました.
この状態で,MySQL のシェルに -u root として入り,次のコマンドを実行します.

mysql> INSTALL PLUGIN EXAMPLE SONAME 'ha_example.so';
Query OK, 0 rows affected (0.01 sec)

これで晴れて EXAMPLE ストレージエンジンが使用可能になったはずです.

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| EXAMPLE            | YES     | Example storage engine                                         | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

使ってみる

実際に使ってみましょう.
http://dev.mysql.com/doc/refman/5.6/en/example-storage-engine.html
のページと同じ事をします.

mysql> CREATE TABLE test (i INT) ENGINE = EXAMPLE;
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO test VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test;
Empty set (0.00 sec)

上記ページの記述と異なり,INSERT はエラーとなりません.仕様が変わったのでしょうかね?

MySQL 5.6 をソースからビルドする

所々で話題の MySQL 5.6 をソースからビルドしたので,その記録を書いておきます.
今回は MySQL 5.6.10 を使用しますが, MySQL 5.6.XX ならそんなに変わらないと思います.
Ubuntu での作業です.ディレクトリ構成など読み替えは適宜.

ソースの取得

1. http://dev.mysql.com/downloads/
2. "MySQL Community Server"
3. "Select Platform" リストボックスで "Source Code" を選択
4. "Generic Linux (Architecture Independent), Compressed TAR Archive"

ソースの展開

$ tar xvf mysql-5.6.10.tar.gz
$ cd mysql-5.6.10 

cmake, make, make install

MySQL は (確か最近のバージョンから) いわゆる "configure && make && make install" ではなく "cmake && make && make install" なインストール方法を採用してます.
cmake は configure のようなもので, Makefile を作ってくれます.
cmake が入ってなければパッケージインストーラなりで適宜.

$ # Ubuntu の例
$ sudo apt-get install cmake

cmake に付けられるオプション一覧は

$ cmake . -LH

で見ることができて便利です.好みに合わせてオプションをつけることとなるでしょうが,今回はこうしました.

$ cmake -DMYSQL_DATADIR=/var/lib/mysql

テーブルやログなどのデータが入る datadir だけ明示的に指定してます.*1

お次は make. MySQL は make の出力が pretty です :)

$ make 
Scanning dependencies of target INFO_BIN
[  0%] Built target INFO_BIN
Scanning dependencies of target INFO_SRC
[  0%] Built target INFO_SRC
...

警告こそ出るものの,エラーなく make が終わりました.

あとは make install です.インストール先を特に指定していないので,/usr/local/mysql/ 以下に色々とインストールされるようです.

$ sudo make install

起動するまでの諸々

流れとしてはこんな感じです.
1. /etc/my.cnf を作成
2. mysql ユーザ・グループを作成
3. mysql_install_db を実行
4. 起動スクリプトを仕込む
5. MySQL サーバ起動
6. クライアントからの接続チェック

/etc/my.cnf を作成

テンプレートがあるのでそれをコピーします.

$ sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf

MySQL 5.6 のテンプレートは随分と簡素ですので,以前から使っていた設定ファイルがある場合はそちらを使ったほうが良いかもしれません.
今回は最低限,basedir (インストール先) と datadir (テーブルやログが入る) を指定しておきましょう (必須かは知りません).

...
# These are commonly set, remove the # and set as required.
basedir = /usr/local/mysql
datadir = /var/lib/mysql
# port = .....
...
mysql ユーザ・グループを作成

MySQL を走らせる mysql ユーザとグループを作成しましょう.

$ sudo groupadd mysql
$ sudo useradd -g mysql -d /bin/false mysql
mysql_install_db を実行

mysql_install_db コマンドは,起動時に必要なデータを datadir に書き込むのですが,今回の作業では datadir にするつもりだった /var/lib/mysql/ ができていなかったので作成します.mysql ユーザ・グループにパーミションを与えるのも忘れずに.

$ sudo mkdir /var/lib/mysql
$ sudo chown mysql:mysql /var/lib/mysql

mysql_install_db コマンドを実行します.

$ sudo /usr/local/mysql/scripts/mysql_install_db

この出力で "OK" と二箇所で言われていれば大丈夫です.*2
この出力は割と重要なことを言っているのでしっかりと読んでおいて下さい.
このコマンドでできたファイルは所有者が root だったりするので,これらも mysql ユーザ・グループから読み書きできるようにします.

$ sudo chown mysql:mysql -R /var/lib/mysql/*
起動スクリプトを仕込む

起動スクリプトを仕込みましょう.

$ sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
MySQL サーバ起動

起動スクリプトから MySQL サーバを起動しましょう.

$ sudo /etc/init.d/mysqld start

エラーログは基本的に datadir 直下にあるはずなので,起動に失敗したらチェックしましょう.

クライアントからの接続チェック

接続チェックを行います.

$ /usr/local/mysql/bin/mysql -u root

MySQL のシェルに入れたら成功です.
ついでにテーブルを作ってみましょう.

mysql> use test
Database changed

mysql> create table foobar (a INT);
Query OK, 0 rows affected (0.52 sec)

mysql> insert into foobar values (777), (333);
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from foobar;
+------+
| a    |
+------+
|  777 |
|  333 |
+------+
2 rows in set (0.00 sec)

やり残したこと

現状,MySQL の root ユーザにパスワードが設定されておらず危険です.
http://www.yukun.info/blog/2008/10/create-user-grant-password.html
などにユーザ管理周りのことが書いてありますので,ご参照下さい.

*1:自分用メモ: 本当はこうした -> "cmake -DMYSQL_DATADIR=/var/lib/mysql=OFF -DWITH_EXAMPLE_STORAGE_ENGINE=ON -DWITH_DEBUG=ON"

*2:駄目だったら,昔作成した my.cnf が優先的に読まれていないかなどを確認して下さい./etc/mysql/my.cnf など怪しいです.