OmniAICreator/Qiita-1.07M huggingface dataset:
Vue3.0でChrome Vue.js devtoolsを有効にする

Vue.js 3.0が正式にリリースされましたね！

早速インストールしてvue-cliで動かして見ましたが、
あれ…Vue.js devtoolsが使えない…

「**Vue.js not detected**」と表示され、いつもの**Vue**のタブもない…
![スクリーンショット 2020-10-02 22.03.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/40e633bc-707b-9138-4283-4f0286eb609f.png)

# 環境

```
"core-js": "^3.6.5",
"vue": "^3.0.0-0",
"@vue/cli-service": "~4.5.0"
```

# 解決法
## 先に結論
①[**Vue.js devtools 6.0.0 beta2**](https://chrome.google.com/webstore/detail/vuejs-devtools/ljjemllljcmogpfapbkkighbhhppjdbg)をChromeに追加
②ベータ版を有効化する
③既存のdev toolsを無効化する

## 経緯
[**同じ悩みを持った人のIssue**](https://github.com/vuejs/vue-devtools/issues/1244#issuecomment-691544697)によると、
どうやら正式にリリースされているdevtoolsはまだVue3.0には対応していないみたいです。

![スクリーンショット 2020-10-02 21.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/2c1d7a74-d2f7-4d34-e682-51130548bae3.png)

「開発中だから次のリリースを待ってね」とのこと。

しかし下にスクロールしていくと解決法がありました！！！

## やり方
Issueを読み進めていくと、**ベータ版ならできたよ**と報告している人を発見。
![スクリーンショット 2020-10-02 21.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/c744075a-eab4-9138-a50e-ab58cb0f3b29.png)

### ベータ版を追加する
ベータ版の拡張機能ページは[**こちら**](https://chrome.google.com/webstore/detail/vuejs-devtools/ljjemllljcmogpfapbkkighbhhppjdbg)

![スクリーンショット 2020-10-02 21.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/7a76c205-4479-ef4a-0454-1a6bfb6432cb.png)

ロゴの右下にオレンジで「beta」と書かれています。
「Chromeに追加」を押します。

### 拡張機能一覧で確認する

拡張機能一覧を開くと既存のVue.js devtoolsと２個並んだ状態になりました。
左がver.6.0.0 beta 2、右がver.5.3.3
（右上のデベロッパーモードのトグルをONにするとバージョンが表示されます。）

![スクリーンショット 2020-10-02 21.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/51f815fd-5a65-b023-f70f-06c52f914cf7.png)

### ベータ版を有効にする

このままベータ版を有効化してもdevtoolsは使えなかったので、
既存のdevtoolsを無効化するのも忘れずに。

![スクリーンショット 2020-10-02 21.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/a3cbddda-b8cf-c7ed-91e1-fb0e02e6aa87.png)


![スクリーンショット 2020-10-02 21.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358307/3df8acaf-beef-ee53-75f5-d8082298dce8.png)

使えるようになりました！めでたしめでたし:smiley:
（ベータ版なのでご利用は自己責任でお願いします）
2020/10/2 テックキャンプ１２日目　アウトプット

#Railsで教本通り投稿アプリつくってみる
### ライブラリ導入
- ライブラリとは、複雑なプログラムを１つにまとめたもののこと
- RubyGemsとは、Rubyのライブラリの総称のこと　ガムじゃない
- Gemとは、RubyGemsの中のライブラリ一つ一つのこと 　マウスウォッシュではない
- Gemfileとは、アプリケーションで使用するGemのGem名とバージョンを記載し、管理するファイルのこと
- Gemfile.lockとは、bundle install済みのGemを記録するファイルのこと　　バンドル バンドラー

#####ページの新設の手順は、ルーティング→コントローラー→モデル→ビューが基本的な流れ

###投稿内容の表示
- CRUDとは、アプリケーションのデータ取り扱いに関して、基本的な処理の頭文字を並べたもののこと
- ７つのアクションとは、index, show, new, create, edit, update, destroyの、Railsにおける基本的なアクションの総称のこと
- resourcesメソッドとは、７つのアクションへのルーティングを自動生成するメソッドのこと

###投稿内容の保存
- ストロングパラメーターとは、指定したキーを持つパラメーターのみを受け取るようにするもののこと
- プライベートメソッドとは、クラス外から呼び出すことのできないメソッドのこと
- バリデーションとは、データを登録する際に、一定の制約をかけること
- セキュリティーを高める
Raspberry pi上で作成したdocker imageをwindows上のdockerで読みこんだらエラー "exec format error"が出た件

#1 この記事は

Raspberry pi上で生成させたdocker imageファイルをWindows上のdockerにてpullさせたら下記のエラーが出た時の対処法を説明します。

```console:
standard_init_linux.go:207: exec user process caused "exec format error"
```


#2 エラーの原因は？

Raspberry piのCPUは、ARM系ですが一方windows系のCPUは、X86系です。ARM系のCPUで生成したImageファイルをX86系のCPU上で動作するwindows上では、pullすることができません。


#3 対策は?

Windows上で動作するdocker上にて、[qemu-user-static](https://github.com/multiarch/qemu-user-static)をインストールすれば、ARM系(Raspberry Pi)のCPUで生成したImageをX86系(Windows)のDocker上でpullすることが可能になります。

```console:Example
$ uname -m //使用しているPCのCPUの種類を表示する
x86_64

//ARM系のCPUで作成したImageをX86系のCPUでも動作するようにする
$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
```
Karabiner-Elements Alert を消すための許可ボタンが出てこなくなった時の復旧方法

Macの再起動をしたときに Karabiner-Elements Alert が表示されアプリの案内通り進めようとするが、許可ボタンが表示されない状態に陥ってしまった場合の復旧方法です。

## Karabiner-Elements Alert を消す許可ボタンが表示されない

![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318777/3dcbeac4-4577-614c-a6e8-7ebeb56b1e51.png)

こんな感じのモーダルが表示されます。案内に従って「セキュリティとプライバシー」を表示するが...

![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318777/33f46d2f-d833-6e57-a72c-d55f5fab04eb.png)

ブロックされているアプリを許可するためのボタンが表示されない。困った。

## 解決策

一度Macの電源を落としてから⌘+Rでリカバリーモードで起動して、ターミナルから開発者許可コマンドを実行する


```
# リカバリーモード > ターミナル
spctl kext-consent add G43BCU2T37
```

Karabiner-ElementsのIssueの中に解決策があった
https://github.com/pqrs-org/Karabiner-Elements/issues/1785
> I got Karabiner-Elements working again by adding the team identifier G43BCU2T37. (Thanks @begatsby for the hint. See #1800.) At first, spctl wouldn't save the new configurations. So I started my mac in recovery mode, opened the terminal and added the team identifier in recovery mode with spctl kext-consent add G43BCU2T37. Maybe it helps you, @Popl7?

## その他参考ページ

- https://qiita.com/bigpink/items/433874b735ee5bc780be
スプレッドシートが特定の範囲で編集されたときにログを出す

#前提
スプレッドシート編集時に発火するトリガーをセットしておくこと
```

const notice = () => {
  const user_email = Session.getActiveUser().getEmail();
  Logger.log(user_email);
  
  const Sheet = SpreadsheetApp.getActive();
  const Range = Sheet.getActiveCell();
  const cell_row = Range.getRow();
  const cell_column = Range.getColumn();
  const cell_value = Range.getValue();
  
  if((3 <= cell_row && cell_row　<= 9) && (4 <= cell_column && cell_column <= 8)　&&(cell_value === '●')){
 Logger.log('did it');
  }
}

```

https://developers.google.com/apps-script/reference/base/session#getActiveUser()

onEdit で宣言するとSessionクラスが使えない模様。

参考にしてください。
【Python】メモ　関数について



**split 関数**
数字、アルファベットや記号などが入り混じった文字列を切り分けてリスト化する

```python
test = orange,apple,banana,strawberry
URL  = https://aaaa/bbbb/cccc/dddd

# test というリストを ” , ” で区切る 
#  ※多分使用している記号を指定するのだと思われる。
test.split(",") 
['orange', 'apple', 'banana', 'strawberry']

URL.split("/")
['https:', 'aaaa', 'bbbb', 'cccc', 'dddd']


# 引数に何も指定しない場合、スペースやタブ等で自動的に区切る
test.split()
['orange', 'apple', 'banana', 'strawberry']
```

**input 関数**
標準入力（用意されたデータ）を受け取るための関数

```python
# 単発の場合
aaa = input()

# 複数行の場合
# ※改行してある入力データの場合は，下記のままだと \n が入っちゃうので注意
import sys
a = sys.stdin.readlines():
```


**randrange 関数**
range()の要素（下記ではリスト内）からランダムに要素を選出

```python
import random
line = input().rstrip()
list = line.split(",")
# ["A", "B", "C"]

num = len(list)

# randrange(start, stop, step)と記載するらしいけど，start, stepは省略できる
print(list[random.randrange(num)])
```


**translate, maketrans 関数**
複数の文字を指定して置換する

```python
t = str.translate(str.maketrans("ABCDEF", "123456"))
※置換対象先をNoneに指定すると置換元が削除される
```


**abs関数**
絶対値に変換する

```python
c = [-1, 3, -5]
a = abs(c)
print(a)

>>> [1, 3, 5]
```


**map関数**
文字列のリストを数値リストの変える関数

```python
str_list = ["1", "-3", "-4.5"]
list = map(float, num_str_list)
print(list)

>>> [1.0, -0.3, -4.5]
```


**count関数**
特定の文字をカウントする

```python
a = "hello world"
print(a.count("h"))

>>> 1
```


**zfill関数**
数値を右寄せゼロ埋めする

```python
line = 7
total = line.zfill(3)
#（）カッコ内の数値桁数文0埋めする
print(total)

>>> 007
```




随時学んだことを更新します。
EF Core でマイグレーションを実行する際に発生しうるエラーとその対処法

EF Core でマイグレーションを実行する際、各種実装後にパッケージマネージャーコンソールで以下のコマンドを実行します。

```
Add-Migration InitialCreate
```

コマンド実行時に色々エラーが出てハマったので、本記事では出たエラーと対処法についてそれぞれまとめます。

# Build failed.

ソリューションのビルドに失敗すると起きる事象です。
解決方法としては、ソリューションのビルドが成功するように修正してください。

# No DbContext was found in assembly 'プロジェクト名'.

エラー文の詳細は下記です。

```
No DbContext was found in assembly 'プロジェクト名'. Ensure that you're using the correct assembly and that the type is neither abstract nor generic.
```

DBContext を定義していないプロジェクトでマイグレーションコマンドを実行しようとすると起きる事象です。
解決方法としては、DBContext を定義しているプロジェクトでマイグレーションコマンドを実行するようにしてください。

# Your startup project 'プロジェクト名' doesn't reference Microsoft.EntityFrameworkCore.Design.

エラー文の詳細は下記です。

```
Your startup project 'プロジェクト名' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.
```

Microsoft.EntityFrameworkCore.Design がインストールされていないと起きる事象です。
解決方法としては、NuGet パッケージマネージャーで Microsoft.EntityFrameworkCore.Tools をインストールしてください。
Tools の中に Design も含まれています。

# Startup project 'プロジェクト名' targets framework '.NETStandard'.

エラー文の詳細は下記です。

```
Startup project 'プロジェクト名' targets framework '.NETStandard'. There is no runtime associated with this framework, and projects targeting it cannot be executed directly. To use the Entity Framework Core Package Manager Console Tools with this project, add an executable project targeting .NET Framework or .NET Core that references this project, and set it as the startup project; or, update this project to cross-target .NET Framework or .NET Core. For more information on using the EF Core Tools with .NET Standard projects, see https://go.microsoft.com/fwlink/?linkid=2034705
```

csproj ファイルの TargetFramework が.NET Framework もしくは.NET Core になっていないと起きる事象です。
解決方法としては、.NET Framework もしくは.NET Core に設定されているか見直しましょう。

```
<TargetFramework>netcoreapp3.1</TargetFramework>
```

# まとめ

EF Core のマイグレーションはコマンドを実行するだけで簡単に実現できるので便利ですが、結構ハマりどころもあります。

他にも以下のサイトで事例が紹介されていましたので、参照してみてください。

[.NET Core で DB マイグレーションを試したら色々ハマった話 - ecbeing labs（イーシービーイング・ラボ）](https://blog.ecbeing.tech/entry/2019/06/12/125411)
Atom上からPythonを実行するとカレントディレクトリが移動してしまう問題の対処法

Atomのパッケージの一つ、atom-runnerを使うとAtom上でPythonが実行できる。ただ、実行時のカレントディレクトリがプロジェクトフォルダになってしまうので、開いているフォルダによってカレントディレクトリが変わってしまう。この挙動は単純に相対パスを利用したいときなどは少々面倒だ。

## 対策法
カレントディレクトリをファイルが存在するディレクトリに揃える。

```python
import sys
import os
os.chdir(os.path.dirname(sys.argv[0]))
```


他ファイルから読み込まれる可能性のない、書き捨てのスクリプトならこれで十分かなと。
Windows10のPCでZoom学会タイマー

# やりたいこと

Windows10のPCでZoomを立ち上げて学会タイマー専用にする。ビデオで映す映像の代わりに経過時刻を表示して、定刻になったらベルの音をZoomミーティングでならしたい。しかし、このPCは音が鳴って欲しくないし、マイクで音を拾って欲しくない。

# インストールするソフトウェア

1. [Time Keeper](https://ichiro-maruta.blogspot.com/2011/09/html5.html): タイマー
2. [Voicemeeter Banana](https://vb-audio.com/Voicemeeter/banana.htm): ミキサー
3. [OBS Studio (64bit)](https://obsproject.com/download): live streaming
    1. [OBS Virtualcam](https://obsproject.com/forum/resources/obs-virtualcam.949/)
4. [Zoom](https://zoom.us/)

# 手順
1. Voicemeeter Banana を起動する．前回の設定のままになっているはずである．初回は以下を設定する．
    1. VIRTUAL INPUTS の Voicemeeter VAIO の出力を B1 にして音量を調節する
    2. MASTER SECTION の B1 の音量を調節する
    3. 残りは Mute にする
![スクリーンショット 2020-10-06 130625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/72dbb739-19ce-344b-4b40-24bab28a2f21.png)

2. サウンドの出力の出力デバイスを「VoiceMeeter Input (VR-Audio VoiceMeeter V...)」にする
![スクリーンショット 2020-10-06 130659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/7c1e5f23-f2a8-fadb-dffe-b61f08a35f5e.png)

3. Time Keeperを起動する
![スクリーンショット 2020-10-06 130938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/4a751c85-cd22-b608-581f-6c3e4278ccb8.png)

3. OBS Studio (64bit) を起動する
    1. ソースの「+」をクリックしてウィンドウキャプチャを作成する(初回だけ)
    ![スクリーンショット 2020-10-06 130826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/e9ac8acb-f549-a2dd-ee24-c477e7f60f76.png)
    ![スクリーンショット 2020-10-06 130811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/488d3fd4-3702-6de4-79c0-a12ad2e3424d.png)
    2. 「ウィンドウキャプ」をダブルクリックして Time Keeper をキャプチャする
    ![スクリーンショット 2020-10-06 131006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/eff9cb44-7c8c-5de3-fea5-a46757905aa4.png)
    3. ~~ツール＞VirtualCam, Buffered Framesを0, Startをクリック~~ 仮想カメラ開始をクリック

4. Zoom
    1. 設定＞ビデオ＞OBS-Camera
    ![スクリーンショット 2020-10-06 131213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/a3a57f79-d8e1-b3be-8316-ddf099e2fe9b.png)
    2. 設定＞オーディオ＞マイク＞VoiceMeeter Output(VB-Audio VAI...
    ![スクリーンショット 2020-10-06 131234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/87d58fee-a95c-66cc-d0c7-9b0671196a6b.png)
    3. ミュートを解除，ビデオの開始

# 参考にしたページ
- https://www.cowbell.jp/archives/5699
- https://note.com/5man_denier/n/nc57f9d1cbfba (MacOSX)
herokuでMySQL5.7以降を使うためにClearDBからJawsDBに変更する

## DBを変更した動機
Rails製のアプリをherokuにデプロイしmigrationした際、以下のようなエラーに遭遇しました

```
Mysql2::Error: Specified key was too long; max key length is 767 bytes 
```

これはDBのcharsetがutf8mb4であったことが原因です
utf8mb4は1文字が4バイトなので

varchar(255)を扱う場合、255 * 4バイト = 1020バイトとなり767バイトを超えてしまいます

そのためインデックスキーを貼れずにエラーになってしまいます。

調べているといろいろな手段がありました

## 色々な解決方法

### 1. utf8mb4からutf8に変更する
utf8は1文字が3バイトなので
255 * 3バイトでMAXが765バイトになるので納まるのですが、MySQL5.5のutf8では絵文字を扱うことができません
絵文字を扱いたかったのでこれではダメです

### 2. varcharの最大長を765バイト以下になるようにする
x * 4 > 765 でMAXで191文字まで大丈夫だということがわかります

```ruby
t.string   :awesome_string_column, limit: 191 
```
しかし、DB都合でアプリケーションに制約を持たせるは嫌なのでダメです


### 3. DBのフォーマットを変更する
MySQLの設定ファイルである`my.cnf`でファイルフォーマットの設定を変更すれば3072バイトまで拡張されるようです

```
innodb_file_format=Barracuda  
```

しかしherokuのclearDBでは`my.cnf`がいじれない(多分)ので不可能でした

### 4. MySQLのversionを上げる
デフォルトで`verison: '5.5.62'`であるClearDBのMySQLバージョンをあげてあげたら解決しそう

```
heroku addons:create cleardb:ignite --name=my-db-name --version=5.7
```

しかしherokuのフリープラン`ignite`では上げることができない模様... 
困りました


## 採用した解決方法

JawsDBというClearDBとほぼ変わりがない(らしい)MySQLデータベースを採用することにしました(無料)

>JawsDB users can choose their database version at provision time by specifying a --version flag. Versions 5.7 and 8.0 are currently supported. If no version flag is supplied, the default database version will be used. The current default database version is 5.7

デフォルトが5.7で8.0まで行けるんですね

アドオンを追加します
デフォルトのバージョンが5.7ですが念のため明記しておきます

```
heroku addons:create jawsdb:kitefin --name=my-db-name --version=5.7
```

JawsDBの情報を見ます

```
$ heroku config | grep JAWSDB_URL
> JAWSDB_URL: mysql://<username>:<password>@<host>/<databse>
```

接続情報が見られるのでドライバを変更してあげます

```
heroku config:set DATABASE_URL='mysql2://<username>:<password>@<host>/<database>?reconnect=true'
```

その後マイグレーションするとエラーを出さずに実行できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/f42bba4d-7d2d-878e-0783-bce769970710.png)

ジョーズの背びれが可愛いですね🦈
C#とさくらのレンタルサーバーのMySQLをつなぐDB

# C# + さくらのレンタルサーバー  + MySQLをつなぐ
## 参考画像

![s1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340870/2041acdf-9409-093e-c85e-7f44afec1381.png)
## とりあえずコード
```C#
public static string getDB()
        {
            // さくらのホスト名
            string host = "iiiiii.sakura.ne.jp";
            // さくらユーザー名
            string user = "iiiiii";
            // パスワード
            string Spassword = "password"; 


            // SSH接続
            var sshClient = new SshClient(host, 22, user, Spassword);
            sshClient.Connect();

            uint dbPort = 3306;
            uint localPort = 3306;
            //データベースのデータベースの名前とユーザー名
            string dbname = "DBname";
            string dbuser = "DBuser";
            string dbpassword = "Dpassword" ;
            //mysql0000.dbのやつ
            string serverName = "mysql1018.db.sakura.ne.jp";

            //サーバーフォワーディング
            var sshForward = new ForwardedPortLocal("127.0.0.1", localPort, serverName, dbPort);
            sshClient.AddForwardedPort(sshForward);
            sshForward.Start();

            var connectStr = "server=" + "127.0.0.1" + ";";
            connectStr += "port=" + dbport + ";";
            connectStr += "user=" + DBuser + ";";
            connectStr += "password=" + Dpassword + ";";
            connectStr += "database=" + dbname + ";";
            connectStr += "Pooling = False";

            string table = "testtb";

            //ここにSQL文を書く
            var sql = "SELECT * FROM " + table;

            string res = null;

            //MySQLサーバー接続
            using (var connection = new MySqlConnection(connectStr))
            using (var com = new MySqlCommand(sql, connection))
            {
                connection.Open();

                var selectCmd = new MySqlCommand(sql, connection);

                // 実行
                MySqlDataReader selectResult = selectCmd.ExecuteReader();

                // MySqlDataReaderというクラスに結果が入っている
                // Read()を呼ぶことで次の行にアクセスする

                while (selectResult.Read())
                {
                    var name = selectResult.GetString("name");  // フィールド名でのアクセス
                    string data = selectResult.GetString(1);  // カラムインデックスでのアクセス
                    if(name != "")
                    {
                        //ここでいい感じに処理
                        res += String.Format("{0}${1}\n", name, data);
                    }
                }

                // 結果を閉じる
                selectResult.Close();
                connection.Close();
                sshForward.Stop();
                sshClient.Disconnect();
                return res;
            }
        }
```

となる。頑張ろう

## 参考URL
ほぼこちらの内容です
https://qiita.com/skuromaku/items/67e46962228fe3cc6d7c

まずはこちらを参考にTeratermで接続したほうがよいかも
https://www.out48.com/archives/2495/

https://developer.aiming-inc.com/programming/connect-mysql-and-ssh-for-csharp/
RedmineのREST APIで100件以上のデータを取得する

「RedmineのREST APIで100件以上のデータを取得する」というのを、View Customize Pluginを使ってやってみました。

```javascript
/*
パスのパターン:/issues
挿入位置:全ページのヘッダ
種別:JavaScript
*/

let resultPromisesid = [];
let issueslist = [];
$(function() {
    const apiKey = ViewCustomize.context.user.apiKey;
    if (ViewCustomize.context.project) { //特定のプロジェクト
        project_id = ViewCustomize.context.project.identifier;
        url_pageno = '' + '/issues.json' + '?project_id=' + project_id + '&status_id=*';
    } else { //すべてのプロジェクト
        project_id = "";
        url_pageno = '' + '/issues.json' + '?status_id=*';
    }

    getissueitemList().done(function() {
        console.log(issueslist);
    })
})

//すべてのチケットリストを取得
function getissueitemList() {
    issueslist = [];
    resultPromisesid = [];
    const deferred = new $.Deferred();
    $.when(
        getpageno(url_pageno)
    ).done(function(data) {
        data = JSON.parse(data);
        const page_no = Math.ceil(data.total_count / 100); //ページ数
        for (let i = 1; i <= page_no; i++) {
            if (project_id !== "") {
                url_getissue = '' + '/issues.json' + '?project_id=' + project_id + '&status_id=*&page=' + i + '&limit=100';
            } else {
                url_getissue = '' + '/issues.json' + '?status_id=*&page=' + i + '&limit=100';
            }
            resultPromisesid.push(getallissue(url_getissue));
        }
        //取得したチケットデータから情報を取得
        Promise.all(resultPromisesid).then(function(results) {
            results.forEach(function(result) {
                issues = result.issues;
                for (let j = 0; j < issues.length; j++) {
                    issueid = issues[j].id;
                    subject = issues[j].subject;
                    status_name = issues[j].status.name;
                    issueslist.push({
                        issueid: issueid,
                        subject: subject,
                        status_name: status_name
                    });
                }
            })
            deferred.resolve();
        })
    });
    return deferred;
}

//総チケット数を取得してページ数を計算
function getpageno(url_pageno) {
    const deferred = new $.Deferred();
    return $.ajax({
        type: "GET",
        url: url_pageno,
        headers: {
            'X-Redmine-API-Key': apiKey
        },
        dataType: "text",
        contentType: 'application/json',
    }).done(function() {
        deferred.resolve();
    })
    return deferred;
}

//すべてのチケットをページ（100件）ごとに取得
const getallissue = function(url_getissue) {
    return new Promise(function(resolve) {
        $.ajax({
            type: "GET",
            url: url_getissue,
            headers: {
                'X-Redmine-API-Key': apiKey
            },
            dataType: "text",
            contentType: 'application/json',
        }).done(function(data) {
            resolve(JSON.parse(data));
        })
    })
}

```
GitHub Discussions (Beta)を使ってみた

閉じるタイミングに困ったり閉じる事ができない Issue ってありますよね？質問や提案などバグ報告ではないものです（参考 [Github issue で質問してはいけない](https://qiita.com/methane/items/78a90c6efb1a7c4da57d)）。質問は回答したら閉じればいいじゃないかと思うかもしれませんが、閉じてしまったら他の人が探し辛くなりますしもう終わった話なんだと思われてしまいます。何度も同じ質問されても困るのでナレッジベースとして閉じずにためて起きたいわけです。その結果閉じれない Issue が残り続けてしまいます。ラベルである程度対応できるとは言え管理が面倒なことに変わりはありません。

ということで、それを解決する機能が GitHub Discussions です（参考 有効化されてるリポジトリ例 [vercel](https://github.com/vercel/vercel/discussions)）。現在は限定パブリックベータ版ということで、一部の選ばれたリポジトリのみしか使用できないと思いきや、簡単な条件を満たしていれば使えるようなので申し込んでみました。

なお現在はベータ版の状態なのでここに書いた内容は将来変わる可能性が高いですし機能にはバグがあるかもしれないので注意してください。[ロードマップ](https://github.com/github/roadmap/projects/1)によると正式公開は 2020 Q4 (10月～12月）とのことです。

## 申込方法

申し込みはここ（[Can one apply for GitHub Discussions Beta?](https://github.community/t/can-one-apply-for-github-discussions-beta/121120)）からしました。申込ページではなく誰かが GitHub サポートに作成したトピック（でいいのかな？）が半ば公式化されてるようです。検索したらすぐ見つかりますし、ここで申し込むことに対して特に問題視している感じもないので紹介します。（が状況は変わるかもしれませんので最新の書き込みをちゃんと読むようにしてください。）

ベータ版の利用条件は（現時点では）3人以上の Contributors がいるパブリック（公開）リポジトリです。非公開のリポジトリでは使えません。人数が足りなくて却下された場合でも「追加したぜ！」って書いて OK なぐらいゆるいです。組織全体ではなくリポジトリ単位の申込みで組織毎に最大2つのリポジトリまでという制限もあるようです。申込時にフィードバックの連絡先となるユーザーを一人指定する必要がありますが、通常は申込者でよいでしょう。Discussions の機能を有効にするためにリポジトリの管理者の権限が必要です。申し込むと数時間～数日以内にスタッフから手続きをしたよとトピックにコメントがつき、その次の日ぐらいには使えているはずです。まあ一連の流れはトピックを見ればわかるかと

Discussions 機能が有効になると連絡先に指定した人に GitHub Discussions フィードバックリポジトリへの参加の招待が届きますので参加しましょう。GitHub Discussions の最新情報を得られたりフィードバックを返せるようになります。また今は全員有効化されましたが、私が登録した直後はカテゴリの機能は無効になっており、フィードバックリポジトリでさらに申し込みが必要でした。これからも追加で申し込みが必要な機能がでてくるかもしれないのでフィードバックリポジトリ の Discussions を眺めてみましょう。

## 設定方法

特に難しいところはないと思いますが少しだけ説明します。Discussions 機能が有効になってもすぐに画面が変わるわけではなく、有効になったリポジトリの Settings から Discussions 機能を表示する必要があります。表示するにチェックを入れるとプロジェクトの上部に Discussions のタブが増えます。最初に「Welcome ～」のディスカッションを作るような画面になるので、そのまま or 適当に内容を修正して作成しましょう。もちろん内容は後から変更できます。カテゴリの追加・削除・編集はカテゴリ一覧ページの左、カテゴリの「Browse」の鉛筆マークから行えます。

## 機能について

（有効化されてるリポジトリを眺めてみれば大体わかると思いますが・・・）

ディスカッションは Issue とは違いスレッド形式を採用しており、それぞれのコメントへコメントができるので話の流れを後から追いやすくなります。

主に質問タイプのようなディスカッションに使うと思いますが、質問に回答したらそのコメントを「Answer」としてマークする事ができます。ディスカッションの検索では回答の有無で絞り込むこともできます。

最大3つのディスカッションを上部に置いて目立たせる事ができる「Spotlight discussion」という機能があります。Issue にある「Pin Issue」の Discussions 版です

既存の Issue から ディスカッションへ変換する事ができます。（Issue のページの右下に「Convert to discussion」のリンクがあります）。これで既存の Issue や Issue として建てられてしまったけどこれディスカッションだなみたいなものを閉じる代わりに変換する事ができます。ただしラベルなど一部の情報は消えるので注意してください。

ディスカッションから Issue への変換はありませんが、ディスカッションの内容を元に（編集を加えつつ）新しい Issue を作成する事ができます。ディスカッションを行ってる中でこれは対応する必要があるなみたな時に使うのを想定しているのだと思います。この機能はディスカッションのそれぞれのコメントの右上にある「・・・」の中の「Reference in new issue」から実行できます。

## 所感

外部の本格的なサービスに比べたらそれほど多機能というわけではないと思いますが、ニーズが多いと思われる機能をシンプルにまとめてあり Issue をごちゃごちゃになるのを防ぐには十分だと思います。Issue じゃないだろこれって思うものは Close せずにディスカッションに移動してしまえば Issue はクリーンなままです（笑）

まだ積極的に開発中なので、これから公開までに機能が大きく変更、追加される可能性があると思います。個人的には投票機能が実装されれば嬉しいですね（優先して実装して欲しい機能を聞いたりしたいので）。
ld: framework not found Crashlytics の 対処法

## まえおき
Crashlytics のサポートが `2020/11/15` までということで、慌てて `Firebase Crashlytics` への更新作業に追われて実施したところちょっと詰まったので共有しておく

## 何が問題か

[移行手順](https://firebase.google.com/docs/crashlytics/upgrade-sdk?platform=ios)を参考に、一通り作業を行い最後にビルドをしたのですが、下記のエラーが発生

```
ld: framework not found Crashlytics
```

## 対処法
まずは下記順に `Other Linker Flags` の設定を確認する

```
TARGET - Build Settings - Other Linker Flags
```

1. `Crashlytics` が残っていれば `FirebaseCrashlytics` に書き換える
2. `Fabric` が残っていれば削除し、次の行の `-framework` も削除する

これで解消できるはず

## 参考

https://stackoverflow.com/questions/32068079/ld-framework-not-found-crashlytics
並びの不明な２つの配列をできるだけすっきりと一致確認する（Java）


# 並びが不明な配列同士の一致確認って結構ある

　DBから取得した配列って、並びが定まらないことが良くあります。
　そんな配列の一致確認をできるだけ少ないコードで表現できないか考えてみました。
　すっきりやりたいんだから、以下のような状況のはず
#### Stream.sorted() でソートが可能な型であること
　Stringとか、Integerなど、単純な型なら `Stream.sorted()` でソートできますね。
　ただし、この限りではないです。
　また、Comparator を定義すれば問題ないです。
#### null が含まれていないことが検証済み
　NullPointerException でます。
#### 一致、不一致のみを得る
　ここは言わずもがな

# ソースコード
```Java:Sample.java
public boolean isEqualsList(List<?> a, List<?> b){
    return Arrays.equals(a.stream().sorted().toArray(), b.stream().sorted().toArray());
}
```

# おまけ
Comparator を定義した場合でも、ぎりぎりすっきりと言えそうです。

```Java:Sample.java
public boolean isEqualsList(Comparator comp, List<?> a, List<?> b){
    return Arrays.equals(a.stream().sorted(comp).toArray(), b.stream().sorted(comp).toArray());
}
```

# あとがき
1文で書けました。
toArray() が Object[] である点はいやらしいですが、一致確認のみなので、問題ないですね。
怒り駆動開発

Anger Driven Development と誰かが言ったそうです。

## なぜ怒りを感じるのか？

開発を行っている場合で感じる怒りの多くは理想とのギャップに起因すると思っています。

- 既存コードがクソすぎる！！
- なんでこんな手順を踏む必要があるのか？
- などなど...

理想とのギャップを感じているので、これらは以下のように (比較的具体的な) 理想が見えています。

- こんな風に書けば直しやすかったのに!
- こんな手順になっていれば自動化できるのに!

怒りを感じている私たちは、理想的な状態が何であるかを知っています。
そこに手が届かないもどかしさから怒りを感じているのです。

あなたは怒りを感じて不快な思いをしているかもしれませんが、その目は確かに理想を捉えて希望で満ちています。

## 怒りに向き合う

怒りを自覚した時点で怒りの原因がおぼろげであることもあります。
まずは怒りに向き合い整理していきましょう。

1. 怒りの原因はなにか？
2. 怒りが解消されている状態はどんな状態か？

例えば

1. 既存コードに自動テストがないから新しい実装やそれの動作確認にすごい時間がかかる
2. 自動テストが整備され、本質的な検証に集中ができる

必要ならもう少し掘り下げてみましょう。

- どれくらい時間がかかるの？
- どの作業に時間がかかっているの？
- 本質的な検証ってなに？
- 本質的な検証ができないと何がダメなの？

考えれば考えるほど、当然であるはずの理想との遠さを痛感して、あなたの怒りはどんどん大きく具体的になっていくはずです。

## 少し怒りを放出する

どうなればいいかが見えているのだから少しやってみましょう。
ちょっとだけでいいです。
例えば、まさに今向き合っているメソッドに自動テストを書いてやればいいです。
その過程で、いままで放置された理由を知るかもしれません。

もしかしたら怒りが萎えそうになるかもしれませんが、自分の怒りに自信を持ってください。
その程度で消える怒りではないはずです。
途中で方針を見失うかもしれませんが、方法を探してください。怒りのエネルギーに満ちたあなたならできるはずです。

怒りに任せてやり切ってください。

やり切ったあとは、なんとなくやってやった感があって、ほんの少し気持ちが落ち着いたんじゃないですか？
もちろん、こんなもので満足はできないと思いますが、いいタイミングなのでもう一度怒りに向き合ってみましょう。

その怒りすべてを解消するまでに必要なステップがより鮮明に見えると思います。

- テストを書くにはあまりにもモジュール同士が密結合すぎるな
- そもそもテストが維持できるのか？CIサーバが必要じゃないか？

## 怒りを告白する

怒りに任せて勝手にコード改変してしまうのはあまり褒められた行為ではないです。
関係する人にはちゃんと相談しましょう。

きっと多くの場合は受け入れてもらえます。
あなたが感じている怒りはきっとほかの人も感じています。

以下を伝えましょう

- 私が何に怒っているか
- どうすれば私の怒りが収まるのか
- 怒りを一部収めるために何をやってみたか
- 私の怒りを収めるためにはあと、何をする必要があるか

これを伝えるのは簡単です。
ここまであなたがやってきたこと、感じたことがすべてです。

運が良ければ同じ怒りを持つ同士が生まれてあなたを助けてくれるかもしれません。

いやいや、そんなものでは生ぬるいと、さらにあなたを満足させるプランが生まれるかもしれません。

とにかく、素直に怒りを告白しましょう。

## 怒りを開発へ向ける

ここまでで、あなたが怒りを開発へ向ける準備は整っています。
ゴールは明確。踏むべきステップもわかっている。あなたには開発をするエネルギーが満ち溢れている。

あとは進むだけです。
きっと困難もたくさんあるでしょうし、これまで多くの人がしてきたように諦めてしまいそうになるかもしれません。
あなたの持った怒りの大きさに自信を持ってください。
あなた以上の怒りを持った人はこれまでにいないはずです。

怒りに身を任せすぎて、ステップを間違えないようにしましょう。
正しく順番に理想へのステップを踏んでいれば、途中で息が切れても必ず恩恵を得られるはずです。

## 次の怒りへ

怒りに任せて、ゴールできたかもしれません。
もしくはステップの途中で満足できたかもしれません。
とにかくあなたの怒りは収まりました！

満足げにあなたの理想の世界を見渡してみてください。
きっとあなたは新しい怒りに満ちていると思います。

あなたがここまで来るために蓄積した努力や知識によって、新しい理想が目の前に現れたのです。
決して、『まぁ、前よりはマシだしいいか。』なんて言わないでください。
あなたの怒りにウソをつかないでください。

大げさにオフィスチェアに深く座りなおして、大きな舌打ちを鳴らして、頭を掻きむしりながら、また新しい怒りに身を任せましょう。

怒りを感じる源には、これまでの経験・努力・知識に裏付けられた、手の届きそうな理想があります。
我々の目の前にしているソフトウェア・サービスのユーザたちに、その理想を提供できない無念さがあります。

我々が勤勉であり続ける限り怒りがなくなることはありません。

その怒りはあなたに新しい景色を見せてくれるはずです。

## おわりに

どう頑張ってもクソっていう環境は存在するからそういう時は無理しちゃだめだよ。
非コンテナ環境のオンプレからFargateへのAPI移行時に発生したログ問題

この記事では、オンプレの非コンテナ環境で動くAPIをコンテナ環境(AWS Fargate)に移した時にやったこと、学んだことをログ周りに絞って書きます。

この記事から分かること

- コンテナ環境と非コンテナ環境でログをはじめとするデータの取り扱い方の違い
- Fargateで動作するコンテナからのログをFireLens, fluent-bitで取得する設定

環境はNginx＋Flask＋uWSGIで、uWSGI・fluent-bit・Nginxのコンテナをサイドカー構成でFargateで動かしています。

## コンテナのステートレス性を担保しよう
非コンテナ環境とコンテナ環境では多くの面で、勝手がかなり異なります。

コンテナ開発では、**コンテナのステートレス性** `コンテナは何らかの形の永続データ(状態)を内部に保持しないという性質` を常に担保しなければなりません。
これを担保してあげることで、データを損失する心配がなくなり頻繁にいつでもデプロイを行うことができるようになります。

これはコンテナの大きな利点の一つなので、是非担保したいところ。

このステートレス性を担保するには、非コンテナ環境のオンプレからコンテナ環境に移す時、それまで通りログファイルにログを出力していてはまずいということになります。

## オンプレとコンテナの、ログに関する違い

まず、ログについてオンプレとコンテナでの違いについて整理します。

### オンプレ

- ログはファイルに出力
- ログを一定の期間（数十日単位）サーバ内に保持
- 一定の期間が過ぎた後はログを削除、もしくは別の場所に移す

### コンテナ

- ログは標準出力、標準エラー出力に出力して他サービスを使用して外部ストレージにログファイルを保存
- ログファイルをはじめ一切の永続データをコンテナ内部に残さない

ログの管理方針はあるかと思いますが、上記で大きく外れてはいないかと思います。

### よくあるエラー

開発段階でオンプレで動いていたAPIをそのままFargateに移行してロングラン検証などを行うと、例えばNginxのアクセスログファイルが肥大化してすぐに容量不足で書き込みできないエラーが発生します。

```
write() to "/var/log/nginx/api_access.log" failed (28: No space left on device) while logging request
```

これはおそらくコンテナではデータを外部に出力するのが基本なため、AWS側もあえてFargateに大きなストレージを用意していないのだと思います。

fluentdなどを使ってログをS3など外部データストレージに送っていると思いますが、リリースのタイミングでfluentdのバッファに存在していたログは消えてしまうはずなので、ファイルに出力→fluentdでS3に送信というやり方では問題が起きます。

## Fargate上のコンテナが標準出力に出すログをFireLens、fluent-bitを使って集める

ここまでで、ログ周りに関するオンプレとコンテナの違い、オンプレのログ出力の方法を変える必要性があることがわかったと思います。

そこで、ログをファイルに出すのではなく標準出力に出すことになるのですが、

Nginxのアクセスログとエラーログを標準出力と標準エラー出力に出すとして、uWSGIのログもそこに出したいけどごっちゃにならないのかな


と思っていましたが、FireLensとfluent-bitを使用して、

- どのコンテナからのログであるか
- stdout, stderrどちらのエラーなのか

というのが分かる形でログを取得できます。fluent-bitの設定についての詳しい記事は終わりの方に載せてあります。

### uWSGIのログについて
uWSGIでは安易に`logto: /dev/stdout`を設定すると

`uwsgi_check_logrotate()/lseek(): Illegal seek [core/logging.c line 494]`

というログで一杯になります。デフォルトで標準出力、標準エラー出力にログが吐かれるようなので、logtoの設定は消してしまって大丈夫です。
以下ドキュメント↓

>
The most basic form of logging in uWSGI is writing requests, errors, and informational messages to stdout/stderr. This happens in the default configuration.


Fargateの場合、

その他、困ったらこのページを見ればだいたいは解決すると思います。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using_firelens.html

fluent-bitを使った詳しいFargateコンテナからのログの取得は[別記事](https://qiita.com/masalennon/items/2d3241ecd426023ee196)にまとめましたのでそちらを読んでください。

以上、参考になれば幸いです。



## 参考リンク

https://aws.amazon.com/jp/blogs/opensource/splitting-application-logs-multiple-streams-fluent/
https://cloud.google.com/solutions/best-practices-for-operating-containers?hl=ja#immutability
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using_firelens.html
https://uwsgi-docs.readthedocs.io/en/latest/Logging.html
.NET Frameworkと.NET Core、どちらを選ぶか

# 前提

* Windowsのデスクトップアプリが対象
* 新規開発のケース

# 選定のポイント

* 対象のフレームワークで必要な機能が利用できるか
* サポート期間の長さ
  * .NET Coreは長期サポート版（LTS）でも3年程度、つまり3年ごとに新しいバージョンへの移行作業が発生する
  * .NET Frameworkは3.5 SP1が2029年まで（約20年）、4.6.2～はOSのサポート期間中はずっと使える
  * [参考：サポート期間](https://qiita.com/Kosen-amai/items/3259efcf74ab24bf61bb ".NETメモ　.NET Framework, .NET Coreサポート期間 2019/12")
* 将来性
  * .NET Frameworkは4.8が最後、.NET Core（.NET Core 3.xの次は.NET 5）が今後進化していく
* 配布先のランタイム環境
  * 1MBでもファイルサイズを減らしたいなら.NET Framework
  * .NET Coreは（今のところ）追加でランタイムを入れるか、アプリケーションごとに数十MBのランタイムを同梱する必要がある
  * 容量さえ気にしなければ配布先のランタイム環境に依存しない、ランタイム同梱形式（自己完結型）の.NET Coreがおすすめ
MovingPandasチュートリアルでのimport error

# はじめに
import errorに遭遇したため、同じエラーに遭遇した方々のヒントになればと思い投稿しました。

# 環境
・Anaconda3
・Jupyter Notebook
・MacOS

# 遭遇したimport error
・shapely
・fiona
・geopandas
・movingpandas

# 解決方法
・パッケージを1つずつimportしていき、それぞれのエラーに対して以下のURLを参考にした
・Anacondaのアップデート
・shapely→gdal→fiona→geopandas→movingpandasの順にインストール
・"conda install パッケージ名" を実行（pipは使っていません）

# 参考URL
・https://geopandas.readthedocs.io/en/latest/getting_started/install.html
・https://qiita.com/doraneko94/items/a9a3f4d7e32f953e7c5c
・https://qiita.com/ftnext/items/041cf583ba102f69ee45
・https://qiita.com/c_geru/items/c100b03e9e8b69c7758a
コメントアウトを翻訳するPythonモジュールを作ってみた

## はじめに

タイトルの通り、ソースファイルにあるコメントアウトを翻訳するモジュールを作ってみました。

使い方などはgithub、またはPyPiを見ていただければと思います。

https://github.com/koboriakira/translate-comment-out
https://pypi.org/project/translate-comment-out/

## 背景

Reactで使われている`webpack.config.js`のソースを読もうと思ったのですが、英文の説明を読むのが大変でした。

とりあえずザックリでいいから日本語訳を読んでおきたいなと思い、2時間ぐらいで作ってみました。

## 例

### もとのwebpack.config.js

```webpack.config.js
// This is the production and development configuration.
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
module.exports = function(webpackEnv) {
  const isEnvDevelopment = webpackEnv === 'development';
  const isEnvProduction = webpackEnv === 'production';

  // Variable used for enabling profiling in Production
  // passed into alias object. Uses a flag if passed into the build command
  const isEnvProductionProfile =
    isEnvProduction && process.argv.includes('--profile');

  // We will provide `paths.publicUrlOrPath` to our app
  // as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
  // Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
  // Get environment variables to inject into our app.
  const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
```

### 翻訳後

`tco webpack.config.js > webpack.config_ja.js`で出力したファイルです。

```webpack.config_ja.js
// これは、本番および開発の構成です。これは、開発者の経験、高速な再構築、および最小
// 限のバンドルに重点を置いています。
module.exports = function(webpackEnv) {
  const isEnvDevelopment = webpackEnv === 'development';
  const isEnvProduction = webpackEnv === 'production';

  // エイリアスオブジェクトに渡される本番環境でプロファイリングを有効にするために使用
  // される変数。ビルドコマンドに渡された場合はフラグを使用します
  const isEnvProductionProfile =
    isEnvProduction && process.argv.includes('--profile');

  // アプリに `paths.publicUrlOrPath`をʻindex.html
  // `では％PUBLIC_URL％、JavaScriptでは` process.en
  // v.PUBLIC_URL`として提供します。 ％PUBLIC_URL％/ xyz
  // は％PUBLIC_URL％xyzよりも見栄えがよいため、末尾のスラッシュは省略し
  // てください。アプリに挿入する環境変数を取得します。
  const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
```

## 備考

上記の目的のため、JavaScriptの`//`によるコメントアウトにしか使えません。

仕組みは単純なので、他の言語でも試してみたい方はぜひforkして開発いただければと思います。
rbenvを通してrubyのインストールする方法

rbenvを通してrubyのインストールをするのに非常に悩んでしまったので備忘録として

#そもそもrbenvって何？
rubyのバージョンの切り替えたり、管理したりするツール

次に、インストール手順（Mac）を載せます。

#インストール手順
###大まかな流れ
1.Homebrewをインストールする
2.Homebrew経由でrbenvをインストールする
3.rbenvを経由してrubyをインストールする

####1.Homebrewをインストールする
ターミナルを開き、
[Homebrew](https://brew.sh/index_ja)のインストールあたりにある

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
を貼り付けて実行
これでHomebrewがインストールされます。

####2.Homebrew経由でrbenvをインストールする
Homebrewがインストールされたら次に
    
    $brew install rbenv

のコマンドを入力する。
rbenvのversionを確認するときは`rbenv -v`と入力する

####3.rbenvを経由してrubyをインストールする
次にrubyをインストールするのですが、目的のバージョンがあるかどうかを確認するために

    $ rbenv install -l
    1.8.5-p52
    1.8.5-p113
    1.8.5-p114
    1.8.5-p115
    1.8.5-p231
    （略）

と表示されます。
もしこの中に目的のversionがなかった場合、rbenvのバージョンが古いと表示されないことがあるので
`$ brew upgrade rbenv ruby-build`と入力して更新する。

目的のRubyがあったら以下のように入力してRubyをインストールします。

    $rbenv install (目的のrubyのversion)

rbenvを通してRubyがインストールを確認するには
    
    $rbenv version
    (目的のバージョン) (set by /Users/(ユーザー名)/.rbenv/version)

と入力してバージョンを確認することができます。

#自分がつまづいたところ
###Rubyのversionが変わっていいない？
rbenvを通してrubyをインストールしたはいいものの

    $ruby -v
    (目的のバージョンではない数字)

となってしなっており、`$rbenv version`に示された物とは違う物が表示されていた。


###原因として
色々と調べてみて分かったのですが
参照とするRubyが変わっていなかった事に起因する現象と事です。
元々、MacにはRubyがすでに備わっており、すでにあるRubyを参照しています。
なので、rbenvでインストールされたRubyを参照するようにパスを通すようにします。


###解消方法としては

パスを通すようにすれば良い、ではどうするかだが、
`~/.bash_profile`にrbenvでインストールしたRubyを参照するように書き込めばよい
※　`.bash_profile`はログイン時に実行されるファイルです。

    $cd
    $vi ~/.bash_profile

ホームディレクトリに`.bash_profile`があるのでホームディレクトリに行き、
`vi`で`.bash_profile`を開き、以下を書き込む

    export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
    eval "$(rbenv init -)"

`vi`で書き込みが終わったら、

    source ~/.bash_profile

を入力して再起動するとRubyのバージョンが変わり完了です。



###参考文献
[rbenvでrubyのバージョンを管理する](https://qiita.com/hujuu/items/3d600f2b2384c145ad12)
[Rubyのバージョンが切り替わらない時の対処法！](https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1)
[.bash_profileと.bashrcの違いは](https://www.atmarkit.co.jp/flinux/rensai/linuxtips/168bpronrc.html
)
railsで子モデルをcreated_at descで取得するscope

子モデルのデータをdescやascで取得方法を変えるには下記の方法でいけます

```
scope :order_asc, -> { includes(:messages).order('messages.created_at ASC') }
```

### 参考記事
[Ruby On Rails: Order by child attribute](https://stackoverflow.com/questions/12164088/ruby-on-rails-order-by-child-attribute)
【無限遠点を巡る数理】「ティンダロスの猟犬(The Hounds of Tindalos)問題」を世に解き放つ。

[【無限遠点を巡る数理】無限直線(Infinity Line)/無限円(Infinity Circle)/無限球面(Infinity Sphere)そして無限トーラス(Infinity Torus)? - Qiita](https://qiita.com/ochimusha01/items/5d83fee2cee0c9d0ef4d)
この投稿において私はやっと**無限直線**(<font color=blue>Infinity/Unlimited Line</font>)/**無限円**(<font color=blue>Infinity/Unlimited Circle</font>)/**無限球面**(<font color=blue>Infinity/Unlimited Sphere</font>)によって構成される**原始座標系**(<font color=blue>Primitive Coordinate System</font>)の世界観に「**オイラーの公式**（<font color=blue>Eulerian Formula</font>）<font color=green>Cos(θ)+Sin(θ)i</font><font color=purple>およびその一般形</font><font color=green>Cos(θ)+Cos(θ-π/NoS)i</font>(<font color=blue>NoS=Number of Sides</font>)」概念を不可逆的な形で組み込む事に成功しました。しかし同時に**オイラーの公式**（<font color=blue>Eulerian Formula</font>）<font color=green>Cos(θ)+Sin(θ)i</font>が成立する<font color=purple>NoS=2</font>以下の展開を切り捨てるという苦渋の選択を迫られたのです。

[【Rで球面幾何学】二辺形(Bilateral)と一辺形(One Side)？ - Qiita](https://qiita.com/ochimusha01/items/ce1b6988c4274a136e89)
辺数の判別式でもある**数式**<font color=green>Cos(θ)+Cos(θ-π/NoS)i</font>(<font color=blue>NoS=Number of Sides</font>)は、角度範囲として<font color=green>θ=0→π</font>の周期を与えると<font color=red>1辺形</font>(<font color=blue>One Side</font>)をその答えとして返します。そしてそれ以上の辺数では(<font color=blue>Cos(θ)+Sin(θ)i概念が成立する</font>)**二辺形**(<font color=blue>Bilateral</font>)しか満たさない**直交条件**<font color=green>NoS=2/(2N+1)</font>を満たす<font color=red>2/3辺形</font>、<font color=red>2/5辺形</font>、<font color=red>2/7辺形</font>などが出現周期を短縮しつつ**辺数**<font color=green>0</font>に向けて顕現し続けるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/f5913088-1524-1051-cc62-14ab394effeb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/749833cd-a69d-a9d8-32cf-d6da92e60901.png)
アニメーション化してみましょう。予測通り「(<font color=blue>直交度合いを意味する</font>)<font color=purple>円盤が回転速度を上げながら旋回している</font>」光景が現出しました。この数式、おそらく**相関係数**(<font color=blue>Correlation Coefficient</font>)の概念とも密接な関係がある筈なのに、何たる暴虐無尽な振る舞い!!
![image.gif](https://camo.qiitausercontent.com/e49e7e91f2ed668b15895c311497622a5642fc28/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3539373737322f36396336633339332d313032632d306235392d303739662d6435383739383636656332622e676966)
これが私を昨年末から悩ませてきた仮称「**ティンダロスの猟犬**(<font color=blue>The Hounds of Tindalos</font>)**問題**」。しかし私の<font color=purple>SAN値</font>にも限界があるので、この辺りで公表の運びとさせて頂きます。
[SAN値 (さんち)とは【ピクシブ百科事典】](https://dic.pixiv.net/a/SAN%E5%80%A4)

「**僕には時間がないんだ** (<font color=blue>je n'ai pas le temps</font>)。**後は誰かが勝手にどうぞ!!**」
Kubenetesって流行ってるけど何？　

こんにちは、最近インフラに興味があるひよっこエンジニアですmm

以前インフラ技術についてOpenStackについて語ったんですが、
最近は「くーばねてぃすがーくーばねてぃすがー」って声が
ちらほら出てきたので勉強もかねてメモ。

ちなみにOpenStackについては↓URLからどうぞ(=ﾟωﾟ)ﾉ
https://qiita.com/DogFall253/items/38c5ae25b3d7b64b6b8c


#Kubernetesって結論何？
ざっくりまとめるとこんな感じ。

| 番号 | 公式参考 | 
|:-:|:-:|
|  1 |  Google製（ブラウザ戦国時代を牛耳った技術好きの塊） |  
|  2 | 複数hostを束ねてDockerを利用するためのツール  |   
|  3 |  分散アプリケーションを作成、デプロイ、管理するためのプラットフォーム |   

なんのこっちゃって感じですが、
こんな特性あるって思ってもらえればOK。

| 番号 | 特徴 |
|:-:|:-:|
|  1 |  ほぼインフラをコードで管理できる |
|  2 |  障害に強い |
|  3 |  自動化しれくれて超便利 |
|  4 |  最小限の運用で済む |

<br>

#なんで使われるの？

| 理由 | 
|:-:|
|  ❶異なるサービスをコンテナに閉じ込め1つの箱に安全に共存させられる |  
|  ❷Kubernetesでレイヤーを分割することで、それぞれの債務領域で頑張れる | 

  
>❶：例えば、開発環境として１エンジニアに１つ渡したり、ハードウェアリソースが空いてるサービスを1つにまとめてコストダウンさせられたりして便利なそうな。

>❷：OSはOS見る人、アプリはアプリを見る人、Kubernetesは以下略…みたく１つの事に集中して作業できるって感じっぽいです。


##メリット
❶クラス内の状態をあるべき状態に<b>自動で</b>してくれる。

❷3つのコンテナを動かしたいとき、4つ目を動かすと1つ破棄してくれる。逆に1つ破棄すると3つになるように1つ起動してくれる。（楽ちん）

❸<b>開発/テストの環境の一貫性を保ってくれる</b>。ノートPCでもクラウドでも同じ動作になる

❹DevとOpsの分離問題を解決してくれる。デプロイ時ではなく、ビルドとリリース時にコンテナイメージを作ることで<b>アプリをインフラから分離</b>してくれる。

##デメリット
❶最新のDockerは使えない（くーばねてぃすに合わせないとダメ）ので、
自前で環境構築しないといけない。

##上手く活用する方法
Podを上手く活用する方法として、1コンテナ1アプリが原則。

#レベル別おさわりマニュアル
意外とモダンな技術ですが、やっぱり学習コストは高め。
ってことで、レベル別でどっから始めたらいいかわかるようにしておきます。

| レベル | 対象者 | 内容 |
|:-:|:-:|:-:|
|  1 | コンテナ自体未体験  |  dockerを触ろう |
|  2 |  Dockerを触ったことがある|  運用を自動化してみよう |
|  3 |  Docker操作に慣れている |  Kubernetesに触れてみよう |
[svn] 偏屈で超手軽なブランチ運用方法

svnって真面目にブランチをマージしようとすると大変だよね。
というわけで。
(ざっと検索してみたけど、既出じゃないよねﾄﾞｷﾄﾞｷ)

# 準備

まずは、こんな感じの極めて普通なリポジトリ。
![WS002442.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/61dcec27-18b1-da80-7c27-6a0fcd0cca64.jpeg)

ただひとつ、偏屈なところは…
![WS002443.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/3d043100-218d-5a6b-a49c-5f97163557dc.jpeg)

.svn* が無視リストに入ってる。
ここまでで察したら、あなたすごい鋭い。

# ブランチ開始

ブランチを作る前に…
![WS002444.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/a2f37a8a-2ae1-febc-01a3-92f4de0928ee.jpeg)

.svnフォルダのバックアップを作っておくことがポイント。
ここまでで察したら、あなたとても鋭い。

さて、ではブランチを作りましょうか。
もちろんswitch込みで。

![WS002445.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/0de86ed6-19da-aa12-2637-a9c2e9da10b9.jpeg)

さらに、ブランチ側でread1st.txtを編集してみました。
そしておもむろにcommit

![WS002447.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/1b196c21-4d95-20ac-7b6b-94ef8c6bedfb.jpeg)

# 一方、trunk側では…

![WS002448.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/06f1164c-765d-26b1-403e-5540b725943e.jpeg)

read1st.txtもdoc/memo.txtも編集されてます。
さらに、ブランチ運用の天敵・フォルダのリネームを添えて。

# まずは、普通にマージしてみましょうか

祭り始まる。

![WS002449.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/97a6a5f7-3b3c-8a01-08d6-e10fa291eb73.jpeg)

手動で頑張れ。

# そこで、偏屈で超手軽なマージ技

こちらは、先ほどブランチ側でcommitした後の状態。

![WS002450.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/b05da047-4ecf-7bec-9515-e9a3b8f3a1ac.jpeg)

.svn → .svn_branch
.svn_trunk → .svn
ってリネームすると…

![WS002451.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/639ccf33-a37e-c4d7-f8a2-a8d9bfed8854.jpeg)

ブランチ元のtrunkから未commitの状態になりました。
次に、trunk側の更新を反映するため、おもむろにupdate。

![WS002452.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/5bacdc21-cbb9-9d7a-fed7-bc3ec4751f0d.jpeg)

という具合に、trunk同士の競合解決とほぼ同様に処理できます。
さすがに、リネーム前のフォルダは消えちゃいますね…
今回の例ではブランチ側でdocフォルダを書き換えてないので
放っといてもいいのですが、もし書き換えてたらという仮定だと
その解決方法は? というわけで…

![WS002453.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/170029f2-d778-69be-3c45-d977639f6c75.jpeg)

ブランチ側のdocフォルダをエクスポートしてきましょうか。
そして、docsフォルダに上書き。

![WS002454.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/511cf37b-0d88-2b8a-52cf-816bb5db5b5d.jpeg)

ブランチ側のmemo.txtに書き変わって未commitの状態。
そしておもむろに…まだまだ。
ブランチ側の状態がtrunkでも有効か、検討しなきゃ。
今回の例ではtrunk側を採用することになるので、revertで対応。
このあたりはケースバイケースなので、うまく調整していきましょう。

で、最後に、ブランチ側からのマージ分をcommitして、任務完了!!

![WS002455.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761337/8b7dfa53-b352-e3c9-3c4d-3b8641bc0ab6.jpeg)

# 補足

この方法は、別リポジトリからのマージにも使えたりします。
gitっぽく、まずローカルリポジトリで細かくcommitしていって、
一段落ついたらリモートリポジトリにcommitといった運用もあり。
【Docker】docker-compose buildしたらCan not read file というエラーが出て困った。。【Rails6.0】

最近チーム開発で新しいプロジェクトが始動し、Dockerで環境構築のタスクをやらせて頂きました。その時に、Dockerをビルドしようとしたら ``OSError: Can not read file in context ~`` という見たこともないエラーが起きて途方にくれたので同じ道をたどる方が少しでもいなくなるように、ここで共有させて頂きます。

【環境】

- Rails	6.0.3
- Ruby	2.7.1
- PostgreSQL	13.0
- Node.js	10.21.0
- Yarn	1.22.5
- Bundler	2.1.4
- Redis	6.0.8
- Docker for window
- windows10 Pro

##解決方法
いきなりですが、解決方法です。めっちゃ簡単です。
どうやらエラー文を読んでいたらnode_modulesディレクトリが悪さをしていたらしかったので、**.dockerignoreファイルを作成**し、そこに
node_modulesと書いてビルドしなおしたらうまくいきました！

```shell:.dockerignore
node_modules
```

##感想
Dockerって一度作ったら環境使いまわせるし、チーム開発では一人が作ってしまえばまったく同じ環境をすぐ再現できるのでめちゃくちゃ便利ですね！
でも、知識不足が故に他人のDockerfile丸パクリでビルドしてもうまくいかずエラーと格闘することが多いです、、、正直プログラミングそのものよりも環境構築とか、バージョンの依存関係で発生するエラーとかの方が何倍も時間かかりますね、、

##最後まで読んでいただきありがとうございます！
ご指摘や、感想などあればコメントいただけると嬉しいです！！
【学習メモ】一夜漬けのクラウドプラクティショナー

## はじめに
クラウドプラクティショナーを受験した流れを記録します。

アソシエイトとかプロフェッショナルとか、上位資格を取りたいと思いましたが、まず何かしら資格は欲しくて、すぐ手に入れられるものは？クラウドプラクティショナー！となって、受験した履歴を残します。

## やったこと
##### 受験申し込み
自分を追い込むために3日後を受験日に申し込みました。
PSI / ピアソンのどちらか悩みました。
ピアソンは日本語を話せる試験官がつくそうですが、PSIは英語のみ。
15分刻みで、夜も受験できるPSIを選びました。
テストツールでブラウザでマイク・Webカメラが動けば良いです。
専用ソフトウェアを本番で使うので、ここでDLして起動していればより良いです。

##### 参考書を揃える
参考書を買いました。買ったあとは積んで眺めて満足してしまうタイプです。
[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/dp/4797397403/
) を買って勉強しようと思っていましたが、いざ買うタイミングになって、[一夜漬け AWS認定クラウドプラクティショナー 直前対策テキスト](https://www.amazon.co.jp/dp/4798062952)という非常に魅力的なタイトルの本が積んでありましたので、そちらを買いました。
発行時期もタイムリーな2020年9月。運命を感じました。

##### 勉強方法
一夜漬け(3時間程度)で読み切れる量ではありません。
わかっていそうなところは飛ばして読みました。
本としては、1ページで完結しているので非常に読みやすく、使いやすかったです。

##### 受験当日
当日は、読み飛ばした箇所をできる限り読みました。
受験直前は、参考書のわからなかったところ、模擬演習で外れたところ、わからなかった単語を復習しました。

##### 受験
ブラウザは専用のソフトウェアで実施します。
トレーニング・認定のWebページからPSIのアプリを直接起動します。Safariは非対応だそうです。
対応のChromeを使いましたが、試験開始のボタンを押しても何も起きず、焦りました。
専用ソフトウェアをダブルクリックで起動しても、試験情報が渡ってないので試験官担当とも話すことができず、連絡を取りたいんだけど連絡取るための画面に行けない…という状態した。

Chromeを再起動したら試験開始を押すと「Open PSI専用のソフトウェア.app ?」みたいなダイアログが出て、専用ソフトウェアが立ち上がり事なきを得ました。

30分前くらいから「試験開始」は押せるようなので、一度も受けたことがない人は早めにログインして時間的余裕がある状態で試したほうが良いでしょう。

専用ソフトウェアが立ち上がったあとは自分の写真を撮ったり、パスポートをWebカメラで撮ったりして、Validationするようです。
Validationが終わると試験官がTextChatで英語で話しかけてきて、部屋の中を映して、机の上を映して(何もない状態か)、スマホを映して(手の届かないところに置いてあるか)、両腕に何もつけてないか、と一通り進むと、試験を受けられるようになります。

試験中はカメラが監視しています。顔が認証できていないと、試験官が聞いてきます。私の場合は肩より上が映るような、多少離れた状態でないと正常と認識しませんでした。
解像度を高くしていたので、文字が小さくて読めず、画面10センチくらいで規約の画面を見ていたら怒られました。Resolutionは変えられないと言われ、しぶしぶ細目で見ていました。
画面に「Zoom　＋　ー」のボタンがあるので、文字が小さければそちらで拡大できます。終わってから気づきました。

##### 試験後
30分かからず解き終わってしまい、途中で終了しました。
完了してすぐ、合格か不合格か表示されます。
幸い合格でした。


##### 終わって
一夜漬けでも参考書を読んでおいてよかったと思いました。

6か月のAWSクラウド使用経験のある人が取る資格なので、AWSを使っていれば勉強しなくても取れてしまうと思います。

一夜漬けしなくても受かったかもしれませんが、知らない知識も多く、勉強してよかったというのが正直な感想です。

入門の資格として11,000(税抜)は高いなぁと思いました。

## 参考書の模擬試験の感想
試験の内容は言及できないので、実際の試験の話ではなく、参考書の模擬試験に対しての感想を書いておきます。

AWSサービスについて、まんべんなく知っておくと良いです。
Connectや機械学習などのニッチなサービスは、用語として何をするものか？くらいは押さえておいたほうが良いです。
EC2やRDSなどのコンピューティング、Code系のサーバーレスの主要サービスは使って何か作ったことがあるレベル、もしくは作ろうとして試行錯誤した経験がある、くらいが望ましいです。

AWS独自のウェルアーキの観点を知っておくと良いです。
ある目標を達成するためにAWSではこういったサービスを揃えています、
あるサービスは何ができて、何ができません（他に何をする必要があります）、のような感じです。

AWSを普段から触っている人（AWSを6ヶ月使っている人）であれば、
知識は十分ついているため、幅広くやっていれば、何もしなくても受かるのではないか？と思います。

技術者の場合は、請求周りやOrganizationあたりが知らない領域になるかもしれませんので、そのあたりを補完しておけば良いでしょう。

AWSを普段から触っていない非技術者は、サービスは知っていてもその中の仕組みを知らないはずですので、サービス内の仕組み・用語を覚えるため、かなり勉強する必要があると感じました。

用語で言えば、参考書などの模擬試験で選択肢が1つくらいわからないレベルなら、他の選択肢から消去法でなんとかなります。
Raspberry Pi OS (旧: Raspbian) 日本のミラーサイト

Qiita上には、[旧Raspbianのミラーサイト](https://qiita.com/tukiyo3/items/c8555eacb67466b81bc8)のURLはありましたが、Raspberry Pi OSに名前が変わってからわからなくなった人も多いかと思いまとめてみました。

## JAISTのミラーサイト

Desktop版のみ紹介

* 旧Raspbian
    * http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
* Raspberry Pi OS
    * http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_armhf/images/
* Raspberry Pi OS 64bit版（Beta）
    * http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_arm64/images/
OpenCVでカメラ動画を入力時にabortが表示された場合の対処法

先日試しにopencvを用いて動画の入力し、その表示を行ってみた。
環境はmacOS CatalinaのvsCode上で行ったが、その際に

```
zsh: abort      python load_video.py
```
といった表示がなされて、処理が止まってしまう現象が発生した。
結論の対象方法から申し上げると、VScode上でコマンドを叩くのではなく、**直接ターミナル上で**叩き、カメラの権限許可をとる必要があることがわかった。
[参考](https://stackoverflow.com/questions/52634009/opencv-python-scripts-mac-aborts)

VScode上でうまくやる方法は現在模索中である。
以下には詳細なコードを参考までに示す。
*
*
*
[openCVのチュートリアルページ](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html)を参考にmp4ファイルとカメラ動画の表示するためのコードを下に示す。

```Python
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

なお、cv2.VideoCapture()の引数を任意の動画ディレクトリにすることで動画も表示がさせられる。
aタグを使って要素全体をリンクにする二つの方法

## はじめに
div要素全体にリンクをつける方法を二つ紹介します。

1. 親要素を`position:relative`にし子要素のaタグを`position:absolute`にする方法
2. リンクにしたい要素をaタグで囲う方法

## 1.親要素を`position:relative`にし子要素のaタグを`position:absolute`にする方法
実際に適用したものをみるのが良いと思いますのでCodePenを貼っておきます。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="Nnohara" data-slug-hash="oNxrJbv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Qiita1">
  <span>See the Pen <a href="https://codepen.io/Nnohara/pen/oNxrJbv">
  Qiita1</a> by 野原直人 (<a href="https://codepen.io/Nnohara">@Nnohara</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ポイントは
1. div要素の中にaタグを入れる
2. 親要素を`position:relative`にし、aタグを`position:absolute`にする
3. `top:0`と`left:0`にすることで親要素左上にaタグを固定
4. `width:100%`と`height:100%`にしaタグの大きさを親要素の大きさと同じにする


## 2.リンクにしたい要素をaタグで囲う方法
これは単純でリンクを付けたい要素をaタグで囲うと、要素全体にリンクをつけることができます。もちろんこの中に文章や画像を入れてもリンクがつきます。

1と全く同じものをこの方法で作ったものです。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="Nnohara" data-slug-hash="KKzjbZB" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Qiita1-2">
  <span>See the Pen <a href="https://codepen.io/Nnohara/pen/KKzjbZB">
  Qiita1-2</a> by 野原直人 (<a href="https://codepen.io/Nnohara">@Nnohara</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 参考
1つ目の方法
- [リンクのクリック範囲を親要素(DIV)全体に広げる/リンクの中に別リンクを置く【HTML・CSS】｜webcode-lab京都](https://webcode-lab.com/topics/blogid/9/)
- [div要素全体にリンクをつける方法 - Qiita](https://qiita.com/iwato/items/840b831ad66fec0dd4c1) 

2つ目の方法
-[【CSS】DIV要素全体にリンクを効かせる⽅法](https://bloggercustoman.blogspot.com/2015/08/cssdiv.html)
HerokuにアップしたアプリのデータベースにSequel Proからアクセスする方法

他サイトからの引用なのですが、よく利用するので備忘録も含めて投稿します。

```terminal.
$ heroku config --app アプリケーション名
=== アプリ名 Config Vars
CLEARDB_DATABASE_URL: mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
〜〜〜〜
```

CLEARDB_DATABASE_URLの中身に必要な情報が入っているので、バラしてそれぞれに入れて接続します。