OmniAICreator/Qiita-1.07M huggingface dataset:
【cygwin】svn環境を作る

# 1. 背景

CVSについては必要最低限のことを確認したので、今度はSubversionに移行。簡単にメモを残す。
ディレクトリ構成は「1リポジトリ1プロジェクト」を前提としたもの。

# 2. Svn環境の作成と登録

コマンド中の ```$REPOSITORY_PATH_TO``` は 次の通りとする：

```
file:///cygdrive/c/Users/$USER/MEGA/$HOSTNAME/svn_repository
```

## 2.1. Svn環境の作成

```bash
$ cd /cygdrive/c/Users/$USER/MEGA/$HOSTNAME
$ mkdir svn_repository
$ svnadmin repository
```

## 2.2. 初期ディレクトリの作成

```bash
$ cd /tmp
$ svn checkout $REPOSITORY_PATH_TO cygwin
$ cd cygwin
$ svn mkdir trunk
$ svn mkdir branches
$ svn mkdir tags
$ svn commit -m "initial directories" trunk branches tags
```

- ```cygwin``` は登録されないので何でもいい。

## 2.3. IMPORT

```svn import``` から除外するディレクトリ,ファイルを登録する

```bash
$ vi .subversion/config
$ egrep ^global-ignores .subversion/config
global-ignores = CVS .cvsignore .data .temp 
```

```tools``` をIMPORTする。

```
$ svn import tools $REPOSITORY_PATH_TO/trunk
```

- ```tools``` が登録対象のファイルがあるディレクトリ
- ```trunk``` の下に ```tools``` が作成される

## 2.4. CHECKOUT
次のように被せるようにcheckoutすると、```tools/.svn``` が出来る

```
$ svn checkout $REPOSITORY_PATH_TO/trunk/tools tools
```

何故か全て ```D``` マークが付くので、```svn revert``` で対処する

```bash
svn status | cut -c9- | xargs svn revert
``` 

# 3. コマンド

## 3.1. たまに使う

- ```svn ls $REPOSITORY_PATH_TO```
- ```svn add --depth empty dir``` dirのみ登録
- ```svn add --depth files dir``` dirと配下のファイルを登録
- ```svn add dir``` dir以下全ての登録。恐らく ```--depth infinity``` と同じ
- ```svn propedit svn:ignore dir```

## 3.2. 普段使う

- ```svn status```
- ```svn update```
- ```svn commit```

# 3. 課題

- 被せるようにcheckoutすると```D```が付く理由の調査

# 4. CVS環境からの移行について

- 方針
    - これまでの履歴はCVSで保存しておいて、これからの変更をSubversionで管理する
- やること
    - CVSや.cvsignoreなど、作業環境にあるCVS固有のディレクトリやファイルを無視する設定をする
    - subversion環境の適切なパスへIMPORTする。
    - チェックアウトして出来る「.svn」を無視する設定。
    - CVS, Subversion双方でのリリースタグやブランチの設定。

# 以上
Flutterの導入手順と初回セットアップ時の解決Tips集

# 概要
MacでFlutter環境を構築するための手順を記載します。
Flutter doctorの解決が最初の難関ですね！

#1,インストール
何はともあれインストールします
https://flutter.dev/docs/get-started/install/macos

#2,PATHを通す
Downloadディレクトリにインストールした場合、

```
export PATH=~/Downloads/flutter/bin:$PATH
```

#3,初回セットアップ
flutterでは

```
flutter doctor
```
というコマンドでセットアップ状態を診断し、エラーを全て消すと初回セットアップが完了します。
TDD的な感じでオールグリーンにします。

#Flutter Doctorのエラー解消

１、見つからない

```sh
Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, set A
```
こんな感じのエラーが出た時はAndroidStudioをインストールして、
AVDの設定まで完了させましょう。

２、プラグインがない場合の解決方法
flutterのプラグインを入れる
(1)Android Studioを開く
(2)ヘッダー部分の『Android Studio』をクリック
(3)preferenceをクリック
(4)Pluginsをクリック
(5)検索画面でflutterを検索、ダウンロード

プラグインをいれたのにダメな時

```
$ flutter config --android-studio-dir=""
Removing "android-studio-dir" value.

$ flutter config --android-sdk=""
Removing "android-sdk" value.
```

３、Unable to find any JVMs matching version
または、こんな感じのエラーの時、

```
Exception in thread "main" java.lang.NoClassDefFoundError:javax/xml/bind/annotation/XmlSchema

```

解決策
JAVA1.8にする。

```
java -version
which java
```
2,Javaのアップデートはjavaのインストールと同じです。
ダウンロードはoracleの公式サイトから行います。

今回はJava8をインストールしてホームにパスを追加
https://java.com/ja/download/mac_download.jsp

４、パスが間違っていた系のエラーの時
下記コマンドを実行してください。

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

５、Android license status unknown
下記コマンドを実行してください。

```
flutter doctor --android-licenses
```

答えは全部y

6,CocoaPods not installed.

```
brew install cocoapods    //PATHを通してなかったらついでに通しておく
pod setup
```

参考になりましたら幸いです。mm
dockerを動かすときにはまる所の解決Tips

# Dockerのエラーを解決しましょう！
Dockerではまったところのメモを残しておきます。
参考になれば幸いです。

##Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?


## sudo: docker-compose: コマンドが見つかりません
上記でsudoした結果。
原因:)
visudo で編集できる secure_path に/usr/local/bin が含まれていない。
docker-composeは /usr/local/bin 配下にインストールされる。

解決:)

```
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/local/bin:/usr/bin
```


##ENOSPC no space left on device
ホストの容量が不足している時にでてきます。
対処法はいくつかあって、
１、dfやduで不要なボリュームをつき止めて削除する
２、dockerを入れ直す
３、docker system pruneなどで綺麗にしてもう一度試す。
あたりがメジャーです。

ここでは<font color="DeepPink">docker-clean</font>をご紹介します。
自分はこれで直ったことが多いです。

以下のコマンドで導入可能です。

```sh
//brew
brew install docker-clean

or
// brew以外
curl -s https://raw.githubusercontent.com/ZZROTDesign/docker-clean/v2.0.4/docker-clean |
sudo tee /usr/local/bin/docker-clean > /dev/null && \
sudo chmod +x /usr/local/bin/docker-clean
```

導入したらコマンドは

```
docker-clean all
```
これで不要なものが削除されます。

詳細はこちら↓
https://github.com/ZZROTDesign/docker-clean
Pythonのtimedeltaで「xx時間」を一発で計算する方法

# はじめに

