2013/11/23

Exif 情報から GPS の緯度/経度情報を削除する

例によって こちら のブログをネタに 他人の褌で相撲を取る記事です。
元記事では Exif 情報を操作する時に、 バイナリを直接操作するのではなく od (1) を利用してバイナリをテキスト型式に変換し、 テキスト操作した後で再度バイナリ型式に戻すという 正統的な手法でのアプローチをしています。
しかし dd (1) を利用すると シェルスクリプトからバイナリを操作できるので、 バイナリ型式の画像を直接操作してしまうというアプローチを取ってみます。

画像ファイルに格納されている Exif 情報を簡単に解析して GPS 情報を格納している領域 (GPSInfoIFD) から 緯度/経度情報だけをゼロに置換する処理となっています。

流石にシェル芸では無理なのでシェルスクリプトです。

  1#!/bin/sh
  2
  3#
  4# Endian を考慮して 4 バイト数字を取得する
  5#   一度 od(1) で 16 進数に変換しバイト並びを修正した後に 10 進数に変換する
  6#
  7#   $1: ファイル
  8#   $2: オフセット
  9#
 10get4Byte()
 11{
 12
 13    if [ ${endian} = "MM" ]
 14    then
 15        printf "%d" `dd if="${1}" bs=1 skip=${2} count=4 2> /dev/null | od -x |
 16            sed -n "s/^0000000 *\(..\)\(..\)[   ]*\(..\)\(..\)/0x\2\1\4\3/p"`
 17    else
 18        printf "%d" `dd if="${1}" bs=1 skip=${2} count=4 2> /dev/null | od -x |
 19            sed -n "s/^0000000 *\(..\)\(..\)[   ]*\(..\)\(..\)/0x\1\2\3\4/p"`
 20    fi
 21        
 22
 23}
 24
 25#
 26# Endian を考慮して 2 バイト数字を取得する
 27#   一度 od(1) で 16 進数に変換しバイト並びを修正した後に 10 進数に変換する
 28#
 29#   $1: ファイル
 30#   $2: オフセット
 31#
 32get2Byte()
 33{
 34
 35    if [ ${endian} = "MM" ]
 36    then
 37        printf "%d" `dd if="${1}" bs=1 skip=${2} count=2 2> /dev/null | od -x |
 38            sed -n "s/^0000000 *\(..\)\(..\)/0x\2\1/p"`
 39    else
 40        printf "%d" `dd if="${1}" bs=1 skip=${2} count=2 2> /dev/null | od -x |
 41            sed -n "s/^0000000 *\(..\)\(..\)/0x\1\2/p"`
 42    fi
 43
 44}
 45
 46#
 47# 任意の長さの文字列を取得する
 48#
 49#   $1: ファイル
 50#   $2: オフセット
 51#   $3: 文字列長
 52#
 53getString()
 54{
 55
 56    dd if="${1}" bs=1 skip=${2} count=${3} 2> /dev/null
 57
 58}
 59
 60#
 61# GPSInfoIFD の解析を行い緯度/経度情報をクリアする
 62#
 63#   $1: ファイル
 64#   $2: GPSInfoIFD のタグ数
 65#   $3: GPSInfoIFD のオフセット位置
 66#
 67gps()
 68{
 69
 70    local   i   j   offset  tag val
 71
 72    i=0
 73
 74    while [ ${i} -lt ${2} ]
 75    do
 76        # GPSInfoIFD のタグ情報
 77        offset=`expr ${3} + 14 + \( ${i} \* 12 \)`
 78        tag=`get2Byte "${1}" ${offset}`
 79        # タグ種類
 80        #   2: 緯度
 81        #   4: 経度
 82        if [ ${tag} -eq 2 -o ${tag} -eq 4 ]
 83        then
 84            # データの数とデータのオフセットを取得
 85            # 緯度/経度情報は値のタイプに RATIONAL(8バイト長) が指定されている
 86            num=`get4Byte "${1}" \`expr ${offset} + 4\``
 87            val=`get4Byte "${1}" \`expr ${offset} + 8\``
 88
 89            # 情報を削除するためにオフセットから 8 * データの数をゼロクリア
 90            dd if=/dev/zero of="${1}" bs=1 conv=notrunc \
 91                seek=`expr ${val} + 12` count=`expr ${num} \* 8` 2> /dev/null
 92        fi
 93        i=`expr $i + 1`
 94    done
 95
 96}
 97
 98#
 99# 0th IFD データの解析処理
