08 Jun 2015, 13:06

SICP 第 2 章 データによる抽象の構築を読んだ

SICP 第 2 章を読み終わった?のでなんか書きます.

感想

第 1 章を読み終わってから 3 ヶ月が経っていた…

実は一旦挫折した. 問題が難しくて解けないからだ. しかし、ある時発想を変えて、とにかく写経しながら進めようと思った.

問題は解けないけれども、分からないわけではないので、理解できる範囲で頑張ろうと思った. すると、一旦は折れた心も再び立ち上がることができて、先に進めるようになった.

あと、ところどころ本流に関係なさそうな部分は飛ばしながら読んだ. ズル読み.

あと、Emacs lisp で問題をといていたが、途中で Scheme に変更した. ときどき、動かないプログラムがでてくるので.

要点

データ抽象・抽象の壁

constructor(構成子), selector(選択子) によって、どう使うかに関するプログラムの 抽象の壁 を構築し、抽象レイヤを構築する.

これを、Data Abstruction(データ抽象) という.

データオブジェクトをどう表現するかに関するプログラムの部分を、 データオブジェクトをどう使うかに関するプログラムから隔離する.

データによるレイヤー構造を構築することで, 複雑なシステムをうまく構築することができる.

  • ある場所での変更を局所的なレイヤの変更に封じこめることができる
  • 実装方法(どう表現するか)を自由に入れ替えることができる.

有理数の構成子 make-rat と 選択子 numer, denum を利用することで、 有理数の演算を定義できる.

;; --------------------------------------
(defun cons (x y) ...)
(defun car (x) ...)
(defun cdr (x) ...)
;; --------------------------------------
(defun make-rat (n d) (cons n d))
(defun numer (x) (car x))
(defun denum (x) (cdr x))
;; --------------------------------------
;; このレイヤは car cdr cons は意識しなくていい
;; numer,denum がどう実装されていても気にしない.
(defun add-rat (x y)
  (make-rat (+ (* (numer x) (denom y)
                  (numer y) (denom x)))
            (* (denum x) (denum y))))
;; --------------------------------------

所感

カプセル化との違いが分からない. 状態を持たないということだろうか?

公認インタフェース 

並びを操作するための手続き.

  • map
  • filter
  • accumulate
  • flatmap

公認インタフェースを組み合わせることで、リストを自由に操作できる.

いろいろなブログをみると、ここで Lisp に目覚めるひとがおおいとか?!

所感

unix のパイプラインと似ている. 部品を組み合わせることことよって、データを処理する.

こういう処理を自由自在にかけるようになりたい!

cat file.txt | sort | cut ....

実装例

(defun accumulate (op initial sequence)
  (if (null sequence)
      initial
      (funcall op (car sequence)
               (accumulate op initial (cdr sequence)))))

(defun map (p seq)
  (accumulate (lambda (x y) (cons (funcall p x) y))
              nil
              seq))

(defun filter (predicate sequence)
  (cond ((null sequence) nil)
        ((funcall predicate (car sequence))
         (cons (car sequence)
               (filter predicate (cdr sequence))))
        (t (filter predicate  (cdr sequence)))))

02 Jun 2015, 13:17

Linux のサミットに参加して思ったこと

幸か不幸か、仕事のよしみで Linux 関係の Summit に参加しました.

こういう場に参加するのははじめてで、いろいろ刺激を受けた.

忘れないうちにここに書いておく.

すべて英語

当たり前のことだけれども、OSS のサミットなので全部英語. 英語できない自分は、そこに存在するのがつらかった.

参加している多くの日本人も、当たり前のように英語で会話していることにビックリした. こんなに多くの英語が飛び交う場所にいったことがなかったので、ビックリした.

英語のプレゼンを聴いても、ほとんど聞き取って理解できないことが悔しかった. なかには、日本語できいても理解できないものもあったかもしれないが..

とにかく、とても無力感と焦りを感じたのだった.

企業としての OSS 活動

個人で参加している人はいないように見えた. プレゼンを発表するひとは、全員企業の肩書きを持っていた.

