<   2008年 07月 ( 13 )   > この月の画像一覧
(vb.net)VB.NetではList.Findとかのデリゲートの実装が必要なメソッドは使えない!?
たとえばある List から特定の条件のものを探したいという時、今までは List をループでまわし、その中の条件式で探していました。

しかし、MSDNなど見てみると、
List.Find メソッド:指定された述語によって定義された条件と一致する要素を検索し、List 全体の中で最もインデックス番号の小さい要素を返します。
とか、
List.RemoveAll メソッド:指定された述語によって定義された条件と一致するすべての要素を削除します
など、よさげなメソッドがあります。
最近まで、述語とはなんじゃらほいということで、調べもせず使ってませんでしたが、空いた時間にいろいろ調べてみると興味深いことが分かりました。

まず、MSDNでいう術語というはデリゲートのことで、このデリゲートを実装し、Find メソッドの引数に渡してやると、.NetのListクラスが渡されたデリゲートメソッドを実行するというからくりだそうです。
普段のコーディングでも、あるメソッドを呼び出してそのメソッド内で条件により異なるメソッドを実行したいという時に、デリゲートを引数で渡してやれば、いちいちフラグとIF文で判定しなくて済むというメリットがありそうです。
ま、デリゲートの詳しい話はいずれ。。

本題の List.Find 等にわたすデリゲートですが、VBの場合のサンプルとしてよくこういうのを見ます。

Public Shared Sub Main()
Dim dinosaurs As New List(Of String)

dinosaurs.Add("みかん")
dinosaurs.Add("リンゴ")
dinosaurs.Add("ブドウ")
dinosaurs.Add("給料")

'検索
Dim strRes as String = dinosaurs.Find(AddressOf Search)

End Sub
 
'デリゲート(VBは匿名メソッドが使えないから別途定義しないとダメ)
Private Shared Function Search(ByVal s As String) As Boolean
If s = "給料" Then
Return True
Else
Return False
End If
End Function

これはばあるStringクラスの入ったリストから"給料"を探す時の例です。
この場合、デリゲート内に、検索条件は固定(If s="給料" Then...)で記述しています。固定だと動的な条件に対応できないため実用価値はほとんどありません。

じゃあ、検索条件の文字列を変数化して、汎用的にしたいという場合はどうすればいいんでしょうか?
その方法は不明です。ややこしいことをすればできるらしいのですが、お手軽に、というわけにはいかないようです。

しかし、実は同じ.Netでも C# には匿名メソッドたる機能があり、それを使うと動的な検索条件にも対応できるようです。
上記のVBのソースを匿名メソッドを使ったC#で書きなおしたものです。
List<string> list = new List<string>();
list.Add("みかん");
list.Add("リンゴ");
list.Add("ブドウ");
list.Add("給料");

 
string strKey = "給料";
//匿名メソッドで検索
string result = list.Find(delegate(string s) {
return (s == strKey);
});

匿名メソッドはメソッド内にメソッドをかけるというもので、特に上記の例で重要なのは匿名メソッド内から上位スコープにアクセスできるという点です。
上記の例だと呼び出し元メソッドで定義された、strKey変数を匿名メソッド内で参照できるのです。
これってめっちゃ便利じゃないですか?
別にメソッドを定義しないというだけでも楽ですが、上位スコープ変数にアクセスできるのは非常に助かります。

が、この匿名メソッドはVBとかC++には無いようです。
これないと.Net自体が用意したデリゲートを定義しないと使えないメソッドのほとんどがあんま意味がないと思うのは自分だけでしょうか。

ああ、早くC#の開発したい。。

参考:
VB.NETと匿名メソッド
[PR]
by jehoshaphat | 2008-07-29 10:10 | .Net開発 | Trackback | Comments(1)
(Firefox)Firefoxで自動スクロールスクリプト
以前に知人がFirefoxで自動スクロールスクリプト快適ライフをおくってたのを見て、自分も導入してみました。


原理としては Greasemonkey というアドオンを使い、任意のJavaScriptをWebページ閲覧時に実行しているようです。
そして、おそらく自動スクロール用JavaScriptは各サイトの次へページのURLの規則性を知ってて、ある程度下にスクロールすれば次ページを呼んで、今の表示下部に追加というふうにしているのでしょう。

で、本題ですが、自分が愛用している自動スクロールスクリプトは 『Pagerization』というものです。

Googleのページだけに特化したスクリプトもありますが、このスクリプトはありとあらゆるサイトに使えます。
(若干動きがおかしいと思うサイトもありますが。。)

