vzの尺なblog

〜まだ 1 epoch 目〜

ssh-keygen(sshキー)

OpenSSHのの備忘録です。 ※ちなみにWin10からは標準でOpenSSHが使えるようになってます。

キーペアの作成

以下の例ではssh-keygenコマンドに

  • -t rsaRSA暗号化方式
  • -b 4096 で鍵長4096ビット
  • -C "Your Commen" でコメント指定
  • -N "your_passphrase" でパスフレーズ指定
  • -f ~/.ssh/your-sshkey でファイル名を指定

オプション指定をしています。
よくみるのは、RSA 2048bit 、コメント=自分のメアドでしょうか・・・
オプションを指定しなければインタラクティブに聞いてくるが、暗号は「 rsa 2048bit」、コメントは「user@host」になります。

<BR>
# キーペア作成
$ ssh-keygen -t rsa -b 4096 -C "Your Comment" -N "your_passphrase" -f ~/.ssh/your-sshkey

# 生成されたファイルを確認
# 拡張子なしが秘密鍵。拡張子.pubが公開鍵。
$ ls -l ~/.ssh
-rw------- 1 user user 3326 Sep 24 08:21 your-sshkey
-rw-r--r-- 1 user user  738 Sep 24 08:21 your-sshkey.pub

※ちなみに、プライベートキーの中身を見てみるとTXT形式(BASE64符号化)されているので、一般的にいう.pem形式というやつですね。

フィンガープリントの表示(-lオプション)


SHA256 / BASE64形式 ※デフォルト
$ ssh-keygen -l -f ~/.ssh/your-sshkey
4096 SHA256:0Lel8E/1NRdwkf4gxi7Nc1thjOprL+hbL71yRDYkA+I Your Comment (RSA)


MD5 / HEX 形式(-Eオプションで形式md5を指定) ※昔はこれがデフォルトだった。
$ ssh-keygen -l -E md5 -f ~/.ssh/your-sshkey
4096 MD5:68:6a:3d:36:75:83:3d:5c:26:b8:f0:5c:de:5f:8a:bd Your Comment (RSA)


Visual表示は、-vオプションを指定
$ ssh-keygen -l -v -f ~/.ssh/your-sshkey
4096 SHA256:0Lel8E/1NRdwkf4gxi7Nc1thjOprL+hbL71yRDYkA+I Your Comment (RSA)
+---[RSA 4096]----+
|       . ..  ..+o|
|      ...  o ....|
|      .Eo ..= =.o|
|       . + ++*.*+|
|        S +==.o.+|
|          .+=.. o|
|          oo+o o |
|         ..*.o.  |
|        .oo.B+.  |
+----[SHA256]-----+


パスフレーズの確認

ssh-keygenコマンドに、

-yオプションだけでも、インタラクティブに聞いてくるのでOK.

$ ssh-keygen -y  -f ~/.ssh/your-sshkey
Enter passphrase:<パスフレーズ入力>
ssh-rsa AAAAB3...... 
# 成功すると上記のように公開鍵が表示される。
# また終了ステータス(環境変数 $? でも確認できる)
$ echo $?
True

# 失敗するとエラーメッセージがでる
Load key "your-sshkey": incorrect passphrase supplied to decrypt private key
$ echo $?
False

パスフレーズの変更

ssh-keygenコマンドに、

-p オプションだけでも、インタラクティブに聞いてくるのでOK。

$ ssh-keygen -p -P "old_passphrase" -N "new_passphrase" -f ~/.ssh/your-sshkey


暗号強度について

dsaは使っちゃダメとか、rsaももう古いとか、ed25519がよいなど聞きますが、暗号アルゴリズムとか苦手なのでよくわからないのが正直なところです。現VerのOpenSSHだとデフォルトでRSA 2048bitになっていて、実際に使われているのもよく見ます。少なくともこれ以下の鍵長だとまずそうですね・・・。 あと、以下のようなニュースもきになります。これ2年前ですね・・・。今もっと進んじゃってるのかな・・・ www.technologyreview.jp

