Monthly Archives: 9月 2016

2016-09-30

とにかくC++でDirectX12を動かしてみる

はじめましてJWordのS.Tです。普段はWindowsアプリ関連の開発を行っていますが、今回は業務内容とは全く関係ないDirectX12で遊んでみようと思います。
私はDirectX11以前の使用経験はありますが(ここにたどり着いたほとんどの方はそうだと思いますが)、12は勉強しながらブログを書いてますのでお手柔らかにお願いします(笑)
とにかくソースを貼り付けて動かすのが目的なので解説の内容は薄めです。

■環境

OS: Windows 10
IDE: Visual Studio 2015 Community
SDK: Windows 10 SDK

■初期設定

ファイルメニュー → 新規作成 → プロジェクトを選択すると下記のようなダイアログが表示されるので
テンプレート → Visual C++ → Windows → Win32を選択してWin32 プロジェクトを選択します。
名前はプロジェクト名になるので「DirectX12Test」とでもしておきましょう。1

ウィザードが表示されるので空のプロジェクトにチェックを入れます。
DirectX12の雛形を作成してくれるプロジェクトもあるようですが、今回は勉強のためにあえて空のプロジェクトを選択します。2

参照設定ですが、Windows 10 SDKにDirectXも含まれるのでそのインストール先を設定します。
プロジェクトメニュー → DirectX12Test のプロパティを選択すると下記ののようなダイアログが表示されるので
構成プロパティ → VC++ ディレクトリ → インクルード ディレクトリ → 右のプルダウンボタン → リストの<編集…>を選択します。5
「C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\um」のように最新のバージョンを指定します(2016/09/23現在の最新バージョンは10.0.14393)
同様にインクルード ディレクトリに「C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\shared」、
ライブラリ ディレクトリに「C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\um\x86」を追加します。6

■コーディング

プロジェクトが作成されるのでいよいよここからコーディングです。
左のソリューションエクスプローラーのソースファイルを右クリックし、表示されたメニューの追加 → 新しい項目を選択します。3

main.cppを追加します。

4

宣言部分です。C++であれば普通はクラス化すると思いますが、全体的な流れがわかりやすくなるようにmain.cppにまとめています。

メイン関数とウィンドウプロシージャを記述します。ウィンドウを作成しそのウィンドウハンドルを使ってDirectXを初期化、
その後ウィンドウを表示してお約束のメッセージループです。

DirectXの初期化です。デバッグ時はデバッグレイヤーを有効にし、有効なハードウェアアダプタを調べます。
D3D12CreateDeviceが失敗する場合はビデオカードがDirectX12に対応していないのでg_useWarpDeviceをtrueにしてみてください。
WARPデバイス(ソフトウェア)を使用するようになりますのでまず動くと思います。

初期化が長いので分割します。
コマンドキューを作成します。DirectX12ではコマンドリストというものがあってコマンドキューに渡して描画を実行するようです。
要はウィンドウメッセージのように溜め込んでおいて順番に実行するような感じです。
そして作成したウィンドウのハンドルを元にスワップチェインを作成します(DirectX11以前にもあったので解説は省略)

記述子ヒープを作成します。何やら難しげな用語が出てきましたがレンダーターゲットビューを作成するために必要なものらしいです。
レンダーターゲットビューをフレームバッファとバックバッファ用に2つ作成し、
コマンドアロケーターを作成します。これを作成しておかないとコマンドリストを実行できません。
また、ルートシグネチャというものがあり、定数バッファとシェーダーの関連付けを行うために必要ですが、今回は定数バッファは使用しないので空のルートシグネチャを作成します。

シェーダーのコンパイルですが後述のhlslファイルを読み込んでコンパイルします。(ここらへんも以前と一緒なので省略)
描画関連の設定をしてコマンドリストを作成します。

ようやく頂点バッファの作成です。Map/Unmapで頂点データをコピーするのは変わっていませんが、
GPUにアップロードされるまで待機する必要があるようです。
長々と書いてきましたがここまでがInit関数です。