インストールはここからできます。

いったん自動スクロールの恩恵にあずかるとこれなしではやってけませんね。

参考:
Google AutoPager以上に便利な自動スクロールスクリプト『Pagerization』
GoogleやYahoo!の検索結果をスクロールでページ送りすることができるGreasemonkeyスクリプト「Pagerization」

追記(2009/1/8):
(Firefox)Firefoxで自動スクロールスクリプトにて、AutoPagerizeという自動スクロールスクリプトについて書きました。
[PR]
by jehoshaphat | 2008-07-24 09:51 | ツール | Trackback | Comments(1)
(VB.Net)文字列が数値かどうか判定する方法 [TryParse]
入力系で、TextBox に入力された値を数値として扱いたい場合に、入力チェックロジックにて数値かどうかを判定する必要があります。

VB6以前では IsNumeric 関数というものがありましたが、これがなかなか癖のある仕様でした。
たとえば
IsNumeric("1e9")
と書くと True が返るのです。
これは e を指数表記ととらえ、1×10の9乗と解釈するからだそうです。

この IsNumeric 関数もVB.Netに移植されていました。
でもやはり指数表記は True と判断するようです。

さらにこの IsNumeric 関数はおせっかいなVBらしく、\(円記号),16進数表記といったところまでも True としてしまいます。
単純に数値なのかどうかにははやり使えそうにありません。

ということで、.Net Framework標準での数値判定に使えそうなメソッドを探してみました。

見つけたのは
TryParse
というメソッドです。

これは 型クラスの静的メソッドして用意されており、
型.TryParse(評価する文字列,変換後の値)
という形で使えます。
戻り値には変換できたか、できなかったかが Boolean で帰ります。
変換にも使えるし、変換できるかの判定にも使えるみたいです。
動きとしては引数で渡した文字列が、その型に変換できるかどうかを判断してるようです。
IsNumeric 関数のようにおせっかいなこともしません。

型も Integer,Doubleをはじめ、かなり用意されていました。

ということで、これは入力チェックロジックでは有用だとおもいます。

参考:
【VB.NET】指定した文字が数字かどうか判定する(IsDigit, IsNumber, IsNumeric)
文字列が数値かどうか判定する TryParse
TryParseをつかいこなそう
IsNumericのいろいろ
VisualBasic6.0 SP5 のおもしろバグ発見!? 数値の指数はどうやらFormat関数でも来てしまうみたいです。厄介ですね。
[PR]
by jehoshaphat | 2008-07-18 09:36 | .Net開発 | Trackback | Comments(0)
(Linux)新規に作成、変更されたファイルを探し出し、テキストファイルに落とす方法。
現在、FTPサーバで1週間毎に新規にUP,変更されたファイルをテキストファイルに落として、利用者が確認できるようにする要望があがってたのでシェルスクリプトで実装してみました。

まあ、findコマンドを使っているだけですが、こんな感じのスクリプトです。

#!/bin/sh

#監視ディレクトリ指定
TRG_DIR="監視したいディレクトリ"

#日付取得
DATE=`date +%Y-%m-%d`

#結果を落とすファイルパス設定(ファイル先頭に日付を入れる)
OUTPUT="結果を落とすディレクトリ/${DATE}_output.txt"

#検索し、ファイルに落とす
echo `find $TRG_DIR -mtime -7 -fprint $OUTPUT`

echo "Ftp Directory File Update Search OK!!!!!"
exit 0

肝なのは find コマンドの使い方です。
-mtime -7 で7日前に変更されたファイルを検索するよう指定しています。
-fprint パス で結果を指定されたファイルにはきだします。

今後の用途として、結果のファイルをWebから見れるようにHTMLに整形したいのですが、これは今後の課題としたいと思います。


あとは一週間おきにこのスクリプトが実行されるように cron に登録します。

[root@localhost sh]# crontab -e

#ftp update sunday(毎週日曜日の00:01に指定されたスクリプト実行)
1 0 * * sun /root/sh/update_ftp_list.sh

cron の使い方についてはcron & シェルスクリプトを参照。

