FC2ブログ
 
■プロフィール

クリエイトウェーブスタッフ

Author:クリエイトウェーブスタッフ
開発における、諸々を書いていきたいなと思っています。

■最近の記事
■カテゴリー
■twitter

■QRコード

QR

■最近のコメント
■月別アーカイブ
■最近のトラックバック
■ブロとも申請フォーム
■twitter_follow

■ブログ内検索

■RSSフィード
■リンク
Cloud functions上とUnityのAPI通信で余分な文字列削除
昨日の暗号の実験も兼ねて、FireBaseのCloud functions(言語はNode.js)にUnityからPOST通信でJson文字列を送ってみました。
文字列はちゃんときてて見かけ上は

var jsonStr = {"id":"UnityEditor"}; 
var json = JSON.parse(jsonStr);
※ {"id":"UnityEditor"};がUnityから送った文字列です。

しかし・・・ しかしですよエラーです。
おかしい・・・・ 意味わからない。

Cloud functionsのエラーログを見ると{"id":"UnityEditor"} の20文字目が原因とある。
調べてみると最後の }  の文字が0からスタートして19文字目で20文字目なんてない・・・ハズ。
Unityで暗号かけて、Node.js で複合してるせいなのか・・・・ それともそんな事しなくてもこうなるの?

とにかく、これはログとかに出ない最後になんか変な文字が入ってるなと思って
(これが結構プログラムしてると出くわす問題だったりします)

jsonStr = jsonStr.trim();

をかけてみました。効果なし・・・・・
う~む

とりあえず、jsonStrの文字数をログに出してみる・・
32文字・・・  えっ32文字だって・・・・ 全部で20文字なのに12文字多いのはどういうこっちゃ!! と思って
for(var i = 0 ; i < jsonStr .length ; i++)
{
   console.log(jsonStr.charCodeAt(i));
}

で一文字ずつ文字コードをコンソールに書き出してみました。 
20から32まで文字コード0が続いている・・・ 文字コード0!? そんな文字あるの?

しょうがないので色々しらべて
jsonStr = jsonStr.replace(new RegExp("^" + String.fromCharCode(0) + "+|" + String.fromCharCode(0) + "+$", "g"),'');

と、文字列の前後から余分な文字コード0の文字を削除する命令をつけてみました。
そしたら、うまくいった。
問題なく文字列をJson化してくれました。

毎回一発でうまくいかなくて、がっくりきますが、今回もそのパターン・。
とりあえず、うまくいってよかった。

