Hatena::ブログ(Diary)

WebService::Blog->new( user => ’hide_o_55’ )

2015-02-01

Hachioji.pm 46で「Goを書いてたら、いつのまにかアセンブリを書いてた話」をしてきた

1/31に開催された Hachioji.pm #46に行ってきました。

Goを書いてたら、いつのまにかアセンブリを書いてた話

Goで最適化のためにアセンブリ書いた話をしました。

スライド

https://github.com/hideo55/go-popcount

参考:no title

追記:GoでPopCountやってるパッケージはすでに他にもあるけど、POPCNT使えて、かつPopCount単機能で使えるのが無かったので書きました。

LT

他の人の LTの雑なメモです。

  • @xtetsujiさん
    • 透過的に例外をキャッチ
      • ENDだとだめ
  • @tsucchiさん
    • DBの自動再接続
  • @ichigotakeさん
  • @akira1908jpさん
  • @mackee_wさん
  • @karupaneruraさん
  • @uzullaさん
    • PSR-7
  • @moznionさん
    • DBIx::TransactionManagerを参考にししてJaveに移植
      • Javaのtry-with-resource
  • @maka2_donzokoさん
    • Kichijoji.pmでやった話
    • iThread

2014-05-20

Go言語用の Vim 設定を見なおした

暫く Vim の設定をいじっていなかったので、設定(Vim 7.4 へのアップグレードも含めて)を見直しました。

以前の記事はこちら

Go 付属の vim プラグインを使うのをやめて vim-go にした

$GOROOT/libexec/misc/vimVim プラグインが付属していますが、使うのをやめました。

理由としては付属 Vim プラグインと gocode の Vim プラグインを使うより、vim-go を使うほうが管理が楽だと考えたためです。

Go 関連の設定は以下のようにしました。

if !exists('g:neocomplete#omni_patterns')
    let g:neocomplete#omni_patterns = {}
endif
let g:neocomplete#omni_patterns.go = '\h\w*\.\?'

let g:quickrun_config['go'] = {
          \ 'command': 'go',
          \ 'exec': ['%c run %s']
          \ }

""" vim-go
let g:go_bin_path = expand("~/.go/bin")
let g:go_play_open_browser = 0
let g:go_fmt_fail_silently = 1
let g:go_fmt_autosave = 0
let g:go_fmt_command = "gofmt"
let g:go_disable_autoinstall = 1

au FileType go nmap <Leader>i <Plug>(go-info)
au FileType go nmap <Leader>gd <Plug>(go-doc)
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
au FileType go nmap <leader>gb <Plug>(go-build)
au FileType go nmap <leader>gt <Plug>(go-test)
au FileType go nmap gd <Plug>(go-def)
au FileType go nmap <Leader>ds <Plug>(go-def-split)
au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
au FileType go nmap <Leader>dt <Plug>(go-def-tab)
au FileType go nmap <Leader>gl :GoLint<CR>

2013-05-18

Goはじめました

以前から興味はあったけど手を出していなかったGo言語ですが、Go 1.1のリリースで、64bit整数も使えるようになったことだし、そろそろやってみる事にします。当面の目標は今までC++で書いていたネットワークサーバ・プログラムをGoで書くことです。

環境構築

普段使っているOSXにGo言語の環境を作ります。

Go言語のインストール

参考

Homebrewであれば以下のコマンドで一発です。

$ brew install go
$ cat hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

$ go run hello.go
hello, world
環境変数

Go関連の環境変数を設定します。

brew upgrade したらGOROOTの設定も変わるようにしています。

参考

program_exists () {
	type "$1" &> /dev/null ;
}

if program_exists go; then
	function setupGOROOT()
	{
		local GOPATH=`which go`
		local GODIR=`dirname $GOPATH`
		local GOPATH_BREW_RELATIVE=`readlink $GOPATH`
		local GOPATH_BREW=`dirname $GOPATH_BREW_RELATIVE`
		export GOROOT=`cd $GODIR; cd $GOPATH_BREW/..; pwd`
	}
	setupGOROOT
fi
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
Vimの設定

基本的にVim使いなのでVimにGo関連の設定を追加します。*1

まず、Goに付属のVim設定をftpluginとして追加します。

$ ln -s $GOROOT/misc/vim $HOME/.vim/ftbundle/go/vim-go

$GOROOTが変更された場合にvimプラグインも追従するように以下をbashの設定に加えます。

function setup_go_vim()
{
    local GO_VIM_PATH=$HOME/.vim/ftbundle/go/vim-go
    if [ -e $GO_VIM_PATH ]; then
        local CURRENT=`readlink $GO_VIM_PATH`
        local NEW=$GOROOT/misc/vim
        if [ "${CURRENT}" != "${NEW}" ]; then
            rm $GO_VIM_PATH
            ln -s $NEW $GO_VIM_PATH
        fi
    fi
}
setup_go_vim

さらに、補完を便利にするためにgocodeを追加します。

go get -u github.com/nsf/gocode
ln -s $GOPATH/src/github.com/nsf/gocode/vim $HOME/.vim/ftbundle/go/gocode

さらに、neocomplcacheと連携して自動で補完を起動する設定を行います。

if !exists('g:neocomplcache_omni_patterns')
    let g:neocomplcache_omni_patterns = {}
endif
let g:neocomplcache_omni_patterns.go = '\h\w*\.\?'

f:id:hide_o_55:20130518045125p:image:w360

参考サイト

*1:unbundleの場合の設定です