参考:
Manpage of FIND
UNIXの部屋 コマンド検索: find(実用例が載ってます)
UNIXの部屋 コマンド検索: タイムスタンプ(findのタイムスタンプのオプション(というよりLinux自体のタイムスタンプ)には -atime -mtime -ctime とあるのですが、それぞれの説明です。)
[PR]
by jehoshaphat | 2008-07-14 11:22 | Linux | Trackback | Comments(0)
(Linux)knoppixでハードディスクを完全消去
先日知人から「廃棄するPCがあるのだが、その中のHDDを完全消去したいから方法を教えてくれ」といわれました。
一番確実な物理破壊を提案したですが、ソフトでしたいということだったので、knoppix で完全消去する方法を教えてあげました。(市販の消去ソフトを使えばもっと簡単に出来るのでしょうが、あくまで無料にこだわっていたので...)

使ったのは knoppix 5.3.1 日本語CD版です。

CD挿入し、
boot:knoppix 2 noswap
で起動します。

OS立ち上がったら
$ su -
でrootになります。

# dmesg | grep hd
このコマンドで認識しているHDDの詳細情報が出てきます。
ここで出てくる情報でDMAが有効になっているかどうかもわかるようです。

# hdparm -ft /dev/hda
このコマンドはHDDのベンチマークをするものですが、これで大体どれくらいの時間がかかるかが予測できそうですね。

# sfdisk -l
このコマンドでもHDD、特にディスク内のパーティションが確認できます。
文字化けした場合は
# export LANG=C
で解決できます。


実際の消去は dd コマンドを用いたものと、shred コマンドを用いたものとがあります。
shradのほうが完全消去という意味では特化しているみたいですね。ファイル単位の消去も出来るようですし。

■ddを使った消去例です。
# dd if=/dev/zero of=/dev/hda
HDDの全ブロックにゼロが書き込まれます。

# dd if=/dev/urandom of=/dev/hda
# dd if=/dev/urandom of=/dev/hda
# dd if=/dev/zero of=/dev/hda
2回 /dev/urandom からのランダムデータをHDDに出力した後、
/dev/zero によってゼロを出力するようにします。
こう見るとddだと複数回書き込みするときは面倒ですね。

■shradを使った消去例です。
# shred -n 3 -v /dev/hda
ランダムな書き込みを3回繰り返します。
(米国コンピュータセキュリティセンター(NCSC)方式(NCSC-TG-025)水準 )

# shred -z -v /dev/hda
-nを指定しないと、ランダムな書き込みを25回行います。-zで最後に0で上書きします。相当な時間がかかります。
(米国空軍方式(AFSSI5020,AFI33-202)水準)

オプション -n でランダム書き込み回数を指定できます。
オプション -z で最後に0で書き込みます。


追記:

ddを使う場合、ブロックサイズのデフォルトが512KBでかなり時間がかかるので、ブロックサイズを大きくしてやるといいです。
以下はブロックサイズを16MBにした場合です。

# dd if=/dev/zero of=/dev/hda bs=16MB


ちなみに、ddコマンドは現在の進捗がでないのでちょっと不安になりますよね。
進捗を表示する方法がLinuxのDDコマンドで進捗状況をリアルタイムで確認する方法 ひどすぎ備忘録にありました。

別ターミナルで、以下のコマンドを叩くと、ddを実行している側のターミナルにsleepで設定した秒数おきに進捗が表示されます。これは便利です。

# while true; do killall -USR1 dd; sleep 2; done





参考ページ
dコマンドでハードディスクの完全消去
Linuxを用いたHDDのデータ完全消去法
ハードディスクの消去手順
フリーソフトでハードディスクを完全に消去(2)
[PR]
by jehoshaphat | 2008-07-12 00:42 | Linux | Trackback | Comments(0)
(Linux)knoppixでパーティション操作
時たまパーティションのレイアウトを変えたいことととか、結構ありますよね。
今まではPartion Magicを使ってパーティション操作をしてましたが、実はCD,DVDメディアからLinuxが起動できることで有名なknoppixに含まれているQTPartedからパーティション操作できるようです。
NTFS等のLinux以外のファイルシステムに対応しているのは非常にありがたいです。

使ったのは knoppix 5.3.1 日本語CD版です。最近はDVD版も出てますが、QTPartedはCD版でも使えるようです。

CD挿入し、
boot:
でEnterキーを押します。


そしてOSが立ち上がったら右下のKボタンから、「KNOPPIX」、「Root Shell」を選択します。
シェルに
# qtparted
と入力すると、QTPartedが起動し、GUIでパーティション操作が出来ます。

後はPartion Magicを扱うような感覚で直感的に操作できます。
自分が試したのはパーティションサイズの縮小でしたが、問題なく完了しました。

