2017年6月9日金曜日

Raspberry Pi2でネットワークオーディオ

1つ前の記事に出てきたRaspberry Pi2 + Volumioのオーディオ環境。これを
やろうと思ったきっかけは、

「Raspberry Pi2を使って、ネットワークオーディオをつくれないか」

ってことでした。Volumioをいれるだけなのでソフト面は比較的簡単なんですが
問題はハード環境。せっかくのネットワークオーディオ環境なんだから、電源
ケーブルが複数にょろにょろ出ては困る訳ですよ。ってことで、一番大事な
条件は「Rapberry Pi2の電源1本で音がならせること」です。

■準備するもの
 1)Raspberry Pi2(別に3でも問題ないとは思いますが)
 2)microSDカード
 3)Volumioバイナリ
 4)Raspberry Piのケース(必要に応じて)
 5)USBスピーカー
 6)Wi-Fiのクライアント(USBドングル)

 1)~4)についてはやることは普通なので、別の記事なりに譲ります。

■5)USBスピーカー


 LogitechのZ120を選択しました。Amazonの評もよかったのと、USB電源
 以外必要ないこと。またRaspberry Piと組み合わせた例もネットで見かけ
 ました。実際に音を鳴らしてみると音の分離や抜けもよく、1500円とは
 思えない満足感が得られます(^^)。もちろん、高いスピーカーには適わない
 けど、デスクトップ用としては十分です。

■Wi-Fi USBドングル
 Raspberry Piで使える無線LANのUSBドングルって、実は数が限られてます。
 挿入していきなり使えるようになるものってなかなかないのでは…。また
 Volumioに使用されてるディストリビューションで、何が使用可能なのかも
 不明でした。


 で、今回使用したのがこれ、BuffaloのWLI-UTX-AG300です。これは有線LAN
 しかインターフェースのないTVなどで使用するメディアコンバータです。つまり
 有線を無線化するもの。Raspberry Piの有線LANの口と、このドングルの有線
 LANの口の間をLANケーブルでつなぐことで無線化できます。Raspberry Pi
 側でこのドングルを認識する必要がない(USBポートに挿しますが、電源供給
 だけです)ので、問題なく無線でルータにつながります♪

