読者です 読者をやめる 読者になる 読者になる

にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

このブログについて

文字・フォント・プログラム・技術・趣味などについて、Twitterでは書きづらい長い内容などをまとめるためのブログです。基本的には自分用のメモとして書いている部分が多いです。

リンク等

Pixiv http://pixiv.me/nixeneko
Tumblr http://nixeneko.tumblr.com/ 絵。Pixivアカウント持ってなくても見れます
Twitter https://twitter.com/nixeneko  
MediaMarker http://mediamarker.net/u/nixeneko/ 主に文字・言語関係の蔵書
GitHub https://github.com/nixeneko プログラム用、あまり使ってない
Amazon
欲しい物リスト
http://www.amazon.co.jp/registry/wishlist/1C43ZFBA4IL6Z プレゼントを下さい
ナナシスID ZhRYMnA
デレステID 421820148

sshでログインした先で、ログアウトしてもコマンドの実行が継続されるようにする: screenコマンド

Linux

sshでログインしている先のLinuxで、終了まで長い時間がかかるDNNの学習などの処理を実行し、後はログアウトして終了を待つ、ということがしたかったので、どうすればいいのか調べたメモ。


バックグラウンド実行しただけではログアウトすると終了してしまう。
nohupを使用しても、ログアウト時に終了されてしまう。

screenコマンド

どうやらscreenコマンドを使用するといいらしい。
screenは仮想的な端末を作成することができるコマンドで、作成した仮想端末は必要に応じて付け替えて使え、さらにログアウトしても保持されるらしい。
詳しい使い方は以下のサイトを参照。
qiita.com
asayamakk.hatenablog.com

suでユーザを切り替えた場合

ただし、screenコマンドはsuでユーザを切り替えている場合、ターミナルが開けないとエラーを吐く。
ログインしたユーザに対し擬似ターミナルが作成されているため、ユーザを切り替えた先ではターミナルが無く、scriptコマンドを実行して擬似ターミナルを無理やり作成しないといけないとのこと。


あるいは、suによってユーザを切り替えるのではなく、初めからそのユーザでログインすればこの問題は起こらない。

sshで接続した先でmatplotlibなどがエラーを吐く

qiita.com

ssh接続した先でpythonからmatplotlibを扱うと$DISPLAY環境変数がないよって怒られる

_tkinter.TclError: no display name and no $DISPLAY environment variable

なので、

env DISPLAY=:0 python hoge.py

みたいにして実行するといいらしい。

現在時刻のglobal date and time stringを生成する

HTML Javascript

HTML5では、時間を指定するための<time>要素があり、また<del>要素などではdatetime属性によって時間を指定できる。これは編集履歴を残すのに都合がよい。

ここに指定するのは、有効なglobal date and time stringでなければならない。

例えば、

2017-03-15T20:53:45+09:00

とすると、2017年3月15日の20時53分45秒、タイムゾーン+09:00(=日本時間)ということになる。


ときどき現在時刻がこの形で欲しくなるので、このdatetimeに指定するための文字列を自動生成するようなものを作っておく:

UTC版:
タイムゾーン版:

ScanSnap S1300iで自炊を試す

DIY

ScanSnap S1300iを買って手元の書類とかをスキャンしてたのだけれど、本も断裁すればスキャンできるなあというので、NHKラジオ講座のテキストを捨てる前にスキャンしてみることにした。


これをスキャンする。
f:id:nixeneko:20170308230708p:plain


まずカッターマット、カッター、定規を用意し、
f:id:nixeneko:20170308230920p:plain

背から2 mmくらいのところに定規を当てて固定し、カッターで何度もなぞりながら切っていく。
f:id:nixeneko:20170308231055p:plain

背から1 mm程度だと接着している糊だけ落とす感じで、紙は部分的にくっついていて、ばらばらにはならない。2mm切断するとページの大部分がバラバラになるので、2 mm位が適切だろうと思う。


f:id:nixeneko:20170308231545p:plain
糊が残っていて紙同士がくっついている場合があるので、ばらばらになっていることを確認しつつ、くっついているところがあればはがしていく。
特に、表紙の隣のページはしっかりくっついているのではがさないといけない。はがさないでScanSnapに投入した場合、紙送りに失敗する。