描画ですが、コマンドアロケーターをリセット → コマンドリストをリセット → ルートシグネチャを設定後に描画処理を行う必要があるようです。
描画後にWaitForPreviousFrameでコマンドキューと同期する必要があります。

同期用の関数です。
MSによると下記は必要最低限の簡易実装であり、効率的にGPUを使用する方法は他のサンプルを見てくださいとのこと。

以上のプログラムをmain.cppに貼り付けてビルドしてください。
最後にmain.cppと同じフォルダに「sharders.hlsl」というファイル名で以下を保存してください。
頂点シェーダーとピクセルシェーダーですが特に何もしてません。ただ頂点カラーを出力しているだけです。

実行するとウィンドウが表示され中央に三角形が表示されているはずです。
長々と書いてきましたがこれで終了です。お疲れさまでした。
今回はほとんど初期化で終わってしまいましたが、次回?があればもう少し凝ったことをしてみたいと思います。

参考
https://msdn.microsoft.com/en-us/library/windows/desktop/dn859356(v=vs.85).aspx

2016-09-30

Macからembulkを使ってTreasure Dataへのデータ転送を楽々行う

初めまして、JWでWebエンジニアをしているJTです

今回はembulkを使って、MacからTreasure Dataへデータを転送してみます
embulkとはデータ転送ツールで、ドカッとデータを転送する事ができます
内部はJava、プラグイン周りはRubyで出来ています
ではやってみましょー

基本は以下のURLを参考に進めていきます
embulk#quick-start
*事前にJavaのインストールが必要です

インストールは2つの方法で行うことが出来ます

homebrewからインストールする方法
これだけでembulkが使えるようになります、簡単!

公式ページからjarファイルを取得しコマンドへ登録する方法
以下コマンドを叩き、embulkを利用出来るようにする

ターミナル閉じるたびにsourceしなきゃいけない><って方は.bash_profileに以下を追加したら幸せになります

では実際にembulkコマンドを叩いてみます

image02

これでインストールが完了しました

次にTreasure Dataへの転送をするために、embulk-output-tdというプラグインをインストールします
これを入れることで、Treasure Dataへの転送が可能となります
インストールは以下コマンドから行います
*gem と書かれてありますが、Rubyのインストールは別途必要ありません

これで全てインストールが完了しました!
次に転送に使用するファイルと、embulk転送設定ファイルの準備を行います
embulkの設定ファイルは、転送対象ファイルから推測してくれるguessコマンドから作成します

転送ファイル
例: sample_2016.csv

転送ファイルの準備ができました!
次にguessコマンドを実行するために、設定ファイルの雛形を作ります

例: guess.yml

ここのpath_prefix、apikey、database、tableを使用する環境やDBごとに書き換えます
path_prefixは、/user/td_export/data_ のように、prefixを入れるとprefixが入ったファイル名が全て転送対象となります

出来たらembulk guessしてみましょう!
-o オプションを使う事で、推測から作成された設定ファイルの書き出しが行えます
ここで書き出す設定ファイル名はload.ymlとします

image00
出来ました!

以下のpreviewオプションを利用する事で事前確認が出来ちゃったりします

image01
*もしpreviewで失敗した場合、設定ファイルのカラムの型をまず確認してみましょう
NULLや空白が許されるのはstring型だけらしく、long型でNULLデータが入ってくる場合などにコケます
(これ原因判明するまで時間を使ってしまいました。。)
previewで問題がなければ、では実際に転送してみましょう

以下コマンドで転送します

転送が終了したらTresure Data側で確認してみましょう

embulkを使うと、転送もバッチ化などが出来るのでオススメです

それではステキなembulkライフをー

2016-09-30

AmazonCloudFrontのInvaridation機能で20万円ぶっ飛ばした話

こんにちは!エンジニアのH.Yです。

皆様はAmazonCloudFront(以下 CF)をご存知でしょうか?
タイトルが不穏ですがこちらに触発されて私も書いてみようとなりました。
社内ブログで「会社に20万損させたよ」というエントリを書かせてもらえる弊社は寛大です。
ありがとうございます。そしてすいませんでした。ご迷惑おかけして申し訳ありません。

