2017年12月16日土曜日

DxO Optics Pro を DxO PhotoLab にアップデート

鏡
Ricoh GR

 DxO Optics Pro を DxO PhotoLab にアップデートしました。

 今回のアップデートは、部分調整機能の強化がメイン。ブラシや段階フィルタでのマスク処理のほか、Nik の U Pointテクノロジーが導入されています。
 U Point は 複雑な指定をせずに色情報からマスクを作成する機能で、クリックとドラッグで簡単に選択範囲を指定できます。
 なので、人の顔だけ明るくしたりとか、花の色を鮮やかにしたりとかが、たいして手間を書けずに調整できます。

 Googleが買収して無償化→開発停止となっていた Nik Collection が DxO に買収されて仄かに期待はしていたのですが、早々と組み込んでくれて嬉しいです。

2017年12月10日日曜日

見上げると

秋を見上げる
α6500 & SIGMA 16mm F1.4 DC DN

 寒風の中、ふと空を見上げるとそこにはまだ秋が。

2017年12月9日土曜日

『「怖い絵」展』を観てきました

青空
α6500 & SIGMA 16mm F1.4 DC DN

 先週末のこと。
 上野の森美術館で開催されている『「怖い絵」展』に子どもの希望で行ってきました。
 この展覧会は、中野京子さんというドイツ文学者の方が書いた『怖い絵 』という書籍の刊行10周年を記念して開催されたものです。
 私は書店で見かけただけで読んだことがなかったのですが、『怖い絵 』は「恐怖」に焦点をあてその絵の時代背景や隠された物語から読み解く美術書で、ベストセラーになりシリーズ化もされているようです。

 かなり人気の展覧会だったようで、我々が着いたときは130分待ちの長蛇の列。
 整理券ぐらい配ってはもらえないものだろうかと思いつつ、寒風吹きすさぶなかコートの襟を立てて行列に並んでおりました。並び始めたのが午後3時30分ぐらいだったので、入る頃にはあたりはもう真っ暗。
 中に入っても人混みが激しく、絵にたどり着くまでが一苦労するありさまでしたが、それでもうちの子としては珍しくひとつひとつの絵をじっくりと眺めて解説を読んでいので、かなり興味深い展示だったのではないでしょうか。

2017年12月1日金曜日

広角は楽しい(SIGMA 16mm F1.4 DC DN Contemporary の感想 その2)

水辺の椿
α6500 & SIGMA 16mm F1.4 DC DN

 広角レンズは楽しいですね。
 広がりのある光景を広々と写し込むだけでなくて、メインの被写体に寄りつつも周囲の情景も取り込んでみるなど、いろいろと工夫のし甲斐があります。

 個人的には広角レンズを楽しく使うコツは「とにかく寄る」ことだと思っています。

 相撲の極意は「押さば押せ、引かば押せ」だそうですが(相手が押してこようが引いてこようが押せということ。出典は高校生の時に読んだ『拳児』)、広角の極意は「寄らば寄れ、引かば寄れ」だと勝手に思っております。

 ぐいぐいぐいぐい寄っていくと、新たな世界が開けます。
 メインの被写体にピントを合わせて背景をボカシてもいいし、あるいは背景にピントを合わせてメインをあえてボカシのもいいです。広角レンズは被写界深度が浅いので、かなり寄ってもボカシている部分がなんとなくわかるのが良いところです。

 さて。
 このシグマさんの「SIGMA 16mm F1.4 DC DN」ですが、点光源が年輪ボケにならないのが嬉しいですね。
 少し前の非球面レンズを使ったレンズではよく発生したものですが、技術の進歩とは凄いものです。

2017年11月26日日曜日

オープンサンド

