2018年10月22日

プログラミング言語について

世の中には、数え切れないほどのプログラミング言語が溢れている。
初心者におすすめの言語はあれど、最終的にはどれを覚えてもいいし、だいたい3,4言語をしっかり使い込むと、以後どんな言語でもそんなに掛からずに取り組めるようになる。
(個人的にはpythonあたりから入って、余裕があればCを覚えてほしい感がある)

それは置いておいて。
プログラミング言語を選ぶとき、何を基準に選ぶだろうか?

最終的にプログラミングの結果は、過程はどうあれ機械語に翻訳されて実行される。であるならばどんな言語を使っても過程はどうあれ最終的には同じ結果を実現できるはずである。なのに世の中にはプログラミング言語が溢れている。

数ある中で何が人を引きつけ、選ばせるのだろうか?理由はいくつかある。
一つは、言語そのものの機能だ。
これがないとその系統の言語でなければ実現できない・大変に面倒くさいというものがある。例えばC言語が未だに使われる理由である、生のメモリを扱えるポインタ。これがなければハードウェア的なことできない。またクリティカルなタイミングのためにアセンブリ言語。一部他のと被るが、CGや、仮想マシン上で動作させる必要があるなどもあるだろう。

一つは文法と支援だ。
最終的には機械語になるとしても、途中過程は人間が書く。人間はミスをする。C言語で書かれたプログラムに危険なバグが多く、アセンブリは言うまでもないのはそのへんの支援が薄いからだ。人間の振る舞いに制約を書けるのも支援、適当にしてもうまく書けるようにするのも支援。PythonやRust、Javaといった言語が広まったのはこの辺の効果がある。
※なんかjavascriptはこのへんワチャワチャしてるよね。

一つは豊富なライブラリ、そしてその支援システムだ。
コードの再利用性が高く、ライブラリが揃っていれば書く量が少なくて済む。バグも少なくなる。使っているユーザーが多ければ不具合が見つかりやすく直されやすい。
なにより、初心者が適当に書いてもわりといい感じの成果物が出来上がる。
かつてPerlとCPANが流行り、今はPythonとPipや、Javascript(node)とnpmなんかが流行る理由はこの辺もある。

最後に、環境・ランタイムの利点と制約だ。
おそらくだが、最終的な一番の理由はこれなのではないかと思う。
例えばiPhoneアプリを開発するにはSwiftかObject-Cしか使えない。Androidアプリならjavaか、Kotorinかを覚えないと細かいところがさわれない。ブラウザ上で動作させるならjavascriptしか使えない(頑張ればCも使えるけど)。マルチプラットフォームに対応させようと思うとjavaが楽。Unityで使うならC#(昔はjavascriptも使えた)。FlashAir上で動作させるならLuaしかない。

どこで、なにがしたいか。そのために何が使えるか...ではなく何を使わなければならないか。逆に言えば、環境での制約がないのなら何を使ってもいい。で、制約がない状態でどれを選ぶかと言われれば、現在活発的なユーザーと資料が多いものがいい
そして、実現したいものがなるべく楽で簡単にできるものがいい

最後のが重要で、逆に実現したいものがなるべく簡単で楽にできる環境を選ぶべきである。

自分にとってCが手に馴染んでいて、C以外使いたくないなら、Cで実現できる環境を選んで使えばいいし、なるべくコードを書きたくないなら、最先端のコード不要でほとんどのことができる、ユーザーの多い環境(Unityとか)を選んで、必要最低限のコードだけ書けばいい。

あと最後に。
よく勘違いしやすいし、環境上の制約でそうならざるを得ない場合もあるのだが、忘れないでほしいのは一つの言語ですべてを賄う必要はないということ。不得意なところは別の言語に投げてもいい。(ただしその分覚えることは増えるが)

例えば、UIはHTML+javascript、機械学習はpython、演算処理はC、プラグインはLuaのように。というもの、それらもまた結局、不得意なところ(大抵は速度面)は別の言語(たいていC)の成果物に投げている事が多い。

