樋口理事長様 おめでとうございます。

当社お客様の、福島信用金庫 樋口理事長様が平成29年秋の褒章「黄綬褒章」を受章されました。

樋口理事長様が長年、全身全霊をかけて信用金庫業界発展のためご尽力された賜物と存じます。
誠におめでとうございます。

「黄綬褒章」受章の記念品として、福島県の伝統的工芸品、しかも菊の御紋入りの「会津塗二ツ引タンス」を樋口理事長様より頂戴いたしました。

ojuhousyou

IT技術者たるもの、これくらいは暗記しておかねば・・・

IT戦士の方々皆さま、日々業務にお疲れ様です。

本日は、IT技術者であれば、恐らく皆さま暗記していると思われる事項を記事にさせていただきます。

その暗記物とは「10進数⇔2進数」「10進数⇔16進数」になります。

もちろん、10進数の10,000を16進数に暗記なんてのは無理ですよね。

私が申し上げたいの、10進数の「0~15」を対象にした暗記の話になります。つまり、16進数であれば「0~F」、2進数であれば「0~1111」の範囲となる4ビットで表現できる16個の数字のことです。この範囲の変換は即時に行えるように暗記しておいて損はありません。

実際、我々の業務で10進数の「0~15」を2進数や16進数に変換することや、その逆変換を行う場面は少なくありません。この変換作業に時間をかけられては作業の生産性に支障をきたしてしまいます。(諸兄方々から「当たり前でしょ!」という声が聞こえてきそうですが)

ところが、これが出来ないルーキーIT技術者も少なくないようです。

10進数の「0~15」を即座に2進数や16進数に変換できないIT技術者の方は、今すぐに下述の変換表を印刷し、暗記することをお勧めします。(自分のためですよ!)

 

<変換表>

henkanhyo

 

余談:

約30年前ですが、私が学生プログラマだったころ、ゲーム作りに夢中でした。

その際、ゲーム画面で動き回るキャラクタの絵を作る時に、下図のように16進数変換を行い、当時のコンピュータにキャラクタの絵を描画させていました。かなり、懐かしい思い出ですね。(苦笑)

hexchar

[補足]
キャラクタの色を塗りたいドットを「1(2進数)」、色を塗らないドットを「0(2進数)」で表現しています。

 

VB.NET開発者にクイズです! ちゃんと正解を出せますか?

VB.NETの開発者にクイズです。

是非とも、正解を出して下さい・・・ね。

出せなかった人は、VB.NETの基本から見直すことも必要かもしれませんよ。

 

それでは、クイズです。

先ずは下記のコードをお読みください。

Private Sub BTN_HUTU_Click(sender As Object, e As EventArgs) Handles BTN_FUTU.Click

  Dim l_SideA As Integer

  Dim l_SideB As Integer


  '■A側の変数に1000を代入
  l_SideA = 1000

  '■B側の変数にA側の値を代入
  l_SideB = l_SideA

  '■B側の変数の値を2000に変更
  l_SideB = 2000

  '■A側の変数の値を画面に表示
  MessageBox.Show("l_SideA側の値:" & l_SideA)

  '■B側の変数の値を画面に表示
  MessageBox.Show("l_SideB側の値:" & l_SideB)

End Sub

 

さて、このコードの最後に表示されるメッセージボックスに表示される値は何でしょうか?

なんて問題は、聞くまでもありませんね。

結果は、以下のように表示されます。

res_h_1

res_h_2

 

では、下記のコードの最後に表示される2つのメッセージボックスに表示される値は何でしょうか?

Private Sub BTN_OBJECT_Click(sender As Object, e As EventArgs) Handles BTN_OBJECT.Click

  Dim l_SideA As DataTable

  Dim l_SideA_AddRow As DataRow

  Dim l_SideB As DataRow


  '■A側のオブジェクト変数(DataTableの1行目)に1000を代入
  l_SideA = New DataTable
  l_SideA.Columns.Add("A", GetType(Integer))
  l_SideA_AddRow = l_SideA.NewRow
  l_SideA_AddRow("A") = 1000
  l_SideA.Rows.Add(l_SideA_AddRow)

  '■B側のオブジェクト変数にA型のオブジェクト変数を代入
  l_SideB = l_SideA.Rows(0)

  '■B側のオブジェクト変数の値を2000に変更 
  l_SideB.Item("A") = 2000

  '■A側のオブジェクト変数の値を画面に表示
  MessageBox.Show("l_SideA.Row(0)側の値:" & l_SideA.Rows(0).Item("A"))

  '■B側のオブジェクト変数の値を画面に表示
  MessageBox.Show("l_SideB側の値:" & l_SideB.Item("A"))