ローストビーフのオープンサンド
Ricoh GR

 某所で食したローストビーフのオープンサンド。
 一見サラダのように見えますが、肉の下にわずかながらパンが敷いてあります。

 そもそもオープンサンドそのものが「オープン」とついているとはいえ単にパンの上に具が載っているだけなのにサンドウィッチと呼んでいいのか、むしろピザと呼ぶ方がが近いのではないかとふつふつと疑問が湧いてくるタイプの食べ物でありますが、さらに加えてこのオープンサンドは当初はパンは影も形も見えず肉を食べていくとソースに浸ってフニャッとなったパンが出てくるという、パンを持って具材を持ち上げ口に運ぶことが不可能な、もはやパンはサラダの具材、大きいクルトンと呼んでも差し支えないオープンサンドでございました。

 ま、美味しかったのでいいんですけどね。

ローストビーフのオープンサンド
Ricoh GR

SIGMA 16mm F1.4 DC DN の感想など

居眠りネコ
α6500 & SIGMA 16mm F1.4 DC DN

 SIGMAさんはミラーレスカメラ用のレンズのラインナップにも力を入れ始めたようで、30mmに引き続き広角16mmの「SIGMA 16mm F1.4 DC DN」も投入されました。フルフレーム換算24mmでF1.4と大口径なのが嬉しいですね。

 電子補正を活かしたコンテンポラリーラインですが、APC-Cサイズのミラーレスカメラ用レンズにしては重量405gと大柄のレンズです。Art基準にしちゃうとさらにサイズアップしてしまうでしょうから、ミラーレスカメラ向けにはこういうシリーズがあっていいですね。 

 F1.4とはいえ、16mmでAPC-Cなので被写界深度はそれなりにあるかと思っていましたが、結構浅いです。上の写真くらい寄るとネコの鼻にピントが合うと眼はボケちゃいます。油断せずに何枚か撮っておいてよかった。

 ピント面の解像力はしっかりしているようです。
 ボケ味が素直なので、大口径を活かして寄って撮るのも楽しいです。
 歪曲が大きめのようなので、LightroomやDxOが歪曲収差補正に早く対応してくれると嬉しいな。

2017年11月7日火曜日

都電とバラ

都電荒川線
Ricoh GR

 荒川区内の都電荒川線沿いには多くのバラが植えられていて、沿線沿いの小路は秋のお散歩にはもってこいです。
 春も悪くないのですが、11月上旬の少し肌寒いぐらいの時期の方が個人的には好き。
 汗をかかずに歩けますし、バラの美しさも長持ちしますしね。

都電荒川線
Ricoh GR

2017年11月5日日曜日

Pythonに関する書籍の紹介

ガーデン
α6500 & Sonnar T* E 24mm F1.8 ZA SEL24F18Z

 Python関連で購入したり図書館で借りたりしたりして読んだ本の一覧と感想です。
 随時更新予定。

入門書

実践力を身につける Pythonの教科書

 自分は入門書としてこれを購入。
 わかりやすくPythonの基本がひと通り身につく。

入門 Python 3

 文法面は詳しく、また有用な標準ライブラリなどにも言及がある。上の本を読んだあとでも、役に立つ記述があるので一度読んでおくとよい。自分は図書館で借りた。

Python 3.6.3 Documentation

 Pythonの日本語ドキュメント。書籍ではなくて恐縮だが、読んでおいたほうがよいと思うので掲載。
 上の本を読んだあとにひととおり読んでおくと標準ライブラリにどんなものがあるかなんとなく頭に入るので、無駄な苦労をしなくてすむと思う。  

クローリング・スクレイピング関係

Pythonによるスクレイピング&機械学習 開発テクニック BautifulSoup,scikit-learn,TensorFlowを使ってみよう

 書名のとおり、スクレイピング、機械学習(含むディープラーニング)をひととおり体験できる。スクレイピングについて詳しく知りたい人は、最初から下の本を買うほうがよいかと思う。

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

 基本的なスクレイピング処理から自動での処理まで、相手先への負荷への配慮とか、エラーが出た場合の処理方法なども含めて載っている。
 下の本と両方手に入れたほうがよいが、どちらか一冊と言われたらこっちかな。

Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析・運用まで

 こちらも基本的なスクレイピング処理から自動での処理まで記載されている。
 Scrapyについてもっと詳しく記載してほしかったのと、Web上で記載した記事の焼き直しのようなものもありそれに起因する誤植のようなものもあったのが減点要因。

