<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>Solitaire &#187; Framework</title>
	<atom:link href="http://blog.redhawk.jp/archives/tag/framework/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.redhawk.jp</link>
	<description>Sato Tatsuma&#039;s weblog about programming and systems.</description>
	<lastBuildDate>Thu, 29 Jul 2010 17:27:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/tag/framework/feed" />
		<item>
		<title>Struts2: Java: interceptor でハマったよ</title>
		<link>http://blog.redhawk.jp/archives/1383?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=struts2-java-interceptor-%25e3%2582%2592%25e4%25bd%259c%25e3%2582%258b</link>
		<comments>http://blog.redhawk.jp/archives/1383#comments</comments>
		<pubDate>Thu, 27 Aug 2009 09:04:17 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1383</guid>
		<description><![CDATA[Struts2 でアプリを作っていて、Interceptor を使おうとしたら、めちゃはまった・・・ public class AuthenticationInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation invocation) throws Exception { Map&#60;String, Object&#62; session = ActionContext.getContext().getSession(); Boolean auth = (Boolean)session.get(AuthenticationAction.AUTH_KEY); if (null == auth &#124;&#124; !auth.booleanValue()) { return "auth-error"; } else { // 次のインターセプター処理 return invocation.invoke(); } } } というのが正解のソースコード。 じゃあ、何がダメなやつはどこがおかしかったのかと言うと この [...]]]></description>
			<content:encoded><![CDATA[<p>Struts2 でアプリを作っていて、Interceptor を使おうとしたら、めちゃはまった・・・</p>
<pre class="brush:java">
public class AuthenticationInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map&lt;String, Object&gt; session = ActionContext.getContext().getSession();
		Boolean auth = (Boolean)session.get(AuthenticationAction.AUTH_KEY);
		if (null == auth || !auth.booleanValue()) {
			return "auth-error";
		} else {
			// 次のインターセプター処理
			return invocation.invoke();
		}
	}

}
</pre>
<p>というのが正解のソースコード。</p>
<p>じゃあ、何がダメなやつはどこがおかしかったのかと言うと<br />
この Interceptor 独自の戻り値を struts.xml で定義した、global-results の値にマッチングさせたい時<br />
次のインターセプター処理を呼び出してはいけない！！<br />
って事ですな・・・</p>
<p>インターセプターが戻り値を持っている時点でもっと早く気がつけよ。って気がしないでもないです。はい。</p>
<p>ちなみに、 struts.xml はこんな感じ。</p>
<pre class="brush:xml">
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <constant name="struts.devMode" value="false" />
<package name="admin" extends="struts-default">
    <interceptors>
      <interceptor name="authentication" class="AuthenticationInterceptor" />
      <interceptor-stack name="authenticationStack">
        <interceptor-ref name="authentication" />
        <interceptor-ref name="defaultStack" />
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="authenticationStack" />
    <default-action-ref name="index" />
    <global-results>
      <result name="auth-error" type="redirectAction">auth/login</result>
    </global-results>
    <action name="index" class="AdminAction" method="index">
      <result>/WEB-INF/pages/admin/index.jsp</result>
      <result name="auth-error" type="redirectAction">auth/login</result>
    </action>
  </package>
<package name="auth" extends="struts-default">
    <action name="login" class="AuthenticationAction" method="login">
      <result type="redirectAction">admin/index</result>
      <result name="error">/WEB-INF/pages/auth/login.jsp</result>
    </action>
  </package>
</struts>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1383/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1383" />
	</item>
		<item>
		<title>PHP: symfony 複数のデータベースにアクセス</title>
		<link>http://blog.redhawk.jp/archives/1352?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-symfony-%25e8%25a4%2587%25e6%2595%25b0%25e3%2581%25ae%25e3%2583%2587%25e3%2583%25bc%25e3%2582%25bf%25e3%2583%2599%25e3%2583%25bc%25e3%2582%25b9%25e3%2581%25ab%25e3%2582%25a2%25e3%2582%25af%25e3%2582%25bb%25e3%2582%25b9</link>
		<comments>http://blog.redhawk.jp/archives/1352#comments</comments>
		<pubDate>Mon, 17 Aug 2009 00:46:32 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[fra]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1352</guid>
		<description><![CDATA[一つのアプリで複数のデータベースにアクセス。 それぞれの環境に対して、多くの接続を定義できます。それぞれの接続は同じ名前でラベル付けされたスキーマを参照します。デフォルトで使われる接続名は propelでこれはリスト8-3のpropelスキーマを参照します。nameオプションによって別の接続を作成することができます: php symfony &#8211;name=main configure:database &#8220;mysql://login:passwd@localhost/blog&#8221;]]></description>
			<content:encoded><![CDATA[<p>一つのアプリで複数のデータベースにアクセス。</p>
<p>それぞれの環境に対して、多くの接続を定義できます。それぞれの接続は同じ名前でラベル付けされたスキーマを参照します。デフォルトで使われる接続名は propelでこれはリスト8-3のpropelスキーマを参照します。nameオプションによって別の接続を作成することができます:</p>
<p>php symfony &#8211;name=main configure:database &#8220;mysql://login:passwd@localhost/blog&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1352/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1352" />
	</item>
		<item>
		<title>PHP: symfony redirect処理</title>
		<link>http://blog.redhawk.jp/archives/1348?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-symfony-redirect%25e5%2587%25a6%25e7%2590%2586</link>
		<comments>http://blog.redhawk.jp/archives/1348#comments</comments>
		<pubDate>Mon, 17 Aug 2009 00:44:39 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1348</guid>
		<description><![CDATA[redirect での引数の型が違う これも若干はまりどころですが、redirectする際、&#8217;module/action&#8217;と文字列で&#8217;/'で区切って記述しますが、routingを利用して引数も渡したい場合、素直に書くと&#8217;foo/bar/variable&#8217;となります。 しかしこのように正直に書いても&#8217;variable&#8217;が絶ち落とされてしまいます。 この場合はどうするかというと、まずrouting.ymlで下記のように書いてあるものとして、 foo_bar_hoge: url: /foo/bar/:hoge param: { module: home, action: bar } 次に、redirectメソッドの引数は素直に書くのではなく、配列で渡します。 $this->redirect(array(&#8216;module&#8217; => &#8216;foo&#8217;, &#8216;action&#8217; => &#8216;bar&#8217;, &#8216;hoge&#8217; => &#8216;variable&#8217;)); これで正しくリダイレクトされ、引数も渡されます。]]></description>
			<content:encoded><![CDATA[<p>redirect での引数の型が違う</p>
<p>これも若干はまりどころですが、redirectする際、&#8217;module/action&#8217;と文字列で&#8217;/'で区切って記述しますが、routingを利用して引数も渡したい場合、素直に書くと&#8217;foo/bar/variable&#8217;となります。<br />
しかしこのように正直に書いても&#8217;variable&#8217;が絶ち落とされてしまいます。<br />
この場合はどうするかというと、まずrouting.ymlで下記のように書いてあるものとして、</p>
<p>foo_bar_hoge:<br />
url: /foo/bar/:hoge<br />
param: { module: home, action: bar }<br />
次に、redirectメソッドの引数は素直に書くのではなく、配列で渡します。<br />
$this->redirect(array(&#8216;module&#8217; => &#8216;foo&#8217;, &#8216;action&#8217; => &#8216;bar&#8217;, &#8216;hoge&#8217; => &#8216;variable&#8217;));<br />
これで正しくリダイレクトされ、引数も渡されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1348/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1348" />
	</item>
		<item>
		<title>PHP: symfony 認証</title>
		<link>http://blog.redhawk.jp/archives/1346?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-symfony-%25e8%25aa%258d%25e8%25a8%25bc</link>
		<comments>http://blog.redhawk.jp/archives/1346#comments</comments>
		<pubDate>Mon, 17 Aug 2009 00:44:03 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1346</guid>
		<description><![CDATA[security.yml ファイルで、 indexアクションなら index: is_secure: on にするだけ。 後は、アクションの中で $user = $this->getUser() $user->setAuthenticated(true); とすれば、そのページを表示できる。 細かいRoleの設定は $user->addCredential(&#8216;god&#8217;); $user->addCredentials(&#8216;god&#8217;, &#8216;slave&#8217;);]]></description>
			<content:encoded><![CDATA[<p>security.yml</p>
<p>ファイルで、 indexアクションなら</p>
<p>index:<br />
is_secure: on<br />
にするだけ。<br />
後は、アクションの中で<br />
$user = $this->getUser()<br />
$user->setAuthenticated(true);</p>
<p>とすれば、そのページを表示できる。<br />
細かいRoleの設定は</p>
<p>$user->addCredential(&#8216;god&#8217;);<br />
$user->addCredentials(&#8216;god&#8217;, &#8216;slave&#8217;);</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1346/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1346" />
	</item>
		<item>
		<title>Djangoをやろう！！ django.contrib.admin基礎編</title>
		<link>http://blog.redhawk.jp/archives/141?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=django%25e3%2582%2592%25e3%2582%2584%25e3%2582%258d%25e3%2581%2586%25ef%25bc%2581%25ef%25bc%2581-djangocontribadmin%25e5%259f%25ba%25e7%25a4%258e%25e7%25b7%25a8</link>
		<comments>http://blog.redhawk.jp/archives/141#comments</comments>
		<pubDate>Wed, 30 Jan 2008 14:19:15 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[O/RMapper]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=141</guid>
		<description><![CDATA[今思ったんだけれどさ、みんな検索する時は、 &#8220;django 入門&#8221; とかで検索する訳じゃん。Pythonもさ。 でも、自分のエントリーって全部やろう！！なんだよね。ま、いいか？ｗ 硬いのは嫌いだしね～ ってことで、Djangoのcontributeの一つのadminに付いてやります。これはちょっとしたCMSちっくです（・・ 最初に、 INSTALLED_APPS = ( &#8216;django.contrib.auth&#8217;, &#8216;django.contrib.contenttypes&#8217;, &#8216;django.contrib.sessions&#8217;, &#8216;django.contrib.sites&#8217;, &#8216;django.contrib.admin&#8217;, &#8216;redhawk.task&#8217;, ) のように、&#8217;django.contrib.admin&#8217;を追加します。 次に、 python manage.py syncdb を実行。admin権限のユーザーを作成するか訊いてくるので、作成します。 次に、redhawk.task.modelsにこんなことをしてみます。 python manage.py 192.168.11.40:8000 でサーバ起動。IPアドレスとポート番号は自分の環境にあわせて選んでください。 この場合、アクセスするURLは、 http://192.168.11.40:8000/admin/ になります。 上の様な画面が出るはずなので、ぐりぐり弄くりまわしてみましょう。 で、色々物足りないと思うので、こんな物を追加してみる。 models.py 公式ドキュメントや、本では def __str__(self) となっているかもしれないが、最近のバージョンでは def __unicode__(self) が推奨となっている。 まあ、どの言語にもよくあることで、__str__はasciiで__unicode__はユニコード企画に変換してくれる訳ですよ。 datetimeに__unicode__がないのは、__str__だけで事足りるからかな？ Rubyは日本人が作っただけあって例外なのかな？使ったことないから分からないけれど、そう聞いたことがある。 さて、これをすると、Objectが、printに渡されたときに、自動的に__unicode__の戻り値が表示されるようになるわけだ。 前のバージョンのままでは、User Objectと表示されていただろうが、これでUser.nameが表示されるので誰だか分かる。 更に、admin画面をカスタマイズ！！こんな事をしてみよう。 更に色々カスタマイズできるけれど、これまたアプリを作りながら見ていったほうが良いと思うので サンプルアプリつくりながら色々出しておこうかなと。]]></description>
			<content:encoded><![CDATA[<p>今思ったんだけれどさ、みんな検索する時は、 &#8220;django 入門&#8221; とかで検索する訳じゃん。Pythonもさ。<br />
でも、自分のエントリーって全部やろう！！なんだよね。ま、いいか？ｗ<br />
硬いのは嫌いだしね～<br />
ってことで、Djangoのcontributeの一つのadminに付いてやります。これはちょっとしたCMSちっくです（・・<br />
最初に、<br />
INSTALLED_APPS = (<br />
&#8216;django.contrib.auth&#8217;,<br />
&#8216;django.contrib.contenttypes&#8217;,<br />
&#8216;django.contrib.sessions&#8217;,<br />
&#8216;django.contrib.sites&#8217;,<br />
&#8216;django.contrib.admin&#8217;,<br />
&#8216;redhawk.task&#8217;,<br />
)<br />
のように、&#8217;django.contrib.admin&#8217;を追加します。<br />
次に、<br />
python manage.py syncdb<br />
を実行。admin権限のユーザーを作成するか訊いてくるので、作成します。<br />
次に、redhawk.task.modelsにこんなことをしてみます。<br />
python manage.py 192.168.11.40:8000<br />
でサーバ起動。IPアドレスとポート番号は自分の環境にあわせて選んでください。<br />
この場合、アクセスするURLは、</p>
<p>http://192.168.11.40:8000/admin/</p>
<p>になります。</p>
<p>上の様な画面が出るはずなので、ぐりぐり弄くりまわしてみましょう。<br />
で、色々物足りないと思うので、こんな物を追加してみる。<br />
<a href="http://redhawk.jp/viewvc/sandbox/django/trunk/redhawk/pmanager/models.py?revision=41&#038;view=markup">models.py</a><br />
公式ドキュメントや、本では<br />
def __str__(self)<br />
となっているかもしれないが、最近のバージョンでは<br />
def __unicode__(self)<br />
が推奨となっている。<br />
まあ、どの言語にもよくあることで、__str__はasciiで__unicode__はユニコード企画に変換してくれる訳ですよ。<br />
datetimeに__unicode__がないのは、__str__だけで事足りるからかな？<br />
Rubyは日本人が作っただけあって例外なのかな？使ったことないから分からないけれど、そう聞いたことがある。<br />
さて、これをすると、Objectが、printに渡されたときに、自動的に__unicode__の戻り値が表示されるようになるわけだ。<br />
前のバージョンのままでは、User Objectと表示されていただろうが、これでUser.nameが表示されるので誰だか分かる。<br />
更に、admin画面をカスタマイズ！！こんな事をしてみよう。</p>
<p>更に色々カスタマイズできるけれど、これまたアプリを作りながら見ていったほうが良いと思うので<br />
サンプルアプリつくりながら色々出しておこうかなと。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/141/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/141" />
	</item>
	</channel>
</rss>