Invalidationって?


さて、CFを使用したことがある、という人でもInvalidation機能を使用したことがあるという人はあまり多くない印象があります。
ドキュメントはこちらです。
要は「指定されたパスの各CFエッジサーバに保存されているキャッシュを残りのキャッシュ時間に関係なく削除する機能」というものです。
詳しくはリンク先をご覧ください。

(今回損失を出す際に使用したのはAPIでしたが)Webコンソールを使用することでも本機能を使用することが出来ます。スクリーンショット_2016-09-26_午後7_27_40

 

AWSにログイン後、CFを選択します。スクリーンショット_2016-09-30_午後7_03_31

 

ディストリビューション一覧が表示されますので、キャッシュ削除したいオブジェクトがあるディストリビューションを選択し、「Distribution Settings」を押します。スクリーンショット_2016-09-30_午後7_03_40

 

詳細画面で「Invalidations」を選択し、「Criate Invaridation」を押します。

AWS4

削除したいパスを入力し、「Invalidate」を押せば直ちにオブジェクトのキャッシュ削除が開始されます。

どのようにして20万円損したのか


とあるサイトに動画を下図のような感じで配信する要件がありました。

system

①でFTP/PUTを受ける動画ファイルは不明なタイミングで内容が更新される可能性があります。
その際はCF上の動画キャッシュを更新する必要がある…と、言った状況でした。

と言ったこともあり、どうしようかと思っていたところInvalidationを発見し、料金・危険性等の確認を怠り使用したと言った流れです。

動画更新バッチは5分毎に叩かれ1回毎に約40個のパスをInvalidation処理し、約1ヶ月と少し放置した結果
60(分) * 24(時間) / 5(バッチ更新間隔) * 40(動画ファイル個数) * 35(日) = 約40万リクエスト
1リクエストによって$0.005ドルのコストですから約2000ドルかかってしまったというわけです

反省


結局ある程度古い動画が出ていても10分以内で更新されればいい、という判断が企画側で合ったため
対処方法に関してはCFのCache-Controlを10分程度に設定するだけで済みました…
仕様の確認不足というのもありましたが、それにしてもInvalidation処理の価格面に対する危険性をよく確認しなかったと言うのはエンジニアとして非常によろしくなかったと思っています。
まわりのエンジニアへの相談も不足していました

この機能のみならずですが、よくわからない機能を使用する前は自分での調査ももちろんですが慎重に検討・相談してから使用するよう心がけようと思います…

皆様は私のようなミスをしないよう気をつけてください
ではでは

Category: AWS

2016-09-28

作る人のための大交流会 GMO APG Engineer Night 2016レポート

2016年9月21日に半期に一度のGMOアドパートナーズグループエンジニア職のためのお祭り
GMO APG Engineer Nightが開催されました。
シルバーウィークまっただ中、インターネット広告業界の一大イベント、アドテック東京との日程重複
など様々な悪条件にも関わらず今回も60名近くの方々にご参加いただきました。

GMOグループではエンジニア職を「作る人」としてとても大切にする社風があります。
このイベントは業務の性質から普段はなかなか表彰の舞台から遠い、
そんな作る人達を表彰するための制度、テックイノベーション賞の受賞式を兼ねた
イベントとなっています。
とはいえ回を経るごとにお祭り色の色合いが強くなり豪華景品争奪バトルという側面も。

今回は初めての試みとして5名の立候補者によるLTバトルを行いました。
5分の登壇だけでも特典があるのに参加者の投票制で優勝者にはさらに豪華景品!
うーむうらやましい。
IMG_0071
IMG_0170

それぞれタイトルだけ紹介します。

・GMOアドマーケティング あだちんさんansibleを使ってDockerコンテナをプロビジョニングする
・CTO室 J.Nさん 「法規制後でも個人で楽しむドローン入門2016・秋」
・GMOアドマーケティング H.Yさん 「AWSCloudFrontで20万円ぶっ飛ばした話」
・GMOアドマーケティング T.Iくん「WebVRをはじめよう」
・GMO NIKKO N・Iさん 「DockerToolBox × Oracleは大変だった話」

