MySQL や DB の勉強におすすめの本

最近、Database の勉強に迫られており、当方全くDBについて知らないのでとりあえず MySQL を扱えるようにしようということで(この WordPress だって、MySQL が裏で動いているし…。この書いている言葉は MySQL さんが保存しているはず)、いろいろと本を探してみた(たぶん将来的には Apache Cassandra を使うけれど)。

ちなみに Web で学べるじゃん、というのが最近の風潮ではあり、それを否定するつもりはないが、体系的に学びたい時にはまだまだ本という形式は有効だと思う。最近では、本というものは不揮発性の極めて薄いモニタを重ねたものと解釈していて、それはそれで使えるのである(そのうち電子書籍やモニタとかと比較表を作る予定^^;)。

でまあ、いろいろと調べてみたら、基礎からのMySQL 改訂版 by 西沢 夢路 がお勧め。現在50ページほど読み終えたけれど良い感じ。実際に実行できる短いサンプルコードが多数掲載され、それを学習者が打ってみて勉強する形式になっている。それと、語り口がいい。たとえば、↓こんなん(p43)。

実行すると、「Database changed」(データベースが変わったよ)と表示されました。もともと何も選択していなかったのに changed というのも変ですが、気にする必要はありません。


と書いてある。このように、「changed って書いてあるけどなんだろう?」と読者が感じる疑問に答えている。こういったちょっとしたことほど気になるものだ。

↓こちらです。


[追記@2012-08-08]
やっとこの本の MySQL の部分は終えて、SQL 文とはどういうものかなど分かった。ところでこの本、ほんとうに丁寧である。一部抜粋してみる↓。

たとえば「insert into tb1 values (‘A101′, …)」というSQL文を発行するときは、どのように記述すればよいでしょうか? SQL文は文字列データなので、「’ ‘」で囲むとします。「’ ‘」が使われているSQL文をさらに「’ ‘」で囲ったとすれば、これはエラーになってしまいます。

mysql_query(‘insert into tb1 values(‘A101′, …)’)
↑「’ ‘」を「’ ‘」で囲むとエラー

この場合、「\」でエスケープするか、あるいは次のように、内側の「’」を文字として扱うために外側を「” “」で囲むなどの対策が必要となります。

mysql_query(“insert into tb1 values(‘A101′, …)”)
↑「’ ‘」を「” “」で囲めばOK

あるいは、内側の「”」を文字として扱うために外側を「’ ‘」で囲むこともできます。

PHP + MySQL の利用時に最初につまづくのは、こうした「’」や「”」の使い方であることも珍しくありません。mysql_query関数については以降で勉強しますが、ここでは「’」の文字を「’ ‘」で、あるいは「”」の文字を「” “」で囲うのは御法度!ということを覚えておいてください。


↑このような細やかな気遣いは助かる。何度も同じ事を書いていて冗長だと言う意見は却下である、なぜなら混乱するよりは冗長であるほうがずっと良いからである。このような意見を言う者は、紙が貴重だった時代の価値観で止まっている老害と言わざるをえない。

MacPorts 経由でインストールした MySQL5 が上手く動かない件を解決

追記@2012-09-13:解決策がありました。
こちら


———-追記@2012年8月8日———-
どうやら、php54-mysql を事前にインストールしていれば、下に記述した mysqld.sock の書き換えはいらなそうである。sudo port install php54-mysql と打つと以下のようになる↓

[Users/hoge] > install php54-mysql
--->  Computing dependencies for php54-mysql
--->  Fetching archive for php54-mysql
--->  Attempting to fetch php54-mysql-5.4.5_0+mysqlnd.darwin_10.x86_64.tbz2 from http://packages.macports.org/php54-mysql
--->  Attempting to fetch php54-mysql-5.4.5_0+mysqlnd.darwin_10.x86_64.tbz2.rmd160 from http://packages.macports.org/php54-mysql
--->  Installing php54-mysql @5.4.5_0+mysqlnd
To use mysqlnd with a local MySQL server, edit /opt/local/etc/php54/php.ini and set
mysql.default_socket, mysqli.default_socket and pdo_mysql.default_socket
to /opt/local/var/run/mysql5/mysqld.sock
--->  Activating php54-mysql @5.4.5_0+mysqlnd
--->  Cleaning php54-mysql
--->  Updating database of binaries: 100.0%
--->  Scanning binaries for linking errors: 100.0%
--->  No broken files found.

