$yanutetsu->{blog}

プログラマ三大美徳なPM

GAE/Goのデバッグをエレガントに!

やぬてつです。

この記事はGAE/Goで頑張っている人をターゲットにしています。

GAE/Go良いですよね。GAEももちろん良いですし、Golangも良いですよね。よってGAE/Go最強ですね!

ところで、GAE/Goでデバッグはどうやっていますか? 色々やり方あるのかもしれませんが、結局のところPrintデバッグですよね?

それでいっぱいfmt.Println("hoge")って書きますよね? まーコピペするからそれほど面倒ではないと思いますけど?

でもどこまで処理が通過したかとか確かめるときに

fmt.Println("hoge 1")
...
fmt.Pirntln("hoge 2")
...
fmt.Println("hoge 3")

とかやって、あ、hoge 1 と hoge 2の間だな、ってなった時に

fmt.Println("hoge 1")
...
fmt.Println("hoge 1.1")
...
fmt.Pirntln("hoge 2")
...
fmt.Println("hoge 3")

fmt.Println("hoge 1.1")とか入れ始めちゃいますよね。これを始めてしまうともう収拾がつかなくなってきます。

そこで、デバッグプリントを出力する際にファイル名と行番号を出力するモジュールを作りました。:tada:

github.com

基本的にfmt.Printfmt.Printlnfmt.Printfの実装を真似しています。package を debug にしているので使う時にfmtdebugに書き換えるだけで使うことができます。例えばさっきのソースコードならこんな感じになるかと思います。

package main

import "github.com/yanutetsu/go-debug"

debug.Println("hoge 1") //  => hoge.go:5 hoge 1
...
hoge := "piyo"
debug.Pirntf("%s\n", hoge) // => hoge.go:8 piyo

ファイル名と行番号を表示してくれるので、Print文の内容に迷わずエレガントにデバッグできますね。

debug.Printを使ってGAE/Goライフをもっと楽しみましょう!

※詳しい使い方はGitHubのソースを読んでね!

P.S. fmtパッケージのソースコードはめっちゃ為になるので読んだようが良いです。

1年間どんな英語の勉強をしてきたか

やぬてつです。

英語 Advent Calendar 2017の3日目の記事です。

私の英語勉強の内容を記事にします。 ターゲットは英語を勉強したいけど何からしたらいいのかわからない方、英語が苦手だけど英語でコミュニケーションを取りたい方などの英語学習初心者を対象にしています。

目的(動機)

「英語を話したいから」ですね。

もっと飾らないで言うと「英語喋っている人カッコイイ、僕も喋りたい」ですね。

しっかりと勉強を始めたきっかけ

普段はプログラマとして働いています。あるプロジェクトで一緒になったco-workerが英語大好きで英語の得意な方でした。彼が英語が得意で様々な最新ドキュメントを英語で読んで理解しているのをみて、ますます英語をやりたいなーと思っていました。

そんな時に彼が

「やぬてつさんは英語やらないんですか?」 「え?じゃあやろうかな?」

てな感じではじめました。

学習方法

いろいろ英語学習をして挫折してきた私にとっては、もう、本当に何をやったらいいのかわからないので、英語の得意な彼に何をやればいいのか訪ねてみました。その時に彼が「コレだけやればいいですよ」って教えてもらった本があります。

それが「どんどん話すための瞬間英作文トレーニング」です。

中学英語を基本に日本語から英語を瞬間的に発声する訓練をするタイプの教材です。とにかくこれだけを諦めずに繰り返すことだけを続けました。

熱しやすく冷めやすいタイプなので、勉強したい熱が冷めるとすぐに辞めてしまうのですが、今回は違います。隣に英語の得意な彼が座っていて、朝出社すると「英語の進捗どうですか?」って聞いてくるんです。これがとても良くて、必ず毎日勉強をする習慣になりました。あとは彼が「こればっかりやってました。まずはこれだけやればいい」という実際に成果を示した説得力のある言葉を身近に聞いていたので、それを信じて続けることができました。 そしてトレーニングに書いてある方法で勉強を続けて「どんどん話すための瞬間英作文トレーニング」をほぼ完了しました。

