2009年5月27日 (水)

ITパスポート試験合格しました

受験番号を一部隠してますが・・・

Itp090526

結構良い点取れました。というか、自己採点より良かった。

いろんなところで感想が上がっていると思うのですが、うちの感想はこちら。
社内向けに出したメールです。

受けた感想ですが、この業務に即役立つ試験ではないです。
しかし、この部署も含めてIT業界の入口に立つ上では役に立つ、俯瞰的な
試験だと感じました。

5年近く前に受けた初級シスアドと比較すると、ストラテジ系、
マネジメント系の問題が多いです。
ITILを意識した問題も3問ほどありました。
逆にビット演算や8進数、16進数の計算などは出ませんでした。

また、中問にネットワーク障害の切り分けの問題が出ていました。
一度見てみるとよいと思います。

以上、資格取得を考えている方は見てみるとよいと思います。

既に秋に受験する基本情報試験の勉強も進めてます。

こちらはビット演算とか2の補数とかx進数の演算とかシフト演算とか、興味深くて面白いっす。20代のころは全然覚えられなくて面白いとも思わなかったんだけどなぁ。今ではコンピュータサイエンスの分野を基礎からやり直したい気分だったりします。

| | コメント (0) | トラックバック (0)

2009年5月11日 (月)

Crammediaの問題集を買ってみる

LPIC level1も残すところ102のみなのですが、いまいち気合が乗らないので・・・

クラムメディアLPIC - 1問題集

一気に高めの問題集買ってみることにしました。

Crammediaは評判が良いというか、4年くらい前に受けたMCPの社内講習の時に「ここの問題集は当たるよ」とのことでずっと気にはなっていたんですね。

この機会にえいやと購入してみます。

後で感想あげますねー。

| | コメント (0) | トラックバック (0)

2009年4月24日 (金)

基本情報技術者試験受験します

お久しぶりでございます。

いろいろとあって、なかなか本命の.comMaster★★★は遠い昨今。
しかし、外堀を埋めていると思っていろんな試験に手を出しております。

まぁ、資格取得を通して自分の位置をはっきりさせようと思っているんですが。
あとまぁ、会社の立場上とっておいて後進に伝えられることがあればと思っています。
プラス、今後転職するときの履歴書埋めかな。
なにより、ちょっと自信がつくのが良いですね。

そんなこんなで、資格取得の状況はこんな感じです。

  • 2008年12月:ILIT foundation
  • 2009年03月:LPIC101
  • 2009年04月:ITパスポート試験(予定)

次の試験ですが10月の基本情報技術者試験を受けます。
ベンダー系ではLPICの102試験を6月に受験します。
LPICは4月に試験範囲が改訂されたんで、間が悪かったけど仕方がないです。
これも試験の一つ。

早速、基本情報技術者の午前問題やってみたのですが48/80でした。
以外に取れたという印象。
しかし、当然合格には足りないと思われるので勉強ですね。
あと5カ月あるので、コツコツ積み上げていきます。

もうひとつ、午後問題ですが、CASLにするか、表計算にするか迷い中です。
プログラミングはperlくらいなので・・・しかもscript kiddyの範疇でてないものなぁ。

| | コメント (0) | トラックバック (0)

2009年2月24日 (火)

「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その2)

■ワードカウントさせてみよう

「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その1)でやったtreeにワードカウント機能をつけてみる。(ただし、半角で区切りを判断するので、英語用かな)

  • $depをグローバル変数にして使ってみる。(現在いる階層の深さ)
  • $awcという変数を全ワードカウントの累計につかう。
  • -Tはテキストファイルの場合に真になるファイルチェック演算子
  • -Bはバイナリファイルの場合に真になるファイルチェック演算子
  • ワードカウントの方法は、wcコマンドの出力を空白でsplitした3番目の要素を使う
  • $dwcにはディレクトリごとのワード数を累計する

#! /usr/local/bin/perl

# tree .. カレントディレクトリ以降のファイルリストを作成
# ワードカウントもあるよ

$dir = 'pwd';
print $dir;
$dep =1;
$awc = 0;
&dirproc;
if ($awc > 0){
print "\n*** this directory has $awc words test files in total.\n";
}

