2015/03/02(月)通信回線活性管理ファームウェアを開発しました

こんな記事書いている状況には無く、仕事しなければならんのだが、、、orz
現状、TCP/IP 通信によるインターネット回線断検出には、Ping と呼ばれる手法が広く使われています。

今般開発したファームウェアは、Ping手法でインターネットやLAN・サーバ・ルータ等の回線断管理(活性管理)を行う機器の心臓部分にあたります。

Ping で指定したサーバ等へパケット到達が確認できなかった場合、リセット信号を発生させるような仕組みになっています。
このような機器は既に溢れていますが、構成の自由度があるものは皆無でしたので、取引先の強い要望もあり、制作した次第です。
20150302.jpg

このボード単体では、対象装置のリセット等(自動的にAC電源をOFF/ONする)は出来ません。相応する外部回路・電磁リレー・電源・収納ケースなどを外付けする必要があります。

また、このボードは トライステート社の (新)PIC-NIC をそのまま流用しています。
弊社は、トライステート社 (新)PIC-NIC 上で動作する 通信回線活性管理ファームウェアを開発しただけで、(新)PIC-NIC は別途用意していただくことになります。
(新)PIC-NIC 搭載のファームウェアをごっそり入れ替えることで機能を実現しています。

完成品とキットの販売両方考えていますが、秋月電子通商で販売されている (新)PIC-NIC キット本体価格 ¥7,800 よりはどうしても高額になってしまうことはご容赦願います。

2015/01/27(火)ImageMagickライブラリによる塗りつぶし

殆ど事例が紹介されていなかったので、自分メモ
20150127.png
これは、筆者が開発作業で制作した、気象庁によるXML配信データを基に生成した、日本近海の海上(気象)警報を視覚化したものです。
https://www.basekernel.jp/pc/weather/fishcond/index.html

図中の黄色や橙色、水色は、閉塞領域の単純な塗りつぶしですが、このような簡単な事例が検索してもなかなか出てこない。
昔のパソコンで一般的だった BASIC だと、
paint(X,Y), colorcode,bordercolor1,bordercolor2
みたいにするだけで任意の座標 X,Y を含む bordercolor で示す閉塞領域をcolorcode で塗りつぶすことが出来たのですが、これと同じことをする手法が判らない。

結局、 ImageMagick の本家でそれらしきものを見つけて、わかりにくい説明を基に試行錯誤しました。

いつもの例によって Perl でのやり方ですが、
use Image::Magick ;                     # 画像描画ライブラリ使用宣言
で、ライブラリを宣言し、
 $image = new Image::Magick ;            # 操作オブジェクト生成
 $image->Read('seamap.png') ;            # 元の画像ファイルを読み込む
 $image->FloodfillPaint(x => $position_x,
                        y => $position_y,
                        channel => All,
                        fuzz => '20%',
                        fill => $paintcolor) ;
 $image->Write('seamap.png') ;           # 操作後の画像をファイルに書きだす
 undef ($image) ;
のようにします。
書き出す際のファイル形式は、読み込んだときのファイル形式がデフォルトになるようですが、詳しく検証していません。
FloodfillPaint という関数呼びだしが塗りつぶし処理そのもの。
x に塗りつぶしたい領域を含むX座標(水平方向の座標)、
y に塗りつぶしたい領域を含むY座標(垂直方向の座標)、
fill に塗りつぶしたい色を、rgb文字列形式で指定します。
#ff0000 とすれば赤、#00ff00 とすれば明るい緑、#0000ff とすれば青、
#ffff00 とすれば黄、#ffffff とすれば白、#000000 とすれば黒、
といった具合です。
fuzz は、境界のあいまいさのようなもので、この数値を減らせば境界色判定がシビアになり、数値を増やすと、多少違った色でも塗りつぶしを行うようになります。
fuzz の数値は、実際に試しながら設定するのが早いです。

2015/01/11(日)いまどきのWebページにおけるボタン作成

