Just another Ruby porter,

〜2014年12月中旬〜


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

2014-12-11 (Thu)

Smart LockとFitbit

Bluetoothデバイスが必要らしい。
Fitbitがあるじゃんということで試してみるも全然認識しない。
いろいろ調べてみたが、 だめっぽい。
顔認識はなんかあまり成功しないしなあ。


2014-12-12 (Fri)

AOL ReaderのAPIを使って広告を既読に

まずは全リストを取得。トークンは こんな感じでブラウザから。

% api0=https://reader.aol.com/reader/api/0
% curl -s -H 'Token: トークン' "$api/subscription/list" > aol.json

とりあえず誠 Biz.ID LifeHackを例に。feed idを抜き出す。

% jq -r '.subscriptions[]|select(.title=="誠 Biz.ID LifeHack 最新記事一覧").id' aol.json 
feed/eAT9PC

コンテンツを取ってくる。

% curl -s -H 'Token: トークン' \
  "$api0/stream/contents/feed/eAT9PC?n=10000&xt=user/-/state/read" > biz.json

タイトルが"AD: "から始まってるものは広告とみなす。

% jq -r '.items[]|select(.title|startswith("AD: "))|.id' biz.json
eAT9PC/1418002431931818061
eAT9PC/1417567924582392308
eAT9PC/1416522361738274492
eAT9PC/1416194912121917917
eAT9PC/1415934309109696095
eAT9PC/1415580180852723343
eAT9PC/1414452259583598087
eAT9PC/1413950802051252623
eAT9PC/1413947114822452410
eAT9PC/1413762538219094236
eAT9PC/1413592528310138989

これを既読にする。

% jq -r '.items[]|select(.title|startswith("AD: "))|.id' biz.json | \
  xargs -I@ -n1 curl -s -H 'Token: トークン' \
  --data-urlencode "a=user/-/state/read" --data-urlencode "i=@" --data-urlencode ac=edit "$api0/edit-tag";echo

edit-tagはPOSTじゃないとだめ。
InoreaderならGETでいいんだけど。
Google ReaderのフォロワーはAPIが互換なので楽だ。


2014-12-13 (Sat)

第14回東京居残りシェル芸勉強会にUstで参加

行けなくて残念だったが、Ustで参加。一応全部解いた。

Q1 100!を計算してください。正確に。
% seq -s \* 100 | BC_LINE_LENGTH=1000 bc
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

GNU bcは途中で改行するが、BC_LINE_LENGTHで長さを指定できる。dcも同様。

Q2 次のseqからsed(と言ってもgsed)だけでfizzbuzzを完成させてください。
% seq 100 | sed '5~5s/.*/Buzz/;3~3s/[^B]*/Fizz/'

なつかしい。

% seq 100 | jq -r '. as$i|[["Fizz"][.%3],["Buzz"][.%5]]|add//$i'

ついでにjqでも解いた。

Q3 このうち素数はどれでしょうか?
% echo 0xaf 0x13 0x0d 0x24 0x58 | ruby -rmathn -ane 'puts $F.select{|x|Prime.prime?(x.hex)}' 
0x13
0x0d

Rubyにはいろいろあるしねえ。

% echo 0xaf 0x13 0x0d 0x24 0x58 | fmt -1 | sed s/..// | xargs -n1 openssl prime -hex | grep -v not
13 is prime
D is prime

opensslにもあるが、-hexをつけても0xは受け付けてくれない。

Q4 次の16進数(UTF-8)で書かれたメッセージを復元してください。
% echo e89fb9e3818ce9a39fe381b9e3819fe38184|xxd -r -p                                           
蟹が食べたい
% echo e89fb9e3818ce9a39fe381b9e3819fe38184|ruby -e 'puts [gets.chop].pack("H*")'
蟹が食べたい
% echo e89fb9e3818ce9a39fe381b9e3819fe38184 | perl -lne 'print pack("H*",$_)'                   
蟹が食べたい

16進ダンプを元に戻す。xxdはvimに付属するコマンド。

Q5 次のようなファイルを作ってください。
(catするとahoとだけ出て、容量は1GB。)
% echo aho > hoge; truncate -s 1000000000 hoge
% ls -l hoge                                                                 
-rw-r--r-- 1 eban eban 1000000000 2014-12-13 15:38:30 hoge

最近だとddよりもtruncateが使われる。

% du -sh hoge
4.0K	hoge

sparse fileになるのでサイズも小さい。

Q6 日本の山を標高の高い順から並べていってください。順位と標高も一緒に出力してください。
% w3m -dump -cols 999 http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%B1%B1%E4%B8%80%E8%A6%A7_%28%E9%AB%98%E3%81%95%E9%A0%86%29 |& \
  awk '/^([0-9]{1,2}|100) /{print $1,$2,$4}' 

w3mが面倒臭いことは全部やってくれるので便利。

