rsyncで世代バックアップ及びミラーリング

2020. 3. 30 (月) | rsyncで世代バックアップ及びミラーリング はコメントを受け付けていません。

rsyncで世代バックアップやミラーリングを行うためのPHPスクリプトです。
こちらで作成したものと基本的に同内容ですが、各処理ごとに分けていたスクリプトを個人的に扱いやすいよう1つにまとめたものです。

■スクリプト

backup.php

backup_config.php

■backup_config.phpの設定

 // バックアップ元ディレクトリ
 define(‘SOURCE_DIR’, ‘/mnt/nas/’);

バックアップ元のディレクトリをフルパスで指定します。
リモートには非対応です。

 // バックアップ先ディレクトリ
 define(‘BACKUP_DIR’, ‘/mnt/nas_backup/’);

バックアップ元のディレクトリをフルパスで指定します。
リモートには非対応です。
このディレクトリ以下に、バックアップ日時を名前としたサブディレクトリとともにバックアップが行なわれます。

 // バックアップ世代数
 define(‘BACKUP_GENERATION’, 200);

世代バックアップを行いたい場合、残したい世代数を2以上の値を指定します。
1以下にすると世代バックアップはせずに最新のバックアップに対するミラーリングとなります。
後述するバックアップ先容量監視での削除や間引き処理もありますので、この世代数に達していなくても削除が行なわれる場合があります。

間引き処理は以下のものがあります。
1日以上経過したバックアップはその日の最終のもののみ残し、それ以外を削除
1か月以上経過したバックアップはその月の最終のもののみ残し、それ以外を削除

 // 世代バックアップ間隔(分)
 // 0の場合は1日間隔
 define(‘GENERATION_BACKUP_INTERVAL’, 360);

世代バックアップを行う間隔を分単位で指定します。
360で6時間間隔、720で12時間間隔になります。

 // ミラーリング時にバックアップ先となったディレクトリ名の更新(0:更新しない 1:更新する)
 define(‘MIRRORING_DIR_NAME_UPDATE’, 0);

ミラーリング時は既に存在する最新のバックアップに対してミラーリングを行いますが、ミラーリング先としたディレクトリ名を処理完了日時に合わせて変更するかを指定します。

 // 古いバックアップを削除するディスク容量閾値(%)
 // 0の場合はディスク容量のチェックは行いません
 define(‘THRESHOLD’, 95);

バックアップ先のディスクに対して古いバックアップの削除を開始する容量の閾値を%で指定します。
指定した値に達したら、それを下回るまで古いバックアップから順に削除されます。

■設置と実行スケジューリング

backup.phpとbackup_config.phpを同一ディレクトリへ保存し、crontabにて以下の設定を行います。

 * * * * * php /スクリプト設置パス/backup.php &> /dev/null

上記の例では毎分ごとにスクリプトが実行されます。
バックアップ元のディスク使用量に変化が無ければ処理を行わず終了し、排他処理も行い同一プロセスが複数同時に走らないようにもしていますので必要以上の負担はかからないかと思いますが、気になるようでしたら実行間隔を広げてください。
逆に、もっと間隔を短くしたい場合は以下のような指定方法もあります。

 * * * * * php /スクリプト設置パス/backup.php &> /dev/null
 * * * * * sleep 30; php /スクリプト設置パス/backup.php &> /dev/null

上記の例では毎分0秒と30秒に処理が実行されます。

実行した時の挙動は初回はフルバックアップ、GENERATION_BACKUP_INTERVAL で指定した間隔ごとに世代バックアップ、それ以外は最新バックアップに対するミラーリングとなります。

rsyncで世代バックアップ及びミラーリング はコメントを受け付けていません。
PC, ソフトウェア by あけび

 rsyncでの–link-destオプション使用時の挙動概要

2020. 2. 24 (月) | rsyncでの–link-destオプション使用時の挙動概要 はコメントを受け付けていません。

rsyncで--link-destオプションを使って差分履歴バックアップを取るときの挙動概要
バックアップ元(sourceディレクトリ内)にfile1~3のファイルがあるものとします。

1回目のバックアップを取ってみます。
(各パスは実際には正確に指定するものとします)

rsync -va --link-dest=../dest ./source/ ./backup1
初回バックアップ
backup1

file1
file2
file3

すべてのファイルがバックアップされます。
--link-destオプションにdestディレクトリを指定していますが、存在しないディレクトリなので無視されます。

バックアップ元のファイルを一切更新せず、1回目のバックアップをlink-destの対象として2回目のバックアップを取ってみます。

rsync -va --link-dest=../backup1 ./source/ ./backup2
バックアップ2回目
backup1

file1
file2
file3

backup2

バックアップ元のファイルは更新されていないので(backup1の中の各ファイルと同一)、全てのファイルに対してハードリンクのみが作成されます。
ハードリンクはファイルパス(ディレクトリエントリ)は複数存在しますがファイルの実体とiノードは同一のものを指している状態になります。
例えとして適切かは分かりませんが、電車のドア(ディレクトリエントリ)が複数あっても車内(iノード、実体)は同一と考えると分かりやすいかもしれません。
この状態で例えば backup1/file1 を書き換えると、backup2/file1 も同じiノードを指しているため backup2/file1 の内容も同じように変わりますが、backup1/file1 を削除しても backup1/file1 のディレクトリエントリが削除されるのみで、backup2/file1 は残ります。

バックアップ元のfile1を更新してから、2回目のバックアップをlink-destの対象として3回目のバックアップを取ってみます。

echo test >> ./source/file1
rsync -va --link-dest=../backup2 ./source/ ./backup3
バックアップ3回目
backup1

