iOS端末から写真.appへ写真を移してからのコツ、写真.appからiOS端末へiTunesで同期したり出来ない場合の対処法

(元タイトル:iOS端末から写真.appへ写真を移してから同じiOS端末へiTunesで写真同期出来るようにするまでにバックグラウンドで作業してるサービスはどいつだ)←長いタイトルだ。
私自身が同期させてるのは iPhone だけですが、おそらく iOS 端末全てで同じでしょうし。

iPhone で撮影した写真を macOS の写真.appに吸い込ませてから、 iTunes で同期させたときにその写真を iPhone へ移すことができるようになるまで、しばらくかかります。顔認識とか、写真からいろんな情報を取得したりしてるのだろうと思いますが、正直なことを言えば「写真即同期・後日同期時に更新情報修正」としてほしいものです。さっさと同期したいんですよ、うん。
ですがなかなかそうは問屋が卸さない。
写真.appを終了してからじゃないと更新してくれないんですよね。
じゃあ何がバックグラウンド作業してるのか、といえばこの3つっぽい。

  • photoanalysisd
  • photolibraryd
  • com.apple.MediaLibraryService

(追記:その他に iOS が11以上になってから iOS 側での画像ファイルが jpeg じゃなく HEIF になったので com.apple.photos.ImageConversionService も働くようだ)
写真.appに写真を取り込むとまず photolibraryd が働き、続いて photoanalysisd が働く、って感じ。com.apple.MediaLibraryService は iTunes 関連のサービスなので iTunes が起動していると働く。
いずれにせよ、この3つの動作が終了してから iTunes で同期させると写真を iPhone へ戻せました。こいつらが終了するまで気長に待ちましょう。
私の手順としては

  1. まず iTunes を終了してから写真.app を起動して写真を取り込む
  2. photolibraryd と photoanalysisd が働く
  3. 二つが働き終える
  4. 写真.app を終了させる
  5. photolibraryd と photoanalysisd が働く場合があるので様子をみる
  6. iTunes を起動し、写真を同期したい iOS 端末の同期画面にして「写真」タブを選ぶ*1
  7. com.apple.MediaLibraryService が働く
  8. 働き終え、iTunes がいろいろ処理して終わると「写真」タブで同期枚数が出る
  9. 同期開始

のようにやってます。いずれにせよ気長に待ちましょう。


どうしても同期出来ない場合の解決法(へのヒント)

(2019/10/22追記)
写真.appからiPhoneへ同期させるためのデータは 写真 Library.photoslibrary フォルダの中の iPod Photo Cache フォルダに作成されるようです。上記のサービスやデーモンが終了しても同期出来ない場合にはこの iPod Photo Cache フォルダを削除*2してしまえば解決することが多そう。ただしデータを一から作り直すので時間が掛かりますが。
手順とその際の iTunes やフォルダの振る舞いは以下の通り。

  1. iPod Photo Cache フォルダを削除する
  2. iTunes を起動して iPhone の同期画面を出し、「写真」タブを出す
    →しばらくプログレスのぐるぐるのみが表示される
    iPod Photo Cache フォルダが作成されるかもしれないがそのうちまた消える
  3. プログレスのぐるぐるが終了して「写真」タブの内容が表示されるようになると「□ 写真を同期」のチェックが外れているのでチェックする
  4. 同期したいアルバムを指定
  5. 「適用」ボタンを押すとダイアログで「既存の写真を削除して、このコンピュータから写真を同期してもよろしいですか?」と出るので「削除して同期」ボタンを押す
    iPod Photo Cache フォルダが作成されるがやはりまた消える
    iTunes の進行状況に「写真ライブラリを読み込み中」と表示されると iPod Photo Cache フォルダが作成され、中に Photo Database ファイルが作成される
    iTunes の進行状況に「フォトライブラリを分析中…」と表示されると iPod Photo Cache フォルダ内に PhotoDatabaseReserve.tmp ファイルが一時的に作成され、そのうちまた消えると共に Photo Database ファイルが更新される
    iTunes の進行状況に「写真をコピー中」と表示され iPod Photo Cache 内に F00〜F50 フォルダが作成され、写真コピーの進行状況が進んでいく

参考: iPhone Macの写真が一部同期されなかった時に試してみること。 - かもメモ

どうしても同期出来ない場合の解決法(へのヒント)その2

それでも完全な同期が出来ない(例えば写真.appとの同期を完全にリセットしようとしても写真がiPhone側に残ってしまう)ような場合には、最終手段として iFunBox など iPhone の生データへアクセス出来るアプリケーションを使う必要が生じます。

データベース Raw File System/PhotoData/Photos.sqlite を削除してから iPhone を再起動(NG)

Macからの同期写真は全てアクセス出来なくなる。iPhone で撮影したカメラロールの写真は写真アプリを起動させるとデータベースが再構築されるのでしばらくすると見れるようになる。しかしその後に同期させると、以前読み込まれた写真と新しく読み込まれた写真とが重複され、また同期された写真が纏まって表示されなくなる。つまりデータベースがおかしくなった。のでNG。

Raw File System/PhotoData/ 以下のファイルを全て削除

先にカメラロールはバックアップしましょう。その後 iPhone を一旦再起動させましょう。Mac 側(というか写真.app)の iPod Photo Cache フォルダは削除しなくてもよい。
これが一番確実(且つ最終手段)。

*1:「写真」タブを選ばなくても com.apple.MediaLibraryService は働くのですが、タブを選んでおくと確実に働くので念の為に iTunes に促している、つもり。

*2:もちろん写真のオリジナルは別フォルダ(Masters フォルダ内)にあるので消えません

radikoのxml番組表とタグの意味

radikoの2週間番組表(1週間前から1週間後)は、例えば放送大学(放送局コード HOUSOU-DAIGAKU )ならば

http://radiko.jp/v3/program/station/weekly/HOUSOU-DAIGAKU.xml

となります。本日(4/15)だと4/8から4/21までの番組表が取得出来ます。

今日の番組表の一例

<prog id="8469966895" master_id="" ft="20170415160000" to="20170415164500" ftl="1600" tol="1645" dur="2700">
  <title>公共哲学第3回</title>
  <url>http://www.ouj.ac.jp/</url>
  <failed_record>0</failed_record>
  <ts_in_ng>2</ts_in_ng>
  <ts_out_ng>2</ts_out_ng>
  <desc>公共哲学としてのリベラリズム</desc>
  <info/>
  <pfm>山岡 龍一(放送大学教授)</pfm>
  <img>
    http://radiko.jp/res/program/DEFAULT_IMAGE/HOUSOU-DAIGAKU/20161020135931.png
  </img>
  <metas>
    <meta name="twitter" value="#radiko"/>
  </metas>
</prog>

<prog id="8469966896" master_id="" ft="20170415164500" to="20170415173000" ftl="1645" tol="1730" dur="2700">
  <title>英語事始め第3回</title>
  <url>http://www.ouj.ac.jp/</url>
  <failed_record>0</failed_record>
  <ts_in_ng>0</ts_in_ng>
  <ts_out_ng>0</ts_out_ng>
  <desc>Session3 空間と前置詞</desc>
  <info/>
  <pfm>
    大橋 理枝(放送大学准教授) 佐藤 良明(放送大学教授) ロビンス ロジャー グレン(東京大学准教授)
  </pfm>
  <img>
    http://radiko.jp/res/program/DEFAULT_IMAGE/HOUSOU-DAIGAKU/20161020125846.png
  </img>
  <metas>
    <meta name="twitter" value="#radiko"/>
  </metas>
</prog>

タグの意味

titleとか urlとか読めば分かるものは省きます。