一つの言語を使っているように錯覚しても、DLLを使えば、最終的にはCに戻ってこれる。
(javascriptとかだとあまり頼ること少ないかも知れないけれど)
Cを学習するのが無駄にならないのは、これが理由の一つだ。
posted by gpsnmeajp at 17:22| Comment(0) | TrackBack(0) | プログラム

2018年09月15日

OpenVROverlayNotification ver alpha 0.1

OpenVROverlayNotification ver alpha 0.1

まだまだ開発途上ですが公開します。
現在Channel1のみ対応していますが、将来的には最低4は対応する予定です。

ダウンロード
https://sabowl.sakura.ne.jp/gpsnmeajp/unity/OpenVROverlayNotification/OpenVROverlayNotification.zip

※Windowsの通知をキャッチして表示しようと努力するツールを作りました。組み合わせてどうぞ
通知チェッカー.exe
https://sabowl.sakura.ne.jp/gpsnmeajp/unity/OpenVROverlayNotification/notice.zip





以下README.txtと同じもの

本ソフトウェアの目的
 VR空間内で長時間活動する場合、HMDを被っている都合上、外界から遮断された状態になります。
 特にソーシャルVRアプリケーションを利用している場合、他のアプリケーションに切り替えるなどするのは困難です。
 既存のオーバーレイソフトウェアを使用すればその問題は解決できますが、
 それらは常に視界に表示されていたり、コントローラーを視界に向けるなどしないと情報が見えず、常に新しい情報を待ち受けることはできませんでした。

 本ソフトウェアは、既存のソフトウェアからVR空間へ、スマートフォンの通知のような「プッシュ通知」を実現するための橋渡しのためのツールです。
 例えば地震情報や、SNSのリプライ通知、メールの新着といった「常に表示している必要はないが、すぐに知りたい情報」を表示するために使用できます。

 開発者は、本ツールを用いることで、VR空間における様々な手間や情報を知ること無く、
 一般的なpngファイルへの書き込みの知識さえあればVR空間に任意の情報を表示することができます。
 この単純な仕組みにより、あらゆる言語やツールを利用することができます。

 また、既存の地震情報などのツールを利用するため、簡易的ながらコマンドライン引数を
 VR空間に表示するサンプルプログラムを同梱しており、これを用いることでプログラミング無しで利用することもできます。

同梱物
 ・OpenVROverlayNotification.exe ソフトウェア本体
 ・notice\ch1.flg フラグファイル
 ・notice\ch1.json 設定ファイル
 ・notice\ch1.png 通知画像ファイル
 ・ch1string2png.exe 連携サンプルプログラム
 ・ch1string2png.hsp 連携サンプルプログラムのソース
 ・hspcv.dll 連携サンプルプログラムの画像拡張DLL
 ・その他すべての動作に不可欠なファイル

使い方(利用)
 Steam VRが起動している状態でOpenVROverlayNotification.exeを起動します。
 現状、ログ画面以外何も出ませんが、ウィンドウが出ていれば動作しています。

試験方法
 noticeフォルダのch1string2png.exeを起動して、黒い画面がVR空間に表示されれば動作しています。
 (表示されない場合はOpenVROverlayNotification.exeを再起動してください)

 ch1string2png.exeのコマンドライン引数に文字列を指定すると、その文字列が表示されます。
 $を文字列中に含ませると、その箇所は改行になります。

使い方(開発)
 本ソフトウェアは起動中、noticeフォルダ内の変更を監視しています。
 ch1.flgの中身を1にすると、現在のch1.jsonとch1.pngを読み込んでVR空間に表示します。
 ch1.flgの中身は自動で0に変更されます

 書き込みシーケンスは以下です。
  1. 表示したい情報をnotice\ch1.pngに書き込む
  2. 書き込み完了を通知するためにnotice\ch1.flgに1を書き込む
 (3. 本ソフトウェアが書き込みを検知する)
 (4. 本ソフトウェアがnotice\ch1.jsonを読み込む)
 (5. 本ソフトウェアがnotice\ch1.pngを読み込んでVR空間に表示する)
 (6. 本ソフトウェアがnotice\ch1.flgを0に戻す)

 ch1.jsonとch1.pngは存在しない場合はエラーとなり表示に失敗します。
 ch1.jsonの中身は、現在タイムアウト時間のみ存在します。秒数で指定します。

 ch1.pngは800x300のpngファイルを推奨します。
 これ以外のサイズでは大きすぎたり小さすぎたりします。また将来正常に読み込める保証ができなくなります。

 位置の変更、アニメーションの変更、透明度の変更などは将来的に対応する予定です。
 pngファイルのアルファチャネルには対応しています。

