2010年6月19日土曜日

ATNDから自分の参加するイベント一覧を取得してみた

私はATND というサービスをよく利用します。
このサイトは、イベントの参加登録ができるサイトで、よくIT系のイベントが登録されています。

ATNDはAPIが公開されており、APIを使って自由に検索ができるようになっています。
http://api.atnd.org/

そこで、私自身が参加しようとして登録してあるイベント一覧をこのブログに載せるガジェットを作ってみました。

とりあえず、自分自身が参加登録している一覧を取得するには下記のURLを使用します。
http://api.atnd.org/events/?user_id={個人のID}

私の場合はIDが21348なので
http://api.atnd.org/events/?user_id=21348
となります。

今回はjavascriptで全て実装したいので、jsonp形式でレスポンスをうけとります。
http://api.atnd.org/events/?user_id=21348&count=5&callback=atndCallback&format=jsonp


JSONPについては以前紹介した物がありますので、そちらを参照ください。
JSONPの使い方

作成したガジェット自体は、右の"参加予定のイベント"がそれになります!
javascriptだけで、これだけできるのでやっぱりjavascriptは便利です!
知っておいて損はないなー

・ガジェットのソース
  1. var atndEdit = function() {  
  2.  //jsonp  
  3.  var url = 'http://api.atnd.org/events/?user_id=21348&count=5&callback=atndCallback&format=jsonp';  
  4.  var ele = document.createElement('script');  
  5.  ele.type = 'text/javascript';  
  6.  ele.src = url;  
  7.  document.body.appendChild(ele);  
  8.  //今日の日付作製  
  9.  var nowDate = new Date();  
  10.  var month = (nowDate.getMonth() + 1);  
  11.  month = month.length === 2 ? month : '0' + month;  
  12.  var day = nowDate.getDate();  
  13.  day = day.length === 2 ? day : '0' + day;  
  14.  var nowStrDate = nowDate.getFullYear() + month + day;  
  15.  //出力先  
  16.  var output = document.getElementById('atnd-div');  
  17.  var count = 0;  
  18.  return {  
  19.   disp : function(events) {  
  20.    var eventDate = events.ended_at.substring(0, 10).replace(/-/g, '');  
  21.    if(eventDate < nowStrDate) {  
  22.     if(count == 0) {  
  23.      output.innerHTML = '<span style="font-size:12px;">参加予定のイベントはありません</span>';  
  24.     }  
  25.     return;  
  26.    }  
  27.    count++;  
  28.    var title = events.title;  
  29.    var url = 'http://atnd.org/events/' + events.event_id;  
  30.    var start = events.ended_at.substring(0, 10);  
  31.   
  32.    var ele = document.createElement('a');  
  33.    ele.href = url;  
  34.    ele.target = '_blank';  
  35.    ele.innerHTML = title;  
  36.   
  37.    var date = document.createElement('span');  
  38.    date.innerHTML = '<b>・' + start + '</b>';  
  39.    output.appendChild(date);  
  40.    output.appendChild(document.createElement('br'));  
  41.    output.appendChild(ele);  
  42.    output.appendChild(document.createElement('br'));  
  43.   }  
  44.  };  
  45. }();  
  46. function atndCallback(data) {  
  47.  var events = data.events;  
  48.  for(var i = 0; i < events.length; i++) {  
  49.   var eventDate = events[i].ended_at.substring(0, 10).replace(/-/g, '');  
  50.    atndEdit.disp(events[i]);  
  51.  }  
  52. }  

2010年6月18日金曜日

phpMyAdminを使ってみた

MySQLは以前から使っていたが、基本的にターミナルベースで操作をしていた。

今回は、人が作ったモジュールのテーブルの中身を見たかったので、GUIが欲しくなりインストールしてみました。

といっても、設定は簡単でした。。。

■前提条件
OS: CentOS 5系
Apache: 2系(Apacheインストールを参照)
もちろん、PHPが動くことが必須(PHPが動かない人は、PHPインストールを参照して)

■インストール
とりあえずダウンロードして、解凍する。
今回は、MySQLのバージョンの都合でphpMyAdminが最新のが使えなかったので2系をダウンロードしました。
3系でも基本的に設定は同じなようです。

