開発^3

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

金星探査機あかつきの現状まとめ

12月7日22時の記者会見のまとめが主、手元にまとめたテキストをコピペ

時間のズレとかあるかもー

08時49分        軌道制御エンジン噴射開始
08時50分43秒    通信断絶開始(予定通り)
09時01分00秒    軌道制御エンジン噴射終了
09時12分03秒    通信再開予定だったが通信再開せず
10時03分        探査機側で通信アンテナをLGAに自動切り替え
10時28分        衛星のLGAからの通信が受信される
                MGAに切り替えるよう、衛星にコマンドを送信
                コマンドは送信でき、MGAに切り替えが出来た
10時59分        MGA通信確立できず
11時29分        通信確立できなかったので、衛星側でLGAに自動切換
14時00分        スペインマドリッド局にて補足、LGAから受信、強さ変化確認
                0.1rpm(10分で1周の周期)で回転していることが確認される
                セーフホールドモードと考えられるがこの時点では未確定
                MGAに切り替えるように地上から地上からのコマンド
                10分に1回、40秒受信可能
17時00分        回転停止コマンドを送信したが停止せず、セーフホールドモード継続
                この際止まらなかったのはコマンドが衛星に届いていないと推定されている
                衛星の軌道が本来と違う為に、アンテナがズレていた
21時00分        スペインマドリッド、アンテナ方向予測して修正
                MGAでも通信できたが安定しない為、LGAで通信してテレメトリデータを受信中

現状:
    セーフホールドモードに入っているのは確定
    LGAにてテレメトリの受信(22時〜24時ぐらい)
    軌道は不明

トラブルなければ明日の昼までに採れるはずの情報
    HouseKeeping情報は分かる
    軌道決定もできる・・と良いな


参考:
    地上の光回線    100000000 bps(100Mbps)
    HGA                256000 bps(256kbps)?
    MGA                   512 bps
    LGA                     8 bps

Amazon EC2/S3/etc.の無料サービスに登録してみた

Amazonが11月1日から機能限定での無料サービスを始めたので、遅ればせながら試しに登録してみた。

参考:Amazon EC2、1年間限定でフリーミアムサービスを開始。日本でも利用可能

AWSアカウントを登録

1. 公式ページ(http://aws.amazon.com/free/)のSign Up Nowボタンから登録ページへ
2. メールアドレス、氏名、パスワード、住所、国、電話番号辺りを登録
注意:郵便番号にハイフンが無い場合、Invalid Addressといわれて受け付けられない
3. 登録完了

EC2の利用申請

EC2のページ(http://aws.amazon.com/jp/ec2/)からAmazon EC2の利用を申し込む
Free tier for new AWS customersとして条件が書かれていたり

アジア地域の場合はMicroInstanceで0.025$/hour。
普通に使った場合はこんな感じ

  • Amazon EC2 Linux/Unix Micro Instance
    • 0.025($) * 80(円/$) * 24(時間) * 31(日) = 1488円ぐらい
  • Elastic Load Balancing
    • 0.028($) * 80(円/$) * 24(時間) * 31(日) = 1666円ぐらい
    • 0.008($) * 80(円/$) * 15(GB) = 9.6円ぐらい
  • Amazon Elastic Block Storage(EBS)
    • 0.11($) * 80(円/$) * 10(GB) = 88円ぐらい
    • 0.11($) * 80(円/$) * 1(million IOs) = 8.8円ぐらい
    • 0.15($) * 80(円/$) * 1(GBSnapshot) = 12円ぐらい
    • 0.01($) * 80(円/$) * 1(x1000 PUT)= 0.8円ぐらい
    • 0.01($) * 80(円/$) * 1(x10000 GET)= 0.8円ぐらい

後半すごく細かいが、合計すると3274円ぐらいか。といってもぎりぎりまで使った場合だけど。
他にも5GBまでのS3が無料だったり、色々とお得な様子。


MicroInstanceの範囲であればインスタンス代は無料なわけで、掛かるとしたらデータ転送料ぐらいか。
15GBまでは無料。それを超えると1GBに付き12円ぐらいなので100GBで1200円。
まぁ、まずは帯域を使うようなサービスを作らないと意味が無い計算だなぁ。


と、説明を見たらクレジットカード番号を入力して次ページへ。


電話番号を入力するとPINが表示され、同時に電話が掛かってきます。
当然のように英語の自動音声が流れますが気にせず携帯からPINを入力。
承認されるとWebページが自動的に切り替わります。フィードバックはえぇ。


次ページに進むと、再度色々なサービスの値段が表示される。とりあえず無視してComplete Sign Up

AWS Managing Console

WebベースでEC2のインスタンスを管理できるっぽい。

  1. まずはRegionをASIAに切り替え。
  2. Service HealthがAPAC - Singaporeになっているのを確認してLaunch Instance。
  3. Community AMIsを見るとUbuntuやらCentOSやら見えるけど、とりあえずはQuick Startで32bit Amazon Linux AMIを起動してみる
  4. Instance数は1個、Instance TypeからMicroを選択してLaunch Instances
  5. Advanced Instance OptionsでkernelやらRAMディスクやら選べるみたいだけどとりあえずそのままContinue
  6. Tag付けも別に不要なのでそのままContinue
  7. 鍵の作成。名前を入れると秘密鍵を生成してダウンロードしてくれる。同時にインスタンスのauthorized_keysに追加されてるのかな。
  8. SecurityGroupの作成。後で変えれば良いのでSSHだけ許可
  9. 設定内容が表示されるので確認してLaunch

10秒とかからずインスタンスが立ち上がる。
とりあえずCloseでウィンドウを閉じて見に行ってみる。


左メニューのInstancesから一覧を表示すると今作ったインスタンスが動いている。
Instance ActionからConnectを選ぶとSSHでの接続方法が表示される。

後は適当にいじってみる

Puttyの場合、先にキーの変換をしないとなのでputtygen.exeを起動して変換
ppkファイルが出来たので説明にしたがって接続・・・
rootユーザじゃなくてec2-userでログインしてね。と切断された。・・・なぜWebの説明でrootユーザにしたし。


気を取り直してec2-userで再挑戦するとログイン成功。
アスキーアートでエンボス加工されたEC2の3文字が。目を細めると良く見える。

・とりあえずuname

[ec2-user@ip-10-130-59-18 ~]$ uname -a
Linux ip-10-130-59-18 2.6.34.7-56.40.amzn1.i686 #1 SMP Fri Oct 22 18:48:33 UTC 2010 i686 i686 i386 GNU/Linux

・sudo権限もある

[ec2-user@ip-10-130-59-18 ~]$ sudo echo "hoge"
hoge

iptablesはからだった。てことはSecurityGroupでのSSH許可はインスタンスより上のレベルで制御されてるのか。


・ディスクは9Gぐらい空きあるけど、永続データはS3におくべきなんだっけ?
試しにファイルを作って再起動したら普通に残っていた。まぁ、プログラムとか毎回消えたらdeploy面倒だよね。


VIMは7.0.237だった。
.vimrcは全くなかったのでいつものをコピペ。
でもよくあることでambiwidth=doubleにしていても記号がおかしかったり。しょぼん。

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>

Colorful Google Calendarを修正

なにやらGoogle Calendarのクラス指定が変化してColorful Google Calendarが動かなくなっていたので修正。
Google Calendarの土日に背景色をつけるGreasemonkeyScriptです。


インストール


CodeReposのソース

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

実行結果

続きを読む