100#
101#   $1: ファイル
102#   $2: 0th IFD のタグ数
103#
104ifd()
105{
106
107    local   i   offset  count   position
108
109    i=0
110
111    while [ ${i} -lt ${2} ]
112    do
113        # 0th IFD のタグ情報
114        offset=`expr 22 + \( ${i} \* 12 \)`
115        # GPSInfoIFDPointer の場合はオフセットとタグ数を取得
116        if [ `get2Byte "${1}" ${offset}` -eq 34853 ]
117        then
118            position=`get4Byte "${1}" \`expr ${offset} + 8\``
119            count=`get2Byte "${1}" \`expr ${position} + 12\``
120
121            gps "${1}" ${count} ${position}
122        fi
123        i=`expr $i + 1`
124    done
125
126}
127
128# 処理開始
129if [ "`getString "${1}" 6 4`" = "Exif" ]
130then
131    endian=`getString "${1}" 12 2`
132
133    ifd "${1}" `get2Byte "${1}" 20`
134fi
    

Image: before.jpg

処理前
Image: after.jpg

処理後
GPS 情報が削除されており緯度/経度がそれぞれゼロになっています。

2013/11/11

grep -o

少々前の話ではあるが、某ブログ にて grep -o について言及する記事が出ていた。
非常に便利そうな機能ではあるのだが、 POSIX (IEEE Std 1003.1, 2013 Edition) 準拠ではなく独自拡張の機能の様なので POSIX の範囲での実現方法を考えてみた。

例えば

$ grep -o 'href="[^"]*"'
    
$ sed -n 's/.*\(href="[^"]*"\).*/\1/p'
    
で代用可能なので、
$ cat << EOF | sed -n 's/.*\(href="[^"]*"\).*/\1/p'
<!DOCTYPE html>
<html>
    <body>
        <a href="http://aho.aho" target="_blank">あほ</a>
        <img src="aho.jpg" alt="aho">エロい画像</a>
    </body>
</html>
EOF
href="http://aho.aho"
    
という結果が得られる。
素晴らしい! POSIX 準拠なコマンドで POSIX 非準拠をぶち破ったぞ!
論破! 論破! 論破!

ただし grep (1) の -E オプションは POSIX に準拠しているが、 sed (1) の -E オプションは POSIX に定義されていないので、
$ grep -o -E '(src|href)="[^"]*"'
    
には対応できない。
FreeBSD の sed (1) など -E オプションが利用できれば
$ sed -n -E 's/.*((src|href)="[^"]*").*/\1/p'
    
とする事で対応できるのだが、
$ cat << EOF | sed -n -E 's/.*((src|href)="[^"]*").*/\1/p'
<!DOCTYPE html>
<html>
    <body>
        <a href="http://aho.aho" target="_blank">あほ</a>
        <img src="aho.jpg" alt="aho">エロい画像</a>
    </body>
</html>
EOF
href="http://aho.aho"
src="aho.jpg"
    
POSIX の範疇を逸脱した時点で grep -o を使えば良いとなってしまう。

残念っ!

2013/11/23 追記

頑張る必要は全くありません(笑)
普段は GNU の便利なオプションも使っていますし、 POSIX 準拠していないコマンドやオプションも使ってます。
純粋に楽しいからやってるだけです。

2013/10/30

Happy, so happy!


Happy Birthday to my sweet heart!
You always make me happy, Thank you for your love. Sweets are forever!

2013/10/02

国別フィルタの自動生成ツール

bsdhack.org ドメインは FreeBSD でサーバを構築しているのだが、 特定の国からのアタックや迷惑メイルが非常に多いので ipfw (8) によるフィルタリングを利用して 指定した国からのパケットを拒否する設定を自動生成するツールを作成した。
APNIC から IPアドレスの割当リストを取得して、 IPアドレスを CIDR 型式に修正した上で ipfw (8) のコマンドラインパラメタを自動生成している。
スクリプトは FreeBSD の ipfw (8) 向けだが、 出力部分を適宜修正する事で Linux の iptables (8) 向けの 設定も出力可能だと思う。

  1#!/usr/bin/perl
  2use Socket;
  3
  4# IP アドレス割当リスト取得 URL
  5$url = "http://ftp.apnic.net/stats/apnic/delegated-apnic-latest";
  6
  7# FreeBSD の ipfw (8) のルール番号
  8if(@ARGV < 1){
  9    $rule = 2000;
 10}
 11else{
 12    $rule = $ARGV[0];
 13}
 14
 15# 拒否対象の国コード
 16@country = ('KR', 'CN');
 17
 18foreach $i (@country){
 19    $country{$i} = 1;
 20}
 21
 22if(open(IN, "fetch -q -o - $url|")){
 23    # 拒否対象の国の場合は IP アドレスを保存
 24    while(<IN>){
 25        if(/^apnic\|(..)\|ipv4\|(\d+.\d+.\d+.\d)\|(\d+)/){
 26            if($country{$1}){
 27                $table{inet_aton($2)} = $3;
 28            }
 29        }
 30    }
 31    close(IN);
 32
 33    # 取得した IP 割当リストから開始アドレスと個数を取得
 34    foreach $net (sort keys %table){
 35        $addr = unpack('N', $net);
 36        $num = $table{$net};
 37        while($num == $num[0] && ($addr ^ $addr[0]) == $num){
 38            shift @addr;
 39            shift @num;
 40            $addr &= ~$num;
 41            $num <<= 1;
 42        }
 43        unshift(@addr, $addr);
 44        unshift(@num, $num);
 45    }
 46
 47    # IP アドレスと個数を CIDR 型式に変換して出力
 48    while (@addr){
 49        for($num = pop(@num), $mask = 32; $num > 1; $num >>= 1, $mask--){}
 50        $filt = inet_ntoa(pack('N', pop(@addr))) . "/$mask";
 51        # FreeBSD の ipfw(8) 向け出力
 52        print "\${fwcmd} add $rule deny ip from $filt to any in recv \${wan}\n";
 53        # Linux の iptables(8) 向け出力
 54        # print "\${iptables} -A INPUT -s $filt -j DROP\n";
 55        $rule++;
 56    }
 57}
 58
 590;
    

