‘プログラミング’のエントリ

Analog Book ReaderのUWP移行がひとまず完成。GW中にテストをしてアップロードできるかな。

前回の宿題としては,GridViewの選択についてはとりあえず右クリックで行うことにした。バージョン情報ダイアログはUWP sampleのUI Basic SampleにあるようにPopupで対応した。

UWP対応だけでは寂しいので,ずっと直したかった画像のぼやけを修正。今のバージョンでは,画像をCanvasの機能で拡大縮小しているため,拡大縮小の精度が悪い。キャンバス自体を拡大率に合わせて大きくしたり小さくしたりすれば画質が高くなるのだが,WinrtではLayoutTransformが使えないため,難しかった。そこはUWPでも同じなのだが,Silverlight toolkitのLayoutTransformerクラスをUWP化して使っている例があり,同じように対応した。だいぶ画質が上がるはず。

Weather Typing 3の作業が一段落なので,以前からやりたかったAnalog Book ReaderのUniversal Windows Platform対応を検討。UWPプロジェクトを作って既存のソースコードを追加,ビルドし直すところまではサクサクできたが,動かしてみるといろいろおかしなところがある。

  • 戻るボタンが動かない
  • ダイアログのレイアウトが崩れる
  • Semantic zoomがマウスでできない
  • ScrollViewerのズームがマウスでできない
  • GridViewで右クリック選択できない
  • ドラッグアンドドロップができない
  • チャームがない

戻るボタンについては自分でボタンを付けるのではなくタイトルバーに付けられるようになっていた。確かにWindows 10のアプリはそうなっているのでそれでOK。

var view = SystemNavigationManager.GetForCurrentView();
view.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
view.BackRequested += OnBackRequested;

レイアウトはまあ仕方ないので地道に直そう。


Semantic zoomに関してはMSのサンプルでもできないし,標準の時計アプリもズームできなくなっている。MSとしてはなかったことにしようとしてるのかなあ。

追記。と思ってもう少し調べたら以下のコードでできた。下のScrollViewerと同じで,ZoomModeを設定しないとホイールズームが使えない。



ScrollViewerのズームはScrollViewer.ZoomModeを設定することでできるようになった。Windows 8でもあったようだけど,デフォルト値が違うのかな。


GridViewで右クリック選択できないのは一番困るのだが,Windows 8.1では,右クリックで選択,左クリックで開くという動作ができたけど,Windows 10ではどちらかの動作しかできない。

ホント? と思ってWindows 10のスタートメニューを試したら確かに選択ができなくなっている。複数のタイルを移動したくなっても1つずつドラッグしないといけないのか。ずっとこの仕様でいくのかな。タブレットでもSwipe選択がなくなっているような・・・。


ドラッグアンドドロップができないのはWindows 10で増えたプロパティDragEventArgs.AcceptedOperation にDragOverから設定してやればOK。ついでに

if (e.DataView.Contains(StandardDataFormats.StorageItems))
{
    var storage = await e.DataView.GetStorageItemsAsync();
}

でファイルのドラッグアンドドロップができるようになる。まさにこれがやりたくてUWPに移行しているのでうまくいってよかった。


チャームは,どうやるのが正しいのだろう。バージョン情報をどこで出すのか? ということだけど,メニューからやるのかな。未調査。

Weather Typing 3.1を公開。ここまででWT2をベースにした作り直しは完了。UIがまだ分かりにくいところがあるのとさすがにマニュアルを作らないといけないけど。

バージョンアップのポイントは,去年のタイピングサミットでの要望の反映とバグ修正。特にロビー機能が使いづらかったのとリプレイがかなりバグっていたのを修正した。

この先は,ずっとやりたかった新たな機能の追加,なんだけど,いろいろ作りたいものがたまってきているので少し先かも。

それにしても,デスクトップアプリはダウンロード実行するハードルが高い。ブラウザで警告が出てOSで警告が出てウイルス対策で警告が出て,全て無視しないと実行できないとは。

Windows Storeレビュー削除について一応MSに問い合わせてみた。結果,荒らしか何らかの理由でアカウントが停止されたんだろう,という回答だった。レビュー内容はちゃんとした内容だったので違うと思うけど,まあいいや。日記ネタが増えたし。