使用しているもの
・Unity 2018.2.6f1 Personal
・Steam VR Plugin
・HSP 3.5
・hspcv

本ソフトウェアに関するライセンス表記
zlib License
Copyright (c) 2018 GPS_NMEA_JP

This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.


HSPに関するライセンス表記
Hot Soup Processor (HSP)
Copyright (C) 1997-2014, Onion Software/onitama, all rights reserved.
Made with base technology of OpenHSP.

OpenHSP
Copyright (C) 1997-2014, Onion Software/onitama.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the Onion Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。

・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
・書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、Onion Softwareの名前またはコントリビューターの名前を使用してはならない。

本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。


hspcvおよびOpenCVに関するライセンス表記

HSPCVに含まれるOpenCVライブラリ(1.0)は、BSD Licenseとなっており、
以下に列挙するライブラリ部分の著作権表示を明示する必要があります。
(組み込みや配布に関しての制限はありません。また、ソースコードの公開義務
はありません。)

-----------------------------------------------------------------------
HSPCVに含まれるOpenCVライブラリ(1.0)は、Intel Corporationの著作物です。

Open Source Computer Vision Library
Copyright (C) 2000-2006, Intel Corporation, all rights reserved.

OpenCVライブラリ(1.0)に含まれるlibjpegライブラリはIJGの著作物です。
Copyright (C) 1991-1998, Thomas G. Lane.
this software is based in part on the work of the Independent JPEG Group

OpenCVライブラリ(1.0)に含まれるlibpngライブラリは以下の著作物です。

