ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2014年9月3日水曜日

JavaScriptで数値の桁あふれでハマった・・・

お好きなブラウザで確認できるので、一度試してみるといいかもしれません。

ブラウザの開発者ツールでコンソールを表示し、下記を入力して下さい。
var i = 1118918899790958592;

この数値がiという変数に格納されていると思いますよね。
では、そのままコンソールでiを出力してみてください。
> var i = 1118918899790958592;
> i
1118918899790958600
んっ!!!!!
ということで、10の位で丸められていますね。。。
どんな桁落ちだよ。

通常こんなでかい数字を扱うことはないと思うのですが、今回利用していたAPIの戻り値がJSONでそのID的なものが数値型でこの桁数という・・・。
やられたわー。
4時間くらい楽しんでしまった・・・。

2010年10月10日日曜日

node.jsのrequireを使ってみた!

前回node.jsのインストールが出来てサンプルが表示できたと思います!
前回のサンプルにもあった、require('xxx')という物で遊んでみました。

とりあえず、私自身がJavaプログラマーなので、Javaとの比較で説明したいと思います!

では、requireの説明ですが・・・

requireはimportみたいなものです!

以上!

とりあえず、今回のサンプルを見つつ説明させてください!
var http = require('http');
var url = require('url');
var querystring = require('querystring');
var circle = require('./circle');

http.createServer(function(request, response) {
        response.writeHead(200,{'Content-Type': 'text/plain'});
        var hoge = querystring.parse(url.parse(request.url).query).hoge;
        response.end(circle.area(4) + " " + hoge);
}).listen(8124);

console.log('http://localhost:8124');
require('http'),require('url'),require('querystring')はnode.jsが用意している関数をJavaで言うimportしている感じです。
importして、そこに書いてある変数で受け取っている。そんなイメージ。
使うときは、その変数経由で呼び出すことができます!

ちなみに、hogeパラメータを取得するときは、上記サンプルで書かれている通り、このように書きます。
querystring.parse(url.parse(request.url).query).hoge

で、一個だけ毛色の違うrequire('./circle')は、、、なにかというと
独自で作成した関数になっています。
同一階層にcircle.jsというファイルを置いているので、このように記述しています。

・中身はこんな感じです。
var PI = 3.14;
exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

ちなみに、requireはrequireされたファイルからさらにrequireを使っていくこともできます!

2010年10月9日土曜日

node.jsインストールしてみた!

最近よく聞くnode.jsを使ってみました!!

なにかというと、サーバサイドJavaScriptです。
JavaScriptでサーバ側の処理を作れるっていう素敵なものです!

本家:http://nodejs.org/

では、インストールしてみましょう!


$ wget http://nodejs.org/dist/node-v0.2.3.tar.gz
$ tar zxvf node-v0.2.3.tar.gz
$ cd node-v0.2.3

# sslを使わないので
$ ./configure --without-ssl
# sslを使う場合はオプションなしでOK!

$ make
$ make install



インストールに成功したら、、、このサンプルを書いてみましょう!
(といっても本家のexampleをそのまま使っています)

・example.js

var http = require('http');


http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');


保存したら、あとは実行するだけ!


$ node example.js


実行したら、URLにアクセスする!
http://localhost:8124/

画面に"Hello World"と出力されていればインストールは成功です!

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は便利です!
知っておいて損はないなー

・ガジェットのソース
var atndEdit = function() {
 //jsonp
 var url = 'http://api.atnd.org/events/?user_id=21348&count=5&callback=atndCallback&format=jsonp';
 var ele = document.createElement('script');
 ele.type = 'text/javascript';
 ele.src = url;
 document.body.appendChild(ele);
 //今日の日付作製
 var nowDate = new Date();
 var month = (nowDate.getMonth() + 1);
 month = month.length === 2 ? month : '0' + month;
 var day = nowDate.getDate();
 day = day.length === 2 ? day : '0' + day;
 var nowStrDate = nowDate.getFullYear() + month + day;
 //出力先
 var output = document.getElementById('atnd-div');
 var count = 0;
 return {
  disp : function(events) {
   var eventDate = events.ended_at.substring(0, 10).replace(/-/g, '');
   if(eventDate < nowStrDate) {
    if(count == 0) {
     output.innerHTML = '参加予定のイベントはありません';
    }
    return;
   }
   count++;
   var title = events.title;
   var url = 'http://atnd.org/events/' + events.event_id;
   var start = events.ended_at.substring(0, 10);

   var ele = document.createElement('a');
   ele.href = url;
   ele.target = '_blank';
   ele.innerHTML = title;

   var date = document.createElement('span');
   date.innerHTML = '・' + start + '';
   output.appendChild(date);
   output.appendChild(document.createElement('br'));
   output.appendChild(ele);
   output.appendChild(document.createElement('br'));
  }
 };
}();
function atndCallback(data) {
 var events = data.events;
 for(var i = 0; i < events.length; i++) {
  var eventDate = events[i].ended_at.substring(0, 10).replace(/-/g, '');
   atndEdit.disp(events[i]);
 }
}

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に登録されている一覧が表示されます。
さらに追加で登録を行うと、下記のようになります。


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


