CONVERT_TZ() が正しい結果を返さないときの対処法
4.10.8. MySQL サーバのタイム ゾーン サポートにある例のクエリを投げたところ、CONVERT_TZ() の結果が NULL になってしまっていました。
> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); +-----------------------------------------------+ | CONVERT_TZ('2004-01-01 12:00:00','GMT','MET') | +-----------------------------------------------+ | NULL | +-----------------------------------------------+ 1 row in set (0.00 sec)
調べてみたら 4.5.5. mysql_tzinfo_to_sql ― タイム ゾーン テーブルのロード というのがあるらしいので、試しに下記のクエリを投げてみたところ、テーブルが空でした。
SELECT * FROM mysql.time_zone;
ということで、下記コマンドを実行し、無事期待通りの動作をするようになりました。
mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql
> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); +-----------------------------------------------+ | CONVERT_TZ('2004-01-01 12:00:00','GMT','MET') | +-----------------------------------------------+ | 2004-01-01 13:00:00 | +-----------------------------------------------+ 1 row in set (0.00 sec)
MySQL Casual Talks #1 発表資料
MySQL Casual Talks #1 の発表資料を UP しました。
資料の中でも言及しました、hirose さんが作成された mymemcheck という素晴らしいツールを !includedir に対応して Readonly.pm 依存を無くしたバージョンを github の こちらにあげてあります。
Nginx で Elastic Load Balancing などの Proxy の内側で正しい IP アドレスを取得する
EC2 だと ELB の内側では、nginx のアクセスログに ELB の IP アドレスが記載されてしまうので、HttpRealIpModule を使って Apache の mod_rpaf、lighttpd の mod_extforward と同じような挙動を設定します。
configure オプションに
--with-http_realip_module
が必要ですので、nginx -V で configure オプションを確認して、入っていなかったらコンパイルし直しましょう。
実際の設定は以下です。set_real_ip_from に ELB など Proxy やロードバランサーの IP を指定します。real_ip_header には、X-Real-IP や X-FORWARDED-FOR など Proxy が追加するヘッダーを指定してください。
http { set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; }
[2015-02-10 追記]
VPC で複数のサブネットを指定したい場合は下記のように複数行で記述する。
http { set_real_ip_from 10.0.1.0/24; set_real_ip_from 10.0.4.0/24; real_ip_header X-Forwarded-For; }
warning メッセージ予防策
普段、wanrning を見つけるたびにせっせと defined 挟んだりして対応しているのですが、View の中で呼ばれてる箇所など、うっかり気付かないで数日過ぎてしまうと、あとで該当箇所を追うのが若干手間になってしまったりします。
そこで、
use warnings FATAL => 'all';
の出番なのですが、全部のパッケージに記述するのも面倒なので、下記のようにして使っています。
package MyApp; use strict; use warnings; sub import { strict->import; warnings->import('FATAL' => 'all'); } 1;
package MyApp::Foo; use MyApp;
Macbook Air 11'' を Ubuntu 10.10 とデュアルブートにしたまとめ
あまり日本語情報も無いようなので、メモ書き程度に紹介しておきます。新型 Macbook Air 11'' に Ubuntu 10.10 サーバー版 64bit をインストールしました。Boot Camp は使っていません。
大まかな流れは、
となります。
Windows とのトリプルブートにしたい場合は、Linux インストールの前段階で行うようですが、詳細調べていないので割愛します。
以下詳細です。
事前準備
- Ubuntu の OS イメージを USB メモリに準備しておく
- ISO から起動可能な USB メモリとして作成するには、ISO 配布ページの「Burn your CD or create a USB drive」の項に詳しく書いてあります。
- インストールプロセスで有線 LAN を使った方がスムーズなので、USB イーサネットアダプタを準備しておく(試していませんが、WLAN で進めようとするとドライバ周りとか多分面倒です。)
- 普通に初回電源オン時の Mac 初期化プロセスを終えておく。(「ようこそ」から始まる一連のプロセス)
Mac 上での設定
Ubuntu のインストール
ディスプレイの設定
GUI 環境のセットアップ
各種ドライバのインストール
- Macbook Air 用のドライバは mactel ppa で配布しているので、下記で USB, Bluetooth, マルチタッチトラックパッドなどのドライバを一通り入れてくれる
sudo apt-add-repository ppa:mactel-support/ppa sudo apt-get update sudo apt-get upgrade
- サウンドは、alsamixer を起動し、矢印左右キーで「Front Sp」を選択し、M キーで有効化し、矢印上下キーで音量を上げれば鳴るようになる
- GUI メニューの、システム管理 → ハードウェア管理 で nvidia のビデオドライバと Broadcom の無線 LAN ドライバを自動で入れてくれる(ここからようやく無線 LAN の出番)
- 有線 LAN から有効にしているので、有線 LAN が eth0 無線 LAN が eth1 に割り当てられている
- eth0 と eth1 の名前を入れ替えたい人は /etc/udev/rules.d/70-persistent-net.rules と /etc/network/interfaces を編集して /etc/init.d/networking restart で入れ替える
- 無線 LAN の設定をするときに、全ユーザーで使えるようにするにチェックを入れておくと、後でテキストログインに変更した後も、自動で接続してくれる
swap 領域の設定
- swap ファイルを作成する(下記は 4GB)
sudo dd if=/dev/zero of=/swapfile bs=1024 count=4194304 sudo mkswap /swapfile
- /etc/fstab に追加。ついでにルートパーティションのマウントオプションに noatime,nodiratime 辺りを追記しておく
/swapfile swap swap defaults 0 0
各種ソフトウェアインストール
- VNC, Google Chrome, 日本語入力の Mozc, Flash Plugin, ターミナル用フォントなど適当に
まとめ
mactel のお陰様で大分楽に Macbook Air への Ubuntu インストールが出来るようになっています。調査には時間がかかりましたが、実際作業を始めたら割とスムーズに行ったと思います。無線 LAN や、nvidia ドライバ、マルチタッチトラックパッドやサウンドなどはすぐに使えました。音量調整もファンクションキーから行えます。
Test::mysql で起動したインスタンスに mysql クライアントで接続するとテストがさらに快適に
昨日書いたエントリ、Test::mysqld を別ウィンドウで立ち上げたら開発時の prove が快適過ぎる件ですが、prove とか make test がコケたりしたときに、実際に DB の中身がどうなってるか見れた方がデバッグが捗りますよね。
加えて、どうせなら使い慣れた mysql クライアントでテストの結果、テーブルがどうなっているか見たいですね。
ということで、テスト用に立ち上げた mysqld に手軽に接続できるスクリプトを書いてみました。
#!/usr/bin/env perl use strict; use warnings; use File::Spec; use JSON; my $tempfile = File::Spec->catfile(File::Spec->tmpdir, 'test_mysqld.json'); open my $fh, '<', $tempfile or die $!; my $json = decode_json(join '', <$fh>); close $fh; my @command = qw(mysql --user root --socket); push @command, $json->{'my_cnf'}{'socket'}, 'test'; exec @command;
こんな感じのスクリプトを、t/script/test_mysql.pl とか適当な名前で保存してパーミッション与えて下さい。
t/script/mysqld_runner.pl が立ち上げた mysqld はプロセス再起動するだけで、まっさらな状態に戻せるので、デバッグ用途だけでなく、サンドボックス的に色々実験する用途にも向いているので、色々と遊べて良いと思います。
これで、Test::Fixture::DBI によるテストがより快適になりました。
ハッシュのキーとバリューを入れ替える方法
[追記] reverse() を使う方法の方が速くて簡潔でお勧めです! id:tomi-ru++
あまり必要になるケースは無いと思いますが Tips です。
use strict; use warnings; use Test::More; my %a = ( foo => 1, bar => 2, baz => 3, ); my %b; @b{ values %a } = keys %a; # スライスで入れ替え is_deeply(\%b, { 1 => 'foo', 2 => 'bar', 3 => 'baz', }); done_testing;