Archive for 3月, 2017

カレー生活

金曜日, 3月 31st, 2017

今月になってからカレーを食べてない。
そう、食べていないんだ。

理由はこれだっ!

見てわかる通り、しゅぷぅーんだね。
4つもある。

・・・

あっ、箱からださないと

これだっ

このこたちは東京支社の皆様に強制しご協力いただき、
ココイチのキャンペーンで、当てたものだ。
いやあ沢山食ったね。
abe-tの誕生日祝いにもみんなでカレーだったし。

外れはチャレンジ券になってて、
別のスプーンセットに応募できる。

そいから、レシートでもこれまた違うスプーンセットに・・・
もちろん、これらもすべて応募済みだ。

ということで2月はめちゃくちゃカレーを食べて、
ダイエットに徹底抗戦していたわけだ。

それにしても加齢のせいか、カレー一杯でおなかいっぱい。
ぎゃははは、おやじぃ!

・・・はぁ、年とったな。

そんでカレーに飽きっげふげふっ
ダイエットをするために、
泣く泣くカレーをあきらめてる状態が今なのだ。

3月はカレー食べなかったな。
4月もそんなに食べないかな。
スプーンセット届かないかな。
また来年あったらチャレンジするかな。
そん時は40だぜ。

じゃな

非同期処理について

木曜日, 3月 30th, 2017

 こんにちは、naoyaです。

 毎月一回のプログラミング学習記事の投稿になります。

 第6回(最終回)は、「非同期処理」について、調べたことをまと
めていこうと思います。

・マルチスレッド
  スレッドとは、一連の処理の流れのことを言う。処理の流れが
 一本道なものをシングルスレッド、複数の処理を並行して行うも
 のをマルチスレッドという。
  何か非常に時間のかかる処理があるとすると、処理を行ってい
 る間、計算に専念してもいいならシングルスレッドで問題ないが、
 計算中に他の入力を受け付けたい場合がある。アクションゲーム
 などでは、キャラクターの動きの計算をしている間、ユーザーか
 らの入力を受け付けないようでは、アクションゲームとして成り
 立たない。このような場合、ユーザーからの入力を受け付けるス
 レッドと計算を行うスレッドを並行して動かす。
  要するに、重たい処理を行っている間でもプログラム全体がフ
 リーズしてしまわないようにするために、複数の処理を並行して
 行うのが、マルチスレッドプログラミング。
 
 ・C#におけるマルチスレッドプログラミング
   多くの場合、C#ではスレッドを直接作ることはほとんどない。
   スレッドの新規作成やスレッド間の処理の切替は、結構重た
  い処理で、最小限に抑えたい。そこで、実際にはスレッドを直
  接使うのではなく、一度作ったスレッドを使いまわす仕組み
  (スレッドプール)を使う。
  
・排他制御
  マルチスレッドプログラムでは、複数のスレッドが一つのデー
 タに対して操作することがある。何も考えず、ただ素直にプログ
 ラミングを行うと、意図しない結果になる場合がある。
  そのような問題を解決するために、排他制御というものが必要
 になってくる。排他制御とは、複数のスレッドが同時に一つの
 データを読み書きしないように制御することをいう。
 ・C#における排他制御
   スレッドの排他制御を行う為には、同期オブジェクトと排他
  ロックという概念を用いる。考え方としては、排他制御が必要
  になる部分に入る前に、あるオブジェクトに鍵をかける。鍵が
  かかっている間、他のスレッドは同じオブジェクトには鍵をか
  けることができず、鍵が外されるまで待たされる。そして、鍵
  をかけたスレッドが排他制御が必要な部分を抜けると、鍵を外
  す。
   鍵をかけるオブジェクトを「同期オブジェクト」、鍵をかけ
  る行為を「排他ロック」という。
  