libpng version 1.2.8 - December 3, 2004
Copyright (c) 1998-2004 Glenn Randers-Pehrson
(Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
(Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)

OpenCVライブラリ(1.0)に含まれるzlibライブラリは以下の著作物です。

Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler

OpenCVライブラリ(1.0)に含まれるJasPerライブラリは以下の著作物です。

JasPer Version 2.0

Copyright (c) 1999-2000 Image Power, Inc.
Copyright (c) 1999-2000 The University of British Columbia
Copyright (c) 2001-2003 Michael David Adams

同梱されている以下のxmlファイルは、Rainer Lienhart氏が製作したものです。
haarcascade_frontalface_default.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml

HSPCV.DLL
Copyright (C) 2007, Onion Software, all rights reserved.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
-----------------------------------------------------------------------

(ライセンス表記は、配布物の中に上記の内容を含むテキストを含めるようにしてください。)

以上の項目を満たしていれば、ユーザーがHSPCV.DLLを使って作成したオリジナルの
ソフトウェア(実行ファイル)を、自由に通信、即売会、店頭などで展示、配布、販売
することができます。ライセンス料は必要ありません。

HSPCV.DLLの著作権はonion softwareにあります。
onion softwareは本プログラムによって生じた、いかなる損害についても保証いたしません。
自己の責任の範囲で使用してください。
また、付属のサンプルスクリプトも自由に改変、公開していただいて構いません。

HSPCV.DLLは、基本的にBSDライセンスのもと有償・無償を問わず
添付、複製、改編、再配布することができます。
ただし、その際には必ずライセンス表記も含めるようにしてください。

posted by gpsnmeajp at 23:11| Comment(0) | TrackBack(0) | プログラム

2018年07月11日

VRChat向け小ネタシェーダー(FPS表示・テクスチャ切り替え)

VRChatやってると、ちょっと変なシェーダーが欲しくなることありますよね。
スクリプト使えないのでAnimatorでなんとかしなきゃいけなかったりして。

ちなみにすべてUnlitです。

FPS表示


現在のFPS(フレーム/秒)を表示します。
ちなみにシェーダーが動作している人のfpsが表示されるので、アバターに仕込むと見る人によって数値が違います。
showfps.png

ダウンロード↓
https://sabowl.sakura.ne.jp/gpsnmeajp/blog/FPSMonitorShader.unitypackage

・使い方
1.読み込みます。
fps1.png
2. Shaderフォルダができます
fps2.png
3.Materialを適当なオブジェクトに突っ込みます
fps3.png
fps4.png
4. fpsが表示できました
showfps.png
5.ちなみに、alpha値を設定すると半透明になります。

テクスチャ切り替え


モデルのテクスチャを切り替えます。
・2つをきっちり切り替えるやつ
(0か1かしかない)
switch2.png

・2つをスムーズに切り替えるやつ
(例えば0.5で2つのテクスチャが均等に混ざる)
switch2smooth.png

・8つをきっちり切り替えるやつ
switch8.png
の3種類あります。

ダウンロード↓
https://sabowl.sakura.ne.jp/gpsnmeajp/blog/TextureSwitcherShader.unitypackage

・使い方
1.読み込みます。
tex1.png
2. TexSwフォルダができます
tex2.png
tex3.png
3. 試しにこんなふうに設定してみると
tex4.png
0にするとこう
tex5.png
1にするとこうなります。
tex6.png
4.Animationでは、_Switch変数を操作すると同じことができます。
tex7.png
値を直でセットしてください。
tex8.png

シェーダーを始めるにあたって参考にした文献
https://docs.unity3d.com/jp/460/Manual/SL-BuiltinValues.html
https://qiita.com/sune2/items/fa5d50d9ea9bd48761b2
http://izmiz.hateblo.jp/entry/2014/02/23/223405
http://baba-s.hatenablog.com/entry/2018/01/09/090000
http://marupeke296.com/UNI_S_No2_ShaderLab.html
http://marupeke296.com/UNI_S_No3_SurfaceShader.html
http://www.suitechlog.net/entry/2017/12/11/190937
http://light11.hatenadiary.com/entry/2018/05/06/230414
https://qiita.com/moca_uni/items/4e71e423c84f830687f1
http://www.jonki.net/entry/20140209/1391944797
https://qiita.com/edo_m18/items/591925d7fc960d843afa
https://docs.unity3d.com/ja/current/Manual/SL-BuiltinFunctions.html
https://answers.unity.com/questions/192553/camera-forward-vector-in-shader.html
https://www.slideshare.net/kurisaka_konabe/20121208-unityhack-billboard
http://wordpress.notargs.com/blog/blog/2015/11/10/unity%E5%BA%8A%E5%B1%8B%E3%81%AE%E3%81%82%E3%82%8C%EF%BC%88%E3%82%B5%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%AB%EF%BC%89%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3/
https://qiita.com/edo_m18/items/d6a5a39e9b42da723663
http://ch.nicovideo.jp/tenoji/blomaga/ar1527951


ライセンス表記が必要な用途で使用する場合
MITライセンスとします。

MIT License

Copyright (c) 2018-2021 gpsnmeajp

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

posted by gpsnmeajp at 21:10| Comment(0) | TrackBack(0) | プログラム

2018年07月01日

#VRChat のログをHMDでも見たい時用PowerShellスクリプト

ワールドのデバッグ等々の際ログを見たくなりますが、HMDをかぶっているとうまく表示されないものです。
そこでWindows Power Shellを使って、VRChatのログを表示しましょう。
vvvlog.png

*注意
※製作者はWindows Power Shellは初心者です。
 これを実行したことによる損害等の保障は一切しません。
 スクリプトをざっと読んで何をするのか理解した上で実行してください。


*仕組み
VRChatのデバッグログファイル(%appdata%\..\LocalLow\VRChat\vrchat;output_log.txt)を
リアルタイムに読んでいるだけです。ので、チートとかには該当しないと思います。

VRChatのメニューキー+3とほぼ同じ情報が出ていると思います。

VRChatを長時間立ち上げ続けていると、ファイルが分割されて表示できなくなることがあります。
その際はVRChatを起動し直すか、コマンドのファイル名を修正してください。

*最も基本的な手順
1. Windows Power Shellを起動する(スタートメニューにあるはず)

2. 以下のコマンドを入力してEnter(長いが1行。コピペでどうぞ)

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -ne "" } | % {$_ -replace "</?color.*?>",""}


