黒猫の小夜曲
黒猫の小夜曲
知念 実希人 (著)
優しい死神の飼い方の続編ですね。
今回の主人公は、元天使の黒猫。
ミステリー仕立てのストーリー展開ではなしが進むので、テンポよく読めると思います。適度に笑いがはいるので緩急があってあきないでしょう。話のきり回し方がうまいので誰でも楽しめる本ではないでしょうか。ちなみに犯人は最後までわたしには見当がつかなかったです。
買って損したと思うことはまず無いと思います。この本は当たりだね。
★★★★☆ 4.5点
kiryukaikouten
黒猫の小夜曲
知念 実希人 (著)
優しい死神の飼い方の続編ですね。
今回の主人公は、元天使の黒猫。
ミステリー仕立てのストーリー展開ではなしが進むので、テンポよく読めると思います。適度に笑いがはいるので緩急があってあきないでしょう。話のきり回し方がうまいので誰でも楽しめる本ではないでしょうか。ちなみに犯人は最後までわたしには見当がつかなかったです。
買って損したと思うことはまず無いと思います。この本は当たりだね。
★★★★☆ 4.5点
キャラクターの彩色には普段PhotoshopCCを使っているのですが、今日突然タブレットの調子がおかしくなってしまいました。なんと彩色出来ない(;´Д`) ペンツールなのに、なんか画面スクロールしてまるきりおかしくなってしまいました。CLIPSTUDIOやIllustrator及び、古いPhotoshopCSでは、まったく問題ないけど、PhotoshopCCだけおかしい。PhotoshopCC使えないとすごくというか致命的に困るので、タブレットドライバ入れ直したり、はてはPhotoshopCCそのものを入れ直したりしましたが、まったく解決できず一時は困り果ててしまいました。ネット検索かけて自分と同じ事例を見つけてなんとか解決できましたので、リンクをつけておきます。このページを見た方で、もしもいつか同じ様な現象がでたら以下の解決法を試してみたらいかがでしょうか。
(相談者)PhotoshopCCでのペンタブの不具合について. 【問題. イラスト制作時、画像拡大すると、ペンタブの機能が使えなくなる。 (ブラシツールや移動ツール全て使えず、手のひらツールで画面を移動するような感じになります)に対する回答
PhotoshopCCでのペンタブの不具合について
https://forums.adobe.com/thread/2472731
Adobeの回答
https://helpx.adobe.com/jp/photoshop/kb/cq08110039.html
質問者の方は、Iutuosでの事例ですが、私の場合、BAMBOO CTH-470でもこの現象がでましたので、他のタブレットでも起こり得るのでしょうね。
春の扉絵を描き終えました。前々から飛行船というものを描いてみたいなーと思っていましたが、やっと登場させることが出来ました。ε-(´∀`*)ホッ
パズルRPGの作り方
源株式会社 (著), 塚本 淨司 (著), 竹下 和秀 (著)
Cocos2d-xは使ったことなかったのと、中古本が400円、送料込みで800円と安かったのでアマゾン経由で購入してみました。
ちなみにこの本は、Amazonレビューで平均で星1.8点という低い評価がついている本です(私が評価するなら星2つぐらい)。
全部で300ページ程度のよくある厚さの本なのですが、最初の100ページで企画と開発ツールの準備等について解説した後、残りのページでコード解説をしています。主要なシーンのポイントとなるところを「この部分はこうゆう意図で作っているよ」といった感じで解説するスタイルをとってます。ですが、アマゾンレビューの方で書かれている方もいるように、解説がざっくりすぎて本を読んだだけでは、詳細は分かりません。この本の後半200ページ読んだだけでは、コードの全容が見えてきません。一通り全シーンの解説をもっと詳しくしてやったら、500ページぐらいないと説明しきれない内容なんじゃないでしょうか。
そしてこれもすでにアマゾンレビューに書かれてますが、サンプルコードをダウンロードして本と突き合わせながら解読してコードを動かそうとしても、悪い条件が重なった結果、今の環境ではサンプルがまともに動かせなくなっています。
サンプルコードを開いて見てみると、.cocos-project.json というファイルに”engine_version”: “cocos2d-x-3.8.1″という記述があるので
このバージョンのcocos2d-x(とcocosStudio)の組み合わせで環境を用意できれば、そのまんまサンプルが動かせそうですが、今の時点で探せたのはver3.10でした。こいつでサンプルを動かそうとすると、警告が出る(作成したバージョンが違うと同じコマンドでも意図しない動作をするおそれがあるよ的な)だけでコンバートも何もしてくれないのでプログラムが走ってくれません。 その為どうしたらいいのか分からないので、私の場合はサンプルを動すのに、ver3.10で新規の空のプロジェクトを起こして、そこにソースを移植して動かす羽目になりました。ボタンとか画像のレイアウトもcocosstudioで一つ一つシーンを作成して、全部移植しました(サンプルは開くだけならできるので)。9章のパズル部分はこれ単独でほぼ独立した存在なので、ここだけやってみていけそうなら、後続の章を進めてみてもいいかもしれません。9章をやってみてこらアカンと思ったら、止めといた方がいいと思います。最後の18章までやってみたら、2週間以上かかりました。
以下、この本の良い点と悪い点を列挙しておきます。やるべきか止めとくべきかの参考にしてください。
良い点
・アプリが軽い。完成データは25MB程度だった。
・ノード(Unityでいう空のオブジェクト的なものに近いのかな)の追加や切り離しが分かりやすい。
悪い点
・CocosStudioの開発が終了している。後継ツールとの互換性が乏しいらしい。参考).https://qiita.com/wyamamo/items/5d5857af71f8c3842a81
・本で紹介しているソースを記述する為のエディタが普通のフリーエディタなので、入力支援が期待できない。コピペせずに自力で入力するとスペルミスがどうしても出てくる。
・デバッグ機能が開発ツールに無いので、GoogleChromeのデベロッパー開発画面で行うことになる。
・サンプルコードに、スペルミス、不要なコードの残骸、宣言だけしてあっても実装してない関数や、実装までしてあってもどこにも使われていない関数が散見される点。
・予告なく、ファイル名が変わっている点。変数名の命名にゆらぎがある点。
・これは結果として、おかしな動作になるだろうと予想されるようなコードが目につく点。アマゾンレビューヤーの人が書いていたように、処理が重複してるんじゃ?と思わせるようなところや、バトルシーンのスキル発動の判定部分など初回発動のタイミングを見逃すと、戦闘が終了するまで永遠にスキルが発動できないといったこれは仕様なのか単なるバグなのかよくわかんないコードが出てくるので、悩む点。
・サンプルコードを動かしながら、コードを読解していくのが基本スタイルみたいなので、前述のとおりサンプルがまともに動かない状態では、初学者だとどこから手を付ければいいかが分からないという状態になる点。
・スプライトやテンプレートからロードして作成したキャラクターデータを配列でそれぞれ管理しており、配列の動きをよく理解していればそんなに難解なコードではないのだが、似たような名前の変数がいっぱいあってしばしば混乱しがちな点。
・ウェブのリファレンスを始め、一次、二次ともUnityなどに比べると資料が乏しい。
・Androidに書き出す時の手順がまたややこしい。本に書いてある手順では、Eclipseを併用してることを前提に書いてあるのか、AndroidStudioを使っている場合には、この方法では適用できない点。
・また個人的には、cocos2d-xをインストールすると、Python2系で動作するので、以前レビューで取り上げた「12歳から始めるpython」で使用しているpython3系とバッティングしてしまう。pyコードの実行は2系を優先させるようにしているので、3系で実行したい場合は、いちいち設定を戻さないといけないのがめんどくさい。
..後の方はなんか悪口ばかりになってしまいました。
この本は、中身をちら見した感じでは優しそうに見えるのですが、以上の理由で初学者には向かないと思います。見た目は「12歳から始めるPython」みたいなんですが(´;ω;`)
作ればわかる!Androidプログラミング 第3版 SDK5/Android Studio対応 (Smart Mobile Developer)
金宏 和實 (著)
最新版の一つ前の版のが図書館にあったので借りて読みました。(※画像リンクは第四版へのもの)
頭がスッキリしている時に集中して読めば理解できる本でした。為になりますが内容が結構濃いので、疲れている時に読むと段々プログラムの前後のつながりが分からなくなってきます。アマゾンレビューなどにも書かれていますが、入門書では無いと思います(でも細かいところまで説明が丁寧)。自分のように、ダイアログフラグメントの基本的な使い方・組込み方が知りたいとかの目的があって雛形を探している方にはいいのではないでしょうか。ただ手元に置いて手軽に参照できるタイプの本では無いんですよね。堅いというか参照する都度じっくり読み込まないと理解できないというか、ちっょとこの部分だけ拝借というのが出来ない。そのあたり持て余し気味で手元に置いておいてもいいけど、どうかな?という感じの本です。
★★★☆☆ 3点(3.5)
横濱エトランゼ
大崎 梢 (著)
お正月の間にと図書館から借りていたのを、やっと読み終わりました。
千紗という高校生の女の子と幼馴染との恋愛ものです。横浜にあるフリーペーパー紙に関わってくる街やそこに住む人々の小さな謎を千紗と善正の二人で解いていくというスタイルでストーリーが展開されていきます。
主人公の片思いする気持ちのじれったいもじもじぶりはよく伝わってくるのですが、幼馴染の善正君はちょっと達観しすぎてるように思えました。クールすぎるのか、枯れちゃってるのか…。あとライバルとしてでてくる美貌の従兄弟さんもどうかなー。あんまり深くは踏み込んでこないというか、いい人すぎる。そのあたりが消化不良気味な作品かもしれません。結末も可もなく不可もなしといった感じがしました。
★★★☆☆ 3点
新年度になりましたので、遅れましたが扉絵を冬用のイラストに変更しました。うん、着替え中の絵ですね。
やっとArduinoパートまで進めました。
ここは、参考サイトには無い項目なので自力で作ってみました。(´・∀・` )
スクリプトを書き出してみました。こんな風になります。
// スマホとブルートゥース(シリアル)通信で、やり取りするプログラム // スマホのUnityアプリに配置してあるスライダーからのRGB値を受信してRGB_REDの色を変更する // Bluetooth通信ライブラリ #include <SoftwareSerial.h> SoftwareSerial BT(10, 11); // RX:10,TX:11 それぞれブレッドボードのBT機器の逆にRXはTXへ、TXはRXへ // char配列->int変換用 #include <stdlib.h> // バッファ char buffer[4]={0}; // 初期化 4byte(3+\n) // RGB値 int R = 0, G = 0, B = 0; void setup() { // [1] アルディーノ側初期設定 Serial.begin(9600); // [2] HC-06 側初期設定 BT.begin(9600); Serial.println("setup passed"); } void loop() { int byteRead = 0; int rgb_value; // Bluetooth 受信処理 if (BT.available()) { byteRead = BT.available(); // バッファに溜まっている文字数を取得 /* Serial.println("Reading To Buffer..."); Serial.println(byteRead); Serial.println(); */ delay(100); // 上のシリアルモニターへの処理(負荷)がなくなると、RGB_LEDがうまく点灯しなくなるので、代わりに遅延をかけている。 for(int i=0; i<3; i++){ buffer[i]= (BT.read()); buffer[i+1] = '\0'; } //Serial.println(buffer); } rgb_value = atoi(buffer); // int型に変換 if(0<=rgb_value && rgb_value<256){ // R値 analogWrite(5,rgb_value); }else if(256<=rgb_value && rgb_value<512){ // G値 analogWrite(6,rgb_value - 256); // ゲタは外しておく }else if(512<=rgb_value && rgb_value<768){ // B値 analogWrite(7,rgb_value - 512); // ゲタは外しておく }else{ // error //Serial.println("無効値を受信"); } }
Arduinoのリファレンスにあるソフトウェアシリアルのread()関数の戻り値は、char型で受けているので、このスクリプトも文字の終端1byteを加えた4byteのバッファを用意して受け取っています(終端文字を挿入しては上書きするといったおかしなこともしてますが)。バッファに値が入ったら、もう一度int型に変換し直します。RGB値にゲタを履かせてずらして飛ばせば戻すのも切り分けも平易に出来るのでこう言う風にしました。
これで準備が整ったので、後は、Arduinoにこのスクリプトを流し込んで、スマホに書き込んだアプリを起動すれば、すでにペアリング済みのBluetooth機器を選択するダイアログが出てくるので、HC-06(実験ではHC-06を使用)を選択すれば、コネクションを確立します。コネクションを確立後、Unityのロゴが出てスライダー画面が出てくるので、スライドするとArduino側に接続されたRGB_LEDが指定のRGB値で点灯するようになります。
余談
Arduinoの電源にモバイルバッテリーが使えたらいいなぁとかねてから思ってて、ダイソーで買った300円バッテリーをつなげてみたらやっぱり使えませんでした。5Vの出力あるのになんでかな~とかしばらく考えてましたが、よくよく考えたらArduinoの入力電源はUNOもNANOも7V~12Vだということをすっかり失念してました。そりゃムリだよね。ところで、このダイソーの300円バッテリーせめて他の用途で使えないかなぁと思って、色々調べてみたら(参考サイト http://d.hatena.ne.jp/wakwak_koba/20170603)のような記事をみつけました。なるほど、以前ラジオの電源にしようと使ったらリセットがかかって何度も再起動した原因はこれか~と、納得しました。本当にこのモバイルバッテリーは、充電以外なんの用途にも使えないんですねぇ。残念。
前回は、Unityからエクスポートした内容をAndroidStudioに取り込めるようにしたところまで進みました。今回の備忘録は、Android側のスクリプト部分についてになります。
引き続き参考サイト(http://tokyo.supersoftware.co.jp/code/4807)の手順したがって、Arduinoに出力できるように改造していきたいと思います。
といっても、今回はほとんど手をいれるところがないのですぐ終わっちゃうかも。
AndroidStudioで適当な名前でプロジェクトを作って、参考サイトのコードをコピペしてみると、Unityで書き出したものは前回の移植の結果取り込めており、エラーは出なくなりました。
ですが~、コピペした段階でやたら警告が出てきます。
private ProgressDialog waitDialog; //非推奨のコード。
このサンプルプログラムで使われている上のようなダイアログ系の命令がことごとく非推奨になってしまっているので、このままでは使えません。そのままビルドするとエラーになります。ではどうしろというか調べたら、DialogFragmentを使えとかでてきますが、そんな使ったこと無いもので人様の書いたコードをいじくりましたらますます動かなくなってしまうおそれがあるので絶対イヤ!゚(゚´Д`゚)゚ こうゆうところでコケると、結構萎えます。
どこを参考にしたか忘れてしまいましたが、AndroidStudioの[ファイル]-[プロジェクト構造]の[Module]-[app]から、右列の[Complile SDK version]をAPI 25まで引き下げればそのままこのスクリプトは使えますので、設定を変えてしまいます。DialogFragmentは、本筋でないので今回は追いません。
なんとかエラーも消えましたので、参考サイトの2つのコードについて進めていきます。
ほとんどそのまんまで使います。変更点は、
BluetoothTestActivity.javaについては、
onClickButtonの中身が変更になります。引数としてUnityから受け取ったint型の値を元コードでは、switch文で場合分けして、新たなstring型のメッセージを飛ばしていますが、
String msg; msg = String.format("%03d",position); Log.d("メッセージの内容2",msg); bluetoothTask.doSend(msg);
といった感じに、int型のRGB値を整形してからメッセージとして飛ばしています。
(整形前 例)
1
55
512
という形で入ってくるint型のRGB値のデータを、
(整形後 例)
001
055
512
といった感じの3桁の文字列に変形して送信用の関数に飛ばします。こうしておかないと、後でArduinoでデータを受け取った時に困ったことになります。
参考サイトのコードでは、ボタンをクリックした時にボタンアクションに対応する1個のメッセージが飛ぶ仕組みになってましたが、スライダーの場合はスライド中の値をメッセージとして次々飛ばしてきますので、少し細工をしてからArduinoに渡すようにしないと後で悶絶することになります。
という訳で、BluetoothTask.javaの方も一行だけ手を加えておきます。
/* * サーバにメッセージの送信を行う非同期タスク。 */ private class SendTask extends AsyncTask<String, Void, Object>{ @Override protected Object doInBackground(String... params){ try{ //btOut.write(params[0].getBytes()); btOut.write(params[0].getBytes(),0,3); // 第二、オフセット。第三、長さ (参考)https://docs.oracle.com/javase/jp/8/docs/api/java/io/OutputStream.html btOut.flush(); // 強制的に書き出し return ""; }catch (Throwable t){ doClose(); return t; } }
元コードでは、引数として渡されたString型データの長さ分全部送信しちゃいなさいと書かれてますが(参考 https://msdn.microsoft.com/ja-jp/library/aa904361(v=vs.71).aspx)、ここを書き換えて、念のため3byte単位で抽出して書き出しなさいという風にしてしまいます。
この部分、一見無くてもいいように見えるんですが(引数はonClickButton関数で3桁に整形済みなので)、
この非同期のスレッド(doInBackground)からArduinoにメッセージが飛ぶ様子をArduinoのシリアルモニタで観察してみると、何も細工をしないで飛ばすと、1byte受信したり、3byteだったり、9byteとかまちまちな長さで飛んでいってるのが観察できます。
確信は出来ないですが、ここで先頭からのオフセット3byteのみ飛ばすという指定をすることで、例えば、
溜まっていたメッセージが
001
だけなら、そのまま3byte送信。
溜まっていたメッセージが
001055なら、
055は捨てて、001のみ発信という形になるのを期待して書いています。
メッセージの後ろから3byteを抽出して送信というのがもっともいいんでしょうが、多少のズレがあってもいいやと思ったのでこのままにしてあります。後ろから3byte指定にしたい場合は、lenを取得して-3の位置をオフセットの開始位置にして発信すればできそうな気がします。
次で、やっとArduinoにはいります。
前回は、Unityでユーザーインターフェースを作ったところまででしたので、今回はその続きの内容からになります。参考サイト(http://tokyo.supersoftware.co.jp/code/4807)様の内容でいうと、Android用プロジェクトとしてエクスポートするというところからになります。
キャプチャーが貼ってあってそのとおりにしたかったんですが、Unity5以降の画面では、微妙に表示内容が違っていたので、以下のキャプチャーの様にして書き出しました。
古い形式のADT(Legacy)で書き出したら、うまく取り込めました。ちなみにGradleで書き出すと、後述する別の参考サイトの取り込み方で指定されているフォルダ構成にならなかったのであきらめました。尚、Gradleについては、この辺の記事を読めばいいのかな(もっとも自分はまだ読んでないですが [参考]http://gihyo.jp/dev/serial/01/android_studio/0006)。
参考サイトでは、この後サラッとエクスポートしたプロジェクトをAndroidのプロジェクトにインポートしますと書かれていますが、やり方がよく分からなかったので、ここは随分試行錯誤することになりました。Androidに「インポート」って項目があるのでやってみたけど、うまくいかなかったり…。
またまた色々調べて、以下のサイトのやり方に従ってやってみたら、取り込むことが出来ました。
(参考サイト) http://meleap124.blogspot.jp/2015/04/android-studiounity.html
こちらのサイトの指示どおりに従って、手作業で移植すれば動きますね。4のマージは、自分の場合は、Unituロゴアイコンのデータをコピーする程度でした。特に上書きは無かったです。5のマージは、ちょっと注意がいるので、最初の参考サイト(http://tokyo.supersoftware.co.jp/code/4807)の下の方に記載されている、AndroidManifest.xmlの内容に沿ったものになっているか確認しながら移植することになると思います。
私の場合は、以下の様にAndroidStudioが自動で作成したマニュフェストに追加記載しました。また、Unityのユーザーインターフェースは、横向きレイアウトで作成したので、landscape指定を追加でしておきました。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.hoge.unity.bluetooth.test"> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <application android:allowBackup="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/UnityThemeSelector" android:isGame="true"> <activity android:name=".BluetoothTestActivity" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="jp.co.hoge.unity.bluetooth.test.UnityPlayerActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="landscape"> <!--<intent-filter>--> <!--<action android:name="android.intent.action.MAIN" />--> <!--<category android:name="android.intent.category.LAUNCHER" />--> <!--<category android:name="android.intent.category.LEANBACK_LAUNCHER" />--> <!--</intent-filter>--> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="26" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> </manifest>
つづく。