OmniAICreator/Qiita-1.07M huggingface dataset:
QIIME2でのfeature tableやシーケンスの結合

## Feature table の結合

```bash
# 結合したいテーブルを並べるだけ
qiime feature-table merge \
    --i-tables table1.qza \
    --i-tables table2.qza \
    --o-merged-table merged-table.qza

# 結合結果を確認するために可視化
qiime feature-table summarize \
        --i-table merged-table.qza \
        --o-visualization merged-table.qzv \
        --m-sample-metadata-file sample-data.txt 
```

table.qzaでは、`c54361b7026e71aeefd89886daa94adc`や、`daf7abc4f05170cac3c69a3a3c652811`など、ランダムな文字列（？）がfeature IDとして付与されるが、これが2つのテーブル間で偶然一致したときにどうするか。

その場合に、`--p-overlap-method` というオプションが使える。
"average （ID間の平均値を出力）"、"error_on_overlapping_feature （重複時にfeatureに対してエラー出力）"、"error_on_overlapping_sample （重複時にsampleに対してエラー出力）"、"sum （合計する）"という選択肢がある。

このオプションを指定しないと、重複したときにエラーを返す"error_on_overlapping_sample"オプションがデフォルトで指定される。

## シーケンスの結合

DADA2から出力される代表シーケンス (rep-seqs)を結合できる。

```bash
# 結合したいシーケンスデータを並べるだけ
qiime feature-table merge-seqs \
        --i-data rep-seqs1.qza \
        --i-data rep-seqs2.qza \
        --o-merged-data merged-rep-seqs.qza
```

## 種の組成テーブルの結合

```bash
# 結合したい種の組成データを並べるだけ
qiime feature-table merge-taxa \
        --i-data taxonomy1.qza \
        --i-data taxonomy2.qza \
        --o-merged-data merged-taxonomy.qza
```


## 参考

[merge: Combine multiple tables](https://docs.qiime2.org/2021.4/plugins/available/feature-table/merge/)
[merge-seqs: Combine collections of feature sequences](https://docs.qiime2.org/2021.4/plugins/available/feature-table/merge-seqs/)
[merge-taxa: Combine collections of feature taxonomies](https://docs.qiime2.org/2021.4/plugins/available/feature-table/merge-taxa/)
【Google Cloud Day'21】「ハイ パフォーマンス コンピューティング（HPC） on Google Cloud の基本と効果的な使い方、国立極地研究所導入事例の紹介」を視聴して

https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d2-infra-04
ハイ パフォーマンス コンピューティング（HPC） on Google Cloud の基本と効果的な使い方、国立極地研究所導入事例の紹介
"HPC ワークロードをクラウドで計算するための基本をご案内します。
Google Cloud ならではの特徴や主要なソリューションだけでなく、
効果的にご利用いただくための導入ポイントやパートナー様もご紹介します。
事例として国立極地研究所様にもご登壇いただきます"

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>HPC の領域における Google Cloud らしさっていうのはどんなところにあるんでしょうか？</th>
		<td>カスタムマシンタイプと呼ばれるタイプ含め、CPU やメモリ、GPU などをそれぞれ柔軟に組み合わせ費用の最適化が図れること。最適化後、ノード間が 10 マイクロ秒未満 100 Gbps となる低遅延高帯域ネットワーク。Workspace と連携しデータを安全に共有する仕組みなどです。</td>
	</tr>
	<tr>
		<th></th>
		<td>本事例では計算時間が決まっていため、それに合わせた理想的な計算資源で構築できるところです</td>
	</tr>
	<tr>
		<th>何らかの問題があって計算結果を送信出来ない場合はどのような対応を行うのでしょうか？</th>
		<td>高解像度の計算結果は送信できませんが、ECMWF等の気象予報データや、衛星による観測データなど、複数のデータソースを同時に送っております。これらのデータで最低限の情報支援を行います。</td>
	</tr>
	<tr>
		<th>HPCと関係ありませんが、北極航海は今年もするのでしょうか？</th>
		<td>今年も「みらい」による北極航海が計画されています。航海が始まりましたら、JAMSTECか極地研究所のWebサイトやTwitter等で公開されます。</td>
	</tr>
	<tr>
		<th>クラウドのマシンは比較的高価なように感じます。費用を抑えるためにはどんな使い方が推奨されているのでしょうか？</th>
		<td>大きく 2 つです。まず仮想マシンの単価を調整する方法です。CPU コア数とメモリサイズを適切に選ぶ、確約利用割引をご利用いただく、中断可能な計算にはプリエンプティブル VM を使うといった方法です。もう一つは計算クラスタの拡張縮退を動的に行う、です。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>課題</th>
		<td></td>
	</tr>
	<tr>
		<th>GCPのHPC</th>
		<td>コンピュート最適化インスタンスをお勧めしている</td>
	</tr>
	<tr>
		<th>低地円にするために</th>
		<td></td>
	</tr>
	<tr>
		<th>ユースケースの背景とGCPにした理由</th>
		<td></td>
	</tr>
	<tr>
		<th>システム構成</th>
		<td></td>
	</tr>
	<tr>
		<th>結果</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/c6ae90ca-c2b9-24ad-d0e6-a96ee5549704.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9f4d0e80-2764-ecc8-4c9c-31d1dc85fa5a.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a6eb98da-ccba-2853-b3a4-a89a610bb93e.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8c7d91dd-c35f-1171-ca91-d5570d216bd8.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f84d99bb-2910-00ad-29aa-2176356c836e.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3a68ef53-b045-bda2-9b21-7f14b4f95c7d.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/63a57600-9ee1-334c-cf9e-47bbb579af11.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4728fbc9-2556-d7db-9016-c2f84273ba32.png)
外付けHDD間で大量の写真データを引っ越す羽目に

Finderの限界を感じた瞬間... 
外付けのHDDは時々不調になる。まあ、仕方ないかも、読み書き頻度高い使い方していて、消耗もするでしょう。
そのためにも、しっかりとバックアップもしているけど、バックアップサービスからデータを復旧するのは若干手間なので、不調のドライブからデータを取り出せるうちに別のドライブに退避した方が楽。
パスも全部維持できるから、後からLightroomにフォルダーパスだけ更新すればLibraryが狂うこともないし。

8Tのデータ、まあ、重い。Finderで過去にコピーしてたら、日単位の時間が必要だったので、流石に嫌だな〜と思い、他の方法を試した。
さらに、こちらの欠点があある：

- Finderだと、家族がマシーン使いたくても若干躊躇する（まあ、小さい窓閉じちゃったらコピー停止だし・・・わかる）
- どこまでコピーできたとか、ファイル単位の進捗がわからない（ただ気になるってだけだけど）
- 前回の経験から、途中で中断した場合、フォルダー内容がまれにちゃんと補完されないことがあったりする
- フォルダー内のファイルが一部だけ差分がある時、既存のファイルはスキップするというオプションが表示されるケースとされないケースがあり、無駄な作業することがある

なので、家族は触れることがない Terminal でうまいぐいにやってみよう。

使えるのは ```cp``` か ```rsync```。
```cp``` の婆あい、アイルが多いと、```too many arguments``` と怒られるやつです。このコマンドはちょっと回り道をで使う必要がある。
外付けのドライブ間コピーなので、パスは基本 ```/Volumes/*``` になるけど、自分の場合、ディスクに連番を降ってるので、こんな感じです：
コピー元： ```/Volumes/PICTURES\ 10```
コピー先： ```/Volumes/PICTURES\ 13```

今回、サブフォルダーの構成を維持しながら、コピー元にある 2020 と 2019 という二つのフォルダーを同時にコピーしたい。

使ったコマンドの例は以下です。速度の明確な差はそれほどないが、気持ち程度、```cp```の方が早そうな印象でした。

### rsync 例

```
rsync -ruva -progress /Volumes/PICTURES\ 10/2020/. /Volumes/PICTURES\ 13/2020/ 
```

オプションの意味は「ターゲットファイルが新しければ上書きしないで、やってることを見せながら、ディレクトリー構成を維持して」コピーです。
※ ドライランしたい場合、 ```-n``` もつけてください。

出力例

```
building file list ... done
./
2020-02-02/KAS_5276.CR2
2020-02-02/KAS_5277.CR2
2020-02-02/KAS_5278.CR2
2020-02-02/KAS_5279.CR2
```

対象外（存在していて、コピーされない）ファイルは、そもそも出てきません。

### cp 例

```
find /Volumes/PICTURES\ 10/2019/. -name "*.*" -print0 | xargs -0 -I {} cp -navR {} /Volumes/PICTURES\ 13/2019
```

オプションの意味は「ターゲットファイルが存在していたら上書きしないで、やってることを見せながら、ディレクトリー構成を維持して」コピーです。

出力例

```
PICTURES 10/2019/. -> PICTURES 13/2019/.
PICTURES 13/2019/./.DS_Store not overwritten
PICTURES 10/2019/./2019-06-14 -> PICTURES 13/2019/./2019-06-14
PICTURES 13/2019/./2019-06-14/KAS_0837.CR2 not overwritten
PICTURES 13/2019/./2019-06-14/KAS_0838.CR2 not overwritten
PICTURES 13/2019/./2019-06-14/KAS_0839.CR2 not overwritten
PICTURES 13/2019/./2019-06-14/KAS_0840.CR2 not overwritten
PICTURES 13/2019/./2019-06-14/KAS_0841.CR2 not overwritten
PICTURES 13/2019/./2019-06-14/KAS_0842.CR2 not overwritten
PICTURES 10/2019/./2019-06-14/TK2_5752.CR2 -> PICTURES 13/2019/./2019-06-14/TK2_5752.CR2
PICTURES 10/2019/./2019-06-14/TK2_5753.CR2 -> PICTURES 13/2019/./2019-06-14/TK2_5753.CR2
PICTURES 10/2019/./2019-06-14/TK2_5754.CR2 -> PICTURES 13/2019/./2019-06-14/TK2_5754.CR2
```

対象外のファイルも表示される。
基礎⑤〜論理演算子について〜　php

#はじめに

論理演算子について詳しく書いてみた。

#内容

##論理演算子とは
複数の条件を１つにまとめる時に使います。
＆＆が「かつ」という役割をしており、||が「または」という意味になります。

例：

```php

$a=100;

if($a > 50 && $a <200){

 echo "$aは50より大きい、かつ30より小さい";
}

if($a < 50 || $a >30 ){

echo "$aは10より小さい、または30より大きい";

}
//結果：$aは50より大きい、かつ30より小さい

```

上の例題を説明すると


if(＄a > 50 && ＄a <200)
この部分で５０より大きいかつ３０より小さいと表記しており

if(＄a < 50 || ＄a >30 )
ここでは$aは10より小さい、または30より大きいと表記しています。

＄aの中身は100なので５０より大きいかつ３０より小さいという結果になります。

他にも「！」も論理演算子の１つです。
意味は条件式を否定するとこりで使われます。


例：


```php
$a = 100;

if(!(＄a == 300)){

echo "＄aは300ではない";

}

//結果：$aは300ではない

```

上の例の説明をすると

最初に「！」をつけることで条件式の否定をしています。
なので$aは300ではないという結果になります。

#まとめ
この方法を使うことで色んな複雑な選択を絞り込むことができるので検索機能などの場面で役立つと感じました。
AWSに構築した環境の設定値をファイル出力したい

#やりたいこと
awsに環境構築を行い、そのアウトプットとしてアカウント上に構築した各種リソースの設定値を出力したい。

#必要な物
aws cliの実行環境
各種リソースの読み取り権限を持ったIAMユーザー

#aws cliの実行環境
まずはaws cliの実行環境の準備です。
Windowsは以下URLからaws cliのインストーラーをダウンロードしてPCに実行環境をインストールします。
https://awscli.amazonaws.com/AWSCLIV2.msi
コマンドプロンプトからawsコマンドを実行できるようになったかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1749180/b7950712-6f4e-7012-557c-426f01fa9902.png)

#IAMユーザーの作成
次に作成するツールからAWSにアクセスするためのIAMユーザの作成です。
AWSコンソールにアクセスします。
IAMの管理画面からユーザの追加を行います。
設定値は以下画面の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1749180/b5c894fd-920a-4ea0-ac73-68a0ec5147f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1749180/b2401f32-cd6d-2416-62ef-455e31e7a798.png)
アクセス権は「ReadOnlyAccess」（全読み取り権限）を付与
※本来なら取得したいサービスの読み取り権限のみ付与するのが良し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1749180/d6af6a5d-dfbc-e562-0834-5d6638797b2f.png)
これでユーザー作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1749180/2e2371ae-989c-df04-d924-4925a92c6bee.png)
ユーザー作成後に表示されるアクセスキーとシークレットキーは後で使うので控えておきましょう


