Just another Ruby porter,

〜2014年5月上旬〜


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

2014-05-01 (Thu)

convertで丸く切り抜く

-drawで円が描けるのでそれを利用して切り抜く。

% convert bakeneko-eban-twitter.png \
  \( +clone -threshold -1 -negate -fill white -draw "circle 150,150 150,0" \) \
  -alpha off -compose copy_opacity -composite bakeneko-eban-twitter-circle.png

こんな感じ。

circleの引数はちょっと変わっていて、
中心と半径ではなく中心と半径分離れた1点を指定する。
つまり指定のしかたはいくつもある。


2014-05-02 (Fri)

convertで角丸の形に切り抜く

ベジェ曲線とか使うまでもなく、そのものずばりのroundrectangleが使える。

% convert bakeneko-eban-twitter.png \
  \( +clone -threshold -1 -negate -fill white -draw "roundrectangle 0,0 300,300 50,50" \) \
  -alpha off -compose copy_opacity -composite bakeneko-eban-twitter-rr.png

引数は左上、右下、x半径,y半径。

というわけでこれにするか。

この猫自体は 化け猫アイコンメーカーで作った。


2014-05-03 (Sat)

Smart J:COM BOXで赤外線リモコンを使う

Smart J:COM BOXで赤外線リモコンを使うにはRFリモコンのペアリングを切ればいい。

チャンネルボタンの▽ボタンと音量の[-]ボタンを
同時に3秒以上押したままにする
2 ボタンが 4 回点滅したらボタンから指を離す

で、学習型リモコンは1000円程度(UMA-PLRM02)の安いのでok。
1個1個全部設定するのは面倒だけど1回だけなので。
というわけで快適になった。
まあ1年保てば御の字かな。

RFリモコンへ戻すにはペアリングさせる。
各種設定-各種設定-STB設定-設置設定-RFリモコン設定-RFリモコン-新規接続
を押してチャンネルボタンの△ボタンと音量の[+]ボタンを3秒以上押せばok。
これでRFリモコンも赤外線リモコンも使える状態になる。


2014-05-04 (Sun)

J:COM Smart Boxで気になること

追いかけ再生してても録画が終了すると問答無用でスタンバイになる。
でもDLNAで別な番組を再生しているとスタンバイにならない。
しかもそのDLNA再生を終了するとスタンバイになる。
続きから再生ができるようになったのでスタンバイになってもあまり問題にならないが。
そういえば続きから再生は最初からとどちらかが選べるようになってるが、
放置すると続きから再生される。

いま何処を再生中かが全然わからないのも気になる。
一時停止とかすればプログレスバーのようなものが出るが、だいたいの位置しかわからない。
いまのところ唯一正確な位置がわかるのはandroidアプリのリモコンだけだな。

追記(5/6): 問答無用でスタンバイになるときは位置を覚えてくれないようだ。残念。


2014-05-05 (Mon)

東京アメッシュの画像から通知するシステムを考えてみた

東京アメッシュの降雨量の画像から丸く切り抜くことができればその後の処理がやりやすい。
ameshd: 東京アメッシュをポーリングして通知というプログラムがあるがGaucheで書かれていてちょっといじりにくい。
できればもっと簡単にしたい。
やってることは半径20km圏内の雨の強さと降っている範囲みたいなものから通知するという感じだ。
そのためにgifをrgb形式に変換し凡例の8つのレベルを割り出している。
この部分はconvertで XPM形式に変換すると楽だ。たかだか10色程度しかないので1画素1文字で表現できる。

% convert http://tokyo-ame.jwa.or.jp/mesh/000/201405052220.gif \
  \( +clone -threshold -1 -negate -fill white -draw "circle 462,144 462,215" \) \
  -alpha off -compose copy_opacity -composite -trim tmp.xpm

中心は大宮駅にした。あとはawkでレベルに変換してしまえばよさげ。ここも1画素1レベルにできる。