FreeBSD の場合は WAN 側のインタフェイス名が '${wan}' 変数に、 iptables コマンドの実行ファイル名が '${ipfw}' 変数に それぞれ格納されている事を前提としたスクリプトになっているので、 利用する際は適宜変更しながら使って下さい。

2013/09/18

main 関数の書き方

こちらの記事に触発されて、 C で同じお題のプログラム (echo (1) のサブセット)を書いてみた。

main には殆ど処理を記述せずに パラメタ解析や割り込みなどの初期設定のみをしてから、 実際のメイン処理(この場合は echo)を実行するというスタンスは同じです。
ただし、今回の例で言えば getopt(3) を利用して オプション解析を済ませた(実際に echo 出力する)パラメタ群のループは main 側で行う方が好きかな。

  1#include    <stdio.h>
  2#include    <unistd.h>
  3
  4void    echo(const char *p, int nonl)
  5{
  6
  7    /*
  8     * ここは以下の様にすると printf(3)、putchar(3) の呼び出しを
  9     * printf(3) の呼び出しのみに変更できソースもスッキリする。
 10     * 1 文字の出力を '%s' で変換する無駄が微妙に気になるのだが、
 11     * どちらかと言えば改行を出力する事の方が多いと思うので
 12     * putchar(3) の呼び出しがない方が良いのか
 13
 14     printf("%s%s", p, nonl ? "" : "\n");
 15
 16     */
 17
 18    printf("%s", p);
 19    if(!nonl)
 20        putchar('\n');
 21
 22}
 23
 24int     main(int argc, char *argv[])
 25{
 26
 27    int     i,
 28            nonl = 0;
 29
 30    while((i = getopt(argc, argv, "n")) != EOF){
 31        switch(i){
 32            case 'n':
 33                nonl = 1;
 34                break;
 35
 36            default:
 37                break;
 38        }
 39    }
 40
 41    for(i=optind; i<argc; i++)
 42        echo(argv[i], nonl);
 43
 44    exit(0);
 45
 46}
    

2013/08/02

シェルスクリプトでループ

シェルスクリプトでループ処理をする場合、 最も多用するのは while だと思う。
良く見かけるのは次の様な書き方だろう。

    :
while true
do
    処理
    if 条件
    then
        break
    fi
done
    :
    
勿論この書き方でも問題なく動作するが、 条件がコマンドの戻り値の場合は以下の方が簡潔に記述できる。
コマンドの戻り値が 0 (正常終了の場合) ループを続けたい場合。
    :
while コマンド
do
    処理
done
    :
    
コマンドの戻り値が 0 以外(正常終了以外の場合) ループを続けるのであれば while の替わりに until が利用できる。
例えば再起動中のリモートサーバに ssh (1) 接続したい場合、 以下の方法で繰り返し接続を試行する事ができる。
until ssh -o 'ConnectTimeout 5' リモートサーバ
do
    sleep 10
done
    
ssh (1) が成功するとリモートサーバから exit した時点で until の条件が真になるのでループを抜ける事ができる。

2013/07/31

MySQL データベースを Amazon S3 にバックアップするスクリプト

自宅サーバで運用している MySQL データベースのデータを Amazon S3 にバックアップするためのスクリプトを作成したので公開。

今回作成したスクリプトでは、 ローカルディレクトリに YYYYMMDD 型式で 7 世代分のデータをフルダンプし、 毎週日曜日の深夜に Amason S3 に当日分のバックアップを転送している。
mysqldump で取得したバックアップデータに VIEW 情報が含まれていると データベースのレストア時にエラーが発生する可能性がある様なので、 mysqldump 時に VIEW 定義は除外してダンプを取得し VIEW 情報のみを別途ダンプする様にしている。

