OmniAICreator/Qiita-1.07M huggingface dataset:
iPhone、iPad、iPod touch で GIF を送信／保存する

# GIFとは
GIFとは何？GIFとは静止画像を圧縮するための規格　ー　ニコニコ大百科
Twitter、LINE、メッセージなどでGIFを使って家族や友達たちに共有したことがあるでしょう。GIFアニメーションを送る事で、今までよりもっと面白い表現ができそうですね。
## iPhone、iPad、iPod touch で GIF を送信する
- TwitterにGIFを添付・送信する方法

Twitterアプリを起動します　>　ツイート画面の下にある [画像] アイコンをタップします。
表示されているGIFを選択して、ツイートします。

- 「LINE」GIFアニメをトークで送受信する方法

メッセージ入力ボックス左横の「+」をタップして、「写真を選択」をタップします。
送信したいGIFアニメ画像を選択して、下の「オリジナル画質」「送信」の順でタップします。
画像をタップすることで再生されます。

- メッセージから GIF を追加・送信する

メッセージ App を開いて、連絡先の情報を入力するか、既存のスレッドをタップします。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/197388/06b71848-479c-bbc3-8af6-727e4cbe66bf.png)をタップしてから、![2.png](https://qiita-image-store.s3.amazonaws.com/0/197388/765a6f50-9735-be47-c743-167943106b16.png)をタップします。
送信したいGIF をタップして、メッセージに追加します。
 ![3.png](https://qiita-image-store.s3.amazonaws.com/0/197388/319cbb7b-3e6a-1070-6db7-c356247b92cb.png)をタップして送信します。

## GIFを保存する
Twitter、LINE、メッセージでGIFを送信したいなら、まずは、他の場所から面白いGIFアニメを保存する必要があります。または、友達から受信したGIFアニメを保存したいなら、どうやって保存しますか？これは非常にかんたんです。保存したいGIF を長押しして、「保存」をタップします。
参考サイト：https://support.apple.com/ja-jp/HT207179
## 最後
お使いのiPhone /7/8/Xで撮影した[Live photoもGIFアニメや動画に変換](http://bit.ly/2hxoPm6)して、共有できます。
Terraform実行時にCycleエラーが出た際の対処方法

Cycleエラーが出たときの対処法を残しておきます

```bash
$ terraform apply -auto-approve
Error: Error asking for user input: 1 error(s) occurred:

* Cycle: module.create_delivery_func.data.aws_region.dst, module.create_delivery_func.provider.aws.dst
```

## グラフコマンド
Terraformには[graph command][1]というTerraformの構成をグラフにおこすコマンドが用意されているのでこれを使って原因の特定を行います。

オプションに`-draw-cycles`というグラフの任意のサイクルを色付きのエッジでハイライトしてくれるCycleエラーを診断する用途にぴったりのオプションがあるのでこちらを使います。

## コマンド実行
ではコマンドを実行してみましょう！ポチッとな！

```bash
$ terraform graph -draw-cycles | dot -Tpng > graph.png
```

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/59905/5405de57-ae8f-c54d-c2c0-8fbe459847a7.png)


...ひえ
> グラフの任意のサイクルを色付きのエッジでハイライトしてくれる

とのことなので該当箇所だけ見てみましょう(全部みてられない...

## 原因
![スクリーンショット 2017-11-29 17.53.09.png](https://qiita-image-store.s3.amazonaws.com/0/59905/7dc18476-e6d6-9297-5f7c-c2cfb521e64e.png)

図を見た感じ`provider`と`data.aws_region`で双方向の参照が起きているようです

```bash
provider "aws" {
  alias  = "dst"
  region = "${data.aws_region.dst.name}"
}

data "aws_region" "dst" {
  provider = "aws.dst"
  current = true
}
```
コードを見た感じ、、、おかしいですね、、、
とりあえず`provider`の`region`を`us-east-1`にしてみるとエラーが解決しましたー :tada::tada:

## まとめ
今回の例はグラフを使わなくても解決できるレベルでしたが、複雑な問題のときにはグラフコマンドは重宝するのでよかったら使ってみましょう

[1]: https://www.terraform.io/docs/commands/graph.html
CWL User Guide 9: Array Inputs をやってみた

# CWL User Guide 9: Array Inputs

[Common Workflow Language User Guide: Array Inputs](http://www.commonwl.org/user_guide/09-array-inputs/)

今回は、入力のパラメータを配列形式での受け付けが可能だとのべられています。
パラメータをカンマでつなげるとか、パラメータそれぞれに prefix をつけるなど、そういったことができるということについて書かれています

# この回にでてくる主なキーワード
* type
* type: array
* items
* inputBinding
* itemSeparator


# CWLファイル、array-inputs.cwl

```array-inputs.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
inputs:
  filesA:
    type: string[]
    inputBinding:
      prefix: -A
      position: 1

  filesB:
    type:
      type: array
      items: string
      inputBinding:
        prefix: -B=
        separate: false
    inputBinding:
      position: 2

  filesC:
    type: string[]
    inputBinding:
      prefix: -C=
      itemSeparator: ","
      separate: false
      position: 4

outputs: []
baseCommand: echo
```

# パラメータファイル array-inputs-job.yml

```array-inputs-job.yml
filesA: [one, two, three]
filesB: [four, five, six]
filesC: [seven, eight, nine]
```

# 実行

## 実行方法

```
cwltool array-inputs.cwl array-inputs-job.yml
```

## 実行結果

```console
$ cwltool array-inputs.cwl array-inputs-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'array-inputs.cwl' to 'file:///home/vagrant/cwl_user_guide_work/09-array-inputs/array-inputs.cwl'
[job array-inputs.cwl] /tmp/tmpUT2B6w$ echo \
    -A \
    one \
    two \
    three \
    -B=four \
    -B=five \
    -B=six \
    -C=seven,eight,nine
-A one two three -B=four -B=five -B=six -C=seven,eight,nine
[job array-inputs.cwl] completed success
{}
Final process status is success
```

#　今回使ったファイル

[cwl\_user\_guide\_work/09\-array\-inputs at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/09-array-inputs)
RubyでTwitterAPIを使いプロフィールを更新しよう

#RubyでTwitterAPIを使いプロフィールを更新しよう
今回はの「[RubyでTwitterAPIを使う準備をしよう。](https://qiita.com/flmil/items/b804ae13de5b0e7e71b3)」ができていることを前提に話を進めて行きます。


"この中を変えて自分の変えたいプロフィールにしよう"

```
T_ZONE    = "Tokyo"
NAME      = "テストアカウント"
URL       = "http://xxx.yyy.zzz/"
LOCATION  = "Ruby City MATSUE"
DESC      = "これはテストアカウントです。"
LN_COLOR  = "FA743E"
```

[RubyでTwitterAPIを使う準備をしよう。](https://qiita.com/flmil/items/b804ae13de5b0e7e71b3)に以下のコードを書き加えていきます。

```ruby:twitter.rb

class TwitterSet

  T_ZONE    = "Tokyo"
  NAME      = "テストアカウント"
  URL       = "http://xxx.yyy.zzz/"
  LOCATION  = "Ruby City MATSUE"
  DESC      = "これはテストアカウントです。"
  LN_COLOR  = "FA743E"

  def control
    settings
    update_profile
  rescue => e
    $stderr.puts "[EXCEPTION][#{self.class.name}.#{__method__}] #{e}"
    exit 1
  end

  private

  def settings
    begin
      @rest.settings({time_zone: T_ZONE})
    rescue => e
      raise
    end
  end

  def update_profile
    begin
      @rest.update_profile(
        {
          name:               NAME,
          url:                URL,
          location:           LOCATION,
          description:        DESC,
          profile_link_color: LN_COLOR
        }
      )
    rescue => e
      raise
    end
  end
end

app = Twitter.new(CONFIG)
app.control
```
CWL User Guide 8: Additional Arguments and Parameters をやってみた

# CWL User Guide 8: Additional Arguments and Parameters

[Common Workflow Language User Guide: Additional Arguments and Parameters](http://www.commonwl.org/user_guide/08-arguments/)

今回は実行環境の情報が提供されるパラメータ`runtime`や、`arguments`に関する説明があります。

Javaのソースコードをコンパイルしますが、コンパイルには、dockerコンテナを使うので、Javaをインストールする必要はありません。

# この回にでてくる主なキーワード

* arguments
* runtime

# CWLファイル、arguments.cwl

```
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
label: Example trivial wrapper for Java 7 compiler
hints:
  DockerRequirement:
    dockerPull: java:7-jdk
baseCommand: javac
arguments: ["-d", $(runtime.outdir)]
inputs:
  src:
    type: File
    inputBinding:
      position: 1
outputs:
  classfile:
    type: File
    outputBinding:
      glob: "*.class"
```

# パラメータファイル arguments-job.yml

```
src:
  class: File
  path: Hello.java
```

# 必要なファイル

簡単な Java のソースコードがかかれたファイルを作成する

```
echo "public class Hello {}" > Hello.java
```

# 実行


## 実行前確認

`Hello.class` が存在していないことを確認する
`Hello.class` が存在すれば、それを削除しておく。


```
$ rm Hello.class
$ ls Hello.class
ls: cannot access 'Hello.class': No such file or directory
```

## 実行方法

cwltool arguments.cwl arguments-job.yml

## 実行結果

```
$ cwltool arguments.cwl arguments-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'arguments.cwl' to 'file:///home/vagrant/cwl_user_guide_work/08-arguments/arguments.cwl'
['docker', 'pull', 'java:7-jdk']
7-jdk: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
66b144b1d5b0: Pull complete
6263baad4f89: Pull complete
Digest: sha256:c0b61b62639124aa838dc755c5a9d57c072f762b71b170281927399a14db4652
Status: Downloaded newer image for java:7-jdk
[job arguments.cwl] /tmp/tmpxVil6_$ docker \
    run \
    -i \
    --volume=/tmp/tmpxVil6_:/var/spool/cwl:rw \
    --volume=/tmp/tmpigrxzv:/tmp:rw \
    --volume=/home/vagrant/cwl_user_guide_work/08-arguments/Hello.java:/var/lib/cwl/stgd0a948ea-31f9-411e-bc4c-82440ed28793/Hello.java:ro \
    --workdir=/var/spool/cwl \
    --read-only=true \
    --user=1000:1000 \
    --rm \
    --env=TMPDIR=/tmp \
    --env=HOME=/var/spool/cwl \
    java:7-jdk \
    javac \
    -d \
    /var/spool/cwl \
    /var/lib/cwl/stgd0a948ea-31f9-411e-bc4c-82440ed28793/Hello.java
[job arguments.cwl] completed success
{
    "classfile": {
        "checksum": "sha1$e68df795c0686e9aa1a1195536bd900f5f417b18",
        "basename": "Hello.class",
        "location": "file:///home/vagrant/cwl_user_guide_work/08-arguments/Hello.class",
        "path": "/home/vagrant/cwl_user_guide_work/08-arguments/Hello.class",
        "class": "File",
        "size": 184
    }
}
Final process status is success
```

## 実行結果確認

コンパイルされた結果のクラスファイルが存在することを確認できる

```
$ ls Hello.class
Hello.class
```

# 今回使ったファイル

[cwl\_user\_guide\_work/08\-arguments at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/08-arguments)
CWL User Guide 7: Running Tools Inside Docker をやってみた

# CWL User Guide 7: Running Tools Inside Docker

[Common Workflow Language User Guide: Running Tools Inside Docker](http://www.commonwl.org/user_guide/07-containers/)

今回は Docker を利用した例について書かれています
docker コンテナを使って javascript を実行します。

# この回にでてくる主なキーワード

* Docker
* Dockerrequirements
* hints


# CWLファイル、docker.cwl

```docker.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
baseCommand: node
hints:
  DockerRequirement:
    dockerPull: node:slim
inputs:
  src:
    type: File
    inputBinding:
      position: 1
outputs: []
```

# パラメータファイル docker-job.yml

```docker-job.yml
src:
  class: File
  path: hello.js
```

# 必要なファイル

Javascriptのファイルを実行する必要があります

```
echo "console.log(\"Hello World\");" > hello.js
```

# 実行

## 実行方法

```
cwltool docker.cwl docker-job.yml
```

## 実行結果


```
$ cwltool docker.cwl docker-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'docker.cwl' to 'file:///home/vagrant/cwl_user_guide_work/07-containers/docker.cwl'
['docker', 'pull', 'node:slim']
slim: Pulling from library/node
85b1f47fba49: Pull complete
ba6bd283713a: Pull complete
b9968e24de01: Pull complete
838ee1f471db: Pull complete
0aeceafac5a9: Pull complete
ac225a9df894: Pull complete
Digest: sha256:be3ec422193a582d802d2948149d502c421f34749fd4535295e6538e3cd39dc8
Status: Downloaded newer image for node:slim
[job docker.cwl] /tmp/tmp_zLyzf$ docker \
    run \
    -i \
    --volume=/tmp/tmp_zLyzf:/var/spool/cwl:rw \
    --volume=/tmp/tmpfQ5mMZ:/tmp:rw \
    --volume=/home/vagrant/cwl_user_guide_work/07-containers/hello.js:/var/lib/cwl/stg93732819-d8a8-449c-b8ea-1ca6f684464b/hello.js:ro \
    --workdir=/var/spool/cwl \
    --read-only=true \
    --user=1000:1000 \
    --rm \
    --env=TMPDIR=/tmp \
    --env=HOME=/var/spool/cwl \
    node:slim \
    node \
    /var/lib/cwl/stg93732819-d8a8-449c-b8ea-1ca6f684464b/hello.js
Hello World
[job docker.cwl] completed success
{}
Final process status is success
```

### 実行結果すこし細く

前半部分で、dockerが 'node:slim' とってきていることがわかります。
２度目に実行するときは、すでにコンテナが存在するので、この部分がなくなります。


## 実行結果確認

実行結果の最後から４行目で `Hello World` がじっこうされていることがわかります

```
Hello World
```

## さらにちょっと

`hello.js` のメッセージを少し変更して、ふたたび実行してみましょう。
出力がかわることを確認できるとおもいます。

# 今回使ったファイル

[cwl\_user\_guide\_work/07\-containers at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/07-containers)
Zone apexにALIAS(≒CNAME)を適用できるNameServerプロバイダ



ドメインそのものを表す Zone Apex (Naked DomainとかRoot Domainとかも) は[色々あって](https://tools.ietf.org/html/rfc1912#section-2.4)基本的にはAレコードでの運用です。

最近はNameServerとWebサイト(公開URL)を預けるプロバイダが同一ならば対応しやすくはなっていますが、次のようなケースでは悩みどころです。


- ゾーンは自分の管理下
- Webサイトはホスト名を払い出すタイプ(CNAME推奨)のどこかのサービスを利用

この組み合わせでZone apexを利用できるNameServerプロバイダを並べてみます。 ほか、ここでもできるよーという情報があれば追記するのでコメントしてもらえると嬉しいです。



## 国内

新鋭のサービス中心、って感じですね。

### [Dozens（ダズンズ）](http://dozens.jp/)

- [DNSレコード設定の手順 - Dozens ヘルプセンター](http://help.dozens.jp/post/help/help_03/)
  - `ALIASレコード` を参照

### [Gehirn DNS](https://www.gehirn.jp/gis/dns.html)

- [ALIAS（エイリアス）レコードの追加 | ゲヒルンサポートセンター](https://support.gehirn.jp/manual/gis/dns/add-aliasrecord/)


## 海外

特に区別する必要もない気はしますがなんとなく。

### [DNSimple](https://dnsimple.com/)

- [ALIAS Records - DNSimple Help](https://support.dnsimple.com/articles/alias-record/)
- 設定例： [Pointing the Domain Apex to Heroku - DNSimple Help](https://support.dnsimple.com/articles/domain-apex-heroku/)
  - heroku向けの案内ですが、どこでも一緒です。

ここ、個人的にしばらく使っていましたね。


### [DNS Made Easy](https://dnsmadeeasy.com/)

ここのは`ANAME`ですね。

- [ANAME Records | DNS Made Easy](https://dnsmadeeasy.com/services/anamerecords/)


### [easyDNS](https://www.easydns.com/)

こちらも`ANAME`ですね。

- [ANAME Records - easyDNS](https://fusion.easydns.com/index.php?/Knowledgebase/Article/View/190/7/aname-records/)



## その他、やや特殊・制限つき

### [Cloudflare](https://www.cloudflare.com/)

CNAMEを設定しても、基本的にAに展開してあつかう、という機能でApexに他のホスト名を割り当てられます。(alias of 〜 などと表記される)

- [CNAME Flattening: RFC-compliant support for CNAME at the root – Cloudflare Support](https://support.cloudflare.com/hc/en-us/articles/200169056-CNAME-Flattening-RFC-compliant-support-for-CNAME-at-the-root)

もともとCDNの補佐的位置で、ApexにCNAMEをつかうと他のレコードとの兼ね合いで挙動が怪しい、などとどこかで見たのでこの位置。一応自分も使ってます。


### Route53とCloudFrontでそれぞれAWSアカウントが違うケース

サービスを申し込んだらCloudFrontで配信してくれた、自分のドメインのApexを割り当てたい。というケース。
アカウントが同一ならプルダウンで選べるけども、別だとさすがに一覧に出て来ません。一応AWSのリソースならApexにALIASを直接指定すれば使えます。

- [エイリアス先 - Amazon Route 53](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-values-alias.html##rrsets-values-alias-alias-target)
  - `Amazon Route 53 ホストゾーンとディストリビューションを作成する際に異なるアカウントを使用している場合`  を参照

ELBなんかも同様。


### [PointDNS](https://pointhq.com/) (with heoku?)

[herokuのアドオン経由でALIASを設定](https://devcenter.heroku.com/articles/pointdns) できるようなんだけど、PointDNS側に何のドキュメントもない。
APIでもALIASというタイプのレコードを作れるように見えないのでheroku限定かも。
WordPressでテンプレートファイル（page-xxxx.php）を削除するとエラーが表示される

開発作業中にエラーが表示されて困ったので、行った解決策の備忘録をのせておきます。

# WordPressのバージョン
4.9.0

**※2017/12/4追記
4.9.1ではこの問題は修正されているので、WordPressのバージョンが低い方はアップデートされることをおすすめします。**

# 問題
不要になったテンプレートファイル（page-xxxx.php）を削除すると、以下のようなエラーが表示される。

```
Warning: file_get_contents(xxxx): failed to open stream: No such file or directory in /xxxx/wp-includes/class-wp-theme.php on line 1042
```

※適当に伏せ字にしています
※今回は「page-sitemap.php」というテンプレートファイルを削除しました

管理画面の固定ページ編集画面ではこんなエラーが表示される
![1.png](https://qiita-image-store.s3.amazonaws.com/0/118677/caa1e7cb-e4d2-6f70-379f-2ab04a0be069.png)

それでも強引に更新しようとすると、白い画面でエラーが表示される
![2.png](https://qiita-image-store.s3.amazonaws.com/0/118677/dc78d7db-cfd3-61d5-eb59-e484303d8d17.png)

# 原因
WordPressのバージョンが4.9.0になってから、テンプレートファイルの階層をキャッシュするようになったらしいです。
そのため、テンプレートファイル（page-xxxx.php）を削除することで、キャッシュに存在していたはずのテンプレートファイルが無いとみなされてエラーが出ていたようです。

英語でよくわからないのですが、以下のチケットで議論されていたみたいです。
https://core.trac.wordpress.org/ticket/42573

ちなみに1時間待つことでキャッシュが更新されてクリアされるみたいですが・・開発作業中にそんな待ってられないですね！

# 解決策
上記問題に対応するためのプラグインを入れる。
https://gist.github.com/westonruter/6c2ca0e5a4da233bf4bd88a1871dd950

githubの使い方がわからない方のために、念のためやり方をのせておきます。

## プラグインの入れ方
1. 上記サイトの右上の方の「Download ZIP」をクリックしてファイルダウンロード
2. 解凍したファイルの「wp-42573.php」をWordPressのプラグインディレクトリ（/wp-content/plugins/）の中に移動
<img width="654" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/118677/db4aa347-45c9-606e-e705-094e468ede9d.png">

3. 管理画面に入りプラグインを有効化
![4.png](https://qiita-image-store.s3.amazonaws.com/0/118677/302c0e3d-a091-b0f6-9176-20b0d637dd4f.png)

# 余談
一応プラグインの中身を見てみましたが、内容はいたってシンプルで管理画面がロードされるたびにキャッシュをクリアする内容のようです。
4.9.1になればこの問題は修正されるんじゃないかなーと思います。

# 2017/12/4追記
2017/12/1に更新されたWordPress4.9.1で、この問題も修正されたようです。
(#42573ってところですかね・・)
https://make.wordpress.org/core/2017/11/28/wordpress-4-9-1-scheduled-for-november-29th/
SwiftのプロジェクトにDanger入れてみた

# 参考
Dangerで効率よくPR駆動開発 | Recruit Jobs TECHBLOG
https://techblog.recruitjobs.net/development/danger_driven_development
ashfurrow/danger-swiftlint: A Danger plugin for SwifLlint.
https://github.com/ashfurrow/danger-swiftlint
Danger - Reference
http://danger.systems/reference.html
Dangerで始めるPull Requestチェック自動化 - コネヒト開発者ブログ
http://tech.connehito.com/entry/danger

# 使うもの
Danger
Fastlane
TravisCI
Github

# 本題

TravisCI,Fastlane,Swiftlintについては使える前提でいきます。

### Gemfile

Gemfileに以下を追記

```js:Gemfile
gem 'danger'
gem 'danger-swiftlint'
```

`bundle update`適宜してください。

### .travis.yml

.travis.ymlに以下を追記

```yaml:.travis.yml
before_script:
  - bundle exec danger
```

まぁ、タイミングはいつでもいいですが `bundle exec danger` すればOKです。

### Travis環境変数の設定

GithubのAPITokenを`DANGER_GITHUB_API_TOKEN`という環境変数として登録します。

以下にアクセスしてTokenを発行してください。
https://github.com/settings/tokens

※Scopeは以下のようにrepoにチェックをいれればOKです。
<img width="1150" alt="スクリーンショット 2017-11-29 16.46.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/70276/fc3fcb87-316a-9a3a-f331-4c8e409ba7a4.png">

そして、TravisのSettingsのEnvironment VariablesにTokenを追加します
https://travis-ci.com/

<img width="1267" alt="スクリーンショット 2017-11-29 16.48.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/70276/10bb67af-c3a6-43d7-e914-9500842f7e55.png">

### Dangerfile

最後にDangerfileを作成します。
プロジェクトルートにDangerfileを作成

```rb:Dangerfile
# PRのタイトルに[WIP]が含まれていれば編集中コメントをする
warn("このPRは編集中のようだ...") if github.pr_title.include? "[WIP]"

# 修正内容が500行を超えていたらコメントをする
warn("このPR修正しすぎ :sob: :sob: :sob:") if git.lines_of_code > 500

# PRで修正した範囲だけswiftlintでチェックしてコメントする
github.dismiss_out_of_range_messages
swiftlint.config_file = '.swiftlint.yml'
swiftlint.lint_files inline_mode: true

# PRのブランチ名にチケットNoが含まれていればチケットのURLをコメントする
match = github.branch_for_head.match /redmine(\d+)/
message "Redmine Ticket: <a href='https://example.com/issues/#{match[1]}'>##{match[1]}</a>" if match
```

※上記は適宜修正してください。

あとはPRを出したらDangerが勝手にチェックしてくれます
VBでお絵描きソフトを作成する

#モチベーション
手書きでレポートを出さないといけない授業があるけど、提出するには書いた紙をスキャナで2値化してpdfにして提出しないといけない。非常に面倒くさい。しかし幸運なことに教授は極度の弱視なので、簡単に偽造できそうな気がしてきたのでやってみる。まずは手書き文字を保存するためのお絵かきソフトを作る。
#ソースコードVer1
```vbnet:Form1.vb
Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class Form1
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Dim g As Graphics = sender.CreateGraphics()
        g.SmoothingMode = SmoothingMode.AntiAlias
        If e.Button = MouseButtons.Left Then
            g.FillEllipse(Brushes.Black, e.X, e.Y, 5, 5)
        ElseIf e.Button = MouseButtons.Right Then
            g.FillEllipse(Brushes.White, e.X, e.Y, 30, 30)
        End If
    End Sub
End Class
```
#実行結果Ver1
描画間隔が遅くて紙に書く感覚で書くとこの有様↓

アンチエイリアス無し
![2017-11-29 (1).png](https://qiita-image-store.s3.amazonaws.com/0/216625/a30b8244-6921-5dc8-cb4a-887c0ac5ee40.png)
どうにか滑らかに書けないかと思ってたらアンチエイリアスのオプションがあることに気づいたので、それっぽく見えるかな～って思って実行↓

アンチエイリアス有り
![2017-11-29 (2).png](https://qiita-image-store.s3.amazonaws.com/0/216625/66a0ba60-ab3a-7b01-01b0-eabdeee6cf72.png)

ましにはなったけどまだ全然ダメじゃん？
今になって、Windowsのペイントは超優秀だということに気づく。
もっと滑らかに書ける方法を探さなきゃ...

#改善策
点を連続で描画して線に見せる方法から直線を連続で描く方法に替えてみる。
#ソースコードVer2
```vbnet:Form1.vb
Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class Form1
    Dim X, Y As Integer '始点
    Dim flg As Boolean
    Dim rnd As New System.Random(1000)
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Dim g As Graphics = sender.CreateGraphics()
        Dim liner As New Pen(Color.FromKnownColor(KnownColor.Black), rnd.Next(3, 6)) '線の太さを少し変えつつ描画する
        g.SmoothingMode = SmoothingMode.AntiAlias

        If e.Button = MouseButtons.Left Then
            If flg = True Then
                g.DrawLine(liner, X, Y, e.X, e.Y)
                flg = False
            End If
            flg = True
            X = e.X : Y = e.Y
        Else
            flg = False
        End If

        If e.Button = MouseButtons.Right Then
            g.FillEllipse(Brushes.White, e.X, e.Y, 30, 30)
        End If
    End Sub
End Class
```
#実行結果Ver2
できた。なるほど。(jTakasuRyujiさんアドバイスありがとうございます。助かりました。)
![2017-11-30.png](https://qiita-image-store.s3.amazonaws.com/0/216625/9afe6b43-d3db-283e-f7a1-65481861fa3d.png)



#参考サイト
[vb講座１４　クリックイベントプロシージャを使ってお絵かきソフトを作成する](http://oshietepc.net/vbnet/archives/459)

[Graphics オブジェクトの状態の管理]
(https://msdn.microsoft.com/ja-jp/library/sf4e5x7z(v=vs.110).aspx)
Analyze node_modules/react-native/ReactCommon/yoga/yoga/YGNodeList.c でビルド失敗するときの対処方

### 課題
プロジェクトをディレクトリ毎コピーしてビルドした時に
Analyzeでビルドがコケる

### 対応
https://github.com/facebook/react-native/issues/14423

`rm -rf ~/.rncache`
そのあと
`react-native run-ios`
コピペで使える乱数メソッド

rand()で作った値が偏ってて使えないので、色々ググって実装。
アルゴリズムはXorshiftを使用。

```c:C
unsigned long sd[4] = { 123456789, 362436069, 521288629, 88675123 };

void seed(unsigned long s) {
    for (int i = 1 ; i <= 4; i++) {
        sd[i - 1] = s = 1812433253U * (s ^ (s >> 30)) + i;
    }
}

unsigned long xrand(unsigned int min, unsigned int max) {
    unsigned long t;
    t = (sd[0] ^ (sd[0] << 11));
    sd[0] = sd[1];
    sd[1] = sd[2];
    sd[2] = sd[3];
    return floor(min + (sd[3] = (sd[3] ^ (sd[3] >> 19) ) ^ (t ^ (t >> 8))) % ((max + 1) - min));
}
```

呼び出し元

```objc:Objective-C
// シード値を設定
seed((unsigned long)[[NSDate date] timeIntervalSince1970]);

// 1 ~ 100の乱数を作成
for (int i = 0; i < 100; ++i) {
    NSLog(@"%ld", xrand(1, 100));
}
```

ログ

```text:Output
18
31
49
25
90
75
41
83
2
52
88
63
76
4
.
.
.
```

ひとまず、rand()よりは使えそうかな。

参考
https://ja.wikipedia.org/wiki/Xorshift
CWL User Guide 6: Parameter References をやってみた

# CWL User Guide 6: Parameter References

[Common Workflow Language User Guide: Parameter References](http://www.commonwl.org/user_guide/06-params/)

今回は、パラメータを別の場所からもってくる方法について書かれています
またさらっとですがJavascript 文法のサブセットを使うことが示されています

第４回で作った `hello.tar` を一回消してあらたにつくるという流れで紹介されています。

# この回にでてくる主なキーワード

* $(...) Javascript

# CWLファイル、tar-param.cwl

```tar-param.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
baseCommand: [tar, xf]
inputs:
  tarfile:
    type: File
    inputBinding:
      position: 1
  extractfile:
    type: string
    inputBinding:
      position: 2
outputs:
  example_out:
    type: File
    outputBinding:
      glob: $(inputs.extractfile)
```

# パラメータファイル tar-param-job.yml

```tar-param-job.yml
tarfile:
  class: File
  path: hello.tar
extractfile: goodbye.txt
```

# 必要なファイル


```
touch goodbye.txt && tar -cvf hello.tar goodbye.txt
```

# 実行

## 実行前確認

`goodbye.txt` がないことを確認しておく

```console
$ rm goodbye.txt
$ ls goodbye.txt
ls: cannot access 'goodbye.txt': No such file or directory
```

## 実行方法

```
cwltool tar-param.cwl tar-param-job.yml
```

## 実行結果

```
$ cwltool tar-param.cwl tar-param-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'tar-param.cwl' to 'file:///home/vagrant/cwl_user_guide_work/06-params/tar-param.cwl'
[job tar-param.cwl] /tmp/tmpPxBToM$ tar \
    xf \
    /tmp/tmpeStGJP/stg5a9b22b8-fb0a-4b3f-8b20-5a35736060c7/hello.tar \
    goodbye.txt
[job tar-param.cwl] completed success
{
    "example_out": {
        "checksum": "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709",
        "basename": "goodbye.txt",
        "location": "file:///home/vagrant/cwl_user_guide_work/06-params/goodbye.txt",
        "path": "/home/vagrant/cwl_user_guide_work/06-params/goodbye.txt",
        "class": "File",
        "size": 0
    }
}
Final process status is success
```

## 実行結果確認

`goodbye.txt` ができたことが確認できた

```
$ ls goodbye.txt
goodbye.txt
```

# 今回使ったファイル

[cwl\_user\_guide\_work/06\-params at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/06-params)
Amazon MQにmosquitto(MQTT)とMQTT over Websocketで接続してみる

# Amazon MQ

Amazon MQ のやってみたネタはすでに[メソられている※](https://dev.classmethod.jp/cloud/aws/re-invent-2017-amazon-mq-first-impression/)ので、mosquittoや MQTT over Websocket での接続事例をやってみました

11/29現在ではリージョンは以下の通りです。今回はオレゴンで試しました

![amazon-mq-available-regions-in-2017-winter.png](https://qiita-image-store.s3.amazonaws.com/0/22754/0022d8c0-b33b-744f-d8fa-e7fc6df5c0f1.png)


※メソられている＝「クラスメソッドさんでブログが書かれている」という業界用語

## Amazon MQ のブローカー作成

Amazon MQ はActiveMQブローカー(いわゆるサーバ)のフルマネージド・サービスです。実装がEC2ベース(?)なので、それによるちょっとした基礎知識が必要となります

### ブローカー作成についての基礎知識

EC2ベース(?)ということもあり、good pointsと注意点があります

* VPC内に作れる (good)
* セキュリティグループを適切に設定する必要がある (注意点)

セキュリティグループについては、EC2インスタンスを作成するときと同じですが、ブローカー作成時の途中でセキュリティグループを作ることができません。ですので、あらかじめ作っておきましょう

今回はMQTTS(8883)とWebsocket(61619)、そして管理コンソール(8162)をopenしています

![sg-for-amazon-mq.png](https://qiita-image-store.s3.amazonaws.com/0/22754/4c7e65ea-5287-f692-138d-7004c0902a25.png)

### ブローカー作成手順

セキュリティグループを作ったら Amazon MQ の管理画面からブローカーを作成します
※パスワードとかURLとか出ちゃってますけど、すでに存在しませんよ。アシカラズ

ポイントはセキュリティグループです。 **default** を削除して、新規に作成したセキュリティグループを割り当てるようにしてください

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f32323735342f37396162653935632d393863382d333331362d636264392d3362356664356364326231362e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/22754/9038c55d-4caf-8323-4eab-a49ea5d6aa9a.png)

10分（というか15分くらい）待たされると、ブローカーが作成されます
エンドポイント一覧が確認できます

![endpoints-of-amazon-mq.png](https://qiita-image-store.s3.amazonaws.com/0/22754/1486525a-9a77-0d10-a225-182839aed785.png)

### トラブルシュート

もし、エンドポイント一覧のところに、下記のように表示されていたら、セキュリティグループ設定がミスってるかもです。確認しましょう

`Ensure the security group(s) associated with your broker allow inbound traffic from public IPs (e.g. 192.168.0.1:8162) to access your broker.`

![alert-of-sg-on-amazon-mq.png](https://qiita-image-store.s3.amazonaws.com/0/22754/15939c42-3b80-f702-6c97-30830def5093.png)


## mosquitto(MQTT)での確認方法

`mosquitto_sub` や `mosquitto_pub` コマンドで送受信できます
ポイントは `--capath /etc/ssl/certs/` です。TLS(SSL)通信ですので、証明書を指定するようにしましょう
`/etc/ssl/certs/` が無い場合は `apt install ca-certificates` とするなどして、インストールしてください

Subscribe;

```
$ mosquitto_sub --capath /etc/ssl/certs/ -u mquser0 -P dFLiRBi0U1oK \
  -h b-ad80650c-4d5d-497a-8c56-35e7bc49d605-1.mq.us-west-2.amazonaws.com -p 8883 \
  -t testtopic/#
```

Publish;

```
$ mosquitto_pub --capath /etc/ssl/certs/ -u mquser0 -P dFLiRBi0U1oK \
  -h b-ad80650c-4d5d-497a-8c56-35e7bc49d605-1.mq.us-west-2.amazonaws.com -p 8883 \
  -t testtopic/bar -m "Hello Amazon MQ by mosquitto"
```

## MQTT over Websocket での確認方法

HiveMQ の [MQTT over Websocket コンソール](http://www.hivemq.com/demos/websocket-client/)が使えます
http://www.hivemq.com/demos/websocket-client/

ポイントは **SSL** にチェックを付けるところですね

![websoket-client.png](https://qiita-image-store.s3.amazonaws.com/0/22754/334fd24e-c6f9-4bef-0783-3a65a6948de9.png)


## あとがき

ちょうイイネ。

### 困ったこと

「設定」が削除できないお。。。。

![confs-of-amazon-mq.png](https://qiita-image-store.s3.amazonaws.com/0/22754/1afa3fbe-af8a-9c95-2352-5d010b16e068.png)

EoT
Boto3で利用中のAWSアカウントIDを取得する

# 概要
- AWS SDK for Python(Boto3)で操作中のAWSアカウントIDを取得します
- 利用サービスは AWS Security Token Service(STS)です

# コード

```py3
import boto3

sts = boto3.client('sts')
id_info = sts.get_caller_identity()
print(id_info['Account'])
```

# 振り返り
- Accountは数字のみ12桁のアカウントIDがセットされます
- 他に、UserId、Arnなどの要素が含まれます
- 要するにAWS CLIの下記コマンドをコードにしたということですね

```
aws sts get-caller-identity
```
JDBCでPreparedStatementを利用する際、実際に発行するクエリ文字列を取得する方法

# はじめに
　`java.sql.PreparedStatement`を利用する際、プレースホルダに値をバインドした後の実際に発行されるクエリ文字列を知りたい場合があります(ログに出力する等)。フレームワークを利用する場合は、フレームワークから発行クエリ履歴を取得できたりしますが、素のJDBCを利用する際の取得方法をあまり見ないので書いてみました。
　なお、詳細はJDBCドライバにより異なるので、以下では__MySQL__と__PostgreSQL__について記載します。

# 環境
|  | プロダクト名  | バージョン |
|---|---|---|
|1 | Java  | 8  |
|2 | MySQL JDBC Driver  | 5.1.44 |
|3 | PostgreSQL JDBC Driver  | 42.1.4 |

# サンプルコード
　実際にプレースホルダ置換後のクエリ文字列を取得・表示するサンプルです。ローカル環境のデータベース`sample`、テーブル`ACCOUNT`のカラム`name`にアクセスする際のクエリ文字列を取得・表示します。

```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * PreparedStatementからプレースホルダ置換後のクエリ文字列を取得するサンプル
 */
public class JdbcTest {

	public static void main(String... args) {
		useMySQL();
		System.out.println("=====================");
		usePostgres();
	}

	/**
	 * MySQL版
	 */
	private static void useMySQL() {
		try (Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/sample", "ユーザー名", "パスワード");
				PreparedStatement statement = connection.prepareStatement( "select * from ACCOUNT where (name like ?)");) {

			statement.setString(1, "%hoge%");
			// ここでクエリ文字列を取得・表示
			System.out.println("mysql    > " + statement.toString());

			if (statement instanceof com.mysql.jdbc.PreparedStatement) {
				// MySQL版PreparedStatementにキャストして、MySQL固有の機能を利用できるようにする
				com.mysql.jdbc.PreparedStatement mysqlStatement = (com.mysql.jdbc.PreparedStatement) statement;
				System.out.println("参照無し版 > " + mysqlStatement.asSql());
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * PostgreSQL版
	 */
	private static void usePostgres() {
		try (Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/sample", "ユーザー名", "パスワード");
				PreparedStatement statement = connection.prepareStatement("select * from ACCOUNT where name = ?");) {

			statement.setString(1, "hogehoge");
			// ここでクエリ文字列を取得・表示
			System.out.println("postgres     > " + statement.toString());

			if (statement instanceof org.postgresql.jdbc.PgStatement) {
				// PostgreSQL版PreparedStatementには、asSqlメソッドは存在しない
				org.postgresql.jdbc.PgStatement postgresStatement = (org.postgresql.jdbc.PgStatement) statement;
				System.out.println("こちらは変わらず > " + postgresStatement.toString());
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}

```

# 出力
```bash
mysql    > com.mysql.jdbc.JDBC42PreparedStatement@5ef04b5: select * from ACCOUNT where (name like '%hoge%')
参照無し版 > select * from ACCOUNT where (name like '%hoge%')
=====================
postgres     > select * from ACCOUNT where name = 'hogehoge'
こちらは変わらず > select * from ACCOUNT where name = 'hogehoge'
```

# まとめ
　サンプルコードを見れば分かる通り、基本的に`java.sql.PreparedStatement#toString()`を実行することで、プレースホルダ置換後のクエリ文字列を取得できます。ただし、MySQLの場合は、取得できる文字列に参照情報も含まれる為、純粋にクエリ文字列だけ欲しい場合は`com.mysql.jdbc.PreparedStatement#asSql()`を実行する必要があります。
DNS設定周りで登場する用語のメモ

# 前提条件
- 今まで、インフラ担当部署がある現場でしか働いたことがなく、自分で設定したことがなかった
- 申請で見聞きしていた言葉たちをもう一度ちゃんと見つめ直そうと思った時のメモ

# 用語の説明
- 参考：[【ドメイン】DNSレコード設定の各レコードの意味を教えてください。](https://help.onamae.com/app/answers/detail/a_id/007883)

| 用語 | 正式名称 | 説明 |
|:--|:--|:--|
|　FQDN　|Fully Qualified Domain Name|*FQDN*とは、DNS（Domain Name System）などのホスト名、ドメイン名（サブドメイン名）などすべてを省略せずに指定した記述形式のこと。 例えば、「www.atmarkit.co.jp.」 はホスト名「www」とドメイン名「atmarkit.co.jp」をすべて揃えたFQDNである。|
|A|Address|A(Address)レコードは、IPｖ4でホスト名とIPアドレスの関連づけを定義するレコードです。「www」などのホスト名を入力し、VALUEにグローバルIPアドレスを入力することによって、サーバーへの名前解決が行われます。|
|AAAA||AAAAレコードは、IPｖ6でホスト名とIPアドレスの関連づけを定義するレコードです。|
|CNAME||NAMEレコードは正規ホスト名に対する別名を定義するレコードです。特定のホスト名を別のドメイン名に転送する時などに利用します。※正規ホスト名はAレコードが登録されている必要があります。※特定のファイルやサブディレクトリを指定する事はできません。※ホスト名なしのCNAMEレコードは登録することができません。|
|NS|Name Server|NSレコードとは、ゾーン情報を管理するネームサーバーのサーバー名を定義するレコードです。※NSレコードのホスト名はAレコードが登録されている必要があります。|

# AレコードとCNAMEレコードの違い
- 参考：[AレコードとCNAMEレコードの違い](https://qiita.com/PharaohKJ/items/b6a933b7f79afe8a32e1)

- Aレコード
    - ドメイン名:IPアドレス = 1:n を定義
    - IPアドレス:ドメイン名 = 1:n を定義
    - 両方設定可能
- CNAMEレコード
    - IPアドレス:ドメイン名 = 1:n を定義
    - とあるドメインに別名ドメインを設定可能
UE4でVR空間にカノジョを錬金 11日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 11日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回はLook Atを実装します。

#Look At

Look Atはアニメーションブループリントのノードの一つです。
詳細な説明は[公式ドキュメント](https://docs.unrealengine.com/latest/JPN/Engine/Animation/NodeReference/SkeletalControls/LookAt/index.html)を見てください。

Look Atはすでに以下の先駆者の方々が実装方法を載せているので、それを見ながら女性モデル（今回はユニティちゃん）を自分へ見るように実装します。

[UE4 LookAt機能を使ってGrayちゃんに見つめてもらってみる](http://unrealengine.hatenablog.com/entry/2017/06/05/220000)
[UE4 キャラクターの顔を特定の位置に向ける・Transform の向きを Blueprint で制御する（Look At）](http://kagring.blog.fc2.com/blog-entry-304.html)
[UE4とOculusで～いつもと違うコトをしよう](https://qiita.com/junyash/items/bcda9128e3e7853fb46c)

# ロジック

早速アニメーションブループリントを作成して、LookAtを使用しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/29041ddd-f57f-444c-a2e2-e89c94187036.png)

日本語のエディタでは検索に「注視点」と入れれば出てくると思います。
ボーンには首のボーンを、Look at AxisはYに-1、Look at Clampに40を入れています。

そしてLookAtLocationをPublic変数で参照できるようにします。キャラクターのBPから参照させるためです。

つづいて、キャラクター（ユニティちゃん）のブループリントで、カメラ位置をアニメーションに渡す処理を実装します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7d6f1761-0850-30b5-ae57-1be7dfcbc889.png)

MotionControllerPawnにPlayerタグを設定し、このBPで取れるようにします。
そしてカメラのWorldLocationを取得し、アニメーションBPのLookAtLocationを参照するPublic変数に格納します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/5ed121af-4dd7-974f-f04e-45da38580ccd.png)

これでこちらを見るようにはなりましたが、なんだか絶妙に微妙な方向を向いています……。
目玉がこちらを見ていないので、もうちょっとLookAtを増やす必要があるようです。

ゲームジャムではそこを調整する時間がなかったので、後日調整を行います。

#次回

次回はとりあえずゲームジャムで１時間で作成した、適当なゲームマネージャーを紹介します。
あまりも適当すぎて参考にはならないと思いますが。

© Unity Technologies Japan/UCL
道のシルエットをヒントに何処の道かを言い当てるクイズ

今年もやってきました[クソアプリ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kuso-app2017) の1日目です。
*発端*
---
2年前に居酒屋のよもやま話の中で

「道路のうねうねした形をヒントにどこの道か言い当てるクイズって成立するかな？面白いかな？？」

って話が頭の片隅に残っていて後日作ってみたんですよ。
*現物*
---
「[道路シルエットクイズ](http://imasin.com/labo/squiz/)」

ランディングページ↓
<img width="250" alt="s1.png" src="https://qiita-image-store.s3.amazonaws.com/0/100958/6257d60b-c903-a185-ad7e-c46cb1ed1554.png">
道路１をクリック
<img width="250" alt="s2.png" src="https://qiita-image-store.s3.amazonaws.com/0/100958/33f68336-f57f-0b98-3d7f-5e4a1c4f28c6.png">
緑のやつをクリックしてスタート
<img width="250" alt="s3.png" src="https://qiita-image-store.s3.amazonaws.com/0/100958/641be4e4-5dfc-3117-cbbc-1d4a735032c8.png">
地図部分をドラッグ
<img width="250" alt="s4.png" src="https://qiita-image-store.s3.amazonaws.com/0/100958/7d3e7d1b-4ac0-d91a-fd49-39f30e5e3189.png">
正解に近づいて来たらしい
<img width="250" alt="s5.png" src="https://qiita-image-store.s3.amazonaws.com/0/100958/40efb07b-56bf-3e8d-262a-9f12e99d0299.png">
正解w
<img width="250" alt="s6.png" src="https://qiita-image-store.s3.amazonaws.com/0/100958/059adbd8-a5d9-cb61-c105-7ec428684a38.png">


みなさんいかがだったでしょうか。成立していましたでしょうか。
いや回答は受け付けておりませんw
*後日*
---
で、やっぱりこういうのは[MA](http://mashupaward.jp/)だろって事でエントリーしたんですよ。何にもならなかったですけどw

でも、なんかこのUXがやっぱり頭の片隅に残っていたのでストリートビューと歩数計センサーくっつけて自分が公開しているアプリにのっけてみたんですよ。


そしたら[ここ](http://iphone.ascii.jp/2016/06/21/ranking88395454/)のランキングであのSNOWに次ぐ順位となり割とフン闘してくれました。

まぁ「[利益はウンチ](https://career.housecom.jp/serendipity-16/)」と同様「クソアプリはウンチ」目指してはいないけど遊んでいれば自然と出るものですな。
Amazon Connect CCP を立ち上げて初回の発信が上手くいかない件

現在、ソフトバンクキャリアに対して、050 0800 両方からの発信が１５分ほどないと、電話をかけることができるが、相手の電話に着信がないという問題が発生しています。
この問題については、報告済みであるものの、３週間ほど解決されていないため、問題があれば一旦通話を切断し、リダイヤルすることをおすすめします。リダイヤルすれば、相手に着信します。

この問題については現在概ね解決されています。しかしまだバグは残存しているので、困ったときは上記方法を実行してください。
CWL User Guide 5: Capturing Standard Output をやってみた

# CWL User Guide 5: Capturing Standard Output

[Common Workflow Language User Guide: Capturing Standard Output](http://www.commonwl.org/user_guide/05-stdout/)

今回は標準出力を、ファイルに書き込む例が書かれています

# この回にでてくる主なキーワード

* stdout
* type: stdout

# CWLファイル、

```stdout.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
baseCommand: echo
stdout: output.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
outputs:
  output:
    type: stdout
```

# パラメータファイル

```echo-job.yml
message: Hello world!
```

# 実行

## 実行方法

```
cwltool stdout.cwl echo-job.yml
```

## 実行結果

```
$ cwltool stdout.cwl echo-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'stdout.cwl' to 'file:///home/vagrant/cwl_user_guide_work/05-stdout/stdout.cwl'
[job stdout.cwl] /tmp/tmpP1A7UY$ echo \
    'Hello world!' > /tmp/tmpP1A7UY/output.txt
[job stdout.cwl] completed success
{
    "output": {
        "checksum": "sha1$47a013e660d408619d894b20806b1d5086aab03b",
        "basename": "output.txt",
        "location": "file:///home/vagrant/cwl_user_guide_work/05-stdout/output.txt",
        "path": "/home/vagrant/cwl_user_guide_work/05-stdout/output.txt",
        "class": "File",
        "size": 13
    }
}
Final process status is success
```
## 実行結果確認

```
$ cat output.txt
Hello world!
```

# 今回使ったファイル

[cwl\_user\_guide\_work/05\-stdout at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/05-stdout)
ProcessingのLight関連設定

# 1. directionalLight(v1,v2,v3,nx,ny,nz)：平行光源。
一方向のみを平行に均一に照らす。
・v1,v2,v3：色
・nx,ny,nz: 光の方向のベクトル

例：真下から白い光があたっている。

```
directionalLight(128,128,128,0,-1,0);
```

# 2. ambientLight(v1,v2,v3,x,y,z)： 環境光。
反射、散乱された間接光。 他のLightと組み合わせて使う。
・v1,v2,v3: 色
・x,y,z: ？ 

# 3. pointLight(v1,v2,v3,x,y,z)：点光源。
ある点から全方向に対して均一に照らす。白熱電球などをシミュレート。
・v1,v2,v3：色
・x,y,z: 光源の位置

例：球の左前方に赤い点光源がある。

```
background(0,0,0);
pointLight(100,10,10,50,200,150);
translate(250,200,0);
noStroke();
fill(255,255,255);
sphere(100);
```

# 4. spotLight(v1, v2, v3, x, y, z, nx, ny, nz, angle, concentration)：スポットライト。
狭い範囲を均一に照らす。（確実に照らされるよう、パラメータ値の計算が必要）
・v1,v2,v3: 色
・x,y,z: 光源の位置
・nx,ny,nz: 光の方向のベクトル
・angle: スポットライトのコーンアングルの角度
・concentration：コーンの中心バイアスを決定する指数

例：球の左上前方から白いスポットライトを当てる。

```
void setup(){
size(400,400,P3D);
}

void draw(){
int concentration = 200; // 1 to 10000 
background(0); 
noStroke(); 
spotLight(255,255,255, 150,100,800, 0.1,0.1,-1, PI/16, concentration); 

translate(250,200,0);
noStroke();
fill(255,255,255);
sphere(100);
}
```

# 5. lights()：デフォルトの環境光設定。
・ambientLight（128,128,128）
・directionalLight（128,128,128,0,0,1）
・lightFalloff（1,0,0）
・lightSpecular（0,0,0）
が設定される。
CircleCIで卒論リポジトリを研究室サーバに自動アップロードする

最近Githubを使用して、卒論をバージョン管理させるようにしました。（それまではGistでtexファイルのみ管理してました。）

しかし、そろそろ最終提出ということで、
こまめに研究室サーバへ進捗をアップロードしなくてはならなくなったため、CircleCIで自動化させるようにしました。

※ 追記 : 2018/01/23
uploadスクリプト内で`git config`でパスワード指定していた箇所を修正しました。

## 構成

![uploadci.png](https://qiita-image-store.s3.amazonaws.com/0/83373/84d711cb-8763-308a-80e1-e79e01c34ed4.png)


## git push ➜ uploadスクリプト実行
ここが一番ハマりました。

というのも、最初git hookの`post-receive`を使ってやろうとしていたからです。
> 参考 : [git hookでサイトを更新、やってみた](https://qiita.com/fnobi/items/98bd5d1c83c010842733)

数時間、`post-receive`の処理が呼ばれないと唸って、
詳しい友達に聞いたところ、Githubは出来ないからGitHub Webhookか、CIを使うよう教えてもらいました(´・ω・｀)

**今回はprivateリポジトリなのでCircleCIを選択。**

## uploadスクリプト実行 ➜ 研究室サーバへupload
今回研究室サーバのプロトコルはsftpのため、アップロードには`git-ftp`を使用することにしました。
> https://github.com/git-ftp/git-ftp
マニュアル : https://github.com/git-ftp/git-ftp/blob/master/man/git-ftp.1.md

`git-ftp`の良いところが`.git-ftp-ignore`ファイルで、アップロードしたくないファイルを指定できることです。
`README.md`や`.cilrcleci/`下のファイルなどは提出に不要なので取り除くようにしました。

```:.git-ftp-ignore
.gitignore
.git-ftp-ignore
README.md
.circleci/**
```

CirlceCIの設定ファイルは以下になります。
CircleCI2.0はローカルで実行して設定ファイルが正しく動作するか確認できて助かりました。
> 参考 : [CircleCI 2.0はローカル環境で実行できるよ](https://qiita.com/ieee0824/items/28c7fa9e69cfc6ee7075)

```:.circleci/config.yml
version: 2
jobs:
 build:
 docker:
 - image: buildpack-deps:scm
 steps:
 - checkout
 - run:
 name: Upload server
 command: |
 chmod +x .circleci/upload_server.sh
 ./.circleci/upload_server.sh

workflows:
 version: 2
 build_and_test:
 jobs:
 - build:
 filters:
 branches:
 only: master
```

uploadスクリプトは以下になります。

```sh:.circleci/upload_server.sh
#!/bin/sh

# updateを呼んであげないと、インストールできないとエラーになったため、updateを呼んでます
echo "Running: apt-get -y -qq update"
echo $(apt-get -y -qq update)


# git-ftpを使うため、インストール。
echo "Running: apt-get install git-ftp"
echo $(apt-get install git-ftp)

echo "Running: git ftp --version"
echo $(git ftp --version)

# いつからかssh鍵を使っていない場合、
# コマンドオプション側でパスワードとユーザー名を指定しないと、failureになるようになりました
# git config git-ftp.user "$USER_NAME"
# git config git-ftp.url "$URL"
# git config git-ftp.password "$PASSWORD"

# 研究室サーバへアップロード！ （git ftp init済みであること）
# $USER_NAMEなどはCircleCIページから設定したサーバのユーザー名などです。
echo "Running: git ftp push --remote-root <アップロードパス>"
git ftp push -u $USER_NAME -p $PASSWORD --remote-root /lab/xxxx/卒論 $URL
```

ちなみに、`--dry-run`オプションを付けることで実際にアップロードせずに実行結果を得ることが出来ます。不安な場合は一度つけてからの方が良いです。


## これで卒論が捗る
なんてことはなく、pushするものがないと機能しないので、頑張って書かなくては。。


卒論は消えるものらしいので、バージョン管理大切ですよね。
Amazon Connect の Contact flow に AWS Lambda　を置く方法

IVRを構築して、番号ごとに問い合わせを振り分け、違う AWS Lambda を起動する時に、
同一リージョンでなおかつ、応答タイムアウトを８秒に設定しないと、デフォルトだと全部失敗します。
あと、Lambda の成功失敗で条件分岐させることもできるはずなんですが、 
Lambda で何らかの成功レスポンスを返さないと、成功として判定されないようです。この部分はサポートに聞いても、何を返せばいいのかドキュメントにも載っていないとのことでした。

ドキュメントがアップデートされ次第、僕に通知をしてくれるとのことでしたので、この記事を更新します。
[ES2015(ES6)] Spread operator `...`（スプレッド演算子）とは


## 定義(Definition)

>複数の引数 (関数呼び出しのため) または複数の要素 (配列リテラルのため)、あるいは複数の値 (分割代入のため) が置かれるところで式が展開されます。

簡単に言うと、 **配列とか**を文脈に合わせて **展開**してくれるようなイメージです。

## 構文(Syntax)

### 1. 関数の呼び出しに対して:

```
myFunction(...iterableObj);
```

使用例１：

```
function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);
```

使用例２：

```
function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);
```

### 2. 配列リテラルに対して:

```
[...iterableObj, 4, 5, 6]
```

使用例：

```
var parts = ['shoulder', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes']; // ["head", "shoulders", "knees", "and", "toes"]
```

### 3.分割代入に対して:

```
[a, b, ...iterableObj] = [1, 2, 3, 4, 5];
```

##ブラウザの実装状況（2017.11.29時点）

### デスクトップ
|機能             |Chrome|Firefox (Gecko)|Internet Explorer|Opera|Safari (WebKit)|
|---------------|------|---------------|-----------------|-----|---------------|
|配列リテラルでのスプレッド演算|46    |16 (16)        |Edge             |未サポート|7.1            |
|関数呼び出しでのスプレッド演算|46    |27 (27)        |Edge             |未サポート|7.1            |
|分割代入でのスプレッド演算  |49    |34 (34)        |未サポート            |?    |?              |


### モバイル

|機能             |Android|Android Webview|Firefox Mobile (Gecko)|IE Mobile|Opera Mobile|Safari Mobile|Chrome for Android|
|---------------|-------|---------------|----------------------|---------|------------|-------------|------------------|
|配列リテラルでのスプレッド演算|未サポート  |46             |16.0 (16)             |未サポート    |未サポート       |8            |46                |
|関数呼び出しでのスプレッド演算|未サポート  |46             |27.0 (27)             |未サポート    |未サポート       |8            |46                |
|分割代入でのスプレッド演算  |未サポート  |未サポート          |34 (34)               |?        |?           |?            |未サポート             |


対応状況を見ると、 **3.分割代入** 構文はまだ使わない方が良いでしょう。

## 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator
JUCE調べものリスト


##TIPS
[DebugString等の出力](https://qiita.com/uribow/private/8c9ca1822bcf7150051f)

## juce_core
コアっていうくらい多分コア
他のすべてのJUCEモジュールが必要とする基本的なJUCEクラスの必須セット。
テキスト、コンテナ、メモリ、スレッディング、および入出力機能を含みます。
license: ISC
[ISCライセンスwikipedia](https://ja.wikipedia.org/wiki/ISC%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9)

- Modules
 - containers
 - files
 - javascript
 - logging
 - maths
 - memory
 - misc
 - network
 - streams
 - system
 - text
 - threads
 - time
 - unit_tests
 - xml
 - zip

## juce_box2d

Box2D物理エンジンといくつかのユーティリティクラスモジュール

## juce_cryptography
RSA、Blowfish、MD5、SHAなどのさまざまな基本暗号化機能のクラスモジュール


##analytics
操作分析の収集と送信を行うモジュール

- Analytics     分析データを管理するシングルトンクラス。
- ButtonTracker ボタンがクリックされたときに自動的にアナリティクスイベントをAnalyticsシングルトンに送信するクラス。　


##juce_data_structures 
スマートなデータ構造とUndo/Redoを管理するモジュール
license: GPL/Commercial

- modules
    - UndoManager Undoの管理、実行クラス 
        1. [UndoManagerとUndoableActionサンプルコード](https://qiita.com/uribow/private/4a85fa824ea0a1d4944f)
    - Values ヴァリアント型、構造化データ、シリアライズなど
     1. 構造化データ　[valuetreeサンプルコード](https://qiita.com/uribow/private/9d084dedc2aed84954c6)
     1. ヴァリアント変数　[Valueサンプルコード] (https://qiita.com/uribow/private/54b74a69580ba6bfc82c)
     1. valueTreeラッパ [CachedValue<Type>サンプルコード](https://qiita.com/uribow/private/55ce1d1362629bdd8b42)
     1. ValueTree間の通信を行うためのバイナリデータ生成と監視　[ValueTreeSynchroniserサンプルコード](https://qiita.com/uribow/private/33383de562c6f1891736)
 - app_properties アプリやユーザーの環境情報管理　
     1. [ApplicationPropertiesサンプルコード](https://qiita.com/uribow/private/570bdb3a5bbaadf82307)

##juce_events
アプリケーションのメインイベントループを実行し、メッセージ、タイマーなどを送受信するためのモジュール
ISCライセンス
[link](https://juce.com/doc/group__juce__events)

- Modules
 - broadcasters 
 - interprocess
 - messages
 - timers


## juce_graphics
2Dベクトルグラフィックス、画像読み込み/保存、フォント処理などのモジュール
[link](https://juce.com/doc/group__juce__graphics)

##juce_gui_basics
基本的なユーザーインターフェイスコンポーネントおよび関連するモジュール
[link](https://juce.com/doc/group__juce__gui__basics)

##juce_gui_extra
特殊な用途のその他のGUIクラスモジュール
[link](https://juce.com/doc/group__juce__gui__extra)

- code_editor
- documents
- embedding
- misc

##juce_opengl
JUCEのWindowでOpenGLをレンダリングするためのクラスモジュール
[link](https://juce.com/doc/group__juce__opengl)

## juce_product_unlocking
オンライン製品認証のクラス、プラグインDLC等が対象？
[link](https://juce.com/doc/group__juce__product__unlocking)

## juce_video
ビデオを再生し、カメラ入力をキャプチャするためのクラス
[link](https://juce.com/doc/group__juce__video)


## オーディオモジュール系は割愛

- juce_audio_basics
- juce_audio_devices
- juce_audio_formats
- juce_audio_plugin_client
- juce_audio_processors
- juce_audio_utils
- juce_blocks_basics
- juce_dsp
- juce_osc
お名前.comからRoute53へDNS切り替え

# 前提状況
- お名前.comでドメインを取得
- ネームサーバーはお名前.comを利用中
- Route53、ELBは使ってない
- WebサーバはAWSのEC2

# 実現したいこと
- [お名前.com](https://www.onamae.com/)のNSを、Route53に移管する

# 参考
- [【AWS】Route53で独自ドメインを管理してELBにアクセスするんだ！](https://i-think-it.net/aws-route53-manage-domain/)

# 全体の流れ
1. Route53でホストゾーンを作成
    - AWSコンソールにログイン
    - Route53を選択
    - Hosted zones > Create Hosted Zone を選択
        - Domain Name: (自分のドメインを入力)
        - Comment: (自由にコメントを設定)
        - Type:　Public Hosted Zone
2. Route53でNSを確認
    - 作成されたホストゾーンのNSを確認しメモる

3. お名前.comのドメインNaviにログイン～設定
    - 「ドメインNavi」にログイン > 「ドメイン設定」タブ > 「ネームサーバの変更」
    - AWSで作成したNSレコードを設定する
sessionStorageを使ってブラウザにデータを持たせよう!

## sessionStorageとは
sessionStorageとは HTML5から導入されたWebStorageという仕組みを利用し、JavaScriptを使ってブラウザにデータを保持できる仕組みです。
WebStorageには二通りあって `localStorage`と`sessionStorage`が存在します。
この記事では`sessionStorage`を使います！

## localStorageとsessionStorageの違い
- `WebStorage`
    - `localStorage`
      ブラウザを閉じたり再び開いたりしても持続します。
    - `sessionStorage`
      ページのセッション中 (ページの再読み込みや復元を含む、ブラウザを開いている間) に使用可能な、生成元ごとに区切られた保存領域を管理します。

## 対応ブラウザについて
対応ブラウザは以下のリンクの**ブラウザ実装状況**を確認してください。
[Web Storage API](https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API)

# 使い方について
値を保存する際はkeyとvalueを使い、取得・削除する際はkeyを指定して操作します。

### 保存

`sessionStorge.key = 'value'```
または
`sessionStorage['key'] = 'value'`
または
`sessionStorage.setItem('key', 'value')`

### 取得
`sessionStorge.getItem('key')`

### 削除
`sessionStorge.removeItem('key')`

### 初期化
`sessionStorage.clear()`

## 最後に
上記のようにsessionStorageを使ってブラウザにデータを持たせることができます:thumbsup:
良いsessionStorageライフを:sunny:
Node-redを激しく使うと起きることと対処法



#はじめに
色々とNode-redで処理を増やしていくと、だんだん挙動が怪しくなった時期があった。
あんまし細かく調査したわけじゃないので、嘘も混ざっているのかもだけれども、どこかで誰かの役に立てばと思い公開する。

#追記
バージョンあげたら全く発生しなくなった。
元々0.17.5とかだったのを0.18.5くらいにあげたらサクサクになった。感謝。

##起きる事象
1、Node-redが起動しない。
2、デプロイに失敗する＆サーバーがクラッシュする。
3、きちんと書いているのに動かない。
4、見えないNodeが残っていてエラーが出る。
5、パフォーマンスの強烈な低下。

##起きた事があるケース
・context.global.process.env.VCAP_SERVICES経由でEnvを見ようとするNodeがどこかにいる場合。
⇨1、2

・Subflowを入れ子する場合。
・Subflow内で激しく（感覚的に数十個）Nodeを入れた場合。
・そのSubflowを多数使う場合。　2018/05/14追記
・1回のDeploy時に変更となるNodeの接続数が多量の場合。（多分、サーバー側のチェックを走らせた時に、その数が多いと死んでしまう模様。）　2018/05/14追記
⇨1、2、3、5


・その辺で拾って来たソースをインポートする際、自分のパレットに無いNodeタイプがある場合に発生した事がある。使えないからと消しても、実は裏に残っているっぽい。この場合は、デプロイ時にエラーが出るので「ノードの設定」サイドバーからゴミNodeを削除してやればOKになるっぽい。
⇨4

・Debugノードを多数仕込んでいる場合。
⇨5

・HTTPでページを取りに行く際に、相手が応答しない。
⇨5

その他にも稀に（数十回に1回？）2が発生する事がある。再度デプロイすると問題なく通る事もあるので、メモリが足りてない時なのか？


##手探り解決策例
・問題のありそうなSubflow周りを治して（Subflow化しない）デプロイやり直し
・メモリをMaxまで増やして再起動（これで動くケースもあった気がする）
・全然起動しなくてソースの修正すら出来ない場合、以下で頑張る。
　　・ブラウザ側で頑張ってソースを直して、すべてのタブでインデントされたJSONフォーマットでエクスポートして、メモ帳などに一旦退避
　　・Cloudantを開いて、noderedデータベースの<アプリ名>/flow文書を開く
　　・中のJSONのFlowの項目を一旦バックアップとして別のメモ帳に退避し、上記でエクスポートしたJSONを貼り付ける
　　・サーバー再起動

##予防策
・動いたバージョンは定期的にExportして保管しておく。例えば、
　・起動時のトリガーでCloudant上のflow文書をAPI経由で取得してバージョンが変わっていたらGmailなどに送付する処理を仕込んでおく
　・Cloundantのレプリケーション機能などを使う？
・Deployする時にCPU使用率が高く無いことを確認して行う。（2018/05/14追記）

##その他
全く起動しなくなると、ソースコード修正もままならないのでかなり焦りますが、Cloudant側から弄れるのでなんとか頑張りましょう。