関西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 小ネタでした。
連日の妙なバタバタでお疲れ&返信の滞りがちな今日この頃です(関係者の皆様、申し訳ございません)。
そんな時にハマってしまった今回の一件。
「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(古い)。風呂から上がって復活して、一仕事終えたところであります。
家がバジル臭い。
CSSの制御というか、Classの制御というか。
CSSを直接触っちゃうより、Classを用意しておいて付加したり外したりのほうが何かと管理もしやすいでしょ?
JAVASCRIPT:
-
(function($) {
-
$(document).ready(function() {
-
$('#target tr:odd').addClass('odd');
-
});
-
})(jQuery);
targetというIDを持つテーブルの奇数行trにoddというクラスを追加してあげてます。
行数の多いテーブルだと、いちいち奇数行にクラスを指定してやるのも面倒だし、行の入れ替えが発生した日にゃぁ、アンタ。リアルで「キーッ!!!」って叫んじゃうってモンですよ。
Javascriptの使用がOKだったら、とてもとても助かるね。
でも例えば、テーブルが2つ続いてて、それらにも奇数行毎にClassを付加したい場合、単純に考えて…
JAVASCRIPT:
-
$('table tr:odd').addClass('odd');
としてしまうんだけど、1つめのテーブルが奇数行(例として5)で終わってしまった場合、2つめのテーブルのtrは「リセットされて1から」ではなく「5の続きの6から」となってしまい、なぜか偶数行スタート(本来は1だから奇数)になってしまい、具合が悪いことになっちゃうんですね~困る。
(解決法、探り中。末尾に空の<tr></tr>入れちゃうのでもOK。だけど文法的にはNG)
さらにGoogle Chromeで発見した不具合。
複数の要素を指定する時、コンマ(,)でセレクタを区切れば同時に選択できるのですが、
JAVASCRIPT:
-
$('table tr:odd, ul li:odd').addClass('odd');
IEやFirefoxでは意図したとおりの動きになってるんですが、Chromeだけは最初の要素しか識別してくれない。単純な解決方法は、
JAVASCRIPT:
-
$('table tr:odd').addClass('odd');
-
$('ul li:odd').addClass('odd');
2行に分割…orz
うーむ、ちょっと切ないですね…
ちょっと検証が甘いですが、便利なjQueryもちょっとした落とし穴が用意されていますよ…というお話しでした。それでも便利すぎて手から離せないjQueryなのです。罪なヤツ。
二宮さん(design studio PENCIL)から「jQueryネタで1時間喋れ」とお達しが来てしまったので、京都で立ち上がったグループ「Web★Choco@KYOTO」でデザイナーさん向けのjQuery導入をテーマに喋ってきました。
資料作りの最中に紆余曲折あり、当初予定していた手法でのプレゼン資料ではなく、パワーポイントで作り直すハメに。これが当日の午前3時。そこからコピペ&原稿追加&アニメーションなどの調整をして、5時半に就寝。早めに起きて再調整。
早めに出て、嫁と外で飯を食ってから行こうと思ったけど結局その余裕もなく、一緒に家を出たものの1本早い電車に乗って、京都は烏丸にある会場「ちおん舎」に向かいました。
天然方向音痴の自分は、当然の如く駅を出て逆に進んでしまい、なかなかの距離を歩いて目的地へ到着。京都の歴史ある建物でのプレゼンです。とても雰囲気が良いです。
しばらく皆さんが集まるのを待って会が始まりました。
スピーカー1人目は二宮さんで、タイポグラフィーの話。
が、資料の最終確認と調整をしてたので、あまり聞いてません(爆)
1つめのレクチャー終了後、自己紹介タイムと休憩時間。当初喋らないはずだった自己紹介も急遽喋ることになり。。。あまり何を喋ったのか覚えてません。休憩時間も手直しやら眠いやら…
そうこうしてたら自分が喋る番になって。
今回は、「過去にトライしたけど挫折した」、「これからちょっと始めてみたい」、というデザイナーさんに向けた内容を心がけてたので、ちょっと自分としては使用するのが微妙な表現方法なども織り交ぜてしまいながらのプレゼンでした(本職のプログラマーさんからすれば反感買うかもしれない的な)。
順を追って見てもらって、考え方や雰囲気を掴んでもらえたらイイかな?という期待を込めて、これまた予定していなかったライブコーディング(実際にその場でコードを書きながら説明する)をやることにしました(決めたのは当日の午前5時w)。
緊張していないように見えて実は相当しているので、ライブコーディングで単純なミスにすぐに気付くことが出来ず大焦りしてしまった場面が。しかし、スピーカーから「あれが悪いんじゃない?」とか声を上げて下さったので、「これはいい(ニヤリ)」と、“みんなでバグを探して考えてみよう“的な流れに無理矢理持ち込んでみたところ、結構な盛り上がりになってくれてシメシメ。
思わぬ所で、雨降って地固まるというか雨のあとは上天気というか。
持ち時間も数分オーバーで収まって、なかなか良いプレゼンだったのではないかな?と、終わった後に声を掛けて下さったリスナーの方達の反応からも伺うことができた気がします。
んで、質問タイムの時に出た「初心者にお勧めの書籍も紹介すべきでは?」という事だったので今日、本屋に行って立ち読んできました。あまり冊数は無かったのですが、その中でも自分的に良書だな、と思ったのはMYCOM BOOKSの「実践!Ajaxフレームワーク jQuery」です。“Ajax“と入っているので、初心者向けとは異なるのかな?と思ったんですけど、意外とそうでもなく今回のプレゼント併せて読むとイイ感じなのでは無いかな?という印象でした。
興味のある方は読んでみて下さいね。
当日使用した資料は、Web★Choco@KYOTOのサイトにあるのですが、登録とかしてなくても見られるのかな?
興味のある方はご覧下さい。
まー、そんなに喋れるネタを持ち合わせている訳では無いのですが、またこういう機会を与えていただければ喋ってみたいと思います。
たぶんVol.2とかもやるのだと思うので、興味のある方はmixiのコミュニティーなど参加してみては如何でしょうか?