Amason S3 への転送は S3 tools が公開している s3cmd を利用しているので、 s3cmdpython のインストールは必須。
当然 Amazon S3 も利用できる様にしておく必要がある。

以下のスクリプトは MySQL の接続用パスワードや Amazon S3 のアクセスキーなどを平文で保存しているので、 ファイルのアクセス権限には十分に注意が必要である。
バックアップは root 権限で実行する様にし ファイルの権限は 500 に設定しておく事が望ましい。

  1#!/bin/sh
  2
  3# MySQL 用の設定
  4database="データベース名"
  5user="-uユーザ -pパスワード"
  6
  7# Amazon S3 用の設定
  8backet="backet 名"
  9PASSPHRASE="パスフレーズ"
 10AWS_ACCESS_KEY_ID="アクセスキーID"
 11AWS_SECRET_ACCESS_KEY="SECRET アクセスキー"
 12
 13# ローカルにバックアップする世代数
 14max=7
 15# Amazon S3 に転送する曜日指定 (0: 日曜 … 6: 土曜)
 16dayofweek=0
 17
 18# コマンド定義
 19ls="/bin/ls -1"
 20wc="/usr/bin/wc -l"
 21rm="/bin/rm -r"
 22head="/usr/bin/head -1"
 23mkdir="/bin/mkdir -p"
 24
 25# ファイルとディレクトリ定義
 26logfile="/var/log/`basename ${0}`.log"          # ログファイル名
 27backupdir="/var/db/backup"                      # バックアップ先ディレクトリ
 28target="`date '+%Y/%m/%d'`"                     # Amason S3 でバックアップを格納するディレクトリ名
 29targetdir="${backupdir}/`date '+%Y%m%d'`"       # ローカルでバックアップを格納するディレクトリ名
 30backupfile="${targetdir}/all_dump.sql"          # バックアップファイル名
 31createview="${targetdir}/create_view.sql"
 32createtable="${targetdir}/create_table.sql"
 33
 34# MySQL コマンドの定義
 35mysql="/usr/bin/mysql ${socket} ${user} -B -N -s -r "
 36mysqldump="/usr/bin/mysqldump ${user}
 37        -R --hex-blob --single-transaction"
 38sql="select TABLE_NAME from information_schema.TABLES
 39        where TABLE_SCHEMA = '${database}' and TABLE_TYPE = 'VIEW';"
 40
 41# s3cmd の定義
 42s3cmd="/usr/bin/s3cmd put -rr"
 43export PASSPHRASE AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
 44
 45# ロギング開始
 46umask 700
 47exec > ${logfile} 2>&1
 48set -x
 49
 50# ローカルディレクトリの準備
 51# 最大世代数以上の場合は一番古い世代を削除する
 52test `${ls} ${backupdir} | ${wc}` -ge ${max} &&
 53    ${rm} ${backupdir}/`${ls} ${backupdir} | ${head}`
 54${mkdir} ${targetdir}
 55
 56echo "DB backup: start: `date`"
 57
 58# ダンプから除外するために VIEW を取得し create view 文をダンプする
 59for i in `${mysql} ${database} -e "${sql}"`
 60do
 61    view="${view} --ignore-table=${database}.${i}"
 62    ${mysql} ${database} -e "show create view ${i}"
 63done > ${createview}
 64
 65# 全データダンプ
 66${mysqldump} ${view} ${database} > ${backupfile}
 67
 68# create table 文のダンプ
 69${mysqldump} --no-data ${view} ${database} > ${createtable}
 70
 71# 指定された曜日の場合は Amazon S3 に転送する
 72# 以下の 1行をコメントとすると 毎日 Amazon S3 に転送する
 73test `date '+%w'` -eq ${dayofweek} &&
 74    ${s3cmd} ${targetdir}/ s3://${backet}/${target}/
 75
 76echo "DB backup: end: `date`"
    

2013/07/30

awk による正規表現にマッチした部分の抜き出し

入力行に "running""stopping""stopped""pendding" のいずれかの単語が含まれる場合に その単語を抽出したい場合。
awk (1) の sub()gsub() 組み込み関数では 後方参照ができないので マッチしたパターンに応じた変換を一度に行う事ができず、 それぞれのパターンにマッチングさせて処理をするしかない。

    awk '
        /^INSTANCE.*running/{
            print running;
        }
        /^INSTANCE.*stopping/{
            print stopping;
        }
        /^INSTANCE.*stopped/{
            print stopped;
        }
        /^INSTANCE.*pending/{
            print pending;
        }
    '
    