・ソース
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変更されたストレージへの参照。
使い方
なぜか、イベントで処理をするとブラウザがクラッシュすることがありますので、気をつけてください。
使い方が悪いのか?それともブラウザがまだちゃんと対応されていないのか?

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


-worker.js


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


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

-index.html


-worker.js
■解説 ①Workerに対して、データを送信する。 ②WorkerがpostMessageをした場合に呼ばれる。 Workerには無駄にカウントアップする処理が含まれている、 通常ならブラウザがロックされてしまい、スクロールができなくなる。 でも、今回はWorkerを使用しているのでDOM側がロックされる事がない。 試しにサンプル画面でスクロールをして見てください。

2010年5月24日月曜日

HTML5のpostMessageを使ってみた

HTML内にあるiframeに対してメッセージを送信することができます。
まずはmain.htmlとframe.htmlのサンプルを見てください!

実際の画面はサンプルを見てください。

■サンプル
-main.html

-frame.html


■解説
otherWindow.postMessage(message, targetOrigin);
-otherWindow
別ウィンドウへの参照。次のような参照が保持されます。例えば、iframe 要素のcontentWindow プロパティの利用、window.open によって返されるオブジェクト、あるいは、 window.frames における名前付きか数による添え字。
-message
送信したい文字列データ
-targetOrigin
イベントが伝達されるべき otherWindow の生成元を "*" というリテラル文字列(指定しないことを示します)か URI のいずれかで指定します。もしイベントが targetOrigin で指定されたものにマッチしない otherWindow の文書のスキーマ、ホスト名、あるいは、ポートに伝達するようになっている場合、そのイベントは伝達されません。つまり、3 つすべてがマッチした場合にだけイベントが伝達されます。この仕組みはメッセージが送られる場所の制御を提供します。例えば、postMessage をパスワードを送るために利用する場合、悪意のある第三者によるパスワードの傍受を防ぐためにこの引数が意図されたパスワードを含むメッセージの受け手と同じ生成元である URI であることは絶対的に致命的なものになるでしょう。

ここで、今回はjson形式の物をframeに対して渡しています!
せっかくjson形式で渡しているのですが、postMessageで扱えるのは文字列だけです。
よって、受け取り側でも文字列として受け取ってしまいます。
なので今回は、evalを使い文字列からjson形式に変換しています。

2010年5月9日日曜日

HTML5の Canvasで動くものを作ってみた

前回のHTML5の Canvasを使ってみたにて単純な三角形を作ってみました。

ただの三角形だとつまらないので、この三角形を動くようにしてみました!

三角形を動かす仕組みは、setIntervalを使って数秒おきに図形を描いています。

ただーし、図形を描くだけならすぐに出来るのですが、図形を消す方法がわからなかった。
ので、調べました!

context.clearRect(x,y,w,h)を使います!
消す方法はこれしか無いようです。
この関数の引数に消す範囲を渡します。そうすると、その範囲内の図形が消されます。

・ただ、三角形がウニョウニョ動くだけのソースです

・ブラウザが対応していれば、下記リンクから見れます
サンプル

HTML5のCanvasを使ってみた

■HTML5のCanvasとは
JavaScriptを使って、図形を書くことができるものです!
線、四角形、円などいろいろな図形をかけます。

■試しに使ってみた
・作る図形


・ソース
・ブラウザが対応していれば、下記リンクから見れます
サンプル

・解説
-beginPath()
サブパスのリストを空にして、コンテキストのサブパスが 0 個となるようにします。
今回でいうと、関係ないですが一応書いておいきます!

・moveTo(x,y)
指定された地点で新規のサブパスを生成します。
要するに、初期値店を指定することと同意です。

-lineTo(x,y)
コンテキストにサブパスがなければ、(x, y) に対するサブパスを定義します。コンテキストにサブパスがあれば、サブパスの終点から座標 (x, y) に向けて直線を引きます。そして、サブパスに、座標 (x, y) を追加します。
最初にmoveToにてサブパスが生成されていない場合は、線が引かれることはなく、サブパスの定義で終わります。

-closePath()
現在のサブパスを閉じていると記録し、その閉じたサブパスの開始と終了と同じ地点で、新たなサブパスを開始します。

-stroke()
現在のストローク・スタイルを使って、サブパスに線を引きます。

2010年2月25日木曜日

Googleカレンダーの直近スケジュールを表示させる

GoogleカレンダーにIT関連イベントを登録しているのですが、このデータをブログのサイドに表示させたかったので作ってみました。
実際に作成したものは、このブログのサイドに表示させています。

■データ取得方法
まずは、Googleカレンダーからカレンダー情報をJSONP形式で取得します。
JSONP形式のデータを取得するためには、下記URLで実現できます。
http://www.google.com/calendar/feeds/bosh0h7tg9ddmhav7a537bguh4%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertCalendar

