2019年3月30日土曜日

河川付近で鳥

 カワラヒワ

 モズ

 モズ バッタを捕えた

 ジョウビタキ

2019年3月24日日曜日

Canon PowerShot SX70 HS のフード

Panasonicのビデオが壊れて、久方ぶりの動画目的のデジカメ。
powershot SX70 HS、予備バッテリーパック LP-E12、レンズフード LH-DC90。

 

レンズフードは、少しでも太陽光がレンズに入るのを防いだり、ズーム時につい忘れる手元の障害物から少しでもレンズを守る。かと言って、フォーカス補助光を遮ってもいけない  (サードパーティー製品では要注意)。

純正フードの装着状態
裏返しで着けた状態と正常装着。どちらもズームに支障なし。
 
 
向かって右肩の丸いのが補助光

レンズとフードには切り欠きで印がついているので、ちゃんと合わせて 90度回転。

2019年3月23日土曜日

jpg の Exif

Exifタグのメモ (Debian/GNU Linux Stretchにて)

・jpg, tiffのメタデータは、Exifだけじゃない。

Exif
 Exchangeable image file format 日本電子工業振興協会 (JEIDA)で規格化 JPEG, TIFF
https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

DCF
 Design rule for Camera File system IPTC(国際新聞通信委員会) JPEG

IPTC
 International Press Telecommunications Council Photo Metadata IPTC(国際新聞通信委員会)

XMP
 Extensible Metadata Platform アドビ

Exif 出力例 (値はダミー)
DateTime 年月日時分秒
 Exif.Image.DateTime               Ascii      20  2019:03:16 00:00:00
 Exif.Photo.DateTimeOriginal       Ascii      20  2019:03:16 00:00:00
 Exif.Photo.DateTimeDigitized      Ascii      20  2019:03:16 00:00:00


GPS 場所
 Exif.Image.GPSTag                 Long        1  11126
 Exif.GPSInfo.GPSVersionID         Byte        4  2.3.0.0
 Exif.GPSInfo.GPSLatitudeRef       Ascii       2  North
 Exif.GPSInfo.GPSLatitude          Rational    3  29deg 47.39000'
 Exif.GPSInfo.GPSLongitudeRef      Ascii       2  East
 Exif.GPSInfo.GPSLongitude         Rational    3  140deg 20.31000'
 Exif.GPSInfo.GPSAltitudeRef       Byte        1  Above sea level
 Exif.GPSInfo.GPSAltitude          Rational    1  03.6 m
 Exif.GPSInfo.GPSTimeStamp         Rational    3  06:07:08
 Exif.GPSInfo.GPSSatellites        Ascii       1
 Exif.GPSInfo.GPSStatus            Ascii       2  Measurement in progress
 Exif.GPSInfo.GPSMapDatum          Ascii       7  WGS-84
 Exif.GPSInfo.GPSDateStamp         Ascii      11  2019:02:19


GPSInfoタグにも年月日 GPSDateStampと時分秒 GPSTimeStampの2タグがあるので、日時 DateTimeだけを変更削除してもGPSタグで日時を推測される可能性がある。

Exif Version 2.3 http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf によれば、GPSタグが26個、下で説明の、exiv2 では30個を認識 https://exiv2.org/tags.html する。GPSタグと言ってもすべてが記録されるわけでもなく、位置情報に関するものも限られる。
更に、カメラメーカーによる独自タグもあり、Canon, Sony, Nikon, ...の名前がタグごとに入っていて、機種やレンズ、シャタースピード、露出などの撮影情報が含まれる。Canon, Sony, Nikonで眺めた限り、GPSや日時に関するものは はなかった。

"Exif.GPSInfo.GPSDateStamp"タグについては調べたほうがいいかも。
exiv2 -g Exif.GPSInfo.GPSDateStamp file.jpg して、消したほうがいいかも。



・タグの編集プログラム
注) Debianなので各コマンドのバージョンは古め。以下出力例はダミーです。

