2019/10/31

exif 情報を利用した画像の整理スクリプト

iPhone で撮影した画像を macOS 標準の イメージキャプチャ などを利用して Mac に取りこんだ後、 exif 情報を参照して画像ファイルを整理するスクリプトです。
利用するためには exiftool が必要となりますので、Homebrew または MacPorts を利用して導入して下さい。

macOS 10.14.6 (Mojave) での動作を確認していますが、exiftool 以外は POSIX に準拠したコマンドしか使っていないので、 exiftool さえ準備できれば他のバージョンの macOS はもちろん、FreeBSD や Linux 上でも稼働すると思います。

  1#!/bin/sh
  2# 検索する exif タグ
  3tag="DateTimeOriginal ModifyDate CreateDate"
  4
  5# 生成する画像ファイル名に追加する文字列
  6id="_iOS"
  7
  8# 画像ファイル格納先ディレクトリ
  9base=${HOME}/CameraFiles
 10picture="Pictures"
 11movie="Movies"
 12unknown="Unknown"
 13
 14#
 15# exif 情報から画像の作成日を取得
 16#   $1: ファイル
 17#
 18getDate()
 19{
 20
 21    local   _t _d
 22
 23    for _t in ${tag}
 24    do
 25        _d=$(exiftool -${_t} "${1}")
 26        if [ -n "${_d}" ]
 27        then
 28            echo ${_d} | awk '{ print $(NF-1), $(NF)}' | sed -e 's/:/ /g' -e 's/\..*//g'
 29            return
 30        fi
 31    done
 32
 33}
 34
 35#
 36# 格納先のファイル名を生成
 37# ファイル名は ${base}/TYPE/YYYY/MM/YYYYMMDD_HHMMSSXXX_iOS.EXT の形式
 38# XXX は 000 から 999 までを自動で採番する
 39#   $1: 格納先ディレクトリ
 40#   $2: 日付 (YYYYMMDD)
 41#   $3: 時間 (YYYYMMDD)
 42#
 43getName()
 44{
 45
 46    local   _n _nn
 47
 48    _n=1
 49
 50    while [ ${_n} -le 999 ]
 51    do
 52        _nn=$(printf "%03d" ${_n})
 53        if ls "${1}/${2}_${3}${_nn}${id}"* > /dev/null 2>&1
 54        then
 55            _n=$((_n + 1))
 56        else
 57            break
 58        fi
 59    done
 60
 61    echo "${1}/${2}_${3}${_nn}${id}"
 62
 63}
 64
 65#
 66# メイン処理
 67#
 68ls -1 *jpg *png *mov | while read i
 69do
 70    # ファイルの拡張子取得
 71    ext="${i##*.}"
 72
 73    # 拡張子でサブディレクトリを指定
 74    if [ "${ext"} = "mov" ]
 75    then
 76        type="${movie}"
 77    else
 78        type="${picture}"
 79    fi
 80
 81    # exif 情報から作成日を取得
 82    set -- $(getDate "${i}")
 83    year=${1}
 84    month=${2}
 85    day=${3}
 86    time=${4}${5}${6}
 87
 88    if [ -n "${year}" ]
 89    then
 90        # 作成日が取得できた場合
 91        dst="${base}/${type}/${year}/${month}"
 92        name="$(getName "${dst}" "${year}${month}${day}" "${time}").${ext}"
 93    else
 94        # 作成日が取得できない場合
 95        dst="${base}/${type}/${unknown}"
 96        name="${dst}/${i}"
 97    fi
 98
 99    # 格納先ディレクトリ作成
100    mkdir -p "${dst}"
101    # ファイル格納
102    cp "${i}" "${name}"
103done
    

2019/10/30

It's a special day!


Sending you smiles for every moment of your special day...Have a wonderful time and a very happy birthday!

2019/07/16

ツインリンクもてぎ

週末の三連休はキャンプに行く予定でしたが、天候不順のために急遽キャンセルして栃木のツインリンクもてぎに行って来ました。
ツインリンクもてぎはホンダが運営元の国際規格サーキットで、遊園地も併設されているので以前から気になっていましたが、 娘の身長的な問題で行ってなかったのですが、最近やっと 135cm を越えたので一部以外のアトラクションは楽しめる様になったので行って来ました。

