2012年8月26日日曜日

Perl Beginners #4 レポート



#3に引き続き発表してきました。資料
今回自分の発表のあとに出てきた質問について補足したいと思います。
(質問について補足できる場があるといいですね)


mixin(export)って具体的にどうやってるの


まずuseの話から。
useはrequireしたあとに、importメソッドを呼び出す。
use終わり。

useされる側のメソッドをuseした側のパッケージに移植する、という処理は自分でuseされる側のimportメソッドに書けってことです。
でも面倒なので大抵はExporterなどのモジュールで用意されてるimportメソッドを拝借します。

では動作を確認するために、Exporterのimportメソッドを見てみましょう。
Exporterのソース

はい、折れた!今君の心折れたネ!

以下に異なるパッケージにサブルーチンを移植するだけのコード置いときますのでお好きにどうぞ。
ここ

実行すると、mainって表示されますね。
mainにはexport_methodなんて定義してないのにmainのメソッドとして呼べているのがわかります。

MyExport.pmもimport文は2行。
callerで自分を呼び出した側の名前を取得して、
グロブを使って相手のパッケージにサブルーチンを登録しています。(エイリアス)

さて、グロブって何だよ死ねって思われたかもしれないですが、そこはperldocに譲りたいと思います。
http://perldoc.jp/docs/perl/5.8.8/perlmod.pod


使わなくなったモジュールを消したい


本当に使わなくなったかどうかを確認したいってことだと思うのですが、
無理☆という結論に。
使用されるモジュールというのは動的に決定されるので、すべてのケースを網羅したテストがあると可能ですが、じゃぁそのテストが完璧だっていうのはどうやって検証するのっていう、、、、。

動的な言語では全部無理じゃないかなぁ。

また根本的な話だと、使わなくなったモジュールを完璧に排除する必要は無いな、と思います。
動的なんで、ホントに使ってないならロードもされないですから。
(使ってない=useしてない、 排除=ライブラリソース自体置かない)





2012年8月7日火曜日

mysqld_multi

my.cnfを設定して、mysqld_multiを起動
sudo mysqld_multi start
sudo mysqld_multi report


mysqld_multi stop でshutdownしないので、両方のmysqlでやっておく。(passは設定してない状態)
mysql > grant shutdown on *.* to mysql@localhost identified by '';

レプリケーションの設定
マスターでユーザ作成
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@localhost IDENTIFIED BY 'repl';

マスターのデータコピー。このときマスターに変更がないようにテーブルロックか、インスタンス落とすかしておく。
sudo mysqld_multi stop
sudo cp -aR /var/lib/mysql/* /var/lib/mysql_repl1/

show master statusで確認、
file: mysql-bin.000003
position:106

CHANGE MASTER TO MASTER_HOST= 'localhost', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=106