OmniAICreator/Qiita-1.07M huggingface dataset:
【javascript】コンストラクタ関数で継承→メソッドは継承されない。classで継承→メソッドも継承される。

# はじめに
初学者です。MDN Web DocsでJavaScriptを勉強しています。
継承におけるコンストラクタ関数とクラスの違いを学びとして記載します。

https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects

# 内容
コンストラクタ関数を使用して継承した場合、子に親コンストラクタ関数のメソッドは継承されません。

```javascript:コンストラクタ関数の場合
// 親コンストラクタ関数
function Parent(age) {
  this.age = age;
};
// prototypeを使ってtestメソッドを追加
Parent.prototype.test = function() {
  console.log(`これはtest用メソッドです。`); 
};

//　子コンストラクタ関数
function Child(age) {
  Parent.call(age);
};
```

```javascript:コンソール
Child.prototype.test
=> undefined
// testメソッドは定義されていないと表示される
```

以下のような方法でメソッドを継承させる必要があるようです。
[Teacher()のプロトタイプ とコンストラクタの参照への設定方法](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/Inheritance#setting_teachers_prototype_and_constructor_reference "MDN Web Docs:JavaScript での継承")


しかし、以下のようにクラスを使用して継承した場合、子クラスは親のメソッドも継承します。

```javascript:test.rb

// 親クラス
class Parent {
  constructor(age) {
    this.age = age;
  }

  test() {
    console.log(`これはtest用メソッドです。`);
  }
};

//　子クラス
class Child extends Parent {
  constructor(age) {
    super(age);
  }
}
```

```javascript:コンソール
Child.prototype.test
=> function test()
// 子クラスにtestメソッドが継承されている
```
# 学び
上記の様な点からコンストラクタ関数よりもクラスを使っていったほうが望ましいな、と思いました。
[Linux]コマンドまとめ

# はじめに
本記事は、Linuxについてまとめたものです。
学習次第で、追加投稿していくかと思います。

# Linuxについて
`Linuxコマンド`とは
・PCへ操作を命令する為のコマンド。
・ターミナルでの入力でPCに多くの命令を行う。

`Linux`とは
・「Mac OS」「Windows XP」「Windows 10」などと同じOS。

＊OSとは、コンピューターの全てのハードウェアを管理しているソフトウェアのこと。

# Linuxコマンド一覧

|コマンド|内容|
|---|---|
|pwd|カレントディレクトリのパスを表示するコマンド|
|cd|ディレクトリを移動する時のコマンド|
|ls|ディレクトリやファイルの一覧を表示するコマンド|
|cp|ディレクトリやファイルのコピーをする時のコマンド|
|rm|ディレクトリやファイルを削除する時のコマンド|
|vi|エディタの起動やファイルの作成をする時のコマンド|
|rpm|パッケージのインストールをする時のコマンド|
|make|ソースファイルをコンパイル（翻訳）する時のコマンド|
|mv|ファイルを移動する時のコマンド|
|clear|操作している行を一番上に表示にするコマンド|
|mkdir|そのままディレクトリを作成する時のコマンド|
|touch|何も入っていないファイルを新規作成するコマンド|
|rmdir|ディレクトリを削除するコマンド|
|find|ファイルやディレクトリを検索するコマンド|
|cat|ファイルの閲覧をする時のコマンド|
|diff|２つのファイルを比較し、異なる箇所を出力するコマンド|
|grep|ファイルの文字列に対して正規表現を使って検索し、表示するコマンド|
|chmod|ファイルの権限を設定する時のコマンド|
|chown|ディレクトリやファイルの所有者を変更するコマンド|
|history|コマンド入力の履歴を表示するコマンド|
|ln|ファイルのリンクを作成する時のコマンド|
|man|コマンドラインで使用するコマンドのマニュアルを参照するコマンド|
|apropos|キーワードを指定し、それに関連するコマンドを検索する時のコマンド|
|less|ファイルを１画面ずつ表示する時のコマンド|
|more|ファイルを１画面ずつ表示する時のコマンド|

＊「less」は「more」の上位互換と言われています。

# 終わりに
今回、学習を進める中で、
いろんなコマンドを知りたくなり、本記事を投稿いたしました。
今後、使えるコマンド、そこまで必要のないコマンドを見極め、
効率&コスパの良いエンジニアになれるよう工夫してまいります！！
[Winエラー] プロバイダはローカルのコンピュータに登録されていません。


ADOでAccessからデータを読み込んでいたが、別の環境PCでエラーになってた。


### 解決方法

プラットフォームターゲットをAnyからx86に変更すると直るという記事。
https://thinkami.hatenablog.com/entry/20101013/1286987450


### 解決方法２

そもそもドライバーを入れなさい的なこと。
どれをインストールしてもらうのかは、結構判断が難しい。

https://answers.microsoft.com/ja-jp/msoffice/forum/all/vb6%E4%BD%9C%E6%88%90%E3%83%97%E3%83%AD%E3%82%B0/ab2f486f-9e85-4298-aba4-86a69fb9894e

Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント
https://www.microsoft.com/ja-JP/download/details.aspx?id=54920
copier.Copyで変更できない構造体間のコピーには中間構造体を用いるとよい

# 対処方法

```go
package main

import (
	"fmt"
	"github.com/jinzhu/copier"
)

// 変更してはいけない START

type Domain struct {
	Name string
	Age int
	Weight float32
	BodyHeight float32

}

type OutSider struct {
	Name string
	Age int64
	BodyWeight float64
	Height *OutSiderHeight
}


type OutSiderHeight struct {
	Height float64
	BodyHeight float64
}

// 変更してはいけない END

// ポイントはコピー先と全く同じ名前、型の構造体にすること
type Middle struct {
	Name string
	Age int
	Weight float32 `copier:"BodyWeight"`
	BodyHeight float32 `copier:"-"`
}

func(m *Middle) Height(h *OutSiderHeight) {
	if h != nil {
		m.BodyHeight = float32(h.BodyHeight)
	}
}


func main() {
	var err error
	outSider := &OutSider{
		Name: "sasakuna",
		Age: 30,
		BodyWeight: 23.95,
		Height: &OutSiderHeight{
			Height: 168.9,
			BodyHeight: 99.999,
		},
	}
	domain1 := Domain{}
	domain2 := Domain{}
	
	// このままだと`Weight`と`BodyHeight`がコピーできない
	err = copier.Copy(&domain1, outSider)
	fmt.Println("Domain: ", domain1)
	fmt.Println("Error: ", err)
	
	// 構造体をほかのものと見せかけることでタグを外付けできる
	err = copier.Copy((*Middle)(&domain2), outSider)
	fmt.Println("Domain: ", domain2)
	fmt.Println("Error: ", err)
}

```
[PlayGroundで試す](https://play.golang.org/p/n_YzZuRYxl9)

## もう少し詳しく
### 対処できないケースがあります

以下のケースでは、`Domain`の`Height`がコピーされません。
ポイントは、変更してはいけない構造体間で同じ名前なのにcopierでは自動的に変換できないケースです。
特に記載はしませんが一応二つ中間構造体を用意し、`Copy`を二回行えばできなくはないです。

```go
package main

import (
	"fmt"
	"github.com/jinzhu/copier"
)

// 変更してはいけない START

type Domain struct {
	Name string
	Age int
	Weight float32
	Height float32

}

type OutSider struct {
	Name string
	Age int64
	BodyWeight float64
	Height *OutSiderHeight
}


type OutSiderHeight struct {
	Height float64
	BodyHeight float64
}

// 変更してはいけない END


type Middle struct {
	Name string
	Age int
	Weight float32 `copier:"BodyWeight"`
	Height float32 `copier:"Height"`
}


func main() {
	var err error
	outSider := &OutSider{
		Name: "sasakuna",
		Age: 30,
		BodyWeight: 23.95,
		Height: &OutSiderHeight{
			Height: 168.9,
			BodyHeight: 99.999,
		},
	}
	domain1 := Domain{}
	domain2 := Domain{}
	
	err = copier.Copy(&domain1, outSider)
	fmt.Println("Domain: ", domain1)
	fmt.Println("Error: ", err)
	
	err = copier.Copy((*Middle)(&domain2), outSider)
	fmt.Println("Domain: ", domain2)
	fmt.Println("Error: ", err)
}

```
[PlayGroundで試す](https://play.golang.org/p/oKa9GDC5ZoD)

# さらに詳しく
内容自体は以上となっていますが、なぜこのようなことをしようとしたかについて説明していきたいと思います。

### 自動生成コードと依存関係問題の板挟み
依存方向を統一したコードを書こうとすると、必ずデータのパース処理というものが発生してくるかと思います。

その場合、まず変換を行うような層であれば、ドメインを変換することは基本的に許されないかと思います。またこれを許可した場合であっても、今回の例でいうところの`OutSider`にあたる外部の構造体は複数存在することが予測され柔軟に対応することはできません。

ならばOutSiderをと思っても、これらは大抵外部のライブラリで変更することはかないません。(今回はGrpcを使ってみていたのですが、これも自動生成なので変更は容易ではありません。)

そこで、今回はGoの名前の違う構造体であっても、名前と型が一致していれば直接変換可能な特性を生かして可能な限り簡単に変換できる方法を提案してみました。

### 実際のところ
とはいえ今回の手法は、構造体のネストがあまり深くないからこそ実現できたものです。
結局、ネストが深いと手間がかかることは避けられなそうなのですが、そのあたりの調査はまた別の機会に行いたいと思います。
【Python】動的な引数のデフォルト値をなぜNoneにするのか

# 前置き
Pythonで機械学習とか深層学習をやってます。Python歴は3年目くらい。まだまだ日々勉強です。

普段開発したりするときPytorchとかフレームワークのコードをよく眺めている訳なんですが、たまに気になっている事がありました。
**なんでデフォルトの引数をNoneにして、その後何かしらの値を代入するのか？初めから何かしらの値をデフォルト値にすればいいじゃないか**と。
例えば、`Pytorch`の`Resnet`実装に関する以下の[コード](https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py)とか。

```python
class BasicBlock(nn.Module):
    def __init__(
        self,
        ...(その他引数省略)
        norm_layer: Optional[Callable[..., nn.Module]] = None
    ) -> None:
        super(BasicBlock, self).__init__()
        if norm_layer is None:
            norm_layer = nn.BatchNorm2d

        ...(実装続く)
```
`norm_layer`をデフォルト値の引数では`None`で受けて、`__init__`本体の中で、`norm_layer = nn.BatchNorm2d`としています。
これ引数のデフォルト値を`nn.BatchNorm2d`にすれば良くない？と言うのが私の気になっていたポイントでした。

たまたま`Effective Python`を読んでいたら、そのヒントが合ったのでシェアしたいと思います！

# 結論
**Q. 動的な引数のデフォルト値をなぜNoneにした方が良いのか？**
**A. デフォルト値は実行時、モジュールがロードされた時ただ1度だけ評価されるため、動的な値に奇妙な振る舞いをもたらす可能性があるため**
*(参照: Effective Python ― Pythonプログラムを改良する59項目 p.48 一部改変)*

これだけだとよく分からん！って感じなので以下に例で解説します。

# 例
`data`を受け取り、json形式であればそれを辞書型に変換して、jsonでなければ空の辞書を返す関数を考えてみます。
### ダメな例
`default`のデフォルト値に`{}`を指定しています。

```python
def bad_decode(data, default={}):
    try:
        return json.loads(data)
    except ValueError:
        return default

foo = bad_decode('bad data')
foo['staff'] = 5
bar = bad_decode('also bad data')
bar['meep'] = 1
print("foo", foo)
print("bar", bar)
```

以下のような出力になると思いますよね？

```terminal
foo {'staff': 5}
bar {'meep': 1}
```
でもこれの結果は以下のような予想外な結果になります。ええぇ...

```terminal
foo {'staff': 5, 'meep': 1}
bar {'staff': 5, 'meep': 1}
```

### 良い例
最初に挙げたPytorchの例と同じように、本体の中で`default = {}`としています。

```python
def good_decode(data, default=None):
    if default is None:
        default = {}
    try:
        return json.loads(data)
    except ValueError:
        return default

foo = good_decode('bad data')
foo['staff'] = 5
bar = good_decode('also bad data')
bar['meep'] = 1
print("foo", foo)
print("bar", bar)
```
こうする事で期待通りの出力になります。

```terminal
foo {'staff': 5}
bar {'meep': 1}
```

# 番外編
最初に挙げたPytorchの例はclassだったので、classでの挙動も見てみます。
結論は、やはりデフォルト値はNoneにしないと予期せぬ挙動が起こります。

```python
class BadDecode:
    def __init__(self, data, default={}):
        try:
            self.data = json.loads(data)
        except ValueError:
            self.data = default


class GoodDecode:
    def __init__(self, data, default=None):
        if default is None:
            default = {}
        try:
            self.data = json.loads(data)
        except ValueError:
            self.data = default

bad_foo = BadDecode('bad data')
bad_foo.data['staff'] = 5
bad_bar = BadDecode('also bad data')
bad_bar.data['meep'] = 1

good_foo = GoodDecode('bad data')
good_foo.data['staff'] = 5
good_bar = GoodDecode('also bad data')
good_bar.data['meep'] = 1

print(bad_foo.data)
print(bad_bar.data)

print(good_foo.data)
print(good_bar.data)
```

```terminal
{'staff': 5, 'meep': 1}
{'staff': 5, 'meep': 1}

{'staff': 5}
{'meep': 1}
```

# 最後に
たまには`Effective Python`のような書籍を読み返してみるのも新たな発見があって面白いですね。
GormからRDSのmysqlデータベースにアクセスするとき

当たり前かもしれませんが、意外と情報がなくててこずったのでここにメモっておきます。


`user`: dbのユーザーネーム
`password`: dbのパスワード
`port`: 3306とかのポート
`dbName`: データベースの名前
`dbURL`: xxxx.xxxx.us-east-2.rds.amazonaws.com のようなrdsのURL


```sql_handler.go
import (
	"os"
	"time"

	"gorm.io/gorm"

	"gorm.io/driver/mysql"
)


// NewSQLHandler ...
func NewSQLHandler() *SQLHandler {
	user := os.Getenv("DB_USERNAME")
	password := os.Getenv("DB_PASSWORD")
	host := os.Getenv("DB_HOST")
	port := os.Getenv("DB_PORT")
	dbName := os.Getenv("DB_DATABASE")
	dbURL := os.Getenv("DATABASE_URL")

	var db *gorm.DB
	var err error
	dsn := user + ":" + password + "@tcp(" + dbURL + ":" + port + ")/" + dbName + "?charset=utf8&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
}
```

## 参考

こちらのレポジトリが参考になりました、ありがとうございました。

https://github.com/yasutakatou/goRDStest/tree/c095b486a0fd7366d324fc74d3162266cdd8c012
PCでAndroid端末を操作する（画面・音声のミラーリングとPC上での操作）

ドハマリしたのでメモ。

## 要件

- Windows10上にAndroid端末の画面を出力（ミラーリング）
- Windows10上にAndroid端末の音声を出力（ミラーリング）
- Windows10上でAndroid端末の画面を操作
- Android端末の対象はFire HD 8 Plus (多分Android9)

## 試した手法

| 名称 | 確認事項 |
|:-----------|:------------|
| [Vysor](https://www.vysor.io/)|<ul><li>無料版だと画質や音声の制限あり</li><li>有料版なら全てうまくいきそう</li></ul>|
| [ApowerMirror<br>スマホをリアルタイムに<br>ミラーリング/制御する](https://www.apowersoft.jp/phone-mirror)|<ul><li>ミラーリング実行時の操作が煩雑</li><li>無料版だとミラーリング画面にロゴ表示</li><li>無料版だとAndroidアプリ側の広告表示がエグい</li><li>有料版なら全てうまく行きそう</li></ul>|
| [スマホ同期管理アプリ <br>\- Windows にリンク <br>\- Google Play のアプリ](https://play.google.com/store/apps/details?id=com.microsoft.appmanager&hl=ja&gl=US)|<ul><li>Windows標準機能との組み合わせ</li><li>PC上からAndroidを操作する機能はごく一部機種のみに提供</li></ul>|
| [Genymobile/scrcpy: <br>Display and control your Android device](https://github.com/Genymobile/scrcpy)|<ul><li>非常に軽量、軽快</li><li>音声出力は未対応</li></ul>|
| [rom1v/sndcpy: <br>Android audio forwarding <br>\(scrcpy, but for audio\)](https://github.com/rom1v/sndcpy)|<ul><li>scrcpyでリンクされてる音声転送ソフトウェア</li><li>Android10以上が必要</li></ul>|
| [Bluetooth Audio Receiver](https://www.microsoft.com/ja-jp/p/bluetooth-audio-receiver/9n9wclwdqs5j)|<ul><li>MicrosoftStoreで配布されている</li><li>A2DP Sinkという機能で音声を転送するらしい</li><li>Windows 10 2004以降が必要</li><li>少し遅延がある</li></ul>|

## 最終的な構成

scrcpy + Bluetooth Audio Receiverの組み合わせに落ち着きそう。
導入手順は下記参照

- [Genymobile/scrcpy: Display and control your Android device](https://github.com/Genymobile/scrcpy)
- [scrcpy/README\.jp\.md at master · Genymobile/scrcpy](https://github.com/Genymobile/scrcpy/blob/master/README.jp.md) (日本語)
- [Windows10のスピーカーからスマホ音声、音楽を再生する方法\(Bluetooth経由\)｜sasimi｜note](https://note.com/sasimin/n/n7ab2e6891f8a)
- [Windows10でスマホの音を聞く方法 : memo](http://blog.livedoor.jp/frogtail_420-memo/archives/34386035.html)

動画キャプチャする場合はOBSの同期オフセットやFFMpegで遅延を解決するのが良いんじゃないでしょうか（未確認）
Herokuではポート番号を環境変数から取得する必要がある

## はじめに
Herokuでコンテナデプロイを試していたときにハマったので共有します。
コンテナデプロイについては、以下にまとめました。

[Herokuでコンテナデプロイを試した - Qiita](https://qiita.com/h_okawa0303/items/933862da0b32f2750674)

## 事象
「デプロイ出来た^^」と意気揚々と `heroku open`したところ、以下のエラーページに遭遇しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/53646fb1-c563-7944-4920-e09ab0343349.png)
ログを確認した所、以下のメッセージが見つかりました。

```shell:terminal
$ heroku logs --tail
...(省略)
2021-07-22T01:48:54.026828+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
...(省略)
```

## 解決方法
調べてみたところ、Herokuではポート番号が動的に生成されるため環境変数から取得する必要があるとのこと。

ポート番号を環境変数から取得する処理を追加しました。
今回の例はGoですが、別言語の場合は読み替えてください。

```go
port := os.Getenv("PORT")
if port == "" {
	port = "8000"
}
```

getting-startedを見ても、環境変数から取得していました。
[go-getting-started/main.go at main · heroku/go-getting-started](https://github.com/heroku/go-getting-started/blob/main/main.go#L13)

これで無事デプロイが成功しました。

## 参考
[HerokuでNode.jsアプリを実行する際のポート番号について | プログラマーになった 「中卒」 男のブログ](https://chusotsu-program.com/heroku-node-port/)
[Goで作ったアプリケーションをHerokuで動かす - Qiita](https://qiita.com/sunnyG/items/95f61a39ca3303a6c85f#%EF%BC%91%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E5%8F%97%E3%81%91%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%9C%E6%88%90)
[go-getting-started/main.go at main · heroku/go-getting-started](https://github.com/heroku/go-getting-started/blob/main/main.go#L13)
Docker で entrypoint.sh がうまく動かなかった件

しょーもないことでハマってしまったのでお焚き上げ。

## ハマったこと
``` Dockerfile:Dockerfile
FROM debian

ADD entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT /entrypoint.sh
```

``` sh:entrypoint.sh
#!/bin/bash

exec "$@"
```

よくある、シェルスクリプトを ENTRYPOINT に指定した Docker イメージ。(実際には `exec "$@"` の前で何かしらの処理を実行することになる)

これを動かしてみるが、なんと動かない。

``` console
$ docker build . -t tmp
$ docker run -it tmp echo foo  # 何も表示されない (本当は foo と表示されてほしい)
```

しかも何のエラーも出ないので困ってしまった。

ナンデ？？？

## 原因
Dockerfile の ENTRYPOINT の指定が shell 形式になっていたことが原因。

### shell 形式と exec 形式
Dockerfile の ENTRYPOINT や CMD には shell 形式 (shell form) と exec 形式 (exec form) の二種類があって、どちらでもビルドはできるが実行のされ方が異なる。[^cmd]

[^cmd]: [Dockerfile reference | Docker Documentation](https://docs.docker.com/engine/reference/builder/#cmd)

``` Dockerfile:shell形式
ENTRYPOINT /entrypoint.sh
```

``` Dockerfile:exec形式
ENTRYPOINT ["/entrypoint.sh"]
```

exec 形式は指定したコマンドと引数がそのまま実行されるが、shell 形式で指定した場合は `/bin/sh -c` に渡される。

つまり、shell 形式で `/entrypoint.sh` と指定した場合は以下と同じ振る舞いになる。

``` Dockerfile
ENTRYPOINT ["/bin/sh", "-c", "/entrypoint.sh"]
```

### なぜ shell 形式だと動かなかったか
shell 形式だと `shell -c` に渡されるため、冒頭のやり方だと実行されるコマンドがこうなってしまう。

``` console
$ /bin/sh -c '/entrypoint.sh' echo foo
```

これでは `/entrypoint.sh` プロセスに `echo foo` というパラメータが渡らないので、`echo foo` は実行されずに `/bin/sh` プロセスは正常終了してしまう。

## どうすればいいか
ENTRYPOINT や CMD は exec 形式で書こう。

``` Dockerfile:Dockerfile
FROM debian

ADD entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
```

``` sh:entrypoint.sh
#!/bin/bash

exec "$@"
```

``` console
$ docker build . -t tmp
$ docker run --rm -it tmp echo foo
foo
```
SQL 超初心者向け スッキリわかるSQL １章（はじめてのSQL）

# はじめに
<!-- 発端や概要を記載 -->
普段Railsいじってる時に、ログを見てSQLのクエリ発行されてる〜〜。あ〜こうやってデータベースからデータを〜〜って思ってたけど、そもそもSQL文・・・俺ちゃんと理解してんのか！？ってなり、備忘録かねてアウトプットします。本記事はさわりの部分のみ。
本記事は「スッキリわかるSQL入門ドリル」を参考としています。

# SQLとは？
`データベースを操作する専用言語`
おーかっこいい。これを覚えればデータ操作かんたんにできるのね！！

# データーベースとは
`データベースとは、検索や書き換え、分析などのデータ管理を目的としてた情報を蓄積したものです。`
### 現在広く使われているのがRDB（リレーションデータベース）
`複数の表の形式でデータを管理するリレーションデータベースという。`
Railsでつかってるやつだね！！理解できる！

ここで衝撃事実。`データベースそのものにSQLを送るわけではない。`
データベースはファイルなので、SQLで書いた命令文をかいても、検索や書き換えができないんですよ。

んじゃどこに送ってんの？
➩僕たちがSQLを送る相手は`データベース管理システム(DBMS)`と呼ばれるプログラム

`DBMS`は常に稼働しててSQLを待ち受けている。いわば弁慶みたいな存在（黙れ）
DBMSは届いたSQLの内容にしたがって、データーベースファイルの内容を検索したり、書き換えたり
する処理を実行してくれるんです。
そしてDBMSのうち、複数の表形式でデーターを取り扱うものを`RDBMS`という。
※RDBMSは色々あるらしい。MySQLとかSQLiteとか、製品によって使用できるSQL文の記載方法が若干違うみたいです。

<a id="#項目2"></a>
# SQLを実際に書いてみる
こんな家計簿テーブルがあります。
![スクリーンショット 2021-07-22 18.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183228/d3564be4-9ab3-b2af-e443-bbbb598524e7.png)

家計簿テーブルの出金額のみを取得したい時

```
SELECT 出金額
FROM 家計簿
```

全ての列を取得したい時
アスタリスクは「すべての列」という意味がある

```
SELECT *
FROM 家計簿
```

このように `SELECT`には目的とする列名。`FROM`は検索したいテーブル名を記述します。
ちなみに記載順番入れ替えしてみたらエラーとなりました。

## 条件付きの検索
3000より多い行だけを検索

```
SELECT 日付, 費目, 出金額
FROM 家計簿
WHERE 出金額 > 3000
```
## データの追加
テーブルにデータを追加
下記１行のレコードが追加される

```
INSERT INTO 家計簿
VALUES('2013-02-25', '居住費','３月の家賃', 0, 85000)
```
`INSERT INTOで追加先のテーブル`を、２行目の`VALUESで追加する値`を指定しています。

## データの更新
```
UPDATE 家計簿
SET 出金額 = 90000
WHERE 日付 = '2013-02-25'
```

WHERE（どこの？）で 日付指定して、 UPDATE（更新したい）で家計簿テーブルを
SET（変えたい部分）で 出金額 = 90000と指定

## データの削除
更新できるなら削除もできるよね！

```
DELETE FROM 家計簿
WHERE 日付 = '2013-02-25'
```

WHERE（どこの？）で 日付指定して、 DELETE FROM（削除）で家計簿テーブルを
これでレコードが消えます。


## SELECT、INSERT、UPDATE、DELETEのまとめ。
SELECT文：データの検索
UPDATE文：データの更新
DELETE文：データの削除
INSERT文：データの追加

## 練習問題
１ 入金額50000円に等しい行を検索してすべての列を表示
２ 出金額が4000円を超える行をすべて削除
３ 2013年2月３日のメモを「カフェラテを購入に」変更する。


## 回答
１番目
すべての列表示なので SELECTは、アスタリスクです。

```
SELECT *
FROM 家計簿
WHERE 入金額 = 50000
```

２番目
WHERE で出金額を指定します。 ＞で4000以上と記載

```
DELETE FROM 家計簿
WHERE 出金額 > 4000
```

3番目
SETで変えたい場所を記載 

```
UPDATE 家計簿
SET メモ = カフェラテを購入
WHERE 日付 = '2013-02-03'
```

<a id="#reference"></a>
# 参考記事
- スッキリわかるSQL入門ドリル
Laravel Cannot call constructor が出た時

Symfony\Component\Debug\Exception\FatalThrowableError
Cannot call constructor

![スクリーンショット 2021-07-22 19.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309843/621e6e36-9861-bede-a230-4bbe380dd5d4.png)

![スクリーンショット 2021-07-22 19.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309843/fe2ef9b0-1bd1-1bcc-d85d-70efbeb1ebfc.png)

parent::で止まりました。

このエラーが表示されたときは、Extend元の親コントローラに、Constructorを設定していないのが原因です。
親コントローラに、Constructorを設定しましょう。

以上です。
Herokuでコンテナデプロイを試した

## はじめに
HerokuでDockerイメージをデプロイ出来るということで試してみたのでササッと手順をまとめます。
今回はGoで試しましたが、Dockerコンテナで動いていれば汎用的に使える手順だと思います。

## 環境

```shell:terminal
$ brew -v
Homebrew 3.2.3
$ docker -v
Docker version 20.10.7, build f0df350
```

## 事前準備
Dockerfileを記述して、アプリケーションが動作する環境を作成してください。
なお、Herokuではポート番号を環境変数から取得する必要があり、注意が必要です。
詳細は以下に記述しています。

[Herokuではポート番号を環境変数から取得する必要がある - Qiita](https://qiita.com/h_okawa0303/items/9e1c045cb1e08b789710)

## 手順
デプロイまでの手順を書いていきます。参考にしたページも随時貼っていきます。

### Herokuのアカウントを作る
持っていない人は作りましょう。
[https://id.heroku.com/login](https://id.heroku.com/login)

### Heroku CLIを入れる
brewでインストールする。

```shell:terminal
$ brew tap heroku/brew && brew install heroku
```

インストール出来ていることを確認する。

```shell:terminal
$ heroku -v
heroku/7.56.1 darwin-x64 node-v12.21.0
```

[Heroku CLI | Heroku Dev Center ダウンロードおよびインストール](https://devcenter.heroku.com/ja/articles/heroku-cli#download-and-install)

### ログインする
CLIからHerokuにログインする。

```shell:terminal
$ heroku login
heroku: Press any key to open up the browser to login or q to exit: 
qOpening browser to https://cli-auth.heroku.com/auth/cli/browser/

...(省略)
以下、ログイン後

Logging in... done
Logged in as {MailAddress}
```

ブラウザで以下の画面が開かれるので`Log In`をクリックする。
[![Image](https://gyazo.com/9e4598937fcee69116f1915ee1ce7f6a/thumb/1000)](https://gyazo.com/9e4598937fcee69116f1915ee1ce7f6a)<br>

Container Registryにログインする。

```shell:terminal
$ heroku container:login
Login Succeeded
```
[Heroku CLI | Heroku Dev Center はじめに](https://devcenter.heroku.com/ja/articles/heroku-cli#getting-started)

### Herokuアプリの定義ファイルを書く
デプロイするサービスのルートディレクトリに記述する。今回は最低限書く。

```yml:heroku.yml
build:
   docker:
     web: Dockerfile
```
[heroku.yml を使用して Docker イメージをビルドする | Heroku Dev Center はじめに](https://devcenter.heroku.com/ja/articles/build-docker-images-heroku-yml)

### Heroku上にアプリを作成する
Heroku上にアプリを作る。`heroku create {アプリ名}`でアプリ名の指定も可能。
この時点でデプロイ先も作成される。

```shell:terminal
$ heroku create
Creating app... done, floating-*******-*******
https://floating-*******-*******.herokuapp.com/ | https://git.heroku.com/floating-*******-*******.git
```

### スタックの設定をコンテナにする

```shell:terminal
$ heroku stack:set container
Setting stack to container... done
```
[heroku.yml を使用して Docker イメージをビルドする | Heroku Dev Center はじめに](https://devcenter.heroku.com/ja/articles/build-docker-images-heroku-yml)

### デプロイする

```shell:terminal
$ git push heroku master
```

### デプロイされたものを確認する
デプロイされたものを確認します。

```shell:terminal
$ heroku open
``` 

想定されたレスポンスが返ってきたので成功です。
[![Image](https://gyazo.com/37ba4009fbc22249be5fec4b26adb71a/thumb/1000)](https://gyazo.com/37ba4009fbc22249be5fec4b26adb71a)<br>

## 最後に
これが無料で使えるのは最高ですね^^


## 参考
[Docker によるデプロイ | Heroku Dev Center](https://devcenter.heroku.com/ja/categories/deploying-with-docker)
[heroku.ymlを使用したDockerイメージの構築| Heroku Dev Center](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml)
[Rails] ActiveStorageの画像の保存先をAmazon S3にする~番外編 Herokuでも使えるようにする~

##はじめに
前回はActiveStorageの画像をS3に保存する方法を三回にわたって説明してきました。しかしそれはローカル環境での話でした。今回は本番環境の Herokuでも同じようにS3へ保存させるようにします。

前回までの①〜③までが完了している状態から始めさせていただきます。
よろしくお願いします。

##production.rbを編集
アプリの```config/environments/production.rb```ファイルを編集します。
現在の設定ではactivestorageの画像の保存先がローカルに設定されているのでS3に変更します。

下記の記述が存在するか確認してください。

```config/environments/production.rb
# ~省略~

config.active_storage.service = :local

# ~省略~
```

この「:local」を→「:amazon」に変更します。

```config/environments/production.rb
# ~省略~

config.active_storage.service = :amazon

# ~省略~
```

これでアプリ側の設定は完了です。
後はHerokuの環境変数を設定してあげます。

##Heroku上で環境変数を設定する
下記のコマンドでターミナルでHerokuの環境変数を設定します。

```terminal:ターミナル
% heroku config:set AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"

% heroku config:set AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"
```

*※ダブルクォーテーションは必要です。*

ちゃんと設定されたか確認をします。
下記のコマンドを実行して設定した環境変数が表示されればOKです。

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

全て完了したら```% git push heroku master```で本番環境にpushして反映させてください。

最後に前回の記事と同じように、本番環境で画像を投稿し、AWSのS3のページでその画像がS３に保存されているか確認してください。
pyenvでpythonのバージョンが切り替わらなかった問題の対処

pipでライブラリを管理しています。

そこでvenvで仮想環境を作っていたときに、
ライブラリとの依存関係で
pythonのバージョンをいくつか使い分けたい
ということがありました。

そこでpyenvでpythonのバージョンを使い分けようと思ったのですが、
詰まってしまいました。


```console
/home> $ pyenv version
python 3.6.9
/home> $ python version
python 3.8.5 （システムのpython）
```

となってしまい、
pythonのバージョンが切り替わりませんでした。

anacondaだと異なるバージョンのpythonで仮想環境を作るのは簡単でしたが、
考えるところがありpipで仮想環境を作ろうと思ったものの
pipでいくときのpythonのバージョン管理に詰まってしまっていました。。

```console
/home> $ eval "(pynev init -)"
```

すると切り替わるという情報がありましたが、
自分のところでは切り替わりませんでした。。

調べていくと、
どうもpyenv initに不具合があって
shimsをPATHに追加されていませんでした。

そのため、
.bash_profileを下記のようにしました。


```console
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
```

.bash_profileのほうでpyenv initの操作を
補うようにした形みたいです。


ずっとpythonのバージョンが切り替わらず
頭をひねっていたので、
対処法が分かって安心しました。
ということでメモとして残します。
jinja2でurl_forでのID別のページング

#Flaskでアプリケーションを作っている時、最初の方に地味にハマったページ遷移の件
初心者も初心者の時にblue_print()を初めて使用していた際、aタグやformのactionでurl_for()を使ってくれと言われ調べてみるも、なかなかヒットせず苦労したので記事にしてみる。


##結論

url_fro()の第二引数にIDを指定してあげればOK

##コード
ボタンを押せばその数字が表示されると言うなんとクソテキトーなアプリを作成

###Flaskの実行用のファイル

```python:contoller.py

from flask import Flask
from route.test_route import test_route

app = Flask(__name__,)
app.secret_key = 'hogehoge'

# ブループリントの設定
app.register_blueprint(test_route)

if __name__ == '__main__':
  app.debug = True
  app.run(host='127.0.0.1', port=5000)

```

###ルーティング用のファイル

```python:route/test_route.py
from flask import Blueprint
from models.test_model import TestModel

test_route = Blueprint('test_route', __name__, url_prefix='/test')
TestModel = TestModel()


@test_route.route('/')
def test():
  """初期表示"""
  return TestModel.test()

@test_route.route('/number/<id>')
def number(id):
  return TestModel.number(id)

```

###モデル用のファイル

``` python:models/test_model.py
from flask import render_template

class TestModel():
  def test(self):
    """初期表示"""
    return render_template('test/test.html')

  def number(self, id):
    return id

```


###HTML

```html:test.html
<a href="{{url_for('test_route.number', id=1)}}">
  <button type="button">1</button>
</a>
<a href="{{url_for('test_route.number', id=2)}}">
  <button type="button">2</button>
</a>
<a href="{{url_for('test_route.number', id='3')}}">
  <button type="button">3</button>
</a>
```

###初期ページ
![スクリーンショット 2021-07-22 18.33.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783158/e7032085-04df-bead-1e53-4c38218cf01a.png)

###１をクリック


![スクリーンショット 2021-07-22 18.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783158/e50362fe-6be3-1425-b025-bb52742b03ae.png)


##もちろんID以外や、変数も対応可能だよ



```python:route/test_route.py
from flask import Blueprint
from models.test_model import TestModel

test_route = Blueprint('test_route', __name__, url_prefix='/test')
TestModel = TestModel()


@test_route.route('/')
def test():
  return TestModel.test()

@test_route.route('/number/<name>')
def number(name):
  return TestModel.number(name)

```


``` python:models/test_model.py
from flask import render_template

class TestModel():
  def test(self):
    return render_template('test/test.html', name1="山田", name2="村上", name3="上田")

  def number(self, name):
    return name

```


```html:test.html
<a href="{{url_for('test_route.number', name=name1)}}">
  <button type="button">{{name1}}</button>
</a>
<a href="{{url_for('test_route.number', name=name2)}}">
  <button type="button">{{name2}}</button>
</a>
<a href="{{url_for('test_route.number', name='name3')}}">
  <button type="button">{{name3}}</button>
</a>
```

![スクリーンショット 2021-07-22 18.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783158/dc51ab1c-0e81-fbc2-3fef-734812db4b42.png)
![スクリーンショット 2021-07-22 18.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783158/6ccd1453-12d6-7a26-2bb7-7b09b39c54c0.png)
オンプレミスとクラウドについて

オンプレミス
メリット
ハードウェアを部品単位で調整できる。
特殊な要件に対応できる
導入後は電気代などの運用費用のみで済む

デメリット
定期的なメンテナンス、機械故障対応


クラウド
メリット
初期費用が安い
サーバの保守が必要ない

デメリット
大規模運用の場合、維持費用が高額になる

AWS（アマゾン）

Azure（マイクロソフト）

Google Cloud Platform
VSCodeの設定の同期が便利だった。でもWSL2側の拡張機能は同期されないんですね..

# はじめに
こんにちは。
本日より、先月上旬に買ったPCのセットアップを開始しました。PCはThinkPadです。現在使用しているVAIOと異なり、キーボードの押しやすさが段違いでびっくりしました。ただ、重いっすね... :innocent: 


# 本題
PCのセットアップに伴い、各種アプリケーションの設定等々を移行する必要があります。
`VSCode`もその一つです。

前回設定した際に、各種設定情報をGitHubのリポジトリで管理するように準備しておきました。

## 1. 今までの方法
以下のようにあらかじめ前回セットアップした際の各種設定情報をリポジトリで管理しているため、それを基にセットアップを行います。

1. GitHubのVSCode関連リポジトリをclone
1. 拡張機能のインストールコマンド実行
1. settings.jsonを所定の位置に配置
1. 他各種手動で設定

## 2. VSCodeの設定の同期でやる方法
こちらの記事が参考になりました:pray:

https://qiita.com/Nuits/items/6204a6b0576b7a4e37ea

1. 新しいPCで設定の同期をオンにする。
2. <font color="red">**WSL2側の拡張機能が同期されないので1のリポジトリを基にWSL2側に拡張機能をインストールする。**</font>

# おわりに
今までの方法より飛躍的に簡単になりました！

でもてっきり、WSL2側の拡張機能もインストールしてくれるものだと、思っていたのですが、待てど暮らせど一向にインストールされないことに気づきました... :sob:

やはり拡張機能だけはリポジトリで管理しようかなと思います:pray:
PythonのmypyでUnionを使うとき

# mypyとは

https://github.com/python/mypy

↑のReadmeの説明を翻訳すると以下の通り。

```
Mypyは、Python用のオプションの静的型チェッカーです。
Pythonプログラムに型ヒント（PEP 484）を追加し、mypyを使用して静的に型チェックすることができます。
プログラムを実行せずに、プログラムのバグを見つけてください。

プログラムでは、動的型付けと静的型付けを組み合わせることができます。
レガシーコードのように静的型付けが不便な場合は、いつでも動的型付けに切り替えができます。
```

PEP484は何かというと、Type Hintsのこと。
PythonはJavaと違い変数や引数の型の指定が不要だが、Typt Hintsの登場により型の明記ができるようになった。
これにより、そのメソッドの引数が何の型が想定されているのか分かるようになる。

```python:TypeHints無し
def hoge(a, b):
    return a / b  # 割り算がされるので、str が入るとエラーになる
```

```python:TypeHints有り
# 引数が int だと分かるので、str を入れてはいけないと分かる
def hoge(a:int, b:int) -> float:
    return a / b
```

ただ、Type Hintsを書いていても、プログラムの動きは変わらない（と思う）。
「引数の型が違う！」というエラーにはならない。
⇒ TyptHints有りのコードを実行しても、`a / b`を実行してエラーを出す。

Type Hintsのチェックをする静的テストツールがmypyである。
これによって呼び出し時の引数不一致が分かるので、想定外の型を引数に渡すバグが減る。

# mypyとUnion

Unionは、Type Hintsで指定できる型？の一つ。
引数の型が複数あり得る場合に、指定するもの。
例えば、先ほどの例で int が引数だったが、float も使えるようにしたい場合は次のようになる。

```python:TypeHints有り（intもfloatに対応）
# 引数が int と float に対応している
def hoge(a:Union[int, float], b:Union[int, float]) -> float:
    return a / b
```

ここまでは分かりやすいが、

- 引数が、int か str
- int であれば2で割る
- str であれば fuga を付ける

ではmypyはどう動くのか？

```python:intとstrが引数の関数
# 引数が int と float に対応している
def hoge(a:Union[int, str]) -> Union[float, str]:
    if type(a) == int:
        return a / 2
    else:
        return a + 'fuga'
```

上記では、次のエラーになる。

```sh
> mypy test.py
test.py:8: error: Unsupported operand types for + ("int" and "str")
test.py:8: note: Left operand is of type "Union[int, str]"
```

エラーは`return a + 'fuga'`で発生している。
⇒ 要するに`type(a) == int`で引数が int の場合分けをしているが、mypyはそれに気づけない。

# mypy使用下でUnionを使う場合、isinstance()を使うべし

type()をやめて、isinstance()を使うと・・・

```python:intとstrが引数の関数（mypyクリア）
def hoge(a:Union[int, str]) -> Union[float, str]:
    if isinstance(a, int):
        return a / 2
    else:
        return a + 'fuga'
```

```sh
> mypy test.py
Success: no issues found in 1 source file
```

# 最後に
mypyを使う場合、型の判別に使えるのはisinstanceとassertらしい。（assertでどう書くのか分からないが、そういう情報だけ見た）

そもそも、Pythonで型を不定にすることが魅力であるという話も聞いたことがあるので、Type Hintsを積極的に使うことが絶対的正解であるかはわからないが、JavaからPythonに入った人はこれがある方が分かりやすいのかもしれない。

私としても、できるだけ静的チェックが使える方が品質が上がると思うので、私がプロジェクト主導することがあればmypyは使いたい派かなぁ。
【Git】チームから学ぶGitの使い方 リポジトリ作成編

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* GitHubにPushするまでの流れを知りたい方
* チームで開発進める方


#目的

* gitの初期設定からpushしてリモートリポジトリに変更内容を反映させる

#実際の手順と実例
###0.前回までの流れ

https://qiita.com/nao0725/items/cbba149627bc9ee2a04e

###1.リポジトリを作成する
リポジトリとは、、

https://wa3.i-3-i.info/word15664.html

まずはgitの初期設定を下記コマンドで実行

````
$ git init
````

下記コマンドで変更履歴を保存
※実行前と後にgit statusというコマンドを実行すると実際に追加されたディレクトリやファイルが確認できます。

````
$ git add -A
````

ローカルリポジトリに登録します。
””マークの中は相手にわかりやすいコメントを書きます。

````
$ git commit -m "first commit"
````

ローカルリポジトリとリモートリポジトリの紐付けを実行します。２回目以降は実行する必要はありません。

````
$ git remote add origin リモートリポジトリのURL(SSH)
````

下記コマンドでブランチをmainに切り替えます
* 既にmainの時は実行する必要ありません。

````
$ git branch -M main
````

リモートリポジトリへPushする

````
$ git push origin main
````

そうすると、リモートリポジトリに変更内容が記載されます！
基本的には何か変更を加えたら、
add → commit →　pushの順で実行すればOKです


###2.チームで開発するときは、、、、

* 上記コマンドを代表者が実行しましょう
* 代表の方が実行後は他メンバーがGitHubからアプリケーションをクローンします。


  ①開発環境の準備（cloud9等）　
  ②git clone リポジトリのURL　

#参照

>[リモートリポジトリを管理する](https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/managing-remote-repositories)
Vue.js Basics

```index.html
   <section id="user-goal">
      <h2>My Course Goal</h2>
      <p>{{ courseGaol }}</p>
      <p>Learn more <a v-bind:href="vueLink">about Vue</a>.</p>
   </section>
```


```app.js
const app = Vue.createApp({
    data() {
        return{
            courseGoalA: 'Finish the course and learn Vue!',
            courseGoalB: 'Master Vue and build amazing apps!',
            vueLink: 'https://v3.ja.vuejs.org/'
        };
    },
    methods: {
        outputGoal() {
            const ramdamNumber = Math.random();
            if (random < 0.5) {
                return this.courseGoalA;
            } else {
                return this.courseGoalB;
            }
        }
    }
});

app.mount('#user-goal');
```

sectionIdをapp.mount('')に入れる
＃を忘れない！

returnの中にVueで管理するデータを書く

関数はmethodsの中に書く

htmlに書くときは{{}}の中に書く
urlの場合はv-bindを使う

metheds内でdataの値を使うときはthisをつける

```index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vue Basics</title>
    <link
      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="styles.css" />
    <script src="https://unpkg.com/vue@next" defer></script>
    <script src="app.js" defer></script>
  </head>
  <body>
    <header>
      <h1>Vue Course Goals</h1>
    </header>
    <section id="user-goal">
      <h2>My Course Goal</h2>
      <p>{{ courseGaol }}</p>
      <p>Learn more <a v-bind:href="vueLink">about Vue</a>.</p>
    </section>
  </body>
</html>

```
[Python3]　初心者の初心者による条件分岐(IF文)、while文の使い方

#初めに
数日前にPythonの勉強を始めました。
自分で記事を作成しながら、インプットアウトプットをしていこうと思います。
自分で作成したサンプルコードをもとに説明していきます。
また、初心者の方やこれからpython勉強を始める方が参考にできるような記事にしていこうと思っています。

#今回作成したもの
自動で値を取得し、九九計算問題を出してくれるプログラムを作成しました。

#自分で書いたサンプルコード
```py
#ランダムのライブラリー取得
from random import randint

right = 0                               #正解数
wrong = 0                               #間違えた回数
print("2回間違えたら終了、やめる場合は[quit]と入力")

#2回失敗したら終了
while wrong<2 :
    FirstNum = randint(1,9)                     #1~9の値を自動で取得

    SecondNum = randint(1,9)                    #1~9の値を自動で取得

    answer = FirstNum * SecondNum               #2つの数字を掛けた値を保存

    question =f"{FirstNum}×{SecondNum}は？"     #問題文格納

    Num = input(question)                       #問題の回答を入力する

    if Num == "quit":                           #quitと入力されたら終了
        break
    else:                                       #数字が入力された場合
        if Num == str(answer):                  #回答が正しい
            right +=1                           #正解数インクリメント
        else:                                   #回答が間違っている場合
            wrong +=1                           #間違えた回数インクリメント
```
##while文の使い方
```
while 条件式:
    処理1
    処理2
```
__while__、__条件式__を記入後に__":"__が必要です。
処理には、条件が一致している場合に行いたい処理内容を記入します。

注意点として、while文を記入した後のステートメントは必ず__インデント(半角空白4個下げ)__が必要です。

意図的に条件を設定し、while文から抜けたい場合には__break__を使用します。

下記はサンプルコード内で使用しているwhile文です。

```py
while wrong<2 :
```

条件式(処理をする条件)は、"wrong"に格納されている値が2より小さいかを判定しています。

##条件分岐(if文)の使い方
```
if 条件式1:
    条件式1が成立した(true)時の処理
else:
    条件式1が成立していない(false)時の処理
```
while文同様、最後に__":"__が必要です。

下記はサンプルコード内で使用しているif文です。
上から順に説明していきます。

```py
if Num == "quit":                           #quitと入力されたら終了
    break
else:                                       #数字が入力された場合
    if Num == str(answer):                  #回答が正しい
        right +=1                           #正解数インクリメント
    else:                                   #回答が間違っている場合
        wrong +=1                           #間違えた回数インクリメント
```
1行目のif文は、Numの値が"quit"という文字列であるかを判定しています。
"quit"であれば、先ほど紹介した__break__でwhile文を抜けています。
3行目のelseは、Numの値が"quit"以外であれば処理します。

4行目からは、if文の中にさらにif文を書いています。
4行目は、Numの値が"quit"ではない__かつ__計算が正しいかを判定しています。
計算が正しければ、5行目の処理を実行し
計算が正しくなければ、6行目のelse内の7行目の処理を実行しています。

条件分岐(if文)もwhile文同様に、__インデント__の必要があります。

#最後に
今回紹介したいものは以上となります。
python初心者なのですが、同じような立場の方に参考になれば幸いです。
また内容、サンプルコード等に誤りがあれば、ご教授いただけると幸いです。
.htpasswdを、アカウントデータベースから自動作成しよう！

#目次
[1.僕のパソコン環境](#1-僕のパソコン環境)
[2.アカウントデータファイル](#2-アカウントデータファイル)
[3.シェルスクリプト](#3-シェルスクリプト)

#1. 僕のパソコン環境
* OS: Ubuntu 20.04.2 LTS

#2. アカウントデータファイル
次のようなアカウントデータベースaccount.txt があったとしよう。
簡単のために、(ID)+(半角スペース)+(パスワード)なるフォーマットとする。

```:account.txt
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
```
#3. シェルスクリプト
お次は、シェルスクリプトを書こう。.htpasswd を作りたいディレクトリに行き、ターミナルで下記のように書く。

```:ターミナル
touch .htpasswd
while read line
> do htpasswd -b ./.htpasswd ${line}
> done < account.txt
```
これで、お望みの「.htpasswd」ができているはず！
一行でもイケる。

```:ターミナル
touch .htpasswd; while read line; do htpasswd -b ./.htpasswd ${line}; done < account.txt
```
iOSアプリを作るまで

#自己管理アプリを作る
日々改良を重ねていく予定です。
今の所の現状で分かったことをここに書いて更新していきます。

##動機
自己管理が恐ろしくできないので、スケジュールのアプリを入れようと思ったんですけど、せっかくなら作ってみたいと思いました。

記事を分けて書いていこうと思います。

#日付関連
https://qiita.com/punchlemon/items/397daa4b377378cbdad6

#表示関連
https://qiita.com/punchlemon/items/876295cf7233d7f365b0



##全貌
現状で書いたところです。

```swift:ContentView.swift
import SwiftUI


struct ContentView: View {
    let now = Date()//getToday
    @State var gap: Double = 0
    var body: some View {
        VStack {
            Text(printDay(d: changeDay(d: now, i: gap), f: "M/dd"))
            
            Spacer()
            
            HStack {
                Button(action: {
                    gap += 1
                }) {
                    Text("Day plus")
                }
                
                Spacer()
                
                Button(action: {
                    gap -= 1
                }) {
                    Text("Day minus")
                }
            }
        }
    }
}

func printDay(d: Date, f: String) -> String {
    let formatter :DateFormatter = DateFormatter()
    formatter.calendar = Calendar(identifier: .gregorian)
    formatter.dateFormat = f
    return formatter.string(from: d as Date)
}

func changeDay(d :Date, i: Double) -> Date {
    let returnDate = d.addingTimeInterval(i*24*60*60)
    return returnDate
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```



##最後に
Swiftをやるのは初めてなのでまだまだわからないことだらけです。
何か間違えてることだったり、より良くなることを教えていただけると幸いです。
seaborn: `scatterplot` の `markers` に指定できる文字

# はじめに

seaborn の `markers` を指定した際にエラーが出たため、調査しました。

[書籍「pandasライブラリ活用入門」](https://book.impress.co.jp/books/1118101067)の「3.4.3.2 サイズと形」の2番目のプロットが動作しなかった経緯があります。1番目の図については[こちら](https://qiita.com/noobar/items/d9a548b8abf9fd25e1a9)に記事を書きました。

# 現象

`markers` と `style` を指定することにより、カテゴリ変数の値によってマーカーを出し分けることができます。（書籍では `style` の指定がなく動作しなかったため追加しました。また説明のために`size`は除いています。）

しかし、下記のように`['o', 'x']`を指定するとエラーになってしまいます。

```ERROR.py
import seaborn as sns
from matplotlib import pyplot as plt

tips = sns.load_dataset('tips')
sns.scatterplot(
    data=tips,
    x='total_bill',
    y='tip',
    hue='sex',
    style='sex',
    markers=['o', 'x'],
)
plt.show()
```

>ValueError: Filled and line art markers cannot be mixed

# 解決策

エラーが示すように、filled marker と line art marker は混在できません。後述するように、`'o'` は filled、`'x'` は line art なのでエラーとなります。`'x'`に似た filled marker は `'X'`（xの大文字）なので、これに変更すると思ったように動作します。

```OK.py
import seaborn as sns
from matplotlib import pyplot as plt

tips = sns.load_dataset('tips')
sns.scatterplot(
    data=tips,
    x='total_bill',
    y='tip',
    hue='sex',
    style='sex',
    markers=['o', 'X'],  # ← 変更
)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43328/a87b0332-ebc2-4c1d-f002-b4339ce91b9e.png)


# marker の一覧

seaborn で使用可能なマーカーは matplot に準じるので、matplotlib で探します。

```python
from matplotlib.markers import MarkerStyle

ms = MarkerStyle()

# filled_marker を取得
filled_markers = ms.filled_markers
# すべての marker を取得
all_markers = tuple(ms.markers.keys())
# すべての marker から filled marker を除外
non_filled_markers = tuple(filter(lambda mk: mk not in filled_markers, all_markers))

print(filled_markers)
#→ ('o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X')

print(non_filled_markers)
#→ ('.', ',', '1', '2', '3', '4', '+', 'x', '|', '_', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'None', None, ' ', '')
```

繰り返しですが filled marker と line art marker (`non_filled_markers`）は混在できません。
どちらか片方のセットからマーカーを選ぶことになります。
【AWS】「Athena」と「CloudWatch Logs Insights」の違い・使い分けについて

# まず用語整理


|  サービス  |  概要  |
| ---- | ---- |
|  CloudWatch  |  リソースモニタリングサービス（Datadog的なもの。Datadogは自由なダッシュボードが便利で人気の要因）  |
|  CloudWatch Logs  |  loudWatchで収集したログの分析を行えるサービス  |
|  CloudWatch Logs Insights  |  CloudWatch Logsのロググループに対してSQLを用いたクエリーを投げてログを集計できるサービス  |
|  Athena  |  S3で収集したログに対してクエリを投げてログを分析できるサービス  |

# 最初に結論

「Athena」と「CloudWatch Logs Insights」は、ほぼ同じ。
若干の違いは存在する。

# 共通項目

|  比較項目  |  答  |
| ---- | ---- |
|  検索対象  |  どちらもS3  |
|  課金体系  |  どちらも従量課金  |

# 異なる項目


|  比較項目  |  CloudWatch Logs Insights  |  Athena  |
| ---- | ---- | ---- |
|  検索方法  |  専用のクエリ言語とコマンド  |  標準SQLを使用。事前にデータリソース定義時に、データ型・テーブル名のデータ構造を設定する。  |
|  データの可視化  |  折れ線グラフやスタックされたエリアグラフとして表示できる  |  Athena単体で視覚化の機能はない。Amazon QuickSightやRedashと連携ことでデータの可視化を実現する  |
|  保持期限  |  ロググループの設定による  |  S3のリソースが存在する限り  |


# 私見による違い・使い分け

## CloudWatch Logs Insights

- CloudWatchが優秀なので、1つのサービスで色々完結させたい場合には、良い選択肢となり得る。
- ただ色々出来るがゆえに、個々のサービスの使い勝手では、CloudWatchに勝るサービスが存在する、というのもまた事実

## Athena

- 使い慣れたSQLで検索できるため、学習ハードルが低い。
- BIツールも使い慣れたものを使用すれば、それも学習ハードルが低くなる。BIツール観点ではあるが、CloudWatch Logs Insightsより機能が豊富なBIツールを使用すれば、それは使い勝手はかなり高いと言える。
- ただまぁ準備が色々めんどくさい印象

# 参考

https://qiita.com/su-pleiades/items/9c5fecebcf20efbeb897

https://dev.classmethod.jp/articles/how-to-use-amazon-athena-amazon-cloudwatch-logs-insights/
教師なし学習とはどんなものか。何に使われるか。

# 教師なし学習とは
教師なし学習とは、目標値を持たない問題設定に対して用いる機械学習です。
データがとりあえずたくさんあって、それらをどう分類すると、どのような結果が見えてくるかを人間が理解して利用する必要があります。

例えば、コンビニの購買データが1000件あったとして、

- お弁当とコーヒーを買うグループ
- サラダとサンドイッチを買うグループ
- お酒とおつまみを買うグループ

に分類することができたりします。
上記は、適当にありえそうな組み合わせを想像して書いただけですが、実際にデータを分類してみると、
「お弁当とコーヒーを一緒に買うような人は全くいない」という事実が浮かび上がってくるかもしれませんし、
サラダとサンドイッチを一緒に買う人は、サラダチキンも一緒に買っていると示される可能性もあります。

うまく分類できたら、例えば、「お酒とおつまみを買うグループ」に向けて
「お酒とおつまみ2品購入で合計金額から10％オフ」といったキャンペーンを打ち出し、
キャンペーン中のデータを取得して、また分類することで、キャンペーンの効果があったかどうかを確かめることもできそうです。

# 手法
代表的な手法として、以下の二つがあります。

- 主成分分析(Principal Component Analysis)
- k平均法 (k-means)

## 主成分分析
主成分分析は次元削減の手法です。
４次元のデータ（列数が4つのデータ）があった場合、２次元などの低次元に落とし込みこむことです。
２次元などに落とし込むことでデータを可視化することができます。

主成分分析でわかることは、

- 主成分を見ることで、どの方向にデータがばらつくか分かる
- 主成分得点を見ることで、データを要約できる
- explained variance ratioを見ることで、どの程度情報を保持しているか分かる（80〜90％が基準になる）

↓の動画がわかりやすかったです。

> 【相関で情報を圧縮】主成分分析の気持ちを理解する【いろんな分析 vol. 2 】 https://youtu.be/mMmTHoZKWTI

### 第1主成分を求める

```math
z_1 = w_{11}x_1 + w_{12}x_2 + ... + w_{1n}x_n = w_1x
```
この時、$||w_1||$で$V(z_1)$が最大になる$w_1$の時の$|z_1|$が第1主成分得点です。

### 第2主成分を求める

```math
z_2 = w_{21}x_1 + w_{22}x_2 + ... + w_{2n}x_n = w_2x
```
この時、$||w_2||$で$V(z_2)$が最大になる$w_2$の時の$|z_2|$が第2主成分得点です。
ただし、$w_2 \perp w_1$です。
$w_1$と$w_2$は違う方向を向いていて欲しいからです。
$w_1$と垂直方向にばらついているということは、2番目にばらつきが大きい方向と考えることができます。

第k主成分は、k番目にばらつきが大きい方向のことです。
4番目以降のことはイメージとして認識することは難しいですがね。

そして、$z$から$x$への回帰分析をすると、残差が最小になります。


## k平均法
k平均法はクラスタリングと呼ばれる手法に当たり、データを複数のクラスター（グループ）に分けて、おおまかな特徴を捉える際に使用します。
最初に書いたコンビニの例では、こちらを使用します。

- 人間側がクラスター（グループ）の数を決める
- ランダムに振られた点（重心）から近いものをクラスターとする
- 紐づいたクラスターとの距離を元に重心を移動させる

上記の3つを重心が動かなくなるまで繰り返します。
Android StudioをIntelliJ公式プラグインで日本語化する

先ほどAndroid StudioのベースとなっているIntelliJ公式から日本語化プラグインのリリースが発表されました！

https://twitter.com/jetbrainsjp/status/1418104405274988546

Android Studioもこれで日本語化できるのでは？と思い試してみました。

# 環境
- Android Studio 4.2.2

# プラグインのダウンロード
Android Studioのプラグイン画面から検索してみましたがヒットしなかったのでWebページからダウンロードします。

https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions

ページのVersionsから対応するバージョンを探します。Android Studio4.2.2のベースとなっているIntelliJ IDEAのバージョンは**2020.2**です。なので、このバージョンが出るまでひたすら過去に遡り続けます。

![Screen Shot 2021-07-22 at 18.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/dc763b9b-db43-12ed-d798-c070b1db8d2e.png)

2020.2対応の最新verは**202.415**っぽいのでこれをダウンロードします。環境によってはjarファイルを直接ダウンロードするのでブラウザに危険では？と止められるかもしれません。

# インストール
Android Studioを開き、右下のConfigureからPluginsを選択します。

![Screen Shot 2021-07-22 at 18.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/d693d049-cd30-6ce9-fdb1-f0be59271e3d.png)

上の歯車からInstall Plugin from Diskを選び、先ほどダウンロードしたjarを選択します。

![Screen Shot 2021-07-22 at 18.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/e3a8b37b-ba4f-5583-6def-69702e2d6fab.png)

再起動すれば一部が日本語化されています！

![Screen Shot 2021-07-22 at 18.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/86bf8e58-f9c0-0be1-262f-ee92e5b4e97c.png)

日本語化されるのはあくまでIDEA部分だけで、Android Studio向けに追加された項目は英語のままです。

![Screen Shot 2021-07-22 at 18.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/3bfc42ce-dc81-08e4-cdc8-8d29408964e0.png)

設定画面はほぼ日本語化されていますね。

![Screen Shot 2021-07-22 at 18.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/8dcffa0d-2964-6df1-8b54-4fcfc4630f9f.png)

これで少し開発しやすくなるかもしれません。
【Shopify】現在見ているページのファイルを調べる方法

テーマを開発/カスタマイズする際は、どのtemplates内ファイルが読み込まれているか知る必要があります。

例えば
トップページ　→ templates/index.liquid
コレクション一覧　→ templates/collection.liquid
など。

これらはlayout/theme.liquid内のscriptタグの中で下記のコードを入れることで知ることができます。

<script>
    console.log('{{template}}');
    //or
    alert('{{template}}');
  </script>  

`` <script>
    console.log('{{template}}');
    //or
    alert('{{template}}');
</script>``
【コピペするだけ】MacターミナルからAWS EC2へのSSH接続がすぐに途切れる件。

コピペするだけで解決するはずです。

・Mac側かサーバ側か**いずれかで実行**してください。
・基本Mac側で設定した方が良さそうです。
・サーバのOSはAmazon Linux 2を想定しています。
#Mac側の設定



※サーバに対してSSH接続を行う**ユーザ毎に設定**してください。
(よく分からない人は新規ターミナル画面でそのまま実行してください)

・以下のコマンドを叩いてください。
(右上のコピーマークをクリック)

```Bash:
cat ~/.ssh/config
```

・**「No such file or directory」が出力される場合**

```Bash:
echo -e "Host *\nServerAliveInterval 60\nServerAliveCountMax 120\nTCPKeepAlive yes" > ~/.ssh/config && chmod 600 ~/.ssh/config && launchctl stop com.openssh.sshd
```

・**「No such file or directory」が出力されない場合**

```Bash:
mv ~/.ssh/config ~/.ssh/config.org && cat ~/.ssh/config.org | sed -e "s/.*ServerAliveInterval.*/ServerAliveInterval 60/g; s/.*ServerAliveCountMax.*/ServerAliveCountMax 120/g" > ~/.ssh/config && launchctl stop com.openssh.sshd
```

何も表示されなければOKです。
（2時間はタイムアウトしなくなるはずです）


#EC2インスタンス側の設定
※共用で使うサーバの場合は特に注意してください。
※rootユーザで叩いてください

以下のコマンドを叩いてください。
(右上のコピーマークをクリック)

```Bash:
mv /etc/ssh/sshd_config /etc/ssh/sshd_config.org && cat /etc/ssh/sshd_config.org | sed -e "s/.*ClientAliveInterval.*/ClientAliveInterval 60/g; s/.*ClientAliveCountMax.*/ClientAliveCountMax 120/g" > /etc/ssh/sshd_config && service sshd restart
```

「Redirecting to /bin/systemctl restart sshd.service」が表示されればOKです。
（2時間はタイムアウトしなくなるはずです）

#説明
・「~/.ssh/config」とは
クライアントとしてサーバにSSH接続を行う際の設定ファイルらしいです。
今回で言えば、Mac側で設定するファイルです。

・「/etc/ssh/sshd_config」とは
サーバとしてSSH接続を受け付ける際の設定ファイルらしいです。
今回で言えば、EC2インスタンス側で設定するファイルです。

・今回は上記設定ファイルの「AliveInterval」と「AliveCountMax」という項目を設定しました。

・「AliveInterval」は、サーバやクライアントに対して応答確認する間隔だそうです。

・「CountMax」は、サーバやクライアントに対して応答確認をする回数だそうです。

つまり今回の場合、「AliveIntevel 60」と「AliveCountMax 120」を設定したので、60秒×120回=2時間の間タイムアウトしなくなるはずです。

参考記事：
https://qiita.com/qualitia_cdev/items/b7138b1280e693585267
https://genchan.net/it/pc/mac/11402/

#追記
2021-07-31
「~/.ssh/config」に「Host *」と「TCPKeepAlive yes」を追加しました。
【Strix】 PhotonからStrix Cloudに移行してみた ～接続編～

今記事は以下のの記事の**接続編**です。

https://qiita.com/HarumaroJP/items/cf9034bcf7f5e73d2b5e

まだメインの記事を読んでない方はそちらから読んでいただけると幸いです。

Strix Cloudのサーバー接続までを解説していきたいと思います。

##接続の基本
Strixのサーバー全体の仕組みについては以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409758/b2d4b046-45a2-81a8-1d5d-19e4a156cd17.png)

###マスターサーバーへの接続
```C#
public void ConnectMasterServer(
	string host,
	int port,
	StrixNetworkConnectEventHandler connectEventHandler,
	StrixNetworkConnectFailedEventHandler errorEventHandler
)
```
実際に接続する際には

```C#
        public static void Connect() {
            StrixNetwork strixNetwork = StrixNetwork.instance
            LogManager.Instance.Filter = SoftGear.Strix.Net.Logging.Level.INFO;
            strixNetwork.applicationId = "アプリケーションID";
            strixNetwork.playerName = "自身のプレイヤー名";

            strixNetwork.ConnectMasterServer("マスターホスト名", 9122, OnConnect, OnConnectFailed);
        }

        //接続成功時
        void OnConnect(StrixNetworkConnectEventArgs args) {
            Debug.Log("MasterServerに接続しました");
        }

        //接続失敗時
        void OnConnectFailed(StrixNetworkConnectFailedEventArgs args) {
            Debug.Log("MasterServerへの接続に失敗しました");
        }
```


`LogManager.Instance.Filter` にはログレベルを指定することができます。
6段階で設定できるのでお好みで設定してください。

アプリケーションIDは管理画面の**赤の矢印の部分**
マスターホスト名は**青の矢印の部分**を入力してください
ポートは基本的に9122で固定です

![スクリーンショット 2021-07-22 173043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409758/18ddcc50-729f-b44e-d83b-881873df2971.png)

またStrix Cloudでは先程のコードにあるように成功時、失敗時とハンドラーを指定しています。
これは他のStrix関数でも定番のやり方なので気にしておくと良いでしょう。

コード例では直接IDを代入していますが、ScriptableObjectを使うとシーンに依存せず管理しやすいのでおすすめです。

###接続失敗時
```C#
    void OnConnectFailed(StrixNetworkConnectFailedEventArgs args) {
        string message = "";

        if (args.cause != null) {
            message += "MasterServerの接続に失敗しました\n";
            message += $"host {args.session.host}, port {args.session.port}, cause {args.cause.Message}";
        }

        Debug.Log(message);
    }
```
`args.session`は接続試行時のセッション情報です。接続に失敗したホスト名やポートなどをここで取得します。
`args.cause.Message`は接続の失敗原因です。大体これで原因がわかります。

ルームサーバーへの接続（マッチメイキング）は次の記事で解説します！
[【Strix】 PhotonからStrix Cloudに移行してみた ～マッチメイキング編～](https://qiita.com/HarumaroJP/items/0f2fa0ebc7ce85c466cb)


##参考リンク
初回セットアップについて


https://www.strixengine.com/doc/unity/guide/ja/unitysdk/cloudsetup.html

サンプル例

https://www.strixengine.com/doc/unity/guide/ja/unitysdk/sample.html

StrixNetworkConnectFailedEventArgs

https://www.strixengine.com/doc/unity/api/html/T_SoftGear_Strix_Unity_Runtime_Event_StrixNetworkConnectFailedEventArgs.htm
(2021/07/22)NET CoreとSQL ServerでEntityFrameworkを使用する(DB first)

DB firstと言いながらも、とりあえずDBだけ作って、とりあえず接続だけしてみたいってときのメモ。

# 環境
・Visual Studio 2019
・SQL Server 2019

# プロジェクトの作成
ASP.NET Core Webアプリを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401295/c8cf2af8-3c8c-d93b-8859-476675c4e48b.png)

# Nugetでパッケージの取得
必須かどうかわからないけど、とりあえず以下をインストール。
ただし、DesignとSqlServerだけは、インストールしなかったときにエラーが出たので少なくともこの2つは必要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401295/a68d4b93-8161-8443-41ff-71152ec199e1.png)

# PMでコマンド実行
VS2019の画面下部にあるパッケージマネージャーコンソールで以下のコマンドを実行。

```
dotnet ef dbcontext scaffold "Data Source=<コンピューター名>\<データベース名>;Database=<データベース名>;persist security info=True;user id=<DBのユーザー名>;password=<DBのユーザーパスワード>;MultipleActiveResultSets=True;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models --project <プロジェクト名>
```
これも、引数が本当に全部必要なのか確認したわけじゃないし、なんなら無駄な引数も入ってそうだけど、とりあえずこれで動いた。
コマンド実行後、ModelsフォルダーにDbContextのファイルが生成される。