2016/11/21
画像の回転スクリプト
blog などに添付する画像を回転するためのスクリプト。
回転処理は ImageMagick の rotate (1) コマンドで行うのだが、
一部のブラウザでは exif 情報に含まれる Orientation の値で画像を回転して表示するので、
回転した後で exif の Orientation の情報を修正している。
exif 情報の取得と設定は Perl モジュール Image-ExifTool を利用している。
getor: exif 情報から Orientation を取得する。
1#!/usr/bin/perl -w 2use Image::ExifTool ':Public'; 3my $file = shift or die "Please specify filename"; 4 5$exifTool = new Image::ExifTool; 6$exifTool->ExtractInfo($file); 7 8print $exifTool->GetValue('Orientation') . "\n";
setor: Orientation に水平 Horizontal (normal) を設定する。
1#!/usr/bin/perl -w 2use Image::ExifTool ':Public'; 3my $file = shift or die "Please specify filename"; 4 5$exifTool = new Image::ExifTool; 6$exifTool->SetNewValue('Orientation', 'Horizontal (normal)'); 7$exifTool->WriteInfo($file);
引数で指定されたファイルを回転して Orientation を設定する。
1#!/bin/sh 2for i in $* 3do 4 n=$(getor $i | awk '/^Rotate/{ print $2 }') 5 if [ ${n:-0} -gt 0 ] 6 then 7 convert -rotate $n $i /tmp/_$$.jpg && 8 mv /tmp/_$$.jpg $i 9 setor $i 10 fi 11done
2016/11/22 追記
以前作成した Exif 情報から GPS の緯度/経度情報を削除する を元に 全てシェルスクリプトで画像を回転するスクリプトを作ってみた。dd (1) を利用してバイナリファイルの入出力を行い、 Exif 情報の取得と更新を実施している。
1#!/bin/sh 2# 画像を回転し Exif 情報の 'Orientation' を設定する 3# 4 5# 6# Endian を考慮して 2 バイト数字を取得する 7# 8# $1: ファイル 9# $2: オフセット 10# 11get2Byte() 12{ 13 14 dd ${conv} if="${1}" bs=1 skip=$((${skip} + ${2})) count=2 2> /dev/null | od -d | awk '/^0000000/{ print $2 }' 15 16} 17 18# 19# 任意の長さの文字列を取得する 20# 21# $1: ファイル 22# $2: オフセット 23# $3: 文字列長 24# 25getString() 26{ 27 28 dd if="${1}" bs=1 skip=$((${skip} + ${2})) count=${3} 2> /dev/null 29 30} 31 32# 33# 0th IFD データの解析処理 34# 35# $1: ファイル 36# $2: 0th IFD のタグ数 37# 38ifd() 39{ 40 41 local i offset 42 43 i=0 44 45 while [ ${i} -lt ${2} ] 46 do 47 # 0th IFD のタグ情報 48 offset=$((${3} + 22 + (${i} * 12))) 49 # Orientation の場合はオフセットを表示して終了 50 if [ $(get2Byte "${1}" ${offset}) -eq 274 ] 51 then 52 echo ${offset} 53 break 54 fi 55 i=$((i + 1)) 56 done 57 58} 59 60# 61# Orientation 情報の取得 62# 63# $1: ファイル 64# $2: Orientation IFD のオフセット 65# 66getOrient() 67{ 68 69 echo $(get2Byte "${1}" $((${2} + 8))) 70 71} 72 73# 74# Orientation 情報のセット 75# 76# $1: ファイル 77# $2: Orientation IFD のオフセット 78# 79setOrient() 80{ 81 82 echo -ne "\00\01" | dd conv=notrunc of="${1}" bs=1 seek=$((${2} + 8 + ${skip})) 2> /dev/null 83 84} 85 86# 87# ファイルフォーマットから skip するバイト数を取得 88# 89# $1: ファイル 90# 91getSkip() 92{ 93 94 if [ "$(getString "${1}" 6 4)" = "Exif" ] 95 then 96 # Exif 情報格納 97 echo 0 98 elif [ "$(getString "${1}" 24 4)" = "Exif" ] 99 then 100 # JFIF 情報格納 101 echo 18 102 else 103 # Exif 情報なし 104 echo -1 105 fi 106 107} 108 109# 110# convert(1) のオプション取得 111# 112# $1: ファイル 113# 114get_conv() 115{ 116 117 offset=$(ifd "${1}" $(get2Byte "${1}" 20)) 118 if [ ${offset:-0} -gt 0 ] 119 then 120 case $(getOrient "${1}" ${offset}) in 121 2 ) opt="-flip";; # 上下反転 122 3 ) opt="-rotate 180";; # 180度回転 123 4 ) opt="-flop";; # 左右反転 124 5 ) opt="-flop -rotate 90";; # 上下反転+270度回転 125 6 ) opt="-rotate 270";; # 90度回転 126 7 ) opt="-flip rotate 270";; # 上下反転+90度回転 127 8 ) opt="-rotate 90";; # 270度回転 128 esac 129 echo ${opt} 130 fi 131 132} 133 134# メイン処理 135for i in $* 136do 137 skip=$(getSkip "${1}") 138 if [ ${skip} -ge 0 ] 139 then 140 # Endian 141 test $(getString "${1}" 12 2) = "MM" && conv="conv=swab" 142 opt=$(get_conv $i) 143 if [ -n "${opt}" ] 144 then 145 # 画像を回転 146 convert ${opt} "${i}" /tmp/_$$.jpg && mv /tmp/_$$.jpg "${i}" 147 # conviert(1) により TFIF 情報が付加される 148 skip=$(getSkip "${i}") 149 setOrient "${i}" $(ifd "${i}" $(get2Byte "${i}" 20)) 150 fi 151 fi 152done
2016/11/23 追記
convert (1) だけで出来る事が判明
$ convert -auto-orient 入力ファイル.jpg 出力ファイル.jpg
更に identify (1) を利用すると Exif 情報も取得できるので
ImageMagic が導入されている場合は以下のスクリプトで完結する。
1#!/bin/sh 2for i in $* 3do 4 test "`identify -verbose $i | awk '/exif:Orientation/{ print $2 }'`" != 1 && 5 convert -auto-orient $i /tmp/_$$.jpg && 6 mv /tmp/_$$.jpg $i 7done
2016/11/20
バルブの LED 化
グリップヒータを装着した事で消費電力が一挙に増加してしまったので、
少しでもバッテリの負荷を軽減しようと各バルブを LED 化した。
CREE 社の SMD チップを利用しているので光量には不足がなく、
コントローラなどが本体内部に全て収まっているのでライトケースに簡単に格納でき、
放熱はヒートシンクのみで冷却用のファンもないシンプルな造りが気に入った。
やっかいなのがメーターパネルのインジケータで、
ZeaL の場合はリレーと並列で繋がっている
(ウィンカーの点灯とインジケータの点灯が交互なタイプ)ので、
そのままではウィンカーが正しく点滅しない(消灯時にも点灯してしまう)ために
インジケータの配線を切断してダイオードで整流してなぎ直す必要があったので作業が少し面倒だった。
この配線は整流用のダイオードの入手が面倒だったので、
POSH 製のインジケータスタビライザ 090010-IS を利用した。
これらの問題はウィンカーと並列に抵抗を繋いでも解決可能らしいのだが、
そもそも省電力のためにバルブを LED に変更しているので
抵抗を繋いで消費電力を増やすのは全く無意味になってしまうのでリレーやインジケータの配線を変更した。
これで随分と省電力化が出来た様で、
グリップヒータ使用時でもヘッドライトやウィンカーの点滅が安定している。
2016/11/19
サスペンション交換
ZeaL のサスペンションは元々ソフトな設定なのだが、
走行距離と経年変化でヘタってしまい高速コーナーで全く踏ん張りがきかずにフラついていたので交換。
マイナー車ゆえに ZeaL 用などという設定はまず見かけないので、
エンドアイの内径や全長を参考に SR400 や XJR400 向けの製品から選択する。
ZeaL の場合はスペースの都合でリザーバタンク式は装着できないので
DAYTONA の 24149 を選択。
左側はともかくマフラーのある右側は隙間から手を入れて交換する事も可能なのだが、
折角なのでマフラーを外してついでに少しだけ綺麗に磨いてみた。
交換したサスペンションは安価なのだが伸び側の減衰力が 11 段階で調整できる。
新品のサスペンションは動作もしっかりしていて、
高速コーナーで荷重がかかってもしっかりと支えてくれている感じがして安心。
2016/11/18
グリップヒータ
行きつけのバイク屋さんで「凄く良いよ」と聞いたのでグリップヒータを導入してみた。
装着したのはKIJIMA の GH07という製品で、
スイッチが左グリップ部と一体なので邪魔にならず見た目もスッキリしていて良い感じ。
ちなみに古いバイクなので念のためにリレーを利用してバッテリーから配線を直結した。
温度は 5段階の調節が可能で現在設定されている状態が LED の色で判断できる。
最近は寒い日が続いているのでしっかり稼働させているのだが、
5段階の3番目程度で十分暖かく、この時期でも夏用のグローブで問題ないので、
十分実用的だろう。
電圧がある程度以下になると自動で電源が切れるそうなので古いバイクでも安心…かな?
最近は更にハンドルカバーも装着したのでコタツ状態でぬくぬく(笑
2016/11/17
ラジアルポンプマスターシリンダー
ZeaL にもラジアルポンプマスターシリンダーを装着した。
装着したのは自分の中では定番の DAYTONA から発売されている NISSIN 製のマスターシリンダ で、
費用対効果で考えると十分に納得できる価格の製品だと思う。
純正のマスターシリンダは 14mm のタイプなので Ø 17の製品を選択。
今回は他にも色々と作業があったので行きつけのバイク屋さんに作業をお願いした。
ブレーキレバーを握る方向とマスターシリンダーを押す方向が同じなので、
純正のマスターシリンダに比べると遙かにコントロールしやすい。
更にブレーキレバーの遊びの調整幅が純正品よりも格段に大きいので、
手の小さな自分でも適切な握り幅に調整できるのも素晴らしい。
例によって別体式のマスターシリンダーは物々しい感じがして
見た目がちょっと派手なのだがコレはしょうがないか…
同時にブレーキラインも SWAGE-LINE のステンレスメッシュ製に交換した。
ホースエンドはステンレスを、ホース本体はなるべく目立たない様に
ブラックスモークホースをそれぞれ選択したので一見すると純正品に見えなくもない。
これでフロントブレーキの操作性と信頼性が更に改善されたかな。
2016/11/16
車載工具
純正の車載工具が搭載されていなかったので自分で選んだ工具を車載工具替わりに搭載した。
自宅にはそれなりに工具があるため、車載工具は基本的に出先での緊急作業のみなので、
今までの経験などから必要最低限の工具を揃えた。
搭載した工具は写真左から以下の通り。
- 8 mm コンビネーションレンチ
- 10 mm コンビネーションレンチ
- 12 mm コンビネーションレンチ
- 14 mm コンビネーションレンチ
- ドライバ (Philips / flat 交換式)
- プライヤ
- バイスプライヤ
- 6角レンチセット
- モンキーレンチ
- 16 x 21 mm プラグレンチ
これだけ有れば出先での緊急作業は問題ないだろうと思われる。
レンチはスパナにすれば半分の本数にできたのだが、
ボルトを回すのはメガネタイプの方が安心できるのでコンビネーションにした。
古いバイクなのでネジ山がなめたりするのも嫌だったので、
多少高価なのだが信頼と安心の KTC で揃えた(6角レンチセットは除く)。
使わないに超した事はないがいざという時のためにも
「備えあれば憂い無し」の心がけで。
2016/11/14
YAHAMA FZX250 ZeaL
先日より色々な縁と偶然が重なり久々にバイクに乗っている。
規制など様々な理由で今は絶滅してしまった 4気筒の 250cc で、 YAMAHA らしい流麗なデザインと FZR250R ゆずりの 高性能な GENESIS エンジンを搭載しており、 街中から多少のワインディングまで今でも十分楽しめるバイクだ。
フレーム番号から察すると1992年の製造なので既に25年以上経過しているのだが、
そうとは思えないほどの綺麗な状態で大切に保管されていた事が判る。
良く知られている様にジャンプするイルカをモチーフにしたデザインは
今見ても古くささを感じさせない素晴らしいデザインなのだが、
発売当時はもっと高性能なバイクが求められていたのかそれほど人気は出なかった。
低重心で足つき製も良くそれほど重くもないので取り回しも楽(しかもそこそこ速い)、
そして何より美しいデザインというとても素晴らしバイクなので、
出来るだけ長く乗り続けたい。
2016/11/13
燻製作り
以前から燻製を作りたいと思っていたのだが、 近所のホームセンタで段ボール製の簡易的な燻煙キットを見つけたので 買ってきて早速燻製造りをしてみた。
購入したのは SOTO の燻家(スモークハウス)という、
段ボール製のスモーカーに金網やスモークチップなど必要な物が全て同梱されており、
具材さえ揃えればすぐに燻製造りが楽しめるという優れもの。
初心者(というか産まれて初めて)なので、まずは簡単なチーズやソーセージ、はんぺんから。
付属のチップをアルミのトレーに乗せてバーナで着火すれば準備完了。
本体は段ボール製で簡単に組み立てられるので、
開梱してからものの5分も経たないうちにスモーク開始。
付属のチップは大体1時間半位は持続する様で、
暫く待っているとほどよく温燻が完成する。
とても美味しいスモークチーズやスモークソーセージが完成したのだが… なんと写真を撮り忘れて食べ尽くしてしまうという大失態が……
初めてでも簡単に美味しく出来たので次は別な食材に挑戦しようと画策中。
というか熱燻もできる様なちゃんとしたスモーカーに物欲が……
2016/11/10
Coleman Exponent Apex II
Exponent Fyrestorm同様
Coleman 製の分離式 Dual Fuel Stove。
Fyrestorm とは異なり日本で正式に発売されたモデルなのでボトルのラベルが日本語になっている。
こちらも一般的なホワイトガソリンは勿論、自動車用の無鉛ガソリンが利用できる。
燃料タンクとバーナー部を連結するホースの造りはしっかりしている様に見える。
一体式のストーブに比べると本体が低いのでその分だけ安定感も高い。
また、脚のうち1本には角度を調整するためのボルトが装着されているので、
斜めの地面や不安定な地面でも水平に設置できる様に工夫されている。
一体式のストーブに比べると若干予熱的な操作が必要なのだが、
基本的には他の Coleman 製ストーブ同様簡単に扱える様になっている。
更に火力調整のためのバルブが別になっているので火力調整が容易なので料理の幅も広がる(勿論ご飯も美味しく炊ける)。
さらに専用のケース(バーナー部を格納できる。ボトルはそのまま携行する感じ?)や、
ゴムリングやスプリングなどの消耗品がセットになった「サービスパーツ」まで初めから同梱されている。
本体がコンパクトな事、ボトルが燃料の携行容器になる事、 本体が熱源から遠いのでオーブンなどを使った高温の調理でも割と安心な事など 別体式のメリットは結構あるのでこれからのキャンプで大活躍しそう。