Released Gosh 0.2.0

Golang用の対話形式シェル Gosh0.2.0 をリリースしました。

前回のブログ(Interactive shell for Golang)の時は、 0.1.5 でしたので、そこからの変更点をまとめると次の通りです。

  • main関数の宣言を省略可能にしました

  • 型および関数の宣言のパーサーの機能強化しました

  • 関数宣言の再宣言可能にしました

  • Go 1.2のサポート廃止しました

  • 各種バグの修正

などです。実装としてはregexpパッケージの正規表現から、go/scanner, go/tokenパッケージを利用した字句解析に変更しています。

main関数の省略

README にも記載していますが、簡単に紹介します。

Goshの実行方法

$ $GOPATH/bin/gosh

fmt.PrintlnでのHello world

>>> fmt.Println("Hello world")
Hello world
>>>

変数の宣言と演算

>>> var i = 10
>>> i++
>>> fmt.Println(i)
11
>>>

省略形式の変数宣言でも大丈夫です。

>>> i := 10
>>> i += 100
>>> fmt.Println(i)
111
>>>

パッケージのインポート

Goshを作ったそもそもの動機である、パッケージのインポートはもちろん使えます。 次は github.com/bitly/go-simplejson を使った場合の例です。

>>> import "github.com/bitly/go-simplejson"
>>> r, _ := http.Get("http://d.palmtb.net/_static/glaneuses.json")
>>> defer r.Body.Close()
>>> j, _ := simplejson.NewFromReader(r.Body)
>>> fmt.Println(j)

表示は省略しましたが、simplejson.Json型のデータが出力されます。

main関数の宣言のリセット

>>> func main(){}

とするとmain関数の宣言を省略して宣言した変数はクリアされます。

fmt.Print*の実行は一回のみ

fmt.Println("hello") などを実行後、その後に他の入力を続けても、最初に実行された fmt.Println("hello") は実行されないようにしました。つまり、次のようになります。

>>> i := 1
>>> fmt.Println(i)
1
>>> i++
>>> fmt.Println(i)
2

既知の問題

  • main関数を入力した後、Enterをもう一度入力しないとプロンプトが表示されない 1

    • 0.2.2 で修正しました(2015-01-14追記)

  • 型の再宣言ができない

余談

前のブログでは matsuu さんの tweet やHacker Newsへの 投稿 でかなりStarsがつきました。海外の方が多いのは結構モチベーションが上がりますね。matsuuさん、ありがとうございました。

あとは、実際に使ってissues登録やpull requestしてくれる方が出てくると嬉しいですね。

Footnotes

1

上記の例で空白行を掲載しているのはそのためです。

Aspiration of the 2015

あけましておめでとうございます。今年もよろしくお願いします。 1

今年の抱負

今朝見た初夢は

  • 仕事の前に昼飯のつもりで買ったケーキが、ホールで一人で食べきれずに諦めて持って帰ることにして、外に食べに行ったらやたら混んでいて、通された席がトイレの前で辛い

  • 泳いでいたら、プクプクみたいなのに棘を口から吹きつけられて、刺さってチクチク痛い

というよく分からん内容でした。とりあえず食べ過ぎと怪我には気をつけろ、ということなんでしょうかね。また、元日早々、おまめ二号の風邪がうつり、喉が痛かったり、おまめ二号の風邪も長いので 2

「家族皆健康第一」を今年の抱負にします。

KPT

その他細かい目標は以下。

Keep

  • 7-16時勤務の朝型生活

  • 毎日コーディング

Problem

  • Debianの活動が減っているので無理ない程度に増やす 3

  • 英語使う機会減ってるのでまず習慣化する

  • おまめ一号とのコミュニケーションを改善する 4

Try

  • おまめ一号のDebianデビュー&妻にPython教える

  • 中断したHaskellの勉強の再開&何か作る

  • 4月からおまめ一号の幼稚園でさらに支出が増えるので、収支の改善方法を検討&実行する

Footnotes

1

昨年は喪中でしたので書きませんでした。