その次にはじめたのが「スラスラ話すための瞬間英作文シャッフルトレーニング」です。 これは先程の教材の英文をランダムに配置してあるものです。これでより実践的にな瞬間英作文の回路を作ることができます。 すでに学習の習慣を身に着けていたので、こちらもトレーニング方法に従って、トレーニングを終了することができました。

瞬間英作文をやっているうちに、英文法の重要性に気が付きました。まずはまとまった英文法の勉強をしたほうが、今後の英語学習が効率的になると悟ったので、英文法書を1冊読みました。「一億人の英文法 ――すべての日本人に贈る「話すため」の英文法」これをやりました。あんまり受験勉強っぽくないので、話すことを目的としている人におすすめです。面白かったです。

次は「みるみる英語力がアップする音読パッケージトレーニング」です。 瞬間英作文で自分の言いたいことを少し表現できるようになってきたし、英文法もそこそこできるようになってきたし、今度はヒアリングとアクセントを強化したいと思ってはじめました。こちらはリピーティングとシャドウイング、音読というトレーニングを繰り返していきます。 この教材はまだ1サイクル終了したところで、まだ完了していません。ですが、これをはじめてからかなり発音がよくなったと思います。

あとは、自分の専門分野でのGoogle Cloud Platformのブログ記事を読むようにしています。英語で読むと発表された日に最新の情報を得ることができるので、英語の勉強にも技術の勉強にもとても良いです。

成果

「だいぶ良くなってきている」と感じています。

勉強を始めるきっかけをくれた彼はプロジェクト解散後接点が少ないのですが、英語を話せるco-workerが新しくくわわったので、その人に英会話の相手をしてもらっていると「言いたいことはわかる。だいぶ良くなってきた。」と言っていました。

なのでやはり少しずつですが良くなっているんだと思います。

まとめ

続けているとそのうち使えるようになりそう

golangで人類に優しいログを出力する

やぬてつです。

この記事はEmacsGolangを書いている人をターゲットとしています。ですがsnippte部分以外はEmacsとは関係ないです。

Golangを書いていると構造体を出力したい時がありますよね。 そんなときには fmt.Printf("%+v", hoge) なんかで出力すると思います。 確かに構造体を出力してくれるんですが人類には読みにくいです。 なので、pretty print して人類でも読める形にしたーいって思います。 でも、third-partyのライブラリを入れるのはメンドクサーイですよね?

なので、jsonのライブラリを使って出力してみましょう! StackOverflow

x := map[string]interface{}{"a": 1, "b": 2}
b, err := json.MarshalIndent(x, "", "  ")
if err != nil {
    fmt.Println("error:", err)
}
fmt.Print(string(b))

これをsnippetに登録してシュッと使えるようにします。

# -*- moode: snippet -*-
# name: pretty print by json.MarshalIndent
# key: ppjm
# --
b, err := json.MarshalIndent($0, "", "  ")
if err != nil {
    fmt.Println("error: ", err)
}
fmt.Printf("\x1b[34m%s\n\x1b[0m", string(b))

これで簡単にログ出力ができます。

やったー\(^o^)/

Happy Coding

EmacsのCompanyでYasnippetを連携させてスニペットを補完させる

やぬてつです。

この記事はEmacs+Company+Yasnippet+golangを想定しています。

EmacsGolangを書いていて補完はcompayに任せています。 Golangはこんな感じの処理をよく書きます。

if err != nil {
  return err
}

なので、これをyasnippetを使って登録してしまいます。

スニペットを使えて、楽になったなーって思っていました。

ですが、スニペットが増えてきたり、他の言語に行って戻ってきたりすると、どんなスニペットがあったか忘れてしまい、スニペットを最大限に利用することができなくなってしまいました。