これで、Raspberry Piの電源ケーブル一本で、スピーカーも鳴りますし、ネットにも
無線でつながります。まあ、スピーカーのラインのケーブルとか上記のドングルと
つなぐためのLANケーブルは必要ですが、LANケーブルは15cmとかで十分ですし
うまくケーシングしてやれば持ち運びも可能かな(^^;。

VolumioはAppleのAirPlayにも対応してますし、AndroidからはBubbleUPnPなどで
音が飛ばせます。HDMIでRaspberry Piとディスプレーをつなげばコマンドラインで
システムの操作ができますが、普段はWeb経由でアクセスすればOK。なかなか
便利ですよ!

Windows10でUSBディスクを共有しても、Androidなどからは見えない問題

なんか一年ぶりぐらいの更新のような…(^^;。

で、本題ですが、次のようなことをやりたかった訳です。

■Raspberry Pi 2を活用するのに、Volumioを入れて音楽サーバみたいな
 ことをしたい

 →これは比較的簡単です。ダウンロードしてSDカードに入れるだけ。

■上記のSDカードに音楽を入れてもいいけど、SDの容量は限られてるので
 NASなり、ネットワーク上のPCなりの音楽を読み込んで再生したい。

■ドスパラのスティックPC「DG-STK3」を最近よく使っているので、
 これとドッキングステーション「DG-STKLC」を組み合わせ、そのUSB
 ポートに128GBのUSBメモリをぶっさし、これをNAS代わりにしよう!

 →ここでハマる(-.-)

DG-STK3で試したところ、本体内蔵のeMMC、本体にスロットのあるmicroSD
については共有すればVolumioから読み込めました(マウントして曲をサーチ
できた)。一方でUSBポートにつないだメモリ、HDDについては、Windows
で共有の設定をしてもVolumioやAndroidから見えないんです。これは…

で、いろいろ調べた結果、これを可能にするのがWindowsの「仮想ハード
ディスク」機能。実はWindows7から使えたらしいですが、Windows10でも
ちゃんと使えます。

やり方は簡単、「コントロールパネル」→「管理ツール」→「コンピューターの
管理」と辿って、その中の「記憶領域」→「ディスクの管理」を選びます。



仮想ディスクを作成したいドライブをクリックしてメニューの「操作」→
「VHDの作成」を選択すれば、作成可能。簡単です♪。ただし、何点か
注意点

■VHDファイルを作成するドライブはNTFSでフォーマットされている
 必要があります。

■VHDは要はファイルなので、でかいサイズの仮想ディスクを作成すると
 それだけ長い時間かかります。

■例えば100GBのVHDを作ってそれをマウント&フォーマットし、そこに
 大容量のファイル群をコピーするとなると、めちゃめちゃ時間かかります。
 USB3.0とかに対応してたら速いかもしれませんが、ウチのはUSB2.0
 なので、時間がかかりすぎて途中であきらめました。

 →VHDは単なるファイルなので、別のPCで作成して、USBメモリにコピー
  したのち、目的のPCでマウントすることも可能です。今回はノートPCの
  HDD上に仮想ディスクファイルを作成し、ノートPCでマウント、
  フォーマット、コピーのすべての作業を実施し、出来上がったファイルを
  USBメモリにコピーしました(ま、100GBの1ファイルをコピーする
  だけでも結構時間はかかりますけどね)

■VHDファイルは、電源切ったらマウントが解除されますので、電源投入時に
 再度マウントする必要があります。これはWindowsのタスクを登録する
 ことで自動的にマウント可能です。

 http://siso-lab.net/yoga-book-vhd-auto-attach/
 
 ↑この辺りが参考になります。

これでVolumioからUSBメモリが見えて、NASのように使えます!





2016年7月9日土曜日

【PuppyLinux】Windows10を入れてビビるぐらい遅くなったPC

さて、Windows10にアップデートして喜んでいたAcer Aspire Revo R3610ですが、
基本動作は遅め。そして時々ビビるぐらいに処理が重くなる。まあ、裏でなんか
やってるんだろうけど、その重さたるや、音楽再生してるとブツブツと切れる
ぐらい。Flash系の動画再生ページも重くて、「見れなくはない」感じだけど
ストレスがたまる。う~む。

ただ、メモリは4GB積んでるし、HDDもSSHDを500GB積んでる訳だし、なんか
上手い再利用方法ないかなあ…と考えて、音楽再生用のPCにしてみることに。

■PuppyLinuxを入れる
R3610はSPDIFの口がついてるので、ここからPanasonicのワイヤレスヘッドホン
(RP-WF7T)に音を渡して音楽聞けるようにしようと思う。手っ取り早くPuppyLinuxを
(USBメモリに)入れてやってみるが、

・5.7.1は画面がFullHDにならなかった。

・最新TuhrPupの日本語版は、ちょっと画面が気に入らなかった(音はSPDIFから
 出せた)

・Lubuntuが割と好きなので、LxPup 16.06.2を使ってる。
 →☆ここに落ち着いた。

そもそもR3610はATOM330とnVidiaの組み合わせであるIONプラットフォーム
なので、映像のドライバが特殊。少し古いPuppyではしっかりサポートされてない
感じだけど、LxPupは大丈夫だった。SPDIFからの出力も大丈夫(ちょっと設定は
わかりにくかったけど)。しばらくはこれで行ってみよう♪

2016年5月7日土曜日

【DG-STK3】ドスパラ Diginnos Stick DG-STK3を買ってみる

スティックPCほしいな~ということで、いろいろ調べた結果、一番値段の安い
ドスパラのDG-STK3を買ってみることに(^^;。

■スペック
・CPU:  Intel ATOM Z3735F
・MEM:  2GB
・HDD:  32GB(eMMC)
・I/F: HDMI x 1, USB2.0 x 2(Full x 1, micro x 1), microSD x 1, Pow x 1(USB micro, 5V)
・Wi-Fi: 802.11 b/g/n
・Bluetooth: 4.0
・CPUファン: なし
・OS: Windows10 32bit

CPUはATOM Z3735Fなので、少し前のタブレットと同等です(現在の主流はATOM x5-8300
になりつつありますね)。ちなみに同じDiginnos Stickシリーズでも、DG-STK2Sはx5-8300
搭載です。ちょっと高いんですけどね。

USBの電源アダプタが同梱されていますが、5.0V, 2.0A品になります。スマホの充電用
などで一般的な1.0A品では起動できないので、同梱のものを使うようにしましょう。

STK3はファンレスです。代わり…にはなってない気もしますが、前面に金属のメッシュ
部分があり、ここから一応熱を逃がすようになってます。




↑こんな感じ。

■ベンチマーク

ベンチマークとってみます。まずはHDD(eMMC)から。




ReadもWriteもそこそこ高速です。次はSDカード。




SDカードはUHS-I対応のSDXCカード(64GB)を挿入しました。Class10で、Readは
48MB/sってなってますが、半分ぐらいしか出てません。試しにUSBポートに
SD R/Wをつけて、それ経由で読み書きしてみます。




SD R/WがUHS-Iに対応していれば、Readが 44MB/s、Writeが9MB/s程度
でてます。ランダムのR/Wはいずれにせよ遅いですけどね。少しでも高速な
SDカードの読み書きが必要なら、UHS-I対応のものをUSB接続のR/W経由で
接続するとよいでしょう。

次に、最近よくベンチマークで使われてる、ドラクエベンチマークをやって
みます。



何回かトライした時の最後の1回だったので、結果は「動作困難」でした。
CPUの温度が上がりきってないときなら、「重い」という判定でした。
いずれにせよ、処理能力は必要なゲームには向いてないと言えます

■CPUの温度など



CPU情報です。CPUはMAX1.8GHzまでちゃんとクロックアップしてます。
コアはスペック通り4つ。ただし、温度がMAX80℃近くまで上がってます。
ドラクエベンチやってるときは85℃ぐらいまで上がっていたのでかなり
高温です。そして、この温度が上記のメッシュの部分に伝わってるので
触るとかなり熱いです。

冷却したほうが安定して動作するので、ここに何かしら冷却用のファン
なりヒートシンクなりつけた方が良さそうです。

■動画再生

Youtubeで720pぐらいの動画みるなら特に問題はありませんでした。
1080pの動画は時々プチ停止することがあります。Amazonのプライム
ビデオはブラウザ上で見てると少しカクカクしてました。処理能力的に
動画を楽しむにはあまり向かない感じです。Amazonで動画みるなら
AmazonのFireTV Stick買った方がいいでしょう。5000円ぐらいで
買えますしね(YoutubeやHuluなどもアプリで対応してますよ!)

■ネットワーク(無線)
Wi-Fiは普通につながります。ただ、テストした環境が無線ルータ(Buffalo製)と
すぐ近くだったので、ルータと離れた場所で使用する場合は無線のつかみが
悪いかも知れません。

同様の環境で、Bluetoothでスピーカーをつないでみましたが、特に
通信速度が下がる感じはしませんでした(ネット上の動画を再生していても
映像と音声が途切れることはなかった)。

購入したときのお店の人の話ではWi-FiとBluetoothを併用した場合に
どちらの電波も保証するものではないとのこと。まあ、どちらも2.4GHz
ですし、Bluetoothの方はホッピングしてますからねえ。場合によっては
Wi-Fiのつながりが悪くなるかもしれないです。

あ、ちなみにキーボード/マウスは2.4GHzの無線を使う、Bluetooth「じゃない」
ものを使用してます(LogicoolのUnifying)。

■まとめ

1世代前のCPUの名器、ATOM Z3735Fを使用したスティック型PCですが
ちょっと起動してブラウジングしたり、文章書いたりするのは特にストレスは
感じないです。このブログもDG-STK3でChromeを動かしてBloggerに
ログインして記述してます。

ただ、少し手の込んだことをやろうとしたり、HDの動画見ようとすると
少しパワーが足りない感じです。エミュでレトロゲームやるとか、それぐらい
なら使えるかなあ。手持ちのAcer Aspire REVO R3610(ATOM 330)は
Windows10にアップグレードするとちょっと重くなってしまったのですが、
その代替手段として使用するのは問題なさそうです。

2016年5月2日月曜日

【Android】ローカルのHTMLを表示する

ああ…ほったらかしてあったら、すげー間が開いてしまった(^^;。しかもブログのBloggerの
作成画面が変わってる気がする。

さて、AndroidのタブレットでローカルのHTMLを表示しようとしてハマったので備忘録
程度に。ES File ExploreとかでファイルをHTMLを選択して、ブラウザで表示しようと
しても、起動アプリの選択肢にブラウザが登場しない。FirefoxやOperaが入ってると
登場するって話もあるけど、Chromeしか使ってないし…。で、色々やってると、どうも
X-plore File Managerならファイルを選択すると、このアプリのHTML表示昨日で
コンテンツ表示出来るみたいだ。HTML5とかJavascriptとかになってくると無理かも
知れないけど、そもそもやりたかったのはHTML形式で記述されたマニュアルを読みた
かっただけだし、これで十分だな♪

2015年9月6日日曜日

【なでしこ】なでしこプログラミングコンテスト2015→結果発表

「なでしこ10周年記念コンテストの結果発表」


と、いうことで結果が発表されたんですが、残念ながらかすりもせず(^^;。
ま、いつものことながら突貫で作ったので当然と言えば当然。大賞を
取られた方、おめでとうございます。

で、何を応募したかと言うと→これ

「実用」ってことで、DLL(プラグイン)を作って、なでしこの命令セットが
弱い部分である「バイナリでのバッファ、ファイル、通信操作」をまとめて
みたんだけど、まあ組み込みでもやってない限りあまり実用的ではなかった
かなあ。

以前、組み込み用基板のシリアルポートテストをしようと思って
なでしこでアプリを書き始めた際、

・バッファの確保のし方が良くわからない
・確保したバッファにファイルからロードするには…
・バッファの内容をファイルに書き出すには…
・そもそもバッファの内容をシリアルで送信するときに、なでしこの
 命令ではうまくバイナリファイルを送信出来ない

などなど問題があったのがきっかけ。TCP/UDPあたりはオマケだけど
組み込み系でやりたい一応のことは出来すハズ。ホントはフレーム
処理なんかも入れたら良かったのかもなあ。

なでしこやその他のスクリプト言語もそうだけど、大体は文字列処理
とかに重きが置かれていて、それ故HTTPなどの文字列型プロトコル
とは相性がいいけど、バイナリデータ/ファイルを扱うのは結構大変
なんだよね(連続的なメモリ空間をデータ用に確保して、そのデータ
を固定長/可変長のフレームとして扱うのが難しい)

今回用意したプラグインに含まれる命令はこちら↓

■バイナリ操作・通信用プラグイン(nako_comm.dll Ver 1.0.0) 2015/06/28

【名前  】UNOパパ
【メール 】unoahpapaあgmail.com
【職業  】会社員
【使用 Ver】なでしこ Ver1.539
【使い方 】
  同梱のnako_comm.dllをなでしこの\plug-insフォルダにコピーしてください。

【ポイント】
    組み込みなどのボードを使用する場合、PC側からの操作はシリアルであったり
    TCP・UDP/IP通信であったりしますが、その通信内容はバイナリデータ通信
    です。今回準備した命令群を使用すれば、バイナリファイル・データ操作や
    シリアル、IP通信などがひと通り行えます。
 
    これらを使用して、なでしこの使用可能分野が広がれば幸いです。

【概要  】
    なでしこではバイナリデータを扱うための命令が揃ってない様でしたので
    プラグインとして用意してみました。基本的にはC言語でできることを
    幾つかなでしこの命令として作りこんでます。以下の操作を実施できます。

 ◇ハンドル
    ・ハンドルタイプ取得
    ・ハンドル解放

  ◇バイト操作
    ・バイト初期化
    ・バイト代入
    ・バイトエンディアン変換
    ・バイト数値取得

  ◇ビット操作
    ・ビットチェック
    ・ビットセット
    ・ビットクリア
    ・ビットXOR
    ・ビット右シフト
    ・ビット左シフト

  ◇バッファ操作
    ・バッファ初期化
    ・バッファクリア
    ・バッファコピー
    ・バッファ追加コピー
    ・バッファ読込
    ・バッファダンプ
    ・バッファ書込
    ・バッファバイト読込
    ・バッファバイト書込
    ・バッファ比較
    ・バッファサイズ取得
    ・メモリ使用サイズ取得

  ◇バイナリファイル操作
    ・Bファイルオープン
    ・Bファイル読込
    ・Bファイル書込
    ・Bファイルシーク
    ・Bファイル位置取得

  ◇ソケット通信
    ・ソケットハンドル取得
    ・ソケットオープン
    ・ソケット接続待ち
    ・ソケットデータ送信
    ・ソケットデータ受信
    ・ソケット受信確認

  ◇シリアル通信
    ・シリアルオープン
    ・シリアルデータ送信
    ・シリアルデータ受信
    ・シリアルデータサイズ取得

○ハンドルについて
 バイト、バッファ、ファイル、ソケット、シリアルポートなどは初期化
  (オープン)した場合にハンドルを返す様になってます。例えばバッファ
  はその実体はプラグイン中でmalloc()したポインタを管理しており、
  その管理構造体のINDEX(整数)を返していると思ってください。

  ハンドルは全部で1024個確保することが可能で、使用後は必ず解放する
  必要があります(「ハンドル解放」命令を使用)。このプラグインで
  確保できるメモリなどは、すべてグローバルに置かれていて、なでしこの
  命令のスコープから見ても常にグローバルです。したがって、なでしこの
  関数内でコールした場合でも、必ず解放しなければ、関数終了後もプラグイン
  中に実体が残っていることに注意してください。

○バイト/ビット操作について
 バイト操作は1、2、4バイトの大きさのデータを取り扱います。バッファと
  してこれらの大きさのメモリ領域を確保しても同じですが、その場合は
  ビット操作等が行えません。ビット操作は、「バイト初期化」で得られた
  バイトハンドルに対してのみ行なえます。

  バイト初期化した2byte, 4byteのデータはリトルエンディアンでメモリ
  上に配置されます。ビッグエンディアンにしたい場合には、
  「バイトエンディアン変換」命令でバイトオーダーを変更出来ます。
  再度この命令をコールするとリトルエンディアンに戻ります。

  「バッファバイト読込」「バッファバイト書込」を使用すれば、バッファの
  任意の位置からバイトデータを切り出したり、書き込んだりすることが
  可能です。

  バイト初期化で指定したバイト数は「メモリ使用サイズ取得」命令で取得
  することが出来ます。この命令はバッファに対していも有効です。

○バッファについて
 「バッファ初期化」命令でサイズを指定してハンドルを取得することが
  出来ます。内部ではmalloc()してます。初期化直後はメモリはAll 0で
  クリアされます。別の値でクリアした場合は「バッファクリア」命令を
  実施してください。

  「バッファ読込」命令を指定すると、バッファの内容を文字列で取得
  出来ます。「00 00 00 00 00 00...」の様に16進数を半角スペースで
  区切った形式で出力されます。「バッファダンプ」命令も同様ですが
  こちらの場合は16個ごとに改行が挿入されます。

  この形式の文字列を「バッファ書込」命令を使用して、バッファにバイナリ
  データとして書き込むことも出来ます。但し、いずれの場合も取り扱える
  バイナリデータサイズは1024 byteとなっています。

○ファイルについて
 なでしこのファイル操作命令は文字列がメインで、バイナリデータを
  バッファに取り込んでごにゅごにょ…のやり方が不明だったので、
  命令群を追加しました。

  ファイルの読み書きに使うデータはバッファハンドルを使ってバイナリ
  データをやりとりします。バイナリデータ、と書いてますが、テキスト
  もバイナリデータの一種ですので、テキストファイルでもオープン出来
  ます(改行コードやタブコードもそもままバッファに読み込まれます)

○ソケット通信について
 ソケットはいわゆるBSDのsocket()系の関数を使用しています。TCP/UDP
  の通信が可能です。UDPについてはマルチキャストとブロードキャストには
  対応してません。また使用できるアドレスはIPv4アドレスのみとなります。
  (IPv6には現在非対応)。

  通信する場合は実際はselect()を別スレッドで回して…としても良かった
  のですが、内部でスレッドは作らない方針としましたので、
  「ソケット受信確認」命令でデータの受信、及びTCPサーバ時の接続を
  待つ(チェックする)ことが出来ます。この命令はチェックだけして
  すぐに抜けてくる一方、TCPサーバ時の「ソケット接続待ち」命令、
  及びTCP/UDP時の「ソケットデータ受信」はブロック命令です(受信が
  あるまでそのプロセスは待ち状態になります)。「ソケット受信確認」で
  受信があった場合はそれぞれのブロック命令を実施するのが良いでしょう。

 送信、受信のデータ格納には上記のバッファハンドルを使用します。

○シリアル通信
 普通のシリアル通信ですが、なでしこのnakors232c.dllは昔バイナリデータの
  送受信が上手く行かなかった記憶があったので追加しました(今は上手く行く
  のかもしれません)。

  データ受信の際は「シリアルデータサイズ取得」命令でWindowsのシリアル
  ドライバが持っているバッファ(これはこのDLLのバッファとは別物)に
  溜まっているデータサイズを確認出来ます。これが1以上の場合に
  「シリアルデータ受信」命令で受信するようにすると良いでしょう。

  こちらもソケット通信同様、送信、受信のデータ格納には上記のバッファ
  ハンドルを使用します。

○命令詳細

[int:]→整数
[str:]→文字列

---------------------------------------------------------------------------------------------------
【名前】バイト初期化
【書式】[int:数値]を [int:サイズ]で バイト初期化
【戻値】[int:バイトハンドル]
【説明】
    指定した数値をサイズ分のバイトデータとしてハンドルを
    確保する。値はリトルエンディアンでメモリ上に書き込まれる。
 
    サイズには1,2,4のいずれかを指定する。
 
    成功した場合には0以上のハンドル値が、失敗した場合は-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】バイト代入
【書式】[int:バイトハンドル]へ [int:数値]を [int:サイズ]で バイト代入
【戻値】[int:結果]
【説明】
    指定した数値をサイズ分のバイトデータとしてハンドルに代入する。
 
    サイズには1,2,4のいずれかを指定する。

    成功した場合0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バイトエンディアン変換
【書式】[int:バイトハンドル]を バイトエンディアン変換
【戻値】[int:結果]
【説明】
    指定のハンドルが保持している値のエンディアンを変換する。
 
    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バイト数値取得
【書式】[int:バイトハンドル]の バイト数値取得
【戻値】[int:数値]
【説明】
    ハンドルの現在の値を取得する。数値で取得する場合は現在メモリ上に
    あるバイト列をリトルエンディアンとみなして取得する。
 
    成功した場合は数値が、失敗した場合は0が返される。(数値が0の
    場合も0が返される)。
---------------------------------------------------------------------------------------------------
【名前】ビットチェック
【書式】[int:バイトハンドルA]を [int:バイトハンドルB]で ビットチェック
【戻値】[int:結果]
【説明】
    バイトハンドルAの中にバイトハンドルBのビットパターンが
    含まれているかどうかをチェックする。

    含まれている場合は1、含まれていない場合は0が返される。
    エラーがあった場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビットセット
【書式】[int:バイトハンドルA]へ [int:バイトハンドルB]を ビットセット
【戻値】[int:結果]
【説明】
    バイトハンドルAに対して、バイトハンドルBのビットパターンを
    セットする。AとBの論理和をとった結果がAに代入される。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビットクリア
【書式】[int:バイトハンドルA]を [int:バイトハンドルB]で ビットクリア
【戻値】[int:結果]
【説明】
    バイトハンドルAに対して、バイトハンドルBのビットパターンを
    クリアする。AとBのビットを反転した値の論理積の結果がAに代入
    される。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビットXOR
【書式】[int:バイトハンドルA]を [int:バイトハンドルB]で ビットXOR
【戻値】[int:結果]
【説明】
    バイトハンドルAと、バイトハンドルBのビットパターンの
    排他的論理和をとった結果がAに代入される。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビット右シフト
【書式】[int:バイトハンドル]を [int:ビット数]だけ ビット右シフト
【戻値】[int:結果]
【説明】
    バイトハンドル中の値をビット数だけ右にビットシフトして、元の
    バイトハンドルに反映する。

    バイトハンドルはメモリ上のバイト配列をリトルエンディアンと
    してシフト操作を実施する。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビット左シフト
【書式】[int:バイトハンドル]を [int:ビット数]だけ ビット左シフト
【戻値】[int:結果]
【説明】
    バイトハンドル中の値をビット数だけ左にビットシフトして、元の
    バイトハンドルに反映する。

    バイトハンドルはメモリ上のバイト配列をリトルエンディアンと
    してシフト操作を実施する。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ初期化
【書式】[int:サイズ]で バッファ初期化
【戻値】[int:バッファハンドル]
【説明】
    メモリを動的に確保して、そのハンドルを返す。成功した場合、
    0以上のハンドル値が、失敗した場合には-1が返される。

    なお、メモリは動的に確保されているので、使用後はかならず
    ハンドル解放を実施すること。

    初期化後はすべての領域が0で初期化され、使用サイズ=サイズ
    となる。
---------------------------------------------------------------------------------------------------
【名前】バッファクリア
【書式】[int:バッファハンドル]を [int:クリア値]で バッファクリア
【戻値】[int:結果]
【説明】
    バッファ初期化命令で取得したハンドルの領域をクリア値を用いて
    クリアする。クリア値には0から255($00~$FF)までの1byte値を
    指定する。

    成功した場合は0が、無効なハンドル、クリア値を指定した場合は
    -1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファコピー
【書式】[int:元バッファハンドル]の [int:オフセット]から [int:サイズ]を [int:先バッファハンドル]へ バッファコピー
【戻値】[int:サイズ]
【説明】
    元ハンドルのオフセット位置からサイズ分のデータを、先ハンドル
    (の先頭)へコピーする。コピーした場合、先ハンドルの使用サイズは
    本命令でコピー出来たサイズとなる。
 
    成功した場合はコピーサイズが、無効なハンドルを指定した場合
    には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ追加コピー
【書式】[int:元バッファハンドル]から [int:先バッファハンドル]へ [int:サイズ]を バッファコピー
【戻値】[int:サイズ]
【説明】
    元ハンドルから、先ハンドルに、サイズ分のデータを追加コピーする。
    追加されたデータは先ハンドルの使用サイズの最後に追加される。

    成功した場合はコピーサイズが、無効なハンドルを指定した場合
    には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ読込
【書式】[int:バッファハンドル]の [int:オフセット]から [int:サイズ]を バッファ読込
【戻値】[str:HEX文字列]
【説明】
    バッファハンドルのオフセット位置からサイズ分のデータを文字列に
    変換して返す。文字列は「01 23 45 67 89 AB CD EF 」の様にHEX値を
    半角スペースで区切った形式で返される。
 
    出力出来る最大サイズは1024バイト分である。
---------------------------------------------------------------------------------------------------
【名前】バッファダンプ
【書式】[int:バッファハンドル]の [int:オフセット]から [int:サイズ]を バッファダンプ
【戻値】[str:HEX文字列]
【説明】
    動作は「バッファ読込」命令と同じだが、本命令ではバイナリデータ
    文字列のHEX値16個ごとに改行を挿入して返す。

    出力出来る最大サイズは1024バイト分である。
---------------------------------------------------------------------------------------------------
【名前】バッファ書込
【書式】[int:バッファハンドル]の [int:オフセット]へ [str:HEX文字列]を バッファ書込
【戻値】[int:結果]
【説明】
    バッファハンドルのオフセット位置に、HEX文字列を数値に変換した
    値を書き込む。
 
    入力出来る最大サイズは1024バイト分である。
 
    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファバイト読込
【書式】[int:元バッファハンドル]の [int:オフセット]から [int:サイズ]を [int:先バイトハンドル]へ バッファバイト読込
【戻値】[int:結果]
【説明】
    コピー元となるバッファハンドルのオフセット位置からサイズ分を、
    読み込み、バイトハンドルにコピーする。サイズには1,2,4のいずれかを指定する。
    エンディアンはバッファハンドル中のデータのそれが保存される(コピー過程で
    エンディアン変換することはない)。

    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファバイト書込
【書式】[int:先バッファハンドル]の [int:オフセット]へ [int:元バイトハンドル]を バッファバイト書込
【戻値】[int:結果]
【説明】
    コピー先のバッファハンドルのオフセット位置へ、バイトハンドルからデータを
    コピーする。コピーサイズはバイトハンドルの大きさに依存する。読込の場合
    同様、この過程でエンディアンが変換されることはない。
 
    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ比較
【書式】[int:バッファハンドル]と [int:バッファハンドル]を バッファ比較
【戻値】[int:結果]
【説明】
    2つのバッファハンドルを比較する。バッファのサイズが違う
    場合には小さい方のサイズに合わせて比較が行われる。

    内容が同じだった場合には1が、違った場合には0が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファサイズ取得
【書式】[int:バッファハンドル]の バッファサイズ取得
【戻値】[int:サイズ]
【説明】
    バッファハンドルとして確保されているメモリサイズを取得する。
 
    成功した場合は1以上のサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】メモリ使用サイズ取得
【書式】[int:ハンドル]の バッファ使用サイズ取得
【戻値】[int:サイズ]
【説明】
    バイトハンドル、もしくはバッファハンドルのメモリ中での使用サイズ
    を取得する。
 
    バッファに対して「コピー」「バイト書込」を実施した場合、また
    ファイル読込やソケット・シリアル受信を行った場合も、バッファの
    使用サイズはその時バッファに書き込んだサイズとなる。このバッファに
    対して「追加コピー」を実施した場合は使用サイズが増加し、クリア
    した時点で使用サイズ=サイズとなる。
 
    バイトハンドルの場合は1,2,4のいずれかが使用サイズとなる。

    成功した場合は1以上のサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイルオープン
【書式】[str:ファイル名]を [int:モード]で Bファイルオープン
【戻値】[int:ファイルハンドル]
【説明】
    ファイル名で指定されたファイルを、モードで指定された方法で
    オープンする。モードには0,1,2,3の何れかを指定し、意味は
    以下のとおり。

    読込:0
    書込:1
    読書:2
    追記:3

    既にファイルが存在している場合、書込モードでオープンすると内容が
    初期化されるので注意すること。

    成功すると0以上のハンドルが返される。失敗した場合には-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイル読込
【書式】[int:ファイルハンドル]から [int:サイズ]を [int:先バッファハンドル]へ Bファイル読込
【戻値】[int:サイズ]
【説明】
    オープンされているファイルハンドルから、サイズ分を読み込んで
    バッファに書き込む。読み込めるサイズはコピー先のバッファサイズに
    依存し、バッファサイズ以上のデータは読み込まない。読み込めたサイズは
    戻り値として返される。

    読み込み開始位置は現在の開始位置で、読み込む毎にオフセット
    がプラスされる。

    成功した場合は読み込めたサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイル書込
【書式】[int:ファイルハンドル]へ [int:元バッファハンドル]から [int:サイズ]を Bファイル書込
【戻値】[int:サイズ]
【説明】
    書込モード・読み書きモード・追記モードでオープンされている
    ファイルハンドルに対して、バッファからサイズ分のデータを
    書込む。
 
    成功した場合は書き込めたサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイルフラッシュ
【書式】[int:ファイルハンドル]を Bファイルフラッシュ
【戻値】[int:結果]
【説明】
    ファイル書込を行っている場合、Windowsのバッファに格納されている
    分はcloseしないとファイルに反映されない。これを強制的にファイルに
    追い出す(フラッシュ)する。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイルシーク
【書式】[int:ファイルハンドル]の [int:オフセット]へ Bファイルシーク
【戻値】[int:オフセット]
【説明】
    対象ファールのファイル読み書き位置を、先頭からのオフセット位置に
    変更する。

    成功した場合には実際に移動出来た分のオフセット値が、失敗した場合
    には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイル位置取得
【書式】[int:ファイルハンドル]の Bファイル位置取得
【戻値】[int:位置]
【説明】
    対象ファイルの現在のファイル読み書き位置を返す。
 
    成功した場合には現在の読み書き位置が、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットハンドル取得
【書式】[str:IPアドレス]の [int:ポート]で ソケットハンドル取得
【戻値】[int:ソケットハンドル]
【説明】
    「192.168.0.1」の様なIPアドレスと、通信用に使用するポートを
    指定してハンドルを取得する。この命令ではハンドルを取得した
    だけで、ソケット自体はオープンされていない。通信するためには
    引き続き「ソケットオープン」命令を使用すること。
 
    成功した場合には0以上のハンドル値が、失敗した場合には-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットオープン
【書式】[int:ソケットハンドル]を [str:相手IPアドレス]へ [int:タイプ]で ソケットオープン
【戻値】[int:結果]
【説明】
    「ソケットハンドル取得」で取得済のハンドルを使用して、以下の
    タイプの通信用のソケットをオープンする。

     0:TCPサーバ
    ※1:TCPクライアント
    ※2:UDP送信
     3:UDP受信

    ※のついたTCPクライアントとUDP送信タイプの場合には、相手IP
    アドレスの指定が必要である。それ以外の場合には相手IPアドレス
    は「」を指定する。
 
    TCPクライアントを指定した場合には、オープンする延長でサーバに
    接続する。
 
    成功した場合には0が、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケット接続待ち
【書式】[int:ソケットハンドル]で ソケット接続待ち
【戻値】[int:通信用ソケットハンドル]
【説明】
    TCPサーバ用にオープンしたソケットを使って、クライアントが
    サーバに接続してくるのを待つ。接続があった場合には新たな
    通信用ソケットハンドルが返され、以降通信にはそのハンドルを
    使用する。

    接続待ちしている間はプロセスがブロックされる。
 
    成功した場合には0が、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットデータ送信
【書式】[int:ソケットハンドル]で [int:バッファハンドル]から [int:サイズ] ソケットデータ送信
【戻値】[int:サイズ]
【説明】
    TCPで接続している(されている)かUDP送信モードでオープン
    しているソケットを使用して、バッファからサイズ分のデータを
    送信する。

    成功した場合には実際に送信出来たサイズが、失敗した場合には
    -1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットデータ受信
【書式】[int:ソケットハンドル]で [int:バッファハンドル]へ ソケットデータ受信
【戻値】[int:サイズ]
【説明】
    TCPで接続している(されている)かUDP受信モードでオープン
    しているソケットを使用して、相手側から送信されたデータを受信する。
    データがある場合にはそのデータを指定バッファにコピーする。
 
    受信に成功した場合には受信バイト数を返す。失敗した場合には
    -1を返す。
---------------------------------------------------------------------------------------------------
【名前】ソケット受信確認
【書式】[int:ソケットハンドル]の ソケット受信確認
【戻値】[int:結果]
【説明】
    指定ソケットにデータが届いているかどうかを確認する。データ受信
    関数はブロッキングするので、本関数で受信を確認してから受信すれば
    よい。

    データを受信している場合は1が、ない場合は0が返される。エラーの
    場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】相手IPアドレス取得
【書式】[int:ソケットハンドル]の 相手IPアドレス取得
【戻値】[str:相手IPアドレス]
【説明】
    TCPサーバ側に接続があり、新たにハンドルは生成された場合、
    もしくはUDPで受信した場合に、相手のIPアドレスをを文字列で取得する。
---------------------------------------------------------------------------------------------------
【名前】シリアルオープン
【書式】シリアルオープン([int:ポート]、[int:ボーレート]、[int:パリティ]、[int:ストップビット])
【戻値】[int:シリアルハンドル]
【説明】
    本関数は引数が多いので、なでしこ形式ではなく関数形式でコールする。

    パリティ-は
    0:なし
    1:奇数
    2:偶数

    のいずれかを指定する。ストップビット

    0: 1   bit
    1: 1.5 bit
    2: 2   bit

    のいずれかを指定する。

    成功した場合は0以上のハンドル値が返される。失敗した場合は-1が返される。        
---------------------------------------------------------------------------------------------------
【名前】シリアルデータ送信
【書式】[int:シリアルハンドル]で [int:バッファ]から [int:サイズ]を シリアルデータ送信
【戻値】[int:サイズ]
【説明】
    バッファからサイズ分のデータを、シリアルハンドルを使用して送信
    する。
 
    成功した場合は実際に送信出来たサイズが、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】シリアルデータ受信
【書式】[int:シリアルハンドル]で [int:バッファ]から [int:サイズ]を シリアルデータ受信
【戻値】[int:サイズ]
【説明】
    データがたまっているシリアルポートから、指定のサイズのデータを
    バッファ(ハンドル)へコピーする。
 
    成功した場合はコピー出来たサイズが返される。失敗した場合は-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】シリアルデータサイズ取得
【書式】[int:シリアルハンドル]の シリアルデータサイズ取得
【戻値】[int:サイズ]
【説明】
    対象のハンドルが対応するシリアルポートで受信して、Windowsのドライバ
    部分に保持されていて読み出し可能なデータサイズを取得する。
 
    成功した場合には読み出し可能なバイト数が、失敗した場合は-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】ハンドルタイプ取得
【書式】[int:ハンドル]の ハンドルタイプ取得
【戻値】[int:ハンドルタイプ]
【説明】
    指定ハンドルの種別を取得する。戻り値は以下のとおり。

    -1:エラー(使われてない、など)
    1:バイトハンドル
    2:バッファハンドル
    4:ファイルハンドル
    8:ソケットハンドル
    16:シリアルハンドル
---------------------------------------------------------------------------------------------------
【名前】ハンドル解放
【書式】[int:ハンドル]の ハンドル解放
【戻値】(なし)
【説明】
    ハンドルを解放する。ハンドルを解放することで、バッファハンドルの
    メモリ解放や、ファイルハンドルのクローズ処理などが実施される。
---------------------------------------------------------------------------------------------------

2015年8月23日日曜日

【Windows10】ACER Aspire REVO R3610にWindows10を入れてみる

さてさて、Windows10もリリースされたことですし(無料だし)、どっかに入れてみよう!
ってことで、現状サブマシンになってるR3610に入れていました。

■スペック
・マザー:nVidia ION Platform
・CPU:Intel ATOM 330(2core/4thread, 1.6GHz)
・MEM:2GB->4GB増設済
・HDD:160GB->500GB(SSHD)増設済
・Readyboost:余ってた16GBのUSBメモリ使用
・Net:100base-TX(ルータはBuffalo WZR-600DHP2,プロバイダはJ-COM)
・Wireless:未使用
・OS:Windows7(64bit)

■Windows10アップデート
予約してたんですが、なかなか降ってこなかったので、MSのページからプログラムを
DLしてインストール。インストール終わるのに3時間ぐらいかかった。

■アップデート後

・Windows7の時はR3610は4GBのメモリ中3GBしか認識しない仕様だったが
 Windows10にすると4GBフルに認識するようになった。これは嬉しい誤算。

・IMEとしてGoogleを使っていたが、アップデートするとMS-IMEに戻される。
 Google-IMEはインストールはされているが、切り替えないと使えない。
 しかも毎回切り替えがMSに戻る。

・コントロールパネルも「アイコン表示」を毎回選択するが、これが記憶されてない。

・動かないソフトは今のところない。

・WebブラウザはFirefox、Chromeを使っていたが、いずれも重くなった。
 それぞれのブラウザがまだWindows10に最適化されてない感じ。MS-Edgeが
 軽いかと言うと、似たようなもの。

 →YouTubeの動画見れるけど、なんか時々おかしくなる。Windows7の時より
  動作が明らかに重い時がある。今後改善されるかなあ…

・スタートメニューとか、デスクトップの感じは嫌いじゃない。タブレットとの互換性も
 考えたGUIになってるんだと思う。

・ストア用のアプリ使ってGooglePlay風なアプリ一覧を見れるけど、個人的には
 魅力的なアプリなし。AppleStoreやGooglePlayよりも、現状アプリは極端に
 少ない感じ。今後Windows10がPC/タブレット/スマホで広がって行って、
 ユニバーサルに使えるアプリが増えることを期待。

■結論

・新しいもの好きならアップデートしてみると楽しいかも。

・ただし、ATOM330程度のCPUなら、アップデートせずにWindows7で使ってる
 方がおそらく快適。やっぱり快適に使えるのってCore i3ぐらいかなあ。
 Celeronとかも、ちょっと前のやつは厳しいかも。