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)
とか言われて怒られます。
適切なCA証明書の場所をPHPに教えてやればいいのですが、
ググっても、証明書の検証を無効化するとかは論外として、
自分で証明書入れたり*1、Gitの証明書を流用すればいいろ書いてあるものの、結果そこには何もありませんでした事案*2ばかりだったので、
現在の構成で正しい場所を共有します。*3
"D:\Program Files (x86)\Git\etc\pki\ca-trust\extracted\openssl\ca-bundle.trust.crt"
以下のファイルを wwwroot 以下にデプロイしてやれば、sslなcurlがばっちり使えます。
.user.ini
それでは、良いAPIライフを。
*1:https://blogs.msdn.microsoft.com/tsmatsuz/2014/12/12/azure-web-site-curl-ssl-https/ blogs.msdn.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での設定
- Milkcocoaのプレハブを、hierarchyにドロップする(任意)
- APP_IDとdatapathを変更する
コードの書き方
サンプルプロジェクト
以下のシーンにサンプルプロジェクトが入っています。参考にしてください。
/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); } }