イントレ。
2010-01
2010-01-29
「Google日本語入力」がアップデート、郵便番号・英単語変換も
「バージョン」で変換して「GoogleJapaneseInput-0.9.248.0」になってれば自動アップデート済みです。
今回のアップデートで郵便番号からの変換が可能に。あると地味に便利。
それからひらがなからの英単語変換。「やほー」→「Yahoo」への変換ができたのには笑ったw
あとはIME再変換への対応とユーザー辞書の登録が簡単に出来るようになればいいんですがね・・・。
しかし、GMailにChrome、IME、Reader・・・とGoogleに頼りっぱなしな環境になったもんだなぁ。
「バージョン」で変換して「GoogleJapaneseInput-0.9.248.0」になってれば自動アップデート済みです。
今回のアップデートで郵便番号からの変換が可能に。あると地味に便利。
それからひらがなからの英単語変換。「やほー」→「Yahoo」への変換ができたのには笑ったw
あとはIME再変換への対応とユーザー辞書の登録が簡単に出来るようになればいいんですがね・・・。
しかし、GMailにChrome、IME、Reader・・・とGoogleに頼りっぱなしな環境になったもんだなぁ。
2010-01-19
ユーザー定義関数がかなり有用な予感。
SQL文のRandom()とかSum()とかCount()みたいなのを独自に定義出来る。
System.Data.SQLiteを使うと、ユーザー関数をC#側からも定義出きます。
基本的には以下の流れ。
・SQLiteFunctionを継承したクラスを作成し
・SQLiteFunction属性をつける
・SQLiteFunction.RegisterFunction()で登録
呼ぶときはSQL文に普通に記述すればいい。
たとえば、「SELECT * FROM test ORDER BY value COLLATE NETFX_COLLATE」みたいな。
まずはCollation。
ORDER BY ~ COLLATEに使う文字の比較を定義出きます。
オーバーライドするのはCompare()だけでいいみたい。
[SQLiteFunction(Name="NETFX_COLLATE", FuncType=FunctionType.Collation)]
class NETFX_COLLATE : SQLiteFunction
{
public override int Compare(string param1, string param2)
{
return StringComparer.CurrentCulture.Compare(param1, param2);
}
}
Exolorerの文字ソートみたいに数字を考慮するならStrCmpLogicalW()を使ってこんなことも。
[SQLiteFunction(Name="Logical_COLLATE", FuncType=FunctionType.Collation)]
class Logical_COLLATE : SQLiteFunction
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int StrCmpLogicalW(string str1, string str2);
public override int Compare(string param1, string param2)
{
return StrCmpLogicalW(param1, param2);
}
}
次、Scaler。
Random()とかLower()とかみたいなやつ。
Argumentsには要求する引数の数。-1で可変数にも出来るみたい。
オーバーライドするのはInvoke()メソッド。
[SQLiteFunction(Name="NETFX_RANDOM", FuncType=FunctionType.Scalar, Arguments=0)]
class NETFX_RANDOM : SQLiteFunction
{
readonly static Random rand = new Random();
public override object Invoke(object[] args)
{
return rand.Next();
}
}
最後にAggregate。
Sum()とかCount()みたいに、結果を捜査して出力を返すタイプのもの。
Step()でコンテキストインスタンスを渡して値を保持しておきます。
Step()が必要回数呼ばれて、最後にFinal()が呼ばれます。
[SQLiteFunction(Name = "NETFX_Sum", FuncType = FunctionType.Aggregate, Arguments = 1)]
class NETFX_Sum : SQLiteFunction
{
class Context
{
public decimal Value = 0;
}
public override void Step(object[] args, int stepNumber, ref object contextData)
{
var data = (contextData as Context) ?? (Context)(contextData = new Context());
data.Value += Convert.ToDecimal(args[0]);
}
public override object Final(object contextData)
{
var data = contextData as Context;
return (data == null) ? null : (object)data.Value;
}
}
あーしかしやばいなー。
これは便利すぎる。
SQL文のRandom()とかSum()とかCount()みたいなのを独自に定義出来る。
System.Data.SQLiteを使うと、ユーザー関数をC#側からも定義出きます。
基本的には以下の流れ。
・SQLiteFunctionを継承したクラスを作成し
・SQLiteFunction属性をつける
・SQLiteFunction.RegisterFunction()で登録
呼ぶときはSQL文に普通に記述すればいい。
たとえば、「SELECT * FROM test ORDER BY value COLLATE NETFX_COLLATE」みたいな。
まずはCollation。
ORDER BY ~ COLLATEに使う文字の比較を定義出きます。
オーバーライドするのはCompare()だけでいいみたい。
[SQLiteFunction(Name="NETFX_COLLATE", FuncType=FunctionType.Collation)]
class NETFX_COLLATE : SQLiteFunction
{
public override int Compare(string param1, string param2)
{
return StringComparer.CurrentCulture.Compare(param1, param2);
}
}
Exolorerの文字ソートみたいに数字を考慮するならStrCmpLogicalW()を使ってこんなことも。
[SQLiteFunction(Name="Logical_COLLATE", FuncType=FunctionType.Collation)]
class Logical_COLLATE : SQLiteFunction
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int StrCmpLogicalW(string str1, string str2);
public override int Compare(string param1, string param2)
{
return StrCmpLogicalW(param1, param2);
}
}
次、Scaler。
Random()とかLower()とかみたいなやつ。
Argumentsには要求する引数の数。-1で可変数にも出来るみたい。
オーバーライドするのはInvoke()メソッド。
[SQLiteFunction(Name="NETFX_RANDOM", FuncType=FunctionType.Scalar, Arguments=0)]
class NETFX_RANDOM : SQLiteFunction
{
readonly static Random rand = new Random();
public override object Invoke(object[] args)
{
return rand.Next();
}
}
最後にAggregate。
Sum()とかCount()みたいに、結果を捜査して出力を返すタイプのもの。
Step()でコンテキストインスタンスを渡して値を保持しておきます。
Step()が必要回数呼ばれて、最後にFinal()が呼ばれます。
[SQLiteFunction(Name = "NETFX_Sum", FuncType = FunctionType.Aggregate, Arguments = 1)]
class NETFX_Sum : SQLiteFunction
{
class Context
{
public decimal Value = 0;
}
public override void Step(object[] args, int stepNumber, ref object contextData)
{
var data = (contextData as Context) ?? (Context)(contextData = new Context());
data.Value += Convert.ToDecimal(args[0]);
}
public override object Final(object contextData)
{
var data = contextData as Context;
return (data == null) ? null : (object)data.Value;
}
}
あーしかしやばいなー。
これは便利すぎる。
2010-01-15
・・・ということに再び気付かされた。
自分は何かと面倒な性格なようで。
新しいものに染まりやすく、しかも統一性を求めようとする傾向があるらしい。
プログラムに関しても例外ではなく、新しいAPIがあればすぐに使いたがり、
新しいプログラミングモデルがあれば、過去の資産を捨てて新しく書き直す・・・。
とっても損な性格です。
C/C++を触っていた時代、プログラミングの禁じ手というものを読んでて、
goto分は悪とか、グローバル変数は良くない、という類のものが頭に刷り込まれています。
それがいつの間にか、禁じ手の理由を忘れて『使ってはいけない』に変化していて・・・。
久々に読んだコードはある程度の規模を持ったアプリケーションの物。
禁じ手とされるコードを使い、コーディングパターンを半端に使っていながらも、
全体の可読性がよく、中身もシンプルでわかりやすい、すごく素直なコードになっていました。
こういう書き方をしてもいいんだ・・・と素直に感心。
変なものに囚われ過ぎていたのかもしれない。
もっと自由に書いてもいいんだ。
なんかそんなふうに思った。
・・・と、新しい切り口のコードに感化して染められそうな自分はどうすればいいんだろう?w
まぁ、とりあえずテンション高いうちに色々やってみればいっかw
流されるのはもはや仕方ないのカモ。(汗)
自分は何かと面倒な性格なようで。
新しいものに染まりやすく、しかも統一性を求めようとする傾向があるらしい。
プログラムに関しても例外ではなく、新しいAPIがあればすぐに使いたがり、
新しいプログラミングモデルがあれば、過去の資産を捨てて新しく書き直す・・・。
とっても損な性格です。
C/C++を触っていた時代、プログラミングの禁じ手というものを読んでて、
goto分は悪とか、グローバル変数は良くない、という類のものが頭に刷り込まれています。
それがいつの間にか、禁じ手の理由を忘れて『使ってはいけない』に変化していて・・・。
久々に読んだコードはある程度の規模を持ったアプリケーションの物。
禁じ手とされるコードを使い、コーディングパターンを半端に使っていながらも、
全体の可読性がよく、中身もシンプルでわかりやすい、すごく素直なコードになっていました。
こういう書き方をしてもいいんだ・・・と素直に感心。
変なものに囚われ過ぎていたのかもしれない。
もっと自由に書いてもいいんだ。
なんかそんなふうに思った。
・・・と、新しい切り口のコードに感化して染められそうな自分はどうすればいいんだろう?w
まぁ、とりあえずテンション高いうちに色々やってみればいっかw
流されるのはもはや仕方ないのカモ。(汗)
2010-01-11
電源ケーブルもアンテナ配線も一切不要の液晶テレビ
電力も映像もワイヤレスな液晶テレビ。
家電の展示会、CES 2010でお目見えしていたそうです。
ちょっと前に話題に放っていましたが、もう実用的だとかなんだとか。
それはそれでいいんですが、ワイヤレス技術ってなかなか浸透しないってのがネック。
有線よりメリットが上回ればすぐなんだろうけど。ケータイみたいに。
ワイヤレスUSBとかどうなったんだろうなー。
電力も映像もワイヤレスな液晶テレビ。
家電の展示会、CES 2010でお目見えしていたそうです。
ちょっと前に話題に放っていましたが、もう実用的だとかなんだとか。
それはそれでいいんですが、ワイヤレス技術ってなかなか浸透しないってのがネック。
有線よりメリットが上回ればすぐなんだろうけど。ケータイみたいに。
ワイヤレスUSBとかどうなったんだろうなー。
2010-01-07
実はメイリオまだ進化中! 誕生秘話を河野氏に聞いた
メイリオはVistaから搭載された日本語フォントなんですが、その開発秘話的なものが載ってます。
これもVista同様に色々と産みの苦しみを味わったっぽいですね・・・。
メイリオはMS UI GothicやMS Pゴシックと比べるとどうしても大きくて幅をとりがちなフォントなので、
自分も慣れるまではUI Gothicに戻したり、非公式パッチのMeiryo_Keを使ったりしてました。
最近になってようやく慣れてきて、ほぼメイリオのみになりましたけど、
今でもメニューの多いVisualStudioはMS UI Gothic使ってます。
Windows7になって新しいバージョンのメイリオが搭載されたそうですが、
こっちも時間的都合からまだ途中な状態ということで、時間がかかるなぁと思った次第。
メイリオはVistaから搭載された日本語フォントなんですが、その開発秘話的なものが載ってます。
これもVista同様に色々と産みの苦しみを味わったっぽいですね・・・。
メイリオはMS UI GothicやMS Pゴシックと比べるとどうしても大きくて幅をとりがちなフォントなので、
自分も慣れるまではUI Gothicに戻したり、非公式パッチのMeiryo_Keを使ったりしてました。
最近になってようやく慣れてきて、ほぼメイリオのみになりましたけど、
今でもメニューの多いVisualStudioはMS UI Gothic使ってます。
Windows7になって新しいバージョンのメイリオが搭載されたそうですが、
こっちも時間的都合からまだ途中な状態ということで、時間がかかるなぁと思った次第。
2010-01-05
CLR 徹底解剖 インプロセス サイドバイサイド
MSDNマガジンより。
.NET Framework 4のインプロセス・サイドバイサイドについて、実装するに至った経緯などが詳細に書いてあります。
事の発端が.NET Framework 2.0 ベータ版で、ようやく今になって実装出来たあたりに実現への難しさを感じますね。
.NET3.0/3.5がCLR2.0で動くような構成になっていたのも、
CLRのバージョンを変えずにサービスパック名義で大胆な修正したのもこれが理由だったんですかね。
.NET Framework 4ではインプロセス・サイドバイサイドが実装されたので、
1プロセス1CLRの制限が撤廃されますが、.NET1.1と2.0が混在することは出来ないとのこと。
しかし、.NET4以降のバージョンは混在できるので、(1.1or2.0)+4+5というような感じも可能だとか。
MSとしても、これでシェル拡張をサポート出来るようになるということで、
C#でやれる範囲が広がってくるといいなぁと思う。
MSDNマガジンより。
.NET Framework 4のインプロセス・サイドバイサイドについて、実装するに至った経緯などが詳細に書いてあります。
事の発端が.NET Framework 2.0 ベータ版で、ようやく今になって実装出来たあたりに実現への難しさを感じますね。
.NET3.0/3.5がCLR2.0で動くような構成になっていたのも、
CLRのバージョンを変えずにサービスパック名義で大胆な修正したのもこれが理由だったんですかね。
.NET Framework 4ではインプロセス・サイドバイサイドが実装されたので、
1プロセス1CLRの制限が撤廃されますが、.NET1.1と2.0が混在することは出来ないとのこと。
しかし、.NET4以降のバージョンは混在できるので、(1.1or2.0)+4+5というような感じも可能だとか。
MSとしても、これでシェル拡張をサポート出来るようになるということで、
C#でやれる範囲が広がってくるといいなぁと思う。
2010-01-03
更新するネタが無いので。(汗)
◇SQLiteConnectionStringBuilder
接続文字列の自動生成。
プロパティ設定してToString()で取得できる。
◇SQLiteDataAdapter
DataSet/DataTableとのやり取りに使用。
最低限、Select文を渡して置く必要がある。SELECT * FROM hoge みたいな。
Fill()でDB読み込み、Update()でDB更新。
◇SQLiteCommandBuilder
UPDATE/INSERT/DELETE文の自動生成。
SELECT文設定済みのDataAdapterが必要。
◇読むとき
var conn = new SQLiteConnection(...);
var da = new SQLiteDataAdapter(...);
var ds = new DataSet();
da.Fill(ds, "hoge");
◇書くとき
var conn = new SQLiteConnection(...);
conn.Open();
var ts = conn.BeginTransaction();
var da = new SQLiteDataAdapter(...);
var cb = new SQLiteCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.InsertCommand = cb.GetInsertCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.Update(table);
ts.Commit();
◇LINQ
// System.Data.DataSetExtensions.dllの参照が必要
new DataTable(...)
.AsEnumerable()
.Where(row => row.Field("column1") == "hoge")
.Select(row => row);
こんなことせずに素直にEntityFramework使う方が賢い気はするけど、敢えて。
◇SQLiteConnectionStringBuilder
接続文字列の自動生成。
プロパティ設定してToString()で取得できる。
◇SQLiteDataAdapter
DataSet/DataTableとのやり取りに使用。
最低限、Select文を渡して置く必要がある。SELECT * FROM hoge みたいな。
Fill()でDB読み込み、Update()でDB更新。
◇SQLiteCommandBuilder
UPDATE/INSERT/DELETE文の自動生成。
SELECT文設定済みのDataAdapterが必要。
◇読むとき
var conn = new SQLiteConnection(...);
var da = new SQLiteDataAdapter(...);
var ds = new DataSet();
da.Fill(ds, "hoge");
◇書くとき
var conn = new SQLiteConnection(...);
conn.Open();
var ts = conn.BeginTransaction();
var da = new SQLiteDataAdapter(...);
var cb = new SQLiteCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.InsertCommand = cb.GetInsertCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.Update(table);
ts.Commit();
◇LINQ
// System.Data.DataSetExtensions.dllの参照が必要
new DataTable(...)
.AsEnumerable()
.Where(row => row.Field
.Select(row => row);
こんなことせずに素直にEntityFramework使う方が賢い気はするけど、敢えて。
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense