OmniAICreator/Qiita-1.07M huggingface dataset:
Vuexの全stateを一括初期化する方法


開発現場にて、ログアウト時に全stateを初期化するように実装したかったので、当時の調査・実装の備忘録。

このissueに幾つかの方法が議論されていたので参考にした。
https://github.com/vuejs/vuex/issues/1118

## 方法１
各モジュールごとに、stateを初期化するmutationを実装する。

```Javascript:sample.js
function initialState () {
  return {
    /* state */ 
  }
}


export default {
  // 初期値
  state: initialState(),
  
  mutations: {
    // 初期化処理
    reset (state) {
       Object.assign(state, initialState())
      }
    }
  }
}
```
当時は正攻法のようだったが、個別に書くことなど、諸々面倒に感じたので一旦スキップ

## 方法２
ログアウト時にリロードする処理をしこむ
➡︎煩わしい処理は何も考えずに済んで、実装も１行追加だけで楽

[上のissueのコメント](https://github.com/vuejs/vuex/issues/1118#issuecomment-518041274)でも、以下のように書かれていた
> Amazing when one line of code in my logout function takes care of all of this mess... `this.$router.go(this.$router.currentRoute)`



```Javascript:
// 現在のパスでリロード
this.$router.go(this.$router.currentRoute.path)
```
参考：https://qiita.com/CeMoReOn/items/4ce640bee42bf1a0cbd7

## 方法3
[vuex-extensions](https://www.npmjs.com/package/vuex-extensions)を追加する
[上のissue](https://github.com/vuejs/vuex/issues/1118)の中で、全stateリセットの共通処理のPRとしてマージされていた[方法](https://github.com/vuejs/vuex/issues/1118#issuecomment-573403133)
➡︎今回はこれを採用

```Javascript:
this.$store.reset()
```
「The Go Memory Model」の読解

「The Go Memory Model」
https://golang.org/ref/mem
の理解をまとめる。

## Channelの3つのルール
上の記事に、Goのchannnelの送受信に関する3つのルールが載っている。  
  
#### ルール1
**A send on a channel happens before the corresponding receive from that channel completes.**
（チャネルへの送信は、それに対応する受信が完了する前に行われる。）
#### ルール2
**A receive from an unbuffered channel happens before the send on that channel completes.**
 （バッファなしのチャネルに対しては、送信が完了する前に、受信が行われる。）
#### ルール3
**The *kth* receive on a channel with capacity *C* happens before the *k*+*Cth* send from that channel completes.**
（バッファ容量Cのチャネルからのk+C番目の送信が完了する前に、k番目の受信が行われる。）
<br>
そして、上記の補足としてこう書いてある。
**This rule generalizes the previous rule to buffered channels.**
（ルール3はルール1と2の一般化である）  
<br>
## 具体例で理解する
### 前提
```go
package main
var a string

func f() {
	a = "hello"
}

func main() {
	go f()
	print(a) // 空文字が出力
}
```
printによる出力は、関数fの完了を待たない。

### ルール1の例
```go
package main
var c = make(chan int, 10)
var a string

func f() {
	a = "hello"
	c <- 1 // 値はなんでも良い
}

func main() {
	go f()
	<-c
	print(a) // helloと出力
}
```

バッファ有りなので、`<-c`（受信）の前に`c <- 1`（送信）が行われる決まりである。送信の前にaにhelloが代入されているため、helloと出力される。

### ルール2の例

```go
package main
var c = make(chan int)
var a string

func f() {
	a = "hello"
	<-c
}

func main() {
	go f()
	c <- 1 // 値はなんでも良い
	print(a) // helloと出力
}
```
バッファ無しなので、入力`c <- 1`の前に出力`<-c`が行われる。

日本語が変な感じもするが、要は複数のgoroutineに処理がまたがった時、どういう順番でプログラムが実行されるかということを言っている。

上の例でmainとfは異なるgoroutineなので、本来互いの動作は干渉し合わない。が、cというチャネルを利用することで、2つの動作を連携させ、処理の順番を制御することができる。

より具体的には、バッファ無しの際の動作は以下のようになる。

mainの方の処理が`c <- 1`に差し掛かった時、`c <- 1`の処理を完了する前に、fの`<-c`という処理が行われる。もしfがそれより前の処理を行っているのであれば、fの`<-c`が完了するまで、mainは待機する。

### 「ルール3はルール1と2の一般化である」の意味
ルール1,2は、ルール3にまとめることができる。

まず、バッファ無しをバッファ0と読み替えると、ルール3の文章は次のようになる。

> バッファ**無し**のチャネルからの**k**番目の送信が完了する前に、**k**番目の受信が生じる。

これは、ルール2と同じことを言っている。送信`c <- hoge`が完了する前に、`<-c`が完了する。


バッファ有りに関しては、kとCにいくつか値を代入して確認してみる。

> バッファ**1**のチャネルからの**2**番目の送信が完了する前に、**1**番目の受信が生じる。

> バッファ**2**のチャネルからの**3**番目の送信が完了する前に、**1**番目の受信が生じる。

> バッファ**100**のチャネルからの**101**番目の送信が完了する前に、**1**番目の受信が生じる。

チャネルのバッファ数を超える数の送信`c <- hoge`を行う場合は、その前にバッファを減らす操作、つまり受信`<-c`を行わなければならないということを言っている。
つまり、バッファを超える場合は、バッファ無しのチャネルの場合と同じだということ。

また、

> バッファ**1**のチャネルからの**1**番目の送信が完了する前に、**0**番目の受信が生じる（受信は生じない）。

> バッファ**100**のチャネルからの**50**番目の送信が完了する前に、**-50**番目の受信が生じる（≒受信は生じない）。

つまり、バッファを超えないような送信は、受信を待つ必要はない、ということを言っている。
そして、これはルール1が言いたかったことである。

これらを踏まえると、ルール3が1と2のまとめであるということが理解できる。
<br>
## 例えで理解する
以下のstack overflowで、上記の内容の質問＆回答が行われている。
回答者の例えが分かりやすかった。
https://stackoverflow.com/questions/46822673/how-to-understand-the-ch

まとめると次のようなものである。

チャネル・・・玄関
チャネルに出し入れする値・・・宅配物
goroutine1（送信側）・・・宅配業者
goroutine2（受信側）・・・家に住んでいる人

バッファ有りのチャネルは、宅配ボックス付きの玄関と考えることができる。
宅配の際に相手が家にいる必要はないので、宅配業者は荷物を宅配ボックスに放り込んで、次の仕事を行うことができる。（処理の継続ができる）

バッファ無しのチャネルは、宅配ボックスが無い玄関と考えることができる。
宅配の際には相手が家にいなければならない。家にいない場合は、相手が帰ってくるまで玄関の前で待っていなくてはならない[^1]。（処理をストップしなければならない）
<br><br>
以上になります。内容に誤りがありましたら、是非コメントでお知らせいただけますと幸いです。

[^1]: 現実世界では不在票を投函して次の仕事に行く。
【PHP】「mb_strposが使えない」を解決

##背景
php導入後、mb_strpos関数でエラーが出たので備忘録として記載します。

##環境
CentOS Linux release 8.2.2004 (Core) 
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )

##エラー情報
コンソール内でmb_strpos関数を利用後、定義されていないとエラー

```php
php > echo mb_strpos("ontama", "a");
php > mb_strpos PHP Warning:  Uncaught Error: Call to undefined function mb_strpos() in php shell code:1 Stack trace:
```

##原因
Centosの場合デフォルトはmb_strposは利用できないらしく、パッケージをインストールする必要がある模様
マルチバイト文字列関連の関数を使うときに必要なphp-mbstringをインストール

```bash
[root@localhost etc]# yum install -y php-mbstring
```
OSを再起動

```bash
[root@localhost etc]# reboot
```

コンソールを起動し、mb_strpos関数が使えるようになるか確認

```bash
[root@localhost etc]# php -a
php > echo mb_strpos("ontama", "a");
3
```

無事使えることを確認。

##参考
php環境構築時に入れ忘れてコケるやーつ…。
https://qiita.com/sango/items/a86f9b8cf8c9c641823a
UE4　第１日目　年末マテリアル廻り強化プログラム

まず苔の性質に考えた時に苔は太陽が当たる箇所と岩の上面だけに生えるって事で、モデルの上面だけに苔が張られるように以下のようにノードを組む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/ab34c8b8-de00-5679-62ee-12e0fc7d2419.png)

そして岩肌の所と苔の所をLerpを使って制御する。
ここまで調べれば大体はできると思う。

そこからどうやって苔の部分だけ「もこ」ってさせるかが今回の研究課題。
とりあえず自分の知ってる方法で頂点をイジイジ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/917543af-827f-e3bf-f22c-934e26460d6d.png)

これをワールドディスプレースメントに突っ込む。
FormPowerを上げていくとDisplacementMapに入ってるテクスチャの白い部分がとがって出てくる。
ただ苔なので尖ってほしくないのでSmoothStepでテクスチャの白黒の諧調を滑らかにし、丸く膨らむようにしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/ad0f1344-92e6-1986-5e8f-7129258670ee.png)
左がモコ値０　右がモコ値１０


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/0b85ae12-add5-6033-c6c8-7ab41815c51a.png)
遊びでモコ値50の画像