最近,Windows Storeにレビューをもらっても1日で消されてしまう現象が発生している。開発者やユーザからはそもそも消す機能がないわけで,MSフォーラムで調べてみると「Reviews/ratings disappearing」というスレッドで困っている人が何人もいるようだ。Insider Preview版だと消されるという推測も挙がっているが,手元に保存しておいたログを見るとそうとも言えないような。半年経っても無回答というのがWindows Storeの過疎感を感じる。

Analog Book Readerのダウンロードが2万を超えた。ダウンロードグラフを見ると分かるが,ここ最近はほとんど海外からのダウンロード。特にUSからはステキなコメントをたくさんもらっている。Windows 10からのダウンロードが9割を超えているので,そろそろWindows 10 専用にUWP化するのもありかな。自分でも使っているけどドラッグアンドドロップ機能が欲しい。

2016031101

いつの間にか2月が終わる。謎のウイルスに冒された後アメリカに行ってしまったので何もできなかった。

WT3の進捗。ロビーというか対戦の仕方を改善しないといけないのでしばらく修正していたのだが,まずはチャットと対戦ウィンドウの分離,その他ロビーで表示するレベルの選択,状態表示,音再生などWT2が持っていた機能はひととおりできた。

2016013001

で公開しようと思ってロビーにつないでみたのだが,現バージョンも含めて問題点がたくさん。やっぱり実際に試してみないと出てこないバグがあるわけで,公開まではもう少し時間かかりそう。必要なのは分かっていてなかなかできなかったんだけど,WT1の開発の頃のようにできるだけロビー常駐するようにしてみます。

アキバで買ってきた測距モジュール「GP2Y0A21YK」とサーボ「SG92R」とユニバーサルアームを使ってラジコンをバージョンアップ。サーボに測距モジュールを付けて回せるようにした。ついでに今後のためにiPodを設置する場所を用意。測距モジュールから測定した左右の障害物情報をBluetoothで,iPodから取得した画像をWi-FiでPCに送りつけて,PC側で前後左右に車を自律制御するというのが目標。途中からArduinoでロボット工作をたのしもうを参考にやっているが,だいたいPart1+αができた。

はっぱさんとアキバでArduinoワークショップ。前回までのワークショップで,電子工作が本格的になってきたため作業スペースを確保しないと進められないという課題がでていた。その後,ベーマガイベントはんだづけカフェというのを知り,今度行ってみようという話になっていた。ここは無料の電子工作スペースで,はんだづけを中心とした電子工作ができる。というところでとりあえず行ってみたのだが,さすがに無料だけあってスペースが確保できず。

まあその辺りは予想していたので,もう一箇所調べておいたAssemblageに行ってみた。こちらは有料だからか閉店間近だからかゆったり工作できた。

とりあえずはっぱさんにラジコンを見てもらい,はっぱさんのArduinoシールド作りを見学。せっかくだから私も秋月電子で購入した測距モジュールのピンソケットはんだづけをしてみる。さすがにはんだ環境は快適。次の目標はこれを使って障害物を検知するところかな。

いつも年末にやっているソフトウェアのアップデート。MSDNは,去年PremiumからEnterpriseに強制アップグレードされたのだが,Premiumと同様2年で30万円のままらしいので更新。あとはOffice 2016。ついでに今まで使っていたWindows Live Mailも更新されなくなってしまったので,Outlook 2016に更新してみた。以前乗り換えようとしたときは重すぎて諦めたけど今のPCスペックなら問題なさそう。

といったところで終了だったんだけど,なんか突発的にお金が増えたのでAdobe CC Completeを衝動契約してみた。一週間で7年分も利益が出るとは。PhotoShopとIllustratorしか使わないけど。

WT3は・・・ずっとロビーのUIを考えてるんだけどいい案がなくて進まない。これ以上考えても仕方ないので,とりあえずチャット画面を別ウィンドウで開くようにしようかな。

タイピングサミット以来,忙しいのと英語数学の勉強をしていたせいでプログラムしてなかったのだが,そろそろ落ち着いた。とりあえずリハビリとして,しばらくほっておいたAnalog Book Readerのバージョンアップ。1ページ表示できるようにして欲しいという要望を何人かからもらっていたので実装してみた。他にも自分が普段使っていて欲しい機能をいくつかサポートしてみた。

Analog Book Readerは普段使っているので次はこれをやろうというのが自然に出てくるのだが,ウェザタイは普段自分が使ってないのでなかなか手が出せなかったりする。まずはタイピングの練習を復活させるところからやるというのが遠回りに見えて確実なのかも知れない。

