Labs

<< 最初 < 前ページ 次ページ > 最後 >>
icon 2010/02/25 Twitter & mixi API クラス分離
かなり煩雑なコードになってきたので、クラス化と言う名のリファクタリング。
意地でもPEARや他のライブラリは使わないぞw

■修正内容 VoiceService ver0.2
(1) MixiVoice、Twitterクラス化・ファイル整理

VoiceService
|
getVoices()
|
MixiVoice --> HTTPService
Twitter --> HTTPService



(2) HTTPサービスクラス「HTTPService」作成
「HTTPRequestService」の命名の方が正しいかも!?

(3) 同時投稿機能追加
とり合えず最低限の実装
・Twitterは、Basic認証でなくてtokenにするのが今後の課題
・Mixiは、htmlパースとログイン処理が課題

■VoiceService(抜粋)
ファイル分離して非常にわかりやすくなったv(^_^)v
    /**
     * mixi & Twitterボイス取得
     **/
    public function getVoices()
    {
        $mixi_voice = new MixiVoice();
        $voices['mixi'] = $mixi_voice->getVoices();

        $twitter = new Twitter();
        $voices['twitter'] = $twitter->getUserTimeline();

        $results = $this->_marge_voices($voices);
        dump($results);
        return $results;
    }

    /**
     * mixi & Twitterボイス同時投稿
     **/
    public function postVoice($values)
    {
        if ($values->message && $values->password == VOICE_PASSWORD) {
            $mixi_voice = new MixiVoice();
            $is_mixi = $mixi_voice->postMessage($values->message);

            $twitter = new Twitter();
            $is_twitter = $twitter->postMessage($values->message);

            return ($is_mixi && $is_twitter);
        }
    }
※「$this->_marge_voices($voices)」は、MixiVoiceとTwitterデータをマージしてJSON化してる

■MixiVoice(抜粋)
「HTTPService->request」を実装して、paramsをオブジェクトで渡すようにした。
とりあえず、こんなもんかな?

    /**
     * mixiボイス取得
     **/
    public function getVoices()
    {
        $this->login();

        $params->url = MIXI_ECHO_LIST_URL;
        $params->method = 'POST';

        $html = $this->request($params);
        $results = $this->parseVoice($html);
        return json_encode($results);
    }

■Twitter(抜粋)
このクラス名だと、また膨大になりそうな予感だけど。。。
これもパラメータをオブジェクトで渡すようにした。

    /**
     * Twitter投稿
     **/
    public function postMessage($message)
    {
        if (!$message) return;

        $posts['status'] = $message;

        $params->posts = $posts;
        $params->url = TWITTER_UPDATE_JSON_URL;
        $params->basic->id = TWITTER_USER_NAME;
        $params->basic->password = TWITTER_PASS;

        $results = $this->curlRequest($params);
        return $results;
    }

■HTTPService(抜粋)
これが肝のクラス。
なので、頭が整理できてなずサッパリ(T_T)

cokkie処理やBasic認証が両立できなくて、とりあえず「curl」と「file_get_contents」の併用です。

▽各メリット
・curl:細かいことができそうで速い
・file_get_contents:ソースが短くできそう

最終的にはcurlで統一するかな?

    /**
     * HTTPリクエスト(curl)
     **/
    public function curlRequest($params)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $params->url);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        //POST
        if ($params->posts) {
            $posts = http_build_query($params->posts, '', '&');
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
        }

        //cookies
        //TODO 
        //curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");

        //BASIC認証
        if ($params->basic) {
            curl_setopt($ch, CURLOPT_USERPWD, "{$params->basic->id}:{$params->basic->password}");
            dump($params->basic);
        }
        $results = curl_exec($ch);
        curl_close($ch);
        return $results;
    }

    /**
     * HTTPリクエスト(file_get_contents)
     **/
    public function request($params) {
        $headers[] = 'Content-Type: application/x-www-form-urlencoded';

        if (is_array($params->posts)) {
            $content = http_build_query($params->posts, '', '&');
            $content_length = strlen($content);
            $headers[] = "Content-Length: {$content_length}";
            $requests['http']['content'] = $content;
        }

        //Basic認証
        if ($params->basic) {
            $basic = base64_encode("{$params->basic->id}:{$params->basic->password}");
            $header[] = "Authorization: Basic ".$basic;
        }

        //cokkie
        //TODO paramsかセッションにする?
        if ($this->cookie) {
            $headers[] = "Cookie: {$this->cookie}";
        }

        if ($params->method) {
            $method = $params->method;
        } else {
            $method = 'GET';
        }
        $requests['http']['method'] = $method;
        $requests['http']['header'] = implode("\r\n", $headers);

        $context = stream_context_create($requests);
        $contents = file_get_contents($params->url, false, $context);

        //cookie取得・設定
        if ($http_response_header) {
            $this->setCookieForHttpResponseHeader($http_response_header);
        }
        return $contents;
    }
※「$this->setCookieForHttpResponseHeader」は、HTTPヘッダーをパース
icon 2010/02/24 Androido -勉強本購入-
FlashのhtmlTextの機能、何とかならんかね~>Adobe
せめて画像の回り込みぐらい(T_T)

さて、Androido本を買ってみた(もち会社経費でw)。

「Google Androidプログラミング入門 (大型本)」

豆蔵社員が作ってて、本質的な基礎部分に触れていて結構わかりやすいと思う。

出版不況とは言えども、こう言う専門書籍とかは手に持ってみたい感じがする。


ざっと見た感じ、

