OmniAICreator/Qiita-1.07M huggingface dataset:
Netlifyでデプロイを止める方法はないみたい - 2019/4/2現在

## やりたかったこと
[Netlify](https://www.netlify.com/)のデプロイを途中で中断させたかったです。

止めたかった理由は、意図しないビルドの無限ループになってリソースの無駄だったからです。

## 追記：できるようになった :tada:

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Many asked for this.<br>We think they were right!<br><br>Cancel deploys with a click.<a href="https://t.co/aDYFJ5TpYn">https://t.co/aDYFJ5TpYn</a> <a href="https://t.co/FUwUOpsaik">pic.twitter.com/FUwUOpsaik</a></p>&mdash; Netlify (@Netlify) <a href="https://twitter.com/Netlify/status/1135960199427166209?ref_src=twsrc%5Etfw">June 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

公式ブログ: <https://www.netlify.com/blog/2019/06/04/introducing-cancelable-deploys/>

Thanks @peaceiris in the comment below!

## 今現在できない

Netlify公式のサポートのChrisさんのお返事によると、

> Yup, I want that to work too and our developers are working to create that functionality.  It'll be a button in the UI once it's done :)

そのため、いつか機能は付くと思います。

## 15分で自動ストップする

無限にループのビルドになってしまった人も、15分待てばデプロイは失敗で終了します。
以下のようなログが出ました。

```txt
...
2:59:37 PM: Execution timed out after 15m0s
2:59:37 PM: Error running command: Command did not finish within the time limit
2:59:37 PM: Failing build: Failed to build site
```
TreasureDataのAuthenticationsで「Google Sheets Legacy」が使えなくなるらしいので「Google Sheets」に変更する手順

