2018/03/25(日)やっと使えるレベルになった - IPv6 対応

一昨年秋から使い始めた某社向けの制御ボードですが・・・
20180325.jpg
昨年12月にこの制御ボードの IPv6 対応を決めてから、対応作業に結構キツイ4ヶ月でした。
3月に入ってすぐに色々あって、作業自体が専門知識を要する佳境に入っていたため、1週間ほど寝る時間があまり無かったorz..

あとはこの1~2週間で安定性向上と、取扱い説明書改訂などを行って完了です。

ここ最近、『働き方改革』と称してその中に「高度プロフェッショナル制度」という勤務時間ではなく、成果主義に基づく勤務体系が通常国会などで議論されていましたが、そんな言葉が無い時代から筆者自身の服務がそんな感じだったので、一言くらい物申すことが出来ると思うのですが・・(笑)

ハッキリ言いますと、勤務時間は減りません。
「勤務時間」という観点だけで言えばむしろ「増える」のですよ。

だが、短所だけを誇張して、「全て悪」みたいな印象操作は違和感をものすごく感じます。
実際、筆者のような研究・開発職は「労働時間」「出勤時間」「退勤時間」で一般職のように規制されると却って作業そのものがやりずらい上に作業効率が上がらない。
ハッキリ言って、夕方出勤・深夜退勤みたいな柔軟性が欲しい。
安倍総理が言っているのはこういう部分だと思うのですがね。

これが普通の日本人の感性からして「だらしない奴」とレッテル張りしたがるので、そういうことも違和感たっぷりですよ。

問題は過労死を助長する企業風土であったり、職場環境であり、
「カネのことや作業計画の点は面倒みるから、何日か休みなさい」
と(上司や責任者が)言える風土創りが最も必要なのです。ちょっと国会の論戦はズレているのだよね。。

つまらないことで、安倍政権叩きする暇があったら、北朝鮮と支那国の対応、地方疲弊対策を真剣にやってほしいと思ってしまいます。

2018/02/21(水)Windows版 の Chrome でmp4 動画がまともに観れなくなった時の対処・・

弊社サイトの IPv6 対応作業を地道に進めていて、動作確認して気づいたのですが・・orz
つい最近まで Chrome でのサイト埋め込み mp4 動画が再生できていたのに、軒並みまともに再生しなくなってしまったようで、、
google が積年の恨みでも果たしたのだろうか・・(数年前から google が推進中の webm 形式動画普及攻勢・・・)

こうなってしまうようになったのです ↓
20180221_1.png
音声は出るが、映像が全く駄目、、、しかし、Firefox では特段問題がありません。
もしかして、前述のとおり google が chrome で問題が出るように何かやからしたのではないか、と勘繰り、webm 動画形式の対応状況をオンライン調査で再確認します。。

もう webm ≫ mp4 という感じなんですね。動画サイトの大御所 Youtube が webm 形式(VP8,VP9) を本格採用したことの影響が想像以上に大きいようです。

不具合を起こしている mp4 形式動画を webm 形式にエンコードして、アップロード。
動画を表示する部分の HTML を以下のようにしてみました:
<video  width="800" height="490" controls>
 <source src='20170427_15.webm' type='video/webm; codecs="vp8,vorbis"'>
 <source src='20170427_15.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
 <p>動画を再生するには、videoタグをサポートしたHTML5対応ブラウザが必要です。</p>
</video>


こうすることで、以下のように Chrome での動画再生が復活しました ↓
20180221_2.png
各所で言及されているとおり、同内容の動画であれば、ファイルサイズは mp4 形式より小さくなるようです。3割減は結構大きいですね。
20180221_3.png
ここで、avi 形式のファイルサイズが少し小さいのは、音声トラックが入っていないためです。
問題は、エンコードにエラく時間かかるところですね。
当方のPCでは概ね動画再生時間の3~4倍かかります。30分動画なら2時間弱かかってしまう。。。

〔2018/02/22 追記〕 Libre office の更新インストールと共に、Microsoft Visual C++ 2015 Redistributable(x64) - 14.0.24215.1 というものがインストールされたのですが、これで上記の不可解な現象は直った模様。。

2018/02/20(火)IPv6 の基礎(1) - ネットワーク機器類の取扱説明書を見る時、得意になれそうな知識