Image: 20190713_001051553_iOS.jpg

開門前から並んでます

今回の一番の目的はジップライン。2種類あるジップラインのうち、娘の体重的な理由で「森のジップライン ムササビ」にトライしてみたのですが、 案内付きで90分程度のコースで6種類のジップラインに3種類の吊り橋まであってとっても楽しめました。
家族全員ジップラインは初めての体験でしたが、本格的な装備を装着して滑車1個で滑り降りるのはとっても爽快です。
ジップラインを楽しめただけでも来て良かったと思える楽しいアトラクションでした。

Image: 20190713_015855346_iOS.jpg

ジップラインに興じる娘

ジップラインの後はサーキット併設の遊園地ならではのモータースポーツ系のアトラクションを楽しみます。 まずは娘が子供用のカート (ゴーカートよりは少しだけ本格的な感じかな?)で腕試し。

Image: 20190713_031254933_iOS.jpg

なかなか上手に乗れた様

次はパパが本格的なレーシングカートにチャレンジ。
Fドリーム平塚で走行経験があるので多少は慣れていますが初めてのコースなのでドキドキしながらも、集中して周回走行を繰り返しベストタイムは49秒245。 スタッフさんによると「初めてで50秒切れれば凄いですよ」との事なのでちょっとだけ自慢しちゃいます。

Image: 20190713_075108216_iOS.jpg

最後の周で何とか50秒切れました

その他にも色々なアトラクションを目一杯楽しみました。
偶然オートバイの耐久レースが開催されていたのでパドックまで行ってレースも堪能。
最後は併設されている Honda Coolection Hall で往年の名車を堪能しました。

Image: 20190713_091422639_iOS.jpg

F. スペンサーのチャンピオンマシン
Image: 20190713_091744937_iOS.jpg

A. セナのチャンピオンマシン

