<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>tomatomax.net &#187; iAppli</title>
	<atom:link href="http://blog.tomatomax.net/archives/category/program/iappli/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.tomatomax.net</link>
	<description>Every rule has its exception.</description>
	<lastBuildDate>Sat, 21 Jan 2012 13:53:13 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/category/program/iappli/feed" />
		<item>
		<title>i家計簿バージョンアップしました</title>
		<link>http://blog.tomatomax.net/archives/2821</link>
		<comments>http://blog.tomatomax.net/archives/2821#comments</comments>
		<pubDate>Sat, 19 Feb 2011 13:34:17 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[iAppli]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/?p=2821</guid>
		<description><![CDATA[昨日からドコモマーケットで新バージョンが公開されています。大きな機能追加は ありませんが、より使いやすくなっています 変更点 -[詳細表示]の際に上下キー押しっぱなしで高速スクロールするよう修正 -メニューのショートカッ [...]]]></description>
			<content:encoded><![CDATA[<p>昨日からドコモマーケットで新バージョンが公開されています。大きな機能追加は<br />
ありませんが、より使いやすくなっています</p>
<p>変更点<br />
-[詳細表示]の際に上下キー押しっぱなしで高速スクロールするよう修正<br />
-メニューのショートカットキーを追加<br />
-メニューをクリアキーでキャンセルできるように修正<br />
-メール送信の際に容量が多い場合は、分割送信を行うように修正</p>
<p>既にダウンロード済みの方は、無料でアップデートできますので、ドコモマーケッ<br />
トから再度ダウンロードをお願いいたします</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2821/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2821" />
	</item>
		<item>
		<title>ドコマでアプリを公開するまで</title>
		<link>http://blog.tomatomax.net/archives/2810</link>
		<comments>http://blog.tomatomax.net/archives/2810#comments</comments>
		<pubDate>Thu, 27 Jan 2011 14:36:40 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[iAppli]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/?p=2810</guid>
		<description><![CDATA[twitterでは告知しましたが、1/20からドコモマーケット(ドコマ)でi家計簿を公開しています。ほとんどガイドラインの通りですが、そのときの手順について記録を残しておきます。ガイドラインちょう重要。 作者登録 マーケ [...]]]></description>
			<content:encoded><![CDATA[<p><a class="" rel="" title="docomodake" href="http://www.flickr.com/photos/7743837@N06/5381587896/"><img src="http://farm6.static.flickr.com/5046/5381587896_405604d22f.jpg" alt="docomodake"></a></p>
<p><a href="http://twitter.com/maruguu/status/28077530246283264">twitterでは告知しました</a>が、1/20からドコモマーケット(ドコマ)で<a href="http://blog.tomatomax.net/ikakeibo">i家計簿</a>を公開しています。ほとんどガイドラインの通りですが、そのときの手順について記録を残しておきます。ガイドラインちょう重要。</p>
<h2>作者登録</h2>
<p><a href="https://www.market-box.jp/ip/top.do">マーケット管理システム</a>にアクセスして登録を行う。<br />
登録には&#8221;本人性確認書類&#8221;のスキャンデータが必要。システム利用料については今月末までは無料ということで、支払いはなし。</p>
<p>ドコモからシステム認証キーが郵送されてきたら、マーケット管理システムにログイン後、キーを入力する。これでアプリ登録が可能に。</p>
<h2>アプリ登録</h2>
<p>マーケット管理システムでアプリを追加する。アプリを追加すると、DXIDとPackageURLが割り振られるので開発しているアプリのADFにそのDXIDとPackageURLを入力する。<br />
ビルドしたアプリのアップロードもブラウザから可能。開発用に登録したケータイからダウンロードしてデバッグできる。開発用に登録したケータイだと、ドコマのコンテンツを見ることができないので、デバッグが終わったら登録削除が必要かも。<br />
対応機種には、動作を実際に確認していなくても、機種名にチェックを入れておかないと、対応機種以外ではダウンロードすることができない。机上で確認した分でもチェックが必要。</p>
<h2>アプリ公開申請</h2>
<p>公開準備が整ったら、マーケット管理システムから公開申請を行う。<br />
# チェックシートでガイドラインにそっているか確認するのだけれども、このとき初めて&#8221;開発者の問い合わせ先&#8221;というのがアプリ内に必要ということに気づき、あわてて修正<br />
審査結果はメールで届く。結果は否認。&#8221;開発者の問い合わせ先&#8221;がわかりにくい、というものだった。(最初はアプリ内&#8221;操作説明&#8221;に問い合わせ先が書かれていた)<br />
そこを修正後、再度申請を行うと、今度は承認され、アプリが公開される。<br />
# 審査自体はびっくりするくらい早かった。そんなに忙しくないのか。</p>
<h2>公開後</h2>
<p>マーケット管理システムから売り上げ情報のCSV(がZip圧縮されたもの)がダウンロードできる。まだ一週間分なのでたいした量ではないが、人によっては巨大ファイルになるのでは。</p>
<p>もともとアプリコンテストが目に付き、登録してみたのだけれども、あまりに締め切り直前だったため、作者登録していたら締め切りｵﾜﾀ＼(^o^)／<br />
iアプリの制限はいろいろダメな点が多いですが、4月からようやく自由に通信可能になりそうなのでそれに期待ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2810/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2810" />
	</item>
		<item>
		<title>家計簿アプリ作りました</title>
		<link>http://blog.tomatomax.net/archives/2773</link>
		<comments>http://blog.tomatomax.net/archives/2773#comments</comments>
		<pubDate>Sat, 18 Dec 2010 07:07:13 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[iAppli]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/?p=2773</guid>
		<description><![CDATA[今まで使っていたGoogle Documentでの家計簿をやめて、今年は紙の家計簿にしてました。 KAKEIBO家計ぼセット posted with amazlet at 10.12.18 永岡書店 売り上げランキング: [...]]]></description>
			<content:encoded><![CDATA[<p>今まで使っていたGoogle Documentでの家計簿をやめて、今年は紙の家計簿にしてました。</p>
<div class="amazlet-box" style="margin-bottom:0px;">
<div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4522479557/maruguu-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/G/09/icons/books/comingsoon_books.gif" alt="KAKEIBO家計ぼセット" style="border: none;" /></a></div>
<div class="amazlet-info" style="line-height:120%; margin-bottom: 10px">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4522479557/maruguu-22/ref=nosim/" name="amazletlink" target="_blank">KAKEIBO家計ぼセット</a>
<div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4522479557/maruguu-22/ref=nosim/" title="KAKEIBO家計ぼセット" target="_blank">amazlet</a> at 10.12.18</div>
</div>
<div class="amazlet-detail">永岡書店 <br />売り上げランキング: 29154</div>
<div class="amazlet-sub-info" style="float: left;">
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4522479557/maruguu-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
<p>予算を立てて種類別に記録できたのはよかったけど、計算が面倒だとか、すぐに記録できないといったところで、イライラがたまっていたのでiアプリで作ってみました。</p>
<p><a href="http://blog.tomatomax.net/ikakeibo">i家計簿 &#8211; ケータイ(iアプリ)用家計簿ソフト</a></p>
<p>まだベータ版程度のものですが、iアプリを使える方は試してみてください。</p>
<p>本当はCSVファイルか何かに書き出してケータイ内のドキュメントビューワーで見れたらいいなとか思ってたんですが、そういう経路は用意されていなかった＞＜。外部サーバー連携すれば可能なのかもしれないけど、それをやると来年の家計簿として使えそうにもないので、ナシの方向で。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2773/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2773" />
	</item>
		<item>
		<title>GoogleCalendarImporter</title>
		<link>http://blog.tomatomax.net/archives/2351</link>
		<comments>http://blog.tomatomax.net/archives/2351#comments</comments>
		<pubDate>Fri, 21 Mar 2008 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[iAppli]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2351</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>Googleカレンダーのデータを携帯のスケジューラで読み込めるようにするiアプリを作ってみました。iCal形式ならGoogleカレンダーである必要はないのだけれども、iアプリの仕様上、データをiアプリと同じサーバに置かないといけないので、完全に個人用ツール。</p>
<p>あとはScheduleクラスがaddEntry()しかできないので、重複排除みたいなことができないとか、ToDoの方はいじることができないとか、痒くてたまらない感じ。</p>
<p>一応ソース。エラー処理がほとんど入ってない、、、</p>
<p><a name="seemore"></a></p>
<pre class="syntax-highlight">
<span class="synPreProc">import</span> javax.microedition.io.*;
<span class="synPreProc">import</span> java.io.*;
<span class="synPreProc">import</span> java.util.*;
<span class="synPreProc">import</span> com.nttdocomo.ui.*;
<span class="synPreProc">import</span> com.nttdocomo.io.*;
<span class="synPreProc">import</span> com.nttdocomo.system.*;
<span class="synPreProc">import</span> com.nttdocomo.util.*;

<span class="synType">public</span> <span class="synType">class</span> GoogleCalendarImporter <span class="synType">extends</span> IApplication {
appCanvas m_canvas;

<span class="synType">public</span> <span class="synType">void</span> start() {
m_canvas = <span class="synStatement">new</span> appCanvas();
Display.setCurrent(m_canvas);
}

<span class="synType">   class</span> appCanvas <span class="synType">extends</span> Canvas {
<span class="synType">public</span> appCanvas() {
setSoftLabel(SOFT_KEY_1,<span class="synConstant">&#34;ADD&#34;</span>);
setSoftLabel(SOFT_KEY_2,<span class="synConstant">&#34;QUIT&#34;</span>);
}

<span class="synType">public</span> <span class="synType">void</span> paint(Graphics g) {
g.drawString(<span class="synConstant">&#34;Google Calendar Importer&#34;</span>,<span class="synConstant">0</span>,<span class="synConstant">30</span>);
}

<span class="synType">public</span> <span class="synType">void</span> processEvent(<span class="synType">int</span> type,<span class="synType">int</span> param) {
<span class="synStatement">if</span> (type==Display.KEY_RELEASED_EVENT) {
<span class="synStatement">if</span> (param==Display.KEY_SOFT2) {
terminate();
}
<span class="synStatement">if</span> (param==Display.KEY_SOFT1) {
String ics = getICSData(<span class="synConstant">&#34;gc.ics&#34;</span>);
Vector vevents = getVevents(ics);
ScheduleDate sdate;
<span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &#60; vevents.size(); i++) {
sdate = getSchedule((String)vevents.elementAt(i));
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<span class="synConstant">&#34;GMT&#34;</span>));
<span class="synType">int</span> year = cal.get(Calendar.YEAR);
<span class="synType">int</span> month = cal.get(Calendar.MONTH) + <span class="synConstant">1</span>;
<span class="synType">int</span> day = cal.get(Calendar.DATE);
<span class="synStatement">if</span>((year &#60; sdate.get(Calendar.YEAR)) ||
(((year == sdate.get(Calendar.YEAR)) &#38;&#38; (month &#60; sdate.get(Calendar.MONTH) + <span class="synConstant">1</span>))) ||
(((year == sdate.get(Calendar.YEAR)) &#38;&#38; (month == sdate.get(Calendar.MONTH) + <span class="synConstant">1</span>)) &#38;&#38; (day &#60;= sdate.get(Calendar.DATE))))
{
<span class="synStatement">try</span> {
Schedule.addEntry(getSummary((String)vevents.elementAt(i)), sdate, <span class="synConstant">false</span>);
} <span class="synStatement">catch</span>(InterruptedOperationException e) {
}
}
}

}
}
}

String getSummary(String vevent) {
String summary = <span class="synConstant">&#34;SUMMARY:&#34;</span>;
<span class="synStatement">try</span> {
<span class="synType">int</span> pos_s = vevent.indexOf(summary);
<span class="synType">int</span> pos_e = vevent.indexOf(<span class="synConstant">&#34;</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, pos_s);
<span class="synStatement">return</span> vevent.substring(pos_s + summary.length(), pos_e);
} <span class="synStatement">catch</span> (Exception e) {
<span class="synStatement">return</span> vevent;
}
}

<span class="synType">int</span> getInt(String str) {
<span class="synType">int</span> start = <span class="synConstant">0</span>;
<span class="synStatement">while</span>(start &#60; str.length() - <span class="synConstant">1</span>) {
<span class="synStatement">if</span>(str.charAt(start) == <span class="synConstant">'0'</span>) {
start++;
} <span class="synStatement">else</span> {
<span class="synStatement">break</span>;
}
}
<span class="synStatement">return</span> Integer.parseInt(str.substring(start));
}

ScheduleDate getSchedule(String vevent) {
ScheduleDate sdate = <span class="synStatement">new</span> ScheduleDate(ScheduleDate.ONETIME);
<span class="synStatement">try</span> {
<span class="synType">int</span> pos_dt = vevent.indexOf(<span class="synConstant">&#34;DTSTART&#34;</span>);
<span class="synType">int</span> pos_s = vevent.indexOf(<span class="synConstant">&#34;:&#34;</span>, pos_dt);
sdate.set(Calendar.YEAR, Integer.parseInt(vevent.substring(pos_s + <span class="synConstant">1</span>, pos_s + <span class="synConstant">5</span>)));
sdate.set(Calendar.MONTH, getInt(vevent.substring(pos_s + <span class="synConstant">5</span>, pos_s + <span class="synConstant">7</span>)) - <span class="synConstant">1</span>);
sdate.set(Calendar.DATE, getInt(vevent.substring(pos_s + <span class="synConstant">7</span>, pos_s + <span class="synConstant">9</span>)));
<span class="synStatement">if</span>(vevent.charAt(pos_s + <span class="synConstant">9</span>) == <span class="synConstant">'T'</span>) {
sdate.set(Calendar.HOUR_OF_DAY, getInt(vevent.substring(pos_s + <span class="synConstant">10</span>, pos_s + <span class="synConstant">12</span>)));
sdate.set(Calendar.MINUTE, getInt(vevent.substring(pos_s + <span class="synConstant">12</span>, pos_s + <span class="synConstant">14</span>)));
}
} <span class="synStatement">catch</span> (Exception e) {
}
<span class="synStatement">return</span> sdate;
}

Vector getVevents(String ics) {
Vector vevents = <span class="synStatement">new</span> Vector();
<span class="synStatement">try</span> {
<span class="synType">int</span> pos_s = ics.indexOf(<span class="synConstant">&#34;BEGIN:VEVENT&#34;</span>);
<span class="synType">int</span> pos_e;
<span class="synStatement">while</span>(pos_s &#62;= <span class="synConstant">0</span>) {
pos_e = ics.indexOf(<span class="synConstant">&#34;END:VEVENT&#34;</span>, pos_s);
vevents.addElement(ics.substring(pos_s, pos_e));
pos_s = ics.indexOf(<span class="synConstant">&#34;BEGIN:VEVENT&#34;</span>, pos_e);
}
} <span class="synStatement">catch</span> (Exception e) {
}
<span class="synStatement">return</span> vevents;
}

String getICSData(String ics) {
HttpConnection wi_connect;
<span class="synStatement">try</span> {
String wi_url = <span class="synStatement">new</span> String(getSourceURL() + ics);
wi_connect = (HttpConnection)Connector.open(wi_url,Connector.READ_WRITE,<span class="synConstant">true</span>);
wi_connect.setRequestMethod(HttpConnection.GET);
wi_connect.connect();

InputStream wi_stream = wi_connect.openInputStream();
InputStreamReader wi_buffer = <span class="synStatement">new</span> InputStreamReader(wi_stream);
StringBuffer w_StringBuffer = <span class="synStatement">new</span> StringBuffer();
String w_buffer = <span class="synConstant">&#34;&#34;</span>;

<span class="synType">int</span> w_char;
<span class="synStatement">while</span> ((w_char = wi_buffer.read()) != -<span class="synConstant">1</span>) {
w_StringBuffer.append((<span class="synType">char</span>)w_char);
}

w_buffer = (String)w_StringBuffer.toString();
wi_stream.close();
wi_connect.close();
<span class="synStatement">return</span> w_buffer;
} <span class="synStatement">catch</span>(Throwable e) {
System.out.println(<span class="synConstant">&#34;getICSData() : &#34;</span> + e.getMessage());
}
<span class="synStatement">return</span> <span class="synConstant">&#34;&#34;</span>;
}
}
}
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2351/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2351" />
	</item>
	</channel>
</rss>

