OmniAICreator/Qiita-1.07M huggingface dataset:
InputFieldに長い文を入力したら一部しか取得できなかった件

# InputFieldに入力した全文を取得するには

## 状況

InputFieldに枠を超える長さの文章を入力し、これをC# Scriptから取得しようとした。
そうしたら一部（InputFieldの枠内に表示される長さ分）しか取得できなかった。

使用バージョン：
Unity - 2018.2.14f1 Personal(64bit)

## InputFieldのtext取得方法は2種類ある

UnityのInputFieldは以下のような構造になっている。

(InputField)
　∟ (Placeholder)
　∟ (Text)

ユーザが入力したテキストは、

- (InputField).Text
- (Text).Text

の2種類で取得できるようだ。
しかし、この２つには少し違いがあり、(Text).Textでは上記のような一部しか取得できない。
全文を取得したいときは(InputField).Textで取得する必要がある。

## まとめ

(InputField).Textで取得する方が確実そうだ。
他にも２つの違いがあるのであれば追記していきたい。
Pythonの基礎中の基礎をグラレコでまとめる

よくTwitterとかで見かける勉強会とかのまとめを一枚の絵でまとめたやつ。
あれ、自分も出来るようになりたいなー。と思いました。

今まで「絵メモ」とか適当に呼んでたけど、「**グラレコ(グラフィックレコード)**」と呼ぶらしいです。


ちょうど、普段使ってないPythonの基礎を友人に教えることになったので、
復習がてらPythonの基礎の基礎をグラレコでまとめました。
それと、Qiita使ったことなかったので、その練習も兼ねて。

ただ、全体的にCとかJavaとかをそもそも知ってる人用のメモみたいになっちゃったので反省。


## (1) Pythonとは。文字列、数値で全てを扱う。

![s_pythonの基礎1 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/321104/3310e786-2e15-6469-031f-347b8fa15f59.jpeg)