機械学習・ディープラーニング

Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう

 再掲。機械学習やディープラーニングがどんなものか体験してみるには良い本。

その他

Effective Python ―Pythonプログラムを改良する59項目

 内容は高度。理解でない部分も多かったが、初心者のうちに目を通しておくと後で苦労が減りそうな感触がある。図書館で借りたが、手元に置いておきたいので後で買う予定。

PythonユーザのためのJupyter[実践]入門

 Jupyter Notebookを使ってのpandasによるデータ集計や、Matplotlib、Bokehによるデータ可視化を解説。Seabornについても解説されているとさらに嬉しかったのだったが、それはないものねだりですかね。。

2017年11月3日金曜日

【Python】簡易ドキュメントデータベース「TinyDB」を使ってみる

屋敷森
Ricoh GR

TinyDBとは

 Python用の簡易型のドキュメントデータベースです。
 サーバーを立てる必要がなく、データはJSON形式で保存されます。
 インストールもpipで簡単にできるので、ちょっとしたデータベースを作りたいときにお手軽に使えます。

 この記事では、自分用のメモを兼ねて簡単に使い方を記載します。
 詳しいドキュメントは「Welcome to TinyDB! — TinyDB 3.6.0 documentation」を御覧ください。

インストール方法

 pipで簡単にインストールできます。

pip install tinydb

使い方

ライブラリのインポート
from tinydb import TinyDB, Query
データベースの作成・オープン

 TinyDBメソッドにファイル名(必要ならパスを入れて)を引数で指定してデータベースを作成・オープンします。既にファイルがあれば開き、なければ新規に作成します。

# データベースの作成・オープン
db = TinyDB("db.json")

 なお、インメモリーで使う場合は、次のように開きます。

from tinydb.storages import MemoryStorage
db = TinyDB(storage=MemoryStorage)
テーブルの作成・指定

 データベースの中にテーブルを作成するとき(あるは既存のテーブルを開くとき)は、table() メソッドの引数で指定します。なお、テーブルを指定しないで使用することも可能です。この場合は「_default」というテーブルが使用されます。

tb_fruit = db.table("fruit")
tb_animal = db.table("animal")

 データベース内にあるテーブルの一覧は tables()メソッドで取得します。テーブルのリストが戻り値となります。

tables = db.tables()
データの追加

 一件ずつデータを追加するときは insert()メソッドに辞書を引数として渡します。
 後述しますが、戻り値としてドキュメントIDが返ります。
 テーブルを省略した形でデータベースから直接 insert()メソッドを使うと「_default」テーブルに追加されます。他のメソッドも同様です。

db.insert({"kind": "ネギ", "count": 1}) #テーブルを指定しない場合「_defaul」テーブルに追加される
tb_fruit.insert({"kind": "リンゴ", "count": 2})
tb_animal.insert({"kind": "サル", "count": 3})

 複数のデータを追加するときは、insert_multiple()メソッドを使います。引数は辞書のリスト、戻り値はドキュメントIDのリストとなります。

new_fruits = [{"kind": "オレンジ", "count": 4}, {"kind": "メロン", "count": 10}]
tb_fruit.insert_multiple(new_fruits)
new_animals = [{"kind": "キリン", "count": 2}, {"kind": "サル", "count": 10}]
tb_animal.insert_multiple(new_animals)
データの一覧出力 

 all()メソッドでテーブルのデータの一覧が出力されます。

# fruitテーブルのデータを一覧出力
tb_fruit.all()

#データベースに使用した場合は _defaultテーブルのデータが出力される
db.all()
データの検索

 検索にはQueryオブジェクトを使います。

query = Query()