以前申し込んだベーマガイベント「ALL ABOUT マイコン BASIC Magazine」に参加してきた。期待していた以上の盛り上がりと内容で満足。たくさん面白い話を聞けたのだが,ネタバレは避けてね,という話だったので必要なところだけ抜き出して感想を書いてみる。

マイコンBasic Magazineは1982~2003まで刊行していた雑誌。私は家にたまたま創刊2号からバックナンバーがあって読んでいたが,リアルタイムには85年~90年くらいにPC6001,ぴゅー太,ファミリーベーシックでプログラムを打ち込んでいた。その後は94年くらいにまた読み始めてPC-9821で4回プログラムを投稿して2回載せてもらった。その後2000年くらいからC Magazineに浮気していたら休刊に。今回のイベントは内容的にも80年代に読んでいた人がメインターゲットで,年齢層は高め。今でも現役で趣味プログラムしている方ってどのくらいいるのかな。

会場はアキバの元中学校を利用したイベントスペース。チケット3000円で470人,その後の売り上げに貢献するわけでもない,という出版社的にはどう考えても赤字だろうというイベントで,この辺を安く抑えつつベーマガらしい手作り感を出すという高度な戦略が見て取れた。機材の不調もどこまでが演出でどこまでが本当なのかよく分からなかった。

トークイベントで一番印象に残ったのは,編集部の皆さんもライターの皆さんも,好き勝手やっていたこと。他の雑誌がやっているからこういう記事が必要,ではなく書きたいものしか書くなという編集長の方針がすごくよかった。趣味のプログラムと仕事のプログラムの両方をやっているけど,やりたいことじゃないといいものはできないというのはよく感じるところ。

トークの中でも,結構今だったら,というか当時でも他の出版社だったらダメなのかも知れないけど,危険な話もちらほら。でもそのくらい自由な雰囲気でないとクリエーターなんて育たないよね,と思ってみたり。

一つ気になったのは,未来のことがあまり語られなかったところ。編集長は電子工作マガジンの企画で自作してたドローンを持ってきていて,さすがやる気満々だったけど,それ以外では昔を懐かしんで終わりという雰囲気が。今も現役という人は少ないかも知れないけど,子供の世代にベーマガみたいな環境を作れるといいんだけど。

最後にベーマガイベントはまだ終わりません,で画面が暗くなったときはベーマガDVD発表か? って期待したけど,普通にエンディングだった。See You Next Eventで終わったけど,DVDで資金を作るという流れに,ならないかな。

ともあれ,長年自分の中ではキャラクターとしてしか存在しなかった編集部の人を見られたり,バトル・オブ・ぷよぷよの中の人が見られたり,P6音声合成の注意事項朗読で笑わせてもらったり,素晴らしいイベント,ありがとうございました。

第2回の感想→現役プログラマとして参加するベーマガイベントII

前回のあらすじ

昨年,タイピングサミットに初参加してWeather Typingへの要望をたくさんもらい,来年は新バージョンを持ってくることを約束するのだった。

準備

てことで,WT3をなんとか対戦ができるところまで完成させたので,大会で使ってもらえるか売り込んでみた。予想通りWindows XPがネックにはなるものの,今年はWindows 7を数台用意する予定とのことで,了承してもらえた。自分も大会のトラブルシュートを兼ねて2日目に参加することに。タイピング自体は前日に一夜漬けをしたが,シングルプレイでギリギリレベル5がやっと。団体戦は去年1ワードしかとれなかったので今年は2ワード取得を目標にしよう。

当日

第7回タイピングサミットの2日目。ほぼ全員が月姫打online(TOL)をやっていたので少し教えてもらったり。去年プレイ動画を見たが,タイピングで戦略性を極めるとこういう感じになるんだろう。相手フィールドを見ながらどれだけのワードを溜めるかとか,キャラクターごとの特殊能力を使って逆転するとか,ぷよぷよ~んを連想するが,実力差があるプレイヤー同士でも勝負になりそうなのはよさそう。だが,やっぱりウェザタイはタイピング要素だけの方向性でいきたいのでこういった戦略性をタイピングだけで表現するのが次の課題。

WT3団体戦