2

昨年11月末にRSウィルス感染症で気管支炎が重症化して入院したので、風邪引くと咳や痰が続くのです…。

3

昨年は大統一Debian勉強会を結局できなかったし…。

4

まだ3歳前にもかかわらず、「パパ嫌い」とお風呂一緒に入るのを嫌がられているで、そう言われないように…。

Review the 2014

今年は昨年と違って(Review the 2013 and aspiration of the 2014)、 余裕があったので年内に振り返りをしてみました。

抱負であった「健康第一」に対して

今年も昨年同様「健康第一」を抱負にしていました。10月に5年ぶりくらいに右肩脱臼してしまい、今もリハビリを続けてはいるものの、昨年に比べると体調が良く、病院に行く回数も非常に少なかったので達成できたと実感できる一年でした。これは2月の次女出産に伴う生活の変化が大きな要因でした。 1

次女(おまめ二号)の誕生と生活の変化

昨年の11月末に妻が切迫早産の危険が出てきたため、寝たきりにさせる必要がありました。結局、出産後の1ヶ月頃(2月下旬頃)までは長女(おまめ一号)は保育園の一時保育もしくは妻の両親に預かってもらい、在宅勤務をする、という生活を送っていました。

おまめ二号が産まれてからは、朝5-6時頃に起床し、ラジオ体操と朝食以外は、出勤で9時頃家を出るまでの間、昨年目標にした朝のコーディングを続けていました。

10月中旬頃から、諸事情により生活習慣と仕事のやり方を変える必要が出てきました。現在は、3時から4時半ごろに起床、早朝コーディングと朝食の後、5時半過ぎには出勤、7-16時を定常勤務として、17時過ぎには帰宅、21-22時には家族皆で就寝、という生活になりました。

この生活リズムに変更したことによるメリットは次の4つです。

  • 体調が良くなった

  • 子供たちと接する時間が増えた

  • 仕事の効率が良くなった

  • 朝のコーディングの時間が増えた

特に仕事面では、7時出勤だとほぼ他に人がおらず、一人で集中できる時間がとても長いので、とてもおすすめです。

仕事

今年行った割と効果の高かった内容としては、

あたりでしょうか。

Debian

今年の活動としては、

あたりです。少ない…。

プログラミング

年初にGolangの勉強を行ってから、Python以外でGolangでコーディングすることが増えました。 年末現在、プライベートではGolangとPythonの比率だと7:3くらいになりました。仕事でもEC2上で使うツールには、デプロイの関係上Golangで書いたりしています。しかし、前述の脚注の通り、仕事ではPythonとDjangoで開発に使う言語とフレームワークを統一したので、もっぱらPython漬けです。

年初に目標にした、早朝コーディングは大晦日現在毎日続けており、今年のGitHubのContributionsは下記のようになりました。

../../../_images/github-contributions-2014.png

昨年が閑散たる有り様でしたので、結構良い状況です。

../../../_images/github-contributions-2013.png

コーディング時にハマるケースが少なくなったり、実装に掛かる時間が短くなったり、などの実感の違いが出てきている気がします。 6

その他

ブログ書かなくなったなーという。ブログ書くより、コード書く方が楽しいからなんですけどね。

まとめ

まとめなし、オチ無し。来年の抱負は年明けに。

Footnotes

1

昨年の年始の段階では「諸事情」としていました。

2

開発に使う言語とフレームワークを、Pythonと、Djangoおよびdjango REST frameworkに統一したため。

3

Debianパッケージ版のオートビルドシステムをちょっとカスタマイズして、GitHub Enterprise、Jenkins、devpi & devpi-ldapを連携して作った簡単なお仕事です。

4

Debianには直接関係ないのですが、今年初めて家族を連れてOSCに参加しました。

5

SurfのDebianパッケージ化しようとしていましたが、Build-Dependsで必要なBSON用のライブラリが含まれるMongo用のドライバのビルドが通らない問題でJessie入りは断念しました。

6

個人の感想です

Interactive shell for Golang