sub dirproc {
my(@files , $file , $dwc);
@files = sort(glob("*"));
foreach $file(@files) {
  if (-T $file){
   @t=split(/\s+/,`wc $file`);
   for ($i = 1; $i <= $dep; $i++){
    print "|\t";
   }
   print $file."\t".$t[2]."\n";
   $dwc += $t[2];
   $awc += $t[2];
  }
}

if ($dwc > 0){
  for ($i = 1; $i <= $dep; $i++){
  print "|\t"
  }

  print "\n*** this directory has $dwc words test files in total.\n";
}

foreach $file(@files) {
  if (-B $files and -f $file){
   for ($i =1; $i <= $dep; $i++){
    print "|\t";
   }
   print $file."\n";
  }
}

foreach $file(@files) {
  if (-d $file){
   for ($i = 1; $i <= $dep; $i++){
    print "|\t";
   }
   print $file."\n";
   ++$dep;
   chdir($file);
   &dirproc;
   chdir(".." or die "waaaa");
   --$dep;
  }
}
}

| | コメント (0) | トラックバック (0)

2009年2月23日 (月)

「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その1)

■リカーシブ処理とは
猿が玉ねぎの皮を無限に向いて行くようにどんどんディレクトリを掘って深く処理することをリカーシブ(recursive)処理とか再帰的処理という。

rm に -R のスイッチを渡すと、rmはリカーシブにそのディレクトリ以降のうファイルまたはディレクトリをすべて削除する。

このような処理をする場合にはリカーシブコールができると楽。
リカーシブコールとは、あるサブルーチンの中からそのサブルーチンを呼び出すこと。

概念をプログラム風日本語で書く
このように自然言語でプログラムを書くことを疑似コーディング(スードコーディング:pseudo cording)という。

メイン:
「ディレクトリごとの処理」を呼び出す。

「ディレクトリごとの処理」サブルーチン:
そこにあるファイルに対してファイルごとの処理を行うことを、
ファイルがある限り繰り返す。

そこにあるディレクトリすべてに対して、いかの処理を繰り返す{
  そのディレクトリに入る   # cd そのディレクトリ
  「ディレクトリごとの処理」を呼び出す #ここがリカーシブ
  もとのディレクトリに戻る  # cd ../
}
}

これで全ディレクトリに対してリカーシブに処理が進む。

■ディレクトリ構造をtreeコマンドで表示させる
・Windows NTのDOS窓にあって、95とUNIXにないのがtreeコマンド
・perlでtreeコマンドを作ってみる。

●ローカル変数を定義する
メイン処理

$dir = `pwd`; #pwdコマンドを実行して、その結果を$dirに入力
print $dir; #$dirを表示
$dep =1; #自分のいる階層の深さを1で初期化
&dirproc($dep); #サブルーチン&dirprocに$depを渡してサブルーチン処理へ

引き続き。