Docker環境準備 〜 nvidia-docker

nvidea-docker


インストール

github.com

のReadme.mdに従ってインストール&動作確認。以下のようにnvidia-smiが動けば大丈夫。

$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 750 Ti  Off  | 00000000:65:00.0  On |                  N/A |
| 40%   30C    P8     1W /  38W |    340MiB /  2000MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+


使い方

上記のように --runtime=nvidia オプションを指定します。nvidia-dockerコマンド(スクリプト)は、dockerのラッパーで、コンテナ生成時( run / create )時にdockerに対して以下のオプションを付与してくれます。

  • ランタイムオプション を付与
    --runtime=nvidia

  • ホスト側$NV_GPUを、コンテナ側$NVIDIA_VISIBLE_DEVICESに反映
    ホスト側がNV_GPU="gpu1 gpu2 gpu3"の時、以下の環境変数オプションを付与
    -e NVIDIA_VISIBLE_DEVICES=gpu1,gpu2,gpu3


コンテナ生成時はnvidia-dockerを使い(nvidia-docker run / nvidia-docker create)、それ以外はどっちでも大丈夫('docker psでもnvidia-docker ps`でも一緒)。


ー以上ー

Docker環境準備 〜 docker-ce

docker-ceインストール

docs.docker.com

に従いインストール。 ところが、docker run hello-world したら

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial unix /var/run/docker.sock: connect: permission denied

しかたないからsudo dockerして暫く使ってたんですけど

sudoしなくてもdockerできるようにする

調べると

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0  9月 26 23:25 /var/run/docker.sock

なんだ、権限ないだけか・・・。思ったら上記公式の下のほうに、dockerグループに入れてね。追加したら再ログインするの忘れないでね。と書いてありました。

# dockerグループに自分を追加
$ sudo usermod -aG docker $USER

# 自分の属するグループを確認
$ groups $USER

# 再ログイン

で、sudoしなくてもdockerでるようになりました。 なんか、これまたインストールした時忘れてそう・・・

消費電力モニタ付けてみた

『手元にGPUマシンを』~シリーズ第4回~

肝心なGPUの購入がまだですが、先だって消費電力モニタをつけることにしました。GPUは電力食うので今のうちにモニタできるように準備しておきます。


前回までのあらすじと本シリーズについて

vz-shark.hatenablog.com


消費電力モニタをつける

狙っているGPUGIGABYTEの2080ti搭載のやつ)の情報を漁っていたら『推奨電力650W』と記載をみつけました。今自作してるPCの電源は700Wなのでギリギリ。ハイエンドGPUはやっぱ消費電力すごそうだな~っということで今のうちに消費電力モニタをつけることにしました。

さっそくAmazon

以下の条件で探しました。

  • リアルタイム(まあ3秒に一回ぐらいでいいかな)消費電力を表示
  • 電力量(Wh)が積算できる
  • 電気代に換算(単価は設定可能)なもの
  • 安くて、ディスプレイの横あたりにおけるもの(気になった時ぱっとみれるように)
  • 今回の目的以外でも使えるもの

最終的にこれに決めました。

節電 エコチェッカー ET30D

節電 エコチェッカー ET30D


さっそく使ってみる


取り付け

こんな感じです。これなら気になった時すぐみれます。

f:id:vz-shark:20180926215945p:plain
消費電力モニタ(デスクトップ)


拡大するとこんな感じ。

f:id:vz-shark:20180926215940p:plain
消費電力モニタ(アップ)

緑の「ECO」マーク押すと、消費電力⇒積算使用時間⇒積算電気代⇒1時間あたりの電気代⇒積算使用電力⇒積算CO2排出量 と表示がかわります。あと積算のリセットと電気代単価の設定もできます。


自作中のGPUマシンで消費電力計測

