OmniAICreator/Qiita-1.07M huggingface dataset:
読書要点「プリンシプルオブプログラミング」第3章 UNIX思想

## UNIX思想

UNIXを扱う文化の中で育まれた、経験的で実践的な技の集合。
公式の方法論ではないが、暗黙の知識として伝承されてきたものを明文化したものである。

末永くユーザーに利用され続けてきたUNIXは、ソフトウェアとしては段違いの生命力がある。
ソフトウェア開発において、プロダクトの寿命が長く使われ続けることは重要な要素であり、UNIXの積み上げてきた歴史から学べることは多い。
UNIXの設計のエッセンスを日頃のソフトウェア開発に活かしていきたい。

### モジュール化の原則

シンプルなインターフェースで結びつけたモジュールを作成するのが良い。
ソフトウェアの複雑度をモジュールによって分解していく。
このとき、モジュールの入り口を狭くしておくことで、シンプルで閉じたモジュールにしやすい。

### 明確性の原則

コードは明確に書くようにする。
コードはコンピュータを相手にするのではなく、保守をするプログラマを相手にすべきである。
そのためにも意図がはっきりと伝わる明確なコードを書くのが良い。

### 組み立て部品の原則

ソフトウェアは、受け付けたデータを整形して別のデータとして出力するフィルターとしてつくるのが良い。
データの流れがシンプルだと、他のアプリケーションとの相互接続が簡単なうえ、無駄な表現が混じらないため情報隠蔽にもつながる。
シンプルなインターフェースで実装すれば複数のソフトウェアでの相互接続も実現しやすい。

### 分離の原則

ソフトウェアの前提に依存している部分がポリシー、依存していない部分がメカニズムだが、これらを切り分けて管理するのが良い。
メカニズムはできるだけ手を付けないことが望ましく、ポリシーは柔軟に変更できたほうが良い。
分離を行うことで、メカニズム部分のテスト容易性や再利用性があがったり、メカニズムと独立して新しいポリシーを試すことができるようになる。

### 単純性の原則

設計の段階からコードが単純になるように務める必要がある。
コードは意識せずに書いていくと自然と複雑になってしまう。
シンプルを是としたコーディングを心がけたい。
複雑なコードを書きたくなる気持ちや大量の機能追加に抵抗していく必要がある。

### 倹約の原則

大きなコードは書かないほうが良い。
大きなコードとは、コードの記述の量が大きい、または複雑度が大きいコードである。
大きなコードは制御が困難である。
小さなコードを書くように心がけるのはもちろん、制御できる大きさのうちに分割していくことで未然にコードが破綻することを防げる。

### 透明性の原則

ソフトウェアの動作を、外からわかりやすく見えるように設計するのがよい。
そのために、透明性と開示性から設計を考慮する。
透明性は、ソフトウェアの動作を見ることで何がどうなっているのかがわかりやすいかということである。
開示性は、ソフトウェアの内部がどうなっているか、確認、表示できるかということである。

透明性が良いソフトウェアはデバッグにかかるコストを抑えられる。
デバッグはコストのかかる工程であり、デバッグのための機能を盛り込んでおくことは十分リターンのある投資だと言える。

### 安定性の原則

ソフトウェアは安定であったほうが良い。
予想外の条件でも適切に動作するものを作る必要があるが、このためには分岐などコードの複雑度をあげる作業が必要になる。
あまりに複雑度があがると一の手に負えなくなるため、内部構造を簡潔に説明できるコードを書く必要がある。
コードから何をしているか読み取れるかという透明性、コードが複雑ではなく説明が容易かという単純性を満たすコードを書きたい。

コードレビューや負荷テストを行い、ソフトウェアの透明性や単純性、堅牢性を確認するのが良い。

### 表現性の原則

コードにおける情報表現はデータとロジックがあるが、基本的にデータに寄せて書くようにしたい。
データのほうが理解しやすいため、複雑なものを作るときはまずデータの表現を基準に考えるのが良い。
避けられない複雑さはできるだけデータ構造側に押し付けたほうがわかりやすくなる。

### 驚き最小の原則

インターフェースは機能に対して過不足のないものを提供する。
奇抜なUIは学習コストが高く、ユーザーに対して使用上のハードルを上げてしまう。

既知のUIや伝統を意識しつつ、過不足のないユーザー目線のUIを目指したい。

### 沈黙の原則

ソフトウェアの表示は最小限に抑えるのが良い。
必要がなければ情報を表示する必要はないし、必要なものは最低限の表示で抑える。
透明性の原則に基づきメッセージの表示を行いたいときは、スイッチを作り表示するかどうかを選択させると良い。

### 修復の原則

エラーの回復に失敗した時は処理は中断するのが良い。
回復できた場合はそのまま処理を継続すればよいが、そうでない場合は取り返しのつかないことになる前に処理を中断する。

### 経済性の原則

プログラマの時間を節約するための整備を行いたい。
ハードウェア、ソフトウェア面での制約、環境やルールの制約はプログラマの時間を浪費することにつながる。
貴重で高価なリソースであるプログラマに投資することで、プログラマの開発効率やモチベーションの向上につながり、生産性や品質がよくなる。

### 生成の原則

コードを生成するためのコードを書くのが良い。
コンパイラ技術に代表されるように、コンピュータが生み出すコードは人の手で書かれたものよりも素早く、品質が良い。
コードを書く上でも、コンピュータに任せられるところを増やすことで作業の効率化、品質の向上につながる。

### 最適化の原則

最適化を行う際は、まず確実に動作する正しいコードを作った上でパフォーマンスの最適化に務めるべきである。
動作保証されていないコードに対する最適化は複雑性を増すだけでなく大きなリターンも得られにくい。
遅くても、シンプルで確実に動作するコードに最適化を行いたい。

### 多様性の原則

プログラミングにおいては唯一の正しい方法がなく、多様性があることを認識する。
この認識の上でより良い選択肢を模索し続ける姿勢が肝要である

### 拡張性の原則

開発の上で唯一の正しい方法がないソフトウェアに対して、拡張できる設計にしておくことが望ましい。
多様性の原則に基づけば、ソフトウェアの保守や改善の作業は必須で、その際にソフトウェアの拡張性は役立つ。
外部との接続性が良いソフトウェアを設計するべきだが、余分な機能を追加するための免罪符ではないことを注意したい。
Delta Lake - Open Source Reliability for Data Lakes について翻訳し、まとめてみた

##はじめに
今回は、Michael Armbrust 氏による「Data Reliability for Data Lakes」の動画を翻訳し、まとめてみました。
本動画については、下記リンク先参照でお願いします。

