RxAndroidで勘違いしていたこと

📅 2015/04/22

Android RxAndroid RxJava RxAndroid

Observable.subscribe()したら必ずsubscribe()の戻り値であるSubscriptionのunsubscribe()を呼ばなければいけない

そう思っていた時期が僕にもありました。 Subscriptionのleakが起きるのはonCompletedが呼ばれないObservableをsubscribe()したままにしてしまう場合です。以下のコード例はonCompletedが呼ばれてunsubscribeされるので明示的に呼び出す必要はありません。 ただし、Activityのライフサイクルより処理が長くなる場合は不要な処理となるのでCompositeSubscription等を使ってonPause()で明示的にunsubscribe()してあげましょう。

Observable.just(...).subscribe(...);
Observable.from(...).subscribe(...);
Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        subscriber.onNext(new Object());
        subscriber.onCompleted();
    }
}).subscribe(...);
Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        subscriber.onError(new IllegalStateException());
    }
}).subscribe(...);

参考

Top 7 Tips for RxJava on Android

RxAndroidでよくやる間違い(実行スレッド編その1)

📅 2015/03/18

Android RxAndroid

observeOn(…)とsubscribeOn(…)正しく使えてますか

以下の2つのコードはobserveOn(…)とsubscribOn(…)の位置が異なります。 表示の問題上、ブロック内での実装は省略しています。 どのポイントがどのスレッドで動くか確認します。

コードその1

Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        // ポイント1
    }
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1<Object, Object>() {
    @Override
    public Object call(Object o) {
        // ポイント2
        return o;
    }
})
.subscribe(new Observer<Object>() {
    @Override
    public void onCompleted() {
        // ポイント3
    }
    @Override
    public void onError(Throwable e) {
    }
    @Override
    public void onNext(Object o) {
    }
});

