tag:blogger.com,1999:blog-84700459738240892192024-03-13T07:43:01.641+09:00psycho cafe私的メモの集合体Unknownnoreply@blogger.comBlogger15125tag:blogger.com,1999:blog-8470045973824089219.post-58341997185860815392014-09-20T18:36:00.000+09:002014-09-20T18:48:40.881+09:00vimの正規表現で複数行マッチさせる方法(改行を含む正規表現)vimで改行を含む正規表現をマッチさせる方法がないかと調べ、見つけたので、メモ<br />
<br />
vimの場合は、以下の正規表現が改行を含む任意の文字列をあらわす<br />
<br />
<blockquote class="tr_bq">
\_.</blockquote>
これを繰り返しの正規表現と組み合わせて使う<br />
<br />
例えば、以下のようにタグで囲われたテキストのみ<b>から</b>をマッチさせたい場合正規表現はこのようになる<br />
<br />
<blockquote class="tr_bq">
<b>\_.*<\/b><br />
<div>
<br /></div>
</blockquote>
<blockquote class="tr_bq">
<div><br />
<span style="background-color: cyan; color: blue;"><b></span><br />
<span style="background-color: cyan; color: blue;"> xxxx</span><br />
<span style="background-color: cyan; color: blue;"> </b></span><br />
</div></blockquote>
<br />
<br />
また、以下のようなテキストの場合は、最短一致(非欲張りマッチ)を使うことで、それぞれの<b>タグにマッチさせることが出来る。正規表現はこう<br />
<blockquote class="tr_bq">
<b>\_.\{-}<\/b></blockquote>
<blockquote class="tr_bq">
<div><br />
<span style="background-color: cyan; color: blue;"><b></span><br />
<span style="background-color: cyan; color: blue;"> xxxx</span><br />
<span style="background-color: cyan; color: blue;"> </b></span><br />
<hr><br />
<span style="background-color: cyan; color: blue;"><b></span><br />
<span style="background-color: cyan; color: blue;"> xxxx</span><br />
<span style="background-color: cyan; color: blue;"> </b></span><br />
</div></blockquote>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-27115423930190537172014-03-02T04:37:00.001+09:002014-03-02T04:37:13.774+09:00jadでjarをデコンパイルすぐに忘れちゃうよね。。。<br />
<br />
<blockquote class="tr_bq">
jar xvf test.jar</blockquote>
で、解凍して、<br />
<br />
<blockquote class="tr_bq">
jad -o -r -sjava -dsrc **/*.class</blockquote>
で、同ディレクトリ以下にある全classのjavaファイルが
srcディレクトリ配下に作られる。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-78213856751709361082013-06-22T16:02:00.000+09:002013-06-22T16:02:33.043+09:00人生でやりたいことを浮き彫りにする質問<br />
<div>
今年も目標設定の時期がやってまいりました。</div>
<div>
<br /></div>
<div>
自分の将来の姿を見つめなおすには、このエントリーを見てみると良い気がします。</div>
<div>
<br /></div>
<a href="http://www.lifehacker.jp/2011/08/110804simplequestion.html">http://www.lifehacker.jp/2011/08/110804simplequestion.html</a><div>
<br /></div>
<div>
<br /></div>
<div>
失敗しないとしたら何をしたいのか?</div>
<div>
<br /></div>
<div>
ぱっと答えが出せる良い質問です。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-64289824706583749782013-03-24T01:08:00.000+09:002013-03-24T01:08:04.670+09:00Tracのテンプレートでログインユーザ名を取得する最近Tracのチケットテンプレートファイルをカスタムするのがマイブームになっています。
<br />
今日は、テンプレートファイルにて、ログインユーザ名を取得する方法がわかったので、メモします。
<br />
<blockquote>
$authname</blockquote>
これで取得できます!
因みに環境は、以下のとおり<br />
<br />
Trac version : 0.11_04<br />
テンプレート:ticket.html
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-37926901315332386242012-01-30T00:45:00.004+09:002012-01-30T01:34:41.479+09:00EnumでPropertyファイル読み込みクラスを作るWebシステムでPropertyファイルを起動時に読み込んでメモリ上に展開することはよくあることだと思います。<br />
<br />
で、それをEnumでやったらこうなる!というのを作ってみました。<br />
<br />
PropertyHolder.java<br />
<blockquote><pre>
package property;
import java.util.Properties;
import java.util.Set;
public enum PropertyHolder {
Hoge("hoge.properties"), Foo("foo.properties"), Bar("bar.properties");
private Properties properties;
private String fileName;
static {
System.out.println("staticイニシャライザ開始");
for (PropertyHolder p : values()) {
System.out.println("static:" + p.name());
p.init();
}
}
private PropertyHolder(String fileName) {
System.out.println("constructor:" + fileName);
this.fileName = fileName;
}
private void init() {
System.out.println("init:" + fileName);
properties = new Properties();
try {
properties.load(getClass().getClassLoader().getResourceAsStream(
fileName));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String get(String key) {
return properties.getProperty(key);
}
public String getAll() {
System.out.println("getAll:" + fileName);
Set<Object> keys = properties.keySet();
StringBuilder sb = new StringBuilder();
for (Object obj : keys) {
String key = (String) obj;
sb.append("[");
sb.append(key);
sb.append(":");
sb.append(get((String) obj));
sb.append("]");
}
return sb.toString();
}
}
</pre></blockquote><br />
Main.java <blockquote><pre>package property;
public class Main {
public static void main(String[] args) {
System.out.println("Hoge.get(\"a\"):" + PropertyHolder.Hoge.get("a"));
System.out.println("Hoge.getAll():" + PropertyHolder.Hoge.getAll());
System.out.println("Foo.getAll():" + PropertyHolder.Foo.getAll());
System.out.println("Bar.getAll():" + PropertyHolder.Bar.getAll());
}
}
</pre></blockquote>hoge.properties <blockquote>a=A b=B c=C </blockquote>foo.properties <blockquote>aa=AA bb=BB cc=CC </blockquote>bar.properties <blockquote>aaa=AAA bbb=BBB ccc=CCC </blockquote>実行結果 <blockquote>constructor:hoge.properties constructor:foo.properties constructor:bar.properties staticイニシャライザ開始 static:Hoge init:hoge.properties static:Foo init:foo.properties static:Bar init:bar.properties Hoge.get("a"):A getAll:hoge.properties Hoge.getAll():[b:B][a:A][c:C] getAll:foo.properties Foo.getAll():[aa:AA][bb:BB][cc:CC] getAll:bar.properties Bar.getAll():[bbb:BBB][aaa:AAA][ccc:CCC] </blockquote>ポイントは、staticイニシャライザでEnumクラスの定数一つ一つがもっているinitメソッドを呼んでいるところですかね。<br />
<br />
staticイニシャライザは1クラスに対して1回しか動かないので、Enumクラスの中に定数がいくつあっても、その定数ひとつに対して1回しかstaticイニシャライザが呼ばれないことは実行結果をみるとわかりますね。 <br />
<br />
staticイニシャライザを使うと例外がRuntimeExceptionしか出せないのがきついですね。 システム共通ランタイムExceptionクラスがある場合、そちらを使ってラップしてからスローするといいですね。 <br />
<br />
あとは、いちいちinitメソッドを作らずにコンストラクタでファイルを読んでもいいと思います。 場合によると思うので、使い分けてみてください。 <br />
<br />
※サンプルのgetAllメソッドは実際に使う時は不要だと思うので、削除して使ってください。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-65418967006077855202012-01-30T00:08:00.001+09:002012-01-30T00:09:41.440+09:00EnumでDate変換Utilクラスを作るいろいろな使い方があるEnumですが、Utilクラスを作るのにもつかえます!<br />
ためしに日付を変換するUtilを作ってみました。<br />
<br />
日付<>文字列を変換するときは、いろいろなフォーマットの日付を表す文字列に対応しなければならないので、フォーマットの定義(yyyyMMddみたいなの)をたくさん定義して、定義した分だけ同じよう名メソッドを作らなければなりません。。<br />
<br />
ですが、Enumを使えばすっきりかけます~。<br />
<br />
以下コードです。<br />
<br />
DateUtil.java<br />
<code><br />
package util;<br />
<br />
import java.text.ParseException;<br />
import java.text.SimpleDateFormat;<br />
import java.util.Date;<br />
<br />
// TODO: 自動生成された Javadoc<br />
/**<br />
* The Enum DateUtil.<br />
*/<br />
public enum DateUtil {<br />
<br />
// ------------------------------<br />
// 変換したいフォーマットを追加(start)<br />
// ------------------------------<br />
/** The YYYYMMDD. */<br />
YYYYMMDD("yyyy/MM/dd"),<br />
/** The YYYYMMDDHHMM. */<br />
YYYYMMDDHHMM("yyyy/MM/dd hh:mm"),<br />
/** The YYYYMMDDHHMMSS. */<br />
YYYYMMDDHHMMSS("yyyy/MM/dd HH:mm.ss"),<br />
/** The YYYYMMDDHHMMSSSSS. */<br />
YYYYMMDDHHMMSSSSS("yyyy/MM/dd HH:mm.ss.SSS"),<br />
/** The Jp_ yyyymmdd. */<br />
JP_YYYYMMDD("yyyy年MM月dd日"),<br />
/** The Jp_ yyyymmddhhmm. */<br />
JP_YYYYMMDDHHMM("yyyy年MM月dd日HH時mm分"),<br />
/** The Jp_ yyyymmddhhmmss. */<br />
JP_YYYYMMDDHHMMSS("yyyy年MM月dd日HH時mm分ss秒");<br />
// ------------------------------<br />
// 変換したいフォーマットを追加(end)<br />
// ------------------------------<br />
/** The format. */<br />
private String format;<br />
<br />
/**<br />
* Instantiates a new date util.<br />
* <br />
* @param format<br />
* the format<br />
*/<br />
private DateUtil(String format) {<br />
this.format = format;<br />
}<br />
<br />
/**<br />
* To date.<br />
* <br />
* @param dateString<br />
* the date string<br />
* @return the date<br />
*/<br />
public Date toDate(String dateString) {<br />
try {<br />
return new SimpleDateFormat(format).parse(dateString);<br />
} catch (ParseException e) {<br />
// RuntimeExceptionでラップしてしまっていますが、システム共通Exceptionを投げるようにする方がいいと思います。<br />
// 場合によって使い分けてください。<br />
throw new RuntimeException("文字列→Dateへの変換に失敗しました(format:" + format<br />
+ ",string:" + dateString + ")", e);<br />
}<br />
}<br />
<br />
/**<br />
* To string.<br />
* <br />
* @param date<br />
* the date<br />
* @return the string<br />
*/<br />
public String toString(Date date) {<br />
return new SimpleDateFormat(format).format(date);<br />
}<br />
<br />
}<br />
</code><br />
Main.java<br />
<br />
<code><br />
package util;<br />
<br />
import java.util.Date;<br />
<br />
public class Main {<br />
<br />
public static void main(String[] args) {<br />
System.out.println("YYYYMMDD.toDate:"<br />
+ DateUtil.YYYYMMDD.toDate("2012/1/29"));<br />
System.out.println("YYYYMMDDHHMM.toDate:"<br />
+ DateUtil.YYYYMMDDHHMM.toDate("2012/1/29 1:5"));<br />
System.out.println("YYYYMMDDHHMMSS.toDate:"<br />
+ DateUtil.YYYYMMDDHHMMSS.toDate("2012/1/29 1:5.7"));<br />
System.out.println("YYYYMMDDHHMMSSSSS.toDate:"<br />
+ DateUtil.YYYYMMDDHHMMSSSSS.toDate("2012/1/29 1:5.7.100"));<br />
System.out.println("JP_YYYYMMDD.toDate:"<br />
+ DateUtil.JP_YYYYMMDD.toDate("2012年1月29日"));<br />
System.out.println("JP_YYYYMMDDHHMM.toDate:"<br />
+ DateUtil.JP_YYYYMMDDHHMM.toDate("2012年1月29日1時5分"));<br />
System.out.println("JP_YYYYMMDDHHMMSS.toDate:"<br />
+ DateUtil.JP_YYYYMMDDHHMMSS.toDate("2012年1月29日1時5分7秒"));<br />
<br />
System.out.println("------------------------------");<br />
System.out.println(DateUtil.YYYYMMDD.toString(new Date()));<br />
System.out.println(DateUtil.YYYYMMDDHHMM.toString(new Date()));<br />
System.out.println(DateUtil.YYYYMMDDHHMMSS.toString(new Date()));<br />
System.out.println(DateUtil.YYYYMMDDHHMMSSSSS.toString(new Date()));<br />
System.out.println(DateUtil.JP_YYYYMMDD.toString(new Date()));<br />
System.out.println(DateUtil.JP_YYYYMMDDHHMM.toString(new Date()));<br />
System.out.println(DateUtil.JP_YYYYMMDDHHMMSS.toString(new Date()));<br />
<br />
}<br />
}<br />
<br />
</code><br />
<br />
実行結果<br />
<code><br />
YYYYMMDD.toDate:Sun Jan 29 00:00:00 JST 2012<br />
YYYYMMDDHHMM.toDate:Sun Jan 29 01:05:00 JST 2012<br />
YYYYMMDDHHMMSS.toDate:Sun Jan 29 01:05:07 JST 2012<br />
YYYYMMDDHHMMSSSSS.toDate:Sun Jan 29 01:05:07 JST 2012<br />
JP_YYYYMMDD.toDate:Sun Jan 29 00:00:00 JST 2012<br />
JP_YYYYMMDDHHMM.toDate:Sun Jan 29 01:05:00 JST 2012<br />
JP_YYYYMMDDHHMMSS.toDate:Sun Jan 29 01:05:07 JST 2012<br />
------------------------------<br />
2012/01/29<br />
2012/01/29 06:27<br />
2012/01/29 18:27.51<br />
2012/01/29 18:27.51.073<br />
2012年01月29日<br />
2012年01月29日18時27分<br />
2012年01月29日18時27分51秒<br />
<br />
</code><br />
まぁこんな感じです。<br />
DateUtilクラスでは、フォーマットを定義をして、Date<>Stringのメソッドを共通的に実装してます!<br />
フォーマットごとにDate<>String変換メソッドを実装しなくてすむので、楽です~<br />
<br />
<br />
※サンプルでは、toDateメソッドにて、ParseExceptionをRuntimeExceptionにラップしてしまっているので、使うときは、システムで使用しているExceptionにラップして使うようにしてください!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-60099609339677637562012-01-22T23:05:00.001+09:002012-01-22T23:06:08.302+09:00tilesが動かない!springを使う場合は、tiles用のRequestプロセッサを指定してね。以下の環境で、strutsのtilesをしようしようとしたら503エラーが。。<br />
<br />
struts 1.3.10<br />
spring 2.5<br />
<br />
なんでかって。。それは、struts-configで宣言しているcontrollerタグで指定するクラスが間違ってたからでした。<br />
<br />
↓の用に設定していましたが、DelegatingRequestProcessorではなDelegatingTilesRequestProcessorでした。。<br />
<br />
ダメ<br />
<blockquote class="tr_bq"><controller><br />
<set-property property="processorClass"<br />
value="org.springframework.web.struts.DelegatingRequestProcessor"/><br />
</controller></blockquote><br />
<br />
正解<br />
<blockquote class="tr_bq"><br />
<controller><br />
<set-property property="processorClass"<br />
value="org.springframework.web.struts.DelegatingTilesRequestProcessor"/><br />
</controller></blockquote><br />
これに数時間はまってましたorz..Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8470045973824089219.post-81573507450329823622012-01-22T22:44:00.002+09:002012-01-22T22:52:51.140+09:00JSPの上のほうに書く@page contentTypeやカスタムタグの宣言を省略する<b><span style="font-size: large;">きっかけ</span></b><br />
JSPを作成する際に上のほうに↓のような宣言をよくかきますよね。。<br />
<br />
<br />
<br />
<blockquote class="tr_bq"><%@ page contentType="text/html;charset=UTF-8"%><br />
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%></blockquote><br />
<br />
これをどのすべてのJSPファイルに書くのは面倒だし重複コードになる気がしたので、どうにか省略できる方法はないかと探したら見つけたので、メモしておきます。<br />
<br />
<b><span style="font-size: large;"><%@ page contentType="text/html;charset=UTF-8"%>の省略</span></b><br />
これは、以下のページを見るとわかります。<br />
<br />
<a href="http://docs.oracle.com/cd/E18355_01/web.1013/B31860-01/jspnls.htm">http://docs.oracle.com/cd/E18355_01/web.1013/B31860-01/jspnls.htm</a> <br />
<br />
<h3 class="H2" style="background-color: white; color: #336699; font-size: 1.1em;"><span style="font-family: 'MS Pゴシック', Gothic, Arial, Helvetica, sans-serif;">pageディレクティブでのコンテンツ・タイプの設定</span></h3><div><span style="font-family: 'MS Pゴシック', Gothic, Arial, Helvetica, sans-serif;">あたり</span></div><div><span style="font-family: 'MS Pゴシック', Gothic, Arial, Helvetica, sans-serif;"><br />
</span><br />
<span style="font-family: 'MS Pゴシック', Gothic, Arial, Helvetica, sans-serif;">呼んでいくと</span></div><div>contentTypeエンコーディングを指定しない</div>かつ<br />
pageEncodingを指定 <br />
した場合、contentTypeエンコーディングは、pageEncodingを指定 に従うとあるので、pageEncodingをweb.xmlのjsp-configにて、設定してあげれば、省略することが出来ます。<br />
<br />
例えば、①の@pageタグを省略したい場合は、jsp-configには②のように書きます。<br />
<br />
①<br />
<%@ page contentType="text/html;charset=UTF-8"%> <br />
<br />
②<br />
<br />
<jsp-property-group><br />
<url-pattern>*.jsp</url-pattern><br />
<page-encoding>UTF-8</page-encoding><br />
</jsp-property-group><br />
</jsp-config><br />
<br />
これで、あえて、@pageタグを記載しなければ、すべてのJSPページのcontextTypeは<br />
"text/html;charset=UTF-8" <br />
となります。(JSPファイルの場合、text/html;はデフォルトで付与されるそうです)<br />
<br />
<b><span style="font-size: large;">カスタムタグの宣言を省略</span></b><br />
以下のページに書いてありました。<br />
<a href="http://www.atmarkit.co.jp/fjava/javatips/119jspservlet39.html">http://www.atmarkit.co.jp/fjava/javatips/119jspservlet39.html</a> <br />
<br />
jsp-configの<br />
<span style="background-color: #000066; color: white; font-family: monospace;"><include-prelude></include-prelude></span>include-preludタグを使えばすべてのJSPの上部に任意のJSPを設定できるようです。<br />
<br />
で、include-prelud<span style="background-color: #000066; color: white; font-family: monospace;"><include-prelude></include-prelude></span>タグにカスタムタグの宣言だけ書いてあるJSPを指定すれば、すべてのJSPの上部にカスタムタグの宣言が挿入されるってことです!<br />
<br />
ecilpseでjspを作成する際に、この<span style="background-color: #000066; color: white; font-family: monospace;"><include-prelude></include-prelude></span>タグを設定してから保管機能(Ctrl+SPとか)を使うと宣言したカスタムタグが保管されるので、便利です。<br />
<br />
<br />
<span style="color: blue; font-family: inherit;">これでJSPの上のほうがすっきり!</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-84873243385518708262012-01-22T19:53:00.000+09:002012-01-22T19:53:34.217+09:00tiles:getAsString で取得した値をbean:message のkey属性に値を設定するtiles.xmlでputタグに設定したvalueの値を、JSP側のbean:messageタグのkey属性に設定しようとしたらはまったので、メモします。<br />
<br />
<span style="font-size: large;"><b>前提</b></span><br />
<br />
<b>tiles.xml</b><br />
<b> </b>↓の用に定義しています。<br />
<br />
<blockquote class="tr_bq"><definition name="baseLayout" path="/WEB-INF/jsp/shared/baseLayout.jsp"><br />
<put name="screenId" value="A001"/><br />
</definition></blockquote><br />
<div><b>bean:messageで取得するリソースファイル</b></div><div>リソースファイルの内容を↓の用に設定して、struts-configにリソースファイルとして定義しておきます。</div><div><br />
</div><div><blockquote class="tr_bq"> A001=A画面</blockquote></div><div><br />
</div><div>baseLayout.jspでは、tiles.xmlで指定したscreenIdを取得し、リソースファイルに設定した"A画面"という文字をbean:messageタグを使って取得しようとしたとします。<br />
<br />
<span style="font-size: large;"><b>問題</b></span></div><div><br />
</div><div>↓の様に書いてもだめでした。。。まぁ当然ですよね。<br />
<br />
<blockquote class="tr_bq"><bean:message key="<tiles:getAsString name="screenId"/>" /></blockquote><br />
<b><span style="font-size: large;">対策</span></b> </div><span style="line-height: 19px; text-align: -webkit-left;">bean:defineを使って一旦変数にとり、その後EL式を使って取得するようにしました。</span><br />
<span style="line-height: 19px; text-align: -webkit-left;"></span><br />
<blockquote class="tr_bq"><bean:define id="screenId"><tiles:getAsString name="screenId"/></bean:define><br />
<bean:message key="${screenId}" /></blockquote>これで何とかリソースファイルから値を取得することが出来ました。<br />
<div style="font-size: small;"><br />
</div><b><span style="font-size: large;">欠点</span></b><span style="font-size: x-small;"> </span><br />
<br />
<span style="font-size: 13px; line-height: 19px; text-align: -webkit-left;">この方法だとtiles.xmlでscreenIdが</span><span style="font-size: 13px; line-height: 19px; text-align: -webkit-left;">putタグで定義されていない場合、bean:defineにnullを設定しようとするため、エラーとなってしまいます。。。orz..</span><br />
<div style="text-align: -webkit-left;"><span style="font-size: x-small;"><span style="line-height: 19px;"><br />
</span></span></div><div style="text-align: -webkit-left;"><span style="font-size: x-small;"><span style="line-height: 19px;">欠点を克服できる方法がありましたら、教えていただけるとありがたいです。</span></span></div><div style="text-align: -webkit-left;"><span style="font-size: x-small;"><span style="line-height: 19px;"><br />
</span></span></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-44475852988646283502012-01-15T10:50:00.000+09:002012-01-15T10:50:11.836+09:00antのreplaceregrexタスクを使って複数行置換!前回に引き続きantでreplace文字列のreplaceです~<br />
今回は、ある複数行からある複数行に置換する方法です。<br />
<br />
例えばあるファイル(test.xml)内にある①のような複数行の文字列を②に置換したいとします。<br />
<br />
①<br />
<pre><code><hoge name="a">
aaaa
</hoge></code></pre><br />
②<br />
<pre><code><piyo name="b">
bbbb
</piyo></code></pre><br />
<pre>その場合以下のようにreplaceregrexタスクで記載します。</pre><pre></pre><pre><code>
</code></pre><pre>その場合、replace</pre><br />
<pre><code><replaceregexp file="./test.xml" encoding="UTF-8" flags="gs" replace="&lt;piyo name=&quot;b&quot;&gt;&#10;bbbb&#10;&lt;/piyo&gt;">
<regexp pattern="&lt;hoge name=&quot;a&quot;&gt;.*?aaaa.*?/hoge&gt;" />
</replaceregexp></code></pre><pre><code>
</code></pre><pre><code>のようになります。</code></pre><pre><code>
</code></pre><pre>ポイントは、flagsに設定している"gs"と文字のエスケープです。</pre><br />
<br />
<pre>【flagsに設定している"gs"】</pre><br />
<pre>g:繰り返し</pre><pre>regexpタスクで指定したpatternに指定した1度該当しても置換を継続して行う。</pre><pre></pre><pre>s:シングルラインモード</pre><pre>通常"."は\nを除く任意の一文字を示すが、シングルラインモードでは、</pre><pre><pre>"."は\nを含む一文字を示します。</pre></pre><pre>シングルラインモードに設定することで、複数行の内容のファイルを1行として扱うことが出来るので、複数行にまたがる正規表現が比較的簡単にかけます。</pre><pre></pre><pre>【文字をエスケープ】</pre><pre><pre><code>replaceregexpタスクの</code>replace属性に置換後の複数行の内容を記載するときや</pre><pre><pre><code>regexpタスクのpattern属性を記載するときは、</code></pre></pre></pre><pre>antはxml形式で記載するので、xmlの記載方法にのっとって記載しなければなりません。</pre><pre></pre><pre>xmlでは、改行コード、ダブルクオート、<,>をエスケープしないとうまく文字を認識してくれないので、以下のようにエスケープします。</pre><pre></pre><br />
<pre><code>< &lt;
> &gt;
LF &#10;
CR &#13;</code></pre><pre><code>
</code></pre><pre>例では、改行をLFのみで示しています。</pre><pre></pre><pre>インデントの部分を広報参照で書ければ汎用性が高くなおよいと思いますが、</pre><pre>例では、おこなっていません。</pre><pre></pre><pre></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-65312618596299159582012-01-07T03:54:00.001+09:002012-01-10T00:33:01.028+09:00Antのrepraceで“(ダブルクォーテーション)を指定する方法<div>久々にはまりましたので、メモします。<br />
<br />
antのreplaceタスクで置換対象文字列の抽出を正規表現で書いていたときのことです。<br />
<br />
置換対象文字列に"(ダブルクォーテーション)が入っていたので、<br />
↓のように「"」を「\"」としたのですが、eclipseに怒られてしまいました。。<br />
<br />
<code><replaceregexp encoding="UTF-8" flags="g" replace="\[\0\]"><br />
<regexp pattern="\".*\""></regexp><br />
</replaceregexp></code><br />
<br />
で、いろいろ悩んだ結果「"」はアスキーコードで0x22なので、↓の用に書いたらいけました。<br />
<br />
<code><replaceregexp encoding="UTF-8" flags="g" replace="\[\0\]"><br />
<regexp pattern="\x22.*\x22"></regexp><br />
</replaceregexp></code><br />
<br />
<br />
ちなみにreplaceregexpタグのreplace属性側に「\x22」を指定したところ「x22」と認識されてしまいました。<br />
replaceregexpタグのreplace属性に設定する場合は、もう一工夫いるようでしたが、わかりませんでしたorz...<br />
<br />
誰か知っている方、いらっしゃいましたら、コメントください。</div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-8470045973824089219.post-68034391728539620492012-01-02T00:40:00.000+09:002012-01-02T00:40:10.001+09:00gaeでローカル起動したらJDOUserExceptionやっと新機能を実装してローカル環境でgaeを起動したら↓のエラーが。。。<br />
<br />
<pre class="ae-logs-expanded ae-pre-wrap" style="background-color: #e9e9e9; font-family: 'Courier New'; font-size: 13px; line-height: 19px; padding-bottom: 0.5em; padding-left: 1.5em; padding-right: 0px; padding-top: 0.3em; text-align: left; white-space: pre-wrap; word-wrap: break-word;">javax.jdo.JDOUserException: Persistent class "Class org.pupit.model.PupitThread does not seem to have been enhanced. You may want to rerun the enhancer and check for errors in the output." has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.
at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:375)
at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:252)
at org.pupit.model.PupitThreadDao.selectByLastUpdateTime(PupitThreadDao.java:37)
at org.pupit.service.thread.GetPupitThreadListServiceImpl.execute(GetPupitThreadListServiceImpl.java:13)
at org.pupit.servlet.thread.IndexServlet.getThreadList(IndexServlet.java:54)
at org.pupit.servlet.thread.IndexServlet.doGet(IndexServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.serveWelcomeFileAsForward(ResourceFileServlet.java:342)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.maybeServeWelcomeFile(ResourceFileServlet.java:281)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.doGet(ResourceFileServlet.java:142)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:67)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:122)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:110)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:679)
NestedThrowablesStackTrace:
Persistent class "Class org.pupit.model.PupitThread does not seem to have been enhanced. You may want to rerun the enhancer and check for errors in the output." has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.
org.datanucleus.store.exceptions.NoTableManagedException: Persistent class "Class org.pupit.model.PupitThread does not seem to have been enhanced. You may want to rerun the enhancer and check for errors in the output." has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.
at org.datanucleus.store.appengine.DatastoreManager.getDatastoreClass(DatastoreManager.java:722)
at org.datanucleus.store.appengine.query.DatastoreQuery.performExecute(DatastoreQuery.java:216)
at org.datanucleus.store.appengine.query.JDOQLQuery.performExecute(JDOQLQuery.java:89)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1489)
at org.datanucleus.store.query.Query.executeWithArray(Query.java:1371)
at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:243)
at org.pupit.model.PupitThreadDao.selectByLastUpdateTime(PupitThreadDao.java:37)
at org.pupit.service.thread.GetPupitThreadListServiceImpl.execute(GetPupitThreadListServiceImpl.java:13)
at org.pupit.servlet.thread.IndexServlet.getThreadList(IndexServlet.java:54)
at org.pupit.servlet.thread.IndexServlet.doGet(IndexServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.serveWelcomeFileAsForward(ResourceFileServlet.java:342)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.maybeServeWelcomeFile(ResourceFileServlet.java:281)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.doGet(ResourceFileServlet.java:142)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:67)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:122)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:110)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)</pre><pre class="ae-logs-expanded ae-pre-wrap" style="background-color: #e9e9e9; font-family: 'Courier New'; font-size: 13px; line-height: 19px; padding-bottom: 0.5em; padding-left: 1.5em; padding-right: 0px; padding-top: 0.3em; text-align: left; white-space: pre-wrap; word-wrap: break-word;"></pre><br />
調べてみたところeclipseでプロジェクトをクリーンすればいいとのことだったので、クリーンしたのですが、、↓のエラーがでてプロジェクトのクリーンにも失敗してましたorz...<br />
<br />
<pre class="ae-logs-expanded ae-pre-wrap" style="background-color: #e9e9e9; font-family: 'Courier New'; font-size: 13px; line-height: 19px; padding-bottom: 0.5em; padding-left: 1.5em; padding-right: 0px; padding-top: 0.3em; text-align: left; white-space: pre-wrap; word-wrap: break-word;">Encountered a problem: Unexpected exception
Please see the logs [C:\Users\xxx\AppData\Local\Temp\enhance45590413067311643.log] for further information.
↓ファイルの内容↓
java.lang.RuntimeException: Unexpected exception
at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:59)
at com.google.appengine.tools.enhancer.Enhance.<init>(Enhance.java:60)
at com.google.appengine.tools.enhancer.Enhance.main(Enhance.java:41)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:57)
... 2 more
Caused by: org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/eclipse_web/plugins/com.google.appengine.eclipse.sdkbundle.1.4.0_1.4.0.v201012021502/appengine-java-sdk-1.4.0/lib/user/orm/datanucleus-appengine-1.0.8.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/C:/eclipse_web/workspace/pu-pit/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar."
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:434)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:340)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:222)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.java:153)
at org.datanucleus.plugin.PluginManager.registerExtensionPoints(PluginManager.java:82)
at org.datanucleus.OMFContext.<init>(OMFContext.java:160)
at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:172)
at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:150)
at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1157)
... 7 more
</pre><br />
これは、 WEB-INF/lib 以下から<br />
datanucleus-appengine-1.0.8.final.jar<br />
を削除して、プロジェクト>クリーン したらクリーンでました!<br />
<br />
で、gaeをローカルで起動したところ<br />
datanucleus-appengine-1.0.8.final.jar<br />
がないので、起動できないと起こられたので、<br />
datanucleus-appengine-1.0.8.final.jar<br />
を元の場所(WEB-INF/lib以下)に戻して起動しました!!!!<br />
<br />
<<追記>><br />
このJDOUserExceptionが出る状態でサーバにアップロードするとサーバ側でも同様のエラーが出るので、注意しましょう!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-83020952889360212162012-01-02T00:21:00.000+09:002012-01-02T00:21:03.667+09:00gaeのweb.xmlでは日本語コメントが使えないgaeで自分の作ったアプリケーションをサーバにデプロイしようとしたら↓のエラーが!!<br />
<br />
<br />
<br />
Unable to update:<br />
com.google.apphosting.utils.config.AppEngineConfigException: Received SAXException parsing the input stream for C:\Users\iichico\AppData\Local\Temp\appcfg6630924556865691858.tmp\WEB-INF/web.xml<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.AbstractConfigXmlReader.getTopLevelNode(AbstractConfigXmlReader.java:215)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.AbstractConfigXmlReader.parse(AbstractConfigXmlReader.java:229)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.WebXmlReader.processXml(WebXmlReader.java:146)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.WebXmlReader.processXml(WebXmlReader.java:22)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.AbstractConfigXmlReader.readConfigXml(AbstractConfigXmlReader.java:112)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.WebXmlReader.readWebXml(WebXmlReader.java:73)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.appengine.tools.admin.Application.compileJsps(Application.java:461)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.appengine.tools.admin.Application.createStagingDirectory(Application.java:334)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.appengine.tools.admin.AppAdminImpl.doUpdate(AppAdminImpl.java:282)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.appengine.tools.admin.AppAdminImpl.update(AppAdminImpl.java:48)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.appengine.eclipse.core.proxy.AppEngineBridgeImpl.deploy(AppEngineBridgeImpl.java:400)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.appengine.eclipse.core.deploy.DeployProjectJob.runInWorkspace(DeployProjectJob.java:148)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)<br />
Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.mortbay.xml.XmlParser.parse(XmlParser.java:230)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at com.google.apphosting.utils.config.AbstractConfigXmlReader.getTopLevelNode(AbstractConfigXmlReader.java:207)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>... 13 more<br />
Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLEntityScanner.peekChar(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLScanner.scanComment(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanComment(Unknown Source)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>... 23 more<br />
<div><a name='more'></a>原因は、web.xmlに日本語が含まれていたため、でした。</div><div><br />
</div><div>日本語コメントを消したら解消しました!</div><div><br />
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-36073617561036635152009-12-01T01:15:00.001+09:002009-12-01T01:15:12.827+09:00携帯から初投稿<p class="mobile-photo"><a href="http://1.bp.blogspot.com/_PrGgQIBUYr0/SxPvkvHxu1I/AAAAAAAAABI/B5ygE65hn4I/s1600/Image404-712829.jpg"><img src="http://1.bp.blogspot.com/_PrGgQIBUYr0/SxPvkvHxu1I/AAAAAAAAABI/B5ygE65hn4I/s320/Image404-712829.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5409930991805512530" /></a></p>もう冬ですね。。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8470045973824089219.post-9940349269985355892009-11-30T00:48:00.001+09:002009-11-30T00:50:09.866+09:00初投稿です。お金の払い忘れで、ロリポから追い出されてしまいました。<div><br /></div><div>とりあえず、こっちのブログだけやってきます。</div><div><br /></div><div>よろしくお願いします。</div>Unknownnoreply@blogger.com0