16 Sep 2014, 12:40

Windows8 で Loopback Adapter を利用するためのメモ

はじめに

仕事では, windows 環境でネットワークの開発をしている.

開発用には ローカルホストがあると便利だけれども, Windows では Linux のように簡単にはローカルホストを利用できなかった.

LoopBack Adapter というものを利用するとよいことを知ったので, 導入手順をメモします.

WireShark で LoopBack Adapter をみる方法もメモします.

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Windows8
    </li>
  </ul>
</div>

Loopback Adapter とは

Loopback とは

<div class="outline-text-3" id="text-2-1">
  <p>
    ip アドレスは必ずしもリモートホストと関連付けられている必要はない. 得に開発環境では, ローカルな IP アドレスが役に立つ.
  </p>

  <p>
    自端末に対して通信することを LoopBack という. LoopBack で指定するアドレスを Loopback Address という.
  </p>

  <ul class="org-ul">
    <li>
      ハードウェアと関係ない, 論理的なインタフェース.
    </li>
    <li>
      Linux では, localhost と言われている. IP は 127.0.0.1
    </li>
  </ul>

  <p>
    <a href="http://e-words.jp/w/E383ABE383BCE38397E38390E38383E382AF.html">ループバックとは 〔 ローカルループバック 〕</a>
  </p>
</div>

Windows LoopBack Adapter とは

<div class="outline-text-3" id="text-2-2">
  <p>
    Windows で Loopback Address を利用するためのアダプター. Microsoft から無料で提供されている.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://support.microsoft.com/kb/236869/ja">Microsoft Loopback Adapter をインストールする方法</a>
    </li>
  </ul>
</div>

Loopback Adapter をインストールする

以下のページに画像付きの手順があるので参考にした.

Windows7 とほぼ手順はおなじだけれども, インストールする際の名称が Microsoft KM-TEST Loopback Adapter だった.

Loopback Adapter を設定する

以下のページに画像付きの手順があるので参考にした.

IP はとりあえず以下を利用.

  • ip: 10.0.0.2
  • subnet: 255.255.255.0
  • gateway: 10.0.0.1
  • DNS: 127.0.0.1

WireShark でパケットキャプチャーする

WireShark Wiki ページによると, 3 つの方法があるようだ.

  • route add
  • Proxocket
  • RawCap

CaptureSetup/Loopback – The Wireshark Wiki

結論としては, RawCap がうまくいった.

ローカルマシンに route add する方法

<div class="outline-text-3" id="text-5-1">
  <p>
    Add a route to your local machine going through the network gateway
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> route add <your_IP> mask 255.255.255.255 <the_gateway> metric 1<br /> [/sourcecode]
  </p>

  <p>
    自分の環境で頑張ってみたのだが, どうも動かなかった. Gateway の設定が違う気がするが&#x2026;
  </p>

  <p>
    以下の記事によると, Loopback Adapter より先に WireShark を インストールしていた場合は, WireShark の再インストールが必要?
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://stackoverflow.com/questions/5847168/wireshark-localhost-traffic-capture">Wireshark localhost traffic capture &#8211; Stack Overflow</a>
    </li>
  </ul>
</div>

Proxocket をつかう方法

<div class="outline-text-3" id="text-5-2">
  <p>
    Proxocket という dll を キャプチャしたいアプリと同じフォルダにいれて おくと, パケットキャプチャできるらしい. これは自分は未検証.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.netresec.com/archives/age=Blog&#038;month=2011-01&#038;post=Proxocket---A-Winsock-Proxy-Sniffer">Proxocket &#8211; A Winsock Proxy Sniffer &#8211; NETRESEC Blog</a>
    </li>
  </ul>
</div>

RawCap

<div class="outline-text-3" id="text-5-3">
  <p>
    唯一うまくいった方法.RawCap というツールを使う.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.netresec.com/archives/age=RawCap">RawCap &#8211; A raw socket sniffer for Windows</a>
    </li>
  </ul>

  <p>
    使い方は簡単. ダブルクリックで起動して, キャプチャしたいインタフェースを選択するだけ.
  </p>

  <p>
    キャプチャを終了するときには, Ctrl+C で終了させる. pcap 形式のファイ ルが作成されるため, これを wireshark で開けばよい.
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-SnapCrab_NoName_2014-9-16_12-31-47_No-00.png" alt="SnapCrab_NoName_2014-9-16_12-31-47_No-00.png" />
    </p></p>
  </div>
</div>

14 Sep 2014, 05:02

Reactor Pattern について調べてみたまとめ

coursera で受けている, POSA の講義で出てきた Reactor Pattern について調べてみたまとめです.

Reactor Pattern とは

イベント駆動のためのデザインパターン.

[sourcecode language=”text” title=”” ]
The reactor design pattern is an event handling pattern
for handling service requests delivered concurrently
to a service handler by one or more inputs.
[/sourcecode]

特徴

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      イベント (入力データ) を, 処理や状態を表すハンドラ (メソッド or サブクラス) にディスパッチ (結びつける) する.
    </li>
    <li>
      ハンドラごとに責務を分割できるので OOP 向き.
    </li>
    <li>
      ハンドラ以外の部分はフレームワークに隠蔽されていることがおおい.
    </li>
  </ul>

  <p>
    EventMachine は Reactor パターンの高性能な実装さ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://keijinsonyaban.blogspot.jp/2010/12/eventmachine.html">見えないチカラ: 【翻訳】 EventMachine 入門</a>
    </li>
  </ul>

  <p>
    Android は状態ごとにハンドラが呼び出される.
  </p>

  <ul class="org-ul">
    <li>
      onCreate ()
    </li>
    <li>
      onResume ()
    </li>
    <li>
      onDestory ()
    </li>
  </ul>

  <p>
    Spring Framework では, GET や POST の HTTP request は, それぞれ対応するメソッドにコールバックされる.
  </p>
