2018年12月14日金曜日

VirtualBox で VM VirtualBox Extension Pack がダブルクリックでインストールできない時の対処法

なんか落とした Extension Pack のファイルをダブルクリックすれば、VirtualBox 立ち上がってインストールできるらしいですが、私の環境(Windows10)の VirtualBox だと、立ち上がるだけで何もしてくれなかったので、以下のように手動(?)でインストールしましたとさ。

  1. VirtualBox マネージャーの環境設定を開く
  2. 拡張機能を選択
  3. なんか追加するっぽいボタンをクリック
  4. ダウンロードしておいた Extension Pack のファイルを選択
  5. おしまい

VirtualBox で 64bit の OS が選択できない時の対処法

VirtualBox へ 64 bit 版の OS をインストールしようと思ったのに、Windows7(32bit) とか Ubuntu(32bit) とかしか選択肢に表示されなくて困っていたら、どうやら BIOS設定 で CPU の 仮想化支援を有効(Enable)にする必要があるようです。

Intel 製 CPU なら Intel Virtualization Technolog (IntelVT)、AMD の場合は AMD Virtualization (AMD-V) という機能です。
なお、AMD-V の場合は BIOS設定で無効になるようなことはないそうなので、そもそも 64bit CPU なのに 32bit しか選べない、なんてことはないみたい。

環境によって BIOS の画面って違いますが、私の hp パソコンでは何故か Security の欄にありました。
頑張って探してくださいw

2018年11月14日水曜日

redir コマンドでポートフォワードする方法

普通は iptables で転送するところを、わざわざ redir をインストールして実現する意図がよくわからない方法の備忘録。
なお、Raspberry Pi (Raspbian) で動作を確認。

使い方は
https://github.com/troglobit/redir
を参照。

そもそもインストールされていないので、まずはインストールする。
んで、ドキュメントに倣い以下のように実行。
sudo redir :80 127.0.0.1:8080
ポート番号は適宜変更しましょう。
例えば 1880 番の Node-RED に 80 番でアクセスできるようにするには
sudo redir :80 127.0.0.1:1880
です。

たぶん再起動のたびに実行しないとダメだよねコレ。
(ドキュメントに /etc/inetd.conf への追記サンプルあり)

2018年11月7日水曜日

Node-RED で簡単に Crypto を利用する方法(LINE の Bot とかで)

下記のノードを追加するだけで Crypto モジュールが使えるようになります。
settings.js(bluemix-settings.js)を書き換える必要はないです。

node-red-contrib-crypto-js

HMAC の MD5 とか SHA-2 とか使いたいぜ!ってときにサッと使えて便利です。(Encode と Decode が使い難いけどw)

LINE の X-Line-Signature 検証での利用例

そもそも必須じゃない処理を意地でも Node-RED でやろうという奇特な方向けの情報ですw
※LINE WORKSだと「X-WORKS-Signature」

LINE の改ざん検証用署名「X-Line-Signature」の検証方法

ニッチなので雑ですが、これでいけます↓
意地でもノードを使うの図
function ノードを使えばもっと簡単にできるところを、あえてノードを駆使してみましたw
ポイントは decode ノードの設定を Hex にしておくことです。
それ以外だと異なる値になります。

JSON 貼ると化けるブログなので、上の図を参考に各々頑張ってくださいw

settings.js を書き換える方法

ちなみに下記のようにすることで、function ノード内で crypto を利用することも可能になります。

1.settings.js の functionGlobalContext に追記
functionGlobalContext: {
  crypto: require( "crypto" )
},
2.Node-RED 再起動
3.function ノードで利用
const crypto = global.get('crypto');
上記ノードには含まれていない機能を利用したいときは、この方法にしましょう。

2018年10月19日金曜日

Oculus GO アプリ内で WebView (ブラウザ)を表示する方法

Oculus GO のアプリ内で WebView みたいにブラウザ機能を利用できると一気に便利なるので、なんかいい方法はないか調べてみました。(試してみたとは言っていないw)
先に言っておきます「まともなものはない」と。

なお、Unity を利用することが前提です。
また、空間上にブラウザを配置(テクスチャとして利用)できることが条件です。

Mobile Web View (Android, iOS)

https://assetstore.unity.com/packages/tools/gui/mobile-web-view-82142
ほぼ理想通りの機能を提供してくれるアセット!
でもレビューを見る限りかなりビミョーな様子……
$45 で人柱になれます。