#コマンドラインで情報を取得してみる
これでaws上から情報取得をできるので試してみます。
コマンドプロンプトを開いてaws configureを実行します。

```
#aws configure
```
対話形式で入力を求められますので以下入力します。

```
AWS Access Key ID [None]: 事前に取得したアクセスキー
AWS Secret Access Key [None]: 事前に取得したシークレットキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

実際にアカウント上の情報をJSON形式で取得します。
例としてec2の仮想マシン情報を取得

```
aws ec2 describe-instances
```
コマンドのオプションでインスタンスIDの指定で特定インスタンスのみ取得なども可能。
アカウント上にあるEC2インスタンスの情報を取得できます。
awsコマンドについては公式の下記サイトに詳しく載ってるので参考になります。
https://docs.aws.amazon.com/cli/latest/index.html
FlaskでBlueprintの入れ子によりRestfulAPIの複数バージョンを実現する

# 概要

実運用でWEB-APIを公開する場合、現行バージョンを維持したまま新バージョンをリリースするようなシチュエーションがある。
最近よく使っている[FastAPI](https://fastapi.tiangolo.com/)ではRouterの入れ子により簡単に実現できる。

一方、元々[Flask](https://palletsprojects.com/p/flask/)をメインで使っていたのだが、一時期開発が停止していたためやや疎遠になっていたけども、メジャーバージョンもリリースされており、こちらも並行して使うようになった。

FlaskでFastAPIと同様のことを実現するにはライブラリなどがいるかと思いきや、普通にBluePrintを入れ子にするだけだった。

# 環境

* Python-3.8.8
* Flask-2.0.1

# 構成

以下のような構造で作る。

```
├── app.py
└─  api
   ├── __init__.py
   ├── v1
   |  ├── __init__.py
   |  └── views.py
   └── v2
      ├── __init__.py
      └── views.py
```

`app.py`

```python
import Flask

from app.api import blueprint as bp_api


app = Flask(__name__)

app.register_blueprint(bp_api, url_prefix='/api')
```

`api/__init__.py`

```python
from flask import Blueprint

from .v1 import blueprint as bp_v1
from .v2 import blueprint as bp_v2

blueprint = Blueprint('api', __name__)

## routing
blueprint.register_blueprint(bp_v1, url_prefix='/v1')
blueprint.register_blueprint(bp_v2, url_prefix='/v2')
```

`api/v1/__init__.py`

```python
from . import views
from flask import Blueprint

blueprint = Blueprint('v1', __name__)

blueprint.add_url_rule('/user', view_func=views.UserView.as_view('user'))
```

`api/v1/views.py`

```python
from flask.views import MethodView


class UserView(MethodView):
    def get(self, *args, **kwargs):
        ...
```

v2も同様の構成にする。
この方法で別のメリットに気づいたのだが入れ子になるため名前空間で管理されエンドポイントやviewの名称がシンプルになる。つまり、

```python
blueprint.add_url_rule('/v1/user', view_func=views.UserView.as_view('api-v1-user'))
```
が以下のようになる(実際のエンドポイントは`/api/v1/user`で`url_for`で呼び出すときは`api.v1.user`)。

```python
blueprint.add_url_rule('/user', view_func=views.UserView.as_view('user'))
```

# まとめ

RestfulAPIを提供するだけなら実行速度が早くSwaggerが使えるFastAPIを利用するのが望ましい。
一方、既存のシステム(Flask)の保守、改修、またフロントエンド部分も実装したい場合など個人的にはFlaskを使う用途は今後も存続していくと思う。
【Ruby on Rails】AWSの本番環境で起きたエラーをtailを使って確認する方法


#対象者

* 本番環境（デプロイ後）でエラーが発生している方
* Cloud9を使用して開発を進めている方


#目的

* cloud9から本番環境で起きたエラーの原因を突き止める

#実際の手順と実例
###1.logディレクトリに遷移する


まず、EC2からSSHでログインを実施します。
cloud９のターミナルから下記コマンド実行

````
$　ssh -i ~/.ssh/[pemファイル名] ec2-user@[IPアドレス]
````
[]の中身はそれぞれの状況によって変わると思います。
pemファイル名はキーペアの作成時にできたやつです！（うろ覚え）


その後、下記の順でlogでディレクトリまで移動します。

```
$ cd アプリケーション名
$ cd log
```

###2.エラー内容確認

lsコマンドで下記のファイルを見てみます

````
[ec2-user@ip-xxxxxxxx log]$ ls
development.log  migrate:reset.log  production.log  puma-error.log  puma.log
````

簡単に言うと
production.log →　rails周りのlog
puma-error.log  puma.log　→　サーバー周りのlog

こっちのエラーじゃないか、、、という方の
どちらかを選択して下記コマンドを実行

````
[ec2-user@ip-xxxxxxxx log]$ tail -n 100 production.log
````

上記コマンドでは、tailというコマンドを使ってproduction.logのlogを見てみます。

数字は自在に変えられるので、エラーが起きた箇所まで遡ってエラー箇所を見つけましょう！


####投稿者コメント

どうやって確認すればいいんだ！！！って３日前に嘆いていたので記事にしてみました。この後も本番環境でエラー起きたときこのコマンドには助けられました。。。

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

# 沢山は扱いづらい

## 0.はじめに

大容量ストレージにデータを保存する時、特に画像データなんかは1つのディレクトリ（フォルダ）に大量のデータが割と無作為に入れることが多いと思われます。自分の場合は古いHDDからデータをサルベージした際、1つのディレクトリに14万もの画像データが入ることになりました。そうすると、普通のファイラーを使った際にデータが多すぎてファイラーの処理が重くなったりして使いづらくなります。
綺麗に分類分け出来ればもちろんいいのですが、流石に量が量なのでとりあえず適当に分割することを考えます。

## 1.分け方

とりあえず、ディレクトリ内の大量ファイル達を$n$等分することを考えます。
ここでは単純に考えて1つのディレクトリを2つに分けて半分に、更にその2つのディレクトリを2つずつに分けて更に半分に、…
というのを繰り返してねずみ講のように$2^k$個にディレクトリを分けて$2^k$分割する方法を取ります。（2,4,8,16,32,...）
14万個データがあるディレクトリを32分割すると大体4400個になり、まあ頑張れば扱いきれる数になります。（分割のバランスを考えるとこれくらいが妥当でしょうか。）

## 2.アルゴリズム

さて分け方は考えましたが、コンピュータにやらせるためにもう少しロジックを考える必要があります。アルゴリズムを考えるというヤツです。
結論から書くと以下のようになります。

```:対象ディレクトリに対する処理
1. 対象のディレクトリ内のファイル数を数えて、その半分を算出する
2. 対象のディレクトリ内のファイル一覧を出力し、その後半部分を出力する
3. ディレクトリをもう一つ作成し、対象ディレクトリ内の後半部分ファイルをそこに移動する
```

## 3.スクリプト

最終的なbash scriptは以下の通りです。
所々にある``echo``文は役割としてはprintデバッグの側面が強いので無くても問題なし。

```bash:ディレクトリ内の大量ファイルを分割整理する
#!/bin/bash
# ディレクトリ内の大量ファイルを2**n分割してディレクトリに分ける

