OmniAICreator/Qiita-1.07M huggingface dataset:
Web Starter Kit をマスターするぞ！… その2


- Web Starter Kitの動作環境を[マスターするぞ！… その1](https://qiita.com/qoAop/items/1557c7606eccf0187a9a)でMacに環境を作ってみてはみたものの、そもそも開発環境がいろいろ入り混じってるのではよくないのではないのかと思い、docker環境で再構築しました。


- 環境はgithubに起きましたので起動方法の手順で利用できると思います。
- https://github.com/qoAopx/web-starter-kit.git

## web-starter-kit on Docker

- dockerで[Google : Web Starter Kit](https://developers.google.com/web/tools/starter-kit/?hl=ja)の環境を作りました。
- Dockerfileは[blackxoredさんのDockerHub](https://hub.docker.com/r/blackxored/google-web-starter-kit/)を参考にさせていただきました。
- いくつかバージョンを新しくしたのと```docker-compose up```で動くようにしています。

### 起動方法

```sh
sh-3.2$ git clone https://github.com/qoAopx/web-starter-kit.git
sh-3.2$ cd web-starter-kit
sh-3.2$ ./download_wsk.sh
sh-3.2$ docker-compose up -d
```

### 確認方法

- 3000と3001番ポートで動きます。中身はまだよくわかってません...
  1. [サンプルページ:3000](http://localhost:3000/)
  1. [Browsersync:3001](http://localhost:3001/)
Philips Hueを外部サーバーから操作

Hueのランプはブリッジという機械に対してローカルIPを割り振り、RestAPI経由でライトの操作ができます。
同一NW内の場合は、専用アプリでブリッジのIPを確認して簡単に指定できますが、外部からアクセスする場合はひと手間必要です。
※IFTTTを利用すれば簡単に実現できますが、細かいライトの操作が必要ならばAPI経由となります。

## 必要なもの
・グローバルIP
・[Philips Hue(ヒュー)シングルランプ] (https://www.amazon.co.jp/dp/B0771N53QK/)
・[Philips Hue(ヒュー) ブリッジ](https://www.amazon.co.jp/dp/B01C6S7DDA/)
・ランプのソケット（E26口金）
・有線ネットワーク

## 設定手順
1.ライトをソケットに差し込み電源をON、ブリッジに有線ケーブルを指す
2.専用アプリをダウンロードしライトと紐づけを行う
3.ポートフォワーディングで特定のポートのアクセスは特定のローカルIP端末に流す
4.専用アプリを利用してHueブリッジのDHCPをOFFにして上記ローカルIPを入力 
※[設定]→[Hueブリッジ]→[iアイコン]→[ネットワーク設定]→[DHCP]
5.[公式ドキュメント](https://www.developers.meethue.com/documentation/getting-started)のStep3から実施（ブリッジに対するユーザー登録など）
6.[このあたりのAPI](https://www.developers.meethue.com/documentation/lights-api#16_set_light_state)を利用してライトの操作（APIドキュメントは要ログイン）

## 補足
・購入直後はファームの更新を行う必要があり、更新中はネットワークがブツブツ切れる
・ランプのソケットは常時電源をONにしておく必要がある
Vue.js で package.json の version をページに埋め込む


# 埋め込む

こんな感じで取り出せるようです。

```javascript

  data () {
    return {
      version: require('../package.json').version
    }
  },
```

あとは build するたびに、package.jsonのversionを上げれば良さそうです。

とりあえずマイナバージョンだけ管理できればよさそう、且つ、どうせ捨てるコード、と思って、
雑に shell で書きましたが、もっといい方法あるのでしょうか
（`npm run build` が走るたびに勝手に上がる、のような）。

```shell
majorversion=$(cat package.json | grep -o "\"version\".*[0-9.]*" | grep -o "[0-9]*" | head -n 1 | tail -n 1)
minorversion=$(cat package.json | grep -o "\"version\".*[0-9.]*" | grep -o "[0-9]*" | head -n 2 | tail -n 1)
subminorversion=$(cat package.json | grep -o "\"version\".*[0-9.]*" | grep -o "[0-9]*" | head -n 3 | tail -n 1)
subminorversion=$(($subminorversion+1))
version="$majorversion.$minorversion.$subminorversion"
sed -i -e "s|\(\"version\": \"\)\([0-9.]*\)\(\".*\)|\1$version\3|g" package.json
```
BotKitでSlackのユーザーIDやチャンネルIDを取得する

[BotKit](https://github.com/howdyai/botkit)でのメッセージ送信には以下の2種類があります。

- ユーザーメッセージに反応
- タイマーや外部からのwebhookなどに対応

前者はユーザーメッセージに対して返信する形になりますが、
後者は返信ではないので、送信先のチャンネルを指定してあげなければなりません。
その際、チャンネル名ではなく、**チャンネルID**が必要になります。

https://botkit.ai/docs/core.html#botsay

```javascript
bot.say(
  {
    text: 'my message text',
    channel: 'C0H338YH4' // a valid slack channel, group, mpim, or im ID
  }
);
```

- チャンネル名 `#random` これでは送れない 🙅
- チャンネルID `C0H338YH4`これが必要 🙆

チャンネルIDは普通には取得できないので、BotKitに組み込まれたslackAPIの機能を使い、
チャンネル名からチャンネルIDを取得してみます。

```javascript:チャンネル一覧取得
getChannelFromName = (name) => {
    return new Promise((resolve, reject) => {
        _bot.api.channels.list({}, function (err, response) {
            for (let channel of response.channels) {
                if (channel.name === name) {
                    resolve(channel);
                    break;
                }
            }
        });
    });
};
```

使い方は以下の通りです。

```javascript
getChannelFromName('random').then((channel) => {
    _bot.say({
        text: 'こんにちは！',
        channel: channel.id,
    });
});
```

ユーザーIDも同じような方法で取得できます。

```javascript
getUserFromName = (name) => {
    return new Promise((resolve, reject) => {
        _bot.api.users.list({}, function (err, response) {
            for (let user of response.members) {
                if (user.name === name) {
                    resolve(user);
                    break;
                }
            }
        });
    });
};
```
社内勉強会を整備してみたレポート

# 社内勉強会を整備してみたレポート

## はじめに
「[前回の記事](https://qiita.com/ariaki/items/bb83c0635b1bbec66452)」から4ヶ月経過したので改めて進捗をレポートします。
これから社内学習会を立ち上げたいと思われている方のご参考になれば幸いです。

[2018/8/16追記]
学習時間に再変更がありましたので、記載内容を追記しました。

## 当初から何を変えたか

### 発表時間の変更

##### 当初

| 登壇枠   | 学習時間 |
|:--------|:---------|
| 5分     | 4時間     |
| 30分    | 16時間    |

##### 1回目の変更 (2018/6～)

| 登壇枠   | 学習時間 |
|:--------|:---------|
| 10分    | 8時間     |
| 20分    | 12時間    |
| 30分    | 16時間    |

- 発表時間内に予備時間を考慮していなかった
    - 準備・質疑応答・撤収までを含むようにガイドライン化した
- 発表枠として5分（予備時間含む）は短すぎた

##### 2回目の変更 (2018/8～)

| 登壇枠   | 学習時間 |
|:--------|:---------|
| 10分    | 無制限    |
| 20分    | 無制限    |
| 30分    | 無制限    |

※登壇時間枠はそのままで、以下のように運用を変更しました。

- 学習時間については **業務に支障がない範囲で無制限** に変更します
   - LTの準備をするのに8時間を超えても問題ありません（※早めにチームに共有して積極的に時間をとってください）
- 学習に必要なコストは申請によって **経費精算** できるものとします
   - たとえば、クラウド費用・外部サービス利用費・書籍代など、なんでも相談してください

### マニュアル化
やっぱりエンジニアにとって重要なのは**標準化する**事ですよね。
勉強会の主旨をひとめでわかるように、以下のようなマニュアルを作成しました。
まだまだ発展途上なので、これから気づいた事があれば追記していきたいと思います。

- 登壇者向けに「[登壇マニュアル](https://github.com/ariakira/techdo/wiki/Tech-Do-登壇マニュアル)」を作成
    - どのような手順で登壇するのか？
    - 登壇の際に注意するポイントは？
    - 資料の作り方は？
- 全参加者向けに「[参加ルール](https://github.com/ariakira/techdo/wiki/Tech-Do-参加ルール)」を作成
    - どんな意味をもって開催しているか
    - 参加ルール（禁止事項）は？

※正式版は社内用Qiita Teamで管理しているので上記は複製です。

### 時間案内方法の変更
これまでの参加者アンケートで最も指摘が多いのは**登壇時間**に関する内容でした。

- 予定時間を超過しないようにして欲しい
- 質疑応答時間が欲しい（時間超過で割愛されないように）
- 全体の終了時間が遅くならないようにして欲しい

事前リハーサルをしたり、経過時間を表示する等していましたが、解消できませんでした。
ここで気づいたのが、参加者に対して「**時間内に収める努力アピールが足りない**」です。
外部の某勉強会に参加した際、**時間のお知らせにゴングを鳴らしていた**のでわかりやすく、周囲にも時間管理きっちりしてるアピールができるなと感じ、2018/7より
パクりました
取り入れました。
※登壇者は緊張していて**目からの情報を追いにくい**為、耳から情報が入る方が気づきやすいそうです。

ゴング15㎝ /ノーブランド品 / 980円
https://www.amazon.co.jp/dp/B00BRAKGRO/

### 登壇させる
アウトプットに興味がある人はたくさん居ても、積極的にアウトプットしたい人は少数です。
まず最初に考えたのは、**興味がある人に対してどう背中を押してあげられるか**でした。
興味がありそうな人には登壇スケジュールを
勝手に
おさえて**「やってください」**という感じで
無茶ぶり
お願いする方式をとった事で、今後数ヶ月は安定した登壇者が確保できています。
※被害者の皆さん、ごめんなさい。

本当に嫌がる人は、大抵直前に「業務が忙しいから登壇できません」と言ってきます。
でもそれでいいんです、やりたい人がアウトプットすればいい。
「積極的に技術を学べる機会がある」という文化が根付けばいつか理解してもらえますし、一度断られても次回は登壇してくれる可能性が高い。
一番大切なのは勉強会を**始める＆続ける事**であり、その為には理解者を増やす事が重要です。
趣旨を理解してファンになってもらい、ファンを増やすためには声を出し続けるしかない。
そう思って声をかけ続けています。

## 今後の課題

### 登壇者の成長を可視化したい
現在はアンケートで5段階評価をとっていますが、それでは足りなく感じています。
登壇によってどれだけ成長できたのか測りたいですよね。
まだ初めたばかりなのでまず「初回登壇やりきった」を感じてもらうのが第一目標でした。
次ステップをそろそろ考えないとなので、**良いアイデアがあれば教えてください。**

### 参加者の成長を促したい
登壇者は学習を通じて必然的に成長しますが、参加者（聴衆）も成長してもらいたい。
発表を通じて伝聞したランダムに新しい知識を得て帰るだけでは一瞬で忘れてしまうので、参加者に対する成長についても**今後の課題**とすべきだと感じています。
参加者全員を巻きこんだイベントを作っていきたく、絶賛考え中です。

- 全員参加型にする
    - LT大会：多くの人に登壇してもらう（そのうち全員回したい）
    - ハンズオン：全員で学習する
    - ハッカソン：全員で手を動かす
- 継続学習型にする
    - 勉強会外でのコミュニケーション手段を確立する
    - 部活動みたいに定期的に集まる

**良いアイデアがあれば教えてください。**（2回目）
続・Riot.jsの落とし穴まとめ

[Riot.jsの落とし穴まとめ](https://qiita.com/clown0082/items/073c4c2e39ec5ca12962)

こちらの記事の続編というか、`v2.x` しか書いていなかったので、今回は `v3.x` のための記事です。

`v4` の開発が水面下で粛々と進んでおり、今更感もありますが、`v4`リリースされたからと言ってすぐに本番で導入するとは思えないですし、また `v3.x` の需要もあると思いますので、書いていきます。（以下、本記事ではRiot.jsを `riot` と呼びます）

## 1. イベントが発火すると、イベント発火した現在のタグのみ更新される

ユーザの操作に伴いデータの変更が行われたとき、画面上にもその変更を反映しないといけませんが、riotだと、以下のように `update()` メソッドを明示的に発火させる必要があります。以下の例を見てください。（[デモ](https://k-kuwahara.github.io/demo/riot/pitfalls/v3/non-update/)）

```html:app.tag

<app>

  <!-- ここのテキストは変わらない -->
  <p show="{ show_flg }" class="text">hogehoge</p>
  <p hide="{ show_flg }" class="text">fugafuga</p>

  <child on-toggle="{ toggle }" />

  <script>
    this.show_flg = false

    toggle() {
       this.show_flg = !this.show_flg
    }
  </script>
</app>
```
```html:child.tag
<child>
  <button onclick="{ opts.onToggle }">toggle</button>

  <script>
    this.on('update', () => {
       console.log('updated in child tag.')
    })
  </script>
</child>
```

この例では、`toggle` メソッドは `app` タグに定義されていますが、`button` タグとクリックイベントは `<child>` という子タグに定義されているため、このボタンをクリックしても `child` タグの中でのみ更新処理が走ります。したがって、テキストはずっと `fugafuga` のままです。

`app` タグを更新するためには、以下のように明示的に `update()` を実行する必要があります。

```diff:app.tag(更新)

toggle() {
   this.show_flg = !this.show_flg
+  this.update()
}
```


## 2. 属性名が自動で小文字に変換される

属性の名前にキャメルケースを使っている場合、その名前は全て小文字に変換されます。
以下のコード例を見てください。

```html:app.tag

<app>
  <child showDetail={ hoge } />

  const self = this
  self.hoge = 'fuga'

</app>

<child>
  <h2>{ opts.showDetail }</h2>

  console.info(opts)  //=> Object {showdetail: "fuga"}

</child>
```

上記のように、`opts` の中身を見ると、`showdetail` とDの文字が小文字に変換されてしまいます。

これは__ブラウザの仕様__で自動で変換されるものですので、これを回避する方法は__キャメルケースを使わない__ことです。（3.に続く）

※ こちらは[公式ドキュメント](https://riot.js.org/ja/guide/) にも記載されています。

## 3. 属性名が自動でローワーキャメルケースに変換される

`2.` のケースと同じようなものですが、今回はハイフン(`-`)を使っていると、自動でローワーキャメルケースに変換されるパターンです。

```html:app.tag

<app>
  <child show-detail={ hoge } />

  const self = this
  self.hoge = 'fuga'

</app>

<child>
  <h2>{ opts.show-detail }</h2>

  console.info(opts)  //=> Object {showDetail: "fuga"}

</child>
```

見ていただいた通りです。この回避策としては、__属性名をスネークケースにする__のが手っ取り早いです。アンダーバーの場合は何も変換されません。または、割り切ってローワーキャメルケースで扱うのもありですね。


## 4. `select, table, svg`などのタグの子要素としてriotタグを設置することはできない

こちらも[公式ドキュメント](https://riot.js.org/ja/guide/#riot%E3%81%AEdom%E3%81%AE%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%84%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85)に記載がありますが、例えば、__`select`タグの子要素には`option`タグしか設置できない__仕様になっていますので、以下のような書き方ですと、マウントされません。

```html:tag（誤り）
<select>
  <my-options />
</select>
```

正しくは、以下のように書きます。

```html:tag（正しい）
<select data-is='my-options'></select>
```

# 終わりに

公式ドキュメントも少しづつ更新が入っておりますので、久しぶりに見ると答えが書いてあるかもしれません。また`Riot.js`は、初めてJavaScriptのライブラリやフレームワークに触れるという人にはわかりやすいものですので、一度触って見るか、くらいの時の選択肢として十分ありだと思います。その後、`Vue.js`や`React`に行くのも学習の流れとしてはいいのではないかなーと思います。

また何か見つかれば随時更新します！
では :hand_splayed:
主加法標準形と主乗法標準形について

#最初に
間違いがありましたら編集リクエストもしくは下記のツイッターまで連絡お願いします。
また、「￢」の記号が出た場合はnotと読んでください。
「￢A」は「notA」すなわちAの否定を指しています。
また、「~」や「not」と書いたりしますが、ここでは「￢」で統一します。 

#ブール代数の基本法則
ブール代数の説明は省きますが簡単に言うと集合論における和集合(∪)や積集合(∩)などを+,*と置き換えた式群のことを言います。
例えばA∪BはA+Bと同じことを意味します。
気になる人は調べてみてください。

ここでは、簡略化するときに使うブール代数を基本法則を書きます。
(ここでの名前はあくまで一例です。資料によっては呼び方が変わる可能性があります。)

|則||
|:-:|:-:|
|べき等則|A + A = A|
||A * A = A|
|交換則|A + B = B + A|
||A * B = B * A|
|分配則|A * (B + C)= A * B + A * C|
||A + (B * C) = A + B * A + C|
|結合則|(A + B) + C= A + (B + C)|
||(A * B) * C = A * (B * C)|
|吸収則|A + (A * B = A|
||A * (A + B) = A| 
|復元則|￢￢A = A|
帰無則|A + 1 = 1|
||A * 0 = 0|
|恒等則|A + 0 = A|
||A * 1 = A|
|相補則|A + ￢A = 1|
||A * ￢A = 0|

こんな感じです。
特にべき等則、その他3あたりは覚えておいて損はないです。


#ド・モルガンの法則
ド・モルガンの法則は
**①AND演算からOR演算へ変換
<font color ="Red"> ￢(A+B) =￢A*￢B </font>
②OR演算からAND演算へ変換
<font color = "Red">  ￢(A*B) = ￢A+￢B**</font>
です。


#最小項と最大項
主加法標準形と主乗法標準形を学ぶ前に最小項と最大項を知っておきましょう。

最小項はどれか１つだけ１となる関数で、任意の入力を１回ずつ含む論理積のことを言います。
例　A*B*C, A*(￢B)*(￢C)　

最大項はどれか１つだけ0になる関数で、任意の入力を1回ずつ含む論理和のことを言います。
例　A+B+C, A+(￢B)+(￢C)

また注意が必要なのですが、0と1の関係が最小項と最大項で逆になっています。以下に例を示します。
例

|A|B|X|最小項|最大項|
|:----:|:--:|:--:|:--:|:--:|
|0|0|0|￢A*(￢B)|A+B|
|0|1|1|￢A*B|A+(￢B)
|1|0|1|A*(￢B)|￢A+B|
|1|1|0|A*B|￢A+(￢B)|






#主加法標準形について
主加法標準形(加法標準形とも言います。今回は主加法標準形で統一します)は真理値から読み取れる出力が「1」の最小項の論理和のこと。

また、主加法標準形を簡略化した論理式を加法形と言います。

例　X = AB + ￢AB
##主加法標準形を用いた論理式の求め方
例えば以下の真理値表があると考えます。

**真理値表**

|A|B|X|
|:-:|:-:|:-:|
|0|0|1|
|0|1|0|
|1|0|1|
|1|1|1|

今回はXが「1」のところの最小項を抜き出すと

X = ￢A￢B + A￢B + AB 

となります。

よって主加法標準形で算出した真理値表になる論理式はX=￢A￢B+A￢B+ABで実現可能となります。


以上が主加法標準形を用いた論理式の求め方となります。


#主乗法標準形について
主乗法標準形(乗法標準形とも言います。ここでは主乗法標準形で統一します)は真理値から読み取れる出力が「0」の最大項の論理積のこと。

また、主乗法標準形を簡略化した論理式を乗法形と言います。
例　X=(A+B) * (￢A+B)

##主乗法標準形を用いた論理式の求め方

以下の真理値表があったとします

**真理値表**

|A|B|X|
|:-:|:-:|:-:|
|0|0|1|
|0|1|0|
|1|0|1|
|1|1|1|


今回はXが「0」のところの最大項を抜き出すと

X = A+￢B

よって真理値表になる論理式はX=￢A+Bで実現可能となります。





以上が主乗法標準形を用いた論理式の求め方となります。


#主加法標準形と主乗法標準形で求める論理式は同じである
先程求めた論理式は

|| 論理式 | 
|:-----------------:|:------------------:|
| 主加法標準形           |      X=￢A￢B + A￢B + AB |
|主乗法標準形|X=A+￢B|

となっています。

(証明)
主加法標準形で求めた論理式
=￢A￢B + A￢B + AB
=A(B+￢B) + ￢B(A+￢A)
=A+￢B =主乗法標準形で求めた論理式

よって主加法標準形を用いた論理式と主乗法標準形で用いた論理式は同じである。
(証明終)

カルノー図を使っても証明できます。

(証明)
Xをレ点とし、カルノー図に主加法標準形で求めた論理式の最小項
と該当する箇所にXを当てはめていく。

|a\b|0|1|
|:-:|:-:|:-:|
|0|X||
|1|X|X|

まとめるとA, ￢Bがでてくる
以上より
X = A+￢Bが求まる。
(証明終)


##最後に
今回の真理値表はAとBの2入力でしたが、これは3,4入力でもやり方は変わりません。
僕の学校ではちゃんとした説明を受けなかったのでまだ僕自信も完全に理解していませんができるだけ初めてみてもわかりやすいようにまとめてみました。
お役に立てたら光栄です。


なにか質問がありましたら、コメントもしくは[Twitter(@PotyaExe)](https://twitter.com/PotyaExe?lang=en)に、修正がありましたら、編集リクエストで修正お願いします。

それでは失礼します。

###2018/12/27追記
主加法標準形と主乗法標準形の説明に間違いがありましたので修正いたしました。お詫び申し上げます。
もし、まだ間違いがありましたら編集リクエストもしくは下記のツイッターまでご連絡ください。
Dynamics365 CRM リンク集


Dynamicsについて書いているサイトって少ないですよね・・・。
とりあえず、自分が勉強するにあたって参考にしたサイトをピックアップしてみました

##参考にしたサイト
◆DynamicsのWiki的な存在
https://techinfoofmicrosofttech.osscons.jp/index.php?CRM%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA

◆Morning Girl
Microsoft MVPの方が書くブログ
http://kageura.hatenadiary.jp/archive/category/Dynamics%20365

◆実践DYNAMICS CRM
ここ一年ほど更新されておらず残念ですが
Dynamicsの設定や、カスタマイズ、POWERAPPSなど様々な記事があります。
https://masa717suzuki.wordpress.com/

◆Japan Microsoft Dynamics 365 Team Blog
公式のブログです
https://blogs.msdn.microsoft.com/crmjapan/?orderby=date

◆Microsoft　TechNet
Dynamicsの知恵袋みたいなもの
https://social.technet.microsoft.com/Forums/ja-JP/home?category=dynamics

◆知識創造研究室 by CRM
POWER APPSとか、PowerBI、関連付けや伝播など様々などが掲載
http://artisan.jp.net/crmblogs/category/crm_xrm/








##参考になるページ　設定編
◆セキュリティロール
https://msdn.microsoft.com/ja-jp/library/gg334717.aspx

◆関連性検索
関連性検索の便利な使い方を紹介
https://blogs.msdn.microsoft.com/crmjapan/2017/05/08/microsoft-dynamics-365-new-function-relevance-search/

関連性検索の対象となるフィールドの設定方法などを紹介
https://blogs.msdn.microsoft.com/crmjapan/2017/05/09/microsoft-dynamics-365-new-function-relevance-search-2/

◆伝播設定
取引先企業の所有者を変更したら、取引先担当者や案件の所有者も変更されてしまう。といったような設定の変更が可能
http://artisan.jp.net/crmblogs/2017/07/03/2115/
http://artisan.jp.net/crmblogs/2017/08/31/2513/

◆Outlookのアドインとアプリの違い
https://blogs.msdn.microsoft.com/crmjapan/2016/02/28/dynamics-crm-2016-online-outlook-dynamics-crm-1/







##参考になるページ　カスタマイズ編
◆wordテンプレートの作り方
https://blogs.msdn.microsoft.com/crmjapan/2016/02/04/dynamics-crm-2016-word/

◆グラフのカスタマイズ
・実践DYNAMICS CRM
https://masa717suzuki.wordpress.com/2016/06/09/%E5%AE%9F%E8%B7%B5-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-%EF%BC%889%EF%BC%89-%E3%82%B0%E3%83%A9%E3%83%95%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA/

・軸タイトル、凡例、および軸ラベルの削除
https://crmchartguy.com/2013/03/03/removing-axis-titles-legend-and-axis-labels-in-crm-charts-for-ms-crm-2011/

・グラフのカスタマイズで色を変える方法
デフォルトのグラフの色が味気ないなぁと思った方にはおススメ
https://blogs.msdn.microsoft.com/crmjapan/2011/04/19/dynamics-crm-2011-39/

◆業務プロセスフロー
https://blogs.msdn.microsoft.com/crmjapan/2017/02/28/dynamics-365-dec-update-new-feature-process2/

◆サイトマップ（メニューの設定）
・Microsoft Dynamics 365 新機能: 新しいアプリケーション: サイトマップデザイナー
https://blogs.msdn.microsoft.com/crmjapan/2017/02/17/dynamics-365-dec-update-new-feature-business-application-3/

・【Dynamics 365】【8.2新機能】【Preview】アプリデザイナーとカスタムアプリの作成 その2 とりあえず作ってみる
http://kageura.hatenadiary.jp/entry/2016/12/15/%E3%80%90Dynamics_365%E3%80%91%E3%80%908.2%E6%96%B0%E6%A9%9F%E8%83%BD%E3%80%91%E3%80%90Preview%E3%80%91%E3%82%A2%E3%83%97%E3%83%AA%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%A8%E3%82%AB%E3%82%B9

◆レコメンデーション
http://artisan.jp.net/crmblogs/2017/02/21/1466/


##バージョン管理
◆リリースノート
https://support.microsoft.com/ja-jp/help/2925359/microsoft-dynamics-crm-online-releases

◆バージョン９について
・新機能
https://docs.microsoft.com/ja-jp/dynamics365/get-started/whats-new/customer-engagement/new-in-version-9
・既知の問題
https://docs.microsoft.com/ja-jp/dynamics365/customer-engagement/admin/readme-9
MySQlで改行を文字を置換する方法

## こうします
```
mysql> UPDATE テーブル名 SET カラム名=REPLACE(カラム名, "\n", "");
```

なお、`\r\n`(CR+LF)や`\r`(CR)が入っている場合もあります。私も詳しくないですが、OSによる違いで改行にも違いが出ているだけのようです。

### 参照
https://ja.stackoverflow.com/questions/12897/%E6%94%B9%E8%A1%8C%E3%81%AE-n%E3%81%A8-r-n%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B
Hedera Hashgraphの「仮想投票」について考察してみる

*※2018年6月21日公開*
*※2018年6月27日編集*

**「ハッシュグラフって何？」という方は、[こちらの記事](https://qiita.com/rinrin0108/items/c0b37c1bfe8fe732672e)をご参照ください。**

N−Village CTOの林田です。
　[前回の記事](https://qiita.com/rinrin0108/items/c0b37c1bfe8fe732672e)では、Hedera Hashgraphの概要とコンセンサスアルゴリズムについてご説明しました。今回は、Hedera Hashgraphが採用したユニークな機能、「仮想投票」という考え方について触れてみたいと思います。

# 仮想投票による合意プロセス
　[前回の記事](https://qiita.com/rinrin0108/items/c0b37c1bfe8fe732672e)で簡単に解説しましたが、ゴシッププロトコルによってHashgraphが構築されると、各イベントに含まれる2つのHashによって、イベントのトレーサビリティが確保できます。すなわち、あるメンバーがイベントを受け取ると、そのイベントに含まれる情報について、他のどのメンバーが知っているのか、を知ることができるのです。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/16023/2be56c6f-ccc3-5887-6148-a8b10af4646d.png)


　自分以外の各メンバーが知っている情報がわかれば、各メンバーがどのように投票を行ったか＝何を正しいと判断したか、を知ることができます。つまり、**他のメンバーからの投票が無くても、仮想的に投票を実行できる**のです。これが仮想投票の考え方です。
　この仮想投票によって、Hashgraphは既存のブロックチェーンと異なり、各メンバーが投票メッセージをブロードキャストすることなく、あたかも合意を得ることができるのです（ただし、全体の1/3を超えるメンバーが悪意を持っていないことが前提）。

# Hashgraphでネットワーク障害が発生した時の動きはどうなるか
　より具体的に、ビザンチン問題が発生しそうな状況を想定してみましょう。

**元々1つのコミュニティだった善意のA〜C、D〜Fがそれぞれネットワーク障害により分断されている状態で、AおよびDがトランザクションを発生させた場合**

　通常のゴシッププロトコルに従い、それぞれ閉じたネットワーク内でイベントがやり取りされます。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/16023/a973f805-848d-6712-3a13-6622d2d9d56e.png)

　ネットワーク障害が解消した時点から、まだイベントを持っていないメンバーに対して次々とイベントが送られます。結果的に、コミュニティ全員がAおよびDのトランザクションを知ることとなりました。

![13.png](https://qiita-image-store.s3.amazonaws.com/0/16023/5434e701-0f2c-8349-a3ec-df04cba8f9f8.png)

　では次に、一部に悪意のあるメンバーがいる場合を想定してみましょう。

**元々1つのコミュニティだった善意のA〜D、悪意のE・Fがそれぞれネットワーク障害により分断されている状態で、Eがトランザクションを作成した場合**

　E・Fが所属するネットワークだけを見ると、悪意を持ったメンバーが1/3を超えています。したがって、ネットワーク障害が発生している間、E・Fのネットワークには嘘の情報が蔓延することとなります。

![14.png](https://qiita-image-store.s3.amazonaws.com/0/16023/78ce7b9d-f3c4-6fcd-d3df-25bc498a4acd.png)

　ところが、ネットワーク障害が解消された時点で、悪意を持ったメンバーが全体の1/3を超えない状態となります。すなわち、Eが作成したトランザクションは善意のメンバーによって無視されるため、結果として正しいトランザクションのみが残ります。

![15.png](https://qiita-image-store.s3.amazonaws.com/0/16023/8cea6609-55d7-9926-f7f8-ca2460df0be2.png)

# 仮想投票について調べてみた所感
　ゴシッププロトコルと併せて、その手があったか、という印象です。効率性の面では、ブロックチェーンにおけるPoW等と比較して抜群に良いと感じました。次回以降、もう少し詳細に、イベントの生成や署名プロセス、ゴシップがチェーンする「ゴシップのゴシップ」がどのようなデータセットとなっているか、など調査したいと思います。

---
内容に間違いがあればご指摘いただけますと幸いです。よろしくお願いいたします。
Google Maps Platform移行後にウェブページに無課金でGoogleマップを埋め込む方法

来る2018年7月16日から提供開始予定の**Google Maps Platform**。
技術的な仕様だけでなく、課金（請求）関係のルールにも大きな変更があります。
そんな中、GoogleのサポートやGoogle認定のGoogle Maps API開発パートナー業者の方から情報をいただいて、**APIキーを使わない、あるいはAPIキーは必要だけど無課金なGoogleマップの埋め込み方**についてまとめました。

APIキーなしで使えるのはGoogleマップ上から取得するコードのみ【APIキー不要・無課金】
===============

APIキーの指定が不要なのは、**Googleマップ上で「共有」→「地図を埋め込む」から取得できるiframeコードを使った埋め込みのみ**。

```html
<iframe 
    width="600" 
    height="450" 
    frameborder="0" 
    style="border:0" 
    src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3241.132643677959!2d139.71435581557225!3d35.6737357801961!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188c9a1923f3f5%3A0xf8fe5cab0f97a8d8!2z5piO5rK756We5a6u6YeO55CD5aC0!5e0!3m2!1sja!2sjp!4v1529571916505" 
    allowfullscreen>
</iframe>
```

※上記iframeのsrc属性、一部パラメータについては手動で調整も可能ではある模様。
http://blog.8bit.co.jp/?p=14191
（「URLが見慣れない形に」のセクション参照。「Google MAPを住所や建物名で表示」セクションの記述は後述の通り以後使わない方が良いので注意）

パラメータ指定してピンひとつだけ出す（またはピン出さない）ならEmbedAPI【要APIキー/無課金】
===============
**Google Maps Embed API**
https://developers.google.com/maps/documentation/embed/guide?hl=ja

```html
<iframe
  width="600"
  height="450"
  frameborder="0" style="border:0"
  src="https://www.google.com/maps/embed/v1/place?key=YOUR_API_KEY
    &q=Space+Needle,Seattle+WA" allowfullscreen>
</iframe>
```

- **Placeモード**または**Viewモード**で使う分には**今後も課金は不要。**
  * https://developers.google.com/maps/billing/understanding-cost-of-use#embed
- **APIキー取得**＆**請求情報登録**は**「必須」**。
- ピン複数立てるなどの場合は「Embed Advanced」という扱いとなり、課金対象になる。

APIキーなしでパラメータ指定する記法は今後は使わない
===============
APIキーを指定せずにパラメータを指定して記述する手法は使うべきでない。いつまでこの記法で表示されるかわからない。

```html
<iframe
    src="https://maps.google.co.jp/maps?output=embed&q=原宿駅">
</iframe>
```

Googleが公式に提供している記法ではない（「過去に提供していたもの」「そもそも公式に提供してなくて、ユーザーが見つけた記法」などの情報あり）。
https://productforums.google.com/forum/#!topic/maps-ja/f3plFe69Ods;context-place=forum/maps-ja

以上
TriplanarっぽいMaterialを作成する

~~**この記事はUE4.19時点のものです**~~
**UE4.24で再検証しています(2020-01-28)**

AnswerHubで求められたので作りました

基本UVでテクスチャ貼るはずのゲームエンジンでなぜこれが必要なのか？
…多分建築系ですかね（経験あり


# Triplanar??

3軸からテクスチャを投影する手法
https://www.youtube.com/watch?time_continue=10&v=eHaJHMyG-6U

# 今回の要件
- ActorのTransformに影響されない
    - つまりWorld座標を基準に貼るのはNG
    - 移動しようが回転しようがテクスチャがずれないこと
- テクスチャの境界はブレンドをかける


## 完成品

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/e1f5bc0b-3cf0-1d0e-d56d-5fa5c3db94be.png)


### 全体
![Triplanar_A.PNG](https://qiita-image-store.s3.amazonaws.com/0/117589/9bbcb599-800f-0d53-5d8c-d0adfce44d1a.png)

### スケール部分
![Triplanar_B.PNG](https://qiita-image-store.s3.amazonaws.com/0/117589/84614612-3661-3b63-5a19-b0e5b2d80afd.png)

### Triplanar実現部分
![Triplanar_C.PNG](https://qiita-image-store.s3.amazonaws.com/0/117589/72f76ed0-9b0a-1e45-9e12-8cc0a239df01.png)

### 合成
![Triplanar_D.PNG](https://qiita-image-store.s3.amazonaws.com/0/117589/3bf641cc-6a91-3649-9e61-485a39e1a9ba.png)

## サンプル

(UE4.19以降)
~~[ダウンロード](https://s3-ap-northeast-1.amazonaws.com/hakobuneworks-ue4-resources/ue419/TriplanarMaterial.zip)~~

追記参照のこと

# BugFix (2020-01-28)
オブジェクトのScaleを不均一に変更するとTextureが歪む事象に対応
変更点は下の画像の通り

![2020-01-28_00h50_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117589/a166c433-1cd6-f55d-630b-375fb66ecdd5.png)

サンプルを修正しました
(UE4.24以降）

[ダウンロード](https://hakobuneworks-ue4-resources.s3-ap-northeast-1.amazonaws.com/ue424/TriplanarMaterial_Fix1.zip)
【Ruby】ModelからViewの作成までを、ハンバーガーの注文から提供するまでで例えてみる。

![ハンバーガー.png](https://qiita-image-store.s3.amazonaws.com/0/250884/7a22e45a-2c28-a56f-b95d-3cf13dd9bfca.png)


どうも、Ruby on railsを学び始めて2ヶ月目のぼん(＠wallkicker)です。

今回はRailsにおける**ModelからViewの作成まで**の大まかな流れを
**ハンバーガーの注文から提供するまで**で例えてみたいと思います。

#概要
![全体図2.png](https://qiita-image-store.s3.amazonaws.com/0/250884/dde01ade-8f6c-e58e-817f-dd2b17199822.png)

お客さんからハンバーガーを注文されたときの動きを考えます。
**1．注文されたハンバーガーを調理場へ伝える**
**2．調理場がハンバーガーを作る**
**3．必要な材料を倉庫から持ってきて用意する**
**4．完成したハンバーガーを提供する**

これを実際のアプリケーションの動作で考えてみると、
**1．RouterはブラウザからのHTTPリクエストに対応したControllerを選択する**
**2．選択されたControllerは、記述されたアクションを実行する**
**3．ModelはControllerに記述されていたデータを用意する**
**4．Viewがブラウザにて表示を行う**

それぞれの役割について見ていきましょう。

#1.Router 
![router1 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/250884/e89767e9-7269-f090-bbd5-634a21bc7634.png)

HTTPリクエストに対する機能一覧を記述します。
いわば、お店で提供するハンバーガーのメニューです。
**メニューを見れば、そのお店の提供するハンバーガーが分かります。**

#2.Controller
![controller1.png](https://qiita-image-store.s3.amazonaws.com/0/250884/c4d4f77f-5fee-3aff-3411-da90f821e9b2.png)

アプリケーションにおける機能の詳細説明を記述します。
それぞれのハンバーガーの作り方を知っています。
**どのような調理を行うのか、どの材料が必要なのかを指示します。**


#3.Model
![model1.png](https://qiita-image-store.s3.amazonaws.com/0/250884/ae861c5c-8245-0393-2b2f-4799f5e82e4a.png)


アプリケーションにおけるデータの操作対象になります。
倉庫から指示された材料を取ってくる役です。

#4.View
![view1.png](https://qiita-image-store.s3.amazonaws.com/0/250884/2aba91c3-a17c-adfa-e56b-d324f0caad51.png)

アプリケーションにおいて、ブラウザに表示される内容を記述します。
最終的に、お客さんにハンバーガ－を提供するカウンターですね。

#おわりに
さて、それぞれの役割がなんとなく理解できたでしょうか。
次回は「掲示板のアプリケーション」を作る過程を辿りながら説明しますよ！
今回のハンバーガ－提供までの流れをなんとなく覚えておいてくださいね。

それでは！
【メモ】aws-cliでS3オブジェクトを標準入出力に書き出す/から読み込む

aws-cliには標準入出力を使うコマンドがないのを不思議に思っていました。cpコマンドで、ファイル名としてハイフンを指定することで、標準入出力にリダイレクトしてくれます。

```
aws s3 cp s3://bucket/file.txt -
```

なんで[ドキュメント](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html)にないんだよと、と文句を言おうとしたら一番下に書いてあった……ごめんなさい。

なおPowerShellとは相性が悪く、エンコーディングや改行コードが勝手に変わることがあるとのこと。
openframeworksでofFboのreadToPixelsが重い件について

#readToPixelsをしたらフレームレートが半減した
```
ofFbo fbo;
ofPixels pix;
fbo.readToPixels( pix ); // とても重い
```
##なんか無いか探してみるー＞あった
[ofxFastFboReader](https://github.com/satoruhiga/ofxFastFboReader)
とりあえず使ってみた。
結果:fullHD 24fps>>60fps
すばらしい成果だ
使い方も簡単すぎて書く気もおきない。
Unity Android 設定・ツールなどメモ

###Android Device Monitor の場所
　AppData\Local\Android\Sdk\tools\lib\monitor-x86_64\monitor.exe


###ビルドできなくなった時の対処１
　https://qiita.com/niusounds/items/bcbeee622b2114b4016e

###ビルドできなくなった時の対処２

 何故か環境変数を二つに分ける必要がある。

　環境変数に　
　JAVA_HOME=C:/Program Files/Java/jdk1.8.0_171

　PATHに　JAVA_HOME\bin\;　を追加
[RPA] UIpathで自動化させてみた

色々大人の都合で修正しました。

#やろうと思ったきっかけとか
Unityでモデルをいじって ~~遊ぶ~~ 学ぼうと思っていたら
RPAの時代が来る！学んだほうがいいと言われたので
軽く触ってみました。

UIpathは登録に会社のドメインのアドレスが必要なので
ない人はインストーラーを気合で取ってきて下さい。

#インストールとプロジェクト作成
インストールして起動したらこのような画面が出るので
Blankから新規プロジェクトを作成してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/261256/885fb153-3674-65a3-6f37-fd5410a9775c.png)

完成品が移っていますが
新規で作るとなにもないかと思います。
ここにアクティビティとかいう
かっこつけた名前のパーツを配置して
機能とか処理をつけます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261256/8e5872fa-a08b-e623-65c8-b087c5159e30.png)

#作った自動化RPAのフローチャート

一から丁寧に紹介していると膨大になるので
できたものの流れを書いておきます。
使ったブラウザはクロームです。


**1**
オープンブラウザでブラウザを開く(始まるサイトはどこでも)
**2**
グーグルクロームの設定を開くボタンをClickImageで画像を認識したら押す。
**3**
認識できたら設定メニューが出るのでlを押す(シークレットウィンドウを作成する)
**4**
ClickImageでブラウザのURL部分を認識してクリックさせる
**5**
クリックするとURLの部分が入力状態になるのでType intoで文字を入れる
**6**
URLが入力されたのでSend HotkeyでURL転送（Youtubeで検索)
**7**
FindImageで読み込まれたのを確認してからClickImageでサイト名をクリック
**8**
Tabを必要な回数押して一番の左の動画を選択する。
**9**
Send Hotkeyでエンターを送信
**10**
ClickImageでURLの部分を選択
**11**
Send HotkeyでF10(右クリック)を送信
**12**
Send HotkeyでDown(下ボタン)を必要な回数送信
**13**
Send Hotkeyでエンターを送信
（ここでURLをコピー）
**14**
Type intoでURLからサイトのURL入力
**15**
Send Hotkeyでエンターを送信（サイトに移動)
**16**
ClickImageでURLを入力する部分を選択
**17**
Send HotkeyでCtrl + Vを送信
**18**
ClickImageで動画を変換するボタンを選択
**19**
FindImageでボタンが読み込まれたら（変換が終わったら）
ClickImageでボタンを選択

#成果物
https://github.com/takumi-otsuka/UIpath/tree/master/UIpath

#まとめ
アルゴリズムだけで作業を自動化できるが正直な所を言うとめんどくさい。
プログラムを書けないけど作業は楽をしたい人には良いのかもしれないとおもいました。
RPAは好き嫌いの個人差が出ると思います。（得意不得意とは別です）
TerraformでElastiCache(Redis)を管理している時にはまった罠

```
Your Amazon ElastiCache node(s) listed below are scheduled for replacement due to maintenance, which includes mandatory patches to improve security, reliability and operational performance. The maintenance will occur during the time range provided for each node. Please note that this is mandatory maintenance that will begin in your cluster’s maintenance window but may finish outside the window depending on the data and the load on the node(s).
```

というメールがAWS様から来たの何とかしないといけなくなった。

そして、その時に色々な地雷にはまったのでまとめておく。

# replication_group_idを17文字以上にするとノード追加ができなくなる

ノード追加時(number_cache_clustersを増やす)にエラーになった。

```
error creating Elasticache Cache Cluster (adding replica): InvalidParameterValue: The parameter CacheClusterIdentifier is not a valid identifier because it is longer than 20 characters.
```

しかし、新規立ち上げの時は怒られないのがタチが悪い…。

幸い、開発用のRedisクラスターだったので作り直す事で解決。

# AWSのコンソールからノードを消すとTerraform適用できなくなる

1台追加して、プライマリーにして、既存の2台を消してみた。

差分をとって実は良い感じに動くかな？と思ったが…。

planしてみると

```
snapshot_retention_limit
```

が

```
0 => 3
```

みたいな謎の差分が出る。

applyすると…。Node Not Found！

refreshとかしても改善しないので詰んだ。


# プライマリは何が何でも1番目のノードに割り当てられる

```
001 -> primary
002 -> replica
```

という状態で2台とも作り直したかったので

1. リードレプリカ追加(003)
2. 003のノードをプライマリーに昇格
3. number_cache_clustersを1にする

という手順を考えていた。

003はプライマリーだから、001/002が殺されるだろうと…。

しかし…。現実はもっと残酷だった…。

1. 001がプライマリーに昇格
2. 002/003が削除される

という結果に…。

https://github.com/terraform-providers/terraform-provider-aws/issues/480

↑こいつがサポートされていればこんな事にはならなかったのに…。

# 結局どうするか？

1. リードレプリカ追加(003)
2. 003のノードをプライマリーに昇格
3. AWSのメンテを待つ
4. 終わったら001をプライマリーに昇格
5. 003引退

で行くしかないかなぁと…。これから試すから結果はどうなるか…。
linkタグとフィード直開きの両方に対応したFeedly購読ブックマークレット

JavaScriptよーちえんなので拾い物の切り貼りでえろうすんまへんが。

[Queryfeed](https://queryfeed.net/)で生成したRSSフィードを購読するとき、フィードURLを直接開きやがるので、一般的なlinkタグ読むタイプのブックマークレットだと対応できない。
なので、linkタグがなかったらとりあえず開いているURLをエンコードして突っ込むように変更した。

```JavaScript
javascript: void (feedtag = document.evaluate(
  '//link[@rel="alternate"][@type="application/atom+xml" or @type="application/rss+xml"]',
  document,
  null,
  XPathResult.ANY_UNORDERED_NODE_TYPE
).singleNodeValue);
url = location.href;
if (feedtag) {
  location.href =
    "https://feedly.com/i/subscription/feed/" +
    encodeURIComponent(feedtag.href);
} else {
  location.href =
    "https://feedly.com/i/subscription/feed/" + encodeURIComponent(url);
}
```

整形してないやつ

```JavaScript
javascript: void(feedtag = document.evaluate('//link[@rel="alternate"][@type="application/atom+xml" or @type="application/rss+xml"]', document, null, XPathResult.ANY_UNORDERED_NODE_TYPE).singleNodeValue); url = location.href; if (feedtag) { location.href = 'https://feedly.com/i/subscription/feed/' + encodeURIComponent(feedtag.href); } else { location.href = 'https://feedly.com/i/subscription/feed/' + encodeURIComponent(url); };
```

本当はドキュメント解析してRSSかどうか判定したい。
VBAでサイトの特定箇所に文字を入力する　挑戦中

VBAでサイトの特定の場所へ文字入力を行なう為のフォームテキストを記しておく。

```vb
Set objInpTxt = objIE.document.getElementsByName("構成Name=～")(0)
objTxt.value = "入力したい文字"
```

```vb
objIE.Document.Forms(0).Item(1).value = "入力したい文字"
```
```vb
Set objAll = ie.document.getElementsByTagName("input")
For Each obj In objAll
    If InStr(obj.placeholder, "●●●") > 0 Then
        obj.Focus
        obj.Value = d.name
        sendKeysWait " ", 300
        sendKeysWait "{BACKSPACE}", 200
        Exit For
    End If
```

[オブジェクトがない]とエラーになった場合、フォーカスする場所が違う可能性がある。


＝＝＝課題＝＝＝
フォーカスする場所を間違えずに特定する方法はないか。方法を探す。
【サルが書く】CakePHP3でGmailアカウントを使って簡単にメールを送ろう


GmailのSMTPサーバを使って、CakePHP3でメールを送る設定をするよ。

## アプリケーションのEmailTransportを設定しよう
applicationのconfig/app.phpにEmailTransportとういう項目がある。
そこを設定することで、Gmailでのメール送信を実装できる。

```php5:app/config/app.php
    'EmailTransport' => [
        'default' => [
            'className' => 'Smtp',
            'host' => 'smtp.gmail.com',
            'port' => 587,
            'timeout' => 30,
            'username' => 'Gmailのメールアドレス',
            'password' => 'Gmailのパスワード',
            'tls' => true,
            'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
        ],
    ],
```

## Controllerでメールを送る設定をしよう

```php5:hogeController.php
//　クラスをよみこむ
use Cake\Mailer\Email;

	public function beforeFilter()
	{
		$this->email = new Email('default');
	}

    public function send()
    {
        $this->email->setFrom(['送り元メールアドレス' => '送り元名'])
            ->setTo('送り先メールアドレス')
            ->setSubject('表題')
            ->send('本文');
	}
```

**CakePHP3.4.0で仕様が変わりました**: 代わりに setFrom() 、 setTo() 、 setCc() 、 setBcc() そして、 setSubject() を使用してください。


## 送れないと思ったら・・・
Gmail側の設定で**安全性の低いアプリからのアカウントへのアクセスを許可する**の設定が必要です。

https://support.google.com/accounts/answer/6010255

## 参考文献
https://hacknote.jp/archives/27182/
https://qiita.com/frost_star/items/4a56cec1f5de5eccbd09
before_action を引数, フィルターオプション付きで実行

`before_action` に引数を渡す場合の覚書。

```ruby
before_action -> {
  get_hoge_data(fuga_argument) # 実行したいメソッド
}, only: [:new, :create]
```

フィルターオプションの定義もフォローしている。
docker-compose 3.4から追加されたExtension Fieldを使ってdocker-compose.yml でアンカー エイリアスを使う

ymlのアンカーとエイリアスを使うのは前々から出来たのですが、 docker-compose v3.4 以前は services 内にアンカーを書かなくてはいけなく少し不便だなと思っていました。

参考記事: [docker-compose V3 で extends っぽい事をする](https://qiita.com/odoku/items/502cef81fce42ecb9b07)

v3.4 から更に管理しやすくなったのでメモ。

## Extension Field

https://docs.docker.com/compose/compose-file/#extension-fields

v3.4 でExtension Fieldが追加されました。servicesなどを記述できるトップレベルに、自由にフィールドを追加できます。

こんな感じの docker-compose.yml があるとします。

```yml
version: '3'

services:

  web: &web
    build: .
    restart: always
    image: app
    env_file: ./.env
    command: ["./wait-for-it.sh", "mysql:9200", "--", "nodemon"]
    depends_on:
      - redis
      - mysql

  worker:
    environment:
      WORKER: "true"
    <<: *web

  redis:
    image: redis:latest

  mysql:
    image: mysql:5
```

v3.4からは次のようにできます。

```yml
version: '3.4'

x-template: &template
  build: .
  restart: always
  image: app
  env_file: ./.env
  command: ["./wait-for-it.sh", "mysql:9200", "--", "nodemon"]
  depends_on:
    - redis
    - mysql

services:

  web:
    <<: *template

  worker:
    environment:
      WORKER: "true"
    <<: *template

  redis:
    image: redis:latest

  mysql:
    image: mysql:5
```
pandasで"ImportError: 'numexpr' not found. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installed"

## 結論

pandasのversionが古く、`df.query`が使用できなかった

## バージョンについて

```
$ python 
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> pd.__version__
u'0.17.1'
```
Octave-cli で plot() 実行時のエラー, Octaveでグラフが表示されない時の対処方法

# エラー内容

```
set terminal aqua enhanced title "Figure 1"  font "*,6" dashlength 1
                      ^
         line 0: unknown or ambiguous terminal type; type just 'set terminal' for a list
```

gnuplot を使用するターミナルを設定する必要がある。

# 試しに gnuplot を実行してみる

```
$ cd /usr/local/octave/3.8.0/bin # gnuplot がある階層
$ ./gnuplot

G N U P L O T
	Version 4.6 patchlevel 4    last modified 2013-10-06 
	Build System: Darwin x86_64

	Copyright (C) 1986-1993, 1998, 2004, 2007-2013
	Thomas Williams, Colin Kelley and many others

	gnuplot home:     http://www.gnuplot.info
	faq, bugs, etc:   type "help FAQ"
	immediate help:   type "help"  (plot window: hit 'h')

Terminal type set to 'qt'
```

GNUTERM環境変数を「qt」にする必要がある。

# 対処方法

```
% vi ~/.octaverc

setenv("GNUTERM", "qt")
```

# 参考記事
* https://stackoverflow.com/questions/22898609/octave-does-not-plot
UIColor を xcassets ファイルで管理しちゃいたい。

# UIColor を xcassets ファイルで管理しちゃいたい。

リテラルな値はplistで管理しよう！！っていうのすでに試しましたので、リテラルじゃない物を！！
具体的には色（UIColor）です

## 結論
xcode9 から xcassetsファイルで管理できるようになりました。
が、しかしこれiOS11以降じゃないと動かないみたいです。

## 方針
xcassetsを使うにあたり
- colorディレクトリを作成
- 色にカラーパレットの概念を適用した名前で５色ほど作成
って感じで用意してみました。

## 設定方法
xcassets ファイルダブルクリックするこんな感じの画面が出ます。
<img width="1218" alt="スクリーンショット 2018-06-21 17.11.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/265224/69aa1189-e268-fb11-fa08-addb7e35cdce.png">
左下の＋記号をクリックして表示されたメニューから Create New ColorSet で色作れます。
（ディレクトリ分けは適宜）
ColorSet、そう、セットなのは動作デバイス毎に設定できたりするからみたいです。

## 使い方
使い方はとっても簡単
### コードから
UIColorのInitializerに名前渡すだけ

```swift
label.backgroundColor = UIColor(named: "MainColor")
```

### ストーリーボート　or インターフェイスビルダーから
Attribute inspecter で NamedColorsとして選べるようになります。
<img width="289" alt="スクリーンショット 2018-06-21 17.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/265224/f423e6cc-2ca2-9f31-021d-0e2a25e7a941.png">

すてきすぎますね。
Proxyサーバ経由でfluentdからS3にログを保存する

#はじめに
最近AWSを触っていて色々検証中。
今回Proxyサーバ経由でfluentdからS3にログを転送してみたのでメモとして残しておきます。

#環境
```
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

$ docker -v
$ td-agent --version
td-agent 0.12.40
```

#準備
下記が完了していることが前提です。
1.S3バケットの準備
2.td-agentとoutput_s3のプラグインインストール
3.forwarder側の設定

#aggregator側の設定
```
$ sudo vi /etc/td-agent/td-agent.conf
<match **.access_log>
type copy
  <store>
    type s3
    aws_key_id XXXXXXXXXX
    aws_sec_key XXXXXXXXXX
    s3_bucket XXXXXXXXXX
    s3_region ap-northeast-1
    path td-logs/
    flush_interval 60s
    time_slice_format %Y%m%d%H
    time_slice_wait 10m
    buffer_path /var/log/td-agent/s3
    buffer_chunk_limit 128m
    buffer_queue_limit 256m
    retry_limit 10
    retry_wait 5s
    proxy_uri http://<<proxy-server>>:<<port>>
  </store>
</match>

$ sudo service td-agent configtest
td-agent                                                   [  OK  ]
$ sudo service td-agent reload
Reloading td-agent configuration (via systemctl):          [  OK  ]
```
これでProxyサーバ経由でもS3にログを無事に転送出来ました。

proxy_uriにProxyサーバのIPとポートを指定するだけでした。

EC2内であればIAMポリシーで許可するかと思いますが、
EC2外の場合はaws_key_idとaws_sec_keyの取り扱いは注意ですね。

細かいパラメーターは下記や公式ドキュメントを参考にしました。
https://qiita.com/munazo/items/d665e2c4e86f42d06cf7

無事S3に保管出来ましたが、
保管するだけならaws cliでバッチで転送しても良いんだろうな～と思いました。
Sidekiqのキューの状況を取得したい時に使った方法

色々やり方があると思うけど、sidekiq5の場合だったら以下の方法でやると良いと思う。
例としてworkerのクラスを<code>HogeWorker</code>とします。

```
require 'sidekiq/api'

jobs = Sidekiq::ScheduledSet.new.select { |worker| worker.klass == 'HogeWorker' }
jobs.each do |job|
  # jobの中身が見れる。
  # sidekiqにセットした引数を確認する場合は
   p  job['args']
end
```

redis-cliで直接redisの中身みるのもありだと思います。
PowerShellでExcel上の任意の位置にシートを追加

# 概要

Excelのワークブックにシートを追加するには、[Worksheets.Add メソッド (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheets-add-method-excel)を使います。任意のシートを第一引数として渡した場合、そのシートの前に、第二引数として渡した場合、そのシートの後に新しいシートが追加されます。

# 詳細

## シートを追加する

[Worksheets.Add メソッド (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheets-add-method-excel)を使います。`$Excel`にはエクセルのオブジェクトが格納済みだとします。

    $Excel.Worksheets.Add()

あるいはWorkbookオブジェクトのWorksheetsに対してAddを呼ぶ方が丁寧かもしれないです。例えば、現在のワークブックを対象にする場合、次のようになります。

    $Book = $Excel.ActiveWorkbook
    $Book.Worksheets.Add()

シートは、現在のシートの前に挿入されます。

## 任意のシートの前にシートを追加する

[Worksheets.Add メソッド (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheets-add-method-excel)の引数で任意のシートを渡すと、そのシートの前に新しいシートが追加されます。例えば`Sheet3`の前に追加する場合、次のようになります。

    $Book = $Excel.ActiveWorkbook
    $Sheet = $Book.Sheets('Sheet3')
    $Book.Worksheets.Add($Sheet)

## 任意のシートの後にシートを追加する

[Worksheets.Add メソッド (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheets-add-method-excel)の第一引数は`Before`、第二引数は`After`なので、第二引数に任意のシートを渡すと、そのシートの後に新しいシートが追加されます。この時、第一引数には省略を示すため、欠損値`[System.Reflection.Missing]::Value`を渡します。

例えば、最後のシートの後にシートを追加する場合、次のようになります。

    $Book = $Excel.ActiveWorkbook
    $Sheet = $Book.Sheets($Book.Sheets.Count)
    $Book.Worksheets.Add([System.Reflection.Missing]::Value, $Sheet)

# 参考

* [PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい - Qiita](https://qiita.com/miyamiya/items/161372111b68bad0744a)
* [Worksheets オブジェクト (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheets-object-excel)
* [Worksheets.Add メソッド (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheets-add-method-excel)
* [Add or Move Excel sheet with PowerShell](https://social.technet.microsoft.com/Forums/ja-JP/d89913a1-c1bf-49b0-b76f-703740fb5aba/add-or-move-excel-sheet-with-powershell)
* [Missing.Value フィールド (System.Reflection)](https://msdn.microsoft.com/ja-jp/library/system.reflection.missing.value%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)

----

本ページ内容は筆者が参照の便のためにある時点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
iOS In-App Purchase sandboxテスターアカウントで支払うと保護者への承認リクエストが出る

こんなのいつから出るようになったの？

![IMG_0859.PNG](https://qiita-image-store.s3.amazonaws.com/0/5222/8db87dd6-e743-07d9-c9bd-b8ea89e93dda.png "IMG_0859.PNG")
画像平均化



```c.cs
//c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:winexe syuku02.cs

using System.Drawing;

public class syuku02
{
 public static void Main(string[] args)
 {
    if(args.Length==2){
        string path1;//in file name
        string path2;//out file name

        path1 = @".\" + args[0];
        path2 = @".\" + args[1];

        //int rt =3;

        Bitmap image1;
        image1 = new Bitmap(path1, true);

        Bitmap canvas = new Bitmap((int)image1.Width, (int)image1.Height);
        Graphics g = Graphics.FromImage(canvas);
		Color pClr;
		SolidBrush b;
		int x;
		int y;
		int xi;
		int yi;
		int r1;
		int g1;
		int b1;

		for(x=1;x<(int)image1.Width-6;x+=6){
			for(y=1;y<(int)image1.Height-6;y+=6){
				r1=0;g1=0;b1=0;
				for(xi=0;xi<6;xi+=1){
					for(yi=0;yi<6;yi+=1){
						pClr = image1.GetPixel(x + xi, y + yi);
						r1 += (int)pClr.R;
						g1 += (int)pClr.G;
						b1 += (int)pClr.B;
					}
				}
				//pClr = Color.FromArgb(255,255,255);
				//b = new SolidBrush(pClr);
				//g.FillRectangle(b, x, y, 6, 6);
				
				int t=8;
				r1 = ((int)(r1/(360*t)))*10*t;
				g1 = ((int)(g1/(360*t)))*10*t;
				b1 = ((int)(b1/(360*t)))*10*t;
				pClr = Color.FromArgb(r1,g1,b1);
				b = new SolidBrush(pClr);
				g.FillRectangle(b, x, y, 6, 6);
				//g.FillRectangle(b, x+1, y+1, 5, 5);
				}
		}

        canvas.Save(path2, System.Drawing.Imaging.ImageFormat.Png);
    }
 }

}
```
Ethereum開発環境構築：Windows編

> **Note：**記事は執筆時点（2018年6月）の内容です。技術の進歩が早く、今後陳腐化する可能性もあるのでご留意ください。

# はじめに
* Ethereumをローカル(Windows)で開発するのに必要な環境構築を行います


# 作業の流れ
1. WSL(Ubuntu)のインストール
2. WSL(Ubuntu)の起動
3. インストール事前準備 
4. node/truffle/ganache-cliのインストール
5. WSL(Ubuntu)の共有フォルダ設定
6. Visual Studio Codeのインストール
7. Visual Studio CodeのPluginのインストール

# 【手順1】WSL(Ubuntu)のインストール
* Powershellを管理者モードで起動。以下コマンドにて、WSLを有効化する。

```powershell
# WSLの有効化
$ Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

* Microsoft Storeを起動
* Ubuntuで検索して、インストール

### Related Link

> **How to install Truffle & TestRPC on Ubuntu or Windows 10 with “Windows subsystem for Linux”**

> * https://davidburela.wordpress.com/2017/05/12/how-to-install-truffle-testrpc-on-ubuntu-or-windows-10-with-windows-subsystem-for-linux/

> **Install the Windows Subsystem for Linux**

> * https://docs.microsoft.com/en-us/windows/wsl/install-win10


# 【手順2】WSL(Ubuntu)の起動
* Ubuntuをスタートメニューから起動する
* 初回起動時にUser/Passを聞かれるので、設定する

> **Note：**UserはWindowsのユーザとは異なるユーザでよい

### Related Link

> **WSL : Windows で Ubuntu環境 を実行する**

> * http://my-web-site.iobb.net/~yuki/2018-03/soft-tool/wsl-ubuntu/


# 【手順3】インストール事前準備
* 起動したUbuntuにて、以下コマンドを実行

### Ubuntuの最新化

```bash
# Ubuntuの最新化
$ sudo apt-get update -y && sudo apt-get upgrade -y
```

### build essentialとpythonのインストール

```bash
# build essentialとpythonのインストール
$ sudo apt install build-essential python -y
```

### nvmのインストール

```bash
# nvmのインストール
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
```

### ターミナルの再起動

```bash
# ターミナルの再起動
$ exec bash
```

# 【手順4】node/truffle/ganache-cliのインストール
* 手順3のターミナルで、以下コマンドを実行

### nodeのインストール

```bash
# nodeのインストール
$ nvm install node
```

### truffle/ganache-cliのインストール

```bash
# truffle/ganache-cliのインストール
$ npm install -g truffle ganache-cli
```

# 【手順5】WSL(Ubuntu)の共有フォルダ設定
* Windows側とUbuntu側でファイルのやりとりするフォルダを作成する
* c:\Users\<username>\<your-folder>にフォルダ作成

### bashのカレントディレクトリを変更する

```bash
# viで.bashrcを編集
$ vi .bashrc

# viにて編集
cd /mnt/c/Users/<username>/<your-folder>  をファイルの最後に追加
```

> **Note：**次回ログイン時に、カレントディレクトリが**/mnt/c/Users/\<username\>/\<your-folder\>**になる

# 【手順6】Visual Studio Codeのインストール
* Visual Studio Codeをダウンロードしてインストール

> **Note：**インストール済みの場合は、本手順はスキップ

### Related Link

> **Visual Studio Code**

> * https://code.visualstudio.com/

# 【手順7】Visual Studio CodeのPluginのインストール
* 以下のプラグインをインストール
    * solidity
    * Material Icon Theme

* Icon Themeを有効化
    * File –> Preferences –> File Icon Theme

> **Note：**Material Icon ThemeのダウンロードとIcon Themeは必須ではない。

### Related Link

> **Configuring Visual Studio code for Ethereum Blockchain development**

> * https://davidburela.wordpress.com/2016/11/18/configuring-visual-studio-code-for-ethereum-blockchain-development/
LINE Bot : LINE Front-end Framework を liff npm パッケージで操作

LINE Bot の新機能である [LINE Front-end Framework](https://developers.line.me/ja/docs/liff/overview/) を簡単に操作できる cli ツールが [Shoya](https://github.com/morugu) 氏により npm で公開中。早速試してみました。

[GitHub: liff-cli](https://github.com/morugu/liff-cli)
[npm: liff-cli](https://www.npmjs.com/package/liff)

# LIFF Cli のインストール

```
npm install -g liff
```

# LIFF の追加

とりあえず Bing.com を Tall で追加してみます。

```
liff add https://bing.com tall
```
liffId が結果として返ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/a0368b7e-ccbf-fa69-7f70-d1ee6e42350b.png)

# LIFF 一覧の取得

```
liff list
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/4f4a165e-0a73-a157-69e5-e5e27d4cb9f5.png)

# LIFF の更新

bing を GitHub に変更してみる。

```
liff update 1555709429-7ax0nRRP https://github.com tall
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/d248131c-9953-6198-d8b5-e5e3bc686e7c.png)

# LIFF のテスト送信

ユーザー ID (MID) が分かればテスト送信も可能。

```
liff send 1555709429-7ax0nRRP Ue52d11061xxxxxxxxxxxxxxxxxxx
```

<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/214116/4531e242-41cb-6a04-d8de-2742b54ef70c.png"/>

# LIFF の削除

ID を指定しても、一括削除も可能。

```
liff delete 1555709429-7ax0nRRP
liff deleteAll
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/d26328ed-9af8-4255-a568-9ac0be25871f.png)

足りない機能があれば GitHub の Issue に投げると良いみたいです。
openframeworksでウィンドウを非表示にする

#何がしたいのか
ofをオフスクリーンでレンダリングを行いWindowsのビデオソースに映像を流すのだが
その際にofのウィンドウは邪魔になるので非表示にしたかった。
##できた
```
ShowWindow( ofGetWin32Window(), SW_HIDE );
```
試行錯誤の結果WinApiを使うことになった、自分の環境ではこれでOK
setup()内で呼び出すと非表示にならないのでupdate()で呼び出そう。
##他に試したこと
- ofAppNoWindow

だめだったOpenGLに問題が発生原因は不明だが動かず

最終的にはハンドルさえあれば何でも出来ちゃうのさ
PHPでフィボナッチ数列を実装

PHPでフィボナッチ数列を実装してみました。

fb1の方は、再帰処理になっているが、再帰によって呼び出しされた時に
配列に入れる事によって処理が重くなりすぎる点を考慮したもの。

fb2の方は、何も考えずに再帰処理で行ったもの。

```php


<?php
$max_num= trim(fgets(STDIN));
if( !($max_num + 0 > 3) ){
        $max_num = 5;
}

$num = 0;
$array = null;
echo "##### fb1 #####". PHP_EOL;
$time_start = microtime(true);
print_r(fb1($array,$num,$max_num));
echo PHP_EOL;
echo microtime(true) - $time_start ,"s". PHP_EOL;
echo PHP_EOL;
/*
echo "##### fb2 #####". PHP_EOL;
$time_start = microtime(true);
print_r( fb2($max_num) );
echo PHP_EOL;
echo microtime(true) - $time_start ,"s". PHP_EOL;
echo PHP_EOL;
*/
function fb1($array,$num,$max_num) {
        if( $num > $max_num ) {
                return $array;
                exit;
        }
        if( !isset($array[$num-1]) || !isset($array[$num-2])) {
                $array[] = 1;
        } else {
                $array[] = $array[$num-1] + $array[$num-2];
        }
        return fb1($array,$num+1,$max_num);
}

function fb2($n){
        if ($n < 2) return $n;
        return fb2($n - 2) + fb2($n - 1);
}
```
ESP32をMQTTでPublishする

ESP32をWIfiに繋いで、ネットワーク内に用意しているRaspberryPiのMosquittoにMQTTでPublishする

ESP32-DevKitC 及び HiLetgo ESP-32s NodeMCU
ArduinoIDE 1.8.5
Mosquitto 1.4.10 on RaspberryPi

PubSubClient.hは
knolleary/pubsubclientを使用する
https://github.com/knolleary/pubsubclient

```MQTT.ino

    #include <WiFi.h>
    #include <PubSubClient.h>

    // WiFi
    const char ssid[] = "######";
    const char passwd[] = "######";

    // Pub/Sub
    const char* mqttHost = "######"; // MQTTのIPかホスト名
    const int mqttPort = 1883;       // MQTTのポート
    WiFiClient wifiClient;
    PubSubClient mqttClient(wifiClient);

    const char* topic = "topic";     // 送信先のトピック名
    char* payload;                   // 送信するデータ

    void setup() {
        Serial.begin(115200);

        // Connect WiFi
        connectWiFi();
  
        // Connect MQTT
        connectMqtt();
    }

    void loop() {

        // 送信処理 topic, payloadは適宜
        payload = "payload";
        mqttClient.publish(topic, payload);
        delay(1000);
  
        // WiFi
        if ( WiFi.status() == WL_DISCONNECTED ) {
            connectWiFi(); 
        }
        // MQTT
        if ( ! mqttClient.connected() ) {
            connectMqtt();
        }
        mqttClient.loop();  

    }

    /**
     * Connect WiFi
     */
    void connectWiFi()
    {
        WiFi.begin(ssid, passwd);
        Serial.print("WiFi connecting...");
        while(WiFi.status() != WL_CONNECTED) {
            Serial.print(".");
            delay(100);
        }
        Serial.print(" connected. ");
        Serial.println(WiFi.localIP());
    }
    /**
     * Connect MQTT
     */
    void connectMqtt()
    {
        mqttClient.setServer(mqttHost, mqttPort);
        while( ! mqttClient.connected() ) {
            Serial.println("Connecting to MQTT...");
            String clientId = "ESP32-" + String(random(0xffff), HEX);
            if ( mqttClient.connect(clientId.c_str()) ) {
                Serial.println("connected"); 
            }
            delay(1000);
            randomSeed(micros());
    }
}

```