2013年8月20日火曜日

ブログ

はてなダイアリーからMovableTypeでエクスポートしてxmlに変換してインポートしたら古いのが上に来ていて、恥ずかしいですなぁ…。

2013年8月19日月曜日

今更ながら

はてなダイアリーから引っ越してみた。

プロセスをkillする



select username , sid , serial# from v$session;


で特定し、


alter system kill session '<上記sid>,<上記serial#>';


でシグナル送信。





changePerm.sh



UNIX系OS上でOracleをインストールした場合、基本的にはインストールしたOSユーザでしかSQL*Plus等のユーティリティを実行できない。


別のOSユーザから上記Oracleユーティリティを使いたい時は、


1.Oracleソフトウェアをインストールしたユーザのグループに入れてやる


2.changePerm.shシェルを実行してパーミッションの設定を変えてやる


をしなければならない。と思った。


1番目が一番楽な気がしますが、インフラチームで明確にOSユーザを設定してあると何かと面倒だしプロジェクトのセキュリティポリシー等で引っかかったり…。


なので、そういう場合は2で対処。


どちらも、ユーザの環境変数は設定しなければならない(ORACLE_SIDとかORACLE_BASEとか。PATHもやると便利かな、と)。


changePerm.shは、$ORACLE_HOME/installの下にあったと思います。


Oracleのマニュアルでは、HPか何かの『管理者リファレンス』に記載されていたと思いますがその他は未確認です。





2009-11-06



だいぶ間が空いてしまいました…。


最近はOracleにはあまり触っておらず、SQL ServerとMySQLが多いです。


SQL Serverは、bcpとかosqlとか意外と便利に思う今日この頃。





ネットワーク越しのエクスポート/インポート



Windows認証を用いてローカルサーバのSQL Server 2005のテーブルデータをエクスポートし、


ネットワーク越しに別サーバのSQL Serverのテーブルにインポートする一例です。


諸々環境依存の所はありますが、その辺がクリアになっているとコマンドプロンプト上のみからで行えます。


bcp <データベース名>.<スキーマ名>.<テーブル名> out "<フルパスでファイル名>" -n -T


bcp <データベース名>.<スキーマ名>.<テーブル名> in "<フルパスでファイル名>" -n -S <インポートしたいサーバのIPとかホスト名> -T





テーブルデータを消したい場合は、同様にコマンドプロンプトから以下のようにしたり。


osql -E -S <サーバ名(ローカルなら[localhost])> -d <データベース名> -Q "TRUNCATE TABLE <スキーマ名>.<テーブル名>"


トランザクションログを消したい場合は、、、


osql -E -S <サーバ名(ローカルなら[localhost])> -d <データベース名> -Q "BACKUP LOG <データベース名> WITH TRUNCATE_ONLY"





データベースのエディションによっては使えない?


bcpコマンド及びosqlコマンドの詳細オプションはMSDNを参照してください。


osqlコマンドは未来のバージョンでは削除予定らしいので、sqlcmdコマンドの使用が推奨みたいです。





大文字小文字



MySQLではcharとvarcharの、(少なくとも半角英数字の。それ以外は試していません)大文字小文字を


区別してくれないようです。


ただし、「BINARY」属性を付けると大文字小文字を区別してくれます。


マニュアルを読みましょうって話だと思いますが…こういう仕様なんですねぇ…。


「show create table」コマンドを用いるとテーブルの違いが明らかになりますが、


「desc」コマンドでは属性情報までは出ないようです。





例:


C:\xampp\mysql\bin>mysql -u ***** -p ********


Welcome to the MySQL monitor. Commands end with ; or \g.


Your MySQL connection id is 4


Server version: 5.1.37 Source distribution


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


mysql> use test;


Database changed


mysql>


mysql>


mysql>


mysql> create table test_table_01 (


-> name varchar(10)


-> );


Query OK, 0 rows affected (0.05 sec)


mysql>


mysql> insert into test_table_01 values ('AAA');


Query OK, 1 row affected (0.06 sec)


mysql> insert into test_table_01 values ('aaa');


Query OK, 1 row affected (0.00 sec)


mysql> select * from test_table_01\G;