HTMLが一般化しておよそ20年になりますが、
デザイン化されたリンクボタンは、gif や png 、凝ったものになると jpg で組むのが一般的でしたが、最近は CSS で作るのが一般的になりつつあるようです。
簡単にここまで出来るという一例ということで。。

《HTML側》
 <a class="button"
    style="color:#422; background-color:#3aaef3; text-shadow:1px 1px #344;"
    href="********.html">サイト更新情報<span style="font-size:8pt;"> 2014/12/22 更新</span></a><br>
 <a class="button"
    style="color:#422; background-color:#e66bf3; text-shadow:1px 1px #344;"
    href="********.html">北海道の歴史綴<span style="font-size:8pt;"> 2014/12/22 更新</span></a><br>
 <a class="button"
    style="color:#422; background-color:#ff9d3c; text-shadow:1px 1px #344;"
    href="********.html">北海道の交通綴<span style="font-size:8pt;"> 2014/12/22 更新</span></a><br>
 <a class="button"
    style="color:#422; background-color:#ff9d3c; text-shadow:1px 1px #344;"
    href="********.html">北海道の道の駅<span style="font-size:8pt;"> 2015/01/08 更新</span></a><br>
 <a class="button"
    style="color:#422; background-color:#ddf14b; text-shadow:1px 1px #344;"
    href="********.html">不都合な真実集<span style="font-size:8pt;"> 2014/12/22 更新</span></a><br>
 <a class="button"
    style="color:#422; background-color:#bec970; text-shadow:1px 1px #344;"
    href="http://hankakusai.basekernel.co.jp/">はんかくさい日報  <span style="font-size:8pt;">不定期更新</span></a><br>
 <a class="button"
    style="color:#422; background-color:#3fed77; text-shadow:1px 1px #344;"
    href="********.html">サイトリンク集<span style="font-size:8pt;"> 2014/12/25 更新</span></a><br>
《CSS側(CSS3 に対応しているWebブラウザが必要です)》
.button     { width:13em ;
              padding:5px ; margin:5px ;
              font-size:12pt ;
              text-align:center ;
              color:#fff ;
              text-decoration:none ;
              display:inline-block ;
              background-color:#888 ;
              box-shadow:2px 2px 2px #555;
              text-shadow:1px 1px #555 ;
              border-radius:10px ;
            }
表示はこんな感じになります。
20150111_1.jpg

2015/01/10(土)&lt;table&gt; タグのレスポンシブWebデザイン対応

約4週間前に始めたスマートフォン対応にて、レスポンシブWebデザインを構築している途上で、ここと 元ラジオ少年日誌とその他一部を除いてだいぶ出来てきたところですが、最大のネックは<table> タグの表示処理で、その分、いろいろな対処策が公開されているようです。

筆者では主に3つの手法を使いました。
1)superTable.js (Javascript) を使って、横幅を一定に保ちつつ横スクロール。
20150110_1.jpg20150110_2.jpg

表の左端や最初の行を固定表示にすることもできます。
表の部分を左フリック(指を画面上にて左にサッと滑らす)すると左に、
表の部分を右フリック(指を画面上にて右にサッと滑らす)すると右に、
スクロールします。

このJavascript は有名らしく、現在は Grid という名前に変わっていて、当方が取得したバージョンから見て、大幅に対応が改善されています。
#このJavascript にて、非推奨のものが使われているため、後日 Grid.js へ換装しないといけないかなというところです。。

20150110_3.jpg
20150110_4.jpg
もちろん、横に表示させても大丈夫です。
設置方法は、提起サイトのソースコードを見れば参考になると思います。

2)CSS にて表示体裁を変更する。
20150110_5.jpg20150110_6.jpg

左側はやや複雑なCSS で、汎用化するのはちょっと難しいかもしれません。
ちなみに元ネタ(PC版)はこんな感じ ↓
20150110_7.jpg

右側は、<thead> の左フロートと、<tbody> の block 表示で、これは CSS による <table> のレスポンシブ化手法では一般的なものの様です。
元ネタ(PC版)はこんな感じ ↓
20150110_8.jpg

探せば沢山出てくるのですが、いちいち検索するのも面倒なので、時間がとれるときにここにまとめておきたいと考えています。