prog
番組の時間などの情報。ft が開始時刻を、to が終了時刻を、それぞれ YYYYmmddHHMMSS 形式(年月日時分秒)で表記したもの。また ftl が開始時刻を、tol が終了時刻を、それぞれ HHMM 形式(時分)で表記したもの。dur は duration の略と思われ、放送時間を秒単位で表記している。なお id は番組毎にユニークな番号と思われるが、master_id は分からん。
failed_record
分からん(ぉぃ
ts_in_ng / ts_out_ng
おそらくタイムフリーの可否。0がタイムフリー対応、2が非対応。in / out に違いがあるのかどうなのか。
desc
descriptionの略か。放送大学だと各講義の副題。
info
informationの略か(放送大学では使われない)。desc の代わりとして放送内容などが含まれることがある。desc と info の両方が使われる場合は desc が本文で info が定型文のようだ。
pfm
performerの略か。放送大学だと各講義の講師名。
img
radikoサイトなどで表示される画像のURL。
meta
ツイートするときのハッシュタグ指定?

放送大学の各講義のタイムフリー対応/非対応に関してはこちらの pdf ファイルを参照してください。

参考:

意味がいまひとつわからないのが
<failed_record>
<ts_in_ng>
<ts_out_ng>
です。
通常の番組はすべて0です。一部録音に不備があるものは failed_record=1 になっています。
ジャニーズ系のタイムフリー配信なしの番組は<ts_in_ng><ts_out_ng>が1か2になっています。
 :
番組内でジャニーズの番組が流れるレコメン!は<ts_in_ng><ts_out_ng>が2になっています。
この番組は全編「ただいま配信を停止しています」というメッセージが流れます。
 :
考察(間違っているかもしれません)
<ts_in_ng>
0:全て配信
1:部分配信停止
2:全部配信停止
どなたか正解をご存じありませんか?
Radikoの番組表について : miscthoughtのblog

gogakuondemand.rbをv1704に更新

NHK大好きな[twitter:@riocampos]です。
gogakuondemand.rb を久しぶりに更新しました。バージョン名は今回から年度と月名にしました。
今回の更新はNHK語学講座の変更に伴う対応です。

また、以下の講座で月火水と木金が別扱いになりました。が、いままで通り5日とも録音出来るようにしています。ただし月火水と木金とでフォルダは別になっています。

いつものところ
NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb(v1704_1 '17/4/10更新版) - 別館 子子子子子子(ねこのここねこ)
をご覧ください。
ダウンロードもそこから行えます。
よろしくお願いします。

RMagickメモ

なんとなく書くことにしました。
画像は8x8 bit の画像ファイル z.png(32倍に拡大してます)↓ を使います。

読み込み

> require 'RMagick'
> img_z = Magick::ImageList.new('z.png')
> # または img_z = Magick::Image.read('z.png')

ImageとImageListの違い

ImageListはImageの集合体である。 複数のファイルを同時に読み込む場合があることや、GIFやTIFFなど1ファイルに複数の画像を含む画像フォーマットがあるため、このような仕組みになっている。

ImageとImageListクラスは密接に関連している。Imageオブジェクトは一枚の画像か、もしくは複数のフレームを持つ画像の一フレームをあらわす。(複数フレームを持つ画像の例としては、アニメーションGIFや、複数レイヤをもつPhotoshopイメージがある。)ImageオブジェクトはGIFやPNGJPEGなどの画像から生成できる。大きさを指定してスクラッチから画像を生成してもいい。画像はディスクに書き込んだり、スクリーンに表示したり、サイズや傾きを変更したり、フォーマットを変更したり、100を超えるメソッドを使ってその他いろいろ修正できる。
ImageListオブジェクトは画像のリストで、ゼロ個以上の画像とシーン番号を持つ。シーン番号は現在のイメージがどれかを示す。ImageListクラスはリストに含まれる全画像を操作するメソッドを持ち、例外もあるがImageクラスで定義される全てのメソッドも実行できる。Imageのメソッドは画像一つだけに有効なので、ImageのメソッドがImagelistに対して呼び出されたときは、シーン番号で示される現在の画像に渡される。
ImageListクラスはArrayクラスのサブクラスなので、ほとんどのArrayメソッドを利用してimagelistに含まれる画像を操作できる。例えば、<<メソッドを使ってリストに画像を追加できる。

画像情報取得


(なお、img = Magick::ImageList.new("img_1.jpg").firstが正しい)

画像を繋げる

とりあえずやりたかった一つとして、2つの画像を横に並べるというのがあります。実際にコードはこれ。

require 'rmagick' # require してライブラリを読み込み

img_append = Magick::ImageList.new("sample01.jpg","sample02.jpg")

img_append = img_append.append(false)
img_append.write("composite.jpg")

ハマった点としてはappendのところでのfalseとtrueの設定。

true 画像を上下に追加
false 画像を左右に追加

ちなみに ImageMagickconvert コマンドだと、上下に積み重ねるのが-append、右に繋げていくのが+append、のように -/+ で挙動を変えてたりします。

-append

Join current images vertically or horizontally.
This option creates a single longer image, by joining all the current images in sequence top-to-bottom. Use +append to stack images left-to-right.

メモリリーク対策(いまは要らないのかなあ…分からん)

RMagickはImageMagickのobj(mallocで確保した)を扱っていて、これはRubyのobjではありません。そのため、GCの対象にならず、メモリリークの危険性をはらむ事になります。

対策
  • RMagick 2.10.0(ImageMagick 6.5.3-10)で変更されたバージョンを使う
  • Magick::Image#destroy!を明示的に呼ぶ。
  • MiniMagick や MagickWand を使う

TL;DR for hurry people:

  • Call Magick::Image#destroy! (ensure block is a damn good idea)(destroy! メソッドを使う)
  • Use methods with exclamation mark as much as possible(出来るだけ破壊的メソッドを使う)

ファイルではなくオンメモリで画像処理

RMagickとImageMagickAPIを眺めていたら、from_blobとto_blobというAPIを使えばオンメモリで処理が可能だとわかった…変換元の画像がリモートに存在する場合や、出力先がファイルではなくデータベースである場合などで、中間ファイルを生成せずにRMagickによる画像処理を行う際に利用できる。

画素値の配列化

軽く検索した範囲だと Magick::Image#pixel_color でいちいち画素毎にデータを取得してループさせるひとが多いのだけど、それはいくら何でも手間だろう…しかも返されるのはMagick::Pixel クラスなので、RGB 値を取得するのにいちいちメソッドを使わないといけない。
調べてみると Magick::Image#export_pixels という複数画素取得&画素値の成分を配列にして出力してくれる、ずっとマシなメソッドがあることに気付きます。
ただし。このメソッドの出力は RGB しかも16 bit なので、そのまま出すとこうなります。

> img_z.export_pixels
=> [0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 34695, 42662, 
11822, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 
65535, 65535, 51143, 51143, 65535, 5654, 5654, 65535, 46260, 46260, 65535, 65535, 65535, 65535, 65535, 
65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 50372, 50372, 65535, 5911, 5911, 65535, 47031, 
47031, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 50115, 
50115, 65535, 5911, 5911, 65535, 47288, 47288, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 
65535, 65535, 65535, 65535, 65535, 49601, 49601, 65535, 5397, 5397, 65535, 48059, 48059, 65535, 65535, 
65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 48830, 48830, 65535, 5140, 
5140, 65535, 49087, 49087, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 
65535, 65535, 48059, 48059, 65535, 5654, 5654, 65535, 49858, 49858, 65535, 65535, 65535, 65535, 65535, 
65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23130, 4112, 46517, 0, 0, 65535, 0, 
0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 0, 65535, 0, 0, 65535, 11565, 11565, 65535]

…少なくともRGBの3つを区切って、さらに8 bit にしないと分からないですよね。

> img_z.export_pixels.map { |pix| pix/257 }.each_slice(3).to_a
=> [[0, 255, 0],
 [0, 255, 0],
 [0, 255, 0],
 [0, 255, 0],
 [0, 255, 0],
 [0, 255, 0],
 [0, 255, 0],
 [135, 166, 46],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 199, 199],
 [255, 22, 22],
 [255, 180, 180],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 196, 196],
 [255, 23, 23],
 [255, 183, 183],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 195, 195],
 [255, 23, 23],
 [255, 184, 184],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 193, 193],
 [255, 21, 21],
 [255, 187, 187],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 190, 190],
 [255, 20, 20],
 [255, 191, 191],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 187, 187],
 [255, 22, 22],
 [255, 194, 194],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [255, 255, 255],
 [90, 16, 181],
 [0, 0, 255],
 [0, 0, 255],
 [0, 0, 255],
 [0, 0, 255],
 [0, 0, 255],
 [0, 0, 255],
 [45, 45, 255]]