End Sub

 

正解を出して下さいよ~~。

(-_-)/~~~ピシー!ピシー!

【正解】はこちらになります。

res_o_1

res_o_2

 

皆さん、正しい正解をだせましたか?

もしかして「最初のメッセージボックス(l_SideA側)の値は、変更されないから初期設定のまま1000だよ。」なんて解答をした人いませんでしたか?

 

 

上記のコードのコメントを書き換えると以下のようになるわけです。

Private Sub BTN_OBJECT_Click(sender As Object, e As EventArgs) Handles BTN_OBJECT.Click

  Dim l_SideA As DataTable

  Dim l_SideA_AddRow As DataRow

  Dim l_SideB As DataRow


  '■A側のオブジェクト変数(DataTableの1行目)に1000を代入
  l_SideA = New DataTable
  l_SideA.Columns.Add("A", GetType(Integer))
  l_SideA_AddRow = l_SideA.NewRow
  l_SideA_AddRow("A") = 1000
  l_SideA.Rows.Add(l_SideA_AddRow)

  '■B側のオブジェクト変数にA型のオブジェクト変数のアドレスを代入
  l_SideB = l_SideA.Rows(0)

  '■B側のオブジェクト変数の値を2000に変更 → 同時にA側のオブジェクト変数も変更されてしまう。
  l_SideB.Item("A") = 2000

  '■A側の値を画面に表示 → B側の値に変更により、A側の値も変更されることを確認
  MessageBox.Show("l_SideA.Row(0)側の値:" & l_SideA.Rows(0).Item("A"))

  '■B側の値を画面に表示
  MessageBox.Show("l_SideB側の値:" & l_SideB.Item("A"))

End Sub

 

私見ですが、これはただのクイズで終わるような問題ではないと考えます。

VB.NETのビギナーであれば、まず間違いなく「最初のメッセージボックスの値は、1000だよ。」と解答してしまうのではないでしょうか?

無理もないかもしれません。コードを見る限りオブジェクト変数のl_SideA側を変更するような命令行を見つけることができませんから・・・

つまり、先輩プログラマが開発したソースコードをビギナープログラマーが誤って読み解いて、そのプログラムに対して誤ったメンテナンス作業を行ってしまう危険性がある考えます。

開発したシステムのライフサイクルとなる数年間(長ければ10年近く)の間、メンテナンス作業を行う度に、この問題記事のような誤った解釈によるコードが書かれることがないか心配してしまいます。

この問題記事の内容は、VB.NETを使用するすべてのプログラマーが認識し、かつ後輩プログラマに対して誤った解釈をしないように教育をしていく必要がある重要な事項と考えます。

 

もし、本記事のクイズに誤った解答を出してしまった方は、今後十分に注意して下さいね。

 

※本記事記載のVB.NETのソースコード(ソリューション一式)のダウンロードはこちらからどうぞ。

地元ネタ:船岡の「一目千本桜」を見てきました。

地元情報になります。

宮城県柴田郡大河原町の有名な観光名所になります。

先日、家族みんなで「白石川堤 一目千本桜」を見に行ってきました。