f:id:nixeneko:20170308232005p:plain
断裁した本をセットする。S1300iは一度にセットできるのが10枚程度ということになっているが、20枚くらいセットしても大抵はちゃんと紙送りしてくれる。紙の状態が悪いと重送が発生するので気を付けないといけないが。
一度に全部をセットできないので、スキャンが進むにつれて原稿を注ぎ足し注ぎ足ししていくか、あるいは何回かに分けてスキャンしたものをAcrobat Proなどで一枚のPDFに結合する必要がある。


断裁~スキャンにかかる時間は一冊当たり15分ほど。
本格的に自炊するのであれば、2万円ほど上乗せして、スキャン速度も速く一度にセットできる枚数も多い上位機を購入すべきだと思う。カッターで切れるのはこのくらいの厚さが限度だと思うので、厚い本をスキャンするつもりであれば断裁機を買わなければならなさそう。

8mmフィルムの白リーダを買う

8mmフィルム

現像した8mmフィルムの最初についてる白いリーダ部分が映写機の不調なオートローディングに巻き込まれズタズタになってしまったので、代わりの白リーダを探していた。欲しいのはシングル8用であるが、スーパー8用のものも穴の形や幅が同じなので利用できる。

一応、レトロ通販でも扱っているのだが、420円/mとかなり高価である。



情報をいただいたところ、海外のサイトで通販しているらしい。50 ftで5.00 USDとお安い。ただし国際発送はFedEx使うらしく、60 USD程度はかかるっぽかった。これでは明らかにレトロ通販で買う方が安いのでよろしくない。


という訳でeBayで探すことにした。“8mm film leader”などと検索するとそこそこ出てくる。super 8用のものを選ぶ(regular 8…ダブル8用のものは穴の形が違うので使えないので注意する)。
送料も表示されるので、安そうなところを選んで購入したら24 USD、三千円以下で購入することができた。あとは発送され届くのを待つのみ。

クレジットカードで決済しようとしたら“The card you entered cannot be used for this payment. Please enter a different credit or debit card number.”とエラーがでてうまく決済できなかった。調べたらすでにPaypalアカウントに登録しているクレジットカードでは使えないという情報があり、Paypalを使って決済を行ったらうまくいった。あるいは住所の入力ミスかもしれないが(順番が違った)。


eBayで購入したお店は独自のWebショップを持ってて、そっちでも買えるらしい。安いかどうかは確認していないけれど、いろいろな商品がある模様。リンクを貼っておく。
filmforevermpe.com


f:id:nixeneko:20170306224541p:plain
一週間ほどで到着した。配送はUSPSの国際郵便。数個一緒に配送しても送料は変らなそうなので、多めに買っておいて必要な人で分けるとかするといいのかもしれない。

f:id:nixeneko:20170306224819p:plain

好きな形にボケるレンズ

DIY 写真

f:id:nixeneko:20170225235837p:plain
一眼レフカメラのボケの形を様々に変えて遊んでみたいという話です。

はじめに

一眼レフカメラなどの大きな受光面(センサー)をもつカメラでは、ピントの合う範囲*1が狭く、ピントから外れたところは大きくボケます。
写真ではそのボケがしばしば効果的に使われていて、特にポートレートで人物を浮き立たせるためなど多用されます。

このボケですが、絞りの形*2に沿ってボケます。
絞りは、レンズ内をカメラのレンズを通って入ってくる光の量を制御するためのもので、光の通る穴の広さを変えることでこれを実現しています。絞りを「絞って」光の通る穴を狭くすると、それに従ってボケも小さくなります。

さて、ボケというと丸いイメージがあります。絞りの形に沿ってボケるということですが、絞りの形を好きな形にしたら、その形にボケるのでしょうか?
実際に試してみます。

レンズの絞りを取り換えることはできないので、擬似的に穴をあけた黒画用紙をレンズ前面に置くことで光の通り道を制御します。

用意するもの

  • 一眼レフカメラなどセンササイズの大きいカメラ
  • 単焦点レンズなど明るい(開放F値の小さい)レンズ
  • 黒画用紙
  • カッター
  • レンズプロテクターあるいはテープ(固定用)

手順

黒画用紙をレンズ前面にはまるように丸く切り、好きな形の穴を切り抜きます。うまく出ない可能性があるので、あまり穴が端の方まで来ないようにした方が良さそうです。
f:id:nixeneko:20170224011417p:plain


レンズ前面のフィルタを取り付けるところにはめ、レンズプロテクターを上から取り付けて挟んで固定します。これはテープで貼りつけて固定するのでも構いません。
f:id:nixeneko:20170224011639p:plain
完成。