</div>

Structure

<div class="outline-text-3" id="text-1-2">
  <ul class="org-ul">
    <li>
      Resources: 入力データ
    </li>
    <li>
      Synchronous Event Demultiplexer:入力データを拾うためのイベントループ. シングルスレッドで loop していることが特徴 (Synchronous).
    </li>
    <li>
      Dispatcher: ハンドラを管理する. Demultiplexer から通知を受けたら, Resource を Handler に Dispatch する (select など)
    </li>
    <li>
      Handler: Resource に関連付けられた処理.
    </li>
  </ul>
</div>

Socket Programming における Reactor Pattern

Socket Programming ででてくる Reactor は, 狭義の Reactor Pattern のようだ.

特徴

<div class="outline-text-3" id="text-2-1">
  <ul class="org-ul">
    <li>
      すべての処理をシングルスレッドで実施する.
    </li>
    <li>
      マルチスレッドを利用しなくても, 非同期処理がかける.
    </li>
    <li>
      スレッドやプロセス数の制限なしに, クライアントからの要求に答えることができる.
    </li>
  </ul>
</div>

実装方法

<div class="outline-text-3" id="text-2-2">
  <ul class="org-ul">
    <li>
      ソケットを select で監視する. 読み取り可能, 書き込み可能なソケットのみに対して処理を実施する.
    </li>
    <li>
      遅い回線があるときに, その回線に引きずられて Reactor が他の処理をできない. すべての処理が Blocking される.そんなときは, non-blocking write を利用する.
    </li>
  </ul>
</div>

sample

<div class="outline-text-3" id="text-2-3">
  <p>
    以下のリンクのサンプルをそのまま写経しました.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://gihyo.jp/dev/serial/01/ruby/0030archives/age=1">第 29 回 Reactor で非同期処理をやってみよう (1):Ruby Freaks Lounge|gihyo.jp … 技術評論社</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> write_socks = hosts.map do |host|<br /> TCPSocket.new (host, 80)<br /> end<br /> read_socks = []
  </p>

  <p>
    # handler<br /> write_proc = lambda{|sock|<br /> sock.write (request)<br /> }
  </p>

  <p>
    # handler<br /> read_proc = lambda{|sock|<br /> sock.read<br /> sock.close<br /> }
  </p>

  <p>
    # Reactor<br /> until (write_socks + read_socks).empty?
  </p>

  <p>
    # Demultiplexer<br /> r_socks, w_socks, e_socks = IO.select (read_socks, write_socks)
  </p>

  <p>
    # Dispatcher<br /> if ws = w_socks.first<br /> write_proc.call (ws)<br /> read_socks << ws write_socks.delete (ws) end # Dispatcher if rs = r_socks.first read_proc.call (rs) read_socks.delete (rs) end end [/sourcecode] 

    <p>
      Working With TCP Socket における Reactor Pattern.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/2572">TCP/IP ソケットプログラミングの基礎を集中学習! Working with TCP sockets を読んでる | Futurismo</a>
      </li>
      <li>
        gist: <a href="https://gist.github.com/tsu-nera/0a0930175a3f23641848">https://gist.github.com/tsu-nera/0a0930175a3f23641848</a>
      </li>
    </ul></div> </div> </div>

13 Sep 2014, 12:32

Wrapper Facade Pattern について調べてみたまとめ

coursera で受けている, POSA の講義で出てきた Wrapper Facade Pattern について調べてみたまとめです.

Wrapper Facade とは

ソケットなどの OS に依存するような native methods に対してラッパーライブラリを作成すること.

[sourcecode language=”text” title=”” ]
encapsulate low-level functions and data
structures with object-oriented (OO) class interfaces.
[/sourcecode]

メリット

以下のメリットがある.

  • Non-OOP 言語が OOP で利用できたり (Type-safe I/F)
  • OS 依存がなくなったり, (Portable)
  • コンパイル時にエラーをチェックする機能を作り込んだりして, API error-prone (誤りがちな) を防ぐ.

Facade や Bridge と異なり, 薄く, Light weight な実装でオーバヘッドがないことが特徴.

coursera の posa 講義で出てきたパターン. Doug 氏 の論文.

Ruby のソケットライブラリの例

Ruby の Socket Library がよい例. bind や listen を TCPServer メソッドで隠している. 言語レベルでサポートされていることが多い?

[sourcecode language=”ruby” title=”” ]
server = TCPServer.new (4481)

# =>
server = Socket.new (:INET, :STREAM)
addr = Socket.pack_sockaddr_in (4481, “0.0.0.0”)
server.bind (addr)
server.listen (5)
[/sourcecode]

31 Aug 2014, 15:42

OpenStack をとりあえず動かしてみたい! vagrant で OpenStack を初体験したメモ

はじめに

最近とみに OpenStack という単語をきくようになった.

OpenStack がなんなのか知らないと, 何だか日本人なのに納豆がきらいといって白々しい目で見られるような, 子供にそのうち石をなげられるような惨めさを感じる.

というわけで, OpenStack について調べ, さらにはインストールしてみる.

OpenStack とは

まずは, OpenStack とはなにか, しらべてみた.

OpenStack の特徴

<div class="outline-text-3" id="text-2-1">
  <ul class="org-ul">
    <li>
      オープンソースで構成されるクラウド・インフラストラクチャー.
    </li>
    <li>
      クラウドに・インフラに関わるすべてのことが, 共通化されて自動化される.
    </li>
    <li>
      バイナリの API ではなく Web API で呼び出せるため, それぞれは独立性が担保され, 柔軟で開発しやすく使いやすい.
    </li>
    <li>
      Apache ライセンスを採用.
    </li>
    <li>
      IBM や HP など, 大企業が開発を牽引している.
    </li>
    <li>
      AWS クラウド コンピューティングに対するロックイン回避
    </li>
  </ul>
