2010年10月27日水曜日

[memo] 携帯版クロネコヤマト情報漏洩事件

iPhoneで他人の情報…携帯ID認証に穴(読売オンライン)の記事では,あたかもiPhone固有の問題のように取り上げられているが,ヤマト運輸のニュースリリースによると,今回のトラブルは,携帯版のWebサービスにスマートフォン(の特定のアプリケーション)から(クイックログイン機能を用いて)接続した際に,正しく認証が行えなかったとある為,今回の問題はクライアント側ではなくサーバ側の認証部分の作り込みの問題だと思われる.


一般的な携帯電話向けWebサイトにおける(ログインの際にユーザー名とパスワードの組み合わせを求めない)簡単ログインの実装は,本人認証を携帯電話のハードウェアと結びつけられた固有の個体識別番号を用いて行う.
これにより,初期登録時にユーザー名と個体認識番号が結びつけられていれば,次回以降はユーザーに対して都度ユーザー名とパスワードの入力を求めなることなく,個体認識番号の確認をもって本人だとみなす事が出来る.

しかし,この個体認識番号=本人が通用するのは,個体認識番号がネットワーク上で唯一のものだと信頼できる場合のみである.
この個体認識番号が唯一のものであるという常識が通用するのは,携帯電話の接続するネットワークがクローズドであり,かつ接続する他の携帯電話も同様に改変不可能な個体認識番号を持つ場合のみである.

例えばPCからこのネットワークに接続することが可能であれば,個体認識番号のなりますましを行う事は容易である.
つまり個体認識番号による本人認証のシステムは,ネットワーク上にはキャリアの管理下にある端末しか存在しない=個体認識番号は重複しない,という前提に立っているものだと言うことが分かる.


また,昨今普及しつつあるスマートフォンには,上記個体認識番号と同列に扱うことが可能なIDは存在しない.
しかしながら,スマートフォンではPCのように多種多様なアプリケーションを動作させる事が可能となっており,例えばiPhone向けアプリケーションであるSBrowerは,本来iPhoneには実装されていない個体認識番号を内部で自動的に生成し,それを用いてあたかも日本国内向けに販売されている携帯電話を模して接続を行う.
これにより,個体認識番号が実装されていることを前提に構築されている多数の携帯向けWebに接続し,サービスを受けることが可能となっている(なってしまっている).

今回問題となっている携帯版「クロネコメンバーズのWebサービス」のクイックログイン機能は,個体認識番号の存在が前提となっているため,iPhoneから通常のブラウザを用いてクイックログイン機能を利用する事は出来ない.しかしながら上記アプリケーションを用いることで,擬似的に個体認識番号を利用することが出来,結果としてクイックログイン機能の利用が可能となっている.
しかし,個体認識番号を生成する部分に問題があり,同一の個体認識番号が生成される可能性がある
つまり,同一の個体認識番号が生成されたSBrowerのユーザーの中で,最初にユーザー情報と個体認識番号を結びつけた人のデータが,後から同一の個体認識番号を持つSBrowerを利用して接続したユーザーに漏洩してしまう可能性を排除できない.

これを,同一の個体認識番号を生成してしまうアプリケーションの問題ととらえたり,このような危険性を内包する非正規のアプリケーションを利用するユーザーの問題ととらえることも可能だが,今回は商用サイトという事もあり,サービス主管であるヤマト運輸側の問題であると思われる.
なぜならば,個人の認証というsensibleな問題を,一般のアプリケーション開発者やユーザーに被せるのは見当違いで,やはりサービスを提供する側が責任を持って正しく認証できるようにするべきである.


今後は,携帯向けWebサイトであったとしても個体認識番号を用いた簡易な実装とせず,通常のPC向けWebサイトと同様にcookieやサーバ側で用意したセッションIDを用いる必要があると言うことである.

[memo] Adobe MAX 2010

10/25よりL.A.にてAdobe MAX 2010が開催されている.
今回の話題の中心はWebサイト,電子出版,ビデオ,エンタープライズアプリケーション,ゲームといったマルチスクリーン戦略についてである.
具体的には,
  • 電子出版をサポートする「Adobe Digital Publishing Suite
  • Google TVでも採用され,ストリーミング動画の再生やWebブラウザ内からのGPUハードウェアアクセラレーション(動画再生支援)にも対応した「Flash Player」
  • TVの中でAIRアプリケーションを利用する為の 「AIR for TV」
  • 従来のコンポーネントやスキンをタッチスクリーン上でもそのまま利用可能「Flex 4.5」
  • BlackBerry社の新しいタブレット端末PlayBook向けのAIRアプリケーション開発ツール「BlackBerry PlayBook Developer Kit」
  • Android端末上でのAIRアプリの実行環境「AIR for Android」
  • PCだけではなく,テレビやタブレット,スマートフォンにも対応した「Adobe AIR 2.5
  • 様々なデバイスで利用できるアプリケーションを,各デバイス向けに提供されているアプリのストア内で配布/販売可能となる「Adobe InMarket
といった技術を統合して,Flashをベースとしたプラットフォームを強固にしていくとの事.他プラットフォームの戦略等とあわせて今後に注視したい.


また,「Adobe AIR 2.5」は H.264動画のGPU支援再生に対応している.上記の「AIR for Android」の3Dハードウェアアクセラレーション対応とあわせて,従来の「Flashは動作が重い」への批判に対する解答であると思われる.
ただしハードウェアアクセラレーションは, 対象とする機種やプラットフォームの構成に大きく左右される.そのためFlashのメリットの一つである,多数のプラットフォームへのフラットな対応が後退する可能性も含む.
例えば特定機種のみハードウェアアクセラレーションに対応し,その他機種はソフトウェアレンダリング対応となった場合,開発者は個別に対応せざるを得ず,結果として従来の利点であった複数デバイスへの対応の利点が薄れてしまう.

ちなみに,10/7のAdobeがMicrosoftに買収されるかもしれないというNew York Timesの報道に対して,AdobeのCEOは「同社は独立して成長していくことを目指す」と語ったとか.Adobe+Microsoftは面白い組み合わせだけに残念:-P

2010年10月21日木曜日

[SA-3-12] JavascriptからMySQLに接続

fig. 1


1.index.html, xmlhttp.js, backend.phpを,/var/www/html/ajaxに配置
index.html : ベースファイル
xmlhttp.js : フォームに入力された文字列を,リアルタイムにbackend.phpに渡し,結果を受け取る
backend.php : DBに接続し,結果をXMLとして出力

