Just another Ruby porter,

〜2015年5月下旬〜


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

2015-05-21 (Thu)

SynergyとVirtualBoxとLock

この組み合わせでコピペがなぜかできなくなる。

デスクトップPCのWindows7をSynergyのサーバにする。
VirtualBox上のUbuntuを立ち上げる。 ノートPCのWinodws7をSynergyのクライアントにする。
ここまでは全然問題ない。
会議にノートPCを持ってくついでにデスクトップPCをLockする。
するとノートPCでなぜかコピペできなくなる。

いやあ、この組み合わせを特定するのに2ヶ月かかった。
解決してないがコピペできないと仕事にならないことがよくわかった。


2015-05-22 (Fri)

Smart J:COM Boxの字幕

torneで字幕を出してるとJ:COMでも出したくなるわけだが仕様が違う。
torneだと一度字幕ONにするとその後はずっとONになるが、
J:COMではその再生中だけで停止したら解除される。
あとなぜか一時停止中もある程度時間が経つとOFFになる。
これはいったい何の意味があるのか。
再生するとONになるので特に問題ないが、
わざわざOFFにする機能を入れた理由が気になる。

M-ONで字幕出すと歌詞が見られるのですげー便利なのだ。


2015-05-23 (Sat)

awkで最初のフィールドを削除

よく$1=""でお茶を濁しがちだが、それだと先頭に区切りが残ってしまいちょっと具合が悪い。

% echo 'a b c' | awk '{$1=""}1'
 b c

そこでsubで消す手が考えられるが、$1にメタな文字があると破綻する。

% echo 'a b c' | awk '{sub("^" $1 " ", "")}1'
b c
% echo '.* b c' | awk '{sub("^" $1 " ", "")}1'
c

エスケープさせるのも面倒。
長さを求めるのは簡単なのでsubstrしちゃう手はある。

% echo '.* b c' | awk '{$0=substr($0,length($1 " ")+1)}1'
b c

それよりはNFを再構築させるという方法が簡単。

% echo '.* b c' | awk '{$1="";$0=$0;$1=$1}1'
b c

$0=$0でNFが再構築されて3から2になり、$1=$1で$0が再構築される。
$1=$1だけでは変化しない。

% echo '.* b c' | awk '{$1=""}1' 
 b c
% echo '.* b c' | awk '{$1="";$0=$0}1'
 b c
% echo '.* b c' | awk '{$1="";$1=$1}1'
 b c
% echo '.* b c' | awk '{$1="";$0=$0;$1=$1}1'
b c

2015-05-24 (Sun)

きっちり10秒間隔でコマンドを実行 #シェル芸

ループ組んでsleep 10だけではコマンド実行の時間分だけ加算されてどんどん遅れてしまう。
そこで小数点まで考えてsleepさせる。
GNU coreutilsのdateなら%Nでnano secまで得られるので、
これを組み合わせればいける。

% bash -c 'for i in {1..6};do s=($(date +%S\ %3N));n=$[9-s[0]%10].$[(1000-s[1])%1000];sleep $n;date "+%F %T.%3N";done'
2015-05-25 01:55:00.003
2015-05-25 01:55:10.002
2015-05-25 01:55:20.003
2015-05-25 01:55:30.002
2015-05-25 01:55:40.004
2015-05-25 01:55:50.003

%3Nにすればmsecになる。
ただこれ%3Nが9XXだと小数点が2桁になっちゃうからそのあたりを考慮しないと本当はいけない。
まあ、1回目だけなので気にしない。

% bash -c 'for i in {1..6};do s=($(date +%S\ %3N));n=$[9-s[0]%10].$[(1000-s[1])%1000];sleep $n;date "+%F %T.%3N,$n,${s[1]}";done'
2015-05-25 02:02:10.363,3.40,960
2015-05-25 02:02:20.003,9.636,364
2015-05-25 02:02:30.003,9.995,005
2015-05-25 02:02:40.003,9.996,004
2015-05-25 02:02:50.002,9.995,005
2015-05-25 02:03:00.003,9.996,004

2015-05-25 (Mon)

今日もきっちり10秒