# search()は該当するドキュメント(辞書)のリストが出力
tb_animal.search(query.kind == "サル")  # 該当するドキュメントのリストが出力
tb_fruit.search(query.kind == "キウイ")  # 該当するものがない場合は空のリストで出力
tb_fruit.search(query.count > 3) # 比較演算子が使える

# get()は該当する1件のみの出力
# 戻り値はドキュメント
tb_animal.get(query.kind == "サル")

# contains()は該当するドキュメントがあるか否か(戻り値は True / False)
tb_fruit.contains(query.kind == "オレンジ")
tb_fruit.contains(query.kind == "キウイ")

# count()は該当するドキュメントの数
print(tb_animal.count(query.kind == "サル"))
print("\n---------\n")
データの更新

 データの更新にはupdate()メソッドを使います。

# kindがキリンのドキュメントのcount値を1に更新
tb_animal.update({"count": 1}, query.kind == "キリン")

# 検索条件が複数ドキュメントに該当する場合はすべてのドキュメントが更新される
tb_animal.update({"count": 5}, query.kind == "サル")
データの削除

 データの削除にはremove()メソッドを使います。

# countが5未満のドキュメントを削除
tb_fruit.remove(query.count < 5)
ドキュメントID

 テーブル内の各ドキュメントにはそれぞれドキュメントIDが自動で振られます。
 insert()メソッドでデータ(ドキュメント)を挿入した場合の戻り値は挿入したドキュメントのIDとなり、insert_mulipleで挿入した場合の戻り値は挿入したドキュメントのIDのリストとなります。

# 挿入したデータにはドキュメントIDが振られる
id = tb_fruit.insert({"kind": "ブドウ", "count": 2})

# 複数挿入した場合はIDがリストで返る
new_fruits = [{"kind": "パパイヤ", "count": 12}, {"kind": "マンゴー", "count": 15}]
ids = tb_fruit.insert_multiple(new_fruits)
print("パパイヤとマンゴーのdocumentID: {0}".format(ids))

 既にテーブルにあるドキュメントのIDを取得したい場合は、ドキュメントのdoc_idプロパティから取得できます。

id = tb_fruit.get(query.kind == "メロン").doc_id  # documnet.doc_idでIDを取得

 get() は doc_id 引数、 contains()、 update()、 remove() はdoc_ids引数(IDのリスト)でドキュメントを指定できます。

# get()はdoc_id引数、 contains(), update(), remove()でdoc_ids引数で指定できる
tb_fruit.get(doc_id=id)
tb_fruit.update({"kind": "メロン", "count": 10, "size": "large"}, doc_ids=[id])
テーブル内のデータの個数

 Len()関数で引数にテーブルを指定するとテーブル内に含まれるデータの個数が返ります。

# fruitテーブルのデータの個数を出力
len(tb_fruit)

# データベースを指定すると _defaultテーブルおデータの個数が出力される
len(db)
テーブル内のすべてのデータの削除

 purge()メソッドでテーブル内のすべてのデータが削除されます。

tb_fruit.purge()
tb_animal.purge()
db.purge()  # _defaultテーブルのデータのみ適用される

サンプルコード

from pprint import pprint
from tinydb import TinyDB, Query

db_path = "db.json"

# データベースの作成・オープン
db = TinyDB(db_path)

# インメモリーで使う場合
# from tinydb.storages import MemoryStorage
# db = TinyDB(storage=MemoryStorage)


# テーブルの作成・指定(未指定の場合は_defaultというテーブルが使用される)
tb_fruit = db.table("fruit")
tb_animal = db.table("animal")

# データベースにあるテーブルの一覧リスト
tables = db.tables()
print("# データベースにあるテーブルの一覧リスト")
pprint(tables)
print("\n---------\n")

# 一件ずつのデータの追加
db.insert({"kind": "ネギ", "count": 1})
tb_fruit.insert({"kind": "リンゴ", "count": 2})
tb_animal.insert({"kind": "サル", "count": 3})

