OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】ProBuilderで生成したオブジェクトの中心の位置がずれる

# 問題
ProBuilderを使って生成したオブジェクトの中心の位置がずれる。

<img width="631" alt="スクリーンショット 2019-05-12 午後10.57.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/ee28e799-b93d-3a95-b71c-ca0cd9cda515.png">
<img width="649" alt="スクリーンショット 2019-05-12 午後10.57.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/1e0fca38-5831-e216-9280-56cae9483db7.png">

白いCubeはUnityのHierarchyで普通にCreateし、
グレーのCubeはProBuilder -> New Shape -> Build Cube で作成しました。
どちらも位置は(0, 0, 0)です。

確かにグレーのCubeは位置がずれています。

## 原因

<img width="660" alt="スクリーンショット 2019-05-12 午後11.04.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/c8accdf0-f732-538d-30e9-5593cadbac74.png">
<img width="644" alt="スクリーンショット 2019-05-12 午後11.04.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/626899f7-295e-3afd-e26f-e3cbab7c163a.png">

グレーのCubeのCenterの位置とPivotの位置が異なっていることが原因です。

# 解決方法
PivotをCenterに一致させます。

対象のオブジェクトを選択  -> Center Pivot

<img width="333" alt="スクリーンショット 2019-05-12 午後11.20.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/b8c2f7c6-67e7-6c7c-dced-8ec14ecc0dbd.png">

これでPivotがCenterに一致しました。
<img width="640" alt="スクリーンショット 2019-05-12 午後11.21.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/53fc849d-f5ce-b38f-9827-8866185c4a2f.png">
【Node.js】スクレイピングアプリをDockerコンテナで起動してみた

やりたかったこと

- サーバーレス環境でスクレイピングアプリを動かしたかった
- Knative試したかったのでコンテナ化する必要があった


## nodejsでスクレイピングするアプリをサクッと作る
まずは好きなところにディレクトリ切って下記コマンドを叩く
`npm init`
出てくる質問は全てEnter連打した
次にスクレイピングに必要な `selenium-webdriver` をインストール
https://www.npmjs.com/package/selenium-webdriver

`npm install selenium-webdriver`

scrapingするプログラムを書いていきます。今回はgoogle chromeが既にインストールされている前提で話を進めます。

`vim example.js`

```javascript:example.js
const { Builder, By, Capabilities } = require('selenium-webdriver');

const capabilities = Capabilities.chrome();
capabilities.set('chromeOptions', {
  args: [
    '--headless',
    '--no-sandbox',
    '--disable-gpu',
    '--window-size=1980,1200',
    // other chrome options
  ],
});

(async function example() {
  console.log('start google scraping');

  const driver = await new Builder().forBrowser('chrome').withCapabilities(capabilities).build();
  try {
    await driver.get('https://www.google.com/?hl=');

    const text = await driver.findElement(By.xpath('/html')).getText();
    console.log(text);
  } finally {
    await driver.quit();
    console.log('finish scraping');
  }
}());


const sleep = time => new Promise((resolve) => {
  setTimeout(() => {
    resolve();
  }, time);
});
```

puppeteerもサクッと立ち上げるのには良さそうだったけどブラウザがchromium縛りになるのが嫌だったので今回はWebdriver使いました

## npm scriptsを定義する
`package.json` のscriptsに以下のようにstartタスクを追加します

```json:package.json
"scripts": {
    "start": "node ./example.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
```

試しにスクレイピングを走らせてみます
`npm start`

```console:consoleログ

fuga@hoge ~/D/g/scraping-sample> npm start

> scraping-sample@1.0.0 start /Users/a12711/Documents/git-localrepository/scraping-sample
> node ./example.js

start google scraping
Gmail
画像
ログイン
日本
プライバシー規約設定
広告ビジネスGoogleについて
finish scraping
```

うまくスクレイピングが動いてそうです

## Dockerfileを作る
今回はサクッと作りたかったので、seleniumのstandalone-chromeのイメージを元にして、nodejsをインストールするDockerfileを作成しました

```Dockerfile:Dockerfile
FROM selenium/standalone-chrome:3.141.59 

WORKDIR /usr/src/app

COPY package*.json ./

USER root

RUN curl -SL https://deb.nodesource.com/setup_8.x | bash
RUN apt-get install -y nodejs

RUN npm install

COPY . .

CMD npm start
```

## Docker Build
dockerが入っていない方はdocker desktop等でdocker入れてください

Dockerイメージを作成する
`docker build -t sample/robot .`

コンテナ起動
`docker run sample/robot`

```console:consoleログ
fuga@hoge ~/D/g/scraping-sample> docker run sample/robot

> scraping-sample@1.0.0 start /usr/src/app
> node ./example.js

start google scraping
Gmail
画像
ログイン
日本
プライバシー規約設定
広告ビジネスGoogleについて
finish scraping
```
先程と同様のログが出ています
これでスクレイピングのアプリをDockerコンテナとして動かすことができました
Railsのattributeはバリデーションではなくキャスト

モデルに書くattributeの意味がいまいち分かっていなかったので、調べてみました

# 使用例

```ruby
attribute :id, :integer
```
こんな感じでパラメーター名と型を書きますよね
最近まで意味がよく分からず、「idのデータ型をintegerに限定しているのかなあ」と何となく思っていました

# バリデーションではなくキャスト

attributeはバリデーションを設定しているのではなく、指定した型以外のデータが送られてきたら指定した型に変換(キャスト)します

```ruby

attribute(name, cast_type = Type::Value.new, **options)
```

cast_typeで指定したtypeではない型のデータが飛んできたら指定したtypeにcastします


```ruby
attribute :id, :integer
```

integerで指定して10.1がきたら10にcastします

```ruby
attribute :flag, :bool
```

boolで指定して"false"という文字列が飛んできたらbooleanのfalseにcastします

# バリデーションとの順番

attributeでキャストしてからvalidationが判定されるようです

```ruby
attribute :id, :integer
validates :id, numericality: { only_integer: true }
```
idを整数にcastして、整数のバリデーションをかけるとします
idが10.1で送られてきたら、attributeで10にcastされます
idが10で整数なので、only_integer: trueのバリデーションは通ります

整数のバリデーションをかけているのに、10.1が送られてきてバリデーションが通るのはよくないですね(10にcastされているとはいえ)

バリデーションをかけるときは、castの影響を考えてするようにしましょう

参考記事

