関西Javascriptの雄、noriさんが中心となってコーダー/デザイナー向けLT勉強会「.coder(どっとこーだー)」を主催される、ということでSession1テーマ「Javascript」で喋ることになりました。
最初はjQuery1.4で追加された機能でもタラタラ並べ上げようかとも思ってたんですが、なんかそれも面白くない。
O3Dで3D描画とかも考えたけど、LTだと「こんなん出来ますよ」が関の山。
フロントだけで完結しちゃうデザイン周りを触るようなJSのお話は誰かがしてくれるだろうし。
んで、これはある方とお話してる時にチラリと言われたことなのだけど、「サーバー側を理解しているJSer」。
ということでサーバーとのやりとりをAjax通信で行うときのTipsを題材にしようと思いました。
サーバー側とのやりとりで、小ネタを喋るより先にセキュリティが大事でしょ、ということで、そこら辺の話をさくっとしようと思います。
やっぱり肝はサーバー側の処理になってくるんですが、こういったセキュリティ対策が必要、という認識をフロント側も持っているだけで、実装の漏れを防ぐことが出来ますしね(Ajax通信でやりとりをしたことがないサーバー側担当って意外に多い)
残念ながら既に定員マックス(というかオーバー)なので追加での参加は難しいかと思いますが。。。
参加される皆様、相変わらず小難しい話しますが、お付き合い下さいませ。
HTML5規格ではブラウザ上で3Dがウンタラ、とかありますが、イマイチ資料など目に付かず。
ブラウザでイケる3D APIといえば、MozillaのCanvas:3Dか、GoogleのO3D。んで、ようやく策定の始まった(?)WebGLと。
HTML5はWebGL規格になるのかな?誰かkwsk。
ま、そんなん待ってても仕方ないので、いっちょ実装してみることに。
互換性を大事にAPIを単純にしてしまってるCanvas:3Dではなく、結構エグいことが出来るO3Dを選択してみました。O3Dのイケてるところは、GPUを活用できちゃう、という点。
Actionscript3+Papervision3Dでなくても、高速に綺麗に3Dの描画が行けるんちゃうか?ということなんですなぁ。
ということで、実装した感じは…
の前に、再生するにはプラグインをインストールする必要があるので、まずは
http://code.google.com/intl/ja/apis/o3d/
上記URLページの右側にある「O3Dのダウンロード」を押してプラグインをインストールした後、いったんブラウザを再起動してから、
http://www.studio-bloom.net/public/o3d_pano/
をご覧くださいませ(環境によっては表示されない場合もあります)。
あぁ、ChromeかFirefoxでお願いしますよ。Mac?知らん。
画像の読み込みが終わるまでグレーになってますが、しばらくお待ちください。マウスでクリックしたまま動かすとグリグリできます。
平面プリミティブ6面を配置して、それぞれにテクスチャを貼り付けてるんですが、平面同士の境目が見えてしまってるんですよね…(PV3Dでは境目も出ないし動作が軽い)
境目を消すには、正方体プリミティブを作って各面にテクスチャを貼ることで解決できないかな?と思いつつ。ただ正方体プリミティブの面ごとにテクスチャを変える方法がイマイチ掴めず。。。ちょっと描画かプリミティブのパラメータをいじったらイイ感じにならないかな?と思ったりしてます。
結果としては、画質なんかはイイ感じなんだけど、GPU使ったりしてる割には妙に重い。PCの問題なのか、ブラウザの問題なのか?V8エンジンを使用すると速くなるよ、とのTipsもあるんだけど…(Chromeだけかよ!)
しかも、なぜかうちのノートPCではテクスチャ画像を読んでくれなくて(オフィシャルのサンプルも)再生できませんでした。
ちょっとここら辺はAPIの熟成を待つしかなさそうですねぇ。。。
再生するにはプラグインの導入が必要だし、一般的に使用されるようになるか、というのは疑問ちょっと疑問。WebGLも策定から各ブラウザへの実装がどれほど時間の掛かることか、と考えると、現状のAS3+PV3Dはしばらく鉄板な気がします。
jQueryも1.4にバージョンアップして、高速化しただけじゃなくていろいろ機能追加されてるそうで。
偶然KAYACさんのところで紹介されてて、感動してしまった機能をここでもご紹介。
それは…
$.proxy()
Takes a function and returns a new one that will always have a particular scope.
ということなので、関数を与えると特定のスコープを常に持った新しい関数を返しますよ、という訳であってるんだと思うんですが…
本家のサイトにあるサンプルでは
JAVASCRIPT:
-
var obj = {
-
name: "John",
-
test: function() {
-
alert( this.name );
-
$("#test").unbind("click", obj.test);
-
}
-
};
-
-
$("#test").click( jQuery.proxy( obj, "test" ) );
はい、便利ですね~
と、ちょうど作ってたのがJSでの動的な画像の読み込み。
FirefoxやChromeだと、普通に要素のsrc属性に画像のURLを指定してあげれば読み込み完了と同時に画像を差し替えてくれるのですが、そこはホラ、IEですよ、奥さん。
Imageオブジェクトのcompleteプロパティを監視してtrueになったときにsrcに突っ込んであげないと画像を切り替えてくれない、というオマケ付きな訳なんですよ…orz
そこで、setIntervalで定期的にループさせてプロパティを監視することに。
ということは読み込みが完了したときにはclearIntervalでループを止めないといけないですよね~
そんな時に、この$.proxy()が役に立つ!
JAVASCRIPT:
-
function ImageLoad() {
-
this.img=new Image();
-
};
-
-
ImageLoad.prototype = {
-
changeImage:function(e, s) {
-
this.elm = e;
-
-
this.img.src = s;
-
-
this.timer = setInterval($.proxy(function() {
-
if (this.img.complete) {
-
$(this.elm).attr('src', this.img.src);
-
clearInterval(this.timer);
-
-
}
-
}, this), 200);
-
}
-
};
-
-
var img = new ImageLoad();
-
-
$('hoge').click(function() {
-
img.changeImage('#image', 'path/to/image.jpg');
-
});
こんな感じで使えます。
$.proxy()が無いと、thisのスコープが変わっちゃうので、なんか適当な変数を用意して、とかちょっと力業で実装したりかと思うのですが、綺麗にコーディングできますね!
いや~いいですね!jQuery1.4!
他にも素敵な機能追加があったりするので、また紹介できれば。
神戸で毎月開催されているウェブの勉強会にてピーチクパーチクります。
今回はテーマが”HTML5&CSS3”ということで、「なんかそこら辺に絡む事を話せや」とお誘い頂いたので、Client-side Database strageについてお話することにしました。
HTML5から、Webのシステムで今や必須とも言えるデータベース(DB)を、サーバー上でなくローカルPC上で使えるようにしましょう、といった技術なんです。
めちゃくちゃ乱暴な言い方をすればCookieの高機能版(どちらかというと同じくHTML5で追加されたキーバリューストアという機能の方がCookieには近いのだが…)。
よく似た技術で、Google Gearにもこの機能がありましたね。結局HTML5で標準化されるのに伴ってGearの方は終了してしまいましたが。。。
「ローカルでもWebシステムが使用できる」という触れ込みだったかと思うのですが、これだけデバイスやインフラが整ってくると、あまりローカルに環境を持ってこなくても…と思ったりもしてしまう訳なんですが…
よく考えてみたら、iPhoneにもSafariが搭載されてるので(しかもClient-side DBは現在Safariにしか実装されてない)、簡単なiPhoneアプリくらいだと作れてしまうではないか、と。
ということで、今回の内容は簡単にClient-side DBの説明と、DBを操作するためのSQLのこれまた簡単な解説、クエリを投げるjsのコード紹介、んでこのDBを使って書籍を管理する超簡単なアプリの実演という流れで行こうと思ってます。
本当はアプリの実際のコードを追って行こうかとも思ったんですが、案外ボチボチな行数になってしまったので、実際のソースコードは配布してもらって、各自で見て頂くことになるかと思われ。
jQueryもちょこっと使ったりjsの説明は一切無しなので、そこらへんの知識が無いとツラいと思われますが、時間のこともあるので割愛御免。
興味のある方は是非ご参加ください。
日時:1/23(土) 13:30~17:30
場所:神戸元町 インキュベーションオフィスエリンサーブ KCCビル3F会議室
参加費:500円(運営費)
http://webteko.jp/
懇親会もありますので、そちらも是非w
あけましておめでとうございます。
本年もよろしくお願いいたします。
新年一発目のエントリは技術ネタ、というかTipsというか、あんまり使いどころがよく分からんというか。。。
javascriptは関数の引数に変数を与えなくても
JAVASCRIPT:
-
function hoge() {
-
var arg1 = arguments[0];
-
var arg2 = arguments[1];
-
-
return arg1+arg2;
-
}
-
-
var sum = hoge(1, 2);
なんて感じで引数を取ることが出来ちゃうんですけれども、これだと引数の順番が固定になっちゃったりで、いまいちフレキシブルではないので、もうちょっと柔軟に出来んもんか、と考えたのがオブジェクトを渡す方法。
JAVASCRIPT:
-
function hoge(args) {
-
var arg1 = args["arg1"];
-
var arg2 = args["arg2"];
-
-
return arg1 + arg2;
-
}
-
-
var sum = hoge({"arg1":1, "arg2":2});
キーと変数渡してやればどうでしょ?ということで。
で、何の役に立つねん?というとこなんですが、実行したい関数を変数で与えて、その引数が関数毎に微妙に違うけど、処理は共通、みたいな。ややこしや。
JAVASCRIPT:
-
var funcs = {
-
//var getMemberPhoto = function(args) { <- 文法ミス
-
getMemberPhoto : function(args) {
-
var params = {
-
member_id:args["member_id"]
-
};
-
...
-
},
-
//var getCategoryPhoto = function(args) { <- 文法ミス
-
getCategoryPhoto : function(args) {
-
var params = {
-
category_id:args["category_id"]
-
};
-
...
-
},
-
//var getPhotoByPeriod = function(args) { <- 文法ミス
-
getPhotoByPeriod : function(args) {
-
var params = {
-
start_date:args["start_date"],
-
end_date:args["end_date"]
-
};
-
....
-
}
-
};
-
-
function getPhotos() {
-
var func = $("input[name=select_func]:checked").val();
-
var params = {};
-
$("#" + func + " .params").each(function() {
-
params[$(this).attr("name")] = $(this).val();
-
});
-
-
if (typeof funcs[func] == "function") {
-
funcs[func](params);
-
}
-
}
(追記)JSの文法ミスってました(汗)
HTML:
-
<label><input type="radio" name="select_func" value="getMemberPhoto" />指定メンバーの画像取得
-
<label><input type="radio" name="select_func" value="getCategoryPhoto" />指定カテゴリの画像取得
</label>
-
<label><input type="radio" name="select_func" value="getPhotoByPeriod" />期間を指定して画像を取得
</label>
-
-
<div id="getMemberPhoto">
-
<select class="params" name="member_id">
-
-
...
-
</select>
-
</div>
-
-
<div id="getCategoryPhoto">
-
...
-
</div>
-
-
<div id="getPhotoByPeriod">
-
...
-
</div>
-
-
<input type="button" value="画像取得" onclick="getPhotos" />
と、こんな感じで使えるよね?ということで(引数、微妙にも違ってないし)。
要jQueryなコードで、且つ実際に組んだコードではないので(爆)←古い、動かない可能性大ですが何かの参考にでもなれば。
ってならんな、こんなん。どこで使うねん。
文字列の中からパラメータを抜き出したいとき、
JAVASCRIPT:
-
var hoge = "/member_id/29/".match(\/member_id\/(\d)\//);
-
if (hoge != -1) {
-
var member_id = Regexp.$1;
-
}
みたいな書き方が一般的だと思うんだけど、
JAVASCRIPT:
-
var member_id = "/member_id/29/".match(\/member_id\/(\d)\//)[1];
-
if (member_id != null) {
-
...
-
}
みたいな書き方も出来るよ、という覚え書き。
もち、複数の値を抽出したいときは前者の手法を使えば良し、ということで。
急に気温が高下するこの季節、椎間板ヘルニアはもとより頸椎ヘルニアも目を覚まし猛威を振るってくれるので2,3日死んでることがあるんですが、今年のは微妙に軽症が続いててシンドイなーと思ってたら、週末に来てくれました。
息してるだけで吐きそうな頭痛w
これはいむら整体院に行くしか!w(日曜日はお休みですよ)
閑話休題。
最初は非表示にしておいて、ボタンを押したときにGoogle Map表示させたい、という時なんかに起き勝ちなんだけど、地図の中心位置がおかしくて、半分がグレーで地図が表示されない、などの症状。
原因は地図を表示させる要素のサイズがまだ確定してない状態でGoogle Mapの処理が走ると、変なサイズで初期化されちゃう、ということらしい。
そんな時は要素のサイズが確定したタイミングで
案外知らないもので、1ピクセル四方の要素を作ってみたり画面外に要素を置いておいて、とかいろいろ試してみたんですが、結局は上記の1行で済んでしまったというオチなのでありますorz
ちなみに、地図の読み込みが終わったかどうかは
JAVASCRIPT:
-
var map = new GMap2(document.getElementById('map'));
-
// その他初期化処理
-
GEvent.addListener(map, "load", function() { ... });
ではイベントの登録が既に遅い(じゃいつ指定するのよ?と)、ということだそうで(というか使い方が違う?)、地図画像がすべて読み込まれたかどうかを
JAVASCRIPT:
-
GEvent.addListener(map, "tilesloaded", function() { ... });
で取ることができます。
が一応、"undocumented(ドキュメントに記載されてない)"情報のようなので、将来的な動作が保証されるものではない、ということをご承知おき下さいませ。
Google Map API 小ネタでした。
嫁と共に腹のサイズが成長し続けている今日この頃ですが、嫁の場合、産み落としてしまえば引っ込む一方、こちらの腹はなんかしないと引っ込まないわけで…
ということで先日から寝る前に腹筋を行ってたりはするんですが…
最近効果があると聞くのは、食べたものとかを記録するレコーディングダイエット。
食べたものを細かく書かないといけないので間食とかしなくなる、前の日に食べた量を確認できることで今日の食事量を調整できる、などなど実体験者の意見もあり、FM802のDJも実践中とか。
そこで燃えてくるのがレコーディングダイエットへの取り組みではなく、ソレ用のシステムを作ろうとしてしまう意識がメタボプログラマーたる所以か…orz
ということでお盆期間を使って作ってみました。その名も「痩せログ」。
サービスとして公開するには細かい調整などが必要なのでボチボチ進めるとして、とりあえず携帯からの投稿や流行のtwitterのBOTにつぶやくと記録できる機能など考えております。
そして、このサービスの怖いところは、登録した人同士には全て公開されてしまうという点。ダイエットをサボっちゃ居られないw
「激励」や「拍手」ボタンなんかも作らないとなぁ。
脱メタボを志すアナタ、乞うご期待w
- ブログの記事に投稿した画像を抽出して←これはWordpressのテンプレート
- Progressionで読み込んで
- CoverFlowみたいな←これはPapervision3D
ポートフォリオ的な物を作る。
ということで出来たのがコレ。
http://www.studio-bloom.net/public/portforio/
1は昨日の記事で、
2は案外すんなり行けて、
3で躓いてた。
ローディングのプリローダーなんかの実装がまだだったり、ボタンがボタンとも言えない作りだったりするのは実験だからです。言い訳です。
画面遷移なんかの実装が超簡単に作れちゃうProgression、マジオヌヌメです(というか乗り遅れすぎ…orz)
連日の妙なバタバタでお疲れ&返信の滞りがちな今日この頃です(関係者の皆様、申し訳ございません)。
そんな時にハマってしまった今回の一件。
「IE6でだけ、javascriptでsubmitさせてるのが効かない」
HTML:
-
<a href="javascript:void(0);" onclick="hoge();">fuga
</a>
で
JAVASCRIPT:
-
function hoge() {
-
...
-
document.form.submit();
-
}
が、FirefoxやChromeでは動くのに、IE6だと動かない罠。
答えは簡単で、
JAVASCRIPT:
-
function hoge() {
-
...
-
document.form.submit();
-
return false;
-
}
末尾でfalseを返しましょう、とそんだけ。
ということで、これは癖を付けておかなくちゃ駄目ですね~
週末は、親族の法事やパノラマ撮影、先輩のお見舞い。今日は今日とてママパパ教室に駆り出され、沐浴のお勉強。そこで妊婦体験とか言いながら疑似体験パーツを着けて辱められウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!
帰ってから収穫したバジルを一杯使った晩飯を作って食ったらバタンQ(古い)。風呂から上がって復活して、一仕事終えたところであります。
家がバジル臭い。