OSS というのは、個人がプライベートとして開発しているイメージばかりがあった. しかし、Linux というのは企業が開発者を出すことによって、 いいかえると、企業がビジネスとして開発を推進しているように見えた.

これは、自分の認識が狭かったところだった. OSS に企業としてかかわるというのは、 働きながら OSS にソースを提供することなんだと思った.

企業が OSS を活用して開発を推進するということは、 ただ単に、落ちている OSS を拾って開発するのではない. 拾った OSS を仕事のなかを通じて改善し、 改善をフィードバッグしていくことなのではと思った.

Open Innovation

サミットの雰囲気も、それはそれでカルチャーショック.

今まで、他の企業はライバルで他の企業に負けない製品をつくらなければ、 という意識が強かった.

しかし、サミットには、 複数の企業が一つの目標に向かって一致団結して頑張りましょう, 車社会の未来をここからオレたちが作っていくんだ!!という空気があった.

Open Innovation という言葉も、はじめて知った. 企業が競争しあうのではなく、協力しあうことで、あらたな価値を創造して いくことを意味する. そんな空気が、サミットにはあった.

28 May 2015, 01:36

Ruby でシストレの世界を体験! Ruby ではじめるシステムトレード を読んだ

システムトレードのプログラムを自分で組んでみたいと思った.

coursera で講座をとったので、なにかこれに続く学習をしたいと思った.

なにか、手頃な入門書はないだろうか?

探して見たところ、以下の本が良さそうなので、読んでみた.

Ruby でシステムトレードのプログラムを組む本

Ruby を用いてシステムトレードのプログラムを組む本.

内容は、筆者が作ったプログラムを順に解説していくもの. シストレの知識がまとまっているわけではない.

この本は、Ruby 初心者、いやプログラミング初心者でも読めるように書いてある.

各章において、やりたいことのコードが載っていて、 その手前でそのコードで利用している文法が解説されている.

以下から、ソースコードがダウンロードできる.

Yahoo ファイナンスのスクレイビングとシミュレーション

内容は 2 つに分かれている.

  • データ取得
  • シミュレーション

データ取得

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    前半は、株データを収集するために、 Yahoo ファイナンスをスクレイビングするコードが解説される.
  </p>

  <p>
    やってみましたよ的な内容で、 スクレイビングについてまとまった知識を得られるものではない.
  </p>

  <p>
    open-url ライブラリを利用して HTML ページを落としてきて、 正規表現でパースするというもの.
  </p>

  <p>
    執筆時と Web の構造が変わっていたので、サンプルコードそのままでは動かない!
  </p>

  <p>
    修正コードが以下にあった.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.panrolling.com/books/gr/gr121.html">Pan; Ruby ではじめるシステムトレード</a>
    </li>
  </ul>
</div>

シミュレーション

<div class="outline-text-3" id="text-orgheadline4">
  <p>
    後半は、売買のシミュレーションを実施するプログラムを作成する.
  </p>

  <p>
    自分は、トレード自体は初心者なので、 いろいろなトレード基本用語が理解できないで困った.(テクニカル指標とか)
  </p>

  <p>
    プログラミング初心者を対象にしているが、トレードの初心者は対象にしていない.
  </p>
</div>

プログラミング書籍としては悪書

プログラミング書籍としては、ひどい内容だ.

  • 秩序も順番もなく、文法が述べられる
  • くだらないギャグやユーモアがちりばめられている
  • 初心者むきの本であるにも関わらずトリッキーな書き方ばかりがでてくるところ.

どうだ、こんなに短くかけるのだ、すごいだろ!

という叫びが随所にちりばめられている. 初心者向きの本ならば、ダサくても可読性がある書き方のほうがいい気がする. プログラミング初心者にこの本を読ませるのは、かなりきついだろう.

しかし、まずやりたいことがあって、そのための文法が解説されていたほうが、 淡白な文法書を読むよりも、取っ掛かりはしやすいのかもしれない.

雰囲気を味わう

シストレの本としては、よくわからなかった. Ruby と同じで、必要なときに必要な知識が出てくる。知識がまとまっていない.

いろいろなことが知っているものとして話がすすんでいるような気がして、 後半のほうはちんぷんかんぷん.