コードの内容
・VRChatのログファイルの最新情報をUTF-8で常に読み込みながら
・空行を削除しながら
・Unity用のcolorタグを削除しながら
・画面に表示する

3. 出てきた画面をOVRDropなどを利用してVR空間に表示する

フォントサイズを大きくすると見やすくなります。
設定はPowerShellのタイトルバーを右クリックして出てきた設定から。

ログを止めたいときはScroll Lock
終了したいときはCtrl+Cか、PowerShellを閉じる。

*特定の文字を含むログを出したい場合
例えばIKを含むものの場合

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -like "*IK*" } | % {$_ -replace "</?color.*?>",""}


例えばExecuting event(ワールドでのトリガなどの始動)を含むものの場合

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -like "*Executing event*" } | % {$_ -replace "</?color.*?>",""}


例えばSwitching (プレーヤー名) to avatarを含むものの場合

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -like "*Switching * to avatar*" } | % {$_ -replace "</?color.*?>",""}


*色をつける・音を鳴らす
長くて改行も含んでますが、コピペで入力してください
いろいろとワールド制作に便利そうなのを強調したりしてみています

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding -last 5 UTF8 | ? {$_.trim() -ne "" } | % {$_ -replace "</?color.*?>",""} | % {
$msg = $_ -replace "</?color.*?>",""
if($_ -match "uSpeak"){
#uSpeakを含むとき表示しない
}elseif($_ -match "APIUser"){
#APIUserを含むとき表示しない
}elseif($_ -match "The referenced script on this Behaviour"){
#The referenced script on this Behaviourを含むとき表示しない
}elseif($_ -match "Can not play a disabled audio source"){
#Can not play a disabled audio sourceを含むとき表示しない
}elseif($_ -match "IK\[VRCPlayer"){
#IK[VRCPlayerを強調
Write-Host $msg -backgroundcolor DarkRed
}elseif($_ -match "Photon"){
#Photonを強調
Write-Host $msg -backgroundcolor DarkRed
}elseif($_ -match "OnPlayerJoined"){
#OnPlayerJoinedを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(800, 100)
[Console]::Beep(4070, 100)
}elseif($_ -match "I am MASTER"){
#I am MASTERを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(2000, 100)
}elseif($_ -match "Room"){
#Roomを強調
Write-Host $msg -backgroundcolor DarkCyan
}elseif($_ -match "OnPlayerLeft"){
#OnPlayerLeftを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(300, 100)
[Console]::Beep(150, 100)
}elseif($_ -match "triggered"){
#triggeredを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(500, 10)
}elseif($_ -match "OnOwnershipTransfered"){
#OnOwnershipTransferedを強調
Write-Host $msg -backgroundcolor Black
[Console]::Beep(400, 10)
}elseif($_ -match "Executing event"){
#Executing eventを強調
Write-Host $msg -backgroundcolor DarkGreen
[Console]::Beep(700, 10)
}elseif($_ -match "Preparation has taken"){
#Preparation has takenを強調
Write-Host $msg -backgroundcolor DarkGreen
[Console]::Beep(700, 10)
}elseif($_ -match "to avatar"){
#Switching * to avatarを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(300, 10)
}elseif($_ -match "Warning"){
#Warningのとき
Write-Host $msg -foregroundcolor red
}elseif($_ -match "Exception"){
#Exceptionのとき
Write-Host $msg -foregroundcolor yellow
}elseif($_ -match "Error"){
#Errorのとき
Write-Host $msg -foregroundcolor Cyan
}else{
#Logのとき
Write-Output $msg
}
}


