.NETで値が無い返り値

時々長さ0の文字列("")とは別に「結果が無い」という返し方をする関数を作らないといけないことがあります。またはあらゆる数値が結果になりえるので、ある特定値(0とか-1とか)を「結果が無い」という割り当てにできない関数とか。例としては、まだ名前の入力をしていないのと入力した結果空白だったとを区別しなければいけないなど。

SQLならばNULLと扱われる内容。SQLではNULLはいかなる数字でも長さ0の文字列でもなく、「値が無い」状態です。値が無いので等号・不等号で比較することすら禁止されています。

SELECT * FROM t1 WHERE name=NULL

は文法間違いですし、

SELECT * FROM t1 WHERE name=""

はnameがNULLであるレコードには引っかかりません(値なし=""は否なわけです)

以前なら(構造体とか使って)値を入れるのとは別に、値の有無を示す整数やブール値と二つの値をセットで返す関数を作ってたのですが、.NETではIntegerやStringも含めありとあらゆるものがクラス扱いされているので、オブジェクトが存在しないという状態Nothing(VB.NET)やnull(C++/C#.NET)が使えます。例えばVB.NETでは

Function foo() as String
  If a>0 Then
    foo = str1
  Else
    foo = Nothing
  End If
End Function
Function foo() as Integer
  If a>0 Then
    foo = int1
  Else
    foo = Nothing
  End If
End Function
という関数が定義できるわけです。これでstr1が長さ0を含むいかなる文字列でも、int1がどんな整数でも、それとは別に「値が無い」という結果を返すことができます。

まぁ、当たり前といえば当たり前なんですが^^;

— posted by mu at 08:53 pm   commentComment [0]  pingTrackBack [0]

タイムマシン

夕飯時の会話の記録として。

タイムマシンに乗って過去を自分の都合の良いように変える。タイムマシンを題材にすると必ずといって良いほど展開されます。ドラえもんがのび太の家にやってきた理由もこれ。場合によっては、それを許さない管理側との対決なども。これ以外だと観光と未来を知って事前に対策したり利益を上げるくらいでしょうか、使い道は。

以下映画のネタばれ含む。

私は2002年の映画タイムマシンLinkターミネーター3Link の考え方のほうがしっくり来ます。これらは過去に不都合が無ければそもそもタイムマシンを使うことも無い、タイムマシンを使えばそこ至る課程は変わるかもしれないが、結局は同じ不都合な状態になるとしています。

守れたなら過去に行こうとはしない、よって過去に行っても原因は変れど妻は死ぬ。未来からターミネーターを刺客として送ってきた以上、少年を守っても核戦争は起きる。タイムマシンで変ったのは死に方と起きる時期だけだと。

そして・・・レジスタンスのリーダーとしてジョン・コナーが存在している以上、刺客を送っても失敗するということに気づけw > スカイネット

— posted by mu at 11:21 am   commentComment [0]  pingTrackBack [0]

パスポート受け取り

blog20070719Passport350

本日パスポート受け取り。引換証を間違えてゴミ箱に放り込んでいただとか、受け取り時刻勘違いして到着したら締め切りぎりぎりだったとかいう、微笑ましく些細で誰でも一度は経験ありそうなハプニングがありましたが、何とか受け取り完了。

こうやって表紙だけ見ると、下にIC入りを示すマークがある以外違いがありませんが、中身はかなり変ってますね。顔写真のページはホログラムみたいな細工の施した透明フィルムが貼ってありますし、それ以降のページには穴をあけて旅券番号を記してある。ICはまさか表紙に埋め込んであるの!? すごいハイテク!と思ったら、なんてことは無い、中ほどにクレジットカード2枚分厚の樹脂製カードが入っておりました_| ̄|○

ICを機械に読み込ませて出てきた情報を本人が確認というのがありました。一瞬で顔写真と氏名・生年月日が出てきましたが、渡航履歴だとか航空券の入手方だとか、表示されない情報もたくさんある(これから記録される)に違いない。アメリカではカメラで捕らえた顔と写真を自動で照合するシステムが実験段階というし。

そういえば、再交付申請なので有効期間は前のやつを引き継ぐのかと思ったら、今回のパスポートの受け取り可能日からになってしまうのね。前パスポートの有効期限は来月だったので、ちょっと損した気分^^; 新規と再申請で違うのは住民票の提出の要否(新規は必要)だけだし、無理に継続申請する必要ないな・・・

— posted by mu at 07:46 pm   commentComment [0]  pingTrackBack [0]

Visual Studio.NETサービスのデバッグ

今度はVB.NETでWindowsサービスプログラムを作ろうとしていたりします。サービスとなると通常プログラムよりも表示や入力が制限される(基本的にやらない)ので、Visual Studio.NETのデバッガが利用できるのはかなり助かります。

Visual Studio.NETではサービスの作り方も楽になっていて、プロジェクトの種類にWindow applicationやDLLと並んでWindows Serviceなんてのが用意されているので、これを選びます。特集:初めて作る.NET Windowsサービス(ITmedia)Link なんかを参考にして、自動的に生成されるSystem.ServiceProcess.ServiceBaseのサブクラスのメソッドをコーディングするだけ。(まともに使えるサービスとなるといろいろ書く必要がありますが)

blog20070718VSdotNETServiceLogin

デバッグは通常プログラムとはちょっと異なります。blog.C#Link なんかを参考にしてますが、
  1. まずexeをビルド
  2. installutilコマンドでサービスとして登録
    • installutil.exeが通常パスの通ってないところにあります。スタートメニュー内のVisual Studioのツールフォルダにあるコマンドプロンプトを使うと、パスが通ってます
    • 管理者権限である必要があります。私の開発ユーザーIDはVS Developer+制限ユーザなので、上のコマンドプロンプトをAdministratorとして起動してます。
    • サービスの起動をUserに設定してた場合(Visual Studioプロジェクトのどこかで設定可能、忘れた;;)、ユーザーIDとパスワードを問われます。Windowsに登録してあるユーザーでいいのですが、ドメインを含めた[ドメイン]¥[ユーザー]で指定しないと登録に失敗します。ローカルマシンなら、.¥[ユーザー]で指定可能。
  3. コントロールパネルのサービスで、登録したサービスを起動
    • これも管理者権限でサービスマネージャを起動する必要があります。全体を通して管理者でやったほうがはるかに楽^^;
  4. exeをビルドしたプロジェクトを開き、ツールのプロセスにアタッチで起動したサービスを選択
    • これもVisual Studioを管理者権限で起動しておかないと、アタッチ後サービスへのアクセスが拒否されて、実質的にデバッグできません。結局管理者権限でやれということでしょうか? Visual StudioインストールするとVS Developerなんてユーザーグループ作るくらいだから、なんか別の方法がありそうですが・・・

これでデバッグ開始。ブレークポイントを設定しておけばそこで止まってくれます。デバッガーを止めるとサービスも止まってしまうので、またコントロールパネルで開始する必要があります。

— posted by mu at 08:38 pm   commentComment [0]  pingTrackBack [0]

ラッピー着ぐるみが蛾に見える

blog20070714PSULappyWear

ネトゲ友達はPSUファミ通CUPLink の景品であるラッピーの着ぐるみ(写真左)が蛾に見えて嫌いらしい。確かに目が昆虫の複眼に、耳が触覚に近くもないですが、蛾に見えるとは意外だったし、言われても未だ見えない。

その彼が良しとするのが写真右。機械的な顔にボディーは水着、もしくは一切機械的なパーツを付けない曲線的なもの。しかもネタではなく本気で良いと思っているらしい。彼との美的感覚の差はかなり大きいw

— posted by mu at 09:01 am   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0144 sec.
prev
2007.7
next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31