午後の団体戦。WT3をこういった大会で使うのは多分初めてなので,途中で動かなくなったりしたら怖いなあ,という他の参加者とは違う緊張感を持ちながらの参加。間近で見たことでいろいろな要改善点が判明。特にウィンドウが小さいと4人目のプレイヤーの得点が隠れてしまうのは計算外だった。ニコ生配信もしていたので,問題文を大きくすると得点が見えず,得点を見えるようにすると問題文が見えなくなるという。団体戦の結果は他の方のレポートを見てもらうとして,自分はCチームの1人目で参加,5ワード取得。数字,英語,よく分からない言語などが混在したワードで,得意なワードなら取れるという斬新設計。でも得意なワードで戦うというのは新コンセプトでも考えているところで,大きなヒントになりそう。

そういえばワードがXMLになっていて,今回のワードを準備するのに苦労したとというのを聞いて,実は今まで通りテキスト形式のワードも使えるよ,という話をしたらショックを受けていた。マニュアルも用意できなかったので分からないですよね。すみません。スコアとかワードとか,互換性がとれるところはできるだけ互換性をとっています。

囲まれる会

団体戦の後,去年に続けて作者が囲まれる会を開催して頂く。団体戦で気付いたことも含めて改善点を列挙。言いたかったことと違う,言い足りないこと等あれば随時Twitter等で受け付けます。

  • Result画面を表示するのに一瞬固まる
  • カナ入力で「か」「ひ」などをShiftを押しながら打てない
  • 自分がワードを取ったときと相手がワードを取ったときで音を変えられないか
  • ウィンドウを小さくしたときに,4人目のプレイヤー情報を表示できない
  • Ctrl+何かのショートカットで画面が切り替わった後,ハイフン(のばし記号)が拡大縮小になってしまい打てなくなる
  • ネット対戦でホストができるかどうかが分かるようにしてほしい
  • 全体的に動作が重い
  • インターネット上に置いてあるワードを気軽に使えるようにしたい
  • レベルを日本語ワードと英語ワードで分けたい
  • XPで動かしたい
  • 記録をCSV等にExportしたい
  • 結果画面で,グラフ中のワードとスピードの両方を確認したい
  • ロビーでチャットをしながらシングルプレイがしたい
  • ロビー対戦以外で,対戦中に色を変えられない
  • ロビーに入るのにユーザ登録がいるのが入りづらくなっている
  • 対戦相手を締め切るボタンでしめきるといきなりゲームが始まる
  • 観戦モードのような,チャットが盛り上がる要素が欲しい
  • シングルプレイでもワードを混ぜられるといい
  • 入力方式のカスタマイズ
  • 英語以外の言語対応
  • 団体戦モード

なお,団体戦エキシビジョンでたにごんさんがリタイヤしたのは途中でハイフンが打てなくなったのが原因です。

次バージョン

今回,なんとかサミットに合わせてWT3を公開でき,大会で使ってもらった。ただ来年以降も使ってもらうには改善もいろいろある。それとは別に,本来WT3でやりたかったこともたくさんあるので,今回もらった要望なども合わせて作り込んでいく予定。

・・・でもラジコン作りとかもあるので作るのは遅いかも。

Weather Typing 3をリリース。WT2をベースに今の技術で作り直したバージョンなのでできることはあまり変わらないのだが,いろいろ改善はできた。何を改善したかは要望集を参照。主に去年のタイピングサミットでもらった要望を中心に,WT2の作りでは実現しづらかったものを修正した。

で,本当にやりたいのはここからで,以前の日記に書いた新コンセプトを作っていく。新コンセプトを意識して作ってきたのでいくつかのアイデアはすぐに実現できるかな。

最近Analog Book Readerのダウンロード数が増えている。詳細を見るとUSを中心にWindows 10からのダウンロードが増えているよう。ただ、Windows 10で動かすとFlyout(ポップアップ)を表示するとボタンなどの色が変になるのが分かっていた。そこで、一日ウェザタイを止めて最近Analog Book ReaderのWindows 10対応をすることに。ストアにはもう申請したので少ししたらアップロードされるはず。

2015082301

詳細。どうもWindows 10でFlyoutを出すとテーマ色が変になってしまうみたいで、Windows 10のバグのような気がする。そのうち直るかも知れないけど見にくすぎるので、とりあえずテーマに関係なく色を固定してしまった。ハイコントラストとかにすると見づらいのかもしれないのでWindows 10が直してきたら元に戻そう。

あとWindows 10ではウィンドウモードで動くようになったのでドラッグアンドドロップとかサポートしたいけど、Universal Windows Appにしないとダメっぽい。ウェザタイ後にやるか。