if [ $# -ne 1 ]; then
    echo "引数の数が違う"
    exit 1
fi

# 対象のディレクトリとそこのパスを切り分ける
splite_directory=$(basename $1)
readonly splite_directory
base_directory=$(dirname $1)
readonly base_directory

echo $splite_directory
echo $base_directory

target_dir_list=($splite_directory)
count=1
while [ $count -lt 32 ]
do
    new_target_dir_list=()
    for t_dir in ${target_dir_list[@]};
    do
        echo $t_dir
        # ディレクトリ内のファイル数を数えて、その半分値を算出する
        num_file=$(find ${base_directory}/${t_dir}/. -type f|wc -l)
        half_num=$(($num_file>>1))
        echo $num_file
        echo $half_num

        # 対象のディレクトリ内のファイル一覧を出力し、その後半部分を作成する
        ls -1 ${base_directory}/${t_dir}/. > file_list.txt
        tail -q -n $half_num file_list.txt > half_list.txt
        half_files=(`cat half_list.txt|xargs`)
        rm file_list.txt
        rm half_list.txt

        # ディレクトリを2つに分割し、収納ファイル数を半分に分ける
        rename_dir=${t_dir}0
        new_dir=${t_dir}1
        new_target_dir_list+=(${rename_dir} ${new_dir})

        # 収納ファイルの後ろ半分を新しいディレクトリに移す
        mkdir ${base_directory}/${new_dir}
        for hf in ${half_files[@]};
        do
            mv ${base_directory}/${t_dir}/${hf} ${base_directory}/${new_dir}/${hf}
        done

        # 移し元のディレクトリを改名する
        mv ${base_directory}/${t_dir} ${base_directory}/${rename_dir}
    done

    target_dir_list=${new_target_dir_list[@]}
    count=$(($count<<1))
done
```
Ｃ言語ポインタの落とし穴

次のような考えは　間違い　です。

- `*変数名`　とするとポインタとして扱えるから
  - 宣言は　`char *tmp`
  - 使うときは　`*tmp`

正解は、

- ポインタ変数として使ときは`*`抜きの`tmp`としてポインタ変数として使える
- 変数宣言のときのアスタリスクと、それ以外のときのアスタリスクは全くの別物！！
[AWS CDK] cdk diffで「Cannot find module 'typescript'」エラー発生

# 要約
- 昨日まで動いていたCDKが何故か動かくなる・・・
- 対処方法をWEBで調べたが日本語記事がなかなか見つからなかったので、メモ
- 細かい原因等は追えていません。

# エラーの発生内容
```
$ cdk diff
npx: installed 14 in 1.02s
Cannot find module 'typescript'
Require stack:
- /home/xxxx/.npm/_npx/657/lib/node_modules/ts-node/dist/index.js
- /home/xxxx/.npm/_npx/657/lib/node_modules/ts-node/dist/repl.js
- /home/xxxx/.npm/_npx/657/lib/node_modules/ts-node/dist/bin.js
Subprocess exited with error 1
```

# 解消方法
- 以下をインストールしました。
- バージョンは個人の方の環境に合わせて下さい。

```
sudo npm i -g ts-node@10.2.0
```
【画像処理解説】グレースケール変換（Javaソース付き）

#はじめに
画像処理を簡単に解説していきます。
下部にはJavaでのソースコードも載せているのでぜひご参照ください。
不定期にはなりますが、随時更新していく予定です。

#グレースケール画像とは？
一言でいうと白黒画像です。
プリンターなどで白黒印刷を選択すると出てくる画像です。

前回、カラー画像は3チャネルで構成されると説明しました。
グレースケール画像はチャネル数が1つとなります。
すなわち、8bitのみで画像を表示することができます。

ただし、8bitに対応していないライブラリでは、24bitのままグレースケール画像を扱うことがあります。
その場合、各画素のR, G, Bには同じ値をセットすることになります。

#公式はあるの？
単にRGB値の平均を取ることでもグレースケール化はできます。
しかし、一般的には以下の式が用いられています。

$ V = 0.213R + 0.715G + 0.072B $

人間の視覚は緑に対して敏感な一方、青に対して鈍感となっています。
そのため、上記のような重みづけをした式を用いることで、より人間の視覚に適した変換ができます。

#アルゴリズム
1. カラー画像をラスタスキャンし、各画素に対して2から4の処理を行う。
2. 画素のR, G, Bのそれぞれの値を取得する。
3. 先述の公式を用いて、グレー値を算出する。
4. 画素に対して、4で算出したグレー値をセットする。

#グレースケール化の例
元画像（RGB画像）
![imori_256x256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655420/4f61e05f-a378-55c7-a6ae-61b877356742.png)

結果画像（グレースケール画像）
![out002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655420/eb736a70-07b6-8905-e648-6e6708054589.png)

#ソースコード
SImageでグレースケール画像を扱うにはチャネル数を1にします。

```Color.java
public static SImage toGray(SImage colorImg) {
    // カラー画像でない場合、そのまま返す
    if (colorImg.channel == 1)
        return colorImg.copy();

    // アルファチャネルを持つ場合、処理を分ける
    if (colorImg.channel == 4) {
        var grayImg = new SImage(colorImg.width(), colorImg.height(), 1);
        for (int x = 0; x < colorImg.width(); x++)
            for (int y = 0; y < colorImg.height(); y++) {
                int[] argb = colorImg.getARGB(x, y);
                int gray = (int) Math.rint(0.213 * argb[1] + 0.715 * argb[2] + 0.072 * argb[3]);
                grayImg.setGray(x, y, gray);
            }
        return grayImg;
    }

    // グレースケール画像の生成
    var grayImg = new SImage(colorImg.width(), colorImg.height(), 1);

    // 画像をラスタスキャン
    for (int x = 0; x < colorImg.width(); x++)
        for (int y = 0; y < colorImg.height(); y++) {
            // RGB配列を取得
            int[] rgb = colorImg.getRGB(x, y);

            // 公式を用いてグレー値を計算
            int gray = (int) Math.rint(0.213 * rgb[0] + 0.715 * rgb[1] + 0.072 * rgb[2]);

            // グレー値を画像にセット
            grayImg.setGray(x, y, gray);
        }
    return grayImg;
}
```
応用情報の復習

#SOA
Service Oriented Architecture
サービス指向アーキテクチャ。
業務上の一処理に相当するソフトウェアの機能をサービスという単位で実装し、サービスを組み合わせてシステムを組み立てるという考え方。

<img src="https://xtech.nikkei.com/it/article/lecture/20070725/278275/zu1.jpg">


#アクティビティ図
システムやユースケースの動作（処理）の流れを表す。フローチャートなので、分岐なども表せる。

##cf.コミュニケーション図
オブジェクト間の関連を重視した図。
<img src="https://www.itsenka.com/images/development/uml/uml-object02.gif">


ちなみに、似ている図でクラス図があるが、クラス図はクラスを基準とした抽象的な図であるのに対し、オブジェクト図はオブジェクトを基準とした具体的な図である点で異なる。


#RASIS
コンピュータシステムの信頼性評価指標。

R：信頼性Reliability
システム全体が故障せずに連続して稼働する。

A：可用性Availability
システムが使用できる。

S：保守性Serviceability
システムが故障した時に用意に修理できる

I：保全性Integrity
システムに記録されているデータの完全性

S：安全性Security
データの災害や障害に対する耐性。


#バスタブ曲線
フォールアボイダンスを評価するもの。故障率曲線とも呼ばれる
<img src="https://takuminotie.com/wp-content/uploads/2015/09/%E3%83%90%E3%82%B9%E3%82%BF%E3%83%96%E6%9B%B2%E7%B7%9A%EF%BC%92.jpg">

cf.ワイプル分布
選択肢で出てくる用語。時間と共に発生する故障現象を統計的にモデル化したもので、初期故障、偶発故障、摩擦故障を表す関数のモデル化も可能。
<b>※ワイプル分布がきたらバスタブ曲線</b>

#OC曲線
検査特性極性という。ロットの不良率に対する、そのロットの合格率を表す。本来合格になるべきロットが不合格になる確率を「生産者危機」、不合格になるはずのロットが合格になる確率を「消費者危機」と呼ぶ。

#稼働率
RASISのA可用性の指標である。

MTBF=平均故障間隔
MTTR=平均修理時間
<img src="https://officemiyajima.com/swfu/d/kadouritu.png">

故障率=1/MTBF

##直列の場合
稼働率＝R1*R2

##並列の場合
稼働率=1-(1-R1)*(1-R2)
1-[システムが稼働しない確率]
並列は、二つの内どちらも故障していないと稼働していることになる。
そのため、システムが稼働しない確率は、掛け合わせている。

#トランザクション
データベース管理システムが持つ、複数の利用者が同時にアクセスしてもデータの矛盾を生じさせない仕組み。
<b>ACID特性</b>を兼ね備える必要。

A:原子性（Atomicity）
全ての処理が完了するか、全く実行されない状況かのどちらか一方で終了しなければならない。
コミットとロールバックで実現する。

C:一貫性(Consistency)
データ内で矛盾がないこと

Ｉ：独立性(Isolation)
同時に複数のトランザクションを実行した時、順に実行した時の処理結果と一致する事。

Ｄ：耐久性(Durability)
一旦終了したら、障害が起きても消失しない。


#リトルエンディアンとビックエンディアン
主記憶上に配置された復数バイトのデータの場合、どちらを最上位バイト、どちらを最下位バイトと判断するか。
それぞれバイト順序の方式を指す。


##リトルエンディアン
ＡＢＣＤ１２３４なら、３４・１２・ＣＤ・ＡＢになる。
最下位のバイトから配置

##ビックエンディアン
ＡＢＣＤ１２３４なら、ＡＢ・ＣＤ・１２・３４になる。
最上位から配置。



#割込みの種類
##内部割り込みの種類
→CPU内部の要因で発生する割り込み。

プログラム割り込み：０で除算、オーバーフロー、不正な処理が行われた場合など。

SVC割り込み：スーパバイザコール割り込み。カーネルに処理を依頼するための割り込み。入出力命令など、一般のプログラムからは制御できないＯＳの重要な機能をプログラムが利用したい場合。
中型 BashScript 集


# はじめに

Qiita に投稿した中型の BashScript 集.

|コンテンツ|一言|
|:--|:--|
|[[02] 前述[01]で構築した Jenkins Master(docker) - Slave(docker) [SSH通信] の Slave を複製するバッチ](https://qiita.com/robozushi10/items/172d3dde4de7c56d2106)|Jenkins Slave の複製方法のメモも兼ねている|
|[/etc/inittabの内容をレベル毎にソートして表示する](https://qiita.com/robozushi10/items/e113510429579fc6b7c0)|中規模プログラム.|
|[ps -ef の結果からユーザ単位でプロセス個数を表示するプログラム](https://qiita.com/robozushi10/items/ff188ffb3c2d0748136a)| 個人的には awk で頑張る限界に近い. 正直 Python で実装すると思う. |
|[Markdown のコードブロックを動的に読み込ませる](https://qiita.com/robozushi10/items/314b00d0f3e49d34bc9d)||
|[git hook を使って push時に特定の処理を実行する](https://qiita.com/robozushi10/items/ce439faca44d44fce67b)|Gitリモートリポジトリ側の設定である|
|[[02] docker-composeを活用して即座にPython 3.9.4 を立てる ... ビルドコンテナ実行ツール作成](https://qiita.com/robozushi10/items/7a087b78f1c7f7d46cd0)||
|[指定ファイルをMarkdownのpre記法で装飾し、クリップボードにコピーするシェルスクリプト](https://qiita.com/robozushi10/items/71f8e5cbfe8b21f60440)||
Xcodeで"private key is not installed"と表示されたら

Xcode で Archive するときなどに private key is not installed と表示されたら

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/1e81acfd-a643-d02c-2be3-6f3e14344a29.jpeg)

Manage Certificates... から

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/ebfc7b62-e9fe-ec85-af0c-af1ab13a4118.jpeg)

Apple Distribution を追加します。
EVMを理解しよう


#EVM（アーンドバリューマネジメント）
基本情報技術者試験では出題がない、数少ない用語の一つです。

EVMとは、プロジェクトの進捗や作業のパフォーマンスを、出来高の価値によって定量化し、プロジェクトの現在及び今後の状況を評価する管理手法です。

スケジュールとコストの2つの指標で進捗状況を把握できる点がメリットとなります。

横軸に時間、縦軸に価値（金額）を取ったグラフで表されます。
<img src="https://ssaits.jp/promapedia/wp-content/uploads/2020/03/evm-mv.jpg">
出典：アーンド・バリュー・マネジメント（EVM）とは何か？見積りを使った分析方法（EVA）と計算方法を解説



##EVMの主な指標

EVMでは、3つの指標を使って分析します。
<b>
・EV (Earned Value：出来高)：実際に完了した作業の出来高
・PV (Planned Value：計画価値)：計画時の出来高
・AC (Actual Cost：実コスト)：実際に費やしたコスト
</b>



そして、現時点での状況評価軸として、以下の2点を見ます

<b>・SV (Schedule Variance：スケジュール差異)：EV-PV</b>
SV<0であれば、進捗が計画より遅れていることを意味します。

<b>・CV (Cost Variance：コスト差異) : EV-AC</b>
CV<0であれば、コストが超過していることを意味します。


#
【一行野郎】コンソール表示しつつ xclip でクリップボードにもコピーする


以下だと a.txt の内容がコンソールには表示されない.

```bash
$ cat a.txt | xclip 
```

そこで次のように「tee /dev/stderr」(標準エラー出力) を挟む.

```bash
$ cat a.txt | tee /dev/stderr | xclip
```

　

以上
指定ファイルをMarkdownのpre記法で装飾し、クリップボードにコピーするシェルスクリプト


# 実行内容

次の 1〜3 をするシェルスクリプト.
Qiita への記事転載を楽にすることが目的である.

ただし、当スクリプトは (私的な) 別用途向けバッチの流用なので、
Qiita の書式にどの程度まで適合するかは不明である.

```
1. 指定したディレクトリ以下 (.git/ や .svn/ は除外) にあるファイルを抽出する

2. 上記 1 作成したコード群を(UTF-8で) Markdown の pre記法で修飾する

3. X Window システムのクリップボードにコピーする
```
　

# 手順

## 1. nkf と xclip をインストールしておくこと

手順は省略する.
また、X Window が使える環境であること.

　

## 2. $HOME/bin/toQ を作成する

```bash
#!/bin/bash
 
# 見出しの大きさ. 環境変数 SXHIND で 1〜5 まで調整可能.
IDT="###"
 
echo "$SXHIND" | grep -q -w "1" && {
IDT="#"
}
echo "$SXHIND" | grep -q -w "2" && {
IDT="##"
}
echo "$SXHIND" | grep -q -w "3" && {
IDT="###"
}
echo "$SXHIND" | grep -q -w "4" && {
IDT="####"
}
echo "$SXHIND" | grep -q -w "5" && {
IDT="#####"
}
 
for f in $@
do
MARK=
test -f $f && {
  # ファイル名に拡張子を含むだろう場合
  echo $f | grep -q -F '.' && {
    FTYPE=${f##*.}
    MB=""
    ME='```'
    case "$FTYPE" in
      py)  MB='```python' ;;
      sh)  MB='```bash'   ;;
      bat) MB='```bash'   ;;
      rb)  MB='```ruby'   ;;
      ps1) MB='```powershell';;
      js)  MB='```javascript';;
      c)   MB='```c'      ;;
      cpp) MB='```cpp'    ;;
      go)  MB='```c'      ;;
    html)  MB='```html'   ;;
    yaml)  MB='```yaml'   ;;
     yml)  MB='```yaml'   ;;
      "")  MB='```bash'   ;;
      *)   MB='```bash'   ;;
    esac
  } || {
    # ファイル名に拡張子が存在しなければ、file コマンドによるファイル種別から推測する
    FTYPE=`file -ib $f`
    MB=""
    ME='```'
    case "$FTYPE" in
      *x-python*)      MB='```python' ;;
      *x-shellscript*) MB='```bash'   ;;
      *x-ruby*)        MB='```ruby'   ;;
      *x-msdos-batch*) MB='```bash'   ;;
      "")              MB='```bash'   ;;
      *)               MB='```bash'   ;;
    esac
  }
  # UTF-8 で表示する
  nkf -w <<EOL