現状でGTX700tiが乗っています。どぐらい電力かかるか測ってみました。(肝心なグラボがまだしょぼいけど)

  • アイドル時で85W
  • Win10でベンチマークソフト走らせると 最大で150Wぐらい
    ただこれは電力負荷試験ではなく、PCスペックのベンチマークをとる普通のソフトです。電力負荷試験する方法だれか教えてください。
  • ubuntu上のdocker上の chainerサンプルを./train_mnist.py -g 0GPUで計算すると137W
    ちなみに所要時間は、36.6秒
  • 今度は同じく./train_mnist.pyでCPUで計算すると186W
    ちなみに所要時間は、373.2秒
  • Win10でNiceHashでマイニングすると 119Wぐらい
    ハッシュレートは、アルゴリズムX16Rで2.146M H/s


これがハイエンドグラボにしたらどうなるか・・・?


最後に

もともと高価なものではないので、あまり考えずに買ったけど以下の機能もほしかった・・・(今更)

  • バックライトがつくもの(若しくは視野角が広く見やすいもの)
    これは工夫して、電力モニタが自分の目線の方(斜め上)を向くようにスペーサーを入れたら見やすくなったのでOK。
  • ピークホールド(最大消費電力)ができるもの
    これは工夫じゃカバーできないね〜。見張るしかない・・・。あとファンの音で感知・・・。

でもまあ、やりたかった事はできたからよし。

【これまでにかかった費用(パーツ代のみ計上)】
~<今回購入分詳細> ~

  • 節電 エコチェッカー ET30D = 991円
  • 合計: 991円

~<シリーズ通した全体>~

  • 第2回分 : 7万円
  • 第3回分 :  4,415円
  • 今回分  :  991円
  • 合計   : 75,206円


肝心なGPUがあいかわらずまだです・・・

-続くー

PCIe補助電源ケーブルを流用してみた

『手元にGPUグマシンを』~シリーズ第3回~

ハイエンドGPUは補助電源が必要なんですね・・・しらなかったです。手元にPCIe補助電源ケーブルなんてありません。さてどうしたものか・・・


前回までのあらすじ


PCIe補助電源ケーブルがない

手持ちのStronger社製ATX電源にはPCIeの補助電源用コネクタ(8pin用)が4つ付いてます。しかし電源ケーブルがありません。近所の電気屋にいって購入しようと店員さんにきいたら、各社電源側のコネクタは独自規格で互換性がないとのこと。そこで取り寄せを頼んだら、既に販売終了で入手困難との回答。
手持ちの電源コネクタをみると単にグラボ側のコネクタと形状が一緒のようなきがします・・・ 電源買いなおすしかないか~と思いネットで選んでいたら、SilverStone社製電源のコネクタとそっくりじゃないですか!ということで流用できないかと画策しました。


グラボ側のPCIe補助電源コネクタ仕様を調査

なぜかネットで検索するもめぼしい情報がヒットしません。かろうじてみつけた以下を参考にさせて頂きました。

こうなったら、公式のhttps://pcisig.com/で調べようと思ったら仕様書の無料ダウンロードはアカウント登録しないとダメで、しかも賛同している団体のドメインのメアドで必要らしい。会員以外は有料販売だなんてヒドイ!
あとは、SilverStoneのマニュアルにピンアサインが書いてありました。(4ページ目) https://www.silverstonetek.com/downloads/Manual/power/Multi-PSU-Manual.pdf 以下は拡大図

f:id:vz-shark:20180925172908p:plain
SilverStone PSUマニュアル拡大図

これでGPU側のピンアサインは把握できました。


SilverStone社製電源側のコネクタの調査

コネクタ形状は公式サイトの画像をよ~く見るしかなさそうです。

f:id:vz-shark:20180925172449p:plain
SilverStone電源側コネクタ拡大図

なんか、正方形と台形みたいな形があって誤差し防止してるようです。注目は、左上の2個の四角の間の上部にスリットが入っていて繋がってます。

