February 24th, 2010
admin
HOMEディレクトリにGoogle App Engineの開発環境を構築してみた
インストールするのは以下。
python2.5
easy_install
mercurial
python2.5のインストール
$ wget http://www.python.org/ftp/python/2.5.5/Python-2.5.5.tgz
$ tar xfz Python-2.5.5.tgz
$ cd Python-2.5.5
$ ./configure --pfix=$HOME
$ make
$ make install
$ echo $?
pathの設定
$ vim ~/.bashrc
$ PATH=$HOME/bin:$PATH
$ source ~/.bashrc
easy_installのインストール
$ wget http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c11-py2.5.egg#md5=64c94f3bf7a72a13ec83e0b24f2749b2
$ sh setuptools-0.6c11-py2.5.egg --pfix=$HOME
mercurialのインストール
$ wget "http://mercurial.selenic.com/release/mercurial-1.4.3.tar.gz"
$ tar xvfz mercurial-1.4.3.tar.gz
$ cd mercurial-1.4.3
$ make install-home
Popularity: 44% [?]
February 16th, 2010
admin
Trac(mod_wsgi)とTracMercurialを使って、環境を作ったのだがリポジトリブラウザが文字化けしてしまった。
その時の対象法を・・・。
今回、自分の環境ではApacheとmod_wsgiを使って動かしている。
で、.wsgiファイルに以下を追加してあげることにより文字化けが治る。
os.environ['HGENCODING'] = "UTF-8"
.wsig全体では以下な感じになっている。(参考までに)
import site
import os
site.addsitedir('/usr/local/lib/python2.6/site-packages')
os.environ['PYTHON_EGG_CACHE'] = '/home/hogehoge/src/trac/eggs'
os.environ['HGENCODING'] = "UTF-8"
import trac.web.main
def application(environ, start_response):
environ['trac.env_path'] = '/home/hogehoge/src/trac'
return trac.web.main.dispatch_request(environ, start_response)
Popularity: 26% [?]
かなり今さらだがJDK1.4を最後に3年くらいJavaを使っていなかったら、
Foreachが使えるようになっていて、よく使い方を忘れてしまうのでメモ。
// 配列(Integer)
for(Integer i: new Integer[]{1, 2, 3, 4})
System.out.println(i);
// 配列(String)
for(String s: new String[]{"a", "b", "c"})
System.out.println(s);
// Map
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a");map.put("2", "b");
for(Entry<String, String> e: map.entrySet())
System.out.println(e.getKey() + ":" + e.getValue());
// List
List<String> list = new ArrayList<String>();
for(String s: list)
System.out.println(s);
Popularity: 43% [?]
携帯向けサイトを作る時、HTMLは「Shift_JIS」を表示することになると思う。
Shift_JISには、Windows用に拡張された「Windows-31J」というのがあり、これがたまに悪さをして、
「~」などという文字が化けてしまう。
今回も、Freemarkerを使ったテンプレートで、Actionからアサインした文字「~」が文字化けしてしまったので、
その対策を。
以下をテンプレートの先頭に記述する。
<#ftl encoding="Windows-31J">
Popularity: 13% [?]
以下のような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% [?]
気づけばというか、きっとドキュメントをちゃんと読めば書いてあったのだろうけど、
はまったのでメモ。
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: 40% [?]
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: 33% [?]
ということで、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: 29% [?]
長らく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: 16% [?]
こんな感じ。
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: 25% [?]