emacs でシェルの環境変数を全部読み込む

emacs 24.4.50.1 zsh 5.0.2 perl 5.18.1 emacs で普段使っているシェルの環境変数を引き継ぎたい。 exec-path-from-shell を使うのがいいらしいが、 使いたい環境変数が増えるたびに el ファイルに追加していくのはめんどくさい。 ちょっと古いやり方かもしれないが、 実況中のシェルの環境変数を全部 el ファイルに書きだすようなスクリプトを書いた。 .emacs.d を git で管理していて github などにあげている場合は、 shellenv.el を .gitignore に追加しておかないとたぶん危ない。 https://github.com/handlename/dot-emacs/blob/master/scripts/init_shellenv.pl 実行すると、 $ perl scripts/init_shellenv.pl こういうファイルが作られる。 $ cat shellenv.el (setenv "TERM" "screen") (setenv "PLENV_ROOT" "/Users/handle/.plenv") (setenv "PLENV_VERSION" "5.18.1") (setenv "HOME" "/Users/handle") (setenv "GOPATH" "/Users/handle") ... で、 init.el とかに (load-file (concat user-emacs-directory "/shellenv.el")) と書いておけば全部 set される。 元ネタはこれ。 シェルと Emacsの PATHを共有する - Life is very short »

YAPC::Asia Tokyo 2013に参加してきた

参加するのは今回で4回め。 今回はスピーカーとしての参加だった トークのページ 40分枠なのに30分ではなす内容は終わってしまったけど、質問をたくさんもらえたので命拾いした 自分が所属しているプロジェクトのこと(=自分が直接関わった物以外も含まれる)をはなすのであれば、もっと事前の準備をしておくべきだった 自分が直接関わったものであれば、どんな質問にも答えられるはず・・・ 浅く広くはなすとまとめるのがむずかしい 次はなすときは自分が作ったものについて深堀りしよう! 開発フローやマネジメントについてのはなしがためになった @onishi さんの はなし / 昼過ぎレビュータイムいいなー @myfinder さんの はなし / 「増やせば速くなるような仕組みを作っておく」 後夜祭のテーブルがやたらと豪華だった (@miyagawa さん、@charsbar さん、@inao さん、 @gfx さん、@akiym さん) FreakOutの方やmixiの方とも話せてよかった (主にテストの話) 運営の方々、スピーカーの方々、参加者の方々、みなさまお疲れ様でした。 @lestrrat さん、@941 さんが運営から引退されるということで、来年以降はどうなるんでしょうね。 »

直前の発言を置換する IRC bot

タイポして投稿した時に handlename: 毛根な時間 handlename: s/毛根/もうこん/ みたいな感じで発言を訂正することがある。 Skype だと実際に自分の発言が修正されるので、IRC でもやってみた。 過去の発言を修正することはできないので、修正版の発言を再投稿するだけ。 メタ文字とかオプションとかの判別は面倒なのでやってない。 evalすればいいんや! #!/usr/bin/env perl use strict; use warnings; use AnySan; use AnySan::Provider::IRC; use Log::Minimal; use App::Options( option => { host => { type => 'string', required => 1 }, port => { type => 'string', default => '6666' }, ssl => { type => 'bool', default => 0 }, nick => { type => 'string', required => 1 }, channel => { type => 'string', required => 1 }, }, ); my %opts = %App::options; my $password = password(); my $messages = {}; my $irc = irc( $opts{host}, port => $opts{port}, enable_ssl => $opts{ssl}, password => $password, key => $opts{host}, nickname => $opts{nick}, channels => { $opts{channel} => {} }, ); AnySan->register_listener( replace => { cb => sub { my ($receive) = @_; if ($receive->message =~ qr! »

IRC に issue 番号に反応する bot がいると捗る

