shell起動時にkey登録

# ~/.zshrc
test $(ssh-add -l | grep "/Users/toqoz/.ssh/id_rsa" | wc -l) = 0 && ssh-add

みたいな感じ。もっと登録すべきkeyがある場合は、追加していくと良いと思う。

ssh-add -l は一個も登録されてない時、The agent has no identities. っていうのを標準エラーではなく標準出力に出すから、 test $(ssh-add -l | wc -l) = 0 とかってやってもうまくいかない。

最後のwindowをquitする時に確認してくれるようにする(vim)

NeoBundle 'tyru/vim-altercmd'

command Q :call s:gentle_quitman()

function! s:gentle_quitman()
  let window_counter = 0
  windo let window_counter = window_counter + 1

  if window_counter == 1
    let a = input("Really quit last window? [n]|y")
    if a == "y"
      q
    endif
  else
    q
  endif
endfunction

call altercmd#load()
AlterCommand q Q
AlterCommand Q q

参考

pluginにした

https://github.com/ToQoz/gentle_quitman.vim

github.com/go-sql-driver/mysql での datetimeとtime.Timeのマッピング

db, err := sql.Open("mysql", "user:passward@/dbname?parseTime=true")

みたいな感じで、parseTime=trueを設定してやる必要がある。https://github.com/go-sql-driver/mysql/blob/v1.1/packets.go#L649

ただ、これだとdatetime->time.Timeにparseする際に標準時として行なわれるので、parseTime=true&loc=SOME_LOCATIONと、locを設定する必要がある。

古いバージョンだと、loc=Asia/Tokyoとかをparseできないのでloc=Japanとかって指定すると良いと思う。https://github.com/go-sql-driver/mysql/commit/7503ab8073eb37c533ac4a211e9a9f469e5cd267 でescapeしたのを渡すようになってるので、これ以降のバージョンだと locl=Asia%2FTokyo って渡してやれば良い。


go get -u の挙動が良くわかってなくて、今まっさらな環境で go get github.com/go-sql-driver すると、v1.1が入るのに、 v1.0.2 が 入った環境で go get -u github.com/go-sql-driver してもupdateされなくて困ってる。

go get -u でupdateされなかった理由

  • go get はgo1 tag or branchがあれば、それを取ってくる
  • github.com/go-sql-driver/mysql では、go1 tag を持ってる
  • go get -u github.com/go-sql-driver/mysql
  • go get -u(git fetch)でtagのupdateがfetchされない
  • go1 tagに変化がない
  • updateされない

goで同一ディレクトリに、複数main.mainをおきたい

続編を書いた。

とりあえずここに落ち着いたGoの即時実行環境 -2014年冬- - コンドルが飛んでいる。


以下古いやつ

その場で書いて実行できて置いておける、みたいな場所が欲しい。go playgroundは便利だけど、それだけで十分かというと、そうではないので、適当なディレクリにスクリプト雑多においておいて go run a.go とか、go run b.go って出来るようにしておきたい。

それ自体はできるけど、Vim上とかで警告[1]されるのがつらい。

そういう時には、// +build ignore とか書いておいてビルド対象じゃなくすると良いっぽい。ignoreじゃなくても、コード書いてる環境がターゲットにならないような指定ならなんでもいいけど、ignoreって書いておくと通じやすいし良さそう。c.f. http://golang.org/pkg/go/build/#hdr-Build_Constraints

a.go

// +build ignore

package main

import (
    "fmt"
)

func main() {
    fmt.Println("b")
}

b.go

// +build ignore

package main

import (
    "fmt"
)

func main() {
    fmt.Println("b")
}

追記

importしたけど、使ってないpackageがある時とか未定義な変数使ったりしてる時の警告も出なくなるので、どっちが不便かわからない感じはする。

追記2

微妙な感じだけど、こんな感じで対処した。あと、:silent make <args> | cwindow 時に描画が変になるのをどうにかしたい。

augroup GoFile
  autocmd!
  " ....
  au BufWritePre *.go :call GoMakeSetting()
augroup END


function! GoMakeSetting()
  setl makeprg=go\ build
  augroup GoMakeSettingGroup
    au!
  augroup END

  if exists(":Make") != 2
    command -nargs=* Make silent make <args> | cwindow | redraw!
  endif

  if match(getline(1), "\/\/ *\+build *ignore") != -1
    setl makeprg=go\ build\ %

    augroup GoMakeSettingGroup
      au BufWritePost <buffer> :Make
      au WinEnter * if winnr('$') == 1 && getbufvar(winbufnr(winnr()), "&buftype") == "quickfix"|q|endif
    augroup END
  endif
endfunction
  • [1] main redeclared in this block previous declaration at みたいなやつ

tmuxで一個[前|後]のwindowと入れ替えるやつ

入れ替えたいことが時々あるけど、swap-window でxとyを交換したいことがあんまりなくて、このwindowを0番に移動して、他の並びはそのままみたいにやりたいことが多い。

