2012年10月25日木曜日

WEBアプリケーションサーバの構築(6) crontab

1.Shell Scriptエラー処理 前回のツールを動作させる前提として「img」ディレクトリが必要だが,もし存在しないとうまく動作しない.
そこで,「img」ディレクトリの存在有無をチェックし,もし存在しない場合は,ディレクトリを作成するようにツールを編集する.
get_image2.sh
#!/bin/bash

for user in `ls /home`
do
    id $user > /dev/null 2>&1
    if [ $? -eq 0 ] && [ ! -d /home/$user/public_html ]; then
        mkdir -p /home/$user/public_html
        chown $user. /home/$user/public_html
        chmod 711 /home/$user
        echo $user
    fi
done


2.crontabの利用 逆方向も試してみよう
WEBから受け取った値...天気予報の予報値や,特定サイトの値...を,
シェルスクリプトでDBサーバに自動登録.
さらにcrontabを使って,定期的に自動実行.
登録された値はHTMLファイルで閲覧可能なものを作成.
#goo天気の場合
#元ファイル取得
# wget http://weather.goo.ne.jp/area/4610.rdf
#時刻
# grep lastBuildDate 4610.rdf | sed -e "s/\(.*\)<\/lastBuildDate>/\1/g"
#天気
# grep description 4610.rdf | sed -e "s/\(.*\)<\/description>/\1/g"

#Yahoo天気の場合
#元ファイル取得
 wget http://rss.weather.yahoo.co.jp/rss/days/4410.xml
#時刻
 grep lastBuildDate 4410.xml | sed -e "s/\(.*\)<\/lastBuildDate>/\1/g"
#現在の天気と気温を抽出
 grep -n description 4410.xml | grep ^13 | sed -e "s/\(.*\)<\/description>/\1/" | sed "s/\s//g" | sed "s/^.*-//g" | sed "s/\/.*$//g"

1.SQL文を用意
vi temp.sql
 insert into temp (temp) values (10);

2.1で作成したファイルを用いてMySQLへ値流し込み
mysql -u root -s test < temp.sql

3.temp.sqlの値を自動的に更新するシェルスクリプトを作成
temp.sql
 #!/bin/sh
 echo "insert into temp (temp) values (10);" > temp.sql
 /usr/bin/mysql -u root -s test < temp.sql
 exit 0

chmod u+x temp.sql
./temp.sql

4.temp.sqlの中身を自動的に変更する.
temp.sql
 !/bin/sh
 wget http://rss.weather.yahoo.co.jp/rss/days/4410.xml
 str_temp=`grep -n description 4410.xml | grep ^13 | sed -e "s/\(.*\)<\/description>/\1/" | sed "s/\s//g" | sed "s/^.*-//g" | sed "s/\/.*$//g"`
 echo 'insert into temp (temp) values ("'$str_temp'");' > temp.sql
 /usr/bin/mysql -u root -s test < temp.sql
 rm 4410.xml
 exit 0

5.対象とする地域を複数とする.
ファイル名の下2桁目が可変 ---> 4410.xml/4420.xml/4430.xml ... ---> 44*0.xmlの*が1~9まで変化

2012年10月18日木曜日

WEBアプリケーションサーバの構築(5) Shell Script

1.Google画像検索APIの利用
http://ajax.googleapis.com/ajax/services/search/images?q=sato&v=1.0&rsz=1


2.Google画像検索API + shellの利用
curl -s 'http://ajax.googleapis.com/ajax/services/search/images?q=sato&v=1.0&rsz=1' | tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g'
→Google画像検索の1番最初にマッチした画像のURLが表示される.

3.ツールの作成

get_image.sh
#!/bin/sh

target_list=`/usr/bin/mysql -u root -p[password] arts -e "select name from sa2012"`

for name in $target_list
do
        image_url=`curl -s 'http://ajax.googleapis.com/ajax/services/search/images?q='$name'&v=1.0&rsz=1' | tr , '\\n' | grep "url" | sed -e 's/"url"://g' -e 's/"//g'`

        echo $name" --> "$image_url

        curl -s -o img/$name.jpg $image_url
done

exit 0

※{password}は自自身のパスワードに置き換えること.


4.ツールを使用することで,DBに登録されたユーザの画像を,ユーザー名をファイル名として取得することが可能になったので,リストに画像も併せて表示する.
list6.html
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
 <title>real-time search sample(AJAX)</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");
        nameListTags = document.getElementsByTagName("name");
        idLen = idListTags.length;

        resultText = "<table class='table1'><tr><th colspan=5>list</th></tr><tr><td><b>id</b></td><td><b>num</b></td><td><b>name</b></td><td><b>image</b></td></tr>";
        for(i=0; i<idLen; i++){
            id = idListTags[i].childNodes[0].nodeValue;
            num = numListTags[i].childNodes[0].nodeValue;
            name = nameListTags[i].childNodes[0].nodeValue;
            str = name.match(findText);
            if (str){
                resultText += "<tr><td>" + id + "</td><td><a href='http://10.2.5." + num + "' target='_blank'>" + num + "</a></td><td>" + name + "</td><td><img height=100 width=100 src='img/" + name + ".jpg'></td></tr>";
            }
        }
        resultText += "</table>";
        return resultText;
    }

    function inputCheck(){
        findText = document.ajaxForm.requestText.value;
        if (findText != findTextOld) {
            str_search = "./backend.php?search_key=" + 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="a" name="requestText">
</form>
<div id="result"></div>
</body>
</html>

2012年10月11日木曜日

WEBアプリケーションサーバの構築(4) AJAX

フォームにAJAXを使った画面を作成.

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>';

 $search_key = null;

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

  $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, name FROM sa2012 WHERE name LIKE '%".$search_key."%';";
  $res = mysql_query($strsql,$con);

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

    echo '</sa>'; 
?>

list4.html
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
 <title>real-time search sample(AJAX)</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");
        nameListTags = document.getElementsByTagName("name");
        idLen = idListTags.length;

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

    function inputCheck(){
        findText = document.ajaxForm.requestText.value;
        if (findText != findTextOld) {
            str_search = "./backend.php?search_key=" + 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="s" name="requestText">
</form>
<div id="result"></div>
</body>
</html>

2012年10月4日木曜日

WEBアプリケーションサーバの構築(3) PHP

HTMLのフォームから値を受け取り,合致したidのみ表示する画面を作成.

list3_form.html
<html>
<head>
 <title>form</title>
</head>
<body>
 <form action="list3.php" method="get">
  id : <input type="text" name="id" />
  <input type="submit" />
 </form>
</body>
</html>

list3.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>list</title>
</head>
<body>
<?php
 $id = htmlspecialchars($_GET['id']);

 $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 sa2012 where id = ".$id;
 $rs = mysql_query($str_sql,$db);
 $num = mysql_num_fields($rs);

 print("<table><tr><th colspan=3>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>