今回から不定期にIPv6基礎ネタを備忘録的に残していこうと考えています。
あくまでも「備忘録」です。はい。

筆者がかねてから想像していたとおり、今まで嗜んできたIPv4 とは毛色が違うし、似て似つかないものがあります。なので、初心者から「志を持って」(何のだ・・)猛勉強中です。

そんな中、各種のネットワーク機器を家電量販店やICT機器専門店などで買うときや、買った後で知っておくと、周囲に威張ることができそうな理解がしやすくなるような基礎知識を先ずはまとめていきます。

IPv4 は、軍事・学術研究から行き当たりばったりで進化してきた技術ですが、
IPv6 は最初から民生用途が意図されていて、万人共通の定義づけがいくつかあります。
ここがまず IPv4 と違う世界ですね。
IPv6基礎(1)
IPv6 の世界で先ず使われる用語の基礎用語として、以下があります:
■ ノード
 IPv6 通信機能を持った機器全てを指す。
 具体的には、パソコン、ネットワークプリンタ、ルータ、サーバを指し、ハブやスイッチングハブなどはノードに含みません。
 図示していませんが、スマートフォン、タブレットも「ノード」です。
 ノードは「ルータ」と「ホスト」の2つに区別されます。

■ リンク
 ハブやスイッチングハブ、無線LANアクセスポイントなどを介して、ルータ超えしないで直接イーサネットやWiFiで通信可能な装置間接続を指します。
 ルータ同士の通信も「リンク」です。
 ルータ超えの通信は「リンク」ではありません。

■ サイト
 1つ以上のリンクからなるLANを指します。
 ルータが複数あっても、インターネットに出ていかずに別のリンクと接続するLANは、接続ルータ先のリンクもまとめて「サイト」になります。
 ただ、この概念は古い IPv6 の資料には出てくるのですが、現在は使いません。
 古い IPv6 の資料を読むときに必要となります。

■ ルータ
 ノードのうち、リンク外部との通信中継・リンク内部通信の取りまとめを行う機器を指します。
 インターネット接続には不可欠な装置になります。

■ ホスト
 ノードのうち、ルータ以外の全ての機器を指します。
 受信時、自ホスト宛は処理できるが、他ホストへ転送出来ない機器全てがホストです。
 パソコン、ネットワークプリンタ、サーバ、スマートフォン、タブレットなどは、典型的なホストの一例です。
 リンク内でも他ホストへの送信は、基本的にルータが取りまとめて処理します。

■ 近隣ノード
 リンク内で通信が直接到達可能なノード全てを指します。

これらは概念として理解しておくと、後々 IPv6 の理解が楽になります。

2018/02/17(土)IPv6非対応回線に IPv6導入(6to4接続)

実は、弊社がメインで使用している回線は、ネイティブ IPv6 には非対応です。
# 正確には対応していたはずだが、ISP経営統合でそのあたりの対応が立ち消え状態・・・

よって、IPv4 で IPv6 を包み込んで通信する「トンネル接続」と一般的に称する手法を用います。
筆者はこの「トンネル接続」は嫌いなんですが・・・
通信自体が遅くなる上に、不安定要素を自ずと抱えるからです。どのくらい遅くなるのか、実験で示してみましょう。

先ずは、IPv6 ネイティブ接続(いわゆる IPoE 接続) 回線で通信到達時間を図ってみます。
20180217_1.png
最初の10回がトンネル接続回線への通信到達時間。これは若干速い方です。日本国内だからあたりまえか。。
次の10回は google IPv6回線 Webサーバなんですが、最初の10回よりも2倍速いです。
このサーバはどうやらオーストラリアに設置されているようです。
外国へ通信するほうが速い・・・orz

次に トンネル接続な回線からの通信到達時間計測。最初の10回は、互いに同じサーバ同士での実験です。
ほぼ同じ程度なのは当然の結果です。
次の10回は、ホスト名指定だと接続の度にIPアドレスが変わってしまうようなので、試験条件を同じにするために、IPアドレスを直接入力しています。
さすがに最初の10回と約2倍の差はありますが、IPv6 ネイティブ接続と比較すると、約3倍かかっている。。
20180217_2.png
単位はミリ秒(1000分の1秒)単位なので、大したことないだろと思う方居られるかもしれませんが、その考えは大きな間違いで、この差が積もり積もってそのまま体感アクセス速度の差になるのです。
やっぱりネイティブ接続が断然いいですね。。