digikam
1ファイルづつタグの編集ができるらしい。KDE絡みで多量のファイルが同時インストールされるのが個人的に嫌だったので・・・試してない。

jhead
$ jhead -ts2019:03:16-00:00:00 *.jpg  ←日時の変更ts time set. DateTimeの3tagsを変える
$ jhead -purejpg M2380005.JPG           ←exif情報を全部消す

exiftool
GPSとDateTimeを弄るなら、これだけで十分。libimage-exiftool-perlパッケージ。LinuxのGUI版はpyExifToolGUIをperlでmakeインストールできそうでも面倒。
$ exiftool -gps:all= -xmp:geotag= image.jpg            ←GPSタグの削除
$ exiftool -AllDates="2019:03:16 12:34:56"          ← AllDatesは、DateTimeの 3tags
$ exiftool MVI_02001.MP4                                     ← mp4 のmetadataも表示できる

exiv2
$ exiv2 IMG_0079.JPG                       ←基本的な情報のみ表示
File name       : IMG_0079.JPG
File size       : 10
...略

$ exiv2 -pa IMG_0079.JPG                 ←exiv2で認識できる Exif, IPTC, XMPを全部表示
Exif.Image.Make                              Ascii       6  Camon
Exif.Image.Model                             Ascii      24  Camon PowerShut SiX70 H8
...略

$ exiv2 -g DateTime IMG_00251.jpg     ← -g で検索表示,大小文字区別
Exif.Image.DateTime                  ....略
Exif.Photo.DateTimeOriginal
Exif.Photo.DateTimeDigitized 

$ exiv2 ad -a 01:00:00 IMG_00251.jpg  ← DateTimeのタグ値 3つを01:00:00にする. ad adjust, -a 01:00:00 time adjust)

$ exiv2 rename img_1234.jpg                ← ファイル名を年月日時分秒にする
Renames img_1234.jpg (taken on 13−Nov−05 at 22:58:31) to 20051113_225831.jpg

$ exiv2 −r’:basename:_%Y%m’ rename img_1234.jpg    ←ファイル名に年月を付加
Renames img_1234.jpg to img_1234_200511.jpg

$ exiv2 -de rm demo.jpg          ← Exif情報だけ全部消す (-d delete, e Exif, i IPTC, x XMP)

$ exiv2 rm M2400011.JPG      ←メタ情報を全部消す

$ exiv2 -M"del Exif.GPSInfo.GPSLatitudeRef" image.jpg ←Exif.GPSInfo.GPSLatitudeRef タグを消す(値も)
-M"コマンド"ではワイルドカードが使えない。

...そこで、GPSとDateTimeの16個のタグを消すシェルスクリプト例。
注意:
 * Debianで'ls -l /bin/sh' は /bin/dash にリンクされているので配列が動かない。#!/bin/bashとする。
 * ファイル名にワイルドカードが使えない。
 * ファイル名_bak.jpgは、バックアアップ用の元ファイル。
=====  rmgpsdt.sh
#!/bin/bash