これで苔のモコ感がでたのそのうちいい感じに調整していい苔を作成予定（たぶん次の回に）
とりあえず第一回目はこの変で次回は苔の調整し、完成図に合わせて配置して、水の作成
きっちり等間隔に3等分する方法

CSSで計算式を可能にするcalcの紹介です。

めちゃくちゃ便利。

# 何がしたいか

フッターの要素を3等分したい。（アプリによくあるフッター要素みたいなのを作りたかった）

```html
<div class="footer-container">
  <div class="container">要素A</div>
  <div class="container">要素B</div>
  <div class="container">要素C</div>
</div>

```

この要素A〜Cをそれぞれきれいに３等分にしたい。

# 書き方

```css
.footer-container > .container {
  width: calc(100% / 3);
}
```

これだけ。

でも、これだとブラウザ（主にIE）のバージョンによっては対応していないこともあるので、必要な場合は下記。

```css
.footer-container > .container {
  width: calc(100% / 3);
  width: 33.333% ;
}
```

# 参考

公式そのまま
https://developer.mozilla.org/ja/docs/Web/CSS/calc()
GKE 基本操作

## 概要
GKEの基本的な操作について記述。

## プロジェクト関係

### プロジェクト作成

プロジェクトIDはすでに利用済みになるなどが多いので、指定しなくてもよい。
プロジェクトIDを指定しない場合、実行時に自動生成されたもので良いか聞かれる。

```
$ gcloud projects create --name [プロジェクト名]

ex)
$ gcloud projects create --name sample-project
No project id provided.

Use [sample-project-XXXXXX] as project id (Y/n)? Y

Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/sample-project-XXXXXX].
Waiting for [operations/cp.XXXXXXXXXXXXXXXXXXX] to finish...done.
Enabling service [cloudapis.googleapis.com] on project [sample-project-XXXXXX]...
Operation "operations/XXX.XX-XXXXXXXXXXXX-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" finished successfully.
```

### プロジェクト一覧確認

```
$ gcloud projects list
PROJECT_ID             NAME            PROJECT_NUMBER
sample-project-XXXXXX  sample-project  XXXXXXXXXXXX
```

### プロジェクト削除

```
$ gcloud projects delete [プロジェクトID]

ex)
$ gcloud projects delete sample-project-XXXXXX
```

### 請求者アカウントとの紐づけ
GKEのコンソール画面にて、請求者アカウントを作成し、
作成したプロジェクトと紐づけを行う。

### デフォルト設定

#### プロジェクトのデフォルト設定
新規で作成した場合は実行不要だが、既にプロジェクトを作成していて、切り替えたいときに実行。

```
$ gcloud config set project [プロジェクトID]

ex)
$ gcloud config set project sample-project-XXXXXX

```

#### リージョンのデフォルト設定

```
$ gcloud config set compute/region [リージョン名]

ex)
$ gcloud config set compute/region us-central1
```

### 参考URL
- https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja
- https://cloud.google.com/anthos/gke/docs/on-prem/archive/1.2/how-to/gcp-project?hl=ja

## クラスタ関係

### Google Kubernetes Engine API 有効化
対象プロジェクトにて、Google Kubernetes Engine API を有効にしておくこと。
https://cloud.google.com/kubernetes-engine/docs/how-to/creating-a-zonal-cluster#before_you_begin

### デフォルトの設定

```
$ gcloud init
```

### クラスタ作成

```
$ gcloud container clusters create [クラスタ名]

ex)
$ gcloud container clusters create sample-cluster
```

- 料金関係
    - デフォルトでは、machine-typeはe2-mediumである。
    - https://cloud.google.com/compute/vm-instance-pricing
- オプション
    - https://cloud.google.com/sdk/gcloud/reference/container/clusters/create

### クラスタ削除

```
$ gcloud container clusters delete sample-cluster
```

### 参考URL
- https://cloud.google.com/kubernetes-engine/docs/how-to/creating-a-zonal-cluster
ngrokの導入方法

## 開発環境
macOS Catalina 10.15.7
Ruby 2.5.3
Rails 5.2.3

## 概要

業務の中でngrokを使う場面があったので、ngrokの導入方法についてまとめていこうと思います。


## 手順

※ 下記のようにHomebrewを用いるやり方もありますが、今回の自分のやり方では、Homebrewは使いません。

> ngrokの利用方法
https://qiita.com/hirokisoccer/items/7033c1bb9c85bf6789bd

① 下記のリンクより、OSに合わせてダウンロードを行ってください

https://www.notion.so/ngrok-dea8e5744d0e4c54851c5c4136950fbb#7d85e79927d0473da1157c47597a12f2


② ダウンロードが終了したら、zipファイルを解凍し、自分の使いやすいディレクトリに置いておいてください。
自分は、コマンドラインでどこからでも使えるように、パスが通っている/usr/local/binにファイルを設置しました。


③ 下記のリンクページのConnect Connect your accountに記述されているコマンドを実行し、authtokenをデフォルトのngrok.ymlファイルに追加するようにしてください。

https://dashboard.ngrok.com/get-started/setup

authtokenをngrok.ymlに追加するコマンド

```
$ ngrok authtoken ${トークン}
```


④ ③までを特に問題なく完了出来たら、下記のコマンドでngroｋを起動してください。

```
$ ngrok http ${ローカルのポート番号（例：Railsで3000など）}
```

## まとめ

以上のような手順を踏むだけでngrokを起動することが出来ます。
またngrokは、ローカル環境をhttp/httpsで簡単に外部に公開できるので積極的に活用していくと良いと思います。


## 参考

> ngrokの利用方法
https://qiita.com/hirokisoccer/items/7033c1bb9c85bf6789bd

> ローカルサイトを外部に公開できるngrokの使い方
https://parashuto.com/rriver/tools/secure-tunneling-service-ngrok#features
apple shortcut で文字入力をして表示する（値取得のデバックにも使える）画像大量