2018/02/10(土)〔続き〕(自宅の)インターネットで IPv6 が使えるようになった。FreeBSD pfのNAT66 を採用・・

先日の続きです。
単純な構成なら、問題なく IPv6/IPv4 のデュアルスタックで動作するようなのですが、筆者のLAN環境は通常業務とシステム開発の両方を同時進行で行うため、歴史的経緯で以下のような変な構成になっています。(機器類はもっと数あるんですが、かなり端折って書いています)
20180210_1.png
「IPv6 の接続優先度を下げる」という事例は沢山ありますが、その逆は殆ど事例がありません。
何故なら、デュアルスタックにおけるデフォルトの挙動が『IPv6 優先』だからなのです。

当方のように「IPv4 接続がどうしても優先される(IPv6 でつながる場合もある)」という不可解な現象は、Windows10 においては、LANが複数あってインターネットへの接続ができる場合に特定のLANが優先的に選択され、選択されたLANが IPv4 しか通信できないと、見かけ上 IPv4 優先に見えるのではないか、という推測を立ててみたわけです。

具体的には「実験環境用ルータ兼サーバ」と記したサーバに NAT66 を設定することでほぼ解決しました。
'NAT66' とは IPv4 における NAT の IPv6 版といった感じです。
'NAT64' という機構もあるのですが、ここでは割愛します。

当該サーバのLANカード情報を以下に示します。
このサーバには、LANカードを2枚挿しし、相互に通信できるようにしていますが、
re1 → re0 への通信において NAT66 を設定しています。
20180210_2.png
①がプロバイダと接続する IPv6 アドレスで、このIPアドレスは今回使用しているプロバイダの提供機能上、半固定です。
何故「半固定」という謎仕様なのかは、最低限 IPv6 の基礎を理解する必要があるため、今は「そのようなものだ」と思っておいてください。

②が実験・製品開発業務用に使うLAN2のルータIPアドレスで、fdxx: で始まる「ユニークローカルユニキャストアドレス」というもので、IPv4 でいうところの「プライベートIPアドレス」に相当します。

/etc/rc.conf に以下のように設定します。(IPv6 関連のみ抜粋。この他に pf の設定も忘れないように。)
20180210_4.png
/etc/pf.rules (任意のファイル名で可能)には、下記のように設定します:
20180210_5.png これは、必要最低限の設定です。ぼかしてあるところは設定の必要ありません。

こうすることで、どちらでアクセスしても IPv6 で通信可能であれば、IPv6 が優先するはずです。再起動して再度、例のサイトでチェックしてみました。
20180210_3.png
このIPアドレスに見覚えないでしょうか?
この記事の2枚目の画像キャプチャ中で「①」と示したIPアドレスと一致します。
NAT66 が機能し、且つIPv6 アクセスが出来ていることが確認できました。

IPv6 接続を優先すると、「従来の IPv4 接続に時間かかるだろうが!」と思われる諸氏もいるかもしれませんが、それは、IPv6 でインターネット接続が出来ない環境での話。
筆者の環境は「IPv6 でインターネット接続が出来るようになった」ため、IPv4 接続が出来ない状態にならない限り、そういう現象には出くわさないです。

この数年、技術的記事ネタ切れ状態でしたが、暫く「IPv6の基礎」ネタで技術的な記事が書けそうです。(苦笑)

2017/09/30(土)Cyberfox は 2018年3月で提供終了になる

当方で愛用していた 64bit版 Firefox と言える存在で AMD CPU ものに特化しているWebブラウザでしたが・・・
cyberfoxAMD64.png

2017/03/07 に「1年後にサポートを停止する」と発表され、気が付けばもう半年も無いので、このあたりの移行に向けた対処を本格的に考える時期なのかなと思います。

実は、これと同じ時期に Firefox 本家で 64bit 版の提供が始まり、単純に「64bit版が欲しい」といったユーザは Firefox に戻すほうがいいです。
あれだけ消極的だったのにな~ と強い印象を持たざるを得なかったのは過去の話になってしまいました。