この本は、雰囲気を味わう本なのだろうと思った. 実際に、動くプログラムを動かすことで、なんとなくシストレを体験する本.

27 May 2015, 23:23

MQL4で Hello World

システムトレードに興味を持ったので、 シミュレーションをするための言語MQLを触ってみました.

MQL4とは

MQLとは、MetaTrader上で プログラミングをするための専用言語. 文法は,C言語に近いという.

環境の準備

利用するためには、MetaTraderをインストールする必要がある. 例えば以下を参考にインストール. 検索すると、たくさんのアフィリサイトが引っかかりる.

windows 8.1にインストール(Linuxへのインストールは文字化けしたので諦め)

Hello World

以下のページそのままなのだけれども、Hello Wolldをやってみる.

新規作成 > エキストパートアドバイザ あとは、ナビにしたがってコードを生成.

OnTick() 関数のなかに以下を追加.

Print("Hello, World");

全体のコードは以下.

//+------------------------------------------------------------------+
//|                                                  Hello World.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Print("Hello, World");

  }
//+------------------------------------------------------------------+

コンパイルボタンをおして、再生ボタンを押すと、 Hello, Worldとかかれたポップアップがでてくる.

おわりに

この記事に触発されました…

これから頑張ります. 新しい趣味になればいいな. 今回の記事で終わりになりませんように.

26 May 2015, 10:18

Java8 Stream をつかって宣言的な計算で遊んでみた

関数型の書き方に早く慣れ親しみたいので、 Java による関数型プログラミング を買ってみました.

今日は、 簡単な演算を stream で実施するとどうやるかをいろいろ実験してみました.

forEach

forEach は 各ストリーム要素に大してなんらかの操作をすることができる.

表示

print 表示してみる.

import java.util.*;

class StreamSample {
    public static void main(String args[]) {
        List<Integer> list = Arrays.<Integer>asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        list.stream().forEach(i -> System.out.print(i + " "));
    }       
}
// 1 2 3 4 5 6 7 8 9 10 

reduce

集合から単一の値を求める.

すべての合計を求める

sum()と average()などによる集計の機能は Stream には用意されていない. mapToInt()をつかうことで、Integer 型を int 型に変換する.

int sum = list.stream()
         .mapToInt(x -> x)
     .sum();
System.out.println(sum);

最大値を求める

int max = list.stream()
    .mapToInt(x -> x)
    .max()
    .orElse(0);
System.out.println(max);

すべての積を求める

とくに、専用メソッドはないようだ. reduce メソッドで実装する.

int multiple = list.stream()
    .mapToInt(x -> x)           
    .reduce(1, (a, b) -> a * b);
System.out.println(multiple);       

filter

filter を用いることで、if 文相当のことができる.

// 奇数のみの足し算
int sum2 = list.stream()
    .mapToInt(x -> x)
    .filter(i -> i % 2 == 1)        
    .sum();
System.out.println(sum2);

おわりに

以上、簡単に書籍を参考にしながらコードを動かしてみた.

java で関数型プログラミングを学ぶと、 慣れ親しんだ言語ということでとっつきやすい.

しかし、関数型ならば Java じゃなくて Scala とか、 本格的な言語で学んだほうがよいのではないかというジレンマもある.

当初の目論見では、TopCoder の問題を関数型で書き直して学ぼうとおもったけれども、 TopCoder の問題は思った以上に配列を多用しているため、ちときつい.

おそらく、Java で 関数型を学ぶとすると、 仕事で Java8 以降の開発に携わることができたときかな。 今の職場じゃ絶望的…早くコイコイ関数型の時代.

Special Thanks

以上、Happy Hacking!!

25 May 2015, 11:29

リアクティブプログラミングの世界観を垣間見!coursera で Principles of Reactive Programming を受けた

最近流行りの リアクティブプログラミング の講座が coursera で開講されたため、 ちょっと背伸びをして受講してみました。

結果から言うと、Scala の知識が足りずに途中で挫折しました。

一応感想を簡単に書いとくか。。〆(・ω・* )

内容

