2009年03月07日

刷新中。または、改行設定について。

気を抜いたら更新が途絶えてしまった。いけないいけない。

SeeSaaを始めてすぐの頃から、TableタグやListタグの挙動がおかしいことに気づいていた。なんか項目ごとに妙に間が空く上に、テーブルと本文の間にも変なスペースが入る。
ちょっと調べてみたら、「改行をBRタグに変換」機能が悪さをしていることが判明した。TexとかPukiwikiみたいに2回以上改行したときだけBR扱いにすればいいのに・・・。
そんなわけで、改行やテーブル周りを修正して回る今日この頃。

今日のRuby(おっとこれも日刊ペースがくずれてしまった)の見栄えがよろしくないのも気になっていたので、ついでに直すことにしよう。こっちはスタイルシートをいじる必要があるかも知れない。
posted by yuji_at_radiance at 22:54| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年02月22日

ついにスパムが

細々と記事投稿を続けているこのブログに、ついにスパムトラックバックが届いた。うれしいのやら悲しいのやら。 今のところ最新記事に1件くらいずつだから削除が楽だけど、増えてくるようなら対策が必要になるだろう。
posted by yuji_at_radiance at 21:00| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年02月06日

海外送金手続き完了(Pandora再オーダー)

振り込み手続き完了。あとは向こうからの連絡を待つのみ。

手続きのポイントを挙げておくと
  • 手続き自体はそんなにかからない。窓口が空いていれば書類記入も含めて30分程度で済む。
  • 証券会社のサイトで出る為替レートと送金時のレートはわずかに違う。一日の間にも少し変動するらしい。
  • 身分証明書が必要。運転免許証を用意すべし。
  • ゆうちょ銀行の振り込み手数料は2500円
  • イギリスの銀行の手数料として£5必要。これは、あらかじめ振込み額にプラスしておく。
  • 銀行コードのところにはSort Codeを書く(by郵便局員の方)
  • 通貨コードはGBP

本日午前の転送レートは133.23[YEN/GBP]、ということで、総経費は(230.54+5) * 133.23 + 2500 = 33880円だった。
posted by yuji_at_radiance at 22:26| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年02月05日

Pandora再オーダー

再オーダーの意思を伝えたところ、振込み額が提示された。 Pandora1台と予備のバッテリーで£230.54。 1ポンド131円として30,200円というところ。

ほかに、ゆうちょ銀行の手数料として2500円(これでも一番安い、大手都市銀行だと5000円くらいかかる上に、審査があったりする)と、イギリスの銀行の手数料£5くらいがかかるらしい。

会社の昼休みに振り込み作業が終わるだろうか・・・。そっちがむしろ心配。
posted by yuji_at_radiance at 23:06| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年02月04日

Pandora再注文案内が来た

今日、Pandoraの再注文案内が届いた。といっても、2chではPandora非公式blogで支払い案内が掲載されたとかで数日前からプチ祭りになっていたんだけど。再注文案内メールの報告は2日あたりからぼちぼち届いていたらしいので、私は割と後のほうなのかも知れない。最初に注文したのも大分遅かったし。
少なくとも一次ロットはクレジットカード不可のようだ。残念。せっかくなので郵便局の送金をトライしてみることにする。
posted by yuji_at_radiance at 22:56| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年02月02日

今日のRuby(ログファイルのラベル付け)

【問題】
入退館管理システムは、次のようなログファイルを出力します。
event, idnumber, time
IN 082412C 09:12
IN 082169B 09:13
IN 075672F 09:25

さらに、idnumberとメンバーの対応表が、チーム毎に用意されています
082412C,suzuki keita
082428A,tanaka natsuhiko


ログファイル中の既知のidnumberをメンバーの名前に置き換えてください
IN "suzuki keita" 09:12
【回答例】
if(ARGV.length()<2) or 
  (not File.readable?(ARGV[0])) or (not File.file?(ARGV[0])) or
  (not File.readable?(ARGV[1])) or (not File.file?(ARGV[1])) then
  puts("Usage logview.rb logfile members");
  exit;	
end  

idlist = Hash.new();

File.open(ARGV[1]){|fmember|
  fmember.each_line(){|line|
    id_name = line.split(",");
    idlist[id_name[0]] = id_name[1].chomp();
  }
}

File.open(ARGV[0]){|flog|
  flog.each_line(){|line|
    logline = line.split();
    if((fullname=idlist[logline[1]])!=nil) then
      logline[1] = '"' + fullname + '"';
    end
    puts(logline.join(" "));
  }
}

【解説】

ややこしくなってきたので、今回から問題をきちんと定義することにした。プログラムは大きく3つのブロックからできている。最初のブロックはファイルが読み込み可能か判定をする。2つ目のブロックは、メンバの定義ファイルを順番に読み込んでID→実名のハッシュを作成する。3つ目のブロックは、ログファイルを読み込んで修正を行い、画面に出力する。

注意すべき点は、改行文字を含む文字列を取り込んでしまった場合に、出力や文字列比較の結果がおかしくなることである。改行文字が含まれる可能性がある場合は、String#chompメソッドで取り除くことができる。