infile="$1"
ext=${infile##*.}

if [ $# -ne 1 ] ; then
    echo "argument count error."
    echo "command: rmgpsdt.sh one_file.jpg"
    echo "  remove GPS and DateTime Tags from Exif, depends on exiv2 and bash."
    exit 7
elif [ ! -e $infile ]; then
    echo "file not exist : $infile"
    exit 2
elif [ ${ext,,} != "jpg" ]; then
    echo "not jpg file : $infile"
    exit 1
else
    date_msg=`exiv2 -g Date $infile`
    gps_msg=`exiv2 -g GPS $infile`
    if [ -z "$date_msg" ] || [ -z "$gps_msg" ]; then
        echo "DateTime, GPS tags not in $infile."
        exit 1
    fi
fi

cp --backup=t $infile ${infile%.*}_bak.$ext

tags=(
"Exif.Image.DateTime"
"Exif.Photo.DateTimeOriginal"
"Exif.Photo.DateTimeDigitized"
"Exif.Image.GPSTag"
"Exif.GPSInfo.GPSVersionID"
"Exif.GPSInfo.GPSLatitudeRef"
"Exif.GPSInfo.GPSLatitude"
"Exif.GPSInfo.GPSLongitudeRef"
"Exif.GPSInfo.GPSLongitude"
"Exif.GPSInfo.GPSAltitudeRef"
"Exif.GPSInfo.GPSAltitude"
"Exif.GPSInfo.GPSTimeStamp"
"Exif.GPSInfo.GPSSatellites"
"Exif.GPSInfo.GPSStatus"
"Exif.GPSInfo.GPSMapDatum"
"Exif.GPSInfo.GPSDateStamp"
)
for tag in ${tags[@]}
do
        exiv2 -M"del $tag" $infile
done
echo "done"
=====
・・・まだ、いろいろあるけど・・・試してない
raw現像ソフト rawtherapee もmetadataを個別に消せる...何故か消せない。

その他

file
file コマンドでも結構な情報。当然編集はできない。

$ file M2380002.JPG
M2380002.JPG: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=10, manufacturer=Pandason, model=HC-VG60M, orientation=upper-left, xresolution=154, yresolution=162, resolutionunit=2, software=Ver.1.00 , datetime=2016:12:34 12:34:56], baseline, precision 8, 3200x1800, frames 3

$ file IMG_109.JPG
IMG_0096.JPG: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=12, manufacturer=Camon, model=Camon PowerShut SiX70 H8, orientation=upper-left, xresolution=196, yresolution=204, resolutionunit=2, datetime=2018:03:20 10:09:08], baseline, precision 8, 5184x2912, frames 3

・google傘下のここbloggerでは、exifはweb表示時点で一切消されてる。消した情報をgoogleがどう扱っているかは不明。

以上、素人メモ・・・追加:続編 jpg の Exif (2)

2019年3月20日水曜日

春前、山里、鳥

 ミヤマホオジロ

 コゲラ 真下向いて木を走った

 コゲラ 尻尾と2指対で木に留まる

2019年3月10日日曜日

pythonでグラフ2

pythonでグラフ1 (別ページ)
 1.python install
 2.python venv (Virtual Environments)の設定
 3.グラフでつかう matplotlibの日本語表示設定

pythonでグラフ2
 4.別途、手動で気象庁のcsvデータダウンロード
 5,悪運で動いたスクリプト


4.別途、手動で気象庁のcsvデータダウンロード
気象庁の[過去の気象データ・ダウンロード] https://www.data.jma.go.jp/risk/obsdl/index.php から、ダウンロードしたい地点、項目(今回、"時別値:気温")、期間を選んで[CSVファイルをダウンロード]する。

留意:
・1日の境界規定とcsvの記録が違うので、余裕を持った期間長でダウンロードして、後でcalc整形。気象観測統計の解説 https://www.data.jma.go.jp/obd/stats/data/kaisetu/shishin/shishin_all.pdf の「2.3.1 合計値」では「1時から24時の24回・・・」だけど、ダウンロードしたcsvでは[00:00:00から23:00:00]が1日になっている。
・1990年から毎正時観測されているが、1989年では 3時間毎のデーターしか無い。古くなれば資料数が減っていく。
・ダウンロードしたcsvは、shift-jis形式。通常の file コマンドだと、'data.csv: Non-ISO extended-ASCII text'。file-kanjiパッケージの漢字コードを調べる file2 コマンドだと、$ file2 data.csv 出力'data.csv:   SJIS text'。LibreOffice calcでも開くとき'文字エンコーディング: 日本語 (Shift-JIS)'と認識。
・1990年2月と2018年2月の日数をpython 対話モードで見ると、
>>> import calendar
>>> calendar.monthrange(1990,2)
(3, 28) ← 月の初日が(0月,1火,2水)3番目の木曜日で始まる28日間
>>> print(calendar.month(2018, 2))
   February 2018