(1) ファイル構成
(2) Actibity、イベント
(3) Intentによるデータ管理

この辺の概念を抑えればとり合えずアプリは作れそうだ。
サンプルアプリ作ってみたけど、結構わかりやすいと思う。

とは言っても、コンポーネントやサービスが膨大っぽいし、実機を持ってないからなぁ・・・。
なんかAndroidの実機が欲しくなってきたこの頃(^^)

■個人的感想
・Javaベースなので入りやすい
→iPhone SDKみたく「Objective-C」覚えなくて良い

・思想がMVCっぽくて、階層がわかりやすい
→人によって作り方が大きく変わることがない感じ
 これは重要

・XMLの定義は、FlexのMXMLと基本概念は同じ
→UIベースで定義できるのでスピーディー
 ただ、第一印象では機能的に物足りない感(機能を知らないだけかも知れんが)

・データバインディングが面倒くさい感
 →ソースベースでしかできないのかな?
 「WebObjects」や「iPhone SDK」のInterfaceBuilder機能が搭載されれば、かなりスピーディーになると思う

・「自動ビルド」に設定しておくと、ビルドエラーが多発
 →原因調べないと・・・

・イベント監視が面倒くさそう
 →モバイルフォンだから仕方ないが・・・

icon 2010/02/18 Androido -はじめ-

何か勉強してる時間がない。。。
と言い訳はしたくないから、無理にでもやるw

まずは環境整備から。
「Android SDK + Eclipse ADT」で構築してみる。

とりあえず、「Android Developers」を見ながらインストール。
ちょうど「Android 2.1 API Level 7」がリリースされてた。
そもそも、Ver1.xから何が違うのかすらわからない状態だが(笑)

基本は、
(1) SDKのパスとおして
(2) Eclipse Plugin入れて
(3) EclipseでSDK Componentsをインストール

自宅はMac、会社ではWindows版を。


自分メモ
■SDK
(1) ダウンロード
android-sdk_r04-windows.zip

(2) インストール先はC直下にした。
C:\air2_b1_sdk_win_111709

(3) toolsへのPath追加
C:\android-sdk-windows\tools

■ADT Plugin for Eclipse
- 設定マニュアル
http://developer.android.com/sdk/eclipse-adt.html

(1) Eclipse 3.4 (Ganymede)なので、以下のインストールURL
https://dl-ssl.google.com/android/eclipse/

(2) ウィンドウ > 設定 > Androido
(3) SDKロケーション設定して【適用】

C:\android-sdk-windows

この時点で、パッケージはインストールされてなかったので、

(4) ウィンドウ > Android SDK and AVD Manager > Avalible Pakages
(5) パッケージを選択して【Install Selected】
ちょい時間がかかる。
全部入れる必要はなかったかな?w
(6) Virtual Devicesもとり合えず設定

■動作確認でプロジェクト作成
基本は通常のプロジェクト作成と同じ

(1) ファイル > 新規 > Androidプロジェクト
(2) 各項目設定
- BuildTarget:とり合えず最新の2.1(API Level7)を選択
- アプリケーション名:Hello
- パッケージ:jp.co.telepath(任意)
- Create Activity:Activityを継承するクラス名
※Activity = Androidアプリ画面
Androidアプリ作成の基本“Activity”とは何か?

(3)【完了】

で、ここでBuildエラーw
Eclipseで自動ビルドにしておくと、genがうまく作成されないらしい(ホント?)
なんで、

■genのクリーンアップ
(1)「自動的にビルド」のチェック外す
(2) genディレクトリ削除
(3) プロジェクト > クリーン
一応、コンパイルされた。

■確認
(1) HelloWorld的なw
 package jp.co.telepath;

 import android.app.Activity;
 import android.os.Bundle;
 import android.widget.TextView;

 public class Hello extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("OKOKOK");
        setContentView(tv);
    }

 }

onCreateはイベントハンドラっぽいな。
Activityの状態遷移に記載されてるのが全てなのかな?
何かイベント管理が大変そうだけど。。。
その前にActivityクラス等のソース見れるようにしないとw

(2) 実行
バーチャル携帯の起動遅い・・・結構ストレスかもw

てな訳で次は、まずAndoroidの基礎知識から!

<< 最初 < 前ページ 次ページ > 最後 >>

このサイトについて

HTML5 & CSS3化しつつあるので、現在IEには対応してません。
できれば、Google Chromeやら Apple SafariのWebKit系をお勧めします。

DBからプログラムまで一応全て自作なので、バグってたらすいません。
実験でFlash版(Flex版)を先に作りましたが、ちょっと停止してます。

プロフィール

新宿近辺でSE & プログラマーしてます。
Webアプリの開発・設計とか、最近はiPhoneとか奮闘してます。
デザインはさっぱりです。

音楽は、昔からCubase打ち込み人間で、そっちの方が経歴は長いですが、最近はやる暇がないです。。。

今は、Gon's Privates ってバンドのキーボードやってます。
単発的に、なんちゃってジャズ系のライブもやってます。

名古屋生まれなのでドラゴンズ好きです。

Info && SNS

Gmail

 yohei.yoshikawa@gmail.com

Twitter

 http://twitter.com/yoo_yoo_yoo

あんまつぶやきませんが、一応技術系メインで使ってます。情報交換はこちらへ

FaceBook

 http://www.facebook.com/#!/profile.php?id=1439130626

海外の知り合いがいないので閑散としてます。

mixi

 http://mixi.jp/show_profile.pl?id=230072

音楽仲間とかはこっちメインでやってます。興味があればこちらへ