OmniAICreator/Qiita-1.07M huggingface dataset:
Bitriseからアプリをチームにテスト配布するための設定

この記事はBitriseアドベントカレンダーの23日目の記事です。

どうも！ハムカツおじさんという名前でtwitterやってます([@hmktsu](https://twitter.com/hmktsu))🤘
自分でだったり弊社でだったりなどでBitriseを使ってサービスをビルドしています。

ちなみに先日Bitrise User Group Meetup #3にて以下のスライドを発表させていただいたので、興味ある人はご覧になってください！
[XcodeやAndroid Studioを弄らないアイコン管理](https://speakerdeck.com/watanabeyu/xcodeyaandroid-studiowonong-ranaiaikonguan-li)

## はじめに
Bitriseはアプリ開発をするにあたって外せないサービスになっていると思っています。
対抗馬としてCircleCIなどの他サービスもありますが、iOSやAndroidのビルドをするためにブラウザ上でぽちぽちするだけでworkflowを組め、さらにはBetaみたいにBitriseを使ってのAdhoc配信や各種Appストアへのアップロードも行ってくれます。

そんなBitriseを使っていてチーム内でアプリのAdhoc配布をしたいということは多々あります。
なので今日はチームに配布するために色々と設定するべき項目、やってもらうべき項目についてを書きたいと思います。

なお諸々の細かい設定に関しては、ほぼほぼiOS向けとなっております。

## 配布されたい人がアカウントを作成
* アカウントを作成して管理者にアカウント名を伝える
* Account Settings -> Test devicesをiOSのSafariで開いてデバイスを登録

Bitriseのアカウントを作成しましょう。
次にBitriseのチームを管理している人に自分のアカウント名をお知らせしてください。

その後iOSをBitriseに登録する必要があります。
SafariでBitriseを開き、Account Settings -> Test devicesを開いてください。
プロファイルをダウンロード -> iOSの設定 -> プロファイル -> インストール -> 登録完了となります。

**Safariをプライベートモードで開いているとうまくいかないので注意**

## 配布するための設定
* Organization -> Groupの作成
* Groupにアカウントを追加
* アプリのダッシュボード -> Teamで先ほど作ったGroupをTESTERS / QAに追加
* Workflowに「iOS Auto Provision」と「Deploy to Bitrise.io - Apps, Logs, Artifacts」を追加
* ビルド

BitriseのOrganizationにおいて、Groupを作成しましょう。
初期状態でいくつかGroupが作成されていますが、配布したいアプリ用のGroupを作っておくと個人的には管理が楽だなぁと思います。

<img width="1660" alt="スクリーンショット 2019-12-24 11.46.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119260/4c08e295-ff12-13ce-b49f-013aa4b6628f.png">
Groupを作ったら先ほど教えてもらったアカウント名を作ったGroupに追加してください。

<img width="1664" alt="スクリーンショット 2019-12-24 11.34.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119260/df308908-833e-eb93-4e11-c1bb3704db34.png">
次にアプリのダッシュボード -> Teamに先ほどのGroupをTESTERS / QAに追加しましょう。

<img width="1654" alt="スクリーンショット 2019-12-24 11.42.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119260/250e4b74-ddad-ec68-b90a-cea38fa939bc.png">
「iOS Auto Provision」と「Deploy to Bitrise.io - Apps, Logs, Artifacts」をWorkflowに追加し、諸々を設定してください。

以上の設定をしてビルドをすると、自動的にGroupに追加したユーザ宛てにダウンロードURLがメールで飛びます。

## ビルドページからインストール
* Click hereというリンクをクリックしてプロファイルをダウンロード
* 設定 -> プロファイル -> インストール
* Safariが開くのでインストールボタンを押してインストール

**Download anywayというボタンを押すとipaをインストールするけど、これはシミュレータ用とか他の用途なので、プロファイル経由でないといけないので注意**

## まとめ
このような感じでGroupを作成して追加/削除をするだけで配布されるかどうかということが決まるのでとても簡単です。
特にBetaに渡すとかそういうこともせずにBitriseだけでDEV環境の確認ができ、App StoreからTest FlightでPROD環境の確認をするという流れできます。
できる限り自分が管理するサービスを少なくするための選択肢としてBitriseはいいんじゃないかと思います。
Ruby計算 気を付けるべきポイント(変数の入力)

#Rubyにて変数に文字列代入の際のポイント


今回行いたいのは、Rubyにて数値の計算。
(例) 入力した数値の倍の値を表示するプログラム。(2→4)

##1.まず入力を考える。
変数に数を代入する。
代入は、入力によって行う。
入力の際は、getコマンドを用いる

~~~Ruby
nunber=gets
~~~

これで入力を行えば、代入される。

##2.計算を考える。
今回は倍にするという単純な計算。
*が×を表す。

~~~Ruby
number2=number*2
~~~

##3.結果表示
計算結果はnumber2に入ってるので、

~~~Ruby
print number2
~~~

とすると、結果は.....

~~~
2
2
~~~

あれ？？


文字列として、代入されてたことが発覚
.to_iをつけて、文字列→数値にする必要あり

~~~Ruby
number = gets.to_i
number2=number*2
print number2
~~~

これで表示は

~~~
4
~~~

となった。

##4.参考ブログ
https://qiita.com/Hayate_0807/items/2e9705091b181a104621
初めてのVulkanプログラミング step7 フレームバッファーの作成

次にフレームバッファーを
作成します。vulkanにおけるフレームバッファーは、１度のDrawCallで描写するバッファーをまとめたオブジェクトです。
これは、事前に何枚の描写バッファーを利用するかという情報を元に作成する必要があります。
フレームバッファーを生成するには、vkCreateFramebuffer関数を用います。

```cpp
	std::vector <VkFramebuffer> framebuffers;

	for (size_t i = 0; i < 2; i++) {
		VkFramebufferCreateInfo framebufferCreateinfo[2];
		framebufferCreateinfo[i].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
		framebufferCreateinfo[i].pNext = nullptr;
		framebufferCreateinfo[i].flags = 0;
		framebufferCreateinfo[i].renderPass = _renderPass;
		framebufferCreateinfo[i].attachmentCount = 1;
		framebufferCreateinfo[i].pAttachments = &(_imageview[i]);
		framebufferCreateinfo[i].width = 600;
		framebufferCreateinfo[i].height = 800;
		framebufferCreateinfo[i].layers = 1;

		vkCreateFramebuffer(_device, &framebufferCreateinfo[i], nullptr, &framebuffers[i]);

	}
```

- stype 構造体のタイプ
- pNext は、Nullまたは、拡張機能のポインター
- renderPassは、フレームバッファーと互換性のあるレンダーパス。前回作成した、レンダーパスを当てています。
- attachmentCoutは、Attachmentの数です。前々回参照
- pAttachmentsは、VKImageViewのハンドルポインターです。
- width height は、フレームバッファーの寸法を示しています。
TwilioでFAXを受信する

（前提）
国内番号の購入済み（住所申請とかいろいろいる）
受信用の番号を購入済み（発信用とは別に購入している）

## 内容

TwilioでFAX番号購入しただけだと受信できないから以下の設定をやる必要がある。

## 1. TwiML Bin を作成

![Twilioクラウドコミュニケーション | 音声通話とSMSアプリケーション構築用のWebサービスAPI 2019-12-24 11-41-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/ddbdfc71-9e26-bcf1-d8cd-3cde2b64a1af.png)

![Twilioクラウドコミュニケーション | 音声通話とSMSアプリケーション構築用のWebサービスAPI 2019-12-24 11-43-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/587f382d-194b-7523-6ded-21c3f6158456.png)

名前は何でもいいんで下の内容で作成

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Receive mediaType="application/pdf" storeMedia="true"></Receive>
</Response>
```

## 2. 電話番号の挙動を設定

FAX受信するで！！！という気持ちを表明する設定をする。

![Twilioクラウドコミュニケーション | 音声通話とSMSアプリケーション構築用のWebサービスAPI 2019-12-24 11-44-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/865ae3e1-f78d-18e1-38f3-b16d8220e68b.png)

![Twilioクラウドコミュニケーション | 音声通話とSMSアプリケーション構築用のWebサービスAPI 2019-12-24 11-45-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/93331765-6feb-fafe-2f64-cd45ca5d6b02.png)

## 3. 受信を確認する

CLIから確認できる

```bash
$ twilio api:fax:v1:faxes:list
SID                                 From           To             Status     Date Created
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  +815099999999  +815099999998  received   Dec 24 2019 11:37:17 GMT+0900
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY  +815099999999  +815099999998  delivered  Dec 24 2019 11:36:56 GMT+0900
```

みたいな感じでSIDがわかるので

```bash
$ twilio api:fax:v1:faxes:fetch --properties=sid,from,to,status,dateCreated,price,priceUnit,quality,duration,numPages,direction,mediaUrl --sid XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

SID                                 From           To             Status    Date Created                   Price  Price Unit  Quality  Duration  Num Pages  Direction  Media URL
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  +815099999999  +815099999998  received  Dec 24 2019 11:37:17 GMT+0900  -0.61  JPY         fine     35        2          inbound    https://media.twiliocdn.com/fax/xxxxxxxxxx
```

みたいな感じで取得できる `MediaUrl` を開けば受信したFAXを見れる。

### 参考
- https://qiita.com/yyano/items/177076c9d5801cfdfadc
- https://blog.mori-soft.com/entry/2018/11/09/204215
AzureVMのOSディスクをスナップショットから復旧する

# AzureVMのOSディスクをスナップショットから復旧する

Azureの仮想マシンのOSディスクが壊れてしまった時、
OSディスクのスワップからOSディスクの復旧を簡単に行えましたので対応方法を記載いたします

## はじめに
OSディスクのスナップショットは事前に取得をしている前提となります。
スナップショットは[ディスク]>[OSディスク]から簡単に取得が行えます。
実際のディスク使用量の課金となりますので、
PremiumSSDの場合でも1GBで月に約17円程(※2019/12/18時点)ですので、
できる限り、自動取得しておいたほうが無難です。

## 復旧の流れ
### スナップショットからマネージドディスクを作成
+ 復旧用のマネージドディスクを作成しておきます

1. [ディスク]>[追加]からマネージドディスクの作成を行います
2. 特別な事情がなければリソースグループ、種類(リージョン)はスナップショットの取得元と同一にしておいたほうがいいと思います。
3. [ソースの種類]>[スナップショット]を選択すると[ソースのスナップショット]という項目が表示しますので、選択肢から作成するスナップショットを選択してください
4. サイズはスナップショットの使用量以上のサイズを選択してください。あとから縮小はできませんのでご注意ください。

### OSディスクのスワップ
+ OSディスクのスワップ機能を利用して復旧を行います

1. 復旧対象のVMの起動を停止します。
2. [VM名]>[ディスク]の画面上部の[OSディスクのスワップ]を選択してください。
3. [ディスクの種類]で作成したマネージドディスク名を選択して保存してください。
4. VMを起動すればスワップしたOSに入れ替わっていることを確認できると思います。

### 注意事項
+ OSディスクは削除を行わない限り入れ替えたあとも存在し、サイズに応じた課金が発生しますので不要な場合は削除をしておいたほうがいいと思います。
+ OSの種類を変更することはできません。
+ 手順についてはAzureの公式のテクニカルサポートブログにも記載があります。記事の情報が古くなっている可能性もありますので、参考程度にしていただき公式の情報に沿って対応してください。
  + [PowerShell を使用して Azure VM で使用される OS ディスクを変更する](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/os-disk-swap) 
  + [管理ディスク (Managed Disks) スナップショットより VM をデプロイする](https://blogs.technet.microsoft.com/jpaztech/2017/05/02/deployvmfromsnapshot/)
  + [Azure Resource Manager (ARM) 仮想マシンの複製方法のご紹介 (Part.1)](https://blogs.technet.microsoft.com/jpaztech/2018/09/21/arm-vm-replication-part-1/)
Guzzleでリクエスト先から返されたエラーメッセージをtruncateさせずに取得する


Guzzleでリクエスト先からエラーが返された際、そのメッセージがtruncateされてしまい、不都合な場合があります。今回は、このメッセージをtruncateされない状態で取得してみます。

```
PHP Fatal error:  Uncaught GuzzleHttp\Exception\ServerException: Server error: `POST https://hoge.local/upload` resulted in a `500 Internal Server Error` response:
{"error":{"code":500,"message":"\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u62 (truncated...)
 in /hoge/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:113
```

## 対応方法

次のコードのように、catch側に ```$e->getResponse()->getBody()->getContents()``` を書くことで取得することが可能です。


### コード

```
try {
        $res = $client->request('POST', $url, [
            ・・・
        ]);
} catch (Exception $e) {
        var_dump(json_decode($e->getResponse()->getBody()->getContents()));
}
```

### 結果
```
object(stdClass)#10 (1) {
  ["error"]=>
  object(stdClass)#34 (2) {
    ["code"]=>
    int(500)
    ["message"]=>
    string(67) "アップロードするファイルを選択してください。"
  }
}
```
最近の3大キャリアのらくらくフォンを調査＠201912

OSとか解像度を知りたかったのでまとめてみましたメモ
2016モデルはAndroid6.0なんですね。。

|キャリア|製品名|AndroidOS|解像度|
|---|---|---|---|
|AU|BASIO2 |6.0|1280*720|
|docomo|らくらくスマートフォン4 F-04J|6.0|1280*720|
|docomo|らくらくスマートフォン me|8.1|1280*720|
|SoftBank|シンプルスマホ4|8.0|1280*720|


## AU BASIO2 Android6.0 1280*720
![NoName_2019-12-24_11-28-50_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/3833ef5f-700c-3e2d-50bf-83466883c02e.png)
![NoName_2019-12-24_11-29-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/c7327eb9-39ce-701c-0ba0-0443de4800b9.png)

## docomo らくらくスマートフォン4 F-04J Android6.0 1280*720
![NoName_2019-12-24_11-29-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/b883820f-6d1b-c855-c1d9-a431f2cf153b.png)
![NoName_2019-12-24_11-30-10_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/31ddc51a-e737-88f9-7110-51d43be0bca0.png)

## docomo らくらくスマートフォン me Android8.1 1280*720
![NoName_2019-12-24_11-30-30_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/8cab0592-8874-63e2-c6c0-38e9e81b62f6.png)
![NoName_2019-12-24_11-30-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/68b10de0-33fe-74ca-0637-4951f5829dd6.png)

## SoftBank シンプルスマホ4 Android8.0 1280*720
![NoName_2019-12-24_11-35-17_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/53883a1f-b3ff-6d3d-b8fc-dad2c80f10af.png)
![NoName_2019-12-24_11-35-29_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/94b05012-95c9-7cb3-3008-9d553a854681.png)

## 参考サイト
BASIO2
https://www.au.com/mobile/product/smartphone/basio2/
BASIO2 SHV36 au　のスペック・仕様・特長
https://kakaku.com/item/J0000019734/spec/#tab

らくらくスマートフォン4 F-04J
https://onlineshop.smt.docomo.ne.jp/products/detail.html?mobile-code=0048u
らくらくスマートフォン4 F-04J docomo　のスペック・仕様・特長
https://kakaku.com/item/J0000021980/spec/#tab

らくらくスマートフォン me
https://onlineshop.smt.docomo.ne.jp/products/detail.html?mobile-code=0049o#kakakucomRevArea
らくらくスマートフォン me F-01L docomo　のスペック・仕様・特長
https://kakaku.com/item/J0000028788/spec/#tab

シンプルスマホ4
https://www.softbank.jp/mobile/products/smartphone/simple-sumaho4/
シンプルスマホ4 SoftBank　のスペック・仕様・特長
https://kakaku.com/item/J0000027437/spec/#tab
ネイティブのJavaScriptばっかり使ってた人のためのvue.js超入門

####三度の飯より**JavaScript**（大嘘）。

どうもなっかのうです。

今回はJavascriptについて話します。

※ネタ要素マシマシなので、胃がもたれやすい方は気をつけてください。

##読んで欲しい人

 - HTML/CSS/JSをちょっと理解してる人
 - おふざけ嫌いじゃないよって人

#「Vue.js」って誰？親戚にいたような...

Vue.jsは人ではありません。

JavaScriptのライブラリ、フレームワークです。

jQueryとかネイティブのJavaScriptでは結構手間のかかることも割と簡単にしてくれます。

Vue.jsは主にフロントエンドの開発に使うもので、

「DOM」と呼ばれるプログラムからHTMLを操るやつを自動的に行ってくれるそうです。

なんかすごいね。（わかってない）

##どうやったら使えるのかね？

HTMLのheadタグのところに、

```html:index.html
    <head>
        <!-- 省略 -->
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    </head>
```
と書きます。

これで下ごしらえは完了です。

#本題です

![画面収録 2019-12-24 11.14.33.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515312/9d0581a7-eb22-7e3c-a4a8-469aba414adb.gif)

今回は、`<input type="text">`の中身がHTMLにすぐさま更新されるものを作っていきます。

それではソースコードです。

```html:index.html
    <div id="app">
        <h2>最優秀賞
            <p>{{ message }}</p>
        </h2>
        <p>（{{ name }}）</p>
        <input v-model="message">
        <input v-model="name">
    </div>
```

```js:script.js
var app = new Vue({
    el: '#app',
    data: {
        message: '赤信号は止まらないと　ダメよ〜　ダメダメ',
        name: 'ゆでたまご小学校　6年　エレキテル太郎くん'
    }
})
```

これだけであの動きができるようになります！すごいでしょ！

（内容がツッコミどころ満載ですが、許してくださいな）

ちなみに、この動作の**キモ**となるのは`<input v-model="name">`です。

「v-model」がこのリアルタイムで書き換える動作をやってくれます。

そして、`{{ message }}`というのがVue.jsによって書き換えられる部分です。

その書き換えられるデータは、script.jsの`data:{}`に書いてあります。

##Vueの最初の３ステップ
 - `{{ message }}` で場所を作る！

 - `el: 'id,class名'` で選択！
 
 - `data:{ message:"書き換えたい文字"}`で置き換える！

これでオーケーです！

みなさんも楽しいVue.jsライフを楽しみましょう！
指定ファイルが存在しないとき新しいファイルを作成する方法—ファイルが存在していれば書き込む

ここでは、もし指定のファイル（text.txt）が存在していなければ、ファイル（text.txt）を作成し、存在していればファイルに"test"と書き込むことをやってみる。

```sample.py
import os
import pathlib

TEXT_FILE = "text.txt"

if not os.path.exists(TEXT_FILE):
    pathlib.Path(TEXT_FILE).touch()
    print("作成しました")
else:
    with open(TEXT_FILE, "w") as file:
        file.write("test")
        print("書き込みました")

# 出力結果（１回目）
# 作成しました

# 出力結果（２回目）
# 書き込みました
```

osとpathlibの組み合わせででき、とても簡単に空のファイルを作成することができた。
Wordpress メールフォーム文字化け php.iniを直接いじれないとき

Wordpressでメールフォームを利用していて文字化けが起こったときに、php.iniを直接いじれなかったのですが、.htaccessに以下の記述をしたら解消しました。

```ruby:.htaccess
php_flag mbstring.encoding_translation Off
```

初歩的なことかもしれませんがハマって困っていたので他の方の参考になればと思い共有します。
【Kotlin】初心者によるAndroid開発 〜困った編〜

# はじめに
初心者（プログラミング初学者）あるあるかもしれませんが、
私の失敗談だったり、困った出来事を簡単にまとめて行きます。
「初心者のとき、そんなこともあったなー」と、共感してくれる方がいると幸いです。
~~それだけで私が救われます~~

# 恐怖のJava
一番悩まされ、幾度となく机ドンする羽目になった~~私殺しの~~Java。
Kotlinがプログラミング初学の私にとっては強敵でした...

まず、私はJavaとKotlinで書かれているコードの違いがわかりませんでした。
その結果『Kotlin Android Listview』とかで調べた良い感じのコードを当てはめてもうまく動かない事がありました。

悩みました。正直。Kotlinで検索してもJavaのコードが紛れ込んでいるからです。
ただ、よくよく見ていくと、決定的な違いが有りました。それは...

***Javaは、命令文の終わりに『;』が付いている***

これですよ!!気づいてからはJavaのコードをすぐに見破れるので本当によかったです。
~~ちなみに初めて買った参考書はKotlinのつもりが、Javaだったよ...そりゃうまく動かないよね!!~~

# AndroidX vs SupportLibrary(V7)
出版が新しい参考書と公式ドキュメントを参考にして勉強を進めていくと、基本的にはandroidXを使う流れになると思います。しかし、参考書や参考サイトが古いとV7で書かれていることがありました。

`import androidx`は知っているが`import android.support.v7`は完全に初見。
それでいて後述する文章が違う場合もあったりともう...。困ったもんだ...(~~素人目線~~)

自分で書いているものがどちらかをしっかりと把握してからそれに合わせて書き換えましょう。
いまでも結構てこずっています

# 不安の塊一文コード
「このコードを追加します」という形で使える最高のコードを沢山の方が公開されています。
ただ、なれるまでは厳しかったんですよ...どこに入れていいかわからなくて...

例えば、「下記コードを◯◯.ktに追加します」って書かれていると...
「◯◯.ktのどの行にコードいれるの!?え、どこの間?一番下?え、どこぉ!!??」ってなるんですよね。
これは私だけかもしれません。でも、よく陥ってました。

実際それっぽいとこに入れてみて、ビルドも問題なくて、正常に動作するか検証するだけで分かる気もしますが、最初はかなり戸惑いました。そのような経験ありませんでしょうか？

コードを全文公開されている方は、本当にありがたかったです。ありがとうございます!!
今となっては一文でも非常にありがたいです。***すべての人に感謝!!***

# 終わりに
まだまだ自分自身学習して日が浅いので、失敗、困り事はつきものです。
その中で一個ずつ調べ、解決しながらより良いコードだったり、記事だったり、皆さんのように私も誰かの役に立てるように頑張っていこうと思います。
また、周りに初学者がいて、同じ状況になっている人が居ましたら是非助けてあげてほしいと思います。

***初心忘るべからず!***
Visual Studio CodeのCould not create temporary directory: アクセス権がありませんのエラー解決

vscode起動時に毎回このエラーが出てくるようになりました。

```
Could not create temporary directory: アクセス権がありません
```

未翻訳の場合は下記のように表示されるようです。

```
Could not create temporary directory: Permission denied
```

vscodeのバージョン更新ができなくなってしまっている模様。
設定ボタンから更新の確認をしようとしても同様のエラーが表示されます。

調べてみると`com.microsoft.VSCode.ShipIt`というディレクトリの権限が関係しているようで、ターミナルで下記を行うと解決しました。

```
sudo chown $USER ~/Library/Caches/com.microsoft.VSCode.ShipIt
```

## 補足
macOS上で起きるエラーのようです。

## 参考
https://github.com/Microsoft/vscode/issues/63869
【Kotlin】初心者によるAndroid開発 〜導入編〜

# 概要
プログラミングなんて無縁の金融機関で働いている私による初心者向け導入方法をまとめたものです。
私自身まだまだ初心者なので、***これから始めようとしている人、やってみたいと思っている人***でも分かりやすいように心がけてまとめて行きます。
今回はずっと興味があったAndroidアプリの開発を目指してやっていきます。
~~初心者の私が書くものなので、微妙かも...でも、気にしない!!~~


# 開発環境の実装
開発は***統合開発環境(IDE)***を利用します。
色々調べてみると、Androidの開発環境といえば【***Android Studio***】一択らしいので、ここは素直に従って使っていきます。公式にインストール方法がまとめてあるのでこちらを参考に導入しましょう。
【https://developer.android.com/studio/install?hl=ja】

ちなみに、システム要求（PCの推奨スペック）ですが、最初はメモリ8Gあれば問題ないと思います。
実際のシステム要求については、公式を参考にしてください。ページ下部に記載されています。
【https://developer.android.com/studio?hl=ja】

# 実際に使ってみる
<img width="889" alt="スクリーンショット 2019-12-22 12.18.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/1cc210d5-ce6d-e427-bab3-4d7f5d7256ec.png">
「インストール完了っ!!プロジェクト立てるぞ!!」と息巻いていたら、
よくわからないけど決めなければいけない項目があったのでざっくり解説していきます。
## プロジェクト作成
<img width="1012" alt="スクリーンショット 2019-12-22 12.18.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/9b5755c0-b352-ad49-f874-7f206c4c8a02.png">
今回は***Empty Activity***を選びます。これが個人的に最も利用頻度が高かったアクティビティです。
それはもちろん、空(Empty)だからこそ作り甲斐があり、汎用性が高いからです!
また、他のアクティビティはイメージ図通りのものが組み込まれている状態で、プロジェクトがスタートします。色々試してみるといいスタートが切れると思います。
***何事も挑戦が大事!まずはどんどんやってみましょう!***

とはいえ、当初「アクティビティってなんだ?」となっていました。
現在は***【 アクティビティ = ロジックを組む場所 】***という捉え方をしています。私の感覚なので、できれば自分なりにアクティビティについて調べてみてください。
正しい解釈や捉え方は是非コメントでご教授ください!
<img width="1012" alt="スクリーンショット 2019-12-22 22.43.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/bb9cec0b-a962-4c21-a919-e899c2f94b04.png">
アクティビティを決定すると、上記画面に移行します。
ここでは、プロジェクト名やパッケージ名、保存場所、使用言語など決めていきます。
パッケージ名は後々変えることもできるの、困ったらデフォルトや適当なもので大丈夫です。
保存場所も特に指定したい場所がなければデフォルトで問題ありません。

言語については、JavaかKotlinを選ぶことになりますので、今回はKotlinを選びます。

APIレベルについては、公式からアナウンスがありましたので今回は28としています。
今後アプリを作ってリリースするぞ!って方は特にこのあたり注意が必要かと思います。
【https://developers-jp.googleblog.com/2019/03/2019-api.html】

instant appsのチェックは外します。詳しくは公式を参照していただき、簡単に言うと「インストール不要でアプリが使える」という仕組みです。
~~でも、折角ならインストールしてもらいたいじゃん!?なんかインストール不要って寂しいじゃん!?~~
【https://developer.android.com/topic/google-play-instant/?hl=JA】

AndroidXは必須アイテムなのでチェックを付けましょう。便利ツールの集合体です。
ただ、少しこの部分は注意が必要で、Xの前身『Support Library』(V4,V7)で書かれた参考書や記事が結構多いです。気をつけていただければと思います。
<img width="750" alt="スクリーンショット 2019-12-22 22.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/538b3f9c-0cd2-bb56-a3eb-133c169460d3.png">
立ち上がりました!!いいですねぇ。

## 実際に動かしてみよう
<img width="280" alt="スクリーンショット 2019-12-22 22.49.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/7dfcfff2-27f5-66c4-1bee-079cd6da41b8.png">
エミュレーターで問題なく動くか確認したいので、画面右上にある再生ボタンを押します。
再生ボタンの横に機種とAPIが記入されている部分が今回使用しているAndroid端末です。設定を変更することで、別の機種で確認することもできますので、試してみてください。
その際は実装しているAPIと機種のAPIを揃えるとエラーなくできるかと思います。

<img width="404" alt="スクリーンショット 2019-12-24 0.26.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/41797eec-91b4-1d98-adac-bc91c5dde7fc.png">
***Hello World!***
無事動いていることが確認できました!文章部分を書き直して再生ボタンを押すと反映されますので、動いていることを確認しましょう。ここまで来るとちょっと感動します。

# 最後に
初めて記事を投稿しました。まだ駆け出しの初心者なので、ミスだったり誤認があったりすると思います。その場合は、お手数ですがご指摘をお願いいたします!
ミスを恥じずにTry&Errorでやっていこうと思います!!
AirflowでHTTPリクエスト送るシンプルなDAGのコードとはまったこと

# 背景
AirflowでHTTPリクエスト送るだけのシンプルなDAGを作りたい

# コード

先に動くコードを出しておく。
肝は `HttpOperator` ではなく、 `PythonOperator` を使うところ。(詳しくは後述)

```py
import airflow
import subprocess
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import timedelta
import requests

def execute_request():
    URL = "http://hoge.com"
    headers={'Authorization': 'some_token'}
    r = requests.get(URL, headers=headers)
    if r.status_code != requests.codes.ok:
        r.raise_for_status()
    return 'success'

default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": airflow.utils.dates.days_ago(1),
    "email_on_failure": True,
    "email_on_retry": False,
    "retries": 3,
    "retry_delay": timedelta(minutes=5)
}

dag = DAG(
    "simple_request_dag",
    default_args=default_args,
    catchup=False,
    schedule_interval="@daily"
)

PythonOperator(
    task_id='simple_request_task',
    python_callable=execute_request,
    dag=dag,
)
```

# はまったこと
Airflow の reference とか見ながら、httpリクエストするOperator 探すと、まず [HttpOperator](https://airflow.readthedocs.io/en/1.9.0/_modules/http_operator.html) にたどり着くと思う。が、このOperatorはちょっと厄介なので気をつけたほうがいい。シンプルにURLを渡してリクエストできるようにはなっていない。

HttpOperatorのサンプルはここにある。
[airflow/airflow/example_dags/example_http_operator.py ](https://github.com/apache/airflow/blob/master/airflow/example_dags/example_http_operator.py)
このコードを見ると、hostの指定がないことに気づく。
HttpOperatorではコード上でhostの指定ができない。

このサンプルコードのhostはAirflowがもつConnectionsという変数に設定されている。 これは WebUIの admin -> Connections で確認できる。上記のサンプルコードの場合はデフォルトホストである、`default_host=www.google.com`というものが適用される。もし、このdefault以外のhostを指定したい場合は、Connectionsに `hoge_host=http://hoge.com` のようなものを登録し、 `http_conn_id` 引数で指定する必要がある。Connectionsの設定は、WebUIで行うか、環境変数でも可能。

でも面倒。

とうことで、シンプルに作りたい場合は、PythonOperatorがおすすめ。

# 参考
#### [How to access the response from Airflow SimpleHttpOperator GET request](https://stackoverflow.com/questions/46676449/how-to-access-the-response-from-airflow-simplehttpoperator-get-request)

「HttpOperatorでどうやってhost変えるの？ え、そんな面倒なの？ じゃ、PythonOperator使うわ。」みたいなシュールなやり取りがされている。
GAFAとは？GAFMAってなに？最近のITエンジニアが知っておきたい用語・企業群

エンジニアってシステムに関する略語や略称となる用語が多いですが
マーケティングなどでも、企業群の用語などを頭文字をとった呼称があります。

今回はエンジニアなら知っておきたい世界の注目企業群の用語メモです。

## GAFMA
もともとは出版業界に影響を与える世界の企業群としてIT企業５社を**GAFMA**と呼びます。
Google、Apple、FaceBook、Microsoft、Amazon
の５社の頭文字です。

## GAFA
GAFMAの中から個人データの収集と活用で成功しているM（Microsoft）を抜いた４社を**GAFA**と呼びます。
Google、Apple、FaceBook、Amazon
の５社の頭文字です。

普段なにげなく使っているソーシャルネットワークやECサイト（ネットショッピング）、スマートフォンなど
個人情報がいかにビジネスにおいて重要かを表していますね。

## FANG
Facebook、Amazon、Netflix、Googleを**FANG**と呼びます。

アメリカの株式投資家ジム・クレイマーが、今後注目したい成長企業群として2015年に提唱し、話題を集めました。

## FAAA
Facebook、阿里巴巴集団（Alibaba / アリババ)、Amazon、Alphabetの４社を**FAAA**と呼びます。
FANGは今でも代表的な企業群ではあるものの、2016年にジム・クレイマー本人によって注目企業群を「FAAA」に改められています。

アリババは中国でトップシェアのネットショップです。Amazonみたいなものですね。

## FAANG
Facebook、Amazon、Apple、Netflix、Googleの５社を**FAANG**と呼びます。

Netflixは現在2019年もすごい勢いですね。
時代はテレビなどのメディアからサブスクリプションの動画サービスの時代に移っているいるのかもしれません。

## FANNG
Facebook、Amazon、Netflix、NVIDIA、Googleの５社を**FANNG**と呼びます。

NVIDIA（エヌビディア）はゲームなど好きな人にはお馴染みかもしれません。
GeForceなど聞いたことあるかもしれません。
グラフィックボードなどのGPUを開発する会社です。

参考
https://ferret-plus.com/9217
Swifterでaouth認証してaccesstoken取得するまで

## 初めに
今回はSwiftでtwitterapi叩こうと思います。
TwitterKitというのが主流だったらしいのですがサポート終了したということでSwifter使っていきます。
## 流れ
- cocoapodsでswifter入れる
- oauth認証のためのメソッドを呼ぶ
- safariで認証後アプリに戻ってくる。

## やってみる
まずpodfileに以下を書き込んでpod installしっます

```
pod 'Swifter', :git => 'https://github.com/mattdonnelly/Swifter.git'
```

次にviewControllerに以下を書きます。
buttonを押した時でもViewdidloadの時でもお好きなタイミングで呼び出してください。
SFSafariViewControllerDelegateを準拠させておくとアプリ内でsafariを開けます。

```swift:ViewController
//twitterdeveloperで取得したapikeyとapisecretkeyを入れます。
let swifter = Swifter(consumerKey: "APIkey", consumerSecret: "ApiSecretKey")
//safariを開く。callbackURLがTwitterDeveloperのcallBackURLと違っていたりkeyが間違えたりしてるとerrorに飛ぶ。
swifter.authorize(withCallback: URL(string: "各々設定したcallbackURL")!, presentingFrom: self, success: {accessToken, response in
     print(accessToken.key)
},failure: { error in
     print(error)
})
```
## Custom URL Scheme
次にCustomURLSchemeを設定します。
こいつを設定してあげるとそのリンクを開いたときにアプリに戻るかどうかというポップアップが出るようになります。
つまり
1. safariを開く
2. ユーザーがパスワードなどを使ってaouth認証する。
3. 設定したcallBacURLに飛ぶ
4. callBackURLをCustomURLSchemeに設定してあるのでアプリに戻ってくることができる。
という流れができます。
ということで、TARGETS->自分のアプリ->info->URLTypes->URLSchemesに設定したsampleと指定してあげましょう。
例えばcallBackURLをsample://と設定しているのなら、sampleの部分だけ書いてあげます。
これでcallBackURL://と叩かれたときにアプリに戻ってこれます。
info.plistのURLSchemesに設定してあげてもいいです。
最後にappdelegateに戻ってきた時の処理を書きます。
## AppDelegate.swift
```swift:AppDelegate
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return Swifter.handleOpenURL(url, callbackURL: URL(string: "設定したcallBackURL")!)
}
```
これで一通り実装は終わりです。

## 躓きポイント
- AppDeveloper側でcallBackURLを設定しているかどうか。
- callbackURLがsample://だとしたらURLschemeはsampleだけになっているか
- apikeyが間違っていないか
以上です。

## 参考にしたサイト
https://qiita.com/noby111/items/532f3d806b19ab46433a
https://github.com/mattdonnelly/Swifter
https://qiita.com/k-boy/items/c83a0505d12cc8e7d4b9
fastlaneでXcode11の新機能Test Planを使う

Test PlanはXcode11から使えるようになった機能で、
Xcode11より前だったらbuild schemeごとに指定していたArgumentsやOptions、Diagnosticsなどの設定が、`.xctestplan`という拡張子のファイルを使って設定できるようになっています。

Test PlanではTestファイルの中の1テスト(`test`から始まるfunction)ごとに実行するかどうかの細かな指定も可能になっています。

詳しい説明はDeNAさんのこちらの記事 https://swet.dena.com/entry/2019/10/23/080000 がわかりやすかったので、そちらを参考にしてみてください。

## fastlaneでTest Planを実行する
fastlane scanのドキュメント https://docs.fastlane.tools/actions/scan/#scan にはまだTest Planに関するオプションがなかったので、`xcodebuild`コマンドを使って`-testPlan`オプションを指定して実行するようにしました。

具体的には他のlaneから呼び出せるようにFastfile内に定義して、以下のように実行しています。

```ruby

lane :unit_test do |options|
  scheme = options[:env] != nil ? options[:env] : "dev"
  project = 'TestProject'
  destination = 'platform=iOS Simulator,name=iPhone 11 Pro Max,OS=13.1'
  testplan = ENV['CI'] ? "unit.ci" : "unit.local"

  run_test(scheme, project, destination, testplan)
end

def run_test(scheme, project, destination, testPlan)
  sh "set -o pipefail && xcodebuild test -scheme #{scheme} -project #{project} -destination '#{destination}' -testPlan '#{testPlan}' -derivedDataPath DerivedData -enableCodeCoverage YES ENABLE_TESTABILITY=YES | xcpretty"
end
```

unit_testというlaneを実行することで、unit test用のTest Planを使ったテストの実行ができるようになります。

### 2020/02/20追記　別の書き方
上記では`xcodebuild`コマンドを使用しましたが、`run_tests`の`xcargs`オプションでテストプランを指定できるそうです。
https://qiita.com/kotala_b/items/00f19ecaef6cae50e161#comment-3df02864954c4145e9fa

```ruby
run_tests(
  scheme: "#{scheme}",
  xcargs: "-testPlan #{testPlan}"
)
```

既に`run_tests`や`scan`コマンドを使っている場合には、`xcargs`を追加した方が良さそうですね！
SORACOMのドングル識別時にエラーを出さない方法

以下の手順に従うと

SORACOMのドングルを識別して接続する方法
https://qiita.com/NaotakaSaito/items/a774209cd2f0029fa886

接続は成功しますが、

```
Sep 20 16:00:58 raspberrypi sh[1366]: ifup: error trying to executing mapping script /xxxxxxxxx/script.sh on wwan0↲                              
Sep 20 16:00:58 raspberrypi systemd[1]: ifup@wwan0.service: Main process exited, code=exited, status=1/FAILURE↲
```

というエラーが出ており、気になって調べて修正しましたのでそのメモ書きです。

#これはなんのエラー？

以下はinterfaces(5)のmanualの一部抜粋です。

```
The script must print a string on its standard output
before exiting. See /usr/share/doc/ifupdown/examples for
examples of what the script must print.
```
和訳すると「スクリプトは終了する前に<b>標準出力に文字列を出力</b>しなければならない。何を出力するかの例は/usr/share/doc/ifupdown/examplesを参照してください。」となります。冒頭の手順「5. モデムが挿入された時のスクリプト」ではexitする前に標準出力に何も出力していないのでエラーが起きていたのです。

#どうしたか？

## 変更点1

rubyスクリプト内でifup相当の処理を行っているので実際は繋がるのですが、rubyスクリプト内では判別だけをさせ、manualの例にあるように実際の処理は`/etc/network/interfaces`で指定するという本来の使い方をさせました。rubyスクリプトは次のようになります。

```ruby:script.sh
#!/usr/bin/ruby
tmp = `ls /dev`
dev = tmp.split("\n")
dev.each {|d|
    if d == "ak020" then
        #`pon soracom020` #/etc/network/interfacesで処理
        print d
        exit 0
        elsif d == "ms2372" then
        #`pon soracom2372` #/etc/network/interfacesで処理
        print d
        exit 0
    end
}
exit 1
```
`/usr/share/doc/ifupdown/examples`のサンプルを見ると成功時は0を返すべきなのでexit codeも修正しています。

## 変更点2
次に`/etc/network/interfaces`を以下のように変更します。

```:/etc/network/interfaces
allow-hotplug wwan0
allow-hotplug ak020 # 追加
allow-hotplug ms2372 # 追加

mapping wwan0 inet ppp
	script /...../script.sh

# 追加
iface ak020 inet ppp
	provider soracom020

iface ms2372 inet ppp
	provider soracom2372
```


#結果

エラーが出なくなりました。また、ドングルを抜いたときの終了処理が正しく行われるようになりました。(これまでは突然抜かれてそのままの状態だった！？)
PowerShellのVim環境にAirlineを導入する

社給のPCがwindowsだったので仕方なくPowerShellでVimを使えないかと模索した結果。[Powershellでvimを使う](https://qiita.com/shuhoyo/items/d9966e12976275f20c24)の続き。

## 環境
- Windows10 Pro
- バージョン: 1806
- 64bit (x64ベースプロセッサ)

## Airlineを導入
Airlineは殺風景なVimのインターフェースをいい感じにしてくれるプラグイン。Powerlineという同様のプラグインが軽量化されたもの。

### Powerlineフォントをインストール

Airlineでは特殊なフォントが必要になるため[PowerlineFontリポジトリ](https://github.com/powerline/fonts.git)をcloneもしくはdownloadしてくる。
以下コマンドで、中にある`install.ps`を実行してインストール。

```
./install.ps1
```

### vim-airlineをインストール

[vim-airline](https://github.com/vim-airline/vim-airline)をcloneもしくはdownloadしてくる。
フォルダごと`C:\Program Files (x86)\Vim\vim81\pack\dist\start`に移動する。
(vim起動時にこのフォルダに置いたプラグインのファイルがすべてloadされる)


### vim-airline-themesをインストール
vim-airlineのテーマファイルをインストールする。
先ほどと同様、[vim-airline-theme](https://github.com/vim-airline/vim-airline-themes)をcloneもしくはdownloadしてくる。
フォルダごと`C:\Program Files (x86)\Vim\vim81\pack\dist\start`に移動する。

### vimrcの設定
vimrc(vimの設定ファイル)にAirlineの設定を書き込む。
ユーザーホーム(~/)に`_vimrc`もしくは`.vimrc`ファイルがあるか確認。(なければ自分で作成する)
この中に以下をそのままコピペする。

```
let g:airline_theme = 'テーマ名'
set laststatus=2
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_idx_mode = 1
let g:airline#extensions#whitespace#mixed_indent_algo = 1
if !exists('g:airline_symbols')
  let g:airline_symbols = {}
endif

let g:airline_left_sep = '»'
let g:airline_left_sep = '▶'
let g:airline_right_sep = '«'
let g:airline_right_sep = '◀'
let g:airline_symbols.crypt = '🔒'
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.linenr = '␊'
let g:airline_symbols.linenr = '␤'
let g:airline_symbols.linenr = '¶'
let g:airline_symbols.maxlinenr = ''
let g:airline_symbols.maxlinenr = '㏑'
let g:airline_symbols.branch = '⎇'
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.paste = 'Þ'
let g:airline_symbols.paste = '∥'
let g:airline_symbols.spell = 'Ꞩ'
let g:airline_symbols.notexists = '∄'
let g:airline_symbols.whitespace = 'Ξ'
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.maxlinenr = ''
```
`テーマ名`の部分は好きなテーマを選んでそのテーマ名を設定する。
[テーマ名の一覧](https://github.com/vim-airline/vim-airline-themes/tree/master/autoload/airline/themes)のファイル名の拡張子(.vim)をとったものがテーマ名になる。

これで設定は完了。vimを立ち上げるとステータスバーがカッコよくなってる。
![cp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135382/cb2e0d81-4e97-0388-9bad-f354580f8dba.png)
うん、いいかんじ。
MIT Open CoursewareのPerformance Engineering of Software Systemsをやっていく(3)

MIT Open CoursewareのPerformance Engineering of Software Systemsをやっていきます。

https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2018/index.htm

##ポインタ
ポインタはアドレスをメモリに格納する第一級のデータ型です。ポインタは他のポインタを含むメモリにある全てのアドレスを格納できます。それは言い換えれば、ポインタへのポインタを定義できるということです。
配列はポインタと同じように振舞います。双方ともに型とメモリ上の位置の情報を含みます。ポインタと配列を同じように扱うことに幾らかの同意があります。

挙動は以下の通り。

```c
#include <stdio.h>

int main(int argc,char* argv[])
{
  //整数iを定義
  int i = 5;
  //&演算子がiのアドレスを取得し、piに格納する。
  int* pi = &i;
  //*演算子がpiを関節参照し値を代入する
  int j = *pi;

  char c[] = "6.172";
  char* pc = c;  //値の代入。cはここではc[0]へのポインタのように振る舞っている
  char d = *pc;
  printf("char d = %c\n",d);  //char d = 6が出力

  //複合型はCにおいては、右から左へ読まれます。
  //pcpはcharへのポインタのポインタです。つまり、
  //pcpはcharのポインタのアドレスが格納されます
  char** pcp;
  pcp = argv;

  const char* pcc = c;    //pccはcharの定数へのポインタです。つまり、ポインタの指す値の書き換え禁止
  char const* pcc2 = c;   //上と意味は同じ（だと思う。詳しい人教えて！）

  *pcc = '7';       //エラー発生。定数なので代入できない
  pcc = *pcp;       //コンパイルは通る。pcc自体が指すアドレスは変更できる。
  pcc = argv[0];    //コンパイルは通る。

  char* const cp = c;  //cpは変更できるcharを指す定数のポインタ
  cp = *pcp;           //cpはポインタの定数であるため、代入できない。コンパイルエラー
  cp = *argv;          //cpはポインタの定数であるため、代入できない。コンパイルエラー
  *cp = '!';           //cpが指す先は変数であるため、代入できる。コンパイルは通る

  const char* const cpc = c;  //cpcは定数を指す定数のポインタ
  cpc = *pcp;          //ポインタの定数であるため代入できない。コンパイルエラー
  cpc = argv[0];       //ポインタの定数であるため代入できない。コンパイルエラー
  *cpc = '@';          //ポインタの指す先は定数であるため代入できない。コンパイルエラー

  return 0;
}
```
🦫【DBeaver】アップデート時にファイル作成エラーが出たら無視しても問題ない

## 環境

Windows 10
DBeaver バージョン6.3.1.201912221734

## やりたいこと

DBeaverのアップデート時に初期ファイルの作成エラーが表示される

初期ファイルの作成エラー：
　　　　"C:\Program Files\DBeaver\dbeaver.exe"
インストールを中止するなら中止を。
再びこのファイルの作成を試みるには再試行を。また
このファイルをスキップスキップして続けるには無視を押してください

![dbeaver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/a3c55262-b8dc-d8f0-d74a-ed87ff8a958a.png)


### 「無視」を押下

🔵ファイルの置換を行わないだけなので問題なく進む

### 「中止」を押下
セットアップは正常に完了されませんでした。
作成できません：C\:Program Files\DBeaver\dbeaver.exe

↓

✖インストールの初期に削除を行うので次回起動時に下記エラーが表示されて使えなくなってしまう
　→再度インストーラを起動してやりなおせば問題ない(接続先も引き継がれている)

A Java Runtime Environment (JRE) or Java Development Kit (JDK) 
must be available in order to run Dbeaver.No Java virtual machine 
was found after searching the following locations:
C:\Program Files\DBeaver\jre\bin\javaw.exe javaw.exe 
in your current PATH



### 「再試行」を押下

✖特になにも起こらない
Visual Studio Code でAWS EC2上のコード開発

# 概要
社内からAWSの踏み台EC2インスタンスを経由しデプロイ先のEC2インスタンスに接続するような環境で開発を行っています。社内の開発マシン上のVisual Studio Code でデプロイ先のEC2インスタンスを直接触ることができたので、備忘録として残します。

**環境**
　開発マシン（社内のプロキシ環境下）：Windows10
　踏み台EC2インスタンス：Linux
　デプロイ先EC2インスタンス：Linux

# 手順
　
<ol><li> 開発マシンにVisual Studio Code のインストール
    https://code.visualstudio.com/download
</li><li> Remote - Development(SSH) プラグインのインストール
    https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack
</li><li> 開発マシンでユーザー環境変数の設定
    HTTP_PROXY_USER 社内プロキシの認証ユーザー名
    HTTP_PROXY_PASSWORD 社内プロキシの認証パスワード
</li><li> .ssh/configを開発マシンの任意の場所に作成

```
Host 踏み台EC2インスタンスの名前（任意）
    HostName インスタンスのIPアドレス
    User ec2-user
    Port 22
    IdentityFile パス/pemキー（開発マシンのどこかに置いておく）
    # 社内プロキシを経由
    ProxyCommand C:/Program Files/Git/mingw64/bin/connect.exe -H proxy.example.com:port %h %p

Host デプロイ先EC2インスタンスの名前（任意）
    HostName インスタンスのIPアドレス
    User ec2-user
    Port 22
    IdentityFile パス/pemキー（開発マシンのどこかに置いておく）
    ProxyCommand ssh -W %h:%p 踏み台インスタンスの名前
```  
</li><li> VSCode から接続
作成した.ssh/configを選択して接続する。途中で、"Continue"のポップアップが出たら、Continueを選択して進める。
    ![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/0c45426c-1b98-f36f-f7b5-e007d736b906.png)

接続できた。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/320b29e4-d81b-6008-cb94-c5a5b4807811.png)

これでデプロイ先インスタンスのファイルを直接編集できるようになりました。

</li></ol>

## 追記（2019/12/26）
上記設定では、ec2-userの権限があるファイルやディレクトリのみ操作が可能です。
なので、root権限が必要なファイルの編集、作成、移動等はできません。（ダウンロードは権限がなくても可能。）
デプロイ先EC2インスタンスにrootで接続するには、以下のようにします。（セキュリティ面で問題がある場合もあるので自己責任で。）

1. ターミナルからデプロイ先EC2インスタンスにssh接続
2. sudo su - でrootユーザーに切り替え
3. authorized_keysのコピー  
  cp /home/ec2-user/.ssh/authorized_keys /root/.ssh/authorized_keys  
  #元のキーはバックアップしておく
4. service sshd reload でsshd再起動
5. 開発マシンの.ssh/configを編集  

```
Host デプロイ先EC2インスタンスの名前（任意）  
    HostName インスタンスのIPアドレス   
    User root ←　ここ
```

これで、root権限が必要なファイルもVisual Studio Code上から操作可能になります。

### 参考
https://qiita.com/songxun/items/7f1e3ddcc87bb74e80f1
https://norm-nois.com/blog/archives/2958
値の”あり” 、”なし”を簡単に判定する基本テク

リストに値が入っているか、いないかの判定でlen()を使って判定することもできるが、これだとスマートじゃない。

```sample.py
list_1 = []
if len(list_1) > 0:
    print("list_1 : Not empty")
else:
    print("list_1 : empty")
```

もっと簡潔にかける方法あり、それは以下。

```sample.py
list_1 = [] # 空のリストを用意

if list_1:
    print("list_1 : Not empty :", list_1)
else:
    print("list_1 : empty")

list_1.append(1)    # 空のリストへ値を追加

if list_1:
    print("list_1 : Not empty :", list_1)
else:
    print("list_1 : empty")

# 出力結果
# list_1 : empty
# list_1 : Not empty : [1]
```
上記のif list_1: は「もし何か値が入っていればTrue」の意味。とても便利。



また、if文によるTrue or False　の判定は以下のようになる。タプル、リスト、ディクショナリ型は同じように判定できる。

```sample.py
empty_1 = ''
empty_2 = ' '
empty_3 = 0
empty_4 = 1
empty_5 = "Hello"

if empty_1:
    print(" ""  : Not empty")
else:
    print(" ''  : empty")

if empty_2:
    print(" ' ' : Not empty")
else:
    print(" ' ' : empty")

if empty_3:
    print(" 0 : Not empty")
else:
    print(" 0 : empty")

if empty_4:
    print(" 1 : Not empty")
else:
    print(" 1 : empty")

if empty_5:
    print(" Hello : Not empty")
else:
    print(" Hello : empty")

# 出力結果

# ''    : empty
# ' '   : Not empty
# 0     : empty
# 1     : Not empty
# Hello : Not empty

```

以上
視覚敏感度が高すぎるのかPCモニターやスマホ画面を見ているだけで目がかすむし疲れるのだけど、ダークモードを活用すると本当に心が落ちつくな。ここまで色というものが目や脳に影響を与えているなんて。

SlackもTwitterもダークモードにした。もう白い背景色なんて考えられない。白はエネルギーを奪う。黒が良い。
![image](https://user-images.githubusercontent.com/13635059/71329055-65e94d80-2563-11ea-90a8-0d3cd5ce08fa.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Buffer を二回読む必要が生じたら？

自分が作っているコマンドで、Buffer を二回読む必要が生じた。Bufferって２回読めたっけ？
と思って、ソースを見てみた。

```golang
// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
// The zero value for Buffer is an empty buffer ready to use.
type Buffer struct {
	buf      []byte // contents are the bytes buf[off : len(buf)]
	off      int    // read at &buf[off], write at &buf[len(buf)]
	lastRead readOp // last read operation, so that Unread* can work correctly.
}
```

プライベートになっていて、アクセス出来ないプロパティがあって、オフセットがあるので、無理っぽい。
オフセットが進んでも、[]byteが変わらなければ、オフセットを元に戻せば良さげだけど、実際は、オフセット
を操作するメソッドは無さげ。

## ソースコード

```golang
func main() {
	body := &bytes.Buffer{}
	body.WriteString("some string")
	b, err := ioutil.ReadAll(body)
	if err != nil {
		panic(err)
	}

	fmt.Println("1st:" + string(b))

	b, err = ioutil.ReadAll(body)
	if err != nil {
		panic(err)
	}
	fmt.Println("2nd:" + string(b))
}
```

## 実行結果

やはり無理でした。

```bash
$ go run main.go
1st:some string
2nd:
```

# 解決策
Buffer は二回以上読むものではないので、Buffer を２回読む必要があったら、一旦byte に変換すれば簡単でしょう。（追記）下記でコメントをいただきましたが、io.TeeReaderを使う方法でも行けそうです！

```golang
func main() {
	body := &bytes.Buffer{}
	body.WriteString("some string")
	b, err := ioutil.ReadAll(body)
	if err != nil {
		panic(err)
	}

	fmt.Println("1st:" + string(b))

	fmt.Println("2nd:" + string(b))

}
```

```bash
$ go run main.go
1st:some string
2nd:some string
```
ユーザーテスト

ユーザーテストの超ざっくりの流れ。
---

### ユーザーテストで確認すること

こちら側が想定しているコンテキストと、ユーザーが想像するコンテキストのずれが無いかテストする。

あたりまえ品質の担保
https://www.juse.or.jp/departmental/point02/08.html

---

### 準備

#### 前提をインタビュイーに共有する。

　　機能についてのテストであって、あなた自身をテストするわけではありません。

#### 発話手法について

　　操作する際に、思ったこと、感じたこと、これからすることを声に出して操作してみてください。例えばこんな感じ。

#### 確認したい仮設を整理しておく

　　シナリオ、質問項目を事前に準備しておく
　　- 課題仮設の設定
　　- 仮設を検証するために必要な操作シナリオを作成
　　- 必要に応じてデータ、UI、プロトタイプを作成しておく。


---
##### [point]

####「効率」より「効果」

　よりわかりやすい操作ができる状態にするのは当然として、それ以前に、そもそも操作ができるか？を確認しておかないと、不完全な製品としてリリースされてしまう。

---

##### [point]

####「満足度」（ユーザーの不安や不満）を軽視しない製品をつくる

---

##### [point]

####「ユーザーにレビューしてもらう」のではなく、「操作してもらう」

判断を下すのは作る側の仕事。重要度、優先度もふくめてテスト結果をプロダクトに反映させるかどうかを検討する。

---

##### [point]

####「シナリオはあくまでも仮説」

間違っている可能性がある。

---
##### [point]

### テストの大まかな流れ

1. アイスブレイク（ラポール形成）
1. シナリオに沿って操作してもらう
1. 事後アスキングを行う

---
##### [point]

### ポイント

- 操作につまることがあっても教えない
- なぜ？と聞かない
 - ☓ なぜそれをクリックしなかったのですか？
 - ○ それに気が付きましたか？

---

### テストは理解のフェーズ

その課題を実際に修正するべきかどうか？は別で考える。
テスト中は、何が起こっているのか？の理解に全力をそそぐ。

---

イメージとしては全部実施したとして、簡単な機能であれば半日くらいの稼働時間。
インタビューの準備と実施

UXを設計する際、課題の発見を目的としたインタビューを実施することがあると思いますが、簡単にインタビュー実施までの作業をまとめてみました。

## 1.目的を設定する

何を知りたいのか、何を確認したいのかを言語化して明確にしておく。

## 2.誰に聞くか決める

対象は誰か？を検討する。顧客仮説と課題仮説をつくり、マッチする対象はどんな人かを整理する。

## 3.対象をリクルーティングする

- 対象となる人を集める。人数は最小工数で実施する場合5人が良いが、急遽参加できなくなったりすることも考慮に入れておく。
- ある程度傾向がつかめるのが5人くらいから。偶数の対象に聞くと票が割れるので奇数が良い。
- 5人に聞くつもりで、3人が同じような意見を言う場合もあるが、反対意見もあるかもしれないので残りのインタビュイーにも実施する。

## 4.確認したい内容を洗い出す。

質問によって確認したい内容を洗い出して羅列する。

## 5.質問を作成する

確認したい内容を元に、その背景を探るにはどういう聞き方が良いかを考えた上で質問のテキストを考える。質問の言い換え。

- 抽象度を高める
- 意見よりも状況や経験（事実）を聞く。
- １つの事柄に対して別の角度からも質問してみる。
- なぜ？と聞かない。論理的な回答を引き出さない。

## 6.質問全体の設計をする

いきなり細部の質問をしても思い出せない。入り口はざっくりとした質問をしつつ、徐々に細かい点を確認していく。

1.ラポール形成
2.大枠の質問
3.細部の質問


## 7.概要説明などのスクリプトを用意する

1. トークスクリプト準備
 - 趣旨の説明
 - インタビューのお礼
 - 質問内容
- 事前の練習（必要時間の予測）
- 場所の確保、リクルーティング
- （参加者へリマインド）
- インタビュー実施

## 8.インタビューで集めた情報を整理する

結果の整理と、次のアクションを決める。
一人で実施する場合もあれば、ステークホルダーと協議しながら整理する場合もあります。

- 分解、グループ化
- 課題の抽出
- 価値の抽出
- 仮説検証の結果をまとめる
- レポート作成
- 次のアクションを決める
備忘録)AndroidStudio)BottomNavigationViewチュートリアル

###環境
android studio 3.2
windows 10

###完成サンプル
![btmNavTutGif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380732/c3903bde-abcb-6e8c-4e2a-155181c54ec7.gif)


###フォルダ構成
[github](https://github.com/TAIniko/BottomNavigationTutorial)

###準備
Bottom Navigation View　をつかうために build.gradleに

```build.gradle
implementation 'com.google.android.material:material:1.2.0-alpha02'
```
を追加

####追加したファイル一覧

- app>src>main>res>layout
    - fragment_favorites
    - fragment_home
    - fragment_profile
    
- app>src>main>res>menu  ※1
    - bottom_nav 
    
- app>src>main>res>drawable　※2
    - ic_favorite_black_24dp
    - ic_home_black_24dp
    - ic_person_black_24dp
    
- app>src>main>java>com.tainiko.bottomnavigationtutorial　※3
    - FavoritesFragment
    - HomeFragment
    - ProfileFragment  


#####補足
※1
menuの作り方
　　　resを右クリック>New>Android Resource Directory>Android Resource Directory>Resource Type>menuを選択

※2
アイコンの追加
　　　drawable右クリック>New>VectorAsset>clip artクリック>好きな画像選択


※3
Fragmentの追加
　　　パケージ名(com.tainiko.bottomnavigationtutorial)右クリック>New>Fragment>Fragment(blank)
初めてLINEWORKS Bot を使ってみてちょっとハマった所

初めて、LINEWORKS BOTを触った時ちょっとハマったところを書きたいと思います。
#ざっくりとしたLINEWORKS BOTとLINE BOTの違い
### LINE BOT
**B2C向け**
LINE内で検索すると出てくる公式アカウントはLINE BOTで作成されています。
なので、普段よく目にするBOTはこちらを利用して作られています。
### LINE WORKS BOT
**社内向け**
企業が社内でBOTを使用する時に使われます。
使用例：スタッフ向けの営業レポートの送信や FAQ 対応、業務システムとの連携

利用料金
<img width="981" alt="スクリーンショット 2019-12-22 12.38.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289485/802ad490-0ebd-5f3a-5a8e-506076f77f06.png">

# LINEWORKS BOT作成方法
こちらを参考にしました。
とてもわかりやすく書かれていておすすめです。
[LINE WORKSで初めてのBot開発！(前編)
](https://qiita.com/tokotan/items/f615f4a62219d655436f)[LINE WORKSで初めてのBot開発！(後編)
](https://qiita.com/tokotan/items/976d35ca56132e0bb5c1)


# ハマった所

#### ブラウザでトーク画面どうやって見るの？
[ブラウザ版LINEWORKSトーク画面](https://talk.worksmobile.com/#/)

#### トークルームにBOTを追加できない
あれ、チェックできない。。なんで、、、
<img width="800" alt="スクリーンショット 2019-12-22 14.20.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289485/ea926754-458b-cd31-7ec6-056b57f57949.png">

LINEWORKS DeveloperConsoleで画面左のBotを選択する
<img width="801" alt="スクリーンショット 2019-12-22 14.24.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289485/b69eae15-4220-a3d6-13ae-334412cea921.png">
修正ボタンをクリックする。
<img width="770" alt="スクリーンショット 2019-12-22 14.25.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289485/64e1c595-5da5-34c4-dd45-fb135641feaf.png">
ここの複数人のトークルームに招待可のチェックボックスを選択する。するとグループにBotが追加できるようになります。

#### BOTにメッセージを送れない
あれ、せっかくBOT作ったのにメッセージが送れないなんで、、
<img width="1120" alt="スクリーンショット 2019-12-22 14.32.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289485/188ebc10-e196-ea15-43c2-c77234e1da1e.png">

先程と同じようにLINEWORKS DeveloperConsoleで画面左のBotを選択し修正ボタンをクリックする。
<img width="770" alt="スクリーンショット 2019-12-22 14.25.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289485/25fb9f5b-d44e-b1e6-d30d-c2ae6a74677c.png">
ここのテキストのチェックボックスを選択する。

#### 最後に
ぜひ皆さんBOT触ってみてください！
iPhoneでの現在Apple Storeに公開されている一覧+ 今後の展望とか

長い長いカレンダーになりましたが終盤戦ということで、もう少しお付き合いいただければと思います。

今回の記事では、**現在自分が確認できている(2019/12/20現在)**でType-Bの読み取りを行っているアプリケーションの紹介をしたいと思います。

ぶっちゃけ、自分は仕事以外でmac関連を触っていない。そもそも触って数か月くらいしか…ということもあるので、**開発を試したい**。ないしは開発したくないけど**とりあえず触ってみたい**層向けです。触ってみたくなりましたら[このカレンダー](https://qiita.com/advent-calendar/2019/corenfc)を見ていただければばと思います。

ちなみに筆者はFelicaには詳しくないのでType-Bばかり触っていますのであしからず…


## Japan NFC Reader

ＵＲＬ： https://apps.apple.com/jp/app/id1480265213
作成者： Ryoga Tanaka氏(treastrain)

カレンダーを見たことある人はわかると思いますが、<b>Core NFC Advent Calendar 2019</b>の作成者様です。紹介しないと私が〇〇されてしまいます。

`Felica`を主に取り扱っていて、残高や履歴などを確認することができるものとなっています。
https://japannfcreader.tret.jp/index.html  気になった方はこちらのURLへ。

## IC免許証 本籍リーダ

ＵＲＬ： https://apps.apple.com/jp/app/%E5%85%8D%E8%A8%B1%E8%A8%BC%E6%9C%AC%E7%B1%8D%E3%83%AA%E3%83%BC%E3%83%80/id1487791296
作成者： [株式会社aBite](https://www.abite.tech/)

こちらも本カレンダー参加のkewa4氏が所属している株式会社aBiteのリーダになります。
色々と機能を実装するのではなく`本籍`取得に特化しており、まごったい処理時間等は少ない為、狙った情報を読み取りたい場合に便利だと思われます。

## ReadID

ＵＲＬ： https://apps.apple.com/nl/app/readid-nfc/id1463949991
作成者： [InnoValor](https://readid.com/)(オランダの会社)

個人的な一言感想を述べると**黒船**です。パスポートの読み取りと（おそらく？）国際運転免許証を読み取る機能を持ちます。これ、空港とかのパスポート認証とかに使えてしまいそうなくらい…

パスポートもカードタイプと券面タイプ両方を読み取ることができる優れものです(筆者は日本発行の電子旅券のみ確認)

外国のアプリなので*全て英語*ですが、UIの通りに動かしたところ問題なく動作したので、パスポートを持っていらっしゃる方はぜひお試しください…！



## JPKIMobile

ＵＲＬ： https://apps.apple.com/jp/app/jpki%E5%88%A9%E7%94%A8%E8%80%85%E3%82%BD%E3%83%95%E3%83%88/id1481154805?mt=8

作成者：地方公共団体情報システム機構（JBIS）

マイナンバーカードの読み取りに利用されています。マイナンバーカードは仕様を知らないのですが、以下の2点が読めるようです

- 署名用電子証明書
    - 主に電子申請（WEBでの確定申告など？）に利用される署名用の証明書
- 利用者証明用電子証明書
    - これは本人が利用する証明になります。

マイナンバーカードの鍵や仕様はたしか非公開だったので政府等の依頼で作成したりしたのでしょうかね…？



## LibJeID

ＵＲＬ： https://apps.apple.com/jp/app/id1480652022

作成者： オープンソース・ソリューション・テクノロジ株式会社

上記会社が公開しているライブラリの試用版。もともと**android**では日本の本人確認書類4種に対応していたので、現在iOS用に調整中？だと思われる。

現在は運転免許証とマイナンバーカードの読み取りがされている。上記のJPKIMobileとは読み取りの種類が違うが、入力補助と券面と2種類がある…


<hr>

## 今後の展望

会社で初めてiOSの開発環境に触って。鍵だったり規格だったり全く知らないことを詰め込んで頭がパンクしていますが、自分が知ってる限りだけでもここまで広い活用をされていると思うと驚きでなりません。

今回紹介しなかった`Felica`や`mifare`規格などの読み込みも盛んになっていけばと思うのと同時に、データを悪用するようなことがないよう開発者としては、正しい知識などを得ていければと思います。
こういった記事内や小さな勉強会などでもあればいいな…



（本記事、手元にiPhoneが無い状態で作成したので画像が無くて申し訳ないです。手に取れるようになり次第画像を添付して再更新したいと思います！！）
【Mac】改行を一括置換したいのにバックスラッシュが打てない

最近、仕事で初めてMacを触ることになり、いろいろと苦戦中。
VSCodeで改行を一括置換しようとした時に困ったわけです。

・改行コードの正規表現は「\n」
・バックスラッシュの入力はMacだと、```opt + ¥キー ```

ということで、一件落着。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/ce9b65f6-6ed2-f67c-a73e-24eb77c96452.png)
Matplotlib で軸をパーセント (%) 表示にする

たいしたことない話だけど忘れがちなので。

## サンプルデータ
``` python
import numpy as np

arr = np.random.randn(10)
print(arr)
# => array([ 0.24671671, -0.8013258 , -0.29147271, -0.10755521, -1.39065478,
#           -1.03983494, -0.75304377,  0.62645801,  0.76417769, -0.31104797])

```

## 普通にプロットした場合
``` python
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.bar(x=range(len(arr)), height=arr)
ax.set_title('何らかの割合')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/3407a24d-185a-1e30-3a97-34a5e8bcaf06.png)

これだと割合であることがわかりにくい。

## パーセント表示する場合
``` python
import matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.bar(x=range(len(arr)), height=arr)
ax.yaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1.0))
ax.set_title('何らかの割合')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/a60fcfbf-f551-d83b-63cb-634d3d1eda53.png)

[matplotlib.ticker — Matplotlib documentation](https://matplotlib.org/3.1.1/api/ticker_api.html)
二項分布を使って作業を失敗する数を考える

# 1. 概要
何か作業をしてどれくらい成功するのかを考えてみる。
二項分布を学んだ時に例題で出てきたコインの裏表のどちらが出るとかじゃなくて、
実際に使えそうなシチュエーションを考えてみました。

最初に1人の作業者がどの程度作業に成功するのかを求めて、
その後、2人の作業者を比べてどちらが成功しやすいのかを比べてみます。

# 2. 1人の作業者の作業成功確率を考える

## 2.1. 前提

以下のデータがあるとする。
- 平均的に2000回作業する。
- 成功する確率は95%


## 2.2. どれくらい成功するのか

```python
from scipy.stats import binom
import numpy as np
from matplotlib import pyplot as plt

# 作業回数
x_A = 2000

# 作業を成功する確率
p_A = 0.95

# 平均と分散を出す
mean, vari = binom.stats(x_A, p_A)

# 分散の平方根を出すためsqrtを使う。
print("平均で{}回±{} 作業が成功します。".format(mean, np.sqrt(vari)))
```
以下が出力されるはず。
`平均で1900.0回±9.746794344808968 作業が成功します。`

### 2.2.1. グラフにしてみる

2000回作業して、1900回くらい成功する確率が高いというのが分かるグラフ。  

```python
n = range(2000+1)
Y = binom.pmf(n, x_A, p_A)
plt.plot(n, Y, marker="o")
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/0e99352b-5067-d6e6-8cda-74a8b085d49f.png)

# 3. 人を比べてみる

AさんとBさんの作業データは以下の通り。
この状態で150回ちょうど成功する確率が高いのはどちらだろう。

- Aさん
作業回数 = 200
成功確率 = 0.75

- Bさん
作業回数 = 185
成功確率 = 0.7

```python
# 試行回数
n = 150

x_A = 200
p_A = 0.75

x_B = 185
p_B = 0.7

Y_A = binom.pmf(n, x_A, p_A)
Y_B = binom.pmf(n, x_B, p_B)
print("Aさんの成功確率は{}です".format(Y_A))
print("Bさんの成功確率は{}です".format(Y_B))
```
以下のように出力されるはずです。
`Aさんの成功確率は0.06502948265901858です`
`Bさんの成功確率は0.0002032290967014346です`

Aさんのほうがすごく成功しそうです。でも、そんなに差があるとは思えません。

これは150回ちょうど成功する確率だからです。
140回でも151回でもなく、少なくとも150回成功するというわけでもなく、
150回丁度成功する確率を求めているのでこうなります。

## 3.1. グラフにしてみる

Aさんの線の色を緑にしておきます。

```python
plt.plot(n, Y_B)
plt.plot(n, Y_A, color="g")
```

Bさんは130くらいに山があります。Aさんは150回が山の頂上付近っぽいです。

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/a931930f-bead-a31d-1f9e-49f7a3a751af.png)


## 3.2. 150回までの成功確率を足し合わせる。

では、150回までの成功確率を足し合わせるとどうなるかを見てみます。
nの部分を以下のように書き換えてもう一度実行します。

```python
n = range(150+1)
```

そうすると、

```python
Aさんの成功確率は[3.87259191e-121 2.32355515e-118 6.93581212e-116 1.37329080e-113
 2.02903716e-111 2.38614770e-109 2.32649400e-107 1.93431359e-105
 1.39995946e-103 8.95974053e-102 5.13393132e-100 2.66030987e-098
 1.25699641e-096 5.45343059e-095 2.18526754e-093 8.12919526e-092
 2.81981461e-090 9.15610390e-089 2.79261169e-087 8.02508412e-086
 2.17881034e-084 5.60265515e-083 1.36755719e-081 3.17511104e-080
(後略
```

と出たと思います。
150回までの1回やった時、2回やった時...という場合の確率が全部出ています。
なので、これを足し合わせると150回までの確率がでそうです。
以下のコードで足し合わせると、

```
print("Aさん", Y_A.sum())
print("Bさん", Y_B.sum())
```
以下のように表示されます。

`Aさん 0.5271236581201976`
`Bさん 0.9997782710409081`

150回までだと、Bさんのほうが上手くいきそう！
ただ、160回くらいにすると以下のようになり、上述のような顕著な差は無くなってきます。

`Aさん 0.9594957905805787`
`Bさん 0.9999999570698379`

## 3.3. 備考
pmf を cdf に変更すると指定の数までの確率を足し合わせてくれます。

```
n = 150

x_A = 200
p_A = 0.75

x_B = 185
p_B = 0.7

Y_A = binom.cdf(n, x_A, p_A)
Y_B = binom.cdf(n, x_B, p_B)
print("Aさんの成功確率は{}です".format(Y_A))
print("Bさんの成功確率は{}です".format(Y_B))
```

結果

`Aさんの成功確率は0.5271236581203135です`
`Bさんの成功確率は0.9997782710407805です`