2009年4月26日日曜日

[雑記]黄色い新幹線

出張の帰り広島駅にて偶然見かけました。
この黄色い新幹線は『ドクターイエロー』とも呼ばれ、
偶然見かけるとその日は、いいことがあるそうです。

偶然見かけたのはこれで2回目です。

前回は通り過ぎるのを遠めでしか見れませんでしたが、
今回は回送電車だったので写真を撮る余裕がありました。
その分、いいことあるといいなぁ。。。

ドクターイエロー(その1)
ドクターイエロー(その1)
ドクターイエロー(その2)
ドクターイエロー(その2)

2009年4月20日月曜日

[雑記]Excelで『履歴』は予約語?


Microsoftの表計算ソフト『Excel』のトリビア的ネタです(笑)

『履歴』という名前でシートを作成しようとすると、
こんなエラーが出ます。
『履歴』は予約語?

『履歴』が予約語!?Σ(゚□゚;)

予約語は半角英数字が一般的だと思っていたので、
全角が予約語になるのは珍しいですね。

ひょっとして、Excelを英語から日本語に翻訳する際に、
予約語も一緒に翻訳しちゃったのかな?

試しに『history』でシートを作ろうとすると、

普通にシートが作れます。。。

特にエラーも無く普通に作れちゃいました。。。

『履歴』ってどんな予約語なんだろう。。。

2009年4月12日日曜日

[.NET]例外の再スロー(Throwの引数の有無)

