2010年2月25日木曜日

[java]logback+slf4jでロギング

どうも、俺@仕事中です。
今日はlogbackを使ってログを取得する方法をメモします。
※OS:CentOS 4.3
※java:1.6.0_18

ライブラリを以下から取得。
Logback:http://logback.qos.ch/
SLF4j:http://www.slf4j.org/

ダウンロードしたアーカイブを解凍して、
slf4j-api-1.5.10.jar
logback-core-0.9.18.jar
logback-classic-0.9.18.jar
をjavaのCLASSPATHに通します。

では、サンプルソース。

import org.slf4.Logger;
import org.slf4j.LoggerFactory;

public class LogSample {
private static Logger logger = LoggerFactory.getLogger(LogSample.class);

public static void main(String[] args) {
logger.info("INFO");
logger.debug("DEBUG");
}
}

で、設定ファイル(logback.xml)を作成します。これもCLASSPATHの通ったディレクトリへ設置します。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- ファイル出力 -->
<appender name="FILE_OUT" classs="ch.qos.logback.core.rolling.RollingFileAppender">
<File>sample.log</File>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] %class{0} %line : %msg %n</pattern>
</layout>

<!-- 日付でローテート -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>sample.%d{yyyy_MM_dd}.log</FileNamePattern>
</rollingPolicy>
</appender>



# <!-- ファイルサイズでローテート -->
# <appenderclass="ch.qos.logback.core.rolling.RollingFileAppender">
# <File>sample.log</File>
# <layout class="ch.qos.logback.classic.PatternLayout">
# <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] %class{0} %line : %msg %n</pattern>
# </layout>
# <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
# <FileNamePattern>sample.log.%i</FileNamePattern>
# <MinIndex>1</MinIndex>
# <MaxIndex>10</MaxIndex>
# </rollingPolicy>
# <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
# <MaxFileSize>512MB</MaxFileSize>
# </triggeringPolicy>
# </rollingPolicy>
# </appender>


<logger name="com.blogger.koexuka.app">
<level value="warn" />
<appender-ref ref="FILE_OUT" />
</logger>
以上どぇぇーす。

2010年1月29日金曜日

Zend_Db_Table_Row::refresh()について

どうも、俺@仕事中@スノボ前です。

今日久しぶりにZend_Framework案件でソース書いてて、抽象クラスZend_Db_Table_Row_Abstractの
protected $_cleanData
protected $_data
って「これわな~に?おいしいの?」と思ってました。

オブジェクトに値をセットしてvar_dump($zend_db_table_row)してみると、両方のフィールドに同じ値がセットされています。
公式にも詳しい説明がなかったのですが、
どうやらこれは、DBからSELECTしてきたデータは「$_creanData」に、後でセットした値が「$_data」に入っているようです。
で、
$zend_db_table_row->refresh()
メソッドを使ってrefresh()すると、$_dataフィールの値がリセットされて$_cleanDataになりました!

つまり、フォームからユーザがデータを入力してエラーチェックした結果、エラーが存在して元に値に戻したいとき、refresh()メソッドで値を元に戻せちゃいます。
なんて便利な!


以上、どえぇぇぇぇす。

2010年1月23日土曜日

rubyでロジックとビューの分離

どうも、俺@rubyはじめました、です。
Web系の仕事してて、これだけ「ruby」という単語を目にすることが多く「Ruby on railsを真似たフレームワークが・・」と耳にするのでちょっとカジっとかないと、という訳ではじめましたruby。
個人的に「phpとperlとjavaしか知りません」だと対外的に格好つかないかなと思ったわけです。


で、まだまだ勉強し始めなのですが、
WEBアプリを作る際にruby(RoRではない)でロジックとビューを分ける方法について。
例えばphpでは、
// ロジック側(logic.php)
<?php
$a = "foo";
$b = "bar";

require "view.tpl.php";
とロジックを書いておけば、ビューでは
// ビュー側(view.tpl.php)
<html>
<body>
$aの値はです。
$bの値はです。
とできます。

