Goでデスクトップアプリっぽいものを作るリベンジ

GXUIは日本語入力できなかった

Webアプリにも手を出してみた(※)けど、Deployが面倒で萎えた。

※ この辺の本が良かった。

JXA

そんな感じでQiitaを眺めてたら、GoでOSXのアプリを書く #golang - Qiita というのを見つけた。
要はJavaScript for Automationを使うという話。

これを参考に、WebViewだけのCocoaアプリを起動して、そこからlocalhostで立ち上げたGoのWebアプリを開けばいいんじゃないか?

https://github.com/lonnc/golang-nw が使えそうだったけど、あえて自分で作る。

JXA(という略称が正式かは知らないが)だとWebViewのHTMLがレンダリングされないという情報があったが、試してみたら動いた。JSで画面を書き換えられたりするとチラついたりもするけど、そんなインタラクティブなの作る予定はないのでよしとする。

やってみる

  • $GOPATH/src/github.com/tnantoka/webwindow/webwindow.goを作る
  • go get github.com/tnantoka/webwindow する
  • $GOPATH/src/github.com/tnantoka/cwww/main.go作る(webwindowをimport
  • cd $GOPATH/src/github.com/tnantoka/cwww; go run main.goする

後はいじれば勝手に更新もしてくれた。

そんな感じでできたのがこちら。
https://github.com/tnantoka/cwww

パッケージを作ってみたかったのでWebView部分は別レポに分けた。
https://github.com/tnantoka/webwindow

調べたこと

templateの結果を文字列で得る

http://otiai10.hatenablog.com/entry/2014/10/15/135709

var buf bytes.Buffer
t.Execute(&buf, config)
fmt.Println(buf.String())

templateの継承

https://github.com/golang-samples/template/tree/master/extends
これでいける。
bindata使うとfilesできなくなるので、parseで1つ1つ処理していった。

exit status 1でこける

// command := "osascript -l JavaScript " + f.Name()
// 2015/05/28 23:07:15 fork/exec osascript -l JavaScript /var/folders/wh/9ztn2bvs27j6x4wcds8kxkxr0000gn/T/win.js222293868: no such file or directory
// exit status 1

http://stackoverflow.com/questions/24095661/os-exec-sudo-command-in-go
sh -cでやれば行けた。

凡ミス

templfileのfはwriterなので読めないよ、改めて開かないと。

output, err := ioutil.ReadFile(f.Name())
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(output))

TODO

  • アイコン変えたい
  • アプリ名変えたい
  • osascriptやめたい
  • document
  • もっとテスト書く
  • APITokenを暗号化

わりと今回はGo書いた感あった。

今更ながらGoを始めた

前から興味はあったんだけど、ちょっとしたきっかけがあったので。
開発環境はAtomを使うことにする。

Goを入れる

$ brew install go
$ go version
go version go1.4.2 darwin/amd64

$ mkdir ~/go
$ echo "export GOPATH=~/go" >> ~/.bash_profile
$ echo 'export PATH="$GOPATH/bin:$PATH"' >> ~/.bash_profile
$ . ~/.bash_profile

Atomを入れる

https://atom.io/ からダウンロードしてインストール。
$ atomで開く。(環境変数を引き継ぐため)

go-plusとscriptを入れる。
go-plusは、GOPATHに~/goに設定し、Format Toolをgofmtに変更。

hello world

~/go/hello.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello, world")
}

Command + iで実行。

hello, world
[Finished in 2.296s]

まずはここまで。
https://www.gitbook.com/book/astaxie/build-web-application-with-golang/details でも読みながら何か作ってみるかな。

気に入ったところ

  • gofmtの問答無用な感じ良い
  • iotaおもしろい
  • unusedをエラーにしてくれるの良い(一時的にコメントアウトした時にイラッとするときもあるけど)

参考

Minimal Cocoa App

JavaScript For Automationをいじってて出会った記事。

Cocoa with Love: Minimalist Cocoa programming
最低限のとても小さなMacアプリを作るというもの。おもしろい。
古い(2010年)けどMenuのところとか参考になった。

How to write a minimal WebKit browser in 30 lines of Swift | practicalswift.com
Swiftで似たような記事もあった。

Swiftをコマンドラインであんま使ったことないので、この辺も参考にした。
http://www.toyship.org/archives/2151
http://qiita.com/zaru/items/35c7528d12d512916f6d

Unicornのプロセス数を環境によって変える

[rails]unicorn設定ファイルと起動スクリプトのメモ にあるYAMLでやる方法が参考になった。

wheneverで環境ごとに処理を分岐する

https://github.com/javan/whenever/wiki/Setting-variables-on-the-fly
に書いてある通り、

$ whenever --set key=value

のように渡せば、config/schedule.rb内で、@key"value"が入る。

で、Capistranoの場合デフォルトで、environment=Railsのenvされているため、@environmentをみて分岐すればいい。

https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v3/tasks/whenever.rake