23 Aug 2015, 15:47

シンプルさが前に進む力となる Clojure

最近、Clojureに惹かれる. なぜだろうか? 以下、ポエム.

自分にはプログラミングの思想があるのだろうか?

自分がをプログラミングをするとき、よりどころとなる思想がない。

別に、思想なんかなくたって、プログラミングはできる. でも、どこか、虚しい。それは、人生の意味と同じだ.

つらいときも、苦しいときも、よりどころとなる思想があれば、 立ち向かっていけるような気がする. どんなにつらい境遇にいようとも、たちどころに力がみなぎってくる. 言葉には、そういう力があると信じている.

そんな、力がみなぎる思想が自分のプログラミングにも欲しいのだ.

プログラミング Clojure

プログラミング Clojureの 文章に心を打たれた.

  • Clojureはエレガントだ。
  • Clojureは「Lisp・リローデッド」だ。
  • Clojureは関数型言語だ。
  • Clojureは並行プログラミングを簡単にする。
  • ClojureはJavaを歓迎する。
  • Clojureは速い。

[sourcecode language=”text” title=”” ]
Clojureのあらゆる要素は、次の2つの概念から導かれる — 簡潔さと力だ
[/sourcecode]

カッコいいと思った. それは、理屈なく、感覚的にだ. この憧れの気持ちを大切にしよう. こういう気持ちが、熱意になるんだ.

簡潔さと力

小さいこと、一つずつのステップが大きなことへとつながっていくこと. そのような、考え方が好きだ.

それは、以前, 以下の文章にまとめた.

この文書にも感銘を受けた.

シンプルさが前に進む力となる. Clojureの思想は、魅力的だ. Clojureには、TDDやGTDに似たような魅力を感じている.

簡潔さと力、これを自分の拠り所にしようと思った.

小さく、一つずつ シンプルな関数を積み上げていく. それはやがて、大きな構造をなす. 全体は大きく、しかし秩序だっていて、シンプルにまとまっている. そんな、世界をClojureはみさせてくれるのだろうか?

22 Aug 2015, 14:50

org-modeでマイクロブログ!! org-agendaに twitterのつぶやきを表示する方法

org-agendaに twitterのつぶやきを表示してみました.

これらの関連記事のまとめになります.

方法

以下のようなRuby スクリプトをかいて、自分のつぶやきをorg形式で保存. rubyからtwitterのtweetを取得するために、twitter gemを利用.

#!/usr/bin/ruby
require 'twitter'
require 'pp'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = ""
  config.consumer_secret     = ""
  config.access_token        = ""
  config.access_token_secret = ""
end

lines = nil

# ファイルに保存してあるツイートを一旦読込み
File.open("/home/tsu-nera/gtd/journal/twitter.org", "r") do |file|
  lines = file.readlines
end

# ツイートを配列に挿入
client.user_timeline("tsu_nera").each do |tweet|
  t = tweet.created_at.dup.utc.localtime
  lines << "** <#{t.strftime("%Y-%m-%d %H:%M")}> #{tweet.text}\n"
end

# 重複除去
lines.uniq!

# 書き込み
File.open("/home/tsu-nera/gtd/journal/twitter.org", "w") do |file|
  lines.each do |line|
    file.puts line
  end
end

以下のような感じで保存される.

** <2015-08-22 22:43> 投稿テスト
** <2015-08-22 22:23> twitterの投稿をorg-agandaからみることができるかどうかテスト
** <2015-08-22 21:51> clojureを写経してばかりいるけど、自分で一からかける気がしないなぁ。
** <2015-08-22 19:21> test
** <2015-08-20 21:59> 名言を書き溜めてEmacsからランダムに参照するというライフハック。https://t.co/DYmuvM3Faq
** <2015-08-16 23:19> courseraの講義受けて同じようにアルゴリズム取引に挑戦したけど、全く儲からずに泣いている自分がここにいます。 / “自家製プログラムでアルゴリズム取引に励む個人投資家 - WSJ” http://t.co/VzE8Rl9aTc
** <2015-08-10 01:06> ドラクエ3の性格占い、しあわせものだった。
** <2015-08-09 22:17> 集中力がおちたと最近とても感じる。
** <2015-08-09 20:51> clojureで為替レートを取得する処理を書いてみた。https://t.co/lUgKXdfp2o
** <2015-08-09 14:45> walkcar http://t.co/xakyqwcqid
** <2015-08-09 14:42> walkcarほしい。会社の通勤使いたい。これで遅刻しなくてすむ。https://t.co/Tu0trSq4tf
** <2015-08-09 13:34> ニューラルネットワークによる自動作曲。信じられない…。http://t.co/WD2NAwFXxN
** <2015-08-08 14:22> 最近、無駄についつい本を買って積ん読してしまう。でも、FXで湯水のごとくお金がなくなっていくので、もうどうでもいいやと思えてきた。
** <2015-08-08 05:58> @kanata_56 違う言語を学ぶと見える世界も変わりますね。
** <2015-08-08 04:00> ネストの深さは悪しきものだと思っていたが、今はカッコの深さがカッコいいと思う今日この頃。
** <2015-08-08 01:33> もう3か月も仕事でプログラミングしてない。こんな状態が続くなら畜生転職だ。
** <2015-08-08 01:29> 今週も仕事が暇で辛かった。
** <2015-08-06 19:19> かった!よむ! http://t.co/306Ai5M6LF
** <2015-08-04 04:19> 4時なのに眠れない。明日の会社のC言語テストはズタボロだな。
** <2015-08-03 23:16> ランボー怒りのシャワー浴びよ