詳しい操作はQTParted パーティション設定ツールに書かれています。
[PR]
by jehoshaphat | 2008-07-12 00:32 | Linux | Trackback | Comments(0)
(ブログ)Exciteブログにソースコードを貼り付ける
<pre>タグ
いろいろ調べてみると<pre><code>でくくるのが一般的見たいですが、Exciteブログは<code>タグが使えません。

そのまま貼り付けるとインデントは無視されるし、<pre>だけだと改行コードがあるところに<br>が勝手に挿入されて、改行だらけになっていたので、当初は
<pre style="display:inline">
でくくっていました。

しかし、これだと1行が長いソースだと切れてしまい、途中から見れません。
<pre style="display:inline; overflow:auto;">で試みましたが、overflow属性はdisplay属性=inlineだとどうやら有効にならないっぽいです。

で、またいろいろ探してるととあるSEの日常さんで、解決法が載ってました。
属性に line-height: 50%; とすることで、display:inlineを使わなくとも、見た目上改行だらけの問題を解決でき、overflow属性も使えそうです。

ということで、マイスキンを作成し(Exciteが用意してるスキン流用して)、CSSに下記の属性を追加しました。

pre{
margin: 10px 10px 10px 10px;
padding: 10px 10px 10px 10px;
background: #FFFFFF;
line-height: 50%;
border:dotted 1px #808080;
overflow:auto;
width:95%;
font-size: small;
}


これで横に長いときはスクロールバーが自動的に出てくるようになりました。

ちなみに、font-sizeをしていないと、IEで見ると勝手に小さくされてしまいます(おそらく親要素を引き継いでるからか?)


ソースコードの色づけ(シンタックスハイライト)
あとはシンタックスハイライトですが、 あなたのソースコードを彩る、Syntax Highlighterまとめを見てみるといろんな方法があるようです。
ただJavaScript系はExciteブログ上じゃ無理ということで、変換ツール系を使ってみることにしました。

「GeSHi」というのが70種類近くもの言語に対応してるっぽいので、これにします。
ただ、GeSHiのでもページでは簡単にコピペができないので、GeSHiを使ったWebAPIのテストページであるhttp://lab.koshigoe.jp/geshi_webapi/test/post.htmlを利用させてもらうこととしました。
ここで変換して出来たページのソースをそのままコピペして、ブログに張り付け。
簡単です。


ちなみに、以前は;ソースコード HTML化 コンバーター「唐辛子」を使わしてもらってました。
こちらのほうが落ち着いた感じのハイライトになります。
[PR]
by jehoshaphat | 2008-07-09 13:31 | Webがらみ | Trackback | Comments(3)
(.NET)TextBoxで表示される文字をアンチエイリアスにしたい。
実はWndowsの設定でフォントの縁を滑らかにするとかいうのがあるみたいですが、顧客すべてがその設定にしてくれるわけでもなく、納品SEもめんどくさくてやってくれそうにないので既存のTexBoxクラスを継承し、描画だけ自前でやろうと思ってました。

まあOnPaintメソッドにGraphicsオブジェクトでテキトーすればできるだろうと思ってましたが、、、、
実はTextBoxはOnPaintが発生しないらしいのです。
そして、どうやら描画まわりはOS依存の部分を使ってるらしいです。
http://dobon.net/vb/bbs/log3-14/8067.html

調べたところ自作TexBoxクラスのコンストラクタにて
Me.SetStyle(ControlStyles.UserPaint, True)
とするとOnPaintが使えるようなるみたいなので、やってみました。

するとコントロール自体の再描画(手前の別のウィンドウをのけたときなど)時はOnPaintで指定した描画されていますが、TextBox内の文字を変えたときは元のフォントに戻ってしまいます。
それでまた調べた結果、TextBox内の文字を変えたとき(TextChangedイベント)に
MyBase.RecreateHandle()
とすることで、この問題を回避しました。

しかし、TextBox内の文字を選択しとき(というかフォーカスが移った時)に表示されるフォントが変わってしまいます(たぶんシステム既定のフォント?)。
しかも、自分で書いたフォントの上にかぶさるような形で描画されるので見たくれもありません。
こんな感じになります↓
e0091163_16543263.jpg



しかし他の所にフォーカスが行くとまともに描画されます。

これを何とかしようとしようとしたのですが、結局こちらを参考にさせてもらい、ウィンドウプロシージャからOSのメッセージを横取りする方法で実装しました。
(この場合、上記でやっていたSetStyleの方法は不要です。)
---------------------------------------------

Public Class TksTextBox
Inherits System.Windows.Forms.TextBox

Private Const WM_PAINT As Integer = &HF

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)