やっぱ気になったので%3Nが9XXの場合も考慮する。
整数部と小数部を分けて処理するから変なことになるわけで、
msec単位で最初から扱って後から1000で割ればいい。
という方針でzshでやってみた。

% zsh -c 'repeat 6 {a=$[10000-$(date +%S%3N)%10000];a[-3,-4]=.;sleep $a;date +%S.%3N}'
40.002
50.004
00.003
10.005
20.003
30.004

いい感じだ。1000で割るってことは"."を挿入することなので、実際に割らなくてもいい。
しかしこれだとbashでは別の処理が必要になる。そこでbusyboxのusleepだ。
ってほどでもないが、micro sec単位でsleepできる。

% zsh -c 'repeat 6 { busybox usleep $[10000000-$(date +%s%6N)%10000000];date +%S.%3N }'
10.002
20.002
30.002
40.002
50.002
00.002

micro secなので%6Nになる。かなりすっきりした。


2015-05-26 (Tue)

Cygwinのkeychainが毎回パスフレーズを聞いてきてうっとうしい

先日Cygwinを更新してからkeychainがなんかおかしい。
警告吐いて毎回パスフレーズを要求する。

 * keychain 2.7.1 ~ http://www.funtoo.org
 * Found existing ssh-agent: 6284
 * Warning: Can't determine fingerprint from the following line, falling back to filename
<中略>
Enter passphrase for /home/eban/.ssh/id_dsa:

こうなるとkeychainを使ってる意味がないので調べてみた。
OpenSSH 6.8のリリースノートによるとfingerprintの仕様が変更されていた。

 * Add FingerprintHash option to ssh(1) and sshd(8), and equivalent
   command-line flags to the other tools to control algorithm used
   for key fingerprints. The default changes from MD5 to SHA256 and
   format from hex to base64.

   Fingerprints now have the hash algorithm prepended. An example of
   the new format: SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wXE
   Please note that visual host keys will also be different.

この影響でfingerprintが認識できなくなったようで。
[Solved] OpenSSH 6.8p1-1 and keychain: can't determine fingerprint
このパッチを入れるか、最新版を取ってくればよさげ。


2015-05-27 (Wed)

Windows Updateの再起動の途中で止まる

2時間ぐらい待っても

ステージ 3/3
Windowsを構成するための準備中
コンピュータの電源を切らないでください。

と表示されたまま進まないので、
このメッセージでぐぐってみたらそのものずばりのページにヒットした。
KB2533552 の修正プログラムと...
すでに完了してるので、CTRL+ALT+DELでログオンすればokとのこと。
2時間も待たなくても。


2015-05-28 (Thu)

