OmniAICreator/Qiita-1.07M huggingface dataset:
Gitコマンド集

# 差分ファイルの出力

## ログの取得

```bash
git log --oneline
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/9a8de9fe-41f9-4838-509b-da2d8414c4ed.png)


## ブランチ内

[from_commitID]・・・変更前のID　Version１
[to_commitID]・・・変更後のID　Version２

```bash
git archive [to_commitID] `git diff --name-only [from_commitID] [to_commitID] --diff-filter=ACMR` -o _diff.zip

例）
git archive 94958e0 `git diff --name-only 1b23c9b 94958e0 --diff-filter=ACMR` -o _diff.zip
```
## ブランチ間
- gitでブランチ間の差分ファイルを抽出　　masterの変更も抽出してしまう。
masterブランチ以外に移動して、下記のコマンドを実行する。

```bash
-- falseにすると、git statusで変更ファイル一覧を表示するときに、
-- 日本語のファイル名が文字化けしないでちゃんと表示される。
git config --bool core.quotepath false

git archive --format=zip --prefix=_diff/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip
```


# 指定ログの状態に戻して、また元の状態に戻す
```bash
git branch --contains=HEAD -- で現在のブランチを確認
git log -- で戻りたいコミットを確認
git checkout [commit] -- で、作業ディレクトリが指定したコミットの状態になる。
必要なファイルをコピーする。
git checkout [branch] -- で最初の元の状態に戻る。
```

# branch


- master から作業中ブランチを生やしたベースコミットから差があるファイルを列挙

```bash
$BASE=git show-branch --merge-base master HEAD
git archive --format=zip --prefix=_diff/ HEAD `git -c core.quotepath=false diff $BASE HEAD --name-only` -o _diff.zip
```


- ブランチの一覧を取得
```bash
git branch -a
```
# --pruneオプションをつけると、fetchやpullする際に自動的にリモートで削除されているリモートブランチを削除してくれる。

## fetch --prune
```bash
$ git fetch --prune
 x [deleted]         (none)     -> origin/hoge
```
or
## git remote pruneを実行する
```bash
$ git remote prune origin
 x [deleted]         (none)     -> origin/hoge
```

## ローカルブランチとremotes/*が一致しない場合は、手動でローカルブランチを削除します。
https://teratail.com/questions/30598

```bash
# どちらも同じ
$ git branch --delete [ブランチ名]
$ git branch -d [ブランチ名]
```

```bash
$ git branch -a
  develop/112
  develop/114
  develop/115
  develop/116
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop/116
  remotes/origin/develop/117
  remotes/origin/master
```

[最低限しておくといいgitconfigの設定
](https://qiita.com/hayamofu/items/d8103e789196bcd8b489)
【Unity】簡単なセーブとロードの方法(ランキング編)

#今回やること
前回やった[Unityで簡単なセーブとロードの方法](https://qiita.com/tilyakuda/items/e3ccfbf507acfb16404f)でやった**PlayerPrefs**を用いて簡易的なランキングを実装しようと思います。
#仕様

* 一度ゲームを閉じてもデータが保持される
* 高い点数を取得したらランキングを更新する

これらを実装して組んでいこうと思います。

#コード

```C#:Ranking.cs
using UnityEngine;
using UnityEngine.UI;

public class Ranking : MonoBehaviour {

	[SerializeField,Header("数値")]
	int point;

	string[] ranking = { "ランキング1位", "ランキング2位", "ランキング3位", "ランキング4位", "ランキング5位" };
	int[] rankingValue = new int[5];

	[SerializeField, Header("表示させるテキスト")]
	Text[] rankingText=new Text[5];

	// Use this for initialization
	void Start ()
	{
		GetRanking();

		SetRanking(point);

		for (int i = 0; i < rankingText.Length; i++)
		{
			rankingText[i].text = rankingValue[i].ToString();
		}
	}

	/// <summary>
	/// ランキング呼び出し
	/// </summary>
	void GetRanking()
	{
		//ランキング呼び出し
		for (int i = 0; i < ranking.Length; i++)
		{
			rankingValue[i]=PlayerPrefs.GetInt(ranking[i]);
		}
	}
	/// <summary>
	/// ランキング書き込み
	/// </summary>
	void SetRanking(int _value)
	{
		//書き込み用
		for (int i = 0; i < ranking.Length; i++)
		{
				//取得した値とRankingの値を比較して入れ替え
				if (_value>rankingValue[i])
				{
					var change = rankingValue[i];
					rankingValue[i] = _value;
					_value = change;
				}
		}

		//入れ替えた値を保存
		for (int i = 0; i < ranking.Length; i++)
		{
			PlayerPrefs.SetInt(ranking[i],rankingValue[i]);
		}
	}
}

```

これで数値の高い順に並び変えられると思います。
【MySQL ver 8.0.12】MySQLが起動できなくなった時の原因と解決方法

プログラミングスクールに通って1ヶ月、phpの授業がはじまるので、MySQLをインストールしました。

最初は元気に起動していたのに、急に起動できなくなるエラーが…

```
$ mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/~~~.local.pid).
```

無事にエラーの原因と解決方法がわかったので、紹介させて頂きます。

## 最初にやったこと(未解決のまま)

最初にやったことは以下の通りです。

- 再インストール
- ファイル生成
- 権限の変更

色々調べてみると、上記３つの方法が殆どでした。しかし、全て試みるも全くダメ…。そこで色々な原因を探ったら、答えがみつかりました！

■参考
- [mysqlがどうしても起動しない](https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc)
- [MySQL起動できなくなった　The server quit without updating PID file](https://qiita.com/yuki0208/items/1d5554d98e9ec76084bd)
- [mysql起動で「The server quit without updating PID file」](https://qiita.com/mogetarou/items/e34ca51d3756d55d7800)

## my.cnf (設定ファイル)が原因だった！
関連ファイルをすべて削除し、インストールしてもダメだったので、他に原因があるのかな…と思いました。

思い当たるのは１つ！自分で設定したファイルです。そしてmy.cnfを削除して、MySQLを起動すると、うまくいくではないですか！！！

悪さをしていたのはこのコード！
`validate-password=OFF`

バージョン(ver 8.0.12)だと、ダメっぽいです。以下神の記事を参考にして、修正したら無事に起動できました！
・[MySQL 8.0 初期設定覚書](https://qiita.com/nobu-maple/items/3849b2161a21f90ae298)
Amazon SNSを使い、RailsからSMSを送信する

SMSでワンタイムパスワードを送りたかったのでやってみました。
Amazon SNS(Simple Notification Service）を使うと、~~**１通１円前後**とお手軽価格で送信できます😆~~
料金を大幅に勘違いしてました。。申し訳ありません。
1通7〜10円前後です。
[料金表](https://aws.amazon.com/jp/sns/sms-pricing/)
（`Enter your country / region` 欄に`Japan` を入力すれば、国内の料金がわかります）

# SMSを送ってみよう！
## SMSの設定
SNSコンソール（https://console.aws.amazon.com/sns/v2/home ）にアクセスします。
メニュー内の **テキストメッセージング（SMS）** から、**テキストメッセージングの設定管理** へ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135266/31936cf4-6d86-0886-6f06-cee501cba8d8.png)
デフォルトのメッセージタイプを**トランザクション**を選択し、
デフォルトの送信者IDに任意の英数字を入力しておきます。
（これがSMSの送信者欄に表示されると思ったんだけど・・・うまくいかなかった🤔）
他はとりあえずそのままでOKです。


## IAMユーザーの設定
`AmazonSNSFullAccess` をアタッチしたIAMユーザーを用意し、
アクセスキーIDとシークレットアクセスキーを控えておきます。

## Gemを入れる
aws-sdkが入っていなければ、追加しましょう！
Gemfileに以下を追記し、 `bundle install` します。

```Gemfile
gem "aws-sdk-rails"
```

## SMS送信
clientを作って・・・

```ruby
client = Aws::SNS::Client.new(
  access_key_id: "<アクセスキーID>",
  secret_access_key: "<シークレットアクセスキー>",
  region: "ap-northeast-1"
)
```

phone_numberには、日本なら**+81**から始まる国際電話番号を指定します。
0から始まる電話番号から変換する場合、**PhonyRails**を使うと簡単です😀
https://github.com/joost/phony_rails

```ruby
      client.publish({
                       phone_number: "<+81901xxxxx33>",
                       message: "シークレットやで",
                       subject: "",
                     })

