« 2008年01月 | メイン | 2008年03月 »
<やる夫> ____ / \ そういえばボケモントレーナーを実装したときに / ─ ─\ punch()メソッドやkick()メソッドを / (●) (●) \ オーバーライドしたな。。。 | (__人__) | / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ /
class Hero {
punch()
kick()
jump()
display()
fly()
}
class ボケモントレーナー extends Hero {
punch(){
// ボケモントレーナー自身はパンチ出来ない。
// 保持しているボケモンにパンチの指示を出す。
}
kick(){
// ボケモントレーナー自身はキック出来ない。
// 保持しているボケモンにキックの指示を出す。
}
display(){
// ボケモントレーナー
}
}
<やる夫> ____ /⌒ ⌒\ だったら、飛ばないヒーローは、fly()メソッドを /( ●) (●)\ 空実装してやればいいお /::::::⌒(__人__)⌒::::: \ | |r┬-| | \ `ー'´ /
class サザエさん extends Hero {
display(){
// サザエさんの表示
}
fly(){
// サザエさんは飛ばない。なにもしない。
}
}
<やる夫> ____ /⌒ ⌒\ これで飛ばないヒーローたちを実現できるおww /( >) (<)\ どう考えても天才の発想だおwww /::::::⌒(__人__)⌒::::: \ | /| | | | | | \ (、`ー―'´, /  ̄ ̄ ̄ <アーキテクト> お前はウチのきゅんぽな企画のこと知ってて言ってんのか? ヒーローたちはリリースしても数ヶ月ごとにバージョンアップする。 ヒーローが追加される可能性だってあるわけだ。 てめぇはその度にfly()メソッドなんかを調べて オーバーライドしていくのか? / ̄ ̄\ / \ |:::::: | . |::::::::::: | |:::::::::::::: | . |:::::::::::::: } ....:::,, .. . ヽ:::::::::::::: } ,):::::::ノ . ヽ:::::::::: ノ (:::::ソ: . /:::::::::::: く ,ふ´.. -―――――|:::::::::::::::: \ -―,――ノ::ノ―― |:::::::::::::::|ヽ、二⌒)━~~'´ <やる夫> ____ /⌒ ⌒\ ホジホジ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ ? | mj |ー'´ | \ 〈__ノ / ノ ノ
<やる夫> じゃあPunchableとかKickable、Flyableインターフェイスを 作ってこいつを必要なヒーローにインプリメントすりゃいいお。 ____ /⌒ ー、\ /( ●) (●)\ /::::::⌒(__人__)⌒:::::\ | |r┬-/ ' | \ `ー'´ / <アーキテクト> / ̄ ̄\ / _ノ \ | ( ●)(●) てめぇはもう喋るんじゃねー . | (__人__)____ | ` ⌒/ ─' 'ー\ . | /( ○) (○)\ . ヽ / ⌒(n_人__)⌒ \ ヽ |、 ( ヨ | / `ー─- 厂 / | 、 _ __,,/ \
/ ̄ ̄\ <アーキテクト> / _ノ \ | ( ●)(●) . | (__人__) Heroスーパークラス作ったから | ` ⌒´ノ てめぇが作るヒーローはこいつを継承して使えや . | } . ヽ } ヽ ノ / く | \ | |ヽ、二⌒) | \ __ / _ (m) _ |ミ| / `´ \ ____ /⌒ ⌒\ <やる夫> /( ●) (●)\ わかったおwww余裕だおww /::::::⌒(__人__)⌒::::: \ | |r┬-| | \ `ー'´ /
class Hero {
punch()
kick()
display()
}
//> add yaruo hero class 20080226
class ガンダム extends Hero {
display(){
// ガンダムの表示
}
}
class アトム extends Hero {
display(){
// アトムの表示
}
}
class ウルトラマン extends Hero {
display(){
// ウルトラマンの表示
}
}
・・・・ほかにもたくさん
//< add yaruo 20080226
_______ :/ ̄| : : ./ / # ;,; ヽ :. | ::| /⌒ ;;# ,;.;::⌒ : ::::\ : | ::|: / -==、 ' ( ●) ..:::::| ,― \ | ::::::⌒(__人__)⌒ :::::.::::| : で、できたお。。。 | ___) ::|: ! #;;:.. l/ニニ| .::::::/ | ___) ::| ヽ.;;;//;;.;`ー‐'ォ ..;;#:::/ | ___) ::| .>;;;;::.. ..;,.;-\ ヽ__)_/ : / \
ふむ。スーパークラスにfly()メソッドを追加すりゃ 全ヒーローが飛べるようになる。 ____ / \ / ─ ─\ / (●) (●) \ | (__人__) | / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ / こんなんよゆうだおwwwww ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
class Hero {
punch()
kick()
display()
// add yaruo 20080226
fly(){ /*ヒーローを飛ばすいろんな処理*/ }
}
あんな要求だったから 挙動なんて大して確認してないお。。。。 ______ / \ /\ / し (>) (<)\ | ∪ (__人__) J | ________ \ u `⌒´ / | | | ノ \ | | | ____ / \ ─\ チラッ / し (>) (●)\ | ∪ (__人__) J | ________ \ u `⌒´ / | | | ノ \ | | | ____ /::::::─三三─\ /:::::::: ( ○)三(○)\ |::::::::::::::::::::(__人__):::: | ________ \::::::::: |r┬-| / | | | ノ:::::::::::: `ー'´ \ | | |
java LdapViewer > log.txt
// LDAP関係
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
public class LdapViewer {
public static void main( String[] args ) {
try {
// InitialDirContextの作成
Properties env = new Properties();
env.setProperty( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
env.put( Context.PROVIDER_URL, "ldap://ldapサーバ:ポート" );
env.put( DirContext.SECURITY_PRINCIPAL, "アカウント" );
env.put( DirContext.SECURITY_CREDENTIALS, "パスワード" );
InitialDirContext ctx = new InitialDirContext( env );
//検索して結果を表示
SearchControls ctrl = new SearchControls();
ctrl.setSearchScope( ctrl.SUBTREE_SCOPE );
NamingEnumeration topLvlSrch = ctx.search( "OU=探すOU,DC=探すDC", "cn=アカウント", ctrl );
while ( topLvlSrch.hasMoreElements() ) {
SearchResult srchRslt = ( SearchResult )topLvlSrch.next();
Attributes atrs = srchRslt.getAttributes();
NamingEnumeration atrSrch = atrs.getAll();
while ( atrSrch.hasMoreElements() ) {
Attribute atr = ( Attribute )atrSrch.next();
Enumeration elems = atr.getAll();
while ( elems.hasMoreElements() ) {
System.out.println( atr.getID() + " : " + elems.nextElement() );
}
}
// 個別に取得
// Attribute atr = atrs.get( "mail" );
// System.out.println( atr.getID() + " : " + (String)atr.get() );
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
};
Ext.onReady( function() {
// ここにコードを書く
});
このメソッドは、DOMが完全に読みこまれた後に自動的に呼び出されるものです。 Ext.onReadyが呼び出された時、参照したいすべてのページ要素が利用できることが保証されています。ということなので従います。
Ext.onReady( function() {
var hogeElem = Ext.get( 'hoge' );
});
という風に使うみたいです。このメソッドは、簡潔に言うと速くて、汎用的で、拡張してあるって言うことみたいですね。なるほどー。また、ID以外、たとえば属性やCSSクラス名でノードを取り出したい場合はDomQueryというDOM セレクタ ライブラリを使ってみてはどうかと言っています。<input type="button" value="OK" onclick="sweet()">ExtJSでのイベントの応答は以下のように書くみたいです。
Ext.onReady( function() {
Ext.get( 'hoge' ).on( 'click', function(){
alert( "hoge" );
});
});
上記で述べたExt.get()でデータ要素hogeを特定して、(Element.)onメソッドの第1パラメータで挙動(イベント名)の決定、第2パラメータで実装となるようです。もちろん、第2パラメータの匿名関数(無名関数)をインスタンスとして与えることも出来ます。
Ext.onReady( function() {
var alertFuncInst = function(){
alert( "hoge" );
}
Ext.get( 'hoge' ).on( 'click', alertFuncInst );
});
チュートリアルではさらにもう少し突っ込んだ内容が書かれています。上記に書いたイベントハンドラとなる匿名関数は引数を持ちませんが、(Element.)onメソッドはこの定義したイベントハンドラにイベントオブジェクトExt.EventObjectを投げてくれるようです。
Ext.onReady( function() {
var alertFuncInst = function( evt ){
// アニメーションつきでぐいーっとx:256 y:256座標に移動する
Ext.get( evt.target ).moveTo( 256, 256, true );
}
Ext.get( 'hoge' ).on( 'click', alertFuncInst );
});
よくよく考えてみたらそりゃ投げてくれなきゃ困るかなとも思いますが、上記のようにEventObjectが使えます。上記のソースはhtmlのid:hogeを持つ要素をクリックするとアニメーションつきでぐいーっとx:256 y:256座標に移動する例です。JavaScriptでは、オブジェクトリテラルは{}で囲まれた名前/値の属性のリストで使用した時に動的に生成されるオブジェクトで、属性は[名前]:[属性]の形で記述されます。パッと見JSON形式?なのかなと思いましたが、オブジェクトリテラルと言うらしいです。まぁ詳しいことは判りません。(飽きてきた)要は、以下のように作って欲しいと言うことみたいです。
{
title : 'hoge',
width : 500
}
こんな形式で作られるように定義してみます。以下のような例になります。
// インスタンスを定義する。
var extObjInst = new Ext.***.*** ({
title : 'hoge',
width : 500
});
// 作ったインスタンスでいろんなメソッドコールする。
extObjInst.***();
では実際のgridウィジェットを見てみます。の前にサンプルのgridがオブジェクトリテラルとしてどうやって作られているのか簡単に解説します。
Ext.onReady( function() {
// データの実体:データそのものを連想配列で作ります。
var myData = [
['Apple',29.89,0.24,0.81,'9/1 12:00am'],
['Ext',83.81,0.28,0.34,'9/12 12:00am'],
['Google',71.72,0.02,0.03,'10/1 12:00am'],
['Microsoft',52.55,0.01,0.02,'7/4 12:00am'],
['Yahoo!',29.01,0.42,1.47,'5/22 12:00am']
];
// データリーダ:作ったデータを行として解釈するために必要らしい。
var myReader = new Ext.data.ArrayReader({}, [
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pctChange', type: 'float'},
{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
]);
// gridウィジェットの実体
var grid = new Ext.grid.GridPanel({
// データストア:1.2.で用意したデータを保持するために必要らしい
store: new Ext.data.Store({
data: myData,
reader: myReader
}),
// 列モデル:列のヘッダー部分になる。これも必要
columns: [
{header: 'Company', width: 120, sortable: true, dataIndex: 'company'},
{header: 'Price', width: 90, sortable: true, dataIndex: 'price'},
{header: 'Change', width: 90, sortable: true, dataIndex: 'change'},
{header: '% Change', width: 90, sortable: true, dataIndex: 'pctChange'},
{header: 'Last Updated', width: 120, sortable: true,
renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
],
// gridウィジェットのオプション
viewConfig: {
// ビューにカラムがスクロールバー無しで表現される
forceFit: true
},
// レンダリングの位置
renderTo: 'content',
title: 'My First Grid',
width: 500,
frame: true
});
});
clickのハンドラは、 Updater と呼ばれるExtに組みこまれている特別なクラスを使っていまして、このクラスはAjaxリクエストを送ってて、レスポンスを受けてElementをさくっと更新しています。 Updaterは更新したい要素(この場合msg div)を通じてアクセスすることでダイレクトに使うことができます。 Element.loadが使用された時に、サーバーのレスポンスは自動的に要素のinnerHTMLを置き替えます。単にURLのサーバーベースのプロセスに渡すことで、クエリストリングのパラメータは処理されて要素のinnerHTMLの中にテキストとして表示されます。で、msg divが表示され(最初はhidden)ます。とのこと。
Ext.onReady(function(){
Ext.get( 'okButton' ).on( 'click', function(){
var msg = Ext.get( 'msg' );
msg.load( {
url: 'ajax-example.php', // <-- change if necessary
params: 'name=' + Ext.get( 'name' ).dom.value,
text: 'Updating...'
} );
msg.show();
});
});
ちなみにURLのパラメータを複数渡したい場合は、
params : {param1: 1, param2: 2}
と書いてあげて、ajax-example.php?param1=1¶m2=2となるらしいです。試してません。
少し前にクレヨンフィジックスていうゲームが面白いというエントリをポストしましたが、Kloonigamesさんでgrammerというゲームがリリースされていました。タイピングソフトのシューティングゲームで、英単語を打ち込めればいいというものらしいです。英語ならどんなものでもいいらしいのですが、長い英単語を打ち込むとダメージがデカイらしいです。
アーカイブを解凍するとdataディレクトリが出てくるんですけど、このなかのWORD.LSTってのに英単語が書かれてます。こいつを書き換えれば造語でもいいみたいです。hogeとか。このワードリストは173528単語収められていて、なんかのサービスのマスタに使えそうですね。使わしてっていったらだめっていわれそうだけど。あはは。
スマブラXを買いました。前々からやってみたいと思っていたゲームでしたが、スマブラのためにゲームキューブ?を買うわけにも行かず、あきらめていたらwiiで出ているじゃないスカ。\(^o^)/
ゲームシステムをよくしらないでやって見ると、ちょっと難しい。押出し相撲なのねコレ。
操作してみると、カービィ以外のキャラクターでステージ復帰が全然うまく行かないです。PCの敵は何であんなにすっ飛ばしてもすっ飛ばしても復帰してくるんだ?
で、しばらくやってると、新しいキャラクターが増えてきました。F-zeroの人と、マザーのネスと、あとよく知らないのが2人くらい出てきました。ワタシはマザー大好きなのでネスを使っています。デフォルトで選べるリュカと基本同じ攻撃方法なんだけど、微妙にちがうのね。PKサンダーを自分に上手くあてると、ステージ復帰に役立つらしい。でも無理。オレこんなゲーム下手だったっけとか思うくらい無理。
あと、wiiでプレイ中のスナップショットを取れてSDカードとかに*.binで出力できるんだけど、これ汎用フォーマットにならんもんかね。
下のyoutubeの動画は高校生くらいの頃、ゲーセンではまったゲームでアウトフォクシーズって言うんですけど、スマブラって微妙にコレに似てますね。あれは得意だったんだけど。アウトフォクシーズもwiiで出したらいいと思う。多分、一般家庭のどのハードにも移植されていないと思う。