個人的には半信半疑のようなところがありました(64bit版といっておきながら実は 32bit版ビルドで動作出来てるだけというものが結構あるから)が、mp4 動画の再生が途中でハングするというトラブルが Cyberfox で頻発するようになり、どうもブラウザの問題らしいということで、試しに以前使っていた Firefox を試そうとインストールした後確認したら・・
firefox_x64.png

確かに 64bitビルドです。インストール先も確かに64bitアプリ(← 最近はこう称するんだよね) と認識してインストールされていました。

この行動のきっかけとなった、mp4動画の再生ですが・・・
途中で原因不明のハングするというトラブルは解決した模様です。

2017/04/12(水)今どきの和文Webフォント

Webサイトを制作していて、悩みの種のひとつに文字フォントの問題があります。
従来(結構昔話になってきている)は閲覧する側で表示できる文字フォントを考慮するのが一般的であり、制作側で使用したい文字フォントをデザイン的に強制出来ないという問題 があります。

筆者が制作したサイトもこんな感じで、クオリティにやや難を感じる状態です。。
20170412_before.png

最近は CSS の普及でこうした問題も解決し、ライセンスに注意する必要がありますが、制作側で意図した文字フォント一式をWebブラウザにダウンロードさせ、強制することができます。
これは、一般的に「Webフォント」と言うものです。

しかしながら、日本語環境でこの「Webフォント」を採用するには問題があります。先ず、
・英文フォントと違い文字種が多いので、フォントファイルも数MBはザラである。フォントによっては、数10MBあり、ダウンロード → 表示に必然的に時間かかる。

という致命的ともいえる問題があり、更に、
・実際に表示させてみると、文字フォントによってはレンダリングが汚く、プロ品質の実用にやや難がある。

とりあえず、致命的な問題が何とかならないものかと色々調査していましたが、
有償のサービスもあるもののそれは弊社の環境にはオーバスペックなため、下記の手法で落ち着きました。

〔参考〕
10分で設定完了!Webフォントの使い方や軽量化・はてなブログでの設定手順、優良リソースなどまとめ【おすすめ日本語フォントも】
http://brian.hatenablog.jp/entry/how-to-set-web-fonts

先ず、
「サブセットフォントメーカ」 というソフトウェアと、
「WOFFコンバータ」 というソフトウェアをダウンロードしてインストールしておきます。
ちなみにこれら2つのソフトウェアは Win版とMac版両方あります。

両方ともいわゆるフリーソフトで、生成したフォントファイルは、元にしたフォントファイルでライセンス制限されていない限りは商用利用(有償で制作を請け負うなど)可能です。

インストール出来たら、「サブセットフォントメーカ」を起動し、以下のように入力しました。
20170412_1.png
因みに、元フォントは「モトヤLマルベリ等幅3」というApache ライセンスのものを採用しました。
フォントに格納する文字のところは、テキストファイルであれば何でもよいようです。
筆者はそのまま対象のHTMLファイルを選択しました。
但し、Windows 環境において、UTF-8 では文字化けするようなので、予め UTF-16BOM(Windowsで言うところのUnicode形式) に変換しておくとよいです。

ここで「作成開始」をクリックすると、すぐに WOFF コンバータの画面が開きます。
以下のように入力します。(変換前ファイルの欄は自動入力される)
20170412_2.png

ここで「変換開始」をクリックすると、拡張子が .eof , .woff , .woff2 の3つのファイルが生成されます。
こうすることで、使用している文字のみをピックアップし、フォントファイルのサイズを大幅に削減できます。筆者の場合は最大で 15kB 余りとなりました。

これらをサーバにバイナリモードにて(FTP の場合)アップロードし、次にCSS ファイルで、これらフォントファイルを参照するように設定します。
こんな感じです:
@font-face {
  font-family: 'motoyasub3' ;
  src: url('/css/motoyasub3.woff') format('woff'),
       url('/css/motoyasub3.eot')  format('eot') ;
  font-weight: 100 ;
}

a.sidemenu  { font-family: 'motoyasub3',"MS Gothic",Osaka,monospace,sans-serif;
      .... [中略] ....
            }
これで、こうなりました:
20170412_after.png

レンダリングも問題なさそうです。(Cyberfox,chrome,IE11,edge で確認)
woff 形式は IE 以外で、eot 形式は IE のみでサポートする Webフォントファイルのようです。