# 概要
[Release Note 20190201](https://support.treasuredata.com/hc/en-us/articles/360015714974-Release-Note-20190201#Required%20Migration%3A%20Google%20Sheets%20Connector%C2%A0(aws%2Fidcf))

こちらにあるとおり、2019/03/31 以降は「Google Sheets Legacy」が使えなくなるとのことなので「Google Sheets」に変更する方法を書いとく。

ちなみに TreasureData からのメールで知った。以下メール。

![d6080ec9-fb3c-4fbf-ddc1-08c67906c81f.png](https://qiita-image-store.s3.amazonaws.com/0/34926/a69584ff-5317-de33-910d-113928879698.png)

（[メール内にある記事リンクはコチラ](https://support.treasuredata.com/hc/en-us/articles/360010360053-Migrating-from-a-Google-Sheets-Legacy-Export-Connector-to-an-OAuth-based-Google-Sheets-Export-Connector)）

# 対応

[TreasureDataの公式手順](https://support.treasuredata.com/hc/en-us/articles/360010360053-Migrating-from-a-Google-Sheets-Legacy-Export-Connector-to-an-OAuth-based-Google-Sheets-Export-Connector)を見ながらやるのが確実。

ついでに対応したときの手順のスクショを残しとく。
（スクショは新しいバージョンのTreasureDataの画面）

## 1. Google Sheets の Authentication 作成

![5685cb54-5888-e26f-04f9-31b45cdb6707.png](https://qiita-image-store.s3.amazonaws.com/0/34926/b84fdbf7-acc7-b221-686b-6ed74d8c1448.png)

![bbafd1e9-b406-3dbf-e5f6-c265f6a3f053.png](https://qiita-image-store.s3.amazonaws.com/0/34926/427353f5-d056-c93b-e3ef-5a2016756b77.png)

![d8b01abe-51f2-f72b-f68b-7e3f51112a23.png](https://qiita-image-store.s3.amazonaws.com/0/34926/143d4f69-cd26-7fe3-9c01-0c6defbb7b80.png)

![c2c159ef-a9bd-f615-9611-34a0c397260f.png](https://qiita-image-store.s3.amazonaws.com/0/34926/7086c17b-203f-3d83-4221-ee7431f75c94.png)

![a15b29bc-45d9-aee2-5e49-c1df98be4bfc.png](https://qiita-image-store.s3.amazonaws.com/0/34926/056eb8e9-de7b-9506-7a0f-e216dd2f5737.png)

## 2. 既存の Query のAuthentication を削除して、1 で作成したやつを設定

![d6f8b4b6-4560-3791-8511-f2e59ef4f193.png](https://qiita-image-store.s3.amazonaws.com/0/34926/472ab827-1492-262c-479f-6a979de385a4.png)

![146a55ec-e13c-8f42-ccda-8c197cc5896d.png](https://qiita-image-store.s3.amazonaws.com/0/34926/16a2b95b-6fea-90a5-c96f-d30ea32c8d55.png)

![7cdd5b07-166e-12d9-b8cd-7f4509d06a62.png](https://qiita-image-store.s3.amazonaws.com/0/34926/74edd9f2-c3d4-c87c-6e80-74fd464c702c.png)

![49fcfc08-af4c-d978-42fa-1d826eb7df5a.png](https://qiita-image-store.s3.amazonaws.com/0/34926/c66cb523-0ee4-b30e-11dd-816d1aebcb41.png)

![aa925167-e787-a9d9-0481-3798c7d3feef.png](https://qiita-image-store.s3.amazonaws.com/0/34926/98dbce71-5bb4-f6b6-76c9-2a38b74a9b11.png)

![bab14faa-d195-a561-804a-8483fd1616d4.png](https://qiita-image-store.s3.amazonaws.com/0/34926/e9fccf5b-f8c6-f3ac-2c04-7b726503d878.png)

![efca0890-92e0-0a77-3e96-0b3715cc0ab7.png](https://qiita-image-store.s3.amazonaws.com/0/34926/4fc6f767-d890-df77-f65d-9923ec87f808.png)

## 3. ちゃんとスプレッドシートに出力されるかテスト

![d9684854-d9f8-2fe9-8049-db96a3c82b74.png](https://qiita-image-store.s3.amazonaws.com/0/34926/7b24381c-64b0-d672-6748-ba7df0ed7545.png)

![8490f995-4736-052f-027c-8e91232c24bb.png](https://qiita-image-store.s3.amazonaws.com/0/34926/4373c3cc-72c9-84c9-d98d-13946045a8dd.png)

ちゃんと出力されれば、とりあえずおわり。
（テストで出力した結果は削除。）

もし複数 Query あるなら、[2](#2-既存の-query-のauthentication-を削除して1-で作成したやつを設定) を Query の数だけおこなう。

おわり。
AWS vs AlibabaCloud

# AlibabaCloud vs AWS ベンチマークを取ってみた　～WEBサーバ編～

アジアで海外展開サービスする可能性がある事が先方に伝わり、
アリババクラウドの営業様がいらっしゃってお話を聞きました。

現在使用しているAWSと性能面・費用面を考慮して色々とお話をしていただきました。
※AWS料金は2月ドル円相場平均値(みずほ銀行準拠)　__1ドル/110.6円__　を元に円換算しています。

## WEBインスタンスの比較
### ざっくりアリババクラウドの売りをまとめる
> ・AWSに比べて同等スペックのインスタンス同士でスペックが__1.5倍～2倍__
> ・中国＝日本を結ぶ専用線があるので中国への事業展開に有利
> ・価格がAWSよりも__安い__
> ・サービス主体が違うので、日本リージョンには中国当局から要請があってもアリババが情報開示しない
> ※中国＝日本のダイレクトコネクトを利用して中国国内でサービスしているものについては例外

### 疑問
- __スペック2倍__ってほんと？
- コンソールやAPIの使用感ってどんなものなのか
- 現在AWSで使っているサービスと同等のものはそろっているか？

### インスタンス比較
- AWS：c5.2xlarge
    - UnixBenchスコア：__5279.9__
    - CPU：[Intel Xeon Platinum 8124M](https://en.wikichip.org/wiki/intel/xeon_platinum/8124m)
    - 定格：__3.0GHz(たーぼぶーすと3.5GHz)__
    - 単価　￥278,159
- Alibaba：ecs.c5.2xlarge
    - UnixBenchスコア：4883.0
    - CPU：[Intel Xeon Platinum 8163](https://en.wikichip.org/wiki/intel/xeon_platinum/8163)
    - 定格：2.5GHz
    - 単価　__￥231,030__

### その他インスタンス周りの違いについて
- リザーブドインスタンスについて
    - AWS：リージョンに紐付いた契約で、同型のインスタンスにかってに結びついて割引が適用される。
    - Alibaba：インスタンス毎に契約を結ぶため付け替え不可、合わせてサイズ変更については上方修正のみ可能

### ロードバランサについて
- AWS：ELB
    - トラフィックの増加に伴って自動で台数が増える
    - ELBの維持費用(￥2.69/時間＋LCU)※LCUは複雑怪奇なので [料金ページ] (https://aws.amazon.com/jp/elasticloadbalancing/pricing/) 参照
    - EC2からのアウトバウンド通信に対する課金(￥9.30～￥12.61/GB)
- Alibaba：SLB
    - スペック決め打ち(スペック変更時はサービス断あり)
    - インスタンスの料金(￥0.9～￥71.1/時間)
    - ピーク帯域幅料金(￥51.75～￥57.50Mbps/日)
    - SLBからのアウトバウンド通信に対する課金(￥12.3/GB)

### CDNについて
- AWS：CloudFront
    - 単価　__￥9.85/GB__
- Alibaba：Alibaba Cloud CDN
    - 単価　￥13.80/GB
    - 国内のエッジサーバがAWSよりも少ない

### コンソールのユーザビリティ
サービス名は真似て居るのに、コンソールに見た目がAzureっぽかったり、
インスタンスの削除がリリースだったり、文言の差で混乱しましたが、
正直どっちも慣れればそこまで変わりない気がします。

### 結果
- インスタンス性能：__AWSのかち__
- インスタンス価格：__Alibabaのかち__
- トラフィック料金：__AWSのかち__
- ロードバランサ可用性：__AWSのかち__
- ロードバランサ価格　：__AWSのかち__

-----

ということで、WEBサーバ＆ネットワーク編でした。

ここからAlibabaCloudの逆転はあるのか？

__次回DBサービス編に続く__
Timerを使ってみた

#使ってみるきっかけ
水球のルールが変わり現在使用しているタイマーでは新ルールには対応できないとわかりました。iPhoneアプリを作ってMacにミラーリングすればいい感じになるのではと、思い付きで作成してみた。
#Timerについて
TimerはUIKitに含まれている。
最初にTimerの名前を決める。今回はmytimer。

```swift:ViewController.swift
var mytimer : Timer!
```
調べている途中ではNSTimerを使っている記事がたくさんみられたがTimerに変更されている。
Timerを生成する関数の名前を決め作成する。

```swift:ViewController.swift
func createTimer(){
        //timerを生成する.
        maintimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.maintimeaction(timer:)), userInfo: nil, repeats: true)
    }
```
このコードの役割。

| コードの名前       |意味                |
|:-----------------|------------------:|
| timeInterval     |何秒経ったら関数を呼び出すかの定義|
| target           |selectorの場所を指定する。|
| selector         |時間が経って行うことを書いたところを指定する|
| userInfo         |パラメータとして渡したい何かを記述。|
| repeats          |繰り返しを行うかどうかをBoolで書く|

時間が経って行うことを書いてみる。

```swift:ViewController.swift
@objc func maintimeaction(timer: Timer){
//例えばLabeに表示や時間を加えたり減らしたりなどなど
    }
```
タイマーを作成

```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
createTimer()
//さっきの関数の名前
}
```
タイマーを止めるときは下記のコードで止めることが可能。

```swift:ViewController.swift
maintimer.invalidate()
```
**ただし、止めた後はもう一度タイマーを生成しなければならない。**
これでタイマーが動いているか止まっているか確かめられる。

```swift:ViewController.swift
maintimer.isValid
```

#最後に
意外と簡単であった。また2つのタイマーを動かすこともでき水球のタイマー作っていて楽しかった。

#参考文献
https://pg-happy.jp/swift-scheduledtimer.html
https://qiita.com/KikurageChan/items/5b33f95cbec9e0d8a05f
https://uruly.xyz/【swift】タイマー機能カウントダウンを実装する/
https://picolica.com/2017/04/17/swift3-5sec-timer/
などなど
AWS EC2でt2からのt3に移行しようとしてエラーになるのを解消する

#エラー内容
t2からt3にインスタンスタイプを変更して、インスタンスを開始すると
「インスタンス開始のエラー」

#前提条件
1. 対象サーバでyum update all 済み
1. エラーになったサーバは停止している
- エラーになったサーバ以外にaws-cliをインストールできるサーバがある
- pythonインストール済み
- rootユーザで実行した
- aws-cliはそんな使わないのでパスを通さない。
- コマンドは東京リージョンにしている。各自自身のリージョンに合わされたし。<br>
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html
- 事前に、下記で、IAMでユーザとアクセスキーとシークレットキーを作っておくこと。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/364471/c89d117a-321a-3487-08fd-9c844fbc0d8c.png)



#手順

```bash
# pipをインストールする
curl -kL https://bootstrap.pypa.io/get-pip.py | python

#pipでaws-cliをインストールする
pip install awscli --upgrade --user

#awsコマンドのカレントへ移動
cd /root/.local/bin/

#EC2へのアクセス権設定
./aws configure

AWS Access Key ID : #IAMで作ったアクセスキー入力する
AWS Secret Access Key : #IAMで作ったシークレット入力する
Default region name [None]: #入力しなくても大丈夫
Default output format [None]: #入力しなくても大丈夫

#ENA有効化
./aws ec2 modify-instance-attribute --region ap-northeast-1 --instance-id i-(EC2でインスタンス番号を調べて入力)--ena-support

#確認 TrueだったらOK
./aws ec2 describe-instances --instance-ids i-(EC2でインスタンス番号を調べて入力) --query "Reservations[].Instances[].EnaSupport" --region ap-northeast-1
[VR][HTCVIVE] SteamVRがviveをうまく認識してくれないとき

ヘッドセットが赤くなっていれば接続に不良があるので再確認をしてみる。注意点は以下の二点
１　HDMIケーブルがグラボ直下の穴に刺さっているか
　　マザボのほうの穴にさすとスペック不足になる恐れがある
2　USB3.0に挿していないか
　　規格が2.0のため3.0ポートに挿すと不具合が起きる可能性がある
Windows10でVPN(L2TP)接続ができない

# 現象

> リモートコンピューターと最初にネゴシエートするときに、セイキュリティ層で処理エラーが検出されたため、L2TP接続に失敗しました

# 環境

- Windows 10 Pro 17763.402
- VPN
    - L2TP/IPsec
    - 事前共有キー

# 原因

必要なサービスが起動していなかった。

# 対応

1. Windowsキー + R
2. ファイル名を指定して実行: services.msc
3. 2つのサービスを探して起動
    - IPSec Policy Agent
    - IKE and AuthIP IPSec Keying Module
学んだこと・知ったこと　なんでも箇条書き

・　LINUXコマンド少し
・　Azure構成　サブスクリプション、リソースグループ、テナント、リソース
・　Azure web app
・　Azure web app plan
・　blob 
・　jq JSON見やすくするやつ
・　Postman
・　Azureの認証/サービスプリンシパル、ロール
・　OAuth
・　Bot serviceの中身
・　C#の環境構築
・　英語の解説記事に出会いたい
・　ARM(Azure Resource Manager)テンプレートの仕様
・　Azureとの対話 API/Azure CLI
・　curl
・　基本的なazコマンド
・　Automation スクリプト
・　LUIS
・　Azureリソースのname,idの紛らわしさ
・　先輩エンジニアは神
・　Githubは偉大
・　Githubで同じこと質問している人いると安心
・　APIをPostmanで振る舞いを確認する
・　文句言ってないでコード書く
・　Bot emulator入れた
・　ngrok入れた
・　bot builderの存在を知る
・　お客さんへの料金の話
・　調査に一貫性を保つ工夫：作業の終わりに必ずメモ、整理して可能であれば他の人に見てもらう。
・　az bot slack は引数にID入れても結局クライアントアプリで認証しなきゃ値を保持してくれない(slack)
・　PaasとIaas：積んでいるものが違う。Iaasがいわゆるインフラだけなら、Paasはミドルウェア、開発ツール、監視、分析ツール混み。
・　仮想マシンは必要なケースを生で聴けた
・　Azureのリソースは設定や各パラメータがJsonで見れる
・　わからない時は何が分からなくても思考を整理しながら質問する
**・　うだうだ言ってないでコード書く**
Pipenvが良さげなので、乗り換えてみた

（追記） Pipenvとはを書き忘れていたので追記しました。

# 概要
Pipenvの話を聞いて、なんか良さそうだったのと、
pyenv-virtualenvはコマンドが重くなるという話を聞いて（どの程度かわからないけども）、
condaとpyenv-virtualenvとpyenvが混在してるカオスな状態を改善したいなと思ったので、
これらをアンインストールしてPipenvを入れてみました。
ちなみに私は、ローカル汚したくない、上記のようなごちゃごちゃするのがいやという理由で、
最近開発環境は全部Dockerで構築しているので、普段の開発にはあまり影響ないです（笑）。

# Pipenvとは
npmやgemのように`Pipfile`と`Pipfile.lock`生成し、
どのマシン上でも同じ環境になるように管理するためのツールです。
`Pipfile`と`Pipfile.lock`を共有し、`pipenv install`を実行することで同じ環境をセットアップできます。
パッケージのインストール先はデフォルトだと`~/.local/share/virtualenvs/`下に各仮想環境のディレクトリを作ってそこにインストールされるようです。

# 既存のツールをアンインストール
## 1. anacondaのアンインストール
まずはanacondaのアンインストールを行います。
私はpyenvから消したのですが、pyenv-virtualenvからcondaの仮想環境を作った影響か、
色々エラーが出てたので、こちらからやったほうが安全かと思います。

[Uninstalling Anaconda &#8212; Anaconda 2.0 documentation](http://docs.continuum.io/anaconda/install/uninstall/)
anacondaのアンインストールはホームディレクトリにある`~/anaconda3`を削除すればいいとのことです。
ただし、設定ファイル等が残るそうなので、それが嫌な場合は下記のように`anaconda-clean`パッケージをインストールして実行します。

**`anaconda-clean`の実行は`~/anaconda3`を削除する前に行ってください。**

```shell
# anacondaのアンインストールパッケージをインストール
conda install anaconda-clean

# これを実行
anaconda-clean

# anacondaのディレクトリを削除
rm -rf ~/anaconda3
```

## 2.  pyenv-virtualenvのアンインストール
brewでinstallしていた場合は、brewからアンインストールしてください。
gitでインストールしていた場合は、この後のpyenvのアンインストールで一緒に行われるので、pyenvのアンインストールを参照ください。

```shell
brew uninstall pyenv-virtualenv
```

私はなぜか2つのバージョンが入ってたらしく、2回コマンド実行しました（笑）

## 3.  pyenvのアンインストール
brewでinstallしていた場合は、pyenv-virtualenvと同様にbrewからアンインストールしてください。

```shell
brew uninstall pyenv
```

gitでインストールした場合は、`PYENV_ROOT`のディレクトリを削除してください。
この時、`PYENV_ROOT`にpyenv-virtualenvが含まれているので、一緒にアンインストールされます。

```shell
# 一般的なインストール先ならこれ
rm -rf ~/.pyenv
```

## 4.  環境変数等の削除
`.bash_profile`や`.bashrc`などに追記した環境変数などを削除します。

```:.bash_profile,.bashrcなど
# pyenvのもの
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# pyenv-virtualenvのもの
eval "$(pyenv virtualenv-init -)"

# anacondaのもの
export PATH="$HOME/anaconda3:$PATH"
```

# Pipenvのインストール
Pipenvのインストールはpipからインストールすれば終了。

```shell
pip install pipenv
```

これであとはプロジェクトのディレクトリで、下記のようにパッケージをインストールすると、
ディレクトリ下に`Pipfile`と`Pipfile.lock`が生成され、
npmやgemのようにパッケージを管理することができます。

```shell
pipenv install django
```

# まとめ
MacBookのローカルのPythonの仮想環境が、なかなかにカオスだったので整理してみました。
Pipenv自体の使い勝手はこれからだけども、PythonだけじゃなくてRailsとかnpm扱う人は、
Pipenvのほうが扱いやすいんじゃないかと思います。

# おまけ
MacBook買ってすぐにpyenv入れたせいか、OSのPythonにpipすら入ってなくてそのインストールに苦労しました。
あと、Pythonの各バージョンを個別にインストールするのが面倒だったので、pyenv入れ直しました(笑)

# 参考
[pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)
[pyenv自体のアンインストール方法](https://qiita.com/kamol/items/6f659b51c96a71e2a978)
[綺麗にAnacondaをアンイストールする方法 For macOS](https://ai-coordinator.jp/anaconda-uninstall-for-maxos)
一旦、PostgreSQLを学習するためVagrant+Virtualbox+CentOS7で仮想環境構築


#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。

現在メインで学習していることはPythonとDjangoですが、少し学習に手こずっているため、一旦PostgreSQLを学習することに。

最終的にdjangoプロジェクトと連携させていこうと考えます。

#PostgreSQLの導入
Vagrantの学習を兼ねて、CentOS上にPostSQLの開発環境を構築します。

まずはターミナルで、

```
$ mkdir vagrant

$ cd vagrant

```
次に、

```
$ vagrant init centos/7

$ vagrant up

```
とコマンドを入力し、[VagrantCloud](https://app.vagrantup.com/boxes/search)上からcentos7のVagrantパッケージをダウンロードします。
そして、生成されたVagrantFileをテキストエディタで開き ```  config.vm.network "private_network", ip: "192.168.33.10"```の行をコメントアウトします。

#仮想マシン起動

```
$ vagrant up
```
ワクワクするコマンドです。

```
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

$ vagrant box list
centos/7 (virtualbox, 1902.01)

$ vagrant ssh

```
という起動からサーバー接続まで一連の流れを実行。
無事にVagrantでCentOS環境を構築することが出来ました。

#最後に
AWSのゲーム開発サービスとかもいじってみる予定です。
Amazon LambleyardはUnityに比べてまだまだ情報が少ない......。
【Rails】TinyMCEをご紹介

#TinyMCEは何か
LGPL WebによってリリースされているWYSIWYG HTML Javascriptに基づいたプラットフォームという**TinyMCE**は、ウェブでのコンテンツ作成を簡素化するように設計されたテキストエディタを提供します。ブログ、説明などのテキストのフォーマットを簡単に編集できるし、さらに無料です。
詳細はこちら：[TinyMCEホームページ](https://www.tiny.cloud/)
今様々な言語で使われており、それらの一つはRubyonRailsです。
gemページ：https://github.com/spohlenz/tinymce-rails

#Railsでの使用
1, **インストール**
下記のステップ通りに実装すると、インストールは完成です

- Gemfileに追加する：```gem "tinymce-rails"```
- コマンドを実装する：```$ bundle install```
- サーバーを再起動する：```$ rails s```

2, **使用**

configの中で、tinymce.ymlを作成してから、下記のコンテンのように作りましょう。

```tinymce.yml
theme_advanced_toolbar_location: top
theme_advanced_statusbar_location: bottom
theme_advanced_buttons3_add:
  - tablecontrols
plugins:
  - table
  - image
toolbar:
  - undo redo | formatselect | fontselect | fontsizeselect | bold | italic | underline | alignleft | aligncenter | alignjustify | alignright
```

tinymce.ymlは、TinyMCEのインタフェースを決めます。

- plugins：エディタの機能をインストールします
    - table：テーブル挿入をサポートし、テーブルを操作する
    - image：画像を挿入できます。
    
他にもたくさんのプラグインがあります、こちらで参照することができます：http://archive.tinymce.com/wiki.php/Plugins

- toolbar：編集に必要なツールをインストールします。ツールの順番は、設定ファイルに書かれている順番と同じです。

次は**application.js**の中でtinymceをrequireします

```
// require tinymce
```
最後に、どこかでエディタを使用したい時、そこに "tinymce"クラスを追加します。そして、```<%= tinymce %>```は大事（理由だと、これはtinymce.ymlのconfigをリンクします）なので、忘れないように注意して欲しいです。例は次の通りです。
<img width="784" alt="Screen Shot 2019-04-02 at 3.18.06 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/332720/d283bf25-73e8-0a48-6ecb-7dec4f4ce6f0.png">
ビューで、html_safeを使用して正確にフォーマットしたものを表示します。
<img width="536" alt="Screen Shot 2019-04-02 at 3.17.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/332720/9b8aa347-f7b2-68dd-7b84-7aa0256f9303.png">
実際の結果
![Apr-02-2019 15-13-11.gif](https://qiita-image-store.s3.amazonaws.com/0/332720/d2e88bf4-13dd-f488-a50f-1340efae9935.gif)

#まとめ
tinymce-railsはインストールと使用が簡単で、様々なオプションがあります。みんなの仕事に役に立つと嬉しいです。
AWS認定 ソリューションアーキテクト プロフェッショナル 新試験(SAP-C01)に合格してきた

#はじめに
2019年2月、[AWS認定ソリューションアーキテクト-プロフェッショナル](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)試験がリニューアルしました。
以前の試験と比較して、最近の新サービスに関する問題なども含まれると共に出題の傾向や範囲がよりAWSネイティブとなり、より深くAWSの知識を求められるものになりました。

そんなソリューションアーキテクト プロフェッショナルに合格してきた体験記になります。

#試験の概要
複数の選択肢からベストプラクティスを一つ選ぶ問題がほとんどで一部、複数の選択肢を選ぶ問題がある印象です。
75%以上の正解で合格となり、テスト時間は公式では170分となっていますが、試験を実施するPSIテストセンターの設定では180分となっています。
試験費用が32,400(税込 2019年3月時点)と安くないので、気合が入ります。

以前は合格後2年以内に再認定を受けなければなりませんでしたが、新試験では3年以内に再試験に合格が必要と変更になっています。
また、ソリューションアーキテクト アソシエイツを取得していなくても受験できるようになりました。

その他詳細ははじめに書いたリンク先もしくは[こちら](https://d1.awsstatic.com/training-and-certification/docs-sa-pro/AWS%20Certified%20Solutions%20Architect%20-%20Professional%20Exam%20Guide%20001%20v.1.1%20JPN.pdf)の公式ガイドをご覧ください。

#まずは模試を受ける
自分のレベルを確認する意味で、2018年のうちにアソシエイツに合格した特典の模試無料バウチャーを利用して受けてみました。
模試はオンライン試験となり、自宅等で受けることができます。
しかし、結果は35%と散々たるものでした。:sob:

ここから、必死の勉強が始まります。

#どんな勉強をしたか
* 基本は[Black Beltの資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)を片っ端から全部、何回でも読み込む。特に注意したいのは、古くからあってよく知っているサービスでも必ず最新の資料を読むこと。最近の新機能に関する問題に対応できなくなります。
* [Well-Architectedホワイトペーパー](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf)を読み込んで、その考え方を理解する。問題の多くはWell-Architectedに沿った設問となっているので外すことはできません。
* Kindle 英語版しかありませんが、[こちら](https://amzn.to/2Ud57So)のような問題集を解く

こんなことを大体、3週間ぐらい続けました。

#本試験を受ける
さて、実際に試験を受けます。試験会場には歌舞伎座タワー テストセンターを選びました。
個人的にはキオスク端末の試験会場はお勧めしていません。

問題の内容などは守秘義務があるので書けませんが、日本語訳された問題の中には言い回しがおかしく理解しにくい問題もあり、英語原文を確認しながら回答した問題も少なくありませんでした。
150分ぐらいで全問回答できたので、残り30分で回答に納得感が足りていなかった問題を見直します。
###結果、、、
総合スコアには少々不満は残りましたが、合格しました。:thumbsup:

#最後に
試験は本当にAWSのサービスを網羅的に把握し、Well-Architectedフレームワークに従ったソリューションンとすることが求められる印象でした。
EC2とRDS、S3が使えれば良い時代は終わっています。
【初心者】Webクリエイター能力試験（スタンダード）受験レポート

## はじめに
転職を機に未経験Webデザイナーとして仕事に関わることになった関係で、少しでも理解を深められればと思い独学で勉強して受験しました。知識・経験ともにゼロで勉強も苦手な私ですが、無事に合格することが出来たので参考までに。

## 試験概要
Webクリエイター能力試験の目的は「Webクリエイターに必要とされる、Webサイト制作のデザイン能力およびWebページのコーディング能力を認定します」とされています。スタンダードとエキスパートの2種類があり、スタンダードは実技問題のみで試験時間は70分（Webページ作成ソフト使用時は60分）となります。

## 合格基準と合格率
合格基準はどちらも得点率65%以上となります。配点については非公開のため分かりませんが、試験結果には自分の得点率を確認することが出来ます。合格率については公式サイトでも公表されていますが、88.4%（2017年度平均合格率）と比較的高いです。

## 申し込みと受験会場・受験日
Webクリエイター能力試験は、受験会場に直接申し込みをし、各試験会場で決められている受験日を申し込み時に指定します。自分で受験日を設定出来るのは利点ですが、試験日直前の日程は埋まってしまっていることが多いので、余裕をもって申し込むことをお勧めします。
（私はわけあって3週間後に受験しなければならなかったため、試験会場探しが一番苦労しました・・。）

## 使用した教材
- **たった1日で基本が身につく！HTML&CSS超入門**
本屋さんのおすすめ本の棚にあったものから選びました。
本を開いたときに見やすく、自分のやる気が持続しそうだったことと、単元ごとにまとまっていたので通勤時などの隙間時間でも読みやすそうだと思い購入しました。個人的には読みやすかったのと、サンプル教材をネットからダウンロードして自分のパソコンで実際に操作しながら進めることが出来たので、HTMLとCSSの基礎の部分はこの本で勉強しました。

- **Webクリエイター能力試験HTML5対応スタンダード公式本**
購入したものの、実際のところ試験勉強では使用しませんでした。
ただ、1冊目の本で補えなかった部分はこの公式本で今も日々勉強しています。どちらかとういうと辞書のように使っています。

- **Webクリエイター能力試験（4.01対応）スタンダード公認テキスト＆問題集**
どのように出題されるのか、時間配分はどう考えておけばよいのかの練習になると思い問題集も購入しました。ただ、HTML5対応の問題集が無かったので、泣く泣く4.01対応にしたのですが、タグの意味が変わっているものや廃止されているものもあるので、回答をすべて鵜呑みにしてしまうと実際の試験では間違いになってしまうので注意。
私は最初からHTML5から入ったので「この書き方、なんか覚えたことと違うな・・」と思い、引っかかったところはHTML5としての回答としても正しいのかどうか確認するようにしました。

## 勉強スケジュールと方法
公式サイトでは、エキスパートの学習時間は24時間に設定されています。実際どれくらい勉強時間を確保出来たかは忘れてしまいましたが、最初の1週間～10日間はとにかく隙間時間に1冊目の本を読んで基礎中の基礎を学びました。途中から読んでもよく分からなくなってきたので、本を見ながらサンプル教材の内容を編集し、タグの使い方や動作などを勉強しました。
最後の1週間（ちゃんと時間が確保出来たのは2～3日くらいですが・・）は、ひたすら問題集を解くようにしました。間違えたところは問題集内の解説をもとに即確認し、もう一度やってみることを繰り返し行いました。ただ今思えば、あと3日くらい早く問題集の問題に取り組めばよかったな・・と思っています。

## 試験当日
当日までに問題集を全て解ききることが出来なかったので、当日は試験範囲のタグ一覧を眺めていました。私はWindows10のメモ帳で受験する予定だったので、使い方の他に綴りが不安なものを再確認しました。
同じ形式の試験を受けたことがなかったので、最初は環境や雰囲気にも慣れなかったのですが、焦ってもしょうがないと思い、途中からはマイペースに進めました。問題集で勉強した内容より、1冊目の本で勉強したことがとても役に立ちました。最後の問題はまさに1冊目の本に書いてあったことだったのですが、時間がなく飛ばしてしまったので全然分からず・・。ちゃんとやっていればもう少し良い点が取れたのかな・・と少し後悔しています。

## まとめ
得点率71%というギリギリで合格することが出来ました。
実技問題しかないだけあって、やはり手を動かして試してみないと理解できなかったことが多かったです。知識問題ではないからこそ隙間時間だけでは難しく、やはりパソコンに向かってせっせと手を動かくす時間を多く確保できた方が効率よく勉強出来ると思いました。試験としては合格出来たものの、まだまだ知識・技術ともに未熟なので継続して勉強していこうと思います。次はエキスパートに挑戦します！！
github 通知サービス作ってみた nuxt.js + firebase auth


## github
https://github.com/taichi0514/Nuxt.js-Authentication

## hosting
https://nuxtjs-authentication.firebaseapp.com/

## やりたかったこと
firebase authを認証そのtokenで
Service Worker Notification API使用しバックグラウンド通知を行う

## できなかったこと
Service Worker Notification APIを使用したバックグラウンド通知
頑張ったが無理だった.....
Firebase Cloud Messaging（FCM）を使ってAPIを叩いたら
Service WorkerでNotification APIで通知を置こうなうフローを想定していたが
githubから通知が来た際にAPIを叩くのではなく
1分間に一回APIを叩いて取りに行っているので
githubから通知が来た際にAPIを叩く手段がなく
サーバー側でtokenを登録して処理するしかないという答えにたどり着きました。
firebase cloud functionsではこういう処理ができないので
それならfirebase authを使う意味がなくなってしまいました....


## できたこと
github通知がNotification APIで通知される

## まとめ
やりたいことはできなかったけれど
nuxtjs基礎やvuexの使い方を学べたので収穫はあった
何より楽しかったのでよかった


自分が作った物の上位互換を紹介しておきます
Chromeの拡張機能ですがすごくいい
https://chrome.google.com/webstore/detail/notifier-for-github/lmjdlojahmbbcodnpecnjnmlddbkjhnn
opensslコマンドで公開鍵作ろうと思ったらハマった話

opensslコマンドで公開鍵作ろうと思ったらハマったので備忘録

# やりたかったこと
AppleのVoIP Services証明書をローカルにダウンロードして
公開鍵を作りたかった。

# 何が起きたか
ダウンロードした証明書ファイルをmacに読み込んで、キーチェーンアクセスから.p12ファイルを作成。
その後、pemファイルに形式変換し公開鍵を作ろうと思ったら以下エラーが発生

```
unable to load Private Key
4507870828:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.250.1/libressl-2.6/crypto/pem/pem_lib.c:683:Expecting: ANY PRIVATE KEY
```

# 原因
`Enter PEM pass phrase` と言われたときに何も入力しなかったのが原因。
ちゃんと入力して、公開鍵を作るときにパスワードを入力したら出力された。

# 最終的にどうやったか

1. Apple developer programのコンソールから.cerファイルをダウンロード(この辺はググってください)
2. ダウンロードした、.cerファイルをダブルクリックしてキーチェーンアクセスに保存
3. キーチェーンアクセスから.p12形式でファイルを出力(この辺はググってください)
4. 出力した.p12ファイルをpem形式に変換

```
openssl pkcs12 -in PATH_TO_YOUR_P12 -nocerts -out key.pem
Enter Import Password: // キーチェーンアクセスから出力した時のパスワードを入れる。
Enter PEM pass phrase:  // ※ここが重要！！これを入力しないと掲題のエラーが発生する。
```

5.公開鍵を出力

```
openssl rsa -in key.pem -out key.pem
Enter pass phrase for key.pem: // 手順4で入力したパスフレーズを入力
```
Navigation Controller の Title をStoryboardで表示させる方法＠備忘録

# 全体の構成
中央の緑のボタンを押したときに、右の画面に遷移します。
右の画面にタイトルを表示させるために、Storyboardを編集しました。
<img width="596" alt="スクリーンショット 2019-04-02 16.43.41.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/326574/8d196506-e5ad-117a-018d-66257253a899.jpeg">


# Storyboardからの編集方法
View Controllerの黄色いところを選択する。
Title を編集する。

これでOK!

![PNGイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/326574/8f656615-fbf6-e800-d273-e21348241a46.png)
Javaのインストールする　jdk

https://eng-entrance.com/java-install-jdk-windows
を見ながらチクチクやる……

pathに追加
c:\Program Files\Java\jdk-12\bin
JAVA-HOMEに新規作成
c:\Program Files\Java\jdk-12
やらやりましたっ

結構昔にやったから変更しているかどうか謎だけどこれで動くといいなー
もそ、プログラミングを学ぶ【Ruby & Rails】〜エラーを解く鍵はここだ！〜

だんだんとエラーが解けるようになってきた もそ。
まだ解けない問題はあるものの、目の付け所や解説がわかるようになってきました！やったね！
とはいえ喜ぶにはまだちょっと早いので、来週のテストに向けて粛々とエラー問題を解いていこうと思います。


今日は**エラーの解き方のコツ**について書いていきます。


そもそもな話、この記事を書いてからエラー解説をするべきだったなと思います。
でもそんなことも分からないぐらい、私自身**エラーとどう向き合うべきか、まったくわかっていなかったんですよね。**

カリキュラムを理解できている≠エラーが解ける
ではありません。

むしろ解けなくて当たり前です。
エンジニアですらバグの解消で一ヶ月とか悩んだりしています（※某ポチ氏のことです）


なので「エラーの見つけ方がサッパリ分からない」という方は、ぜひこの記事の内容を思い出してエラー解決にチャレンジしてください。


##エラー表示が分かりにくい件

まずはこちらのエラー画面を見てみましょう。

<img width="1125" alt="0402.png" src="https://qiita-image-store.s3.amazonaws.com/0/372174/443d123d-0c98-37c9-7d8e-1a65c8ee3e0b.png">

もうこの赤と白の画面が出てきただけで、「はぁ〜〜〜」と溜息をつきたくなる気持ち、めっちゃわかります。。


さて本題にまいりましょう。
このようなエラー画面が出てきたとき、皆さんは**まずどの部分からチェックしますか？**

英語が得意な方だったら、冷静に一行目から読んでいくかと思います。
でも大体の方は、

「うわ、英語出てきた...」
**「とりあえずコードの記述指定してくれてるっぽいし、その部分から見てみるか」**

...こんな感じでファイルをやみくもに探していませんか？
これは未だに私もやってしまうのですが、ちょっと待ってください！


エラーが起こっている記述の多くは、**画面で指定されたコードの部分ではありません**。
ではこの画面が何を示しているかというと、

「プログラム読み込んでいろいろ処理してたんやけど、**ここの記述読み込んだ途端に何やおかしなったわー**」

みたいな感じです。
(エセ関西人なので、アイデンティティを忘れないように今後も定期的に関西弁をつっこんでいきます)

身近な例で例えるなら**ボタンの掛け違え**をイメージしてもらうとわかりやすいかと思います。

![無題1179.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/c2d15519-4090-7a5e-d961-bc9ded1d032a.jpeg)


##どう考える？

先ほどのボタンの掛け違いでたとえると、エラー画面は**ボタンの掛け違いを報告している**のと同じなのです。
プログラミングの場合は処理の流れがわかっていれば、**どこでボタンの掛け違い(=エラー）を起こしたかを推理することができます。**


しかもエラーの種類によっては、**エラー画面の英文で答えを教えてくれていたり**します。

ここで冒頭で紹介したエラー画面を見てみましょう。

![無題1172 3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/98f79d46-9aba-9afa-9e82-0888d2bf7c94.jpeg)

まずは一文目の英文を翻訳してみましょう。
**ActiveRecord**は、[MVC](https://qiita.com/moso/private/4a61da06c33fb019b7ab)の中の**モデルクラスに相当する記述のエラー**を示しています。
※[RailsGuide](https://railsguides.jp/active_record_basics.html)参照

「TweetsControllerのshowアクションの記述を読み込んだときに、"StatementInValid"が起きた」と言っているわけです。

"StatementInValid"が何のことを言っているのか分からない...と思ったところで、二行目を読んでみましょう。
「MySQL2のエラー：：pictweetの開発環境下にある、commentsテーブルが存在しないよ」という意味です。

こうやって丁寧に英文を読んでいくだけでも、かなり原因がわかりますよね。

で、なんでこのエラーが起きているとわかったかというと、**赤ボックスで示されたコードの部分を処理しようとしたから**。

```rb
    def show
      @tweet = Tweet.find(params[:id])
      @comments = @tweet.comments.includes(:user)
   end
```

このコードにあるcommentsはテーブルを表しています。
つまりcommentsテーブルを読み込んで情報を情報を取り出そうとしたら、**そもそもcommentsテーブルがなかった**ということです。

一見むずかしそうに感じますが、エラー画面が出ていれば解決の糸口を見つけることができます。

エラーの種類については、[こちらの方の記事](https://qiita.com/takahito_doi/private/b10e1154ab8f59a7bad0)がとても素晴らしいので、併せて読んでみてくださいね。


--
最近はポチとルーティングやHTTPメソッドの話ができたりと、少しずつプログラミングを習得しつつあります。
目下の目標はポチと仕事ができるぐらいのレベルになることなので、めげずに頑張ろうと思います。
...続く。
【WPF】フォーカス遷移について知っておきたい３つのキーワード

WPFでフォーカス遷移を行ううえで抑えて起きたい３つのポイントについてご紹介します。

# TabIndex
コントロールにTabIndexを付与すると、その順番にフォーカス遷移します。
![Capture10.gif](https://qiita-image-store.s3.amazonaws.com/0/48623/eabf886b-0578-fa3f-91b8-aaab3f68fcf0.gif)

```xml:MainWindow.xaml
            <StackPanel Orientation="Horizontal" Margin="10">
                <TextBlock Width="200">テキストボックス(TabIndex:1)</TextBlock>
                <TextBox  x:Name="textBox"  Width="200" Text="{Binding TextBoxVal()
ue}" TabIndex="1">
                </TextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="10">
                <TextBlock Width="200">カスタムコントロール(TabIndex:3)</TextBlock>
                <customcontrols:SeachTextBox Width="200" TabIndex="3"></customcontrols:SeachTextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="10">
                <TextBlock Width="200">デートピッカー(TabIndex:2)</TextBlock>
                <DatePicker Width="200" x:Name="datePicker"  SelectedDate="{Binding DatePickerData}" TabIndex="2"/>
            </StackPanel>
```

# 物理フォーカス、論理フォーカス
物理フォーカスは別名、キーボードフォーカスとも呼ばれています。
例えば、Application Aのテキストボックスにフォーカスが設定された状態で、キーボードで入力するとApplication Aのテキストボックスに入力できます。この時、Application Aのテキストボックスは物理フォーカスを取得している状態です。
そこから、Application Bを選択すると、Application Bがアクティブになり、Application Aは非アクティブ、Application Aのテキストボックスへのキーボード入力は出来なくなります。この状態は、Application Aのテキストボックスは物理フォーカスが失われた状態となります。ただし、Application Aが再度アクティブになった際に、Application Aのテキストボックスが物理フォーカスを取得します。これは、Application A内部でテキストボックスが論理フォーカスを取得しているためです。
 
1. Application Aを選択し、テキストボックスにフォーカスを設定。
    ー＞ Application Aのテキストボックスは、物理フォーカスを取得済、論理フォーカスを取得済
2. Application B を選択。
    ー＞ Application Aのテキストボックスは、物理フォーカスは取得していないが、論理フォーカスを引き続き保持。
3. Application A を選択。
    ー＞ Application Aのテキストボックスは、論理フォーカスを取得していたため、Application A がアクティブになった時点で物理フォーカスも再取得。

# KeyboardNavigation
これらは、ひとつのコントロール配下にあるフォーカス遷移の方向性を決定します。

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.input.keyboardnavigationmode?view=netframework-4.7.2

| フィールド       |     概要 | 
|:-----------------|------------------:|
| Contained             | コンテナーの末尾または先頭に達したとき、ナビゲーションの方向に応じて最初または最後の項目にフォーカスが戻りますが、コンテナーの先頭または末尾を越えて移動することはありません。  |
| Continue           | ナビゲーション ストップである各要素が、キーボード フォーカスを受け取ります。 端に達すると、ナビゲーションはそれが含まれている要素から離れます。|
| Cycle             | コンテナーの末尾または先頭に達したとき、ナビゲーションの方向に応じて最初または最後の項目にフォーカスが戻ります。 フォーカスは、論理ナビゲーションを使用してコンテナーから離れることはできません。 |
| Local               |タブ インデックスは、このコンテナー内のみのローカル サブツリーで考慮され、その後は Continue と同様に機能します。 |
| None             | このコンテナー内では、キーボード ナビゲーションが許可されていません。  |
| Once          | コンテナーおよびその子要素全体で 1 度だけフォーカスを受け取ります。 ツリーの最初の子か、グループ内で最後にフォーカスがあった要素が、フォーカスを受け取ります。 |

利用頻度としては、Cycleが一番多いですね。Continueはたとえば、DataGrid内の最後の行、列までフォーカス遷移した際に、DataGridの次のコントロールへ遷移する動作となります。もし、DataGrid内部でフォーカス遷移をくるくる回したい場合は、Cycleを指定すれば実現できます。
JSでCSVをパースする

CSVのパースは単純に考えるとこんな感じ

```js
const simpleParseCSV=(csv)=>{
    return csv.split("\n").map((row)=>row.split(','));  
},
```

しかしCSVは値の中にコンマや改行やはたまたダブルクォーテーションが入ってたりもする
ダブルクォーテーションはあんまりないだろうけど
値にコンマや改行が入るケースというのは結構ある

ということでそれらに対応したCSVのパース処理

```js
const parseCSV=(csv)=>{
    let tmp=[];
    csv=csv.replace(/("[^"]*")+/g,(match)=>{
        tmp.push(match.slice(1,-1).replace(/""/g,'"'));return '[TMP]';
    });
    return csv.split("\n").map((row)=>{
        return row.split(',').map((val)=>val==='[TMP]'?tmp.shift():val)
    });
};
```

ダブルクォーテーションで囲まれてない値に
ダブルクォーテーションがある場合に対応できてないけど
Excelから書き出してもPHPのfputcsvでもそうはならないので
そういうCSVはまずないものとしてそこは妥協
SQLSERVER

SQLSERVERエージェントでジョブの管理をステータスで管理したい
ステップではなくて実行結果で判断するジョブを設定したい場合どうすればいいでしょうか？
処理完了のステータスで判断したいです。
また、どうようなプログラムを書けばいいでしょうか？
参考になるものなどあればおしえていただけないでしょうか？
anyenvをアップグレードしたメモ

## anyenv

https://github.com/anyenv/anyenv

## 前提

すでにanyenvをインストールしている。rdenv, ndenvあたりを主に入れていた。

```
$ anyenv -v
> anyenv
```
バージョンが謎だった。

## 動機

nodeの管理がndenvからnodenvになったと聞いて。

## 手順

https://github.com/anyenv/anyenv#migration-from-riywoanyenv の手順を実行した。

1. `cd ~/.anyenv`
2. `git pull`
3. `git remote set-url origin https://github.com/anyenv/anyenv.git`

```
$ anyenv -v
> anyenv 1.0.0-6-gb2e75c2
```
バージョンが出るようになった。

https://github.com/anyenv/anyenv#initialize-install-manifest-directory の項目に`anyenv-install` を入れろとあるので入れた。

公式の手順はgithubのユーザー名が `foo` なのでリポジトリのURLを置き換えて実行した。

```
anyenv install --init https://github.com/anyenv/anyenv-install.git
```
入れて良いか聞かれるので `y` と入れる。

`nodenv` を入れたいので入れる。

1. `anyenv install nodenv`
2. `exec $SHELL -l`

nodevnにも各バージョンのnodeをインストールしておく。

`nodenv install 10.15.3`

完了。

## プラグインを入れる

まずは `.anyenv` 内にプラグインフォルダを作る。

1. `cd ~/.anyenv`
2. `mkdir -p $(anyenv root)/plugins`

### anyenv-git
https://github.com/znz/anyenv-git

```
git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
```

配下のリポジトリをまとめて操作できるらしい。

```
anyenv git pull
```

結果

```
Run git in 'anyenv'...
Already up to date.

Run git in 'anyenv-git'...
Already up to date.

Run git in 'anyenv-update'...
Already up to date.

Run git in 'ndenv'...
Already up to date.

... ...
...
```

ndenvも消さないとそのまま居るらしい。

### anyenv-update

https://github.com/znz/anyenv-update

```
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
```

プラグインのアップデートをまとめてやってくれるらしい。

```
anyenv update
```

結果

```
Updating 'anyenv/anyenv-update'...
Updating 'ndenv'...
Updating 'ndenv/node-build'...
Updating 'nodenv'...
Updating 'nodenv/node-build'...
Updating 'nodenv/nodenv-default-packages'...
Updating 'nodenv/nodenv-vars'...
Updating 'phpenv'...
... ...
...
```

## 参考

もっと詳しく書いてる方がいました。
https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c
DialogflowにおけるDeveloper entitiesの優先順位の利便性について

Dialogflowでは、Developer entitiesというentitiesの複合体を作る事ができます。
このDeveloper entitiesは優先順位を持てますので、非常に便利です。
その利便性について例を持ってご紹介します。

# つまりこういう事
ここは異世界のNippon。

`TOKYO都 TOKYO市 TOKYO町にTOKYO駅` があったとします。

そして、

`SHIBUYA都 SHIBUYA市 SHIBUYA町` には駅がありませんでした。

そんな異世界のNipponには、VUIでユーザーに遊べる場所を提案できるアプリが流行っていました。

```text
アプリ「どこで遊びますか？」
ユーザ「TOKYO」
アプリ「...TOKYO都ですか？TOKYO市ですか？TOKYO町ですか？TOKYO駅ですか？」
ユーザ「消えろぶっとばされんうちにな」
```

こうならないように、アプリ側で予め優先順位を決めておきましょう。
その際Developer entitiesが便利なのです。

# Developer entitiesの作り方

### まずはEntitiesを登録する

<img width="605" alt="スクリーンショット 2019-04-02 15.50.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/4e996b85-47e9-a2e1-3747-28d5f546c96a.png">
駅のEntitiesです。SHIBUYAには駅がないのでTOKYO駅だけになります。
<img width="607" alt="スクリーンショット 2019-04-02 15.51.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/4f3aa9da-1e87-2e61-b0bf-53bea73b4b6e.png">
町のEntitiesです。SHIBUYAが出てきました。
<img width="606" alt="スクリーンショット 2019-04-02 15.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/e17d1ea9-965d-f7d3-efd2-f441ed7dea96.png">
<img width="604" alt="スクリーンショット 2019-04-02 15.51.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/6090751f-56d1-aa74-4d20-13ba2bb9101a.png">
同様に市と都のEntitiesです。

ここのポイントとしては、 `駅も町も市も都もすべてTOKYO、SHIBUYAと呼ばれることがある` です。地名はだいたいそんなもんです。

### EntitiesをDeveloper entitiesに登録する
<img width="614" alt="スクリーンショット 2019-04-02 15.56.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/edbb8055-687a-c676-06ff-c5b24e7576a2.png">
Entitiesを作る手順と同様に `CREATE ENTITY` を押下します。
<img width="614" alt="スクリーンショット 2019-04-02 15.57.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/dcbe440e-cddf-3471-03b7-f6c4b934b3c6.png">
`Entity name` を入力し `Define synonyms` のチェックを外しましょう。
そして `Enter value` の欄にEntities名を入力していきます。入力方法は`@Entities名:Entities名` となります。
<img width="605" alt="スクリーンショット 2019-04-02 16.00.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/a79ced25-8a1d-9de2-63ce-8caadb9a1963.png">
こんな感じです。
こうする事によって優先順位を持ったDeveloper entitiesを作る事が出来ました。
`Enter value` の上から順番に優先順位が上がります。
`駅 > 町 > 市 > 都` といった感じです。

### Developer entitiesをIntentsに登録する

<img width="618" alt="スクリーンショット 2019-04-02 16.05.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/af9e1e89-715d-2811-3d76-8deb78a8fe9c.png">

こんな感じで、先程作ったDeveloper entities（place）をIntentsに登録しましょう。
これで完成です。

### 使ってみる
さっそく使ってみましょう。
<img width="321" alt="スクリーンショット 2019-04-02 16.06.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/450f3688-c9e0-882c-4212-1ae4a3b4a783.png">
TOKYOと言った場合には駅として認識されています。
<img width="324" alt="スクリーンショット 2019-04-02 16.06.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/234427/49f81544-aea8-936f-bebc-e112afbc6cc6.png">
SHIBUYAと言った場合には町になりました。
想定通りの動きです。
あとは受け取った先のプログラムでゴニョゴニョしましょう。

```javascript
app.intent('place', (conv) => {
    if(conv.parameters['place'].eki){
        // 駅の場合
    }else if(conv.parameters['place'].cho){
        // 町の場合
    }
})
```

ゴニョゴニョする簡単な例も載せておきます。

# おわり
Developer entitiesを使わずとも実装する方法はたくさんありますが、使用するとIntentsが最小限で済みます。

自分としてはIntentsの管理が大変なので、自分はこの方法を愛用しております。
Dialogflow使いのみなさんのお役に立てば幸いです。
Java でコールバックの簡単サンプル  

```java

interface Callback{
    void call();
}

class A implements Callback{
    private B b;

    public A(){
        b = new B();
        b.registerCallback(this);
    }    

    // Implementation of the callback interface
    public void call(){

    }
}

public class B
{
    private Callback callbackoNotify;

    public class registerCallback(Callback callback)
    {
        callbackoNotify = callback;
    }

    public void doTask()
    {  
        //do some stuff...
        callbackNotify.call();
    }
}
```
historyコマンド

#はじめに
私は、コマンドをたたかないので、そもそもコマンドに何があるのか、分かっていない。
教えてもらってやっているが、自分で同じことをやろうとすると:rolling_eyes:？になる。
どうやればどういう処理ができるのか、そもそも基本から分かっていない。

今のところ、コマンドをたたいて処理された内容をみても、よくわからない。
Geanyでコマンドを保存して、こういう時は、多分これ。とやっていたのだけど。

 historyコマンドをうつと、これまでうったコマンドがヒストリ番号付きで一覧表示される。
また、「！」に続けて番号を指定して「Ｅｎｔｅｒ」を押すと、該当コマンドが実行される。
「！！」「Ｅｎｔｅｒ」を押すと一番最後に実行したコマンドが再度実行される。

コマンドは沢山あるので、Linux技術者認定試験のレベル１をやるように言われたが、日々たたいてないからなぁという。
(Mac)VisualStudioCodeでPHP開発環境の構築

# 参考サイト
- [VS CodeでPHPの開発をするのに導入した拡張機能](https://qiita.com/cflat0528/items/08814378a5cf0d0c107d)

# インテリセンス
- 拡張機能「PHP Intelephense」

# コードフォーマット
- 拡張機能「php cs fixer」

### 導入方法
基本的に[Visual Studio CodeでPHPを整形する](https://tech.glatchdesign.com/php-cs-fixer-for-vscode/)の通りだが、若干補足した手順を下記に記述する

- vscodeに拡張機能「php cs fixer」をインストール
- PHP CS Fixerをダウンロード
  - [Github](https://github.com/FriendsOfPHP/PHP-CS-Fixer)の[Download](https://cs.symfony.com/download/php-cs-fixer-v2.phar)よりダウンロード
  - ダウンロードしたphp-cs-fixer.pharを任意のフォルダに保存 <br>
  今回は
```
~/.vscode/php-cs-fixer-v2.phar
```
(Macintosh HD⁩ ▸ ⁨ユーザ⁩ ▸ ⁨xxxxx ▸ ⁨.vscode)に保存
- Visual Studio CodeでPHP CS Fixerの設定
  - ```shift+cmd+p```でコマンドパレットを開き、<br>
    ```json```(open settings(json))と入力しenter
  - 下記を追記

```
"php-cs-fixer.executablePath": "~/.vscode/php-cs-fixer-v2.phar",
"php-cs-fixer.rules": "@PSR2",
"php-cs-fixer.formatHtml": true,
"php-cs-fixer.onsave": true,
```
- 拡張子phpのファイルを保存した際に、整形されればOK

# Docコメント入力補完
- 拡張機能「PHP DocBlocker」
- 使用方法は参考サイト参照

# 括弧の対を見やすく・・・
- 拡張機能「Bracket Pair Colorizer」

# .envファイルにシンタックスハイライト
- 拡張機能「DotENV」

# アイコンテーマ
- 拡張機能から「Material Icon Theme」をファイルアイコンテーマに設定
シェルスクリプトマガジン「Amazonの商品ページURLをきれいにする」をやってみた

毎号とても楽しみにしている**シェルスクリプトマガジン**のサイトに、
**[Amazonの商品ページURLをきれいにする](https://shell-mag.com/rensai-shellscript1-1/)**という記事があります。

実際に問題に取り組む思考過程が書かれており、大変参考になります。

`sed`の正規表現を使えばワンライナーでできそうでしたので、
いい勉強になると思いやってみました。

```sh
echo "https://www.amazon.co.jp/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%9E%E3%82%AC%E3%82%B8%E3%83%B3-vol-59-%E7%95%B6%E4%BB%B2%E5%AF%9B%E5%93%B2/dp/4904807561/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;keywords=%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%9E%E3%82%AC%E3%82%B8%E3%83%B3&amp;qid=1553740346&amp;s=gateway&amp;sr=8-1" |
sed "s/\%.*dp\(.*\)\/.*/dp\1/g"
```
### **[結果](https://www.amazon.co.jp/dp/4904807561)**

一応できたのですが、sedの正規表現は一見してわかりづらいため、
自分への備忘録として何をしているのか以下にメモします。

やっていることは`amazon.co.jp/URL/dp/文字(数字)/URL`のURLを消しています。
`\%.*dp`でdpの前にある%から始まる文字（%E3%82%B7...E5%93%B2/）をすべて対象とします。
`dp\(.*\)\/.*`でdp以下の文字（数字）を記憶しつつ、それ以降のすべての文字を対象としています。
そして次の`dp\1`で、dpの前にある文字をすべて消して、dpの後ろの文字を`\1`で取り出します。それ以降のすべての文字を消します。

# 追記１
上のやり方だと`%`で開始しないURL（商品名が英語など）は対応していないので、より汎用性のある書き方にしました。

```sh
echo "https://www.amazon.co.jp/Shell-Programming-Unix-Linux-Developers-ebook/dp/B01L480ILM/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=POSIX+shell&qid=1574942448&s=english-books&sr=1-3" |
sed "s#amazon.co.jp/.*dp\(.*\)/.*#amazon.co.jp/dp\1#g"
```

# 追記２

多少長くなりますが, より可読性が高い書き方です. 

```sh
echo "https://www.amazon.co.jp/Shell-Programming-Unix-Linux-Developers-ebook/dp/B01L480ILM/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=POSIX+shell&qid=1574942448&s=english-books&sr=1-3" |
  sed -e "s|\(https*:\)//|\1__|" -e "s|dp/|_dp_|" | #　1行下で区切りを改行にしたときに必要な情報が複数行になるのを避けるため, _でエスケープします 
  tr "/" "\n" | # 扱いやすいように区切りを改行にします
  grep -e "amazon.co.jp" -e "_dp_" |　# 必要な情報を抽出します
  awk '$1~/^http/ {printf $1; next}1' | #　1行にまとめます
  tr "_" "/"　#　エスケープをもとに戻します
```
Twitterのアカウントごとの人気ツイートを表示するサービスを作ったので仕組みについて解説

今回Twitterのアカウントごとの人気ツイートを表示するWebサービス、「ベスツイ」をリリースしましたのでその仕組みについて解説します。

Bestwiーベスツイー
https://www.bestwi.net/
![bestwi_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/390800/50bf0d0a-dfff-d810-a5f2-c523cbfafbfd.png)

Twitter APIを介してアカウントのつぶやきを分析し、リツイートされた回数やいいねされた回数の多い順に表示し、興味のあるアカウントのツイートでどれがもっとも人気があるかが一目でわかるというサービスです。

仕組みとしては単純で、
1.スクリーンネーム(「@twitter」のように表示されているID)で指定したアカウントのツイートをTwitter APIを叩いて取得します(statuses/user_timeline)。

2.取得したつぶやき一覧をリツイート回数、いいね回数を対象にソートします。

3.プロフィール画像やユーザー名、つぶやきなどのデータをhtmlに流し込み表示します。

と仕組み自体は単純なのですが、少々考えたのはデータの更新のための仕掛けでしょうか。
どのタイミングでTwitter APIをもう一度叩き、データを再取得するかなのですがこれはAPIを呼び出した時にタイムスタンプを押しておいてユーザーがデータを閲覧しようとしたときに現時刻と比較して一定程度時間が経過したと判断したらもう一度APIを呼ぶ、という仕組みにしています。

また運営してみて改良点や課題などが見えてきたら追記いたします。
Vuforia Studio 無料試用版のちょっと困ったところ

#Vuforia Studio 無料試用版
PTC社のARコンテンツソリューションVuforia Studio には、体験版が用意されています。
https://studio.vuforia.com/ でアカウント登録すると、ARコンテンツの作成と配信ができるVuforia Studioを30日間、無料で利用できます。
お、これは面白そうと思って試しているのですが、少し踏み込んでIoTで機器をつないでデータを表示させようとして罠にかかりました。

##Vuforia StudioとThingWorxの関係
Vuforia Studioは、次の3つで構成されています。

* デスクトップOSにインストールするARコンテンツのオーサリングツール: Vuforia Studio
* スマートフォンに配信するためのクラウドサービス:Experience Service
* スマートフォンなどデバイスにインストールするARビューアーアプリ:Vuforia View

このうちExperience Serviceに同じPTC社のIoTプラットフォームである ThingWorx foundationを接続することで、機器のセンサーデータをARコンテンツにリアルタイムで表示できるのです。

##Vuforia Studio 試用版に付属のThingWorx
開発者向けポータル [developer.thingworx.com]("https://developer.thingworx.com/ja/")にRaspberry Piを使ってAR＋IoTのデモを作成する[シナリオ](https://developer.thingworx.com/ja/resources/guides/raspberry-pi-ar-tutorial"シナリオ")があったので、てっきり好きなようにThingWorxも操作できるものだと思い込んでました。
しかしながら、世の中そこまで甘くない。

###ワナその1：記載されているURLが間違っている
開発者ポータルのシナリオに書かれている、ThingWorxにアクセスする際のURLが間違っていました（汗）
正しくは、以下の通り。
\<Experience ServerのURL\>/Thingworx
※ Webサイトには、:8443 がかかれていますが必要ありません
ちなみにURLが分からない場合は、インストールしたVuforia Studio（オーサリングツールのほう）の右上メニューから設定を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/2cbcc498-1e6b-be90-94a5-2e1b42673ff4.png)
ダイアログが開くので「デフォルトの Experience Service URL」をコピペすればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/024c6d09-0b85-a334-8d96-0c8d8d0ef9b4.png)


###ワナその２：ThingWorxの編集権限が無い
試用版のVuforia StudioのためのExperience Serviceに接続されたThingWorx（ややこしい）には、閲覧権限しかありませんでした（涙）。
シナリオにあった Raspberry Piデモ用のThingや、ApplicationKeyはあらかじめ用意されていて、そのまま使うことしか許されていません。プロパティの追加すらできないという厳しさ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/ff939d26-9d8c-470e-b351-1a91c3a75df5.png )
ThingWorxのThingのリスト表示画面。Editボタンがむなしくグレイアウトしています。

## 補足: ThingWorxそのもの試用版とは別物
さらにややこしいのですが、同じ開発者ポータルにある[ThingWorx Foundationの試用版](https://developer.thingworx.com/ja/profile/hosting)には、編集権限があるのです。
こっちをつないでくださいよ〜、という心の声がボストン（PTCの本社）に届くことを願っています。

今回はここまで。またね。
【WPF】ユーザーコントロールとカスタムコントロールの違い

# はじめに
WPFプロジェクト上で新規の項目の追加を行おうとすると、ユーザコントロールとカスタムコントロールという選択肢がありますが、それぞれの役割についてご存じでしょうか。この記事では、ユーザコントロールとカスタムコントロールについて書いていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48623/248ada81-e200-8dbc-1a14-0063d443b767.png)

# ユーザーコントロール、カスタムコントロールのそれぞれの役割
参考ページ
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/controls/control-authoring-overview

## ユーザーコントロール
- 既存のコントロールをひと固まりにしたもの。継承元はUserControl
　よくある例としては、検索エリアや、検索結果エリア、入力エリアなどをひとまとまりにして管理したり。
- レイアウトがVisualStudioのプレビュー機能でサクッと見れる。
- パフォーマンスが悪い。（特に繰り返し、同一のユーザーコントロールを複数配置する場合)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48623/2762b1dc-17a3-906e-cc8c-631d25a2e170.png)


## カスタムコントロール
- １つの新しいコントロールとして作成するもの。既存のコントロールでは表現できずカスタマイズする場合はカスタムコントロールを作成する。継承元はControl(それ以外も可)
　よくある例としては、検索用のテキストボックス。クリアボタンやサーチアイコンがセットになっているもの。
- レイアウトがVisualStudioのプレビュー機能でサクッと見れない。
- パフォーマンスが良い。（特に繰り返し、同一のユーザーコントロールを複数配置する場合)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48623/e0e9d67b-7420-0a87-1f4c-1c4bf736557d.png)


## それぞれの使いどころ
ユーザーコントロールは画面のXXXエリアなど区切る場合にまとめるような使い方が良いと思います。カスタムコントロールは新しい振る舞いのコントロールを作る場合に利用しましょう。
PostgreSQLのユーザをOSと別管理する方法

# PostgreSQLのユーザ関連でハマりました。。。
最近業務でPostgreSQLを使うようになったので早速ローカルPCにインストールしてみたのですが、なんかPostgreSQLのシェルにログインできない。。。という状況にお陥りました。
死闘の末なんとかこの状況を打破できたので、備忘録がてら書きました。

# ハマるまでにしたこと
## インストール
```bash
$ sudo apt-get install postgresql
```

## DBの置き場所環境変数設定
デフォルトのまま使うなら必要ない

```bash
echo "export PGDATA=/usr/local/var/postgres" >> ~/.bash_profile # DBのパスを環境変数記録ファイルに保存
source ~/.bash_profile # 環境変数を更新
```

## 起動

```bash
$ postgres -D /usr/local/var/postgres # パスは環境による
# または
$ brew services start postgresql # Macのbrewで入れた場合
# または
$ sudo service postgresql start # Linuxにインストールして適切にパスを通した場合
```

## ログイン

```bash
$ psql
psql: FATAL:  database "nognog_nognog" does not exist
```
自分のユーザが作られていなければ何か別のデフォルトユーザがあるはず・・・！
と、ググるとpostgresというユーザが作られていることがわかりました。

```bash
$ psql -U postgres # -Uオプションでユーザを指定 指定なしの場合は$USERとなる
psql: FATAL:  password authentication failed for user "postgres"
```
詰んだ /(^o^)\ /(^o^)\ /(^o^)\

# なんだよそのエラー
認証が通ってないような感じでした。
で、調べてみるとpostgresというユーザはOSに作られているという記事も見つけました。

？？？

# OSのユーザとPostgreSQLのユーザを分離して設定
結果としては、PostgreSQLのユーザにpostgresというユーザが作られていただけでなく、OSのユーザにもpostgresが作られていました。
さらに調べてみると、<font color="Blue">OSのpostgresユーザ</font>で<font color="Red">PostgreSQLのpostgresユーザ</font>として、**しかも同じパスワードでログイン**しないと弾かれてしまうそうです。こりゃわからん。。。

# <font color="Blue">OSのpostgresユーザ</font>に変更

```bash
$ su postgres
su: Authentication failure
```

あれ、変更できない。。。
UNIXは新規ユーザはパスワードを設定しないとログインできないんですね。（知ってたはずなのにハマりました）

```bash
$ passwd postgres
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
$ su postgres
```

これで成功しました。
プロンプトが`postgres $`的なものになっていればOKです。

## <font color="red">PostgreSQLユーザpostgres</font>のパスワードを設定
<font color="Blue">OSのpostgresユーザ</font>でログインしているのでこのままPostgreSQLにログインします。

```bash
$ psql
```
これでPostgreSQLの対話シェルに入りました。
続いて<font color="red">PostgreSQLユーザpostgres</font>のパスワードを設定します。

```bash
> ALTER USER postgres with encrypted password 'PASSWORD'; # セミコロン必要！
ALTER ROLE
```
`ALTER ROLE`が表示されれば成功です。

## peer認証をパスワード認証に変更
PostgreSQLのシェルは一旦抜けます。あとOSのユーザも自分のユーザに戻ります。

```bash
> ^D
$ ^D
```
自分のユーザに戻ったらpeer認証をパスワード認証に変更します。
peer認証というのが、先述した「<font color="Blue">OSのユーザ名&パスワード</font>が<font color="Red">PostgreSQLのユーザ名&パスワード</font>と一致していないと弾かれてしまう認証システム」です。
セキュアなのですが、実験的な使用においては邪魔でしかないので、それぞれのユーザを分離します。
と言っても、設定ファイルを一部書き換えるだけで完了です。
その設定ファイルが`pg_hba.conf`なのですが、バージョンやOSによってパスが異なります。以下の例では、バージョンが10、OSがUbuntuの場合です。

```bash
$ sudo vim /etc/postgresql/10/main/pg_hba.conf # パスはバージョンやOSによって異なる
local   all             postgres                          peer # → md5 に変更
```
変更したらPostgreSQLを再起動します。

```bash
$ sudo service postgresql restart
```
最後に<font color="Blue">OSの自分のユーザ</font>から<font color="Red">PostgreSQLのシェルにpostgres</font>でログインできることを確認します。

```bash
$ psql -U postgres
```

ログインできれば成功です。

# 終わりに
いくつになってもシェル周りはスムースにこなせませんが、やっぱり解決できると楽しいですね！
Railsにおけるマイグレーション


#はじめに
初投稿になります。
今回は、railsの学習でマイグレーションについて学んだのでまとめていこうと思います。

#マイグレーションとは？
railsにおけるマイグレーションとは、直接SQL文を実行しなくても、rubyでテーブルを操作できる仕組みのことです。
マイグレーションファイルはrubyで書くことができ、テーブルの作成・削除、カラムの追加・変更などを行うことができます。

#モデルの作成
マイグレーションを行うためにはまず、データベースのテーブルに対応するモデルを作成します。
今回は、会員制のアプリを作るため、メンバーモデルを作成しています。

```rails g model member```

モデルのクラス名は先頭が大文字の単数形になります。

```menber.rb
class Member < ApplicationRecord
end
```

#マイグレーション
モデルを作成すると、db/migrateディレクトリの下に「年月日時分秒_create_テーブル名.rb」というファイルができます。このファイルをマイグレーションスクリプトといいます。
ここにデータベースの構成をrubyで書いていきます。

```db/migrate/年月日時分秒_create_members.rb
class CreateMembers < ActiveRecord::Migration
  def change
    create_table :members do |t|
      t.string :name, null: false
      t.string :full_name
      t.string :email
      t.date :birthday
      t.integer :sex, null: false, default: 1               
      t.boolean :administrator, null: false, default: false
　　　　　　
      t.timestamps
    end
  end
end
```

[null: false]というオプションは空の値は保存されないように制約を付けるためのものです。空の状態で保存しようとするとエラーになります。
また、t.timestampsによってcreate_atとupdate_atという時刻型のカラムが2つできます。Railsではレコードを作成した際にその時刻を自動的に作成し、更新したときにはその更新時刻を新しくするので、2つのカラムを作っておけばレコードの作成と更新の時刻を調べられるようになります。

マイグレーションを実行します。

```rails db:migrate
rails db:migrate RAILS_ENV=production
```

本番用のデータベースにマイグレーションを行いたいときはRAILS_ENV=productionを付けてマイグレーションを実行します。
これで、データベースにマイグレーションファイルの構成を反映できました。

#おわりに
いずれ、マイグレーションの詳細（カラムの追加・変更、ロールバック、インデックス）についても追記していきます。

#参考文献
改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)
https://www.amazon.co.jp/改訂4版-Ruby-Rails-IMPRESS-KISO/dp/429500460X
エスケープされた json を jq で整形する

## どういうことか

こういうエスケープされた json 部分を整形して表示したい

```json
{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"hoge\",\"parent\":\"abc\"}\n"
}
```

## 解決法

`fromjson` を使う。

```bash
$ pbpaste
{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"hoge\",\"parent\":\"abc\"}\n"
}
$ pbpaste | jq '.c | fromjson'
{
  "id": "hoge",
  "parent": "abc"
}
```

## 参考

Use jq to parse a JSON String - Stack Overflow
https://stackoverflow.com/questions/35154684/use-jq-to-parse-a-json-string

jq Manual (development version)
https://stedolan.github.io/jq/manual/
awk基礎まとめ

#awkは独立したスクリプト言語
shellスクリプトとは用法が異なります（ここでつまりました）
phpやpythonと同様です
	
#何ができるの？
テキストのフィルタリングを行い、決められた様式で返却することができます
grepとcutの強化バージョン（のイメージ）
awkで一部抽出し、sortすることが僕の中で話題です。

#どういうときに使うの？
テキストをパッと変換したい場合かつ、さほど難しくないロジックの場合の時に使います。
難しいロジックはphpなどのスクリプト言語を使った方が無難です。

#基本的な構文は？
pattern { action }
pattern と actionを書いていきます。

#事例
ファイルtmp.txtを使い、みていきます。

```shell
cat tmp.txt
1,2,3,4,5
2,3,4,5,6
4,5,6,3,5
1,3,4,5,6
```

##1列目のみ抽出。
```shell
# F=Field Separating
cat tmp.txt |  awk -F ,  '{ print $1 }'
#結果
#1
#2
#4
#1

```

##全列表示
```shell
#$0は全列
cat tmp.txt |  awk  -F , '{ print  $0 }'
#結果
#1,2,3,4,5
#2,3,4,5,6
#4,5,6,3,5
#1,3,4,5,6
```

##パターンに合致した項目抽出（行頭が1で始まる）
```shell
cat tmp.txt | awk  -F , '/^1/ { print $1}'
#結果
#1
#1
```

##パターンに合致した項目抽出（2列目が2で始まる）
```shell
# ~を入れる
cat tmp.txt | awk  -F , '$2 ~ /^2/ { print $0}'
#結果
#1,2,3,4,5
```

##行を指定して抽出
```shell
#NR
cat tmp.txt | awk  -F , 'NR >= 2  { print $0}'
#結果
#2,3,4,5,6
#4,5,6,3,5
#1,3,4,5,6

```

##複数条件で抽出
```shell
cat tmp.txt | awk -F , '$1 == "2" && $2 ~ /^3/ { print $0 }'
#結果
#2,3,4,5,6
```
##ファイルから読み出しawkする
```shell
awk -F ,  '{ print $1 }' tmp.txt
#結果
#1
#2
#4
#1
```

##日本語を抽出
```shell
echo "おなかすいたよ" | awk '/い/ {print$0}'
#結果
#おなかすいたよー
```

#参考資料
https://shellscript.sunone.me/awk.html