ベーマガイベント、会場の席数100くらいっぽいから争奪戦かな、と思って当日待機して12時丁度に予約。途中アンケートが出てきたけど、予約完了前だったのでほぼスルーで予約完了。アンケートは内容ほとんど見てないけど、質問したいことを書く欄があったような。事前に教えてもらえるか予約完了後にしてくれればじっくり考えたんだけどなぁ。これはチケット販売システムの仕様らしいので、トラフィックを分散させるとか何か理由があるんでしょう。

お土産付きのVIP席と普通席があったんだけど、VIP席は普通席予約完了したらもう売り切れていた。普通席は30分後に売り切れ。意外と売り切れまで時間かかったなあと思ったけど、その後Facebook情報で会場が400~500人規模だったことが明らかに。どうりで余裕があったはずだ。

てことで、予習?復習?をしに国会図書館へ行ってベーマガを注文。自分が一番読んでいた1986年あたりを見てきたけど、CheckerFlag(投稿プログラムへの講評)が記憶以上に毒舌だった。当時の記憶も思い出してきたけど、前回のテクニック、結構違っているところがあった。

  • 掲載基準:アイデア+テクニック。アイデアが最優先
  • 短くする:論理の塊でマルチステートメントを使う。同じ事は書かずDATAを使う。
  • 見やすくする:サブルーチンコメントを工夫
  • 早くする:論理式(true:-1,false:0)を使う。変数名は短くする。よく使うサブルーチンは前に。
  • マシン語:スクロール、キャラクターなど効果が大きいところはマシン語も可。
  • 入力しやすくする:DATAは16進圧縮する。チェックサムを付ける。

こういうのを特集だったりCheckerFlagで毎月少しづつ覚えていくのはいい経験になっているはず。今の時代こういうゆっくり地力を付けるやり方はできないし。

ウェザタイのインストーラを作ってみた。公開は一通り全部の環境で試した後を予定。

.NET FrameworkとかVCランタイムとか必要なものが増えたり、ファイアウォールの設定を元に戻したりを考えるとインストーラがあった方が便利ってことで。慣れている人向けに今まで通りzipも公開する予定。

インストーラというとやっぱりInstall Shieldかな、使い慣れてるし、ってことでVisual StudioについてくるInstall Shield Limited Editionを調べたんだけど、ライセンスとか制限で悩むのが面倒なのでWiXを使ってみた。WiXはインストーラをXMLで作れるもので、Windows Installerを理解していれば割とサクサク作れる。

2015081301

Weather Typingのインストーラ自体はファイルを指定するだけなので簡単。その後、.NETとVCランタイムを入れるためBundleを作る。あらかじめ用意されている.NET用のパッケージを使うとアンインストールとかがうまくいかなかったので自分で定義したり、バンドルのUIが英語しかなかったので日本語wxlファイルを作ったり結構苦労した。

はっぱさんと第4回Arduino Workshopを開催。といってもここまでくると外での作業は難しいので情報交換だけなのだが。で,電子工作マガジン2015年夏号内のBasicマガジンにはっぱさんのIchigoJamプログラムが掲載されていることが判明。素晴らしい。ベーマガページも大幅増量で,これは別冊化からの独立の流れで復活もあるか?

BasicマガジンはBasic投稿プログラムを載せていた雑誌で,1982年創刊2003年休刊。私の幼稚園以来の愛読書,2回ほどPC98プログラムを掲載してもらったこともある雑誌で,この雑誌がなければウェザタイはなかったし,職業も違いそう。今度イベントがあるようなのでチケットトライしてみようかな。

IchigoJamは,自作Basicマイコンと言えばいいのか。自作と言ってもチップのハンダ付けからやるレベルの自作なんだけど,メモリ4KBでBasicを組むという8bitマイコンもびっくりの内容。当時使ってたPC6001でも16KBだった。ではっぱさんのプログラムを見ていて当時を思い出したのだが,少ないメモリで動作し,雑誌掲載のために短く組むテクニックをいろいろ思い出した。電子工作マガジンで小学生がこのテクニックを使っていたんだけど,既にそこまでの投稿レベルになってるのか。

  • 命令は省略形を使う。PRINTは5バイトもくうので「?」で1バイトにする
  • 同じ理由で変数は短くする
  • IF文は遅いので極力論理式を使う。true:-1,false:0を計算式に組み込む。分かりやすい例でいうと「x = x + 128 * (x > 127)」とか。
  • 行数が多いといろいろ不利なのでマルチステートメントを使う。できるだけ1行に詰め込むってことですね。

