OmniAICreator/Qiita-1.07M huggingface dataset:
ls の実行結果を for 文で処理するワンライナー

# やりたいこと

1階層上に複数あるディレクトリの中にあるファイルを今いるディレクトリに全てコピーすること。

つまり、これを↓

```bash:Before
$ tree -c
.
├── a
│   └── a.text
├── b
│   └── b.text
└── c
    └── c.text
```

こうしたい↓

```bash:After
$ tree -c
.
├── a
│   └── a.text
├── b
│   └── b.text
├── c
│   └── c.text
├── a.text
├── b.text
└── c.text
```
そのときに『 ls の実行結果を for 文で処理するワンライナーがあればうまく行くのに、、、』と思ったので、それを試してみた備忘録になります。

# ls の実行結果を for 文で処理する方法

## 複数行の場合

```bash:複数行（一般化）
$ for a in $(ls .); do
   実行させたい処理
done
```

```bash:複数行（サンプル）
$ for a in $(ls .); do
   echo $a
done

（実行結果）
a
b
c
```

## ワンライナーの場合

```bash:ワンライナー（一般化）
$ for a in $(ls .); 実行させたい処理 $a; done
```

```bash:ワンライナー（サンプル）
$ for a in $(ls .); do echo $a; done

（実行結果）
a
b
c
```

※ `echo $a;` の `;` を忘れずに。

## ワンライナーで for 文を2週することも可能


```bash:ワンライナーでfor文を2週
for a in $(ls .); do for b in $(ls $a); do echo "$a/$b"; done; done

（実行結果）
a/a.text
b/b.text
c/c.text
```


# やりたいことをやってみる

やりたいこと：1階層上に複数あるディレクトリの中にあるファイルを今いるディレクトリに全てコピーする

## 失敗例

```bash
$ for a in $(ls .); do cp -p "$a/*" . ; done

（実行結果）
cp: a/*: No such file or directory
cp: a.text/*: Not a directory
cp: b/*: No such file or directory
cp: b.text/*: Not a directory
cp: c/*: No such file or directory
cp: c.text/*: Not a directory
```

なんか怒られた、、、
こういう書き方だと`*`（ワイルドカード）が展開されないみたいですね。。。

## 成功例

ワイルドカードを使わずに素直に2周させてみました。

```bash
$ for a in $(ls .); do for b in $(ls $a); do cp -p "$a/$b" .; done; done

$ tree -c
.
├── a
│   └── a.text
├── b
│   └── b.text
├── c
│   └── c.text
├── a.text
├── b.text
└── c.text
```

いけた！
AnsibleでKnownHostsを書き換える

### 要点

SSHで初回ホスト接続時に出る確認だったりホスト更新したときにエラー吐かれたりするにっくきknown_hostsを自動的に
inventoryの全サーバから全サーバについて更新する


```yaml:playbook.yaml
- name: remove known_hosts
  file:
    path: "/home/{{ item }}/.ssh/known_hosts"
    state: absent
  with_items:
    - testuser

- name: send known_hosts
  shell: "ssh-keyscan -H {{ item }} >> ~/.ssh/known_hosts"
  with_items:
    - "{{ groups['all'] }}"
  become_user: testuser
```

### 雑感
標準モジュールのknown_hostsだと一致する行については上書きでにやってくれるんですが
ちょっと書き換えてから削除をせずに実行すると古い行残ったまま追記されてしまったりしたり
Keyをしていしなければいけなかったりと、設定項目が多かったのですが、コマンドではホストのみでいけるのが楽な点…かなと
プログラミング初めて３ヶ月

はじめまして！
shikichanと言います。

未経験でWEB系企業に転職する為、6月半ばからプログラミングを始めました！
まずは、progateでHTML&CSSを始めました。初学者にはこれがいいそうです。
![54798AC7-69BB-4987-999F-81D39159C1C7_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699159/8994f230-f16d-0312-d0c5-74c7fa81468c.jpeg)
これは7月途中のものです。ボチボチ受講しています。

1ヶ月半でだいたいlev.200までいけました。そろそろアウトプット出さないといけないと思い、8月からポートフォリオの作成に取り掛かっています。

これからも引き続きよろしくお願いします。
PHPによる数値の諸処理と乱数