・非同期処理の種類
  「非同期処理」といっても、いくつかタイプがあり、それぞれ
 書き方などが異なる。大まかにいうと、以下の用途がある。
  ・バックグラウンド処理:負荷の高い計算や、I/O待ちなどで、
  CPUやスレッド資源を保持し続けないために、別スレッドで計
  算やI/O待ちを行う。
  ・並列計算:マルチコアCPUの性能を最大限引き出すために、
  同じ計算を複数のコアで同時に実行する。
   ・データ並列:同じ処理を異なるデータに対して行う。
   ・タスク並列:異なる処理が独立して動いていて、その間に
   非同期でデータのやり取りを行う。
 ・バックグラウンド処理
   負荷の高い計算やI/O待ちをする場合、メインスレッドとは
  別のスレッドを使いたい場合がある。例えば、GUIアプリの場
  合、メインスレッドで時間のかかる処理を行うと、アプリがフ
  リーズしてしまい、ユーザーに与える印象が非常に悪くなって
  しまう。メインスレッド以外で行う処理の事を、バックグラウ
  ンド処理という。
   バックグラウンド処理では、バックグラウンドで行った処理
  の結果の値を受け取って、メインスレッドで処理を行いたい場
  合が多い。
  ・利点
    GUIの応答性向上:時間のかかる処理を行っている間、UIス
   レッド(GUIにおける、エンドユーザーからの入力を受け付け
   るためのスレッド)をブロックせず、フリーズを回避できる。
    スレッド資源の節約:I/O待ちにしている間、スレッドを解
   放することによって、メモリ(スレッド用のスタック等)やCP
   U(コンテキストスイッチ等)の負担を減らせる。
 ・データ並列
   並列処理も、非同期処理の一種になる。並列処理を行いたい
  動機は、マルチコアCPUの性能を最大限に引き出すこと。その
  一番シンプルな方法は、同じ処理を、異なるデータに、複数の
  コアで同時に実行すること。このような並列処理を、データ並
  列と呼ぶ。
 ・タスク並列(非同期データフロー)
   並列処理を行うもう一つの方法としては、異なる処理(タス
  ク)を独立して動かして、その間で、非同期でデータのやり取
  りを行う方法がある。異なるタスクを並列に動かすという意味
  では、タスク並列。非同期でデータをやり取りするという意味
  では、非同期データフローと呼ばれる。
  
  
 今回マルチスレッドについて学ぶよりも前に、一度開発でマルチ
スレッドを扱う機会があり、学びなおすにあたって、その時にやっ
ていた事を思い出しながら学ぶことができました。「この失敗は前
の時やってたな」とか思う部分もあり、そういった部分を今回学び
なおせたので、次回マルチスレッドを使う機会があれば、こういっ
た失敗をしないように、気を付けていこうと思います。

 今回で一応最終回となりますが、勉強は続けるので、もしかした
らどこかのタイミングで何か書くかもしれません。その時はまた、
アドバイスなどをよろしくお願いします。

参考URL:
http://ufcpp.net/study/csharp/

「大分IT人材塾」の卒塾式に参加してきました。

木曜日, 3月 9th, 2017

abe-tです。
先日「大分IT人材塾」の卒塾式に参加してきました。

そもそも「大分IT人材塾」とは何かという事ですが、
大分県に住んでいる人IoTに興味がある人が集まって、
講義やグループワークを通して、IoTの知識を深めていこうという学習会でした。

プログラムとしては以下の全9回で、月1ペースぐらいで行われました。
第1回 オリエンテーション 
    研修グループワーク 
第2回 セミナー「未来を可視化できるエンジニアへ! 〜市場からの期待〜」
第3回 グループワーク「会議を円滑に進めるためのファシリテーション(基礎)」
第4回 グループワーク「会議を円滑に進めるためのファシリテーション(実践)」
第5回 アイディアソン
第6回 ハッカソン
第7回 コンペティション
第8回 講義
第9回 セミナー「デジタルトランスフォーメーション時代のIT人材育成動向
         ~IT人材白書より~」
    卒塾式

この他に卒塾生との交流会や、ITビジネスモデル九州大会などにも参加しました。
これだけの講義がなんと無料で受講できました。
年齢も幅広く、高校生から70歳近い方まで、職業も意外にもITに関係ない方が多く、
様々な方が参加していました。

