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

えむにわリソース

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

AzureでCROSとカスタムヘッダを併用する場合の注意

API AppsのCORS設定機能は、カジュアルにアクセス元サイトを指定できて便利ですが、

f:id:m2wasabi:20161130123126j:plain

portalで設定できるCORSを使うと、アプリケーションからのhttpヘッダの変更ができなくなります。
Web.configやアプリケーションからヘッダを触りたい場合は、
Azure portalのCORS設定には何も書かずに自分でヘッダを書きましょう。

<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true"/>
        <add name="Access-Control-Allow-Headers" value="X-Requested-With, origin, content-type, accept" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

参考:
CORS support in App Service | Microsoft Docs

VisualStudio 2017 RC のXamarinを入れたら VisualStudio2015からXamarinが消える問題

2017/3/10追記

VisualStudio 2017 GA版で、2015以前のVisualStudio と Xamarinを問題なく共用できるようになりました。
安心して VisualStudio 2017 をインストールしましょう。



先日のConnect();で VisualStudio 2017 RCが発表されました。
What's New in Visual Studio 2017


起動が爆速になったり、WepPIの呪いから解放されてそうだったり環境構築が趣味の自分的には楽しみではあります。


また、Xamarinの新機能として、Preview版の機能だった奴等が正式版になったりと、良い話は公式にお任せします。
Connect(); Keynote Releases | Xamarin Releases

本題

VisualStudio 2017 RCはインストールした後に、各開発プラットフォームの機能をインストールするのですが、
f:id:m2wasabi:20161119063213p:plain
ここでXamarinをインストールすると、 VisualStudio 2015 側でXamarinが消えてしまいます。
f:id:m2wasabi:20161119063259p:plain
ビルドも新規作成も出来なくなるので詰んでます。

最新のXamarin for Visual Studioには、VisualStudio 15 (2017のこと)の対応は入ってますが、
入れてもVisualStudio 2017 RCでXamarinを認識しません。
f:id:m2wasabi:20161119064153p:plain

いろいろなインストール方法を試したのですが、両方動く組み合わせはありませんでした。

インストール方法 VS2015 VS2017RC
VisualStudio 2017 RC から Xamarinを入れる ×
VisualStudio 2015 から Xamarinを入れる ×
Xamarin Universal Installer からインストール ×
Xamarin for Visual Studioを直接インストール ×

XamarinのUniversal Installerが Android SDKを何度でも上書きしたり、
Cドライブにしかインストールできなかったりするのはストレスしかないので何とかしてほしいですね。

今のところお勧めは、VisualStudioのインストールオプションでインストールするか、
以下のように直接ダウンロードしてインストールです。
https://dl.xamarin.com/XamarinforVisualStudio/Windows/Xamarin.VisualStudio_4.2.1.62.msi


尚、公式でインストーラーからの VisualStudio2017対応はサポートしてない旨、書いてあります。
https://developer.xamarin.com/releases/vs/xamarin.vs_4/xamarin.vs_4.2/#XVS_4.2.0.680
f:id:m2wasabi:20161119065543p:plain

結論

現時点では VisualStudio 2015 と VisualStudio 2017 RC の両方で Xamarin for VisualStudioを動かすことはできない。

※試した時点でのXamarin for VisualStudioのバージョンは4.2.1.62です。

仕事でXamarinのアプリ作ってる人は、公式の両対応を待つか、VisualStudio 2017 RCでXamarinを入れないようにしましょう。
それかXamarin StudioとVisualStudio for Macの共存できるMac買いましょう

Xamarin入門者の集いでLTしてきました

Xamarin入門者の集いでLTしてきました。
jxug.connpass.com


発表までに用意していたネタがほとんど被ってしまったので、
ほぼネタLTになってしまいました。

トークもうちょっとがんばれればよかったのですが、
いざ喋りだすとネタ全部忘れてスライド読みだすのは良くない癖ですね。

doc.co

余談ですが、後半のいかにも前時代パワポ臭いスライドはわざとです!
何名か笑ってくれたのでよかった!

そういえば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);
    }
}