« 3連休の旅行計画CakePHP 1.2 RC3リリース! »

第14回高蔵寺SE勉強会

第14回高蔵寺SE勉強会

パーマリンク 2008/10/05 23:00:00 著者: kumaold メール
カテゴリ: 仕事, 勉強会など

本日は第14回高蔵寺SE勉強会でした。

1. 宿題

前日、この宿題のために6時間近くもかけてActionScriptを習得しました。

その宿題とは・・・

◆上級者用

CakePHP+FLASH

[言語]CakePHP
[お題]
CakePHP と FLASH(ActionScript)を絡めたプログラムを作ってみよう。

今回はパンダちゃんが一緒に勉強会に来れる最終回だったので、非常に思い切った宿題にしてしまったわけです。

もちろんFlashなんぞはまともに使ってみたことがあるはずもなく、ほとんど初心者状態からの制作だったので苦労しました。


できたものはこちら。

メールのない状態
他の窓の下に隠れます。
↓メールが来ると ↑メールがなくなると

メールのある状態
最前面にでてきます。

透明部分は、その下に操作が透過されます。


またついカッとなって馬鹿なものをつくってしまったw

要は新着メール通知ソフトなのかな?


長くなりそうなので続きはこちら

厳密に言うと宿題のテーマから若干外れてますが、PHP+AIR(ActionScript)を使っています。

データの流れはPHPでPOP3でメールを拾ってきて、XMLを吐き出させます。
それをクライアント側(AIR)で拾って整形して表示してます。


PHP部分はこちら。

IMAP関数を使うには色々面倒そうだったので、PEAR::Net_POP3ライブラリを使用しています。これを使うと、簡単にメールが取り出せます。

参考: ITpro - 55. PEAR::Net_POP3を使ってPOP3サーバにアクセスしよう

<?php
//PEAR::Net_POP3ライブラリを使用
require_once('Net/POP3.php');

//データ格納用
$from = '';
$subject = '';
$body = '';
//RFC 2822 フォーマットの日付取得(Sat, 4 Oct 2008 19:26:22 +0900)
$timestamp = date("r", mktime());

//POP3アカウント情報
$account = array( 
    'host' => 'メール鯖のホスト',
    'port' => '110', 
    'username' => 'POP3ユーザ名',
    'password' => 'POP3パスワード',
);
$pop3 =& new Net_POP3();
$pop3->connect($account['host'], $account['port']);
$pop3->login($account['username'], $account['password']);
$n_msg = $pop3->numMsg();
//メールがあれば最新の1件の詳細を取得
if ($n_msg >= 1) { 
    $headers = $pop3->getParsedHeaders($n_msg); 
    $body = mb_convert_encoding($pop3->getBody($n_msg), "UTF-8", "JIS"); 
    //CR+LF(\r\n)をLF(\n)に置換
    $body = str_replace("\r\n", "\n", $body);
    $body = htmlspecialchars(trim($body));
    
    $from    = htmlspecialchars(strip_tags(mb_decode_mimeheader($headers['From'])));
    $subject = htmlspecialchars(mb_decode_mimeheader($headers['Subject']));
    $timestamp    = htmlspecialchars($headers['Date']);
    echo "メールを" . $n_msg . "件受信しました。\n";
} else {
    echo "メールがありませんでした。\n";
}
//POP3接続を切断
$pop3->disconnect();


//XMLデータを生成
$text = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$text .= '<data>' . "\n";
$text .= '    <timeStamp>' . $timestamp . '</timeStamp>' . "\n";
$text .= '    <mail id="' . $n_msg . '">' . "\n";
$text .= '        <from>' . $from . '</from>' . "\n";
$text .= '        <subject>' . $subject . '</subject>' . "\n";
$text .= '        <body>' . $body . '</body>' . "\n";
$text .= '    </mail>' . "\n";
$text .= '</data>' . "\n";

//XMLファイルを保存 (mail.xml)
if ($text) {  
    $fp = fopen('./mail.xml', 'w') or die("XMLファイルを作成できませんでした。\n");  
    fputs($fp, $text);  
    fclose($fp);  
}
?>


データ受け渡し用のXMLの内容はこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <timeStamp>Tue, 07 Oct 2008 14:42:30 +0900</timeStamp>
    <mail id="2">
        <from>********@*******.ne.jp</from>
        <subject>テストメール</subject>
        <body>メールがきたら最前面に表示

本文は、最初の4行が表示されます。</body>
    </mail>
</data>


肝心のAIRのスクリプト部分@Flash CS3 Pro

stop();//自動再生の停止

//パッケージ化された外部クラスファイルの読み込み
import flash.events.MouseEvent;
import flash.display.NativeWindow;
import flash.utils.Timer;


//マウスクリック時のイベント監視
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMoveCommand);
stage.doubleClickEnabled = true;
stage.addEventListener(MouseEvent.DOUBLE_CLICK, onCloseCommand);
//ドラッグされたら移動
function onMoveCommand(event:MouseEvent) {
    stage.nativeWindow.startMove();
}
//ダブルクリックされたら終了
function onCloseCommand(event:MouseEvent) {
    stage.nativeWindow.close();
}