もう一段階、X軸の繰り返しを区切れば理解しやすいですよね。

> img_z.export_pixels.map { |pix| pix/257 }.each_slice(3).each_slice(img_z.columns).to_a
=> [
  [[0, 255, 0], [0, 255, 0], [0, 255, 0], [0, 255, 0], [0, 255, 0], [0, 255, 0], [0, 255, 0], [135, 166, 46]],
  [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 199, 199], [255, 22, 22], [255, 180, 180]],
  [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 196, 196], [255, 23, 23], [255, 183, 183], [255, 255, 255]],
  [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 195, 195], [255, 23, 23], [255, 184, 184], [255, 255, 255], [255, 255, 255]],
  [[255, 255, 255], [255, 255, 255], [255, 193, 193], [255, 21, 21], [255, 187, 187], [255, 255, 255], [255, 255, 255], [255, 255, 255]],
  [[255, 255, 255], [255, 190, 190], [255, 20, 20], [255, 191, 191], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]],
  [[255, 187, 187], [255, 22, 22], [255, 194, 194], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]],
  [[90, 16, 181], [0, 0, 255], [0, 0, 255], [0, 0, 255], [0, 0, 255], [0, 0, 255], [0, 0, 255], [45, 45, 255]]
]

画素情報を取得するメソッドとして最初に挙げた Magick::Image#pixel_color メソッドは出力が Magick::Pixel クラスなのですが、複数画素を取得出来る Magick::Image#get_pixels メソッドもあります。あとで扱うときに Magick::Pixel クラスが良いのであればこれでも良いでしょう。

Magick::Pixel クラスのメソッド

> ls Magick::Pixel
Magick::Pixel.methods: from_HSL  from_color  from_hsla
Magick::Pixel#methods: 
  <=>    black=  clone  dup   green   intensity  marshal_dump  opacity=  to_HSL    to_s   
  ===    blue    cyan   eql?  green=  magenta    marshal_load  red       to_color  yellow 
  black  blue=   cyan=  fcmp  hash    magenta=   opacity       red=      to_hsla   yellow=

redgreenbluecyanmagentayellowblack はそれぞれ RGB と CMYK の値が返るゲッターメソッドです。セッターメソッドはそれぞれの値をセットします。
intensity メソッドは輝度 Y を返します。YUV 色空間などの Y です。ちなみに RGB からの算出方法は

  • Y = 0.299 × R + 0.587 × G + 0.114 × B

です。
to_color メソッドは色名を返します。色名にならない場合は # を付けて画素値を返します。to_s メソッドと関連してますね。

> img_z.pixel_color(0, 0).to_color
=> "green"
> img_z.pixel_color(0, 0).to_s
=> "red=0, green=65535, blue=0, opacity=0"
> img_z.pixel_color(1, 7).to_color
=> "blue"
> img_z.pixel_color(1, 7).to_s
=> "red=0, green=0, blue=65535, opacity=0"
> img_z.pixel_color(6, 1).to_color
=> "#FFFF16161616"
> img_z.pixel_color(6, 1).to_s
=> "red=65535, green=5654, blue=5654, opacity=0"

グレースケールにする

RMagick 2.12.0: Common Tasks によると Magick::Image#quantize メソッドで2番目の引数(colorspace)に Magick::GRAYColorspace を渡せば良いようです。

> img_z_gray = img_z.quantize(256, Magick::GRAYColorspace)

なお1つ目の引数は量子化数(幾つ区切りにするか)なので、8bit = 256にしました。
出力するとこうなります(32倍に拡大)↓

ただし、 Magick::Image#export_pixels メソッドで画素値を配列化すると、デフォルトの RGB 出力でやはり 16bit のままなので

> img_z_gray.export_pixels
=> [46868,
 46868,
 46868,
 46868,
 46868,
 46868,
 …

となってしまいます。読めません。なのでやはり 8bit にした上で3つずつに区切りましょう。

> img_z_gray.export_pixels.map { |pix| pix/257 }.each_slice(3).each_slice(img_z_gray.columns).to_a
=> [
  [[182, 182, 182], [182, 182, 182], [182, 182, 182], [182, 182, 182], [182, 182, 182], [182, 182, 182], [182, 182, 182], [150, 150, 150]],
  [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [210, 210, 210], [71, 71, 71], [195, 195, 195]],
  [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [208, 208, 208], [71, 71, 71], [198, 198, 198], [255, 255, 255]],
  [[255, 255, 255], [255, 255, 255], [255, 255, 255], [207, 207, 207], [71, 71, 71], [199, 199, 199], [255, 255, 255], [255, 255, 255]],
  [[255, 255, 255], [255, 255, 255], [206, 206, 206], [70, 70, 70], [201, 201, 201], [255, 255, 255], [255, 255, 255], [255, 255, 255]],
  [[255, 255, 255], [203, 203, 203], [69, 69, 69], [204, 204, 204], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]],
  [[201, 201, 201], [71, 71, 71], [206, 206, 206], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]],
  [[43, 43, 43], [18, 18, 18], [18, 18, 18], [18, 18, 18], [18, 18, 18], [18, 18, 18], [18, 18, 18], [60, 60, 60]]
]

でも。RGB がいちいち同じ値で3つ並んでるのはどうかと思いますね。Magick::Image#export_pixels メソッドには map という出力向けパラメータがありますので、出力するのをRGBじゃなくグレースケール成分だけにしてみましょう。

> img_z_gray.export_pixels(0, 0, img_z_gray.columns, img_z_gray.rows, 'i').map { |pix| pix/257 }.each_slice(img_z_gray.columns).to_a
=> [
 [182, 182, 182, 182, 182, 182, 182, 150],
 [255, 255, 255, 255, 255, 210, 71, 195],
 [255, 255, 255, 255, 208, 71, 198, 255],
 [255, 255, 255, 207, 71, 199, 255, 255],
 [255, 255, 206, 70, 201, 255, 255, 255],
 [255, 203, 69, 204, 255, 255, 255, 255],
 [201, 71, 206, 255, 255, 255, 255, 255],
 [43, 18, 18, 18, 18, 18, 18, 60]
]

グレースケールの画像が不要なのであれば、上記の手順で元データのグレースケール成分を直接取得することが出来ます。

> img_z.export_pixels(0, 0, img_z.columns, img_z.rows, 'i').map { |pix| pix/257 }.each_slice(img_z.columns).to_a
=> [
 [182, 182, 182, 182, 182, 182, 182, 150],
 [255, 255, 255, 255, 255, 210, 71, 195],
 [255, 255, 255, 255, 208, 72, 198, 255],
 [255, 255, 255, 207, 72, 199, 255, 255],
 [255, 255, 206, 70, 201, 255, 255, 255],
 [255, 203, 69, 204, 255, 255, 255, 255],
 [201, 71, 206, 255, 255, 255, 255, 255],
 [43, 18, 18, 18, 18, 18, 18, 60]
]

なお map パラメータに指定できるのはこちらに記載がありました。引数には文字列で与えてください。

-map components

pixel map.
Here are the valid components of a map:

r
red pixel component
g
green pixel component
b
blue pixel component
a
alpha pixel component (0 is transparent)
o
opacity pixel component (0 is opaque)
i
grayscale intensity pixel component
c
cyan pixel component
m
magenta pixel component
y
yellow pixel component
k
black pixel component
p
pad component (always 0)

You can specify as many of these components as needed in any order (e.g. bgr). The components can repeat as well (e.g. rgbr).

おまけ:16bit を 8bit にするときになぜ257で割るのか

(分かりやすいように16進数表記にします)
8bit なので 00 から FF まで256段階です。等間隔で 16bit にするには、0000、0101、0202…FEFE、FFFF とすればいいことに気付くかと思います。つまり 16bit の0101=10進数の257の間隔で増加していきます。これが 8bit から 16bit への増やし方です。逆に257で割れば 16bit から 8bit にできます。

AWS初期設定

Heroku から引っ越すためのメモ書き。

IAMユーザでも支払い設定が見れるように

で「AWS ウェブサイトへのアクセスのアクティベートするには」以下を作業してから

で「ViewBilling」などを有効(Allow)にする。
前者設定をしておかないと IAM ユーザで請求情報が見れない。苦労した >_< 。

バージョン確認

