Just another Ruby porter,

〜2016年6月下旬〜


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

2016-06-21 (Tue)

Q5別解

awkだけでもいけそうだと思いついたのがこれ。

% gawk '12==a[$0=substr($1,1,4)]+=!$2' monthly_typhoon 
1984
1986
2000
2008

ただしmawkだと$0=substr($1,1,4)のほうが先に評価されて$2が常に空になるのでだめ。
というわけでこうしてみた。

% mawk '!$2&&12==++a[$0=substr($1,1,4)]' monthly_typhoon
1984
1986
2000
2008

ああ、だったらsubでYYYYMM 0のMM 0を空文字で置き換えて、
subの戻り値で置換したかどうかを判断すればよさげ。

% mawk 'sub(/.. 0/,"")&&++a[$0]==12' monthly_typhoon
1984
1986
2000
2008
% gawk 'sub(/.. 0/,"")&&++a[$0]==12' monthly_typhoon
1984
1986
2000
2008

これでgawk/mawkのどちらでも動き、しかも元の方法よりも短いしわかりやすくなった。


2016-06-22 (Wed)

VirtualBoxの仮想マシンイメージがみつからない

といって立ち上がらなくなった。
原因はWindowsが勝手にシステム更新して強制的に再起動していたからなんだけど、
もうほんとやめて欲しい。ちょっと目を離した隙に要らんことをする。
それはそれとして、VMが置いてあるフォルダをみるとSolydx.vbox-tmpみたいな名前があるので、
これをSolydx.vboxと名前を変更してからVirtualBoxを立ち上げればok。


2016-06-23 (Thu)

J:COMの挙動が元に戻る

録画終了しても録画中のまま。
こうなると追い掛け再生してたときにいちいちメニューに戻ってから、
録画リストを選ばないといけないので面倒臭い。


2016-06-24 (Fri)

awkで1個目と2個目のファイルで処理を変える

方法はいくつかある。

_ NRとFNRの違いを利用:

NRは通しでFNRは各ファイルでの行番号になるので1個目だけは同一になる。
そこで

'
  NR==FNR{file1の処理; next}
  {file2の処理}
' file1 file2

のようにnextで強制的に次の行の処理へ飛ばしてしまえばいい。

_ フラグを使う:

file1とfile2の間に変数の代入を入れることで、フラグとして使う。

'
  !f{file1の処理}
  f{file2の処理}
' file1 f=1 file2

file1の処理が終わった後でf=1になる。


2016-06-25 (Sat)

Q2をawkだけで解く

昨日の件を踏まえるとこうなる。

% awk '
  NR==FNR{year[substr($1,1,4)]+=$2; next}
  {FS=","}FNR>1{if(year[$1]!=+$NF)print $1,"not match"}
' monthly_typhoon landing.csv

monthly_typhoonの年ごとの上陸回数をyearに入れて、
landing.csvとつきあわせる。
+$NFとすることで空文字でも0にできる。


2016-06-26 (Sun)

シーザー暗号 #シェル芸

Linuxコンソール上でアルファベット順にn文字ずらした文字列を得る(シーザー暗号) | 俺的備忘録 〜なんかいろいろ〜
tacの意味がよくわからない。あとtrで空白を"."に変換しているのも不要のような。

% echo abcdefg | tr "$(printf %1sA-z)" A-zA-z
bcdefgh
% echo aBCdEfg | tr "$(printf %9sA-z)" A-zA-z
jKLmNop

でいいのではないかな。大文字が含まれていてもいける。

% echo bcdefgh | tr A-z "$(printf %1sA-z)"
abcdefg
% echo jKLmNop | tr A-z "$(printf %9sA-z)"
aBCdEfg

2016-06-27 (Mon)

シーザー暗号改 #シェル芸

昨日のはzがAになったりといろいろとダメダメだったの出直し。
1つずらす場合は

tr a-zA-Z b-zaB-ZA

となればいいわけだが、1からこの文字列を作るのは難しい。そこで

abcdefghijklmnopqrstuvwxyz

bcdefghijklmnopqrstuvwxyza

に変換することにする。これはsedなら簡単だ。

% printf %s {a..z} | sed -E 's/^(.{1})(.*)/\2\1/;s/.*/&\U&/'
bcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZA

というわけで大文字も含んだ形で完成。

solydx:w/1606 [0] % echo aBCdEfgXyZ | tr a-zA-Z "$(printf %s {a..z} | sed -E 's/^(.{9})(.*)/\2\1/;s/.*/&\U&/')"
jKLmNopGhI
solydx:w/1606 [0] % echo jKLmNopGhI | tr "$(printf %s {a..z} | sed -E 's/^(.{9})(.*)/\2\1/;s/.*/&\U&/')" a-zA-Z
aBCdEfgXyZ

でも、ちょっとださい。


2016-06-28 (Tue)

rm -rf dirよりもrsync -a --deleteのほうが速いらしい

Optimal way of deleting huge numbers of files
なんとも不思議な話ではある。ベンチマーク結果はなぜかすでに存在しなようで、
web.archive.org経由で。
A faster way to delete millions of files in a directory
圧倒的だ。というわけでちょっと試してみた。
同じように100万ファイルで。

% time rm -r a
rm -r a  1.36s user 19.62s system 7% cpu 4:29.74 total
% time rsync -a --delete empty/ b  
rsync -a --delete empty/ b  1.47s user 10.96s system 11% cpu 1:49.94 total

なるほど結構違う。


2016-06-29 (Wed)

文字列の繰り返し

なんだかんだでjqを使うのが一番簡単な気がしてきた。

% jq -nr '"a"*10'       
aaaaaaaaaa
% echo a | jq -Rr '.*10'
aaaaaaaaaa

こんな感じで短く書ける。
それかjot。

% jot -s "" -b a 10
aaaaaaaaaa

あとはshuf。

% shuf -rn10 -e a | paste -sd ""
aaaaaaaaaa

2016-06-30 (Thu)

Slack通知がうっとうしい

監視系からの通知がくるとポップアップされてとてもうっとうしい。
というわけでMuteしてたんだけど、まあこれはこれでグレーアウトされちゃって、
まったく気づかないという欠点が。
というわけで最近はDesktop notificationsのMemntions of my name or highlight wordsを使ってる。
ポップアップされないのでまあ満足。


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