2.backend.phpに実行権限を付与(chmod 755 backend.php)

3.以下のアドレスにアクセスし,表示される項目を確認
(A)AJAXを利用し,表示項目を動的に絞り込み
http://[サーバのアドレス]/ajax/index.html
(B)MySQLから受け取ったデータをXML形式で表示
http://[サーバのアドレス]/ajax/backend.php?host_name=sa01

index.html
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
 <title>server_list search result</title>
 
 <STYLE TYPE="text/css">
 <!--
 .table1 {
  width: 400px;
  border-collapse: collapse;
  border: 1px #708090 solid;
 }
 .table1 TD {
  border: 1px #708090 solid;
 }
 -->
 </STYLE> 
 
    <script type="text/javascript" src="xmlhttp.js"></script>
    <script type="text/javascript">
    <!--
    findText = findTextOld = "";

    function loadXmlFile(fName){
        httpObj = createXMLHttpRequest(displayData);
        if (httpObj){
            httpObj.open("GET",fName,true);
            httpObj.send(null);
        }
    }

    function displayData(){
        if ((httpObj.readyState == 4) && (httpObj.status == 200)){
            xmlData = httpObj.responseXML;
            $("result").innerHTML = parseXmlData(httpObj.responseText);
        }else{
            $("result").innerHTML = "Loading ...";
        }
    }

    function parseXmlData(xmlData){
        $("result").innerHTML = xmlData;
        idListTags = document.getElementsByTagName("id");
        numListTags = document.getElementsByTagName("num");
        host_nameListTags = document.getElementsByTagName("host_name");
        ip_addressListTags = document.getElementsByTagName("ip_address");
        idLen = idListTags.length;

        resultText = "<table class='table1'><tr><th colspan=4>server_list search result</th></tr><tr><td><b>id</b></td><td><b>num</b></td><td><b>host_name</b></td><td><b>ip_address</b></td></tr>";
        for(i=0; i<idLen; i++){
            id = idListTags[i].childNodes[0].nodeValue;
            num = numListTags[i].childNodes[0].nodeValue;
            host_name = host_nameListTags[i].childNodes[0].nodeValue;
            ip_address = ip_addressListTags[i].childNodes[0].nodeValue;
            str = host_name.match(findText);
            if (str){
                resultText += "<tr><td>" + id + "</td><td>" + num + "</td><td>" + host_name + "</td><td><a href='http://" + ip_address + "' target='_blank'>" + ip_address + "</a></td></tr>";
            }
        }
        resultText += "</table>";
        return resultText;
    }

    function inputCheck(){
        findText = document.ajaxForm.requestText.value;
        if (findText != findTextOld) {
            str_search = "./backend.php?host_name=" + findText
            loadXmlFile(str_search);
            findTextOld = findText;
        }else{
//            $("result").innerHTML = "Loading ...";
        }
        setTimeout(" inputCheck()",500); // 0.5秒毎
    }

    window.onload = inputCheck;
    // -->
    </script>
</head>
<body>
<form name="ajaxForm" onSubmit="return false">
<input type="text" value="sa00" name="requestText">
</form>
<div id="result"></div>
</body>
</html>

xmlhttp.js
// HTTP通信用、共通関数
function createXMLHttpRequest(cbFunc){
 var XMLhttpObject = null;
 try{
  XMLhttpObject = new XMLHttpRequest();
 }catch(e){
  try{
   XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
   try{
    XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
   }catch(e){
    return null;
   }
  }
 }
 if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;
 return XMLhttpObject;
}
 
// document.getElementById
function $(tagId){
 return document.getElementById(tagId);
}

backend.php
<?php
 $db_user  = "[user name]";
 $db_password = "[password]";
 $db_name = "[database name]";
 $db_host  = "localhost";

//create xml
    header('Content-type: text/xml; charset=utf-8');
    echo '<?xml version="1.0"?><sa>';

 $host_name = null;

 if(isset($_GET['host_name'])) {
  $host_name = $_GET['host_name'];

  $con = mysql_connect($db_host,$db_user,$db_password) or die("error!");
  mysql_select_db($db_name,$con) or die("DB is not exist");
  $strsql = "SET CHARACTER SET UTF8";
  mysql_query($strsql,$con);
  $strsql = "SELECT id, num, host_name, ip_address FROM server_list WHERE host_name LIKE '%".$host_name."%';";
  $res = mysql_query($strsql,$con);

  while ($item = mysql_fetch_array($res)) {
   print "<server_list><id>".$item[0]."</id><num>".$item[1]."</num><host_name>".$item[2]."</host_name><ip_address>".$item[3]."</ip_address></server_list>";
  }
  mysql_close($con);
    }

    echo '</sa>'; 
?>

[卒業研究] システム構成図

fig.1 システム構成図

[卒業研究] サーバ構成案

卒業研究用サーバの構成について,いくつか候補を挙げてみます.
(可能であれば 同構成のサーバを2台用意して,開発時には本番環境と開発環境で分けて作業を進め,リリース後は開発環境をコールドスタンバイ機とする)

1. サーバ
(1-1)HP ProLiant MicroServer \35,700
http://h50146.www5.hp.com/products/servers/proliant/micro/index.html
※CPUは非力ながら,RAIDが標準で組める!コンパクトな筐体ながら,大口径FAN使用で静音!!ただしHDDが1つなので,もう1つ追加してミラーリングしたい所.
リンク1リンク2, システム構成案(PDF)

(1-2)HP ProLiant ML110 G5 \11,280(\3,300割引クーポン使用で\7,980)
http://h50146.www5.hp.com/products/old/servers/proliant/ml110g5/
http://nttxstore.jp/_II_HP13207801
※とにかく安い!!

(1-3)NEC Express5800/GT110b \16,800(\2,000割引クーポン使用で\14,800)
http://www.nec.co.jp/products/pcserver/g/gt110b/index.shtml
http://nttxstore.jp/_II_P813280396
※一昔前に格安サーバで有名だった機種.

2.OS
(2-1)CentOS \Free
http://www.centos.org/

(2-2)Red Hat Enterprise Linux(RHEL) ライセンス\Free(サポートは有料)
http://www.jp.redhat.com/rhel/

(2-3)Microsoft Windows Server 2008 R2 Standard Edition (5CAL) アカデミック版 ¥57,775
http://www.coneco.net/PriceList/1091014006/order/MONEY/

3.無停電電源装置(UPS)
(3-1)APC ES 550 BE550G-JP ¥8,663
http://www.apc.com/products/resource/include/techspec_index.cfm?base_sku=BE550G-JP&total_watts=200
http://kakaku.com/item/K0000107355/spec/

