OmniAICreator/Qiita-1.07M huggingface dataset:
FCM(Firebase Cloud Messaging)のユーザーセグメントを正しく理解しよう

FirebaseでPUSH通知（FCM）のユーザーセグメントに関して、正しく理解されていない情報がいくつかあり、googleの公式ドキュメント上でも明確な記載がなく、混乱したので書いておきます。（2018年末現在）

※あと、Googleの公式ドキュメントはEnglishでみないと更新されてないことが多々あるよね（汗

# 伝えたいこと

ユーザーセグメントするためには、主にユーザー（Audiences）とユーザープロパティ（User Property）の２つの方法がありますが、最近仕様が変わったり、混同していたりするので、正しく理解しましょう。

## ユーザー（Audiences）
Audiencesにてユーザーに対し複数条件をフィルターすることができます。イベントやユーザープロパティを組み合わせ作成できます。

**※ただし注意が必要です！**
これまでAudiencesに追加されると、そのユーザーは永遠にその属性を持ち続ける仕様でしたが、2018/10/29から仕様が変わり「有効期限（Membership duration）」が追加されました。そのため、Audiencesに属したユーザーは任意の有効期限までその属性を持つことになります。

2018/10/29リリースノートに記載があります。

> October 29, 2018
Added support for dynamic audiences that determine membership based on the current value of user properties. You can also now specify criteria for when your users leave an audience such as membership duration, exclusion criteria, or specific time periods. For more information, see Audiences.
https://firebase.google.com/support/releases?hl=en

またAudiencesについて、iOS-SDKのバージョンも注意が必要そうです。

>Version 5.2.0 of the Firebase Analytics framework is required to use the full set of audience capabilities on iOS.
https://support.google.com/firebase/answer/6317509?hl=en

※Android-SDKへの明記はありませんでした。


## ユーザープロパティ（User Property）
ユーザープロパティをセグメントに利用する場合は、**最新のプロパティでセグメント**してくれます。

**※ただし注意が必要です！**
ユーザープロパティがセグメントに適用されるまでにFirebase側の同期タイミングでの遅延が起きるようです。
手元の実験ではユーザープロパティがiOSアプリ上で変更された1時間ほどあとにFCMを発射させても、変更が反映されず通知が届いてほしくないユーザーに通知が届いてしまいました。（Audiencesのように永続するのかと勘違いしそうでした）
半日ほど置いた後に発射させたときには、通知が届かなくなりました。**反映に遅延があることを理解しましょう。**


#最後に
Firebase周りはまだまだ進化途中なので、古いqiita情報などを鵜呑みにせず、公式ドキュメント（英語）を読みましょう。そしてわからないことがあったら、誰かに聞こう。（今回の件も、とある有識者に協力頂きました。ありがとうございました。）
Rのソートとlocaleについて

Rのソートはデフォルトだとコードポイント順ではありません。何やら空気を読んでくれているようです。

``` r
## データの準備
d <- data.frame(
  kana = c("お", "エ", "う", "イ", "あ"),
  letter = c("A", "e", "C", "b", "Z"),
  stringsAsFactors = FALSE
)
```

``` r
## 空気を読んだソートをしてくれる
sort(d$kana)

#> [1] "あ" "イ" "う" "エ" "お"
```

