<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:image="http://purl.org/rss/1.0/modules/image/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel rdf:about="http://pixiv.cc/mix3/">
<title>おっと萌えキャラの悪口はそこまでだ</title>
<link>http://pixiv.cc/mix3/</link>
<description>
</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<image rdf:resource="http://image.profile.livedoor.jp/icon/_60.gif"/>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51402295.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51398687.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51396650.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51387905.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51361295.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51355695.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51347666.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51346784.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51345734.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51344868.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51344623.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51343747.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51343740.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51337134.html" />
  <rdf:li rdf:resource="http://pixiv.cc/mix3/archives/51334490.html" />
 </rdf:Seq>
</items>
</channel>
<image rdf:about="http://image.profile.livedoor.jp/icon/_60.gif">
 <title>おっと萌えキャラの悪口はそこまでだ</title>
 <link>http://pixiv.cc/mix3/</link>
 <url>http://image.profile.livedoor.jp/icon/_60.gif</url>
</image>
<item rdf:about="http://pixiv.cc/mix3/archives/51402295.html">
<title>googlecode のSVNをMavenリポジトリとして使ってみる</title>
<link>http://pixiv.cc/mix3/archives/51402295.html</link>
<description>自鯖にもMavenリポジトリはあるけれども、多分GoogleCodeの方が色々と信頼出来るので。
以下を参考にGoogleCodeにデプロイしてみた。
Maven2DistributionManagementOnGooglecode - raisercostin - How to configure maven2 distributionManagement to upload release on goog...</description>
<dc:creator></dc:creator>
<dc:date>2010-03-12T15:04:40+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[自鯖にもMavenリポジトリはあるけれども、多分GoogleCodeの方が色々と信頼出来るので。<br>
以下を参考にGoogleCodeにデプロイしてみた。<br>
<a href="http://code.google.com/p/raisercostin/wiki/Maven2DistributionManagementOnGooglecode">Maven2DistributionManagementOnGooglecode - raisercostin - How to configure maven2 distributionManagement to upload release on googlecode.com . - Project Hosting on Google Code</a><br>
<br>
現状以下のものをデプロイしている。<br>
・gaej-quickstart<br>
・gaej-wicket-quickstart<br>
・datastore-map<br>
<br>
gaej-quickstart、gaej-wicket-quickstartは<a href="http://twitter.com/shin1ogawa">shin1</a>さんのgaejtoolsを使って作った自分用Archetype。<br>
自分はMavenを依存解決にしか活用していないので、それだけ出来るようにしたシンプルな構成。<br>
Mavenでごりごり開発したい場合は<a href="http://twitter.com/shin1ogawa">shin1</a>さんのArchetypeを使いましょう。自分はなんでか上手く動いてくれません。<br>
<a href="http://code.google.com/p/appengine-hackathon-ja/wiki/gaejsimplequickstart">gaejsimplequickstart - appengine-hackathon-ja - Project Hosting on Google Code</a><br>
<br>
datastore-mapは前回記事にしたもの。少し修正している。<br>
<br>
修正した点<br>
・Mapインタフェースを実装するのでは無く独自のインタフェースを用意し実装した<br>
　→ わざわざエラーを投げるぐらいなら最初からメソッドを見せなければ良い<br>
・エンティティグループを分割した<br>
　→ トランザクションによる排他が頻発しないように（これは使い方による）<br>
・CachedDatastoreMapの修正<br>
　→ キャッシュの仕方に問題があり異常動作していたため修正<br>
<br>
以上。　引越しに伴いしばらく自鯖が使えなくなるので、開発に必要なデータだけバックアップしなければ…
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51402295" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51398687.html">
<title>DatastoreMapを修正してみた</title>
<link>http://pixiv.cc/mix3/archives/51398687.html</link>
<description>DatastoreMap とは以下の記事で公開された GAE/J の Datastore を Map で扱うものです。
Google App EngineのDatastoreをMapでラップする - $koherent-&amp;gt;diaryGoogle App Engine for Javaで、ちょっとしたデータを永続化するためだけにDatastoreを触るのは面倒です。そこで...</description>
<dc:creator></dc:creator>
<dc:date>2010-03-03T03:13:05+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[DatastoreMap とは以下の記事で公開された GAE/J の Datastore を Map で扱うものです。<br>
<blockquote><a href="http://d.hatena.ne.jp/koherent/20100202/1265083723">Google App EngineのDatastoreをMapでラップする - $koherent-&gt;diary</a><hr />Google App Engine for Javaで、ちょっとしたデータを永続化するためだけにDatastoreを触るのは面倒です。そこで、Datastoreをjava.util.Mapでラッピングしたクラスを作ってみました。</blockquote><br>
簡単なコードを書くのに、low-level-api だとか JDO だとか slim3 なんかだと、煩雑だったり仰々しかったりするので、<br>
Map程度だと扱いやすくて丁度良いのかもねぇ、などと思ってちょこちょこ触っていたのですが。<br>
<br>
実際に中を見ると中々どうして、トランザクションの処理が怪しい。<br>
<pre class="brush: java; font-size: 50%;"><br>
	@Override<br>
	public V put(K key, V value) throws ConcurrentModificationException {<br>
		ConcurrentModificationException exception;<br>
		int retryCount = 0;<br>
<br>
		do {<br>
			Transaction transaction = service.beginTransaction();<br>
<br>
			V oldValue = get(key);<br>
<br>
			try {<br>
				service.put(createEntity(key, value));<br>
				transaction.commit();<br>
<br>
				return oldValue;<br>
			} catch (ConcurrentModificationException e) {<br>
				if (transaction.isActive()) {<br>
					transaction.rollback();<br>
				}<br>
<br>
				exception = e;<br>
			}<br>
		} while (retryCount++ < numberOfRetries);<br>
<br>
		throw exception;<br>
	}<br>
</pre>正しくは、[12行目] service.put(<font color="#00FF00">transaction, </font>createEntity(key, value));　となっていなければならないハズ。<br>
<br>
しかし、そのまま transaction を突っ込んでもダメだったり。<br>
データはルートエンティティに保存されているので、トランザクション処理しようとすると怒られる。<br>
<br>
後これは仕様なので仕方ないのだけれど、１メガ制限があるので１メガ超えるデータを突っ込むと当然怒られる。<br>
<br>
ということで、トランザクションと１メガ制限超えの２点の修正をしてみた。<a href="http://homepage2.nifty.com/mix3/mix3-appengine-map-1.0.zip">mix3-appengine-map-1.0.zip</a><br>
<br>
使い方は以下のような感じ<br>
[実行]<br>
<pre class="brush: java; font-size: 50%;"><br>
		CachedDatastoreMap&lt;String, byte[]&gt; map = new CachedDatastoreMap&lt;String, byte[]&gt;(&quot;ByteArray&quot;);<br>
		byte[] b = new byte[1024 * 1024 + 1];<br>
		byte[] c = new byte[1024 * 1024  * 3 + 1];<br>
		map.put(&quot;key1&quot;, b);<br>
		map.put(&quot;key2&quot;, c);<br>
		System.out.println(map.toString());<br>
</pre>[結果]<br>
<pre class="brush: plain; font-size: 50%;"><br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)]:<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key1[0]&quot;)]:<br>
	num = 2<br>
	name = key1<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key1[1]&quot;)]:<br>
	value = &lt;Blob: 1024000 bytes&gt; (unindexed)<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key1[2]&quot;)]:<br>
	value = &lt;Blob: 24604 bytes&gt; (unindexed)<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key2[0]&quot;)]:<br>
	num = 4<br>
	name = key2<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key2[1]&quot;)]:<br>
	value = &lt;Blob: 1024000 bytes&gt; (unindexed)<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key2[2]&quot;)]:<br>
	value = &lt;Blob: 1024000 bytes&gt; (unindexed)<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key2[3]&quot;)]:<br>
	value = &lt;Blob: 1024000 bytes&gt; (unindexed)<br>