Select Case m.Msg
Case WM_PAINT
'フォーカスがないとき手動描画
If Not Focused Then
DrawText()
End If
End Select
End Sub

Private Sub DrawText()
Dim Gr As Graphics = Me.CreateGraphics()
Gr.FillRectangle(New SolidBrush(Me.BackColor), Me.ClientRectangle)
Gr.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
Gr.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), 0, 0)
End Sub
End Class

----------------------------------------
とりあえずこれにAlignなどの実装をしてなんとか完成です。
ただ、これでも文字列選択時、もしくは文字入力中はシステムが勝手に描画するらしく、Graphicsオブジェクトで書いた影やアンチエイリアスがかかりません。

文字入力中↓
e0091163_16545722.jpg


入力後(フォーカスがテキストボックスを離れている状態)↓
e0091163_16551453.jpg


結局、あきらめて、OSの設定をSEに周知徹底することにしたいと思います。
[PR]
by jehoshaphat | 2008-07-07 16:56 | .Net開発 | Trackback | Comments(0)
(ニュース)NASAの提供する温暖化早わかり「CLIMATE TIME MACHINE」
ソースは最近RSSに登録したGIGAZINEのここより。

NASAの「CLIMATE TIME MACHINE」というサービスで4つのジャンルの気候変動がFLASHで見れます。

これみると明らかに温暖化の影響が見て取れるんじゃないでしょうか。
結構見てると面白いです。

なんか末期症状のブッシュ政権は温暖化の研究についてNASAに圧力をかけているという報道をちょくちょく目にしますが、そんな圧力に屈さずに無知な一般ピープルでも視覚的に危機感を抱けるようなサービスを続々作ってほしいですね。
[PR]
by jehoshaphat | 2008-07-07 15:49 | 思ったこととかニュースとか。。 | Trackback | Comments(0)
(Linux)CentOSからWindows共有をマウントする方法
現在下記のようなサーバを構築してます。
CentOSサーバ Windowsサーバ
FTP-->Win共有フォルダマウントポイント------>Windowsファイル共有してるフォルダ

要はFTPを経由してLAN内のファイルサーバとして使ってるWindowsマシンの共有フォルダを見たいわけです。

ちなみにFW使ってる場合はポートの445の解放が必要です。

ここを見るとsmbmount コマンドでできるとあったのですが、そんなコマンドはないと怒られます。どうやらCentOS5にはこのコマンドはなくなったようです。
@ITネットワークストレージを使うにはを見ると 
#mount -t smbfs -o username=ユーザーID,password=パスワード //landisk/Project /mnt/nas
でいけるとあったのですが、smbfsなんてファイルシステム知らないと怒られます。

結局、こちらこちらを参考させてもらいました。
# mount -t cifs -o username=share //192.168.0.111/svtest /var/winsvtest
ファイルシステムの指定に "cifs" を使うのが肝のようです。

アンマウントは
# umount /var/winsvtest/
というように普通のマウントポイント解除と同じです。

アンマウント時に Device or resource busy とでた場合はこちらによると、
# umount -l /var/winsvtest/
でできるみたいです。


あと、起動時にもマウントするように /etc/fstab に書いてみました。
"//192.168.0.100/test test" /var/data/winsv cifs username=share,password=****,r,fmask=0222,dmask=0222 0 0


結果、ダメでした。
やっぱりパスに空白入ってるのがまずいのでしょうか。。。
謎です。

追記1(2008/08/18):
補足です。
/etc/fstab にマウント設定するときですが、空白を含まないパスにすれば問題なく運用できます。
例:
//192.168.0.111/svtest /var/winsvtest
cifs username=share,password=****,rw,fmask=0555,dmask=0555 0 0


追記2(2009/01/04):
上記の設定でfstabファイルにマウントを定義していたのですが、OSの起動中に下記のようなメッセージがでてることに最近気づきました。

WARNING: CIFS mount option 'fmask' is deprecated. Use 'file_mode' instead.
WARNING: CIFS mount option 'dmask' is deprecated. Use 'dir_mode' instead.

どうやら、"fmask"や"dmask"というオプションが古いようです。
それに変わるオプションが "file_mode" , "dir_mode" というわけですね。

というわけでこう書き直しました。

//192.168.0.111/svtest /var/winsvtest cifs username=share,password=****,rw,file_mode=0555,dir_mode=0555 0 0

参考:mountコマンドでCIFSをファイル共有
[PR]
by jehoshaphat | 2008-07-03 17:28 | Linux | Trackback(1) | Comments(0)