gphoto2を使ってカメラから画像を自動で取り込む

## これはなに？
私は写真を取るのが好きです。でも、PCを立ち上げ、ログインして、コマンドを叩くなど行い、
写真をPCに取り込むのがめんどくさいです。紆余曲折、やっと簡単に取り込めるようになったので、ご紹介します。

## 想定する利用方法

1. 写真をとる
1. カメラを操作し、お家LAN（無線LAN　インフラストラクチャーモード）につなぐ。IPアドレスはカメラ固定であること。
1. PC上の常駐PGが、IPアドレスにつながったことを検知し、自動でgphoto2の機能を使って写真をPCに移動する。
1. カメラの電源を切る。（もしくは勝手に電源が切れる）

つまり、PCに触ることなく、カメラの操作だけで、カメラ内の画像がPCに移動されます。
面倒なSDカードの抜き差しや、カメラメーカのツールを起動なしで、PCに取り込みができます。

これさえできれば、あとはイントラネット内でWEBで鑑賞など色々応用ができますね！



## 準備するもの
- gphoto2 に関するライブラリ類
- ffi-gphoto2
- ruby
　
バージョン等は下の通り。
<pre>
webalbum@intra:~/work/autoTransFromCamera$ uname -a
Linux intra 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux
webalbum@intra:~/work/autoTransFromCamera$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [armv7l-linux-eabihf]
webalbum@intra:~/work/autoTransFromCamera$ gem list |grep ffi
ffi (1.15.4)
ffi-gphoto2 (0.9.0)
webalbum@intra:~/work/autoTransFromCamera$ gphoto2  -v
gphoto2 2.5.11
　
Copyright (c) 2000-2016 Lutz Mueller and others
…＜中略＞…　
photo2         2.5.11         gcc, popt(m), exif, cdk, aa, jpeg, readline
libgphoto2      2.5.12         all camlibs, gcc, ltdl, EXIF
libgphoto2_port 0.12.0         gcc, ltdl, USB, serial without locking
webalbum@intra:~/work/autoTransFromCamera$
</pre>

あとはこれ

https://github.com/HasegawaTadamitsu/autoTransFromCamera

ここに記載している通り、カメラ内の画像を移動させます。つまりカメラ内の画像を削除する
ことを意味しており、何らかの不具合で大切な写真が削除されることも否定できません。
そのため、***自己責任*** でお願いします。


なお、動作確認が取れたカメラは、EOSR,EOS 7DMarkII,PowerShotSX730HSですが、gphoto2が対応している
カメラなら同じかと思います。



## 備忘
### gphoto2でハマった点　wifiでの接続の仕方
wifiでの接続方法がわかりませんでした。コマンドラインと同じくportにptpipと設定したのですが、
駄目で何かしらカメラのモデルを設定しないと動きませんでした。（なぜ）
<pre>
　camera_model='Canon EOS 7D MarkII'
　＜中略＞
  camera = GPhoto2::Camera.new(camera_model,"ptpip:#{camera_ip_addres}")
</pre>
理由はわかりませんが、カメラモデルに、EOSRを設定したところ、エラーになりました。
しかし、7DMarkIIを指定したら何故か動きました。（なぜ？）
対応カメラは、libgphoto2のバージョンによりますが、下の通りです。

 http://www.gphoto.org/doc/remote/


### gphoto2でハマった点　カメラが見えない。
当初コマンドラインから操作しようと思いました。ですが、一回コマンドを発行すると
カメラ側のIPアドレスにpingを打っても応答がなくなり、約１０秒後に復活するようでした。
そのため、コマンドラインでは無理と思い、rubyのPGをより操作することを検討しました。


### トランザクション
いつも悩むのがトランザクション？の単位です。
全量のファイルをカメラからPCのへコピーし、その後、カメラ内のファイルを消す方法が考えられますが、
慎重に行いたいため、１ファイルのコピーし、コピー先のファイルサイズが同じことを確認し、
カメラ内のファイルを削除しています。


### ハマった点 Out of memory
カメラ内の大量の写真があったとき。。。
<pre>
[13868762.678745] Normal: 113*4kB (MEC) 286*8kB (UMEC) 504*16kB (UMEC) 112*32kB (UMEC) 29*64kB (UMEC) 1*128kB (M) 0*
256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 16372kB                                                                  
[13868762.678780] 4072 total pagecache pages                                                                        
[13868762.678784] 248 pages in swap cache                                                                           
[13868762.678789] Swap cache stats: add 17143743, delete 17143495, find 584280078/589530693                         
[13868762.678790] Free swap  = 0kB                                                                                  
[13868762.678793] Total swap = 1048572kB                                                                            
[13868762.678795] 241664 pages RAM                                                                                  
[13868762.678797] 0 pages HighMem/MovableOnly                                                                       
[13868762.678799] 5286 pages reserved                                                                               
[13868762.678801] 2048 pages cma reserved                                                                           
[13868762.678803] [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name    
<中略>
[13868762.679616] Out of memory: Kill process 19132 (ruby) score 456 or sacrifice child
[13868762.679632] Killed process 19132 (ruby) total-vm:967264kB, anon-rss:691336kB, file-rss:0kB, shmem-rss:0kB
</pre>
とのことです。

色々考えたのですが、最大１００ファイルとして、そこで強制的にruby のPGを終了させ、次の処理で持ち越すようにしました。