OmniAICreator/Qiita-1.07M huggingface dataset:
Railsでmysql2 gemをインスールする際に起きるエラー Library not loaded: libmysqlclient.18.dylib

表題通りで次のようなエラーが起きた場合は

```
Library not loaded: libmysqlclient.18.dylib
```

解消法は MySQL 5.7と5.6のやり方が異なります。

Mysql 5.7 の場合は

```
sudo ln -s /usr/local/mysql-5.7.23-macos10.13-x86_64/lib/libmysqlclient.dylib /usr/local/lib/libmysqlclient.18.dylib
```

Mysql 5.6　の場合は

```
sudo ln -s /usr/local/mysql-5.6.38-macos10.12-x86_64/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
```

ただし、 `mysql-5.7.23-macos10.13-x86_64` フォルダ名は環境によって名前が違うので、`libmysqlclient.dylib` もしくは `libmysqlclient.18.dylib` の場所を探す際に `find` コマンドを使ってください。

```
sudo find / -name "libmysqlclient.dylib"
```
My.Application.Info.Version のバージョン番号が更新されない場合に確認すること

## 1. アセンブリ情報を確認する

ソリューションエクスプローラー上でプロジェクトを右クリックし「プロパティ...」を選択します。あるいは「プロジェクト」メニューから「<プロジェクト名> のプロパティ...」を選択します。プロパティ画面が開きます。

左側のタブで「アプリケーション」を選択します。

ボタン「アセンブリ情報...」をクリックします。アセンブリ情報ダイアログが開きます。

「アセンブリ バージョン」が正しいものになっていることを確認します。

プロパティ画面を閉じます。

## 2. キャッシュをクリアする

「ビルド」メニューから「ソリューションのクリーン」「<プロジェクト名> のクリーン」を行います。

プロジェクトのフォルダをエクスプローラで開き、配下の「My Project」フォルダを開きます。

配下の「obj」フォルダの中身を削除します。

その後「<プロジェクト名> のリビルド」を実行します。

## 3. AssemblyInfo.vb を直接編集する。

上記の手順を踏んでもまだ変わらない場合。

プロジェクトのフォルダをエクスプローラで開き、配下の「My Project」フォルダを開きます。

「AssemblyInfo.vb」を開き、`<Assembly: AssemblyVersion("1.0.0.0")>` を一旦別のバージョン番号に変更します。

手順「2」を実施します。

再度「AssemblyInfo.vb」を開き、`<Assembly: AssemblyVersion("1.0.0.0")>` を目的のバージョン番号に変更します。

手順「2」を実施します。

この最後の手順は通常不要だとは思いますが、こうしないと変わらないケースがありました。過去に AssemblyInfo.vb を直接編集していたりするとそのようになってしまう可能性がありますが、同じようにしても問題ないプロジェクトもあったので詳しい原因は不明です。
ampページがpcページにリダイレクトされた時の対処法

# ampページがpcページにリダイレクトされた時の対処法

wpページでサイトを運用していて、amp対応をしようと考えた方の中には、「ampプラグイン」を利用されている方も多いのではないでしょうか。

しかし、ampプラグインを有効化してしばらくしたら、googleサーチコンソールでampエラーが出てしまいました。どうもampページではないとのお叱りのよう。

確かに、対象のurlに/ampをつけても、pcページにリダイレクトされてしまうという状況でした。（urlの最後に/ampがつかない）
少し調べて解決したので、その時の対処法を備忘録がてらメモしておきます。

##対処法

1.WP管理画面のプラグイン設定画面からampプラグインを停止する
2.設定　→　パーマリンク設定で、何も変更せずに「変更を保存」をクリック
3.もう一度、プラグイン設定画面からampプラグインを有効化する

これだけです。
エラーが出たページに、もう一度、/ampをつけてアクセスすると、無事ampページが表示されました。

サーチコンソールのエラー修正の方もお忘れなく。
[Swift] iCarouselの中心にあるアイテムを取得する