なのでcompanyとyasnippetを連携させましょう!

調べてみたら以下のところに記述がありました。

github.com

これをgo-modeのhookに記述することで、companyがyasnippetを保管してくれるようになりました。

golangでエラー処理を毎回書くのがめんどくさい

EmacsでGoを書いている人をターゲットとします。

スニペットで解決

# -*- moode: snippet -*-
# name: if err fatal
# key: ief
# --
if err != nil {
    t.Fatal(err.Error())
}

↑これをgo-modeに配置すれば

ief

if err != nil {
  t.Fatal(err.Error())
}

が展開されるよ

EmacsでGolangをエレガントに開発する

やぬてつです。

この記事はEmacsでGo開発をしている人を対象としています。

「あーもう少しエレガントにGolangの開発がしたいなー」

皆さんそう思いますよね。

特に、テストを書いている時に、バッファを切り替えるのがメンドクサイくて、キーバインド一発で切り替えたいですよね?よね?

はい、だから、プログラムファイルとテストファイルをトグル表示するコマンドを作成しました。

(defun file-name-sans-extension-underbar (filename)
  (save-match-data
    (let ((file (file-name-sans-versions (file-name-nondirectory filename)))
      directory)
      (if (and (string-match "_[^._]*\\'" file)
           (not (eq 0 (match-beginning 0))))
      (if (setq directory (file-name-directory filename))
          (concat directory (substring file 0 (match-beginning 0)))
        (substring file 0 (match-beginning 0)))
    filename))))

(defun file-name-extension-underbar (filename &optional period)
  (save-match-data
    (let ((file (file-name-sans-versions (file-name-nondirectory filename))))
      (if (and (string-match "_[^._]*\\'" file)
           (not (eq 0 (match-beginning 0))))
          (substring file (+ (match-beginning 0) (if period 0 1)))
        (if period
            "")))))

(defun go--counterpart-name (name)
  (let ((ext (file-name-extension name))
        (base (file-name-sans-extension name)))
    (if (equal ext "go")
        (let ((ext2 (file-name-extension-underbar base))
              (base2 (file-name-sans-extension-underbar base)))
          (if (equal ext2 "test")
              (concat base2 ".go")
            (concat base "_test.go")))
      (concat base ".go"))))

(defun go-open-testfile ()
  (interactive)
  (find-file (go--counterpart-name (buffer-file-name))))

(define-key go-mode-map (kbd "C-c C-c") 'go-open-testfile)

基本的にはAngularのファイルを開くコマンドを作ったときと同じです。

だいぶエレガントになりましたね。

まとめ

みなさんもエレガントなEmacsで、どんどん開発スピードを上げていきましょう!

プログラマのためのGoogle Cloud Platform入門

やぬてつです。

プログラマのためのGoogle Cloud Platform入門読みました。

https://www.amazon.co.jp/dp/4798137146/

GCPについて簡潔に記述されていてとてもわかり易かったです。

公式ドキュメントとか読んだりして、GCPのそれぞれのサービスについてはそれなりに知っているけれども、実際にこれらをどのように組み合わせて一つのサービスを提供するところまで持っていったらいいのかよくわからない、というプログラマにはもってこいの書籍です。

説明の深さが本当に絶妙で、これ以上深く説明されると普通のプログラマはついていけなくなるかもしれないけれど、これより簡単にしたら結局GCPで何ができるの?という状態になってしまうという、本当にちょうどよい説明の詳しさでした。

各章毎に説明パートと実践パートに別れていて、理解したところをすぐに実践するというスタイルがとてもやりやすかったです。常にPCを開きながら+本を読みながらキーボードを叩くの大変だけど、ある程度は読み物で、途中からPCを叩くというスタイルなので、勉強場所や時間を確保しやすかったです。

GCPに興味があるけれど何からはじめたらいいかわからないというプログラマは是非読んでみてください。