//30秒間隔でXML監視用タイマー
var timer:Timer = new Timer(30000);
timer.start();
timer.addEventListener(TimerEvent.TIMER, mailCheck);


//XML格納用グローバル変数
var xml:XML;


//メールチェック処理はPHPに放り投げる
function mailCheck(event:TimerEvent) {
    //PHPにその都度リクエスト
    var request:URLRequest = new URLRequest("PHPファイルのURL or パス");
    var loader:URLLoader = new URLLoader();
    //ダミー処理完了後にXMLを読みにいく
    loader.addEventListener(Event.COMPLETE, loadXML);
    loader.load(request);
}

function loadXML(event:Event):void {
    //読み込むXMLのアドレス情報を作成
    var request:URLRequest = new URLRequest("XMLファイルのURL or パス");
    var loader:URLLoader = new URLLoader();
    //読み込み完了後の処理を作成
    loader.addEventListener(Event.COMPLETE, dataLoaded);
    loader.load(request);
}

//XMLの取得ができたら
function dataLoaded(event:Event):void {
    //XMLクラスのコンストラクタ関数でXMLパース
    xml = new XML(event.target.data);

    //メール件数取得
    var Count:Number = Number(xml.mail.@id);

    //メール件数が1件以上あれば新着通知
    if (Count >= 1) {
        newMail(Count);
    } else {
        mailWaiting();
    }
}

//新着メール通知
function newMail(Count:Number):void {
    //最前面に表示を有効
    stage.nativeWindow.alwaysInFront = true;

    message.text = "新着メールあり!";
    message.textColor = 0xff0000;
    mailFrom.text = "From: " + String(xml.mail.from);
    mailSubject.text = "Subject: " + String(xml.mail.subject);
    mailBody.text = String(xml.mail.body);
    //メール件数が2以上のとき
    if (Count >= 2) {
        mailCount.text = "この他に"+String(Count - 1)+"通のメールがあります。";
    }
}

//待機状態に復帰
function mailWaiting():void {
    //最前面に表示を無効
    stage.nativeWindow.alwaysInFront = false;

    message.text = "メールチェック中…";
    message.textColor = 0x0066ff;
    mailFrom.text = "";
    mailSubject.text = "";
    mailBody.text = "";
    mailCount.text = "";
}


本当はcronでメールチェックのPHPを回そうかと思っていましたが、常時リソースを食うのは好きではなかったので逐次アクセス方式に変更。

あと、生成されるXMLファイルにはアクセス制限をかけときましょう。


結局時間もなかったので中途半端な出来になってしまったので、誰かAIRの出来る方で適当に改良してもらえれば、と思います。

.flaファイル置いときます: AIR-Mail.fla


2. 発表
ストレスフリーな生活を♪LifeHackをあれこれ試してみよう by あつさん

普段の些細なことでも仕事をやる上での効率とか気分を少しでもよくできるんだなぁと思いました。 これからはその辺にも意識をしていきたいです。

実行速度向上 in PHP by kuma

即席で作ったので資料の用意ができてないですが、処理速度はこんな感じです。(左の方が速い)
ループ:    do-while() < while() <= for()
ループ数字: $i--; <<< $i++;
文字列連結: .連結 < "{$str}" = .=連結 <<< "$str"
配列処理:  foreach() <<< for(), while()

 

3. コードリーディング

今回は、前の時に話題になったBakeSaleというCakePHPで作られたショッピングサイトのベース部分?を読みました。

なんかコントローラとかビューとかを見ても本当に中身がなくて、究極のモジュール化がされているような印象でした。

ここまでくるともはや全体の流れを追うのも難しいです。

参考になったような、ならなかったような。

 

勉強会後

今回は特別に、パンダちゃんのお別れ会とおみうの二十歳の誕生日を兼ねて料理の盛大な?パーティーを行いました。

半年ばかりでしたが、色々とお世話になりました。

自分は早生まれなんで誕生日が2月27日というまだ半年先ですよ。
(そのために免許取るのが苦労した・・・)

まだ二十歳までまだ1年半もあるし。公に酒が飲めるっていいなぁ。



はじめてのAdobe AIRプログラミング―Webアプリ技術でデスクトップアプリを作る! (I/O BOOKS)はじめてのAdobe AIRプログラミング―Webアプリ技術でデスクトップアプリを作る! (I/O BOOKS)
ZAPA

工学社 2008-06-21
売り上げランキング : 17845

Amazonで詳しく見る
type="text/javascript" src="http://www.ad16.jp/socailmedia.php?a=CCBot%2F2.0+%28http%3A%2F%2Fcommoncrawl.org%2Ffaq%2F%29&u=http%3A%2F%2Fkuroutoshikou.blog16.jp%2Findex.php%2F2008%2F10%2F05%2Fcnn14a_el_e_mamosea_afmaf" charset="EUC-JP">

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年3月
 << <   > >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

検索

XMLフィード

16ブログ     blog tool