あとはどうしようもなくなったらマシン語を埋め込むとかPEEK/POKEでシステムのメモリを直接読み書きするとかですかね。全体的に,C言語でこんなことしたら怒られる感じですね。

WT3テスト公開して,日々バグ報告が挙がってきている。致命的な問題も既にいくつか挙がっていて,すごく助かる。テスティングのクラウドアウトソーシングってことですね。単に他人にテストしてもらっているとも言えるけど,開発者としてはテストリソースが足りないのを補えて,ユーザとしても早く使えて貢献もできるという方法で,双方にメリットがある気がする。

今はまだバグ報告系のものが多いけど,使いづらい系の指摘も募集中ですので,使い慣れてしまう前に指摘よろしくです。その辺の指摘が欲しくて,あえて使い方を何も説明していなかったりもします。

Weather Typing 3をテスト公開。テストに参加して頂ける方は以下からダウンロードしてください。

Weather Typing 3テスト公開用ページ

まだまだバグが残っているので,バグを発見した方はtwitterでもメールでも何でもよいので,連絡よろしくです。

Twitterにも書いたけど,Weather Typing 3のテストバージョンは今月末に公開予定。一ヶ月テストして,9月正式リリース,その後新コンセプト版を検討かな。

WT3プロジェクト開始以来ずっと考えていた新コンセプトが決まった。「タイピングの奥深さが分かる仕組みと競い合う場」という感じで,いろんなタイピング要素を許容した上で,それを「ワードを早く打ち切った方が強い」の単一の価値基準で競うというもの。

タイピング要素は,TODみたく動体視力とか反射神経とかタイピングに関係の薄い要素は排除して,WTらしくガチな要素。例えばどんな入力方式か,ローマ字のカスタマイズの最適化,どれだけ難しいワードを打ったのか,など。今までも結局はこの辺りの要素が含まれて対戦結果が決まっていたわけだけど,それを,見て分かるようにしたい。今までのWTだと「早いなあ」で終わりだったのだが,「上級者はこんなことしてるのか」というのが分かるように。

で,コンセプトが決まった後いろいろなアイデアが出てきているのだが,どうしよう。締切まで時間がないのと,このコンセプトだとWT2ネットランキングのリセットが必要なんだよね。一旦WT2を使いやすくした版を作ってから別ものとして出すか迷い中。

余談だが,このコンセプトまでくるのにはいろいろヒントがあったわけで,それぞれ感謝。
・タイピング同人誌でタイピングの奥深さを知ったこと
・タイピングサミットでもらった要望の中の隠れた需要
・折角作るなら戦略性を上げて対戦特化すれば? というY氏のアドバイス
・ぷよぷよ(?)

WT3。スコアファイルの構成が決まった。ついでに公開鍵を使って私が署名したファイルだけをアップロードできるようにしてみたり。掲示板でちょうど指摘があったけど,ワードのランダムアルゴリズムもDRBGを使ってワードを原理的に予測不能にしたりして暗号技術をふんだんにつかっている。今時のアプリ開発ではこういう技術は必須ですね。

対戦もローカルで動いてきたのでインターネットを介した対戦をしてみた。が,結局対戦はうまくいかず。UXとかバグとかいろいろ課題が分かったので,テスト公開はもう少し修正してから。

課題の一つで,TextBoxの挙動がおかしいというのがあって,以下のようなTextBoxを作ると,IME変換中にIME入力すると,それまでに入力した文字が消えてしまうと言うもの。どうもUpdateSourceTriggerがIME変換時もProperty変更だと思っておかしな動作をするっぽい。


回避策だけど,UpdateSourceTriggerを手動でやればいいかと思って,以下を作ってUpdateSourceTriggerを消してみた。

public class IMETextBox : TextBox
{
    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        GetBindingExpression(TextBox.TextProperty).UpdateSource();
        base.OnTextChanged(e);
    }
}

この後IME変換中だったらUpdateSourceしない処理を付けようとしてたんだけど,何故か上のコードだけでちゃんと動いてしまった。なんか将来動かなくなりそうだけど今は時間がないのでこれで。適当な対策なので,使う場合はWPFのソースを見て原因を調べてから使って下さい。そして原因を教えて下さい。。。