スーパースター講師勢ぞろい

まず、この講座の講師陣がすごい.

  • Martin Odersky … Scala 生みの親
  • Erik Meijer … へんなおじさん
  • Roland Kuhn … Akka チームリーダ

いずれも各分野におけるプロフェッショナル.

ちなみに、Oderskey さん、Erik Meijer さんの 講座は以前受けたことがあります.

Functional Reactive Programmig(FPP)

week1,2 で、Odersky さんが Functional Reactive Programming に関する 話題を説明します. よくネット上で話題になるのも、この辺の話.

RxScala

week3,4 で、Meijer さんが RxScala の話をします.

Meijer 氏いわく、以下の4つが 代表的な副作用なのだと. この 4 つの概念を順番に説明していくという内容.p

Try Emumerable


Future Ovserver

以下の動画でも、同じ話題が話されている.

Akka

最後に、week 5,6,7 で Roland Kuhn 氏が、Akka を通じて Actor モデルの説明をする.

また、その延長で 分散システムにおける フォールトトラレントなプログラミング手法に関しての話題がある.

感想

途中で挫折…

自分は、Scala の文法がよくわからないまま受講していたので、 途中で Assignment ができなくなって、挫折してしまった…

うーむ、基礎体力が足りなかった. とても悔しいので、もう一度この講座が 開講された時には、再び受講したいと思った.

リアクティブな世界を覗き見た

リアクティブプログラミングについて、概念的な話は知っていたが、 コードを通じてその世界をかいま見ることができた.

ネットで記事を読んでいると、

  • Monadic Programming はすごい!
  • Actor モデルは便利!

という話題をたまに見かけるのだけれども、ほんの入り口を体験した.

分散システムとリアクティブ

分散システムのシステム制御 は、これからも自分の仕事では関わり続けていく領域 なので、week6,7 で出てきた話題は、もう少し知りたいと思った.

今回は理解できなかったので、いつか理解しようと思って、書籍を購入. なんと、以下の書籍はこの講座を受講すると半額で購入できるとのことだったので、 衝動買いした。

また、この分散プログラミングで出てきた話題は、 つい先日まで受講していた 講座ともかぶる部分があった. 概念をコードから覗くことができた.

Akka や Erlang は 言語として フォールトトラレントな制御をサポート しているので、自力で分散システムのための仕組みをプログラミングした としても、それは車輪の再発明なんだなと思った. 世の中に転がっている OSS を理解し、自分の開発に取り入れねばと思った.

24 May 2015, 17:32

ハードウェアの仕組みを学ぶ!coursera で From Nand To Tetris Part1 を受けた

数か月前に コンピュータシステムの理論と実装 という本が発売された.

そして、この本の発売とちょうど同じタイミングに coursera で From NAND to Tetris の講義が始まった.

あまりにグッドタイミングなめぐり合わせに喜びつつ、講座を受けてみました.

FROM NAND TO TETRIS の紹介

有名なコンピュータ講義とその教材

これは、海外では有名なコンピュータ講義である

TED にも登場して講座の紹介をしているよう.

特徴

講座の特徴は、NAND というもっとも基本的な論理素子から、 毎週自分の手でコンピュータに必要な部品を作成していくところ. 難しく聞こえるかもしれないけれども、 そこはよく講座ができているので、なんとかなる.

実際の VHDL や C 言語などをつかうのではなくて、 学習用に開発された Hack 言語というものを利用する. この Hack 言語というものが、実際のコンピュータのエッセンスを残しつつ、 余分な仕様をはぎおとしてシンプルにしているため、 学習者は最低限の努力と知識で部品をつくることができる.

また、各週ごとに部品が完成しなくても、次の週に進むと、 あらかじめ用意された、前回までのツールが利用できるので、 途中で挫折することはない. 毎週、あらたな気分で挑戦できる.

著者直々の講義

Noam 先生と Shimon 先生直々に動画で説明をしてくれる. ここに、coursera とともに学習を進めることのうれしさがある.

自分は、動画を一通り見た後に、参考程度にコンピュータシステムの理論と 実装の本をながめるようにしていた.