Amazon Machine Image を選んで ssh 接続した。

$ cat /etc/issue
Amazon Linux AMI release 2016.03
Kernel \r on an \m

$ cat /proc/version 
Linux version 4.4.11-23.53.amzn1.x86_64 (mockbuild@gobi-build-60009) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Wed Jun 1 22:22:50 UTC 2016
$ uname -a
Linux ip-172-dd-dd-dd 4.4.11-23.53.amzn1.x86_64 #1 SMP Wed Jun 1 22:22:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release 
NAME="Amazon Linux AMI"
VERSION="2016.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2016.03"
PRETTY_NAME="Amazon Linux AMI 2016.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2016.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

インスタンスの止め方

ユーザーがインスタンスを停止すると、インスタンスはシャットダウンされます。停止されているインスタンスの毎時使用量またはデータ転送料金に対して課金しませんが、Amazon EBS ボリュームのストレージに対しては課金します。この切り替えを 1 時間以内に複数回行う場合でも、停止されているインスタンスを起動するたびに、全体のインスタンス時間に対して課金します。
 :
インスタンスが必要なくなったら、終了することができます。インスタンスの状態が shutting-down または terminated に変わったら、そのインスタンスへの課金は停止します。詳細については、「インスタンスの終了」を参照してください。

インスタンスが必要なくなったら、終了することができます。インスタンスの状態が shutting-down または terminated に変わったら、そのインスタンスへの課金は停止します。
インスタンスを削除した後に、接続または再起動することはできません。ただし、同じ AMI から別のインスタンスを起動することができます。インスタンスを停止および再起動する場合は、「インスタンスの停止と起動」を参照してください。詳細については、「再起動、停止、終了の違い」を参照してください。

特に止める必要も無いのかな。
しかも止めたら IP アドレスが変わってしまったので ssh で接続する先も変更されちゃったしorz

yum

最近は Debian 系ばかり使っていたので yum は久しぶり。

Amazon Linux AMI release 2016.03 にインストールされているパッケージはこれだけあるらしい。