#目次
[数値を3桁ごとに区切る](#数値を3桁ごとに区切る)
[数値を小数点以下まで表示させる](#数値を小数点以下まで表示させる)
[乱数を生成する](#乱数を生成する)
[ランダムな文字列を作成する](#ランダムな文字列を作成する)
[ユニークIDを生成する](#ユニークIDを生成する)

#数値を3桁ごとに区切る
``number_format()``関数を使う
第二引数で指定した小数点の桁より下は切り捨てられる
引数を指定しない場合は小数点以下が切り捨てられる
有効桁数は14桁でそれ以上はプラットフォームによる

```example.php
echo number_format('98765432.1'); //98,765,432
echo number_format('110', 2); //110.00
```
#数値を小数点以下まで表示させる
``sprintf()``関数か``number_format()``関数を使う

``sprintf()``関数を使う場合は``%02f``のように指定すると少数第二位までの表示が、``%05f``とすると少数第五位までが表示できる

``number_format()``関数を使う場合は第二引数に小数点第何位までを表示するか指定することができる
カンマ区切りが不要な場合は第三引数にピリオド、第四引数に空文字を指定する
#乱数を生成する
``mt_rand()``関数を使う

```example.php
mt_rand(int $min, int $max): int
```
引数を設定しない場合は0から``mt_getrandmax(): int``の値を返す
乱数を生成する場合はシード値を基にして決まった計算方法で求められるため、
同じシード値からは同じ値が同じ順番で生成されるため、暗号学的に安全ではない
``mt_rand()``関数のシード値は自動的に決められるため設定はいらない
#ランダムな文字列を作成する

```example.php
<?php
//generateRandomString()関数
//第一引数には文字数
//第二引数には使用する文字
function generateRandomString(int $len, string $elem = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=/!@#$%^&*()_+~`'): string
{
	if ($len <= 0) return false;
	if (!preg_match('/\A[\x21-\x7e]+\z/', $elem)) return false;
	$chars = preg_split('//', $elem, -1, PREG_SPLIT_NO_EMPTY);
	$chars = array_unique($chars);
	$bytes = getRandomBytes($len);
	if (strlen($bytes) <= 0) return false;
	$str = '';
	$charsLen = count($chars);
	for ($i = 0; $i <= $len; $i++) {
		//バイト文字からASCII値を取得して剰余演算で配列の添字を決定
		$str .= $chars[ord($bytes[$i]) % $charsLen];
	}
	return $str;
}

//getRandomBytes()関数
//暗号学的に強いアルゴリズムで生成した乱数のバイト文字列を返す
function getRandomBytes(int $len): string
{
	$bytes = '';
	if (function_exists('openssl_random_pseudo_bytes')) $bytes = openssl_random_pseudo_bytes($len, $usable);
	if ($usable == false) $bytes = '';
	return $bytes;
}
```
``暗号学的に安全な関数``
``OpenSSL拡張モジュール``が必要なので``function_exists())``関数でチェック

#ユニークIDを生成する
``uniqid()``関数を使用する
第一引数を空文字で実行すると``13``文字の文字列が生成される
第一引数に文字列を指定するとそれが文頭につく
第二引数に``true``を指定すると``23``文字のより推測されにくい文字列が生成される

```example.php
echo uniqid(); //xxxxxxxxxxxxx
echo uniqid('', true); //xxxxxxxxxxxxxxxxxxxxxxx
echo uniqid('no.'); //no.xxxxxxxxxxxxx
```
``uniqid()``関数はマイクロ秒単位で変化するので同じマイクロ秒であれば同じIDが生成されてしまう可能性がある
``mt_rand()``関数で乱数を指定すれば異なるIDを生成できる
``md5()``関数を使うことで桁数の揃ったIDを生成できる

```example.php
echo md5(uniqid(mt_rand(), true))
```
【PHP】require_onceで相対パスで開けないときは__DIR__を使えば良いんじゃ...

#require_onceで相対パスで開けないときは__DIR__を使えば良いんじゃ...
##require_onceで相対パスは合っているはずなのに開けない
最初に遭遇したエラー。
相対パスは合っているはずなのに開けない。

>/
    - A.php
    - D.php
    - Class/
   　　　- B.php
   　　　    - C.php
  上記のようなディレクトリ構造の場合を考える。
B.phpでC.phpを読み込み、さらにA.phpでB.phpを読み込むとエラーが発生する。
>>「PHPでは、「実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになる」っていう規則があるためエラーとなってしまうのです。 この問題は、実行ファイルのディレクトリではなく、参照しているファイルのディレクトリを基にパスを取得することで回避できます。」

>A.phpを実行しているので、 B.phpのrequire_once(“C.php”)はA.phpと同階層のC.phpを探してエラーになるようです。
https://blog.leko.jp/post/fix-require-relative-path-of-php/

調べるとどうやらrequire_onceは絶対パスを使用した方が良いとのこと。
それには、

**require_once(dirname(\_\_FILE\_\_) . '/C.php')**とする方法と
**require_once(\_\_DIR\_\_ . '/C.php')**とする方法がある。

dirname(\_\_FILE\_\_)および\_\_DIR\_\_でカレントディレクトリ(つまり、現在のディレクトリ)を取得できる。

###dirname(\_\_FILE\_\_)および\_\_DIR\_\_とは

**dirname(\_\_FILE\_\_)**
>親ディレクトリのパスを返します。 path にスラッシュが無い場合は、 カレントディレクトリを示すドット ('.') を返します。それ以外の場合は、スラッシュ以降の /component 部分を取り除いた path を返します。
https://www.php.net/manual/ja/function.dirname.php

**\_\_DIR\_\_**
>そのファイルの存在するディレクトリ。include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。 つまり、これは dirname(__FILE__) と同じ意味です。 ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。
https://www.php.net/manual/ja/language.constants.predefined.php

\_\_DIR\_\_はマジカル定数(PHPで自動的に定義される定数)。

###dirname(\_\_FILE\_\_)および\_\_DIR\_\_の違いは
* dirname(\_\_FILE\_\_) ⇒ PHP5.2以前でも使用できる
* \_\_DIR\_\_ ⇒ PHP5.3以降で使用できる

##dirname(\_\_FILE\_\_)および\_\_DIR\_\_を試しているのにエラーが発生する
カレントディレクトリを確認しようとvar_dumpで確認してみると、なんと、カレントディレクトリが取得できていない！
どうやらディレクトリ名が日本語のため取得できなかったらしい。
日本語から英語に変更したところカレントディレクトリを取得できた。

###日本語名のディレクトリを使用したいときはどうすれば良いのか

>basename関数では、mbrlen関数を使用しているようで、こちらでは1バイト文字かつバックスラッシュという条件のようです。こちらではdirname関数のような現象は起きません。basename(__FILE__)とすれば正しくファイル名が返却されます。もしdirnameと同じような処理であれば、ファイル名にディレクトリ名が混入することになります。
https://qiita.com/TaMaMhyu/items/63386f610a839b9511eb

どうやら**basename**を使用すると良いらしい。**\_\_DIR\_\_**に関してはそういった対処法はないため日本語表記のディレクトリは使用できなさそう。

ディレクトリ名に日本語を使うのはやめた方が良さそうだね。
時系列解析 実装詰まったところ -備忘録-

# 前提
時系列解析の本
https://www.amazon.co.jp/%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90-%E8%87%AA%E5%B7%B1%E5%9B%9E%E5%B8%B0%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E7%8A%B6%E6%85%8B%E7%A9%BA%E9%96%93%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5-Advanced-%E5%B3%B6%E7%94%B0-%E7%9B%B4%E5%B8%8C/dp/4320125010/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90&qid=1600932241&sr=8-1

# 問題点1
ARモデルをAICによって決定する

```python
# importは通常通りの実装
model = ar_model.AR(y)
for i in range(20):
    results = model.fit(maxlag=i+1)
```
では、以下のエラーが発生する

```text
RuntimeError: 
Model has been fit using maxlag=1, method=cmle, ic=None, trend=c. These
cannot be changed in subsequent calls to `fit`. Instead, use a new instance of
AR.
```

#### 試したこと
コード

```python
model = ar_model.AR(y)
results = model.fit(maxlag=1)
print(results.aic)
results = model.fit(maxlag=2)
print(results.aic)
```

出力結果

```python
10.623349835083612
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-30-956416629a7e> in <module>
      2 results = model.fit(maxlag=1)
      3 print(results.aic)
----> 4 results = model.fit(maxlag=2)
      5 print(results.aic)

/opt/conda/envs/timeseries/lib/python3.8/site-packages/statsmodels/tsa/ar_model.py in fit(self, maxlag, method, ic, trend, transparams, start_params, solver, maxiter, full_output, disp, callback, **kwargs)
   1349         fit_params = (maxlag, method, ic, trend)
   1350         if self._fit_params is not None and self._fit_params != fit_params:
-> 1351             raise RuntimeError(REPEATED_FIT_ERROR.format(*self._fit_params))
   1352         if maxlag is None:
   1353             maxlag = int(round(12 * (nobs / 100.0) ** (1 / 4.0)))

RuntimeError: 
Model has been fit using maxlag=1, method=cmle, ic=None, trend=c. These
cannot be changed in subsequent calls to `fit`. Instead, use a new instance of
AR.
```

# 解決策1
コード

```python
for i in range(20):
    model = ar_model.AR(y_diff)
    results = model.fit(maxlag=i+1)
    print(f'lag = {i + 1}\taic : {results.aic}')
```
期待通りの結果が得られる
Ruby_work　基礎問題

# 模範解答

```ruby:work.rb


##### 問題1（四則演算とif文の復習） #####
# 以下のif文の後にコードを記述して、正しい表示がされるようにしてください

number = 5

if number % 2 == 0
  puts "偶数です"
else
  puts "奇数です"
end

##### 問題2（式展開の復習） #####
# 以下の表示がされるよう、コードを記述してください

name = "山田" 

# 「私は●●です」と表示されるよう記述してください

puts "私は#{name}です"

##### 問題3（配列の復習） #####
# 以下の①から④についてコードを記述してください

# ①"田中","佐藤","山田"という名前が3つ入ったstudentsという配列を定義してください。
students = ["田中", "佐藤", "山田"]

# ②①でつくった配列に"鈴木"を追加してください。
students << "鈴木"

# ③②でつくった配列をターミナルに出力してください
puts students

# ④配列の中から番号を指定して"佐藤"を取り出し、ターミナルに出力してください
puts students[1]

##### 問題4（ハッシュの復習） #####
# 以下の①から③についてコードを記述してください

# ①下記のsasakiというハッシュの中から、"東京"を取り出してターミナルに出力してください
sasaki = {from: "東京", age: 30}

puts sasaki[:from]

# ②sasakiというハッシュにjob:というキーで"teacher"というバリューを追加してください
sasaki[:job] = "teacher"

# ③②で追加したjobというキーのバリューをターミナルに出力してください
puts sasaki[:job]


```

## いかがだったでしょうか？
何か少しでもご不明点がございましたら、メンターに気兼ねなくご質問ください！
詳しい解説などもさせていただきます！！
[:telephone_receiver:テックコネクトはこちら](https://master.tech-camp.in/connect/mentor)
EC2インスタンスのボリューム拡張をダウンタイムなしで実施した話

# EC2インスタンスのボリューム拡張をダウンタイムなしで実施した話

## お久しぶりです

多忙であまり書けてませんでした。
弊社で利用しているjenkinsサーバー(AWS EC2インスタンス)にて、アタッチしているEBSの空き容量がカツカツになってきたので拡張したいと思います。

参考にしたのは[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)

## 前準備

前準備というよりは確認ですね。

```bash
## ブロックデバイスを表示するコマンド
$  lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
abcdn1       259:0    0  150G  0 disk 
├─abcdn1p1   259:1    0  150G  0 part /
└─abcdn1p128 259:2    0    1M  0 part 

## 対象のデバイス
##     150GBしかない状態
$ df -h | grep abcdn1 
/dev/abcdn1p1   150G  125G   26G   83% /
```

ほんとカツカツ。
不要なジョブの削除などを行って対応してましたが、ボチボチしんどくなってきたのでストレージ拡張を提案した次第です。

「ダウンタイムなし」とは言ったものの、流石にバックアップは取りたい。

1. 対象インスタンスにSSHログインし、dockerなどを停止
1. AWSのコンソールにて、対象のEC2インスタンスを停止
1. ルートデバイスとして表示されている「/dev/xvda」のスナップショット作成開始
1. 2,3分で完了
1. 対象インスタンスを起動
1. SSHログイン後、dockerなどを起動し各種サービスを手動で起動

とりあえずスナップショットは取得しました。
ちなみに業務時間中のお昼休みに作業を行ったので、 

$$誰も利用していない = 利用されてないからダウンしていない$$

ってことにしておきます。

集計バッチとかは、当日であればいつ動作しても支障がないように組んであるので問題ありませんでした。

## EBSのサイズ拡張

- AWSコンソールにて
  1. EC2→インスタンス→対象インスタンスを選択
  1. [説明]→ルートデバイスに表示されているEBS IDからデバイスを開く
  1. アクション→ボリュームの変更→サイズを変更
  1. デバイスの容量拡張開始 → 完了まで1時間ほどかかりました

150GB → 500GBへの拡張で約１時間ほど要しました。
想定よりも長かったです。

```bash
## 「abcdn1」デバイスの容量が500GBになったが、
## パーティションの容量はまだ150GBのまま
$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
abcdn1       259:0    0  500G  0 disk 
├─abcdn1p1   259:1    0  150G  0 part /
└─abcdn1p128 259:2    0    1M  0 part 
```

デバイスの容量は増やしたのでパーティションの領域を拡張

```bash
## ルートボリューム「abcdn1」の「abcdn1p1」パーティションを拡張
$  sudo growpart /dev/abcdn1 1
CHANGED: partition=1 start=4096 old: size=314568671 end=314572767 new: size=1048571871,end=1048575967

## 「abcdn1p1」パーティションが拡張された
$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
abcdn1       259:0    0  500G  0 disk 
├─abcdn1p1   259:1    0  500G  0 part /
└─abcdn1p128 259:2    0    1M  0 part 

## しかし、まだストレージ自体は150GBしかない状態
$ df -h | grep abcdn1
/dev/abcdn1p1   150G  125G   26G   83% /
```

ファイルシステムの拡張を行わないといけない模様。

```bash
## 「/dev/abcdn1p1」のファイルシステムを拡張
$ sudo xfs_growfs /dev/abcdn1p1
data blocks changed from 39321083 to 131071483

## 正常に認識されました
$ df -h | grep abcdn1
/dev/abcdn1p1   500G  125G  376G   25% /
```

docker、及びdocker-composeが動作している状態でもEBSの拡張ができました。
とはいえ保険としてバックアップは必要で、バックアップ時にはインスタンス停止させるんですけども。
【Java】二次元配列を拡張for文で回す方法

#拡張for文

```java
for(型 変数名： 配列){
}
```
：の右の配列を左の変数に代入しながらループを回すという手法を組み合わせて二次元配列を展開するにはどうしたら良いか、一瞬迷ったのと、PHPのように

```PHP
foreach($datas as $key => $value){
　for($i = 0; $i < count($value); i++){
    $value[i] = 0;
  }
}
```
foreachを使うことも思い浮かべたけど、javaでは別のオブジェクトを生成しないといけないみたいなので、なんとかしたいなと思いました。

#拡張forを2回書けば済む話

```java
public class Control {

	public static void main(String[] args) {
		int[][] datas = {
				{0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,1,1,1,1,1,0},
				{0,0,0,0,0,0,1,1,1,1,0},
				{0,0,0,0,0,1,1,1,1,1,0},
				{0,0,0,0,1,1,1,1,1,1,0},
				{0,0,0,1,1,1,1,1,0,1,0},
				{0,0,1,1,1,1,1,0,0,0,0},
				{0,0,0,1,1,1,0,0,0,0,0},
				{0,0,0,0,1,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0},
		};
		for(int[] data : datas ) {
			for(int value : data) {
				if(value == 0) {
					System.out.print("  ");
				} else {
					System.out.print("* ");
				}
			}
			System.out.println(""); // 入れ子になっている配列の展開が終わったら改行
		}
		
				
	}
}
```

```:実行結果
                      
          * * * * *   
            * * * *   
          * * * * *   
        * * * * * *   
      * * * * *   *   
    * * * * *         
      * * *           
        *             
                      
```

####別に悩むほどのことでもなかったけど、foreachが別のオブジェクトを生成しないと使えないという点は少し不便に感じたし、「それも覚えないといけないのか」と思うとちょっとびっくりしたので、メモ書きとして残しておきます。
CentOS 8 で Docker CE(公式) を使う

2020/9/18 に、ようやく [公式に Docker CE の CentOS 8 版がリリースされた](https://github.com/docker/for-linux/issues/873#issuecomment-694654334)ようです。
ので、インストール手順をメモ。

なお、パッケージ本体は https://download.docker.com/linux/centos/8/x86_64/stable/Packages/ にあります。

## インストール手順

残念ながら Podman は Docker CE と共存できないので、削除しておく必要があります。

```bash
$ sudo rpm -e podman-docker
```

以下手順で Docker CE をインストールします。

```bash
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo dnf install docker-ce
```
pyenvからインストールしたpythonでimport tkinterができなかった備忘録(masOS)

# 前書き
この投稿が二つ目の記事投稿になるN高生です。
この記事はpyenvからインストールしたpythonでimport tkinterができなかったのでそれをできるようにする対処法を書きます。
ほぼ備忘録ですが。。。
例によって、いろんなサイトを参考にしたのでそこのところご了承いただけると幸いです。
なお、この記事が最適解ではないと思うので、色々なサイトを調べることをお勧めします。

# 動作環境
macOS Mojave(10.14.6)
python 3.7.0
pip 20.2.3
Homebrew 2.5.2

#ことの発端
pyenvからインストールしたpythonでimport tkinterをするとimport errorが出た。
(記事を投稿すると思っていなかったのでコードをメモしていない...)

調べてみると
[macOS(Mojave)でNo module named ‘_tkinter’を解決する(pyenv , Python3.x)](https://murabitoleg.com/mac-tkinter/)
という今回の症状と酷似した内容の記事が見つかったためひとまずこちらを参考に進めてみた。

# 解決に向けて試行錯誤
まずpyenvでインストールしたpythonをアンインストールしないといけないらしいので

```python:解決に向けた準備
#pipでインストールしたものをバックアップ
$ pip freeze > pip.txt
#アンインストール
$ pyenv uninstall 3.7.0
#もしHomebrewからtcl-tkをインストールしている場合は削除
$ brew uninstall tcl-tk
```
ここまで準備ができたら次は
[ActiveTcl](https://www.activestate.com/products/tcl/downloads/)というサイトから8.5系をインストールしましょう。

これがインストールできたらもう一度pyenvからpythonをインストールします。
私は3.7.0をインストールしました。この際、ここのコードに書いてある文を一文づつコピーしてターミナルに入れてください。
(筆者は最初インストールコマンドしか入れてなくて、あとあと苦労してます)

```
$ CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
$ LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
$ PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
$ pyenv install 3.7.0
$ pyenv global 3.7.0
```

ここで人によっては.bash_profileをいじる可能性があります。
(私はいじらなくても大丈夫でした)

# ひとまず解決...?
さあこれでなおったかな？と思いREPLで試してみました。
![スクリーンショット 2020-09-24 15.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549821/f15010ce-aff5-b1a0-fe38-399c43772cda.png)

**エラー出てない！！！**
これで開発に取りかかれる！と思って次の一文を打つとあれ...
今度はRuntime errorが出てきました...なんてこった...

#解決に向けて試行錯誤(2回目)
ということで今度はこのエラーを解決するために色々調べてみた。
この[github](https://github.com/pyenv/pyenv/issues/1375)がどのサイトをみても参考にされていたので一度、目を通してみたが筆者は初心者なので正直あまりよくわからなかった。(わかる人ならこれで解決できると思います)

そこで別のサイトを探し、
[macOS Catalina 10.15.1のpyenv環境でtkinterを利用するための設定（python 3.7.x系）](https://kidokorock.com/macos-catalina-pyenv-tkinter/)という日本語で書かれたサイトが出てきたのでこちらを参考に進めた。

```python:解決に向けた準備(2回目)
#pipのバックアップを忘れずに行う
$ pyenv uninstall 3.7.0
#brewからtcl-tkをインストール
$ brew install tcl-tk
```

次にpython-buildを書き換えます。しかしこのファイルはFinderで開いても見つからないので次のコマンドをターミナルに入れます。

```
open /usr/local
```

こうすることで、自動的にFinderが開き、ファイルが表示されます。私かここからpython-buildを探しました。

# python-buildの場所
(私の環境の場合)
/Cellar/pyenv/plugins/python-build/bin/python-guild
にあり、その770行目あたりに

```
$CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
```

と記載されている欄を

```
$CONFIGURE_OPTS --with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
```

と置き換える。
これのあと、改めてpythonをインストールする。

```
$ pyenv install 3.7.0
```

さて、REPLで再度試してみよう。

**今度こそ治った！**
今回はエラーも出ず、ファイルを実行した際もエラーが出ませんでした。これにて一件落着。
今回もなかなか大変だった。
また記事を書く機会があれば書きます。
Topping NX4 DSDのドライバ(備忘)

#ドライバが見つからない！
特定のサンプリング周波数のファイルの再生がうまくいかないと思ったら、ドライバをインストールしないといけないらしいということがわかったのだが、公式サイトのドライバダウンロードのページに該当機種がなかったため、備忘として書いておく。

##1. USBドライバ

まずは公式サイトのドライバをダウンロードする。
解凍すると、1.Driver and  Installation GuideのところにTopping_USBaudio_v4.86.0_setup.exeがあるので、それをダブルクリックする。
インストールが終わったら、機器をUSBに接続して完了。
**公式サイトの表示は該当機種ではない**が、問題なくインストールできた。
[Downloads - TOPPING](https://www.toppingaudio.com/downloads)

##2.ASIOドライバ
次に、DSDを再生するためにASIOドライバをインストールする。
公式のドライバは少し古いので、新しいものをダウンロードする。
公式のドライバに取説があるので、インストールの詳細は省略する。

* ASIOドライバ: [ASIOProxyInstall-0.9.4.zip](https://sourceforge.net/projects/sacddecoder/files/foo_dsd_asio/)(解凍したら、インストーラをダブルクリックでOK)
* foobar2000のASIOドライバ: [foo_out_asio.fb2k-component](https://www.foobar2000.org/components/view/foo_out_asio)(ダウンロードしたら、foobar2000からFile - Preference - ComponentでInstall)
* foobar2000のSACDドライバ:[foo_input_sacd-1.5.11.zip](https://sourceforge.net/projects/sacddecoder/files/foo_input_sacd/)
docker execでwinptyの使用を求められる 【Windows】


## 環境
windows10
SourceTree (Git for Windows)
docker desktop version 2.3.0.5

## 現象
SourceTree のターミナルでコンテナに入るとき、以下の現象が発生した。

```
$ docker exec -it container bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
```

## 対応
winpty を指定する。

```
$ winpty docker exec -it container bash
```

## 参考
【Git for Windows】tty/mintty/winptyとは何なのか【Gitbash】
https://unrealman.hatenablog.com/entry/tty-mintty-winpty
Google Cloud DNSがどんなインチキTLDでも使える件

#Google Cloud DNSについて
Google Cloud DNSは、Google Cloud Platformのサービスの一つで、権威DNSサーバ機能を提供してくれるものです。~~まあCloudflareみたいなものです。~~
この機能を使ってGoogle Domainsで作ったドメインを設定したりしてね、ということでしょう。
Googleは言わずもがな世界最強のサーバを持っているので、この機能だけでも使う価値はあると思います。
まあ一応[有料](https://cloud.google.com/dns/pricing?hl=ja)なのであまりアクセスが多いサイトにはお勧めできませんが、めちゃくちゃ安いです。
#TLDとは
ほぼ全ての機器におけるTLD,トップレベルドメイン(.comとか.jpとか)はICANNとかいうアメリカの民間団体が中央集権的に決めていて、新しいトップレベルドメインを作ることができるのは国かGoogleのような超大企業ぐらいなものです。
おまけに絶対にお金を払わないといけない上に買い上げはできず、永遠に支払い続けないといけないという殿様商売をやってるところです。(あくまで個人の意見です。)
しかしまあ仕組み自体はPublicなものなので個人のサーバ、社内などの狭い環境で独自のドメインを運用することは可能です。Web開発で馴染みが深いものでいえば`localhost`でしょうか。後はフリーWifiなんかで出てくるサイトとかもそうですね。
#Google Cloud DNSはICANNに未登録なドメインでも使える
他のところでは弾かれてしまいますが、Google Cloud DNSではオリジナルドメインとかの使用も全く弾かれません。google.comだろうがamazon.comだろうがfacebook.comだろうがいけます。(向こうがNSレコードで指定してなかったら意味がないですが。)
.hogeドメインでもいけます。おそらく用途としては大量のGoogle Compute Engineなどでドメインを作って管理するなどなんでしょうが、できる理由は謎です。
IQ Botのカスタムロジック：Split応用（テーブルに対して適用する、エラー制御を入れる）

IQ Botで扱うSplitについての基本は、[こちらの記事](https://qiita.com/IQ_Bocchi/items/127aa72bfaf2b2571190)に記載しています。

上記はフィールドに対するSplitのみに触れており、エラー制御なども組み込んでいないロジックだったので、ここでもう少し踏み込んで紹介します。

#Splitをテーブルに適用するロジック

例えば、フィールドであれば`field_value = field_value.split("銀行")[0]`と定義するロジックをフィールドに対して適用するとどうなるかというと、こんなかんじです。

```python:スプリットをテーブルに対して適用する場合

#抽象化した関数の定義
def func_split(value, splitter, index):

    x = value

    if splitter in value:
        y = x.split(splitter)

        if (len(x) + 1) >= index:
            x = y[index]
            
    return x

#関数の適用
df['列名'] = df['列名'].apply(func_split, splitter="銀行", index=0)
```

上記の「抽象化した関数」には、単純なスプリットだけでなく、「もとの文字列の中にそもそも『銀行』の文字が含まれているか」「splitした結果のリストに、指定したindexが存在しうるか」というチェックの処理も含まれています。

さらに、上記のチェックが否であれば、スプリット前の値をそのまま返す、という処理になっています。

なので厳密には`field_value = field_value.split("銀行")[0]`と単純に同じ、というわけではないのですが、実務で利用するときはこんな考慮を組み込むのが通常かと思います。

##関数をフィールドに対して適用する

えっ？　そのエラー制御、フィールドに対しても組み込んだ方がいいんじゃないの？　と思ったそこのあなた。

おっしゃるとおりです。
その場合は、上記の `func_split` を当該フィールドのカスタムロジック欄に設定した上で、以下のように関数を適用します。

```python:スプリット（エラー制御あり）をフィールドに対して適用する場合
#関数の適用
field_value = func_split(field_value, "銀行", 0)

```

##以上！

いかがでしたか？

ご質問がある方は、この記事にコメントをお寄せいただくか、TwitterのDMにてご連絡ください。

※ 上記は毎日チェックできているわけではないため、回答に時間がかかる場合があります。
　 IQぼっちをリアルにご存じの方は、仕事用のメールに質問をください。
nbconvertでhtmlファイルが作成できないバグ

`nbconvert`で変換したhtmlファイルが壊れていてひらけない。
以下で報告されているバグと同じっぽい。
https://discourse.jupyter.org/t/html-format-lost-in-nbconvert-6-0-x-bug/5972

`jupyter --version`とうったら、

```
nbconvert        : 6.0.2
```

とかえってきたので、以前確実に動いていた5.6.0にダウングレードした。

```
 conda install nbconvert==5.6.0
```

`jupyter --version`で確認。

これで無事convertできるように。
[Java] PDF閲覧設定

日頃PDFファイルを閲覧する場合、「フルスクリーンモードにするか、メニューバー/ツールバーを非表示にするか、またドキュメントのページレイアウトをどうのように設定するかなど・・・」という個人的な習慣によってプリファレンスを設定しますよね。今日、本文ではFree Spire.PDF for Javaを通してこれらのプリファレンス設定を実現させる方法を紹介します。

**JARパッケージのインポート**
**方法1：** [Free Spire.PDF for Java](https://www.e-iceblue.com/Download/pdf-for-java-free.html)をダウンロードして解凍したら、libフォルダーのSpire.Pdf.jarパッケージを依存関係としてJavaアプリケーションにインポートします。

**方法2：** Mavenリポジトリから直接にJARパッケージをインストールしたら、pom.xmlファイルを次のように構成します。

```xml
<repositories>
   <repository>
      <id>com.e-iceblue</id>
      <name>e-iceblue</name>
      <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
   </repository>
</repositories>
<dependencies>
   <dependency>
      <groupId>e-iceblue</groupId>
      <artifactId>spire.pdf.free</artifactId>
      <version>2.6.3</version>
   </dependency>
</dependencies>
```

**Javaコード**

```java
import com.spire.pdf.*;

public class ViewerPreference {
    public static void main(String[] args) {

        //PDFドキュメントをロードします
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("test2.pdf");

        //ウィンドウを中央に配置します
        pdf.getViewerPreferences().setCenterWindow(true);
        //タイトルを非表示にします
        pdf.getViewerPreferences().setDisplayTitle(false);
        //ウィンドウサイズに合わせます
        pdf.getViewerPreferences().setFitWindow(true);
        //メニューバーを非表示します
        pdf.getViewerPreferences().setHideMenubar(true);
        //ツールバーを非表示します
        pdf.getViewerPreferences().setHideToolbar(true);
        //2列で表示するようにページを設定します
        pdf.getViewerPreferences().setPageLayout(PdfPageLayout.Two_Column_Left);
        //全画面表示にします
        //pdf.getViewerPreferences().setPageMode(PdfPageMode.Full_Screen);
        //印刷ズームを設定する
        //pdf.getViewerPreferences().setPrintScaling(PrintScalingMode.App_Default);

        //ドキュメントを保存します
        pdf.saveToFile("viewer.pdf");
        //閉じます
        pdf.close();
    }
}
```

![view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3d6b5a62-f0ba-e2c0-d64c-8afeb85b04fc.png)
[RHEL/CentOS 8] ネットワーク設定 memo

# nmcli の使い方

ネットワーク設定のテキストユーザーインターフェース `nmtui` は直感的に分かりますので、ここではコマンドラインインターフェースの `nmcli` についてメモしておきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/3bef3aed-ebd7-3fb3-0dcc-0dd3ca13cc97.png" alt="computer_wireless.png" width=200 />


## コネクション一覧

認識しているネットワークインターフェースの一覧を表示します。
nmcli c

```bash:例
# nmcli c[onnection]
NAME    UUID                                  TYPE      DEVICE 
ens160  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  ethernet  ens160
```

## 確認

### 概要

現在の状態を確認します。
nmcli

```bash:例
# nmcli
```


### 詳細

指定したネットワーク（コネクションID）の詳細な設定を確認します。
nmcli c s [コネクションID]

```bash:例
# nmcli c[onnection] s[how] ens160
```

## 設定

指定したネットワーク（コネクションID）の設定を変更します。
nmcli c[onnection] m[odifty] [コネクションID] [+|-]\<setting>.\<property> \<value>

```bash:例
固定IP (DHCP のときは manual のとこを auto にする) 
# nmcli c m ens160 ipv4.method manual

DNS
# nmcli c m ens160 ipv4.dns 8.8.8.8,8.8.4.4

IP アドレス
# nmcli c m ens160 ipv4.addresses 192.168.45.10/24

デフォルトゲートウェイ
# nmcli c m ens160 ipv4.gateway 192.168.45.254

IPv6無効
# nmcli c m ens160 ipv6.method ignore

自動接続
# nmcli c m ens160 connection.autoconnect yes

スタティックルート
# nmcli c m ens160 ipv4.routes "192.168.100.0/24 192.168.45.253"

コネクション系の設定反映 (downは不要)
# nmcli c up ens160

ホスト名
# nmcli g[eneral] hostname centkun8.fukuchan-senpai.local
```

## Tips

IPアドレスやDNS、スタティックルートなど複数設定できるもののやり方。
また削除方法など。

```bash:例
カンマで区切って複数設定する
# nmcli c m ens160 ipv4.dns "8.8.8.8,8.8.4.4"

「+」を頭に付けて既存設定に追加する
# nmcli c m ens160 +ipv4.dns "1.1.1.1"

「-」を頭に付けてマッチする該当パラメーターのみを消去する
# nmcli c m ens160 -ipv4.dns "8.8.4.4"

「""」でパラメーターを消去する
# nmcli c m ens160 ipv4.dns ""
```
Cybersecurity in The Cloud: Here’s What It Means

![Cyber-Security-in-Cloud.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277629/eefb2f96-826b-6d3e-0ae8-c7dfd59ecfa7.jpeg)


Today, the adoption of cloud computing technology has grown tremendously by enterprises. Various leading cloud service providers such as ESDS have expanded their managed cloud services for protecting their existing cloud infrastructure. The customer, along with his cloud provider, is responsible for implementing the right cybersecurity service in the cloud for securing the data present on the cloud.
Cybersecurity in The Cloud

Despite several benefits, consumers often face certain psychological barriers when protecting their critical data against external vulnerabilities, with data is hosted in a public cloud setup. An online survey revealed that the primary concern of the businesses rests with the data loss and leakage followed by legal and exposure challenges to the data.

Consumer Apprehensions Towards Cloud Security

    Loss/Theft of Intellectual Property:

Consumers often fear the loss or theft of intellectual property (IP) when moving to the cloud. Online data states that over 3.3 million patent applications were filed in the year 2018. The IPs depict the competitive advantages of the holding companies. Loss or theft of IP can create significant damage to the parent company as various other businesses in the same domain can imitate products as well as processes for much cheaper rates.

    Regulatory Compliance Violations:

Today, every business organization follows specific compliance guidelines defined in its industry. A trusted & reputed cloud service provider, however, ensures that its cloud computing services align to the defined compliance standards that an organization needs to follow—not adhering to these guidelines cause compliance-related violations in the cloud computing security.

    Minimal Visibility of the Cloud Ecosystem

One of the key concerns that businesses often face with a cloud computing solution is that their CSPs do not give them complete visibility into the cloud environment. When businesses opt for an IaaS or PaaS-based solutions from their CSP, these problem gets reduced significantly since the user can himself configure and manage the cloud environment.

    Reduced Control of Cloud Environment Settings

Besides reduced visibility, businesses often tend to face lesser control over their cloud computing environments when using the cloud. Similar to the visibility aspect, the settings can be enhanced more with the IaaS and PaaS-based solutions.

    Lateral Spreading of Attacks

Businesses also fear that if a cloud computing environment fails to have a robust defense controls, then it becomes easier for a cyber-attacker to spread the attack from one resource to another hosted on a cloud. This results in rapid lateral spreading & quick compromise across several databases and applications hosted on the cloud in breach-related events. 

For more information visit: http://www.esds.co.in/blog/cybersecurity-in-the-cloud-heres-what-it-means/
未経験者が自社開発企業に就職するためのREADME書き方

#ランクイン！(2020/09/26)
皆様のおかげで、初投稿でデイリートレンドの２位になりました！
ご覧いただいている方々、ありがとうございます！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">[2020/09/26 18:00] トレンド2位<br>未経験者が自社開発企業に就職するためのREADME書き方 by teruis <a href="https://t.co/hEl2i0nyZc">https://t.co/hEl2i0nyZc</a></p>&mdash; Qiita:Trend (@QiitaTrend) <a href="https://twitter.com/QiitaTrend/status/1309779914292301824?ref_src=twsrc%5Etfw">September 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#はじめに
こんにちは！

先月、無事にエンジニアデビューした１年目の者です。

私は某プログラミングスクールに3ヶ月間お世話になり、卒業後、3週間で自社開発企業に転職することができました。
この経験を生かして、私が意識してきたことを伝えていければと思います。

まず、前提として転職では見せ方が最も重要だと考えています。
例えば、職務経歴書、面接対策、wantedlyのプロフィールなどなど、、
この記事では、その中でも重要なことの一つである、ポートフォリオの見せ方について共有します。

#記事の対象者
・未経験からエンジニア転職を考えていて、ポートフォリオを作成している方
・ポートフォリオのREADMEにて書く内容で迷っている方

#ポートフォリオの見せ方とは
エンジニアの方々は、忙しいので、書類選考の段階で、ソースを細かく見たりサイトを触って見たりしてくれるとは限りません。
ここで活躍するのが、READMEです。
私は、多くの転職成功された方々のREADMEを見て、自分なりの最適解を見つけました。
共通点は、端的でわかりやすく、視覚的に訴えていることでした。
この共通点からREADMEを使ってわかりやすく、視覚的に伝えられるようにすることが大事だと思います。
この記事では内容についてフォーカスしているので、書き方については他の方の記事を参考にしてください。

#READMEの構成
⬇️私の転職活動時に使用していたREADMEを元に説明していきます。
https://github.com/sora-uzu/The-View/blob/master/README.md

書くことは、主に４つです。
1, タイトルと概要、URL
2, 使用技術
3, AWS(インフラ)構成図
4, 機能、非機能一覧

###1, タイトルと概要、URL
まずは、タイトル、URLはそのままの意味なので、概要について説明します。
概要は、以下の3点を一言で書いてください。
　・どういうサイトか
　・何ができるのか
　・アピールポイント

これがかけたら、あとはサイトの分かりやすい画像を載せます。
載せ方は、癖があるので、
github readme 画像
などでググってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682827/984f2b21-0fb2-e1e0-27d4-c3bba084a9ad.png)


###2,  使用技術
ここには、使用言語や、インフラ周りで使用しているサービスを書きます。
バージョンも書いていると良いです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682827/a36293d0-eb4e-1f1b-7bb9-0f863ba00c4e.png" width=50%>



###3, AWS(インフラ)構成図
インフラ周りで力を入れている方や、AWSを使っている方は、draw.ioを使ってインフラ構成図を作成してください。
各サービスの画像は、ググると公式サイトなどから転載可能な画像が取得できます。
インフラ周りでアピールポイントがあればここに記載すると良いと思います。
私の場合は、CircleCIでやっていることを書いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682827/b84d2c63-f2e9-9756-cfd5-9735b33e3388.png)


###4, 機能、非機能一覧
機能と使用したgemを記載します。細かく書くというよりは、主な機能とそれに付随した機能を簡単に書いてください。
次に、非機能一覧では、なにでテストをしたか、何のテストをどのファイルで行っているかを書いてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682827/75d384f0-e901-61ec-4e77-9fea200f6250.png" width=50%>


#最後に
以上が私が転職活動時にReadmeにおいて意識していたポイントです。私自身も多くの方のポートフォリオを参考にこういった構成になったので、皆さんも一つの参考にしていただけると嬉しいです。
ご覧いただきありがとうございました！

##会社の紹介
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×ITの会社に勤務しております。
2020年9月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、[Wantedly](https://www.wantedly.com/companies/company_3244501)のページをご覧ください。
仮想環境上でのTitan2D(v4.2.0)のインストール方法

#注意
<font color="Red">Titan2D(v4.2.0)は"Material Map"に対応していないようです。</font>

#はじめに
私はパソコンのド素人です。
(4か月前の私は，Linuxなどもちろん使ったこともなく，端末を使用したこともありませんでした。)
文言など，間違っている部分も多々あろうかと思うのですが，ご了承ください。

#①仮想環境(VMware)の構築
・下記のサイトを参考に，仮想環境を作ってください。
https://qiita.com/iwa_gino/items/11aaffa9e49f2fc423d0
※↑ではディストリビューションとしてUbuntuが使われていますが，私はCentOS8を使いました。
（お好みのディストリビューションで大丈夫だと思います。）

#②Titan2D(v4.2.0)のダウンロード
下記のサイトを参考に，Linux上で端末（ターミナル）を用いてTitan2D(v4.2.0)をダウンロード・解凍してください。
https://github.com/TITAN2D/titan2d/releases


※上記のURLにアクセスすると，「Installation instruction from binaries」と書かれた項目があります。
（赤字（URLは緑色）を順に，端末にコピペ・エンターをして行きます。）
###Installation instruction from binaries
#####Download and unpack:
＃download
<font color="Red">wget https://github.com/TITAN2D/titan2d/releases/download/v4.2.0/titan2d-v4.2.0-Linux-64bit.tar.gz</font>

＃untar
<font color="Red">tar xvzf titan2d-v4.2.0-Linux-64bit.tar.gz</font>
※ここまでできればダウンロード・解凍は終了です。


#####To test:
＃get to example directory
<font color="Red">cd titan2d-v4.2.0/share/titan2d_examples/colimafinemini/Coulomb</font>

＃execute with 2 threads
<font color="Red">../../../../bin/titan -nt 2 input.py</font>
※しばらく計算が続くと思いますが，Doneとなればダウンロード・解凍がうまくいったことになります。

#③Titan2D(v4.2.0)の操作画面の立ち上げ
端末上で以下のコマンドを順番に実行してください。
$cd
$cd titan2d-v4.2.0/bin
$sh titan_gui.sh（ダメな場合は，＄sudo bash titan_gui.sh を試してみてください。）
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561610/df3a9bcc-f149-a038-e56c-3cec5535b8a7.png)



すると，以下のような画面が出てくると思います。
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561610/735af352-971a-5da4-1db1-f6b358fba903.png)


#④Titan2D(v4.2.0)の実行と可視化
③で操作画面が表示された後は，以下のURL（ユーザーガイド）に従って，パラメータを入力してください。
https://vhub.org/resources/4057/download/Titan2D_User_Guide.pdf

※GISデータ（DEMデータ）はGrass形式を用いたのですが，GISデータの準備は私には手も足も出ませんでしたので，こちらに書くことはできませんでした。（申し訳ございません。）

#おわりに
「仮想環境作れない」「CentOS入れられない」「Linuxがネットに繋がらない」「LinuxがCUIで立ち上がってしまい，GUIとして操作できない」「Linuxのタイムゾーンを日本にできない」「ホスト‐ゲスト間の共有フォルダが作れない」などなど，パソコンに詳しい方であればすぐに解決できるような問題も，私のようにはじめて扱われる方には難しい問題だと思います。
私も様々な方にお世話になりましたので，私にわかることであればお応えできればと思います。
RaspberryPi(DietPi)にTensorFlow2.3を入れる

```
pip3 install  https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.3.0/tensorflow-2.3.0-cp37-none-linux_armv7l.whl
```

でOK

```
ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory
```

と言われたので

```
apt-get install libopenjp2-7-dev 
```
で解決
【JS学習その⑥】関数とオブジェクト、そしてコールバック関数

#JS学習シリーズの目的
このシリーズは、私ジャックが学んだJavaScriptのメカニズムについてアウトプットも兼ねて、
皆さんと知識や理解を共有するためのものです。
(理解に間違いがあればご指摘いただけると幸いです)

#関数とオブジェクトの関係
「**関数は実行可能なオブジェクトである**」
まず、非常に大切なコンセプトとして、JavaScriptにおいて関数というのは、あくまで**オブジェクト**であり、
ただ**実行可能である**、というのが他のオブジェクトと異なる点です。
それ以外は、通常のオブジェクトと同じ挙動を取ります。

#関数がオブジェクトであることの証明
例えば、次のような関数を書きます

```main.js
function a() {
    console.log('hello');
}

a.prop = 0;
a.method = function() {
    console.log('method');
}

a();
a.method();
console.log(a.prop);
```
↓実行をConsoleで見た結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713434/37ad2031-2cce-e00a-2473-4978bd52e84f.png)
関数に対して、オブジェクトに使用するようにプロパティの追加とメソッドの追加を行うと、↑の画像のように、追加できています。
これで関数はあくまで実行可能なオブジェクトであることがお分かりかと思います。

#コールバック関数とは
「**他の関数に引数として渡される関数**」

```main.js
function hello() {
    console.log('hello');
}

function fn(cb) {
    cb();
}

fn(hello); /*hello*/
```
↑のコードでは、

1.`fn()`関数の**引数**として`hello`という**オブジェクト**`cb`を渡す
2.`fn()`関数内で`hello`という**実行可能なオブジェクト**`cb()`を実行する

という流れになっています。

#おまけ
引数・コールバック関数の補足として
1.JavaScriptの関数というのは、宣言する時に設定する仮引数と呼び出す時の実引数の数は一致している必要はない。
2.コールバック関数は、無名関数で定義することもできる。

```main.js
function hello(name) {
    console.log('hello ' + name);
}

function bye() {
    console.log('bye');
}

function fn(cb) {
    cb('Tom');
}

fn(hello); /*hello Tom*/
fn(bye); /*bye*/
fn(function(name) {
    console.log('hello ' + name);
})
/*hello Tom*/
```
したがって、↑のコードのように書くこともできます。

#まとめ
いかがでしたでしょうか。
関数とオブジェクトの関係、そしてコールバック関数はJavaScriptにおいてとても重要なのでしっかり理解しておきましょう！
[Python: UnicodeDecodeError] CSV読み込み時のエラー解決策の1つ

# はじめに
最近、Android端末でセンサデータを収集し、それをPythonをもちいてJSON形式からCSV形式に変換してデータ整形をする、なんて機会がとても多くなってきました。

そこで、とあるエラーに嵌ってしまったので、備忘録としてメモを残しておきます。

# 発生したエラー
UnicodeDecodeError: '****' codec can't decode byte 0x** in position **:

このエラーをみると、CSVに何かおかしな文字が混ざってしまっているのか、それとも下記のコードに不備があるのかと思いました。
しかし、今回に限ってはそうではありませんでした。

```python3
with open(path, encoding="***")
```

# 該当するコードスニペット

``` Python3
dir = os.getcwd() + "/" + folder
files = os.listdir(dir)
```

このコードは、とあるフォルダに存在するファイルをリスト形式で返すことができるものです。
このコードを使って、大量のJSONファイルやCSVファイルをリスト形式で扱おうとしておりました。

# 原因
.が先頭についているファイル、いわゆる隠れファイルがリストに含まれてしまうことが原因でした。
自環境の場合、「.DS_Store」がリストに含まれていました。

# さいごに
もし同じようなエラー（沼）に嵌ってしまった方がいれば、隠しファイルなど”本来扱いたくないファイル”を誤って読み込んでいないか確認することをおすすめします。
IQ Bot カスタムロジック（Python）：差し替え処理をループで効率化

[除外処理](https://qiita.com/IQ_Bocchi/items/46269089b99c6f322687)、[置換処理](https://qiita.com/IQ_Bocchi/items/83ae1dedfc1de6962006)に関するループを使った効率化を立て続けに解説してきましたが、すごく似たパターンで「差し替え」についてもループで効率化する方法を解説します。

##「差し替え」とは？

これはプログラミング用語じゃないです。
[こちらの記事](https://qiita.com/IQ_Bocchi/items/107f0ec20110d618838d)で紹介しているような、「ある文字列が含まれていたら、別の文字列に置き換える」という処理です。

置換の応用ですね。

##「差し替え」をループで使う場面は？

たとえば「請求書の明細に略称で書かれてくる部門名を正式名称にしたい」とか、「注文書の明細に略称で書かれてくる商品名を正式名称にしたい」とか、そんな場面が該当すると思います。

##ズバリ、やりかた！（フィールド項目編）

```python:差し替え＠フィールド項目
sashikae_list = (("これが含まれていたら１","これに差し替えてね１"),
               ("これが含まれていたら２","これに差し替えてね２"),
               ("これが含まれていたら３","これに差し替えてね３"))

for i in sashikae_list:
  if i[0] in field_value:
    field_value = i[1]
```

解説は置換編の[このあたり](https://qiita.com/IQ_Bocchi/items/83ae1dedfc1de6962006#%E3%82%BA%E3%83%90%E3%83%AA%E3%82%84%E3%82%8A%E3%81%8B%E3%81%9F%E7%BD%AE%E6%8F%9B%E3%81%AE%E5%A0%B4%E5%90%88)を参照してください。ほぼ同じ仕組みです。

##ズバリ、やりかた！（テーブル編）

```python:差し替え＠テーブル
sashikae_list = (("これが含まれていたら１","これに差し替えてね１"),
               ("これが含まれていたら２","これに差し替えてね２"),
               ("これが含まれていたら３","これに差し替えてね３"))

def table_sashikae(x,y): 
    for i in y:
        if i[0] in x:
            x = i[1]
    return x
        
df['列名'] = df['列名'].apply(table_sashikae,y=sasihkae_list)
```

##以上！

いかがでしたか？

今回は、仕組みとしては[差し替えの処理](https://qiita.com/IQ_Bocchi/items/107f0ec20110d618838d)を、[置換のループ](https://qiita.com/IQ_Bocchi/items/83ae1dedfc1de6962006)と同じ構造で処理しているだけなので、あまり解説を厚くしていません。

ご質問がある方は、この記事にコメントをお寄せいただくか、TwitterのDMにてご連絡ください。

※ 上記は毎日チェックできているわけではないため、回答に時間がかかる場合があります。
　 IQぼっちをリアルにご存じの方は、仕事用のメールに質問をください。
Gitを使う理由

#Gitってなに？
Gitは「変更履歴を管理する場所」
ファイルやデータを書き換えるごとに保存するまではいいが、雑多に保存しているとあとで困る。
・変更内容
・変更した理由
・変更した日時
・変更した人
をわかりやすく、しっかり管理することによって作業をスムーズに進めることができる。

こうしたことを一手に担ってくれるのがGitである。
「バージョン管理システム」とも言う。

#Gitの役割
・変更履歴を順々に記録する
・記録する際にメッセージ(誰が、何を、なぜ変更したか)をつける

#まとめ
Gitを使うことによってデータの変更履歴を管理することができ、作業の引継ぎ、修正、変更などをスムーズに進めることができるようになる。
railsのいいね機能の変数エラーについて

### 前提・実現したいこと

railsを使ってwebアプリケーションを作成中です。
自分がいいねをつけた投稿を全投稿の中からソートして画面に表示したいです。
しかし、postの部分にエラーが出てしまいました。
その実

### 発生している問題・エラーメッセージ

```
Showing C:/Users/user/dome/app/views/users/likesline.html.erb where line #26 raised:

undefined method `id' for nil:NilClass
```
```
   <% post = Post.find_by(id: like.post_id) %>
      <div class="users-index-item">
<%# ここから＝＝＝＝＝＝＝＝＝%>
        <%= link_to("/posts/#{post.id}") do %>
<%# ここまで＝＝＝＝＝＝＝＝＝%>
        <div class="user-left">
          <img src="<%= "/post_images/#{post.image_name}" %>">
        </div>
```

##該当コード

####likesline.html.erb
```
<div class="users-contents">
      <div class="users-index-item-sorce">
      <% @like.each do |like| %>
      <% post = Post.find_by(id: like.post_id) %>
      <div class="users-index-item">
        <%= link_to("/posts/#{post.id}") do %>
        <div class="user-left">
          <img src="<%= "/post_images/#{post.image_name}" %>">
        </div>
        <div class="post-right">
            <div class="post-right-link">
          <%= post.title %>
        </div>
      </div>
      <%end%>
  </div>
    <% end %>
</div>
</div>
```
####users_controller.erb
```
def likesline
    @user = User.find_by(id: params[:id])
    @like = Like.where(user_id: @user.id)
  end
```
###DB(SQLite)
####users
**id**	**name**	**email**	**created_at**	**updated_at**	**image_name**	**password**
10    たんぽぽ	tanpopo@gmail.com   2020-09-03	2020-09-14     10.jpg	   tanpopo
12    kosumosu	kosumosu@gmail.com  2020-09-19 	2020-09-19     12.jpg	   kosumosu
####posts
**id**  **content**     **created_at**	**updated_at**    **user_id**     **image_name**	**title**
46  contents1	2020-09-19 	2020-09-19 	10	  46.jpg	title1
47  dfsdfsdf	2020-09-19 	2020-09-19 	10	  47.jpg	df
####likes
**id**	**user_id**	**post_id**	**created_at**	**updated_at**
1	10	26	2020-09-04 03:57:42.503803	2020-09-04 03:57:42.503803
3	10	31	2020-09-18 12:28:35.206818	2020-09-18 12:28:35.206818
5	10	32	2020-09-19 02:27:20.465790	2020-09-19 02:27:20.465790
7	10	36	2020-09-19 06:27:53.983748	2020-09-19 06:27:53.983748
9	10	47	2020-09-19 10:50:58.208238	2020-09-19 10:50:58.208238
10	10	46	2020-09-20 07:30:15.554143	2020-09-20 07:30:15.554143

####問題点

posts.idとlikes.post_idの間に共通して存在しないカラムが存在していること。
よって、likesテーブルの中からid: 1,3,5,7をコンソールを使ってdestroyを行いました。

####likes
```
**id**	**user_id**	**post_id**	**created_at**	**updated_at**

9	10	47	2020-09-19 10:50:58.208238	2020-09-19 10:50:58.208238
10	10	46	2020-09-20 07:30:15.554143	2020-09-20 07:30:15.554143
```

すると、エラーが解消され無事にお気にいり登録されている投稿が表示できるようになりました。

回答してくれた方:tky_7201さん(teratailのurl:https://teratail.com/users/tky_7201#reply)
【AWS SOA】S3バケットのパブリックアクセスに関する監視の備忘録

#はじめに
AWS SOAの問題集の中で、S3の不正アクセス対策に関する問題が出題された。そこでの回答は必要以上にアクセス制限を設けずに、セキュリティ対策を行う方法として、AWS Configを使用して、パプリックアクセス可能なS3バケットが作成された際、監視をする方法であった。今回はその内容について簡単にまとめたい。

#概要
AWS Configのルールを使用して、どのバケットが読み取りまたは書き込みのパブリックアクセスを許可されているのかを、迅速に特定することができる。またS3バケットのパブリックアクセスが可能となった場合、通知するようにAWS Configを設定することも可能。

#方法
AWS Config>ルールを開く。ルールを追加を選択する。
![スクリーンショット 2020-09-24 14.14.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/5031afc3-6829-cce8-45bf-664f96ddc9a1.png)
検索バーに「s3-bucket-public-read-prohibited」を入力して、「s3-bucket-public-read-prohibited」を選択する。
![スクリーンショット 2020-09-24 14.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/39b81af9-bf8f-d3cc-fd70-1085381de679.png)
下にスクロールして、保存を選択する。
![スクリーンショット 2020-09-24 14.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c46594f3-f833-e11c-44b3-e5d98ee7f7ff.png)

評価が数分で完了し、s3-bucket-public-read-prohibitedルールで非準拠のフラグが付いているS3バケット（インターネットからのパブリック書き込みアクセスまたはパブリック読み取りアクセスを許可しているバケット）を確認する。


https://aws.amazon.com/jp/premiumsupport/knowledge-center/flag-buckets-aws-config/
GitHubを【イイ感じ！】にするやり方

# はじめに

こんにちは！ばーんです。

今回は自分のGitHubを**「イイ感じ」**に編集する2つの方法を書いていきます。

## ①GitHubProfileを追加する

なんぞそれ？

という話ですが、まずは見てみましょう。

![Screen Shot 2020-09-24 at 11.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534071/1e3ef8c5-3ced-7604-7c56-34eee5de45d9.png)

**全然ちがうやないかい！**
(←が参考/→がばーんの変更前のGitHub)

というわけで息抜きがてら僕もええ感じにしたいんじゃ〜！と思い編集していきます。

作成方法の詳細は次のトピックで書くのでポイントだけ。

- 公式を読めばREADMEの追加までは簡単
- READMEの編集が少し難しい点もありますが、現在公開されている他の人のREADME見れば解読できます(編集画面からソース見れます)
- まずはパクリでもいいのかなと。その後微修正して自分のアレンジを加えれば良いと思います！


ちなみに出来上がりがコチラ↓↓↓
(左が修正後。右が修正前)

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534071/f531a485-bfce-9c41-8727-2725fa9c6ce5.png)

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534071/f961f9ac-c09a-4736-92fa-d570f9523605.png)

イイ感じ！！

### 補足：作成方法について

| 元サイト | 翻訳したモノ |
|:-:|:-:|
| [GitHub公式ドキュメント](https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/managing-your-profile-readme)  |  [hashibadaiki/GitHubProfile.md](https://gist.github.com/hashibadaiki/90603ffd0716e23d65da1a9761279e88)|
|  [Martin Heinzさんが書いたまとめ記事](https://towardsdatascience.com/build-a-stunning-readme-for-your-github-profile-9b80434fe5d7) | [hashibadaiki/GitHubProfileBuild.md](https://gist.github.com/hashibadaiki/8938b10ea92601f8c65ba0a8366e8365)   |

今回は上記のサイトを元に作成していきました。

今回作成方法については公式ドキュメントメインで進めました。
まとめ記事を書いても良いのですが、翻訳記事を書いてみたので、そちらを参考に作成してみてください！

ただし、翻訳は英検4級()の腕前なので完全に品質を保証できません。
「違うよ！」というところあればgistへのコメントか本記事にコメントいただければ幸いです。

## ②草の生やし方について

転職するにあたってメンターと話していたところ…

「継続的に草生やしてみるとか分かりやすよ」っていう話になりまして。

で、いや…割と毎日コード書いてまっせ？？と思ってたわけですが、

**「シークレットウィンドで自分のページ見てみ」**と言われて愕然としましたToT

↓↓↓

![Screen Shot 2020-09-24 at 11.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534071/1d2dc413-e0d1-cc5e-1b20-48eb13b4da6c.png)

(左が通常のブラウザで見た自分のGitHub。右がシークレットウィンド)

つまり、他者からみたあなたのGitHubは→側なわけですね。
パブリックリポジトリにプッシュしない限り、他者には見えないんですね…

### 補足

- 草を生やす
masterにプッシュするとプロフィールのブロックに色がつきます。これが緑色なのでよく「草を生やす」みたいな表現がされます。

- 継続的な学習を示すためのもの
色を塗るだけが目的にならないように注意しなければなりません。あくまで自分の継続的な学習を視覚的に分かりやすくする為のものなので。

## さいごに

いかがでしたでしょうか？

気になった方はお手軽に試せるので、試してみてください〜＾＾

それでは！!
gitで前回のpushを取り消す方法

間違えてpushをしてしまいコミットを取り消してもう一度pushするもエラー。その事を伝えるも「pushを消していますか？」と聞かれてしまいました。pushを消すと調べてみても、出てくるのはコミットを消す方法ばかり……。ということで今回は私が行ったpushを消す方法をまとめたいと思います。

#まずはgit logでコミット履歴を見る
するとコミットIDなどの情報がたくさん出てくると思います。

```
<commit id 1>
satou
取り消したい最新のコミット

<commit id 2>
tanaka
この状態まで戻したいというところのコミット
```

#コミットIDをコピーし、git reset
```
git reset --hard <commit id 2>
```
コミットIDは最新の取り消したいコミットのものではなく、その一つ前の状態、「ここまで戻したい」という所のものを入れてください。

#その状態でpush
```
git push -f
```
これでpushをなかったことにできました。後は変更を加え、またいつも通りコミット、pushしてください。
AWS CloudFormation で「Property Name cannot be empty.」がでた時にやったこと

# はじめに
これは新規の pipeline を CloudFormation で作成することになり物凄く困った時のメモです。

# 結論
Cloudformation のリファレンスを地道に1つずつ必須を調べました。
(足りなかったのは OutputArtifacts と InputArtifacts の Name)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html

# 経緯
ローカルに立てた [former2](https://github.com/iann0036/former2) で既存のパイプラインをテンプレート化して、新しくスタックで作ろうとした時にエラーが表示され失敗してしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/be33e8d5-924a-05ef-e02e-19847ad4eafb.png)

- CloudFormationは初めて利用したので
「Properties のどこかの Name の変数が空になってるのかな？」
と解釈していろいろ試しましたが解決しませんでした。
- 次に"Property Name cannot be empty."で検索しましたがまったくよい検索結果は得られませんでした。
- それからチュートリアルを読んでみたり、 変数をOutputs に表示しようとしたり、いろいろな所をコメントアウトして動作させてみましたところ
「Property Stage cannot be empty.」
と表示され「必須項目のどこかの Name が無い」と言う事に気付けました。
- そこからは CloudFormation のpipelineのリファレンスを見て必須項目を1つ1つ確認して OutputArtifacts と InputArtifacts に Nameが無いことにたどりつき、無事にスタックを作成することができました。

# おわりに
テンプレートリファレンス、すごい、だいじ
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-reference.html


(あと英語力をもうちょっとなんとか……)
S3上の圧縮ファイルの中身をコマンドラインで確認する


S3に置かれた圧縮ファイル(gzip)の中身をローカルにDLせず、
コマンドラインでさくっと確認する方法。


# 前提

* AWS CLIが利用可能であること


```
$ aws --version
aws-cli/2.0.5 Python/3.7.3 Linux/2.6.32-573.7.1.el6.x86_64 botocore/2.0.0dev9
```


# コマンド

```
aws s3 cp s3://<bucket_name>/<file_name> - | zcat
```

コピー先に`-`を指定して標準出力に流し、それをzcatで表示する。
全て戻す！泣

前に、アカウント有効化機能をつけようとしたが失敗した。しかし、git mergeしてしまっていたため、一旦全て削除することにした。

ターミナルから git logで　戻りたいところのハッシュ値を確認

git reset --hard [ハッシュ値]で戻す

これを git push して、リモートリポジトリも変更したかったが、エラー

rm -rf .git でgit init 前の状態に戻す

全て作り直そう！！

https://github.com/対象のリポジトリ　からリポジトリを削除

もう一度、空のリポジトリを作る

まだ git push してもエラーが出るので、

rm -rf .git でgit init 前の状態に戻す 

git init 
git add -A
git commit -m "intialize repository"

git push origin master をしてもエラーが出るので、
git push -f origin master  で強制的に実行

herokuに公開していたアプリも一旦削除

heroku create tasknotice

git push heroku master

heroku run rails db:migrate

heroku open 

これでアカウント有効化を追加する前に戻れた！！
IllustratorでPDFの書き出し容量を抑える方法

イラストレーターでデータを作成し、PDFで書き出す際に容量を抑える方法（イラレ初心者向け。案外使った事がない人がいたのでメモ）

## sampleを用意
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/09ded6fd-6145-4867-129f-483790175a1a.jpeg)

配置画像は２点。かなり大きい画像をあえて配置。
合計13.6MB
![スクリーンショット 2020-09-24 12.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/4b9e4a1a-7b92-bc0e-7ff1-5c48973e4bc9.png)

普通にPDFを保存（別名で保存→ファイル形式をPDFにして書き出し→PDFを保存の画面で「初期設定」のままPDFを保存）すると・・・
![スクリーンショット 2020-09-24 13.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/07095926-f37c-f9ac-d75e-4d74513bd102.png)

113MB。そんな容量どこからでてきたんだろう・・・

## 保存方法を変える

![スクリーンショット 2020-09-24 13.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/9b97d2bf-7f78-abe3-7f52-4cda70d7bd8b.png)

「PDFを保存」の画面で、「adobe PDFプリセット」を「[最小ファイルサイズ]」に設定して書き出す。

そして書き出したPDFの容量はこちら

![スクリーンショット 2020-09-24 13.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/b151ec85-505a-575d-2739-2179db949d4b.png)

小さめの画像１枚くらいの容量にまで落ちている。

## 補足

←初期設定保存の画像　　　　最小ファイルサイズでの画像→
![スクリーンショット 2020-09-24 13.07.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/f666c9a8-25f2-993d-e3b5-176aa6c0a131.png)

容量が落ちた分、当然画質や色味は劣化する。
しかし、メール添付等で送る場合は止むを得ないね(´･ω･`)
[JavaScript] 高階関数で break する方法の考察

# 概要

* 高階関数の `forEach` は `for` 文と異なり、処理途中で break できません。そこで、代替コードで break できる様にする方法を考えてみました。

* 書く動機となった元記事
[なぜ我々は頑なにforを避けるのか](https://qiita.com/tetsuya-zama/items/11e19b9da4892eb365c4)

# 実装

* 高階関数 `find`

```JavaScript:findによるfor-breakの代替コード
;[1, 3, 5, 7].find(
  it => {
    console.log(it)
    return it === 5    // Same as `if (it === 5) break`
  }
)

// 1
// 3
// 5
```

* 高階関数 `reduce`

```JavaScript:reduceによるfor-breakの代替コード
;[1, 3, 5, 7].reduce(
  (bye, it) => {
    if (bye) return bye
    console.log(it)
    return it === 5  // Same as `if (it === 5) break`
  },
  false
)

// 1
// 3
// 5
```

* 高階関数 `some`

```JavaScript:someによるfor-breakの代替コード
;[1, 3, 5, 7].some(it => {
  console.log(it)
  return it === 5  // Same as `it (it === 5) break`
})

// 1
// 3
// 5
```

* 高階関数 `every`

```JavaScript:everyによるfor-breakの代替コード
;[1, 3, 5, 7].every(it => {
  console.log(it)
  return it !== 5  // Same as `it (it === 5) break`
})

// 1
// 3
// 5
```

# まとめ

* 本来の `find` や `reduce`, `some`, `every` の使い方ではないため、可読性にかなり難があります。
* これらは本来、代入文の右辺として使われます。右辺に書かれてないなら「本来の使い方ではない」ので、`for-break` の代替で使われてるのかと気づけそうです。

* 「他にもっと好い方法があります！」と云う方は、コメント欄で教えて下さい！