$IDT $f

$MB
`cat $f`
$ME

　

EOL
}
done


```

## 3. $HOME/bin/toQ を実行する

次の要領でファイルを指定する.

**ファイルを個別指定する場合**

```bash
$ toQ ./a.py ./sub/b.py |xclip
```

**ファイル全選択する場合**

```bash
$ toQ $( find . -type f )|xclip
```

**ファイル全選択(応用)**
カレント以下のファイルを pre記法にするが、.git/ と .svn/ は除外する.
(引数はトリッキーなので意味については[こちら](https://qiita.com/robozushi10/items/31579e659b60efe54e75)を参照.　私自身このような複雑な記法は普段は使わない)

```bash
$ toQ $( echo . | sed 's/\s\+/\n/g' | xargs -I@ find @ \( -type d 2>/dev/null -and \( -name '' -o -name '.git' -o -name '.svn' \) -prune \) -or \( -type d -and -print \) | xargs -I@ find @ -maxdepth 1 -type f ) | xclip
```


## 4. Qiita に貼り付ける

　

以上
【1行野郎】複数パスを対象にディレクトリを列挙するが、特定ディレクトリのみ探索しない２


# 実行内容

下記で抽出したディレクトリに存在するファイルパスを取得する.
・[【1行野郎】複数パスを対象にディレクトリを列挙するが、特定ディレクトリのみ探索しない](https://qiita.com/robozushi10/items/31579e659b60efe54e75) 


```bash
$ echo /var/jenkins_home /home/foo | sed 's/\s\+/\n/g' | xargs -I@ find @ \( -type d 2>/dev/null -and \( -name '' -o -name '.git' -o -name '.cacahe' \) -prune \) -or \( -type d -and -print \) | xargs -I@ find @ -maxdepth 1 -type f
```

・最後の `-maxdepth 1` を加えることでファイルパスを重複せずに得ることができる.
・fish shell v2.7.1 でも動作することを確認済み

その他処理については下記を参照.
[【1行野郎】複数パスを対象にディレクトリを列挙するが、特定ディレクトリのみ探索しない](https://qiita.com/robozushi10/items/31579e659b60efe54e75) 

　

以上
【1行野郎】複数パスを対象にディレクトリを列挙するが、特定ディレクトリのみ探索しない

# 実行内容

次の条件で「find パス -type d」をする.

**探索対象**
・/var/jenkins_home/ 以下
・/home/foo/ 以下

**抽出対象外**
・「.git」ディレクトリ
・「.cache」ディレクトリ
・エラー出力は破棄する

# 実行コマンド

```bash
$ echo /var/jenkins_home /home/foo | sed 's/\s\+/\n/g' | xargs -I@ find @ \( -type d 2>/dev/null -and \( -name '' -o -name '.git' -o -name '.cacahe' \) -prune \) -or \( -type d -and -print \)
```

　

# コマンドの説明

```bash
⬇️ 探索対象ディレクトリを空白区切りにして echo で出力する
$ echo /var/jenkins_home /home/foo | 
  ⬇️ 空白を改行に変換する
  sed 's/\s\+/\n/g' |
  ⬇️ echo で指定されたディレクトリを一つずつ find 実行させる
  xargs -I@ find @ \
                   \(
                      ⬇️ 🛑エラー出力を破棄する (アクセス権なし警告などを破棄する)
                      -type d 2>/dev/null \
                      ⬇️ 且つ
                      -and \
                      ⬇️ 🛑抽出対象外かつ探索対象外のディレクトリ名
                      \( -name '' -o -name '.git' -o -name '.cacahe' \) \
                      ⬇️ 上記の 🛑 2つを除外する
                      -prune \
                   \) \
                   ⬇️ 上記以外を対象にして -type d -and -print を実行する
                   -or \
                   \( -type d -and -print \)