2014/12/14(日)弊社サイトのスマートフォン&タブレット対応

2017/10/12 17:55 営業
やる暇が無かったんですが、やっとこ重い腰上げました。
次の仕事が来る前にやってしまわないと、この先ずっとやる暇が無いので、今やっています(苦笑)

スマートフォンやタブレットの場合、PC版とさほど大きな差は無い(Flash が基本的に使えないというやや重篤な問題はある)ものの、画面を縦にしても横にしても、閲覧に耐えうるものにするために「レスポンシブ Web デザイン」という手法を採用しているところが多い。

これは、アクセス元のブラウズ横幅などによって、自動的に適用するCSS を切り替え、表示体裁を変えることが出来る仕組みで、HTML の更新の手間を大きく省くことができるのですが、案外デザインの細かい部分に手が届かない難点があります。

弊社では、スマートフォン向けに3種類の表示レイアウトをサポートすることにしています。
と、いうことで、弊社のスマートフォン&タブレット向けサイトも「レスポンシブWebデザイン」で対応です。


↓↓↓ スマートフォン縦表示とタブレット縦表示 ↓↓↓
20141214_1.JPG

↓↓ スマートフォン横表示(横幅の関係でタブレット縦表示と同じ)↓↓
20141214_2.JPG

↓↓↓ タブレット横表示 ↓↓↓
20141214_3.JPG

作業完了次第、順次提供開始になります。

2014/12/08(月)Raspberry Pi model B+ をDNSサーバにしてみる

2017/10/12 17:53 サーバ運営・管理
取引先から試供用として預かっている Raspberry Pi model B+ 。
「返せ」と言われれば返却しなければなりませんが、同じものを買って返すということで。。
20141208_1.jpg

こういう代物は正直なところ、業務で扱わない限り関わることはまずありませんが、今回はたまたまですね。
確かに色々できるのですが、自立的に最初から何もできるわけではなく、このボード用のOSとアプリケーションを人手でインストールする必要があるため、取引先の業態ではコスト的・生産性的に合わないかなというと ころです。

このボードでは Debian 系の Linux OSである、RASPBIAN をインストールするのが確実。
こちらから、ダウンロードできます。→ http://www.raspberrypi.org/downloads/

提起サイトには掲載されていない FreeBSD10 なんかも FreeBSD本家サイトでは提供しているのですが、model B 用であり、model B+ には今のところ対応できていません。FreeBSD11-current で動作した例も見受けられる のですが、筆者の環境では上手くいきませんでした。

このボードだけでは、本当に何もできず、別途 8GByte 以上の microSD カードと、microUSB のACアタブタ(スマホ充電用のもので可)、HDMI ケーブルとディスプレイ、USBキーボードとUSBマウスが必要になります。

microSD カードは、32GByte 以上で class10 がお勧めです。
筆者は、東芝製の 32GByte,class10 ものを採用しました。
OSをインストールする際、予め microSDカードをフォーマットするように書かれていますが、通常、その必要はありません。

また、最近は Raspberry Pi model B+ 用の専用ケースが 1000円から 1500円前後で売られてはいますが、そのカネさえままならないので、簡易的なユニットを、下記のようにこしらえました。
20141208_2.jpg

Debian 系 Linux を常用している方々であれば、すんなりと触れると思います。
筆者は FreeBSD 使いなので、面食らいましたが。。orz

試行錯誤がありましたが、本日から実用試験的にこのボードで運用開始しました。
主目的は、消費電力の低減(→ 電気代の削減)にあります。
上手くいけば 10%弱の節電が実現できるはず・・です。

2014/11/24(月)suPHP の構築 ― Ver 0.7.2 からは一筋縄でいかない

2017/10/12 17:52 サーバ運営・管理
suPHP は、PHP をunix 上の各ユーザ権限で実行させるための Apache モジュールです。
これも今までのように行かず、導入に面食らいました。
# cd /usr/local/src
# tar -xvzf suphp-0.7.2.tar.gz
# cd suphp-0.7.2
# aclocal && libtoolize --force && automake --add-missing && autoreconf
# ./configure --with-apr=/usr/local/apache2/bin/apr-1-config
# make
# make install
(configure のオプション指定は、実際にはこれでは大きく役不足です)