そういえば調べようと思って忘れていた。前回の日記でラジコンを作ったときに,モータへの電源は6Vを入れている。これは,TA7291Pの電圧降下が2.5Vくらいあるらしいという情報を見てとりあえず6Vにしたのだが,本当のところどうなのかをテスターで計ってみた。結果,TA7291Pへの入力をPWMで最大出力255にしたときに2.9Vだった。ダブルギアボックスの説明では3Vで動かせと書いてあるので丁度いいようだ。ていうか3.1Vも降下してるけど何か変なのかなあ。

Arduinoでラジコンを作った。

前回,車とダブルギアボックスを使って車が動くようになったのだが,これだと左右の前輪がつながっているのでうまく曲がらない。そこで,ボールキャスターを使って左右に曲がるようにした。

さらに,BluetoothモジュールRN-42を使ってPCから操作できるようにした。

表裏はこんな感じ。

2015051701

2015051702

構成としては以下の通り。

  • タミヤのユニバーサルボード,タイヤセット,ボールキャスター,ダブルギアボックスで基本の車を作成
  • 単4電池とボックスでモータの電源を確保,6P電池とジャンパピン付きスナップでArduino用の電源を確保
  • モータードライバTA7291Pを2個使って,モーター,Arduino電源,モータ電源を接続
  • RN-42 Bluetooth 2mmピッチ変換モジュールXBee用2.54mmピッチ変換基板でブレッドボードに載せる

RN42については,買ったものがXBee用の2mmピッチだったので,2.54mmピッチに変換。秋月電子の変換ボードは3.3Vレギュレータ付きなので,電源は5Vそのままつなげるが,ArduinoからRN42へのシリアル通信は3.3Vに変換しないといけないので適当に抵抗で電圧を落とす必要がある。はんだ付けも多少慣れたけど2mmピッチは小さすぎて辛い。

2015051704

RN42の使い方はWebを探すと先人が情報を残してくれているが,Macのコンソールが一番楽そうなのでMacから繋いでみる。RN42を配線して電圧をかけると赤LEDが点滅し,それだけでMac上でBluetoothデバイスとして見つかる。ペアリングすると赤LEDが点灯するので,コンソールから「screen /dev/tty.RNBT-DF42-RNI-SPP 115200」を実行。キーボードで通信ができる。

回路図。Fritzingを使用して作図。ごちゃごちゃするのでGND省略してるけど,適当にArduinoのGNDか電池のマイナスにつなぐ。

2015051705

プログラム。どうしてもハード部分がメインになるのでソフト部分は超適当だけど,上げておこう。

int rpositive = 9;
int rnegative = 6;
int lpositive = 11;
int lnegative = 3;
int led = 13;
int lspeed = 0;
int rspeed = 0;
char inByte = 0;

void setup()
{
  Serial.begin(115200);
  pinMode(lpositive, OUTPUT);
  pinMode(lnegative, OUTPUT);
  pinMode(rpositive, OUTPUT);
  pinMode(rnegative, OUTPUT);
  pinMode(led, OUTPUT);

  analogWrite(lpositive, 0);
  analogWrite(lnegative, 0);
  analogWrite(rpositive, 0);
  analogWrite(rnegative, 0);
}

void loop()
{
  if (Serial.available() > 0)
  {
    inByte = Serial.read();
    if (inByte == 'w')
    {
      // forward
      lspeed += 50;
      rspeed += 50;
      Serial.println('f'); 
    }
    else if (inByte == 's')
    {
      // backward
      lspeed -= 50;
      rspeed -= 50;
      Serial.println('b'); 
    }
    else if (inByte == 'a')
    {
      // left
      lspeed += 50;
      rspeed -= 50;
      Serial.println('l'); 
    }
    else if (inByte == 'd')
    {
      // right
      lspeed -= 50;
      rspeed += 50;
      Serial.println('r'); 
    }
    else if (inByte == 'z')
    {
      // stop
      lspeed = 0;
      rspeed = 0;
      Serial.println('s'); 
    }

    if(lspeed > 200)
    {
      lspeed = 200;
    }
    if(rspeed > 200)
    {
      rspeed = 200;
    }
    if(lspeed < -200)
    {
      lspeed = -200;
    }
    if(lspeed < -200)
    {
      lspeed = -200;
    }

    if(lspeed >= 0)
    {
      analogWrite(lpositive, lspeed);
      analogWrite(lnegative, 0);
    }
    else
    {
      analogWrite(lpositive, 0);
      analogWrite(lnegative, -lspeed);
    }
    if(rspeed >= 0)
    {
      analogWrite(rpositive, rspeed);
      analogWrite(rnegative, 0);
    }
    else
    {
      analogWrite(rpositive, 0);
      analogWrite(rnegative, -rspeed);
    }
    
    if(lspeed != 0 || rspeed != 0)
    {
      digitalWrite(led, HIGH);
    }
    else
    {
      digitalWrite(led, LOW);
    }

    delay(100);
  }
}