開園時間から閉園時間ギリギリまで丸一日楽しめました。
体力的に自宅まで帰るのは無理だと思い急遽近場でホテルを探して一泊。 早々と寝たので体力はすっかり回復した結果、翌日帰りにディズニーランドに寄って来たのは家族だけの秘密(笑


2019/05/27

ソロキャンプで持参する道具たち

オートバイでソロキャンプに行く時に持参している道具達をまとめてみた。
忘れ物をしないための個人的な備忘録としてまとめるが、 他のキャンパーの参考になれば嬉しい。
以下のキャンプ道具は TANAX 社 MotoFizz フィールドシートバッグに収納している。

Image: 20190524_232103722_iOS.jpg

フロントから
Image: 20190524_232157618_iOS.jpg

リアから
Image: 20190524_232144540_iOS.jpg

荷物

【本体】
テント類
テント
mont-bell クロノスドーム2型 + グランドシート
シュラフ
mont-bell ダウンハガー 800 #3
シュラフカバー
NANGA シュラフカバー
エアマット
mont-bell ULコンフォートシステム エアパッドワイド180
まくら
mont-bell ULコンフォートシステム ピロー
ハンモック
Hummingbird ハンモックダブル + Hummingbird ストラップ + Dutch Clip + Dutch Biners
テーブル
アルミテーブル
キャプテンスタッグアルミテーブル
ミニテーブル
SOTO フィールドホッパー + クッションカバー
アルミテーブル
Linkax アルミテーブル
焚き火グリル
UNIFLAME クッカースタンド450
キッチンテーブル
DoD ソトメシンガーZ TB1-567
椅子
折りたたみ椅子
LOGO'S 7075 ポケットスツール
チェア
ALITE Myfly sling
焚き火台類
ミニ焚き火台
コニファーコーン パイロマスター2
焚き火台
Monoral ワイヤーフレーム MT-0010 + 焚き火メッシュ2 MT-0019
グリル
笑'S Mr.B-6
クッカー
コッヘル
Trangia ストームクッカー をオークションで落札したネオプレーン製のケースに収納
ストーブ
SOTO ストームブレイカーマルチクッションケース巾着タイプ に収納
鉄板
M.M.Factory 極厚鉄板
カトラリセット
UJack チタン カトラリセット
シェラカップ
UNIFLAME チタン製シェラカップ x 3個
ロッキーカップ & リッド
ベルモント チタン製ロッキーカップ + チタンリッドM
食料品
珈琲ドリッパ
Muniq ステンレス製 Tetra Drip
ペーパーフィルター
汎用品
調味料袋
珈琲豆
アルミ缶 (小分け)
粉末コーヒー
スティックパック
ティーバッグ
タッパー (小分け)
調味料
ナルゲン広口ボトル 30ml (小分け)
サラダ油
オリーブ油
醤油
赤ワイン
ブランデー
コショウ
ツール類
マルチ収納ポーチ
ヘッドランプ
Petzl ACTIK CORE
LEDランタン
BlackDiamond ReMoji
LEDランタン
GOALZERO LIGHTHOUSE マイクロランタン
マッチ
UCO ストームプルーフマッチ
ナイフ
Buck 110
ナイフ
Boker MAGNUM エルクハンター
レジャーシート大
Matador POCKET BLANKET
レジャーシート小
Matador MINI POCKET BLANKET
ファイアスターター
ガーバー BGモデル
火吹き棒
ZAFIELD 火吹き棒
麻紐
DAISO
ワセリンティンダー
自作
ガス器具ポーチ
OD缶
PRIMUS 110サイズ
ランタン
PRIMUS P-541 マイクロランタン
ストーブ
PRIMUS P-115 フェムトストーブ
予備マントル
PRIMUS IP-8052N
燃料
岩手切炭がおすすめ
ペグケース (ペグハンマーのケースにペグと一緒に収納)
ペグハンマー
Jekeno 多機能ペグハンマー
ペグ
Boundless Voyage チタン鍛造ペグ
ランタンスタンドケース
ランタンスタンド
自作品
チタンペグ
Vargo チタンペグ
【サイドポケット(左右)】
衣類
防寒ジャケット
TAICHI 防水インナージャケット
日用品
洗剤とスポンジ
汎用品
ウェットティッシュ
汎用品
モバイルバッテリー
iWALK 2000mAh
USB カイロ
EKOOS USBカイロ
MAXPEDITION ポーチ
マルチツール
レザーマン JUICE S2
LED ライト
OLIGHT S30 Ti BATON
トーチ
SOTO スライドガストーチ ST-480
モンキーレンチ
バーゴ 110mm
EDC
マルチツール
SQUIRT PS4
トーチ
SOTO マイクロトーチ COMPACT ST-485
LED ライト
OLIGHT S10 BATON
ミニポーチ (Boundless Voyage のチタン鍛造ペグのケースを流用)
ミニスコップ
Vargo チタン ディグディグツール
タガネ
汎用品
キャンドルランタン
SIERRA DESIGNS キャンドルランタン (オイルランプ化)
着火剤
LOGO'S 防水ファイヤーライター 小分け
革グローブ
KINCO'S SUEDE COWHIDE DRIVER
【サイドのドリンクケース】
アルコールボトル
Trangia フューエルボトル 0.5L
【トップ部のゴムコード】
焚き火台
UCO MINI FLATPACK GRILL
ソフトクーラーバッグ
SEATLE SPORTS ソフトクーラー 23QT
シューズ
Arc'teryx アラキス
平ゴム
汎用品
ペーパーナプキン
DAISO
レジャーシート
DAISO
【トップ部のフラットケーブル】
タープ
さすらいタープ + DoD コンパクトタープポール
【トップ部にカラビナで固定】
キャンティーン
Keith チタンキャンティーン

なるべくメーカーなど一次情報にリンクしているが、Amazon で購入した中国製の品物などメーカー公式サイトが不明なモノなどについては Amazon 等外部のサイトにリンクしているがアフェリエイトではないです。

2019/05/24

The Camp & Garden AMANAYU

久しぶりのソロキャンプツーリングは山梨県の AMANAYU へ。
ここは 2018年7月にオープンしたばかりの新しいキャンプ場なのですが、 キャンプ情報メディアなどの口コミで「とても素晴らしい」と絶賛されています。
たまたま週末に予約が取れたので行って来ました。

Image: 20190518_065627610_iOS.jpg

The Camp & Garden AMANAYU

テント、シュラフ、クッカーなど最低限必要と思われる荷物を積み込んだらいざ出発です。
なるべく荷物を減らしたのですが、それでも山積みになってしまいます。 「もっともっとコンパクト化を推進しなくては」と改めて思うんですが…今の所どうしようもないです。

Image: 20190518_004223016_iOS.jpg

荷物山積み
Image: 20190518_004259481_iOS.jpg

これだけの荷物を積むと操縦性が随分と変わってくる

キャンプ場は山梨県北杜市(詳しい場所は非公開)なので中央高速をひた走り。 途中で給油など適宜休憩しながらも自宅から3時間程度で無事到着です。
到着したら早速設営を開始します。 今回もモンベルのクロノスドームと DoD のさすらいタープの組み合わせ。
タープの下にテントを張っているのですが、この場合も「小川張り」というのだろうか…。

Image: 20190518_060936926_iOS.jpg

設営完了
Image: 20190518_064249016_iOS.jpg

至福の珈琲タイム

ここのキャンプ場は何と直火可との事なので早速焚き火を始めます。 しかも薪一束は無料というのが焚き火好きには嬉しい限りですね。

Image: 20190518_080456192_iOS.jpg

焚き火のセッティング

折角の直火なので Wolf & Grizzly 社の焚き火グリルを使って焚き火だけで料理してみます。
炊飯は火力調整が難しく微妙に芯が残ってしまいましたが、それでも美味しく炊けました (自画自賛)。
肉は網で直接焼くと煙臭くなるので極厚鉄板を利用して調理します。 豚バラ肉は塩胡椒で、牛カルビと牛ロースは焦がし醤油でそれぞれシンプルにいただきます。

Image: 20190518_084926545_iOS.jpg

焚き火で炊飯
Image: 20190518_091314094_iOS.jpg

豚バラとグリーンアスパラ
Image: 20190518_092346797_iOS.jpg

牛カルビと牛ロース

ノンビリ食事を終わらせたらまったりタイム。
うるさく騒ぎ立てる迷惑なキャンパーがいないので素敵な時間を過ごす事ができました。

Image: 20190518_113712400_iOS.jpg

夜のひととき

朝はキャンティーンで直接お湯を沸かして珈琲を淹れたらパンで朝食タイム。 ここの水は地下水をくみ上げているのでとても美味しく珈琲もひと味違います (プラシーボ)。
食事の後はすぐそばを流れる川まで腹ごなしのお散歩タイム。 すごく綺麗な川のせせらぎなので、暑い季節は川遊びが楽しそうですね。

Image: 20190518_211219240_iOS.jpg

キャンティーンで湯沸かし
Image: 20190518_222837626_iOS.jpg

川のせせらぎ

撤収する時は焚き火跡を綺麗にして帰ります。 チェックインの時に渡された注意書きにも後始末の方法が簡単に載っていますが、 「来た時よりも綺麗に」をモットーに焚き火跡を綺麗にして帰途につきました。

本当に素敵なキャンプ場でした。次は家族と是非一緒に来たいです。

Image: 20190519_010834303_iOS.jpg

撤収完了

2019/04/18

CentOS 7 のコンソール画面でキーマップを変更する

キーボードのキーが押下されるとキーコードと呼ばれる一意の値がシステムに通知される。
キーマップはこのキーコードに対して文字を定義するためのファイルで、 システム標準のキーマップは /lib/kbd/keymaps/legacy/i386/qwerty に格納されている。
CentOS 7 のコンソール画面のキーマップ情報は /etc/vconsole.conf ファイルに格納されていて、 起動時に自動で読み込まれコンソール画面のキーマップが設定される。

$ cat /etc/vconsole.con
KEYMAP="us"
FONT="latarcyrheb-sun16"
    

例えば US 配列のキーボードで邪魔な Caps Lock を Control に変更したい場合は Caps Lock のキーコードを調べて押下された時に Control が入力される様なキーマップを用意すれば良い。
キーマップは showkey コマンドで調査する事ができる。
showkey コマンドは画面に表示されている通り最後の入力の10秒後に終了する。

$ showkey
kb mode was UNICODE
[if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s acter last keypress)...
keycode 58 press                      ここで Capl Lock キーを押下
keycode 58 release                    ここで Capl Lock キーを離す
$
    
結果から Caps Lock キーのキーコードは 58 なのでキーコード 58 に対して Control を入力するキーマップを作成する。 キーマップファイルは他のキーマップファイルを読み込む事ができるので、オリジナルの us.map を読み込んで Caps Lock だけを変更する。 この時、Shift + Caps Lock の場合は Caps Lock としてみる。
キーマップファイルは gzip 形式で圧縮する必要があるので圧縮し、所定のディレクトリに格納する。
# cat << EOF | gzip -c > /lib/kbd/keymaps/legacy/i386/qwerty/us-nocaps.map.gz
include "us.map"

keycode 58 = Control
    shift keycode 58 = Caps_Lock
EOF
    

キーマップファイルの準備ができたら loadkeys コマンドでキーマップを読み込み挙動を確認する。

# loadkeys /lib/kbd/keymaps/legacy/i386/qwerty/us-nocaps.map.gz
Loading /lib/kbd/keymaps/legacy/i386/qwerty/us-nocaps.map.gz
    
Caps Lock キーが Control に、Shift + Caps Lock キーが Caps Lock になる事が確認できたら、 起動時にキーマップが読み込まれる様に /etc/vconsole.conf ファイルを編集する。
# cp /etc/vconsole.conf /etc/vconsole.conf.orig
# sed '/KEYMAP/ s/us/us-nocaps/' /etc/vconsole.conf.orig > /etc/vconsole.conf
    
これで再起動しても Caps Lock は Control となる。

2019/04/12

風遊心リゾート

Facebook で知り合った方が運営されている西伊豆の隠れ家的キャンプ場に行ってきました。
いつものオートキャンプではなく車から若干離れているので設営・撤収時は少し大変ですが (しかも高低差があるのでつづら折りの細道を上る必要あり)、 その大変さを補ってあまりある素敵な場所でした。

Image: 20190413_084609151_iOS.jpg

細道を上った所にあるサイト

予め駐車場から遠いと聞いていたので今回は久々のタフドームの出番。
翌日は雨の予報だったので降雨に備えて久々に小川張りにて設営完了です。

Image: 20190413_091254839_iOS.jpg

久々の小川張り
Image: 20190413_091329162_iOS.jpg

山間に秘密基地風に設営

直火が可能で焚き火台兼用のカマドが設置されていたので盛大に焚き火が楽しめました。
今までの家族キャンプの中で一番ワイルドな環境でしたが娘も凄く楽しんだ様です。

Image: 20190413_204113192_iOS.jpg

ワイルドライフ

キャンプ場の奧には綺麗な沢が流れていて野趣あふれる風情です。
川沿いには鹿と思われる動物の骨が散乱していました。

Image: 20190413_225819283_iOS.jpg

キャンプ場奧の滝

西伊豆なので家から一泊で行くにはちょっとハードですが、その分楽しみも一入です。
写真はありませんが手作りの露天風呂も凄く良い感じなので是非また行きたいキャンプ場です。

Image: 20190412_231057524_iOS.jpg

圧倒的富士山

2019/03/30

柿山田オートキャンプガーデン

娘がダブルダッチのイベントなどで忙しかったので、久々に家族キャンプ。
まだまだ寒い時期が続くので冬キャンプと言えば…の千葉に行ってきました。

Image: 20190331_030756028_iOS.jpg

柿山田オートキャンプガーデン

そろそろ暖かくなってきたとは言え、夜はまだまだ寒い日が続いているためなのか、 週末なのにとても空いていて静かで良いロケーションでした。
電源サイトだったので今回もホットカーペットを持ち込んでお座敷スタイル。 寒い時期は前室でコタツ状態にしてぬくぬく出来るのが嬉しいですね

Image: 20190330_082200861_iOS.jpg

お風呂上がりでタオルが干してあり既に生活感が溢れていますが…

薪で焚く野趣溢れる手作りの露天風呂に入った後はノンビリと食事タイム。
豚バラで巻いたアスパラガス、地場の野菜、そして大正義の肉などをワイルドに調理。 この時期薪ストーブを持参する関係で焚き火台を持ち歩かなくなってしまったので、 家族キャンプでも UCO のフラットパックポータブルグリルが大活躍でした。

Image: 20190330_090854464_iOS.jpg

豚バラ巻きアスパラ
Image: 20190330_102504841_iOS.jpg

地場野菜
Image: 20190330_103129883_iOS.jpg

大正義

食事の後はコニファーコーンのパイロマスターでオトナの火遊びタイム。

Image: 20190330_123632418_iOS.jpg

シェラカップの珈琲を温め中
流石二次燃焼はよく燃えます。気持ちが良い

翌日は追加料金で夕方18時までの延長利用。
近所の道の駅に食材を買いにいってノンビリと昼食を食べた後、 ゆっくりと撤収作業をする事ができました。

Image: 20190331_004312785_iOS.jpg

綺麗な天気でシュラフも気持ち良く乾燥しました

そのまま帰っても高速道路は渋滞するので、 さらに温泉にまで浸かって日付が変わる頃にノンビリ帰宅しました。
状況がゆるせば、こういうゆったりキャンプも良いですね。

2019/03/02

男子二人キャンプ(またかよ?)

例によって友人と男子二人キャンプ。 そろそろこのネタも飽きてきた感じか…
今回は房総半島最南端の白浜フラワーパークに行ってきました。
去年の台風で壊滅的な打撃を被ったと聞いていましたが営業再開した様なので早速行って来ましたよ。

Image: 20190302_042132093_iOS.jpg

海沿いの一等地は既に塞がっていたのが残念

翌日雨の予報だったので今回も軟弱に車で薪ストーブ持ちこみ。
一日目だけなら暖かかったのでバイクで来ても良いかな?と思ったんですがね

Image: 20190302_063257340_iOS.jpg

まずは珈琲タイム

ここのキャンプ場はなんと薪使い放題!
ただし自分で薪割する必要はありますが… という事で地味に薪割タイム(これが何も考えずに作業できるので意外と楽しい)
それにしてもキンドリングクラッカーでの薪割りは楽で良いですね。 薪をセットして上からハンマーで叩くだけで簡単に割れる割れる! 素晴らしい!

Image: 20190302_080146970_iOS.jpg

薪割り

ついでに Hot Candy Heater のデビューもしてきました。
巷では中々入手が困難と話題になっているアルコールストーブ専用のヒーターです。 外で使うには火力が不足気味ですがテントの中を簡単に温めるには十分でした。

Image: 20190302_084757303_iOS.jpg

Hot Candy Heater の火入れ

例によって食事は肉ニクにく…でも、今回は海沿いなのでハマグリも追加。 炭火でじっくり焼いたハマグリの何と美味しい事か…

Image: 20190302_094005549_iOS.jpg

焼きハマグリ
Image: 20190302_101231421_iOS.jpg

圧倒的肉!

そしてオッサン二人の夜は静かに更けていくのであった…

Image: 20190302_091731592_iOS.jpg

シェラカップ越しの夕焼け
Image: 20190302_091801271_iOS.jpg

夜のとばり

ちなみに翌日は朝から結構な雨でした。
友人にとっては初めての雨キャンプとなりましたが何とか無事に撤収できて良かったですね

2019/02/16

男子二人キャンプ

例によって友人と男子二人キャンプ。 今回は冬キャンプの定番千葉に行って来ました。

Image: 20190216_054856557_iOS.jpg

千石台オートキャンプ場

オフシーズンだからかとても空いていたので広めのサイトを使わせて頂きました。
今回は寒い時期なのでバイクではなく車で。 とは言っても装備はバイク用なので荷物に余裕があり薪ストーブまで持ち込みです。

Image: 20190216_060310543_iOS.jpg

DoD のさすらいタープを設営
Image: 20190216_065048335_iOS.jpg

マナスルヒーター
Image: 20190216_062335856_iOS.jpg

Coleman の GI ストーブでコーヒータイム

男二人まったりしていてもする事がなく、すぐに食事に準備に(食べる事ばかり)
UCO のフラットパックポータブルグリルで炭火を熾し、 半分は極厚鉄板を乗せて牛肉をグリル、残りの半分は網を利用して豚バラを直火で調理。 網焼きした豚バラ肉は余分な脂が落ちてとっても美味しいですね。

Image: 20190216_100953299_iOS.jpg

バーベキューグリルとしてしか利用していない

Image: 20190216_120925478_iOS.jpg

食後はまったり珈琲タイム

そして千葉の夜は静かにふけていくのであった…

Image: 20190218_134716522_iOS.jpg

おやすみなさい

2019/02/15

時間の範囲を指定してログを抽出する

syslog や apache のログファイルなどから時間の範囲を指定してログを抽出したい場合、 ログファイルの時間表記をそのまま比較するのは面倒なので一度 epoch に置き換えて比較すると楽だ。

現在時刻から epoch は date (1) のフォーマット指定 '+%s' を利用する事で取得できるが、 指定した時刻から epoch を取得する汎用的な手法は現状では存在しないので今回は GNU date の '-d' オプションを利用する。

例として combined 形式の apache のログの時間範囲を抽出してみる。
combined 形式の apache のログは以下のフォーマットとなっているので、時刻は空白区切りの4番目のフィールドに格納されている。 そこで、ログの行毎に4番目フィールドの時刻を epoch に変換して比較する事で指定された時間内のログを抽出できる。

192.168.15.134 - - [14/Feb/2019:03:35:54 +0900] "GET / HTTP/1.1" 200 1920 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
192.168.99.23 - - [14/Feb/2019:07:20:35 +0900] "GET / HTTP/1.1" 200 1920 "https://www.bsdhack.org/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36; 360Spider"
192.168.157.241 - - [14/Feb/2019:09:28:45 +0900] "GET / HTTP/1.1" 200 1920 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
192.168.15.143 - - [14/Feb/2019:09:58:44 +0900] "GET /bsdhack.css HTTP/1.1" 200 3246 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
192.168.93.5 - - [14/Feb/2019:12:03:47 +0900] "GET / HTTP/1.1" 200 1920 "-" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1"
    

ただし、標準的な apache のログに格納されている時刻情報はそのままでは date (1) の '-d' オプションでは変換できない。

$ date -d "14/Feb/2019:09:28:45"
date: invalid date `14/Feb/2019:09:28:45'
    
そこで、 まずは date (1) で変換できる様な形式に変換してから変換する。 そのためには日付けの区切り文字 '/' と、日付け部と時間部を分割している ':' をスペースに置換すれば良い。
$ date -d "14 Feb 2019 09:28:45"
Thu Feb 14 09:28:45 JST 2019
    
全体の流れとしてはログファイルから1行ずつ読み込み、時刻フィールドを epoch に変換して基準時刻と比較する処理を行う。 今回は全ての処理を awk (1) を利用して実装してみる。

  1#!/bin/sh
  2#   $1: 開始時間 -- date(1) が認識できる形式
  3#   $2: 終了時間 -- date(1) が認識できる形式
  4#   $3: ログファイル
  5
  6# 開始時間
  7start=$(date '+%s' -d "${1}")
  8# 終了時間
  9end=$(date '+%s' -d "${2}")
 10# ログ抽出
 11awk -v "start=${start}" -v "end=${end}" '{
 12    # 時刻フィールドを date(1) が認識できる形式に変換
 13    gsub(/[][/]/, " ", $4)
 14    sub(/:/, " ", $4)
 15    # ログの各行について時刻を epoch に変換する
 16    # $4 にはスペースが含まれているので全体をクォートする
 17    cmd = sprintf("date +%%s -d '"'%s'"'", $4);
 18    # date(1) を実行して epoch を変数 s に取得
 19    cmd | getline s;
 20    # コマンド実行でオープンされたディスクリプタをクローズ
 21    close(cmd);
 22    # 行が範囲内なら出力する
 23    if(start <= s && end >= s)
 24        print $0
 25}' ${3}
    

これで開始時間から終了時間の間のログを抽出できる。
行毎に時間の変換処理を実行するので実行に時間はかかってしまうのが現状の問題点。

2019/01/31

とあるサイトが変更になった時になるべく確実に変更通知を受け取りたい

なるべく確実に変更通知を受け取るためには、普段携行している iPhone への通知が一番良さそうに思う。
iPhone への通知で一番最初に思い浮かぶのは PUSH通知 (APNS) なのだが、 APNS を利用するためには Apple への Developer 登録などが必要で、そう簡単に送る事ができないと思う (Developer 登録などが不要で簡単に PUSH 通知を送る方法があれば是非教えて下さい)。

そこで iPhone で受信しているアドレスにメールを送信し、 更に普段からチェックしている slack で自分宛にダイレクトメッセージを送信する事にした。
iPhone の設定によりメールを受信した時や slack でダイレクトメッセージが投稿された時の通知を有効にする事で、 変更通知がなるべく確実に受け取れる事になると思う。

そのために以下のスクリプトを Linux などが稼働しているサーバ設置して cron などにより自動実行する。

  1#!/bin/sh
  2
  3# site
  4url="https://www.example.com"
  5old=${HOME}/.old.html
  6new=${HOME}/.new.html
  7# for mail
  8addr="mail@exapmle.net"
  9subject="[SITE CHANGEED]"
 10body="SITE CHANGED: ${url}" 
 11# for slack
 12slack="https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ"
 13name="name"                 # post name
 14channel="#channel"          # post channel
 15
 16curl -s ${url} > ${new}
 17test -f ${old} &&  
 18cmp -s ${old} ${new} || echo "${body}" | mail -s "${subject}" ${addr} &&
 19curl -sLX POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${name}\", \"text\": \"${body}\"}" ${slack}
 20
 21mv $new $old
    
slack でチャンネルではなくダイレクトメッセージを送信する場合は channel の値を適切に変更する。
web を検索すると `channel: @名前` とすれば良いとの記事を多く見かけるが、少なくとも最近の slack ではエラーとなってしまう。
その場合、slack の web 画面の左側に表示されている `ダイレクトメッセージ` をクリックした時に遷移するページの URL の最後の部分 (https://XXX.slack.com/messages/YYYYY/YYYYY の部分) を指定するとダイレクトメッセージが送信できる。

2019/01/02

本年度初キャンプ

本年度の初キャンプとして我が家では定番となった有野実苑に行って来ました。

Image: 20190102_035637276_iOS.jpg

安定の有野実苑

今回は…なんと!薪ストーブのお披露目となりました。

冬の時期に有野実苑に来る度に薪ストーブをレンタルして温まっていたのですが、 ついに自前の薪ストーブをゲットしてしまいました。
購入するにあたって機種などを色々と調べて悩んだのですが、 手入れの簡単なステンレス製で安心の日本製という事で、 tent-mark DESIGNS のウッドストーブを選びました。 純正オプションのウォータータンクがとても便利で、 いつでもお湯が使えるのは特に冬の時期には素晴らしいです。

Image: 20190102_053327151_iOS.jpg

tent-mark DESIGNS の薪ストーブ

Coleman の T.P.Crest の前室部分にセンゴクアラジンのカセットガスストーブを設置して、 クッションマットを敷いて電気毛布でコタツ状態にした事でとても素敵な空間が出来ました。
この時期のキャンプは初めてなので寒さにおびえていたのですが、 薪ストーブ + コタツのおかげで快適に過ごす事ができました。

Image: 20190102_063358447_iOS.jpg

お座敷コタツスタイル

キャンプ場の入口付近で地元のイチゴを買って来ておやつにチョコレートフォンデュを食べたのですが、 テーブルコンロとして OPTIMUS の 8R が大活躍してくれました。

Image: 20190103_054055367_iOS.jpg

OPTIMUS 8R でチョコフォンデュ

温暖な千葉とは言えやはりこの時期は寒い様で、朝起きるとケトルの中の水が凍っていました。
水が凍る様な寒さの中でのキャンプは初めてなのですが何とかなるモンですね。

Image: 20190102_220822246_iOS.jpg

ケトルの中の水が凍結


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