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までのファイルしか読み込めない
結構悩んだのでメモ。あるmap
やslice
など、何かしらのデータの入った変数をファイルとして書き出して、後で利用したいことがたまにあります。
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
が巨大になると、ファイル生成はされるのですがdecode
でinvalid message length
というエラーが出てうまいこと動きません。(自分の環境では、11000*11000
の行列を入れたら動きませんでした。)
最終的に、encoding/gob
のソースコードを読むことで解決しました。
https://golang.org/src/pkg/encoding/gob/decoder.go
ブログにBSDライセンスの条項どうやって載せるのかわからなかったのでソースコードは載せませんが、要するにオーバーフローしないように読み込むファイルのサイズを1GBに制限するよ!といった内容がコメントで書かれています。
なぜファイル生成はできて読み込みはできないのか(´・ω・`)
中のTODO
コメントでlimit
のコントロールについての言及もあるのですが、今の所Go言語上から制限を外すことはできなさそうです…もしできるのであれば知りたい。あるいは他のもっといい方法があるのでしょうか。
以前も紹介したMarxico
が想像以上に使えますね。ソースコードの整形までやってくれるとは思いませんでした。
Yosemiteに入れたアプリ
前回の続きです。取り敢えず最低限な感じで自分に必要なソフトを入れました。
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 lock
をCtrl
に割り当てることもできます。
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に完全に支配されている。検索エンジンのみならず、ブラウザ、IME、Android、Chromebook、将来的には車の自動運転やら原義通りのアンドロイドやら出てきそうな勢い。
別にGoogle嫌いではないし、むしろ好きな企業の1つですが、あまりに一方的だと面白くないという判官贔屓で、Googleに代わる代替サービスを考えてみました。自分が使っているサービスだけで考えています。
-
- Bing…マイクロソフトの検索サービス。純粋に規模で太刀打ち出来るのはもはやここだけでは。
- DuckDuckGo…新興の検索サービス。ユーザーをトラッキングしないことを公約しており、ネットストーキングが気になる人におすすめ。日本語にも一部対応している。
インターネットブラウザ
- Firefox…クロスプラットフォーム+オープンソースなブラウザ。GNU/Linuxなんかだとデフォでこれか、Iceweaselが入ってることが多い気がする。収入源がGoogleなのが気になるところ。
- Opera…プロプラだがクロスプラットフォーム。
-
- ATOK…プロプラな上にクロスプラットフォームではないが、変換精度的にこれくらいしかない。IBus…
カレンダー
メール
- Outlook…またマイクロソフトのサービス。Gmailがメールの中身を見るよ!と言っていることに対抗して、メールの中身は見ないよ!とわざわざウェブサイトまで立ち上げているのは有名。
- Yahoo mail…言わずと知れたサービス。日本版のヤフーメールはGmail以前に利用していた人も多いのでは。
結論
書いてて思いましたが、やはり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. プロット
完成イメージです。試しにカシオ(6952)の株価推移をプロットしてみました。
コードはGitHubに上げておきました。変に説明するよりコードを見たほうが早いと思います。
株価のプロットだとハマりやすいのは、市場が休みの時に日付が飛んでしまうということだと思います。調べてみると、そのものズバリなFAQがmatplotlibの公式にありました。
やはり皆考えることは一緒か…。
これからこれらのデータを使いながら株価予測の真似事みたいなことができればいいなと考えています。