↑これによると、/opt/local/etc/php54/php.ini を編集して、
– mysql.default_socket
– mysqli.default_socket
– pdo_mysql.default_socket
の項目について、 = /opt/local/var/run/mysql5/mysqld.sock
とすれば良いみたいである。実際にやってみたら動いた。

結論としては、MacPorts で MySQL5 を 入れる場合、 php-mysql を入れておくと吉ということだろうか。いまいちよく分かっていないが…。
———-追記おわり———-


———-本編ここ↓から———-

$ sudo port sync
$ sudo install mysql5 +server

てな感じで MySQL をインストール(結構時間が掛かる)して、
$ sudo mysqladmin5 -u root password 1234
Password:
mysqladmin5: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/opt/local/var/run/mysql5/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/opt/local/var/run/mysql5/mysqld.sock' exists!

↑のように、パスワードを1234に設定しようと思ったら(練習用+ローカルなので適当パスワード)、エラーが出て詰んでいた。

mysqldが走っているか、それか ‘/opt/local/var/run/mysql5/mysqld.sock’ が存在しているか調べろボケと怒られているわけだ。確かに、’/opt/local/var/run/mysql5/mysqld.sock’ が存在していないようである。

なんかいろいろと調べてみると、/tmp/mysql.sock は自分のローカルに存在している。なので、
$ sudo nano /opt/local/etc/mysql5/my.cnf 
↑の中で、

[client]
port            = 3306
#↓追加した項目
socket          = /tmp/mysql.sock
#↓追加した項目
default-character-set=utf8

[mysqld]
port            = 3306
#↓追加した項目
socket          = /tmp/mysql.sock
skip-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K

#↓追加した項目
default-character-set=utf8
#↓追加した項目
skip-character-set-client-handshake

server-id       = 1

[mysqldump]
quick
max_allowed_packet = 16M
#↓追加した項目
default-character-set=utf8

[mysql]
no-auto-rehash
#↓追加した項目
default-character-set=utf8

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout
↑という感じに、「socket = /tmp/mysql.sock」と文字コードを追加してみた(ちなみに↑からコピペするときには、空白行にスペースが入っているので正常に解釈されない場合があるので気をつけてください)。加えて、ついでにutf-8にしてみた。そして、mysqld をリスタートしようとしたのだが、なんかエラーが出るので、アクティビティモニタからmysqldの終了を行った。そして start してみた↓
sudo /opt/local/share/mysql5/mysql/mysql.server start

↓次に以下のようにしてみると、
$ sudo mysqladmin5 -u root password 1234

特にエラーもなく通って、やっと MySQL にさわれそうになったわけである。

status を見てみると↓に。utf8になっているのが分かる。
macbook:~ mk$ mysql5 -u root -p1234
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.63 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> status
--------------
mysql5  Ver 14.14 Distrib 5.1.63, for apple-darwin10.8.0 (i386) using readline 6.2

Connection id:		2
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.1.63 Source distribution
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql.sock
Uptime:			2 min 36 sec

Threads: 1  Questions: 8  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 4  Queries per second avg: 0.51
--------------

# 本当のことを言えば、Apache Cassandra を使用する予定なのですが…。DB のことを全く知らないのでひとまず MySQL で勉強してみようという魂胆なのです。

ついでにリスタート方法はこちら↓
$ sudo /opt/local/share/mysql5/mysql/mysql.server restart

Mac にて PHP5.4 と NetBeans 7.2β で快適な PHP 環境を構築

NetBeans7.2とPHP5.4の組み合わせが素晴らしい件
http://d.hatena.ne.jp/nowokay/20120531

↑この記事に触発されてやってみた。