# 概要
iOSアプリのカルーセル表示で[iCarousel](https://github.com/nicklockwood/iCarousel)を使用していて、カルーセルをスクロールしたときに中心のアイテムを取得したかったのでやってみました。
ちょっとこれじゃない感があるけど他に思いつかなかったので…

# 方法
**iCarouselDelegate** を継承したクラスで以下のように **carouselDidEndScrollingAnimation** メソッドを実装してあげます。
スクロールのアニメーションが終わったタイミングでカルーセルの中心にあるアイテムを取得しています。
コード内に記述している `items` はカルーセルビューのデータソースです。

```swift:ViewController.swift
    func carouselDidEndScrollingAnimation(_ carousel: iCarousel) {

        //  currentアイテムの取得
        let currentCard  = items[carousel.currentItemIndex]

    }
```

間違ってるとか他にもっとスマートな方法があれば教えてください…
GTX 960 -> GTX 1080Ti && Ubuntu Server 16.04 -> 18.04  メモ

家のマシンには、 GTX 960 が搭載されていました。
Ubuntu Server 16.04 LTS で動いていましたが、
GPU を差し替えるついでにアップデートしたのでそのメモを書いておきます。  

まあ、メモ書くほど大層な話でもないのですが。。。  


## GPU を買う。

購入したGPU は、こちら。  
https://shop.tsukumo.co.jp/goods/4537694243247/201810005000000  

## GPU を刺す。
家に帰り、PC の電源を切り、もともと入っていたGPUを抜き、買ってきたGPU を刺します。
久々にPCケースを開けるとホコリまみれだったので、エアダスターで適当にシュシュッとしました。

自分が使っているケースは、[ZALMAN Z9](https://www.amazon.co.jp/ZALMAN-ATX-%E3%83%9F%E3%83%89%E3%83%AB%E3%82%BF%E3%83%AF%E3%83%BC%E3%82%B1%E3%83%BC%E3%82%B9-Z9-PLUS/dp/B004EQHLFS) (2013年に購入してましたｗ)なのですが、サイズがギリギリでした。
もしかしたらミドルタワーケースの中には入り切らないものがあるかもしれません。
ちなみに、今回購入したGPU はそこまで大きいものではなく、一般的なサイズらしいです。 (店員さん談)
また、電源は、 8ピン x 2 でした。
以前のGPU は、 6ピン x 1 だったので、だいぶ違います。

## GPU を認識させる。  
驚いたことに、何もせずにGPU を認識してくれました。  

## [おまけ] Ubuntu 16.04 -> Ubuntu18.04にアップデート

```
New release '18.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
```
と出ていたので、とりあえず、  

```
# apt upgrate 
```
を行ったところ、  

```
apt-get install unmet dependencies
```

というエラーが出てうまくいきませんでした。
http://blog.livedoor.jp/shoeberry/archives/52271522.html
に有るように、原因は、
`/boot` の容量が 100% になっていたことでした。

https://askubuntu.com/questions/585736/cant-clean-a-full-boot-because-of-unmet-dependencies の、  
`# apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")`を実行した後、  
`# apt-get install -f`を行うとうまく実行されました。  

## アップデートした結果
このアップデートで、

||GTX960||GTX1080Ti|
|:-:|:-:|:-:|:-:|
|GPUメモリ|2GB | -> | 11GB|
|CUDA コア数|1024| -> | 3584|
|動作クロック|1127MHz| -> | 1480MHz|
になったので、だいぶ家で回せる学習が多くなりそうです。  

まあ、クラウド使えよって話では有るんですが。。。

ちなみに、 AWS p2.xlarge スポットインスタンスの現在の価格は、
`$0.270 / h` でした。
GPU 自体の価格は、約85000円で、現在の `円/ドル` が、 `110.97 円 / 1ドル` なので、 
85000 / 110.97 / 0.27 = 2,836.9 より、
2827時間回さないともとが取れないことがわかりました。
ちなみに、この計算には電気代は含んでいないので、実際のコストはもっとかかりそうです(※)。

つまり、 最低でも `118日` 回さないと損になることがわかります。
クラウドが安いな と思うとともに、頑張らなきゃという思いがふつふつと湧いてきました。

いろいろ回してみて結果とかをQiitaや自分のブログに書いていこうと思います。

※ インスタンスの停止忘れとか、データの取扱とか気にしなきゃいけないことも多いので、単純に比較はできないと思いますが。
【Android】アスペクト比を維持して正方形のViewを作る：SquareLayout

SquareLayoutというCustom Viewを作りましょう

```java
public class SquareLayout extends LinearLayout {

    public SquareLayout(Context context) {
        super(context);
    }

    public SquareLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
}
```

layoutの中で以下のように使います。

```xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <com.your-package.SquareLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/something_item1" />

    </com.your-package.SquareLayout>

    <com.your-package.SquareLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_marginLeft="15dp">

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/something_item2" />

    </com.your-package.SquareLayout>

    <com.your-package.SquareLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_marginLeft="15dp">

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/something_item3" />

    </com.your-package.SquareLayout>

    <com.your-package.SquareLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_marginLeft="15dp">

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/something_item4" />

    </com.your-package.SquareLayout>

</LinearLayout>
```

こんな感じで正方形の4つのボタンを配置できました。


原典は[こちらのstackoverflow](https://stackoverflow.com/questions/4656986/how-do-i-keep-the-aspect-ratio-on-image-buttons-in-android)でした。
（30分）偉い人の頭の中をのぞき見る

#目的：売上向上に向けて、ビジネスプランを検討する
#目標：部長のメールを構文解析して、キーワードを抽出する
#環境：Outlook 2010

#作業
##メールをtext にする
Outlook 上で、部長のメールを全て選択する。
今回は、33件で調査した。
Outlook ファイル　＞　名前を付けて保存　＞　任意のファイル名を入力　＞　text ファイルができる

だいたいがゴミデータ（署名やメールto など）なので、ゴミを削除する。今回は、後で使うサービス仕様のため、10,000文字以下まで文章を削る。

##ゴミの削り方
今回は、Microsoft Excel で重複排除をしよう。
出力したtext ファイルの本文をExcel へコピペする。
その後、Excel の　データ　＞　重複の削除
けっこう削れたな。18,000文字　＞　13,000文字
あと、3,000 文字を削る。

あとは、目視だ。
まずは、AI に食わせたくないものを削除しよう。
効果の高かった（削除する文字数が多い）順に下の通り
・返信時の過去文書の引用文（＞マークで同じ文章がつく機能）
・メルマガの配信停止など、後半に書いてある記事以外の情報
・署名
・メールヘッダー（送信先や名前）
　※タイトルは残した

よし、削減完了（18,000 文字　＞　9,811 文字）

##キーワード抽出サービスにかける
下のサービスを利用しました。Yahoo さんのキーワード抽出と連携しているそうです。
https://so-zou.jp/web-app/text/key-phrase/

出力結果 を確認する

まだ、ゴミだらけでした。

##データのクレンジング
キーフレーズの分析が終わったら、ゴミデータを削除します。
私の場合、ランキングに下の情報が入ってきたので削除しました。

・部長の名前の削除（本文に自分の名前があるため、出現頻度が一番高くキーワードになってしまう）
・メール本文中のメーリングリストの削除（係り受けするし、類似情報がないため、メーリングリストは上位にくるようだ）
・フルネームの削除（一通目の時、フルネームを本文へ記載するとキーワードとして拾うようだ。不要なら削除すること）

削除の方法は、ワードで、その文字を検索して空白へ置換しました。
部長のお名前をホイホイ削除するのはためらわれます。なので、日頃の不満を言いながらせめて、心が楽になるように作業しましょう。

##再度、キーワード抽出
お、未来が見えてきた。

私の場合、下のようになりました。

フレーズ 	重要度
NTTデータ	100
SAP Digital Manufacturing Cloud	99
is invalid or cannot be assumed	58
TechTargetジャパン	57
APIGWオリエン	54
NTTデータ次期社長	53
Japan SAP User's Group	52
PaaS	52
Virtustream	51
VMware Cloud Foundation	50
VMware Cloud on AWS	50
JSUG	50
ng-the-new-aws-blockchain-templates	50
Microsoft Azure Stack	49
Hyperledger Fabric	49
NTTコミュニケーションズ	49
クラウド	49
ブロックチェーンテンプレート	47
TechTarget Pick UP	45
IT Leaders Information	44

ひとまず、NTTデータさんとSAP、TechTargetジャパン の新聞記事を拾ってくると、部長の見てる"何か" が見えそうだ。

日経新聞の記事100件 を抽出する。
※ここから先の分析は、現状、未公開で。
GPSの研究　その44

#概要
gpsを理解したかった。
アグリナビで遊んでみた。
usbからgpsつないでみた。

#写真

![CIMG2686.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a51fce0c-ab67-bf31-0ba6-f76f9d3edc9d.jpeg)

以上。
ffmpegで最初の1コマ目を書き出す

# はじめに
ffmpegで最初の1コマ目を書き出す作業の備忘メモです。

# インストール
 `$ brew install ffmpeg`

ffmpegが未インストールならこれで導入できます。ただし、brewのインストールが完了していること。

# 1コマ目を書き出すコマンド
 `$ ffmpeg -i splash.mp4 -ss 0 -vframes 1 -f image2 %02d.png`

splash.mp4ファイルについて、0秒後から１コマ目について、01.pngという書式で書き出し。
ウィンドウ切り替えんのめんどくさいねん。え、Google Chrome でファイルを直接編集できるって？

# tl;dr
- chrome でhtmlとかjavascriptとかcssを直接編集できるぜってこと。
- バリバリ書くわけじゃなかったら、結構有用。

# 環境
- Windows 10
- Google Chrome - 68.0.3440.106（Official Build） （64 ビット）
- Google Chrome Canary - 70.0.3533.0（Official Build）canary （64 ビット）

## まずは普通にファイル作成。(テスト用)
### ファイル構造
||||
|:--|:--|:--|
|:open_file_folder: **root**|:page_facing_up: *index.html*||
||:file_folder: **css**|:page_facing_up: *style.css*|
||:file_folder: **js** |:page_facing_up: *common.js*|

### ファイル内容
#### :page_facing_up: /*index.html*
```html:/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
	<title>Document</title>
	<link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div id="js__outputArea"></div>

  <script src="js/common.js" async defer></script>
</body>
</html>
```

#### :page_facing_up: /css/*style.css*
```css:/css/style.css
/* まだ白紙 */
```

#### :page_facing_up: /js/*common.js*
```javascript:/js/common.js
(async function(){
	let outputArea = document.getElementById("js__outputArea");

	for(let i = 0; i < 100; i++){
		outputArea.innerHTML += await (function(){
			return new Promise(resolve=>{
				setTimeout(()=>{
					resolve(`Hello World!<br>`);
				}, 100);
			});
		})();
	}
})();
```

## ブラウザ(もちろんchromeで)読み込む。
![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/193558/04faf583-8bcb-4123-4c95-093aa527e16a.png)

はーい、こういうことっすねーーー。
~~このへたれプログラム~~

## で、本題。
どうやって編集するのか。

### Step1:
`[F12]`キー かなんかで、DeveloperToolを開く。
そして、`[Source]`タブをクリック。

![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/193558/0454b9fb-83e3-c441-bf5a-0e3496dccc4d.png)

### Step2:
エクスプローラで、そのフォルダの親フォルダーを開く。

![無題6.png](https://qiita-image-store.s3.amazonaws.com/0/193558/23915999-6d6d-ad25-c9bd-5b6b0c8b987d.png)

※ファイルのあるフォルダーではなく、上の階層のフォルダーを開いてください。

### Step3:
そのフォルダを、chromeのDeveloperToolの中にドラッグドロップする。

![無題7.png](https://qiita-image-store.s3.amazonaws.com/0/193558/e398f6cb-f0f1-45d8-0372-2c63fd0fafcc.png)

### Step4:
上にアラート的なバーが出るので、`[許可]`をクリック。
※もし`[拒否]`を押してしまっても、もう一度Step3をすれば大丈夫です。

![無題8.png](https://qiita-image-store.s3.amazonaws.com/0/193558/dafd35ac-bb9a-74b8-5094-8dcc404a6085.png)

### Step5:
バーが消えたら、`[Source]`タブの中にある、`[FileSystem]`タブをクリックして、フォルダーが追加されていればOK!!

![無題9.png](https://qiita-image-store.s3.amazonaws.com/0/193558/e7cd9657-1477-8f44-da94-4c98e09ae955.png)

編集したいファイルをダブルクリック！！！

## 編集
編集したいファイルをダブルクリック！！！してから、普通に編集して保存(`[Ctrl]+[S]`)
リロード(`[F5]`)して反映。
ファイルを二分割する

## レギュレーション

- ファイルを受け取り、それを二分割して二つのファイルを生成せよ。
    - 分割する条件は行数とする（32768行目で分割、等）。
    - 入力はメモリに乗りきらないことも考慮せよ。
- `awk(1)`, `perl(1)` 等のワンライナーを使ってはならない。それで実現可能なのは自明であり面白くない。
- `bash(1)`, `zsh(1)` 等の拡張機能を使ってはならない。シェルは`dash(1)`とする。

テストファイル

```sh
$ yes yes | head -c 40000 > input.txt
$ wc input.txt
10000 10000 40000 input.txt
$
```

## 不合格な回答

### split

`split(1)` といういかにもな名前のプログラムはこの用途には使えない。

```shell-session
$ split -l 4096 input.txt output
$ wc output*
 4096  4096 16384 outputaa
 4096  4096 16384 outputab
 1808  1808  7232 outputac
10000 10000 40000 total
```

望まないファイル `outputac` が生成されており要求仕様を満たさない。（ただし下記を見よ）

### head; cat

```sh
(head -n ${x} > output1.txt; cat > output2.txt) < input.txt
```

この問題をググると出て来る回答 https://superuser.com/a/624240 これはNG。なんでかというと`head(1)`がバッファリングするからデータが欠ける。

```shell-session
$ (head -n 7 > output1.txt; cat > output2.txt) < input.txt
$ wc output*
    7     7    28 output1.txt
 8976  8976 35904 output2.txt
 8983  8983 35932 total
```

7行出力するのに4096バイト読んじゃったから、足しても元に戻らない。

なお、`head(1)`の実装によっては頑張って無駄な読み込みを避けようとするものもあるようだ。が、絶対保証できるかというとパイプがseekで読み戻せないと厳しい気がするのでkernel依存の気がする。

## 間違いではないが難のある回答

### head -n 負の数

```sh
head -n  ${x} input.txt > output1.txt
head -n -${x} input.txt > output2.txt
```

これはcoreutilsの拡張機能だ。POSIXを逸脱しており、移植性に問題がある。

### wc; head; tail

```sh
x=1024
y=$(wc -l input.txt)
z=$((${x} - ${y}))
head -n ${x} input.txt > output1.txt
tail -n ${z} input.txt > output2.txt 
```

これは入力ファイルを3回スキャンしている。入力がめちゃくちゃ大きい時にペナルティが大きい。

### split その2

```sh
split -l ${x} input.txt output
mv outputaa output1.txt
cat output?? > output2.txt
rm output??
```

上の方で `split(1)` は要求仕様を満たさないとしたが、切りすぎてるだけなので、あとからまた混ぜればいいじゃんという発想はあり得る。

上記のようにcatで後半を混ぜればレギュレーション通りの結果は得られる。ただし入力を二回スキャンすることになり、無駄ではある。

### q

```sh
q -k "SELECT * FROM input.txt LIMIT ${x}" > output1.txt
q -k "SELECT * FROM input.txt WHERE ROWID > ${x}" > output2.txt
```

`q(1)`は、処理中にインメモリDBを作っているので、メモリに乗りきらない入力に対して不適切である。

あとawkがNGってレギュレーションなのにSQLがOKとするというのはちょっとずるい。

## 文句のない回答

### csplit

```sh
csplit -f output input.txt $((${x} + 1))
```

`csplit(1)`はPOSIXに古くからあるコマンドであり移植性が高い。普通はファイルを正規表現で切るという使い方で解説されていることが多いが、行番号で切ることもできる。ただ+1する必要があるのがポイントか。

### シェルのreadで

```sh
n=0
x=1024
while IFS= read -r line || [ -n "${line}" ]; do
    if [ ${n} -lt ${x} ]; then
        output=output1.txt
    else
        output=output2.txt
    fi
    n=$((${n} + 1))
    echo ${line} >> ${output}
done < input.txt
```

いくらdashの機能が貧弱とはいえこのていどのシェルスクリプトは実現可能である。
VB.NETからInterSystems ObjectScriptをクラスとしてシームレスに扱う方法

この方法では、ObjectScriptで作成した関数を含めて、VB.NETの記述で完結することができます。SQLの記載の必要のないデータベース運用が可能です。

ObjectScript（Cache’、Studio）側の準備
→前回の（ActiveXの記事）を参考に、クラスを生成してください

VB.NET側の準備
1:参照の追加
プロジェクト→参照の追加から、DotNetgatawayss64と、InterSystems.Data.CacheClient.dllのふたつを参照する。（ファイルの所在は画像のパスを参照して参考にしてください）
![20180827-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/f974dd8f-1f7d-855b-9155-f69b0dd086d4.png)

2:Object Bindingの追加
C:\InterSystems\TryCache\dev\dotnet\bin\v2.0.50727\CacheNetWizard.exe
をツール→参照に追加する。
![20180827-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/b4c3563b-8a29-c1b1-2380-d9ab7bf6a347.png)

3:Bindingコードの出力
Cache'に接続し、ここではUSER領域を開いている。出力言語をVBにし、ファイルの出力先を指定（ここでは、ObjectBinding.vbとした）、インポートするクラス（＝テーブル）を＞で右の列に送り、Generateを押すと、ファイルが生成される。
![20180827-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/b7b98813-5aa5-ae0c-c616-fc07a361796f.png)
生成されたファイルを、プロジェクトエクスプローラ右クリック→追加→既存の項目から読み込む。
![20180827-5.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/d15a077f-4c3b-d5fa-c17f-bc1cba298775.png)

4:VB.NETでプロジェクトを作成し（ここではフォームアプリケーション）、Button1を作って、次のように記述すればOK。（冒頭にImports InterSystems.Data.CacheClientを呼ぶこと）Log Fileは、下の例によらず、好きな場所を指定してください。User、PasswordはCache'で使っているものを各自入力してください。プログラムを動かすと、フォームのボタンを押せばDBへの書き込みができます。

```visualbasic:Form1
Imports InterSystems.Data.CacheClient

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '接続の確立
        Dim cacheConnectStr As String = "Server = localhost; Port=1972;" +
               "Log File = C:\VSProject\NewCarte\NewCarte\NewCarte\bin\NewCarte.log; Namespace = USER;" +
               "Password = password; USER ID = userid"
        Dim cnCache As CacheConnection = New CacheConnection(cacheConnectStr)
        cnCache.Open()

        'インスタンスの生成（レコードを作る）
        Dim d As User.Main.NewClass2
        d = New User.Main.NewClass2(cnCache)'ObjectScriptの表現と同じ記法で表現できます

        d.a = "20180704" 'ここでNewClass2は、a,b,c(いずれも%String)のProperty
        d.b = "ODB Lecture"
        d.c = "Additional"
        d.Save() 'データをCache'DBに書き込み
        d.Close()
        d.Dispose()

        cnCache.Close()

    End Sub
End Class
```
初心者向けActivityLifecycle

#対象者
Android超初心者

#この記事はなに？
Android学習時にわかりにくいな、と思ったActivityLifecycle中心の情報まとめ。

#本題
##そもそも守る必要なんてあるの？？
簡単に言ってしまうと、ActivityLifecycleを守らないと、よく落ちるアプリが出来上がります。画面の初期化のタイミングが想定と違ったり、破棄のタイミングがやたら早くて存在しない参照にアクセスしてしまったり・・・そういうことが無いように、この図に沿ってコーディングしましょうね！という取り決めがActivity Lifecycleの主題です。

##Activity Lifecycle
<font color="red">**『Activityが生まれてから死ぬまでの処理の順序』**</font>のこと。
ちょっとググると死ぬほど出てきますが、それだけ重要だという証。

![activity_lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/255401/aeb847c3-d286-c522-f5c8-fc211bcf3a8b.png)

へ～。この順序でイベントが呼ばれるんだ～。

**詳細を覚える必要はありません。だって初心者だもん。**
大まかな役割をペアで覚えましょう。

| ペア | タイミング | 役割 |
|:-:|:-:|:-:|
| onCreate, onDestroy | 画面の生成、破棄 | 画面の処理に必要なインスタンスの生成、取得、破棄 |
| onStart, onStop | 画面の準備開始、停止 | 画面の表示に必要なインスタンスの初期化 |
| onResume, onPause | 画面の表示、背面へ | 画面の表示に必要な処理の開始、停止 |
|onRestart|画面の再表示|画面の再表示に必要な処理の開始|

onCreateでViewを取得したり、何かのクラスをnewしたりする。
onDestroyでインスタンスの参照を破棄する。

onStartで取得したViewにイベント登録したり変数を初期化したりする。
onStopでイベントや変数の参照をリセットする。

onResumeで画面表示時に実行したい処理を動かす。
onPauseで画面表示時に実行したい処理を止める。

よく例文で全てをonCreateで書いていることがありますが、あれはあくまで簡略化のためにそう書いているだけ。例えば図を見れば分かる通り、**onCreateは本当に最初の一回しか呼ばれない**ため（onRestartを通る）、画面表示に必要な初期化をその中でしてしまうと、別画面から戻ってきた時などに初期化が行われず、痛い目を見ることになります。

##Activity Stack
<font color="red">**『別画面を呼び出した時、今の画面の上に置かれる。』**</font>
![diagram_backstack.png](https://qiita-image-store.s3.amazonaws.com/0/255401/2dfc039d-bd88-e5e2-1ca7-4eeb70d31337.png)

黄色の半透明エリア「Foreground activity」がユーザに見えている画面。

Activity1からActivity2をStartすると、Activity1は背面に周りActivity2が上にStackされて見えるようになります。
一番上のActivityをfinish()すると、その下に置かれたActivityが表示されます。

##アプリはいつ死んでもおかしくない
<font color="red">**『防ぐことの出来ない突然死が普通に起こりうる』**</font>

![life.JPG](https://qiita-image-store.s3.amazonaws.com/0/255401/8370ac34-f8bd-c698-c87e-c8c8deadb8cf.jpeg)

**別アプリ等でメモリが足りなくなった場合、予告なくアプリのプロセスはkillされます。再度ユーザが立ち上げ直す必要があります。**と、ライフサイクルに記載されています。なんて恐ろしい・・・((((；ﾟДﾟ))))

図の通りonDestroyなぞ通らないので、onDestroyに終了処理書いちゃえ！なーんてことをしてしまうと、**OSからkillされた時大変なことになってしまう**ので気をつけましょう。

##startActivityForResult
<font color="red">**『戻り値付きのActivity開始』**</font>
使い方はググれば出てくるかと思いますが、startActivityForResultで呼び出したActivityをfinishすると、元画面のonActivityResultが呼ばれるというものです。
大事なのは**元画面に戻る際の順番**。


| 画面 |イベント|
|:-:|:-:|
| 次画面 | finish()| 
| 次画面 | onPause| 
| 次画面 | onStop| 
| 元画面 | onActivityResult|
| 元画面 | onRestart|
| 元画面 | onStart|
| 元画面 | onResume|

onActivityResultは**元の画面に返ってきた時、Start系のイベント処理よりも前**に呼ばれます。
onPause辺りで適当にインスタンスを破棄していたりすると・・・？

#まとめ
ActivityLifecycleはActivityを起動した際に呼ばれるイベントの順番で、しっかりと状態に対応した記述をしないと、ふとした瞬間に落ちるアプリが出来上がるのでしっかり覚える必要があります。
Android初心者がググる前に見たい記事

# 対象者
Android超初心者

# この記事はなに？
Android学習時、この辺の単語の意味がわからないから調べる必要があり、時間を浪費してしまったなという情報まとめ。

# 本題
##Activity
<font color="red">**『1つの画面とその動き』**</font>のこと。
activity_○○.xmlに画面レイアウト、
○○Activity.javaでバックグラウンド処理を記載して１セット。
画面レイアウト（.xml）はAndroid特有のタグや属性が多いので、必要に応じて調べればOK！
バックグラウンド処理（.java）は画面に対する操作、別画面の呼び出しなどを担当する。

##Intent
<font color="red">**『画面間のデータ受け渡し用入れ物』**</font>のこと。
``this.getIntent()``　でその画面のIntentをいつでも取得可能。
別画面（＝Activity）を表示する際、データを渡したい場合「Intent」にセットして渡す。

##R.Java
<font color="red">**『リソースに自動でIDを振って管理してくれるヤツ』**</font>
Activityにボタンを配置したり、プロジェクトに画像等のリソースを置いたりした時、AndroidStudioが自動で追記してくれる。えらい。
「R.id.sampleBtn」や「R.drawable.sampleImg」等、配置した結果自動生成されたIDを指定することで、コード内でそれが使えるようになる。

##android:IDの+
<font color="red">**『+が付いていると、R.Javaに自動で登録される。』**</font>
例　``android:id="@+id/sample_button"``
付いてないと登録されない。
必要性を理解するまで+は付けてお勉強するが吉。

##AndroidManifest.xml
<font color="red">**『このアプリにはどんな情報がありますよという宣言』**</font>
このアプリにはこんなコンポーネント（Activity, Service等）があり、メイン画面はここで、このようなSDKを使い・・・といった情報が記載されていて、Android側はそれを見て色々する。
**ぶっちゃけ初心者が覚える内容じゃないけどとても大事**なので、必要が来たらそのときに勉強して覚えておこう、ということがわかっていればOK。


##strings.xml
<font color="red">**『デフォルトで用意されている文字列定義リソースファイル』**</font>
Activityに文字列を直書きするとAndroidStudioに怒られる。
これからここQiitaでブログも兼ねていこう

これからアウトプットをするにあたってQiitaを活用することにしました。

場違い感な記事も多々あるかと思いますがご了承ください。


なるべく公開する以上は有益なものにしたいとは思っていますが、最初はたぶんアウトプットという行為自体を習慣化することが目的でもあるので技術的な話はない、ないし薄い記事ばかりになると思われます。


さて、アウトプットしてくぞ～～～

参考図書:アウトプット大全(さらっとしか見てない。アウトプット:インプット＝7:3にしろ！というのはわかった。)
超初見者による超簡単カウンターアプリ。（レイアウト無視）


import UIKit

class ViewController: UIViewController {
    
    
    @IBOutlet var countLabel: UILabel!
    
    var resultBox = 0
    

    override func viewDidLoad() {
        super.viewDidLoad()
        countLabel.backgroundColor = UIColor.blue

    }

    @IBAction func puls(_ sender: Any) {
        
        resultBox +=  1
        
    // countLabelのtextに整数を文字列に変換して入れる事
        countLabel.text = String(resultBox)

    }
    
    @IBAction func minus(_ sender: Any) {
        
        resultBox -=  1
        
        countLabel.text = String(resultBox)

    }
    
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

![スクリーンショット 2018-08-27 0.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/281121/dc2782d9-2c1f-6f89-86f0-657b915d54cc.png)
GPSの研究　その43

#概要
gpsを理解したかった。
jsdoでnmeaをジェネレートしてみた。

#ライブラリー

https://github.com/ohisama/node-nmea

#サンプルコード

```
var s;
s = NMEA.encode("GPGGA", {
	date: new Date(Date.UTC(98, 08, 13, 12, 35, 19.0)),
	lat: 48.1173,
	lon: 11.522066,
	fix: 1,
	satellites: 8,
	hdop: 0.9,
	altitude: 545.4,
	aboveGeoid: 46.9
});
alert(s);

```

```
var s;
s = NMEA.encode("GPRMC", {
	date: new Date(Date.UTC(98,8,13,8,18,36)),
	status: 'A',
	lat: -37.86083,
	lon: 145.12266,
	speed: 0,
	course: 360.0,
	variation: -11.3,
	mode: 'E'
});
alert(s);

```


#成果物

http://jsdo.it/ohisama1/WQVQ
http://jsdo.it/ohisama1/mEe4

以上。
VisualStudioだけなぜか激重を解決する

私だけの環境かもしれないので　皆様の意見あれば

環境：Windows10 Pro。HyperThreading on 、Docker for Windows on、サードパーティーウイルスソフト無し

現象：VisualStudioシリーズを起動するとWindowsの描画が重くなる。確認したのは VS2017の各エディション

症状を詳しくみると、通常時はとくに重くないが
VisualStudioを起動すると、リストビュー等が 耐えられないぐらい遅くなる
また　一度VisualStudioを起動すると、エクスプローラーのディレクトリツリーの表示が耐えられなく重くなる

メモリ使用量もうたがったが10%程度しか使っておらず、EnterpriseにしてもExpressにしても同じ

解決；
Windowの綺麗さとかまったくどうでもよかったので、Windowの視聴効果をすべてOFFにし、ビデオに負担かからないようにしていた
その部分が怪しとおもったので、 コンピュータに応じて最適なもの・・　にチェックし　ONにした
すると　今までの現象は全て解決し
軽くて問題のない VisualStudioが手に入った
iTerm2 — 画面分割した後にペインを移動するショートカット ( Command + {  ) ( Command + } )

## 心ばかりの画像

色が濃いのが選択中のペイン。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f07e8b56-c705-de42-cdc9-b3d89ccc9b7a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/39ae0ec8-0a71-5811-9334-af47da9b1377.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0b78ea2d-54e3-f814-2193-1497a2b12a6c.png)

## その他

- ペインを開く `Command + D`
- ペインを閉じる `Command + W`

## Ref

- [Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」するためでOK - Qiita](https://qiita.com/YumaInaura/items/e83df9a45836f7b2929b)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Teraterm マクロの変数にコマンド実行結果を格納

[元ネタ](https://m.chiebukuro.yahoo.co.jp/detail/q1247390747)

```
sendln 'uname -n'
recvln
recvln
name=inputstr
wait '#'
```

一回目のrecvlnでエコーバックを読み捨て
ニ回目のrecvlnでコマンドの実行結果を取得
inputstrを変数に格納
オブジェクトを関数にシェアしてしまった

早速ですが、以下が問題再現のコードです、python version = 2.7.10


```python
def test(miracle=[]):
    print 'mirale show up'
    
    miracle += [1]
    return miracle

target = [1, 2, 3]
other_thing = test(target)

print other_thing
test(other_thing)
print other_thing
```

アウトプット

```
miracle show up
[1, 2, 3, 1]
miracle show up
[1, 2, 3, 1, 1]
```

解説：testという奇跡を起こす関数があり、渡された変数に一個エレメントを追記します。

test関数を二回目呼び出す時、戻り値を受け取っていないにも関わらず、other_thingが変更されました

これはtestの関数がmutableなother_thingへの参照を持って、変更をして、スコープ外のオブジェクトに副作用を与えてしまったからです。
既存のgitリポジトリを他gitホスティングサービスのリポジトリへの移行方法

## やりたいこと

githubで今まで管理していたものをbitbucketやbacklogなんかで管理するように変更する

## 方法

他のgitホスティングサービスでリポジトリを作成しておく

```
$ cd リポジトリまでのパス

$ git remote set-url origin {他ホスティングサービスで作成したリモートリポジトリのURL}
```

以上です。
Vue.jsの単体テスト実行が遅いのをなんとかしたい

## 概要

vue-cliで作成したプロジェクトで```yarn test:unit``` ってすると単体テストが走って便利なのですが、1度きりの実行だしフルコンパイルが毎回かかるし、遅くて辛かったのでなんとかしました。


## 前提

View CLIのプロジェクト作成時に```Manually select features``` でunit testingに```Mocha``` を選択してる環境です。

package.jsonの```scripts``` に```test:unit``` が定義されているかと思います。

## 対応

```sh
> cd Vueプロジェクトのディレクトリ
> yarn test:unit --watch
# npmの場合
> npm run test:unit --watch
```

はい。

``` --watch``` を足してあげると、コンパイルとテスト後に完了せず、待ち受けてくれます。
ソースに変更があると、該当のテストだけ実行してくれるっぽいです。
コンパイルも```vue-cli-service serve``` と同様に初回以降は早いです。

package.jsonに追加してしまうのもありだけど、全てテスト実行したいときに悩ましいです。

```json:package.json
-   "test:unit": "vue-cli-service test:unit"
+   "test:unit": "vue-cli-service test:unit --watch"
```


## 比較

### ```--watch``` がないときー

```sh
 WEBPACK  Compiled successfully in 25350ms

 MOCHA  Testing...

  Hoge.vue
    ✓ renders props.hoge when passed (132ms)

  HelloWorld.vue
    ✓ renders props.msg when passed (92ms)

  2 passing (298ms)

 MOCHA  Tests completed successfully

Done in 87.52s.
```

### ```--watch``` があるときー(初回)

```sh
 WEBPACK  Compiled successfully in 25340ms

 MOCHA  Testing...

  Hoge.vue
    ✓ renders props.hoge when passed (126ms)

  HelloWorld.vue
    ✓ renders props.msg when passed (67ms)

  2 passing (862ms)

 MOCHA  Tests completed successfully

(終わらずに待機)
```


### ```--watch``` があるときー(初回以降、1ファイル変更)


```sh
 WEBPACK  Compiled successfully in 786ms

 MOCHA  Testing...

  HelloWorld.vue
    ✓ renders props.msg when passed (61ms)

  1 passing (111ms)

 MOCHA  Tests completed successfully

(終わらずに待機)
```
はい。快適になりました。

それでは、良きVue.js開発ライフを^^


Vue.js+TypeScriptで開発するときの参考記事まとめ
https://qiita.com/kai_kou/items/19b494a41023d84bacc7
Mac + ghq + peco — GithubのURLをショートカットで開けるようにする例


## 動作例

### 選ぶと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/967d0492-535e-6c6a-6c6c-f02b93145d1b.png)

### 開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8d11db87-c85f-3ce0-a4f7-e06267a4d302.png)

## 動作環境

Mac + zsh + ghq + peco


## 手順

- ghq で リモートレポジトリを管理しておく
  - こんな感じでレポジトリを ghq 管理に入れるだけ ( `ghq get https://github.com/YumaInaura/zsh/`)
- peco で インクリメンタルサーチする
- zsh の bindkey でショートカットを作る

## 例

`~.zshrc` に以下を追加

```sh
_ghq_open() {
  if [ ! $(which peco) ]; then echo "You need peco" && exit 1; fi

  local remote_repository_web_url=$(ghq list | sed -e 's/^/https:\/\//g' | peco --query="$BUFFER")

  if [ ! -z "$remote_repository_web_url" ]; then
    BUFFER="open $remote_repository_web_url"
    zle accept-line
  fi
}

zle -N ghq-open _ghq_open

bindkey '^G^O' ghq-open
```

`ghq list` で得られる一覧の先頭に `https://` を付けているだけ

## Versions

- Mac OS High Sierra
- zsh 5.5.1 (x86_64-apple-darwin17.5.0)
- ghq version 0.8.0
- peco version v0.5.3 (built with go1.10)

## Links

- https://github.com/YumaInaura/zsh/blob/1ded16bdb56097d1c48370f4e4fa0a88a727e39f/widgets/ghq#L20-L34








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Reactを学ぶ中で必ず押さえておきたいこと①

## 1. はじめに

スマホアプリを開発するにあたり、**React Native**が流行ってきているようですね。
React Nativeに触れる前に、まず<font color="red">**React**</font>について勉強しとかないといかんなということで、記事にまとめておきたいと思います。


## 2. Reactとは

開発元はFacebookで、一言でいうと<font color="red">**UI部品を作るためのjavaScriptライブラリ**</font>になります。
Facebook、Instagram、GitHub ATOM、Twitterモバイル等で使用されています。

## 3. Reactの特徴

#### 3-1. Just the UI

フレームワークでなく、あくまでUIを構築するためのライブラリになります。MVCでいうVのみ機能を提供します。
ライブラリに属するため、Angular.jsやBackbone.jsと<font color="red">**一緒に使用することが可能**</font>です。

#### 3-2. Virtual DOM

実際のDOMと対となる構造体を用意し、その構造体に対して処理を行います。
その結果生まれた差分だけを実際のDOMに反映することで、<font color="red">**UI表現の高速化**</font>を実現しています。

#### 3-3. Data flow

データの変更に応じてUIの変更が行われる、単方向データバインディングの仕組みが利用されています。
そのため、コードの複雑性を避け、<font color="red">**シンプルな設計が可能**</font>となります。
(ちなみにVue.jsは双方向データバインディング)

## 4. Reactで作られたWebアプリ

＜[Made with React](https://madewithreact.com/)＞

上記のサイトで、React(もしくはReact Native)で作られたWebアプリがギャラリー形式で掲載されています。Reactを使うとこんなものが作れるんだーとイメージできるかもです。

## 5. Reactの環境構築

#### 5-1. Node.jsのインストール

Reactの環境構築には、Node.js(Ver4以上)がインストールされている必要があります。
Node.jsのインストール方法については以下を参照ください。

- [Node.jsを学ぶ中で必ず押さえておきたいこと](https://qiita.com/i-tanaka730/items/79e8e2c3ceb2bde51436)

#### 5-2. Reactのインストール

以下のコマンドを実行するだけです。

```
npm install -g create-react-app
```

## 6. アプリの作成とサーバーの起動確認

#### 6-1. アプリの作成

以下のコマンドを実行します。

```
create-react-app test-app (作成したいフォルダ名)
```
すると以下のような構成でフォルダができます。

![test-app.PNG](https://qiita-image-store.s3.amazonaws.com/0/247638/65c55cc0-995b-e2cc-61e2-1298d44d3021.png)

#### 6-2. サーバーの起動確認
作成したフォルダへ移動し、サーバーを起動します。

```
cd test-app  // 移動して
npm start    // 起動！
```
ブラウザにて http://localhost:3000/ にアクセスします。
以下のような画面が表示されればOKです。

![起動.PNG](https://qiita-image-store.s3.amazonaws.com/0/247638/d97e5cd6-7d48-9394-0136-2a97f7683e1f.png)

## 7. IDE

ReactのIDEは<font color="red">**Visual Studio Code**</font>がおススメです。
Visual Studio Codeでは以下のようにしてデバッグを行うことができます。

#### 7-1. Debugger for Chromeをインストール

Visual Studio Codeの拡張機能メニューから、**Debugger for Chrome**をインストールします。

![vdcode.png](https://qiita-image-store.s3.amazonaws.com/0/247638/86cb3915-f25a-05a5-01ad-77e89ea223f6.png)

#### 7-2. launch.jsonの設定

**launch.json**を開き、以下のように設定します。
(url、webRootは環境に合わせて書き換えてください。)

![設定.png](https://qiita-image-store.s3.amazonaws.com/0/247638/7b53bf7e-7663-64e0-8f87-1037af86a907.png)

#### 7-3. デバッグする

サーバーが起動していなければ起動してください。
その後以下のボタンからデバッグが行えます。(メニューから、**デバッグ** ⇒ **デバッグの開始**でもOK)
もちろんブレークポイントもはれます。
てかデバッグ実行と同時に起動することもできるのか？？？

![デバッグ.png](https://qiita-image-store.s3.amazonaws.com/0/247638/c999d760-81ed-3936-67db-2e7110594691.png)


#### Reactide

React専用のIDE＜[Reactide](http://reactide.io/)＞も触ってみましたが、開発中であるためか、New Projectした時点で応答なしになりました。。。正式にリリースされるまでは使用は控えた方がいいかもです。
何か情報を持っている方は展開頂けると嬉しいです。

## 8. おわりに

まだ構文はなかなか慣れれずにいます^^;

- [Node.jsを学ぶ中で必ず押さえておきたいこと](https://qiita.com/i-tanaka730/items/79e8e2c3ceb2bde51436)

で勉強したことと合わせて、Node.js + Reactなアプリを作ってみたいかと思います。
PHPでLINE Botを作ってみた

# 概要
PHPでLINE Botを作成した際のメモです

# 準備
・下記でアカウントを登録し、チャネルを作成する。
https://at.line.me/jp/

・Webhook URLにソースのURL（https）を設定する。

# メッセージの取得


```php
$json_object = json_decode(file_get_contents('php://input'));
 
// 返信用トークン
$replyToken = $json_object->{"events"}[0]->{"replyToken"};
// 受け取ったメッセージのメッセージタイプ
$message_type = $json_object->{"events"}[0]->{"message"}->{"type"};
// ユーザーID
$userId = $json_object->{"events"}[0]->{"source"}->{"userId"};
```

# 返信するデータの作成
・テキストメッセージ

```php
$post_data = [
    "replyToken" => $replyToken,
    "messages" => [
        "type" => "text",
        "text" => {送信するメッセージ}
    ]
];
```

・画像メッセージ

```php
$post_data = [
    "replyToken" => $replyToken,
    "messages" => [
        'type' => 'image',
        'originalContentUrl' => {画像パス},
        'previewImageUrl'    => {プレビュー画像パス}
    ]
];
```

・動画メッセージ

```php
$post_data = [
    "replyToken" => $replyToken,
    "messages" => [
        'type' => 'video',
        'originalContentUrl' => {動画ファイルパス},
        'previewImageUrl'    => {プレビュー画像パス}
    ]
];
```

・スタンプ
下記のスタンプを送信する事ができる
https://developers.line.me/media/messaging-api/sticker_list.pdf

```php
$post_data = [
    "replyToken" => $replyToken,
    "messages" => [
        'type'      => 'sticker',
        'packageId' => {STKPKGID},
        'stickerId' => {STKID}
    ]
];
```
・位置情報

```php
$post_data = [
    "replyToken" => $replyToken,
    "messages" => [
        'type'      => 'location',
        'title'     => 'タイトル',
        'address'   => '住所',
        'latitude'  => {緯度},
        'longitude' => {経度}
    ]
];
```

# メッセージの送信
```php
//curl実行
$ch = curl_init("https://api.line.me/v2/bot/message/reply");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json; charser=UTF-8',
    'Authorization: Bearer ' . {LINE MessagingAPIのKey}
));
$result = curl_exec($ch);
curl_close($ch);
```
[自分メモ]unityのAndroidプラグインをaarで書き出す方法

なんとなくいろんな書き方がありすぎてわかりづらいなのでメモ

まずはここにあるjarファイルが必要

```txt:
C:\Program Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Varitations/mono/Release/Classes/classes.jar
```

libディレクトリ内に配置をする。

app/build.gradleに下記を追記する

```txt:
android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        //これは入れたライブラリと同じ名前（たまにリファレンスでclasses-app.jarとかがあるのはその為）
output.packageLibrary.exclude('libs/classes.jar')
    }
}
```


普通にNew projectを作成でここまで来てると、
app/build.gradleが

```txt:
apply plugin: 'com.android.application'
```

になっていて、libraryVariantsがありませんよー。となるので、

```txt:
apply plugin: 'com.android.library'
```

にします。new moduleとかで作ってたら多分問題ない部分。

manifestとかではactivityとかあったら消しておく。
結局必要なのは、uses-permissionとかだけ

buildからrebuild projectとかでリビルドする。

build/aar内にaarが出来てるのでunityの

```txt:
Plugins/Android/
```
配下に置く。

使えるようになってるはず。

でcompile sdkのバージョンが違うとエラーが起きてしまうので、合わせる。
(unityの方をlatestにしてたらダメだった。)

この部分については、配布されてるライブラリ的なのは多分違うsdkでも動いているので要確認

それで完成。いろんな人のいろんな書き方があってみんな何を見てるのだろうかとも悩むが参照が増えれば増えるほど、何を書いたらいいのか分からなくなるしエラーが起きるんだけど、どこで発生してるのか不明なので、、自分メモですが、取り急ぎ、今現在、これでaarでunityと連携できてた方法
peco — 選択肢にないクエリ入力をしたときに文字が消える対策 ( --print-query )

v0.5.3 からオプションが追加されている :tada: 

>New --print-query option prints out the query upon successful exit

https://github.com/peco/peco/blob/c335455888eb4c1dc98d1cbd86d29ed1f970ffb7/Changes#L6

使い方に癖がありそうなので注意。(後述)

## 動作

選択肢に A B C があり、 D をユーザー入力して完了した場合

### `--print-query` がないとき

入力したDが消える

```
$ echo "A\nB\nC" | peco --query=D
$
```

### `--print-query` があるとき

入力したDが消えない

```
$ echo "A\nB\nC" | peco --query=D --print-query
D
```


## 注意

`--print-query` を付けて、なおかつ選択肢の中から選んだ場合、クエリと選択されたテキスト両方が、二行に分かれて出力されるようだ。

( `peco version v0.5.3 (built with go1.10)` )

```
echo "Alice\nBob\nCarol" | peco --print-query --query=B
B
Bob
```

決定内容だけを得たい場合は、最後の行だけを見るなどして対策する必要がありそう。

### 選択肢の中から選んだ場合は、その内容を出力

```
echo "Alice\nBob\nCarol" | peco --print-query --query=B | tail -n 1
Bob
```

### 空振りしたクエリ入力の場合は、クエリを出力

```
echo "Alice\nBob\nCarol" | peco --print-query --query=David | tail -n 1
David
```

## Versions

- peco version v0.5.3 (built with go1.10)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
botでslackに貼られたfileを受け取る（Ruby）

# やりたきこと
slackに貼られたfileをbotで受け取って処理する
ex)特定チャンネルに貼られたfileをs3にputする 

# bot本体
以下の何かしら処理のところに色々書けばいろんな機能が実装できます。
fileはdownload用URLとtokenで取ってくることができます。

```ruby:main.rb
require File.dirname(__FILE__) + '/chatops_file'

begin
  chatops_file = ChatopsFile.new
  chatops_file.slack_bot
rescue StandardError => e
  #エラーハンドリング
end
```

```ruby:chatops_file.rb
require 'slack-ruby-client'

class ChatopsFile

  # 初期化
  def initialize
    Slack.configure do |conf|
      conf.token = 'xoxo-***************'
    end
  end

  # botのメイン処理
  def slack_bot
    client = Slack::RealTime::Client.new

    client.on :message do |data|
      file = data.files

      if file
        file = file[0]
        filetype = file.filetype
        mimetype = file.mimetype
        file_name = file.name
        file_url_private_download = file.url_private_download
        event_ts = data.event_ts
        text = data.text
        user_id = data.user
        usr_name = data.display_name

        next if data.user == 'USLACKBOT'
        next if file.user == 'USLACKBOT'

        begin
          # file_url_private_downloadを使って何かしら処理
        rescue => e
          # エラーハンドリング
        end
      end
    end

    client.start!
  end

end
```

# おまけ：fileをS3にputしてみる
処理の部分はbotから切り離してlambdaで実装していたので、
pythonでコードを書いています。

```python:lambda_function.py
import os
import requests
import shutil
import boto3

slack_token = "xoxo-****************"

def handler(event, context):
    # ここはlambdaを起動する時のメッセージをパースしています
    event_dict = json.loads(event["body"])
    channel_name = event_dict["channel_name"]
    req_usr = event_dict["req_usr"]
    file_name = event_dict["file_name"]
    file_url = event_dict["file_url_private_download"]

    try:
        tmp_path = "/tmp/" + file_name
        s3_key = "file_s3_upload/" + file_name
        res = requests.get(file_url, headers={'Authorization': 'Bearer %s' % slack_token}, stream=True)
        with open(tmp_path, 'wb') as file:
            shutil.copyfileobj(res.raw, file)
        s3_client.upload_file(tmp_path, 'test_bucket', s3_key)
    except Exception as e:
        print(e)
        raise e



def s3_client(iam_user_key):
    s3 = boto3.client('s3', region_name="AWS_REGION",
                      aws_access_key_id='AWS_ACCESS_KEY',
                      aws_secret_access_key='AWS_SECRET_KEY'
                      )
    return s3
```
[python] print()でデータをファイルに書き込む

# 概要
pythonの`print()`を使ってファイルにデータを書き込めるよって話。

# コード
## ふつうに書く場合
ふつうに書くとたぶんこんな感じ。

```python:ふつう
import codecs

gorilla = "私はゴリラです。"
with codecs.open('gorilla.txt', 'w', 'utf-8') as f:
    f.write(gorilla)
```

## print()を使う場合
`print()`を使うとこんな感じになる。

```python:print()を使う
import codecs

gorilla = "私はゴリラデス。"
print(gorilla, file=codecs.open('gorilla.txt', 'w', 'utf-8'))
""" ファイルの中身 
私はゴリラデス。
"""
```
こちらの公式ドキュメントー＞[組み込み関数](https://docs.python.jp/3/library/functions.html#print)に詳細は書いてあります。
そもそも`print()`は以下のようになっています。
*print(*objects, sep='', end='\n', file=sys.stdout, flush=False)*

`print()`はobjectsをsepで区切りながらテキストストリームfile（デフォルトではsys.stdout）に書き出され、最後にendの文字列が続きます。
**ここでfile引数はwriteメソッドをもつオブジェクトでなければなりません。**

つまり、writeメソッドを持つ**ファイルオブジェクト**を出力先として**file引数**に渡すことにより`print()`を使ってデータをファイルに書き込めるみたいです。

下のプログラムはリストの中身を改行文字で区切りながらファイルに書き出し、最後にendの文字列で終わります。

```python:print()を使う
import codecs

gorilla = ["私はゴリラデス。", "ウホ", "ウホ"]
print(*gorilla, sep="\n", end="\nうっほー", file=codecs.open('gorilla.txt', 'w', 'utf-8'))
""" ファイルの中身
私はゴリラデス。
ウホ
ウホ
うっほー
"""
```

---
関連記事：[pythonの出力文いろいろまとめてみる。](https://www.pytry3g.com/entry/python-print#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80)
Zsh —  Mac で Option キーを bindkey に使う

おそらくOptionキーそのものをバインド出来るわけではなく、Optionキーとの組み合わせで入力される「文字」に対してのバインドが出来るっぽい。

## 例

Mac で `Option + a` のキーをバインドする例。

```
bindkey å accept-line
```

( a ではなく å )

## どうやって探したか？

Ma で `Option + a` を入力すると `å` が表れる。
たんにこの文字をバインドキーとして使っただけ。

## その他の文字

同じやり方で、その他の文字もバインド出来るはず。

```
# 1234567890-^\
¡™£¢∞§¶•ªº–≠\

# qwertyuiop@[
œ∑´®†¥¨ˆøπ“‘

# asdfghjkl;:]
åß∂ƒ©˙∆˚¬…æ«

# zxcvbnm,./_
Ω≈ç√∫˜µ≤≥÷`
```

## 非英語の文字のバインド

こんな事もできるんだ。

```
bindkey -s "日本語" "Japanese"
```

When input "日本語" then it will be replaced with "Japanese".


## Versions

- zsh 5.5.1 (x86_64-apple-darwin17.5.0)

## Ref

- [ANSI escape sequence for "Command" key? - Apple Community](https://discussions.apple.com/thread/941455)

## Links

- [Gist](https://gist.github.com/YumaInaura/27bb1f79881a63bed2fb9635cbaed73b)
- [Qiita—Japanese](https://qiita.com/YumaInaura/items/2d7a33bb9ae23a7a1479)
- [Medium—imported](https://medium.com/supersonic-generation/zsh-bindkey-with-mac-os-option-key-a39b539019ed)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
php-master-changes 2018-08-26

# 2018-08-26
## cmb69: Fix [#60494](https://bugs.php.net/bug.php?id=60494): iconv_mime_decode does ignore special characters
- https://github.com/php/php-src/commit/e29c946c29afdb0bf89c5329fcf3038448d50e17
- ext/iconv で [iconv_mime_decode()](http://php.net/manual/ja/function.iconv-mime-decode.php) が入力に無効な文字があった際に空文字列を返していた問題の修正
- false を返して NOTICE を吐くようになった

## cmb69: Fix [#68180](https://bugs.php.net/bug.php?id=68180): iconv_mime_decode can return extra characters in a header
- https://github.com/php/php-src/commit/efb86aef12ff4f8f3908ceff2844f7511f7d61eb
- ext/iconv で [iconv_mime_decode()](http://php.net/manual/ja/function.iconv-mime-decode.php) がデコード結果に余計な文字列をつける場合があった問題の修正
- テストの文字列が超日本語なのが微妙に面白かった
Macでコンフリクト時に単語差分も出すマージツール「DiffMerge」

## はじめに
今までgitのコンフリクトを解消するマージツールとしてvimdiffを使っていたが、[diffchar.vim](https://github.com/rickhowe/diffchar.vim)を使っても*単語ごとの差分*をうまく表示してくれないので、csvなどのマージの際にコンフリクトした箇所をわざわざ違うdiffツールを使って差分を確認するなどの面倒な作業が発生した。
そこで、単語ごとの差分を出してくれるマージツールを探すことにした。
Windowsであれば[WinMerge](https://winmergejp.bitbucket.io/)という有名なツールがあるが、Macだと意外とよいのが見つからない。ちなみに自分のPCのOSは以下。

> macOS High Sierra 10.13.6

探してみたところ、[DiffMerge](https://sourcegear.com/diffmerge)というツールがよさそう。

## ダウンロード

[ダウンロードページ](https://sourcegear.com/diffmerge/downloads.php)から「OS X 10.6+ Installer (Intel)」をダウンロード。
あとはpkgファイルを開いてインストーラの指示に従うだけ。

## gitの設定

### マージツール設定
```sh
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd 'diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"'
git config --global mergetool.diffmerge.trustExitCode true
git config --global mergetool.keepBackup false
```

### diffツール設定
こちらの設定はdiffにもDiffMergeを使いたい場合のみでOK。

```sh
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'diffmerge "$LOCAL" "$REMOTE"'
```

## DiffMergeの日本語設定
デフォルトのままだと日本語が文字化けするので、以下を参考に文字コードを設定。

[ソースコードの差分比較にDIFFMERGEを日本語対応して使ってみる](https://web.archive.org/web/20170719112900/http://blog.a4works.co.jp/archives/279)

## 結果
![* test_LOCAL_61230.md, test_BASE_61230.md, test_REMOTE_61230.md - SourceGear DiffMerge 2018-08-27 02-55-28.png](https://qiita-image-store.s3.amazonaws.com/0/169996/8e669801-d7be-cfca-efc4-19e9064a3cbd.png)
単語の差分がちゃんとわかる！
あとは真ん中のビューに最終的に適応したい差分を取り込み、保存すればOK。

## 参考
* [smoll/USING-DIFFMERGE.md](https://gist.github.com/smoll/2aa1028a84c002f1af778a5387d6e125)
* [ソースコードの差分比較にDIFFMERGEを日本語対応して使ってみる](https://web.archive.org/web/20170719112900/http://blog.a4works.co.jp/archives/279)
* [[Macプログラミング]「DiffMerge」で日本語テキストを正しく表示させる方法](http://d.hatena.ne.jp/nakamura001/20110321/1300706226)
プロジェクト作成時

#初回にやることメモ

##maven url追加
```gradle:PJ/application/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
}


task clean(type: Delete) {
    delete rootProject.buildDir
}
```

##version・applicationId設定
```gradle:PJ/build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.admin.myapplication"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.android.support:gridlayout-v7:27.1.1'
}
```

##NoActionBarに変更
```xml:app/res/values/style.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>
```
Linuxでプロセスが出力しているログの場所を調べる



#プロセスIDを調べる
例として、httpdのIDを調べる。

```ruby:
>ps aux | grep httpd
```
```ruby:
root       959  0.0  0.4 404436 16288 ?        Ss    7月31  17:12 /usr/sbin/httpd -DFOREGROUND
```

左から二番目の数字がプロセスIDとなる。今回は959。
#ログの場所を調べる

以下のコマンドを実行する。

```ruby:
>ls -l /proc/959/fd
```
```ruby:
lr-x------. 1 root root 64  7月 31 17:21 0 -> /dev/null
lrwx------. 1 root root 64  7月 31 17:21 1 -> socket:[17717]
l-wx------. 1 root root 64  7月 31 17:21 10 -> /var/log/httpd/access_log
l-wx------. 1 root root 64  7月 31 17:21 11 -> /var/log/httpd/ssl_access_log
l-wx------. 1 root root 64  7月 31 17:21 12 -> /var/log/httpd/ssl_request_log
l-wx------. 1 root root 64  7月 31 17:21 2 -> /var/log/httpd/error_log
lrwx------. 1 root root 64  7月 31 17:21 3 -> socket:[18101]
lrwx------. 1 root root 64  7月 31 17:21 4 -> socket:[18102]
lrwx------. 1 root root 64  7月 31 17:21 5 -> socket:[18109]
lrwx------. 1 root root 64  7月 31 17:21 6 -> socket:[18110]
lr-x------. 1 root root 64  7月 31 17:21 7 -> pipe:[405983]
l-wx------. 1 root root 64  7月 31 17:21 8 -> pipe:[405983]
l-wx------. 1 root root 64  7月 31 17:21 9 -> /var/log/httpd/ssl_error_log

```

ちなみに
fd=ファイルディスクリプタ
>ファイルディスクリプタとは、プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子。
ー[IT用語辞典 e-Words　ファイルディスクリプタ](http://e-words.jp/w/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF.html)
Firestore で Object の一部だけ更新する


Firestore でフィールドを Object にしていて一部のプロパティだけを更新したいということはよくあると思います。個人的に一番楽でよく使っている方法をメモしておきます。もっといい方法があったら教えてください。

例えばこんな感じの Object を格納しているとします。そして、 `hoge.piyo.fuga` の value のみを更新して、それ以外のプロパティは残したい。

```javascript
hoge: {
  piyo: {
    fuga: 'example',
    bar: 'bar text'
  },
  baz: 'foo'
}
```

以下の方法だと当然ですが意図したとおりになりません。

```javascript
DB.collection('sample').doc(id).update({
  hoge: {
    piyo: {
      fuga: 'updated'
    }
  }
})
```

こんな感じの Object になってしまいます。

```javascript
hoge: {
  piyo: {
    fuga: 'example'
  }
}
```

そこでドット区切りでプロパティの key を指定してあげます。 [\`hoge.piyo.fuga`] このように key をドット区切りで繋げていって指定すれば OK です。


```javascript
DB.collection('sample').doc(id).update({
  //[`hoge.piyo.fuga`]: 'updated'
  // なぜか Qiita のシンタックスハイライトで↑のコードを書くとエスケープで消えるのでコメントで表記
})
```

これはうまくいきます。

```javascript
hoge: {
  piyo: {
    fuga: 'updated',
    bar: 'bar text'
  },
  baz: 'foo'
}
```

ちなみに、通常の Object 表記とドット区切りのデータをコンバートするには [dot-object](https://github.com/rhalff/dot-object) という npm ライブラリを浸かると便利です。
Vue.jsとWebSpeechAPIを利用して音声文字起こし補助サイトを作った話

音声を文字起こしを補助するサイトを作ってみましたので作るまでの経緯や作ってみた感想などをずらずらと書いてみたいと思います。
Vue.js(Nuxt.js)+Firebaseでサイトを構築しているため、お金がかかったところと言えば独自ドメイン取得のところだけでした。

## サイト制作までの経緯

会議の発言を全部文字起こしする際や、誰かにインタビューを行った後に内容を文字起こしする際に使うと便利かなーと思って「モジロイ」というサイトを作ってみました。

モジロイ 現在はクローズしましたmm
※ 音声認識はPCのGoogle Chromeでしか利用できません。

書き起こしイメージ↓
![sample01.0fa31a2.png](https://qiita-image-store.s3.amazonaws.com/0/104308/c45f9c01-009a-2647-e13f-538cc06024fa.png)

最近Vue.jsを触っていたことから「Vue.jsでサイトを作りたい！」欲が高まって制作を決意しました。
どんなものを作るかで一番悩んでいたのですが、常々と課題に感じている「会議の議事録取り」に視野を当ててみました。

元々議事録を書いている時に「面倒だなー」「自動でやってくれないかなー」と常に思っていて色々調べていたのですが精度が悪かったりお金がかかるやつだったりで現実的でないものが多くて課題を感じていました。
調べていく中でWeb Speech APIを知って「逆にどこまで実用的にできる？」と気になったことからサイト制作を行いました。

実際にサイトを作って使ってみた感想としては、「音声を文字起こしする際に補助的に使えば多少早くなる可能性がある」かなーとぼんやり思いました。話し手を判別できる機能が追加されると需要が少し上がるかなと。
こちらは個人の感想で、議事録をフルに文字起こしすることがそんなにないので皆さまのフィードバックを頂けましたら幸いです。

## サイト制作までの必要となった知識

#### デザイン(HTML/CSS/JavaScript)
デザイン力が足りずに凄く頭を悩ませていました。
BulmaというCSSフレームワークの力を借りてごまかしました。Bootstranpでも良かったのですが、BootstrapはJS(jQuery)依存しているのでCSSを追加するだけで利用できるBulmaを採用しました。

#### Web Speech API
Web Speech APIについては検索すると実装例などがたくさん出てきたので、割と簡単に使うことができました。
ですが一定時間入力がないと音声認識が止まってしまったりなど少し試行錯誤を繰り返して実装する必要があったため少し時間がかかりました。

#### フロントエンド(Vue.js/Nuxt.js)
Vue.jsのフレームワークであるNuxt.jsを採用しました。
今回作成したサイトは小規模サイトであるためプレグレッシブフレームワーク(段階的に複雑さを取り入れることができる)であるVue.jsで十分だったと思います。

詳しい選択理由などはここでは割愛しますが、Nuxt.jsは学習コスト低めでかつ制約もそんなに厳しくないので終わってみて入れたことによるメリットの方がでかかったと思っています。

#### インフラ(Firebase)
調べてみたところ最近は、静的なサイトを作成するのであればNuxt.jsのソースコードをnuxt generateコマンドで静的なサイトとして書き出してFirebaseという静的サイトホスティングサービスにホスティングするというのをよく見かけるので今回自分もFirebaseを使うようにしました。

#### 画像制作
favicon.icoや、サイト内で使う画像などは自分で用意するかフリー素材を使うなどしなければならないためIllustratorなどが使えると良いかもしれません。
サイトの使い方などを文字で説明するより画像で説明した方がわかりやすいためそうしたかったのですがIllustratorなどのスキルも乏しかったため一旦諦めることにしました。

#### サイト運営
このあたりはお好みで

- アクセス解析(Googleアナリティクス)
- 広告(Google AdSense)
- ドメイン管理(ムームードメイン)

## 作成期間

元々仕事でVue.js/Nuxt.jsを触ったことがあるのと
FirabaseやGoogleアナリティクス/Google Adsense/ムームードメインも使ったことがある状態で作業を始めて
1日平均1.5~2時間かけて約1ヶ月ぐらいでできました。

## 終わってみての感想

モチベーションが最後まで保てて、形にできたので一安心しました。
Vue.js/Nuxt.jsの知識が深まったことが良かったですが、デザイン力の無さを痛感したのとVue.jsの綺麗な書き方がわからず他人に見せられない状況になっていてコーディングスキルも足りないことを学んだため、自分に今何が足りていないのかがわかったことは良かったと思います。