エンジニアが発信する【2007年06月】の記事です

エンジニアが作る最新ITブログ トップ>【2007年06月】

2007年06月30日

Matrix Mult プログラムのPPUの方の理解も終わりました

ということで理解しました。block_swizzle の意味がなかなかつかめなくて、しばらく悩んでましたが、休憩もかねて、昼食を食べに行ったらすぐにひらめきが起こりました。そうかブロックごとに転送するために要素の配置を換えているのか。今考えるとそれほど難しいとは思えないのですが、難しく考えすぎたのかもしれません。プログラムを素直に読めば分かるものを、値を出力するというアホな行動をしたために余計な時間を使ってしまいました。
で、「行き詰ったら休憩を取るのは大事」というまたどこかで聞いたことがあるような結論で終わります。

この記事本当は一昨日の6月28日の午後に書いたのですが、アップしようとしたらアメブロが重かったのであきらめました。しかも昨日は忘れてたので、本日6月30日にアップすることになりました。

2007年06月30日

Windows版Safari3β版のalertでは、英数字が一定文字数以上にわたって連続するとalertを正しく表示できない不具合



あまり実害はないかもしれませんが、Windows版Safari3Beta(3.0.2)には、英数字が一定文字数以上、連続すると、alertされている文字が見えなくなる不具合があります。英数字の間に半角スペースが途中で入っていればOKですが、私の環境では英数字が47文字以上連続するとこの不具合が発生しました。もしかすると設定しているフォントによって、この制限文字数の上限は多少変わるかもしれませんが・・・。詳細なテストページをこちらに準備しました。

上のような簡単なJavascriptがWindows版Safari(3.0.2)では、期待通りに動きません。alertは表示されますが、alertされている文字は見えません。空白文字になっています。



連続する英数字の間に半角スペースが混じっていれば、全体で何文字あろうと関係がありません。また、日本語の場合は、連続で100文字あっても問題ありません。(今突然、「100人乗っても大丈夫」のイナバ物置さんのCMを思いだしました。)

世界一長い単語は「pneumonoultramicroscopicsilicovolcanoconiosis」(珪性(けいせい)肺塵症(はいじんしょう)という意味らしいです。)の45文字という記述をネットで見かけましたので、Safari 3 for Windowsの実装でぎりぎり問題がないようにも見えます。45文字が最大だからその一つ上の46文字までは何とか面倒を見よう、これがSafari開発者の意図だったのかもしれません?!

しかし、IEやFirefox、さらにはMac版Safariではこのような問題は発生しませんので、一応まとめておきます。それに、考えてみたら、以下のようなコードを書きたくなる場合もあるかもしれません。

この場合も、Windows版Safari3.0.2では不具合が発生し、「メールアドレスに利用できる文字は、」しか表示されません。これは、やはり問題でしょう。

このalertメソッドに関する不具合としては、他に、

●Windows版Safari(β版)で、改行を含む文字列をalertで表示させると変になる不具合
http://shimax.cocolog-nifty.com/search/2007/06/windowssafarial_63f5.html

があります。今回の不具合とは別の理由によるものと思われますが、いずれの不具合も早く修正されてほしいです。

最後に蛇足ながら、他のブラウザの挙動として、Windows版IEでは、適当な文字数で自動的に改行してくれて、アラートのボックスが極端に横長にならないように調整してくれますが、Firefoxでは、連続する文字数が200文字とか400文字になっても、自動改行してくれないので、アラートのボックスの横幅はどんどん広くなっていきます。私のパソコン(解像度1152×864。Firefox 2.0.0.4)では、400文字になるとアラートのOKボタンが消えました。

2007年06月29日

