電話番号の判定やりたくて

電話番号の判定をやりたくてつくり始めた. 一応ルールがあるらしい. 細かい解説はqiitaに存在していたので割愛する. とりあえず作り始めたやつはこれ(tel-num-parser). 使い方 参考実装です. 電話番号であるかどうかと種別が取得できます. package main import ( "fmt" tnp "github.com/ieee0824/go-tel-num-parser-jp" ) var telList = map[string]string{ "東京都庁": "03-5321-1111", "東京都庁2": "03(5321)1111", "東京都庁3": "0353211111", "国土交通省": "03-5253-4150", } func main() { for k, v := range telList { fmt.Print(k + ": ") fmt.Println(tnp.IsTelNumber(v)) } }

11月 8, 2018

Go言語でとあるinterface型の何かが特定の関数を持ってるかを調べる

Go言語でとあるinterface型の何かが特定の関数を持ってるかを調べる というタイトル的に お前は何を行っているんだ? と言われそうです. まぁ私もどう日本語で表現すればいいのだろうかってなったので例を示しましょう. 例えば次のような実装があったとします. func f() io.Reader { return 何らかのreader interfaceを満たしたやつ } golangで io.Reader といったinterfaceはとても有名で様々な場所で利用されています. 例えば os.File や bytes.Buffer などの構造体などが io.Reader をみたしたものに当たります. io.Reader の定義は次のようになっています. type Reader interface { Read(p []byte) (n int, err error) } つまり構造体が Read(p []byte) (n int, err error) みたいな関数を持っていればいいわけですね. ここで一つ問題です. os.File は利用したあと Close() 関数をよんで開放してあげる必要があります. type io.Reader だと Close() を呼び出すことができません. さてどのように解決しましょうか? 予め入ってる型のパターンが決まっている場合は簡単です. 何も考えずに型アサーションか型switchすればいけます. type hasClose stuct {} func (h *hasClose) Read(p []byte)(int, error){ return 0, nil } func (h *hasClose) Close() error { return nil } type doesNotHaveClose struct{} func (d *doesNotHaveClose) Read(p []byte)(int, error){ return 0, nil } func newReader() io....

11月 2, 2018

ECSでSQSのAPIを叩くときハマった

golangでSQSのqueueの一覧を取得しようとしたときこんなふうに書くことができる. package main import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/sqs" ) func main() { c := &aws.Config{ Region: aws.String("ap-northeast-1"), } svc := sqs.New(session.Must(session.NewSession(c))) list, err := svc.ListQueues(&sqs.ListQueuesInput{}) if err != nil { panic(err) } fmt.Println(list.String()) } このように書いた場合 github.com/aws/aws-sdk-go/aws/credentials とか github.com/aws/aws-sdk-go/aws/stscredes とかを利用していない. つまり利用されるawsのアクセス権限の元になる情報は ~/.aws 以下に設定された情報だったり ECSの場合はtaskRoleARNに設定された情報となる. 私が上記の実装をした上でdocker containerをビルドして実行したときハマったことを書こうと思う. ECSは標準出力の内容をcloud watch logsに出力することができる. 上記の実装を実行したと気次のようなエラーが出力された. For verbose messaging see aws.Config.CredentialsChainVerboseErrors panic: NoCredentialProviders: no valid providers in chain. Deprecated. はじめはtask roleにsqsのアクセス権限を忘れたことによって発生していた問題かと思ったが違った. ECS上でコンテナを動かしたとき特に何もしない場合はtask roleで設定した情報を元に権限が設定される. 実際のところ裏側ではAWS SDK側で 169.254.170.2 にアクセスしてメタ情報からクレデンシャル情報を引っ張ってくる....

10月 25, 2018

日付を推測する