[Rails5: ActiveRecord標準のattributes API（翻訳）](https://techracho.bpsinc.jp/hachi8833/2017_12_11/48422)
Nuxt.js + Vuetify.jsでグローバルなイベントのやり取りを event bus でやってみる

要は `Snackbar` や `toasts` などのメッセージを `$on` と `$emit` を使ってグローバルなイベントのやり取りをする感じ。
（これを `global event bus` というらしい）

## npm install

- Nuxt (v2.6.3)
- Vuetify (v1.5.13)
 - （[Snackbar & toasts Component — Vuetify.js](https://vuetifyjs.com/ja/components/snackbars)） を利用
- ほか適宜必要なライブラリ

## `plugins/event-bus.client.js` 作成

```javascript
import Vue from 'vue'

export default (ctx, inject) => {
  inject('bus', new Vue())
}
```

## `nuxt.config.js` にプラグイン登録

```javascript
plugins: [
    '~/plugins/event-bus.client.js'
]
```

## `Snackbars.vue` コンポーネントを作成

```vue

<template>
  <v-snackbar
    v-model="isEnabled"
    :color="color"
    :multi-line="true"
    :timeout="timeout"
    top
  >
    {{ text }}
    <v-btn
      dark
      flat
      @click="isEnabled = false"
    >
      <v-icon>
        close
      </v-icon>
    </v-btn>
  </v-snackbar>
</template>

<script>
export default {
  data () {
    return {
      isEnabled: false,
      text: '',
      color: 'success',
      timeout: 5000
    }
  },
  created () {
    this.$bus.$on('snackbar:success', (text) => {
      this.isEnabled = !!text
      this.text = text
    })
    this.$bus.$on('snackbar:error', (text) => {
      this.isEnabled = !!text
      this.text = text
      this.color = 'error'
      this.timeout = 0
    })
  }
}
</script>
```

## `layouts/default.vue`

```vue
<template>
  <v-app>
    <v-content>
      <nuxt />
    </v-content>

    <Snackbars />
  </v-app>
</template>

<script>
import Snackbars from '@/components/common/Snackbars'

export default {
  components: {
    Snackbars
  }
}
</script>
```

## pages/index.vue

```vue
<template>
  <v-btn
    @click="successBtn"
  >
    successBtn
  </v-btn>
  <v-btn
    @click="errorBtn"
  >
    errorBtn
  </v-btn>
</template>

<script>
export default {
  methods: {
    successBtn () {
      this.$bus.$emit('snackbar:success', 'success!!!1')
    }
    errorBtn () {
      this.$bus.$emit('snackbar:error', 'error!!!1')
    }
  }
}
</script>
```

これで `successBtn` と `errorBtn` を押すと Snackbars でメッセージが表示されるはず。


# 参考リンク

- https://github.com/nuxt/nuxt.js/issues/1139#issuecomment-430080727
- https://jp.vuejs.org/v2/guide/components.html#header
macOSで誤って削除したパーティションを復元する

testdiskというツールを用いてパーティションを復元します。
ただし、削除したパーティションがmacOSの起動ディスクにあった場合は、面倒です。
`Write`して`write: Error`と表示され上手くいきません。
macOSにアクセス権限がないので、USBに記録したubuntuなどの外部から起動してtestdiskを実行する必要があります。

[rEFItをインストール](http://basicwerk.com/blog/archives/817)してmacOS以外にbootできるようするか、
[この方法](https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-macos)などを用いて、EFIでboot可能なUSBを作成します。
Elmで関数と関数は比較できない。が、全く同じ場合は同じになるようだ。

## まとめ

```
>  (==) (\x -> x) (\x -> x)
Error: Trying to use `(==)` on functions.
There is no way to know if functions are "the same" in the Elm sense.
Read more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.>
> funcHoge x = x
<function> : a -> a
> (==) funcHoge funcHoge
True : Bool
> funcFuga=funcHoge
<function> : a -> a
> (==) funcHoge funcFuga
True : Bool
> funcPiyo x = x
<function> : a -> a
> (==) funcHoge funcPiyo
Error: Trying to use `(==)` on functions.
There is no way to know if functions are "the same" in the Elm sense.
Read more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.>
```

## 本文

タイトル意味不明でごめんなさい。

Elmで関数同士を比較して遊んでたら、 @ababup1192 先生から「関数同士は比較できないのでは」との指摘を受けた。しかし、一部ケースでは比較できてしまっていた。

ソースコードを調べてみると、
https://github.com/elm/core/blob/1.0.2/src/Elm/Kernel/Utils.js#L35-L44
あたりで `(==)` の実装が行われていた。
これをみると、
1. javascriptで `===` で比較し、trueであれば、その時点でtrueが返る。
2. もし成立しなければ、関数は `object` でも `null` でもないので、if文の中に入り、 `function` であるので、
3. https://github.com/elm/core/blob/1.0.2/src/Elm/Kernel/Debug.js#L262-L263 が呼ばれる。

つまり、関数同士を比較すると、全く同じものであれば `true` が、そうでなければ `error` として返ってくる。
「全く同じもの」である定義としては、「別名をつける」は含まれるが、「同じ定義である別関数」は含まれないようだ。(それはそうか、比較しようがないし)

というわけであまり使い道がないが、関数同士は全く同じであれば比較できるようだ。
Python3初心者が問題を解くときに引っかかったことメモ

#はじめに
超初心者の自分用の備忘録なので間違ってたらごめんなさい。
#forとかifとか
###for文(複数行にわたって書く)

```python3:sumple1.py
n = 2
for i in range(n):
  print(i)
#0
#1
```
###for節（簡単なものは一行でも書ける。リスト内包表記という。）

```python3:sumple2.py
n = 2
a = [i for i in range(n)]
print(a)
#[0, 1]
```

###if文
thenはいらないけど「:」忘れない。
イコールは二つ繋げないといけない。

```python3:sumple3.py
a = 3
if a == 1:
  print('aは1です')
elif a == -1:
  print('aは-1です')
else:
  print('aは1と-1以外です')
#aは1と-1以外です
```
#input()のシミュレーションをinput.txtを使ってする方法
paizaのスキルチェック問題を受けるときに、
自分の環境でテストするための準備として、標準入力input()の代わりにinput.txtを
同じディレクトリに置いてテストするときのコード。
もっといい方法があるかもしれない。

```python3:sumple3.py
path = './input.txt'
with open(path) as f:
  line = f.readlines()
a = [i.strip() for i in line]     #strip()で改行の'¥n'を削除 
```

#numpyのarrayを括弧なしの空白区切りで中身だけ標準出力する方法
2次元配列を標準出力するときに

```python3:sumple4.py
import numpy as np

H = 2
W = 3
HW = H * W
x = np.arange(HW).reshape(H,W) #H行W列の2次元配列xを作成
for i in range(H):
  strtmp = ""
  for j in range(W):
    strtmp = strtmp + " " + str(x[i,j])
  print(strtmp[1:]) #行頭のスペースを消して出力する

#出力結果
#0 1 2
#3 4 5
```

#リストの要素を昇順・降順で並び替える方法

```python3:sumple5.py
a = [1,3,2,4]
a.sort()
print(a)
#[1, 2, 3, 4]
a.sort(reverse=True)
print(a)
#[4, 3, 2, 1]
```

#プログラムを途中で止める方法

```python3:sumple6.py
import sys
sys.exit()
```

#リストの重複している要素を抽出する方法

```python3:sumple7.py
l1 = [1, 3, 4]
l2 = [2, 3, 4]
l3 = [1, 2, 3, 9]
l = l1 + l2 + l3

dup = [x for x in set(l) if l.count(x) == 3]
print(dup)
#[3]
```

#リストの最大値のインデックスを取得する方法

maxで最大値、minで最小値。

```python3:sumple8.py
l1 = [1, 3, 4]
print(max(l1))
#4
print(l1.index(max(l1)))
#2
```

#リストの要素を数える方法

[大きめのデータは、arr.count(x)よりもcollections.Counter(arr)の方がはやい](https://qiita.com/everylittle/items/9dfdfa4dd2e7b49b7a92#まとめ)
下の例は小さめのデータですが、len(a)が10**5とかでも2sec以内に収まるはず。
参考：[ABC072 C](https://atcoder.jp/contests/abc072/tasks/arc082_a)

```python3:sumple9.py
import collections
n=int(input())
a=[3 1 4 1 5 9 2]
c=collections.Counter(a)
ans=1
for i in range(min(a),max(a)+1):
  goukei=c[i-1]+c[i]+c[i+1]
  ans=max(ans,goukei)
print(ans) #4
```
macOSでBOOTCAMPに起動ディスクを変更できなくなった時の対処法

BOOTCAMPに起動ディスクを変更しようとしたところ`ブレスツールが現在のブートディスクを設定できませんでした。`というエラーが出ました。

[この方法](https://qiita.com/hoboaki/items/eb481029c860ea38f879)を試しても上手くいかないときは、パーティションの一部が壊れてbootできないようになっているので、それを修復します。

Winclone 6を使用してBOOTCAMP部分を右クリックして、`Make EFI Bootable`を実行します。これで、EFIからbootできるようになります。
![20141120150602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245957/b1c0b54e-81eb-ff70-1e01-f2d3b3d3f692.png)
Wincloneは有料ですが、上記の機能は体験版でも使用できるようです。また、Winclone 7などの最新版だとこのこの機能は使用できなかったので、Winclone 6を使用しました。
Chainerで謎のCUDAのエラー

#何が起きたか
Chainerでディープなモデルを訓練するとき謎のCUDAのエラーが出ててかなり困ったので、その時の問題点と対策を書きます。
エラーは以下の2種類が出ました。
>・CUBLASError: CUBLAS_STATUS_EXECUTION_FAILED
>・CUDARuntimeError: cudaErrorIllegalAddress: an illegal memory access was encountered

1回目に実行したときは一つ目、連続2回以上実行すると2つ目が永遠と出続けました。
このエラーコードで調べても解決方法は全く見つからなかったのですが、落とし穴は思わぬところにありました。

#問題点
今回は訓練にGenerative Adversarial Networks (GANs)を用いていたのですが、生成器にラベルを付けて訓練を行うもので訓練を行っていました。(訓練していたモデルはGeneratorにConditional Batch Normalizationを使っていたものです)

この時、画像はCupyでfloat32のobjectをVariableで括って作ってました。
ラベルはCupyで**int8**のobjectをVariableで括って作ってました。

この**int8**にしていたのが大問題でした。
型の不一致は当たり前のごとくギルティ―です。
しかし、今回Conditional Batch Normalizationに放り込む際、一度ラベルを埋め込むためにembed_idに投げる必要があるのですが、このembed_idはタイプの不一致の際に「タイプが違うよ！」という風に注意してくれるのではなく、冒頭に記述したようにあたかもCUDAのエラーであるかのようなエラーを返してきます。

当時私はメモリーを食ってほしくない一心があったのかは覚えてませんが、唐突にラベルだけint8に書き換えてしまっており、そんなことは全く覚えていない現在の私はCUDAのエラーかと思い、最初はConditional Batch Normalizationの部分にエラーが出ているなどとは露も知りませんでした。
地道にprint文を挟み続け結果Conditional Batch Normalizationの部分にエラーがあると気づいたのですが、根本のエラーの原因はただ型の不一致というしょうもないオチでした。

#対策
もはや対策を書くほどでもないですが、ただ型を一致させましょうというだけです。

#おわりに
たぶんembed_idを使うのは時系列のモデルを使う方が多いと思うのですが、もしこの記事が役に立てば幸いです。
ROS2 - 分散ノード

# ROSとROS2の通信
DDS(Data Distribution Service)に関しての記事です。
最後にはROS2でのリモートデータ通信のやり方も提示しています。
## ROSとROS2の違い
ROSではSSHの接続によりデータの送受信を行なっていました。
しかし、ROSでは独自のパッケージ実装により、
その信頼性は低いのが現状です。

その点を克服したのがROS2であり、RMWです。
RMWはDDS(Data Distribution Service)を裏で利用し、ワイヤ相互運用性プロトコルを通じてデータの送受信を行います。
これは、UDPという信頼のできないトランスポートを通じて通信を行うことを目的に設計されています。
そのため、リモートで高速な通信が可能というメリットがあります。
反対にデータの欠損が発生してしまうことがあります。

また、DDSは
・軍事
・宇宙
・大規模インフラ
で既に使用されているため、信頼性という点ではROSよりも上をいっているのがわかります。
https://www.co-nss.co.jp/products/middleware/dds.html
こちらを参照していただければ幸いです。

## 実行
必要なセットアップを行います。

[ PC1 , PC2 ]

```
export ROS_DOMAIN_ID="好きな数字"
```
以上で設定は完了です。
同一のネットワークに所属していれば、
以下の操作によりNodeとTopicが見えます。

[ PC1 ]

```
ros2 run demo_nodes_cpp talker
```

[ PC2 ]

```
ros2 run demo_nodes_cpp listener
```

## まとめ
今後は非力なマイコンをロボットには搭載し、
必要な時にのみ外部へ重い処理を委託することが、
より簡単に行うことができます。

ありがとうございました。
VSCodeでGDBデバッグするときに標準入力を渡す(Nimで試す)

# デバッグするときに標準入力渡せない問題
普段VSCodeでNimを書いていると、ちょくちょくデバッグしたいな〜となります。そこで[Native Debug](https://marketplace.visualstudio.com/items?itemName=webfreak.debug)を入れてGDBでデバッグしていたのですが、標準入力を受け付けてくれない問題がありました(もしかしたら僕が知らないだけで方法があるのかもしれません)。
流石にしんどいのでファイルに入力を記述し、パイプで渡そうと思ったのでその設定メモ。  
僕はNimですが、おそらくC/C++あたりでも同じなのではないでしょうか。

# settings.jsonに設定を記述
今回はプロジェクトに関わらずグローバルで設定を反映させたかったので、`settings.json`に記述しています。個別に設定したい場合は`launch.json`に同様のことを記述すればよいはずです。

以下僕の設定ファイルです。`arguments`以外は適当に[VSCodeでNimのデバッグ(ステップ実行)](https://qiita.com/6in/items/10325115859c93a1d6ba)あたりを参考にして書いてください。

```json:settings.json
{
    ...他の設定とか
    "launch": {
        "configurations": [
            {
                "name": "Nim Debug",
                "type": "gdb",
                "request": "launch",
                "arguments": "< ${fileBasenameNoExtension}.input",
                "target": "${fileBasenameNoExtension}",
                "cwd": "${fileDirname}",
                "valuesFormatting": "parseText"
            }
        ],
        "compounds": []
    }
}
```
こんな感じで、settings.jsonの下の方に``launch``以降を追記してあげます。
この設定では、`test.nim`があったらコンパイルによって生成しておいたバイナリ`test`を実行し、`test.input`を標準入力として渡しています。要は`"arguments": "< ${fileBasenameNoExtension}.input"`の部分で、引数として`< [nimファイル名から拡張子を除いた文字列].input`を渡すことで、パイプで入力を渡しているわけですね。

# 実際にデバッグ
![スクリーンショット_2019-05-12_21-31-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132881/9cdbee20-4389-1a08-0f5b-5654703561f0.png)
なんだかいい感じにできてますね。よかったよかった。

# 参考
- [Visual Studio Code Variables Reference](https://code.visualstudio.com/docs/editor/variables-reference)
- [VSCodeでNimのデバッグ(ステップ実行)](https://qiita.com/6in/items/10325115859c93a1d6ba)
ポートフォリオ「継続支援アプリ CHIRITSUMO!!」について

#はじめに
はじめまして。
今回、PHPの基礎のアウトプットを兼ねてポートフォリオを作成しましたので、説明します。

#目的
PHP言語を用いてフルスクラッチ開発をすることで、下記事項が理解できているかを確認する

・セッション
・GET送信、POST送信
・条件分岐、繰り返し処理
・DB関連(DB接続、SQL実行)
・DBデータの編集、画面への出力

#スペック
■言語
PHP, HTML, CSS, JavaScript(jQuery)

■DBMS
MySQL

■フレームワーク
なし

■サーバー
XSERVER

#ポートフォリオ
URL：http://chiritsumo.nyankormotti.com

#ポートフォリオの概要
勉強時間、実施内容を記録するWEBサービス

#ポートフォリオの機能
■ユーザー情報関連
・ユーザー登録
・ログイン・ログアウト
・ユーザープロフィール編集
・パスワード変更
・パスワードリマインダー
・退会

■メイン機能
・マイページ(実績一覧)
・実績登録
・実績編集
・実績削除
・実績詳細
・カテゴリー編集
・実績検索

■その他
・お問い合わせ


#何ができるか

■実績を投稿できる
　(勉強した日にち、勉強時間、内容、内容の画像を保存できる。POST送信にて対応)
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415296/1d89fece-670b-0e71-87c7-0bcefc57eace.gif)

■実績詳細にて保存した画像を拡大して閲覧できる(lightboxを使用)
![ezgif.com-video-to-gif.1gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415296/67affca1-75b0-a3af-685d-67088fd6f8d5.gif)

■実績をカテゴリーで検索、また実績日を範囲指定して検索できる。
 実績登録した日にちの昇順、降順でソートを実施できる。
 ページネーション後も検索情報を保持している。
 (GET送信にて対応)
　※多くのデータ数が必要なため、ユーザーを変更しています。
![ezgif.com-video-to-gif3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415296/7c9a9e5b-2c35-1d9e-4f36-fe1273f45d64.gif)



■その他
・パスワードリマインダーにて、登録されたメールアドレス宛に認証キー、新しいパスワードを送信する。

#作成方法
1.機能の洗い出し

2.画面モックの作成
![スクリーンショット 2019-05-12 21.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415296/2bf88640-a905-b9ba-0468-de4de19c962d.png)

3.テーブル設計、DB作成

4.各画面、機能を実装
ログイン、ユーザー登録機能などセッション周りから作成。
→パスワード変更など非機能要件
→POST・GET送信関連などのメイン機能を実装
→細部の調整

5.テスト
・各機能の処理が正常終了すること。
・商品一覧表示機能に関しては、境界値のデータを作成し、実施。
・URL直打ちした際にセッションが保持されているか確認。　など

#工夫したところ
■検索条件の保持
 実績詳細画面からマイページへ遷移する際や、ページングにてページを移動する際に、検索条件を保持するために、GET送信を用いています。
 実績詳細画面から戻る際は、実績テーブルのキーであるIDのみGET送信から削除して遷移しています。(遷移時のURLにて「p_id」を削除しています)

■お問い合わせ機能
 セッション情報の有無(ログイン前後)にて、お問い合わせ画面のメールアドレス入力フォームの表示・非表示を制御しています。
　（ログイン後はセッションIDよりDBからメールアドレスを取得し、メールを送信する仕様にしています。）

■マイページ画面の余白
 マイページ画面の余白を確保するために、検索フォームをモーダルで出力するようにしています。
 また、ヘッダーのメニューをドロップダウンにするようにして、空間を確保し、ゆとりを持たせています。
 (実績一覧の表示にはcssのoverflow:scrollにてスクロールして表示しています。)

#ポートフォリオの課題
・カテゴリー名変更機能の追加(登録、削除機能のみ)
・FWによるMVCモデルの適用(保守性が低い)
・SASSを用いたCSS実装(保守性が低い)
・レスポンシブ対応(1000px以下だと崩れる)

#現在の学習内容(2019.05.12現在)
・Laravel
・JavaScriptの基礎
・React、Vue.js（主にVue.js）
・SASS
・CSS設計(FLOCSS)

→Laravelでポートフォリオ作成予定
macOSでVS CodeのHaskellの環境構築で嵌った点

[vscode と haskell-ide-engine で Haskell 開発環境を構築する](https://qiita.com/waddlaw/items/b83cd10311200095fe87)を参考に、macOSで環境構築を行いましたが、いくつか嵌った点があるので、解決策を残しておきます。

# HIE 8.6.4がビルドできない
```
`gcc' failed in phase `Linker'. (Exit code: 1)
```
というエラーが出て最後にリンクで失敗しhieがビルドできていませんでしたが、代わりにHIE 8.4.4をビルドすると成功しました。

- Before

```
$ git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
$ cd haskell-ide-engine
$ stack ./install.hs hie-8.6.4
```

- After

```
$ git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
$ cd haskell-ide-engine
$ stack ./install.hs hie-8.4.4
```

# VS Code上でHIEが動かない
````
The Haskell HIE (test) server crashed 5 times in the last 3 minutes. 
The server will not be restarted.
```
というエラーメッセージが出て、VS Codeの拡張機能(Haskell Language Server)とHIEがうまく連携できていませんでしたが、`stack new`でプロジェクトを作成した上で、HieWrapperを無効化すると上手くいきました。
VS Codeの`setting.json`を以下のように編集します。

- Before

```
"languageServerHaskell.useCustomHieWrapper": true
```
- After

```
"languageServerHaskell.useCustomHieWrapper": false
```
【WIP】リスト型の関数まとめ


##要素を追加したいとき
###append
appendは**〜を…に付け加える**という意味の動詞
文字通り要素をリストの末尾に追加する

```list.py

v.append("e")

v
['a', 'b', 'c', 'd', 'e']
```
追加する要素の順番を指定したい場合はinsertを使用する

###insert
`v`というリストの頭に`f`という要素を追加したい場合、コードは
`v.insert(0, f)```となる
一つ目の引数で値の位置を指定、二つ目の引数で追加する要素を宣言する

```list.py
v.insert(0,"f")

v
['f', 'a', 'b', 'c', 'd', 'e']
```

##要素を削除したいとき
###remove
指定した要素をリストから削除する

```list.py
v.remove('f')

v
['a', 'b', 'c', 'd', 'e']
```

###pop
指定された位置にある要素をリストから削除する

```list.py
v.pop(0)
'a'

v
['b', 'c', 'd', 'e']
```

##リストを一掃する
###clear
```list.py
v.clear()

v
[]
```

#関数の種類
関数には破壊型と非破壊型がある
###sorted
非破壊型の関数。リスト内の要素が文字列で構成されている時、要素を降順に並び替えてくれる。

```list.py
b = ["Bob", "Lucie", "Nick","Anna"]

sorted(b)
['Anna', 'Bob', 'Lucie', 'Nick']
```
しかしsorted関数を用いた要素の並び替えは一時的なもので、リストに直接影響(破壊)するわけではない。

```list.py
b
['Bob', 'Lucie', 'Nick', 'Anna']
```
###sort
対してsort関数は破壊型で、

```list.py
b.sort()

b
['Anna', 'Bob', 'Lucie', 'Nick']
```
リスト内の要素の序列に直接影響を及ぼす。
Fargate ServiceDiscovery機能によって作成されたHostZonesを削除する

# 概要
FargateのServiceDiscovery機能を有効にした際に自動的に作成されるRoute53上の `.local` というHostZonesの削除方法を記載します。
# 手順

```
aws servicediscovery --profile (ご自身のprofile名) list-services
```
```
aws servicediscovery --profile (ご自身のprofile名) delete-service --id (上記で表示されたServiceId)
```
```
aws route53 --profile (ご自身のprofile名) list-hosted-zones
```

```
{
    "HostedZones": [
        {
            "Name": "local.",
            "Config": {
                "Comment": "Created by AWS Cloud Map namespace with ARN arn:aws:servicediscovery:ap-northeast-1:190063289881:namespace/ns-xoyphpqpt3lyki5r", *
                "PrivateZone": true
            },
            "LinkedService": {
                "ServicePrincipal": "servicediscovery.amazonaws.com",
                "Description": "arn:aws:servicediscovery:ap-northeast-1:190063289881:namespace/ns-xoyphpqpt3lyki5r"
            },
            "CallerReference": "qc2tsqsuyrajag2d3s4jyllzyjtyz25t-ju56hm0a",
            "ResourceRecordSetCount": 2,
            "Id": "/hostedzone/Z177BH0WQDGIR8"
        }
    ]
}
```

```
aws servicediscovery --profile (ご自身のprofile名) delete-namespace --id (上記で表示されたNameSpaceId)
```

```
aws route53 --profile (ご自身のprofile名) list-hosted-zones
```
Magic Leap MagicScript Landscape Application. UiColorPicker

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.1.1
https://www.npmjs.com/package/magic-script-polyfills

glb file
https://poly.google.com/view/9z0VORJQF31


**Create Project**

```
magic-script init my-color org.magicscript.color "Color Picker"
cd my-color
mkdir res
```
Put glb file in res folder.

**Code**
Change app.package

```
DATAS = "digest.sha512.signed" : "." \
        "bin/" : "bin/" \
        "res/" : "res/"
OPTIONS = package/minApiLevel/2
```
Change app.js

```javascript
import { LandscapeApp, ui } from 'lumin';
const { 
    UiText
  , UiColorPicker
  , UiLinearLayout
  , Alignment
} = ui;

export class App extends LandscapeApp {
  onAppStart () {
    const prism = this.requestNewPrism([1.0, 1.0, 1.0]);
    
    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    const resource = 
            prism.createModelResourceId("res/Buggy.glb", 0.004);
    const model = prism.createModelNode(resource);
    layout.addItem(model, [0.01, 0.01, 0.01, 0.01]);

    const color_picker = 
            UiColorPicker.Create(prism, [1.0, 1.0, 1.0, 1.0], 0.5);
    color_picker.setAlignment(Alignment.CENTER_CENTER);
    layout.addItem(color_picker, [0.01, 0.01, 0.01, 0.01]);
    color_picker.onColorChangedSub(function(event)
    {
      model.setColor(color_picker.getColor());
    });
    prism.getRootNode().addChild(layout);
  }
}

```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
UiColorPicker (MagicScript API)
https://docs.magicscript.org/lumin.ui.UiColorPicker.html

magicscript
https://www.magicscript.org/

Thanks!
fish: nodebrewで必要なPATHを設定


[nodebrew](https://github.com/hokaccha/nodebrew)を[fish](https://fishshell.com/)の環境で使うためのパスの設定。


```
~> set -U fish_user_paths $HOME/.nodebrew/current/bin $fish_user_paths
```

コマンドを実行すると、自動的に`~/.config/fish/fish_variables`に反映される。


参考：
https://fishshell.com/docs/current/tutorial.html#tut_path
DefoldのGitバージョン更新方法

#DefoldのGitバージョン更新方法　（初心者用）

2DゲームエンジンDefoldはチームでゲーム制作がしやすいようにGit機能が付いています。
詳しい説明は公式マニュアルに書いてあります。
https://www.defold.com/manuals/version-control/

前提として
①Defoldアカウント作る
②アカウントページでプロジェクト作る
③エディタにプロジェクトをインポートする
必要があります。

流れはこんな感じです。


![git flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/cec8de79-7f54-c7c4-d594-5d63ee3ba7bf.png)

とりあえず使いたい人は下記手順スクショ参照。

##【手順】
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/61fa38a7-2139-4556-8617-b4dee79e1918.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/23fc5d05-8da0-ad27-6cf6-6a041f595493.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/c27c7199-136f-684e-70fe-dad3d8482bd9.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/626407f7-c513-0335-0f8c-57273ede9570.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/4adc18d1-42d6-1f62-bbc4-0ac127100416.png)
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413522/ec8d5f3f-06f1-d941-ecd7-8c3048e1c74f.png)

※正直自分もGitなんて使ったことはないので
説明文も自分が納得するように書いただけです。

わかりにくいところあればご指摘お願いします。
【Java】10分でわかる！連想配列とHashMap

##はじめに

Javaでも連想配列を使用することができます。
そもそも連想配列とは何か？という疑問を解消するとともに、Javaで使用することになるHashMapの使い方をさっと10分ぐらいで理解できるようになっていただこうかと思います。

##連想配列とは何ぞや？

そもそもの疑問ですが、連想配列とは何でしょうか。
Javaにおける配列はご存知だと思うのですが、配列名[インデックス番号]で取り出すことができます。
一方でデータベースのように配列に格納されたイメージをもとに値を格納したり、指定した要素を取り出すことはできません。
例えば「りんご」という値段が「100円」だったとして、言葉同士を目印にして自由に値を出し入れできないという不便さがあるのです。

それを解決するのがこれから説明する「連想配列」のお話。
先の例で挙げるなら「りんご」がkeyになり、紐づく「100円」がvalueとなります。
下のイメージ例にもあるように、言葉同士でkeyとvalueで繋がった配列を「連想配列」と呼びます。
配列で「りんご」を指定すると「100円」が取り出せるイメージです。

![連想配列.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/14a78dff-f20a-55fc-722c-517f9747f247.png)


連想配列を使用するにはこれから説明するHashMapを使用することで実現が可能になります。

##HashMap

HashMapを使用するためにはHashMapクラスのオブジェクトを生成する必要があります。
このような感じで。

```HashMapTest.java
HashMap hmap<String,Integer> = new HashMap<String,Integer>();
```

HashMapクラスのオブジェクトを生成するとマップ上にkeyとvalueをマッピングしたり、削除したりといったメソッドが使用できるようになります。
主要なメソッドを以下に一覧化しておきます。

| メソッド名       |引数 |説明|
|:-----------------|:------------------|:------------------|
| put             | 第一引数：K key,第二引数：V value | keyと、keyに関連づけられるvalueをマップにマッピングします。 |
| get           |第一引数：Object key |keyを第一引数に渡すことで戻り値としてkeyに関連づけられるvalueを戻り値として返します。  |
| remove           |第一引数：Object key |指定されたキーのマッピングがあればマップから削除します。  |
| replace           |第一引数：K key,第二引数：V value | 指定されたkeyが存在し何らかの値がセットされている場合のみ、valueを第二引数で置換します。 |
| containsKey           |第一引数：Object key |指定のkeyのマッピングがマップに含まれている場合、戻り値にtrueを返します。  |
| containsValue           | 第一引数：Object value| 指定のvalueのマッピングがマップに含まれている場合、戻り値にtrueを返します。 |
| clear           |引数なし | 全てのマッピングをマップから削除します。 |
| isEmpty           |引数なし | マップがキーと値のマッピングを保持しない場合にtrueを返します。|
| size           |引数なし |マップ内のkey値のマッピングの数を戻り値として返します。  |

サンプルも以下の通り用意しましたので、「へー。こんな感じで使用するんだ」って参考にしていただければ幸いです。

```HashMapTest.java

import java.util.HashMap;

public class HashMapTest {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

		HashMap<String, Integer> hmap = new HashMap<String, Integer>();

		//		追加
		hmap.put("りんご", 100);
		hmap.put("バナナ", 200);
		hmap.put("ぶどう", 300);

		//		取得
		System.out.println(hmap.get("りんご"));

		//		指定したkeyが含まれているか(含まれるのでtrueが返る)
		System.out.println("containskey:" + hmap.containsKey("バナナ"));

		//		指定したvalueが含まれているか（含まれないのでfalseが返る）
		System.out.println("containsValue:" + hmap.containsValue(400));

		//		削除
		hmap.remove("ぶどう");

		//		マッピングの数を取得
		System.out.println("size:" + hmap.size());

		//		全削除
		hmap.clear();
		System.out.println(hmap.isEmpty());

	}

}


```

いかがでしたでしょうか。
HashMapを業務や学習などにお役立てくださいね。
やっていきましょう。
【Julia初心者向け】Juliaで内包表記

# はじめに
今日は内包表記について書いていきます。

> 2019/05/13　追記:内包表記がforループより遅くなってしまったと書きましたが、
> 実行速度が遅くなってしまった原因はグローバルで実行したためでした。

# リスト内包表記
内包表記の基本構文は以下の通りです。
[変数 for 変数 in イタレーター]

```julia

num = [n for n = 1:5]
> [1, 2, 3, 4, 5]
```

後置if文を置くことで、イタレーターで取り出す変数に条件をつけることができます。

```julia
a = [num for num in 1:10 if num % 2 == 0]
> [2, 4, 6, 8, 10]
```

前置if文も記載することで、リストに入れる値に分岐つけて処理をすることができます。
前置if文は複合式として書きます。

```julia
# 奇数は二乗します
a = [(if num % 2 == 0 num else num^2 end) for num in 1:10]
> [1, 2, 9, 4, 25, 6, 49, 8, 81, 10]
```

# 辞書内包表記
辞書内包表記はzip関数を使用します。

```julia
a = Dict(k for k = zip(["jp","USA","UK"], [0,1,2]))
> (  "USA" => 1, "UK"  => 2, "jp"  => 0)
```

zip関数はそれぞれの要素のタプルが返ってきます。
それぞれの要素をアンパッキングする場合は、下記のようにタプルで指定しないとエラーになります。

```julia
a = Dict((k,v) for (k,v) = zip(["jp","USA","UK"], [0,1,2]))
> (  "USA" => 1, "UK"  => 2, "jp"  => 0)

#これはエラーになります。↓
a = Dict((k,v) for k,v = zip(["jp","USA","UK"], [0,1,2]))
syntax: invalid iteration specification

```

それぞれの要素をアンパッキングすれば、下記のように条件を指定することができます。

```julia
a = Dict((k,v) for (k,v) = zip(["jp","USA","UK"], [0,1,2]) if v % 2 == 0)
> ("UK"  => 2, "jp"  => 0)
```

# 速度について
Pythonではforループでリストを作るより、リスト内包表記で作る方が速いです。
Juliaではどうか、検証してみました。

- リスト内包表記  

2019/05/13 追記: このベンチマークは正しい比較になっていないので、下記の追記を参照してください！

```julia
@time [num for num in 1:5 ]
> 0.026119 seconds (53.28 k allocations: 2.622 MiB)
```

- for loop

```julia
@time begin
    begin
        b = []
        for num2 in 1:5
            push!(b,num2)
        end
        b
    end
end
> 0.000005 seconds (3 allocations: 208 bytes)
```

予想以上にforループがあまりにも早くて、びっくりです。
一応、確認のために複合式でも計測してみました、

```julia
@time (c = []; for num2 in 1:5 push!(c,num2) end; c)
> 0.000009 seconds (3 allocations: 208 bytes)
```

あまり、速度に変化がないので正しく計測できていることにします。
~~Juliaのforループは非常に高速なので、速度を気にしてリスト内包表記にする必要ないみたいです。~~

# 2019/05/13 追記
コメントでご指摘を受けまして、再度速度検証しました。
内包表記が速度が遅い原因は、グローバルで実行しているためです。
Juliaのドキュメントにも、グローバルは避けましょうと書いてあるのに、
グローバルでベンチマークとったことを反省・・・

適当に関数でラップすると爆速になりました。

```julia
f() = [num for num in 1:5 ]
@time f()
  0.000002 seconds (5 allocations: 288 bytes)
5-element Array{Int64,1}:
 1
 2
 3
 4
 5
```

また、コメントでもご指摘のBenchmarkToolsを使うのが、ベンチマークの正しい取り方だと思います。
↑ドキュメントにもきちんとそう書いてあるorz


# まとめ
Juliaの内包表記は簡単に記載できます。
~~しかし、速度面ではあまりメリットはありませんが、~~
~~リストの初期化処理などをシンプルに記載できるかと思います。~~

> 2019/05/13 追記　Juliaでも内包表記爆速です。
> Juliaではグローバルで実行したり、変数作ったりするとかなり実行速度が落ちることがわかりました。
AWSでAuto Recoveryを意図的に発生させたい

Auto Recovery発動後のEC2の動作確認がしたかったので、方法を調べてみました。
StatusCheckFailed_Systemを意図的に失敗させる方法がわかればAuto Recoveryを発動させることができると考えていたのですが、うまくいかず・・・。
結論からいうと「Auto Recoveryを意図的に発生させることはできない」になるのですが、やったことをまとめます。

##検証環境
- Windows Server 2016

##やったこと
- ネットワークインターフェースを無効にする
- AWSのサポートセンターに問い合わせる

##ネットワークインターフェースを無効にする
GUIでネットワークインターフェースを無効にしました。
![ステータスチェック2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/ef3f6b76-28a1-c66c-e9c8-f9caea330956.png)
結果・・・
システムステータスのチェックではなく、インスタンスステータスのチェックが失敗になりました。
![ステータスチェック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/3abe49b4-e844-e0a6-dc3f-5ada4ecfa57e.png)

##AWSのサポートセンターに問い合わせる
以下のような回答をいただきました。

> 大変恐れ入りますが、StatusCheckFailed_System のステータスチェック失敗を意図的に発生させる方法は提供しておりません。
ご要望を満たすことができる方法ではないかもしれませんが、AWS CLIの「set-alarm-state」を使用し、設定されたアラームを意図的に発報することは可能でございます。
以下に、コマンドの例を記載させていただきます。
`
aws cloudwatch set-alarm-state --alarm-name <アラーム名> --state-reason <任意の理由> --state-value ALARM
`
このような方法でアラームを発報した場合、実際にAWS基盤の障害が発生している状況ではございませんが、CloudWatchアラームが動作するかのテストは可能であると考えられます。

StatusCheckFailed_Systemを意図的に発生させる方法はないとのことでしたが、一応上記のコマンドを実行してみました。
![ステータスチェック3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/80290500-f330-99ed-72a4-5dc5b6dcf33c.png)

その結果・・・
CloudWatchでアラームの履歴を確認してみると以下のようになっており、短時間の間に状態が変わったことがわかりました。
しかしAuto Recoveryが発動した気配はありません。
![autorecovery_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/3bdd14b0-1617-1494-c893-820b20ec049f.png)

そこでメールをチェックしてみると、契約アカウントに以下のメールが届いてました。
![message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/4ee8d3d6-20e8-f621-96b1-e92787b5297f.png)
・・・手動でアラームのステータスを変えたことがばれていましたね。。

##結論
Auto Recoveryを意図的に発生させることはできない。
Chatロボット#04運勢占いロボット

前回まで
>Chatロボット#01Dialogflowを登録しよう
https://qiita.com/soup01/items/83e5d53bb526c986797d
Chatロボット#02DialogflowとLineを繋がりましょう
https://qiita.com/soup01/items/ea225ecc793ca525b66d
Chatロボット#03Intnetを拡張してみる
https://qiita.com/soup01/items/84ebed54445284fd4196

今回は簡単な運勢占いロボットを作りますー

Entitiesをクリックします。
![dig1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/100990ee-172a-4061-9ef2-49974c4a732a.jpeg)
”CREATE ENTITY"をクリックします。
![dig2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9d1e191e-b3b5-6f4a-73f8-37d8ae3f7162.jpeg)
ここでBirthという名前をつけてます。
右の入力になると、左側のパラメータになるというルールがあります。
つまり、1、1月だと”1月”というパラメータになる、そしてSAVEします。
![dig3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1e5d529f-b7ae-6914-7123-e64e2731c915.jpeg)
今度は新しいIntentを追加しますねね～運勢占いのIntentを作ります。
![dig4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/74805737-1d7b-0345-9140-dc1d28414a0b.jpeg)
返事テキストも追加しますー
![dig5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/48abe8e8-17fc-00d3-84f1-2ac87ad59cf7.jpeg)
Follow-up intentを追加しますー
![dig6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/903ed6e3-59de-1594-58cf-077dcca9cebe.jpeg)
ここで1月を入れます。そして自動的に黄色になるのね？先のEntitiesにBirthを作ったこと覚えてますか？ここで自動的にあのEntitiesとつながってて$Birthになります。
![dig7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/51171535-0b62-c40d-7b9e-94842ad7c427.jpeg)
そして最後返事のところで５つを入れて、Dialogflowがランダムの返事を返してくれます。
![dig8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d04779da-e20d-b9f4-63e7-0ea4864ad9ce.jpeg)
試してみよう！
![dig10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e3b0f60c-cca9-f484-577b-084c31374131.jpeg)
![dig12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/a6146db0-dee0-8142-2379-d6a49564c473.jpeg)
ですが…平仮名のうらないなら、認識できなさそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/150e2307-01ef-9615-7904-00f9ff7031fd.png)
ここでTrainingをクリックします。
![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/bbde64f2-704e-01fc-d381-c6c8448c6aaf.jpeg)
ここで会話のリクエスト数、マッチできない回数などが書いています。
![flow2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/070da691-0e22-91f3-1dab-30fc19fc84d0.jpeg)
１つ目をクリックしたら、あ、占いしてとうらないがマッチできるIntentがない。
![flow3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c7eb379b-bf85-d532-a53d-c2f58873f95e.jpeg)
Click to assignを押して、先追加してた占いIntentを選択します。
![flow4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/62e6e73c-fa8d-6b6c-3388-205db6a70f57.jpeg)
これでOK！
![flow5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f835313e-de34-829b-2d2a-f50b43570cc5.jpeg)
大丈夫になってたね！
![flow6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8a571087-68db-ffda-aaa2-aa16b14831d3.jpeg)



お疲れ様です。ー
MT4のEAを自作する時のリファレンスや参考資料など

#2021/01/14 追記
[1]の方が更新を再開されたようです．"自作してみる"項目が追加されてます．自作EAを作ろうとしている方は一通り読むと良いスタートダッシュができると思います．
https://yukifx.web.fc2.com/sub/make/01_root/cone/make_root.html

###資金管理について（タートルズ）
『マネーマネージメント研究』
https://info.fxprime.com/isle/information/pdf/180530.pdf
小次郎講師流トレードの極意
https://ssl.radionikkei.jp/trend/files/kojirostyle.pdf
###1分足データの取得について
勝手にMT4の方で読み込んでくれるので初めての人は[5][6]を無視してもいいと思います．
#動機
参考になれば幸いです。
[1] には関数や変数のリファレンス。他にも詳しく乗っています。
初めての人は[2]と[3]を参考にサンプルEAを改良して見るのが良いと思います。
[4] には様々なテクニカル指標について詳しく解説があります。
[5] を参考に過去の値動きからテストするための長期データ作成。元となる1分足は[6]から取得しました。

#参考資料
[1]MT4でEA自作しちゃお～ 
http://yukifx.web.fc2.com/index.html

[2]【保存版】MQL言語入門まとめ｜EA・インジケーターの作り方 
https://get-daze.net/2018/11/02/mt4-mql-matome/

[3]MQL言語入門｜オリジナルEAの超簡単な自作方法 
https://get-daze.net/2018/10/06/mt4-program/

[4]テクニカル指標一覧　MT4のEA作成代行Meta EA　株式会社FreeMan&Company 
http://system-trade.biz/learn-ea-20.html

[5]ヒストリカルデータ1分足から他の時間足を生成する方法 | FXTF公式ブログ 
https://www.fxtrade.co.jp/blogs/?p=3518

[6]MT4 1分足データ | FXDD 
https://www.fxddtrading.com/bm/jp/resources/mt4-one-minute-data
Flutter, Dartでタイマー表示する

# コード

## initState()の中で処理をぶん回す

### 入れるコード

```dart
  var _now = DateTime.now();

  @override
  void initState() {
    super.initState();
    Timer.periodic(
        Duration(milliseconds: 1),
        (Timer t) => setState(() {
              _now = DateTime.now();
            }));
  }
```

### コードを入れる箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39243/31884ca2-d869-6569-3afa-6a22f87316fc.png)

## Textで時間を表示する

### 入れるコード
```dart
Text('$_now'),
```

### コードを入れる箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39243/0e71c14f-9c35-7caf-f17d-aa77c5241471.png)

# こんな感じになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39243/f1147bf3-abef-b44d-dfa0-ce2d3c03ef11.png)
OpenAMログイン画面のUIを変更する

# はじめに

OpenAMのログイン画面を変更する方法。

[OpenAM CommunityEdition](https://github.com/OpenIdentityPlatform/OpenAM)をデプロイし、初期設定を終えた画面は以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/8aa89c48-0dc5-3038-21b1-3921fe4dedb7.png)

今回は、以下のように画面を変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/c545ae51-c782-8639-0112-26da08701771.png)

変更するポイントは

- タイトルの設定
- テーマの設定
- ログイン画面で実行するスクリプト
- ロゴ下のメッセージの修正
- フッターの修正

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/73eb2ef5-b725-9c80-d1b8-9ce3ac2c234a.png)

# OpenAM UIの修正

### タイトルの設定

※ファイルパスはTomcatへデプロイ後のファイルパス

**titleタグの値を修正**

```XUI/index.html
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Cattle</title>
    </head>
```

### テーマの設定

テーマは `XUI/config/ThemeConfiguration.js` に設定でき、以下では

- スタイルシート
- アイコンイメージ
- ロゴイメージ

の設定をしています。

また設定したテーマをどの realm で適用させるかも指定します。

```XUI/config/ThemeConfiguration.js
        "cattle-theme": {
            stylesheets: ["themes/dark/css/bootstrap.min.css", "css/structure.css", "themes/dark/css/theme-dark.css"],
            icon: "images/cattle.png",
            settings: {
                loginLogo: {
                    src: "images/cattle.png",
                    title: "Cattle",
                    alt: "Cattle",
                    height: "256px",
                    width: "256px"
                }
            }
        },
...
    mappings: [
        { theme: "cattle-theme", realms: ["/"] }
    ]
```

※ロゴイメージは _XUI/images/cattle.png_ に配置しています。

### ログイン画面で実行するスクリプト

`XUI/templates/common/LoginHeaderTemplate.html` はログインヘッダーのテンプレートになります。

スクリプトタグを最終行に追加することで、追記したスクリプトが適用されます。

以下は、

- ドキュメントタイトルの設定（機能単位に設定したい場合）
- ロゴをクリックした際の画面遷移

を出来るようなスクリプトを記述しています。

```XUI/templates/common/LoginHeaderTemplate.html
<script language="javascript" type="text/javascript">
   document.title = "CATTLE";
   $(".main-logo").click(function() {
     location.href = "https://qiita.com/";
   });
</script>
```

### ロゴ下のメッセージの修正

```XUI/templates/openam/authn/DataStore1.html
    {{#if reqs.header}}
        <div class="page-header">
            <h1 class="text-center">Cattleへのサインイン</h1>
        </div>
    {{/if}}
```

### フッターの修正

```XUI/templates/common/FooterTemplate.html
<div class="container">
    <p>
        CATTLE
    </p>
</div>
```

# 最後に

今回は、必要最小限の要件（ログイン画面を既存サービスに合わせたい）にのみ対応したので、ちょっと無理やりコードに手を入れて修正しました。（マネできるようなコードではないです。。。）

このような要件は意外にあるのではないかな？と思ったので。
iterator pattern

# iterator pattern

## ケース

集約オブジェクトの内部構造を知ることなくアクセスできるようにしたいとき


## 結果
### pro

アクセス方法を局所化できる
複数のアクセス方法を容易に提供できる
同時に複数からアクセスできうる

### con
ない

## 実装対象

集約インターフェイス
集約クラス
Iteratorインターフェイス
Iterator class

## 種類
内部イテレーターと外部イテレーターがある。

クライアントがイテレーションを制御する -> 外部イテレーター

```
while let element = iterator.next {
    // do something
}
```

Iteratorがイテレーションを制御する -> 内部イテレーター

```
iterator.traverse()
```

## example

```
protocol AggregateProtocol {
    associatedtype Item
    func createIterator() -> IteratorProtocol
    func get(for index: Int) -> Item
    func count() -> Int
}

protocol IteratorProtocol {
    associatedtype Item
    var next: Item? { get }
}

class Apartment: AggregateProtocol {
    typealias Item = Room
    private let rooms: [Room]

    func createIterator() -> IteratorProtocol {
        return RoomIterator()
    }

    func get(for index: Int) {
        return rooms[index] // TODO: care out of range
    }

    func count() -> Int { return rooms.count }
}

class RoomIterator: IteratorProtocol {
    typealias Item = Room
    private let index: Int = 0
    private let apartment: Apartment

    var next: Room? {
        let room = apartment.get(for: index)
        index += 1
        return room
    }
}
```
【Python】Tkinterを使った雛形（MVCモデル）

# はじめに
最近はPythonのTkinterを使ってGUIアプリケーションを作ることが楽しい日々です。
そして、ただプログラムを組むのではなく、可動性を高めるために、MVCモデルでプログラムを構築しようとしています。ある程度、MVCモデルでの実装で最初の形が定まってきたので、ここに記そうと思います。


# 環境
- Windows 10 home
- Python 3.7.1



# MVCモデルによる雛形

```Tkinter.py
import tkinter as tk

class Model():
	def __init__(self):
		self.width=self.height=300

class View():
	def __init__(self,master,model):
		self.master = master
		self.model = model

class Controller():
	def __init__(self,master,model,view):
		self.master = master
		self.model = model
		self.view = view

class Application(tk.Frame):
	def __init__(self, master):
		super().__init__(master)
		self.pack()

		self.model = Model()

		master.geometry(str(self.model.width)+"x"+str(self.model.height))
		master.title("雛形")

		self.view = View(master,self.model)
		self.controller = Controller(master,self.model,self.view)

def main():
	win = tk.Tk()
	app = Application(master=win)
	app.mainloop()

if __name__ == "__main__":
	main()
```




# 実行
<img width="225" alt="実行.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/ed48d648-1d23-c225-4025-6bd4a54eba76.png">

このような画面が出れば、成功です。



# 実装例

上記の雛形を拡張した例を下記に記します。
スペースキーを押すと三角形の図形が右斜め下に動くものです。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/91cdeca2-1cf3-54d0-5d7b-d50e16579719.gif)


```mvcTest.py
import tkinter as tk

class Model():
	def __init__(self):
		self.width=self.height=300

	def moveModel(self,canvas,id):
		canvas.move(id,5,5)

class View():
	def __init__(self,master,model):
		self.master = master
		self.model = model

		self.canvas = tk.Canvas(self.master,width=self.model.width,height=self.model.height)
		self.canvas.pack()

		self.canvas.create_polygon(10,10,10,60,50,35,tag="id1")

class Controller():
	def __init__(self,master,model,view):
		self.master = master
		self.model = model
		self.view = view

		self.master.bind("<space>",self.moveController)

	def moveController(self,event):
		self.model.moveModel(self.view.canvas,"id1")

class Application(tk.Frame):
	def __init__(self,master):
		super().__init__(master)
		self.pack()

		self.model = Model()

		master.geometry(str(self.model.width)+"x"+str(self.model.height))
		master.title("mvcTest")

		self.view = View(master,self.model)
		self.controller = Controller(master,self.model,self.view)

def main():
	win = tk.Tk()
	app = Application(master=win)
	app.mainloop()

if __name__ == "__main__":
	main()
```

# 終わりに
まだ私も勉強中なので、この形が完璧なMVCモデルかどうかは保障できません。
参考程度に使ってください。
ここまでこの記事を読んでいただき、ありがとうございました。





応用例

- [【Python】Tkinterによる100行で作るGUIアプリ「ルーレット」](https://qiita.com/MichihiroTsukano/items/51a82e3fb34da15655a9)
- [【Python】ミニ研究テーマ「学習用テトリスの開発」](https://qiita.com/MichihiroTsukano/items/e17db5c744fa877542b6)
- [【Python】Tkinterによる120行で作るGUIアプリ「RSA暗号クイズ」](https://qiita.com/MichihiroTsukano/items/89891234eb34b1161ead)





その他書き方

- [PythonによるTkinterを使った雛形（クラス化手法）](https://qiita.com/MichihiroTsukano/items/4d8721aaa59e1c913d9a)
bashで局地/ローカル関数を作る


ここでの局地関数・ローカル関数とは「関数内部のみのスコープを持つ関数」のことを指します。
いい単語を知らなかったんです...

---

bashの関数内で、ローカルな関数を作成するには以下のようにします。

```bash
function outer() (
  function inner() {
  # 処理
  }
)
```

この例では、`outer`だけが関数として認識され、`inner`は存在しないようになります。
簡単な話、関数の内部にてそのまま関数を定義するだけです。
しかし中々びっくりだった...

因みにポイントは**外側の関数の処理を`{}`ではなく`()`で覆う**ことです。

関数定義の際、`()`を使うとその関数の内部は子プロセスで実行されることになります。
すると内部で定義した関数のスコープはその子プロセスまでに限定されます。
そのおかげで外側の関数を抜ける際、内部で作成された関数はプロセスごと消えるため、外に漏れない=局地関数ができる、という仕組みになります。
因みに`{}`としてしまうと、関数を一度実行すれば`inner`もグローバルに存在してしまうため注意が必要です。
Railsの「annotate」gemが最高すぎる件

<h1>環境</h1>

- Docker version 18.09.2
- Ruby 2.4.5
- Rails 5.0.0

<h1>なぜ書いたのか</h1>
「あれ、テーブルってどんな構造してたっけ❓」
っていう時がかなりあった。

今まで確認する時は、

1. DBに入る
2. コマンドぽちぽち入力
3. DB抜ける

上記３点のプロセスだったのが、

1. Modelのrbファイル確認

annotateをインストールするだけでここまで短縮できることに感動したから

<h1>導入、実装</h1>

<h3>1.Gemfileに追記</h3>

```ruby:Gemfile
group :development do 
  gem 'annotate' 
end
```

※基本的に開発環境でのみ使用するので、development内に書く

<h3>2.gemをインストール</h3>

```terminal:ターミナル
$ docker-compose build
```

<h3>3.gemの実行</h3>

```terminal:ターミナル
$ docker-compose exec web bundle exec annotate
```

これでModelを確認すると、下記のような感じでコメントアウトでテーブルの構造が！すごい！
<img width="700" alt="スクリーンショット 2019-05-12 20.54.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380742/48492355-a0f0-ab0c-45cc-97ca8764a246.png">

ただこれだとテーブルを作成、更新するたびに実行しなければならないので、
migrationをトリガーに実行するように設定ファイルを生成

```terminal:ターミナル
docker-compose exec web bundle exec rails g annotate:install
```

これでmigrationの度にannotateが実行されるように👌

<h1>おまけ</h1>

routeにも適用できるらしいのでやってみた

```terminal:ターミナル
$ docker-compose exec web bundle exec annotate　--routes
```

<img width="876" alt="スクリーンショット 2019-05-12 21.17.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380742/99365f56-c834-c4d8-7585-8f50f9b27a78.png">

<h1>参考</h1>
https://qiita.com/tsuchinoko_run/items/9bcc15e8992cb237e08a
https://www.udemy.com/share/1014LIB0sacllTQ3s=/
AWSのEC2にmacからSSHする方法

AWSのEC2へSSH接続したい時があったのでまとめます。

#1.キーペアの作成

AWSコンソールのEC２を選択し、キーペアをクリックします。
キーペア画面が開かれるのでキーペアの作成を押すと秘密鍵(pem)がダウンロードされます。

<img width="761" alt="キーペア___EC2_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234640/b06f66a9-4430-fc77-b5e4-d30ee9340974.png">

#2.秘密鍵ファイルの移動と権限設定
ダウンロードしたファイルを~/.ssh以下に移動し、権限変更します 
 
```
mv /Users/username/Downloads/web_app.pem  ~/.ssh
chmod 600 /Users/username/.ssh/○○.pem
```

#3.terminalからssh接続を行う
amazon linuxのEC2の初期ユーザ名は[ec2-user]です。


```
ssh -i /Users/username/.ssh/○○.pem ec2-user@ec2のグローバルIP

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
15 package(s) needed for security, out of 22 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-54 ~]$

```

以上です。
Xcodeで無料でデバッグしようとしたらエラーがでた

Xcodeで無料でデバッグする手順は検索すればいろいろ出てくるが、自分のエラーメッセージはそれらとは異なるものだった

```
An unexpected error occurred. Please try again.  If the problem persists, please contact Apple Developer Program Support. https://developer.apple.com/support (in target 'xxxxxx')
```

```
No profiles for 'xxxxxx' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'xxxxxx'. (in target 'xxxxxx')
```

上記2つ。

たぶん Apple Developer にアカウントを作ったばかりじゃないだろうか、自分の場合2時間くらいたったらエラーが消えて普通にデバッグできるようになった
SQLAlchemyのautoflushについて

# 概要
SQLAlchemyのautoflushについて理解できてなかったので調査しました。

調査した時の各バージョン

* SQLAlchemy : 1.3.3
* MySQL      : 8.0.16

# modelの作成
シンプルなuser_listテーブルを作成しこのテーブルをSQLAlchemyから操作することでautoflushの挙動を確認します。

```python:model.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

Base = declarative_base()

class User(Base):
    __tablename__ = 'user_list'
    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(100))
```

# autoflushの検証①(autoflush=True)
autoflushをTrueにして動作検証してみます。autoflushの影響があるのはSessionクラスの"add"、"delete"メソッドを使った時やモデルのプロパティに書き込みをした時(update)ですが、とりえあずaddメソッドで検証してみます。

```python:main.py
from sqlalchemy.orm import Session
from model import User

# ～ 中略 ～

session = Session(
    bind = ENGINE,
    autocommit = False,
    autoflush = True)

#1 user_listテーブルのレコード数確認
user_list = session.query(User)
print(user_list.count()) # ⇒ "0"出力

#2 1レコード追加
user = User(id = 1, name = 'hoge')
session.add(user)

#3 user_listテーブルのレコード数確認
print(user_list.count()) # ⇒ "1"出力
```

上記のコードを実行した場合、**autoflush=True**にしていると自動でinsert文が実行されるので#3の時点で"1"と出力されます。但し、実際にinsert文が実行されるタイミングは#3の"user_list.count()"が実行された時です。（この挙動はflushの処理をできるだけ遅延させる為、だろうか？）

# autoflushの検証②(autoflush=False、明示的にflush実行)
autoflushをFalseにして明示的にflushメソッドを呼ぶパターンで動作検証してみます。

```python:main.py
from sqlalchemy.orm import Session
from model import User

# ～ 中略 ～

session = Session(
    bind = ENGINE,
    autocommit = False,
    autoflush = False)

#1 user_listテーブルのレコード数確認
user_list = session.query(User)
print(user_list.count()) # ⇒ "0"出力

#2 1レコード追加
user = User(id = 1, name = 'hoge')
session.add(user)
session.flush() # 明示的にflushメソッドを実行(insert文が実行される)

#3 user_listテーブルのレコード数確認
print(user_list.count()) # ⇒ "1"出力
```

上記のコードを実行した場合、**autoflush=False**ではあるが明示的に"session.flush()"を実行しているので、この場合も#3の時点で"1"と出力されます。但し、実際にinsert文が実行されるタイミングは**autoflush=True**の時と異なり"session.flush()"の時点です。

# autoflushの検証③(autoflush=False、flush無し)
autoflushをFalseにしてflushメソッドを呼ばないパターンで動作検証してみます。

```python:main.py
from sqlalchemy.orm import Session
from model import User

# ～ 中略 ～

session = Session(
    bind = ENGINE,
    autocommit = False,
    autoflush = False)

#1 user_listテーブルのレコード数確認
user_list = session.query(User)
print(user_list.count()) # ⇒ "0"出力

#2 1レコード追加
user = User(id = 1, name = 'hoge')
session.add(user)

#3 user_listテーブルのレコード数確認
print(user_list.count()) # ⇒ "0"出力
```

上記のコードを実行した場合、**autoflush=False**で"session.flush()"も実行していないのでinsert文は実行されず、#3の時点ではレコードが追加されていないので"0"が出力されます。ではこの場合は"session.add()"がなかったことになるのかというとそういうわけでもなく、最終的に"**session.commit()**"してやればそのタイミングでinsert文は実行されます。

# autoflushはTrue、Falseのどちらが良いか？
基本的に**autoflush=True**にしておいたほうがうっかりミスも発生せずコードもシンプルになり良さそうです。Sessionクラスのデフォルト値も**autoflush=True**ですし。逆に**autoflush=False**にしたほうが良い場合が思いつかない。。（SQL実行のタイミングを明示的にしたい場合とか？）