coursera の講義は、Part1, Part2 にわかれて提供される. 今回は、Part1 で、ハードウェアの部分を学習した.

毎週の講義と参考書の章は 1 対 1 で対応していて、 毎週 1 章を読んでいく.

また、毎週 assignment として、部品の作成をして、 成果物は coursera の採点システムに提出する.

感想

山登りに似た達成感

コンピュータの部品を一歩一歩部品を作成して行くことで、 途中から自分の作成した成果を見直すと、山の頂上に立ったような達成感、 全能感を感じることができた.

抽象によるコンピュータの構築

また、NAND という単純なゲートから、徐々に部品を組み上げていく様は、 まるで、単純な公理から定理を導いていくような趣きもある.

一つの部品を作成すると、部品がどうやって動くのかということを ブラックボックスにすることができて、部品は何をするのかだけを知ればよい.

それは、ソフトウェアでもよくでてくる抽象化というやつだ。

邦訳の 抽象と実装 という意味を実感した.

ハードウェアがなんなのかということがわかった

自分は組み込みソフトの開発者なので、ハードウェアを理解していないこと で、話について行けなくなることがたまにある.

先日も、ハードよりの講演会に参加したのだが、話を聴いていてもまったく わからずに悔しい思いをした.

CPU, レジスタ, メモリ, などなど、説明を読んで理解していた気になっ ていた. 今回、自分の手で作り上げることによって、それらがいったいなに をやっているのか、理解できた気がした.

それらは知らなくてもいいこと

しかし、ハードウェアの知識はソフトウェア開発に必要かといえば、 必要ないことだ。

自分自身の人体の仕組みをしらなくたって、人間は生きていける. 機械語を理解することと、DNA を理解することは、 同じことだとともう. それらは、必要ない.

では、なぜ学ぶのかといえば、一つは好奇心、もう一つは不安感のため. 知らなくたってなんとかなるものの、得体のしれないブラックボックスの 中身を知らずに使いつづけるのもあまり気分がいいものではない. なので、不安感を解消するために、安定感を得るために、学ぶ.

自分の組んだプログラムがハードウェア上でどのようにして 動作するかを知ることにより、ソフトウェアに自信を得ることができる.

勉強メモ

以下、作成した部品のメモ.

week1: ゲートへ

論理ゲートとは、ブール関数を実現するための物理デバイス.

ゲートをまとめたものを回路, チップという.

トランジスタ

2 値のデータ表現を電気で実現する物理デバイス. スイッチング技術.

電気であることが一つのポイント. 別の物理性質を用いてゲートを作成することもできる.

NAND

もっとも基礎的な論理ゲート.

論理ゲート

すべてのブール関数は NAND NOT をつかって表現できる. (AND, OR, NOT ) を含む.

  • NOT (x) = (x NAND x)
  • AND (x, y) = NOT (x NAND y)
  • OR (x,y) = NOT (NOT (x) AND NOT (y))

NAND を実現した物理デバイスが自由に利用できれば, どのようなブール関数もハードウェアとして作成できる.

マルチプレクサ

ふたつ以上の入力をひとつの信号として出力する機構.

マルチプレクサによって、ハード的に if 文を表現することができる.

作成した成果物

これらの部品は、HDL で作成していく.

  • And
  • Or
  • Xor
  • Not
  • Not16, And16, Or16, Mux16 … 16 進数の 論理ゲート

  • Mux … マルチプレクサ

  • DMux … デマルチプレクサ

  • Mux8Way16, DMux8Way, DMux4Way .. 16 進数のマルチプレクサ

week2: ALU へ

算術ゲートは、算術計算をおこなうためのゲート.

コンピュータの命令は 2 進数の加算に還元できることが多い.

算術計算を行うゲートは、ALU という CPU 内部の論理算術ゲートに集約される

作成した成果物

  • HalfAdder … 半加算器
  • FullAdder … 全加算器
  • Add16 … 16 進加算
  • Inc16 … 16 進インクリメンタ
  • ALU … 論理算術ゲート

week3: Memory へ

この章で、*状態* という概念がでてくる.

順序回路