IRC bot のはなし。 #123 みたいな文字列に反応して、 github の issue のタイトル github の issue の URL を返してくれる bot をつくったら思いの外便利だった。 #!/usr/bin/env perl use strict; use warnings; use utf8; use AnyEvent::IRC::Client; use AnyEvent; use Config::Pit; use Encode; use Furl; use HTTP::Request; use JSON::XS; use Log::Minimal; use App::Options( option => { nick => { type => 'string', default => 'issue-bot' }, channel => { type => 'string' }, join_message => { type => 'string', default => '' }, org_name => { type => 'string' }, project_name => { type => 'string' }, }, ); my %opts = %App::options; $Log::Minimal::PRINT = sub { my ($time, $type, $message, $trace, $raw_message) = @_; print STDERR "$time[$type] $messageat $trace\n"; }; my $github = pit_get('github', require => { username => 'github username', password => 'github password', }); my $irc_conf = pit_get('irc', require => { host => 'irc host', port => 'irc port', password => 'irc password', }); my $json = JSON::XS->new->utf8; my $furl = Furl->new(); my $cv = AnyEvent->condvar; my $con = AnyEvent::IRC::Client->new(); $con->reg_cb( connect => sub { my ($con, $err) = @_; if (defined $err) { warnf "connection error: %s", $err; $cv->send(); } else { infof 'connected'; } } ); $con->reg_cb( registered => sub { infof 'registered'; if ($opts{join_message}) { $con->send_chan( $opts{channel}, 'PRIVMSG', $opts{channel}, $opts{join_message}, ); } } ); $con->reg_cb( disconnect => sub { infof 'disconnected'; $cv->broadcast(); } ); $con->reg_cb( publicmsg => sub { my ($con, $channel, $irc_message) = @_; return unless $irc_message->{command} eq 'PRIVMSG'; my @issue_nums = $irc_message->{params}[1] =~ /#([0-9]+)/g; return unless @issue_nums; for my $issue_num (@issue_nums) { my $message = retrieve_issue_info($issue_num); next unless $message; infof $message; send_message($con, $message); } } ); $con->enable_ssl(); $con->connect($irc_conf->{host}, $irc_conf->{port}, { nick => $opts{nick}, password => $irc_conf->{password}, }); $con->send_srv('JOIN', $opts{channel}); $cv->recv(); $con->disconnect(); sub retrieve_issue_info { my ($issue_num) = @_; my $url = sprintf 'https://api. »

マージ済みのブランチをまとめて削除する便利スクリプト書いた

git 1.8.1.1 perl 5.16.2 マージ済みのブランチを消したい。 リモートリポジトリにあるのもいっしょに消したい。 というのを叶えるために簡単なスクリプトを書いた。perl。 https://github.com/handlename/bin/blob/master/delete-merged-branches ドライラン delete-merged-branches --dryrun リモートのブランチも消す delete-merged-branches --remote 特定のブランチは残す delete-merged-branches --ignore 'important-branch' カレントディレクトリが git リポジトリなのかどうかの判別はしていないし、 master にいるのかどうかもチェックしていないけど、必要になったら追加する。 »

大量のJSONをデコードする場合

全てつなげて一つのJSONにしたほうが速くなるんじゃないかと思ったんだけどそんなことなかった。 #!/usr/bin/env perl use strict; use warnings; use Benchmark qw/timethese cmpthese/; use JSON::XS; my @jsons = map { encode_json({ hoge => 'huga' }) } 1..1000; my $result = timethese(1000, { each => sub { my $decoded; for my $index (0..$#jsons) { $decoded->{$index} = decode_json($jsons[$index]); } }, joined => sub { my $index = 0; my $joined = '{'; $joined .= join ',', map { $index++; qq!"${index}":${_}! } @jsons; $joined .= '}'; my $decoded = decode_json($joined); } }); cmpthese($result); Benchmark: timing 1000 iterations of each, joined. »

Author image handlename on #perl,

Warn::Colorful というモジュールを書いた

printf デバッグをするとき、perl の場合 warn を多用する。 warn はメッセージといっしょに呼び出し元のファイル名/行番号も表示してくれるので 出力元の特定が簡単、なんだけど、 ファイル名/行番号表示に埋もれて肝心の値が見にくいことがあるので、 値 ファイル名 行番号 の表示色を別々に指定できるモジュールを書いた。 https://metacpan.org/module/Warn::Colorful こういうのを ~/.warn-colorful に書いておくと、 body=red file=green line=yellow こんなふうに表示される。 一応 use するときに色設定を渡せるようにもしておいた (.warn-colorful よりも優先される)。 use Warn::Colorful ( base => 'blue', ); コード自体には手を入れたくないけど warn の表示を見やすくしたい なんてときに使うんじゃないかなー。 あれこれてすとなくない? »

Author image handlename on #perl,

xslate-modeとtt-mode

練習でText::XslateとTemplate::Toolkitのテンプレート用マイナーモードを書いてみた。 https://github.com/handlename/xslate-mode https://github.com/handlename/tt-mode とりあえずタグの挿入とハイライトだけ。 名前が違うだけで同じ事しか書いていないので、設定だけでいろいろなテンプレートに対応できるような、meta-template-mode的なものにしたほうがいいのかもしれない。 Emacs Lispテクニックバイブル 作者: るびきち出版社/メーカー: 技術評論社発売日: 2011/11/26メディア: 単行本(ソフトカバー)購入: 5人 クリック: 213回この商品を含むブログを見る »

perlで複数リストのintersect(積集合)をとる

こんなかんじ? 先頭で空のリストはスルーするようにしてるけど別にいらないかもしれない。 最後にgrepしてる部分で == の条件をなくすと和集合になりますね。 »

Author image handlename on #perl,