Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

テディベア効果

プログラミング作法というカーニハンの名著があります↓コレ*1

プログラミング作法

プログラミング作法

エンジニアな人たちにとって、原因不明なバグや想定外の障害に頭を悩ませることは日常茶飯事のことと思います。そのような状況に陥った時、この本が教えてくれるのは、まずテディベアに相談しなさいということでした。以下引用

自分のコードを誰かほかの人に説明して聞かせるのも効果的なテクニックだ。こうすると自分自身インバグが見えてくることが多い。場合によっては説明し始めた途端に気がついて「あ、もういいや、変なところがわかったよ。ごめん、ごめん」などと言って照れくさい思いをすることもある。このテクニックは意外なほど有効だし、聞き手は別にプログラマでなくてもかまわない。ある大学の計算機センターのヘルプデスクのそばにはテディベアのぬいぐるみが常備されており、摩訶不思議なバグに悩む学生は、人間のスタッフに相談する前にぬいぐるみに向かって説明しなければならないことになっていた。

さて、年末も押し迫ってきて、やらないといけない瑣末なこと、とてもやりたい重要なこと、がたくさんあって混乱してくる。特に専門的なことでやりたいことを家族等に話していると「お前は何を言ってるのかさっぱりわからない」と言われるのだが(そりゃそうだ)頭を抱える悩み事を一方的にしゃべるだけで「ごめんわかったもういいや」となるのであった。他人様にはさぞ迷惑なことだろう。

というわけで今後「(専門的な)悩み事はテディベアに向かってしゃべるように、まず、はてな日記に書きましょう!」と自戒をこめてメモしておきます。

*1:こういう本こそKindle Storeで200円で売ってくれ

アマゾンでポチった本

Kindle Store でセールをやっていたので思わずポチったもの↓全部、紙の本を持ってるけど、古い名著を1冊200円程度の古本価格で電子書籍にしてくれるなら持ってても買う。

↑今なら200円!
デイトレード マーケットで勝ち続けるための発想術

デイトレード マーケットで勝ち続けるための発想術

一番上にある「人生一手の違い」は、昔、米長邦雄の講演会を聞きに行ったら貰った本で今でも本棚に置いてあります。当時の米長邦雄は51歳で「誰か知らんけど、かっこよくて爽やかなおっさんだな〜」なんて思いました。(失礼ですみません)

わたくしは将棋も囲碁もどちらも指せませんが、この本は面白かった。

後半部分で囲碁棋士藤沢秀行についての章があります。孔子は「七十にして心の欲する所に従えども矩を踰えず」と論語にありますが、藤沢秀行は「心の欲するままに矩を踰えて」生きる人で、本書ではその人となりが紹介されていて、とても魅力を感じました。真似はできませんが。「さすがディオ!おれたちにできない事を平然とやってのけるッ そこにシビれる!あこがれるゥ!」って感じでしょうか。

あと、印象に残っているのが「空気が濁る」という章です。要約すると、組織に空気を濁す人(=勝負に対する緊張感に欠ける人)がいると、いずれその組織は活力が失われ、堕落した集団になるという話です。

・・・などなど、米長邦雄は電王戦などで今でも有名ですし、この本は将棋知らなくても読めるので、古い本ですが Kindle 持ってる人は200円でポチって損はないと思いますよ!

どうでもいいはなし

かなり長〜い間、さくらインターネットレンタルサーバーを借りていました。が、今年になってうっかり更新するのを忘れて解約になっちゃいました。

外部の WWW サーバーとか使わないし、まあいいか、と思ってたけどよく考えたら、Subversionリポジトリも置いといたのだった。今、スクリプト修正してチェックインしようとして出来なくて気がついた��(゚Д゚)ガーン

全部趣味プログラムのコードとはいえ、そこそこの量&期間のコードが置いてあったんだったっけ・・・なんて悔やみつつ、失ってしまったドメインである rocky.sakura.ne.jp をふと見にいきました。

板橋区にある障害者施設のホームページになっていました。へー・・・まぁこれはこれでよかったかも。rocky という名のサブドメインにふさわしいな、なんてね。

