開発^3

Web開発、宇宙開発、ゲーム開発の3種類についてつらつらと

iPhone/iPadアプリに必要な画像まとめ

最近iPhone/iPadアプリの開発とかやっているのでちょっとまとめてみました。

ホーム画面に表示されるアイコン
1.Icon.png57 x 57iPhone
2.Icon@2x.png114 x 114iPhone4
3.Icon-72.png72 x 72iPad
Spotlightや設定画面に表示されるアイコン
4.Icon-Small.png29 x 29iPhone/iPadの設定画面
5.Icon-Small@2x.png58 x 58iPhone4
6.Icon-Small-50.png50 x 50iPadSpotlight
起動時に表示される画像(スプラッシュ画像)
7.Default-Portrait.png768 x 1004iPad(縦向き起動)
8.Default-Landscape.png1024 x 748iPad(横向き起動)
9.Default.png320 x 480iPhone
10.Default@2x.png640 x 960iPhone4

というわけで、必要な画像はこんな感じかな?

  • iPadのみ対応とする場合:3, 4, 6, 7, 8
  • iPad/iPhone/iPhone4に対応する場合:もちろん全部


ちょっと気になる点としてはDefault.png/Default@2x.pngでしょうか。
iPadと違ってこっちはステータスバー部分を除かないんですね。


詳細は公式ドキュメントの参照をば。
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BuildTimeConfiguration/BuildTimeConfiguration.html#//apple_ref/doc/uid/TP40007072-CH7

Firefoxとchromeのxpath解釈の違い

document.createElementで作られたノードをdocument.evaluateで探す場合、FirefoxChromeで違いがあるみたい。
前回の記事と同じく、これも「./」を指定しろ。ってことですかね。

XPath Firefox Chrome
/sample/value/text() 取得可 取得不可
./sample/value/text() 取得可 取得可

はて、これはどっちが仕様として正しいんだろう。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<script type="text/javascript">
<!--
function sample()
{
	var element = document.createElement("sample");
	element.innerHTML = "<sample><value>hoge</value></sample>";
	
	//	Firefox: hoge		Chrome: 空文字
	alert(document.evaluate("/sample/value/text()", element, null, XPathResult.STRING_TYPE, null).stringValue);

	//	Firefox: hoge		Chrome: hoge
	alert(document.evaluate("./sample/value/text()", element, null, XPathResult.STRING_TYPE, null).stringValue);
}
//-->
</script>
</head>
<body>
<input type="button" onclick="sample();" value="Sample">
</body>
</html>

descendant-or-selfと//は完全に同一じゃないらしい

てっきりdescendant-or-self == //だと思っていたんだけど、contextNodeとしてルート以外を指定した場合には異なるらしい。
結果をみた感じ、「//」を指定するとcontextNodeとは関係なくルートから検索するのかね。
contextNodeから下で探したいのであれば、descendant-or-selfまたは「.//」を使うのが良いみたい。