しかしこれではあまりにも悲しいのでマニュアルをじっくりと調べた所、 組み込み関数 match() で正規表現にマッチ処理を行うと 組み込み変数 RSTART にマッチした文字の位置、 RLENGTH にマッチした文字列の長さが設定されるので 組み込み関数 substr() と併用する事で マッチした部分を抽出する事ができる事に気がついた。
    awk '
        /^INSTANCE/{
            if(match($0, /running|stopping|stopped|pending/))
                print substr($0, RSTART, RLENGTH);
            if(match($0, /ec2.*\.amazonaws\.com/))
                print substr($0, RSTART, RLENGTH);
        }
    '
    
awk (1) で正規表現によるパターン抽出を行う場合に便利だと思います。

文字列はあくまでも例であって特別な意味を持っていません。
万が一類似する文字列があった場合でもそれは偶然の一致です。 ぐ、偶然ですからねっ(汗

2013/07/09

PATH の扱い

unix 系 OS では ${PATH} 環境変数を参照して コマンドの検索パスを指定する事ができる。
通常はログイン時にシステムデフォルトのコマンド検索パスが ${PATH} に自動で設定されているが、 ユーザ毎のシェルのログインファイル (.profile 等)で 自分用のコマンド検索パスを追加設定する事が多い。
ここで気をつけるべきは ${PATH} 中のヌルパス ("::") は カレントディレクトリ (".") と同等に扱われてしまう事だ。

例えば


PATH="${PATH}:${mypath}:${HOME}/bin"

    
と設定した時に ${mypath} が設定されていない場合

PATH="${PATH}::${HOME}/bin"

    
と展開されてしまうので、 結果としてカレントディレクトリが ${PATH} に含まれてしまう。
この挙動は POSIX (IEEE Std 1003.1, 2004 Edition) の 8.3 Other Environment Variables) にも明記されている。
The prefixes shall be separated by a colon ( ':' ). When a non-zero-length prefix is applied to this filename, a slash shall be inserted between the prefix and the filename. A zero-length prefix is a legacy feature that indicates the current working directory.
過去互換性の様だが非常に迷惑な仕様である。

カレントディレクトリをコマンド検索パスに含める事は どんな場合でもセキュリティ上のリスクを伴うので避けるべきでなので、 PATH を設定する場合は注意が必要だ。

例えば .profile${PATH} を設定する場合、 以下の様にする事は防衛手段として悪く無い考えだと思う。


PATH="`echo ${PATH}:${mypath}:${HOME}/bin | sed 's/::*/:/g'`"

    

2013/07/08

バーベキュー

金曜日の夕方過ぎに自宅から連絡があり、 唐突に土曜日は朝から道志川界隈にバーベキューに行くことに。
実はご近所さんにご一緒にと誘って頂いたのだが、 娘もとても仲良くしているお友達なので勿論行ってきました。
しかも場所の選定、バーベキューの道具(グリルやらテーブルやら)から 食材に至るまで完パケで用意して頂けたので感謝感激です。

Image: img_2369.jpg

川沿いのキャンプサイトとテント

仕事に行くよりも断然早く、朝 6 時に起きて 7 時出発。 車 2 台で向かったのは道志川沿いの「道志の森キャンプ場」。 ちゃんとしたキャンプ場ですがバーベキューなどのデイキャンプも可の様で、 しっかりテントを貼ったキャンパー風の一行から、 我々の様なバーベキューを楽しみに来た家族連れまで賑わっていました。
川の水はとっても冷たかったのですが、 娘達と一緒に脚まで水に浸かって目一杯楽しんだ後は 美味しいバーベキューに舌鼓の乱れ打ち。

ちゃんと火おこしや調理など頑張って働きましたよ!

Image: img_2372.jpg

バーベキューセットと竈

河原でのバーベキューなんて 10 年以上ぶりの事なので、 娘よりも親の方がはしゃいでしまったけど、 暑すぎず寒くもなくとても楽しい一日でした。

Image: img_2367.jpg

河原で水遊び

お誘い頂いて本当にありがとございました♪

2013/06/12

久々の迷惑メイル

先ほど携帯に届いた迷惑メイル。
やりくちがあまりにも下衆なので修正なしで晒す。

From: A1yxESBRcL@sda12.hkdsf0fbgw.net
To: XXXX@docomo.ne.jp
Date: 2013/ 6/12 18:30
Subject: 各携帯会社とご契約のお客様へ

携帯電話ご使用のお客様へのご請求額
今回の請求に対する確認はこちら。

http://sda12.hkdsf0fbgw.net/wxp/?vu=XXXXXXXXXXXXXXX&mop=1&XXXXXXXX

▼メインメニュー▼
http://sda12.hkdsf0fbgw.net/menu.php?vu=XXXXXXXXXXXXXXX

◆『18才』未満 不可◆

【Follow-Me】