(3-2)APC RS 550 BR550G-JP ¥13,511
http://www.apc.com/products/resource/include/techspec_index.cfm?base_sku=BR550G-JP&total_watts=200
http://kakaku.com/item/K0000056754/

(3-3)オムロン BY50S ¥16,481
http://www.omron.co.jp/ped-j/dengen/product/ups/by35-50s/by35-50s.html
http://kakaku.com/item/K0000066780/spec/

※OSとの連携機能(自動シャットダウン等)を確認する必要有り.

4.モニター
(4-1)なし \0
※コスト削減の為,既存モニターを利用する.

(4-2)HP 1910m 18.5インチワイド液晶モニター \10,500
http://h50146.www5.hp.com/products/desktops/personal/monitors/1910m/

(4-3)Dell IN1920 18.5 インチ HD ワイドスクリーンフラットパネルモニタ \10,500
http://www1.jp.dell.com/content/products/compare.aspx/19_20lcd?c=jp&cs=jpdhs1&l=ja&s=dhs

※本来ならサーバ用途の場合,16:9のワイド画面ではなく従来からの4:3の方がベター(縦方向の課解像度が高ければ,表示できる行数が増えるため)だが,現状では価格の問題でワイド画面を選択せざるを得ない状況です.

5.作業用(閲覧用)端末
ノートPC?

2010年10月20日水曜日

[memo] Google AJAX Feed APIでクロスドメイン制約を回避

PHP等で外部ドメインのAtomフィードやRSSフィードを収集し,Flashを設置するサーバに格納する事が出来れば,クロスドメイン制約を回避することが可能ですが,自前のサーバが利用できる環境がない場合,このような方法をとることが出来ません.
そこで,自前でサーバを用意する必要のないGoogle AJAX Feed APIを利用すれば,クロスドメイン制約を回避することが可能となります.
※商用利用等では問題はありますが...

Google AJAX Feed API登録画面
http://code.google.com/intl/ja/apis/ajaxfeeds/signup.html



Now Loading ...

javascript
<script type="text/javascript" src="http://www.google.com/jsapi?key=(APIキー)"></script>

<script type="text/javascript">
google.load("feeds", "1");
function initialize() {
    var feed = new google.feeds.Feed("http://www.kccollege.ac.jp/news/feed.xml");
    feed.setNumEntries(5);
    feed.load(function(result) {
  var html;
  // 読み込みに成功したときの処理
  if (!result.error) {
   // サイトのタイトルを出力
   html = '<h1>
<a href="' + result.feed.link + '">' + result.feed.title + '</a></h1>';
   // 各記事の情報を順に出力
   if (result.feed.entries.length) {
    html += '<ul>';
    for (var i = 0; i < result.feed.entries.length; i++) {
     // 各記事のタイトルと概要を出力
     var entry = result.feed.entries[i];
     html += '<li><a href="' + entry.link + '">' + entry.title + '</a>';
     html += '<span class="content">' + entry.contentSnippet + '</span></li>';
    }
    html += '</ul>';
   }
  }
  // 読み込みエラー時の処理
  else {
   html = '<p>Error</p>';
  }
  // 読み込み結果を、idが「feed」の要素に流し込む
  var container = document.getElementById("feed");
  container.innerHTML = html;
    });
}
google.setOnLoadCallback(initialize);
</script>

<div id="feed"><p>Now Loading ...</p></div>


ちなみに,Google AJAX Feed APIはJavascriptからだけではなく,URLに引数を付ける形で利用することも出来ます.
以下は,XML形式で10件のデータを取得する場合の例になります.
http://ajax.googleapis.com/ajax/services/feed/load?q=http%3A%2F%2Fwww.kccollege.ac.jp%2Fnews%2Ffeed.xml&v=1.0&num=10&output=xml

[memo] 最新スマートフォン・スペック比較3

日本未導入の最新のスマートフォンのスペックを比較する.
特にWindows Phone 7はいずれ国内でもリリースされる可能性があります.
機種名Palm Pre 2Windows Phone 7 (*1)

メーカーHPMicrosoft

OSwebOS 2.0Windows Phone 7

CPU1GH 1GHz Qualcomm MSM8250

画面サイズ3.1インチ3.5-4.3インチ

解像度320x480480 x 800

RAM512MB512MB
(ROM:576MB)


本体メモリ16GB8-16GB

外部メモリ



大きさ100x60x17mm


質量145g


カメラ500万画素


インカメラ×


GPS


電子コンパス


赤外線×


ワンセグ×


Felica×


無線LANIEEE802.11b/g


BluetoothBluetooth 2.1


高速データ通信CDMA


連続待受時間約350時間(CDMA)


連続通話時間約5.5時間(CDMA)


バッテリー



充電/外部端子microUSB


FLASH10.1 beta10.1

発売時期



(*1)Windows Phone 7は単一機種ではなく,同一の仕様で複数のメーカーからリリースされています.

[memo] 最新スマートフォン・スペック比較2

auの2010年秋冬モデル/2011年春モデルのAndroidスマートフォン4機種を比較する.
OSのバージョンが異なることから,対応するFlashのバージョンが異なることに注意が必要です.
またauは,あわせてSkypeとの連携も発表している.

機種名IS03REGZA Phone IS04IS05 (*1)SIRIUS α IS06
メーカーSHARP富士通東芝モバイルコミュニケーションズSHARPPantech
OSAndroid2.1Android2.1Android2.2Android2.2
CPUSnapdragon QSD8650 1GHz


画面サイズ3.5インチ4インチ3.4インチ3.7インチ
解像度640x960480×854480×854480×800
RAM512MB


本体メモリ



外部メモリ



大きさ63×121×12.662×126×1255×112×1460×116×11
質量138g149g132g109g
カメラ約957万画素約1219万画素約800万画素
インカメラ
GPS
電子コンパス



赤外線
ワンセグ
Felica×
無線LANIEEE802.11b/g
IEEE802.11b/gIEEE802.11b/g
Bluetooth2.1+EDR
2.1+EDR2.1+EDR
高速データ通信CDMA 1X EV-DO Rev.ACDMA 1X EV-DO マルチキャリアRev.A WIN HIGH SPEED (下り最大9.2Mbps/上り最大5.5Mbps)
CDMA 1x EV-DO マルチキャリアRev.A (CDMA 1X WIN)
連続待受時間約200時間約300時間
約190時間
連続通話時間約230分約310分
約300分
バッテリー



