まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2019/08

先日行われた「Maker Faire Tokyo 2019 」で購入した「キータッチ」というガジェットを使ってみました:
https://keytouch.org/

2019080703


キータッチは "Raspberry Pi Shop" として有名な長野県の株式会社ケイエスワイ様が製造・販売している電子ボードのガジェットです。ラズベリーパイと接続しても使えますが、Windows や macOS の PC でも利用できます:
2019080700


キータッチは「キーボードの信号をエミュレート」するガジェットです。USB キーボードのように USB ケーブルでキータッチと PC やラズパイを接続して使います(接続した PC から電気供給を受けるので、キータッチ側に電源は不要です)。そしてキータッチからの信号を受けると、PC 側でキー処理が行われます。例えば PC 側で「メモ帳」アプリが開いている状態で、キータッチから「Aキーを押した」という信号を受けると、メモ帳内に「A」という文字が入力されます。

ただキータッチは USB キーボードではなく、「キーボード信号のエミュレーター」です。実際、ボードのハードウェア的なキーボード要素はゼロで、「ある条件を満たした時に『A キーが押された』という信号を発する」ことができる電子ボードです(実際には  Aキーだけでなく、A から H までの8種類の信号を発することができます)。

そして上述の「ある条件を満たした時」の条件というのがキータッチ側に用意された2箇所の端子間が電線で接続された時になります。具体的にはキータッチ側の "A" キー端子と、"EARTH"(アース)端子とが伝導体で繋がった時に「A キーが押された」という信号が発せられます。
howto04


このような特徴を利用することで、キータッチ自体にキーボードは付属していないにも関わらず電気を通すあらゆるものをキーボード代わりにすることができる、という機能を持っていることになります。そして A キーや B キーを押して動かすことができるようなアプリケーションを開発・稼働しておくことで、キータッチに対応して動くアプリケーションとすることができる、というものです:
2019080704



試しに(先日のブログでも紹介した)このアプリをキータッチで使ってみました:
https://github.com/dotnsf/keytouch_sample


キーボードから入力した文字がそのままブラウザ画面に表示される、というシンプルなアプリケーションです:
2019080701


では実際にキータッチと一緒に使ってみます。付属のケーブルで PC にキータッチを接続します:
IMG_8279


この状態で上記のアプリケーションを起動し、ウェブブラウザで開きます:
2019080701


そして EARTH と A にクリップを繋いで、その2つのクリップをくっつけると・・・:
IMG_8280





ちゃんと "A" と表示されました。つまり期待通りに A キーの信号が PC に送られてきたことになります:
2019080702


このキータッチによって、キーボードがなくても(一部の)キーボード処理をエミュレートすることができるようになり、後は特定のキーが押されたイベントをハンドリングして動かすことのできるアプリケーションが用意されていれば、キータッチを使って動かすことができるようになります。叩いて動かすようなゲームであったり、人と人とが握手することでキー信号を送って動かすような体感型アプリケーションを作るなど、いろいろな応用が効きそうなポテンシャルの高いガジェットだと思っています。

僕自身はメーカーズフェアのイベント会場で購入しましたが、公式ページからオンライン購入が可能になっているようです。キータッチ本体のみで 3000 円ケーブル類まで付属したパッケージで 3500 円(それぞれ税別)らしいです。


(一部で?)話題の serveo サービスを使ってみました。

serveo は http://localhost:XXXX で稼働するウェブサービスを https の固定URLで公開するサービスです。加えて無料で、しかも(ssh が導入済みであれば)ツール類のインストールは不要です。なお以下の作業は Windows 10 の WSL(Ubuntu 18.04) 環境を使って行いました。macOS や Linux, Raspberry Pi などを使う場合でも同様のはずです。

どのように使うかを以下で紹介しますが、今回は例としてこのウェブアプリケーションをネット公開してみることにします:
https://github.com/dotnsf/keytouch_sample

2019080702



「キーボードから入力されたキーをそのまま画面に表示する」という Node.js のウェブアプリケーションです。Node.js が導入されていればローカル環境で稼働させることができます。

実際に動かすには上記リポジトリからコード一式を git clone またはダウンロード&展開して、npm install して app.js を実行します(緑字は出力されるメッセージです):
$ git clone https://github.com/dotnsf/keytouch_sample

$ cd keytouch_sample

$ npm install

$ node app
server starting on 6022 ..

実行すると空きポートを見つけてリクエストを待受ける状態になります。上記例では 6022 番ポートで稼働しています。

このアプリケーションを使うには、ウェブブラウザで http://localhost:6022/ へアクセスします(6022 の部分は実際に稼働しているポート番号を指定してください):
2019080701


↑キーボードを適当に叩いて入力すると、叩いたキー文字が画面に表示される、というだけのアプリケーションです(英文字や数字は正しく表示されると思いますが、一部の記号には対応していません)。