【お問い合わせ】
support@yes-follow-me.com
最近の迷惑メイルの特長として From アドレスがランダムな文字列になっていて、 docomo の迷惑メイルフィルターに引っかからない様になっているらしい。
はなはだ鬱陶しい限りだ。

世の中には救い様のないクズがいるという事を改めて認識する

2013/05/27

レアチーズケーキ

KRAFT の PHILADELPHIA クリームチーズを使ったレアチーズケーキのレシピ。
基本的にはクリームチーズに同梱されているレシピ集に従うのだけれど、 一部、以前アルバイトをしていた喫茶店での作り方を参考に 独自のアレンジを加えてあります。
割と手軽に本格的なレアチーズケーキができるのでお勧めです。

材料

KRAFT PHILADELPHIA クリームチーズ 200g (1箱)
中沢サワークリーム 90ml (1パック)
ホイップクリーム 200ml (1パック)
砂糖 70g
レモン汁 大さじ1
バニラエッセンス 適宜
粉末ゼラチン 7g
白ワイン (ゼラチン用) 70ml
森永ビスケットチョイス 90g (10枚)
バター 40g

作り方

  1. バターを室温に戻す
    Image: IMG_0326.JPG

     
  2. ゼラチンを白ワインに振り入れて暫くふやかす
    Image: IMG_0325.JPG

     
  3. ビスケットを密封袋にいれる
    Image: IMG_0327.JPG

     
  4. ビスケットを麺棒などを利用して細かく砕く
    Image: IMG_0328.JPG

     
  5. 砕いたビスケットと室温に戻したバターを馴染む様に良く混ぜ合わせる
    Image: IMG_0329.JPG

     
  6. 混ぜ合わせたビスケットを型の底に敷き詰めてスプーンの背などで押さえつける
    Image: IMG_0340.JPG

     
  7. 弱火にかけた鍋にクリームチーズと砂糖を入れて混ぜ合わせる
    Image: IMG_0330.JPG

     
  8. 良く混ざったら火を止めてサワークリーム、レモン汁、バニラエッセンスを加えて更によく混ぜる
    Image: IMG_0332.JPG

     
  9. ホイップクリームを六分立てにする
    Image: IMG_0335.JPG

     
  10. ホイップクリームの上に裏ごし器を置く
    Image: IMG_0336.JPG

     
  11. 混ぜ合わせたクリームチーズを裏ごししてホイップクリームとまぜる
    Image: IMG_0337.JPG

     
  12. 湯煎して溶かしたゼラチンをクリームチーズに加えて更に良く混ぜる
    Image: IMG_0341.JPG

     
  13. 型に流し込みラップで蓋をして数時間冷やしたら出来上がり
    Image: IMG_0343.JPG

     

お好みでジャムやブランデーをふりかけて美味しくいただきましょう

Image: IMG_0380.JPG

完成

2013/04/16

CX-5

2012 年 8 月に納車されてからの足跡。
殆ど自己満足ではあるが自分としては厳選した部品で満足しているので お勧めできる用品を晒してみる。

純正オプション

ディーラにて購入した純正オプションで納車時に装着したもの達。
フロントのランプ類はフェンダーの奧に 手を入れる必要があるとの事だったのでディーラに作業をお願いした。

LED ポジションランプ フロントポジションランプを LED 化
LED アクセサリーランプ フロントアクセサリーランプを LED 化
フロント シルバーウィンカーランプ フロントウィンカーランプをステルス化
ノーマルだと中がうっすらオレンジ色になるのが嫌だった
リヤ シルバーウィンカーランプ リヤウィンカーランプをステルス化
フロアマット 純正品は割高なのだが折角の新車だし CX-5 のロゴも良いので敢えての純正品
アルパインナビ C9A4 V6 650 カーナビは BOSE オーディオとの相性を考えて ALPINE
デンソー スマートイン ETC システム ETC は必須
ETC 接続ケーブル カーナビとの連携のためのケーブル
バーグラーアラーム 一応新車なので盗難アラームも装備
アルパイン VICS ビーコンシステム リアルタイムで渋滞情報がわかるので VICS ビーコンは非常に便利
アルパイン iPod/USB アダプタ これで iPod Classic を接続して愛用中
DAMD シフトゲートパネル 安っぽいシフトゲートパネルをピアノブラック化
DAMD フロントドアスイッチパネル 安っぽいフロンドドアスイッチパネルをピアノブラック化

Image: IMG_0190.jpg

シフトゲートパネル

内装

主に内装に関係するもの

