Twitter card type player を 使う

Twitter card には、いくつかの種類があるが、

dev.twitter.com

player というのが実はかなり高機能で、
自分の好きな html を iframe で twitter に埋め込むことが出来る仕組みになっています。

だが、使用するには card validater を使い、審査をしてもらう必要があります。
審査は、ドメイン単位で良いので、一つのカードさえ審査にとおれば、他のパスもすべて許可された状態になります。
https://cards-dev.twitter.com/validator

審査にかかる時間

リジェクトされた場合は、許可されるまで永遠に審査をしなければならないですが、
今のところ最短は、6時間程度で審査が通りました。

Your Twitter card is ready!

We've activated the player card for 申請したドメイン名.
If you want to use other kinds of Twitter cards (and we know you do), please make another request.

審査で必要な情報

審査時にログインしているアカウント

何でも良い。

screen_name などその他項目

何でも良い。公式アカウントを入れると、エラーが出て送信できない。

審査項目

PCサイト, スマートホンサイトと、スマホアプリ で動くようにする必要があるのですが、
スマートホンサイトではそもそも表示されない、スマホアプリでは WebView で 別ページとして表示する
という仕様のため、それほど難易度は高くないです。

申請時の player は、再生されない不具合がある状態でしたが、審査が通りました。
どうやらここ数ヶ月は、かなり審査が甘くなっているようで、htmlのチェックしかしていない気がします。

mp3を申請したときは、再生時間が長いとリジェクトされましたが、最近再度同じものを申請したところ、許可されました。

注意点

<meta content="https://自分が使用するプレイヤーのパス" name="twitter:player" />
  • player に指定するURLは、htmlの場合、https である必要がある。mp3 の場合は、http で出来た。
  • X-Frame-Options SAMEORIGIN を設定してはいけない。Rails であれば、自動でつきます。
  • playerのサイズ指定は、ノウハウが必要

mod-wsgi を python3.5.0 + pyenv + Apache2 で、AmazonLinux 上に構築

mod-wsgi は、python と1:1で紐付いているため、apacheに1つまでしか追加できない。

pyenv を入れる

公式に書いてあるとおり。
yyuu/pyenv · GitHub

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
・・・

python3 を入れる

このときに、オプションを付ける必要があります。
global にしても、しなくてもよいです。

$ CFLAGS="-fPIC"  pyenv install 3.5.0
$ pyenv global 3.5.0

apache2 を入れる

$ sudo aptitude install httpd
$ sudo aptitude install httpd-devel

mod_wsgi を入れる

以下の方法でインストールしてしまうと、system の python がつかわれる。

$ sudo aptitude install libapache2-mod-wsgi-py3 

*1

mod_wsgi.tar.gz をダウンロード

公式からダウンロード

install

python のパスを指定します。

$ tar zxvf mod_wsgi.tar.gz
$ cd mod_wsgi
$ ./configure --with-python=/home/username/.pyenv/versions/3.5.0/bin/python
$ make
$ sudo make install

apache2 設定

<VirtualHost *:80>

  ServerName   hoge.test
  ServerAdmin  server-mail@hoge.test
  DocumentRoot /hoge/public

  WSGIScriptReloading On
  WSGIDaemonProcess  my_name python-path=/home/username/.pyenv/versions/3.5.0/lib/python3.5/site-packages python-home=/home/username/.pyenv/versions/3.5.0  user=apache group=apache processes=2 threads=25
  WSGIProcessGroup   my_name
  WSGIScriptAlias    /  /hoge/app.wsgi

  <Directory "/hoge/">
    Order deny,allow
  </Directory>
</VirtualHost>

追加で、
LoadModule による wsgi のロードと、の設定が必要。
WSGISocketPrefix /var/run/wsgi

トラブルシューティング

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encoding'

python-home、 python-path が間違っている可能性があります。

python-home は、python コンパイルオプションの、prefix と同じにします。
確認方法は以下。

$ python
>>> import sysconfig
>>> sysconfig.get_config_vars('CONFIG_ARGS')

python-path は、site-packages までのパスを設定します。

/home/username にアクセス出来ていない可能性があります。
chmod 755 /home/username

pyenv のインストール先を変更するのでも良いと思います。

(13)Permission denied: mod_wsgi (pid=23797): Unable to connect to WSGI daemon process '***' on '/etc/httpd/logs/wsgi.12880.0.1.sock' after multiple attempts., referer: http://dummy.test

socket ファイルにアクセス出来ていない可能性があります

WSGISocketPrefix の設定を変更する

*1:ただし、pyenv で管理しているの system python は、python (version2) で、 python3 を使う場合は、3を付けます。

Unity から C++ 側でallocした配列にアクセスする

C++で new し、C#側で一旦コピー、さらにC++で削除

hoge.h
#pragma once

#define DLL_UNITY extern "C" __declspec(dllexport)

typedef unsigned char byte ;

DLL_UNITY void loadData (byte** data, int* dataSize);
DLL_UNITY void freeData (byte** data);
hoge.cpp
#include "hoge.h"

void loadData(byte** data, int* dataSize) {

	int s = 10;
	byte* d = new byte[size];

	// ...

	*data = d;
	*dataSize = s;
}

void freeData(byte** data) {
	delete[] *data;
	*data = 0;
}
MyData.cs
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class MyData {

    [DllImport("libhoge")]
    public static extern void loadData (ref IntPtr data, ref int dataSize);

    public static void loadData (ref byte[] data) {

        IntPtr buff = IntPtr.Zero;
        int buffSize = 0;

        loadData(ref buff, ref buffSize);

        byte[] result = new byte[buffSize];
        // コピーしてから使う
        Marshal.Copy(buff, result, 0, buffSize);

        freeData(ref buff);
    }

    [DllImport("libhoge")]
    public static extern void freeData(ref IntPtr data);
}

ViewPager 利用時、 FragmentManager 内に Adapterで返しているより少ない数しか入っていない

FragmentPagerAdapter で 返すデータ数が、実際に3つあっても、
タブで1番目に切り替えを行うまで、FragmentManager の中には、2つしかFragmentが入っていないような動きになっていた。

List<Fragment> datas = getSupportFragmentManager().getFragments();
// 2つだけ

setOffscreenPageLimit で、最後のIndexを設定すると解決する。

final ViewPager viewpager = (ViewPager) findViewById (R.id.main_view_pager);
viewpager.setAdapter(adapter);
viewpager.setOffscreenPageLimit (datas.size() - 1);

knife solo cook 実行時、ERROR: undefined method `cheffish' for nil:NilClass

ubuntu でknife-solo を実行した時に以下のエラーが出た。

ERROR: undefined method `cheffish' for nil:NilClass

chef のバージョンが関係しているようだったので、

$ knife solo prepare sample-host -v
$ 12.4.1

新しいものをインストールした。ところ、問題がなくなった。
前の12.3.0でも良いという記述も見つけた。

$ knife solo prepare sample-host --prerelease

AWS EC2 スポットインスタンス 制限緩和のリクエスト

ケースの作成

左メニューの制限ボタンを押し、
制限緩和のリクエスト を更に押します。

CCには、自分のメールアドレスを忘れない。


制限タイプは、スポットインスタンスの項目が無いですが、「EC2インスタンス」を選び、
新しい制限値「200」

申請理由の説明に、
「テレビ放送があり、アクセスに耐えられないため。
スポットインスタンスの増加をお願いします。」

連絡方法「Web」

的なことを書いたところ、いつの間にかスポットインスタンスの制限が200に上がっていました。
他いくつかのオンデマンドインスタンスの制限も、200になっていました。