file1
file2
file3

backup2
backup3

file1(new)

バックアップ元のfile1が更新されているのでfile1のみ新たな実体ファイルとしてコピーされ、残りのファイルは引き続きハードリンクのみが作成されます。
「file1(new)」と書いていますが内容が更新されているという意味で、ファイル名に「(new)」が付加されているということではありません。

バックアップ元からfile2を削除、新たにfile4を作成したあとで、3回目のバックアップをlink-destの対象として4回目のバックアップを取ってみます。

rm ./source/file2
touch ./source/file4
rsync -va --link-dest=../backup3 ./source/ ./backup4
バックアップ4回目
backup1

file1
file2
file3

backup2
backup3

file1(new)

backup4

file4

file2は作成されず、3回目のバックアップには無かったfile4がバックアップ元からコピーされ、残りのファイルはハードリンクのみが作成されます。

ここで、1回目のバックアップを削除してみます。

1回目のバックアップ削除
rm -r ./backup1
backup2

file1
file2
file3

backup3

file1(new)

backup4

file4

backup1にあったfile1~3のハードリンクは削除されましたが、他のbackupディレクトリのファイルはこれまで通り残っています。

3回目のバックアップを削除してみます。

rm -r ./backup3
3回目のバックアップ削除
backup2

file1
file2
file3

backup4

file1(new)
file4

backup3のfile1(new)、file2、file3のハードリンクが削除されました。
他のbackupディレクトリのファイルはこれまで通り残っています。

2回目のバックアップを削除してみます。

rm -r ./backup2
2回目のバックアップ削除
backup4

file1(new)
file3
file4

backup2内のfile1、file2の実体と、file3のハードリンクが削除されました。
backup4ディレクトリのファイルはこれまで通り残っています。

バックアップ元のfile3を更新して、4回目のバックアップをlink-destの対象として5回目のバックアップを取ってみます。

echo test >> ./source/file3
rsync -va --link-dest=../backup4 ./source/ ./backup5
バックアップ5回目
backup4

file1(new)
file3
file4

backup5

file3(new)

file1(new)とfile4はハードリンクが作成され、file3(new)が新たにコピーされました。

これらの動作から、一番古いバックアップを削除し、最新のバックアップをlink-destの対象としてrsyncでバックアップすることで、上手い具合にローテーションさせつつ差分履歴バックアップが取れることがわかります。
ハードリンクの特徴をうまく利用した機能だと思います。

rsyncでの–link-destオプション使用時の挙動概要 はコメントを受け付けていません。
internet, ソフトウェア by あけび

 XubuntuとSambaでのNAS構築メモ

2020. 2. 22 (土) | XubuntuとSambaでのNAS構築メモ はコメントを受け付けていません。

Xubuntuのインストールまでは済んでいる前提です。

Xubuntu側ターミナルエミュレーターでの操作

・リモートアクセス時にわかりやすいようホスト名を変更(ここでは xubuntu-nas とします)
$ sudo nano /etc/hostname
1行だけホスト名が書かれているので xubuntu-nas に変更して保存

・SSHインストール
$ sudo apt install ssh

・再起動
$ sudo reboot

**** 再起動後 ****

WindowsPCからリモートで操作する場合はコマンドプロンプトから
> ssh Xubuntuユーザー名@xubuntu-nas
あるいは
> ssh Xubuntuユーザー名@xubuntu-nas.local
とすればパスワード入力後リモートでアクセスできます。
駄目だったら、Xubuntu側のコンソールで
$ ip a

$ ifconfig
でIPアドレスを確認して
> ssh Xubuntuユーザー名@IPアドレス
でアクセス。

・nas用共有ディレクトリ作成(ここでは /home/nas とします)
$ sudo mkdir /home/nas

・作成したディレクトリのパーミッションを変更
$ sudo chmod 0777 /home/nas

・Sambaインストール
$ sudo apt install samba

・NAS用ユーザーを作成(ここでは nasuser とします。Xubuntuの管理者ユーザー名を使う場合は不要)
$ sudo adduser nasuser
パスワードを聞いてくるので決める(2回目は確認)
ユーザー情報は全て未入力で[ENTER]でOK

・Samba用ユーザーを作成(ここでは nasuser とします。Xubuntuの管理者ユーザー名を流用する場合は同名で作成)
$ sudo pdbedit -a nasuser
パスワードを聞いてくるので決める(2回目は確認)

・smb.confを編集
$ sudo nano /etc/samba/smb.conf

行末に以下を追加

・Samba再起動
$ sudo systemctl restart smbd nmbd

********

Windows側操作

・PC(マイコンピュータ)アイコンを右クリック、「ネットワークドライブの割り当て」を選択
ドライブ: 空いている好きなドライブレターを選択
フォルダー: \\XUBUNTU-NAS\nas (参照ボタンから辿っても可)
「サインイン時に再接続する」にチェックして[完了]ボタン

「ネットワーク資格情報の入力」ダイアログが出たら、
ユーザー名: nasuser
パスワード: Samba用ユーザー作成時に決定したパスワード
を入力。
(Windowsのユーザー名、パスワードと一致している場合は出ません)

エクスプローラが表示されたらファイルやフォルダの読み書きができるか確認。
コピー、作成、編集、削除などできれば完了。

Windows側で作成したファイルをXubuntu側で見ると、ファイルの所有者が nasuser になっていると思います。
これをXubuntuの管理者ユーザを所有者としたい場合は、Samba用ユーザを管理者ユーザと同名で作成して smb.conf の valid users にそのユーザー名を指定すれば大丈夫です。
(「ネットワークドライブの割り当て」で別ユーザー名で割り当てたドライブ名が残っている場合は「ネットワークドライブの切断」で一旦切断してあらためて接続し直す必要があります)