撮影

絞りを開放にして撮影します。


一点で光っているものだと、ピントが外れた時のボケがわかりやすいです。
光沢のある物体のハイライトだとか、イルミネーションの電飾だとか。街灯とかを遠くから撮影してもきれいです。

今の時期イルミネーションもあまりないので、適当に撮影したものを載せます。あまりいい例ではないですが……。
f:id:nixeneko:20170223234407p:plain
ちゃんと背景のあかるい部分が星形にボケてますね。


ケーキの蝋燭を動画に撮ってみました。ピントリングを回してピントを動かしています。


蝋燭の炎は画面上で結構な面積あるので、ボケた結果も縦長でややいびつな形になってますね。


手元にあったガチャガチャのフィギュアを撮ってみました……といってもここで見たいのは繋がってる鎖の方ですが。
f:id:nixeneko:20170224010749p:plain
鎖の部分のハイライトが星形にボケています。面白いじゃない!


適当な夜の町の写真です。
f:id:nixeneko:20170225235837p:plain
やはり夜景を撮ると良いですね。街灯がきれいな形にボケてくれます。

おまけ

ところで、細かい模様でも再現できるのでしょうか。試しにこんなものを作ってみました。
f:id:nixeneko:20170224013338p:plain


撮影テストしてみるとこんな感じになりました。
f:id:nixeneko:20170224013924p:plain
光が小さい点一つのみでかつ画面中央に来るようにうまいこと調整すると、やや滲んでますがこれくらいは出ます。しかし条件が良くないとぼやけたり重なってよく分からない感じになります。


動画です。LEDのライトは割ときれいな形にぼけてくれます。
中央から外れるとすぐ潰れてしまいますが。

まとめ

  • ピントが合ってる面の前後でボケの向きが反転する
    • ピントが合ってる面より後ろ側だと穴をくり抜いた黒画用紙レンズに嵌めた方向にボケて、ピントが合ってる面より手前側だとレンズに嵌めた向きとひっくり返ってボケるようです。
  • 写真の中心はともかく、画面端のほうはボケが一部欠ける
    • くり抜いた紙をレンズ前面にくっつけてるだけなのである程度仕方ない気がします。

参考

実際の世界の一点光がボケて広がる、その広がりを錯乱円 circle of confusion といいます。円なのは絞りが大抵は円やそれに近い形をしてるからでしょうか。
画像処理の流儀 - 焦点深度、被写体深度、絞りとの関係
Circle of confusion - Wikipedia

*1:被写界深度 Depth of Field, DoF、という。

*2:絞りによってつくられる穴の形

PythonでJIS X 0208コードに対応するUnicode値を求める

Python

あるデータセットで、文字情報がJIS X 0208のコードで与えられていたのだが、使い勝手がよくないのでUnicode値に変換しようとした。

やり方

Unicodeコンソーシアムが、JIS X 0208のコードからUnicode値へ変換する変換表を公開している。

今回はこれを使う。ただし、この変換表はobsoleteとなっているので、代りにUnihan Databaseを利用した方が良いのかもしれない。

JIS0208.TXTに曰く、対応表のフォーマットは

#	Format:  Four tab-separated columns
#		 Column #1 is the shift-JIS code (in hex)
#		 Column #2 is the JIS X 0208 code (in hex as 0xXXXX)
#		 Column #3 is the Unicode (in hex as 0xXXXX)
#		 Column #4 the Unicode name (follows a comment sign, '#')

となっているようで、#で始まっている行はコメントとなっているようだ。

コード

"JIS0208.TXT"と同じディレクトリで実行する。

# coding: utf-8

shift_jis = []
jisx0208 = []
unicode = []
with open("JIS0208.TXT", "r") as f:
    for line in f:
        if line[0] == "#":
            pass
        else:
            sjis, jisx, unic, _ = line.strip().split("\t")
            shift_jis.append(int(sjis,16))
            jisx0208.append( int(jisx,16))
            unicode.append(  int(unic,16))

def jis2uni(n):
    return unicode[jisx0208.index(n)]
    
if __name__ == '__main__':
    print("{:x}".format(jis2uni(0x2422)))

jis2uni()関数にJIX X 0208のコードを与えると対応するUnicode値が返ってくるというもの。なおPython 3系なら、Unicode値をchr()で文字(列)に変換できる。