次はスマホからBluetooth接続できるようにしてスマホから操作するかな。

昨日買ってきたパーツで車を動かしてみた。タミヤのダブルギアボックス,モータードライバTA7291P 2個をつないで,1.5V単4電池4本でモーターの電源を確保。Arduinoは9Vの角形乾電池とジャンパーピン変換で電源を確保。これで左右のタイヤの方向を変えて曲がることができるようになり,USBを使わなくなったので動かしやすくなった。

この前はタンクを買ったのだが,結局タミヤのユニバーサルボードとタイヤセットを合わせることで,自由度があがりそうだったのでそちらに乗り換えた。裏表に部品を実装できるようになったので配線が楽。

2015051101

2015051102

はっぱさんとArduinoワークショップの三回目を開催。アキバでBluetoothやモーターの足りない部品を揃えた。

その中で,はっぱさんがIchigoJamを見つけて購入。ボードを組み立ててテレビにつなぐとBASICプログラムを実行できるというもの。ベーマガに投稿していた我々としては見逃せない。マニュアルを見つつ二人で懐かしがっていると,電子工作マガジンにBasic Magazine復活の噂を見つけてこちらは私も購入。2ページだけだけど復活している。しかも投稿プログラムまで募集しているとは。こういった方面で盛り上がるのはいいですね。

人工知能は人間を超えるか」 (松尾 豊) を読んだ。いわゆる人工知能(アルゴリズム)ではなくて人工生命(思考,意識)に近い方の話。自分は大学でニューラルネットを研究していて,数年前に脳関連の本を読みあさったまま中断していたが,最近ディープラーニングが話題なので詳細が知りたくて。

結局ディープラーニングは特徴量を探すことができるようになりました,ってことなわけで,それ自体はこの本にも出ているPalmの創始者ジェフ・ホーキンスの「考える脳 考えるコンピューター」とかスティーブ・グランドの「アンドロイドの脳」でなんとなくできたよ,くらいにはなっていたように思うけど。

私が数年前に考えていたのは,その先,どうやって意識に持っていくかというところで,Googleが猫を猫と判定しても,それが敵と思って逃げるのか,かわいいと思って近づくのかを実現したいわけで。するとどうしても本能的なところが必要になって,現実世界に身体を持たないと難しい,というところで止まっていた。といっても遺伝的アルゴリズムで自然淘汰をするのは数億年かかりそうだし。その辺は「人工知能は人間を超えるか」にも書いてあったけど必要だよね,くらいだった。

最近Arduinoをやってるのも,現実世界からセンサで情報を取り込んで,モーターを動かすのをニューラルネットでやって何か面白いことできないかなあ,というものなので,ウェザタイを作りつつ勉強再開しているところ。

Weather Typing 3 の対戦部分を作っているが,C#のソケットは同期関数と非同期関数がある。通信中にUIをブロックしたくないので,BeginConnect~EndConnectなどの非同期関数を使うのだが,相当めんどう。処理がその場で終わらないので処理の続きは基本コールバック関数になる。するとイメージ的には以下のようなワケの分からない処理になってしまう。実際には再AcceptとかするのでLambda式では書かないけど。

class Server
{
	Callback OnLogin;
	Callback OnError;

	void Start()
	{
		try
		{
			BeginAccept(() =>
			{
				try
				{
					BeginReceive(() =>
					{
						try
						{
							if("login")
							{
								OnLogin();
							}
						}
						catch(Exception)
						{
							OnError();
						}
					});
				}
				catch(Exception)
				{
					OnError();
				}
			});
		}
		catch(Exception)
		{
			OnError();
		}
	}
}

Analog Book Readerでも非同期処理で苦しんだけど,WindowsRTの場合はだいたいの関数がawaitできるのでまだよかった。同じ事をするのにこんなにすっきり書ける。

class Server
{
	Callback OnLogin;
	Callback OnError;

	async Task Start()
	{
		try
		{
			await Accept();
			await Receive();
			if("login")
			{
				OnLogin();
			}
		}
		catch(Exception)
		{
			OnError();
		}
	}
}