BEGIN {
  colors["black"] = 0
  colors["#000001"] = 0
  colors["None"] = 0
  colors["#CCFFFF"] = 1
  colors["#6699FF"] = 2
  colors["#3333FF"] = 3
  colors["green"] = 4
  colors["yellow"] = 5
  colors["#FF9900"] = 6 
  colors["magenta"] = 7
  colors["red"] = 8
}
NR == 5, /pixels/ {
  sub(/",/, "", $3)
  levels[substr($0, 2, 1)] = colors[$3]
}
length > 70 {
  n = split(substr($0, 2, length - 3), a, "")
  for (i = 1; i <= n; i++) {
    level = levels[a[i]]
    sum += level
    if (max < level)
      max = level
  }
}
END {
  print "level:", max+0, "sum:", sum
}

境界あたりに微妙な差があるようでsumの値はちょっと違うがまあだいたいこんなもんだろう。
ameshdでmaxが0なのにsumが0じゃないときがあるのがよくわからない。

実際にいま雨が降ってきたのでその様子を。

% convert http://tokyo-ame.jwa.or.jp/mesh/000/201405060235.gif \
  \( +clone -threshold -1 -negate -fill white -draw "circle 462,144 462,215" \) \
  -alpha off -compose copy_opacity -composite -trim xpm:-             
/* XPM */
static char *xpm__[] = {
/* columns rows colors chars-per-pixel */
"143 143 4 1 ",
"  c black",
". c #000001",
"X c #CCFFFF",
"o c None",
/* pixels */
"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooooooooooooooo.................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooooooooooo.........................................ooooooooooooooooooooooooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooooooooooooooooooooo...............................................oooooooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooooo.....................................................ooooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooo.........................................................ooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooo.............................................................ooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooo.................................................................ooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooo.....................................................................ooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooo.........................................................................ooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooo.............................................................................ooooooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooooo...............................................................................oooooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooo...................................................................................oooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooo.....................................................................................ooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooo.......................................................................................oooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooo...........................................................................................oooooooooooooooooooooooooo",
"ooooooooooooooooooooooooo.............................................................................................ooooooooooooooooooooooooo",
"oooooooooooooooooooooooo...............................................................................................oooooooooooooooooooooooo",
"ooooooooooooooooooooooo.................................................................................................ooooooooooooooooooooooo",
"oooooooooooooooooooooo...................................................................................................oooooooooooooooooooooo",
"ooooooooooooooooooooo.....................................................................................................ooooooooooooooooooooo",
"oooooooooooooooooooo.......................................................................................................oooooooooooooooooooo",
"ooooooooooooooooooo.........................................................................................................ooooooooooooooooooo",
"oooooooooooooooooo...........................................................................................................oooooooooooooooooo",
"ooooooooooooooooo.............................................................................................................ooooooooooooooooo",
"oooooooooooooooo...............................................................................................................oooooooooooooooo",
"ooooooooooooooo.................................................................................................................ooooooooooooooo",
"ooooooooooooooo.................................................................................................................ooooooooooooooo",
"oooooooooooooo...................................................................................................................oooooooooooooo",
"ooooooooooooo.....................................................................................................................ooooooooooooo",
"oooooooooooo.......................................................................................................................oooooooooooo",
"oooooooooooo.......................................................................................................................oooooooooooo",
"ooooooooooo.........................................................................................................................ooooooooooo",
"oooooooooo...........................................................................................................................oooooooooo",
"oooooooooo...........................................................................................................................oooooooooo",
"ooooooooo.............................................................................................................................ooooooooo",
"ooooooooo.............................................................................................................................ooooooooo",
"oooooooo...............................................................................................................................oooooooo",
"oooooooo...............................................................................................................................oooooooo",
"ooooooo.................................................................................................................................ooooooo",
"ooooooo.................................................................................................................................ooooooo",
"oooooo...................................................................................................................................oooooo",
"oooooo...................................................................................................................................oooooo",
"ooooo.....................................................................................................................................ooooo",
"ooooo.....................................................................................................................................ooooo",
"oooo.......................................................................................................................................oooo",
"oooo.......................................................................................................................................oooo",
"oooo.......................................................................................................................................oooo",
"ooo.........................................................................................................................................ooo",
"ooo.........................................................................................................................................ooo",
"ooo.........................................................................................................................................ooo",
"oo...........................................................................................................................................oo",
"oo...........................................................................................................................................oo",
"oo...........................................................................................................................................oo",
"oo...........................................................................................................................................oo",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"..XXX...........XXX............................................................................................................................",
"oXXXXXX........X.X.............................................................................................................................",
"oXXXX..........................................................................................................................................",
"oXXXXXXX.......................................................................................................................................",
"oXXXXXXXXXX....................................................................................................................................",
"oXXXXXX.XX..X..................................................................................................................................",
"oXXXXXXXXX.....................................................................................................................................",
"XXXXXXX.X......................................................................................................................................",
"XXXX...........................................................................................................................................",
"XXX............................................................................................................................................",
"X..............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"...............................................................................................................................................",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"o.............................................................................................................................................o",
"oo...........................................................................................................................................oo",
"oo...........................................................................................................................................oo",
"oo...........................................................................................................................................oo",
"oo...........................................................................................................................................oo",
"ooo.........................................................................................................................................ooo",
"ooo.........................................................................................................................................ooo",
"ooo.........................................................................................................................................ooo",
"oooo.......................................................................................................................................oooo",
"oooo.......................................................................................................................................oooo",
"oooo.......................................................................................................................................oooo",
"ooooo.....................................................................................................................................ooooo",
"ooooo.....................................................................................................................................ooooo",
"oooooo...................................................................................................................................oooooo",
"oooooo...................................................................................................................................oooooo",
"ooooooo.................................................................................................................................ooooooo",
"ooooooo.................................................................................................................................ooooooo",
"oooooooo...............................................................................................................................oooooooo",
"oooooooo...............................................................................................................................oooooooo",
"ooooooooo.............................................................................................................................ooooooooo",
"ooooooooo.............................................................................................................................ooooooooo",
"oooooooooo...........................................................................................................................oooooooooo",
"oooooooooo...........................................................................................................................oooooooooo",
"ooooooooooo.........................................................................................................................ooooooooooo",
"oooooooooooo.......................................................................................................................oooooooooooo",
"oooooooooooo.......................................................................................................................oooooooooooo",
"ooooooooooooo.....................................................................................................................ooooooooooooo",
"oooooooooooooo...................................................................................................................oooooooooooooo",
"ooooooooooooooo.................................................................................................................ooooooooooooooo",
"ooooooooooooooo.................................................................................................................ooooooooooooooo",
"oooooooooooooooo...............................................................................................................oooooooooooooooo",
"ooooooooooooooooo.............................................................................................................ooooooooooooooooo",
"oooooooooooooooooo...........................................................................................................oooooooooooooooooo",
"ooooooooooooooooooo.........................................................................................................ooooooooooooooooooo",
"oooooooooooooooooooo.......................................................................................................oooooooooooooooooooo",
"ooooooooooooooooooooo.....................................................................................................ooooooooooooooooooooo",
"oooooooooooooooooooooo...................................................................................................oooooooooooooooooooooo",
"ooooooooooooooooooooooo.................................................................................................ooooooooooooooooooooooo",
"oooooooooooooooooooooooo...............................................................................................oooooooooooooooooooooooo",
"ooooooooooooooooooooooooo.................................X...........................................................ooooooooooooooooooooooooo",
"oooooooooooooooooooooooooo...........................................................................................oooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooo.......................................................................................oooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooo.....................................................................................ooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooo...................................................................................oooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooooo...............................................................................oooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooo.........................................XX..................................ooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooo...........................XXXX.......XX.................................ooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooo........................XXXXX...X..XX................................ooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooo.....................XXXXX........X..............................ooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooo..................XXXXX.......X..............................ooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooo..............XX.XXX.....................................ooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooooo............XX..X....................................ooooooooooooooooooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooooooooooooooooooooo.............X.............X...................oooooooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooooooooooo.........................................ooooooooooooooooooooooooooooooooooooooooooooooooooo",
"ooooooooooooooooooooooooooooooooooooooooooooooooooooooo.................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"
};


2014-05-06 (Tue)

住所から緯度経度を調べる

Google Geocoding APIで簡単にいけるようで。

% curl -s 'http://maps.google.com/maps/api/geocode/json?sensor=false&address=埼玉大宮駅' 
{
   "results" : [
      {
<中略>
         "formatted_address" : "Omiya Station, Nishikicho, Omiya Ward, Saitama, Japan",
         "geometry" : {
<中略>
            "location" : {
               "lat" : 35.906295,
               "lng" : 139.623999
            },
<中略>
         },
         "types" : [ "train_station", "transit_station", "establishment" ]
      }
   ],
   "status" : "OK"
}
% curl -s 'http://maps.google.com/maps/api/geocode/json?sensor=false&address=埼玉大宮駅' |\
  jq '.results[0].geometry.location'            
{
  "lng": 139.623999,
  "lat": 35.906295
}

大宮駅だけだと他にもある場合もあるので埼玉をつけている。
このあたりは適当でも流石Googleということでちゃんと検索してくれるようだ。
正確に自分の家の住所を入れればもちろんちゃんとした値になる。
これで昨日の東京アメッシュの入力値が得らえる。

大宮駅は京都にもあるんだね。

% curl -s 'http://maps.google.com/maps/api/geocode/json?sensor=false&address=大宮駅' |\
  jq '.results[]|[.formatted_address,.geometry.location]'
[
  "Omiya Station, Nishikicho, Omiya Ward, Saitama, Japan",
  {
    "lng": 139.623999,
    "lat": 35.906295
  }
]
[
  "Omiya Station, Shijoomiyacho, Shimogyo Ward, Kyoto, Kyoto Prefecture, Japan",
  {
    "lng": 135.748756,
    "lat": 35.003587
  }
]

jqを使うとこのあたりの抽出は楽だ。


2014-05-07 (Wed)

ご請求

今年もinetdからのご請求の季節がやってきた。相変わらずsubjectは"[inetd]ご請求"だ。
消費増税で9800円から10080円に。

% echo $[9800/1.05*1.08]
10080.

あたりまえだが合ってる。


2014-05-08 (Thu)

Cygwinのconvertで文字を書くときに警告が出る

こんな感じで。

convert: unable to read font `/usr/share/fonts/TTF/arial.ttf' @ error/annotate.c/RenderFreetype/1120.

たしかにそんなファイルどころか/usr/share/fonts/すら存在しない。
arial.ttfはwindows自身が持ってるので、もう適当に

% mkdir -p /usr/share/fonts
% ln -s c:/Windows/Fonts /usr/share/fonts/TTF

としてお茶を濁した。


2014-05-09 (Fri)

convert -list font

昨日の件はぐぐると

mkdir /usr/share/fonts/TTF
ln -s /cygdrive/c/Windows/Fonts/arial.ttf /usr/share/fonts/TTF/

という解もありそうだが、これだとarial.ttfだけ救うことになるのであまり得策ではない。
昨日のように設定すればWindowsのfonts全部がフルパスじゃなくて名前で使えるようになる。

% convert -list font

で指定できるフォントがリストされる。

  Font: MS-ゴシック-標準
    family: MS ゴシック
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: /usr/share/fonts/TTF/msgothic.ttc
  Font: MS-明朝-標準
    family: MS 明朝
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: /usr/share/fonts/TTF/msmincho.ttc
  Font: MS-Pゴシック-標準
    family: MS Pゴシック
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: /usr/share/fonts/TTF/msgothic.ttc
  Font: MS-P明朝-標準
    family: MS P明朝
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: /usr/share/fonts/TTF/msmincho.ttc

このFont:の行に書かれている名前を指定すればok。

% convert -size 100x100 -pointsize 48 -font MS-明朝-標準 label:あ a.png

minttyはUTF-8にして使ってるけど問題ないようだ。


2014-05-10 (Sat)

東京アメッシュの画像を合成する

東京アメッシュではz-indexで3枚の画像を合成している。
map000.jpgとmsk000.pngとYYmmddHHMM.gifだ。
何の意味があるのか知らないがjpegとpngとgifと全部別になっている。

合成するのはconvertで簡単にできる。

% convert \
  http://tokyo-ame.jwa.or.jp/map/map000.jpg \
  http://tokyo-ame.jwa.or.jp/map/msk000.png -composite \
  http://tokyo-ame.jwa.or.jp/mesh/000/201405102300.gif -composite \
  compo.png

こんな感じでok。実際の雨量画像は5分ごとに12時間分だけ保存されている。
また mesh_index.jsを見れば最新のタイムスタンプがわかる。

% curl -s http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js | sed 's/,/,\n/g'
Amesh.setIndexList(["201405110205",
"201405110200",
"201405110155",
"201405110150",
"201405110145",
"201405110140",
"201405110135",
"201405110130",
"201405110125",
"201405110120",
"201405110115",
"201405110110",
"201405110105",
"201405110100",
"201405110055",
"201405110050",
"201405110045",
"201405110040",
"201405110035",
"201405110030",
"201405110025",
"201405110020",
"201405110015",
"201405110010",
"201405110005"]);
% curl -s http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js | sed 's/^[^"]*"\|".*\|\r//g'      
201405110205

現在の時刻から計算してもいいが、実際は更新されるまで1分ぐらいかかるので、
このファイルを見るのが確実。


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