OmniAICreator/Qiita-1.07M huggingface dataset:
protocol buffers ENUM型 完全ガイド

## protobufのEnum型について

https://developers.google.com/protocol-buffers/docs/proto3#enum

protocol buffersで定義できる型の一つに、enumがある。

"Enum"という要素の実装は、プログラミング言語ごとに違うだろう。高機能な型チェックができる場合もあれば、そもそも言語に概念自体がないこともある。protocプラグインで吐き出される実装がどうなるかはちゃんと確認したほうがいい。

その上でprotocol buffers上はどういうモノを"Enum"と呼んでいるのかまとめる。構文はこんな感じ。

```protobuf
syntax = "proto3";
package myapp;

enum Season {
  SEASON_UNKNOWN = 0;
  SPRING = 1;
  SUMMER = 2;
  AUTUMN = 3;
  WINTER = 4;
}
```

* 列挙した値のいずれかであることを要求する型である
* 実体はint32の範囲の数字のどれかを選ぶ
    * 負値でもOK
    * 文字列をenumにすることはできない。実体は必ず数字。
* **必ず、最初にデフォルト値の `0` を定義する必要がある**
    * 0が不要だから定義しない、というのは許されない
    * 0は別にunknown(不明値)という意味にしなくても良い
        * が、考えるのが面倒でよくunknown扱いにしがちである
    * 参考: gRPCステータスコードの`0`は`OK`として使われている。エラーコードのようなものだと0を成功=エラーなしの意味にするとわかりやすい
* 対応するJSONの表現では `"SPRING"` と `1` のどちらでも認識する
    * ちゃんと文字列部分もコードとして吐き出されている

## enumの制約

enumのラベルは、その空間で一意にしなくてはならない。以下はコンパイルエラーである。

```proto
syntax = "proto3";
package myapp;

enum Season {
  UNKNOWN = 0;
  //...
}

enum Weekday {
  UNKNOWN = 0; // protocがコンパイルエラーを起こす
  //...
}
```

仕方がないので、適当にprefixをつけてごまかすことになる。

```proto
syntax = "proto3";
package myapp;

enum Season {
  SEASON_UNKNOWN = 0;
  //...
}

enum Weekday {
  WEEKDAY_UNKNOWN = 0;
  //...
}
```

名前の宣言場所が違うなら、別に同じラベルを使っても構わない。

* パッケージ
* messageの中に入れ子で宣言されている

```proto
syntax = "proto3";
package myapp;

enum Season {
  UNKNOWN = 0;
  //...
}

message Calendar {
  enum Weekday {
    UNKNOWN = 0; //入れ子になっているので、これならコンパイルが通る
    //...
  }
  // ...
}
```

prefixを常に付けていると、enumのラベルがどんどん長くなってしまう。適当にパッケージやメッセージを分割し、短い命名ができるように工夫すると良い。

## Goの場合の出力

https://developers.google.com/protocol-buffers/docs/reference/go-generated#enum
Goの場合の出力を見てみる。
冒頭の例で書いた`Season`というenumだとこんな感じになる。

```go
type Season int32

const (
  Season_SEASON_UNKNOWN Season = 0
  Season_SPRING         Season = 1
  Season_SUMMER         Season = 2
  Season_AUTUMN         Season = 3
  Season_WINTER         Season = 4
)

//...

func (x Season) String() string {
  return proto.EnumName(Season_name, int32(x))
}
```

Goにenumという型はないが、enum相当のことをやりたいときによく使われるイディオムを踏襲している。
String()メソッドによって、[fmt.Stringer](https://golang.org/pkg/fmt/#Stringer)インターフェースが実装されていることになる。`fmt.Println()`などを使って出力すると数字ではなく`SPRING`などの文字列が出力される。(定数名は`Season_SPRING`だが、表示される文字列は`SPRING`である)

パッケージトップレベルのenumの場合、こんな風に`型名_ラベル`という名前の定数が定義されていく。なお、messageの中に入れ子にenumを定義した場合、`親message名_ラベル` という名前で定数が定義されていく。

## その他のオプション

### deprecated

「廃止予定」を表すマーク。enumに限らずあらゆるところで書けるオプションだが、enumの中でも書ける。

```proto
enum Season {
  option deprecated = false; // enum型自体のdeprecatedを表す
  SEASON_UNKNOWN = 0;
  SPRING = 1;
  SUMMER = 2 [deprecated = false]; //要素単体のdeprecatedを表す
  AUTUMN = 3;
  WINTER = 4;
}
```

### allow_alias

同じ数字に対して複数のラベルをつけることができるようにする。

```proto
enum Season {
  option allow_alias = true;
  SEASON_UNKNOWN = 0;
  SPRING = 1;
  SUMMER = 2;
  AUTUMN = 3;
  FALL = 3; // 3は既に使われてるけど、オプションによってエラーにならない
  WINTER = 4;
}
```

### reserved

数字とラベルを予約することができる。過去に別の意味で使ったことのある値を、念のため欠番にしておくために使える。
数字とラベルは1つの文でreservedにすることはできない。別々に書く必要がある。

```proto
enum Foo {
  reserved 2, 15, 9 to 11, 40 to max;
  reserved "FOO", "BAR";
}
```
仕事職業は自分で作るもの。UI UX にケチをつけるコンサルタントとかどうですかね？ SEO サービス設計 ユーザー動線 も。

# エンジニアの経験を活かして出来るサービス設計

- ただひたすら愚痴を言うだけで仕事になる楽園のような仕事はないだろうか
- だけどコンサルティングとかアドバイザーとか、つまりはそういうことなんじゃないの？
- 極めてストレスを感じやすい UI UX に不満爆発しやすい体質を活かせる場所はないか

# 出前館のユーザー動線について勝手に記事にしていた。

- 2018/12/31 年末
- もちろん会社とは関係なくプライベートですよ！と言わなければいけない状況だとすれば😢悲しい
- 当方の一切の個人的意見は企業を代表するものではなくetc etc..

https://github.com/YumaInaura/YumaInaura/issues/96

# 法律的に問題ないの？

- 怒られたら全裸で謝罪‥民事訴訟恐いよ‥。
- と言っても最大でも親告罪である著作権法ぐらいにしか違反していないだろうし、ユーザーがサービスについてスクリーンショットを撮って語ることまで禁じるのは著作権法の精神に反すると思われるので、モラル的には問題ない気が勝手にしているけど民事訴訟恐いよ…。
- サービスについて公開で語るとやれ営業妨害だと語り始めるひと、たまにいるけどあれって何？Web黎明期には何度か遭遇したような…。

# 出前館の問い合わせ口を探してみたい

- だけど通常の問い合わせ口じゃ届かない気もする
- サービス設計をしてるひとに届かないものだろうか
- Twitterとか良いのかも知れない、情報感度の高いキリっとしたユーザーとの触れ合いの場所

# Twitter あったよ！

https://twitter.com/demaecan

猫可愛さ

![image](https://user-images.githubusercontent.com/13635059/50555660-b0e6d100-0d12-11e9-9e19-e007d63faf9d.png)

# 現場からは以上です

- 僕には現職がありますし‥やったとしても完全無料の遊びだよね‥！ 
- 単に妄想して遊んでいるだけなんで気にしないでくださいね😁
- こんなの仕事になる？あんなの仕事になる？と妄想に取り憑かれているときが一番幸福だよね？え、そうじゃない？

---

https://github.com/YumaInaura/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues/97








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Latent Dirichlet Allocation メモ

# Latent Dirichlet Allocation(LDA)
参考：https://medium.com/@lettier/how-does-lda-work-ill-explain-using-emoji-108abf40fa7d

内容が間違っている箇所がございましたら，ご指摘いただけると大変嬉しいです．

##概要
LDAは，要素（単語など）から作られた複合物（文書など）の集まりの生成過程を確率的にモデル化した手法である．今回は文書に着目する．

##Dirichletの由来
LDAでは，トピックから単語が生成される確率分布と文書からトピックが生成される確率分布をディリクレ分布（多項分布内のそれぞれの確率をサンプリングできる事前分布）よりサンプリングするため，Latent **Dirichlet** Allocationと呼ばれる：
①あるトピックからある単語が生成される確率分布をディリクレ分布よりサンプリングする（後の$\alpha$が関係）
②ある文書からあるトピックが生成される確率分布をディリクレ分布よりサンプリングする（後の$\beta$が関係）

##LDAの生成過程
LDAでは以下の生成過程を仮定している

１．使用する単語を選ぶ

２．文書数を決める

３．文書ごとに何個単語を使用するか決める（ポアソン分布より決定する）

４．トピック数を決める（人が決定するハイパーパラメータ）

５．$\alpha$と$\beta$を決める（0でない正の値：人が決定）


６．トピックを選び，$\beta$を用いたディリクレ分布より単語分布をサンプリングする．

７．文書を選び，$\alpha$を用いたディリクレ分布よりトピック分布をサンプリングする．

８．実際に文書を生成する
　　１．文書のトピック分布からトピックをサンプリングする
　　２．トピックの単語分布から単語をサンプリングする
　　３．最初に決定した単語数になるまで繰り返す

###ハイパーパラメータについて
・$\alpha$は各文書のトピック分布を決めるためのディリクレ分布のハイパーパラメータであり，値を大きくするほどトピック分布は一様になりやすい．
そのため，各文書からいろんなトピックが生成されると仮定することと一緒である．

・$\beta$は各トピックの単語分布を決めるためのディリクレ分布のハイパーパラメータであり，値を大きくするほど単語分布は一様になりやすい．
そのため，各トピックからいろんな単語が生成されると仮定することと一緒である．

##LDAのパラメータ推定について
LDAではトピック分布を表す$\theta$と単語分布を表す$\phi$を推定することが目標である．

直接$\theta$と$\phi$を推定するのではなく，まずギブスサンプリングを用いて単語に対するトピックの付与を推定する．その後$\theta$と$\phi$を推定する．

**初期値設定**
１．各単語にランダムにトピックを付与する．（同じ単語でも別のトピックが付与されることもある）

**ギブスサンプリング**
２．ある単語（例：「夏」）を対象文書から選び，対象文書や他文書に含まれている「夏」を元に，「夏」が各トピックに所属する確率を以下の式より求める．
$トピックtに所属する確率=\frac{トピックtが付与されている「夏」の個数+\beta}{トピックtが付与されている全単語数+ユニーク単語数\ast\beta}\ast\frac{対象文書内でトピックtが付与されている単語数+\alpha}{対象文書内でトピックが付与されている単語数+トピック総数\ast\alpha}$
※この時，対象としている単語は個数に入れない！

ある単語に対し，全トピック分この確率を算出し，それらの確率からサイコロを振る要領でその単語にトピックを与える．

３．２を全単語で行うと１イテレーションになり，イテレーションを何回か繰り返すと単語のトピックが安定してくる．

**$\theta$と$\phi$の推定**
４．各文書$m$の$\theta$の推定は以下の式で行う．
$文書mの\theta_t=\frac{文書mの単語のうち，トピックtに所属する単語数+\alpha}{文書mの単語数+トピック数\ast\alpha}$

５．各トピック$t$の$\phi$の推定は以下の式で行う．($n$は各単語に与えられる番号)
$トピックtの\phi_n=\frac{トピックtが付与された単語nの個数+\beta}{全体での単語nの出現回数+ユニーク単語数\ast\beta}$

##まとめ
Latent Dirichlet Allocationのアルゴリズムを中心に書いた．
ギブスサンプリングによってなぜ確率分布が収束するかは今後調べる必要がある．
Actions on Googleでシミュレーターを行うとThere was an error completing your request

# 現象
ChromeでActions on GoogleのSimulatorでテストをしようと思って、下記のTestを押下すると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245399/db4e57fd-e0de-5233-f7cc-c3a02acc89ab.png)

「There was an error completing your request」と言われてしまいました。
Try Ageinを押下しても同じページが表示されてしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245399/bc41562f-b0ea-a5c3-3fb6-a42f7b2b5cdb.png)