カテゴリー:FireBase | TM(0) | CM(0)
Node.jsとUnityで暗号通信
使うかどうか判りませんが、FireBaseのCloud functions(言語はNode.js)とUnity(C#)でAESの暗号のやりとりを出来るようにしておこうとやってみました。
Unityのコードは

実際サーバーをPHPでやっていた時は、うまく動いてました。

で、Node.jsの方も色々調べて

というのを書いてみました。

Node.js上で作った暗号は、Node.jsで複合成功。
Node.jsで作った暗号は、Unityで複合成功
しかし。。。。 Unityで作った暗号はNode.jsで複合に成功しない・・・・エラーです。

う~む、これで終わりと思ったのですが、やはりうまくいかないものです。
格闘して調べて正解は

decipher.setAutoPadding(auto_padding =false); //パディングの設定をしなければならない
が必要のようです。
Unity側でパディング設定があるから、Node.js側もいるのでは? と思ったらズバリでした。(パディングの意味とか判ってないんですが><)

ホントは、module.exports でクラス化したかったんですが、exportsするとなぜかこの
decipher.setAutoPadding(auto_padding =false); を受け付けてくれない・・・ なぜなんでしょう。

結局1日以上潰してしまいました。

カテゴリー:FireBase | TM(0) | CM(0)
CloudFunctions上でサーバー時間を取得
node.jsで時間取得の命令を使えばいいのだろうと思ったのですが 「date-utils」 を使うらしい。
functionsのnode_modulesの中を見てみると、 「date-utils」がないように見える。。。

cd functions のコマンドでfunctionsのフォルダの中に入り
npm install date-utils
を実行しました。

node_modulesの中に 「date-utils」 が出来てました。
index.jsの中で

require('date-utils');
var date = new Date();
var formatted = date.toFormat("YYYY/MM/DD HH24時MI分SS秒");
response.send(formatted);

を書いてデプロイして実行してみた。
ちゃんと取れたんですが、年月日はあってるんだけど、時間、分、秒がどうみても日本時間ではない・・・・

調べてみたところ、協定世界時というので表示されている。
日本時間との差は、丁度9時間きっかりのようです。

require('date-utils');
var date = new Date();
date.setHours(date.getHours()+9);//日本時間に変換
var formatted = date.toFormat("YYYY/MM/DD HH24時MI分SS秒");
response.send(formatted);

でちゃんと日本時間で表示されるのが確認出来ました。

var formatted = date.toFormat("YYYYMMDDHH24MISS");
とすれば、数字のみで
20180514101010 (2018年5月14日10字0分10秒)みたいな値で取得できます。

Functionsで、期間限定でイベントを行うAPIを作る時に役に立ちそうです。

カテゴリー:FireBase | TM(0) | CM(2)
FireBaseのCloudFunctionsでCSVファイルを読み込む
SNSゲームとか作る時に、読み込み専用のデータがあります。
モンスターやらキャラクターデータやら。。 
インデックスを貼るようあ巨大なデータならともかく、100件や200件とかそんなやつ。。。。

いちいちDBから読み込むんじゃなくCSVとかから読み込めないのかと思い、格闘してました。。。数時間も
それで出来たのでメモ
最初は、同じFireBaseのCloud Storageから読み込めないんだろうかと思っていたのですが、方法はあるんですが
いわゆるStorage上のURLを取得して読み込む方法しか見つからなくて、URLでアクセスって事は当然公開ルールの設定とかも引っかかる訳だし、そもそもHTTPアクセス等で読み込むってところが、そもそも想像してたのと違いました。

じゃあFunctionsのところにCSVファイルをおけばいいのかと思ったのですが、成功したのでそれで正解らしい。

まず Node,jsでCSV読み込み関係の検索をかけたところ、いっぱいひっかかりました。
だいたい、どのページの説明も
npm install --save csv-parse
から始まる。

Functionsの環境を作ったところで(firebase init functions とかで環境つくりますが、情報は一杯出てるので割愛)
functionsのnode_modulesの中を見てみると、CSV関係はないようにみえる

cd functions のコマンドでfunctionsのフォルダの中に入り
npm install --save csv-parse
を実行しました

node_modulesの中にCSV関係が出来ている・・ たぶんこれやらないと駄目
後は、functionsフォルダの中にsample.csv置いて

のindex,jsを作ります。

そしてデプロイすると、FireBaseコンソールのfunctionsのダッシュボードをみると
helloCsvのAPIアクセスURLが出来てるので、そこへアクセス
無事CSV読み込みが出来てるのが確認できます。
読み込まれたCSVは配列になってるので、配列でアクセスします。

でもここまでの格闘で半日近くかかりました。
だいたいのページの情報の通りやると、だいたいfがエラー・・・ Cloud Functionでは、なんか違うのでしょうか・・

そういえば、最初の頃 console.logも クロームのデベロッパーコンソールで見れるのかと勘違いして苦戦した。
正解は、FireBaseコンソールのfunctionsのログに書き出されています・・

カテゴリー:FireBase | TM(0) | CM(0)
FireBase勉強中
前回FireBaseからAssetBundle読み込みを認証付きで行う方法を書いたのですが、考えてみるとキャッシュ&ロードを考えると、あれじゃいけない。。と思ってきました。

それでAssetBundleのバージョンをファイル毎の一覧にしたCSVを(もちろんAssetBundle増やしたり修正する度に、これを更新していきます)FireBase Storageにのっけて連携させる事にしました
AssetBundleを Application.temporaryCachePathにダウンロード済みなのは、ローカルから、そうでないのはFireBaseから。。。
連休中に完成させましたが、まだ検証もするのでそれはおいおい。。そのうち書くかも

GWの休みは、今後の事や、いまUnityで作ってるカジュアルゲーム考えてFireBaseに取り組んでました。
匿名認証から、RemotoConfigに、ストレージ関係、RealTimeDBに、本日はFunctions(サーバーサイドスクリプトですね)一通りやりました。

未だプッシュ通信の制御とか、そういうのはやってないですが、FireBase中々面白いです。
FireBaseはMBAASの一種ですが、いわゆるサーバー側の仕組みはある程度提供するので、クライアントプログラムに集中してくださいって仕組みの事です。

認証しないと、ダウンロードやDBアクセスできなかったりとセキュリティもしっかりしてて、スケーリング等も全部自動ですし、しかも無料で色々出来る。
諸々不足になったら有料プランにいつでも切り替えられるのもいいところ
25$と、従量制?と2種類のようですが、カジュアルゲームとかだと25$払う時は、もうそこそこ成果でてるのでは?とも思えます。

自分はサーバーやる時もありますが、PHPとMySQLとかで構築するのとは考え方からして大分違います。
DBもリレーショナルというより、Json?ライクなやつです。

プログラム自体は、サーバープログラマーよりクライアントプログラマーの範囲かもしれないですね・・・
自分は元々はクライアントが専門なので、あまり困らないですが、サーバーの人はとっつきにくかも(というよりクライアントあっての仕組みですね)
逆にいうと、Unityとかでゲーム作る人は、サーバーはFireBaseがあるってのは心強いかもしれないです。

大規模SNSゲームには難しい気もしてますが、そうでなければ十分な選択肢と考えていいかもしれないです。

心配なのは、Firebase終わりとかなると、他に転用が効かない事でしょうか・・・ 
でも天下のGoogle様なので、大丈夫と信じて・・しばらくFireBaseとお付き合いしていきます。

カテゴリー:FireBase | TM(0) | CM(0)
前のページ 次のページ

FC2Ad