[時間割:Perl]『ミニマルPerl』その16
2009/01/30 02:12 posted by kunkichi
ちょっと間が空いちゃったけど、木曜日は「Perl」の時間。引き続きfind編です。
Tim Maher
オライリージャパン
売り上げランキング: 96883
- パイプの代わりに、バッククォートを使ったコマンド置換で、ファイル名を引数に取るようなところでもPerlは役に立つ。
# grep 'John' `ls -d * | perl -wnl -e '-T and print;'カレントにあるディレクトリ・ファイルの一覧(ディレクトリの中身は含まない)からテキストファイルであるものを出力し、それらのうち、’John’を含む行を抽出している。
- これをファイル形式で書くとこんな感じ
#!/usr/bin/perl -s -wnl
BEGIN {
@ARGV and $re or
warin "Usage: grep_text -re='REGEX' filen1 [file2, file3, ・・・]
and exit 255;
-T $ARGV or close ARGV and next;
/${re}/i and print "$ARGV: $_";引数 -reで検索したい表現を指定。ファイルがテキストファイルでなければcloseして次のファイル、テキストファイルであれば、引数で指定された表現が含まれているかをチェックして、含まれていればファイル名とその行を表示する。
こういうcloseの使い方を覚えないとね。
- 最初のコマンドのケースをfindのように再帰的にするならば
# grep 'John' `find . -type f -print | perl -wnl -e '-T and print;'
- 引数がファイル名でない場合でも、バリデーションの目的でPerlを使うのも有用。引数のためのプリプロセッサという感じ。
- find で抽出したファイルに対して何かコマンドを実行したい場合は-execを使ったり、
# find . -type f -exec rm {} ¥;とか# find . -type f | xargs rm とかでできるが、それぞれ問題がある。
- -execの場合はコマンドのプロセスがfindの抽出結果分だけ起動する。
- xargsの場合は1回のパイプで渡せる上限の数で渡すので、コマンドのプロセスは節約できるが、たとえば以下のケースだと、
# find . -type f | xargs sort | tail -1もしfindの数が1回のパイプの上限を超えていた場合は、分割された「まとまり」単位でsortが実行されるため、全体をsortした結果の最新(最後の1行)にはならなかったりする。
- Perlだとこれを回避できる。以下サンプルスクリプト。
#!/usr/bin/perl -wnl
BEGIN{ $latest_modified=0; }
$mtime = (stat $_)[9];
if( $mtime > $latest_modified ){
$last_modified = $mtime; ※ここで最新のファイルのタイムスタンプが保持される。
$last_modified_file = $_; ※ここで最新のファイルのファイル名が保持される。
}
END{
print $name;
}まあプログラミングらしく、最新のタイムスタンプを変数に記録しておいて、それと比較して最も最近のものの情報(ファイル名、タイムスタンプ)を常に更新するような仕組みにすればよいということだね。
- あとxargsだと空白文字を含む引数は別々の引数として処理されしまう。Perlだと空白を区切りとして分割させないこともできる。
# find . -type f | perl -wnl -e 'print -s, " $_";
grepやawkの置き換え、だけでなく、今回のfindのように、組み合わせて有効に使えるというのもPerlのよいところだね
これでfindも終わりました。
次回はこれまでのコマンドよりの部分から、もう少しプログラミングに近いところのお話。
Category: Programming, Perl | コメント&トラックバック(0)
[時間割:サーバ]『RADIUS - ユーザ認証セキュリティプロトコル』その1
2009/01/29 02:42 posted by kunkichi
相変わらず体調も精神も停滞気味な感じですが、無理せずできるレベルでがんばります。
毎週水曜日は「サーバ」の時間だったのだけど、これ!と興味が沸くようなものがなくて、ダラダラと本を読んだりしてたのですが、ちょい仕事で必要に迫られたこともあって(笑)今回から『RADIUS』を勉強してみようかと思います。
とはいっても、日常業務でそれなりには触ってるので、ちゃんと系統立てて整理していくのが目的です。
Jonathan Hassell アクセンス・テクノロジー
オライリー・ジャパン
売り上げランキング: 193762
RADIUSとは
- Remote Access Dial In User Serviceの略。
- 「AAA」モデル。認証(Authentication)、承認(Authorization)、アカウンティング(Accounting)。
- 認証 ・・・ 正規のユーザであるかの確認。一般的なIDとパスワードの組み合わせ。
- 承認 ・・・ 認証されたユーザに対して、どのようなサービスを許可するのか。
- アカウンティング ・・・ ユーザが利用した事実と利用状況を記録する。
- クライアント・サーバ方式。クライアントがサーバのリソースを使用する。
- プロキシも可能。AAAサーバが他のAAAサーバへの要求の転送を行う。プロバイダ同士の再販とか卸とか。
- ホップトゥホップ方式とエンドトゥエンド方式。
- ホップトゥホップ方式
- 利用者端末 <=> 着信装置(NAS、BASなど)<=> AAAサーバ <=> 他AAAサーバ
- 隣接する機器同士の間に「信頼」関係が確立される。(利用者端末と着信装置、着信装置とAAAサーバ、AAAサーバと他AAAサーバ、・・・)
- エンドトゥエンド方式
- 利用者端末 <-> 着信装置(NAS、BASなど)<-> AAAサーバ <-> 他AAAサーバ
- 利用者端末と最終到達点のAAAサーバ間で「信頼」関係が確立される。その間は単なる経路。
- AAA承認フレームワーク
- エージェント手順
利用者端末とサービス機器の間にAAAサーバを置く。利用者端末からの要求をAAAサーバが承認し、サービス機器にサービス提供を指示する。
- プル手順
利用者端末とAAAサーバの間にサービス機器を置く。利用者端末からの要求があれば、サービス機器は、承認をAAAサーバに行い、承認されたら利用者端末にサービスを提供する。
- プッシュ手順
利用者端末はAAAサーバに要求を行い、承認されたら「チケット」を応答する。利用者端末はそのチケットを持って、サービス機器にサービスの提供を要求する。
- UHO(User Home Organization) ・・・ エンドユーザと直接サービス利用契約関係を結ぶ組織。
- サービスプロバイダ ・・・ 実際にサービスを提供する組織。
- UHOとサービスプロバイダが同一の場合は、AAAサーバとサービス機器は同じ組織内にあることが多い。
- UHOとサービスプロバイダが別々の場合は、UHOがAAAサーバを持ち、サービスプロバイダがサービス機器+AAAサーバを持つ、などの形態になる。これをローミングという。ローミングでも上の3つの承認フレームワークが当てはまる。
- UHOが、複数の別々のサービスプロバイダを利用して、一定のサービスを利用させるような形態を、分散サービスという。
- どのようなルールでユーザを承認しサービスを提供するかを決めているのがポリシーである
- 資源管理とセッション管理
- 資源管理
割当可能な資源の利用状況を監視するための機能
- セッション管理
セッション状況を記録し、その内容に応じてセッションの状態を変更させる機能。
- RADIUSプロトコルの特徴
- UDP。
- ホップトゥホップ。
- 「状態」がない。
- PPPでのPAP認証とCHAP認証をサポート。
- MD5によるパスワードの隠蔽。
- 属性値のペア。ベンダ固有で作ることも可能。
- MD5によるパスワードの隠蔽
- RADIUSプロトコルの制限
- セキュリティ的な問題。PPPのPAP認証では経由するプロキシがパスワードを見ることができる。
- あくまでも承認までしか行わない。承認後は資源割当の解除や停止はできない。
- 「状態」がないため、資源管理・セッション管理が100%ではない。
- 大規模システムではパフォーマンスの低下、データの損失の問題が発生するため、スケーラビリティが低い。
まだ最初のところなので概念とか言葉とかそういう点が多いのだけど、AAAフレームワークみたいなのは、システムの設計や構成を考える上では非常に役に立ちますね。
今日はここまで。次回はRADIUSプロトコルの仕様についてです。
Category: Server | コメント&トラックバック(0)
[時間割:C言語]『はじめてのC言語完全入門』その16
2009/01/24 00:40 posted by kunkichi
ここんところ疲れが出たみたいで、本読みつつ知らないうちに落ちてるという毎日で少しアップをサボり気味、、、また気分入れ替えて出直しです。ということで金曜日は『C言語』。今回は文字列の応用編。
塚越 一雄
技術評論社
売り上げランキング: 420963
- stdlib.h ・・・ 数値への変換
#include <stdlib.h>
- 文字列をintに変換
int i = atoi("12345");
i += 5;
printf("%d\n",i);
結果:12350
- 文字列をlongに変換
long l = atol("1000000000");
l += 1000000000;
printf("%ld\n",l);結果:2000000000
- 文字列をflotに変換
double f = atof("3.141");
f += 0.245;
printf("%f\n",f);結果:3.386000atofはfloat型でなくdouble型に変換するので注意
- 数値と文字が両方含まれる場合
- 文字は変換できないのでその手前までを変換しようとする。
int i = atoi("12345abcde");
printf("%i\n",i);結果:12345最初から文字があって数字が続く場合int i = atoi("12345abcde");
printf("%i\n",i);結果:0
- 先頭の空白文字は無視される
int i = atoi(" 12345");
printf("%i\n",i);結果:12345
- strings.h ・・・ 文字列操作
#include <strings.h>
- 文字列のコピー
- そのままコピー
char str1[] = "abcdefghijklmnopqrstuvwxyz";
char str2[256];
strcpy(str2,str1);
printf("%s\n",str2);結果:abcdefghijklmnopqrstuvwxyzstrcpyの引数はコピー先、コピー元の順なので注意。
- コピーする文字数を指定してコピー
char str1[] = "abcdefghijklmnopqrstuvwxyz";
char str2[256];
strncpy(str2,str1,10);
str2[10] = '\0';
printf("%s\n",str2);<code>結果:<code>abcdefghijstrncpyの場合、コピー元文字数とコピーする文字数に注意。
「コピー元文字数<コピーする文字数」の場合は上記のように最後にNULL文字を付与してやる必要がある。
逆に「コピー元文字数>コピーする文字数」の場合は残りの文字をNULL文字が埋めるので気にしなくてよい。
- 文字の連結
char str1[] = "abcdefghijklmnopqrstuvwxyz";
char str2[] = "1234567890";
strcat(str2,str1);
printf("%s\n",str2);結果:1234567890abcdefghijklmnopqrstuvwxyzstrcatは第1引数の後ろに第2引数をくっつける。
連結先は連結した文字列を含める十分なサイズを持ってないと行けないとあるけど、上のように書くと特に意識しなくても連結されるんだけどなぁ、、、
おっと、なんかまとめるのに時間がかかったなぁ。あんまりページ進んでないやw。
まあ少しでも毎日続けれるように、無理せず今日はここまで。
Category: C, Programming | コメント&トラックバック(0)
[時間割:C言語]『はじめてのC言語完全入門』その15
2009/01/18 21:13 posted by kunkichi
火曜日は仕事だったのでしょうがないとして、金曜日は帰宅早々寝ちゃったので、その分を取り返しておきます。ということで『C言語』です。引き続き文字列とポインタです。関数の引数として文字列を渡す、その関数を呼び出す、というのをやります。
塚越 一雄
技術評論社
売り上げランキング: 420963
- 引数の書式は2パターン。配列で渡すか、ポインタで渡すか。
- 配列の場合
void kansu(char str[])
{
printf("渡された引数は%sです。¥n", str);
}配列の場合はサイズ指定できないのは通常の配列と同じ。また、この時strは配列名であり定数である点に注意。
- ポインタの場合
void kansu(char *p)
{
printf("渡された引数は%sです。¥n", p);
}この時strはポインタであり変数である点が配列で渡す場合と異なる。
- 配列形式、ポインタ形式のそれぞれで渡された配列の引数は意味としては異なるけど、関数内では文法上同じ扱いになる。従って、
- 配列で渡されたものを関数内でポインタとして使っても良い。
- ポインタで渡されたものを関数内で配列として使っても良い。
以前にやった配列とポインタのところと全く同じ。
- 呼び出す時は、文字列の先頭アドレスを渡してあげる。つまり、
- 文字配列で渡す場合は配列名(配列名は配列の先頭アドレスを示す)
kansu(str);
- ポインタで渡す場合はポインタ(ポインタはそもそも先頭アドレス、サイズはポインタの型が決める)
kansu(p);
- さらにもう一つ、文字列を直接指定してあげることもできる。
kansu("abcdef");というのは式の中で文字列リテラルが渡されると先頭アドレスとして評価されるから。
- ということでサンプル。書籍にもある、エラーメッセージとリターンコードを渡して、exitしちゃうプログラム。配列指定の場合とポインタ指定それぞれの場合の関数を用意してます。mainの中で呼び出す関数を変更すればそれぞれを呼び出します。まあ結果は同じなんだけど。
#include <stdio.h>
#include <stdlib.h> /* include exit() */
void fatal_p(char *errmsg, int errcode);
void fatal_a(char *errmsg, int errcode);
int main()
{
fatal_a("異常終了!!!",255);
fprintf(stdout,"%s\n", "正常終了");
return 0;
}
void fatal_p(char *errmsg_p, int errcode)
{
fprintf(stderr, "%s\n", errmsg_p);
exit(errcode);
}
void fatal_a(char errmsg_a[], int errcode)
{
fprintf(stderr, "%s\n", errmsg_a);
exit(errcode);
}
- さっきの例では、サンプルの関数はvoidだったので何も返さないのだけど、関数で文字列を返す場合は、関数の型を文字へのポインタとして定義する必要がある。そして呼び出す際は、返された文字列を一時的に入れておく文字列用バッファを用意しておいてそこに代入する。
char *kansu(〜){
・・・
}
int main(){
char str[256];
char = kansu(〜);
}とあるのだけど、んー、うまく動かない、、、最後に書いてある、文字列を渡したら最後の1文字を除いた文字列を返すサンプルスクリプトをちょっといじってみた。本の中ではループで順に1文字づつ消しているのだけど、単に1文字だけ返すように書き換えてみたのだけど、バッファに返そうとするところでコンパイラがエラーを吐いちゃう。#include <stdio.h>
#include <string.h>
char *remove_last_char(char str[])
{
int last = strlen(str);
if( last > 0 )
str[last-1] = '\0';
return str;
}
int main()
{
char s[] = "1234567890";
char ret[256];
ret = remove_last_char(s);
printf("%s\n",p);
}ビルドするとこんな感じ。$ gcc -o str_ary2 str_ary2.c
str_ary2.c: In function ‘main’:
str_ary2.c:19: error: incompatible types in assignment
本のサンプルと同様に関数の結果をそのままprintfに渡してやるとちゃんと動く。#include <stdio.h>
#include <string.h>
char *remove_last_char(char str[])
{
int last = strlen(str);
if( last > 0 )
str[last-1] = '\0';
return str;
}
int main()
{
char s[] = "1234567890";
printf("%s\n",remove_last_char(s));
}なんでかなぁ〜、、、文字へのポインタにする意味がまったくわからない。
うーん、やっぱりポインタ、配列、文字配列とまだまだ整理できてないので、理解できてない。以前にやった、ポインタと配列のところ読み返してみたんだけどね〜、それでもだめか。一度整理しておく必要があるかな。ただまあそれは課題として置いておいて、どんどん進んで一通り終わらせることを優先とします。
次回は文字列の応用編。
Category: C, Programming | コメント&トラックバック(1)
[時間割:Perl]『ミニマルPerl』その15
2009/01/16 01:00 posted by kunkichi
木曜日は「Perl」です。今回からfindコマンドです。これまでやってきた grep、sed、awk については、Perlで置き換えれるように見てきたのだけど、find の場合は「Perl との組み合わせ」でいろいろやっていきます。
Tim Maher
オライリージャパン
売り上げランキング: 96883
- ファイルのテスト機能。シェルやtestコマンドで使うようなやつです。
例:sample.txt が通常のファイルだったら。 -f sample.txt and print;例:sample.binが通常のファイルじゃなかったら。! -f sample.bin and print;ファイル名を省略して$_にすることもできます。
例:$_ が 通常のファイルだったら。-f and print $_;例:$_が通常のファイルじゃなかったら。! -f and print $_;
- これ以外にもテスト機能の指定はできます。findじゃできないような、テキストとバイナリのテスト、実行ユーザの権限に準じたアクセス権でのテスト、などなど。
- find と Perl を組み合わせでは、find で一連のパスを作っておいて、フィルタをかけるのにPerlを使います。
$ find . -type -name '*.dat' |
> find /var/log -mtime -3これにPerlでフィルタをかけます。> | perl -wnl -e '/-f and -T/ and print;'上記の例では、findでカレントディレクトリ配下の”*.dat”というファイル名で、かつ、最終更新日が3日以内のファイル名をリストアップして、最後にPerlで、通常ファイル、かつ、テキストファイルのものだけを抽出しています。
- 名前のマッチングとかはPerlの強力な正規表現をつかったほうがらくちんです。
$ find . -type -f | perl -wnl -e '/.+¥.dat$/ and print;'ちなみにfindの場合は以下。$ find . -type f -name "*.dat"ファイル名のマッチングが一つだけしかないなら、それほどでもないけど、以下のように複数のファイル名のマッチとかの場合は、括弧で囲んだ上、エスケープして、複数のファイル名の条件は、-oでつなぐ、そして、ファイル名のマッチにはワイルドカードレベルのものしか使えない、となり結構面倒。$ find . -type f \( -name '*.dat' -o -name '1¥.*' -o '*34*' \)
- フルパスでファイルのリストがあって、この中から、特定の「ファイル名だけ」でマッチをしたい場合、以下のように-aオプションでパスを分解して使うと良い。
$ find . -type f | perl -wnla'/' -e '$F[-1] =~ /abc$|*cde*|^123/ and print;'
- 逆に特定の「ディレクトリ配下」という指定もできる。
$ find . -type f | perl -wnl -e '-T and m:data/\w+\.dat:i and print;'-Tでテキストファイル限定、mを使って正規表現中にパスを表すスラッシュをいちいちエスケープしないように、iで大文字小文字無視。こういうのはfindだけではちょっと難しいのでかなり便利。
とりあえず今日はここまで。
Category: Programming, Perl | コメント&トラックバック(0)
お休み
2009/01/13 20:47 posted by kunkichi
今夜は徹夜で仕事があるので、おべんきょはお休みです、、、
まあ、仕事やけん、しょうがなか。
Category: Diary | コメント&トラックバック(0)
[時間割:Perl]『ミニマルPerl』その14
2009/01/12 23:53 posted by kunkichi
祝日ですががんばります。月曜日は「Perl」。AWKをPerlでやってみようの最後です。演算子とか組み込み関数とか。
Tim Maher
オライリージャパン
売り上げランキング: 96883
これでAWKのところも終わりました。次はfindコマンドの機能をPerlでやっていきます。
Category: Programming, Perl | コメント&トラックバック(0)
[時間割:C言語]『はじめてのC言語完全入門』その14
2009/01/10 03:37 posted by kunkichi
金曜日は「C言語」。文字列とポインタです。難しそーだなー。
塚越 一雄
技術評論社
売り上げランキング: 420963
- 文字へのポインタ宣言。
char *p;
- ただしこの時文字列のためのメモリ確保は行われていないため、以下の方法でメモリを確保する。
- 動的メモリの確保。これは後日。
- 配列を確保して先頭アドレスをポインタに代入。
char *p;
char str[]= "Hello, World";
p = str;これでpが文字列を表す変数として使えるので、printfで出力してみる。printf("%s¥n",p);結果:Hello,Worldさらにポインタをインクリメントして、文字列の操作もできる。p++;
printf("%s¥n",p);結果:ello,World
- 文字列リテラル
char *p = "Hello, World";シンプルでわかりやすい。ただし、確保した文字列の変更はできない。printf("%s\n",p);
*p = 'h';
printf("%s\n",p);結果:Hello,World
Bus error逆に、配列を確保してポインタに代入した場合は変更できる。char *p;
char s[] = "Hello,World";
p = s;
printf("%s\n",p);
*p = 'h';
*(p+6) = 'w';
printf("%s\n",p);
return 0;結果:Hello,World
hello,world
うーん、なんかピンとこないなー。配列、ポインタ、文字列とややこしいのがミックスした感じですっきりしない。
もう一度、前のところ見直してみようかな。
ちょっと短いけど今日はここまで。
Category: C, Programming | コメント&トラックバック(0)
[時間割:Perl]『ミニマルPerl』その13
2009/01/09 01:44 posted by kunkichi
木曜日は「Perl」です。引き続きAWK編。今回は「パターン範囲」で特定のレコード「群」を抜き出すのをやってみたいと思います。
Tim Maher
オライリージャパン
売り上げランキング: 96883
複数行を範囲で抽出するシチュエーションで本当に多いので、これはかなり使えるかも。
Category: Programming, Perl | コメント&トラックバック(0)
[時間割:読書] [お知らせ] メディアマーカーに移行
2009/01/08 23:26 posted by kunkichi
READING HACKS!読書ハック!―超アウトプット生産のための「読む」技術と習慣に書いてあった、「自分の読書の傾向を管理する」ためにお試しで使っていたメディアマーカーですが、書評やレビューはもう完全にあっちに移行することにしました。

なんといっても便利なのが、
- 月に書籍購入費がどれだけかかっているか?を把握できる。
- 月に何冊読了しているか?を把握できる。
- この二つがグラフで表示される。
- 本のカテゴリーをタグづけできるのでどの分野に偏っているか?が把握できる。
- 同じ本を読んだ人の一覧やコメントが「はてブ」チックに見れる。
というところ。似たようなサイトは他にもあるのだけど、基本的にはこれらの点だけ把握できれば個人的には十分なので、満足しています。欲を言うと、
- 書評ではなく自分用まとめをメインで書きたいのでエディタ機能をもう少し充実してほしい。特に箇条書きができないのが痛い。
というところだけがアレなのですが、まあそのうち改善されることを期待。ちなみに会社の同僚もこれを使っていることがわかったので、互いの本棚をのぞいてる感じがとても楽しかったりします(笑)。
他のITエンジニアの方の本棚ものぞいてみたいです。よかったらトラックバックで教えてください。
メディアマーカー - kunkichiのバインダー
Category: Book | コメント&トラックバック(0)
Page 5 of 32« First...«34567»...Last »
2010/09/02/ 09:25
2010/08/13/ 00:45
2010/07/29/ 17:56
2010/07/10/ 01:48
2009/10/21/ 14:08