Archive for: 󈥪月 2011’

の挙動

2011年10月22日 Posted by PURGE

今まで動作していたプログラムが突如動いたり、動かなかったりと、不明な挙動に頭を悩めていた。それが、の value属性 が、各ブラウザによって、post/get できないことに気が付いた。

リクエスト内容の詳細をキャプチャして調査してみると、なぜか param.x=22&param.y=24 と訳のわららない値になっていることに気が付いた。どうやら座標の値を返しているらしい。

意図していたのは、 paramの値。

これではサーバ側にパラメータ値が渡らず動くはずが無い。
FireFox と Chrome を意識して使い分けているわけでなかったので、全く気づかなかった。

HTMLの仕様的にはどうなんだろうか?

Symfony2 とeclipse plugin事始め

2011年10月22日 Posted by PURGE

以前、Symfony1.4 でアプリを作成していたが、どうも開発ツールの選定と使い方を間違ったらしく、デバッグできないことで挫折。

久しぶりに Symfony を再勉強してみようと思い、Symfony2 に挑戦しようと思った。でも、開発の深い部分に入ると、やはり開発環境ツールは必須なので、調べてみるとありました。

Symfony2 Eclipse Plugin

私の最高のお気に入り開発ツールは、eclipse。既存の eclipse3.6 にインストールしようとしたが、PDTのバージョン違いで怒られる。そもそも、Symfony2 Eclipse Plugin もPDT3.0 からサポートしているらしいので、eclipse3.7の最新にしてみた。

ちなみに、eclipse PDTのAll in Oneパッケージを探していたが、それらは、eclipse3.6 & PDT2.2 までしか対応していないようなので(※執筆時点)、eclipse3.7 for Java Developer をダウンロードし、Symfony2 Eclipse Plugin のサイトに指定されたアップデートサイトから、すんなりPDT3.0 を含めて、Symfony2 Eclipse Pluginがインストールできた。

そして次は、そもそものSymfony Standard Editionをダウンロードしてみる。ダウロードしたzipファイルを展開してみる。展開したファイルをeclispeに読み込ませてみた。

SQLがロック若しくはフリーズした場合

2011年10月11日 Posted by PURGE

ロックが掛っているセッションを確認する方法

SELECT object_name,oracle_username, S.sid, S.serial#, 
       S.logon_time, sql_address
  FROM v$locked_object L,dba_objects D, v$session S
 WHERE L.OBJECT_ID = D.OBJECT_ID
   AND L.SESSION_ID = S.SID

実行されているSQLを確認する方法

SELECT sid, serial#, username, logon_time, SQL_TEXT
  FROM v$session s, v$sql q
 WHERE s.SQL_ADDRESS=q.ADDRESS

実行されているセッションをKILLする方法

ALTER SYSTEM kill session 'sid, serial#';

スキーマを超えたテーブルのコピー

2011年10月7日 Posted by PURGE

system ユーザ(全schemaをまたげる)権限がある場合。

CREATE TABLE schema_b.to_table AS SELECT * FROM schema_a.from_table;

IE8で、JavaScriptオブジェクトがエラーとなる件

2011年10月6日 Posted by PURGE

FireFox では動作するが、IEではうまくいかない場合は、カンマの有無を調査するのが良いと思う。

言語仕様的に言うと、ECMAScript第3版ではオブジェクトリテラルの最後のカンマ “,” は違反らしい。最新のECMAScript第5版では最後のカンマ “,” は無視されるとのこと。どの道、最後のカンマ “,” は付けない方が良い。

余談だが、jQuery.append() が動作しなかったこともある。これも単純に</div>タグを付け忘れたという単純ミス。
問題が起きたら、まずは簡単なところから確認するべきである。

Excel VBA テンプレートエンジン

2011年10月5日 Posted by PURGE

エクセルのテンプレートエンジンを試してみる。MiniTemplator

使用した感想は後日。たぶん・・・。

JSON仕様

2011年10月5日 Posted by PURGE

JSON.parse() をしようとして、結構エラーになるので覚え書き。
特にオブジェクト型のプロパティと、文字値に、ダブルクォーテーションを指定する事はとても重要。
シングルクウォーテーションだと怒られる。

文字値:”abcd” [ダブルクォーテーションのみ]
数値:123.4 [10進数のみ]
Boolean値:ture or false
null値:null
オブジェクト:{“x” : “abc” ,”y”: 123}
配列: [1,2,”aaa”]

jQuery Plugin 事始め その1

2011年10月5日 Posted by PURGE

以前も記述したが、jQuery プラグイン形式でスクリプトを記述すると中々良いかもしれない。
今後は勉強がてらに、jQuery プラグインの作成方法を試していこうと思う。
試行錯誤しながらの記述なので、使用方法に間違い等があるかもしれないので参考までにしてください。

<script 
src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" 
type="text/javascript" ></script>
<script src="jquery.myPlugin.js" type="text/javascript" ></script>
<script type="text/javascript">
$(function(){

    $("#test").myPlugin({
        params : [{title : 'optTitle1', name: 'optName1', id: '011'},
                  {title : 'optTitle2', name: 'optName2', id: '022'}
                 ]
    });

});
</script>
/*
 * jQueryプラグインテンプレート
 */