```


**その他**
・処理速度を求めていたのでワンライナにしていただけであり、普段は好んでこのような複雑な記述はしない.
・fish shell v2.7.1 でも動作することを確認済み.
・上記コードはときどき使うが、私には暗記できずそのたびに自身のデータ置き場を漁っており効率悪であった.
・そこで、今回自身のメモも兼ねて Qiita に書き出すことにした.


## 参考にした記事

https://qiita.com/snaka/items/928d0d47f67bcee600b0

　

以上
VS Code 拡張機能メモ

#はじめに
- 「VS Code」に入れた拡張機能の自分用の覚書です。
 
#VS Codeで利用しているもの
- Python3
- Anaconda3
- Ruby
- Docker

#インストールしている拡張機能
##2021/08/12
![2020_0812_VSCode拡張機能.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843142/7e45d19e-c4b5-72f3-654b-f80f5903ddf8.jpeg)
JavaScript の import / export の基本を確認してみる

JavaScript にいつからか追加されたモジュール機能を今さらながら確認してみます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules

モジュールのエクスポートには、**名前付きエクスポート**と**デフォルトエクスポート**があります。

## export default

デフォルトエクスポートは、

```javascript:modules/sqare.js
export default randomSquare
```

の形式でエクスポートします。

```javascript:modules/sqare.js
function randomSquare() {
  console.log('random square')
}

export default randomSquare;
```

または

```javascript:modules/sqare.js
export default randomSquare() {
  console.log('random square')
}
```

モジュールをエクスポートしたら次の形式でインポートします。

```javascript:main.js
import randomSquare from './modules/square.js';
randomSquare() // random square
```

``import randomSquare``は次の簡略表現です。

```javascript
import { default as randomSquare } from './modules/square.js';
```


## 名前付きエクスポート

名前付きエクスポートをすると、インポートするときにモジュール名を指定することができます。

```javascript:modules/sqare.js
const name = 'square'
function draw() {
  console.log('draw in square.js')
}
export { name, draw }

export function reportPerimeter() {
  console.log('report perimeter in square.js')
}
```

モジュールのインポートはこちら。

```javascript:main.js
import { name, draw, reportPerimeter } from './modules/square.js';

console.log(name) // square
draw() // draw in square.js
reportPerimeter() // report perimeter in square.js
```

### モジュールオブジェクト

モジュール内でエクスポートされた機能をモジュールオブジェクトの中にインポートすることで、エクスポートされた機能をモジュールオブジェクトのメンバーとして扱えるようになります。

```javascript:main.js
import * as Module from './modules/square.js';

console.log(Module.name) // square
Module.draw() // draw in square.js
Module.reportPerimeter() // report perimeter in square.js
```
Font-awesomeをrail6で使ってみる

## インストールして設定する
yarnでfontawesomeをインストール

```ruby:ターミナル
yarn add @fortawesome/fontawesome-free
```
cssを読み込む

```css:application.css
*= require @fortawesome/fontawesome-free/scss/fontawesome
```
```scss:application.scss
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
```

jsを読み込む

```js:applicaiton.js
import '@fortawesome/fontawesome-free/js/all';
```
[公式HP](https://fontawesome.com/v5.15/icons?d=gallery&p=2)から使いたいアイコンを選んで、コードをコピーする

```erb:index.html.erb
<i class="fas fa-bars fa-2x"></i>
```

## 参考資料
[FontAwesome5 公式HP](https://fontawesome.com/v5.15/icons?d=gallery&p=2)
[【Rails】 font-awesome-sassの使い方を徹底解説！](https://pikawaka.com/rails/font_awesome_sass)
[【Rails】Rails6でFontAwesomeを導入・表示させるための手順を初心者向けに解説](https://techtechmedia.com/font-awesome-rails6/)
Seleniumの基本的な使い方メモ

#はじめに
- Seleniumは、ブラウザ操作を自動化するツール。
- Chrome を起動してGoogleのトップページの検索で「Python」を検索し、Chrome を閉じます。

#環境
- OS：Windows10 64bit
- 検証日：2021/08/12
- Anaconda：2021.05
- python：3.8.8
- selenium：3.141.0
- Google Chrome：92.0.4515.131（Official Build） （64 ビット）
- ChromeDriver：92.0.4515.107 

#サンプルコード
```python
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
```

```python
#Chrome を動かすドライバを読み込む
driver_path = "G:\home2021\Python\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(driver_path) 
```

```python
url = 'https://www.google.com/'
```

```python
#Chrome を起動
driver.get(url)
```

```python
#方法１：検索テキストボックスの要素をClass属性名から取得
search_box = driver.find_element_by_class_name("gLFyf")

#方法２：検索テキストボックスの要素をName属性から取得
#search_box = driver.find_element_by_name("q")

#方法３：検索テキストボックスの要素をタグ名から取得
#search_box = driver.find_element_by_tag_name('input')
```

```python
#検索テキストボックスに入力
search_box.send_keys('python')
```

```python
#方法１：Enterキーを押下して検索を実行
search_box.send_keys(Keys.ENTER)

