Just another Ruby porter,


4月下旬の日記 | RDF

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-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-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-20 (Sun)

do-release-upgradeできない

vpsも上げるかと作業してみると、リポジトリの状態がまずいようで、do-release-upgradeできない。

Error during update 

A problem occurred during the update. This is usually some sort of 
network problem, please check your network connection and retry. 

W:Failed to fetch 
gzip:/var/lib/apt/lists/partial/jp.archive.ubuntu.com_ubuntu_dists_trusty_universe_source_Sources 
Hash Sum mismatch 
, W:Failed to fetch 
gzip:/var/lib/apt/lists/partial/jp.archive.ubuntu.com_ubuntu_dists_trusty_main_binary-amd64_Packages 
Hash Sum mismatch 
, W:Failed to fetch 
gzip:/var/lib/apt/lists/partial/jp.archive.ubuntu.com_ubuntu_dists_trusty_universe_binary-i386_Packages 
Hash Sum mismatch 
, E:Some index files failed to download. They have been ignored, or 
old ones used instead. 


Restoring original system state

Aborting
Reading package lists... Done    
Building dependency tree          
Reading state information... Done
Building data structures... Done 

しばらくしたら問題なく進んだ。

Ubuntu 14.04でいろいろなくなった

ffmpegは完全にavconvへ移行。あとruby1.8もなくなった。


2014-04-19 (Sat)

Ubuntuのsubversionが更新されてsvnのフォーマットが新しくなった

svn upgradeが必要だ。

% svn up
svn: E155036: Please see the 'svn upgrade' command
svn: E155036: The working copy at '/home/eban/ruby/ruby-trunk'
is too old (format 29) to work with client version '1.8.8 (r1568071)' (expects format 31). You need to upgrade the working copy first.
% time svn upgrade
Upgraded '.'
svn upgrade  0.11s user 0.02s system 27% cpu 0.480 total
% svn up
Updating '.':
U    README.EXT
U    time.c
U    include/ruby/intern.h
U    include/ruby/ruby.h
U    ChangeLog
U    string.c
U    parse.y
U    ext/zlib/zlib.c
U    ext/openssl/ossl_x509name.c
U    NEWS
U    numeric.c
U    README.EXT.ja
U    internal.h
U    version.h
U    bignum.c
U    marshal.c
U    test/ruby/test_syntax.rb
U    rational.c
Updated to revision 45637.

一瞬で終わる。


4月下旬の日記 | RDF


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

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