ZNCでよく使うコマンド

ZNCのコマンド

ZNCは,IRCクライアントからコマンドで操作できます.

/msg *status <command>

のように,*statusに対してprivmsgを送ることで,ZNCにコマンドとして解釈してもらえます.コマンドの実行結果やZNCからのメッセージは*statusというウィンドウに表示されるので,コマンドを活用することでZNCの設定ファイルをいじる必要はほとんどなくなります.

Help

これをしっかり読めば大体のコマンドについては使い方が分かります.

/msg *status Help

ネットワークの一覧/追加/削除

ネットワークの追加と削除を行います.ここで指定したネットワーク名は,IRCクライアントで設定するusernameの後に'/<network name>'という形式で指定します.usernameの後にネットワーク名を付けることで,全ての接続をZNCに対して行っても,各接続がどのネットワークにプロキシしてほしいか判定できるわけです.

/msg *status ListNetworks
/msg *status AddNetwork <network name>
/msg *status DelNetwork <network name>

e.g.

/msg *status AddNetwork freenode

等とした上で,IRCクライアントで以下のように設定します.

  • host: ZNCの動いているホスト
  • port: ZNCの動いているポート
  • nick: お好きに(ZNC側で設定してるnickが使われます)
  • username: ZNCのユーザ名/freenode
  • password: ZNCのパスワード(設定してれば)

サーバの一覧/追加/削除

一つのネットワークには複数サーバを追加できます.Server系コマンドは,現在接続中のネットワークについての情報を表示します.つまり,*statusウィンドウはネットワーク毎に存在します.freenodeというネットワークのサーバ一覧を表示したければ,IRCクライアントがfreenodeネットワークを選択中に,/msg *statusでコマンドを実行する必要があります.

/msg *status ListServers
/msg *status AddServer <hostname> <port> <password> # port password は任意
/msg *status RemServer <hostname>

e.g.

/msg *status AddServer irc.freenode.net

設定の保存

コマンドを実行した結果は,起動中のZNCに即時反映されますが,設定ファイルは変更されません.変更を設定ファイルに書き出すには,SaveConfigを実行します.

/msg *status SaveConfig

設定に失敗したら

設定に失敗してわけがわからなくなった時は,Rehashコマンドでznc.confをリロードできるので,バシバシ弄ってみたらいいと思います.

/msg *status Rehash

おまけ: チャンネルのjoin/quitはどうするの?

ZNC使ってないときと同じです.特定のクライアントでjoin/partすれば全てのクライアントでjoin/partされます.

/join <#channel>
/part # partしたいチャンネルで

PerlでCamelize/DeCamelize

sub camelize {
    (my $s = shift) =~ s/(?:^|_)(.)/\U$1/g;
    $s;
}

sub decamelize {
    my $s = shift;
    $s =~ s/(_)?((?:[A-Z](?![^A-Z]))+|[A-Z])/(pos($s)==0&&!$1?'':'_').lc($2)/ge;
    $s;
}

普通にString::CamelCaseとか使えばいい話なんですが,スクリプト中とかでわざわざuse CamelCaseするのもなあって時や,一回しかやらないのでベタ書きしてしまえって事もあるので,そういう時に使えばいいと思います.

String::CamelCaseの実装をコピペでもよいかなと思ったんですが,使いたいときにぱっと思い出せる程度に簡素化したかったので上のような感じにしてみたわけですが,decamelizeについては十分複雑ですね.あまり使う機会はないので気にしません.

一応String::CamelCaseのテストは全て通ってますが,挙動が完全に同じかは分かりません. あとString::CamelCaseよりちょっとだけ早いです.Camelizeを高速に行いたいシチュエーションって思いつきませんが.

$ perl -MBenchmark -MString::CamelCase -e'sub mycamelize { (my $s = shift) =~ s/(?:^|_)(.)/\U$1/g; $s } my $s="perl_is_extreamely_lovely_language"; Benchmark::cmpthese 10**5 => { "S::CC" => sub { String::CamelCase::camelize($s) }, "mycamelize" => sub { mycamelize($s) } }'
              Rate      S::CC mycamelize
S::CC      68493/s         --       -24%
mycamelize 90090/s        32%         --

Shellにおける二重括弧

Arithmetic expansionというらしい.'$(())'で囲った中身を数式として評価してくれる.

$ echo $(( 1 + 1 ))
2

べき乗やビット演算も可.今まで数式をshell script中に書きたいときはexpr(1)を使ってたんですが,こちらの方が見やすくて便利ですね.

$ echo $(( 2 ** 10 ))
1024
$ echo $(( 1 | 2 ))
3

Build ebuild package manually

Which fails to emerge. Applying own patch.

With reference: https://www.gentoo.org/doc/en/handbook/2004.2/handbook-x86.xml?part=3&chap=6

