2017年 03月 16日

Lightroom カタログを専用ドライブに

240GB の SSD に Lightroom のカタログを移動した。今まで OS が入っているシステムドライブにそのまま置いていたが、カタログ、とくにプレビューが大きく容量を圧迫していたため、これを解消することを目的とする。

カタログと Time Machine

カタログに付随するものとして Previews.lrdata と Smart Previews.lrdata があり、カタログ自体よりもこれらの容量が支配的になる。しかしこれは Time Machine から除外しても良い。元のファイルがあればいくらでも再生成できるものだからだ。実際これらの lrdata を削除して Lightroom を起動しても何の警告もなく起動し、プレビューは必要に応じて再生成されスマートプレビューはなかったことにされる。

スマートプレビュー

もしドライブを常時接続している場合は恩恵がないので生成しないほうがよさそう。読み込みダイアログで生成するチェックボックスをはずすこと。

これは写真ストレージになっているドライブを頻繁にとりはずして(例えばノートPC単体にして)現像を行いたいときのためのものなので、それをやらないなら特にメリットはない。

.lrcat っていったい何なのか

Lightroom のカタログを SQLite で読んで統計を出したりする | tech - 氾濫原

Lightroom のカタログを SQLite で読んで統計を出したりする

.lrcat っていったい何なのか

カタログファイルの実体である lrcat は SQLite の DB ファイルそのもの。sqlite3 foo.lrcat すると中身を見ることもできる。

部分的に見た結果をメモしておく

# 画像に対応するテーブル?
Adobe_images
# Exif 情報に対応するテーブル?
AgHarvestedExifMetadata
# ファイルに対応するテーブル?
AgLibraryFile
AgLibraryFolder

# 画像とファイルのリレーション?
select Adobe_images.captureTime, baseName, modTime from Adobe_images inner join AgLibraryFile on Adobe_images.rootFile = AgLibraryFile.id_local;

# 画像と exif のリレーション?
select * from Adobe_images join AgHarvestedExifMetadata on AgHarvestedExifMetadata.image = Adobe_images.id_local;

たとえば

sqlite> .schema AgHarvestedExifMetadata
CREATE TABLE AgHarvestedExifMetadata (
    id_local INTEGER PRIMARY KEY,
    image INTEGER,
    aperture,
    cameraModelRef INTEGER,
    cameraSNRef INTEGER,
    dateDay,
    dateMonth,
    dateYear,
    flashFired INTEGER,
    focalLength,
    gpsLatitude,
    gpsLongitude,
    gpsSequence NOT NULL DEFAULT 0,
    hasGPS INTEGER,
    isoSpeedRating,
    lensRef INTEGER,
    shutterSpeed
);

なので (index は省略)、dateYear ごとの focalLength 統計を求めたい場合は

select dateYear, focalLength, count(*) from AgHarvestedExifMetadata group by dateYear, focalLength;

とか、もっとシンプルにレンズ焦点距離の使用頻度なら

sqlite> select focalLength, count(*) as cnt from AgHarvestedExifMetadata group by focalLength order by cnt;
...
24.2|1003
35.0|1037
|1093
200.0|1139
18.0|1153
22.0|1307
24.0|1378
70.0|1928
50.0|1978
30.0|4265
100.0|4522

みたいなことはできる。

レンズ名ごとの撮影枚数 (Lightroom 上でもわかるが) なら

 select AgInternedExifLens.value, count(*) as cnt from AgHarvestedExifMetadata join AgInternedExifLens on AgHarvestedExifMetadata.lensRef = AgInternedExifLens.id_local group by lensRef order by cnt;

とか。

今年の統計 (これも Lightroom 上でもわかるが) だけならこんな感じとか

select AgInternedExifLens.value, count(*) as cnt from AgHarvestedExifMetadata join AgInternedExifLens on AgHarvestedExifMetadata.lensRef = AgInternedExifLens.id_local where dateYear = CAST(strftime("%Y") AS NUMERIC) group by lensRef order by cnt;
24-70mm|10
20mm|17
EF50mm f/1.4 USM|75
EF-M22mm f/2 STM|77
EF70-200mm f/2.8L IS II USM|253
EF100mm f/2.8L Macro IS USM|353
35mm|428
E PZ 16-50mm F3.5-5.6 OSS|1260
30mm F1.4 DC DN | Contemporary 016|4083

もうちょっと Lightroom 上で見れない統計を出したいと思ったが思いつかなかったので思いついたら続きを書く

2017年 03月 15日

VPSのSSD化の効果2

VPSのSSD化の効果 | tech - 氾濫原 の続き。縦軸の最大値が半分になった。微妙にピークがでている期間もあるが概ね 500ms 以内に収まっているっぽい。

Zenfone2 の Android Mashmallow アップデート

OTA では落ちてこないが手動で更新ファイルを落とせばアップデートできるようになっていた。

