Unityのローカルストレージの話
*Unity プログラミング・バイブルを読んだ自分用のメモです
データの保存先
Application.presistantDataPath
ユーザーの設定や不変なキャッシュデータの保存先はこれを使うのが一般的。
ただし、iOSの場合ここで保存したものはiCloudへバックアップされるので不必要であればUnityEngin.iOS.Device.SetNoBackupFlag(path)
で明示的にバックアップ対象外であることを示す。
Application.streamingAssetsPath
読み込み専用のデータを置く場所。
StreamingAssets
と呼ばれるフォルダーに配置したファイルはビルド先のプラットフォームの特定フォルダにエンコードされることなく保持される。
Application.temporaryCachePath
一時的なデータを保持して置く。OS側から勝手に削除される可能性があるため、永続的なデータはここに保存しないこと。 こちらはiOSでiCloudのバックアップの対象にはならない。
Application.dataPath
プロジェクトのAssets
のパスを返す。
Editor拡張などで使うことが多い。
Railsでセッションの保存を指示している場所を探してみた
お久しぶりです。ふと思ったけどこのブログタイトル詐欺もいいところですね。
自分は大学を卒業して社会人になりました。
では早速本題へ。
最近、自分はRuby on Rails チュートリアル:実例を使って Rails を学ぼうでRailsの勉強をしています。
このサイトでログインしているユーザーのIDをcookieに保存させるという演習があります。
そこ自体は問題もなく処理できていてログアウト処理も完成したのですが、ふとブラウザを確認するとログアウト後もcookieが保存されていました。
試しにcookieを削除してメインページを再読み込みしてみると↓
なんかある・・・もう一度削除して再読み込みしてもまた存在している・・・
ということで今回のcookieはどこから指示されてset-cookieに書き込まれたのかを調べました。
結論から言うとここのファイルの中のmake_set_cookie_headerメソッドで書き込みの指示をしていました。 write_cookie?メソッドがtrueだったらcookieに書き込むように指示しています。 ではwrite_cookie?メソッドの中身をみてみると。
request.ssl? || !cookie[:secure] || always_write_cookie
この3つの設定のうちどれか1つでもtrueだったらcookie保存するようです。
always_write_cookieが怪しすぎる(なんでこんなものがあるのか)
この変数が設定されている場所を探してみます(ここでした) どれどれ
config.action_dispatch.always_write_cookie = Rails.env.development? if config.action_dispatch.always_write_cookie.nil?
dev環境だとtrueになりますね。まじかよ。
request.ssl? || cookie[:secure]
も調べてみました(WEBで)
request.ssl?はhttps通信になっているかを返すらしいです。(参考サイト)
!cookie[:secure]はsecureに設定されているcookieは送信しないよってことみたいです。(参考サイト)
なんで!つけてるのかと思いましたがrequest.ssl?も合わせて考えるとそりゃそうかって感じですね。
本番環境でhttps通信じゃないのにsecure属性のcookie送ることになってしまう・・・
自分の場合はcookie[:secure]とalways_write_cookieがtrueだったのでページを再読み込みしたり移動するたびにset-cookieがヘッダに含まれていたんですね。
なるほど
Puredata拡張オブジェクトのWindowsコンパイルする方法
今まで下のサイトの通りにPure Dataのコンパイルを行っていたのですが、初期の設定が面倒だったので別のやり方が出来ないのか調べてみました。
ぶっちゃけ自信はないのでもし間違っていれば指摘していただけると泣いて喜びます。
dll開発してればみんなVisual Studioは入れていると思うのでインストールしている前提で話を進めます。
Visual Studioをインストールしていれば入っているであろう開発者コマンドプロンプトを開き、プロジェクトのフォルダへ移動。
フォルダ内には必要なライブラリーも含め.libが存在するようにしてください。
んで、これを入力(Pd公式のチュートリアルのhelloworldをコンパイルしてます)。
cl /LD helloworld.c pd.lib /link /export:helloworldsetup
~.cやexport:~の部分は各自適切に置き換えてください。
もしライブラリー追加してるのであればpd.libのあとに~.libと入力すればいけるはず。
実行してdllが作成されており、それがPure Dataで問題なく動作していれば成功です。
Inno Setupを使ってみる
ちょっとWindowsのインストーラーを作成することになったので色々調べてました。
有償で高機能なものはある程度みつけられたのですが、とある機能を実装したかったのと無償で商用利用したかったのでそれらは使うことができません。(金払え)
そこで探している最中にみつけたInno Setupを利用することにしました。
Inno Setupはオープンソースで開発されているインストーラーの作成ソフトです。
設定をいちいち書いてく必要がありますが、その分自由度が高いです。アイコンが差し替えられたりとかインストール後にサイトに飛ばしたりとか、定数でOSのパスの問題を解決してくれてるのはありがたい。
インストールとかは公式から各自やってください(ぶん投げ)
あ、あとチュートリアル的なサンプルコードと記述の方法はこちらを参考にしてください。こちらのサイト様が優秀すぎて私が基本的なことを書く必要がないですね。
何かわからないことがあれば、英語で調べると大体他の人がやろうとしててstackoverflowあたりに同じことが質問されているはずです。
次の更新時にはInno Setupを使ったインターネットからのダウンロード処理かZipの解凍処理を書くと思います。(タイトル詐欺だと今気が付いた)
Visual StudioでPuredataのデバッグをする
お久しぶりです生きてます。
今回は研究室で使ってるPuredataの記事です。
Puredataって何ぞという方はぐぐってくださいませ~。
といっても今回の記事はそんなに大したことありません。
Puredataは自作のオブジェクトを作ることができますが、デバッグの手段がないと色々と不便なので調べました。
作業量はほとんどありません。
まずはVisual Studioのプロジェクトのプロパティを開いて
構成プロパティ→デバッグを選択。
コマンドにPuredataのexeを選択し、作業ディレクトリにPuredataのbinを選択してください。
これでビルド時にPuredataが起動します。
設定が終わり、コードも作成したらデバッグを始めましょう。
ローカル Windows デバッガーのボタンを押せばビルドと同時にPuredataが起動します。
あとはPuredataからビルドしたオブジェクトを読み込んで実際に動作させます。
Facebook Bot APIをさくらインターネットのレンタルサーバーで動かしてみた
最近BOTが熱いですね。
一斉に情報を送信できたり、対話形式でのやりとりから情報を入手できるというのはとてもよさそうです。
さて、今回はSPAJAMというハッカソンでFacebook BOT APIを使ってみて色々と可能性を感じたのと情報がまだ少ないかなと思ったので導入的なものを書いてみました。
さっそく解説をしていきたいと思います。
こちらで開発者登録をしてない方は登録してください。
登録が完了したら、画面右上のマイアプリから新しいアプリを追加してください。
WWWでウェブを選んで適当なApp名を入れたらSkipしちゃって構いません。
Appを作ったら、Facebookページを作成 | Facebookから架空の人物やら適当に作ってください。
作ったらAppの画面に戻って左下にあるMessangerからトークンを生成しましょう。
生成するといってもFacebookのページを選ぶだけです。
その下にあるWebhookでユーザーからメッセージが飛ばされたときにコールバックされるURLを指定できます。
最初はFacebook側から送信されるものをきちんと処理しているかチェックされているようなので、正しくコードを書いてください。
public function hook() {
$hub_verify_token = "FacebookBotTest"; // 適当なトークン
if ($_GET['hub_verify_token'] == $hub_verify_token) {
echo $_GET["hub_challenge"];
} else {
echo 'error';
}
}
hub_verify_tokenの部分は自分で作成します
中身はなんでも大丈夫ですが、Facebook側から送るトークンと一致するようにしてください。
上手く行けばこのような画面になると思います。
なお、SSLが必要で送信先のURLはhttpsであるのが条件です。
さくらインターネットのコントロールパネルのドメイン設定→共有SSLを利用するに設定してください。
これで、アクセストークンとWebhookの設定が完了です。
では、BOTを起動しましょう。
curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token= "
この<token>の部分に生成したページアクセストークンを設定してください。
問題なければ
"success":true
と帰ってくるはずです。
これで問題なくBOTが動作するはずです。
ただ、今の段階ではBOTから何も帰ってこないので先ほど設定したWebhookのURLの中身を書き換えましょう
public function hook() {
define('VERIFY_TOKEN', 'あなたが設定したトークン');
$method = $_SERVER['REQUEST_METHOD'];
$access_token = "あなたのアプリのアクセストークン";
if ($method == 'GET' && $_GET['hub_mode'] == 'subscribe' &&
$_GET['hub_verify_token'] == VERIFY_TOKEN) {
echo $_GET['hub_challenge'];
} else if ($method == 'POST') {
// メッセージ受信
$json_string = file_get_contents('php://input');
$json_object = json_decode($json_string);
$from_user_id = $json_object->entry{0}->messaging{0}->sender->id;
$message = $json_object->entry{0}->messaging{0}->message->text;
//メッセージ作成
$post = <<< EOM
{
"recipient":{
"id":"{$from_user_id}"
},
"message":{
"text":"{$message}"
},
"notification_type": "REGULAR"
}
EOM;
$url = "https://graph.facebook.com/v2.6/me/messages?access_token={$access_token}";
$headers = array(
"Content-Type: application/json"
);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$output = curl_exec($curl);
}
}
改行されてないな・・・見難くてすみません。
これで動くはずです。
動かない方はコードの中にerror_logを出力するようにして内部で何が起きてるのかを確認できるようにしてみてください。
私のはこのような感じです。
これはただ単にメッセンジャーから受け取った文章と同じ文章を返すだけですが、簡単に出来ますね。
トークン関係で悩むやつなんていないよね。
StateMachineBehaviourを使ってみる
Unity5ではステートにStateMachineBehaviourを継承しているスクリプトがアタッチできるようになり、そのステートの再生中にコールバックが呼ばれます。
一覧
・OnStateEnter ステートが呼ばれたとき(Updateの最初)
・OnStateUpdate ステートが呼ばれたとき(最初と最後以外のUpdate)
・OnStateExit ステートが呼ばれたとき(Updateの最後)
・OnStateMove MonoBehaviour.OnAnimatorMoveの直後
・OnStateIK MonoBehaviour.OnAnimatorIKの直後
実際に追加してみるとこの様な感じです。
1つだけではなく、複数のスクリプトをアタッチすることが出来ます。
なので処理を細分化し、よりコンポーネント指向っぽい感じになりますね。
写真だと移動スクリプトと向きの変更スクリプト、アニメーションの速度変更スクリプトです、前者2つはともかく後者はなんでこんなことしてるか不思議に見えますよねw
Player制御のスクリプトがすっきりしそうです。というかUpdate内
のコードがほとんどなくなりました。
ちょうど今は敵キャラクターの制御を作成していて、EnemySTMを継承させてMoveというスクリプトからEnemyControllerの処理を呼び出しています。
敵キャラクター、プレイヤーの制御もこれでだいぶ作りやすくなったのではないでしょうか。