2016/09/09(金)H8/3069F ROMライタの制作

2016/08/10 の記事 で紹介した道具を、特注で製作しなければならないことになり(というか当初の作業工程策定で漏れていた)、急遽現在のファームウェア制作を数日中断して作ることにしました。

その部品たちの一部が以下:
20160910.JPG

来週半ば目途に完成させないとならないという、半ば突貫工程です。。
と言っても、プリント基板さえ作ってしまえば、1~2日程度で出来そうな規模ですが。。

2016/08/16(火)BCD ⇔ 符号なしバイナリ変換

システム制御系、特にファームウェア制作ではよく出てくるにも関わらず、
毎回調べ直すという非効率なアホ作業をしでかしているので、自分メモ的にまとめてみようと・・orz

BCD コードというのは Binary Coded Decimal の頭文字で、日本語の古い文献などには「二進化十進数」とも表記されます。
数字を表示する機器などには未だ広く使われているようです。
BCDコードとバイナリコードの相違が理解できない方は、まずそれを他所で理解してください。理解できていないと、以下の記事の内容は全く理解できないでしょう。

今般の制作ボードの中にBCDコードを要求するLSIがあり、BCDコードとバイナリコードの相互変換が必要です。必要なのは 0~99の値なので、それに特化しています。

難しいのは、バイナリ → BCD変換のほうで、実に力ずくのアルゴリズムから、難解なものまでいろいろな方法があるのですが、応用が利くのは以下の、
『BCD部分の各桁について、「値が5以上ならば3を加算する」』
を基本にする手法。
以下を参考にしています:
http://www.geocities.jp/leitz_house/electronics/pic/bcd_01.htm
http://minkara.carview.co.jp/userid/526128/blog/24236882/
〔覚え書き:2進数 ⇒ BCD変換について…〕

オリジナルは、どうやらキャッシュしか残っていないようで、いつ消えるか判りません。
こんな方法で本当に出来るのか? という疑問を持たれる方が大半と察しますが、数学的見地でも本当に出来るのですから、科学の基礎というのは奥が深いです。
実際にC言語にて作ったものが以下(ビックエンディアン環境にて動作確認済):
/**  cnv_byte_to_bcd 1バイトバイナリデータを1バイトBCDに変換 */
unsigned char cnv_byte_to_bcd(unsigned char bval) {
  union {
    struct {
      unsigned char bcd ;          // 変換後の値
      unsigned char hex ;          // 変換対象バイナリ
    } conv ;
    unsigned short  buf ;
  } convbcd ;

  unsigned char bitcnt ;

  if (bval >= 100) return (bval) ; // バイナリ値 100 以上は BCD に変換不可のため、そのままリターン。
  convbcd.buf = 0 ;                // 使用領域は予めゼロクリアしておく。
  convbcd.conv.hex = bval ;        // 変換対象のバイナリ値を置数。

  for (bitcnt = 0 ; bitcnt < 8 ; bitcnt++) {
    if (((convbcd.conv.bcd & 0x0f) + 0x03) >= 0x08) convbcd.conv.bcd += 0x03 ;
    if (((convbcd.conv.bcd & 0xf0) + 0x30) >= 0x80) convbcd.conv.bcd += 0x30 ;
    convbcd.buf <<= 1 ;
  }
  return convbcd.conv.bcd ;
}
肝になる部分は、union 共用体の部分で、メンバ bcd と メンバ hex の順番は重要です。
対象ターゲットCPUは、ビックエンディアンで、その環境で動作確認しています。
インテルやAMDのCPUだと、殆どがリトルエンディアンなので、メンバ bcd と メンバ hex の定義を逆にしないと駄目かもしれません。

一方で、BCD → バイナリ変換は簡単です。4ビットごとに区切り、上位4ビットの値を×10し、下位4ビットをそのまま加算すると変換完了です。
/**  cnv_bcd_to_byte 1バイトBCDデータを1バイトバイナリに変換 */
unsigned char cnv_bcd_to_byte(unsigned char bval) {

  unsigned char convbin ;

  convbin = ((bval & 0xf0) >> 4) * 10 + (bval & 0x0f) ;
  return convbin ;
}