コードその2

Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        // ポイント1
    }
})
.map(new Func1<Object, Object>() {
    @Override
    public Object call(Object o) {
        // ポイント2
        return o;
    }
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Object>() {
    @Override
    public void onCompleted() {
        // ポイント3
    }
    @Override
    public void onError(Throwable e) {
    }
    @Override
    public void onNext(Object o) {
    }
});

それぞれのポイントへ以下のようにログを仕込みます。

Log.d("Thread", String.format("%s threadId:%d","OnSubscribe", Thread.currentThread().getId()));
Log.d("Thread", String.format("%s threadId:%d","map", Thread.currentThread().getId()));
Log.d("Thread", String.format("%s threadId:%d","onCompleted", Thread.currentThread().getId()));

コードその1の場合はmapがUIスレッドで実行されているのに対し

D/Thread﹕ OnSubscribe threadId:199
D/Thread﹕ map threadId:1
D/Thread﹕ onCompleted threadId:1

コードその2の場合はmapがonSubscribe(…)のスレッドで実行されています。

D/Thread﹕ OnSubscribe threadId:201
D/Thread﹕ map threadId:201
D/Thread﹕ onCompleted threadId:1

mapで重い処理を走らせてANRを発生させないためにも、BuildConfig.DEBUGがtrueの時はエラーを投げるよう工夫しましょう。(戒め

JacksonでJsonから特定の要素をデシリアライズしたくない場合のメモ

📅 2015/03/17

Android Jackson

以下のようなJsonとデシリアライズ先クラスがありlistの要素だけデシリアライズしたくない場合にtitleフィールドをStringに変更するのは間違いです。

Can not deserialize instance of java.lang.String

Data.java

public class Data {
    String id;
    List<Title> title;
    public static class Title {
        String title;
    }
}

sample.json

{
    "id": "12345",
    "list": [
        {
            "title": "ふしぎの海のナディア"
        },
        {
            "title": "ガンバの冒険"
        }
    ]
}

Data.javaクラスのtitleフィールドをObjectにすると後でデシリアライズできる。

Data.java

public class Data {
    String id;
    Object title;
}

C87気になるもの

📅 2014/12/28

comicket C87

楽園追放 【No.322】東映アニメーション

C87限定 2限 楽園追放3DCG原画集 ¥2,000円

魔法少女まどか☆マギカ 【No.211】SHAFT 

先行販売/C87特典「劇場版 魔法少女まどか☆マギカ [新編]叛逆の物語」PRODUCTION NOTE ¥6,000円 先行販売/C87特典 2015 Monthly Rakugaki- Illust collection C87特装版 ¥3000円

SHIROBAKO 【No.351】P.A.WORKS

先行販売/C87特典「SHIROBAKO」ミニファンブック ¥2,000

月刊少女野崎くん 【No.541】pixiv

先行販売原画集

http://goods.pixiv.net/c87/

¥3000円 計 ¥16,000円

楽園追放の生コメンタリー上映に行ってきた

📅 2014/12/05

アニメ 楽園追放 3DCG

2014年12月04の19:30から実施された楽園追放の生コメンタリー特別上映に行ってきました。

この記事はその書きなぐったメモを元に話をざっくり書いたものになります。 うろ覚えなので表現や曖昧や正しくない場合があることを考慮して読んでいただければ幸いです。

19時20にシアター8開場。スクリーン前方には小さな舞台があり、そのサイドにはスピーカーが設置されていました。スピーカーからはEONIAN -イオニアン- (Instrumental)と英語バージョンと通常版が流れていました。時間になるとアニプレックスの高橋祐馬さんが司会として登場し、今回は特別企画であることの説明の後に「ネタバレフェスティバル」になると注意がありました。ここにいらっしゃる「3分で完売したチケットを手に入れたディーバ市民の皆さん」なら特に問題ないでしょうという一言もありました。 それから7名のゲストが舞台に呼ばれました。左側からCG監督の阿尾直也さん、モーション監督の柏倉晴樹さん、監督の水島精二さん、演出の京田知己さん、造形ディレクターの横川和政さん、スカルプチャーデザインの浅井真紀さん、プロダクションデザインの上津康義さん、キャラクターデザインの齋藤将嗣さんと豪華メンバーが登場され担当について軽く説明がありました。自己紹介が終わると水島監督が来場者の方々に何回楽園追放を見たのかアンケートを取りました。見た回数に応じて手を挙げてもらい1回、2回…9回と人が減っていきました。一番多く見られた方は21回見たらしく水島監督が感想を聞くと、「お尻が…」という返答がありました。水島監督からお尻については横川さんが拘りムッチリとされたとコメントがありました。 舞台上の挨拶が終わるとゲストの方々はシアター8中央通路の入り口寄りに座られて、そこで見ながらコメントするという形になりました。以降はゲストの方々のコメントを記載していきます。

高橋:水島さん、最初のほうに何か意識されたものはありましたか?

水島:現実か電脳か見てる人が区別しやすいように空の色を変えています。また最初は日常っぽく描いてます。 アンジェラの端末は目と植物になっています。あと葉っぱとりんごをかじったみたいな形になっています。りんごというのはアダムとイブを連想してますね。 フロンティアセッターとのチェイスシーンはシナリオにはなく、コンテ切りは最後のほうに行われました。

齋藤:アンジェラのディーバ制服は2、3パターン出しました。なかなかOKが貰えず虚淵さんと水島さんからもっとピッチリさせてくれと要求がありました。

水島:ここは普通にするとだめなのでピッチリしてほしいという注文を出しました。ボディースーツはピッチリしていないと!!!ここらへんは70年代のアニメには多いですね、ヤマトとか。 あと男はピッチリしなくてもいいですね。ピッチリしていると未来感がありますね。

齋藤:ピッチリだとバーツを浮かせるデザインが使えますね。

水島:パーツを浮かせるのは作画だときついですが3DCGだとできますね。

齋藤:デザイン上で硬いとか柔らかさがわかるように気を付けて色をつけました。

横川:辛かった

水島:最初なトライアルでどこまでできるのか知るためにモデルをじっくりと動かした。

阿尾:ここまでCGでやるとは思っていなかった。

水島:爆発とかキャラのアップは初期の段階では作画でやっていました。CGは2D的なアプローチである「手付け」で行いました。 今はモーションキャプチャーで動かすのが主流になっている。作画と同じキーフレームを作り中割→アクション→変形とさせてくことを手付けと言います。 モーションキャプチャーを使わず手付けを行うことで作画っぽくしました。セルルックで自動生成してしまうとヌルヌルしてしまう。

柏倉:カットを作るのにまずコンテを見てもらい、どう絵を作るのかビジョンを持ってもらった。

水島:ワークフローとしては2Dと同じでレイアウトから入りました。これは3DCGでもよくやります。リミテッドアニメーションにしていこう。 キャラクターがしゃべってる間に飽きないように演出と打ち合わせをしてキャラクターに芝居をさせている。グラフィニカの新人君がアンジェラが好きなので仕事を頼んだ。机にはRedBullが積まれていた。 皆が自分たちで表現したいものに仕上げていった。

高橋:デザインはどういうふうに決まったんですか?(ざっくりと)

水島:齋藤くんをpixivで東映の野口さんが見つけてきた。

齋藤:会社に行く前にメールをチェックしたら東映の野口ですというタイトルのメールが届いていた。 女の子を書くのがメインだったのでディンゴを描くのに苦労しました。

水島:なかなあかなるようにならなかった。ディンゴのデザインは中盤までやっていて一旦止めた。三木さんの声を聞いてイメージが固まった。 最初は元軍人で歴戦の戦士みたいな感じにしていた。虚淵さんはメタルギアソリッドみたいな感じと言っていた。

キャラデザ齋藤:アンジェラの服装は上津さんがデザインしたディーバのイメージから楽園→天国→蓮の花がモチーフになっています。 最初のアンジェラはもっと硬派になっていた。肌色を多くして欲しいということで多くしたが、多くし過ぎと怒られました。 その時のデザインは今のアンジェラの白い部分が透けているような感じですね。(ほとんど裸では) ツインテールはどことなくミクっぽいので頭のデザインを試行錯誤しておさげに落ち着きました。東映の野口さんからはおさげはババ臭いと言われました。

阿尾(?):髪の毛が多いので苦労しました。髪の毛が多いとボーンが大変です。

高橋:どのように人を集めていったんでしょうか

水島:スカルプチャーデザインはグラフィニカに頼む前に決まりました。まずは形にしたいと思い浅井さんに胸像を作ってもらうように頼みました。

浅井:胸像つくてついでに遊ばない?そういうのりで誘われました。勇者が酒場でパーティーを集めるような感じです。

水島:シナリオがまだ完成していなかったので先に造形をつくろうということになりました。

浅井:シナリオは前半くらいまでできていましたね。

水島:ちなみに銃は虚淵さんから結構指定がありました。ディンゴが使っているリボルバー以外にもあったんです。 モデルが多いとつらいので重要度を見て減らしていきました。またモデル以外にもモブの数も制限しました。どこに注力するか悩みました。 ちなみにアンジェラの緑色で透明なところはわざと光らせています。光=元気=体力という感じで病気で伏せているときは光っていません。 色彩設計の人がそれを知らず「私間違ったかも?!」というのもありましたが見逃してください。浅井さんのスカルプチャーをCGに落とせるか?

横川:いける。スーツの質感には注意しました。アンジェラのモデルは水島監督に2,3回チェックしてもらいました。

水島:ディンゴは1回だけ見せてもらった。

横川:ディンゴは大変だった。いろんな角度からみれるようにするのに苦労した。

水島:七味好き!後ろのカップルは苦労しましたね。八木田さん担当でしょうか。後ろでうどん食べるモブの食べる描写をごまかすために口元隠してますね。 なるべく拝啓のモブは止まらないように注意してます。あとぼかしをいれたりしてますね。

高橋:地上はどんなイメージで作られましたか?

水島:ナノハザード後の世界でアメリカ大陸がモデルになってます。人口の9割が減ったということで多種多様な人種がいるようにしています。 街はふたつあって2つ目の方は東洋ぽっくしています。人であm地の雰囲気を出してます。

横川:俯瞰でCG走らせるのは大変でしたね。ごまかしがきかないので。

水島:ここは会話だけのシーンなんですがキャラを動かしてます。階段を登るアンジェラのお尻いいですね。あと胸も。 柔らかさが出ています。横川くんがフェチっぷりを発揮してがんばってくれました。

横川:お尻は1.5倍柔らかくしています。

水島:プロの作画の人は1mm線の差で柔らかさを表現してすごいですね。CGで表現するのはつらいです。アンジェラには私と虚淵さんも萌え萌え?

高橋:ここ(北の廃墟)のロボットのデザインで気にされたことはありますか

水島:ロストテクノロジーという感じでパーツは交換できるデザインにしています。荒廃した世界は日常とは違う。会話の演出はキャラ中心にしました。 奥行きを出し過ぎないように背景をぼかしたりしています。演出は京田さんとやっています。監督は方向性を決める役です。京田くんを信頼しているのでチェックは京田くんのほうでやってもらってました。 チェックで監督が呼ばれるかなと待ってましたが呼ばれなくてがっかりすることもありました。1/3くらいは京田くんがやってくれて心強かった。キャスティングはこれ以上ないという役になっている。 それからシナリオはアンジェラを中心にして削っていった。

高橋:表情の変化は難しかったですか

水島:フェイシャルコントローラーというものを使いました。

横川:リグをつけたりしました。ツールを札幌のほうのプログラマに作ってもらったりしました

水島:表情はアニメーション。初期は作画部というのがありました。映画を作る間にスキルアップしていきました このディンゴとアンジェラとフロンティアセッターが三人いるシーン(管制室みたいなところ)はアイカツを作ってるサムライピクチャーズさんですね。 ここは先に出来上がっていてそこからコンテを盛っていきました。またパートパートを見て別パートに追加していった。

高橋:引きのアンジェラはつま先立ちになってますね?

齋藤:気になりますよね。実はつま先立ちはデザインミスです…。足を大きくしておけはばかったと思いました。最近の絵になるほど大きくなっていってます。

水島:点足っぽいですよね。そういうフェチかな?って思ってました。モデルが歩くような感じかと。 ここの癖のある表情は五十嵐さんですね。表情でこんなにかわいくなるんだと思いました。あと緒方くんとSkypeでやりとりもしていましね。 表現についてはアウトっていうまで自由にやってもらっていました。3Dでやると楽になると思わますが、あくまでツールなので人の手やることになります。 転送装置はもっとごちゃごちゃしてていたが削ってこんな感じになりました。ディーバへ帰還するところから京田さんパートですね。

京田:アンジェラの移動は右から左、左から右と意識して変えています。このシーン(上官3人仁王立ち)のアンジェラは地球の上に立っているのをイメージしています。 アンジェラがディーバに戻ったのに地上にいる姿のままですよね。ここはアンジェラがフロンティアセッターの側についてるように見せています。 制作の時はアニメの話をよくしていました。楽園追放は80年代のOVAのノリに近いです。そういうテイストを入れています。アニメーターさんは板野塾の人が多いですね。(AIC、アニメアール、増尾昭一さん、瀬尾さん?XX紀文さん キーワードしか拾えなかった) 映画をみせるのにそれらしく見せるのは大切。80年代に色々な作画表現が出てきた。先人の技のリスペクトをしてます。ひび割れ表現はトップをねらえ!ですね。

高橋:3DCGを意識して絵コンテを切ったりしましたか

京田:そうれはないです。いつもの方法論で絵コンテを切りました。

水島:3Dだからこそってのも演出の邪魔になるね。

京田:一流の作画の人たちを集めたらできるCGになっています。

水島:後半の演出は絵コンテを切った京田くん本人しかできないと思い任せた。上がってきたコンテを見た時は皆戦慄しましたね。 後半はスカッとしていていいよね。

京田:3DCGはパースが正確で嘘つけないですね。雲を入れると嘘パースになりやすいので後半は雲をなくしました。嘘パースとかがなくなることで画面に集中してもらえる。

水島:雲入れると奥行きが出せるよね。前半は雲が多めだけど後半は少なめになってますね。付けパンは2Dみたいと嘘つける。雲の多段表現はつらい。そういえばエウレカは雲多かったかな?

京田:空は上ほど濃くなってますね。宇宙は黒色です。

水島:ガンダムOOで宇宙を黒にして気になったので星雲入れたりしていました。 煙の作画は橋本さんと八木田さんです。冒頭の寝ているアンジェラは作画だったのでCGでやりたかった。

京田:巡りあい編(?)。ここはアンジェラメインでたまにディンゴを映してます。 (暗い中書いたのでてこのあたりの書きなぐりが読めない)

水島:アーハンのダメージ表現大事。これはダメージモデル作ったの?それとも上から入れている?

阿尾:上からですね。

水島:これから3Dで何ができるか。3Dの人達が何か出してくれると思ってました。京田くんすげー。

京田:あとで何か奢ってもらえるのかな。

水島:東映の野口さんすごい!若い人に作ってもらったのものよかった。

齋藤:私はファンとして映画を見ました。0から1を創りだしただけで1から10にするのはアニメーターさんや他の方々がやってくれました。 0から1は言いすぎたかな?0.5くらい?

水島:偶然集まった愉快なスタッフ。ギリギリまでやっていたスケジュールだったのでオーディオコメンタリーをつくる時間はなかった。 上映終了

高橋:最後に何か一言ずつお願いします。

齋藤:虚淵さんと同じくらいから企画に参加しました。5年くらい前くらいです。

上津:2011年からなので3年くらい

浅井:3年くらい

水島:夢のが入ってない?

横川:2年くらいやってました。一番会社に泊まってましたね。

水島:こだわりがすごい。制作に勝ってるくらい。

柏倉:アクションはやっていたが芝居ははじめてやりました。次もできれば色々やってみたい。

阿尾:1年くらいやってました。CG業界に入って10年くらい経ちました。またこういう作品を作りたい。

京田:色々奇跡が起きた。もう一度同じメンバーでやっても同じものはできない。演出としてラッキー。過渡期だけど面白いものができました。

水島:ミラクルがたくさんあって演出家冥利に尽きる。

新規HDD追加時に覚えておきたいコマンド

📅 2014/09/13

FreeBSD HDD

FreeBSDで新規HDD追加する度に忘れてしまうのでメモ。

  • /dev/ada0 => physical:512B logical:512B
  • /dev/ada3 => physical:4KB logical:512B

fdisk

Media sector size is 512という記述はlogical sector sizeという点に注意。 logical/physicalを見たい時は後述のコマンドを参照。

# fdisk -v /dev/ada0
******* Working on device /dev/ada0 *******
parameters extracted from in-core disklabel are:
cylinders=484521 heads=16 sectors/track=63 (1008 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=484521 heads=16 sectors/track=63 (1008 blks/cyl)
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 486539235 (237567 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 1023/ head 255/ sector 63
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
 # fdisk -v /dev/ada3
******* Working on device /dev/ada3 *******
parameters extracted from in-core disklabel are:
cylinders=5814021 heads=16 sectors/track=63 (1008 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=5814021 heads=16 sectors/track=63 (1008 blks/cyl)
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 238 (0xee),(EFI GPT)
    start 1, size 4294967295 (2097151 Meg), flag 0
        beg: cyl 0/ head 0/ sector 2;
        end: cyl 1023/ head 255/ sector 63
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>

diskinfo

-c オプションでread/writeを見ることができる。 -v オプションはread/write抜きになる。

# diskinfo -c /dev/ada0
/dev/ada0
        512             # sectorsize
        250059350016    # mediasize in bytes (232G)
        488397168       # mediasize in sectors
        0               # stripesize
        0               # stripeoffset
        484521          # Cylinders according to firmware.
        16              # Heads according to firmware.
        63              # Sectors according to firmware.
        Z3TFKXBE        # Disk ident.
I/O command overhead:
        time to read 10MB block      0.123508 sec       =    0.006 msec/sector
        time to read 20480 sectors   2.671287 sec       =    0.130 msec/sector
        calculated command overhead                     =    0.124 msec/sector
# diskinfo -c /dev/ada3
/dev/ada3
        512             # sectorsize
        3000592982016   # mediasize in bytes (2.7T)
        5860533168      # mediasize in sectors
        4096            # stripesize
        0               # stripeoffset
        5814021         # Cylinders according to firmware.
        16              # Heads according to firmware.
        63              # Sectors according to firmware.
        34Q4K0A6FSDA    # Disk ident.
I/O command overhead:
        time to read 10MB block      0.055544 sec       =    0.003 msec/sector
        time to read 20480 sectors   1.076329 sec       =    0.053 msec/sector
        calculated command overhead                     =    0.050 msec/sector

camcontrol identify [device]

ファームウェアやシリアルナンバーなど一番細かい情報が出せるコマンド。

# camcontrol identify /dev/ada0
pass0: <VB0250EAVER HPG9> ATA-8 SATA 2.x device
pass0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
protocol              ATA/ATAPI-8 SATA 2.x
device model          VB0250EAVER
firmware revision     HPG9
serial number         Z3XXXXX
WWN                   5000c5005005b05d
cylinders             16383
heads                 16
sectors/track         63
sector size           logical 512, physical 512, offset 0
LBA supported         268435455 sectors
LBA48 supported       488397168 sectors
PIO supported         PIO4
DMA supported         WDMA2 UDMA5
media RPM             7200
Feature                      Support  Enabled   Value           Vendor
read ahead                     yes      yes
write cache                    yes      yes
flush cache                    yes      yes
overlap                        no
Tagged Command Queuing (TCQ)   no       no
Native Command Queuing (NCQ)   yes              32 tags
SMART                          yes      yes
microcode download             yes      yes
security                       no       no
power management               yes      yes
advanced power management      no       no
automatic acoustic management  no       no
media status notification      no       no
power-up in Standby            no       no
write-read-verify              yes      no      0/0x0
unload                         no       no
free-fall                      no       no
Data Set Management (DSM/TRIM) no
Host Protected Area (HPA)      no
 # camcontrol identify /dev/ada3
pass3: <TOSHIBA MD04ACA300 FP1A> ATA-8 SATA 3.x device
pass3: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
protocol              ATA/ATAPI-8 SATA 3.x
device model          TOSHIBA MD04ACA300
firmware revision     FP1A
serial number         3XXXXXXXXX
WWN                   500003956b883858
cylinders             16383
heads                 16
sectors/track         63
sector size           logical 512, physical 4096, offset 0
LBA supported         268435455 sectors
LBA48 supported       5860533168 sectors
PIO supported         PIO4
DMA supported         WDMA2 UDMA5
media RPM             7200
Feature                      Support  Enabled   Value           Vendor
read ahead                     yes      yes
write cache                    yes      yes
flush cache                    yes      yes
overlap                        no
Tagged Command Queuing (TCQ)   no       no
Native Command Queuing (NCQ)   yes              32 tags
SMART                          yes      yes
microcode download             yes      yes
security                       yes      no
power management               yes      yes
advanced power management      yes      yes     128/0x80
automatic acoustic management  no       no
media status notification      no       no
power-up in Standby            no       no
write-read-verify              no       no
unload                         no       no
free-fall                      no       no
Data Set Management (DSM/TRIM) no
Host Protected Area (HPA)      yes      no      5860533168/5860533168
HPA - Security                 no

合わせて読みたい

FreeBSDのディスク追加メモ

さくらVPSでCoreOSを使う

📅 2014/09/07

CoreOS さくらVPS

CoreOS ISOのダウンロード

こちらからCoreOSのISOを取得します。 今回はStable Channelを使います。

次にさくらVPSにログインした後、「OS再インストール」を選び「ISOイメージインストールへ」を選択します。

「アカウント作成」を押してアップロード用のアカウントを作成します。 表示されたアカウントを使いsftpで/isoフォルダへCoreOSのISOをアップロードします。

アップロードが完了した後、更新ボタンを押すとアップロードしたISOファイルについて表示されます。 VirtIOの有効にチェックを入れて下部の「確認」ボタンを押し、次の画面の「実行」ボタンを押すとCoreOSのインストールが開始されます。

CoreOSのセットアップ

表示されているIPアドレスをすべてメモして「HTML5 モードで開く(推奨)」ボタンを押してコンソールを開きます。

ネットワーク疎通が取れないのでネットワークの設定をします。

ネットワーク設定

VirtIOを有効にするとensでなくethになるのでISOインストール時に出ていたIPを元に/etc/systemd/network/static.networkへ以下の設定を書き込みます。

[Match]
Name=eth0
[Network]
Address=1xx.121.xx.17/23
Gateway=1xx.xxx.56.1
DNS=xxx.188.xxx.10
DNS=xxx.188.xxx.11

systemd-networkdを再起動し、外部と疎通が取れるか確認します。 無事pingが通ったので、一時的にsshで接続するために設定を行います。

coreユーザのパスワードを変更すればsshでの接続ができるようになります。

$ ssh-keygen -t rsa -C "core os ssh"
</pre>
<pre>
#cloud-config
write_files:
  - path: /etc/systemd/network/static.network
    content: |
      [Match]
      Name=eth0
      [Network]
      Address=1xx.121.xx.17/23
      Gateway=1xx.xxx.56.1
      DNS=xxx.188.xxx.10
      DNS=xxx.188.xxx.11
ssh_authorized_keys:
  - ssh-rsa AAAA...

sshキーを作成してセットアップ用のcloud-configファイルを作成します。

作成したcloud-configを使いCoreOSのインストールコマンドを叩きます。

インストールに成功したらVPSホームから再起動します。

sshでログインできなければVPSホームから何度か再起動するとできるようになります。

参考

メモ

coreos-install後のチェック

mkdir vda9
mount /dev/vda9 ./vda9
sudo su
cat ./vda9/var/lib/coreos-install/user_data

HLSの復号メモ

📅 2014/05/11

パケットキャプチャ HLS 暗号化 AES

暗号化されたtsファイルの復号

*.tsファイルとAES-128のキーをファイルとして保存します。

復号の補足説明

暗号化はAES-128 CBCモードでされているのでキーの他にIVが必要になります。 IVはEXT-X-KEY:の中に記述されていますが、省略されている場合はIVは0になります。 EXT-X-MEDIA-SEQUENCEの数値をsprintf("%032x”, num)したものがIVになります。

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5,
#EXT-X-KEY:METHOD=AES-128,URI="https://www(略)" <= AES-128の復合キー
0_p000(略).ts
#EXT-X-ENDLIST

goで復号するとこんな感じになります。

package main
import (
    "os"
    "bufio"
    "crypto/aes"
    "crypto/cipher"
)
func main() {
    decryptFile("1.ts", "1_decrypted.ts", "1.key", []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    decryptFile("2.ts", "2_decrypted.ts", "2.key", []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    decryptFile("3.ts", "3_decrypted.ts", "3.key", []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
}
func decryptFile(input_file_path string, output_file_path string, key_file_path string, iv []byte) {
    key_file , _ := os.Open(key_file_path)
    ts_file, _ := os.Open(input_file_path)
    defer key_file.Close()
    defer ts_file.Close()
    bufio_key := bufio.NewReader(key_file)
    bufio_ts := bufio.NewReader(ts_file)
    key_raw_bytes := make([]byte, 16)
    bufio_key.Read(key_raw_bytes)
    block , _ := aes.NewCipher(key_raw_bytes)
    aes_block := cipher.NewCBCDecrypter(block, iv)
    decrypt_ts_file, _ := os.Create(output_file_path)
    defer decrypt_ts_file.Close()
    for {
        ts_raw_bytes := make([]byte, 16)
        read_count, _ := bufio_ts.Read(ts_raw_bytes)
        if (read_count == 0) {
            break
        }
        decrypt_bytes := make([]byte, 16)
        aes_block.CryptBlocks(decrypt_bytes, ts_raw_bytes)
        decrypt_ts_file.Write(decrypt_bytes)
    }
}

一部記事を削除。