Mo Tu We Th Fr Sa Su
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28

>>> quit()
どちらも、同じ28日。

ということで、
1990年分(1990-01-01 00:00:00 から1990-12-31 23:00:00)を1990data.csv、2018年分を2018data.csvとして /home/$USER/venv/test/data/ にセーブ。

1990data.csv



5,悪運で動いたスクリプト

温度データは、さらにtestにdataディレクトリを作って 1990data.csv, 2018data.csvに置いている。
/home/$USER/venv/test/data/1990data.csv
/home/$USER/venv/test/data/2018data.csv

ソースは venvの下のtestディレクトリに plot_test.pyとした。
/home/$USER/venv/test/plot_test.py

# coding: utf-8           ← 日本語通すため DebianはLANG=ja_JP.UTF-8
import pandas as pd    ← csvに便利なライブラリ
import matplotlib.pyplot as plt  ← グラフ書くためのライブラリ
# matplotlib.use('Agg')          ← pngファイル出力savefig()に使う。ここではコメントアウト

# 1990年のcsvをshift-jisを読み込んで、いらない行を消して、文字型を日付型と小数点型に設定しなおす
f1 = pd.read_csv("data/1990data.csv", encoding="SHIFT-JIS", header=None, names=["1990yr", "1990tempe", "tr1", "tr2"])
df1 = f1.drop(range(0,5)).reset_index(drop=True)

df1['1990yr'] = pd.to_datetime(df1['1990yr'])
df1['1990tempe'] = df1['1990tempe'].astype(float)

# 2018年のcsvの処理。上と同じ
f2 = pd.read_csv("data/2018data.csv", encoding="SHIFT-JIS", header=None, names=["2018yr", "2018tempe", "tr1", "tr2"])
df2 = f2.drop(range(0,5)).reset_index(drop=True)

df2['2018yr'] = pd.to_datetime(df2['2018yr'])
df2['2018tempe'] = df2['2018tempe'].astype(float)

# 月毎に温度を合計
df1_new = df1.groupby(df1['1990yr'].dt.month).sum()
df2_new = df2.groupby(df2['2018yr'].dt.month).sum()

# 1990年に2018年をくっつける
df = df1_new.join(df2_new)

# print(df)    ← 一旦、状況を見た

# グラフ項目名など。後はデフォルトで棒グラフを設定
df.plot.bar()
plt.legend()
plt.title('某地点の毎時温度を月別で合算')
plt.xlabel("月")
plt.ylabel("℃", rotation=0)  # y軸の"℃"が下向きにならないように
plt.xticks(rotation=0)        # x軸の月目盛りが下を向かないように
plt.grid(True)

# グラフ表示
plt.show()

# plt.savefig("bar.png")  ← pngで出力。showとsavefig両方するにはバックグランド処理が必要?
# ------- end

実行前に、venv環境で matplotlib が入っているかどうか見てみる。

(venv) :~/venv$ pip list  ← $ pip show matplotlib の方が直接的
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
cycler (0.10.0)
kiwisolver (1.0.1)
matplotlib (3.0.3)
numpy (1.16.2)
pandas (0.24.1)
pip (9.0.1)
pkg-resources (0.0.0)
pyparsing (2.3.1)
python-dateutil (2.8.0)
pytz (2018.9)
setuptools (32.3.1)
six (1.12.0)

なかったら
(venv) :~/venv$ pip install matplotlib
....
プログラム実行
(venv) :~/venv/test$ python plot_test.py

ウインドが開いて、グラフが表示される。ウィンドを閉じると、(venv)にプロンプトが戻ってくる。





以上、Do素人のメモ

小数点がついた途端面倒〜!
追加:
s1 = round(df['1990tempe'].sum(), 2)
s2 = round(df['2018tempe'].sum(), 2)
text1 = '1990 total : ' + format(s1)
text2 = '2018 total : ' + format(s2)

plt.text(0, 22000, text1, fontsize=10)
plt.text(0, 21000, text2, fontsize=10)
を追加して