同じようなことをrubyでやるには、
1)ヒアドキュメントを使う
// ロジック側(logic.rb)
a = "foo"
b = "bar"

print "Content-type:text/html\n\n"

print <<__HTML_END__
"<html>
<body>
$aの値は" + a + "です。
$bの値は" + b + "です。"
__HTML_END__

2)ERBを使う
// ロジック側(logic.rb)
require "erb"

print "Content-type:text/html\n\n"

a = "foo"
b = "bar"
tplFile = "view.tpl.html"
erb = ERB.new(File.read(tplFile))
erb.run
としてビュー側で
// ビュー側(view.tpl.html)
<html>
<body>
aの値は<%=a%>です。
bの値は<%=b%>です。
とやります。

というか、もっとスマートな方法あれば教えてください!
もっと勉強します。。

以上っっっっです。

2010年1月21日木曜日

vimで画面分割を移動する

どうも、俺@仕事もうちょいです。
今日はvimで画面分割して右にあるものを左へ、左へあるものを右へ、
または上にあるものを下へ、上にあるものを右へ左へなどやる方法についてです。

上下分割
:sp

ファイルを指定して上下分割
:sp [filename]


左右分割
:vsp

ファイルを指定して左右分割
:vsp [filename]


右の画面を左へ
(右側の画面にフォーカスを合わせた状態で)
Ctrl+w L

上の画面を下へ
(上側の画面にフォーカスを合わせた状態で)
Ctrl+w J


つまり画面を移動させるには、Ctrl+w & viのキーバインドでOKなのです。
H(左)J(下)K(上)L(右)


以上でぇぇす。

2010年1月19日火曜日

apacheのRewriteEngine設定

こんにちわ、俺@仕事中です。
暇なんじゃないですよ。

今日はApache(2.0.59)のRewrite設定でハマったのでメモメモ。

Rewriteを有効にするには、apacheをインストールする時のconfigureオプションに
--enable-rewrite
をつけてmakeし、
httpd.conf(または.htaccess)に
RewriteEngine On
を書きます。

その後で「RewriteCond」と「RewriteRule」を書いてリダイレクトさせる条件やリダイレクト先などを書きます。
RewriteCond [値] [条件]
RewriteRule [URL正規表現] [Rewrite変換後]
RewriteCondは「ある条件を満たした場合にRewriteRuleを適用させる」という事をします。
例えばUser-AgentにDoCoMoが含まれていた場合に、http://foo.com/val_a/val_b を http://foo.com?a=val_a&b=val_bにRewriteさせるには、
RewriteEngine On
RewriteCond ${HTTP_USER_AGENT} DoCoMo
RewriteRule /(.*)/(.*) ?a=$1&b=$2
こんな感じです。(※未検証)

${HTTP_USER_AGENT}のように、利用できる環境変数は他にも
${HTTP_REFERER} ${HTTP_HOST} ${REMOTE_ADDR} ${SCRIPT_FILENAME} ${QUERY_STRING}
などなど多くあります。

一般的にRewriteは
http://foo.com/val_a/val_b/ というURLを http://foo.com/?a=val_a&b=val_bというURLに書き換えるために利用される事が多い(SEO対策など)のですが、今回ハマったのが
http://foo.com/val_a/?b=val_b というURLを http://foo.com?a=val_a&b=val_bというURLに書き換えようとした時です。
単純に、
RewriteRule ^/(.*)/\?b=(.*) /$1/$2
のようにしたのですが全く反映されません。
Rewriteログを取るために
RewriteLog logs/rewrite_log
RewriteLogLevel 3
とかやって見たのですが全然分かりませんでした。

Rewirteは「?(クエスチョンマーク)」がURL中にあると、それ以降をQuery_Stringとしてちょん切ってしまうので、「?(クエスチョンマーク)」以降のURLは解釈されないようなのです。
というので、上記のRewriteの場合は
RewriteRule ^/(.*)/(.*) /?a=$1&${QUERY_STRING}
として何とか対応しました。


いやー面倒でしたー。