充電/外部端子



FLASHFlash Lite 4.0Flash Lite 4.010.110.1
発売時期11月下旬以降2011年春


(*1)IS05はdocomoからSH-03Cとしてリリースされるかもしれません...

[MA-9-8] おみくじ付き携帯待ち受け画面 パラメーター調整 (FlashLite2.0/ActionScript2.0)



ma9_8.swf

「占う」ボタンのトグル動作,表示される運勢の頻度調整を追加.

ActionScript2.0(Flash Lite2.0)
buttonFlag = 0;

this.onEnterFrame = function() {
 //バッテリーレベル
 var batteryCharging = fscommand2("GetPowerSource");
 var batteryLevel = fscommand2("GetBatteryLevel");
 var maxBattery = fscommand2("GetMaxBatteryLevel");
 var batteryStatusNum = 0;
 if (batteryCharging) {
  batteryStatusNum = 10;
 } else {
  if (maxBattery == 3) {
   batteryStatusNum = batteryLevel;
  } else if (maxBattery == 100) {
   if (batteryLevel>80) {
    batteryStatusNum = 8;
   } else if (batteryLevel>60) {
    batteryStatusNum = 7;
   } else if (batteryLevel>40) {
    batteryStatusNum = 6;
   } else if (batteryLevel>20) {
    batteryStatusNum = 5;
   } else if (batteryLevel>0) {
    batteryStatusNum = 4;
   }
  }
 }
 batteryStatusNumStr.text = batteryStatusNum;
 batteryPict.gotoAndStop(batteryStatusNum + 1);
 stop();
 _global.BSN = batteryStatusNum;
 //受信レベル
 var signalLevel = fscommand2("GetSignalLevel");
 var maxSignal = fscommand2("GetMaxSignalLevel");
 var signalNum = 0;
 if (maxSignal == 4) {
  signalNum = signalLevel;
 } else if (maxSignal == 3) {
  if (signalLevel>0) {
   signalNum = signalLevel+1;
  }
 }
 signalNumStr.text = signalNum;
 antennaPict.gotoAndStop(signalNum + 1);
 stop();
 _global.SN = signalNum;
 //開閉回数
 var mySharedObject:SharedObject = SharedObject.getLocal("open");
 SharedObject.addListener("open", initHandler);
 mySharedObject.data.count = 0;
 mySharedObject.flush();
 function initHandler() {
  var date:Number = Number(mySharedObject.data.count);
  date++;
  mySharedObject.data.count = date;
  mySharedObject.flush();
  checkNumStr.text = mySharedObject.data.count;
 }
 if (buttonFlag == 0) {
  fortunePict.gotoAndStop(11);
  stop();
 }
};

fortuneButton.onRelease = function() {
 if (buttonFlag == 0) {
  fortunePict.play();
  buttonFlag = 1;
 } else if (buttonFlag == 2) {
  fortunePict.play();
  fortuneStr.text = "";
  buttonFlag = 1;
 } else {
  fortuneArray = ["大吉", "大吉", "吉", "半吉", "小吉", "末小吉", "末吉", "凶", "凶", "凶"]; 
  fortuneNum = Math.floor(Math.random() * 9) + 1;
  //バッテリーの状況によって運勢変化
  switch (_global.BSN) {
   case (0) :
    fortuneNum = fortuneNum + 2;
    break;
   case (1) :
    fortuneNum = fortuneNum + 1;
    break;
   case (3) :
    fortuneNum = fortuneNum - 1;
    break;
   case (4) :
    fortuneNum = fortuneNum + 1;
    break;
   case (8) :
    fortuneNum = fortuneNum - 1;
    break;
   case (10) :
    fortuneNum = fortuneNum - 2;
    break;
  }
  //電波の状況によっても運勢変化
  switch (_global.SN) {
   case (4) :
    fortuneNum = fortuneNum - 2;
    break;
   case (3) :
    fortuneNum = fortuneNum - 1;
    break;
   case (2) :
    fortuneNum = fortuneNum;
    break;
   case (1) :
    fortuneNum = fortuneNum + 1;
    break;
   case (0) :
    fortuneNum = fortuneNum + 2;
    break;
  }
  //特定の条件がそろった場合
  if(_global.BSN == 0 && _global.SN == 0){
   fortuneNum = 0;
  } else if (_global.BSN == 10 && _global.SN == 4){
    fortuneNum = fortuneNum - 3;
  }
  if(fortuneNum < 0){
   fortuneNum = 0;
  } else if (fortuneNum > 9){
    fortuneNum = 9;
  }
  fortuneStr.text = "あなたの運勢は、"+fortuneArray[fortuneNum]+"("+fortuneNum+")です";
  fortunePict.gotoAndStop(fortuneNum + 1);
  stop();
  buttonFlag = 2;
 }
};

2010年10月15日金曜日

[MA-9-7] おみくじ付き携帯待ち受け画面 (FlashLite2.0/ActionScript2.0)



ma9_7.swf

ActionScript2.0(Flash Lite2.0)
this.onEnterFrame = function() {
 //バッテリーレベル
 var batteryCharging = fscommand2("GetPowerSource");
 var batteryLevel = fscommand2("GetBatteryLevel");
 var maxBattery = fscommand2("GetMaxBatteryLevel");
 var batteryStatusNum = 0;
 if (batteryCharging) {
  batteryStatusNum = 10;
 } else {
  if (maxBattery == 3) {
   batteryStatusNum = batteryLevel;
  } else if (maxBattery == 100) {
   if (batteryLevel>80) {
    batteryStatusNum = 8;
   } else if (batteryLevel>60) {
    batteryStatusNum = 7;
   } else if (batteryLevel>40) {
    batteryStatusNum = 6;
   } else if (batteryLevel>20) {
    batteryStatusNum = 5;
   } else if (batteryLevel>0) {
    batteryStatusNum = 4;
   }
  }
 }
 batteryStatusNumStr.text = batteryStatusNum;
 batteryPict.gotoAndStop(batteryStatusNum + 1);
 stop();
 _global.BSN = batteryStatusNum;
 //受信レベル
 var signalLevel = fscommand2("GetSignalLevel");
 var maxSignal = fscommand2("GetMaxSignalLevel");
 var signalNum = 0;
 if (maxSignal == 4) {
  signalNum = signalLevel;
 } else if (maxSignal == 3) {
  if (signalLevel>0) {
   signalNum = signalLevel+1;
  }
 }
 signalNumStr.text = signalNum;
 antennaPict.gotoAndStop(signalNum + 1);
 stop();
 _global.SN = signalNum;
 //開閉回数
 var mySharedObject:SharedObject = SharedObject.getLocal("open");
 SharedObject.addListener("open", initHandler);
 mySharedObject.data.count = 0;
 mySharedObject.flush();
 function initHandler() {
  var date:Number = Number(mySharedObject.data.count);
  date++;
  mySharedObject.data.count = date;
  mySharedObject.flush();
  checkNumStr.text = mySharedObject.data.count;
 }
};
topButton.onRelease = function() {
 fortuneArray = ["大吉", "大吉", "吉", "半吉", "小吉", "末小吉", "末吉", "凶", "凶", "凶", "凶", "凶"]; 
 fortuneNum = Math.floor(Math.random()*(_global.BSN+_global.SN));
 fortuneStr.text = "あなたの運勢は、"+fortuneArray[fortuneNum]+"("+fortuneNum+")です";
 fortunePict.gotoAndStop(fortuneNum + 1);
 stop();
};