UniWebView 3

Android にも対応しているけど、最前面に表示されるタイプなので残念ながら無理のようです。
$25

Embedded Browser

https://assetstore.unity.com/packages/tools/gui/embedded-browser-55459
一見 VR にも対応しているようだが、これは PC プラットフォームの VR に対してであり、Android がベースの Oculus GO には対応していない様子。
お値段が高いので試せないw
$80

WWebView

Windows のみ!
$20

unity-webview

gree のやつです。
残念ながら VR 非対応。

Popup Webview Android Ios

なんか見た感じダメっぽい。
$5

In-App Web Browser

全画面のみっぽい。
$5

Android Webview Texture (VR compatible)

検索するとよく出てくるし、いい感じなんだけど提供終了みたい。

ULiteWebView

情報少なすぎ。
$5

OculusGoWebView

まさにそのものズバリな名称だけど開発中なのかな…


あれ?もしかして無理なんじゃね?(爆)
神アセット待ちかなー。

2018年10月17日水曜日

Ubuntu 上の Dropbox フォルダを Windows と共有する方法

やる意味がわからないと思いますが、そういうシチュエーションもあるんですよ。
(Windows 側に空き容量がないとかね)

せっかく Ubuntu 入れてるんだから可能な限りコマンドは使わない方向でやります。
ちなみに Ubuntu 18.04.1 LTS でやりました。

なお、まるで熟知しているかのような書きっぷりですが、カンで作業した結果を書いてるだけなので、嘘、大げさ、紛らわしい可能性があることをご了承ください。

フォルダを右クリックして「プロパティ」でひらくやつ。
この画像は設定前の状態です。

まず素直に GUI 上で「ローカルネットワーク共有」を設定してみましたが、これでは Windows からの書き込みと Ubuntu での書き込みではユーザーが異なり権限(パーミッション)を変更しないと相互に上書きできない状態になってしまいました。

鍵がついちゃう

それではめんどいので、「ローカルネットワーク共有」ではなく samba をインストールして設定してみました。

注)以降の作業を行う前に全ての「ローカルネットワーク共有」の「このフォルダーを共有する」はチェック解除しておきましょう。
(もしくはそもそも触らない)

samba は「Ubuntu ソフトウェア」を起動して「samba」って検索すれば出てくるので、それをインストールします。

これをインストールする

しかし残念なことに、samba の設定画面はスーパーユーザー(管理者みたいなもん)でなければ開くことができません。
つまりマウスぽちぽちでは起動できません。
そのため「端末」アプリでコマンドを入力する必要があります。

CLI は説明不足の典型例w

そのコマンドは以下のとおりなのですが、
sudo system-config-samba
いきなりこれを入力してエンターキーを押しても、英語で「/etc/libuser.conf が無いよ」って言われてしまいます。
そこで、最初だけ次のコマンドを実行しておく必要があります。
(二回目移行は必要ありません)
sudo touch /etc/libuser.conf
上記コマンドで空のファイルが作れます。
このコマンドを実行するとパスワードを聞かれるので入力します。(何も表示されませんが入力されてます)
コマンドについて詳しく知りたい方は「sudo」コマンドと「touch」コマンドをググればいいと思います。
ファイルを作った上で再度
sudo system-config-samba
と入力しパスワードを入力すれば設定画面が開きます。
+ボタンで共有フォルダを追加したりなんやかんや設定しましょう(爆)

ちなみに当初の上書きできない問題については、プリファレンス > サーバー設定 > セキュリティのゲストアカウントを自分のアカウントにすることで、相互に上書き保存ができるようになります。

ゲストアカウントを自分にすることで解決
まぁセキュリティがザルになりますがねw
ちゃんとする場合は samba のユーザーも設定しておきましょう。

設定が終わり設定画面を閉じたら samba を再起動する必要があります。
以下のコマンドを実行します。
sudo systemctl restart smbd
あとは windows のネットワークから見られるかと、ちゃんと Dropbox が同期できてるかをチェックしましょう。

なお、共有しているフォルダ側もちゃんと自分にしておかないと意味ないので注意。

変えておけば以降は設定に準ずるはず
いつになったら Ubuntu は CLI 使わなくても良くなるんっすかねー。

2018年7月17日火曜日

