2013年4月アーカイブ

google goと言う言語がある。
出だしの頃に、FreeBSDで動かそうとしてすぐに挫折して、直後に本家がFreeBSDにも対応してportsに入ったりしていたのだけれど、ずっと触っていなかったうちにだいぶ進化していた。
このblogを書いている時点での最新は1.0.3で、8gとか8lとか言うわかりにくいコマンドの代わりに、goと言うコマンドでビルドや実行ができるようになっていた。
% go run hoge.go
でいきなり実行ができるし、
% go build hoge.go
でコンパイルされてhogeと言う実行ファイルができる。
で、zshを使っているとコマンド毎にオプションの補完ができたりするんだけど、zshの標準だとgoコマンドには対応していないので、
% go r[TAB]
とか go rの後でTABを押しても補完してくれない。
% go env
でgoの環境変数(?)が見られるんだけど、そこに出てくる GOROOT の下に go の関連ファイルがある。(8gとか8lに該当するコマンドは、$GOROOT/pkg/tool/$GOOS_$GOHOSTARCH にある)
で、Macの場合、homebrewでinstallすると$GOROOT/share/zsh/site-functions/_go に、MacPortsでinstallすると$GOROOT/misc/zsh/go にzsh用の補完関数が置かれる。
こいつを、自分の.zshrcとかから読んでやると、goコマンドの補完が効くようになる。(ちなみに、brewの名前から連想して、/usr/share/zsh/site-functions/ に置いても有効にならない)
さて、ソースはemacsで編集することが多いので、emacs用のgo-modeはないのかと思ったら、$GOROOT/misc/emacs に go-mode-load.el と go-mode.el があった。
こいつらを、emacsのload-pathの通ったところに置いて上げて、
(require 'go-mode-load)
してあげると、go-modeが使えるようになる。
emacs上からソースを編集していると、emacs上から実行したくなる。
goのドキュメントを見ていると、gdbも使えそうなことが書いてあるが、とりあえずはshellから実行することにして、emacs上で M-x shell でシェルを起動する。
と、zshのプロンプトの前に「4m」とか余計な文字が出てくる。
後、せっかくzshでgoのコマンドが補完できるようにしたのに、emacsのshellモードだとzshの補完が効かない。
つらつらと調べていたら、Emacs 上で快適に Bash や Zsh を利用する設定 : 紹介マニアと言うページを発見した。
ほとんどはここに書いていることで解決するのだが、shellモード、termモード、multi-termモードと順番に説明しているため、multi-termを使いたい時にもtermモードの記述内容が必要だったりしたので、最終的にやったことを書いておく。
  1. multi-termのインストール
    http://www.emacswiki.org/emacs/download/multi-term.el を、emacsのload-pathの通ったディレクトリに置き、.emacsに以下を追加
    (autoload 'multi-term "multi-term" "multi-term" t)
    
    ※ 原因はわからないが、(require 'multi-term)だと、multi-termを実行したときに文字の背景色がemacsのデフォルトと変わって白くなってしまう。requireじゃなくてload-libraryをemacsが起動してからだと大丈夫(.emacsだとrequireと同じ挙動)なので、autoloadにしてみた。
  2. 「4m」が出ないようにする
    4mが出るのは、emacsのshellモード系が使用するTERMであるeterm-colorがmacのterminfoに入っていないためらしいので、ticコマンドで~/.terminfoにインストールする。(eterm-color.ti の場所はemacsのインストール先に依存)
    % tic -o ~/.terminfo /usr/local/share/emacs/24.1/etc/e/eterm-color.ti
    
  3. シェルの出力が文字化けしないようにする
    emacsの設定で、locale-coding-system に utf-8-hfsを設定する。
    (require 'ucs-normalize)
    (setq file-name-coding-system 'utf-8-hfs)
    (setq locale-coding-system 'utf-8-hfs)
    
これで、ほぼ快適に使えるのだが、参考サイトにも書いてある通り、multi-term上からは日本語の入力ができないと言う問題が残っている。
macの(HFS+の)日本語ファイル名はNFD正規化された形で保存されているので、たとえば「ほげ」って言うファイルがあるところで、「ほ」と入力してTABを押して補完すると、
% echo ほけ<3099>
のように表示される。
ずっと、なんとかならないのかな〜と思っていたのだけれど、mac の zsh で日本語の濁点・半濁点付き仮名を正常に補完できる様にする : アシアルブログと言うページを発見。zshのパッチを公開されている。
ここには、ソースから入れる方法と、Homebrewを使った場合の方法が書いてある。
会社マシンはHomebrewを使っているので、一発でinstallできて無事に動いた(brew tapってのを初めて知ったんだけど、個人が独自の Formula を公開するのに素晴らしい仕組みだね)。

しかし、自宅マシンでは MacPorts を使っているので、MacPorts の zsh の Portsfile をちょこちょこっといじって上記パッチを取り込むことにする。
昔 unzip の自家 Ports を作った時のファイルを参考に、適当にやったらなんとかうまく行ったようだ。
以下、覚え書き。
  • brewの方でconfigureオプションとして指定していた、--enable-fndir から --enable-site-scriptdir までは Portfileの方には書かなかった。
  • オリジナルの Portfile では --enable-libs="-lncurses" となっているところは、brewに合わせて --with-term-lib=ncursesw とした。
  • brewにあった --disable-etcdir は取り込まなかった。
  • brewの方は、依存関係で waltarix/customs/ncurses を指定していた。こちらの Formula を見たところ、--enable-widec くらいしか関係しそうなオプションがなかったのと、MacPorts の ncurses は --enable-widec が指定されていたので、そのまま MacPorts の ncurses を使うことにした。
  • 不思議なことに、--with-term-lib=ncursesw と指定しているにもかかわらず、otool -L zsh すると、libncurses.5.dylib が出てくる。(brew版は ncurseswになっている)
    ただ、MacPortsの環境では、libncursesw.5.dylib は libncurses.5.dylib へのシンボリックリンクなので、実害はない。実際正しく動いているように見える。
  • 前に書いたのは、sha1とmd5でチェックサムが書いてあったので、md5sumコマンドとshasumコマンドでチェックサムを生成したんだけど、今回のzshのPortfileはrmd160と言う聞いたことがないものが書いてあった。
    rmdsumコマンドが存在しないので調べてみたところ、md5、sha1、rmd160 ハッシュ値を得る方法 - 富士山は世界遺産と言うページを発見したので、opensslコマンドで生成した。(別にrmd160以外のを書いておけば通るんだけど)
いじった Portfile は github に上げてある。
portaudit から、squid 2.7.9 に脆弱性があるよ(portaudit: squid -- denial of service)と言う指摘がずっと来ていたのだけれど、2.7系はもう修正する気がないようなので、しばらく放置していた。
FreeBSDのportsは、www/squid が 2.7系, www/squid31 が squid 3.1系、www/squid32 が squid 3.2系となっている。(squid の最新安定版は3.3系らしい)
そこで、とりあえず3.2系に移行してみることにする。
一度squid 2.7.9 をアンインストールして、新たにwww/squid32をインストール。そして、起動してみると、(エラーの行だけ抽出)
FATAL: Bungled squid.conf line 715: cache_dir coss /var/squid/cache/coss 10000 block-size=1024 max-size=500000
と言うエラーで起動しない。
/usr/local/etc/squid/squid.conf.default にデフォルトの設定が、/usr/local/etc/squid/squid.conf.documented に説明付きの設定ファイルがあるので、これを見てみると、
#       NP: COSS filesystem in Squid-3 has been deemed too unstable for
#           production use and has thus been removed from this release.
#           We hope that it can be made usable again soon.
とあるので、当面はCOSSは使えないらしい。 cache_dirの行をコメントアウトすると、
ERROR: Directive 'emulate_httpd_log' is obsolete.
emulate_httpd_log : Replace this with an access_log directive using the format 'common' or 'combined'.
FATAL ERROR: auth_param digest program /usr/local/libexec/squid/digest_pw_auth: (2) No such file or directory
ERROR: '0.0.0.0/0.0.0.0' needs to be replaced by the term 'all'.
SECURITY NOTICE: Overriding config setting. Using 'all' instead.
WARNING: (B) '::/0' is a subnetwork of (A) '::/0'
WARNING: because of this '::/0' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '::/0' from the ACL named 'all'
aclParseAclLine: ACL 'manager' already exists with different type.
FATAL: Bungled squid.conf line 1856: acl manager proto cache_object
みたいな感じ。
  • emulate_http_log は、access_log の common か combined を使え
    →とりあえずコメントアウト。
  • digest_pw_auth なんて見つかりません。
    →digest_file_auth に置き換わったらしい
  • all を置き換えてます。
    →デフォルト(?)でallは定義済みのようなので、コメントアウト
  • ::0がどうこう。
    →IPv6の設定は書いてないんだけど?
  • acl manager は、既に別の形で存在します。
    →こちらもコメントアウト
で、再度通すと、
WARNING: Netmasks are deprecated. Please use CIDR masks instead.
WARNING: IPv4 netmasks are particularly nasty when used to compare IPv6 to IPv4 ranges.
WARNING: For now we will assume you meant to write /32
WARNING: (B) '127.0.0.1' is a subnetwork of (A) '127.0.0.1'
WARNING: because of this '127.0.0.1' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '127.0.0.1' from the ACL named 'localhost'
WARNING: (B) '127.0.0.1' is a subnetwork of (A) '127.0.0.1'
WARNING: because of this '127.0.0.1' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '127.0.0.1' from the ACL named 'localhost'
WARNING: Netmasks are deprecated. Please use CIDR masks instead.
WARNING: IPv4 netmasks are particularly nasty when used to compare IPv6 to IPv4 ranges.
WARNING: For now we will assume you meant to write /32
WARNING: (B) '127.0.0.0/8' is a subnetwork of (A) '127.0.0.0/8'
WARNING: because of this '127.0.0.0/8' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '127.0.0.0/8' from the ACL named 'to_localhost'
  • Netmasksはdeprecatedなので、CIDR maskを使え。
    →/255.255.255.255 の代わりに、/32 とか書く。
  • 127.0.0.1とlocalhostがどうしたこうした。
    →とりあえず、acl localhost の行をコメントアウト
  • to_localhost がどうしたこうした。
    →そもそも、to_localhostって言うaclを使っていなかったので削除
これで、なんとか起動した感じ。
後は、コメントアウトしたcache_dir を ufs で復活させて、squid -z でキャッシュディレクトリを初期化して、squidを再起動したら動いているように見える。
2013年4月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

このアーカイブについて

このページには、2013年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年3月です。

次のアーカイブは2013年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1