`?Comparison`（[R: Relational Operators](https://stat.ethz.ch/R-manual/R-patched/library/base/html/Comparison.html)）を確認すると書いてありますが、文字列同士の比較はデフォルトだとlocaleに依存した辞書順でソートされます。つまり、今の例のように日本語ロケールではカタカナとひらがなの違いは吸収されるわけです。

この挙動は分かって使う分には良いのですが、空気を読んでほしくない場合もあります。具体的に言えばコードポイント順にソートしてほしい場合もあるわけです。それにはいくつかやり方があります。

## localeを変更する

素朴な方法として`Sys.setlocale()`でlocaleを変更してしまうというやり方があります。しかし、`locale = "C"`のままだと表示に難があります。

``` r
Sys.setlocale(locale = "C")
sort(d$kana)

#> [1] "\343\201\202" "\343\201\206" "\343\201\212" "\343\202\244"
#> [5] "\343\202\250"
```

ソートしてからlocaleを戻してやれば良いわけですが、面倒です。

``` r
sorted <- sort(d$kana)
Sys.setlocale(locale = "ja_JP")
sorted

#> [1] "あ" "う" "お" "イ" "エ"
```

## withrを使う

とかなんとかボヤいていたら @yutannihilation さんが教えてくれました。ありがたや。

<blockquote class="twitter-tweet">
<p lang="ja" dir="ltr">
stringi::stri_sort(locale = “C”)とかどうでしょう。 <a href="https://t.co/ak8VAPw5n5">https://t.co/ak8VAPw5n5</a> あとは一時的にロケールを変更したいならwithr::with_locale()とか。
</p>
— Hiroaki Yutani (@yutannihilation)
<a href="https://twitter.com/yutannihilation/status/1069763208657817600?ref_src=twsrc%5Etfw">December 4, 2018</a>
</blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これなら既存のロケールに影響することはありませんし、printはもとのロケールを反映するので表示にも問題ありません。

``` r
withr::with_locale(c("LC_COLLATE" = "C"), sort(d$kana))

#> [1] "あ" "う" "お" "イ" "エ"
```

※追記： ソートを変更するだけなら`whth_collate()`で良さそうです。

``` r
withr::with_collate("C", sort(d$kana))

#> [1] "あ" "う" "お" "イ" "エ"
```

## stringiについて

ところで、`stringi`の方は日本語だとうまくいきませんでした。

``` r
stringi::stri_sort(d$kana, locale = "C")

#> [1] "あ" "イ" "う" "エ" "お"
```

`locale = "C"`の指定が通っていないというわけではなく、アルファベットだとそれっぽく動きます。

``` r
## 通常の空気読んだソート
stringi::stri_sort(d$letter, locale = "en_EN")

#> [1] "A" "b" "C" "e" "Z"
```

``` r
## locale = "C"っぽさがあるソート
stringi::stri_sort(d$letter, locale = "C")

#> [1] "A" "C" "Z" "b" "e"
```

どうも`stringi`はライブラリとしてICUを使用しているため、システムのロケールを変更した場合とは挙動が異なるみたいです。ICUの場合、`C`は実際には`en_US_POSIX`を指定したのと同じことになるようです（cf. [Locale - ICU User Guide](http://userguide.icu-project.org/locale)）。

すなわちICUでできることはできる、ということなので、こんな感じで細かいソートの制御をすることもできます。これはこれで使いみちがありそうです。

``` r
## locale="en"のデフォルトのソートは小文字が前に出る
str <- c("a", "A", "a", "A")
stringi::stri_sort(str, locale = "en")

#> [1] "a" "a" "A" "A"
```

``` r
## colCaseFirstの指定で大文字を前にできる
stringi::stri_sort(str, locale = "en@colCaseFirst=upper")

#> [1] "A" "A" "a" "a"
```

``` r
## 通常のソートは辞書順
str2 <- c("A1", "A12", "A112")
stringi::stri_sort(str2, locale = "en")

#> [1] "A1"   "A112" "A12"
```  

``` r
## 数字の大きさを考慮したソート（自然順ソート）ができる
stringi::stri_sort(str2, locale = "en@colNumeric=yes") 

#> [1] "A1"   "A12"  "A112"
```
(備忘)FirebaseのStorageに画像を投げる

# index.vue

```vuejs
<template>
  <div>
    画像:
    <img v-show="uploadedImage" :src="uploadedImage">
    <input type="file" accept="image/png,image/jpeg" v-on:change="getFile"><br>
    <button v-on:click="getFile">ストレージへアップロード</button>
  </div>
</template>

<script>
import firebase from "@/plugins/firebase";

export default {
  data() {
    return {
      uploadedImage: '',
      file: null
    }
  },
  methods: {
    uploadFileToStorage: function() {
      var storageRef = firebase.storage().ref(this.file.name);
      storageRef.put(this.file.name).then(function() {
          console.log("image uploaded");
      });
    },
    getFile: function(e) {
      const files = e.target.files || e.dataTransfer.files;
      this.file = files[0];
    }
  }
}
</script>
```

# firebase側の設定

```
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
```

# 参考

- https://firebase.google.com/docs/storage/web/upload-files?authuser=0
- https://qiita.com/komatzz/items/f2a25db16aca388845d3
エンジニアでも知っておきたいビジネスモデル2.0の話

この記事は「ユニークビジョン株式会社 Advent Calendar 2018」の7日目記事です。

カレンダーのURLはこちら
https://qiita.com/advent-calendar/2018/uniquevision

---

# はじめに
- 本記事は以下の書籍の紹介と実践です
<img src="https://qiita-image-store.s3.amazonaws.com/0/314315/e192955e-42e3-76e8-44c6-02ff5b67708b.png" width=50%>

- 上記書籍の内容はnoteにて全文も公開されています（2018/12/7時点）
    - https://note.mu/tck/n/n95812964bcbb

---

# 本記事で扱うもの
- なぜビジネスモデルを学ぶのか
- 「ビジネスモデル2.0 図鑑」の紹介
- 実在のサービスのモデル化（実践）

# 本記事で扱わないもの
- 書籍で紹介されたビジネスモデルの妥当性
- 堅苦しくて小難しいビジネスモデルの理論
- 新しくて儲かるビジネスの作り方

---

# なぜビジネスモデルを学ぶのか
- 経営者とエンジニアはしばしば対立をする
- 原因は視点が違うためと考えている
    - 経営者：どのように収益を上げるか
    - エンジニア：どのような技術で実現するか
- どちらの視点も良いものを作るためには必要なはず
- 互いの視点を理解すればより良いものを作れるのでは？

---

# エンジニアが経営者を理解するために必要なこと
- 経営者が製品・サービスをどのように見ているのかを知る
    - 製品・サービスを取り巻く環境を知る
    - 顧客が何をしたいのかを知る
    - お金がどのように動くのかを知る
- これらを知るために本記事で紹介する書籍はとても役に立つ

---

# 書籍の概要
- ビジネスモデルを表現する共通言語を提案
- 上記共通言語を用いて100の事例を図解
- 事例の創造性を「逆説の構造」という概念で説明

---

# 例を見てみる：俺のフレンチを例に
<img src="https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/7708355/picture_pc_3dfce7bc8401b5339861327f722c55d3.jpg" width=50%>
画像は[note](https://note.mu/tck/n/n95812964bcbb)より引用

---

- 図が何を表現しているかは本記事では説明しない
- ただ、説明がなくても雰囲気は伝わるのではないだろうか？

---

# 別の例を見る：GitHubを例に
<img src="https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/7719391/picture_pc_2ea3c150d3b1608a702f579439a7cde4.jpg" width=50%>
画像は[note](https://note.mu/tck/n/n95812964bcbb)より引用

---

- 100の事例には我々にとって身近な例もある
- たとえ知らない業界のことも図を眺める程度なら苦ではない

---

# 実際のビジネスをモデル化してみる
- 世の中一般のビジネスをいきなりモデル化するのは難しい
- 書籍に従い自社のサービスをモデル化することから実践する
- Cacooには専用のテンプレートとステンシルが用意されている
    - https://nulab-inc.com/ja/press-release/pr-1809-27-bizgramxcacoo/

---

# 実践：インスタントウィンのシステムを例に
![インスタントウィン.png](https://qiita-image-store.s3.amazonaws.com/0/314315/ac2c6c6f-91dc-2e12-c58e-bcfca9cbfa76.png)

---

- インスタントウィンとは
    - その場で結果が分かる抽選のこと
    - 古くは駄菓子のあたりなど
    - 最近はSNS上でインスタントウィンを行うツールが多く提供されている
- 上記モデルはSNS上で行うインスタントウィンを抽象化してモデル化を行った

---

- 上記モデルを「逆説の構造」に当てはめると以下のような感じだろうか
    - [起点]インスタントウィン
    - [定説]商品を購買するなどして参加するため行える業種が限られている
    - [逆説]SNSで参加するためどのような業種でも行える

---

# モデル化してみて
- 正否はともかく、雰囲気出来た
    - 成否についてはツッコミ大歓迎！
- どのようなシステムを作れば良いのか分かりやすい
- ここから掘り下げるためには何をすれば良いのかは疑問

---

# まとめ
- 経営者とエンジニアが共有可能なビジネスモデルの表現方法について扱った
- エンジニアがビジネスモデルを知ることでより良い製品・サービスが出来るのではないだろうか
- 今後も技術だけではなく、経営についても学べたらと思う
ボタンを押せるだけのアプリができた

## 何か動きがあるアプリを
前回、AIDEを使ってハローワールドを出力するだけのアプリを作りましたが、その時に検索したサイトで、ボタンの作り方が書かれてたのでやってみました。
http://blog.livedoor.jp/nexusseven975/archives/30777118.html?ref=head_btn_next&id=5666771

## ハローワールドをコメントアウトしてみた
今あるハローワールドだけのプログラムに少し書き足せばできるだろうと思い、ハローワールド部分をコメントにして、ボタンを表示する内容をコピペしてみました。
が、エラーだらけで訳がわからなくなったので、素直に新規作成にしました。

## コピペしたらエラーだらけ
サイトに載っていたプログラムをコピペするだけで、簡単に動くだろうと思っていましたが、動きませんでした。エラー多数。
まず問題として、すべてのToastに下線が引かれていました。
明らかにimportが足りてないと思い見たところ、AIDEのデフォルトで読み込まれるのは
android.app
android.view
だけで、サイトに貼られていたスクショを見ると
android.os
android.widget
もimportしないといけないようなので、追記しました。

## タブが入ってて動かなかった
これで動くかと思ったら、相変わらずエラーだらけでした。
見比べても何が間違えてるのか分かりませんでしたが、まさかと思って空欄を消してみたら、コピペ元のサイトにタブが入ってたようで、それがエラーの原因でした。とても初歩的。

## できた
これで、ボタンを押せるアプリができました。
次は、サイトの後半に載っていた応用をいくつか試してみます。
minioで画像が表示されない時の注意点

# minioとは
Amazon S3クラウドストレージサービスと互換性のあるオブジェクトストレージ。オブジェクトのサイズは、数KBから最大5TBの範囲とのこと。
Railsでの使用では、S3との互換性があるため、carrierwaveやpaperclipなどでも使用しやすく開発環境でS3のテスト用として使用するときなどにとても便利です。

minioの設定やら使い方に関しては、公式や他の記事をみてもらえばわかると思うので省略します。
今回は、使用する上で何かとハマったポイントとその解決方法を備忘録も兼ね書いていきたいと思います。

#この記事が役に立つかもしれない人
・RailsでDockerを利用しminioを使っている人。

・公式 [https://docs.minio.io/](https://docs.minio.io/)

## 使用環境
macOS Mojave 10.14.1
Ruby 2.4.1
Rails 5.1.5

#起こった問題
**・format.jsonのversionにずれが生じる。**
　何故か自分の環境だけ（他の人は最新のバージョンになっている）minioのバージョンが古いままの状態でupdateされない。そのため、バージョンにズレが生じ画像が表示されないことがある。ログで「You are running an older version of Minio released 1 year ago」などと、バージョンが古いと注意される。キャッシュのため画像が表示されていたりすることもあるが、シークレットウィンドウで確認すると画像が表示されていなことがわかる。

```
sample_minio     |  You are running an older version of Minio released 1 year ago 
sample_minio     |  Update: docker pull minio/minio:RELEASE.2018-xx-xxxx-xx-xxx
```

 基本的に**「minio/minio:latest」**この設定をしていればdockerを立ち上げた段階で最新の状態になるため同じ状況になるひとは少ないかもしれない・・・

**・バージョンとか関係なく全画像表示されない（開発環境で）**

#解決方法

### 1.dockerのコンテナとイメージを作り直す
どうしてもformat.jsonのバージョンが最新にならない場合は、下記コマンドでコンテナとimageを作り直してみてください。

**・該当のコンテナを削除する**

```
$ docker rm sample_minio
```

**・該当のイメージを削除**

```
$ docker rmi -f {IMAGE ID}
```

**・ゴミイメージを削除**

```
$ docker image prune -af
```

**・もう一回ビルド**

```
$ docker-compose build
```


### ２.minioの管理画面側の設定を変更する
バージョンが最新の状態の場合でも画像が表示されていない場合は、Webブラウザで[http://127.0.0.1:9000](http://127.0.0.1:9000)にアクセスし、minioのweb管理画面側で権限の設定がされているか確かめてください。該当のバケットの**「Edit policy」**でReadかWriteを設定してください。


#まとめ
以前から、画像がところどころ表示されなかったりといまいちminioについて理解せずそのままにしていました。そもそも何故バージョンが更新されなかったのか。など、まだ根本的なところが深く理解できていませんが、引き続きminioについて調べていきたいと思います。
上記の内容で、「それはこうしたほうがいい」「そもそもそこが違う」などの意見があればコメントを頂けたらと思います。
少しでも同じような問題が起きている人のためになれば幸いです。読んでいただきありがとうございました！
CoffeeScript → ES2015移行でトラブったことまとめ

CoffeeScriptで書かれたAngularJSアプリケーションのコード群を順次ES2015に置き換えた際、いくつかやらかしてしまった問題があったので、備忘録としてここにまとめます。


# 環境

* CoffeeScript 1系
* AngualrJS 1.3
* Grunt
* Browserify

# 移行手順
* [decaffeinate](https://github.com/decaffeinate/decaffeinate)を使ってコード変換
    * 一度に全部のコードを変換するのに耐えられるテストが無いため、細かく1ファイルずつ移行していく
* ESLintへの適応、ESModulesの対応
* ファイルの切り替え

# 陥った問題
## 二重定義とinstanceofによる問題
細かく移行していくため、jsに変換したあとも元のCoffeeScriptファイルを消せない場合が出てきます。例えば

```a.coffee
class A
  test: () ->
    console.log(10)
```

```a.js
export default class A {
  test() {
    console.log(10);
  }
}
```
この変換に問題はありませんが、CoffeeScript側のクラス`A`がほかの未変換のCoffeeScriptから参照されていた場合、それらがすべてjsに変換されるまで`a.coffee`は消せず、クラス`A`は二重に定義された状態になります。
ふたつのクラス`A`は同じふるまいをするので多くの場合問題にはなりませんが、`A`のインスタンスに対して`instanceof`している場合は致命的にマズイです。

```b.js
import A from './a.js';

function test(obj) {
  if (obj instanceof A) {
    // ...
  }
}
```

このコードでは、引数`obj`にjs側のクラス`A`インスタンスが渡ってくる場合は`instanceof A`は`true`になりますが、CoffeeScript側のクラス`A`インスタンスが渡ってきた場合は`false`となり、意図しない動作の元となります。

## @とグローバル変数問題
decaffeinateの変換によって不具合が発生する場合があります。以下がその例です。

```sample.coffee
class Test
  constructor: (@hoge) ->
    console.log(hoge)
```

このようなCoffeeScriptをdecaffeinateで変換すると、以下のようなjsが出力されます。

```sample.js
class Test {
  constructor(hoge) {
    this.hoge = hoge;
    console.log(hoge);
  }
}
```

しかしこの変換は正しくありません。
正しく動作させるには以下のように修正する必要があります。

```sample.js
class Test {
  constructor(hoge) {
    this.hoge = hoge;
    console.log(window.hoge);
  }
}
```

つまり、CoffeeScript側の`console.log(hoge)`における`hoge`はグローバル変数であり引数`@hoge`とは別物であるるため、js側では引数`hoge`とグローバル変数`hoge`を明確に分けるため`window`の明示が必要だったということです。
この変換による不具合は、一見して間違いが見えづらく、十分なテストが書かれていなければ防ぐのは難しいかもしれません。

## $scopeとbind問題

```c.coffee
class C
  constructor: (scope) ->
    scope.foo = @foo

  foo: () =>
    console.log(this)

C.$inject = ['$scope']
```

```c.js
class C {
  static $inject = ['$scope'];

  constructor(scope) {
    this.foo = this.foo.bind(this);
    scope.foo = this.foo;
  }

  foo() {
    console.log(this);
  }
}
```

この`this.foo.bind()`の部分を「無くてもなんとかなるのでは？」と安易に考えて消してしまうと

```test.html
<button ng-click="foo()" />
```

のようにscope経由でメソッドを触った時、メソッド内の`this`がオブジェクト自身ではなくscopeを指してしまい、意図しない動作の元となります。`bind()`は残すか、Controller asでメソッドを使う必要があると思われます。

# さいごに
当移行では、かなりのトラブルが発生してしまいました。それなりの規模のアプリケーションであることもあり、リリースには恐怖感すらありました。
なんとか大半の移行は完了しましたが、このような事態を避けるため日頃からテストを書いておくべきだと思うのでした。
Intel PAC用にAcceleration Stack環境を構築したときにドライバが入らず困った話

# まえがき

IntelのFPGA，PAC (Programmable Acceleration Card) の環境構築をした際に， 
どうやってもドライバが入らず，？？？ってなった問題を解決したメモ

## 環境

- CentOS7.4 (3.10.0-693.el7.x86_64)
- DELL R640
- Intel PAC

## インストール方法

### Acceleration Stackのインストール

まずは，マニュアル通りに進めた
[Installing the Intel Acceleration Stack](https://www.intel.com/content/www/us/en/programmable/documentation/iyu1522005567196.html#dpx1528499299102)

Intel Acceleration Stackランタイムをダウンロードして，
`./setup.sh` でインストールするだけなのでここは難しくない．

### OPAE Frameworkのインストール

ここからが本題
[Installing the OPAE Framework from Prebuilt Binaries](https://www.intel.com/content/www/us/en/programmable/documentation/iyu1522005567196.html#rfk1522431476975)

のマニュアル通りにrpmパッケージを `yum` でインストールしていくだけでドライバがインストールされるはず...なのだが

```
$ lsmod | grep fpga
$ 
```

なにも出てこない(´・ω・｀)

要件は満たしているはずなのになぜかなー？と考えあぐねていたところ
CentOS7.5 -> CentOS7.4にダウングレードしたサーバにはドライバがインストールできていたことを思い出し
`kernel-devel` を確認するとCentOS7.5用のカーネルソースを掴んでいた．

なので， CentOS7.4用の `kernel-devel` をインストールすることに.
手っ取り早く動くかどうかを確認したかったので以下のサイトから直接rpmをDLしてきた

[kernel-devel-3.10.0-693.el7.x86_64.rpm](http://rpm.pbone.net/index.php3/stat/4/idpl/37924679/dir/scientific_linux_7/com/kernel-devel-3.10.0-693.el7.x86_64.rpm.html)

`wget` などでサーバに保存した後，下記のコマンドを実行

```
sudo yum remove kernel-devel
sudo yum install kernel-devel-3.10.0-693.el7.x86_64.rpm
```

これでCentOS7.4向けの `kernel-devel` がインストールされた

```
$ yum list installed | grep kernel-dev
kernel-devel.x86_64
```

そして再度ドライバをインストールし直してみる

```
cd $OPAE_PLATFORM_ROOT/sw
sudo yum remove opae-intel-fpga-driver
sudo yum remove opae*.x86_64
sudo yum install opae-intel-fpga*.rpm
sudo yum install opae*.rpm
sudo ldconfig
```

今度はドライバがきちんとインストールされた:v:

```
$ lsmod | grep fpga
intel_fpga_pac_hssi    18107  0
intel_fpga_fme         52380  0
intel_fpga_afu         31735  0
intel_fpga_pci         26519  2 intel_fpga_afu,intel_fpga_fme
fpga_mgr_mod           14693  1 intel_fpga_fme
```

分かってしまえば簡単な問題でしたが，結構調べてしまいましたー:innocent:
technewsを支える技術

**この記事は [リクルートライフスタイル Advent Calendar 2018](https://qiita.com/advent-calendar/2018/recruitlifestyle) 7日目の記事です。**

こんにちは。フロントエンドエンジニアの @YuG1224    です。

技術ノウハウやナレッジの共有、どうやっていますか？
Slack の technews チャンネルに技術系記事を投稿することありますよね？
SNS で良い記事を見つけた時、「technews に**簡単に**共有したい！」と思いませんか？
今回は「**Pocket と Microsoft Flow を使って、Slack に自動投稿する方法**」を紹介します。

## Pocket とは

[Pocket](https://getpocket.com/) とは今見ているWebページを保存してあとで読むことができるWebサービスです。
[はてなブックマーク](http://b.hatena.ne.jp/) などと同じソーシャルブックマークの1つですね。

<img width="375px" alt="Pocket" src="https://qiita-image-store.s3.amazonaws.com/0/106236/c2ce4d48-ba95-dc0a-a4a3-106467d98173.png" border="4">

### Pocket は RSS フィードを作ってくれる

この Pocket で保存した記事は、サイトかアプリで見るのが基本なのですが、RSS フィードも用意してくれているので、マッシュアップに使うことができますね。

[Can I subscribe to my list via RSS?]
(https://help.getpocket.com/article/1074-can-i-subscribe-to-my-list-via-rss)
`http://getpocket.com/users/USERNAME/feed/all`

上記のフィード URL をそのまま Slack の `/feed` コマンドで登録して終了…
それでもまったく問題ないのですが、自分はひと手間加えて Microsoft Flow で加工するようにしてみました！

## Microsoft Flow とは

[Microsoft Flow](https://flow.microsoft.com/ja-jp/) はアクションやトリガーを使って、タスクを自動化することができるWebサービスです。
似たようなものに [IFTTT](https://ifttt.com/) や [Zapier](https://zapier.com/) などがあります。

<img width="375px" alt="フローの編集" src="https://qiita-image-store.s3.amazonaws.com/0/106236/e41a9f08-765d-6766-963b-c0e8622f88d4.png"> <img width="375px" alt="technews" src="https://qiita-image-store.s3.amazonaws.com/0/106236/9f323364-367e-1de3-f945-21fab0eb9996.png">

Pocket のフィード URL をフィードトリガーに設定することで、新着のタイトルとリンクが自動で投稿されるようになりましたね。

`/feed` や IFTTT の場合、投稿者が Bot になってしまいますが、 Flow ならオプション設定でユーザとして投稿することできるので、修正や削除も可能になります。

さらに、一見すると人が投稿しているように見えるので、**機械的で冷たい雰囲気を出さずに自動化することができる**のもメリットかなと思います。

### さらにひと手間

<img width="375px" alt="フローの編集" src="https://qiita-image-store.s3.amazonaws.com/0/106236/ed26aca4-884b-7637-3d89-cb0bc4fa2d36.png">

また、条件のアクションを追加すれば、フィードのタイトルやリンクなど、特定の値によってその後の処理を変えることができます。
これを使えば、**フィードの内容によって投稿するチャンネルを変更する**こともできそうですね。

## Pocket に保存するショートカット

<img width="375px" alt="フローの編集" src="https://qiita-image-store.s3.amazonaws.com/0/106236/56caba80-87b2-26b8-34b5-fc793531f049.gif">

実際に SNS 等で記事を見つけて Pocket に保存するときは、普通に Pocket のアプリを開いて保存してもいいのですが、さらにさらにひと手間加えて、はてブも一緒にできるように iOS のショートカットを作って保存するようにしています。
はてブは Twitter と連携しているので、 空き時間にさっと、**一連の操作で Slack と Twitter に自動投稿できるのが良いですね！**

「はてブしたものを Slack に流せばいいじゃん！」と思う人がいるかもしれませんが、流したいものとそうでないものがあるので、仕分けするために手間をかけている感じです。

以上、ぜひ皆さんもやってみてください！
Macでmysqlを扱う方法

Macでmysqlの設定方法を調べたかったのに、
Windows系の記事の方が多かったので、
自分でまとめて記事にしてみました。

Terminal上での作業を想定しています。
※ `[]` 部分は `[]` も含めて対象のものに置き換えてください。

## インストールと状態確認

### brewでインストール

brewでmysqlをインストールします。

```
$ brew install mysql
```

インストールしたmysqlの情報を確認する場合は、下記コマンドで。

```
$ brew info mysql
```

### バージョン確認

```
$ mysql --version
```

## mysql自体の起動・停止

mysqlはインストールしただけでは起動していません。
利用する場合は起動をしましょう。
また、使い終わったら停止しておきましょう、バッテリー結構消耗しがちなので。

```
$ mysql.server start # 起動
$ mysql.server start --skip-grant-tables #　パスワード無しでログイン
$ mysql.server stop # 停止
```

## 実行（ログイン）

`$ brew info mysql` で確認した情報欄にも記載がありますが、下記コマンドで実行。

```
$ mysql -uroot #root実行
```

## 実行後

### ヘルプ

ヘルプ一覧を表示。（コマンドどちらでも可）

```
mysql> help
mysql> \h
```

### mySQL状態確認

```
mysql> show variables like 'version'; #バージョン確認
mysql> show status; #セッション統計情報の表示
mysql> show status like "Threads_connected"; #現在の同時接続数を表示
```

### ユーザ状態確認、操作

```
mysql> select user(); #ログイン中のユーザ表示
mysql> show grants; #現在ログイン中ユーザの権限確認
```

### データベース状態確認、操作

```
mysql> show databases; #データベース一覧を表示
mysql> use [db_name] #使用するデータベースを選択（セミコロン不要）
mysql> create database [db_name] #データベースの作成
mysql> drop database [db_name] #データベースの削除
```

### テーブル状態確認

```
mysql> show tables; #テーブル一覧を表示
mysql> show tables status; #テーブル一覧のステータス情報を表示
mysql> desc [table_name]; #カラム一覧を表示
mysql> show full columns from [table_name]; #カラム一覧を表示、Collation付き。
mysql> show index form [table_name]; #特定テーブルのインデックスを確認
```

※Collation：照合順序。MySQLでは文字コードとソート順を持っており、ソート順の部分がCollationと呼ばれている。DB単位、テーブル単位、カラム単位で設定可能である。

### ユーザの作成・削除

ユーザ名：maki
パスワード：fuwa

のユーザを作成します。

```
mysql> create user 'maki'@localhost identified by 'fuwa';
```

下記コマンドで作成できたことを確認しましょう。

```
mysql> select user, host from mysql.user;
```

間違えた場合などに、ユーザを削除するコマンドは下記。

```
mysql> drop user 'maki'@localhost;
```

ちなみに、作成したユーザでログインする場合は下記コマンド。
コマンドを打ったらパスワードを求められます。

```
$ mysql -u maki -p
```

## 退出（ログアウト）

下記どれでも可能。（コマンドどちらでも可）

```
mysql> exit
mysql> quit
mysql> \q
```
Xamarin.Formsのテンプレートを動かしてなんだかやった気になる

＜2018年一人アドベントカレンダー4日目＞
# はじめに
プログラミングの勉強をしたい、と思ったときにまずは「何を作ったらいいんだろう」というのが誰もがぶつかる壁だと思います。そして、モチベーションを上げてそれを保つためにはある程度実用的であると良いと思います。すぐに作れて自分の生活の中で使っていけるものだと、学習も捗るというものです。
そこでおすすめなのがXamarin.Formsによるスマートフォン用アプリケーションの開発です。何が良いかというと、

- テンプレートからプロジェクトを作成したら、それだけで充実感を得られるアプリができている。
- 自分のスマートフォンにインストールしてすぐに触れる。

という点です。
入門者としてはまずは動かせるということが大事だとおもいますし、そのとりあえず動くレベルがテンプレートとしては軽く感動するレベルで、しかも今後の発展がイメージしやすいのは学習を継続するモチベーションにつながるのではないでしょうか。

# どんなものができるの？
テンプレートから作られたプロジェクトでどんなものができるのか、初めに示しておきます。
こんなものができます。
<img width='200' src='https://qiita-image-store.s3.amazonaws.com/0/245438/632e82f6-c003-9a5e-711a-b875732c96f4.gif'>
ノンコーディングでこれです。すでにメモアプリっぽくなっています。
画面遷移時のアニメーションもデフォルトでこのとおりです。
楽しそうですね。
今回はここまでやってみましょう。


# 環境
以下の環境をご準備ください。
この環境（現時点での私の環境）が前提になりますが、多少バージョンが異なっていても大丈夫でしょう。

- Windows10 バージョン1809
- Visual Studio Community 2017 バージョン15.9 
- Visual Studioで「.NETによるモバイル開発」のワークロードがインストール済み
- 実機推奨（なくてもエミュレータでいけます）

Windowsはアップデートをしっかり適用していれば現時点ではバージョン1809です。
Visual Studio Communityも、これからインストールするのであれば15.9でしょうし、そうでなければアップデートすると良いでしょう。

# プロジェクトの作成
Visual Studioを立ち上げ、メニューから`「ファイル」→「新規作成」→「プロジェクト」`を選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/ca343e1a-0059-3482-3bad-8a03edd546cc.png" title="" alt="clipboard_20180925171311.png" width="60%" height="" >

`「新しいプロジェクト」`ウィンドウが表示されるので、左側のリストから`「Visual C#」`を選択し、真ん中のリストから`「モバイルアプリ(Xamarin.Forms)」`を選択します。
「名前」、「場所」は好きな名前、フォルダにして良いのですが、本稿と同じにしておくとわかりやすいかと思います。
そのほかは変更せずそのままにしておいて、右下の「OK」ボタンを押してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/3ce8ba88-a9b7-8005-c05c-1b622d699ebf.png" title="" alt="clipboard_20180925152258.png" width="60%" height="" >

次に以下のウィンドウが表示されるので、`「Master-Detail」`テンプレートを選択して、右下の「OK」ボタンを押すとプロジェクト作成完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/b5b3afd4-5186-7402-cf84-4ac38fe79293.png" title="" alt="clipboard_20180925153135.png" width="60%" height="" >


# そのまま実行
プロジェクトが作成されたら実機をUSBケーブルでPCに接続し、実行しましょう。
実機でのデバッグについては「実機でデバッグ」を参考にしてください。
初回は時間がかかりますので、辛抱強く待ってください。2回目以降はいくらか速くなります。
成功すると実機側でこのアプリが起動し、冒頭のとおりの画面が表示されますので、画面遷移などを楽しんでください。

なんだかやって気になれましたね！
テンプレートからノンコーディングで実行しただけだとしても、実際に動くところを見るとワクワクするものです。

テンプレートをもとにちょっとした変更を加えてアプリケーションを作ってみるのも良いのでは無いでしょうか。

そうすると、メモアプリなんかがいいんですかね。


### ご注意ください
テンプレートから作成しただけのものなので、保存機能はありません。追加した項目はアプリが終了するとなくなります。
なぜ、行列のできるラーメン屋は味が落ちやすいのか

エンジニアの生産性を上げろ！と言われるたびに、むず痒くて。
言語化するにはーって考えていたんですが、週7日ラーメンでも構わないくらい
好きなので、ラーメン屋で、モヤモヤしたこの想いを表現したいと思います。

# 行列のできるラーメン屋とは？

行列のできるラーメン屋は、以下の特徴を持っています。（※持論）

１）とにかく美味しいラーメンである（大衆に受け入れられている）
２）このラーメンを食べるためなら、コストは厭わない（Q > C)
３）このラーメンを食べるためなら、この待ち時間に不満はない（Q > D）

>　このラーメンを食べた事実が大切（味とか関係ない。自己満足が満たされれば良い）
>　テレビで見た。芸能人がオススメしたとか。インスタ取りたいとか、もいますが、
>　ただ、これも、「このラーメンを食べるためなら」に広義では含まれるかと。

要するに、クオリティがコストを上回り、デリバリーに不満を持たないお店です。

> ラーメン屋さんのQCD（※持論）
> Q: ラーメンの味、店員のサービス等、お客が「五感で感じる」もの全て。
> C: ラーメンの原価とか、地代とか
> D: 客がお店に到着してから、お金を払い外に出るまでの時間

# さぁ、生産性をあげようじゃないか

ラーメン屋さんの生産ラインは、以下のようになっています。

```
1. お客様の注文を聞く
2. ラーメンを作る
3. ラーメンをお届けする
4. （お客が食べる）
5. （後精算の場合）お代を払う
6. 後片付けする
```

当然ですが、最大席数を超えるお客様の流入があるので、行列ができてます。
生産性を上げるためには、どうしたらいいでしょうか？

# 生産性を上げる

行列ができるお店が考えることは、

**たくさんのお客様がお待ちなので、回転数をあげればもっと利益が出るし、喜んでもらえる！**

なので、従業員に生産性を上げろ！と、店長は指示を出します。
**もっと回転数を上げろ！お客様をお待たせするな！！**

すると、従業員たちは、とにかく自分たちの作業スピードを上げるようになります。
さぁ、生産性が高まっていきますよ！

# だがしかし

ラーメンは、一定の手順を踏んで作られます。
ですので、スピードを上げるには、
１）熟練する
２）省く
しかありません。

しかし、熟練するには時間がかかりますし、全てのシフトに熟練した
人が入れるとも限りませんね。

では、省きましょう。
１）湯切りを通常の1回減らす
２）調味料の計測を省く
etc...

恐らく、美味しく無くなりますよね。。。

他の生産タスクでも、、、

**■ ラーメンをお届けするスピードを上げる**
ラーメンを走ってお届けしましょう！
語るまでもないですね。。。

**■ 客が席を立つスピードを上げる**
ゆっくり食べさせてよ。。。

**■ 精算をスピードアップ**
レジ打つ速度、お釣りを出す速度を向上しよう？

**■ 後片付けのスピードを上げる**
まぁ、このくらいはなんとかなりそうかな？


のように、生産性を上げようと、個々の側面でがんばるあまり、
全体的な品質が落ちやすい状況が生まれます。
最後に、

**余裕が無い状況での作業が品質を下げる**

これは、もう自明の理というか。

# 生産性を上げることの闇

生産性を上げることを考え、とにかくお客様を回すことに取り憑かれたラーメン屋は、
どんどん品質が下がっていきます。
たくさんのお客様を回せるかもしれませんが、リピーターが来ないので、
段々と売り上げが落ちていきます。

**ふと気づくと、回すことに特化した従業員しかおらず、
品質にこだわる従業員は、いなくなっています。**

どうやって品質を上げて良いかもわからなくなり、最後は閉店することになります。

# なぜか

大前提として、

**このラーメンを食べるためなら**

という「素晴らしい品質」ありきで、このお店は流行っていたということ。
決して、「待たないから」ではなかったのですよね

# この店長みたいなバカはいないだろ？

本当にそうでしょうか？

**もっと回転数を上げろ！お客様をお待たせするな！！**

このセリフ。エンジニア界隈でよく聞きませんか？

**もっと早く作れ！納期に間に合わないぞ！！**

**なんでテストにこんなにかかるんだ！さっさとリリースしろ！！**

**もっと工数を減らせないのか！無駄を削減しろ！！**

# モノづくりにとっての生産性とは

生産性という額面だけ受け取って、**作業を速く、無駄を省く**ことに囚われていませんか？

エンジニアの会社への貢献は、

**素晴らしい資本を作り、提供すること**

に、その本質はあります。そして、素晴らしい会社ほど、
モノづくりに携わる人たちへの「投資」を忘れません。
コストとして人を見るのではなく、将来性として投資するものです。
>これは、投資したいと思わせる人が多いから。というのもあります。

ですので、個人が生産性をあげるというのは、

**投資に対する見返りを最大化する**

その一言に尽きます。
そのためには、どの工程に問題があり、何を強くするか
- **注意深く観察し**
- **ボトルネックを発見し**
- **ボトルネックを最大限活用する or 改善する**

を繰り返す必要があります。

決して、個々の作業スピードを上げることが、生産性向上ではありません。
自分の作業を短縮するよりも、

**全体を一つの流れとして見て、滞っている箇所を解消すること**

の方が、ものづくり全体の生産性は、
格段に向上しますし、投資対効果にも大きな影響を出すことができます。

**モノづくりの上げるべき生産性は、全体最適化こそ全て。**

そこに、組織や会社の違いなんて、大したことではありません。
みんなで、素晴らしい製品を、効率よく作っていきましょう。

# 本題からは外れますが、、、

投資対効果は、ビジネス全体で測るのが普通です。
あまりに品質にこだわるあまり、スピードを殺すことにより、
効果が低くなることも忘れずに。

**ビジネスの求めるタイミングに、しっかりとリリースする**

ことが、大前提なのも、頭の片隅に置いておく必要があります。
iTermのタブに名前を自動でつけてどのリポジトリ触っているか一目でわかるようにする

- 仕事ではGitLabを使っているので、リポジトリは`.../<group名>/<repository名>`という形式で開発マシン上にある
- iTermでそれぞれのレポジトリをタブごとに開いて作業
- コーディングはvim + NERDTreeが基本、コマンド叩きたくなったらvimの中でterminal開く

という作業環境なので、以下の関数を`.zshrc`に定義しておくと、作業しているgroupとrepositoryが分かりやすい。

```
precmd() {
  # カレントディレクトリ+一つ上まで表示
  echo -ne "\e]1;${PWD#"${PWD%/*/*}/"}\a"
}
```
bundlerでcocoapodsのバージョンを管理


たまに `$ pod install` をすると、差分が出てしまう時があります。
cocoapods自体のバージョンが上がってしまうことが主な原因です。

bundlerを用いると、cocoapods自体のバージョンを固定にでき、
バージョン管理を行うことができます。
そうすれば、勝手にバージョン上がってしまう自体を避けられます。

## 実行環境

- OS: MacOS v10.13
- Terminal: iTerms
- Bundler: 1.16.3

## 事前準備 bundlerインストール

bundlerをインストールしておきます。
この説明は、今回は省略します。

## 手順

### Gemfile作成

下記コマンドで、bundlerの設定ファイル `Gemfile` を作成します。

```
$ bundler init
```

### Gemfile中身にcocoapodsのバージョンを追記

Gimfileを修正します。

```
#↓これは一旦コメントアウト
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

#↓これを追記
gem 'cocoapods', '~> 1.5.2'
```

`gem 'cocoapods', '~> 1.5.2'` と書くことで、
cocoapodsのバージョンを1.5.2に指定しています。

### cocoapodsをインストール

cocoapods自体をbundlerでインストールします。

```
$ bundle install
```

これで完了です。

### （補足）以降、pod installする時

今回はcocoapodsの利用法自体は省略しますが、
pod installする方法だけ記載します。

今までは、

```
$ pod install
```

としていたと思いますが、今後は、

```
$ bundle exec pod install
```

としてください。
こうすることで、cocoapodsのバージョンを変えずにpod installできます。
コマンド長い...と思う人は、aliasで短縮形を設定してください。説明省略。

ちなみに、アップデートは

```
$ bundle exec pod update
```

です。

### （補足）.gitignoreの設定

今回git上に追加すべきファイルは、下記の2つだけです。

```
Gemfile
Gemfile.lock
```

コレ以外のファイルはそれぞれのPC環境で、
`bundle install` とすることでインストールできるファイルなので、
.gitignoreで指定してしまって良いです。
今さらながらにElasticStackで可視化について

## プロローグ

ある日のこと、サービスを開発・運用しているチームの同期にこんな依頼をされた。
「システムからメールが送れてないみたいなので、調査を手伝ってほしい」
聞けば、システムからのメール送信は外部のメールサービスを利用していて、そこにログとして情報は出ているのだが、テキストであるログから情報を抽出してくるにはたいへんな労力がかかるとのことだった。
そこで、システムのメール送信状況をElastic Stackを利用して可視化することになった。

## 構成
![system_freehand.png](https://qiita-image-store.s3.amazonaws.com/0/105279/06ee0b1f-c6d4-ce9c-6b17-d11882cd489f.png)
システムの構成は上図のようなものである。

* シェルを実行してインターネット経由でメールサービスからログを取得
* 情報を加工(マスク等)した後、ファイルを配置
* Filebeatでファイルを読ませ、Logstashに送る
* Logstashで情報をフィールドに分割し、Elasticsearchに送る
* Elasticsearchの情報をKibanaで可視化

(今回はElastic Stackをすでに立てていたため相乗りする形としたが、不要ならFilebeatとLogstashはなくして直接Elasticsearchに送信でも可)

LogstashやElasticsearchの設定などは他に良い記事がたくさんあると思うので、今回は割愛。

## 結果
![mail.png](https://qiita-image-store.s3.amazonaws.com/0/105279/208c0f30-c6d2-267a-28eb-b062747aff68.png)
どのくらいメール送信が失敗しているかや、挙動が変化したことなどが一目瞭然。
上図は送信に失敗したメールを失敗原因の分類別に積み上げたグラフであり、原因が水色だったものが9/5ごろなくなっているのがわかる。
![typo.png](https://qiita-image-store.s3.amazonaws.com/0/105279/6fdb5a2e-6963-46a0-5d7e-70b8c1b6bf9d.png)
Elasticsearchにデータを入れておくと、Kibana上で様々な条件でのデータの抽出が簡単に行えるため、データの分析がしやすくなる。例えば、上図はメールアドレスをtypoしていてそもそも届かないデータを抽出したもので、こういったそもそもメールが届かないデータが存在していることを知ることができる。
ElasticsearchのデータをKibanaで分析することで、新たな仮説を立て、さらなるサービス改善につなげることができる。

## まとめ
システムの各所でログを出力させてても、それを適切に活用できていないことが多いのではないでしょうか。せっかくログを出してても、障害時の原因調査にしか使ってない。それではログがかわいそうです。
情報は活かしてなんぼ。活かすためには可視化！
Elastic Stackを使えば、お手軽に可視化できます！

## エピローグ

Elastic Stackを使ってメールの送信状況を可視化することで、楽に問題の調査をすることができた。
後日... 「今度は問題あったとき通知されるようにできないかな？」
有償版のKibanaでは、機械学習と検知機能で異変を自動的に察知してくれる機能があるらしい。それを利用すれば、常にダッシュボードを確認していなくても異変を知らせてくれるようになる。
しかし、それはまた別のお話。
Reactで任意のフィールドにsetStateできる関数

# 最初に

ReactでsetStateする時、下記のようなコードを書くと思います。

``` javaScript
  this.setState({
    apple: newState
  });
```
この`apple`の部分を任意の変数(あるいは関数の引数)にしたい時のコードが便利なので、備忘録として書き残しておきます。
コード量が増えた時に汎用性のあるsetterを作りたい、条件文でsetStateの対象が変わるとき、などで便利。


# 書き方

マッピングを行ってsetStateします。
`targetField`がsetState対象のフィールドで、`newState`が新しいステートです。

``` javaScript
function commonSetState(targetField, newState){
  var setter = {};
  setter[target_name] = newState;

  this.setState(setter);
}
```

ここで`targetField`にappleを指定すれば先ほどのコードと同じことができます。
最新のReact(16.0)の仕様では、`constructor`で対象のフィールドが定義されてなくても動作します。
自動的に対象のフィールドを定義してsetStateしてくれるようです。

stateが入れ子になっている場合も同様にできます。

``` javaScript
//直接関係しない部分は省略
    constructor() {
       fruits: {
          apple: null
       }
    }

...

function sample(){
   commonSetState("fruits", "apple", "りんご");
}

...

function commonSetState(parentField, targetField, newState){
  var setter = {};
  setter[parentField][target_name] = newState;

  this.setState(setter);
}
```

jsonデータと扱いがそっくりですね。


## 最後に
この関数、便利ですがReactでステートの持たせすぎには注意してください。
「任意のフィールドにsetStateできる」ものの、無暗に存在しないフィールドにsetStateすると後でメンテしづらくなります。
（思わぬところにフィールドが生成されたり、動作が重くなったり、そもそも「どこに何のフィールドあったっけ？」など）
gitignore_globalを作成とその際に出たエラー

#gitignore_globalとは？
OS Xで作業しているとDS_Storeという隠しファイルが生成されてしまいます。GitHubでファイル管理をするときにこのファイルは邪魔なのですが、全部のリポジトリのgitignoreファイルにDS_Storeを追記するのはあまりスマートではありません。また、プロジェクト管理下のgitignoreにローカルの環境を書き込むのもあまりよくないと思います。

そこで、自分のローカル上の環境のみに依存するファイルはgitignore_globalに記述しましょう。

#設定方法
ホームディレクトリにファイルを作成

```
$　touch ~/.gitignore_global
```
$　gitignore_globalを有効化します
```

設定内容を記述

```
$　vi　gitigonore_global
.DS_Store　//無視させたいファイルなどを記述
```
viは``:wq``で保存して抜けましょう。

#エラーについて
基本は上記の設定が終われば完了なのですが、たまにこのようなエラーが出ます。

```
$　git add -A
fatal: cannot use /Users/~/.gitignore_global as an exclude file
```

このエラーが出る原因としては.gitignore_globalの中身が空であったりした際に出ることがあります。

もしくは、.gitignore_globalをファイルで作ったはずなのに、ディレクトリになっていることがあります。*空の場合は中身を作成しましょう

```
$ echo ".DS_Store" >> ~/.gitignore_global
Is a directory //このように表示されたらファイルではないです

*この場合は削除して作成し直しましょう
$ rm -rf ~/.gitignore_global
$ vi ~/.gitignore_global
```
#そのほかの確認方法
```
$ git config --global --list
core.excludesfile=/Users/~/.gitignore_global　//このように表示されると接続は出来ています

$ git config --global --unset core.excludesfile　//接続を一度切りたい場合はこのように
```

以上です。
メモ書きのようなものだと思って頂ければ、
もし同じようなエラーの方が解決されれば幸いです。
AWS Resource Access ManagerでShared VPCを試す

##目的
Re:Invent2018の期間中にResource Access ManagerでVPC(Subnet毎)が異なるAWSアカウント間で共有出来るによなったので試してみます。
今までは、フォワードプロキシなどアウトバウンド通信制御やZabbilxなど監視ソフトウェアが起動する管理用VPCを作る場合は、AWSアカウントごとに同じ構成を取る必要がありましたが、Shared VPCが出来るようになっため、1つの管理用VPCを複数アカウントで使い回すことができます。

今回は以下のような通信を確認したいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/71249f8f-eca5-540e-0595-19a2e11dbde6.png)

##前提
シェア元)
デフォルトVPCは共有できない
セキュリティグループは共有できない

シェア先)
起動できるサービスに制限がある(EC2,RDS,Lambdaなどが使用できる)
シェアされたVPCでサブネットの作成はできない
ルートテーブル、NACLはシェア元のものを使用する(編集できない)

元※編集ボタンがない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/7857e416-5f5b-73d3-15ac-f9660ae5ddf9.png)
先
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/5abe3728-facc-5578-385f-089ace771b03.png)

共通)
お互いのアカウント間でセキュリティグループをソースとしたインバウンド設定は可能

###シェア先
Organizationsの組織内
or
Organizationsの組織外

###アカウントA(シェア元) ※Organizationsのマスターアカウント
Public Subnet/Private Subnetを作成する
NAT GatewayをPublic Subnetで起動する
Resource Access Manager(RAM)でVPC(Private Subnet)を共有する

###アカウントB(シェア先)
共有されたSubnetでEC2を起動する
アカウントAのNAT Gateway経由でインターネットアクセスができることを確認する

##試す
###重要
RAMの管理コンソールのSettingsで「Enable sharing within your AWS Organization」を有効にする
一度有効にすると全リージョンで有効になる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/72837842-8787-9735-d6cf-f76212c35118.png)

上記を設定せずに、リソースを共有すると以下のようなエラーがでてリソースの共有ができない。

```
Resource share creation has failed.
```

Orgazationsのマスターアカウントでないと設定できない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/0f4bedfa-2a5a-2d42-bf5d-2fd041e96c40.png)

###共有リソースを作成する(アカウントA：シェア元)
Create resource share
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b61f2cf6-ebdf-f50a-86f4-6ef7e84ac265.png)

Share名を入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/da067a32-7f0f-c67f-8a2a-8d9bfa49a7ed.png)

Subnetを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/772a5c2c-ccd3-e453-50a9-1f7fcd058237.png)

Private Subnetを共有
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a12c0c49-60c4-a4f9-49b4-e1b26008dc21.png)

共有先のAWSアカウントIDを入力してCreate resource shareをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/3faf9f44-f4e6-e99d-46c3-e6d18c5a71f5.png)

数分待つと使えるようになる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/840d2ac5-46ed-3e7a-4e79-207c4af3a5d6.png)


###疎通確認(アカウントB：シェア先)
VPCの画面でOwnerがシェア元のAWSアカウントとなっているVPCを確認する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/209cc25e-6678-6186-b2b0-d5322e1a64e1.png)

EC2インスタンスを起動する
シェアされたVPCのPrivate Subnetを指定してEC2インスタンスを起動する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6c31c607-91a3-cba3-b27f-5cb7bceb44de.png)


疎通確認

```
8c8590130da5:~ $ aws ssm start-session --target  i-06d67857985475388


Starting session with SessionId: ssm-user-084c81a8f97caae8d

sh-4.2$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=113 time=1.59 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=113 time=1.21 ms
```

##約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
➁アプリ作成の記録　事前準備　新規ディレクトリ作成〜guthubに保存するまで　”ベースキャンプを作る”

***開発する！ってなったけど、あれ?なにからやんだっけ...ってなりましたが笑***


#プロジェクトの新規作成

>パソコン画面左上から選択できる[ファイル]から

![スクリーンショット 2018-12-04 16.46.16.png](https://qiita-image-store.s3.amazonaws.com/0/284608/4d62dd5b-a72a-8719-cda7-7ae66c558d1c.png)

![スクリーンショット 2018-12-04 16.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/284608/d9e916b4-37ff-83b3-e2a4-d4440f30fced.png)

ターミナルでcd tsk_app。ここで`rails new`を実行します。
↓
`rails new tsk_app`           
>rails new実行時に今回作成するアプリの名前を入れるのを忘れ、つまずきました笑
 　 ×rails new 
　○rails new 〇〇

エディタで開いてみると・・・
![スクリーンショット 2018-12-04 14.45.55.png](https://qiita-image-store.s3.amazonaws.com/0/284608/1024ad1b-7962-444a-b8d0-f25dfad51c2d.png)
tsk_appディレクトリの中にファイルがたくさんできていますね！雛形ができましたので、これを一旦保存しておきます！




#gitの準備
次はGitの準備です。

Githubにリモートリポジトリを用意しておきます。
リポジトリの名前を決めて、新規作成します。

![スクリーンショット 2018-12-04 14.57.49.png](https://qiita-image-store.s3.amazonaws.com/0/284608/fd150932-1b03-6758-b8c0-393904b08a8e.png)

tsk_appが今回のレポジトリの名前です。

>ここでやったのはローカルの情報をリモート環境（github）に流し込む器を作流ということです。

`git init`
↓
Initialized empty Git repository in /Users/masaki/tsk_app/.git/と出たので
晴れてディレクトリをgitレポジトリにできました。
↓
~~git add.~~
``git add .``
>できなかったので　git.add -Aでやりましたが、　これは　正しくはgit add .でしたね。
「スペースはaddに`.`を渡す」という意味でスペースはコマンドの区切り文字なので非常に重要な意味を持ちます。

↓
~~git commit -m ‘first commit’~~

``git commit -m “first commit” ``
>これも前述のシングルクォーターだとエラーが出てしまいましたのでシングルからダブルクォーテーションに修正しました。質問してみるとシェルの問題とのことで、どのようなターミナルをどのような構成で使ってるかによって挙動は千差万別なので、MacBookでも設定次第で起き得るとのことでした。

**ローカルでは保存できたのでgithubにpushします**

``git remote add origin git@github.com:Masaki-Maejima/tsk_app.git``
  (宛先を指定します。宛先はgithubに準備した器です。）
↓
`git push origin -u master`

![スクリーンショット 2018-12-04 17.27.07.png](https://qiita-image-store.s3.amazonaws.com/0/284608/2a39177f-e388-f26d-367c-3c272f2cc2ce.png)


無事リモート環境にアップされたようです！

新しく作成するアプリケーションの雛形がローカルとリモート環境に保存できました！
ベースキャンプができたのでアプリに必要な機能をこれから作成していきます！
GASでGoogleドキュメント自動作成＆メールで通知するbotを作った

# 背景
私の研究室では、毎週ミーティングがあり各々が１つのGoogleドキュメントに進捗報告を書いていきます。
毎週新たにドキュメントを作成＆共有URLを取得し、それをメールで流す作業があるのですが、
毎回忘れてしまい、そして面倒なので自動化しました。

# 前提
- Google Driveで共有フォルダを作成している
- 共有フォルダにテンプレートのドキュメントを作ってある

以上を前提に進めます。

# 目標
以下の手順で行っている作業を自動化します。

1. 日付をタイトルにしたドキュメントを作成
1. URLを取得
1. メール送信

# 手順
## 初期準備
- Google拡張機能で[GoogleAppsScript](https://chrome.google.com/webstore/detail/google-apps-script/eoieeedlomnegifmaghhjnghhmcldobl?hl=ja)を追加  
- 共有フォルダIDを取得  
共有フォルダのURLの一番後ろの塊です。  
`https://drive.google.com/drive/u/0/folders/<ここ>`
    - コードの`targetFolderId`になります
- テンプレートドキュメントのIDを取得  
URLの後ろの部分です。  
`https://docs.google.com/document/d/<ここ>/edit`
    - コードの`fileId`になります

## スクリプト作成
- GoogleDriveの`新規`→`その他`→`Google Apps Script`から新規スクリプトを作成
- コードを書く(JavaScript)
- エディター上から実行できます
    - 左上側の`関数を選択`で実行する関数を選択してからその2つ左の実行▲ボタン

## コード
```js

// 共有フォルダのID
var targetFolderId = '<共有フォルダのID>'

/**
* copy docs
*/
function createCopy() {

  //コピー元となるドキュメントファイルのIDを取得
  var fileId = '<テンプレートドキュメントのID>'

  //ファイル名の日付部分作成
  var date = new Date();
  date.setDate(date.getDate() + 1); // 火曜に作成して日付は水曜にするので１日ずらす
  var formattedDate = Utilities.formatDate(date, "JST", "yyyy/MM/dd");

  //コピー元のファイルを開く
  var file = DriveApp.getFileById(fileId);
  
  //コピーを作成。作成したコピーを参照。
  var newFile = file.makeCopy(formattedDate);
  return newFile;
}

/**
* send a mail to member
* こっちを実行する。本番はsendEmailの引数がtoになっていることを確認。
*/
function sendMail() {
  
  // 複数宛先
  var to = ['hogehoge@gmail.com',
            'fugafuga@gmail.com'];
  // 件名
  var subject = '件名'
  // 本文
  var body = '本文'
  
  // 新規作成ファイルのID
  var newFileId = createCopy().getId(); //ここでコピーが生成されるのでsenMail関数のみ実行すればよい
  // docsのリンク
  var link = 'https://docs.google.com/document/d/'+newFileId
  
  //メール本文の最後に作成されたドキュメントのURLを足してメール送信
  MailApp.sendEmail(to, subject, body+link);  
  
}
```

## 実行スケジュール設定
- `編集`→`現在のプロジェクトのトリガー`へ行き、`トリガーを追加`する
- 実行したい関数と実行スケジュールを選択  
今回は毎週火曜の午前中に実行したいので、
    - イベントのソースを選択：`時間主導型`
    - 時間ベースのトリガーのタイプを選択:`週ベースタイマー`
    - 曜日を選択:`毎週火曜日`
    - 時刻を選択:`午前10時～11時`

# 参考にしたサイト
- <https://qiita.com/m-shimao/items/8f8d9200b77b8cf754c9>
- <https://qiita.com/takeyoshi-k/items/3c914dfdd509ecc20a7c>
[質問]自動露出とオートフォーカスの切り方が分かりません。

[質問]
現在大学でAndroid Studioのcamera2APIを用いて可視光(Li-Fi)の研究をしています。
ですがLEDを撮影しデータを取得する際にどうしても自動露出とオートフォーカスが邪魔になってしまいます。
・自動露出
・オートフォーカス
上記二つの切り方を教えてください。
[仕様]
Android Studio3.1
[スマートフォン]
SHARP AQUOS API23
HUAWEI P10 API24
LaradockのMySQLに接続できなくてはまった話

# 概要
LaradockでLaravelの環境を作ったがMySQLに接続できなくてだいぶはまったので対処法をまとめた。

# 初期設定
まずは公式ドキュメントを参考に。
[Getting Started](https://laradock.io/getting-started/)

プロジェクトディレクトリで下記コマンドを叩く。

```bash
$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env
$ docker-compose up -d nginx mysql phpmyadmin redis workspace 
```
`laradock/.env`を修正

```laradock/.env
# Laravelプロジェクトパスに変更
APP_CODE_PATH_HOST=../myapp/

# 下記を追加
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
```

### port変更
Apacheとバッティングしそうなのでportを変更した。

``` laradock/.env
NGINX_HOST_HTTP_PORT=8888
```

# Laravelインストール
コンテナに入る。

```
$ docker-compose exec workspace bash
```

入ったらLaravelをインストールする。

```
root@e8802b8f256b:/var/www# composer create-project laravel/laravel myapp
```

インストールが完了したら`localhost:8888`にアクセスするとLaravelの画面が表示される。

# DB接続

`php artisan migrate`

```
[PDOException]
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

[ErrorException]
PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]
```

エラーが返ってきて死ぬほどはまった。

MySQL 8.0から仕様が変わったとのこと。
[MySQL 8.0.4におけるデフォルト認証形式の変更](https://yoku0825.blogspot.com/2018/01/mysql-804.html)
[【Docker】MySQL8.0系を使う時に発生する問題について](http://blog.websandbag.com/entry/2018/05/17/121730)


`8.0`である必要がなかったので、`5.7`にして再ビルドした。

## やったこと
イメージ、データ削除

```
$ docker rmi laradock_mysql
$ docker rm volume laradock_mysql
$ rm -rf ~/.lardock/data/mysql
```

バージョンを`5.7`に変更

```laradock/.env
MYSQL_VERSION=5.7
```

再ビルド

```
$ docker-compose build --no-cache mysql
```

MySQLバージョン確認

```bash
$ docker-compose exec mysql bash
root@8a9792617ae7:/# mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using  EditLine wrapper
```

MySQLにログイン

```
$ docker-compose exec mysql bash
root@8a9792617ae7:/# mysql -udefault -psecret
mysql> 
```

`php artisan migrate`が実行できるか確認

```
$ docker exec -it laradock_workspace_1 /bin/bash
root@09a020d7430e:/var/www# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```

これ見て解決した。
[SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client #1392](https://github.com/laradock/laradock/issues/1392)

## これ以外にやったこと
`myapp/.env`を`laradock/.env`に合わせるよう修正

```laradock/.env
MYSQL_VERSION=5.7
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

```myapp/.env
DB_CONNECTION=mysql
DB_HOST=mysqlあるいは192.168.0.1
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

`Request::ip()`で出てきたIPに合わせるといける。

```blade
@php
echo Request::ip()."<br>";
$remote_addr = $_SERVER['REMOTE_ADDR']."<br>";
$server_addr = $_SERVER['SERVER_ADDR']."<br>";
echo $remote_addr;
echo $server_addr;
@endphp
```

[[php] Laravel 5.1でクライアントのIPアドレスを取得する方法は？](https://code.i-harness.com/ja/q/1fba3cb)
ABEJA Platform向けのモデル開発を促進するためのローカル推論・学習機能


[ABEJA Platform Advent Calendar](https://qiita.com/advent-calendar/2018/abejaplatform) 2018の6日目です。

# 概要

学習コードの開発は機械学習を使って独自サービスを作る上で必須になってくると思います。本記事は、ABEJA Platformのための学習コードを効率よく開発するためのtipsについて解説します。学習コードをローカル環境で動かすための、ローカル推論と学習機能について簡単に紹介します。

# ABEJA Platformにおける開発

ABEJA Platformは一言で言えば、コードをアップロードすると、クラウド上で学習や推論を行なってくれるプラットフォームです。コードには、プラットフォーム特有の作法が幾つかあるため、直接はローカルのPCでは動きません。例えば、推論コードは以下のようなルールになりますし、学習も同様です。

![Kobito.G7FsoI.png](https://qiita-image-store.s3.amazonaws.com/0/146529/1bb1e710-af69-fd0e-82d8-0adb6ad329e3.png "Kobito.G7FsoI.png")

この場合、どうやって開発をすれば良いでしょう。

直接コードをアップロードして動作を確認しようとするのでは、後ろのクラウド側のリソースの確保やログの出力に多少の時間がかかってしまいます。数分待ってインデントエラーで終了とか、残念すぎますよね。モジュール単位でならテストコードである程度は確認できるものの、学習全体パスについては実際に動かしてみないと分かりません。

# ローカル学習機能と推論機能

ABEJA Platformは、ローカル推論および学習機能というものを備えています。これらは、プラットフォームにコードをアップロードせずとも、手元の環境で動作させることのできる機能です。手元のリソースで実行できるため、通常のコードと同様に立ち上げることができ、素早く動作を確認できます。これにより、素早くバグのチェックを行うことができます。バグが取れたら、最後にプラットフォームで実行することで、効率良い開発が可能となります。

# ABEJA CLIのインストール

はじめに、ABEJA Platformをコンソールから叩くためのツールであるABEJA CLIをインストールします。プラットフォームを叩くだけであれば、pythonが入っていれば良いです。ただし、今回のローカル推論・学習機能を使うためにはDockerもインストールされている必要がありますので、予め環境に応じてインストールしておいてください。

## CLIのインストール

ABEJA CLIは以下のようにしてインストールします。

```
$ curl -s https://packagecloud.io/install/repositories/abeja/platform-public/script.python.sh | bash
$ pip install abejacli
```

## 初期設定

CLIのインストールが完了したら、まずはクレデンシャルを設定します。`abeja configure`コマンドを叩くことで、クレデンシャルを設定できますので、自身のユーザー名・アクセストークンを入力してください。

```
$ abeja configure
abeja-platform-user  : {User-ID}
personal-access-token: {Token}
organization-name    : {Organization-ID or Organization-Name}
```

- 注意点
    - user名には`user-`は入れないこと
        - ○ `1234567890123`
        - × `user-1234567890123`


# ローカル推論機能の使い方

ローカル推論機能は以下の様に使います。

```
$ abeja model run-local \
    -h main:handler \
    -i abeja/all-cpu:18.10 \
    --input image.jpg
```

`-h`でエントリポイントを指定します。`-i`は推論のベースイメージです。ABEJA PlatformのコードはDockerの技術を使っており、上記ベースイメージから作成したコンテナに、アップロードしたコードを載せて実行されます。`--input`が入力データとなります。

# ローカル学習機能の使い方

ローカル学習は以下のように使います。

```
$ abeja training train-local -h train:handler \
    -i abeja/all-cpu:18.10 \
    -o XXXXXXXXXX \
    -d train:XXXXXXX
```

`-h`でエントリポイントを指定します。`-i`は学習のベースイメージです。`-o`はオーガニゼーション、`-d`は学習データの指定となります。上記であれば、IDがXXXXXXというDataSet（アノテーション済みデータ）にtrainという名前をつけることを意味します。上記を実行すると手元の環境で学習が走ります。詳細な使い方は公式ドキュメントを参照してください。なお、一度上記を実行した後に`-d`パラメータを変更したい場合は、`--no_cache`オプションをつけて、再作成する必要があるので注意してください。

# 終わりに

高速な開発はPoCを進めるために重要となります。本記事ではABEJA Platform上での開発を促進するための機能であるローカル推論・学習機能の使い方について述べました。ガシガシ使っていただければ幸いです。
Excel Office 365 (Excel 2016) > グラフ描画が遅い (セル幅変更後に5秒待たされる) > Excel Onlineを使う

```txt:動作環境
Windows 8.1 Pro (64bit)
Excel Office 365 (Excel 2016)
```

### 内容

- Excel Office 365 (Excel 2016)になってからグラフ描画方法が変更された
- グラフ描画の頻度が上がったため、「セル幅」変更などの後に5秒のプチフリが発生する

データとグラフが多いExcelファイルで顕著にパフォーマンスが低下する。


### 関連

- [Excel Office 365 2016 So Slow that I cannot use it](https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-mso_win10-mso_2016/excel-office-365-2016-so-slow-that-i-cannot-use-it/39f06e90-c2c8-43e4-9f10-2a7c65894271)
    - May 16, 2018の段階でも対処法は見つからず
    - **<font color=red>投稿にロックがかかっているため、解決方法が見つかっても追記はされない</font>**

### 対処 (Office 365利用者のみ)

下記に気づいた

- Excel Online上で作業する

***<font color=red>幸いのところ</font>***、Excel Onlineのグラフ描画はExcel 2016と同じようにはなっていない。

グラフ描画更新頻度は高くなく、Excel 2013以前と同じように快適に作業できます。

OneDrive経由でExcel Onlineにファイルを持っていき、そこで作業をすると、**Officeソフトウェアの不具合による作業効率低下**は回避できます。
(Excel Online自体の不具合には注意）

Excel 2016のみのユーザさんは残念ながら対処法は分かりません。
DOBOT User Conference 2018

# 開催概要
- イベント名 ：DOBOT User Conference 2018
- 日時 　 　　:2018年12月6日（木）9:30~17:30（予定）
- 会場　　　 ：秋葉原UDXカンファレンス(6F) 
- 参加定員　 ：150名
- 参加費　 　：無料（事前参加登録要）
- 主催　　　 ： TechShare株式会社、DOBOT社
- 協力会社　 ：株式会社MOS、株式会社MTMシステムズ、株式会社カンブリアンプロジェクト、シュマルツ株式会社
- [告知WEB SITE](https://www.physical-computing.jp/page/51)

#講演タイトル
- ロボットアームを活用した教育用教材としてのDobot Magician
 - 大阪府立大学工業高等専門学校     　教授 土井 智晴

#講演関係サイト
- [計測自動制御学会 SI講演会2017 in 仙台](http://www.si-sice.org/si2017/exhibition_all.html)
- [TechShare WEB site](https://techshare.co.jp)
- [DOBOT Magicianの初期設定](https://qiita.com/tmdoi/items/8fcbcf392751314738a5)
- [DOBOT Download Center](https://www.dobot.cc/downloadcenter/dobot-magician.html?sub_cat=149#sub-download)
C++でParseメソッドが欲しくなった話

こんにちはこんばんは。せしまるです。

本日はC++でParseメソッドが欲しくなった話です。

以前C#をやっていた時に先輩に教えてもらったParseとTryParse。

```c#:parse.cs
// string型を変換.
int num = int.Parse("7");
double dnum = double.Parse("123.45");

// 変換できるかチェック.
int result = 0;
// int型に変換できないからNG.
if( int.TryParse("100.5", out result)){
    Console.WriteLine("OK");
}else{
    Console.WriteLine("NG");
}
```

その後C++を初めてから思った。
**Parseが欲しい。**

# 現状
現状C++コード内では型変換やチェックは次のようにやってます。

```c++:sample.cpp
#include <boost/lexical_cast.hpp>

try{
    int result = boost::lexical_cast<int>("100");
}catch(boost::bad_lexical_cast &ex){
    throw;
}
```

atoiとかstoiとかあるけど今はlexical_castを使用している。
~~try～catchまでがながいんじゃ～~~記述が長くなり少しめんどくさい。

じゃあ使いやすいようにしようか。

# 実装

とりあえずintに変換するやつだけ。

※追記 2018/12/05
ご指摘を頂いたので修正させて頂きました。

```c++:cppparser.hpp
namespace parser{
    // string文字列をintに変換.
    // 変換できなかったらfalse.
    static bool Int_TryParse(const std::string &value, int &result){
        try{
            result = std::stoi(value);
            return true;
        }catch(std::invalid_argument &ex){
            return false;
        }
    }
}
```

```c++:main.cpp
#include "cppparser2.hpp"

int main(){
    int result = 0;
    char array[5] = { '1', '2', '3', '4', '5' };
    std::string str = "9999";

    if(parser::Int_TryParse("100", result)){
        printf("SUCCESS : %d", result);
    }else{
        printf("FAILED.");
    }

    if(parser::Int_TryParse(array, result)){
        printf("SUCCESS : %d", result);
    }else{
        printf("FAILED.");
    }

    if(parser::Int_TryParse(str, result)){
        printf("SUCCESS : %d", result);
    }else{
        printf("FAILED.");
    }

    if(parser::Int_TryParse("a", result)){
        printf("SUCCESS : %d", result);
    }else{
        printf("FAILED.");
    }
}
```

実行結果

```
SUCCESS : 100
SUCCESS : 12345
SUCCESS : 9999
FAILED.
```

入力値の範囲チェック前とかに使えるかな？多分。

本日はここまでです。
ありがとうございました。
Leiningen で利用している Plugins

### lein-ancient
ライブラリ、プラグインの最新バージョンをチェックする

### lein-bin
Uberjar で作成する実行ファイルのファイル名を指定する

### lein-cprint
Project の設定を色つきで出力する :: https://github.com/greglook/lein-cprint

### lein-license

ライセンスを変更、アップデートする ::   https://github.com/xsc/lein-license

```shell-session
% lein license update mit
```
三大クラウドのKubernetesの脆弱性(CVE-2018-1002105)対応状況メモ

## はじめに
Kubernetes で Criticalレベルの脆弱性(CVE-2018-1002105)が発表されました
脆弱性自体の概要はSIOSさんのBlogで早速まとめれらていますのでそちらをご確認ください。

**Kubernetesの脆弱性情報(Critical: CVE-2018-1002105)**
https://security.sios.com/vulnerability/kubernetes-security-vulnerability-20181204.html

**CVE-2018-1002105: proxy handling in kube-apiserver can leave vulnerable TCP connections**
https://github.com/kubernetes/kubernetes/issues/71411request

Criticalレベルの脆弱性ですので各社の対応は終わってからの公表になってるのではないかと
思いますが、AWS/Azure/GCPの対応状況をまとめておきます。

## AWS
**Kubernetes Security Issue (CVE-2018-1002105)**
https://aws.amazon.com/jp/security/security-bulletins/AWS-2018-020/

2018年12月4日のPM 2:00 PST(日本時間 12/5 AM 6:00) 以降に開始された新しいクラスターは、
この問題を緩和するパッチが適用されたKubernetesバージョンで開始されている。
2018年12月5日のPM 12:00 PST(日本時間 12/6 AM 5:00)時点で
既存の全てのクラスターでパッチが適用されている。

Amazon EKS Platform Version が eks.3以降であればよい。
eks.3 は Kubernetes Patch Version の 1.10.11 に該当

**Platform Versions**
https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html

## Azure
**AKS clusters patched for Kubernetes vulnerability**
https://azure.microsoft.com/en-us/updates/aks-clusters-patched-for-kubernetes-vulnerability/

> Azure Kubernetes Serviceは、既定のKubernetes構成を無効にして、影響を受けるすべてのクラスタにパッチを適用し、この脆弱性を公開したエントリポイントに対する認証されていないアクセスを削除しました。

バージョン1.11.5にアプデートすることで根本的な修正を適用できるとのこと

```
az aks upgrade -n mycluster -g myresourcegroup -k 1.11.5
```

## GCP
**Kubernetes Engine - Security Bulletins**
https://cloud.google.com/kubernetes-engine/docs/security-bulletins

> What should I do?
> No action is required. GKE masters have already been upgraded.

このパッチは、GKE 1.9.7-gke.11, 1.10.6-gke.11, 1.10.7-gke.11,1.10.9-gke.5 
および1.11.2-gke.18以降のリリースで利用できます。