Posts in Category: iPad

WordPressでかんたんWeb API構築

えーと、またしても何ヶ月ぶりでしょうか。。1年ぶりくらい?時の経つのは早いですね。
そして、同時進行な案件が重なりすぎて自分のことなんもできません。

そんななか、とあるiPhoneアプリ案件でサーバのデータを拾ってくる処理
いわゆるAPIを叩いてJSONデータのレスポンスを受けるweb APIなアレを作ってます。

普通にPHPやCakePHPでさくっと作ってしまえばいいのですが、クライアント側で更新するためどうしても管理画面が必要なるのですが、
管理画面をイチから構築って地味に面倒ですよね。

そーいやWordpressなら管理画面やらフロントエンドやら一式そろってるし、一発で済むんでないの??ってフと思い立ち
ちょっと試してみました。

WordPressの投稿系は
・カスタム投稿タイプ
・カスタムフィールド
あとはクライアントが使いやすいように管理画面をカスタマイズすれば十分。
ユーザー認証(管理画面へのログイン)も付いてるのでなんと楽なことでしょーか。

リクエスト/レスポンスまわりは プラグインの JSON APIで済みそう。

CakePHPみたいなコントローラークラス内にメソッドを追加していけばそれで受けてくれる模様。

まず、functions.php内にてコントローラーを追加します。
コントローラー名は「TestApi」

// コントローラーを追加
// add_testapi_controllerは登録するための関数名(適宜)
add_filter('json_api_controllers', 'add_testapi_controller');   
function add_testapi_controller($controllers) {   
    $controllers[] = 'TestApi'; //コントローラー名を指定
    Return $controllers; 
} 

// json_api_*コントローラ名*_controller_path コントローラ名は全て小文字

add_filter('json_api_testapi_controller_path', 'testapi_controller_path');   
function testapi_controller_path($default_path) {
    $path=get_template_directory().'/JSON_API_TestApi_Controller.php'; //コントローラのファイルパス
    return $path;   
}

2つめのfilterでハマったのが
「json_api_*コントローラ名*_controller_path」
この記法を変えないように。

get_template_directory().’/JSON_API_TestApi_Controller.php’;
これは、使用中のテンプレートディレクリ直下にコントローラのファイルを置くことを想定しています。

コントローラーファイルもこの記法にしたほうが無難です。
JSON_API_*コントローラ名*_Controller.php

そして、本題のコントローラ
下記のように冒頭にコメントを入れることで、プラグイン設定の部分に概要が表示されます。

<?php
/*
Controller name: TestApi
Controller description: テスト用API
*/
class JSON_API_TestApi_Controller {   
    
    public function all() { 
        $args= array('post_type' => 'post');
        $result_query = new WP_Query($args);          
        
        $result=array();
        if ($result_query->have_posts()) {
            while ($result_query->have_posts()){
                $result_query->the_post();
                
                $data['post_id']=get_the_ID();
                $data['title']=get_the_title();
                $data['date']=get_the_date('Y.m.d H:i');
                $data['content']=get_the_content();
                array_push($result,$data);
            }
        }
        wp_reset_postdata();
        return array( "result" => $result ); 
    }
}
?>

ここでは全投稿記事を取得しjsonで返送するメソッドallを作っています。
みてわかるとおり、フツーに検索してループ内で整形処理し、最後にresultという連想配列へ突っ込んで返しているだけです。
あとはプラグイン側でjsonで出力しています。

今回WP_Queryを使用しましたが、query_postsでも大丈夫です。
フツーにループで処理しているので、カスタム投稿もいつも通りに使えました。

もちろん、the_title() メソッドではechoで出力してしまうので get_the_title()などに置き換えてください。

また、引数を取り合い場合は
$_GET
$_POST
などで普通にPHP的に引数を取得できます。

最後に、コントローラファイルを配置したところで、プラグイン設定のコントローラを有効化します。
(コントローラファイルを配置しない状態ではエラーがでるはず)
WP管理面の「設定」-「JSON API」にてTestAPIを有効化してください。

スクリーンショット 2013-12-01 22.01.43

ちなみに有効化の隣のメソッド名をクリックするとメソッドを呼んでくれます。

さっくり作れるのはいいんですが、トークンやらIDやらなんにもやってないのでダダ漏れ上等なAPIではあります。
あくまでさっくりAPIってことで

Share on Facebook

CoreMIDIの勉強

なんか去年末からごにょごにょやってたんだけど、いろいろあって遅々として進まず。
勉強するには手を動かしてコード書くのがイチバンですよねやっぱ。