2019年3月9日土曜日

pythonでグラフ1

目標:
手作業で、気象庁のデータ( https://www.data.jma.go.jp/risk/obsdl/index.php )から 1990, 2018年の毎時温度をでダウンロードして、各月で合算してグラフにする・・・なんの意味もないデス。
手作業でcalcちまちまやっても30分あれば済むことを、Do素人が、初pythonで初グラフ。

結果:

環境:
OS : Debian GNU/Linux Stretch, KDE, Python3.5

作業:
pythonでグラフ1
 1.python install
 2.python venv (Virtual Environments)の設定
 3.グラフでつかう matplotlibの日本語表示設定

pythonでグラフ2 別ページ
 4.別途、手動で気象庁のcsvデータダウンロード
 5,悪運で動いたスクリプト

1.pythonのインストール
pythonバージョン2系はディフォルトで入っている。
python3系で試したいので、パッケージ名 python3.5 , python3.5-venv, python-pip とその依存パッケージをインストール。
(後に使用する python3-matplotlib, python3-pandas などのdebパッケージはここではインストールせず、仮想環境のvenvで pip install した。)

2.venv の設定
設定は、ディレクト以下に作られる。必要なファイルコピー、その後パス通しをやってるみたい。ここでは安易に "venv"というディレクトリ名にした(任意で、py_venvでもtestPythonでもなんでもいい)。/home/$USER/に置き、python3を使う設定とした。(以下、ユーザー名$USER, プロンプト表示は各環境による)。
ターミナルを開いて、
$ cd
$ pwd /home/$USER
$ python3 -m venv                   ← ここで ディレクトリ venvも作られる。

次に 仮想環境を試してみる
$ cd venv
$ source bin/activate             ← 仮想環境の機能開始
(venv) :~/venv$ python -V    ← プロンプト頭に (venv)と出る。パイソンのバージョン
Python 3.5.3                         ← python3 -V としてないのに、ちゃんとバージョン3.5
(venv) :~/venv/test$ pip3  ← この環境では pip3も pipも同じ。
Usage: 
  pip [options]
Commands:
  install        Install packages.
  ... (省略)
(venv) :~/venv$ pip install pandas  ← 先で使うpandasというライブラリもインストール
Collecting pandas
  Using cached https:/...
  ... (省略)
(venv) :~/venv$ deactivate          ← 仮想環境の機能を止める

結局、venv環境でpython3を使うには、venvディレクトリで

$ cd venvディレクトリ
$ source bin/activate
・・・
$ deactivate

・・・という流れ。venv を使わなくなったら、ディレクトリごと削除。

 [pip のメモ]
 pipのバージョンは?
 $ pip --version
 pip でパッケージは何入れた?
 $ pip freeze
 pythonのバージョン何にした?
 $ python --version
 Python 3.5.3
 Debian stretchの venvには PySide2もインストール簡単
 $ pip install PySide2

3.グラフ作成でつかうmatplotlibの日本語表示の設定
現状は、
$ source bin/activate
(venv) :~/venv$ python                 ← 対話モード(インタラクティブモード)
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib as mpl
>>> print(mpl.rcParams['font.family'])
['sans-serif']                         ← sans-serif だけ
>>> print(mpl.rcParams['font.sans-serif'])
['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Sef', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avantarde', 'sans-serif']
>>> quit()                             ← 対話モード終了は CTRL+D か quit()
(venv) :~/venv$ deactivate              ← venv環境終了


matplotlibは ttfフォント(TrueType フォント)とotfフォント(OpenType)に対応。
以下は Takaoフォント(TakaoGothic, TakaoPGothic, TakaoMincho, TakaoPMincho)の利用で説明。

$ apt search takao
出力に[インストール済み]表記が無い場合、この出力を参考にパッケージをインストール。
(DebianにはデフォルトではTakaoフォントは入っていない。)
$ sudo apt install fonts-takao

インストールの確認を再びpythonで行ってみる。
$ source bin/activate
(venv) :~/venv$ python                 ← 対話モード(インタラクティブモード)
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.font_manager as fm
>>> fm.findSystemFonts()

この出力を mpl_font.txtなんかにコピペしてやる (改行無いのでエラーでるかも)。
見やすいように、普通のターミナルで整形してソート。
$ cat mpl_font.txt | tr ',' '\n' | sort > font.txt
$ grep Takao font.txt
 '/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf'
 '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf'
 '/usr/share/fonts/truetype/takao-mincho/TakaoMincho.ttf'
 '/usr/share/fonts/truetype/takao-mincho/TakaoPMincho.ttf'
拡張子を抜いたファイル名 TakaoGothic, TakaoPGothic, TakaoMincho, TakaoPMinchoは、matplotlibの設定ファイル matplotlibrc で使う。

venv環境で使うフォントなので、venv環境の対話モードで matplotlibrcの場所を聞く。
>>> import matplotlib as mpl
>>> mpl.matplotlib_fname()
'/home/$USER/python venv/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc'
設定ファイルの場所がわかったので、quit()してdeacivate

matplotlib を開いてみると、Debianでは行頭が全部'#'でコメントアウト。
"FONT"で検索していくと"#### FONT"以下が見つかる。
195行 # font.family          : sans-serif
206行 # font.serif            : DejaVu Serif, Bitstream Vera Serif, ...
207行 # font.sans-serif    : DejaVu Sans, Bitstream Vera Sans, ,,,

この3行の# を消して、206行の207行のフォントリストの最初にTakaoPMincho,TakaoPGothic,を書き込み保存。
font.family          : sans-serif
font.serif             : TakaoPMincho, DejaVu Serif, Bitstream Vera Serif, ... ←この行はいじらなくてもいいかも
font.sans-serif   :: TakaoPGothic, DejaVu Sans, Bitstream Vera Sans, ...

一旦、フォントキャッシュを消す (すぐ再生されるので気にしない)。
$ rm -r ~/.cache/matplotlib

再度(venv)で確認
(venv) :~/venv$ python                 ← 対話モード(インタラクティブモード)
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib as mpl
>>> print(mpl.rcParams['font.family'])
['sans-serif']
>>> print(mpl.rcParams['font.sans-serif'])
['TakaoPGothic', 'DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Sef', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avantarde', 'sans-serif']
TakaoPGothicを認識

注意) python venv環境の削除や、アップデートの度に matplotlibrcは上書きされてデフォルトに戻るので、matplotlibrcは再設定が必要。

以上で matplotlibの日本語設定終了。

DO素人のメモ

2019年3月1日金曜日

Kate のメモ

Linux上のディスク環境KDE用のエディター Kate : KDE advanced text editor の設定。
環境 Debian Stretch   $ kf5-config --version Qt: 5.7.1 KDE Frameworks: 5.28.0 kf5-config: 1.0   $ kate --version kate 16.08.3 
・ 拡張子によって Kateが開くようにするには、KDEの設定を使う。
例えば、python慣例の".py"なら、
KDEのシステム設定→[個人設定:アプリケーション]→[ファイルの関連付け]で "python"を入力検索。[既知のタイプ : text→x-python]をクリックして、右タブに現れる[ファイル名パターン]を確認、[アプリケーションの優先順位]で Kateが一番上に来るように [^ 上へ移動(U)] をクリックして調整→適用。


・Kateからターミナルを立ち上げる 
KDE用の端末エミュレーター Konsoleが立ち上がる。

Kateの[設定]→[Kateを設定]→[アプリケーション : プラグイン]→[ターミナルツールビュー]にチェックを入れて[OK]。Kateの下に[ターミナル]のアイコンが出る。

Kateで開いたディレクトリで Konsoleを立ち上げるには、kateの[設定]→[Kateを設定]→[アプリケーション : ターミナル]→[可能なときは自動的にターミナルを現在の文書と同期する (U)]をチェック


以上、素人のメモ