posted by yuji_at_radiance at 23:25| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月25日

今日のRuby(コマンドラインで指定されたファイルを読み込む)

【回答例】
こんな感じ。
readfile.rb
if(ARGV.length()<1) then
  puts("Too few Arguments");
  exit;
end
filename = ARGV[0];
if(not(File.readable?(filename) and File.file?(filename)))then
  puts("#{filename} does not exist");
  exit;
end
File.open(filename){|fp|
  fp.each_line(){|line|
    puts(line);
  }
}
【用例】
$cat input.txt
> yamada,taro,24
> satoh,hajime,25
> suzuki,kazuma,20

$cat input.txt | ruby readfile.rb
> yamada,taro,24
> satoh,hajime,25
> suzuki,kazuma,20
【解説】
Fileクラスを用いてファイルの読み書きを行う。Fileクラスでは、ファイルのオープンクローズの処理の他にファイルの存在や、読み書き可能を判定するメソッドが付属している。テキストファイルの中身はgetsやeach_lineなどでアクセスできる。
posted by yuji_at_radiance at 20:53| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月24日

今日のRuby(単語の登場回数をカウントし、辞書順に出力)

【回答例】
countWordAppearance.rb
wlist = Hash.new(){0};
$stdin.each_line(){|line|
  line.split().each{|wd|
    wlist[wd.downcase().gsub(/[^\w]/, "")] += 1;
  }
}
tokens = wlist.keys().sort();
tokens.each{|wd|
  puts("#{wd} #{wlist[wd]}times");
}

【用例】
$cat input.txt
> Hello new world, hello again to you.

$cat input.txt | ruby countWordAppearance.rb
> again 1times
> hello 2times
> new 1times
> to 1times
> world 1times
> you 1times

【解説】

とりあえず、単語とはスペースで区切られた文字列であると仮定して処理を行う。スペースの分割はString#splitメソッドを使う。集計する際には文字を全て小文字に変換し、余計なカンマやピリオドは取るようにしている。余計な記号の削除はString#gsubメソッドを使う。今回は正規表現を使ってアルファベットと数字(\w)以外のものを空文字列に置き換えている。バランスを調製する際にはgsubメソッド付近を書き換えてもらいたい。

集計そのものはHashを使って行う。Hash#new(){init}は、未知の要素へのアクセスがあった場合にinitで初期化するという宣言である。Hashをeachメソッドでスキャンした場合、要素が返る順序は一切保証されないので、辞書順になるような工夫が必要になる。ここでは、Hash#keys()メソッドを使って、ハッシュに含まれる単語の配列を取得してソートを行った。ソート済み配列でeachメソッドを使うことで辞書順に結果を書き出すことができる。

posted by yuji_at_radiance at 23:46| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

今日のRuby(カンマ区切りN列目の内容でソート)

【回答例】
3番目の要素で降順にソートする場合をsortNthelem.rbに示す。
sortNthelem.rb
arr = Array.new();
$stdin.each_line{|line|
  arr.push(line.split(","));
}
arr2 = arr.sort_by{|elem| -elem[2].to_i();}
arr2.each{|elem|
  puts elem.join(",");
}

【用例】
$cat input.txt
yamada,taro,24
satoh,hajime,25
suzuki,kazuma,20

$cat input.txt | ruby sortNthelem.rb
satoh,hajime,25
yamada,taro,24
suzuki,kazuma,20

【解説】

最初にカンマ区切り文字列をString#splitメソッドを使って配列に分解し、arrにプッシュする。出力する際にはArray#joinメソッドを使ってカンマ区切り文字列に戻している。

ソート系のメソッドはEnumerableモジュールで定義されており、様々なメソッドがArrayを含む多くのクラスで利用できる。ソートのやりかたは色々考えられるが、ここではsort_byメソッドを使って3列目の要素を数値の降順に並べ替えてみた。sort_byはsortより速いらしい。詳しくは参考資料を見ていただきたい。 普通にsort_by{|str| str}とすると、辞書昇順に並んでしまう。そこで、String#to_iメソッドを使って数値に変換し、かつマイナスを付けて順序を逆転した。

sort_byは非破壊的メソッドなので、ソート後の配列を受け取る必要がある。変数arr2でソート結果を受け取り、後の処理に渡している。


【参考資料】
posted by yuji_at_radiance at 00:46| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月21日