ほぼフルリモートでの仕事をするようになり、通勤に時間を費やす必要がなくなりました。その時間を他に使えるのでとても良いのですが、体を動かす機会が減るのと、ポッドキャストを聞く時間が確保できないのが悩みポイントでした。その両方を解決するために毎朝少し離れたスーパー(朝8時開店！)まで歩くのを日課にし始めたのですが、今日聞いていた [PythonBytes](https://pythonbytes.fm/)というポッドキャストで目からウロコなtipsを話していたのでご紹介します。

ポッドキャストで話をしている人たちも「え、そんなことできるの？」「知らなかった」って言ってましたが、 私も聞いていて驚きました。直接聞いてみたい方は[Episode #190](https://pythonbytes.fm/episodes/show/190/you-will-now-be-notified-if-the-python-zipper-is-broken)の27分ころです。

# timedeltaとは

`timedelta`はpythonの標準ライブラリに含まれる機能で `datetime`モジュールに含まれています。`datetime`同士を引き算した時に `timedelta`型のデータが返ってきます。

現在時刻を取ってくる`datetime.now()` を二回呼んで、その差をとってみます。

```python
>>> from datetime import datetime, timedelta
>>> d0 = datetime.now()
>>> d1 = datetime.now()
>>> td = d1 - d0
>>> td
datetime.timedelta(seconds=1, microseconds=508102)
```

差の結果は`timedelta`型のデータで、この場合2つの時刻の差分は 1秒 + 508102マイクロ秒 = 1.508102秒 ということになります。それぞれの値は属性値として取得できます。

```python
>>> td.days
0
>>> td.seconds
1
>>> td.microseconds
508102
```

ここで、もう少し大きな差分を考えてみましょう。

```python
>>> d0 = datetime(2020,7,31,22,5,0, 113459)
>>> d1 = datetime(2020,8,3,5,55,26, 93450)
>>> d1 - d0
datetime.timedelta(days=2, seconds=28225, microseconds=979991)
```

7月31日の22時5分0.113459秒から8月3日の5時55分26.093450秒まで。2つのdatetimeを引くだけでその差は2日と28225.979991秒ということがわかります。この例では月をまたいだ日付の差分をとっていて、手でやると面倒で間違いやすそうな計算ですが、datetimeがよろしくやってくれてるのはとても助かります。


# timedeltaを時間換算する

このように簡単に計算できるものの、「2日と28225.979991秒」って微妙にわかりにくいですよね。これって何時間なのかな？と思った時にとたんにハードルが上がります。パッと思いつくのは属性値を取り出して計算してみること。

```python
>>> td.days * 24 + (td.seconds + td.microseconds / 1000000 ) / 60 / 60
55.8405499975
```

あるいは `total_seconds()`メソッドを使えばもう少し簡単になります。

```python
>>> td.total_seconds() / 60 / 60
55.840549997500005
```

こちらは少し誤差がでますね。

いずれにしても、それほど難しい計算ではないけど、せっかく timedeltaという専用の型があるのにそれを使ってできないというのが悔しい。

でも実はできるんです。それが今日の本題ですが、解はとても単純で「**計算したい単位のtimedeltaで割り算する**」です。

例えば上の場合だと

```python
>>> td / timedelta (hours=1)
55.8405499975
```

おおー、凄くないですか？なぜこうなるのかを少しだけ書いておきます。

timedeltaは属性値としては days, seconds, microseconds の3つですが、コンストラクターはそれ以外の時間単位もキーワード引数でサポートしています。

```python
>>> timedelta(minutes=1)
datetime.timedelta(seconds=60)
>>> timedelta(hours=1)
datetime.timedelta(seconds=3600)
>>> timedelta(weeks=1)
datetime.timedelta(days=7)
```

見ておわかりのように、別の単位で指定された場合は days, seconds, microsecondsに正規化されてtimedeltaの属性として保存されます。

そして、timedelta同士の割り算は2つの時間間隔の比を計算することになり、結果はfloat (浮動小数点型)になります。したがって、「時間」単位であれば `timedelta(hours=1)`で割ることで目的の値を得られます。

これの応用で、例えば、「5/6から8/19は何週間かな？」と思った時には

```python
>>> (datetime (2020, 8,19) - datetime (2020, 5, 6)) / timedelta(weeks=1)
15.0
```

と一発で計算できます。

# まとめ

datetimeがPythonに導入されてからだいぶ経ちますが、今までこういうtimedeltaの使い方をしたことがありませんでした。Podcastによると、これは別に裏ワザということでもなくtimedeltaの作者自身が意図した使い方らしいのですが、それなのであればドキュメントに例示しておくとかもう少し広める努力をして欲しかったなと思います（笑）
Codeigniter 4 でビューを変数に代入するときにデバッグコードが出ないようにする

`CI_ENVIRONMENT != development` の際、ビューを呼び出すと

```php
<!-- DEBUG-VIEW START 1 APPPATH/Config/Paths/hoge/fuga.php -->

ビューの内容

<!-- DEBUG-VIEW ENDED 1 APPPATH/Config/Paths/hoge/fuga.php -->
```

と、コメントタグにデバッグ情報が付与される。

これはデバッグツールバーで利用しているもので、通常のレスポンスとしてHTMLにレンダリングする場合は全く問題ないし、何のビューを呼んでいるのかがすぐわかるので助かるが、APIのレスポンスや変数に代入してメール文言にするといった場合にこの情報が含まれるのは望ましくない場合がある。

```php
// メールのbodyとして設定する場合
// <!-- DEBUG-VIEW ～が含まれてしまう
$mailbody = view('hoge/fuga', $data); 
// 以降、メール送信プログラム
```

これはマニュアルには記載がないが、**debugオプションを設定**すれば回避可能。

```php
// メールのbodyとして設定する場合
// <!-- DEBUG-VIEW ～が含まれない
$mailbody = view('hoge/fuga', $data, ['debug' => false]); 
// 以降、メール送信プログラム
```

詳しくは `/system/View/View.php` を参照。
ここに宣言されているオプションは上記のように都度設定の変更が可能であるようだ。
OpenCVのimshow画面でバツを押すとプロセスだけが残る問題の解決方法

#環境

　Python 3.7.8
　OpenCV 3.4.2

#問題
　例えばこのレナさんの画像。
![lena.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/deb2896e-7a0f-ec5a-5bf4-923c32d2fe3f.jpeg)

　通常であれば以下のコードで画像を表示し、適当なキーを押すとウィンドウが閉じます。しかし、閉じるボタン押した場合、ウィンドウは閉じるのですがpythonのプロセスは実行されたままになります。

```python:open.py
import cv2 

img = cv2.imread("lena.jpg")

#画像を表示
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```



#解決方法
　[他の方の手法](https://github.com/opencv/opencv/issues/6452#issuecomment-488618141)と基本的には同じなのですが、コードを少しだけ短くしたのと、従来通りすべてのキー入力にも対応させたのがオリジナリティです。

```python:
import cv2

img = cv2.imread("lena.jpg")

while(1):
    cv2.imshow('img', img)
    key = cv2.waitKey(100) & 0xff
    if key != 255 or cv2.getWindowProperty('img', cv2.WND_PROP_AUTOSIZE) == -1:
        cv2.destroyAllWindows()
        exit()
```

　同じことで困っている方の助けになればと思います。
【GAS初心者】親ファイルに対して子ファイルを生成する(GAS)


結論
----------

```javascript:結論
var parentFolderId = "親フォルダID"   
var parentFolder = DriveApp.getFolderById(parentFolderId);
var newFolderName = "子ファイルName";
var newFolder =  parentFolder.createFolder(newFolderName);  
```
DeepRunning　～Level4.6～

#Level４．機械学習講座（理論と実践）
##4-6.k平均法（k-means）
###4-6-1.k-平均法（k-means）とは
　　●教師なし学習
　　●クラスタリング手法である。
　　●与えられたデータを$k$個のクラスタに分類する。

　　【クラスタリング】
　　　　特徴の似ているもの同士をグループ化すること。

###4-6-2.k平均法（k-means）のアルゴリズム
　　①各クラスタ中心の初期値を設定する。
　　　⇒$k$は事前に決めておく必要がある。
　　　　クラスタの中心はランダムに選択する。

　　②各データ点に対して、各クラスタ中心との距離を計算し、
　　　最も距離が近いクラスタを割り当てる。
　　　⇒中心から最も距離の近いクラスタを割り当てる。
　　　　そして、全てのデータ計算して、徐々に切り離されていく。

　　③各クラスタの平均ベクトル（中心）を計算する。
　　　⇒各クラスタで中心を更新していく。

　　④収束するまで、②③の処理を繰り返す。
　　　⇒グルーピングできるk-meansの流れである。

###4-6-3.k平均法（k-means）の初期値の決め方
　　●初期値の決め方が大事である。
　　●「k-means++」を使用すると、1つ目の中心から離れた位置で次の中心を選択する。
　　　⇒ 少し時間がかかるが、結果は良くなる。

###4-6-4.ハンズオン
![k-means0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/a9eebaf8-9866-b1b0-f934-12cc1880c329.png)
![k-means0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/6ed21efc-0a0f-1cad-65f4-74442003550e.png)
![k-means0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/4acc015b-08ad-5df9-5e0e-1af4d0ee4f4b.png)
![k-means0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/ef05f67f-67cf-3095-9e43-6e9c82104c6f.png)
![k-means0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/a93db094-f54c-8469-b223-d109eef4b06c.png)
![k-means0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/5d64fa3e-a918-0a1f-a8a8-f64834af27bc.png)

###4-6-5.考察
　　k-meansは、コードを追ってみても分かり易いし、そもそも手法として理解が容易です。
　　視覚化した際も、他の人に説明するにしても、直ぐに認識してもらえる。
　　計算量などがどのように増えていくのか、クラスタの数にどのくらい影響するのかなど、
　　今後、分析をする中で良く理解をしておこうと思います。
parcel buildのビルド結果をgithub pagesで公開すると、jsファイルの読み込みが404で失敗する。

# 事象

`index.html`、`main.js`、`word.js`の3つのファイルから構成されるフロントエンドアプリケーションがあるとします。

```html:index.html
<!DOCTYPE html>
<body>
  <div id="title"></div>
  <div id="description"></div>
  <script src="main.js"></script>
</body>
```

```js:main.js
import Word from './word.js'

document.getElementById("title").innerHTML = Word.title
document.getElementById("description").innerHTML = Word.description
```

```js:word.js
export default {
  title: "Hello World",
  description: "Parcelのテストです"
}
```

`parcel build index.html`によりこのアプリケーションをビルドします (parcel-bundler v1.12.4)

```
$ parcel build index.html
⠹ Building index.html...
✨  Built in 36.94s.

dist/main.a0e33e9b.js        1.57 KB     1.08s
dist/main.a0e33e9b.js.map      735 B      17ms
dist/index.html                123 B    35.01s
Done in 60.34s.
```

ビルド結果である`dist`ディレクトリ配下をGitHubの`parcel-sample`レポジトリの`master`ブランチにプッシュ。`parcel-sample`レポジトリをgithub pagesとして公開する設定をした後、所定のURL(`https://nekotheshadow.github.io/parcel-sample`)にアクセスしたところ、`index.html`は想定通り表示されるものの、jsファイルの読み込みがステータスコード404によって失敗する事象が発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/9e961253-cbc6-913b-eca2-ea0369206e33.png)


# 原因と対策

公開URLを明示せずにビルドしたため、あらぬjsファイルを読み込もうとしたために起きた現象です。つまり`parcel build`の際に公開URLを指定する`--public-url`オプションを利用することにより問題は解決します (参考: https://parceljs.org/cli.html)

具体的には以下のように指定してビルドを実施します

```
$ parcel build index.html --public-url https://nekotheshadow.github.io/parcel-sample/
✨  Built in 30.23s.

dist/main.a0e33e9b.js        1.61 KB     1.19s
dist/main.a0e33e9b.js.map      735 B       6ms
dist/index.html                168 B    28.32s
Done in 50.77s
```

`dist`配下のビルド結果を改めて`parcel-sample`にプッシュし、`https://nekotheshadow.github.io/parcel-sample`にアクセスすると、想定通り動作することが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/6383bc8d-7d69-b927-8b90-73eeda6509b8.png)

Chromeの開発者ツールでも、jsファイルの読み込みが正しくできていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/fcdc92c3-02b9-9913-c8ab-25b9ab91cfa1.png)

# 参考

- https://github.com/nekoTheShadow/parcel-sample
- http://nekoTheShadow.github.io/parcel-sample
DeepRunning　～Level4.5～

#Level４．機械学習講座（理論と実践）
##4-5.ｋ近傍法（ｋＮＮ）
###4-5-1.ｋ近傍法（ｋＮＮ）とは
　　●分類問題のための機械学習手法である。
　　　最近傍のデータを$k$個取得し、もっとも多く所属するクラスに識別する。

　　　$k=3$と決めた時に、あるデータから最も近いデータを3個選択する。
　　　その中で、分類できる同じクラスに多く所属するものとして識別する。

　　　（例）あるデータから最も近いデータ3個のうち、
　　　　　　赤い点２個と、青い点１個が選択された場合は、自分自身は赤い点のクラスとする。

　　●$k$は、アルゴリズムを回す前に決めておく必要がある。
　　●$k$を大きくすると決定境界は滑らかになる。

###4-5-2.ハンズオン
　　●人口データを分類する。

![k近傍法0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/672bbd6c-e3de-c157-8549-08de9926b5b1.png)
![k近傍法0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/1289e1d3-cc9f-7f91-1c69-510212bab23e.png)
![k近傍法0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/04f923d5-2eac-3351-73eb-227eee2daf71.png)
![k近傍法0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/36797a9b-049d-b343-c5c1-f647ff2ac0c4.png)

$k=5$でやってみた。
![k近傍法0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b91043c7-7885-ce5f-dd3d-f1e26a1751d1.png)

$k=10$でやってみた。
![k近傍法0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/8afbeddd-e337-6977-0ba4-52d79298996d.png)

###4-5-3.考察
　　データの分布状況を確認してから$k$の値を設定した方が良いのか、
　　初期値はこのくらいと決める方法があるのかは勉強してみようと思います。
　　知識としていた部分だったので、動かしてみて勉強になった。
エンジニア（engineer）の由来を噛み砕く　

## 近況報告
　７月の半ばに自社サービスの会社のインフラ部門で内定をいただき，受理しました。八月から勤務開始です。転職のプロセスについては別途無料noteにまとめたいと思ってます。５月からの就活，長丁場でした。コロナの影響でほとんど選考が進まず，時には致命的な回答ミスで志望度が高い企業にお祈りをいただいたりしました。苦しい人が多くいる中でなんとか就活を成功できて良かったです。

[今回の内容は，自身が投稿した無料noteの内容をもとに執筆および加筆しました。](https://note.com/tanjinote/n/nff5af1f9be74)
# 今回のお題　エンジニアの由来について

### 対象
駆け出しエンジニア
エンジニアに転職しようと考えているひと

### 語源
　エンジニア(engineer)は指す意味は広く，ラテン語の「ingenium」を語源としています。直訳すると「エンジンを取り扱う人」と読めるため，産業革命当時の蒸気機関のエンジンから生まれたものと思ってしまいますが，それ以前よりエンジニアという言葉は存在していたそうです。
　
　中世において，動力である水車もまたエンジンと呼ばれており，それを直すひとはエンジニアと呼ばれていました。そして現在では技術者全体のことを指す言葉として浸透しています。

　語源をもっとみていきますと。「ingenium」の「gen」は「生み出すもの」という意味です。「generate」とという単語からも想像できるでしょう。英語は漢字の部首のように単語の意味に関連する言葉が含まれていたりします。例えば，「re」であれば，「再び，元に戻す，後ろ」という意味があります。「regret,reduce」がそうですね。こんな感じで内部で何かエネルギーを生み出すものという意味が「engine」にはあると考えることができます。蛇足ですが「~er」は「~する人」です。


### 現代のエンジニアについて

　エンジニアと呼べる職業にはたくさんの業種が存在しますね。例えば，機械の設計や開発，Web制作，水道や電気の管理を行う人，データの解析をする人もエンジニアです。その中でも**現代において市場価値の高いエンジニアは「パソコンを操るエンジニア」**であり，現代においてエンジニアと言われた場合はこれがほとんど該当しています。

　最近では「パソコンを操るエンジニア」のなかでもweb開発に携わるエンジニアの需要が高い（アツい）ようです。理由としては

**・業界が拡大傾向のため，エンジニアを求める企業が増えている。
・実務経験者の人口が業界の需要に対して少なすぎる。
・IT業界の流行の速度ははやく，最新の技術がたくさん生まれるため。
・パソコン１つで作業ができ，作業空間に制限がない働き方をしやすい。
・IT業界は他の業界（教育，飲食など）と親和性が高い。**

などなど，ほかの業界と比べて現代的な働き方ができるのが特徴だと考えます。

　エンジニアと言われると，「技術屋」というイメージがあります。私も「人と話さずコツコツやる職人」のイメージがありましたが実際は違いました。実際は**「顧客と疎通を取りながら最適なサービスを開発する職人」**だったのです。

　これはエンジニア特有の偏見でしょう。時計屋でも，オーダーメイドのスーツを作っても，彼らは依頼人の意見を聞かず自身の技術をアピールする修理，制作はしないでしょう。無論レベルが高いことに悪いことはありませんが，エンジニアの本質はそれと同じなのです。

　ただし，クライアントの要望にもランクがあります。

・ランクA　ユーザー・クライアントの要望に答える開発を行う。
・ランクB　クライアントの要望を受けたランクAのエンジニアから開発の一部を委託される。
・ランクC　委託をうけたランクBのエンジニアが負担軽減のために開発の一部を委託する。
・ランクD　委託をうけたランクCのエンジニアが勉強にもならない雑務を委託する。

　案件を受託する企業はランクA~Dのいずれかに該当しています。そして，ランクが高いほど様々な工程に関わることができ，低いランクではプログラミングはおろか，エクセルや事務作業をすることがあります。SES（システムエンジニアリングサービス，エンジニア派遣業）ではランクAの仕事がほとんどないと考えて良いでしょう。

　顧客と疎通を取りながら最適なサービスを開発する仕事を行うのがエンジニアと言っても，提供するものの絶対的なクオリティが低いままでは市場価値の上昇が見込めません。そのため，市場価値を上げるためにランクの高い業務に関わる努力（転職，打診など）をしていく必要があります。

　**今後もエンジニア不足は続き，プログラミングができるだけの人がスクールなどによって大量生産され，下流工程の大部分が「単純労働」のくくりにされる未来は近い**でしょう。その時に差別化できるように，自身の技術の研鑽の他に，コミュニケーションスキルや上流工程での経験は重要になっていくでしょう。**使われる側ではなく，彼らを使う側になるためのキャリアプランの構築を常に考えていくべき**というわけです。

## おわりに

　どうでしょうか。そもそもエンジニアってなんなの？という本質的な部分がこの記事を通して理解した人が1人でもいると幸いです。あまりこういう理屈っぽいとこってあまり触れる人が少ないと思うので笑

　webエンジニアの種類とか仕事の具体的な内容，DevOpsみたいな最近のエンジニアのブームに関しては，有識者のqiitaを参考にしてください。
GMTとJST,UTCについて

#はじめに
以前受けた会社の研修で標準時についての話が出た際に、理解をそのままにしてしまったので振り返り。

#GMT
Greenwich Mean Time。ロンドン郊外にあるグリニッジ天文台での時間。
#UTC
Universal Time, Coordinated　協定世界時のこと。
現在、インターネットに接続されたサーバの多くはUTCを使用している。
Coordinaは「調整された」という意味で、セシウム原子時計を基準としており、GMTの天文台での観測によるズレを修正した時刻。
なので時刻はGMTとほとんど同じみたいですが、調整された時刻がUTCとなります。
#JST
Japan Standard Time。日本標準時のこと。大体UTCから9時間の差異。



それぞれグローバル関数で時刻を取得する場合はタイムゾーンを指定をしたほうが確実な値が取れます。
シェルスクリプトで連番ファイルを消去＆生成

##連番をつくる

seqというコマンドを使えばよいが、桁数を指定したいとき、-fオプションを用いる。
「seq -f %0桁数 最初の数　最後の数」
という風にかく。0を書くのを忘れずに、、、


```
#!/bin/bash

for NUMPATH in `seq -f %05g 1 96`
do
 echo "flow_z${NUMPATH}_0000950000"
done

```


実行結果はこの通り、

```
rm flow_z00081_0000010000
   (省略)
rm flow_z00095_0000950000
rm flow_z00096_0000950000
```


###利用例
連番ファイルを消去したいのに、ワイルドカードだと制限数をオーバーする、うまく記述できないし、正規表現を使うのもなんだかなーというとき、上のコードで対応できる。
Prisma CloudでAWSリソースの脆弱性管理（Lambda編）

Palo Alto社のセキュリティ製品、Prisma CloudをでAWSリソースの脆弱性管理を行ってみます。
今回は、Lambdaに対して、脆弱性診断をかけてみます。

# 準備
Prisma Cloudアカウントがない方は、以前の投稿をご参照ください。
https://qiita.com/Hiroyama-Yutaka/items/0c5205749bc54e3ec056

# 脆弱性診断
Computeメニューに存在します。
今回は、（AWS Lambda）に対して、実施してみます。

### 準備
手順はこちら。
https://docs.paloaltonetworks.com/prisma/prisma-cloud/prisma-cloud-admin-compute/vulnerability_management/serverless_functions

適当にLambdaファンクションを作成。今回はSAMでPythonベースのファンクションを作りました。
今回は、意図的に脆弱性のあるライブラリバージョン（numpy1.16.0, request2.2.1）を使用しておきました。
https://nvd.nist.gov/vuln/detail/CVE-2019-6446
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1830

手順に従って環境変数をセット。Prisma CloudコンソールにLambdaファンクションが表示されます。
<img width="1166" alt="Prisma Cloud | Compute 2020-07-29 23-27-58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/3f6fb92f-e819-f903-f75c-c0823c026e01.png">

最初は、ファンクションがグレーアウトされていると思います。（↑のキャプションのアイコン）
ClickしてScan対象にしましょう。
<img width="1170" alt="Prisma Cloud | Compute 2020-07-29 23-32-15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/191e5c78-6969-d8d0-a6bb-8bd61a5713fd.png">

成功すると、ファンクションアイコンが赤くなります。

### スキャン

初回に自動的にスキャンが走っています。
中を覗くと、しっかり仕込んだ脆弱性を検知してくれています。

<img width="947" alt="Prisma Cloud | Compute 2020-07-29 23-41-12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/a2193c89-d0e4-3847-03c7-5f358547330b.png">

requestsをアップデート。

```
$ cat hello_world/requirements.txt 
requests==2.2.1
$ vi hello_world/requirements.txt 
$ cat hello_world/requirements.txt 
requests==2.20.0
$ sam build
$ sam deploy
```


再スキャンして確認！
無事、requestsの脆弱性が解消が確認できました。

<img width="913" alt="Prisma Cloud | Compute 2020-07-30 00-09-40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/365eacdf-47b9-48c2-c301-b77aa1868717.png">

# まとめ

Prisma CloudでAWS Lambdaの脆弱性スキャンをしてみました。
Prisma CloudのAWS Lambdaには、脆弱性スキャン以外にも、実行開始をフックして、起動引数に攻撃性のある内容が含まれていないかなどをチェックする機能も備えています。

その機能や別のサービスなどは別の機会に試してみます。
【Swift】テキストに取り消し線を付ける

`NSAttributeString` を使って文字列を装飾するやり方をまとめました。

## 完成図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/52eafe76-d452-67d6-076f-0676dd0c8fb4.png" width=40%>

## 実装
```swift
@IBOutlet weak var textLabel: UILabel!

private func setTestLabel() {
    // 表示したいテキスト
    let text = "文章の中の一部に取り消し線を付けたい。"
    let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: text)
    // 全体に共通して付けたいレイアウトを設定
    attributeString.addAttribute(.font,value: UIFont.systemFont(ofSize: 15), range: NSMakeRange(0, attributeString.length))
    
    // 取り消し線部分の設定
    attributeString.addAttributes([
        .foregroundColor : UIColor.red,
        // 取り消し線の太さを決める
        .strikethroughStyle: 1
    // 取り消し線を反映したい部分を設定
    // NSMakeRange(何文字目から, 何文字間)
    ], range: NSMakeRange(8, 5))
    textLabel.attributedText = attributeString
}

// NSMakeRange(何文字目から, 何文字間)はこんな感じにも書き換えられる
// こちらの方が直感的でわかりやすい
NSString(string: text).range(of: "取り消し線")
```

これで取り消し線の実装は完了です👌
Azure FunctionでService Bus Queueからのメッセージの再配信を抑止

Service Bus QueueのメッセージをAzure FunctionのService Bus Triggerにおいて、
Fucntionの起動後にアプリの処理が長時間かかるケースにおいて、キューのメッセージのステータスが完了にならず、Service Busから同じメッセージが繰り返し再配信されてしまう事象が発生。

原因として、host.jsonのmaxAutoRenewDurationがキューのメッセージのロックを自動的に更新する期間(再配信を抑止する期間)なので、
この設定値が
Functionのtimeoutより短かかったため、繰り返し再配信されてしまった模様。

ロック期間とタイムアウト値は同じぐらい長い値に設定しておいたほうがよい模様。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus-output?tabs=java#host-json


https://stackoverflow.com/questions/62513882/how-can-i-ensure-that-the-message-that-azure-function-receives-is-only-once



https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=java

https://social.msdn.microsoft.com/Forums/ja-JP/c4c2deaf-fd99-47bd-bed7-f6868f3d6680/where-is-the-document-with-the-maximum-file-size-to-upload-to-data-lake-storage-gen2?forum=lyncpersistentcssdk

https://ohina.work/post/service_bus_fifo/
DeepRunning　～Level4.4.2～

#Level４．機械学習講座（理論と実践）
##4-4.主成分分析
###4-4-7.ハンズオン
　　●乳がん検査データを利用してロジスティック回帰モデルを作成する。
　　●主成分を利用して、2次元空間上に次元圧縮する。（32次元⇒2次元に次元圧縮）

![主成分分析0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/f970da5c-a3ee-4883-6a71-cc8f7cdb4a21.png)

![主成分分析0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/e12f56a1-d7c2-7d2b-09a6-11b4c9d559cb.png)

![主成分分析0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/7dd8792e-0f29-d2b3-f170-e2c79e302838.png)

ちゃんと不要なカラムは削除できています。

![主成分分析0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/705db82c-d922-39ea-985a-5517ff712723.png)

目的変数・説明変数を作成したり、学習用データと検証用データを分割します。

![主成分分析0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/6aa1a250-dc14-0ece-b99f-2d0ec0926383.png)

そのまま32次元で精度が97.2％です。

![主成分分析0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/053b2e3f-0366-2b6b-f381-e02fd8fadf4d.png)

主成分を分析して、
第１主成分の軸が43％以上
第２主成分の軸が20％くらい
第３主成分の軸が10％程度
であるため、第１と第２の主成分で65％程度を維持できるのではないか。

⇒それを可視化してみる。

![主成分分析0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/166d06b2-3735-2bcc-9d7e-994fe3074e54.png)
![主成分分析0008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/cd161954-1bdc-9598-8efc-fd07eee776c5.png)

講義のとおり、2次元だと境界があいまいになっていますね。


###4-4-8.考察
　　なんでもかんでもデータを詰め込んで、たくさんの変数を使用できれば精度は上がる。
　　ただし、計算のコストを抑えて、精度を維持するのは経験と地道な検証が必要だろう。
　　少し採用する説明変数を変えてみて、失敗を積み上げてTryするのをやってみたい。
　　主成分分析は簡単であるが、強力な分析手法だと感じました。
fetchでクエリパラメータを渡す方法

ajaxをfetch apiで書き変えた時に、getリクエストにクエリパラメータをつける方法がわからず詰まってしまったのでメモ。

fetchにはgetリクエストにクエリパラメータをつける方法が用意されていないようです。
この点、ajaxメソッドはわかりやすくクエリパラメータを付与できたのはメリットだったと思います。

ただ、以下の方法でクエリパラメータを付与してfetchを書くことができました。
悩んでいる方は是非参考にしてみてください。またもっとい書き方があれば、是非教えてください。

```javascript
    const params = { // 渡したいパラメータをJSON形式で書く
      a: xxxx,
      b: xxxx,
      c: xxxx,
    };

    const query_params = new URLSearchParams(params); 
    fetch('${リクエストを送りたいURL}?' + query_params)
      .then(response => response.json())
      .then(response => {
          // 実行したい処理を記述
      });
```
Bitbucketでread only modeになったときの対処

# 状況
**Bitbucket**で*read only mode*になってしまいました。容量が2GBを超えると*read only mode*になるようです。さらに5GBを超えてしまうと`$ git push`しても受け付けず、以下が表示されます。

```text
$ git push --force
Repository is in read only mode (over 2 GB size limit). Learn how to reduce your repository size: https://confluence.atlassian.com/x/xgMvEw.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

<details><summary>ちなみに2GB以上，5GB以下なら…</summary><div>
以下のコードで対処できるはずです。

```shell
$ git reset --hard HEAD~1
$ git push --force
```
</div></details>


# 対処法
リポジトリを一旦削除して再度作り直します。（対処法と言えるかは微妙ですが。）

### 1. ローカルリポジトリにpull

```
$ git pull
```

<details><summary>作業中のローカルリポジトリを壊したくなければ…
</summary><div>
PCの別の場所に`$ git clone [URL]`しておきます。ちなみにURLはローカルリポジトリで`$ git remote -v`とすると調べられます。
</div></details>


### 2. 容量を減らす
次に、Gitの容量を減らすために、ローカルリポジトリの**容量の大きいファイルやフォルダを削除**します。バックアップをとってから以下のコマンドで削除します。

```shell
$ git filter-branch --tree-filter "rm -f -r [消したいディレクトリパス] " HEAD
$ git gc --aggressive --prune=now
```

### 3. リモートリポジトリを削除

ブラウザで**Bitbucket**にログイン → 左上のハンバーガメニュー → 「リポジトリ」 → 削除したいリポジトリに移動 → 左上のハンバーガメニュ → 「Repository settings」 → 一番下の「リポジトリの削除」

### 4. 同名のリポジトリを作成

左上のハンバーガメニュー → 「＋」 → 「リポジトリ」

リポジトリ名を以前と同じにすると、同じURLになります。

### 5. リモートにpush

```
$ git push
```


# おわりに
複数人で共有している場合はテストしていません。割と雑な対処法ですが、個人で使う分には問題ないと思います。

# 環境
Ubuntu 18.04.4 LTS
git version 2.17.1

# 参考文献
[How to push in read-only mode?](https://community.atlassian.com/t5/Bitbucket-questions/How-to-push-in-read-only-mode/qaq-p/616817)
[Git リポジトリに上がっているファイルを履歴ごと消すには？](https://qiita.com/go_astrayer/items/6e39d3ab16ae8094496c)
[Bitbucketのリポジトリを削除する５ステップ](http://gungnir-odin.hatenablog.com/entry/20130208/1360326503)
Rubyとは？

#Rubyとは？
Rubyは「Webアプリケーション」を作るためのプログラミング言語です。

ここでWebアプリケーションとWebサイトの違いが分からない人向けに説明しておくと、
Webサイトとは、訪問者が見ることしかできないものです。
俗に言う、ホームページと言うやつですね。
WebサイトはHTML,CSSを用いて作られます。

一方で、Webアプリケーションは訪問者が見る＋操作（検索や登録など）できます。
例えば、Amazonでユーザー情報を登録したり、商品を検索したりしますよね。
それをできるものがWebアプリケーションです。

#Rubyの特徴とは？
1.スクリプト言語である
スクリプト言語とは、簡単に言うと、記述したプログラムをすぐに実行して、
動きを確認できる言語です。

Ruby以外のプログラミング言語（例えば、JavaやCなど）は、
プログラミングを実行するには、コンパイルする必要があります
（コンパイルとは、人間が書いたソースコードを、機械が読み取れるように変換する作業）。
Rubyは、記述したコードをすぐに実行・確認できるので、
円滑にプログラミングを進められます。

2.記述がシンプルである
Rubyは、可読性（読みやすさ）を重視しています。そのため、Javaなどに比べて、
シンプルにプログラミングを行えます。
実際のコードで、JavaとRubyのコードを比較してみましょう。

◆JAVA

```
public class Main {
  public static void main(String[] args){
    System.out.println("Hello World");
  }
}
```

◆Ruby

```
puts "Hello World"
```

Rubyの方が圧倒的にコードの量が少ないことがわかると思います。
このようにRubyはシンプルで書きやすい言語なのです。

3.日本語の文献が多い

Rubyは日本人によって作られたプログラミング言語なので、国内でも非常に人気のある言語となっています。
そのため、エラーなどが出ても、google先生に聞くと、大体は出てきます。
しかし、本当にたまに何も出てこない時があります。
そのときは、誰かに聞くしかありません(笑)
【Laravel】「ルート定義メソッド」と「ビュールート」の違いって？

## ルート情報を用意しよう
通常、Laravelではルート記述をする際、大きく2つの書き方に分類することができます。
今回はその2つの書き方である「ルート定義メソッド」と「ビュールート」をご紹介。記述の例を、route/web.php にコーディングしていきます。

## ルート定義メソッドの記述
```php
Route::get('URIを記述','SampleController@index');
Route::post('URIを記述','SampleController@create');
```
ルート定義メソッドで記述するとこんな感じになります。
この定義メソッドの特徴としては、

・第１引数にURIテキストを記述
・第２引数に、第１引数のURIにマッチした場合の際のコールバックを指定

以上の特徴があります。

## ビュールートの記述
```php
Route::view('/welcome', 'welcome');
```
ビュールートは上記のような書き方です。

・第１引数にURIテキストを記述
・第２引数に、表示するビューの指定

上記の例の場合は、プロジェクトルート直下の「resources/views」内の「welcome.blade.php」を読み込もうとします。

ちなみに、オプションとして第３引数に、ビューへ渡すデータの配列を指定することもできます。

```php
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
```

## リダイレクトルートの記述
他のURIへリダイレクトするルートを定義する記述もできます。Route::redirectを使用しましょう。

```php
Route::redirect('/url', '/idousaki', 301);
```
上記の例では、ブラウザで「/url」にアクセスしたら「/idousaki」にリダイレクトされるルート定義になっています。
【Rails】メソッドの分類

一口にメソッドと言っても様々なメソッドがあるので、整理する為に記事にしました。

#Railsのメソッドの原則

- Railsではメソッドをdef〜endで定義します。

```Ruby:
def メソッド名
end
```

上記以外にも以下のようなメソッドがある。

#Rubyが用意してくれるメソッド

- newメソッド、eachメソッド、sortメソッドなど

#Railsが用意してくれるメソッド

Railsが用意してくれるメソッドには主に以下の２つに別れる。

①ActiveSupportコア拡張機能

- present?メソッド、tryメソッド、時間計算を行うメソッドなど


②ActiveRecordのメソッド

- allメソッド、saveメソッド、orderメソッドなど

#オブジェクト自身が持っているメソッド

**@user.name**のように、インスタンスから値を取り出すのにオブジェクト自身がもっているメソッド(ここではnameのこと)を使うことができる。


参考サイト：https://diveintocode.jp/blogs/Technology/RailsMethod01
SQLServerで0方向への切り捨てを行う方法

## 説明
` ROUND ( numeric_expression , length [ ,function ] )   `
にて、function に1を指定すると0方向への丸めが行われます。

## 検証結果
| numeric_expression | length  | function  | Resulet |
|--:|--:|--:|--:|
| 1.5| 0| |2.0|
| 0.5| 0| |1.0|
| -0.5| 0| |-1.0|
| -1.5| 0| |-2.0|
| 1.5| 0| 0|2.0|
| 0.5| 0| 0|1.0|
| -0.5| 0| 0|-1.0|
| -1.5| 0| 0|-2.0|
| 1.5| 0| 1|1.0|
| 0.5| 0| 1|0.0|
| -0.5| 0| 1|0.0|
| -1.5| 0| 1|-1.0|

## 検証方法
検証結果のResultを除いたテーブルを作成し、
`case when Table_1.[function] is null then ROUND(Table_1.expression, Table_1.length)
			when Table_1.[function] is not null then ROUND(Table_1.expression, Table_1.length, Table_1.[function])
		END`
を実行。

## 補足(FLOORを使用した場合)
| numeric_expression | Resulet |
|--:|--:|
| 1.5|1|
| 0.5|0|
| -0.5|-1|
| -1.5|-2|

## 参考URL
(https://docs.microsoft.com/ja-jp/sql/t-sql/functions/round-transact-sql?view=sql-server-ver15)
タグ付きクラスよりクラス階層を選ぶ

###タグ付きクラス

````java

public class Figure {

	enum Shape {RECTANGLE, CIRCLE};

	final Shape shape;

	// shapeがRECTANGLEである場合にだけこれらのフィールドは使われる
	double length;
	double width;

	// shapeがCIRCLEである場合にだけこのフィールドは使われる
	double radius;

	// 円のコンストラクタ
	Figure(double radius) {
		shape = Shape.CIRCLE;
		this.radius = radius;
	}

	// 長方形のコンストラクタ
	Figure(double length, double width) {
		shape = Shape.RECTANGLE;
		this.length = length;
		this.width = width;
	}

	double area() {
		switch (shape) {
		case RECTANGLE:
			return length * width;
		case CIRCLE:
			return Math.PI * (radius * radius);
		default:
			throw new AssertionError(shape);
		}
	}

}

````

###タグ付きクラスに対するクラス階層による書き換え
````java

abstract class Figure {
	abstract double area();
}

class Circle extends Figure {
	final double radius;

	Circle(double radius) {
		this.radius = radius;
	}

	@Override
	double area() {
		return Math.PI * (radius * radius);
	}
}

class Rectangle extends Figure {
	final double length;
	final double width;

	Rectangle(double length, double width) {
		this.length = length;
		this.width = width;
	}

	@Override
	double area() {
		return length * width;
	}
}
````

こちらを参考にさせていただきました。
<a href="https://www.amazon.co.jp/dp/B07RHX1K53/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1">Effective Java</a>
react-three-fiberとreact-springでアニメーション無限ループのオンオフをする方法

react-spring v8では素直に無限ループをする方法が用意されていない。（たぶん）
whileで無限ループを作ってしまうしかないようだ。
[Best practice for infinite loops?](https://spectrum.chat/react-spring/general/best-practice-for-infinite-loops~b27a59aa-d25d-43b4-8d37-83a70b74049c)

v9ではloop propが用意されてるらしいのでそちらを使うと良さそう。
[How can one-way animation looping be implemented? #956](https://github.com/react-spring/react-spring/issues/956)

_ちなみにv9.0.0-rc3を使おうとしたところ、変なところでハマってうまくいかなかった。_
_コンポーネントの再レンダーのタイミングでしかアニメーションが更新されないような現象。_
_内部的にはreact-springはちゃんと動いているけど、コンポーネントの再レンダーのトリガーにできてない感じの挙動。_
_これが解決できればv9系を使う方が幸せっぽいのでできた人は情報求む。_

閑話休題。

一応`while(true)`で無限ループは作れるし動くんだけど、それを使ってるコンポーネントが再レンダーされるとブラウザがクラッシュする。
無限ループしてる関数がゾンビ的な挙動をしているのではないかと推測する。

```jsx:再レンダー時にクラッシュするコード
const { opacity } = useSpring({
	from: { opacity: 0 },
	// フワッと現れて、その後おぼろげにフワフワする感じの不透明度アニメーション
	to: async (next, cancel) => {
		await next({ opacity: 1 })
		while (true) {
			await next({ opacity: 0.2 })
			await next({ opacity: 0.5 })
		}
	}
})
```

ちなみに今回はこのアニメーションのオンオフを親コンポーネントからコントロールしたい。
例えば`active:boolean`みたいなpropで、`true`ならさっきのふわふわアニメーションを頭から再生して、`false`なら`{opacity:0}`に落ち着くみたいな挙動をさせたい。

```jsx:やりたいのはこんな感じ（まだ再レンダー時にクラッシュする）
const { active } = props
const { opacity } = useSpring({
	from: { opacity: 0 },
	to: active ?
		// active==trueならふわふわさせる
		async (next, cancel) => {
			await next({ opacity: 1 })
			// ※※※ここが大事※※※
			// activeの値がキャプチャされてしまうので、
			// あとでfalseになってもループを抜けられない
			while (active) {
				await next({ opacity: 0.2 })
				await next({ opacity: 0.5 })
			}
		} :
		// active==falseなら消える
		{ opacity: 0 }
})

```

最終的にうまくいったコードはこちら。
方針としては、
1. `useSpring`に関数を渡すことで、toの再設定関数(この例では`setAnimation`)を取得する
2. `active`を依存関係に持つ`useEffect`を使用することで、toの再設定を`active`の変更時に限定する
(v9系では`useSpring`に依存関係を持たせてよりスマートに書けるようになるっぽい)
3. whileで`activeRef=useRef(active)`を見るように変更することで、`active`の値の変更をキャッチできる
-> これにより、whileループがゾンビ化するのを防げる


```jsx
const { active } = props
const activeRef = useRef(active)
// useSpringは関数を渡されると、SpringValueだけじゃなく更新関数やstop関数も返す
const [{ opacity }, setAnimation] = useSpring(() => ({
	// toの値はあとで設定するので初期値のみ指定
	opacity: 0
}))
useEffect(() => {
	// activeが変更されたことをwhileに通知する
	activeRef.current = active
	setAnimation({
		to: active ?
			// active==trueならふわふわさせる
			async (next, cancel) => {
				await next({ opacity: 1 })
				// activeRef.current==falseならループを抜ける
				while (activeRef.current) {
					await next({ opacity: 0.2 })
					await next({ opacity: 0.5 })
				}
			} :
			// active==falseなら消える
			{ opacity: 0 }
	})
},
// useEffectはactiveが変わった時に呼ばれる
[active])
```

たぶん、タイミングによっては`{ opacity: 0 }`に`setAnimation`した後にwhile内の`await next()`が効いて`{ opacity: 0.5 }`で止まっちゃう現象が起こるような気もする。
ちゃんと対応するならPromiseをrejectさせるみたいなことをやると良いのだと思う。
今回はとりあえず動いてそうなので無指する。
【Auth0】リフレッシュトークンの取得方法と使い方

# はじめに
Auth0にはリフレッシュトークンを発行する機能があります。
本記事ではAuth0のリフレッシュトークンの取得する方法とリフレッシュトークンを使って新しいIDトークンとアクセストークンを取得する方法を紹介します。


# リフレッシュトークンの要求方法
Auth0のUniversal Loginを使ってログインする場合、基本的にはSDKの利用有無に関わらず最初に`/authorize`エンドポイントへのアクセスを行います。
`/authroize`エンドポイントには以下のようにさまざまなパラメーターを設定します。
（Auth0の[API仕様](https://auth0.com/docs/api/authentication#authorization-code-flow)から転載）

```
GET https://YOUR_DOMAIN/authorize?
  audience=API_IDENTIFIER&
  scope=SCOPE&
  response_type=code&
  client_id=YOUR_CLIENT_ID&
  redirect_uri=https://YOUR_APP/callback&
  state=STATE
```

この中の`scope`パラメーターには`openid profile email`というように複数の値がスペース区切りで設定されます。
アプリケーションは`scope`パラメーターに自身が必要とする権限を設定しAuth0に問い合わせを行います。

この`scope`パラメーターに`offline_access`という値を追加することでログイン完了後にAuth0からリフレッシュトークンが返ってくるようになります。
設定例：`scope=openid profile email offline_access`

これはOpenID Connectの仕様にも定義されている標準的な手法です。

OpenID Connectの仕様
http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#OfflineAccess

# リフレッシュトークンの取得

`scope`パラメーターに`offline_access`を入れた状態で`/authroize`にアクセスし正常にログインが完了するとAuth0からリフレッシュトークンを含んだレスポンスが返ってきます。
Auth0のSDKを利用する場合でも、オプションパラメーターとして同様に`scope`パラメーターに`offline_access`を設定してください。

```json
{
  "access_token":"gZI4D........",
  "refresh_token":"X0nOzxEX3j..........",
  "id_token":"eyJhbGciOiJSU.............",
  "token_type":"Bearer",
  "expires_in":86400
}
```

# リフレッシュトークンの使い方

Auth0の[API仕様](https://auth0.com/docs/api/authentication#refresh-token)のとおりにhttpリクエストを行えば新しいIDトークンとアクセストークンを取得できます。
`grant_type`パラメーターは`refresh_token`固定です。
SDKを使う場合は大抵専用の関数やメソッドが用意されているのでそちらを利用してください。

```
POST https://YOUR_DOMAIN/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&refresh_token=YOUR_REFRESH_TOKEN
```

```json
{
  "access_token": "fFN1LGcv.........",
  "id_token": "eyJhbGciOiJSUY................",
  "scope": "openid profile email offline_access",
  "expires_in": 86400,
  "token_type": "Bearer"
}
```

# おわりに
リフレッシュトークンを利用するとユーザーに再ログインをしてもらわなくても新しいトークンを取得できます。
ユーザーに再ログインを促すことなく、アクセストークンの有効期限以上の長期間にわたってアクセストークンを利用したい場合などに活用できると思います。
HomebrewでPostgreSQLをインストールして起動・停止する

#PostgreSQLをインストールする
用意するのもの
1. ターミナル（iTerm2)
2. Homebrew

##Homebrewを使ってインストールしていきます。
###最新バージョン

```
$ brew install postgresql
```

###バージョンを指定する
```
$ brew search postgresql
```
で検索すると
`postgresql postgresql@10 postgresql@11 postgresql@9.4 postgresql@9.5 postgresql@9.6`
といった感じで表示されるので、@Version でバージョンを指定して

```
$ brew install postgresql@10
```
を実行してインストール完了！

###確認
```
$ psql --version 
```

##Command not found
Pathを通せばOKです。
Pathについての詳しいことは割愛します。

```
$ vi ~/.bash_profile
```
などでbash_profileを開いて、下記のようにPathを記載します。

```
export PATH=/usr/local/Cellar/postgresql@10/10.13_3/bin:$PATH
```

インストール時にバージョンを指定しなかった場合は、
@10 等のバージョンは不要です。
実際のパスはしっかり確認しましょう。

##起動！
```
$ brew services start postgresql@10
```
インストール時にバージョンを指定しなかった場合は、
@10 等のバージョンは不要です。

##データベース作成！
起動したまま、下記コマンドを実行する。

```
createdb <db_name>
```

##停止！
```
$ brew services stop postgresql@10
```

#まとめ
PostgreSQLを扱うのは初めてなので備忘録として。
PostgreSQLはこれから使い倒します。
未経験からWEBエンジニアに転職するときの転職サイトの使い方について

## 概要／書こうと思ったきっかけ
IT業界への転職活動で大事なのが転職活動の進め方と転職サイトの使い方。
たくさんある転職サイトでどれを使えばいいのか、どう進めて行けばいいのか、転職活動はじめた最初の方で、かなり迷った経験があるので実際に転職活動中でわかったことをまとめてみた。

※2020年の５月下旬から転職活動して6月下旬に転職活動を終え7月から出勤しました。
緊急事態宣言が出て間もない中、めちゃくちゃ不安だったけど、なんとか2社から内定をもらうことができました。

## 転職活動のやり方
新卒と転職ではやり方が真逆！

新卒の時は、企業研究をして企業の面接対策をしっかり行なって志望動機も固めてやるのが普通だった。

けど、転職の場合は
**とにかく、たくさんの企業に応募することが大事！！**
しかも、ある程度同じタイミングで大量応募すること。
基本的に落ちるのが当たり前なので１社１社研究しながらやってたら時間がかかりすぎてしまう。
（私の場合は転職エージェントを使って7０社以上はまとめて応募してました。）
そして、タイミングを合わせて応募しないと内定が出るタイミングが食い違ってしまって、「こっちから内定出たけど、あっちは再来週に結果わかる、、」みたいな究極の選択に迫られてしまうことがあるため。（基本的に企業は内定出してから３日〜１週間まで待ってくれます。）
あと、同時に内定が出れば給料の交渉などにも使えることも、、
それと、転職者の場合
離職期間が空いてしまうのも企業側から印象が良くないため、できれば時間をかけすぎないほうがいい。（遅くとも半年以内には決めたいかな・・・）



## 転職サイトの違いは大きく２つ
- 広告型
広告を収益としているため、企業側は広告費を支払えば何人採用してもOK。たくさんの人材を費用抑えて獲得したい場合に有利。
（広告費の費用は、だいたい50〜100万くらい？らしい）

- エージェント型
成果報酬型。企業側が良い人材を紹介されて採用すれば、その人の年収の３割くらいが費用になる。
（年収300万で人材採用すれば１００万くらいが費用になる）

## 転職サイトの使い分け方
広告型はエージェント型より費用が安く抑えられるので、同じレベルの人材がきた場合は広告型のほうが企業としては嬉しい。
エージェント型は企業とユーザーの間に担当者が入ってくれるため
交渉だったり、直接聞きにくい内容を確認できたり、スケジュールの調整もしてもらえる。

オススメの使い方としては、
どうしても行きたい会社がある場合は広告型のサイトを利用して応募して
他はエージェントで大量応募するのがベストかと思う。
めっちゃくちゃ行きたい会社がある場合は、会社のホームページから直接応募するのも良い。
それか、その会社の社員の人とSNSなど繋がって連絡をとるなどする！
そこまでの熱意があれば企業も嬉しいはず！！

## 個人的におすすめ転職サイト
- Doda（広告型・エージェント型）  
とにかく企業豊富で応募もしやすい。  
どんどん選考応募ができるため数打ちゃ当たるじゃないけど、とりあえず登録するのはオススメ。
- Geekly（エージェント型）  
IT業界に特化してるエージェントサイト。  
専門分野だけあって担当の人も業界に詳しく、最近の転職市場の傾向なども詳細に教えてくれた。
ここだけにしかない求人も多くあるっぽい。
- Green（広告型っぽいけど成果報酬型らしい）


## 最後に個人的な感想
転職エージェントは相性が一番大事だと思った。
有名な転職サイトにしても無名な転職サイトにしても
相性がいいエージェントさんが担当につけば、いい企業を紹介される確率は高まるし、いい企業にたくさん出会えればそれだけ通過する確率も高まる。

そう思うと、結局は人なのかなとも思いました。  

皆様の転職に少しでも役立てられればと思います。
【GAS初心者】スプレッドシートのある1列だけを抜き出したい！(GAS)


結論（はじめから列のみの値を取る場合）
------

```javascript:
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名");
var Values_E = sheet.getRange('E2:E').getValues();//項目(E1)をのぞいたE列の値を全て取得
Logger.log(Values_E.filter(String))//空白をのぞいて表示
```

結論（シート全体の値を取る場合）
------

```javascript:
var targetCol = 0 // 取得したい列番号(0から数える)
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名");
var vals = sheet.getDataRange().getValues();　// シート全体の値を取得
Logger.log(vals.map((line) => line[targetCol]))
}

```
PythonでDIを勉強するためにサクッとプログラム書いてみた①

#背景

会社でDI（Dependency Injection)についての話が出たが、
イマイチちゃんと分かっていなかったのでお勉強することにした

#そもそもDIって何よ
・依存性の注入（直訳）
・結合度の低下によるコンポーネント化の促進
・単体テストの効率化
・特定のフレームワークへの依存度低下
・DIコンテナってのがあるらしい（へぇ）

個人的には、単体テストがしやすくなるってところに惹かれた。

後、実装時に（見かけ上）コンポーネント化されたとしても、
各々依存しあってたらあまりメリットないもんね。

（筋子じゃダメなんだ、いくらでないとダメだ、というイメージは本当に無駄）

#早速書いてみる
何はともあれ、書いてみる。

まずは、依存しまくっている例。

```no_di.py
class Country:
    def getCountry(self):
        return "Japanese"


class Position:
    def getPosition(self):
        return 'SuperStar'


class HorseName:
    def getName(self):
        return 'Caesario'


class GreatRealCondition:
    def __init__(self):
        self.c = Country()
        self.p = Position()
        self.h = HorseName()

    def getGreatRealCondition(self):
        return self.c.getCountry() + "\n" + self.p.getPosition() + "\n" + self.h.getName() + "!"


if __name__ == '__main__':
    g = GreatRealCondition()
    print(g.getGreatRealCondition())
```

```実行結果.
Japanese
SuperStar
Caesario!
```

何の文章か分からない方はyoutubeで
「ジャパニーズスーパースターシーザリオ！」で検索。

GreatRealConditionクラスは、

・Countryクラス
・Positionクラス
・HorseNameクラス

これらのクラスと密な関係（**三密**）になっている。

ということは、これらのクラスは、バラバラに見えて、実はほぼ一つのクラスである、と言える。

再利用も出来ないし、そもそもテストも出来ない（値を変えてみたり、なんてことは今のところ出来ない）。
Countryクラスなどにセッターを入れれば値を変えることはできるが、もはやGreatRealConditionクラスのテストではないよね。

なので、依存度を下げてみる。

```on_di.py
class Country:
    def getCountry(self):
        return "Japanese"


class Position:
    def getPosition(self):
        return 'SuperStar'


class HorseName:
    def getName(self):
        return 'Caesario'


class GreatRealCondition:
    def __init__(self, c: Country, p: Position, h: HorseName):
        self.c = c
        self.p = p
        self.h = h

    def getGreatRealCondition(self):
        return self.c.getCountry() + "\n" + self.p.getPosition() + "\n" + self.h.getName() + "!"


if __name__ == '__main__':
    c = Country()
    p = Position()
    h = HorseName()
    g = GreatRealCondition(c, p, h)
    print(g.getGreatRealCondition())
```

```実行結果.
Japanese
SuperStar
Caesario!
```

先ほどと同じ結果になった。


ここで大きく変わったことは、

**GreatRealConditionクラスが他クラスを持たなくなったこと**

に尽きる。

さっきまで、３密クラスに依存していて、他に使い道がなかったGreatRealConditionクラスが、

コンストラクタで３密クラスを持たせるようにすることで、いろんな用途が出来た。
（本当はいろんなパターンで試そうと思ったのだが、長くなりそうなのでまた今度）

とまあ、コンストラクタを使って、「依存性を注入」したわけです。

最初はこんな感じ。

#今後

今回はコンストラクタを使用して注入したんだけど、

setterで注入だったり、インタフェース定義して注入したりといろいろ方法があるみたいなので是非試してみようと思います。

あと、pythonだと結構DIめんどいかも。
（慣れてないだけか）

#Thanks!!

参考になった記事はこちらです。
ありがとうございます。
https://qiita.com/mkgask/items/d984f7f4d94cc39d8e3c
相関係数の直感的な理解

<h1>相関係数の直感的な理解</h1>

相関係数の直感的な理解について、説明します。

今回の相関係数の説明をするにあたって、Pythonで疑似データを用意しました。
生成方法は以下のコードになります。

```
x = np.random.normal(170.0,6.6,50)
y = np.random.normal(58.3,5.7,50)
x = np.sort(x)
y = np.sort(y)
```
これをグラフ化したものが以下になります。
![スクリーンショット 2020-07-29 22.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/760cd767-4512-9896-e21b-bc6367fde4d7.png)  図1(横軸がx縦軸がy)


それでは本題に入ります。
相関係数の求め方は、

n個のデータセット

```math
(x_1, y_1),...,(x_n, y_n)
```
に対して、相関係数は以下の式で与えられます。

```math
\frac{\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})}{{\sigma_x}{\sigma_y}}
```
ここで、

```math
\bar{x}, \bar{y}
```
とは、それぞれの平均値です。

```math
\sigma_k
```
とはkに関する標準偏差です。
なぜ分子がこのような式に、分母では標準偏差で割るのかについて解説します。

まずは分子について解説します。
分母よりも分子の方が本質的です。
分子を１つ１つ丁寧に見ていきます。
まず気づくのが、それぞれのデータを平均で引いていることです。
これによって、xとyに関するグラフは平均で引いた分だけシフトします。
原点に

```math
(\bar{x}, \bar{y})
```
が来るようにシフトします。それは下の図で比較してみると分かると思います。

![スクリーンショット 2020-07-29 22.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/3b063b6f-843c-32ce-a5dc-3ac464d547d9.png)図2

![スクリーンショット 2020-07-29 22.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/fa08fe9b-9b85-991e-2a8c-d358d583e0a6.png)図3(原点に平均値が来るようにシフト)

次に気づくのが、
n個のデータセットそれぞれで、

```math
{x_i-\bar{x}}\times{y_i-\bar{y}} 
```
かけたものを足し合わせています。
上の掛け算が正になる時って、

```math
x_i, y_i
```
の符号が一致する時ですよね。
つまり、
正の実数と正の実数もしくは負の実数と負の実数をかけたら、正の実数になりますよね。
直感的に掛け算の結果が正のパターンが多ければ多いほど分子は正になりやすく、
掛け算の結果が負のパターンが多ければ多いほど分子は負になりやすそうですよね。
これを平均だけシフトしてやったグラフで考えてみます。

![スクリーンショット 2020-07-29 22.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/a677e71d-20f8-7b10-6fcf-0de270280d8e.png)

xとyの値の範囲の調整をしていないので、見づらいと思いますが、許してください。
赤の領域に存在する

```math
x_i\times{y_i}
```
は正になります。

反対に緑の領域に存在する

```math
x_i\times{y_i}
```
は負になります。
ちなみに分母の式を理解するにあたって、分子の式が内積で表現できることを知っておかないといけません。
xとyをそれぞれベクトル化すると、

```math
\vec{x} = (x_1, x_2, \cdots, x_n)\\
\vec{y} = (y_1, y_2, \cdots, y_n)