Unity で地面のテクスチャがボケる時の正しい対処法

テクスチャ画像の Inspector の Generate Mip Maps を OFF にする方法ではパフォーマンスが犠牲になるようなので Aniso Level を変更するほうが良い。


実際にはここまで値を上げる必要はない
Aniso Level は「急角度から見たときのテスクチャの品質を向上します。床や地面のテクスチャに適しています。」とのこと。
この数値を上げることによる弊害は知らんw

2018年7月3日火曜日

xismo から Unity へ obj 書き出しする時の設定

デフォだと UV 変になったりしちゃったので、以下のようにするとうまくいった。
倍率は xismo は cm のつもりで作ってるので、100分の1にした。
X軸を反転にチェック。
UVのV座標を反転にチェック。これをしないと変になる。
面を表裏反転はオフに。これをオンにしてると左右が反転しちゃう。
モディファイアと表示ノードのみはお好きにどーぞ。

あとは出力された .obj と .mtl と テクスチャを Unity へわたしてあげればOK。

2018年6月25日月曜日

アップロードされたファイルを Node-RED で受け取る方法

例えば画像を Node-RED へアップロードしたい、とかの時です。
下のフロー図は、ファイルを送信できるアップロードページと、送られてきたファイルを鯖上に保存するフローのサンプルです。
フローの JSON コード貼ると化けちゃうブログなので、下記の説明を読んで各自で自作してくださいw

ただし環境によっては file ノード(ファイル作成ノード)がない場合もあります。(IBM Cloud のボイラーテンプレートで用意された Node-RED とか)
その場合は file ノードの代わりに、データベースなどへの保存の処理を行う必要があるわけですが、それはまた別のお話……

では、個々のノードについてザッと説明します。

アップロードページのフロー

まずは動作確認のためにも、ファイルをアップロードするためのページを用意します。

「[get] /upload」http 入力ノード

Node-RED 鯖の /upload に GET でアクセス(単にブラウザでアクセス)されたときのフローがここからスタート。

「HTML」template ノード

ここでファイルをアップロードできる HTML を msg.payload にぶち込みます。
HTML はこんな感じ。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>アップロード</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input name="file" type="file" id="file"><br>
<input type="submit" value="アップロード">
</form>
</body>
</html>
ちゃんと form 要素の method属性は post に、enctype 属性は multipart/form-data に設定しましょう。

http 出力ノード

上記の HTML をここで返します。
それにより無事、アクセスしてきたブラウザにはアップロードページが表示されます。
特に何も設定しなくてもデフォで Content-Type: text/html として返してくれるので楽ちん。

ファイルを受け取ったときのフロー

こっからが本題。
先のページからファイルがアップされた時のフローです。

「[post] /upload」http 入力ノード

アップロードページと同じ URL だけど、POST だった場合はこっちがスタートします。
ファイルがアップされるはずなので、ノード編集画面の「ファイルのアップロード」にチェックを入れましょう。
チェック入れておかないと msg.payload にバイナリバッファが入っちゃって意味不明になります。
入れておくことでファイルは msg.req.files に格納され、msg.payload には HTML の form の各値が格納された状態になります。

「処理」function ノード

ここでは簡単なエラーチェックをしつつ、応答のフローとファイル保存のフローに分けています。
出力数は 2 にして、return の [0] は応答のフローへ、return の [1] はファイル保存のフローへ分かれるようにしました。
コードは以下の通り。
let files = msg.req.files;
if (files.length === 0) {
msg.payload = "ファイルが添付されてないよ";
return [msg, null];
}
msg.payload = "たぶん保存したよ";
//
let msg2 = {};
msg2.payload = files[0].buffer;
msg2.filename = "/home/user/" + files[0].originalname;
return [msg, msg2];
まず、msg.req.files の数を見て、ちゃんとファイルが含まれているかをチェックしています。
もしファイルが含まれていなかったら、ファイル保存のフローへは null を返すことで、フローが進まないようにしています。
他にも必要であれば msg.req.files[0].mimetype などを確認して、想定外のファイル形式を弾いたりしても良いでしょう。

で、問題がなかった場合、新たにファイル保存フロー用のオブジェクト msg2 をこしらえます。
そして次の「ファイル作成」ノードのために、msg2.payload にファイルのバイナリバッファを入れます。
あと、保存先とファイル名もここで設定してしまいます。
サンプルでは鯖上の /home/user/ へ元のファイル名のまま保存するようにしました。

