Author Archive

[Java]Freemarkerで「~」が文字化けしたら(Shift_JIS)

携帯向けサイトを作る時、HTMLは「Shift_JIS」を表示することになると思う。

Shift_JISには、Windows用に拡張された「Windows-31J」というのがあり、これがたまに悪さをして、
「~」などという文字が化けてしまう。

今回も、Freemarkerを使ったテンプレートで、Actionからアサインした文字「~」が文字化けしてしまったので、
その対策を。

以下をテンプレートの先頭に記述する。

<#ftl encoding="Windows-31J">

Popularity: 9% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Java]FreemarkerのテンプレートでPaging(ページング)処理を行う

以下のようなFunctionを作った。
引数に、リスト、ページあたりに表示する行数、現在ページ数。

<#function paginator list num page>
	<#assign has_pre = false>
	<#assign has_next = false>
	<#if list?size == 0>
		<#return list>
	</#if>
	<#local start = (page - 1) * num>
	<#local end = start + num - 1>
	<#if page gt 1>
		<#assign has_pre = true>
	</#if>
	<#if end gte list?size - 1>
		<#local end = list?size - 1>
		<#assign has_next = false>
	<#else>
		<#assign has_next = true>
	</#if>
	<#return list[start..end]>
</#function>

使い方的には以下のようになる。

<#list paginator(["a", "b", "c", "d", "e"], 2, page) as item>
	${item}<br />
</#list>
<#if has_pre><a href="?page=${page - 1}">pre</a></#if>
<#if has_next><a href="?page=${page + 1}">next</a></#if>

Popularity: 38% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Java]struts2で”/”(ドキュメントルート)にアクセスした場合のActionマッピングについて

気づけばというか、きっとドキュメントをちゃんと読めば書いてあったのだろうけど、
はまったのでメモ。

http://hogehoge.com/

上記のようなアドレスにアクセスした際に、仮にJSPを表示したい場合は、
web.xmlに以下のような記述を行うと思う。

<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

今回、つまづいたのは、上記のようなアドレスにアクセスした際に、Actionを
呼びたかったのだけど、その方法がわからなかった。

で、答えは・・・