2010年10月14日木曜日

[SA-3-11] PHP-MySQL連携

1.php-mysqlモジュールをインストール
$ su
# yum install php-mysql
# service httpd stop
# service httpd start
# service mysqld stop
# service mysqld start

2.MySQLにデータベース,テーブル作成
$ mysql -u root -p
create database sa;

$ vi server_list.csv
,1,sa000,10.2.3.100
,2,sa001,10.2.3.101
,3,sa002,10.2.3.102
,4,sa003,10.2.3.103
,5,sa004,10.2.3.104
,6,sa005,10.2.3.105
,7,sa006,10.2.3.106
,8,sa007,10.2.3.107
,9,sa008,10.2.3.108
,10,sa009,10.2.3.109
,11,sa010,10.2.3.110
,12,sa011,10.2.3.111

$ mysql -u root -p sa
create table server_list ( id integer NOT NULL AUTO_INCREMENT PRIMARY KEY, num char(4), host_name char(20), ip_address char(15) );

show tables;

load data local infile "~/server_list.csv" into table server_list fields terminated by ',' enclosed by '"' lines terminated by '\n';
select * from server_list;

3.Windows側でPHPファイルを作成
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>server_list</title>
</head>
<body>
<?php
 $db_user  = "[user name]";
 $db_password = "[password]";
 $db_name = "[database name]";
 $db_host  = "localhost";

 $db = mysql_connect($db_host,$db_user,$db_password);
 mysql_select_db($db_name,$db); 
 $str_sql = "select * from server_list";
 $rs = mysql_query($str_sql,$db);
 $num = mysql_num_fields($rs);

 print("<table><tr><th colspan=4>server_list</th></tr>");
 echo("
 ");
 print("<tr>");
 for ($i=0;$i<$num;$i++){
  print("<td><b>".mysql_field_name($rs,$i)."</b></td>");
 }
 print("</tr>");
 while($row=mysql_fetch_array($rs)){
  echo("
 ");
  print("<tr>");
  for($j=0;$j<$num;$j++){
   print("<td>".$row[$j]."</td>");
  }
  print("</tr>");
 }

 print("</table>");

 mysql_free_result($rs);
 mysql_close($db);
?>
</body>
</html>

4.FTP後にパーミッションを755に変更

[SA-3-10] httpd設定

selinuxの無効化
# getenforce
# setenforce 0
# vi /etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled
httpdの設定ファイル修正
# vi /etc/httpd/conf/httpd.conf
エラーページ等でOS名を非表示
 #ServerTokens OS
 ServerTokens Prod

エラーページ等でApacheのバージョン非表示
 #ServerSignature On
 ServerSignature Off

不要モジュールの読み込み解除
 #LoadModule auth_anon_module 
 #LoadModule ldap_module modules/mod_ldap.so
 #LoadModule auth_ldap_module modules/mod_auth_ldap.so
 #LoadModule mime_magic_module 
 #LoadModule cern_meta_module 
 #LoadModule deflate_module modules/mod_deflate.so
 #LoadModule headers_module modules/mod_headers.so
 #LoadModule usertrack_module modules/mod_usertrack.so
 #LoadModule status_module modules/mod_status.so
 #LoadModule asis_module modules/mod_asis.so
 #LoadModule info_module modules/mod_info.so
 #LoadModule vhost_alias_module 
 #LoadModule imap_module modules/mod_imap.so
 #LoadModule speling_module modules/mod_speling.so
 #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
 #LoadModule cache_module modules/mod_cache.so
 #LoadModule disk_cache_module 
 #LoadModule file_cache_module modules/mod_file_cache.so
 #LoadModule mem_cache_module 

サーバ管理者のメールアドレス設定
 #ServerAdmin root@localhost

サーバ(FQDN)名設定
 #ServerName www.example.com:80

ドキュメントルート(/var/www/html)のCGI/SSIの実行権付与とインデックスリストの非表示
(Indexes : インデックスリスト表示, FollowSymLinks : Symlink許可, Includes : SSI許可, ExecCGI : CGI許可)
 # Options Indexes FollowSymLinks
 Options FollowSymLinks Includes ExecCGI

ディレクトリアクセス制御
(FileInfo : ファイル関係の制御, AuthConfig : 認証関係, Limit : .htaccessによるアクセス制御, or ALL : 全て許可)
 # AllowOverride None
 AllowOverride FileInfo AuthConfig Limit

ユーザディレクトリ(/home/[user]/public_htmlをhttp://localhost.localdomain/~[user]として表示)の有効化とCGI/SSIの実行権付与とインデックスリストの非表示
※各ディレクトリのパーミッションは,/home/[user] : 711, /home/[user]/public_html : 755です.
 #UserDir disable
 UserDir public_html
 <Directory /home/*/public_html>
  AllowOverride FileInfo AuthConfig Limit
  Options MultiViews SymLinksIfOwnerMatch 
  <LimitExcept GET POST OPTIONS>
   Order deny,allow
   Deny from all
  </LimitExcept>
 </Directory>
 <Directory /home/*/public_html>
  AllowOverride FileInfo AuthConfig Limit
  Options MultiViews SymLinksIfOwnerMatch IncludesNoExec ExecCGI
  <LimitExcept GET POST OPTIONS>
   Order deny,allow
   Deny from all
  </LimitExcept>
 </Directory>

iconsディレクトリのファイル一覧を非表示
<Directory "/var/www/icons">
 #Options Indexes MultiViews
 Options MultiViews
 AllowOverride None
 Order allow,deny
 Allow from all
</Directory>

Index.htmの許可
 DirectoryIndex index.html index.htm

CGIスクリプトとして.plを許可
#AddHandler cgi-script .cgi
AddHandler cgi-script .cgi .pl

アクセスログでのホストネーム使用
 #HostnameLookups Off
 HostnameLookups On

ログ分離設定
 #CustomLog logs/access_log combined
 SetEnvIf Remote_Addr 192.168.1 nolog
 SetEnvIf Remote_Addr 127.0.0.1 nolog
 SetEnvIf Request_URI "Admin.dll" wormlog nolog
 SetEnvIf Request_URI "cmd.exe" wormlog nolog
 SetEnvIf Request_URI "default.ida" wormlog nolog
 SetEnvIf Request_URI "null.ida" wormlog nolog
 SetEnvIf Request_URI "root.exe" wormlog nolog
 CustomLog logs/worm_log common env=wormlog
 CustomLog logs/access_log combined env=!nolog

/var/www以下のディレクトリを,ユーザー権限で操作可能(SFTPにてファイルのアップロードが可能)とする.
# chown -R [user name] /var/www/
# chmod -R g+w /var/www/

テスト用のhtmlファイル作成
# vi /var/www/html/index.html
もしくは
例) sftp://192.168.147.131

外部からWEBサーバへの接続確認
例) http://192.168.147.131

→[SA-1-5]

[SA-3-9] Firewall(iptables)設定

iptablesの自動起動確認
# chkconfig --list | grep tables

iptablesの自動起動停止
# chkconfig iptables off

iptablesの起動
# service iptables start

iptablesの停止
# service iptables stop
(/etc/rc.d/init.d/iptables stop)

※ip6tablesについても同様です.


iptablesの設定ファイル編集
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT


※直接設定ファイルを編集する事は,危険が伴うため推奨されません.以下のコマンドを使用して,個別にルールを適用して下さい.

iptablesのルール初期化
# /sbin/iptables -F

外部からWEBサーバへの接続許可1(SYNフラグ,ACKフラグ)
クライアント→サーバ方向
# /sbin/iptables -A FORWARD -p TCP -s 0.0.0.0 --dport 80 -d 192.168.147.131 -j ACCEPT
-p プロトコル:tcp
--dport 送信先ポート:80
-d 送信先アドレス:192.168.147.131
-j ターゲット:ACCEPT(パケットの通過を許可)

外部からWEBサーバへの接続許可2(SYN/ACKフラグ)
サーバ→クライアント方向
# /sbin/iptables -A FORWARD -p TCP ! --syn -m state --state ESTABLISHED --sport 80 -s 192.168.147.131 -d 0.0.0.0 -j ACCEPT
-p プロトコル:tcp
--sport 送信元ポート:80
-s 送信元アドレス:192.168.147.131
! --syn フラグ:SYNフラグ以外
-m state --state ステータス:ESTABLISHED
-j ターゲット:ACCEPT(パケットの通過を許可)

2010年10月9日土曜日

[memo] スマートフォン関連開発環境まとめ

■Android [google]
http://developer.android.com/sdk/index.html

例)au IS01
1.Android SDKの入手し,インストール