## (2) Pythonの条件分岐。ifとwhile。
![s_pythonの基礎2.jpg](https://qiita-image-store.s3.amazonaws.com/0/321104/0589f35d-9d5e-3cb3-03e0-10a64a233091.jpeg)


## (3) Pythonの配列。リストと辞書。
![s_pythonの基礎3(配列).jpg](https://qiita-image-store.s3.amazonaws.com/0/321104/12693551-2376-1318-342c-9bf58b4b7143.jpeg)
CryptZombiesレッスン5(チャプター8~15)の自分なりのまとめ

# はじめに
この記事は私がCryptZombiesを進めていく上で自分なりにまとめたものです。
**前回の記事**
https://qiita.com/daichi77/items/a0e893706ff9419c66e1
**参考にしたサイト**
サイト名: イーサリアム上のDApp開発をゲームを作って学びましょう
URL: 　https://cryptozombies.io/jp/　
**この記事の問題文と答えについては上の参考にしたサイトから引用しています。**

# チャプター８ ERC721: takeOwnership
## 今回したこと(テスト)
approve関数とtakeOwnership関数の作成。
approve関数でゾンビを送る側の人が承認する。
takeOwnership関数でゾンビをもらう側の人がゾンビをもらえるか確認する。
といった流れ。

# チャプター９ オーバーフロー対策
# 要点
ERC721の実装が完了したがこれは最小限の実装である。
スマートコントラクトを書く際にオーバーフローとアンダーフローの回避に気をつけなければならない。
これらの問題をデフォルトで回避するために、OpenZeppelinはSafeMathという ライブラリ を作成している。

**オーバーフロー**
例としてuint8のような8ビットのものに256のようなそれ以上のサイズのものを入れたときのこと。
コントラクト内でこの対策をしておかなければならない。

# 今回したこと(テスト)
1. safemath.solのimport
2. using SafeMath for uint256;を宣言

```
using SafeMath for uint256;
```
と書くことでuint256からadd、sub、mulなどの関数を呼び出せるようになる(多分)

# チャプター１０　SafeMathパート2
## 要点
SafeMathのmulとadd関数はそれぞれ２つの引数を必要とするが、using SafeMath for uintを宣言する際、関数上で呼び出すuintは自動的に一つ目の引数として渡される。

```
using SafeMath for uint;
uint a = 10;//一つ目の引数
a = a.mul(3); // a now equals 6
a = a.add(5); // a now equals 11
```
**add**
２つのuintを+のようにただ足しているがassertステートメントを使ってオーバーフローをしないようにしている。
assertはrequireとほぼ同じだが微妙に違う。
requireは関数呼び出しが失敗した場合にユーザーにガスの残りを返却するが、このときassertはそうしない。 なのでコード中ではほとんどrequireを使った方がいい。
## 今回したこと
++と--をSafeMathメソッドで置き換え。

# チャプター１１　SafeMathパート3
## 要点
uint32やuint16のオーバーフローを防ぐためにさらに二つのライブラリを実装する必要がある。
## 今回したこと(テスト)
１＆２ SafeMath32とSafeMath16を使うことを宣言
３ ++のところをaddに変更

# チャプター１２
## 今回したこと(テスト)
ZombieAttack中の全加算++に、SafeMathメソッドを実装した

# チャプター１３ コメント
コメントの書き方はjsと似ていて

```
//コメント
```
このように//を書く。
複数行コメントの場合

```
/*
aaa
aaa
aa
*/
```
このように書く。
Solidityのコミュニティでは、 natspec というフォーマットを用いられている
**@title**と **@author**はそのままの意味
**@notice**はユーザーに、コントラクトや関数が何を行うか説明している。
**@dev**は開発者向けのさらなる詳細の説明。
## 今回やったこと(テスト)
実際に@author、@title、@devを書いた。

# チャプター１４、１５
特になし

# 5章までの感想
一通り学んだ結果ERC20トークンやERC721規格など具体的にどのように作られているかが分かって良かった。仮想通貨は取引するだけじゃなくて作るのも楽しいね！(これを書いてる時点で相場は死んでるけど)。
一周しただけでは全て把握するのはきついのでもう一周やるもしくは辞書的な感じで使うといいと思います。
６章ではweb３.jsを使ってフロントエンドの方もやるそうなので楽しみだぜいぜい
SORACOM IoT Buttonの監視をしてみる。

この記事は[SORACOM LTE-M Button powerd by AWS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/soracom) 9日目の記事になります。
すみません。時間オーバーしてしまいました。

さて、
SORACOMさん年末恒例の、#ソラコムサンタ に、実のところ、初めてちゃんとしたお願いをしてみました。

[該当Tweet](https://twitter.com/Keni_W/status/1066516118557184005)

経緯としては、
先日、2018.11.22 SORACOM Technology Camp 2018 ナイトイベントでLTをしました。

[LT時資料はこちら](https://www.slideshare.net/ssuser12e5d6/20181122-soracom-technology-camp-2018-lt)

このLTのために、ひたすら押し続けたわけですが、
そういえば、1500に近づいても、特に通知があるわけでもない。。。
これは欲しいぞ。
と思って、お願いしたわけです。

---

とはいえ、APIを使えば実装できるものではある・・・と思いまして、Lambdaで実装してみました。

履歴の管理は、とりあえず、DynamoDBに製造番号(serialNumber)をキーに保存しています。
直近の情報が知りたいので、保持し続ける必要はないと思って、DynamoDBにTTLを指定して勝手に消えるようにしています。

ほんとは、最近発表になった[Amazon QLDB](https://aws.amazon.com/jp/qldb/)使えるんじゃないかなーとか思って、Previewを申し込んでみたのですが、
流石にまだ申請通りませんでした。

今の段階の動きとしては、以下
1. ボタンクリック時に動作するLambda内でDynamoDBに回数や日時を格納
2. Cloudwatch Eventsで動くことを想定したLambda内でSORACOM APIの/gadgetsでアカウントに紐づくボタンの一覧を取得
3. serialNumberをキーに、DynamoDBから情報を取得し、閾値を超えていたらSlackに通知

私のアカウントのボタンの様子
<img width="780" alt="スクリーンショット 2018-12-10 1.15.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/d122e1ca-9faf-6244-1f9c-d1a137af4f25.png">

今の段階では、以下の閾値を設定しています。
- 残りクリック数 1490以下(普通は100以下ですかなと)
- DynamoDBにあるItem数が3以上(1日未満想定で3回クリックしていたらクリックし過ぎかなーと（1日400回近くクリックしていた人ですがw))

通知はこんな感じ
<img width="773" alt="スクリーンショット 2018-12-10 1.15.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/aac86b1a-d118-147b-455d-e084365d10f0.png">

※ BANSHEEだけ通知がないのは、Itemsの数が3で、残りクリック数が1491なので

--- 

ボタンによって、閾値を変えられるべきかと思うので、
ボタンのTagに閾値を持っても良いかなーと思うので、
今週中にその辺改修して、対応したソースをアップします。

---

なんか、ボタンでなんかしてみたって感じではないのですが、以上になります。
[未解決]SpinnakerをEC2にインストールして失敗した話

### 概要
* Netflixが公開している[Spinnaker](https://www.spinnaker.io/)をAWSで使っている事例が少なかったので、とりあえず使用感を試そうとインストールしてみました
    * Spinnakerはコンテナ環境の継続的デリバリをおこなうためのツール
    * kubernatesを使っている環境に向いている
* そもそもインストール失敗したので、実際にやった手順を紹介します
    * インストール自体はできた
    * 接続が面倒だった
    * リソースアクセスができなかった

### インストール
[インストール手順書](https://www.spinnaker.io/setup/install/)に従います

* 環境
    * Ubuntu, Debian, MacOSに対応しています
        * 今回はUbuntu16.04を使います

#### EC2の起動
* Ubuntu16.04のAMI(ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20180912)　を利用
    * Protectedサブネットに起動
    * 踏み台サーバと9000/8084で接続できるように

#### Halyardのインストール
https://www.spinnaker.io/setup/install/halyard/

```ruby:Halyardインストール
$ curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
$ sudo bash InstallHalyard.sh
$ . ~/.bashrc
```

#### Roleとアカウントの設定
https://www.spinnaker.io/setup/install/providers/aws/aws-ecs/
以下の信頼関係でロールを設定

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
                "Service": [
                  "ecs-tasks.amazonaws.com",
                  "ecs.amazonaws.com",
                  "application-autoscaling.amazonaws.com"
                ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

```ruby:アカウント設定
$ hal config provider ecs account add [ECSアカウント名] --aws-account [AWSアカウントID]
```

#### 環境設定
https://www.spinnaker.io/setup/install/environment/#local-debian

* テストなので、Local installations of Debian packagesを選択します

```
$ hal config deploy edit --type localdebian
```

#### Storage設定
https://www.spinnaker.io/setup/install/storage/s3/

* S3を使います

```
$ hal config storage s3 edit --region ap-northeast-1
$ hal config storage edit --type s3
```

#### インストール
```
$ hal config version edit --version 1.9.5
$ hal deploy apply
$ hal deploy connect
```

### 接続
* 踏み台経由でsshポートフォワーディングさせて接続させる必要がある
* 9000と8084のポートを開ける必要がある

```ruby:ターミナルで以下起動
$ ssh -v -L19000:localhost:19000 [踏み台ユーザー]@[踏み台IP] -t ssh -v -L19000:localhost:9000 -i [キーペア] ubuntu@[SpinnakerIP]
$ ssh -v -L18084:localhost:18084 [踏み台ユーザー]@[踏み台IP] -t ssh -v -L18084:localhost:8084 -i [キーペア] ubuntu@[SpinnakerIP]
```

* ブラウザで http://localhost:19000 に接続

### エラー
```
Error fetching applications. Check that your gate endpoint is accessible. Further information on troubleshooting this error is available here.
```

* こんなエラーが発生
    * どうやら[gate](https://github.com/spinnaker/gate)につながっていない模様
    * エラー詳細を追っていくとredisに繋がってない可能性も・・・


### 最後に
* インストール/セットアップだけしてとりあえず試そうと思ったんですが、うまくいかず・・・
* そもそもEKS(kubernates)じゃなくてECSに対して有効なツールなのかも不明
* これ必要だよってのがあれば教えてくださいm(_ _)m
ドメイン駆動設計における２つの『不変』

この記事は
[ドメイン駆動設計 advent calendar 11日目](https://qiita.com/advent-calendar/2018/ddd)
の記事です。

#日本語版だとわかりずらい「不変(不変条件)」

エヴァンスのドメイン本では、頻繁に「不変(不変条件)」という言葉が出てきます。Kindleで検索してみたところ、83件でした。

分類してみると、主に2箇所でよく使われています。
１つは「ValueObject(値オブジェクト)」の項。もう一つは「Aggregate(集約)」の項です。
Factoryでも多く使われていますが、こちらはAggregateの不変条件に関連する内容ですね。

さて、実は「ValueObject」と「Aggregate」で使われている「不変(不変条件)」の意味って全然違う意味なんです。
弊社でドメイン駆動設計の読書会をしているなかで、話題になり目から鱗が出てしまったので紹介しますね。

「ValueObject」と「Aggregate」の項をそれぞれよく読むと、「ValueObject」では**「不変」**、「Aggregate」では**「不変条件」**という言葉で表現されています。

そこで、エヴァンズ本の索引を見てみます。

#索引を読もう

索引を読むと、「不変」と「不変条件」の項目は別れて解説されています。

>- 不変(immutable) 生成された後、目に見える状態が変化しないという性質
- 不変条件(invariant) 何らかの設計要素についての表明で、常に真でなければならないもの。ただし、メソッドの実行中やまだコミットされていないデータベーストランザクション中といった特殊な過渡的状況を除く

なんと！！！元の英語の用語からして違う言葉！！！「不変」は「immutable」、「不変条件」は「invariant」という用語でした。

#原本を見てみよう
ということで原本を見てみましょう。

- ValueObject・・・When you care only about the attributes of an element of the model, classify it as a VALUE OBJECT. Make it express the meaning of the attributes it conveys and give it related functionally. Treat the VALUE OBJCET as immutable.

- Aggregate・・・The root ENTITY has grobal identity  and is ultimately responsible for checking invariants.

それぞれの要素の説明の一部を抜粋しましたが、やはり使い分けられてますね。

#英和辞典(英辞郎より)を見てみよう

さらに英和辞典で両方の用語を調べてみました。

>- immutable

>【形】
〔法則・規則・決定事項・運命などが〕変わらない、変化しない、不変の、不易の、変えることのできない、変更不可能な

>- invariant 

>【名】
《数学》不変式、不変量
《コ》不変条件
【形】
不変の、変わらない

うーん、いまいち。。。invariantの方は数学的な意味合いがある感じでしょうか？

#WikiDiffなるもので調べてみた

WikiDiffなるサイトがあり、ここでimmutableとinvariantのDiffを取ってみました。
https://wikidiff.com/immutable/invariant

- immutable
 - Unable to be changed without exception.
The government has enacted an immutable law.
 - (programming, of a variable) Not able to be altered in the memory after its value is set initially, such as a constant.

なんとなく、変更不可という意味合い。一度決まったら例外なく変更してはいけないという意味合いでしょうか。

- invariant
 - not varying; constant
 - (mathematics) Unaffected by a specified operation (especially by a transformation)
 - (computing, programming) Neither covariant nor contravariant. 

なんとなく、変更不可といった意味ではなく、変化しない、他から影響されては変化しない。といった意味合いに思えます。

# もう一度、Aggregateの不変条件とは

もう一度、Aggregateの不変条件について考えてみます。実は不変条件とは何かということについては、書籍内で明確に説明されています。

> 不変条件(原書ではInvariant)とは、データが変更される時は常に維持されなければならない一貫性のルールで、集約のメンバ間の関係も含んでいる。複数の集約にまたがるルールはどれも、常に最新の状態にあるということが期待できない。イベント処理やバッチ処理、その他の更新の仕組みを通じて、他の依存関係は一定の時間内に解消できる。しかし、1つの集約内で適用される不変条件は、各トランザクションの完了によって強制される。

# 要するに・・・

invariantについては、書籍内でその意味が再定義されているということですね。
なので、immutableとは明確に意味が違うので、用語も分けているというわけでした。

これが何の役に立つかと言われると微妙なところですが、「不変」という用語を複数の意味で使われていると思っていた方にとっては少しは意味が明確になるのではないかと思い記事にしてみました。。。
echoとprintの違い

PHPを入力していて、echo表示とprint表示の違いを気にしたことはありませんか？
どちらも「括弧()」は必要ないうえに、文字列も出力します。

そこで、今回は、この2つの特徴を説明したあと、違いをそれぞれ執筆したいと思います。

#echo表示
echoは、一つ以上の文字列を出力するときに使用します。
複数の文字列を出力したいときは、「,（カンマ）」で区切れば可能です。
そして、文字列の場合は「"(文字列)"」と入力すれば、表示されます。

また、変数も表示させることができます。
このときは「""」は必要ありません。

その他に、返り値なく、引数を複数指定することができます。



##print表示
printは、文字列を表示させられますが、複数の文字列は不可能です。
また、返り値は「1」を繰り返します。
そして、引数は一つだけ指定することができます。


###違い
この結果、echoとprintの違いは次のようにまとめられます。

・echoは複数の文字列を出力できるが、printは一つしかできない。
・戻り値が違う。
・引数の数の出力が違う。
【Google AI Blog 翻訳】畳み込みニューラルネットワークを用いたザトウクジラの音響探知（2018/10/29）

###[Acoustic Detection of Humpback Whales Using a Convolutional Neural Network](https://ai.googleblog.com/2018/10/acoustic-detection-of-humpback-whales.html)
*Monday, October 29, 2018*
*Posted by Matt Harvey, Software Engineer, Google AI Perception*

ここの数年間、Google AI Perceptionチームは、非音声キャプション、動画の分類、インデックス化などYouTubeに適応された音声イベントの分析技術を開発しました。さらに、コミュニティの研究を更に促進するために、AudioSet評価セットを公開し、幾つかのモデルコードをオープンソース化にしました。近年、多くの保護団体が大量の音響データを収集していることにますます気付いています。野生生物のモニタリングと保護に力を貸すためには、これらの同じ技術をそのデータに適用することが可能かどうかを疑問に思いました。

AI のソーシャルグッド プログラムの一環として、米国のアメリカ海洋大気庁（NOAA）の太平洋諸島漁業科学センターと協力して、太平洋の幾つか場所から取得した15年間の水中記録からザトウクジラの鳴き声を識別するアルゴリズムを開発しました。研究の結果は、ザトウクジラの存在、季節性、日常の歌を歌う習性、および集団構造に関する新しく重要な情報を提供します。これは、科学者が今まで関連情報を持っていなかった遠隔の無人島にて、特に重要です。さらに、当該のデータ・セットは長い時間をわたるため、ザトウクジラはいつまたどこで鳴き声をすることを知ることで、特に人類の海洋活動の増加に関連する動物の分布はこの数年間に変化したかどうかの情報が得られます。その情報は、ザトウクジラに対する人為的影響を効率的に緩和するための重要な要素となるでしょう。

![image10.png](https://qiita-image-store.s3.amazonaws.com/0/194463/f7b51cad-d56c-a08d-69d3-9ae736035675.png)
*HARPの展開場所。緑：現在稼働中の記録場所。赤：以前の記録場所。*

##つづき
WebSocketでチャットを作ったらN高生たちにめちゃくちゃに壊された件

# はじめに
N高等学校2年のKakudoです、初めてアドベントカレンダーを書かせていただきます。よろしくお願いします。

さて、WebSocketを使ってみようと簡単なWebアプリを作って公開したところ先輩方にありがたい「ご指導」をたくさんいただいたので、身をもって学んだことを書こうと思います。

**今回の話は同意の上でやってることなので、「勉強」等と称して他の人のサイトを攻撃するのはやめてください！**

## プレイグラウンドと化したアプリについて
本題から離れるので詳しくは書きませんが、WebSocketでリアルタイムで投稿内容が共有される掲示板のようなサイトです（チャットアプリに近いと思います）。
[GitHub Repository](https://github.com/kakudo415/webchat)

# 「ご指導」 と 対策
## XSS (Cross Site Scripting)
攻撃者が作ったスクリプトを閲覧者のブラウザで実行させる行為（Cross Siteという名称は歴史的なものらしい・・分かりにくい）。
### ご指導
最初、サーバーからクライアント全員にメッセージを共有する際、クライアントJSではテンプレート文字列を使ってHTMLを生成していました。
`msg.message` に投稿の内容が入って送られてくるとします。

```js
document.getElementById("message-area").innerHTML += `<div>${msg.message}</div>`;
```

お分かりの通り、このコードではサーバーから送られてきた新規メッセージをそのままHTMLに突っ込んでしまっています。
このため、HTMLやJavaScriptとして意味を持つ文字列が送られてきてしまうと、ブラウザで任意のコードが実行できてしまいます。

例えば、`<style>` タグ等を入れられてしまうと急にWebページが回転しだしたり、サーバークライアント間の通信に使っているJSONで特別な意味を持つ `"` (ダブルクオーテーション)等が入るとサーバーでJSONがパースできなくなって落ちたりします。
### 対策
テンプレート文字列からではなく、JSの `createElement()` を使う。

```js
const msgElm = document.createElement("div");
msgElm.textContent = msg.message;
document.getElementById("message-area").appendChild(msgElm);
```

`textContent` に入れることでブラウザがHTMLやJSなどの特別な文字列として処理しなくなるので、防ぐことができます。

また、送信時のJSONを作るときは

```js
let data = `{msg: "${messageInput.value}"}`;
```

等のように文字列を直接作るのではなく、以下のように

```js
let data = JSON.stringify({
  msg: messageInput.value
});
```

Objectを `JSON.stringify()`で変換する形をとることで、`"` 等がエスケープできる。

## メッセージの長さ制限
### ご指導
<img width="604" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/271592/1d1dc6b5-93f2-01fe-33f8-767490467a5a.png">
3000万を超える文字数が送られてきたら流石に重くなりますね･･･(実際にブラウザがカックカクになりました)。
### 対策

```js
if (data.length > 1000) {
  throw 'too long';
}
```

これで完了かというと**そうではない**。
### さらにご指導を受けた
ブラウザからこういう感じで送られると先述のでは弾けないです。

```js
socket.send(JSON.stringify({message: ["something".repeat(でかい数)]}));
```

つまり、こういうこと

```json
{message: ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]}
```

ポイントは配列になっていることで、 `length` が配列長の **1** になってしまう！！

```js
if (typeof message !== 'string') {
  throw 'not string';
}
```

なので、こんな感じで配列などの文字列以外のデータを弾くようにしないといけません。
### まだご指導が続く
そもそもチェックするまでに落とされると困ります。
つまり、ここまでの方法はメモリを逼迫させるほどのリクエストが投げつけられることを想定していません（512MBしかメモリ積んでないサーバーに256MBのリクエストが飛んできて、そのままメモリに載ってしまうと一瞬で使い切ってプロセスが落とされてしまう、というか落とされた。）

```js
const server = new wsServer({
  maxPayload: 10000
});
```

ここで `maxPayload` で制限することで、それを超えるリクエストが許可されなくなります。

# 運よく被害はなかったけど気を付けるべき「ご指導」
## UTF-8（emojiなど）
今回、データベースへのメッセージの保存をしていないため（再起動すると履歴は消える）影響はなかったですが、emoji等(そもそも非ASCII文字だけでも)データベースが対応してない場合エラーとなってしまいます。なので、文字コードは前もって確認しておくべきです（今回ではないですが、以前それでエラーが出ました）。
RPG制作ソフト👾や地形生成のまとめ

#せいさくはっぴょう

この1年間制作したものとかの開発環境まとめ。

#基本開発環境

|**OS:**|**Windows 10 Home**|
|:---|:---|
|**PC:**|**HP Spectre x360**|
|**CPU:**|**Intel Core i7-7500U 2.70-2.90GHz**|
|**RAM:**|**16GB**|
|**ROM:**|**SSD 512GB**|
|**IDE:**|**Visual Studio 2017**|
|**言語:**|**C11/C++17(11,14,17)**|
|**:**|****|

#[👾RPGメイキングツール👾](https://qiita.com/Gaccho/items/b958963144eb9abbb048)

[![scrpg.png](https://qiita-image-store.s3.amazonaws.com/0/213065/82334964-37ef-e21c-79c9-e3afc2fd3b47.png)](https://qiita.com/Gaccho/items/b958963144eb9abbb048)

**『RPG作るツール』**

###情報

|**IDE:**|**Visual Studio 2017**|
|:---|:---|
|**言語:**|**C++11**|
|**GitHub:**|**[AsLib](https://github.com/Kasugaccho/AsLib)**|
|**Qiita:**|**[👾👾RPGツ◯ールをツクール👾👾](https://qiita.com/Gaccho/items/b958963144eb9abbb048)**|

RPG制作ソフトを作った。
RPGは昔からとても好きで、"いつかRPGを作りたい"と思っていたら
ついRPGを作るソフトを作ってしまった。

これからもRPGについて研究したい。

#[🚪ローグライクダンジョン生成🚪](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf)

[![scrpg.png](https://qiita-image-store.s3.amazonaws.com/0/213065/ef26da46-6444-e757-3e02-f96d3de1e4b9.gif)](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf)

**『ローグライクダンジョンジェネレータ』**

###情報

|**IDE:**|**Visual Studio 2017**|
|:---|:---|
|**言語:**|**C++14**|
|**GitHub:**|**[DTL_RogueLike](https://github.com/Kasugaccho/DTL_RogueLike)**|
|**Qiita:**|**[完全ローグライクダンジョン生成アルゴリズム🚪](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf)**|

#[くらげ いくせい](https://qiita.com/Gaccho/items/92996120fdc8f77a471e)

[![scrpg.png](https://github.com/Kasugaccho/Jellyfish/raw/master/screenshot/jellyfish.gif)](https://qiita.com/Gaccho/items/92996120fdc8f77a471e)

**『クラゲの育成』**

###情報

|**IDE:**|**Visual Studio 2017**|
|:---|:---|
|**言語:**|**C++11**|
|**GitHub:**|**[Jellyfish](https://github.com/Kasugaccho/Jellyfish)**|
|**Qiita:**|**[育成ゲームを作ったはなし](https://qiita.com/Gaccho/items/92996120fdc8f77a471e)**|

#[マヤ文明の数字(マヤ数字)を生成する](https://qiita.com/Gaccho/items/631b4dd0982a3eadabea)

[![0](https://qiita-image-store.s3.amazonaws.com/0/213065/8f21fc05-dc5e-0580-4626-1cd9c5c1512a.png)](https://qiita.com/Gaccho/items/631b4dd0982a3eadabea)

**『マヤ数字』**

###情報

|**IDE:**|**Visual Studio 2017**|
|:---|:---|
|**言語:**|**C++11**|
|**GitHub:**|**[Maya-Glyph](https://github.com/Kasugaccho/Maya-Glyph)**|
|**Qiita:**|**[マヤ文明の数字(マヤ数字)を生成する](https://qiita.com/Gaccho/items/631b4dd0982a3eadabea)**|

空前のマヤ文明(マイ)ブームが巻き起こったので作った作品。
作っていた時、ひたすらマヤ文明の文献をあさっていたのが懐かしい。
勉強がてらWeb Appを作成する

自宅で簡単なWeb Application を作成しよう、とふと思い立った。
思い立ったので、作業内容を自己メモ的にQiita にまとめていこうと思う。

# 今考えているストーリー

* Windows 7 (Desktop) にVM Ubuntu を立てる

☆最終的には Cloud 上にインスタンスを作って動かしたい

* Ubuntu を仮のサーバと見立てて、そこにWeb App + DB をのっける
* Git で連携して動作確認

# 前提
* 開発は できる限り iPad で行う(!)

理由：iPad でどこまで開発できるか知りたいから
Coda を使えばSSH とかコーディングとかできそうだし何とかなるのではないかと考えている。
3000 JPY するけど。。。

取り敢えず、サーバ(仮)を作るところから開始。
## Windows 7 (Desktop) にVM Ubuntu を立てる

1. [VirtualBox をダウンロード。][1]バージョンは5.2.22 
2. [Ubuntu イメージをダウンロード。][2]バージョンは18.04
3. Ubuntu VM を作成。[ここ][3]を参考にさせていただいた。

さっそく Ubuntu を起動…マウス操作があり得ないほどもっさりして困る。
☆[ここ][4]を参考にさせていただき解消。
4. Ubuntu 上で `openssh-server` をインストール
5. ついでにSSHのパスワード認証およびroot によるログインを禁止にしておく。
6. Ubuntu 上で鍵を生成し、Coda に登録。

## Ubuntu に iPad からアクセス

VirtualBox > 設定 > ネットワーク > ポートフォワーディングの設定を行うことで、
ホスト(Windows 7)に割り当てたポート(例えば2222※)を経由して
ホストと同じLAN上にあるiPad から ゲストOS(Ubuntu)にアクセスできることを確認した。

※ 事前にホストのファイアウォールの2222ポートを開けないとダメでした。

Coda のターミナルからUbuntu にSSH できたところで今日のところはおしまい。
文章にすると簡潔だが、実際にアクセスできるようになるまで結構時間がかかった。。。

# 今後の方針

取り敢えずフロントとサーバサイドに何を使うか考え中。
触ったことがない`python`で書いてみようかな。


[1]:https://www.virtualbox.org
[2]:https://www.ubuntulinux.jp/download/ja-remix
[3]:https://unofficialtokyo.com/2016/12/virtualbox-ubuntu-on-windows/
[4]:https://hodalog.com/virtualbox-setting/
cython でコードの秘匿化だけしたかったのにハマった事

# cython でpythonコードを秘匿化する
配布用にビルドした資材のソースコードを、秘匿化して二次利用や改変などを防ぎたい。
そこでcython を使ってコンパイルし、バイナリファイルを配布するようにした。

cythonの公式ドキュメントなどを読みつつ秘匿化を進めていたが、
単純にcython導入してコンパイルするだけでは上手くいかないところがあったため
回避方法をここに残す。

## 環境や構成
python 3.6（flask）
AWS API Gateway ＋ AWS Lambda

秘匿化するファイルは、Lambdaにアップロードするバックエンドの処理を記したコード群

## cython のセットアップ
cythonの利用を始めるのに必要なコマンドは以下。
python利用している人ならばpip 入っているだろうと思うので割愛。

ちなみにunix 用です。mac、windowsはgccに変わる物を用意する必要あり。

```console
$ pip install cython
$ sudo yum install gcc
$ sudo yum install python36-devel
```

## cython でシンプルなpythonコードは秘匿化しやすい
公式ドキュメントにも書いてある通りのコンパイルは簡単にでき、
importも問題なくできる。

```text
# file構成
example
　　┣hello.pyx
　　┣setup.py
　　：

```

hello.pyxには`print（'Hello World'）`しか書いていない。

```python
# setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = "My hello app",
    ext_modules = cythonize('hello.pyx')
)
```

この記述でexample ディレクトリ内で以下のコマンドによりビルドする
`$ python setup.py build_ext --inplace`

ディレクトリ内に`.c` `.so`ファイルが作成される。
soがバイナリ化されたファイルで、秘匿化が目的のためsoファイルを配布用のパッケージに含める。

試しに別のディレクトリ`build` を作成し、そこに作成された`.so`ファイルを移動させ、
同じディレクトリ内に`myapp.py` を作成し、`import hello`と記述しておく。

```text
# 試し用
myapp
　　┣hello.xxxxxxx.so
　　┣myapp.py
　　：

```
※xxx…はコンパイルしたOSにより名称が変わる

myapp ディレクトリで`$ python myapp.py`とコマンドを入力すると「Hello World」と出力される。

目的がC/C++のライブラリとpythonを絡める、実行速度を向上する場合は`.c`が必要。
そっちの方はあまり学習していないため解説はできません。

## flask.app のrootと組み合わせたときに引っかかった
Lambda にsoファイルをアップロードし、リクエストを送信すると以下のエラーが起きた。

```
TypeError: example_method() takes no keyword arguments
```

単純なお試し用のコンパイルしたファイルとは違い、flaskを起動させてリクエストや引数なども
メソッドに渡しているので、流石にcythonで”良しなに”とはいかない様子。


## キーワード引数の渡し方
メソッドの受け取り方が良くないらしく、routeメソッドに関しては以下のような修正が必要でした。

```python
：
：
@app.route（'/myapp/menu-list/reg/<username>',　methods=['POST'])
def register_menu（username):
    result = 'this code is TypeError'

@app.route（'/myapp/menu-list/reg/<username>',　methods=['POST']）
def register_menu（*args, username):
    result = 'this code is No Error'

```

flaskが引数キーワード（username=username のような）でURL内の変数を渡すため、
cython　化したファイルでpythonとして使う場合 `*args、**kwargs`を使う必要がある。


## 実行メソッド名は取得できない
これもピンポイントな用途ですが、実行中のメソッド名を取得したいがために、
メソッド内で`sys._getframe().f_code.co_name` を使用してました。

これcythonで秘匿化する前は上記例だと「register_menu」として取れていたのですが、
秘匿化して.soファイルにするとメソッド名が「dispatch_request」というメソッド名に変わってしまいます。

inspectを使用して`inspect.getframeinfo(inspect.currentframe())[2]`でも同様でした。
詳細に読み解いてませんが、おそらくcythonコンパイルするとapp.route系のメソッドはC言語で扱うために
一元化されている気がします。

同じようにcython で秘匿化しメソッド名を取得するような処理を書いている場合は、app.route内の
名称取得を他に考える必要があります。
自分はrouteのURLをrequest.pathで取得し加工することで回避しました。



以上、cython化でハマった事の対処と回避策でした。
purescript-simple-jsonで型が不定なJSONをマッピングする

[purescript-simple-json](https://github.com/justinwoo/purescript-simple-json)は神。

---

稀によく、こういうAPIを見かけます。

```json-doc
{
  "name": "json1",
  "result_type": "intarray", // result_typeとかいう謎カラムで
  "result": [ 1, 2, 3 ] // resultの型が変化する！！！
}
```
```json-doc
{
  "name": "json2",
  "result_type": "boolean",
  "result": true // 今度はboolだ……
}
```
```json-doc
{
  "name": "json3",
  "result_type": "mydata", // mydataとは……？
  "result": { // objectだってあるぞ！！
    "name": "myname",
    "value": "abcdef"
  }
}
```

(**死**)

こういうのをうまいことマッピングしたいんですけど、どうすればいいんでしょうかね。

## 型を考える

まずは、各`result`に対応する型を定義しちゃいましょう！

```haskell
data Result
  = IntArray (Array Int) -- コンストラクタ名は適当
  | BoolValue Boolean
  | MyData { name :: String, value :: String }
```

そして、最終的にほしいデータ型を作ります。

```haskell
-- 実際にほしいのはこの型
type Response' = { name :: String, result :: Result } -- Resultが直和型だったらresult_typeは不要ですよね！

-- newtypeでラップする必要があるのでこうする
newtype Response = Response Response'
```

最後に、生Jsonに対応する型にも名前を付けちゃいましょう。

```haskell
type ResponseJSON =
  { name :: String
  , result_type :: String
  , result :: Foreign -- resultは`Foreign`型で受ける！
  }
```

準備は整いました！

## ReadForeignのインスタンスにしちゃおう

purescript-simple-jsonがプロパティを読むためには、レコードのメンバが`ReadForeign`のインスタンスであればいいです。ということは、

```haskell
instance readForeignResponse :: ReadForeign Response where
  readImpl o = do
    { name, result, result_type } :: ResponseJSON <- readImpl o
    Response <<< { name, result: _ } <$> case result_type of
      "intarray" -> pure <<< IntArray =<< readImpl result
      "boolean" -> pure <<< BoolValue =<< readImpl result
      "mydata" -> pure <<< MyData =<< readImpl result
      other -> fail <<< ForeignError $ "cannot read result_type: " <> other
```

ハイ終わり！！！！

## 読める……読めるぞ！！

```haskell
main :: Effect Unit
main = do
  case readJSON json of
    Left error -> traverse1_ logShow error
    Right (Response { name, result }) -> do
      logShow name
      case result of
        IntArray arr -> logShow arr -- [ 1, 2, 3 ]
        BoolValue b -> logShow b -- true
        MyData d -> logShow d -- { name: "myname", value: "abcdef" }
```

# おわり

* purescript-simple-jsonは神
* jsonで型が一つに定まってなくてもどういうデータが来るのか分かってればマッピングできる
* justin-san(@kimagure)拝み倒していく
* PureScriptめっちゃいい言語
VueCLIを使わずにauto-routingする

この記事は[Vue.js #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vuejs-2)の10日目の記事です。

皆さんVueCLIつかってますか？
あるいはNuxtを使っていますか？

新しいプロジェクトならぜひとも新しい技術を試してみたいものです。
しかし、実際の開発現場に新しい技術やパラダイムを持ち込むのは簡単ではありません。
VueCLIやNuxtまで落とし込めない状況もあります。

例えば、すでに動いているサービスに検証として一部Vueのパラダイムを持ち込む、など。

VueCLIやNuxtの導入までいければ楽なんですけど、
一度にたくさんのパラダイムを持ち込みすぎるとキャッチアップのコストも高いですし、段階的に導入していきたいという要望もあります。

それでも僕はVueRouterを自動生成したい！

そこで、今回はVueCLIやNuxtを使わずにVueRouterでauto-routingする方法をご紹介します。

## vue-cli-auto-routing

[vue-cli-auto-routing](https://github.com/ktsn/vue-cli-plugin-auto-routing) は
Nuxtの自動ルーティング、及びレイアウトの機能をVueで実現するためのVueCLIプラグインです。

内部的には以下のモジュールから構成されていて、VueCLIを使わずともWebPackでバンドルできるようになっています。

* [vue-router-layout](https://github.com/ktsn/vue-router-layout)
* [vue-auto-routing](https://github.com/ktsn/vue-auto-routing)
* [vue-route-generator](https://github.com/ktsn/vue-route-generator)

いまはまだNuxtを導入するか、VueCLIを導入するか決めかねているけど取り急ぎこの仕組が欲しいって方は、
これらをnpm installして設定を追加するだけでNuxtのディレクトリ構成とアーキテクチャで実装が可能です。

## 実装方法

### ディレクトリ構成

こんな感じでディレクトリを組むとします。

```
+- src/
  +- layouts/
  +- pages/
  +- App.vue
  +- router.js
  +- index.js
+- webpack.config.js
+- package.json
```

### installation

```console
npm install --save vue-auto-routing vue-router-layout
```

### webpackの設定

* vue-router-layoutとvue-auto-routingでNuxtで

```js:webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const VueAutoRoutingPlugin = require('vue-auto-routing/lib/webpack-plugin')

module.exports = {
  entry: { /* your setting */ },
  output: { /* your setting */ },
  module: { /* your setting */ },
  resolve: {
    // importPathが`@/pages/`なのでnuxtと同じaliasを用意する
    alias: {
      "~": path.join(srcDir),
      "~~": path.join(rootDir),
      "@": path.join(srcDir),
      "@@": path.join(rootDir)
    }
  },
  plugins: [
    new VueLoaderPlugin(),
    new VueAutoRoutingPlugin({
      // `pages`のディレクトリパス
      pages: `src/pages`,
    }),
  ]
}
```

### router.jsの設定

ここでLayoutとRouterの設定を行う。

```js:router.js
import Vue from "vue";
import Router from "vue-router";
import routes from "vue-auto-routing";
import { createRouterLayout } from "vue-router-layout";

Vue.use(Router);

const RouterLayout = createRouterLayout(layout => {
  return import("@/layouts/" + layout + ".vue");
});

export default new Router({
  routes: [
    {
      path: "/",
      component: RouterLayout,
      children: routes
    }
  ]
});
```

### layoutの作成

```vue:src/layouts/default.vue
<template>
  <article>
    <header>
      <h1>example layout</h1>
    </header>
    <div class="body">
      <router-child />
    </div>
  </article>
</template>
```

### pagesの作成

```vue:src/pages/index.vue
<template>
  <p>hello auto routing</p>
</template>

<script>
export default {
  layout: 'default' // default
}
</script>
```

### buildの実行

```
npx webpack --config webpack.config.js
```

## まとめ

今回は、限られた環境を打開する一つの手段として、vue-auto-routing及びvue-router-layoutの使い方をご紹介しました。
便利なツールをつかってよりすばやく価値をデリバリーできる環境を作っていきましょう

なお、今回のコードは以下にサンプルを置いてます。
https://github.com/rymizuki/example-vue-auto-routing
[Angular] 入門 - 基本編 1

ではサクサクと次、Angularの基本をおさらいしていきます。

先ほどの記事では、まずAngularを開発する環境を用意して初めてのAngularアプリを実行してみる。という所まででした。

# 前回からのあらすじ

> Angularはいくつもの部品で構成されていて、その部品をModule(モジュール)と呼んでいます。また表示するページのUIの部品をComponent(コンポーネント)と呼んでいます。　Angularアプリがたちがる際にはスタート時にMain.tsが読み込まれます、まずはここを見てきましょう。

ということで、今回はサンプルアプリの内容を見て、どのようになっているか見てみます。

# まずは main.ts と index.html

## main.ts
まず、一番はじめに実行されるmain.tsを見てみます。

```typescript:/ClientApp/main.ts
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

export function getBaseUrl() {
  return document.getElementsByTagName('base')[0].href;
}

const providers = [
  { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }
];

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic(providers).bootstrapModule(AppModule)
  .catch(err => console.log(err));
```

ディフォルトモジュールをインポートして、ブラザーを立ち上げるみたいなことが記載されています。

## index.html

では、これと同時に、アプリが動作するメインページとなるindex.htmlを見てみましょう。

```html:/ClientApp/index.html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>NodejsWebAppAngularTutorial1</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root>Loading...</app-root>
</body>
</html>
```

はい、なんたること書いてないですね・・　`<app-root>Loading...</app-root>`の部分にてアプリのルートコンポーネントを指定しています。というだけです。

`main.ts`に関してはまた、後程詳しく説明していきます。（入門編では、あとで詳しく説明するみたいなのが連発されますのであしからず）

# コンポーネントデコレーター | app.component.ts 

`index.html`に表示されるコンテンツはもう一つ深い階層にある`app.component.ts`にあります。

```typescript:/ClientApp/src/app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
}
```

ここではまず、UIのコンポーネントを扱うため `import { Component } from '@angular/core';` にてコンポーネントオブジェクトをインポートしています。　次に`@Component`(コンポーネントデコレーター)を宣言し、`selector` セレクター、`templateUrl` テンプレートUrl、`styleUrls` スタイルUrlを指定しています。

ここも、まだはじめの方なので、深く考えずにサクサク進みましょう。

# テンプレート | app.component.html
最後に `AppComponent`というモジュールクラスを生成し、その中にtitleというオブジェクトに対して'app'という名前を設定しています。

先ほどのindex.htmlにあった`<app-root>Loading...</app-root>`をselectし、そこに`templateUrl`を介して `./app.component.html`を表示していることがここでわかります。

```html:/ClientApp/src/app.component.html
<div class='container-fluid'>
  <div class='row'>
    <div class='col-sm-3'>
      <app-nav-menu></app-nav-menu>
    </div>
    <div class='col-sm-9 body-content'>
      <router-outlet></router-outlet>
    </div>
  </div>
</div>
```

また・・さらに別のコンポーネントによって、`<app-nav-menu></app-nav-menu>`と`<router-outlet></router-outlet>`が指定されていることが読み取れます。

# 次、データバインディング
では、次はデータバインディングを見ていきましょう。コンポーネントに対して様々な値を設定して表示する仕組みはAngularのコアとなる部分です。
PHPで標準入出力をテストする

**頂いたコメントを元に、新しく記事を作成しました。**
**PHPで標準入出力をテストする（改め）**
**https://qiita.com/AraiKotaro/items/f6f61bb24c194c048275**

## dockerでPHPUnitを導入

```bash
$docker pull phpunit/phpunit
````

## PHPコードを作成

````Lines.php
<?php
class Lines extends \PHPUnit\Framework\TestCase
{
        public static function main()
        {
                echo('test');
        }
        function testMain()
        {
                ob_start();
                Lines::main();
                $actual = ob_get_clean();
                $expected = 'test';
                $this->assertEquals($expected, $actual);
        }
}
Lines::main();
?>
````

## 標準入力テストデータを作成

````test.txt
test
````

## テスト実行

````bash
$docker run -v (Lines.phpのあるディレクトリ):/app phpunit/phpunit Lines.php < test.txt
````


## 結果

````bash
$docker run -v (Lines.phpのあるディレクトリ):/app phpunit/phpunit Lines.php < test.txt
test
PHPUnit 6.5.13 by Sebastian Bergmann, Julien Breux (Docker) and contributors.

.                                                                   1 / 1 (100%)

Time: 120 ms, Memory: 4.00MB

OK (1 test, 1 assertion)
````

## 参考
http://miko.info/?p=1118
https://qiita.com/mosaxiv/items/f58bb7e141d9f7e85c75
Azure DevOps Service Status Portalで各サービス/リージョンの状態を確認

#はじめに
本記事は[Azure DevOps Advent Calendar 2018](https://qiita.com/advent-calendar/2018/azuredevops)の5日目（の穴埋め）としてAzure DevOps Service Status Portalを紹介するものです。

# [Azure DevOps Service Status Portal](https://status.dev.azure.com/)

クラウドサービスの場合、サービスに異常が発生し急につながらなくなっても、サーバ等の実物を確かめられなくてどのような状況か不安になりますよね。
Azure DevOpsには以下の画面が用意されています。
これは各サービス/リージョンのヘルスチェックの結果を表示しているものです。

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/146488/d2e79fdf-3506-0b57-b0f8-3f9c78714b8b.png)

## [Status history](https://status.dev.azure.com/_history)

[Status history](https://status.dev.azure.com/_history)では状態異常についての履歴を確認できます。

![0012.PNG](https://qiita-image-store.s3.amazonaws.com/0/146488/5eb08a20-b8d3-1077-c3af-12125d5860ef.png)

何かあったときに状況が一覧で確認できるものが用意されていると安心しますよね。
（何も起こらないのがもちろん良いのですが。）


以上です。
【小ワザ】「名前を指定して実行」から任意のプログラムを実行する

##なにができるようになるの？
Win+R　で起動する「名前を指定して実行」から任意のプログラムを実行できるようになる。

もう少し具体的に言うと、
任意のディレクトリに格納したプログラムを実行（ファイルを開く、バッチを実行 などなど）できるようになる。

##準備

- プログラムを格納するディレクトリを用意する

- コマンドプロンプトからプログラムの格納先ディレクトリのパスを通す

（~~は任意のディレクトリパスに変更してください）


```
$ SETX /M PATH "%PATH%;C:\~~
```

↓パスが追加されたか確認（一行で出力される）

```
$ echo %PATH%
```


- パスを通したディレクトリに実行したいプログラムを格納する（このあと名前を変更するのでショートカットがオススメ）
- プログラムの名前を覚えやすい名前に変更する（プログラム名が実行コマンドになるので）


これだけ！
あとはWin+Rで「名前を指定して実行」を起動して、
先ほど変更したプログラム名を入力して実行するだけ！
NVIDIA OptiXが静止画とアニメーションで活用できる場面

この記事は[Houdini Advent Calendar 2018](https://qiita.com/advent-calendar/2018/houdini) 13日目の記事です。

##はじめに
画質を維持しつつレンダリング時間を短縮することは、常に関心事だと思います。
1年前、2017年12月に発表されたNVIDIAのOptiX denoiserを使用したレンダリング時間に感動を覚えました。
画質はともかく、速いことは良いことです。

しかし、当たり前すぎるのかOptiXについての記事はあまり目にしません。
どの程度ノイズが軽減され、画質はどうなるのか比較してみます。

[【公式】NVIDIA® OptiX™ AI-Accelerated Denoiser](https://developer.nvidia.com/optix-denoiser)

##環境
- Houdini indie 17.0.352
- REDSHIFT 2.6.26
- Windows 10

##画質の比較
###静止画
画質を比較します。
画像は1920x1080pxから等倍で切り出しています。

- Progressive Rendering passes **32**
![compare_denoise_01.png](https://qiita-image-store.s3.amazonaws.com/0/233336/e524758e-3597-af40-cdf1-3b63c7403242.png)
明らかなノイズが出ています。

- Progressive Rendering passes **1024**
![compare_denoise_02.png](https://qiita-image-store.s3.amazonaws.com/0/233336/a37b6398-9b69-ce17-7a10-7dde289d11f9.png)
ノイズはかなり減少していますが、まだザラつき感が少しあります。

- **OptiX**、Progressive Rendering passes **32**
![compare_denoise_03.png](https://qiita-image-store.s3.amazonaws.com/0/233336/962b14dc-e93f-634b-4a21-4fd7f446e359.png)
ザラついたノイズは軽減されましたが、完全ではありません。
エッジの部分ではピクセルが溶けたような不鮮明な状態が見られます。
被写界深度によりボケている部分は、影部分の階調がジャンプしているような外観です。
![redshift_camera_optix.jpg](https://qiita-image-store.s3.amazonaws.com/0/233336/c7bd0708-a072-d840-4fb0-37f0bac8d00a.jpeg)
OptiXのセッティングはデフォルトのままです。
ノイズ低減の最適なパラメータを探すとよりよい結果が得られる可能性があります。
しかし、画質の向上を求めるのであれば、AIによる学習から結果を出力するOptiXのデノイズは本質的な解決にはならないと考えます。

###アニメーション
GIF画像の簡易アニメーションで比較します。
比較対象は次の2つです。
- **OptiX**、Progressive Rendering passes **32**
- Progressive Rendering passes **1024**
![compare_denoise_640x360.gif](https://qiita-image-store.s3.amazonaws.com/0/233336/cdadc0e6-aaa4-2694-af3f-5f7dd2b7ccaf.gif)
上のGIF画像は1920x1080pxから640x360pxへ33%縮小しています。
この状態でもディティールが失われモヤモヤとしている様子が見られます。
![compare_denoise_640x360_magnificate.gif](https://qiita-image-store.s3.amazonaws.com/0/233336/e0353f3d-6cbf-137f-ce0a-4b4eeb8f8575.gif)
上のピクセル等倍サイズでは、ノイズが軽減された代わりに何が起きているのかがよくわかります。
各フレーム間で処理が連続していないためだと思われる、ちらつきが発生しています。
サンプル数が少ない場合とは違う種類のノイズです。

## レンダリング時間
OptiXの最大の利点はレンダリング時間の短縮とノイズ低減です。
しかし、品質の向上とレンダリング時間のトレードオフはOptiXでも同じです。

レンダリング時間は環境によって異なるため詳細な比較はしていません。
筆者の場合、作例動画の出力で1フレームあたり、

- パス数1024→約300秒
- パス数32+OptiX→約30秒

程度になっています。

### 静止画
OptiXの出力品質を上げたければインプットの品質を上げる必要があり、それは多くの場合レンダリング時間の増加を意味します。
静止画の場合、アニメーションに比べ一枚あたりにかけられるレンダリング時間が長いため、サンプル数増加など根本的な品質向上によりOptiXを使わずともノイズ低減は可能な場合が多いのではないでしょうか。
どうしてもレンダリング時間がかけられないなど、かなり限定的な場面以外ではOptiXの出番はないと思います。
### アニメーション
アニメーションの場合は、前後のフレーム間でOptiXの処理結果がつながらないとちらつきが出てしまうため一定以上の品質は望めないと考えます。
静止画と比較して出力が必要な枚数が飛躍的に増えるため、レンダリング時間も比例して長くなりますが、パッケージ品質のアニメーションを出力するにはOptiXを使わない手法を選ぶべきだと思います。

## OptiXの使いどころ
品質に多少の難があっても、レンダリング時間が短いことが求められる場合であればOptiXは効果を発揮しそうです。
###アニメーションのドラフト出力
すぐに考えられるのは、アニメーションのドラフト出力を見せる必要がある場合でしょうか。
最終出力にならないことがわかっており、変更または破棄される前提の（品質を求められない）アニメーションを複数出力して比較する場合などには効果的だと思います。

他にも良い活用法があるかもしれません。

##今後の可能性
OptiXはAI技術を使用したデノイザーであるため学習が可能です。
NVIDIAは数万枚の画像を使用して学習したとされますが、今後も学習済みモデルのアップデートによって精度が上がる可能性があります。

アニメーションの時間軸方向も含む学習が可能になれば、実用に耐えるものになるかもしれません。
今後のさらなる改良を期待したいです。
誰がために共にシビックテックをしてるか

#なぜ、シビックテック活動として沼津でWikipediaTownを続けるか

地域の情報がちゃんと市民や住民に伝わっていない。
そんなところから開始したのは確かである。
沼津には1000基以上の古墳があり、それが全く世の中で知る人がいない。
そんな情報発信が、果たしてシビックプライドにつながるのか？
そんな、情報公開でよいのか？そんな意識から始めたところである。

https://www.city.numazu.shizuoka.jp/shisei/commit/fund/doc/h29poster/7_poster.pdf

だけどね、私が続けている理由はもう一つある。
私の友人との約束があるからだ。
（下記のブログ、大沼前沼津市長は、Code for Numazuに
　参加してくれていて、市長に当選し、まさにこれからという時に
　早逝されてしまった。）

＜沼津市の人口減少に関する私の思い＞
https://ameblo.jp/onumaakiho/entry-12206373629.html

#出会いと別れ
市長になってからもちょくちょく話をしていたんだが、亡くなる前の数ヶ月は何か人々に任せるような話をよくしてくれていたのだよね。2017年の11月、そして表敬訪問で行った2018年2月に、私も話をしちゃったんだよね、もっとこういう活動で沼津の宝をちゃんとオープンデータ化しないとねと。そのときに、QRコードをちゃんと案内看板につけて、大沼さんが掲げていた世界一元気な沼津・・・ではないけれど、私も、日本一、市民が情報発信する街としてQRコード化進めようって約束しちゃってるのよね。

#人生意気に感ず
大沼さんは、約束通り、沼津市役所にオープンデータ専門の担当者を作ってくれた。官民データ計画も立てよう！ってことで、今年度にできるよう準備をしてくれた。

そんな人がいたら、私も約束を守らにゃいかん。
ということで、活動を続けているのと、新しい市長にもOKもらって、今年度内には案内看板にシールを貼らせてもらえそうです。

地域のことだもの、エンジニアだけではなく、地域の人たちと本当に語り合ってやれることをやればいい。そんなことが、私が伝えたいことだったりする。
VSCodeのキーボードショートカットのキーバインディングを削除する方法

VSCodeで、一度設定したキーボードショートカットのキーバインディングを削除する方法が分からず困ったので、同じように困る人を産まないためにメモしておきます。

# 特定のキーバインディングを削除する方法

## キーバインドの登録

キーボードショートカットの設定画面を開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6158/b205bc99-a753-db74-dbc1-7ce3364cee8f.png)
ここでは例として「ヒントとコツ」に適当なキーバインドを登録してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6158/a00145a3-d981-1d5e-0b34-ad13442e1f76.png)
キーバインドが登録されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6158/1ae3fa36-bee9-585f-3058-ec4ca3598f18.png)

## キーバインドの削除

登録された後では、キーバインディングそのものを**この画面で**削除することはできません。
削除するには`keybindings.json`を直接編集する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6158/1c9843ea-0388-4fd1-e7ae-46a6a6385ef7.png)
`keybindings.json`の中から該当のルールを探します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6158/0a46e45e-207b-2aac-6317-34713e5401bf.png)
`command`の先頭に`-`を付けると、該当のルールは無効化され、削除されたものとして扱われます。
または、ルールそのものをjsonから消しても同様の結果になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6158/6a824751-a0f1-f4d0-cc0d-524f2d37992a.png)

## ドキュメント

すべてはここに書いてありました。

[Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/getstarted/keybindings#_removing-a-specific-key-binding-rule)
[キーバインディング | 非公式 - Visual Studio Code Docs](https://vscode-doc-jp.github.io/docs/getstarted/keybindings.html#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89-%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4)
VagrantとAnsibleを用いたフロー情報の可視化環境作成 


FUJITSU Advent Calendar 2018 の11日目の記事です。
(注意)この記事は個人の見解であり、所属する会社、組織を代表するものではありません。
# はじめに
Wiresharkで1GB以上のPCAPファイルを追うのは大変

# 課題
ネットワークのフロー情報から有用な情報を得たいがnetflowやIPfixのフロー情報の可視化環境構築は面倒

# 解決方法
VagrantやAnsibleを用いてElasticStackやGrafanaを使ったフロー情報の可視化するVM(Ubuntu 16.04ベース)を作成した。 

## VagrantとAnsibleで作成するVMの構成
1. ネットワークインタフェースで受信したパケットをYAFでIPfix形式のフロー情報に変換
2. super_mediatorでIPfixをJSON形式のファイルに変換
3. JSON形式のファイルをLogstashを経由してElasticsearchに入力
4. Elasticsearchでフロー情報検索
5. Elasticsearchの検索結果をKibana および Grafanaで可視化

## 動作環境
- メモリ8GB以上のWindows,Mac,Linux 
- 対象となるネットワークに接続可能なNIC 
- git
- VirtualBox
- Vagrant
- vagrant-disksize plugin
- vagrant-proxyconf plugin (http proxy使用環境)
- vagrant-vbguest (オプション)
- firefox or chrome (IE, edge不可)

# リポジトリ
https://github.com/t-umeno/visualize_network_traffic

# インストール方法等の詳細
https://github.com/t-umeno/visualize_network_traffic/blob/master/README.ja.md

# 発表資料
## 2018/06/16のセキュリティマイスター道場(SecDojo) ~夏場所~ のLT枠の発表資料(2018/11/08 修正)
https://www.slideshare.net/TakashiUmeno/visualizenetworktraffic-20181108-122136601

## Ansible Night in Osaka 2018.11 LT
https://www.slideshare.net/TakashiUmeno/visualizenetworktraffic-20181126

# Kibana 表示例
##ダッシュボード(bar2)
- フロー数推移(当日、1日前、1週間前)
- DNS問い合わせ名
- オクテット数推移
- フロー数(IP,Port,MAC,TCPフラグ,プロトコル番号で分類)
- http Host
- http Referer
- http Get
- http UserAgent 
- http ServerString 
<img width="960" alt="2018-11-27 (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/102457/41dd032f-4678-9b94-8623-e02dd3441c47.png">

##JSONファイルに含まれる情報は追加表示可能
例

- SSL証明書有効期限
- SIPの電話番号

# Grafana 表示例
- フロー数
- オクテット数(順方向、逆方向)
- パケット数(順方向、逆方向)
- フロー数、オクテット数、パケット数でアラートを送信する際に使用

<img width="960" alt="2018-11-27 (8).png" src="https://qiita-image-store.s3.amazonaws.com/0/102457/fb117d4b-3ea3-610d-72b0-0a93d7b5cf15.png">

# URL
## CERT NetSA Security Suite
https://tools.netsa.cert.org/index.html
### YAF
https://tools.netsa.cert.org/yaf/
### super_mediator
https://tools.netsa.cert.org/super_mediator/index.html
本当に DevOps 組織といえるには

# 本当に DevOps組織といえるには

アドベントカレンダーの 9日目ということで、9にちなんだ何かを探していたら、こんなのがあったので・・・

> 9 ways to tell if you're really a DevOps organization
https://techbeacon.com/9-ways-tell-if-youre-really-devops-organization

ちょっと見てみたいと思います。

## 1.You have frequent, rapid release cycles

頻繁に、素早くリリースのサイクルをやってますよ、というのが一つのようです。
がんがんデプロイできる環境が大切ってことですね。

## 2.Deployment to production is fully automated, and you can automatically roll back

製品をデプロイするのは完全に自動で、そして自動で戻すことができるのが一つ。
どこまで自動化できてるかってとこですね。これは結構難易度高いとこです。
結構、手作業残ってるとこもありますよね。

## 3.You do continuous integration with automated testing at every check-in

チェックインごとに自動テストで継続インテグレーションを行うことが一つと。
自動テストも大切ですよね。テストが適当だと、後で困ったりしますけど。

## 4.You have far more resources devoted to automated testing than manual testing

自動テストに比べるとリソース食っちゃう手動テストとはおさらばしようと。。。
ここでもまた自動テストですね。テスト大切と。

## 5.Your developers, testers, and operations engineers work together

開発者、テスター、そして、運用エンジニアは一緒に働くのが一つと。
部署が別で、ばらばらだと DevOps とは言えないってことですかね。

## 6.Your developers, testers, and operations engineers have common, business-oriented goals that cover the whole value chain

開発者、テスター、そして、運用エンジニアは、全バリューチェーンをカバーする共通でビジネス志向のゴールを持っていることが一つと。
向いてる方向が同じじゃないと、見てること考えてることやってることがバラバラになってしまいますからね・・・

## 7.You're paying back your technical debt

[技術的負債](https://ja.wikipedia.org/wiki/%E6%8A%80%E8%A1%93%E7%9A%84%E8%B2%A0%E5%82%B5) は返済するのが一つ。
返しとかないと、それによって痛手を負うことがあるかもしれないって話ですね。
まぁ、なかなか負の遺産を清算するのは難しいとこですが。

## 8.Management gives the team the authority to make the changes it needs to make—and the team makes those changes

経営陣はチームに必要な変更を加える権限を与え、チームはその変更を行うことが一つ。
権限ないのにやれっていうのは無理だよということですかね。必要な権限は与えましょう。

## 9.You have feedback mechanisms in place to ensure continuous assessment—and act on that feedback to ensure continuous improvement

継続的な評価を確実にするためのフィードバックメカニズムがあり、そのフィードバックに基づいて継続的な改善を確実にすることが一つ。
ちゃんとフィードバックして、それをもとに改善し続けることが必要ということですね。

## 終わりに

なんか、当たり前のように見えますが、結局なかなかやるのが難しいことが多いんですよね。
当たり前のことを当たり前のようにできるのが理想なんでしょうが、そういう組織を目指していけたらいいですね。

細かい内容は読んでみてください。

そして、やはり少し日をまたいでしまいました・・・
溜まったアレをごっそり年末に掃除する話

# この記事は

[富士通クラウドテクノロジーズ　Advent Calendar 2018](https://qiita.com/advent-calendar/2018/fjct) の12日目です。　　
昨日は @pachicourse　さんの「[0知識からのAnsible 詰まった所&覚えておきたいと思ったところ列挙編](https://pachicourse.com/archives/605)」でした。

# 年末大掃除

早いもので、平成最後の年末ももうすぐやってきそうですね。
さて、年末といえば大掃除ですが、みなさま*アレ*はちゃんとキレイにしましたか？
*アレ*とは、そう「マルチパートアップロードのゴミ」です。

# マルチパートアップロードとは

マルチパートアップロードとは、S3や互換系のオブジェクトストレージなどで実装されているAPIで
大容量オブジェクトでも分割してアップロードでき、またアップロードが途中で失敗しても続きからやり直してができたりする便利な機能です。※当然ニフクラでも利用できます。
ですが、罠というか忘れがちな仕様がありまして、

- アップロードされたの分割ファイルは、クライアントから`Complete Multipart Upload`または`Abort Multipart Upload`のメッセージが来ないと**ストレージ上のリストに反映されない**。 
- アップロードされた分割ファイルは、**自動では削除されない**。※バケットライフサイクル適用時を除く

という振る舞いを持っているのです。
詳細は[こちら](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/mpuoverview.html)。


# つまりどういうことかというと

マルチパートアップロードを途中でエラーやハングなどで中断した場合、その中途半端なファイルがストレージに残ることになります。
しかも**アップロード中の分割ファイルに対するストレージ使用量もバッチリ課金対象**となるため、そのまま放置するのは完全に無駄です。そのうちタイムアウトできれいに消えるということもありません。
SDKなど利用してると普段はマルチパートの煩雑な手順を意識することもないので、そもそもゴミが溜まってしまうことも忘れがちですが、
アップロード時のリトライ方式などによっては意外と溜まってしまうものなので年に一度くらい(本当は適宜)、確認して掃除するといいでしょう。

## ゴミの探し方
`List Multipart Uploads` アクションをリクエストします。　

aws cliなどが入っていれば手軽にすぐ確認できます。
導入方法などは[こちら](https://blog.pfs.nifcloud.com/use_object_storage_with_s3_tool_setting)をご覧ください。

```
[root@Test1 ~]#aws s3api list-multipart-uploads --bucket bucketname --endpoint-url https://jp-east-2.storage.api.nifcloud.com | egrep "UploadId|Key"
            "UploadId": "2~kRX-o16c-2XAyiLMLb_dAkT_VVhGRa7",
            "Key": "tempfile",
[root@Test1 ~]#
```

上記はニフクラオブジェクトストレージに対してリクエストを投げた例ですが、s3でも当然同じです。
ここでアップロード中の分割ファイルを消すためには `UploadId` 及び `Key` が必要になります。


## ゴミの消し方

マルチパートを完了させるには `Complete Multipart Upload` か `Abort Multipart Upload` を発行する必要があります。だいたいこのような形で観測される情報はゴミなので、基本的には `Abort Multipart Upload` を発行していきます。
aws cliでは以下のようになります。

```
[root@Test1 ~]#aws s3api abort-multipart-upload --bucket bucketname --upload-id 2~kRX-o16c-2XAyiLMLb_dAkT_VVhGRa7 --key tempfile --endpoint-url https://jp-east-2.storage.api.nifcloud.com
[root@Test1 ~]#aws s3api list-multipart-uploads --bucket bucketname --endpoint-url https://jp-east-2.storage.api.nifcloud.com | egrep "UploadId|Key"
[root@Test1 ~]#
```

## いっぱいある場合

たくさんある場合はコマンドラインでちまちまやるにはきついので、スクリプトを組むといいでしょう。
以下はニフクラオブジェクトストレージに対して掃除する場合のサンプル(Ruby)です。

```matsui_stick_gossori.rb
require 'aws-sdk'

@bucket = "bucketname"

options = {
  access_key_id: ENV[ACCESS_KEY_ID],
  secret_access_key: ENV[SECRET_ACCESS_KEY],
  region: "jp-east-2",
  endpoint: "https://jp-east-2.storage.api.nifcloud.com"
}

client = Aws::S3::Client.new( options )

begin
   resp = client.list_multipart_uploads({
      bucket: @bucket
   })
   exit unless resp.to_h.has_key?(:uploads)
   resp.to_h[:uploads].each do |upload|
      client.abort_multipart_upload({
         bucket: @bucket,
         key: upload[:key],
         upload_id: upload[:upload_id]
      })
      puts "deleted key:#{upload[:key]}"
   end
rescue => ex
   puts ex.message
end
exit
```

# 最後に

退避（バッチ処理など）中やテスト実行時など、エラーを繰り返すと意外と溜まるゴミなので、
職務上、オブジェクトストレージを担当していたこともあり、
しかたがないので、趣味でこっそり裏からチームのゴミを削除してたりします（笑）
まあいい加減飽きてきたのと、年末ということでメモを残します。
すこやかに来年を迎えましょう！良いお年を！

# 明日は

@blue271828さんの「なにか」です！
なんだろう！
大文字小文字数字記号を最低１文字以上含む正規表現

## 大文字小文字数字記号を最低１文字以上含む正規表現

```
^(?=.*[!-/:-@[-`{-~])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])[!-~]{10,}$
```

## 正しいかチェックしてみる
確認のため上記文字列をテキストエディタで検索してみる（もちろん正規表現を有効にして）
例えばemeditorだとマッチした箇所は緑色にハイライトされる。
こうすると簡単に色々なパターンのマッチ/アンマッチをチェックできる。
以下を見れば意図したとおり大文字小文字数字記号を最低１文字以上にマッチしていることがわかる。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/64854/8d8d7771-024a-2cad-8f73-8b0ef18e2244.png)

## 残念な例
ネットでググると１文字以上のマッチを肯定先読みでチェックしている記事はよく見るが、折角文字種をチェックしているのに肝心のマッチ部分をドット(.)にしてる残念なパターンを目にする

```
^(?=.*[!-/:-@[-`{-~])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z]).{10,}$
```

これだと確かに指定した文字種は最低１文字含まれるが、指定していない文字まで含めることができてしまう。
つまり以下の文字にもマッチしてしまう
![Screenshot_4.png](https://qiita-image-store.s3.amazonaws.com/0/64854/ad2f4d6b-e2bb-e4ac-28f3-11aaf6d0fb79.png)


## 正規表現で記号を表現する簡単な方法
ASCII文字に含まれる(スペース以外の)印字可能な記号を以下の正規表現で表している。
これについて少し細くする。

```
[!-/:-@[-`{-~]
```

正規表現は文字クラスを `[]` で定義できる。
例えば `[a-z]` は `abcdefghijklmnopqrstuvwxyzのいづれか１文字` と全く同じ意味だ。
この文字クラスはより正確に言うと `aという文字の文字コード(97)` から `zという文字の文字コード(122)` の間に含まれる文字コードにマッチする、という意味である。
asciiコードではアルファベットはa(97)からabc順に昇順に並んでいるので、`[a-z]`がa～zのいづれか１文字を表すのである。
これが理解できていれば `[z-a]` という文字クラスは間違いであることが一瞬でわかるだろう。

[ASCIIコード表](http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)

話を記号に戻そう。
上記のASCIIコード表を見ると、31までが制御文字で32(スペース)から印字可能な文字(いわゆるキーボードで入力する文字)が始まって126(~)まで続いている。だから、英数記号を表す文字クラスは非常にシンプルに `[!-~]`  と記述できる。ではこの中から記号のみを表現するにはどうすればよいか。あいにく ~~文字クラスにはexcludeを指定する方法は用意されてない~~(正規表現ライブラリに依っては除外設定も可能とのことです、[コメント参照](https://qiita.com/nori4k/items/567c0e141ac8511543c5#comment-c5128f62c8335e2a245b)) ので、文字コードが連続していない場合は分けて記述するしかない。つまりこうだ。

```
!-/
:-@
[-`
{-~
``` 

これらを一纏めにすれば冒頭の正規表現で使った文字クラスができあがる。

```
[!-/:-@[-`{-~]
```
Python 3次元グラフのテーマカラー，グラフの表示角度を変更

##準備
サンプルとして用いる3次元グラフを生成．

```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
 
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.sin(X + Y)

ax.plot_surface(X, Y, Z)

```
![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/257347/1f360098-3b19-db64-00fe-e91c9b20a672.png)

##テーマカラーの変更

`cm.'指定するテーマカラー'`という感じでテーマカラーを指定します．
今回はoceanを指定していますが，他にも多数のテーマがあります．
詳しくは以下のページを参照してください．
[matplotlib color example code](https://matplotlib.org/examples/color/colormaps_reference.html)

```python
ax.plot_surface(X, Y, Z, cmap='ocean') 
```

![Unknown-1.png](https://qiita-image-store.s3.amazonaws.com/0/257347/ac24617a-5aea-096d-d151-43f13819d134.png)

##表示角度の変更

elevはz軸方向から見た仰角，azimはx, y軸方向の方位角を指定．
詳しくは以下を参照してください．
[matplotlib mplot3d API](https://matplotlib.org/mpl_toolkits/mplot3d/api.html)

```python
ax.view_init(elev=60, azim=45)
```

![Unknown-2.png](https://qiita-image-store.s3.amazonaws.com/0/257347/2c6aa689-f184-bd51-c988-2adaef5571d3.png)
パッケージマネージャでGoogle Testをインストールした際の使用方法

# はじめに
Arch Linuxではパッケージマネージャで簡単にGoogle Testをインストールすることができる．
しかし，パッケージマネージャでインストールしたGoogle Testの使用方法が見つからなかったため，
自分用の備忘録として残す．

# 使用方法
## 1. インストール
パッケージマネージャでインストール．
Arch Linuxを使っている場合は以下．
`sudo pacman -S gtest`

## 2. テストコードの準備

### テスト対象コード
簡単な足し算のプログラム例を準備

``` sum.cpp
#include "sum.hpp"

int sum(int x, int y) {
    return x + y;
}
```

``` sum.hpp
int sum(int x, int y);
```

### テスト実行コード
``` test.cpp
#include <gtest/gtest.h> //gtestのヘッダのinclude
#include "sum.hpp"

/*
テスト本体の書き方は以下の通り．
TEST(テストケース名, テスト名) {
 テストコード本体
} 
*/
// テストが通るケース
TEST(SumTest, TestCaseTrue) {
    EXPECT_EQ(1+2, sum(1, 2));
    EXPECT_EQ(2+3, sum(2, 3));
    EXPECT_EQ(3+4, sum(3, 4));
}

// テストが通らないケース
TEST(SumTest, TestCaseWrong) {
    EXPECT_EQ(1, sum(1, 2));
    EXPECT_EQ(2, sum(2, 3));
    EXPECT_EQ(3, sum(3, 4));
}
```

## 3. コンパイル，実行
`g++ -o test -lgtest -lgtest_main -lpthread test.cpp sum.cpp`でコンパイルした後，`./test`で実行．

## 4. 結果
``` sh
Running main() from /build/gtest/src/googletest-release-1.8.1/googletest/src/gtest_main.cc
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from SumTest
[ RUN      ] SumTest.TestCaseTrue
[       OK ] SumTest.TestCaseTrue (0 ms)
[ RUN      ] SumTest.TestCaseWrong
test.cpp:11: Failure
Expected equality of these values:
  1
  sum(1, 2)
    Which is: 3
test.cpp:12: Failure
Expected equality of these values:
  2
  sum(2, 3)
    Which is: 5
test.cpp:13: Failure
Expected equality of these values:
  3
  sum(3, 4)
    Which is: 7
[  FAILED  ] SumTest.TestCaseWrong (0 ms)
[----------] 2 tests from SumTest (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] SumTest.TestCaseWrong

 1 FAILED TEST

```
テストが実行できたことが確認できた．

# 参考にしたページ
[入門ガイド — Google Test ドキュメント日本語訳](http://opencv.jp/googletestdocs/primer.html)
[UbuntuでサクッとGoogle Testを使ってみよう - がんじろうの日記](http://d.hatena.ne.jp/gunjiro/20111001/1317495349)