手持ちの電源のコネクタの調査

手持ちのStronger社製の電源はアクセサリー類も含めて販売終了していますが、マニュアルはダウンロードできたのでよかったです。
株式会社サイズ | PC自作・冷却機器の専門メーカー。ハイコストパフォーマンスなCPUクーラーやケースファンをラインナップ。有名海外冷却ブランドの輸入販売代理も行っております。

Stronger社製電源のコネクタ形状を確認

これは手持ちのものなので、携帯で写真をとって拡大して形状を確認しました。 これをSilverStone社製電源/GPU側のコネクタと比べるとほらそっくり!

f:id:vz-shark:20180925181449p:plain
Stronger電源側コネクタ拡大図

なんか拡大すると誇りがすごいな~。あとでエアダスターで掃除しておこう・・・


テスターを当てStronger電源コネクタのピンアサインを確認

グラボ側のオスコネクタアサインは上記で把握できたので、ストレートケーブルだと仮定すると必然とSilverStone電源側のピン配置もわかります。 以下は手書きですがStronger電源の計測した結果です。+は12V。Gはグラウンドです。またグラウンド間はすべて通電チェックOKでした。

f:id:vz-shark:20180925175634p:plain
Stronger電源テスター計測結果
どうやら、Strongerのケーブルを流用できそうです。

※ちなみに以前買った中国製の安いテスターの電池がなくなっていたので。電池を交換しようとしたら電池の規格がどうも中国のもので入手困難でした。あと通電チェックのブザーがならなくて以前から不満だったので新しいのを買いました。


⇒通常のプローブとワニ口タイプの2セットがついてます。値段もお手頃です。電池も9V仕様の四角いやつで、通電ブザーもなります。結構満足です。


ケーブル購入とテスト

f:id:vz-shark:20180925185057p:plain
コネクタを電源側に差した図
ピッタリ! 爪もしっかりはまります。
f:id:vz-shark:20180925185053p:plain
GPU側のコネクタ(オス)のテスト図
PSUマニュアルの図の通りになっていました。


最後に

とりあえずテスタで測った結果は大丈夫そうですが、まだ実際にGPU買ってないのでうまくいくか不明です。
まあ、安く仕上げる分、すべて自己責任なので、それなりにリスクはありるのはしょうがないですよね。

【これまでにかかった費用(パーツ代のみ計上)】

~<今回購入分詳細> ~

~<シリーズ通した全体>~

  • 第2回分 : 7万円
  • 今回分  :  4,415円
  • 合計   : 74,415円


【追記】
肝心なGPUですが、記事を書いたり調べたりしてるうちに、Geforce RTX 2080tiがでました。tensolコアもついているので、これはいいかも! もしくは型落となったGTX1080tiが安く手にはいれば補助電源のテストも兼ねる意味でもいいかも!いきなり数十万するRTX2080tiに接続するのはチョット気が引ける・・・

-続くー

自分でLANコンセントをつけてみた

自宅の1階と2階の間をLANケーブルで結びました。屋根裏から壁を通してケーブル敷設し、壁に穴をあけてLANコンセントをつけました。今回は苦労した事や気を付ける点などのまとめと、使った道具のレビューを兼ねた投稿です。

~いきさつ~
自分の家は立地的に電波の入りが悪いようで、1Fの無線ルータからの電波が2Fに届きません。ルータは3階建てまでOKと銘打ったものなのに・・・。 業者に頼むと標準的な工事で大体3万円ぐらい。敷設する長さや家の構造によるメンテナンス性によっては追加費用がかかる場合があり実際に現場を見てみないと正確な見積もりがだせないとの事。最低でも3万か~、結構高いな~、ということで自分でやることにしました。


必要な道具を揃える

基本的に手持ちのもの以外はAmazonで購入しました。

