読者です 読者をやめる 読者になる 読者になる

えむにわリソース

ITのスキマ的なあれこれを書きます。

そういえばUnity初心者の会で発表してた

そういえば、人知れず14日のUnity初心者勉の会に参加してきました。
web3dj.connpass.com

最先端について語りたいけど、なにぶんへっぽこなので、
モデルの差し替えで詰まりがちなMechanim with Humanoidの使い方について、 Stabdard Assets について、LTしてきました。
分かってる方には学びでも何でもなくサクサクなのですが、分かってないと何やっていいのかサッパリな部分なので、初心者向けには良いかなと。
スライドにアニメーションGIF使ってますが、オンラインだと動かないので、ちゃんと見たい方はpptxをダウンロードして見てください。
doc.co

明日はXamarinについて何か喋るらしいです。
jxug.connpass.com


ジャンル横断で発表するなんて完全に勉強会五郎ですね。
後ろで「ほーいいじゃないか こういうのでいいんだよこういうので」とか「すごいことになっちゃったぞ」とか心の声で言ってる時が至福です。

Azure Web Apps のPHPでSecureなAPIにアクセスするときの設定

OAuth2や外部のRestAPIが普及してきたことで、curlを使ってSSLを叩く機会が増えてきました。
しかしながら、Azureを含むWindowsプラットフォームで、設定無しにsslサイトにcurlすると、

cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

とか言われて怒られます。

f:id:m2wasabi:20161005144711j:plain

適切なCA証明書の場所をPHPに教えてやればいいのですが、
ググっても、証明書の検証を無効化するとかは論外として、
自分で証明書入れたり*1、Gitの証明書を流用すればいいろ書いてあるものの、結果そこには何もありませんでした事案*2ばかりだったので、
現在の構成で正しい場所を共有します。*3


"D:\Program Files (x86)\Git\etc\pki\ca-trust\extracted\openssl\ca-bundle.trust.crt"

以下のファイルを wwwroot 以下にデプロイしてやれば、sslcurlがばっちり使えます。

.user.ini


それでは、良いAPIライフを。

*1:https://blogs.msdn.microsoft.com/tsmatsuz/2014/12/12/azure-web-site-curl-ssl-https/ blogs.msdn.microsoft.com

*2:azure.microsoft.com

*3:WebAppsの中を探索しまくれば一応見つかりますが、無駄な労力です

Laravelのmigration作り直し時に嵌った話

Lumenでmigrationを作りたいときartisanコマンドを使って書きますが、

php artisan make:migration create_users_table

オプション変えたいなどで作り直しをした場合に

rm database/migrations/2016_09_02_065515_create_users_table.php
php artisan make:migration --create=users create_users_table

リンクさせた覚えがないのに蹴られる現象が。

[ErrorException]
include(/app/vendor/composer/../../database/migrations/2016_09_02_065515_create_users_table.php): failed to open stream: No such file or directory

artisan make:migration が実行時にcomposerのclassmapを更新しているためで、
classmapを最適化しなおしてやればエラーが出なくなります。

php composer.phar dump-autoload -o
php artisan make:migration --create=users create_users_table


でも、migrationってclassmapに登録する必要ある…?

Milkcocoa for Unity の使い方

MilkcocoaをUnityで使うライブラリ「Milkcocoa for Unity」を公開しています。
現在最新バージョンは0.0.3です。

ダウンロード
GitHub or unitypackage

主な用途

  • リアルタイム通信を手軽に実施したい
  • 手軽にアプリケーション外の何かと連携したい

Milkcocoaとは

BaaS(Backend as a Service)といわれるサービスの一つで、リアルタイム通信と小さなデータベースが自分でサーバを管理することなく実現できるものです。
同時接続数10クライアントまで無料。
⇒Milkcocoa

前準備(Milkcocoaの登録)

Milkcocoaのサービスに登録し、アプリケーションIDを取得します。
以降、アプリケーションIDは APP_ID と呼称します。
具体的な方法は公式ページ参照

インストール

  • アセットをダウンロードする⇒Download
  • Unityのプロジェクトウィンドウにドロップする

UnityEditorでの設定

  1. Milkcocoaのプレハブを、hierarchyにドロップする(任意)
  2. APP_IDとdatapathを変更する

f:id:m2wasabi:20160325065152j:plain

コードの書き方

サンプルプロジェクト

以下のシーンにサンプルプロジェクトが入っています。参考にしてください。
/Milkcocoa/Demo/MilkcocoaTest
APP_IDを設定すれば使えます。

また、以下に実際のコード例を記します。

例1. メッセージを受ける側

using UnityEngine;
using System;
using Milkcocoa;
public class example1 : MonoBehaviour {
    MilkcocoaClient milkcocoa;

    void Start () {
        milkcocoa = FindObjectOfType<MilkcocoaClient>();
        milkcocoa.OnSend(milkcocoaEventHandler);
    }

    public void milkcocoaEventHandler(MilkcocoaEvent e)
    {
        // example print
        Debug.Log(e.GetValues());

        // example search
        if (e.data.GetField("params").HasField("chat"))
        {
            string id = e.data.GetField("params").GetField("chat").GetField("id").str;
            string message = e.data.GetField("params").GetField("chat").GetField("message").str;
            string username = e.data.GetField("params").GetField("chat").GetField("name").str;
            if(id != milkcocoa.clientId)
            {
                // 自分以外のメッセージ
            }
        }
    }
}

例2. メッセージを送る側

using UnityEngine;
using System;
using Milkcocoa;
public class example2 : MonoBehaviour {
    MilkcocoaClient milkcocoa;

    void Start () {
        milkcocoa = FindObjectOfType<MilkcocoaClient>();
    }

    private void sendMessage(string str)
    {
        JSONObject jsonobj = new JSONObject(delegate(JSONObject values)
        {
            values.AddField("chat", delegate(JSONObject chat)
            {
                chat.AddField("id", milkcocoa.clientId);
                chat.AddField("name", Uri.EscapeDataString("大鳥こはく"));
                chat.AddField("message", Uri.EscapeDataString(str));
            });
        });
        milkcocoa.Send(jsonobj);
    }
}