登壇者の皆さんの雄姿を少しだけどうぞ。

lt01

lt2

lt3

優勝はGMOアドマーケティングのH.Yさんでした、おめでとうございます、決めの一枚とともに。
lt4

今回のテックイノベーション賞金賞は精力的に勉強会主催にブログ執筆と頑張ったあだちんさんでした、おめとうございます。
我らが堀内AP副社長からの表彰の様子をスピーチ姿とともに。
DSCF8514
DSCF08517

もちろん恒例となったじゃんけん大会もありましたよ。
最後はみんなで記念撮影。

DSCF8572

次回は2017年、どんな内容になるか今から楽しみです。

1

ちなみに司会はU25な若手二人組、LTにも手を挙げてくれたI.T君とA君が担当してくれました、お疲れ様でした。
IMG_0041

2016-09-27

Kotlinの学習に便利そうなツールを使ってみた

こんにちはNIKKOのM.Aです。

皆さん、Kotlinってご存知ですか?
Javaの代替言語(いわゆるAltJava)で5つの特徴(簡潔、安全、多彩、Javaとの相互利用、ツールの充実)があり、2016年2月にバージョン1.0がリリースされました。
新しい言語を覚えるのは大変、、、といった方に便利で効率的に学習できるツールの利用について簡単に紹介したいと思います。

1.Kotlin Koansとは

公式サイトTry Kotlinというリンクがあり、クリックすると、Kotlinのエディタがでてきます。
その中にKotlin Koansがあります。
Kotlin KoansはKotlinの構文を学ぶことができて、よりKotlinを身近なものにするために作られたものです。
Unit Testで解答した結果が正しいかを判定してくれるように作られており、解きながら学習できるチュートリアルが用意されています。
Kotlin Koansはオンラインからでも、オフライン(gitからソースを取得)からでも利用することができます。

BlogKotlin1

画面の中央左のメニューのような中に、Kotlin Koansの中にコーディングの問題があります。
Test.ktのassert処理が通るように、TODOに解答をうめていき、checkボタンを押すと、正解か判定してくれます。
Kotlin自体の敷居も低く、ローカルに開発環境を作らなくても、サイト上で、動作確認ができるので、初めての人でも、すぐに試すことができます。

2.Kotlin Koansで学べること

問題は42問で、Kotlinの全てを網羅しているわけではないです。
ですが、Kotlin初心者の私にでも、Kotlinの特徴が分かるような問題になっていると思います。
例えば、dataクラスにすると一行記述するだけでデータを保持するようなクラスが作成できたり、
operatorで演算子のオーバーロードができて処理を追加できる等、利用方法が色々あるなと。
Kotlinを用いれば簡潔に記述できるようになると感じました。

Kotlin Koansでは、以下のようなことを学ぶことができます。
【Introduction】

1.Kotlinの文法
2.JavaをKotlinに変換できる
3.Kotlinのライブラリ(joinToString)
4.overloadをデフォルトの引数で表現
5.ラムダ式の使い方
6.triple quoteでエスケープなしで改行や記号が使用できる
7.dataクラスgetterの使用例
8.nullを呼んでも大丈夫な例
9.smart castに関してwhenによる条件分岐とisでの使用例
10.int型にも関数が作成できる拡張関数
11.オブジェクト式を用いたクラスの使用方法
12.SAM(Single Abstract Method)変換でメソッドの引数に抽象メソッドを1つもつCollecions.sort
13.collectionsを用いた拡張関数

【Conventions】

14.dataクラスを比較できるようにcomparebleを使った実装
15.operatorによる演算子のオーバーロードでcontainsの例
16.operatorによる演算子のオーバーロードでrangeToの例
17.Iteratorのnextメソッドのオーバーロード使用例
18.operatorによる演算子のオーバーロードでplusとtimesの例
19.dataクラスによる分解宣言の使い方
20.operatorによる演算子のオーバーロードでinvokeはInvokableクラスで定義する