※そのほかコメント
「ジョイント釣り名人」やビニールテープなどは目立つ色がよいです。屋根裏でヘッドライトで見つけやすいように。蛍光テープなんかもあると便利かもしれません・・・

実際に工事してみる

やってみると確かに家のメンテナンスのしやすさにより全然敷居がかわると思いました。

  • 屋根裏が広く人が入れれば大分楽です。特に高さがないと難しいです。
  • 柱があって場所によっては線を通せない箇所があります。目視できればよいのですがそうでない場合は壁を叩いて音の響き方で検討をつけます。
  • 断熱材が敷いてあってケーブルがなかなか通しにくい。結構びっしりひいてありました。
  • 既にCD管が通っていれば簡単(しかも呼び線も通っていればさらに良し)

基本的にケーブルを通すのは二人でやりました。ケーブルの両端に一人ずつ。
★工事中はブレーカーを落としておきます。


ケーブル敷設:1階の屋根裏~2階の屋根裏

まずは1階の屋根裏と2階の屋根裏の間にLANケーブルを通します。

  • 1Fと2Fの屋根裏に登れるところをさがします。自宅は両方とも押し入れの上にありました。1Fの屋根裏は人が入っていけるスペースはなし。2Fは十分なスペースがありました。
  • まずは2Fの屋根裏に入り電気の配線がどうやって1Fまでいっているか調べます。これを辿れば、1Fのブレーカーまではいけるはず。
  • 一人は2Fの天井裏に入り、電気の配線と同じ場所から「ジョイント釣り名人」を1Fへ落としていきます。この時1F側(引っ張られる側)をジョイント部分のネジがメスになるようにします(後でワイヤーロック金具をつけるため)。「ジョインと釣り名人」が1Fの天井裏まで到達したら、ツンツン叩いて1Fの天井裏でで音をたてます。
  • もう一人は1F天井裏に登り音を頼りにジョイント釣り名人をみつけピックアップします。
  • 1F側で「ジョイント釣り名人」にワイヤーロック金具をつけて、ビニールテープでロック金具にLANケーブルを固定します。すっぽ抜けたら今までの苦労が台無しになるので頑丈に止めます。
  • 2F側から「ジョイント釣り名人」を引き上げます。すると一緒にズルズルズルっとLANケーブルも上がってきます。途中何かに引っかかったら無理に引っ張らず、1F側に引き戻して何回かリトライします。
ケーブル敷設:1Fの屋根裏~ルータ近くの壁

これが一番苦労しました。1F側は屋根裏に人が入っていけるスペースがありせん。屋根裏の入り口から目的のルータ近くの壁まで水平に直線で8mぐらいあります。こういう場合は「ジョイント釣り名人」は不向きです。(ストレッチ性が逆に邪魔、長さもたりない)
いろいろ思案した結果、以下の方法でうまくいきました。

  • 手持ちの振り出し式の投げ竿(敷設用ではなく本当の釣り道具)に重り(8号ぐらい。竿がなるべく曲がらないぐらいの負荷)をつけて、振り出しを収納し短い状態にして1Fの屋根裏入口に登る。
  • 目的の壁までラインを送りながら竿を伸ばしていく
  • 壁までいったらリールをフリーにして糸を垂らしこんで1Fの壁の中の床下まで下ろし、重りでトントン床を叩き音を鳴らす。
  • もう一人は目的の壁付近で音を頼りに場所を特定し、穴をあける箇所にマーキングする。
  • キリやこぎりを使って壁に穴をあける。
  • 穴から釣り糸を手繰り寄せる。
  • 重りを外し、呼び線となる丈夫な紐(雑誌を捨てる時に結う糸を使いました)を釣り糸に結び丈夫に固定する。
  • 屋根裏から釣り糸を巻き上げ、呼び線を引き上げる。
  • 呼び線にLANケーブルを丈夫に固定する。
  • 壁側から呼び線を引っ張りLANケーブルを通していく