私が一番印象に残っているのは、第5~7回のアイデアソン、ハッカソンです。
第5回は、”IoT + 〇〇”で新しいビジネスモデルを考えるというものでした。
それまでに学習したファシリテーションの技術も取り入れ?グループ内で意見をまとめ、
当日に出場することを初めて聞いた、ITビジネスモデル九州大会出場用の資料
(提出期限が2日後)を作成する無茶ぶりもこなしました。

第6回の前に、ITビジネスモデル九州大会に参加しました。
準備期間が1か月ほどしかなく、IT関係の職種は簡単な画面の作成、
それ以外は収支計画の作成とチーム内で分担作業しました。
土日に集まり、色々と意見を交わしながら、一応プレゼンできる形まで作りあげました。
大会が平日だったこともあり、私以外誰もいける人がいなかったので、
私が熊本でプレゼンを行ってきました。
100人近い人の前でプレゼンする機会はそうそうないので、いい経験ができました。

第6回のハッカソンでは、ITビジネスモデル九州大会用に資料等々を作成していたので、
何かを作るというよりは、プレゼンテーション(主に寸劇)の準備をメインで行いました。

そして第7回でのコンペティションで、私の所属していたチームが見事
最優秀を取ることができました。
2か月間ぐらい準備等でなかなか忙しかったですが、
私自身、仕事以外でグループで1つのことに向かっていくことがなかったので、
とても充実した2か月だったように感じました。

この「大分IT人材塾」に参加して得た一番大きなものは、人との繋がりです。
年齢、職種に関係なく、多くの人と交流ができ、仕事に対する考え方などの
友達同士ではまず話さないだろう話題を、毎回のようにみんなで話していました。
こういった関係はなかなか築けるものではないと思うので、
今後も大切にしていきたいと考えています。

大分に居られる方は、無料なので是非「大分IT人材塾」に参加してみてください。

メモリとリソース管理

金曜日, 3月 3rd, 2017

 こんにちは、naoyaです。
 
 毎月一回のプログラム学習記事の投稿です。

 第五回は、「メモリとリソース管理」について、調べたことをまとめていこうと思います。
 