/*************************** 1. row ***************************


name: AAA


/*************************** 2. row ***************************


name: aaa


2 rows in set (0.00 sec)


ERROR:


No query specified


mysql>


mysql> select * from test_table_01 where name = 'aaa'\G;


/*************************** 1. row ***************************


name: AAA


/*************************** 2. row ***************************


name: aaa


2 rows in set (0.00 sec)


ERROR:


No query specified


mysql>


mysql> select * from test_table_01 where name = 'AAA'\G;


/*************************** 1. row ***************************


name: AAA


/*************************** 2. row ***************************


name: aaa


2 rows in set (0.00 sec)


ERROR:


No query specified


mysql>


mysql>


mysql>


mysql> show create table test_table_01\G;


/*************************** 1. row ***************************


Table: test_table_01


Create Table: CREATE TABLE `test_table_01` (


`name` varchar(10) DEFAULT NULL


) ENGINE=MyISAM DEFAULT CHARSET=latin1


1 row in set (0.00 sec)


ERROR:


No query specified


mysql>


mysql>


mysql> alter table test_table_01 modify name varchar(10) binary;


Query OK, 2 rows affected (0.09 sec)


Records: 2 Duplicates: 0 Warnings: 0


mysql>


mysql> select * from test_table_01 where name = 'aaa'\G;


/*************************** 1. row ***************************


name: aaa


1 row in set (0.02 sec)


ERROR:


No query specified


mysql>


mysql>


mysql> select * from test_table_01 where name = 'AAA'\G;


/*************************** 1. row ***************************


name: AAA


1 row in set (0.00 sec)


ERROR:


No query specified


mysql>


mysql>


mysql> show create table test_table_01\G;


/*************************** 1. row ***************************


Table: test_table_01


Create Table: CREATE TABLE `test_table_01` (


`name` varchar(10) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL


) ENGINE=MyISAM DEFAULT CHARSET=latin1


1 row in set (0.00 sec)


ERROR:


No query specified


mysql>





Oracle ORION



Oracle ORIONという、データベースへ疑似的なトランザクションを発生させて


ディスクに関するパフォーマンス情報を提供してくれるツールがあるようです。


http://www.oracle.com/technology/software/tech/orion/index.html


上記からダウンロード可能。


使ったことがないので分かりませんが、ディスクデバイスを設定ファイルに記述


して実行するとシーケンシャルI/OやランダムI/Oを生成してくれるとか。


使ったことがなく、よく分からないので今度遊んでみようと思います…。





バグ?



http://bugs.mysql.com/bug.php?id=23069


MySQLで文字コードをUTF8にしていると、カラムのデータ型がvarcharの時、


1文字で3バイト使用してしまう。


なので、データベースエンジンがInnoDBの場合はPrimary KeyやUnique制約に


指定したカラムのバイト数(文字数)の最大値は255になってしまう。


バージョンが5.1.38ではこの現象が起きますが、最新のは調べてないので再現


するか不明です。


対応としては、




  • カラムのバイト数(文字数)を減らす。

  • 文字コードを変える。

  • データベースエンジンを変える。

  • そもそもインデックスを張らない。

  • ソースを編集して再コンパイル(?)。


辺りなんでしょうか…。





営業電話



たまにOracleさんからお電話頂くんですが、これって営業として入社した方の研修の一環なんでしょうか?


大体が新規にOracleを導入する予定がありますか?みたいな感じなんですが、皆さん非常にたどたどしくて…。


何がどうとか言うわけじゃないのですが、なんとなく気になったもので。


今日は『Ask Tom』に行ってきます!!


非常に楽しみです。





Statspack



パフォーマンスが悪化しているシステムの原因がSQLにある事を前提とした、Statspackを用いたチューニング概要資料を会社の勉強会の為に作成中…。


最近知ったのですが、Oracle 9i辺りから使える機能に「仮想インデックス」というものがあるのですね。


セグメントは使用しないが、メモリ上には乗っててalter session文で隠しパラメータをセットすると使用できるっていう。


ちょっとインデックス張って効果を試したいって場合には有用かもしれません。


詳しい情報は「virtual index」とかでググると出てきます。





自分用メモ



全部自分用メモなんだけれど。


PostgreSQLのロケールの設定がイケてないとLIKEでの前方一致検索時にインデックスが効かない。


データベース名は「test001」。


データベース作成時にはロケールの指定を行わない。


OSはWindows XP。


インデックス作成時にtext_pattern_opsを付けてやることで前方一致の時もインデックスが使用される。


データベース作成時にロケールを「C」とかにしていれば上記オプション(?)は必要ない。


以下、ちょっとしたお試し。



test001=#


test001=# select version();


version


-------------------------------------------------------------


PostgreSQL 8.4.3, compiled by Visual C++ build 1400, 32-bit


(1 行)





test001=#


test001=#


test001=#


test001=# select name, setting, context from pg_settings where name like 'lc%';


name | setting | context


-------------+-----------------+-----------


lc_collate | Japanese, Japan | internal


lc_ctype | Japanese, Japan | internal


lc_messages | Japanese, Japan | superuser


lc_monetary | Japanese, Japan | user


lc_numeric | Japanese, Japan | user


lc_time | Japanese, Japan | user


(6 行)





test001=#


test001=#


test001=#


test001=# create table locale_test1(name varchar(10));


CREATE TABLE


test001=# create table locale_test2(name varchar(10));


CREATE TABLE


test001=#


test001=#


test001=# create index idx_test1 on locale_test1(name);


CREATE INDEX


test001=#


test001=# create index idx_test2 on locale_test2(name text_pattern_ops);


CREATE INDEX


test001=#


test001=#


test001=# \d locale_test1


テーブル "public.locale_test1"


カラム | 型 | 修飾語


--------+-----------------------+--------


name | character varying(10) |


インデックス:


"idx_test1" btree (name)





test001=#


test001=#


test001=# \d locale_test2


テーブル "public.locale_test2"


カラム | 型 | 修飾語


--------+-----------------------+--------


name | character varying(10) |


インデックス:


"idx_test2" btree (name text_pattern_ops)





test001=#


test001=#


test001=# CREATE FUNCTION test1() RETURNS INTEGER AS


test001-# $$


test001$# DECLARE


test001$# CNT INTEGER;


test001$# BEGIN


test001$# FOR CNT IN 1..1000 LOOP


test001$# INSERT INTO locale_test1 VALUES (CNT);


test001$# END LOOP;


test001$# RETURN CNT;


test001$# END;


test001$# $$


test001-# LANGUAGE plpgsql;


CREATE FUNCTION


test001=#


test001=#


test001=#


test001=#


test001=# SELECT test1();


test1


-------


0


(1 行)





test001=#


test001=# select count(*) from locale_test1;


count


-------


1000


(1 行)





test001=# select * from locale_test1 limit 10;


name


------


1


2


3


4


5


6


7


8


9


10


(10 行)





test001=#


test001=#


test001=# explain analyze


test001-# select * from locale_test1 where name='1';


QUERY PLAN


---------------------------------------------------------------------------------------------------


--------------------


Index Scan using idx_test1 on locale_test1 (cost=0.00..8.27 rows=1 width=3) (actual time=0.043..0


048 rows=1 loops=1)


Index Cond: ((name)::text = '1'::text)


Total runtime: 0.112 ms


(3 行)





test001=#


test001=#


test001=# explain analyze


test001-# select * from locale_test1 where name like '100%';


QUERY PLAN


---------------------------------------------------------------------------------------------------


---


Seq Scan on locale_test1 (cost=0.00..17.50 rows=1 width=3) (actual time=0.081..0.545 rows=2 loops


1)


Filter: ((name)::text ~~ '100%'::text)


Total runtime: 0.607 ms


(3 行)





test001=#


test001=#


test001=#


test001=#


test001=#


test001=# CREATE FUNCTION test2() RETURNS INTEGER AS


test001-# $$


test001$# DECLARE


test001$# CNT INTEGER;


test001$# BEGIN


test001$# FOR CNT IN 1..1000 LOOP


test001$# INSERT INTO locale_test2 VALUES (CNT);


test001$# END LOOP;


test001$# RETURN CNT;


test001$# END;


test001$# $$


test001-# LANGUAGE plpgsql;


CREATE FUNCTION


test001=#


test001=#


test001=#


test001=# SELECT test2();


test2


-------


0


(1 行)





test001=#


test001=# select count(*) from locale_test2;


count


-------


1000


(1 行)





test001=#


test001=# select * from locale_test2 limit 10;


name


------


1


2


3


4


5


6


7


8


9


10


(10 行)





test001=#


test001=#


test001=#


test001=#


test001=# select * from locale_test2 where name='1';


name


------


1


(1 行)





test001=# explain analyze


test001-# select * from locale_test2 where name='1';


QUERY PLAN


---------------------------------------------------------------------------------------------------


--------------------


Index Scan using idx_test2 on locale_test2 (cost=0.00..8.27 rows=1 width=3) (actual time=0.031..0


035 rows=1 loops=1)


Index Cond: ((name)::text = '1'::text)


Total runtime: 0.095 ms


(3 行)





test001=#


test001=#


test001=#


test001=# explain analyze


test001-# select * from locale_test2 where name like '100%';


QUERY PLAN


---------------------------------------------------------------------------------------------------


--------------------


Index Scan using idx_test2 on locale_test2 (cost=0.00..8.27 rows=1 width=3) (actual time=0.040..0


052 rows=2 loops=1)


Index Cond: (((name)::text ~>=~ '100'::text) AND ((name)::text ~<~ '101'::text))


Filter: ((name)::text ~~ '100%'::text)


Total runtime: 0.118 ms


(4 行)





test001=#






Data Guardフィジカルスタンバイ小ネタ



Oracleでフィジカルスタンバイのデータガード構成を取っているとき、プライマリ側でログイン時にパスワードを失敗したログがスタンバイ側に適用されると、スタンバイ側ではそのログインに失敗したユーザでアクセスできない。


これは、ログイン成功時にパスワード失敗入力回数を0に戻す処理が走るが、スタンバイ側が読み取り専用になっているので0に戻せず怒られてしまうことによる。


同様に、expdp/impdpも読み取り専用のDBに対して実行した場合内部のデータを更新しようとするが怒られて出来なかったりする。


ログインに関するものは、プライマリ側で正しくログインし、そのログをスタンバイ側に適用してやることで解決。


expdp/impdpについては解決策があるのか不明。


どなたか知ってたら教えて下さい。







ちょっと仕事が落ち着いたので11月はいくつか勉強会に参加予定。


■gumiStudy#6(11/2)


Scala + Lift + Cassandraということで、ScalaをHello,Worldしたぐらいしか触っていないけど参加。


■Hadoopを中心とした分散環境での開発方法論・モデリング・設計手法等についての座談会(11/19)


■全文検索エンジンgroongaを囲む夕べ #1(11/29)


補欠だけど。


全文検索エンジンというか全文検索システムというと、以前ちょっとしたCMSを作った時にNamazuを使用した記憶が。


OracleだとOracle Textっていうのがあって、中間一致でも速度が出るようなインデックスを張れたりしますね。


http://blogs.oracle.com/oracle4engineer/column/technical/022292.html


アルゴリズム的なお話が聞ければいいなと思ってます。


補欠だけど。





gumiStudyに行ってきた。



MessagePackのお話を聞いてきました。


会社用のツールに使いたいなーと思っていて、公開されてるスライドやWikiで予習しコードもちょろっと読んでいたので話の内容にはついていけたかなと思う。


お話を聞けば聞く程に素晴らしい設計で、非常に勉強になりました。


最近興味のあるソフトウェアはだいたいC++だけど今まできちんと勉強してきていないので、ちゃんとやらねば…との思いを強くした。





色々行ってきた。





  • Hadoop座談会(11/19)


日にちが空いてしまいましたが。


モバイルエージェントのデモに胸熱でした。


データのあるところに移動して処理をするという考え方はデータが分散され、かつ並行に処理を行わなければならないような環境では非常に効率的な考え方に感じた。


Hadoopを全く勉強していないので分からないが、今までの逐次的なものすごく時間のかかる夜間バッチみたいなのがRDBMSなストレージ側の変化と処理を実行するプログラム側の変化とからだいぶ変わっていきそうに思えた。




  • hbstudy(11/26)


BPStudyで使用されたスライドと今回のhbstudy用に公開された事前版のスライドを見ていたせいか、お話を集中して聴く事ができた。


僕はQEMUは「amazon:30日でできる! OS自作入門」で知りました。





去年振返、今年目標



年明け後に記事書いて下書き保存したら消えてた。


保存しておいてくれる日数って決まってるのかな?


今更ながら去年の振り返りと今年の抱負。


去年は勉強会の存在を知って参加し始める事となった。色んな人の話を聞いて自分の技術力の低さを実感したり…。


未経験でこの業界に入って丸3年が経過、それなりに仕事出来てるかと思い始めていたけれどまだまだなんだと改めて思い知らされ。


今年は新しい技術情報へのアンテナを高めつつ、基礎的な知識を体系的に学んで理解を深めていきたい。


仕事の方はインフラ系をメインにたまにコード書いたりしていた。


今年はもうちょっと仕事としてもコードを書きたいなぁと思っている。


なので営業も考えていかなければならない。





Linux-HA Japan勉強会に行ってきた。



ブログを更新するまでが勉強会ということで。


僕の前提知識は、最近Heartbeat2.0.*検証を依頼されて3日触ったぐらいです。


以下、勉強会中に書いたメモ。



1.Pacemakerを使ってみよう


サービス継続できないサーバを強制的にクラスタリソースから排除する。(シャットダウン? or リブート)(フェンシング)


IPMI2.0対応のHW制御ボードなら使える(?)


お互いをフェンシングしてしまうこともあるが、STONITHプラグインを入れると防げる。


デモではXen0のSTONITHプラグイン(?)を使う。


Linux-Ha Japanが作ったツールがある。


yumでインストールするとユーザが追加される。


SFEX(共有ディスク排他制御機能)


フェイルカウントを0にしないとフェイルオーバーしてもリソースが上がらないようになっている。


STONITHの機能によって、スプリットブレイン発生時にはリソースがあった方が生き残る。


corosyncにシフトしていきたいと思っている。


2.リソースエージェントの中身を見てみよう


OCFスクリプトを適切に書き換える必要あり。


OCFはバージョンによってかなり違うのできちんと内容を見る必要がある。


$OCF_CHECK_LEVELの値でステータスのチェック方法とかはだいぶ変わる。



以上メモ。


auto_failbackについて「設定できなくなりました?」みたいな質問があったと思うのですが、以下の注のところにちょろっと書いてあります。


auto_failback命令 - フェイルバックポリシーの設定


設定するにはcib.xmlの<crm_config>の中に


<nvpair id="default_resource_stickiness" name="default_resource_stickiness" value="-INFINITY"/>


とか書いてやる必要があるかと思われます。


自分が検証した時は、なんか上手くいったりいかなかったりで原因を特定することなく時間切れとなりました。。


あとHeartbeat2系だと「STONITHは上手く動かないから設定しない方が多重障害時にお互いぶっ壊れるとかいうリスクは無くせるよ」みたいな記述をどっかで見かけたのですが、この記述が真ならPacemaker(ってかHeartbeat3)ではちゃんと動くようになったんですかね。


cib.xmlのスコアとかノードの優先順位の設定とかharesources2cib.pyって今も使えるのかとか2系でも2.0と2.1でだいぶ違うが変更点一覧とかあるんですかとか2系のまとまったドキュメントとかパラメータ一覧とかあるんですかとかcrm_verifyのcib.xmlチェック方法とか色々訊きたい事があったけれど帰社する予定だったので懇親会には参加せず。


結局は帰社しなくていいと言われたので、まっすぐ帰ってサッカー観ましたが。


総括としては、STONITH周りのお話と対話型cib.xml設定インターフェイスのデモを見れたところが「おぉっ!」って感じでした。


上で列挙した訊きたかった事は、ソースやスクリプト読んだりデバックモードにしてログをtail -fしてれば分かることなんだろうけど、僕みたいな利用者視点だと結構敷居は高いかなー。正直。





PyCon mini JPに行ってきた。



1/29(土)に楽天タワーで開催されたPyCon mini JPに行ってきました。


https://sites.google.com/site/pyconminijp/


http://togetter.com/li/94475


水曜の夜に39℃超の熱が出た時はインフルエンザだと思い欠席連絡しようかと思ったけれど、普通(?)の風邪で熱も下がったので参加してきた。


聞いたお話の中で一番印象に残ったのは


「テンプレートエンジンの高速化と失敗談について」


https://sites.google.com/site/pyconminijp/talks#TOC-1


今までほぼ関係することがなく、興味が湧いたお話は


・Sphinx(ちゃんと使ったことない)


・翻訳プロジェクト


・ハードウェア制御


翻訳に関しては、Python関連だけでなくOSS系のプロダクトだとどうしても日本語の情報が少ないので何らかの形で貢献できればと最近強く思う。


僕は論文を読まなきゃならない環境にいたことがあるので英語にはそんなに抵抗ないけど、同僚を見てると本当に英語が嫌で嫌で仕方ないって人もいるし。


講演、LTされた皆さん、そして運営の皆さんお疲れ様でした。


次回は夏頃に開催したいということでしたが、何かお手伝い出来る事があれば積極的に関わりたいなと思います。


あと先日の帰ってきたPython Workshopに参加した時も思ったが、インフラ系の人がほとんどいないような気が。


最近だとPerlは入ってなくてもPythonは標準で入ってたりするし、色々とインフラ系なツールもPython製が多いし…という事でその辺の話を自分が出来るようになりたいなと思った。


ちなみにUbuntu 10.10(の標準インストール状態からちょろっと変更してる)のコマンドでPython製と思われるものをテキトーに調べた結果は以下。













aptd


computer-janitor


computer-janitor-gtk


gconf-schemas


hpssd


ufw


update-apt-xapian-index


update-python-modules


update-software-center


2to3


2to3-2.6


X11


add-apt-repository


alacarte


apport-cli


apport-unpack


apt-add-repository


apt-mark


aptdcon


apturl-gtk


axi-cache


byobu-config


byobu-select-session


check-language-support


couchdb-dump


couchdb-load


couchpy


dh_python2


do-release-upgrade


dviasm


fontconfig-voodoo


gmenu-simple-editor


gnome-about


gnome-codec-install


gnome-language-selector


gsettings-schema-convert


gst-install


gstreamer-codec-install


gwibber


gwibber-accounts


gwibber-error


gwibber-poster


gwibber-preferences


gwibber-service


hp-align


hp-check


hp-clean


hp-colorcal


hp-firmware


hp-hpdio


hp-info


hp-levels


hp-makeuri


hp-pkservice


hp-plugin


hp-probe


hp-query


hp-scan


hp-setup


hp-testpage


hp-timedate


hp-unload


invest-chart


jockey-gtk


jockey-text


lsb_release


mako-render


manhole


mktap


nvidia-detector


ods-server


onboard


onboard-settings


pdb


pdb2.6


pitivi


protoc


purple-remote


purple-url-handler


py3_compilefiles


py_compilefiles


pycentral


pyclean


pycompile


pydoc


pydoc2.6


pygettext


pygettext2.6


pyhtmlizer


pyversions


rdfpipe


session-installer


software-center


software-properties-gtk


spd-conf


tap2deb


tap2rpm


tapconvert


trial


twistd


u1sdtool


ubuntu-support-status


ubuntuone-launch


ubuntuone-preferences


unattended-upgrade


unattended-upgrades


update-gconf-defaults


update-manager


usb-creator-gtk


xml2po


RedHatかCentOSで調べないとなんか微妙な気が…。


明日結果を載せるかも。


ちなみに同OSでPerlだと以下。


aa-audit


aa-autodep


aa-complain


aa-enforce


aa-genprof


aa-logprof


aa-status


aa-unconfined


addgroup


adduser


apparmor_status


aspell-autobuildhash


audit


autodep


complain


cups-genppdupdate


delgroup


deluser


dpkg-preconfigure


dpkg-reconfigure


enforce


foomatic-addpjloptions


foomatic-cleanupdrivers


foomatic-extract-text


foomatic-fix-xml


foomatic-kitload


foomatic-nonumericalids


foomatic-preferred-driver


foomatic-printermap-to-gutenprint-xml


foomatic-replaceoldprinterids


genprof


install-docs


install-sgmlcatalog


ispell-autobuildhash


logprof


pam-auth-update


pam_getenv


popularity-contest


pppconfig


pptpsetup


remove-default-ispell


remove-default-wordlist


select-default-ispell


select-default-wordlist


sensors-detect


unconfined


update-binfmts


update-catalog


update-default-aspell


update-default-ispell


update-default-wordlist


update-dictcommon-aspell


update-dictcommon-hunspell


update-inetd


update-locale


update-mime


update-openoffice-dicts


update-pangox-aliases


update-rc.d


update-rc.d-insserv


update-xmlcatalog


validlocale


GET


HEAD


POST


X11


a2ping


aspell-import


bogoupgrade


bogoupgrade-bdb


c2ph


c_rehash


chkdupexe


ckbcomp


compose


config_data


corelist


cpan


cpan2dist


cpanp


cpanp-run-perl


debconf


debconf-apt-progress


debconf-communicate


debconf-copydb


debconf-escape


debconf-set-selections


debconf-show


defoma


defoma-app


defoma-font


defoma-hints


defoma-id


defoma-subst


defoma-user


dh_bash-completion


dh_installdefoma


dh_installtex


dh_installxmlcatalogs


dh_pycentral


dh_pysupport


dirsplit


dprofpp


e2pall


edit


enc2xs


find2perl


findhyph


findsmb


foomatic-compiledb


foomatic-configure


foomatic-datafile


foomatic-ppd-options


foomatic-ppd-to-xml


foomatic-ppdfile


foomatic-printjob


foomatic-searchprinter


gdialog


geteltorito


getnonfreefonts


getnonfreefonts-sys


gnome-terminal.wrapper


grog


gst-visualise-0.10


h2ph


h2xs


helpztags


instmodsh


isohybrid.pl


ispell-wrapper


latex2man


libnetcfg


lss16toppm


lwp-download


lwp-dump


lwp-mirror


lwp-request


lwp-rget


make_method


md5pass


mkdiskimage


mkjobtexmf


mtrace


pdfcrop


perlbug


perldoc


perlivp


perlthanks


piconv


pkfix


pkfix-helper


pl2pm


pod2html


pod2latex


pod2man


pod2text


pod2usage


podchecker


podselect


ppmtolss16


prename


print


prove


psed


pstruct


ptar


ptardiff


pxelinux-options


rename


rpdfcrop


run-mailcap


s2p


see


select-default-iwrap


sensors-conf-convert


sha1pass


shasum


splain


syslinux2ansi


texcount


texdiff


texdirflatten


texdoctk


texloganalyser


ucfq


w3mman


x-terminal-emulator


xpath


xscreensaver-getimage-file


xscreensaver-getimage-video


xscreensaver-text


xsubpp


chkconfig


ま、まぁ現状だとね…。





今後



募金、節電以外に何かないかと思い東北地方の宿泊施設や通販を探してみた。


当然、時期は今じゃなく、半年、一年後にでもお金を使えれば。







ササニシキ・ひとめぼれ通販サイト


http://www.miyagimai.net/


食材の宅配・通販「みんなの産直」


http://watagonia.com/food/index.html


愛情倶楽部


http://www.aijyouclub.com/index.html


e-お米通販


http://e-okome.jp/


通販一番


http://www.emono1.jp/


通販.ne.jp


http://tuhan.ne.jp/


株式会社中野グループ


http://www.nakano-group.jp/index.htm


プライフーズ株式会社


http://www.prifoods.jp/


(株)マエダ


http://www.i-maeda.co.jp/


株式会社ユニバース


http://www.universe.co.jp/


紅屋商事株式会社


http://www.beny.co.jp/


マルヨ水産株式会社


http://www.e-maruyo.com/


八戸缶詰企業グループ


http://www.hachikan.co.jp/index.htm


さくら野百貨店


http://www.sakurano.info/


イオンスーパーセンター株式会社


http://www.aeonsupercenter.co.jp/index.html


株式会社マイヤ


http://www.maiya.co.jp/index.html


志戸平温泉 株式会社


http://www.shidotaira.co.jp/index.html


新鉛温泉 結びの宿 愛隣館


http://www.airinkan.com/index.html


株式会社やまや


http://www.yamaya.jp/index.html


株式会社ジー・テイスト


http://www.g-taste.co.jp/


株式会社一の坊


http://www.ichinobo.com/


株式会社一ノ蔵


http://www.ichinokura.co.jp/


服部コーヒーフーズ株式会社


http://www.hattori-cf.co.jp/index.html


株式会社ジクト(株式会社アトム)


http://www.atom-corp.co.jp/index.php


株式会社ウジエスーパー


http://www.ujiesuper.com/index.html


株式会社わらび座


http://www.warabi.gr.jp/


株式会社ナイス


http://www.nices.co.jp/index.html


株式会社ソユー


http://www.soyu-am.jp/


株式会社タカヤナギ


http://www.e-takayanagi.com/index.php


河北町商工会


http://www.kahoku-shokokai.jp/index.html


うめや


http://www.umeya-m.jp/index.html


日東ベスト株式会社


http://www.nittobest.co.jp/


株式会社マルハチ


http://maruhachi.n-da.jp/


佐藤株式会社


http://www.boki.co.jp


郡山シティホテル


http://www.niraku.co.jp/hotel/


スーパーマルト


http://www.maruto-gp.co.jp/





どーでもいい小ネタ



SQL*Plusにて、「-S」オプション時の挙動が9iと10g以降で違う。


ナニが違うかというと、connect後、9iでは「Connected」の文字が出力されるが10g以降だとされない。





クックパッド×サイバーエージェント合同勉強会



行ってきました。


入るとまずはキッチンどーん!


後ろから始終調理音が聞こえてくる勉強会は初めてでした。







内容


OpenStack


無知だったので勉強になりました。


AWSとの差異や利点はあまり分からなかったけれど、AWSが最大公約数的な形で機能拡張していくとのことなので、色々面白そうな機能を独自路線で作っていってくれれば面白いかも?


あとPython触ってる端くれとしてはGUIがDjangoで出来てるってのもいい感じ。


以下、メモ。



プライベートクラウドをやってみたかった。


Cactusが現行バージョン


AWSとの機能比較


ロードバランシングはない


Cloud ControllerによってNovaプロセスを動かす。


デフォルトのハイパーバイザーはKVM


NW構成


FlatManaget


FlatDHCPManager


VLANManeger


novaコマンド


インスタンス起動・停止


スナップショットの作成


とか


euca2oolコマンド


Pythonで出来てる


novaコマンドとほとんど々ことができる


CloundControllerが停止してもComputeNOでとインスタンスに影響はない


ComputeNodeが停止すると稼働状況が伝わらない


デフォルトではvirtioを有効にして起動される


DjangoベースのGUIが付属している


ElasticFoxでも管理できる


WebAPIはある


CloudControllerは冗長化できる?


→出来るはず


スケールアウトする?


→多分。Eucalyptusがスケールしないから作ったという話なので



AmebaPicoとAWSについて


AmebaPiggの海外版?のAmebaPicoでのAWS運用のお話。


ZooKeeperを触ったことがないのでちょっと調べたところ、以下のページが勉強になりました。(日本語


Hadoop本読書会 - 13章 ZooKeeper


MongoDB、ちゃんと勉強しないとな…と思いました。


以下、メモ。



サーバ構成(全部AWS


キャッシュが効く静的データはCloudFront(CDN


細かい大量のコマンド独自のバイナリプロトコル(Socketサーバで受ける


分散Lockサーバ(ZooKeeper


キャッシュサーバ(memcached


DB(MongoDB


ログ集計サーバ(ElasticMapReduce


とかとか


EBSにバックアップ


Socketサーバ


ノンブロッキングIO


ID管理サーバ


ユーザIDの発行


UIDと認証機関でのIDの対を管理


Point管理サーバ


ユーザIDにひもづくポイント(サービス内通貨)を管理


ID管理サーバが発行したトークン付きのリクエストで処理


DB


エンティティはバイナリ形式でKeyValueストア可能なインターフェイスを持たせて定義


3台構成のレプリカセットを6シャード


プライマリ・セカンダリ・セカンダリ(on EBS)


Flashについて


クライアントで最初にメインモジュールを読み込み


→必要におうじてサブモジュールをロード


サーバとのイベント部分にはデリゲートインターフェイスを用意


Flashとサーバ側との分業体制をきちんと整備


EC2について


60個ぐらい運用していて、2、3ヶ月に一回くらいで落ちる(バージニアだから?


落ちたり特定ポートが死んだらリブート


落ちやすいので、冗長性をきちんと確保する


MongoDB


コネクションプールが枯渇する


シャードを増やした


スペックの高いインスタンスを利用


オートバランシングの挙動


そもそもバランシングのされ方が微妙


レプリカセットのコンフィグ情報未反映問題


コンフィグ反映には全台再起動が必要



画像配信システム


ここからはクックパッドの方の発表。


画像変換あたりの技術とかはやったこともなければ聞いたこともないという感じなので知らない単語が多かったす。


発表途中のアンケートでは、Apacheモジュールを書いている人が結構多かったのかな?一番前に座っていたので分かりませんでしたが。


今だとmod_wsgiだし開発止まっちゃったけど、mod_pythonの勉強でもしようかな…と思ったり。


以下、メモ



以前


ユーザの画像をAPサーバでコピー・リサイズしてストレージにぶっこむ


そしてそれを配信


どの画像サイズ、形が適切か?


→新サイズを試すたびに画像を800万枚リサイズ


iPhoneアプリとかに対応するためにまたリサイズ?


リリースも遅くなる


画像800万枚


秒間7000枚のリクエスト


クラウド移行を検討中(EC2へ


NFSをやめたい


現行(TOFUシステム


ストレージには1枚だけ溜め込む


リクエストのたびにリサイズする


URLにサイズと画質をぶっこむ


実装


Apache Module(mod_tofu.so


画像変換


ImageMagick


ストレージ


S3


AKAMAI(CDN)の後ろにELBでバランスしてApache


S3での苦労


APIが変になった


Akamai OR CloudFront?


EC2をオリジンに使用できるようになった(CloudFrontが)けど、


Akamaiの方が速い。


Akamaiのキャッシュ率はそんなに良くない。


昔はVarnishをELBの後ろに置いていたけど、値段が高い。


tofuを増やした方が安いので、今はそうしていて、Varnishは使っていない。



AWS移行にむけて(分散DNS


非常に色々と網羅された内容で素晴らしいお話が聞けました。


あまり深い内容ではなかったけれど、全体像を伝え、そして現行の問題点とそれを改善するために分散DNSを作ったという話の流れは非常によくわかった。


メモを取らずに聴き入っちゃってました。


クックパッドのインフラは今回発表された方がリーダとしてまとめてるのかなぁと思った。


Heartbeatのバージョンが古かったので、そこは上げた方が…とは思いました。


まとめ


今回も色々なお話が聴けて非常に勉強になりました。


僕は仕事的にはこんな大規模Webサービスに関わっていないので、負荷分散やDB周り以外のキャッシュシステム導入みたいなことをやったことがなかった。


で、Squidはやったんですが、Varnishはやったことないのでnginxと組み合わせたWebサイト構築をやってみたいと思います。


あと、LTで聞いたtmpfsは今まであまり気にしたことがありませんでしたが、永続性を必要としないところには使ってみるのもいいかなと思いました。


最後に、クックパッドさん、サイバーエージェントさんありがとうございました!





PyConJP 2011



Pythonistaの夏の祭典PyCon JP 2011が開催されますよっ。


ということで現在CFP募集中です。


詳しくはこちらからどうぞ。






ちなみに…前回のPyCon mini JPに参加して楽しい話をいっぱい聞けたし、なんか出来ないかなーと思い今回はスタッフとして参加してます。





PyCon JP 2011



(一番何もしてない自覚はありますが)スタッフとして参加しました。


当日は会場係ということでサブトラックにずっといました。


世界のKさんの発表の時にディスプレイのトラブルがあった以外は特に大きな問題もなく良かったかな、と。


次回以降はスピーカーとか発表する側でも関われたらなぁと秘かに…。


スピーカー、参加者、スポンサー、その他関係者の皆々様方ありがとうございました!


そしてお疲れさまでした!


(一番何もしてない自覚はありますが)スタッフとして見ていた感じだと、大成功だったと思います。




既に挙げられていることが多いですが、以下自分の関係したとこら辺でのメモ:


良かったこと



  1. Ustreamを業者さんに頼んだこと(Twitter上でも評判よかったような)

  2. (サブトラックには)机の上にモニタがあったこと

  3. サンドイッチの提供、コーヒーブレイクが好評だったような


課題?改善点?



  1. 司会とタイムキーパーはやはり必要に感じた

  2. 誘導に関して(何時まで配置するか、看板設置有無とか)

  3. ぼっち回避策


今後も何かあれば参加したりお手伝いしたいと思います!


本業のインフラ系のお仕事でも何かしたいですね…。





ZABBIX-JP勉強会に行ってきた。



ブログを更新するまでが勉強会ィィィ!


というわけで一ヶ月前の勉強会ですが感想とかを。


発表資料とかはこちら







一つ一つのセッション毎に感想を書こうかなと思っていましたが、まとめて…。


既に記憶が薄れてきているのですが…Zabbix2.0での機能拡張のお話を非常に興味深く聞きました。


2.0でジョブ管理が入るって聞いていたのでその辺のお話が聞ければな~と思っていたのですけど、どうやら入らない?みたい。


SVNから引っ張ってきて1.9系のソースを軽く見てると




  • インベントリの機能拡張

  • 1ホストに複数IPアドレス(DNS名も?) (「マルチホームホスト」と言うみたいです。)


とかのおかげでhostsテーブルの構造が少し変わってますね。


IPアドレスが1つのhostに複数紐付けられたことにより、hostsテーブルのhostidを外部キーにするテーブルが出来てたり、hostsテーブルのプロファイル、拡張プロファイルのカラムがごそっと別テーブルになってたり。


ちなみに1.8系だと公式ドキュメントにはZabbixAPIからプロファイルの設定は出来ると書かれていませんが一箇所PHPのソースを直せば既にhost.createとかの中では処理することになってるのでZabbixAPIからプロファイルも拡張プロファイルも作成・更新できます。


まぁ2.0になるとまた色々変わりそうですが。


あと注目したのはマップでホストグループ単位で1枚のマップにアイコンを羅列してくれる機能ですかね。


これは僕もお客さんと喋ってて結構よく聞く「欲しい機能」みたいなので。


てかこれと同等(?)の機能を独自に計算してAPI叩いてマップを作る、、みたいなのを目下実装中で複雑な気持ちになったりしてました。


マップの大きさの制限とか一枚に並べられるアイコンの個数の計算とかは1.9のソースをまだ見てないので今度見ておこうかなーと。


あとは他の発表(「エージェントとSNMPだけじゃないZabbix」)とも関係しますが現在ホストはIPアドレス(DNS名)のどちらも入力なしで作成出来ますがそれが2.0でも出来るのかな…?ってところが気になるところ。


これもソース読めって話なのでそのうち自己レスするかもしれません。


今回はAPIのお話が多かったように思います。


APIは確かに便利なんですが公式ドキュメントが…ちょっと…という感じはみんな思ってるのではないかと。


例えば公式ドキュメントのマップの作成のところ、例の通りに叩いても作れなかったりします。


それは、マップのエレメント作成時に指定するidが、ホストだったらそのホストのhostid、トリガーやマップも同様だったりするのですがその辺の事とかドキュメントだけではよく分からなかったりします。


今のところまとまったサンプル集は無いようなので、もしどなたかのご要望があれば作って公開しようかなーと思います。


最後に、発表者、並びに関係者や会場ご提供、ZABBIX-JPの中の皆々様お疲れ様でした!と共にありがとうございました!





退職します。



4月中旬で退職して次の日から新しい職場となります。


現職は中小のSIerでしたが、これからはWebサービスの企画から運用までをインフラエンジニアという立場で支える仕事になります。


今の会社は初めて社会人となったので(学生が長かったので)色々と良い勉強をさせてもらいました。


最初はPHPやJavaを書いてましたがその後はOracle、ZABBIX等に基本的にインフラエンジニアとして関係しながらPythonでちょっとしたアプリを書いたりもして割と自由に裁量も与えられていたと思います。


ただ仕事を続けていく中で、SIではなく自社でサービスをしていてかつOSSをフル活用!みたいな会社で楽しそうに働く方達を勉強会等でお見かけする姿をとても羨ましく思っていました。


また、景気やエンドユーザの考え方に非常に依存した形でのビジネスのやり方に対して何かしら変えたいなと思って実際に動いたりもしましたががが…といった感じで当然ながら時間も掛かるなぁ、と。


それなら自分のやりたいような事をやってる会社に行こうと思って転職活動を始めました。


もう30だし。そんなに時間も無いと思ったし。自分が伸ばしたいと思ってるスキルを伸ばしやすい環境に身を置いてみたかったし。


というわけで今後とも宜しくどうぞ。





vmodでS3の認証を突破する





とか考えていたら




といわなちゃんさん先生に尋ねると、




なんということでしょう!


というわけで試してみました。







環境はVirtualBox上で




  • CentOS 5.6(x86_64)

  • Varnish 3.0.0

  • libvmod-awsrest


という感じです。


公式RPMからふわっとインストールするのではなく今回試したようにrpmbuildとかやりだすと3.0.2ではどハマりして泣きそうになったので3.0.0で検証しました。


通常S3にマネジメントコンソールからファイルをアップロードすると、自身しかOpen/Downloadは出来ません。


EveryoneにOpen/Downloadを許可する設定を追加してもいいのですが、高貴な恥じらいの精神をもった紳士淑女には抵抗があるかと思われます。


そこで


http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheAuthenticationHeader


な感じでヘッダを設定してやればいいのですがAWSSecretAccessKeyからハッシュ値を出してやらなければなりません。


それを簡単かつお手軽に可能にしてくれるのが今回いわなちゃんさん先生が作成したlibvmod-awsrestなのです!


それでは早速やってみましょう。


1.ソースをダウンロード

https://www.varnish-cache.org/releases/varnish-cache-3.0.0


2.展開して/usr/src/redhat/SOURCESに

必要なもの(https://www.varnish-cache.org/docs/3.0/installation/install.html#build-dependencies-on-red-hat-centos)は事前に入れておきます。rpm-buildとgccも当然必要です。


docutilsが必要なのでhttp://sourceforge.net/projects/docutils/?source=directoryからダウンロードして展開し



python setup.py install


してあげます。


3.RPM作成

とりあえずRPMだけ作成したいので、ソースディレクトリ内のredhatディレクトリから



rpmbuild -bb varnish.spec


してやります。specファイルのバージョン部分の修正が必要です。


4.インストール

適当にrpm ivhとかして下さい。


5.libvmod-awsrestインストール

mhashが必要なので事前にインストールしておきます。


ダウンロードはhttps://github.com/xcir/libvmod-awsrestから。


VARNISHSRCは/usr/src/redhat/BUILDでconfigure。


6.VCL編集

Varnishが使用するVCLを編集します。Exampleの通りで大体できると思いますが、backendの「.host」に指定するドメイン名にはバケット名を先頭につけてやらないとダメかも?


そんなこんなでAWSAccessKeyId、AWSSecretAccessKeyを記載してlookupしてやります。


お望みの通りファイルは取得できたでしょうか。


おまけ.隠蔽工作

高貴な恥じらいをもつ紳士淑女ならS3を使用していることをちょっと隠したいかもしれません。


S3からのレスポンス内のヘッダをvcl_fetchの中で



unset beresp.http.x-amz-request-id;
unset beresp.http.x-amz-id-2;


等としてやると謎めいた雰囲気をより一層醸し出せるかもしれません。




いわなちゃんさん先生本当にありがとうございました!




おまけのおまけ

Varnish 3.0.2だとvarnishtestでコケまくりました。


使用ポートのレンジを広げてもulimit -nを増やしてもsomaxconnを増やしてもテストの並列度?を1にしても(そもそもそれらが関係あるか分かってませんが)ダメでした。





GlusterFS導入でハマった話



導入方法は検索すれば豊富に出てくると思うので割愛。


軽くハマった話を。


環境は




  • 3.2.21-1.32.6.amzn1.x86_64

  • gluster関連パッケージは全て3.3.0-1.el6.x86_64


です。




とりあえずテスト用に導入して、良い感じだったので同じサーバにちゃんとした名前にして再作成しようとしたら



$ sudo gluster volume create <ボリューム名> <option> <peer1>:<パス> <peer2>:<パス>
<パス> or a prefix of it is already part of a volume


と怒られ作成できない。


調べてみると


gluster volume delete <ボリューム名>


とボリュームを削除しても属性までは削除してくれず、残ってしまうっぽい。


(参考:https://bugzilla.redhat.com/show_bug.cgi?id=812214)




なので、属性を削除してみる。



$ sudo getfattr -m - -d <パス>
# file: <パス>/
trusted.glusterfs.volume-id=*********************


で確認して



$ sudo setfattr --remove=trusted.glusterfs.volume-id <パス>


で削除。


trusted.gfid も表示された場合はこれも削除




もう一度。



$ sudo gluster volume create <ボリューム名> <option> <peer1>:<パス> <peer2>:<パス>
Creation of volume <ボリューム名> has been successful. Please start the volume to access data.


出来ました。


カジュアルに対応するとこんな感じでしょうか。





sudoers



うっかり /etc/sudoers のパーミッションを変更してしまったのでメモ。


環境はEC2なのでご注意を。




というかここに書いてある通りにやっただけですが。




  1. 一時インスタンス作成

  2. やっちゃったインスタンス停止

  3. やっちゃったインスタンスのルートデバイスのEBSをデタッチ

  4. 一時インスタンスに上でデタッチしたEBSをアタッチ

  5. 上でアタッチしたデバイスをマウント

  6. マウントしたディレクトリ配下の/etc/sudoersのパーミッション修正

  7. 修正したらアンマウント

  8. そしてデタッチ

  9. やっちゃったインスタンスの/dev/sda1にアタッチ

  10. そして起動


という感じ。


アホなことしないでちゃんとvisudo使います…。