CoreMIDIはぱっとみデバイス(Device,Entity,Endpoint)の関係性がいまいちわからずもやもやしてたんですが
自分なりに関係性を図に書いてみました。

CoreMIDIの図(修正)

App側からはClientオブジェクトを作成し、これを通してMIDIデバイスとやりとりするわけですが
デバイス内のEntityがいまいちわからず。
Entity内には実際のMIDI入出力ポート(Endpoint)のSource(MIDI IN) Destination(MIDI OUT)が入っています。

よくあるMIDI IN 2 /MIDI OUT 2 みたいなMIDIインターフェースで手持ちのEDIROL UM-2Gなんかだと
Entity内にそれぞれIN 2コ/OUT 2コなんて構成になってると思いきや
IN 1/OUT 2の入ったEntityが2つ という構成になってました。

MIDI Device(UM-2G)
 |
 ◆-Entity 1 –IN 1 (Source) / OUT 1 (Destination)
 |
 ◆-Entity 2 –IN 1 (Source) / OUT 1 (Destination)

また、Device,Entity,Endpoint はそれぞれユニークなIDが振られているため、永続化に使えるのか?と想像してます。

OSXでは一度接続したMIDI機器の情報は保存される模様で、つなげていなくても全デバイス取得すると取得できちゃったりします。
ただ、Entityプロパティのオフライン情報で実際の接続の有無が確認できる模様。
iPadではこんなことはなく、MIDI機器外すと全デバイス情報もクリアされちゃうみたいです。

CoreMIDIイニシャライズの流れとしては

1 Clientオブジェクトの作成
2 Inportオブジェクト、Outportオブジェクトを作成
3 MIDI受信コールバック関数をInportオブジェクトへ登録(送信のみはいらない)
4 NotificationコールバックをClientへ登録(これは適宜)
5 受信したいEndpoint(Source)とInportオブジェクトをコネクト

これでMIDI受信すると受信コールバックが呼ばれます。
送信はMIDIパケットリストを作成し、Endpoint(Destination)を指定して送信します。

受信したいEndpoint、送信先のEndpointは総じて全部まるっこ指定してるようです。
細かく制御することも可能だと思います。

とりあえずの勉強の成果としてちょっとCoreMIDI Objective-Cラッパーを作ってみました。
ちょとアプリに組み込もうとして作ったものですけど。

受信したMIDIメッセージに対応したデリゲートと
送信用のメソッド組み込んでます。
自分の使いそうなのだけですけど。(つかうってもNote ON/OFF と CCくらい)

初めてGitHub使ってみたけどうまくいけてるんだろか。。。

RTCMidiLib

それにしてもiPadだとCoreMIDIでバッグはほんとやりにくい!
ビルド/デバッグのたびにMacかMIDIインターフェースにつなぎ変えないといけないし
そもそもデバッガ使えない!
プリントデバッグではなく実機でのUITextViewデバッグ!

激しく参考にさせていただいてます
Objective-Audio
http://objective-audio.jp/cat54/core-midi-mac/

Share on Facebook

MacとiPhone/iPadをWiFiルーター無しで接続

先日東京へ行ったとき、ミュージシャンの友人から
WiFiルーターの無いハコでライブするとき、
MacとiPadなどをWiFiで通信するにゃどーやって?
(iOSCやTouchOSCなど特に問題)
という素朴な疑問を投げかけられたんですが、

フツーにWiFiルーター持ち歩くのが一番手っ取り早い方法ではあるけど
実は、OSXは標準で自身がルーターになる機能もってるのです。
ほとんど使うこともないし地味すぎてあまり知られてないだけなんですが
ネット環境のない場所でMacとiPhoneを通信させるもう一つの方法であります。
アドホックというのはちょっと語弊あるかな〜?

無線LAN無し
有線LAN無し
もちろんインターネットも無し
Macを無線LANルーターとして機能させる。
こんな想定で設定してみます。

これはたとえばのネットワーク設定
Ethernet未接続
AirMacも「入」だけどどこにも繋がっていない状態
あとは、ネットワークの設定はなにもしない。(!)

つぎに、

システム環境設定の「共有」を開きます。

「インターネット共有」を選択し(まだチェックはいれないで!)
共有する接続経路を「Ethernet」
つぎにAirMacオプションを押します。

『ネットワーク名」に適当な名前を入力
これはWiFiにおけるSSIDです。WiFiサーチするときに出てくる名前
ライブ中に他の人がアクセスしてきても困りますのでWEPの設定もしておきましょう。