2.対象機種の拡張APIや,エミュレーターにハードウェアの仕様を設定する為に,機種固有のSDK AddOnを入手し,1で入手したAndroid SDKのadd-onsフォルダ配下に配置

3.1で入手したAndroid SDKに含まれるSDK Manager.exeを起動し,Virtual Devices→New→Target:JN-DK01(SHARP Corporation) - API Level 4を選択し,新規AVD(Android Virtual Device)を作成→Start

※ARM用Androidだけではなく,x86用Androidも存在します.ISO ImageをダウンロードしてVMware Playerにインストールすれば,シミュレーターや実機が無くても,雰囲気を掴むことは出来ます.
http://www.android-x86.org/download
1.VMware Playerの設定
 後でOSをインストール
 ゲストOS:Linux(他の2.6.xカーネル)

2.Android froyo 20100812.vmxの7~8行目を編集
   scsi0:0.present = "TRUE"
   scsi0:0.fileName = "Android froyo 20100812.vmdk"
 を
   ide0:0.present = "TRUE"
   ide0:0.fileName = "Android froyo 20100812.vmdk"
 に変更

3.インストール
 installation
 Create/Modify partitions
  New→Primary→Bootable→Write→Quit
 sda1→ext3

■Windows Phone 7 [Microsoft]
開発ツール(英語版)
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=04704acf-a63a-4f97-952c-8b51b34b00ce&displaylang=en

VB用テンプレート(英語版)
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a808a69d-6119-47b7-b858-262be5c49915&displaylang=en

※上記WP7用SDKはVisual Studio 2010(英語版)用です.

Visual Studio 2010 日本語版にWindows Phone 7のテンプレートを入れる方法
http://blogs.shintak.info/archive/2010/09/22/54570.aspx


■iOS SDK [Apple]
http://developer.apple.com/devcenter/ios/index.action
※iOSのSDKを動かすためには開発環境(Xcode)が必要です.XcodeはMac OS X専用の為,iOS SDKを利用するためにはMACが必要という事になります.


■Kindle Development Kit [Amazon]
https://kindlepublishing.amazon.com/gp/vendor/sign-in?ie=UTF8&originatingURI=%2Fgp%2Fvendor%2Fmembers%2Fkindlepubs%2Fkdk%2Fhome

2010年10月8日金曜日

[MA-9-6] random関数の利用 (FlashLite2.0/ActionScript2.0)



ma9_6.swf

ランダム関数を使用すると端数が発生するため,出力された値を使って特定のフレームを表示したい場合には端数の処理が必要となります.

Math.floor 小数点以下切り捨て 0 - 9
Math.ceil 小数点以下切り上げ 1 - 10
Math.round 小数点以下四捨五入 0 - 10

ActionScript2.0(Flash Lite2.0)
topButton.onRelease = function() {
 fortuneArray = ["大吉", "大吉", "吉", "半吉", "小吉", "末小吉", "末吉", "凶", "凶", "凶"]; 
 fortuneNum = Math.floor(Math.random()*(_global.BSN+_global.SN));
 fortuneStr.text = "あなたの運勢は、"+fortuneArray[fortuneNum]+"("+fortuneNum+")";
 //gotoAndStop(fortuneNum);
};

[MA-9-5] 携帯電話の開閉回数・バッテリー状態・電波状態の表示サンプル (FlashLite2.0/ActionScript2.0)

