2007-12-03 [長年日記]
■ [Microsoft][C#]C#で.md5なファイルを作ってみる。
ちょっと、そんなわけで、多分こんな感じで作れるんだと。(^^;
System.Security.CryptographyのnamespaceにMD5のクラス群が居て、使い方は色々出来るみたい。ファイル全体のchecksumはStreamを渡せば計算してくれる。結果がbyte配列ってのが、ちと使いづらいと個人的感想。stringで渡してくれればいいのに、、、と。
【2008/10/02追記】
うろうろ巡回していたら偶然こちらで私の間違いを指摘されていたので、お礼の上修正しました。すいません。ありがとうございました。
//.NET(C#)でmd5sumなファイルを作ってみる
using System.IO;
using System.Text;
using System.Security.Cryptography;
class MD5sumMaker
{
public void MakeMD5sumFile()
{
FileStream fs = new FileStream("hogehoge.txt", FileMode.Open);
MD5 md5 = MD5.Create();
byte[] bytes = md5.ComputeHash(fs);
//間違い。2008/10/02書き直し
//string md5sum = Encoding.Unicode.GetString(bytes) + "\n";
string md5sum = BitConverter.ToString(bytes).ToLower().Replace("-", "") + "\n";
File.WriteAllText("hogehoge.txt.md5", md5sum, Encoding.GetEncoding(932));
}
}
ちなみにRubyでやるとこんな感じ
require 'md5'
File.open('hogehoge.txt.md5', 'w'){|f|
f.write MD5.hexdigest(File.open('hogehoge.txt', 'rb').read) + "\n"
}
Javaでもそうだけど、この程度だとスクリプト言語の方がお手軽感がありますな。(別にC#やJavaを否定しているわけではないですけど)
■ [Microsoft][C#]Access+C#で今更な発見
最近社内のツールを作る機会が多いので、Accessを触ることが結構ある。ある意味やっつけなので、結構普通の開発では敬遠されそうな、メンテが面倒/汚かったりする実装を用いることもあったり。「まあ、とりあえず自分が面倒みるからいいかー。」みたいなノリでwww
たぶん、長いことMS環境で開発している人にとっては常識なのだと思うのですが、C#からAccessのクエリってちゃんと使えることを試行錯誤の末発見。
何を今更感がかなりありそうですが、AccessのクエリをCommandType.StoredProcedure 指定することで動かすことが出来た。おー、ちょっと便利。めんどくさいSQLは、クエリ側で吸収できそう。
//.NET(C#)でAccessのクエリを叩いてみる。
using System.Data.SqlClient;
using System.Data.OleDb;
OleDbConnection connectionMdb = null;
OleDbTransaction transMdb = null;
try
{
connectionMdb = new OleDbConnection();
connectionMdb.ConnectionString = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=hogehoge.mdb";
transMdb = connectionMdb.BeginTransaction();
OleDbCommand cmdwrite = new OleDbCommand();
cmdwrite.CommandText = "query_name";
cmdwrite.Connection = connectionMdb;
cmdwrite.Transaction = transMdb;
cmdwrite.CommandType = CommandType.StoredProcedure;
cmdwrite.ExecuteNonQuery();
transMdb.Commit();
}
catch
{
if(transMdb != null)
{
transMdb.Rollback();
}
throw;
}
あと、Accessはコマンドパラメータの実装が微妙なのね。SQLの条件文には良く
cmd.Parameters.AddWithValue("hoge", 100);
とか書いておいて、SQLを発行するわけですが、Accessは、なんか同じことが出来そうでできないのね。"hoge" など、値をあてたいシンボル部分が、SQL上の出現順にあてていかないとうまくいかない。というより、?と同じ扱いと考えて、その順番がシンボリックになっていると考えると、まあなんとか納得いく感じ。
string sql = "select * from hoges where pref = @pref and age > @age"
な、SQLに対して
cmd.Parameters.AddWithValue("@pref", "沖縄県");
cmd.Parameters.AddWithValue("@age", 20);
↑これはいいんだけど、
cmd.Parameters.AddWithValue("@age", 20);
cmd.Parameters.AddWithValue("@pref", "沖縄県");
↑これはだめ。しかも、DBの型が同じものだったりすると、SQLエラーも出ないもんだから、たまにはまる、、、*1
*1 沖縄県に特に意味はない。たまには南国行きたいなぁぐらい。
2007-12-04 [長年日記]
■ [Microsoft][C#]C#でDateTimeをString,StringをDateTimeに
結構よく忘れるので、備忘録として記録。
String型からDateTime型
String dtstr = DateTime.Now.ToString("yyyyMMddHHmmss");
DateTime型からString型
DateTime dt = DateTime.ParseExact("20071204123456", "yyyyMMddHHmmss", null);
書式指定子に関しては以下に記載。またまたMSは良くURLが変わるので、ここにも書いておく。
| 書式指定子 | 説明 |
|---|---|
| d | 月の日にちを 1 〜 31 の数値として表します。1 桁の日にちは、先行ゼロなしで書式設定されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| dd | 月の日にちを 01 〜 31 の数値として表します。1 桁の日にちは、先行ゼロ付きで書式設定されます。 |
| ddd | 現在の System.Globalization.DateTimeFormatInfo.AbbreviatedDayNames プロパティで定義されている曜日の省略名を表します。 |
| dddd (任意の数の "d" 指定子を追加可能) | 現在の System.Globalization.DateTimeFormatInfo.DayNames プロパティで定義されている曜日の完全な名前を表します。 |
| f | 秒の端数の最上位桁を表します。 |
| "f" 書式指定子が単独で使用され、その他の書式指定子がない場合、"f" は標準の DateTime 書式指定子 (完全な日付/時刻のパターン) として解釈されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 | |
| この書式指定子を ParseExact メソッドまたは TryParseExact メソッドで使用する場合は、使用する "f" 書式指定子の数が、解析する秒の端数の最上位桁数を示します。 | |
| ff | 秒の端数の最上位 2 桁を表します。 |
| fff | 秒の端数の最上位 3 桁を表します。 |
| ffff | 秒の端数の最上位 4 桁を表します。 |
| fffff | 秒の端数の最上位 5 桁を表します。 |
| ffffff | 秒の端数の最上位 6 桁を表します。 |
| fffffff | 秒の端数の最上位 7 桁を表します。 |
| F | 秒の端数の最上位桁を表します。その桁がゼロの場合には、何も表示されません。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| この書式指定子を ParseExact メソッドまたは TryParseExact メソッドで使用する場合は、使用する "F" 書式指定子の数が、解析する秒の端数の最上位桁数の上限を示します。 | |
| FF | 秒の端数の最上位 2 桁を表します。ただし、後続のゼロは表示されません。また、2 桁のゼロも表示されません。 |
| FFF | 秒の端数の最上位 3 桁を表します。ただし、後続のゼロは表示されません。また、3 桁のゼロも表示されません。 |
| FFFF | 秒の端数の最上位 4 桁を表します。ただし、後続のゼロは表示されません。また、4 桁のゼロも表示されません。 |
| FFFFF | 秒の端数の最上位 5‏ 桁を表します。ただし、後続のゼロは表示されません。また、5 桁のゼロも表示されません。 |
| FFFFFF | 秒の端数の最上位 6 桁を表します。ただし、後続のゼロは表示されません。また、6 桁のゼロも表示されません。 |
| FFFFFFF | 秒の端数の最上位 7 桁を表します。ただし、後続のゼロは表示されません。また、7 桁のゼロも表示されません。 |
| g または gg (任意の数の "g" 指定子を追加可能) | 年代または紀元を表します (A.D. など)。書式設定される日付に年代または紀元の文字列が関連付けられていない場合、この指定子は無視されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| h | 時間を 1 〜 12 の数値として表します。つまり、午前 0 時と午後 0 時から時間をカウントする 12 時間制で時間が表されます。したがって、午前 0 時からの特定の時間を、午後 0 時からの同じ時間と区別できません。時間は丸められず、1 桁の時間は先行ゼロなしで書式設定されます。たとえば、5:43 という時間は、この書式指定子によって "5" と表示されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| hh, hh (任意の数の "h" 指定子を追加可能) | 時間を 01 〜 12 の数値として表します。つまり、午前 0 時と午後 0 時から時間をカウントする 12 時間制で時間が表されます。したがって、午前 0 時からの特定の時間を、午後 0 時からの同じ時間と区別できません。時間は丸められず、1 桁の時間は先行ゼロ付きで書式設定されます。たとえば、5:43 という時間は、この書式指定子によって "05" と表示されます。 |
| H | 時間を 0 〜 23 の数値として表します。つまり、午前 0 時から時間をカウントする 24 時間制で時間が表されます。1 桁の時間は、先行ゼロなしで書式設定されます。 |
| HH, HH (任意の数の "H" 指定子を追加可能) | 時間を 00 〜 23 の数値として表します。つまり、午前 0 時から時間をカウントする 24 時間制で時間が表されます。1 桁の時間は、先行ゼロ付きで書式設定されます。 |
| K | DateTime.Kind プロパティの各種の値、つまり Local (現地時刻)、Utc (世界時刻)、または Unspecified (不特定) を表します。この指定子は、種類値をテキストでラウンド トリップし、タイム ゾーンを保持します。Local 種類値の場合は、この指定子が "zzz" 指定子と同じになり、"-07:00" などのローカル オフセットが表示されます。Utc 種類値の場合は、この指定子によって UTC の日付を表す "Z" 文字が表示されます。Unspecified 種類値の場合は、この指定子が "" (何もなし) と同じになります。 |
| m | 分を 0 〜 59 の数値として表します。この分は、直前の時間から経過した分数です。1 桁の分は、先行ゼロなしで書式設定されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| mm, mm (任意の数の "m" 指定子を追加可能) | 分を 00 〜 59 の数値として表します。この分は、直前の時間から経過した分数です。1 桁の分は、先行ゼロ付きで書式設定されます。 |
| M | 月を 1 〜 12 の数値として表します。1 桁の月は、先行ゼロなしで書式設定されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| MM | 月を 01 〜 12 の数値として表します。1 桁の月は、先行ゼロ付きで書式設定されます。 |
| MMM | 現在の System.Globalization.DateTimeFormatInfo.AbbreviatedMonthNames プロパティで定義されている月の省略名を表します。 |
| MMMM | 現在の System.Globalization.DateTimeFormatInfo.MonthNames プロパティで定義されている月の完全な名前を表します。 |
| s | 秒を 0 〜 59 の数値として表します。この秒は、直前の分から経過した秒数です。1 桁の秒は、先行ゼロなしで書式設定されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| ss, ss (任意の数の "s" 指定子を追加可能) | 秒を 00 〜 59 の数値として表します。この秒は、直前の分から経過した秒数です。1 桁の秒は、先行ゼロ付きで書式設定されます。 |
| t | 現在の System.Globalization.DateTimeFormatInfo.AMDesignator プロパティまたは System.Globalization.DateTimeFormatInfo.PMDesignator プロパティで定義されている A.M./P.M. 指定子の最初の文字を表します。A.M. 指定子は、書式設定される時刻の時間が 12 未満である場合に使用され、それ以外の場合は P.M. 指定子が使用されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| tt, tt (任意の数の "t" 指定子を追加可能) | 現在の System.Globalization.DateTimeFormatInfo.AMDesignator プロパティまたは System.Globalization.DateTimeFormatInfo.PMDesignator プロパティで定義されている A.M./P.M. 指定子を表します。A.M. 指定子は、書式設定される時刻の時間が 12 未満である場合に使用され、それ以外の場合は P.M. 指定子が使用されます。 |
| y | 年を最大 2 桁の数値として表します。年が 2 桁を超える場合は、下 2 桁のみが結果に表示されます。年が 2 桁に満たない場合は、数値が先行ゼロなしで書式設定されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| yy | 年を 2 桁の数値として表します。年が 2 桁を超える場合は、下 2 桁のみが結果に表示されます。年が 2 桁に満たない場合は、2 桁になるまで数値が先行ゼロで埋められます。 |
| yyy | 年を 3 桁の数値として表します。年が 3 桁を超える場合は、下 3 桁のみが結果に表示されます。年が 3 桁に満たない場合は、3 桁になるまで数値が先行ゼロで埋められます。 |
| 年が 5 桁になることがあるタイ仏暦については、この書式指定子で 5 桁すべてが表示されるので注意してください。 | |
| yyyy | 年を 4 桁の数値として表します。年が 4 桁を超える場合は、下 4 桁のみが結果に表示されます。年が 4 桁に満たない場合は、4 桁になるまで数値が先行ゼロで埋められます。 |
| 年が 5 桁になることがあるタイ仏暦については、この書式指定子で 5 桁すべてが表示されるので注意してください。 | |
| yyyyy (任意の数の "y" 指定子を追加可能) | 年を 5 桁の数値として表します。年が 5 桁を超える場合は、下 5 桁のみが結果に表示されます。年が 5 桁に満たない場合は、5 桁になるまで数値が先行ゼロで埋められます。 |
| "y" 指定子を追加すると、"y" 指定子の数と同じ桁数になるまで数値が先行ゼロで埋められます。 | |
| z | グリニッジ標準時 (GMT) からのシステムのタイム ゾーン オフセットを、符号と共に時間単位で表します。たとえば、太平洋標準時ゾーンを使用するコンピュータのオフセットは "-8" です。 |
| このオフセットは、常に先頭の符号と共に表示されます。正符号 (+) は GMT より時間が進んでいることを示し、負符号 (-) は GMT より時間が遅れていることを示します。オフセットの範囲は –12 〜 +13 です。1 桁のオフセットは、先行ゼロなしで書式設定されます。オフセットには夏時間が反映されます。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 | |
| zz | グリニッジ標準時 (GMT) からのシステムのタイム ゾーン オフセットを、符号と共に時間単位で表します。たとえば、太平洋標準時ゾーンを使用するコンピュータのオフセットは "-08" です。 |
| このオフセットは、常に先頭の符号と共に表示されます。正符号 (+) は GMT より時間が進んでいることを示し、負符号 (-) は GMT より時間が遅れていることを示します。オフセットの範囲は –12 〜 +13 です。1 桁のオフセットは、先行ゼロ付きで書式設定されます。オフセットには夏時間が反映されます。 | |
| zzz, zzz (任意の数の "z" 指定子を追加可能) | グリニッジ標準時 (GMT) からのシステムのタイム ゾーン オフセットを、符号と共に時間と分の単位で表します。たとえば、太平洋標準時ゾーンを使用するコンピュータのオフセットは "-08:00" です。 |
| このオフセットは、常に先頭の符号と共に表示されます。正符号 (+) は GMT より時間が進んでいることを示し、負符号 (-) は GMT より時間が遅れていることを示します。オフセットの範囲は –12 〜 +13 です。1 桁のオフセットは、先行ゼロ付きで書式設定されます。オフセットには夏時間が反映されます。 | |
| : | 現在の System.Globalization.DateTimeFormatInfo.TimeSeparator プロパティで定義されている時刻の区切り記号です。時間、分、および秒を区別するために使用されます。 |
| / | 現在の System.Globalization.DateTimeFormatInfo.DateSeparator プロパティで定義されている日付の区切り記号です。年、月、および日を区別するために使用されます。 |
| " | 引用符 (二重引用符) で囲まれた文字列です。2 つの二重引用符 (") で囲まれた文字列のリテラル値が表示されます。各引用符の前にはエスケープ文字 (\) が必要です。 |
| ' | 引用符 (アポストロフィ) で囲まれた文字列です。2 つのアポストロフィ (') 文字で囲まれた文字列のリテラル値が表示されます。 |
| %c | カスタム DateTime 書式指定文字列が "c" カスタム書式指定子だけで構成されている場合に、そのカスタム書式指定子に関連付けられた結果を表します。つまり、"d"、"f"、"F"、"h"、"m"、"s"、"t"、"y"、"z"、"H"、"M" の各カスタム書式指定子を単独で使用するには、それぞれ "%d"、"%f"、"%F"、"%h"、"%m"、"%s"、"%t"、"%y"、"%z"、"%H"、"%M" と指定します。単一の書式指定子を使用する方法の詳細については、「単一のカスタム書式指定子の使用」を参照してください。 |
| \c | エスケープ文字です。"c" の文字の前にエスケープ文字 (\) を付けると、その文字がリテラルとして表示されます。結果の文字列に円記号そのものを挿入する場合は、2 つのエスケープ文字 ("\\") を使用します。 |
| その他の文字 | その他の文字は結果の文字列にコピーされ、書式設定には影響しません |
■ [tDiary]tDiaryのWikiスタイルで、tableを書く
のにかなり苦労した。というか、前のエントリの一覧を作るのに四苦八苦(^^;
そういえば、rowspanとか、そもそもthタグとか書けたっけ?というところから始まり、、、書き方を見ても、||で繋いでね。とあるだけだ。まー、簡易マニュアルだし、そりゃそうだ。結局hikidoc.rb見て納得。この記法もtDiaryでしか使わないから、なかなか覚えない…。
これまた今更感がひとしおだけど、備忘録として書いておく
- thタグは…||の後にビックリマークを付けるとthタグ
- rowspanの書き方…||の後に^を重ねる。rowspan=2なら^を1個、rowspan=3なら^を2個
- colspanの書き方…||の後に>を重ねる。colspan=2なら>を1個、colspan=3なら>を2個
- ちなみに、thタグで(row|col)spanを使う時には!が先で、その後に(^|>)を書く。
2007-12-08 [長年日記]
■ [VITZ]忘年会お疲れ様でした。
今回、いろいろな都合で参加できなかったメンバーもいらっしゃいましたが、総勢10名の森部屋忘年会が出来てよかったです。みなさんお疲れ様でした。
知ってはいたけど、あまり喋ったことがなかったりという方もいらっしゃいましたが、これを機会にしゃべれるようになってよかったです。お手伝いの入り用があればまた声掛けてください。あー、今後は目を怪我しないように(変な憶測とか変な情報が飛び交ってたようですがwwww)盤石の態勢で臨みます。よろしくお願いします。
■ [Microsoft][ASP.NET][C#][SQLServer]VSUG Day 2007 Winter Tokyo
今日は、VSUGの催し物でございました。VSUGイベントは初参加。いろいろ発見がありました。LINQネタ、VS2008ネタ、.NET Framework3.0/3.5ネタと言ったところで、結構新たな発見もありましたが、一番楽しかったなぁというのは、LightningTalk で持ち時間5分の超かけ足セッション5本立て。まーぶっちゃけ、ネタによっては本業に関係ないものもありましたけど、それでもスピード感があって、楽しかったです。それにしても、みなさん5分できちんと纏めてきますね、すげーなと思いました。
それ以外のセッションに関しては、また別途書こうと思います。Microsoftの方からのセッション、LINQ、Oracle、VSのガイダンス機能、.NET Framework 3.5と5本立てでした。実際、仕事と絡む可能性があるのは、.NET Framework3.5(C# 3.0とLINQが主かな)と言ったところでしたのでその辺を中心に。
2007-12-25 [長年日記]
■ [Ruby]Ruby1.9がリリースされました
日付変わったけど、という一言と共に。さっそくこのサーバでbuildしてみた。configure、make、make install はすんなりと。まあmake testは置いといて。。。
さっそく tDiary2.2.0 + Ruby1.9 で動くかなと挑戦。あっさり動かず。index.rb の冒頭
BEGIN { $defout.binmode }
で、アウチ。残念。夜も遅いので、これは年末年始あたりにでも、ちょこまかいぢって見ることにする。fcgiとかに寄らずにtDiary高速化できないかなぁと最近思う。レン鯖環境だとやっぱり限界はあるなぁと。まあその割にはrubyの本体が build できちゃう環境でもあったり、(割り振られた資源の中で)mongrelとかも動かせちゃったり、なんとも難しいところ。
2007-12-30 [長年日記]
■ [雑記]いよいよ残すところあと2日
そんなわけなのですが、全く持って年末の実感がない今日この頃です。年末年始の休暇で時間はあれど、実際何をするわけでもなく、のほほーんと過ごしています。
今年は実家には5日付近に帰る手はずになっているので、それまでは自宅でのんびり。色々掃除とかもあるんですが、なかなか進まず。まー、いっか。大掃除と言えば、お掃除のプロの方から昔聞いたお話なのですが、ホントは大掃除は秋口に行うのがもっとも効率的なんだそうです。夏や冬は、部屋の中と外とで気温が違ってどうしても風がおきてしまうそうで、そのせいでなかなか埃が上手に掃除できないんだそうです。それに比べて秋は部屋の外と中で気温の差も少なく、綺麗に掃除できるんだそうです。だからといって、我が家が秋口に大掃除しているわけではないんですけど。
□ VFR400 [ご無沙汰です AccessのクエリーをC#で使えるなんて、いいこと聞いたよ DBツール作るので楽できそうだ 早速使わ..]
□ ちゃんごつ [どもども。なんとなく使えるかなぁと思って動かしたら動きましたw その後後付けで、調べてみたらちゃんと書いてあった。。..]