Windown7 の方は割とあっさりできるようになった(しかしなぜかブラウザが Opera だとだめ。それ以外のブラウザだと行ける)。

手順としては、PHP5.4 を MacPorts でインストールして(MacPorts の使い方は検索してみてください。ターミナルで、sudo port install php54、という感じ)、適当なフォルダに展開して置いておいて、NetBeans 7.2β をダウンロードしてきて(http://dlc.sun.com.edgesuite.net/netbeans/7.2/rc/ ←の PHP のところ)、インストールして、NetBeans の「設定」→「PHP」で先ほど落としてきた PHP5.4 を指定してやれば出来た。つまり上記のエントリーの通りやってみたら出来た。

しかし、なぜか Mac だと上手く行かなかった。

私の手順としては、macports で php5.4 をダウンロード、NetBeans 7.2βをインストール、そしてNetBeans 7.2βの方で php5.4 を指定、なのだが何故か上手く行かず。

結論しては、NetBeans の方で、/opt/local/bin/php54 を指定してやれば正常に動作した。動作しなかった構成は、/opt/local/bin/php としていたときである。

というわけで備忘録的に手順を書いておく。

まずは↓のように macports でインストール。macports はバイナリが/opt/に入るので注意。

[hoge] $ sudo port sync
〜中略〜
[hoge] $ sudo port install php
〜中略〜
--->  Activating php @5.4_1

次に NetBeans 7.2βを落としてきて、最初に引用したエントリーのように、/opt/local/bin/php54 と指定してやればOK。

自分のウェブサーバーをバックアップ

———-追記ここから———-
@2012年10月21日

素直にGitなど使えばいいと思います…日付で管理とか原始的でした。しないよりはだいぶマシですが。
———-追記ここまで———-

ファーストサーバーじゃないけれども、サーバーは壊れることがしばしば。バックアップはしておきたい。WordPress は SQL を使うので、外から wget で保存したほうが良さそう。

cron を使って以下↓の様な wget をすれば何とか修復できるだろう。

-r はウェブページ全部を取ってくるオプション。
-P は、保存先の指定。./20120716 ってのは日付のつもり。フォルダはこれで勝手に作ってくれるみたい。

こんな↓スクリプトを週に一度ぐらい走らせるといいのではないか。

wget -r example.com -P ./20120716

さくらのVPS、月々980円のスペックがすごい

[root]# cat /proc/cpuinfo 
model name	: Intel(R) Xeon(R) CPU           E5645

[root]# cat /proc/meminfo 
MemTotal:        1020580 kB
MemFree:          273084 kB

[root]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/vda3            100893076   1896256  93871652   2% /
tmpfs                   510288         0    510288   0% /dev/shm
/dev/vda1               247919     50184    184935  22% /boot

[root]# hdparm -tT /dev/vda3
/dev/vda3:
 Timing cached reads:   9956 MB in  2.00 seconds = 4983.29 MB/sec
 Timing buffered disk reads:  1062 MB in  3.00 seconds = 353.61 MB/sec

[root]# hdparm -tT /dev/vda1
/dev/vda1:
 Timing cached reads:   10246 MB in  2.00 seconds = 5128.09 MB/sec
 Timing buffered disk reads:  250 MB in  0.70 seconds = 355.58 MB/sec

E5645 と言えば、6 core CPU。それなりの速度。メモリは1GBだけれども、ストレージが早い!これってもしかすると SSD なんじゃないだろうか。HDD で RAID でも不可能な速度ではないが…これだけのマシンが月々980円なのはたいへん素晴らしい。

自宅の Atom N2800 サーバーでも24時間つけっぱなしだと月々400円程度になるので、このさくらのVPSは破格と言えるだろう。さらに IP アドレスと高速な回線も含んでいる。赤字なのではないかと心配してしまうレベル。おそらくフリーミアムモデルライクな料金プランにしたのだと思うけれど。つまりは、安いけどメモリを小さくして(980円/月の鯖は1GBのDRAM!)不満を抱かせて、上のプランに変更させる作戦である。

ほんとクラウド業界はレッドオーシャンだなぁ^^ 得するのは消費者だけなのでは。