システムを更新しています的なプログラスバーが全くすすまくてあせったけど30分ぐらい放っておいたら更新された。

公式サイトのダウンロードから OSを選択: Android → ファームウェア → バージョン JP-4.21.40.231 を選択。

ASUS ZenFone 2=ZE551ML(Z00AD/Z00ADA/Z00ADB/Z00ADC) software Image: V4.21.40.231 for JP SKU only* (andriod M)

ダウンロードして再起動すると更新する通知がでるのでそれをタップする。


まぁもう Zenfone3 をメインにしていて Zenfone2 は二酸化炭素濃度の表示にしか使ってないんだけど…

2017年 03月 03日

Machinekit 用の筐体

昨年の夏ぐらいからずっとやっていた CNC コントローラの Machinekit 化 がようやく一段落しつつあります。夏の時点で「動く状態」ではあったのですが、筐体に入れておらず雑に組んだまま運用していました。

まぁこれで使えてしまっていたので余計に筐体を作るモチベーションが落ちていたのですが、ようやく作りました。

筐体全体の設計


ベース

ベースは1mmのアルミ板を6枚組合せたもので、machinekit化以前から使っていたものを流用しています。アルミ板6枚はアルミ板で作ったアングルで相互に固定されています。1枚1枚はただの板のままなため、NC 切削する際の Z 軸の余裕を考慮する必要がなく都合が良いです。

方針

方針として Beagle Bone Black から出ているコネクタはできるだけ筐体の外に引き出すことにしました。HDMI や LAN や USB などです。また USB に関しては筐体内に4ポートハブを内蔵して、前面・背面に2つずつ引き出すこととしました。パネル用のコネクタはほぼ ebay 経由で入手できます。どうもこういうのは国内だと売ってません。

またスピンドル電圧と電流を表示するためにアナログメーターをつけることにしました。切削抵抗の目安になるのではにか?という意図と、あとは単に格好が良いのでつけたいという感じです。

ほかにも細かいことがいろいろありましたが忘れました。

モデリング

3D CAD の Fusion 360 で収めたい部品を全てモデリングし、CAD 上で部品配置を検討しました。「うっかり干渉して入らない……」ということを防ぎ、穴開け用の CAM としても使う意図です。

あとになって作ってみると、大丈夫だろうと思ってモデリングを省いた部分で案の定干渉して、1つのコネクタ (LAN) を入れることができませんでした。今のところ使っていないので致命的ではありませんが代替方法を考え中です。

穴あけ

穴あけは CNC フライスで行いました。配置検討した Fusion 360 からそのまま穴あけもモデリングして筐体の各面の CAM データを作成し、Gcode を出力して加工しました。

加工は φ1mm のエンドミルで切り込み 0.1mm、フィード 50mm/min でやりました。最近ようやく切り込みは限りなく小さくしてフィードレードをあげたほうが安全(折れにくい)ということがわかってきました。もっと太いエンドミルを使ったほうが早いですが、ちょっと細かいところもあって面倒だったので基本一括 1mm としました。

ただ、φ1mm のエンドミルだと Fusion 360 は φ1mm の穴のパスを作ってくれないので、該当部分だけ φ0.8mm で加工しました。

頑張って組む

設計ミスをリワーク

テスト中の様子

中はケーブルがかなりを占める

配線が結構多いので大変でした。100V を引き込むようにしたので、そのへんははんだ付け後にビニールテープで覆って、うっかり触れないようにしてあります。

電圧計・電流計 (どちらもスピンドル用) をどうしても付けたかったので余計配線が複雑化しました。

その他

筐体前面に出ている LED は BBB の USR LED そのままにしたかったので、光ファイバーで引き出しています。

非常ボタンはもともとツバがついていませんが、これも削り出してつくっています。

感想

かなり初歩的ではありますが 3D CAD を活用して筐体設計もそこそこ簡単にできることがわかりました。あとやはりモデリングは細部まで行うことが大事だという教訓を得られました。

自分用メモ:使いかた

  1. 主電源を入れる
  2. 自動的に BBB にも電源が入り、電源 LED が点灯する。起動プロセスに入るので USR LED 4つも明滅する
  3. 起動するまで少々待ってから、VNC で接続する (Finder で Cmd+K)
  4. (加工する)
  5. 電源ボタンを押すと BBB はシャットダウン開始される
  6. しばらく USR LED が明滅したのち、完全に消灯すれば主電源を切ることができる

追記 スピンドルコントロール



こういうのをPWM経由で制御している。

2017年 03月 02日

ネットワーク内の Raspberry Pi の IP アドレスを調べる

いちいちモニタ繋いで確認とかするのは面倒ですが同じネットワーク内なら簡単に調べることができます。

まず ifconfig で所属するネットワークのブロードキャストアドレスを調べます。