つか Subversionリポジトリどこにつくろう・・・Git で作りなおしてもいいけど、GitHub はプライベート利用は有料だしなぁ、なんて思いながら検索したら無料でプライベートリポジトリ作れるとこあった。
http://codebreak.com/
あとで使ってみる。

LANケーブルを自作してみた

サーバー機がうるさいので隣の部屋に移したいのだけど、LANケーブルのプラグが通るほど大きい壁穴が開いていない。そこで、ケーブルだけ通してから後付でプラグをつけようと思いたち、いまさらながらLANケーブルの自作にチャレンジしてみました。今回買ったのはこれです。

レビュー

無事に届いたLANケーブル自作セット↓テスターに使う9V電池は別途購入する必要があるので揃えておきましょう。

ケーブルをちょん切り、コードをほぐします。以下のようにコードを並べて先をニッパーで揃えます。

薄橙色 橙色 薄緑 水色 薄茶色 茶色

プラグを圧着ペンチで付ける。

テスターで、1から8まで通電できればオーケーです。できあがり!!

NG集

・・・なんて簡単にできればよいのですけど、実際は3時間くらい悪戦苦闘しました。残骸↓

付属のケーブルはすぐに出来たのだけど、既存のケーブルを利用しようとすると、線が太いのか何度も失敗、挫折しました。明日にでも別のケーブルで試してみる。でもプラグだけは、高価でも別途ロードバー付きプラグ購入した方が良いと思いました。

SANWA SUPPLY ADT-6RJ-10 カテゴリ6RJ-45コネクタ

SANWA SUPPLY ADT-6RJ-10 カテゴリ6RJ-45コネクタ

VBA から ruby のコードを実行したい

色々と調べて、結局、実運用には難しそう・・・と思っているのだけど、却下したアイデアでも、思考の流れを残しておかないと、数年後には忘れて同じことをやりはじめそうな悪寒がするので、そうならないように日記に書いておきます。

やりたいこと

秒間で更新される Excel Worksheet 上の数値を使って ruby で計算したい。Win32ole は使わない方向で。あ、VBA から ruby スクリプトを呼ぶだけなら Shell 関数でできます。

方針

Worksheet が更新されるタイミングで、socket 通信をして ruby にデータを流し込む。VBA からの socket 通信は、winsock.dll を使いたくないので、ruby製 のクライアントを呼び出す。できるだけお手軽に。

準備

こちらから↓ ActiveRuby をダウンロード&インストールします。ActiveRuby にする理由は、ScriptControl を使いたいから。
http://www.artonx.org/data/asr/

Excel のオプション - 参照設定で、ScriptControl 1.0 にチェックを入れます。

スクリプト

require 'socket'
require 'thread'

svr = TCPServer.open(123456)
puts "server is running..."

while true
  Thread.start(svr.accept) do |s|
    puts s.gets
    s.close 
  end
end
  • tcpclient.rb
require 'socket'

def client(s)
  sock = TCPSocket.open('localhost', 123456)
  sock.puts(s)
  sock.close
end

とりあえずのテストとして、Excel の Worksheet にボタンを貼り付けて、こんな感じに↓。

Private Sub CommandButton1_Click()
    Dim script As New ScriptControl
    
    script.Language = "RubyScript"
       
    fn = FreeFile
    Open "(pathto)\tcpclient.rb" For Input Access Read As fn
    script.AddCode StrConv(InputB(LOF(fn), fn), vbUnicode)
   
    script.Run("client", "testdata")    
End Sub

問題点

遅いのひとこと。うーんどうしたものか。

スタティスティカル・アービトラージ

エクセルマクロが使えるという Surface Pro のキャンペーン中っぽいので日記書いてみた。キャンペーン↓

Windows/Office武勇伝Surface Proが当たる! 開発者グループOPENキャンペーン>

キャンペーン終わり

さて・・・随分前に Kindle Paperwhite で買った続マーケットの魔術師

続マーケットの魔術師 (ウィザードブックシリーズ)

続マーケットの魔術師 (ウィザードブックシリーズ)

やっとエドワード・ソープの章まで読み終わりました。エドワード・ソープとは数学者としてブラックジャックに確率論を持ち込んだ、現代の金融工学の祖ともいえる人物です。ちなみに以前日記で「ラスベガスをぶっつぶせ」という映画を紹介しましたが、そのモデルになった人で株式投資の世界でも有名です。