&gt;<br>
&lt;Entity [ByteArray(&quot;ByteArray&quot;)/ByteArray(&quot;key2[4]&quot;)]:<br>
	value = &lt;Blob: 73756 bytes&gt; (unindexed)<br>
&gt;<br>
</pre>Kind名を使って親エンティティを作って、その下にデータを保存していく。<br>
データは子エンティティの0番目にKey名と分割数を保存して、実際のデータはそれ以降連番で分割して保存する。<br>
取り出すときは子エンティティの0番目をまず取得し、Key名と分割数を取得。それを用いてKeyを作成しデータを取得、復元する。<br>
<br>
ちなみに、子エンティティのKey名を決めうちで付けてるので、子エンティティ同士で衝突はしませんが、<br>
親エンティティと子エンティティのKey名が衝突することはあるのでご注意を。<br>
まあ、子エンティティのKey名を『Kind名+Key名+連番』にしておけば良い話ですが。…後で修正しよう。<br>
<br>
とりあえず至る所でトランザクション使ってるような感じなのでパフォーマンスは激烈に悪い気がする。<br>
面倒だったので Set を返すようなメソッドは実装してません。UnsupportedOperationException をスローします。<br>
<br>
入れ子も可能にしたら面白そうじゃね？とかふと思った。誰か作ってくだしあ。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51398687" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51396650.html">
<title>キムヨナと浅田真央</title>
<link>http://pixiv.cc/mix3/archives/51396650.html</link>
<description>真央ちゃんの演技の方が良かった（ｷﾘｯ