#方法２：フォーム内のDOMをたどってフォーム要素を自動でsubmit
#search_box.submit()
```

```python
time.sleep(1)
```

```python
driver.quit()
```

#参考
[テスト自動化ツール「Selenium」のインストール・APIの早見表サイト](https://www.seleniumqref.com/index.html)
[Pythonでブラウザ操作を自動化するSelenium WebDriverの使い方](https://valmore.work/how-to-use-selenium-webdriver/#Selenium_WebDriver)
vue-cliでどうやってbuildされるのか（2）

## vue.config.jsとは？
vue-cliによって自動的にロードされる構成ファイル
ファイルはオプションを含むオブジェクトをエクスポートする必要がある

```js
// vue.config.js
module.exports = {
  // options...
}
```

## publickPath
タイプ：string
デフォルト：`/`
アプリケーションがデプロイされるベースURL
webpackの output.publicPath と同等
サブパスにデプロイしたい場合は 指定する必要がある `/my-app/`

## outputDir
タイプ：string
デフォルト：`dist`
本番ビルドファイルが生成されるディレクトリ
ターゲットディレクトリはビルド前に削除される

## assetsDir
タイプ：string
デフォルト： `''`
生成された静的アセットを配置するディレクトリ
生成されたアセットからファイル名、chunkFilenameを上書きする場合、assetsDirは無視される

## indexPath
タイプ：string
デフォルト：`index.html`
生成されたindex.htmlのoutputDirに対しての出力パスを指定します

## filenameHashing
タイプ：boolean
デフォルト：true
生成された静的アセットのファイル名には、キャッシュ制御を向上させるためのハッシュが含まれている

## page
タイプ：Object
デフォルト：undefined
マルチページモードでアプリをビルドします。
各ページには対応するJavaScriptエントリファイルが必要

```js
module.exports = {
  pages: {
    index: {
      // entry for the page
      entry: 'src/index/main.js',
      // the source template
      template: 'public/index.html',
      // output as dist/index.html
      filename: 'index.html',
      // when using title option,
      // template title tag needs to be <title><%= htmlWebpackPlugin.options.title %></title>
      title: 'Index Page',
      // chunks to include on this page, by default includes
      // extracted common chunks and vendor chunks.
      chunks: ['chunk-vendors', 'chunk-common', 'index']
    },
    // when using the entry-only string format,
    // template is inferred to be `public/subpage.html`
    // and falls back to `public/index.html` if not found.
    // Output filename is inferred to be `subpage.html`.
    subpage: 'src/subpage/main.js'
  }
}
```
【契約締結後・契約終了後】フリーランスエンジニアが気をつけるべき振る舞い方


# 発端
実にタイムリーな話題だが、７月に契約終了となったクライアントの報告書を未だに対応している。無償でだ。
契約で生きるフリーランスとして、無償対応は良い事ばかりではないよ、という事を言いたくて記事にしている。[^1]

# 経緯
契約期間内に納品物を上げて受領していただいたが、後日（契約期間終了後）に追加・修正依頼が飛び込んできた。
これ自体はエンジニアあるあるかもしれないが、依頼が１回、2回程度ならまだしも、なんだかんだで全部作り直し！みたいなレベルで要望されることもあったりする[^2]
当然だが「準委任契約」であるため、瑕疵担保責任は存在しない。

# やったことと考えたことの背景・前後関係
追加・修正依頼のうち、

- 納品物への指示の仕方が良くなかった（たとえば報告書などは、内容に具体的な指示がなくフォーマットに従って入力する事を想定していた等）
- 契約期間内に納品物を確認しなかった

という、クライアント側に非があり、

- 納品物への具体的な要望（たとえば報告書などは、どんな用途に使うか、何を受託側に期待しているか等）を確認しなかった
- クライアントが納品物を確認できる猶予日が業務の都合上１日しかなかった

という、受託側にも非があったため、私は善意で対応できる範囲で無償で行っている。

# ところが
一度修正希望が通ると、あれもこれも頼みたくなるのは仕方のないことだ。
そして、受託側は一度受けると、あれよあれよと全部対応しなければならない事になってしまいがちである。
駆け出しフリーランスの入門サイトでは「契約書をきちんと交わす事が大事」と教えてくれるが、契約後の事や契約終了後については全く情報が見つからない[^3]ので、こういった情報を残す。

# 結論
個別契約書で事後対応について明記する事にした。
[参考：自前の個別契約書.txt](https://github.com/shimajima-eiji/shimajima-eiji/blob/master/AgreeDoc/docs/individual.txt)

基本的にどこのクライアントも契約終了後については濁しているというか、対応について明記していない事がほとんどなので、弱い立場のフリーランスほど上記のような「なあなあの対応」が黙認されてしまっているように思う。
幸い、私はこういった「お金にならない仕事はやらない」主義なのできっぱりと追加報酬の交渉と、今まで対応した部分も含めて請求する事にしているが、フリーランス仲間に話すと「なかなかできない。泣き寝入りしている」という声が多かった。

# 本当にあった危ない話
これは別のクライアントで、私の話だが「契約期間は末日までにして、実務は一週間前倒しで完了できる場合」に合意したプロジェクトがあり、

- 予算としては一週間前倒しの分（便宜的に、これを対応終了日と呼ぶ）
- 契約期間はキリよく末日まで

という契約を交わした事がある。
これを「おいしいプロジェクト」と考えるか「やべープロジェクト」と考えるかは皆さんのフリーランス経験によって大きく異なるが、今回のように対応終了日の後に「契約期間内だからやって」と言われたら

- 報酬は対応終了日分
- 対応は契約期間いっぱい

というブラックな事になりかねない。

## 結末
直接のクライアントであれば交渉するが、間に別の紹介者がいたので、紹介者を経由して追加報酬を要求した。
別の紹介者の方には悪いと思ったが、紹介したクライアントが不誠実な対応をしているのは紹介者にも責任があるため、その分は負ってもらう事にした。

## どうすればよかったのか
良かれと思って、またはこの人ならと思って紹介しているので紹介者に負担が行くのは可哀想だとは思うが、フリーランスは**契約で信頼が成立するビジネスであること**を意識して、本当に信頼できるクライアントか、紹介して良いクライアントなのか見極めた上で仕事を回さないと、結果的に自分自信の信頼を落としてしまう事になる。
付き合いの浅いクライアントが「周りにいい人いない？」と相談をする事は多いが、**紹介された人に迷惑を掛ける可能性が考えられる場合**は安易に応じてはいけないと思った。

私から（後述するが）駆け出しフリーランス・エンジニアに仕事を紹介する時は、私が責任を取れる範囲でのみ厳選して紹介している。
場合によっては私自身の稼働調整をして、フリーランス・エンジニアを育成した事もあった（現在、育成は休活中）

# 近況
開発業務の傍ら、プログラミングスクールの講師業も行っており、これから副業エンジニアで稼ぎたい人も多くなっていることを感じているが、

- そもそも副業で稼ごうと思っても本業と掛け持ちは大変であること[^4]
- 未経験だと理想額を稼ぐのが大変であること[^5]
- 勉強しても案件が穫れるか分からないし、案件を完了できるかも分からないこと[^6]

は、必ず伝えている。
Qiitaを見る人はエンジニアリング（プログラミング）が何か分かっている人が来るので釈迦に説法だが、プログラミングスクールで副業エンジニアを目指す人はIT業界を知らないので、コードの書き方や環境構築の前に必ず現実を説明して、その上でこういった実践的な話を交えて「それでもプログラマーになりたいか？」と聞いている。

# 謝辞
執筆時点の[コミュニティ・ガイドライン](https://help.qiita.com/ja/articles/qiita-community-guideline)によると、エンジニア（プログラミングの知識と経験を活用している人）に有益な情報をもたらす（関係するかどうか）という観点で見れば問題ないという判断で書いている。

# 注釈
[^1]: 【無償対応をする・しない】人によって考え方が異なるためどちらが良いという話をしないが、私の経験則だと無償でやってもやらなくても次回契約が更新されたり、来年声が掛かる事に影響があった印象はない。プロジェクトの都合によって決まる印象。
[^2]: 【追加・修正で作り直し】運悪くこのケースにあたってしまったのだ
[^3]: 【契約後や契約終了後の情報】私の探し方が悪いのかも知れないし、ググラビリティが低いのかも知れない
[^4]: 【掛け持ちは大変】プログラミングが本業にも関わる事であればモチベーションも高まるが、全く異なる事をやると単純に考えることが２倍になり大変。それなら本業を捨ててプログラミングで稼ぐ方法を考えたほうが成功率が高い
[^5]: 【理想額が稼げない】月５万稼げれば大したもの。私が受け持った受講生ほぼ全員に「プログラミングスクール（めちゃくちゃ高い）で勉強して開発もやって稼ぐ時間があるなら、コンビニなりファストフード店でバイトした方が短期的には楽だよ」と伝えている。
[^6]:  【案件が穫れるか分からない】まず年齢のフィルターがあったり、スクールで勉強したからと言ってプログラミングができるわけではない事や、プログラミング以外に営業（または交渉）力が必要であったり、やることは非常に多い。そもそも未経験に仕事を任せるクライアントが少ない。
How to Convert Videos to iPad/iPhone Format for Free?

It is not particularly difficult to convert video files to the format supported by the iPad/iPhone, because now there are countless software to provide services for our conversion needs to make the whole process simple. Generally speaking, popular video formats are difficult to be compatible with Apple devices, which determines that your obsessive iOS device can only play files in pending formats, whether it is audio or video, which is created when you synchronize audio and video through iTunes. Although its support for audio is excellent, in terms of video, iTunes is far from satisfactory. On the other hand, as more and more video formats are allowed to be distributed as downloadable content, you may have found that the video you have now is not compatible with the iPad. This is where the video converter appears, which can help you convert audio Convert video to a format supported by iPad/iPhone in the shortest time.
Readmore: https://tchiase.info/how-to-convert-videos-to-ipad-iphone-format-for-free/
複数のラスターの解像度・範囲を同じにしたい


Rで、サイズ(範囲)と解像度がそれぞれ異なるラスターを同じ範囲・同じ解像度に揃えたい。ついでに座標系も変えます。

##環境
R ver4.1.0

##準備
範囲も解像度も異なるラスターを用意します。
raster packageを使用します。

```r:ras0.r
library(raster)

#1つ目: R1
R1=raster(nrows=1000, ncols=5000, extent(c(140.0,141.0,35.0,35.5)), crs=CRS("+init=epsg:4612"), vals=rnorm(5000000))