$ ifconfig
...
broadcast: 192.168.0.255

broadcast 向けで ping を数回打ちます。ARP テーブルを埋めるためなので結果は気にしません。ネットワーク内の接続機器が多いと大量にかえってくるのでほどほどにしましょう。

$ ping 192.168.0.255
...

arp -a で ARP テーブルを表示し、Raspberry Pi Foundation の OUI ( b8:27:eb) を持つものを列挙します。

$ arp -a | grep b8:27:eb

簡単です。

USB 3.1 Gen2 のハブは現時点ではないみたい

思いたって USB 3.1 Gen2 のハブを探してみたけど、存在していなかった。

ところで、USB 3.0 というのは既に消滅している。過去の USB 3.0 は USB3.1 により置き換えられ USB 3.1 Gen1 となっている。USB 3.0 と USB 3.1 Gen1 は同じなのだ。

ということで単に「USB 3.1 対応」と書いてあるものは、予想に反して合法的に USB 3.0 と同一の製品である可能性がある。Gen2 対応が明記されていなければだめ。

「USB 3.1」と表示されている製品には注意が必要。

  • Type-C コネクタを採用しているだけで USB 2.0
  • USB 3.1 Gen1 (=USB 3.0)
  • USB 3.1 Gen2 (10Gbps)

が混在している。

なぜ USB 3.1 Gen2 のハブ を探していたか

USB 3.1 Gen1 (USB 3.0) は伝送路における基本波が 2.5GHz なため、ISM バンドの 2.45GHz 帯 (2.4GHz〜2.5GHz)で電波障害が起きやすい。Gen2 なら問題ないはずなので、どうせ買うなら Gen2 に置き換えていきたいと思ったのでした。しかしまだ早かった。

USB 3.1 Gen1 = USB 3.0 ?

USB 3.1 Specification Language Usage Guidelines from USB-IF には以下のような記述がある。

USB 3.1 Gen 1 and USB 3.0 terms are synonymous

http://www.usb.org/developers/ssusb/USB_3_1_Language_Product_and_Packaging_Guidelines_FINAL.pdf
2017年 02月 23日

最近の Raspberry Pi はデフォルトで ssh が無効

Raspbian 2016-11-25 のリリースから ssh がデフォルトで無効になっていて port 22: Connection refused となる。

起動してからキーボードで有効化してもいいが、boot パーティション (FAT) のルートに "ssh" という名前のファイルを作っておけば、sshd が起動するようになっている。

たとえば (OS X ) 以下のように

touch /Volumes/boot/ssh
sudo umount /Volumes/boot 
2017年 02月 20日

KiCAD で already running, Continue?. と言われ続ける場合

複数起動しているわけでもないのにこれを言われる場合、ロックファイルが残っている。

rm -rf ~/Library/Caches/kicad/

で解決

2017年 02月 18日

Google Photos の画像の exif を API 経由で得て表示

写真の右下に exif 情報を出すようにしてみた。どう表示させるのがいいのか悩んだけど、とりあえず常時表示してみることに。ほんとは最初の時点では表示させたくないんだけど、hover で出るってのもなんかなあという感じだった。

Google Photos の画像の exif を得る

Google Photos の画像から exif 情報を得るのは簡単ではない。表示しているサムネイルのURLから exif 情報をとれるのが一番簡単なのだが、これはたぶんできない。URL にオリジナル画像や、後述するAPIリクエストに必要な情報が含まれているように見えない。

幸いこの日記では picasa へのリンク ( https://picasaweb.google.com/[userid/[albumid]#[photoid] みたいな形式 ) は保存してあったので、これを利用することにした。

exif を取得したい場合大きくわけると2つの方法がある

  • オリジナル画像をダウンロードして自力で exif を解析する
  • API 経由で取得する

が、オリジナル画像の URL を取得するためには API リクエストをしないといけないので、とにかく API リクエストを行う必要がある。オリジナル画像の URL を取得するレスポンスには exif のメタデータも含むため、これで足りるならわざわざオリジナル画像をダウンロードする必要はない

Invalid な albumid を回避する

Picasa API という既にメンテされていないAPIを使わなければならないのだが、userid albumid photoid 全てがわかっていないと画像のメタデータを取得することができない。

保存されている picasa へのリンクに全てあるのだが、albumid に invalid なものが含まれることがある。これは Google Picker API 経由で取得したものなので、 Picker API がなんか不思議な URL を返すようだ。意味がわからないんだけどなぜかそうなっている。

これじゃあ無理かと思いつつ試していたところ、albumid は valid で存在してさえいれば、photoid の親でなくとも良いということがわかった。画像が含まれるアルバムのIDというのを知る必要はないのだ。

ということで、userid は簡単に調べられるし、albumid には適当に存在する albumid を指定しておけばよいということなので、実質的には photoid だけでメタデータを取得できた。