クレトム エクセレントシェード L SA-89 使わない時はコンパクトに収納でき便利
サイズも CX-5 のフロントウィンドウにぴったりで まるで専用設計の様な仕上がり
GM ライフハンマー LHJA002 万が一のためのシートベルトカッター & ハンマー
エマーソン 自動車用保安セット EM-300 純正の保安セットと同等品を OEM 供給元から
LIBERAL 本革製アームレストカバー
純正の内装とほぼ同じ色のステッチで純正品並の仕上がり
Pivot スロットルコントローラ 3-drive X ODBC2 モニタ一体のスロットルコントローラ
発進時のトルクを底上げ

Image: IMG_0015.jpg

ライフハンマー
Image: IMG_0014.JPG

アームレストカバー
Image: RIMG0740.JPG

スロットルコントローラ

外装

主に外装に関係するもの

クリエイト 給油間違い防止リング XG13 初めてのディーゼルなので給油間違い防止のため
軽油ステッカーは自作品
カーメイト フロントナンバーベース R2000 LS366 CX-5 では定番のフロントナンバーベース
ステンレス 超極低頭 トルクスボルト M6x40 フロントナンバーベースを装着するためのボルト
ステンレス製の TORX ボルト
MIRAREED アルミ エアーバルブキャッ SA-136 純正のエアバルブキャップはゴム製でなので変更
BOSCH Windtone BH-WT 純正のホーンがシングルホーンで悲しい音なので変更

Image: RIMG0684.JPG

誤給油防止リング
Image: RIMG0691.JPG

フロントナンバーベース

照明

主に照明に関係するもの

CREE SMD LED バックライト 3W T16 バックライトを LED 化
VALENTI LED ブレーキ/ストップランプ T20W T20W-R1854-1 ブレーキ/テールランプを LED 化
VALENTI LED ブレーキ/ストップランプ T10 T10S-R1315-1 テールランプを LED 化
SHARExSTYLE LEDセット
室内灯を LED 化するセット

個人輸入

個人輸入した海外製品(純正パーツ含む)

USマツダ純正 リアバンパーガード リアバンパーガード(ロゴ無し)
オーストラリア製スカッフプレート 前後 ドアスカッフプレート(ロゴ有り)
オーストラリアマツダ純正 リヤサンシェード マグネットでドア枠に装着できる優れもの

Image: RIMG0690.JPG

リアバンパーガード
Image: RIMG0681.JPG

ドアスカッフプレート
Image: RIMG0678.JPG

リアサンシェード

書籍

書籍類

CX-5のすべて モーターファン別冊
構造調査シリーズ CX-5 自研センター

2013/03/20

Fドリーム平塚

Fドリーム平塚でカート体験をしてきた。
以前カーレルのレーシングカートを共同で所有していたのだが、 カートに乗るのは 10 年以上振りなので、 まずはスピードがあまり出ない二人乗りカートに娘と一緒に乗る事に。

Image: IMG_2271.JPG

二人乗りカートでノンビリ走行中

1 セッション 3 周なので娘の反応を見ながら 47 秒程度のゆっくりしたペースで 3 周走った所、 「全然怖く無かったよ」「もっとスピード出して」とリクエストされたので、 次のセッションではちょっと(大幅に)ペースをアップして 結局 40 秒程度のペースで周回してみた。

Image: IMG_2270.JPG

二人でコーナ出口をしっかり見ています