*入退室情報だけ表示する
長くて改行も含んでますが、コピペで入力してください

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding -last 5 UTF8 | ? {$_.trim() -ne "" } | % {$_ -replace "</?color.*?>",""} | % {
$msg = $_ -replace "</?color.*?>",""
if($_ -match "OnPlayerJoined"){
#OnPlayerJoinedを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(800, 100)
[Console]::Beep(4070, 100)
}elseif($_ -match "OnPlayerLeft"){
#OnPlayerLeftを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(300, 100)
[Console]::Beep(150, 100)
}else{
#その他は表示しない
}
}

posted by gpsnmeajp at 04:22| Comment(0) | TrackBack(0) | プログラム

2018年02月03日

Felica Liteの中身をダンプしたりNDEFタグ化したりするツール作った

EasyPCSCFelicaLiteConsoleを作りました.
タイトルの通り,Felica Liteの中身をダンプしたりNDEFタグ化したりするツールです.
いろいろ入れたりする必要なく,EXEファイル1つとPaSoRiの標準PC/SCドライバで動く軽量ツールです.
https://sabowl.sakura.ne.jp/gpsnmeajp/cpp/easypcscfelicaliteconsole/

shot1.png

ここ数日開発していたライブラリのLazyPCSCFelicaliteは,これを作るため以前作成したプログラムをライブラリ化していたら火がついてしまって作り込んでしまったものです.

こちらはこちらで,MACを使用した片側認証・相互認証に対応した力作です.
ライセンスも緩めですので,どうぞご利用ください.
https://sabowl.sakura.ne.jp/gpsnmeajp/cpp/lazypcscfelicalite/
posted by gpsnmeajp at 23:28| Comment(0) | TrackBack(0) | プログラム

2017年11月22日

BLE (Bluetooth LE)に関するメモ

BLE (Bluetooth LE)に関して、自分が疑問に思ったこと、突っかかったことのメモ。
誤りが大量に含まれている恐れがあります。

・BLEは基本的にGATTの操作が主となる。
[物理層]→[L2CAP]→[ATT]→[GATT] GATT(読み書き)はこのように積み重なっている
[物理層]→[L2CAP]→[SMP]→[GAP] GAP(アドバタイジング・接続処理)はこのようになっている。
 ※上記から、アドバタイズメントとGATTは別物。

・GATTは、名前付き変数の操作・取得をするための構造と考えるとわかりやすい。
・そのシンプル化された仕様の結果、汎用性と相互接続性が高い。

・GATTはリモコン的な状態の変更・取得が主であり、ストリーム的通信には至極向いていない。
 デバッグも難しくなる(単なる変更・取得ならば多くのBLE探査ソフトウェアが使用できるが、
  ストリームの場合は専用アプリを作らざるをえない。)
 ※UARTとか、MIDIとかあるけどね...

・ストリーム的通信をしたければL2CAPを直接使うようだ。(よくわからない)


・パケットペイロードサイズは27Byte。
・転送可能なデータサイズ(MTU)は23Byte。(これはMTU交換により最大251バイトまで大きくなる)
・一般的に用いられるキャラクタリスティックのサイズは20Byte程度。Read Characteristicで読める。
・キャラクタリスティックの最大サイズは512Byte。
 Read Long Characteristic(Read Blob Request)で2バイトのオフセットを指定して複数回読み出すことで読み出せる。
 
・複数のキャラクタリスティックを一括で読み出すこともできる。
・長いキャラクタリスティックをキューイングして書き込むこともできる

・アドバタイジングのデータサイズは31byte。(パケットサイズは37Byte)
 スキャン応答時も同じサイズの、中身の違うデータを返すことができる。

・ボンディングとペアリングがあるが、Bondingが多分思ってるやつ。
 暗号化するのが普通だが暗号化しないこともできる。
・通常、MACアドレスはランダム化されていて、再接続や追跡は困難だが、
 Bondingされている相手ならMACアドレスを復元して再接続可能

・BLEデバイスは、基本通信やBondingが成立すると無向アドバタイジングを止める。
 接続情報のリセットが行われるまでこの状態なことが多い。省電力性と隠匿性のため。
 特定の機器と即座に接続したい場合は、有向アドバタイジングを行う。
 ただスマホ向けの機器の場合や、接続待ちの場合は延々と無向アドバタイジングし続ける事が多い。用途による。