```

自分のスマホで無事受信！
いともあっさり簡単でした。

# 本番で運用するなら？
## 上限引上を申請しよう！
デフォルトでは、１ヶ月あたりの送信上限が1USDに設定されています。
AWSサポートへ、上限引上の申請を行いましょう。
翌営業日には、申請した100USDに引き上げてもらえました😀
palletがCaskの設定ファイルを書き換えてしまう問題はもう解決していた


Emacs で [Cask](http://cask.readthedocs.io) を使っています。

そのときには [pallet](https://github.com/rdallasgray/pallet) を使うと便利だと言われています。

## 設定ファイル ~/.emacs.d/Cask が書き換えられてしまう問題

pallet を使いながら `M-x list-packages` でインタラクティブにパッケージを選んでインストールしたり、`M-x package-install` で直接パッケージをインストールしたりしていると、Cask の設定ファイル `~/.emacs.d/Cask` を全部書き換えてしまって、ファイル内をきれいに分類していたものが崩れてしまいます。

このおかげで、pallet は使わず、 `M-x list-packages` で「品定め」をした後で、`~/.emacs.d/Cask` ファイルを開いて追加して、コマンドラインで cask install をして、Emacs を再起動という面倒なことをしていました。

## 0.8 で解決

しかし公式を見ていると、

> Version 0.8 introduces the ;;;pallet-ignore comment, which allows you to tell Pallet to ignore (and retain) text following the comment.

という記述を見つけました!

喜び勇んで `~/.emacs.d/Cask` の先頭に、

```emacs-lisp
;;;pallet-ignore
```

と書き込みます。これにより、`package-install` して書き換えが起こっても、これ以降の行は残してもらえます。よかったです。

ではでは。Have a happy Emacs life.
ポップアップがユーザの注意力資産を大きく奪うので大問題 UI UXデザイン

# ポップアップが嫌われる理由を誰か知っているだろうか

- 誰か言語化をちゃんと出来ている人はいるだろうか
- 「わずらわしいから」「うっとうしいから」程度の言語化で終わっていないだろうか
- UI UX を考えるならもっときらめき豊かなる表現をできるようにしておきたい

# ポップアップが嫌われる理由

- ユーザーさえ気付いていないが脳の注意力資産が奪われる
- 人間の脳は動くもの、突如出現したものに反応するように出来ている
- ポップアップに限らず「注意度を引くレベル」が高ければ高いほど、ユーザーの注意力資産を奪う

# 注意力に質はある？

- 注意力にも質というものがあって、注意は引くけれど資産は奪わないようなインターフェイスも想像できる、根拠はない、実感
- 人間の脳はかくも複雑にできているのだから、人間の脳基準でUI UXを考えよう
- 1ユーザーとして脳処理の複雑さに気付くにはスポーツやマインドフルネス瞑想もおすすめだろう

# なぜだれもこのようなことを語っていないのか？

- 脳科学に詳しいというか、脳オタクのUI UX好き、サービス設計者が少ないのでは
- 自分がエンジニアなので単に知らないだけかも知れない
- もっと脳科学関係の一般書を読もう、5年前よりはるかに優れたものが出てきていたりするから
  - Amazonでレッツ検索、最近の洋書の翻訳が良い










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
LINE  – サービスのUI/UXが古いような気がしてきたらその直感は正しい

# なぜ古く感じるのかは競合問題

- 他のアプリケーションサービスが新しくなってきているから
- 比較と競合の問題で、アプリ自体はなにも変わっていなくても古く感じられる
- ドラクエ3が発売されたらドラクエ2は古い、ドラクエ1なんか旧世代のものに感じられる

# 昔は良かった

- すこしずつ小さなところがほころんできている感じ
- 6年前ぐらいはあんなに最先端でモダンなサンキューベリーマッチ感があって感動したのに


# どこが？

- たとえばスタンプがテキストでほとんど検索できなかったり、意識もしないような小さな部分が
- 大量動画を送信しようとすると接続エラーになるし、それをユーザーが送り直さなければいけない
  - 特に「状態の保持」「遷移」「ユーザーをわずらわせない部分」が弱いような気がしている、なんだか
- いろいろな機能は追加されているだけどUI/UXの根本部分、ユーザー体験が悪い感じ

# 教訓

- 全てのアプリケーションにはUI/UX的な寿命があると思う
- いくら小さな改善を重ねてもサービスアプリケーションの根本が変わらない限り難しいことが多そう
- サービスの根本が変わるなら別アプリを作った方が良いだろうし

# next?

[ui ux yumainaura - Google Search](https://www.google.co.jp/search?ei=wfT1W6HQAoT-8gXyxr2YBg&q=ui+ux+yumainaura&oq=ui+ux+yumainaura&gs_l=psy-ab.3...646.1824..1873...0.0..0.160.809.6j2......0....1..gws-wiz.......0j0i22i30j33i160.i4xRGzRsPLA)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Goのカバレッジレポート

scripts/test.shの中身を下記にして、カバレッジが見えるようにした(Go1.10)。

```sh:scripts/test.sh

go test -coverprofile=cover.out ./...
go tool cover -html=cover.out
```

参考
http://cuto.unirita.co.jp/gostudy/post/coverage/
CI設定時のgolint

golintは./...を用いてもvendorディレクトリが読み込まれてしまい、exitが1になることもないようだったので、下記が実行されるように設定した。（Go1.9以降）

```
$ go list ./... | xargs -L1 golint -set_exit_status
```

Go1.8以前は下記が実行されるようにすれば良さげ。

```
$ go list ./... | grep -v /vendor/ | xargs -L1 golint -set_exit_status
```

[参考]
https://github.com/golang/lint/issues/320
https://github.com/golang/lint/issues/65
GoでJSONを雑に書く

テストのフィクスチャなどで、JSONを雑に書きたくなることがあるのだけど、
文字列で定義するとJSONとしての構文チェックができず不便だ。trailing commaとか、クオートの不備とかを気にして書かなくてはいけない。

```go
js := `{
  "baa": {
    "a": 1,
    "b": 1.9,
    "c": "abc"
  },
  "foo": {
    "baa": "muu",
    "bababa": "gagaga"
  }
}`
```

なので、Goとして構造を定義して、json.Marshal()したくなる。

https://golang.org/pkg/encoding/json/

json.Marshalは構造体を渡すことも多いが、雑に `map[string]interface{}` を渡しても動作する。これを使って書いていくとよい。


## tips

* `map[string]interface{}`だと長いので、適当に型を定義して使うと便利。
* `json.Marshal`はエラーが発生する可能性があるが、自分でコード中で定義したjson構造がバグってたらどうしようもないので、エラーをpanic化してしまう雑な関数を定義してしまうのも便利。
* `json.Indent`でインデントするのもいいぞ
* `[]bytes`で扱うか `string` で扱うかは状況によるので適宜切り替えてください。

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

type object map[string]interface{}
type oo map[string]object

func MustJsonString(obj interface{}) string {
	b, err := json.Marshal(obj)
	if err != nil {
		panic(err)
	}
	var out bytes.Buffer
	err = json.Indent(&out, b, "", "  ")
	if err != nil {
		panic(err)
	}
	return out.String()
}

func main() {
	js := oo{
		"foo": {
			"baa":    "muu",
			"bababa": "gagaga",
		},
		"baa": {
			"a": 1,
			"b": 1.9,
			"c": "abc",
		},
	}
	fmt.Println(MustJsonString(js))
}
```
なぜあなたのQiita記事という情報資産は分散管理しないの？

# Qiitaというサービスが終わったら終わりですよ

- 日本の1企業のサービスに情報資産を預けるのはとても危ない(失礼すぎてごめん)
- だけど自分で1個人でブログを立てるとかはもっと信用がおけない
- かといって他に永続性が高そうな代替サービスもなさそうなので、今は最善解

# 情報分散管理のユーザー対応

- Mediumなど他サービスに記事をインポートする、勝手にWebページ解析して取ってくれる系
- 何らかの方法で個人で情報を持っておくとか正気なのか、自分が死んだら終わりだぞ
- Qiitaから情報を分散させる方法が少ないように思われて何か良い方法をゆるぼ
  - GithubGistはコードだけじゃなくてテキストも保存してくれるんだっけ？(でもGoogle検索に弱いから存在しないも同じ)

# 分散管理は何箇所で？

