〜2014年4月下旬〜
古いマシンでコアは1個しかないし、load averageががんがん上がってもう先に進まない。
最終的には3時間後にcpp1plusがなんだかわからないエラーを吐いて死亡。
def self.run_build_commands setup_env patch_configure system(*configure_cmd) && system("make", "clean") && system("make", "-j", "5") && system("make", "install") end
gemになってるってことは中身を書き換えるのも面倒でどうしたもんかと思ったが、
makeのwrapperを作ってごまかしてみたらうまくいった。50分ほどで問題なく終了。
#!/bin/sh exec /usr/bin/make "$@" -j 1
という内容のファイルで~/bin/makeに作っておく。
-jオプションは後から指定されたほうが優先される。
-j [jobs], --jobs[=jobs] Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.
-jだけだと無制限なのか。それも怖いな。
LTSVとかもっと扱いやすい形式にすればいいんじゃないかという話ではあるが、
そんなところをいじれない一般ユーザーもいるわけで。
しかし、このsedスクリプトはちょっといただけない。
sed 2号には
sed 's/ "\([^"]*\)" / '"$LF"'"\1"'"$LF"' /g'
のように""の両側に空白があるので、
肝心の最後のフィールドであるUser-Agentにはマッチしない。
たとえ最後に空白を追加してもその前のフィールドも""なため、
やはり最後のフィールドは取り残される。
gist版でもそうなってるのでほらこのとおりとはならないはずなんだけどねえ。
% cat httpd-access.log | ./apalognorm.sh 192.168.0.1 - - [17/Apr/2014:11:22:33_+0900] "GET_/index.html_HTTP/1.1" 200 43206 "https://www.google.co.jp/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
しかも元に戻っていない。
CombinedLogはフィールド数も固定なので、こんなめんどうなことしなくても
sed 's/\(.*\) \(.*\) \(.*\) \[\(.*\)\] "\(.*\)" \(.*\) \(.*\) "\(.*\)" "\(.*\)"/\1`\2`\3`\4`\5`\6`\7`\8`\9/'
でいいんじゃないかな。
区切りはめったに現われないback quoteにしたけどもちろんタブでいい。
あとはcutなりawkなりお好みのコマンドで。
% sed 's/\(.*\) \(.*\) \(.*\) \[\(.*\)\] "\(.*\)" \(.*\) \(.*\) "\(.*\)" "\(.*\)"/\1`\2`\3`\4`\5`\6`\7`\8`\9/' httpd-access.log |\ cut -f9 -d\` Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
昨日の
\(.*\) \(.*\) \(.*\) \[\(.*\)\] "\(.*\)" \(.*\) \(.*\) "\(.*\)" "\(.*\)"
のような正規表現は
\([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^]]*\)\] "\([^"]*\)" \([^ ]*\) \([^ ]*\) "\([^"]*\)" "\([^"]*\)"
としたほうがバックトラックを抑えることができるので速いが、
access.logを見るとUser-Agentの中には"を含むものがあったりする。
"{:agent_name=>\"test\"} (2.3.3, ruby 1.9.3 (2012-10-12))"
なんだよ、その名前は。
というわけで""だけはそのままにして
\([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^]]*\)\] "\(.*\)" \([^ ]*\) \([^ ]*\) "\(.*\)" "\(.*\)"
とするのがいいかもしれない。
まあ、Perlで
perl -pe 's/(.*?) (.*?) (.*?) \[(.*?)\] "(.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/\1`\2`\3`\4`\5`\6`\7`\8`\9/'
とするほうが速いし簡単でわかりやすいが。
昨日メールが来て気づいた。5/7でfree accountも終了になるようで。
ぐぐってみたらCEOのブログで発表されていた。
Why We Decided To Stop Offering Free Accounts | Dyn Blog
FAQもあるね。
Free User Discontinuation FAQs - Dyn
opensslコマンドで素数判定できるのはいいが、なぜか結果は16進になってしまう。
% openssl prime 255 FF is not prime
つまり素数判定しつつ16進にも変換できるわけだ。どんな用途だ。
File: patternformatter.rb [1.1.7 Log4r API]を見るとdate_patternかdate_methodを使えばいいとわかる。
require 'rubygems' require 'log4r' logger = Log4r::Logger.new(self.class.to_s) formatter = Log4r::PatternFormatter.new( :pattern => "%d %C[%l]: %M", :date_pattern => "%Y/%m/%d %T" ) logger.outputters = Log4r::StdoutOutputter.new(STDOUT, :formatter => formatter) logger.debug "hoge"
実行するとこんな感じで表示される。
2014/04/26 22:11:35 Object[DEBUG]: hoge
date_methodを使う場合は
:date_method => "strftime('%F %T')"
のような感じになる。
ただ、ぐぐるとなぜかdate_formatを使った例が出てくる。
しかも内容は判を押したように"%Y/%m/%d %H:%M:%S"で。
そんな設定はないので当然無視され表示はデフォルトの"%Y-%m-%d %H:%M:%S"となるわけだが、
疑問に思わないのだろうか。たしかにそっちのほうが名前がふさわしいと思うので気持ちはわかるが。
なにが原因だかわからないが、こういうときぐらいしか試す機会がないので、
mikutterを久し振りに。mikutterも結構動かないことが多いが今回は大丈夫だった。
mikutterのタブはよくわからない。リストを設定しても保存されなかったりで。
でもpluginが書けるからやっぱいいよなあ。
Log4rを使わなくても標準添付のlogger.rbがあるわけで、こっちの表示形式を変更してみる。
先日のLog4rとまったく同じ形式にする。
require 'logger' logger = Logger.new(STDOUT) logger.progname = self.class.to_s logger.debug "hoge" logger.formatter = proc do |sev, time, prog, msg| "#{time.strftime('%Y/%m/%d %T')} #{prog}[#{sev}]: #{msg.is_a?(String) ? msg : msg.inspect}\n" end logger.debug "hoge"
こちらはprocをというかcallメソッドが呼び出せるものを渡せばいい。
引数はseverity, time, progname, messageの順になっている。
%なんちゃらとか覚えなくていいのでこの方法のほうがいいと思う。
D, [2014-04-29T01:43:33.718880 #17391] DEBUG -- Object: hoge 2014/04/29 01:43:33 Object[DEBUG]: hoge
デフォルトの表示形式はちょっと煩雑すぎるかな。
CPU使用率が知りたければtopコマンドを見ればいいが、注意が必要。
% top -bn1|grep '^%Cpu' %Cpu(s): 8.0 us, 2.2 sy, 7.0 ni, 79.9 id, 2.5 wa, 0.4 hi, 0.0 si, 0.0 st
のように79.9 idがidleを意味しているので100-79.9=20.1%となる。
しかしtopが1回目に表示しているのは直近ではなく起動してからの平均値になっている。
だから直近のが知りたければ2回目以降を見ないといけない。
topの更新間隔は3秒なので単に-bn2では3秒待つことになる。
そんなに待つ必要はないので-d1として1秒ぐらいにしておく。
% top -bn2 -d1|grep '^%Cpu' %Cpu(s): 8.1 us, 2.2 sy, 7.0 ni, 79.8 id, 2.5 wa, 0.4 hi, 0.0 si, 0.0 st %Cpu(s): 2.2 us, 1.2 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
あとは抜き出せばいい。そのあたりはawkで。余計なプロセスがなるべく出ないように-p0もつけている。
% top -bn2 -d1 -p0 top - 01:14:07 up 1 day, 12:16, 10 users, load average: 0.29, 0.67, 1.05 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 8.1 us, 2.2 sy, 7.0 ni, 79.9 id, 2.5 wa, 0.4 hi, 0.0 si, 0.0 st KiB Mem: 8134968 total, 6435356 used, 1699612 free, 242504 buffers KiB Swap: 8347544 total, 708 used, 8346836 free. 2916544 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5959 eban 20 0 26588 1364 1096 R 0.0 0.0 0:00.00 top top - 01:14:08 up 1 day, 12:16, 10 users, load average: 0.29, 0.67, 1.05 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.0 us, 0.8 sy, 0.0 ni, 97.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 8134968 total, 6435356 used, 1699612 free, 242504 buffers KiB Swap: 8347544 total, 708 used, 8346836 free. 2916544 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5959 eban 20 0 26596 1424 1144 R 0.0 0.0 0:00.00 top % top -bn2 -d1 -p0 | awk '/^%Cpu/&&i++{print 100-$8 "%"}' 2.8%
i++で2個目の%Cpuを抜き出している。まあ、tail -1を使えばいいんだがこういう方法もあるということで。
見た目をカスタマイズしていたもんだから、
今回の変更でいろいろと外観が変わってもう変更するのやめた。
とはいうもののタイトルは表示してくれないと困るのでそこだけ。
三本線のボタンを押してメニューを開いて左下の+カスタマイズを選び、
また左下のタイトルバーを押せばok。
最初はこれが押せるとは気づかずしばらく悩んだ。
あとはステータスバーじゃなくてアドオンバーをどうするかだけど、
メニューの中にほとんど閉じ込めることができてなんかすっきりした。
インジケータ的なやつだけ上に出しとけばよさそうだ。
といいつつも
The Addon Bar (restored)を入れた。
やっぱ必要だな。