はてなブログ記事を改善するためのメモ

はてなブログを将来改善するためのメモが投げ込まれてます

今回はちょっと古めの記事ばかりですが、どうせチューニングしてないので今なら古め記事でも大いに役立つはずなのです。

…とはいえ、jQuery じゃなく ES2018 で書きたいものですなあ。

ってことでコレ欲しいな。(pdf 版を買いました→ JavaScript コードレシピ集 | Gihyo Digital Publishing … 技術評論社の電子書籍

JavaScript コードレシピ集

JavaScript コードレシピ集

↑の著者blog:

「気になる展覧会」記事での表をなんとかしたい

ソートしたり限定したり。これが役立つはず。

(2019/2/26追記:ソートは入れずに必要部分のみ目立つようにした。 「気になる展覧会」記事の表部分に使ったJavaScriptのメモ - 別館 子子子子子子(ねこのここねこ)はてブロ部

はてなブログでも、はてブホッテントリのRSSフィードリーダを使いたい(未完

本館も引っ越ししました

はてダが使えなくなる日が近いので、この別館だけではなく本館も子子子子子子(ねこのここねこ)はてブロ部としてはてなブログへ引っ越ししました。 しかし、以前使っていたサイドバーが簡単に使えないのが気に入らない。特にRSSフィードリーダを使う設定が無いので、以前から使っていたホッテントリ表示が出来ない。ぶつぶつ。

先人の知恵

サイドバーにRSSを表示させるツールに関してはこちらで情報を得ました。

ってことで私もRSS・SNS表示用ブログパーツ|FeedWind(フィードウィンド)を使ってホッテントリのフィード http://b.hatena.ne.jp/hotentry.rss を流し込み本館のサイドバー*1に登録しました。

しかし…

いま FeedWind を日本語化して気付きましたが、無料で使えるプランは無くなったようです…>_<。
FeedWind Plansのご案内 | FeedWind
「29日後に作成したウィジェットは無効になります。有料版の利用をご検討くささい。」くささい じゃねーよ!

ってことで未完

無料で優秀なRSSフィードリーダは無いのかしら…ということで探し中。

検討中情報(2019/1/21追記)

jQuery で作ってしまう、ってやり方も。

おまけ:日英の表現ちがい

サイドバーに使うようなツールを日本語だとブログパーツと言うけど、英語だと Web widget と言うのだなあ、と Wikipedia で気付いたのであった。

さらにおまけ:日付

はてなダイアリーだと翌日5時までが前日の日付扱いで投稿出来たのだけど、いま見たら0時で日付の取扱が変わってますね。まあしゃあないのかな。

*1:と言いつつブログが全幅使ってるのでサイドじゃなくフッタの上なんだけどな

デジカメで撮影したMotion JPEGな動画ファイルをPhotos.appに登録してもiOS端末に同期されない

はてなblogでのお初記事です。よろしくお願いします。

状況説明

別記事にも載せていますが、デジカメは RICOH CX5 を使っています。このデジカメで動画を撮影すると Motion JPEG 形式(拡張子は .avi)になります。macOS の写真.app(以下 Photos.app )に Motion JPEG を登録すれば再生可能なのですが、残念ながら iOS では Motion JPEG を再生出来ないようで、Photos.app に Motion JPEG を登録しても iOS に同期されません。さらに残念なことに、Photos.app は iOS 向け変換をしてくれないのです(してくれればいいのに)。ということで、このような動画ファイルを iOS 端末へ同期するようにするには、動画をPhotos.app に登録する前に iOS で再生可能な形式に変換しておく必要があります。つまり H.264 形式(拡張子は .mp4)にしておけば良いわけです。

変換にはやはりFFmpegでやるのですが

ただし、ごく単純に FFmpeg

ffmpeg -i RMOV0001.AVI RMOV0001.mp4

とやっても、生成されたファイル RMOV0001.mp4 は iOS 端末や MacQuickTime)で再生出来ません。YUV420 という形式にしておかないと再生出来ないのです。Motion JPEG は YUV422 なので、FFmpeg は何もオプション指定していないとそのまま YUV422 の H.264 形式の動画ファイルを作ってしまうんですね*1

ということで動画変換には

適切なオプションを付けておく必要があります。今回は YUV420 にするために -pix_fmt yuv420p を付けておきます。そして iOS 端末で撮影した動画ファイルの拡張子は .mov なので今回の変換後ファイルの拡張子も揃えておきましょう。

ffmpeg -i RMOV0002.AVI -pix_fmt yuv420p RMOV0002.mov

この変換後の動画ファイル RMOV0002.mov を Photos.app に登録すれば、問題無く iOS 端末へ同期できます。

時刻情報はどうする

さて。上で FFmpeg で動画形式を変換しましたが、撮影時刻情報が全く消えています。このままでは FFmpeg で変換した時刻が撮影時刻であると Photos.app が判断してしまいます。困りますよね。

① 変換後の動画ファイルの作成時刻を変換前の動画ファイルと同じにしちゃえ

touch コマンドで変換後の動画ファイル RMOV0003.mov を変換前の動画ファイル RMOV0003.AVI の作成時刻と同じにしてやってもOKなようです。

touch -r RMOV0003.AVI RMOV0003.mov

もちろんこの作業を行った後に Photos.app へ登録します。登録後に行っても意味ありません。

② 変換後の動画ファイルに時刻のメタ情報を書き込んじゃえ

私が最近お気に入りの exiftool を使うと、撮影時刻情報を変換後の動画ファイルに書き込むことができます。どうやら QuickTime:CreateDate というメタ情報が撮影時刻情報になるようです。変換前の動画ファイル RMOV0003.AVI の作成時刻、もしくは RMOV0003.AVI の撮影時刻のメタ情報を使って、QuickTime:CreateDate に書き込んでやれば OK です。変換前の動画ファイルの作成時刻のメタ情報は、私の使っている RICOH CX5 の場合だと RIFF:DateTimeOriginal に入っていました。

$ exiftool -s -G -RIFF:DateTimeOriginal RMOV0003.AVI
[RIFF]          DateTimeOriginal                : 2019:01:01 07:13:24:

この RIFF:DateTimeOriginal には時差情報が入っていません。一方、 Photos.app は QuickTime:CreateDate を基本的にUTCとして取り扱うようです。ですので、日本で撮影した場合には時差を考慮してやる必要があります。いちいち手作業でこんなことをやっていては間違うでしょう。ということでシェルスクリプトなどをつかってやります。私は bash をほとんど分かっていないので、慣れている Ruby で大半の変換作業を行いました。

$ exiftool -P -overwrite_original -QuickTime:CreateDate="$(ruby -rtime -e 'print Time.strptime(`exiftool -DateTimeOriginal RMOV0003.AVI`[/\d{4}:\d\d:\d\d \d\d:\d\d:\d\d/], "%Y:%m:%d %T").utc.strftime("%Y:%m:%d %T")')" RMOV0003.mov
    1 image files updated

-QuickTime:CreateDate= 以降にある $()bash のコマンド展開です。ので、丸括弧の中に Ruby ワンライナーを入れておけばワンライナーの実行結果が反映されるってわけです。今回は文字列としての日付が欲しいのでさらに外側をダブルクオートで括っておきます。

Ruby での処理内容は以下の通りです。

  1. `exiftool -DateTimeOriginal RMOV0003.AVI` で作成時刻のメタ情報の文字列を取得。
  2. メタ情報の文字列から [/\d{4}:\d\d:\d\d \d\d:\d\d:\d\d/] で時刻情報のみを抜き出す。
  3. Time.strptime メソッドを使って時刻情報文字列を Time オブジェクトへ変換。
  4. Time#utc メソッドでUTCに変換。
  5. Time#strftime メソッドでフォーマットを指定して時刻表示文字列に変換(目的としていた UTC 表記時刻)。
  6. Kernel.#print メソッドで文字列を出力

この後に Photos.app へ登録します。(しつこいですが)登録後に行っても意味ありません。

*1:JPEG ファイルも YUV422 なので、FFmpeg で複数枚の JPEG ファイルから動画ファイルを造るときにも同様の現象が生じます。そんなことをメモ書きしたのが連番静止画からタイムラプス動画を作る - Qiitaです。

Photoshop Elementsで複数の写真にすかしをバッチ処理で入れるときの個人設定めも

バッチ処理のやりかたは公式さんのヘルプサイトを参照。
バッチ処理をしてみよう(Photoshop Elements 15/2018)

めも内容

画面解像度
  • 画面横幅: 1024 pixel
  • 縦横比を固定
クイック補正
  • 自動レベル補正
  • シャープ
ラベル
  • 透かし
  • カスタムテキスト: @riocampos
  • 位置:中央
  • フォント: Grand Hotel
  • テキストサイズ:72
  • 不透明度:20
  • カラー:10%グレー(RGBそれぞれ230)

写真ファイルのEXIF情報にコピーライト情報を追加する安価なやり方(Mac & CUIツール版)

コピーライト情報を追加する先は、正確には EXIF 情報ではなく TIFF 情報と IPTC 情報なんですけどね。まあどーでもいいです*1
また今回も前回と同じく ExifTool を使います。

コピーライト情報を追加する手順

まずExifToolをインストール

やはり Homebrew を使って

$ brew install exiftool

で。

コピーライト情報を写真ファイルへ上書きする

書き込みたいコピーライト情報が 2018 ©riocampos だとすると

$ exiftool -copyright="2018 &#169;riocampos" -overwrite_original /Users/riocampos/Pictures/target_photo_file.jpg

で OK(いわゆる「まるしー」が © とかに文字化けしてるかもしれませんけど、はてなダイアリーの都合*2なので気にしないでね)。-overwrite_original オプションは上書きするためのものです。上書きせずにコピーライト情報を入れた新規写真ファイルを作るのならば省いてください。
また、実行するとこのような警告が出ます

Warning: [minor] Entries in IFD0 were out of sequence. Fixed. - /Users/riocampos/Pictures/target_photo_file.jpg

が、単に「情報の書き込み先が無かったから追加したよ」という意味なので気にしないで。

書き込めたか確認

確認も ExifTool で。

$ exiftool /Users/riocampos/Pictures/target_photo_file.jpg
 :
Copyright                       : 2018 &#169;riocampos

はい、大丈夫ですね。
もしくはプレビューの「インスペクタを表示(⌘I)」で表示したインスペクタの IPTC またはTIFF タブで表示されます。

自分のモノだと主張することはホント大事

残念なことに「Webに上がってる写真はフリー素材」と思ってるひとは非常に多いようです。つまり、写真をフリー素材として扱われないために、写真をWebへ上げる場合には対策を講じる必要があります。私なんぞだと盗まれるのは写真ぐらいしかありませんが、イラストや動画をアップロードすることがある人はもっともっと注意してください。

*1:実際分かってない

*2:はてダの問題点:EUCで未だに作られてる

北緯35度付近での0.000001度(1μ°)は何メートルだろうか

緯度経度を Geocoding などの Web サービスで求めると、0.000001度(小数点以下6桁)精度で値を返してくれます*1。0.000001度というのは1マイクロ度(1μ°)。さて、この一番下位の桁が1ずれる(1μ°ずれる)と、距離にしてどれくらいずれるのでしょうか?という素朴な疑問が生じました。
@riocampos が普段生活しているのは北緯35度(島根県浜田市から千葉県館山市を結ぶ線上)付近。なのでこの辺りでの1マイクロ度当たりの距離を求めれば良いのです。

Webサービスに頼る

国土地理院測量計算(距離と方位角の計算)という Web サービスを提供してくれています、ありがたいですね。ここで1マイクロ度ずらした緯度経度を入力して、距離を算出させてみます。

結論:1マイクロ度で10cmぐらい

北緯35度東経135度を基準点として算出させました。

緯度経度の差 距離
緯度1μ° 0.111m
緯度10μ° 1.109m
緯度100μ° 11.094m
経度1μ° 0.091m
経度10μ° 0.913m
経度100μ° 9.129m

つまり緯度も経度も、1マイクロ度で10cm、10マイクロ度で1mのずれになる、ってことでした。
よって、Web サービスで求めた緯度経度で、一番下位の桁(小数点以下6桁)ぐらいずれても大したことないのですね。

ちなみに原理原則から緯度1マイクロ度を算出してみると

1m は地球の1周の長さを基準にして決められた、ということをご存じの方もおられるでしょう。より正しく言えば「子午線に沿った地球1/4周(赤道(北緯/南緯0度)から極点(北緯/南緯90度)まで)の長さを『1万km』となるように1mを決めた」わけです*2。ということは、1万kmが緯度の90度に相当するわけですね。
よって1度は1万km/90≒111km、すなわち111000m、さらに書き換えると0.111×106mぐらいになります。
1マイクロ度というのは1×10-6度です。よって距離としては(0.111×106×1×10-6)m、階乗部分が打ち消しあいますので0.111mになります。上で求めた値とほぼ合致しますね!
とはいえ上の計算は地球の子午線が全くの円形であるとして計算したことになります。実際の子午線は楕円なので、少しずれます。とはいえそこまで細かい精度は必要ありませんから、特に問題ないでしょう。

*1:なお Google Maps のURLでは小数点以下7桁になってますが、精度面で意味あるかといわれると無いですね。なにせ 1cm 精度になってしまうので。

*2:今の1mの定義は違いますよ

GPS機能の無いデジカメで撮った写真ファイルのEXIF情報に位置情報を追加する安価なやり方(Mac & CUIツール版)

普段の写真は iPhone 6s で満足なのですが、ときどき優秀な望遠ズームとマクロが欲しい @riocampos です。
今はずっと前に妻が買った

を使っています。色が微かな緑色なのと、コケ写真を撮影する為に 1cm マクロを目的に選んだこともあり、我が家では「もすもす」との愛称で呼んでいますw*1

デジカメにGPS機能なんてほとんど無い時代でしたね

高級機種には GPS 機能が載っていたのですが、さすがにコンパクトデジカメにまでは GPS が載っていない時代。 iPhone で撮影すると勝手に位置情報が加わるのに「もすもす」で撮影すると位置情報が分からない。それを写真.appで同じように扱うと、すこし辛い。位置検索できないし。

EXIF情報を後から追加するソフトもあるけどね

以前、iPhone でのトラックログMac で見るときには myTracks - The GPS solution for iOS and macOS というアプリを使っていました。この myTracks を使うと写真ファイルにも位置情報を追加出来たのです。ただし。「以前」というのは、このアプリがまだ無料だった時代のこと。今は有料アプリになりました。まあ有料でも良いのだけど、ただ機能的に $17.99 は高いのではと感じるのですよ。セコいのだけど。
Windows ユーザーであれば カシミール3D / 風景CGと地図とGPSのページ があるので何も考える必要はありませんな。しかも位置情報を埋め込むための デジカメプラグイン もありますので、この記事自体が要らないw

素晴らしき神ツールExifTool

ということで何らかの優秀な CUI ツールが存在しないかなーと探したところ、当然のように存在していました。
ExifTool by Phil Harvey
というか、世の中の EXIF が扱えるほとんどの GUI アプリは ExifTool を使っている、ような気もします*2
しかも超優秀なツールなので、経度緯度の直接設定でも、トラックログのデータから位置補完しての設定でも、いろいろと位置情報を設定することが可能。そして…無料。素晴らしい。神ツールと呼ぶに相応しい。

前振りが長くなりました

ということで ExifTool を使って位置情報を追加する方法を(自分用に)記録しておきます。

ExifToolをインストールする

上記サイトからインストールすれば良いです。ただし Homebrew を使っているのであれば

$ brew install exiftool

するのがラクでいいです。しかも ExifTool は更新が頻繁に行われるので、メンテナンス性の面からも Homebrew でのインストールをオススメします。

緯度経度での位置指定

まずは、写真に埋め込みたい位置の緯度経度を求めます。

などの Web サービスを使うのが便利です。
もしくはGoogle Mapsでも若干の手間をかければ求められます。

場所の座標を調べる
  1. パソコンで Google マップを開きます。Google マップをライトモードで使用中で、画面下部に稲妻のアイコンが表示されている場合は、場所の座標を表示できません。
  2. 地図上の目的の場所を右クリックします。
  3. [この場所について] を選択します。
  4. 画面下部のカードに座標が表示されます。

緯度と経度の確認、入力 - パソコン - マップ ヘルプ

例えば大阪城

大阪城 座標(WGS84) 緯度: 34.687315 経度: 135.526201

Lat Long
(34.687315, 135.526201)
GPS Coordinates
34° 41' 14.334'' N
135° 31' 34.3236'' E
Latitude and Longitude Finder on Map Get Coordinates

二つのサービスとも同じく「緯度: 34.687315 経度: 135.526201」になりました。
ではこれを写真一枚、もしくは複数の写真に設定します。念のために大元の写真ファイルではなく、コピーした写真ファイルを使いましょう。
今回は写真10ファイルが入ったディレクトリを指定しています。写真一枚なのであれば、ファイルパスを直接指定すれば良いです。

$ exiftool -P -overwrite_original -gpslatitude=34.687315 -gpslongitude=135.526201 /Users/riocampos/Pictures/100RICOH/
    1 directories scanned
   10 image files updated

さて。ExifTool のオプションについて順番に簡単に説明します。

-P-preserve
位置情報を埋め込んだ処理後の写真ファイルの変更日を元の写真ファイルと同じままにします。このオプションを指定しないと、処理後の写真ファイルの変更日が ExifTool のコマンド実行日時になります。
-overwrite_original
位置情報を埋め込んだ処理後の写真ファイルで、元の写真ファイルに対して上書きします。今回は上記したようにコピーした写真ファイルを使っているのでこのオプションを使っています。
なお、上書きしない場合には処理後の写真ファイルが元ファイルと同じフォルダに書き出されます。
処理後の写真ファイルを他のディレクトリに書き出す場合は -o-out)オプションを指定して、その引数に出力先ディレクトリを指定してください(ディレクトリなので末尾の/を忘れないように)。

-gpslatitude=XX.XXXX (または -exif:gpslatitude=XX.XXXX
-gpslongitude=YYY.YYYY (または -exif:gpslongitude=YYY.YYYY
緯度経度の指定。オプション名を読めば分かりますよね*3
おまけとして

-v
verbose オプションです。以下のような感じで進行状況を表示してくれます。たくさんのファイルを変更するときには作業してるのかどうなのか気になるので、このオプションを付けておくと良いでしょう。
======== /Users/riocampos/Pictures/100RICOH/RIMG0001.JPG
Rewriting /Users/riocampos/Pictures/100RICOH/RIMG0001.JPG...
  Editing tags in: APP0 APP1 GPS IFD0 JFIF MIE-GPS XMP 
JPEG APP1 (xxxxx bytes):
  Rewriting IFD0
  Rewriting ExifIFD
  Rewriting MakerNoteRicoh
  Rewriting ImageInfo
  Rewriting RicohSubdir
  Rewriting FaceInfo
  Rewriting FirmwareInfo
  Rewriting SerialInfo
  Rewriting InteropIFD
  Creating GPS
  Rewriting IFD1
JPEG APP2 (xxx bytes):
JPEG DQT (xxx bytes):
JPEG SOF0:
JPEG DHT (xxx bytes):
JPEG SOS

そして ExifTool はコマンドの末尾に処理目的のファイルパスを指定します。

追記:Error: [minor] Bad format (512) for MakerNotes entry 0 などという MakerNotes エラーが出て位置情報が追加出来ない場合には

[minor] と書いてありますし、焦らず騒がずマイナーエラーを無視する -m オプションで対応しましょう*4
詳細は 15. "I get MakerNote warnings or errors when reading or writing information"|ExifTool FAQ をお読みください。

本当はトラックログデータのことを書くつもりだったが疲れたので一旦ここまで

例示するとこんな感じ。この場合はkmlファイルですけど、gpxファイルでも大丈夫。

$ exiftool -P -overwrite_original -geotag /Users/riocampos/Downloads/history-2018-08-07.kml /Users/riocampos/Downloads/100RICOH

そのうちに ExifTool のオプションについての解説記事が書ければいいなあ。高機能でしかも無料なので、みんなで使いましょうね。

2021/5/25 追記

まだ GPS なしコンパクトデジカメで撮影したものに exiftool で GPS 情報を付加しております。その際には SD カードを Mac に接続してオリジナル画像で更新し、 iPhone にSD カードリーダを繋いで読み込ませています。その際に使うリーダは純正のこちら ↓

Apple Lightning - SDカードカメラリーダー

Apple Lightning - SDカードカメラリーダー

  • 発売日: 2015/12/10
  • メディア: Wireless Phone Accessory
で、今日はいつも通りにその作業をした後に、ちょっと Mac へ書き出ししたのですが、コンパクトデジカメで撮影した画像の日付などが iPhone への読み込みをした時刻になってしまっていました。これはうれしくない。でも exif データには撮影時刻も入っているわけで、その情報を使えばファイルの日時も簡単に修正出来ました。

$ exiftool "-FileModifyDate<DateTimeOriginal" *.JPG

やはりありがたいツールです> exiftool 。
(参考:exiftoolでファイルの変更日時を写真の撮影日にする方法 - Qiita

2021/5/25 追記2

兄から送られてきた写真が回転されずに保存されていたのだけど、きっと exif データの回転指定だけで何とかなるだろうと思って検索したところ、やはり exiftool で解決出来ました。

$ exiftool -P -overwrite_original -Orientation=6 -n RIMG0001.JPG # 6:時計回り90度
$ exiftool -P -overwrite_original -Orientation=8 -n RIMG0002.JPG # 8:反時計回り90度

参考サイト:

おまけ

クセのあるデジカメが好きなので、現時点だとこのあたりがいいなあ*5

*1:ああもう2011年の機種なんだなあ、かなり古いよなあ…

*2:本当かどうか分からんけど

*3:なお緯度経度は北緯と東経が正の値。日本国内であれば両方とも常に正の値。南半球であれば緯度が負の値、アメリカ大陸とか西半球であれば経度が負の値。上記 Web サービスを使えば出力値をそのまま使えば良いのでラクチンです。

*4:当方では、カメラから移動させただけのはずなのに、なぜか撮影時刻と違う変更時刻になっていたファイルが居て、そいつがこのエラーを吐きました。

*5:DSC-RX100M6やM7 は絶対買えないだろうがw