********

USBハードディスク等、外付けドライブをNASのシェア対象にしたい場合

Xubuntu(Ubuntu)の場合はNTFSも読み書きできるようですが、ここではXubuntuでもデフォルトで使われているext4にしてみます。

まずUSBドライブを接続します。
接続すると大抵自動的に /media/ユーザー名/ 以下にマウントされますので、それを頼りにdfコマンドでデバイス名を調べます。
$ df
該当する位置にマウントされているデバイス名を控えておきます。
例: /dev/sdb1
環境によって変動しますので実際に確認してください。

マウントされていないようだったら、blkidコマンドで調べてください。
$ sudo blkid

・アンマウントします
$ sudo umount /dev/sdb1

・mkfsコマンドでラベル「USB-HDD」を付けてext4にフォーマット
$ sudo mkfs -t ext4 -L USB-HDD /dev/sdb1

・フォーマット完了したUSBドライブのUUIDを調べます
$ sudo blkid
フォーマット時に付けたラベルが LABEL=”USB-HDD” のように表示されていますので、そのデバイスのUUIDを控えておきます。
例: 89999481-ced4-480b-9e5f-20278bf543db

・外付けドライブ用のマウントポイントを作成します。
ここでは「/home/usb1」としておきます。

ディレクトリ作成
$ sudo mkdir /home/usb1

パーミッション変更
$ sudo chmod 0777 /home/usb1

・/etc/fstabに追記
$ sudo nano /etc/fstab

最終行に以下を追記します。
UUID=控えておいたUUID マウント先 ファイルフォーマット nofail 0 0

/etc/fstab に書き込んでおくと再起動時やmount -aコマンド実行時に、指定されたマウントポイントにマウントされます。
取り外されることもあるデバイスですのでnofailを指定しています。
nofailではデバイスがあればマウントし、無ければ無視されます。

・再マウント
$ sudo mount -a

・マウントされたか確認
$ df

・マウントされたのを確認したら再度パーミッション変更(マウントポイントではなく外付けHDD側のパーミッション変更になります)
$ sudo chmod 0777 /home/usb1

・smb.confを編集
$ sudo nano /etc/samba/smb.conf

行末に以下を追加

・Samba再起動
$ sudo systemctl restart smbd nmbd

以降、同じようにWindows側からネットワークドライブとしてアクセスできます。

・PC(マイコンピュータ)アイコンを右クリック、「ネットワークドライブの割り当て」を選択
ドライブ: 空いている好きなドライブレターを選択
フォルダー: \\XUBUNTU-NAS\nas-usb
「サインイン時に再接続する」にチェック

NASとして使用しているPCでブート順位がUSBドライブ優先になっていると、USBドライブを繋いだまま再起動させた場合システムが立ち上がらない場合もありますので起動優先順位を変更しておいてください。

ここに記載した内容をもとに、システム(内蔵ドライブ)、データ(外付けドライブ)、バックアップ(外付けドライブ)と分けて構築し直した際の記事をnoteへ書いています。

XubuntuとSambaでのNAS構築メモ はコメントを受け付けていません。
PC by あけび

 EC-CUBE4用 スクロールページャー

2020. 2. 2 (日) | EC-CUBE4用 スクロールページャー はコメントを受け付けていません。

いわゆる無限スクロールに対応させるものですが、EC-CUBE4に特化させたかったので既存の無限スクロール支援ライブラリは使用していません。
普段は私自身jQueryもあまり使いませんが、EC-CUBE4がデフォルトでjQueryを使用しているので今回は使用しています。

ファイルダウンロード

 導入方法

verticalScrollPager.js の中身を html/user_data/assets/js/customize.js へ、
verticalScrollPager.css の中身を html/user_data/assets/css/customize.css へ
それぞれコピペすれば導入完了です。
ブラウザキャッシュが邪魔になる場合がありますので、その場合は必要に応じてキャッシュ対策等も行なってください。

デフォルトでスクロールでのページングになっていますが、件数/並び順プルダウンの上にある指アイコンをクリックすることで従来のページ遷移にも切り替えられます。(押すごとにトグル切替)

スクロールでのページング時にも現表示ページ数確認用も兼ねて画面下部に従来の遷移型ページャーを表示させていますが、邪魔であればページャー部分の余白部分か、スクロールページ内にあるページ区切り帯のページ数表示部分をクリックすれば消すことができます。
再度押すと再び表示します。

通常のページ遷移で途中ページから表示させた場合、それより若いページへスクロールで遡る動作には対応していません。

使用をやめる場合は、customize.js、customize.cssへそれぞれコピーした該当コードを削除するだけで元に戻ります。

次ページローディング中に画面下部へ表示させているCSSアイコンは、以下のサイトで作成したCSSコードを使わせていただきました。
CSSだけで作るloadingアイコンメーカー

EC-CUBE4用 スクロールページャー はコメントを受け付けていません。
ソフトウェア by あけび

 PHPとrsyncでディレクトリをローテーションバックアップ

2020. 1. 18 (土) | PHPとrsyncでディレクトリをローテーションバックアップ はコメントを受け付けていません。

通常ならこういったバッチ処理は.sh等のシェルスクリプトで記述するところかと思いますが、個人的に使い慣れたPHPで書いています。

PHPで行なっているのはローテーションさせるためのバックアップ先ディレクトリ名の管理くらいで、バックアップ処理そのものは単純にrsyncに任せています。