きっちり(ry

あんなに凝らなくても、バックグラウンドで動かせば結構正確に起動できるのであった。
待つのが面倒なので2秒で。

% repeat 10 (date +"%F %T.%3N"&sleep 2) 2> /dev/null
2015-05-29 00:01:11.890
2015-05-29 00:01:13.895
2015-05-29 00:01:15.900
2015-05-29 00:01:17.905
2015-05-29 00:01:19.910
2015-05-29 00:01:21.915
2015-05-29 00:01:23.920
2015-05-29 00:01:25.925
2015-05-29 00:01:27.931
2015-05-29 00:01:29.936

なんだかんだで5msecぐらいオーバーヘッドがあるようで1.995にすると完璧だ。

% repeat 10 (date +"%F %T.%3N"&sleep 1.995) 2> /dev/null
2015-05-29 00:04:30.114
2015-05-29 00:04:32.115
2015-05-29 00:04:34.114
2015-05-29 00:04:36.115
2015-05-29 00:04:38.115
2015-05-29 00:04:40.115
2015-05-29 00:04:42.115
2015-05-29 00:04:44.115
2015-05-29 00:04:46.115
2015-05-29 00:04:48.115

まあ、これは他に重い処理が走ったらすぐ破綻するが。


2015-05-29 (Fri)

DNF

久し振りにFedoraをインストールしたらすでにDNFな世界だった。

[eban@fedora ~]$ sudo yum install nawk
[sudo] password for eban: 
Yum command has been deprecated, redirecting to '/usr/bin/dnf install nawk'.
See 'man dnf' and 'man yum2dnf' for more information.
To transfer transaction metadata from yum to DNF, run:
'dnf install python-dnf-plugins-extras-migrate && dnf-2 migrate'

エラー: Failed to synchronize cache for repo 'fedora' from <以下略>

yum自身はすでにwrapperになっていてメッセージを吐いてdnfを起動するようになっている。
だから/etc/yum.confでproxy設定をしても意味がなく/etc/dnf/dnf.confを書き換えないといけない。


2015-05-30 (Sat)

問題5

最初はRubyとかで考えていたのをそのまま忠実に置き換えていたもんだから、長い上に非常に遅かった。

% for i in {+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}; do a=$(echo $i|grep -o .|paste <(seq 9) - |\
  sed ":;s/[.\t\n]//g;N;b");echo "$a = $[$a]";done|grep "= 100"
1+2+3-4+5+6+78+9 = 100
1+2+34-5+67-8+9 = 100
1+23-4+5+6+78-9 = 100
1+23-4+56+7+8+9 = 100
12+3+4+5-6-7+89 = 100
12+3-4+5+67+8+9 = 100
12-3-4+5-6+7+89 = 100
123+4-5+67-89 = 100
123+45-67+8-9 = 100
123-4-5-6-7+8-9 = 100
123-45-67+89 = 100
for i in {+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}{+,-,.}; do; a= ;    0.67s user 2.55s system 11% cpu 27.990 total
grep "= 100"  0.00s user 0.28s system 1% cpu 27.989 total

それを1から9の間に自分で挟むことで対応。短いし一瞬で終わるのであった。

% for i in 1{+,-,}2{+,-,}3{+,-,}4{+,-,}5{+,-,}6{+,-,}7{+,-,}8{+,-,}9; do echo "$i = $[$i]";done | grep "= 100"
1+2+3-4+5+6+78+9 = 100
1+2+34-5+67-8+9 = 100
1+23-4+5+6+78-9 = 100
1+23-4+56+7+8+9 = 100
12+3+4+5-6-7+89 = 100
12+3-4+5+67+8+9 = 100
12-3-4+5-6+7+89 = 100
123+4-5+67-89 = 100
123+45-67+8-9 = 100
123-4-5-6-7+8-9 = 100
123-45-67+89 = 100

ゴルフするとこんな感じだ。

% bash -c 'for i in '$(seq -s "{+,-,}" 9)';{ echo "$i = $[$i]";}|grep \ 100'
1+2+3-4+5+6+78+9 = 100
1+2+34-5+67-8+9 = 100
1+23-4+5+6+78-9 = 100
1+23-4+56+7+8+9 = 100
12+3+4+5-6-7+89 = 100
12+3-4+5+67+8+9 = 100
12-3-4+5-6+7+89 = 100
123+4-5+67-89 = 100
123+45-67+8-9 = 100
123-4-5-6-7+8-9 = 100
123-45-67+89 = 100

seq -sでのパターン生成がうまくはまっている。

% seq -s "{+,-,}" 9
1{+,-,}2{+,-,}3{+,-,}4{+,-,}5{+,-,}6{+,-,}7{+,-,}8{+,-,}9

2015-05-31 (Sun)

スキャンした結果をGoogle Photosへ

200枚ほどスキャンした画像が置いてあるディレクトリD&Dしてみたら10分ほどかかった。
APIもないしちょっとこれは時間がかかりすぎ。
試しにzipだのpdfだのを試してみたが、ちゃんとスキップされた。
foo.pdfをfoo.gifと名前を変えたらアップロードは成功するが、最終的に中身を見てスキップされる。
つまり複数枚を1つファイルで上げるにはもうGIFアニメぐらいしかない。
というわけでconvertで200ページほどのGIFアニメを作ったら15分もかかった。実に本末転倒だ。
もっと速く作る方法を探ろう。

それはそれとして10ページほどで作ったら全然問題なかったので、
保存するだけなら方向性は間違ってない。いや間違ってるかも。
とりあえずがんがんGoogle Photosへ上げたい。
あっ、mp4へ変換すれば一時停止できるようになるし、読めるか。
いや1080pじゃなあ。


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