$ sudo yum list installed
読み込んだプラグイン:priorities, update-motd, upgrade-helper
インストール済みパッケージ
acl.x86_64                                         2.2.49-6.11.amzn1                   installed    
acpid.x86_64                                       1.0.10-2.1.6.amzn1                  installed    
alsa-lib.x86_64                                    1.0.22-3.9.amzn1                    installed    
at.x86_64                                          3.1.10-44.13.amzn1                  installed    
attr.x86_64                                        2.4.46-12.10.amzn1                  installed    
audit.x86_64                                       2.4.1-5.27.amzn1                    installed    
audit-libs.x86_64                                  2.4.1-5.27.amzn1                    installed    
authconfig.x86_64                                  6.2.8-9.27.amzn1                    installed    
autogen-libopts.x86_64                             5.18-5.8.amzn1                      installed    
aws-amitools-ec2.noarch                            1.5.7-1.0.amzn1                     installed    
aws-apitools-as.noarch                             1.0.61.6-1.0.amzn1                  installed    
aws-apitools-common.noarch                         1.1.0-1.9.amzn1                     installed    
aws-apitools-ec2.noarch                            1.7.3.0-1.0.amzn1                   installed    
aws-apitools-elb.noarch                            1.0.35.0-1.0.amzn1                  installed    
aws-apitools-mon.noarch                            1.0.20.0-1.0.amzn1                  installed    
aws-cfn-bootstrap.noarch                           1.4-11.6.amzn1                      installed    
aws-cli.noarch                                     1.10.46-1.40.amzn1                  @amzn-updates
basesystem.noarch                                  10.0-4.9.amzn1                      installed    
bash.x86_64                                        4.2.46-19.35.amzn1                  installed    
bc.x86_64                                          1.06.95-1.10.amzn1                  installed    
bind-libs.x86_64                                   32:9.8.2-0.37.rc1.45.amzn1          installed    
bind-utils.x86_64                                  32:9.8.2-0.37.rc1.45.amzn1          installed    
binutils.x86_64                                    2.23.52.0.1-55.65.amzn1             installed    
bzip2.x86_64                                       1.0.6-8.12.amzn1                    installed    
bzip2-libs.x86_64                                  1.0.6-8.12.amzn1                    installed    
ca-certificates.noarch                             2015.2.6-65.0.1.15.amzn1            installed    
checkpolicy.x86_64                                 2.1.10-1.9.amzn1                    installed    
chkconfig.x86_64                                   1.3.49.3-2.14.amzn1                 installed    
cloud-disk-utils.noarch                            0.27-1.5.amzn1                      installed    
cloud-init.noarch                                  0.7.6-2.11.amzn1                    installed    
coreutils.x86_64                                   8.22-15.52.amzn1                    installed    
cpio.x86_64                                        2.10-12.12.amzn1                    installed    
cracklib.x86_64                                    2.8.16-4.14.amzn1                   installed    
cracklib-dicts.x86_64                              2.8.16-4.14.amzn1                   installed    
cronie.x86_64                                      1.4.4-12.6.amzn1                    installed    
cronie-anacron.x86_64                              1.4.4-12.6.amzn1                    installed    
crontabs.noarch                                    1.10-33.9.amzn1                     installed    
cryptsetup.x86_64                                  1.6.6-3.21.amzn1                    installed    
cryptsetup-libs.x86_64                             1.6.6-3.21.amzn1                    installed    
curl.x86_64                                        7.40.0-8.58.amzn1                   installed    
cyrus-sasl.x86_64                                  2.1.23-13.16.amzn1                  installed    
cyrus-sasl-lib.x86_64                              2.1.23-13.16.amzn1                  installed    
cyrus-sasl-plain.x86_64                            2.1.23-13.16.amzn1                  installed    
dash.x86_64                                        0.5.5.1-4.5.amzn1                   installed    
db4.x86_64                                         4.7.25-18.11.amzn1                  installed    
db4-utils.x86_64                                   4.7.25-18.11.amzn1                  installed    
dbus.x86_64                                        1:1.6.12-8.27.amzn1                 installed    
dbus-libs.x86_64                                   1:1.6.12-8.27.amzn1                 installed    
dejavu-fonts-common.noarch                         2.33-6.6.amzn1                      installed    
dejavu-sans-fonts.noarch                           2.33-6.6.amzn1                      installed    
dejavu-serif-fonts.noarch                          2.33-6.6.amzn1                      installed    
device-mapper.x86_64                               1.02.93-3.26.amzn1                  installed    
device-mapper-event.x86_64                         1.02.93-3.26.amzn1                  installed    
device-mapper-event-libs.x86_64                    1.02.93-3.26.amzn1                  installed    
device-mapper-libs.x86_64                          1.02.93-3.26.amzn1                  installed    
device-mapper-persistent-data.x86_64               0.3.2-1.7.amzn1                     installed    
dhclient.x86_64                                    12:4.1.1-43.P1.24.amzn1             installed    
dhcp-common.x86_64                                 12:4.1.1-43.P1.24.amzn1             installed    
diffutils.x86_64                                   3.3-4.15.amzn1                      installed    
dmraid.x86_64                                      1.0.0.rc16-11.8.amzn1               installed    
dmraid-events.x86_64                               1.0.0.rc16-11.8.amzn1               installed    
dracut.noarch                                      004-336.28.amzn1                    installed    
dracut-modules-growroot.noarch                     0.20-1.5.amzn1                      installed    
dump.x86_64                                        1:0.4-0.6.b42.7.amzn1               installed    
e2fsprogs.x86_64                                   1.42.12-4.40.amzn1                  installed    
e2fsprogs-libs.x86_64                              1.42.12-4.40.amzn1                  installed    
ec2-net-utils.noarch                               0.4-1.25.amzn1                      installed    
ec2-utils.noarch                                   0.4-1.25.amzn1                      installed    
ed.x86_64                                          1.1-3.3.8.amzn1                     installed    
elfutils-libelf.x86_64                             0.163-3.18.amzn1                    installed    
epel-release.noarch                                6-8.9.amzn1                         installed    
ethtool.x86_64                                     2:3.15-2.27.amzn1                   installed    
expat.x86_64                                       2.1.0-8.18.amzn1                    installed    
file.x86_64                                        5.22-4.31.amzn1                     installed    
file-libs.x86_64                                   5.22-4.31.amzn1                     installed    
filesystem.x86_64                                  2.4.30-3.8.amzn1                    installed    
findutils.x86_64                                   1:4.4.2-6.9.amzn1                   installed    
fipscheck.x86_64                                   1.3.1-3.13.amzn1                    installed    
fipscheck-lib.x86_64                               1.3.1-3.13.amzn1                    installed    
fontconfig.x86_64                                  2.8.0-5.8.amzn1                     installed    
fontpackages-filesystem.noarch                     1.41-1.1.2.amzn1                    installed    
freetype.x86_64                                    2.3.11-15.14.amzn1                  installed    
gawk.x86_64                                        3.1.7-10.10.amzn1                   installed    
gdbm.x86_64                                        1.8.0-36.6.amzn1                    installed    
gdisk.x86_64                                       0.8.10-1.5.amzn1                    installed    
generic-logos.noarch                               17.0.0-2.5.amzn1                    installed    
get_reference_source.noarch                        1.2-0.4.amzn1                       installed    
giflib.x86_64                                      4.1.6-3.1.6.amzn1                   installed    
glib2.x86_64                                       2.36.3-5.18.amzn1                   installed    
glibc.x86_64                                       2.17-106.167.amzn1                  installed    
glibc-common.x86_64                                2.17-106.167.amzn1                  installed    
gmp.x86_64                                         6.0.0-11.16.amzn1                   installed    
gnupg2.x86_64                                      2.0.28-1.30.amzn1                   installed    
gpgme.x86_64                                       1.4.3-5.15.amzn1                    installed    
gpm-libs.x86_64                                    1.20.6-12.8.amzn1                   installed    
grep.x86_64                                        2.20-1.16.amzn1                     installed    
groff.x86_64                                       1.22.2-8.11.amzn1                   installed    
groff-base.x86_64                                  1.22.2-8.11.amzn1                   installed    
grub.x86_64                                        1:0.97-94.30.amzn1                  installed    
grubby.x86_64                                      7.0.15-5.7.amzn1                    installed    
gzip.x86_64                                        1.5-8.18.amzn1                      installed    
hesiod.x86_64                                      3.1.0-19.6.amzn1                    installed    
hmaccalc.x86_64                                    0.9.12-1.9.amzn1                    installed    
hwdata.noarch                                      0.233-14.1.18.amzn1                 installed    
info.x86_64                                        5.1-4.10.amzn1                      installed    
initscripts.x86_64                                 9.03.49-1.34.amzn1                  installed    
iproute.x86_64                                     4.4.0-3.23.amzn1                    installed    
iptables.x86_64                                    1.4.18-1.22.amzn1                   installed    
iputils.x86_64                                     20121221-7.13.amzn1                 installed    
irqbalance.x86_64                                  2:1.0.8-1.23.amzn1                  installed    
java-1.7.0-openjdk.x86_64                          1:1.7.0.111-2.6.7.2.68.amzn1        @amzn-updates
javapackages-tools.noarch                          0.9.1-1.5.amzn1                     installed    
jpackage-utils.noarch                              1.7.5-27.17.amzn1                   installed    
kbd.x86_64                                         1.15-11.4.amzn1                     installed    
kbd-misc.noarch                                    1.15-11.4.amzn1                     installed    
kernel.x86_64                                      4.4.11-23.53.amzn1                  installed    
kernel.x86_64                                      4.4.15-25.57.amzn1                  @amzn-updates
kernel-tools.x86_64                                4.4.15-25.57.amzn1                  @amzn-updates
keyutils.x86_64                                    1.5.8-3.12.amzn1                    installed    
keyutils-libs.x86_64                               1.5.8-3.12.amzn1                    installed    
kmod.x86_64                                        14-10.10.amzn1                      installed    
kmod-libs.x86_64                                   14-10.10.amzn1                      installed    
kpartx.x86_64                                      0.4.9-72.8.amzn1                    installed    
krb5-libs.x86_64                                   1.13.2-12.40.amzn1                  installed    
lcms2.x86_64                                       2.5-4.4.amzn1                       installed    
less.x86_64                                        436-13.12.amzn1                     installed    
libICE.x86_64                                      1.0.6-1.4.amzn1                     installed    
libSM.x86_64                                       1.2.1-2.6.amzn1                     installed    
libX11.x86_64                                      1.6.0-2.2.12.amzn1                  installed    
libX11-common.x86_64                               1.6.0-2.2.12.amzn1                  installed    
libXau.x86_64                                      1.0.6-4.9.amzn1                     installed    
libXcomposite.x86_64                               0.4.3-4.6.amzn1                     installed    
libXext.x86_64                                     1.3.2-2.1.10.amzn1                  installed    
libXfont.x86_64                                    1.4.5-5.12.amzn1                    installed    
libXi.x86_64                                       1.7.2-2.2.9.amzn1                   installed    
libXrender.x86_64                                  0.9.8-2.1.9.amzn1                   installed    
libXtst.x86_64                                     1.2.2-2.1.9.amzn1                   installed    
libacl.x86_64                                      2.2.49-6.11.amzn1                   installed    
libaio.x86_64                                      0.3.109-12.8.amzn1                  installed    
libassuan.x86_64                                   2.0.3-3.3.amzn1                     installed    
libattr.x86_64                                     2.4.46-12.10.amzn1                  installed    
libblkid.x86_64                                    2.23.2-22.26.amzn1                  installed    
libcap.x86_64                                      2.16-5.5.8.amzn1                    installed    
libcap-ng.x86_64                                   0.7.3-5.13.amzn1                    installed    
libcgroup.x86_64                                   0.40.rc1-5.11.amzn1                 installed    
libcom_err.x86_64                                  1.42.12-4.40.amzn1                  installed    
libcurl.x86_64                                     7.40.0-8.58.amzn1                   installed    
libedit.x86_64                                     2.11-4.20080712cvs.1.6.amzn1        installed    
libevent.x86_64                                    2.0.18-1.11.amzn1                   installed    
libffi.x86_64                                      3.0.13-11.4.amzn1                   installed    
libfontenc.x86_64                                  1.0.5-2.6.amzn1                     installed    
libgcc48.x86_64                                    4.8.3-9.109.amzn1                   installed    
libgcrypt.x86_64                                   1.5.3-12.18.amzn1                   installed    
libgpg-error.x86_64                                1.11-1.12.amzn1                     installed    
libgssglue.x86_64                                  0.1-11.7.amzn1                      installed    
libicu.x86_64                                      50.1.2-11.12.amzn1                  installed    
libidn.x86_64                                      1.18-2.8.amzn1                      installed    
libjpeg-turbo.x86_64                               1.2.90-5.14.amzn1                   installed    
libmount.x86_64                                    2.23.2-22.26.amzn1                  installed    
libnfsidmap.x86_64                                 0.25-11.10.amzn1                    installed    
libnih.x86_64                                      1.0.1-7.8.amzn1                     installed    
libnl.x86_64                                       1.1.4-2.10.amzn1                    installed    
libpipeline.x86_64                                 1.2.3-3.3.amzn1                     installed    
libpng.x86_64                                      2:1.2.49-2.14.amzn1                 installed    
libpsl.x86_64                                      0.6.2-1.2.amzn1                     installed    
libpwquality.x86_64                                1.2.3-4.8.amzn1                     installed    
libselinux.x86_64                                  2.1.10-3.22.amzn1                   installed    
libselinux-utils.x86_64                            2.1.10-3.22.amzn1                   installed    
libsemanage.x86_64                                 2.1.6-3.13.amzn1                    installed    
libsepol.x86_64                                    2.1.7-3.12.amzn1                    installed    
libss.x86_64                                       1.42.12-4.40.amzn1                  installed    
libssh2.x86_64                                     1.4.2-2.13.amzn1                    installed    
libstdc++48.x86_64                                 4.8.3-9.109.amzn1                   installed    
libsysfs.x86_64                                    2.1.0-7.10.amzn1                    installed    
libtasn1.x86_64                                    2.3-6.6.amzn1                       installed    
libtirpc.x86_64                                    0.2.4-0.3.13.amzn1                  installed    
libudev.x86_64                                     173-4.13.amzn1                      installed    
libuser.x86_64                                     0.60-7.23.amzn1                     installed    
libutempter.x86_64                                 1.1.5-4.1.6.amzn1                   installed    
libuuid.x86_64                                     2.23.2-22.26.amzn1                  installed    
libverto.x86_64                                    0.2.5-4.9.amzn1                     installed    
libxcb.x86_64                                      1.8.1-1.18.amzn1                    installed    
libxml2.x86_64                                     2.9.1-6.3.49.amzn1                  @amzn-updates
libxml2-python27.x86_64                            2.9.1-6.3.49.amzn1                  @amzn-updates
libxslt.x86_64                                     1.1.28-5.12.amzn1                   installed    
libyaml.x86_64                                     0.1.6-6.7.amzn1                     installed    
logrotate.x86_64                                   3.7.8-17.13.amzn1                   installed    
lsof.x86_64                                        4.82-4.10.amzn1                     installed    
lua.x86_64                                         5.1.4-4.1.9.amzn1                   installed    
lvm2.x86_64                                        2.02.115-3.26.amzn1                 installed    
lvm2-libs.x86_64                                   2.02.115-3.26.amzn1                 installed    
mailcap.noarch                                     2.1.31-2.7.amzn1                    installed    
make.x86_64                                        1:3.82-21.10.amzn1                  installed    
man-db.x86_64                                      2.6.3-9.3.amzn1                     installed    
man-pages.noarch                                   4.04-2.15.amzn1                     installed    
mdadm.x86_64                                       3.2.6-7.32.amzn1                    installed    
mingetty.x86_64                                    1.08-5.9.amzn1                      installed    
nano.x86_64                                        2.5.3-1.19.amzn1                    installed    
nc.x86_64                                          1.84-24.8.amzn1                     installed    
ncurses.x86_64                                     5.7-3.20090208.13.amzn1             installed    
ncurses-base.x86_64                                5.7-3.20090208.13.amzn1             installed    
ncurses-libs.x86_64                                5.7-3.20090208.13.amzn1             installed    
net-tools.x86_64                                   1.60-110.10.amzn1                   installed    
newt.x86_64                                        0.52.11-3.11.amzn1                  installed    
newt-python27.x86_64                               0.52.11-3.11.amzn1                  installed    
nfs-utils.x86_64                                   1:1.3.0-0.21.amzn1                  installed    
nspr.x86_64                                        4.11.0-1.37.amzn1                   installed    
nss.x86_64                                         3.21.0-9.76.amzn1                   installed    
nss-softokn.x86_64                                 3.16.2.3-14.2.38.amzn1              installed    
nss-softokn-freebl.x86_64                          3.16.2.3-14.2.38.amzn1              installed    
nss-sysinit.x86_64                                 3.21.0-9.76.amzn1                   installed    
nss-tools.x86_64                                   3.21.0-9.76.amzn1                   installed    
nss-util.x86_64                                    3.21.0-2.2.50.amzn1                 installed    
ntp.x86_64                                         4.2.6p5-41.32.amzn1                 @amzn-updates
ntpdate.x86_64                                     4.2.6p5-41.32.amzn1                 @amzn-updates
ntsysv.x86_64                                      1.3.49.3-2.14.amzn1                 installed    
numactl.x86_64                                     2.0.7-8.11.amzn1                    installed    
openldap.x86_64                                    2.4.40-7.28.amzn1                   installed    
openssh.x86_64                                     6.6.1p1-25.61.amzn1                 installed    
openssh-clients.x86_64                             6.6.1p1-25.61.amzn1                 installed    
openssh-server.x86_64                              6.6.1p1-25.61.amzn1                 installed    
openssl.x86_64                                     1:1.0.1k-15.93.amzn1                @amzn-updates
p11-kit.x86_64                                     0.18.5-2.3.amzn1                    installed    
p11-kit-trust.x86_64                               0.18.5-2.3.amzn1                    installed    
pam.x86_64                                         1.1.8-12.33.amzn1                   installed    
pam_ccreds.x86_64                                  10-4.9.amzn1                        installed    
pam_krb5.x86_64                                    2.3.11-9.12.amzn1                   installed    
pam_passwdqc.x86_64                                1.0.5-6.8.amzn1                     installed    
parted.x86_64                                      2.1-21.18.amzn1                     installed    
passwd.x86_64                                      0.79-4.13.amzn1                     installed    
pciutils.x86_64                                    3.1.10-4.11.amzn1                   installed    
pciutils-libs.x86_64                               3.1.10-4.11.amzn1                   installed    
pcre.x86_64                                        8.21-7.7.amzn1                      installed    
perl.x86_64                                        4:5.16.3-283.37.amzn1               installed    
perl-Carp.noarch                                   1.26-244.5.amzn1                    installed    
perl-Digest.noarch                                 1.17-245.5.amzn1                    installed    
perl-Digest-HMAC.noarch                            1.03-5.7.amzn1                      installed    
perl-Digest-MD5.x86_64                             2.52-3.5.amzn1                      installed    
perl-Digest-SHA.x86_64                             1:5.85-3.5.amzn1                    installed    
perl-Encode.x86_64                                 2.51-7.5.amzn1                      installed    
perl-Exporter.noarch                               5.68-3.5.amzn1                      installed    
perl-File-Path.noarch                              2.09-2.5.amzn1                      installed    
perl-File-Temp.noarch                              0.23.01-3.5.amzn1                   installed    
perl-Filter.x86_64                                 1.49-3.5.amzn1                      installed    
perl-Getopt-Long.noarch                            2.40-2.5.amzn1                      installed    
perl-HTTP-Tiny.noarch                              0.033-3.6.amzn1                     installed    
perl-PathTools.x86_64                              3.40-5.5.amzn1                      installed    
perl-Pod-Escapes.noarch                            1:1.04-283.37.amzn1                 installed    
perl-Pod-Perldoc.noarch                            3.20-4.7.amzn1                      installed    
perl-Pod-Simple.noarch                             1:3.28-4.6.amzn1                    installed    
perl-Pod-Usage.noarch                              1.63-3.5.amzn1                      installed    
perl-Scalar-List-Utils.x86_64                      1.27-248.5.amzn1                    installed    
perl-Socket.x86_64                                 2.010-3.5.amzn1                     installed    
perl-Storable.x86_64                               2.45-3.5.amzn1                      installed    
perl-Text-ParseWords.noarch                        3.29-4.5.amzn1                      installed    
perl-Time-Local.noarch                             1.2300-2.5.amzn1                    installed    
perl-constant.noarch                               1.27-2.5.amzn1                      installed    
perl-libs.x86_64                                   4:5.16.3-283.37.amzn1               installed    
perl-macros.x86_64                                 4:5.16.3-283.37.amzn1               installed    
perl-parent.noarch                                 1:0.225-244.5.amzn1                 installed    
perl-podlators.noarch                              2.5.1-3.8.amzn1                     installed    
perl-threads.x86_64                                1.87-4.5.amzn1                      installed    
perl-threads-shared.x86_64                         1.43-6.5.amzn1                      installed    
pinentry.x86_64                                    0.7.6-6.11.amzn1                    installed    
pkgconfig.x86_64                                   1:0.27.1-2.7.amzn1                  installed    
policycoreutils.x86_64                             2.1.12-5.23.amzn1                   installed    
popt.x86_64                                        1.13-7.7.amzn1                      installed    
procmail.x86_64                                    3.22-25.1.6.amzn1                   installed    
procps.x86_64                                      3.2.8-30.14.amzn1                   installed    
psacct.x86_64                                      6.3.2-63.8.amzn1                    installed    
psmisc.x86_64                                      22.20-8.12.amzn1                    installed    
pth.x86_64                                         2.0.7-9.3.7.amzn1                   installed    
python27.x86_64                                    2.7.10-4.122.amzn1                  @amzn-updates
python27-PyYAML.x86_64                             3.10-3.10.amzn1                     installed    
python27-babel.noarch                              0.9.4-5.1.8.amzn1                   installed    
python27-backports.x86_64                          1.0-3.14.amzn1                      installed    
python27-backports-ssl_match_hostname.noarch       3.4.0.2-1.12.amzn1                  installed    
python27-boto.noarch                               2.39.0-1.0.amzn1                    installed    
python27-botocore.noarch                           1.4.36-1.56.amzn1                   @amzn-updates
python27-chardet.noarch                            2.0.1-7.7.amzn1                     installed    
python27-colorama.noarch                           0.2.5-1.7.amzn1                     installed    
python27-configobj.noarch                          4.7.2-7.15.amzn1                    installed    
python27-crypto.x86_64                             2.6.1-1.12.amzn1                    installed    
python27-daemon.noarch                             1.5.2-1.5.amzn1                     installed    
python27-dateutil.noarch                           2.1-1.3.amzn1                       installed    
python27-devel.x86_64                              2.7.10-4.122.amzn1                  @amzn-updates
python27-docutils.noarch                           0.11-1.15.amzn1                     installed    
python27-ecdsa.noarch                              0.11-3.3.amzn1                      installed    
python27-futures.noarch                            3.0.3-1.3.amzn1                     @amzn-updates
python27-imaging.x86_64                            1.1.6-19.9.amzn1                    installed    
python27-iniparse.noarch                           0.3.1-2.1.9.amzn1                   installed    
python27-jinja2.noarch                             2.7.2-2.15.amzn1                    installed    
python27-jmespath.noarch                           0.9.0-1.11.amzn1                    installed    
python27-jsonpatch.noarch                          1.2-2.5.amzn1                       installed    
python27-jsonpointer.noarch                        1.0-3.4.amzn1                       installed    
python27-kitchen.noarch                            1.1.1-5.6.amzn1                     installed    
python27-libs.x86_64                               2.7.10-4.122.amzn1                  @amzn-updates
python27-lockfile.noarch                           0.8-3.5.amzn1                       installed    
python27-markupsafe.x86_64                         0.11-4.6.amzn1                      installed    
python27-paramiko.noarch                           1.15.1-1.5.amzn1                    installed    
python27-pip.noarch                                6.1.1-1.21.amzn1                    installed    
python27-ply.noarch                                3.4-3.12.amzn1                      installed    
python27-pyasn1.noarch                             0.1.7-2.9.amzn1                     installed    
python27-pycurl.x86_64                             7.19.0-17.12.amzn1                  installed    
python27-pygpgme.x86_64                            0.3-9.12.amzn1                      installed    
python27-pyliblzma.x86_64                          0.5.3-11.6.amzn1                    installed    
python27-pystache.noarch                           0.5.3-2.8.amzn1                     installed    
python27-pyxattr.x86_64                            0.5.0-1.6.amzn1                     installed    
python27-requests.noarch                           1.2.3-5.10.amzn1                    installed    
python27-rsa.noarch                                3.4.1-1.8.amzn1                     installed    
python27-setuptools.noarch                         12.2-1.30.amzn1                     installed    
python27-simplejson.x86_64                         3.6.5-1.12.amzn1                    installed    
python27-six.noarch                                1.8.0-1.23.amzn1                    installed    
python27-urlgrabber.noarch                         3.9.1-9.13.amzn1                    installed    
python27-urllib3.noarch                            1.8.2-1.5.amzn1                     installed    
python27-virtualenv.noarch                         12.0.7-1.12.amzn1                   installed    
quota.x86_64                                       1:4.00-7.18.amzn1                   installed    
quota-nls.noarch                                   1:4.00-7.18.amzn1                   installed    
readline.x86_64                                    6.2-9.14.amzn1                      installed    
rmt.x86_64                                         1:0.4-0.6.b42.7.amzn1               installed    
rng-tools.x86_64                                   5-7.12.amzn1                        installed    
rootfiles.noarch                                   8.1-6.1.8.amzn1                     installed    
rpcbind.x86_64                                     0.2.0-11.8.amzn1                    installed    
rpm.x86_64                                         4.11.2-2.73.amzn1                   installed    
rpm-build-libs.x86_64                              4.11.2-2.73.amzn1                   installed    
rpm-libs.x86_64                                    4.11.2-2.73.amzn1                   installed    
rpm-python27.x86_64                                4.11.2-2.73.amzn1                   installed    
rsync.x86_64                                       3.0.6-12.13.amzn1                   installed    
rsyslog.x86_64                                     5.8.10-9.26.amzn1                   installed    
ruby.noarch                                        1:2.0-0.3.amzn1                     installed    
ruby20.x86_64                                      2.0.0.648-1.29.amzn1                installed    
ruby20-irb.noarch                                  2.0.0.648-1.29.amzn1                installed    
ruby20-libs.x86_64                                 2.0.0.648-1.29.amzn1                installed    
rubygem20-bigdecimal.x86_64                        1.2.0-1.29.amzn1                    installed    
rubygem20-json.x86_64                              1.8.3-1.51.amzn1                    installed    
rubygem20-psych.x86_64                             2.0.0-1.29.amzn1                    installed    
rubygem20-rdoc.noarch                              4.2.2-1.43.amzn1                    installed    
rubygems20.noarch                                  2.0.14.1-1.29.amzn1                 installed    
screen.x86_64                                      4.0.3-16.5.amzn1                    installed    
sed.x86_64                                         4.2.1-10.10.amzn1                   installed    
sendmail.x86_64                                    8.14.4-8.12.amzn1                   installed    
setserial.x86_64                                   2.17-25.7.amzn1                     installed    
setup.noarch                                       2.8.14-20.12.amzn1                  installed    
sgpio.x86_64                                       1.2.0.10-5.7.amzn1                  installed    
shadow-utils.x86_64                                2:4.1.4.2-13.10.amzn1               installed    
shared-mime-info.x86_64                            1.1-7.7.amzn1                       installed    
slang.x86_64                                       2.2.1-1.8.amzn1                     installed    
sqlite.x86_64                                      3.7.17-6.13.amzn1                   installed    
sudo.x86_64                                        1.8.6p3-20.22.amzn1                 installed    
sysctl-defaults.noarch                             1.0-1.1.amzn1                       installed    
sysfsutils.x86_64                                  2.1.0-7.10.amzn1                    installed    
system-release.noarch                              2016.03-0.5                         installed    
sysvinit.x86_64                                    2.87-6.dsf.15.amzn1                 installed    
tar.x86_64                                         2:1.26-31.22.amzn1                  installed    
tcp_wrappers.x86_64                                7.6-75.11.amzn1                     installed    
tcp_wrappers-libs.x86_64                           7.6-75.11.amzn1                     installed    
time.x86_64                                        1.7-38.9.amzn1                      installed    
tmpwatch.x86_64                                    2.9.16-4.10.amzn1                   installed    
traceroute.x86_64                                  3:2.0.14-2.7.amzn1                  installed    
ttmkfdir.x86_64                                    3.0.9-32.1.5.amzn1                  installed    
tzdata.noarch                                      2016f-1.63.amzn1                    @amzn-updates
tzdata-java.noarch                                 2016f-1.63.amzn1                    @amzn-updates
udev.x86_64                                        173-4.13.amzn1                      installed    
unzip.x86_64                                       6.0-2.9.amzn1                       installed    
update-motd.noarch                                 1.0.1-3.0.amzn1                     installed    
upstart.x86_64                                     0.6.5-13.3.13.amzn1                 installed    
ustr.x86_64                                        1.0.4-9.1.6.amzn1                   installed    
util-linux.x86_64                                  2.23.2-22.26.amzn1                  installed    
vim-common.x86_64                                  2:7.4.1967-1.42.amzn1               @amzn-updates
vim-enhanced.x86_64                                2:7.4.1967-1.42.amzn1               @amzn-updates
vim-filesystem.x86_64                              2:7.4.1967-1.42.amzn1               @amzn-updates
vim-minimal.x86_64                                 2:7.4.1967-1.42.amzn1               @amzn-updates
wget.x86_64                                        1.18-1.18.amzn1                     @amzn-updates
which.x86_64                                       2.19-6.10.amzn1                     installed    
words.noarch                                       3.0-17.8.amzn1                      installed    
xorg-x11-font-utils.x86_64                         1:7.2-11.5.amzn1                    installed    
xorg-x11-fonts-Type1.noarch                        7.2-9.1.5.amzn1                     installed    
xz.x86_64                                          5.1.2-12alpha.12.amzn1              installed    
xz-libs.x86_64                                     5.1.2-12alpha.12.amzn1              installed    
yum.noarch                                         3.4.3-137.65.amzn1                  installed    
yum-metadata-parser.x86_64                         1.1.4-8.12.amzn1                    installed    
yum-plugin-priorities.noarch                       1.1.31-29.26.amzn1                  installed    
yum-plugin-upgrade-helper.noarch                   1.1.31-29.26.amzn1                  installed    
yum-utils.noarch                                   1.1.31-29.26.amzn1                  installed    
zip.x86_64                                         3.0-1.10.amzn1                      installed    
zlib.x86_64                                        1.2.8-7.18.amzn1                    installed    

