OmniAICreator/Qiita-1.07M huggingface dataset:
tediousで取得した日付がズレる時の対処法

## 解決法

接続設定のoptionsにuseUTC:falseを入れれば解決した。  
以下[公式ドキュメント](http://tediousjs.github.io/tedious/api-connection.html) の引用
> options.useUTC<br>
> A boolean determining whether to pass time values in UTC or local time. (default: true).
>> UTCまたはローカル時刻で時刻値を渡すかどうかを決定するブール値。 （デフォルト：true）

**設定例**

```javascript:config
var config = {
    userName: 'test',
    password: 'test',
    server: 'XXX.XXX.XXX.XXX',
    options: {
      useUTC:false
    }
  };
```


解決はできたけどUTCを基準にして実装した方がベストな気もするな〜  

HTMLのtableタグにcheckboxつけて行を押したら反応するようにしたいけど、jQueryは使いたくなかった

## 背景
tableにチェックボックスを仕掛けて、行を押したら反応するようにしたい。
しかし、ググっても「jQueryを使った...」ばかりでした。
jQueryは使いたくなかったので純粋なJavaScript(Vanilla.js)で実装してみました。ご査収ください。
## コード
``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>Table Sample</title>
</head>
<body>
  <table>
    <th>checkbox</th>
    <th>氏名</th>
    <th>性別</th>
    <tr onclick="trClick(0)">
      <td><input id="chkbox0" type="checkbox"/></td>
      <td>あいう えお</td>
      <td>男</td>
    </tr>
    <tr onclick="trClick(1)">
        <td><input id="chkbox1" type="checkbox"/></td>
        <td>かきく けこ</td>
        <td>女</td>
      </tr>
  </table>
  <script>
    const trClick = (num) => {
      document.getElementById("chkbox"+num).checked ^= 1; 
    };
  </script>
</body>
</html>
```

checkboxのidナンバーとtrClickの引数の値で引っ掛けてみました。
もっと素敵な書き方がありそうな気がしますが、自分の知識ではこれが限界...
アイディアがある方はぜひコメントなどでご教授ください！
7つのデータベース7つの世界

今更ながら読んでみた。以下は備忘録。

|データベース名　| 感想など |
| :--- | :--- |
|PostgreSQL　　　　　　　　　　　　　　　| 馴染みのあるRDBMS。余談だけど、そもそもこの本を読もうと思ったのはけちょんけちょんにしているのを見たからだったりする。|
|Riak|Basho(Riakの開発会社)という文に注釈がないところに時代を感じる。curl使ってDBを操作するのが新鮮。操作方法の説明だけでなくてアーキテクチャについての図解が多めなのは、mapreduceやCAP定理について触れる題材としてベストだからなのか。本の中では一切触れられてないけど、ストレージ部分にはLevelDBを使うこともできるらしい|
|HBase  |Hadoopエコシステムの一つ。データにバージョニングの概念を持ち込んでDBMSで管理するのが特徴。最新のHBaseでサンプルコードを試そうとしたら全然動かなくて苦労した。Wikipediaが公開している記事データのXMLをHBaseに取り込むサンプルは興味深かった。|
|MongoDB  |RethinkDBはなぜ失敗したのか、ってブログ記事を読んで以来ずっと触ってみたかった。データをネストできるのとクエリが柔軟で強力なのが特徴。バックグラウンドのオプティマイザとかどうなってるんだろ、データ増えたらパフォーマンス出るのかな、って疑問が自然に湧く|
|CouchDB  |Couch(寝床)のWebインターフェースがFutonといったようなネーミングセンス。MongoDB同様ドキュメントDBであり、Riak同様RESTベースで操作する。mapreduceベースのビューを介してデータにアクセスするのが特徴だと思うが、あまり心惹かれなかったので手を動かさなかった。|
|Neo4j  |グラフDB。本書を読み進めるのもここらへんで息切れしてきたし、直近のwebadminだとGremlinが同梱はされていないようだ（本書上ではwebadminから直接操作できるようになっている）。これもcurlでDBを操作するあたり、Riakが２つ目にもってきてるのは構成上正解のように思う。そして度々現れるZooKeeper。クラスタ管理を知るためにはZooKeeperが必要なんだなぁ|
|Redis  |REmote DIctionary Serviceの略。知らなかった。データストアとしてだけでなく、ブロッキングキューやPub/Subの仕組みも持つ。そして高速（らしい）。8.4章でRedis、CouchDB、Neo4jをいっぺんに扱うのは例題としても良さそう。|

あくまで2010年以降頭角を表したNoSQLプロダクトの紹介が主題で、最終章でDBMSの選択についても触れられている。最終章の内容を自分の言葉で言えるようになれば、免許皆伝なんだろうけどなかなかその領域に達するのは難しそう。
Railsチュートリアル 第11章 11.4 「本番環境でのメール送信」 で詰まったところ

# 背景
Railsチュートリアル 11.4 「本番環境でのメール送信」の最後


```
$ git push heroku
$ heroku run rails db:migrate
```
上記コマンド入力後、アカウント有効化を試すために新規登録をしたところ

# 問題
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f31343139312f64623165656132302d633330652d303633392d356462332d3162666533656637616162612e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/289345/215bb28e-837d-fe7b-75de-08aaea9b84dc.png)

We're sorry, but something went wrong.　と表示。

```
$ heroku logs
```
でエラーをチェック。

```
> Completed 500 Internal Server Error in 173ms (ActiveRecord: 3.5ms)
> NoMethodError (undefined method `activation_digest=' for #<User:0x00007fa1dc755a78>
> Did you mean?  activation_token=):
```

db:migrate したはずなのに、 activation_digest が定義されていないと言われる。
rails db:migrate:status で確認。

```
$ rails db:migrate:status
> Status   Migration ID    Migration Name
> --------------------------------------------------
>   up     20181101025217  Create users
>   up     20181101055629  Add index to users email
>   up     20181101105719  Add password digest to users
>   up     20181103133504  Add remember digest to users
>   up     20181104140053  Add admin to users
>   up     20181109103710  Add activation to users

$ heroku run rails db:migrate:status
> Status   Migration ID    Migration Name
> --------------------------------------------------
> D, [2018-11-10T15:06:18.842062 #4] DEBUG -- :    (1.1ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
>   up     20181101025217  Create users
>   up     20181101055629  Add index to users email
>   up     20181101105719  Add password digest to users
>   up     20181103133504  Add remember digest to users
>   up     20181104140053  Add admin to users
>   up     20181109103710  Add activation to users
```
開発環境、本番環境ともに *Add activation to users* は migrate されている。

# 解決
```
$ heroku restart
```
Heroku を再起動したところ、エラーは消え、メール送信、アカウント有効化まで確認できた。
更新IP

IPアドレス更新スクリプト

|#!/bin/bash                              |
|:----------------------------------------------------------------------:|
|IFCFG_DIR=/etc/sysconfig/network-scripts |
|YYYYMMDD_HHMMSS=_`date '+%Y%m%d_%H%M%S'` |
|                                          |
|echo \$IFCFG_DIR |
|  |
|if [ \$# -ne 3 ]; then |
|   echo "3個の引数が必要です" 1>&2 |
|   echo "ip_change.sh  ifcfg-ethX  IPADDR=xxx.xxx.xxx.xxx IPADDR=xxx.xxx.xxx.xxx " |
|   exit 1 |
|fi |
|  |
|if [[ ! -e \$IFCFG_DIR/\$1 ]]; then |
|   echo "ファイル " \$IFCFG_DIR/\$1 " は存在しません" 1>&2 |
|   exit 1 |
|fi |
|  |
|if  cat \$IFCFG_DIR/\$1 | grep \$2 >/dev/null; then |
|   : |
|else |
|   echo "ファイル " \$IFCFG_DIR/\$1 " 中に文字列 " \$2 " は存在しません" 1>&2 |
|   exit 1 |
|fi |
|  |
|service NetworkManager stop |
|  |
|echo \$YYYYMMDD_HHMMSS |
|cp -p \$IFCFG_DIR/\$1 /tmp/\$1$YYYYMMDD_HHMMSS |
|  |
|sed -e 's/'\$2'/'\$3'/g' \$IFCFG_DIR/\$1 > \$IFCFG_DIR/\$1.TMP |
|mv \$IFCFG_DIR/\$1.TMP \$IFCFG_DIR/\$1 |
|  |
|service network restart |
|service NetworkManager start |
|  |
|ifconfig | grep "inet addr:" |
|  |
|:----------------------------------------------------------------------:|
|#!/bin/bash |
|sh /home/ip_change.sh  ifcfg-eth1  IPADDR=192.168.56.144 IPADDR=192.168.56.140  |
vimの使い方

#vimとは？
テキストエディタの一種。
vimにはファイルを保存や終了するノーマルモード、テキストを編集する「挿入モード」など、
用途に応じていろんなモードがある。


##起動方法
```
vim ファイルパス
```

##ノーマルモード
起動時はこのノーマルモードになる。
基本ノーマルモードから各モードに遷移する形になる。

Escキー

##保存して終了
ノーマルモードにして

```
:wq
```

##テキストを編集するには？(挿入モード)
挿入モードに切り替えます。

Iキー

##コピー&ペースト
コピーはビジュアルモードで行います。
[コピー方法]
1.ノーマルモードにする
2.コピーする開始位置までカーソルを持ってくる
3.Vキーを押しビジュアルモードにする
4.コピーしたい終了位置までカーソルを動かす
5.Yキーでコピー(クリップボードにコピーされる)

[ペースト方法]
1.貼り付ける開始位置までカーソルを移動
2.SHIFT+Pで貼り付け
  この時、回数 SHIFT+P で貼り付ける回数も指定できる

##戻す(アンドゥ)
ノーマルモードにし、

Uキー

##アンドゥで戻したものを戻す

Ctrl + r
【初投稿】新卒1年目のエンジニアとして思うこと

# はじめに
初めまして、Qiita初投稿の記事です。
最初の記事は何にしようか悩んだのですが、この記事を書いている2018年11月時点で新卒1年目のエンジニアとして、今思っていることを整理してみたいと思います。
同じような立場の方にとって少しでも参考になれば嬉しいかな、程度の内容になるかと思いますので、その点はご了承ください。

# 思ったこと／感じたこと
実際に働いてみて、大切だと思ったことや、今までの考えとは違うと感じたことをざっとまとめてみます。

## 時間が足りない
最初のうちはそれほど感じなかったのですが、最近は自分の成長のためにやりたいことが多すぎて、時間が足りないと思うことが多々あります。そういうときに何が大事かっていうと、個人的には「やりたいことのリストアップ」と「優先順位の管理」だと考えています。当たり前のことではありますが、やりたいことをタスク管理して、優先順位で並べるなどの見える化を行うだけでも全然違うと感じました。（それをやるとさらに時間が足りない！ってなりますけどね…）

## 環境は意外と変化する
自分の中である程度計画を立てて「こうしよう！」と考えたとしても、次の日には状況が変わってしまった、なんてことが結構あったんじゃないかなと思ってます。私は新卒で配属されてから数か月で早速チームの異動を経験したのですが、この変化はかなり大きかったです。

## モチベーション維持の難しさ
大学での開発と仕事での開発で大きく異なるのは、「好きなことが自由に開発できるか」、「品質を重視するかどうか」ではないかと感じました。品質を気にせずプロトタイプを自由に開発できるのは凄く楽しいです。でも、仕事では与えられた作業を品質向上のために地道に開発することが多いため、モチベーションの維持が大学の当時よりも難しいと感じました。

## 仕事って何？
そもそも、仕事って何なのか、今の業務をなぜやっているのか等々を自問自答するようになりました。（やばい）
モチベーションが保てていないときは特に、何で今自分はここにいるんだろう？とか思ったりすることもありました。自分の中で考えをまとめる時間が取れていなかったのも大きかったんじゃないかなと思ってます。

# 心がけるべきこと
上記の内容を踏まえて、これから心がけていきたいことをまとめます。

## 常に危機感を持つ
自分の成長のためにやりたいことが多いということは、逆に言うと自分自身に足りていない部分が多い可能性が非常に高いです。このままではダメだという危機感が行動の原動力の一つになると考えています。危機感や焦りは、あればあるほど良いんじゃないかなと思います。（自分を追い込み過ぎない程度にですが）

## 周囲の環境に依存しない
周囲の環境は頻繁に変化するので、自分自身がどうあるのかを重要視する必要があると思います。
周りがこうだからとか、あの人はどうだからとか気にしている暇があれば、その時間を自分自身の成長のために使うべきだと感じるようになりました。そうでないと時間が足りません。
また、周りの環境に頼り過ぎていると、それが急変したときに一気に自分が崩れます。最悪、周りばかりを気にすることで自分が形骸化してしまい、環境の変化に伴って自分自身を見失ってしまうかもしれません。周囲の環境に甘えて大丈夫だと身を委ねるのではなく、環境の変化に対応できるように自分をスキルアップすることが大切だと考えるようになりました。そのために必要なのは、幅広い視野・興味・知識を持つことではないかと思っています。

## インプット／アウトプットを大切にする
モチベーションを上げる方法の一つとして、インプットとアウトプットは非常に重要だと感じています。当時は特に、アウトプットをするのは広くても自分の周辺だけだったのですが、Qiitaを始めとしてより広範囲にアウトプットすることで、自分自身の価値を高めていけるような気持ちになれるんじゃないかと…。成果物がないと、無駄に時間を過ごしてしまった気になってしまうんですよね。インプットしたことが自分の身になっているかどうかを確認する意味もあります。インがアウトに繋がり、アウトから得たインをさらに身に付けていく、という循環が生まれれば非常に素敵です。

## 仕事への固定観念をなくす
仕事というと、組織の下で与えられた業務に取り組むというイメージが強かったです。ですが、時代とともに働き方も多様になって、今までの仕事のイメージを一旦崩す必要があると感じています。
自分自身がインプットしたことを用いてアウトプットする作業は全て仕事であると捉えることができれば、ただ単に業務をこなすよりも充実した日々を過ごすことに繋がると思います。業務以外の好きでやっていることでも、考え方次第では仕事になることを忘れないようにしたいです。


# まとめ
結局ダラダラと書いてしまい、内容もふわふわして分かりにくいかとは思いますが、最後に心がけたいことから繋がる今後のイメージをまとめて終わります。
　・危機感を持つ　→　行動を起こす　→　時間を最大限に活用していく
　・周りを気にしない　→　その時間を自分のために使う　→　時間を有効活用する
　・広い興味／視野　→　広い知識　→　変化への対応力の向上
　・インプット　→　アウトプット　→　モチベーションの向上　→　インプットを加速
　・業務以外にも興味を持つ　→　業務以外でアウトプット　→　仕事に繋げる　→　仕事の幅を広げる

以上、言うだけならば簡単なので、地に足付けて一つずつ実践していきたいと思います。
そのためには、もっと具体的な内容にブレークダウンする必要がありますね…。
時間があれば、またまとめ直していこうかと思います。
為になる内容ではなかったかもしれませんが、多少なりとも参考になれば幸いです。
最後までありがとうございました。
【swift 4】 2つの日付の差が何日かを整数で取得する。

【swift 4】 2つの日付の差が何日かを整数で取得します。

```swift
let myDateFormatter = DateFormatter()
myDateFormatter.dateFormat = "yyyy年M月d日"
let day1:Date = myDateFormatter.date(from: "2018年11月29日")!
let day2:Date = myDateFormatter.date(from: "2018年12月2日")!
let dayInterval = (Calendar.current.dateComponents([.day], from: day1, to: day2)).day
print(dayInterval!)
```
print結果は 3 です。
day1 と day2 の日付を入れ替えると、結果は -3 になります。
AWS PowerShell で MFA入力を減らしてみる

AWS PowerShell 使ってますか？

awscliはMFA対応がちゃんとしていて、一度MFA入力したらしばらく大丈夫ですが、AWSPowerShellだと入力の都度求められて嫌になりますよね。

PowerShellでもスクリプトスコープの変数にSessionTokenを突っ込めばイケそうなきがしたので実装してみました。

# インストール方法

モジュール内部からAWSPowerShellを使うのでインストールしておいてください。
msi版でもよいですが、PowerShell v5.x(Windows10)なら`install-module awspowershell`でもインストールできます。

スクリプトモジュールとして実装したので、 [STSHelper.psm1](https://gist.github.com/ktsugita/acbc2f92210ea2e06d2f2cf4fbf32d39/raw/870d9df3c2488a7ec51413d8dd13399628fa2bc8/STSHelper.psm1) をダウンロードして、BOM付きUTF-8で保存して、下記の要領でインストールしてください。


```PowerShell:install.ps1
$destdir = Join-Path $env:PSModulePath.split(';')[0] "STSHelper"
if (Test-Path $destdir) {} else { mkdir $destdir }
copy-item STSHelper.psm1 $destdir
```


# 使用方法

## 準備

認証情報をプロファイルに保存します

* <ソースプロファイル> IAMアカウントのアクセスキーを指定したプロファイル

	```PowerShell
	Set-AWSCredential -StoreAs <ソースプロファイル> -AccessKey <アクセスキー> -SecretKey <シークレットキー>
	```

* <ターゲットプロファイル> AssumeRole先を指定したプロファイル

	```PowerShell
	Set-AWSCredential -StoreAs <ターゲットプロファイル> -SourceProfile <ソースプロファイル> -RoleArn <ロールのARN> -MfaSerial <MFAのARN>
	```

毎回起動時に設定するのは大変なので下記の`profile.ps1`に書いておくのがおすすめ

```PowerShell
$env:USERPROFILE\Documents\WindowsPowerShell\profile.ps1
```

`profile.ps1`について詳しく知りたい場合は [PowerShell で Profile を利用して スクリプトの自動読み込みをしてみよう](http://tech.guitarrapc.com/entry/2013/09/23/164357) が詳しいです。


## 利用

```PowerShell
import-module STSHelper
New-STSCredential <ターゲットプロファイル> <ソースプロファイル>
iex (Update-STSCredential)
```

以降は`iex `... だけで更新されます。

```PowerShell
iex (Update-STSCredential)
```

プロセス起動毎に初回利用時または期限切れのときはMFA入力が求められます。
それ以外は新たなMFA入力無しで1時間延長です。
メモリ(スクリプトスコープの変数)に保存しているのでランタイム毎に必要です。
スクリプト内でプロファイル保存しても呼び出し元に反映されないので`iex`してます。

## 期限の確認

```PowerShell
Get-STSCredential
```

# 課題

ファイルに保存すればランタイムをまたげると思うのですが、生で保存したくないので実装していません。

awscliみたいに無効時に必要に応じて自動的に呼び出せるようにしたいかな。
Glueの使い方的な㉙(セキュリティグループの自己参照ルール)

##　Glueにおける自己参照ルールの補足

ドキュメントを確認すると以下のように書かれている
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/setup-vpc-for-glue-access.html

>AWS Glue がコンポーネントと通信できるようにするには、すべての TCP ポートに対して自己参照のインバウンドルールを持つセキュリティグループを指定します。自己参照ルールを作成することで、ソースをすべてのネットワークではなく VPC 内の同じセキュリティグループに制限することができます。

#### 要約すると、GlueがVPC内に接続する場合は、Glueの接続に設定するセキュリティグループに自己参照ルールが必要

## やり方は2つできそう

##### ① RedshiftやRDSのセキュリティグループをGlueでも使う

RedshiftやRDSにアタッチされているセキュリティグループに自己参照ルール(自分のSGにすべて許可)を書き
そのセキュリティグループをGlueが使う
これで、GlueからRedshiftやRDSへ通信可能になる

* 適用前

<img width="689" alt="スクリーンショット 0030-11-11 10.19.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/10f297c2-8363-2ffc-cbca-50c1e77bba7d.png">

* 適用後

<img width="813" alt="スクリーンショット 0030-11-11 10.19.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/253b11a4-8b59-a109-f811-92bd0b239d3e.png">


##### ② Glue用のセキュリティグループを作る

自己参照ルール(自分のSGにすべて許可)を書いたGlue用のセキュリティグループ(SG2)を作り
それをGlueにアタッチし
Redshift,RDSのセキュリティグループにGlueのセキュリティグループ(SG2)からの通信許可を書く
これで、GlueからRedshiftやRDSへ通信可能になる

※こちらのやり方の方が直感的な気がする

* 適用前

<img width="675" alt="スクリーンショット 0030-11-11 10.19.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/68c12620-7f6b-723c-41eb-355db4acfec4.png">

* 適用後

<img width="770" alt="スクリーンショット 0030-11-11 10.19.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/3e4488bd-2fad-ac05-7b14-39d6bd4e1330.png">


※アウトバウンドはどちらも"すべてのTCP"を"0.0.0.0/0"で"許可"している

## こちらも是非

複数VPCをまたぐパターンの公式ブログ
https://aws.amazon.com/jp/blogs/news/connecting-to-and-running-etl-jobs-across-multiple-vpcs-using-a-dedicated-aws-glue-vpc/

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f
SheetJS パッケージ構成の違いについて



| 構成       |       ファイルサイズ |    XLSX/XLSB/ODS サポート    | 古い版のExcelで作成された国際化ファイルの読み込み |
|:-----------------|------------------:|:------------------:|:------------------:|
| xlsx.min.js           |            388 KB |       X        | X |
| xlsx.core.min.js      |            467 KB |       O       | X |
| xlsx.full.min.js      |            900 KB |        O        | O |

(link: https://github.com/SheetJS/js-xlsx/issues/596)

「古い版のExcelで作成された国際化ファイルの読み込み」が具体的に何を指すのかわからない。
Qiitadonのトゥート欄下にQiitaのtipsタグ新着リストを表示するブックマークレット作った

表題そのままです。画面はこんな感じになります。
別にQiitanが憎いわけじゃないんですけどね（笑）。

<img src="https://qiita-image-store.s3.amazonaws.com/0/76242/99547dfd-98b1-61f5-2acf-4b63bdbc6634.png" height="700">

下記CodePenの右ペインのリンクからURLをコピーし、ブラウザにブックマークとして保存してください。

~~[QiitaのtipsをQiitadonに埋め込むブックマークレットURL]()~~

~~ぐぬぅ……Qiitaでブックマークレットをリンクとして記事に埋め込む方法がわかりませんでした……~~

CodePen使ったらソースもブックマークレットのURLも貼れるね！　やった！

<p data-height="265" data-theme-id="0" data-slug-hash="qQaRJN" data-default-tab="html,result" data-user="hidao80" data-pen-title="qQaRJN" class="codepen">See the Pen <a href="https://codepen.io/hidao80/pen/qQaRJN/">qQaRJN</a> by hidao (<a href="https://codepen.io/hidao80">@hidao80</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 謝辞

@suin‍‍様のGitHubリポジトリ [qiita-widget](https://github.com/suin/qiita-widget) をお借りし、forkして利用させていただいています。ありがとうございます。

## 追記

~~ブックマークレットURLのコピーができない！　なぜだろう？　Markdown処理系によってもjavascriptプロトコルのURLはうまくリンクできないみたい…
どうすればいいんだろう？　調査中です。**URLコピーできる編集リクエスト募集中です！**~~

解決しました！　CodePenえらい！
php-master-changes 2018-11-10

今日は ext/fileinfo の libmagic あたりの修正があった！

# 2018-11-10
## weltling: Sync one more upstream libmagic piece
- https://github.com/php/php-src/commit/22f71a66ece2aff0c9e74632cd4c571d2559393c
- [7.2~]
- ext/fileinfo で、libmagic のコードの上流からの取り込み

## weltling: Rework magic data
- https://github.com/php/php-src/commit/60adea5496ab94bd4f67eec9f912ba038b214d1e
- [7.2~]
- ext/fileinfo で、libmagic 用のデータへのパッチを修正
- [:space:] が遅いので使わないようにし、パッチする必要のない箇所をパッチから削ったもよう

## weltling: Fix regex
- https://github.com/php/php-src/commit/992e4fbc65594a22774777c44c3a674d003de6ed
- [7.2~]
- ext/fileinfo で、libmagic の正規表現を修正
- バックスラッシュ受け付けるようにしてるのかな
Qiita に Qiita のことを書くのはガイドライン違反なのか？ 技術共有サイトとソーシャルサービスの違い。そしてユーザーコミュニティ論。

様々な意見はあるし、どれも正しいと思う。

# 私の意見

In My Onion

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0aa0ad67-2a14-18c6-3706-ed1061c1ac5a.png)





## プラットフォームについて語れないプラットフォームなんてないよね。

- Youtube自体について動画投稿してはいけないYouTube
- はてなブログ自体について記事を書いてはいけない、はてなブログ
- FaceBook自体について語ってはいけない、Faceook

そんなプラットフォームは残念だと思う。そんなのは嫌だ。

# 僕らはどこでQiitaについて語れば良いのか？

Qiitaについて語る時だけ、はてなブログを使ったり、外部サービスを使えば良いのだろうか。

ユーザー同士は分断されて、自由闊達な議論など到底不可能になるんじゃないだろうか。

# Qiitaはなんだかんだ言ってコミュニティじゃないか

もう歴史も長い。

単なる技術情報共有サイトではなくて、ソーシャルサイト、プラットフォームサイトとしての働きが大きくなってきているように思う。

最近のトップページでの「トレンド」の導入もその動きをブーストしていると思う。

技術情報共有9 対 ソーシャル1 ぐらいではあるかもしれないけれど。

# もし「Qiita語り」がガイドライン違反であるならば

Qiita自体について語れる場所を、何か公式で用意してほしいと思う。

# Githubの例に学ぶ、ユーザーフォーラムの必要性


>Github の時代になる前は、ある程度の規模のOSSプロジェクトはみんな Issue Tracker と別に フォーラム (BBS, ML など) を持っていました。ユーザーはフォーラムでディスカッションし、 Issue Tracker は Issue Tracking のために利用されていました。
>
>ユーザーがフォーラムで質問した場合、他の回答できるユーザーが回答することが頻繁にありました。
そうやってユーザーコミュニティーが自然発生し、育っていくことができました。
>
>しかし、 Github の時代が来て、 Github が forum 機能を提供しなかったために、 Issue Tracker が質問の場として使われるようになってきました。

[Github issue で質問してはいけない - Qiita](https://qiita.com/methane/items/78a90c6efb1a7c4da57d)

# サービスアプリケーション論としてのQiita論

Qiita語りをするにしても、それをソーシャル論、アプリケーション論、システム論、コミュニティ論になるぐらいには論を深める努力をしたい。

Qiita自体が1個のサービスなのだから、その根本について語ることは、まさに僕らが扱っている「サービス・アプリケーション」というものの本質を考えることになるはずだ。

サービスを提供しないアプリケーションは世界に1個も存在しない。

# Qiitaについて語ることは、誰に迷惑をかけているのか

「トレンドで目に入る」ということが問題なのかもしれない。

そもそも根本的な問題として「技術情報メインで使いたい勢」と「コミュニティとして”も”使いたい勢」の間で、分断があるのかもしれない。

# Qiitaの歴史はターニングポイント？

その波を感じている。


# サポートに直接、意見を送るべきじゃないの？

ぜんぜん直接送って良いと思う。

けれどそれは「Qiita自体について、Qiitaで語らざるべき理由」にはならないと思う。


# あわせて読みたい？

- [Qiitaと炎上問題。ユーザー努力によるコミュニティ改善は可能だ。 - Qiita](https://qiita.com/YumaInaura/items/27a766acfb42c1203a11)
- [「Qiitaでのアカウント停止について」の大事な3点。HRTは最重要ガイドライン・スルースキルを身に着けよう・停止理由は「技術的誤り」ではない。 - Qiita](https://qiita.com/YumaInaura/items/eb71e0a85fe906581971)

# 関連

- [最近のQiitaの記事の質が下がってきている事への考察 - Qiita](https://qiita.com/wannabe/items/294b34334a94e8e3618c)
  - こちらについたコメントを読んでいて、思い立ってこの記事を書いた。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NetBeans のデモを動かしてみる

[NetBeans を入れてみた](https://qiita.com/jp_yen/items/41420091b94d6f71e7eb)ので、デモを動かしてみる。
NetBeans を起動した画面 (出てないときは「ヘルプ」→「開始ページ」で表示する)の左に「サンプル・プロジェクトを試す」とあるのでクリックしてやる。
![開始ページ.png](https://qiita-image-store.s3.amazonaws.com/0/306041/5d454a85-2f82-92c4-54a2-52aca00006ad.png)
円周率とかあるじゃないですか。
![円周率.png](https://qiita-image-store.s3.amazonaws.com/0/306041/efe88a11-61da-232c-5d4a-1efa32077287.png)

ツールコレクションは「デフォルト」にしてから、cygwin を元にこんな設定に書き換えたらビルドできるようになりました。(ツール (T)→オプション (O))
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306041/1ea8f147-34f7-1906-80d9-fdf116e713c7.png)
![C_inc.png](https://qiita-image-store.s3.amazonaws.com/0/306041/be333a5e-1b19-93c3-f0f7-01405f9f7ab2.png)
![cpp_inc.png](https://qiita-image-store.s3.amazonaws.com/0/306041/05f3829b-1755-8cb3-f606-f80980ea050b.png)

パスの設定はうまくいかなかったので、VBScript で設定。

```vb:NetBeans&nbsp;IDE&nbsp;8.2.vbs
set oShell = CreateObject("WScript.Shell")

' パスを通す
set env = oShell.Environment("Process")
env.Item("PATH") =  env.item("PATH") & ";H:\msys64\mingw64\bin;H:\msys64\usr\local\bin;H:\msys64\usr\bin;H:\msys64\bin;H:\msys64\usr\bin\site_perl;H:\msys64\usr\bin\vendor_perl;H:\msys64\usr\bin\core_perl"

' NetBeans.exeを実行する
oShell.Run """C:\Program Files\NetBeans 8.2\bin\netbeans.exe"" --jdkhome ""C:\Program Files\Java\jdk1.8.0_192""",  , False
```
TOOLS_PATH とか UTILITIES_PATH ってどうやって設定するんですかねぇ？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306041/a2573973-8fba-1026-5e55-d2b920eae531.png)
あ、PATH 欄に直接書き込んだらよかったのか？

円周率を計算するプログラムが何個か入っており、Serial が通常版、Pthreadsで始まるものは pthreads を使ってマルチスレッドで計算、OpenMP は OpenMP を使って簡易にマルチスレッドで動くものかもしれない。適当なのを選んで緑の 右矢印 をクリックするとビルドから実行までやってくれます。
![pi_mp.png](https://qiita-image-store.s3.amazonaws.com/0/306041/e72339d3-853c-cc2c-210f-70b98315e9e0.png)
私の環境だとプログラムの実行時間は
Serial: 12s
Pthreads: 1s
Pthreads_safe: 269ms
Pthreads_Hot: 3s
OpenMP: 3s
となりました。エクスプローラーからダブルクリックすると dll が見つからないと言われるのでスタティックリンクにするのが良いかもしれません。
さっきの serial や、Pthreads～ を選択するプルダウンの下の「カスタマイズ」を開くとコンパイラ毎の設定が出てくるので
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306041/1fc8cd31-d192-f56f-44d2-c310b4283187.png)
[Swift] Optional<Void>を使う

何の意味があるのか分からない`Optional<Void>`（ `()?` ）を使ってみました。

### これは意味があるぞ

```swift
func hoge() throws
```
という値は返さないけど例外を投げる場合があるAPIを例外の内容は捨てて例外の有無だけ確認する。

```swift
func testHoge() {
   guard let _ = try? hoge() else { return }
}
```
あるいは

```swift
func testHoge() -> Bool {
  return (try? hoge()) != nil
}
```

### これは意味がないぞ

特に何も返さないけど成功したかどうかだけを返す。

```swift
func fuga() -> ()? {

   guard XXXX else { return nil }

   return ()
}
```

```swift
func testFuga() {
    
    guard let _ = fuga() else { fatalError("なんか失敗した") }

    fuga()  // 値を使用しなくても警告が出ない
}
```

値を使用しなくても警告が出なくて便利！


素直に`@discardableResult`を使ったほうがいいぞ！

```swift
@discardableResult
func fuga2() -> Bool { … }
```

### 結論

知ってて損はないがわざわざ使うものではない。


### おまけ

`Result<Void>`は結構使えるぞ！
「オレオレ・キーバインド」はやめなさい。生産性の高いエンジニア・プログラマがデフォルトのショートカット設定を愛する理由。


# ショートカットなめんな。

たかがショートカットと思うなかれ。

押しにくいショートカットはじわじわとプログラミングの集中力を削っていく。

100回200回と繰り返される「小さなイライラ」は、ものすごく人間の気力を奪う。

でこぼこ道を走る車とか、障害物競走のようなものをイメージしてみると良い。

# 生産性に直結するショートカットの使い方


- ショートカットキーをうまく使えない自分の生産性 100
- ショートカットキーをうまく使える自分の生産性   150

このぐらいのインパクトはあると思っている。

根拠は「俺の指」。

サブタイトルは「生産性は自分比較で比べなさい」。
 
# プログラミングの楽しさや生産性は「いかにキーボードを心地良く叩けるか」にかかっている。

これは僕の信条だ。

嘘だと思うなら信じてみてほしい。


# キーバインド変えないの？

変えない。

組み合わせが増えてくると、管理不可能になる。

# 「オレオレ・ショートカット設定」「オレオレ・キーバインド」はめちゃくちゃ難しい

たとえばひとつのアプリケーションで、良いショートカット設定を見つけたと思っても、別のアプリケーションとの統一性を考えると、もう無理。

生態系が崩れて「指が混乱する」ことでまた、小さなイライラが溜まっていく。

また組み換えが必要になったりする。ひとつを組み替えると、また別のアプリケーションのショートカットの統一性が崩れて。以下無限ループ。エンバグエンバグ。

ごく限定的に、どうしても必要な時にだけ書き換えるのが良い。

# 自分がデフォルトに適応するのが一番良い。

こいつは指の問題だ。

お前はピアニストになるのだ。

よし、ショートカットの練習だ。

# Macで `Option + Command` を押す時の指のフォームを練習する例

こいつは押しにくいのに、重要操作にバインドされていたりする。ねじり込むように練習練習。

## 上から見た図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fe7b7780-1514-425f-0dca-8fc24b9a84d1.png)

## 横から見た図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/29f9d7c7-7f21-c6d1-a34a-f8fb2d4c4af2.png)

# 具体的な練習方法

- 意識する。
- 使う。
- 使わなかった自分の指に気付いたら、その時にやりなおして使う。

以上。

# 「間違ったら、戻って、やり直す」

ちなみにこれは、音楽などの練習でもおこなわれている鉄則。

人間が物事を練習する時の基本法則。大原則。

これをしないと永遠に上手にならない。

# エリクソンの「意図的な練習」 (「限界的練習」と誤訳されているもの)

詳しくはこちらを参照のこと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e24db46b-b82e-e1cf-2b20-8093334a5074.png)

# ただしCapsキー、お前は別だ。

- CapsキーをCommandキーのアクションに上書きするのはデファクトスタンダード。
- ほぼ100%に近い確率で何の干渉も起こさないことが予想される。置き換えよう。
  - 自分も他の人も、まずCapsキーを使うケースというのが思い当たらない。
  - ヨドバシカメラの体験コーナーで新しいMacBookでキーボードを叩いたときに「えっ、なんでCommand+C/Vでコピペできないんだ」「そういえば、Capsキーなんてあったな」と思い出すぐらい。

# オレオレ最小限の法則

完全に無ではなく、有でもない。最小化だ。

どうしてもやむ終えない場合にだけ、バインドの上書き、ショートカット設定の変更をおこなう。

# あわせて読みたい？

- [Mac – Option + Command キーのショートカットは押しにくいけど、慣れたら大丈夫。親指+小指で指のフォームの練習をしてみよう。 - Qiita](https://qiita.com/YumaInaura/items/aec61efca49245b50df9)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Mac – Option + Command キーのショートカットは押しにくいけど、慣れたら大丈夫。親指+小指で指のフォームの練習をしてみよう。

# Mac で Option + Command キーのショートカットは押しにくい

けれど、よく使われる。

# どこで使われる？

- GoogleChrome でのタブ切り替え
  - 一時期MacのGoogleChromeに不具合があり、`Command + Shift + [ ]`が効かなくなっていた。
  - これを解消するために色々と設定をいじろうとしたが、自分のほうが適応することにした。
  - この件をきっかけに `Option + Command + 左右キー` の方のショートカットを使うようになった。
- Mediumでテキストを「見出しにする」

など、僕にとってはかなり重要な操作を担っている。

# 「小指」+「親指」

おすすめ。少なくとも自分にはこの押し方が合っている。

## 上から見た図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fe7b7780-1514-425f-0dca-8fc24b9a84d1.png)

## 横から見た図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/29f9d7c7-7f21-c6d1-a34a-f8fb2d4c4af2.png)


# 教訓

押しにくいショートカットは練習しよう。

# 環境

- MacBook Air (13-inch, Early 2015)

# あわせて書きたい。

- ショートカットキーなめんな。生産性の高いエンジニア・プログラマが「指のフォーム」を練習する理由。
  - [「オレオレ・キーバインド」はやめなさい。生産性の高いエンジニア・プログラマがデフォルトのショートカット設定で”指のフォーム”を練習する理由。 - Qiita](https://qiita.com/YumaInaura/items/7e0391e04425033839b6)
- Mac – iTerm2 と GoogleChrome のタブ切り替え / スワップ のショートカットを統一する
  - 書きたい。
 
# あわせて読みたい？ 聴きたい？

- [ブログは Mac Book Air のキーボードを叩くために存在する - Yuma Inaura 稲浦悠馬](http://yumainaura.hateblo.jp/entry/2017/04/20/090737)
- [今日は妻にMacBookAirを貸す日。式のムービー作成のために。 | 妻との話](http://wifeandme.net/%E4%BB%8A%E6%97%A5%E3%81%AF%E5%A6%BB%E3%81%ABmacbookair%E3%82%92%E8%B2%B8%E3%81%99%E6%97%A5%E3%80%82%E5%BC%8F%E3%81%AE%E3%83%A0%E3%83%BC%E3%83%93%E3%83%BC%E4%BD%9C%E6%88%90%E3%81%AE%E3%81%9F%E3%82%81/)
- [MacBook Air生産終了？ 僕がいかにMacBook Airを愛しているか。(YouTube動画)](https://www.youtube.com/watch?v=xe-s0B9HklM)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
全ての開発者が学ぶべき2つの言語

# このような傲慢なタイトルが多く、業を煮やしました
ここでは、私なりのプログラミング上達論を言います。
なお、爆速で成長するという意見も、傲慢極まりないと考えます。
# はじめに
## [あなたなら、完璧なプログラミング言語をどのようにデザインしますか？](https://jp.quora.com/%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AA%E3%82%89-%E5%AE%8C%E7%92%A7%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%82%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB)
に、[アラン・ケイ](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A9%E3%83%B3%E3%83%BB%E3%82%B1%E3%82%A4)氏が回答されておりますが、
「完璧であることとより良い事は、必要であることに対する敵です。」
# 最初にJavaを学ばないでください
ある専門学校では、一貫してJavaを教育します。
欠席すると教師が
「このタイミングで休む事をどう思いますか？」
と教室の生徒全員に聞きます。
生徒たちも、「信じられません」と言います。
この専門学校を卒業した生徒の就職率はとても良いです。
会社の評判では、とても良く飼いならされていて使いやすいそうです。
そして、幾人かはその考えに染まりきれず脱落し、
かなりの人間が柔軟性のなさから、生存率を下げ心を病むのです。
## オブジェクト指向は　哲学？宗教？
[Quoraの回答に対する低評価とその見解](https://jp.quora.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E5%B0%91%E3%81%AA%E3%81%8F%E3%81%A8%E3%82%821%E5%9B%9E%E3%81%AF%E4%BD%9C%E3%82%8B%E3%81%B9%E3%81%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/answers/106716464/comment/77690251?__filter__&__nsrc__=2&__snid3__=3466810785)
十分に抽象化されたオブジェクト指向のソースでさえ、
激動のプロジェクトを目の前にすれば、それが如何に無力なものかを理解します。

私のプログラミングスタイルでは、引数が２つオプションで追加され、
処理が渡されるまでのコーディングは１０秒ほどでバージョンは２つ飛んでも問題なく管理でき、NPMにパッケージが上がります。
派生バージョンを考え尽くし、利便性と言語学に研鑽し、手短な開発を実現していきます。
必要であればシングルトンを書き、ファクトリーに入ったインスタンスが使用された後に削除されます。
インスタンスそのものに対してのプログラミングは最小限になり、一つのセオリーの記述にのみ専念できるスタイルを取ります。

ポリモーフィズムのための不用意な継承は悪とすら考えるほどですが、誰でも同じレベルでプログラミング出来るわけではありません。

そして、そんな私にもミスはあります。

# 大切なのは、本来の楽しさ
そこで、まずはパラダイムの事は脇に置きましょう。
そして、[Scratch](https://scratch.mit.edu/)をおもむろに開くのです！
もし、近くに[CoderDojo](https://coderdojo.jp/)があるなら、
そこのメンターになることで、Scratchの理解は早まるでしょう。
もし、Scratchが肌に合わないなら[Squeak etoys](http://etoys.jp/squeak/squeak.html)をおすすめします。

## なぜ、この２つの環境が重要なのか？
昨今、[Node-Red](https://nodered.org/)や、IBM BlueMixなど、ブロック接続型のVPLも利用者が増えてまいりました。
数学的にも、圏論を主体とした**プログラムを矢印で結ぶこと**の大切さが問われ始めています。特に、Squeak etoysは、[Squeak Smalltalk環境](https://squeak.org/)上に構築されたブロックVPLで、そのままソースコードを見てSmalltalkに親しむことで、Squeak Smalltalk環境でのコーディング障壁を下げることが出来ます。

## ある、Qiitaの記事のコメントで…
和訳ですが「日本では、まだJavaとVBScriptを使っていると思っている」というコメントが入りました。こういうコメントが入ることを、我々は真摯に考え直さなくてはなりません。
## 抽象化すべきものの正体
抽象化するべきは、現実世界ではなく**あなたの目の前**にあります。
そう、**端末の計算資源**です。
オブジェクト指向は、目の前の計算資源に対して現実世界を専門的に取り扱うための**仮想の計算機**があるという事を実現したかっただけなのです。

# 終わりに
あらゆる言語は、その考察された経緯があります。
ある言語を叩くのは、**自分がただ、その言語が嫌いなだけ**という偏見の押し付けにしか過ぎません。
逆に、ある言語だけを褒めるのも同じだと思っています。
言語の製作者の皆様には、畏敬の念を忘れてはならないだけです。
そういう真摯な気持ちが、プログラミングやデザインを超えた問題領域の解決に繋がるだけですので、**深呼吸**をして、プログラミングに取り組んでみてください。
##補足、参考など
[コーディングのスピードを上げるためには、どんなトレーニングやテクニックが効果的ですか？](https://jp.quora.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%82%92%E4%B8%8A%E3%81%92/answers/107313847)

[Swiftと圏論への応用](https://qiita.com/inamiy/items/3e0c10d5eaf234b41c3d)
シクシク素数列 (Swift)


|シクシク素数列|https://qiita.com/advent-calendar/2018/4949prime-series|
|:--|:--|
|Crystal|https://qiita.com/cielavenir/items/4c95fdf14b7a247e51e0|
|Kuin|https://qiita.com/cielavenir/items/60993a2b2885690a3a4a|
|Swift|https://qiita.com/cielavenir/items/db4c93532a53bfa33ac2|
|Kotlin|https://qiita.com/cielavenir/items/f3ccdd5ebf245aba417c|
|Pascal|https://qiita.com/cielavenir/items/4c962db6825d9a5eb511|

```swift:4949.swift
//usr/bin/env swift $0 $@;exit
func isqrt(_ n: Int) -> Int {
	if n<=0 {return 0}
	if n<4 {return 1}
	var x=0
	var y=n
	while x != y && x+1 != y {x=y;y=(n/y+y)/2}
	return x
}

func isPrime(_ i: Int) -> Bool {
	if i<2 {
		return false
	}
	for j in 2...isqrt(i) {
		if i%j<1 {
			return false
		}
	}
	return true
}

func is4949(_ i: Int) -> Bool {
	if i<=0 { return false }
	if i%10==4||i%10==9 { return true }
	return is4949(i/10)
}
var n=Int(readLine()!)!
var i=2
var cnt=0
while cnt<n {
	if is4949(i)&&isPrime(i) {
		print(i,terminator:"")
		if cnt<n-1 {
			print(",",terminator:"")
		} else {
			print("")
		}
		cnt+=1
	}
	i+=1
}
```
ComposerでGoogle App Engineへのデプロイ等を楽にする

データベースの接続情報など、環境(開発/検証/本番)によって切り替える必要がある情報を.envに書き出すのは王道ですが、その切り替えまで触れた記事をあまり見かけないのでまとめてみました。
一言で言うと「環境を切り替えるために.envを上書きするコマンドをいちいち叩くのではなく、Composerに定義しちゃおうぜ」という話です。「当然じゃん？」と思う方は読み飛ばしてください。GAEだけじゃなくいろんな場面に応用のきく、開発者にとって必須のTipsかと思います。

## envファイル定義例

### env-local

```
APP_ENV=local
(省略)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

GCP_PROJECT_ID=YOUR_STAGING_PROJECT_ID
GOOGLE_APPLICATION_CREDENTIALS=/var/www/YOUR_STAGING_CREDENTIAL_FILE.json
```

### env-staging

```
APP_ENV=staging
(省略)
DB_CONNECTION=mysql
DB_HOST=xxx.xxx.xxx.xxx
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=YOUR_DB_USERNAME
DB_PASSWORD=YOUR_DB_PASSWORD
DB_SOCKET=/cloudsql/YOUR_STAGING_PROJECT_ID:asia-northeast1:YOUR_CLOUDSQL_INSTANCE_ID

GCP_PROJECT_ID=YOUR_STAGING_PROJECT_ID
```

### env-production

```
APP_ENV=production
(省略)
DB_CONNECTION=mysql
DB_HOST=yyy.yyy.yyy.yyy
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=YOUR_DB_USERNAME
DB_PASSWORD=YOUR_DB_PASSWORD
DB_SOCKET=/cloudsql/YOUR_PRODUCTION_PROJECT_ID:asia-northeast1:YOUR_CLOUDSQL_INSTANCE_ID

GCP_PROJECT_ID=YOUR_PRODUCTION_PROJECT_ID
```

### 解説

* 開発環境での動作確認に検証用のGCPプロジェクトを利用しています。
 * 開発環境からGCPの各サービスを利用するためには認証ファイルが必要なため、取得したファイルをGOOGLE_APPLICATION_CREDENTIALSで指定する必要があります。
 * 逆に**検証・本番環境では、この設定が残っているとファイルを探しに行ってしまう(そして見つからない)ため、消してやる必要があります。**


## 検証環境/本番環境へのデプロイ

### composer.json定義例

```json
	"scripts" : {
		"deploy": [
			"cp env-staging .env",
			"gcloud app deploy --project=YOUR_STAGING_PROJECT_ID",
			"cp env-local .env"
		],
		"deploy-production": [
			"cp env-production .env",
			"gcloud app deploy --no-promote --project=YOUR_PRODUCTION_PROJECT_ID",
			"cp env-local .env"
		],
		(省略)
		"post-autoload-dump" : [
			"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
			"@php artisan package:discover",
			"@php artisan gae:prepare"
		]
	},
```

### 解説

* [a1comms/GaeSupportLaravel](https://github.com/a1comms/GaeSupportLaravel)を利用しているので、それで必要とされるコマンドを"post-autoload-dump"に追加しています。
* `composer deploy`(検証環境)または`composer deploy-production`(本番環境)のコマンドを叩くだけで、「.envファイルを検証/本番環境用で上書き」「cloud app deployコマンドでデプロイ」「.envファイルを開発環境用に戻す」をやってくれます。
 * 本番デプロイ時に`--no-promote`オプションを付ける運用をしている場合も、このように定義しておくことでうっかりミスを防ぐことができます。
 * 本番環境用の方がコマンドが長いのは「検証環境の方がデプロイ回数が多い＝打つ文字が少ない方がいい」という個人的な好みによるものです。必要であれば好きに変更してもらって構いません。


## 検証環境/本番環境へのDBマイグレーション

### composer.json定義例

```json
	"scripts" : {
		"migrate": [
			"cp env-staging .env",
			"DB_SOCKET= php artisan migrate",
			"cp env-local .env"
		],
		"migrate-production": [
			"cp env-production .env",
			"DB_SOCKET= php artisan migrate",
			"cp env-local .env"
		],
		(省略)
	},
```

### 解説

* **DBのマイグレーションは開発環境から行う必要がある**ので、`composer migrate`(検証環境)または`composer migrate-production`(本番環境)コマンドも定義してみました。
 * 開発環境=Laradock等からはIPアドレス(DB_HOST)で、検証環境=GAEサービスからはソケット(DB_SOCKET)で接続する必要があります。**開発環境からの接続時にDB_SOCKETがあると失敗するので`DB_SOCKET= php artisan migrate`という感じで消してやります。**
まとめ

###java

- [javaの正規表現まとめ](https://qiita.com/YanHengGo/items/e315986bb2f549f4f685)

- [[Java]ThreadとRunnable](https://qiita.com/YanHengGo/items/2e8ce59d4703a7e205f1)

- [[Java]HashCodeとequalsのオーバーライド](https://qiita.com/YanHengGo/items/8f122ff9fd613dd45d91)

- [[Java]Hashmap,HashTableの違い](https://qiita.com/YanHengGo/items/21ca9408fb59ddb7a566)

- [[Java]JVM構成](https://qiita.com/YanHengGo/items/09648e5bd239cfc34fed)

- [java のリフレクトjava.lang.reflect](https://qiita.com/YanHengGo/items/fe993791ad57af3a5fbe)

- [javaのシリアライズ(Serializable)](https://qiita.com/YanHengGo/items/a44a26246ba8cd82ce68)

- [java ArrayList,Vector,LinkedList 比較](https://qiita.com/YanHengGo/items/3e03d94af5e186cd8c0c)
 
- []()
 
- []()
 
###Android

- [Android のnavigationview](https://qiita.com/YanHengGo/items/48018c954638e9a77031)

- [Androidで(Excel)グラフを作成](https://qiita.com/YanHengGo/items/679da8fd439f8e317b1f)

- picker dialog
 - [Androidのpicker dialog自定義](https://qiita.com/YanHengGo/items/43c30c2f0d619a7f05c6)
 - [Androidのpicker dialog](https://qiita.com/YanHengGo/items/bf2dab0856a617b41b69)

- [Android launchModeの違い](https://qiita.com/YanHengGo/items/ad915d6ef783854a7844)

- アニメション
    - [Androidのアニメーション(着信)](https://qiita.com/YanHengGo/items/045d586b41c49a793d06)
    - [Androidのアニメーション(ハート)](https://qiita.com/YanHengGo/items/09d8b0d7a8ba046b77c8)
    - [Androidのアニメーション(ボール落下)](https://qiita.com/YanHengGo/items/6b883fd57583257ba859)
    - [Androidのアニメーション(組み合わせ)](https://qiita.com/YanHengGo/items/dadd25f4bde1f40ddb06)
    - [Androidのアニメーション(画像１つ)](https://qiita.com/YanHengGo/items/ac3e1dd01a71ac10b06a)
    - [Androidのアニメーション(画像複数)](https://qiita.com/YanHengGo/items/6717e10639dc947e53f3)

- []()

- []()

- []()

- []()

- []()
MacにRedis入れてSUB/PUBとかを試す


Laravel EchoでRedis（SUB/PUB）使うのでおさらい。


### インストール

```bash
brew install redis
```

### Redisサーバの起動

```bash
redis-server
```

終了はctr + cで。

### Redisクライアントの利用

別のコンソールで、

```bash
redis-cli
127.0.0.1:6379>
```

### Key-Valueの登録・確認

いちおう。どんなkeyがあるかはKeysで確認。

```bash
set name hoge
get name

Keys *
```

### SUBSCRIBE/PUBLISH

コンソール１で

```bash
redis-cli
>SUBSCRIBE hoge
1) "subscribe"
2) "hoge"
3) (integer) 1
```

>hogeというチャネルを購読。

コンソール２で、

```bash
redis-cli
>PUBLISH hoge "hello world!"
```

>hogeというチェネルに発行。

コンソール１に、

```bash
1) "message"
2) "hoge"
3) "hello world!"
```

>発行したものが届く。

簡単ですが以上です。
NetBeans IDE 8.2 をインストールしてみる

放送大学の授業で Java をとったところ NetBeans を使うように指示があったのでインストール。Eclipse じゃないんですねぇ。
キーワード的なレベルでやったことのメモ。

#ダウンロード & インストール
[NetBeans 日本語サイト](https://ja.netbeans.org/)を見ると最新版は 8.2 らしいのでこれをダウンロード。[NetBeans](https://netbeans.org/) には 9.0 があるみたいですが、日本語化されてないっぽいので却下。
NetBeans は Java の上で動くので Java も拾ってくる。
試しに Java10 や、Java11 を入れたところメニューから「新規プロジェクト」を選択しても何も起きない (プロジェクトウィンドウが開かない) など、不具合があったので 8.2がリリースされた当時 (2016/10) 最新だった [Java8 JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) を入れなおす。

# NetBeans の設定を直す
NetBeans にさっき入れた Java11 の設定が残っているので、Java8 のパスに書き換える。これは設定ファイルを直接書き換える。
対象ファイルは C:\Program Files\NetBeans 8.2\etc の中辺りに。

```config:netbeans.conf
# Default location of JDK:
# (set by installer or commented out if launcher should decide)
#
# It can be overridden on command line by using --jdkhome <dir>
# Be careful when changing jdkhome.
# There are two NetBeans launchers for Windows (32-bit and 64-bit) and
# installer points to one of those in the NetBeans application shortcut 
# based on the Java version selected at installation time.
#
netbeans_jdkhome="C:\Program Files\Java\jdk-10.0.2"
```

とかかいてるところがあるので`netbeans_jdkhome="C:\Program Files\Java\jdk1.8.0_192"`などと書き換えて起動しなおせば OK

コメントにあるように、一時的に JDK_HOME を変更するには`netbeans.exe --jdkhome "C:\Program Files\Java\jdk1.8.0_192"`とする方法もあるらしい。

なので、起動する Java を切り替えたいときや、環境変数を追加したいときは vbs とかから叩いて

```vb:NetBeans&nbsp;IDE&nbsp;8.2&nbsp;for&nbsp;Java10.vbs
set oShell = CreateObject("WScript.Shell")

' パスを追加する
set env = oShell.Environment("Process")
env.Item("PATH") =  env.item("PATH") & ";H:\msys64\mingw64\bin;H:\msys64\usr\local\bin;H:\msys64\usr\bin;H:\msys64\bin;H:\msys64\usr\bin\site_perl;H:\msys64\usr\bin\vendor_perl;H:\msys64\usr\bin\core_perl"

' ライブラリにパスを通す
env.Item("LD_LIBRARY_PATH") =  env.item("LD_LIBRARY_PATH") & ";H:\msys64\mingw64\bin;H:\msys64\mingw64\x86_64-w64-mingw32\lib"

' NetBeans.exeを実行する
oShell.Run """C:\Program Files\NetBeans 8.2\bin\netbeans.exe"" --jdkhome ""C:\Program Files\Java\jdk-10.0.2""",  , False
```
みたいなことができます。(ライブリへのパスは全く意味がありません。ただの例です。)
バッチファイルだと、ウィンドウが開いたままで邪魔なので WScript の vbs が良いかなと。

この記事を書いた意味は...
1. NetBeans 最新の日本語版は 8.2
2. それに対応する java のバージョンは Java 8 で、Java 10, 11 は使えない。
3. NetBeans の Java のバージョンを変えるには NetBeans を入れたディレクトリの下の etc の下にある netbeans.conf を書き換える (NetBeans 本体にこの機能は無い)
4. 設定ファイルを書き換えるのが怖い時や、Java を色々と切り替えたいときは VBS 辺りから叩くと便利。
の記録でした。

ちなみに、JDK_HOME を探すには [Everything](https://forest.watch.impress.co.jp/library/software/everything/) などを使って java.exe を検索。その中から **jdk** が含まれるフォルダ名を探すと `C:\Program Files\Java\jdk-10.0.2\bin\java.exe`などがあるり、この **bin** の手前まで`C:\Program Files\Java\jdk-10.0.2`が JDK_HOME になる。
わがやのスマートホーム化

プログラミングじゃあないんですが、IoTの話なので記事にしちゃいます。
細かい手順は、偉大なる先輩方が細かく書いていらっしゃるので、概要までにしておきます。

# できるようになったこと
Amazonのスマートスピーカー「Alexa」を使って、声で家電を操作。

- テレビ
- エアコン
- 電気(照明)
- PS4

# 用意したもの
- スマートスピーカー([Amazon Alexa](http://amzn.asia/d/8Teosfn))
- スマートリモコン([NatureRemoMini](https://nature.global))
- 家電にもともとついていたリモコン

### PS4の操作用に
- RaspberryPi
- [node-red](https://nodered.org) (ソフトウェア、サービス)
- [ps4-waker](https://github.com/dhleong/ps4-waker/blob/master/README.md) (ソフトウェア)

# やり方
### PS4以外の操作
NatureRemo（スマートリモコン）の機能で、プログラミングなしにできてしまいます。

##### AmazonEchoの初期セットアップ（専用のスマホアプリ使用）
- Amazonのアカウントでログインして使えるようにする
- **スキル**を有効にする。**スキル**とは発声に対応するサービスのこと（ざっくり解釈）。

##### NatureRemoMiniの初期セットアップ（専用のスマホアプリ使用）
- 家電を登録する
- 登録した家電に対する操作を覚えさせる。具体的には家電リモコンの赤外線を覚えさせる。

### PS4の操作
##### RaspberryPiへのインストール
- node.js
- node-red
- ps4-waker

##### ps4-wakerの準備
最初にPS4側も設定する必要がある。このへんは先輩方の記事を参照ください。
[Google Homeに話しかけてPS4を操作してみる](https://qiita.com/miso_develop/items/0175c5f45a1e90464234)
RaspberryPiのコンソールからps4-wakerを実行して、PS4を起動/停止できることを確認しておく。

```bash:PS4起動
sudo ps4-waker
```
```bash:PS4停止（スタンバイモード）
sudo ps4-waker standby
```

詳しくは[ps4-wakerのreadme](https://github.com/dhleong/ps4-waker/blob/master/README.md)を参照ください。

##### node-redの準備
デバイスを[Node-red Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)（node-redのwebサービス側）に登録。
ここで登録した名前がAlexaに呼びかけるときの名前となる。
自分の場合は、「プレステ」でON/OFFスイッチ制御するデバイスとして登録。
操作する機器は同じだが「トルネ」も登録した。
（その他謎のキーワードが登録してありますが、ワードが長すぎたのかうまく反応しませんでした。）
![スクリーンショット 2018-11-11 5.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/118890/342d82dc-45c6-0c91-e1fd-23245cea4125.png)

1. RaspberryPiにインストールしたnode-redを起動```node-red```
1. ブラウザからnode-redのエディタ（パレット）にアクセス。
1. [Node-red Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)で登録しておいたデバイスをパレット上に貼り付けて、そのデバイスへの処理を登録。ここではPS4を操作したいので、最後に「ps4-waker」をcallするよう登録。
![スクリーンショット 2018-11-11 6.19.55.png](https://qiita-image-store.s3.amazonaws.com/0/118890/9719ed78-df79-4aea-db83-38636a05e1bd.png)
（なんか試行錯誤の跡がそのまま残っていますが気にしないでください…結局ON/OFFしかできませんでした）

# 仕組み
PS4起動を例に図を描きました。
おそらくNatureRemoによる家電の操作も同じような仕組みでしょう。
ろくに調べずに書いていますので、私のざっくり解釈です…
![スクリーンショット 2018-11-11 6.55.34.png](https://qiita-image-store.s3.amazonaws.com/0/118890/e4bb867f-d394-4668-cac2-29cfe8e8c598.png)

# 偉大なる先輩方の記事
@miso_develop 様 - [Google Homeに話しかけてPS4を操作してみる](https://qiita.com/miso_develop/items/0175c5f45a1e90464234)
@machu 様 - [Amazon Echoで「○○をつけて」と言って家電を操作する](https://qiita.com/machu/items/122c8403b35748bd5f4c)
CHASUKE.com 様 - [Alexaスマートホームスキル『Node-RED』を使ってみた](https://chasuke.com/alexa_nodered1/)
ARM NEONでの初期逆数推定値の補正 / Correction of reciprocal value w/ ARM NEON

#背景 / background
[前回の記事](https://qiita.com/sanmanyannyan/items/62bb5ce6ada975a7106a)の続き
Continuation from [last time](https://qiita.com/sanmanyannyan/items/62bb5ce6ada975a7106a) 
$1/a$をNewton-Raphson法で補正する際は以下の式で推定値を更新していく。
In Newton-raphson correction of $1/a$, we use formula in below.

```math
x_{k+1} = x_{n}(2 - ax_{n})
```
ARM NEONではVRECPSという命令で$2 - ax_{n}$が計算できる。(なんで全部計算してくれないのか不思議)
ARM NEON provide VRECPS instruction which compute $2 - ax_{n}$(I don't know why it does not compute whole formula). 
これを使った2次, 4次, 8次の補正の精度を評価してみた。
I evaluated accuracy of 2nd, 4th  8th order correction.
またスピードと精度のトレードオフを考慮して[@kaity0256さんの記事](https://qiita.com/kaityo256/items/3459b22fd410dc8b4e1a)を参考に3次の補正も評価した。
And I also evaluatedd 3rd order correction which is referred in [High order reciprocal approximation correction](https://qiita.com/kaityo256/items/3459b22fd410dc8b4e1a).

# 評価 / evaluation
前回と同じ方法で補正した値の相対誤差を評価した。
I evaluated the accuracy in same way as I evaluated in previous article.
[codes](https://github.com/sanmanyannyan/reciprocal_correction_method_eval)

```
div0(VRECPE itself)
	max relative difference:2.853386E-03
	true value:7.299270E-03 = 1 / 137.000000
	 est value:7.278442E-03
	true value:0 01110111 1101'1110'0101'1101'0110'111
	 est value:0 01110111 1101'1101'0000'0000'0000'000
div2(Newton-Raphson 1step(2nd order))
	max relative difference:8.218507E-06
	true value:2.047288E-06 = 1 / 488451.000000
	 est value:2.047271E-06
	true value:0 01101100 0001'0010'1100'1000'0100'101
	 est value:0 01101100 0001'0010'1100'0111'1011'011
div3(3rd order correction)
	max relative difference:2.960487E-07
	true value:9.216335E-06 = 1 / 108503.000000
	 est value:9.216333E-06
	true value:0 01101110 0011'0101'0011'1111'1011'100
	 est value:0 01101110 0011'0101'0011'1111'1011'001
div4(Newton-Raphson 2step(4th order))
	max relative difference:1.751382E-07
	true value:2.596506E-06 = 1 / 385133.000000
	 est value:2.596506E-06
	true value:0 01101100 0101'1100'0111'1111'0100'000
	 est value:0 01101100 0101'1100'0111'1111'0100'010
div8(Newton-Raphson 3step(8th order))
	max relative difference:1.191802E-07
	true value:2.442003E-04 = 1 / 4095.000000
	 est value:2.442002E-04
	true value:0 01110011 0000'0000'0001'0000'0000'001
	 est value:0 01110011 0000'0000'0001'0000'0000'000

```

#結果 / result
| Correction method |    accuracy(bits)    |
|:-----------------:|------------------:|
|      補正なし(No correction)       |                 6 |
|      2次補正(2nd order correction)       |                 12 |
|      3次補正(3rd order correction)       |                 20 |
|      4次補正(4th order correction)       |                 21 |
|      8次補正(8th order correction)       |                 22 |
やっぱりニュートン法3ステップはオーバースペックっぽいな。
8th order correction seems to be overkill.
windowsにOpenAIgym[atari]を入れる

#更新(2019.3.19)
長々とatariを入れるために記事を書きましたが1文でできる事が判明しました。
以下参考url
https://stackoverflow.com/questions/42605769/openai-gym-atari-on-windows/46739299#46739299
上記サイトによると
`pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py`
これで入れることができるそうです。
ただしVidualStudioは必要みたいです。
その時は[Visualstudio 2015C++ビルドツールを入れる]を参考してください。


#まえがき
強化学習のベンチマークの１つとしてopenAI gymがあります。
[openAI gym](https://gym.openai.com/)
有名なCartpoleやMountainCar、そしてatari社のゲームであるMs.pacman等があり、これらを使って強化学習をすることができます。


このgymとatariを入れるにあたって
macやlinuxでは`pip imstall gym`、`pip imstall gym[atari]`で入れることができますが、
windowsでは`pip imstall gym`は使えるのですが、`pip imstall gym[atari]`は使うことができません。公式がwindowsをサポートしていません。
windowsにatariを入れるには、少し遠回りをしなくてはいけません。
今回入れるにあたってつまずくことが多かったので、ここに記したいと思います。

#環境

windows10 Pro
python == 3.6.4

#参考
https://qiita.com/tmizu23/items/ff1d5c89bc99292410c0
http://daruma3940.hatenablog.com/entry/2017/08/13/030344

#baselinesとgymを入れる
```
pip install gym
pip install baselines
```
まずは自分の入れたい環境にこの２つをいれます。
もしかしたらbaselinesを入れたときにfailed失敗の文字があるかもしれませんが先に進みます。

#Visualstudio 2015C++ビルドツールを入れる
atariをコンパイルするためにMicrosoft Build Tools 2015を入れます。
https://www.microsoft.com/ja-JP/download/details.aspx?id=48159
上のリンクでダウンロードをします。
ここで無事にダウンロードできた人は次の項目に進んでください。
ダウンロードできなかった人はBuild Tools 2017が入っている可能性があります。自分はここで一度つまずきました。
まずatariをコンパイルするにはBuild Tools 2015である必要があります。2017ではできません。
そして2017が入っている状態で2015をいれることができないらしいです。なので2017を一度消してから入れ直してください。

#msys2をインストール
msys2はunix系のシェルです。pacmanというパッケージインストーラーが入っていて、今回はそれを使っていきます。
http://www.msys2.org/
上記のリンクでダウンロードします。64bit版は真ん中のx86_64で、自分のパソコンに合ったものを入れ、インストーラー通りに入れます。

#msys2にwindowsのパスを通す
msys2はデフォルトではwindowsには通しているパスが通っていません。シェルで`python`と打っても起動することはできません。
なので、設定を変える必要があります。
まずはインストールしたmsysフォルダに行き、msys2.iniを開きます。その内容は以下のようになっています。

```msys2.ini
#MSYS=winsymlinks:nativestrict
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
#CHERE_INVOKING=1
#MSYS2_PATH_TYPE=inherit
MSYSTEM=MSYS
```
この４行目にある`MSYS2_PATH_TYPE=inherit`にある`#`を消します。

```msys2.ini
#MSYS=winsymlinks:nativestrict
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
#CHERE_INVOKING=1
MSYS2_PATH_TYPE=inherit <-ここの#を消す
MSYSTEM=MSYS
```

#gitを入れパスを通す
gitが入っている人は多いと思いますが、入れていない人はgitを入れましょう。
https://git-scm.com/
インストールするときにgitにパスを通すか確認されるのでパスを通しましょう。

#atariを入れる
msys2.exeを開き、以下の３つを打ちます。

```
pacman -Syu
コンソールを立ち上げなおして
pacman -Su
pacman -S base-devel mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake
```

`pacman -Syu`をした後、msys2を再起動することが求められるのでもう一度開きます。
すべてを完了するには少し時間がかかるので待ちます。
そして最後に以下を打ちます。

```
pip install -U git+https://github.com/Kojoley/atari-py.git
```
成功するとdoneの文字があると思います。
これですべて完了ですお疲れ様でした。

#動かしてみる
以下のコードを動かしてみます

```python:
import gym
env = gym.make('MsPacman-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample())
env.close()
```

これでパックマンが動き出したら成功です。ランダムウォークなのですぐに死にます。

#(仮想環境に入れたい人向け)
自分はtensorflowを仮想環境に入れていて、アタリもそこに入れようとしたのですが、msys2上で仮想環境をactivateしても反応がなく、仮想環境をactivateしてからmsys2を立ち上げてもできませんでした。そこで仮想環境に直接パスを通すという強引な方法を使いました。もっと良い入れ方があれば教えてください。
やることは簡単で、windowsのパスに`(仮想環境のファイルのパス)\Scripts`を追加し、一番上に持っていくだけです。
入れ終わった後にそのパスを消すのを忘れないでください。
Herokuにデプロイ済みのMySQLのロールバック

## 問題

RubyOnRailsアプリケーションを作成して一旦、デプロイ。
`heroku rails db:migrate`を実行し、成功。

しかし、後からtableを変更したくなったため、既存の`migration_file`を変更。
(※理由 : 無駄なファイルを作成したくない。-> ローカルでは`db:migrate:reset`してました。)

herokuでも試してみた。

```
$ heroku run rails db:migrate:reset
```

```
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:61:in `check_protected_environments!'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.1/lib/active_record/railties/databases.rake:13:in `block (2 levels) in <main>'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/command.rb:48:in `invoke'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/commands.rb:18:in `<main>'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies.rb:287:in `block in require'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies.rb:253:in `load_dependency'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies.rb:287:in `require'
/app/bin/rails:9:in `<main>'
Tasks: TOP => db:check_protected_environments
(See full trace by running task with --trace)
```
ってクソほどエラー吐かれた。

このとき、heroku上でのMySQLのテーブルとローカルでのスキーマの整合性が取れずに、若干詰まった。


herokuはそもそも、`postgresql`を　DBとして推奨しているので、文献もあまりなかったので、メモ。

## 解決策

1: まず、herokuのSettingsを`Maintenance Mode`に変更

<img width="723" alt="スクリーンショット 2018-11-11 3.55.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/256444/eeb329cd-58e9-4833-3e39-401e8578f0c1.png">

 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

<img width="696" alt="スクリーンショット 2018-11-11 3.56.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/256444/74162f44-c9f4-cbb3-c885-dfd8c93ddf06.png">


2: 次のコマンドを実行

```
$ heroku rake db:migrate:redo STEP=10
```

このコマンドを実行してエラーはかれなかったら、大丈夫！

3: 一応の確認で次のコマンド

```
$ heroku run rails db:migrate
```

エラーはかれなかったら、いけてる！

## 参考文献

- [Herokuメモ](https://qiita.com/syou007/items/29742ebeadfefd0184ea)
- [herokuのデータベースをリセット/リストア/再構築する](https://qiita.com/quattro_4/items/a2eb3618207e21ca00d3)