;(function($){
    var target;
    var opts;
    $.fn.myPlugin = function(options){
        //対象のスコープを設定
        target = $(this);
        //オプション取得
        opts = jQuery.extend({}, $.fn.myPlugin.defaults, options);
        //opts = jQuery.extend(true, $.fn.myPlugin.defaults, options);

 
        return this.each(function(){
            //処理記述
            func1();
            $(this).css({width : opts.width,
                          height : opts.height,
                          background : opts.color});
        });
    };
    //ローカル関数
    function func1(){
        //パラメータも取得可能
        var targetId = target.attr('id');
        var param = opts.param;
        var params = opts.params;

console.log(targetId + "/" + param + "/" 
+ params[0].title + "/" + params[1].title);

    };
    //デフォルト値
    $.fn.myPlugin.defaults = {
        param : 'hoge',
        params : [{title : 'defTitle1', name: 'defName1', id: '111' },
                  {title : 'defTitle2', name: 'defName2', id: '222' }
                 ],
        height : '200px',
        width :  '300px',
        color : 'blue'
    };
})(jQuery);

JSON.parse() と jQuery.parseJSON()

2011年10月4日 Posted by PURGE

JSONデータがデータインタフェースとして何かと取扱い便利なので利用している。
但し、手元のIE8だと JSONオブジェクトのサポートをしていないのか、下記の関数が利用できない。

var strJson = {"title":"ああああ", "content":"いいいいい"};
var jsonData = JSON.parse(strJson);

ブラウザ互換性の問題として一瞬焦ったが、こんな時は、jQueryでも同様のメソッドがある。

var strJson = {"title":"ああああ", "content":"いいいいい"};
var jsonData = $.parseJSON(strJson);

Love jQuery である・・・。

Seasar2 と DWR連携

2011年10月4日 Posted by PURGE

まずは、DWRのサイトからjarファイルをダウンロードし、/WEB-INF/lib フォルダへ配置してクラスパスを通す。

/WEB-INF/web.xml

<servlet>
	<display-name>DWR Servlet</display-name>
	<servlet-name>dwr-invoker</servlet-name>  
	<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
	<init-param>
		<param-name>debug</param-name>
		<param-value>true</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>dwr-invoker</servlet-name>
	<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

まずは、DWR Servletのweb.xmlへの設定。
/dwr/* で来たリクエストを同Servletが受けるように設定する。

/WEB-INF/dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC 
  "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" 
  "http://getahead.org/dwr/dwr20.dtd">
<dwr>
	<init>
		<creator id="s2creator" class="packagename.S2Creator" />
	</init>
	<allow>
		<create creator="s2creator" javascript="ajaxService">
			<param name="serviceName" value="ajaxService"/>
		</create>
	</allow>
</dwr>

指定したCreatorクラスが、Seasar2が管理しているServiceクラスを返すように定義する。
<init>では、creator の id (任意)と class属性は対象クラス名を指定する。
<param>では、S2Creator.javaクラスでDIする name(setterでセットするプロパティ名)とvalue(class名)を指定する。

S2Creator.java

package packagename.creator;

import org.directwebremoting.create.AbstractCreator;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class S2Creator extends AbstractCreator {
	
	private String serviceName;
	
	@Override
	public Object getInstance() throws InstantiationException {
		
		return SingletonS2ContainerFactory
				.getContainer()
				.getComponent(serviceName);
	}

	@Override
	public Class<?> getType() {
		return SingletonS2ContainerFactory
				.getContainer()
				.getComponentDef(serviceName)
				.getComponentClass();
	}

	public void setServiceName(String serviceName) {
		this.serviceName = serviceName;
	}
}

dwr.xmlで指定したサービス名で、コンテナからserviceクラスを返す。

AjaxService.java

package packagename.service;

public interface AjaxService {
	
	/**
	 * @param name
	 * @return
	 */
	String hello(String name);

}

実際のServiceが定義されたインタフェースクラス。

AjaxServiceImpl.java

package packagename.service.impl;

import package.name.service.AjaxService;

public class AjaxServiceImpl implements AjaxService {

	@Override
	public String hello(String name) {
		return "Hello " + name + "!!!";
	}
}

実際のサーバ処理を行うServiceクラス

index.jsp

<script src="/dwr/interface/ajaxService.js" type="text/javascript"></script>
<script src="/dwr/engine.js" type="text/javascript"></script>
<script src="/dwr/util.js" type="text/javascript"></script>

<script type="text/javascript">
$(function(){
	ajaxService.hello("AJAX", callBack);
});
function callBack(value){
	alert(value);
}
</script>

JSP(HTML)で、サーバ側に自動生成されるjsファイルの場所を定義する。
/dwr/interface/ajaxService.js
/dwr/engine.js
/dwr/util.js

dwr.xml で定義したJavaScript名でメソッドを呼べる。
この場合、第1引数は、サーバへのパラメータで、第2引数は非同期でコールバックされるJavascriptの関数名を指定する。

おそらくこれで動作するはずである。
難しく考えていたが、設定が終わればかなり簡単にAjax通信ができるようになる。

DWRの詳細はこちら(DWR)を参照してください。