OmniAICreator/Qiita-1.07M huggingface dataset:
天文データ解析入門 その8 (aplpy で RGB合成図を作成する)

[以下追記] matplotlib のバージョンが3.7.0等だと、aplpy でエラーが起きるようです。
```python
TypeError: WCSAxes.__init__() got multiple values for argument 'wcs'
```

```
pip install matplotlib==3.5.2
```
などとしてダウングレードしてください。
[以上追記]

この記事では、aplpy を用いたRGB画像の作り方について記述します。

今回も例として、_Spitzer_ 3.6 µm, 8.0 µm, 24 µm のアーカイブデータを使用します。
https://irsa.ipac.caltech.edu/data/SPITZER/GLIMPSE/images/I/1.2_mosaics_v3.5/
から
GLM_03000+0000_mosaic_I1.fits
GLM_03000+0000_mosaic_I4.fits 
をダウンロードします。
また、
https://irsa.ipac.caltech.edu/data/SPITZER/MIPSGAL/images/mosaics24/
から
MG0290n005_024.fits
MG0290p005_024.fits
MG0300n005_024.fits
MG0300p005_024.fits
MG0310n005_024.fits
MG0310p005_024.fits
の計６つの fits をダウンロードし、つなぎ合わせた W43_24um.fits を用います