携帯電話の開閉回数,バッテリー状態,電波状態を表示するサンプル



ma13debug.swf

ActionScript2.0(Flash Lite2.0)
this.onEnterFrame = function() {
//debug用 SharedObject利用可否チェック
 var checkSharedObject = "none";
 checkSharedObject = System.capabilities.hasSharedObjects;
 checkSharedObjectStr.text = checkSharedObject;

//debug用 キャリア判定
 maxBatteryTemp = fscommand2("GetMaxBatteryLevel");
 var carrier = "other";
 if (maxBatteryTemp == 3) {
  carrier = "au/softbank";
 } else if (maxBatteryTemp == 100) {
  carrier = "docomo";
 } else {
  carrier = "other";
 }
 carrierStr.text = carrier;

//バッテリーレベル
 var batteryCharging = fscommand2("GetPowerSource");
 var batteryLevel = fscommand2("GetBatteryLevel");
 var maxBattery = fscommand2("GetMaxBatteryLevel");
 var batteryStatusNum = 0;
 if (batteryCharging) {
  batteryStatusNum = 10;
 } else {
  if (maxBattery == 3) {
   batteryStatusNum = batteryLevel;
  } else if (maxBattery == 100) {
   if (batteryLevel>80) {
    batteryStatusNum = 8;
   } else if (batteryLevel>60) {
    batteryStatusNum = 7;
   } else if (batteryLevel>40) {
    batteryStatusNum = 6;
   } else if (batteryLevel>20) {
    batteryStatusNum = 5;
   } else if (batteryLevel>0) {
    batteryStatusNum = 4;
   }
  }
 }
 batteryStatusNumStr.text = batteryStatusNum;

//受信レベル
 var signalLevel = fscommand2("GetSignalLevel");
 var maxSignal = fscommand2("GetMaxSignalLevel");
 var signalNum = 0;
 if (maxSignal == 4) {
  signalNum = signalLevel;
 } else if (maxSignal == 3) {
  if (signalLevel>0) {
   signalNum = signalLevel+1;
  }
 }
 signalNumStr.text = signalNum;

//開閉回数
 var mySharedObject:SharedObject = SharedObject.getLocal("open");
 SharedObject.addListener("open", initHandler);
 mySharedObject.data.count = 0;
 mySharedObject.flush();
 function initHandler() {
  var date:Number = Number(mySharedObject.data.count);
  date++;
  mySharedObject.data.count = date;
  mySharedObject.flush();
  checkNumStr.text = mySharedObject.data.count;
 }
};

※PC上で動作確認を行う際は,iモードHTMLシミュレータⅡを使用すると便利です.

2010年10月7日木曜日

[SA-3-8] CentOS5.5(最小インストール)でのcrontabの利用

今回最小構成でインストールした関係で,初期状態ではcronが使えない場合もあります.
その際はvixie-cronをインストールし,利用可能な状態にしてください.
# yum install vixie-cron


crontabへの登録
$ crontab -e

crontabに登録された内容の確認
$ crontab -l

[SA-3-7] VMWare Player 3.0のNAT設定変更方法

最新のVMWare Player 3.0から,標準ではNATの設定を変更できなくなったようです.
ただし,インストーラーの中にはexeファイルが含まれているので,それを取り出して利用する事とします.

1.ダウンロードしたVMWare Playerのインストールファイルを,Windowsのコマンドライン上で,オプションを付けて実行.
VMware-player-3.1.2-301548.exe /e temp

2.作成されたtempフォルダの中のnetwork.cabをWIndowsの解凍ソフトで展開する.

3.展開されたフォルダの中のvmnetcfg.exeをVMWare Playerがインストールされたフォルダ(C:\Program Files\VMware\VMware Player)に移動する.

4. vmnetcfg.exeを実行

[SA-3-6] 最低限必要となるアプリケーションをインストール

1.yum準備
#yum install yum-fastestmirror
#yum install yum-utils

2.NTPインストール
#yum install ntp
#chkconfig ntpd on
#chkconfig --list | grep ntp
#service ntpd start

3.PHPインストール
#yum install php
#vi /etc/php.ini
memory_limit = 16M ; Maximum amount of memory a script may consume

4.Webサーバ(httpd)インストール
#yum install httpd
#vi /etc/httpd/conf/httpd.conf
KeepAlive On
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
※ログや参考となるサイトを確認しながらパラメータの微調整を行います.
#service httpd start

5.MySQL(サーバ,クライアント)インストール
#yum install mysql mysql-server
#vi /etc/my.cnf
[mysql]
default_character_set=utf8

[mysqld]
character_set-server=utf8
innodb_log_file_size=64M
innodb_buffer_pool_size=128M
#mysql_secure_installation
#service mysqld start
#chkconfig mysqld on

6.MySQLの不要ユーザー削除/新規ユーザー追加
#mysql -u root

ユーザ情報表示
select user,host,password from mysql.user;

匿名ユーザー削除
delete from mysql.user where user='';

rootパスワード設定
set password for root@localhost=password('[任意のパスワード]');
set password for root@'[ホスト名]'=password('[任意のパスワード]');
set password for root@127.0.0.1=password('[任意のパスワード]');

新規ユーザーの追加
grant all privileges on *.* to [user name]@"%" identified by '[password]' with grant option;

ユーザ情報表示(確認)
select user,host,password from mysql.user;

7.viエディタのカラー化
# yum install vim-enhanced
# alias vi='vim'
# vi /etc/bashrc
alias vi='vim'

2010年10月6日水曜日

[memo] 最新スマートフォン・スペック比較

各キャリアの最新のスマートフォンのスペックを比較する.
採用OSや付加機能から,各キャリアの今後のスマートフォンの戦略を考える.