sub dirproc {
my($dep) = @_;
my(@files,$file);

まず、myによってサブルーチン内でのみ通用する変数を定義する。
このような変数はローカル変数と言われる。
コレよにって、サブルーチンの外側で同じ名前の変数が利用されても、それらの変数とは衝突(conflict)しない。
コレを別の名前空間、またはネームスペース(name space)をもつと言う。

ローカル変数を利用する利点は、
1.衝突を防げるという、保険的意味合い
2.汎用性(サブルーチンのコードをそのまま流用できる)

なお、プログラム全体で利用できる変数はグローバル変数と言われる。

ただし、自分を再帰的に呼ぶ場合には変数をローカル変数にしないと動かない。
理由は「自分」自身で「自分」を呼び出す、という処理をするため。

dirprocは呼びだされると my キーワードによって、新しいネームスペースに変数 $files と @files を用意する。
これが新しい階層ごとに行われ、変数名が同じであっても、新しいネームスペースに存在するためにぶつかることはない。

●ファイルごとの処理

@files = sort(glob("*"));

ファイル名グロブ (glob("*")); はリストコンテキストで全ファイル/ディレクトリを返す。
それを辞書順でsortしたものを配列@filesに入れる。globについては195p。引用。

リストコンテキストでは、globはファイル名パターンにマッチするファイルの全ファイル名を一気に返します

ファイル名パターンが「*」だから、全ファイルなわけだな。

foreach $file(@files) {
if (-f $file){
  for ($i = 1; $i <= $dep; $i++){
   print "|\t";
   }
   print $file."\n";
  }
}

ここで、

@filesをなめて、$fileに入れ、操作します

とあるけどなめる?イメージできん・・・

if (-f $file){

ここで出てくる -f はファイルチェック演算子というものの一種で、右に来る文字列の中身をファイル名として吟味する。

-f はファイルの略で、右に来るものが存在し、かつ、普通のファイルであれば真を返す。

ファイル名の表示の前には、階層の深さに応じて、|(縦バー)、プラス、タブ文字が入る。

●ディレクトリ単位の処理

foreach $file(@files) {

if (-d $file){

  for ($i = 1; $i <= $dep; $i++){
   print "|\t";
  }

  print $file."\n";
   chdir($file);
   ++$dep;
   &dirproc($dep);
   chdir("..") or die "abend. don&apos;t ask me why";
   --$dep;
}
}

ここでは、ファイルチェック演算子 -d を用いる。
ディレクトリ名が右に来た場合には真を返す。

「縦バー + タブ + $file」の表示は先ほどの処理と同じ。

続いて、chdir 関数を呼び出す。chdirについてはUNIXのコマンドと同じ。
chdir には $files をわたす。この時点では$filesにはディレクトリが入っている。
コレにより、一つ下の階層に移動する。
ここで、階層の数が増えるので、 $dep をインクリメントする。
そして、サブルーチン &dirproc を呼び出す。
処理が終わったら帰ってきたら $depをデクリメントする。

| | コメント (0) | トラックバック (0)

2008年12月29日 (月)

ITILファウンデーション(EXO-100J)

受かってきましたー。

準備期間は3週間。

通勤の行き帰りに翔泳社の本で勉強。
巻末の練習問題は都合5回ほど解きました。

結果は85点。満点取るつもりで臨んだのですが・・・。

ちなみに、実際の問題は、巻末の練習問題より実践的な内容の問題文になっていました。

| | コメント (0) | トラックバック (0)

2008年12月17日 (水)

blogタイトル変更とかいろいろ

いやー、perlの勉強しばらく止めてたけど、ちょっと時間を置くと結構わかることが多くなったりするものなんだなぁ。

仕事が多かったり、別な勉強(ITIL)でこちら放置気味だったけど、あまり気乗りしない時には一度離れてみるというのも良いのかもしれないなぁと思った。

ITILの試験が26日にあるのでそれまでちょっとperlは凍結。
いや、さっき見たらperlやりたくなったけど、なんせITIL自腹だから・・・ボーナス直後とはいえ2万円かけてると思うとねぇ。

あと、ずっと気になっていたのだ、もう「.com Master★★★」のblogからは離れているのでタイトル変えます。
★★★はもう少し別な他の資格で外堀埋めてから取得しようと考えてます。
ITILもその一環ですけどね。
つか、会社の方針w

しばらくはタイトルには(仮)をつけて運用です。

そんではでは。

| | コメント (0) | トラックバック (0)

2008年11月12日 (水)

「すぐわかるPerl」 8.9 コマンドの入出力に入出力を切り替える

UNIXで言うところの|(パイプ)はどう扱うか?

open(ファイルハンドル名 , " | コマンド名")

でそれ以降の「printファイルハンドル」が発行されるごとに、printの出力がそのコマンドに対する入力となり、そのファイルハンドルをクローズするとそのコマンドが実行されます。

ただし、コマンドはパイプラインで使えるもの、つまり標準入力から受け付けられるものに限る。

メールを送るmailコマンド

# oshirase
open (ENKAI , "| mail enkai\@speed.org")
print ENKAI "Enkai no oshirase!\n";
print ENKAI "1999/9/9 nichi!\n";
print ENKAI "wasureruna!\n";
close(ENKAI);

@の前に\をつけたのは、二重引用符の中に@を核と、Perlが配列変数と思ってそれを展開してしまうから。
実行することで、メーリングリストenklai@speed.orgのメンバーにメールが届く。

入力モードでも|を利用することができる。
unixのwhoといういコマンドはunixにログインしている人の一覧を表示できるが、これをsortしてuniqして表示する場合。

※ who |sort |uniq でよくね?とおもったら・・・

ただし、whoで表示される名前とログイン日時、端末情報のうち名前だけを取り出してsortしてuniqする。

むぅ。

# wholist

open(WHO,"who |"); #ファイルハンドルWHOがwhoコマンドの出力に結びつく

while(<WHO>) {  #以降<WHO>をスカラーコンテキスト(配列の要素数)で
   #評価するごとにwhoの出力を返す。

($one)=split; #$_を空白文字でsplitしたものの配列を1要素のリストに
   #リストコンテキストで渡す。
   #つまり、whoで出た名前の部分だけを$oneに入れる。

push(@who,$one);#@whoの一番右側(インデックスの値が一番大きい要素)に
   #$oneを追加する。
   #push(@配列名 , スカラー)
   #で配列の末尾にスカラーが追加される。
   #@配列名 = (@配列名,スカラー)
   #と書くのと同じ。
}
close(WHO);

open (KEKKA, "| sort | uniq");
   #重複をなくし、sortする。
   #openされたKEKKAに@whoをそのまま(改行つけて)
   #出せば出力がsortされ、uniqされて画面に出てくる。
foreach(@who){
print KEKKA "$_\n";
}
close(KEKKA);

#後半がわからんな・・・
 @whoがどうKEKKAに渡されるのかが・・・どこで渡されんだ?

■標準入出力以外のアクセスのまとめ

<STDIN>,<STDOUT>以外ってことで。
このあたり、よくわからないなぁ・・・

・ファイルの入力オープン
open (ファイルハンドル名 , "物理ファイル名")

・コマンドからの入力オープン
open (ファイルハンドル名 , "コマンド名")

・入力
<ファイルハンドル名>

・ファイルの出力オープン
open (ファイルハンドル名 , "> 物理ファイル名")

・ファイルの追加書きオープン
open (ファイルハンドル名 , ">> 物理ファイル名")

・コマンドへの出力オープン
open (ファイルハンドル名 , "| 物理ファイル名")

・出力
print ファイルハンドル名 スカラー

・出力ハンドルの切り替え
select (ファイルハンドル名)

・ファイルのクローズ
close(ファイルハンドル名)

| | コメント (0) | トラックバック (0)

2008年10月 8日 (水)

「すぐわかるPerl」 8.8 標準入出力以外のファイルの制御

ファイルへの出力

一つのプログラムの中でファイル名パターンによる検索、そのファイルの入力、そして別ファイルへの出力をやってしまいたい場合。

#repampsub -- ワイルドカードを渡して ampsub

$argn = ($oldext , $newext) = @ARGV;
($argn == 2) or &bye("argument must be two\n");

@files = glob("*$oldext");
(@files + 0) or &bye("extention \"$oldext\" no match\n");

foreach (@files){
/(.*)\.$oldext/;
open (IN, "$1.$oldext");
open (OUT, ">$1.$newext");
while (<IN>) {
  s/$#169;/&copy;/g;
  print OUT;
}
}

close IN;
close OUT;

sub bye{
my($msg) = @_;
print $msg;
die "usage: repampsub old_extention new_extention\n";

}

以下解説

「1個目のopen命令において、"$1.$oldext"という物理ファイル名がINというファイルハンドル名に入力モードで結びつけられる。」
・・・ごめん、何言ってんだか全然わかんない・・・
INというのは任意でつけた名前らしい。

/(.*)\.$oldext/;
open (IN, "$1.$oldext");
open (OUT, ">$1.$newext");

わからないけど、止まっても永遠に理解できそうにないので先に進む。

2個目のopen命令では"$1.$newext"という物理ファイル名がoutというファイルハンドル名に出力モードで結びつけられる。

・・・OUTというのは任意で決めた名前らしい。

入力モードで結びつけられる、とか出力モードで結びつけられるってのがよくわからん。

STDINはオープンの必要のない入力のファイルハンドル
STDOUTはオープンの必要のない出力のファイルハンドル

ってことは、STDINとSTDOUT以外はopen命令が必要なのか。

つか、open命令とか急に言われてもなー

while (<IN>) {
  s/$#169;/&copy;/g;
  print OUT;
}

ここで<IN>は標準入力に対する<STDIN>同様、ファイルハンドルINに結びつけられた物理ファイルから1行読んでその値を返す。
このとき、ファイルポインタがインクリメントされる(次の値を読みに行くってこと?)
ファイルポインタが再就業を指したときさらに<IN>を評価すると、<IN>はundefを返す。
while文がfalseとなり、ループが終わる。

■OUTへの出力

引き続き。
したの置換部分は実態参照の著作権マークを読みやすく変えるもの。

while (<IN>) {
  s/$#169;/&copy;/g;
  print OUT;
}

次のprintは従来のprintと基本的に同じですが、標準出力に出す代わりにOUTと結びつけられた物理ファイルに出力する。

print ファイルハンドル名, 文字列 ;

ファイルハンドル名を省略したとき:STDOUT
文字列を省略したとき:@_

となる。

OUTへの出力を何回も行う場合は、デフォルトのファイルハンドルをSTDOUTからOUTに切り替えると便利。
この場合、

select (OUT);

のようにファイルハンドルを切り替えると、それ以降持続的にデフォルトのファイルハンドルが切り替わる。
後でまたSTDOUTに出力したいときには

print STDOUT;

のようにprintでわざわざ(明示的に)STDOUTを指定するか

select(STDOUT);

のようにファイルハンドルを再切換えします。

最後に、INとOUTをクローズする。

close IN;
close OUT;

なお、同じファイルハンドルに対してopeを複数回行うと、二回目以降はcloseしてからopenしてくれる。

また、> のかわりに >>を出力すると、追加書きモードになる(append)。

| | コメント (0) | トラックバック (0)

2008年10月 7日 (火)

「すぐわかるPerl」 8.7 制御構造としてのand,or

■制御構造としてのand,or
8.6で書いた

unless ($argn == 3){
die "argument must be three\n".
  "usage : rep filter old_extention new_extention\n";
}

の部分は次のように書き換えることができる

($argn == 3) or die "argument must be three\n".
  "usage : rep filter old_extention new_extention\n";
}

説明

or というのはその前の式を評価して、「そこで真だったら、その後に結合しているものを飛ばして先に行く」という性質を持っている。
この場合には「$argn」が真であれば、その後のdieを飛ばして先に進む。

一方、条件が偽だったら、orの後ろにある文を評価しに行く。この場合にはdieでプログラム自体が止まる。

これは、条件式を評価するorが、制御文として使えることを示している。
「プログラム言語として読むとその内容は自明ではないが、自然言語として読むとよくわかる」

dont move, or die:動いたら殺すぞ(うごくな、さもなくば死か)

のように、

($argn == 3) or die :$argnが3で無ければdie

と解釈。
エラーチェックなどによく使われる。

同様に

if (`which $filter` =~ /^no /){
die "filter \"$filter\" not found\n".
"usage :rep filter old_extention new_extention\n";
}

(`which $filter` =~ /^no /)  and die "filter \"$filter\" not found\n".
"usage :rep filter old_extention new_extention\n";

と書くことができる。
and は or とは逆に左側に書いてあるものが偽であったら、その時点で右側の文をあきらめて先に進む。
(条件が正しければ、右側の文を評価する)

以上を踏まえ、プログラムrepは以下のように記述することができる。

$argn = ($filter,$oldext,$newext) = @ARGV; #@argvは引数が入る関数

($argn == 3) or die "argument must be three\n".
"usage : rep filter old_extention new_extention\n";

@files = glob("*.$oldext"); #oldextに該当する拡張子を持つファイル名を配列として@filesに格納

(@files + 0 ) or die "extention \"$oldext \" no match\n;.
"usage: rep filter old_extention new_extention\n";

(`which $filter` =~ /^no /)and die "filter \"$filter\" not found\n".
"usage :rep filter old_extention new_extention\n";

foreach(@files){
/(.*)\.$oldext/;
print("$filter < $1.$oldext > $1.$newext &\n");
system("$filter < $1.$oldext > $1.$newext &");
}

■サブルーチンの活用

dieのときに「usage」(使用法)を3回も連呼している。
このusageの呼び出しをサブルーチンにする。

$argn = ($filter,$oldext,$newext) = @ARGV; #@argvは引数が入る関数
($argn == 3) or &bye("argument must be three\n"); #$argnが3であれば以降は無視

@files = glob("*.$oldext"); #oldextに該当する拡張子を持つファイル名を配列として@filesに格納
(@files + 0 ) or &bye ("extention \"$oldext \" no match\n); #@filesが0であれば、以降は無視。

(`which $filter` =~ /^no /) and &bye ("filter \"$filter\" not found\n"); #fileterがない場合
       #(`which $filter` =~ /^no /)が真なら以降を実施。

foreach(@files){     #oldextの拡張子を持つものがあれば以降を実施
/(.*)\.$oldext/;    #正規表現でoldextの拡張子を持つもの
system("$filter < $1.$oldext > $1.$newext &"); #
}

sub bye{
my($msg) = @_;
print $msg;
die "usage :rep filter old_extention new_extention\n";"
}

| | コメント (0) | トラックバック (0)

«「すぐわかるPerl」 8.5 エラーチェックを入念に 8.6 バッククォートでコマンドの結果を知る