TOP > 2010年05月

工作!

2010.05.20 Author: sib

好奇心旺盛なコネクティボ社員。
ある日の光景ですが良く見ると・・・

tape01.jpg

tape02.jpg

壁になんか張り付いてますっ?!

続きを読む >>

vim リストを代入

2010.05.17 Author: 路地

またまたvimのお話です。
vimでは他のいくつかの言語と同じように変数に値を代入するとき、左辺にリストを持ってくる事ができます。

let [ foo , bar ] = [ 10 , 20 ]
echo foo " 10
echo bar " 20
let [ foo , baz ] = [ 10 , [ 20 , 30 ] ]
echo foo " 10
echo baz " [ 20 , 30 ]

これを使うとmatchlist関数を受け取るときに便利です。 matchlist関数は matchlist({expr}, {pat}[, {start}[, {count}]]) という書式で、評価するとマッチした結果を10個の要素を持つリストで返します。 ※マッチしないと空にリスト[]を返す

let [ match , sub1 , sub2 , sub3 , sub4 , sub5 , sub6 , sub7 , sub8 , sub9 ] = matchlist( '2010/05/17' , '\(\d\{4}\)\/\(\d\{2}\)\/\(\d\{2}\)' )
" ['2010/05/17', '2010', '05', '17', '', '', '', '', '', '']

上の文の問題は左辺と右辺の数が合わないとエラーになる為、matchlistが必ずマッチしないとダメと言うところですね。その辺は一旦別の変数を経由してマッチしたかどうか調べればよいと思いますが、面倒ですね。 代入が式ではない悲しさを感じます。

ERMおぼえがき

2010.05.17 Author: こん

こんにちは。

ciscoのERMの設定について、簡単なものについて少しおぼえがきです。


続きを読む >>

刺激を受けました

2010.05.17 Author: AES

AESです。


私事ですが、先日、以前私がアルバイトをしていたところへお邪魔してきました。

久しぶりに会うメンバーもいたので色々と話してきました!


詳しい内容は割愛しますが、メンバーと話す中で

人も職場も、私がいた頃よりも成長しているなぁ、と感じました。


今は一緒にではないですが、皆それぞれ頑張っているのだな、

と刺激を受けるとともに、

私も今後、成長できたと実感できるように

様々なことに取り組んでいこう、と感じた出来事でした。

スウィートバジルを植えました

2010.05.14 Author: たわばがに

ということで、GW前に宣言した通り、
スウィートバジルの種を植えました↓。

続きを読む >>

LPIC 女性キャンペーン

2010.05.13 Author: Jas

LPICがまた女性限定のキャンペーンを行っているようです。

以前にも女性限定でアンケートキャンペンを行っていましたが、
今回のキャンペーンはLPIC認定者または受験者限定です。


続きを読む >>

PostgreSQLのユーザー定義型

2010.05.11 Author: Sinn

PostgreSQLのユーザー定義型を利用して、
内部で暗号化されたカラムを作成したので、その過程でハマったことを
覚書も兼ねて投稿しておきます。

1. 可変長データのサイズ設定

可変長データは、内部的に

/************************/
typedef struct
{
int4 sz; // 構造体の総サイズ
char val[1]; // データ格納位置(ダミー)
} EncryptedText
/************************/

のように表現されているのですが、

/************************/
EncryptedText a;
a.sz = 100;
/************************/

のように書くとNG。
この場合、専用のマクロを使って

/************************/
SET_VARSIZE(a, 100);
/************************/

としなければいけません。
また、ここで設定した値を取り出す場合も

/************************/
VARSIZE(a);
/************************/

とする必要があり、実際のデータ(val部分)にアクセスする場合も

/************************/
VARDATA(a);
/************************/

とします。全てマクロ経由でアクセスしないとダメということです。

2. 他で定義されている関数の呼び出し

今回は暗号化するということで、pg_cryptoモジュールで定義されている pgp_sym_encrypt/decryptを使用しましたが、これらのプロトタイプ宣言は

/************************/
Datum pgp_sym_encrypt(PG_FUNCTION_ARGS)
/************************/

となっています。pgp_sym_encryptの内部では

/************************/
bytea* pgp_sym_encrypt(const char *str, const char *pass, const char *cipher_algo);
/************************/

と同等なのですが、この形式で呼び出すことはできません。
なんとかして暗号化対象文字列をPG_FUNCTION_ARGS形式に変換する必要があるのですが、、
仕方なく、PostgreSQLのソースコードに潜ると・・・
こんなものがありました。

/************************/
Datum DirectFunctionCall3(関数ポインタ, Datum, Datum, Datum);
/************************/

Call3の部分は、渡す引数の数に応じて1~5まであります。
これを使えば、引数がPG_FUNCTION_ARGSで定義されている関数を呼び出すことができます。

3.メモリリーク対策

PostgreSQLのメモリ確保は、pallocを使用します。 これを使うと、1回のクエリ(トランザクション)終了時に使用していたメモリを解放してくれるので 基本的にメモリリークはありません。 ただし、戻り値以外の変数領域確保にpallocを使った場合は、ちゃんとpfreeで解放する必要があり ます。


次回は、作成したC言語関数を登録する際にハマったことを書く予定です。