今日のRuby(行頭の#を反転する)

【回答例】
ファイルに記述するなら
reversesharp.rb
#/usr/bin/ruby
$stdin.each_line{|line|
  puts(line[0] == ?# ? line[1..-1] : "##{line}");
}
ワンライナーなら
$ruby -pe '$_ = $_[0]==?# ? $_[1..-1] : "##{$_}"'

【用例】
$cat input.txt
> yamada,taro,24
> satoh,hajime,25
> #suzuki,kazuma,20

$cat input.txt | ruby -pe '$_ = $_[0]==?# ? $_[1..-1] : "##{$_}"'
> #yamada,taro,24
> #satoh,hajime,25
> suzuki,kazuma,20

【解説】

reversesharp.rbについて説明する。$stdin.each_lineは、標準入力から一行ずつ読み込んでブロックに処理を渡す。

ブロック内では最初の文字が#かどうか判定を行う。これにはString#self[at]メソッドを使う。このメソッドの返り値の型は整数(≠文字列)なので、#の文字コードと比較を行わなければならない。文字"#"に対応する文字コードを得るためには、?#と書く。 続く?は、三項演算子である。一文字目が#だった場合はString#self[from..to]メソッドを使って部分文字列を取得する。負の値を指定すると、行末からカウントを行う。 一文字目が#でない場合は、#を行頭に付けた新しい文字列を作成する。文字列内に#が2回出てくるが、最初の#が文字であり、2つ目の#{}は文字列中に式を挿入するための構文である。

#と?がいろいろな意味で使われるので、ちょっと分かりにくいかも知れない。

viのexコマンドから使えるかなと思ったけど、#に特別な意味があるみたいで上手くいかなかった。残念。

posted by yuji_at_radiance at 22:06| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月20日

今日のRuby(N番目の項目の総和)

【回答例】
$ruby -ne 'BEGIN{$sum=0}; $sum+=$_.split(",")[2].to_i(); END{puts $sum}'

【用例】
$cat input.txt
> yamada,taro,24
> satoh,hajime,25
> suzuki,kazuma,20

$cat input.txt | ruby -ne 'BEGIN{$sum=0}; $sum+=$_.split(",")[2].to_i(); END{puts $sum}'
> 69

【解説】

BEGIN{}、END{}は、スクリプトの開始時と終了時に一回だけ実行される断片である。BEGINやENDにまたぐ変数はグローバル変数でなければならないので、変数sumは必ず$sumと書かなければならない。さもないとsumの型が決まらないので、+=の処理でエラーになる。

本文では、標準入力から読み込んだ一行$_に対して、String#spritメソッドでカンマ区切り分割を行い、それを整数型にパースして加算している。

ちなみに、スペース区切りだともっと簡単に書ける。

$echo "foo bar 12" | ruby -ane 'BEGIN{$sum=0}; $sum+=$F[2].to_i(); END{puts $sum}'
> 12

-aオプションを付けるとスペースで区切って$Fという配列に格納してくれる。

【参考資料】
posted by yuji_at_radiance at 22:08| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月19日

今日のRuby(カンマ区切りのN番目だけ取り出す)

【回答例】
$ruby -ne 'puts($_.split(",")[1])'

【用例】
$cat input.txt
> yamada,taro,24
> satoh,hajime,25
> suzuki,kazuma,20

$cat input.txt | ruby -ne 'puts($_.split(",")[1])'
> taro
> hajime
> kazuma

【解説】

ruby -ne [script]は、while $stdin.gets(); [script] end;と解釈され、標準入力1行ごとにスクリプトを適用する。catコマンドのパイプと併用すると便利である。 標準入力から読み込んだ一行は、$_という変数に暗黙的に保存される。perlでも同様のルールがある。

読み込んだ一行をString#splitメソッドを使ってカンマ区切りで配列に分解し、2番目の要素をputsで出力する。 なお、さらに$_を省略して、puts(split(",")[1])とすることも可能である。


【参考資料】
posted by yuji_at_radiance at 22:15| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月01日

うるう秒を見た

うるう秒が何なのかについては置いておくとして・・・。
せっかくのイベントなので観測だけしてみた。

下のようなコマンドを打ち込む

$sudo cat /var/log/messages | grep "leap second"
>>Jan 1 08:59:59 radiance kernel: Clock: inserting leap second 23:59:60 UTC

注)ntpdが稼動している必要がある(たぶん)。

うるう秒はUTCの上では2008年のイベントになるみたい。
「いつもよりも1秒長い年」って考えるとちょっと面白い。
posted by yuji_at_radiance at 21:25| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2008年12月13日

Pandoraのペイバック

openpandoraから返金祭りのメールが届いた。クレジットカードの利用記録を確認したところ、10月に振り込んだ額と同額が返ってきている。どうやらVISAは大丈夫らしい。と言うのは、カードによっては返金日の為替レートになってしまうようなのだ。円高が進んでいるので12月の為替レートで返金された人は損をしてしまうわけだ。

とりあえずpandoraの中の人にクレジットカードで再注文する旨をメールで伝えた。中の人たちは銀行振り込みに変えてもらいたいのだろうが、ポンドで送金しろと言われても困ってしまう。応援したい気持ちはあるけれど、どうにもならない。

posted by yuji_at_radiance at 16:47| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2008年05月02日

ごあいさつ

皆さんはじめまして。
このblogは、関東在住の20代ヌルオタのLinuxマシンいじりの備忘録です。ソフトいじり、ハード増設、マイコン工作などの記事を随時upしていく予定。

radianceが何なのかについては、おいおい説明していくということで。
posted by yuji_at_radiance at 13:25| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。