Just another Ruby porter,

〜2015年8月下旬〜


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

2015-08-21 (Fri)

本当は間違っていた拡張リスト

昨日の方法は実は間違っていて各行には

Extension0=/home/eban/.thunderbird/XXXXXXXX.default/extensions/{58D4392A-842E-11DE-B51A-C7B855D89593}.xpi
Extension1=/home/eban/.thunderbird/XXXXXXXX.default/extensions/keyconfig@dorando
Extension2=/home/eban/.thunderbird/XXXXXXXX.default/extensions/{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}.xpi

のようにExtensionN=をつけないといけなかった。
でも、Thunderbirdは文句も言わずに受け付けてくれて、
しかもExtensionN=もちゃんとつけてくれた。気が利いてる!


2015-08-22 (Sat)

ファイルのタイムスタンプ #シェル芸

2015-08-22 01:23:45という形式で得たい。
Rubyだとこんな感じだ。

% ruby -e 'puts File.stat(ARGV[0]).mtime.strftime("%F %T")' file.txt
2014-08-22 01:23:45

GNU coreutils lsなら形式を指定できるので可能。ちょっとまどろっこしいが。

% ls -l --time-style="+%F %T" file.txt | cut -d' ' -f6,7
2014-08-22 01:23:45

そこでstat(1)になるわけだけど、これも余計なものがついてしまう。

% stat -c %y file.txt
2014-08-22 01:23:45.000000000 +0900
% stat -c %y file.txt | cut -c-19
2014-08-22 01:23:45

info statを眺めていたら

   The ‘%W’, ‘%X’, ‘%Y’, and ‘%Z’ formats accept a precision preceded by
a period to specify the number of digits to print after the decimal
point.  For example, ‘%.3X’ outputs the last access time to millisecond
precision.  If a period is given but no precision, ‘stat’ uses 9 digits,
so ‘%.X’ is equivalent to ‘%.9X’.  When discarding excess precision,
time stamps are truncated toward minus infinity.

とあった。%yについては何も書かれてない。
ひょっとしてと試してみたら、printfと同じ挙動になっていた。

% stat -c %.19y file.txt         
2014-08-22 01:23:45

ソースを読んでみたら最終的にはprintfに"%.19s"のように伝わるようで、
結局そういうことだった。つまりこんなことも可能なわけだ。

% stat -c %U file.txt 
eban
% stat -c %10U file.txt
      eban

2015-08-23 (Sun)

AWS Lambda functionでcontext.doneを呼んだからってすぐ終了するわけではない

エラー処理してcontext.doneなりcontext.failを呼べば、
なんとかく終了するような気がするが、
実際は処理が続行し思わぬ挙動になる。
たとえば

if (err) {
  console.log("Error");
  context.fail("");
}
console.log("Success");

のように書いてしまうとSuccessと表示される。
elseで囲むかif文の中でreturnする必要あり。
終わると思い込んでいると中々このバグに気づかない。


2015-08-24 (Mon)

convertでスケッチ状に

-sketchはかすれさせるためじゃなくて、
その名の通りスケッチっぽくする効果なので、
ちょっとその例を紹介。

% convert bakeneko-2015-orig.png -type grayscale -sketch 10x10+30x0 bakeneko-2015-sketch.png

当然ではあるが、サイズはでかくなる。


2015-08-25 (Tue)

amazonにcURLでアクセスすると高い確率で503になる

Pocketに登録するのにcURLでtitleを取ろうとして気づいた。
amazonにアクセスするとやたらと503になる。