使用方法

backup.phpと、バックアップ対象パスなどrsyncへ渡すオプションを設定するbackup_config.phpを同一のディレクトリへ置いて使用します。
ローテーション回数の設定はbackup.php側にあります。
ローテーション回数を2以上に設定すると、--link-destオプションを使用した差分バックアップを行います。初回はフルバックアップになりますが、2回目以降は変化のなかったファイルに対してはハードリンクのみを作成し、変化のあったファイルのみが実体ファイルとしてコピーされますので、ローテーション回数が比較的多めでもディスク消費量やバックアップにかかる時間を必要最小限に抑えることができます。
動作の概要についてはこちらを。

ローテーションを1回に指定した場合は--link-destオプションは使わず、既存のバックアップの中のいちばん新しいものに対して、--deleteオプションを付けて実行します。
ローテーション有り(2回以上)か無し(1回)かのどちらか一方で動作させるだけでも良いですが、backup.phpを例えばbackup_sub.phpという名前でコピーし、backup.php側をローテーション指定で1日1回実行、backup_sub.php側をローテーション無し(1回)指定で例えば1時間おきに実行させることで、1時間おきに最新の状態にミラーリングさせつつ、1日1回履歴バックアップを残すといった使い方もできます。

PHPファイルですが、Webアプリケーションではないのでシェルから実行します。

 $ php /スクリプト設置パス/backup.php

YYYYMMDD_hhmmss.bak という名前のディレクトリにバックアップ、
YYYYMMDD_hhmmss.log にrsyncのログを保存します。

cronでスケジューリングする場合は以下のようになります。
設定例(毎日午前4時に実行)

 # rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null

設定例 毎日午前4時に履歴差分バックアップをしつつ、毎正時にミラーリング
(backup.php側でローテーション回数2以上で設定、backup.phpをコピーしたbackup_sub.php側でローテーション回数1を指定している前提です。)

 # main rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null
 # sub mirroring
 0 * * * * php /スクリプト設置パス/backup_sub.php &> /del/null

設定によっては複数が同時に実行開始される場合がありますが、実行の際にはロックファイルを用いて排他処理しているので、同時に複数のバックアップ処理が回ってしまうことはありません。
また、ローテーション無しでの実行の場合はバックアップ開始まで5秒遅らせるようにしてありますので、同時に走り出してもローテーション有りのほうが優先して実行されるようになっています。

オプションでold_delete.phpとcapacity_check.phpも用意しました。
backup.phpでローテーション回数を多く設定した場合のサポート的な位置付けです。
使用する場合は、どちらもbackup.phpと同じディレクトリへ設置してください。
old_delete.phpは古いバックアップを間引くスクリプトで、1日以上経過したらその日のバックアップの中で最終のものを残して削除、1か月以上経過したらその月のバックアップの中で最終のものを残して削除します。
capacity_check.phpはバックアップディスクの容量をチェックし、指定した割合に達したら下回るまで古いバックアップから順に削除するスクリプトです。
どちらか一方でも、両方設置しても問題ありません。

cronでスケジュール実行する場合は、1日1回程度backup.phpとは時間をずらして実行すればよいかと思います。

設定例 old_delete.phpを毎日5時に、capacity_check.phpを毎日5時5分に実行するよう設定しています。

 # main rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null
 # sub mirroring
 0 * * * * php /スクリプト設置パス/backup_sub.php &> /del/null
 # olddata delete
 0 5 * * * php /スクリプト設置パス/old_delete.php &> /dev/null
 # diskcapacity check delete
 5 5 * * * php /スクリプト設置パス/capacity_check.php &> /dev/null

スクリプト

backup.php

backup_config.php

old_delete.php

capacity_check.php

PHPとrsyncでディレクトリをローテーションバックアップ はコメントを受け付けていません。
PC by あけび

 PHPで画像表示およびconvertコマンドでサムネイル生成

2020. 1. 9 (木) | PHPで画像表示およびconvertコマンドでサムネイル生成 はコメントを受け付けていません。

何をするもの?

WEBサイト上でデフォルトサイズの画像ファイルを元に自動的にサムネイル画像を作成し、サムネイル画像作成の手間を省くのと通信容量を必要最小限に抑えることを目的としたものです。

動作条件

サーバ上で以下のものが動作することが前提です。

 PHP
 .htaccess 及び mod_rewrite
 ImageMagickのconvertコマンド

ImageMagickはインストールされていてもPHP用ImageMagickモジュール(imagick)まではインストールされていない場合も多いのと、convertコマンドのほうが私にとっては扱いも手っ取り早いのでこちらを使用しています。

設置方法

対象とする画像ファイルのあるディレクトリに
.htaccess
thumbnail.php
をアップロードするだけです。

ファイルをダウンロード

使用方法

WEBブラウザから、通常通り画像がアップロードされているディレクトリのURLを指定します。

https://akebi.jp/thumbnail_sample/sample.jpg

サムネイルを表示する場合は、?t=サイズ オプションを使います。

https://akebi.jp/thumbnail_sample/sample.jpg?t=200
.htaccess に記載した mod_rewrite の記述が、画像ファイル名とそれに付けたクエリパラメータを thumbnail.php に渡す役割をしています。
ここで Internal Server Error が表示された場合は残念ながら convert コマンドが使用できないと思われます。

t= で指定したサイズは、thumbnail.php 内で設定してあるサイズに一番近いものに補正されます。
サイズの種類を増やすこともできますが、あまり多く設定するとその分キャッシュファイル用フォルダも多く作られますので、サーバ容量に余裕がない場合はご注意ください。

