Elm 0.14に際して思ったこと

Elm 0.14がリリースされました。 今回のリリースには後方互換性が保たれない、大きな変更が含まれてます。 これによりHaskellとの違いが大きくなったため、もはや「Haskellベースの言語」という表現はふさわしくないかも知れません。 ところで、このような大…

Elmはそもそも誰が作ってるの?【Elmアドベントカレンダー2014 7日目】

これはElm Advent Calendar 2014の7日目です。 社内勉強会でElmを紹介したら、 ボス「Who is creating Elm language ?」 私 「えっ?」 ボス「Elmって誰が作ってるの?」 というわけで調べてみました。 メイン開発者はPreziの中の人 Elmコンパイラに一番多く…

Elmで青春のフラクタルを描画する【Elmアドベントカレンダー2014 6日目】

これはElm Advent Calendar 2014の6日目です。 Elmの優れた点と言えば、 Haskellベースの静的型関数型言語 Functional Reactive Programming 強力なレイアウト機能 などがまず挙がるでしょう。しかし、 図形描画ライブラリ も、実はElmの長所の一つなのです…

ElmとHaskellの6つの非互換性【Elmアドベントカレンダー2014 3日目】

これはElm Advent Calendar 2014の3日目です。 ElmはHaskellベースの言語なので、Haskellの記事や入門書もElmの学習に使えます。しかし、実はElmにはチョコチョコHaskellと違うところがあって互換性はありません。 相違点をElm公式サイトLearnの SyntaxとFAQ…

ソースに一行追加するだけで実行時にバイナリをバルスできるモジュールを書いた

バズーカが弾切れ、絶対絶命のピンチ、メガネの小悪党がmain関数を実行する前に実行ファイルを削除したいというのはよくあることです。 使用例 たとえばこういうコードに・・・ // get.go package main func main() { println("ハハハハハ!飛行石を手に入れ…

ElmのインストールとHelloWorldのコンパイル【Elmアドベントカレンダー2014 2日目】

ElmはPlaygroundで簡単にコードを試せますが、最終的にはelmコマンドでコンパイルする必要があります。 0. バイナリをインストール MacとWindowは、公式サイトのInstallから、 バイナリをダウンロードできます。 しかし、LinuxではHaskell Platformを使って…

Elmとはどんな言語か?その7つの特徴【Elmアドベントカレンダー2014 1日目】

これはElm Advent Calendar 2014の1日目です。 Elmはクライアントサイド向けの関数型言語です。一体どんな言語なのでしょうか? 1. HTML/CSS/JSにコンパイルされる ElmはHTML/CSS/JSにコンパイルして使用します。 この辺はJavaScriptにコンパイルされるAltJS…

~/.bashrcは何も出力してはいけない(するならエラー出力に)

知ってて当たり前の超凡ミス。 起こったこと:rsyncが失敗する rsyncが何故か失敗してしまう。"protocol incompatibility"と出ていますが、--protocolオプションを指定しても、最新版のrsyncをインストールしても、同じエラーが出ます。なぜでしょう? Tue N…

Goplay: Goで手軽に書捨て環境を作るツール

Go

goreの説明を追記。 LLから、Goに移るときの不満の一つに「標準のREPL(インタラクティブシェル)が無い」があります。 「ポインタはmapのキーになるんだっけ?」のような、つまらない(けど、ありがちな)疑問を解消するには、ドキュメントを漁るより、コー…

Go-GTKでCUIとGUIをつなぐ的なアプリを書いてみた

Go

プログラマーは往々にしてCUI世界の住人なのですが、 ごくたまに、ファイルをドラッグ&ドロップで指定できると便利、ということがあります。 doloopwhile/dap · GitHub スクリーンショット インストール go get github.com/doloopwhile/dap 使い方 ドラッグ…

Goライブラリを作ったら、とりあえずgodocdown

Go

小さなGoライブラリをつくった時、ほとんど自分しか使わないような規模なら、わざわざREADMEに「Usage」「Example」「Functions」なんて書くのは面倒ですよね。 そんな時は、godocdownで自動生成してしまうのがオススメです。 godocと同等の内容をGitHub用Ma…

地味に待ち遠しいDockerの新機能

DockerfileのENV コマンドで、複数の環境変数を一度に指定できるようになるらしい。 Allow ENV to set multiple variables in one layer · Issue #2333 · docker/docker · GitHub 従来は複数の環境変数を設定するには、ENVを繰り返さなければなりませんでし…

Goでも独自型をrangeしたい!chanを使う

Go