#2つ目: R2
rv2=rep(c(rep(1,200),rep(0,200),rep(2,200),rep(0,200),rep(2,200),rep(0,200),rep(1,200),rep(2,200),rep(1,200),rep(0,200)),1200)
R2=raster(nrows=1200, ncols=2000, extent(c(140.1,140.9,34.98,35.45)), crs=CRS("+init=epsg:4612"), vals=rv2)

#描画してみる
plot(R1)
plot(R2, add=T)

```

こんな感じに揃っていない2つのラスター（ちょっと適当に描画）
![Rplot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917414/273b7f60-c5e0-88b1-ab3d-2d84380f7dff.png "Result_ras0")


##0. 座標系を変更する
座標系を変えなくていいなら、ここはやらなくていいです。

```r:ras1.r
#測地座標系JGD2000(epsg:4612)からUTM座標系(3100)に変えます
#R1は連続値なのでbilinear、R2は整数値なのでngbを使いました
R1_3100=projectRaster(R1, crs=CRS("+init=epsg:3100"), method='bilinear')
R2_3100=projectRaster(R2, crs=CRS("+init=epsg:3100"), method='ngb')

#描画してみる
plot(R1_3100)
plot(R2_3100, add=T)
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917414/97212f9c-ff6b-8031-7cee-116b1c6897a6.png "Result_ras1")

##1. 切り抜く範囲と解像度の設定
最終的に欲しい範囲と解像度を持ったラスターを作成する。

```r:ras2.r
#切り抜きたい範囲の座標をe1で指定
e1=extent(c(420000, 480000, 3880000, 3920000))

#範囲がe1で、80行x120列(セルサイズは500)の解像度になるラスターを作る（値は入っていない）
#出来上がりはこのラスターのサイズ・解像度になります
R0=raster(nrows=80, ncols=120, e1, crs=CRS("+init=epsg:3100"), vals=NULL)

#この黒い線で囲んだ四角です
plot(R1_3100)
plot(R2_3100, add=T)
plot(e1, add=T)
```
![Rplot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917414/725a27be-e23b-0a70-30ba-ac12c5d47f73.png "Result_ras2")

##2. ラスターの範囲と解像度を揃える
`crop`ではなくて`resample`使います。

```r:ras3.r
#各ラスターをR0に合わせる感じです。
R1_crop=resample(R1_3100, R0, method ='bilinear')
R2_crop=resample(R2_3100, R0, method ='ngb')
```

##3. 整えたラスターたちをまとめる

```r:ras4.r
R_stack=stack(R1_crop, R2_crop)
names(R_stack)<-c("R1", "R2") #レイヤーの名前を変える

#出来上がり
plot(R_stack)

> R_stack
class      : RasterStack 
dimensions : 80, 120, 9600, 2  (nrow, ncol, ncell, nlayers)
resolution : 500, 500  (x, y)
extent     : 420000, 480000, 3880000, 3920000  (xmin, xmax, ymin, ymax)
crs        : +proj=utm +zone=54 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
names      :         R1,         R2 
min values : -0.1953975,  0.0000000 
max values :  0.2295911,  2.0000000 
```
![Rplot03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917414/ab1e35e7-9722-e1e4-36d4-2624017c4cbd.png "Result_ras3")
PYNQがWindowsとファイル共有できなくて困っている学生へ

# 概要
PYNQを買って公式のSetup Guide[^1]に従って設定を進めていったところ，Accessing Files on The Boardという項目がうまくいかなかったので原因を調べ，無事接続できるようになりました．
どうやらWindowsのEducationとEnterprise版のデフォルト設定のせい（設定によってはHomeも）みたいなので学校で借りてるPCでうまくいかん！みたいな人は読んでみてください．

# 環境
* ボード：PYNQ-Z1
* OS：Windows 10 Education 21H1 19043.1110
* PYNQ：v2.6.1

# 原因究明
まず，公式ガイド[^2]の通りにエクスプローラーのナビゲーションバーに\\\PYNQ\xilinx（hostnameというのはデフォルトではPYNQのはずです）と入れたところ，アドレスがあっているか確認してくださいみたいなエラーが出て接続できませんでした．次にPCの欄にあるネットワークドライブの割り当てというところにPYNQと入れたところ，「組織のセキュリティポリシーによって非認証のゲストアクセスがブロックされているため、・・・」というエラーが出ました．どうやら非認証のゲストアクセスというのがポイントみたいです．

公式サイト[^2]によると，WindowsのEducationとEnterprise版のWindows 10 1709から？ゲストアクセスが無効になってるらしいです．したがって，アクセスをゲストじゃなくする（解決方法１）か，ゲストアクセスを有効（解決方法２）にすればよいわけです．

# 解決方法１
PYNQとのアクセスに資格を与えます[^3]．まず，コントロールパネルから「ユーザーアカウント」->「資格情報マネージャー」と移動し，Windows 資格情報というのをクリックします．続いてその下のWindows 資格情報の追加というのを押すと次のような画面が出ます．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877656/850ae03e-e8c9-d5c9-ba78-a04f850459e6.png" width=80%>
インターネットまたはネットワークのアドレスはデフォルトではPYNQで大丈夫なはずです．Windows君が勝手に解決（IPアドレスに変換）してくれます．ユーザー名，パスワードはPYNQのそれにします．デフォルトではどちらもxilinxです．OKを押して，次のような画面になれば完了です．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877656/b77191e0-9ddc-a94e-19fa-1ac80e3db15d.png" width=80%>

エクスプローラーに戻って，ナビゲーションバーに\\\PYNQ\xilinxと入れるとパスワードを聞かれます．ここにxilinxと入れれば無事PYNQのファイルにアクセスできるはずです．

# 解決方法２（非推奨）
公式サイト[^2]の下のほうに書いてある通り，ゲストアクセスを有効にすることでも解決できますが，"クライアントのセキュリティが低下Windowsされ"るので非推奨です．

* キーボードのWindowsキーとRキーを同時に押してgpedit.mscと入力
* 「コンピューターの構成」→「管理用テンプレート」→「ネットワーク」→「Lanman ワークステーション」と移動して「安全でないゲストログオンを有効にする」をダブルクリック
* 「有効」を選び、OKをクリック
* Windowsを再起動

上記を実行したのち，エクスプローラーで\\\PYNQ\xilinxにアクセスすればいけるはずです．

# 参考うらる
[^1]: https://pynq.readthedocs.io/en/v2.6.1/getting_started/pynq_z1_setup.html
[^2]: https://docs.microsoft.com/ja-jp/troubleshoot/windows-server/networking/guest-access-in-smb2-is-disabled-by-default
[^3]: https://www.syuheiuda.com/?p=4414
[Word,Excel,Power Point]Officeのファイルから画像を取り出す処理をコードで自動化