フォーマットが決まっていない文字列から日付を推測するgolangのpackageを作った. fdateという. fdate の f は ふわっと(fuwatto) の f である. フォーマットが決まっていない文字列というか半角数字の羅列から日付として成り立つように組み立てるというのが正しいが. 日付として成り立つ区間の年度を1945~今の年にしてはあるが fdate.MIN_YEAR() と fdate.MAX_YEAR() を上書きすると定義を書き換える事ができる. 使用例は次のような感じである. package main import ( "encoding/json" "fmt" "log" "github.com/ieee0824/fdate" ) func main() { strs := []string{ "2018/10/21", "2018-10-20", "197211", "19720101", "19800824", "1980824", "200011", "200021232", "2010年1月1日", } for _, v := range strs { d, err := fdate.PickPossibleDate(v) if err != nil { log.Println(err) } bin, _ := json.MarshalIndent(d, "", " ") fmt.Print(v, " = ") fmt....

10月 20, 2018

スイッチをつけ終わった

無事kbdfans.cnからスイッチ部品が届いた. 今回のキーボードは赤、茶、黒軸を利用する. 本来スイッチ部品を付ける前に TRRSジャック を実装しておくべきなのだが, 忘れてたままスイッチ部品を左側だけ実装してしまった. なので部品を置く面側から無理やりはんだ付けしてしまったので部品が僅かに浮いてしまった. 少々問題はあったが無事部品の配置が終わりfwの書き込みとキーキャップの選定だけとなった. 忘れ去れたTRRSジャックの実装 キースイッチつけ終わった様子

10月 15, 2018

登山計画考えるとき思うこと

登山計画考えるときって どれくらいの行動時間か? , どういうルートをどういう時間かけて行くか? , バスの時間どうするか? , エスケープルートはどこか? , どこに水場があるか , etc… みたいなことを考える. 最近だとYAMAPとかで地図を手に入れて気軽に行動計画を建てられる. 電子化によって便利になった影響か山の上とかの電波情報とか欲しくなってる気がする. 暇だったら自分で電波map作っても面白いかもしれない.

10月 11, 2018

面実装部品つけ終わった

チップ部品つけ終わった. といっても面実装のダイオードだけだけど. スイッチ類とキーキャップ買わねばならない. あとマイコンもだ. ちなみにはんだごてはgootの RX-802 を利用している.

10月 4, 2018

キーボード組み立て始めた

キーボードの組み立て始めた. 作ってるのはergoinuです. まだ軸の方は買ってないが茶軸と赤軸を使おうと思う.

10月 3, 2018

fileのopen modeに関して

はじめに 最近というほどでもないがfileを開いて編集したあと上書きをして保存するみたいなプログラムを実装した. そのときにとあるバグを仕込んでしまったので書いておく. ファイルを開くときについて C言語とかを書いたことがある人ならわかると思うだろうが, fileを開いたときにはどういうmodeでファイルを開くかというmodeが存在する. それがGo言語だろうがC言語だろうがOSがそういうふうにできていれば関係なく存在する. 例えばGo言語でfileをreadonlyとして開くときはしばしば os.Open 関数を利用する. f, err := os.Open("適当なfile名") if err != nil { // なんかエラー処理 } ... os.Open の中身は次のようになっている. func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) } O_RDONLY がopen modeになっている. ちなみに O_RDONLY 以外はこのようになっている. mode type 意味 O_RDONLY 読み込み可 O_WRONLY 書き込み可 O_RDWR 読み書き可 詳しいいことは他の資料をあさって読んだほうがよく分かると思う. Go言語でファイルを開くときは他にもいくつか方法がある. 例えば os.Create などだ....

9月 29, 2018

計算量について

計算量とは 計算量とは、アルゴリズムを評価する指標で、どのくらい計算に時間がかかるかを表したものである. O(n) のように表記する. O は order からきており, O(n) は おーだーn のように読む. プログラマがプログラムを書く理由は, 問題を 早く , 楽に 解くためである. せっかく作ったプログラムが非現実的な時間かかってしまっては意味がない. なのでプログラムを書くときは常に頭の中に計算量を意識しておく必要がある. 計算量の概念について すごく雑に解釈するとループの回数に一致する. 次のようなプログラムがあったとしよう. for i := 0; i < n; i ++ { fmt.Println("にゃーん") } このプログラムの計算量は O(n) です. n が増加すると計算時間は線形に増加する. 次のようなプログラムはどうであろうか? for i := 0; i < n; i ++ { for j := 0; j < n; j ++ { fmt.Println("にゃーん") } } このプログラムの計算量は O(n^2) になる. 次のような場合はどうなるか? for i := 0; i < n; i ++ { fmt....

9月 27, 2018