Yahoo! Japanの日替わりでクーポンや電子マネーが当たる「Yahoo!ズバとく」のコンテンツの一つにスロットくじがありますが、ほかのくじとは違い、これだけはYahooのスマホアプリからしか抽選できないようになっています。

ただ、スマホアプリの抽選サイトは、アプリに組み込まれているウェブブラウザから呼び出されているだけなので、アプリからのアクセスと見せかけることで、パソコンのブラウザでもくじを引くことができます。

パソコンのブラウザ(ここではMicrosoft Edgeを用いてますが、Google Chromeでも手順は同じです)でYahoo!ズバとくのサイトを開いたら、キーボードの「F12」キーを押すなどして、開発者ツールを起動します。ウィンドウが表示されたら、左上にあるパソコンのアイコンをクリックしてモバイルサイトモードに切り替えます。
モバイルサイトモードではウェブページの上部にデバイスの情報が表示されているので、デバイス一覧の一番下にある「編集」ボタンをクリック。
エミュレート済みデバイスの項目が表示されたら、「カスタムデバイスの追加」ボタンを押し、「ユーザーエージェント文字列」に以下のテキストを入力します。
Mozilla/5.0 (Linux; Android 9; SH-01K Build/S2170; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 YJApp-ANDROID jp.co.yahoo.android.yjtop/3.69.1
追加が完了すれば、先のデバイス一覧よりこれを選択すると、ブラウザでもくじが引けるようになります。
 | 2020年7月11日

WindowsデスクトップでIMEの状態をアイコンとして任意の位置に表示するユーティリティーソフト「IMEステータス」の最新版となるVer 3.7をマイクロソフトストアで公開しました。最新版では、メニューでアイコンフォルダーを開いたときにユーザーローカルフォルダーを参照するようになりました。これにより、オリジナルアイコンを保存するときにアクセスが拒まれるトラブルを招く可能性が低くなっています。
 | 2020年7月10日

対象のウェブページを1つのHTMLファイルとして保存するGoogle Chorme拡張「シングルHTMLダウンローダー」の最新版・Ver 2.2を公開いたしました。従来のバージョンではセキュリティー上の理由によりChrome 85以降では動作しないため、大幅な修正を行いました。また、ウェブページファイルの作成進行状況の表示や、ダウンロードファイルサイズ制限の簡略化、「名前をつけて保存」オプションの追加、httpプロトコル以外ではアイコンやメニューを使用不可にするなどの新しい機能も追加されています。

 | 2020年6月19日

前回で作成した、機械学習による3次元関節データを3DCGソフト「Blender」で取り込んでみましょう。

まずはBlenderをWindowsにインストールします。ここでは2.8 LTSを使用しています。

人体モデルの作成にはオープンソースプロジェクト「Makehuman」を使用します。インストールしたMakehumanを起動したら、あなた好みの体型を作ります。
関節データがないとBVHデータが反映されないので、「Pose/Animate→Skeleton」で「Game Engine」のRigを選択しておきます。
このモデルを「mhx2」形式でエクスポートします。なお、「Scale Units」を「meter」以外にすると、Blenderで巨大な人形が配置されてしまいます。
それでは先ほど作ったcsvファイルをBlenderで読み込める形式に変換します。Windowsのコマンドプロンプトを開いたら、以下のコマンドを実行して、Blenderに内蔵されているスクリプトツールで変換します。変換が完了すると、フォルダー内に「result.bvh」が生成されます。

独自のcsv_to_bvhは私のGithubプロジェクトページからダウンロードできます。
cd "C:\(csv_to_bvh.pyのあるフォルダ)" "C:\(blender.exeへのファイルパス)" --background csv_to_bvh.blend -noaudio -P csv_to_bvh.py
変換が完了すると、「result.bvh」が出力されるので、これをBlenderに取り込みましょう。

Makehumanのプラグインリストより「MHX2 (blender side)」をダウンロードします。Blenderを起動したら、メニューの「編集→プリファレンス→アドオン」を選び、「インポート」ボタンより、ダウンロードしたzipファイルをそのまま選択します。するとリストに「Makehuman:Import」が追加されるので、チェックを入れてプラグインを有効化します。
MakewalkというアーマチュアにBVHデータを適用させるプラグインを同じ要領でBlenderに導入します。

ファイルのインポートから「Makehuman(.mhx2)」を選び、保存したモデルを読み込みます。
インポートしたモデルがのっぺりしていて不気味なようなら、シェーディングを有効にしましょう。
あとはサイドメニュー(キーボードの[N]で表示)より「Makewalk→Load And Retarget」より、変換したBVHファイルを読み込み、アニメーションフレームを2以上の値にすると、ポーズが適用されているのが確認できます。
体の内側など、見えていない部分は所詮推定なので、微調整してよりきれいに整えましょう。
 | 2020年6月11日

セルシスのデジタルペイントツール「Clip Studio Paint」ではテスト版機能(2020年6月時点)として、写真から3Dモデル人形を生成するツールが含まれています。
とはいうものの、画像は専用のサーバーに送信しないとならず、オフラインでは使えません。下半身の認識もまだ甘く、立ち回りのポーズしかうまく認識してくれないようです。

今回は公開されている既存の機械学習ツールや3DCGソフトを使って、このモデル人形ツールを再現できないかを試してみました。また、ハードウェアとOS以外の費用はかかりません。

Githubで公開されている「hmr」は機械学習ツールのTenserflowを使って、一枚の画像から3Dポーズを推定します。これをBlenderに取り込めるよう拡張されたプロジェクト「video_to_bvh」を改良し、オフラインのパソコンで動くように調整しました。

hmrに関わらず、機械学習のプログラムは得てしてLinuxで動かすことを前提に開発されているため、Linuxを動かす環境が不可欠です。ここではWindows上でLinuxを動作させる「Windows Subsystem for Linux」を使っています。

Windows Homeユーザーは、最新のWindows 10にアップグレードして「WSL2」を導入するか、VMWare Playerなどの仮想マシンを用意しましょう。

WSL(ここではUbuntu 18.04 LTS)を起動したら、以下のコマンドを記入して、基本的なツールを導入します。PythonやTensorflowのバージョンが古いですが、新しいバージョンだとAPIの互換性がなく、かなりのコード修正が必要となります。
sudo apt update sudo apt upgrade sudo apt install python2.7 sudo apt install python-pip pip install scikit-image pip install tensorflow==1.3.0 pip install opencv-python pip install opendr pip install pandas
プロジェクトファイル一式と学習モデルをダウンロードします。学習モデルは400MBくらいあるので、ディスク容量には余裕を持たせておきましょう。
git clone https://github.com/Dene33/hmr.git wget https://people.eecs.berkeley.edu/~kanazawa/cachedir/hmr/models.tar.gz && tar -xf models.tar.gz mv models hmr/ rm models.tar.gz
私のGithubプロジェクトサイトから、独自のスクリプトファイルをダウンロードします。このなかから「pct_to_csv.py」をWSLの「hmr」ディレクトリにコピーしてください。

「cd hmr」で現在のディレクトリーを変更したら、以下のようにスクリプトを実行して、「img_path」で指定した画像ファイルを解析します。
python2 -m pct_to_csv --img_path data/im1963.jpg
滞りなく完了すると、ディレクトリ内に人体の関節座標が格納された「hmr.csv」ファイルが作成されます。これを「explorer.exe .」などのコマンドを使って、Windowsディスクにコピーします。

次回はMakehumanで作成した人体モデルにこのデータを適用させる手法をご紹介します。
 | 2020年6月11日

基本的に電源が入っている間は常にCPUクロックが稼働するArduinoですが、リモコンスケッチのように、外部からシリアル信号を受け取ったときだけ稼働させたいのであれば、待機時はそれなりの無駄が生じます。

と、いうことで、シリアル信号を受け取ったとき以外は常にスリープ状態にするプログラム例をご紹介。
#include <avr/sleep.h>
#include <avr/power.h>

void sleep()
{
    set_sleep_mode(SLEEP_MODE_IDLE);
    power_all_disable();
    power_usart0_enable();
    sleep_mode();
    power_all_enable();
}

void loop()
{
    Serial.write("ready\n");
    Serial.flush();

    sleep();

    String cmd = Serial.readStringUntil('\n');
    int c = cmd.charAt(0);
   
    if(c == 'i'){
        transferInfrared();
    }else if(c == 'r'){
        receiveInfrared();
    }

    Serial.flush();
}
sleep()を呼び出すと、シリアル通信以外のモジュールをすべて切った後にマイコンはアイドルモードに移行します。アイドル時に受信バッファに何かしらのデータが記録されると復帰し、すべてのモジュールが再び使用できるようになります。あとは記録されたシリアルデータを分析して、適切な処理を実行させます。

これらはAVRマイコンの命令を直に呼び出しているため、ATmegaチップを使っていない互換マイコンでは基本的に動作しません。
 | 2020年6月6日

XP-Penが手がけているパソコン用ペンタブレットは、高い品質ながらもワコムの同スペックモデルよりも半額未満というリーズナブルな価格で手に入ることより、人気のブランドです。管理人もArtist 15.6を持っていますが、Wacom Oneを上回る大画面は、お絵かきだけでなく、ゲームや映画のながら見をするのにもうってつけです。
XP-Penの高機能モデルには、タブレットに左側にホイールやボタンが備え付けられており、キーボードのキーを割り当てることもできます。通常では、物理キーボードから入力できるキーしか割り当てられませんが、以下の手順を踏むことで、音量やメディア再生などの特殊なキーも割り当てることができます。

まずは、ペンタブレットのユーティリティーツールを起動して、「エクスプレスキー設定」を選択します。
エクスプレスキーのボタン割り当て画面より、割り当てたいボタンより「ファンクションキー」を選び、入力画面を表示させます。ここでわざといろいろなキーを押していきます。これは、後でこの設定を見つけやすくするためです。
割り当てが終わったら、トップ画面に戻り「適用」ボタンを押して、一度設定を反映させます。続いてもう一度ツール画面を起動したら、「設定をエクスポートする」をクリックして、pcfgファイルとして編集内容を保存します。

このファイルをテキストエディタで開きます。エディタの検索機能などで、先の入力画面で表示されていたキー文字列を探し出します。
タグで囲まれたテキストを書き換えます。
画像の場合、音量を上げるボタンになります。以下はテキストの置き換え例です。

キーの役割置き換えるテキスト
音量を上げる1|VolumeUp|175|30|0
音量を下げる1|VolumeDown|174|30|0
音量のミュート1|VolumeMute|173|30|0
再生・一時停止1|MediaPlayPause|179|30|0
前のトラック1|MediaPreviousTrack|177|30|0
次のトラック1|MediaNextTrack|176|30|0

Windowsパソコンであれば、これらの数字はWindows APIのキー番号と一致します。すべての番号はマイクロソフトのドキュメントで確認できます。

書き換えたデータを保存したら、これをタブレットツールの「設定をインポートする」から、そのファイルを読み込めば完了です。
「私の持っているタブレットにはボタンがついていない!」という方は、拙作の「The Navigation Bar」をお試しください。


ちなみに、XP-Penを「中華ペンタブ」と言う人がいますが、これは間違い。2019年にHanvon&UGEE技術有限会社と合併したものの、れっきとした日本発の企業です。
 | 2020年5月18日

TBSの人気テレビ番組「水曜日のダウンタウン」では仮説の提唱とその結果を独特のパネルで表示しています。ネットでは「水ダウジェネレーター」などの名称で、そのパネルを生成するツールがありますが、偽物感は拭いきれません。その最たる理由が「文字に違和感がある」。大正時代を彷彿とさせるあのフォントでなければ画竜点睛を欠くというものです。

水曜日のダウンタウンで用いられているフォントは「DFロマン雪」というもので、ダイナフォント社が制作したフォントなのですが、このフォントのライセンス使用料は2万円。ツイッターのネタ画像の素材として使うにはいささか高価です。

そこで、個人使用の範囲としておすすめするのが、年賀状ソフトの「筆まめ」。このソフトウェアにはイラストをはじめとした素材が多数含まれているのですが、Ver.27以前の古いバージョンでは、このロマン雪が含まれています。フリマサイトなどから手に入れた筆まめをパソコンにインストールして、適当なグラフィックソフトで同時にインストールされたこのフォントを選択すれば、それっぽい画像をすぐに作成できます。

おまけ:検証結果の背景画像
 | 2020年5月16日

一昔前にXbox360コントローラーをパソコンで使えるようにする互換機について書いたのですが、最近のこもり需要からか、情報を求めて訪れている方が多くなってきたので、更新版を投稿することにしました。

簡潔に述べると、Windows10ではXbox 360コントローラーは標準のドライバーとして収録されているので、デバイスマネージャーから直接導入することができます。

レシーバーをつないだところ、デバイスマネージャーで「不明なデバイス」と表示されるようなら、そこより「デバイスの更新」を選択。
「コンピューターを参照してドライバーソフトウェアを検索」をクリック。
「ドライバーの一覧から選択」をクリック。
「すべてのドライバーを表示」を選択して次に。
一覧より「Microsoft → Xbox 360 Wireless Receiver for Windows」を探して、これをインストールすれば完了です。
 | 2020年4月25日

前回ではWiiリモコンのペアリング方法を採り上げました。今回はゲームパッドコンバーターで各種お絵かきアプリにカスタマイズしてみます。

FreePIEのプロジェクトサイトよりMSIインストーラーをダウンロードして、パソコンに導入します。
これがFreePIEの基本画面です。Fileよりスクリプトファイルを読み込み「Script->Run Script」でスクリプトを実行するのが基本的な流れです。スクリプトで用いられる言語はPython(Python 2)ですが、通常のPythonスクリプトとは若干挙動が異っています。

mathをはじめとする標準ライブラリーはあらかじめ組み込まれているため、import宣言しなくてもこれらを利用できます。

FreePIEでは、スクリプトが最終行まで実行されると、再び先頭行からスクリプトを繰り返し実行します。「starting」というグローバル変数があらかじめ定義されており、初回のループではこの値がTrueになっています。つまり、デバイスの検索や変数の初期化はこの値で判断することになります。
if starting:
    klist = [None] * 32
    initKeys(klist)
    
    diagnostics.debug("Hello!")
ゲームコントローラーの入力値を取得するタイミングは機器によって異なります。通常はループ内で都度値を取得しますが、Wiiリモコンではupdateイベントによるコールバック関数から値を取得します。デバイスは配列として格納されているため、複数のゲームコントローラーを接続しているとインデックスがずれることもあるでしょう。

専用のデバッグ命令を使えば値を目視できます。「diagnostics.debug()」でアプリのコンソールにメッセージを表示し、「diagnostics.watch()」では、指定した値をリアルタイムに監視することができます。
def update():
    # ヌンチャクスティックの位置を取得
    global n
    sx = n.stick.x
    sy = n.stick.y

if starting:
    n = wiimote[0].nunchuck
    n.update += update
ボタンが押されているかどうかを知るにはWiiリモコンなら「n.buttons.button_down(NunchuckButtons.C)」、ゲームパッドなら「joystick[0].getDown()」のように用います。ボタンの番号は0から始まるので、ゲームパッドに「5」と刻印されたボタンを調べるなら「stick.getDown(4)」を実行します。

キーボードの入力を実行するには「keyboardクラス」を使います。「keyboard.setKey(Keys.A, True)」と「keyboard.setKeyDown(Keys.A)」は同じです。「keyboard.setPressed()」では、押して放すを一度に行います。なお、Keys列挙子の値はC#(.NET Core)における値を参考にしたとのことです。

キーストロークの連続入力についてですが、FreePIEではオブジェクトを共有しているためか、スクリプトを止めてもサブスレッドが機能し続けるなどの問題があるため、thread.Timerはあまり活用できません。そのため、ループごとに逐一タイムカウントを調べることで対処しました。

以上を踏まえた、Wiiリモコンをキーボード入力に変換するスクリプトをGitHubにて公開しています。ファイル一覧より「wiimote.py」のテキストをFreePIEで開いて実行すると、スティックを押した方向と押したボタンの組み合わせによって、異なるキーをパソコンに送信できるようになります。


スクリプトを修正すれば、好みのショートカットを簡単に構成できます。なお、Dualshock4やVRリモコンなどの汎用ゲームパッドに対応したバージョンはPixiv Fanboxでダウンロードできます。
 | 2020年4月9日