■リンク
・ [Delta Lake - Open Source Reliability for Data Lakes](https://vimeo.com/338100834)

##Data Lake について
###Data Lake の現状
現在、様々な企業が Apache Spark を用いて、Data Lake にデータを置き、データサイエンスや機械学習のプロジェクトなどに利用してきました。

■Data Lake を利用する3つの理由

- とても安価に利用可能
- スケーラブル
- 置いたデータを様々な用途で利用可能

しかし、Data Lake を利用するにあたって、ある問題が発生しております。それは、Data Lake に置いてあるデータが整理されていない為、プロジェクトの進行が阻まれるという事態です。信頼性の低いデータの存在により、様々なプロジェクトが生まれては失敗で終わるという事態が実際に起きてます。

<img width="739" alt="スクリーンショット 2020-06-18 10.25.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/07d501c5-fd91-fe38-b144-9321f02b99d0.png">

###Data Lake を用いたプロジェクトの進め方
図は一般的な Data Lake を用いたプロジェクトの進め方です。
<img width="734" alt="スクリーンショット 2020-06-18 10.40.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/911599c1-42b9-27ba-f060-b71eed6a8a2b.png">

■プロジェクトのポイント
①λ-arch を構築
②検証アーキテクチャの構築
③Data Lake の再処理（不純なデータが無いか確認）
④アップデートの実施

実際にプロジェクトを進めていくにあたり重要なポイントは4つですが、図のような構成を組む必要がある為、プロジェクトを順調に進めるのは簡単ではありません。Data Lake において、データの信頼性を維持するのはとても難しく、その理由は3つあります。

<img width="823" alt="スクリーンショット 2020-06-22 15.54.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/d7db0f62-5d1b-36d2-4da4-8394b2e4156c.png">

■複雑な構成になる3つの理由

- ジョブの失敗
 - 破損したままのデータの放置は復旧に多くの時間が必要
- 品質の低下
 - 矛盾した不整合データの生成 
- トランザクション不足
 - アペンドや読み込み、バッチやストリーミングの実行がほぼ不可能 

##Delta Lake について
###Delta Lake を用いたプロジェクトの進め方
それでは、Delta Lake を用いた場合はどうなるでしょうか。
Delta Lake を用いた場合は、Data Lake の時の構成とはだいぶ異なり、プロジェクトの進め方は図の様になります。
<img width="725" alt="スクリーンショット 2020-06-18 11.05.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/9af666b3-5d84-b89c-7acb-f26981ef6eac.png">

Delta Lake の一番の特徴は、データを利用するまでデータの品質を向上させることが可能という点です。
それを可能にしているのが、Delta Lake の下記の3つの特徴です。

- フル ACID トランザクション
- オープンソース
- Apache Spark を利用

Delta Lake の場合、図のように「Bronze」、「Silver」、「Gold」といった3つの段階を踏んでおります。
それぞれの段階における内容についてまとめました。

- Bronze
 - 生データの摂取と、最小限の構文解析
 - 数年にわたる長期保存が可能

- Silver 
 - データのフィルタリングやクレンジング、強化などを適用した中間データ
 - 簡単にデバッギングできるようクエリが可能

- Gold
 - 実行可能な綺麗なデータ（BI や ML での利用も可能な状態）
 - Spark や Presto で利用可能な状態のデータ 

<img width="861" alt="スクリーンショット 2020-06-23 10.21.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e3614983-ca29-222a-fa27-5018c1573624.png">
また、Delta Lake は Bronze に生データを置いている為、ビジネスロジックの変更などで計算し直す必要が出た場合は Silver と Gold を削除し、再び Bronze から始めるだけなので、とても簡単に実行できます。

##おわりに
「Data Reliability for Data Lakes」の翻訳は以上です。
Delta Lake の流れや仕組みについて詳しく記載されており、とても役立つ動画です。本編では、より詳細な内容について話されているので、ぜひ御覧ください。
TypeScript: AsyncGeneratorの例外ハンドリング

前の投稿で「[`AsyncGenerator`使う方法](https://qiita.com/suin/items/2837e13dee5764a1a870)」について紹介しました。その投稿では触れなかった、`AsyncGenerator`の例外ハンドリングについてこの投稿では説明したいと思います。

## `AsyncGenerator`で例外が発生すると`UnhandledPromiseRejectionWarning`になる

次のように、イテレーション中に例外が発生するケースがあるとします:

```typescript
async function* numbers(): AsyncGenerator<number> {
  yield 1
  yield 2
  await throwError()
  yield 3
}

async function throwError() {
  throw new Error('Something wrong')
}
```

この`numbers()`ジェネレータ関数を`for await`でループするコードは次のようになりますが、

```typescript
async function main() {
  for await (const number of numbers()) {
    console.log(number)
  }
}

main()
```

このコードをNode.jsでそのまま実行すると、`throwError()`の行に到達したタイミングで`UnhandledPromiseRejectionWarning`が発生してしまいます:

```
1
2
(node:11942) UnhandledPromiseRejectionWarning: Error: Something wrong
```

## `AsyncGenerator`で発生する例外をキャッチする方法

この例外をキャッチするには、`for await`を`try-catch`で囲むことで例外をキャッチできるようになります:

```typescript
async function main() {
  try {
    for await (const number of numbers()) {
      console.log(number)
    }
  } catch (e) {
    console.log(e.message)
  }
}
```

実行結果:

```
1
2
Something wrong
```
QRコード読み取り(ZBar)

ZBar bar code reader
を使う。


まずはインストール

OS「Amazon Linux AMI」の場合
yum install -y zbar-tools


OS「Linux version XXX.amzn1.x86_64」の場合(2014年から使っているEC2)
yum install zbar-devel
pip install zbar
or
/usr/local/bin/pip2.7 install zbar
※Python3系だと動かないので2.6or2.7でインストール
Python3系の場合は↓これを入れると出来るらしい．
https://github.com/zplab/zbar-py


実行
zbarimg qr.png 
QR-Code:http://aaaaa/ddddd.html

urlもいける便利
zbarimg https://wwww.sample.com/qr.png 
QR-Code:http://aaaaa/ddddd.html

時間がないので後日記事修正
Local's router is having trouble starting.となった時の対応方法

- 環境
    - Windows 10 Pro 64bit バージョン1909
    - Local by Flywheel Version 5.6.1+4184

WordpressがさっぱりわからないからLocal by Flywheelでローカル環境を作ってみたかった。

# 事象 : Local by Flywheelをインストールしたら赤でなんか言われた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3b5be8cc-8d79-e8db-4430-25eab33e62d7.png)

# 原因 : 使うポートがほかの何かで使われているから
[Lean more](https://localwp.com/help-docs/router-mode/)をクリックしてみると・・・ポート「80」「443」が競合しているようだ。
XAMMPを使うときによくある定番の話と同じ・・・。

> Local may detect a port conflict on ports 80 or 443. If it does, Local will offer to use localhost.
> [Local |   Router Mode FAQ](https://localwp.com/help-docs/router-mode/)

```bash
# ポート80番を使っているプロセスを見てみると・・・
$ netstat -nao | grep -e :80 -e :443
  TCP         0.0.0.0:443            0.0.0.0:0              LISTENING       4544
  TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       4544
...省略...
# 前から使っているApacheだった。
$ tasklist | grep 4544
httpd.exe                     4544 Services                   0      2,320 K
```

## 対応 : 競合しているポートを使用しているアプリの設定を変える
Local by Flywheelのポートを指定することはできないようなので
前から使っているApacheのポートを「80」「443」以外に変更する。

> Can I change my port number?
> Not at this time! Use your internet router and port forwarding feature to direct traffic to your Local site.
> [Local |   Router Mode FAQ](https://localwp.com/help-docs/router-mode/)

1. Apacheのポートを変更する
1. エラーメッセージの横にある[RETRY]ボタンを押下する
1. エラーメッセージが消える

```bash:Apacheのポートを変更する
# 1. Apacheのhttpd.confでhttp用ポートを「80」を「8080」に変更する
$ cat /c/apps/httpd-2.4.41-o111c-x86-vc15-r2/Apache24/conf/httpd.conf | grep 8080
Listen 8080
ServerName localhost:8080

# 2. Apacheのhttpd.confでhttps用ポートを「443」を「444」に変更する
$ cat /c/apps/httpd-2.4.41-o111c-x86-vc15-r2/Apache24/conf/extra/httpd-ahssl.conf | grep 444
Listen 444 https
<VirtualHost _default_:444>
  ServerName localhost:444
<VirtualHost *:444>
  ServerName serverone.tld:444
<VirtualHost *:444>
  ServerName servertwo.tld:444

# 3. Apacheを再起動する
$ sc stop Apache2.4
SERVICE_NAME: Apache2.4
...省略...
$ sc start Apache2.4
SERVICE_NAME: Apache2.4
...省略...

# 4. ポートが変更されたことを確認する
$ netstat -nao | grep -e :8080 -e :444
  TCP         0.0.0.0:444            0.0.0.0:0              LISTENING       22292
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       22292
  TCP         [::]:444               [::]:0                 LISTENING       22292
  TCP         [::]:8080              [::]:0                 LISTENING       22292

# 5. ポート「80」「443」が使われていないことを確認する
$ netstat -nao | grep -e :80 -e :443
```
初めてのアプリ　トラブル日記 swift--NavigationLinkとForEach/Listの相性悪っ

ユーザが書いたブログのデータをrealmから取得して、タイトルだけを一覧にして、タイトルをNavigationLinkにしてクリックできるようにしたいと思っていました。

一覧はForEachかListループして、クロージャの中でNavigationLinkを書く。下記のようなイメージ：
ForEach(diaries!, id: \.self){ diary in
NavigationLink(destination:DiarycontentView(diaries: diary),label:{
Text(diary.diaryTitle)
})
}

シミュレータで確認すると、タイトルをクリックし、DiarycontentViewへ遷移した途端、一覧ページへ戻っちゃう奇妙現象発生でした。（Qiita初心者で画像／動画添付できず許してください）

調べてみてStackoverFlowも色々見ました。先輩にも見てもらって、解決案が二つでした。
①NavigationLinkをクロジャーの中ではなく、ForEachループの外へ移動。
②ForEachの外でさらにScrollViewを使う。　
↑こちらの記事を参照：https://masamichi.me/development/2019/10/21/swiftui-list-multiple-navigationlink.html

②の方法が完璧に解決できました！

けど、こういう記事一覧みたいなのは、NavigationLinkじゃなくて他にもっといいやつがありますよねきっと。みなさんもしご存知でしたら、ぜひお教えいただけますと幸いです！知りたいです！
BigQueryで最頻値(mode, top)を集計する方法

# この記事は？
下記のようにユーザが訪問した都道府県が並んでいるテーブルがあったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654838/24e019ed-6869-1cce-1954-8ef26c268b86.png)

分析の都合上、ユーザごとにどこの都道府県にいったのかを１：１で対応させたいとします。
その際、ユーザが最も多く行った都道府県を選択するのが合理的な場合があります。

この記事はそのような集計のさいに最頻値を取り出す方法について説明します。

# 解決方法
下記のように`APPROX_TOP_COUNT(x,n)`関数を使用します。


```sql
SELECT
user_id 
, APPROX_TOP_COUNT(shop_loc,1)[OFFSET(0)].value shop_loc
FROM
tbl
GROUP BY user_id
```

# 参考
[BigQuery公式](https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions?hl=ja#approx_top_count)


```sql
--下記のSQLを自分のプロジェクトで実行すると再現できます。
WITH tbl AS(
SELECT "A" AS user_id, 'tokyo'  as shop_loc, 1 visit_num
UNION ALL
SELECT "A" AS user_id, 'tokyo' as shop_loc, 2 visit_num
UNION ALL
SELECT "A" AS user_id, 'osaka' as shop_loc, 3 visit_num
UNION ALL
SELECT "A" AS user_id, null as shop_loc, 4 visit_num
UNION ALL
SELECT "B" AS user_id, 'kyoto' as shop_loc, 1 visit_num
)

SELECT
user_id 
, APPROX_TOP_COUNT(shop_loc,1)[OFFSET(0)].value shop_loc
FROM
tbl
GROUP BY 1

```
G検定は2週間で合格できるのか？を検証する

2020/7/16 追記

合格しました！！
G検定は2週間でいけます！！

---

6/22 から勉強を初めて、 7/4 の試験に合格したいと思います。
勉強期間は約2週間。果たして私は合格できるのでしょうか。

この記事では、私がいつなにをどれくらい勉強したのかをまとめていこうと思います。

G検定に興味ある方の参考になれば幸いです。

もし質問等あれば可能な限りお答えいたしますのでお気軽にどうぞ。

# ざっくり現在の学力

- （5年前ではあるけれど）工学部卒なので、コンピュータとか数学についての知識は少しある
- 現役のエンジニアなので、プログラミングはちょっとできる
- データサイエンス系の本を何冊か読んだことある
    - データサイエンティスト養成読本シリーズ
- AI関連の本を何冊か読んだことある
    - 人工知能は人間を超えるか
    - AI vs. 教科書が読めない子どもたち

# 勉強に使うテキスト

- G検定公式テキスト（いわゆる白本）
- G検定公式問題集（いわゆる黒本）

AI白書とか他にも参考図書はあるようなのですが、私は時間もないのでこの2冊だけでやっていこうと思います。

# 6/22

白本第4章の、機械学習のパートを1時間勉強しました。

機械学習には、

- 教師あり学習
- 教師なし学習
- 強化学習

の3種類があって、それぞれでできることが違うのですね。

教師あり学習は、

- 回帰問題
- 分類問題

を解くことができて、教師なし学習は、

- クラスタリング
- 次元削減

ができるようです。

そして、それぞれの学習方法にいくつかアルゴリズムがあるようで、白本には代表的なものがいくつか載っていました。
また、それぞれのアルゴリズムにはなにができるのかも載っていました。

教師あり学習の代表的なアルゴリズムには、

- 線形回帰
    - 回帰
- ロジスティック回帰
    - 分類
- ランダムフォレスト
    - 回帰, 分類
- ブースティング
    - 回帰, 分類
- サポートベクターマシン (SVM)
    - 回帰, 分類
- ニューラルネットワーク
    - 回帰, 分類

があり、教師なし学習の代表的なアルゴリズムには、

- k-means
    - クラスタリング
- 主成分分析 (PCA)
    - 次元削減

があるようです。

それぞれのアルゴリズムにはさらに専門用語があるようなのですが、大筋からは外れてそうなので、一旦飛ばそうと思います。
まずはこれらの概念があることを知っておけばよさそうです。

また、このパートには "手法の評価" についても書かれていました。
このパートをざっくりまとめると、

- 限られたデータでいかに汎用性のあるモデルを作るか
    - 交差検証
        - ホールドアウト検証
        - k-分割交差検証
- 望む結果に対して正しい評価指標を用いる必要がある
    - 混同行列

というような内容でした。
ここもいくつか専門的な用語がありましたが、ここも一旦飛ばそうと思います。

G検定は試験中もネット検索もテキスト参照もOKらしいので、大筋さえ理解できればあとはどうにかなるだろうと考えています。

# 6/23

昨日の復習を0.5時間しました。
白本第1~3章の、AIの概要とか歴史, AIの抱える諸問題のパートを2時間勉強しました。

# 6/24


# 6/25

# 6/26

# 6/27

# 6/28

# 6/29

# 6/30
Gitのautosquashらへん

- 最近設計フェーズでgitを使ってなかったら絶望的に忘れてきたので急いでメモ。


## 過去のコミットを修正。

- 直前のコミットは`git commit --amend`で修正できる。

```terminal
$ git add .
$ git commit --fix (コミット)
$ git rebase -i HEAD^^^^^^^^^ --autosquash
```

- もっと昔のやつは

```terminal
$ git add .
$ git commit --fix (コミットIDとかHEAD^^とか)
$ git rebase -i HEAD^^^ --autosquash
```
TypeScript: asyncとジェネレータ両方使う方法

この投稿では、以下の2つを説明します。

* TypeScriptで`async`とジェネレータの両方を使った関数を定義する方法
* その関数を`for`で呼び出す方法

## `async`とジェネレータの両方を使った関数を定義する

`async`とジェネレータを使った関数は、`async`キーワードをジェネレータ関数`function*`に冠することで定義できます:

```typescript
async function* getNumbers() {
  await sleep(1000)
  yield 1

  await sleep(1000)
  yield 2

  await sleep(1000)
  yield 3
}
```

戻り値の型注釈を与える場合は、`AsyncGenerator<T>`を使います:

```typescript
async function* getNumbers(): AsyncGenerator<number>
```

以上で、`async`なジェネレータが定義できます。最終形態はこんなかんじになります:

```typescript
async function* getNumbers(): AsyncGenerator<number> {
  await sleep(1000)
  yield 1

  await sleep(1000)
  yield 2

  await sleep(1000)
  yield 3
}

function sleep(milliseconds: number): Promise<void> {
  return new Promise(resolve => setTimeout(resolve, milliseconds))
}
```

## `async`なジェネレータ関数を呼び出す方法

`async`なジェネレータ関数を呼び出すには、`for await`を使います。

```typescript
async function main() {
  for await (const number of getNumbers()) {
    console.log(number)
  }
}
```

## トラブルシューティング

### Cannot find name 'AsyncGenerator'.

コンパイル時に`AsyncGenerator`型が見つからないというエラーが出る場合は、コンパイル設定を変更する必要があります。

`AsyncGenerator`はES2018で導入されたので、`lib`もしくは`target`を変更します。

生成されるJavaScriptコードがES2018のシンタックスでいい場合は、`target`を`"ES2018"`以上にするだけで解決します:

```tsconfig.json
{
  "compilerOptions": {
    "target": "ES2018"
  }
}
```

生成するJavaScriptコードをES2018未満にする必要がある場合は、`lib`に`"es2018.asyncgenerator"`を設定することでコンパイルが通るようになります:

```tsconfig.json
{
  "compilerOptions": {
    "target": "ES2017",
    "lib": ["es2017", "es2018.asyncgenerator"]
  }
}
```
flutterのsplash画面はネイティブ実装のsplashを使うべき

みなさんflutterしていますか？
私はflutter始めました。
今回はアプリを作る際に導入されるスプラッシュ（Launch Screen）の話です

# 結論

タイトル通りになりますが、スプラッシュ画面を実装する際はflutterで実装するのではなく、ネイティブ実装を使用したほうがいいんじゃないでしょうか。という話です。

特にこのようなライブラリを利用するのが良さそうです。
https://pub.dev/packages/flutter_native_splash

# 概要

「flutter splash」などでGoogle検索すると、flutterのwidgetを利用したスプラッシュ画面を作成しているサンプルを見かけます。
よくある「2,3秒待って次の画面にnavigateする」といったようなものです。

これの問題は2点あると考えています。

1. Appleのガイドラインに沿わない実装になる
1. flutterデフォルト実装のスプラッシュとかち合う

# 問題

## Appleのガイドラインに沿わない実装になる

ガイドラインについては下記参照ください
https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen/

素早くアプリが起動する印象を与えたいがためのスプラッシュスクリーンなのですが、widgetを利用して実装するとアプリが起動したあとに表示されるためアップルのガイドラインの意図に沿いません。
また、他にも重要なガイドラインがあるので実装時には要チェックです。

以下、ガイドラインから雑な意訳です。間違えていたらすみません！
- 初期表示画面と似たスプラッシュスクリーンにする
- テキストを含めない
- 控えめにする
- 宣伝しない

## flutterデフォルト実装のスプラッシュとかち合う

flutterではデフォルトで起動画面（スプラッシュ）が含まれています。
そのため、独自実装で初期画面にスプラッシュ用のwidgetを配置すると、デフォルトの真っ白のネイティブスプラッシュが表示されるはずです。

アプリ起動 → ネイティブ真っ白Launch Screen → 独自実装スプラッシュ → 初期ビュー

といった流れです。
これは開発者としてよろしくないし、ユーザーエクスペリエンスも微妙なものになるかと思います。

# まとめ

スプラッシュ画面はネイティブ実装を利用しましょう。
おすすめのライブラリはこちらです。
https://pub.dev/packages/flutter_native_splash

また、スプラッシュ画面は初期表示の画面背景色やテーマカラーと同等の背景色に + 控えめなアイコン程度（Appleのガイドラインは初期画面にあるものらしい）を配置する設計がよさそうです。

良いflutter LIFEを！！
macで秘密鍵と公開鍵を作成する(ssh-keygen)

# SSHとは
Secure Shellの略。
ユーザーが安全にサーバーを遠隔操作するために通信を暗号化する手段のこと。

- パスワード認証方式
ユーザーアカウントにパスワードを設定する方式

- 公開鍵認証方式
ユーザーが秘密鍵をもち、サーバー側にそれに紐づく公開鍵を登録しておくことで通信を暗号化する方式。


**ssh-keygenとは秘密鍵と公開鍵のセットを作るコマンドのこと。**

# mac環境
### 1. 鍵作成(ssh-keygen)
`$ssh-keygen -t rsa -b 4096 -C "メールアドレス"`

- gitHubなどに登録しているメールアドレスを設定。
- 鍵の種類は`rsa, rsa1, dsa, ecdsa, ed25519` (rsaがデフォルト)

### 2. どこに保存するか聞かれる
`Generating public/private rsa key pair.
Enter file in which to save the key (/Users/home/.ssh/id_rsa)`

- デフォルトで`~/.ssh`に保存される。
- ファイル指定にこだわりがなければそのままEnter

### 3. PassPhraseの設定を求められる
`Enter passphrase (empty for no passphrase):
Enter same passphrase again:`

- パスフレーズとは、秘密鍵が盗まれた時に秘密鍵を解読されるのを防ぐためのもの
- そのままEnterを2回押せばパスフレーズ未設定で鍵作成

### 4. 鍵が作成される

`Your identification has been saved in /test/.ssh/id_rsa.
Your public key has been saved in /test/.ssh/id_rsa.pub.
The key fingerprint is:`

- `~/.ssh`に秘密鍵と公開鍵が保存されているのを確認(デフォルト)
`$cat .ssh/id_rsa
 $cat .ssh/id_rsa.pub`

- Githubなどには公開鍵(id_rsa.pub)を登録する


# ハマったエラー
SSH接続時に **WARNING: UNPROTECTED PRIVATE KEY FILE!**と警告が出て接続できない。

`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: UNPROTECTED PRIVATE KEY FILE! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0666 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "id_rsa": bad permissionsPermission denied (publicly).`

秘密鍵のパーミッションが0666（書き換え可能）なので危ないよ！と忠告してくれているらしい。
なので、パーミッションを変更すれば解決できる。
`$chmod 0600 id_rsa`
macOSのフォントのttf/ttc/otfファイルのパスを調べる


PythonのPillowやMatplotlibなどで画像処理をおこなう際には、フォントのファイルファイルやパスを指定することがあります。macOSのフォントは大抵の場合`/System/Library/Fonts`や`/Library/Fonts/`などに配置されていますが、特定のフォントを探すのは大変ですし、フォントが日本語名の場合はフォントファイル名と名前が一致していないことがあります。

そこでmacOSにインストールされている任意のフォントの場所を探す方法を説明します。

## 方法
といっても、やり方は簡単です。macOSにインストールされている`Font Book.app`を開き、対象とするフォントの部分にマウスカーソルを当てて、ポップアップが表示される待つだけです。そうすると、以下のスクリーンショットのようにフォント名や種類とともに、パスが表示されます（ポップアップが表示される判定は少しシビアです）。

<img width="384" alt="スクリーンショット 2020-06-23 9.35.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4452/bf99d247-9ed7-35e4-1785-a531cc56e7dc.png">


この場合、游ゴシック体のミディアムは

```
/System/Library/AssetsV2/com_apple_MobileAsset_Font6/00a83746b65bd0a829eba9a553e88c60b18f89d7.asset/AssetData/YuGothic-Medium.otf
```

にあることがわかります。
【Outlook VBA】メールや予定をフィルターで検索する

※この記事の最新版は[こちら](https://vicugna-pacos.github.io/vba/outlook/search-and-filter/)へ移動しました。

# はじめに
VBAを使ってOutlookを操作し、メールや予定の検索を行う際、`Items.Find()`や`Items.Restrict()`を使用する。このメソッドに指定するフィルター構文について分かった部分をまとめた。

MSドキュメント：https://docs.microsoft.com/ja-jp/office/vba/outlook/how-to/search-and-filter/filtering-items

Outlookのバージョン：Office 365

# 基礎知識
フィルターに指定できる構文は2つ。Jet構文とDASL構文。
Jet構文の方はSQLのWHERE句のような書き方。ただし前方一致検索がない。
DASL構文には前方一致検索があるが、`ci_startswith`など`ci_`で始まる構文が使用できない。「検索操作にコンテンツ インデックス キーワードを使用することはできません。」のエラーになる。

Jet構文で使用できる列名(ぽいもの)は、VBAの`MailItem`などのItemオブジェクトのプロパティと同じだと思われる。

# 文字列のフィルター

Jet構文のサンプル：

* `[Subject]='あいう'`
  * 件名が「あいう」に一致する。頭に`RE:`や`FW:`が付いているものも含まれる。

DASL構文のサンプル：

* `@SQL="urn:schemas:httpmail:subject" = 'あいう'`
  * 件名が「あいう」に一致する。頭に`RE:`などが付いていたら対象外。
* `@SQL="urn:schemas:httpmail:subject" like 'RE:%'`
  * 件名が「RE:」で始まる(前方一致)

# 日付のフィルター

日付の書式は、「yyyy/MM/dd H:mm」。時刻は「HH」でも可。厳密には、Outlookが使っている書式に合わせる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/b313b8bc-797f-ae0d-0d07-1bedd4bf13f0.png)
時刻までちゃんと指定しないと、`[Start] >= '2020/06/10 0:00'`としたときに、6月10日0時開始の予定がフィルターに引っかからない。

* `[ReceivedTime] >= '2020/04/15'`
  * メールの受信日が2020/04/15以降
* `[Start] >= '2020/06/10 0:00' AND [End] <= '2020/06/30 0:00'`
  * 予定の開始日が6/10以降 かつ 終了日が6/30以前

# Booleanのフィルター

* `[UnRead] = True`
  * メールが未読である
* `[AllDayEvent] = True`
  * 予定が「終日」である

# 列挙型のフィルター
Importance(重要度)などはVBAでは列挙型で指定するが、フィルター構文ではすべて数字へ置き換える。

* `[Importance] = 2`
  * 重要度が「高」である

# MailItem (メール)
検索に使いそうなプロパティを載せておく。

|プロパティ名|型|説明|
|---|---|---|
|Subject|文字|件名|
|SenderEmailAddress|文字|送信者のメールアドレス|
|ReceivedTime|日付|受信日時|
|UnRead|Boolean|未読かどうか|

# AppointmentItem (予定)

|プロパティ名|型|説明|
|---|---|---|
|Subject|文字|件名|
|Start|日付|開始日時|
|End|日付|終了日時|
|AllDayEvent|Boolean|終日かどうか|
|Location|文字|場所|
ApacheアクセスログにユーザIDをうまく記録する方法

## はじめに

Apacheアクセスログを見返すときに、「ログ上にユーザIDが記録されてたら便利なのにな」とか思うことありませんか？
プログラム内で使われる各種情報をアクセスログに連携するためのベストプラクティスをご紹介します。

## 前提条件

1. プログラム内の変数値をApacheアクセスログに記録できる
2. Webサーバからクライアントには**変数値を直接出力しない**
3. **Apache 2.4.7以降**で使用可能

## 実装方法

プログラムからは、適当なヘッダとして出力する。

```php
// PHPでの実装例
header("X-User-Id: 1234");
```

ユーザID情報を直接ユーザに出力したくないので、Apache上で以下のように設定する。

```conf
# mod_headersを有効化
LoadModule headers_module modules/mod_headers.so
# レスポンスヘッダをnoteとしてxuseridに設定
Header always note X-User-Id xuserid
# レスポンスヘッダ出力を抑制
Header always unset X-User-Id
# 以下例ではログ末尾にユーザID情報を追加
LogFormat "%h %l %u %t \"%r\" %>s %b %{xuserid}o" common
```

## Apache 2.2で実現したい場合

Apache 2.2.x では標準でレスポンスヘッダ削除＆ログ出力ができません。
以下のモジュールを使うことで実現可能でした。
https://github.com/kazeburo/mod_copy_header

```
LoadModule headers_module modules/mod_headers.so
LoadModule copyheader_module modules/mod_copy_header.so
<IfModule copyheader_module>
  CopyHeaderActive On
  CopyHeader X-User-Id
</IfModule>
Header unset X-User-Id
LogFormat "%h %l %u %t \"%r\" %>s %b %{X-User-Id}n" common
```

## さいごに

上記の例ではユーザIDを出力していますが、その他にもログに残しておけば便利なものが多いのではないでしょうか。
それではみなさん、快適なログライフを！
Python 3.8 では pow(n, 1000000007 - 2, 1000000007) より pow(n, -1, 1000000007) が良さそう

# Python 3.8 では pow(n, 1000000007 - 2, 1000000007) より pow(n, -1, 1000000007) が良さそう

Python 3.8 の pow は第三引数を指定した場合でも、第二引数に負の値が取れるようになった. その事実は Python 3.8 のリリースノートにも書かれている.

[What’s New In Python 3.8: Other Language Changes](https://docs.python.org/3/whatsnew/3.8.html#other-language-changes)

> For integers, the three-argument form of the pow() function now permits the exponent to be negative in the case where the base is relatively prime to the modulus.

そして、どうも -1 を指定して、逆元を計算するとだいぶ速いようである.

```python
$ python3.8
Python 3.8.3 (default, May 23 2020, 15:50:53)
[GCC 9.3.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from timeit import timeit
>>> m = 1000000007
>>> pow(2, m - 2, m)
500000004
>>> pow(2, -1, m)
500000004
>>> timeit(lambda: [pow(i, m - 2, m) for i in range(1, 10000)], number=100)
3.5805746999103576
>>> timeit(lambda: [pow(i, -1, m) for i in range(1, 10000)], number=100)
1.2788116000592709
```

追記: なぜ速いのかなと思って CPython のソースコードを眺めてみた. [longobject.c](https://github.com/python/cpython/blob/master/Objects/longobject.c) の `long_pow` が実装なのだが、第二引数が負で第三引数が `None` でない場合は `long_invmod` という関数を呼んでいた. `long_invmod` は拡張ユークリッドの互除法で逆元を求めていた.
【質問】rails db:migrateを実行してDEPRECATION WARNING:エラーの解決方法

初めて質問させていただきます。
プログラミング初心者です。 

バージョン：Rails 5.2.4.3

いいね機能を作成のためモデル名Favoritesを作成後
]$ rails db:migrateを実行したところ下記エラーが出ました

エラー文：
DEPRECATION WARNING:Passing the environment's name as a regular argument is deprecated and will be removed in the next Rails version. Please, use the -e option instead. (called from <top (required)> at /home/vagrant/work/Bookers2-favorites/bin/rails:9)
config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:

  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true

Traceback (most recent call last):
	155: from bin/rails:3:in `<main>'
	154: from bin/rails:3:in `load'
	153: from /home/vagrant/work/Bookers2-favorites/bin/spring:15:in `<top (required)>'
	152: from /home/vagrant/.rbenv/versions/2.5.7/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
	151: from /home/vagrant/.rbenv/versions/2.5.7/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
	150: from /home/vagrant/.rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>'
	149: from /home/vagrant/.rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load'
	148: from /home/vagrant/.rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/spring-2.1.0/bin/spring:49:in `<top (required)>'
・
・
・

試したこと：
①$rails c -e test

下記サイトのエラー文と同じようなので試した後再度、rails db:migrateを実行しましたが同じエラーが出て解決できておりません。
https://qiita.com/sukebeeeeei/items/cf0ccb6f7e8b4e8a775b


②$ rails db:migrate:status


database: /home/vagrant/work/Bookers2-favorites/db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200528092619  Devise create users
   up     20200528122108  Create books
   up     20200530074646  Add user id to books
   up     20200601075848  Add profile image id to users
   up     20200601090934  Add introduction to users
   up     20200601094853  Rename opinion column to books
  down    20200622230047  Create favorites

初めて質問させていただいております。何か不足な情報や書き方が至らないところがあるかと思いますが、よろしくお願いします。
【JavaScript】html要素の基準フォントサイズを取得する

#html要素の基準フォントサイズ取得
WEBサイトのレスポンシブル対応などで、html要素の基準フォントサイズが知りたくなったときにそれを取得することがあったのでメモ。

```javascript

let root = document.documentElement; //htmlのルート要素を取得
let style = window.getComputedStyle(root).getPropertyValue('font-size'); //ルート要素のcssプロパティを全て取得し、その中からフォントサイズを取得
let stFontSize = parseFloat(style); //float型の数値に変換
```

#window.getComputedStyleでcssプロパティを取得
```javascript
let style = window.getComputedStyle(root).getPropertyValue('font-size');
```
この部分がポイントで、 window.getComputedStyle()の引数に入れたelementのcssプロパティを全て返してくれます。
https://developer.mozilla.org/ja/docs/Web/API/Window/getComputedStyle

なので、基準フォントサイズに限らず、引数を変えれば好きなelementのcssプロパティを取得出来ます。
java comparator を使ったソート


- comparator を使うと便利にソートできます．

### コード (昇順ソート)

```java

import java.util.*;

class Solution {

    public static void main(String[] args) {
        sort1();
        sort2();
    }

    public static void sort1 () {
        List<Integer> list1 = Arrays.asList(3,2,8,4);
        System.out.println("sort前: "+list1);
        Comparator<Integer> comparator = new Comparator<Integer>() {
            public int compare(Integer int1, Integer int2) {
                return (int1.compareTo(int2));
            }
        };
        Collections.sort(list1, comparator);
        System.out.println("comparator(インスタンス化する), sort 後: "+list1);
    }

    public static void sort2(){
        List<Integer> list1 = Arrays.asList(3,2,8,4);
        System.out.println("sort前: "+list1);
        Collections.sort(list1, (a, b) -> Integer.compare(a, b));
        System.out.println("ラムダ式comparator, sort 後: "+list1);
    }
}
```


###出力結果

```
sort前: [3, 2, 8, 4]
comparator(インスタンス化する), sort 後: [2, 3, 4, 8]
sort前: [3, 2, 8, 4]
ラムダ式comparator, sort 後: [2, 3, 4, 8]

```
【サクラエディタ】ファイルのフォルダを開くマクロ

# これはなに？
サクラエディタで開いているファイルのフォルダを開くためのマクロ(スクリプト)。
マクロ格納フォルダに置き、ツールバーのアイコンに登録すると便利。(%APPDATA%\sakura)


# 使用例
ファイルのコピー、リネーム等でフォルダを開きたいときに使う。


# ソース

~~~vb:ファイルのフォルダを開く.vbs
Option Explicit

Dim FSO:	Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH:	Set WSH = CreateObject("WScript.Shell")

Dim strFilePath
Dim strFolderPath

' 開いているファイルのパスを取得
' (未保存の場合は空文字列が返る)
strFilePath = Editor.GetFilename()

' 開いているファイルのフォルダを開く
If strFilePath <> "" Then
	strFolderPath = FSO.GetParentFolderName(strFilePath)
	Call WSH.run("explorer.exe " & strFolderPath)
End If
~~~


# 設定方法

## メニュー > 設定 > 共通設定

### 「マクロ」タブ
1. 登録先のスロットを選択
2. マクロファイルを選択
3. 名称を入力 (任意)
4. 「設定」ボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407847/d762ec89-273d-96ec-d7a8-98f8489a8b54.png)

### 「ツールバー」タブ
1. 「外部マクロ」を選択
2. 「マクロ」タブで設定したものを選択
3. 追加ボタン(→ or ≫)を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407847/06800928-9afa-982d-e747-5885699c5e37.png)
【サクラエディタ】ファイルのプロパティを開くマクロ

# これはなに？
サクラエディタで開いているファイルのプロパティウィンドウを開くためのマクロ(スクリプト)。
マクロ格納フォルダに置き、ツールバーのアイコンに登録すると便利。(%APPDATA%\sakura)


# 使用例
なんらかのツールからテキストファイルを開いたら「読み取り専用」属性が付いていたとき、普通なら

1. ファイルのフォルダを開く
2. ファイルのプロパティを開く
3. 「読み取り専用」のチェックボックスを外す
4. ファイルを開き直す

の手順を踏む必要があるが、このマクロを使えば 1. と 2. をワンクリックで実現できる。
さらにサクラエディタ標準機能の「(ファイルを)開き直す」を使えば 4. もワンクリックで実現できる。

たった2ステップをワンクリックで実現するだけの地味なマクロだけど、編集しようとしたら読み取り専用で1イラッ、開いているファイルのフォルダを開くのが地味に面倒で2イラッ、を解消できる。


# ソース

~~~vb:ファイルのプロパティを開く.vbs
Option Explicit

Dim FSO:	Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH:	Set WSH = CreateObject("WScript.Shell")
Dim ShellApp:	Set ShellApp = CreateObject("Shell.Application")

Dim strFilePath
Dim strFolderPath
Dim strFileName
Dim objFolder
Dim objFile

' 開いているファイルのパスを取得
' (未保存の場合は空文字列が返る)
strFilePath = Editor.GetFilename()

' 開いているファイルのプロパティダイアログを開く
If strFilePath <> "" Then
	' パスを親フォルダとファイル名に分割
	strFolderPath = FSO.GetParentFolderName(strFilePath)
	strFileName = FSO.GetFileName(strFilePath)

	' Shellのオブジェクトを取得する
	Set objFolder = ShellApp.NameSpace(strFolderPath)
	Set objFile = objFolder.ParseName(strFileName)

	' プロパティダイアログを開く
	Call objFile.InvokeVerb("properties")
End If
~~~


# 設定方法

## メニュー > 設定 > 共通設定

### 「マクロ」タブ
1. 登録先のスロットを選択
2. マクロファイルを選択
3. 名称を入力 (任意)
4. 「設定」ボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407847/d762ec89-273d-96ec-d7a8-98f8489a8b54.png)

### 「ツールバー」タブ
1. 「外部マクロ」を選択
2. 「マクロ」タブで設定したものを選択
3. 追加ボタン(→ or ≫)を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407847/06800928-9afa-982d-e747-5885699c5e37.png)
【Go言語 GitHubActions】linterで特定のファイルを無視する方法

調べてもあまりでてこなかったのでメモ用に残す


```yaml

on:
  pull_request:
    paths:
      - '**.go'

jobs:
  lint:
    name: runner / lint
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: reviewdog/action-golangci-lint@v1
      with:
        github_token: ${{ secrets.github_token }}
        tool_name: golint
# ここに--skipをつけて指定する
        golangci_lint_flags: "--disable-all -E golint --skip pkg/"
        level: warning
        filter_mode: nofilter
        fail_on_error: true
        reporter: github-pr-review


```
[AWS]VPCの設計の考え方

#VPCとは
・Virtual Private Cloudの略で、AWSアカウントを作成するとデフォルトで作成される。
・ネットワーク的に分離された領域。インターネットGWをアタッチしないと外と通信もできない。
・FWはセキュリティグループと呼ばれるもので制御する。
・VPCの中にサブネットを作成し、セグメント単位での管理が可能
・ルートテーブルでルーティング制御ができる

#シングル？マルチ？
一つのアカウントで２つ以上のVPCを作ったり、複数アカウントで複数のVPCを作るというケースもあります。
まず、シングルのVPCの場合、全ての環境が一つの空間に作られます。
マルチでVPCを作成する場合は、本番環境、ステージング環境でVPCを分けるパターンがあります。

VPCの設計はアカウント設計に関連します。
例えば、アカウントをシステムごとに分ける、であれば
Aシステムのアカウントに、本番/ステージング/開発でVPCを分けるケースが考えられます。
他にも、アカウントを環境ごとに変える、であれば
本番環境のアカウントには、AシステムのVPC、BシステムのVPCという分け方も考えられます。

#VPCを分けることのメリデメ
一番大きいのは、**リスクを分断できると**いう点です。
後述しますが、一つのVPCに本番や検証環境が混在していると、誤操作のリスクもありますし
何かしらの攻撃で侵入を許した場合、同一VPCは影響を受けてしまいます。
なので、セキュリティの面からも環境毎にネットワークを分離することをオススメします。

逆にデメリットですが、VPCが増えすぎると管理がしづらいというのがあります。
VPCピアリングの設定が複雑になってきます。
ですが今はTransitGatewayというものがあるので、そちらを活用すればそのデメリットは軽減されます。

#VPCの設計注意点
##IPアドレスの範囲に気をつける
VPCを作成する際に使用するIPの範囲は一般的には以下を指定します。
10.0.0.0 - 10.255.255.255 
172.16.0.0 - 172.31.255.255 
192.168.0.0 - 192.168.255.255 

気をつけないといけないのは、VPCピアリングなど別のVPCと繋ぐ場合に**IPアドレスの範囲が重複していると対応できません**。

よくある構成として、環境毎、あるいはシステム・環境毎にアカウント、VPCを分ける場合
以下が参考になりましたので、リンクを貼っておきます。
[AWS導入前に知っておきたかった「VPC設計」](https://qiita.com/takuya_tsurumi/items/77f246c0ad4bc8caf234)


##VPCピアリングの特徴
異なるVCP同士を繋げるVPCピアリングという方法があります。
これは以下の注意点があります。
・IPアドレスの重複がないこと
・同じリージョンであること
・二つ先のVPCには直接通信ができない。
　→VPCがA,B,Cとあった場合でVPCピアリングをAとB、BとCとしている場合、
　　AとCは直接通信ができない、という制約があります。
なので、社内でVPCが増えていくようなアカウント・VPC設計をしているのであれば
VPCピアリングを使用するよりも、TransitGatewayで集約した方がいいです。


##これだけは最低限考慮する
昔は1アカウント1VPCなんていう考えもあったのかもしれませんが、以下の観点では最低限分けた方がいいです。
・環境(本番、ステージング、開発)でVPCを分ける
　→いったん攻撃を受けてしまったら、同一VPCは影響を受ける可能性が非常に高い
・レイヤー(WEB、DB、フロント(LB))はサブネットで分ける
　→インターネットとの接続点は明確に最小限に分けておく

#最後に
AWS案件に携わってまだ1ヶ月のレベルなので、指摘や意見などあればどんどんコメントいただけるとありがたいです。
processing(python) リストの座標を図化 draw()の中で回数指定

今回も、後輩からの質問でせっかく作ったので解説つけて書いていこうと思います。

# やること！
1. 皿を指定した分積む！
2. リストにある座標の場所に円を描く
3. ランダムな位置に車を配置！

## 1.の完成プログラム！

```python:sketch.py
y = 600
count = 0

def setup():
    size(800,600)

def stack_plates(n):
    global y,count
    if count <= n:                #countが指定したnを超えたら終わる
        ellipse(width/2,y,100,10) #皿を描く
    y -= 5                        #皿を描く座標をずらす
    count += 1                    #処理が終わるたびに値を増加！

def draw():
    stack_plates(10)
```

###意識すること！
1. 皿を置くたびに皿の座標をずらす必要がある
2. draw()の中では永遠に続くので壁を作る

## 2.の完成プログラム！

```python:sketch.py
def setup():
    size(800,600)
    x = [200,300,550]
    y = [100,400,300]
    d = [50,180,100]
    for i in range( len(x) ):        #len()でxの中の長さで動かす
        ellipse(x[i],y[i],d[i],d[i])
```
###意識すること！
1. x,y,dに入れる値は数をそろえること！
2. forをlen()で動かす！

##3.の完成プログラム！

```python:sketch.py
def setup():
    size(800,600)
    pic = int(random(10)) #車の置く個数！
    for i in range(pic):
        x = random(800)   #車のx座標
        y = random(600)   #車のy座標
        sketch_car(x,y)   #関数にx,yの座標を与える！
    
def sketch_car(x,y):      #車を描く関数！
    fill(128,249,251)
    rect(x,y,50,25)
    fill(244,201,70)
    rect(x-25,y+25,100,25)
    fill(60,63,55)
    ellipse(x,y+50,25,25)
    ellipse(x+50,y+50,25,25)
```
###意識すること！
1.車を描くのを関数として持っておく！
2.車を各関数にx,yの引数を用意する！
3.車の書く座標をrandom関数で決める！
4.車の個数もrandomにしたいのならforを回す回数もランダムに変える！

-----
前回と比べて説明が少なくなりましたが、意識することの内容を見ながらプログラムを見れば読み解けるようには書いたつもりなので！わからなくてできなかった人は見といて損はないと思います！
matlabでBLEを使う②

 SONYのtoioという玩具を扱います。スイッチサイエンスで、本体1個と充電器を購入しました。BLEで通信します。仕様は[こちらで読めます](https://toio.github.io/toio-spec/docs/ble_communication_overview.html)。最初はLチカから始めます。

![toio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0007e237-6a97-6089-c943-e7562ad7c256.png)


# Lチカ
　本体の電源を入れ、

```matlab
clear
list = blelist("Timeout", 10);
```

で探します。local nameはtio Core Cube、アドレスはC3F086EFC762です。
![スクリーンショット 2020-06-22 15.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/b8997c53-f9ad-210d-d399-4ee944572144.png)
　底面に[ランプ](https://toio.github.io/toio-spec/docs/ble_light)を一つもっています。Characteristic UUIDは10B20103-5B3B-4571-9508-CF3EFCD7BBAE、write属性、DescriptorはLight Controlです。確認します。

```matlab
b = ble("C3F086EFC762");
bb = b.Characteristics;
```

bbの値です。
![スクリーンショット 2020-06-22 15.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/39b4ddcd-31b1-2ffa-580e-9ad2db7608f0.png)

# 書き込むデータはバイト列
　点灯・消灯は、仕様書に載っている次のサンプル・コードを書き込みます。赤色のLEDが160ms間、点灯します。

|データ位置	|タイプ 	|　内容	　　　　　　　　　|例|
|:------------|------:|:---------------------:|:-----------------:|
|0	|UInt8	|制御の種類	　　　　 |0x03（点灯・消灯）|
|1	|UInt8	|ランプを制御する時間	|0x10（160ms）|
|2	|UInt8	|制御するランプの数	|0x01|
|3	|UInt8	|制御するランプの ID	|0x01|
|4	|UInt8	|ランプの Red の値	|0xFF|
|5	|UInt8	|ランプの Green の値	|0x00|
|6	|UInt8	|ランプの Blue の値	|0x00|

```matlab
clear
list = blelist("Timeout", 10);
toio_address = "C3F086EFC762"
b = ble(toio_address);
bb = b.Characteristics;

LightControl_ServiceUUID = "10B20100-5B3B-4571-9508-CF3EFCD7BBAE"
LightControl_CharacteristicUUID = "10B20103-5B3B-4571-9508-CF3EFCD7BBAE"
message1 = [0x03,0x10,0x01,0x01,0xff,0x00,0x00]

for i = 1:10
    c = characteristic(b, LightControl_ServiceUUID, LightControl_CharacteristicUUID);
    write(c, message1)  % Red LED
    pause(1)
end

clear b
```
　10回、赤色LEDが点滅します。clear bでdisconnectするので、toioは青色LEDを点滅し、アドバタイジングを開始しているようです。
年配フリーランスプログラマーが案件を継承するタイミング

# 20代でフリーランスなったときに作ったWebシステム

　20代でフリーランスになり、いろいろと案件を受けて40歳になった今でもそのころから続いているシステムがあります。
　当時のスキルや技術で作っているから直したいなあというのは、フリーランスプログラマーならよくあることかもしれません。
　
　そう思っていると、コロナの影響か、システムリプレイスの話がでてきました。
　
# 初期に機能やページを多めに作っていた

　サービス精神か、結構、あれもこれも作ってしまっていて、事業が始まると意外と使わなかったというものが多くあります。
　20代の頃なので、頑張ってしまったところがあります。
　でも10年ぐらい経つと、システムを使っている事業の方向性とか業務も固まってきて、システム上の無駄も見えてきます。
　勿論、逆に、時代も変わっているので新しいニーズも生まれています。

　ここがリプレイスのタイミングなんだと思います。私の場合、10年ぐらい稼働させたシステムでそういうのが起こっています。
　勿論、コロナの影響でオンラインシステム改善が後押ししているのもあるかもしれません。

# 折角なので若いフリーランスの人へ案件を委譲

　長い付き合いのお客さんなので、そのまま私が引き継いで改修してもよかったのですが、齢40歳を超えて、このままこのシステムの面倒がみれるかなあと感じてきました。
　
　私が20代のころとWebの技術も全然異なっています。

　技術的な要求も高くなっていて、一人でするのがしんどくなっている面もあります。年齢のせいもあるのか、それともそもそも技術的にいろいろする必要があるからなのか、それは若い人に聞いてみたいところでもあります。
 これらについては以下の記事に別途記載しています。

　**[▶ 一人でフリーランスとしてWebプログラマーをする限界](https://qiita.com/SFITB/items/7931e33a1b28dbb307ac)**

　あとは、単純に、頑張っているフリーランスの人によいお客さんは紹介していきたいという技術以外の感情もありました。
　
　そこで、折角リプレイスで作り直しをするので、このタイミングで若い人に渡してしまおうと思いました。

# リプレイスは案件継承のタイミングでは

　自分でいうのもなんですが、フリーランスのシステムとか結構、癖が強いのがあってそのまま他人に渡せないものとかもあります。
　特に若いときにつくったものは、動いてはいるけどメンテが大変なものもあります。
　なので、そのまま他人へ渡すと絶対困るだろうと思います。

　リプレイスはこの「レガシー」を捨てて、新しいスタートを切るにはもってこいのタイミングです。

　ついでに、開発者自体も一新すれば、お客さんのサービスを支える上でも少し不安が減るようにも思います。

# リプレイスは新規開発よりはノウハウがあるのでサポートしやすい

　新規開発のときは、未知の事柄へのいろいろな不安や無駄な作業なども発生していました。

　でも、リプレイスはだいたい事業の内容も、システムの内容も把握しています。
　
　そして、自分自身いろいろと経験しているので、若手の人に渡すときにも、フォローがしやすいのもあります。
　いきなり意味不明なものを渡されるよりは、こうしたノウハウや技術的なフォローがある方が、
　受けた方も仕事がしやすいのかなという気はします。

# お客さんの反応

　これも手前味噌かもしれませんが、10年以上つきあっている自分が紹介した人なので、かなり好意的に受け入れてくれました。
　お客さんがそもそもすごくいい人だというのもありますが。

　とはいえ、紹介したフリーランスの人柄も大きく、挨拶、笑顔がみえる人間だからこそ、お客さんもより受け入れやすかったのかもしれません。

　私自身、声をかけたのが、そうした人柄の良さを認めてのところでした。
　まだ、今からいっしょにリプレイスをしていくので、どういう結果になるかはわかりませんが、
　今の所、いい決断をしたと感じています。

　今後、この若手のフリーランスの人に、お客さんとのお付き合いをお願いしようと思っています。
　勿論、直接契約してもらう約束もしたので、徐々に、この人のクライアントになっていくのだと思います。


# 高齢のフリーランスプログラマーの仕事

　私も40代前半なので、そこまで高齢ではないですが、そろそろ高齢なりのフリーランスプログラマーとしての身の振り方を考えないといけないと思っています。

　私が、みてきた50歳以上のフリーランスプログラマーの人は、大方大手の常駐をしています。
　常駐なので、メンテナンスはその人がかならずしないといけないわけではなく、発注元の社員の人が基本はしています。
　
　つまり、準委任の形式で働いて、労働サービスだけを提供することのみしています。
　それらの人に聞いてみると、やはり自分が管理するシステムをもつと、年齢的にきついといっていました。
　
　夜中や休日も対応しないと行けないものもあるし、意外とフリーランスの保守費用は安く、掛け持ちをしないと生活ができません。
　
　そうなるとどうしても、手間がなく、１つの案件でまとまったお金を得たいと思ってきます。

　それに最も適しているのが、準委任での常駐することなのだと思います。

# 最後に

　Webの技術はほんの20年前ぐらいから普及してきたものです。
　そして、その開発に携わるフリーランスの人達も、この技術とともに歩んでいます。

　つまり、これから先の世界は、未知ということです。

　一体、どのようにフリーランスプログラマーが自分のシステムを管理していくのか？
　はたまた、若い人へバトンタッチするのか。

　では、バトンタッチしたあと、どのように売上を確保していくのか。

　私自身、模索中ですが、また思ったことがあれば投稿したいと思います。
　
　同じような境遇の人、もしくは、若いフリーランスプログラマーの考える切っ掛けになれば幸いです。
rails知識メモ[自動で読み込みされるもの]

##起動時に自動で読み込まれるもの
- Rails本体およびその設定(/config/配下)
- Gemfileによって自動requireされるように指定されているもの

##定数を介して自動で読み込み、development環境では自動再読み込みがされるもの
- /app/配下

https://railsguides.jp/initialization.html
https://railsguides.jp/autoloading_and_reloading_constants.html
競馬必勝法をプログラム化

#目的#
1. <a href="https://www.umameshi.com/info/0011.html">うまめし.com 競馬必勝法</a>の記事を参考に***競馬必勝法をプログラム化***
2. 出走前に自分が作成したプログラム（<a href="https://github.com/maeda-naoya-fk/Horse_Optimization">githubのコード</a>）で最適解（**pulp**を使用）を出す

#準備#
- python
- 2013年9月20日名古屋競馬1レースの単勝オッズと馬単オッズのデータ
- 本記事では長くなるのでコードは載せずに結果と何をしたか説明していく
（詳しくは<a href="https://github.com/maeda-naoya-fk/Horse_Optimization">githubのコード</a>で）

#データ#
- 単勝と馬単のデータは以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655736/313820b0-3c1d-0001-cfd9-3c9912349edf.png)
- indexは馬番
- columnsは単勝オッズと馬単オッズ(例；１は馬番１の馬単オッズ)

#比較#
- 馬単合成オッズと単勝オッズの差を出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655736/80fffe59-29fc-8668-44a5-9d6ea425cc0c.png)
- ここから単勝オッズが小さくて差が大きいものの馬番を選ぶ

#モデル選定と結果#
- 上の結果より**馬番'1','3'**を使用するのがいいとみた

##model_0##
- model_0では引数に馬単'３'を使用した
- **ベット枚数(1枚100円)を最小にし、どの馬が勝っても払い戻し金（円）と総ベット枚数*100（円）との差額（円）がプラスになるように条件を設定した**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655736/d0d1e1f4-0cb8-9ef5-5b0e-8997467ee031.png)
- 差額でマイナスが出ているのは、条件は満たしているが、ベット枚数を最後に切り上げているので値が変わってきている
- Solvedはこの最適化問題が解けていることを示す
- 48.0は総ベット枚数を示す

##model_1##
- model_1では引数に馬単'1'と馬単'3'を使用した
- **総払い戻し金を最大にし、どの馬が勝っても払い戻し金（円）と総ベット枚数*100（円）との差額（円）がプラスになるように条件を設定した。また最大ベット枚数を引数に入れて、それ以上にならないように条件をつける。（本記事では1000枚）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655736/5901ffc3-b876-a39d-a9ed-dfc9d879cbb1.png)
- これだと賭け方が一番オッズが高いところに集中させて、オッズが低い馬にはあまり損失が出ないようにしている

#感想#
1. 今回解けたデータ（2013年9月20日名古屋競馬1レース）を使用したため、この必勝法は使えそうに見えるが実際解けないことの方が多い
2. 現にマイナスが出ている箇所（切り上げのため）があるので絶対に負けないとは言えないが、***完全自動化***（他に自動で競馬券を買うなど）すれば定期的にお金が入ってきそう。（まだ実装には至っていない）
2. <a href="https://github.com/maeda-naoya-fk/Horse_Optimization">githubのコード</a>ではレース前にinfoをいじれば、スクレイピングして単勝と馬単のデータをとれるモジュールは作成してあるので、これらを使用してこの手法が気に入ったら完全自動化するシステムを作ってみて下さい
初心者によるプログラミング学習ログ 353日目

#100日チャレンジの353日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
353日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日1日でやったこと⇩<br>●ブログ1記事作成<br>●プログラミング学習353日目　2.0h<br>・ポートフォリオ一部修正<br><br>モヤモヤがあってあんまり集中できませんでした<br>あと、寝落ちしました<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1275161869808832512?ref_src=twsrc%5Etfw">June 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
(自分用)Flask_7(Flaskからデータベースを開く)

# 項目
1. Flaskからデータベースを開く<br>(今日は疲れてるのでこれだけで)

# 1.Flaskからデータベースを開く
```python:python
from flask import Flask, render_template
import pymysql
app = Flask(__name__)

def getConnection():
    return pymysql.connect(
        host='localhost',
        db='mydb',
        user='root',
        password='',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor
    )

@app.route('/')
def select_sql():
    connection = getConnection()

    sql = "SELECT * FROM players"
    cursor = connection.cursor()
    cursor.execute(sql)
    players = cursor.fetchall()

    cursor.close()
    connection.close()

    return render_template('view.html', players = players)
```
- python側に関しては基本的には今までの組み合わせ
- 前回やった`import pymysql`でPython内でMySQLを使えるようにしている
- `def getConnection():return pymysql.connect()`で、`getConnection()`を呼び出した時に、dbを呼び出す材料が手に入るようになっている
- `connection = getConnection()`で`connection`に呼び出す情報を入れて
- 下の幾つかは前回と同じ動き
- そんでFlaskの手順で`return`に代入した変数を入れてhtml側でも使えるようにしている

```html:view.html
{% for player in players %}
    <p>{{ player }}</p>
{% endfor %}
```
- なんの変哲もないpy側から渡された変数をfor文で表示する儀式
- これ入れればとりあえずOK

あとは普通にFlaskを起動すれば完了(一応下に起動のあれも載せておく)

```bash:ターミナルとか
$ cd <作業ディレクトリが入ってるフォルダ名とか>
$ FLASK_APP=<作業pyディレクトリ名> FLASK_ENV=development flask run
```

# 2.終わりに
- かなり短い
- SQLでデータ削除とかAWS本格的に借りて動かすのとかは明日(今日?)にお預け
Flask で Access to fetch at ... from origin ... has been blocked by CORS policy


## 対応

`after_request` を使って、レスポンスを [フック](https://wa3.i-3-i.info/word12296.html) して、ヘッダを書き換えました。

```python
#
# 対話モード >>> に
# コピペで実行できます。
#
from flask import Flask, jsonify


app = Flask(__name__)

@app.route('/')
def index():
    return jsonify({'message': 'Hello, world!'})

@app.after_request
def set_cors_header(response):
    クライアント側のアドレスとポート = 'http://127.0.0.1:8080'
    response.headers['Access-Control-Allow-Origin'] = クライアント側のアドレスとポート
    response.headers['Access-Control-Allow-Method'] = 'GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS'  # noqa: E501
    response.headers['Access-Control-Allow-Headers'] = 'Content-type,Accept,X-Custom-Header'  # noqa: E501
    response.headers['Access-Control-Allow-Credentials'] = 'true'
    response.headers['Access-Control-Max-Age'] = '86400'
    return response

app.run()
```

* [Handling GET and POST in same Flask view - Stackoverflow](https://stackoverflow.com/questions/42018603/handling-get-and-post-in-same-flask-view)

## 背景

CORS に引っかかると以下のようなエラーが表示されます。

```
Access to fetch
at 'http://127.0.0.1:5000/'  サーバ (Flask) 側の IP アドレスとポート
from origin 'http://127.0.0.1:8080' クライアント側の IP アドレスとポート番号
has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present
on the requested resource.
If an opaque response serves your needs,
set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

いくつか他にも対応方法はあるようなのですが、

* [Flask-CORS](https://flask-cors.readthedocs.io/en/latest/)

そこまで込み入ったことはしないので、とりあえず、簡単に逃しました。
Rider ですぐわかる、あのファイルのエクスプローラー上の位置

開いているファイルがエクスプローラー上のどこにあるファイルかわからなくなることないですか？
私はあります。そんなときに一発でその場所が特定できたら便利ですよね。
実は Rider にはそんな機能があるんです！

GUI でポチッとする方法と、ショートカットのを説明していきます。

# GUI
例えば①のファイル（ここでは AnswerGenerator.cs）の場所がわからない場合です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/48cd9f67-0b8e-6d49-2ede-751b0753e7d4.png)
②の丸いボタンを押すだけで、
![Kanji____Documents_80_unity_Kanji__-_____Assets_Application_Scripts_Manager_AnswerGenerator_cs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/32306b31-70bb-06f0-842c-4f892ede02d4.png)
って感じで展開されます。

## 補足
ギア押して、表示されるメニューの `Always Select Opened File` チェック入れると、
常に選択したファイルがエクスプローラー上で展開表示されるようになります。
自分はガチャガチャうるさい感じがするので off ですが。
![スクリーンショット_2020-06-23_2_44_58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/a9888ad9-f11a-1618-556c-3cf95850e70e.gif)

# ショートカット
1. ファイル選択
2. `Alt` + `F1` 押して、 `1` を押す

一発でショートカットする方法を調べたのですが、わかりませんでした・・・Android Studio ならできるのに・・・。
誰かご存知の方がいたら教えてください。
ProgateでJavaについてお勉強メモ1

JavaScriptとはメロンパンとメロン、ハムとハムスターほど違うと有名なあのJavaについてProgateで勉強を始めたいと思います。行くぞーｼﾞｬﾊﾞｼﾞｬﾊﾞ:swimmer_tone2::swimmer_tone2::swimmer_tone2:
#基本編

```java
System.out.println();
```

がJSでいうconsole.log的なやつ。コンソールに結果を出力できる。
長い、長いよ。。console.logですら長いと文句言ったのに。「.」が2つもある・・！
（どうせ補完？されて長々と打つことはProgateやってる間だけだろうけども。）

しかも、printlnこれ、**lは小文字の”える”**という衝撃の事実。:scream:
読み方はプリントラインというそうな。。

Javaの構造はクラス部分・メソッド部分・メソッド内の処理の3つに別れている。まだ、ふーんそうなんだ程度でいいらしいが、きっと後ですごい伏線回収があると思っている。:spy_tone2:

##変数
###変数の定義
```java
//変数の定義
データの型 変数名;
//変数へ値の代入
変数名 = 値;
//合体できる。変数の初期化というらしい
データの型 変数名 = 値;
```

変数にはintとかStringなどのデータの型を宣言する。
そして、変数の定義と同時に値を代入することを「変数の初期化」と呼ぶらしい。

###変数の更新
```java

更新したい変数名 = 新しい値;
```
更新するときはデータの型をつけてはいけない。
データの型がついてると、新しく変数を定義してしまうようで、
Java「この名前の変数もうあるのに。なんでまたそんなこと言うの？ふえぇ」:sob:
って困ってエラーを吐いてしまうらしいので、Javaちゃんを困らせないようにしましょう。

###自己代入
```java

int X = 2;
X = X+3;
```
よくみる形。自己代入と呼ぶらしい初知り。
postgreSQLでSELECT/UPSERT

# TL;DR

```sql
INSERT INTO テーブル名(カラム名)
SELECT カラム名 FROM テーブル名
ON CONFLICT ON CONSTRAINT 制約名
DO UPDATE SET
    カラム名 = excluded.カラム名
```

# 使用例
### 使用するテーブルイメージ

- 合格者テーブル（pass_table）

|name|last_score|
|:---|:---|
|田中|30|
|山田|20|

※nameカラムが主キー

- 受験者テーブル（exam_table）

|name|score|country|
|:---|:---|:---|
|田中|60|東京|
|鈴木|40|東京|
|山田|70|神奈川|
|木村|60|神奈川|


今回は出身都道府県の差別で東京出身の受験者を問答無用で合格とします。
過去に合格実績がある人はそのまま合格者として残ります。

- UPSERT後、合格者テーブル（pass_table）

|name|last_score|
|:---|:---|
|田中|60|
|山田|20|
|鈴木|40|


### UPSERT相当文

```sql
INSERT INTO 
    pass_table(name, last_score)
SELECT 
    name, score
FROM
    exam_table
WHERE
    country = '東京'
ON CONFLICT ON CONSTRAINT pass_table_pkey
DO UPDATE SET
    last_score = excluded.last_score;
```

### 処理の流れ

➀まずINSERTするための情報をSELECTします。
SELECT結果は以下のようなイメージになります。

|name|score|
|:---|:---|
|田中|60|
|鈴木|40|

➁SELECT結果を合格者テーブルにINSERTしようとします。

|name|last_score|
|:---|:---|
|田中|30|
|山田|20|

↑　INSERT

|name|score|
|:---|:---|
|田中|60|
|鈴木|40|

このままだと「田中」がかぶってしまってエラーになります。

➂重複時の処理を記述します。
ON CONFLICT ON CONSTRAINT pass_table_pkey
「テーブルの主キーが重複してしまった場合～」

DO UPDATE SET
「以下の値でテーブルを更新します。」

※重複した場合にUPDATEせずに何もしたくない場合は`DO UPDATE SET`を`DO NOTHING`にして、クエリをしめます。


➃更新の値を記述します。
last_score = excluded.last_score;
値が重複した場合、INSERTしようとした値はexcludedという一時的なテーブルのような領域に除外されます。
ですので、そこから値を引っ張ってきてUPDATEしてやります。

以下のような架空のexcludedテーブルがあると考えるとイメージしやすいと思います。


|name|last_score|
|:---|:---|
|田中|60|

注意点としては、INSERT元のカラム名(score)ではなく、INSERT先のカラム名(last_score)を指定してやることです。


以上
CUDA on WSL2を試そうとしたら意識不明となったWSL2を蘇生させた話 

# 事の起こり
1. Insider版でWSL2からGPUにアクセスできるヒャッハー！
2. 意気揚々とfastリングに切り替える。
3. 更新後WSLがエラーを吐き臨終。

# エラー内容
```
WslRegisterDistributionが次のエラーで失敗しました：0x800701bc
エラー：0x800701bc WSL 2 ?????????????????????????? https://aka.ms/wsl2kernel
```
のような内容でした。

# 試したこと
### WSL2を入れ直し
一度アプリと機能からWSLのディストリを削除。
→ 起動せず。（コンソール起動時に走るべきインストールタスクが走らない）

### WSL機能のON/OFF
一度WSLの機能のチェックボックスを外し再起動、
その後再度有効化を行う。
→ 起動せず。

### WSL2用の最新カーネルのインストール
公式の最新カーネルを落としてインストールする。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
→そもそもインストールできない....

# 解決策
前段のWSL2用の最新カーネルのインストールが正解といえます。
ただし僕の環境では、fastリングのバージョンに更新する以前にWSL2のカーネルがインストールされていました。
なので、その前カーネルと競合してインストールが不可能となっていました。
＊下記のissueに同じ現象に遭遇した方を発見
https://github.com/microsoft/WSL/issues/5393

結論、前環境から入っていたカーネルをいったん削除。
そこから最新のカーネルをインストールしなおす事で無事起動しました。
チーム開発の流れと注意点(初学者)

## チーム開発の主な流れ

チーム開発の流れとしてまず最初に
1.リードプログラマーがプロジェクトのリボジトリを作成

2.そのリポジトリを各々がforkしてcloneする
git clone https://github.com/ユーザー名/リボジトリ名.git
3.各プログラマーが各々のリポジトリ先にfork先に追加
 git remote add リモート名(originなどの名前) https://github.com/開発の代表者/リボジトリ名.git

4.作業用ブランチを作成

```
git checkout -b (branch名)
```
5.リボジトリで各プログラマーは開発をスタートする。
**ここでの注意点**
１タスクごとにコミットをしていく

```
git add フォルダー or ファイル名
git commit -m "タスク名"
```

6.ある程度commitがたまったらpush

```
git push origin master
```
7.プッシュしたらリードプログラマー宛てにPullRequestを行います

ここでconflictがでた場合下記を参照にしてください
https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github

8.PullRequestを行う時の注意点
WHAT(どのような実装)

WHY (なぜ実装したのか)
といった形でリクエストを送るとよりリードプログラマーに送ります

9.リードプログラマーは、送られたきたPullRequestをメッセージを確認した後にマージを行います

##　注意点
PullRequestを行ってもFork/cloneしたリポジトリは本家にmasterが追従しているわけではありません。
マージした後は各々のマスターブランチ に移動して
コマンド)git fetch upstream　
にて更新を行い
コマンド)git checkout master
コマンド)git merge upstream/master
で本家のmasterに追従させることができます。
変更が無い場合には "Already up-to-date." と表示されて終了です!

## おわり
自分自身最初にgithubを使いチーム開発をした際に手順、注意点を復習としてまとめさせていただきました。
少しでも参考になれば私も嬉しいです