```
になります。そして、それぞれのベクトルの要素を平均で引いて、

```math
\vec{x'} = (x_1-\bar{x}, x_2-\bar{x}, \cdots, x_n-\bar{x})\\
\vec{y'} = (y_1-\bar{y}, y_2-\bar{y}, \cdots, y_n-\bar{y})

```
この２つのベクトルに対して、内積を施すと

```math
{\vec{x'}}\cdot{\vec{y'}}=\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})
```
これは分子の式と同じですよね。
内積って、1よりも大きくなることもあれば-1よりも大きくなることもあります。
使用しているデータが同じなのに、単位がmなのか、kmなのかでも内積の結果が変わってきます。mなのかkmなのかは正直どうでもいいことなのに、mを使用するとkmよりも内積の結果が大きくなってしまいます。
なんとかして、スケールを整える(正規化)できないかと考えたくなりませんか?
内積の定義を思い出すと、以下のように変形できるはずです。

```math
{\vec{x'}}\cdot{\vec{y'}}=|\vec{x'}||\vec{y'}|cos\theta
```

上の式を変形して、

```math
cos\theta=\frac{{\vec{x'}}\cdot{\vec{y'}}}{|\vec{x'}||\vec{y'}|}
```

```math
{\vec{x'}}\cdot{\vec{y'}}
```
を

```math
\frac{{\vec{x'}}\cdot{\vec{y'}}}{|\vec{x'}||\vec{y'}|}
```
に置き換えてやればこれは

```math
cos\theta
```
と等しいので、スケールを-1~1に変換してやることができました。
ところで、

```math
|\vec{x'}|, |\vec{y'}|
```

ってベクトルの大きさですよね。
なので、

```math
|\vec{x'}|=\sqrt{\sum_{i=1}^n (x_i-\bar{x})^2}
\\
|\vec{y'}|=\sqrt{\sum_{i=1}^n (y_i-\bar{y})^2}
```

これはそれぞれの標準偏差になっています。これが分母で標準偏差が登場する理由です。
分子を内積と捉えることで、分母ではたまたま標準偏差になっていたという解釈ができます。


<h2>終わりに</h2>
説明下手だなぁ。。。
wdayメソッドを使い指定した曜日を取得する方法

指定した日付の曜日を取得する方法について学んだのでまとめてみたいと思います。


例えば今日が何曜日かを設定したいとしてまずDateクラスtodayメソッドを使用して日付を取得します。

```ruby

require "date"
today = Date.today 
```

ここで注意しなければならないのがDateクラスを使う際にはrequireで呼び出さなければならないという点です。

次に日曜から土曜日までの配列を取得します。

```ruby

wdays =  ["日", "月", "火", "水", "木", "金", "土" ]
```

最後にwdayメソッドで配列から今日の日付の曜日を取得します。ここでなぜ配列を日曜日から順番に定義したかというと**wdayメソッドは曜日を0(日曜日)から6(土曜日)の整数で取得するからなんです。**

```ruby

puts wdays[today.wday] + '曜日'
火曜日
```

繰り返しになりますがwdayメソッドは整数で値を取得しているので[today.wday]（中身は本日の場合火曜日なので2）という番号で取り出す→つまり配列の中の2番目の要素である「火」が引き出されているということになります。
Railsにおける非同期通信

# 非同期通信(Ajax)とは
ブラウザが再読み込みされること無く通信が行われる通信方法です。
*ex.メッセージを投稿→画面をリロードしなくても反映される*

# JSONとは

データ交換を行うためのデータ記述形式の一種で、キーとバリューの組み合わせでデータを表現します。
AjaxでJSONという型でレスポンスが行われ、ブラウザではJavaScriptが動作しサーバからJSON形式で返されたデータをHTMLにつくりブラウザが書き換えられます。
これらにより、ブラウザの一部だけを更新することができるようになります◎


**ポイント**
①　JavaScriptのメソッドを利用してリクエストを送る。
②　コントローラでJSON形式のデータを用意するよう準備（コントローラーにアクション記述）
③　レスポンスするためのJSON形式のデータを準備（json.jbuilder）
④　JavaScriptでレスポンスを受け取り、HTMLを操作して追加

---



# 非同期通信の実装

**respond_toメソッドを使用します!**
リクエストが*HTML*か、*JSON*かを条件分岐してくれます


```
respond_to do |format|
  format.html { render ... } # HTMLリクエストのときにに呼ばれる
  format.json { render ... } # JSONリクエストのときに呼ばれる
end
```


- 以下のようにレスポンスできるようにhogesコントローラーに記述していきます
リクエストされたformatによって処理を分けます

```
def create
  @hoge = モデル名.create(hoge_params)
  respond_to do |format|
    format.html { redirect_to :root }
    format.json { render json: @hoge} #jsファイル側で作成した@hogeを使用するためにrenderメソッドを使用し、作成したhogeをjson形式で返すようにする
  end
end
```

- assets/javascripts配下にhoge.jsファイルを作成する


- 非同期通信でリクエストする



```
$(function() {
  $('.js-form').on('submit', function(e) {
    e.preventDefault();
    var hoge = $('.js-form__text-field').val();
    $.ajax({
      type: 'POST',
      url: '/hoges',
      data: {
        hoge: {
          content: hoge
        }
      },
      dataType: 'json'
    })
    .done(function(data) {
      var html = $('<li class="hoge">').append(data.content);
      $('.hoges').append(html);
      $('.js-form__text-field').val('');
    })
    .fail(function() {
      alert('error');
    });
  });
});
```

| オプション          |    詳細          |
|:-----------------|:-----------------|
| Type             | HTTP通信の種類を記述する。（GET、POST）|
| url           | リクエストを送信する先のURLを記述                 |
| data             |サーバに送信する値を記述する   |
| datatype             |   サーバから返されるデータの型を指定               |


# 挙動確認

htmlを生成するvar html = $('<li class="＊＊＊">').append(＊＊＊.content);という処理をメソッドにして切り出します。

```
$(function() {
  function buildHTML(hoge) {
    var html = $('<li class="hoge">').append(hoge.content);
    return html;
  }

  $('.js-form').on('submit', function(e) {
    e.preventDefault();
    var hoge = $('.js-form__text-field').val();
    $.ajax({
      type: 'POST',
      url: '/hoges',
      data: {
        hoge: {
          content: hoge
        }
      },
      dataType: 'json'
    })
    .done(function(data) {
      var html = buildHTML(data);
      $('.hoges').append(html);
      $('.js-form__text-field').val('');
    })
    .fail(function() {
      alert('error');
    });
  });
});
```



再度挙動確認して完了です！
RailsプロジェクトのRubyバージョンを変更する


# はじめに
Railsの既に作成済みのプロジェクトのRubyバージョンが誤っており、Rubyを再度インストールしたが途中エラーが発生したので、備忘録として残しておきます。

今回は、プロジェクトのバージョンを「2.6.3」→「2.5.3」にバージョン変更しました。
もし「間違っている」とか「もっと簡単にできる」とかあれば、ご指摘いただけますと助かります。:bow_tone1:

# 環境
- macOS Catalina 10.15.6（19G73）
- Rails 5.2.4.3
- Ruby 2.6.3 (※変更前)
- Ruby 2.5.3 (※変更後)

## Rubyのバージョンを確認する

```terminal:
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
```

バージョンが2.6.3であることを確認。

## Rubyをインストールする

```terminal:
$ rvm install 2.5.3
```

インストールが完了するまで待ちます。


## RVMのRubyバージョンを設定

```terminal:
rvm --default use 2.5.3
Using /home/ec2-user/.rvm/gems/ruby-2.5.3
```

RVMのデフォルトバージョンを2.5.3に変更しておきます。

## Railsサーバーを立ち上げてみる

```terminal:
$ rails s
Your Ruby version is 2.5.3, but your Gemfile specified 2.6.3
```

どうやら、「Rubyのバージョンは2.5.3やのにGemfileは2.6.3やぞ？」と言うてるみたいですね。
Gemfileのバージョンを合わせます。

## Gemfileを修正

```text:Gemfile
 source 'https://rubygems.org'
 -ruby '2.6.3'
 +ruby '2.5.3'
```

ファイル上部のRubyバージョンを書き換え。

## bundle installする
```terminal:
＄　bundle install
```

無事にインストールが完了すれば、再度動作確認をします。
「Rails s」」でサーバーが立ち上がればOK。

ちなみにダメな場合「Rails」と付くコマンドは全部アウトです。

## 最後に
思ったよりも簡単にバージョンを変更することができて、ちょっぴり驚き。
Railsのエラーは内容が分かりやすくて、ちょっと英語が分かる人ならだいたい解決できてしまうからスゴイ。

無事バージョンを変更できたので良かったですが、できれば初めからバージョンを確認してプロジェクトをスタートさせるに越したことはない笑
今後は気をつけていこう（戒め
Goのdepで既に指定済みのbranchと異なるbranchを参照させる方法

### 概要
Goのdepで既にインストール済の依存パッケージに関して、既に指定されているブランチとは別のブランチを参照させるようにする方法についてです。
例えば、既に`master`ブランチを参照する設定になっていたとして、一時的に開発中の`feature/sugoi`ブランチを参照させたい場合には以下のような手順で参照先のブランチを変えることができます。

### Gopkg.tomlで指定済のbranch名を変更する
Gopkg.tomlの該当パッケージのbranch名指定（`branch=xxxxx`）を変更する。

#### 変更前
仮にmasterブランチを参照している状態だとする。

```
[[constraint]]
  name = "github.com/hogehoge/fuga"
  branch = "master"
```

#### 変更前
`branch`の指定を、参照させたいブランチ（ここでは`feature/sugoi`）に変更する。
なお参照させたいブランチは、githubからダウンロード可能な状態（githubにpush済）である必要がある。

```
[[constraint]]
  name = "github.com/hogehoge/fuga"
  branch = "feature/sugoi"
```

### dep ensureを実行
Gopkg.tomlの記述内容を変更した状態で`dep ensure`を実行する。

```
dep ensure
```

これで、依存モジュールがGopkg.tomlで指定したブランチのものに更新される。

### 元に戻したいとき
Gopkg.tomlを元の内容に戻し、再度`dep ensure`を実行すればよい。