・.NET Frameworkでのメモリ管理
  C#をはじめとした.NET Framework上で動く言語は、メモリ管理
 を.NET Frameworkのガベージコレクションに任せることで、管理
 の手間を削減している。
  一般に、メモリの管理方法には「スタック」と「ヒープ」の2
 種類の方法がある。C#では、ローカル変数はすべて「スタック」
 上に置かれる。変数が「値型」の場合、値すべてがスタック上に
 置かれる。「参照型」の場合、値そのものはヒープ上に置かれ、
 そのヒープへの参照情報のみが、スタック上に置かれる。
 スタック
   データ領域を積み上げていくような形でメモリを管理する方
  法。最後に確保したデータ領域を最初に開放する。メモリの管
  理が簡単で非常に効率が良いが、あらかじめスコープが分かっ
  ているデータにたいしてしかりようできない。
 ヒープ
   任意サイズのデータ領域を任意の順で確保、解放していく方
  式。データを扱うスコープがはっきりしない(いろんな所から
  参照されている)場合や、実行時にしかサイズが確定しない場
  合、必要サイズがかなり大きい場合などに使う。
   スタックのような制限はないが、メモリ上のどこからどこま
  でを確保しているか、管理する必要がある。また、新たにデー
  タを確保したい場合、空き容量を探す手間がかかる。
   領域の確保と開放を繰り返すことで、使用中のヒープがメモ
  リ上に散在する状態(断片化)になる。こうなると、空き容量を
  探す手間が増え、データの参照の局所性が失われることで、
  キャッシュのヒット率が下がり、処理性能が低下する。
 ガベージコレクション
   ヒープを利用する時、用済みのデータ領域の解放を忘れて、
  メモリ上に「ごみ(いつまでたっても解放されない領域)」が
  残ってしまうことがある。このような問題を、「メモリ・リー
  ク」と呼ぶ。逆に、既に開放している領域を再度解放しようと
  する問題を二重解放と呼ぶ。
   プログラマが自前でメモリを解放しようとする場合、プログ
  ラムが複雑になるにつれ、メモリ・リークや二重解放の発見は
  難しくなる。プログラマの目的はヒープの管理ではないのに、
  そちらに時間を割くことになるのは良くない。
   ヒープの管理を自動化する手法の一つとして、ガベージコレ
  クションというものがある。ガベージコレクションは、定期的
  に「ごみ」になっている領域がないか調べて、見つけた「ご
  み」を解放して回る処理を行う。
 値型と参照型
   C#の型には大きく分けて2つのタイプがある。一つは「値
  型」で、もう一つは「参照型」と呼ばれる。
   ・値型…変数に直接値が格納される。
   ・参照型…変数は参照情報を持っていて、実体は別の場所に
       ある。
   値型は、代入時に値のコピーを受け取り、参照型は値の実態
  への参照情報を受けとる。このため、値型はコピー先の値に変
  更を加えてもコピー元には何も影響はないが、参照型の場合、
  コピー先の値を変えるとコピー元の値も変更される。
 値渡しと参照渡し
   プログラミング言語での値の受け渡し方法には、値渡しと参
  照渡しがある。C#では基本、値渡しになる。refやoutという
  キーワードを使うと、参照渡しを行うことができる。
   ・値渡し:メソッド内の値を変更しても呼び出し元には影響
        しない。
   ・参照渡し:メソッド内の値を書き換えると、呼出し元にも
         影響する。
   ・out:特別な参照渡し。戻り値以外にも値を返したいとき
      などに使う。
   出力引数
     参照渡しを使うと、メソッド内からメソッド外の値を書
    き換えることができる。複数の戻り値を返すのに有効であ
    るが、refを使う参照引数では、いくつか問題がある。
     ・呼出元で、特に意味のない値を初期化する必要がある。
       →メソッド内で必ず値を上書きするので、無駄。
     ・メソッド内で代入を忘れてもコンパイルエラーになら
      ない。
     そこで、戻り値として使いたい場合、outを使って、出
    力用の参照引数であることを明示する。outを使うと、
     ・メソッド呼出前に初期化する必要がない。
     ・メソッド内で必ず値を割り当てなければならない。
    となる。
 リソースの破棄
   ファイルや周辺機器などのリソースを使用する場合、まずリ
  ソースを使用する権利を取得し、操作を行った後、リソース使
  用権を破棄する必要がある。
   メモリは.NET Frameworkのガベージコレクションが自動的に
  管理してくれているが、ファイルはガベージコレクションの対
  象外で、明示的な破棄が必要である。
   リソースの破棄を怠ると、操作が正しく終了しなかったり、
  ほかのプログラムがそのリソースを使用できなくなったりする。
   ファイルを確実に閉じるためにはtry~catch~finallyまた
  はusingステートメントを使用する。
   try~finallyとusingは等価
   
   Resource R = new Resource;
   try
   {
     //処理
   }
   finally
   {
     R.Dispose();
   }
   ||
   using(Resource R = new Resource)
   {
     //処理
   }
  
  
 スタックやヒープ、ガベージコレクションについては、名前だけ
知っていましたが、メモリ管理等は特にしたことがないため、それ
ぞれが具体的にどんな役割をしているのかは知りませんでした。ま
た、値型と参照型についても、実際に値が保持される場所などは特
に気にしていなかったため、知りませんでした。今回、それらの意
味などを知ることができてよかったと思います。
 参照渡しやリソースの破棄については、開発で使うことが多いの
で、使い方や中身などは知っていました。とはいえ、リソースの破
棄については、ガベージコレクションの具体的な役割について知ら
なかったため、「なぜ毎回閉じなければいけないのか。」と思うこ
ともありました。今回、このリソースの破棄の意味を知ることがで
きて良かったです。

 次回(第六回・最終回)は、「非同期処理」について、調べていこ
うと思います(3月中に出したい…)。

参考URL:
http://ufcpp.net/study/csharp/