[C#] TableAdapter にトランザクション機能を実装するクラス

今は Visual C# 2005 Express Edition にて ADO.NET 2.0 Provider for SQLiteを利用してクライアントアプリの開発しています。

TableAdapterにてINSERTやupdateするとどうも更新が遅いので、Googleで調べたら

> http://journal.mycom.co.jp/special/2004/php5/007.html
> SQLiteでは明示的にトランザクションを開始しない限り、INSERT処理の前後に必ず”BEGIN”、”COMMIT”が実行される。

とのことでした。

で、色々試行錯誤して下記のVB記事を参考にC#&SQLite用のトランザクションの処理を追加。

TableAdapterにトランザクションを実装 / うなまな Blog
http://www.ailight.jp/blog/unaap/archive/2007/02/13/13566.aspx

ソースは次のとおりです。
とりあえず貼り付けて起きます、何か問題あったら連絡ください。
(more…)

Technorati , , , , , , , ,

2007年06月29日

RackForce

Windows Server 2003 Standard が載った仮想マシンを借りました。

こちら

2007年06月28日

[C#] ADO.NET 2.0 Provider for SQLite 1.0.43.0 ではまった…。

ことの始まりは、つい先日 SourceForge.net の RSS から ADO.NET 2.0 Provider for SQLite が 1.0.42.0 から 1.0.43.0 にバージョンアップしたのを知ったので、早速バージョンアップしてみました。

インストールも特に問題なく完了。SQLite3.4かぁ。ふーん。

でもって、開発中のアプリのコーディングを再開してしばらくすると、不可解なエラーが。

色々調べてみると、SQLのMAX関数やCOUNT関数で件数とかをチェックしているロジックが機能しない。intで返ってくるはずのところがstringになっていたり。それで変換できないエラーとか起こっている。なんじゃこれ!
ウーン、特に手を入れてないのにな…、と、ふと DataSet.Designer.cs を直接除いてみると、なんかおかしい。ん?

なんで COUNT で件数返すだけなのに return が string なんだ??

とりあえず、ADO.NET 2.0 Provider for SQLiteのバージョンを1.0.42.0に戻してみると、ソースも元に戻る。ウーン、バグなんだろうか?それともこういう仕様なんだろうか?

とりあえず、時間も無いので、1.0.42.0で開発続行しました。

SQLite-1.0.42.0-binary.exe

C#:
  1. // MAX() にて最大値を求めているクエリー
  2. [System.Diagnostics.DebuggerNonUserCodeAttribute()]
  3. [System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
  4. public virtual System.Nullable ScalarQueryTest1(long xxx_id) {
  5. System.Data.SQLite.SQLiteCommand command = this.CommandCollection[6];
  6. command.Parameters[0].Value = ((long)(xxx_id));
  7. System.Data.ConnectionState previousConnectionState = command.Connection.State;
  8. if (((command.Connection.State & System.Data.ConnectionState.Open)
  9. != System.Data.ConnectionState.Open)) {
  10. command.Connection.Open();
  11. }
  12. object returnValue;
  13. try {
  14. returnValue = command.ExecuteScalar();
  15. }
  16. finally {
  17. if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
  18. command.Connection.Close();
  19. }
  20. }
  21. if (((returnValue == null)
  22. || (returnValue.GetType() == typeof(System.DBNull)))) {
  23. return new System.Nullable();
  24. }
  25. else {
  26. return new System.Nullable(((long)(returnValue)));
  27. }
  28. }

C#:
  1. // COUNT() にて最大値を求めているクエリー
  2. [System.Diagnostics.DebuggerNonUserCodeAttribute()]
  3. [System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
  4. public virtual System.Nullable ScalarQueryTest2(long xxx_id) {
  5. System.Data.SQLite.SQLiteCommand command = this.CommandCollection[7];
  6. command.Parameters[0].Value = ((long)(xxx_id));
  7. System.Data.ConnectionState previousConnectionState = command.Connection.State;
  8. if (((command.Connection.State & System.Data.ConnectionState.Open)
  9. != System.Data.ConnectionState.Open)) {
  10. command.Connection.Open();
  11. }
  12. object returnValue;
  13. try {
  14. returnValue = command.ExecuteScalar();
  15. }
  16. finally {
  17. if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
  18. command.Connection.Close();
  19. }
  20. }
  21. if (((returnValue == null)
  22. || (returnValue.GetType() == typeof(System.DBNull)))) {
  23. return new System.Nullable();
  24. }
  25. else {
  26. return new System.Nullable(((long)(returnValue)));
  27. }
  28. }

SQLite-1.0.43.0-binary.exe

C#:
  1. // MAX() にて最大値を求めているクエリー
  2. [System.Diagnostics.DebuggerNonUserCodeAttribute()]
  3. [System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
  4. public virtual object ScalarQueryTest1(long xxx_id) {
  5. System.Data.SQLite.SQLiteCommand command = this.CommandCollection[6];
  6. command.Parameters[0].Value = ((long)(xxx_id));
  7. System.Data.ConnectionState previousConnectionState = command.Connection.State;
  8. if (((command.Connection.State & System.Data.ConnectionState.Open)
  9. != System.Data.ConnectionState.Open)) {
  10. command.Connection.Open();
  11. }
  12. object returnValue;
  13. try {
  14. returnValue = command.ExecuteScalar();
  15. }
  16. finally {
  17. if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
  18. command.Connection.Close();
  19. }
  20. }
  21. if (((returnValue == null)
  22. || (returnValue.GetType() == typeof(System.DBNull)))) {
  23. return null;
  24. }
  25. else {
  26. return ((object)(returnValue));
  27. }
  28. }

C#:
  1. // COUNT() にて最大値を求めているクエリー
  2. [System.Diagnostics.DebuggerNonUserCodeAttribute()]
  3. [System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
  4. public virtual string ScalarQueryTest2(long xxx_id) {
  5. System.Data.SQLite.SQLiteCommand command = this.CommandCollection[7];
  6. command.Parameters[0].Value = ((long)(xxx_id));
  7. System.Data.ConnectionState previousConnectionState = command.Connection.State;
  8. if (((command.Connection.State & System.Data.ConnectionState.Open)
  9. != System.Data.ConnectionState.Open)) {
  10. command.Connection.Open();
  11. }
  12. object returnValue;
  13. try {
  14. returnValue = command.ExecuteScalar();
  15. }
  16. | このブログのURL |この記事のURL

エンジニアが作る最新ITブログ トップ>【2007年06月】

メンバー紹介

タグパネル

ランキング

エンジニアが作る最新ITブログ DODA