28 Jun 2015, 06:12

WAN高速化プロジェクトの成果がWeb記事になった

2014年8月から2015年4月まで関わっていたプロジェクトの成果が今週Web記事になった.

2chの反応もおもしろいので、メモしとく.

3 :番組の途中ですがアフィサイトへの転載は禁止です:2015/06/22(月) 18:04:31.48 ID:v7aI4dlr0
    tar.gz で済むことを2台対向の専用ハードでやって
    そいつらが故障したら通信不可になるならまだましで
    中途半端に壊れてデータが化けても正常終了で終了

4 :番組の途中ですがアフィサイトへの転載は禁止です:2015/06/22(月) 18:27:14.44 ID:UyW+a1dH0
    研究費枯渇とネタ切れで大昔に研究員が作って放置してたのを蔵出ししたっぽい

5 :番組の途中ですがアフィサイトへの転載は禁止です:2015/06/22(月) 18:31:13.08 ID:ICXrVL6k0
    ファイルシステムをレプリケーションしてsmbも小細工してる感じか

6 :番組の途中ですがアフィサイトへの転載は禁止です:2015/06/22(月) 18:33:21.64 ID:TpQJm+a00
    糞Windows&細かいファイルのまま、という環境を止める方が効果あるだろ

7 :組の途中ですがアフィサイトへの転載は禁止です:2015/06/22(月) 18:38:27.87 ID:btTBgrkx0
    すごいしょうもない技術だってことは一目でわかった 

自分の仕事が世の中にでるのは、エンジニアの喜びですね(批判も)

28 Jun 2015, 05:49

サーバ監視のお仕事にかわりました

仕事がまた変わった.

新しい仕事についてはや2ヶ月、以下のような記事を書いたりしてはりきってた.

なにもやっていないうちに別の仕事になってしまった…

なにもやらないという辛さ

開発がスタートしていないうちに、チームに配属されたので、 正直やることがなにもなかった. コーヒーばかり飲んでいた気がした.

忙しい辛さは知っていた。 しかし、ヒマ過ぎる辛さというのをはじめて知った. 忙しい辛さと暇な辛さは、暇な辛さの方が実は辛い.

いや、一応やることはあったんだ. 開発に入る前の調査フェーズなので. しかし、調査というものは辛かった. 答えがないから.

漠然と、調べ物をしていてもまったく分からなかったので、 毎日途方にくれていた.自分は、研究者にはなれないなと思った.

派遣ギリ!

そんな日々を過ごしつつ、開発が始まるはずだったのだが、 不幸にも、予定していた仕事がなくなってしまった.

2ヶ月間開発が始まるのを待ち望んでいたのだが、これで自分はお役ご免.

サーバ監視のお仕事

新しい仕事が待っていた. 次の仕事は、サーバ監視のお仕事. 以下の製品のエンハンス.

Zabbixというサーバ監視のOSSを改造する仕事で、言語はPythonだ. 機能がたくさんあるので、激務になりそうな匂いがプンプンするのだが..

席の引越しをするときに、お世話になった上司にこんなことをいわれた.

二ヶ月間開発できなかったストレスを存分に発散してくだいさい

はい、そうします!

22 Jun 2015, 12:22

Linux でログインパスワードなしでログインする小ワザ

Linux 小ネタだけど驚いた技をメモ.

背景

今日は仕事で USB に焼いた Linux マシンを新規に立ち上げていたのだが、 ユーザログインできないという、なにもできない状態になってしまった.

そんなとき、Linux に詳しいひとが教えてくれた技.

ログインパスワードなしでログインする

USB メモリを別のパソコンにさして、 /etc/passwd にある以下の行を修正すると、 そのユーザのパスワードをなしにすることができる.

$ cat /etc/passwd

# 修正前
root:x:0:0:root:/root:/bin/bash

# 修正後 x を消す
root::0:0:root:/root:/bin/bash

これで、あーら不思議、ログインパスワードなしでログインできた.

19 Jun 2015, 12:29

Wrap-Unwrap Pattern についての覚書

Functional Python Programming という本を読んでいたら、 Wrap-Unwrap Pattern というものを知ったので、ちょっとメモ.

公式

unwrap(process(wrap(iterable)))
  • wrap() ラッパー
  • unwrap() アンラッパー ラッパーで処理したものをもとに戻す.
  • process() 処理したい手続き
  • iterable 処理したいデータ