そして、[前回の記事](https://qiita.com/Shinji_Fujita/items/bdd114823efb7c6cee42) で regrid した 3 色分の fits 
GLM_03000+0000_mosaic_I1_reg.fits
GLM_03000+0000_mosaic_I4_Reg.fits 
W43_24um.fits
を用います。

まずは必要なものを import します。

```python
import aplpy
```
これだけです。
fits の場所と名前を変数にしておきます。

```python
data_fits_R = "~/your/fits/dir/W43_24um.fits"
data_fits_G = "~/your/fits/dir/GLM_03000+0000_mosaic_I4_reg.fits"
data_fits_B = "~/your/fits/dir/GLM_03000+0000_mosaic_I1_reg.fits"
fitss = [data_fits_R, data_fits_G, data_fits_B]
```
それぞれカラースケールを決めます。そして保存する名前も定義します。

```python
color_min_R = 30.0
color_max_R = 1500.0
color_min_G = 30.0
color_max_G = 1500.0
color_min_B = 10.0
color_max_B = 100.0
colorval = "%.1f_%.1f_%.1f_%.1f_%.1f_%.1f"%(color_min_R, color_max_R, color_min_G, color_max_G, color_min_B, color_max_B)
save_png_name = "RGB_%s"%(colorval)+'.png'
```
以下で png ファイルを生成します (少し時間がかかります)。

```python
aplpy.make_rgb_image(fitss, save_png_name, vmin_r=color_min_R, vmax_r=color_max_R,vmin_g=color_min_G, vmax_g=color_max_G, vmin_b=color_min_B, vmax_b=color_max_B, stretch_r="log", stretch_g="log", stretch_b="log")
```
もし何かエラー (大抵 PIL) が出た場合は、エラーメッセージで google 検索すると解決できる可能性が高いです。どうしてもダメな場合は ipython などで実行するといいかもしれません。

座標をつけて plot したい場合は以下のようにします。

```python
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(16, 12))
f = aplpy.FITSFigure(data_fits_R, slices=[0], figure=fig, convention='wells')
f.show_rgb(save_png_name)
f.ticks.set_color('w')
f.save('RGB_aplpy.pdf', dpi=300)
```
![ダウンロード (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117814/0d7720eb-2f44-ab8c-2548-013aab07bd5e.png)

### 欠損部分について
24 µmのデータは強すぎるところがサチっていて NaN が入っています。
この NaN 部分をある値 (大抵 2000 Jy/str くらい) に置き換えたい場合は、

```python
from astropy.io import fits
import numpy as np

hdu = fits.open("W43_24um.fits")[0]
data = hdu.data
data[data!=data] = 2000.0 # data!=dataは NaN の場所を示す

fits.PrimaryHDU(data, hdu.header).writeto("W43_24um_nan2000.fits", overwrite=True)
```
として、こちらを使用してください。

以上です。

リンク
[目次](https://qiita.com/Shinji_Fujita/items/ecb869e5b6a9fa468483)
2WAYSQLでのwhere句の書き方

2WAYSQLでのwhere句の書き方。自分用メモ。

```
/*BEGIN*/
where
/*END*/
```
まず /\*BEGIN*/ と /\*END*/ でwhere句をくくる。
（大文字で書くこと。）


```
/*BEGIN*/
where

  //if文なしの場合の完全一致検索
  user_cd = /*userCd*/'dummy'

  //if文ありの場合の完全一致検索
  /*IF searchItem != null && !"".equals(searchItem)*/
  user_name = /*searchItem*/'%dummy%'
  /*END*/

  //if文ありの場合の部分一致検索
  /*IF searchItem != null && !"".equals(searchItem)*/
  user_deaprtment like '%' || /*searchItem*/'%dummy%' || '%'
  /*END*/

//if文ありの場合の比較検索 その１
  /*IF lastLoginDateFrom != null && !"".equals(lastLoginDateFrom)*/
  and login_date >= /*lastLoginDateFrom*/''
  /*END*/

//if文ありの場合の比較検索 その２
  /*IF lastLoginDateTo != null && !"".equals(lastLoginDateTo)*/
  and login_date <= /*lastLoginDateTo*/''
  /*END*/
/*END*/
```

if文を書く場合は、
/\*IF (条件)\*/ と /\*END*/ でくくること。
XDからコーディング

##headerを書くときに詰まったポイント
###検証ツールの画面サイズが毎回安定しない。
→1920×1080だと見やすい

###Scssの一番最初にそのサイトのキーカラーやinner(コンテナー)幅、メディアクエリを指定しておく。

```scss:Css/scss.
$color-text:#;
$color-main:#;
$color-accents:#;

$layout-width-inner: 1200px;

//ブレイクポイント
$breakpoints: (
  "sp": "(max-width: 767px)", //767px以下（スマホ）用の表示
  "tab": "(min-width: 768px) and (max-width: #{$layout-width-inner})", //768px以上（タブレット・PC）用の表示
  "pc": "(min-width: #{$layout-width-inner})", //1101px以上（PC）用の表示
);

//メディアクエリ
@mixin mq($breakpoint: sp) {
  @media #{map-get($breakpoints, $breakpoint)} {
    //この中をカスタムできる
    @content;
  }
}
```


###header内でロゴとのメニューを横並びにするにはflexを当てる。
flexとセットでよく使う”justify-content: space-between;”だとバグが起きる可能性が高いため、メニューの単語たち側から左側に押し出す感じで”margin-left: auto;”とするのがおすすめ。

```scss:header_inner.
.header__nav {
    display: flex;
    align-items: center;
    margin-left: auto;
}
```


###headerのメニューリストの１番最初の単語につく無駄な余白を消すコード↓

```scss:header_nav.
li {
    &:not(:first-child) {
    margin-left: 40px;
    }
}
```

###header内のロゴはwidthで大きさを指定し、入れ子のimgにdisplay: block;を当てる。

```scss:header__logo.
.header__logo {
    width: 205px;
    
    img {
        display: block;
    }
}
```

###reset.cssの参考例

```reset.css
*,
*::before,
*::after {
    box-sizing: border-box;
}

html,
body {
    padding: 0;
    margin: 0;
}

body{
    font-family: "游ゴシック体", YuGothic, "游ゴシック Medium", "Yu Gothic Medium", "游ゴシック", "Yu Gothic", sans-serif;
    font-size: 16px;
    line-height: 1.6;
    background-color: #fff;
}

img {
    max-width: 100%;
    height: auto;
}

ul,
ol {
    list-style: none;
    padding: 0;
    margin: 0;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    padding: 0;
    margin: 0;
}

a {
    color: inherit;
}
```

###先にHTMLでつけたクラスを一気にScssに書き切ってから中身を書き始めると効率的。

###親から継承するときはinhelitを使う。

```scss:inhelit
.header__inner {
    display: flex;
    align-items: center;
    height: inherit;
}
```
[SQL] MySQLでSQLを学ぶ~DML編~

## はじめに
前回まではSQLの中でもDDLを中心に説明をまとめていました。
今回はDML。データを操作するSQLをまとめていきたいと思います。
前回使用した「sqltest」データベースと「goods」テーブルを使って説明をまとめていきます。

## DML(Data Manipulation Language)

データを操作するSQLで、私は面接でこれの有名な文を四つ答えるように質問されて惨敗しました。

| 命令 | 機能 |
| --- | ---- |
| INSERT | データの登録 |
| UPDATE | データの更新 |
| DELETE | データの削除 |
| SELECT | データの検索 |


主なDML文は上記のとおりです。

## SELECT文
SELECT文はデータの取得をする際に使います。

SELECTを使ったカラムの指定の仕方は下記のとおりです

```sql
mysql> SELECT 《カラム名》 FROM 《テーブル名》
```

もし、テーブルに登録されている全てのカラムのデータを取得する時は下記のようにします。

```sql
mysql> SELECT * FROM 《テーブル名》
```

SELECT句においてはこのアスタリスクはワイルドカードと言います。

## ワイルドカード
ワイルドカードとは「すべてのパターンにマッチするもの」という意味があり、文字の代わりとして使うことができる特殊な記号の一つです。

SELECT句ではアスタリスクが「全てのカラム」という意味のワイルドカードとして定義されているので、全てのデータを取得ができます。

## INSERT文
INSERT文はテーブルにデータを登録するためのSQL文です。
INTO句と組み合わせて使用します。
また設定する値はVALIE句を使います。

全てのカラムに値を入れる場合は下記のような書き方になります。

```sql
mysql> INSERT INTO 《テーブル名》 VALUES(値1, 値2, 値3);
```

特定のカラムにだけ値を入れる場合は下記のように書きます。

```sql
mysql> INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
```

それでは実際にデータの登録を行なってみます。

```sql:ターミナル
mysql> INSERT INTO goods VALUES(1, "ペン", 120);
Query OK, 1 row affected (0.04 sec)
```

2行目が表示されれば成功です。

ちゃんと登録されているか確認してみましょう。

```sql:ターミナル
mysql> SELECT * FROM goods;
+------+--------+-------+
| id   | name   | price |
+------+--------+-------+
|    1 | ペン    |  120  |
+------+--------+-------+
1 row in set (0.04 sec)
```

左から順にカラムに入っていますね
順番を間違えないように気をつけたいところです。

次は特定のカラムにデータを登録してみます。

```sql:ターミナル
mysql> INSERT INTO goods(id, name) VALUE(2, "消しゴム");
Query OK, 1 row affected (0.00 sec)
```

2行目が表示されれば成功しているはずです。
確認しましょう。

```sql:ターミナル
mysql> SELECT * FROM goods;
+------+--------------+-------+
| id   | name         | price |
+------+--------------+-------+
|    1 | ペン          |  120  |
|    2 | 消しゴム       |  NULL |
+------+--------------+-------+
2 rows in set (0.00 sec)
```

今回はpriceに何も入れなかったのでNULLが入っていますね。

## UPDATE文
次はデータを更新するために使用するUPDATE文です。

UPDATEの記述の後にテーブルを指定し、**SET句**というものを置いてその後、変更内容を記述、その後に**WHERE句をいて条件を指定できます。

```sql
mysql> UPDATE 《テーブル名》 SET 《変更内容》 WHERE 《条件》;
```

実際に上記にデータを当てはめて、データを更新します。

```sql:ターミナル
mysql> UPDATE goods SET price = 100 WHERE id = 2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

データを確認します

```sql:ターミナル
mysql> SELECT * FROM goods;
+------+--------------+-------+
| id   | name         | price |
+------+--------------+-------+
|    1 | ペン          |   120 |
|    2 | 消しゴム       |   100 |
+------+--------------+-------+
2 rows in set (0.00 sec)
```

消しゴムのpriceが１００に変わりました。

## DELETE文
データを削除するDELETE文の使い方を見てみます。
テーブル名を指定する**FROM句**と条件を指定する**WHERE**句を使います。

```sql
mysql> DELETE FROM 《テーブル名》 WHERE 《条件》;
```

実際にidが2のレコードを削除します。

```sql:ターミナル
mysql> DELETE FROM goods WHERE id = 2;
Query OK, 1 row affected (0.01 sec)
```

2行目が表示されれば成功です。
確認しましょう。

```sql:ターミナル
mysql> SELECT * FROM goods;
+------+--------+-------+
| id   | name   | price |
+------+--------+-------+
|    1 | ペン   |   120 |
+------+--------+-------+
1 row in set (0.01 sec)
```

消しゴムが消えましたね！

## 最後に
この四つの文は面接で聞かれて答えられなくて悔しかったので、逆に覚えました 笑
しかしながら、詳しい使い方は覚えられていないので、使いこなせるよう、一文ごと覚えるように手を動かして復習していきたいと思います。
コンピュータの記憶装置の分類

基本情報技術者の参考書を読んでいたら、コンピュータの「メモリの分類」という章がとても面白かった。
情報系の業界に飛び込んだが、学生の頃は機械科だったし、そもそもパソコンオタクなのでハードウェアに関してはしっかり理解しておきたい。
コンピュータの記憶装置の種類と分類についてまとめていく。

#これまでの認識

勉強前の私の認識は以下の通り、**所々間違っています**。
主にパソコンを組むために調べたり友人に聞いたりして得た情報です。

###知ってる記憶装置
- RAM : いわゆるメモリ、マザボに刺すやつ
- ROM : SSDとHDDのこと
- フラッシュメディア系 : USBメモリ、SDカードとか
- 光学ディスク系 : CD、DVD、BDとか

###分類
- 揮発するやつ : RAM
- 揮発しないやつ : SSD、フラッシュメディア
- レーザーで物理的に記録 : 光学ディスク系
- 磁気で記録 : HDD

正直この認識で自作PCには困らなかったが、知識として間違っている部分、足りない部分があった。

#間違っていた点
まず大きく間違っていたのは、**HDDはROMではない**こと。
**SSDはROMの一種（フラッシュメモリ）**だということ。
記憶装置には他にも**レジスタ、キャッシュ**が存在すること。

#記憶装置の分類
- 半導体メモリ（RAMとROM）
- 磁気で記録
- 光学で記録

###- RAM
電源を切ると内容が揮発する、揮発性のメモリ。
DRAMとSRAMがある、マザボに刺すいわゆる「メモリ」はDRAMのこと。
SRAMはキャッシュメモリに使われる。

###- ROM
電源を切っても中身が揮発しない、不揮発性のメモリ。
読み出し専用のマスクROM、書き換え可能なPROMがある。
PROMはさらにいくつかに分類できる、後述する。

###- 磁気、光学で記録
磁気で記録するのはHDDなど。（フロッピー？聞いたことないですね）
磁気ヘッドなど、可動部品が多い。

光学的に記録するのはCD、DVD、BDなどディスク系。
レーザーで読み取りを行う。

##RAM
DRAMとSRAMがある。

###DRAM
主記憶装置に使われる、マザボにさすメモリ。
SRAMより低速だが大容量で安価。
記録内容を保つためにリフレッシュ動作が必要。

###SRAM
キャッシュメモリに使われる。（キャッシュは後述）
DRAMに比べ高速だが小容量で高価。
リフレッシュ動作は必要ない。

##ROM
マスクROMとPROMがある。

###マスクROM
読み出し専用、普通「ROM」といえばこれ。
製造時にデータを書き込み、それ以降書き換えはしない。

###PROM
PROMは書き換え可能。
- 紫外線でデータを消去して書き換えれるEPROM
- 電圧の印加で消去、書き換え可能なEEPROM
- フラッシュメモリはEEPROMの一種
SSDはフラッシュメモリに分類され、他にもUSBメモリ、SDカードなどがある。

#レジスタ、キャッシュとは
キャッシュには、キャッシュメモリとディスクキャッシュがある。
レジスタとキャッシュメモリはCPUに内蔵された保存領域。

###レジスタ
CPUに内蔵されている。
命令自体の記録、処理に必要なデータを記憶したりする。
コンピュータの記憶装置の中で最も高速で高価、容量も少ない。

###キャッシュメモリ
CPUに内蔵されている、レジスタより大容量だが速度は劣る。
レジスタとメモリの間でそれぞれの速度差を吸収する。
レジスタより遅いがDRAM（メモリ）より速い、SRAMが使われる。

###ディスクキャッシュ
HDDに内蔵される、DRAMとHDDの間で速度差の吸収を行う。
SSDはメモリとの速度差が少ないため、必要ない。

#記憶階層
コンピュータの記憶装置は、階層構造で組み合わさり機能している。
演算装置に近いものから、
1. CPU内のレジスタ
2. CPU内のキャッシュメモリ
3. 主記憶装置＝メモリ（DRAM）
4. ディスクキャッシュとHDD or SSD
となる。
１の方が高速、小容量で高価。


#参考資料
https://ja.wikipedia.org/wiki/%E8%A8%98%E6%86%B6%E8%A3%85%E7%BD%AE#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E8%A8%98%E6%86%B6%E8%A3%85%E7%BD%AE%E6%8A%80%E8%A1%93

https://ja.wikipedia.org/wiki/PROM

https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%A1%E3%83%A2%E3%83%AA

- [キタミ式イラストIT塾　基本情報技術者　令和02年](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C02%E5%B9%B4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297110210)
- [レジスタとキャッシュメモリの違いとは？](https://pcinformation.info/cpu/register-cache-memory-difference.html)
Lightning Knowledge の設定とカスタマイズ ⇒ 検証状況の設定

１．Maria はなぜ検証状況項目をコンパクトレイアウトに追加するのですか?
２．検証状況はどうやって作成しますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/3222dd78-a1df-9d8a-0dbf-b2a53e9677f5.png)
「解決」/usr/bin/codesign failed with exit code 1　良くわからないけど解決できた

##状況
openFrameworksを使って、プログラムを書いていたら
`/usr/bin/codesign failed with exit code 1`
というエラーが出てビルドできない。
ネット上に落ちてる解決策を一通り試しても一向に解決できない。

##環境
OS：Big Sur 11.4
Xcode：Version 12.5

##結果
・macのメニューバー(バッテリーとか時刻とかあるところ)からりんごマークをクリック
・一番下の「"ユーザー名"をログアウト」からログアウト
　＊再起動でもシステム終了でもなくログアウト
・再びログインし直して、Xcode開いてビルドしたらいけた

##感想
まじで何だったんだろう、、、
結局原因がわからない、、、

同じエラーコードで詰まってる人がいたら、一度PCからログアウトするとビルドできるかも
Vuexのdispatch()はPromiseを返す

タイトルのまんまですが、久しぶりにVuexを触って忘れていたのでメモがてら記事にします。


# 環境

- vuex: 3.6

# 説明

dispatch()はPromiseを返すみたいです。
なので、dispatch()は非同期です。


```javascript:store
actions: {
  actionA({ commit }) {
    //このmethodTooLong()は時間がかかる
    const result = methodTooLong()
  },
},
```


```javascript:呼び出し側
dispatch('actionA')

method2()
```

`methodTooLong()`の処理が長い場合、`method2()` → `commit("end", result)`の順番で実行されます。


# 処理順序を制御する？

ふむふむ そうだった。思い出した。
ということは、長い処理にawaitをつけって　と、、、、、

```javascript:store
actions: {
  async actionA({ commit }) {
    //awaitをつけて処理を待つ（methodTooLong()はPromiseを返す想定）
    const result = await methodTooLong()
    //methodTooLong()が終わったらcommit
    commit("end", result)
  },
},
```


```javascript:呼び出し側
dispatch('actionA')

method2()
```

`methodTooLong()`にawaitを付けているし、これで`commit("end", result)` → `method2()`の順番になるだろう
、、、といつも引っかかってしまいます。


# 結論

しかし、**dispatch()は非同期** なのでした。

なので、、、

```javascript:store
//↓ここは上に書いた内容と同じです。
actions: {
  async actionA({ commit }) {
    //awaitをつけて処理を待つ（methodTooLong()はPromiseを返す想定）
    const result = await methodTooLong()
    //methodTooLong()が終わったらcommit
    commit("end", result)
  },
},
```

```javascript:呼び出し側
//ここにもawaitをつける
await dispatch('actionA')

method2()
```

`dispatch()`自体にもawaitを付けることで `commit("end", result)` → `method2()` の順番になります。
iPhoneアプリ用アイコン

##はじめに

iPhoneアプリを新規に登録したのだけど
相変わらずめんどくさかったので
自分用の備忘録も兼ねた記録を残しておきます📝

## もっとも時間がかかった事

###アプリアイコンの用意

まぁ普通に絵心がないのでアイコンを作るのにも時間がかかるのですが
基本の画像を作ったあと、複数のサイズを用意する必要があります。

一番大きい 1024x1024だけ登録したら
いい感じにリサイズして他のサイズにも使ってくれればいいのに🥺

おそらく世の中には何か簡単なツールがあるのではないかと思うけど😅

以下のようなスクリプトを作って１つのアイコンイメージから
一気に作り出しました👍

```shell:resize.sh
#!/bin/sh
for size in 40 60 58 87 80 120 180 20 29 76 152 167 1024
do
    echo convert -resize $size $1 icon_$size.png
    convert -resize $size $1 icon_$size.png
done
```

自分古い人間なので ImageMagick 最強ですわ💪

###スクリーンショットの用意

コレはiPhoneで実際に動かした画面をスナップショットで大丈夫だと思ったら
画像サイズが異なるからダメって😱
なんでなん？

シミュレータを使うと大丈夫なのかな？
ということでシミュレータの Save Screen で画像を取り出して...
もダメでした😵

ここはまた ImageMagick さんにお願いして🙏

```shell-session
 convert -resize 1242x2208 IMG_4608.PNG screen.png
```

ところが何故かこれもNGに😫
調べると 1241x2208 サイズになってました😵‍💫

```shell-session
 convert -resize 1242x2208! IMG_4608.PNG screen.png
```

これでOKでした✌️

必要なスクリーンショットは以下
iPhone6.5インチ iPhone6.5インチ iPadPro 12.9インチ(3世代） iPadPro 12.9インチ(2世代） 
の４種類なのでスクリプトを作るほどのこともないかな

あとiPadProの２種類はどう違うのだろ🤔
そしてiPadProの画像はシミュレータの Save Screenがそのまま使えました😮‍💨

###iPad対応
iPad対応は考えていなかったのですが、公開時にはiPadでの動作の確認も必要になります。
今回のアプリは縦方向固定にしていたのだけど、iPadで動かすと固定になっていなかった😳

この問題はアプリの TARGET > General > Deployment Info > Device Orientation の設定だけだと
Info.plist 内の iPhone用の設定しか変更されないようでした。

```xml:Info.plist（編集前）
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
```

ここから ```UISupportedInterfaceOrientations~ipad``` 以下の内容を編集すると
iPadでも縦方向固定にできました。


```xml:Info.plist（編集後）
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
	</array>
```

##最後に
WWDC21で話が出ていたXcode Cloud の項目が App Store Connect にも増えていて
ますます活気づいてきている感もあり、今後の SwiftUI, Xcode の発展を楽しみつつ
ついて行ける限りはついて行きたいものです🤗


###追記
Guideline 2.1 - Information Needed
に引っかかり、Demo Video を取って再審査にかけました😰


無事に[公開](https://apps.apple.com/jp/app/神器羅針盤/id1571603819)されました🤗
UnityWebRequestはちゃんとSSL証明書エラーを吐いてくれるか

ふと、「中間者攻撃なりBCGハイジャックなり、なんらかの理由で意図したところにアクセス出来てなかった場合、unityちゃん(正確にはUnityWebRequest)はちゃんとエラー吐いてくれるか」が猛烈に気になったため確認した。
なお、特別に証明書のインストール等はしておらず、Windows10環境です。

## とりあえず結論
当該記事での検証手順であれば、ちゃんとエラーになった。

## 手順(簡易)
### 適当なドメインを取る
当該記事では `example.dev` で説明します。勿論、こんな買ったら高そうなドメインは自分は持ち合わせておりません。

### サブドメ2つ振る
test1.example.dev
test2.example.dev
とします。

### nginxサーバを2台立ててlet's encryptでSSL対応
手順は割愛します。ぐぐればすぐ出てくるのでそんなに難しくないです。

### 立てたサーバにさっきとったサブドメでAレコード設定
ここまでやったらブラウザで
https://test1.example.dev
https://test2.example.dev
アクセスして正常を確認します。

### 俺(私)たち入れ替わってるー
入れ替える必要まではないんですが
test1.example.devの向き先IPをtest2サーバのIPに書き換えます。
反映されたあたりでブラウザアクセスして
`NET::ERR_CERT_COMMON_NAME_INVALID`
あたりが出ることを確認します。

## unity
HTTPメソッドは何でも良いので `UnityWebRequest` 使って `SendWebRequest` します。
`Curl error 51: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_CN_MISMATCH`
こんなエラーが出ます。
`isNetworkError`のほうがtrue返すようになりますが、中身吐いても`Unknown Error`です。

## 結論(2回目)
ちゃんとエラーになる。

## 余談
なんとなく勘付く方もいるかと思いますが、基本的にOSにインストールされている証明書を使うようです。
軽く調べた限りだと、Win/Mac/iOSあたりだとOSにインストールしさえすれば自己署名でもいけるらしいのですが、
androidはアカンようで、その場合検証用の実装を自前で書く必要があるようです。
もしSSL関係でブラウザではいけるのにunityでは証明書の検証エラーが出るような場合この辺りを踏んでるかもしれませんね。
CLVM 公式ドキュメントメモ

# 概要

chialisp に関する
https://github.com/Chia-Network/clvm/blob/main/docs/clvm.org
の個人的解釈メモ。
ここではchialispの導入方法などについては扱いません。


### list 系操作演算子

#### c (cons)
```
(c A B)
```
引数は二つ。二つの引数をlistにして返す

#### f (First) 
```
(f X)
```
引き数は一つ。listを引数にし、listの最初の要素を返す。

#### r (Rest)
```
(r X)
```
引数は一つ。listを引数にして最後の引数を返す

#### l  (ListP) 
```
(l X)
```
 引数はひとつ。引数がlistなのかそれ以外の値なのかをかえす。listであればtrue,値であればfalse

### 制御構文

#### i （IF）
```
(i A B C)
```
引数は三つ。最初の引数が評価されてtrue（0以外）になった場合にBが評価され、falseの場合はCが評価される。

#### x (Raise)
```
(x X Y...)
```

引数は任意。例外を発生させる。

#### = (Equal) 
```
(= A B)
```
比較演算子の== と同等。AとBが同じ値である場合にtrueを返す


#### > (大なり) 

```
(> A B)
```
比較演算子の　> と同等。 A > B を評価して true/falseを返す

#### >s :: *greater than bytes* 

```
(>s A B)
```
比較演算子の>と同等。>と違うのは引数をバイトとして解釈するという点。

### 定数

#### q (Quote)
```
(q X)
``` 
引数を評価せずにそのまま返す。関数を定義できる。

### 演算子

#### + （加算）

```
(+ a0 a1...)
```

通常の加算とおなじ。引数の数は任意。引数全ての合計をかえす。

####  -  （減算）

```
(- a0 a1...)
```
通常の減算と同じ。引き数の数は任意。最初の引数に対して残りの引数を引いた数を返す

#### * (積算) 
```
(* a0 a1...)
```

掛け算。引き数の数は任意。引数全ての積を返す

#### divmod （剰余）
```
(divmod A B)
``` 

引数は二つ。二番目の引数に対して一番目の引数で割り算を行い、余りを返す。


### ストリーミング演算子

ハッシュ関数

#### sha256 
```
(sha256 A)
``` 

引数に対してsha256でハッシュ計算した値を返す


### ecdsa 演算子

以下はまだよくわからない（英語は原文）

#### point_add
```
(point_add a0 a1 ...)
``` 
takes an arbitrary number of bls12_381 points and adds them

#### pubkey_for_exp 
```
(pubkey_for_exp A)
```

turns the integer A into a bls12_381 point
[Linux]VirtualBoxでCentOSのインストールを無限に求められる不具合

#はじめに
意外と困っている人がいたので、僕なりの対処法を記載しておきます

#起きたこと
VirtualBoxでLinuxを好きなように使えるように、CentOSをマウントしようとするも、予期せず終了しましたという表示がでて、最初からインストールを求められる×無限回数という事象が発生。

#対処法

###対処1
VirtualBoxの設定で、ハードディスクを光学より上にする
![スクリーンショット 2021-06-10 15.07.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128031/848b63de-4f80-8241-dec7-0e25bc1cd028.png)

###対処2
MacBookの設定にて、「セキュリティとプライバシー」→「アクセスシビリティ」でVirtualBoxにチェックする。

![スクリーンショット 2021-06-10 15.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128031/60bad002-331a-021e-6cbc-268949745764.png)


###対処3

対処1、2をしたうえで、ターミナルで以下のコマンドを実行。

```:terminal
% sudo virtualbox
``` 

これをした後に同じようにイントールすると、今度は予期せぬ形で終了することもなく完了するかと思われます！

#おわりに
他の対処法とかあったら教えて下さい！
【kotlin】アクションバー 戻るボタンを追加

#■戻るボタンをアクションバーに追加します。
![スクリーンショット 2021-06-10 14.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/eb536a5e-e7c2-b16b-a0ff-ce6a85bc463d.png)
左上の矢印これを押すと前の画面に戻るようにします。


画面遷移後のアクティビティに記述していきます。

###1
アクションバーに戻るメニューを表示する。
onCreate()の最後にコードを書く

■supportActionBar
アクションバーを表すプロパティ
Nullable型なので？.を使う

■.setDisplayHomeAsUpEnabled(true)
戻るボタンをsetする。

``` kotlin
override fun onCreate(savedInstanceState: Bundle?) {
 //アクションバーに戻るボタンを追加する。
  supportActionBar?.setDisplayHomeAsEnabled(true)
}
```

###2
■戻るボタンが押された時の処理

when文でもできるが分岐がないのでif文にしている。

戻るメニューのIDは最初からandroid.R.id.homeです。


``` kotlin
override fun onOptionsItemSelected(item:MenuItem): Boolean {
  var returnVal = true
  
   if(item.item.Id == android.R.id.home) {
    finish()
} else {
   returnVal = super.onOptionsItemSelected(item)
}
  return returnVal
```

これで完了です！！！！！！！
Discovery Premiumやってみた　〜Patterns編〜

Watson DiscoveryのPremiumプランで提供されている機能を使ってみました。
今回はPatternsというβ機能（as of 2021/06/10）です。

#Patternsとは
マニュアルによると
https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-facets&locale=ja#facetpattern

テキストや文字列のパターンをDiscoveryに学習させて、テキストを抽出する機能っぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/4d516b1b-ff2d-ce12-cc74-f06aa7fdc1f5.png)

**【得意なパターン】**
- ISOなどの規格番号
- 金額
- 日付

**【ちょっと苦手なパターン】**
以下のような場合は、辞書が向いている。
- 色々な製品の名前
- 特定のカテゴリーに属するいろんな言葉

**【Patternsの制約事項】**
- β機能
- 英語のみ
- IBM Cloudでの提供のみ
- Document Retrieval と Conversational Search のプロジェクトのみ

#やってみた
###0. 前提
DiscoveryのDocument Retrievalというタイプのプロジェクトを作り、食品に関するアンケートコメントのサンプルデータを投入済み。

本当は、ISO規格のように電話番号とかメールアドレスとか規則的に書かれているテキストを抽出するのが得意そうだけど、ここはあえてアレルギーに関するテキストを抽出できるか試してみます。

例えば、`allergic to xx` というパターンを学習させて、色々なアレルギーが抽出できるか試してみます。


###1. Patternsの学習
まず、右側の「Improvement tools」より「Teach domain concepts」を開き「Patterns Beta」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/a7e9551c-efa5-15e0-c431-edb4da5373e3.png)

右上の「New」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/a5acd485-a4cb-d7ed-8681-44fe3c42d795.png)

1. まず「Pick 10 random documents for me」か「I will pick documents to use from: 
Collection」で学習に使いたい文書を選びます。アレルギーに関するテキストを抽出したいので自分で選ぶ方を選択しました。
2. 次に検索窓で「allergic」と入力し、アレルギーについて記述されている文書に絞り込みます。
3. 最後に学習に使いたいサンプル文書をいくつか選択します。
3. 終わったら右上の「Next」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/0962dc3f-8330-a232-cacb-1d672298ec90.png)

適当にPatternsの名前を入れて、言語はEnglishにする。
サンプル文が表示されるので、抽出したいパターン、以下の例では「allergic to milk」をハイライトします。
最初なので右側のロボットくんはまだ分からないという反応をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/36f93b43-df08-9071-8a75-d5eaa6b09238.png)

2〜3個のサンプルテキストに（そうなんです！2〜3個で良いんです！）同じように繰り返すと右側に「こんなのであってる？」という候補が出てきました。
「Yes」「No」で反応してあげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/db860bb5-a6c2-7f9e-6ee1-2aef456c8dd6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/eea0d3cd-a2e6-80de-df41-4a013870f84c.png)

さらにハイライトを繰り返すと、そのうち自動でハイライトしてくれるようになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/e30c0f83-cbc5-0084-d32a-0ba4246a6c78.png)

###2. Patternsの適用
一通り処理すると右上の「Save patterns」ボタンが押せるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/2a892f44-668e-1db1-f987-4fd5361bbb08.png)
どのフィールドにパターンを適用させたいかを選んで「Apply」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/c565db84-bf61-8fd2-3fd9-de82c751ab15.png)
裏で索引付が行われるので処理が終わるまで少し待ちます。

###3. Patternsの結果確認
検索画面で確認してみます。
同じパターンに当てはまる他のアレルギー情報も抽出してくれました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/089d16bc-cbcf-e541-cccf-522b7e903bc2.png)

##感想
辞書だと全ての単語を登録しないといけないけど、Patternsを使うとそのパターンに似たものを抽出してくれるので便利そう！
ただ、学習なのでたまに違うものも抽出される可能性もあるかも？
辞書のメンテナンスにも使えるかも。

##お断り
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
【JavaScript】汎用的なsmooth scroll（2021年）

スムーススクロールを実装する際、どのような技術や手順で作れば良いかいつも迷ってしまうので、備忘録としてまとめます。この記事ではnpmパッケージやjQueryなどのライブラリは使わずに実装します。

## 作成するスクロール

- 「ページの先頭へ戻る」的なページ最上部へ戻るボタン
- ページ内リンク

## 使用する技術

- [[Polyfill.io](http://polyfill.io/)]([https://polyfill.io/v3/](https://polyfill.io/v3/))
- [Element.scrollIntoView()]([https://developer.mozilla.org/ja/docs/Web/API/Element/scrollIntoView](https://developer.mozilla.org/ja/docs/Web/API/Element/scrollIntoView))
- [window.scrollTo]([https://developer.mozilla.org/ja/docs/Web/API/Window/scrollTo](https://developer.mozilla.org/ja/docs/Web/API/Window/scrollTo))

smooth srcollを標準APIで実現するには、IE11やSafari(Mac OS/iOS)が対応していない`behavior`オプションを使用するため、Polyfill.ioで`smoothscroll`という項目を選択したバンドル（URL）を作成します。

【例】（他に必要なpolyfillがある場合は適宜選択してください。）

[https://polyfill.io/v3/polyfill.min.js?features=smoothscroll](https://polyfill.io/v3/polyfill.min.js?features=smoothscroll)

## 実装

### ページ最上部へ戻るボタン

```js
const scrollToTop = () => {

  const anchorButtons = document.querySelectorAll('.js-scroll-to-top');

  if(anchorButtons) {
    anchorButtons.forEach((button) => {
      toTop(button);
    })
  }

  const toTop = (button) => {
    button.addEventListener('click', (event) => {
      // a要素のデフォルトの挙動をキャンセル。
      // button[type="button"]の場合は不要です。
      event.preventDefault();
        window.scrollTo({
          top: 0,
          behavior: "smooth"
      });
    });
  }
}

scrollToTop();
```

### ページ内リンク

```js
const scrollToId = () => {

  const anchorButtons = document.querySelectorAll('.js-scroll-to-id');

  if(anchorButtons) {
    anchorButtons.forEach((button) => {
      toIdElement (button);
    })
  }

  const toIdElement = (button) => {
    // アンカーリンクのhrefから、移動先の要素を取得。
    const targetId = anchor.getAttribute('href');
    const target = document.querySelector(targetId);

    button.addEventListener('click', (event) => {
      // a要素のデフォルトの挙動をキャンセル。
      event.preventDefault();
      target.scrollIntoView({
        behavior: "smooth",
      });
    });
  }
}

scrollToId();
```
WSLとWindowsのSSHフォルダをまとめる

WindowsからSSHするのとWSLからSSHするのは、基本的には別物として扱われることになっている。

フォルダが違えば、中に入っているconfigや鍵も異なるわけだから、当たり前だが正直面倒なことが多い。

そこで、シンボリックリンクを用いることによってSSHのフォルダを共有するという発想に至った。

まず、WSLの方の.sshファイルを削除する。中身がある人は移しておこう。

```bash
# {hoge} は 自身の当てはまるフォルダ名に変える。
$ ln -s /mnt/c/User/{hoge}/.ssh .ssh
```

こうすることによって、 WindowsのSSHフォルダがWSLでも利用することができるようになる。

configも鍵も共通で使えるので便利。

大丈夫だと思うけど、フォルダ権限には気を付けよう。
Django プロジェクトの始め方覚え書き（ローカルで Django の Welcome 画面が見れるまで）

Django プロジェクトを何度か立ち上げたので、自分用に立ち上げ方の作業を残しておきます。

環境はローカルが Windows10、本番が Ubuntu + Apache です。プロジェクト名を``mypro``、アプリ名を``myapp``とします。

今回はローカルで Django の Welcome 画面が見れるまでを記載します。

#仮想環境の立ち上げ（venv）
Python の仮想環境で有名なところですと、``venv``と``virtualenv``があります。

``venv``は Python3.3 以降では標準パッケージになっており、非常に使いやすいです。
``venv``と``virtualenv``の最も大きな違いと私が認識しているのは、

* ``venv``は Python のパッケージ内のため Python 自体のバージョン管理ができない
* ``virtualenv``はサードパーティのため Python 自体のバージョン管理ができる

というところかなと。

現状、私は基本的には Python3.x で全て作っているので、簡単に使える``venv``を使用することにします。

```bash
$ mkdir mypro
$ cd myapp
$ mkdir myvenv
$ py -m venv myvenv
$ myvenv\Scripts\activate
```

1行目でプロジェクトのディレクトリ作成、2行目でプロジェクトのディレクトリに移動、3行目で``venv``で作成する仮想環境のディレクトリを作成、4行目で仮想環境を作成、5行目で仮想環境立ち上げです。

#Django のインストール
次にDjango のインストールをします。ディレクトリは ``~/mypro``です。

```bash
$ pip install --upgrade setuptools
$ pip install --upgrade pip
$ pip install django
$ django-admin startproject mypro .
```

1, 2行目で``setuptools``と``pip``を最新版に更新し、2行目で``django``のインストール、3行目で Django プロジェクトを立ち上げています。

現状はこのようなディレクトリ構成になっているはずです。

```txt
mypro/
│  manage.py
├─mypro/
│      asgi.py
│      settings.py
│      urls.py
│      wsgi.py
│      __init__.py
└─myvenv/
```

#settings.py の設定

``mypro/settings.py``を修正します。

## 日本の環境に合わせる
言語と時間を日本に合わせます

```python:settings.py
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
```

## 本番用に環境変数を導入をする
ローカルと本番用で環境をわけるために、環境変数を導入します。

秘密キーなど、知られてはならないものもこちらに書きます。最終的にサーバー側でも作成する必要があるものです。

###django-environ をインストール

```bash
$ pip install django-environ
```

###settings.py を修正

```python:settings.py
from pathlib import Path
import os
import environ

BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY', str)
DEBUG = env.get_value('DEBUG', bool)
if DEBUG:
    ALLOWED_HOSTS = []
else:
    ALLOWED_HOSTS = ['*']
```

###.env を作成
``manage.py``と同じディレクトリに``.env``ファイルを作成し、``settings.py``内のSECRET_KEYを移す。

```txt:.env
DEBUG=True
SECRET_KEY=xxxxxxxxxx
```
空白があったり``'``などがあるとエラーになるので注意。

この``.env``をGitHubなどにアップしてしまうと大変なことになります。私は問い合わせのためのメールアドレスのパスワードをあげてしまって、数分後に気づいてすぐ削除しましたがとてつもない量のスパムメールを送信し始めてしまって、慌ててパスワードを変更した覚えがあります。

本番環境では``DEBUG=False``とします。

#runserver でエラーがないことを確認
ここまでで、ローカル環境で django のウェルカム画面が出ることを確認します。

```bash
$ py manage.py runserver
```

エラーがないと、下記のメッセージが出ます。

```bash
Starting development server at http://127.0.0.1:8000/
```

`http://127.0.0.1:8000/`にアクセスし、下記の画面が出てこれば成功です。
![django_welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1302521/1230997a-fb15-d24e-5c13-3cb1fdbd0a70.png)

次回はこちらをサーバーに移して動かすところを書きますね！
laravel モデルのテーブル名を取得する

# 目的

- laravelのモデルからテーブル名を取得する方法をまとめる

# 方法

- 下記のように記載することで`$tableName`にテーブル名が格納される。（下記ソースに記載されていないが、モデルが依存注入されているものとする。）

    ```
    $tableName = $this->モデル->getTable();
    ```

- モデルの`getTable()`を実行すればテーブル名が返される。

# 参考文献

- [https://github.com/laravel/framework/issues/1436](https://github.com/laravel/framework/issues/1436)
Rails で別オリジンのリクエスト with Cookie を受け付ける

別ポートの localhost で立ち上げた Nuxt (フロントコード) から Rails 側で開いた API へのリクエストが CORS 制約に引っかかったので対処。

gem を追加。

```Gemfile
gem 'rack-cors'
```

以下を追記。

```ruby:config/application.rb
config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:8000' # ポート番号はよしなに
    resource "*",
      headers: :any,
      methods: [:get, :post, :options, :head],
      credentials: true
  end
end
```

`credentials: true` をつけないと Cookie を扱えないようです。

https://qiita.com/yumikokh/items/b5fd604e12720027b4d5

https://qiita.com/mtoyopet/items/326ba62d485e9ef0dacd#cookie%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B

おしまい。
JavaScript　テキストアニメーション備忘録

#はじめに
JavaScriptでテキストアニメーションを実装してみたので、忘れないようにメモ程度に残しておきます。
CSSに関しては書かないので、JavaScriptのみの紹介になります。
かなりわかりにくいと思いますが、個人のメモ程度なのでご了承ください。
何度も投稿を続けて、わかりやすい記事が書けるように頑張ります。

#JavaScriptコード説明
HTMLコード

```
<h1 class='title'>ABC</h1>
```
JavaScriptコード

```
document.addEventListener("DOMContentLoaded", function () {
  const el = document.querySelector(".title");

  const str = el.innerHTML.trim().split("");

  el.innerHTML = str.reduce((acc, curr) => {
    curr = curr.replace(/\s+/, "&nbsp;");

    return `${acc}<span class="char">${curr}</span>`;
  }, "");
});
```

- 一行目でDOMがロードされた時にイベントが発火するようにする。
- "title"というクラスを持つ要素をelに代入する。
- elに対してinnerHTMLでelのHTML要素を取得し、trim()で全てのスペースを取り除き、split("")で文字列を一文字ずつ分割したものをstrに代入する。
- innerHTMLでelのHTML要素に、先ほど一文字ずつに分割したそれぞれに対して"char"というクラスを付与したspanタグを挿入していく。HTML内の半角スペースを検知した場合、&nbsp;という特殊文字に変換する。
- accuは累積した結果、currは現在の文字を表す。

以上の流れを簡単に表すと

```
ABCを取得
→前後のスペースを取り除いた上で"A", "B", "C"に分割
→<h1 class='title'><span class="char">A</span>BC</h1>
→<h1 class='title'><span class="char">A</span><span class="char">B</span>C</h1>
→<h1 class='title'><span class="char">A</span><span class="char">B</span><span class="char">C</span></h1>
```
あとはCSSでcharクラスが付与された時に働くアニメーションを設定すれば完成
機械学習勉強記録 重回帰分析

# 回帰と分類
回帰とは、入力変数xに対して、数値yを予測するものです。
「賃貸物件の面積、駅からの距離などに対応する家賃のデータ」という「教師」があり、その教師のデータを使って、面積や距離を入力した時に、未知のyを予測します。

同じ教師あり学習に「分類」というものがありますが、それは、入力変数xに対してカテゴリyを予測します。
これは、「犬はこんな特徴、猫はこんな特徴」という教師があり、その教師データにしたがって、顔の形や体重などを入力した時に、未知の動物を犬と猫に分類するという感じです。


# 重回帰分析とは
重回帰分析は、1つの目的変数を複数の説明変数で予測するというものです。
教師あり学習の「回帰」で使われます。

式にすると以下のようになります。

```math
y=w_0x_0+w_1x_1+w_2x_2+...+w_nx_n
```
*バイアス b を w0x0 と置いています。


## 具体例でわかりやすく
僕は「賃貸物件の家賃を予測する」という例で習ったので、その方法で説明します。
重回帰分析を、1つの目的変数（家賃）を複数の説明変数（面積、駅からの距離、寝室の数など）で予測するために使うとすると、

y = 家賃
x1 = 面積
x2 = 駅からの距離

が入ることになります。
では、w（重み：weight）は何を表すかというと、それぞれの説明変数xがどれぐらい家賃に影響するかを表す数字となります。
例えば、

```math
y=w_1x_1
```

という関数だったとして、yが家賃、x1が面積とする時、家賃50000円の物件が面積10坪だったとしたら、w1は5000という値を取りますね。
このw1が重みです。

これに、「面積」以外にも、「駅からの距離」という要素も考慮して、家賃を計算したい時、要素が二つあるので、重みも2つになります。

```math
y=w_1x_1+w_2x_2
```
駅からの距離は200メートルだとしたとき、
もしw2がw1と同じく5000だったら、y=50000+1000000=1050000となり、家賃105万円となってしまいます。
でも実際は、駅からの距離（メートル）がそんなに家賃に影響を与えることはありませんよね。
なので、w2を計算して、求める必要があります。
Devise 利用下の db:seed で "Could not find a valid mapping" エラー

Rails に Devise を入れ、いろいろいじっている時に以下のエラーに遭遇。

```
$ docker-compose run web rake db:seed

Could not find a valid mapping for #<HogeHoge ~>
```

routes.rb に `devise_for` の指定がないといけない模様

```rb
Rails.application.routes.draw do
  # ...

  devise_for :hoge_hoges

  # ...
end
```

https://github.com/heartcombo/devise/issues/4580

おしまい。
Vue.js で爆速Webアプリ開発環境構築

# 概要
Vue.js を使って、サクッとローカルに環境構築をしてWebアプリの立ち上げを行う手順の備忘録。

# 前提
・初めて Vue を触るし、まだ環境構築もしていない人向け
・使用する Vue CLI のバージョンは Vue 3 を開発可能な CLI を使用
・記事投稿時点では、主要なUI系フレームワークがほぼ全て Vue 3 未対応なので、実際にアプリを開発していく際には Vue 2 になる可能性があります。

# 手順１：環境構築（Node.js のインストール）

### Node.js をインストール
まだマシンに Node.js をインストールしていない場合は、以下のサイトから「推奨版」のインストーラをダウンロード
https://nodejs.org/ja/

![nodeインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557654/3d425175-66c0-ac3d-f505-db3fe7521dc6.png)

Node.jsは、JavaScriptをサーバサイドで動かすための実行環境を提供するソフトです。
ダウンロードしたインストーラを開いて「はい、はい」ってやればインストールは完了します。

### Node.js がインストールされたかの確認
場所はどこでも良いので、ターミナルツールで以下を実行して、バージョンが返却されればインストール完了

```bash
# Node.js バージョン確認コマンド
node -v

# 何かしらバージョンの数字が帰ってくればOK
v14.17.0

# ついでに、npm バージョンも確認
npm -v

# バージョン返却されたらOK
6.14.13

```
※「npm」は node とセットで、勝手に一緒に入る別機能。プログラムやパッケージのインストール作業などに使用する。

# 手順２：環境構築（Vue のインストール）

### Vue CLI ツールのインストール
Vueでアプリを開発するときに作業を効率化するCLIツールとともに、Vueをインストールします。
グローバルインストールをオプションで指定しているので、マシンの固定の場所にインストールされるため、コマンド実行場所はどこでも構いません。

```bash
npm install -g @vue/cli
```
※インストールに失敗する場合は、先頭に `sudo` を付与して実行してみてください。以降のインストール時でも同様です。
※もうすでに 古い Vue CLI がインストールされている場合は、アンインストールしてから新しい CLI を再インストールすればOK👇

```bash
# 旧CLIツールを削除
npm uninstall -g vue-cli

# 新CLIツールをインストール
npm install -g @vue/cli
```

### Vue がインストールされたか確認

```bash
#　バージョン確認
vue --version

# バージョンが表示されたらOK
@vue/cli 4.5.13
```

# 手順３：Vue アプリの作成

node および vue のインストールが完了し、開発環境ができました。
では、VueのWebアプリを作成します。

### プロジェクト生成
適当な場所にフォルダを作り、そこでターミナルを立ち上げた後、
以下の Vue プロジェクト（Vue アプリ）を作成するコマンドを実行。

```bash
#　 「demo-app」という名前でプロジェクト生成
vue create demo-app
```
※諸々テキストが表示されますが、 「Xcode」に関すること以外でエラー表示がなければOK（XcodeはPCに入れてなければエラーが出ちゃいます）

### 動作確認

生成した場所に、指定したプロジェクト名のフォルダが生成されているので、ディレクトリ移動してアプリを起動してみます。

```bash
# 指定したプロジェクト名のフォルダへ移動
cd demo-app

# 開発モードで起動
npm run serve
```

" `Compiled successfully` " と表示されたら、Webブラウザから `http://localhost:8080` にアクセスすると以下の画面が表示されます。 

![Vueアプリ立ち上げ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557654/410aa128-3457-d1fb-87e9-ced35600cdd4.png)

これで Vue アプリの環境構築は完了。
エディタを立ち上げてソースの編集を行うと、リアルタイムにWeb画面に反映されます。

※ターミナルツールで「Ctrl＋C」を入力すると、起動しているアプリを停止できます。

# まとめ

以下の作業を行うことで、15〜20分ほどでVueアプリの基礎を生成できました。

- Node.jsを入れる
- Vue CLIを入れる
- createコマンドでプロジェクト生成

あとは、チュートリアル等を見ながら、ボタンやフォームを追加したらWebアプリとして完成します。
具体的な記法やコツなどはまた別記事で。

今回導入した CLI なら、Vue 2/3 両方のアプリが生成可能です。
初心者プログラマーの心得

業務プログラマーとなったばかりの人への心得を記載します。

# その仕事は必ずしもあなたがやらなくていい

仕事を振られたとき、大事なことは決められた期限までに決められた品質のものを納めることです。
あなたが作業することは、上記を満たした上で、達成したいことです。
期限までに求められる品質のものを作れる見込みがないなら、作業指示者に話して、終わらせれる人に終わらせてもらいましょう。
その上で、後で作業してくれた人の作ったものを確認するなり、教えを請えばよいのです。

# 悩む、調べる時間は最低限にしましょう

あなたがわからないことの殆どは、別の人なら数十秒で解決できます。
一時間調べてわからないなら、多くの場合解決できません。
自分はどういう考えで作業を進めたのか、今何がわからなくて困っているのか、を、明確にして、別の人に聞きましょう。
困っているから力を貸してほしいと言われて嫌な気持ちになることはあまりないです。
ただし、すごく忙しそうにしている人、残業がかさんでいる人は避けてあげてください

# 作ったものは細かく確認しましょう

例えばあなたが3,000行のプログラムを書く場合、書き上がったときにそれが正しく動く可能性は0です。
必要な機能を細分化し、一つの機能を作成したら、それが正しく動くかテストするようにしましょう。
（テストの自動化をするのがベストです。テスト自動化は、熟練のプログラマーより、未熟なプログラマーに対して、より効果を発揮します。
あなたは、作る過程で何度もテストを実施し、そこで発覚した問題を解決するということを繰り返さないと行けないからです。）
テストが実施されていないプログラムをいくら書いても、管理者側から見たら進捗0です。

# 進捗は数値で報告しましょう

進捗を順調です、などと報告しても、主観なので判断できません。
機能が10あるうち、3機能はテスト完了、1機能は今作業中ですと、報告してもらえば、進捗は明らかです。

# 作成中でも、定期的にプログラム見てもらいましょう

あなたがうまくかけている、と、思っているプログラムは他の人からしたら、指摘が満載です。
それらは後で修正する必要があります。
定期的に、プログラムを見てもらい、指摘を受けて直しましょう。
指摘を受けた問題を以降の作業で繰り返さなければ、その分の修正時間を削ることができます。

# コメントは書かなくてもわかるように製造する

初心者向けの勉強サイトや書籍には、ソースコードにコメントがいっぱい書いてあるので、それが当たり前と思ってしまうことがあります。
いっぱいコメントが書いてある状態は、普通にプログラミングできる人から見たら、どう感じるか。
こんな感じです。
 
この/*時間、空間的に近いことを表す*/記事/*今見ている初心者プログラマーの心得の記事*/は、初心者/*経験、技術の浅いものの者*/向けに業務/*対価をもらって仕事をすること*/でプログラミング/*アプリケーションなどを作ること*/をする上での心得/*知っておいたほうが良いこと*/を記載しています


大袈裟ではなく、本当にこんな風に感じます。

こう書いてくれればいいのです。

>//この記事について
>この記事は初心者向けに業務でプログラミングする上での心得を記載ています。

# とはいえ丁寧に書かないといけないコメントもある

コメントは書かなくてもいいと書きましたが、しっかり書かないといけないコメントもあります。

- APIコメント
- 歪な設計になった部分

APIコメントとは簡単に言えばあなたが作った部品の**使い方**マニュアルです。
使い方マニュアルですので、どう作っているか、ではなく、どう使えばいいか、使ったら何をするかを書きます。

歪な設計になった箇所とは、
例えばシステムはわかっていない上司に言われて仕方なく作ったソースコードや
時間がなくて最適な実装方針が見つけられなかった箇所、創って動きはするけど、原理がわかっていない箇所などです。
これらは素直に、
 〇〇という方法もあると思うが、上長からのし時により、実装
 ググった結果を貼り付け。どのような処理なのか理解していない。
などとコメント記載してください。
このコメントがないと、あとから見た人が、なんでわざわざこんなことをしているんだろう？
なにか意味が合ってこんな創り方してるんだよな。でもなんだろう？
と、頭を抱えますよ。


# 報連相をちゃんとしろはおかしい

本筋とは話がずれますが、報連相をちゃんと上げろという管理者がいます。
本来チームの管理は管理者の仕事です。
管理者は報連相をしてもらうのではなく、状況の聞き取りをすべきです。
そのための仕組みとして、日次のミーティングや、積極的なメンバーへの声掛けなどをやるべきであって、
メンバーの報連相に任せるというのは、管理業務の放棄です。
とはいえ、そういうことを言ってくる管理者はいますので、言われるように報連相上げておきましょう
【Rails】リアルタイムチャット機能実装（Action Cable）1/3

# 目的
Railsで作成したアプリに、`Action Cable`を用いてリアルタイムチャット機能を導入する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提

- アプリが作成されている。

# 手順

1. [はじめに](#はじめに)
1. [コントローラーの作成](#コントローラーの作成)
1. [モデルの作成](#モデルの作成)
1. [ルーティングの設定](#ルーティングの設定)
1. [アクションの定義](#アクションの定義)
1. [ビューファイルの作成](#ビューファイルの作成)

# はじめに

今回はかなり長くなってしまうので、3回に分けて投稿させて頂きます。
1回目の今回は、アプリの下準備としてチャット機能実装、
2回目は、`Action Cable`を用いての実装、
3回は、本番環境で使用するための実装をしていきます!

# コントローラーの作成

では早速始めていきます!

今回のアプリには画面の遷移は必要ないので、newアクションを指定してコントローラーを作成します。
newと指定することで`new.html.erb`も生成されます。

```:ターミナル
% rails g controller messages new
```

# モデルの作成

次はモデルの作成です!

```:ターミナル
% rails g model message text:text
```

モデルの作成時にmessagesテーブルにtext型でtextカラムを追加しています。

```:ターミナル
% rails db:migrate
```

マイグレーションも忘れずに!

# ルーティングの設定

続いてルーティングの設定です。
`new`と`create`アクションのみ設定します。

```ruby:routes.rb
Rails.application.routes.draw do
  root 'messages#new'
  resources :messages, only: [:create]
end
```

# アクションの定義

次はアクションの定義です。

```app/controllers/messages_controller.rb
class MessagesController < ApplicationController
  def new
    @messages = Message.all
    @message = Message.new
  end

  def create
    @message = Message.new(text: params[:message][:text])
  end
end
```

# ビューファイルの作成

最後にビューファイルの作成です。
メッセージの一覧とフォームを表示させます。

```html:app/views/messages/new.html.erb
<%= form_with model: @message do |f| %>
  <%= f.text_field :text %>
  <%= f.submit '送信' %>
<% end %>
<div id='messages'>
  <% @messages.reverse_each do |message| %>
    <p><%= message.text %></p>
  <% end %>
</div>
```

これで準備は完了です!

# 最後に

以上で下準備は完了です。
次回は`Action Cable`の実装を行っていきます。[【Rails】リアルタイムチャット機能実装（Action Cable）2/3](https://qiita.com/oak1331/items/7c2d41f3d2e2f06925ce#message_channeljs%E3%81%AE%E7%B7%A8%E9%9B%86)
では。
Rustで4倍精度を利用するメモ

## Rustで128bitの浮動小数が使えるようなので、そのメモ。

使うのは、f128というクレート
<https://docs.rs/f128/0.2.9/f128/>
キャストする際に、`as f128`は使えないようなので、多少めんどくさい。
とりあえず、前の記事[^1]のコードを128bit化したもの。

```Rust
use std::env;
use f128::f128;
use ::f128::ffi::sqrtq_f;


fn main() {
    let argc = env::args().len();

    if argc != 2 {
        println!("need exactly single argument");
        println!("usage: /path/to/get_pi2 num_division");
        std::process::exit(1);
    }
    let num_division = env::args()
        .nth(1)
        .map(|arg| arg.parse::<u32>())
        .unwrap()
        .unwrap();

    println!("num_division: {}", num_division);

    let dx = f128::from(1.0) / f128::from(num_division);
    let mut area =f128::from(0.0);

    for i in 0..num_division {
        let x = (f128::from(i)  + f128::from(0.5)) * dx;
        unsafe{
        area += ::f128::ffi::sqrtq_f(f128::from(1.0) - x * x) * dx;
        }
    }

    println!("pi is calclated to be  {}", area * f128::from(4.0));
    println!("while the actual pi is {}", std::f64::consts::PI);
    println!("error is  {}", f128::from(std::f64::consts::PI)- area * f128::from(4.0));
}
```



[^1]: <https://qiita.com/tnagai-github/items/a2d6afe0bdd4e7cc26fc>


- 任意精度計算もあるらしいです:
<https://qiita.com/termoshtt/items/338549b9bf3aba6a5def>
Spring-Boot メインクラスが見つからない

EclipseでSpring Bootのプロジェクトを実行しようとした時、以下のエラーメッセージがコンソールに出力されました。

**エラー: メイン・クラス ○○ が見つからなかったかロードできませんでした**

「実行 ／ デバッグ の構成」の「クラスパス」タブで、「一時 JAR を使用してクラスパスを指定する（クラスパスの長さ制限を避けるため）／Use temporary jar to specify classpath (to avoid classpath length limitations)」をチェックして起動すると、エラーが解消され、アプリケーションを起動できました。

以下のStackOverflowの投稿で見つけました。

https://stackoverflow.com/questions/11235827/eclipse-error-could-not-find-or-load-main-class

Eclipse 4.9で導入された機能でした。

https://www.eclipse.org/eclipse/news/4.9/jdt.php
Vue.js(Nuxt.js) v-if使用時$refsがundefinedになってしまう時の対処法

Vue.js(Nuxt.js)にて、 `v-if`使用時に`$refs`がundefinedになってしまう時の対処法になります。

## v-if使用時$refsがundefinedになってしまう

```vue
<template>
  <div>
    <input v-if="isInputName" ref="inputName" type="text" name="name" />
    <button @click="inputFocus">編集</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      isInputName: false
    }
  },
  methods: {
    inputFocus() {
      this.isInputName = true
      const inputName = this.$refs.inputName
      inputName.focus()
    }
  }
})
</script>

```
上記のコード例ですと、`TypeError: Cannot read property 'focus' of undefined`と言うエラーが出ます。
`v-if`はレンダリングされないので、`$refs`では取得できずに`undefined`となる為です。
`v-show`に変更すれば`undefined`にはなりません。

https://jp.vuejs.org/v2/guide/conditional.html

## v-ifのレンダリングを待つことで解決

`v-if`によるレンダリングを待つことで解決することができます。

### setTimeout

```vue
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      isInputName: false
    }
  },
  methods: {
    inputFocus() {
      this.isInputName = true
      setTimeout(() => {
        const inputName = this.$refs.inputName
        inputName.focus()
      }, 100)
    }
  }
})
</script>
```
`setTimeout`で処理を遅らせることで、$refsがundefinedになるのを防げます。

### async/await

```vue
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      isInputName: false
    }
  },
  methods: {
    async inputFocus() {
      await (this.isInputName = true)
      const inputName = this.$refs.inputName
      inputName.focus()
    }
  }
})
</script>
```
`async/await`で`v-if`のレンダリングを待つことでも対応できます。
Laravel エラー辞書(自分用)

# PHP Error:  Class "Post" not found in Psy Shell code on line 1

PHPのエラーだが、対話型シェル（oho artisan tinker）でモデルを触ろうと思っても、反応しない

####解決策：$ composer dump-autoload

これに関しては、コード一発で解決する。
詳しくないが、Vender配下の当該ファイルにファイルパスが自動的に追加されるらしい。

```.bash

composer dump-autoload

```


# Class "App\Http\Controllers\DB" not found


絶対にあるはずのが、claaが見つからないケース

####解決策：名前空間の追記

vnder内のLaravelのDBクラスまでの、名前空間を追記してやる。
`use Illuminate\Support\Facades\DB;`

```PostController.php



<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; #　←　コレ

```

#Target class [PostController] does not exist.

コントローラが見つからない。

####解決策①：ルートのpassを確認
web.phpのnamespaceを完全にに指定する。
`App\Http\Controllers\`を追加して完全に指定

```web.php

Route::get('/home', 'HomeController@index')->name('home');

```

```web.php

Route::get('/home', 'App\Http\Controllers\HomeController@index')->name('home');

```

#`Illuminate\Database\QueryException ` 

Laravelの.envに記載されているDB情報のMYSQLに接続できない。


```.zsh

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:692
    688▕         // If an exception occurs when attempting to run a query, we'll format the error
    689▕         // message to include the bindings with SQL, which will make this exception a
    690▕         // lot more helpful to the developer instead of just the database's errors.
    691▕         catch (Exception $e) {
  ➜ 692▕             throw new QueryException(
    693▕                 $query, $this->prepareBindings($bindings), $e
    694▕             );
    695▕         }
    696▕ 

```

####解決策①：.envの記載内容を確認する。

####解決策②：MYSQLでデータベースを作成する

```.zsh

# mysql serverを立てる
mysql.server start

# rootユーザーにログインする 
mysql -uroot  

```

```.sql
-- rootで、userを追加する (name:"ryo", password:"0320")
create user 'ryo' identified by '0320';

-- rootはフルアクセスなので、ryoにデータベースを作成する権限を与える。
grant all on ryo. * to 'ryo';

-- 一旦rootから抜ける。
exit;

```

```.zsh
# ryoユーザーにログインする
mysql -uryo -p0320;

```

```.sql
-- データベースを作成する
create database ryo;

```
Workload IdentityでGoogle Coud Storageの署名付きURLを発行する

# やること
[google-cloud-ruby](https://github.com/googleapis/google-cloud-ruby) で、Workload Identityを使用した認証を行う場合に、 Google Cloud Storageの **署名付きURLの発行が行い得ない問題を解消するものである**

# 発生している問題

## 前提
- workload identityによって接続されるサービスアカウントを **ワークロードサービスアカウント** とする
- 筆者の環境では、GKEのnode上に存在するRuby on Railsにworkload identityによってワークロードサービスアカウントが接続される
- ワークロードサービスアカウントに対する権限の設定は問題がない。 (使用するStorage bucketに対して `roles/storage.objectAdmin`)

## 署名付きURLの発行を試みる

```ruby
storage = Google::Cloud::Storage.new
storage.bucket('任意のバケット名', skip_lookup: true).file('バケットに存在するファイル名', skip_lookup: true).signed_url(method: 'GET', expires: 300)

=> Google::Cloud::Storage::SignedUrlUnavailable (Service account credentials 'issuer (client_email)' is missing. To generate service account credentials see https://cloud.google.com/iam/docs/service-accounts)
```

`Google::Cloud::Storage::SignedUrlUnavailable` によって怒られる


## 一方でファイル情報は取得できる

念の為、権限が正しそうかを確認する

```ruby
storage = Google::Cloud::Storage.new
storage.bucket('任意のバケット名', skip_lookup: true).file('バケットに存在するファイル名')

=> #<Google::Cloud::Storage::File:0x00005624a9833208 @service=Google::Cloud::Storage::Service(project_id), @gapi=#<Google::Apis::StorageV1::Object:0x00005624a9887740 @bucket="hogehoge", @content_type="image/jpeg", @id="hogehoge/sample.jpeg/000", @kind="storage#object", ....>
```

OK

# なぜか

一部、妄想も含まれてるかもなので参考程度に...

- 環境に適用されるサービスアカウントの資格情報は、色々省略された情報しか保持されていない
- 多くのAPIを使用する場合には問題がないが、 **Google Cloud Storageの署名付きURLの発行に必要な資格情報が含まれないケースが有る**
- workload identityによって提供される資格情報ももしかしたら、省略されてしまっているのではないか

## 参考

https://stackoverflow.com/questions/50549176/google-cloud-storage-500-internal-server-error-googlecloudstoragesignedur

# 解決するには

## 1. ワークロードサービスアカウントの資格情報を直接所持させる

pod内にワークロードサービスアカウントの資格情報を保有させるというやり方。鍵の管理やサービスアカウントの資格情報は10年で切れるという点で、あまりお薦めはできない。

## 2. Cloud IAMCredentials signBlob　によって署名を作成して使用する

今回はこの方法を取る。署名を行う際に、直接APIを叩いて署名を実行するというやり方である。

署名付きのURLを発行するときに、 サービスアカウントの識別子(Issuer)を使用するが、環境に適用されるサービスアカウントの場合は取得できない。Issuerを環境に設定されているサービスアカウントとは別に設定した上で、署名付きURLを発行するときに指定する必要がある。しかし、[google-cloud-ruby](https://github.com/googleapis/google-cloud-ruby)にはIssuer **だけ** を外から流し込む事はできないので、署名ロジックも一緒に以下の様に変更する。

### サービスアカウントへの権限を追加

このやり方の場合、ワークロードサービスアカウントに `roles/iam.serviceAccountTokenCreator` の権限が必要となるため付与する

### 署名付きURLの発行方法を変更する

https://googleapis.dev/ruby/google-cloud-storage/v1.27.0/Google/Cloud/Storage/Bucket.html#signed_url-instance_method

ここの `Using Cloud IAMCredentials signBlob to create the signature` によるやり方で、 issuerとしてワークロードサービスアカウントを指定すればOK

## 参考

https://github.com/googleapis/google-cloud-ruby/issues/6268
Sequel ProとHerokuを接続する

# 目的
HerokuにデプロイしたアプリにおけるSequel ProとHerokuを接続する

# 開発環境
macOS: *Big Sur*

# 前提

- アプリが`Heroku`へデプロイされている作成されている。
[【Rails】Herokuでアプリをデプロイする方法](https://qiita.com/oak1331/items/4aaf30ecdd5caa827268)

# 手順

1. [はじめに](#はじめに)
1. [CLEARDB_DATABASE_URLの確認](#cleardb_database_urlの確認)
1. [Sequel Proに接続](#sequel-proに接続)

# はじめに

今回は`Sequel Pro`と`Heroku`を接続していきます。
`Sequel Pro`とは、MySQLのデータをGUI操作で管理するMac用のアプリです。

# CLEARDB_DATABASE_URLの確認

まずはHerokuにデプロイしたアプリの`CLEARDB_DATABASE_URL`を確認します。

```:ターミナル
% heroku config
```

出力された結果を確認してみます。

```:ターミナル
#省略
CLEARDB_DATABASE_URL:     mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
#省略
```

次へ進みます!

# Sequel Proに接続

続いてSequel Proを立ち上げ、先ほど確認した`CLEARDB_DATABASE_URL`を入力していきます。

![sequel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/d4c03f0d-76cf-0abe-02f1-a696aeed87c6.png)

まずは、`標準`を選択してください!
その後、`ホスト`、`ユーザー名`、`パスワード`、`データベース`を入力します!
この際、ポートは入力しなくても大丈夫です!

また、お気に入り登録しておくと、後からアクセスが便利になります。

最後に接続ボタンをクリックすれば接続完了です。

# 最後に

以上で、`Sequel Pro`と`Heroku`の接続は完了です。
では。
マークダウン記法（猫）

#マークダウン

```
####夏目漱石

<img width="100" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/b633d380-8fe1-3ece-fbb7-36a3c2dfb418.jpeg">

わがはいは**猫**である。
*名前はまだ無い。(Italic)*
`どこで生れた`かとんと~~けんとうがついている~~。けんとうがつかぬ。
>何でも薄暗いじめじめした所で
>ニャーニャー泣いていた事だけは
>記憶している。

<details><summary>夏目漱石とは</summary>Natsume Sōseki, born Natsume Kin'nosuke, was a Japanese novelist.</details>

[もっと夏目漱石を知りたい](https://ja.wikipedia.org/wiki)
```



####夏目漱石

<img width="100" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/b633d380-8fe1-3ece-fbb7-36a3c2dfb418.jpeg">

わがはいは**猫**である。
*名前はまだ無い。(Italic)*
`どこで生れた`かとんと~~けんとうがついている~~。けんとうがつかぬ。
>何でも薄暗いじめじめした所で
>ニャーニャー泣いていた事だけは
>記憶している。

<details><summary>夏目漱石とは</summary>Natsume Sōseki, born Natsume Kin'nosuke, was a Japanese novelist.</details>

[もっと夏目漱石を知りたい](https://ja.wikipedia.org/wiki)
UbuntuにChromeをインストールするもっとも簡単な方法

# 1. 公式サイトからdebファイルをダウンロードする
必ず保存をする

https://www.google.co.jp/chrome/

# 2. 以下のコマンドを実行する
ダウンロードしたディレクトリを右クリックしてターミナルで開き、以下のコマンドを実行する

```
sudo apt install ./google-chrome-stable_current_amd64.deb
```

# 3. 以上

# 参考サイト

https://linuxfan.info/google-chrome-on-ubuntu