OmniAICreator/Qiita-1.07M huggingface dataset:
４０代おっさんPythonを勉強する（CSVファイルの読み書き編）

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## 構造化されたテキストファイル

- 単純なテキストファイルだと、情報を探すのが大変なので、構造的なデータを作るのが一般的
- これらの構造化ファイル形式を読み書きのPythonモジュールが提供されている
- 良く使われる形式は下記のようになる

| 形式 | 形式や言語 | 特徴 |
| --- | --- | --- |
| CSV | Comma-Seperated Values | セパレーター、区切り子：タブ（'\t'）、カンマ（','）、縦棒（'\|'）、コロン（':'）など |
| XML | Extensible Markup Language | タグ'<'と'>'で囲む |
| JSON | JavaScript Object Notation | 記号を駆使するもの |
| YAML | YAML Ain't a Markup Language | インデント |

### CSV形式

```text
kanazawa,toshiki,M
hukusi,akihito,M
Takahashi,Akiko,F
Tanaka,Kentaro,M
```

- Pythonでcsvモジュールを使うと簡単に読み書きができる

```python
import csv

namelist = [['kanazawa','toshiki','M'],
['hukusi','akihito','M'],
['Takahashi','Akiko','F'],
['Tanaka','Kentaro','M']]

#  CSV形式のファイルを書き込む
with open('data.csv', 'w', newline='') as f: # newline=''これを入れないと一行飛ばしになってしまった
    writer = csv.writer(f, delimiter=',', quotechar='"') # コーテーションを使う特殊な区切りやタブが入っても大丈夫
    for row in namelist:
        writer.writerow(row)
```

`quotechar='"'` 特別な値を含むフィールドを囲むための文字列を一文字で指定します。“が標準的なquotecharです。具体的に囲む際は、“囲む対象の文字“のようにして使用します。

```python
with open('data.csv', 'w', newline='') as f:
    writer = csv.writer(f, delimiter=',', quotechar='"') # コーテーションを使う特殊な区切りやタブが入っても大丈夫
    writer.writerows(namelist)
```

`writer.writerows(namelist)` これでも可能

```python
#  CSV形式のファイルを読み出す
with open('data.csv', 'r') as f:
    reader = csv.reader(f, delimiter=',', quotechar='"')
    namelist = [row for row in reader]

print(namelist)
```

## 参考

https://www.kitakyu-u.ac.jp/news/2022/08/003215.html
Belt drives, ボッシュ自動車handbook 11版(53) p.720

Internal-combustion engines, Belt drives,  ボッシュ自動車handbook 11版(53)


人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642


#  Belt drives(帯駆動)
p.720

## Friction belt drives
## Positive belt drives

# Reference
[1] ISO 9981:2020
Belt drives — Pulleys and V-ribbed belts for the automotive industry — PK profile: Dimensions

https://www.iso.org/standard/70616.html

[2] ISO 9010 p.729
->
ISO 21342:2019
Synchronous belt drives — Automotive belts and pulleys

https://www.iso.org/standard/74775.html

[3] ISO 9011 
->
ISO 21342:2019
Synchronous belt drives — Automotive belts and pulleys

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221024


### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Exhaust emissions,ボッシュ自動車handbook 11版(52) p.716

Internal-combustion engines, Exhaust emissions,,  ボッシュ自動車handbook 11版(52)


人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642


#  Exhaust emissions,
p.716

## Historic measures 
## Constituents of engine exhaust gas
## Basic principles of catalytic exhaust-gas treatment
## Catalytic processes for exhaust-gas treatment

# Reference
[1] ~~https://www.arb.ca.gov/html/brochure/history.htm~~

リンク切れ

https://ww2.arb.ca.gov/about/history


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221024


### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Python機械学習/Anaconda仮想環境のおすすめ作成方法

# Introduction
Pythonで機械学習をする際に，誰もが一度は行うであろうAnaconda仮想環境の作成．
今まで自分はbase環境をクローンして足りないライブラリをインストールする方法をとっていた．
しかしこの方法だと余計なライブラリが入っていたり，後々pipでインストールしたライブラリとcondaでインストールしたものが混在してうまく動かないなどいろいろと不便だった．
そこでライブラリは基本pipで管理できるようシンプルな仮想環境構築方法をまとめる．

# 仮想環境作成
新規作成するときにpythonのバージョンを指定するのがポイント．
2022年10月24時点で3.10が出ているが，新しすぎると対応していないライブラリがあるので個人的には3.8がおすすめ．
```terminal
conda create -n newenv python=3.8
```

# ライブラリのインストール
最初はこのくらいインストールしておけばよいと思う．
ちなみにnumpy,scipyはscikitlearnに，pandas, matplotlibはseabornと一緒に勝手にインストールされる．
```terminal
pip install scikit-learn
pip install seaborn
pip install jupyter
```

# ライブラリの確認
以下のいずれかの方法で確認できる．
```terminal
pip list
pip freeze
conda list
```

# 仮想環境のコピー作成
仮想環境をコピーしたいときは以下の手順で行うとよい．
1.コピー元のライブラリ一覧をtxtファイルに書き出す
※ネットを検索するとpip list freeze > lib_newenv.txtでいけると出てくるが，自分の場合はcertifiというライブラリのバージョン表示がバグっていて，インストール時にエラーが発生した．
```terminal
pip list --format=freeze > lib_newenv.txt
```
2.新しい環境を作成した後，先ほどのtxtファイルを使用してインストール実行．
```terminal
pip install -r lib_newenv.txt
```

# 仮想環境の削除
仮想環境の削除方法も一応載せておく．
※フォルダは残ったままなので手動で削除する．
```terminal
conda remove -n copyenv --all
```

# Conclusion
Anaconda仮想環境のシンプルな作成方法についてまとめた．
当分この方法で作成した仮想環境を使用していくが，Anacondaを使わないvenvなども気になっているので，そちらも使用してみて便利そうであればいずれ紹介しようと思う．
RaspberryPiでGolang（cgo）でNEONを動かす

# RaspberryPiでGolang（cgo）でNEONを動かす
## 動機
raspberry pi コンピュータリソースの最大使用に向けて。

## 機材
Raspberry Pi4 4GB
go version go1.11.6 linux/arm
gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)