では、この localhost で稼働中のアプリケーションを serveo を使って公開してみます。別のターミナルを開いて、以下のコマンドを入力します(6022 の部分は実際に稼働しているポート番号を指定します):
$ ssh -R 80:localhost:6022 serveo.net
Forwarding HTTP traffic from https://ledo.serveo.net
Press g to start a GUI session and ctrl-c to quit.

実はたったこれだけです。上記例では https://ledo.serveo.net にフォワードされる、というメッセージが出力されています。実際にウェブブラウザで(可能であれば別のマシンのウェブブラウザで)指定された URL にアクセスしてみると、実際に稼働していることが確認できます:
2019080703


こんな簡単に、しかも https の固定 URL でウェブサービス公開ができてしまいました。驚き!

ちなみに、このサービス自体は SSH のフォワーディング機能だけで実現しているようで、上記コマンドの "localhost" はローカルホストでなくても構いません。なので(ホスト名が変わることが問題にならなければ)http で動いているサービスを簡単に https 対応させることもできそうです。

その他、コマンドのオプション等は公式ページに詳しく紹介されているので参照ください。いやそれにしても便利なサービスだ。自分で作ったアプリがここまで簡単にウェブ公開できるとは・・


Node.js には npm という便利なパッケージ管理ツールがあります。これはプロジェクト内に package.json というファイルを用意し、その中にプロジェクトで利用したいオープンソースライブラリを記述しておくだけで、後は
$ npm install
と実行するだけでそれらのオープンソースライブラリをまとめてインストールしてくれる、という機能があるのです。しかもその記述されたライブラリだけでなく、それらのライブラリが必要とするライブラリもまとめて調べ、まだインストールされていないものがあればそれだけを(2重にインストールしたりせずに)選別してインストールしてくれる、というものです。要するに深く考えずに npm install すれば、そのプロジェクトの実行に必要なライブラリがまとめてインストールすることができるようになります。

ただ実行環境を揃えるだけならこのように簡単なのですが、どのようなライブラリがインストールされることになり、そしてそれぞれのライブラリはどのような種類のオープンソースライセンスのもとで配布されているのか、を改めて調べようとするとちと面倒なことになります。まず上述のように導入されるライブラリは package.json に記述されたものだけではなく、それらが必要とするライブラリや、更にそれらが必要とするライブラリ・・・と、再帰的に含まれるので、小さなプロジェクトでも実際に調べる対象となるライブラリの数は膨大になってしまいます。試しに先程ウェブフレームワークとして有名な express(v4.17.1) だけを指定して npm install してみたところ、express 自身も含めて 49 個ものライブラリがインストールされました:
2019080401


なので express だけを使うプロジェクトであっても、利用するオープンソースライブラリのライセンスを調べるには、これら 49 個のライブラリそれぞれのライセンスを調べる必要がある、ということになります。

これはさすがに面倒・・・ということで、まとめて調べるツールを作ってみました:
https://github.com/dotnsf/licenses

2019080402


このツールはローカルファイルシステム内のプロジェクトフォルダ(ディレクトリ)を指定して、そのプロジェクトの中で使われるオープンソースライブラリを調べて一覧表示します。ウェブの UI をもたせることも考えたのですが、ローカルファイルシステムを指定するということは対象プロジェクトのソースコード一式をローカルシステム内に(ダウンロードなり git clone なりで)取得しているということになるので、GUI がなくても使える人が大半だろう、、、と思って付けませんでした。GUI でパイチャートとか付けたい人は改造しちゃってください。なおこのツール自体は MIT ライセンスです。

利用するにはまず上記プロジェクトをダウンロードか git clone します。実質的に licences.js だけを使います。そしてこのファイルの3行目あたりにある target_folder 変数の値を調査対象とするプロジェクトのフォルダとなるよう書き換えてください(例: "../myproject" など)。

そして Node.js で実行します:
$ node licenses

成功すると target_folder で指定したフォルダ内の node_modules/ サブフォルダの中を調べ、更に導入済みライブラリのサブフォルダを調べて各ライブラリ毎に配布ライセンスを推測します。そして全てのライブラリを調べ終わったら、結果を一覧表示します(下は例、赤字はコメント):
$ node licenses
target_folder = '../myproject'  対象フォルダ名
MIT: 73.52% MITライセンスが73.52%
[ 'accepts',  MIT ライセンスと推測されたライブラリ一覧
  'abbrev',
  'append-field',
     :
]
ISC: 21.32% ISCライセンスが21.32%
[ 'are-we-there-yet', ISCライセンスと推測されたライブラリ一覧
  'chownr',
  'console-control-strings',
    :
]
Apache: 4.41% Apacheライセンスが4.41%
[ 'detect-libc', Apacheライセンスと推測されたライブラリ一覧
  'ejs',
  'cfenv',
    :
]
BSD: 0.73% BSDライセンスが0.73%
[ 'esprima' ] BSDライセンスと推測されたライブラリ一覧

これでいちいちフォルダ毎に調べなくても依存ライブラリのライセンスがわかります。たぶん。



このページのトップヘ