Pythonでは__iter__メソッドを定義すれば((Rubyでは.eachメソッドを定義してEnumerableをincludeすれば、C#ではGetEnumerator()メソッドを定義すれば、 PHPではIteratorを実装すれば))、 晴れて独自のコレクション型でも、foreach文などでループできるように…

Goによるデザインパターン - Strategy パターン (2)

Strategy設計の失敗 前回で、HTMLとテキストでレポートを出力するコードを書きました。その中でFormatter interfaceを定義し、その具象型としてPlainTextFormatter HTMLFormatterを定義するというStrategyパターンを採用しました。 しかし、気になる点が無い…

Goのinterface - 使う側で定義する

Goのinterfaceは「使う側」が定義するもの 前回Formatter interface、Formatterを使ってレポートを出力するReport struct、 Formatterの実装PlainTextFormatterとHTMLFormatterを定義しました。 type Formatter interface { OutputStart() OutputHead(text s…

Goによるデザインパターン - Strategy パターン (1)

例:レポートを出力するクラス。 レポートをHTMLで出力するstruct*1を作ったあなた。上司からプレーンテキストでも出力してくれと言われてしまいました。とりあえず、フォーマットを引数で指定するようにしたのですが・・・ *1:レポートの内容はフィクション…

ただ動くだけのdockerコンテナを作る

DBもapacheも何も要らない、空っぽのdockerコンテナが欲しい。 ただし、1度起動したら、docker stopするまで起動しっぱなしでいて欲しい。 回答 pseudo-tty付きのBashを走らせれば良いようです。 docker run -itd base bash -c "bash --rcfile <(echo \"trap…

補遺:ECMAScript6を使うのは5年ぐ(略)+なぜTypeScriptではないのか?

前回の「ECMAScript6を使うのは5年ぐらい時期尚早だった」が舌っ足らずで、はてぶでコメントがついていたので補足 trasuerを使えば後で移行できる・・・とは限らない koba04さん Traceur使ってES6で書いておくとそのまま移行出来るメリットはあると思う http…

ECMAScript6を使うのは5年ぐらい時期尚早だった

新製品のWEB UIを作ることになりました。 「functionって書くのダルいから、CoffeeScriptにしましょうよ」 「でもCoffeeScriptって、そろそろオワコンじゃないか?」 「ちょっと待てよ、そろそろES6(ECMAScript6、JavaScriptの次期標準、後述)が使えるよう…

Golangビルド時に、サブパッケージ内の変数をいじる

Go

mainパッケージに変数を埋め込みたいとき Goで作ったアプリで --version 用にバージョン番号とビルド日時を埋め込みたい。 そんな時、-ldflagsを使えばいいのはwell-knownだと思います。 go build -ldflags=" -X main.compiled 'ビルド日時' -X main.version…

なぜCLIツールはGoで書くべきなのか? Go beyond Python

Go go

「Goは興味あるけど、会社は(Python|Ruby|PHP|Perl|Java|C#)だからなぁ」というあなた。 個人的なCLIツールを、Goで書き直してみたらいかがでしょう? GoはLL並に書きやすいだけでなく、LLには無い優れた特徴を兼ね備えた言語なのです。 上記は、自社のGo la…

Goで高速にLog10を計算する

数値を右揃えあるいは0詰めして表示するのはまれによく遭遇するタスクです。 fmt.Printfには出力幅を指定する機能がありますが、幅をいくつにとればよいか、 言い換えれば「一番大きな数値の、桁数はいくつか?」は、プログラマーが計算しなければなりません…

GoからVimを起動する

Go

「VimからGoを」ではありません。 CLIツールに設定ファイルをエディタで開く機能(git config --editのような)をつくろうとしたところ、上手く行きません。exec.Command("vim").Run() で vimを起動しようとしても、exit status 1で失敗してしまうのです。 …

pecoでgit rebase -i

peco/pecoでgit rebase -i のrebase先を選択するコマンドを作りました。 git-rebase-i-peco: select rebase -i target 私の場合、commit --fixupとrebase -iが「マウスでコミット番号をコピペしがち&よく使うコマンド」の双璧なので、これでマウスレス・Git…

pecoでgit commit --fixup

peco/pecoがそこそこ流行っているみたいなので、 git commit --fixup の fixup先を選択するコマンドを作ってみました。 git-fixup-peco: select fixup target with peco これで、git log してコミット番号をマウスでコピペする必要がなくなりました! # 実は…

cgoを試す(Goから./jqを呼ぶ)

Go

Go言語には、C言語のコードを呼べるcgoという機能があります。 「json版sed」の./jqの機能を呼んでみます。 jqを選んだのは、 * ./jqはコマンド自体はそこそこ有名 * Go言語から直接呼べれば役にたつ(かもしれない) * APIが単純 * mrubyやImageMagickのよ…

direnvで解決するGOPATHの3つの問題点

Go

GOPATH 問題 Gophers! 周知のようにgoはGOPATHで依存パッケージをどこにインストールするか決められます。 入門記事などでは、~/.bashrcや~/.zshrcの中で export GOPATH=$HOME/gocode または export GOPATH=$HOME とすることが多いようです。 しかし、GOPATH…

pyenvオワコン、direnv最強

社内勉強会で発表しようと思ったけど、寿司の運搬という重大任務を仰せつかって、流れてしまったスライドを転載 direnv is an awesome successorof ***env's. from Kenji Omoto (なお原稿では乱立する"***env"をマスコミは「目があって角が2本」としか認識…

PythonのitertoolsをGoで実装してみた

Go

Just a practice. go-itertools イテレータの代わりにchan intを引数に取るようにしました。 int型しか受け付けないし、nth repeat などの単純な関数しか実装していません。 しかし、個人的な気付きがいくつか: 送信側(ch <- xする側)で、全データを送り…

Gomの「指定バージョンをチェックアウトする機能」だけ取り出したコマンドを作ってみた

Go

https://github.com/doloopwhile/gocheckout 使用例 martiniのバージョン0.1を使いたいとき、 gocheckout github.com/go-martini/martini v0.1 なぜ作ったか? 周知の通り、Go本体にはRubyのBundlerのような、依存ライブラリのバージョンを指定する仕組みが…