OmniAICreator/Qiita-1.07M huggingface dataset:
Golang + Revel をWindows10にインストールする

Djangoをやっていましたが、Golangにも挑戦したいと思います。

##なぜ「Golang」

Django、Laravelなどは情報が豊富で学習コストが低くて初心者から始めるのにちょうどよいWEBフレームワークなのですが、処理速度を求められるようなシステムではやはりコンパイル言語には及ばないようです。そういった意味ではJavaが一番よいのですが、OracleJDKの有償化などの影響がどのようになっていくのか気にかかるところです。このような状況の中、GolangはPythonやphpなどより処理速度が速いという記事が多いのでこちらも少し学習しておきます。


##環境

| カテゴリ       | 値 |
|:-----------------|:-----------------|
| os             | Windows 10 home 64bit |


##Golangをインストール

###(1) Chocolateyをインストールする。

[Install with cmd.exe](https://chocolatey.org/docs/installation#install-with-cmdexe)

コマンドプロンプトを管理者権限で開いて以下のコマンドを実行する

```:管理者権限でcmd.prompt
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

###(2) Golangをインストールする

```:管理者権限でcmd.prompt
choco install golang
```

インストールすると、GOPATHにインストールされる。
- GOPATH ・・・ %USERPROFILE%\go

goコマンドを有効にするために環境変数「Path」に以下のpathを追加する。

```:..pathに追加
%GOPATH%\bin
```

```console:cmd.prompt
C:>cd %GOPATH%\src 
C:\[USERPROFILE]\go\src>go version
go version go1.11.2 windows/amd64
```

## Revelを追加

golangのframeworkは、Revelを使います。Beegoというframeworkもよさそうですが、Revelのほうが記事もたくさんあるのでしばらくこちらを使います。

インストール自体は簡単です。以下の２つのコマンドを実行するだけで完了します。

```console:cmd.prompt
C:\[USERPROFILE]\go\src>go get github.com/revel/revel

C:\[USERPROFILE]\go\src>go get github.com/revel/cmd/revel
```
## Hello Worldしてみる

Hello Worldを作成します。

###(1)パッケージフォルダを作成します

パッケージフォルダは、「src\github.com」の下に作成します。「myproject」とします。

```console
C:\[USERPROFILE]\go\src\github.com>mkdir myproject
```

###(2)プロジェクトを作成します

以下のように、「myproject」フォルダの下に作成するようにします。

- 作成

```console:cmd.prompt
C:\[USERPROFILE]\go\src\>revel new github.com\myproject\helloworld
```

- ファイル構成

```helloworld
│  .gitignore
│  a.txt
│  README.md
├─app
│  │  init.go
│  ├─controllers
│  │      app.go
│  └─views
│      │  debug.html
│      │  flash.html
│      │  footer.html
│      │  header.html
│      ├─App
│      │      Index.html
│      └─errors
│              404.html
│              500.html
├─conf
│      app.conf
│      routes
├─messages
│      sample.en
├─public
│  ├─css
│  │      bootstrap-3.3.6.min.css
│  ├─fonts
│  │      glyphicons-halflings-regular.ttf
│  │      glyphicons-halflings-regular.woff
│  │      glyphicons-halflings-regular.woff2
│  ├─img
│  │      favicon.png
│  └─js
│          bootstrap-3.3.6.min.js
│          jquery-2.2.4.min.js
└─tests
        apptest.go
```

###(3) 確認

- サーバを起動します。

```console:cmd.prompt
C:\[USERPROFILE]\go\src\>revel run github.com/myproject/helloworld
```
コマンドを実行するフォルダは、%GOPATH%/srcで実行します。

- URLにアクセスします。

http://localhost:9000/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/62fcf565-cc25-cf98-7756-a3b1d7b61e96.png)

プロジェクトを作成するだけでとりあえず動きます。
BitVisorのmemcmp/strcmp/strncmp実装

BitVisorのmemcmp/strcmp/strncmp実装を軽く紹介します。

# string.h

https://bitbucket.org/bitvisor/bitvisor/src/f8d6f8f0751cd759f3c2f1b6f4c75b9180444c50/include/core/string.h?at=default&fileviewer=file-view-default

このようにmemcmp_builtin, strcmp_builtin, strncmp_builtinを使うマクロが宣言されています。しかし、これを使っていてもmemcmp/strcmp/strncmp関数が呼び出されることがあります。

# string.s

https://bitbucket.org/bitvisor/bitvisor/src/f8d6f8f0751cd759f3c2f1b6f4c75b9180444c50/core/string.s?at=default&fileviewer=file-view-default

ここにmemcmp/strcmp/strncmp関数の実装があります。前半が32ビット、後半が64ビットの実装です。簡単な64ビットのほうを見てみます。

## memcmp

```
	mov	%rdx,%rcx
	xor	%eax,%eax
	cld
	repe	cmpsb
	je	1f
	sbb	%eax,%eax
	xor	$-2,%eax
1:
	ret
```

これだけです。x86には便利な命令があって、memcmpそのものの機能があり、ループを書く必要がないのでそれを使います。ただし、返り値は計算してくれませんので、なんとかします。

通常は引き算結果をそのまま返すのが簡単なやり方ですが、比較命令を使用した場合は引き算結果の値は捨てられます。残るのは引き算の際に設定されるフラグレジスターの内容だけです。そのためフラグレジスターを元に返り値を生成しています。

最初に"xor %eax,%eax"で、一致した時の返り値を準備しています。比較後のjeで、一致した時はret命令にジャンプしています。"sbb %eax,%eax"はキャリーフラグを含めた引き算命令で、同じレジスター同士を引くので、結果はキャリーフラグが0の場合は0、1の場合は-1になります。そして次の"xor $-2,%eax"で、0を-2に、-1を1に変化させて返り値とします。

| キャリーフラグ | sbbの結果(A)  | (A)の16進数 | -2の16進数 | xor $-2,%eaxの結果(B)の16進数 | (B)の結果 |
|:--:|:-------------:|:-----------:|:---:|:-----------------------:|:------------------:|
| 0 | 0          |  00000000 | FFFFFFFE | FFFFFFFE  | -2 |
| 1 | -1       |   FFFFFFFF | FFFFFFFE | 00000001 | 1 |

## strcmp

```
strcmp64:
	xor	%eax,%eax
	cld
1:
	lodsb
	scasb
	jne	1f
	test	%al,%al
	jne	1b
	ret
1:
	sbb	%eax,%eax
	xor	$-2,%eax
	ret
```

strcmpは終端文字'\0'を見つけたらその時点でループを終了する処理が必要で、memcmpとは異なりループを実装する必要がありますが、結果の処理はmemcmpと同様です。返り値に使われる%eaxレジスターの下位8ビットを壊しながらループしますが、結果が等しい場合はどちらも終端文字'\0'で終わっているので、その値0x00がそのまま返り値の下位8ビットになります。

## strncmp

```
strncmp64:
	xor	%eax,%eax
	cld
1:
	test	%edx,%edx
	je	2f
	dec	%edx
	lodsb
	scasb
	jne	1f
	test	%al,%al
	jne	1b
	ret
1:
	sbb	%eax,%eax
	xor	$-2,%eax
	ret
2:
	xor	%eax,%eax
	ret
```

strncmp関数は今年lwIPのアップデートのために追加されたものです。
https://bitbucket.org/bitvisor/bitvisor/commits/3f2b225ec9be828a453f3e45a9c2a4a865ea326d

strcmpと同様の処理に、残りバイト数をチェックしてデクリメントする処理が追加されています。また、残りバイト数が0になったためにループを抜ける際は、返り値を0にしてからリターンするようになっています。

# 以前の実装

返り値の計算部分は以前は違う方法を用いていました。

https://bitbucket.org/bitvisor/bitvisor/commits/3f2b225ec9be828a453f3e45a9c2a4a865ea326d

```diff
-	setnc	%al
-	setc	%ah
-	ror	%eax
+	sbb	%eax,%eax
+	xor	$-2,%eax
```

このように、setnc, setc, rorの3つの命令を使用していました。

| キャリーフラグ | setncの結果 | setcの結果 | setnc, setc後の%eax(16進数) | rorの結果(16進数) | rorの結果 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 0 | 1 | 0 | 00000001 | 80000000 | -2147483648 |
| 1 | 0 | 1 | 00000100 | 00000080 | 128 |

これもちゃんと動いてはいましたが、見るからにわかりにくいので書き直したというわけです。
YYPHP 参加者一覧サイト作ってみた

2018年 [YYPHPアドベントカレンダー](https://qiita.com/advent-calendar/2018/yyphp) 17日目です。

題材として@nouphetさんが公開されていた[Connpassから参加者リストを一撃で取得するスクリプト](https://github.com/nouphet/get-connpass-member-list)のWEB版を作ってみようと思います！

# 目的
- 普段お世話になってるYYPHPに少しでも貢献したかった
- いつもは自作インフラにアプリを載せてしまっているので、流行りのPaasにデプロイしてみたかった

# 機能要件
- トップ画面には開催予定のイベント一覧を表示する
- 開催予定のイベントをクリックすると、参加者一覧が表示される
- 参加者一覧ページでコピーボタンを押すと、HackMD用のテキストが取得できる

# フロントエンドの構成
インフラ：Firebase Hosting
フレームワーク：Nuxt.js

# バックエンドの構成
インフラ：Heroku
フレームワーク：Laravel

# 作ったもの
https://yyphp-member-list.firebaseapp.com/
（30分無アクセスだとHerokuのDynoさんが居眠りするので、初回アクセスが重いことがあります）

ソースはこちら↓↓↓
[フロントエンド](https://github.com/yamatox/yyphp-connpass-member-list)
[バックエンド](https://github.com/yamatox/yyphp-connpass-member-list-api)

# 苦労したところ

## [Heroku] WEBからアクセスしたときと「heroku run ~」で動く環境は別物だった

イベント情報を1時間おきに実行するバッチで取得し、キャッシュしています。
このキャッシュ、最初は「ローカルファイルキャッシュ」でやろうとしていたのですが罠がありました。

WEBアプリが動く環境（Dyno）と「heroku run」や「Heroku scheduler」が動く環境は別物だったのです。。。
([「heroku run」や「Heroku scheduler」が動く環境は「One-off Dyno」という一時的な環境](https://devcenter.heroku.com/articles/one-off-dynos#an-example-one-off-dyno))

そのため、いくら「heruku run ~」や「Heroku scheduler」でバッチを動かしてキャッシュしても、
キャッシュはそれぞれのDynoにしか存在せず、WEBアプリ側からは見ることができなかったのです。

![Untitled Diagram (1).png](https://qiita-image-store.s3.amazonaws.com/0/108431/3a5082b5-f9c7-980f-495f-7d526edd0fc4.png)

ローカルファイルキャッシュではだめだ、ということになったのでHeroku Redisを導入してしのぎました。
（ちなみに、Heroku RedisはAWS使っているみたいです）

※もちろん、WEBアプリDyno内でキャッシュする処理であればローカルファイルキャッシュでも問題ありません。
ただ、その場合スケールアウトしたときにそれぞれのDynoにファイルキャッシュされてしまうので、
結局Redisなどでキャッシュするのが正解かもしれません。

## [Heroku] laravel.logが出力されない！

未完成状態でデプロイしたときに、なんらかのエラーが起きたのですが「laravel.log」が出力されておらず、見ることができませんでした。
これはログ出力されていないのではなく、見に行こうと「heroku run bash」したときにつながるのは前述の「One-off Dyno」であるためです。

どうすればよいかはHerokuのドキュメントに載っていました。
https://devcenter.heroku.com/articles/getting-started-with-laravel#best-practices

```php:config/logging.php
<?php
return [
    'default' => env('LOG_CHANNEL', 'stack'),
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
        ],
        'single' => [
            'driver' => 'errorlog', #ここがポイント
            'level' => 'debug',
        ],
```

Laravel.logをファイルではなく、「errorlog」に出力するように変更すればよいのです。
そうすると、以下のようにHerokuの管理画面からログを確認することができるようになります。
（以下のログは、保存されたデータの確認用に埋め込んだもの）
<img width="1095" alt="スクリーンショット 2018-12-16 22.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/108431/98a179e5-8142-6192-5db6-8708e8c8f9a3.png">

# 作ってみた感想
いつも自作インフラにばかりデプロイだったので、PaaS特有の問題に引っかかってしまった。

思った以上に時間を割けず、完成度がちょっと微妙な状態に……
（テストコードすらかけていない有様）
今後、勉強も兼ねてちまちまリファクタリングしていく予定

Firebaseでこまったポイントなかったな。。。Firebaseのシンプルさすごい。

# 最後に
YYPHPを開催してくださり、さらにリモートでも参加できるようにしてくださってる株式会社クラフトマンソフトウェアの皆様。
本当にありがとうございます！ これからもよろしくお願いいたします！
sedコマンドチートシート

# N行目だけ表示する

```sh:1行目だけ表示する
sed -n 1p < data/ladies_tokyo.csv
```

# N行目だけ削除する

- `d`コマンドを使う

```sh:1行目だけ削除する
sed '1d'
```

# 2行ずつ読み込んで1行で表示する

- `N`コマンド（入力の次の行をパターンスペースに読み込む）を使う
- 「現在の行」と「次の行」をパターンスペースに読み込んでいる状態で、パターンスペースに対して改行を改行以外の文字に置換すると、2行が1行になる

```shell-session
$ printf 'aaa\nbbb\nccc\nddd\n' | sed 'N; s/\n/ /g'
aaa bbb
ccc ddd
```

from: http://blog.livedoor.jp/morituri/archives/52036613.html


# `yyyymmddHHMMSS`を`yyyy-mm-dd HH:MM:SS`に変換する

`utconv`というコマンドの出力がこれなので人間に見やすい形式に変換したい。

```sh
$ utconv -r 1574650550 | sed 's/^\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)$/\1-\2-\3 \4:\5:\6/'
2019-11-25 11:55:50
```

# 改行で置換する

`<RS>` `<US>` などの不可視文字で置換してから`tr`で改行文字（`LF`）と入れ替える。

```shell-session
$ RS="$(printf '\036')"; (tr -d '\n' | tr -s ' ' | sed 's/\. /\.'${RS}'/g' | tr ${RS} '\n') <<'EOF'
Include the specified configuration file(s).  Multiple pathnames
             may be specified and each pathname may contain glob(7) wildcards
             and, for user configurations, shell-like `~' references to user
             home directories.  Files without absolute paths are assumed to be
             in ~/.ssh if included in a user configuration file or /etc/ssh if
             included from the system configuration file.  Include directive
             may appear inside a Match or Host block to perform conditional
             inclusion.
EOF
Include the specified configuration file(s).
Multiple pathnames may be specified and each pathname may contain glob(7) wildcards and, for user configurations, shell-like `~' references to user home directories.
Files without absolute paths are assumed to be in ~/.ssh if included in a user configuration file or /etc/ssh if included from the system configuration file.
Include directive may appear inside a Match or Host block to perform conditional inclusion.
```
仕事をしながらDBスペシャリストを取った方法

受験・合格したのは去年ですが、ずっとどこかに書きたかった
DBスペの合格体験をまとめようかと思います

#自分について
DBについては、業務でサーバから構築したり、レプリケーション、ミドルウェアチューニング
SQLチューニング、論理設計を一通りやっていました。

#勉強期間/計画
試験を受けようと決めたのは2017年1月末で
試験まで約2ヶ月半。

応用情報処理資格か、他の高度資格があれば、午前Ⅰは免除なんですけど
自分は学生のころに取った基本情報処理しかなく、勉強範囲は午前Ⅰ～午後Ⅱ。

##■試験2ヶ月半～2ヶ月前
試験について調べると、DBスペは午後Ⅰが一番の関門ということでしたが
いきなり問題を見ても解けるわけがなかったので

まずはインプット系の勉強から始めようと計画しました。
その中でもDBに関わるところがメインとなる午前Ⅱを最初の半月で、
余力があったら午後Ⅰ試験対策を少し始めるくらいになればいいや
と思って勉強してました。


###（この頃の日々の過ごし方）
とりあえず、平日は毎日1時間、ポケットスタディを読み知識をつけ
ある程度進んだら、アプリやWEBサイトで過去問演習をやる。
そして、この頃の土日休日は、ちゃんと休んで、勉強は一切しませんでした。

これを3週間続けると、午前Ⅱはどんな過去問を解いても
安定して9割以上得点できるようになりました。



##■試験2ヶ月前～試験1ヶ月半前
午前Ⅱの勉強が仕上がった頃から、難関の午後Ⅰ用対策を始めました。
DBスペは記述問題に対する解答方法がある程度
フォーマット化されているので、まずはそれを覚えて、
過去問で実践していこうとしました。

あと、並行して午前Ⅰ用のインプット系の勉強もはじめました。


###（この頃の日々の過ごし方）
平日：毎日1時間、午前対策用インプット系の勉強と
1日おきくらいで、1時間～2時間、過去問を使った実践系の勉強をしていました。

これを2週間繰り返すと、午後Ⅰ問題の特性である
解答時間が少ない、ということが実感できるようになりました。


##■試験1ヶ月半前～試験1ヶ月前
午後Ⅰの過去問をひたすらに解きまくる期間でした。

また、この頃から午後Ⅱの解き方がまとまっている
参考書を読み始めました。


###（この頃の日々の過ごし方）
午後Ⅰ対策を進める中
午前Ⅰの過去問演習も少しやっていました。
（この頃、ちょうど業務が落ち着いたタイミングで
毎日2時間は勉強していました。）



##■試験1ヶ月前～試験2週間前
このあたりで嬉しい誤算がありました。

何かというと、午後Ⅰ対策がほぼ出来上がった頃
同時に午後Ⅱの解き方をインプットする勉強が終わり

いよいよ午後Ⅱの過去問をやり始めたのですが

午後Ⅰの圧倒的な解答時間不足と、多種多様な設問テーマに
慣れていたせいか、一発目の過去問演習でいきなり

95点近く取れて拍子抜けしたのを今でも覚えていますw

設問の文章がやたら長ったらしい事以外
午後Ⅰと大して差はなく、むしろ午後Ⅰよりも時間に余裕があるので
午後Ⅱのほうが簡単に感じることにができました。

ということで、午後Ⅱの演習はほどほどにして
結局午後Ⅰ用の対策をしまくる期間に充てました。


###（この頃の日々の過ごし方）
午後Ⅱの過去問演習は、解答時間が長い関係で
まとまった時間が取れる休日にやっていました。

平日は依然として変わらず、午後Ⅰ対策をしつつ
午前の過去問演習を息抜きでやるペースで
毎日２時間くらい勉強していました。


##■試験2週間前～試験前日
完全なるスランプ期間でした。

これまでの勉強で、午後Ⅰもそこそこ時間内に解けるようになり
午後Ⅱ対策にも余裕が出始めたため
ある日、「もう勉強しなくてもいいんじゃね？」と思い
突然やる気を失って、試験勉強に飽きてしまいましたw
（嘘のようなホントのことです）


###（この頃の日々の過ごし方）
担当業務がリリース間近、かつやる気喪失で
平日も休日も勉強時間はゼロでした。（今でもよく受かったな、と思いますw）

#試験結果
午前Ⅰ：85点
午前Ⅱ：68点
午後Ⅰ：71点
午後Ⅱ：72点

合格でした。

#最後に（試験感想）
仕事をしながらでも、毎日1～3時間、スキマ時間を見つけて
勉強時間を捻出すれば、2ヶ月半の勉強期間で合格できました。
（最後の2週間はノー勉強でしたが^^;

※なお、具体的な勉強方法について書こうとしていましたが
日にちが経っていることと、参考書に全部書いてあったという理由で、割愛しました。
結果、勉強開始～試験までの勉強スケジュールメインになってしまいましたが
来年4月の受験を考えている方の、何かの参考になれば幸いです。
DarkflowのGPUメモリ使用量を抑える

この記事は[N高等学校 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/n-highschool)の21日目の記事です

---

こんにちは、N高等学校2年の上原(uehr)です。
在学しながらプログラマを目指して活動しています。

今回の記事では、物体検知ツールの一つである**Darkflow(TensorFlow版YOLO)**のGPUメモリ使用量を抑える方法について書きます。
~~SageMakerについて書く予定でしたが、公開日まであまり時間が無いので短めの記事にしました...~~

---

# 概要
Darkflowを使う場合、内部で動いているTensorFlowの仕様上、デフォルトではGPUメモリを全て確保してしまいます。

そのままだと複数個のプロセスを動かすことが難しくなってしまうので、今回は、**必要な分のGPUメモリを随時確保**していく設定を有効にする方法について書いていきます。

# 手順
## 1. Darkflowのソースコードを修正

`darkflow/darkflow/net/build.py` の133〜134行目を修正します。

### 修正前
```python
cfg['gpu_options'] = tf.GPUOptions(
    per_process_gpu_memory_fraction = utility)
```

### 修正後
```python
cfg['gpu_options'] = tf.GPUOptions(
    per_process_gpu_memory_fraction = utility, allow_growth = True)
```
**allow_growth**オプションを追加しました。

## 2. 設定を適用
設定を適用するためにpipを使ってDarkflowをアップデートします。

```shell
$ sudo pip install ./darkflow --upgrade
```
アップデートが完了すると、設定が有効になっています。

## 3. 動作確認
Darkflowを実行しながら、 `nvidia-smi` コマンドでGPU使用率の違いを確認しましょう。


# 終わりに
私の観測範囲では、この手順についての日本語の記事が見つからなかったので、備忘録も兼ねて書きました。少しでもお役に立てれば幸いです。

N高等学校では、競技プログラミング大会への参加や、一ヶ月間のドワンゴ社インターン、プログラミングコミュニティ内での情報交換など、色々貴重な体験をさせて頂いて、プログラマとしてのスキルアップに繋がりました。

特にお世話になったプログラミング講師のsifue先生には、この場で改めて感謝を述べたいと思います。

自分の得意分野をとことん伸ばしたい方にはこの学校はベストな選択肢だと思います、ぜひ入学を考えてみては如何でしょうか。
AWSでIAMユーザーを作成した

#概要
AWSでIAMユーザーを作成した際のメモです。

##IAMユーザーとは
AWSにアクセスする権限を人やサーバに付与するためのもの。

##IAMユーザー使う理由
AWSのアカウント作成時に発行されるユーザーはroot権限のユーザーなのでなんでもできる。
全てのリソースにアクセスできるユーザーはリスクが高いので、権限を限定されたIAMユーザーを使用する。

##IAMユーザーの作成方法
**1. AWSマネージメントコンソールのページ上部に「サービス」をクリック**
<img width="553" alt="スクリーンショット 2018-12-16 17.02.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/7d841f8f-7e2d-2060-227d-0169ac901a3d.png">


**2. セキュリティの「IAM」をクリック**
<img width="252" alt="スクリーンショット 2018-12-16 17.00.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/06ff8b1a-dd75-69cc-7860-89ed2b94e494.png">


**3. ダッシュボードの「ユーザー」をクリック**
<img width="169" alt="スクリーンショット 2018-12-16 17.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/235b179a-f9db-7de5-1e8e-9824fafe9bf0.png">


**4. 「ユーザーを追加」をクリック**
<img width="1157" alt="スクリーンショット 2018-12-16 17.12.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/b3c62965-1387-bbd6-ace0-f5fab8cecfa6.png">


**5. 各項目を入力し、「次のステップ」をクリック**
<img width="1072" alt="スクリーンショット 2018-12-16 17.15.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/a75155f8-98a1-4707-f74d-aec2c2a67c8f.png">
・プログラムによるアクセス
　┗「アクセスキーID」「シークレットアクセスキー」を発行する場合はチェックを付ける。
・AWSマネージメントコンソールへのアクセス
　┗マネージメントコンソールにアクセスする場合はチェックを付ける。


**6. ユーザーを追加するグループを選択**
 グループを作成していない場合は作成する。
<img width="995" alt="スクリーンショット 2018-12-16 17.33.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/27c9c4f0-bf25-c410-f2e0-8921ca49ba68.png">

管理者権限のグループを作成する場合は「AdminstragorAccess」を選択
<img width="1175" alt="スクリーンショット 2018-12-16 17.40.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/6df8f1cd-4ebe-bb65-5e65-edb482f12dad.png">


**7. タグをつける場合は設定して「次のステップへ」をクリック**
<img width="996" alt="スクリーンショット 2018-12-16 17.45.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/78f71835-e0e3-0267-a64e-72dfa42aa079.png">

**8. 確認画面で設定した値に問題がなければ「ユーザーの作成」をクリック**
**9. 認証情報が表示される。**
<img width="1011" alt="スクリーンショット 2018-12-16 17.48.06のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/5db59945-0bc0-df0c-e9aa-8c9bac6cfe52.png">


<font color="Red">※認証情報はこのタイミングでしか確認できないため必ずどこかに情報を残しておく
</font>
**10. ログイン用のURLはダッシュボードで確認できる**
<img width="984" alt="スクリーンショット 2018-12-16 23.42.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/267707/c7ed56ca-b2fa-23bc-add6-38859b359ced.png">
Rustのconst fnでabs

[以前の記事](https://qiita.com/block/items/38f9d41aa9b655fdc093)でRustの`const fn`の制限が厳しいという話を書いた。
正直使い所がわからないが悔しかったのでいろいろ試していたら、条件によって返す値を変えることくらいはできた。

Rust 1.31.0で確認しています。

---
追記: 2019/11/06
Rust 1.39.0で標準の`abs`が`const fn`になりました。
https://qiita.com/block/items/646c725289a8431383f9

---
追記: 2020/08/29
Rust 1.46.0で`if`などが使用できるようになり`abs`は通常の関数と同じように書けるようになったため、おまけ3として追加しました。
緩和された内容は[Rustのconst fnの制限がさらに緩和された(Rust 1.46.0)](https://qiita.com/block/items/de9ecbb4d102eaa35ac8)に書きました。

# absの実装
```rust
const fn abs(v: i32) -> i32 {
    [-v, v][(v >= 0) as usize]
}
```

## 解説
`[-v, v]`
符号を反転した値ともとの値の配列を作る。

`[(v >= 0) as usize]`
`v`が0以上かどうかで配列のインデックスを変更する。
`(v >= 0)`の結果が`bool`なので`usize`にキャストすると`true`なら`1`を、`false`なら`0`を返す。
つまり`true`であれば`[-v, v][1]`となり`v`を返し、`false`であれば`[-v, v][0]`となり`-v`を返す。


## 何故こんな実装にしなければならないのか
絶対値を返すだけで何故こんなにも分かりづらい形にしなければならないのか。
まず`const fn`では`if`が使えない。
そのため下記はコンパイルエラーになる

```rust
const fn abs(v: i32) -> i32 {
    if v >= 0 {
        v
    } else {
        -v
    }
}
```

インデックスだけでも変数に代入すれば多少はわかりやすくなりそうだが変数が使えないので下記はコンパイルエラー

```rust
const fn _abs(v: i32) -> i32 {
    let index: usize = (v >= 0) as usize; // 変数は使えないのでコンパイルエラー
    [-v, v][index]
}
```

`const fn`の中でも定数の定義はできるが変数を使用して定数の定義はできないので下記もコンパイルエラー

```rust
const fn _abs(v: i32) -> i32 {
    const INDEX: usize = (v >= 0) as usize; // 変数を使用して定数の定義はできないのでコンパイルエラー
    [-v, v][INDEX]
}
```

変数を作ることなくアクセスする返す値を変更したいため、今回の形になった。

## ビット演算で符号を変更すればいいのでは？
そうですね。多分できると思います。

追記: 2019/11/06
標準の`abs`はビット演算してる。
https://qiita.com/block/items/646c725289a8431383f9


## まとめ
絶対値を返すだけでとても苦労する。
条件によって返す値は変えられたのでもしかしたら多少複雑な処理はできるかもしれない。
可読性は犠牲になりそう。

# おまけ
別パターン。　
配列を作らなくても良い方法。

```rust
const fn abs(v: i32) -> i32 {
    v * (((0 <= v) as i32) * 2 - 1)
}
```

# おまけ2
[1.33.0で`const fn`の制限が緩和された](https://qiita.com/block/items/a7743ab456048db992f2)ので可読性を上げる。
途中で書いていたindexを変数に代入するやつです。

```rust
const fn _abs(v: i32) -> i32 {
    let index = (v >= 0) as usize;
    [-v, v][index]
}
```

# おまけ3
1.46.0で`if`が使えるようになったので通常の関数のように書くことができます。

```rust
const fn abs(value: i32) -> i32 {
    if value >= 0 {
        value
    } else {
        -value
    }
}
```
Nutanix CEでAnsibleのDynamic Inventoryを試す

# Nutanix CEでAnsibleのDynamic Inventoryを試す

## はじめに
この記事は[Nutanix Advent Calendar 2018](https://adventar.org/calendars/3014)の16日目の記事です。

Nutanix CE に対して、 Ansible の Dynamic Inventory を試してみます。

### 登場人物の整理

| なまえ | とくちょう |
|---|---|
| Nutanix CE | HCIを提供、Community Editionで無償評価可能 |
| Ansible | 構成管理ツール |
| Ansible Dynamic Inventory | 仮想環境、クラウドなどと連携し、管理対象ホストを動的に取得する |

本記事ではNutanix CEにおけるDynamic Inventory機能について記載する。

## 触ってみる

### Nutanix CE の REST API 一覧

Nutanix CE のREST APIは以下のリンクから参照できる。
![Screenshot from 2018-12-16 22-00-12.png](https://qiita-image-store.s3.amazonaws.com/0/190013/c63cc444-e854-1cf1-e9a6-8e4964b228b5.png)
アドレスは
`https://<PRISMのFQDN>:9440/api/nutanix/v2/api_explorer/index.html`

アクセスすると、`REST API Explorer Live!`が表示され、GUI から簡単に REST API を発行できる。
![Screenshot from 2018-12-16 22-03-53.png](https://qiita-image-store.s3.amazonaws.com/0/190013/baae68a9-eb71-9a3a-fa74-a22fd0a38f7c.png)


### Nutanix CE 上の VM 一覧を取得する API

`REST API Explorer Live!`では以下の情報が表示される。
![Screenshot from 2018-12-16 22-05-15.png](https://qiita-image-store.s3.amazonaws.com/0/190013/6daec2ff-aaf8-1336-0cd4-1b640a66f6f0.png)

`/vms/`に対して GET メソッドを用いることで VM 一覧が取得できる。
以下は`REST API Explorer Live!`から`/vms/`をクリックした画面となる。
![Screenshot from 2018-12-16 22-07-54.png](https://qiita-image-store.s3.amazonaws.com/0/190013/249aabf0-d0e3-10a9-e342-b0ecfe208dae.png)
`Try it out!`をクリックすることで REST API 発行時の動作を確認できる。
IPアドレスの情報を取得する際には `include_vm_nic_config` に `true` を指定する必要がある。(※ 赤枠箇所)
![Screenshot from 2018-12-16 22-20-39.png](https://qiita-image-store.s3.amazonaws.com/0/190013/a6d18ce2-6bf9-1796-cd97-75b134e693b6.png)

VM の IPアドレスは以下のKeyで取得できる。
![Screenshot from 2018-12-16 22-48-08.png](https://qiita-image-store.s3.amazonaws.com/0/190013/f1ffce69-3f90-5b9c-6da3-3e951cc4adbc.png)


ループで取り出して、[Developing dynamic inventory](https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html)のフォーマットに整形する。
![Screenshot from 2018-12-16 23-09-27.png](https://qiita-image-store.s3.amazonaws.com/0/190013/27684bf5-cbc6-63bf-16d0-1059b0cf5645.png)

### ご参考
Nutanix Communityの記事に[Nutanix dynamic inventory script for Ansible](https://next.nutanix.com/scripts-32/nutanix-dynamic-inventory-script-for-ansible-18179)がある。
[Nutanix external inventory script for Ansible](https://github.com/mattkeeler/ansible-nutanix-inventory)を紹介した記事であるが、ライセンスが明記されていないため自己責任で。

### ansible-playbookを実行する
コードを書いてansible-playbookを実行する。
![Screenshot from 2018-12-16 23-37-21.png](https://qiita-image-store.s3.amazonaws.com/0/190013/efee0fc2-679b-bab0-50e3-24fc7fc256f4.png)

以上
【あなたも合格する】基本情報技術者試験・応用情報技術者試験に合格する方法

###はじめに

私はシステムエンジニアみたいなことをして日銭を稼いでいる者です。

そして情報処理推進機構(IPA)の「応用情報技術者」の資格を持っています。

平成29年度秋季試験で

- 基本情報技術者試験

平成30年度春季試験で

- 応用情報技術者試験

に合格しています。

この記事では、

- どうやって、私が試験に合格したか

- どうすれば、未取得者が受かるか

を書いています。


###基本情報技術者の場合

参考書を一冊買って、最後まで通して読みました。

『1回で受かる!基本情報技術者合格テキスト ’17年版   原 寿雄』
 https://www.amazon.co.jp/dp/4415223885/ref=cm_sw_r_tw_dp_U_x_LTLfCbF45V0RK 

その際、単語を紙に書きおとしていました。

また、以下のサイトの一問一答を解いていました。
通勤中や、寝る前が主です。

「基本情報技術者試験.com」
https://www.fe-siken.com

あとは、IPAの公式サイトから、過去問題のPDFをダウンロードして、
印刷して解きました。これは、午後も同じ。

###応用情報技術者の場合

参考書を一冊買いました。正直に申し上げるとあまり使いませんでしたが。

『情報処理教科書 応用情報技術者 テキスト&問題集 2018年版   日高 哲郎 』
https://www.amazon.co.jp/dp/4798154199/ref=cm_sw_r_tw_dp_U_x_2VLfCb59NHPQP

主な勉強方法としては、一問一答のアプリで、午前問題を400問ほど解きました。
https://itunes.apple.com/jp/app/応用情報技術者-午前-一問一答問/id398338957?mt=8&ign-mpt=uo%3D4

その際、解説をきちんと読んで、理解することを心がけました。

午後問題は、設問数に対して、選択する必要のある問題数が少ないので、
アプリで分野ごとの正答率を調べてみて、正答率の高い科目のみを
選択することにして、
PDFを印刷して実際に解きました。

まとめると以下になります。

- 午前は一問一答を解く。
- 午後は過去問を印刷して解く。

###どうすれば未取得者が受かるか

情報技術者試験に限らず、ペーパーテストで良い点を取るコツを書きます。
だいたい他人の受け売りです。
ご参考までに。

- ながら勉強は学習効率がよくない。

寝そべりながら・テレビ見ながら・音楽聴きながら・ご飯食べながら、勉強するのは、
学習効率がそれほどよくないです（個人差あると思いますが）。
それで勉強がはかどる人はスゴイと思います。
私などは不器用な人間なので、ながら勉強をすると何も頭に入ってこないのです。

- 手をうごかして考える。

単語を覚える・概念を理解するなどは、ペンで書きながら考えるのが、学習内容が定着しやすいと思っています。

- 寝る直前に勉強する。

皆様、ご経験あるかと思いますが、寝る直前に覚えた記憶は、定着しやすいです。たとえば、寝る前に5分間だけ単語を覚えるなどです。

- 一夜漬けする。

一夜漬けは、ペーパーテストには、有効だと思います。
また、徹夜より、いくらか寝てから（私の場合は2〜3時間くらい）試験に臨むほうが、
記憶が定着して、いい点が取れると思います。

- 生活の中で知的活動をする。

本を読むとか、新聞を読むとか、ニュースを見るとか、日頃から何か知的活動をすることを心がけると、テストに関係ないように見えても断片的な情報が頭に蓄積されて、テストの点は上がると思っています。
あまり学習に時間を費やしていないのに試験で良い結果を得る「地頭が良い」「天才タイプ」といった人には、こういう人が多いと思っています。


### おわりに

このような記事を最後までご覧になっている、向上心と学習意欲のある皆様なら、きっと受かります☺️
気負わずに、がんばってください！
SpringBoot + Kotlin + Docker を使ってみる

# なにこれ
dockerとKotlinを使ってみたかった
https://training.play-with-docker.com/ でdockerを学び
https://spring.io/guides/tutorials/spring-boot-kotlin/ でspringとkotlin
https://spring.io/guides/gs/spring-boot-docker/ でspringとdockerの組み合わせ方を学んだ
それのまとめ。

# 開発環境
```shell
$ gradle -v
Gradle 4.4.1
$ java -version
java version "1.8.0_91"
$ docker -v
Docker version 18.09.0, build 4d60db4
```

# 雛形作り＆起動確認
```shell
$ mkdir boot-sample-kotlin-with-docker && cd boot-sample-kotlin-with-docker
$ curl https://start.spring.io/starter.zip -d type=gradle-project -d language=kotlin -d style=web  -d packageName=sample -d name=sample -o boot-sample-kotlin-with-docker.zip
$ unzip boot-sample-kotlin-with-docker.zip && rm boot-sample-kotlin-with-docker.zip
$ ./gradlew build && java -jar build/libs/demo-0.0.1-SNAPSHOT.jar
```

# Controllerの追加＆動作確認
- Controllerの追加
 
```src/main/kotlin/sample/Controller.kt
package sample

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class Controller {

    @GetMapping(path = ["hello"])
    fun hello(): String {
        return "Hello Kotlin, Hello Docker."
    }
}
```

- 動作確認

```
$ ./gradlew build && java -jar build/libs/demo-0.0.1-SNAPSHOT.jar
$ curl localhost:8080/hello
Hello Kotlin, Hello Docker.
```

# Dockerfileの作成
https://spring.io/guides/gs/spring-boot-docker/ のDockerfileとbuild.gradleの設定だと下記エラーになる。Kotlinを使用しているためmain methodが見つからないっぽい。

```
Error: Main method not found in class sample.SampleApplication, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
```

対応方法がわからなかったので、こっち( https://cloud.google.com/community/tutorials/kotlin-springboot-container-engine ) で紹介されているやり方でやってみる。

```Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
RUN mkdir /work
COPY . /work
WORKDIR /work
RUN /work/gradlew build
RUN mv /work/build/libs/*.jar /work/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/work/app.jar"]
```

```shell
$ docker build --no-cache -t demo .
$ docker image ls
REPOSITORY                       TAG                 IMAGE ID            CREATED              SIZE
demo                             latest              834f1d599273        About a minute ago   620MB
```


# 最後の動作確認
```shell

$ docker run -p 8081:8080 demo
$ curl localhost:8081/hello
Hello Kotlin, Hello Docker.
```


# 参考
- docker 
 - https://www.docker.com/products/docker-desktop
 - https://training.play-with-docker.com/
 - https://cloud.google.com/community/tutorials/kotlin-springboot-container-engine
- spring
 - https://spring.io/guides/tutorials/spring-boot-kotlin/
 - https://spring.io/guides/gs/spring-boot-docker/
- 同じようなことをやってる人がいた
 - https://qiita.com/yumatsud/items/330fc8a8fd3ddb88b830
すぐ始められる Django on Docker

# きっとうまく行く Django on Docker
サクッとやりたいもののなんだかんだつまづく Docker 。

以下では、
- Django
- PostgreSQL
な開発環境を Docker で構築する手順を記します。

また、以下の Docker 構成は、開発環境のみを想定し、本番までのデプロイは想定していません。

# docker-compose インストール

以下の URL を参考にインストールしてください。
https://docs.docker.com/docker-for-mac/install/

```shell
$ docker --version
Docker version 17.03.0-ce, build 60ccb22

$ docker-compose --version
docker-compose version 1.11.2, build dfed245
```
以上のようになればインストール完了です。

# Django プロジェクトを動かすぞ

https://github.com/kyon-bll/Django-on-Docker
こちらのリポジトリをクローンしてきます。以下は、このリポジトリ内で作業してください。

#### Django 用の Docker イメージを Dockerfile から作成

```shell
$ docker-compose build
```
ざっくり以下のようなことをやっています。

1. Python のイメージをダウンロード
2. ダウンロードしたイメージに `pip` を用いて `requirements.txt` に記述のある `django` パッケージをインストール

#### Django プロジェクトを作成

```shell
$ docker-compose run web django-admin startproject django_project_name .
```

最後の `.` を忘れないように注意してください。

このコマンドで、 Django プロジェクトに関するファイルが作成されます。
1. django_project_name ディレクトリ
2. manage.py ファイル

また、docker-db-data ディレクトリには PostgreSQL のデータが配置されます。

#### 起動

```shell
$ docker-compose up
```

http://localhost:8000/ にアクセスして、以下の画面が表示されれば完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190905/d6910059-b01a-ccd0-f5b0-8aa8e9774277.png)

#### DB 設定

`django_project_name` ディレクトリ内の `settings.py` の DATABASES の記述を PostgreSQL 用に書き直します。

```python:settings.py
...
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
...
```

```bash
$ docker-compose exec web python manage.py migrate
```

migrate に成功すれば完了です。

# 以降の操作

```shell
# docker コンテナ停止
$ docker-compose down

# pip インストール, requirements.txt 更新
$ docker-compose exec web pip install {パッケージ名}
$ docker-compose exec web pip freeze > requirements.txt 

# manage.py コマンド
$ docker-compose exec web python manage.py createsuperuser
$ docker-compose exec web python manage.py makemigration
$ ...
```


# その他の設定箇所とか

1. Django のバージョン指定: requirements.txt でバージョンの指定をする
1. Python のバージョン指定: Dockerfile の1行目
1. PostgreSQL のバージョン指定: docker-compose.yml の17行目
1. apt-get でのパッケージインストール: Dockerfile コメントアウト箇所参照

# wait-for-db.sh て何

DB の準備ができる前に Django から DB へアクセスがあると、エラーで動かなくなってしまうのを防いでいます。
docker-compose.yml の `depends_on` の記述によって、DB -> Django の順に起動はしてくれるのですが、DB の準備が整うまでは待ってくれないので、環境によってこれがないとうまく動かないことがあります。というか自分はほぼ毎回そうなります。なんとかもうちょっと綺麗に解決したい。
【Ruby】DB概要

# DB（データベース）とは
- `データを保存しておく場所` のこと。

## DBの構成
- テーブル：表で管理しているデータ（下図全体）
- カラム：縦の列（下図赤いセル）
- レコード：1行ずつのデータ（下図オレンジのセル）
<img width="386" alt="スクリーンショット 2018-12-16 23.09.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/309691/799296af-de8a-bb91-62cb-481a8f6029d2.png">

## DBの作成方法
1.DBに変更を指示するファイルを作る

```
$ rails g(generate) model Post content:text
　　　　　　　　　　　　　モデル名 カラム名 データ型
```

2.DBに変更を反映する

```
$ rails db:migrate
```

3.インスタンス作成

- 空のインスタンスを作成する場合

```
$ post = Post.new　#空のインスタンスを作成
$ post.content = "こんにちは"　#contentカラムに内容（こんにちは）を追加
$ post.save　#DBに保存
```

- カラムの中身を伴い、インスタンスを登録する場合

```
$ post = Post.new(content: "こんにちは")
  # $インスタンス作成時点でcontentカラムを作成しているため、
　　post.content とコマンドを打つと"こんにちは"が表示される
$ post.save
```
結果、DBの値は下記のように登録される。
<img width="386" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3330393639312f37393932393661662d646538612d626239312d363263622d3438316138663630323964322e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/309691/34418b2a-1bbf-ebb6-fa95-e54c50ce01a8.png">
Goで並列ssh実行コマンド gopssh を作った

# 概要

OpenSSH の並列同時実行を行うクライアント gopssh を作りました
https://github.com/masahide/gopssh

# 動機

xargsで十分だったり、すでに同じようなOSSが存在するのになぜ作ったか

- 指定したホスト順に実行結果が出力されないものが多い
- 実行ホスト名を表示したい
- 並列実行性能がもっと欲しい

などなどオレオレ仕様を満たすために作りました

# 特徴

- 指定したホストの順で実行結果を出力するモードがデフォルト
- 実行ホスト名を表示するオプション(-d)
- ssh key-agentによる認証がデフォルト(-iで秘密鍵の指定も可能)
- ホストキーチェックを無視するオプション(-k)がある(デフォルトは Opensshの ~/.ssh/known_hostsのホストを許可)
- sshコマンドやライブラリを必要としないone binary
- 同時並列実行数がデフォルトでは無制限(ulimit open file数を超えるような場合はulimitを要調整)
- 標準入力を使える（ファイルやスクリプトなどを入力として渡すと各ホストに同じものを実行/配布することができる)
- ホスト名や終了コード/エラー出力をANSIカラーで表示
- 各種インストールパッケージを用意しているのでインストールが簡単
- パスワード認証は未実装!
- cipher, key exchanges, MACのアルゴリズムはそれぞれデフォルトで速度優先でsort済み(変更可能)

# 環境や前提条件

以下の64bit環境用のパッケージを用意しています

- RHEL/CentoOS
- Ubuntu/Debian
- MacOS


# 使いかた

簡単な使い方

```bash
gopssh <オプション> <コマンド...>
```

- オプション
    - `-d` ホスト名を表示
    - `-h <ファイル名>` ホスト一覧ファイルを指定

その他のオプションは[こちら](https://github.com/masahide/gopssh#usage)


#### 例)host1,host2　に対して `ls -la /etc/`　を実行する場合
この例では[bashプロセス置換](https://qiita.com/fumikony/items/cbf0562b6e1f220f62a7)を使って一覧ファイルを省略している

```bash
gopssh -d -h <(echo host1 host2) ls -la /etc/
```


### ホストファイルを準備する例

`<ホスト名>[:ポート番号]` を改行か空白区切りで記載する

例)

```bash:hostfile
host1
host2:1022
host3
.
.
```
`-k`オプション: ホストキーチェックを無視する

```bash
gopssh -d -k -h ./hostfile ls -la /etc/
```


### ディレクトリをコピーする例

標準入力に対応しているので以下のような操作で、ディレクトリをtarアーカイブして宛先の各ホスト側でtar展開することができる

`/tmp/hoge` ディレクトリを各ホストに配布

```bash
tar -cz -C /tmp/ hoge| gopssh -d -h <(host1 host2 host3) -k tar xz -C /tmp/
```

# インストール方法

### RHEL/CentOS

```bash
sudo yum install https://github.com/masahide/gopssh/releases/download/v0.5.4/gopssh_amd64.rpm
```

### Ubuntu/Debian

```bash
wget -qO /tmp/gopssh_amd64.deb https://github.com/masahide/gopssh/releases/download/v0.5.4/gopssh_amd64.deb
sudo dpkg -i /tmp/gopssh_amd64.deb
```

### macOS

```bash
brew tap masahide/gopssh https://github.com/masahide/gopssh
brew install gopssh
```
メモ：「３０日でできる！OS自作入門 」一日目のHello World

本日 #プランクトンサミット へ行って気が高まっているので、本日届いた 「３０日でできる！OS自作入門」 を初めてみました。

### 環境
OSX

### 手順

1) バイナリを手で打つ

![スクリーンショット 2018-12-16 23.15.35.png](https://qiita-image-store.s3.amazonaws.com/0/109145/8ae68e88-5c1c-432d-7ec4-a6e928869da2.png)

![スクリーンショット 2018-12-16 23.16.41.png](https://qiita-image-store.s3.amazonaws.com/0/109145/67154483-9f1c-10cd-1d2c-7dd66fa32660.png)

2) 0x148000 バイト分 0 で埋める (思いついた一番効率悪い方法ｗ）

```
% for i in `seq 1474560`; do printf '\0' >> helloos.pcap; done
```

(なぜ .img ではなく、.pcap になってるかは vim で pcap の場合、xxd と呼び出せるようしているからですmm)

3) qemu で立ち上げる 

```
% qemu-system-x86_64 -drive format=raw,file=helloos.pcap
```

YAY!

![スクリーンショット 2018-12-16 23.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/109145/2497e79c-487d-c2c8-014a-15c024a18b24.png)

- このあとアセンブリ版書いて nasm でコンパイルできた。

- resb の代わりに times N db 0
- 0x1fe-`$` の `$` 変数は nasm でうまくいかなったので 132 にハードコードした

追記: nasm で `$` の代わりに `($-$$)` にしたら動いてそう。
RailsのTransactions　初心者→中級者へのSTEP16/25

#RailsのTransactions
##はじめに
やっぱり今日はTransactionについて書きます。キャッシュはまた今度にします。


##トランザクションとは
簡単にいうと、複数のSQL文の集まりです。`transaction`は訳せば取引です。webアプリケーションでは例えばユーザ間での何かしらのやりとり、取引が起きた時、双方のデータを更新すべき時があります。
例えば、Aさんの口座からBさんの口座に100円渡す時、Aさんの口座情報と、Bさんの口座情報を両方更新されなければなりません。片方だけ更新が成功されることは起きてはなりません。片方が失敗したなら、もう片方も更新されてはなりません。この更新がする前に戻るべきです。
そんなまとめて処理されるべき更新のSQL文の塊をトランザクションと言います。

##Railsでどう実装するのか
実装の仕方はシンプルで、下記のようにブロック内にまとめたい処理を書いてくだけです。

```rb
ActiveRecord::Base.transaction do
  #まとめたい処理たち
end
```

##サンプル例
２つのユーザーが同時に保存されなけらばいけない場合。

```rb
  def create
    User.transaction do
      user1 = User.new(:name => 'tarou')
      user1.save!
      user2 = User.new(:name => '')
      user2.save!
    end
    p '更新に成功しました'
  rescue
    p 'ロールバック'
  end
```

処理が失敗した場合、`save!`でないと例外を吐いてくれないのでロールバックされません、注意です。例外を吐くメソッドを使用しましょう。
これでuser1,user2の保存に成功しないと、この処理はロールバックされます。


##まとめ
今日は軽くにして明日このtransactionmを深く掘り下げていきたいです。

##参考にしたの

Railsのデータロック
https://qiita.com/merrill/items/d9d41d64df292bd6432a

Active Record Transactions
https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
有料チュートリアルの感想

こんにちは [Houdini Apprentice Advent Calendar 2018](https://qiita.com/advent-calendar/2018/happrentice) の１６日の記事です。
手っ取り早くパーティクル系の導入交渉に使えそうなイメージを作りたい時に買ったやつ２つの感想。
結論としては<b>Udemyの有料チュートリアルをセールで買ったらコスパがものすごく良かった</b>という話です。

今回、チュートリアルの紹介ということで文章ばかりになってしまいました。見づらくて申し訳ありません。


### 受講時の自分のHoudini理解度
最近勤務環境がかわり、ダイナミクス周りの知識も欲しくなって有料チュートリアルを試しました。
メインツールではないけど業務でHoudiniCoreを利用した経験もあり、時間がかかりながらならモデリングは一応していけるな、くらいの知識。
パーティクル、ダイナミクス、レンダリングなどの知識はほぼ皆無の状態からスタート。

## 今回試した有料チュートリアル2つ
### [Udemy](https://www.udemy.com)
- [VFX: Complete Houdini Bootcamp](https://www.udemy.com/share/1000og/)

### [CgCircuit](https://www.cgcircuit.com/)
- [Applied Houdini - Rigids VI]
(https://www.cgcircuit.com/tutorial/applied-houdini---rigids-vi)
- [Applied Houdini - Rigids V]
(https://www.cgcircuit.com/tutorial/applied-houdini---rigids-v)

選択理由はパーティクルのチュートリアルであることとレンダリングまでを解説していることです。
Applied Houdini - Rigids VI　の方はパーティクルというよりはレンダリングイメージが良さげに見えたのでレンダリング目的で買いました。

# Udemyのチュートリアルの感想
- [VFX: Complete Houdini Bootcamp](https://www.udemy.com/share/1000og/)

### 購入理由
- <b>参考書を買うより安いという破格の値段。udemyのシステムがよくわから無いけれど24000円の講座が初回登録時1300円になった。</b>(ただ、twitterで感想探したら１年前でもセールで安くなっていたみたいな情報が散見されたので初回登録時だけじゃなさそう。)
- サンプルとして載っていたコースプレビューのChocorateProjectの画像はFixイメージまで持っていけそうな出来だった

### 良かった点
- <b>初心者向け</b>
- スクリプティングなどのテクニカルな要素はほとんどなく、数値などを制御して良い結果を制作してくれるのでHoudini自体に慣れていなくても流れを追いやすそう
- ボリュームすごい
- 基礎的な使い方も網羅してくれている
- 見栄えよさげなレンダリング画像までいける
- UdemyのiOSアプリでどこでも見れるのが思っていた以上に便利

### あんまりよくなかった点
- 目当てだったChocorateProjectのマテリアルは色調をエミッシブで調整していたりと、いい感じのレンダリングになるまでは結構勘と力業に頼っている印象
- 広く浅く。Houdiniの利点の一つであるデータをプログラマブルに調整する要素はほぼ皆無

#CG CIRCUITのチュートリアル
https://www.cgcircuit.com/tutorial/applied-houdini---rigids-vi
https://www.cgcircuit.com/tutorial/applied-houdini---rigids-v

### 購入理由
- udemyのチュートリアルでレンダリング周りの物足りなさを感じた（自分はUdemyの後に購入）
- 最終イメージの質が高いチュートリアルが複数
- <b>著者がIndustrial Light & Magicのシニア FX TD</b>

### 良かった点
・<b>出来上がる結果の品質は文句のつけようがない</b>
・このチュートリアルのみですごいと思えるイメージまでの制作の流れが解説されている。

### あんまり良くなかった点
- 全体的に上級者向け。テクニカル要素多めでパラメータを決定、VEXとVOP両方を使っていたりする。Houdini自体のオペレーションに不慣れな人にはお勧めできない
- シーン配布がないので設定項目を間違うと間違った場所を探しなおす必要がある。
　（この辺もHoudini自体のオペレーションに不慣れな人にお勧めできない理由。）
- 個人で勉強用に買うにはちょっと高め（というか今回は比較対象の、セール時のUdemyが安すぎるだけな気もしますが）



# チュートリアル終わってみて
今回買ったのは両方とも費用対効果は非常に良かったです。

特にUdemyの方はセール期間で買った１３００円だと破格の内容。初めての人にHoudini始めたいんだけど入門書は何買えばいい？と聞かれたら間違いなくこのビデオチュートリアルを進めるます。
（値引きなしで24000円だったらこんなもんかなーって内容なんで勧めませんが）


### Udemyのチュートリアルをお勧めしたい人
時間をかけてもいいのならudemyのチュートリアルで基本的な流れを踏んだ後vimeoなどにある種々のチュートリアルを回るのがコスパも良くて理解が深まりそう
広く浅く、とは書きましたが個人的にudemyのチュートリアルは値段に対するリターンは大きかった印象です。
多分[この辺](https://vimeo.com/126886471)とか[この辺](https://vimeo.com/229100615)とかの内容や配布シーンがUdemyのチュートリアルを追った後なら理解がしやすくなると思います。


### CG Curcuitのチュートリアルをお勧めしたい人
もともと目的としていた、「手っ取り早くFixレベルのイメージを作りたい」にはCgCircuitのチュートリアルが最適。出来もよく、かなりプロシージャルなつくりをしてくれているのでモデル差し替えなどするだけでかなり見応えのある映像になってくれると思います。


# 他の有料チュートリアルとか
他にも有料無料とわずチュートリアルを、サルにもわかるhoudiniでまとめて下さってました。良さげなチュートリアル探してらっしゃるかたはそちらも参考にされると良いと思われます。

[サルにもわかるHoudini Learning Houdini]
(http://ikatnek.blogspot.com/p/houdini.html)
phina.jsを部活で教える

#自己紹介
はじめまして、タカバヤといいます。
記事を書くにあたって少し自己紹介をすると、都内の中高一貫校でコンピュータークラブの部長をしています。
プログラミング経験はphina.jsを始める前は少しJavaを触ったり、JavaScriptは基本ができてるかな、という程度です。あとScratchに似たものもやってました。


#部活の活動環境
部活動として週2回、学校のコンピューター室を使わせてもらっています。i5と4GBメモリでグラボが載ってない一体型パソコンで管理者権限はありません。また電源を切るたびにCドライブやらなにやら全て初期状態に戻るのでネットワーク上のフォルダで個人のデータを管理しています。
javaを実行できはしますがjavacはできません。またGitは毎回インストールするかモバイル版を使うことでどうにかなりますが、UnityやDirectXなどのゲーム入門によく使われるゲームエンジンなどがつかえません。
#現状
今は入部してくる新入生のうちやることが決まっていて入部してくる子には自由に作業をさせてあげて、とりあえず入ってみたという子に一応Scratchを教えています。と言っても弊部でプログラミングをやってる人は人に教わった経験が無いのであまりうまく教えられてないです。その結果、参考にすると言いながらゲームを遊ぶだけの中学生が非常に多くなっています。
#なぜphina.jsなのか

1.　クロスプラットフォームである
2.　コンパイラがいらない→エディタがあれば使えるので環境構築に手間がかからない
3.　Runstantがあるので手軽に試せる
4.　標準のSceneが使える
5.　便利！

##良い部分
まずブラウザで実行できる点が大きいです。イマドキのPCならほぼ間違いないと思います。専用エディタなんかももちろん必要ないのでそんなにスペックが高くないパソコンでも余裕でコーディングできると思います。弊部では多くの人がvscodeを使っていて、かく言う私もその一人です。さらにブラウザでうごくので、部のホームページに貼っておくだけで作品の発表ができます。
初心者が初めて学ぶのに適している言語の話をするとそれだけで一つの記事がかけてしまいますが、Javascriptはスクリプト言語であるし、あまり型などが厳しくないので初心者には適していると思います(それが悪く働く場合もありますが)。
非常に使いやすいライブラリなので、キャラをとりあえず動かしてみるまでがはやくゲームを作っている実感を感じやすく、飽きずにやってくれるのでは無いかなと思っています。一度中身を作ったらスコアを標準についてるシーンに渡すだけでゲームになるのも良いですね。

##考慮しないといけないところ
どのプログラミング言語でも言えることですが文字ベースだから文字依存の失敗が多いです。全角半角、打ち間違いなど、そこらじゅうに躓く小石があります。もちろん私達が見ればすぐに解決できるものばかりですが、今年は一年生だけで十数人いたので一度にこれが起こると対応に時間がかかります。
phina.jsをやってもらうにはJavascriptの基本を知ってることが大前提になってきますが、ここはProgateをやってもらうことで解決できそうだと思っています。
phina.jsはまだまだ情報量が少ないとおもいますが、Qiitaなどにまとまった記事を書いてくださってる方がかなりいるので初心者のうちは不足を感じることはないと思います。

#これから
来年もまた多くの新入生が入ってくると思うので、うまくこれまでの経験を踏まえてゲームに限らずものを作る楽しさを伝えられたらなと思っています。もし来年もアドベントカレンダーに書かせてもらうことがあったらその後教えてみてどうだったかなど書いてみたいなと思います。
最後になりますが、こうしたらわかりやすいのではないかなどのアドバイスがありましたら是非コメントしてください。
GoでZaifのストリーミング APIを試してみる

これからの時代は「FinTechでGo！！」という噂を聞きつけたので、
udemyの「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」で勉強中。

講座の中ではbitFlyer Lightning Realtime API を使っているけど、
Zaifに口座を持っているのでそっちで試してみたい...

ってことで手始めにZaifのGoでストリーミングAPI試してみた。


ZaifのストリーミングAPIはwebsocketを利用してリアルタイム板情報と終値を配信している。

使い方は簡単で以下のリクエストURLに接続するだけ。

リクエスト
wss://ws.zaif.jp/stream?currency_pair={currency_pair}
ws://ws.zaif.jp/stream?currency_pair={currency_pair}

戻り値はこんな感じ。

```ruby:
{
        "asks":[
            [
                30000.0,
                0.1
            ],
            [
                30010.0,
                0.2
            ],
            ...
        ],
        "bids":[
            [
                29500.0,
                0.5
            ],
            [
                29300.0,
                0.1
            ],
            ...
        ],
        "trades":[
            {
                "currenty_pair":"btc_jpy",
                "trade_type":"ask",
                "price":30001,
                "tid":123,
                "amount":0.02,
                "date":1427879761
            },
        ...,
        "timestamp":"2015-04-01 18:16:01.739990",
        "last_price:{
            "action":"ask",
            "price":30001
        },
        "currency_pair":"btc_jpy"
}
```

それでコードはこれ。

```ruby:main.go
package main

import (
	"fmt"
	"github.com/gorilla/websocket"
	"log"
	"net/url"
	"time"
)

type Results struct {
	Asks         []interface{} `json:"asks"`
	Lastprice    Lastprice     `json:"last_price"`
	Targetusers  []interface{} `json:"target_users"`
	Trades       []interface{} `json:"trades"`
	Bids         []interface{} `json:"bids"`
	Currencypair string        `json:"currency_pair"`
	Timestamp    string        `json:"timestamp"`
}

type Lastprice struct {
	Action string  `json:"action"`
	Price  float64 `json:"price"`
}

func main() {

	u := &url.URL{
		Scheme:   "wss",
		Host:     "ws.zaif.jp",
		Path:     "stream",
		RawQuery: "currency_pair=btc_jpy",
	}

	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer c.Close()

	for {
		result := new(Results)
		if err := c.ReadJSON(&result); err != nil {
			log.Fatal(err)
		}
        // 後は構造体から必要な結果を取ってくる。
		fmt.Println(result.Currencypair)

		time.Sleep(1 * time.Second)

	}
}
```

Goのwebsocketライブラリはいろいろあるみたいだけどudemyの講座内で使ってて情報も多いので[github.com/gorilla/websocket]を使用。

アクセスして情報を引っ張ってくるまでは簡単だけどJSONの扱い方にちょっと戸惑った...
定義した構造体にそのままデータを放り込めるから慣れると便利なのかも。
コードにツッコミとかアドバイスいただけると嬉しいです。

実際にシストレさせるまでの道のりはまだまだ遠いな。

Goをやってみたい方はこの講座がおすすめです。
[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発](https://www.udemy.com/go-fintech/)

あと同じ講師の方のPythonコースもとてもわかりやすいのでおすすめです。
[Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする](https://www.udemy.com/python-beginner/)

udemyは結構な頻度で割引セールをやっているのでその時にほしい講座をまとめて買っておくといいと思います。
（だいだい２０００円以下まで下がった時が買い時です。それ以外の時は待ちましょう！！）
Hashicorp Packer が対応している Provisioner

# Hashicorp Packer が対応している Provisioner

Packer が対応しているプロビジョナーにどのようなものがあるか調べてみました。
プロビジョナーが何かというと「設定」するやつですね。
つまり、イメージを作る際に、仮想マシンを立ち上げて作りますが、その途中でサーバの設定を行うことですね。

## Ansible Local

VM 上の Ansible をローカルで動かします。
VM 上に Ansible が入っている必要があります。

# Ansible Remote

Ansible をリモートサーバで動かします。
SSH 経由で Ansible を動かすので、VM 上にAnsible が入ってる必要がありません。

# Breakpoint

これはユーザが「エンター」を押すまで、イメージの作成が止まるモードです。
ドキュメントにはデバッグ用途だと書かれています。

## Chef Client

イメージを作る際に、Chef サーバとやり取りをしながら作成するモードです。

## Chef Solo

Chef を Packer で構築しているマシンにインストールして使うモードです。

## Converge

[Converge](http://converge.aster.is/0.6.0/) もサーバ設定を行うツールの一つで、それを動かします。

## File

ファイルをアップロードして使います。
`/etc` 配下に設定ファイルを置きたい時などに使えそうですね。

## PowerShell

これは、Windows の設定用ですね。
ドキュメントには、SSH 経由でも使えるとは書いてあります。

## Puppet Masterless

これは、Puppet を VM 上だけで動かすようです。
Puppet がインストールされているのが前提のようですね。

## Puppet Server

これは Puppet が入っている VM が Puppet master と通信をして設定するようです。

## Salt Masterless

単体で [Salt states](https://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html) を使用して設定をする感じのようです。
見たところ、Ansible や Chef のような設定ソフトのようですね。

## Shell

これは、VM 上で Shell を動かすものです。

## Shell (Local)

これは、VM 上ではなくビルドしているマシンやデスクトップなどの上で Shell を動かすようです。
コメント出したい時とかに使う感じなんでしょうかね。

## Windows Shell

これは、Windows のコマンドを使用するものです。
Powershell とはまた違いますが、どちらにしろ Windows の設定を行います。

## Windows Restart

なぜこれだけ独立しているのか不思議なとこですが、Windows の場合、再起動は特殊なのかもしれませんね。
Windows で再起動を行うだけのものです。
と思って、ちゃんと読んでみたら、Windows の場合、構築にあたって何度も再起動が走ることがあるので・・・ということのようです。

## Custom

これはカスタムでプロビジョナーを作成できるものです。
ちょっと初心者にはハードルが高そうですが、使いこなせるようになれば便利かもしれません。

## まとめ

Packer で作成するイメージに対して、色々な設定を行う手段を提供してくれるのがプロビジョナーですが、さわり程度には説明できたかと思います。
これを使いこなすことで、色々と独自のイメージが作成できるようになります。

## 参照

https://www.packer.io/docs/provisioners/index.html
8年前に一度到来したARブーム「が」なぜ2018年の今になり再び注目されるようになったのか？

AR業界の皆さん初めまして。現在ENDROLLという会社で「Unityエンジニア」のインターンをしている阿部です！

今回のnotoでは、すでにARに関わりはあるが歴史は知らないという方などを対象に書かせていただきました。
※個人の主観部分もありますのでご了承の上お読みください。
※もし他にもオススメがある！って方は、こそっと教えて頂けると幸いです。

## 目次　
１、ARとは何か
２、ARの誕生
３、1990年代　第一次ブーム　
４、2010年　第二次ブーム　
５、2018年　第三次ブーム　
６、デバイスの進歩

このような流れで記事を書いていきたいと思います！

##１、ARとは何か
ARとは「Augmented Reality」の略で、一般的に「拡張現実」と訳されます。実在する風景にバーチャルの視覚情報を重ねて表示することで、目の前にある世界を“仮想的に拡張する”というものです。テクノロジーとしてのインパクトは大きく、特に近年はスマホ向けサービスとして比較的簡単に実現できることもあり、日常生活の利便性を向上させ、新しい楽しみを生み出せる新機軸の技術として注目を集めています。([下記HP引用!](https://kakakumag.com/pc-smartphone/?id=9609))

##２、ARの誕生
ARの歴史は、我々が想像しているよりもずっと古いものです。1968年、アメリカの計算機科学者、アイバン・エドワード・サザランドが、最初のARであるヘッドマウントディスプレイシステム「The Sword of Damocles」を生み出しました。シースルーのヘッドマウントディスプレイを使用し、現実世界にコンピューターグラフィックスの画像を重ねて見せるといったシステムでしたが、当時の機器はとても大きくて重く、天井に繋いで支えないと装着できないほどでした。
<img width="1075" alt="スクリーンショット 2018-12-14 17.10.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/327484/ab2376dc-0ee8-c767-d0f0-b86863bc00ca.png">
どんなに便利なものだったとしてもこれで街中を歩きたくはないですよね笑

##３、1990年代　第一次ブーム到来
　コロンビア大学でレーザープリンターの修理でトレーや部品が筐体の中がどのように入っているのかを、赤いCGで現実世界に表示させるという研究を行い、現実と仮想をオーバレイさせる研究が確立されまました。
ただ、この頃はプリンターのパーツを現実に映し出すことで「こんな感じにプリンターが直せますよ！」と教えるために、教育やメンテナンスといった方面で、ARの利用が想定されていました。
<img width="537" alt="スクリーンショット 2018-12-14 17.09.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/327484/43071d89-8a6b-cc41-8073-2b3df5765eee.png">
1990年代はある意味、ARの第1次ブームであり、中興の時代だったと言えるでしょう。

##４、2008年　第二次ブーム到来
ブームを起こした「セカイカメラ」
2000年代になり、スマートフォンが普及すると、一般的にもARの技術が活用されるようになりました。2008年に話題になった「セカイカメラ」も、ARの技術を用いたものです。スマートフォンを通して自分の立っている場所から景色を眺めると、町並みに情報が追加された映像が閲覧できました。「あの建物にはアパレルショップが入っている」「数十メートル先に行けばカフェがある」といった具合に、目の前に見えている景色に、ショップやランドマークのアイコンが表示されていたのです。
セカイカメラが2014年には全てのサービスを終了するなど、ブームは急速に鎮静化してしまった。
![Photo 1月 13, 14 43 39.jpg](https://qiita-image-store.s3.amazonaws.com/0/327484/9aa48639-6db9-dccb-b778-06bdda6bdbbd.jpeg)

##５、2018年　第三次ブーム到来
「ポケモンGO」「SNOW」などの人気で関心が高まるAR
2016年に大流行した「Pokemon GO」は、ARを活用したゲームアプリケーションです。現実世界の地図上にポケモンが出現し、その場所まで歩いていくことで、ポケモンに遭遇することができます。ユーザーはスマートフォンを通して現実世界を閲覧し、いつもの通学路や公園にポケモンの姿を発見することができます。拡張現実の世界にいるポケモンにモンスターボールを投げ、捕獲することができるのです。
![maxresdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/327484/3af7dbea-24cf-431a-cf23-d3012fec4dd4.jpeg)


##６、ARデバイスの進歩
ARを研究していた技術者は、様々なデバイスを開発してきました。サザランドのヘッドマウントディスプレイシステムもARデバイスです。研究が進むにつれて、より軽く、より安価なデバイスが開発されました。「ウエアラブルデバイス」とは、ヘッドマウントディスプレイのように、体に装着するシステムのことを言います。グーグルグラスもウエアラブルデバイスです。
しかし、現代において活用されているARは、スマートフォンやタブレットを活用したものが多いのです。グーグルグラスも革新的なデバイスでしたが、それほど普及しませんでした。まだ、ウエアラブルデバイスを日常に装着するのが恥ずかしい、といった印象もあるのでしょう。スマートフォンなら、新しくデバイスを購入する必要もありません。世界的に多くの人々がスマートフォンを手にしている現代、スマートフォンを通して拡張現実の世界を見ることが、手軽に実現しました。
![201806131209094000.jpg](https://qiita-image-store.s3.amazonaws.com/0/327484/3941b3f0-06cf-9bbb-3c43-5369ccca32b5.jpeg)


##まとめ
歴史的に様々なデバイスを開発してきたAR技術ですが、現代において、一番手軽な方法としてスマートフォンやタブレットが活用されています。しかし、技術的にはウエアラブルデバイスも、実用化されているのです。近いうちにどこかでブレイクスルーがおき、人々が当たり前のように、ウエアラブルデバイスを装着している、そんな時代が到来するのかも知れません。

####最後に
「私はARと共に心中する覚悟のもと今後もARと付き合っていきたいと思います。」

最後まで読んでいただきありがとうございます！
本ブログについて


## 本ブログについて
本日より、Qiitaにてちょっとした記事を書いていくことにしました。
目的は、自分で悩んだことに対する備忘録と、文章でのアウトプットを通して学びを深めることです。
あと文章力を少しずつでも伸ばしていきたい。

## なに書くの？
iOSアプリを作りたいと考え、(paypayの100億円イベントに乗っかりつつ)Macbookを買ってしまいました。
iOSアプリを開発し、公開して運用していく過程での気付きや課題、反省などなどいろいろまとめていけたらなぁと思います。
よりよいアプリを作っていきたいので、アジャイル的にブラッシュアップを短期に繰り返していきたいと妄想しています。
一方で、筆者自身はプログラミングをほとんどしないインフラエンジニアとして働いているため、ペースは少しゆっくりかなぁと考えています。

**それでも少しずつでも記事を書いていって、記事を読んだ誰かの役に立てれば良いなぁ。**

Wrote by [PileMd](https://pilemd.com/)
【Unity】ゲーム中の残り時間カウントダウン表示する

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Xcode version 10.0(10A255)
⭐️Unity 2018.2.15f1

<font color="Magenta">ゲーム中の残り時間カウントダウン表示をする</font>
<img width="340" alt="スクリーンショット 2018-12-16 22.53.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/d99364b2-52f6-324a-6dbe-1f6c759be65b.png">

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1073235671882448896
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">UnityでVRシューティングゲーム作成しながら勉強してますっ！！<br>（●＾o＾●）ｖ<br>あと、タイトル画面とスマホ用の書き出しは、週末やるぞ！<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://t.co/btpJCQplzf">pic.twitter.com/btpJCQplzf</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1073235671882448896?ref_src=twsrc%5Etfw">2018年12月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<img width="1215" alt="スクリーンショット 2018-12-16 22.29.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/f34c99af-2643-a842-d327-8e4f90276678.png">



<img width="1210" alt="スクリーンショット 2018-12-16 22.31.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/3150a55b-41d5-3353-9b76-3ccb935e5351.png">


```c#:RemainTimer
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(Text))]
public class RemainTimer : MonoBehaviour
{
    [SerializeField] float gameTime = 20.0f;        // ゲーム制限時間 [s]
    Text uiText;                                    // UIText コンポーネント
    float currentTime;                              // 残り時間タイマー

    void Start()
    {
        // Textコンポーネント取得
        uiText = GetComponent<Text>();
        // 残り時間を設定
        currentTime = gameTime;
    }

    void Update()
    {
        // 残り時間を計算する
        currentTime -= Time.deltaTime;

        // ゼロ秒以下にならないようにする
        if (currentTime <= 0.0f)
        {
            currentTime = 0.0f;
        }
        int minutes = Mathf.FloorToInt(currentTime / 60F);
        int seconds = Mathf.FloorToInt(currentTime - minutes * 60);
        int mseconds = Mathf.FloorToInt((currentTime - minutes * 60 - seconds) * 1000);
        uiText.text = string.Format("{0:00}:{1:00}:{2:000}", minutes, seconds, mseconds);
    }
}
```
[メモ]VPCのIPアドレスに対して作成出来るサブネットの範囲

AWSで作成したVPCの中に複数のサブネットを作成出来ます。

たまにサブネットを作成しようとしてVPCの範囲外で作成しようとしてしまったり、よく理由がわからず作成出来ない、みたいなのがあったので、VPCと作成可能なサブネットの範囲をまとめました。


# サブネットとは
IPアドレスはサブネットマスクによりネットワーク部とホスト部に分けられます。

10.0.0.0/8の場合
・10：ネットワーク部・・そのアドレスが所属するネットワーク
・0.0.0：ホスト部・・ネットワーク内のコンピューターを識別する

10.0.0.0/16の場合、
・10.0：ネットワーク部
・0.0：ホスト部

10.0.0.0/24の場合
・10.0.0：ネットワーク部
・0：ホスト部

例えば10.0.0.0/16のIPレンジの中にサブネットを作成する場合、ホスト部の一部をサブネット部として利用することが出来ます。
なので例えば、10.0.0.0/24や10.0.1.0/24は10.0.0.0/16のサブネットとして利用することが出来ますが、10.1.0.0/16は元のIPレンジに入っていないので10.0.0.0/16のサブネットにはなりません。

# VPC = 10.0.0.0/16(IPアドレスの範囲)の場合
例えば、10.0.0.0/24をサブネットとした場合、
以下の5つはipとして利用出来ないようです。
・10.0.0.0：ネットワークアドレス
・10.0.0.1：VPCルーター用にAWSで予約
・10.0.0.2：AWS予約
・10.0.0.3：将来の利用のためAWS予約
・10.0.0.255：ネットワークブロードキャストアドレス