ポイントは 4行目。
これがないと、
cannot find install-sh, install.sh, or shtool in config "@"/config
のようなメッセージが出るだけで、何も出来ません。
aclocal,automake 等は、FreeBSD の場合、 ports の devel/autoconf 、 devel/automake をインストールすることで入手できます。

libtoolize を実行しないと、make時に Version mismatch error となってしまう模様。

〔参考〕suPHPのインストール  (がらくたネット)

2014/11/24(月)FreeBSD における mysql のアップデート手順

2017/10/12 17:50 サーバ運営・管理
筆者は、直交性が無く、事前に調べなければ 100% 失敗するかのような、感覚的に理解できない mysqlの構築オプションに、正直なところ面食らっています。
情報量が多いので何とかなっているというところでしょうか。

1)先ずは、バックアップ。 これは常識的に行う作業です。
# mysqldump -A -u user -p > dumpfile.sql

これで、全てのデータベースクラスタを SQL にてダンプ出力します。
SQL でないと、バージョンが異なるアップデートの際、データを元に戻せません。

2)FreeBSD ports にてインストール(例示は mysql 5.5 の場合)
# cd /usr/ports/databases/mysql55-server
# make BATCH=yes WITH_CHARSET=utf8 WITH_XCHARSET=all install clean
# rehash

3)データベースクラスタの設置場所をこしらえる
# mkdir /home/db/mysql
# chown -R mysql:mysql /home/db/mysql

4)設定情報の雛形をコピー
# cp /usr/local/share/mysql/my-medium.cnf /home/db/mysql/my.cnf
# chown mysql:mysql /home/db/mysql/my.cnf
# chmod 644 /home/db/mysql/my.cnf

5)サーバ起動時に自動起動するようにする
# vi /etc/rc.conf

〔/etc/rc.conf に下記を追記〕
mysql_enable="YES"
mysql_dbdir="/home/db/mysql"

6)mysql の設定
# vi /home/db/mysql/my.cnf

〔/home/db/mysql/my.cnf の [mysqld]セクションに追記〕
skip-character-set-client-handshake
character-set-server = utf8
datadir = /home/db/mysql

〔/home/db/mysql/my.cnf の [client]セクションに追記〕
default-character-set = utf8

7)mysql サーバを起動
# /usr/local/etc/rc.d/mysql-server start
Starting mysql.


8)データベースの初期設定
# mysql -u root
mysql> SET PASSWORD FOR root@localhost=password('mysql_root_pass');
(mysql root ユーザのパスワード設定。任意の文字列を指定。)

mysql> SELECT user,host FROM mysql.user;
+------+---------------------+
| user | host        |
+------+---------------------+
| root | 127.0.0.1      |
| root | ::1         |
|   | hoge.basekernel.jp |
| root | hoge.basekernel.jp |
|   | localhost      |
| root | localhost      |
+------+---------------------+
6 rows in set (0.00 sec)

#上から3つめと上から5つ目は、空ユーザで、誰でもログインできてしまうため、削除。
mysql> DELETE FROM mysql.user WHERE user='';
mysql> SHOW DATABASES;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| mysql       |
| test        |
+--------------------+
3 rows in set (0.00 sec)

#データベース test を削除。
mysql> DROP DATABASE test;
mysql> EXIT;
Bye.

9)リストア
# mysql -u user -p < dumpfile.sql
Enter password: mysql_root_pass
(パスワードを入力)

#以下は任意
mysql> CREATE DATABASE db_name;
mysql> GRANT ALTER,CREATE,DELETE,DROP,INSERT,LOCK TABLES,SELECT,UPDATE ON db_name.* TO user_name@localhost IDENTIFIED BY 'user_pass';
mysql> EXIT;
Bye.

○ ログイン
# mysql -u root -p
Enter password: mysql_root_pass
(パスワードを入力)