% repeat 10 { curl -sL -w '%{http_code}\n' http://www.amazon.co.jp/dp/B00XVN1OSU/ -o /dev/null; sleep 1 }
503
200
503
200
200
503
200
503
503
503

全部503になるならあきらめもするが、
こんなHTTPステータスがランダムに返ってくるんじゃ、
200になるまで繰り返す処理をする人も出てくるわけで、
余計負荷が上がるだけだと思うんだけどねえ。
それはそれとしてブラウザからだとそんなことにはならないので、
試しに内容が空のUser-Agentをつけてみたらいけた。

% repeat 10 { curl -sL -w '%{http_code}\n' http://www.amazon.co.jp/dp/B00XVN1OSU/ -o /dev/null -A ''; sleep 1 }
200
200
200
200
200
200
200
200
200
200

wgetも同様なので-U ""が必要。


2015-08-26 (Wed)

statでls -l相当

stat --helpを見てたら部品は揃ってるようで簡単に実現できた。

% ls -l util-linux_2.25.2*
-rw-r--r-- 1 eban eban  308972 2015-08-05 10:38:42 util-linux_2.25.2-4ubuntu3.debian.tar.xz
-rw-r--r-- 1 eban eban    3563 2015-08-05 10:38:41 util-linux_2.25.2-4ubuntu3.dsc
-rw-r--r-- 1 eban eban 3703644 2014-10-27 18:39:03 util-linux_2.25.2.orig.tar.xz
% stat -c "%A %h %U %G %7s %.19y %n" util-linux_2.25.2*
-rw-r--r-- 1 eban eban  308972 2015-08-05 10:38:42 util-linux_2.25.2-4ubuntu3.debian.tar.xz
-rw-r--r-- 1 eban eban    3563 2015-08-05 10:38:41 util-linux_2.25.2-4ubuntu3.dsc
-rw-r--r-- 1 eban eban 3703644 2014-10-27 18:39:03 util-linux_2.25.2.orig.tar.xz

本当はサイズの文字列の長さを動的に求めないといけないが、結構いけるもんだな。

ああ、export TIME_STYLE="+%F %T"してあるのでちょっとずるしてる。


2015-08-27 (Thu)

findでls -l相当

findでもできた。

% ls -l util-linux_2.25.2*
-rw-r--r-- 1 eban eban  308972 2015-08-05 10:38:42 util-linux_2.25.2-4ubuntu3.debian.tar.xz
-rw-r--r-- 1 eban eban    3563 2015-08-05 10:38:41 util-linux_2.25.2-4ubuntu3.dsc
-rw-r--r-- 1 eban eban 3703644 2014-10-27 18:39:03 util-linux_2.25.2.orig.tar.xz
% find util-linux_2.25.2* -printf "%M %n %u %g %7s %TY-%Tm-%Td %.8TT %p\n"
-rw-r--r-- 1 eban eban  308972 2015-08-05 10:38:42 util-linux_2.25.2-4ubuntu3.debian.tar.xz
-rw-r--r-- 1 eban eban    3563 2015-08-05 10:38:41 util-linux_2.25.2-4ubuntu3.dsc
-rw-r--r-- 1 eban eban 3703644 2014-10-27 18:39:03 util-linux_2.25.2.orig.tar.xz

いや形式にこだわらなければ-lsでいいんだけどね。

% find util-linux_2.25.2* -ls                                             
31069467  304 -rw-r--r--   1 eban     eban       308972 Aug  5 10:38 util-linux_2.25.2-4ubuntu3.debian.tar.xz
31069465    4 -rw-r--r--   1 eban     eban         3563 Aug  5 10:38 util-linux_2.25.2-4ubuntu3.dsc
31069466 3620 -rw-r--r--   1 eban     eban      3703644 Oct 27  2014 util-linux_2.25.2.orig.tar.xz

2015-08-28 (Fri)

Ericsson's Exchange EWS Provider

ThunderbirdのLightningにOutlookの予定表と同期してくれるプラグインを以前使っていたことがある。
Thunderbirdの更新についていけなくなってほとんどreadonly状態だったので外しちゃったんだけど、
ふとまた探してみたら完璧に甦っていた。

http://askubuntu.com/questions/562498/how-do-i-sync-my-exchange-calendar-in-ubuntu-thunderbird-lightning How Do I Sync My Exchange Calendar in Ubuntu (Thunderbird / Lightning)? - Ask Ubuntu
この通りにすればokだ。
Ericssonってあのエリクソンだよな。なぜか凄く活発に活動してる。


2015-08-29 (Sat)

第18回シェル芸勉強会にUstで参加

今回もUstで参戦。

_ Q1 次のファイルは1列目がキー、2列目が値ですが、「オトン」と「オカン」の両方の値があるキーを探してください。:

まずは小手調べ問題。ひねりなし。

% grep 'オ[トカ]ン' text | sort -u | cut -d' ' -f1 | uniq -d
003

_ Q2 次の2つのファイルについて、aだけにあるレコード、bだけにあるレコード、両方にあるレコードを分類せよ:

grepで力技。

% grep -vf b a | sed 's/^/a /'; grep -vf a b | sed 's/^/b /'; grep -f b a | sed 's/^/c /'
a 鹿島田
a 川崎
b 登戸
b 南多摩
c 谷保
c 分倍河原

diffを使った解がなかなかあざやかだったので別解。GNU diffの特有のオプションを使用。

% diff --new-l='b %L' --old-l='a %L' --unchanged-l='c %L' <(sort a) <(sort b) | sort   
a 川崎
a 鹿島田
b 南多摩
b 登戸
c 分倍河原
c 谷保

まあ、長いんであれだけど。

_ Q3 次の3つのファイルについて、それぞれ書いてある数字の合計値を求めましょう。:

空白と改行を+に変換するが、最後の改行も変換されると構文エラーになるので無理矢理0を追加している。

% for i in a b c;do echo "$i $[`tr -s ' \n' + < $i`0]" ;done         
a 15
b 6
c 24

numsumを使えばこんな方法も。

% for i in a b c;do echo -n "$i "; xargs -n1 < $i | numsum; done 
a 15
b 6
c 24

_ Q4 xのついている場所の縦軸と横軸の記号を出力するワンライナーを考えてください。:

awk芸。これもひねりなし。

% awk 'NR==1{split($0,a,"");FS="";next}i=index($0,"x"){print $1"-"a[i]}' cross
a-b
f-d

_ Q5 次のテキストから空白行の重複だけ除去してください。つまり、2行以上の空白行を1行にまとめてください。:

これはcat -sで終了。他にmore -sでもok。
あとsed -zを使った例のawk版。

% awk 'gsub(/\n\n+/,"\n\n")' RS='\0' ORS= text
あ
あ

い
い

う

え

お お
お
お

_ Q6 チェスボードの画像ファイルを作ってください。:

PBMのP1ならテキストファイルなので簡単。

% (echo 'P1 8 8'; printf "0101010110101010%.0s" {1..4}) | convert - -scale 5000% chess.png

convertは見易くしてるだけで、肝はprintfだけ。4回繰り返しになる。
このくらいなら直接埋め込んじゃったほうが手っ取り早い。
だったらひねらずこれでいいな。

% s=0101010110101010; echo P1 8 8 $s$s$s$s | convert - -scale 5000% chess.png

_ Q7 次のファイルには1組だけ同じ文字が含まれていますが、何行目と何行目にあるでしょうか?:

これもひねりなし。

% grep -o . chinese_characters | sort | uniq -d | grep -f - -n chinese_characters      
6:㕐㕑㕒㕓㕔㕕㕖㕗㕘㕙㕚㕛㕜㕝㕞㕟
13:㗀㗁㗂㗃㗄㗅㗆㗇㗈㗉㕐㗊㗋㗌㗍㗎

_ Q8 次のファイルの中に、複数回登場する数字の並びがいくつかありますが、その中で最長のものはどれでしょうか?:

入れ子になっているとだめだが、この場合はいけてしまう。

% sed 's/\(...\+\).*\1/\n\1\n\1\n/g' number | uniq -d 
003
922

この結果を見れば何をやってるかわかると思うし、入れ子がだめな理由もわかるだろう。

% sed 's/\(...\+\)\(.*\)\1/[\1]\2[\1]/g' number      
8264611130023148519839960536022802096895154738213681101[003]238[003]191122723[922]378[922]942503388843815799

2015-08-30 (Sun)

Q8落穂拾い

あちこち解答を見てまわってQ8はこんな方法もあるなとと思った。

% awk '$0=$0$0$0' number | fold -3 | sort | uniq -d
003
922

3回分連結させることで3文字に満たないのを積極的に次のずれに利用すれば、
余計な文字を挿入させなくてもいい。
つまりsedならこんな感じ。

% sed 's/.*/&&&/;s/.../&\n/g' number | sort | uniq -d
003
922

2015-08-31 (Mon)

Windows 10でScanSnap S1500、問題なし

@ScanSnapJPさんから メンションが来てびっくり。
見てみると問題なく使えるとのことで一安心。
ScanSnapのWindows® 10 日本語版 への対応状況を教えてください。 | ScanSnap よくあるご質問 (PFU)


<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!