done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

Go言語でのSet(集合)型について

Pythonとかではset型が標準でありますが、Go言語には標準ではなさそうなので調べてみたら便利なライブラリが見つかったので簡単に紹介。

使い方は以下のような感じです。

package main

import (
    "fmt"

    "github.com/deckarep/golang-set"
)

func main() {
    list := []int{1, 2, 3, 4, 5, 2, 4, 6}
    set := mapset.NewSet()
    for _, v := range list {
        set.Add(v)
    }
    fmt.Println(set)               // Set{1, 2, 3, 4, 5, 6}
    fmt.Println(set.Cardinality()) // 6
}

最初set型の長さ(要素の数)の取り方がわからなかったのですが、Cardinalityで良さそうです。

Go言語のencoding/gobは1GBまでのファイルしか読み込めない

結構悩んだのでメモ。あるmapsliceなど、何かしらのデータの入った変数をファイルとして書き出して、後で利用したいことがたまにあります。

Pythonならpickleなどを使いますが、Go言語ではencoding/gobという標準ライブラリを使うと似たようなことができるみたいです。

例えば、以下のように書くとmapをファイルとして保存し、後で読み出せます。

package main

import (
    "encoding/gob"
    "log"
    "os"
)

func main() {
    testmap := map[int]int{
        1: 10,
        2: 20,
        3: 30,
    }
    encodeFile, err := os.Create("test.gob")
    if err != nil {
        log.Fatal(err)
    }
    defer encodeFile.Close()
    encoder := gob.NewEncoder(encodeFile)
    if err := encoder.Encode(testmap); err != nil {
        log.Fatal(err)
    }
    log.Println("Done!")
    // Decode start
    newMap := make(map[int]int)
    decodeFile, err := os.Open("test.gob")
    if err != nil {
        log.Fatal(err)
    }
    defer decodeFile.Close()
    decoder := gob.NewDecoder(decodeFile)
    if err := decoder.Decode(&newMap); err != nil {
        log.Fatal(err)
    }
    log.Println(newMap) // Will print like this: map[3:30 1:10 2:20]
}

それはいいのですが、上のコードで言うtestmapが巨大になると、ファイル生成はされるのですがdecodeinvalid message lengthというエラーが出てうまいこと動きません。(自分の環境では、11000*11000の行列を入れたら動きませんでした。)

最終的に、encoding/gobソースコードを読むことで解決しました。

https://golang.org/src/pkg/encoding/gob/decoder.go

ブログにBSDライセンスの条項どうやって載せるのかわからなかったのでソースコードは載せませんが、要するにオーバーフローしないように読み込むファイルのサイズを1GBに制限するよ!といった内容がコメントで書かれています。