機種名Galaxy S SC-02BIS03Xperia SO-01BiPhone 4
キャリアdocomoaudocomosoftbank
OSAndroid 2.2Android 2.1(*1)Android 1.6(*2)iOS 4
CPUSamsung
S5PC110
1GHz
Qualcomm QSD8650 Snapdragon
1GHz
Qualcomm QSD8250
Snapdragon
1GHz
Apple
A4
1GHz
画面サイズ4インチ3.5インチ4.0インチ3.5インチ
解像度800x480960×640854x480960×640
RAM512MB512MB256MB512MB
本体メモリ16GB500MB1GB16GB/32GB
外部メモリmicroSD
最大32GB
1GB同梱
microSD
最大32GB
2GB同梱
microSD
最大32GB
16GB同梱
×
大きさ122×64×9.9mm121×63×12.6mm119×63×13.1mm115.2×58.6×9.3mm
質量118g138g139g137g
カメラ500万画素
CMOS
957万画素
CCD
810万画素
CMOS
500万画素
裏面照射CMOS
インカメラ××
GPS
電子コンパス
赤外線×××
ワンセグ××
Felica×××
無線LANIEEE802.11b/g/nIEEE802.11b/gIEEE802.11b/gIEEE802.11b/g/n
BluetoothBluetooth 3.0Bluetooth 2.1Bluetooth 2.0Bluetooth 2.1
高速データ通信HSDPA
HSUPA
下り7.2Mbps
上り5.76Mbps
CDMA 1X
EV-DO Rev.A
下り3.1Mbps
上り1.8Mbps
HSDPA
HSUPA
下り7.2Mbps
上り2.0Mbps
HSDPA
HSUPA
下り7.2Mbps
上り5.8Mbps
連続待受時間約510時間約200時間約300時間(3G)約300時間(3G)
連続通話時間約380分約230分約290分(3G)約420分(3G)
バッテリー1500mAh1020mAh1500mAh1420mAh
充電/外部端子microUSBmicroUSBmicroUSBDockコネクタ
FLASHFLASH 10.1FLASH Lite 4.0(*1)××
発売時期2010年10月中2010年11月下旬2010年4月1日2010年6月24日

(*1)今後予定されるAndroid2.2へのアップデート時にFlash 10.1に対応予定
(*2)今後Android2.*へアップデート予定

[MA-9-4] バッテリーの状態を取得 (FlashLite2.0/ActionScript2.0)

携帯電話の電池の状態をFlashから取得するには、以下のFScommand2を使用します.

AC駆動/バッテリー駆動の判別
var batteryCharging = fscommand2("GetPowerSource");

現在のバッテリー残量
var batteryLevel = fscommand2("GetBatteryLevel");

バッテリーの最大容量
var maxBattery = fscommand2("GetMaxBatteryLevel");

※バッテリーの最大容量の値がキャリアによって異なる事に注意.

キャリア満充電
docomo01-2021-4041-6061-8081-100
au0123
softbank0123

最大バッテリ容量の値がキャリアによって異なる事を利用して,場合分けする例

ActionScript2.0(Flash Lite2.0)
batteryCharging = fscommand2("GetPowerSource");
batteryLevel = fscommand2("GetBatteryLevel");
maxBattery = fscommand2("GetMaxBatteryLevel");
batteryStatusNum = 0;

if(batteryCharging){
    batteryStatusNum = 10;
}else{
 if(maxBattery == 3){
  batteryNum = batteryLevel;
 }else if(maxBattery == 100){
  if(batteryLevel > 80){
   batteryStatusNum = 8;
  }else if(batteryLevel > 60){
   batteryStatusNum = 7;
  }else if(batteryLevel > 40){
   batteryStatusNum = 6;
  }else if(batteryLevel > 20){
   batteryStatusNum = 5;
  }else if(batteryLevel > 0){
   batteryStatusNum = 4;
  }
 }
}

batteryStatusNum
バッテリーレベルキャリア
0au/softbank
11au/softbank
22au/softbank
33au/softbank
41-20docomo
521-40docomo
641-60docomo
761-80docomo
881-100docomo
9
10充電中au/softbank/docomo

[MA-9-3] 電波状況の取得 (FlashLite2.0/ActionScript2.0)

携帯電話の電波状況をFlashから取得するには、以下のFScommand2を使用します.

現在の受信レベル
signalLevel = fscommand2("GetSignalLevel");

最大受信レベル
maxSignal = fscommand2("GetMaxSignalLevel");

※最大受信レベルがキャリアによって異なる事に注意.
キャリア圏外MINMAX
docomo0123
au01234
softbank01234

最大受信レベルがキャリアによって異なる事を利用して,場合分けする例

ActionScript2.0(Flash Lite2.0)
var signalLevel = fscommand2("GetSignalLevel");
var maxSignal = fscommand2("GetMaxSignalLevel");
var signalNum = 0;

if(maxSignal == 4){
 signalNum = signalLevel;
}else if(maxSignal == 3){
 if(signalLevel > 0){
  signalNum = signalLevel + 1;
 }
}

2010年10月1日金曜日

[MA-9-2] 携帯確認回数のカウント (FlashLite2.0/ActionScript2.0)

Shared Objectを利用して,一日のうちに何回携帯を確認したかをカウントする.

まずは下記サンプルを参考に,携帯電話の画面を確認した回数をカウント出来るか試行する.

ActionScript2.0(Flash Lite2.0)
var mySharedObject:SharedObject = SharedObject.getLocal("open");
SharedObject.addListener("open", initHandler);
mySharedObject.data.count = 0;
mySharedObject.flush();

function initHandler(){
    var date:Number = Number(mySharedObject.data.count);
    date ++;
    mySharedObject.data.count = date;
    mySharedObject.flush();
    checkNumText.text = mySharedObject.data.count;
}

※ステージ上にはダイナミックテキストボックスを配置し,インスタンス名を「checkNumText」とする.

動作したら,一日に何回確認したかをカウント出来るようにする.
(最終的には電波状況とバッテリー残量と組み合わせたアプリケーションとする)

[MA-9-1] Shared Object (FlashLite2.0/ActionScript2.0)

Shared Objectは,FlashLiteではver.2.0から実装された,データをローカルに保存する仕組みです.

Shared Objectの初期化
var mySharedObject:SharedObject = SharedObject.getLocal("open");
※任意のShared Object名は「open」としています.

イベントの登録
SharedObject.addListener("open", initHandler);

SharedObjectへのデータ追加
mySharedObject.data.count = 0;
※「count」という名前のデータを保存(追加)する場合.

SharedObjectからのデータ取り出し
var count = mySharedObject.data.count;

SharedObjectにデータを追加後に保存
mySharedObject.flush();
※データ追加後には,必ず保存する事.

SharedObjectに配列を保存
mySharedObject.week = ["mon", "tue", "wed", "thu", "fir", "sat", "sun"]; 
※「week」という名前の配列を追加する場合.

SharedObjectにオブジェクトを保存
mySharedObject.classRegister = {name:"sato", class:"gc", grade:"2"}; 
※「classRegister」という名前のオブジェクトに追加する場合.

SharedObjectのデータをループで取り出す
for (var i in mySharedObject.data) {
    trace("[" + i + "] " mySharedObject.data[i]);
}