# 解決法
ChromeでログインしていたGoogleアカウントとDialogflowでログインしていたGoogleアカウントが異なっていたため、テストが出来なくなっていたようです。
また、Actions on GoogleのテストとDialogflowのGoogleアカウントは同じである必要があります。

__参考__
https://productforums.google.com/forum/#!msg/dialogflow/nzl7XCKcLHU/2XFLmyYeBAAJ

# 因みに
上記の現象が起こる前に「Could not find draft details for 'en' locale」と出ていましたが、[こちらの記事](https://qiita.com/tutti225/items/11b0958eee93fde87f58)の通り、アプリの言語設定を見直したら解決しました。
Vue.js/Nuxt.jsで使える！便利なUIパッケージ紹介

Vue.js/Nuxt.jsで開発しているときに便利でアイディアの広がるUIコンポーネントを紹介したいと思います。

良さそうなのを見つけたら随時更新していこうと思います！

## vue-carousel
<img width="1293" alt="スクリーンショット 2018-12-31 14.52.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/210f1f3c-ba01-e574-b5fa-d176ddee167b.png">

簡単にカルーセルを実装できるUIコンポーネント。レスポンシブ対応もされています！

https://ssense.github.io/vue-carousel/

## vue-swipe
スワイプ動作の実装を簡単にできるUIコンポーネント

https://github.com/ElemeFE/vue-swipe

## vue-snotify
![snotify.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/88f49a85-8614-1b9f-ac2d-18d909239990.gif)

幅広くカスタマイズできる通知のUIコンポーネント

https://github.com/artemsky/vue-snotify

## vue-twitter-counter
![counter-example.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/e2e76577-c228-97c7-95db-ac7453911eb6.gif)

Twitter風のカウンターを実装できるUIコンポーネント

https://github.com/LucasLeandro1204/vue-twitter-counter

## vue-poll
![vue-poll-example.jpg](https://qiita-image-store.s3.amazonaws.com/0/252295/ffd467db-e7c7-e82d-d9d4-16f10fdf6ad1.jpeg)

Twitter風の投票UIを作れるコンポーネント

https://github.com/ppietris/vue-poll

## vue-stepper
![stepper.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/362c7bf4-2012-4bcd-b8c1-ae317d4d23f2.gif)

シンプルなフォームのステッパーを作成できるUIコンポーネント

https://github.com/PygmySlowLoris/vue-stepper

## vue-circle-menu
![ani04.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/e0ee3d0b-d8db-1860-ef2c-bc9187f2513f.gif)

ボタンをタップするとボタンが出るUIコンポーネント

https://github.com/OYsun/VueCircleMenu

## vue-star
![logo-01.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/ae97e8bc-4566-9db8-fe8b-df329d1382e4.gif)

スターアニメーションを簡単に実装できるUIコンポーネント

https://github.com/OYsun/VueStar

## vue-tagsinput
![demo2.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/14124b8a-950c-f717-f464-80bcf31aabff.gif)

タグ入力のUIコンポーネント

https://github.com/voerro/vue-tagsinput

## vue-swatches
![promo.png](https://qiita-image-store.s3.amazonaws.com/0/252295/cbabf93b-e809-601f-f253-800d8bf5f775.png)

色選択に使えるUIコンポーネント

https://saintplay.github.io/vue-swatches/

## vue-sticker
![vue-sticker.gif](https://qiita-image-store.s3.amazonaws.com/0/252295/c17528e8-6229-a5ee-f642-b7c77074700a.gif)

ステッカーのような動きを実装できるUIコンポーネント

https://github.com/KamilOcean/vue-sticker

## vue-burger-menu
<img width="1289" alt="スクリーンショット 2018-12-31 15.36.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/252295/5e4feb87-2c15-f7af-aec5-bb560de4339b.png">

サイドバーを実装できるUIコンポーネント

https://github.com/mbj36/vue-burger-menu

## vodal
かっこいいモーダルウィンドウのアニメーションデザイン

https://chenjiahan.github.io/vodal/

## vue-tinder
Vue.jsでTinder風UIコンポーネント

https://shanlh.github.io/vue-tinder
RailsのPrivateメソッドはJavaと同じ感覚でいると痛い目に合う！

##はじめに
※タイトルは少しオーバーになっていますがご了承ください!!
最近、Javaをずっと扱っていた私がRuby on railsをさわり始めました。
ある時、Javaっぽく書いているとエラーが発生して、違いに気づかされました。(最初は同じプログラミング言語だなーっていう感覚で完全に舐めてました・・・)
今回は、自分のメモという意味も込めて、投稿してみます(大部分の人が知ってそうな話題です)

##Ruby on Railsのprivateメソッド

下記の記事を作成したり参照するコントローラーを作成しましたが、記事の詳細を開くときに@articlesがNilでエラーが発生しました(HTMLで@articlesを使っていて、そこでエラーが発生していました)
完全に自分の中では想定外でした

```ruby:articles_controller.rb
def index
  @articles = Article.paginate(page: params[:page], per_page: 5)
end
  
private
  def article_params
    params.require(:article).permit(:title, :description)
  end
  
def new
  // 省略
end
    
def create
  // 省略
end
    
def show
end
```

#####解決まで
単純ですが、リファレンスを見て解決しました

> 各コントローラの標準的なCRUDアクションは、多くの場合index、show、new、edit、create、update、destroyの順で配置されます。この順番でなくても構いませんが、これらがいずれもpublicメソッドである点にご注意ください。本ガイドで既に説明したように、コントローラのpublicメソッドはprivateより前に配置しなければなりません。

思いっきり載ってました・・・・
privateメソッドをpublicメソッドより後に記載しなおして、エラーは解決されました
privateを定義するとpublic等を明示しないと以降はprivateメソッドになるみたいです

##原因
まぁ、リファレンスちゃんと見ていないのが悪いんですが、Javaと同じ感覚で進めていたのが原因かなぁと思ったりもしました

```java:test.java
public void index() {
    //省略
}

private void set_article() {
    //省略
}

public void show() {
    //省略
}  
```

Javaでは上記の実装ではエラーが発生せず、set_article()以降がprivateメソッドにはなりません
メソッドそれぞれに修飾子を定義しているので、そりゃそうですよね


##まとめ
今回のことで2つのことを学びました
①新しい言語を学ぶときはリファレンスを見よう！(とにかく検索)
②新しい言語を学ぶときは今までの固定概念を1回忘れたうえで、勉強していくうちに似た部分と違う部分を見つけていくようにしよう

あと、トライ&エラーは大切ですね


##参照
Ruby on Railsガイド
https://railsguides.jp/getting_started.html
@demaecan 年末にカレー屋がどこも開いてない！ 出前館のWebサイトに学ぶサービス設計・ユーザー動線・SEO

# 年末で / どこもカレー屋 / アイテナイ


# google 検索 デスヨネ

![image](https://user-images.githubusercontent.com/13635059/50555475-6b290900-0d10-11e9-8e33-b3e2ed5faa99.png)

# SEO

上の画像のとおりだが、マップとかに埋もれて検索1位だけどちょっと見つけづらかった

![image](https://user-images.githubusercontent.com/13635059/50555480-7bd97f00-0d10-11e9-9a4a-57a5b05e3143.png)


![image](https://user-images.githubusercontent.com/13635059/50555458-27360400-0d10-11e9-8de1-7150004fa05b.png)

# アカサタナで選ばせるやつ‥

![image](https://user-images.githubusercontent.com/13635059/50555489-9d3a6b00-0d10-11e9-88ca-bcdacfe2704a.png)

# 一見PR だと分からない広告が上に二個、FirstViewを埋め尽くしている

よくばりさん

![image](https://user-images.githubusercontent.com/13635059/50555501-bb07d000-0d10-11e9-9995-d02ca7c00683.png)

🍛

# ユーザーの選択状態、カレーを保持してくれていない

というか最初から選ばれてない

![image](https://user-images.githubusercontent.com/13635059/50555510-d07cfa00-0d10-11e9-80b7-cdb7c8577b31.png)

![image](https://user-images.githubusercontent.com/13635059/50555511-dd015280-0d10-11e9-8ea6-5cd2b4d0bb2c.png)

# 解決策

- Google検索結果からはhttpsで検索キーワードとかリファラで取れないし
- カレー+地域とか、食べ物+地域で組み合わせたページがあっても良いのかも、ユーザーターゲティング的に
- Googleにどう思われるかどうかは不明、これが検索結果に載ってきたら強そう

# 以上

ということでまだカレーなんか頼めていない。


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/96








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Azure の App Service Editor (プレビュー) は、すごい

---
title: Azure の App Service Editor (プレビュー) は、すごい
tags: Azure AppServiceEditor 
author: 
slide: false
---



前回、、、を書きました。
今回はVisual Studio で構築。
かなり楽ちんでした。10倍とまではいかないけど、2―3倍は楽になる。

#App Service Editor
これは、Azure のWebAppの中で立ち上がる、VS Code のミニ版みたいなものです。
ブラウザで、ファイル操作や、ファイルのエディットができます。

##こういう用途に使える
とりあえず、無料版のAzure WebAppsを立ち上げて、JavaScriptや、MySQLのコード確認に作っと使えそうです。

##行き方
1. ResourceGroups
2. WebAppsを開く (App Service Web Apps)
3. App Service Editor （プレビュー）を開く
4. 別なウィンドウが立ち上がる

#なにこれすごそう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/f8096a65-00bf-ca1b-1423-d52ce40b5550.png)

見た目は、ブラウザで動く、VS Codeです。

Bash ぽいものがうごきますが、vi とか vim は動きてん。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/0dc081c0-962b-d3a1-9dbc-58bbf160dda1.png)


ファイルのドラッグアンドドロップで、サーバーに転送できます。FTPいらんやん。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/fb572f90-c3a6-88f5-89d7-f183721b3889.png)

ただし、ディレクトリ（フォルダ）ごとの転送はできなかったので、
ディレクトリはコマンドで掘る必要があります。問題ありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/a0044882-ac27-0655-6e12-92366e8c542f.png)




#結果
プレゼンなどで気軽に、Webサイトを公開するとき、ファイル共有するときなどに使えそうです。
HTTPでいいなら、ngrok いらないかもしれない。
文字列を数値に変換する関数の速度比較 (C++)

## はじめに
最近競技プログラミングを始めたこともあってか、string型の数字をint型に変換する機会がそこそこありました。
これまでは何となくstoi関数を使っていたのですが、似た処理とはどの程度の差があるのだろうか、と思い比較をしました。

## 比較対象
Cからatoi関数、sscanf関数、
C++からstoi関数、istringstream
の4つを比較します。

## 内容と環境
[Try it Online](https://tio.run/)上で実行しました。
ランダムに生成された100万個のstringをint型に変換し、経過した時間を計測します。
実行したコードは最下部に記載します。

## 実行結果

| 処理内容 | 処理時間 [ms] | 
|:---|---:|
| atoi         |    41| 
| sscanf       |   192|   
| stoi         |    69|        
| istringstream|   544|       

## まとめ・おわりに
単純に数値へと変換するならば、atoi関数が最も早かったです。
その他の処理も時間はともかく順位はイメージしていた結果を得ることができました。

計測結果だけの掲載になりましたが、ご覧いただきありがとうございます。

## 実行したコード
```cpp:test.cpp
#include <iostream>
#include <random>
#include <chrono>
#include <string>
#include <sstream>

using namespace std;

constexpr int TRIAL = 1000000;
string strNums[TRIAL];

//c_strとatoiの組み合わせ
void try_atoi() {
  int num;
  for (int i = 0; i < TRIAL; i++) {
    num = atoi(strNums[i].c_str());
  }
}

//c_strとsscanfの組み合わせ
void try_sscanf() {
  int num;
  for (int i = 0; i < TRIAL; i++) {
    sscanf(strNums[i].c_str(), "%d", &num);
  }
}

void try_stoi() {
  int num;
  for (int i = 0; i < TRIAL; i++) {
    num = stoi(strNums[i]);
  }
}

void try_istringstream() {
  int num;
  for (int i = 0; i < TRIAL; i++) {
    std::istringstream(strNums[i]) >> num;
  }
}

//関数実行にかかった時間を返却
long long stopwatch(void(*func)()) {
  std::chrono::system_clock::time_point start, end;
  start = std::chrono::system_clock::now();
  func(); // 処理
  end = std::chrono::system_clock::now();
  return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}

int main(void) {
  std::mt19937 mt((std::random_device())());
  mt.seed(1);
  std::uniform_int_distribution<> randInt(0, 2147483647);
  for (int i = 0; i < TRIAL; i++) {
    int tmp = randInt(mt);
    strNums[i] = to_string(tmp);
  }

  cout << "function :\ttime [ms]" << "\n";
  cout << "----------------------------" << "\n";
  cout << "atoi :\t\t" << stopwatch(&try_atoi) << "\n";
  cout << "sscanf :\t" << stopwatch(&try_sscanf) << "\n";
  cout << "stoi :\t\t" << stopwatch(&try_stoi) << "\n";
  cout << "istringstream:\t" << stopwatch(&try_istringstream) << "\n";


  return 0;
}
```
UI UX デザイナー・開発者は自分自身を最強の「実験ユーザー」にすべし論

# まとめjapanese

- GoogleChromeのピンどめ機能が最高に使いやすい！でも自分でも理由を考えてみなければ分からなかった
- 左に勢揃いするし、タブが。ファビコンだけになって他のタブと見分けやすくなるし。「見つけにくい状態」が最小化するからだと気付いた。
- UI UX 設計者なら、まずは自分自身を実験体にしてサンプルユーザーとして扱ってみよう。無意識だけが感じることがあるから。マインドフルネスの訓練がオススメ。自己洞察力を高めるために




# e.g Google Chrome pin feature is useful but i dont know why 

![image](https://user-images.githubusercontent.com/13635059/50555335-fead0a80-0d0d-11e9-914e-2687bcda8d33.png)

# User maybe doest notice "Why its good or bad"

- For understanding user must thinking about that reason

# Thinking user example

- In this case pinned all tab are left side
- So user do not confused and does not make important tab hard to find place
- and favicon only it is so distinguishable from others  

# Are you UI UX service developer?

- Lets make your self super example
- You is most friendly user in the world you know
- lets think "why you choose it" by your brain and use mindfulness technique :)

---

by https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues/95








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Spring Tools 4とは

2018/9/25にSpring Tools 4がリリースされました。
2018/12/31時点ではバージョン4.1.0がリリースされています。

特徴は下記の３つです。

- エンタープライズ向けのSpring Framework, Spring Boot開発に適したツールを提供
- 特定のIDEに依存しない
- 過去のSTSを踏襲せず、初めから再構築

現時点ではeclipse、Visual Studio Code、Atomの3種類のIDEで利用できるようです。
また、これまで提供されてきたSTS3は、2019年中頃まで継続して提供されるようです。

[Spring Tools 4](https://spring.io/tools)

## インストール手順 (eclipse)

2通りの手順があります。

- Spring Tools 4の公式サイトからダウンロード  
  すぐにSpring Framework, Spring Boot開発を行いたい人向け。その他のプラグインは自分でインストールする必要があります。
- ダウンロード済のeclipseにSpring Tools 4のプラグインをインストール  
  Pleiades等、既に利用しているeclipseにプラグインをインストールしたい人向け。

今回は、2点目のプラグインをインストールする手順を記載します。

eclipseを起動し、「ヘルプ」→「Eclipse マーケットプレース」を選択します。
表示されるダイアログに「Spring Boot」等と入力し、検索します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/333194/65e1493d-63b6-e09a-b85f-7e8d4022a1c8.png)

表示された「Spring Tools 4 - for Spring Boot」を選択します。eclipseの3ヶ月に1回のリリースにほぼ追随していますが、GA前だと対応していないことがある為注意してください。

「インストール」ボタンを押下します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/333194/f3ec1259-db1a-2769-6b97-6a584c310e67.png)

インストールするフィーチャーに問題がなければ、そのまま「確認」ボタンを押下します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/333194/23037e8a-3129-ef75-0f0d-318b8e802563.png)

使用条件を読み、よければ「完了」ボタンを押下します。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/333194/4eada568-c0fe-0f98-9ec3-b6571bf1a9e0.png)

再起動すれば、Spring Tools 4のインストールは完了です。

## 参考資料

- [Spring Tools 4の機能とその実装](https://www.slideshare.net/TakuyaIwatsuka/spring-tools4)  
  Spring Fest 2018で発表されていた資料です。追加・廃止機能の概要など、詳しく記載されています。
UX UI  software developers should make yourself "Super example user" 

# e.g Google Chrome pin feature is useful but i dont know why 

![image](https://user-images.githubusercontent.com/13635059/50555335-fead0a80-0d0d-11e9-914e-2687bcda8d33.png)

# User maybe doest notice "Why its good or bad"

- For understanding user must thinking about that reason

# Thinking user example

- In this case pinned all tab are left side
- So user do not confused and does not make important tab hard to find place
- and favicon only it is so distinguishable from others  

# Are you UI UX service developer?

- Lets make your self super example
- You is most friendly user in the world you know
- lets think "why you choose it" by your brain and use mindfulness technique :)

https://github.com/YumaInaura/YumaInaura/issues/94








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Arduinoでクルマのエンジンが動く？　オープンソースECU Speeduino (2)まずは動かしてみる

#Speeduinoを動かしてみる
[前回記事 (1)概要](https://qiita.com/covao/items/e592b07983b901c22ecc)
まずは、動かしてみます。
##用意するもの

- Arduino Mega 2560マイコンボード(互換ボード）

##インストール
- [Speeduino ソースコード](https://github.com/noisymime/speeduino/releases)
GitHubから、Speeduinoのプロジェクトファイル一式をダウンロードします。ここでは、2018-10リリースのソースコードを使用しています。


- [Arduino IDE]( https://www.arduino.cc/en/main/software)

- [Tuner studio](http://www.tunerstudio.com/index.php/downloads)

##ソースコードのビルド
1. Arduino IDEを起動し、speeduino/speeduino.inoを開く
2. ツール→ボード:Arduino/Genuino Mega or Mega2560
3. ツール:シリアルポートを設定
4. →ボタンを押し、ビルド 

![Arduino_IDE.png](https://qiita-image-store.s3.amazonaws.com/0/329764/b1264a42-6db0-82bc-777f-67b8e583467c.png)

##Tuner studioの初期設定
1. Tuner studioを起動
2. Create New Projectをクリック、Other/Browseをクリックし、reference/speeduino.iniを選択し、Nextをクリック

![create_new.png](https://qiita-image-store.s3.amazonaws.com/0/329764/34c9522f-1313-2936-30da-96db2538d9c8.png)
3. Nextをクリック
4. Com portを選択し、Baud Rate:115200に設定、Nextをクリック
![COMport.png](https://qiita-image-store.s3.amazonaws.com/0/329764/2ad6b14a-d510-221a-c40b-2aa7239c6bc3.png)
5.さらに、Nextをクリックし、設定を終了。
6.Tuner Studioがオンライン状態となり、計器類が表示されます。

##セッティングデータ書き込み
メニュー:File>Load Tune(msq)より、reference/Base Tunes/Speeduino base tune.msqを読込みます。
EEPROMにデータが書き込まれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329764/d29f06fe-f401-f2af-7d83-f94cff2960f9.png)

##簡単な動作確認
- この段階では、回転数(RPM)はゼロのままです。
回転数を変化させるには、クランク角センサのパルス信号を入力する必要があります。
- 右下のInlet Air Temp、Coolant Temp、 Gamma Enrichmentの針がわずかに動いています。
- Throttle Positionは最初100%ですが、ArduinoのA2ピンとGNDを接続すると0%に変化します。A2ピンのA/D値0-5[V]で、スロットルポジションセンサ値0-100[%]の値をとることが分かります。
![Arduino_mega.png](https://qiita-image-store.s3.amazonaws.com/0/329764/0304abf7-e380-b130-9cd7-8ca7f49ed683.png)

- メニューのCommunications→Mini Terminalでシリアル通信モードに入ります。?を入力するとコマンドメニューが表示されます。EEPROMに記録されているデータを読みだしたりすることができます。

![tunerstudio_com.png](https://qiita-image-store.s3.amazonaws.com/0/329764/8a41ee75-6d48-e6fa-2290-1f702e116963.png)

#最後に
とりあえず、Speeduinoの簡単な動作確認ができましたが、まだECUがエンジンの回転を認識していません。[次は](https://qiita.com/covao/items/af936d3aa246510ef081)、クランク角センサの信号を入力するところにトライしたいと思います。
mas-cliをAnsibleで管理する

前職(情シス)ではMacをユーザ用の端末として配っていて、これの初期セットアップ自動化できないかなーと思いつつ他の色々に追われて後回しになってたのを、自宅のMacのOS初期化に合わせてちょっと考えてみることにした。
概ねはhomebrewとcaskで入れるもん入れて、あとは手じゃないとできないことをやる、という感じだったが、 MacAppStoreのものは[mas-cli](https://github.com/mas-cli/mas)でなんとかなるので、これくらいはAnsibleで面倒見れてもいいはず。でもプラグインない。じゃあなんとかしないとな、という話。

## 準備

mas-cliをインストールする。homebrewで入れられるので、mas-cli用の処理より前にPlaybookに書いとくとか、初っ端に手で打っとけばいいと思う。

```
brew install mas
```

## プラグインの代わり

ただべた書きでscriptモジュールを使うのはなんか違う気がするので、冪等性を担保できそうなスクリプトを書きたい。

```mas.sh
#!/bin/bash

APPID=$1

## Argument check
test $# -eq 1 || exit 2

## App check
mas list 2> /dev/null | grep -q "^${APPID} " && exit 0

## App install
mas install ${APPID} > /dev/null 2>&1 || exit 3

## Normal termination
exit 1
```

- App checkで既にインストール済みかチェック、あったら0を返す
- App installでインストール、失敗したら3を返す
- 最後まで行ったら1を返す

これで、0ならok、1ならchanged、それ以外ならfailedになるようにAnsible側でしておけば、問題ないはず。多分。

## Playbook

### 処理部分

```main.yml
- name: mas install
  script: 'mas.sh {{ item.id }}'
  with_items: '{{ mac_apps }}'
  register: result
  changed_when: result.rc == 1
  failed_when: result.rc not in [0, 1]
```

上に書いたとおりになるように、changed_whenとfailed_whenを定義しておく。`not in [0, 1]`みたいな書き方ができるのが楽でいい。

### アプリ定義

```vars.yml
mac_apps:
  - id: 409201541
    name: Pages
  - id: 409203825
    name: Numbers
  - id: 409183694
    name: Keynote
```

IDと名前を書いておく。mas-cliではIDしか使わないけど、こうしておかないと後から見たときに分からなくなる。コメントで名前を書いておいてもいいけど、そうするとAnsibleの実行結果に名前が出ないので、この方が都合が良い。

## 動作確認

### 事前の状態を確認

```
$ mas list
409203825 Numbers (5.3)
409183694 Keynote (8.3)
```

NumbersとKeynoteだけ入れた状態なのを確認する。

### Ansible実行

Ansibleで用意したPlaybookを読ませて実行する。

```
TASK [mas : mas install] *****************************************************
changed: [localhost] => (item={'id': 409201541, 'name': 'Pages'})
ok: [localhost] => (item={'id': 409203825, 'name': 'Numbers'})
ok: [localhost] => (item={'id': 409183694, 'name': 'Keynote'})
```

入ってないPagesはchangedになってて、他はokになってる。変なエラーも出てない。

### 事後確認

#### mas-cli

```
$ mas list
409203825 Numbers (5.3)
409183694 Keynote (8.3)
409201541 Pages (7.3)
```

Pages、Numbers、Keynoteが入ってて、余計なものもなし。

#### Ansible

```
TASK [mas : mas install] *****************************************************
ok: [localhost] => (item={'id': 409201541, 'name': 'Pages'})
ok: [localhost] => (item={'id': 409203825, 'name': 'Numbers'})
ok: [localhost] => (item={'id': 409183694, 'name': 'Keynote'})
```

全部ok。

## 終わりに

期待通りにできたけど、しっかりテストしたわけではないので、何か見落としがありそうで怖い。
あと、mas-cliで使うアプリのIDはGoogleなんかで`macappstore [アプリ名]`とかで検索して、AppStore(iOS用のストアも場合によっては出るので注意が必要)のURL (例：https://itunes.apple.com/jp/app/pages/id409201541?mt=12) から調べるしかなさそうなのがちょっとめんどくさい。でも用途が環境復元のためで、初回に調べてそれ以降ほとんど増えることもないから、最初だけ泥臭く頑張るしかない。でもダサいのでどうにかできたらどうにかしたい。
[PHP]while文に対してdo while文を使うメリット

#while文の例
```php5
<?php
$i = 0;
while($i < 10){
	echo $i;
	$i ++;
}
// => 0123456789
```
まず\$iに0を代入し、while内で、$iが10になるまで出力されている。

#do while文の例
```php5
<?php
$i = 0;
do{
	echo $i;
	$i++;
}while($i < 10);
// => 0123456789
```
こちらはdo while文。whileよりも先に、$iが出力されている。
#たとえば$i=100なら
```php5
<?php
$i = 0;
while($i < 10){
	echo $i;
	$i ++;
}
// => （表示されない）
```

while文の場合、\$iが100なので、while文の１週目から「 \$i < 10 」を満たしているので、while内が処理されず、$iの出力がされない。

```php5
<?php
$i = 100;
do{
	echo $i;
	$i++;
}while($i < 10);
// => 100
```
do while文の場合、whileが最後に来ているので、１週目の$iが出力される。
Ruby,Railsの暗号化いろいろ

記事は下記のブログサイトへ移転しました。

https://lanlib.com/2021/04/16/rubyrails%e3%81%ae%e6%9a%97%e5%8f%b7%e5%8c%96%e3%81%84%e3%82%8d%e3%81%84%e3%82%8d/
静的ウェブサイトで新着投稿画面を実装する

どうも、yusei です。
今日は大晦日。Macの大掃除をしていて、Macにあっても邪魔だけどほしい時には便利なコードを見つけました。というわけで、ここに貼っておこうと思います。

表題にある通り、静的なウェブサイトで、JSを用いて「新着投稿」フィードを表示する方法です。　

# 準備するもの
- 投稿フィードに用いるRSSフィード
- RSSフィードを取ってくるためのYQLクエリ
- この後にかくJSコード
- 取得したフィードをそれっぽく見せるためのスタイルシート

# コード

## 大まかな仕組み
(主語は全てブラウザ上のJSコード)

* YQLにRSSのXMLをJSON化してもらう
* YQLからJSONをもらってくる
* JSONをパースしてHTMLのTableの形にする


###本体

~~~js

//Get JSON as text
function getJSONTxt(url){
    var xmlHttp;
    xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", url, false);
    xmlHttp.send(null);

return(xmlHttp.responseText);
}

function getrss(queryTxt){


    var url="https://query.yahooapis.com/v1/public/yql?q="+encodeURI(queryTxt)+"&format=json&diagnostics=true&callback=";

    var json=JSON.parse(getJSONTxt(url));
    var srcF="";
    var src="";

    if(json.query.results!=null){

        for(var i=0; i<json.query.results.item.length; i++){

            var item=json.query.results.item[i];
            var date_p=new Date(item.pubDate);
            var WeekStr = [ "Sun.", "Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sat." ] ;
            var categories="";
            
            for(var p=0;p<item.category.length;p++){
                categories+=item.category[p]+',';
            }

            src="<tr>";
            src+='<td>';
            src+='<h4><a href="'+ item.link + '">'+item.title +"</a></h4>";
            src+='<h6>'+ date_p.getFullYear() +' / '+       (date_p.getMonth()+1)+'/'+date_p.getDate()+ '　'+WeekStr[ date_p.getDay()]+'　　|　　'+categories+'</h6>';
            src+='<p>'+ item.description+'</p>';
            src+="</td>";
            src+="</tr>";
            srcF=src+srcF;
    }

        srcF="<table>"+srcF+"</table>";

    }else{
        srcF="<h3>** There are no posts.  : (  **</h3>";
}

return srcF;
}

~~~

#使い方

1. YQLで [ここ](https://developer.yahoo.com/yql/)からクエリ文字列を作る。


(ちょまど氏のサイトを例に使わせていただきます。)

URLを書き換えてください。

~~~sql
select * from rss where url ='http://chomado.com/feed/'
~~~


2.`getrss`関数の第一引数にクエリ文字列を渡す。

~~~js
var tbl_html= getrss("select * from rss where url ='http://chomado.com/feed/'");

//tbl_htmlにtableが入っている。
~~~


3.table文字列(HTMLのコードがstringで入ってます。)を、お好きな`<div>`の`innerHTML`に代入

~~~js

var mydiv=document.getElementById("Div_elm");
mydiv.innerHtml= tbl_html
~~~

(4. tableには好きなCSSを当ててください。)

終わり。コメント歓迎です。
良いお年をお迎えください。
迷ったら爆速で。

# たとえば1枚の画像をアップロードしたいとき

- iphone の photo stream から google photo で動悸させて Mac Google Chrome Web UI で copy image するか
- iPhne のphoto stream から写真を選んで、そのままMac Photo Boothで撮影して、さらにそのスクショをMacでClip Board に入れるか e.g 
- てきとうにGoogle Image searchで見つけた画像を利用するか

# 速度が高いものを選ぶ。

- it answer
- 遅いなと思った時点で別の方法に切り替える
- 普段から爆速さを目指して数々のツールやソフトウェアやHackTipsと遊んで、自分の手足を動かせるようにしておこう

# Command + Shift + Control + V

my loving friend never lost you

# その他

- 顔文字か絵文字かテキストかを選ぶときとか
- Qiitaにコメントをつけるかどうか迷ったら、もう迷わないで済む爆速でコメントしてしまう方を選ぶ
- コメントやLINEで送ったメッセージとか間違っても、間違っても編集しない、編集コストは最悪に高いけれど、その後に新規コメント・メッセージするなどした方が爆速であるので正義


# 追記‥こうして世の中にまたひとつタグが生まれた

- 間違いから生まれた伝統料理があると知っているかい？
- 「全然」の用法は二度変わって間違いが正しくて正しいのが間違いでっていうのを知ってるかい？
- 間違いによるブレも爆速さの特徴であり、これがアイディアリングにつながる、偶然は発想のお友達です


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4651bb54-484a-51d0-bf6e-9d4819e8c352.png)


---

by https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues/93








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Angularのサンプル動かすので詰まりました。

これで詰まりました。

[AngularのPWA（Progressive Web Apps）機能でWebプッシュ通知を実装
](https://codezine.jp/article/detail/11278)

`npm` で。

多分やり方間違えたな。

先に `npm init` しないといけなかったかもしれないです。。
そもそもの `npm` の扱いが分かってない。。

## proxy とは？

>プロキシサーバーとは、直接インターネットに接続できないコンピューターに代わってインターネット接続し、Webサイトへのアクセスを代理して行うサーバーのことを指し、プロキシ（Proxy）は日本語に訳すと代理を意味します。
https://boxil.jp/mag/a3028/

chromeで設定できるらしい。


### 設定方法

- [[Node.js] npm の proxy と registry 設定](https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)
- [npm でプロキシを設定／解除する](https://qiita.com/ymaru/items/cf513ab05fe0ebac7d3b)
- [proxy環境でnpmを使う方法](https://qiita.com/Shogo_TODA/items/dfbc5104f6b35612e838)

`node-pre-gyp` の公式ドキュメント
https://www.npmjs.com/package/node-pre-gyp

そもそも、 `npm install` とは？

## proxy を削除したらできた

https://www.npmjs.com/package/http-server
`http-server` を利用。その代わりに。
禅プログラマ！まだ書籍やWebで勉強してるの？ エンジニア最強の学習は「日常生活」が最高だ！

# wife e.g

- Rubyエンジニアの伊藤潤一 @jnchito  さんの奥さんはパン屋をやっていて、そのサイトを伊藤さんが作っている
- @yumainaura の仲間のエンジニアは、奥さんのTODO管理システムを自分で作っていた、汎用的ツールじゃ対応できなくて、奥さんドメイン対応が必要な奴

# me @yumainaura case

- 背柱菅狭窄症で車椅子生活におびえていたが、大阪で障害者雇用枠のIT開発を調べて見つけた
- LINEトークの音声入力機能で家族にメッセージを送ってみたら、これはエンジニアリングのネタをメモする爆速最高ハックではないか？と思いついた
- スターバックスでガムシロップを見つめながら「甘いサービス」「苦いサービス」の違いはなんだろう？なんて連想してみる

![image](https://user-images.githubusercontent.com/13635059/50555043-cd324000-0d09-11e9-94b7-45883e6253b1.png)

# blog

- エンジニアのブログはすべてプログラミングやサービス論、エンジニアリングの目を通してはてなやQiitaやMEdiumやGithubISsueに書けば良い
- エンジニアリングの勉强にもなるし、肩がはっておらず楽しいし、日常生活も最高にenjoyableだし一石二鳥山頂mountainで最高ねこれ











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
postcss-inline-svg導入と速度調査について

SVGをウェブで表現でするにあたり、何点かあるがどれが一番早いのかメリデメなどを調査した。

## postcss-inline-svgとは
GitHub - TrySound/postcss-inline-svg: PostCSS plugin to reference an SVG file and control its attributes with CSS syntax
https://github.com/TrySound/postcss-inline-svg


## 今回の実験を行う方法
- HTMLに直書きSVG
    - :thumbsup: SVGの色変更がCSSでできる
    - :thumbsdown: 装飾をhtmlに記述するのはマークアップ構造的にどうなのか（ここはただの思想なのか...）
- CSSの背景にinline-svg
    - :thumbsdown: 色変更し辛い、変更する場合SVG画像を色数分生成する必要がある
    - :thumbsdown: ビルドがinline-svg記述ファイル → scss → css 2回になる。
- CSSの背景にサーバーからパスで読み込む
    - :thumbsup: サーバのキャッシュで実験よりかは少し早くなる見込み
    - :thumbsdown: IE11でたまにバグあるから気をつける
    - :thumbsdown: サーバにいちいちデータを置かなければならない
- ウェブフォント
    - :thumbsup: 色変更が容易
    - :thumbsdown: 表示が遅いイメージ、一旦四角の〼見たいのが出て表現される感じ

条件
とりあえず差がわかりやすいようにSVGを100個作る。
キャッシュを消して計測し、10回計測の平均を表に記入する
自社のヘッダーとフッターがあるので、数値は少し多いが、差に注目する。

### 表現するSVG
![スクリーンショット 2018-12-30 13.38.49.png](https://qiita-image-store.s3.amazonaws.com/0/94307/db7571cc-4669-2c3f-1673-2211d009e8f2.png)

### 数字を計測する方法
ChromeのデベロッパーツールのNetworkで確認する

## 結果
デベロッパーツールのFinishの時間を記入する。

| htmlに直書きSVG | CSSの背景にinline-svg | サーバーからパスで読み込む | ウェブフォント  |
|:---------------|----------------------|------------------------|-------------|
| 391ms      　  | 387ms                | 393ms                  | 512ms       |


post-css-inline-svgが１番早い結果となった。

### 懸念点
前述でも話したように色変更が難しいので、容易にはできないがうまいやり方がみつかればとてもいい方法だと感じました。
ロゴなど色変更がなかなかないものであれば最適であると思います！
iOSアプリをストアにあげる時に必要なものメモ

iOSアプリを作った後ストアにあげる時に、何が必要か毎回確認しているので、必要なものをまとめちゃいましょうってことで。

# 前提条件

- Apple ID作成済み
- アプリを作り終えている

# 必要なもの一覧

- 証明書・プロファイル
- スクリーンショット
- プライバシーポリシー
- アプリのアイコン
- アプリ概要
- アプリのサブタイトル

# 証明書・プロファイルの作り方

以下に沿って行えばできます。

https://docs.monaca.io/ja/products_guide/monaca_ide/build/ios/build_ios/

# スクリーンショットで必要なもの

## Appetize.ioが便利です

[Appetize.io](https://appetize.io)にビルドすると、スクリーンショットが簡単に撮れるので、それを使っています。

※Monacaでappetize.ioにビルドする場合、**シミュレータービルド**をする必要があるので間違わないように。

では、どの端末のスクショをとればいいでしょうか。

## スクショが必要な端末

https://help.apple.com/app-store-connect/#/devd274dd925
を見てみると、詳細が書いてあります。

最低限必要な画面サイズの種類は、

| 画面サイズ       |       端末 |
|:-----------------:|:------------------:|
| 5.5インチ | iPhone 6s Plus、iPhone 7 Plus、iPhone 8 Plus|
| 6.5インチ | iPhone XS Max、iPhone XR |
| 12.9インチ | iPad Pro(第 2 世代)、iPad Pro（第 3 世代） |

だそうです。appetize.ioで `save screenshot`のボタンを押してサクサクスクショを取っていきましょう！

## 撮ったスクショをリサイズする必要がある

appetize.ioで撮ったスクショのままだと、Apple store connectのスクショにはあげられません。なぜなら、Appleから指定されたサイズでないと受け付けないからです。

指定されているサイズはそれぞれ

| 画面サイズ       | 指定されているサイズ       |
|:-----------------:|:------------------:|
| 5.5インチ | 1242 x 2208 ピクセル（縦向き）|
| 6.5インチ | 1242 x 2688 ピクセル（縦向き） |
| 12.9インチ | 2048 x 2732 ピクセル（縦向き） |

※横向きの場合は縦横の数字が逆になります。

https://bulkresizephotos.com/ を使って、縦横のサイズを指定してリサイズしましょう。とても便利です！

# まとめ

iOSアプリの申請は早く済ませてしまいましょう！
@Github フロントサイトでユーザー入力中のテキスト、情報を消失させない UI 

# Example

- Github の issueをpostしようとしたとき、Connection not found Wi-fi disconnected状態だった
- だけどテキストエリアでテキストをコピーしてクリップボードに入れることが出来た
- Githubはサーバーサイドでもインプット中の情報を保存してくれる仕組みがあるが、フロントサイドだけでも仕組みが考慮されてそう

![image](https://user-images.githubusercontent.com/13635059/50554867-f2bd4a80-0d05-11e9-8f63-c1ee09585981.png)

# How are your service?

lets thinking

---

by https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues/90








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Never lost user inputting before posting UI e.g Github Issue Form Front Side

# Example

- Github keep text area and text when unable to connect network
- we can copy text and save it.
- Github has "Keep inputting" feature in server side But front side this feature is good

![image](https://user-images.githubusercontent.com/13635059/50554867-f2bd4a80-0d05-11e9-8f63-c1ee09585981.png)

# How are your service?

lets thinking

---

by https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues/90








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
要素数kの部分集合を表すビット列の全列挙方法について

# 要素数kの部分集合を表すビット列の全列挙方法について

長さ $n$ でちょうど$k(<n)$ビットが$1$になっているビット列を全列挙する方法が知りたかったので調べていたところ、以下のような実装が見つかった。（参照：[ビット演算 (bit 演算) の使い方を総特集！ 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361#next_combination)）

```ts
function nextCombination(bit: number) {
  const x = bit & -bit;
  const y = x + bit;
  return y | (( (bit & ~y) / x ) >> 1)
}

const n = 5;
const k = 3;

for ( let bit = (1 << k) - 1; bit < (1<<n); bit = nextCombination(bit) ) {
  // 処理
}
```

$\\{ 0, 1, 2, 3, 4 \\}$の部分集合のうち要素数が$3$であるものが以下のような順で辞書順昇順に列挙されるらしい。



| 数値 | ビット列 | 対応する集合    |
| ----: | -------: | --------------- |
| 7    |      111 | $\\{ 0, 1, 2 \\}$ |
| 11   |     1011 | $\\{ 0, 1, 3 \\}$ |
| 13   |     1101 | $\\{ 0, 2, 3 \\}$ |
| 14   |     1110 | $\\{ 1, 2, 3 \\}$ |
| 19   |    10011 | $\\{ 0, 1, 4 \\}$ |
| 21   |    10101 | $\\{ 0, 2, 4 \\}$ |
| 22   |    10110 | $\\{ 1, 2, 4 \\}$ |
| 25   |    11001 | $\\{ 0, 3, 4 \\}$ |
| 26   |    11010 | $\\{ 1, 3, 4 \\}$ |
| 28   |    11100 | $\\{ 2, 3, 4 \\}$ |



`nextCombination`で次の組み合わせを表すビット列を作っているが、最初何をやっているか分からなかった。
`x = bit & -bit`で`bit`の最下位ビットのみが立っているビット列が得られることは知っていたのですぐ分かったが、2, 3行目の意味が分かりにくい。

とりあえず`nextCombination`の処理を追ってみると以下のようになった。

|  入力 |  `x` |    `y` | `bit & ~y` | `( (bit & ~y) / x ) >> 1` |   出力 |
| ----: | ---: | -----: | ---------: | ------------------------: | -----: |
|   111 |    1 |   1000 |        111 |                        11 |   1011 |
|  1011 |    1 |   1100 |         11 |                         1 |   1101 |
|  1101 |    1 |   1110 |          1 |                         0 |   1110 |
|  1110 |   10 |  10000 |       1110 |                        11 |  10011 |
| 10011 |    1 |  10100 |         11 |                         1 |  10101 |
| 10101 |    1 |  10110 |          1 |                         0 |  10110 |
| 10110 |   10 |  11000 |        110 |                         1 |  11001 |
| 11001 |    1 |  11010 |          1 |                         0 |  11010 |
| 11010 |   10 |  11100 |         10 |                         0 |  11100 |
| 11100 |  100 | 100000 |      11100 |                        11 | 100011 |


どうやら、`nextCombination`は上位側と下位側のビット列を別々に作って合わせることをしているらしい。以下はその説明。

まず、入力`bit`に対して、`x = bit & -bit`で`bit`の最下位ビットが立つビット列を作る。
この`x`を`bit`に足すことで、`bit`の最下位側に並ぶ$1$を$0$にし、さらにすぐ左の$0$を$1$にできる。
最下位側に並ぶ$1$とそのすぐ左の$0$以外に手を加えていないので、`y = x + bit`は出力ビット列のうち上位側を表すビット列になることが分かる。

あとは下位側だが、`y`では元の`bit`より$1$が1つ増えているので、下位側ではその分減らす必要がある。
`bit & ~y`で`bit`の下位側のビット列を得る（→ `11...100..0`という形になる）。
`x`で割ることで末尾の$0$をちょうど消すように右にシフトできる（→ `11...1`という形になる）。
さらに`>> 1`で1シフトすることで$1$の数を減らすと求める下位側のビット列が得られる。

辞書順に列挙しているので最後はビット列の長さが$n$を超えた時点で終了すればよい。
【小ネタ】LINQのIEnumerableとIQueryableの違いって何だろう？

# 最初に

本記事は「Effective C#」で得た知見である、`IEnumerable<T>`と`IQueryable<T>`の違いについて解説したものとなります。
何番煎じとか知らない。

何となくで理解していたところだったので改めてしっかりと学んでみたいと思います。

# LINQプロバイダー

標準クエリ演算子を実装しているライブラリのことを**LINQプロバイダー**と呼びます。もちろん.NET標準ライブラリでは`IEnumerable<T>`と`IQueryable<T>`の二つのインターフェイスに対して標準クエリ演算子の実装が存在しています。

# IEnumerable

`IEnumerable`は**内部加工方式**を取る場合に使用します。内部加工方式とは、**データ全件をどこからか受け取った後、ローカル上でクエリを動作させてデータを加工すること**を指します。

`IEnumerable<T>`のクエリ式を実装している(つまり拡張メソッド)のは**`System.Linq.Enumerable`**になります。拡張メソッド群は**LINQ to Objects**とも呼ばれています。.NETのコレクションもほとんどが`IEnumerable<T>`を実装しています。

↓拡張メソッド一覧（公式）↓
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable?view=netframework-4.7.2

`IEnumerable<T>`の実装メソッドはクエリ式中のラムダ式を関数引数として扱うことができるように、デリゲートを使用しています。

IEnumerableはメモリ内のコレクションを繰り返し処理するのに適しています。

# IQueryable

`IQueryable`は**外部クエリ方式**を取る場合に使用します。外部クエリ方式とは、**クエリを外部のサーバーへ投げて、サーバー上でそのクエリを使用してデータを加工してもらい、加工結果だけを受け取ること**を指します。

`IQueryable`は`IEnumerable`を継承しているので互換性はありますが、**シーケンス同士にも互換性があるとは限りません**。

`IQueryable<T>`のクエリ式を実装しているのは**`System.Linq.Queryable`**になります。

↓拡張メソッド一覧（公式）↓
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.queryable?view=netframework-4.7.2

`IQueryable<T>`のクエリ式はまず**式ツリー(expression tree)**として処理します。そのあとに**SQLへと変換され、サーバー上で実行**されます。式ツリーとは、**ラムダ式をクエリの動作を表すロジックのデータとして受け取るための機能**です。

IQueryableはデータベースなどのデータを処理するのに適しています。

# 二つの使い分け

IEnumerableはローカル上で実行されるため、処理対象のデータをどこか別の場所から持ってくる必要があります。ここで、サーバ等から全件を貰うなどと言うような通信をすると、**非常に多くのデータを転送することになる上に不必要なデータまで貰い、余分な処理も行う**ためボトルネックとなってしまいます。

データを持っているサーバーがRDBのように、高度なクエリを受け付けてくれる場合は外部クエリ方式（IQueryable）を使用した方が良い性能を得られます。
<br>

ところでこの二つのハイブリットに当たる`AsEnumerable`と言う機能もあるのですが、それはまた別の機会に。

# 参考

- [2種類のLINQ](https://csharptan.wordpress.com/2011/12/09/2%E7%A8%AE%E9%A1%9E%E3%81%AElinq/)
- [linq to entities ienumerable - IQueryableとIEnumerableの違いは何ですか？](https://code.i-harness.com/ja/q/25211a)
- スラスラわかるC#(書籍)
[PHP]データ型によって偽（false）と扱われるものまとめ

#データ型
1. 文字列 => あいうえお、riotam、鈴木
2. 数値 => 1、100、0.5
3. 配列 => [1, 2, 3]、["赤", "青", "白", "黄", "黒"]
4. null => 「何もない」という特殊な値

#偽(false)になる場合
1. 文字列：空、"0"
2. 数値：0、0.0
3. 配列：要素がない、要素数が0
4. その他：null

#注意点
 - 文字列のスペース、つまり「 」は、falseとならず、値が入っていると認識される
 - 半角の「0」はfalseだが、全角の「０」はtrueとなる

#falseかどうか確認
以下リンクに飛んで、「入力欄」に上記のような様々なデータ型の値を入力してみてください。

[真偽確認用paiza.io](https://paiza.io/projects/e/sWdqmIIe9Q8A5iPux7RVNg?theme=twilight"")
GoでLLVMバインディングを使えるようにしたときのメモ


# はじめに

Macで、Go言語のLLVMバインディングを使おうとしたときに、かなり手間取ったのでメモ。
あくまで自分の環境向けなので、他の人の役にたつかは不明。

# 準備

環境変数LDFLAGSに```/usr/local/include```などがセットされていると、

```ld: can't map file, errno=22 file '/usr/local/include' for architecture x86_64```

みたいなエラーが起きるときがあるので```LDFLAGS```をクリアしておく（自己責任ででお願いします）。

```shell:
$ unset LDFLAGS
```

# ダウンロード


```shell:
$ release=RELEASE_601
$ svn co https://llvm.org/svn/llvm-project/llvm/tags/$release/final $GOPATH/src/llvm.org/llvm
```

> どのバージョンのLLVMを使うかによって、releaseの値を変える。
> 存在するバージョンは[https://llvm.org/svn/llvm-project/llvm/tags/](https://llvm.org/svn/llvm-project/llvm/tags/)を見るとわかる。

# CMakeLists.txt

```$GOPATH/src/llvm.org/llvm/CMakeLists.txt``` で、 ```/usr/local/include``` が含まれている行をコメントアウトしておく。

> ld: can't map file, errno=22 file '/usr/local/include' for architecture x86_64というエラーが出たりしたので念のため。

# Build

```shell:
$ cd $GOPATH/src/llvm.org/llvm/bindings/go
$ ./build.sh
$ go install llvm.org/llvm/bindings/go/llvm
```

> ビルドには時間がかかるので覚悟しておく。

# 参考

[Go言語で利用するLLVM入門](https://postd.cc/an-introduction-to-llvm-in-go/)
[ld: can't map file, errno=22 file '/usr/local/opt/libffi/lib' for architecture x86_64 #1133](https://github.com/lovell/sharp/issues/1133)
Javaの日付データ型変換（Date, Calendar, String）

Javaで日付のデータを扱う時に、よく混乱したので自分なりに整理してみました。

### 日付に関するデータ型

**Date**

* 特定の日付のデータをミリ秒まで表すことができる
* しかし、時間・分・秒の取得や設定をするメソッドは推奨されていない
    * 後述のCalendarクラスで時間・分・秒まで扱える

**Calendar**

* 日付と時間のフォーマットを行う時に必要な全ての時間フォーマット値を生成できる
* 任意の日時を成形する時などに使える

**java.util.Date**

* `java.util`はDate型を扱えるパッケージの一つ
* 日付データの比較や取得に関するメソッドが継承されている
    * `equals`：2つの日付が等しいかどうか比較
    * `getDay`：日のデータを取得できる（0 = Sunday, 1 = Monday,...）
    * などなど


**java.sql.Date**

* `java.sql`はパッケージ
* データソース（通常はRDB）に格納されたデータにアクセスして処理するためのAPIを提供するとのこと
* java.sql.Dateで日付を扱う場合、時間・分・秒・ミリ秒を0にする必要がある

### 日付⇄文字列の変換

**Date→String**

* `SimpleDateFormat`で出力したい日付のフォーマットを指定する
* `format(Date date)`メソッドで文字列に変換

```java
Date date = new Date(); // 今日の日付
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String strDate = dateFormat.format(date);

System.out.println(date); // => Mon Dec 31 10:33:59 JST 2018
System.out.println(strDate); // => 2018-12-31
```

* `toString()`メソッドを使うと、そのまま文字列になる

```java
Date date = new Date(); // 今日の日付
String strDate = date.toString();

System.out.println(date); // => Mon Dec 31 10:33:59 JST 2018
System.out.println(strDate); // => Mon Dec 31 10:33:59 JST 2018
```

**String→Date**

* `parse`メソッドを用いた変換
    * あらかじめフォーマットを決める必要がある
    * `parse`メソッドを使うクラスで`ParseException`を宣言する必要がある

```java
public static void main(String[] args) throws ParseException{
   String strDate = "2018-12-31";
   SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
   Date date = dateFormat.parse(strDate);

   System.out.println(date); // => Mon Dec 31 00:00:00 JST 2018
}
```

* `valueOf(String s)`メソッドを用いた変換
    * valueOfメソッドの戻り値は`java.sql.Date`オブジェクトになる

```java

String strDate = "2018-12-31";
Date sqlDate = java.sql.Date.valueOf(strDate);

System.out.println(sqlDate); // => 2018-12-31
```


### Date⇄Calendarの変換

**Date→Calendar**

* Calendarクラスの新規インスタンスを作成
* `setTime(Date date)`メソッドを使ってCalendarクラスのオブジェクトに変換

```java
Date date = new Date(); // 今日の日付
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

System.out.println(calendar);
// =>java.util.GregorianCalendar[time=1546228443561,areFieldsSet=true, ...]
```

**Calendar→Date**

* `getTime()`メソッドでDateクラスのオブジェクトに変換

```java
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2018); //年を設定
calendar.set(Calendar.MONTH, 11); //月を設定(※MONTHは0始まり 0→Jan、1→Feb、...になる)
calendar.set(Calendar.DAY_OF_MONTH, 31);//日を設定
Date date = calendar.getTime();

System.out.println(date); // => Mon Dec 31 13:01:05 JST 2018
```

---

### 参考サイト

* [Date (Java Platform SE 6)](https://docs.oracle.com/javase/jp/6/api/java/util/Date.html)
* [Date (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Date.html)
* [Calendar (Java Platform SE 7 )](https://docs.oracle.com/javase/jp/7/api/java/util/Calendar.html)
* [SimpleDateFormat (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/text/SimpleDateFormat.html)


### さいごに

自分が実装したことのある日付データの扱い方についてまとめてみました。
もし「こうした方がいい」「こうすることが多いよ」等あればアドバイスいただけると嬉しいです！
良いお年を！
データ活用にとって大切な最初の一歩について

クリスマスですね。ジャーニーマン( @beajourneyman )と申します。

システムインテグレーターでCOBOLプログラマ、SE、多種多様な案件のPMなどを経て、現在はコンテンツマーケティング(オウンドメディア/SNS)を担当しています。1年半ほど運用を経験した駆け出しのマーケターです。

こちらは [データ活用 Advent Calendar 2018](https://adventar.org/calendars/3520) の24日目の記事です。

## このエントリーの背景

もともと25日のエントリーの投稿をした後に、カレンダー主の方から、期間に拘らず空いている日付に知見をストックしていきたいというリクエストがあり、追加でエントリーすることになりました。日付としては本エントリーが前ですが、書いている順番は25日目のエントリーが先になります。前編・後編のような関係性があります。

[<img width="439" alt="スクリーンショット 2018-12-31 11.54.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/155285/30b91a7d-027f-75c8-e3e4-c8737338cfe2.png">](https://qiita.com/beajourneyman/items/195bf49a7e0c6e7ed65c)

また、取り扱いっているフェーズを意識して書いたタイトルも、書いている順番は「最後の〜」と「最初の〜」です。重複になるので、先に２５日目のエントリー「最後の〜」をご覧いただいてから、こちらを読んでいただけると重複なく読みやすいと思います。

前編・後編を通して取り扱っているのが、セルフサービスBIです。そちらの解説はもう1つのエントリーで簡単にしていますので、こちらでは割愛します。

## データ活用に向けて

この数年、「データは21世紀の石油」と言われています。一方で、足元を見れば収集の仕組みに統合されていないデータがあり、データサイエンスやAIなど利活用に向けたさまざまなテクノロジーが注目を集めています。

仕事でデータ連携やデータ活用を扱っている関係から感じるのは、多くの現場ではデータ利活用の入り口のユーザー自身による「見える化」「可視化」段階で上手くいっていないという現実です。言い換えればセルフサービスBI導入に失敗しているということです。データが価値を生み出す時代の到来とは大きなギャップがあるのが事実ではないでしょうか？

何故、上手く行かないのか？ ポイントとして、ある視点が大きく欠けていることに起因しているのではないか？ そう感じています。セルフサービスBIの導入、つまり入り口に立つユーザーにとっては「十分な信頼関係を築けていないひとから・使ったことのないツール(セルフサービスBI)で・これまでのデータ活用をゼロベースで見直す」という取り組みになります。言うなれば、三重苦のようなモノではないでしょうか？ それが現場担当者の本音です。

では、3つの苦しみ、困難にどう向き合うと良いのでしょうか？ 現場のユーザー目線で考えます。

#### 十分な信頼関係を築けていないひとから

敢えて言葉を選ばずに言えば、エイリアン、侵略者のようなモノです。良くわからない製品のベンダーの人間が、ツールを押し売りに来る、トップダウンで落ちてくる場合も多く現場担当者は、貰い事故でモチベーションはゼロ、そんなケースを何度か見て来ました。

その時に語るべきはツールで何が出来るかでしょうか？ いや、今の課題の傾聴です。良くある事例では、表計算ソフトで何時間も手作業で集計して、表にしてプレゼンテーションソフトに画面ハードコピーを貼って静的なレポートを作る、アドホックに意思決定の場で、状況を把握できていないことが課題、そうした事実を知ることが重要です。

**課題から始める。**

#### 使ったことのないツール(セルフサービスBI)で

ツールの製造元であったり、大手の代理店の担当であったり、あなたはツールのスペシャリストです。セルフサービスBI固有の名詞や動詞を駆使して説明していませんか？ 現場担当者の方は当たり前ですが、初心者です。触ったことは無論、見聞きしたことがない状態でアサインされることも珍しくありません。

今でこそシェアもそこそこあり、知られたツールになっているかもしれません。でも、それは慢心です。仮にGoogleトレンドで検索ボリュームを調べてみてください。日に何億と検索さているワードの中であなたの製品はもっともボリュームが小さい1〜1,000検索かもしれません。製品が出たての頃に、どんな価値をお客様に提供出来るのか説明に苦労していた頃、どうやって価値を伝えようか丁寧に考えていませんでしたか？ お客様にとっては常に1日目です。

**知らないことを前提にする。**

#### これまでのデータ活用をゼロベースで見直す

これまでのデータ活用は、少なからず意思決定の要諦としての役割を担っていた重要な仕事でです。今回、意思決定のスピードアップや精緻化など次のステージに進むためにセルフサービスBI導入の入り口に立っています。その時に禁句とも言える「古いやり方」「無駄が多い」など、ネガティブな言葉で現場担当者に製品の優位性を伝えていませんか？

セルフサービスであるが故に、これから共に歩んでいくパートナーたるべき人間から、これまで成果を求められて取り組んで来た仕事を意味がなかったかのように言われて気持ちの良い方はいません。誰の課題を解決するのか？ そのために必要なコミュニケーションがあります。パッケージツール、売り切りの時代は終わりました。カスタマーサクセスの視点で息の長い関係性を築くために大切なことは何か考えて、刷新の意義や進め方を伝えてください。

**現場の痛みを知り解決する。**

以上、これまでの導入経験などからポイントと感じた3つの視点をご紹介しました。3つ目のカスタマーサクセスについては、別エントリーで少し掘り下げていますので、興味があったらご覧ください。

[<img width="415" alt="スクリーンショット 2018-12-26 3.44.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/155285/9f4289a9-e7ac-b8d4-24fa-de1a44c29d98.png">]
(https://qiita.com/beajourneyman/items/307c2a71fc3d35dd57b2)

## 最後に…

今回は最初に乗り越えるために有効だと感じているマインドや視点についてご紹介しました。現場担当者の方に興味を持ってもらい、出来るかもしれないという可能性を感じてもらわないことには、現場のユーザーさんがその時点では本業には直結しない未来の投資のための時間を捻出することはありません。

目的は何か？ どうありたいのか？ それをユーザーさんの目線でどこまで理解し、コミュニケーション取れるのか？ 決して簡単ではありませんが、常に意識して行動することで、次に繋がっていきます。

皆さんのセルフサービスツール導入ミッションが成功し、エンドユーザーの皆さんが存分にデータ活用できるコトをお祈りして筆をおきます。