なぜファイル生成はできて読み込みはできないのか(´・ω・`)

中のTODOコメントでlimitのコントロールについての言及もあるのですが、今の所Go言語上から制限を外すことはできなさそうです…もしできるのであれば知りたい。あるいは他のもっといい方法があるのでしょうか。


以前も紹介したMarxicoが想像以上に使えますね。ソースコードの整形までやってくれるとは思いませんでした。

Yosemiteに入れたアプリ

前回の続きです。取り敢えず最低限な感じで自分に必要なソフトを入れました。

GUIなアプリケーションのみで、CLIは含んでいません。

Google Chrome

なんだかんだいって外せません。そういえば最近ChromeのアプリでMarxicoというアプリを入れました。雰囲気はhttp://marxi.co/を見れば掴めるかと思います。 後でも紹介するEvernoteと連携するMarkdownエディターで、リアルタイムでプレビューできて、書いた文章を直接Evernoteに入れることができる優れもので、便利に使っています。括弧の補完など基本的な機能も揃っています。

Evernote

上でも紹介したアプリです。説明不要でしょうが、要は高機能なメモアプリです。 GNU/Linuxでもネイティブのアプリがあったり、ブラウザ上でも編集できるので便利です。

SpiderOak

最近試し始めたばかりです。Dropboxの対抗馬で、全ての段階(オンラインでもオフラインでも)ファイルを暗号化してくれるサービスです。エドワードスノーデンさんが宣伝していたことでも有名ですね。参考記事: http://jp.techcrunch.com/2014/10/13/20141011edward-snowden-new-yorker-festival/

Skitch

Evernoteの連携アプリの一つで、画面キャプチャを撮ったり撮ったキャプチャ画像を編集したりできます。

Xcode

これが無ければHomebrew入れることもできないので必須ですね。実は使ったことないのですが、Swiftの評判がよいので近々触ってみようと思っています。

Seil

Mac miniのキーボードにはREALFORCE91UBK-Sを使っているのですが、標準では変換キー/無変換キー(スペースキーの両横のキー)が使えません。そこで、Seilを使ってIMEの切り替えキーに割り当てています。Unix系のOS触る人はCtrlキーをAの横に配置する人が多いようですが、Seilでcaps lockCtrlに割り当てることもできます。

BetterSnapTool

有料アプリですが、WindowsのAero Snapに慣れた人はこれを入れるとすごく便利です。ウィンドウの最大化や、画面右半分に寄せることなどが簡単に行えます。

iTerm2

Mac標準のターミナルエミュレータも十分に使えますが、こちらの方が高機能です。(正直まだ使いこなせてはいませんが・・・)


今入れているアプリはこれくらいです。また便利なアプリを見つけたら紹介したいと思います。


ところで、Mac mini Late 2014 + Yosemiteで今ちょっと不具合があります。スリープから復帰したときに

  • 何回かパスワードを入れなければならない
  • 一回パスワードを入れると画面が白くなり、インジケーターがでて少し待たされる
  • 通常画面に戻ってからも、画面が崩れるなど非常に使いづらい

といった不具合が出ます。再起動すれば治るのですが、とてもめんどくさい・・・

OSのアップデートで改善されることを祈ります。

Yosemiteを入れてからやったこと(クリーンインストール)

Mac miniが2年ぶりにやっとアップデートされたので買ってきました。某掲示板では結構酷評ですが、自分は今の所満足しています。Yosemiteでの環境構築を一から書いてみます。

homeの暗号化

Mac標準のFileVaultを使用します。システムの環境設定→セキュリティとプライバシー→FileVaultでディスクの内容を暗号化できます。結構時間がかかるので、これが暗号化が完成するまでは重要なファイルなど入れないほうが無難でしょうか。

ファイアウォールの有効化

初期状態ではなぜか切れているので、onにしておきましょう。システムの環境設定→セキュリティとプライバシー→ファイアウォールでonにできます。

Spotlightでの位置情報と検索データの送信の無効化

こちらの記事を参照。記載してあるようにSpotlightの検索候補ブックマークと履歴Bing Web 検索の3つをオフにします。もっと気になる人はSpotlight自体を無効化してしまうといいかも知れません。(それ以上に気になる人はMac使わないでしょう・・・)

アップデートのチェック

AppStoreを使ってMacのアップデートを確認しておきます。

ウイルス対策ソフトのインストール

最近はMacと言えど安心できません。何かしら入れて対策しておくべきでしょう。自分はなんとなくSophos Antivirus for Macを入れています。

他に入れたソフトはまた後日まとめます。


Yosemite結構いいですね。フラットデザインは割と好きなので、アイコンとかかなり好みです。

GNU/LinuxやWindowsに入れたいフリーソフト

特にGNU/Linuxとかだと割りと頻繁にOSセットアップすることがあるので、個人的によく使うソフトを書き出してみます。

GNU/Linux (Ubuntu)

ド定番ですね。OSを選ばず使えるのが本当に便利でよく使っています。Firefoxでもいいのですが、やっぱり最初に使い始めたほうを使い続けてしまいますね…。

やっぱり便利。というか他のだと変換精度が…。OSを選ばず使えるのが素晴らしい。

ド定番(ry OSを選ばず(ry Emacs(ry

これも定番ですね。最近分けあってbashしか使えてないんですが、やっぱりzshのほうが何かと便利。

必須。screenもよかったですが、縦分割がやっぱり便利。

ド定(ry

Windows

何も足さない。何も引かない。

脱Googleについて考えてみる

TL;DR

やっぱ無理

気がついてみると、世の中Googleに完全に支配されている。検索エンジンのみならず、ブラウザ、IMEAndroid、Chromebook、将来的には車の自動運転やら原義通りのアンドロイドやら出てきそうな勢い。

別にGoogle嫌いではないし、むしろ好きな企業の1つですが、あまりに一方的だと面白くないという判官贔屓で、Googleに代わる代替サービスを考えてみました。自分が使っているサービスだけで考えています。

結論

書いてて思いましたが、やはりGoogleが強すぎる。IMEとかブラウザとかを握られているのが辛すぎる。

WindowsだけとかMacだけとか使う人ならまだなんとかなりそうですが、どんなOSも満遍なく使って、かつどんなOSでも使い勝手は同じようにしたいって人だとクロスプラットフォームなところが重要になってくるし、そうなるとやっぱりGoogle IMEやらChromeやらが第一候補になってしまう。そしてシェア率が高いので、マイナーなソフトやサービスにありがちな面倒臭さがない。

やっぱり長いものにはまかれるしかないんでしょうか…

Matplotlibで株価の推移を時系列で表示する

株や統計の勉強を兼ねて、まずはPython3+matplotlibで株価の推移を見てみることにしました。

シンプルにX軸に日付、Y軸に株価(終値)をプロットしてみます。

1. データ

今回使用するデータはk-db.com様からダウンロードしました。 一部抜粋すると、以下の様なデータ構造になっています。

6952-T,東証1部,カシオ,日足
日付,始値,高値,安値,終値,出来高,売買代金
2014-09-19,1755,1763,1738,1750,2208200,3865487300
2014-09-18,1758,1759,1727,1747,2164400,3776886900
2014-09-17,1724,1744,1711,1740,1982300,3444411700
2014-09-16,1713,1726,1701,1711,1562700,2675582500
...

2. プロット

f:id:thekoruku:20140921224707p:plain

完成イメージです。試しにカシオ(6952)の株価推移をプロットしてみました。

コードはGitHubに上げておきました。変に説明するよりコードを見たほうが早いと思います。

株価のプロットだとハマりやすいのは、市場が休みの時に日付が飛んでしまうということだと思います。調べてみると、そのものズバリなFAQがmatplotlibの公式にありました

やはり皆考えることは一緒か…。

これからこれらのデータを使いながら株価予測の真似事みたいなことができればいいなと考えています。

参考サイト