Threadの同時実行数を指定するには

Queue を使えば簡単です。また SizedQueue でもできます。

シンプルに

標準添付ライブラリのQueueを使えばこれらの処理がサクッと実装できちゃいます。

require 'thread'

locks = Queue.new
2.times { locks.push :lock }

Array.new(10) do |i|
  Thread.new do
    lock = locks.pop
    puts i
    sleep 2 
    locks.push lock 
  end
end.each(&:join)

このコードでは10スレッド生成して2スレッドずつ実行されます。

なぜ動く?

Queueはスレッド間通信のために用意されたクラスなので、push/pop操作はatomicです。(自分でMutexを用意する必要が無い。)
また、

空のキューを読み出そうとするとスレッドが停止します

っていう素敵な仕様により、waitの実装も必要無くなります。
Rubyで「スレッドの同時実行数を制限する」シンプルな方法 - Qiita

SizedQueueを使うと?

SizedQueueでも、10スレッド生成して2スレッドずつ実行するやりかたを書いてみました。

locks = SizedQueue.new(2)

Array.new(10) do |i|
  Thread.new do
    locks.push(:lock)
    puts i
    sleep 2 
    locks.pop
  end
end.each(&:join)

QueueとSizedQueueでは考えが逆になる

Queue の場合には予め Queue#push で同時実行数分を入れておき、実行したいスレッドが Queue#pop で取り出します。Queueが無くなるとスレッドが停止します

  • Queue#pop:キューからひとつ値を取り出します。キューが空の時、呼出元のスレッドは停止します
  • Queue#push:キューの値を追加します。待っているスレッドがいれば実行を再開させます

