Just another Ruby porter,

〜2014年4月下旬〜


<Older(,) | Newer(.)> | Recent(/)>> | RDF

2014-04-21 (Mon)

extconf.rbでmake -j 5と決め打ちしているgemがあって困った話

古いマシンでコアは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だけだと無制限なのか。それも怖いな。


2014-04-22 (Tue)

たった6個のsedを通せば、Apacheログは驚くほど扱いやすくなる - Qiita

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

2014-04-23 (Wed)

User-Agentの罠

昨日の

\(.*\) \(.*\) \(.*\) \[\(.*\)\] "\(.*\)" \(.*\) \(.*\) "\(.*\)" "\(.*\)"

のような正規表現は

\([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^]]*\)\] "\([^"]*\)" \([^ ]*\) \([^ ]*\) "\([^"]*\)" "\([^"]*\)"

としたほうがバックトラックを抑えることができるので速いが、
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/'

とするほうが速いし簡単でわかりやすいが。


2014-04-24 (Thu)

Dynのfree accountは5/7に終了する

昨日メールが来て気づいた。5/7でfree accountも終了になるようで。
ぐぐってみたらCEOのブログで発表されていた。
Why We Decided To Stop Offering Free Accounts | Dyn Blog
FAQもあるね。
Free User Discontinuation FAQs - Dyn


2014-04-25 (Fri)

openssl prime

opensslコマンドで素数判定できるのはいいが、なぜか結果は16進になってしまう。

% openssl prime 255 
FF is not prime

つまり素数判定しつつ16進にも変換できるわけだ。どんな用途だ。


2014-04-26 (Sat)

Log4rでタイムスタンプ

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"となるわけだが、
疑問に思わないのだろうか。たしかにそっちのほうが名前がふさわしいと思うので気持ちはわかるが。


2014-04-27 (Sun)

Hototがsegvで立ち上がらないのでmikutter

なにが原因だかわからないが、こういうときぐらいしか試す機会がないので、
mikutterを久し振りに。mikutterも結構動かないことが多いが今回は大丈夫だった。
mikutterのタブはよくわからない。リストを設定しても保存されなかったりで。
でもpluginが書けるからやっぱいいよなあ。


2014-04-28 (Mon)

Ruby標準添付logger.rbの表示形式を変更する

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

デフォルトの表示形式はちょっと煩雑すぎるかな。


2014-04-29 (Tue)

CPU使用率

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を使えばいいんだがこういう方法もあるということで。


2014-04-30 (Wed)

Firefox 29

見た目をカスタマイズしていたもんだから、
今回の変更でいろいろと外観が変わってもう変更するのやめた。
とはいうもののタイトルは表示してくれないと困るのでそこだけ。
三本線のボタンを押してメニューを開いて左下の+カスタマイズを選び、
また左下のタイトルバーを押せばok。
最初はこれが押せるとは気づかずしばらく悩んだ。
あとはステータスバーじゃなくてアドオンバーをどうするかだけど、
メニューの中にほとんど閉じ込めることができてなんかすっきりした。
インジケータ的なやつだけ上に出しとけばよさそうだ。
といいつつも The Addon Bar (restored)を入れた。
やっぱ必要だな。


<Older(,) | Newer(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!