cd $APACHE_HOME/htdocs
> wget http://sourceforge.net/projects/phpmyadmin/files%2FphpMyAdmin%2F2.11.10%2FphpMyAdmin-2.11.10-all-languages.zip/download
> unzip phpMyAdmin-2.11.10-all-languages.zip
> mv phpMyAdmin-2.11.10-all-languages phpMyAdmin
> cd phpMyAdmin
> cp -ip config.sample.inc.php config.inc.php
> vi config.inc.php
//$cfg['blowfish_secret'] = ''; //ここに適当な文字を入れてあげてください
//$cfg['Servers'][$i]['host'] = 'localhost'; //という項目を見つけ、MySQLのあるサーバ名を記述してください!
以上で、インストールと設定が終わりです。

http://hogehoge/phpMyAdmin
というURLでアクセスすると下記画面が表示されます!
DBのユーザとパスワードをログイン画面に入力すると、ログインできます!
 あとは、直感にしたがって操作すれば、テーブルの中身が見れます!

2010年6月15日火曜日

Geolocation APIを使ってみた

HTML5では位置情報が取得出来るようなので、取得してみました!

緯度経度以外にも、標高も取得出来ます!


・プロパティーの一覧はこんな感じです

位置情報のプロパティcoordsのプロパティ説明
coordscoords緯度
longitude経度
altitude標高(利用できない場合はnull)
accuracy緯度・経度の正確さ(単位はメートル)
altitudeAccuracy標高の正確さ(単位はメートル)
headingデバイスの進行方向。真北に対する時計回りの角度。利用できない場合はnull
speedデバイスの進行速度。利用できない場合はnull
timestamp位置情報を取得した時間(1970/1/1からのミリ秒


-サンプル
GeolocationAPIを一通り使ってみました

緯度経度のみならず、標高も取得出来るのは驚いた。
標高がわかる携帯電話とかから使えば大丈夫なのかな?

2010年6月8日火曜日

HTML5 のWeb Storageを使ってみた

今回は、ローカルストレージと、セッションストレージを使ってみました!

■ローカルストレージ
下記のような 簡単なサンプルを作りました。
storeにて値の登録を行います。そうすると、store dateに登録されている一覧が表示されます。
さらに追加で登録を行うと、下記のようになります。


ローカルストレージのサンプル


・ソース
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. window.addEventListener('storage', function(event) {  
  6.  //storageというイベントに対して、この関数の処理を追加します。  
  7.  refreshKeyList();  
  8. }, false);  
  9. var store = function(key, value) {  
  10.  //ローカルストレージに指定した、KeyとValueの組み合わせを登録します  
  11.  localStorage.setItem(key, value);  
  12. };  
  13. var del = function(key) {  
  14.  //ローカルストレージから指定したKeyのものを削除します  
  15.  localStorage.removeItem(key);  
  16.  //delete localStorage[key]; //こういう記述方法もできます  
  17. };  
  18. var allDel = function() {  
  19.  localStorage.clear();  
  20. };  
  21. var refreshKeyList = function() {  
  22.  var keyList = document.getElementById('keyList');  
  23.  if(localStorage.length === 0) {  
  24.   //ローカルストレージに格納されているデータのサイズを取得  
  25.   keyList.innerHTML = '値が格納されていません';  
  26.   return;  
  27.  }  
  28.  var list = '';  
  29.  var table = tableCreater.table();  
  30.  var tdKey = tableCreater.td('KEY');  
  31.  var tdVal = tableCreater.td('VALUE');  
  32.  var trTitle = tableCreater.tr();  
  33.  trTitle.appendChild(tableCreater.td());  
  34.  trTitle.appendChild(tdKey);  
  35.  trTitle.appendChild(tdVal);  
  36.  trTitle.appendChild(tableCreater.td());  
  37.  table.appendChild(trTitle);  
  38.    
  39.  for(var i = 0; i < localStorage.length; i++) {  
  40.   //ローカルストレージから指定番号のKey値を取得  
  41.   var key = localStorage.key(i);  
  42.   //ローカルストレージから指定したKey値にひもづけられている値を取得  
  43.   var value = localStorage.getItem(key);  
  44.   
  45.   var td0 = tableCreater.td(i + 1);  
  46.   var td1 = tableCreater.td(key);  
  47.   var td2 = tableCreater.td(value);  
  48.   
  49.   var td3 = tableCreater.td('<input type="submit" value="del" onclick="del(\'' + key  + '\');return false;"/>');  
  50.   
  51.   var tr = tableCreater.tr();  
  52.   tr.appendChild(td0);  
  53.   tr.appendChild(td1);  
  54.   tr.appendChild(td2);  
  55.   tr.appendChild(td3);  
  56.   
  57.   table.appendChild(tr);  
  58.  }  
  59.  keyList.innerHTML = '';  
  60.  keyList.appendChild(table);  
  61. };  
  62. var tableCreater = function() {  
  63.  return {  
  64.   table: function() {  
  65.    return document.createElement('table');  
  66.    },  
  67.   tr: function() {  
  68.    return document.createElement('tr');  
  69.    },  
  70.   td: function(val) {  
  71.    var td =  document.createElement('td');  
  72.    if(val) {  
  73.     td.innerHTML = val;  
  74.    }  
  75.    return td;  
  76.    },  
  77.  };  
  78. }();  
  79. </script>  
  80. </head>  
  81. <body onload="refreshKeyList();">  
  82. <div style="border:solid 1px;padding:8px;">  
  83. <strong>store:</strong>  
  84.   
  85. <table>  
  86. <tr><td>key</td><td>value</td></tr>  
  87. <tr><td><input type="text" id="key"/>:</td><td><input type="text" id="value"/><input type="submit" value="store" onclick="store(document.getElementById('key').value, document.getElementById('value').value); return false;"/></td></tr>  
  88. </table>  
  89.   
  90. </div>  
  91.   
  92.   
  93. <div style="border:solid 1px;padding:8px;">  
  94. <strong>store data:</strong>  
  95.   
  96. <div id="keyList"></div>  
  97. <input type="submit" value="all del" onclick="allDel();return false;" />  
  98. </div>  
  99. </body>  
  100. </html>  
JavaのHashMapに値を格納するような感覚で使えます!
前回記述した通り、格納した値は消してあげないと消えません。
同一オリジン、同一ブラウザでなら、消されるまで値が保持されます。


■セッションストレージ
セッションストレージのサンプル
キャプチャ的には同じなので貼りません^_^;
基本的には、ローカルストレージのlocalstorageをsessionstorageに置換してあげれば使えます!
API的にも同じものが用意されています!

ただし!
前回説明した通り、別ウィンドウを開くと値はコピーされますが、
その瞬間だけ値が同じなだけでどちらかで更新してももう一方には反映されません!
上記のサンプルにて、試せるようにしてあるので実際に試してみてください。

こちらは、ウィンドウを閉じれば保持していた値は消えるので、特に気になるところはないな。
使い道は、、、別ウィンドウを開くときにパラメータとして渡したいってときぐらいしか使わないか?
渡せるけど、その画面から情報は受け取れないけどねw

■いちおうAPIを書いておきます
・メソッドについて

メソッド解説
lengthストレージ内に格納されているデータ数
key(index)指定されたインデックスのKeyを返す。存在しない場合はnullが返る
getItem(key)指定されたKeyに対応する値を返す
setItem(key, data)ストレージに指定したKey値で値を登録する
removeItem(key)ストレージから指定されたKey値に対応するデータを削除する
clear()すべてのデータをストレージから削除する

・storageイベントのプロパティについて

プロパティ解説
key変更されたKey。clear()メソッドが呼ばれた際にnull
oldValue変更前の値(のコピー)。新しいキーで値が登録された場合はnull。
newValue変更後の値(のコピー)。値が削除された場合にはnull。
urlイベント発生元のドキュメントURL。
storageArea変更されたストレージへの参照。
使い方
  1. window.addEventListener('storage'function(event) {  
  2.  // storageに何かイベントが発生したときに呼ばれる処理を記述する。  
  3. }, false);  
なぜか、イベントで処理をするとブラウザがクラッシュすることがありますので、気をつけてください。
使い方が悪いのか?それともブラウザがまだちゃんと対応されていないのか?

2010年6月7日月曜日

HTML5のWeb Storageを使ってみる前に軽くまとめてみた

■Web Storageとは
Web Storageとは、クライアントのディスクにデータを保存出来る仕組みです。
Web Storageは単純な”キー・バリュー”ストレージで、キーは文字列、バリューは任意のJavaScriptオブジェクトとなります。

■Web StorageとCookieの違い
Web Storageと似ている機能に、Cookieがあります。
違いをまとめておきます。

CookieWebStorage
サイズ制限1サイト4KBなし
HTTPリクエストHTTPリクエストに自動的に付加され送信される付加されない
有効期限指定できる指定できない
JavaScriptオブジェクト格納できない格納できる

■Web Storageの種類
Web Storageには、ローカルストレージセッションストレージが存在します。

-ローカルストレージ
Webサイト毎に使用できる、永続化領域の事で永続期間は無制限です。
同一ブラウザ、同一オリジン(プロトコル+ドメイン + ポート番号)にて、共有することができます。

-セッションストレージ
基本的にはローカルストレージと同じ。
ただし、有効範囲と生存期間がwindowオブジェクトと同じになっている。
ウィンドウを閉じられるとセッションストレージ内のデータは削除されます。(再読み込みなら削除されない)
ウィンドウから、別のウィンドウを開いた場合は、ストレージの内容がコピーされて渡されます。
コピーなので、別ウィンドウで書き換えても元のウィンドウには反映されません。逆も同じくコピーされません。

2010年6月1日火曜日

HTML5のWeb Workersを使ってみた

Web WorkersはJavaScriptをバックグラウンドで動かすことができる仕組みです!

バックグラウンドで動くことができるので、重たい処理をJavaScriptで処理させてもブラウザが固まらない!っていうメリットがあります。
使い方によっては、めちゃくちゃ便利だと思います。

ただし、WebWorkersからはDOMを操作ができないので注意!
やらないと思うが、alertも使えないので気をつけてください!

■サンプル1
バックグラウンドで、ひたすらカウントアップした結果を返し表示するだけ
サンプル

-index.html
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. var init = function() {  
  6. var worker = new Worker('worker.js');           //①  
  7. worker.onmessage = function(event) {    //②  
  8. document.getElementById('hoge').innerHTML = event.data;  //③  
  9. };  
  10. }  
  11. </script>  
  12. </head>  
  13. <body onload="init();">  
  14. <div id="hoge"></div>  
  15. </body>  
  16. </html>  


-worker.js
  1. var count = 0;  
  2. setInterval(function() {  
  3. postMessage('hoge' + count++);  
  4. }, 1000);  


■解説
①バックグラウンドで実行したいJavaScript(Worker)を指定する
②Workerからのメッセージが送信された際に実行されるイベントを登録する。
③Workerから受け取ったメッセージのデータを取得し、表示させる。
以上が簡単な使い方です!


■サンプル2
バックグラウンドで実行されるWorkerに引数を渡して、それに応じて値を返してもらう
一応、四則演算の結果を返すサンプルにしています。

-index.html
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. var hoge = function() {  
  6. var worker = new Worker('worker.js');  
  7. var json = '{';  
  8. json += 'num1:' + document.getElementById('num1').value;  
  9. json += ',op:"' + document.getElementById('op').value + '"';  
  10. json += ',num2:' + document.getElementById('num2').value;  
  11. json += '}';  
  12. worker.postMessage(json);  
  13. worker.onmessage = function(event) {  
  14. document.getElementById('result').innerHTML = event.data;  
  15. };  
  16. }  
  17. </script>  
  18. </head>  
  19. <body>  
  20. <form onsubmit="hoge(); return false;">  
  21. <input type="number" id="num1">  
  22. <select id="op">  
  23. <option value="+">+</option>  
  24. <option value="-">-</option>  
  25. <option value="*">*</option>  
  26. <option value="/">/</option>  
  27. </select>  
  28. <input type="number" id="num2">  
  29. =<span id="result"></span>  
  30.   
  31.   
  32. <input type="submit" />  
  33. </form>  
  34. </body>  
  35. </html>  


-worker.js
  1. var onmessage = function(event) {  
  2. var data = eval('(' + event.data + ')');  
  3. var num1 = data.num1;  
  4. var num2 = data.num2;  
  5. var op = data.op;  
  6. var result;  
  7. switch (op) {  
  8. case '+':  
  9. result = num1 + num2;  
  10. break;  
  11. case '-':  
  12. result = num1 - num2;  
  13. break;  
  14. case '*':  
  15. result = num1 * num2;  
  16. break;  
  17. case '/':  
  18. result = num1 / num2;  
  19. break;  
  20. default :  
  21. result = 'err';  
  22. }  
  23. //試しに、重たい処理をやらせてみる  
  24. var count = 0;  
  25. for(var i = 0; i < 1000000000; i++) {  
  26. count += i;  
  27. }  
  28. postMessage(result);  
  29. };  
■解説 ①Workerに対して、データを送信する。 ②WorkerがpostMessageをした場合に呼ばれる。 Workerには無駄にカウントアップする処理が含まれている、 通常ならブラウザがロックされてしまい、スクロールができなくなる。 でも、今回はWorkerを使用しているのでDOM側がロックされる事がない。 試しにサンプル画面でスクロールをして見てください。