【Collections】

21.セットクラスへの変換
22.Filterとmapの使い方
23.all、any、count、findの使い方
24.faltMapの使い方
25.max、min、maxby、minbyの使い方
26.sortの使い方
27.sumの使い方
28.groupByの使い方
29.Partionの使い方
30.foldの使い方
31.応用、配達商品品の中で最も高い商品の抽出と、商品の中で注文されたもののカウント
32.応用、文字列コレクションで文字列の長さでグルーピングし、そのグループからグループの個数が最大のもので、最初のグループを取得

【Properties】

33.変数に値をセットする時に、呼び出されるセットメソッドの定義
34.変数の値をゲットする時に、呼び出されるゲットメソッドの定義
35.委譲プロパティ
36.委譲プロパティとなるオブジェクト

【Builders】

37.関数リテラルの使用例
38.関数リテラルを用いたmapのbuild
39.スコープ関数apply
40.html builderの使用例
41.html builderの問題

【Generics】

42.collectionとPairを用いたパーティション設定

2.まとめ

今回、Kotlinを学習してみて、導入の敷居も低く、Javaの経験がある人にとっておぼえておく価値のある言語だと思います。
わざわざKotlinを使用しなくても、Javaでできるというのも良いですが、より簡潔に記載できることで抽象化のレベルが上がり、設計をする時にも役立つと思います。
また、Kotlinを使い続けないにしても、どうすると簡潔にコーディングできるかという点で参考になりますし、後でJavaにも変換できると考えると、触っていて損はないです。
是非、この機会にKotlinを学習してみてはいかがでしょうか。

2016-09-23

ansibleを使ってDockerコンテナをプロビジョニングしたお話

GMOアドマーケティングのインフラ開発本部あだちんです。

久しぶりにDockerネタなのですが、
今までローカル開発環境はVagrantを使用していました。
Vagrantだとリソースも食うし、IPも管理しないといけないし、なによりも重いんですね。
なので全てDocker(Docker machine)で検証するようにしました。
そこで、インフラチームのリーダに構成管理ツールは「ansible」に統一しましょう!
となったのでansible playbookのテストとして、
Dockerのコンテナがansibleで自動で立ち上がって自動でパッケージ入れて
そんなこと出来ないかなと考えていたわけです。

今回はその方法をブログしましょう。docker-friends


■Docker connection pluginについて

その前にDocker connection pluginについて説明しましょう。
これはDocker remote APIを利用したコンテナのプロビジョニングが可能となり、
ansible実行環境からDockerホストへのremoteAPIを実行できる環境であれば、
Dockerコンテナでsshdを起動する必要はなくなりました。
以前までは結構めんどくさくなっていたようです。


■イメージ

スクリーンショット 2016-09-25 23.47.10


■環境


■Macにansibleをインストール


■Dockerホスト開発設定


■ansibleイベントファイル作成


■DockerホストにPython系をインストール

・接続確認

これで準備OKです。


■ansible playbookの作成

テストとしてCentOS7のイメージを使ってコンテナが自動で立ち上がり、勝手にユーザ作成できるかやってみました。

・実行


■先ほどの立ち上がったコンテナにログイン


■まとめ

これでDockerでも問題なくansibleの検証ができました。
Dockerfileでも構成管理できますが、またDockerfile用に作るのもめんどくさいし、
工数もかかるので構成管理ansibleを使っているならこちらでいいかと思います。
Chefとかどうなんだろ….
Dockerだと入ってないパッケージがあったり(sudoなど)するのでいろいろansibleもメンテしなくては….

ちなみに先日行われたGMO APエンジニアナイト(交流会)でも同じ内容をLTやりました。
プレゼンも以下で見れますので、イベントレポートは後日のお楽しみに!

2016-09-13

Let’s Encryptを利用して、無料でHTTPSサーバを構築

こんにちは、JWordのゲーム開発エンジニア カネテックです。