その他のクエリパラメータ

s: (squareの略) 正方形でない画像から中央部分を取り出して正方形化
https://akebi.jp/thumbnail_sample/sample.jpg?s

sf: (square fillの略) 正方形でない画像の短辺側に余白色を追加して正方形化
https://akebi.jp/thumbnail_sample/sample.jpg?sf

p: (progressiveの略) JPEG、PNG画像をプログレッシブ(インターレース)化
https://akebi.jp/thumbnail_sample/sample.jpg?p

複数のクエリパラメータを合わせて指定できます。
https://akebi.jp/thumbnail_sample/sample.jpg?t=200&sf

処理の概要

 画像ファイル名が渡される
   ↓
 有効なクエリパラメータは付いているか
   │       ↓
 付いている   付いていない
   │       ↓
   │     オリジナルの画像をそのまま表示
   ↓
 クエリパラメータに対応する画像キャッシュファイルは存在するか
   │       ↓
 存在しない   存在する
   │       ↓
   │     対応する画像キャッシュファイルをそのまま表示
   ↓
 convert コマンドにて対応する画像キャッシュファイルを生成、表示

convert コマンドで作成された画像はサーバ側にキャッシュすることで、以降同じ条件のパラメータで呼ばれた場合には無駄に convert コマンドが実行されないようにしています。

画像ファイル表示処理に関しても、ブラウザから受け取ったリクエストヘッダ内に If-None-Match ヘッダがあるかを確認し、If-None-Match があって画像に対応する ETag との比較結果が一致していれば、HTTP レスポンスステータスとして Not Modified を渡し画像データ自体は送信しないことで、ブラウザ側のキャッシュファイルを有効に働かせ無駄に通信も行なわないようにしています。

使用を中止する場合

画像ディレクトリにアップロードした .htaccess と thumbnail.php 、thumbnail.php によって作成された thumbnail から始まるディレクトリとその中の画像キャッシュファイルを削除して下さい。

参考

ImageMagick Command-line-Tools: Convert
MDN HTTPヘッダー

PHPで画像表示およびconvertコマンドでサムネイル生成 はコメントを受け付けていません。
internet, ソフトウェア by あけび

 Raspberry Pi Zero用 簡易UPSの作成

2019. 4. 26 (金) | Raspberry Pi Zero用 簡易UPSの作成 はコメントを受け付けていません。

電気二重層コンデンサ(スーパーキャパシタ)を使用して、ラズパイZero用の簡易UPSを作成してみました。
あくまでACアダプターが不意に抜けたり停電が発生した場合に安全にシャットダウンさせるだけの時間的猶予を確保するのが目的で、これだけで長時間稼働させられるものではありません。
(コンデンサの容量やラズパイの動作状態にもよりますが、数分程度です)
Zero基準で作ったものですので、消費電力の大きなモデルでは各パーツを適宜変更する必要があるかと思います。

回路と主な使用パーツ

■電気二重層コンデンサ
5V 10F程度あれば、アイドリング状態のラズパイZeroを2~3分程度稼働させる電力が得られます。
(電圧はDC-DCコンバータ等で5Vに安定化する必要があります)
私は手元に2.7V 3.3Fのものがいくつかあったので、これを4並列x2直列で5.4V 6.6F相当として使いました。
5Vでの充電なのでコンデンサの耐圧まで0.4V残っていますが、これくらいであればマージン分と割り切ってもいいでしょう。
気になるようなら充電側にもDC-DCコンバータを入れて充電電圧を5.4Vにする手もあります。
並列は単純に繋げば大丈夫ですが、直列部分はバランス抵抗を入れるなどして均等に電圧がかかるようにしないと、充電状態のばらつきなどで耐圧を超えて充電されてしまうものが出る場合があるので注意が必要です。
面倒であれば最初から耐圧5V以上のものを使ったほうが良いですね。
例えばこれなんかはサイズの割に容量も大きくて良さそうです。
耐圧5.6Vですが、USB ACアダプタの5Vで充電、DC-DCコンバータにTPS63020(最低動作電圧1.8V、変換効率約90%)を使うと仮定して、消費電流500mAの機器で6分弱、150mAの機器であれば20分弱稼働できる計算になります。
コンデンサの静電容量を電池の放電容量に置き換えて考えるために以前作成した変換スクリプトもありますので、使いたいコンデンサの容量を決める際の目安にどうぞ。

TPS61020可変型低電圧DC-DCコンバータモジュール
テキサス・インスツルメンツ社のTPS61020を搭載した、Strawberry LinuxさんのDC-DCコンバータモジュールです。
電気二重層コンデンサは電池と違って直線的に電圧が下がっていくので、このコンバータでラズパイを動作させるための5Vに変換するために使用します。
入力電圧0.9Vまで動作してくれますので、電気二重層コンデンサに溜めた電荷を結構無駄なく使ってくれます。
500mA程度の負荷電流を供給できるのでラズパイZeroであればまだ余裕がありますが、ラズパイ3などではより大きな負荷電流を流せるTPS63020等を検討する必要があるかもしれません。

■ショットキーバリアダイオード SBM1045VSS
コンデンサの電流逆流防止用

定電流源IC NSI50350AS
電気二重層コンデンサは容量が空の時には抵抗がほぼ無く、ゼロからの充電開始時は電源ラインを短絡したのと同様の状態になってしまい、使用している電源によっては負担やダメージを与えてしまいますので、これで電流を制限しています。
350mAを3個並列で使って約1A相当で制限がかかるようにしました。
ラズパイ3等ではここも余裕を持たせる必要があるかと思います。