他方、SizedQueue の場合は上限を SizedQueue.new の引数に同時実行数を指定し、実行したいスレッドが SizedQueue#push で登録します。上限に達するとスレッドが停止します

  • SizedQueue#pop:キューからひとつ値を取り出します。 キューに push しようと待っているスレッドがあれば、実行を再開させます
  • SizedQueue#push:キューに与えられたオブジェクトを追加します。サイズが SizedQueue#max に達している場合は、 キューのサイズが SizedQueue#max より小さくなるまで他のスレッドに実行を譲ります。 その後、キューに与えられたオブジェクトを追加します。

ラジ録2で録った「らじる★らじる」flvファイルをまとめてmp3に変換する その2

ラジ録2で録った「らじる★らじる」flvファイルをまとめてmp3に変換する - 別館 子子子子子子(ねこのここねこ)
というのを3年ほど前に書きましたが、そのまま放置していました。
ふと、サーバに入っているflvファイルをまとめて変換してしまおう、と思い立ったので、書いてみました。

require 'pathname'
require 'fileutils'
require 'shellwords'

radiorec_filepath = ARGV[0]
radiorec_pathname = Pathname.new(radiorec_filepath)

if radiorec_pathname.directory?
  is_directory = true
  radiorec_dir = radiorec_pathname
  flvs = radiorec_pathname.children.select { |file| file.extname == ".flv" }
  flvs_uniq = flvs.map{ |flv| flv.basename.to_path[/([^-]+)(?:-\d{3})?\.flv/, 1] }.uniq
  count = flvs_uniq.size