[本記事は、自分サイトのこの記事と同一内容です。](https://hagiayato.github.io/my-site/jekyll/update/2021/08/13/OfficeImg.html)
# はじめに
皆さんは、こういう話を聞いたことありますか?

- 最近のOffice(Word,Excel,Power Pointなど)のファイルの正体はzipファイル
- Officeのファイルについて、拡張子をzipにして解凍すると、使用画像を取り出せる

これは事実であり、詳細は下記記事に記載されています。
[パワーポイント、ワードから画像を取り出す。](https://qiita.com/msht0511/items/4f5b1552c92dddbc763d)
でも、いちいちファイルの拡張子を変えて、解凍して、画像を取り出す…というのは面倒!!
そんなわけで、この処理を自動でおこなうC#コードを作りました。

# 解説
ソースコートは下記リンクに貼ってあります。
[Program.cs](https://github.com/HagiAyato/OfficeImg/blob/main/OfficeImg/OfficeImg/Program.cs)

####仕様

- ドラッグアンドドロップをしたOfficeファイルについて、使用画像を取り出す
- 複数ファイルのドラッグアンドドロップにも対応
- 取り出した画像は、ドラッグアンドドロップしたファイルと同じ階層に置く
- 対応拡張子は下記の通り
 - Word:".docx",".docm",".dotx",".dotm"
 - Power Point:".pptx",".pptm",".ppsx",".ppsm",".potx",".potm"
 - Excel:".xlsx",".xlsm",".xltx",".xltm"
 - Open Document:".ods",".odt",".odp"

####処理の流れ

1. ファイルの存在チェック
1. ファイルの拡張子チェック
1. ファイルを解凍
1. 解凍したフォルダから画像ファイルを取り出す
1. 解凍したフォルダ削除

###  ファイルの存在チェック
今回のプログラムでは、コマンドライン引数で処理対象ファイルのパスを受け取ります。(fname)
それが実在しないファイルだと困るので、ファイルの存在チェックをします。

```Program.cs
// ファイルの存在チェック
if (!File.Exists(fname))
{
    Console.WriteLine("ファイルが存在しません。");
    continue;
}
```

###  ファイルの拡張子チェック
ファイルが存在しても、処理に非対応のファイルでは困ります。
なので、拡張子でファイルが処理に対応しているか確認します。

```Program.cs
string type = "", extension = "";
extension = Path.GetExtension(fname);
switch (extension)
{
    case ".docx":
    /** 中略 **/
    case ".dotm":
        type = "word";
        break;
    case ".pptx":
    /** 中略 **/
    case ".potm":
        type = "ppt";
        break;
    case ".xlsx":
    /** 中略 **/
    case ".xltm":
        type = "xl";
        break;
    case ".ods":
    /** 中略 **/
    case ".odp":
        type = "";
        break;
    default:
        Console.WriteLine("対応のファイルではありません。");
        continue;
}
```

### ファイルを解凍

fnameはzipファイルでなく、コマンドライン引数で受け取ったOfficeのファイルパスです。
解凍元ファイルの拡張子は、zipにせずOfficeのファイルのままでも問題ありません。

```Program.cs
// ファイルを展開
/** 中略 **/
ZipFile.ExtractToDirectory(fname, unzipDir);
```

### 解凍したフォルダから画像ファイルを取り出す

.netには、フォルダ内の全ファイル・フォルダをコピーする関数がありません。
なので自作する必要があります。
**DirectoryUtil.Copy**がこれに当たり、**[このサイト](https://kan-kikuchi.hatenablog.com/entry/DirectoryProcessor)**の**CopyAndReplace**関数と処理は同じです。

```Program.cs
// 解凍したフォルダから画像ファイルを取り出す
string mediaDir = unzipDir + "/" + type + "/media";
/** 中略 **/
DirectoryUtil.Copy(mediaDir, directoryName + "/" + fileName + extension + "_media");
```

### 解凍したフォルダ削除

最後に、解凍したフォルダを削除します。

```Program.cs
// zipファイルと解凍したフォルダ削除
Directory.Delete(unzipDir, true);
```

# 蛇足
~~~本当は[PDFMerger](https://qiita.com/hagii-x/items/7f5d928f36b9cc68dc00)と同様に実行ファイルを公開したいのですが、Visual Studio Codeで実行ファイルを作成するとどうしても個人情報入りのファイルがないと実行できない状況となり、公開ができません。
どうにかできないかな…~~~
⇒フレームワークを.net Coreから.net Frameworkに変更したことで、ソフトの公開ができました。
[ソフトのDLリンク](https://github.com/HagiAyato/OfficeImg/releases/)
抜き出した画像の著作権・肖像権に気を付けつつご利用ください。
[Report 1] 応用数学

ラビットチャレンジの提出課題

#応用数学
1. 線形対数

M×N個の数を長方形に並べて()で括ったものをM行N列の行列という。M=Nのときの行列を正方行列と呼ぶ。正方行列のとき、固有値分解ができる(λE-Aが正則行列でないとき)。それ以外の行列のときは、特異値分解ができる。逆行列が存在するとき、その行列を正則行列と呼び、-1(インバース)をつけて示す。逆行列を求めるとき、求めたい行列の右側に単位行列を追加して、左側が単位行列になるまで行の計算を繰り返す。行列の行と列を入れ替えた行列を転置行列といい、tをつけて示す。2×2の行列A、Bがあったとき、掛け算は可能であるが、基本的に可換ではない。M×N1の行列A、N2×Lの行列Bがあったとき、N1=N2であれば掛け算ができる。

2. 確率・統計

サイコロの目などを整数で表し、それに対応する確率が存在するとき、確率変数と呼ぶ。サイコロの目などは離散確率変数、身長などの連続値の場合には連続確率変数と呼ぶ。確率変数がどのような値をとるのか期待されるかという意味で、確率変数と確率の積の和で表される値を期待値と呼ぶ。確率分布の散らばりの具合を分散、分散の平方根を標準偏差、2組のデータのばらつき具合を共分散と呼ぶ。確立分布には、正規分布、二項分布、ベルヌーイ分布、。推定量とは計算式やパラメータのことで、推定値は予想される値のことでハットをつけて示す。和事象(和集合)では、加法定理が成立し、AとBの事象が排反であるときはP(A∪B)=P(A)+P(B)であり、排反でないときP(A∪B)=P(A)+P(B)-P(A∩B)で計算できる。AとBが排反でないときにAが起こる条件下でBが起きる確率を条件付き確率といい、P(B│A)=(P(A∩B))/(P(A))と表す。

3. 情報理論

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/e95499ca-bdf3-2890-6ffa-c31f6b4d7177.png)
自己情報量とは情報の珍しさを表すもので、底が２のとき単位はbit、底がeのとき単位はnatで示す。シャノンエントロピーとは自己情報量の期待値であり、機械学習させるときに誤差関数の代わりとしても使える(エントロピー最大)。カルバック・ライブラー　ダイバージェンスで、ダイバージェンスは距離の意味に近く性質の近さを意味する。情報利得ともいう。交差エントロピーはKLダイバージェンスの一部分を取り出したもので、Q(想定していた確率)についての自己情報量をP(実際の確率)の分布で平均している。

○演習問題

以下、画像を添付している。
![IMG_1863.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/ec990e86-a8e4-1148-674d-0e6506db080c.jpeg)

![IMG_1869.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/98556dcf-ca14-1a0c-eaf4-d7755dae63ac.jpeg)
![IMG_1864.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/d270c280-a8ee-d76c-2082-b4ee933fbe08.jpeg)
![IMG_1865.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/6dddcce0-5180-9e99-9f68-8a12ec320217.jpeg)
![IMG_1866.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/fbf37b02-6b9c-56ed-c84d-21df04ec6ee8.jpeg)
![IMG_1867.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/76cd2b04-e353-c288-30f0-8d8611ec923d.jpeg)
![IMG_1869.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/98556dcf-ca14-1a0c-eaf4-d7755dae63ac.jpeg)
![IMG_1870.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878056/c65b08a7-1cea-a6bb-9478-0adac145ebaf.jpeg)
zsh(ジーシェル)の導入

#zshとは
zshとはシェルの種類のひとつ

```
$ brew install xxxxx
```

*シェルとは人間が入力した命令をコンピューターに伝えるプログラム

#シェルの種類

⚫︎シェルの種類(よく使われているもの)
・bash(バッシュ)
・zsh(ジーシェル)
ターミナルを開いた時に上にzshと記載されていれば現在選択されているシェルはzsh

#zshのインストール
Homebrewでzshを導入する

```
$ brew install zsh

$ brew install zsh-completions

#上の2つを同時にやるには
$ brew install zsh zsh-completions

```

#ログインシェルの変更

⚫︎vimで　/etc/shellsを修正

```
$ sudo vim /etc/shells

#上のコマンドを入力後passwordが聞かれMacを起動する時のパスワードを入力



# 省略

usr/local/bin/zsh  #追記

```
*sudo　は　(super user do)管理者権限で実行するの意味

⚫︎chshコマンドでシェルを変更する

```
$ chsh -s/usr/local/bin/zsh

#パスワードを聞かれるが上と同じ
#ターミナルを開き直すとzshに変わる。

```


#設定ファイルのコピー
⚫︎シェルごとに異なる設定ファイル

1 zsh
代表的な設定ファイル

```
.zshrc
```

2 bash
代表的な設定ファイル

```
.bash_profile
```

Vimで確認する時

```
$ vim ~/.bash_profile  #bashで確認もできる

$ less ~/.bash_profile 　　　　　　　　　　　#lessを使うと行数が書かれていない状態で確認できる
#bashを使っていない場合はbashを使っていないと使えない

$ vim ~/.zshrc  #zshの中を確認できる

#新しく導入されていない場合は上でコピーしたものを貼り付ける。

```
Hit&Blow（ヒットアンドブロー）のソルバーをpythonで書いてみた

## はじめに
先日、世界のアソビ大全をやっていたのですが、「ヒット＆ブロー」っていうNumer0n（ヌメロン）みたいなやつが面白かったのでソルバーを作ってみました。

## 仕様
青→１ 赤→２　緑→３　黄→４　紫→５　白→６
で４つの数字とヒット・ブローの判定結果を入力することで、正解の候補を出力します。

## コード
言語はPythonを使用しました。
※答えの同色はなしがデフォルトで設定されています。

```python:solver.py
import copy

def same_number_check(lst):
    for i in lst:
        if lst.count(i) >= 2:
            return True
    return False

def h_and_b_check(a_lst, b_lst):
    x = 0
    y = 0
    for i in range(4):
        if a_lst[i] == b_lst[i]:
            x += 1
            y -= 1
    for i in a_lst:
        if i in b_lst:
            y += 1
    
    return x, y

def answer_check(n_lst, h, b): 
    for i in range(len(answer)):
        if flag[i]:
            x, y = h_and_b_check(answer[i], n_lst)
            if h == x and b == y:
                pass
            else:
                flag[i] = False

answer = []

for i in range(5556):
    t = list(str('{0:04d}'.format(i)))
    t_int = [int(s) for s in t]
    if 6 in t_int or 7 in t_int or 8 in t_int or 9 in t_int:
        pass
    else:
        answer.append(t_int)

flag = [True]*len(answer)

# 同色なしの場合
for i in range(len(answer)):
    if same_number_check(answer[i]):
        flag[i] = False

while True:
    numbers = list(map(int, input().split()))
    h, b = list(map(int, input().split()))
    plus_numbers = list(map(lambda x: x-1, numbers))
    answer_check(plus_numbers, h, b)
    for i in range(len(answer)):
        if flag[i]:
            plus_answer = list(map(lambda x: x+1, answer[i]))
            print(plus_answer)
```

Github↓
[kk0195736/hit-and-blow-solver](https://github.com/kk0195736/hit-and-blow-solver)

## おわりに
これで無双できる。