## 元プログラム
neonとかについては[こちらから](https://qiita.com/Soleiyu/items/3e80975f00dd700f563b)

```test1.cpp
  1 #include <iostream>
  2 #include <arm_neon.h>
  3 
  4 using namespace std;
  5 
  6 int main () {
  7 
  8   cout << "hoge" << endl;
  9 
 10   int array1[2] = {31, 22};
 11   int array2[2] = {11, 20};
 12   int arrayAns[2];
 13 
 14   int32x2_t v1, v2, vans;
 15   v1 = vld1_s32(array1);
 16   v2 = vld1_s32(array2);
 17   vans = vqadd_s32(v1, v2);
 18 
 19   vst1_s32(arrayAns, vans);
 20 
 21   cout << arrayAns[0] << ", " << arrayAns[1] << endl;    
 22 
 23   return 0;
 24 }
```
```
$ clang++ -o test1 test1.cpp -mfpu=neon -march=armv7-a -O3
$ ./test1
hoge
42, 42
```

## Gonlang プログラム
``` main.go
package main

/*
#include <arm_neon.h>

int sum(int a, int b) {
	return a + b;
}

int sum4(int a, int b, int c, int d) {
	int array1[2] = {a, b};
	int array2[2] = {c, d};
	int arrayAns[2];

	int32x2_t v1, v2, vans;
	v1 = vld1_s32(array1);
	v2 = vld1_s32(array2);
	vans = vqadd_s32(v1, v2);

	vst1_s32(arrayAns, vans);

	return sum(vans[0], vans[1]);
}
*/
// #cgo CFLAGS: -mfpu=neon -march=armv7-a
import "C"

func  main() {
	println("HELLO", C.sum4(1, 2, 3, 4))
}
```

#cgo CFLAGS: -mfpu=neon -march=armv7-a
はコンパイルオプション（gccの）

```
$ go run main.go
HELLO 10
```
【PHP文法】array_reduceとarray_mapの違い

## 背景
Laravelで開発をするときに、配列操作の理解が曖昧なままコードを書いていたので、言語化するために記事を書きます。今回は、中でも特に困ったarray_reduceとarray_mapの使い方について説明します。

## array_map
array_mapは一言で言えば、配列を受け取り、処理を行って新しい配列を返すメソッドです。

#### array_mapの使い方
```php
array_map(関数名, 配列) 
```

#### サンプルコード
```php
// 配列定義
$data = [1, 2, 3, 4, 5];

// 関数定義
function multiple($n){
     return $n * 2;
}

print_r(array_map('multiple', $data));
/* 
    Array (
        [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10
    )
*/
```

## array_reduce
array_reduceは一言で言えば、配列を受け取り1つの値を返すメソッドです。

個人的に**連想配列をキーでグループ化するやり方**の理解に苦しみました。

#### array_reduceの使い方
```php
array_reduce(配列, 関数名, 初期値)
```

下の説明わかりにくいと思いますが、コードを動かしながら1行ずつ読めば理解できると思います。

array_reduceは第1引数の配列の要素数だけ、第２引数の関数が実行されます。
そしてその関数の実行結果が次の関数の第1引数に入ります。
関数の実行が終わると、実行結果が返されます。
※最初に実行される関数の第1引数には、array_reduceの第3引数の値が入ります。

#### サンプルコード(引数同士をかけた計算結果を返す)
```php
$data = [1, 2, 3, 4, 5];

	function multiple( $a, $b ) {
		return $a * $b ;
	}

print_r(array_reduce($data, 'multiple', 1));
// 120
```

グループ化は少し複雑なので、処理の流れを詳しく説明しました。
#### サンプルコード(グループ化)
```php
$countries = [
    ['name' => 'Japan', 'category' => 'Asia'],
    ['name' => 'Korea', 'category' => 'Asia'],
    ['name' => 'USA', 'category' => 'North America'],
    ['name' => 'Belgium', 'category' => 'Europe']
];

	function groupByCategory(array $countries, string $key): array
{
    // $countriesArrayには$countries配列
    // $rowには$countries配列の要素がインデックス順に入る。
    return array_reduce($countries, function (array $countriesArray, array $row) use ($key) {
        $countriesArray[$row[$key]][] = $row;
        return $countriesArray;
    }, []);
}

print_r(groupByCategory($countries, 'category'));

/*
    処理の流れ
    初期値: $countriesArray = []
    実行1回目:
    $countriesArray = [
        'Asia' =>  [
            ['name' => 'Japan', 'category' => 'Asia']
        ]   
    ]
    実行2回目:
    $countriesArray = [
        'Asia' =>  [
            ['name' => 'Japan', 'category' => 'Asia'],
            ['name' => 'Korea', 'category' => 'Asia'],
        ]   
    ]
    実行3回目:
    $countriesArray = [
        'Asia' =>  [
            ['name' => 'Japan', 'category' => 'Asia'],
            ['name' => 'Korea', 'category' => 'Asia'],
        ],
        'North America' => [
            ['name' => 'USA', 'category' => 'North America']
        ]
    ]
*/

/*　
    実行結果:
    Array ( 
        'Asia' => Array ( 
            [0] => Array ( [name] => Japan [category] => Asia )
            [1] => Array ( [name] => Korea [category] => Asia )
        ) 
        'North America' => Array (
            [0] => Array ( [name] => USA [category] => North America ) 
        ) 
        'Europe' => Array ( 
            [0] => Array ( [name] => Belgium [category] => Europe )
        ) 
    )
*/
```

## まとめ
array_reduceとarray_mapを理解する手助けになれば幸いです。

JSのmapは使ったことがあったのでarray_mapの理解は簡単でしたが、array_reduce難しかった、、

課題の細分化の大切さを痛感しました
【Linux】内容に特定の文字列を含むファイルのパスを取得する方法

## `grep`コマンドで取得

`grep`コマンドを使用して内容に特定の文字列を含むファイルのパスを取得するには以下のように実行します。  

```zsh
grep -lr '検索する文字列' 対象のパス
```

* `-l`
一致するものが含まれているファイルのパスのみ表示する。
* `-r`
ディレクトリを指定した場合にサブディレクトリ内のファイルも含めて検索する。

以下のようにファイルを作成し実際に実行してみます。

```zsh
$ tree
.
└── sample
    ├── example.txt
    └── test.txt

$ cat ./sample/example.txt
ABCDE

$ cat ./sample/test.txt
12345

```

```zsh
$ grep -lr '1' ./sample
./sample/test.txt
```

`1`が含まれている`test.txt`のパスが出力されました。

## `find`コマンドで取得

`find`コマンドを使用しても上記と同様のことができます。  
`find`コマンドの場合には以下のようにします。

```zsh
find 対象のパス -type f -exec grep -l '検索する文字列' {} +
```

または以下のようにします。

```zsh
find 対象のパス -type f | xargs grep -l '検索する文字列'
```

```zsh
$ find . -type f -exec grep -l '1' {} +
./sample/test.txt

$ find . -type f | xargs grep -l '1'
./sample/test.txt
```

`find`コマンドでも`1`を含むファイルのパスが取得できました。
行き当たりばったり学習 ～SQLServer構築編(Windows)～

皆さんこんにちは！

医療業界から IT にチャレンジして2年目のharuです。
本日は、SQLServer のインストールを行っていきます！

## 公式からインストールをダウンロード
[公式ページ](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads)からインストーラーをダウンロードします。

## インストーラーを実行
**1.今回は基本を選択します**
![構築1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/f16c8e76-0863-9be2-08f0-c50780781651.png)

**2.同意するをクリック**
![構築2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/b6fcb02f-95ff-4126-68b7-399174c2f696.png)

**3.インストール場所を決定し、インストールを実行**
![構築3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/e4b30f44-abc9-149e-5bcc-6b57dbc2d736.png)

![構築4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/5f298abf-8c40-7be0-ebb0-0fad6a279395.png)

**4.インストール完了**
![構築5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/ed790128-4c5b-db4c-0da3-10faedc264d9.png)

「今すぐ接続」をクリックすると正常にインストールされたことがわかります。
![構築6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/4f6a8e3e-3b7f-6105-ae61-52fc10de3836.png)

SQLServer のインストールは簡単で一瞬ですね。

今回は以上です。
次回は Microsoft SQL Server Management Studio を使用したクライアント接続の構築を行っていきます。

ではまた！
Gitでソースコード取得

`ubuntu2204LTS`

gitコマンドを暗記では無く、実際に使用して覚えたかったので、gitのトークン認証の方法について記載します。

その前にssh認証の設定をしていたのですが、

```
~/test-git$ git push testgit
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
```
去年から使えなくなっていたので、トークン認証を出来るようにします。

## トークン認証
GitHubのサイトで作業します。以下の方のGUI操作の記事を参考にさせていただきました。
https://ios-docs.dev/20210813support-for-password/
作成したトークンはスクショなり、コピーを忘れずにすること。


## CLI操作

前回まで使っていたリモートリポジトリ`testgit`排除
```
~/test-git$ git remote remove testgit
```
続けてトークン認証用のurl追加
```
~/test-git$ git remote add origin https://トークンurlコピー@github.com/ユーザー/リポジトリ.git
```
登録されたリポジトリ確認
```
~/test-git$ git remote -v
origin	https://github.com/settings/tokens/トークンurl@github.com/ユーザー/リポジトリ.git (fetch)
origin	https://github.com/settings/tokens/トークンurl@github.com/ユーザー/リポジトリ.git (push)
```

これでGitコマンドを使って、ソースの習得が出来るようになります。
フレッツ光クロスをIPoEで契約し、レンタルルーターだけでIPv4の固定IPサービスを利用できるのか

### 結論
できる（利用中）

### 筆者の契約内容

- 回線事業者：フレッツ光クロス（NTT東日本・マンション）
- ルーター/HGW： XG-100NE(NTTよりレンタル)
- プロバイダ：オープンサーキット v6Direct-X 固定IP1
https://www.open-circuit.ne.jp/isp/v6direct-ip1.html

### 観点
- プロバイダが明示的にフレッツ光クロス(IPoE接続)に対応している旨の記載があること
https://flets.com/cross/isp.html で確認できる
- プロバイダが「v6プラス 固定IP」の提供を行っていること
契約後にHGWにインストールされる「IPv4設定」アプリから設定可能

### 他に実現できそうなプロバイダ
#### 明示されている/利用中
- オープンサーキット(https://www.open-circuit.ne.jp/)
- シグナルネットワーク(https://signalnetwork.jp/)

#### 分からない（できそう）
- 21Company(http://21ip.jp/)
「フレッツ光 固定IP1本 IPv4 光クロス対応」というサービスからできそう
もし使えるなら圧倒的に安い
- CyberBB(https://cyberbb.com/)
検索結果から行くと「光クロス＋IPv4固定IP」というメニューがあったが、
2022/10時点でトップページに行くとその表記がなくなっている

### v6プラス以外の方式は？
知らない
Charge cycle and supercharging, ボッシュ自動車handbook 11版(50) p.664

Internal-combustion engines,  Mixture formation, combustion, emissions,  ボッシュ自動車handbook 11版(48)


人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642


# Charge cycle and supercharging(充電周期と過給)
p.664

## Charge cycle
## Variable valve timing
## Supercharging processes
## Exhaust-gas recirculation


# Reference

[1] DIN 1940 1976
Verbrennungsmotoren; Hubkolbenmotoren, Begriffe, Formelzeichen, Einheiten



# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221024
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Mixture formation, combustion, emissions, ボッシュ自動車handbook 11版(49) p.646

Internal-combustion engines,  Mixture formation, combustion, emissions,  ボッシュ自動車handbook 11版(49)


人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642


#  Mixture formation, combustion, emissions(混合気形成, 燃焼、排ガス）

p.646
## Gasoline engine
## Diesel engine
## Mixed forms and alternative operating strategies


# Reference

[1] H. Oertel, M. Bohie, U. Dohrmann, Stromungsmechanik, 5th Ed., Vieweg Teubner, 2008

2015 version
https://link.springer.com/book/10.1007/978-3-658-07786-0

Herbert Oertel jr., Martin Böhle, Thomas Reviol

[2] R. van Basshuysen, F Schafer (Editors) Handbuch Verbrennungsmotor, 4th Ed. Vieweg Taubret, 2007

2017 version
https://link.springer.com/book/10.1007/978-3-658-10902-8

[3] K. Boulouchos, Strategies for Future Combustion Systems, Homogeneous or Stratified change ? SAE 2000-1-0650 

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221024

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
AWS Lambda(Python)にてジオコーディングの一つであるGeoHash(ジオハッシュ)を扱う

# 本記事の内容

- AWSが提供するLambda(Python)にて、経緯度に基づくジオコーディング方法の一つであるGeoHash(ジオハッシュ)を扱う方法を記載した記事です。
- PythonベースのLambdaにてGeohashを扱う記事があまりなかったため、ライブラリーをLambdaに組み込み利用する方法をまとめました。

# 実施環境
- Windows 10
- Chrome
- AWS

# 説明の流れ
1. ジオハッシュライブラリーのダウンロード
2. Lambdaデプロイ用のzipファイル作成
3. Lambdaでの動作確認

## 1. ジオハッシュライブラリーのダウンロード

PythonのGeoHashライブラリーは、[ここ](https://pypi.org/project/python-geohash/#files)からダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/0af2b50b-a1fe-21db-4f52-cdab1bd503c0.png)

ダウンロードしたファイル「python-geohash-0.8.5.tar.gz」を解凍すると以下のようなファイルが入っていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/4220fe33-2712-6b0a-bc0d-f18a7f95d50a.png)

READMEファイル内の赤字を読むと、「geohash.py」をプログラムにコピーすることでGeohashが利用できることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/345d4b2f-3dc4-808b-1bfa-deeeeb40a783.png)


## 2. Lambdaデプロイ用のzipファイル作成

Lambdaへのプログラムのデプロイは、AWSのマネジメントコンソールを利用することにしたためZipファイル化しておく必要がある。

以下のようLambdaで実行するプログラム(lambda_function.py)とgeohashのライプラリー(geohash.py)を横並びに置いた状態で圧縮しZipファイルにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/a1432b96-c2dd-a7d7-89df-ecf5988e82ed.png)

以下のlambda_function.zipファイルをアップロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/447f5283-c62a-7ffb-71e5-43f2cb1ad67e.png)

実際のプログラムは以下の内容とする。

```lambda_function.py
import geohash

def lambda_handler(event, context):
  #東京駅をgeohashの精度9でエンコードする
  geo_hash_value = geohash.encode(35.68158476986499, 139.76717844242972,9)
  print(geo_hash_value)  
  
  return {
    'statusCode': 200
  }
```

こちらのサンプルコードでは、東京駅の位置情報をGeoHashにエンコードしている。
東京駅　緯度:35.68158476986499/経度:139.76717844242972
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/41bb48f4-dc9d-592c-0d13-599c93d430b6.png)


## 3. Lambdaでの動作確認

実際にLambdaでテスト実行すると以下のような結果が出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/cd11c232-5a4a-ed0b-fe97-77b45768a921.png)

