2012/12/04
JSからstyleの設定のメモ
JavaScriptから style プロパティでスタイルを設定するのに
軽くはまったのでメモ。
要素にスタイルを設定する時って style["test-align"] と
style["testAlign"] のどっちでも良いと思ってたが
違うらしい。
DOMとjQueryで4パターンを各ブラウザで試してみた。
Cheome,Safari:
Firefix(ESR10),IE8:
結論としてはブラウザ依存らしい。
確認していないがキャメルが正式な仕様なんだろう。 jQuery が頑張ってくれちゃうので勘違いしてたんだろうね。
また、やりそうだなこれ (^^;
getElementById(id).style["backgroundColor"]="red" getElementById(id).style["background-color"]="red" $("#id").css("backgroundColor","red"); $("#id").css("background-color","red");実行結果。
Cheome,Safari:
Firefix(ESR10),IE8:
結論としてはブラウザ依存らしい。
確認していないがキャメルが正式な仕様なんだろう。 jQuery が頑張ってくれちゃうので勘違いしてたんだろうね。
また、やりそうだなこれ (^^;
2012/11/25
jQueryのテーブル・プラグインを作ってみた
jQueryのテーブル・プラグインはググれば一杯出てくるんだけど
細かい動作が思った通り行かなかったり、
デザインが合わなかったり、
で以外とカスタマイズにコストがかかる。
と言うわけで自分の好みのテーブル・プラグインを作ってみた。
基本方針はエクセルっぽい雰囲気 (^^;。
こんな機能で
使い方:
ExTable
IE8 でも一応動いてる。 IE6,7はギブアップ (^^; 扱えるレコード数は IE8 前提なら 100レコードくらい。
Chromeなら500くらい有っても何とかしてくれる。 コードは結局、CSSが150stepくらいで、JSが 600step くらい。
カスタマイズするのにお手軽って程でも無い感じ。
ソースが見たい人は以下からどうぞ。( っ・ω・)っドゾォ タウンロード:
こんな機能で
- カラム幅の動的変更
- カラム順序の動的変更
- ソート
- ヘッダ固定
- カラム幅に合わせたセル内での行の折返し
- セルの表現方法のカスタマイズ
使い方:
IE8 でも一応動いてる。 IE6,7はギブアップ (^^; 扱えるレコード数は IE8 前提なら 100レコードくらい。
Chromeなら500くらい有っても何とかしてくれる。 コードは結局、CSSが150stepくらいで、JSが 600step くらい。
カスタマイズするのにお手軽って程でも無い感じ。
ソースが見たい人は以下からどうぞ。( っ・ω・)っドゾォ タウンロード:
- http://code.google.com/p/kotemaru/downloads/list
-> ExTable-demo.tgz
2012/10/08
RedmineのREST機能を使ってみた
今の案件は Redmine を使ってる。
実は Redmine を本格的に使うのは初めてだったりする。
で、使ってみた感想、「チケットに埋もれる...w」
使い方の問題のような気もするのだが、
基本的にチケットの重み付けがプロジェクト全体の物しか無く
ユーザ毎の重み付けが無いのでチケットの管理がしづらい。
ぶっちゃけ、他人に振られたチケットとか興味無いし、
自分にとってのチケット意味付けが欲しいんだよね。
ウォッチャーとかは有るけども「管理責任のあるチケット」も
「単なるオブサーバのチケット」もごちゃ混ぜなのであまり使えない。
で、前置きが長くなったが Redmine には WebAPI で XML や JSON
でチケットの情報を取得できる機能が付いていることに気がついた。
これを使って俺様的チケット管理が出来るんじゃ無いかと思い調べてみた。 API の仕様はこの辺{
"issues": [
{
"id": 1117,
"project": {
"id": 9,
"name": "Wiki Extensions"
},
"tracker": {
"id": 2,
"name": "Feature"
},
"status": {
"id": 1,
"name": "新規(New)"
},
"priority": {
"id": 4,
"name": "通常(Normal)"
},
"author": {
"id": 3,
"name": "Haru Iida"
},
"assigned_to": {
"id": 3,
"name": "Haru Iida"
},
"fixed_version": {
"id": 187,
"name": "0.6.0"
},
"subject": "Compatible with redmine 2.1",
"description": "",
"start_date": "2012-10-07",
"done_ratio": 0,
"created_on": "2012-10-07T09:10:27Z",
"updated_on": "2012-10-07T09:10:27Z"
},
…
],
"total_count": 240,
"offset": 0,
"limit": 25
}
サマリ的に必要な情報は一通り取得できるようだ。
デフォルトでは25件単位にページングする。
これを使って俺様的チケット管理が出来るんじゃ無いかと思い調べてみた。 API の仕様はこの辺
- 英語:
http://www.redmine.org/projects/redmine/wiki/Rest_api - 日本語(古い):
http://www.r-labs.org/projects/r-labs/wiki/Redmine_REST_API
実際に動かしてみる
- http://www.r-labs.org/issues.json
実際に使いそうな機能を確認
- プロジェクト指定:
/issues.json?project_id={id} - ステータス制限:
/issues.json?status_id={open|closed}{id} - 更新日範囲指定:(*1)
/issues.json?updated_on=><2012-03-01|2012-03-07 - 更新日ソート:(*1)
/issues.json?desc=updated_on - ウォッチャー指定:
出来ない
- カスタムクエリ指定:
/issues.json?query_id={id}
その他
ちなみに更新機能もあるようだが今回はそこまで考えていないのでパス。 こんな感じで Web-Mail 風にチケット管理したいなーと思って鋭意作成中。 今の案件には間に合いそうも無いけどw2012/09/02
enchant.js向けマップエディタ
enchant.js 向けマップエディタを 9leap に上げて有ったのだが
こっちに書くのを忘れてたんで書いとく。
enchant.js には一応、マップエディタがあるのだがあまりに貧弱で
ゲームを作るのに支障をきたすので自前で作ってみた。
方針としては
- UNDO,REDOが効く。
- レイヤーが使える。
- 複数チップを矩形で切り貼りできる。
- ブラウザの localStrage に保存できてダウンロードできる。
- フォーマットはJSON形式。
- マニュアルレスでもなんとなく使える。
(画像は縮小してます)
2012/07/15
Google Mapでカスタムの吹き出し その2
最近 Google Mapでカスタムの吹き出し の記事にアクセスが多い。
内容が外部サイト紹介だけでは体裁が悪いので自分でもすこし汎用に使えそうな
コードを書いてみることにした。
とりあえず 角丸に尻尾(ひげ)付きの有りがちなマンガ風の吹き出しを CSS だけで作ってみた。
Chrome:
Firefox:
IE8:一応動いたが角丸はできない。IE7 は未確認。
× ボタンもテキストにしたが見栄えが良くないのでここだけは画像の方が良さそう。
GMapBalloon-v0.1.js:
function GMapBalloon() {this.initialize.apply(this,arguments);}
(function(Class){
Class.prototype = new google.maps.OverlayView(); // extends
var OPTS = {
tailW: 12, tailH: 12, tailColor: "black",
round: 6, padding: 6,
border: "1px solid black",
background: "white",
closeImg: "close.png", closeSize: 8
};
Class.prototype.initialize = function(map, $innerElem, opts) {
var self = this;
this.opts = $.extend(OPTS, opts);
$innerElem = $innerElem ? $innerElem : $("");
$innerElem.css({
position: "relative",
top: "0px", left: "0px"
});
// 外枠
var $outerElem = $("");
$outerElem.css({position: "absolute"});
// 本体
var $body = $("");
$body.css({
position: "relative",
background: this.opts.background,
padding: this.opts.padding+"px",
borderRadius: this.opts.round+"px",
border: this.opts.border
});
// 尻尾(ひげ)
var $hige = $("").css({
position: "relative", width:0,
margin: "-1px auto 0 auto",
borderLeft: this.opts.tailH+"px solid "+this.opts.tailColor,
borderBottom: this.opts.tailW+"px solid transparent",
});
var $innerHige = $("").css({
position: "absolute", width:0,
marginLeft: -(this.opts.tailH-1)+"px",
borderLeft: (this.opts.tailH-3)+"px solid white",
borderBottom: (this.opts.tailW-3)+"px solid transparent",
});
// ×ボタン
var $close = $("
実行サンプル:
GMap test
東京駅
バルーンのテストです。
以上。
×
").css({
position: "absolute",
top: "1px", right:"4px",
cursor: "default",
font: "bold 12px fixed", color:"red"
});
// 画像用
//$close.attr({
// "src": this.opts.closeImg,
// "width": this.opts.closeSize,
// "height":this.opts.closeSize,
//});
$close.bind("click", function(ev){self.close()});
$body.append($innerElem);
$hige.append($innerHige);
$outerElem.append($body);
$outerElem.append($hige);
$outerElem.append($close);
this.outerElem = $outerElem[0];
this.innerElem = $innerElem[0];
this.close();
this.setMap(map);
}
// Map から callback.
Class.prototype.onAdd = function() {
// レイヤーにこのdivを張り込む
var panes = this.getPanes();
panes.floatPane.appendChild(this.outerElem);
}
// Map から callback.
Class.prototype.draw = function() {
if (this.marker == null) return;
// 経度緯度から画面座標系に変換
var pos = this.getProjection().fromLatLngToDivPixel(this.marker.getPosition());
if (!pos) return;
var icon = this.marker.getIcon();
var iconH = icon ? icon.size().height : 32;
var w2 = this.outerElem.offsetWidth/2-this.opts.tailW/2;
var h2 = this.outerElem.offsetHeight+iconH;
$(this.outerElem).css({
visibility: "visible",
left: (pos.x-w2)+ "px",
top: (pos.y-h2) + "px"
});
}
Class.prototype.open = function(tgtMarker, html) {
this.close();
this.marker = tgtMarker;
if (html) $(this.innerElem).html(html);
this.draw();
}
Class.prototype.close = function() {
$(this.outerElem).css({visibility: "hidden"});
}
Class.prototype.isVisible = function() {
return $(this.outerElem).css("visibility") != "hidden";
}
Class.prototype.addEventListener = function(type, func, cap) {
this.innerElem.addEventListener(type, func, cap);
}
})(GMapBalloon);
バルーンのテストです。
2012/05/27
9leapに投稿してみた
昔作ったシューティングゲームをHTML5に移植して 9leapに投稿してみた。
結局 enchant.js は使っていない。
enchant.js は DOM ベースで実装されている為、
iPhone 等で実行するとかなり遅い。
fpsを表示するゲームが投稿されていたので iPod4
で実行してみたところ 10fps 程度しか出ていなかった。
シューティングにはちょっと厳しい。
なので Canvas でフルスクラッチしたのだがこれだと
30〜40ms/frame で 20fps を余裕を持って確保できた。
結構遊んでもらえて色々コメントも付くので 9leap は結構楽しいかも。
ソースに興味有る人はここからどうぞ、なのだけど未整理なのでホントに参考程度です。
- http://kotemaru.googlecode.com/svn/trunk/k-games/war/tatesyu/
2012/05/21
9leapのHTML5ゲームコンテスト
HTML5のゲーム用フレームワークに enchant.js
と言うのを見付けた。
iPhone/Android向けなのだがこれの開発元がゲームコンテストを
開いていて数百の投稿が有る。
- http://9leap.net/
2012/05/11
html5のDOMとCanvasの描画性能
「ビー玉ころころ」でDOM(imgタグ)とCanvasを使った場合の
描画速度に差があるのか気になったので調べてみた。
こんなサイトを見付けた。
で、PCでの結果を見ると Canvas 圧勝。
テストコードが公開されていたのでiPodTouch4で試してみた。 テストコード:指定した個数の矩形画像が下に流れ落ちる。 500個の画像を処理させてみた。 DOMの結果: 12fps Canvasの結果: 26fps となり、Canvasの方が2倍くらい早い結果となった。 PC用のテストコードなのでテスト方法が妥当か疑問の余地があるが まあ納得の行く結果だと思う。 ゲームの様な性能の要求される描画ではCanvasを使えって事だな。
- 参考:HTML5はFlashの3倍重かった! 描画パフォーマンスの比較
http://clockmaker.jp/blog/2012/02/html5-flash-draw_performance/
で、PCでの結果を見ると Canvas 圧勝。
テストコードが公開されていたのでiPodTouch4で試してみた。 テストコード:指定した個数の矩形画像が下に流れ落ちる。 500個の画像を処理させてみた。 DOMの結果: 12fps Canvasの結果: 26fps となり、Canvasの方が2倍くらい早い結果となった。 PC用のテストコードなのでテスト方法が妥当か疑問の余地があるが まあ納得の行く結果だと思う。 ゲームの様な性能の要求される描画ではCanvasを使えって事だな。