ひとつ以上のフリップフロップ回路が組み込まれているもの.

以下のような機能をもつ.

  • 状態を保つ
  • 状態を操作する

状態がかわるのは, クロックが次の周期に移行したとき. (c.f. 組み合わせ回路は即時)

(D) フリップフロップ回路

順序回路の中でもっともプリミティブなもの. NAND とともに, もっともプリミティブなものとして考えられる.

フリップフロップ回路の実装方法はいろいろある. NAND から構築する方法もある.

レジスタ

データを記憶したり取り出したりすることができる順序回路. - レジスタ (コンピュータ) - Wikipedia

メモリ(RAM)

レジスタがたくさんあつまったもの.Random access Memory.

各レジスタには、一位のアドレスが割り振られている.

作成した成果物

  • Bit, Register … レジスタ
  • RAM8, RAM16, RAM64, RAM512, RAM4K, RAM16K … RAM
  • PC … プログラムカウンタ

week4: 機械語へ

機械語

機械語とは、コンピュータの CPU で直接実行される一連の命令.

一つ一つの命令が行う仕事は極めて限定されており、 CPU のレジスタやメモリ上の単位データに対して、 読み込みやジャンプ、ALU といった操作を実行する。

機械語は, レジスタ、プロセッサを用いて、メモリを操作する.

作成した成果物

  • 乗算プログラム
  • 入出力操作プログラム

week5: コンピュータアーキテクチャへ

CPU

中央処理装置, プロセッサとも.

仕様で決められた一連の命令セットを実行できる.

記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで 解釈・実行することで情報の加工を行う.

ノイマン型アーキテクチャ

CPU を中心として、メモリデバイスを操作し、 入力デバイスからデータを受け取り、出力デバイスへデータを送信する.

  • メモリ
    • データメモリ
    • 命令メモリ メモリ上にプログラムを保持するところがノイマン的.
  • CPU
    • ALU
    • レジスタ
    • 制御ユニット
  • レジスタ
    • データレジスタ
    • アドレスレジスタ
    • プログラムカウンタレジスタ 次にフェッチする命令メモリ上のアドレスを保持して、 一つ命令を実行する度にインクリメントしていく.
  • 入出力装置 メモリマップド I/O によってメモリ操作のように制御

作成した成果物

  • CPU
  • メモリ
  • コンピュータ

week6: アセンブラへ

アセンブリ言語

機械語を人間にわかりやすい形で記述する、代表的な低水準言語である.

作成した成果物

  • アセンブラ

これは、Ruby で実装してみた.

23 May 2015, 15:06

自分はプログラミングが好きなのだろうか?

自分は、果たしてプログラミングが好きなのだろうか?

ドラクエをしているほうが楽しい.

快感からプログラミングをしている…それは欺瞞

プログラムが動いたときの喜びを味わいたいからプログラミングをするんだ.

なにかを作り上げたという達成感のためにプログラミングをするんだ.

知的探求心を満たすためにプログラミングをするんだ.

たしかに、それはあるだろう。 しかし、それはきれいごとで、他人の目を気にした言い分ではないだろうか?

快感からやっている、知的好奇心からやっている、それらは言い訳ではないだろうか?

無能さを感じる

デバッグが苦痛だ. どうして解決できないのか… 自分の無能さを舌なめずりしている苦さを感じる.

また、他人のブログを読んでいると、世の中には、たくさん優秀な人たちがいるなぁと思う.

自分は学生のころから、それほど頭がいいわけではない。 どうやっても、頭のいい人においつけない.

義務感と焦燥感からプログラミングをしている

昔から、いつも自分の進むべき道を探してきた.

自分ば、将来一体なにになるのだろうか?とても不安だった.

いろいろあって、プログラマという道を選んだのだった. それは、つい最近だった. もっと、学生のときからプログラミングをまなんでいればよかったと、 いつも思う.

長年かかったけれども、ようやく絞った自分の道だ、 これを誤った選択だとしたくない.

プログラミングの先になにがあるのか

プログラミングの先になにがあるのか?目指すべき目標は?

虚しさを埋めるためにプログラミングをしている気がする.

