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

<channel>
	<title>週刊（月刊？）プレカリアート &#187; Java</title>
	<atom:link href="http://blog.neoneet.jp/category/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.neoneet.jp</link>
	<description>ニートになりそうな私が好き勝手書きます</description>
	<lastBuildDate>Sat, 24 Dec 2011 06:19:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>今更カブロボ</title>
		<link>http://blog.neoneet.jp/2008/09/10/%e4%bb%8a%e6%9b%b4%e3%82%ab%e3%83%96%e3%83%ad%e3%83%9c/</link>
		<comments>http://blog.neoneet.jp/2008/09/10/%e4%bb%8a%e6%9b%b4%e3%82%ab%e3%83%96%e3%83%ad%e3%83%9c/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 10:09:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[カブロボ]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[株式投資]]></category>
		<category><![CDATA[kaburobo]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/?p=99</guid>
		<description><![CDATA[カブロボコンテスト システムトレードに興味が出てきたところで、バックテストなどをしないといけない。どうせなら、ということでカブロボコンテストを利用させてもらおうと思う。 まずは自動株式売買ロボット・カブロボのサイトに登録をしてSDKをダウンロード。Eclipseでプロジェクトを作る。 続いて、プロジェクトの上で右クリック→Build Path→Add External Archiveを選択して、kaburobo-sdk-2/libにあるskaburobo-sdk.jarとhsqldb.jarを加える。 実行テストとして簡単なコードを書いてみる。 サンプルコード import java.util.List; import jp.tradesc.superkaburobo.sdk.driver.RobotDriver; import jp.tradesc.superkaburobo.sdk.robot.AbstractRobot; import jp.tradesc.superkaburobo.sdk.trade.InformationManager; import jp.tradesc.superkaburobo.sdk.trade.TradeAgent; import jp.tradesc.superkaburobo.sdk.trade.data.Stock; public class KabuRobo extends AbstractRobot { public static void main(String[] args) { String[] arg = { "-n", KabuRobo.class.getName() }; RobotDriver.main( arg ); } @Override public void order(TradeAgent tradeAgent) { InformationManager im = InformationManager.getInstance(); List [...]]]></description>
			<content:encoded><![CDATA[				<h3>カブロボコンテスト</h3>
				<p>システムトレードに興味が出てきたところで、バックテストなどをしないといけない。どうせなら、ということでカブロボコンテストを利用させてもらおうと思う。</p>
				<p>まずは<a href="http://www.kaburobo.jp/">自動株式売買ロボット・カブロボ</a>のサイトに登録をしてSDKをダウンロード。Eclipseでプロジェクトを作る。</p>
				<p>続いて、プロジェクトの上で右クリック→Build Path→Add External Archiveを選択して、kaburobo-sdk-2/libにあるskaburobo-sdk.jarとhsqldb.jarを加える。</p>
				<p>実行テストとして簡単なコードを書いてみる。</p>
				<h3>サンプルコード</h3>
				<pre class="prettyprint">
import java.util.List;

import jp.tradesc.superkaburobo.sdk.driver.RobotDriver;
import jp.tradesc.superkaburobo.sdk.robot.AbstractRobot;
import jp.tradesc.superkaburobo.sdk.trade.InformationManager;
import jp.tradesc.superkaburobo.sdk.trade.TradeAgent;
import jp.tradesc.superkaburobo.sdk.trade.data.Stock;

public class KabuRobo extends AbstractRobot {

	public static void main(String[] args) {
	    String[] arg = { "-n", KabuRobo.class.getName() };
	    RobotDriver.main( arg );
	}

	@Override
	public void order(TradeAgent tradeAgent)
	{
		InformationManager im = InformationManager.getInstance();
		List<stock> stockList = im.getStockList();

		for(Stock stock: stockList)
		{
			System.out.print(stock.getStockCode() + ":");
			System.out.println(stock.getStockName());
		}
		System.out.println("以上");
		System.exit(0);
	}

	@Override
	public void screening(TradeAgent tradeAgent) {
		System.out.println("Robot Screeing Start");
	}
}
</stock></pre>
				<h3>ポイント</h3>
				<p>まずmain()が必要。この中でRobotDriver.main()に自分のカブロボクラスを渡してやる。</p>
				<p>あとはorder()やscreening()をオーバーライドしてやる。</p>
				<h3>実行</h3>
				<p>プロジェクトで右クリック→Run As→Run Configurationを選択し、Environmentタブを選ぶ。ここでKABUROBO_HOMEを追加し、パスを教えてやる。これで準備OK。Runすると取引可能銘柄を表示してexit()する。</p>
				<h3>拡張パックを入れる</h3>
				<p>data300を公式サイトからダウンロードする。解凍してdata50と同じ階層に設置して、robot-config.xmlの<data>data50</data>を<data>data300</data>に書き換えるが、何故か動かない。付属のテキストには</p>
				<blockquote><p>
				○検証可能期間<br />
				2006年1月4日から2006年12月29日までの期間です。
				</p></blockquote>
				<p>とあるけれど、ネットを検索すると4月1日からという情報があるので、<start>2006-04-01</start>にして再度実行すると無事にリストが表示された。</p>
				<blockquote><p>
				1332:日本水産<br />
				1721:コムシスホールディングス<br />
				1801:大成建設<br />
				1802:大林組<br />
				1803:清水建設<br />
				1808:長谷工コーポレーション<br />
				1812:鹿島建設<br />
				1860:戸田建設<br />
				1878:大東建託<br />
				1925:大和ハウス工業<br />
				1928:積水ハウス<br />
				1942:関電工<br />
				1951:協和エクシオ<br />
				1963:日揮<br />
				2002:日清製粉グループ本社<br />
				2261:明治乳業<br />
				2267:ヤクルト本社<br />
				2282:日本ハム<br />
				2331:綜合警備保障<br />
				2433:博報堂ＤＹホールディングス<br />
				2501:サッポロホールディングス<br />
				2502:アサヒビール<br />
				2503:キリンビール<br />
				2579:コカ・コーラウエストジャパン<br />
				2593:伊藤園<br />
				2651:ローソン<br />
				2670:エービーシー・マート<br />
				2730:エディオン<br />
				2768:双日<br />
				2779:三越<br />
				2784:アルフレッサＨＤ<br />
				2801:キッコーマン<br />
				2802:味の素<br />
				2897:日清食品<br />
				2914:ＪＴ<br />
				3101:東洋紡績<br />
				3105:日清紡績<br />
				3332:ＪＦＥ商事ホールディングス<br />
				3337:サークルＫサンクス<br />
				3382:７＆ＩＨＤ<br />
				3401:帝人<br />
				3402:東レ<br />
				3404:三菱レイヨン<br />
				3405:クラレ<br />
				3407:旭化成<br />
				3591:ワコールホールディングス<br />
				3861:王子製紙<br />
				3893:日本製紙グループ本社<br />
				4004:昭和電工<br />
				4005:住友化学<br />
				4043:トクヤマ<br />
				4062:イビデン<br />
				4063:信越化学工業<br />
				4091:大陽日酸<br />
				4118:カネカ<br />
				4182:三菱ガス化学<br />
				4183:三井化学<br />
				4185:ＪＳＲ<br />
				4188:三菱ケミカルホールディングス<br />
				4204:積水化学工業<br />
				4208:宇部興産<br />
				4217:日立化成工業<br />
				4307:野村総合研究所<br />
				4321:ケネディクス<br />
				4324:電通<br />
				4452:花王<br />
				4502:武田薬品工業<br />
				4503:アステラス製薬<br />
				4507:塩野義製薬<br />
				4519:中外製薬<br />
				4523:エーザイ<br />
				4535:大正製薬<br />
				4543:テルモ<br />
				4568:第一三共<br />
				4631:大日本インキ化学工業<br />
				4661:オリエンタルランド<br />
				4676:フジテレビジョン<br />
				4680:ラウンドワン<br />
				4681:リゾートトラスト<br />
				4704:トレンドマイクロ<br />
				4716:日本オラクル<br />
				4723:グッドウィル・グループ<br />
				4732:ユー・エス・エス<br />
				4756:ＣＣＣ<br />
				4768:大塚商会<br />
				4901:富士写真フイルム<br />
				4902:コニカミノルタ<br />
				4911:資生堂<br />
				5001:新日本石油<br />
				5016:新日鉱ホールディングス<br />
				5108:ブリヂストン<br />
				5110:住友ゴム工業<br />
				5201:旭硝子<br />
				5214:日本電気硝子<br />
				5233:太平洋セメント<br />
				5333:日本碍子<br />
				5334:日本特殊陶業<br />
				5401:新日本製鐵<br />
				5405:住友金属工業<br />
				5406:神戸製鋼所<br />
				5407:日新製鋼<br />
				5411:ＪＦＥホールディングス<br />
				5471:大同特殊鋼<br />
				5486:日立金属<br />
				5631:日本製鋼所<br />
				5711:三菱マテリアル<br />
				5713:住友金属鉱山<br />
				5801:古河電気工業<br />
				5802:住友電気工業<br />
				5803:フジクラ<br />
				5901:東洋製罐<br />
				5929:三和シヤッター工業<br />
				5938:住生活グループ<br />
				5943:ノーリツ<br />
				5947:リンナイ<br />
				5991:日本発条<br />
				6113:アマダ<br />
				6146:ディスコ<br />
				6201:豊田自動織機<br />
				6273:ＳＭＣ<br />
				6301:コマツ<br />
				6302:住友重機械工業<br />
				6305:日立建機<br />
				6326:クボタ<br />
				6361:荏原製作所<br />
				6366:千代田化工建設<br />
				6367:ダイキン工業<br />
				6370:栗田工業<br />
				6417:ＳＡＮＫＹＯ<br />
				6448:ブラザー工業<br />
				6460:セガサミーホールディングス<br />
				6471:日本精工<br />
				6472:ＮＴＮ<br />
				6473:ジェイテクト<br />
				6479:ミネベア<br />
				6481:ＴＨＫ<br />
				6501:日立製作所<br />
				6502:東芝<br />
				6503:三菱電機<br />
				6504:富士電機ホールディングス<br />
				6581:日立工機<br />
				6586:マキタ<br />
				6701:ＮＥＣ<br />
				6702:富士通<br />
				6723:ＮＥＣエレクトロニクス<br />
				6724:セイコーエプソン<br />
				6752:松下電器産業<br />
				6753:シャープ<br />
				6758:ソニー<br />
				6762:ＴＤＫ<br />
				6764:三洋電機<br />
				6773:パイオニア<br />
				6806:ヒロセ電機<br />
				6841:横河電機<br />
				6857:アドバンテスト<br />
				6861:キーエンス<br />
				6902:デンソー<br />
				6923:スタンレー電気<br />
				6952:カシオ計算機<br />
				6954:ファナック<br />
				6967:新光電気工業<br />
				6971:京セラ<br />
				6988:日東電工<br />
				6991:松下電工<br />
				7011:三菱重工業<br />
				7012:川崎重工業<br />
				7013:石川島播磨重工業<br />
				7201:日産自動車<br />
				7202:いすゞ自動車<br />
				7203:トヨタ自動車<br />
				7211:三菱自動車工業<br />
				7259:アイシン精機<br />
				7261:マツダ<br />
				7267:ホンダ<br />
				7269:スズキ<br />
				7272:ヤマハ発動機<br />
				7453:良品計画<br />
				7459:メディセオ・パルタックホールディングス<br />
				7532:ドン・キホーテ<br />
				7731:ニコン<br />
				7733:オリンパス<br />
				7741:ＨＯＹＡ<br />
				7751:キヤノン<br />
				7752:リコー<br />
				7832:バンナムＨＤ<br />
				7862:トッパンフォームズ<br />
				7911:凸版印刷<br />
				7912:大日本印刷<br />
				7915:日本写真印刷<br />
				7936:アシックス<br />
				7951:ヤマハ<br />
				7966:リンテック<br />
				7984:コクヨ<br />
				8001:伊藤忠商事<br />
				8002:丸紅<br />
				8012:長瀬産業<br />
				8015:豊田通商<br />
				8016:オンワード樫山<br />
				8028:ファミリーマート<br />
				8031:三井物産<br />
				8035:東京エレクトロン<br />
				8036:日立ハイテクノロジーズ<br />
				8053:住友商事<br />
				8056:日本ユニシス<br />
				8058:三菱商事<br />
				8060:キヤノンＭＪ<br />
				8078:阪和興業<br />
				8113:ユニ・チャーム<br />
				8129:東邦薬品<br />
				8136:サンリオ<br />
				8184:島忠<br />
				8218:コメリ<br />
				8227:しまむら<br />
				8233:高島屋<br />
				8234:大丸<br />
				8238:伊勢丹<br />
				8242:阪急百貨店<br />
				8252:丸井<br />
				8253:クレディ　セゾン<br />
				8267:イオン<br />
				8268:西友<br />
				8270:ユニー<br />
				8273:イズミ<br />
				8281:ゼビオ<br />
				8282:ギガスケーズデンキ<br />
				8303:新生銀行<br />
				8306:三菱ＵＦＪフィナンシャル・グループ<br />
				8308:りそなホールディングス<br />
				8309:三井トラスト・ホールディングス<br />
				8316:三井住友フィナンシャルグループ<br />
				8326:福岡銀行<br />
				8328:札幌北洋ホールディングス<br />
				8331:千葉銀行<br />
				8332:横浜銀行<br />
				8333:常陽銀行<br />
				8355:静岡銀行<br />
				8377:ほくほくフィナンシャルグループ<br />
				8403:住友信託銀行<br />
				8404:みずほ信託銀行<br />
				8411:みずほフィナンシャルグループ<br />
				8473:SBIホールディングス<br />
				8515:アイフル<br />
				8564:武富士<br />
				8572:アコム<br />
				8574:プロミス<br />
				8583:ＵＦＪニコス<br />
				8591:オリックス<br />
				8601:大和証券グループ本社<br />
				8604:野村ホールディングス<br />
				8606:新光証券<br />
				8615:三菱ＵＦＪ証券<br />
				8752:三井住友海上火災保険<br />
				8766:ミレアホールディングス<br />
				8801:三井不動産<br />
				8802:三菱地所<br />
				8804:東京建物<br />
				8815:東急不動産<br />
				8830:住友不動産<br />
				8840:大京<br />
				8868:アーバンコーポレイション<br />
				8870:住友不動産販売<br />
				8874:ジョイント コーポレーション<br />
				9005:東京急行電鉄<br />
				9020:東日本旅客鉄道<br />
				9021:西日本旅客鉄道<br />
				9022:東海旅客鉄道<br />
				9041:近畿日本鉄道<br />
				9042:阪急ホールディングス<br />
				9062:日本通運<br />
				9064:ヤマトホールディングス<br />
				9101:日本郵船<br />
				9104:商船三井<br />
				9202:全日本空輸<br />
				9301:三菱倉庫<br />
				9364:上組<br />
				9401:ＴＢＳ<br />
				9404:日本テレビ放送網<br />
				9432:ＮＴＴ<br />
				9433:ＫＤＤＩ<br />
				9437:ＮＴＴドコモ<br />
				9501:東京電力<br />
				9503:関西電力<br />
				9531:東京瓦斯<br />
				9532:大阪瓦斯<br />
				9602:東宝<br />
				9613:ＮＴＴデータ<br />
				9684:スクウェア・エニックス<br />
				9735:セコム<br />
				9737:ＣＳＫホールディングス<br />
				9744:メイテック<br />
				9747:アサツー ディケイ<br />
				9766:コナミ<br />
				9831:ヤマダ電機<br />
				9843:ニトリ<br />
				9875:マツモトキヨシ<br />
				9962:ミスミグループ<br />
				9984:ソフトバンク<br />
				9987:スズケン<br />
				9989:サンドラッグ
				</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/09/10/%e4%bb%8a%e6%9b%b4%e3%82%ab%e3%83%96%e3%83%ad%e3%83%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自動トレーディングへの道(9)</title>
		<link>http://blog.neoneet.jp/2008/05/25/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%939/</link>
		<comments>http://blog.neoneet.jp/2008/05/25/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%939/#comments</comments>
		<pubDate>Sun, 25 May 2008 13:41:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[株式投資]]></category>
		<category><![CDATA[自動トレーディングへの道]]></category>
		<category><![CDATA[AutoTrading]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/?p=88</guid>
		<description><![CDATA[しばらく多忙にかまけて放置していたけれど、市況がよくなってきたのでムクムクとやる気を出して、と言っても30分ほど作業をしてみた。 方針は以前作ったMonexに対して、出来高の平均の3倍の取引があれば通知をするように変更するもの。結果がどうなるかは試してみてのお楽しみ。 巡回に関するルールの変更 変更点をいくつか。まず出来高チェックなので頻繁に見る必要はなく、サーバに与える負荷を軽くすることにした。まず銘柄数をそう多くしない前提で1分おきにチェックをする。Thread.sleep()はミリ秒を与えるので、interval = 1000 * 60としている。これをchainの要素数で割った時間だけ眠らせることにした。このオブジェクトのインスタンスは自身のstaticなチェインに記録させているので、each()してやれば、あとはどんどんnewするだけで正しく巡回する。 public static void each() throws InterruptedException { Iterator it = chain.iterator(); // リストの要素数 int size = chain.size(); int wait = interval / size; while (it.hasNext()) { StockMonitor m = it.next(); m.update(); Thread.sleep(wait); } } HistoricalPricesList Priceとあるけど出来高を今回は格納している。 package utilities; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class HistoricalPricesList [...]]]></description>
			<content:encoded><![CDATA[				<p>しばらく多忙にかまけて放置していたけれど、市況がよくなってきたのでムクムクとやる気を出して、と言っても30分ほど作業をしてみた。</p>
				<p>方針は以前作ったMonexに対して、出来高の平均の3倍の取引があれば通知をするように変更するもの。結果がどうなるかは試してみてのお楽しみ。</p>
				<h3>巡回に関するルールの変更</h3>
				<p>変更点をいくつか。まず出来高チェックなので頻繁に見る必要はなく、サーバに与える負荷を軽くすることにした。まず銘柄数をそう多くしない前提で1分おきにチェックをする。Thread.sleep()はミリ秒を与えるので、interval = 1000 * 60としている。これをchainの要素数で割った時間だけ眠らせることにした。このオブジェクトのインスタンスは自身のstaticなチェインに記録させているので、each()してやれば、あとはどんどんnewするだけで正しく巡回する。</p>
				<pre class="prettyprint">
	public static void each() throws InterruptedException {
		Iterator<stockmonitor> it = chain.iterator();

		// リストの要素数
		int size = chain.size();
		int wait = interval / size;

		while (it.hasNext()) {
			StockMonitor m = it.next();
			m.update();
			Thread.sleep(wait);
		}
	}
</stockmonitor></pre>
				<h3>HistoricalPricesList</h3>
				<p>Priceとあるけど出来高を今回は格納している。</p>
				<pre class="prettyprint">
package utilities;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class HistoricalPricesList
{
	private List<integer> historical;
	private int max;

	public HistoricalPricesList( int size )
	{
		this.max = size;
		historical = new ArrayList</integer><integer>();
	}

	public void add( int value )
	{
		int size = historical.size();

		// サイズを超える場合は一番古いものを捨てる
		if( size >= max )
			historical.remove(0);

		historical.add(value);
	}

	// リストの平均を得る
	public int average()
	{
		int size = historical.size();
		int sum = 0;
		Iterator</integer><integer> it = historical.iterator();

		// ゼロによる除算回避
		if( size == 0 )
			return 0;

		while (it.hasNext())
			sum += it.next();

		return sum / size;
	}
}
</integer></pre>
				<p>つまり、ガシガシ値を放り込むと平均を取り出せるというだけ。</p>
				<h3>update()</h3>
				<p>定期的に株価や出来高を見て、平均の3倍を超える出来高が発生したら通知する。</p>
				<pre class="prettyprint">
	public void update()
	{
		try
		{
			getPrice();
			java.util.Date d = new java.util.Date();

			if( volume != previous )
			{
				previous = volume;

				int average = historical.average();
				if( volume > 3 * average )
				{
					// 出来高急増
					System.out.println(d);
					System.out.println( code );
					System.out.println( "Last Trade:" + price );
					System.out.println( "Volume:" + volume );
					System.out.println( "" );
				}

				historical.add(volume);
			}
		}
		catch (CodeNotFoundException e)
		{
		}
	}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/05/25/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%939/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaでSQLiteを使う</title>
		<link>http://blog.neoneet.jp/2008/03/02/java%e3%81%a7sqlite%e3%82%92%e4%bd%bf%e3%81%86/</link>
		<comments>http://blog.neoneet.jp/2008/03/02/java%e3%81%a7sqlite%e3%82%92%e4%bd%bf%e3%81%86/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 15:03:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[自動トレーディングへの道]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/java/java%e3%81%a7sqlite%e3%82%92%e4%bd%bf%e3%81%86/</guid>
		<description><![CDATA[株の時系列データをどう扱うか とりあえずデータベースに放り込んでみることにする。データベースの操作もうまくラッパーを作ってしまえばSQLiteだろうとMySQLだろうと使えるはず。 SQLite JDBC Driver 検索してみるとすぐに色々見つかる。Javaで使うのは面倒くさいという話もあるけど、とりあえずSQLite JDBC Driverを試す。WindowsとMac OS X向けにはJNIを使ったネイティブ版もあるけれど、せっかくJavaを使うのだからPure Javaで試してみたい。ダウンロードして解凍するとsqlitejdbc-v037-nested.jarというものが出てくるので、パスの通っているところに設置。 サンプルコード まずはSQLite JDBC Driverのサイトのコードをそのまま試す。 package main; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class SQLiteTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db"); Statement stat = conn.createStatement(); stat.executeUpdate("create [...]]]></description>
			<content:encoded><![CDATA[				<h3>株の時系列データをどう扱うか</h3>
				<p>とりあえずデータベースに放り込んでみることにする。データベースの操作もうまくラッパーを作ってしまえばSQLiteだろうとMySQLだろうと使えるはず。</p>
				<h3>SQLite JDBC Driver</h3>
				<p>検索してみるとすぐに色々見つかる。Javaで使うのは面倒くさいという話もあるけど、とりあえず<a href="http://www.zentus.com/sqlitejdbc/">SQLite JDBC Driver</a>を試す。WindowsとMac OS X向けにはJNIを使ったネイティブ版もあるけれど、せっかくJavaを使うのだからPure Javaで試してみたい。ダウンロードして解凍するとsqlitejdbc-v037-nested.jarというものが出てくるので、パスの通っているところに設置。</p>
				<h3>サンプルコード</h3>
				<p>まずはSQLite JDBC Driverのサイトのコードをそのまま試す。</p>
				<pre class="prettyprint">package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class SQLiteTest {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
Statement stat = conn.createStatement();
stat.executeUpdate("create table people (name, occupation);");
stat.executeUpdate("insert into people values ('Gandhi', 'politics');");
stat.executeUpdate("insert into people values ('Turing', 'computers');");
stat.executeUpdate("insert into people values ('Wittgenstein', 'smartypants');");

ResultSet rs = stat.executeQuery("select * from people;");
while (rs.next()) {
System.out.println("name = " + rs.getString("name"));
System.out.println("occupation = " + rs.getString("occupation"));
}
rs.close();
conn.close();
}
}</pre>
				<h3>実行結果</h3>
				<p>なんなくビルドは通ってtest.dbというファイルが作られる。結果を確認するべく<a href="http://sourceforge.net/projects/sqlitebrowser/">SQLite Database Browser</a>でtest.dbを開く。</p>
				<p><a title="SQLite Database Browser" href="http://blog.neoneet.jp/wp-content/uploads/2008/03/dbbrowser.jpg"><img src="http://blog.neoneet.jp/wp-content/uploads/2008/03/dbbrowser.jpg" alt="SQLite Database Browser" /></a></p>
				<p>このようにちゃんとデータベースが作られている。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/03/02/java%e3%81%a7sqlite%e3%82%92%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自動トレーディングへの道(6)</title>
		<link>http://blog.neoneet.jp/2008/03/01/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%936/</link>
		<comments>http://blog.neoneet.jp/2008/03/01/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%936/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 04:02:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[株式投資]]></category>
		<category><![CDATA[自動トレーディングへの道]]></category>
		<category><![CDATA[AutoTrading]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%936/</guid>
		<description><![CDATA[自動トレーディングへの道がGoogleに つい最近までGoogleで「自動トレーディング」で検索すると最上位にヒットしていました。継続は力なり。でもまた下に下がっていきました。湯は熱し続けなければやがて水に戻る。 Context側を作る public interface IContext { public abstract void login( String ID, String Password ); public abstract void logout(); } とりあえずログインとログアウトのみ。続いてこれを実装する側 import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Panel; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import org.apache.oro.text.perl.Perl5Util; public class Monex extends JFrame implements IContext, ActionListener { // 初期状態はログインされていない private IState [...]]]></description>
			<content:encoded><![CDATA[				<h3>自動トレーディングへの道がGoogleに</h3>
				<p>つい最近までGoogleで「自動トレーディング」で検索すると最上位にヒットしていました。継続は力なり。でもまた下に下がっていきました。湯は熱し続けなければやがて水に戻る。</p>
				<h3>Context側を作る</h3>
				<pre class="prettyprint">
public interface IContext
{
 public abstract void login( String ID, String Password );
 public abstract void logout();
}</pre>
				<p>とりあえずログインとログアウトのみ。続いてこれを実装する側</p>
				<pre class="prettyprint">
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import org.apache.oro.text.perl.Perl5Util;

public class Monex extends JFrame implements IContext, ActionListener {
	// 初期状態はログインされていない
	private IState state = MonexLoggedOutState.getInstance();

	private static final long serialVersionUID = 1L;

	private TextField textClock = new TextField(60);
	private TextArea textScreen = new TextArea(10, 60);
	private Button buttonLogin = new Button("ログイン");
	private Button buttonLogout = new Button("ログアウト");
	private Button buttonQuote = new Button("株価取得");
	private Button buttonExit = new Button("終了");

	private String hash = "";
	private String sid = "";
	private String id = "";

	public Monex(String title) {
		super(title);
		setBackground(Color.lightGray);
		setLayout(new BorderLayout());

		// textClock配置
		add(textClock, BorderLayout.NORTH);
		textClock.setEditable(false);

		// textScreen配置
		add(textScreen, BorderLayout.CENTER);
		textClock.setEditable(false);

		// ボタンを配置
		Panel panel = new Panel();
		panel.add(buttonLogin);
		panel.add(buttonLogout);
		panel.add(buttonQuote);
		panel.add(buttonExit);

		add(panel, BorderLayout.SOUTH);

		pack();
		setVisible(true);
		setBounds( 10, 10, 400, 200 );
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		buttonLogin.addActionListener(this);
		buttonLogout.addActionListener(this);
		buttonQuote.addActionListener(this);
		buttonExit.addActionListener(this);

		textClock.setText(state.toString());
	}

	// ボタンが押されたとき
	public void actionPerformed(ActionEvent e) {
		System.out.println(e.toString());

		if (e.getSource() == buttonLogin) {
			state.login(this, "aa", "aaa");
			return;
		}

		if (e.getSource() == buttonLogout) {
			state.logout(this);
			return;
		}

		if (e.getSource() == buttonQuote) {
			state.quote(this);
			return;
		}

		if (e.getSource() == buttonExit) {
			System.exit(0);
			return;
		}

		System.out.println("?");
	}

	// FSMを更新する
	public void update() {
		String msg = state.toString();

		System.out.println(msg);
		textClock.setText(msg);
	}

	public void changeState(IState nextState) {
		System.out.println(this.state + "から" + nextState + "へ状態が変化しました\n");
		this.state = nextState;
		textClock.setText(state.toString());
	}

	public void getStockInformation(int stockCode) {
		// TODO 自動生成されたメソッド・スタブ

	}

	public void login(String ID, String Password) {
		state.login(this, ID, Password);
	}

	public void logout() {
		state.logout(this);
	}

	public void setSessionID(String responseBody) {
		Perl5Util pu = new Perl5Util();
		String pattern = "/＜A href=\"(https://ot2.qhit.net.*?)\".*?ACCESSKEY=\"1\"/";
		if (pu.match(pattern, responseBody)) {
			String result = pu.group(1);
			pattern = "/ot2\\.qhit\\.net/(.*?)/.*?sid=(.*?)&amp;.*?&amp;id=(.*?)$/";

			if (pu.match(pattern, result)) {
				hash = pu.group(1);
				sid = pu.group(2);
				id = pu.group(3);
			}
		}
	}

	public String makeSeaechStockCodeURL(int code) {
		String url = "https://ot2.qhit.net/";
		url += hash;
		url += "/mb/quote.cgi?F=Idetail0&amp;QCODE=";
		url += code;
		url += "&amp;MKTN=T&amp;rf=r&amp;SID=&amp;ID=";
		url += id;
		url += "&amp;DM=www&amp;mode=";

		return url;
	}
}</pre>
				<h3>実行結果</h3>
				<h3><a href="http://blog.neoneet.jp/wp-content/uploads/2008/03/loggedoutstate.jpg" title="ログインしていない状態"><img src="http://blog.neoneet.jp/wp-content/uploads/2008/03/loggedoutstate.jpg" alt="ログインしていない状態" /></a></h3>
				<p>まず起動するとログインしていない状態になる。この状態を管理しているのはMonexLoggedOutStateで、このlogout()の実装は</p>
				<pre class="prettyprint">
public void logout(Monex context) {}</pre>
				<p>になっているため、ここで「ログアウト」をクリックしてもなにも起きない。代わりに「ログイン」を押すとこちらは実装されているので処理を行ってログイン状態に遷移する。ログイン時にはセッションIDかな、何か謎の文字列を記録する。この辺は「自動トレーディングへの道(5)」にある。ログインに成功すると「ログインしていませんからログインしていますへ状態が変化しました」とコンソールに出力される。</p>
				<p><a href="http://blog.neoneet.jp/wp-content/uploads/2008/03/loggedinstate.jpg" title="ログインしている状態"><img src="http://blog.neoneet.jp/wp-content/uploads/2008/03/loggedinstate.jpg" alt="ログインしている状態" /></a></p>
				<p>この状態で「ログイン」を押しても、やはり空っぽの実装なので何もしない。株価取得は動く。</p>
				<pre>
java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=株価取得,when=0,modifiers=] on button1
(9433) 東証一部
ＫＤＤＩ
02/29 15:00
現在値:640000 +13000(+2.07%)
売り気配:641000(20)
買い気配:640000(855)
始値:626000
高値:644000
安値:625000
出来高:40107

(9202) 東証一部
ＡＮＡ
02/29 15:00
現在値:435 -1(-0.22%)
売り気配:436(77000)
買い気配:435(120000)
始値:433
高値:437
安値:431
出来高:3237000

(3436) 東証一部
ＳＵＭＣＯ
02/29 15:00
現在値:2375 -195(-7.58%)
売り気配:2385(10300)
買い気配:2375(11100)
始値:2490
高値:2505
安値:2370
出来高:2716300

(5411) 東証一部
ＪＦＥＨＤ
02/29 15:00
現在値:4740 +10(+0.21%)
売り気配:4750(6700)
買い気配:4730(38100)
始値:4810
高値:4820
安値:4570
出来高:5786000

(8058) 東証一部
三菱商
02/29 15:00
現在値:3270 -70(-2.09%)
売り気配:3270(114100)
買い気配:3260(99400)
始値:3240
高値:3280
安値:3200
出来高:10629100

(8316) 東証一部
三井住友
02/29 15:00
現在値:772000 -33000(-4.09%)
売り気配:772000(121)
買い気配:771000(38)
始値:785000
高値:789000
安値:762000
出来高:46122

(7974) 東証一部
任天堂
02/29 15:00
現在値:53300 -3200(-5.66%)
売り気配:53400(100)
買い気配:53300(2700)
始値:54200
高値:54400
安値:53100
出来高:46300</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/03/01/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%936/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NetBeans 6.0</title>
		<link>http://blog.neoneet.jp/2008/02/26/netbeans-60/</link>
		<comments>http://blog.neoneet.jp/2008/02/26/netbeans-60/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 13:18:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/netbeans-60/</guid>
		<description><![CDATA[これはいいかも知れない。以前、ちょっとだけ使ってEclipseと比較してこれはダメだなと安易に決めてしまったのだけど、GUIビルダだけでも使おうとNetBeans 6.0.1をインストールしてみた。 マイコミジャーナルに「ついに登場! NetBeans 6.0 &#8211; その新機能を徹底解剖する」という記事がある。大ざっぱなことはこれでわかる。 さっきインストールしたばかりだけど、少し使ってみようと思う。]]></description>
			<content:encoded><![CDATA[				<p>これはいいかも知れない。以前、ちょっとだけ使ってEclipseと比較してこれはダメだなと安易に決めてしまったのだけど、GUIビルダだけでも使おうとNetBeans 6.0.1をインストールしてみた。</p>
				<p>マイコミジャーナルに「<a href="http://journal.mycom.co.jp/special/2007/netbeans/menu.html">ついに登場! NetBeans 6.0 &#8211; その新機能を徹底解剖する</a>」という記事がある。大ざっぱなことはこれでわかる。</p>
				<p>さっきインストールしたばかりだけど、少し使ってみようと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/02/26/netbeans-60/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自動トレーディングへの道(5)</title>
		<link>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%935/</link>
		<comments>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%935/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 08:51:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[株式投資]]></category>
		<category><![CDATA[自動トレーディングへの道]]></category>
		<category><![CDATA[AutoTrading]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%935/</guid>
		<description><![CDATA[再びMonexLoggedOutState MonexLoggedOutStateのlogin()で context.setSessionID(HTTP.getInstance().getResult()); とした。これはIContext側のクラスに（例によって&#60;を全角にしています） public void setSessionID(String responseBody) { Perl5Util pu = new Perl5Util(); String pattern = "/＜A href=\"(https://ot2.qhit.net.*?)\".*?ACCESSKEY=\"1\"/"; if (pu.match(pattern, responseBody)) { String result = pu.group(1); pattern = "/ot2\\.qhit\\.net/(.*?)/.*?sid=(.*?)&#38;.*?&#38;id=(.*?)$/"; if (pu.match(pattern, result)) { hash = pu.group(1); sid = pu.group(2); id = pu.group(3); } } } というものがある。ログイン後はURLに謎の文字列を含むものが出てくる。これを間違えると処理されず、おそらくセッションIDではないかと思う。URLもmonexではなくot2.qhit.netになる。 というわけで&#8221;https://ot2.qhit.net&#8221;を含むURLでACCESSKEYが1であるものを正規表現で抜き出して、さらにその中から意味不明の文字列を３つ取り出す。意味がわからないので、とりあえずhash, sid, idとしておく。これはログイン後の状態からmakeSeaechStockCodeURL()で利用する。 public String makeSeaechStockCodeURL(int code) { [...]]]></description>
			<content:encoded><![CDATA[				<h3>再びMonexLoggedOutState</h3>
				<p>MonexLoggedOutStateのlogin()で</p>
				<pre class="prettyprint">
context.setSessionID(HTTP.getInstance().getResult());</pre>
				<p>とした。これはIContext側のクラスに（例によって&lt;を全角にしています）</p>
				<pre class="prettyprint">public void setSessionID(String responseBody) {
	Perl5Util pu = new Perl5Util();
	String pattern = "/＜A href=\"(https://ot2.qhit.net.*?)\".*?ACCESSKEY=\"1\"/";
	if (pu.match(pattern, responseBody)) {
		String result = pu.group(1);
		pattern = "/ot2\\.qhit\\.net/(.*?)/.*?sid=(.*?)&amp;.*?&amp;id=(.*?)$/";

		if (pu.match(pattern, result)) {
			hash = pu.group(1);
			sid = pu.group(2);
			id = pu.group(3);
		}
	}
}</pre>
				<p>というものがある。ログイン後はURLに謎の文字列を含むものが出てくる。これを間違えると処理されず、おそらくセッションIDではないかと思う。URLもmonexではなくot2.qhit.netになる。</p>
				<p>というわけで&#8221;https://ot2.qhit.net&#8221;を含むURLでACCESSKEYが1であるものを正規表現で抜き出して、さらにその中から意味不明の文字列を３つ取り出す。意味がわからないので、とりあえずhash, sid, idとしておく。これはログイン後の状態からmakeSeaechStockCodeURL()で利用する。</p>
				<pre class="prettyprint">
public String makeSeaechStockCodeURL(int code) {
	String url = "https://ot2.qhit.net/";
	url += hash;
	url += "/mb/quote.cgi?F=Idetail0&amp;QCODE=";
	url += code;
	url += "&amp;MKTN=T&amp;rf=r&amp;SID=&amp;ID=";
	url += id;
	url += "&amp;DM=www&amp;mode=";

	return url;
}</pre>
				<h3>ログイン後の状態</h3>
				<p>getPrice()では</p>
				<pre class="prettyprint">
// 株価ページを取得
String url = context.makeSeaechStockCodeURL(code);
GetMethod get = new GetMethod(url);
HTTP.getInstance().executeMethod(get);
get.releaseConnection();</pre>
				<p>でHTMLを取得し、これを解析していく。GETするURLはmakeSeaechStockCodeURL()で作る。多くの情報をバラバラに管理するのは面倒くさいのでStockInformationクラスを作成する。</p>
				<pre class="prettyprint">
package utilities;

public class StockInformation
{
	private Exchange exchange;	// 取引所
	private String name;			// 銘柄
	private String date;			// 日付
	private String time;			// 時刻

	private int code;			// コード（４桁）
	private int price;			// 株価
	private int id;				// 前日比 increase-decrease;
	private double idr;			// 前日比（率）increase-decrease rate
	private int sell;			// 売り気配;
	private int sellAmount;		// 売り枚数
	private int buy;				// 買い気配;
	private int buyAmount;		// 買い枚数
	private int opening;			// 始値
	private int high;			// 高値
	private int low;				// 安値
	private int volume;			// 出来高
	private int closing;			// 終値（決まるまでは０にしておく）

	public StockInformation()
	{

	}

	// getter, setterをたくさん作る	

	public String toString()
	{
		String result = "(" + code + ") " + Exchange.name(exchange) + "\n";
		result += name + "\n";
		result += date + " " + time + "\n";

		result += "現在値:" + price;
		if( id > 0 )
			result += " +" + id + "(+" + idr + "%)\n";
		else
			result += " " + id + "(" + idr + "%)\n";

		result += "売り気配:" + sell + "(" + sellAmount + ")\n";
		result += "買い気配:" + buy + "(" + buyAmount + ")\n";
		result += "始値:" + opening + "\n";
		result += "高値:" + high + "\n";
		result += "安値:" + low + "\n";
		result += "出来高:" + volume + "\n";

		return result;
	}
}</pre>
				<p>あとはゴリゴリ正規表現を駆使してStockInformationに値を入れる。この際、面倒くさいのは&#8221;654,000&#8243;のような文字列は普通にInteger.parseInt()すると例外を投げてしまうので下処理がいる。そのためのユーティリティクラスを作る。</p>
				<pre class="prettyprint">
public class NumUtilities
{
	public static int toInt(String str)
	{
		return Integer.parseInt(trim(str));
	}

	public static double toDouble(String str)
	{
		return Double.parseDouble(trim(str));
	}

	public static String trim(String in)
	{
		char [] c = in.toCharArray();
		StringBuffer result = new StringBuffer();

		for( int i = 0; i < c.length; i++ )
			if(('0' <= c[i] &amp;&amp; c[i] <= '9') || c[i] == '-' || c[i] == '.' )
				result.append(c[i]);

		return result.toString();
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%935/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自動トレーディングへの道(4)</title>
		<link>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%934/</link>
		<comments>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%934/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 08:38:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[株式投資]]></category>
		<category><![CDATA[自動トレーディングへの道]]></category>
		<category><![CDATA[AutoTrading]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%934/</guid>
		<description><![CDATA[ログイン中の状態 続いてログイン中の状態を表すクラス。これもIStateをimplementsして作る。IStateはclassにしておけばいいのかな、そうすればgetInstance()も基底クラスに持たせることができる。とりあえずコード（半角の&#60;&#62;を全角で書いています）： package monex; import network.HTTP; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.oro.text.perl.Perl5Util; import utilities.CodeNotFoundException; import utilities.Exchange; import utilities.NumUtilities; import utilities.StockInformation; public class MonexLoggedInState implements IState { // singleton private static IState singleton = new MonexLoggedInState(); public static IState getInstance() { return singleton; } // ログイン中、何もしない public void login(Monex context, String ID, String Password) { System.out.println("既にログイン中です"); } // [...]]]></description>
			<content:encoded><![CDATA[				<h3>ログイン中の状態</h3>
				<p>続いてログイン中の状態を表すクラス。これもIStateをimplementsして作る。IStateはclassにしておけばいいのかな、そうすればgetInstance()も基底クラスに持たせることができる。とりあえずコード（半角の&lt;&gt;を全角で書いています）：</p>
				<pre class="prettyprint">
package monex;

import network.HTTP;

import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.oro.text.perl.Perl5Util;

import utilities.CodeNotFoundException;
import utilities.Exchange;
import utilities.NumUtilities;
import utilities.StockInformation;

public class MonexLoggedInState implements IState {
	// singleton
	private static IState singleton = new MonexLoggedInState();

	public static IState getInstance() {
		return singleton;
	}

	// ログイン中、何もしない
	public void login(Monex context, String ID, String Password) {
		System.out.println("既にログイン中です");
	}

	// ログアウト処理
	public void logout(Monex context) {
		String logout = "https://www.monex.co.jp/IMode/00008F3S/imode/logout";
		GetMethod get = new GetMethod(logout);

		HTTP.getInstance().executeMethod(get);
		get.releaseConnection();

		System.out.println(HTTP.getInstance().getResult());

		context.changeState(MonexLoggedOutState.getInstance());
	}

	@Override
	public String toString() {
		return "ログインしています";
	}

	public void quote(Monex context) {
		int[] array = { 9433, 9202, 3436, 5411, 8058, 8316, 7974 };

		for (int i = 0; i ＜ array.length; i++) {
			try {
				System.out.println(getPrice(context, array[i]));
			} catch (CodeNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

	private StockInformation getPrice(Monex context, int code)
			throws CodeNotFoundException {
		StockInformation info = new StockInformation();

		// 株価ページを取得
		String url = context.makeSeaechStockCodeURL(code);
		GetMethod get = new GetMethod(url);
		HTTP.getInstance().executeMethod(get);
		get.releaseConnection();

		// 株価コードがない
		if (HTTP.getInstance().getResult().indexOf("該当する銘柄がありません") ＞= 0) {
			throw new CodeNotFoundException();
		}

		// 大ざっぱに該当部分を切り出す
		Perl5Util pu = new Perl5Util();
		String pattern = "/＜br＞(\\(\\d\\d\\d\\d\\).*?現値.*?前比.*?売気.*?株数.*?買気.*?株数.*?始値.*?高値.*?安値.*?出来.*?)＜br＞＜br＞＜a href=\"quote.cgi?/";
		if (pu.match(pattern, HTTP.getInstance().getResult())) {
			// さらに＜br＞区切りで要素に分ける
			String result = pu.group(1);
			String[] element = result.split("＜br＞");

			// 念のため表示
			// for( int i = 0; i ＜ element.length; i++ )
			// System.out.println(element[i]);

			// コードと取引所を取得
			pattern = "/\\((\\d\\d\\d\\d)\\)(.*)/";
			if (pu.match(pattern, element[0])) {
				info.setCode(NumUtilities.toInt(pu.group(1)));
				info.setExchange(Exchange.FirstSectionOfTheTokyoStockExchange);
			}

			// 銘柄を取得
			info.setName(element[1]);

			// 日付と時刻を取得
			pattern = "/＜div align=\"right\"＞\\((.*?) (.*?)\\)/";
			if (pu.match(pattern, element[2])) {
				info.setDate(pu.group(1));
				info.setTime(pu.group(2));
			}

			// 株価を取得
			pattern = "/現値: (.*?)$/";
			if (pu.match(pattern, element[3])) {
				info.setPrice(NumUtilities.toInt(pu.group(1)));
			}

			// 前日比を取得
			pattern = "/前比.*＞([\\+-]\\d.*)&amp;.*([\\+-].*)%/";
			if (pu.match(pattern, element[4])) {
				info.setId(NumUtilities.toInt(pu.group(1)));
				info.setIdr(NumUtilities.toDouble(pu.group(2)));
			}

			// 売り気配を取得
			pattern = "/売気:.*?(\\d.*)/";
			if (pu.match(pattern, element[5])) {
				info.setSell(NumUtilities.toInt(pu.group(1)));
			}

			// 売り株数を取得
			pattern = "/株数:.*?(\\d.*)/";
			if (pu.match(pattern, element[6])) {
				info.setSellAmount(NumUtilities.toInt(pu.group(1)));
			}

			// 買い気配を取得
			pattern = "/買気:.*?(\\d.*)/";
			if (pu.match(pattern, element[7])) {
				info.setBuy(NumUtilities.toInt(pu.group(1)));
			}

			// 買い株数を取得
			pattern = "/株数:.*?(\\d.*)/";
			if (pu.match(pattern, element[8])) {
				info.setBuyAmount(NumUtilities.toInt(pu.group(1)));
			}

			// 始値を取得
			pattern = "/始値:.*?(\\d.*)\\(/";
			if (pu.match(pattern, element[9])) {
				info.setOpening(NumUtilities.toInt(pu.group(1)));
			}

			// 高値を取得
			pattern = "/高値:.*?(\\d.*)\\(/";
			if (pu.match(pattern, element[10])) {
				info.setHigh(NumUtilities.toInt(pu.group(1)));
			}

			// 安値を取得
			pattern = "/安値:.*?(\\d.*)\\(/";
			if (pu.match(pattern, element[11])) {
				info.setLow(NumUtilities.toInt(pu.group(1)));
			}

			// 出来高を取得
			pattern = "/出来:.*?(\\d.*)/";
			if (pu.match(pattern, element[12])) {
				info.setVolume(NumUtilities.toInt(pu.group(1)));
			}
		}

		return info;
	}
}</pre>
				<h4>login()</h4>
				<p>ログイン済みの状態の時は何もしないで返す。そのかわりlogoutを実装することが必要。</p>
				<pre class="prettyprint">
// ログイン中、何もしない
public void login(Monex context, String ID, String Password) {
	System.out.println("既にログイン中です");
}</pre>
				<p>ログアウトは</p>
				<p>https://www.monex.co.jp/IMode/00008F3S/imode/logout</p>
				<p>をGETすればよい。特に失敗は考慮しておらず、続けて状態を遷移する。</p>
				<pre class="prettyprint">
// ログアウト処理
public void logout(Monex context) {
	String logout = "https://www.monex.co.jp/IMode/00008F3S/imode/logout";
	GetMethod get = new GetMethod(logout);

	HTTP.getInstance().executeMethod(get);
	get.releaseConnection();

	System.out.println(HTTP.getInstance().getResult());

	context.changeState(MonexLoggedOutState.getInstance());
}</pre>
				<p>ログイン中は株価を取得できる。そのためのquote()がある。これもIContextから派生（？）したクラスから呼び出す。</p>
				<pre class="prettyprint">
public void quote(Monex context) {
	int[] array = { 9433, 9202, 3436, 5411, 8058, 8316, 7974 };

	for (int i = 0; i < array.length; i++) {
		try {
			System.out.println(getPrice(context, array[i]));
		} catch (CodeNotFoundException e) {
			e.printStackTrace();
		}
	}
}</pre>
				<p>少々肥大化したのでgetPrice()に分離した。試しに株価をいくつか取得、その際の例外処理のためにCodeNotFoundExceptionクラスを作成した。戻り値はStockInformationクラス。</p>
				<pre class="prettyprint">
private StockInformation getPrice(Monex context, int code)
		throws CodeNotFoundException {
	// 略、全体のコードをご覧下さい
	}</pre>
				<p>続く。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%934/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javaめも</title>
		<link>http://blog.neoneet.jp/2008/02/26/java%e3%82%81%e3%82%82/</link>
		<comments>http://blog.neoneet.jp/2008/02/26/java%e3%82%81%e3%82%82/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 07:13:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/java%e3%82%81%e3%82%82/</guid>
		<description><![CDATA[文字列から数字以外を除去する 正規表現を使った置換で、数字以外にヒットする\Dあるいは[^0-9]を使って空白文字列と置き換えるのが簡単。パフォーマンスがいいかどうかはわからない。普通に文字ごとに分解して置き換えた方がよいのかも。 str = str.replaceAll("\\D", ""); 追記・文字列から数字以外を除去する これだと小数点やマイナスも消えてしまって不都合なので、正規表現を&#8221;[^0-9&#038;&#038;\.&#038;&#038;\-]&#8220;にしてみた。手元のエディタでは上手に消えるのだけど、Javaではなぜかカンマまで残ってしまうので、ローテクを駆使することにした。 private static String trim(String in) { char [] c = in.toCharArray(); StringBuffer result = new StringBuffer(); for( int i = 0; i < c.length; i++ ) if(('0']]></description>
			<content:encoded><![CDATA[				<h3>文字列から数字以外を除去する</h3>
				<p><a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/regex/Pattern.html">正規表現</a>を使った置換で、数字以外にヒットする\Dあるいは[^0-9]を使って空白文字列と置き換えるのが簡単。パフォーマンスがいいかどうかはわからない。普通に文字ごとに分解して置き換えた方がよいのかも。</p>
				<pre class="prettyprint">
str = str.replaceAll("\\D", "");</pre>
				<h4>追記・文字列から数字以外を除去する</h4>
				<p>これだと小数点やマイナスも消えてしまって不都合なので、正規表現を&#8221;[^0-9&#038;&#038;\.&#038;&#038;\-]&#8220;にしてみた。手元のエディタでは上手に消えるのだけど、Javaではなぜかカンマまで残ってしまうので、ローテクを駆使することにした。</p>
				<pre class="prettyprint">
private static String trim(String in)
{
	char [] c = in.toCharArray();
	StringBuffer result = new StringBuffer();

	for( int i = 0; i < c.length; i++ )
		if(('0' <= c[i] &#038;&#038; c[i] <= '9') || c[i] == '-' || c[i] == '.' )
			result.append(c[i]);

	return result.toString();
}
</pre>
				<h3>ある文字列を含むか</h3>
				<p>Rubyで言うところのinclude?()は、indexOf()を使って解決してみた。
				</pre>
				<pre class="prettyprint">
if (str.indexOf("...") >= 0)
{
	// ...を含む場合
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/02/26/java%e3%82%81%e3%82%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自動トレーディングへの道(3)</title>
		<link>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%933/</link>
		<comments>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%933/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 16:59:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[株式投資]]></category>
		<category><![CDATA[自動トレーディングへの道]]></category>
		<category><![CDATA[AutoTrading]]></category>
		<category><![CDATA[HttpClient]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%933/</guid>
		<description><![CDATA[マネックス証券にログイン Stateパターンについて調べたので、下手な考え休むに似たりということでゴリゴリコードを書いてみます。ダメダメだったら作り直す方針で。今回はマネックス証券の携帯サイト https://www.monex.co.jp/IMode/00000000/imode/login_e にログインすることを考えます。 IStateインターフェース まずインターフェースを用意します。 public interface IState { public abstract void login( Monex context, String ID, String Password ); public abstract void logout( Monex context ); public abstract void quote( Monex context ); } これもまずければあとで直す方向で。 まだログインしていない状態を表すクラス 最初にまだログインしていない状態を表すMonexLoggedOutStateを作ります。 public class MonexLoggedOutState implements IState { // singleton private static IState singleton = new MonexLoggedOutState(); public [...]]]></description>
			<content:encoded><![CDATA[				<h3>マネックス証券にログイン</h3>
				<p>Stateパターンについて調べたので、下手な考え休むに似たりということでゴリゴリコードを書いてみます。ダメダメだったら作り直す方針で。今回はマネックス証券の携帯サイト</p>
				<p align="center"><a href="http://blog.neoneet.jp/wp-admin/rtf1%20ansi%20uc0%20deff0%20fonttbl%20f0%20fnil%20Osaka;%20colortbl%20red0%20green0%20blue0;%20red255%20green255%20blue255;%20red232%20green242%20blue254;%20red42%20green0%20blue255;%20f0%20fs24%20%20fi0%20ql%20%20highlight2%20%20cf3%20https://www.monex.co.jp/IMode/00000000/imode/login_e">https://www.monex.co.jp/IMode/00000000/imode/login_e</a></p>
				<p>にログインすることを考えます。</p>
				<h4>IStateインターフェース</h4>
				<p>まずインターフェースを用意します。</p>
				<pre class="prettyprint">
public interface IState
{
	public abstract void login( Monex context, String ID, String Password );
	public abstract void logout( Monex context );
	public abstract void quote( Monex context );
}</pre>
				<p>これもまずければあとで直す方向で。</p>
				<h4>まだログインしていない状態を表すクラス</h4>
				<p>最初にまだログインしていない状態を表すMonexLoggedOutStateを作ります。</p>
				<pre class="prettyprint">
public class MonexLoggedOutState implements IState
{
	// singleton
	private static IState singleton = new MonexLoggedOutState();
	public static IState getInstance()
	{
		return singleton;
	}

	public void login( Monex context, String ID, String Password )
	{
		String login = "https://www.monex.co.jp/IMode/00000000/imode/login_e";
		PostMethod post = new PostMethod(login);

		System.out.println("ログインします");

		post.addParameter("loginid", "あなたのID");
		post.addParameter("passwd", "パスワード");

		HTTP.getInstance().executeMethod(post);
		post.releaseConnection();

		System.out.println(HTTP.getInstance().getResult());

		context.changeState(MonexLoggedInState.getInstance());
		context.setSessionID(HTTP.getInstance().getResult());

	}

	public void logout( Monex context )
	{

	}

	public String toString()
	{
		return "ログインしていません";
	}

	public void quote(Monex context)
	{

	}
}</pre>
				<h4>HTTP接続</h4>
				<p>HTTP接続にはJakarta HttpClientを利用します。それでもまだ雑多なコードを書く必要があるので、それを分離したHTTPクラスを作りました。</p>
				<pre class="prettyprint">
public class HTTP
{
	private static HTTP singleton = new HTTP();
	private HttpClient client = new HttpClient();
	private String result = "";

	private HTTP()
	{
		client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
	}

	public static HTTP getInstance()
	{
		return singleton;
	}

	public String getResult()
	{
		return result;
	}

	public void executeMethod(HttpMethodBase method)
	{
		try
		{
			int statusCode = client.executeMethod(method);
			String characterSet = method.getResponseCharSet();
			String defaultCharacterSet = "Shift_JIS";

			// 誤判定対策
			if( characterSet.equalsIgnoreCase("ISO-8859-1"))
				characterSet = defaultCharacterSet;

			// ステータスコードのチェック
			if( statusCode != HttpStatus.SC_OK )
				System.out.println("Error" + method.getStatusLine());

			Reader in = new InputStreamReader(method.getResponseBodyAsStream(), characterSet );
			BufferedReader buffer = new BufferedReader(in);

			// 結果の取得
			String line;
			result = "";
			while(( line = buffer.readLine()) != null )
			{
				result += line;
			}

			in.close();
			buffer.close();
		}
		catch (HttpException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
		}
	}
}</pre>
				<p>これもシングルトンになっていて、getInstance()してインスタンスを取得してからexecuteMethod()を呼べば文字コードの判定とかをしてresultに格納します。resultもgetResult()で取得できます。マネックスではPOSTでログインするので、<span class="prettyprint">addParameter</span>にIDとパスワードを詰めてexecuteMethod()します。あ、例外処理してない。あとで追加します。</p>
				<h4>ログイン失敗の処理</h4>
				<p>やや手抜きだけれど、返ってきたHTMLにエラーコードが入っていたらログインできなかったとみなして、状態を遷移せずにreturnします。</p>
				<pre class="prettyprint">
		// ログイン失敗
		if( HTTP.getInstance().getResult().indexOf("NOL11015E") >= 0 )
		{
			return;
		}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/02/26/%e8%87%aa%e5%8b%95%e3%83%88%e3%83%ac%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%b8%e3%81%ae%e9%81%933/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaのGenerics</title>
		<link>http://blog.neoneet.jp/2008/02/21/java%e3%81%aegenerics/</link>
		<comments>http://blog.neoneet.jp/2008/02/21/java%e3%81%aegenerics/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 10:43:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/%e9%9b%91%e8%a8%98/java%e3%81%aegenerics/</guid>
		<description><![CDATA[雑記です。 C++のtemplateとJavaのGenericsは結構違うのではないかと思って調べてみると、やはりかなり異なることが分かる。Javaの言語仕様に近い本はずいぶん前に買ったので、新しいのを買うべきなんだろうけど、なんか勿体ないのでぐぐって済ませてしまいがち。 ぐぐればすぐに出てくるが、C++のtemplateは異種変換(heterogeneous translation)なのに対してJavaでは同一変換(homogeneous translation)だという。意味が分かんない。知っていることから考えてみる。 C++のtemplateはたぶん一種のプリプロセッサで、利用状況に応じてコードをガシガシ生成する。コーディング量の割りに組み合わせ爆発によって実行ファイルのサイズがやたらと巨大になるのはそのため。普通template &#60;typename T&#62;と宣言するけど、より単純なtemplate &#60;int N&#62;で言うと（＜を全角で書いています） template ＜int N＞ struct Factorial { enum { value = N * Factorial::value }; }; とするとFactorial&#60;1&#62;とFactorial&#60;2&#62;は別の型になる。階乗の再帰的だが、0!が決まっていないのでtemplateの特殊化(specialization) という仕組みで指定する。 template ＜＞ struct Factorial＜0＞ { enum { value = 1 }; }; これは階乗の値を「コンパイル時に」計算する。したがってアッカーマン関数のような再帰が爆発するようなものはコンパイラが根を上げる。 #include ＜stdio.h＞ template ＜int N, int M＞ struct Ackermann { enum{ value = Ackermann＜N-1, Ackermann＜N, [...]]]></description>
			<content:encoded><![CDATA[				<p>雑記です。</p>
				<p>C++のtemplateとJavaのGenericsは結構違うのではないかと思って調べてみると、やはりかなり異なることが分かる。Javaの言語仕様に近い本はずいぶん前に買ったので、新しいのを買うべきなんだろうけど、なんか勿体ないのでぐぐって済ませてしまいがち。</p>
				<p>ぐぐればすぐに出てくるが、C++のtemplateは異種変換(heterogeneous translation)なのに対してJavaでは同一変換(homogeneous translation)だという。意味が分かんない。知っていることから考えてみる。</p>
				<p>C++のtemplateはたぶん一種のプリプロセッサで、利用状況に応じてコードをガシガシ生成する。コーディング量の割りに組み合わせ爆発によって実行ファイルのサイズがやたらと巨大になるのはそのため。普通template &lt;typename T&gt;と宣言するけど、より単純なtemplate &lt;int N&gt;で言うと（＜を全角で書いています）</p>
				<pre class="prettyprint">
template ＜int N＞
struct Factorial
{
	enum { value = N * Factorial<n>::value };
};

</n></pre>
				<p>とするとFactorial&lt;1&gt;とFactorial&lt;2&gt;は別の型になる。階乗の再帰的だが、0!が決まっていないのでtemplateの特殊化(specialization) という仕組みで指定する。</p>
				<pre class="prettyprint">
template ＜＞
struct Factorial＜0＞
{
	enum { value = 1 };
};</pre>
				<p>これは階乗の値を「コンパイル時に」計算する。したがってアッカーマン関数のような再帰が爆発するようなものはコンパイラが根を上げる。</p>
				<pre class="prettyprint">
#include ＜stdio.h＞

template ＜int N, int M＞
struct Ackermann
{
 	enum{ value = Ackermann＜N-1, Ackermann＜N, M-1＞::value ＞::value };
};

template＜int N＞
struct Ackermann＜N,0＞
{
	enum{ value = Ackermann＜N-1,1＞::value };
};

template＜int M＞
struct Ackermann＜0,M＞
{
	enum{ value = M + 1 };
};

int main()
{
	printf( "%d\n", Ackermann＜5,7＞::value );
}</pre>
				<p>C++の異種変換というのは、こうして型をたくさん作り別の型として扱われるのだろうか。とすると同種変換というのは、Genericsと言っても結局のところ同じ型にこじつけるので限界があるということかな。</p>
				<p>何でこうなっているかというと、VMの互換性を維持するためと聞いたが、型を大量に生成するだけなら古いVMとも互換性は保てそうに思うから、やはり理解不足かも知れない。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2008/02/21/java%e3%81%aegenerics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

