目次
はじめに 21
Node.js
で
1
から作る生放送サーバ
9
第1章 はじめに 10 1.1 前提環境 . . . . 10 Node.jsのインストール . . . . 10 FFMPEGのインストール. . . . 10 1.2 ソースコードについて . . . . 11 JavaScriptについて . . . . 11 第2章 HTTP Live Streamingの概要 12 2.1 HLSの再生環境 . . . . 12 2.2 HLSが使われているサービス . . . . 13 MPEG-DASH . . . 13 2.3 HLSの仕様. . . . 14 tsファイル . . . . 14 m3u8ファイル . . . . 14 再生クライアントの挙動 . . . . 15 m3u8タグの解説. . . . 16 第3章 配信サーバの実装 19 3.1 ニコニコ動画から動画ファイルを取得する . . . . 19 ニコニコ動画のサーバ . . . . 21 3.2 取得した動画をHLSで再生する. . . . 22 3.3 動画をTSに分割する . . . . 23 3.4 複数の動画を連続再生する. . . . 23 3.5 ブラウザからリクエストを受ける . . . . 25 3.6 WebUIの改良 . . . . 27 3.7 多くのブラウザで再生できるようにする. . . . 33目次 第4章 まとめ 34
2
Pwnable
超入門
35
第1章 環境 36 1.1 練習問題の起動方法 . . . . 36 1.2 コンテナ間の通信 . . . . 37 ctf-lab-2017-handsonの起動 . . . . 37 第2章 システムコールとシェルコード 38 2.1 システムコール. . . . 38 2.2 シェルコード . . . . 39 シェルコードの実行方法 . . . . 40 シェルコードの制約 . . . . 40 第3章 バッファオーバーフロー 41 3.1 バッファとは . . . . 41 3.2 バッファオーバーフローさせてみる . . . . 42 3.3 変数を書き換えてみる . . . . 42 3.4 まとめ . . . . 43 第4章 解析の初歩 44 4.1 解析方法 . . . . 44 ltrace . . . 44 strace . . . 45 radare2 . . . 46 第5章 シェルを起動する 47 5.1 脆弱性の悪用 . . . . 48 5.2 リターンアドレスの改ざん. . . . 49 スタックについて . . . . 49 5.3 exploitの書き方 . . . . 51 プログラム . . . . 51 第6章 FSB 53 6.1 FSBとは . . . . 53 6.2 書式文字列 . . . . 53 6.3 例 . . . . 54 第7章 GOT Overwrite 55 7.1 関数のアドレス解決 . . . . 557.2 FSBとGOT Overwrite . . . . 57 7.3 exploitを書く . . . . 57 第8章 セキュリティ機構 59 8.1 NXbit . . . 59 8.2 ASLR, PIE . . . 59 8.3 RELRO . . . 59 8.4 Canary . . . 60 回避方法 . . . . 60 第9章 Information leak 61 9.1 FSBの利用. . . . 61 第10章 ROP 62 10.1 例 . . . . 62 10.2 pwntools . . . 63 第11章 練習問題 64 第12章 練習問題解答 66
3
言われてみれば当たり前なタッチ入力の話
77
第1章 タッチ入力とボタン入力の違い 78 1.1 ボタン入力 . . . . 78 1.2 タッチ入力 . . . . 78 第2章 タッチ入力の分類 79 第3章 タッチ入力の区別 80 第4章 タッチ入力を扱うためのクラス設計 82 第5章 Inputの実装 83 第6章 UIManagerの実装 85 第7章 UIの実装 86 第8章 上記の設計の実用例 87 第9章 より高度なUIへ 88 9.1 UIをスタックで管理. . . . 88目次 9.2 UIパーツの作成 . . . . 88 第10章 まとめ 89
4
そばやのワク☆ワク流体シミュレーション
MPS
編
90
第1章 流体シミュレーションって? 91 第2章 流体シミュレーションの種類 93 第3章 事前準備 95 第4章 MPS法のタイムステップ 975
まだ間に合う!
Vue.js
101
第1章 Vue.jsとは? 102 エディタについて . . . 105 第2章 サポートライブラリ 106 2.1 Vue Router . . . 106 2.2 Vuex . . . 106 2.3 axios . . . 1062.4 Vue Server Renderer . . . 107
2.5 Nuxt.js . . . 107 第3章 開発向けライブラリ 108 3.1 vue-loader . . . 108 3.2 eslint-vue-plugin . . . 108 3.3 vue-test-utils . . . 108 第4章 必要なもの 109 第5章 vue-cliでプロジェクトを作成しdevサーバーを起動する 110 第6章 実際に作ってみよう 111 第7章 起動してみよう 113 第8章 .vueファイルについて 114 8.1 template . . . 115 8.2 script . . . 115
8.3 style . . . 115 第9章 Twitterの準備をする 116 第10章 雛形を作る 117 10.1 LandingPage.vue . . . 117 10.2 Tweet.vueの追加 . . . 118 第11章 TLの表示 119 11.1 LandingPage.vue . . . 119 11.2 Tweet.vue . . . 120 第12章 Tweetできるようにしてみる 121 第13章 終わりに 122 著者紹介 123
1
Node.js
で
1
から作る
生放送サーバ
NaruseJun
著
Node.jsを使って生放送サーバを書いていきます。コアとなる技術は HTTP Live Streaming(HLS)と呼ばれるHTTPベースのストリーミン グプロトコルで、特殊なストリーミングサーバを必要としないのが特徴 です。 今回は、HLSを使ってニコニコ動画のNsen*1の再現に挑戦してみます。 *1ユーザ参加型ラジオ風生放送サービス。ユーザが再生したい動画をリクエストすると、その動画が生放送される。Node.jsで1から作る生放送サーバ
第
1
章
はじめに
1.1
前提環境
今回紹介するコードは、以下の環境で動かしています。簡単に構築方法も示しますので、適宜用 意してください。• Windows 10 (version 1709 build 16299.125) – Microsoft Edge 41.16299.15.0 • Node.js 9.3.0 – npm 5.5.1 • FFMPEG 3.4.1
Node.js
のインストール
Windows/macOS/Linux向けのバイナリが https://nodejs.org/から入手できます。バイ ナリをインストールした場合は、パスを通すようにしてください。macOSでは、Homebrewが利用可能であればbrew install node を実行しても入手可能
です。 Linuxでは、パッケージマネージャ経由でも入手可能ですが、ディストリビューションによって は古いバージョンがインストールされる場合があります。古いNode.jsでは動作しないコードを 多数含みますので、必ず最新版を利用してください。*1
FFMPEG
のインストール
Windows/macOS/Linux向けのバイナリが https://www.ffmpeg.org/ から入手できます。 バイナリをインストールした場合は、パスを通すようにしてください。macOSでは、Homebrewが利用可能であればbrew install ffmpegを実行しても入手可能
です。
Linuxでは、パッケージマネージャ経由でも入手可能です。
Node.jsで1から作る生放送サーバ
第
2
章
HTTP Live Streaming
の概要
HTTP Live Streaming(HLS)と呼ばれるHTTPベースのストリーミングプロトコルで、特 殊なストリーミングサーバを必要としないのが特徴です。いわゆる生放送のようなイベントスト リームの配信はもちろん、過去の生放送の録画*1等のVOD(Video on Demand)配信も可能です。 ユーザの回線速度に応じて品質の異なる動画を配信するアダプティブストリーミングにも対応し ています。 Appleによって開発され、2017年10月にRFC8216として仕様が公開されました。 本章では、HLSの概要を紹介していきますが、以下の資料も併せて参照することをおすすめし ます。 • HTTPライブストリーミングの概要(Apple -日本語) – https://developer.apple.com/jp/documentation/StreamingMediaGuide.pdf• RFC 8216 - HTTP Live Streaming (IETF -英語)
– https://tools.ietf.org/pdf/rfc8216.pdf
2.1
HLS
の再生環境
HLSはHTTPベースということもあってブラウザとの親和性が高く、一部のブラウザではデ フォルトでHLSの再生に対応しています。
2
Pwnable
超入門
kriw
著
PwnableとはCTF(Capture The Flag)という情報セキュリティに関する
競技の分野の一つです。Binary Exploitとか呼ばれていることもありま す。わかりやすくいうとハッキングですね。(違法行為はダメ)一般的な Pwnableの問題では小さなバイナリファイルが渡されその脆弱性をつい てプログラムの制御を奪うことを目的としておりコンピューターに関す る深い知識が要求されるためCTFの中でも特に敷居の高い分野ではない かと思います。今回はそんなPwnableの初歩を紹介したいと思います。
Pwnable超入門
第
1
章
環境
途中、Pythonのスクリプトが登場しますがすべてPython2.7で動かした結果です。また、今回
の説明の実行環境はubuntu16.04のdocker images上で行っていて、練習問題も同じubuntu16.04 で動作しています。以下のコマンドで今回説明するコマンドやプログラムのソースコードが入っ た環境が手に入ります。 docker run ※※※※※※※※※※※※※※※
1.1
練習問題の起動方法
練習問題はdocker上で動かすのでまずdockerをインストールしておいて下さい。インストー ルしたら以下のコマンドで問題のコンテナをダウンロード&実行できます。 docker run ※※※※※※※※※※※※※dockerのipアドレスを調べます。まず、docker psで起動中のdockerのコンテナIDを探しま
す。このコンテナしか動いていない場合は以下のコマンドでコンテナIDだけ取り出せます。 $ d o c k e r ps | t a i l -n1 | cut -d’ ’ -f1 3 5 7 9c a b 0 5 f 3 e docker inspectコンテナIDを実行してipアドレスを探します。 $ d o c k e r i n s p e c t 3 5 7 9c a b 0 5 f 3 e | g r e p \"I P A d d r e s s "I P A d d r e s s": " 1 7 2 . 1 7 . 0 . 2 " , "I P A d d r e s s": " 1 7 2 . 1 7 . 0 . 2 " , 試しにncコマンド等を使って問題に接続してみます。 $ nc 1 7 2 . 1 7 . 0 . 2 1 0 0 0 Do you w a n t to l o g i n? yes
You are not a d m i n.
Pwnable超入門
第
2
章
システムコールとシェルコード
CTFでも良くつかうシステムコール、シェルコードについて紹介します。
2.1
システムコール
システムコールは入出力のread, writeやexecve, forkといったカーネルに対して発行する命令 です。シェルを取るためには例えばexecve("/bin/sh")を実行する必要があります。 x86ではint 0x80命令によってシステムコールが発行され レジスタ 役割 eax システムコール番号 ebx 第一引数 ecx 第二引数 edx 第三引数 esi 第四引数 edi 第五引数 x86_64では レジスタ 役割 rax システムコール番号 rdi 第一引数 rsi 第二引数 rdx 第三引数 r10 第四引数 r8 第五引数 r9 第六引数 となっています。とりあえずCTFでは以下のシステムコールを使うことが多いので覚えておく と良いです。
3
言われてみれば当たり前な
タッチ入力の話
Namazu
著
こんにちは、Namazuです。皆さんスマホゲームは作っていますか? Unityなどを使えばほとんど作れるようになりましたよね。今回は、そ こで扱われるタッチ入力やそれを扱うUIについて詳しく考えていきた いと思います。 尚、ここで紹介するフレームワークのテンプレートはGitHubにて公開 しています。 • GitHub : https://※※※※※※※※※※※※ • README : https://※※※※※※※※※※※※※※※※※※※ C#、MonoGameを用いた開発をしておりますが、今回は設計の話が主 ですので環境が異なるという方も参考にしていただけるかと考えており ます。言われてみれば当たり前なタッチ入力の話
第
1
章
タッチ入力とボタン入力の違い
Android端末やiPhone、Windows Phoneなどはタッチで入力をします。一方、多くのゲーム
ハード(PS、Wii、Switch等)やPCではボタン(キーボード)で*1入力をしますね。 タッチ入力とボタン入力では入力の処理の仕方が異なります。
1.1
ボタン入力
ボタン入力では、「どのボタンが押されたか」によって入力を判別します。押されたボタン毎に 処理を書くだけで充分ですね。ただ、ボタン入力の種類にはただの押下だけでなくボタンを押し 続ける、複数のボタンの同時入力などがあります。これらについても処理を分ける必要がある場 合があります。1.2
タッチ入力
タッチ入力では、「どこが押されたか」によって入力を判別します。同じタップでもタッチされ た位置によって処理が全く異なります。さらに、こちらの入力はタップ以外にもロングタップ、ス ワイプ、フリック、ピンチイン/アウトなど種類が多岐に渡るためボタン入力よりも複雑だという ことができるでしょう。 *1便宜的にマウス入力はタッチ入力の一部だと考えます言われてみれば当たり前なタッチ入力の話
第
3
章
タッチ入力の区別
突然ですが、問題です。 ある距離の近い二点A,Bがあるとして、以下の方法で二点に交互に入力が来た場合それら を区別できるでしょうか? case1 : AB間を擦るようにスワイプしたcase2 : 点Aと点B を日本の指で交互にタッチしたただし、入力はあるフレームでは点A、次のフレームでは 点B、その次のフレームでは点A…のように無駄な入力はなく且つ途切れることなく行わ れたとする フレーム数 タッチされている点 1 A 2 B 3 A 4 B 5 A これは、一度に入力されるタッチ数が高々一つであるマウス入力では考える必要がなかったも のです。ゲームを作ったことのある方なら分かると思いますが、入力を連続的に取ることは出来 ません。(だからこそこの問題が成立します)ですから、一見これらを区別することは不可能なよ うに思えます。4
そばやのワク☆ワク
流体シミュレーション
MPS
編
そばや著
以前から興味のあった流体をちょいと本読んでやってみました。 できあがったものはこちら https://※※※※※※※※※※※ ソースはこちら https://※※※※※※※※※※※第
1
章
流体シミュレーションって?
流体シミュレーションとは、難しい方程式を解かないとわからないような流体の動きをプログ ラムで近似するものです。剛体シミュレーションで運動方程式 F = ma を用いるところを、流体シミュレーションではナビエ・ストークス方程式(以下NS方程式)という ものを使います。その昔、ナビエさんとストークスさんが発明したらしいです。wikipedia(https: //ja.wikipedia.org/wiki/ナビエ‒ストークス方程式 )曰く、その全貌は以下のようになって います。 Dv Dt =− 1 ρgrad(p) + µ ρ∆v + λ + µ ρ grad(Θ) + Θ ρgrad(λ + µ) +1 ρgrad(v· grad(µ)) + 1 ρrot(v× grad(µ)) − 1 ρv∆µ + g わわわからぁぁぁぁぁん!!!! 何言ってんだこいつは! ラグランジュ微分ってなんだ! ふざける な!! ということで限定条件下で式を簡略化します。今回使う条件は「粘性率が一定の非圧縮性 流れ」です。粘性率とは、まぁ粘り気です。非圧縮性とは、どんなに力を加えても流体の体積が一 定に保たれるというものです。(現実にはありえません)すると使う式は Dv Dt =− 1 ρgrad(p) + ν∆v + g となります。これならなんとか食らいつけそうです。1項ずつ見ていきましょう。 Dv Dt Dv Dt はラグランジュ微分なのですが、まぁとりあえず普通に時間微分だと思って良いでしょ う。vは速度なので、左辺はいわゆる加速度です。 −1 ρgrad(p)右辺第一項は圧力勾配項と呼ばれ、圧力の大きいところから小さいところにむけて 加速度を作り出す作用のある項です。ρは密度ですが、実質質量ですね。力を質量で割って加速度 を得るようなかんじです。第2章 流体シミュレーションの種類
第
2
章
流体シミュレーションの種類
流体シミュレーションの手法は大きく分けて2種類。 1つは格子法です。格子法とは、計算する空間を適当な数の格子で分割し、その小領域それぞれ に対し速度などのパラメータをあてていきます。つまり、「1つの格子が流体の1単位です!」と いう主張なわけですね。実際、NS方程式は速度場に対する加速度などを考えるものなので、これ は結構自然な発想だと思います。 もう1つは粒子法です。今回テーマにしたいのはこちらですね。粒子法は、流体を粒子の集合 として表現する方法です。粒子1つ1つに速度などが存在します。これもなんとなく納得できそ うなかんじです。どっちがいいの?
2種類あると比較したくなるのが人情ってもんです。 まず格子法ですが、こちらは数学的な「場」の概念に則った自然なモデルです。ですから、(こ ういうとおかしいかもしれませんが)物理法則が通用します。計算もとても安定しています。欠点 としては • 完全に流体の存在する領域を決定しないと使えない • まともな見た目のものを作ると、計算負荷が高い • 水面を作りづらい などが考えられます。 一方粒子法です。粒子法について詳細の説明はこれからとなりますが、私の感想としては「粒子 法は格子法に比べて、だいぶ無理がある」といったかんじです。若干こじつけじみたところがあ り、そのせいで数値的安定性を欠く傾向があります。もちろんそのぶん得られるメリットもあり ます。メリットとしては • 存在する場所を予め決めておかなくても良い • 計算負荷の調整がある程度容易 • 水面や飛沫が表現できる5
まだ間に合う!
Vue.js
とーふとふ著
初めまして、とーふとふといいます。今回は最近Webフレームワークと してかなりの勢いを持っているVue.jsについての記事を書きたいと思い ます。 この記事は今年の11月に私の所属サークルである東京工業大学デジタ ル創作同好会traPの活動の一つチズケもくもく会(チズケに集まってあ るテーマに沿ったことを黙々と作業する会)で行ったVue.js入門の資料 に加筆・修正を加えたものです。まだ間に合う! Vue.js
第
1
章
Vue.js
とは?
図1.1: Vue.jsのロゴ Vue (発音は/ v j u ː /、viewと同様)はユーザーインターフェイスを構築するための プログレッシブフレームワークです。他の一枚板(モノリシック: monolithic)なフレーム ワークとは異なり、Vueは初めから少しづつ適用していけるように設計されています。中 核となるライブラリはview 層だけに焦点を当てているため、Vue.jsを使い始めたり、他 のライブラリや既存のプロジェクトに統合したりすることはとても簡単です。一方、モダ ンなツールやサポートライブラリと併せて利用することで、洗練されたシングルページア プリケーションを開発することも可能です。第1章Vue.jsとは? つまり、導入は楽チンで取り入れやすく、その気になれば他のライブラリと連携させてイケイケ なアプリを作れるすげーやつということです。 よく言われる利点としては • 導入が楽である • 学習コストが低い • 公式ドキュメントが豊富 • 日本語情報が多い • 勢いがある(利用者の数も開発も) などです。 特に2017年はWebフレームワークの中ではVue.jsの年と言っても過言ではないくらいで、
Googleの検索トレンドではReact.jsを抜いたり、GitHubのスター数でも来年には抜かすのでは
ないかというほどになっています。