else
  is_directory = false
  radiorec_dir = radiorec_pathname.dirname
  target_name = radiorec_pathname.basename.to_path[/(.+_\d{4}_\d\d_\d\d)(?:-\d{3})?\.flv/, 1]
  flvs_uniq = [target_name]
  count = 1
end
puts "対象ファイルは"
puts flvs_uniq
puts "以上の#{count}ファイルです。"

flvs_uniq.each.with_index(1) do |flv, i|
  puts "作業#{i}/#{count}#{flv}"
  if is_directory
    target_flvs = flvs.select { |f| f.basename.to_path[/#{flv}/] }
  else
    target_flvs = radiorec_dir.children.select { |file| file.to_path[/#{target_name}[^.]*\.flv/] }
    puts target_flvs
  end
  src = radiorec_dir + "src_mp3"
  src.mkdir
  trash = radiorec_dir + "trash_flv"
  trash.mkdir unless trash.exist?
  target_flvs.each do |f|
    f_mp3_path = src + (f.basename.to_path[/(.+)\.flv/, 1] + ".mp3")
    ffmpeg_conv_command = "ffmpeg -i #{f} -ab 128k #{f_mp3_path} 2>/dev/null"
#    puts ffmpeg_conv_command
    `#{ffmpeg_conv_command}`
  end
  if src.children.size == 0
    puts "#{flv}」はファイルサイズが0のため、mp3が生成されませんでした。"
    puts
    src.rmtree
    next
  end
  ffmpeg_input = "concat:" + src.children.sort.join("|")
  ffmpeg_output = radiorec_dir + (flv + (target_flvs.size > 1 ? "#{target_flvs.size - 1}Gap】" : "") + ".mp3")
  if ffmpeg_output.exist?
    puts "既に「#{ffmpeg_output}」ファイルが存在します。別名で保存します。"
    ffmpeg_output_name = ffmpeg_output.to_path
    ffmpeg_output_name[-4, 0] = "exist"
    ffmpeg_output = Pathname.new(ffmpeg_output_name)
  end
  ffmpeg_command = %[cpulimit -l 300 -- ffmpeg -i "#{ffmpeg_input}" #{Shellwords.escape(ffmpeg_output.to_s)} 2>&1]
#  puts ffmpeg_command
#  `#{ffmpeg_command}`
  IO.popen(ffmpeg_command) do |pipe|
    pipe.each("r").inject("") do |buffer, each_line|
      buffer << each_line
      buffer = buffer.split("\n").last
      if buffer[/\r/]
        print "\r" + buffer.split("\r").first.sub(/q=\d+\.\d /, "").sub(/dup=\d+ drop=\d+ /, "").rstrip
      end
      buffer.split("\r").last
    end
  end
  
  latest_file_pathname = target_flvs.last
  ffmpeg_output.utime(latest_file_pathname.atime, latest_file_pathname.mtime)
  
  puts
  FileUtils.move(target_flvs.map(&:to_path), trash.to_path)
  src.rmtree
end

これを radiorec2flv2mp3.rb という名称で保存しました。
使い方はflvファイルが入っているディレクトリ名を指定する

$ ruby radiorec2flv2mp3.rb [path]

もしくは対象にしたいflvファイルを指定する

$ ruby radiorec2flv2mp3.rb [path.flv]

と変換してくれます。元の flv ファイルは trash_flv ディレクトリに移されていますので、まとめて削除してください。

おまけ

なお 上記リンクのコメント欄 に「flv ファイルが大量発生するのはラジ録の rtmpdump のせいではないか」というコメントをくださった方がいらっしゃり、私もそれに従って以下のように作業しました(コメント欄をそのまま引用)。

「rtmpdumpを入れ替え」とのことでしたので、ラジ録2の

/Applications/RadioRec2.app/Contents/MacOS/cores_macosx

フォルダにある rtmpdump 実行ファイル(バージョン2.4)をリネームしておき、 Homebrew でインストールした rtmpdump

https://github.com/Homebrew/homebrew/blob/master/Library/Formula/rtmpdump.rb (バージョンは2.4+20150115)

をコピーして上記フォルダへペーストしました。
rtmpdump 実行ファイルのサイズが全く違う(ラジ録2付属は1.3MBなのに Homebrew 版は33KB!)のですが、問題なく動作しているようです。ギャップが生じるかどうか、今後確認していきます。

その後も何度か flv ファイルが発生してしまっていますが、頻度は格段に減りましたので、この対策は有効だと思います。