※紐の固定はしっかりビニールテープで頑丈に行います。すっぽぬけたら苦労が水の泡です。
※途中で何かに引っかりました。こういう時は一度引き戻して何度かリトライするとうまくいきます。
※釣り糸を落とし込むときは下に引っ張ることができないので、ある程度の重量がある重りを使い下方向に負荷をかけれるようにしておきます。
※擦れるのでPEラインではダメです。ナイロンのラインが適してます。
※上にも下にも動かせない状態に陥ったりしました。まさに釣りでいう根がかかり状態。根掛かりを外す要領でラインにテンションをかけた状態からレールを起こして一気に緩める。で引っ掛かりを外せました。最悪どうにもならなくなったらラインを切って捨て重りにするのも一つの手だと思います。

ケーブル敷設:2Fの屋根裏~2FのHUB付近の壁

2Fは横に柱が通っていて床まで落とし込める場所が見当たりません。電源ケーブルは端っこから床側を這っています。部屋の電灯のON/OFFスイッチが屋根裏から通って壁の中ぐらいの高さについており、中段に1つのタイプのプレートがついてます。そこで、このスイッチを上段に移設し、LANコンセントを下段につけ、上段下段の2口のプレートを付けることにしました。 これなら穴あけなくてよいし簡単です。

  • 電灯のスイッチのカバーをあけて、「ジョイント釣り名人」を屋根裏に向けて差し込んでいきます。
  • もう一人は屋根裏で待ち構えてといて「ジョイント釣り名人」をピックアップしワイヤーロック金具をつけてLANケーブルを固定します。
  • コンセント側から「ジョイント釣り名人」を引っ張りLANケーブルを通していきます。
  • 電灯のスイッチを冶具の中段から下段に移動します。
  • LANコンセントを冶具の下段に釣り付けます。(圧着は1Fと同様)
  • 上段下段の2口用のプレートを取り付けて完成。

※ここで作業ミス!!
コンセントから屋根裏まで「ジョイント釣り名人」2本で足りたで、そのまま作業を続けていたら、屋根裏からピックアップしたときに「ジョインと釣り名人」を壁の中に落としてしまいした。狭い隙間なので救出方法が思い浮かばず、とりあえず残りの3本で作業つづけました。 こうならないように「ジョイント釣り名人」は長めにつないだほうが良さそうです。救出は何か閃いてからやることにします。

LANコンセントからルータまで敷設&テスト

ここまでくればあとは簡単です。必要な長さのケーブルを作ってつなぐだけです。あとは、LANケーブルテスターで確認し、リンクランプやスピードテストなどをして確認して終わりです。


最後に

ケーブルの自作(コネクタ圧着やLANケーブルテストの使い方)は他サイトを参考にしました。ググると写真や動画付きで丁寧に説明されています。
ネズミにかじられないようにCD管を使っといたほうがよかったな~と思います(今更ですが・・・)。あと作業中ブログにアップすることを考えてなかったので写真をとってませんでした。買った道具類も結構満足してます。ケーブル自作キットも安物ですが十分事がたります。ヘッドライトは超お気に入りになりました。「ジョイント釣り名人」を2本ロストしたのは痛かったです。今後も役に立ちそうなので、あとで救出する予定です。うまく救出できたらその時また投稿します。(その時は写真も撮ろう・・・)

-以上ー

jpegのexifを編集(コマンドライン編)


 ネットでjpegファイルを公開するときに気になるのがjpegファイルに付与されているexif情報です。GPS位置情報や時刻情報などは個人の特定に繋がりかねません・・・ 。 exifを編集するGUIの便利なソフトはありますが、大量のjpegファイルを一枚ずつGUIベースのソフトで編集すのは面倒です。そこでコマンドライン一発で不要なexifを削除できないかと試行錯誤したので覚書です。

使用したソフト

jhead

コマンドラインベースのexifエディッタです。主にexif情報の表示や削除をする場合に使い勝手がよいです。