- 少なくとも2箇所で管理したいと思う
- 片方が潰れても片方が生きるから








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
短気なエンジニアのQiita

# 短気だから捨てたこと

# 冗長な詳細

- 書いている暇があったら次の記事を書きたい。
- 判断が難しいかも知れないが、詳細を書きすぎても役立つとは限らない。
- 言葉は少なくても言いたいことが伝われば良い。
- ゴミ記事はGoogle先生がフィルタしてくれる派。

# 関連画像

- 著作権やらなにやらを考えているうちに「いらすとや」一択になる。
- iphoneやらicloudを使って良い画像を作ろうと思っているうちに日が暮れる。
- 本文が簡潔に収められていれば画像はいらないかも。コスパ優先。エンジニアは平面情報を立体化するのが得意でしょ。

# 関連リンク

- 関連リンクを探している間に時間資産が浪費される。
- 関連リンクを探している間にエネルギー資産が浪費される。
- 関連リンクを探し終えた頃にはヘトヘトになっている。
- やるにしても爆速でリンクを探せるようにしておきたい。


# だけど関連リンク

貼るまで10秒爆速。

- [短気 yumainaura - Google Search](https://www.google.co.jp/search?q=%E7%9F%AD%E6%B0%97+yumainaura&oq=%E7%9F%AD%E6%B0%97+yumainaura&aqs=chrome..69i57.3024j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エクスポート機能のないサービスはユーザー情報資産を無視しすぎている

# たかがエクスポート機能？

- お金は資産だ。お金を盗むと処罰される。
- だがユーザーの無形資産、情報資産のサービスアプリケーションに対する罰則はたぶん存在しない。
- もし法律や罰則が存在するのであれば、エクスポート機能の存在しないサービスは存在しないはず。


# Link

- [サービスアプリケーションはユーザーの時間資産・エネルギー資産・情報資産を大事にすべき - Qiita](https://qiita.com/YumaInaura/items/41a355fb85aff38e1e49)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
サービスアプリケーションはユーザーの時間資産・エネルギー資産・情報資産を大事にすべき

# ユーザー資産とは何か

# 時間資産

アプリケーションを使う時間。

# エネルギー資産

アプリケーションを使うのに必要なエネルギー、コスト、注意力。

# 情報資産

自分が書いたコンテンツ。それを自分で管理したり、他サービスに移動させやすいこと。

# サービスアプリケーションはどうする？

- 時間資産に対してアプリケーション速度で応じる。
- エネルギー資産に対してUIの改善で応じる。
- 情報資産に対してエクスポート・インポート機能の対応などによって、資産の移動を可能にする。









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SourceTreeで認証が通らなくなった

もう、SourceTreeで認証がまったく通らなくなった。

SourceTreeのバージョンを上げた（Ver. 3.01かな？）からなのか、よく分からないが、とにかく認証が通らない。GitHubのリポジトリからフェッチしようとしただけで、認証の別ウィンドウが表示される。

しかも、その別ウィンドウの認証も通らない（しばらくすると同じウィンドウがまた表示される）。

パスワードの入力ミスとかではなく、github.comに行って自分で手入力すると問題なくログインできる。

フェッチも出来ないとなると、 **SourceTree以外のGitクライアントを探す旅に出るしかないのか……** 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/98fd5b38-28d8-db87-9db4-b61d0d3acd4d.png)

下記を試したが、すべてダメでした。

* SourceTreeのアンインストール→インストール
* Gitの更新
* credential.helperのunset
* GCMW（Git-Credential-Manager-for-Windows）のインストール
* 既存の認証情報を削除

仕方がないので、SourceTreeのアンインストールをした上で、
`C:\Users\<ユーザ名>\AppData\Local\Atlassian`
配下を全削除。ディレクトリを削除しようとすると権限エラーが発生するので、下のディレクトリから順々に削除していきました（こうすると基本的に削除できるのってなんなんでしょうね？）

そして改めてSourceTreeをインストール。
これで認証が通るようになりました。 :tada:
Goの定数の型宣言

Goの定数は型のない状態で宣言できる。

```go
const a = 1
```

こうしておくと、`int`にも`int64`にも代入できる、不思議な状態を作ることができ、便利である。

```go
var i1 int = a
var i2 int64 = a
// コンパイルできる
```

一方で、型つきで定数を作ることもできる。

```go
const b int = 1
```

この場合は型が固定されるので、`int64`には代入ができない。

```go
var i3 int = b
var i4 int64 = b // コンパイルエラー
```

## iotaを使った連続宣言

`iota`という定数のための記法がある。constでまとめて宣言する際に、自動でインクリメントした値を作ってくれて便利。

```go
package main

import "fmt"

const (
	aa int = iota
	bb
	cc
)

func main() {
	fmt.Println(aa, bb, cc) // 0, 1, 2
}
```

このように型と値を省略する記法は特殊で、型の値と宣言を引き継ぐ。この場合`aa, bb, cc`はすべて`int`型で宣言されている。

```go
var i5 int64 = cc // コンパイルエラーになる
```

iotaでなくても、こうすることができて、

```go
const (
	aa int = 1
	bb
	cc
)
```

この場合、aa,bb,cc全部がint型の1として宣言される。 (あまり意味がないのでiota以外ではこんな書き方はめったにしないが。)

## iotaを使わずにまとめて定数宣言

iota記法を先に読んで、「あーなるほどそういうことね」と思ってはいけない。以下は間違いである。

```go
package main

import "fmt"

const (
	aa int = 0
	bb     = 1
	cc     = 2
)

func main() {
	fmt.Println(aa, bb, cc) // 0, 1, 2
}
```

この場合、aaだけがint型として宣言されており、bbとccは型なしで宣言されていることになる。
aa~ccを全部int型で宣言するならば、こう書かないと駄目。

```go
const (
	aa int = 0
	bb int = 1
	cc int = 2
)
```

もしくは、これでもよい。

```go
const aa, bb, cc int = 0, 1, 2
```

enumのようなものを作るときによく混乱するのでまとめた。
vbsの作法 その18


#概要

vbsの作法調べてみた。
piとatan2、作ってみた。

#サンプルコード

```
Dim pi
PI = 4 * Atn(1)
msgbox PI

Function Atan2(y, x)
    If x = 0 Then
        If y > 0 Then
            Atan2 = PI / 2
        Else
            Atan2 = -PI / 2
        End if
    Else
        Atan2 = Atn(y / x)
        If x < 0 Then
            If y >= 0 Then
                Atan2 = Atan2 + PI
            Else
                Atan2 = Atan2 - PI
            End if
        End if
    End If
    If Atan2 < 0 Then Atan2 = Atan2 + 2 * PI
End Function

```

以上。
Nuxt.js 2.0でvue2-google-mapsを動かす

Nuxt.js 2.0で[vue2-google-maps](https://github.com/xkjyeah/vue-google-maps)を動かそうとしていろいろとハマったのでメモ。

## 普通にYarnでインストール

```shell
yarn add vue2-google-maps
```

宗教上NPMしか使えない人は好きにしてください。

## ~/plugins/vue2-google-maps.jsに下記を書く

```javascript:~/plugins/vue2-google-maps.js
import Vue from 'vue';
import * as VueGoogleMaps from '~/node_modules/vue2-google-maps/src/main';

Vue.use(VueGoogleMaps, {
  load: {
    key: process.env.GOOGLE_MAPS_API_KEY,
    libraries: 'places',
  },
});
```

process.env.GOOGLE_MAPS_API_KEYは適宜置き換えてください。
あとドキュメントどおりにVueGoogleMapsをimportすると死にます。

## nuxt.config.jsのWebpack設定を置き換える

```javascript:nuxt.config.js
    extend(config, ctx) {
      ...
      config.externals = config.externals || [];
      if (!ctx.isClient) {
        config.externals.splice(0, 0, function(context, request, callback) {
          if (/^vue2-google-maps($|\/)/.test(request)) {
            callback(null, false);
          } else {
            callback();
          }
        });
      }
    }
```

```javascript
config.externals = config.externals || [];
```
を入れないでドキュメントどおりに書いちゃう学生まで許されるお偉いくんは死にます。

```javascript:nuxt.config.js
vendor: ['vue2-google-maps']
```

と

```javascript:nuxt.config.js
plugins: [{ src: '~/plugins/vue2-google-maps.js', ssr: false }]
```

も忘れずに。
ネコに作業を妨害されてるので今日はここまで。
Reactを触ってみる。propsとstateのサンプルコード

# Reactを触ってみる
興味本位でReactを触ってみようと思ったので、
Reactについてのメモ書きです。

## propsの利用について
```js:App.js
import React from 'react';

const App = () => {
  return (
    <div>
      <User name={"Taro"} age={10}/>
      <User name={"Hanako"} age={20}/>
    </div>
  )
}

const User = (taro) => {
  return <div>Hi! I am {taro.name}, and {taro.age} years old!</div>
}

export default App;
```

上記のコードを実行すると、ブラウザ上で以下のように表示されます。
> Hi! I am Taro, and 10 years old!
> Hi! I am Hanako, and 20 years old!

### defaultProps
propsに初期値を設定します。
例えば以下のように配列を使って表示させる場合に、defaultpropsを利用することができます。

```js:App.js
import React from 'react';

const App = () => {
  const profiles = [
    { name: "Taro", age: 10 },
    { name: "Hanako", age: 20},
    { name: "guest" }
  ]
  return (
    <div>
      {
        profiles.map((profile, index) => {
          return <User name= {profile.name} age= {profile.age} key={index} />
        })
      }
    </div>
  )
}

const User = (user) => {
  return <div>Hi! I am {user.name}, and {user.age} years old!</div>
}

User.defaultProps = {
  age: 0 
}

export default App;
```
ブラウザ上では以下のように表示される。
> Hi! I am Taro, and 10 years old!
> Hi! I am Hanako, and 20 years old!
> Hi! I am guest, and 0 years old!

コード上ではageのところを定義しなかったが、コード下部のUser.defaultProprで
ageの初期値を定義しているため、guestさんの年齢が0歳に設定された。

## stateについて
直訳どおり、状態のこと。
以下のようなカウント画面を作成し、+1ボタンを連打すると、stateの状態が更新され続けます。

```js:App.js
import React, { Component } from 'react';

const App = () => (<Counter></Counter>) 

class Counter extends Component {
  constructor(props) {
    super(props)
    this.state = { count:0 }
  }

  clickPlusButton = () => {
    this.setState( { count: this.state.count + 1 })
  }

  render() {
    return (
      <React.Fragment>
        <div>count: { this.state.count }</div>
        <button onClick={this.clickPlusButton}>+1</button>
      </React.Fragment>

    )
  }
}

export default App;
```
stateの状態はChromeの拡張機能のReact Developer Toolなどで確認することができます。
Flux Standard Action に従った Flowtype でのジェネリックな Action の定義

こんな感じ。

```js
// @flow
export type Action<T: string, P> =
  | {
      type: T,
      payload: P,
      meta?: mixed
    }
  | {
      type: T,
      payload: Error,
      error: true,
      meta?: mixed
    };
```

こうしておけば `error` が `true` かどうかで `payload` の型が決まる。

```js
// @flow
type HogeAction = Action<"HOGE", string>

if (action.type === "HOGE")
  if (action.error) {
    // action.payload is Error
  } else {
    // action.payload is string
  }
}
```

## 他の方法

ググると次のような奴が見つかった。
でもこれだと `error` が `true` かどうかで `payload` の型が決まることはない。

```js
// @flow
type Action<A: string, P> = {|
  type: A,
  payload?: P | Error,
  error?: boolean,
  meta?: mixed
|};
```

## 参考

* Best practice redux actions with flowtype?<br>
  https://stackoverflow.com/questions/43338248/best-practice-redux-actions-with-flowtype
* redux-actionsのcreateActionでFlux Standard Actionに則ったerror=trueなActionを作る #react<br>
  https://budougumi0617.github.io/2018/10/10/how-to-throw-error-by-create-action-of-redux-actions/
jQueryでイベントを使ってみよう

今週はjQueryについて勉強しました。
jQueryとは、JavaScriptという言語でつくられたライブラリです。
JavaScriptを使わないとできないようなこともjQueryを使えば簡単に実装することができます。
具体的には、クリックしたら文字に取り消し線が入るなど、ページを移動することなく様々な「動き」をつけることができます。

#####jQueryの読み込み方
JQueryは読み込みをしないと使えません。
今回はウェブページから読み込む方法を紹介します。

```php:index.php
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
```

このように、HTMLのbody要素の中に記述します。



#####イベント
今回はよく使うマウスイベントのクリックメソッドを例に紹介します。

```php:index.php
<script>
        $(function() {
            $('#checkbox').click(function() {
                if ($(checkbox).is(":checked")) {
                $(checkbox).closest("tr").css("text-decoration", "line-through");
                }
                else {
                $(this).closest("tr").css("text-decoration", "none");
                }
            });
        });
    </script>
```
このようなコードを書きましたので、1つずつ解説していきます。
書き出しは、$(function(){　です。
イベントを適用する要素を $('#checkbox')で選択します。
要素に対するメソッドは.click(function() {　です。
クリックしたことで実行するイベントは、if以下で条件分岐しています。
要素である $('#checkbox')にクリックすることで、.is(":checked")というイベントで要素にチェックが入ります。
その場合、HTMLの行の要素であるtrの値を取得してcssで取り消し線を追加します。
クリックしない場合は、tr要素に取り消し線は入りません。


#####まとめ
今回は、jQueryのイベントの方法を中心にアウトプットをしました。
今後も学習を続けて行きたいと思います。
Homebrew-Cask で FileZilla の更新に失敗する

`curl: (16) Error in the HTTP2 framing layer` のエラーを吐いて `brew upgrade` が中断してしまう問題への対応。

## Homebrew で FileZilla のアップデートが失敗する
```
brew upgrade --cleanup
```

```
==> Casks with `auto_updates` or `version :latest` will not be upgraded
==> Upgrading 1 outdated package:
filezilla 3.37.4 -> 3.38.1
==> Satisfying dependencies
==> Downloading https://download.filezilla-project.org/client/FileZilla_3.38.1_m
######################################################################## 100.0%
curl: (16) Error in the HTTP2 framing layer
==> Purging files for version 3.38.1 of Cask filezilla
Error: Download failed on Cask 'filezilla' with message: Download failed: https://download.filezilla-project.org/client/FileZilla_3.38.1_macosx-x86.app.tar.bz2
```
何度繰り返しても `curl: (16) Error in the HTTP2 framing layer` のエラーメッセージで中断してしまう。

## Curl のインストール

[Brew cask install filezilla fail · Issue #53634 · Homebrew/homebrew-cask](https://github.com/Homebrew/homebrew-cask/issues/53634#issuecomment-430091294)

### Curl のバージョンを確認
```bash
brew config | grep Curl
```
```
Curl: 7.54.0 => /usr/bin/curl
```

### Curl のインストール
```bash
brew install curl
export HOMEBREW_FORCE_BREWED_CURL=1
```

### Curl のバージョンを再確認
```bash
brew config | grep Curl
```
```
Curl: 7.62.0 => /usr/bin/curl
```

## 更新の再実行
```bash
brew cask upgrade --cleanup
```
```
==> Casks with `auto_updates` or `version :latest` will not be upgraded
==> Upgrading 1 outdated package:
filezilla 3.37.4 -> 3.38.1
==> Satisfying dependencies
==> Downloading https://download.filezilla-project.org/client/FileZilla_3.38.1_macosx-x86.app.tar.bz2
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'filezilla'.
==> Starting upgrade for Cask filezilla
==> Backing App 'FileZilla.app' up to '/usr/local/Caskroom/FileZilla/3.37.4/FileZilla
==> Removing App '/Applications/FileZilla.app'.
==> Moving App 'FileZilla.app' to '/Applications/FileZilla.app'.
==> Purging files for version 3.37.4 of Cask filezilla
🍺  filezilla was successfully upgraded!
```
10.1.3　クォータニオン　四次元回転の種類

前回の[クォターニオンとは？](https://qiita.com/HONONUTETE/items/8d4d456e5428a16bedae)でやったことは、クォターニオンの回転が四次元空間上の「<font color="Crimson">直行する２つの平面の回転の合成</font>」であるということだ。そして今回はそれぞれの平面での回転を実際に計算する予定だった。

しかし四次元回転は２つの平面の回転角の大きさによっていくつか種類に分類される。そこでまずは、重要だと思った4次元回転の種類を紹介する。

ここからは難解な部分もあるが、順を追って理解していけば問題なく理解できる。
[Simple Rotation](https://qiita.com/HONONUTETE/items/f8403b321a1a9130be73) → Isoclinic Rotation → (Double Rotation)の順がいい。

# 四次元回転の種類
四次元空間における回転は、二つの平面を平面A,平面Bとした場合、それぞれの平面の回転の値によって特性が変わってくる。四次元回転が２つの平面での回転での合成であるのならば、それはなんとなく予想できるだろう。実はそれぞれの平面での回転の組み合わせのパターンに応じて特性が違うことから、それらのパターンには名前がついている。重要なパターンを紹介しよう。

平面Aでの回転をα、平面Bでの回転をβとすると

### Simple Rotation
平面Aでの回転がα、平面Bでの回転が0（もしくは平面Aでの回転を0、平面Bでの回転をα）の場合の回転をSimple Rotationという。つまりどちらかの平面の回転角が０の場合だ。

![simpleRotation.png](https://qiita-image-store.s3.amazonaws.com/0/313461/15a5a7f5-a997-a8bc-2fdd-d932be7ca6de.png)

simple rotationを実際にゲームでの回転操作で使うことはないと思われる。しかし<font color="Crimson">四次元回転がどういう回転なのか一番理解しやすい</font>のはこのsimple rotationだろう。なのでまずはこのsimple Rotationを理解することが大事だ。

Simple Rotationについて詳しい説明はここで　➡　[四次元回転の種類 Simple Rotation](https://qiita.com/HONONUTETE/items/f8403b321a1a9130be73)

### Isoclinic Rotation
平面Aでの回転がα、平面Bでの回転が±αの場合の回転をIsoclinic Rotationという。つまり両方の平面で同じ大きさの回転角を持っている場合だ。（正負は逆でもいい）

![isoclinicRotation.png](https://qiita-image-store.s3.amazonaws.com/0/313461/ff62fb3f-6e19-20c3-2949-07cecd4110d6.png)

Isoclinic Rotationは、<font color="Crimson">クォータニオンによる回転の計算をする際には最も重要な回転</font>だ。実際のクォータニオンによる回転の計算を構築するにはこのIsoclinic Rotationを使って式を構築する。もちろん、ゲームで回転を扱うときもこれを使って回転を計算する。この回転をマスターすれば、とりあえずはゲームで扱うようなクォータニオンによる回転は問題なく扱えるはずだ。

Isoclinic Rotationについて詳しい説明はここで　➡　四次元回転の種類 Isoclinic Rotation

### Double Rotation
平面Aでの回転がα、平面Bでの回転がβの場合の回転をDouble Rotationという。どちらの平面でも別々の大きさの回転角を持っている場合の回転だ。

![doubleRotation.png](https://qiita-image-store.s3.amazonaws.com/0/313461/6c7d4d85-4633-a82c-fb52-33ac9f52b293.png)

Double Rotationは両方の平面が回転してしまうので3次元空間上での回転のみにおさまっていない。それゆえ3次元空間での回転を扱うゲームで実際に使うことはないかもしれないが、Simple RotationとIsoclinic Rotationが特殊な状況での回転だったのと比較して、Double Rotationは<font color="Crimson">一般化された4次元回転</font>を表している。

Double Rotationについて詳しい説明はここで　➡　四次元回転の種類 Double Rotation


# 参考
wikipedia 複素数、数平面、複素平面
https://ja.wikipedia.org/wiki/複素平面

wikipedia 四次元空間の回転
https://ja.wikipedia.org/wiki/回転_(数学)#四次元

クォータニオン考察　複素数
http://www.f-sp.com/entry/2017/06/30/221124

一般化されたクォータニオンの回転考察
https://qiita.com/HMMNRST/items/0a4ab86ed053c770ff6a

軸周りの回転、ちょっとわからなかった
https://mathtrain.jp/quaternion

GDCスライド
https://www.essentialmath.com/GDC2013/GDC13_quaternions_final.pdf
JavaScriptを理解する上で、押さえておきたいポイント(初級者 )

## はじめに
こんちわ、新米エンジニア@shh-nkmrです。


今回は、これから本格的にJavaScriptを使っていくので、今までのふあっとした理解を固める目的で勉強して
**”なるほどね、、、それ先に知りたかったです”**的な部分をまとめてみました。
JSの基礎知識を身につけることがゴールです。（個人的には公式リファレンスで情報探れるくらいになりたい。いきなり見ても???だったので）

※先にお詫びしておきます。記事の内容が厳密言うと間違ってることがあるかもしれませんが、全体をざっくり掴む方針で書かせて頂きます。よろしくお願いします。


**僕のJSに関するスペック**
・LP作成した際に、モーダル、アコーディオン実装したことある。
・ソースコードみれば、なんとなく(なんとなく！）わかる。
・自分でJSを書く時は、ググりまくって辿りついた記事のコードとコードを合体させながら、なんとか動くものにするしかできない。

## 目次
1.オブジェクトのざっくりとした概念
2.オブジェクトのプロパティとはなに？
3.関数/メソッド
4.参照渡しと値渡し

## オブジェクトのざっくりとした概念
JavaScriptの要素は、大体がオブジェクトです。
大体と書いたのは。プリミティブ（文字列、数値、真偽値)はオブジェクトではないです←ややこし
オブジェクトとは、複数の値に名前をつけてまとめた値です。
↑
よくわかりませんね...
コードをみればなんとなくイメージできると思うのでコードにします。

```
let obj = {
    "hoge": "hogehoge",
    "aaa": 123,
    "fuga":"fugafuga"
};
```
`obj`と言う値に、複数の値`(hoge,hogehoge,aaa...)`がまとまって入ってます。
これがオブジェクトです。
ここで大切なのは、先ほど述べた通りJSの要素大体がオブジェクトだと言う事で、
大体において、`複数の値（または１つ)に名前をつけてまとめた値`パターンが当てはまります。


## オブジェクトのプロパティとはなに？
こゆことです。
言葉で説明すると...オブジェクトに属しているもの
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/26ec2a0d-019a-951f-3365-aaa16a339021.png)

オブジェクトの中から値を取り出し方↓
`オブジェクト名. プロパティ名`
つまり
画像でいう`fugafuga`を取得したい場合は↓
`obj.fuga`とします。

chromeのデベロッパーツールのコンソールで確認することもできます。
`command + option + i`がショートカットコマンドです

## 関数/メソッド
関数もオブジェクトです。特別なオブジェクトです。`method();`のように`()`を使用して呼び出します。

関数の定義まとめてみた

```

// 宣言
function foo() {
　　　　　処理
}
foo();

// 式
var foo = function (){
   処理
 };
foo();

// 無名
(function(){ 関数();　})();

// アロー関数（ES6から）
let foo = () => { 
   処理 
};
foo();

```

で自分がずっともやもやしていることがあり...それが
**関数とメソッドの違いはなにか？**

↓　

メソッドは関数と同義であるが、**メソッドはオブジェクトのプロパティのうちの関数であるもの**を指す

```
let obj = {
      "hoge" : "hogehoge",
      "aaa"  : 123,
      "foo"  : function (){ 処理 },
};
```

## 参照渡しと値渡し
口で説明するより。実際にやった方が早いので
デベロッパーツールのコンソール開いて下記を試してください。

### 参照渡し
```
let hoge = { a : "なんと" };
hoge.a                            //　なんと
let fuga = hoge
fuga.a                            // なんと
fuga.a = "ななんと!"
fuga.a                            // ななんと!
hoge.a                            // ななんと！
```

最後のhogeに注目してください。値が変わってますね。`fuga.a = "ななんと！"`の部分で変わってしまっています...
それは、`let fuga = hoge`で参照渡しをしているからです....

**画像で補足します！**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/e04e858b-a9c6-72ed-8a7d-6aa3956ac3b2.png)
hogeを定義したときにメモリ上では、その変数の参照（メモリ上の番地・アドレス)を確保します。hugaを見るとここの番地を見みて、中身がわかります。
`let fuga = hoge`
この代入はfugaに参照(番地・アドレス）を渡してることになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/56562bb7-46f0-4af4-b333-76404ca4fd92.png)

２つとも同じ番地を見ているので、片方を変えると他のも変わるような挙動します。

### 値渡し
では、上記のように影響があるような挙動をしないためにはどうするかというと。
値渡しをします。別の番地を確保してそこに代入をすれば大丈夫です。

```
let hoge = { a: "なんと" };
let piyo = {};
piyo.a = hoge.a
piyo.a = "ぴよぴよ";
hoge.a                    // なんと
piyo.a　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　// ぴよぴよ
```
`let = piyo = {};`でhogeとは別の番地を確保してます。なので影響を受けることがありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/95c99f8e-cb8b-9e54-656d-67a6463569fd.png)



以上です。
JavaScriptの勉強は引き続き進めて行きたいので定期的にQiitaの記事に投稿したいと思います！
とりあえずMacにRuby on Rails環境構築

# はじめに
色々初心者
[Railsチュートリアル](https://railstutorial.jp)やる前にとりあえず動かすための記録

# 環境
macOS Mojave 10.14.1

# Homebrewインストール
[Homebrew macOS 用パッケージマネージャー](https://brew.sh/index_ja.html)

# rbenvインストール
```bash
$ brew install rbenv
$ echo 'export PATH="~/.rbenv/shims"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

# Rubyインストール
```bash
$ rbenv install 2.5.3
$ rbenv global 2.5.3
```

# Bundlerインストール
```bash
$ gem install bundler
```

# MySQLインストール&起動
```bash
$ brew install mysql
$ mysql.server start
```

# 作業ディレクトリ作成
```bash
$ mkdir ~/workspace
$ cd ~/workspace
```

# Gemfile作成
```bash
$ bundle init
```

# Gemfileのgem "rails"をアンコメント
```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"

```

# Railsインストール
```bash
$ bundle install --path=vendor/bundle
```

# Railsアプリ作成
```bash
$ bundle exec rails new hello_app
$ cd hello_app
```

# Railsアプリ起動
```bash
$ bundle exec rails s
```

http://localhost:3000/ にアクセスして確認

~~ここまで４時間くらいかかった（bash_profileで何かミスってPATHが消えた）~~

# その他

## bundle exec省略
やっておくと楽？

~~~bash
$ echo 'export RUBYGEMS_GEMDEPS=-' >> ~/.bash_profile
$ source ~/.bash_profile
~~~




# 参考
[最速！MacでRuby on Rails環境構築](https://qiita.com/narikei/items/cd029911597cdc71c516)
[Ruby初学者のRuby On Rails 環境構築【Mac】](https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07)
[いちいちbundle execしたくない 決定版](https://qiita.com/ymmtmdk/items/374d5319e8d5c9ab2ff4)
GIt


# サーバ側での作業
## リモートリポジトリの作成
Git Bashを使って、bareリポジトリを作成する。

```bat
mkdir /c/git
mkidir /c/git/GitTest.git
cd /c/git/GitTest.git
git init --bare --shared
```
## sshサーバの立ち上げ
* C:\Bitnami\redmine\git\usr\bin\sshd.exeをクリックする。
　→タスクマネージャーにsshd.exeが出現する。
 
# クライアント側の作業
# Gitリポジトリの作成
* Visual StudioでGitTestソリューションを作成する。
* SourcetreeでGitリポジトリを作成する。
　※「次のアカウントでリポジトリを作成」はチェック不要
* Sourcetreeでコミットする。
* Sourcetreeでリモートリポジトリを指定する。
　ssh://{windows user}@192.168.11.9:22/c/git/GitTest.git

## コマンド
 [プッシュ]
 1. 初期設定
 　git config --global user.name "${name}"
 　git config --global user.email ${email} 
　 git config -l
 2. リポジトリ作成
 　git init
 3. ステージング
　 git add test.txt
　 git status
 4. コミット
 　git commit -m "test"
 　git log
 5. プッシュ
 　git remote add origin ${url}　// リモートリポジトリの登録
　 git remote -v
 　git push -u origin master
  
   ※origin: リモートリポジトリ
   ※master: ブランチ
  
  [クローン]
  git clone [url]

  [プル]
  git pull // リモートリポジトリの登録が事前に必要

# 参考
* Windows PCをGitのリモートリポジトリとして使用する方法
　http://d.hatena.ne.jp/MoonMtLab/20140314/1394807213
* Windows10パソコン上にGitサーバを立ててみた - LinuxサーバがないけどGitサーバを運用したい場合の対処法
　http://imamachi-n.hatenablog.com/entry/2018/06/09/170331
 
# リモートリポジトリの作成からクローンまで
## サーバ側
 * gitインストール
 * gitのuser設定
 * ベアリポジトリ作成
 * sshキー作成
 * sshd起動　※PC再起動のたびに必要

```bat: Git Bashで実行（コマンドプロンプトからではダメ）
/usr/bin/sshd.exe
```

## クライアント側
* クローン
　git clone ssh://user@ip/remote-path
 
# sshで通信する
## サーバ側
 * sshd起動

## クライアント側
 * ssh接続
 　ssh user@IPアドレス(例: 192.168.214.60)
* ファイル転送
　scp -r test user@IPアドレス:/c/test
RailsのLINEbotでdeviseを使ったら突然「Processing by UsersController#callback as */*」っていわれた話

#環境
```
ruby '2.5.0'
gem 'rails', '~> 5.2.1'
```

#詰まったこと
deviseでLINE連携させてLINEbotをでとったデータを使っていろいろとやろうとしたときに突然LINEbotが動かなくなりターミナルを見ると

```
Processing by UsersController#callback as */*
```

という１文が、、、
ググってもなんにも出てこないので仕方なく
gitでcommit logをさかのぼりながら細かく確認して見ていると、、、
#原因
```ruby
 class ApplicationController < ActionController::Base　　
   protect_from_forgery with: :exception 
   before_action :configure_permitted_parameters, if: :devise_controller? 
   before_action :authenticate_user!　#←これのせい
```

ApplicationControlleの中の「**:authenticate_user!**」が原因でした。
おそらくLINEボットからcallbackされるときはログイン状態では無いからauthenticate_user!が動いてしまって「new_user_session_path」に飛ばされてしまったからうまく動かなかったのかな〜って思います。

#まとめ
当たり前ですけどgitで細かくcommitしてcommitメッセージも自分で何したかわかるくらいは書いておくとこういうググっても出てこない系に対処できていいですね笑
これをきにちゃんと細かくcommitして行こうと心に誓いました笑
PHPで、無名関数を変数代入せずにカッコの後ろにカッコを付けて呼び出しするやつ

**IIFE(Immediately Invoked Function Expression; 即時実行関数式)**と呼ぶそうです。

## 概要
こういう事がしたい

```php:index.php
<?php
function getSum($first) {
  return function ($second) use ($first) {
    return $first + $second;
  };
}

// こうじゃなくて
$func = getSum(1);
echo $func(2); //-> 3

// こうしたい
echo getSum(1)(2); //-> 3
```


## 環境
- Windows 10 Pro 1803 Windows Subsystem for Linux / Ubuntu 16.04.4 LTS
- Docker version 17.12.0-ce, build c97c6d6

## 確認
下記コードで、各バージョンのPHPで確認

```bash
$ docker run -it --rm --name my-php-test-53 -v `wslpath -w $PWD`:/usr/src/myapp -w /usr/src/myapp php:5.3-cli php index.php
$ docker run -it --rm --name my-php-test-56 -v `wslpath -w $PWD`:/usr/src/myapp -w /usr/src/myapp php:5.6-cli php index.php
$ docker run -it --rm --name my-php-test-70 -v `wslpath -w $PWD`:/usr/src/myapp -w /usr/src/myapp php:7.0-cli php index.php
$ docker run -it --rm --name my-php-test-72 -v `wslpath -w $PWD`:/usr/src/myapp -w /usr/src/myapp php:7.2-cli php index.php
```

### 結果

PHP|結果
:--|:--
5.3|Parse error: syntax error, unexpected '(', expecting ',' or ';'
5.6|Parse error: syntax error, unexpected '(', expecting ',' or ';'
7.0|成功
7.2|成功

どうやらPHP7.0+でできるようになったそうです。

[PHP 7\.0\.x へのマイグレーションガイド](http://php.net/manual/ja/migration70.php)には明記されていないようなのですが、できるようです。

## 参考
- [PHP: 無名関数 \- Manual](http://php.net/manual/ja/functions.anonymous.php#122182)
- [IIFE \- MDN 用語集: ウェブ関連の用語の定義 \| MDN](https://developer.mozilla.org/ja/docs/Glossary/IIFE)
php-master-changes 2018-11-21

今日は 7.2 系の開発バージョン引き上げ、Mac でのテストの修正、ビルドエラーの修正、不要コードの削除、embed SAPI を共有ライブラリで使えない問題の修正、Password Hashing Registry の実装マージ、ext/soap のコードの proto とパラメータバリデーション修正、テストの不要な SKIPIF セクション削減の修正があった！

# 2018-11-21
## sgolemon: Bump for 7.2.14
- https://github.com/php/php-src/commit/9fc52c16b50becd3211b8a43a1f509f14ae7e6ac
- [7.2~]
- 7.2 系の開発バージョンを 7.2.14 へ引き上げ
- 7.2.13 が 12/6 に出るみたくなってるけど、もう少し早くなくていいのかな

## mizunashi-mana: Fix opcache blacklist test on macOS
- https://github.com/php/php-src/commit/10ae8b685fba8411a5178cc2c0b60c98c72479b4
- ext/opcache のテストで、Mac では /tmp が /private/tmp のエイリアスであることによりテストのこけていた箇所があったのを修正

## mizunashi-mana: Define __APPLE_USE_RFC_3542 for new ipv6 constants
- https://github.com/php/php-src/commit/e672cd4385d5a72ca8a81677b8c894fdaacfce03
- [7.2~]
- ext/sockets の Mac でのビルドで起きる問題の修正
- Mac では __APPLE_USE_RFC_3542 が define されている時のみ IPV6_RECVPKTINFO が使える
- [#77136](https://bugs.php.net/bug.php?id=77136) への対応

## teresy: Remove redundant continue in for loops
- https://github.com/php/php-src/commit/8881c3c82f75bd67578a774c40888b257a30a18f
- コード内の不要な continue を削除

## VBart: Fix bug [#71041](https://bugs.php.net/bug.php?id=71041) dynamic embed SAPI load error
- https://github.com/php/php-src/commit/11ddf7669a58969ad9101032ce891b951819b3e1
- [7.1~]
- sapi/embed で PHP をライブラリとして組み込む際、zend_signal_startup() がエクスポートされていないことで、共有ライブラリとしてロードできなかった問題の修正

## sgolemon: Implement password mechanism registry
- https://github.com/php/php-src/commit/534df87c9e3c28001986e70844e0ad04e5708d3d
- 7.4 向けで受理された RFC、[Password Hashing Registry](https://wiki.php.net/rfc/password_registry) の実装のマージ

## laruence: Fixed proto & folder mark
- https://github.com/php/php-src/commit/efeb810a3dd409dfb611ca8e6e1e1dd51ae90c92
- [7.3~]
- ext/soap のコードで、proto の修正と vim 用の folder marker の追加

## laruence: Fixed bug [#77088](https://bugs.php.net/bug.php?id=77088) (Segfault when using SoapClient with null options)
- https://github.com/php/php-src/commit/aaafd793e6f74aa6afc233d9594d176266ba0684
- [7.3~]
- ext/soap で、SoapClient のオプションに null を使うとセグフォる問題の修正
- パラメーターのバリデーションを単に足した形かな

## carusogabriel: Remove unecessaries SKIPIF sections for necessary extensions
- https://github.com/php/php-src/commit/35be0590edfbd996c24ec3cdbad400d3bb91a72c
- テスト内の不要な SKIPIF を削除
TL/1 の予約語


# 言語処理系の構成

プログラムを解釈するにあたって言語処理系が<ruby><rb>行</rb><rp>(</rp><rt>おこな</rt><rp>)</rp></ruby>う典型的な処理の流れをおおざっぱに切り分けると

- 字句解析 (トークンの分割)
- 構文解析
- 意味解析
- 最適化
- コード生成

という手順を取るわけだが、言語によってはこれらの段階を上手く分割できないようなものもあるし、性能などの理由で意図的に段階分けをしないだとか、あるいはより細かい段階に分けるといったこともあるだろう。

# 予約語

予約語が予約語であると確定するのは上記の手順の内のどの段階だろうかと考えると、一般的には字句解析の時点で字面から確定するのが普通だろう。 文字列や数値なども、文脈によって解釈が変わるといったことはあまりなさそうだ。 (一部の型がゆるい言語では数値を文字列で保持するといったようなものもあるようだが。)

さて、先日はプログラミング言語 Scheme に予約語はないこと、またそれによる利点のことを書いた。

》[予約語が無いということ](https://qiita.com/SaitoAtsushi/items/51a3d5108fe27adb77d4)

Scheme (などの LISP 系言語) ほどではなくても、どうにかして予約語が (ユーザー定義の) 識別子と衝突しないようにと工夫している言語もある。 たとえば C++ の文脈依存キーワードだ。 C++ の `final` や `override` といったキーワードは特定の場所に現れたとき以外は特別な意味を持たず、ユーザがその名前のものを定義してもかまわない。

```cpp
       /* ↓型名 */
struct override  {
          /* ↓型名 */
  virtual override* a(void) = 0;
};

                    /* ↓型名 */
struct bar: private override {
  /* ↓型名 */      /* ↓予約語 */
  override* a(void) override { return this; }
};
```

# TL/1 の予約語

さて、予約語の扱いについて特徴的な言語として TL/1 がある。 1980 年頃に雑誌「月刊 ASCII」で掲載されたマイコン向けのプログラミング言語であり、外観は PASCAL を踏襲しているように見える。

TL/1 では予約語と同じ名前を関数や変数として宣言可能であり、宣言が有効な範囲内では予約語よりも宣言内容を優先して解釈するという珍しい仕様を持っている。

たとえば `IF` は C などの `if` と同じような分岐のための構文を構成する予約語だが、変数として宣言するとスコープの終了までは変数である。

```
VAR IF
BEGIN
  IF := 123
END
```

# まとめ

TL/1 における予約語の扱いは、はっきりいってあまり有用性がない。 予約語と同じ名前の変数を作ってしまうと、その変数のスコープの範囲内では予約語として使えなくなってしまうだけだ。 TL/1 では予約語をシャドウは出来るが (Scheme が構文に別名を付けられるのと違って) 予約語に別名を付けられるわけではないので無意味に制約が付いてしまう。

言語ユーザにとって便利かどうかは別として、予約語という名前で呼んではいても言語によってその扱いは一様ではないし、なんだか変な仕様の言語もあるのだなという一例として TL/1 を紹介した次第である。
インストーラーを使わず、環境変数を変更せずにgoをvscodeでデバッグしてみたかった

# はじめに
職場で暇なときにGoでもやってみようかって思いたったんだけど、GoもGitもインストーラだったり環境変数の変更が必要だったりとチェックに引っ掛かりそうなのが嫌なので環境設定やインストール情報に余計な情報を足さずにgoをvscodeでデバッグできるようにしたくなったのでチャレンジしてみました。
**はじめてのgo**でもあったりします！

# 必要なファイルを入手
1. vscodeをダウンロード
[https://code.visualstudio.com/download](https://code.visualstudio.com/download)
VSCode-win32-x64-1.29.1.zipをダウンロードしました。

2. Goをダウンロード
[https://golang.org/dl/](https://golang.org/dl/)
go1.11.2.windows-amd64.zipをダウンロードしました。

3. delveをダウンロード
[https://github.com/derekparker/delve](https://github.com/derekparker/delve)
delve-master.zipをダウンロードしました。

# 下準備
- 作業フォルダを以下のように作成しました。

```
D:\work
	+ vscode
	+ go
	+ gopath
```

- VSCode-win32-x64-1.29.1.zipの中をD:\work\vscodeに解凍しました。
- go1.11.2.windows-amd64.zipの中のgoフォルダの中をD:\work\goに解凍しました。
- delveを使えるようにするためにD:\work\gopathに以下のフォルダを作成します。

```
D:\work\gopath
	+ bin
	+ src\github.com\derekparker\delve
```

- delve-master.zipの中のdelve-masterの中のファイル、および、フォルダをD:\work\gopath\src\github.com\derekparker\delveに解凍しました。

- コマンドプロンプトを起動して以下のように実行しちゃいます。

```
> D:
> CD D:\work\go\bin
> SET GOROOT=D:\work\go
> SET GOPATH=D:\work\gopath
> go install github.com/derekparker/delve/cmd/dlv
```

# vscodeの設定
適当にワークスペースを作成してmain.goなどのファイルを作成してGoを使えるようにしてとvscodeに怒られるので適当にインストールしました。

# launch.json
GOROOTやGOPATHを環境変数に追加しないから、そのままでは実行できないのでlaunch.josnに環境変数を追加するようにします。

```
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Goを起動するよ！",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/main.go",
            "env": {
                "GOROOT": "D:\\work\\go",
                "GOPATH": "D:\\work\\gopath",
            },
            "args": []
        }
    ]
}
```

# 最後に
毎回Gitから手動でダウンロードして解凍して使うのはめんどくさい！
でもこれで簡単なことはできるようになりました！
letsencryptで作成したワイルドカード証明書の更新手順【個人的備忘録】

# 概要

Let's encryptで作成したワイルドカード証明証の更新の備忘録

# 環境

* DNS
    * AWS route53
* 証明書発行環境
    * Ubuntu16.04

# 証明書の更新について

ワイルドカード証明書のため、 `certbot renew` では更新ができない。
__※注意※__
完全にできないわけではなく、証明書作成時に発行される文字列をDNSの_acme-challengeのAliasのValueに値を設定しなければならないため、その文字列を変更するスクリプトを作成しておけば自動更新できるようになる。

# 更新作業

## 証明書の作成

前回の備忘録をもとに作成。（前提条件としてcertbotが入っていること）

作成される証明書は`/etc/letsencrypt/live/`の下に作成される。

```bash
// 前回のものと同じ
$ sudo certbot certonly --manual -d '*.example.com' -m 'example@example.co.jp' --agree-tos --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
```

実行すると下記のように聞かれる

```bash
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Cert is due for renewal, auto-renewing...
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for example.com

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y
```

yと返答すると

```bash

-------------------------------------------------------------------------------
(Y)es/(N)o: y

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
```

となるので、XXXのところの文字をDNSに設定する。
DNSが浸透するまで１分ほど待ち、Enterを押すと下記のようになり、発行完了。

```bash

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
Waiting for verification...
Resetting dropped connection: acme-v02.api.letsencrypt.org
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-12-25. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

```

## DNSの設定

Route53 -> Hosted zones -> _acme-challenge

そのValueを変更して、「Save Record Set」を押下。

## 証明書のアップロード

EC2 -> ロードバランサー -> WebLoadBalancer -> リスナー

その443のSSL証明書の変更を押下し、設定する。（詳細は前回の備忘録を参考）

※注意※
やはり前回同様アップロードはできているが、設定はできなかった模様。（エラーになった）そのため、アップロード後にIAMを選ぶで設定しなおすことで更新ができた。
Vuetify.jsのthemeに、名前にハイフンのつく色を指定する際に地味にハマった (light-blue、light-green、deep-purple、deep-orange、blue-grey)

**ドキュメント『こんな風にjsからthemeの色指定できるで！☺️』**

https://vuetifyjs.com/en/style/colors
https://vuetifyjs.com/en/style/theme

<img width="396" alt="スクリーンショット 2018-11-22 0.37.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/29faab4e-6cc5-2979-1c87-fa68eec7b4c4.png">

<img width="1181" alt="スクリーンショット 2018-11-22 0.37.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/807de698-321b-22b2-a7f3-cb364b4b9594.png">


😳(なるほど……)
<img width="398" alt="スクリーンショット 2018-11-22 0.46.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/5e6a8d5e-bf58-5f34-27b2-d4641be0cf51.png">

😳(light-blueに指定したいな……)

<img width="456" alt="スクリーンショット 2018-11-22 0.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/5690d685-788f-31b8-3c5c-073f661ea022.png">

<img width="456" alt="スクリーンショット 2018-11-22 0.48.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/33a3bcfa-e787-5a97-0c9f-000a7d4baad7.png">

→ 動かない


特段ドキュメントに何も書いてなかったので、GitHubのソース見たら
https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/util/colors.ts

<img width="287" alt="スクリーンショット 2018-11-22 1.00.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/65ad4f0b-f9d6-0297-5b02-c38fbc5894e2.png">

- light-blue
- light-green
- deep-purple
- deep-orange
- blue-grey

などのハイフンがつく色はそれぞれ、

- lightBlue
- lightGreen
- deepPurple
- deepOrange
- blueGrey

みたいにキャメルケースで定義されていた。

<img width="429" alt="スクリーンショット 2018-11-22 1.02.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/148619/3b3f64d8-0f80-810d-954d-9455f3bed6ab.png">

→ 動いた😀
Androidアプリ終了イベント（処理）はどこに書く？

## 背景

Androidと外部デバイスをアプリケーション起動中はずっとコネクションしておいて、
アプリを終了したときに切断するということをしたかったので、アプリ終了イベントをバインドしたい。という背景。

Activityの生成や破棄の際には、適切なライフサイクル（onCreateやonPause）上で処理を書けばいいですが、
アプリ自体の初期化処理とか終了処理はどこに書けばいいのでしょうか。

色々調べたけどこれという情報には行きつかなくて、ここなのでは？という結論に達したのでまとめます。

## Applicationクラスを継承する
1つめのやり方にApplicationクラスを使うやり方があります。
アプリケーションが起動する際に生成され、ライフサイクルを持つクラスです。

```kotlin
package tokyo.ysbrothersk.appcloseevent

import android.app.Application

class ApplicationManager : Application() {

    override fun onCreate() {
        super.onCreate()

        // TODO: アプリ生成時処理
    }

    override fun onTerminate() {
        super.onTerminate()

        // TODO: アプリ終了時処理
    }
}
```

OverrideしたonCreateに処理を書けばアプリ生成時に実行されます。
では、アプリ終了時の処理をonTerminateに書けばいいかというと、実はそうはいきません。

[ここ](https://developer.android.com/reference/android/app/Application)を見ればわかるのですが、
実はこのonTerminateはエミュレーターのときのみイベントが発火して、実機の時には呼び出されません。
つまり、実際のAndroid上でアプリが動いている場合は、このonTerminateは呼び出されずにアプリケーションが破棄されます。なんてこったい。

ではどうするかというと、ルートActivity上で管理することにしてみました。

## ルートActivityで管理する
ルートActivityは、スタックの一番最下層にあるActivityのことで、つまり戻るキーを押したときに一番最後になるActivityです（一番最初に起動されるActivity）。
A → B → C の順にActivityを起動した場合、CとBでBackキーを押すとスタックからActivityが取り出されて行きますが、ルートActivityであるAでBackキーを押下するとアプリケーションが終了します。

このルートActivityが終了するときというのは、アプリケーションが終了するときなので、今回目的のアプリケーションの生存を持っているといえますね！

なので、このルートとなるActivityのライフサイクル上で色々処理を持たせておいてあげれば良さそうです。

```kotlin

package tokyo.ysbrothersk.appcloseevent

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import tokyo.ysbrothersk.appcloseevent.ui.main.MainFragment

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, MainFragment.newInstance())
                .commitNow()
        }

        // TODO: アプリ開始処理

        // TODO: Activity開始処理
    }

    override fun onStop() {
        super.onStop()

        // TODO: ユーザーデータなど消えては困るものはonPauseで処理を行う
    }

    override fun onDestroy() {
        super.onDestroy()

        // TODO: アプリ終了処理
    }
}
```

デフォルトのまま、MainActivityという名前のルートActivityにonDestroyをオーバーライドしてあげて処理を書けば良さそうです。
単純に、このActivityが表示されているときに、BackキーとかタスクキルしてもonDestroyは呼ばれますし、
別のActivityが起動しているときに、Androidのタスクボタンからアプリを終了してもしっかり呼ばれます。素敵！

ただし、onDestroyを使う際は注意が必要です。
[こちら](https://developer.android.com/training/basics/activity-lifecycle/stopping?hl=ja)に記載があるのですが、何かしらの原因でインスタンスメモリが改修された場合にこのonDestroyが呼ばれずにアプリが終了することもあるようです。
きちんと処理をしないとメモリリークを引き起こすようなものの処理は、onStop()で対処することがいいとあります。

また、コメントにもいただきましたが、
ユーザー情報など、保存しなくてはならないようなデータの場合はonStop()やonDestroy()ではなくデータが確定した段階で保存してあげるようなUX設計をする必要があります。

## まとめ
今回は「アプリ終了時にデバイスのclose()処理を呼ぶ」という要件だったので、ルートActivityのonDestroy上で、openされていたらcloseするという実装にしました。
onDestroyが呼ばれずに終了した場合はcloseされないので良くはないのですが、とはいえonStop()で書くと画面遷移などでも呼ばれてしまうのでそういうわけにもいかず。。みたいな。
まあここらへんを想定するのはAndroidに限らず難しい話なような気がしますね。