・変数に当たるのがCharacteristic
・Characteristicを束ねたものがService
・用途別に同名のCharacteristicが存在しうるがServiceで区別できる
・CharacteristicもServiceも、UUIDあるいはHandleで区別する。
・UUIDは変化しない固有のもの、Handleは電源再投入などで変化しうる
・UUIDは長くデータ効率が悪いが確実、Handleは短く効率が良いが不確実
 ※もっとも、スマートホン等では接続時にServiceやCharacteristicの検索を行い、
  内部的にUUIDからHandleに変換するので気にすることはない。
  →キャッシュに注意。Peripheralから更新通知ができる。

・GATTの接続・切断と、物理的な電波の接続・切断は別?

・Peripheralから能動的に送信するにはNotificationを使用する。
・Indicationは確認付きのNotificationである。

・通信路の暗号化をしたければBonding
・正規品認証をしたい場合は、Challenge & Response

参考文献
BLEの通信仕様 | Reinforce-Lab.'s Blog

[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [GD] & Professor Shi-Cho Cha [CSC]
posted by gpsnmeajp at 21:41| Comment(0) | TrackBack(0) | プログラム

2017年10月10日

FlashTools Serial Terminal v0.01

ブラウザからFlashAirのシリアルポートを叩くツールを作ってみました。無駄にArduino IDEのシリアルモニタっぽいです。
高速に受信すると取りこぼすので、実用性は不明です。



http://sabowl.sakura.ne.jp/gpsnmeajp/files/FTST.zip
posted by gpsnmeajp at 18:12| Comment(0) | TrackBack(0) | プログラム

2017年10月06日

FlashAirのserialを使ってシェルっぽいもの

FlashAirにせっかくシリアル通信機能がついたので、適当にババっとシェルっぽいものを作ってみた。
ちょうどコマンドインタプリタが作りたい時期だったので、ぴったりでした。

shelllike.png

シリアルコンソール的な感じで、変換アダプタなりなんなりを噛ませて繋いでください。
一応、FTLE上で走らせる前提になってます。開発途中なので。ブラウザから実行してください。
(設定すれば起動時実行もできるとは思います。)

3.3Vの変換アダプタを使ってくださいね。
Tx: D0
Rx: CMD

lsとcdとcatとexitくらいしか使えません。
LuaFileSystemの機能が思ってた以上に削られててびっくりしたよね。


require "/FTLE/breakpoint"

--[[
LuaFileSystemで使えるもの一覧

dir
rmdir
touch
mkdir
attributes
]]

last_cmd = ""
pwd = "/"

--文字列として送信する
function put(s)
fa.serial("write",tostring(s))
collectgarbage()
end

--1文字送信する
function putc(c)
fa.serial("write",c)
end

--改行付きで文字列を送信する(printと同じく可変長で受け付ける)
function puts(...)
for i = 1, select("#", ...) do
local s = select(i, ...)
if(s == nil)then
s=""
end
put(s)
put(" ")
end
put("\r\n")
end

--受信バッファを空にする
function clean()
while fa.serial("read") ~= nil do
breakpoint()
collectgarbage()
end
end

--1ライン消去
function linedel(s)
for i=0,s:len() do
putc("\x08") --表示上の文字を削る
putc(" ")
putc("\x08")
end
end

--1文字受け取る。受け取るまでロックする
function getc()
while true do
local c = fa.serial("read")
if(c ~= nil)then
return string.format("%c",c)
else
sleep(1)
collectgarbage()
breakpoint()
end
end
end

--文字列を受け取る。受け取るまでロックする
function gets()
local buf = ""
while true do
local c = getc()
if(c == "\x1B")then
if(getc() == "\x5B")then
if(getc() == "\x41")then --↑キーを押した場合は前回の入力を返す
linedel(buf) --行を消し
putc(">")
put(last_cmd) --改行なしで出力
buf = last_cmd
end
end
c="" --何もなかったことにする
end

--改行コード
if(c == "\x0D" or c == "\x0A")then
puts() --改行
clean();
return buf
end

--BS, DEL
if(c == "\x08" or c == "\x7F")then
if(buf:len() > 0)then --1文字以上のとき
putc("\x08") --表示上の文字を削る
putc(" ")
putc("\x08")

buf = buf:sub(1,-2) --1文字削る
end
end

--Break / Ctrl + C
if(c == "\x03")then
error("SIGINT")
end


--puts(string.format("%02X",string.byte(c))) --16進数でエコーバックする
if(c >= "\x20" and c <="\x7e" )then --表示可能文字のとき
putc(c) --エコーバックする
--puts(string.format("%02X",string.byte(c))) --16進数でエコーバックする
buf = buf .. c --バッファに追加
end
end
end

--初期化とウェルカムメッセージ
function init()
fa.serial("init")
puts(fa.control("eva"))
puts("Welcome to FlashTools Minimal Shell v0.1")
end

-----------------------------
--シェルレベルで必要な機能

function getAbsolutePath(path)
if(path == ".")then
return pwd
end
--一つ上に戻る
if(path == "..")then
local x,y,path = pwd:find("([^%c]+)%/")
if(path == nil)then
return "/"
else
return path
end
end
local head = path:sub(1,1)
if(head == "/")then --先頭が/なら絶対パス
return path
else
if(pwd == "/")then
return "/"..path --ルートのときは特別です
else
return pwd.."/"..path --先頭が/じゃないなら相対パス
end
end
end
getAbsolutePath("DCIM")

-----------------------------
--コマンド実装

function cmd_help()
puts("--- help ---")
puts("EXIT : exit shell")
puts("ERROR : test shell error handling")
puts("CAT [path] : view file")
puts("LS [path] : file list")
puts("CD [path] : Change directory")

--[[
EXIT
VIEW
CD
LS
RM

CP
mv
call

]]
end

function cmd_cat(arg)
local path = getAbsolutePath(arg)
local f = io.open(path)
if(f == nil)then
puts("cat: file not found.")
return
end
while true do
local d = f:read("*l")
if(d == nil)then
break
end
d = d:gsub("\x0D","") --改行キラー
d = d:gsub("\x0A","")
puts(d)
end
end

function cmd_ls(arg)
local mode = ""
local path = pwd
if(arg ~= "")then
path = getAbsolutePath(arg)
end

puts(path)
for file in lfs.dir(path) do
local info = lfs.attributes(path.."/"..file)
if(info.mode == "directory")then
mode = " DIR:"
end
if(info.mode == "file")then
mode = "FILE:"
end
puts(mode,file)
end
end

function cmd_cd(arg)
if(arg == "")then
arg = "."
end

local path = getAbsolutePath(arg)
if(pcall(lfs.dir,path) == true)then --存在チェック(無存在でエラー吐くので保護実行)
pwd = path
puts(path)
else
puts("cd: not found")
end
end


-----------------------------

--コマンド処理
function process()
while true do
putc(">")
last_cmd = gets()
local cmd,x,arg = string.match(last_cmd, "(%g+)(%s*)([%g%s]*)") --コマンドと引数に分ける。コマンド間のスペースは複数入れてもOK
if(cmd ~= nil)then
cmd = cmd:upper() --コマンドは大文字にする
else
cmd = ""
end

--puts("CMD:",cmd)
--puts("ARG:",arg) --Argはあえて前処理しない。アプリケーションに任せる

if(cmd == "EXIT")then
puts("Bye!")
return
elseif(cmd == "ERROR")then
error("Test Error")
elseif(cmd == "HELP")then
cmd_help(arg)
elseif(cmd == "CAT")then
cmd_cat(arg)
elseif(cmd == "LS")then
cmd_ls(arg)
elseif(cmd == "CD")then
cmd_cd(arg)
else
puts("command not found")
end
end
end

init()

success = false
while (not success) do
success, errmsg = pcall(process)
if(success == false)then
puts()
puts("--- Shell Error ---")
puts(errmsg)
puts("-------------------")

--Ctrl+Cで止められたら便利かなと
if(errmsg:match("SIGINT") ~= nil)then
break
end
end
end

puts("-- Shell terminated --")
print("end")
posted by gpsnmeajp at 00:15| Comment(0) | TrackBack(0) | プログラム