$ sudo apt install jhead

※公式サイトで大抵のOS(Win/Mac/Linux)のビルド済み実行ファイルが配布されてます。

exiftool

こちらもコマンドラインexifエディッタです。jheadと同様にexifの表示や削除ができますが、特にexifの一部の情報を上書きするのに重宝しました。

$ sudo apt install exiftool

※公式サイトで大抵のOS(Win/Mac/Linux)のインストール方法が記載させてます。



不要なexifを削除する(サブフォルダも含めて全て)

 結論から先に言うと以下に落ち着きました。

$ for filename in `find ./ -iname \*.jpg -or -iname \*.jpeg`; do jhead -purejpg -autorot $filename; done


それでは、以下順を追って・・・

① jheadでexif情報を表示する

 まずはsample.jpgのexifを表示させてみます。

$ jhead sample.jpg 
File name    : sample.jpg
File size    : 54821 bytes
File date    : 2018:09:20 19:45:15
Camera make  : Apple
Camera model : iPhone 6s
Date/Time    : 2018:09:18 10:07:17
Resolution   : 403 x 302
Orientation  : rotate 90
Flash used   : No
Focal length :  4.2mm  (35mm equivalent: 29mm)
Exposure time: 0.0029 s  (1/349)
Aperture     : f/2.2
ISO equiv.   : 25
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : N 35d 40m 16.5108s
GPS Longitude: E 139d 45m 53.982s
GPS Altitude :  2.29m
JPEG Quality : 95 

いろいろ付与されてます。GPS情報ものっています。ちなみに、-v オプションで更に詳細な情報が表示されます。

② jheadで不要なexifを削除する
$ jhead -purejpg sample.jpg 
Modified: sample.jpg  

$ jhead sample.jpg 
File name    : sample.jpg
File size    : 43797 bytes
File date    : 2018:09:20 19:45:15
Resolution   : 403 x 302
JPEG Quality : 95 

 大分スッキリしました。GPS情報も削除されています。しかし、これだけだと画像によっては縦横の表示が逆になってしまいます。これは、exifの Orientationタグ(画像の回転情報)が消されたためです。
※「 Orientation : rotate 90」が消されたので90度回転しない画像が表示される。

sample.jpgの元画像
「jhead -purejpg」後の画像
元ファイル purejpgのみ


③ Orientationタグの回転情報を画像自体に反映させる

 jheadにオプション -autorot を指定すると上記のOrientationタグを元に、画像自体に回転させて、なおかつタグを消してくれます。

$ jhead -autorot sample.jpg 
Modified: sample.jpg  
$ jhead sample.jpg 
File name    : sample.jpg
File size    : 53362 bytes
File date    : 2018:09:20 19:45:15
Camera make  : Apple
Camera model : iPhone 6s
Date/Time    : 2018:09:18 10:07:17
Resolution   : 288 x 403
Flash used   : No
Focal length :  4.2mm  (35mm equivalent: 29mm)
Exposure time: 0.0029 s  (1/349)
Aperture     : f/2.2
ISO equiv.   : 25
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : N 35d 40m 16.5108s
GPS Longitude: E 139d 45m 53.982s
GPS Altitude :  2.29m

Orientationタグが消えています。表示も以下のように正常です。(縦横があってる)

sample.jpgの元画像
「jhead -autorot」後の画像
元ファイル autorotのみ


④ 上記②③を組み合わせて

$ jhead -purejpg -autorot sample.jpg 
Modified: sample.jpg  
$ jhead sample.jpg 
File name    : sample.jpg
File size    : 42973 bytes
File date    : 2018:09:20 19:45:15
Resolution   : 288 x 403
JPEG Quality : 95

これで意図した通りに不要なexifが削除できました。


⑤ サブフォルダすべてのjpegファイルに適用する

 bashとfindを合わせて以下で目的達成です。なんかもっと簡単な方法があるような・・・