○ バージョン表示
# mysql --version
mysql Ver 14.14 Distrib 5.5.40, for FreeBSD9.3 (i386) using 6.3

○ ユーザ削除
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user_name'@'localhost';
mysql> DELETE FROM mysql.user WHERE user='user_name' and host='localhost';

〔参考〕FreeBSD サーバ構築マニュアル MySQL5 インストール
 freebsd.server-manual.com
〔参考〕FreeBSD 9.1-RELEASEにMySQL 5.5をインストール
 クソゲ~製作所

2014/11/23(日)FreeBSD における PHP 5.5.x の mysql サポート

2017/10/12 17:48 サーバ運営・管理
FreeBSD 9.3 にて、mysql 5.5.40 Server を Ports にて導入し、
PHP 5.5系にて mysql アクセスのサポートをしようと構築をかけると、
構築の最終段階(本当に構築の最終工程)で、
ext/mysqlnd/.libs/mysqlnd_ps_codec.o: In function `ps_fetch_float':
ext/mysqlnd/mysqlnd_ps_codec.c:233: undefined reference to `__extendsfsd'
ext/mysqlnd/mysqlnd_ps_codec.c:233: undefined reference to `__extendsddf'
のようなエラーが出て構築できない現象に嵌りました。
FreeBSD 10.x系 ではこのようなエラーは出ません。
おそらく gcc コンパイラ と clang コンパイラの違いなのでしょう。

PHP 5.5 におけるmysql サポートは複雑で、先ず、
・ mysql インタフェース
・ mysqli インタフェース
・ PDO-mysql インタフェース
の3種類あります。 
このうち、最初の mysql インタフェースは古いので、利用は非推奨。
将来のバージョンでは削除されることが決まっています。

mysqli は拡張 mysql インタフェース、 PDO-mysql は Perl で言うところの DBI インタフェースみたいなものです。

今どきの PHP アプリケーションは、mysqli と PDO-mysql を使うように強い推奨がなされている状態です。
さらに、この内部モジュールは、各インタフェース専用以外に3つを統合した mysqlnd というものがあり、構築オプションによっては mysqlnd をインストールするようになっている感じです。全部で mysql サポートがモジュール4つあるらしく、何故こういう面倒なことになっているのか、利用者には理解不能です。

どうやら、configure で指定する構築オプションの組み合わせで mysqlnd を使う場合に、上記のエラーとなるようです。
今のところ、FreeBSD 9.x 以下のバージョンで PHP 5.5 を mysql 対応にする場合、 configure のオプションは、必ず以下をつけるといいです。
--with-mysql=/usr/local
--with-pdo-mysql=/usr/local
--with-mysqli=/usr/local/bin/mysql_config
--disable-mysqlnd
--with-mysql-sock=/tmp/mysql.sock
ポイントは --disable-mysqlnd でmysqlnd を外す指定です。
環境によっては mysql の unix ソケットが検出できず、この場合も mysqlnd を使うように強制されてしまうようなので、明示的に指定します。

筆者は PHP も mysql も使いません。昔からこの類の変更が多いからです。
アプリケーションの寿命が長い perl と postgreSQL を多用しており、長い目でのメンテナンス工数の面からお勧めしています。

2014/10/30(木)うーむ・・・ports/pakages の嫌なところ

2017/10/12 17:46 IPv6基礎
最近の FreeBSD ports は、BerkeleyDB のデフォルト選択が 5.3.28 になったようで、依存管理の把握が面倒くさくなりそうなので、一念発起(?)にて再構築しているのですが、再構築したつもりで、いざ BerkelayDB 4.8.30 を削除しようとしたら・・・
20141030.png

まだ依存関係があるorz
依存関係にあるパッケージを全て消そうとするのです。

自動的に依存関係まで処理して更新してくれれば楽なんですが・・・
こんなメンテナンスやる奴もあまりいないでしょうね。
しかし、不可解な挙動が突如発生する原因のひとつが、こうしたバージョン管理の問題なんです。指摘されてから対応すると無駄に時間とられるので、それがすごく嫌なのです。