二人乗りにもかかわらず一人乗りのカートを 2 台抜いてしまいました(笑。
横 G で結構頭が振られているのに怖がらずに「もっともっと早く走ろう♪」という 娘は父親よりも Speed Junkie かも?(やはり血なのだろうか)。

Image: IMG_2299.JPG

二人乗りのベストタイムは 40秒587

ちなみにこのコースのドライでのコースレコードは 29秒804 (何てタイムだ。
二人乗りカートでの今シーズンのベストラップは 35秒440 らしいです。

2013/02/20

xBackup のバックアップデータを自動転送する

cydia 経由でインストールしたアプリケイションをバックアップするために xBackup を導入したのだが、 xBackup はバックアップしたデータを自動では転送できない。
そのままではバックアップデータが iPhone の中にしか存在しないので GoodReader を利用して iTunes による sync の際に自動で転送される様に設定した。

  1. GoodReader で『マイドキュメント』フォルダに バックアップデータを格納するフォルダ 『Backups』を作成する。

  2. Mobile Terminal を利用して GoodReader の ドキュメントフォルダのパスを確認する。
    ドキュメントフォルダは /var/mobile/Applications/ランダムな文字列/Documets に存在しているので ls などを利用してランダムな文字列 を確認する。

  3. ドキュメントフォルダに先ほど作成した 『Backups』 フォルダがある事を確認したら、 xBackup のバックアップ作成ディレクトリを作成して シンボリックリンクを作成する。

    $ mkdir /var/mobile/Library/xBackup
    $ ln -s /var/mobile/Applications/ランダムな文字列/Documents/Backups /var/mobile/Library/xBackup/Backups
                    

  4. xBackup を起動してバックアップを作成する。

  5. バックアップが完了したら iPhone を接続して iTunes を起動する。
    iTune の『デバイス→App』から ファイル共有の『GoodReader』を選択すると GoodReader の書類一覧に Backups が表示されるので 『保存先…』ボタンをクリックして保存先を設定して同期すれば、 指定した保存先に xBackup のバックアップデータが保存される。

ここに書いてある事は多少なりとも専門的な知識を要す内容です。
cydia って何? 」「Mobile Terminal って何?」 「シンボリックリンクって何?」と思われる方は試さない方が良いと思います。

ここに書かれている事を試された際に何が起こっても私は責任を取れません。
あくまでも自己責任だという事を理解された上でお試し下さい。

2013/01/29

丸美屋の麻婆豆腐

普通に作っても十分に美味しい『丸美屋の麻婆豆腐』を 一手間かけることで更に美味しく作るレシピ。

材料 (3人分)

丸美屋の麻婆豆腐 1 箱の半分
豆腐(個人的には木綿豆腐の方が好ましい) 1 丁
挽肉 100 g
長ネギ 1/2 本
ニンニク 1 かけ
生姜 1 かけ
鷹の爪 1 ~ 2 本
粉山椒(あれば) 適量
ごま油 適量

作り方

  1. 丸美屋の麻婆豆腐の素に添付されているとろみ粉を 予め水に溶いておきます。
  2. 豆腐は少し水切りをしておくと できあがった時の食感が良くなります。
  3. ニンニクと生姜はみじん切りにします。
    ニンニク絞りがあれば便利です。
  4. フライパンにごま油を熱し鷹の爪を入れて香りを出します。
    火が強すぎると鷹の爪が焦げてしまうので中火程度で。
  5. みじん切りにしたニンニクと生姜を入れて 焦げない様に気をつけながら炒めます。
    特にニンニクは焦げやすいので要注意です。
  6. 挽肉を加えて粉山椒を振りかけて炒めながら 出てきた脂を吸い取るなりして始末します。
    山椒は多少大目に振りかけて良く過熱すると 香りがでて良いでしょう。
    挽肉の脂は臭みが強いので個人的には捨てる方が好みですが、 気にならない方はそのままでもかまいません。
  7. ここまで出来たら通常の手順通りに作ります。

ほんの簡単な一手間で随分味が変わります。
是非お試し下さい。

2013/01/23

i-DM

CX-5 に限らず最近の MAZDA の一部車種には i-DM という 運転評価システムが備わっている。
アクセルやブレーキ、ステアリング操作の加速 G を検出して ドライビングを評価していると思うのだが、 その評価があまりにもお粗末で正直全く使い物にならない。

このシステムは基本的にアクセルを開けるか、ブレーキをかければ評価が高い (しかも若干急発進、急ブレーキ気味だと加点される)という、 全く実情には見合ってない的外れな評価をしてくる。
例えば正面の信号が赤信号の場合で前後に他車がいない場合などでは、 アクセルを緩めて惰性走行する事で環境にも優しく燃費も良い運転となるが、 そういう運転をするとこの評価システムはどんどん減点していく。 また、片側 1 車線で歩道がある道でも歩道に小さな子供がいる場合は 突然の飛び出しに備えて徐行するか、ゆっくり走るのが当然だと思うのだが、 そういう場合でもこのシステムは容赦なく減点してしまう。

そして最後には「メリハリのある加速や減速をしましょう」とか表示する始末。 いやはやあきれ果ててモノも言えないとはこのことだ。
このシステムの開発者は果たして運転免許を持っているのだろうか?
運転という行為を理解しているのだろうか?

そもそも車の運転はドライバーが五感を駆使して収集した周囲の状況を 総合的に判断しながら様々な操作を行う必要があると思うのだが、 このシステムでは単に加速や減速、ステアリング操作による G の変化だけで評価している時点で全く使い物にならない。
よくもまぁ、こんなガラクタを標準で搭載したものだと呆れてしまう。 実際に欧米への輸出仕様にはこの様なゴミは当然搭載されていないらしい。
確かに他がどんなに素晴らしい自動車だったとしても、 こんなガラクタが搭載されている時点で評価はがた落ちだろうし、 まともな自動車メーカだとは思って貰えなくなるだろう。
こんなゴミ・ガラクタを標準で搭載する位なら 水温や電圧などを表示する方がよっぽどマシだという事に なぜ MAZDA は思い至らないのだろうか?

CX-5 は非常に気に入った車なのでそこだけが残念である。
i-DM のディスプレイ部分に ODBC 情報を表示する様な 製品を是非とも開発して頂きたい。

2013/01/01

A Happy New Year

新年
  明けまして
    おめでとう
      ございます

今年もよろしくお願いします。


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.