# 複数のデータの追加
new_fruits = [{"kind": "オレンジ", "count": 4}, {"kind": "メロン", "count": 10}]
tb_fruit.insert_multiple(new_fruits)
new_animals = [{"kind": "キリン", "count": 2}, {"kind": "サル", "count": 10}]
tb_animal.insert_multiple(new_animals)

# データの一覧出力
print("# データの一覧出力")
print("_defaultテーブルのデータ")
pprint(db.all())  # _defaultテーブルのデータのみ適用される
print("fruitテーブルのデータ")
pprint(tb_fruit.all())
print("animalテーブルのデータ")
pprint(tb_animal.all())
print("\n---------\n")

# データの検索
query = Query()
# search()は該当するものがリストで出力
print("# データの検索")
pprint(tb_animal.search(query.kind == "サル"))  # 該当するものがリストで出力
pprint(tb_fruit.search(query.kind == "キウイ"))  # 該当するものがない場合は空のリストで出力
pprint(tb_fruit.search(query.count > 3))
# get()は1件のみの出力
pprint(tb_animal.get(query.kind == "サル"))
# contains()は該当するものがあるか否か
print(tb_fruit.contains(query.kind == "オレンジ"))
print(tb_fruit.contains(query.kind == "キウイ"))
# count()は該当するものの数
print(tb_animal.count(query.kind == "サル"))
print("\n---------\n")

# データの更新
print("# データの更新")
tb_animal.update({"count": 1}, query.kind == "キリン")
tb_animal.update({"count": 5}, query.kind == "サル")  # 複数該当する場合はすべての項目で更新
pprint(tb_animal.all())
print("\n---------\n")

# データの削除
print("# データの削除")
tb_fruit.remove(query.count < 5)
pprint(tb_fruit.all())
print("\n---------\n")

# ドキュメントID
# 挿入したデータにはドキュメントIDが振られる
print("# ドキュメントID")
id = tb_fruit.insert({"kind": "ブドウ", "count": 2})
print("ブドウのdocumentID: {0}".format(id))

# 複数挿入した場合はidがリストで返る
new_fruits = [{"kind": "パパイヤ", "count": 12}, {"kind": "マンゴー", "count": 15}]
ids = tb_fruit.insert_multiple(new_fruits)
print("パパイヤとマンゴーのdocumentID: {0}".format(ids))

# documnet.doc_idでIDを取得
id = tb_fruit.get(query.kind == "メロン").doc_id
print("メロンのdocumentID: {0}".format(id))
print("\n---------\n")

# get()はdoc_id引数、 contains(), update(), remove()でdoc_ids引数で指定できる
print("# ドキュメントIDでのデータの指定")
print("doc_id:{0} は {1}".format(id, tb_fruit.get(doc_id=id)))
tb_fruit.update({"kind": "メロン", "count": 10, "size": "large"}, doc_ids=[id])
print("doc_id:{0} は {1}".format(id, tb_fruit.get(doc_id=id)))
print("\n---------\n")

# データの個数
print("# データの個数")
print("db(_defaultテーブル)のデータの個数 = {0}".format(len(db)))
print("fruitテーブルのデータの個数 = {0}".format(len(tb_fruit)))
print("animalテーブルのデータの個数 = {0}".format(len(tb_animal)))
print("\n---------\n")

# すべてのデータの削除
print("# すべてのデータの削除")
db.purge()  # _defaultテーブルのデータのみ適用される
tb_fruit.purge()
tb_animal.purge()
print("_defaultテーブルのデータ")
pprint(db.all())
print("fruitテーブルのデータ")
pprint(tb_fruit.all())
print("animalテーブルのデータ")
pprint(tb_animal.all())
print("\n---------\n")

2017年10月29日日曜日

オジギソウの花

オジギソウ


 オジギソウを育ててみてびっくりした幾つかのこと。

  • 夜は葉が閉じる。
  • 花が咲く。

 知識として知っていても、実物を育ててみての驚きがいろいろとあります。