結局、自分の存在が虚しくて、 それを埋めるためにプログラミングという旗をめがけて生きている. なにかを目指して頑張っていないと、空虚さに押しつぶされてしまう.

自分は好きでプログラミングをしているわけではない.

  • 意図的にプログラミングという目標を定めて、
  • 義務的にしている気がしてならない、

これが今日の結論.

プログラミングの先にはなにもない。もともとが空虚なところから始まっているのだ.

シーシュボスの神話のようだ。

17 May 2015, 10:47

Actor モデル初体験! Akka で Hello World してみる

Scala

Scala の Akka で Hello World をしてみました.

スレッドとはちょっと違う、Actor モデルの初体験!

Akka とは

Akka とは、Scala で Actor モデルベースの平行処理を書くときの、 デファクトスタンダードなライブラリだ.

Hello Akka!!

ソース

以下のファイルを src/main/scala/HelloScala.scala に作成.

import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props

class HelloActor extends Actor {
  def receive = {
    case "hello" => println("World!")
  }
}

object Main extends App {
  // デフォルトの Actor を作成
  val system = ActorSystem("HelloSystem")

  print("Hello, ")

  // 送信先 Actor を作成
  val helloActor = system.actorOf(Props[HelloActor], name = "helloactor")

  // メッセージ送信
  helloActor ! "hello"
}

build.sbt 作成

以下の build.sbt ファイルを作成

name := "My Project"

version := "1.0"

scalaVersion := "2.10.0"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "com.typesafe.akka" % "akka-actor_2.10" % "2.2-M1"

実行

コンソールより実行

> sbt run

[info] Running Main 
Hello, World!

返信ありのケース

sender を利用して、折り返し処理を実施.

import akka.actor.Actor
import akka.actor.Props
import akka.actor.ActorSystem

class HelloActor extends Actor {
  def receive = {
    case "introduce" => 
      print(",")
      sender ! "world"
  }
}

class CounterMain extends Actor {
  val system = context.actorOf(Props[HelloActor], "hellocounter")

  print("Hello")
  system ! "introduce"

   def receive = {
     case "world" =>
       println(" World!!")
       context.stop(self)
   }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")
  val actor = system.actorOf(Props[CounterMain], name = "counterMain")
}

参考

14 May 2015, 12:51

近い未来のリアルな技術!自動運転技術の動画ブックマーク

本日は東京ビッグサイトにて、一年に一回のイベント、ESEC へ. 車の自動運転に関するセミナーを受講しました.

車の技術に疎い自分には、 きくことみることとても刺激的で楽しい時間を過ごせました.

車の運転技術、今や成熟の時です。*2020 年には市街で自動運転が実現する* そうです.

こういう技術は以下のように呼ばれているらしい

ここだけの話、車に乗ることが怖いペーパードライバーの自分にも、 ビュンビュン車をかっ飛ばすことができるんだという夢を抱きつつ、 今日は、自動車技術の話題や動画を収集してみました.

Google(Google Car)

Google がデモ動画を発表したことによって、 自動運転が世間からに注目されるようになりました.

TED でのプレゼン

ニューヨークでは、デモ車が街中を走っているとか.

Apple(iCar)

iPhone の次は、iCar を製造するとか.

BMW

世界初、ドリフト走行ができる自動運転.

ウェアラブルな装置とも連携するものをかんがえているよう.

トヨタ

時速 100km の自動運転に成功. 高速道路の自動運転はもう目前?!

自動運転技術が成熟する 2020 年、トヨタと Google の戦いが幕を切る.

その他

安部首相が自動運転自動車にのって日本の技術に驚いている.

つい先日、DeNA が自動車業界に決死の覚悟で飛び込み.

おわりに

自分が知らないうちに、 自動運転がここまで実現可能になっていることにまず驚いた. そして、近い将来に、世の中の車も変わっていくことにワクワクする.

きっと、未来の人は、*車を自分で運転していたなんて時代もあったんだよ* なんといって、驚く時代もくるのだろう.

車業界の競争は、とてつもなく厳しいものになりそうだ. 自分はこの波に、どういう形で巻き込まれていくのだろうか?