OmniAICreator/Qiita-1.07M huggingface dataset:
競技プログラミング練習記 No.7【ABC149練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC149](https://atcoder.jp/contests/abc149)を解きました。
4完です。
E問題は自力で解けず、解説もよく理解できませんでした。
二分探索ができないとわかったのでしっかり勉強します。

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  1min |-|1ms|
| B |  5min |-|1ms|
| C |  3min |素数判定|1ms|
| D | 14min |貪欲法|3ms|
| E | - |二分探索|-|




## A
```c++
	string s, t;
	cin >> s >> t;
	cout << t << s;
```
やるだけ

## B
``` c++
	ll a, b, k;
	cin >> a >> b >> k;
	cout << max(0LL, a - k) << " " << max(0LL, b + min(0LL, (a - k)));
```
少し複雑ですね、、
3つの`if`文が1行の式にはいっているので仕方ないです。
`std::max`, `std::min`関数は引数の型をそろえる必要があるので、入力値は`0`ではなく`0LL`になっています。

## C
``` c++
// 素数判定
bool isPrime(int a)
{
    if (a == 1) return false;
    for (int i = 2; i * i <= a; i++)
	{
        if(a % i == 0) return false;
    }
    return true;
}

void solve()
{
	int x;
	cin >> x;
	for(int i = x; i < 2 * x; ++i)
	{
		if(isPrime(i))
		{
			cout << i;
			return;
		}
	}
}
```
素数判定の関数を作って判定するだけですね。
`O(x√x)`です。
`i`の範囲が`x ~ 2x`なのは[ベルトラン＝チェビシェフの定理](https://www.google.com/search?q=%E3%83%99%E3%83%AB%E3%83%88%E3%83%A9%E3%83%B3%EF%BC%9D%E3%83%81%E3%82%A7%E3%83%93%E3%82%B7%E3%82%A7%E3%83%95%E3%81%AE%E5%AE%9A%E7%90%86&oq=%E3%83%99%E3%83%AB%E3%83%88%E3%83%A9%E3%83%B3%EF%BC%9D%E3%83%81%E3%82%A7%E3%83%93%E3%82%B7%E3%82%A7%E3%83%95%E3%81%AE%E5%AE%9A%E7%90%86)からきています。
`while`でやってもよかったですが、`while(true)`になるのは停止性の面からみて怖かったのでやめました。


## D


``` c++
	int n, k, r, s, p;
	cin >> n >> k >> r >> s >> p;
	string t;
	cin >> t;

	int ans = 0;
	for(int i = 0; i < k; ++i)
	{
		if (t[i] == 'r')
		{
			ans += p;
		}
		if (t[i] == 's')
		{
			ans += r;
		}
		if (t[i] == 'p')
		{
			ans += s;
		}
	}
	for(int i = k; i < n; ++i)
	{
		if (t[i] == 'r')
		{
			if (t[i - k] != 'r') ans += p;
			if (t[i - k] == 'r') t[i] = 'o';
		}
		if (t[i] == 's')
		{
			if (t[i - k] != 's') ans += r;
			if (t[i - k] == 's') t[i] = 'o';
		}
		if (t[i] == 'p')
		{
			if (t[i - k] != 'p') ans += s;
			if (t[i - k] == 'p') t[i] = 'o';

		}
	}
	cout << ans;
```

貪欲法です。`O(N)`です。
初めの`k`回までは勝てる手を出し、それ以降、勝てない場合は違う手を出しました。
``t[i] = 'o' `` の `'o'` は`other` の `o` にしました。
`r,s,p`以外であればなんでもいいです。


## E
※恥ずかしいですが解けていません
自戒のために載せます(*ﾉωﾉ)

```c++
	ll n, m;
	cin >> n >> m;

	vector<ll> a(n);
	for(int i = 0; i < n; ++i)
	{
		cin >> a[i];
	}

	priority_queue<int> sum;

	for(int i = 0; i < n; ++i)
	{
		for(int j = 0; j < n; ++j)
		{
			sum.push(a[i] + a[j]);
		}
	}

	ll ans = 0;
	for(int i = 0; i < m; ++i)
	{
		ans += sum.top();
		sum.pop();
	}
	cout << ans;
```
この解き方は`O(M logM)` です。
制約は`M = [1, N^2]`, `N = [1, 100000]`です。
なので、最大計算量が`O(10^10)`を超えます。余裕でTLEです。
難易度を見たら青diffでした。さすがにこんなに簡単ではないですね。

解説にはFFTでも解けるとありました。
そうか。この計算は畳み込みか、、、。

E問題に関して自分で解いた回答はありません。
二分探索を勉強して解けるようになったら載せるかもしれません。


以上です。ありがとうございました。
日本語読み歌詞WEB-API開発

#更新
　最近、中国語に興味がなくなり、ペンディング

#内容
　趣味で中国語カラオケをやっていて、日本語歌詞を割り付ける
WEB-APIを作ろうと考えている。

http://motochan1969.hatenablog.com/archive/category/%E4%B8%AD%E5%9B%BD%E3%82%AB%E3%83%A9%E3%82%AA%E3%82%B1

#要求仕様
　システムとしては、ピンインルビを日本語読みに置き換えるもの
　既に作成済みデータを元にＡＩにて学習する
　単語をカテゴライズして、前後の意味付け距離の近いものを選択する
　歌いやすさを得点化して、フィードバックで置き換え方法を学習する
　特定歌詞のランキング評価を得て、ランキングにて再構築を行う
　音読のみに限定し、文章の意味付けは持たせない

#つづく
　執筆中
IntelliJでGatsbyのGraphQLスキーマを認識させてクエリの補完を効かせる

この投稿ではIntelliJ IDE[^1]でGatsbyのGraphQLスキーマを認識させ、JSコード上のGraphQLクエリの補完が効くようにする方法を紹介します。

[^1]: IntelliJ IDEだけでなくWebStorm, IntelliJ IDEA, Android Studio, RubyMine, PhpStorm, PyCharmにも対応。

## やりかた

### IDEにJS GraphQLをインストールする

まずIDEに[JS GraphQL]プラグインをインストールします。

[JS GraphQL]: https://plugins.jetbrains.com/plugin/8097-js-graphql

「Preferences」→「Plugins」→「Marketplace」を開き、「GraphQL」で検索し、JS GraphQLをインストールします。

![CleanShot 2020-06-12 at 09.29.31@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/6352fef7-9434-ae5a-1bc4-1145420c2df5.png)

IDEを再起動します。

### Gatsby開発サーバを起動する

コンソールでGatsby開発サーバを起動して、GraphQLのエンドポイント`http://localhost:8000/___graphql`が生えるのを待ちます。

```bash
gatsby develop
```

![CleanShot 2020-06-12 at 09.38.34@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/9c73238c-0aff-e0be-7a04-66a480c216ad.png)

### GraphQL設定ファイルを作る

プロジェクトルートのディレクトリを右クリック→「New」→「GraphQL Configuration File」をクリックします。

![Screen Shot 2020-06-12 at 9.40.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/34820dda-ac41-6d19-df24-8135064b2558.png)

.graphqlconfigというファイルが作られるので、その中身を次のとおりにします:

```json:.graphqlconfig
{
  "name": "Gatsby Schema",
  "schemaPath": "gatsby.graphql",
  "extensions": {
    "endpoints": {
      "Gatsby GraphQL Endpoint": {
        "url": "http://localhost:8000/___graphql",
        "headers": {
          "user-agent": "JS GraphQL"
        },
        "introspect": false
      }
    }
  }
}
```

### GatsbyのGraphQLスキーマファイルを生成する

.graphqlconfigを開くとエディタの7行目に実行ボタン(<font color="#459c4d">▶</font>)が表示されるので、それをクリックします。

![CleanShot 2020-06-12 at 09.45.26@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/8a284327-1eda-e36b-4299-2d3de9ae12d0.png)

これを実行すると、gatsby.graphqlという名前でGraphQLのスキーマファイルが生成されます。

![CleanShot 2020-06-12 at 09.48.54@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/0ab1352b-fddd-f609-7976-aacb6ba1bd00.png)

以上で、IDE上でGatsbyのGraphQLスキーマが認識されるようになり、クエリの補完が効くようになります。

## 補完を試す

GraphQLの文字列上で、Ctrl + Spaceを押すとフィールドなどが補完されます。

<img width="541" alt="CleanShot 2020-06-12 at 09.53.52@2x.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/52d44eb3-8f46-95f6-48f8-92333a09fde7.png">

## おわり

ここで紹介した方法を使ったサンプルプロジェクトはGitHubにあります:

[suin/gatsby-playground at intellij-graphql](https://github.com/suin/gatsby-playground/tree/intellij-graphql)

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいです:relieved:→[Twitter@suin](https://twitter.com/suin)
【Golang】標準パッケージ iota

#【Golang】標準パッケージ iota
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//iota
/*
連番を作ってくれる
*/

import "fmt"

//定数
//iota = 0から連番が代入される
const (
	c1 = iota
	c2
	c3
)

//
const (
	//0は使わない
	_      = iota
	//1の１０回シフト 1024
	KB int = 1 << (10 * iota)
	//x1024=メガバイト
	MB
	//x1024x1024=ギガバイト
	GB
)

func main() {
	fmt.Println(c1, c2, c3)
	//>>0 1 2
	fmt.Println(KB, MB, GB)
	//>>1024 10488576 1073741824
}

```
【Golang】標準パッケージ sort

#Golang】標準パッケージ sort
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main

//https://golang.org/pkg/sort/

import (
	"fmt"
	"sort"
)

//sortを自分で実装する場合
/*func sort(list []int) {
	eNum := len(list)
	for i := eNum; i > 0; i-- {
		for j := 0; j < i-1; j++ {
			if list[j] > list[j+1] {
				list[j], list[j+1] = list[j+1], list[j]
			}
		}
	}
}
	list := []int{3, 4, 1, 2, 8, 5}
	sort(list)
	fmt.Println(list)
*/

type Entry struct {
	name  string
	value int
}
type List []Entry

//カスタム
//長さ(キーと値)
func (l List) Len() int {
	return len(l)
}

//交換
func (l List) Swap(i, j int) {
	l[i], l[j] = l[j], l[i]
}

//値
func (l List) Less(i, j int) bool {
	if l[i].value == l[j].value {
		return (l[i].name < l[j].name)
	} else {
		return (l[i].value < l[j].value)
	}
}

func main() {
	//宣言
	i := []int{5, 3, 2, 4, 5, 6, 4, 8, 9, 8, 7, 10}
	s := []string{"a", "z", "j"}
	//struct 関数内でしか使わない婆はこのように書ける
	p := []struct {
		Name string
		Age  int
	}{
		{"A", 20},
		{"F", 40},
		{"i", 30},
		{"b", 10},
		{"t", 15},
		{"y", 30},
		{"c", 30},
		{"w", 30},
	}

	fmt.Println(i, s, p)

	//ソート
	//スライス、配列
	//integerをソート
	sort.Ints(i)
	//stringをソート
	sort.Strings(s)

	//struct （mapではないが） ver1 structソート(mapではなくstructにしてからソートすれば、同じように使える)
	sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name })

	fmt.Println(i, s, p)

	sort.Slice(p, func(i, j int) bool { return p[i].Age < p[j].Age })
	fmt.Println(p)

	//sort.Sliceとsort.SliceStable
	//Goのsort packageには、安定ソートを保証しないSlice関数と安定ソートを保証するSliceStableが存在する。
	//破壊的(SliceStable)かそうじゃないか(Slice)
	//SliceStableは、ソート前の順序が、ソート後も保存されている。
	//SliceStableは、ソート後のデータは、同じAgeのPはName順で並んでいる。
	sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name })

	sort.Slice(p, func(i, j int) bool { return p[i].Age < p[j].Age })

	fmt.Println(p)
	//>>[{b 10} {t 15} {A 20} {y 30} {c 30} {i 30} {w 30} {F 40}]

	sort.SliceStable(p, func(i, j int) bool { return p[i].Name < p[j].Name })

	sort.SliceStable(p, func(i, j int) bool { return p[i].Age < p[j].Age })

	fmt.Println(p)
	//>>[{b 10} {t 15} {A 20} {c 30} {i 30} {w 30} {y 30} {F 40}]

	//map ver2 基本はstructにしてやるver1でOKだが一応
	//ソートして順番通りに列挙する
	//キーをスライス(配列)にして、それをソートする。
	//そのソートしたキーのスライスを使って何らかの順序でマップの値を取り出す。
	m := map[string]int{"B": 100, "C": 200, "A": 300}

	a := make([]string, len(m), len(m))

	//キーをaに入れる
	ii := 0
	for key := range m {
		a[ii] = key
		ii++
	}

	// キーを入れたスライスをソートする
	sort.Strings(a)

	for iii := 0; iii < len(a); iii++ {
		fmt.Println(a[iii], m[a[iii]])
	}

	//map ver3 基本はstructにしてやるver1でOKだが一応
	/*
		マップを値で降順、値が等しい場合キーで昇順にソートする
		条件式を指定したソート と同様のことを行います。
			条件式を指定したソート...
			Len(),Less(),Swap()という３つのメソッドを 実装したクラスを作れば、独自条件のソートが可能です。
	*/
	m2 := map[string]int{"ada": 1, "hoge": 4, "basha": 3, "poeni": 3}

	a2 := List{}
	for k, v := range m2 {
		e := Entry{k, v}
		a2 = append(a2, e)
	}

	sort.Sort(a2)
	fmt.Println(a2)

}

```
Homebrew 2.3.0 のアップデート時、Mac のCommand Line Tools をアップデート

Homebrew v2.3.0 のアップデート後、以下のメッセージが

```
Warning: A newer Command Line Tools release is available.
Update them from Software Update in System Preferences or run:
  softwareupdate —all —install —force
```

ほっといても問題なさそうだが、心残りは消しときたいので、
そのまま `softwareupdate —all —install —force`
動かない。

```
If that doesn’t show you an update run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select —install
```

とメッセージがあるので、これに従い、CommandLineTools を削除し入れ直す。
(一応 /Library/Developer/CommandLineTools はバックアップ)

`sudo rm -rf /Library/Developer/CommandLineTools`
`sudo xcode-select —install`

CommandLineTools フォルダが新たに作成されていることと、`brew doctor` で問題がないことを確認して完了。
Blank page intermittently encountered when opening or redirecting to a Visualforce page in Chrome 67 or newer

# VF pageでのクラッシュ

Visualforceページを開いた後、またはVisualforceページにリダイレクトされた後に、エンドユーザーが空白の白いページに遭遇する問題が確認されています。この動作はChrome 67.0.3396.99で始まり、現在のChromeの安定版、ベータ版、および開発ブランチで引き続き発生することが確認されています。

質問に時々挙がってます。
まだレビュー中ですね。

https://success.salesforce.com/issues_view?id=a1p3A000001HlBdQAK


https://success.salesforce.com/answers?id=9063A000000pgtYQAQ
https://success.salesforce.com/answers?id=9063A000000aJ7g
PHP(Laravel)でPostgresのhstoreを連想配列にコンバートする方法

#初めに
現在仕事でReact、Laravel、postgresを使っているがDBから取得したhstoreの連想配列化で少し詰まったので連想配列化の方法を書いておこうと思い書いてます。

###コンバートコード

```php

public static function hstoreConvert($data){
    return json_decode('{' . str_replace('"=>"', '":"', $data) . '}', true);
}

```

一回文字列上でjsonの形にstr_replaceで修正し、json_decodeでPHPの連想配列に置き換えている

###まとめ
よりいい方法があるとは思うがとりあえずこのコードで正常に動作する。
地味にわからないMacのファイルパス

#Macのファイルパスをコピーして取ってきたいけど、どうするの？
サイト構築時に、Rootからのファイルパスを簡単にコピーしてきたいことが多々。
簡単にできそうなんだけど・・あれ、どうやるんだ？

と思ってましたが、簡単でした。

ファイルやフォルダを右クリックしてコンテキストメニューを表示。

しかし、このメニューの中にはパスのコピーは無い。

？？

だけど、簡単！

メニューが開いた状態で`Optionキー`を押下。

すると、`○○をコピー`というメニューが`○○のパス名をコピー`に変わる。

この機能を選択することで、
ファイル・フォルダまでのパスのコピーが完了！

簡単！
AWS S3でIAMのポリシーを追加しようとしたら「このポリシーには、「Has prohibited field Principal」というエラーが含まれています 」と表示され、ハマった話

# ポリシーを追加しようとしたらなんか出た！！

DjangoからS3へメディアをアップロードしたいなぁと思って[django-storage]()のドキュメント通りにJSONをコピペしたのだが、

>このポリシーには、「Has prohibited field Principal」というエラーが含まれています For more information about the IAM policy grammar, see AWS IAM Policies

とエラーが出てしまい、手詰まりに・・・

慣れてないAWSなので詰まるのは予想していたが、早々にエラーにぶつかってしまった。

なんでこうなったのかすら分からず、権限周りの設定等で問題があるのかと思いググっていく。

# そもそもの勘違い

DjangoからIAMでユーザーを作成し、管理する際はグループを作成して`AmazonS3FullAccess`のアクセス権限を付与したものに対してユーザーを所属させるべきであり、ユーザーにポリシー云々を直接付与するということではないらしい・・・？

少なくとともこれららのリンクではそういった方法が取られており、それに従うのがより簡単な方法っぽいのでこちらを採用する。

- https://qiita.com/okoppe8/items/7ecbc92187171926238f
- https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

なお、これらはテスト的にS3を使った実験であるためクローズドなものであるため、実際に運用する際にはセキュリティ的な観点などから管理することも考えなければならなさそう。
PHPでローカルホストをサクッと立てる方法

# PHPで作ったコードをサクッと確認できないか？？
MAMPやXAMMPでローカルApatch環境はあるものの
ローカルホスト設定する手間も面倒だなと、、、

そこで、PHPからさくっと確認したい場合の方法はあるかしら？と探してみました

Macの場合
`$ php -S localhost:80 -t /var/www/html/`

`ポート番号`は、使用されてない数字
`/var/www/html/`は、立ち上げたいRootフォルダを記載

終了したい時は、Ctr+C

#PHPビルトインサーバーという機能

PHPビルトインサーバーという機能のことらしい。知らなかった・・
詳しくは、こちら。
[php.net ビルトインサーバー](https://www.php.net/manual/ja/features.commandline.webserver.php)

PHPバージョンはPHP5.4.0以上ですね
(途中)TwilioでFAX送信 2020年6月時点

# 追記

2020年7月･･･その後の実装・動作確認を経て不採用としました。ご参考までに。

[TwilioのFAX送信機能の評価結果=不可 - Qiita](https://qiita.com/s-katsumata/items/d72b44ecbde8a1fc7a8f)

2020年12月･･･Twilio社から2021年12月でFAX API機能の提供打ち切りというアナウンスがありました。採用していたら開発投資が無駄になるところでした…。良かった。

[![Image from Gyazo](https://i.gyazo.com/94210276db07d1371576ef1bf9ad80eb.png)](https://gyazo.com/94210276db07d1371576ef1bf9ad80eb)


# 関連URL

- [Programmable Fax - Twilio](https://jp.twilio.com/docs/fax)
- [TwilioでFAX送信(Twilio Advent Calendar 201724日目)](https://qiita.com/kunyanist/items/77f92d864762a4e6b606)

# 料金(FAX送信)

公式サイトには記載されていないので問い合わせが必要です。
以下は2019年11月(消費税造成後)に問い合わせた時の回答です。
更新されている可能性があるので各自お問い合わせください。

050番号であればFAX送受信ともに`約7円/枚`です。これは現状では国内最安だと思います。

## 初期費用

無料

## 電話番号の維持費用
050番号維持費用　　110円/月
0120/0800番号維持費用　1,650円/月

## FAX送信費用
送信料　1.52778円/ページ   ※毎月100枚まで無料
通信料　5.5円/分

## FAX受信費用
受信料　1.52778円/ページ
通信料　0.61円/分（050の場合）
通信料　22円/分（0210/0800の場合）
※毎月送受信合計100枚までは送信料/受信料が無料です。（通信料は必要）

# TwilioのFAX送信の特徴

- 安い。7円/枚は国内最安。
    - 維持費110円が必要だが実質無料。(枚数100枚まで送信料金`約1.52円`は無料なので72枚送信すれば元をとれる)
- プログラマブル(RestAPIに対応)で送信できる
- PDFファイルのみ送信できる
    - メール送信するだけでFAX送信に変換してくれる他サービス(例えば秒速FAX送信)に比べると面倒ではある。
        - API実装したくない場合は「[秒速FAX送信](https://fax.toones.jp/send/)」がおすすめ。維持費ゼロで。10円/枚
- PDFファイルの格納先は自前で用意する必要がある
- PDFファイルは、Twilioサーバからアクセス可能なURLを持つ必要がある
- 支払いはクレジットカード登録が必要

# 実装

## 実装上の考慮事項

- PDFファイルアクセス時にBasic認証を必要とするか
    - 送信内容に個人情報が含まれるので「機密度」は高い
    - したがって必要
    - 特定のパスに対してだけ設定する
- Twilio側にデータを残すかどうか？
    - デフォルトでは180日保管される
    - 保管要否はリクエスト時に`StoreMedia`パラメタで指定できる。`False`指定すれば保管させない。既定は`True`
    - 保管期間指定は不可？
- PDFファイルの保管と削除
    - 保管期間
    - ファイル削除のバッチ実装
- PDFファイルの格納先
    - Webアプリケーションサーバのローカルか？S3か？
        - Webアプリケーションサーバローカルの場合
            - PDFファイルがディスク消費するので定期的に削除する処理が必要 
            - 実装は容易。すでにある実装にパスを追加するだけ。
    - S3にPDFアップロードしてそれをトリガとしてLambda関数から実行という仕組みだと
        - メリット
            - データ失われない
            - データ保持期間をS3機能で指定できる？ ※バッチ削除処理の実装不要
            - Webアプリケーションサーバの負荷が低い(S3にアップロードするだけ)
        - デメリット
            - TwilioからPDFが参照されるので「データ転送料金」が発生する。
            - Lambda関数
            - PDFにベーシック認証かける実装がやや面倒(CloudFront+S3で実現可能)
        - この場合、PDFファイルアップロードで

## 設計

- サブドメインを追加する. 
    - 例えば`twilio_faxdata.sample.com`
    - ディレクトリ`/var/www/html/fax-data/`に割り当てる
    - 当該サブドメインにベーシック認証を設定する。
    - https設定にする
- PDFファイルを当該ディレクトリに出力する
- `サブドメイン+pdfファイル名`をTwilioに渡す
    - https://fax_data.samapl.com/<予約番号>_<通知種別>.pdf
- 定期的に削除する。
    - 保管期間はサイト設定で指定できるように。デフォルト7日

## 開発言語

- java
- 既存アプリケーションに組み込む

## 設定

### Apache設定

```xml:httpd.conf
<VirtualHost *:443>
  ServerName faxdata.sample.com
  DocumentRoot /var/www/html/faxdata
  <Location /var/www/html/faxdata>
    AuthType Basic
    AuthName "Basic Auth"
    AuthUserFile /etc/httpd/conf/.htpasswd
    Require valid-user
  </Location>

  SSL設定とか

</VirtualHost>
```
Nervesで出続けるtzdataのエラーを止めた

Nervesを使って時間をあつかうプログラムを書いていた場合、`RinLogger.attach`してログを表示した際に`tzdata`の書き込みエラーが表示される場合があります。

たちが悪いのが、n秒に一回書き込みしようとしてエラーが出るのでログがとても見づらくなります。


# エラーの例

```shell:Nerves(RinLogger.attach)
07:44:10.633 [error] GenServer :tzdata_release_updater terminating
** (File.Error) could not write to file "/srv/erlang/lib/tzdata-1.0.3/priv/latest_remote_poll.txt": read-only file system
    (elixir 1.10.2) lib/file.ex:1050: File.write!/3
    (tzdata 1.0.3) lib/tzdata/data_loader.ex:44: Tzdata.DataLoader.last_modified_of_latest_available/1
    (tzdata 1.0.3) lib/tzdata/release_updater.ex:81: Tzdata.ReleaseUpdater.loaded_tzdata_matches_remote_last_modified?/0
    (tzdata 1.0.3) lib/tzdata/release_updater.ex:42: Tzdata.ReleaseUpdater.poll_for_update/0
    (tzdata 1.0.3) lib/tzdata/release_updater.ex:19: Tzdata.ReleaseUpdater.handle_info/2
    (stdlib 3.12.1) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib 3.12.1) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib 3.12.1) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: :check_if_time_to_update
State: []
```


# 解決方法１（確認済み）

`config/target.exs`ファイルに次の行を追記すればエラーがでなくなりました。

```elixir:config/target.exs
config :tzdata, :data_dir, "/data/tzdata"
```


# 解決方法２（未確認）

このような方法もあるようですが、こちらは未確認で`disabled`にした時の副作用がきになるところ。

```elixir:config/config.exs
config :tzdata, :autoupdate, :disabled
```
【Swift】Time Profilerを使用したパフォーマンス改善のための速度計測方法

アプリの処理が遅く、パフォーマンス改善したいときに、アプリのどの処理に時間がかかっているのか調査するのは大変です。
そんな時に便利なXcodeに入っている`Developer Tool`の`Time Profiler`の使い方を紹介します。

## Time Profilerを用いた計測方法
Xcodeには便利な`Developer Tool`がいくつも存在します。
開発ではよう使う`Simulator`もその一つです。

今回はどの処理にどれだけの時間がかかっているか詳しく見れる`Time Profiler`を使います。
使い方はとっても簡単です。

1. `メニュー > Xcode>Open Developer Tool > Instruments` を選択します。
<img width="520" alt="スクリーンショット 2020-06-10 21.36.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/828613e8-ef6c-19ce-fe27-c11d6e1e62cc.png">

2. こんな画面が出てくるので`Time Profiler`を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/e1dc4efd-4259-be48-fcac-8da9cf9b6012.png" width=80%>

3. 一度計測したいアプリをXcodeで実装してシミュレーターに送ります。

4. そうするとここでアプリが選択できるようになっているので、選択して赤い丸ボタンを押すと計測が始まります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/75cfd325-c4a5-90f6-1fdd-29aff4240e9d.png" width=80%>

計測したいアクションまでアプリを操作するとここにこんな感じで波形ができます。
今回はかなりスモールなアプリで試したので全然波形がないですが。。
<img width="356" alt="スクリーンショット 2020-06-11 23.32.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/8bfa2d92-f2d6-4947-0903-ca3fe7874af0.png">

これで計測は完了です！次に計測した内容の確認をしていきます✨

## Time Profilerで計測した内容を確認する
計測したい波を選択します。選択すると波の色が青になります。
下にこんな感じの表が出てきます。これをタップすると実際のコードに飛ぶことができます。
<img width="676" alt="スクリーンショット 2020-06-12 0.28.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/1fbde0dc-436a-48ee-73f3-614a4b860174.png">

これでどの箇所に時間がかかっているか明確に調べることができます。
パフォーマンス改善の際にはぜひ利用してください。
gitlab のお掃除スケジュール

# gitlab runner docker をお掃除しないと、ディクスが圧迫される問題

cronにお掃除スケジュールを登録

```
# m h  dom mon dow   command
0 3 * * * /usr/bin/docker container prune -f && /usr/bin/docker image prune -f && /usr/bin/docker volume prune -f && /usr/bin/docker network prune -f && /usr/bin/docker system prune -f
```

# artifact file で、ディクスが圧迫される問題

artifactには、artifacts:expire_inを付けましょう

```
# omnibus-gitlab
sudo gitlab-rake gitlab:cleanup:orphan_job_artifact_files DRY_RUN=false
```

LFS filesやuploadsも必要があれば消す
https://docs.gitlab.com/ee/raketasks/cleanup.html
python 3.8.2でprologを動かしてみた

「pyswip便利なんだけどpython 3に対応してないからな～泣」という声をネットのどこかで見かけたので、

「**python3.8.2でもpyswipちゃんと動いたよ**」という報告をしようと思い、この記事を書いた。

<sub><sub>蛇足だが、予言者でもない限り、「python3でも動く」とは確かに言えない。python3.8.2で動いても、python3.8.3以降で動く論理的な保証はどこにもないからだ。</sub></sub>

１. `pip install pyswip`
２. 次のコードを実行

```python
from pyswip import Prolog
p = Prolog()
p.assertz("father(michael, john)")
p.assertz("father(michael, gina)")
for s in p.query("father(X,Y)"):
    print(s["X"], "is the father of", s["Y"])
```

３. 次のように標準出力を得る

```
micheal is the father of john
micheal is the father of gina
```

参考: https://github.com/yuce/pyswip の「Examples」
vbsのバージョンを調べてみた(Windows10を無料で入手後)5.812

(参考)

https://win.just4fun.biz/?WSH/スクリプトエンジンのバージョンを調べる

Windows7ライセンスの付与されたPCで、
windows7

```
Windows script Host
5.8
```

Windows10を無料で入手後、
windows10

```
Windows script Host
5.812
```

【要望】vbsのバージョン毎の違いがわかるサイトを教えて下さい。
【PHP】シンプルな処理速度計測

速度を計測したい処理を下記のように```$start```と```$end```で挟む

```php
$start = microtime(true);
    // 処理
$end = microtime(true);

echo '処理時間は' . ($end - $start) . '秒です。'
```

計測に使っているのはPHPの関数```microtime()```です。
引数に```true```を指定することで返却値をfloat型で受け取ることができます。
UnityにStandaloneFileBrowserを導入するときのエラー対処

# 導入方法

* パッケージをダウンロード
  * https://github.com/gkngkc/UnityStandaloneFileBrowser
* パッケージをインポート
* `using SFB;`

# エラー対処

## 追加したパッケージがビルドできない

`Assets/Plugins`フォルダを作ってそこに以下のファイルをコピーする

* `System.Windows.Forms.dll`, `System.Drawing.dll`
  * `C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0`からコピー
* `Ookii.Dialogs.dll`
  * http://www.ookii.org/software/dialogs/ からダウンロード

## Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

Edit > Project Settings > Player を開き、
Optimization > API Compatibility level を.Net 2.0に変更

## InvalidOperationException: The process must exit before getting the requested information.

Unityを再起動して再ビルド
「ずんだの進次郎構文だからこそずんだの進次郎構文なのです」問題 Ruby編

進次郎構文を生成するプログラムを作成するので、進次郎構文を生成するプログラムを作成してください。

## ルール
1. 基本の入力文を以下の5つとします。だからこそ、基本の入力文を以下の5つとするのです。
    * テストしないとバグがでる
    * 公式ページを参照する
    * バグじゃないものをバグを呼ぶと喧嘩になる
    * ヨーダ記法を好まない
    * バグは夜更け過ぎに仕様になる
2. 進次郎構文の前と後ろをつなぐ接続詞を以下の5つとするので、進次郎構文の前と後ろをつなぐ接続詞を以下の5つとします
    * だからこそ
    * それが
    * もしくは
    * しかしながら
    * そんなときでも
3. 以下のフォーマットの文章を20回出力するからこそ、以下のフォーマットの文章を20回出力してください
    * "<入力文>と思います。<接続詞>、<入力文>のです。"
    * 補足
        * 実行するたびに選ぶ<入力文>と<接続詞>はランダムで抽出してください

## プログラム
```ruby
inputs = %w{テストしないとバグがでる 公式ページを参照する バグじゃないものをバグを呼ぶと喧嘩になる ヨーダ記法を好まない バグは夜更け過ぎに仕様になる}
conjunctions = %w{だからこそ それが もしくは しかしながら そんなときでも}
20.times {
  word = inputs.sample
  conjunction = conjunctions.sample
  puts "#{word}と思います。#{conjunction}、#{word}のです。"
}
```

## 出力
```
テストしないとバグがでると思います。だからこそ、テストしないとバグがでるのです。
ヨーダ記法を好まないと思います。しかしながら、ヨーダ記法を好まないのです。
ヨーダ記法を好まないと思います。そんなときでも、ヨーダ記法を好まないのです。
ヨーダ記法を好まないと思います。それが、ヨーダ記法を好まないのです。
テストしないとバグがでると思います。そんなときでも、テストしないとバグがでるのです。
テストしないとバグがでると思います。だからこそ、テストしないとバグがでるのです。
バグは夜更け過ぎに仕様になると思います。もしくは、バグは夜更け過ぎに仕様になるのです。
テストしないとバグがでると思います。もしくは、テストしないとバグがでるのです。
ヨーダ記法を好まないと思います。だからこそ、ヨーダ記法を好まないのです。
バグは夜更け過ぎに仕様になると思います。しかしながら、バグは夜更け過ぎに仕様になるのです。
ヨーダ記法を好まないと思います。もしくは、ヨーダ記法を好まないのです。
ヨーダ記法を好まないと思います。しかしながら、ヨーダ記法を好まないのです。
公式ページを参照すると思います。だからこそ、公式ページを参照するのです。
バグじゃないものをバグを呼ぶと喧嘩になると思います。もしくは、バグじゃないものをバグを呼ぶと喧嘩になるのです。
ヨーダ記法を好まないと思います。それが、ヨーダ記法を好まないのです。
バグは夜更け過ぎに仕様になると思います。もしくは、バグは夜更け過ぎに仕様になるのです。
公式ページを参照すると思います。そんなときでも、公式ページを参照するのです。
ヨーダ記法を好まないと思います。もしくは、ヨーダ記法を好まないのです。
バグじゃないものをバグを呼ぶと喧嘩になると思います。だからこそ、バグじゃないものをバグを呼ぶと喧嘩になるのです。
バグじゃないものをバグを呼ぶと喧嘩になると思います。しかしながら、バグじゃないものをバグを呼ぶと喧嘩になるのです。
```

## 関連
* [ずんだ問題まとめ - Qiita](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0)
【AWS】作業用ユーザー作成方法(IAM)

# はじめに
今回は、IAMでの作業用ユーザーの作成方法についてアウトプットしていきたいと思います。
AWSに登録した際に、初期設定として実施する内容の一つになります。

# 作業用ユーザーを作成する理由
AWSのベストプラクティスで、**「基本的にAWSアカウントのルートユーザーを使用しない」**となっています。
代わりに、管理者アクセスが必要な担当者ごとに新しいIAMユーザーを作成します。

# 今回作成するIAMユーザーの図(イメージ)

![image.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/4a725e1b-01e0-c6de-89d7-014ea82df5f8.jpeg)



# 作業用ユーザー作成方法

①ルートユーザーでAWSマネジメントコンソールへログイン後、「IAM」をクリック

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/34bbccfb-7701-fe6f-cce8-2c0a633eb319.jpeg)

②「ユーザー」をクリック

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/ec964dec-6b07-2b83-385f-b7a3f24d16d2.jpeg)

③「ユーザーを追加」をクリック

![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/db23de60-471c-7d77-a50f-1769bf5e54aa.jpeg)

④それぞれの情報を入力し、「次のステップ」をクリック

|  ユーザー詳細の設定  |  設定内容  |
| ---- | ---- |
|  ユーザー名  |  設定したいユーザー名  |


|  AWSアクセスの種類  |  設定内容  |
| ---- | ---- |
|  プログラムによるアクセス  |  ☑  |
|  AWSマネジメントコンソールへのアクセス  |  ☑  |
|  コンソールのパスワード  |  カスタムパスワード  |
|  パスワードのリセットが必要  |  □  |

![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/09ca0b0a-c18b-e36e-79db-68c5488d73d3.jpeg)

⑤「グループの作成」をクリック

![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/162583c6-c058-7642-d4bf-2d7cf3514596.jpeg)

⑥下記のように設定し、「グループの作成」をクリック

|  項目  |  設定内容  |
| ---- | ---- |
|  グループ名 |  Administrators  |
|  ポリシー |  AdministratorAccess  |

![7-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/78d20dca-6ea3-57d7-65b8-29437207c27f.jpeg)

⑦グループ「Administrators」に☑を入れ、「次のステップ」をクリック

![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/a62617c5-fdbb-856e-0eee-11724d7fda55.jpeg)

⑧タグは任意になりますが、今回は下記のように入力しています。入力後、「次のステップ」をクリック

|  キー  |  値(オプション)  |
| ---- | ---- |
|  Role |  Admin  |

![9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/e70bb5ae-8175-298a-3228-d8cb17cecc50.jpeg)

⑨最終確認の画面になります。情報に問題がない確認後、「ユーザーの作成」をクリック

![10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/6f9b100f-3c0f-948f-c692-8e7844e58884.jpeg)

⑩ユーザーが作成されたことを確認。

赤枠の部分をお気に入りにいれておく。
**黒塗りでぼかしている部分は、必ず控えておくこと(ログインに必要なため)**
※「.csvのダウンロード」や「Eメールの送信」を実施した場合、黒塗りの数字の部分が記載されています。

![11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/5f2c4e7c-48c7-7375-50bc-180e4dcdb6ed.jpeg)

⑪ログアウト後に作成したIAMユーザーでログイン実施

ログインできることを確認

![13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/69ee1c0c-4fa8-f663-e4d8-e91620b9c5cd.jpeg)



# 参考
[最初の IAM 管理者のユーザーおよびグループの作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started_create-admin-group.html)
ログからアタリを付ける、ハングの原因となるHashMapの使い方

以下のような `HashMap` へのログが観測されたら


```Sample1.log
	at java.util.HashMap.findNonNullKeyEntry(HashMap.java:605)
	at java.util.HashMap.putImpl(HashMap.java:701)
	at java.util.HashMap.put(HashMap.java:684)
	at zzz.yyy.xxx.setSomething(SomeUtil.java:nnn)
```


```Sample2.log
	at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:2013)
	at java.util.HashMap.putVal(HashMap.java:648)
	at java.util.HashMap.put(HashMap.java:622)
	at zzz.yyy.xxx.setSomething(SomeUtil.java:nnn)
```

例の場合、`SomeUtil.java` を見ましょう or 開発者に見てもらいましょう。

HashMap は適切に排他制御をして使えているでしょうか。


### HashMapおさらい

- [HashMapでOutOfMemoryErrorが発生するケース](http://wadahiro.hatenablog.com/entry/20110926/1317066552)
- [HashMapと無限ループとsynchronized](https://cero-t.hatenadiary.jp/entry/20091126/1259254839)
- [ThreadとHashMapに潜む無限回廊は実に面白い？](https://www.atmarkit.co.jp/ait/articles/0803/28/news141.html)
- [マルチスレッドでのstatic HashMap.put()で無限ループ](http://ooohooohoooh.blogspot.jp/2011/03/static-hashmapput.html)
- [High CPU / Hang on java.util.HashMap.findNonNullKeyEntry() due to non-thread-safe usage of HashMap](https://www.ibm.com/support/pages/node/205535)

### 排他制御おさらい
- [排他制御のあれこれ](https://qiita.com/opengl-8080/items/fa22f46d7bf35fa45c21)
- [新人に悲観ロックによる排他制御を体験してもらう](https://qiita.com/5zm/items/cc33fa9f591892222153)
【Java】Apathce TikaでCharsetを取得する/CharsetからStringを初期化する【Kotlin】

# やること
`Apache Tika Parsers`を用いてファイルの`Charset`（文字コード）に関わらず、`Java`の`String`として読み込みます。

`Apache Tika Parsers`は以下からご利用ください。

- [Maven Repository: org\.apache\.tika » tika\-parsers](https://mvnrepository.com/artifact/org.apache.tika/tika-parsers)

# やり方
今回は`UniversalEncodingDetector()`を使って`Charset`を取得し、`Charset`に合わせて`String`のコンストラクタを呼び出しています。

例では`TikaInputStream`の初期化に`InputStream`などを利用していますが、やり方はいくつか有るので各ドキュメントをご参照下さい。
`String`の初期化などもそうです。

```kotlin
// MetadataはKotlinと名前被りが有るため改名して用いる
import org.apache.tika.metadata.Metadata as TikaMetadata

/**
 * 入力ファイルの文字エンコード
 */
fun getCharset(input: InputStream, metadata: TikaMetadata): Charset? {
    val encordingDetector = UniversalEncodingDetector()
    return TikaInputStream.get(input)
            .let { encordingDetector.detect(it, metadata) }
}

val metadata = TikaMetadata()

val charset = getCharset(/* 何らかのInputStreamなど */, metadata)

if (charset == null) throw Exception("文字コードが取得できませんでした。")

val result = String(/* ByteArrayなど */, charset)
```

## 試した感じ
`Shift-JIS`や`UTF-8`のボム有り/無しなどは正常に取り扱えました。
ただ、日本語があまり含まれていない`Shift-JIS`の場合、解析に失敗して文字化けすることが有りました。

前情報無しでの文字コード解析は統計的手法に頼るしか無いため、どの手法でもどうしようもない問題だとは思いますが、失敗が有りうることは念頭に置くべきかなと思います。
初心者によるプログラミング学習ログ 342日目

#100日チャレンジの342日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
342日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>342日目　2h<br>・ポートフォリオ作成<br>・細かい修正あちこち<br><br>いったん妥協するのもしょうがない<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1271174348934492160?ref_src=twsrc%5Etfw">June 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Windows EventLogをjson形式に変換する

# Overview
[Windows EventLogをElasticSearchにimportする](https://qiita.com/sumeshi/items/491891d83c3aca224880)
[Windows EventLogをElasticSearchにimportする(のを100倍早くする)](https://qiita.com/sumeshi/items/cb2fbafe59c2c83e3085)

の続きです.

昨年evtx形式のファイルをElasticsearchにインデックスするライブラリをつくったんですが,
poetryにリプレースした(機能追加もした)ついでにPyPIにアップロードしたのでその記録です.

# Usage
https://github.com/sumeshi/evtx2es

```bash
$ evtx2json /path/to/your/file.evtx /path/to/output/target.json
```

```python
from typing import List
from evtx2es import evtx2json

if __name__ == '__main__':
  filepath = '/path/to/your/file.evtx'
  result: List[dict] = evtx2json(filepath)
```

コマンドとして使う場合には `evtx2json 変換したいファイル 変換後jsonのパス` という使い方でOKです.

pythonから読み込む場合にはjsonに一回吐き出すよりも辞書型でreturnされるほうが便利かな〜と思ったのでそうしてます.
返り値は各レコードのdictがlistになったものです.

`evtx2es`というライブラリの`evtx2json`という機能です. ややこしいですね.
オマケ機能だしリポジトリ分けるほどのものでもないので...機能が肥大化したら考えます.

# Installation

```bash
$ pip install evtx2es
```

# Evaluation
案の定JPCERTくんのサンプルを使用しました
PCによって違うのであくまで目安で...

https://github.com/JPCERTCC/LogonTracer

```bash
$ evtx2json Security.evtx output.json                                                                                                                                                                                                                          
Converting Security.evtx
125it [00:07, 15.94it/s]
```

30MBくらいのファイルの変換に7秒でした.
う〜む, そこそこ速い？

お わ り
VSCodeで突然gitのステージができなくなった


##何が起きたか?
![bandicam 2020-06-12 03-53-42-661.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650521/8d581d8e-d1d6-f77a-547d-793e5bbf0102.jpeg)
ここの＋ボタンを押してステージしようとすると、
![bandicam 2020-06-12 03-53-59-112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650521/0f1e94f1-e1ab-7730-2d8c-2a2e8073340f.jpeg)
こんなエラーが出るようになりました。

##原因
まず、ターミナル上でgit add .を試したところ、ステージすることができました。しかし、GUI上ではできません。
そこでこのエラーについて調べてみたところ、どうやらパスに問題があるようです。
でも変な文字が入ってるわけじゃないし、最近まで動作してたしなぁと悩み続けて数時間。。。
もう一度エラーをよく見ると、
![bandicam 2020-06-12 03-53-59-112-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650521/dbf6fbde-c4cc-df40-1aa6-3315b830d343.jpeg)
**CドライブのCが小さい！！**

##解決法
ここまで分かったのですが解決策は見つけられず…
＋ボタンの挙動に関する設定を探しました見つかりませんでした。
しばらくターミナルからの実行となりそうです。

今回は原因だけの共有となりますが、もし解決法が分かる方がいたら教えていただけると幸いです。

##追記(06/13)
###windowsでは大文字小文字の区別がないという指摘について
次の画像のように確かにCが原因で通っていませんでした。
環境はpowershell、WSL2を使っておりますが、以前この環境でも動作していたのでどのタイミングで変わってしまったのか不明です。。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650521/6c91e082-d502-df99-a778-00ec79794517.png)
Inno Setup 6.0.2 ~ 6.0.5 あたりのChangelog

Inno Setup の 6.0.5 がリリースされていました。
バージョン6になり、ちょいちょい機能も増えているようですね。
https://jrsoftware.org/files/is6-whatsnew.htm

## .net framework のインストール確認

> Pascal Scripting change: Added new IsDotNetInstalled support function, based on code by Cristoph Nahr.

私もCristoph Nahr さんのサイトのコードを使って.netのチェックしていましたが、取り込まれたんですね。やりぃ。
http://www.kynosarges.de/DotNetVersion.html

```pascal
function InitializeSetup: Boolean;
begin
  Result := IsDotNetInstalled(net462, 0); //Returns True if .NET Framework version 4.6.2 is installed, or a compatible version such as 4.8
  if not Result then
    SuppressibleMsgBox(FmtMessage(SetupMessage(msgWinVersionTooLowError), ['.NET Framework', '4.6.2']), mbCriticalError, MB_OK, IDOK);
end;
```

## ARM対応
>Support for 64-bit mode on Windows 10 on ARM.

なんてことでしょう。ARM対応ですか。
ARM版 Surface ががっつりシェア取ってくれないと、嬉しさはあまりないな。


## Event Attributes

> Event attributes, making it possible to have multiple implementations of the same event function in your script.

なんだろって思ったら、Javaでいうannotation、C#でいうAttributeでしょうか。

```pascal
[Code]
procedure InitializeWizard;
begin
  Log('InitializeWizard called');
end;

<event('InitializeWizard')>
procedure InitializeWizard2;
begin
  Log('InitializeWizard2 called');
end;

<event('InitializeWizard')>
procedure InitializeWizard3;
begin
  Log('InitializeWizard3 called');
end;
```

上のコードを実行すると以下の順番でプロシージャが呼ばれる感じ。
便利かもしれないけど今ところ使いどころがちょいわからん。

```
[03:29:43.441]   InitializeWizard2 called
[03:29:43.457]   InitializeWizard3 called
[03:29:43.471]   InitializeWizard called
```

## Resizable 

> Optional support for a resizable wizard window.

```pascal
[setup]
WizardResizable=yes
```

インストーラの画面のリサイズができると。
嬉しくないわけではないが、なくても困らないものだから、微妙な感じ。


##  SSL and WinGet

> Inno Setup can now be installed using the new Windows Package Manager.
> Enabled HTTPS on jrsoftware.org.

おめでとうございます。
Inno Setup は ``winget`` からインストールできるようになり、公式サイトもlet's encryptでSSL化していました！！
PHP 標準出力でexplodeを使ったときの型について

## 入力例
```
N
A1 A2 A3 A4 AN
```

4
1 4 6 3


```php5
$N = trim(fgets(STDIN));
$A_string = trim(fgets(STDIN));
echo gettype($A_string); // string
```

```php5
$N = trim(fgets(STDIN));
$A_arr = explode(' ', trim(fgets(STDIN)));
echo gettype($A_arr); // array
```

## 使用用途
1. for文でインデックスを指定するには配列じゃないといけない

```php5
for ($i = 0; $i < $N; $i++) {
echo $A_arr[$i] . ' '; // 1 4 6 3 
}
```
echo $A_stringにするとstring型にインデックスを指定[]することはできないので当然エラーになる

2 max、minの引数が１つのときなど関数に型が指定されている場合
git で master で tag を作ってしまったときに削除する

## 背景

GitHub Actions などで, github.ref で tag を打つ(たとえば artifact を release にアップロードするときとか)ようなスクリプトを書いている.

`master` branch を push すると `refs/heads/master` で tag が作られ, 以降手元から `git push origin master` などすると

```
error: dst refspec refs/heads/master matches more than one.
```

となり push できない.

## 解決方法

https://github.com/actions/create-release/issues/13

`git push origin :refs/tags/refs/heads/master` で消す.

`refs/heads/master` がタグ名になっているので, `:refs/tags` + `refs/heads/master` とする
(`refs/tags/master` ではうまく消せない)

## その他

githhub actions で, branch or tag 名を見て処理を切り替えるには `if` を使う


```
if: contains(github.ref, 'tags/v')
```

https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif

YAML だと, 条件で処理変える文法がわかりづらいですね.
(自分用)VS CodeにFlask入れる

# VS CodeにFlaskを入れる(macOS)
Flaskとは何かとかそういうの全然わからない
# 1.まず流れだけ
1. venvで仮想環境作る
2. Flaskをpip installで入れる
3. 動作確認して終了

# 2.具体的な話
## 2-1.仮想環境を作成
- いい感じのフォルダを作っておく<p>
- `python3 -m venv <仮想環境の名前>`を作ったフォルダのターミナルに入れる
(もし怒られるならpy,python,python3を総当たりで変更してみる)<p>
- 多分左下の方にpython~~ってあるからそこを選択、<br>
"Python <バージョン名> <さっき作った仮想環境名>"みたいのが有るはずなので、クリック。<br>
これでPython仮想環境を使うよって宣言した様なもん<p>
`source myenv/bin/activate`
- もし仮想環境でターミナル使いたい場合は、上のツールバーに有る<br>
"表示"→"コマンドパレット"→"`Python: Create Terminal`を入力"<br>
で開く

## 2-2.Flaskのインストール
- 前述のやり方でターミナルを開き、`pip install flask`を入力<p>
- `pip freeze`で入っているモジュールが確認出来る、ちゃんと入ってるか見といた方が良い<p>

## 2-3.ちょっとした動作確認
### なんか*テキスト*表示させて動くか確認する
- 下のコード入れて保存(一応"command+sね")<br>

```python
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello_world():
 return "Hello, World!"
```

`@app.route("/")`で" "内のリンクが要求された時に、下の関数の動きを返すって事をやってるよ。
上の2行はまだ考えない方がいい<p>

- 上に有る方法でターミナルを開き、

```bash:ターミナル
$ export FLASK_APP=app.py
$ flask run
```
って入れる。<p>

- ローカルホストのポート5000っていうリンクがターミナルに表示されるので、そこへ移動してみる、
ちゃんと*Hello World*って表示されてたら大丈夫

- なんかFlaskのモジュールが無いみたいな事言われるけど、あんま考えん方がいい。実行出来るし。

# 3.終わり
- デバックで自動で動くかとかはまたの機会にやりましょう
- サーバに乗るweb_appってフロントエンドとバックエンド、どっちから作った方が良いんだろうね
ワンタッチで簡単にコーヒー豆をレコメンドしてくれるサービスをリリースしました！ 

<img width="973" alt="mamerabi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654017/38f6d3e3-5180-490d-05ff-4a5e9495f045.png">

ワンタッチで簡単にコーヒー豆をレコメンドしてくれる [Mamerabi](https://www.mamerabi.com) をリリースしたので記念に投稿します。
(名前の由来は割とそのままな感じなのですが、まめえらび → まめらび → Mamerabi です。)

Mamerabiはいろんな種類のコーヒー豆を飲んできた私の知見を活かしたサービスとなっています。
本記事ではその開発での話をしようかな〜と思います。

## とりあえず私について
- （複雑な経緯があるが）一応新卒1年目のWebエンジニア
- Web開発歴2年弱
- 普段はReact/TypeScriptと時々Rubyを書くフロントエンジニア
- デザインはできないorz...
- 個人開発したいな〜とずっと思ってたがアイデアが乏しいため、実は初リリース
- 大学時代は機械学習をやってた

って感じなのが私です。

## Mamerabiについて
私はコーヒーが好きです。今となってはある程度、どの銘柄がどんな味かっていうのはわかるようになったのですが、
コーヒー豆を買って飲み始めた頃はどれがいいかわからないし、いろいろ買ってみるけど全然違いわからん！って感じでした。

味に差がわからないのは置いといて、どの銘柄がいいのかわからないというのは、単純にコーヒー豆が多種多様すぎで判断が難しいからだよな〜とおもっていました。
じゃあ簡単に選べればいいじゃん。となって簡単に豆を選べる事ができるサービスの開発を決めました。

そしてできたのがMamerabiですね。

## 開発期間
開発期間はアプリケーションがとてつもなくシンプルなのもあって、作り始めてまだ、1週間もかかっていません。
開発をしていたのが1日でそれからは様々な銘柄に対してコメントを考えて、データの入力するのに5日ほどかかりました。（まだ銘柄は全然少ないですが。）

## 技術構成
- React / Next.js (SSG)
- TypeScript
- Emotion
- Netlify

技術構成はこんな感じでしょうか。以前からずっとさわりたいな〜と思っていたNext.jsのSSGを用いて開発を行いました。
非常にシンプルに色々できるので、Gatsbyより全然いいなっていう感じでしたね。
シンプルでいい感じだったので、これからSSGをしたいときはGatsbyではなくて、Next.jsを使おうと思っています。 (GatsbyのGraphQLを無駄に使っている感じが自分は好きではない。 )

当たり前のですがTypeScriptです。また自分は普段からスタイリングにEmotionを用いているので、慣れているEmotionを選択しました。（新しいことを色々やると絶対開発が頓挫する自信があったからですw）

特にこれと言って、珍しいことはしていないので特に書くこともないのですが、まあこんな感じで爆速に作ることができて満足しています。

## デザインについて
私はフロントエンジニアですが、デザイン力に乏しいです。（勉強中ではありますが。）
なので、使う色は極力にシンプルにしました。コーヒーを彷彿させる色とうちの家にあるフィルターに似ている色を中心にしています。
アクセントのカラーが存在しないのでなんかのっぺりした感じというか引き締まっていない感じがしているので、ここはUIの見直しを行っていきます。

とはいえ、デザインが得意ではないながらも、なんか悪くないな〜という感じに仕上がっているのではないでしょうか？
個人的にはすごいいい感じのサイトに仕上がって満足しています。
一応PageTransitionもついているので、心地の良い感じもしますしね！

（あとは、個人的にはコーヒーカップのローディングがお気に入りです（笑））

## コーヒー豆を選択するアルゴリズムについて
こちらは非常に苦労しました。（現在も全然満足していない。）
4次元の特徴量に見えなくもないのですが、実際は2次元しか特徴量がないので、非常に難しいわけです。それをいかに4次元っぽくするかというところに悩みました。

その結果。。。
流石にむりだな〜、という結論にいたり、ある程度乱数でも面白いのでは？ （笑） と勝手に解釈して、特徴量には一部乱数が使われています （笑）
ここもいずれUIを変更して、特徴量を増し、より最適なレコメンドを行う事ができるように改善していこうと思っています。

また、特徴量を抽出後は、ユークリッド距離が一番近いものを選択するという圧倒的にシンプルなアルゴリズムになっています。
ここもまだまだ改善の余地がありますね （笑）

## この先の開発ロードマップ
現段階では、正直言ってβ版とも言えない完成度です。まずは、レコメンドしたあとの処理を考えたいですね。現状はGoogle検索に飛ばすという圧倒的に雑な状態なので。（笑）
とりあえず、オンラインストアに飛ばしてあげるのがいいかな〜と思っていますが、このあたりも検証しながら改善していこうと思っています。

もっと先の話で言うと、色々やりたいことはあるのですが、それはおいおいやっていくことにします。

とりあえず、α版みたいな状態ですが、リリースできたので良かったと思っています。

## 最後に
感想待ってます！
これなんか違うやろみたいなマサカリも待っているので、TwitterでDMをいただけると嬉しいです！（笑）
[Twitter](https://twitter.com/Mamerabi_)

使ってもらえるサービスになる用に開発頑張るぞ〜
Ubuntu 18.04 だと AppArmor により /media などで docker build を実行できない

## 背景

Ubuntu 18.04 LTS + snap で docker をセットアップした.

`/media` に外部ディスクをマウントしている(e.g. `/media/work`)

ディレクトリのパーミッションなどきちんと設定しているが, `/media` で docker build を実行(e.g. `docker build .`)すると, `cant stat ...` というエラーになる

## 理由

AppArmor がデフォルトで `/media` などいくつかのマウントポイントを NG にしているからです.

dmesg を見ると以下のようなエラーメッセージがでてます.


```
audit: type=1400 audit(1591894851.159:72): apparmor="DENIED" operation="open" profile="snap.docker.docker" name="/media/work/msvc-wine/" pid=3598 comm="docker" requested_mask="r" denied_mask="r" fsuid=1001 ouid=1001
```

https://docs.docker.com/engine/security/apparmor/


Docker & AppArmor: 30.000 foot view
https://medium.com/lucjuggery/docker-apparmor-30-000-foot-view-60c5a5deb7b

## 解決方法

* apparmor の設定で許可する
* 作業ディレクトリを普通の場所(i.e. $HOME 以下)にする
* docker で `--security-opt` で何かしら設定する?(未検証)

あたりでしょうか. とりあえずは $HOME のどこかにディレクトリ作って Dockerfile 配置して `docker build` が手っ取りばやそうです.
【Ubuntu 20.04、XAMPP 7.4.6-0環境 】インスタンス「Qiitadon」のタイムラインのほとんどのユーザーに認証済みバッジをつける方法

今回はQiitaユーザーおなじみのマストドンのインスタンス「Qiitadon」のタイムラインのほとんどのユーザーに認証済みバッジをつける方法をまとめていきたいと思います。

##環境
・Ubuntu 20.04 LTS
・XAMPP for Linux 7.4.6-0
・Google Chrome バージョン 83.0.4103.97

##準備
###1. XAMPPを起動する
以下のコマンドを打ってアプリケーションを開きます。

```
sudo /opt/lampp/manager-linux-x64.run
```

その後、Go To Applicationをクリックすると、サーバーを動かすか聞かれるので、Start Serversをクリックして、XAMPPを起動しましょう。

###2.認証済みバッジの画像をダウンロードしておく
認証済みバッジの画像をダウンロードしておきます。
[ダウンロード](https://i.imgur.com/bYtqan9.png)

###3.認証済みバッジの画像のファイル名を変える
分かりづらいので、ファイル名を変えてしまいましょう。ファイル名を変えるには、`mv`コマンドを使用します。
※louisのところは自分のUbuntuユーザー名に変えて下さい。他のコマンドでも同じように書き換えて下さい。

```
mv /home/louis/ダウンロード/bYtqan9.png /home/louis/ダウンロード/verified.png
```

###4.画像をコピーする
ファイルのコピーはコマンド`cp`を使います。`/home/louis/ダウンロード`内にある`verified.png`を`/opt/lampp/htdocs/`内にコピーさせます。

```
cp /home/louis/ダウンロード/verified.png /opt/lampp/htdocs/verified.png
```

##実行
###1. Chrome拡張機能「My Style」をインストールする
まず、CSSを追加できるGoogle Chromeの拡張機能「[My Style](https://chrome.google.com/webstore/detail/my-style/ljdhjpmbnkbengahefamnhmegbdifhlb)」をインストールします。

###2. Qiitadonを開く
[Qiitadon](https://qiitadon.com/)をブラウザで開きます。

###3. Ctrl+Mを押す
CtrlキーとMキーを同時に押してターミナルを開きます。

###4. CSSをコピーする
下記のCSSをターミナルにコピーして貼り付けます。

```
.account__display-name strong, .status__display-name strong:after{
  content: '';
  display: inline-block;
  width: 17px;
  height: 17px;
  background-image: url(http://localhost/verified.png);
  background-size: contain;
  vertical-align: middle;
}
```

###5. Ctrl+Mを押して閉じる
再度CtrlキーとMキーを同時に押して、ターミナルを閉じます。

###6. 認証済みバッジが表示されていれば成功
認証済みバッジがほとんどのアカウントに表示されていれば成功です。お疲れ様でした。

##注意点
・この方法を使うと、フォローとフォロワーページ、通知のフォロワーが追加されたときのアカウント名が一文字目と認証済みバッジが重ね合わせになります。このバグを直す方法を見つけた人がいましたら、ぜひコメントをよろしくお願い致します。
・一部ユーザーには文字数の関係で認証済みバッジが表示されません。ご了承下さい。
・ユーザーアカウントページには認証済みバッジは表示されません。表示されるのはあくまでタイムラインのみです。

##簡単にする方法
上記の手順では難しいと考えられる方がいるかもしれないので、簡単な方法を書いておきます。

###1. Chrome拡張機能「My Style」をインストールする
まず、CSSを追加できるGoogle Chromeの拡張機能「[My Style](https://chrome.google.com/webstore/detail/my-style/ljdhjpmbnkbengahefamnhmegbdifhlb)」をインストールします。

###2. Qiitadonを開く
[Qiitadon](https://qiitadon.com/)をブラウザで開きます。

###3. Ctrl+Mを押す
CtrlキーとMキーを同時に押してターミナルを開きます。

###4. CSSをコピーする
下記のCSSをターミナルにコピーして貼り付けます。

```
.account__display-name strong, .status__display-name strong:after{
  content: '';
  display: inline-block;
  width: 17px;
  height: 17px;
  background-image: url(https://i.imgur.com/bYtqan9.png);
  background-size: contain;
  vertical-align: middle;
}
```

###5. Ctrl+Mを押して閉じる
再度CtrlキーとMキーを同時に押して、ターミナルを閉じます。
Laravelでデータベースを扱う準備をする

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

MySQLを使用します

# MySQLにデータベースを作成する

```
CREATE DATABASE laravel_sample CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
```
MySQLに上記SQLを実行しデータベースを作成する

# データベースへの接続定義を書く
(1) /sample/.env修正
上記で作成したデータベースへアクセスするための設定を書く

```
‥‥
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_sample
DB_USERNAME=root
DB_PASSWORD=
‥‥
```
DB_CONNECTION、DB_HOST、DB_PORT、DB_USERNAME、DB_PASSWORDは自分の使用している環境の値にしてください

(2) /sample/config/database.php修正
.envに書いたDB接続定義はdatabase.phpで使われています
database.phpに定義されている配列の'connections'=>'mysql'=>'collation'要素修正

```
‥‥
'connections' => [
‥‥
        'mysql' => [
‥‥
            'collation' => 'utf8mb4_bin',
‥‥
```
collationがutf8mb4_unicode_ciになっていると思うのでutf8mb4_binに直す
LPICレベル１の学習メモ

重い腰を上げてBashについての学習をすることにした

#Bash
##bashの設定ファイル
* /etc/profille
    * ログイン時に実行されてすべてのユーザから参照される
    * 基本的な環境変数や履歴サイズなどの設定ができる     
* /etc/bash.bashrc
    * bash起動時に実行され、すべてのユーザから参照される
* /etc/bashrc
    * ~/.bashrcから参照される
* ~/.bash_profile
    * ログイン時に実行される
* ~/.bash_login
    * ~/.bash_profileがない場合、ログイン時に使われる
* ~/.profile
    * ~/.bash_loginも~/.bash_profileもない時に実行される
* ~/.bashrc
    * bash起動時に実行される
* ~/.bash_logout
    * ログアウト時に実行される
    
メモ
/etc以下の設定ファイルは全ユーザに影響を起こす
ホームディレクトリ以下は　ユーザごと
FileUtilsメソッドのpermission指定は8進数

## mkdir_p でディレクトリを作る時に、permissionも指定したい...

### mkdir_pについて

```
ディレクトリ dir とその親ディレクトリを全て作成します。

例えば、

require 'fileutils'
FileUtils.mkdir_p('/usr/local/lib/ruby')
は以下の全ディレクトリを (なければ) 作成します。

/usr
/usr/local
/usr/local/bin
/usr/local/bin/ruby
```

引用
https://docs.ruby-lang.org/ja/latest/class/FileUtils.html#M_MAKEDIRS

### permissionを指定して作成してみる

Linuxコマンドだと..
`mkdir -p -m 755 ./hoge1/hoge2/hoge3/ruby` だから
ruby的には

```test.rb
require 'fileutils'

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)
```

かな？

早速実行

```shell
$ ruby test.rb
$ ls -la
d-wxrw--wt    3 casix  staff     96 Jun 12 01:06 hoge1/
```

いや、明らかに権限は 755 ではない...

## mkdir_pのソースコードを読んでみた

```fileutils.rb
# File fileutils.rb, line 194
def mkdir_p(list, mode: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
  return *list if noop

  ...
end
```

modeに入れた引数の処理をよく読むと

```.rb
mkdir -p #{mode ? ('-m %03o ' % mode) : ''}
```

とある

```.rb
#{mode ? ('-m %03o ' % mode) : ''}
```

が755になっていれば、いいはずだが

```.rb
'-m %03o ' % mode
```

modeに755を入れると

```.rb
irb(main):001:0> mode = 755
=> 755
irb(main):002:0> '-m %03o ' % mode
=> "-m 1363 "
```

1363が返ってきてしまう

と言うことは...

```.rb
FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)
# ↓
# $ mkdir -p -m 1363 ./hoge1/hoge2/hoge3/ruby
```

になっていたということ

### 引数に入れるべきは10進数ではなく、8進数だった

```.rb
'-m %03o ' % mode

# %03o は 0詰め3桁の8進数で出力するということなので
# modeには755を10進数に変換した数字(493)を入れる

irb(main):001:0> mode = 0o755
=> 493
irb(main):002:0> '-m %03o ' % mode
=> "-m 755 "
```

いけそう

修正してみる

```.rb
FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 0o755)

# FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 0755) でもおk
```

```shell
$ ls -la
drwxr-xr-x    3 casix  staff     96 Jun 12 01:43 hoge1/
```

755で設定出来てそう！

## mkdir_pに関わらず、FileUtilsでは、permissionの設定は8進数だった

そもそもmkdir_pに限らなかった
FileUtilsでpermissionを指定出来るメソッドは全て同じ仕様みたい

https://docs.ruby-lang.org/ja/latest/class/FileUtils.html#options

(ちなみに0から始まる時は、8進数になるという知識は忘れがち...)
配列を操作するメソッド

# プログラミングの勉強日記
2020年6月12日　Progate Lv.87
JavaScript Ⅵ
配列を操作するメソッドとしてpushメソッド、forEachメソッド、find メソッド、filterメソッド、mapメソッドについて消化する。

##pushメソッド
　配列の最後に新しい要素を追加するメソッド。pushメソッドのあとの`()`の中に追加したい要素を入れる。

```javascript:配列に4を追加する
const numbers = [1,2,3];
console.log(numbers);     //コンソール結果は「[1,2,3];」
numbers.push(4);
console.log(numbers);     //コンソール結果は「[1,2,3,4];」
```

##forEachメソッド
　配列の中の要素を1つずつ取り出して、すべての要素に繰り返し同じ処理を行うメソッド。

```javascript
const numbers = [1,2,3];
numbers.forEach((number) => {
  console.log(number)
});
```
　コンソール結果は
「  1
 　 2 
　  3  」
　この例では引数numberに配列の値それぞれが代入されて、関数の処理が実行される。
　`()=>`の書き方を<font color=orange>アロー関数</font>という。
　このプログラムの`(number) => { console.log(number); }`の部分を<font color=orange>コールバック関数</font>という。コールバック関数は引数に入っている関数のことである。

##findメソッド
　コールバック関数の処理部分に記述した条件式に合う1つ目の要素を配列の中から取り出すメソッド。条件にあう最初の要素を取り出せる。そのため、<font color=blue>条件に合う最初の1つの要素しか取り出せない。</font>

```javascript
const numbers = [1,3,5,7];
const foundNumber = numbers.find((number) => {
  return number>3;    //条件に合う要素が戻り値となる
});
console.log(foundNumber); //コンソール結果は「5」
```
　この例では、1と3は条件に合っていないので出力されず、5で条件に合う要素が見つかったので、出力されて、これ以降の要素は出力されない。
　配列の要素がオブジェクトであってもfindメソッドは使うことができる。

```javascript
const characters = [
  {id:1, name:"田中太郎"},
  {id:2, name:"山本花子"}
];
const foundCharacter = characters.find((character) => {
  return character.id === 1;  //character.idはオブジェクトプロパティ
});
console.log(foundCharacter);  //コンソール結果は「{id:1, name="田中太郎"}」
```

##filterメソッド
　記述した条件にあう要素のみを取り出して新しい配列を作成するメソッド。条件に合う要素がすべて取り出されて配列を作成する。

```javascript
const numbers = [1,3,5,7];
const filteredNumbers = numbers.filter((number) => {
  return number>3;
});
console.log(filteredNumbers);  //コンソール結果は「[5,7]」
```
　findメソッド同様に配列の要素がオブジェクトの場合でも使用できる。

```javascript
const characters = [
  {name:"田中太郎", age:14},
  {name:"山本花子" age:26},
  {name:"斎藤一郎" age:8}
];
const filteredCharacters = characters.filter((character) => {
  return character.age>10;
});
console.log(filteredCharacters);  
```

コンソール結果は
 [
 {name:"田中太郎", age:14}
 {name:"山本花子" age:26}
]
となる。

##mapメソッド
　配列内のすべての要素に処理を行い、その戻り値から新しい配列を作成するメソッド。

```javascript
const numbers = [1.2.3];
const doubledNumbers =numbers.map((number) => {
  return number*2;
});
console.log(doubledNumbers); //コンソール結果は「[2,4,6]」
```

配列の要素がオブジェクトの場合でも使用できる。

```javascript
const names = [
  {firstName:"Taro", lastName:"Tanaka"},
  {firstName:"Hanako", lastName:"Yamada"}
];
const fullNames = names.map((name) => {
  return name.firstName+name.lastName;
});
console.log(fullNames);  //コンソール結果は「["TaroTanaka","HanakoYamada"]」
```