Q7 分数で正確に答えを求めてください。できれば約分してください。
% echo '1/4 + 2/5 + 7/16 - 5/9' | ruby -e 'puts eval(gets.gsub(/\S{3,}/,"\\&r"))'
383/720

1/4r + 2/5r + 7/16r - 5/9rという文字列に変換すればRubyは解釈してくれる。ただし、Ruby 2.1以降。

Q8 *がいっぱいある文字列をポキポキ折ってください。
% printf "%65s\n" | tr ' ' '*' | fold -6 | sed '2~2s/./&\n/g;s/\n$//' | sed 'x;s/./ /g;s/.//;G;s/\n//;h'

適当に長い文字列を作って、

% printf "%65s\n" | tr ' ' '*'          
*****************************************************************

6文字で折り返して、

% printf "%65s\n" | tr ' ' '*' | fold -6
******
******
******
******
******
******
******
******
******
******
*****

偶数行目だけ縦にして、

% printf "%65s\n" | tr ' ' '*' | fold -6 | sed '2~2s/./&\n/g;s/\n$//'                                   
******
*
*
*
*
*
*
******
*
*
以下略

インデントする。

% printf "%65s\n" | tr ' ' '*' | fold -6 | sed '2~2s/./&\n/g;s/\n$//' | sed 'x;s/./ /g;s/.//;G;s/\n//;h'
******
     *
     *
     *
     *
     *
     *
     ******
          *
          *
以下略

2014-12-14 (Sun)

空行を出力する

なんか流行ってるので乗ってみる。100行ほど。
まずはImageMagickのconvertだ。

% convert null: -duplicate 49 -format "\n" info:

確認はodがいいかもしれない。実は2倍になって出ることに気づいてなかった。
つまり残念ながら奇数行だと使えない。

% convert null: -duplicate 49 -format "\n" info: | od -c -Ad
0000000  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n
*
0000096  \n  \n  \n  \n
0000100

次に最近熱いjqだ。短くて実に優秀だ。デフォルトの改行があるので99。

% jq -n -r '"\n"*99'

zshだとrepeatがあるのでforを使わなくてもいい。

% repeat 100 echo

2014-12-15 (Mon)

分数あれこれ

rなんてつける必要なかった。

% echo '1/4 + 2/5 + 7/16 - 5/9' | ruby -rmathn -ne 'puts eval$_'
383/720

irb -mという話題も出てたが、こういうことだと思う。

% echo '1/4 + 2/5 + 7/16 - 5/9' | irb -m                        
Switch to inspect mode.
start math mode
1/4 + 2/5 + 7/16 - 5/9
(383/720)

あとPerlにもbigratというのがあって、分数を扱える。

% echo '1/4 + 2/5 + 7/16 - 5/9' | perl -Mbigrat -nle 'print eval'
383/720

2014-12-16 (Tue)

awkの文字列と数値

まぜて比較するとどっちになるのか?

% mawk 'BEGIN{print "10"<2}'
1
% mawk 'BEGIN{print 10<"2"}'
1
% mawk 'BEGIN{print 10<2}'  
0

どちらかが文字列なら文字列として比較される。
$1とかは数値として扱われる。

% echo 2 | mawk '{print 10<$1}'
0
% echo 2 | mawk '{print "10"<$1}'
1

2014-12-17 (Wed)

久し振りにfitbitのバッテリーが切れる

メールが来るからと安心していたら、タイミングが悪かったようで。
家でしか同期しないから、そりゃそうだよな。
例によって5周させて表示を消した。


2014-12-18 (Thu)

Smart J:COM Boxが若干速くなった

「録画リストを取得しています。」とか見慣れないメッセージが出てあれっと思ったら、
なんかいつもより動作がきびきびしてる。
お知らせを確認してみるとやはりアップデートしていた。
特に高速化については書いてない。あ、やっとオートチャプター機能が入ったか。
初期値は切と書いてあったが、10分になってた。しかし学習型リモコンのボタンが足りない。


2014-12-19 (Fri)

checkers pattern

jqじゃ無理かと思ったが、 yamayaさんのbashの解を見て、これをjqに移植してみたらいけた。

bash: read a b;seq -f"echo \$[({1..$b}+%g+1)%%2]" $a|sh
jq: ./" "|map(tonumber)|range(0;.[0])as$i|[(range(0;.[1])+$i+1)%2]|@sh

最後の|@shが奇しくも似たようになっているが、全然違う意味なのが面白い。


2014-12-20 (Sat)

jqゴルフで添削

jqゴルフを始めてから過去問を地味に解いてるわけだけど、
ランキングトップのteebeeさんに添削されまくっている。
まあ、そのおかげでぐんぐんjq力が上がってるわけで、
まったくもって頭が上がらない。

まあだいたいはStatisticsで予想はできるけど、限界があるしねえ。
splitが/でできるなんてまさかのgorubyだよ。マニュアルにはたしかに書いてあるが。


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