9桁の値「xn76urxk7」が東京駅の緯度経度を精度9でエンコードしたGeoHashの値です。

この値を活用することでGeoHashによる位置の比較ができます。
Geohashの使い方は「[位置情報データの扱い方（ジオハッシュとか）](https://qiita.com/yabooun/items/da59e47d61ddff141f0c)」や「[位置情報を保存しよう（後編）](https://gihyo.jp/dev/feature/01/location-based-services/0006)」が参考になりますので、合わせてご確認ください。

本記事は以上です。
何かの手助けになれば嬉しいです。

# 参考文献
本記事の作成に当たり、以下の情報も参考にさせて頂きました。ありがとうございました。
- [位置情報データの扱い方（ジオハッシュとか）](https://qiita.com/yabooun/items/da59e47d61ddff141f0c)
- [位置情報を保存しよう（後編）](https://gihyo.jp/dev/feature/01/location-based-services/0006)
【JS】複数のオブジェクトを持つ配列を、特定の要素の昇順に並び替える 

タイトルの通りですが、以下の配列を`score`の値の昇順に並び替えています。

```js
let arr = [
  {name: "John", score: 80},
  {name: "Mike", score: 60},
  {name: "Beth", score: 70}
];


let sorted  = arr.sort(function(a, b) {
  return a.score - b.score;
});
```

注意ですが、配列の中に複数のオブジェクトがある形の場合のみ、今回の方法でソートできます。


オブジェクトの中に複数オブジェクトがあり、それを並べ替えたい場合はほんの少しやり方が変わります。
基本情報技術者試験の勉強方法

# 目次
* [はじめに](#はじめに)
* [基本情報技術者試験](#基本情報技術者試験の概要について)
* [私の受験結果](#私の受験結果)
* [勉強方法について](#勉強方法について)
* [紹介した勉強方法の概要](#紹介した勉強方法の概要)
* [なかなか勉強の効果が上がらない人へ、、、](#なかなか勉強の効果が上がらない人へ、、、)
* [まとめ](#まとめ)

# はじめに
どうもタイピーです！
今回は、基本情報技術者試験の勉強方法について書く。基本情報技術者はエンジニアの登竜門と呼ばれている資格でもあり、毎年約10万人の人が受けて、20％くらいの合格率だ。
私もそうだが、皆さん、お忙しいと思う。社会人の方なら仕事の合間や仕事の後に勉強をすることになるだろう。大学生の方は、授業、アルバイト、サークルなどなどの合間に勉強することになるだろう。
**そう、みんな忙しいのだ！！**
だから、**短時間で、かつ効率がいい方法を知りたい思う。私も知りたかった。**
そこで本記事では、**短期間で、なおかつ効率よく勉強する方法について書く。**

# 基本情報技術者試験の概要について
基本情報者技術者試験ドットコムによれば、

>基本情報技術者とは、「情報処理の促進に関する法律第29条第1項」に基づいて経済産業大臣が行う国家試験「情報処理技術者試験」の区分の一つです。
>対象者像として「高度IT人材となるために必要な基本的知識・技能を持ち、実践的な活用能力を身に付けた者」というように試験要綱には記載されています。

詳しく知りたい人は次の2つのサイトを参考にしてね！
* [情報処理推進機構](https://www.ipa.go.jp/index.html)
* [基本情報者技術試験ドットコム](https://www.fe-siken.com/feis.html)　**←こっちがおすすめ！！**

# 私の受験結果
| 科目 | 得点 | 合格基準 | 合否 |
|:------------:|:------------:|:------------:|:------------:|
| 午前試験 | 61点 |60点以上|合格|
| 午後試験 | 66点 |60点以上|合格|

結構ぎりぎりでしたが、**今日紹介する方法で無事合格**できました！

# 勉強方法について
これが本当にすごい！このやり方でやったら本当にできるようになるし、そうなった！（実体験！！）
知りたい人は下のリンクから記事を参考にしてね！
* [IT知識０から1ヶ月で基本情報技術者試験に合格した話](https://qiita.com/yusuke_blog1026/items/d6b079fa026ce6776773)

# 紹介した勉強方法の概要
まずは、**午前試験と午後試験に分ける。**
* **解けるようになる（70点以上）まで繰り返す。**
    * **過去問5年分用意する。**
        * 基本情報技術者試験ドットコムにアクセスしてね！
        * 無料で過去問を解くことが出来るよ
    * **最新のやつから問題を解く**
    * **答え合わせをする。**
        * 個人的には午前試験はその場で答え合わせと解説を読み込むのがおすすめ
        * 午後試験も答え合わせと解説をセットにしたほうがいい
        * 理由は、時間がたって間違った答えを覚える心配がないこと
    * **本当にわからない問題は解説、または参考書で確認する**

# なかなか勉強の効果が上がらない人へ、、、
勉強の成果がなかなか上がらなかったら**やり方が間違っているかもしれない。**
実は、**成果が出る勉強方法は心理学の発達でもうほぼ分かっている。** それを学ぶには次の本がおすすめだ。**読みやすいのはメンタリストDaiGoさんの方だ。** 少し**専門的でも構わなければ、「学び方の学び方」がおすすめだ**。


https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E3%81%AE%E6%99%82%E9%96%93%E3%81%A7%E6%9C%80%E5%A4%A7%E3%81%AE%E6%88%90%E6%9E%9C%E3%82%92%E6%89%8B%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B-%E8%B6%85%E5%8A%B9%E7%8E%87%E5%8B%89%E5%BC%B7%E6%B3%95-%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%82%B9%E3%83%88DaiGo/dp/4054066895

https://www.amazon.co.jp/%E5%AD%A6%E3%81%B3%E6%96%B9%E3%81%AE%E5%AD%A6%E3%81%B3%E6%96%B9-%E3%83%90%E3%83%BC%E3%83%90%E3%83%A9%E3%83%BB%E3%82%AA%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%BC/dp/4866430885/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3MBFCWFNKDS74&keywords=%E5%AD%A6%E3%81%B3%E6%96%B9%E3%81%AE%E5%AD%A6%E3%81%B3%E6%96%B9&qid=1666600093&qu=eyJxc2MiOiIxLjI3IiwicXNhIjoiMC43MSIsInFzcCI6IjAuNzkifQ%3D%3D&s=books&sprefix=%E5%AD%A6%E3%81%B3%E6%96%B9%E3%81%AE%E5%AD%A6%E3%81%B3%E6%96%B9%2Cstripbooks%2C204&sr=1-1

# まとめ
基本情報技術者試験の勉強方法について書いた！
今回紹介した記事に本当に効果的な勉強方法がまとまっているので是非みんなにしってほしい！なので、拡散希望ですm(_ _)m
【Rails】redirect_toを使うとき、flash.nowは表示されないよという話

# どうした？
Sessionsコントローラでログイン機能を実装したところ、`flash.now`が表示されなかった。
minitestのログインテストでは
```ruby
assert !flash.empty?
```
は`true`を返していた。

## 開発環境
```terminal
$ ruby -v
=> ruby 3.1.2p20

$ rails -v
=> Rails 6.1.7
```

# 解決方法

**before**
```ruby:sessions_controller.rb
def create
  @user = User.find_by(email: params[:session][:email])
  if @user && @user.authenticate(params[:session][:password])
    log_in(@user)
    remember(@user)
    flash.now[:info] = "ログインしました"
    redirect_to root_path
  else
    flash.now[:notice] = "パスワードが間違っているか、存在しないユーザーです"
    @email = params[:email]
    render "new"
  end
end
```

↓↓↓↓↓↓↓↓↓↓↓

**after**
```ruby:sessions_controller.rb
def create
  @user = User.find_by(email: params[:session][:email])
  if @user && @user.authenticate(params[:session][:password])
    log_in(@user)
    remember(@user)
    flash[:info] = "ログインしました" #.nowを削除
    redirect_to root_path
  else
    flash.now[:notice] = "パスワードが間違っているか、存在しないユーザーです" #.nowは消さない
    @email = params[:email]
    render "new"
  end
end
```

これでフラッシュメッセージが表示されます。

# 解説

こちらの記事がとっても分かりやすかったです。

https://note.com/kentarotawara/n/ndf31b55fea4f

今回の例でいうと、ログイン成功時(if文の中身)は`redirect_to`で**homeコントローラをまたいで**`root_path`にページ遷移するため、この時点で既に`flash`の寿命は終えているのです。

対してelse文では`render`を使用しており、ページ遷移先で`flash`の寿命を終えさせたいので、`flash.now`を使用する必要があるのです。


# まとめ
`flash.now`を知ったとき、その便利さに「常にこれでいいじゃん」と思ってしまいました。
しかし、物事には適切な使用方法というものがあるもので、、

`flash.now`を**使うべきシーン**を紹介する記事はたくさんありますが、今回はその便利さに盲目になってしまった男が`flash.now`を**使ってはいけないシーン**を紹介しました。
【SwiftUI】DisclosureGroupを使ってみた

# はじめに
iOS14で追加された`DisclosureGroup`を初めて触ってみたので記録しておきます。

# どんな動きをするものなの？
![Simulator Screen Recording - iPhone 14 Pro - 2022-10-24 at 19.09.35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/72226f8f-0ba4-fa41-3b1a-fd419737240e.gif)

# 実装
`DisclosureGroup`でネストしていく感じですね。
とてもわかりやすいです。
```swift
import SwiftUI

struct ContentView: View {
    @State var sliderValue: CGFloat = 50.0
    var body: some View {
        List {
            DisclosureGroup("メニュー") {
                DisclosureGroup("朝ごはん") {
                    Text("納豆ごはん")
                    Text("味噌汁")
                    Text("焼き魚")
                }
                DisclosureGroup("昼ごはん") {
                    Text("ラーメン")
                }
                DisclosureGroup("夜ごはん") {
                    Text("白米")
                    Text("チキンソテー")
                    Text("トマトスープ")
                    Text("キャベツのサラダ")
                }
            }
        }
    }
}
```

### コードで開閉する
`isExpanded`を使用することでコードで開閉ができる
```swift
DisclosureGroup("メニュー", isExpanded: $isShow) {
    Text("")
}
```

# おわり
いままで1回も使ったことがなかったので今回触れることができてよかったです。


でもこれあんまり使いどころないよな。。。
windows11に最低限のvim環境を整える

# はじめに
私物のmacbookがお釈迦になったので、ゲーム用で使用していたwindowsに開発環境を構築しようと思いましたが、
なんか色々面倒な気がしたので、dockerにしようと思った次第です
この記事は前編で続きは[後編](https://qiita.com/TekkaMK/items/fa4a70ea5055499b26ab)に続きます

# Windows Terminal で vim を使用できるようにする
Windows Terminal（以下WT）でviとやっても何も置きなかったのでどうやらインストールしないといけないようだ

## インストール
```
$ winget install --id vim.vim
```

上記のコマンドでvimが入ります。
なぜid指定をするのかというと、どうやら **vim cheat sheet** というものがあるらしく、
普通に `winget install vim` だと候補が一杯あって分からないと言われました

## パスを通す
まずmacで言うところの`.bash_profile`のようなファイルを探します

```
# 以下のコマンドで場所がわかります（表示されるファイルパスは人それぞれ違うのでこれを丸コピは危険です）
> $profile
=> C:\Users\{user_name}\OneDrive\ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
```
表示されたパスにファイルがまだ存在していない場合は↑の通りでファイルを新規作成してください
そして↓を記載してパスを通します
```
set-alias vi 'C:\Program Files\Vim\vim90\vim.exe'
set-alias vim 'C:\Program Files\Vim\vim90\vim.exe'
```
__※90の部分はバージョンのため、インストールしたタイミング次第だと思うので自分のインストールしたファイルを見て確認してください__

## terminalにファイルの実行権限を付与します
__管理者権限__ でWTを起動して↓のコマンド2つ実行する
```
> set-executionpolicy remotesigned
> get-executionpolicy
RemoteSigned ←とターミナルに表示されればOKです
```

## バックスペース効かない問題
vimを使用中にバックスペースが効かなくなったら↓を.vimrcに記載してください
.vimrcを配置する場所ですが、基本的には **ホームディレクトリ** でOKです
```
set backspace=indent,eol,start
```

## クリップボードにコピー出来ない問題
ヤンクしてもコピペ出来ない場合は↓を.vimrcに記載してください（基本的には上のやつでいいらしいですが、自分は下じゃないとダメでした）
```
set clipboard=unnamedplus
set clipboard=unnamed
```

ここまで出来ればそれなりにvimが使えるようになったはず
[後編](https://qiita.com/TekkaMK/items/fa4a70ea5055499b26ab)ではdockerの導入からvue/cliのインストールまでやります
それではまた
ローカル開発のためのSAMLのIdPサーバーを雑に立てる

## 背景
SAML連携をするアプリケーションの開発が必要になり、ローカル環境でどうやってログインすりゃええんやとなった。
(流石に本番のIdPに繋げるわけにはいかず)

そうやって調べるとPHPでできた [SimpleSAMLphp](https://simplesamlphp.org/) に行き当たる。
とはいえPHP詳しくない私からするとどうやって立ち上げるんじゃ(パラメータ多い、、、)状態。(読めばわかるがめんどい、、、)

そうしたところ素敵なDocker imageを公開してくださっている方を発見。(ありがてぇ)

https://hub.docker.com/r/kenchan0130/simplesamlphp

とはいえ開発のたびに毎回立ち上げたり、他メンバーにこれを共有するのも面倒。。
(事情としてエンジニア外の方にこのシステム触って簡単な修正を体験してもらおうという勉強会をしようと思っており、エンジニア外の方にここら辺のセットアップしてもらうのもなぁという印象がありました、、)

## やったこと
* 上のDockerimageをcopilotの最小構成でECS Fargate上で動かす(spotでお金もなるべくケチケチ)
  * 安さとメンテしたくないを優先

`AWS_PROFILE={your profile} copilot deploy` してもらえれば良きになると思う(`copilot init` が必要かも知れない、、？)

https://github.com/tatematsu-k/saml_sample

ここら辺の環境変数は適宜変更して使ってください。(使う場合)

https://github.com/tatematsu-k/saml_sample/blob/69a6e115aa0766f9e7534b8817b3da4457e8553a/copilot/web/manifest.yml#L29-L31

## 結果
ALBのドメインにアクセスすると管理画面が表示される。

![スクリーンショット 2022-10-24 18.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280595/9eda9b5c-3e89-658c-47e2-40ea81eb2814.png)

#### 認証ユーザー
##### 管理画面ユーザー(SimpleSAMLphpの管理画面用)

| Username | Password |
| --- | --- |
| admin | secret |

##### SAML認証の時のユーザー
| Username | Password |
| --- | --- |
| user1 | password |
| user2 | password |


SAML連携で必要な情報は「連携」タブから確認できました。(メタ情報は心の目で読んでなんとかしましたが、SAMLとしてそれが正解なのか分からないのでrubyでやる場合これでできましたは別記事で上げようかなと思います)
Google Colabolatoryのハロウィンモード？

久しぶりに開いたら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331144/5db1c91f-fa24-dfdd-fdcd-5cb9d3b6a840.png)
なんだか、猫ちゃんやコーギーちゃんたちが仮装していました。:relaxed:

猫ちゃんたちを出すには、右上歯車アイコンで設定を開き、その他から、
コーギーモード、猫モード、カニモードなどを選びます。
パワーレベルも設定すると面白いです。(タイピングしずらいですが)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331144/e491d0db-d6a6-ea0e-19c0-2c6a99dde9b9.png)
entで作成日時と更新日時のフィールドにはmixin.Timeを使うといいかも

ビルトインで用意されている簡単なやつだけど `create_time` と `update_time` くらいだけでよければ便利。

ミクスインしてやればいいだけなので楽。
```go
func (User) Mixin() []ent.Mixin {
	return []ent.Mixin{
		mixin.Time{},
	}
}
```
実装は以下のような感じっぽい。
```go
// CreateTime adds created at time field.
type CreateTime struct{ Schema }

// Fields of the create time mixin.
func (CreateTime) Fields() []ent.Field {
	return []ent.Field{
		field.Time("create_time").
			Default(time.Now).
			Immutable(),
	}
}

// create time mixin must implement `Mixin` interface.
var _ ent.Mixin = (*CreateTime)(nil)

// UpdateTime adds updated at time field.
type UpdateTime struct{ Schema }

// Fields of the update time mixin.
func (UpdateTime) Fields() []ent.Field {
	return []ent.Field{
		field.Time("update_time").
			Default(time.Now).
			UpdateDefault(time.Now),
	}
}

// update time mixin must implement `Mixin` interface.
var _ ent.Mixin = (*UpdateTime)(nil)

// Time composes create/update time mixin.
type Time struct{ Schema }

// Fields of the time mixin.
func (Time) Fields() []ent.Field {
	return append(
		CreateTime{}.Fields(),
		UpdateTime{}.Fields()...,
	)
}

// time mixin must implement `Mixin` interface.
var _ ent.Mixin = (*Time)(nil)
```
`CreateTime`と`UpdateTime`でそれぞれ別個にも使える。
開発環境の構築（VirtualBox + Vagrant + Homestead + Composer）で発生したエラー集

## 前提
OS：Windows10　64bit
PHP：7.3
VirtualBox：6.1.38
Vagrant：2.2.6

どうも。Qiita初投稿のPHP初心者エンジニアです。
先日環境構築を行ったのですが、Homestead？ Composer？となりながら進めてだいぶ時間を費やしました。
備忘録がてらタイトルにある通り、途中ではまったエラーを載せていくので誰かの参考になればうれしいです。

## 目次
第1章 Composer installでエラーが発生した場合
第2章 502：Bad GateWayが発生した場合

## 第1章 Composer install

まずcomposerとはPHPのパッケージ管理システムです。
開発にはさまざまなライブラリが必要になってきますが、公式サイトにアクセスしzipファイルをダウンロードしローカルに展開することが求められ、何を使用するかは個人の裁量に依存しがちです。
パッケージ管理システムはそれらを個人の裁量に依存せずに導入できる仕組みを提供します。

ぜひ欲しいですよね。さっそくインストールをしましょう。
```rb
Composer install
```

```rb
$ php -d allow_url_fopen=1 /usr/bin/composer install
PHP Fatal error:  Class UpdateHelper\ComposerPlugin contains 2 \ methods and must therefore be declared abstract or implement the remaining methods (Composer\Plugin\PluginInterface::deactivate, Composer\Plugin\PluginInterface::uninstall) in /var/www/html/vendor/kylekatarnls/update-helper/src/UpdateHelper/ComposerPlugin.php on line 11

Fatal error: Class UpdateHelper\ComposerPlugin contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Composer\Plugin\PluginInterface::deactivate, Composer\Plugin\PluginInterface::uninstall) in /var/www/html/vendor/kylekatarnls/update-helper/src/UpdateHelper/ComposerPlugin.php on line 11
```

こうなる訳です。
どうやらcomposer1.x系でself-updateをするとうまくいくよう。

```rb
composer self-update --1
```

これで再度composer installをしたところ、エラー解消しました。


## 第2章 502：Bad GateWayが発生した場合

どうすればいいんだろう…
もはや何を確認すればいいかもわかりません。ってなっている方いると思います。
PHPのバージョンを確認してみてください。システムで使用しているものとは異なっているかもしれません。
```rb
php -v
```
想定しているバージョンでなければ以下のコマンドを実施してください。
※自身の環境に合わせて数値は変えてください。
PHPのバージョンを確認してみてください。システムで使用しているものとは異なっているかもしれません。
```rb
php73
```
もう一度「php -v」をたたいて想定通りのバージョンが動作していることを確認してください。

まだだめ？
php-fpmのバージョンのバージョンを確認してみましょう。
```rb
ps -ef | grep php-fpm
```
先ほど変更したPHPのバージョンと異なっていたらに合わせてあげましょう。
```rb
sudo /etc/init.d/php7.3-fpm start
```
もう一度「ps -ef | grep php-fpm」をたたいて想定通りのバージョンが動作していることを確認してください。
想定通りのバージョンが動作していればもうエラーは解消しているはずですが…

:::note warn
ここで終わってはいけません！！！
:::

仮想環境を立ち上げなおしたらphp-fpmのバージョンが戻っているではありませんか…
変更を保持してはくれないようです…

Vagrantfileに以下の記載を追加すると仮想環境を起動する際にphp-fpmのバージョンを指定できるようです。
```rb
config.vm.provision "shell",
    run: "always",
    inline: "sudo /etc/init.d/php7.3-fpm start"
```

これで安心です。

今回はぼくが環境構築の際にはまったエラーと対策をご紹介させていただきました。
確認点がわかっていれば一瞬で解決することでもよくわからずググっていると1,2時間平気で経っているのでちょっとでもお役に立てれば幸いです。





#### 参考サイト
https://qiita.com/atwata/items/d6f1cf95ce96ebe58010
https://qiita.com/akagane99/items/5b1a781481456d1d6b10
秋月で¥320でAVR ISP書き込み機を作る

AVRに関してはまだ初心者なので間違った記述もあるかもしれないです
¥4000くらいする正規品のArduino UNOにずっと書き込み機してもらっているのも申し訳ないなと
制作にあたって何らかのISP書き込み機が必要です


# AVR ISP ?
Arduinoでは意識しないが生のAVRにプログラム等を焼くには普通は書き込み機が必要でそれがISP
- 公式が出してる書き込み機、
- Arduinoにスケッチを書き込んで機能するArduino ISP、
- tinyAVRを使って作るUSBtiny系
    - tiny2313を使う[USBtinyISP](https://learn.adafruit.com/usbtinyisp)
    - tiny45を使う多機能な[Little Wire](https://littlewire.github.io)
    - tiny44を使う[FabISP](https://fab.cba.mit.edu/classes/863.16/doc/tutorials/fabisp_programming/)
- FTDIのシリアル変換チップのbitbang

いろいろと種類があるが、今回はATTiny85の代打にすることを目的に買ったATTiny44が手元にあったのでこれを使ったUSBtiny系のFabISPを作る
ATTiny85(45も)で「Little Wire」を作る手もあったがリセットピンのfuseを焼く勇気がなかったのでこちらは見送ることにした

制作にあたってこちらを参考にさせていただいた

https://fabacademy.org/2019/labs/kamakura/students/kae-nagano/assignments/week05/

MITのFabLabという活動の一環のよう

# 作る
## 部品リスト
- [USB A オス](https://akizukidenshi.com/catalog/g/gC-02236/) ¥50
- [E基板](https://akizukidenshi.com/catalog/g/gP-12725/) ¥25
- [ATTiny](https://akizukidenshi.com/catalog/g/gI-16466/) ¥190
- [3.3v ツェナーダイオード](https://akizukidenshi.com/catalog/g/gI-06451/) ¥5 x2
- [DIP14 ソケット](https://akizukidenshi.com/catalog/g/gP-00006/) ¥10
- [20MHz セラミック発振子](https://akizukidenshi.com/catalog/g/gP-08696/) ¥10
- 抵抗 47Ω x2, 1.5kΩ x1 ¥3
- ピンソケット 8穴分 ¥15

合計 ¥313
## 回路
![39449EFB-9910-4003-BC1B-816269879A05.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479627/72abc671-2eb8-f0c2-fb17-bc27390e4993.jpeg)
ダンピング抵抗とパスコンの値は手持ちにあったというだけです
セラミック発振子は一応極性があるらしく、データシートをよく確認したほうがいいです
ジャンパはt44にプログラムを書き込むときに閉じて普段は開けた状態で使いますので適当でも大丈夫
![基板表面0](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479627/bb3998b0-233a-079b-56bc-16ea0ed8d431.jpeg)
t44のUSB側の抵抗とツェナーは前作ったDigispark互換と同じなのでいつもの限界実装

![基板表面1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479627/f928e2ee-7e70-c3b5-0e3b-c5bdf5eaa8bf.jpeg)
![基板裏面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479627/0b347fd6-be14-754d-0b9b-78ba0c8d6ca6.jpeg)

## ファームウェア
[ファームウェアをダウンロード](https://github.com/Academany/FabAcademany-Resources/blob/master/files/firmware_44.zip)~~してビルド~~する

~~今回はwindows11のubuntu wslでビルドした~~
~~windows側はavrdudeを、ubuntu側は事前にavr-gccとmakeをインストールしてある~~
~~していない場合は~~

```
scoop install avrdude
wsl apt install gcc-avr avr-libc
```



~~zipを解凍したらMakeFileのあるディレクトリまで進んで右クリックからターミナルを開いて~~

```
wsl make hex
```
~~参考元ではMakeFileを編集しているが今回はwslでビルドしてwindowsで書き込むので必要ない~~

~~ビルドができたら書き込み用のジャンパを適当な線で繋いだら手持ちのISPを同じ名前のピン同士で繋ぐ
今回はArduino ISPを使った~~

main.hex~~ができるのでこれ~~をヒューズと一緒に書き込む
```
avrdude -p t44 -c arduino -P COM1 -U hfuse:w:0xdf:m -U lfuse:w:0xff:m -U efuse:w:0xff:m -U flash:w:main.hex:i
```

## ドライバのインストール(windowsのみ)
[AdafruitのGitHub](https://github.com/adafruit/Adafruit_Windows_Drivers/releases/tag/2.5.0.0)からexeをダウンロードする
開くと何をインストールするか聞かれるのでUSBtinyが書かれているチェックボックス(2番目)のみ残してチェックを外してインストールする

# 使い方
USBtinyはCOMポートとして認識されない
恐らくmicronucleusと同じ感じ
Arduino IDEからなら書き込み装置にUSBtinyの項目があるはず
avrdudeなら-cオプションにusbtinyを入れればok
-Pにポートを指定する必要はない

# おしまい
Fサイズ基板に収まらなかったのが少々悔しい
がそれでもArduino UNOよりずっと小さいので
しばらく筆箱につっこんでおきたい
R: 指数分布の関数の描画

こちらのページを参考にしました。
[Exponential Distribution in R Programming – dexp(), pexp(), qexp(), and rexp() Functions](https://www.geeksforgeeks.org/exponential-distribution-in-r-programming-dexp-pexp-qexp-and-rexp-functions/)

## dexp

```R:dexp.R
write("*** 開始 ***", stderr())
x_dexp <- seq(0,1, by=0.02)
x_dexp
y_dexp <- dexp(x_dexp, rate =5)
png("./dexp.png", height = 1000, width = 1000, res = 216)
plot (y_dexp, main="dexp")
lines(y_dexp)
write("*** 終了 ***", stderr())
```

プログラムの実行

```bash
Rscript dexp.R
```

![dexp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6556f98d-3a59-339e-6633-bf6987063d9e.png)

## pexp

```R:pexp.R
write("*** 開始 ***", stderr())
x_pexp <- seq(0,1, by=0.02)
x_pexp
y_pexp <- pexp(x_pexp, rate =5)
png("./pexp.png", height = 1000, width = 1000, res = 216)
plot (y_pexp, main="pexp")
lines(y_pexp)
write("*** 終了 ***", stderr())
```

プログラムの実行

```bash
Rscript pexp.R
```

![pexp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f07410ba-8974-21c9-e665-8295b96abe16.png)

## qexp

```R:qexp.R
write("*** 開始 ***", stderr())
x_qexp <- seq(0,1, by=0.02)
x_qexp
y_qexp <- qexp(x_qexp, rate =5)
png("./qexp.png", height = 1000, width = 1000, res = 216)
plot (y_qexp, main="qexp")
lines(y_qexp)
write("*** 終了 ***", stderr())
```

プログラムの実行

```bash
Rscript qexp.R
```

![qexp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/23ab8f1d-30fb-f7ff-76ca-6e9f0077759b.png)

## 画像を連続に表示する方法

```bash
eog ./
```
viteを用いたmswの設定。

# はじめに
vite×react環境でmswを[Getting Started](https://mswjs.io/docs/getting-started)通りに設定したときworkerの設定で動かない部分がありました。[mswをreactのentryファイルに設定する部分](https://mswjs.io/docs/getting-started/integrate/browser#start-worker)です。この記事ではこれを解決する方法を示します。

# コードと原因
mswに書かれているviteでは動かないコードはこちらです。
```tsx
// src/index.js
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'

if (process.env.NODE_ENV === 'development') {
  const { worker } = require('./mocks/browser')
  worker.start()
}

ReactDOM.render(<App />, document.getElementById('root'))
```
viteでは`src/index.js`ではなく、`src/main.tsx`に同様のコードが書かれています。さらに、これはreact18より前の書き方なのでそこら辺はよしなに読み取ってください(今回のとは直接関係ないです)。このコードは開発環境であれば`./mocks/browser`に定義されたworkerを取得してそれを起動するコードです。これによって開発環境においてのみ定義されたapiのmockを利用できます。
本題となる箇所ですが、
```ts
const { worker } = require('./mocks/browser')
```
です。vite環境では、`require`が定義されていないので`Uncaught ReferenceError: require is not defined`となります。`require`ができないのは`require`がCommonJSの仕様であるからで、viteの開発環境ではNative ESMを利用することから動作しないのだと考えられます。

# 解決策1(簡単)
if節ではなく外でesmのインポートをします。これが一番簡単な修正です。

```tsx
// src/main.tsx
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import { worker } = from './mocks/browser'

if (import.meta.env.DEV) {
  worker.start()
}

ReactDOM.render(<App />, document.getElementById('root'))
```
変更箇所は`process.env.NODE_ENV === 'development'`が`import.meta.env.DEV`となったところと、`require`でインポートしていたところからファイルの先頭でesmの(`import...from...`のような)インポートするようになったところです。
前者はviteの正しい環境判定法はこちらなので修正しておきました。
後者が本題です。問題の原因は`require`を使ったインポートなのでesmのインポート形式で行うようにしました。
これで万事解決と言いたいところですが、パフォーマンスの面でこの解決方法には懸念があります。importをif節の外、ファイルのトップにおいたことによってこのファイルが呼び出されたときに必ずインポートされるようになってしまいます。そのため使用しない本番環境でもmswがバンドルされてしまうようになってbuild後のファイルが膨れ上がります。私の環境では300KiB程も膨れ上がることを確認できました。そのため、ファイルサイズを気にする場合はこの方法は避けた方が良いです(気にしないことはほとんどない気もしますが)。

# 解決策2(おすすめ)
dynamic importします。この方法は多少変更が増えますが、解決策1のようなパフォーマンスの心配はないです。

```tsx
// src/maix.tsx
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'

const prepare = async (): Promise<void> => {
  if (import.meta.env.DEV) {
    const { worker } = await import('./mocks/browser');
    worker.start()
  }
  
  return Promise.resolve()
}

prepare().then(() => {
  ReactDOM.render(<App />, document.getElementById('root'))
})
```
`prepare`という非同期関数を作って、それが呼び出された後にreactのrenderを開始するようにしました。`prepare`という非同期関数は開発環境であれば、workerの呼び出しと起動をします。それ以外の環境ではすぐにresolveします。こうすることで、開発環境でのみmswを呼び出すことに成功して、先ほどのようなパフォーマンスの損失を避けることができます。
とは言え、これだとreactのrenderに変更を加えているため不安になる方もいらっしゃると考えられます。しかし、この方法と似た変更を[mswの公式](https://mswjs.io/docs/recipes/deferred-mounting)でも紹介されているため安心して使うことができます。コードの面からも開発環境以外では`Promise.resolve()`しているだけなので動作に影響はないです。

# 解決策3
viteのプラグインを入れてrequireを可能にするやり方です。この方法はあまり推奨できないので書きません。
Deepspeedの「unhandled system error, NCCL version 2.7.8」の対処法

# 症状
DeepspeedをDockerコンテナを使ってマルチGPUで学習しようとしたところ，以下のようなエラーを出して止まってしまった．
```
RuntimeError: NCCL error in: /pytorch/torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8
ncclSystemError: System call (socket, malloc, munmap, etc) failed.
```
当初，nccl系のエラーだと思いバージョンを変えてみたが，改善しなかった．

# 解決方法
どうやら，Dockerコンテナに割り当てられているshared memoryが64MBと少なすぎたのが原因っぽい．わりあてられているめもりりょうはコンテナ内で以下を実行するとshmの行から確認できる．
```bash
$ df -h
shm              64M     0   64M   0% /dev/shm
```
なので，Dockerコンテナを起動させるときのコマンドで下記のように割り当てるメモリ量を増やすと解決した．
```bash
docker run --rm --it --gpus all \
    --shm-size=1g \
    --hoge:latest
```
pythonのアンパック演算子のメモ

Dictの中身を`*`演算子をつかって操作する方法について、アンパックの動きをメモ


```Python
test = {'aaa': [0, 2], 'bbb': [1, 3]}
print(*test)
print(test.values())
print(*test.values())
testv = [t for t in zip(*test.values())]

for x, y in zip(test, testv):
  print(x, y)
```

```
aaa bbb
dict_values([[0, 2], [1, 3]])
[0, 2] [1, 3]
aaa (0, 1)
bbb (2, 3)
```

となる

参考になりそうな記事：
https://python.keicode.com/lang/list-unpack-asterisk.php
Xcode14 & CocoaPodsでResource Bundleを含む依存があるとSigningに失敗する

しばらく前から発生してて話題になってないから多分みんなIssue見て解決できてると思うんですが、困っている人いるかもしれないので日本語情報として残しておきます。

## 何が起きたか

Xcode14でResource Bundleを含む依存を入れている場合に、実機ビルドやリリースビルドなどを行おうとするとSigningでエラーが発生する。

### 確認した環境

Macbook Pro (Apple M1 Pro)
macOS 12.6
Xcode 14.0
CocoaPods 1.11.3

## なぜ起きるか

上記環境の場合、CocoaPodsがBundleターゲットもSigningしようとしてしまうが、本来Signingは不要なので必要な情報が不足しておりエラーが発生する。

## 修正方法

### 方針

Signingをしないように生成されたプロジェクトのBundleターゲットにBuild Settingsにフラグ（`CODE_SIGNING_ALLOWED`）を追加する。

Podfileに`post_install`のフック処理を追加することで`pod install`後に発火されるスクリプトの処理を書くことができる。
これを利用し、生成されたプロジェクトのBundleターゲットのフラグをセットする。

:::note warn
`generate_multiple_pod_projects`を設定している場合生成されるプロジェクトの構造が変わるためスクリプトが違うのに注意
:::

### 回避用ワークアラウンド

（手元に`generate_multiple_pod_projects`を設定しているプロジェクトしかないので、使ってない方は動作確認してないです:bow:）

```ruby:Podfile
...

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
      target.build_configurations.each do |config|
          config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
      end
    end
  end
end
```

```ruby:Podfile(generate_multiple_pod_projectsを設定している場合)
install! 'cocoapods',
  :generate_multiple_pod_projects => true
...

post_install do |installer|
  installer.generated_projects.each do |project|
    project.targets.each do |target|
      target.build_configurations.each do |config|
        if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
          config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
        end
      end
    end
  end
end
```

## 公式Issue

https://github.com/CocoaPods/CocoaPods/issues/11402
【ゼロから始めるReact】環境構築編（Docker）~ Vol.1 ~ 

# 【ゼロから始めるReact】環境構築編（Docker）

すずこ「そういえばReact触ったことないや」

すずこ「やってみよう!」

ということで、React（+ typescript）の環境を作ってみる。

:::note info
構築ポイント
* 構築作業はできるだけシンプルに
   ⇒ コンテナに入ってコマンド打つとかやりたくなかった（面倒くさがり）
* ホストディレクトリを先にマウントしてから、Reactプロジェクトを作成
   ⇒ 初回コンテナ起動時にはホスト側にReactプロジェクトがある状態なので、ソースをいじりやすい
:::

## 目次
1. [バージョン](#バージョン)
1. [ディレクトリ構成（構築開始時）](#ディレクトリ構成構築開始時)
1. [ファイル内容](#ファイル内容)
1. [構築手順](#構築手順)
1. [ディレクトリ構成（構築終了時）](#ディレクトリ構成構築終了時)

### バージョン
| ソフトウェア名 | バージョン |
|:-:|:-:|
| Docker | version 20.10.14 |
| Docker Compose | version v2.4.1 |

### ディレクトリ構成（構築開始時）
```
work_dir
　┣ app
　┃　┣ Dockerfile
　┃　┣ docker-entrypoint.sh
　┃　┗ src
　┗ docker-compose.yml
```
| ファイルパス | 説明 | 備考 |
|:-:|:-:|:-:|
| app/Dockerfile | Reactコンテナイメージを管理するためのファイル |  |
| app/docker-entrypoint.sh | コンテナ起動時に実行したい処理を記述しているファイル |  |
| app/src | Reactプロジェクトの資材を格納するためのディレクトリ | 作業時は空でOK |
| docker-compose.yml | コンテナの構成を定義しているファイル | 本件ではappコンテナ（React）のみの構成ではあるが、後ほどDBコンテナ等の構築も想定されるためDockerComposeを使用 |

### ファイル内容

```Dockerfile:app/Dockerfile
FROM node:16.15.0-alpine
WORKDIR /usr/src/app

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
```

```sh:app/docker-entrypoint.sh
#!/bin/sh
ROOT_DIR="/usr/src/app"
APP_DIR="$ROOT_DIR/react-app"

if [ ! -e $APP_DIR ]; then
    cd $ROOT_DIR
    echo "[START] create react app..."
    npm install -g create-react-app
    create-react-app react-app --template typescript
    echo "[END] create react app"
fi

cd $APP_DIR
echo "[START] yarn start..."
yarn start

exec "$@"
```

```yaml:docker-compose.yml
version: "2"
services:
  app:
    container_name: react_app
    privileged: true
    restart: always
    stdin_open: true
    tty: true
    command: /bin/sh
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ./app/src:/usr/src/app
```

### 構築手順
##### 1. 構築ファイルの準備
[ディレクトリ構成（構築開始時）](#ディレクトリ構成構築開始時)のように[資材](#ファイル内容)を配置する

##### 2. コンテナイメージの作成
```
# 作業ディレクトリに移動
$ cd work_dir

# ファイルの存在確認
$ ls
app  docker-compose.yml

# docker-entrypoint.shの権限変更
$ chmod 755 app/docker-entrypoint.sh

# コンテナイメージ構築
$ docker-compose build
```

##### 3. コンテナの起動
```
# コンテナ起動
$ docker-compose up -d

# コンテナの状態確認
$ docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
react_app           "/docker-entrypoint.…"   app                 running             0.0.0.0:3000->3000/tcp

※STATUSがrunningになっていること

# ReactProjectの存在確認
$ ls app/src/
react-app
```

##### 4. 画面にアクセス
http://localhost:3000

画面が表示されればOK!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654832/36f8a6b5-13dd-7862-ac69-33df17c60373.png)

### ディレクトリ構成（構築終了時）
```
work_dir
　┣ app
　┃　┣ Dockerfile
　┃　┣ docker-entrypoint.sh
　┃　┗ src
　┃　　 ┗ react-app（Reactの資材が入っているディレクトリ）
　┗ docker-compose.yml
```
コンテナにマウントしているため、`work_dir/app/src/react-app`をいじればアプリに反映される。

---

ということで、Dockerを使ってReactの環境を構築してみた。
今後DBへの繋ぎこみ等も行っていく予定。

すずこ「なにか要望があればコメントしてくれたら構築しようかな...((ﾁﾗｯ」

以上
Python でファイル名をなるべく連番になりつつもユニークにしたいメモ

## 背景

画像処理とか機械学習で, `img-000.png`, `img-001.png` ... などとファイル名を連番で(or 既存ファイル名を上書きしないようにユニークな名前にしたい)作りたい.

imageio とか pytorch あたりにユーティリティ関数としてありそうですが, どうも無さそうなので自作します!

## 方法

現状はファイル名を見て, 存在するかどうかで処理するしかなさそうです.

今回, 最新ファイル名は同じにしたいので, たとえば既存ファイルがあったら, それを `test-0000.png`, `test-0001.png`, ... にリネームというふうにしてみました.


```python
import os
from pathlib import Path

def rename_existing_file(filename):

    p = Path(filename)

    if p.exists():

        ftup = os.path.splitext(filename)

        # find new filename
        i = 0
        while i < 1000:
            target_name = "{}-{:0>4}{}".format(ftup[0], i, ftup[1])

            target_p = Path(target_name)
            if target_p.exists():
                print("target {} exists".format(target_name))
                i = i + 1
                continue
            else:
                break


        # TODO: print warn when i == 1000
        # rename
        p.rename(target_p)
        print("{} renamed to {}".format(p, target_p))



if __name__ == '__main__':
    fname = "test.png"
    rename_existing_file(fname)
```

## ファイル数が多量の場合

1 万ファイルとかになると, ひとつづつファイルのチェックするのもコストになりそうですから, ディレクトリ内のファイル数を見て連番名を決めてみるとかの対応にしたほうがよさそうです!