「move 0 って指定すると、現在のwindowを0に持ってって、他のはそのままずらす。」みたいなの作ろうかと思ったけど面倒だし、window切り替えみたいにそんなに頻繁にするもんじゃない気がして、一個ずつ前に持ってったり後ろに持ってったりするのでいいやと思ってそう定義した。

# window閉じたりした時に、番号詰める。これをセットしとかないと、欠番出てきてこの方法で移動が出来なくなる。
set-option -g renumber-windows on
unbind h
bind -r h run 'cw=$(tmux display-message -p \#I) && [ $cw -gt 0 ] && tmux swap-window -s $cw -t $(($cw - 1))'
unbind l
bind -r l run 'cw=$(tmux display-message -p \#I) && tmux swap-window -s $cw -t $(($cw + 1))'

ちょっとした絵書けると良いなーと思いつつ、「Inkscapeと気楽に構えたクソ素人の組み合わせが悪魔的な感じですぐやめる -> いつ[Mac|Windows]を捨てるか分からんし、その時動かないものを使う気にもならなくて、買わない -> Ink...」を繰り返していたんだけど、馬鹿らしい気がしてきてSketch.app買って使ってみた。

コウモリ

世界を(:Ag 変更依頼)変えさせて(:Qfreplace)おくれよ(:%s/変更依頼/修正依頼/g) そしたら(:wq)君と(git add -A; git commit -m '変更依頼 -> 修正依頼') キスがしたい(git push)

みたいなことを散々言いながら、だるくて一向に手を付ける気にならない病を患って2日が経過してる。

Redigo(redis client)使う場合の注意

redis.Conn#Do(https://github.com/garyburd/redigo/blob/master/redis/conn.go#L368) はredis.Conn#Send -> redis.Conn#Flush -> redis.Conn#Receive みたいなことしてるんだけど、threadsafeではなく複数のgoroutineでコネクションを使いまわしてた場合、アレな感じになるのでredis.Pool使ったりして、コネクション使いまわさないようにしないといけない。

c.f. https://github.com/garyburd/redigo/issues/33

Gokuraku作った

Gokuraku screenshot

Golang入門として、SoundCloudの曲をURL入れて追加していったやつを適当に再生してくれるみたいなやつを作った。 ToQoz/Gokuraku - GitHub

追記

こんな感じです。


Gokuraku logo

Railsのモデル = ActiveRecord」「いや別に違うけど」みたいなやりとりよく見るけど、100年後も言ってそうだなと思ってた。なんでかなと思ったんだけど、Railsのモデル、ActiveRecord使ってDBと便利に繋がりたい時

class SomeModel < ActiveRecord::Base
end

って書くせいで誤解されている気がする。

これだと「SomeModelはActiveRecord::Baseの一種」みたいな感じになって、それが間違っているわけでもない気がするけど、そこから想像力豊かな各位により「全てのモデルはActiveRecord::Baseの一種」みたいな感じに思われそう。

class SomeModel
  include ActiveRecord::Base
end

だったら、モデルが便利にDBと繋がりたいならActiveRecord使うといいよみたいなニュアンスになって、モデル = ActiveRecordみたいなこと言われなくて済むと思う。

銭湯のトイレ

銭湯の脱衣所のなかにトイレがあって、人間が青く塗りつぶされた記号が書いてあった。男専用の脱衣所に居たので、男の記号が書いてあったところで普通に考えたら何も分からない気がするんだけど、実際はそれですぐトイレと分かってしまった。フロッピー最近使わないからという理由でアイコンを再発明しようとするのに違和感を感じる源泉がそこにある気がした。

class PostsController < ApplicationController
  respond_to :html, :json

  def index
    @posts = Post.all
    respond_with @posts
  end
end
$.ajax('/posts', {
  dataType: 'json',
  contentType: 'application/json'
})

みたいな感じのがあったとして、

  1. /posts に遷移
  2. どっか他のページに遷移
  3. $.ajax('/posts', { ... }) 実行
  4. /postsに戻る

で、キャッシュされたjsonが「Content-Type?ウェ?」みたいな感じで描画された。。。(Chrome)

とりあえず何が正しいのか調べてるけど、とりあえず cache: false することで現実の問題から逃げました。

複数window開くときのテスト

turnip/capybaraでテスト書いてる時に、

あるリンクをクリックすると、ポップアップ開いたり新しいウィンドウ開いて、そこでなんか操作する

みたいなことがある。こんな感じでできる。

_, popup = page.driver.browser.window_handles
  within_window(popup) do
  expect(page).to have_content('message')
end

開いたままのWindowがあるせいでテストが変なこけ方したから、メインのWindow以外を閉じるみたいな感じにした。

# spec/spec_helper.rb
RSpec.configure do |config|
  config.after(:javascript => true) do
    page.driver.browser.window_handles[1..-1].each do |sub_window|
      within_window(sub_window) do
        page.execute_script "window.close();"
      end
    end
  end
end