2016/11/21

画像の回転スクリプト

blog などに添付する画像を回転するためのスクリプト。
回転処理は ImageMagickrotate (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 化した。

テールライト
まず交換したのは一番簡単なテールライトのバルブで、 ブレーキライトと兼用のダブル球を使用しておりバブル形状は S25、ソケットは BAY-15Dとなっている。 ZeaL ではナンバー灯を兼用しているので一部分が白色 LED となっている VALENTI の B13-S25WRW-1 を選択した。 この LED バルブは金具に対して内側の発光部が 180 度回転するので、 ナンバー灯用の白色 LED 部分を正しくナンバープレート側に向ける事ができる優れ物。
ヘッドライト
ヘッドライトは一般的な H4 タイプなので選択肢は沢山あったのだが、 数ある製品の中で一番シンプルだと思われる IMPACT IM-LED-008 を選択。
Image: head.jpg

ヘッドライト用LEDバルブ
CREE 社の SMD チップを利用しているので光量には不足がなく、 コントローラなどが本体内部に全て収まっているのでライトケースに簡単に格納でき、 放熱はヒートシンクのみで冷却用のファンもないシンプルな造りが気に入った。
ウィンカー
ウィンカーはシングル球でバルブ形状は S25、ソケットは BA-15S タイプ。 LED に変更する事で減少する消費電力の影響で早くなってしまう点滅は 対応しているウィンカーリレーに交換する事で解消させた。
やっかいなのがメーターパネルのインジケータで、 ZeaL の場合はリレーと並列で繋がっている (ウィンカーの点灯とインジケータの点灯が交互なタイプ)ので、 そのままではウィンカーが正しく点滅しない(消灯時にも点灯してしまう)ために インジケータの配線を切断してダイオードで整流してなぎ直す必要があったので作業が少し面倒だった。
この配線は整流用のダイオードの入手が面倒だったので、 POSH 製のインジケータスタビライザ 090010-IS を利用した。
これらの問題はウィンカーと並列に抵抗を繋いでも解決可能らしいのだが、 そもそも省電力のためにバルブを LED に変更しているので 抵抗を繋いで消費電力を増やすのは全く無意味になってしまうのでリレーやインジケータの配線を変更した。

これで随分と省電力化が出来た様で、 グリップヒータ使用時でもヘッドライトやウィンカーの点滅が安定している。

2016/11/19

サスペンション交換

ZeaL のサスペンションは元々ソフトな設定なのだが、 走行距離と経年変化でヘタってしまい高速コーナーで全く踏ん張りがきかずにフラついていたので交換。
マイナー車ゆえに ZeaL 用などという設定はまず見かけないので、 エンドアイの内径や全長を参考に SR400 や XJR400 向けの製品から選択する。 ZeaL の場合はスペースの都合でリザーバタンク式は装着できないので DAYTONA の 24149 を選択。

Image: sus1.jpg

交換したリアサス

左側はともかくマフラーのある右側は隙間から手を入れて交換する事も可能なのだが、 折角なのでマフラーを外してついでに少しだけ綺麗に磨いてみた。

Image: sus2.jpg

交換したサスペンションは安価なのだが伸び側の減衰力が 11 段階で調整できる。
新品のサスペンションは動作もしっかりしていて、 高速コーナーで荷重がかかってもしっかりと支えてくれている感じがして安心。

2016/11/18

グリップヒータ

行きつけのバイク屋さんで「凄く良いよ」と聞いたのでグリップヒータを導入してみた。
装着したのはKIJIMA の GH07という製品で、 スイッチが左グリップ部と一体なので邪魔にならず見た目もスッキリしていて良い感じ。
ちなみに古いバイクなので念のためにリレーを利用してバッテリーから配線を直結した。

Image: grip.jpg

グリップヒータ

温度は 5段階の調節が可能で現在設定されている状態が LED の色で判断できる。
最近は寒い日が続いているのでしっかり稼働させているのだが、 5段階の3番目程度で十分暖かく、この時期でも夏用のグローブで問題ないので、 十分実用的だろう。
電圧がある程度以下になると自動で電源が切れるそうなので古いバイクでも安心…かな?
最近は更にハンドルカバーも装着したのでコタツ状態でぬくぬく(笑

2016/11/17

ラジアルポンプマスターシリンダー

ZeaL にもラジアルポンプマスターシリンダーを装着した。
装着したのは自分の中では定番の DAYTONA から発売されている NISSIN 製のマスターシリンダ で、 費用対効果で考えると十分に納得できる価格の製品だと思う。
純正のマスターシリンダは 14mm のタイプなので Ø 17の製品を選択。 今回は他にも色々と作業があったので行きつけのバイク屋さんに作業をお願いした。

Image: break2.jpg

ブレーキレバーを握る方向とマスターシリンダーを押す方向が同じなので、 純正のマスターシリンダに比べると遙かにコントロールしやすい。 更にブレーキレバーの遊びの調整幅が純正品よりも格段に大きいので、 手の小さな自分でも適切な握り幅に調整できるのも素晴らしい。
例によって別体式のマスターシリンダーは物々しい感じがして 見た目がちょっと派手なのだがコレはしょうがないか…

Image: break1.jpg

マスターシリンダーのステーはこの後で上下を逆にしました

同時にブレーキラインも SWAGE-LINE のステンレスメッシュ製に交換した。 ホースエンドはステンレスを、ホース本体はなるべく目立たない様に ブラックスモークホースをそれぞれ選択したので一見すると純正品に見えなくもない。
これでフロントブレーキの操作性と信頼性が更に改善されたかな。

2016/11/16

車載工具

純正の車載工具が搭載されていなかったので自分で選んだ工具を車載工具替わりに搭載した。
自宅にはそれなりに工具があるため、車載工具は基本的に出先での緊急作業のみなので、 今までの経験などから必要最低限の工具を揃えた。

Image: tools.jpg

車載工具

搭載した工具は写真左から以下の通り。

  • 8 mm コンビネーションレンチ
  • 10 mm コンビネーションレンチ
  • 12 mm コンビネーションレンチ
  • 14 mm コンビネーションレンチ
  • ドライバ (Philips / flat 交換式)
  • プライヤ
  • バイスプライヤ
  • 6角レンチセット
  • モンキーレンチ
  • 16 x 21 mm プラグレンチ
これらの工具を手持ちのナイロン製巾着に入れて、 タンデムシート下のスペースに収納してある。
これだけ有れば出先での緊急作業は問題ないだろうと思われる。

レンチはスパナにすれば半分の本数にできたのだが、 ボルトを回すのはメガネタイプの方が安心できるのでコンビネーションにした。
古いバイクなのでネジ山がなめたりするのも嫌だったので、 多少高価なのだが信頼と安心の KTC で揃えた(6角レンチセットは除く)。
使わないに超した事はないがいざという時のためにも 「備えあれば憂い無し」の心がけで。

2016/11/14

YAHAMA FZX250 ZeaL

先日より色々な縁と偶然が重なり久々にバイクに乗っている。

Image: ZeaL1.jpg

YAMAHA FZX250 ZeaL

規制など様々な理由で今は絶滅してしまった 4気筒の 250cc で、 YAMAHA らしい流麗なデザインと FZR250R ゆずりの 高性能な GENESIS エンジンを搭載しており、 街中から多少のワインディングまで今でも十分楽しめるバイクだ。

フレーム番号から察すると1992年の製造なので既に25年以上経過しているのだが、 そうとは思えないほどの綺麗な状態で大切に保管されていた事が判る。

Image: ZeaL2.jpg

非常にコンパクトな車体

良く知られている様にジャンプするイルカをモチーフにしたデザインは 今見ても古くささを感じさせない素晴らしいデザインなのだが、 発売当時はもっと高性能なバイクが求められていたのかそれほど人気は出なかった。
低重心で足つき製も良くそれほど重くもないので取り回しも楽(しかもそこそこ速い)、 そして何より美しいデザインというとても素晴らしバイクなので、 出来るだけ長く乗り続けたい。

Image: ZeaL3.jpg

特長的な右2本出のマフラー

2016/11/13

燻製作り

以前から燻製を作りたいと思っていたのだが、 近所のホームセンタで段ボール製の簡易的な燻煙キットを見つけたので 買ってきて早速燻製造りをしてみた。

購入したのは SOTO の燻家(スモークハウス)という、 段ボール製のスモーカーに金網やスモークチップなど必要な物が全て同梱されており、 具材さえ揃えればすぐに燻製造りが楽しめるという優れもの。

初心者(というか産まれて初めて)なので、まずは簡単なチーズやソーセージ、はんぺんから。

Image: smoke1.jpg

材料を並べて

付属のチップをアルミのトレーに乗せてバーナで着火すれば準備完了。

Image: smoke2.jpg

チップに着火

本体は段ボール製で簡単に組み立てられるので、 開梱してからものの5分も経たないうちにスモーク開始。
付属のチップは大体1時間半位は持続する様で、 暫く待っているとほどよく温燻が完成する。

Image: smoke3.jpg

燻煙中
とても美味しいスモークチーズやスモークソーセージが完成したのだが… なんと写真を撮り忘れて食べ尽くしてしまうという大失態が……

初めてでも簡単に美味しく出来たので次は別な食材に挑戦しようと画策中。
というか熱燻もできる様なちゃんとしたスモーカーに物欲が……

2016/11/10

Coleman Exponent Apex II

Exponent Fyrestorm同様 Coleman 製の分離式 Dual Fuel Stove。

Image: apex1.jpg

Apex II Stove
Fyrestorm とは異なり日本で正式に発売されたモデルなのでボトルのラベルが日本語になっている。
こちらも一般的なホワイトガソリンは勿論、自動車用の無鉛ガソリンが利用できる。

燃料タンクとバーナー部を連結するホースの造りはしっかりしている様に見える。
一体式のストーブに比べると本体が低いのでその分だけ安定感も高い。 また、脚のうち1本には角度を調整するためのボルトが装着されているので、 斜めの地面や不安定な地面でも水平に設置できる様に工夫されている。

Image: apex2.jpg

ボルトで調整が可能

一体式のストーブに比べると若干予熱的な操作が必要なのだが、 基本的には他の Coleman 製ストーブ同様簡単に扱える様になっている。
更に火力調整のためのバルブが別になっているので火力調整が容易なので料理の幅も広がる(勿論ご飯も美味しく炊ける)。
さらに専用のケース(バーナー部を格納できる。ボトルはそのまま携行する感じ?)や、 ゴムリングやスプリングなどの消耗品がセットになった「サービスパーツ」まで初めから同梱されている。

Image: apex3.jpg

一式

本体がコンパクトな事、ボトルが燃料の携行容器になる事、 本体が熱源から遠いのでオーブンなどを使った高温の調理でも割と安心な事など 別体式のメリットは結構あるのでこれからのキャンプで大活躍しそう。

Image: apex4.jpg

Apex II Stove


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.