『真央の演技は途切れ途切れでダメだわ』とか言ってる人いるけど知ったこっちゃねぇ。
そしてまずトリプルアクセルを褒めろと言いたい。五輪女子ＳＰで初なんだから。凄いことなんだから。
『溜めて溜めて溜めてどっこいしょって跳ぶと...</description>
<dc:creator></dc:creator>
<dc:date>2010-02-26T04:13:38+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[真央ちゃんの演技の方が良かった（ｷﾘｯ<br>
<br>
『真央の演技は途切れ途切れでダメだわ』とか言ってる人いるけど知ったこっちゃねぇ。<br>
そしてまずトリプルアクセルを褒めろと言いたい。五輪女子ＳＰで初なんだから。凄いことなんだから。<br>
『溜めて溜めて溜めてどっこいしょって跳ぶとか無いわぁ』とか言ってる場合じゃないでしょ。<br>
伊藤みどりみたいとか言ってる場合じゃないでしょ。てか伊藤みどりを馬鹿にするな。<br>
久々に伊藤みどりの動画見たけど、あの高さはハンパ無い。あれ見て茶化すとか無いわ。<br>
<br>
と言う事で、フィギュアスケートについて詳しく知らないから点数がどうのとか言えないけど、<br>
とりあえず浅田真央の演技は良かったと思うし、トリプルアクセルは凄かったと思います。<br>
<br>
別にキムヨナの演技を下に見てるとかそういうことではなく。<br>
ただ、もっと真央ちゃんを褒めてあげて欲しいなと、身近な人の声だけを聞いてるとそう思ってしまったというお話。<br>
後、伊藤みどりは凄いです。『溜めが長い』とか茶化してる奴はもう一回演技を見て悔い改めなさい。<br>
<br>
<br>
で、キムヨナについてちょっと面白かったこと。<br>
男子メダリストとキムヨナの採点を比較してみると、なんと男子よりも優れているらしい。<br>
採点基準は男女で変わらないので、普通は体力もあり難度の高いジャンプを跳ぶ男子の方が点数が高くなるのですが。<br>
-----<br>
左ｷﾑﾖﾅ 右ﾗｲｻﾁｪｯｸ<br>
・スケート技術<br>
8.60 > 8.20<br>
・技のつなぎ<br>
7.90 < 7.95<br>
・表現力<br>
8.60 = 8.60<br>
・振り付け<br>
8.40 < 8.50<br>
・音楽の調和<br>
8.75 = 8.75<br>
[42.25] > [42.00]<br>
-----<br>
左ｷﾑﾖﾅ 右ﾌﾟﾙｼｪﾝｺ<br>
・スケート技術<br>
8.60 > 8.20<br>
・技のつなぎ<br>
7.90 > 6.80<br>
・表現力<br>
8.60 < 8.65<br>
・振り付け<br>
8.40 > 7.85<br>
・音楽の調和<br>
8.75 > 8.25<br>
[42.25] > [39.75]<br>
-----<br>
左ｷﾑﾖﾅ 右高橋<br>
・スケート技術<br>
8.60 > 8.30<br>
・技のつなぎ<br>
7.90 > 7.50<br>
・表現力<br>
8.60 > 8.55<br>
・振り付け<br>
8.60 > 8.55<br>
・音楽の調和<br>
8.75 > 8.70<br>
[42.25] > [41.35]<br>
<br>
採点についてネットでは色々と物議を醸してるようですね。「キムヨナ　不正」で否定肯定色々出てきます。<br>
ちなみに、五輪だけの話でなくて以前からずっと言われ続けているようです。<br>
キムヨナの母国があそこなだけにさもありなんと言った感じですが、さて。<br>
テレビで全くそういうことが流れてこないのはやっぱり配慮してるからなのかなぁ。<br>
<br>
以下回転数不足検証の動画（の生き残り　かなり強烈な削除が行われているらしい）<br>
<object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/bgREPIOKiCQ&hl=ja_JP&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/bgREPIOKiCQ&hl=ja_JP&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51396650" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51387905.html">
<title>FlashDevelopによるAIRアプリ開発　導入メモ</title>
<link>http://pixiv.cc/mix3/archives/51387905.html</link>
<description>AIRはFlexと併せて覚えて行きたいなぁということで、唐突にやってみた。

IDEはフリーでEclipse以外という制限の元、FlashDevelopに決定。
minibuilderも良いなあと思ったものの、mxmlの編集には対応していないので除外。
（今後、バージョンアップして対応した場合は乗り換...</description>
<dc:creator></dc:creator>
<dc:date>2010-02-06T00:43:26+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[AIRはFlexと併せて覚えて行きたいなぁということで、唐突にやってみた。<br>
<br>
IDEはフリーでEclipse以外という制限の元、FlashDevelopに決定。<br>
minibuilderも良いなあと思ったものの、mxmlの編集には対応していないので除外。<br>
（今後、バージョンアップして対応した場合は乗り換えるかも）<br>
<br>
FlashDevelopで開発するには以下の環境が必要。<br>
・<a href="http://www.java.com/ja/download/manual.jsp">java runtime: 1.6以上</a><br>
・<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325FD-AE52-4E35-B531-508D977D32A6&displaylang=ja">.NET Framework runtime: .NET Framework 2.0以上</a><br>
・<a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3">コンパイラ: Flex3 SDK</a>(3.4推奨？)<br>
・<a href="http://get.adobe.com/air/?loc=jp">AIRランタイム: Adobe AIR 1.5以上</a><br>
<br>
環境が用意出来たら以下からFlashDevelopをゲット。お好みで日本語化ファイルも。<br>
以下の<br>
<a href="http://www.flashdevelop.org/community/viewforum.php?f=11">FlashDevelop.org - View forum - Releases</a><br>
<a href="http://www.logicalyze.net/blog/?cat=416">logicalyze::blog</a><br>
<br>
FlashDevelopの初期設定は以下のような感じで。<br>
１．FlashDevelopを起動する。<br>
２．メニューから「Tools」→「Program Settings」を選ぶ。<br>
３．左のリストの中から「FlashDevelop」を選び、右のリストの「Fallback CodePage」を「UTF8」にする。<br>
４．左のリストの中から「AS3Context」を選び、右のリストの「Flex SDK Location」を「C:\flex」にする。<br>
５．「Close」ボタンを押して閉じる。<br>
<br>
（参考：<a href="http://d.hatena.ne.jp/nacookan/20090603/1244091560">FlashDevelopとFlex 3 SDKでAdobe AIR - 今日覚えたこと</a>）<br>
<br>
<h3>とりあえず動かす</h3><br>
[Project]→[New Project...]から新規プロジェクトを作成する。設定は適当に。<img src="http://pixiv.blogimg.jp/mix3/imgs/e/5/e5823767.PNG" width="543" height="469" border="0" alt="NewProject" hspace="5" class="pict"  /><br /><br>
<br>
この状態で、[F5]もしくは右上青色の三角ボタンを押すと、コンパイルされ、実行結果が表示される。<br>
（何も弄っていないので、何にも無いただの窓が表示される）<br>
<br>
<br>
<h3>ビューとロジックを分けて書く</h3><br>
mxmlファイルがビューとなり、この中にActionScriptでロジックを書くことも出来る。<br>
が、多分そんなことをしたら後で後悔することになるので、<br>
「mxml＝ビュー」「as＝ロジック」と分離して書く方法を先に学ぶ。<br>
<br>
AIR開発用のフレームワークを使わないでそのように書くとなると、<br>
・IMXMLObjectを使う<br>
・ビューを継承する<br>
<br>
の２つがあるらしい。「mxml as 分離」でググると沢山出てくる。<br>
実際にそのようにして書いた例が以下。<br>
<br>
[src/Sample.mxml]<br>
<pre class="brush:xml;"><br>
<?xml version="1.0" encoding="utf-8"?><br>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:mymx="logics.*"><br>
	<mymx:MyLogic /><br>
</mx:WindowedApplication><br>
</pre><br>
[src/views/MyView.mxml]<br>
<pre class="brush:xml;"><br>
<?xml version="1.0" encoding="utf-8"?><br>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"><br>
	<mx:Button id="btn" label="ボタン"/><br>
</mx:Canvas><br>
</pre><br>
[src/logics/MyLogic.as]<br>
<pre class="brush:as3;"><br>
package logics {<br>
	import flash.events.MouseEvent;<br>
	<br>
	import mx.controls.Alert;<br>
	import mx.events.FlexEvent<br>
	<br>
	import views.MyView;<br>
	<br>
	public class MyLogic extends MyView {<br>
		public function MyLogic() {<br>
			super();<br>
			addEventListener(FlexEvent.CREATION_COMPLETE, createCompleteHandler);<br>
		}<br>
		private function createCompleteHandler(event:FlexEvent):void {<br>
			btn.addEventListener(MouseEvent.CLICK, button_clickHandler);<br>
		}<br>
		<br>
		private function button_clickHandler(event:MouseEvent):void {<br>
            		Alert.show("ボタンがクリックされたよ");<br>
        	}<br>
	}<br>
}<br>
</pre><br>
<br>
MyViewにはビューだけ書き、MyLogicにてビューの対するロジックを書いている。<br>
そしてそれをSample.mxmlから呼び出している感じ。<br>
<br>
<h3>左から右へ受け流す</h3><br>
<a href="http://blog.air-life.net/2008/03/viewmxmllogicactionscript.html">AIRLife.net: view(MXML)とlogic(ActionScript)の分離</a><br>
<br>
[src/views/MyView.mxml]<br>
<pre class="brush:xml;"><br>
<?xml version="1.0" encoding="utf-8"?><br>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"><br>
	<mx:HBox><br>
		<mx:TextInput id="leftField" width="160" height="22"/><br>
		<mx:VBox><br>
			<mx:Button id="copyButton" label="Copy" width="100" height="22"/><br>
			<mx:Button id="clearButton" label="Clear" width="100" height="22"/><br>
		</mx:VBox><br>
		<mx:TextInput id="rightField" editable="false" width="160" height="22"/><br>
	</mx:HBox><br>
</mx:Panel><br>
</pre><br>
[src/logics/MyLogic.as]<br>
<pre class="brush:as3;"><br>
package logics {<br>
	import flash.events.MouseEvent;<br>
	<br>
	import mx.controls.Alert;<br>
	import mx.events.FlexEvent<br>
	<br>
	import views.MyView;<br>
	<br>
	public class MyLogic extends MyView {<br>
		public function MyLogic() {<br>
			super();<br>
			addEventListener(FlexEvent.CREATION_COMPLETE, createCompleteHandler);<br>
		}<br>
		<br>
		private function createCompleteHandler(event:FlexEvent):void {<br>
			copyButton.addEventListener(MouseEvent.CLICK, copy);<br>
			clearButton.addEventListener(MouseEvent.CLICK, clear);<br>
		}<br>
		<br>
		private function copy(event:MouseEvent):void{<br>
			rightField.text = leftField.text;<br>
		}<br>
		<br>
		private function clear(event:MouseEvent):void {<br>
			leftField.text  = "";<br>
			rightField.text = "";<br>
		}<br>
	}<br>
}<br>
</pre>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51387905" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51361295.html">
<title>あけおめ</title>
<link>http://pixiv.cc/mix3/archives/51361295.html</link>
<description>ことよろ



色塗る元気はありませんでした。</description>
<dc:creator></dc:creator>
<dc:date>2010-01-01T00:52:36+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[ことよろ<br>
<br>
<a href="http://pixiv.blogimg.jp/mix3/imgs/c/0/c04231c7.png" target="_blank"><img src="http://pixiv.blogimg.jp/mix3/imgs/c/0/c04231c7-s.png" width="296" height="599" border="0" alt="虎丸" hspace="5" class="pict"  /></a><br /><br>
<br>
色塗る元気はありませんでした。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51361295" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51355695.html">
<title>pixiv 用 SITEINFO (AutoPagerize on Greasemonkey)</title>
<link>http://pixiv.cc/mix3/archives/51355695.html</link>
<description>pixiv を見ていると、あるユーザの絵を順に見たいときが結構あります。
以前、そういった用途に AutoPagerize の SITEINFO が追加されたことがあるのですが、
一瞬で無くなりました。苦情があったか、書き換えられたかしたのでしょう。
でも、個人的には便利だったので、自分...</description>
<dc:creator></dc:creator>
<dc:date>2009-12-15T19:55:12+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[pixiv を見ていると、あるユーザの絵を順に見たいときが結構あります。<br>
以前、そういった用途に AutoPagerize の SITEINFO が追加されたことがあるのですが、<br>
一瞬で無くなりました。苦情があったか、書き換えられたかしたのでしょう。<br>
でも、個人的には便利だったので、自分で SITEINFO を追加しています。<br>
<br>
AutoPagerize の SITEINFO は <a href="http://wedata.net/databases/AutoPagerize/items">wedata</a> に追加してグローバルに適用するか、<br>
スクリプトを直接書き換えて、ローカルに適用することが出来ます。<br>
前者の方法だと、いろんな人に迷惑が掛かる場合があるので、後者の方法で適用します。<br>
<br>
Firefox から [ツール]＞[Greasemonkey]＞[ユーザスクリプトの管理]　を開いて<br>
AutoPagerize 選択し、編集ボタンを押します。エディタを適当に選ぶと編集画面が開きます。<br>
<br>
上部に SITEINFO の変数があるので、以下のように編集します。<br>
（コメントは初期のものです。当然無視して構いません）<br>
<pre class="brush: js; font-size: 50%;">var SITEINFO = [<br>
    /* sample<br>
    {<br>
        url:          'http://(.*).google.+/(search).+',<br>
        nextLink:     'id("navbar")//td[last()]/a',<br>
        pageElement:  '//div[@id="res"]/div',<br>
        exampleUrl:   'http://www.google.com/search?q=nsIObserver',<br>
    },<br>
    */<br>
    /* template<br>
    {<br>
        url:          '',<br>
        nextLink:     '',<br>
        pageElement:  '',<br>
        exampleUrl:   '',<br>
    },<br>
    */<br>
    {<br>
        url:          'http://www.pixiv.net/member_illust.php\\?mode=medium&illust_id=',<br>
        nextLink:     '//div[@id="content2"]//a[contains(text(), "»")]',<br>
        pageElement:  '//div[@id="pixiv"]',<br>
    },<br>
]</pre>以上で、pixiv 絵を順に見る AutoPagerize の設定は完了です。<br>
<br>
※ 余談 ※<br>
AutoPagerize の SITEINFO は誰でも編集が可能です。<br>
『このページは AutoPagerize 化すると便利だろうな』と思ったら一度編集してみると良いでしょう。<br>
迷惑に思う人がいれば削除されますし、間違いがあれば XPATH に強い人が修正してくれます。<br>
恐れずどんどん追加編集して、AutoPagerize をより便利に使えるようにしていきましょう。<br>
<br>
ちなみに自分は、この<a href="http://gensouchou.blog.shinobi.jp/">サイト</a>を AutoPagerize 化したいがために<a href="http://wedata.net/items/25712">忍びブログの AutoPagerize を編集</a>したことがあります。<br>
<a href="http://twitter.com/drry">drry氏</a>に編集されたりして、結構面白かったです。（どうやら<a href="http://twitter.com/drry">drry氏</a>は正規表現や、XPATH などで有名な人のようです）
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51355695" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51347666.html">
<title>Tumblr とか、各種ニュースサイトで流れている株価のグラフ</title>
<link>http://pixiv.cc/mix3/archives/51347666.html</link>
<description>

どうしてこうなった</description>
<dc:creator></dc:creator>
<dc:date>2009-11-22T23:06:22+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<a href="http://pixiv.blogimg.jp/mix3/imgs/2/a/2ab9f3ce.jpg" target="_blank"><img src="http://pixiv.blogimg.jp/mix3/imgs/2/a/2ab9f3ce-s.jpg" width="599" height="459" border="0" alt="i0030306-1258634735" hspace="5" class="pict"  /></a><br /><br>
<br>
どうしてこうなった
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51347666" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51346784.html">
<title>諸事情により wicket-rome による RSS 出力コードの抜粋</title>
<link>http://pixiv.cc/mix3/archives/51346784.html</link>
<description>【追記】
『ここを参照してコードを書いた』的な記事を過去に書いていたｗ

wicket-rome を使ってRSSを出力する場合、以下のような方法が見つかる。
http://jroller.com/wireframe/entry/wicket_feedpage
public abstract class FeedPage extends WebPage {
  @Override
  pu...</description>
<dc:creator></dc:creator>
<dc:date>2009-11-20T03:53:20+09:00</dc:date>
<dc:subject>Wicket</dc:subject>
<content:encoded><![CDATA[<hr />【追記】<br>
『<a href="http://jroller.com/wireframe/entry/wicket_feedpage">ここ</a>を参照してコードを書いた』的な記事を<a href="http://pixiv.cc/mix3/archives/51217836.html">過去に書いていたｗ</a><br>
<hr /><br>
wicket-rome を使ってRSSを出力する場合、以下のような方法が見つかる。<br>
<a href="http://jroller.com/wireframe/entry/wicket_feedpage">http://jroller.com/wireframe/entry/wicket_feedpage</a><br>
<pre class="brush: java; font-size: 50%;">public abstract class FeedPage extends WebPage {<br>
  @Override<br>
  public String getMarkupType() {<br>
    return "xml";<br>
  }<br>
<br>
  @Override<br>
  protected final void onRender(MarkupStream markupStream) {<br>
    PrintWriter writer = new PrintWriter(getResponse().getOutputStream());<br>
    SyndFeedOutput output = new SyndFeedOutput();<br>
    try {<br>
      output.output(getFeed(), writer);<br>
    } catch (IOException e) {<br>
      throw new RuntimeException("Error streaming feed.", e);<br>
    } catch (FeedException e) {<br>
      throw new RuntimeException("Error streaming feed.", e);<br>
    }<br>
  }<br>
<br>
  protected abstract SyndFeed getFeed();<br>
}</pre><br>
これだと理由は不明だが日本語が文字化けする問題が発生する。<br>
微妙に文字コードだけの問題でも無いような雰囲気。多分どうにか出来る気がするが。<br>
<br>
でも、別の方法を取れば一応文字化けしないようなので以下抜粋。<br>
[WicketApplication.java]<br>
<pre class="brush: java; font-size: 50%;">	@Override<br>
	protected void init() {<br>
		mountSharedResource("/rss", new ResourceReference("myFeed"){<br>
			@Override<br>
			protected Resource newResource() {<br>
				return new MyFeedResource(Guice.createInjector(new Module()).getInstance(Service.class));<br>
			}<br>
		}.getSharedResourceKey());<br>
	}</pre><br>
[RSSFeedPage.java]<br>
<pre class="brush: java; font-size: 50%;">public class MyFeedResource extends FeedResource{<br>
	private Service service;<br>
	<br>
	public MyFeedResource(){}<br>
	public MyFeedResource(Service service){<br>
		this.service = service;<br>
	}<br>
	<br>
	@Override<br>
	protected SyndFeed getFeed() {<br>
	    SyndFeed feed = new SyndFeedImpl();<br>
	    feed.setFeedType("rss_2.0");<br>
	    feed.setEncoding("UTF-8");<br>
	    feed.setTitle(service.getSetting().getBlogname());<br>
	    feed.setLink(service.getSetting().getBlogurl());<br>
	    feed.setDescription(service.getSetting().getDescription());<br>
	    feed.setPublishedDate(new Date());<br>
	    <br>
	    List&lt;SyndEntry&gt; entries = new ArrayList&lt;SyndEntry&gt;();<br>
	    try {<br>
			for(ArticleModel articleModel : service.getArticleList(service.getSetting().getListnum(), 0)){<br>
				SyndEntry entry = new SyndEntryImpl();<br>
			    entry.setTitle(articleModel.getTitle());<br>
			    entry.setLink(service.getSetting().getBlogurl()+"detail/"+articleModel.getId()+"/");<br>
			    entry.setPublishedDate(articleModel.getDate());<br>
				SyndContent description = new SyndContentImpl();<br>
				description.setType("text/plain");<br>
				description.setValue(articleModel.getContents());<br>
				entry.setDescription(description);<br>
			    entries.add(entry);<br>
			}<br>
		} catch (SQLException e) {<br>
			e.printStackTrace();<br>
		}<br>
	    feed.setEntries(entries);<br>
	    return feed;<br>
	}<br>
}</pre><br>
１．wicket-romeのFeedResourceを継承してgetFeedを実装したものを作成（MyFeedResource）。<br>
２．WicketApplication#init()内にで、ResourceReferenceを実装して（MyFeedResource）を返すようにして、mountする。<br>
<br>
ローカルだとこれで一応文字化けせずに表示できている。<br>
どっか海外のサイトで解説されていたwicket-romeのRSS出力方法。どこだったかは失念。<br>
<br>
<a href="http://wicketstuff.org/confluence/display/STUFFWIKI/Wicket+SyndEntryListModel">WicketStuff</a>のほうでも、Resourceとして出力するような例が示されているので、<br>
多分Resourceとして出力するのが良いのかなぁという感じ。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51346784" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51345734.html">
<title>誰得サービス　Taggimblr</title>
<link>http://pixiv.cc/mix3/archives/51345734.html</link>
<description>Taggimblr（たぎんぶらー）とは、Tumblrのpixiv絵のポストに自動でタグを付けるサービスです。
http://taggimblr.appspot.com/

いずれは、汎用的にタグ付け出来るようなサービスにするつもりです。
（URLとxpathをペアで設定できるようにするなどして、タグ付け対象を後から...</description>
<dc:creator></dc:creator>
<dc:date>2009-11-17T00:04:22+09:00</dc:date>
<dc:subject>プログラミング</dc:subject>
<content:encoded><![CDATA[Taggimblr（たぎんぶらー）とは、Tumblrのpixiv絵のポストに自動でタグを付けるサービスです。<br>
<a href="http://taggimblr.appspot.com/">http://taggimblr.appspot.com/</a><br>
<br>
いずれは、汎用的にタグ付け出来るようなサービスにするつもりです。<br>
（URLとxpathをペアで設定できるようにするなどして、タグ付け対象を後から増やせるようにするなど）
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51345734" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51344868.html">
<title>HTTPURLConnection のラッパー</title>
<link>http://pixiv.cc/mix3/archives/51344868.html</link>
<description>GAE/JのURLFetchが上手く行かなかったので、HTTPURLConnectionを使うようにしたが、
そのままだと煩雑過ぎるので、適当にラップしてみた。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWrite...</description>
<dc:creator></dc:creator>
<dc:date>2009-11-14T22:14:07+09:00</dc:date>
<dc:subject>プログラミング</dc:subject>
<content:encoded><![CDATA[GAE/JのURLFetchが上手く行かなかったので、HTTPURLConnectionを使うようにしたが、<br>
そのままだと煩雑過ぎるので、適当にラップしてみた。<br>
<pre class="brush: java; font-size: 50%;">import java.io.BufferedReader;<br>
import java.io.IOException;<br>
import java.io.InputStreamReader;<br>
import java.io.OutputStreamWriter;<br>
import java.net.HttpURLConnection;<br>
import java.net.URL;<br>
import java.util.Map;<br>
import java.util.Map.Entry;<br>
<br>
import com.google.appengine.repackaged.com.google.common.base.StringUtil;<br>
<br>
public class URLFetch {<br>
	private String url;<br>
	private String method;<br>
	private String cookie;<br>
	private String response;<br>
	private Integer responseCode;<br>
	private boolean isConnected = false;<br>
	<br>
	public URLFetch(String url, String method){<br>
		this.url = url;<br>
		this.method = method;<br>
	}<br>
	<br>
	public String getCookie(){<br>
		if(!isConnected){<br>
			try {<br>
				throw new IOException("まだ接続していません");<br>
			} catch (IOException e) {<br>
				e.printStackTrace();<br>
			}<br>
		}<br>
		return this.cookie;<br>
	}<br>
	public String getResponse(){<br>
		if(!isConnected){<br>
			try {<br>
				throw new IOException("まだ接続していません");<br>
			} catch (IOException e) {<br>
				e.printStackTrace();<br>
			}<br>
		}<br>
		return this.response;<br>
	}<br>
	public Integer getResponseCode(){<br>
		if(!isConnected){<br>
			try {<br>
				throw new IOException("まだ接続していません");<br>
			} catch (IOException e) {<br>
				e.printStackTrace();<br>
			}<br>
		}<br>
		return this.responseCode;<br>
	}<br>
	<br>
	public void newConnection(String url, String method){<br>
		this.url = url;<br>
		this.method = method;<br>
		this.cookie = null;<br>
		this.response = null;<br>
		this.responseCode = null;<br>
		this.isConnected = false;<br>
	}<br>
<br>
	public void doConnect(Map<String, String> params, String cookie) throws IOException{<br>
		URL url = new URL(this.url);<br>
		HttpURLConnection con = (HttpURLConnection) url.openConnection();<br>
		con.setRequestMethod(this.method);<br>
		if(method.toLowerCase().equals("get")){<br>
			con.setDoInput(true);<br>
			if(cookie != null){<br>
				con.setInstanceFollowRedirects(false);<br>
				con.setRequestProperty("Cookie", cookie);<br>
			}<br>
			con.connect();<br>
		}else if(method.toLowerCase().equals("post")){<br>
			if(params != null){<br>
				con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");<br>
			}<br>
			if(cookie != null){<br>
				con.setInstanceFollowRedirects(false);<br>
				con.setRequestProperty("Cookie", cookie);<br>
			}<br>
			con.setDoInput(true);<br>
			con.setDoOutput(true);<br>
			<br>
			con.connect();<br>
			if(params != null){<br>
				OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream());<br>
				osw.write(makeParams(params));<br>
				osw.flush();<br>
				osw.close();<br>
			}<br>
		}<br>
		this.cookie = con.getHeaderField("Set-Cookie");<br>
		this.responseCode = con.getResponseCode();<br>
	    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));<br>
	    String result = "";<br>
	    String line;<br>
	    while ((line = in.readLine()) != null) {<br>
	        result += line;<br>
	    }<br>
	    this.response = result;<br>
	    this.isConnected = true;<br>
	    con.disconnect();<br>
	}<br>
	<br>
	private String makeParams(Map<String, String> params){<br>
		if(params.isEmpty())<br>
			return null;<br>
		String result = "";<br>
		for(Entry<String, String> e: params.entrySet()){<br>
			result += e.getKey()+"="+e.getValue()+"&";<br>
		}<br>
		result = StringUtil.stripSuffix(result, "&");<br>
		return result;<br>
	}<br>
}</pre><br>
使い方は以下のような感じ。GETはURLに直接パラメータを指定する形。修正する予定。<br>
<pre id="src">// コンストラクタでURLとMethodを指定します。<br>
URLFetch uf = new URLFetch("http://mix3.tumblr.com/api/read", "GET");<br>
URLFetch uf = new URLFetch("http://www.tumblr.com/api/authenticate", "POST");<br>
<br>
// URLFetch#doConnectで、パラメータをHashで、クッキーを文字列で指定します。<br>
uf.doConnect(null, null);<br>
uf.doConnect(new HashMap<String, String>(){{<br>
	put("key1", value1);<br>
	put("key2", value2);<br>
}}, "");<br>
<br>
// URLFetch#doConnect実行後、レスポンス結果を受け取れます。<br>
uf.getResponseCode() // レスポンスコード<br>
uf.getResponse()     // レスポンス（文字列）<br>
uf.getCookie()       // クッキー</pre>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51344868" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51344623.html">
<title>#shiwake3 が盛り上がってると聞いて、飛んできました</title>
<link>http://pixiv.cc/mix3/archives/51344623.html</link>
<description>#shiwake3が面白いよ！ってことで、途中から、ネットの生中継を見てた（聞いてた）のだけど、
最初面白がって笑ってたけど、途中から笑えなくなって、冗談抜きで涙出てきて、すっごいブルーになった…

研究費の割り当てに外国人枠があって、研究費の３割ほどが外国人研究者...</description>
<dc:creator></dc:creator>
<dc:date>2009-11-14T04:44:14+09:00</dc:date>
<dc:subject>日記</dc:subject>
<content:encoded><![CDATA[<a href="https://twitter.com/#search?q=%23shiwake3">#shiwake3</a>が面白いよ！ってことで、途中から、ネットの生中継を見てた（聞いてた）のだけど、<br>
最初面白がって笑ってたけど、途中から笑えなくなって、冗談抜きで涙出てきて、すっごいブルーになった…<br>
<br>
研究費の割り当てに外国人枠があって、研究費の３割ほどが外国人研究者に割り当てられるのだそうだけど、<br>
それを削りたいという話で、削る理由が以下のような感じだった。<br>
『研究費の割り当てに外国人枠があるけど、日本の研究がトップクラスであるなら、<br>
金出さなくても勝手に向こうから来てくれるよね？　だからいらないよね？』<br>
<br>
これ聞いて、正直耳を疑った。研究してる人は研究の奴隷だとでも思ってるのか？と。<br>
研究が好きな人は、お金が出なくても研究するかもしれないが、お金が出なければ間違いなくモチベーションは下がるし、<br>
出来ればお金が出るところで研究しようとする。研究者の全てが『研究したい』だけが研究する理由では無い。<br>
<br>
それに外国人研究者を招くことは、様々な交流が生む。交流し技術的な交わりがさらなる技術の発展に繋がる可能性を生む。<br>
外国人研究者を招き入れる理由の多くは、そこにあるのだと思うのだけれども、そういう交流のメリットも『どうでも良い』という風だった。<br>
<br>
この時点でもう完全にブルー入っていたけれども、この後研究費を削減するという話が来て、<br>
<br>
『すぐにお金にならないような研究に金出す必要ないよね？』<br>
<br>
みたいな理由で予算を削ろうとしてきて、これ聞いて自分は泣いた。<br>
<br>
研究にも分野があって、基礎研究なんかはすぐにはお金にならないものが殆ど。<br>
でも１０年後、２０年後、それが土台となってイマをより豊かにする技術が生まれる切欠になるかもしれない。<br>
そういう研究もある。意味のある研究になるかどうかすぐには分からない。<br>
でも、分からないからこそ、そこにお金をつぎ込んで支援してあげないと、色々な可能性を潰してしまう。<br>
<br>
日本が技術立国として発展出来たのは、科学技術に対する弛まぬ投資があったから。<br>
それを、こんな噛み合わない、議論にもなってないやりとりで潰してしまうのはあんまりじゃないかと思う。<br>
<br>
そんなこんなで、仕分け人の削減縮退ありきで議論する気が全く無い感じが凄く嫌だった。<br>
最初から削ることが決まってて、削れるかどかを見分けるような雰囲気では無かった。<br>
削れるところは削るし、大事なところは削らない。それをするのが仕分け人の仕事だろうに。<br>
そもそもこんな専門分野の話の席で『私素人で貴方の言っていること良く分からないのですけど』<br>
みたいなことを平気で言うような人が混じって、予算削減縮退を決めること自体歪で違和感を感じる。<br>
<br>
日本どうなるのかなぁ…　本気で心配になる…
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51344623" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51343747.html">
<title>GAE/J TaskQueue メモ</title>
<link>http://pixiv.cc/mix3/archives/51343747.html</link>
<description>GAEではTaskQueueなるものが使える。

処理をキューに積んで、アプリケーションとは非同期に処理させることが出来る。
キューはいくつか（？）用意できるので、仕事を分割して、キューに分散させて積んで並列に処理。
処理結果をMemCacheなりDatastoreなり保存して、最後にマ...</description>
<dc:creator></dc:creator>
<dc:date>2009-11-12T03:11:07+09:00</dc:date>
<dc:subject>プログラミング</dc:subject>
<content:encoded><![CDATA[GAEではTaskQueueなるものが使える。<br>
<br>
処理をキューに積んで、アプリケーションとは非同期に処理させることが出来る。<br>
キューはいくつか（？）用意できるので、仕事を分割して、キューに分散させて積んで並列に処理。<br>
処理結果をMemCacheなりDatastoreなり保存して、最後にマージすることで、並列処理が出来るという寸法。<br>
<br>
並列処理で力を発揮すると思われるTaskQueueは、排他がどうの、スケールがどうのと、<br>
面倒なことを考えなければ簡単に使える。<br>
<br>
TaskQueueもcronと同じようにURLを叩くだけ。アプリケーション中、任意のタイミングで、<br>
URLとパラメータを指定してキューにaddするだけ。後はキューがパラメータ付きでURLにアクセスしてくれる。<br>
<br>
<pre class="brush: java; font-size: 50%;">// 静的インポート<br>
import static com.google.appengine.api.labs.taskqueue.TaskOptions.Builder.url;<br>
import com.google.appengine.api.labs.taskqueue.Queue;<br>
import com.google.appengine.api.labs.taskqueue.QueueFactory;<br>
<br>
// デフォルトで使えるキューを取得する この場合、xmlによる設定いらず<br>
// Queue queue = QueueFactory.getDefaultQueue();<br>
// キューに名前を付けてキューを取得する<br>
Queue queue = QueueFactory.getQueue("queue");<br>
// パラメータとして、key1=value2, key2=value2 を設定して、/queue にアクセスしてくれる。<br>
queue.add(url("/queue").param("key1", value1).param("key2", value));</pre><br>
名前を付けてキューを使用する場合はxmlファイルによる設定が必要。<br>
<br>
war/WEB-INF/queue.xml<br>
<pre class="brush: plain; font-size: 50%;">&lt;queue-entries&gt;<br>
	&lt;queue&gt;<br>
		&lt;name&gt;queue&lt;/name&gt;<br>
		&lt;rate&gt;12/m&lt;/rate&gt;<br>
	&lt;/queue&gt;<br>
&lt;/queue-entries&gt;</pre>&lt;rate&gt;1/s&lt;/rate&gt;とかすると毎秒タスクを処理していく。<br>
<br>
TaskQueueは、上手く使うと処理を高速化出来るのでパフォーマンスを気にする場合は積極的に使っていくと良いかもしれない。<br>
もちろん並列処理にありがちな排他処理などには気をつけないといけないけれど。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51343747" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51343740.html">
<title>GAE/J urlfetch ゴミメモ</title>
<link>http://pixiv.cc/mix3/archives/51343740.html</link>
<description>URLFetchService ufs = URLFetchServiceFactory.getURLFetchService();
HTTPResponse request = new HTTPRequest(
	new URL(&quot;http://www.pixiv.net/index.php&quot;),
	// GETがよければ HTTPMethod.GET を指定
	HTTPMethod.POST,
	// リダイレクトするとクッキーが消える場合があ...</description>
<dc:creator></dc:creator>
<dc:date>2009-11-12T02:23:19+09:00</dc:date>
<dc:subject>プログラミング</dc:subject>
<content:encoded><![CDATA[<pre class="brush: java; font-size: 50%;">URLFetchService ufs = URLFetchServiceFactory.getURLFetchService();<br>
HTTPResponse request = new HTTPRequest(<br>
	new URL("http://www.pixiv.net/index.php"),<br>
	// GETがよければ HTTPMethod.GET を指定<br>
	HTTPMethod.POST,<br>
	// リダイレクトするとクッキーが消える場合があるので<br>
	// クッキーを取得したい場合はリダイレクトさせないこと<br>
	FetchOptions.Builder.doNotFollowRedirects()<br>
);<br>
<br>
// パラメータをここでセットする<br>
request.setPayload(("mode=login&pixiv_id=user_id&pass=******&skip=1&submit=1").getBytes("UTF-8"));<br>
request.addHeader(new HTTPHeader("Content-Type","application/x-www-form-urlencoded"));<br>
response = ufs.fetch(request);<br>
<br>
// respose のヘッダからクッキーを取得<br>
for(HTTPHeader httpHeader : response.getHeaders()){<br>
	if(httpHeader.getName().equals("Set-Cookie")){<br>
		System.out.println("[Cookie] "+httpHeader.getValue());<br>
	}<br>
}</pre>こんな感じでローカルでは普通に動いていたのだが、デプロイすると何故かクッキーの取得が出来ない。<br>
エラーも警告も確認出来ていないので、実際どうなのか分からないのだけど、<br>
永続化処理しているにも関わらず保存された様子が無いので、クッキーを取得出来てないっぽい。<br>
<br>
仕方ないので、java.net で置き換えることに。 こっちだと大丈夫<br>
<pre class="brush: java; font-size: 50%;">URL login_url = new URL("http://www.pixiv.net/index.php");<br>
HttpURLConnection con = (HttpURLConnection) login_url.openConnection();<br>
con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");<br>
con.setRequestMethod("POST");<br>
// パラメータ送信するので、DoOutputをtureに<br>
con.setDoOutput(true);<br>
// クッキー取得するのでリダイレクトはさせない<br>
con.setInstanceFollowRedirects(false);<br>
con.connect();<br>
<br>
// Streamでパラメータ送信<br>
OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream());<br>
osw.write("mode=login&pixiv_id=user_id&pass=******&skip=1&submit=1");<br>
osw.flush();<br>
osw.close();<br>
<br>
// レスポンスもStream<br>
//BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));<br>
//String result = "";<br>
//String line;<br>
//while ((line = in.readLine()) != null) {<br>
//	result += line;<br>
//}<br>
<br>
// クッキー取得<br>
cookie = con.getHeaderField("Set-Cookie");<br>
con.disconnect();</pre><br>
多分自分がなんかミスってるんだろうなと思いつつ、とりあえず動くほうで動かしておく。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51343740" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51337134.html">
<title>pixiv RSS と、みんなのボットに細かい変更</title>
<link>http://pixiv.cc/mix3/archives/51337134.html</link>
<description>pixiv RSS はとりあえずクッキー使うように変更。
出来ることは確認していて、変更を適用するのが面倒で放置していました。
これで、ログインのステップが減るので、多少は付加軽減にもなるでしょう。

後、RSSの中に Tumblr へポスト（※私のアカウントで）するリンクを追加...</description>
<dc:creator></dc:creator>
<dc:date>2009-10-29T16:40:18+09:00</dc:date>
<dc:subject>日記</dc:subject>
<content:encoded><![CDATA[<a href="http://mix3.moe.hm/pixiv_rss/">pixiv RSS</a> はとりあえずクッキー使うように変更。<br>
出来ることは確認していて、変更を適用するのが面倒で放置していました。<br>
これで、ログインのステップが減るので、多少は付加軽減にもなるでしょう。<br>
<br>
後、RSSの中に <a href="http://mix3.tumblr.com/">Tumblr</a> へポスト（※私のアカウントで）するリンクを追加。<br>
投稿後ポスト先にリダイレクトされるので、そのままReblogして頂けるかと思います。<br>
Share on Tumblr があまりにも残念すぎたので、こういう形になりました。<br>
<br>
<a href="http://himachocobot.appspot.com/">みんなのボット</a>は、編集画面に削除ボタンを追加。消す作業が多少楽になったかも。<br>
本当はチェックボックスで選択して一気に削除とか考えたけど、そうすると<br>
HTMLの構造から変更しないといけなくなったので、あまりにも面倒なのでとりあえずボタンを付ける形で妥協。<br>
そのうちまた、大きく更新するときにはチェックボックス式にしたいと思います。<br>
<br>
<a href="http://himachocobot.appspot.com/">みんなのボット</a>の発言から (via @名前) が消えました。<br>
20分おきにリプライが飛んでくるのであまりにも（俺が）煩わしかったのでそのようにしました。<br>
<br>
変更はそんな感じ。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51337134" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://pixiv.cc/mix3/archives/51334490.html">
<title>みんなのボット　バージョンうｐ</title>
<link>http://pixiv.cc/mix3/archives/51334490.html</link>
<description>変更点

  low-level API → Slim3 Datastore
  WiQuery による 一覧のツリー表示
  リプライに対応
  OAuth認証後、ボットがユーザをフォロー（ダイレクトメッセージを受信可能にするため）
  OAuth認証済みであれば、ボットへダイレクトメッセージを投げることで、発言の登...</description>
<dc:creator></dc:creator>
<dc:date>2009-10-24T00:47:59+09:00</dc:date>
<dc:subject>Wicket</dc:subject>
<content:encoded><![CDATA[変更点<br>
<ul style="line-height:15px;"><br>
  <li>low-level API → <a href="http://groups.google.co.jp/group/slim3-user-japan">Slim3</a> Datastore</li><br>
  <li><a href="http://code.google.com/p/wiquery/">WiQuery</a> による 一覧のツリー表示</li><br>
  <li>リプライに対応</li><br>
  <li>OAuth認証後、ボットがユーザをフォロー（ダイレクトメッセージを受信可能にするため）</li><br>
  <li>OAuth認証済みであれば、ボットへダイレクトメッセージを投げることで、発言の登録が可能に</li><br>
  <li>手間だった入力は、複数入力が可能に（複数行送信で、一行ずつ登録）</li><br>
</ul>大きな変更から、細かい変更まで色々。<br>
ダイレクトメッセージでの登録や、複数入力時での、リプライの登録には、<pre id="src">{{キーワード}}{{メッセージ}}</pre><br>
という形式で登録することが出来ます。<br>
<br>
Twitter API の絡む Datastore 操作関連や、Ajaxの絡んだ画面操作関連はとっても汚いので、そのうちまた綺麗にしたい。<br>
機能的には満足いくまで触ったのでしばらくはこのままで行きます。 <a href="http://himachocobot.appspot.com/">みんなのボット</a> <a href="http://github.com/mix3/twitter_bot_gae_wicket_slim3">github</a>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3191260&name=pixiv:mix3&pid=51334490" width="1" height="1" />
]]>
</content:encoded>
</item>

</rdf:RDF>