もし、自分のカレンダーで試したいのであればURLを下記のようにしてください
"http://www.google.com/calendar/feeds/" + GoogleカレンダーURL + "/public/full?alt=json-in-script&callback=insertCalendar"

これで、JSONP形式でレスポンスを得ることができました。
callback関数名はパラメータに渡したinsertCalendarになります!

ここまでくればあとちょっと!

日付順で取得したいので
"orderby=starttime&sortorder=ascending"をパラメータに追加!

未来の予定が欲しいので
"futureevents=true"をパラメータに追加!

最大件数は7件がいいので
"max-results=7"をパラメータに追加!

これでURLが完成!
http://www.google.com/calendar/feeds/bosh0h7tg9ddmhav7a537bguh4%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertCalendar&orderby=starttime&max-results=7&singleevents=true&sortorder=ascending&futureevents=true

ちなみに参考API
http://code.google.com/intl/ja/apis/gdata/docs/json.html

■データ表示
前回のJSONPの使い方で紹介した方法を使い表示部分の実装していきます。

コールバック関数名がinsertCalendarなので、この関数名で実装します。
今回、このブログでは下記のソースを使用しています。

var edit = function() {
// ① scriptタグを出力し、サーバから取得できる下記文字列をHTML上に展開させる
// insertCalendar({jsonデータ});
var url = 'http://www.google.com/calendar/feeds/bosh0h7tg9ddmhav7a537bguh4%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertCalendar&orderby=starttime&max-results=7&singleevents=true&sortorder=ascending&futureevents=true';
var ele = document.createElement('script');
ele.type = 'text/javascript';
ele.src = url;
document.body.appendChild(ele);
// 文字列を出力する場所を取得
var output = document.getElementById('ak-javascript');
return {
disp : function(events) {
// ③ 1個のイベント情報を表示様に整形して行く
var title = events.title.$t;
var content = events.content.$t;
var start = events.gd$when[0].startTime;
var link;
if(content) {
var contents = content.split('\n');
for(var i = 0; i < contents.length; i++) {
var con = contents[i];
if(con.indexOf("http",0) == 0) {
link = con;
break;
}
}
}
var ele;
if(link) {
ele = document.createElement('a');
ele.href = link;
ele.target = '_blank';
ele.innerHTML = title;
} else {
ele = document.createElement('span');
ele.innerHTML = title;
}
var date = document.createElement('span');
date.innerHTML = '・' + start + '';
// ④ HTML上に出力する
output.appendChild(date);
output.appendChild(document.createElement('br'));
output.appendChild(ele);
output.appendChild(document.createElement('br'));
}
};
}();
// ② コールバック関数
function insertCalendar(data) {
var feed = data.feed;
if(!feed) {
return;
}
var events = feed.entry;
for(var i = 0; i < events.length; i++) {
edit.disp(events[i]);
}
}

■解説
ソースの①~④までが順番に呼ばれます。
①にて、scriptタグをHTML上に出力すると、urlに書かれている場所からデータをダウンロードします。
ダウンロードしたデータにはinsertCalendarを実行するように記述されたデータが返されるため、②の関数が実行されます。
②の関数の実行時に渡されるjsonデータを分解し、1個ずつの登録データに分けて出力処理を行います。
③にて、データの整形を行っています。今回はカレンダーに登録されている詳細情報からURLを抽出して、リンクをつけるように整形しています。
最後に、④にてHTML上に出力を行っています。

以上の流れで、このブログ上にGoogleカレンダーから取得したイベントデータが表示されています。

JSONPを使うことによって、このように別のサーバからデータを取得することができます。
そして、アイデア次第でいろんな便利な事ができます!
ぜひ試してみてください!

JSONPの使い方

JavaScriptで別のドメインのデータを取得したいとすると、クロスドメイン問題にぶつかると思います。
この問題を解決するためには、JSONP(JSON with paddingの略)というモノを使用することになると思います。
他にも方法はありますが、きっとこれが一番簡単なのではないでしょうか?

実際の使い方を書きます
下記URLにアクセスすると、
http://always.ddo.jp/blog/jsonp/test.jsonp

test( { "name" : "hoge", "age" : "100" } );
このような文字列が返却されます。

この文字列をよく見ると、
javascriptのtest関数に'{ "name" : "hoge", "age" : "100" }'というjson形式のデータを渡しているように見えると思います。

JSONPについては、これが全てです!

下記ソースをFirebugのコンソールなどに貼って実行してみてください。

別のドメインの情報を取得して、ページ内で取得データを使用できるようになりました!

■解説
ソースに存在する無名関数にて、scriptタグを生成しています。
このscriptタブのsrc属性に、最初に記述したjsonpデータを返却するURLを記述します。
そうすると、帰ってきたデータがクライアントのHTML上に展開され、javascriptのtest関数を呼びます。
test関数は、自分で好きな様に記述できるので、引数を受け取って今回はalertしています。

次回はGoogleカレンダーと連携した、もう少し面白い使い方を紹介したいと思います。