ここまでできたら、先ほどすっとばした、「インターネット共有」にチェックを入れます。
インターネット共有開始確認のダイアログがでるので開始してください。
これでMacはWiFiルーターとして機能します。
もちろんEthernetにはなにもつないでいないのでインターネットなどには繋がりません。
WiFiのLANのみのネットワーク構成されます。

このとき、AirMac状態をメニューバーへ表示するようになっていたらこのような扇+↑になっているはずです。

つぎにiPhone/iPad側の設定。
こちらは通常どおりのWiFi設定だけでOKなのです。
設定/ネットワークを開くと、さきほどMac側で設定したSSIDが見えるはず。
これをタップすると・

WEPのパスワードをきいてくるので入力してください。

無事接続されたら、IPを確認してみましょう。
右端の◎>をタップすると

取得したIPアドレス。
ルーターのIPアドレス。これはホスト側(Mac)のIPということです。
じつは、先に設定したインターネット共有では独自にDHCPが効くようで
クライアント側のIP設定が不要になるナイスな機能でした。

iOSCだとhost設定で↑のルーターIPを入力したり

TouchOSCもHostへルーターIPを入力してください

もちろん制御するアプリに併せてポートなども。

ほいでこれ忘れがちですが
ライブなどが終わったらインターネット共有のチェックは外してくださいませー。

————

あ、ちょっと捕捉

これEthernet無し、他のWifiルーター未接続前提でしたが
他のWiFiルーターへの接続は同居できません。
もし他のWiFiルーターへ接続済みの場合
「共有する接続経路」がAirMacとなり
「相手のコンピューターが使用するポート」にAirMacがでてこなくなります。
要はiPhone/iPadからはこのMacが見えなくなります。
まーiPhone/iPadが他のWiFiルーターへ接続すればいいんですけどね・

あと、共有するデバイスがiPhone/iPadだけではなく、有線のデバイスがある場合(Arduino+Ethershieldとか)
上の「相手のコンピューターが使用するポート」のEthernetをチェックすればおそらく大丈夫かと思います。
DHCPから取得できないデバイスなら 10.0.2.2〜255 で
他の機器とIPがバッティングしないユニークIPを手動で設定しておいてください。

Share on Facebook

iPadでGoogleカレンダー同期(複数の)

最近はGoogleカレンダー無しではいられないほど依存してるのです。
なぜかというと忘れっぽい!依頼仕事速攻で忘れるので
なにかあったら、なにか作業したらその場で即Googleカレンダーへ記録するとゆーのを
習慣づけてます。ほんとに忘れっぽいんですよねえ。。。

ちょと前まではGoogle Sync側でiPadのデバイス設定が無かったのでできなかったけど
ちょとまえから出来るようになったみたい。
やっとiPadでもカレンダー同期できるうれすい。

ちょとやりかた記録しときます。

設定のメール/連絡先/カレンダーにて「アカウントを追加…」

アカウント追加

Exchangeを選びます

Exchangeを選ぶ

Gmailアドレスと、Googleアカウント&パス、説明は適当に

gmailアカウントとgmailアドレス

証明書云々のダイアログがでたら「了解」を

了解を!

そうすると サーバ 項目がでるので「m.google.com」を入力

サーバを入力

Googleと同期するものを選んでおきます。

同期するもの選択

これで、iPad側の設定は完了
メール/カレンダーが同期するようになってますよ。

完了

Googleカレンダーが1つの場合はこれでいいのですが
複数もってたり共有しているものがあればGoogleSync側で設定を行います。

iPadのSafariで「m.google.com/sync」を入力してgoogle syncを開きます

google sync側の設定(web)

日本語では設定できないので、「言語を変更」をタップ
言語は英語で!

English(US)をタップして英語を選択

English(US)選択

デバイスでiPadをタップ

iPadを選択

ここで、同期したいカレンダーを選択します。
My Calendersは自分で作ったカレンダー
Shared Calendersは他の人が作成し、自分が共有しているカレンダー
チェックし終わったら「Save」を押します。

同期したいカレンダーを選択

この画面で設定完了です。

完了

iPadのカレンダーを見てみましょう。
これはリスト表示
月表示もいいですが、スケジュールだけを見渡せて、かつ詳細も見られる。
GoogleAppsのカレンダーよりも見やすい!これすごく気に入りました〜〜
iPadのカレンダーのリスト表示が秀逸

Gmailもプッシュで同期したので、メールが来るとiPhone(同じ設定してる)、iPadもメール受信音がピコンピコンしてしまう

Share on Facebook