</div>

<div id="outline-container-sec-2-1-1" class="outline-4">
  <h4 id="sec-2-1-1">
    20 年前の Linux のような存在
  </h4>

  <div class="outline-text-4" id="text-2-1-1">
    <p>
      Linux は OpenStack のように, オープンソースであることによって, 早い成長を遂げている.しかし, Linux とおなじではない.
    </p>

    <ul class="org-ul">
      <li>
        草の根 vs 大企業: Linux はコミュニティが作り, その後ベンダーに採用されたテクノロジ.
      </li>
    </ul>

    <p>
      OpenStack は商業的なプロジェクトで, その後コミュニティに公開されたもの.
    </p>

    <p>
      <a href="https://jp.linux.com/news/linuxcom-exclusive/406215-lco201307029">リアリティ チェック: Openstack は第二の Linux ではない</a>
    </p>
  </div>
</div>

<div id="outline-container-sec-2-1-2" class="outline-4">
  <h4 id="sec-2-1-2">
    参考
  </h4>

  <div class="outline-text-4" id="text-2-1-2">
    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/OpenStack">OpenStack &#8211; Wikipedia</a>
      </li>
      <li>
        <a href="http://www.atmarkit.co.jp/ait/articles/1406/10/news039.html">NEC の柴田氏に聞く:OpenStack はなぜこれまで成功してきたのか &#8211; @ IT</a>
      </li>
      <li>
        <a href="http://itpro.nikkeibp.co.jp/article/Keyword/20121029/433321/">Network キーワード &#8211; OpenStack とは:ITpro</a>
      </li>
      <li>
        <a href="http://cloud.watch.impress.co.jp/docs/column/cloud/20140404_642748.html">【クラウド特捜部】プレーヤーがそろい表舞台に立つ OpenStack &#8211; クラウド Watch</a>
      </li>
    </ul>
  </div>
</div>

OpenStack のアーキテクチャ

<div class="outline-text-3" id="text-2-2">
  複数のサービスコンポーネントが Web ベースの RestAPI でつながっている. 詳細は, 別ページ参照.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://thinkit.co.jp/story/2014/06/10/4999">OpenStack のアーキテクチャを理解しよう | Think IT (シンクイット)</a>
    </li>
    <li>
      <a href="http://docs.openstack.org/ja/trunk/install-guide/install/apt-debian/content/ch_overview.html">第 1 章 アーキテクチャー &#8211; OpenStack インストールガイド Debian 7.0 (Wheezy) 版 &#8211; juno</a>
    </li>
  </ul>
</div>

OpenStack のインストール方法

OpenStack のインストール方法はいろいろあるようだ.

公式ページのインストール方法.

DevStack

