この間、社内で座席の配置替えがあって、フロアを移動した。
その翌日の昼時、同じくフロア移動してきた後輩が給湯室の電子レンジ(96年製)を使って曰く、
「レンジってほんとにチンって鳴るんですねー」
Σ( ̄△ ̄
いやまぁ、確かに移動前のフロアの電子レンジ(03年製)は電子音でしたけど、その感想はあまりにもアレなのではないかと。
# おかしいなぁ、後輩ったってせいぜい2歳差のはずなんだけどなー。
## ジェネレーションギャップだとは思いたくない(ぉ
この間、社内で座席の配置替えがあって、フロアを移動した。
その翌日の昼時、同じくフロア移動してきた後輩が給湯室の電子レンジ(96年製)を使って曰く、
「レンジってほんとにチンって鳴るんですねー」
Σ( ̄△ ̄
いやまぁ、確かに移動前のフロアの電子レンジ(03年製)は電子音でしたけど、その感想はあまりにもアレなのではないかと。
# おかしいなぁ、後輩ったってせいぜい2歳差のはずなんだけどなー。
## ジェネレーションギャップだとは思いたくない(ぉ
トップページにも書いてありますが、
・ちょっとえちぃ絵
・えちぃ絵
はFloralCompany.log内に移動しました。
使用するSQLiteライブラリは System.Data.SQLite 。
これは、Complete ADO.NET 2.0 Implementation
ということだそうですが、
なにせ、ADO.NETとか使ったこと無いんで案の定ドキュメントあっても引っかかるところがあった...
ので、自分用備忘録として、使い方を載せておきます。
using System;
using System.IO;
using System.Data;
using System.Data.SQLite; // 名前空間のimport
class SampleClass
{
public static void main(string[] args)
{
// コマンドライン引数の1つ目はデータベースファイルへのパスとする。
if ( args.Count != 1 || !File.Exists(args[0]) ) {
Console.WriteLine("usage: <exec> <dbfile>");
return;
}
// データベースコネクションを設定
SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.DataSource = args[0];
SQLiteConnection conn = new SQLiteConnection(builder.ConnectionString);
// 接続
conn.Open();
// Prepared Statementを作成
SQLiteCommand comm1 = conn.CreateCommand();
comm1.CommandText = "INSERT INTO TBL_HOGE VALUES (?, ?)";
// Prepare() は"Does nothing"なので呼ばなくていい
// パラメタを設定
SQLiteParameter param = comm1.CreateParameter();
param.Value = "Hoge";
comm1.Parameters.Add(param);
param = comm1.CreateParameter();
param.Value = 32;
comm1.Parameters.Add(param);
// statement を使いまわす場合は先に Parameters.Clear() しておく
// SELECT以外の実行
// INSERTした行数やらUPDATEした行数やらが返ってくるので
// 必要なら使う。
comm1.ExecuteNonQuery();
// 今度はSELECT
SQLiteCommand comm2 = conn.CreateCommand();
comm2.CommandText = "SELECT * FROM TBL_HOGE";
using ( SQLiteDataReader r = comm2.ExecuteReader() ) {
// r.FieldCount --- 現在のResultSetのカラム数
// r.HasRows --- SELECT結果が1行でもあれば true
// r.Read() --- 次のResultSetを<b>読み込む</b>
// r.NextResult() --- 次のResultSetへ<b>移動する</b>。(移動するだけで読み込んではくれないっぽい)
// 初期rowは最初の結果の1つ前(他の多数のDBライブラリと一緒)
int ridx = 0;
while ( r.Read() ) {
Console.WriteLine("["+ridx+"]");
++ridx;
for ( int i = 0; i < r.FieldCount; ++i ) { // columnのindexは0 origin
Console.WriteLine(" " + r.GetName(i) + " --- " + r.Item[i]);
// もしくはr.Get***() メソッドで型指定で取ってくる。
}
}
}
comm2.Dispose();
comm1.Dispose();
conn.Dispose();
}
}
こんな感じかな。
ちなみに、Parameterの型をちゃんと指定しないとまずい場合は、
SQLiteParameter param = comm.CreateParameter();
param.DbType = System.Data.DbType.Int64
param.Value = 0L;
comm.Paramters.Add(param);
とかやる。 (2008-03-18 基本的に常に指定しなきゃいけないみたい..)
また、SQLiteは基本的に変更即commitなので、Transactionは明示的に
SQLiteTransaction tx = conn.BeginTransaction();
// 何か変更
tx.Commit(); // または tx.Rollback();
とかやる必要あり。
もうひとつおまけ。
SELECT COUNT(*) FROM TABLE など、必ず1列目1行目が取れるような場合には
if ( (Int64)comm.ExecuteScalar() > 0 ) {
// hogehoge
}
とかできる。
現在、ぱちゅコン!に大嵌り中であります。去年の冬コミで購入して、未だにほぼ毎日プレイしてます。何という中毒性!
は、さておき。以下、今更ながらExtraで出てくるTDモード(TowerDefenceモード)LunaのHiScoreを目指した攻略です。
0. 面子
EDITで てゐ、鈴仙、パチュリー、幽々子、後誰か1人(どーせ使わないから誰でもいい(ぉ
1. 初期購入
・てゐx2
・鈴仙x30
・パチュリーx10
・幽々子x4
2. START から一気にBonusx16までNextを連打。(マウスとキーボード(Spaceキー)の交互連打がお勧め.)
3. Bonus x16を維持しつつ、保険として幽々子を2~4体購入し、適当に中央上下か本棚側のどこかに上下対象っぽく配置。
4. 鈴仙をLv3まで上げる。続けて幽々子、パチュリーもLv2にしておく。
5. 鈴仙をLv6に。続けて幽々子・パチュリーをLv3に。後パチュリーをLv6まで上げる。
6. 5. でパチュリーのLv上げをしている間に隙を見ててゐを2体ほど追加購入、敵出口の近くに置いておく。 3.で購入した幽々子を敵出口側に移動させておくのも手です。
7. 残り、適当に幽々子、てゐをLvUPさせてるといつの間にかクリアしてます。お疲れ様でした。
※注意点
・(鈴仙がLv6未満の時は特に)紫が出てきたら片付くまでNext禁止
・小町、妹紅が連続して出てきたらちょっとNext間隔を緩める
・萃香、フラン、Boss慧音が出てきたらだいぶNext間隔を緩める(これらのユニットは下手すると本棚まで到達してしまう)
・但し、↑にかかわらず、鈴仙がLv6になったら1~2秒間隔でNext押してても結構平気っぽい。
dankogaiさんの nested list comprehension のperl版に対抗(?)して、
eval() を使わない版を書いてみました。
# 2008-07-08 追記 コードが長いので続きに移動しました。
このblogっぽいものに使ってるblogシステムをMovableTypeの4.1に更新しました。
ちょっとてこずって何回かバックアップから書き戻したけど、まぁ何とか。
Perl5.10になって、switch文 が正式に使えるようになりました。
# code 1
use feature q/:5.10/;
my $i = 5;
given ($i) {
when (4) { say "Oops" }
when (5) { say "yes" }
when (6) { say "Oh No" }
default { say "no" }
}
smart matching と相まって非常に便利です。
が、旧来のswitch技法との組み合わせ技である
# code 2
my $i = 5;
my $r = do {
if ( $i== 4 ) { "Oops" }
elsif ( $i== 5 ) { "yes" }
elsif ( $i== 6 ) { "Oh no" }
else { "no" }
};
や
# code 3
my $i = 5;
my $r = ( $i== 4 ) ? "Oops" :
( $i== 5 ) ? "yes" :
( $i== 6 ) ? "Oh no":
"no";
相当のものはどうもgiven-when単体ではできなさそう。
# code 4
use feature q/:5.10/;
my $i = 5;
my $r = do {
given ($i) {
when (4) { "Oops" }
when (5) { "yes" }
when (6) { "Oh No" }
default { "no" }
}};
とやっても code 4 の $r には undef が入ってるご様子。
もちろん、
# code 5
use feature q/:5.10/;
my $i = 5;
my $r = eval {
given ($i) {
when (4) { return "Oops" }
when (5) { return "yes" }
when (6) { return "Oh No" }
default { return "no" }
}};
はうまく行くけど、何か違う気がするし..
何だろう。switch statement は EXPR じゃないってのは判るけど、
do BLOCKのreturn valueであるvalue of the last command in the sequence of commands indicated by BLOCK.
(perldoc -f do)は一体どれだ??