みなさんWebの情報はSSLで公開していますか?「会社は大丈夫だけど、趣味で持っているサーバはSSLに対応させてないなぁ、高いし」なんて方はいませんか?(ぼくのことです)
今回は、無料で簡単にHTTPS対応できるLet’s Encryptをご紹介いたします。


概要

  • 前提
  • Certbotを導入
  • SSLの設定
  • 自動更新の設定
  • 二つ目以降のドメインの設定

前提

  • OS: Ubuntu 14.04
  • HTTPデーモン: Apache(apt-getでインストールしたもの)
  • Ubuntu、Apacheはインストールおよび設定済み
  • Apacheは立ち上がった状態
  • kanetech.ddns.netでhttpアクセスが行える状態
  • IPv4 グローバルアドレスを持ち、ufwコマンドでTCP 80/443ポートは解放済み

Certbotを導入

Let’s Encryptでは、Certbotというツールを使った導入、更新を推奨しています(他にも対応ツールはいっぱいあります!)ので
今回はCertbotを使って進めていきます。

まず、公式サイトを開きます。
https://certbot.eff.org/

スクリーンショット 2016-09-10 11.32.04

デーモンの種類とディストリビューションを選択すると導入ガイドが表示されるので、それに従って導入します。
今回はUbuntu14.04上のApacheを選択しました。

なお、処理の途中でroot権限が必要になります。都度パスワードを入力しても良いのですが、最終的に証明書を自動更新する場合は
rootでの更新処理を設定することになりますので、導入からroot環境で実施すると良いでしょう。

SSLの設定

certbot-autoコマンドを使って、対話的に設定していきます。

設定したいドメイン名、メールアドレスを記入してライセンスを確認し、同意の場合は次の画面に進みます。

スクリーンショット 2016-09-10 10.59.36

スクリーンショット 2016-09-10 11.00.08

スクリーンショット 2016-09-10 11.00.20

HTTPをどうするか設定します。

スクリーンショット 2016-09-10 11.00.38

Easy: HTTPとHTTPS両方で動作
Secure: HTTPアクセスはHTTPSへリダイレクト

今回はHTTPも残したかったのでEasyを選択しました。

お疲れ様でした。これでSSLでのアクセスが可能です。
最後に、以下のURLで検証するよう勧められるので見てみます。

https://www.ssllabs.com/ssltest/analyze.html?d=kanetech.ddns.net

スクリーンショット 2016-09-10 11.19.37

詳しくない方は、ここで上部に表示されるサマリーがAになっていれば良いと思います。
詳しい方は、下に詳細が記載されています。環境ごとのSNI対応状況などもわかるので、
目を通しておくと良いでしょう。
Let’s Encryptの特徴として有効期限が大変に短く、90日しかありません。
ここで確認する証明書も期限が90日であることがわかると思います。
Let’s Encryptは自動更新が前提ですので、次の章で自動更新の方法について説明します。

自動更新の設定

まずは、証明書を手動で更新してみます。

certbotには更新が正常に走るかテストするドライラン機能があります。まずはこれを使って問題ないか確認しておきましょう。

本当に更新する場合は、–dry-runオプションなしで実行します。

期限が30日を切ったもののみが更新されます。毎日実行するとよいでしょう。

また、Apacheの場合は証明書が変更された際に設定の再読み込みが必要になります。

とすることで、自動的に更新が反映されます。サーバの運用ポリシーを確認した上で設定してください。

これをcrontabに

といった形で記載しておくとよいでしょう(設定は一例です。運用ポリシーにしたがって設定してください)。

二つ目以降のドメインの設定

複数のドメインをホストしている場合、この後二つ目以降のドメインを追加設定していきます。追加時は、最初の設定コマンドの後ろに-d [ドメイン名]と指定します。

更新についてはrenewコマンドで全ての証明書を管理してくれますので、そのままで大丈夫です。

以上です。

いかがでしたでしょうか。
ウィザード実行後、すぐさまHTTPSが機能するというのは感動的ですよね。
一方で、更新処理が正しく動かなくなると、90日以内にサービス障害が発生しますので
サーバの役割に合わせて障害対策を考えてみると良いと思います。