■各抵抗
アダプタから5Vが供給されている場合と、供給が切れて電気二重層コンデンサ駆動になった場合とでの状態変化をGPIOへ送る電圧を作っています。
この抵抗値の組み合わせだと、他のパーツとの兼ね合いもありますがアダプター供給時に2.4~2.6V前後、供給が切れた時に0.2~0.4V前後になります。
3.3Vと0Vできっちり分かれていませんが、これくらいの電圧であれば迷うことなくHIGH/LOWを判別できるようです。

スクリプト

該当GPIOピンの状態を監視して、アダプターからの電源供給が断たれて15秒経過したらシャットダウン、15秒以内に電源の供給が復帰したらそのまま続行という流れで動作させています。
起動時に自動実行するよう /etc/rc.local に追記して使っています。

実装例と動作の様子



前回記事で電波時計リピーターを作成しましたが、私は今回はその基板の空きスペースにUPSを追加する形で実装しました。
ラズパイZero本体に加えて基板自体も電気二重層コンデンサでのバックアップ範囲としてあるのでラズパイ本体のみの場合よりも猶予時間が短いですが、それでも実測で1分半は持っていますので、最初の15秒を復帰猶予時間としてその後シャットダウンさせても十分間に合っています。

おまけ

稼働時間計算機

電気二重層コンデンサ
静電容量(F)
充電電圧(V)

DC-DCコンバータ
最低動作電圧(V)
変換効率(%)

負荷
電圧(V)
平均消費電流(mA)

稼働時間:

Raspberry Pi Zero用 簡易UPSの作成 はコメントを受け付けていません。
Raspberry Pi, ソフトウェア, ハードウェア by あけび

 Raspberry Piを使用した電波時計リピーター

2019. 4. 13 (土) | Raspberry Piを使用した電波時計リピーター はコメントを受け付けていません。

ラズパイを使用した電波時計リピーターです。
実際に受信した電波をあらためて送信し直すのではく、ラズパイの日時情報から生成したタイムコードを送信するものですので、正確にはリピーターではなくシミュレータですが、この手の既存製品もリピーターと呼ばれていることも多いので、ここでもリピーターと呼びます。

回路について

主に
・ラズパイからのタイムコード受け取り部
・キャリア信号発振部
・信号加工部
・スイッチング、送信部
からなります。

5Vの電源は基板側へACアダプタを接続し、コネクタを通してラズパイへ供給しています。

キャリア信号の生成は40kHzまたは60kHzの水晶振動子を使っています。
両方使いたい場合はスイッチで切り替えるようにしても良いと思いますが、私は2ピンソケットで差し替えるようにしました。
ラズパイの別のポートを使って切替制御することも可能かと思いますが、稼働させ始めたらそれほど頻繁に切り替えるようなものでもないので、今回は見送り。

信号加工はCD4011というNANDゲートのICを使用しています。
水晶振動子を使った発振回路用のXORゲート、ラズパイからのタイムコートパルスと発振回路のキャリア信号のNANDゲート、それをさらに反転させるためのXORゲートとして使っています。

スイッチングにはパワーMOSFETを使用。
送信は自作のフェライトバーアンテナと、外部アンテナとして適当なリード線を使用。
私が使ったフェライトバーは昔ラジオから取り出して温存しておいた、断面が6x12mm、長さ70mmの角型のもの。
それに0.29mmのポリウレタンワイヤーを、1次側10m、2次側5mほど巻きました。
壊れた電波時計などがもしあれば、そこからフェライトバーを取り出して流用するのもいいのではないでしょうか。
電波到達距離はフェライトバーアンテナのみで50cmほど、リード線を付けて部屋の中いっぱいくらいでした。
このアンテナ次第で電波の飛びが大きく変わったりしますが、この辺あまり詳しくないので詳細は省きます…
あまり強くしすぎると電波法にも引っかかってくるのでご注意。

回路図とパーツ配置例
 
