知った顔ばかり2008年10月07日 23時29分52秒

私が今勤めている会社はC#で社内開発という珍しいところなので技術者を募集してもなかなか応募がないようです。

応募者の名前とか見てみると前の会社の同僚とかが載っていたりしてこの業界も思ったより狭いのかもしれないと思ってしまいました。 C#で開発している人はそんなに少ないんでしょうか。

partialをむやみやたらと使用しない(C#)2008年09月06日 18時24分27秒

仕事で他の人が作成したプログラミングをメンテする機会が多いのですが、その中でやめてほしいのがpartialをやたらと使ったプログラミングです。

オブジェクト指向だろうが構造化だろうが1つのクラスやメソッドにコードを多く詰め込みすぎるとメンテしにくいのでクラスやメソッドの分割を考えると思いますが、そのときにpartialを使う人が結構います。

partialを使った分割は完全にクラスを分割することに比べれば簡単にできるのでpartialを使いたい気持ちはわかりますが、そのクラスを使う側にとって見ればpartialクラスは結局1つのクラスなので単に馬鹿でかいクラスができることになります。

partialがなければファイルがどんどん大きくなっていくのでクラス分割を考えるのでしょうが、partialを使ってしまうとクラスがでかくなっていくのがわからなくなってしまいます。

partialを使ったクラスでpublicメソッドが50を超えているようなものも実際に経験しました。今やっているプロジェクトではコーディングルールでpartialは禁止にしています。

partialは自動生成されたコードとユーザーのコードを分けるために考えられた機能なのでむやみにほかの用途に使うのは考え物です。

DBFluteのチュートリアル2008年08月02日 00時35分40秒

DBFlute

現場志向のO/RマッパーであるDBFluteチュートリアルが出ています。私も会社でDBFluteのチュートリアルをやらされました。

DBFluteはConditionBeanの書き方やSQLの書き方が独特でなれるまで時間がかかります。私も最初に触ったときは1日に何回も質問しなければ実装できなかった覚えがあります。でもこのチュートリアルを使えば何回も質問しなければわからなかったような実装方法が1日で理解できてしまいます。学習コストが格段に下がっているので大規模なプロジェクトでも導入可能だと思います。

ただ残念なのは公開されているのはデベロッパー向けのチュートリアルだけで、アーキテクト向けのものはまだ準備中のようです。つまりすでに環境が整備された状態で実装を進めるための方法はデベロッパー向けのチュートリアルでできるのですが、呪文のような設定ファイルを書いてDAOやエンティティを作成する準備をするのはアーキテクト向けのチュートリアルを待たなければいけないわけです。

ただこれで導入のための敷居が一段と下がったのは間違いないのでDBアクセスにまだデータセットを使っているような人は一度DBFluteを使ってみてその生産性の高さを実感してほしいと思います。

ASP.NETモバイルで<head>タグが消える2008年05月01日 23時28分56秒

今日は1日中この問題を調べてました。きっかけは以下のサイト

モバイルWebフォームでheadタグが消える

で、調べてみたらできるようです。aspxの<mobile:form>タグの中に以下のような記述を書けばいい。

<mobile:DeviceSpecific ID="DeviceSpecific1" Runat="server">
   <Choice Filter="supportsJavaScript">
     <ScriptTemplate>                     
       <meta name="description" content="description metatag"/>        
     </ScriptTemplate>
  </Choice>
</mobile:DeviceSpecific>  

この記述でmetaタグが埋め込まれるのはアクセスしたデバイスがjavascriptをサポートしている場合のみです。javascript未サポートの携帯の場合は何も表示されません。

ブラウザファイルを書き換えて強制的にjavascriptオンにするとほかの部分で不具合でそうで困った。

metaタグを出力するのはSEO対策でサーチエンジン用の情報を記述したいからだそうです。そういう場合はサーチエンジンのクローラーがアクセスしたときにmetaタグが出ればいいのかな?サーチエンジンのUserAgentってわかるようになってるのか?この辺がわかれば解決かな。

元ネタ

http://forums.asp.net/t/1229706.aspx

5/17 追記

かるあさんが解決方法をブログに書いてくれました。 どうもありがとうございます。

http://karua.at.webry.info/200805/article_3.html

エラー「セーフハンドルは閉じられました」2008年03月22日 17時48分35秒

先週本番環境にインストールしたアプリケーションでタイトルのようなエラーがでて解決方法がわからず困っていました。

このエラーはObjectDisposedExceptionというそうです。Closeメソッドが呼ばれて、すでに破棄されたオブジェクトに対してアクセスしようとするとこのエラーになるようです。MSDNには以下のようなサンプルコードが載っています。

using System;
using System.IO;
public class ObjectDisposedExceptionTest 
{
  public static void Main()
  {     
     MemoryStream ms = new MemoryStream(16);
     ms.Close();
     try 
     {
        ms.ReadByte();
     } 
     catch (ObjectDisposedException e) 
     {
        Console.WriteLine("Caught: {0}", e.Message);
     }
  }
}

さすがにこんな単純なミスをすることはないでしょう。ただ今回はマルチスレッドで複数のスレッドからアクセスするオブジェクトだったため、このエラーが発生するようになってしまったようです。マルチスレッドの同期処理はしっかりしないといけません。

Practical Mono2008年02月06日 23時29分09秒

Practical Mono

最近仕事で必要になったのでmonoの情報を調べています。日本語ではものがたりというサイトが一番詳しいようです。開発の最新の状況もわかるので非常にありがたいです。

ただそれだけでは不足なので本を買って読んでいます。画像の「Practical Mono」がそれです。Amazonで調べたところ、Mono関連で一番新しい本がこれでした。それでも出版は2005年12月なので載っている情報は結構古いです。

内容はMonoの基本からLinuxで開発環境の構築から各コンポーネントの利用方法まで幅広いです。英語もすごく簡単で洋書になれていない人でも読めると思います。

NVelocityでテンプレートファイルの指定に絶対パスを使用する方法2008年01月13日 17時28分43秒

聞かれることが多いので忘れないようにメモしときます。

NVelocityでテンプレートファイルのファイル名を指定するときに絶対パスを使用するとテンプレートファイルが読み込まれません。

絶対パスを使用するには下のサンプルのようにExtendedPropertiesクラスを使用します。

サンプルソースはこのサイトから引用させていただきました。

ExtendedProperties props = new ExtendedProperties();
props.AddProperty("file.resource.loader.path", new ArrayList(new string[]{".", "C:\\"}));
velocity.Init(props);
template = velocity.GetTemplate("foo\\bar\\somefile.vm");

Windowsサービスから指定したユーザーでプロセスを起動する(解決編)2007年12月14日 15時50分38秒

この前書いた「Windowsサービスから指定したユーザーでプロセスを起動する 」ですが、やっと解決しました。その方法は以下の通りです。

  • ユーザーを指定してプロセスを実行するのにCreateProcessWithLogonWを使用する。
  • CreateProcessWithLogonWの引数dwLogonFlagsにはLOGON_WITH_PROFILEを使用する。
  • CreateProcessWithLogonWの引数のSTARTUPINFOに次のように指定する。
startInfo.lpDesktop = "winsta0\\default";

CreateProcessWithLogonW自体の使い方については検索すればいろいろ出てくると思います。 とりあえずCodeProjectにサンプルコードが掲載されていたのでこれを見てください。

RunAs Class

重要なのはlpDesktopに指定した"winsta0\\default"です。このうちwinstat0はステーション、defaultはデスクトップを指定する文字列です。 ステーションとはここを見ると詳しく解説されています。 簡単に言うとステーションとはユーザーごとに用意されたオブジェクトで、デスクトップはステーションに含まれるオブジェクトの内の1つで、表示画面をつかさどります。 Windowsサービスはふつうのアプリとは違う特殊なステーション・デスクトップ上で動作しているため、サービスから起動したアプリはその特殊なステーションを引き継いでしまいきちんと動作しない物と思われます。

S2DAOの外だしSQLでLIKE構文を使う(SQLServer版)2007年12月12日 09時56分48秒

今の仕事ではORマッピングとしてS2DAO.NETDBFluteを使用しています。

その中で外だしSQLの書き方に毎回苦労します。 S2DAOは複雑なSQLを外だしSQLとして記述できるのですが、その文法には一定のルールがあります。リファレンスのように全ての記述方法がまとまったWebサイトがないので、ちょっとこった使い方をしようとすると大変です。 Webで検索して同じようなところではまった人のサイトをさがすしかありません。

Like構文もその一つです。外だしSQLでLikeを使うには以下のようにします。

testTable.testColumn like /*ab.ArtistName*/'' || '%'

ただしこれはOracleでのみ通用する書き方で、SQLServerでは以下のようになります。

testTable.testColumn like /*ab.ArtistName*/'' + '%'

今回のプロジェクトでWebで検索してもなかなかヒットしなかったのでメモしておきます。

書籍でもいいのでこういう細かい記述方法にまで言及したリファレンスのようなものがあればSeasarももっと普及するのではないかと思います。 せっかくいい物を作っているのにきちんとしたドキュメントがないためにそれほど普及していないのは残念です。

追記

LIKE構文でワイルドカード文字の検索を行うにはESCAPEを使います。 たとえば、LIKE '_A'と指定した場合、_(アンダーバー)はワイルドカード文字なので'BA'や'ZA'なども検索対象として引っかかってしまいます。これを'_A'のデータのみ取得できるようにするには以下のように指定します。

 testTable.testColumn like /*ab.ArtistName*/'' + '%' ESCAPE '/' ;

Windowsサービスから指定したユーザーでプロセスを起動する2007年12月11日 12時45分29秒

最近はWindowsサービスのプログラムを作成しています。 その中でWindowsサービスからユーザーを指定してEXEを実行するという仕様があるのですが、それがうまくいかなくて困っています。 .NETのProcessクラスを使用してもうまくいかないので、Win32APIのCreateProcessWithLogonWを使用して実装してみましたがアプリケーションが正しく初期化されていませんというようなメッセージが出てうまくいきません。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32959&forum=7&7

このサイトにあるようにもっと複雑な処理をしないとサービスからプロセスを起動するのは無理なんでしょうか。

追記

解決しました。詳細は以下のリンクへ。

http://minoproject.asablo.jp/blog/2007/12/14/2512666