このファイルを org-agenaの対象ファイルに指定する.

(setq org-agenda-files '("~/gtd/main.org"
                         "~/gtd/inbox.org"
                         "~/gtd/journal/journal.org"
                         "~/gtd/journal/twitter.org"
                         "~/gtd/habits.org"))

これで、org-agenda view をみると、 twitterのコメントが時間つきで表示されているのだ.

なにができるようになったか

以前, org-journalに書き溜めたコメントを org-agendaでみるハックを書いた.

今回、twitterのつぶやきが org-agendaで見られるようになった. このことによって、

  • 公開したいつぶやきは、twitterへ
  • 非公開のつぶやきは、 org-journalへ

というように分けることができるようになった. どちらの書き込みにも、ミニバッファから投稿できるようにした.

twitterをミニバッファ経由での書き込みにするには、以下の記事を.

org-journalへミニバッファからコメントを書くには、 以下の関数を呼べばいい.

(defun org-journal-from-minibuffer (x)
  "write from minibuffer"
  (interactive "sEnter message: ")
  (let ((tweet-message
         (concat "** " (format-time-string org-journal-time-format) x "\n")))
    (write-region tweet-message nil
                  (concat org-journal-dir org-journal-file-format) 'append))))

これで、個人のつぶやきをミニバッファから書き溜めて、 org-agendaという統一 viewで閲覧することができるようになった.

以上、Happy Hacking!!

08 Aug 2015, 10:54

xmobarに org-clockの状態と時刻を表示する超コネタ

org-clockと xmobarを愛用しているひとのための超コネタ.

org-clockの状態を xmobarに表示します.

clock状態を表示する

以下のスクリプトをまずは用意して、パスの通った場所におく.

  • xmobar-clocking-monitor.sh
#!/bin/bash
if [[ $(emacsclient --e '(org-clocking-p)') == 't' ]] ; then
    echo "<fc=grey,#000000>"
else
    echo "<fc=white,#ff0000>"
fi

.xmobarrcの設定はあとで書きます.

clocking時間を表示する

以下のelispを書くと、現在の時間をファイルに吐き出してくれる.

(display-time)
(defun esf/org-clocking-info-to-file ()
  (with-temp-file "~/tmp/clocking"
    ;; (message (org-clock-get-clock-string))
    (if (org-clock-is-active)
        (insert (format "org: %d (%d/%d) min"

                        (- (org-clock-get-clocked-time) org-clock-total-time)
                        org-clock-total-time
                        (org-clock-get-clocked-time))

                )
      ) ;;(org-clock-get-clock-string)
    )
  )
(add-hook 'display-time-hook 'esf/org-clocking-info-to-file)

.xmobarrcの設定

以下のように設定を書く. これで、xmobar上に、clock状態と clocking時刻が表示される.

Config { font = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"
       , borderColor = "black"
       , border = TopB
       , bgColor = "black"
       , fgColor = "grey"
       , position = TopW L 90
       , lowerOnStart = True
       , persistent = False
       , commands = [ Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
                    , Run Memory ["-t","Mem: <usedratio>%"] 10
            -- , Run Swap [] 10
                    , Run Battery ["Bat0"] 600
                    , Run Com "xmobar-clock-monitor.sh" [] "orgClock" 10
                    , Run Com "sh" ["-c", "cat ~/tmp/clocking"] "orgShow" 10
                , Run Date "%a %b %_d %Y %H:%M:%S" "date" 10
            ]   
       , sepChar = "%"
       , alignSep = "}{"
       , template = "%cpu% | %memory% | %battery% }{ <fc=#ee9a00>%date%</fc> %orgClock%clock</fc> %orgShow%"
       }

以上、Happy Hacking!!

08 Aug 2015, 07:45

org-clockでのタイムトラッキングを絶対に忘れない方法

Emacs org-modeの org-clocking機能は、 とても便利なタイムトラッキングツールで気に入っている.

しかし、よく時間をはかるのを忘れる。なんとかできないかと考えたお話.

時間をはかっていないとgntpでデスクトップ通知

時間計測中かどうかは、org-cloking-pという関数で分かる. この真偽を5秒ごとに監視して、時間計測をしていなかったらデスクトップ 通知をウザったく出すことにした.

EmacsでGrowlデスクトップ通知をするには、以下のライブラリが使える.

以下のように設定を書いた. What are you doing??

(defun org-clocking-alart ()
  (unless (org-clocking-p)
    (gntp-notify 'alert "What are you doing!!"
                 "You should start clocking ('・_・`)"
                 "localhost")))
(run-at-time t 5 'org-clocking-alart)

これはウザい….(‘・_・`)

clock-in / out でも通知

ついでに、clockin,out時にも通知がでるようにした. これはいい.

(add-hook 'org-clock-in-hook
          (lambda ()
            (gntp-notify 'alert "Clock In"
                         "Happy Hacking! (^o^)/"
                         "localhost")))

(add-hook 'org-clock-out-hook
          (lambda ()
            (gntp-notify 'alert "Clock Out"
                         "Good Job!"
                         "localhost")))

clockin で 時間見積り

ついでについでに、clock-inするときに、時間見積りを必ずするようにした.

(add-hook 'org-clock-in-prepare-hook
          'my/org-mode-ask-effort)

(defun my/org-mode-ask-effort ()
  "Ask for an effort estimate when clocking in."
  (unless (org-entry-get (point) "Effort")
    (let ((effort
           (completing-read
            "Effort: "
            (org-entry-get-multivalued-property (point) "Effort"))))
      (unless (equal effort "")
        (org-set-property "Effort" effort)))))

以上、Happy Hacking!!

02 Aug 2015, 10:25

elscreenでeshellを開く小技

elscreenでeshellを開く小技を思いついた.

やりたいこと

elscreenで別タブを開いて、そこに新規にeshellを立ち上げたい.

elscreen-diredやelscreen-wlはあるのに、eshellはなかった.

必要なもの

別のシェルを新規に起動するために、multi-eshellを利用する.

設定

これで、 C-c t bで やりたいことが実現できる.

(require 'multi-eshell)
(setq multi-eshell-shell-function '(eshell))
(setq multi-eshell-name "*eshell*")

(defun elscreen-esh ()
  (interactive)
  (elscreen-create)
  (multi-eshell 1))
(global-set-key (kbd "C-c t b") 'elscreen-esh)

おわりに

最近 eshellをほとんど常用中.

eshell-zがでてきて最近ますます便利になった.

zshよりもeshellだよね!

以上、Happy Hacking!!

31 Jul 2015, 06:19

SDNについて調べたまとめ

SDNについてしらべてみましたので、記事にまとめました.

Software Defined Network(SDN)とは

  • Data Planeと Control Planeを分離したネットワーキングアーキテクチャ
    • Data Plane: programmable switch
    • Control Plane: controllers
  • ネットワークの構成、機能、性能を一つの高レベルの ソフトウェアでコントロールすること

SDN登場の背景

3つのテクノロジーによって進化が起こった!

  • Central Network Control
  • Programmable Networking
  • Network Virturization

Central Network Controlの研究(1980~)

大規模な分散するルータを管理するために, 「データ転送(Data Plane)」と「経路制御(Control Plane)」 の機能を分離するという技術、考え方が必要となった.

-> Control Planeと Data Planeの分離の考え方へ.

ネットワークのProgrammable化の登場(1990~)

ネットワーク研究のプロトタイプ作成のために、 容易に機能追加できるための柔軟で拡張性のある仕組みが必要となった.

  • ヘッダ解析
  • アクセスコントロール
  • フォワーディング
  • バッファリング、マーキング…

-> ソフトとハードの両面からアプローチが進む. ソフトで実現するとパフォーマンスが遅いので、 いろんなプロトコルに素早く対応可能なハードウェアが必要となった.

Network仮想化(1990~)

一つの物理インフラの上に論理的なネットワークトポロジを作ること。 このことにより、物理インフラを共有することが可能になった. また、仮想化することでカスタマイズしやすくなった.

-> サービスをインフラストラクチャから分離するという考え方へ.

SDN のメリット

  • ネットワークデバイスの振る舞い(ポリシー)を調整しやすい.
  • 変化に素早く対応できる.
  • ベンダー非依存.マルチベンダを一元管理.
  • ネットワーク機器のコモディティ化.
  • ネットワーク機器のソフトウェア化.

SDNのアーキテクチャ

Control と Data Planeの分離.

  • Control Plane(経路制御) フォワーディングの振る舞いを制御するロジック
  • Data Plane(データ転送) Control Planeのロジックにしたがってデータを転送するもの

両者の分離によって… -> 独立した進化と開発が可能 -> ソフトウェアから高次の制御が可能となる.

  • NorthBound API アプリケーションやオーケストレーションシステムが ネットワークをプログラムするためのインタフェース
    • ベンダー依存がなくなる
    • Python, Rubyなどの簡単な言語が利用できる.
  • SouthBound API
    • ハードを制御する抽象インタファース
                        ---
Controller Applications  |
======================   |
   NorthBound API        | Control Plane
======================   |  
  Controller Platform   ---
======================   |  
   SouthBound API        | Data Plane
======================   |
  OpenFlow Switches      |  
                        ---

OpenFlow

SDNを実現するための代表的なOSS.

  • OpenFlow コントローラ … 経路制御を司る
  • OpenFlow スイッチ … データ転送機能を司る
  • OpenFlow プロトコル … NorthBound API.

OpenStack(Neutron)

  • ネットワークのマルチテナントを実現する.
  • テナントごとにボリシーを適用.

参考リンク

以上の内容は、以下の講座からの抜粋です.

  • coursera: Softwre Defined Networking

https://www.coursera.org/course/sdn1

Software-Defined Network(SDN)とは何か?

5分で絶対に分かるSDN

5分で絶対にわかるOpenFlow

OpenStack Neutronとは何か?

29 Jul 2015, 10:10

FXシストレプログラム AWSでサーバ借りてデビュー

OANDAのREST APIを利用して、 コツコツとFXシストレプログラムをつくってきたのだけれども、 今回ついに、AWS上でデモトレードデビューをした.

ソースコードは公開しています. 誰かの参考になれば…

戦略

以下の売買ルールで勝負した.

仕掛けシグナル

  • 5秒足、25, 75の SMAでクロスしたら売買

仕掛けは、シンプルなロジックで.

手仕舞いシグナル

  • 4回 25, 75の SMA線がクロスしたら手仕舞い
  • 5pip損したら損切り
  • 5pip儲かったら、+1pip or -0.5pipずつ利確の上限を増やしていく. たとえば、5pip儲かったら6piと4.5pippに利確条件を増やす.

動的に利確の条件を増やしていく方法は、 多くのバックテストで、好成績を残した.

他にも、ボリンジャーバンドを利用した手仕舞いや、 線形回帰を利用した手仕舞いを試したのだけれども、 いまいちよい成績がでなかった.

結果

12時間のフォワードテストの結果、-450円!!

今後に向けて

さて、本番環境を試そうとししたところ、 本番口座のパーソナルトークンで通信してもエラーしか帰ってこない.

手順どおりにやってもダメ. サボートに問い合わせてもダメ. なにやってもダメ.

なんと、こんなところでくじけることになろうとは! 今までの努力はなんだったのだろう??

追記

結局、自分のバグだった. チャンチャン.

19 Jul 2015, 23:58

Pythonのユニットテストツール unittestを使ってみたメモ

Pythonのユニットテストツールである unittestをいじって見たのでご紹介.

最も簡単な例

以下に、シンプルなテスト実行手順を書く.

  • unittestライブラリをインポート
  • unittest.TestCaseを継承したクラスを作成
  • test_のプレフィクスをもつメソッドを作成
  • self.assertEqualでテストアサーションを宣言
  • 末尾に unittest.main()を書く

コード: test_hello.py

import unittest

class TestHelloUnitTest(unittest.TestCase):

    def test_add(self):
        actual = 1 + 1
        expected = 2
        self.assertEqual(expected, actual)

if __name__ == '__main__':
    unittest.main()

実行結果

$ python test_hello.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

詳しい説明

アサーション

アサーション関数は以下が用意されている. どれもassertXXXXという形をしているが、Equalさえしっていれば大抵はOK.

  • assertEqual(a, b)
  • assertNotEqual(a, b)
  • assertTrue(x)
  • assertFalse(x)
  • assertIs(a, b)
  • assertIsNot(a, b)
  • assertIsNone(x)
  • assertIsNotNone(x)
  • assertIn(a, b)
  • assertNotIn(a, b)
  • assertIsInstance(a, b)
  • assertNotIsInstance(a, b)

前処理と後処理

各テストの前処理でしたいことがあるときは、setUpメソッドに処理を書く.

各テストの後処理でしたいことがあるときは、tearDownメソッドに処理を書く.

class TestHelloUnitTest(unittest.TestCase):
   def setUp(self):
        pass

   def tearDown(self):
        pass

テストケース、メソッド指定でのテスト

テストケース(クラス)を指定して、実行したいときは、以下ののようにして書く.

$ python -m unittest スクリプト名.テストケース名

メソッドを指定したいときは、以下.

$ python -m unittest スクリプト名.テストケース名.メソッド名

Emacsならメソッド指定でテストできるよ!

Emacs を利用すれば、メソッド単位で簡単テスト実行可能.

実行したいテストケースの上で M-x python-test-function .

以上、Happy Hacking!!

19 Jul 2015, 06:57

夏休みの自由研究 は OANDA APIを利用して FX システムトレード

夏休みの自由研究として、FX システムトレードをしようと画策中. この記事は、そのスナップショット.

やったこと

OANDA API 、とくに oandapyを利用して、 Pythonから 為替取引ができるようにした. oandapyは python3 で動作するようにフォークした

Dukascopyからヒストリカルデータをダウンロードして(これは手動)、 そのデータを利用して、バックテストを実施. バックテストの結果を matplotlibでグラフ化.

損益のグラフ

移動平行線のクロスで売買するグラフ

参考にしたコード

一人ではとうていできないので、以下のコードを参考にした.

MT4との比較

メリット

  • 好きな言語が使える

    OANDA APIは REST APIなので、どんな言語でも使える. 自分は Python!

  • Linux環境で動作

    Linux環境で動作することで、Amazon AWSの EC2上で動作させることができる.

  • Pythonのデータ解析ライブラリがつかえる

    Pythonを利用しているので、Pythonの便利なデータ解析ライブラリを 利用することができます. Numpy, Pandas, Scipy, Matplotlib…

    ta-libなんという、テクニカル指標に特化したライブラリもある.

デメリット

  • バックテストのデータを自分で用意する必要がある.
  • プラットフォームを自分で実装するのが大変.

    MT4プログラミングはMT4というプラットフォームのおかげで、 用意にコーディングやテストができたけれども、 OANDA APIを利用すると、自前ですべてプログラミングしないといけない.

今後の予定

ようやく動作しそうな?ベースができたので、 これから取引のロジックを考えていこうと思う. ここからが本当の自由研究!

以上、Happy Hacking!!

18 Jul 2015, 11:30

Python3で進捗表示するライブラリ progressbar2

アプリをつくりながらPythonを勉強中.

今日は、Queueから一つずつオブジェクトを取り出して処理するときに、 進捗表示ができたらいいなと思い、そういうライブラリを探してみた。

progressbarというライブラリができそうなのだが、python3では動かなかった.

困っていたら、以下を見つけた. Python3で動作することを確認.

インストール

pipでインストール.

[sourcecode language=”bash” title=””]
$ sudo pip install progressbar2
[/sourcecode]

使い方

Exampleページを参考にいくつか試す.

基本の使い方

<div class="outline-text-3" id="text-orgheadline3">
  [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221;]<br /> from progressbar import ProgressBar<br /> import time</p> 

  <p>
    p = ProgressBar(100)
  </p>

  <p>
    for i in range(100):<br /> p.update(i+1)<br /> time.sleep(0.01)<br /> [/sourcecode]
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> 100% (100 of 100) |###############################| Elapsed Time: 0:00:01 ETA: 0:00::0<br /> [/sourcecode]
  </p>
</div>

Queueサイズ分の進捗表示

<div class="outline-text-3" id="text-orgheadline4">
  [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221;]<br /> from progressbar import ProgressBar<br /> import queue</p> 

  <p>
    q = queue.Queue()
  </p>

  <p>
    for i in range(12345):<br /> q.put(i)
  </p>

  <p>
    p = ProgressBar(q.qsize()).start()
  </p>

  <p>
    for i in range(q.qsize()):<br /> q.get()<br /> p.update(i)
  </p>

  <p>
    p.finish()<br /> [/sourcecode]
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> 100% (12345 of 12345) |###########################| Elapsed Time: 0:00:00 Time: 0:00:00<br /> [/sourcecode]
  </p>
</div>

おわりに

自分で車輪の再発明をする前に、 ネットでOSSが転がっていないか探すことが大事だと実感.

ほしいものは、大抵おちてる、それがオープンソースの世界.

以上、Happy Hacking!!