丁度、桜が良い感じで咲いており、それはそれは大変綺麗なものでした。
(^^♪

以下は、私からの「桜」のおすそ分けです。(苦笑)

(1)
白石川堤からの景色になります。この写真では、判りにくいかもしれませんが、白石川に沿ってず~っと桜が続いているんです。
hitome1

(2)
途中の桜をアップで撮影したものです。こんな満開状態の桜が沢山です。
hitome2

(3)
平成27年に完成した「しばた千桜橋」からの景色になります。先ほどの説明と重なりますが、白石川に沿ってこのとおりです。
hitome3

(4)
東北本線の線路沿いでもこのとおりです。電車に乗りながら鑑賞することができます。写真左の車との比較で感じてもらえると思いますが、桜の咲いている区間距離が長いです。
hitome4

(5)
こちらの写真右下の橋が、平成27年に完成した「しばた千桜橋」です。この橋からの景色は最高ですよ。
hitome5

 

皆様も機会があれば、是非「船岡駅」で下車されて鑑賞されてみては・・・

 

<余談>
桜を鑑賞する人が多すぎます。(私も含めて)
お花見弁当は売り切れ状態でした。ですが、その隣で売られていた「100円おにぎり」が、ボリュームもあり、味もよく、最高に美味かったです。

ちなみに、私は電車で行ったのですが、満員の満員の満員状態でした。

 

ExcelのVBAのFindメソッドで困ったエラーが発生!

ExcelのVBAでの話になります。

RangeオブジェクトのFindメソッドを使用し、指定された値を所持するセルの行位置を取得する処理を組み入れた業務APを開発される際の注意喚起になります。

実際の業務APの内容をお見せすることは出来ないため、デフォルメ化したサンプルAPで説明させていただきます。

※サンプルExcelファイルのダウンロードはこちらからどうぞ。

<サンプルAP仕様>
シート「Sheet1」上の表より、指定された値を所持するセルを探索しその行位置を結果としてメッセージ表示する。

先ずは、シート「Sheet1」の内容になります。
excel_01_00_data

 

そして、当初開発時のソースコード(VBAマクロ)

Sub 一見問題のないように見える書き方()

 Dim l_Row As Long   '探し物の行位置

 With Sheets("Sheet1")

  '■探索範囲に存在する"くじら"を探索
  l_Row = .Range("A:A").Find("くじら").Row

  MsgBox "探し物の行は[" & Format(l_Row, "#,##0") & "]です。"

 End With

End Sub

 

これを実行すると正常に処理されます。
excel_01_01_ok1

 

しかし、下記のソースコードのように探索値を変更してみたところ・・・

Sub 問題が発生します()

 Dim l_Row As Long   '探し物の行位置
 
 With Sheets("Sheet1")

  '■探索範囲に存在しない"ことり"を探索
  l_Row = .Range("A:A").Find("ことり").Row

  MsgBox "探し物の行は[" & Format(l_Row, "#,##0") & "]です。"

 End With

End Sub

 

Findメソッドの実行行で、このように結果がエラーとなります。
excel_01_02_ng1

しかも、withブロック変数の設定が原因とのこと・・・・

見てのとおりwithブロックの書き方に間違いは見られない。

しかし、エラーはwithブロック変数・・・これは困りました。

 

諸々の情報収集と検証をしたところ、原因は本当につまらないことでした。

Findメソッドで条件該当するセルを探索することが出来ないにも関わらず、Rowプロパティを要求したため「Rowプロパティを返したいけど対象のセルがありませんよ!」というエラーだったようです。

つまり、下記のソースコードのようにオブジェクトとメソッドとプロパティの3連続ピリオド結合を止めて、正しく途中経過を判定すれば良いだけだったのです。

Sub 皆様このように書きましょう()

 Dim l_Range As Range   '探し物の結果セル

 With Sheets("Sheet1")

  '■探索範囲に存在しない"ことり"を探索
  Set l_Range = .Range("A:A").Find("ことり")

  '■探索結果を判定する。
  If (Not l_Range Is Nothing) Then
   MsgBox "探し物の行は[" & Format(l_Range.Row, "#,##0") & "]です。"
  Else
   MsgBox "探し物はありませんでした。"
  End If

 End With

End Sub

 

その結果は、このとおり正常に表示されました。
excel_01_03_ok2

 

ExcelのVBAコードを記述する場合、このようにオブジェクト.メソッド.プロパティのように連続したピリオドで結合し、ソースコードの記述を楽したいと思う心情は私も理解します。

しかし、お客様へ納品する業務APとしてVBAコードを記述する際は、このような楽をすべきではありません

今回の記事では、Findメソッドを例として記載しましたが、Findメソッド以外の他のメソッドの場合も考え方は同じです。

 

今回は、このFindメソッドの原因を究明するために、本来なら出さなくてもよいあぶら汗を約1時間も出しながら苦戦することになりました。

「作れば良い」「動けば良い」ではダメなのです。

「保守しやすいか?」「エラーが発生した場合、原因究明しやすいか?」を念頭に置いて、プログラマ諸君にはVBAコードを書いていただきたいものです。

 

(検索キーワード)
オブジェクト変数または With ブロック変数が設定されていません。

幸福を求めてルノワール展へ・・

先日、宮城県美術館で開催されている「ルノワール展」に行ってきました。

runowal2_w

たまたま、愚息の用事で休日に仙台市内に出かけることになり、その待ち時間に「ルノワール展に行こう!」ということになった次第です。

私個人として、美術館へ絵画鑑賞に出かけることは、今回が生まれて初めてのことでした。

実際に、本物の絵を鑑賞し、改めて「本物の重み」というのか「本物の質」というのか、言葉で表せない感動を覚えた次第です。(すみません。稚拙な表現しかできなくて・・・でも、本当に感動しました)

ちなみに、お土産に買ってきてしまったルノワール作品で、自宅にプチ「ルノワール展」を作ってしまいました。(笑)

runowal1_w

中でも、私のお気に入りは「ムーラン・ド・ラ・ギャレット」という絵です。

runowal3_w

この写真は、はがきサイズのものですが、展示場で販売されていた特製レプリカ(約15万円)を買うか迷ったほどです。この作品は、ルノワールの代表作品かつ人気作品といわれているらしく、私もすっかり魅了されました。ちなみに、本作品は絵画史上において第2位の高額金額で落札されたとのことでした。 (私の自宅のこの絵は、パネル込みで500円未満ですが・・苦笑)

 

この、ルノワールですが「幸福の画家」と称されているようです。

ルノワールの作品はどれも「明るく、楽しく、幸福」といった印象を感じる心安らぐものばかりでした。

「人生は不快なものさ、だからこそ楽しい絵を描くのさ!」と言わんばかりに・・・・

ルノワールは、「【観る者を幸せにする絵】を描くいちばんの方法は、描く自分が幸せでいる必要がある」という考えを持ちながら絵を描き続けていたようです。

 

これを聞いて私見ではありますが、我々システムサービスを提供する業者も「【利用者を幸せにするシステム】を開発提供するいちばんの方法は、開発提供する我々が幸せでいる必要がある」という考えを持つべきと思いました。

 

お客様の幸せも大事ですが、サービス提供を行う我々の幸せも大事・・・そう、ルノワールに言われたようが気がした美術鑑賞でした。

 

巨大なリンゴが届きました!

先程巨大なリンゴが届きました!

先日、梨を贈ってくださった福島県のお客様からです。

fk_ringo

 

毎回ボリュームのある贈り物を頂き大変有り難く思います。

それにしてもここまで大きなリンゴを見ることもなかなかありません。
1つ食べるだけですぐにお腹がいっぱいになりそうですね。

リンゴは栄養価も高く健康に良いので、美味しくいただいて社員一同来年も健康に過ごしていきたいと思います。

素敵な贈り物をありがとうございました!

今年の忘年会から「30・10運動」を!

さて、12月に入りました。

嫌でも忘年会シーズンに突入です。(苦笑)

bounenkai_suit

少し前の日経新聞に掲載されていた記事になりますが、まさに忘年会に参加するに皆様にも実施していただきたく、ここに記載をさせていただきます。

日経新聞の掲載日:2016/09/23(金)

掲載記事の見出し:宴会 食べ残し減らそう

この記事では、食べられるのに廃棄されてしまう「食品ロス」の削減を呼びかける「30・10運動」という運動について記載されていました。

この「30・10運動」ですが、全国の自治体を中心に運動が広がっているとのことでした。

どんな運動かというと、「宴会の冒頭30分、宴会の終了間際の10分は食事に専念して、出来るだけ食べ物を残さない」ということでした。

国内の食品ロスの総計は年600万トン超に上るとされ、条例で住民に努力義務を課した自治体もあるそうです。

「お酌に回る前に席に着き、ゆっくりお召し上がりください」。埼玉県狭山市の職員様が開く会食では、乾杯後、司会がこう呼びかけ、食事を食べきるよう促すとのことでした。そして、終了前にも「そろそろ中締めですが、皆様もう一度席にお戻りください。料理が残っています。」と案内するそうです。

「食品ロス」をしているなんて、世界中の食べ物の入手に困っている人たちから見れば、これほど失礼なことは無いと思います。

皆様も、今年の忘年会から是非この運動に参加していきましょう!
( `ー´)ノ

 

もはや時代は、「酒は残しても食べ物は残すな!」なんでしょうね。

 

なぜ、ネアンデータル人は滅亡したのか? それは会話の・・・・

以前の投稿に記載しましたが、私はNHKスペシャルの「地球大進化 46億年 人への旅」の大ファンです。
実は、本作品の「DVDボックス」と「サウンドトラック」を揃えてしまいました。(苦笑)

今回は、そのDVD最終章(6枚目のDVD)に収められている「人類の進化」に関する内容を書かせていただきます。

その内容は、我々が学校で「地球最古の人類」として教えられる「ネアンデータル人」と「クロマニヨン人」のことになるのですが、最新の研究結果から「ネアンデータル人」は進化することなく絶滅していたことが分かったそうです。

genshijin_fight genshijin_kinomi

つまり、「ネアンデータル人」は我々人間の祖先ではないということになります。

なぜ「ネアンデータル人」が絶滅したのか?

その理由は、「ネアンデータル人」の発音能力にあったとのことでした。「ネアンデータル人」は体の構造上、現在の人類より気管が短かったようです。そのため、言語をうまく発声することが出来なかったそうです。それにより、「これから寒期がくる。もう、ここに食糧は無い。他に食糧のある場所に移動しよう」とか「あの辺り、もうじき獲物の群れが来る。協力して狩りをしよう」「備蓄食料は、ここに保管して皆で食べよう」という相談さえも、うまく行えなかったとのことでした。

それにより、寒期が来ることに気付けず凍死したり、獲物を確保できないことから餓死したりという状況になり、最終的に滅亡したとみられているようです。

つまり、会話によるコミュニケーションが出来なったことにより絶滅してしまったということです。

 

これは、原始時代の事柄ではありますが、現代人である我々もコミュニケーションをないがしろにすると絶滅してしまうかもしれません。(なんて・・・大げさかもしれませんが)

皆さん、スマホのSNSで、文字によるコミュニーケーションばっかりしてませんか?

生まれた時から持っている自分の口(発声機能)を使って、本来の人間らしいコミュニケーションを見直してみてはと思います。

えっ、私ですか?
毎日のように、口下手ではありますが、いろいろな方々とコミュニケーションをさせていただいておりますよ。(苦笑)

コミュニケーションも必要ですが、たまにはノミニケーション(飲みにケーション)も必要でしょうね。

河野太郎議員に大賛成!変なExcel使いは止めましょう!

※本記事は、2016年11月4日のYahooニュース記事に関する内容になります。

【参考】2016年11月4日のYahooニュース記事
データとして役立たない「神エクセル」問題に解決の兆し 河野太郎議員が文科省へ全廃を指示

この記事でいう、河野議員の全廃指示に私は大賛成です。

今に始まったことではないですが、Excelをワープロと勘違いしているパソコンユーザが多すぎます。
※もちろん、TPOによってはExcelで文書(見積書、請求書 など)を作成することが適切な場合もあります。

Excelで作成した文書は、他の人が2次利用することを全く考えていない思いやりのない文書だと私は思います。

特に、ニュース記事に記載されているような「エクセルのワークシートを方眼紙のように整え、記入項目を1セルに1文字ずつ入力させる形式になっています」なんて使い方は驚愕でした。

また、Webサイト上で「エクセルのワークシートを方眼紙のように使えば便利です」なんて記載する方々が少なくないことも理解できません。

私は、今回の河野議員の全廃指示に胸のすく思いを感じました。(拍手!)
sukkiri

 

皆さまは、いかが思われますか?

 

追伸:

上記のYahoo記事中にこんなことも書いてありました。(以下、引用です)

このようなファイルは一部で「神エクセル」もしくは「紙(への出力しか考えていない)エクセル」と呼ばれるとともに、批判の声も多数。2013年には、神エクセルが日本の生産性を落としているのではと議論を呼んでいました。

確かに・・・生産性は落ちますよね。