さて、上述の本では、昔、ソープが株式投資で使っていた手法、スタティスティカル・アービトラージについて紹介されています。スタティスティカル・アービトラージとは、直近四半期で、最も下落した株の買いと最も上昇した株の空売りをほぼ一致させる、オプション取引でいうところのデルタヘッジを行うことです。

とても単純な手法なんですけど「スタティスティカル・アービトラージ」でグーグル先生に問い合わせると、まともな情報がまったく出てこないので、「スタティスティカル・アービトラージ」でググった時、このエントリーが一番上にでてくるよう日記を書いた次第でございます。しばらくしたら「スタティスティカル・アービトラージ」でググりますのでよろしくお願いいたします。大事なことなので3回言いました。あ、あとついでに Surface Pro も当ててください。

スタティスティカル・アービトラージを検証するためちょろっと書いたコードをおまけで貼り付けておきます。一人で研Qしていて公開するつもりのないコードなので汚いですがご了承願います。スクリプトを動かすには、前回の日記で書いた営業日計算のコードを'eigyoubi.rb'として保存し、適当な銘柄のコード(ここでは日経225)を '225.txt' として用意しておきます。

require "jpstock"
require './lib/eigyoubi.rb'

h = {}
e = Date.today
s = Date.today.business_days_before(25)

codes = open("225.txt","r").read.split("\n")
codes.each do |code|
  prices = JpStock.historical_prices(:code => code.to_i, :start_date => s, :end_date => e)
  down = (prices[0].close.to_f / prices.map {|price| price.close}.max - 1) * 100
  up   = (prices[0].close.to_f / prices.map {|price| price.close}.min - 1) * 100
  h[code] = [down, up]
end

cmin = h.min_by{|k,v| v[0]}
cmax = h.max_by{|k,v| v[1]}

puts "下落率トップ #{cmin[0]}, 下落率 #{cmin[1][0]} 期間(#{s}~#{e})"
puts "上昇率トップ #{cmax[0]}, 上昇率 #{cmax[1][1]} 期間(#{s}~#{e})"

四半期だと長すぎるので、とりあえず一ヶ月で計算したところ

下落率トップ 9501, 下落率 -20.307692307692303 期間(2013-08-12~2013-09-15)
上昇率トップ 1801, 上昇率 33.509234828496034 期間(2013-08-12~2013-09-15)

お漏らし電力を買って、オリンピック銘柄を売れ、とのご神託が出ました。。。

    • -

投資は自己責任です。ここに掲載しているデータは、その正確性を保証するものではありません。ここに掲載しているデータを参考にして発生した、いかなる損害・損失にも当方は責任を負いません。投資は自己判断でお願いします。

X営業日前の日付を求める ruby スクリプト

ある銘柄の株価の移動平均を求めたい場合、期間を指定して株価データを取得することが多いです。この時、たとえば、25日分の株価データが欲しいなんて思った場合、単純に25日前の日付を求めるのではなく、営業日ベースで日付の計算をする必要があります。

この営業日の計算、なんか何度も同じことやってる気がするので、忘れないようにダイアリーにメモをしておきます。

準備

祝日判定ライブラリの holiday_japan をインストールします。株価情報を弄りたい人は JpStock もインストールしましょう。

gem install holiday_japan
gem install jpstock

X営業日前の日付の計算

こんな感じで↓

require "holiday_japan"

class Date
  def business_days_before(i)
    date = self
    i.times.each do |j|
      date -= 1
      date -= 1 while (date.wday <= 0 || date.wday >= 6) or (date.national_holiday?) 
    end
    date
  end
end

東京電力の25日間の終値の平均

↑のコードを使ってこんな感じで↓

# -*- coding: utf-8 -*-
require "jpstock"
prices = JpStock.historical_prices(:code => "9501", :start_date => Date.today.business_days_before(24), :end_date => Date.today)
average = prices.inject(0) {|sum, price| sum + price.close} / prices.size.to_f

puts "東京電力の#{Date.today.business_days_before(24)}から#{Date.today}(#{prices.size}営業日間)の終値の平均 = #{average}"
# => 東京電力の2013-08-07から2013-09-10(25営業日間)の終値の平均 = 560.96