「HTML」template ノード その2

応答フローの template ノードです。
ここでは応答用の HTML を作成して msg.payload に入れています。
予め先の「処理」function ノードで msg.payload にはメッセージが入れられているので、Mustache タグを利用して payload の内容を HTML に差し込んでいます。
↓こんな感じ。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>結果</title>
</head>
<body>
<p>{{payload}}</p>
</body>
</html>
ヒゲ便利w

http 出力ノード

応答フローでも先の http 出力ノードを再利用。えこえこ。

「ファイル作成」file ノード

鯖上にファイルを保存します。
ノード編集画面で「動作」を「ファイルを上書き」にして「メッセージの入力のたびに改行を追加」のチェックは外しておきましょう。
「ファイル名」は先の「処理」function ノードで設定済みなので、ここでは空にしておきます。
(以前は何か入力されていても、msg 側が優先されてたけど、最近 msg 側で設定済みなのにノード編集画面でも何か入力されてると警告されるようになったっぽぃ)

以上、個々のノードの説明でした。
実際に /upload へブラウザでアクセスしてみて、動作を確認してみましょう!
そして何か間違えている場合、またはもっといい方法がある場合は教えてくださいw

おしまーいヽ(=´▽`=)ノ


2018年6月21日木曜日

Node-RED で base64 エンコードとかデコードしたい時

Node-RED は受信した画像とかローカルのファイルとかをバイナリバッファでやり取りするけど、Google さんの Cloud Vision API に画像送りたい時とかには base64 エンコードして送らなきゃいけなかったりするときのなんやかんや。

方法1:node-red-node-base64ノードを使う。

超楽ちん。
https://flows.nodered.org/node/node-red-node-base64
こいつをメニュー「パレットの管理」から追加して使うだけ。
msg.payload がバイナリバッファなら base64 にしてくれて、逆に base64 だったらバイナリバッファにしてくれます。

方法2:Node.js の Buffer クラスを利用する。

下記、new Buffer() は非推奨になりました。
今後は変わりに Buffer.from() を使いましょう。

https://nodejs.org/api/buffer.html

function ノードで
let buffer = new Buffer(msg.payload);
msg.payload = buffer.toString('base64');
return msg;
とかすれば base64 に変換できます。
これも楽ちん。
逆にバイナリバッファにデコードしたいときは
msg.payload = new Buffer(msg.payload, 'base64');
return msg;
てな感じ。

おしまい。

2018年5月21日月曜日

Vcc、Vee、Vbb、Vdd、Vss、Vgg、V+、V-、GND、の違いとは?

トランジスタの歴史的な経緯により、異なる表記になったようです。
とりあえず Vcc、Vdd は入力電圧。
Vee、Vss は出力電圧ないしは GND と思っておけば OK と思われます。(すごいマサカリ飛んできそうですがw)

具体的には回路の内部構造が TTL なのか CMOS なのかによって使い分けられているようです。

TTL なら
Vcc:コレクター
Vee:エミッター
Vbb:ベース

CMOS なら
Vdd:ドレイン
Vss:ソース
Vgg:ゲート

ってことらしいよ。
でも TTL と CMOS が混在している回路も増えてきて、人類の見通しの甘さを露呈しているらしいよw

2018年5月2日水曜日

Arduino の使い方(初心者向け)2018年版

Arduino 互換ボードを買ったので自分用の初心者向け基礎知識な備忘録。
いつものごとく間違っていることも自信満々に書いてるぞ☆
[書き始め2018年5月/飽きるまで随時更新]

以下、Arduino UNO 互換ボードと NANO 互換ボードでの話だよ。
Arduino は、いろいろな種類があって特にハード面ではかなり異なるので、しっかり確認してから使う。(電源とか)

Arduino とは?

マイコンの動作に必要なものをボードにまとめたもの。
つまりマイコンを簡単に使えるようにしたもの。
Arduino の種類によって乗っているマイコンが異なり、当然仕様や機能なども変わってくる。
ハード自体がオープンソースなので、色々と派生したり亜種があったりする。

ちな、Raspberry Pi とは違って OS はない。

スケッチ?

プログラムのこと。

便利なサイト

Web Editor とかある。

Tinkercad Circuits

ブレッドボード図(回路図)作成から、シミュレーション、スケッチ作成までできるちょっと凄すぎる Web サービス。
Fritzing ほど部品はないけど、基本的なものは揃っているし、なによりシミュレーションできるのが助かりすぎる!
提供元は 3DCG ソフトウェアで有名な Autodesk 。要 Chrome か Firefox。

Circuit Simulator Applet
Webブラウザ上で動く回路シミュレータ。
ちょっと癖のある使い勝手だけど、ショートカットキーを覚えるとすごく早く回路が組める。
Arduino に繋ぐ回路のテストに便利。

開発環境(IDE)

やっぱ今どきは Web IDE っしょ。
Arduino Create
互換ボードでもOK。
【要確認】Arduino 以外のマイコンは、Libraries で検索して Favorites からzipダウンロードして Custom に上げれば使えるっぽい?

電源

電源スイッチはない。PC じゃないから電ブチOK。

UNO

動作電圧:5V
DCジャックの入力電圧(推奨):7-12V

給電は USB から DCジャックから VIN ピンからのいずれか。
ただし VIN は直でマイコンにつながっているので、5V 以外繋いだらイカン。(5.5V くらいまでらしいよ)

NANO

動作電圧:5V
VIN の入力電圧(推奨):7-12V

給電は USB から VIN から 5V ピンからのいずれか。
UNO とは異なり VIN はレギュレータに繋がっているので、7~12V を繋げられる。
また、5V ピンからも給電できるが、これは安定した 5V を繋げる必要がある。

(アナログ・デジタル)I/O ピン

I / Oピンあたりの扱える推奨DC電流は 20mA まで。
いくつかのピンをまとめて出力 150mA 入力 100mA の制限もあるけど、1ピン 20mA を制限としていれば問題ない。はず。(さすがに 10 本のピンで 20mA 出したら壊れるそうです;)

5Vピンは200mA。
3.3Vピンは50mA。

PWM 出力ができるのは、UNO の場合はボードに~が描かれているピンのみ。
NANO の場合は D3,D5,D6,D9,D10,D11 ピンが対応。
アナログ出力(PWM)のためにデジタルピンを使うという点がややこい。

13番のピン

13番は内蔵 LED と連動している。
プログラムの定数「LED_BUILTIN」がこれ。

UNO と NANO のマイコン

ATmega328P
スケッチ済みのマイコンを Arduino から取り外してブレッドボード上で動作させるなんてことも可能。
まぁ互換ボードは殆どマイコン取り外せないけどなw
よく商品説明とか名称に「SMD」とか書いてあるけど、それは表面実装(Surface Mount Device)されてるから(結果的に)マイコン取れないぞってことらしいよ。

マイコンのタイマー

割り込みとは?

SPI、I2Cとは?

どちらもシリアル通信の規格。
マスター(親機・Arduinoなど)とスレーブ(子機・センサーなど)の通信に利用される。
SPI は線が多くなるけど比較的高速に通信できる。
I2C は線は少なくて済むけど比較的低速な通信になる、といった違いがある。
どちらも複数のデバイスを接続できる。
デバイスの電源電圧に注意。

2018年4月11日水曜日

Stencyl 3.4.0 での HTML5 書き出しについて

Flash 死亡とともに、どうも Stencyl も衰退しつつあるようですが、実験的とは言え HTML5 書き出しもできるようなのでテストしてみました。

テスト環境は以下のとおりです。
  • Windows 8.1 64bit
  • Stencyl 3.4.0 (Build 9300)
まずいきなり Test Game はできるのに HTML5 での Pubilish が
「Encountered errors while building your game.」
などと表示されて失敗する現象に遭遇。

シーンを作っただけのゲームでも発生するので、初っ端から絶望モードですが、思い切って Stencyl を再インストールしたら、このエラーは発生しなくなりました。
ただし、単に再インストールするだけではなく事前に
C:\Users\{ユーザー名}\AppData\Roaming\Stencyl
を削除またはリネームしておく必要がありました。

なお、そのフォルダ内の
stencylworks\games
にはゲームデータが入っているので、再インストールして作成された同フォルダにコピーすれば、引き続き利用できます。
先の書き出せなかったゲームも新環境では書き出せたので、このフォルダ内の何かが悪さしていたのかなと思います。

ちなみに、そうしてインストールした Stencyl を立ち上げたら「パーミッションがないぞ」みたいなメッセージが出ましたが無視しても問題なく使えておりますw

HTML5での注意点

  • IE11 では動かない。(Edge は未確認)
  • Sound ファイルは ogg を要求される。
  • iPhone では音が出ない。(Android は OK)
  • Setting の項目は WEB っぽい
  • Setting の Scale Mode は無視されるっぽい
  • Setting の Start In Full Screen? をチェックすると動かない
PCの Chrome と FireFox そして Android の Chrome では問題なし。

SWF 向けに作ったものを HTML5 で書き出し直したアホなゲーム

いずれもスマホでは画面サイズとかタップとかの関係で遊べません。

分かりにくいけどタイトル画面で既に商品並び替えできますんで。

概ね問題なし。

ドワーフに捕まった時のシーンリロードで Blur Out が機能していない。
他の効果では問題なかったけど、あえてそのままにしています。

あれ?結構いけるじゃないですか。
スマホ向けゲームもちゃんと意識して作ればいける気がします。
まぁミニゲームばかりなので、もっと大規模なゲームだとなにか問題が出るかもしれませんが、いつまでも実験段階なのは何が問題なのでしょうか。
購入者専用フォーラムとか見たら書いてあるのかなー。

しかし告知通り2017年中に HTML5 対応が完了していればワンチャンあったのではないかと思うだけに残念でなりません。

2018年1月26日金曜日

Raspberry Pi の純正カメラモジュール(v2)を Motion で利用する方法

そもそも Motion の公式ドキュメントにやり方は書いてあります。

https://motion-project.github.io/motion_config.html#Basic_Setup_PiCam

Motion で純正カメラモジュール(Piカメラ Official V2)を利用したい場合は

sudo apt-get install motion

で Motion をインストールした後

sudo modprobe bcm2835-v4l2

で bcm2835-v4l2 モジュールをインストールすればOK。

もちろん「Raspberry Pi の設定」で「インターフェイス」の「カメラ」は有効にしておきましょう。

引き続き raspistill コマンドなんかも Motion が動いていないときであれば利用できます。

motion の設定方法や使い方も、まずは公式ドキュメントをご覧になることをおすすめします。

https://motion-project.github.io/motion_guide.html

ブラウザ上で確認しながら設定変更する方法なんかもあります。(ちょっと野暮ったいですが…)

2018年1月5日金曜日

Microbit の稼働時間(ミリ秒)があんまり正確ではない問題

Microbit で時計やタイマーやストップウォッチを作ってみたくなるのは誰しもが通る道かと思いますが、いざ「稼働時間(ミリ秒)」や「一時停止(ミリ秒)」を使ってやってみると、全然正確ではないことがわかります。

まず試しに、このような3分タイマーを作ってみました。
タイマー開始と終了時にニャンキャットが流れます。
エディターでみる
シミュレーター上では特に問題ないのですが、実機で動かして実際のストップウォッチで計ってみると、だいたい3分1秒くらいで音がなります。
これを10分にしてみると、だいたい10分3秒くらいに音がなりました。
どうやら1分間で約0.3秒ほど遅れるようです。

まぁ数秒のズレならまだ良いのですが、そもそも私は1時間毎にお知らせするタイマーを作りたかったので、これでは1時間18秒毎にお知らせするタイマーになってしまいます。
(2時間後には36秒もズレるわけです)

ただ、何度試しても結果が大きく変わることはなかったので、ある程度正確に「遅れている」ようです。
つまりこの遅れ分、早めてあげればもう少し精度が上げられそうです。

ということで、60 - 0.3 = 59.7 = 59700ミリ秒を1分としてカウントするタイマーを作ってみました。
エディターでみる
上記のとは変数「分」の使い方が変わっている点に注意w

今度は開始は「ピコーン!」でアラームを「ニャンキャット」にしました。
また、簡素化のためグラフ表示は無しw

これで3分程度ならば、気にならないレベルになりました。

しかし、1時間で試してみたところ、まだ数秒ズレが発生してしまいます。
しかも困ったことに試す度に微妙に結果が異なるようになってしまいました。
流石にこのレベルになると、電源や気温、個体差などによって変化してしまうのかもしれません。

私の環境では、59690ミリ秒を1分とすることで、1時間あたりの誤差を1秒以下にすることができました。
そのあたりは環境に合わせ、みなさん調整してみてください。

おしまい。