<div class="outline-text-3" id="text-3-1">
  簡単にインストールするためには, DevStack というものが有名なようだ.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://devstack.org/">DevStack &#8211; Deploying OpenStack for Developers</a>
    </li>
    <li>
      <a href="http://www.ospn.jp/press/20120828no27-useit-oss.html"> 「オープンソース」を使ってみよう (第 23 回 DevStack でラクラク導入!</a>
    </li>
    <li>
      <a href="http://momijiame.tumblr.com/post/80665373356/vagrant-devstack-openstack">Vagrant と DevStack で OpenStack をサクッと試す | CUBE SUGAR STORAGE</a>
    </li>
    <li>
      <a href="https://github.com/openstack-dev/devstack.git">https://github.com/openstack-dev/devstack.git</a>
    </li>
  </ul>
</div>

RDO

<div class="outline-text-3" id="text-3-2">
  Linux ディストリビューションを VM 上に入れるという方法もある. RedHat が出している RDO というツールもある.</p> 

  <ul class="org-ul">
    <li>
      <a href="https://openstack.redhat.com/Main_Page">RDO</a>
    </li>
    <li>
      <a href="http://momijiame.tumblr.com/post/80582413671/vagrant-rdo-openstack">Vagrant と RDO で OpenStack をサクッと試す | CUBE SUGAR STORAGE</a>
    </li>
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/1311/06/news004_2.html">Havana 登場! 何が変わった?/DevStack で Havana を試すには? (2/3) &#8211; @ IT</a>
    </li>
  </ul>
</div>

VMware Integrated OpenStack

<div class="outline-text-3" id="text-3-3">
  VMware も ディストリを出す予定らしい.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://www.vmware.com/products/openstack">VMware Integrated OpenStack (Beta) | United States</a>
    </li>
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/1408/26/news127.html">「 OpenStack の本質は API 」:OpenStack ディストリビューションを発表, ヴイエムウェアは何を考えているか &#8211; @ IT</a>
    </li>
  </ul>
</div>

docker

<div class="outline-text-3" id="text-3-4">
  docker のなかに devstack がはいっているという ちなみに, 自分の環境ではインストールできなかった.</p> 

  <ul class="org-ul">
    <li>
      <a href="https://registry.hub.docker.com/u/ewindisch/dockenstack/">https://registry.hub.docker.com/u/ewindisch/dockenstack/</a>
    </li>
    <li>
      <a href="https://github.com/ewindisch/dockenstack">https://github.com/ewindisch/dockenstack</a>
    </li>
  </ul>
</div>

vagrant-openstack にきめた

いろいろ試してみた (正確に表現すると, 失敗してみた) 結果, vagrant をつかうことにした.

vagrant ってなにってひとは, 過去記事を参照のこと.

environment

<div class="outline-text-3" id="text-4-1">
  <ul class="org-ul">
    <li>
      archlinux
    </li>
    <li>
      vagrant 1.6.3
    </li>
    <li>
      virtualBox 4.3
    </li>
  </ul>
</div>

手順

<div class="outline-text-3" id="text-4-2">
  <p>
    以下の記事から vagrant box があることを知ったので, それを利用する.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://qiita.com/takuan_osho/items/7f571fb35d282251e5e7">OpenStack 初心者でも Vagrant を使って OpenStack を体験する方法 &#8211; Qiita</a>
    </li>
    <li>
      <a href="https://github.com/TelekomLabs/vagrant-devstack">TelekomLabs/vagrant-devstack</a>
    </li>
  </ul>

  <p>
    github の README にしたがえば, vagrant up して, お茶を飲めと書いてある. 茶どころか, 回線速度が貧弱なので 1 時間くらいかかって, 喫茶店が閉店時間になって追い出されたのだが・・・ (_&#8217;Д`)
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> git clone https://github.com/TelekomLabs/vagrant-devstack.git<br /> cd vagrant-devstack<br /> vagrant up<br /> [/sourcecode]
  </p>

  <p>
    <a href="http://192.168.50.10/">http://192.168.50.10/</a> にアクセスして, user: admin/ password: devstack でログイン.
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-2014-09-01-003629_632x482_scrot.png" alt="2014-09-01-003629_632x482_scrot.png" />
    </p></p>
  </div>
</div>

OpenStack で開発する

以下はブックマーク.

github リポジトリは以下.

開発に参加するための手引きがまとまっている.

開発やバグ管理は launchpad で実施されているようだ.

開発のための API や SDK とそのドキュメント.

29 Aug 2014, 13:24

他人のコードに INCEPTION する!coursera で The Hardware/Software Interface を受けた

coursera で The Hardware/Software Interface を受けた感想です.

目的

組込みソフトの知識を身につけるため

私はいちおう組込みエンジニアなのだが, 組込みソフトの知識がない.

すごく, そのことに危機感を感じている. 組込みソフトの知識は, 実際に業務で取り組まないと身につける機会が少ない.

しかし, 仕事ではいつまで待っていても新しいプロジェクトには移動できな い.仕事を通して知識を身につけようなんて思っていたら, 10 年経っても身 につかない気がする.

メモリ管理・プロセス管理・アセンブラ言語などなど, このあたりの知識がほしい.

アセンブラ言語の知識を身につけるため

この講座では, アセンブラ言語についても学ぶことができる.

職場でも, アセンブラ言語を利用しているという話はたまにきくので, 学んでいれば, 新しい業務にもつながることを期待.

感想

C 言語のことをなにもボクは知らなかった

一番感じたことは, 自分は C 言語のことについて理解したつもりになってい たが, それはまだまだ不十分だったということだ.

たとえば, この講義では, malloc, free の原理について解説される. そして, malloc, free を自分で実装するような課題が出される.

ヒープ領域, スタック領域がどういう役割していて, それぞれどういうようにプログラムでは利用されているか, 自分は理解していなかった. それなのに, C 言語なんて全部わかったよ! なんて思っていた自分が恥ずかしい.

まるでそれはインセプション!

課題がどれも難しく, 毎週 10 時間以上かかった. しかし, 今まで受けてきた MOOC の課題の中ではもっともおもしろかった.

そのなかでもとくにおもしろかったのは, バッファオーバーフローについての課題.

与えられたプログラムのセキュリティホールに対して バッファオーバーフローアタックを仕掛けて, まったく関係ない関数を実行したり, さらにはセキュリティホールから自分で書いたアセンブラコードを注入し て実行させたりする.

それはまるで, 映画”インセプション” のような興奮だ!

映画では, ディカプリオが他人の夢の中に侵入して,思い通りの記憶を埋め込む. そして私は, 他人のプログラムのなかに侵入して, 思い通りのコードを埋め込む.

ハッカーはこの快感をもとめて悪さをするのだろう.

内容

シラバスからそのまま引用.

Topics:
    Number representation
    Assembly language
    Basics of C
    Memory management
    Operating-system process model
    High-level machine architecture
    Memory hierarchy
    Implementation of high-level languages

Number representation

ビット演算について学ぶ.

まず, 驚いたことは, if や while のような制御文は ビット演算でかけてしまうということだ.

C 言語なんて楽勝でしょと思っていたら, しょっぱなから出鼻を折られるという..

また, コンピュータは 0 と 1 の世界で, プログラミング言語はそれを置き換 えたものに過ぎないという, 基本的なことを気づかされる.

Assembly language

x86-64 アセンブリ言語の文法を学ぶ. 意外にネットや書籍での情報が多く, 参考になった.

昔のテレビゲームは, アセンブラ言語でかかれていたときく. こんな世界でガリガリコーディングをするなんて, すごいな.

Memory management

メモリがどのように利用されているかのお話.

プログラムがどうやって動いているのかをアセンブラレベルで理解して, 今までなにもわかっていなかったんだと自覚. とともに, 仕組みが分かって感動.

2^n-1
|---------------------|
| Stacks              | ローカル変数, プロシージャの内容
|                     |
| Dynamic Data (Heap) | new や malloc で獲得できる領域
| Static Data         | グローバル変数など.
| Literals            | 文字列
| Instructions        | プログラム. 関数
|---------------------|
0

Memory hierarchy

キャッシュアーキテクチャとその制御アルゴリズム, 仮想メモリについて. C 言語通じて, コンピュータアーキテクチャも学べる.

| registers          |             |
| L1 Cache           | SRAM        |
| L2 Cache           | SRAM        |
| Memory             | DRAM        |
| local 2nd storage  | local disks |
| remote 2nd storage | Web Servers |

私は, ストレージ屋だ. (そしてもうやめたい) キャッシュ技術を学ぶと, ストレージを支える技術というものは, かなりの部分がキャッシュが関わっているのだと思った.

  • Disk の性能をあげるためには?
  • ホスト I/O の性能をあげるためには?

とりあえず, 特許でこまったらキャッシュを思い出す. 講義でも, CS の世界での問題解決の常套手段が関節参照だ! と力説してた.

これから

今までセキュアコーディングなんてまったく意識したことがなかった. 無知のまま脆弱性をプログラムに仕込んでしまうことは恐ろしいと思った. もうすこし, セキュアコーディングについて学んでおこうと思った.

アセンブリ言語はこれ以上は深堀りしなくていいかな… なんとなくだけれども, プログラムの仕組みが理解できたし, あまりおもしろいものではないので.

20 Aug 2014, 14:25

感動駆動学習こそ最強の学習法だ! MOOC をはじめて 1 年たったまとめ.

20140821_study.jpg
photo credit: betta design via photopin cc

はじめに

MOOC をはじめてから だいたい 1 年くらいたったので, ここでまとめをしてみる.

受けた講座

かなりいろいろと平行して取り組んでいたので, どれも中途半端だったり, 途中で挫折したりした. そういうのもひっくるめて, 今まで受けたものを時系列にまとめてみる.

coursera: Algorithms Part 1

はじめて受けた講座.すべてが新鮮だった. 英語が聞き取れなかったり. そして, この講義と続編の Part2 が今まで受けたなかで, もっとも難しかった.

coursera: C++ For C Programmers

C 言語しか知らない自分にとっては理想的な内容.これで C++ を身につけたつもり. そして, ここでの知識は仕事にも直結した.

coursera: Algorithms Part 2

Algorithms Part1 の続編.最難関だった.

しかし, この講義をすべて終えたときの達成感はものすごかった. プログラミングの基礎のアルゴリズムをついに学びおえたのだなあと…感動.

coursera: Creative, Serious and Playful Science of Android Apps

ノンプログラマ用の内容だったので, 結構楽勝. Android タブレットを購入した. くだらないアプリも作成したが, こういうものづくりの感動も大事.

edX: Embedded Systems - Shape the World

エセ組み込みエンジニアの自分としては, 工学部で習うような知識をどこかで学びたいとずっと思っていた. そして MOOC で学べた. 念願が叶った! 感動.

この講義は途中で挫折してしまったけど, それでもとても有益だった. L チカ!

coursera: Programming Mobile Applications for Android Handheld Systems

前に受けた Android の講義は, 純粋にアプリ作成の楽しさを伝えるものだったが, この講義はガチで Android Architecture を解説していく. これはあまりおもしろくなかったな.

そしてこの講義は, Android 3 部作のスタートの講義. 3 つの講座が連携することで, Android 開発のすべてを徹底的に学べるとか.

coursera: Web Application Architectures

仕事で Ruby をつかいはじめたので, rails をいじってみたいがために受けた. Web アーキテクチャは自分とは畑違いなので, 知らないことが多いことに気づかされた.

edX: Paradigms of Computer Programming

もっとも, 感動した講義.プログラミングのパラダイムを学べる. これはすごい. こういう体験を待っていたのだ!

edX: Unlocking the Immunity to Change: A New Approach to Personal Improvement

唯一, CS 以外の講義.心理学だ.

この講義で使われている理論と, それがかかれた自己啓発本はもっとはやるべき. 自己啓発本のなかでは, かなり独創的に感じる.

coursera: Functional Programming Principles in Scala

Scala 作者じきじきの講義. すげえ. そして, 関数型言語をずっと学びたいと思っていた欲求を満たす講義.

Scala はまだこの講義を終えても身についたとは言えないが, これからもま なんでいきたいというモチベーションと, 関数型言語を学びたいというモ チベーションには火がついた.

coursera: Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems

Android 3 部作の 2 つ目. POSA2 の著者が登場.

ずっと, デザインパターンを学びたいなと思っていたのだが, POSA とともに, gof のデザインパターンもかなりでてきた.

POSA は日本ではあまりメジャーではないが, これももっとはやるべき.と いうか, POSA2 以降が訳されてほしいな.

coursera: Software Defined Networking

話題の Software Defined ちょめちょめを学ぶために受けた. ネットワークは専門外なので, よく分からなかった.

その他: 現在受講中

edX: Introduction to Linux

Linux Foundation が MOOC に進出して講座を開いたというもの. Introduction の動画が, Linus Torvalds 氏じきじきのお話なところがすごい. LPIC L1 対策に受けてる.

coursera: Programming Cloud Services for Android Handheld Systems

coursera: The Hardware/Software Interface

アセンブリ言語と C 言語を学ぶことで, 低レベルな高レベルのプログラ ミングを学ぶ. これはとてもおもしろい! そのうち感想を.

おもしろかった講義ベスト 3

  1. Paradigms of Computer Programming: おもしろいというよりも, 感動体験の連続.
  2. Algorithms: 1 番難しく, 1 番苦労した.しかし, Assignment がどれもおもしろかった.
  3. Pattern-Oriented Software Architectures: パターンにはある種の憧れがあり, それを学ぶことができた.

つかった言語

いろいろつかった.

  • Java
  • C++
  • Ruby
  • Oz
  • C
  • Assembly
  • Scala

そして, あたって砕ければとりあえずどんな言語もできる気がしてきた. それまでは, まともに使える言語が C しかなかった. この恐怖心と苦手意識 をを打ち破れた心の変化は大きい.

そして, どんな言語にも対応できる Emacs の偉大さを知った.

自分はどのようなときに感動を感じるか?

感動があれば, どんなに疲れて泣きたいときでも前に進める. モチベーションが湧き上がる.

どういうポイントで自分が感動するか, ピックアップしてみた.

作者直伝の講義に感動

Scala や POSA, Immunity to Change, Paradigms of Computer Programming の講義のように, その分野の権威が直々に登場することに感動する.

そういう人たちの講義は情熱的であり, 説得力があり, 震える瞬間がよくある.

こういう講義こそ, MOOC を利用して学習するメリットだと思う.

長年学びたいと思っていた講義に感動

C++ や Embedded Systems, POSA など, いつか学びたいと思っていたことを学ぶと感動する.

欲求不満が解消されることろに感動のポイントがあるのだと思う.

これは, MOOC に限ったことではないけど.

知識と知識がつながりあい, 新しい世界がみえる瞬間に感動

POSA や Scala,Paradigms of Computer Programming など, 新しい考えをしり, より深くプログラミングの世界が見えるようになると 感動する.

学生時代にかじったことを学ぶと感動する

自分は一応? 情報系の学部を卒業している. なので, それと関連する内容を学ぶと, 感動した. グラフ理論だったり,情報理論だったり.

自分はたいへん lazy な学生でほとんど勉強しないで後悔しているので, その罪悪感が軽減されたという, 負の感動もあるのだろう.

感動駆動学習こそ最強の学習法

MOOC の講義を次々と受けた理由は, *感動に駆動される*から.

感動しつつ, 学習し, 成長する

これが最高の学習スタイルではないだろうか?

書籍でも学習できる.しかし, MOOC を利用すれば, 最先端の技術や最高クラスの講義がいつでも, どこでも, だれでも, 無料で手に入る. 21 世紀の教育革命バンザイ! MOOC に幸あれ!

MOOC の講義も有限だし, そもそも自分の時間が有限. そして, 社会人をしながら MOOC をバリバリやるのは, かなりつらいときもある. この学習スタイルがいつまで続くかはわからない.

しかし, もう 1 年やってみようとおもう.具体的には, 機械学習と統計学を学びたい. そういうモチベーションと, それが叶ったとき, そしてそれを学ぶことによって見える新たな世界に, 来年もぼくは感動するだろう.

20 Aug 2014, 11:28

MOOC を利用してプログラミングの勉強をすることで英語を学んだ

photo credit: betta design via photopin cc

はじめに: TOEIC の点数があがった

今日結果が届いた TOEIC の点数がよかった. それは, 学生時代から数えて 7 年ぶりのハイスコア更新だった.長いスランプだった.

なぜ, 記録が更新できたか? それは,

プログラミングの勉強をすることで英語を学ぶ

という, 一年前の発想の転換にあったと思う. そんな今までの英語学習方法 を振り返ってみる.

今までの TOEIC の点数はうなぎ下がり

1000 時間ヒアリングマラソンで 150 点ダウン…

社会人になってから, TOEIC の点数はうなぎ下がりだった.

危機感を覚えて 1000 時間ヒアリングマラソンに挑戦したが, まさかの 150 点ダウンという, 金返せ的な結果となった.

※注意:これは自分が運が悪かっただけで,ヒヤリングマラソン自体はおもし いですとオススメしとく.

英語の NHK ラジオニュースを毎日きいて世の中がわからなくなる

英語の NHK ラジオニュースを毎日きくように心がけた.

毎日ラジオニュースをきいていれば, きっといつかは聞き取れるようにな るはず・・・

と思って,日本語のニュースをきくのをやめて, 英語ニュースだけをきく ようにした. それは意地に近いものがあった.そして, いつになって も英語ニュースを理解できなかった.結果的に, 日本の情勢について 2 年く らいまったく分からなかった.

English Journal を購読

ヒアリングマラソンは止めたものの, English Journal という雑誌がおもし ろいので, これは継続して購読していた.当時, iPad で English Journal が きけるという神アプリが存在した.

このアプリも手伝って, 通勤時間中はずっと English Journal をきいてい た.

現在は, このアプリでの English Journal の配信が終わり, それとともに自 分も English Journal の購読を止めた. このアプリの復活を切に願います.

m (._.) m

そして・・・

TOEIC の点数はちっともあがらない.

プログラミングが目的, 英語は手段

なぜ英語の勉強をするのか, 考えてみた. それは,

プログラマとして成長したいから

という大事なことに気づいた.

  • おもしろそうな OSS は大抵英語.
  • 最新の技術情報は海外からくる.
  • おもしろい洋書が日本語に訳されるのは 2,3 年たってから.
  • そもそもプログラミング言語が英語に近い.

今まで, 英語のために英語を勉強していた. しかし, 英語力の向上のさらに 上位にある目標はプログラミング力の向上ということに気づいた.

じゃあ, 英語を勉強するなんて回りくどいことをせずに, 直接プログラミン グを学んで, その過程で英語を学べばいいのでは? すなわち, 以下だ.

プログラミングの勉強をすることで英語をみにつける

そして MOOC をはじめた

そこで, プログラミングの勉強を英語ですることにした.

具体的な手段として, MOOC を利用して学習した.はじめに, coursera を,次 に edX をはじめた.

はじめはわからない, だんだんわかってきた

MOOC では, 講義の内容が動画で配信されて, Assignment も毎週だされる.も ちろん, すべて英語.

はじめはほとんど聞き取ることができなかった. オンライン学習のうれしい ところは, なんどでも, 動画を見ることができることなので, 何度も見直し た.

半年経ったくらいから, ようやく不自由なく聞き取れるようになってきた気 がした.そして, 時間がないという理由で 1.5 倍速再生を多用するようになっ た.早口もだんだん聞き取れるようになった.

MOOC はコンテンツがおもしろい

MOOC は, コンテンツ自体か非常におもしろい.なので, 少しくらい英語が わからなくたって, その他の好奇心でなんとかなった.

コンテンツ大事.この効果は, NHK の英語ニュースでは不可能だろう.いく らだって, 英語をシャワーのように浴びられるし, もっと欲する.

まとめ: 結局はモチベーションが大事

社会人になって, 点数が下がってしまった一番の原因は, モチベーションが あがらなかったからだと思う. 仕事をはじめても, 英語と接する機会がほとん どなかったから, 英語を勉強する必要性を感じなかった.

なんのために?

この問いから勉強方法を変えて, 結果的に強力なモチベーションを維持して 英語力の向上ができた. モチベーションを維持することが大事だと思った.

19 Aug 2014, 13:26

HTTP も知らないのぉ~? にカチンときたら読むべき! プロになるための Web 技術入門を読んだ.

毎晩お風呂の中でゆでダコになりながら, 『プロになるための Web 技術入門』を読みました.

目的: Web アプリケーション開発の基礎を身につけるために

現在, coursera を利用して web アプリケーションの仕組みを学んでいる.

コンテンツ的にも, 英語的にも, よくわからないので, 平易に Web の仕組み について書いてある本で基本を学びたいと思って, ゆでダコになった.

また, この本は, 3 ヶ月前に購入したまま積ん読になっていた.以前も, coursera で rails を利用した web archtectures を学んだはずなのだが, 身体 に知識がしみこんでいない.とても虚しく感じるので, 改めて学んでみた.

感想: 初心者にやさしい平易な入門書

この本は, Amazon の口コミでは分かりやすいと評判. また, 会社のできる社員のデスクにはこの本がなぜか置いてある.

うわさどおりの分かりやすい内容

そして, はたして, 分かりやすさは本物だった

  • 身近な比喩

比喩や例に合わせて, 概念が紹介されるので, わかりやすい.

  • 技術の必要なった背景からの解説

その技術が*なぜ*必要とされたのかが時系列にかかれているため, Web の発展の横軸のなかで概念を理解していくことができることも, 分かり やすさにつながる.

  • 平易

難しいことはかかれていない. 初心者をターゲットにしている.

HTTP も知らないのぉ~? にカチンときたら読むべき

自分は平均よりはそこそこ技術書を読んでいるほうだけれども, この本はお すすめである.

Web は普段当たり前のように利用しているが, それがどんな技術に支えられ ていているかを知ることは, 洋服の内側を覗き込むようなおもしろさがあ る.

自分のような, Web の仕事とは直接関わりがないひとで,HTTP の仕組みすら まともに理解していないことに恥じらいを感じている人は,

絶対に読むべき! 絶対に読むべき!

内容: シンプルかつ王道ではないですか?

Web 技術について, 歴史的な理由を含めて解説されている.

簡単にキーワードを抜き出すと以下の通り. これらの概念が順番に解説され ていく.シンプルかつ王道だ.

これらの概念をすらすらと説明できますか? ボクはできません (だめじゃん)

  • サーバ, クライアントモデル
  • HTTP プロトコル
    • IP アドレス
    • URL, URI
    • GET, POST
  • CGI
    • Cookie
    • Session
  • Web システム構成
    • WEB サーバ
    • DB サーバ
    • アプリケーションサーバ
  • Web アプリーション
    • JSP
    • サーブレット
    • フレームワーク
  • Web アーキテクチャ
    • MVC Pattern
    • layer Pattern

行動目標: CIFS プロトコルと HTTP プロトコルの比較

さて, 概念はなんとなく理解した.

次の目標はこういうものを実装するところだ.まず, 直近の目標としては, coursera の今受講している講座を完了させること.

また, 今は仕事で CIFS 関連の仕事をしている. なので, HTTP プロトコルについて はもう少し深くまなんで, CIFS プロトコルとの比較を行いたい.

さらには, ちょっと仕事で OpenStack もかじることになるかもしれない. た ぶんほんのちょっと. 個人的に注目している Software-Defined Storage も Web サービスであることを知った.この Web 知識をベースにして, そういう Restful な Web サービスをもっと理解したいところだ.

17 Aug 2014, 12:49

TCP/IP ソケットプログラミングの基礎を集中学習! Working with TCP sockets を読んでる

はじめに

これからネットワーク関係の業務が始まる.

ネットワークの知識をつけるためにソケットプログラミングの本を読み始めた.

本の内容

Ruby をつかって, ソケットプログラミングの内容が解説されている.この本 のよさは, まさに,

安い, はやい, うまい

である.

  • Amazon Kindle で購入できるから, 1000 円で即時に手に入る.
  • はじめのほうが丁寧にかかれているので, Ruby さえしっていれば, 短時間 でソケットプログラミングのエッセンスを速習できる.
  • たった 100p ちょいの厚さだけれども, 要点がまとまっていてる.

初めの 13 は基本のサーバ・クライアントプログラミング.C 言語にも通じ る内容を Ruby で解説している. わたしの業務ははじめは Ruby でプロトタイ ピングをして, そのあと Java で書く予定.なので, 言語に縛られない知識 が欲しい. そういう意味で, 基礎を学ぶことは有意義.

自分は以前, C で 軽くネットワークをかじったので, Ruby での簡潔さに驚 いた. いろいろメソッドが解説されるのだけれども, 最後に Ruby の糖衣構 文がでてきて, ほーら Ruby だとこんなに簡単にかけるんだよーといわれる.

中盤は, Non-Blocking I/O やマルチソケットプログラミングなど, やや専門 的なな内容を扱っている. 自分の仕事では利用するところとしないところ我 ありそうなので, つまみ食いしつつ読んでいる (今ここ)

驚いたのが終盤の章だ. ネットワーキングのアーキテクチャパターンが解説 されている. 結構マニアック.そして, coursera でここを学んだ, そしてま だ学んでいる自分としては, この参考資料はうれしい.

ソケットプログラミングの基礎メモ

以下, かんたんなメモ.

Socket

  • 実行中のプログラム間でデータの送受信を行うための標準的なプログラ ミングインターフェース (API) の一つ.
  • TCP/IP アプリケーションを作成するための抽象化されたインターフェース
  • ソケット (BSD) - Wikipedia

EndPoints

端末.一意に定まる通信先.

Socket は IP Address と PortNo.をつかって, 通信先のソケットを特定す る. ネットワークに接続されたパソコンや PDA, 携帯電話などのネットワーク 端末の総称.

エンドボイントに Socket がバインドされる.

Loopbacks

IP アドレスは必ずしもリモートホストと関連付けられている必要はない. 得に開発環境では, ローカルな IP アドレスが役に立つ.

自端末に対して通信することを LoopBack という. LoopBack で指定するアドレスを Loopback Address という.

  • ハードウェアと関係ない, 論理的なインタフェース.
  • Linux では, localhost と言われている. IP は 127.0.0.1

ループバックとは 〔 ローカルループバック 〕

Server Lifecycle

  1. create ソケットの生成
  2. bind
    • ソケットを利用する Port にバインド.
      • User でバインドする Port は 1025-48999
    • ソケットが通信を許可する IP を指定.
  • 0.0.0.0: すべて許可
  • 127.0.0.1: 自端末のみ許可
  • xxx.xxx.xxx.xxx: ある端末のみ許可
  1. listen 通信先ソケットからの通信をまつ
  2. accept 通信先ソケットからの通信を受け取り, 通信路 をそのつど生成 (connection)
  3. close 通信元ソケットの消滅.
# coding: utf-8
require 'socket'

# 1. create
server = Socket.new (:INET, :STREAM)

# 2. bind
addr = Socket.pack_sockaddr_in (4481, "0.0.0.0")
server.bind (addr)

# 3. listen 
server.listen (5)

# 4. accept
loop do
  connection, _ = server.accept

  ## send message from client.
  # ehco "Hello" | nc localhost 4481
  p connection

  # it should be closed each connection
  connection.close
end

# 5. close
server.close

TCPServer

Ruby では, 以下のような糖衣構文がある.

server = TCPServer.new (4481)
# => 
# server = Socket.new (:INET, :STREAM)
# addr = Socket.pack_sockaddr_in (4481, "0.0.0.0")
# server.bind (addr)
# server.listen (5)

Client LifeCycle

  1. create ソケットの生成

(2. bind )

  1. connect サーバと接続
  2. close ソケットの破棄
require 'socket'

# 1. create
socket = Socket.new (:INET, :STREAM)

# 3. connect
remote_addr = Socket.pack_sockaddr_in (80, 'google.com')
socket.connect (remote_addr)

# 4. close
socket.close

TCPSocket

Ruby では, 以下のような糖衣構文がある.

socket = TCPSocket.new ('google.com', 80)
# =>
# socket = Socket.new (:INET, :STREAM)
# remote_addr = Socket.pack_sockaddr_in (80, 'google.com')
# socket.connect (remote_addr)

Simple Read

以下の例では, 永遠にサーバは Read を待ち続けて, その先が進まない.

require 'socket'

Socket.tcp_server_loop (4481) do |connection|
  puts connection.read
  connection.close
end

Socket は指定されたデータ長のデータが到着するまで待ち続ける. デッドロックを回避するためには,

  • Client 側で データの最後で EOF を送信する.(EOF event)
  • Server 側で一度に読み込むデータ長を小さくする. (partial read)

Client のソケットが close メソッドを実行すると, その延長で EOF が通知 される.

最後に

来週からつかう知識だとだとおもうと, 知識を吸収しようという集中力が違 う.

それは, 不安だからでもある. 知識を求めるのは, 自分の無力感を感じたく ないから. 仕事が遅れて辛いおもいをしたくないから.

はたして, これからやってけるかな…

17 Aug 2014, 03:46

2014 WordPress テーマを 賢威 6.2 にバージョンアップしました

1 年ぶりにサイトデザインを変更しました.

このブログをはじめて 2 年経ち, 2 度目のテーマ変更です.

ScreenShot

Futurismo

Futurismo wiki

Motivations

1 年前のテーマはやりっぱなしテーマ

一年前に, ブログカスタマイズを熱心にやっていた.

賢威 6.2 を導入

このブログは, 開設当初から 賢威テーマを採用している.

この賢威テーマは有料なのだけれども, いいところは毎年無料でバージョン アップができるところ. 賢威 6.0 は一年半前のテーマなので, やや古さを 感じてきた.現在は, 6.2 なので, バージョンアップしたかった.

ダークなテーマに変更したかった

自分の普段の PC 環境が, 黒系を中心にまとめるようになった.

よって, ブログもまるで Emacs の Dark Themes のような色にしたかった.

もちろん, その色は SEO 的には悪い気がする.暗くジメジメしたようなイ メージをあたえかねない.

しかし, 自分のブログなど, 深海 5000m に潜む深海魚のような存在でいい んだ! 深海魚だって, ひとにみられていなくたって, 驚くような進化を遂 げているのだ!

テーマカスタマイズ

賢威テーマは毎年バージョンアップをするために, そのたびごとにテーマ をカスタマイズしていたら, 面倒だ. そのため今回は, 今後のメンテナン スがしやすいような工夫をした.

Docker 導入

簡単に ローカルでの WordPress カスタマイズ環境を手に入れるために, Docker を利用した.

以前は, Windows 上で カスタマイズしていたけれども,これに比べればものすごく簡単だった.

git で版数管理

版数管理をしながら PHP ファイルや HTML ファイルを編集した.

移行前と移行後の差分を git を利用して見ることで, 修正部分がとても分か りやすくなった.

まとめ

ブログのカスタマイズを毎年することが恒例行事になってきた.

そして, 年を重ねるごとに自分のスキルが上がっていることに気づく.1 年 前では考えつかなかった方法で, カスタマイズをしようとする.こういう発 見を重ねることは楽しいことだ.

また, まとめといいつつ, ブログのテーマ移行はまだ半分くらいしか終わっ ていない. このまま中途半端で 1 年が過ぎる可能性がある. ここでおわっ てしまっては, 完全にレベルダウンだ. . :(