$ for filename in `find ./ -iname \*.jpg -or -iname \*.jpeg`
> do
> jhead -purejpg -autorot $filename
> done



exif情報を元にファイル名を撮影日時に変える

 jpegのファイル名をexif情報の撮影日時に変更する方法も便利そうなのでメモ。写真を整理したりするのに役に立ちそうなきがすので・・・

jheadの -nf オプションでファイル名を撮影日時にできます。フォーマット文字列は公式サイトに記載があります。

$ jhead -nf%Y%m%d-%H%M%S sample.jpg
sample.jpg --> 20180918-100717.jpg

フォルダ以下すべて変えるにはbashとfindを組み合わせて上記と同様に実行。

変更前

$ tree
.
├── IMG_3561.JPG
├── inu1
│   ├── IMG_2985.JPG
│   ├── IMG_2988.jpeg
│   └── IMG_3241.JPG
├── inu2
│   ├── IMG_3305.JPEG
│   └── IMG_3502.JPG
└── sample.jpg
2 directories, 7 files

ファイル名を変更

$ for filename in `find ./ -iname \*.jpg -or -iname \*.jpeg`
> do
> jhead -nf%Y%m%d-%H%M%S $filename
> done

変更後

$ tree
.
├── 20180918-100717.jpg
├── 20180918-100717a.jpg
├── inu1
│   ├── 20170101-093647.jpg
│   ├── 20170101-095133.jpg
│   └── 20180701-182534.jpg
└── inu2
    ├── 20180721-183656.jpg
    └── 20180908-172942.jpg
2 directories, 7 files



exif情報を書き換える

 exif情報を書き換えるにはexiftoolが便利です。以下、例としてGPS位置情報を変更します。またGPS情報は「GpsPrune 」というGUIソフト(ubuntu package に登録されてる)を使い地図上にマッピングして確認しました。

① exiftoolで目的のexifタグの目星をつける

 まずはsample.jpgのexifを表示させて目的のタグの目星をつけます。-vオプションでの階層構造も表示できます。

$ exiftool -v sample.jpg
  ExifToolVersion = 10.80
  FileName = sample.jpg
 〜中略〜
  | 10) GPSInfo (SubDirectory) -->
  | + [GPS directory with 15 entries]
  | | 0)  GPSLatitudeRef = N
  | | 1)  GPSLatitude = 35 33 0.6 (35/1 33/1 3/5)
  | | 2)  GPSLongitudeRef = E
  | | 3)  GPSLongitude = 139 47 10.1 (139/1 47/1 101/10)
 〜以下略〜

いっぱい表示されます。今回はGPSの緯度経度なので上記の抜粋部分が該当します。これで、北緯:35 33 0.6 / 東経:139 47 10.1(羽田空港)です。

② exiftoolでタグを変更する

 羽田空港から新千歳空港(北緯:42 47 34. / 東経:141 40 10.3に変更します。

$ exiftool -GPSLatitudeRef=N -GPSLatitude="42 47 34.4" -GPSLongitudeRef=E -GPSLongitude="141 40 10.3" sample.jpg

$ exiftool -v sample.jpg | grep GPS
  | 10) GPSInfo (SubDirectory) -->
  | + [GPS directory with 15 entries]
  | | 0)  GPSLatitudeRef = N
  | | 1)  GPSLatitude = 42 47 34.4 (42/1 47/1 172/5)
  | | 2)  GPSLongitudeRef = E
  | | 3)  GPSLongitude = 141 40 10.3 (141/1 40/1 103/10)
 〜以下略〜

変わりました。GpsPruneで位置情報を地図上にマッピングすると意図した結果が得られます。

変更前(羽田空港
変更後(新千歳空港
GPS変更前 GPS変更後



環境

試した環境は以下の通りです。
- Ubuntu 18.04 LTS
- jhead v3.00
- exiftool Version 11.10
- GpsPrune バージョン:18.6