ラッパーは、iterable なデータをタプルに加工する. タプルを利用するのは、タプルが immutable なデータ構造だから.

例: 最大値を求める

以下、python による例です.

以下のデータ構造で身長が最大の人を調べる.

  • 太郎: 170
  • 次郎: 160
  • 三郎: 180
students = [("Taro", 170), ("Jiro", 160), ("Saburo", 180)]

max 関数は、そのままでは利用できない.

>>> max(students)
('Taro', 170)

ラッパーでタプルを作成する. wrap 関数は、generator expression ともいう.

def wrap(students):
    return ((student[1], student) for student in students)

def unwrap(data):
    length, student = data
    return student

パターンを適用.

unwrap(max(wrap(students)))

>>> unwrap(max(wrap(students)))
('Saburo', 180)

その他

wrap 関数をいちいち定義するのは面倒なので、lambda が利用される.

>>> max(map(lambda s: (s[1], s), students))[1]
('Saburo', 180)

map を利用する場合の方が、generator expression よりも、高速らしい.

unwrap の操作でタプルの一番目、二番目を取り出すのは常套手段. なので、Haskell には、fst,snd という関数が用意されている.

  • fst: タプルの 1 番目の要素を取り出し
  • snd: タプルの 2 番目の要素を取り出し

14 Jun 2015, 08:34

MOOC をはじめてから 2 年たち、そろそろ飽きてきた

最近、MOOC の講座を試してみるが、継続しないで途中であきらめることが多い.

MOOC の講座を受けつづけてもうすぐ 2 年が経とうとしている.20 以上、講座を受けた.

そろそろ、飽きてきたときなので、心のもやもやを文章にしておこうと思う.

応用できない知識が多い

これが、途中でやめようかなと思う理由の中の大きなもの.

これって、なんの役に立つのだろう?と思ってしまうと止めてしまう.

勉強しても、それを現実の仕事に応用できないものも多い. 多分転職しないと無理そうなものも多く勉強した.

それらは、勉強しているときは楽しいのだけれども、 それが終わると瞬く間に忘れてしまう.

浅い知識はに忘れてしまう

MOOC の講座は多分野に渡っている.

今まで、興味があるものはとりあえずすべて Greedy に手を出してきた. その結果、中途半端な知識が多く積み重なった気がする. どの領域にも、深く突っ込んで血肉になった知識がないことに気づいた.

大学で勉強したことは、月日が経てば忘れてしまうように MOOC を利用した勉強も、講座を受講してから時間が経つと忘れてしまう. これは仕方がないことなのだろうか?

今振り返って見ると、努力の割にはあまり残っているものがないような気が してガッカリする.

苦手意識を取り除くことができた

よい面もある. 苦手意識を取り除くことができた.

ハードの知識を身につけた

自分は組込みソフトのエンジニアなのだが、 ハードウェアの知識が乏しかった. しかし、以下の講座を受講することで ハードウェアの仕組みを大まかに理解できた.

ハードを知らないということを引け目に思っていたので、この思いを払拭できた.

たくさんの言語に触れた

また、手続き型の言語ならば大抵の言語は出来る気がした. MOOC を始めるまで、じぶんは C 言語しかつかいこなせなかった. MOOC を通じて、あまりに多くの言語に触れることができた.

Java, C++, Ruby, Python, Oz, R, Scala, Haskell

言語を知らないという劣等感も払拭することができた.

学生時代のだらしない自分を許そうと思った

当初は、MOOC を通じてコンピュータサイエンスを再びやり直そうと考えた. 自分は、大学でほとんど勉強をしなかった. 院も出ていない. そのことをとても後悔していた. なので、大学での勉強をやり直したいという思いで MOOC に取り組んでいた.

結果的に、コンピュータサイエンスをやり直せたか?といわれると、 やり直せてない気がする…

しかし、この 2 年間はよく学習したので、 学生時代に怠けていた自分も許せるような気がしてきた.

これからは知識を深める努力を

ひとつの本を読み終わったら、それに関係する別の本を読み、 その繰り返しで知識が深まっていくのだと思う. 対象を絞り込まずに MOOC を漠然と受けていても、知識は深まらない.

MOOC を通じて、関数型言語が今後重要になると感じた. これからは、関数型言語に注力して、知識を深めて生きたいと思う.

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!!