[tech blog](https://kajirikajiri.netlify.app/)

# サンプルを動かしたいという方はこちら
**クリックしてすぐ使えます**
[サンプル集](https://kajirikajiri.netlify.app/20201229180502/)

# 関連する内容
[apple shortcut で文字入力をして表示する
](https://qiita.com/kajirikajiri/items/828f009df1b439e53ea9)
[apple shortcut でwebページのURLを取得して表示する](https://qiita.com/kajirikajiri/items/6810a528efc903c22869)

[apple shortcut Get Requestする（画像大量）](https://qiita.com/kajirikajiri/items/0009db4aef9e256f1e00)
# apple shortcutで文字入力をして表示する方法(デバッグにも)


### apple shortcutを開きます
### 右上の＋をタップ
![IMG_0485.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/796d39c8-1baa-1e36-82c1-c1311538d936.png)

### アクションを追加をタップ
![IMG_0486.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/eea02386-4162-5c56-8bbf-63f16caeb3e8.png)

### 要求と入力する
![IMG_0487.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/4d7d19b5-3d8f-f675-4031-1f0e2c4f8bb1.png)

### 入力を要求をタップ
![IMG_0488.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/8ec70b5e-c6fd-52da-9f54-f88f5e79446b.png)

### ＋をタップ
![IMG_0489.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/f998c020-d3aa-8a0b-290a-512676c0e422.png)

### アラートと入力してアラートを表示をタップ
![IMG_0490.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/40f7b19e-1e7e-0cc9-063d-98988774fdfc.png)

### 続けますか？をタップ
![IMG_0491.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/609cff95-e197-ae24-86a0-086717df4935.png)

### 入力内容を消去して変数をタップ
![IMG_0492.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/5f036097-32fd-c5bb-a4f2-0b2fe76c87c6.png)

### 指定入力をタップ
![IMG_0493.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/ce27b474-138f-9f42-bf4b-da2f118b0979.png)

### 次へをタップ
![IMG_0496.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/c08d735f-bc96-9df2-73f7-514c36af4913.png)

### ショートカット名を入力して完了をタップ
![IMG_0499.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/b606b5a8-557a-ce9f-1519-ffd0b9853991.png)


### ショートカットをタップ
![IMG_0501.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/807194d1-e366-7335-18e2-4b53c1a35c60.png)

### テキストを入力して完了をタップ
![IMG_0503.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/f069ae96-6e95-6008-1503-b6fa715048fb.png)

### 入力したテキストが表示される
![IMG_0504.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/e4b05069-e9cd-77ec-a6f4-f7b8cc47641b.png)

# サンプルを動かしたいという方はこちら
**クリックしてすぐ使えます**
[サンプル集](https://kajirikajiri.netlify.app/20201229180502/)

# 関連する内容
[apple shortcut で文字入力をして表示する
](https://qiita.com/kajirikajiri/items/828f009df1b439e53ea9)
[apple shortcut でwebページのURLを取得して表示する](https://qiita.com/kajirikajiri/items/6810a528efc903c22869)

[apple shortcut Get Requestする（画像大量）](https://qiita.com/kajirikajiri/items/0009db4aef9e256f1e00)
Ubuntu 18.04 を インストールしようとしたら "Initramfs unpacking failed: Decoding failed" と表示され起動に失敗した話

はじめに
-

WindowsとLinuxのデュアルブート環境を得るべく、ライブUSBからUbuntuをインストールしようとしたところ
BIOS画面の直後に "Initramfs unpacking failed: Decoding failed" と表示され起動に失敗しました。
その時の解決法を備忘録として記載します。

※症状はNVIDIA GeForceから画面出力していたことに起因していました。
　NVIDIAを使用していない場合は、当記事を読んでもお役に立てないかもしれません。

Ubuntu のインストール USB メディアの作成方法およびインストール方法は、以下の記事が詳しいです。
https://qiita.com/koba-jon/items/240e6b9a9bee6a0b28cc

症状
-

ライブUSBを起動したところ、以下の画面が出た（絶望）
![Ubunts_install_err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989248/f83c94b9-f9e6-013d-9e3c-fa4b35f13345.png)

原因
-
NVIDIA GeForceから画面出力をしていたが、これがよくなかったっぽい。
これから起動しようとしているUbuntuにはNVIDIA公式のドライバが入っていないので（当たり前）
nouveauがGPUを動かそうと頑張ってくれている。でも、だめみたいだった。

解決策
-
PC起動→起動OS選択画面（GNU GRUB）と進んだところで e キーを押す。
カーネルパラメータの設定画面に遷移するので、"Linux" の行の一番最後に以下を追記する。
```--- nomodeset
```
書き終わったら Ctrx-x か F10 を押してブートしましょう。
これで起動するはず。

追加でやっておくこと
-
また次回も同じことにならないように、bootパラメータを以下のように書き換えておく。

- /etc/default/grub

```
#GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="nomodeset"
```
書き換えたら、以下のコマンドで反映する。
```sudo update-grub
```

もし意図した解像度が出ていない場合は、以下を参考にNVIDIAの公式ドライバを入れてください。
https://sy07-sub.hatenablog.com/entry/2018/10/14/003750

参考
-

- ブート用USBを使った Ubuntu のインストール方法
https://qiita.com/koba-jon/items/240e6b9a9bee6a0b28cc

- Ubuntu 18.04 にNVIDIA公式グラフィックドライバを入れてみる 的な
https://sy07-sub.hatenablog.com/entry/2018/10/14/003750
→GeForce などの NVIDIA 系 GPU ユーザーは公式のドライバを使うほうが安全かも。

- NVIDIA GeForce 入り PC で Ubuntu インストーラ(GUI版)の表示が壊れていた場合
https://qiita.com/yoya/items/026317fe2ddb30ab411d
→ 発生している症状こそ違えど、解決方法は同じでした。(この記事を参考に解決した)
AWS RDS インスタンスは ping が通らない。疎通確認するぞ。MySQL 編

AWS の RDS インスタンスは ping がつかう ICMP のトラフィックを受け付けていないようです。
running なのにエンドポイントに ping 叩きまくっても反応ないのはそのせいです。

`telnet` とかでもできるみたい ( [※1](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-cannot-connect/) ) ですが、どうせ環境構築中はそのまま DB に接続したくなると思うので、クライアントをインストールしちゃう方が楽だと思います。

私は RDS で MySQL を立ち上げてたので、`mysql` クライアントをインストールして疎通確認しました。

```shell
$ yum install mysql
$ mysqladmin ping -h xxx.xxx.xxx.xxx -u username
```

もちろん、パブリックアクセスの設定が OFF になっていれば、該当の RDS インスタンスと同一のセキュリティグループに所属するリソースからでなければ応答しません。

おしまい。
C# クエリ構文で複数項目の取得する時の書き方

【結論】
クエリ構文で複数の項目を取得したい場合、
select A.Id,A.Name;
のように書くことはできず、
**new と{}**を記載して下記のように書く必要がある
select **new** **{** A.Id, A.Name **}**;

※追記
　@albireoさんのコメントを本文に追記
　C#7.0以降だとnew を記載せずとも**()**で記載が可能になった。
select **(**A.Id, A.Name **)**;

**サンプルコード**



            var products = new List<Product>();

            products.Add(new Product(10, "A", 200));
            products.Add(new Product(20, "B", 300));
            products.Add(new Product(30, "C", 400));
            products.Add(new Product(40, "D", 500));

            // selectしたい項目が１つの場合
            var result1 = from product in products
                         select product.ProductName;　　

            foreach (var val in result1)
            {
                Console.WriteLine("select(取得したい項目1つ)"+ string.Join(",", val.ProductName));
            }


            // selectしたい項目が複数の場合 パターン１
            var result2 = from product in products
                         select new { product.ProductId, product.ProductName};　　//★★★ポイント★★★

            // ※追記
            // selectしたい項目が複数の場合 パターン2
            var result2 = from product in products
                         select (product.ProductId, product.ProductName);　　//★★★ポイント★★★

            foreach (var product in result2)
            {
                Console.WriteLine("select(取得したい項目複数)" + "ID:"+ product.ProductId + " Name:" + product.ProductName);
            }

select (product.ProductId, product.ProductName);



    public sealed class Product 
    {
        public Product(int producted, string productName, int price)
        {
            ProductId = producted;
            ProductName = productName;
            Price = price;
        }

        public int ProductId { get; }
        public string ProductName { get; }
        public int Price { get; }
    }


**おまけ**

Select結果の名前を変更したい場合
Select文内で代入処理を行うことで実現できる

            var result2 = from product in products
                         select new { product.ProductId, ItemName = "商品名:" + product.ProductName}; //★★★ポイント★★★

            foreach (var product in result2)
            {
                Console.WriteLine("select(取得したい項目複数)" + "ID:"+ product.ProductId + " Name:" + product.ItemName);
            }
個人アプリ開発日記 #1

#目次
[1.はじめに](#1-はじめに)
[2.内容](#2-内容)
[3.おわりに](#3-おわりに)

#1. はじめに
私はプログラミング初学者ですが、Qiitaでは今まで自分が詰まった
エラーの解決方法や、Ruby/Railsの小技に関する記事を10本強投稿してきました！

来月から転職活動を本格的に始めるにあたり、
1ヶ月程前からポートフォリオ用に個人アプリを制作しています。
自分の制作過程をアウトプットすることで、理解を深めてより良い
作品作りに活かしたいと考え、今日から開発日記として投稿していきます。

アプリを作っているけど中々良いアイデアが浮かばない、人に説明する時の
まとめ方がよく分からない。。という人の役に立てればこの上なく嬉しいです。

初回の今日は、自分が現在制作しているアプリの概要を簡単に説明していきます！

#2. 内容
以下の項目に箇条書きで回答していきます。

1) アプリを一言で言うと
2) キャッチコピー
3) ターゲット（メインターゲット、サブターゲット）
4) アプリでできること
5) このアプリがあると感じる嬉しいこと

1) アプリを一言で言うと
「友達探しのマッチングアプリ」
※カテゴリーとしては"フレンドマッチングアプリ"   FacebookとTinderを足して2で割ったイメージです。

2) キャッチコピー
「つながりを、もっと身近に」

3) ターゲット（生活の変化を最も喜ぶ人・望む人）
3-1.メインターゲット
①友達が欲しい大学生（特に1年生）
②ママ友が欲しい主婦

3-2.サブターゲット
①プライベートorビジネス問わず、繋がりを増やしたい人
②気軽に話せる友達or雑談相手を探している人
③趣味やビジネス等の情報交換をしたい人
④オンラインでも、きっかけ（共通点）がないと人と交流することが苦手な人

4) アプリでできること（ユーザーに説明するつもりで）
①ユーザーは登録時に自分の個人情報を入力（出身地、年齢、誕生日、血液型etc）
②個人情報の項目ごとに他のユーザーを検索して、共通点がある人を発見
③チャットでクローズドな交流

5) このアプリがあると感じる嬉しいこと（機能ではなく、ユーザーメリット）
①自分と共通点を持った人（自分に合いそうな人）を簡単に見つけられる。
②価値観が近い、趣味・嗜好が似ている人とつながることで、人生が今より少し豊かになる。

#3. おわりに
何の前提もなく、いきなりアプリの説明をしたので唐突感が強かったと思います💦
明日は、このアプリ制作に至った背景を深堀りしていきたいと思います。
最後まで読んで頂きありがとうございました！
asdf で Python 3.9.1 + pipenv をインストールする

Python のバージョン管理を、pyenv から asdf へお引っ越ししたので、再度 Python と pipenv をインストールしていきます。
パッケージ管理は pipenv が使いやすかったので引き続き使います。

# 前提
asdf をすでに導入している状態を前提とします。




# インストールと確認
Python 3.9.1をインストールし、確認します。

#### インストール
```shell:shell
# プラグインをインストール
asdf plugin-add python

# インストール可能なバージョンの確認
asdf list-all python

# インストール
asdf install python 3.9.1

# 実体の確認
where python
/Users/USERNAME/.asdf/shims/python

asdf which python
/Users/USERNAME/.asdf/installs/python/3.9.1/bin/python
```
#### 確認 & グローバルに設定
```shell:shell
# インストールを確認
asdf list python

# グローバルに設定 & shim 再生成
asdf global python 3.9.1
asdf reshim python

# シェルを再起動 / リロード

# バージョンの確認
python -V
Python 3.9.1
```
無事インストールできました🐈

# pipenv
続けて`pipenv`をインストールする場合は以下です。
#### インストール
```shell:shell
# pip アップデート
pip install --upgrade pip

# pipenv インストール & shim 再生成
pip install pipenv
asdf reshim python
```
#### 確認
```shell:shell
# バージョンの確認
pipenv --version
pipenv, version 2020.11.15

# 実体の確認
where pipenv
/Users/cray/.asdf/shims/pipenv

asdf which pipenv
/Users/USERNAME/.asdf/installs/python/3.9.1/bin/pipenv

```

無事インストールできました:cactus:

---

Source: 
https://github.com/danhper/asdf-python
Postgresqlを起動しようとしても起動できない時に考えられる原因と対処法 

## 開発環境

macOS Catalina 10.15.7
PostgreSQL 13.1
Homebrew 2.7.0


## 概要

環境構築（docker等は一切使っていない）でPostgresqlをデータベースに採用した際に、Postgresqlを起動しようとしても起動できず、信じられないほど時間がかかったのでその問題の原因についてシェアしたいと思います。


## 構築の手順

自分が過去に書いた記事があるのでこちらを参考にしてください。

結果的には出来ませんでしたが、自分はこの手順に沿って環境構築を進めてました。

>【初学者向け】 PostgreSQLの環境構築
https://qiita.com/msy7822/items/98525f9a1de6332ba323


## 自分が遭遇したエラー

自分が遭遇したエラーは下記のような感じです！

当てはまる方がいましたらもしかしたら自分と同じ原因かもしれないです！！

postmaster.pidファイルを削除しても、「postmaster.pid already exists」の文言が発生していたり、

```
$ brew services start postgresql
```

や

```
$ postgres -D /usr/local/var/${postgresqlのディレクトリ}
```

などのコマンドを実行してもpostgresqlが起動しないなどのエラーが発生した場合、自分もそうでしたが、バックグラウンドですでにPostgreSQLが走っている可能性があります。

故にコンフリクトとして上記のようなエラーが発生していたと考えられます！！




## 解決方法


① まずは、PostgreSQLがバックグラウンドで走っていることを確認するために、下記のコマンドで起動していないはずのPostgreSQLがネットワークソケット上で動いていることを確かめましょう。　

```
$ lsof -i:${Postgresqlのポート番号}
```

② ①で得られた結果のうち「PID」の値（数字）をkillコマンドで停止させることを試みます。

```
$ kill -9 ${PIDの値}
```

③ もう一度、①コマンドでPostgreSQLの起動状況を確認してみてください（ここで何かしら起動していたら、おそらくPostgreSQLがバックグラウンドで起動されているということになります。）



④ ③が確認出来たら特に何もせず、データベースの作成を試みてみてください！
ここで無事にデータベースの作成に成功したら環境構築は完了です。

+ データベース作成コマンド

```
$ createdb ${任意のデータベース名}
```

+ ユーザー作成コマンド

```
$ createuser ${任意のユーザー名}
```


## 参考

> [PostgreSQL] よく使うコマンドまとめ
https://dev.classmethod.jp/articles/postgresql-organize-command/

> 【 lsof 】コマンド――オープンしているファイルを一覧表示する
https://www.atmarkit.co.jp/ait/articles/1904/18/news033.html

> PostgreSQLのインストールから起動/停止まで
https://qiita.com/sf213471118/items/0e843af332ea0210c810
Ubuntuからxrdpでサウンドをリダイレクトしたい

# ターゲット
Ubuntu 20.10
xrdpはインストール&設定済みとします

# PulseAudioのインストール
今回は、次のサイトから14.0をダウンロードしました。
https://www.freedesktop.org/wiki/Software/PulseAudio/

以下にダウンロード

```
/home/masato/dev/pulse
```

tar.xzなので解凍します

```sh:/home/masato/dev/pulse
tar xf ./pulseaudio-14.0.tar.xz
```

解凍したディレクトリにcd

```sh:/home/masato/dev/pulse
cd ./pulseaudio-14.0
```

ビルドする

```sh:/home/masato/dev/pulse/pulseaudio-14.0
sudo ./bootstrap.sh
sudo ./configure
sudo make install
```

(依存関係が解決していない場合は以下を実行)

```sh
sudo apt install git libpulse-dev autoconf m4 build-essential dpkg-dev libsndfile-dev libcap-dev libtool
```

# xrdp moduleのダウンロード

カレントディレクトリを移動

```sh:/home/masato/dev/pulse/pulseaudio-14.0
cd ../
```

**xrdp sound modules**をgit clone

```sh:/home/masato/dev/pulse/
git clone https://github.com/neutrinolabs/pulseaudio-module-xrdp.git
```

xrdp sound modulesをビルド

```sh:/home/masato/dev/pulse/pulseaudio-module-xrdp
sudo ./bootstrap
sudo ./configure PULSE_DIR="/home/masato/dev/pulse/pulseaudio-14.0"
# 先にダウンロード&解凍したPulseAudioのディレクトリを指定
sudo make
```

出来上がったファイルをコピー

```sh:/home/masato/dev/pulse/pulseaudio-module-xrdp
cd ./src/.libs
# /home/masato/dev/pulse/pulseaudio-module-xrdp/src/.libs
sudo install -t "/var/lib/xrdp-pulseaudio-installer" -D -m 644 *.so
```

ここで再起動

# 動作確認
GNOMEの**「設定」**＞**「サウンド」**を開くとこんな感じになっているはず
![Screenshot from 2020-12-29 18-44-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567239/f40e6a00-098f-ce39-093c-9562461c5c29.png)

**これでクライアントのWindows PCから音が出た**

# 参考
[PulseAudio](https://www.freedesktop.org/wiki/Software/PulseAudio/)
[Building and Installing PulseAudio From Git](https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/PulseAudioFromGit/)
[xRDP – How to redirect Sound on Ubuntu 18.04](https://c-nergy.be/blog/?p=12469)
[xRDP – Missing packages for Sound Redirection in Ubuntu 19.04](https://c-nergy.be/blog/?p=13655)
[pulseaudio-module-xrdp - github](https://github.com/neutrinolabs/pulseaudio-module-xrdp)
VideoPose3Dでフィギュアスケートの動き解析

#背景
最近，テレビでフィギュアスケートを見ていて，ジャンプ時の軌道が3次元的に可視化されていて，回転数も画像から計測できないのかなと思い，解析を試みた．軽くサーベイしてみると，以下の記事が見つかった．
[元フィギュアスケート選手とディープラーニングの華麗な出会い　「選手の役に立ちたい」社会人大学院生の挑戦](https://www.itmedia.co.jp/news/articles/1904/12/news016_3.html)

CNN+SVMで回転不足の有無し判定を行おうというものだ．ここで最近，姿勢推定界隈では，OpenPoseの3次元版があるということをふと思い出した．3次元姿勢推定の結果から直接的に回転数をカウントすることはできないかと思った．
3次元姿勢推定についてサーベイすると，FAIRのVideoPose3Dというリポジトリを発見．デモにフィギュアスケートの例が載っていたため即採用．
[VideoPose3D(Facebook AI Research)](https://github.com/facebookresearch/VideoPose3D)

#環境
* Google Colabolatory
    * PyTorch
    * Detectron2

#いざ実行
実行環境の導入に関しては，notebookにまとめたので以下を参照（利用の際は，git clone文とパス周りを変更が必要）．
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/kuboyoo/VideoPose3D/blob/master/VideoPose3D.ipynb)
colabでの実行に際して，`inference/infer_video_d2.py`のcocoのpklファイルのロード部分を変更し，同じ階層にcocoのpklを直接配置した（デフォルトではweb上から読み込むようになっていたが，なぜか読み込みに失敗した）．

使用したのは紀平選手の4回転サルコウの動画
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227432/cc31fd17-24bc-6f68-1921-f8f9a6f7545c.gif)
テロップを無くすためクロップしたり，30fpsから50fpsに変換したり，紆余曲折があったが，結果としてかなり良い推定結果が得られた（上図は10fpsで表示）．
ここで気になるのは回転数である．上図の視点ではジャンプの瞬間に正しく関節を得られているのかが分かりにくい．
![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227432/afe8ca46-9491-85db-852e-d5ae3a8d7a05.jpeg)
そこで，腰（上図2,5）のみを，真上視点でプロット．
![output_roll.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227432/4b0d3724-38f9-9e87-bd55-10307addf107.gif)
上図をみると，ジャンプの瞬間プルプルと振動しているだけで，赤と黒の線が入れ替わっていない．つまるところ，ジャンプの瞬間の回転（体の裏表）は正しく推定されていない．ゆえにこの情報からは回転数をカウントすることは難しそうである．

![output_shoulder.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227432/518e71cb-c690-0375-bd4c-67954fafdb2c.gif)
ただ，面白かったのは，回転の瞬間である．両腕・両肩のみ（関節ID=9~17）を上から見てみると，ジャンプの瞬間は中心付近に寄っていることが見てとれる．この３次元プロットは骨盤（関節ID=1）を中心にプロットされているので，回転軸のブレなどはこの情報から計算することはできそう．VideoPose3D自体2年くらい前の研究なので，もうやられているとは思うが，色々な研究のネタにはなりそう．


#今回使用したプログラム一式
[https://github.com/kuboyoo/VideoPose3D](https://github.com/kuboyoo/VideoPose3D)
駆け出しエンジニアがすべきGitHub活用術

# はじめに
大げさなタイトルを付けてしまいましたが、この記事で紹介するGitHub活用術は、本質的なものではありません。

GitHubの**見た目**の部分を変えることによって、プログラミングの学習を始めたばかりの人のモチベーションの維持に役立てばいいなと思い、GitHub歴３ヶ月の自分がやって良かったことを紹介します。

# 目次
1. かっこいいプロフィールページを作る
2. 草の表示を立体的にする

# 1. かっこいいプロフィールページを作る

GitHubでは、**自分のusernameと同名のリポジトリ**を作成し、そのリポジトリ内で**README.md**を作成することで、GitHubプロフィールページを作成することができます。
[![Image from Gyazo](https://i.gyazo.com/cd46ddcd543b417e5a141960102f56f8.png)](https://gyazo.com/cd46ddcd543b417e5a141960102f56f8)
**README.md**にマークダウン記法で記述することで、様々な情報を表示させることができます。

例えば**コミット数**、**プルリクエスト数**、**使用言語の比率**などの統計情報や、**Twitterのフォロワー数**、**QiitaのContribution数**、**実績**などが表示できます。（下図は@ryota21さんのプロフィールページ）
[![Image from Gyazo](https://i.gyazo.com/53f1e81e1f33fbd67503b50f701b1678.png)](https://gyazo.com/53f1e81e1f33fbd67503b50f701b1678)
他にも、**運営しているブログ**や**自分で作成したアプリ**がある人はそれを表示させるのも良いと思います。（下図は@aiandroxさんのプロフィールページ）
[![Image from Gyazo](https://i.gyazo.com/773467d10dc6359ea45f6b2443dcfe84.png)](https://gyazo.com/773467d10dc6359ea45f6b2443dcfe84 "test")
プロフィールページの詳しい作り方は、[こちらの記事](https://qiita.com/Hassan/items/134009209f5709f892b1)で紹介されているのでぜひご覧ください。


# 2. 草の表示を立体的にする

GitHubでは、毎日のContribution数がダッシュボードに表示されます。
デフォルトでは2Dのヒートマップとなっていますよね。
[![Image from Gyazo](https://i.gyazo.com/d34afdd453a36360d83d141f3ace5f89.png)](https://gyazo.com/d34afdd453a36360d83d141f3ace5f89)
[GitHub Isometric Contributions](https://chrome.google.com/webstore/detail/github-isometric-contribu/mjoedlfflcchnleknnceiplgaeoegien?hl=en&gl=US) (GitHubは[こちら](https://github.com/jasonlong/isometric-contributions)）というChrome拡張機能をインストールすることで、2Dのヒートマップと3Dの立体棒グラフを切り替えられるようになります。
[![Image from Gyazo](https://i.gyazo.com/0fda1038ae22ffe5fb501bf5cf642e90.png)](https://gyazo.com/0fda1038ae22ffe5fb501bf5cf642e90)
2Dのヒートマップよりかっこよくなった気がします。3Dの立体棒グラフだと隠れている奥の方が見えないという場合でも、ボタンひとつで切り替えることができます。

また、この拡張機能には他にも良い点があり、**現時点でContributionsが何日連続で続いているか**を表示してくれます。
[![Image from Gyazo](https://i.gyazo.com/49bb230d2da44c066504721266473eb5.png)](https://gyazo.com/49bb230d2da44c066504721266473eb5)
自分は、この記録を伸ばしたいというモチベーションで毎日コードを書く習慣を継続できています。

# おわりに
GitHubの**見た目**の部分にテーマを絞って、GitHub活用術を紹介しました。
この記事が、プログラミングの学習を始めたばかりの人のモチベーションの維持に役立つと幸いです。

# 謝辞
この記事では自分ではない方のプロフィールページの画像も、許可を頂いた上で使用させていただきました。@aiandroxさん、@ryota21さん、協力していただいてどうもありがとうございました。


# 参考にした記事
[10分で自分のGitHubプロフィールをカッコ良くする
](https://qiita.com/Hassan/items/134009209f5709f892b1)[Github の contribution のグラフを立体的に表示させる
](https://qiita.com/pekepek/items/a334ab9e201c486aed3f)
nginx から PHP-FPM に URL パラメータを渡す

Laravel のページャー機能を使おうとしたら `$_GET` に URL パラメータが渡ってなくてうまく動かず。
PHP/Laravel や nginx のアクセスログでは、ちゃんとリクエスト URI にパラメータは渡ってるし、もちろんリダイレクトなどによって URI が書き換えられているようなこともなく 🤔 状態。

nginx から PHP に転送するときに意図した挙動をしてない感じだったので、nginx の conf をちょろちょろ書き換えながらしばらく格闘。

nginx の version は 1.18-alpine。

```Dockerfile
FROM nginx:1.18-alpine
```

以下のような変更をでうまく動きました。

```nginx
server {
    ...

    location / {
        try_files $uri $uri/ /index.php$query_string;
    }

    ...
}
```

↓

```nginx
server {
    ...

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    ...
}
```

`$query_string` を `$args` に変えただけ。

nginx ﾑｽﾞｶｼｲ。

おしまい。
Codeforces Educational Codeforces Round 101 A. Regular Bracket Sequence 括弧と?の文字列をDPで確認する

https://codeforces.com/contest/1469/problem/A

誤読するとAにしては重い問題だったのですが、重い方の解き方をメモ。

# 概要
- "("と")"と"?"でなる文字列があります。"?"はそれぞれ"("か")"に変換します。
- 変換は必ず実施しなければならず、括弧や?の入れ替えや削除はNGです。
- <font color=red><b>"("および")"は文字列に1回のみ出現します</b></font> (これを読み飛ばしている人が多かった)
- 文字数は100以内です。

()の対応が正しいかをYES/NOで回答してください

# 正しく文章を読んでいた場合の想定解法

- 文字数が偶数であり、1.")"が1文字目ではない　かつ2."("が最後の文字でない　かぎりYESです。

# 括弧の対応の確認の仕方

競技プログラミングで括弧の対応を確認するのは典型です。

- "("を$+1$, ")"を$-1$として扱う.最後に0であればOK。この計算を「カウント」と以降呼びます。
- 途中で負の数になってはいけない。例えば"())("などは合計で0だが、3文字目で-1になる

# DPでの解き方

上記の状態をDPで解きます。$i$文字目のカウンタ$j$である状態数を$dp[i+1][j]$で示します。初期状態は$dp[0][0] = 1です。(1文字も選択されていないときのカウンタの状態は1通りしかありません)

i文字目をすべて以下のように処理していきます。$k$は各カウンタの値です。

- i文字目が"("のとき、$dp[i+1][k+1] += dp[i][k]$です
- i文字目が")"のとき、$dp[i+1][k-1] += dp[i][k]$です。ただし、$k=0$の時、この計算は行いません。$k=-1$はカウンタが0未満になる状態なので、失敗する状態だからです。
- i文字目が"?"のとき、$dp[i+1][k+1] += dp[i][k]$ および $dp[i+1][k-1] += dp[i][k]$です。(同様に$k=-1$になる状態は処理しません)

この結果、$dp[n][0]$が0でなければ、つまり、最後の文字に到達したときにカウンタが0以外であれば、条件を満たせる遷移が存在するためYESを出力します。

# 実装
do_dp()がdp解法です。do()が想定解法(多分)です。

```Python
def do():
    s = input()
    if len(s) % 2 == 1:
        print("NO")
        return
    l = s.find("(")
    r = s.find(")")
    if r == 0 or l == len(s)-1:
        print("NO")
        return
    print("YES")
def do_dp():
    s = input()
    n = len(s)
    dp = [[0] * (100 + 10) for _ in range(100 + 10)]
    dp[0][0] = 1
    for i in range(n):
        ch = s[i]
        if ch == "(":
            for k in range(105):
                dp[i+1][k+1] += dp[i][k]
        elif ch == ")":
            for k in range(105):
                if k != 0:
                    dp[i + 1][k - 1] += dp[i][k]
        else:
            for k in range(105):
                dp[i+1][k+1] += dp[i][k]
                if k != 0:
                    dp[i + 1][k - 1] += dp[i][k]
    print("YES" if dp[n][0] != 0 else "NO")

q = int(input())
for _ in range(q):
    do_dp()
```

https://codeforces.com/contest/1469/submission/102673917
開発手法をざっくりまとめてみた

## はじめに
求人を見ていて、これなんだと思った開発手法を発見したので覚えるためにも記事を書いてみました。


<br>

##ウォータフォール型開発
古くから使用されている手法の一つで、段階一つずつ確認しながら次の工程に進む手法。

<br>

企画　➜　設計　➜　実装　➜　テスト　➜　納品

<br>

物作りの基本的な開発の流れですね！

<br>

▷メリット
・スケジュールが立てやすい
・進捗状況も把握しやすい

予算の見積もり、エンジニアの配置、事前の準備や計画を明確かつスムーズに進めていくことが可能です。

<br>

▶デメリット
・修正、仕様変更が必要時に時間がかかる。
・各工程の完璧さが重要

途中段階で完成形が目に見える形で出てこないというデメリットはありますが、全体像を把握しやすい開発手法のため、作業に関わる人員規模を把握しやすい一面があります。

<br>

## アジャイル開発
開発工程が機能単位で分かれている。
実装したい機能ごとに開発工程を何度も繰り返し行う手法。

<br>

「開発において修正や変更はつきもの」という前提で開発を進める。

<br>

▷メリット
・変更、修正に対応しやすい。
・コストが抑えられる。

小単位ごとにその都度リリースを行うので、実際にユーザーが使用した際の評価や意見を取り入れることができ、柔軟かつ素早くフィードバックを行うことが可能。

<br>

▶デメリット
・スケジュールの把握等が難しくなる。
・当初の計画から方向性が大きくずれてしまう可能性もあり得る。

仕様の変更が発生しやすいWebでのサービスや近年増加しているアプリの開発に適している。

<br>

## スクラム開発
プロダクトへの要望を優先順位ごとに並べ替えて、その順に機能を作る。
固定の短期間（１〜４週間程度）の単位で開発を区切り、その中で計画を立てる。
プロジェクトの状況や進め方に問題がないか、メンバー同士で毎日確認しあう。
作っている機能が正しいかどうか、定期的に確認の場を設ける。

<br>

▷メリット
・短い期間で、最大限の成果をあげる
・作業の工数見積もりが正確になる
・自立的なチーム作りが出来る
・チーム内で発生している問題の検知が早い
・早めに軌道修正が出来る

<br>

▶デメリット
・開発手法を習得するまでの時間がかかる
・顧客の協力も必要になる

<br>

## チケット駆動開発
プロジェクトの中で発生する数あるタスクをチケットという単位に分割してタスク処理する手法。

アジャイル開発に、似ていますね！
<br>

▷メリット
・ソースコードのコミットのログにチケットIDを入れておけばソースコードの編集履歴とチケットが紐づくので、ソースコードの可視化ができる。
・チケットごとの工数を登録すると全部の工程でどれくらい時間が、かかったのかの集計を取ることもできる。

<br>

▶デメリット
・全体の設計が見えなくなる
・工程がその通りになるとは限らない

<br>

## DevOps開発
DevOps（デブオプス）という言葉は、Development（開発チーム）とOperations（運用チーム）のふたつの言葉を組み合わせた言葉。

本来、社内のチーム間の協力は不可欠ですが、新しい機能の実装とリリースを重視する開発チームと、サービスの安定性・維持・利便性を重視する運用チームの間で対立が生まれることも珍しくはありません。そこで、このような対立を一切なくし、協力体制を確立して開発を推進していくことがDevOps開発の特徴。

<br>

うまくハマった時は、良質な開発が出来そうですね！

<br>

◾必要な組織文化
・お互いを尊重すること
・お互いを信頼すること
・失敗を避難しないこと
・一緒に解決策を考える

<br>

## プロトタイピング
プロトタイピング（Prototyping）は「試作」の意味。
ソフトウェア開発の初期段階に試作モデルを作り、機能や操作性を確認し、ユーザーの要求や評価を本番のシステムに反映して完成させる開発手法。

<br>

▷メリット
・処理内容、使い勝手を確認できる。
・利用者の望むシステムとのズレや不具合を早期発見。

<br>

▶デメリット
・再びプロトタイプを作成する手順が増える。
・工数、コストの増加につながる。

<br>

## ユニケージ開発手法
UNIX系のコマンドやシェルスクリプトでシステム開発を行うもので、日本発の開発手法。

あらかじめ用意されているコマンドを、パイプやリダイレクトでつなぎ、基幹システムなどを構築します。

<br>
▷メリット
・処理速度が高速
・データ処理を短時間で出来る

<br>
▶デメリット
・ソースコードが読みにくい。
・保守やメンテナンスの負担がある

<br>

## 最後に
こんな感じかなというのが、はっきりしたかなと思います。

また、忘れた時は見返します。

開発の手法一つも、目的や状況にあった方法を選択して開発して行きたいですね。

<br>
<br>

[開発手法参考](https://www.rstone-jp.com/column/200630no1/)
[スクラム参考](https://geechs-job.com/tips/details/30)
[チケット駆動参考](https://entershare.jp/1040/#:~:text=%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88,%E3%82%BF%E3%82%B9%E3%82%AF%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E6%89%8B%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82)
[ユニケージ開発参考](https://crowd.itpropartners.com/pieceblog/3360)
【条件分岐】if達の使い方

#はじめに
駆け出しのプログラミング初心者。
条件分岐（じょうけんぶんき）について、まとめたので投稿しますわ。

##じょうけんぶんきって？？🙄🙄
ある条件を指定して、その条件に合っていればコードを実行し、
違ったら別のコードを実行するというような、条件によって実行される処理を分岐させるヤツ😎

##if
条件分岐文の代表格。
「もしこの変数が1以上であれば」のような条件を付けて、処理を分岐させる。

★Rubyの場合

```ruby
number = 2
if number > 1 && number < 10
  puts '条件分岐'
end
```

★PHPの場合

```php
<?php
$number = 2 ;
$text = " 条件分岐 ";
if ($number > 1 && $number < 10){
  echo $text ;
}
?>
```
##else
if文の条件式がfalseで実行されない場合に実行させる処理を記述することができる。
if文が実行されるとelse文は実行されず、if文が実行されないとelse文が実行されない。
ちな、elseは「その他」を意味する英単語。


★Rubyの場合

```ruby
if 10 == 1
  puts '10 == 1 はtrueじゃないね'
else
  puts 'false判定になるね'
end
```

★PHPの場合

```php
<?php
$truetext = "10 == 1 はtrueじゃないね" ;
$falsetext = "false判定になるね"
if (10 == 1){
  echo $truetext ;
} else {
  echo $falsetext ;
}
?>
```


##elsif（phpではelseif）
ifとelseの合体版。
しかし、elseとは異なり、elsif式がtrueの場合の時のみ、式を実行する。

★Rubyの場合

```ruby
number = 2
if number == 1
  puts "2 == 1 はtrueじゃないね"
elsif number == 2
  puts "false判定になるね"
end
```

★PHPの場合

```php
<?php
$number = 2 ;
if ($number == 1){
    echo "2 == 1 はtrueじゃないね";
} elseif ($number == 2){
    echo "false判定になるね";
}
?>
```

#参考サイト
株式会社バズワード（rubyの参考）
https://www.javadrive.jp/ruby/if/index7.html
phpの公式
https://www.php.net/manual/ja/control-structures.elseif.php

#おわりに
プログラミングにおいて重要な要素だね！！😇😇 
だけど複数組み合わせると処理の流れが複雑で混乱しそう🤪
あと、Rubyの方が書きやすい！！！
Rubyでうるう年判定

\![macOS-11.1](<https://img.shields.io/badge/macOS-11.1-brightgreen>) \![ruby-2.7.2p137](<https://img.shields.io/badge/ruby-2.7.2p137-brightgreen>) 


# Preface (はじめに)

本記事はマルチスケールシミュレーション特論の第7回に関連する記事です.[チャート式Ruby](https://qiita.com/daddygongon/items/6f38d9a04e127a7952a7)に従って進めていきます.

今回は[チャート式ruby-III(if, case, Array.each by leap year)](https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8)に従ってRubyの条件分岐とArray.eachについて学んでいきます.


# Ruby


## 条件分岐


### if-elsif-else-end

ifは条件が成立した節の最後に評価した式の結果を返します. [ ]は省略可能な部分です. 

```ruby
if 式 [then]
  式 ...
[elsif 式 [then]
  式 ... ]
...
[else 
  式 ... ]
end
```

Rubyでは, falseまたはnilだけが偽, それ以外は0や空文字含めすべて真となります. 


### 条件演算子

さらにサッパリした形に表すこともできます. 

```ruby
... 式 ? 式(true_case) : 式(false_case)
```

またelseがない場合は

```ruby
... 式 ... if 式
```

というように短くできます. 


### case-when-end

caseは一つの式に対する一致判定を行います.when節で指定された値と最初の式を評価した結果とを演算子===を用いて比較し, 一致する場合にはwhen節の本体を評価します. 

```ruby
case [式]
[when 式 [, 式] ...[, `*' 式] [then]
  式..]..
[when `*' 式 [then]
  式..]..
[else
  式..]
end
```


## 配列

Rubyでは配列を[ ]で表します.


### Array.each

eachは配列の中の要素を順番に読み込み変数に代入する.

```ruby
[ ... ].each do |変数|
  式
end
```


# うるう年かどうかの判定

うるう年の規則は, 

-   400で割り切れる数の年はうるう年
-   400で割り切れず, 100で割り切れる数の年は平年
-   上の条件を満たさない場合, 4で割り切れる数の年はうるう年, そうでなければ平年

この規則に従い, leap?関数を作り, 2000, 1900, 2004, 1999の4つの年のうるう年判定を行います.

以下にプログラムと実行結果を記します. 


## 単純にif文を用いる

```ruby
def leap?(year)
  if year % 400 == 0
    p true
  elsif year % 100 == 0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end

[2000, 1900, 2004, 1999].each do |year|
  p year
  leap?(year)
end
```

少し長いため, case文を用いてスッキリさせます. 


## case文を用いる

```ruby
def leap?(year)
  return case
	 when year % 400 == 0 ; true
	 when year % 100 == 0 ; false
	 when year % 4 == 0   ; true
	 else                 ; false
	 end
end

[2000, 1900, 2004, 1999].each do |year|
  p year
  p leap?(year)
end
```


## 実行結果

```
> ruby check_leap_year.rb
```

```
2000
true
1900
false
2004
true
1999
false
```

無事完了. 


# 参考資料

[プログラミング言語 Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/index.html)[閏年 &#x2013; Wikipedia](https://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4)
【QA】境界値分析

## これはなに？
境界値分析というテスト技法がどういうものなのか
また、どういう場面で使うべきものなのかを例を混ぜながら説明した記事になります

前回の同値分割についての記事は[こちら](https://qiita.com/mu-suke08/items/3f9418334bb866130fe8)

## この記事に書かれていること
- 境界値分析とは？
- 境界値分析の使用場面と使用例

## 境界値分析とは？
>同値分割で得られた同値クラスの端となる値（およびその前後の値）を明らかにして、それをテストデータとするテスト技法のこと。
[IT Media エンタープライズより引用](https://www.itmedia.co.jp/im/articles/1111/07/news148.html)

出力結果が変わる境界値付近はコード上不具合が発生しやすく、それを防ぐという目的でこの技法は広く使われています。


## 使用場面と使用例


### 使用場面
前回の記事で書いた[同値分割](https://qiita.com/mu-suke08/items/3f9418334bb866130fe8)と同様に、同値クラスだった場合の処理が同じであり、どの値を入力しても共通の出力をする時に使用します。


具体的な使用例を以下に書いていきます

### 使用例
前回と同様、以下のような項目で割引額が正しく機能しているかを確認したいと仮定します。

- 5,000円以上の購入で5%OFF
- 10,000円以上の購入で10%OFF



| 購入金額 | 割引率 |
|:-----------:|:-----------:|
| 0~4,999円 | 割引なし |
| 5,000~9,999円 | 5%OFF |
| 10,000円~ | 10%OFF |

同値分割の時は同値クラスの代表値を入力して期待通りの割引率になるかを確認していましたが、境界値分析はその名の通り出力の結果が変わる**境目付近を確認します。**

それを踏まえて今回のパターンだとグループごとの境目は**0, 5000, 10000**になります
さらに確認するパターンを洗い出すと、**0, 1, 4999, 5000, 5001, 9999, 10000, 10001**の8パターンになります。
※マイナスはユーザの操作上あり得ないのでテストケースから外しています

これが今回の例において境界値分析でテストするケースになります。


## まとめ
今回は境界値分析について書きました。
いろんな記事にも書いてある通り、[同値分割](https://qiita.com/mu-suke08/items/3f9418334bb866130fe8)と一緒に実施される場合が多いです。
**出力が変わる境界値ではバグが発生しやすい**ということだけ覚えておけばひとまず良いと思います。

次回はディシジョンテーブルと言う、複雑な入力パターンをテストする際に有効なテスト技法について紹介したいと思います。


## 参考記事
[IT Media エンタープライズ](https://www.itmedia.co.jp/im/articles/1111/07/news148.html)
CloudWatch Logsのログをローカル環境にダウンロードする

# 概要

CloudWatch Logsコンソールからログを収集する作業が地味にきついのでツールを作りました。

# ソースコード

https://github.com/naomichi-y/cloudwatch-logs-downloader

# 特徴

* dockerベースなのでセットアップ手間いらず
* ロググループを指定することで、ログストリームを跨いだ検索が可能
* 正規表現に一致したメッセージのみ抽出可能
* 出力フォーマットはJSON形式

# 使い方

ロググループ `ecs/production` における2020年12月27日 15時59分 (UTC) のログを取得する場合。

```
$ docker run --rm -it --env-file=.env -v ${PWD}:/go/src/app cld -group=ecs/production-log -start="2020-12-27 15:59:00" -end="2020-12-27 15:59:59"

2020/12/29 07:05:42 Write results...
2020/12/29 07:05:42 Generated log file: ./dist/result_2020122970533.log

$ cat ./dist/result_2020122970533.log
[
  {
    "IngestionTime": "2020-12-27 15:59:22 +0000 UTC",
    "LogStream": "app/app/5302adeb527b42a0acbb11ac3444d98f",
    "Message": "Foo",
    "Timestamp": "2020-12-27 15:59:21 +0000 UTC"
  },
  {
    "IngestionTime": "2020-12-27 15:59:22 +0000 UTC",
    "LogStream": "app/app/5302adeb527b42a0acbb11ac3444d98f",
    "Message": "Bar",
    "Timestamp": "2020-12-27 15:59:21 +0000 UTC"
  },
  {
    "IngestionTime": "2020-12-27 15:59:22 +0000 UTC",
    "LogStream": "app/app/5302adeb527b42a0acbb11ac3444d98f",
    "Message": "Baz",
    "Timestamp": "2020-12-27 15:59:21 +0000 UTC"
  },
  ...
]
```
[React] 「チュートリアル：React の導入」をやってみる (1)

#「チュートリアル：React の導入」

Reactの公式チュートリアルをやってみています！

リンク ： [チュートリアル：React の導入](https://ja.reactjs.org/tutorial/tutorial.html "チュートリアル：React の導入")

前回の記事 ： [[React] 「チュートリアル：React の導入」をやってみる (npx create-react-app my-appについて)](https://qiita.com/IwashiMorino/items/0add4eb89f7e0ef3d883 "Qiita")

このチュートリアルは三目並べのゲームを作ってみようというものです。

###スターターコードの中身を確認する

リンク ： [スターターコードの中身を確認する](https://ja.reactjs.org/tutorial/tutorial.html#inspecting-the-starter-code "スターターコードの中身を確認する")

>コードを見てみると、3 つの React コンポーネントがあることが分かります。

>・Square（正方形のマス目）
>・Board（盤面）
>・Game

コンポーネントが3つあるというところが一つのポイントかもしれません。

###データを Props 経由で渡す

>Board の renderSquare メソッド内で、props として value という名前の値を Square に渡すようにコードを変更します：

```react:index.js
class Board extends React.Component {
  renderSquare(i) {
    return <Square value={i} />;
  }
}
```

>そして Square の render メソッドで、渡された値を表示するように、{/* TODO */} を {this.props.value} に書き換えます。

```react:index.js
class Square extends React.Component {
  render() {
    return (
      <button className="square">
        {this.props.value}
      </button>
    );
  }
}
```

※ props として value という名前の値を Square に渡している
※ 上記のコードに変更するとマス目に1～8の数字が表示される

###インタラクティブなコンポーネントを作る

※ クリックするとXマークがつくようにコードを書き換える

**→→コンストラクタで this.state を設定する**

>React コンポーネントはコンストラクタで this.state を設定することで、状態を持つことができるようになります。this.state はそれが定義されているコンポーネント内でプライベートと見なすべきものです。

**→→サブクラスのコンストラクタを定義する際は**

>補足

>JavaScript のクラスでは、サブクラスのコンストラクタを定義する際は常に super を呼ぶ必要があります。constructor を持つ React のクラスコンポーネントでは、すべてコンストラクタを super(props) の呼び出しから始めるべきです。

```react:index.js
class Square extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: null,
    };
  }

  render() {
    return (
      <button
        className="square"
        onClick={() => this.setState({value: 'X'})}
      >
        {this.state.value}
      </button>
    );
  }
}
```

**スターターコードを書き換えますと、マス目をクリックすると下図のようにXマークがつくようになります**

![011a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/3aed1da5-9d56-d293-ccc1-008055128879.png)
emscriptnを使用したｃ＋＋とjavascriptの値受け渡し方法まとめ

#
とりあえず、HTMLタグの

```
<div id = "hoge" style="display:none">hoge1</div>
```
と記載してそこに書き込んだり読み込んだりすることを考えてみよう。
HTMLタグを変数の入れ物にするのどうなんだ？という気はするので良いアイデアがある方はコメントでお願いします。JavaScriptの変数をC++のソースに持っていくやり方が分からなかったのでそれを書いてもらえれば助かります。

#HTMLタグからC++への文字列の取得

```
// 指定したhtmlのidのtextContentを文字列に変換して取得する（※メモリ解放の関係で直接この関数が呼ばれないようにすること！）
EM_JS(void *, getElementTextContent_, (char const *id),
{
    var e = document.getElementById(UTF8ToString(id));
    var str = e.textContent;
    var len = lengthBytesUTF8(str) + 1;
    var heap = _malloc(len);
    stringToUTF8(str, heap, len);
    return heap;
});

// 指定したhtmlのidのtextContentを文字列に変換して取得する
std::string getElementTextContent(std::string const &id)
{
    void *p = getElementTextContent_(id.c_str());
    std::string s((char const *)p);
    free(p);
    return s;
}
```

こう記載することで、

```
std::string str = getElementTextContent("hoge")
printf("%s",str.c_str());
```

と書けば

```
hoge1
```
と出力される。
紛らわしいが、アンダーバーが付いている*getElementTextContent_*関数はJavaScript関数でメモリ解放機能が付いていないので必ずアンダーバーが付いていないC++関数の*getElementTextContent*関数から呼び出さなければいけない。（こんな命名してしまってｽｲﾏｾﾝ）
privateメソッドに書き込んでカプセル化などそういう書き方が必要になってくるだろう。

#HTMLタグからC++への整数の取得

HTMLタグにこういうタグがあるとする。

```
<div id = "hoge_num" style="display:none">12</div>
```

整数は配列じゃないので、メモリ解放用のC＋＋関数を間に挟む必要はない。

```
// 指定したhtmlのidのtextContentを整数値に変換して取得する
EM_JS(int, NumReturn, (const char* id), {
   var testVar = document.getElementById(UTF8ToString(id));
  return parseInt(testVar.textContent);
});
```

だから、↓のように書き込むと

```
printf("%d",NumReturn("hoge_num"));
```

```
12
```

というように出力される。

#C++からHTMLタグへの書き込み

やはり、こういうHTMLタグがあったとする。

```
<div id = "hoge_str" style="display:none">まだ書き換わってない！</div>
```

で、こういう関数を作る。

```
// 指定したhtmlのidのtextContentを引数（ChangedStr）に変更する
EM_JS(void, StrChange, (const char* id, const char* ChangedStr), {
   var testVar = document.getElementById(UTF8ToString(id));
   testVar.textContent=(UTF8ToString(ChangedStr));
});
```

で、呼び出す

```
StrChange("hoge_str", "書き換わった！");
```

するとこうなる。

```
<div id = "hoge_str" style="display:none">書き換わった！</div>
```

ね？簡単でしょ？
ボトルネックを探すにはdjango-silkを使う

#django-silkは何ができるの？
<b>HTTPリクエストとデータベースクエリを保存</b>して確認しやすくしてくれるライブラリ！🥺
APIのボトルネックになっている部分を素早く見つけることができる🥺


#インストール
```
pip install django-silk
```
settingのMIDDLEWAREとINSTALLED_APPSにsilkを追加する🥺

```py:settings.py
MIDDLEWARE = [
    ...
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = (
    ...
    'silk'
)
```
urls.pyに以下の行を追加する🥺

```urls.py
urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]
```

migrateする🥺

```py
python manage.py makemigrations

python manage.py migrate

python manage.py collectstatic
```

#計測結果を確認する
urls.pyに追加した/silk/にアクセスすると計測結果が表示される🥺
※migrate直後はデータが作成されていないので、何も表示されない🥺

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/2b67e563-41a4-3291-f21c-712224f8c8f7.png)



##Summary
リクエストを行うと以下の用に各種項目が確認できる🥺
summaryは要約ページ🥺
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/4ecd24a3-5ce8-1484-249a-848e7f522714.png)


##Requests
確認できること！

⭐️かかった時間 
⭐️クエリ数 
⭐️クエリにかかった時間 
⭐️リクエスト/レスポンスヘッダー 
⭐️要求/応答機関

各リクエストをポチると詳細画面にいく！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/90dd1751-512f-6c8a-0ccd-62a8f4ca20b7.png)

##Details
詳細が確認できる🥺

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/4f09a62f-168a-618d-3c92-4620027b66d8.png)

##SQL
SQLも確認できる🥺
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/8a7d8af2-6551-f920-be87-48a195e1a77b.png)
[Azure] AKS"インサイト"でのメトリクス表示が定期的に途切れる場合の対応(連携先Log Analyticsの料金プランに注意)

AKS(Azure Kubernetes Service)では、ポータルの"インサイト"メニューでノードやポッドの状態を確認することができます。

今回、テスト環境にてそのメトリクス表示が定期的に途切れる現象が発生したので、対応方法をまとめておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/fe39560e-069b-f451-53d2-17a747725846.png)

# 原因は、連携先Log AnalyticsがFreeプランだったため

といっても原因はタイトルに書いた通りで、AKSが連携しているLog AnalyticsがFreeプランだったためでした。

Freeプランの場合「データ上限が500MB/日で、データ保有期間は7日間に限られる」ため、それを超えた分が表示されなくなるという現象が発生します。1日の切れ目がJSTではないため気づきにくいですが、「1日のうち何時間かメトリクスが途切れる」、「過去に表示されていたメトリクスが過去7日分しか表示されない」場合はLog Analyticsを確認するとよいと思います。

今回は有料プランに変更して、表示が途切れなくなることを確認しました。
[Python] 動的計画法　TDPC A

#[TDPC A](https://atcoder.jp/contests/tdpc/tasks/tdpc_contest)

#動的計画法
次のようなアルゴリズムである:

>計算結果の記録しながら、帰納的な関係の利用して解く



最適化問題に適用する場合、一般的に、以下の2つが適用する問題に成立していないといけない:

* **部分構造最適性**：部分問題も同じ最適化問題が成立しており、部分問題間が独立している
* **部分問題重複性**：同じ部分問題を繰り返し解く

この２点を満たし、**全体の解の形が不明な場合、動的計画法が適している。**逆に、全体の解の形が明らかな場合は適さない。適用できるから、適切であるとは限らないことに注意する。部分問題は、サイズを縮小した問題と捉えると良い。実装としては、部分問題の答えの配列をdpとしてメモする形式が多い。

#問題の解法

部分和問題とは次のような問題である:

>$N$ 個の正の整数 $a_0,…,a_{N−14}$ の中からいくつか選んで総和をとった値を $W$ にできるかどうかを判定せよ

今回の問題は、具体的な整数 W を作れるかどうかを問うのではなく、作れる整数の個数を求める問題となっている。しかし部分和問題が解けていればほとんど解決済みである。なぜなら、部分和問題を解いて得られた配列 $dp[N][j]$ を見ることで、整数 $j$ を作れるかどうかが判定できる。
$i−1$問目までからできる合計点の集合がわかれば、それに $i$ 問目の配点 $p_i$ を足してできる合計点と、足さずにできる合計点を考えることで、$i$ 問目までの問題からできる合計点の集合がわかります。この時、合計点が同じであればどの問題の組み合わせによって出来た点数なのかが関係なくなっているため、解くべき部分問題を減らすことができています。（動的計画法）
動的計画法による外部設計は次のようになります。

dpの定義：
$i$ 問目までの問題を使って、$j$ 点の合計点ができるかどうかの真理値
$$0\leqq i \leqq N,  0 \leqq j \leqq \sum_i p_i$$
dp漸化式の定義：

```math
dp[i][j]=\begin{cases}
        dp[i-1][j]\lor dp[i-1][j-p_i] & (j\ge p_i) \\
        dp[i-1][j] & (j\lt p_i)
        \end{cases}
```
dp初期条件：

```math
dp[0][0]=1
```
求める解：$dp[n][j]$が1となる要素数

ここではいわゆる「貰うＤＰ」で、iのループは1からnに増える方向（**ボトムアップ方式**）で漸化式を考えましたが、配るＤＰや、iのループが逆（メモ化**トップダウン方式**）でも考えることができます。同じＤＰでもいろいろな解法があることが、汎用性と難解性の要因かと思います。ちなみに、この漸化式だとjのループをMAXから減る方向に回すことで、配列は1次元で済みます。
計算量は、作りうる最大の整数を $W(≤10000)$ として、$O(NW)$ となります。

```python:サンプルコード
# 入力の受け取り
N = int(input())
P = list(map(int, input().split()))

# i問目までの問題を使って、j点の合計点ができるか（bool値）
dp = []
# 0問目は1問も問題を解いていない状態とする。N問あるので、dp[N]まで必要
for i in range(N+1):
    dp.append([False] * (100 * 101))

# 0問目までの問題を使って（=問題を一問も解かない）0点を取ることができる。
# また、それ以外の点数にはならないため、dp[0][0]以外のdp[0]の配列の値はFalseになる。
dp[0][0] = True

# 1問目からN問目までのループ
for i in range(1, N+1):
    # dp[i]に値を入れていくために、dp[i-1]の状態を見ていく
    for j, dpj in enumerate(dp[i-1]): #インデックス,オブジェクトの取得
        if dpj is True:
            # i問目の問題を解かない
            dp[i][j] = True

            # i問目の問題を解く
            # i問目の得点はP[i-1]で表される
            dp[i][j+P[i-1]] = True

# dp[N]の配列を見て、Trueになっているところがありうる合計点
print(dp[N].count(True))
```
flutter実行時Android Emulator上で起きるエラー"Error connecting to the service protocol: failed to connect to http://127.0.0.1:1029/89AGRYqn_pA=/"の解決法

flutterが最近熱いらしいので、Androidエミュレータ上でサンプルプロジェクトで遊んでみようと思ったところ、

```
Error connecting to the service protocol: failed to connect to http://127.0.0.1:1029/89AGRYqn_pA=/
```
こんなエラーが出て長時間詰まってしまいました。Stack Overflowでも多くの人が同じ問題に陥ってるっぽいです。備忘録のために、試したけど効果がなかった方法と、エラーを回避できた解決法を書いていきます。

ちなみに自分の環境はこんな感じです↓
IDE: Visual Studio Code
OS: mac OS Catalina
Android Emulator: Pixel 2 API 29

#試したけどダメだった方法
### 環境変数にexport NO_PROXY=localhost,127.0.0.1を追加
これで直ったという記事がありましたが、自分の場合は試しても直りませんでした。
### IDE再起動、エミュレータ再起動、flutter cleanを実行
再起動、環境をclean系は全く効果がありませんでした。

#解決方法
###AndroidのAPIレベル29を避ける
APIレベル29のエミュレータを使わないで、APIレベル28のを使ったらうまくいったという記事を見つけたので、自分はAPIレベル30のエミュレータ(Pixel4 API30)を使ってみたところ、エラーが出ずにちゃんと実行されました。根本的な原因はわかりませんが、どうやらflutterとAPIレベル29の相性が悪いっぽい？です。同じ問題で困っている人は、APIレベルを見直してみてください。