Golang用の対話形式シェル Gosh を作りましたよ、というお話です。

Golangでコードを書き始めた今年の年初くらいから、iPythonのような対話形式のシェルがほしいなと思っていました。気になるライブラリをちょっと試してみたいときに、 go get して、Emacsでコード書いて、 go run を実行する、というのは億劫で、 import したらそのまま go get して実行できれば良いな、と思っていました。 そういったツールが無いかと調べて、go-evaligoGo playground 1 にはたどり着いたのですが、パッケージをインポートする機能がないので自分の欲しい機能とは違う、ということでエイヤっと作ってみました。

特徴

現在の特徴としては次のとおりです。

  • Go 1.2 以上対応

  • 対話形式のシェル

  • package main の入力省略可 2

  • 標準ライブラリの import 省略可

  • 標準ライブラリ以外のライブラリの import3

  • import 文の重複入力を無視

  • import しても未使用のパッケージを無視

  • Ctrl + d で終了

やっていることとしては、単に入力したコードからを、一時ファイル作って go run を実行するだけの簡単な内容です。

インストール方法や使い方は、 README を読んでください。

今後

  • main() を入力しないと実行できないので省略できるようにする

  • タブ補完

  • DebianパッケージなどでシステムグローバルにインストールしたGolangライブラリなどの import を省略できるようにする

などを考えています。良かったら使ってみて下さい。

Footnotes

1

ブラウザで実行したいわけではないので、Go Playgroundだと更に自分のほしいのと違うのですよね。

2

入力を省略できる、というか、入力するとエラーになります。 修正しました。(2014-11-18 追記)

3

import example.org/foo/bar のように実行すると、 go get します。

Changed to JetDrive 420

普段プライベートではMacBookPro 8,2 1 でVirtualBox上で、Debian GNU/Sidを使っています。購入時に128GB SSDに変更したのですが、パッケージメンテナンスしたり、コード書いたり、家計簿つけたりしているSidだけで90GB-100GBくらい使っていて、そろそろ容量増やしたいなと思っていたら、今年の春にTranscendから JetDrive が出ました。

出た当初はまだ高いなぁ、と思って様子見していましたが、最近チェックしたら 480GBのJetDrive 420が約20%価格ダウン していたので、価格動向見て今が買いどきだな、ということで購入しました。

交換方法

一応、日本語で書かれたマニュアルも添付しているのですが、かなり端折っているので、上記の製品ページの動画を見るのがベストです。90GB弱の使用率で128GBのSSDをリストアするのに要した時間は約1時間半強でした。寝ている間か、風呂かメシ食っている間にやるのが良いですね。

私の使っているモデルのMacBookProの場合、裏蓋を開けるのには少し注意が必要でした。ネジがそれぞれ垂直ではなく、少し斜めになって止められています。気づかずに付属のドライバーでまっすぐ回そうとすると、ねじ山を潰してしまいます。また、ネジを全て外し終わっても、裏蓋自体も外しにくいので、少し隙間を開けたら、本体からまっすぐ持ち上げるのがよいでしょう。

こま毛に気をつけろ!

裏蓋を開けてびっくりしたのは、こま毛だらけだったことです!どうやって、こんな奥にまでこま毛が入ったものかというくらい、結構入り込んでいました。あ、こま毛ってのは、こまちゃん 2 の毛のことです。早朝、朝練や家計簿つけていると餌をねだりにやってきてます。定時 3 よりも早かったら、後でね、と放置プレーしているとMacBookProの背後に回りこむ、あいつの毛です。ハンドクリーナーとガムテープで丁寧に取っておきました。

まとめ

特に技術ネタも何もないお話でした。ポイントは、「こま毛に気をつけろ!」ということです。容量増えてとりあえず一安心ですね。

Footnotes

1

15-inch Early 2011, MC721xx/Aを英語キーボード、ノングレア液晶ディスプレイ、128GB SSD, Memory 8GBにしています。

2

久々に登場の我が愛猫こまめさん。

3

朝晩とも6時が餌の定時。