[はじめに]
・.NET系言語(C#、VB.NET)のプログラムコードで、
 以下のような構文を見かけることがあります。
  Try 
    Dim x As Integer = func2(a) 
    Return x 
  Catch ex As Exception 
    '何らかの例外後の後処理をして、再スロー 
    '(例外後の処理は割愛)... 
    Throw ex    '←ここに注目 
  End Try
[VB.NET]例外の再スロー[Throwの引数がある場合]
 Tryステートメント内で発生した例外をCatchして、
 再度スローする処理で、「Throw ex」と書く人が結構多いようですが、
 実はこのような書き方をすると、
 ここでCatchする以前のトレース情報が失われてしまうのです。

 トレース情報を保持しつつ再スローするには、
 以下の様に、「Throw ex」ではなく「Throw 」と記述します。
  Try 
      Dim x As Integer = func2(a) 
      Return x 
  Catch ex As Exception 
      '何らかの例外後の後処理をして、再スロー 
      '(例外後の処理は割愛)... 
      Throw    '←exは省略します。 
  End Try 
[VB.NET]例外の再スロー[Throwの引数がない場合]

 なぜか書籍やMSDNにも、前者の書き方でサンプルを紹介している為、
 知らない人が多いようです。
 (Throwステートメントとは直接関係ないサンプルだから、
  あまり重要視していないのだと思いますが…)
[参考文献]
「C#クックブック 第3版」
 「レシピ4.1 キャッチした例外を再スローするタイミングを把握する」で、
 Throwステートメントの引数の有無の違いを明確に説明しています。
 「Throw」(引数なし)の記述を推奨しています。
「プログラミングC#―C#2.0/.NET2.0/Visual Studio2005対応」
 「11.4 例外の再スロー」で、
 理由の説明はないが、「Throw」(引数なし)の記述を推奨しています。
[検証]  Throwステートメントの仕様について、  2つのパターンの検証プログラムを実行して、結果を比較してみた。
パターン1
 Throwステートメントに引数がある場合、
 Button1_Click()→Method1()→Method2()→Method3()→Method4()と
 メソッドを呼び、最下層のMethod4()で
 ゼロ除算の例外(System.DevideByZeroException)を意図的に発生させる。
 各々のメソッドのCatch句では、「Throw ex」(引数あり)で例外を再Throwする。
 最上位メソッドにて、例外の内容(ToString()した結果)を表示する。
パターン2
 Throwステートメントに引数がない場合、
 Button1_Click()→Method1()→Method2()→Method3()→Method4()と
 メソッドを呼び、最下層のMethod4()で
 ゼロ除算の例外(System.DevideByZeroException)を意図的に発生させる。
 各々のメソッドのCatch句では、「Throw 」(引数なし)で例外を再Throwする。
 最上位メソッドにて、例外の内容(ToString()した結果)を表示する。
・パターン1(Throwステートメントに引数がある場合)
Private Sub Button1_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim num As Integer

    Try
        num = Method1(1, 0)
    Catch ex As Exception
        MessageBox.Show( _
            ex.ToString(), _
            "例外[Throwの引数がある場合]")
    End Try
End Sub

Private Function Method1( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        Return Method2(a, b)
    Catch ex As Exception
        Throw ex
    End Try
End Function

Private Function Method2( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        Return Method3(a, b)
    Catch ex As Exception
        Throw ex
    End Try
End Function

Private Function Method3( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        Return Method4(a, b)
    Catch ex As Exception
        Throw ex
    End Try
End Function

Private Function Method4( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        'b=0の時に例外が発生する。
        Return a \ b
    Catch ex As Exception
        Throw ex
    End Try
End Function
[VB.NET]例外[Throwの引数がある場合]
・パターン1の実行結果(Throwステートメント[引数あり])  Throwの引数を指定した場合は、  保持されているトレース情報は、Method1、Button1_Clickのみで、  Method2、Method3、Method4は保持されていないことがわかります。  引数指定での再スローでは、それより前のトレース情報を保持しない為です。  この例では、   Method3で再スローする時に、Method4以降のトレース情報を保持しない、   Method2で再スローする時に、Method3以降のトレース情報を保持しない、   Method1で再スローする時に、Method2以降のトレース情報を保持しない為、  図のような結果になります。 例外[Throwの引数がある場合] ・パターン2(Throwステートメント[引数なし])
Private Sub Button1_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim num As Integer

    Try
        num = Method1(1, 0)
    Catch ex As Exception
        MessageBox.Show( _
            ex.ToString(), _
            "例外[Throwの引数がない場合]")
    End Try
End Sub

Private Function Method1( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        Return Method2(a, b)
    Catch ex As Exception
        Throw
    End Try
End Function

Private Function Method2( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        Return Method3(a, b)
    Catch ex As Exception
        Throw
    End Try
End Function

Private Function Method3( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        Return Method4(a, b)
    Catch ex As Exception
        Throw
    End Try
End Function

Private Function Method4( _
    ByVal a As Integer, _
    ByVal b As IntegerAs Integer

    Try
        'b=0の時に例外が発生する。
        Return a \ b
    Catch ex As Exception
        Throw
    End Try
End Function
[VB.NET]例外[Throwの引数がない場合]
・パターン2の実行結果(Throwステートメント[引数なし])  Throwの引数を指定しない場合は、  関連するトレース情報(Method1、Method2、Method3、Method4、Button1_Click)を  全て保持していることがわかります。 例外[Throwの引数がない場合]

[VBA]ExcelVBAでオブジェクト指向の継承

[はじめに]
・ExcelのVBA(Visual Basic for Application)は、
 完全オブジェクト指向言語(JavaやC#等)ほどではないですが、
 オブジェクト指向によるプログラミングをサポートしています。
 『オブジェクト指向』と言えば、
 代表的な性質として以下の3つのキーワードがあります。
代表的な性質
継承
2つのクラス間で親子関係を持ち、子クラスが親クラスの性質を受け継ぐこと。
カプセル化
オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、
オブジェクトの実際の型を隠蔽したりすることをいう。
多態性(ポリモフィズム)
実行される処理の実体が、コールされたメッセージではなく、メッセージを受けたオブジェクトに
よって決定される性質。
また、この性質を使って、
「同一のメッセージを使って、オブジェクトごとに異なった処理を行わせること」
[VBAのオブジェクト指向]
 VBAのオブジェクト指向は、完全オブジェクト指向言語(JavaやC#等)のそれと比べると、
 『子クラスのメソッドを経由して親クラスの変数やメソッドにアクセスできない』、
 『子クラス内から親クラスの変数やメソッドにアクセスできない』等の制限事項がある。
[多態性(ポリモフィズム)]
 『多態性(ポリモフィズム)』の説明で、
 『動物』に『鳴く』メッセージを通知する例がよく挙げられる。
 以下に、『多態性(ポリモフィズム)』を利用したサンプルコードを示す。
[クラス図]
クラス図
[クラスの説明]
Mammalクラス
 哺乳類を表すクラス。
 メソッドとして、Cry()を実装。
Dogクラス、Catクラス、Crowクラス
 イヌ、ネコ、カラスを表すクラス。各々のクラスはMammal(哺乳類)クラスを継承。
 メソッドとして、Mammal_Cry()を実装。
 ([親クラス名]_[親クラスのメソッド名]で、親クラスのメソッドをオーバーライドできます。)
[多態性(ポリモフィズム)]
・Dogオブジェクト、Catオブジェクト、Crowオブジェクトを
 Mammalオブジェクトの配列に格納する。
 MammalオブジェクトのCrowメソッドを経由して、
 Dogオブジェクト、Catオブジェクト、CrowオブジェクトのCrowメソッドを呼ぶ。
 以下のサンプルでは、3つのMammalオブジェクトのCryメソッドを呼んでいるが、
 実際に実行されるのは、Dog、Cat、CrowのMammal_Cryメソッドであることを示している。
 同一のCryというメッセージをMammalオブジェクトに通知しているが、
 受け取った各々のオブジェクト毎に異なった動作をしていることになる。(多態性(ポリモフィズム))
[サンプルコード]
Option Explicit
'[クラス名] Mammalクラス
'[説明] 哺乳類を表すクラス
'       Dog(イヌ)、Cat(ネコ)、Crow(カラス)の
'       親クラスとして利用

'[メソッド名]
'   Cry
'[機能]
'   動物の鳴き声を取得します。
'[前提条件]
'   子クラスでオーバーライドして下さい。
Function Cry() As String
    Err.Raise _
        999, , _
        "このクラスのメソッドは直接呼ぶことはできません。" & vbCrLf & _
        "子クラスでオーバーライドして呼んで下さい。" 
End Function
[ExcelVBA]Mammalクラス


Option Explicit
'[クラス名] Dogクラス
'[説明] イヌを表すクラス

'Mammalクラスを実装
Implements Mammal

'[メソッド名]
'   Mammal_Cry
'[機能]
'   動物の鳴き声を取得します。
'[備考]
'   メソッド名は、「親クラス名」_「メソッド名」
Public Function Mammal_Cry() As String
    Mammal_Cry = "ワンワン"
End Function
[ExcelVBA]Dogクラス


Option Explicit
'[クラス名] Catクラス
'[説明] ネコを表すクラス

'Mammalクラスを実装
Implements Mammal

'[メソッド名]
'   Mammal_Cry
'[機能]
'   動物の鳴き声を取得します。
'[備考]
'   メソッド名は、「親クラス名」_「メソッド名」
Public Function Mammal_Cry() As String
    Mammal_Cry = "ニャー"
End Function
[ExcelVBA]Catクラス


Option Explicit
'[クラス名] Crowクラス
'[説明] カラスを表すクラス

'Mammalクラスを実装
Implements Mammal

'[メソッド名]
'   Mammal_Cry
'[機能]
'   動物の鳴き声を取得します。
'[備考]
'   メソッド名は、「親クラス名」_「メソッド名」
Public Function Mammal_Cry() As String
    Mammal_Cry = "カァーカァー"
End Function
[ExcelVBA]Crowクラス


Private Sub CommandButton1_Click()

    '哺乳類のオブジェクト変数を宣言
    '要素数3つの配列を用意
    Dim man(2) As Mammal
    
    'イヌ、ネコ、カラスの
    'オブジェクトを生成
    Set man(0) = New Dog
    Set man(1) = New Cat
    Set man(2) = New Crow
    
    '各々の動物の鳴き声を表示
    MsgBox man(0).Cry()
    MsgBox man(1).Cry()
    MsgBox man(2).Cry()

    'オブジェクトを解放
    Set man(0) = Nothing
    Set man(1) = Nothing
    Set man(2) = Nothing

End Sub
[ExcelVBA]呼び出し元


[実行結果]
多態性(ポリモフィズム)の実行結果

[雑記]ドローン(DJI Mini 3)

(1)雑記 もともと多趣味の友人 masakazu Drone 氏が、 最近、 ドローン にハマり始めて、 更に、新たな趣味が増えたとのこと。 ドローン を始めてから、 まだ1年も経っていないとのことですが、 旅行先で山や川の景色を 空撮 して、 Youtube ...