class IndexAction extends....(省略{

	@Actions( { @Action("/") })
	public String execute(...省略

とするだけでよかったのだ。
welcom-file-listでどうやって指定すればいいのだろうと悩んでしまったのが、
“/*”がすべてstruts2にマッピングされていたので、@Action(“/”)とするだけで
よかった。気づけばなんともない。。。

Popularity: 21% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Java]FreemarkerのXMLパーサとネームスペース(ns_prefixes)についてのメモ

FreemarkerのXMLパーサとネームスペース(ns_prefixes)について

例えば、以下のようにネームスペースが付けられているような、
XMLをFreemarkerのテンプレートでパースして表示しようとすると、
若干躓くことになる。

<?xml version="1.0" encoding="UTF-8" ?>
<root xmlns="http://hogehoge.com/xmlns">
	<key>hogehoge</key>
	<value>hogehoge</value>
</root>

というのも、以下のようなコードでは値が取得できないのだ。

key=${doc.root.key}<br/>
value=${doc.root.value}
<#-- docはNodeModel -->

これは、ネームスペースを使っているためである。
ので、取得するにはこのように書くことになる。

<#ftl ns_prefixes={"xmlns": "http://hogehoge.com/xmlns"}>
<#-- 先頭に書くのがいいっぽい。-->

<#assign root = doc["xmlns:root"] />
key = ${root["xmlns:key"]}<br/>
value = ${root["xmlns:value"]}

というような感じで、エレメントを取得するたびにネームスペース
を付けてあげる必要がある。

これでは、面倒くさい。
Freemarkerでは、”D”がデフォルトとして割り当てられているので、

<#ftl ns_prefixes={"D": "http://hogehoge.com/xmlns"}>

と、宣言してあげると、一番最初のコードで各値を取得することが
できるようになる。

というメモ。

Popularity: 18% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Java]FreemarkerでXML(NodeModel)のElementの一覧を表示してみる。

ということで、FreemarkerでXMLの内容を表示したいときに、どんなエレメントが紐づいているのか知りたかったので、
FreemarkerのFunctionを使って表示させtみた。

<#function pprint xmlroot depth>
	<#local ret>
		<#list xmlroot?children as c>
			<#list 0..depth as x>  </#list>
			<#if c?node_type = 'element'>
				- ${c?node_type}
				<#local d = depth + 1>
				${c?node_name}
				${pprint(c, d)}
			</#if><br />
		</#list>
	</#local>
	<#return ret>
</#function>

使い方はこんな感じ

${pprint(xmldoc, 0)}

Popularity: 17% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Java]Enumで遊んでみる

長らくJavaをやってなかったら、Enumとかいうのができていたので使ってみた。
使い方あっているのだろうか…


// for later than 1.5
enum KtaiInfoEnum {

	DOCOMO(0, "docomo"),
	SOFTBANK(1, "softbank"),
	AU(2, "au");

	private String carrierName = null;
	private Integer type = 0;
	private KtaiInfoEnum(Integer type, String carrierName) {
		this.type = type;
		this.carrierName = carrierName;
	}
	public Integer getType() {
		return this.type;
	}
	public String getCarrierName() {
		return this.carrierName;
	}
}

// for java 1.4
class KtaiInfo {

	public static final KtaiInfo DOCOMO = new KtaiInfo(0, "docomo");
	public static final KtaiInfo SOFTBANK = new KtaiInfo(1, "softbank");
	public static final KtaiInfo AU = new KtaiInfo(2, "au");

	private String carrierName = null;
	private Integer type = null;
	private KtaiInfo(Integer type, String carrierName) {
		this.type = type;
		this.carrierName = carrierName;
	}

	public Integer getType() {
		return this.type;
	}
	public String getCarrierName() {
		return this.carrierName;
	}

}

public class TestListStructure {

    public static void main(String args[]) {

    	System.out.println(KtaiInfo.SOFTBANK.getType() + ":" + KtaiInfo.SOFTBANK.getCarrierName());
    	System.out.println(KtaiInfoEnum.SOFTBANK.getType() + ":" + KtaiInfoEnum.SOFTBANK.getCarrierName());

    	for(KtaiInfoEnum ktaiInfo: KtaiInfoEnum.values()){
    		System.out.println(ktaiInfo.getType() + ":" + ktaiInfo.getCarrierName());
    	}

    }

}

Popularity: 15% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Django]関数ごとmemcacheに入れるための便利関数

こんな感じ。

def cache_func(key, timeout, func, *args, **kwargs):
    # get the result from memcache
    result = memcache.get(key)
    if result:
        return result
    # get the result from orginal function
    result = func(*args, **kwargs)
    # set the result to memcache
    memcache.set(key, result, timeout)
    return result

使い方はこんな感じ。

def get_hogehoge(id, count):
    return "%(id)s_%(count)s"
cache_timelines = lambda id, count: cache_func('cachekey_%(id)s_%(count)s' % dict(id=id, count=count), 60 * 10, get_hogehoge, id, count)

Popularity: 9% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[PS3]Apple Wireless KyeboardをPS3で使ってみた

ということで、PS3用にWirelessキーボードがほしかったので探してみたところ、

どうやらApple Wireless Keyboard (JIS) MC184J/Aがコスト的にも討ちやすさ的にも、大きさ的にもよかったので、

それを買うことにした。(ちなみに2台目)

IMG_0838

ということで、さっそく使ってみた。

キーボードの電源をいれ、PS3の「設定」の「周辺機器設定」からBluetooth機器を検索して

登録を行う。

IMG_0839

 

 

そんな感じで、普通に登録できた。

日本語変換のON/OFFは「Comand+Space」で行うことができるし、日ごろから打ちなれいるので、

大変使いやすい。

 

ちなみに、ほかのBluetooth接続のキーボードを探してみたが、5000~10000円くらいするので、

Appleのこのキーボードはかなり買いだと思う。

Popularity: 18% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[Linux]SSL requiredのPOPにTelnetからアクセスする方法

忘れないようにメモ。

openssl s_client -connect [server address]:995

Popularity: 2% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark

[GAE]urlfetchをshellから使ってみる

普通にやろうとすると以下のメッセージが表示されてしまって出来ない。
「AssertionError: No api proxy found for service “urlfetch”」

ということで、どうすればいいかのメモ。

from google.appengine.api import apiproxy_stub_map, urlfetch_stub
apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
apiproxy_stub_map.apiproxy.RegisterStub('urlfetch', urlfetch_stub.URLFetchServiceStub()) 

from google.appengine.api import urlfetch
urlfetch.fetch('http://www.google.co.jp').status_code

Popularity: 5% [?]

  • Digg
  • Google Bookmarks
  • Google Reader
  • Facebook
  • Delicious
  • FriendFeed
  • Evernote
  • Twitter
  • Share/Bookmark
Page 2 of 141234510...Last »