XPath contextNode 結果件数
descendant-or-self root 2件
.// root 2件
// root 2件
descendant-or-self content1 1件
.// content1 1件
// content1 2件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript">
<!--
function xpathsample()
{
	var content1 = document.getElementById("content1");

	var xpath1 = "descendant-or-self::p";
	var xpath2 = ".//p";
	var xpath3 = "//p";

	alert(document.evaluate(xpath1, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength);		//	2
	alert(document.evaluate(xpath2, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength);		//	2
	alert(document.evaluate(xpath3, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength);		//	2

	alert(document.evaluate(xpath1, content1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength);		//	1
	alert(document.evaluate(xpath2, content1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength);		//	1
	alert(document.evaluate(xpath3, content1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength);		//	2
}
//-->
</script>
</head>
<body>

<div id="content1">
  <div>
    <p>content1</p>
  </div>
</div>

<div id="content2">
  <div>
    <p>content2</p>
  </div>
</div>

<input type="button" onclick="xpathsample()" value="sample">

</body>
</html>

迷路を解くRubyスクリプト

人生を書き換える者すらいた。: 人材獲得作戦・4 試験問題ほか
を解いてみた。一番得意な言語ってわけでは無いが、最近仕事で使っているのでRubyを使用。
正答を出せるまでが40分、ブラッシュアップに10分ってところか。


この方法は有名どころで、ユニット型シミュレーションゲームの移動範囲表示にも使われてたような。

class Maze
    def initialize(inputs)
        @width = inputs[0].length - 1
        @height = inputs.length
        @maze = []
        
        inputs.each do |input|
            linemaze = []
            input.split("").each do |c|
                next if c == "\n"
                @start = {:x => linemaze.length, :y => @maze.length } if c == "S"
                @goal  = {:x => linemaze.length, :y => @maze.length } if c == "G"

                c == " " ? linemaze.push(@width * @height) : linemaze.push(c)
            end
            @maze.push(linemaze)
        end
    end

    def solve
        history = []
        move(@start[:x], @start[:y], history)
        
        @answerHistory.each do |foot|
            next if ["S", "G"].include?(@maze[foot[:y]][foot[:x]])
            @maze[foot[:y]][foot[:x]] = "$"
        end
    end
    
    def move(x, y, history)
        history.push({:x => x, :y => y})

        return if @maze[y][x] == "*"
        return if @maze[y][x] == "S" && history.length > 1
        if @maze[y][x] == "G" then
            if @answerHistory == nil || history.length < @answerHistory.length then
                @answerHistory = history.clone
            end
            return
        end

        if @maze[y][x].kind_of?(Numeric) then
            return if @maze[y][x] <= history.length
            @maze[y][x] = history.length
        end
        
        move(x - 1, y, history)
        history.pop
        move(x + 1, y, history)
        history.pop
        move(x, y - 1, history)
        history.pop
        move(x, y + 1, history)
        history.pop
    end

    def to_s
        str = ""
        str << @maze.map do |line|
            line.map do |c|
                c.kind_of?(Numeric) ? " " : c
            end.join("")
        end.join("\n")

        str << "\n"
        str << "start = #{@start[:x]}, #{@start[:y]}\n"
        str << "goal = #{@goal[:x]}, #{@goal[:y]}\n"
    end
end

if ARGV.length == 0 then
    puts "Usage: solvemaze.rb filename"
    exit
end

inputs = File.open(ARGV[0]).readlines
maze = Maze.new(inputs)
puts maze

puts "--------------------------------"
puts " Now solving......"
puts "--------------------------------"

maze.solve

puts maze

実行結果

続きを読む

iPhoneが欲しくなって色々考えたらW-ZERO3のadesが欲しくなった

最近iPhoneが欲しい。
アップルイベントが終わって新iPod Touchも発表されたことだし、そっちも含めて検討してみた。


条件としてはこんな感じ。

  • 彼女向けに通話定額が欲しい。現在は自分がWillcom、彼女がdocomo(メイン) + Willcom(電話専用)
  • 自分が使ってるAdesは本体の調子が悪い(スピーカがやられたか、イヤホンを使わないと音が出ない)
  • 比較しやすかったので2年間で比較。2年後にはいろいろ環境変わってそうだし
  • iPhoneを買うのであればパケ代抑制なんて考えない
  • 主な使用場所は埼玉、東京辺り。移動中や昼休みが主か。自宅では無線LANを使用。



Willcom W-ZERO3 Advanced[es](現状)
Willcom初期費用:0円
Willcom毎月費用:旧定額(2900円)、データ定額(1000 + 1500円程度)、彼女側旧定額(2900円)
総合計:(2900 + 1000 + 1500 + 2900) * 24 = 199,200


ここ半年を平均すると25万パケット/月。0.01円/パケットなので、データ通信費は2500円ぐらい。
本体の調子がかなり悪くなってるので、現実的では無いがこのまま維持するとしたらこんな感じか。
思ったよりも払っていたようだ。2年まとめると結構高いと感じる。



Willcom 03に機種変更(ジャケット買増)してW-VALUEで2年契約
Willcom初期費用:本体一括(63120円)、ヨドバシのポイント付与(6943P)
Willcom毎月費用:旧定額(2900円)、データ定額(1000 + 1500円程度)、W-VALUE割引(-2230円)、彼女側旧定額(2900円)
総合計:2100 + 63120 - 6943 + (2900 + 2500 - 2230 + 2900) * 24 = 203,957


正直03には余り魅力を感じない。テレビ見ないし、CPU変わってないし。



ヤフオクで03本体だけ購入して現状のWillcom契約を継続
Willcom初期費用:本体(17500円)
Willcom毎月費用:旧定額(2900円)、データ定額(1000 + 1500円程度)、彼女側旧定額(2900円)
総合計:17500 + (2900 + 1000 + 1500 + 2900) * 24 = 216,700


差し替え出来るのはWillcomの利点だと思う。というわけで外側だけ探してみる。
ヤフオクだと15000円〜20000円ぐらい?間を取って17500円とするとこんな感じ。
あれ、W-VALUE SELECTを使った↑の方が安い。そりゃ400 * 24 = 9600円が実質支払額だからその差額が出たか。


Willcomは本体実質0円の機種に変更してW-VALUE SELECTで2年契約+iPhone
Willcom初期費用:本体(51120円)、ヨドバシのポイント付与(5623P)
Softbank初期費用:契約手数料(2835円)、16G本体(57600円)、株主優待券値引(-10000円)*1、優待券購入(2000円)、ヨドバシのポイント付与(6336P)*2
Willcom毎月費用:旧定額(2900円)、彼女側旧定額(2900円)
Softbank毎月費用:パケット定額フル(4410円)、ホワイトプラン(980円)、S!ベーシック(315円)、月々割(-1920円)
Willcom合計:(2900 + 2900) * 24 = 139,200
Softbank合計:2835 + 57600 - 10000 + 2000 - 6336 + (4410 + 980 + 315 - 1920) * 24 = 136,939
総合計:139200 + 136939 = 276,139


データ通信は完全にiPhoneへ移行。Willcomは通話のみ。
Willcom側はスマートフォンである必要が無くなるので、9(nine)とかの電話向き本体の方が良いが一括支払いのポイントを考えると実質0円で一番高いadesがよさげ。
たけぇぇ!


上記プランのiPhoneiPod Touchに変更

Apple初期費用:32G本体(29800円)、ヨドバシのポイント付与(3278P)
Willcom初期費用:本体(51120円)、ヨドバシのポイント付与(5623P)
Willcom毎月費用:旧定額(2900円)、データ定額(1000円)、彼女側旧定額(2900円)、W-VALUE割引(-2130円)
広域無線LAN毎月費用:Livedoor wireless(525円)
総合計:29800 - 3278 + 51120 -5623 + (2900 + 1000 + 525 + 2900 - 2130) * 24 = 196,699


iPhoneの場合、結構な値引が入るとは言え、無駄なホワイトプランとかに費用がかかる。
ならば、ちょうど新型が発表されたiPod Touchはどうだろうと考えてみたらこんな感じ。
広域無線LANを契約することでWillcom側のデータ通信を10万パケット以下に抑えられるとした場合だが、
そもそも広域無線LAN使ったことが無いから、どれぐらい使える物かよくわからない。
移動中には基本使えないだろうから、そんなにパケ代減らせないのかも。
結局は「どこでもつながる3Gサービス」に2年で8万を出せるか否かって問題なのか。


iPhone + Skype Phone

Softbank初期費用:契約手数料(2835円)、本体(57600円)、株主優待券値引(-10000円)、優待券購入(2000円)、ヨドバシのポイント付与(6336P)
Softbank毎月費用:パケット定額(4410円)、ホワイトプラン(980円)、S!(315円)、月々割(-1920円)
Skype Phone:USB型(3980円) or 無線ルータ(10000円程度) + Wi-fi対応型(20000強)

Softbank合計:2835 + 57600 - 10000 + 2000 - 6336 + (4410 + 980 + 315 - 1920) * 24 = 136,939
総合計:136939 + 3980 = 140,919
総合計:136939 + 10000 + 20000 = 166,939

2キャリア持つのはやっぱり(金銭的に)無理だ。そもそもWillcomは本当に必須か?
どうせ長電話は家にいる時。ならSkypeで良いんじゃないか?という考えを元に計算。
こっちはSkype for iPhone + 自宅無線LAN
彼女側はSkype Phone + PC + 自宅有線LAN(USB型の場合)
もしくはSkype Phone + 自宅無線LAN(Wifi対応型の場合)
これだとPCを起動しておく手間があるので、無線LANルータ + Wi-fi対応型Skype Phoneも検討。
これなら普通の電話ライク@無線LANのある場所において。


おを、iPhone手に入れたのに今より安い。どれぐらい不便になるかは神のみぞ知る。


iPhone + 無契約AdesでSkype
Softbank初期費用:契約手数料(2835円)、本体(57600円)、株主優待券値引(-10000円)、優待券購入(2000円)、ヨドバシのポイント付与(6336P)
Softbank毎月費用:パケット定額(4410円)、ホワイトプラン(980円)、S!(315円)、月々割(-1920円)
Willcom?初期費用:無線ルータ(10000円程度)、無契約Ades(7500円程度)
Softbank合計:2835 + 57600 - 10000 + 2000 - 6336 + (4410 + 980 + 315 - 1920) * 24 = 136,939
総合計:136939 + 7500 = 144,439


Wifi対応のSkype Phoneは2万以上する上に生産中止だらけ。
ならば、Windows Mobileに頼ろう。ヤフオクでAdesの本体だけを購入し、Skype for Windows Mobileをインストール。
見た目的にも普通の電話(PHS)になり、値段も抑えられて一石二鳥。
なんともトリッキーだが値段やサービス的には魅力的か。
@1日早ければこのAdesが買えたんだが、相場は5000円〜10000円らしい。
iPhoneW-SIM無しのAdvanced[es]欲しいなー


しかし、昨今の価格体系はもはやパズルだね。*3
こりゃ携帯マイスターが必要になるわけだわ・・・

*1:Softbank株主優待券は新規購入時に端末価格から1万円引き。ヤフオクでは2000円ぐらいで出回っているようだ

*2:一括購入であれば家電販売店のポイントが付く。株主優待券の分は商品券によるキャッシュバックらしいので、57600*11% = 6336Pointが付くはず

*3:たとえば「ただとも」「のりかえ」キャンペーンは株主優待と併用不可ということで今回は適用できず。

スペースシャトル(STS-128)打ち上げ成功!

日本時間12時59分に予定されていたスペースシャトルの打ち上げは予定通りに打ち上げられ、無事軌道に乗りました。
これでスペースシャトル打ち上げの残りは6回。(どれだけ当てになるかは別として)予定では2010年9月が最後の打ち上げになります。
夜間なので上手く撮れたのが少ないですが、例によってNASA TVをキャプチャした打ち上げ写真を。
そろそろ録画にした方が良いんだろうけどなぁ。