256bitの殺人メニュー

インフラエンジニアだったソリューションアーキテクトなくわののブログ。こちらのBlogは個人の意見となっていて会社とは全く関係ありません。お約束です。[twitter:@kuwa_tw]めんどくさがりが重い腰を上げて何かをアウトプットすることにどれほどの意味があるのかを試してみたいブログでもある。

MySQLでトリガ使って別テーブルに自動でコピる

はい、おつカレーさまさまです。桑野です。
ブログを更新できなくて落ち込んだりもするけれど私は元気です。


もんごさんとかもんご野郎とかよく言われる昨今ですが最近久しぶりにMySQLを触っているのでその話を。
そーいえばMySQLのトリガ設定とかほぼやったことなかったので、メモ書き。

トリガとは

トリガというのは、特定のテーブルにある操作(UPDATE,INSERT,DELETE)が行われた時にイベント駆動的に実行される機構のことですね。

トリガ作成

CREATE TRIGGER で作成されます。

トリガの設定

下準備

GRANT でトリガを設定するユーザにTRIGGER権限を与えておきましょう。

GRANT TRIGGER ON `user`.* TO 'dbuser'@'192.168.0.%' IDENTIFIED BY 'dbpass';
元テーブル定義
mysql> CREATE TABLE `usermaster` (
	  `user_name` varchar(255) NOT NULL,
	  `user_id` int(10) NOT NULL,
	  `type` int(10) DEFAULT NULL,
	  `status` int(10) DEFAULT NULL,
	  `upd_datetime` datetime NOT NULL,
	  PRIMARY KEY (`user_id`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8 

複製先テーブル作成

同じテーブル定義のテーブルを作成します。

mysql> CREATE TABLE usermaster_cs LIKE usermaster;

TRIGGER設定

注意
  • 変更前の行のデータはOLDに、更新、挿入される新しいデータはNEWで表現される
  • TRIGGERは [AFTER / BEFORE] * [INSERT/UPDATE/DELETE]の条件で1つしか設定できない
  • もし複数SQL実行したいならBEGIN〜ENDでまとめよう
TRIGGER作成[INSERT]

AFTER / BEFORE で、イベント実行後、前にTRIGGERを実行するか設定できます。
これはINSERT用。適当に書いちゃったけど良い書き方ないかなぁ。

mysql> 	DELIMITER |
mysql> 	CREATE TRIGGER userm_insert AFTER INSERT
	 ON usermaster FOR EACH ROW
	 BEGIN
	 INSERT INTO usermaster_cs SET 
	   `user_name`=NEW.`user_name`, 
	   `user_id`=NEW.`user_id`, 
	   `type`=NEW.`type`, 
	   `status`=NEW.`status`, 
	   `upd_datetime`=NEW.`upd_datetime`;
	 END;
	|
mysql> 	DELIMITER ;
TRIGGER作成[UPDATE]

こっちはUPDATE用、大して変わらん。

mysql> DELIMITER |
mysql> CREATE TRIGGER userm_update AFTER UPDATE
	 ON usermaster FOR EACH ROW
	 BEGIN
	 UPDATE usermaster_cs SET 
	   `user_name`=NEW.`user_name`, 
	   `user_id`=NEW.`user_id`, 
	   `type`=NEW.`type`, 
	   `status`=NEW.`status`, 
	   `upd_datetime`=NEW.`upd_datetime`
	   WHERE `user_id`=OLD.`user_id`;
	 END;
	|	
mysql> DELIMITER ;

テスト実行

INSERT確認
ますたーでINSERT
mysql> INSERT INTO usermaster SET 
	   user_name="kuwano", 
	   user_id=1000000, 
	   type=7, 
	   status=1, 
	   upd_datetime="2014-01-17 00:00:00";
すれーぶで確認

はいっとるはいっとる。

mysql> SELECT * FROM usermaster_cs WHERE user_name="kuwano";
UPDATE確認
ますたーでUPDATE
mysql> UPDATE usermaster SET 
	   user_name="mongo", 
	 WHERE user_id=1000000;
すれーぶで確認

かわっとるかわっとる。

mysql> SELECT * FROM usermaster_cs WHERE user_name="kuwano";
mysql> SELECT * FROM usermaster_cs WHERE user_name="mongo";

運用系

トリガの削除

DROP TRIGGERで行うます。
IF EXISTSでuserm_insertトリガがあるなら削除です。

mysql> DROP TRIGGER IF EXISTS userm_insert ;
トリガの設定確認

トリガの設定確認がしたい場合はSHOW TRIGGERSで。

mysql> SHOW TRIGGERS;
(snip)

| userm_insert | INSERT | usermaster | 
 BEGIN
 UPDATE usermaster_cs SET 
   `user_name`=NEW.`user_name`, 
   `user_id`=NEW.`user_id`, 
   `type`=NEW.`type`, 
   `status`=NEW.`status`, 
   `upd_datetime`=NEW.`upd_datetime`
 END                                                                                   | AFTER  | NULL    |          | root@localhost | utf8                 | utf8_general_ci      | utf8_general_ci    |

| userm_update | UPDATE | usermaster | BEGIN
 UPDATE usermaster_cs SET
   `user_name`=NEW.`user_name`, 
   `user_id`=NEW.`user_id`, 
   `type`=NEW.`type`, 
   `status`=NEW.`status`, 
   `upd_datetime`=NEW.`upd_datetime`
   WHERE `user_id`=OLD.`user_id`;
 END | AFTER  | NULL    |          | root@localhost | utf8                 | utf8_general_ci      | utf8_general_ci    |

余談

実行がそもそも走ってるかどうかよくわからん時はテスト時だけはgeneral_logとか有効にしてみるといいよ。

my.cnfで以下を有効に。

general_log = On
general_log_file=general.log

もしくは、SET GLOBALで。

SET GLOBAL general_log = 'ON';

ではでは三(卍^o^)卍ドゥルルルル

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

『インフラエンジニアの教科書』この本をなんと呼ぶ?教科書と呼ぶ!

ぼくがいわゆる、インフラエンジニア。サーバサイド等をやるエンジニアになった時に何かに詰まったり、気になった事ができた時にGoogleで検索して、良く出てくるページが有ったんです。それは「sanonosa システム管理コラム集」でした。
その頃はインターネット上の情報もそんなに多くなくて、sanonosaさんの知識は幅広いしありがたいなぁ、と思ってました。
それから、ぼくのRSSリーダー(その頃はWebで見れるRSSリーダーってあんまりなかったですねw)には長らく、 @ さんのブログは入っていたと記憶しています。


その@ さんの書いたインフラエンジニア向けの本が出るということで、もし初心者向けだったとしても買うしかない、と思って即決で買った本が、こちらの『インフラエンジニアの教科書』です。



インフラエンジニアの教科書

インフラエンジニアの教科書


初心者向けだったとしても、みたいなことを言いましたが、結論から言うと、現役のインフラエンジニアでも読んで損はない本だよ、と言う本でした。
ホントすいません(; ・`ω・´)

概要

インフラエンジニア、と言われている職種がどのような仕事をし、それを実現するためにどのような知識が必要なのかを網羅的に説明している本になります。

内容

まず最初に思ったのは、インフラ技術にフォーカスした本は多くても、インフラエンジニアと言うテーマに沿った本、というのはあんまり無い本だなぁと。
そして、さらにいうと、購買関連の知識まで書いた本というのはエンジニア向けの本としてはあんまりみたことなくてカバー範囲すげぇ!と本当に感心しました。


多かれ少なかれ、技術書、というのはハウツー本、の様相を呈しているものだとおもいますが、この本は、教科書です。
教科書には、やり方だけではなく、本質的な事もかいてあります。
もちろん、一つ一つの事柄にはもっと深い理由や、細かい事象が存在しています、ですが、教科書に必要なことは、あるテーマに対して全てを網羅し、必要な事に対するとっかかりを残しておくこと。だと思っています。
この本はサーバ、ネットワークから始まり、セキュリティ、運用、購買、商談、ファシリティ、セキュリティ、データセンタ。
これだけの内容を200ページ足らずの1冊に含めて、説明できていることが、脅威です。


もちろん、これだけの内容の全てを語りきれてはいないかもしれませんが、これぞ、まさに、教科書です。
「教科書」が達成できていると感じました。


さらに、最初に書いたようなエンジニアである@ さんの知見が随所にみられ、自分の知識と照らし合わせることで正しいのかな、どうなのかな?と考えながら読み進めるだけでも面白くためになる本でもあります。
非常に読みやすいため、飽きずに最期まで読めてしまいました。


ぼくらの業界では時間の流れが早い事もあって、こういった根本的な部分って業務で触るまで何があるのか、わからんとなることも多く、それって世界を無駄に狭くして(た|る)よなーって思うことがあります。こういった本があることで、そうかー、こういう仕事をしていくといいのかな?とかこういう仕事をしたい!とかそういった事を考えるキッカケになるかなーと思います。*1

まとめ

これから、少なくともインフラエンジニアといわれている(この呼び方には賛否がある方もいるかと思いますが、サーバサイド、から物理層、のレイヤーが下よりの)エンジニアを目指している方、現在そのような仕事をしている方には勉強、共感、比較、いろんなことができる本だと思いますので是非読んでみてはいかがかと思います。


最後に、、、サインくださいm(_ _)m

インフラエンジニアの教科書

インフラエンジニアの教科書


中国超人インフラマン [Blu-ray]

中国超人インフラマン [Blu-ray]

*1:本来現場の人間がちゃんとやれよって話ではあるんですけど、、、なかなか難しいことも多いですよね(;´Д`)

pyenv+virtualenv環境の作成方法まとめマン

はい、おつカレー様です。
桑野です。
最近暑いですね、カレーが捗りますか?ぼくは捗ってます。


最近PythonでWebアプリを書いたりもしているんですが、環境構築についてちょこちょこまとめておこうと思いまして書きます。

今日はpyenvの環境作成について、、、要するに自分メモですw

pyenv

Pythonでアプリやら、スクリプトやら使うのにpyenv環境、本番とかでもCentOS6でも使われるPythonは2.6系だったりして、3.3とか、2.7系を使いたい時にいちいちRPMビルドをしたくないし、Pythonのバージョンアップしたい時等、環境もわかりやすくなるし、ぐちゃぐちゃになったら作り直せるしpyenvは便利。

必要なパッケージのインストール。
$ sudo yum install vim gcc gcc-c++ make git openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel
pyenvのインストールと環境設定

まずインストールしましょ。
git cloneしてもってきましょ。

$ cd ~
$ git clone git://github.com/yyuu/pyenv.git .pyenv


次に.bashrcに環境変数を設定しましょ。
必要なのは、PYENV_ROOTとPYENV_ROOT/binにPATH通すこと。
通したら pyenv initでpyenvを使用する準備は完了です。

export PYENV_ROOT="${HOME}/.pyenv"
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"


.bashrcと.bash_profileにも入れておきましょう。

$ cat <<'EOF' >>~/.bashrc
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
EOF
$ cat <<'EOF' >>~/.bash_profile
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
EOF
pyenv-virtualenv

pyenvはプラグインが使用できますが、pyenv-virtualenvはpyenvでvirtualenv環境を構築するのに必要なプラグイン(他になんかあるのかな?)

$ source ~/.bashrc
$ cd ${PYENV_ROOT}/plugins
$ git clone git://github.com/yyuu/pyenv-virtualenv.git
pyenv環境のPythonインストール

後はpyenvコマンドでPythonインストールしましょ。

$ cd ~
# インストールできるPython環境の一覧表示
$ pyenv install -l
# バージョン2.7.5のPythonのインストール
$ pyenv install 2.7.5
# バージョン2.7.5のPythonをもとにした、django-devというVirtualEnv環境の作成
$ pyenv virtualenv --distribute 2.7.5 django-dev
使い方
$ cd ~
# global環境のPython変更(このpyenvを使用する場合デフォルト2.7.5が使用される)
$ pyenv global 2.7.5
# local環境のPython変更(実行ディレクトリに.python-versionファイルが作成され、そこ以下のディレクトリのPythonはlocal環境として使われる)
$ pyenv local django-dev
$ cat .python-version
django-dev


そんな感じで便利なので使ってみましょう!ではでは。


パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)


ラスト・アナコンダ [DVD]

ラスト・アナコンダ [DVD]

doxygen と graphviz でクラス図を出してみる

はい、おつカレー様です。
夏はカレーとビールですね。


最近bottleのソースコードリーディング的な事をやっていたりするのですが、これをやっている際にdoxygenでのクラス図生成が便利だったので、メモリん。
環境はCentOS6系です。

doxygengraphvizのインストール

yum。楽チン。

# yum install doxygen graphviz

bottleのソースも落としておきましょう。

$ mkdir bottle bottle_doxygen
$ wget  http://bottlepy.org/bottle.py -O ./bottle/bottle.py

設定ファイルのテンプレート生成

次にDoxygenの設定ファイルのテンプレートを出力しましょう。

$ doxygen -g Doxyfile
$ cat Doxyfile  | grep -v ^# | grep -v ^$
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           =
PROJECT_NUMBER         =
OUTPUT_DIRECTORY       =
CREATE_SUBDIRS         = NO
OUTPUT_LANGUAGE        = English
BRIEF_MEMBER_DESC      = YES
REPEAT_BRIEF           = YES
ABBREVIATE_BRIEF       =
ALWAYS_DETAILED_SEC    = NO
INLINE_INHERITED_MEMB  = NO
FULL_PATH_NAMES        = YES
STRIP_FROM_PATH        =
STRIP_FROM_INC_PATH    =
SHORT_NAMES            = NO
(snip)

設定ファイル変更

今のディレクトリ構成にしたがって変更。

$ diff Doxyfile.org Doxyfile
28c28
< PROJECT_NAME           =
---
> PROJECT_NAME           = bottle
41c41
< OUTPUT_DIRECTORY       =
---
> OUTPUT_DIRECTORY       = ./bottle_doxygen/
571c571
< INPUT                  =
---
> INPUT                  = ./bottle/
991c991
< GENERATE_LATEX         = YES
---
> GENERATE_LATEX         = NO
1360c1360
< HAVE_DOT               = NO
---
> HAVE_DOT               = YES
項目名 意味
PROJECT_NAME プロジェクト名(適当に)
OUTPUT_DIRECTORY HTML出力先を指定
INPUT ソースディレクトリを指定
GENERATE_LATEX LATEX出力が要らないので。いるならYESのまま。
HAVE_DOT クラス図を出力する

doxygen実行

これだけです。デフォルトがDoxyfileになってるんで、この場合は $ doxygen だけでもOKです。

$ doxygen Doxyfile

ブラウザからみたい

場合はApacheとかの公開ディレクトリに置きましょう。(すいませんw適当w)

$ /bin/cp -rf bottle_doxygen/html/ /var/www/doxygen/bottle/

こんな感じででます。

いじょ。

#bpstudy 71さん で「後悔しないもんごもんごの使い方 」という発表しました

はい、乙カレー様です。桑野です。


おくれちゃいましたが、7/31に開かれましたbpstudy #71にて発表して参りました。
@ さんにアプリ側のお話をしていただき、私の方でサーバ側でそもそもユースケースとはどんなものか、というお話をしました。


一部では@ さんによる、「運用が楽になる分散データベース Riak」という発表をされていて、運用はホント楽そうだよなーと指をくわえてみたりもしましたw
Riakの話はいろんな場所で聞きますが、アーキテクチャが綺麗にまとまっているイメージで、クラスタリングKVSとしてはよっぽどの環境でなければ安定運用できるんじゃないでしょうか。と思っています。


そして、二部では私達が「運用を楽に"したい"分散データベース MongoDB」という事でお話したわけですが、以前のWEB+DB PRESSさんの記事を書いた時にもちょっとブログで書きましたが、ユースケースによってNoSQLに対する印象は変わると思っております。
MongoDBは結構苦労するNoSQLだとは思いますw が、使い道ではある程度良い部分をいいとこ取りできますよっていう部分が伝われば幸いかと。
丸の内MongoDB勉強会の方々が最近はその辺りを布教されていますので、勉強会にでて詳しい話をきいてみるのも良いかと思います。


NoSQLを擬人化するならMongoDBは明るい大雑把なキャラになるとおもいますw
Riakは真面目な感じで、Cassandraは多分高飛車な感じでしょうかねどうですか!サーバ擬人化ユーザ会の皆様!?、、、って急におかしな話をしましてすいません(; ・`ω・´)

最後に

出演者の方々。
聞いてくださった方。
bpstudy運営の方々。

皆様ありがとうございました!!

資料

後半アプリ編


WEB+DB PRESS Vol.75

WEB+DB PRESS Vol.75


謎の惑星モンゴ [VHS]

謎の惑星モンゴ [VHS]

『Web+DB Press Vol.75』にMongoDB徹底入門を書かせて頂きました。

はい、おつカレー様です。くわのです。
気づいたらすっげーーーーーーーーーーBlog書いてなくて、やべーなこれって思ったので今後は書いて行こうと思っています(´;ω;`)


と、今回も書籍の話だったりするんですが(汁
Web+DB Press Vol.75』に第2特集としてMongoDB徹底入門を書かせて頂きました。



@さんと一緒に書いたのですが、僕の日本語のおかしい部分をまつかずさんは直してくれたのでぼくは一生頭が上がらないのだと思いますが、そういう意味では僕と一緒に記事を書いた人全てに僕は頭が上がらないのだなと思うと、僕は頭を下向きに固定して生きたほうが生きやすいんじゃないかと、僕は、、、僕はあああぁあぁ!
、、、また取り乱しました。すいません。

特集の内容

読者の対象としては、MongoDBを触ったことない人向けとなっています。
記事の内容は、

  • MongoDBのユースケース
  • 一般的な使い方の説明
  • 開発を行うにあたっての障壁が少ない、と言う利点

の部分等を二人で書いて行きました。
やはりドキュメント指向/スキーマレスたるMongoDB的には開発が簡単である、と言う部分を入れてなんぼであろうという所もあったためです。


僕の方では特に、ユースケースは気をつけて書いた部分になります。
日本では特にですが、世間一般的にMongoDBへログを貯めるという方法をよく紹介されていますが、窪田さんの訳されているこの記事のように、どのように使ったらいいかはよく考えて使わないと痛い目を見る事があるよ、と言った部分は伝えたいなと思ってユースケースの部分は書きました。


って、なんだこれ、脅しか?この記事こわいwww

ともあれ

結構NoSQLはネガティブな捉え方をされる場合も多いですが、使い道によっては非常に開発スピードが早くしたり、柔軟なサービス開発の役に立つ事もあります。
興味を持っていただけたらお手にとってもらえれば幸いと思っています。


Web+DB Press Vol.75』は「継続的Webサービス改善ガイド」、SPDY、Chefといったおもしろい記事も多いですよ!!!


WEB+DB PRESS Vol.75

WEB+DB PRESS Vol.75


『7つのデータベース 7つの世界』はデータベースの海を渡る羅針盤だ。

はい、おつカレー様です。くわのです。


羅針盤だ。とかカッコイイ(そうでもない)事を言ってみた(ドヤァ
オーム社さまから出版されております、『7つのデータベース 7つの世界』を献本いただきました!
オーム社さま、@ さんありがとうございました!



そこで、ちょっと遅れてしまいました(スイマセン(´Д⊂)が、感想などを書かせて頂きました。

どんな本?

まず、この本がどんな本か。というのが気になる所だと思います。


自分はこの本に対して、
「データベースと言われているソフトウェアたちがどのようなアーキテクチャで動いているかを知ることによって、適材適所を見つけるためのインデックス」
と理解しました。

内容

この本ですが、その名前の通りに7つのデータベースについて説明していきます。

各データベースについて、3章=3日に分けて、各アーキテクチャの特徴的な部分を包括的に学べる構成になっています。
アーキテクチャごとにわかりやすく要点が書いてあったので、読んでて単純に興味深く、面白い本でした。

RDBMS?NoSQL?

この本では様々な形のデータベースが説明されています。
いわゆるRDSMSといわれるもの=PostgreSQLから、KVS(キーバリューストア)と呼ばれるもの、カラム指向、ドキュメント指向、グラフ指向。指向指向ってなんだよ!
、、、スイマセン取り乱しました(;・∀・)


その他にもスケールアウトできるの?できないの?冗長化はどうやってるの?とか。
データの持ち方、データアクセスの仕方、MapReduceの実装、インデックスの有無。
などなど。


本当に昨今はNoSQL戦国時代のようにたくさんのNoSQLが出ています。
そしてNoSQLは特に得意、不得意がはっきりしている傾向がありますので、「これに使えるかもしれないなー」「あー、違かったかー」(はじめに戻る)だと苦労しますよね。


以前だと使ってみて、こういう感じかー、へーっでわかっていた物、わかっていたつもりで使ってみたら違かった物、様々ありました(・。・;、
この本はそういった部分に対して、ベストプラクティスな使い方を得るための一助になると思います。


最後の方に付いている各データベースの比較表が地味ですが、網羅的に知りたい事が書いてあって良い感じです。

まとめ

NoSQLは知ってるけど、ほんとに使う意味があるの?とか、こういう部分に使いたいんだけど、これってあってるの?
っていう人などに、ご興味があればぜひお手にとっていただけると良い本だと思います。
別に今NoSQLなんて使う予定ないよ?って人にも、いざというときのための引出として持っておいても損はないと思います。
# 大規模運用になるにつれ出てくる問題っていうものもあると思いますが、、、それはまた別のお話、、、。


とても面白かったので、『7つの言語 7つの世界』も読んでみよう。


7つのデータベース 7つの世界

7つのデータベース 7つの世界

NANA - ナナ-  1-21巻 セット (りぼんマスコットコミックス―クッキー)

NANA - ナナ- 1-21巻 セット (りぼんマスコットコミックス―クッキー)

へえ、あんたもデータベースって言うんだ