ebuild(1) always requires .ebuild file as first argument, and action as second argument. Here's an example of how to build app-admin/syslog-ng manually.

  1. Fetch tarball

     ebuild /usr/portage/app-admin/syslog-ng/syslog-ng-3.4.2.ebuild fetch
    
  2. Extract tarball

     ebuild /usr/portage/app-admin/syslog-ng/syslog-ng-3.4.2.ebuild unpack
    

    Extracted directory could found at /var/tmp/portage/app-admin/syslog-ng-3.4.2. Now apply patches you need.

  3. Compile(make)

     ebuild /usr/portage/app-admin/syslog-ng/syslog-ng-3.4.2.ebuild compile
    
  4. Install to temporarily location

     ebuild /usr/portage/app-admin/syslog-ng/syslog-ng-3.4.2.ebuild install
    

    This is not "real" installation actually. You can find files under /var/tmp/portage/app-admin/syslog-ng-3.4.2/image/; which will be installed under $PREFIX(normally /usr) in next step.

  5. Install

     ebuild /usr/portage/app-admin/syslog-ng/syslog-ng-3.4.2.ebuild qmerge
    

    qmerge will execute install operation and merge build into portage tree. Package will marked as "installed" after this step has finished.

  6. Cleaning

     ebuild /usr/portage/app-admin/syslog-ng/syslog-ng-3.4.2.ebuild clean
    

    clean will remove temporarily dirs/files(i.e. /var/tmp/portage/app-admin/syslog-ng-3.4.2). But this step could omitted. These files will be removed automatically in the feature.

Emacs Lispで部分適用

apply-partiallyを使う.

(apply-partially FUN &rest ARGS)

Return a function that is a partial application of FUN to ARGS.
ARGS is a list of the first N arguments to pass to FUN.
The result is a new function which does the same as FUN, except that
the first N arguments are fixed at the values with which this function
was called.
(apply (apply-partially 'call-process "echo" nil nil nil)
       (list "foo" "bar"))

みたいにすることで,&restな引数だけをリストで渡すとかできる.

firefoxのAdobeReaderがC:\nppdf32Log\debuglog.txtというファイル名を作る問題

Portageから入れたfirefoxのAdobeReaderプラグインが,firefoxを起動した時のカレントディレクトリに"C:\\nppdf32Log\\debuglog.txt"というファイルを作る問題について.

この現象だいぶ前からある気がするんですが,前に対処したのがFirefoxのアップデートと共に復活したので再度対処したメモ.一向に治らないのはバイナリ配布のプロプライエタリだから.たぶん.

ファイル名でググれば同じ症状は腐るほど出てくるので,この方みたいにブラウザ内でPDF開けなくていいよって方は丸っと消しちゃってもいいんですが,別の方法もあります.

ソースがないならバイナリを書き換えればええやん.ということで,まずは犯人のバイナリを探します.

$ ps ax | grep firefox
28928 pts/2    SNl    1:00 firefox
28976 pts/2    SNl    0:02 /usr/lib/firefox/plugin-container /opt/netscape/plugins/nppdf.so -greomni /usr/lib/firefox/omni.ja 28928 plugin

pdfっぽいのがあるので,たぶんこれでしょう.ということで,なんかしらのでバイナリエディタで/opt/netscape/plugins/nppdf.soを開きます.バックアップも忘れずに.バイナリエディタEmacsのhexl-modeが好きです.

00021930: 6573 7361 6765 0061 6200 433a 5c6e 7070  essage.ab.C:\npp
00021940: 6466 3332 4c6f 675c 6465 6275 676c 6f67  df32Log\debuglog
00021950: 2e74 7874 0058 5858 3a47 6976 696e 6720  .txt.XXX:Giving 

適当に検索すると,ファイル名っぽい文字列がみつかります.これを/dev/nullとかに書き換えてしまえば良いわけですが,忘れてはいけないのは,"C:\nppdf32Log\debuglog.txt"は26文字(byte)なのに対して,"/dev/null"は9byteなので,以降のデータアドレスがズレないように,17byteをnull埋めしてやる必要があります.

00021930: 6573 7361 6765 0061 6200 2f64 6576 2f6e  essage.ab./dev/n
00021940: 756c 6c00 0000 0000 0000 0000 0000 0000  ull.............
00021950: 0000 0000 0058 5858 3a47 6976 696e 6720  .....XXX:Giving

こんな感じで.firefoxを再起動すれば,晴れて余計なファイルは作られなくなります.

追記(08/15)

自動化できました

wgetでBasic認証するときに--http-password=とか生で書かされるのは嫌だなー

wgetBasic認証のかかったサイトからダウンロードする際には,--http-user と --http-password(新しめのwgetでは--user と --passwordも使用可)というオプションが指定できます.

これ,ローカルで実行する分にはそこまで気にする必要ないんですが,複数人がsshして作業するような環境で,かつログインユーザも同じ場合には,shellのhistoryを遡れば丸見えなわけです.

というわけで,userはまだしも,passwordはSTDINから入力するオプションがあってくれてもいいのになーと思っていたら,wget 1.12以降には--ask-passwordというオプションがあるそうです.

http://www.gnu.org/software/wget/manual/wget.html#Download-Options

‘--ask-password’
    Prompt for a password for each connection established. Cannot be specified when ‘--password’ is being used, because they are mutually exclusive. 

今までmanを読んだwgetがたまたま古かったのか,今日まで知らなかったなあ.