回路設計については素人同然ですので詳しい方から見ればツッコミどころも多々あるかと思いますが、目を瞑っていただければ(^^;

作成した基板と、ラズパイZeroを挿した様子
  
離れた位置にも水晶振動子が一個挿さってますが、単に使っていないほうを無くさないための置き場所です。
水晶振動子は小さい上に足も細く抜き差しして使うにはあまり向いていないので、ピンソケットをハンダ付けして使っています。

水晶振動子を使った発振回路部分は、部品個体差などの影響が出やすい箇所かと思います。
当初、C1とC2それぞれ15pFで仮組みしてみましたが、発振周波数を見てみると40kHzの振動子で80kHz、60kHzの振動子で120kHz出たり、触るとふらついて更に増減したりと不安定でしたが、最終的にC1側に15pFを1個、C2側に15pFを2個並列で30pF(回路図では30pFを1個として書いています)とすることで、40kHz、60kHzどちらの振動子でも安定して目的の周波数で発振してくれるようになりました。
実は今回の製作中でいちばん手こずった部分でもありますが、いちばん楽しかった部分でもあります。

この辺りの試行錯誤は、こちらのページの情報が大変参考になりました。
水晶発振回路の豆知識/なひたふ新聞

調整しているうち、40kHzの振動子では正しく発振するのに60kHzの振動子ではおかしい(あるいは逆)という状態になることもあるかもしれませんが、どうしても両方で正しく発振するよう調整しきれなければどちらか一方で手を打つか、CD4011のNANDゲートの空き1個も使って40kHz用と60kHz用それぞれ別に発振周りの回路を作り、スイッチかジャンパで選択するようにしてしまうのも手かもしれません。
あるいは水晶振動子ではなく、LTC1799のようなオシレータを使うのも有りかと思います。
(LTC1799を使ったこともありますが、これはこれで半固定ボリュームでの微妙な調整が難しかったです)

マルチメーターで簡易的に発振周波数を確認している様子

稼働中の様子

発熱に関しては、既に数日稼働させていますがCPUの裏あたりを触るとほんのり温かく感じる程度なので、とくに心配することもなさそうです。
(ずっと稼働させている状態で、室温25℃の時に vcgencmd measure_temp で確認したCPU温度は36℃程でした)

稼働状態の消費電力も監視してみましたが、基板とラズパイZeroを接続した状態でラズパイ起動時には最大200mA程、起動完了後しばらくして安定し始めたらだいたい平均100mA前後でしたので、ほとんどラズパイZero単独で稼働させた時と同じでした。
とはいえ、回路の作り方(特にフェライトバーアンテナ)によっても変わってくるかと思います。

スクリプト

■ JJYシミュレータ(jjy.py)

シミュレータ本体。
Pythonで書かれています。
JJYのタイムコードをシミュレートしてラズパイのGPIOポートに出力します。

設置パス例
/home/pi/script/jjy.py
設置したファイル jjy.py のパーミッションを0744にしておきます。

後述の送出タイムコード日時変更ユーティリティを使用する場合は、
/home/pi/script/ に jjy_adjust.txt という空ファイルを作成してそのファイルのパーミッションを0666にしておきます。

> /home/pi/script/jjy.py
でフォアグラウンドプロセスとして(通常の状態として)実行できます。
実行中はCtrl+Cで中断できます。

バックグラウンドプロセスとして実行する場合は

> /home/pi/script/jjy.py > /dev/null &
(末尾に「&」を付けるとバックグラウンド実行になります。「> /dev/null」はそのプロセスの画面表示を非表示にするためのものです)
バックグラウンドプロセスはCtrl+Cでは中断できません。
> ps -A
で実行中のプロセスIDを検索して
> kill プロセスID
とするか、
> pkill ^jjy\.py$
で中断できます。

起動時に自動でバックグラウンド実行させたい場合は、

> sudo nano /etc/rc.local
として /etc/rc.local を開いて
末尾のexit 0という行より手前に
/home/pi/script/jjy.py > /dev/null &
を追記して保存します。
再起動後より自動実行が有効になります。

自動実行させる方法は /etc/rc.local への追記以外にもいくつかありますが、ここでは割愛。

ラズパイ内部の時計を正確に保つため、ntpdでnictのNTPサーバへ同期するよう設定しておくのもいいと思います。
最新のRaspbianではntpdが入っていないという話も聞きますので、「ラズパイ ntpd インストール」で検索すれば、私がここで説明するよりずっと分かりやすく解説されている記事がたくさん見つかると思います。

実際のJJYの標準電波には毎時15分と45分の40秒台の9秒間、モールス信号でのJJYコールサインがありますが、電波時計にとってそれは必要無いというかむしろノイズでしかないので、本シミュレータでは実装していません。
コールサインもお聞きになりたいのであれば、聴感上の再現を主としてJavascriptで作成したこちらをどうぞ。

■ JJYシミュレータ用 送出タイムコード日時変更ユーティリティ(index.php)

リピーターが送信するタイムコードの時刻設定を他のPCやスマホのWEBブラウザから変更するためのスクリプトですが、こちらは設置しなくてもリピーターは動作します。
PHPで書かれています。
ラズパイ上でApache2等のwebサーバを稼働させている必要があり、PHPのインストールも必要です。

設置パス例
/var/www/html/jjy/index.php

同一ネットワーク上のブラウザから
http://raspberrypi/jjy/
http://raspberrypi.local/jjy/
http://[192.168.xxx.xxx等、ラズパイのローカルネットワーク上でのIPアドレス]/jjy/
等のURLでアクセスできます。
設定や環境によって変わる場合もありますので、その場合は適宜調べてください。
インターネット経由での外部からのアクセスは不可。あくまで同一LAN上からのアクセスに限ります。
インターネット経由でアクセスできるようにする方法もありますが、リピーターの時刻補正に外部からのアクセスは不要ですのでここでは触れません。

実行すると、jjy.plが送出するタイムコードを実際の日時に対して進めたり遅らせたりするための更新画面が表示されます。
ここで設定されるものはあくまで「どれだけずらすか」という現在時刻との相対時間のみですので、ラズパイ自身の時刻設定そのものが変更されることはありません。

日時設定変更ユーティリティの操作感の確認用サンプル

jjy.pyを別のPCからSSH経由でフォアグラウンドプロセスとして実行させ、ブラウザからタイムコードの送出日時設定変更を行ない、変更した設定が反映される様子

適当なケースに収納。
ケーブル類は短めの延長コードでケース外へ。
  

使用した主な部品リスト

ピンソケット 2×20
ラズパイとの接続用

水晶振動子 40kHz
標準電波のキャリア信号発生用

水晶振動子 60kHz
標準電波のキャリア信号発生用
必要なほうどちらか片方だけでも大丈夫です。

積層セラミックコンデンサ 15pF
当初15pFで設計しましたが、発振周波数が2倍、3倍となったりして不安定だったので並列に増減しながら様子を見て、C1側15pF、C2側並列2個で30pFで落ち着きました。

抵抗 10MΩ

抵抗 220kΩ

CD4011BE 4回路NANDゲートIC
手持ちがあったのでこれを使いましたが、SN74HC00N等でも構いません。
回路図でのピン番号の違いは適宜読み替えて下さい。

ICソケット 14pin
無くても大丈夫。
ハンダ付けの熱でICを壊さないか心配な場合はあったほうが安心。

2SK2232 パワーMOSFET

■ 適当なフェライトバーアンテナ

■ 外部アンテナ
付けなくてもフェライトバーアンテナのすぐ近くであれば届きますが、私はたまたま手元に余らせていた3.5mmミニプラグのオーディオケーブルをアンテナとして使ってます。
既存ケーブルを流用する場合は、芯線だと物によってはシールドされている場合もあって電波が飛ばないので、ケーブルのGND側に結線。

3.5mmミニジャック
3.5mmオーディオケーブルを外部アンテナとして流用する場合の接続用

■ LED
手元にあった1.8mm白色チップLED

■ LED保護及び輝度調整用の抵抗
抵抗値が低ければ明るく光りますが、低すぎたり抵抗を繋がなかったりするとLEDに電流が流れすぎてすぐ切れます。
逆に抵抗値が高ければ暗くなりますが、高すぎると電圧が足りず全く光らなくなります。
私は手元にあった24kΩのを使ってます。
24kΩだとかなり暗いですが、照明用途ではなくタイムコードのパルス確認用なので、明るすぎないのはむしろ好都合。

ユニバーサル基板
回路が収まれば何でもいいです。
せっかく小さなZeroを使うので、それに合わせた小さな基板にまとめてもいいかもしれません。

マイクロUSB端子
回路の電源供給用です。
電源自体は市販のUSB ACアダプター等を使ってください。

丸ピンソケット 1×12
いくつか切り離して水晶振動子差替え用のソケットにしました。

■ Raspberry Pi Zero WH
タイムコードシミュレート及びパルス制御させる本体。
他のラズパイでも大丈夫かと思いますが、常時稼働する前提なので消費電力の少ないZeroで、更にWi-Fiによる設定変更やNTPサーバとの同期、コネクタ接続も必須なのでWHが最適。
こんな小さなロジックボードひとつでサーバとしての機能がパワーはそこそこであれひと通り実現できてしかも安く入手できるのですから、いい時代になったものです。

■ タカチ電気工業 SS型プラスチックケース(SS-160W)

Raspberry Piを使用した電波時計リピーター はコメントを受け付けていません。
internet, Raspberry Pi, ガジェット, ソフトウェア, ハードウェア by あけび

 JavaScriptで動作する標準電波シミュレータ

2019. 2. 26 (火) | JavaScriptで動作する標準電波シミュレータ はコメントを受け付けていません。

電波時計が時刻補正に用いている標準電波のタイムコードをJavaScriptでシミュレートして送出するスクリプトを作成しました。
標準電波シミュレータ

Webブラウザで実行しているものですので、PCやスマホ等、多数の機器で使用可能です。

当方では、
Windows10:InternetExplorer11、Firefox、GoogleChrome、MicrosoftEdge
MacOS:Safari、Firefox、GoogleChrome
iOS:Safari
Android:GoogleChrome
で正常に動作し、音声信号も出力されるのを確認しています。


WindowsPCにイヤホンを繋いで腕時計の時刻設定を変更するテスト


iPod touchのスピーカーと向かい合わせて置時計の時刻設定を変更するテスト

JavaScriptで動作する標準電波シミュレータ はコメントを受け付けていません。
iPad, PC, ガジェット by あけび

 PENTAX K-S1 撮影した結果が暗くなる

2018. 9. 12 (水) | PENTAX K-S1 撮影した結果が暗くなる はコメントを受け付けていません。

私の使用機種はK-S1ですが、K-50/30/S2などでも同様の症例があるようです。
ちなみにうちで症状が出始めたのは、購入後3年ほど経った頃から。

K100D/200Dも所持していますが、こちらは同様の症状は出ていません。

・症状の内容
 設定したF値に関わらず、レリーズ時には完全に絞った状態で撮影されてしまう。
 レンズを交換しても症状は出る。また、他のボディーでは症状は出ないのでレンズ側が原因ではない。
 接点をクリーニングしても変わらない。

・ファインダー撮影時
 何が写ってるか分からないほど暗い。
 レタッチで明度を上げると、暗いなりに何か写っているのは確認できる。

・ライブビュー撮影時
 写ることは写るが、やたらレリーズ時間が長かったりする。
 モニター画面上のプレビュー表示は暗い状態から増感されているためノイズが多く、周囲の明るさによっては増感しきれず暗い場合もある。

・動画撮影時
 設定したF値に関わらず実際の絞り羽根は絞り切られているため増感されてノイズが多く、周囲の明るさによっては増感しきれず暗い場合もある。

写真撮影時にライブビューモードにすると、絞り(設定上のF値ではなく実際の絞り羽根の状態)は開放からちょっと絞られているくらいが正常(写真1)なのに対し、この症状が出ている時は完全に絞られた状態(写真2)になっている。
写真1 写真2

この状態の時、ライブビューモードのON/OFFを何度か繰り返していると正常な開き具合に戻ってくる。(動画参照)


正常な開き具合になったら、ファインダー撮影でもしばらく正常に撮影できる。

普通に何度か撮影しているうちに回復してくることもありますが、上記の方法なら絞り羽根の状態を見ながら回復するまで繰り返せますし、余分なファイルを削除する手間も無いのでいくらか楽でしょう。

とりあえず今のところはこれで回復できていますが、症状がさらに進行したらこの方法でも回復不能になるかもしれません。

PENTAX K-S1 撮影した結果が暗くなる はコメントを受け付けていません。
カメラ by あけび