OmniAICreator/Qiita-1.07M huggingface dataset:
A - Divide a Cuboid, A - Triangle

##[A - Divide a Cuboid](https://atcoder.jp/contests/agc004/tasks/agc004_a)

O(1)
偶数が存在する場合は差は０になります。
奇数の辺しか存在しない場合、一番大きい辺（Aとする）を２で割り、答えをTとします。

(A-T)＊B＊C - T ＊B＊C
これが答えになります。

```python:python
import math
import heapq
import itertools
from functools import reduce

# main
def main():
    A, B, C = list(map(int, input().split()))

    if A%2 == 0 or B%2 == 0 or C%2 == 0:
        print(0)
    else:
        top = max(A, B, C)
        under = min(A, B, C)
        middle = A^B^C^top^under

        top = top//2
        res = (max(A, B, C) - top) * middle * under - (top * middle * under)

        print(res)

# エントリポイント
if __name__ == '__main__':
    main()
```

##[A - Triangle](https://atcoder.jp/contests/agc036/tasks/agc036_a)

おぎのさんという方に教えてもらいました。
ありがとうございます。

1点を(0, 0)に置きます。
頂点の制約は、0<= x1, y1, x2, y2, x3, y3 <= 10**9。
面積は|x2y3 - x3y2| = S。

最大値が10^9の為、
x2 = 10^9
x3 = 1
と固定します。

その時、公式を変形して、
y3 = (S - y2) / 10^9
y2 = y3*10^9 - S
となります。

制約から、
0 <= y2 <= 10^9
0 <= y3*10^9 - S <= 10^9

y3*10**9 - Sについて変形します。

0 <= y3*10^9 - S <= 10^9
S <= y3*10^9 <= 10^9 + S
S / 10^9 <= y3 <= 1 + S / 10^9

となります。
つまりy3は整数の為、S/10^9の切り上げの数字になります。


```python:python
import math
import heapq
import itertools
from functools import reduce
 
def main():
    S = int(input())
 
    Y3 = (S + 10**9 - 1) // 10**9
    Y2 = Y3*10**9 - S
 
    print("{0} {1} {2} {3} {4} {5}".format(0, 0, 10**9, Y2, 1, Y3))
 
if __name__ == '__main__':
    main()
```

##感想
解説PDFを見ても理解できませんでした。
0 <= y2 <= 10^9
0 <= y3*10^9 - S <= 10^9
S <= y3*10^9 <= 10^9 + S
S / 10^9 <= y3 <= 1 + S / 10^9
この式を教えてもらい切り上げを理解できました。
数学できない勢にA - Triangleは難しい！
でも理解したので同じ問題がきたらできそうです。
【初学者備忘録】1：用途別開発言語とPython用語まとめ

#【プログラミング初学者備忘録 】1日目

##投稿のきっかけ
1. プログラミングを自己学習で一時期学んでいましたが、しばらく離れてしまったこと
2. 自己学習も自分で開発ができるレベルではなく、なんとなく理解しているような状態で終わってしまった

初学者として自分が日々疑問に感じたことや、わからなかった用語について調べた結果などを書いていきたいと思います。


##目標
今年中に
- PHPでのWEBページの開発
- pythonでの開発

こちらの二個を目標に投稿していきます。
今年の終わりには、それぞれ一個ずつアプリやWEBページを作成・完成させようと思います。
日記や学習の振り返りも含めて日々投稿を目指します。


##備忘録#1
初回の今回は今までなんとなく流していた用語について
質問された時に答えられずスタート地点に立てていないと思ったので

今回は
①プログラミング言語の種類と用途
②Pythonで使われる用語・意味

業務で調べたり、気になった部分があったのでこの二点について書いていきます。

##①プログラミング言語の種類と用途

**インタプリンタ言語**
コードを先頭から順に処理・実行していく
コンパイル言語より処理速度は劣るが、コードの簡便性や柔軟性があり、WEBアプリ開発で使用されることが多い。
JavaScript・PHP・Rubyなどが該当する

**コンパイル言語**
処理速度が早いが、翻訳して実行するまでどこがエラーなのかわからない
C言語・C++などが該当する


| プログラミング言語  | 主な用途                         |
|:---------------|---------------------------------|
| PHP       　　　| WEB関連のバックエンドで使用           |
| JavaScript     | WEB関連のフロントエンドで使用          |
| Python         | 汎用性が高く、AIや機械学習で使用       |
| GO             | 速度を求められるサーバサイドで使用      |
| Kotlin         | Androidアプリ開発で使用              |
| Java           | 汎用性が高いが、主に業務アプリで使用    |
| Swift          | iOS・macOSのアプリ開発で使用         |
| C#             | サーバーサイド・アプリ開発で使用         |
| C++            | 速度やメモリ効率を求める場面で使用     |
| R              | 統計に強く、AIや機械学習で使用        |

##②Pythonで使われる用語・意味

|   用語      |                意味                          | 　　使い方                               |
|------------|---------------------------------------------|-----------------------------------------|
| モジュール    | 呼び出すだけで便利に使える処理を集めたもの           | import モジュール名                       |
| パッケージ    | 複数のモジュールをディレクトリに入れてひとまとまりにしたもの | import パッケージ名                       |
| 標準ライブラリ | Pythonに標準で用意されたパッケージ・モジュール・関数・定数| importの必要があるものとないものがある         |
| 外部ライブラリ | 標準で用意されていないパッケージ・モジュール・関数・定数   | importだけでは使用できず、インストールの必要がある|
| 関数       | 使う機能をひとまとめにできる機能                     | def 関数名                              |
| pip        | Pythonのパッケージ管理ツール                     | pip install パッケージ名                  |



##今日の一言
今回は初回ということで、今日触れた用語や今まで用途を理解していなかったプログラミング言語について書きました。
明日以降は自主学習で得たことやつまづいたことを書いていこうと思います。

もっと基礎の部分から、やり直さないといけないと思うので
そこは追い追い自分の振り返りも含めて更新していきます。
当面は技術的な部分よりも用語やプログラミングに関する思考の部分などを書いていくことが増えると思います。
サードパーティのライブラリ(framework)からxcframeworkを作成する

### 環境

```
- Xcode: 12.3 (12C33)
- xcodegen: 2.18.0
```

## 前振り

:bow:「今度の案件でサードパーティfooのbarってライブラリ使うから導入おなしゃす」

:ok_hand:「おけまる」

```bash
bar-native-client-sdk-ios
├── FrameworksDevice
│   └── barSDK.framework
└── FrameworksSimulator
    └── barSDK.framework
```

:worried: 「なん…………だと………!!」

---

## 解決： universal framework編

:wink:「OK、universal frameworkになってないのね」

```bash
> lipo -info bar-native-client-sdk-ios/FrameworksDevice/barSDK.framework
Architectures in the fat file: bar-native-client-sdk-ios/FrameworksDevice/barSDK.framework is architecture: armv7 arm64

> lipo -info bar-native-client-sdk-ios/FrameworksSimulator/barSDK.framework
Architectures in the fat file: bar-native-client-sdk-ios/FrameworksSimulator/barSDK.framework is architecture: x86_64 i386 arm64
```

:relieved:「ならこうやってくっつけてっと」

```
lipo \
bar-native-client-sdk-ios/FrameworksDevice/barSDK.framework \
bar-native-client-sdk-ios/FrameworksSimulator/barSDK.framework \
-create -output build/universal-barSDK.framework

fatal error: /Applications/Xcode-12.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: bar-native-client-sdk-ios/FrameworksDevice/barSDK.framework and bar-native-client-sdk-ios/FrameworksSimulator/barSDK.framework have the same architectures (arm64) and can't be in the same fat output file
```

:confused:「しまった、arm64がダブってしまった...」


:grinning:「ならarm64を削除してからっと」

```bash
lipo \
-remove arm64 \
bar-native-client-sdk-ios/FrameworksSimulator/barSDK.framework \
-output build/barSDK_no_arm64.framework

lipo \
bar-native-client-sdk-ios/FrameworksDevice/barSDK.framework \
build/barSDK_no_arm64.framework \
-create -output build/universal-barSDK.framework
```

:thinking:「でもこれだとM1で動かないんだよね...」

---

## 真解決： xcframework編

:smile:「Xcode11からxcframeworkが使えるらしいな」

```bash
xcodebuild \
-create-xcframework \
-framework bar-native-client-sdk-ios/FrameworksDevice/barSDK.framework \
-framework bar-native-client-sdk-ios/FrameworksSimulator/barSDK.framework \
-output build/barSDK.xcframework
```

:laughing:「あとはdependenciesに追加して、ビルドっと」

```yaml:project.yml
    dependencies:
      - framework: bar-native-client-sdk-ios/barSDK.xcframework
```

```
ld: framework not found barSDK
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

:confounded:「ビルドこけた」

```yaml:project.yml
    sources:
      - path: build
        optional: true
```

:innocent:「sourceに追加してなかったよ」

---

## 参考

- [Xcode 12 で自作 framework ビルド時に lipo コマンドがエラーを吐くようになった](https://qiita.com/noobar/items/175911c4f004df0a5f20)
- [XCFrameworkって何？どうやって作成するの？](https://qiita.com/yamashi/items/1f5209d00b9f09e77e85)
- [ld: framework not found ****** clang: error: linker command failed with exit code 1 (use -v to see invocation)](https://qiita.com/sachiko-kame/items/be548a7942e6c22a1828)
作業中コミットせずにブランチを変更したい時の【git stash】のよくある使い方


## 【準備】前回のgit stashが残っていないかを確認する
```
git stash list
```
## 一時的な退避が残っていた場合
```
git stash clear
```
このコマンドですべて削除できます。
あくまで一時退避なので、長期間stashを残すのはオススメしません。
必要なものは残しておきます。

## 一部を削除したい時
```
git stash drop stash@{n}
```
ここがポイントなのですが一番最新の「git stash」したものが{0}になります。
古い退避は0,1,2,3,4,,,nと数字が大きくなっていきます。

## 【本編】stage前の変更を一時保存する
```
git stash
git stash save
```
コマンドはどちらでも構いません。上は単なる省略形です。
ちなみに、私は省略しないで下のコマンドを使います。
自分が何をしているのか忘れないために、極力省略形は使わない癖を付けています。

## ブランチの移動
```
git branch
* develop
  master
git checkout master
git branch
  develop
* master
```
「git stash」をしたことでワーキングツリーがクリーンになりブランチの移動ができるようになります。
今回は、「develop」から「master」へ移動しています。多くの場合は、トピックブランチ(作業ブランチ)からバグフィックス(修正ブランチ)への移動が多いと思います。その後、トピックブランチへ戻ります。

## 修正作業が終わったら一時退避を元に戻します
```
git stash apply stash@{0}
```
ここで最新の「git stash」の番号は「0」になります。
「git stash」が溜まっていると、applyする番号を間違えやすいです。
## 「git stash apply」の番号を間違えた場合
```
git checkout .
```
上記のコマンドでワーキングツリーをクリアにして、前回のコミットまで戻します。
その後、再度正しい番号の「git stash apply stash@{n}」を行ってください。
## さいごに
```
git stash list
git stash clear
```
最後に一時退避リストを確認してから、すべて削除しましょう。
一時退避を長期間残しておく、必要性はないです。
イカしたコミットログを表示する

# 方法
①gitのエイリアスを設定

```shell
$ vim ~/.gitconfig
```

```shell:.gitconfig

[alias]
        tree = log --graph --pretty=format:'%x09%C(auto) %h %Cgreen %ar %Creset%x09by"%C(cyan ul)%an%Creset" %x09%C(auto)%s %d'
```
②ターミナルで`$ git tree`を入力

**実行結果**

![スクリーンショット 2021-03-03 1.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612915/3e425a1e-ebd0-bf21-c41c-9dd055b8b192.png)
Rubyで実装するデザインパターンAdapter

## Adapterパターンとは
- 特徴
  - レガシーなクラスを変更せずにそのメソッドを使うことができます
  - 異なるクラスについて、同じような処理をしたい時に共通のインターフェイスで実行できます

ActiveRecordでもデータベースエンジン毎のコネクションにAdapterパターンが使われたりもしています。

構成は以下のような形です。

- 利用者(Client)：ターゲットのメソッドを呼び出す
- ターゲット(Target)：インターフェースを規定
- アダプタ(Adapter)：アダプティのインターフェースを変換してターゲット向けのインターフェースを提供
- アダプティ(Adaptee)：実際に動作する既存のクラス

今回はシンプルな例を挙げたいと思います。

## 具体例
clientからはTargetクラスにあるrequestメソッドを呼び出すことができるが、そのメソッド名を変えずにAdapteeクラスのold_requestメソッドを呼び出したいとします。

それでは実装に入ります。
Targetクラスは`request`メソッドを持っています。

```target.rb
class Target
  def request
    '新しいクラスです'
  end
end
```

ここに古いクラスがあり、`old_request`メソッドを持っているとします。

```adaptee.rb
class Adaptee
  def old_request
    '古いクラスです'
  end
end
```

client_codeメソッドではTargetクラスのインスタンスを受け取り、`request`メソッドを呼び出しています。
ここで古いクラスの`old_request`をclient_codeメソッドで呼び出したかった時にAdapterが力を発揮します。

```client.rb
def client_code(target)
  puts target.request
end

target = Target.new
client_code(target)
#=> '新しいクラスです'
```

Adapterクラスを定義しました。
ここではTargetクラスで定義されているrequestメソッドを上書きし、中では古いクラスであるAdapteeの`old_request`を呼び出します。
これによって、`request`メソッドを経由して`old_request`メソッドを呼び出していることになります。

```adapter.rb
class Adapter < Target

  def initialize(adaptee)
    @adaptee = adaptee
  end

  def request
    @adaptee.old_request
  end
end
```

TargetクラスのインスタンスとAdapterクラスのインスタンスで比べてみるとわかりやすいです。
Adapterを`client_code`メソッドに渡すことで、`request`メソッドによって`old_request`メソッドを呼ぶことができています。
古いクラスを`request`メソッドに合わせることもなく、`client_code`も変更せずに済みました！

```client.rb
def client_code(target)
  puts target.request
end

target = Target.new
client_code(target)
#=> '新しいクラスです'

adapter = Adapter.new(Adaptee.new)
client_code(adapter)
#=> '古いクラスです'
```

## 参考
[Adapter in Ruby](https://refactoring.guru/design-patterns/adapter/ruby/example)
[Rubyによるデザインパターン5原則](https://qiita.com/kidach1/items/4b63de9ad5a97726c50c)
[アダプタ(Adapter) | Ruby デザインパターン](https://morizyun.github.io/ruby/design-pattern-adapter.html)
systemdによる電源管理下で, SSH接続中のユーザーがいるときにスリープさせない

systemdが動いている一般的なLinuxで, SSH接続しているユーザーが存在するときにスリープ (サスペンド, ハイバネート) させない方法です.

systemdが標準で入っている昨今のLinuxディストーション (Ubuntuとか) であれば, 適用可能です. ただ, デスクトップ向けにセットアップしたLinuxマシンでもなければ, サスペンド/ハイバネートといった設定はしないので, ややニッチな話題です.

# 背景

デスクトップ用途で稼働させているLinuxの場合, 省電力のための設定を有効にしておくことが多いかと思います (操作が行われないまま一定時間経過したら, サスペンド/ハイバネートさせるとか).

書斎にあるLinuxがインストールされたデスクトップPCへ, リビングのノートパソコンからちょっとした用事があるときにSSH接続することがありますが, ここが問題. そういったSSH接続しての作業中は無操作状態とみなされて, 時間がきたらサスペンドされてしまうのです.

横着せずに省電力設定を止めるなりすればいいだけのことですが, ここはsystemdらしいアプローチでの解決方法をとってみました.

# 確認に使った環境

Archlinuxで動作確認しています. デスクトップ環境はGNOMEで, GNOME標準の設定画面から省電力設定をおこなってます.
systemdが入っている昨今のほとんどのLinuxディストリビューションなら同じことができるはず.

# やりかた

次のようなファイルを作成します. systemdのユニットファイルと呼ばれるものです.
作るディレクトリは記載の通り `/etc/systemd/system`.

```
[kosuke@cf-sx1 ~]$ cat /etc/systemd/system/inhibit-sleep.service
[Unit]
Description=Inhibit sleep when ssh logged
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c '! who | grep -q "(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\})"'

[Install]
RequiredBy=sleep.target
```

スリープフックと呼ばれるもので, スリープ (サスペンド, ハイバネート) する前にExecStartで指定したコマンドが実行されるようになります.
whoコマンドSSHログイン中のユーザーがいないかチェックして, もしいたら終了コード0以外にして後続処理を動かさないことで実現します.

ファイルを作成したら, 次のコマンドでユニットを有効にします.

```
# systemctl enable inhibit-sleep.service
```

これで準備OKです.

# 動作確認してみる

対象のマシンは20分でサスペンドするように設定されています.

動作確認したあとのログを見てみましょう.

```
[kosuke@cf-sx1 ~]$ journalctl -f -usleep.target
-- Journal begins at Fri 2020-07-24 20:13:01 JST. --
 3月 03 23:06:33 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:06:45 cf-sx1 systemd[1]: Stopped target Sleep.
 3月 03 23:07:18 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:07:18 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.
 3月 03 23:28:38 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:28:38 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.
 3月 03 23:48:39 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:49:14 cf-sx1 systemd[1]: Stopped target Sleep.
```

これだけだとわからないので, 少しずつ説明してみます.

これは設定を入れた後にSSHログインユーザーがいない状態でサスペンドコマンド `systemctl suspend` でサスペンドさせてみた結果です.
*Reached* でサスペンド, *Stopped* で復帰です.

```
 3月 03 23:06:33 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:06:45 cf-sx1 systemd[1]: Stopped target Sleep.
```

次にSSHでログインしているユーザーがいるときに, 同じコマンドでサスペンドを試みます. すると, sleep.targetに依存させるよう追加/設定した前述のユニットファイルが失敗するので, スリープも実行されなくなります.

```
 3月 03 23:07:18 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:07:18 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.
```

このまま20分ほど放置……. ここでも同じようにスリープされません.

```
 3月 03 23:28:38 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:28:38 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.
```

ここでSSH接続しているユーザーをログアウトさせます. さらに20分ほど経過すると, 今度はサスペンドされました.

```
 3月 03 23:48:39 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:49:14 cf-sx1 systemd[1]: Stopped target Sleep.
```


# 参考資料

[電源管理 - ArchWIki](https://wiki.archlinux.jp/index.php/%E9%9B%BB%E6%BA%90%E7%AE%A1%E7%90%86)

たいていのことはArchWikiに書いてある気がする.
【Laravel】FromRequestのバリデーションルールを共通化する + おまけ


・ヮ・）あ、おはようございまーす

みなさんは複数のリクエストで同じパラメータをバリデーションするときにどうしていますか？

私はコピペで書いていたのですが、ルール変更したいときに修正コスト高くなったり
同じパラメータなのに違うルールが書いてあったり…:joy:

そんなことがあったので [Laravelのバリデーションルールを共通化するやつ](https://github.com/schrosis/laravel-generalize-validationrules) を作りました
メモとして置いておきます


## インストール方法

というにはおこがましいですが、ファイル1つだけなんで [ValidationRules.php](https://github.com/schrosis/laravel-generalize-validationrules/blob/main/ValidationRules.php) を app 直下にコピーしてださい

※違うディレクトリに置く場合は、名前空間をよしなに書き換えてください

## 使い方

### ルールを定義する

`RULES` にバリデーションルールを定義します

```php
protected const RULES = [
    'posts' => [
        'title' => ['string', 'between:10,255'],
        'body' => ['string'],
        'publish_at' => ['date'],
    ],
];
```

 - ネストすることもできます
 - ルールは配列記法、 `|` 区切りの文字列記法に対応しています

### ルールを取得する

FormRequest などバリデーションルールを取得したいところで `getRules()` を呼び出します

```php
public function rules(\App\ValidationRules $rules)
{
    return $rules->getRules([
        'posts.title' => ['required'],
        'posts.body',
        'posts.publish_at',
    ]);
}
```

 - ネストされたルールは `.` (ドット)記法で書いてください
 - 追加したいルールがあれば、連想配列にして渡してあげてください
 - 定義していないルールを取得しようとすると `OutOfRangeException` がスローされます

上の例では以下のルールが返ります

```php
[
  'title' => ['required', 'string', 'between:10,255'],
  'body' => ['string'],
  'publish_at' => ['date'],
]
```

### パラメーター名に別名をつける

`users.name` と `pets.name` のルールを取得しようとすると、後に指定した `pets.name` のルールのみ `name` のキーで返ってきます

このような状況を避けるには第2引数で別名を指定します

```php
$keyAliases = [
    'users.name' => 'user_name',
    'pets.name' => 'pet_name',
];

app(\App\ValidationRules::class)->getRules(
    [
        'users.name',
        'pets.name',
    ],
    $keyAliases
);
```

また、常に別名を付けたいパラメータ名がある場合は `ValidationRules::KEY_ALIASES` に定義してください

`getRules()` の第2引数
`KEY_ALIASES` 定数
ドット区切りの最後の文字列(デフォルト)
の優先順位でパラメータ名が採用されます

※パラメータ名を変えた場合は、`required_if` のような他のパラメータを参照するルールに気をつけてください
※また、 `attributes` にも気をつけてください 

## カスタマイズする

### ルールを定義する場所を変更する

`ValidationRules::RULES` じゃない場所にしたい場合は `all()` を書き換えるか、 `ValidationRules` を継承してオーバーライドしてください

### 指定したルールが見つからなかった場合の挙動を変えたい

デフォルトでは定義していないルールを取得しようとすると `OutOfRangeException` がスローされます

定義していないルールを取得しようとしたとき、空配列を返したい場合は `notFound()` を書き換えるか、 `ValidationRules` を継承してオーバーライドしてください

## おまけ

### FormRequestにゲッターメソッドを作る

コントローラーで Requestの `input` `all` `query` `get` `__get` `only` `except` 使うのって怖くないですか？
FormRequestでバリデーションされているから安心？
FormRequest側でバリデーションルール変更したとき影響の調査面倒じゃないでしょうか？

```php
public function getEmail(): string
{
    return $this->input('email');
}
```

こんなメソッドをバリデーションを実施しているFormRequestに書いてあげて
ついでにユニットテストも書いてあげれば
コントローラーで安心してリクエストパラメーターを受け取れますね

また、バリューオブジェクトに変換してあげることもできるのでDDDニキもにっこりですね:relaxed:

FormRequestでゲッターを書いてよりよいLaravelライフを！
Terraformのバージョンは固定した方が良さそう。

# はじめに
* ローカル環境からterraform applyした際に、リモートのversionと差異があり、あ。。。。となったことあると思います。あるはずです。あると願っています。
* そんな時は、versionの固定を進言しましょう。w

## Terraformのバージョン固定方法
* とても簡単で、名前はなんでもいいですが、分かりやすくするために**versions.tf**という名前で、tfファイルを作成し、**required_version**を措定するだけです。

### ガチガチにversionを固めたい場合

```versions.tf
terraform {
  required_version = "0.13.5"
}
```

### 0.13以上で固めたい場合

```versions.tf
terraform {
  required_version = ">= 0.13"
}
```
大量の画像ファイルから特定の画像ファイルを抽出

#目的

Pythonを用いて、
大量の画像が含まれたフォルダの中から使用する画像だけを一括で抽出したい。

抽出したい画像のファイル名が
ExcelファイルやCSVファイルの"filename"列に書かれているものとする。

#本記事について
この記事はPython初心者に向けて掲載しています。
これを参考にすればタイトルのようなことがすぐにできるようになっています。


#コード全体

```Python:全文
import os
import shutil
import pandas as pd

src_dir = ("抽出元のフォルダのパス") 
dst_dir = ("抽出先のフォルダのパス") 

# 表データ読み込み
df = pd.read_csv("data.csv")
# df = pd.read_excel("data.xlsx")  Excelファイルの場合

# filename列の読み込み
filenames = df["filename"]


# 各画像を個別にsrc_dirからdst_dirにコピー
for f in filenames:
    src_path = os.path.join(src_dir, f)
    dst_path = os.path.join(dst_dir, f)
    if os.path.isfile(src_path):
        shutil.copy(src_path, dst_path)
```

###ライブラリのimport

最初にライブラリを`import`しておきましょう。
これは既に構築済みのプログラムを呼び出すことができます。
`import`すればコードを簡略化することができます。

pandasは表データを扱うためのライブラリです。
今回はExcelファイルやCSVファイルを読み込むのに使用しています。

`shutil`はファイルのコピーに使用しています。
`os`はファイルやフォルダの操作に向いていて、ファイルの存在確認やパスを扱う際に使用しています。

```Python:ライブラリのimport
import os
import shutil
import pandas as pd
```

###ファイル名の読み込み
CSVファイルは`pd.read_csv('data.csv')`で読み込めます。
Excelファイルは`pd.read_excel('data.xlsx')`で読み込めます。
かっこの中はそれぞれ利用したいファイル名に変更しましょう。

CSVファイルやExcelファイルを読み込んだ後、列名(今回はfilename)を指定して読み込みましょう。


```python:読み込み
# 表データ読み込み
df = pd.read_csv("data.csv")
# df = pd.read_excel("data.xlsx")  Excelファイルの場合

# filename列の読み込み
filenames = df["filename"]
```

###抽出元、抽出先の指定

`src_dir`は大量の画像が含まれたフォルダのパス、
`dst_dir`はコピー先のフォルダのパスをそれぞれ指定しましょう。

ちなみにsrcはsourceの略、dstはdestinationの略です。

```python:
src_dir = ("抽出元のフォルダのパス") 
dst_dir = ("抽出先のフォルダのパス")
```

###画像のコピー

for文で各画像のコピーをしていきます。

`os.path.join(src_dir, f)`は抽出元のフォルダパスと各画像のファイル名を結合し、
画像ファイルのパスにしています。

`dst_path = os.path.join(dst_dir, f)`は抽出先のパスです。
`os.path.isfile(path)`はファイルの存在確認のためにしています。

`if os.path.isfile(path):
    shutil.copy(src_path, dst_path)`
で`src_path`に`dst_path`がなければコピーするというコードになっています。

```Python:画像のコピー
# 各画像を個別にsrc_dirからdst_dirにコピー
for f in filenames:
    src_path = os.path.join(src_dir, f)
    dst_path = os.path.join(dst_dir, f)
    if os.path.isfile(src_path):
        shutil.copy(src_path, dst_path)
```

#まとめ

私たちは普段、上述したようなコードを使用しファイルを抽出しています。
Pythonを用いることができれば手作業で数時間かかるようなことも数分あれば出来てしまいます。
ぜひ、短縮できた時間の有効活用してください。
【NestJS】stripe webhookの署名検証

## 概要
1. 署名シークレットを取得
2. リクエストに `rawBody` を追加する
3. コントローラで `request.rawBody` より `rawBody` を取得する
4. コントローラで `stripe-signature` より ヘッダの署名を取得する
5. 署名の検証

## ハマりポイント

署名の検証時に `raw body` が必要になるため、リクエストに `rawBody` を追加する必要がある

### 1. 署名シークレットを取得

- 開発者の `Webhook` をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320365/98ae3a68-9709-91fc-cf54-f39e176b0155.png)


- エンドポイントを追加後、署名シークレットを取得

  - `prefix` が  `whsec_`  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320365/0b0ee3c2-fcb1-e120-4c5d-7430089deb98.png)


### 2. リクエストに `raw body` を追加する

- before

`nest new [name]` で生成した結果

```ts:main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();
```

- after

リクエストに raw body を追加する

```ts:main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { json } from 'body-parser';

const cloneBuffer = require('clone-buffer');

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(
    json({
      verify: (req, res, buf, encoding) => {
        // リクエストに `raw body` を追加する
        if (req.headers['stripe-signature'] && Buffer.isBuffer(buf)) {
          (req as any).rawBody = cloneBuffer(buf);
        }
        return true;
      },
    }),
  );

  await app.listen(3000);
}
bootstrap();
```

### 3. コントローラから `request.rawBody` で `rawBody` を取得する

- `@Req` を利用し、`request` を取得

```ts:controller.ts
@Req() request: Request
```

- `request` から `rawBody` を取得する

```ts:controller.ts
(request as any).rawBody
```

### 4. コントローラで `stripe-signature` より ヘッダの署名を取得する

- `@Headers` を利用し、`stripe-signature` ヘッダの値を取得

```ts:controller.ts
@Headers('stripe-signature') sig,
```

### 5. 署名の検証

```ts
stripe = new Stripe()
stripe.webhooks.constructEvent(
  (request as any).rawBody,
  sig,
  'whsec_...'
)
```

## 参考文献

- [Check the webhook signatures](https://stripe.com/docs/webhooks/signatures)
- [Checking Stripe Webhook Signatures from NestJS](https://yanndanthu.github.io/2019/07/04/Checking-Stripe-Webhook-Signatures-from-NestJS.html)
AWS Developer Associate 取得までの道のりと試験対策

# 1. はじめに
先日、AWS 認定Developer Associate（DVA）を取得しました。
取得までの道のりと試験対策について書いてみようと思います。
# 2. キャリア
社会人3年目のSE（アプリ寄り）
SAAは取得済（2020年）、基本情報・応用情報は持ってます。
<font color="Red">**AWSは趣味で触る程度で、業務では触った経験はほとんどありません。**</font>
# 3. 取得を目指した経緯
社内でAWSサービス（Lambda、StepFunction、S3等）を用いた開発案件が増えてきたので、取ることを決めました。
# 4. 対策期間
約2カ月 　※移動や休憩時間を使って、1日30分～1時間程度は勉強しました。
# 5. やったこと（対策内容）
私がやったことを紹介します。
# 5.1. AWS公式の試験ガイドを読む（必須でやるべき）
<https://aws.amazon.com/jp/certification/certified-developer-associate/>

試験の出題範囲や比率を確認しました。<font color="Red">**セキュリティの比率が結構多いことに驚きました。**</font>
分野	試験による比重
分野1：展開	22％
<font color="Red">分野2：セキュリティ	26％</font>
分野3：AWSサービスを使用した開発	30％
分野4：リファクタリング	10％
分野5：モニタリングとトラブルシューティング	12％

# 5.2. 市販の対策本を読む（やってよかった度 ★★★★☆）
ネットや本屋で探しても、DVA特化の対策本が無いようです。
DVA特化では無いですが、対策本として、1つだけあったのが、以下書籍です。
購入して、DVAに関連する内容だけ読みこみました。広く浅く知識をつけるには丁度良いと思いました。

AWS認定アソシエイト3資格対策~ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター~ (日本語)
https://www.amazon.co.jp/dp/4865941991

# 5.3. AWS公式の試験認定準備コース（Exam Readiness: AWS Certified Developer – Associate (Digital) ）の動画を見る。（やってよかった度 ★★★★★）

https://www.aws.training/Details/Curriculum?id=62520

DVAの出題分野、内容等を動画で解説してくれています。
数問、模擬問題も用意してくれているので、試験の全体感を掴むのに良かったです。
<font color="Red">**個人的にですが、受験する方は必須でやっても良いのかなと思います。**</font>

# 5.4. 関連しそうなサービスのBlackBeltを読む（やってよかった度 ★★☆☆☆）
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

少し深めの内容まで書いてあるので、1つ1つのサービスの知識の底上げに良いと思います。

各サービスの知識はある程度はありましたが、不安な内容もあったので、軽くながし見しました。以下は、私が確認した資料です。アソシエイトレベルの内容を超えているものも多いと感じたので、必須ではないかと思います。

<font color="Red">**DynamoDB　Lambda　API Gateway　CI/CD関連（CodeDeploy、Build等）　セキュリティ関連（IAM、cognito等）**</font>

# 5.5. AWS公式のサンプル問題を解く（やってよかった度 ★★★★★）
[AWS公式 サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-dev-associate/AWS-Certified-Developer-Associate_Sample-Questions.pdf)

7/10でした。サンプルなので、満点を取りたかったんですが、そうはいきませんでした。まあまあ難しいです。

# 5.6. 問題集を繰り返し解く（やってよかった度 ★★★★★）
対策本と同じく、市販の問題集等はありませんでした。Udemyやwhizlabs等にも問題集はありましたが、私は、以下サイト（AWS WEB問題集で学習しよう）を使用しました。

https://aws.koiwaclub.com/

DVAはダイヤモンドプランになるので、少し高い（90日 / 5480円）ですが、近々SOAも取得予定なので、こちらにしました。
回答後すぐに答えが出て、かつ簡単な解説がついているので、非常に良かったです。

# 6. 受験結果
近所のテストセンターで受験しました。糖分を大量に補給し、頭フル回転で挑みました笑
<font color="Red">**860/1000点で合格。**</font>720点以上が合格です。
# 7. 振り返り
2カ月勉強したのに点数がそこまで伸びなかったのは悔しかったです。900点は超えたかった…。まあ合格できたので良かったです。SAAの時もあったんですが、日本語翻訳がおかしい問題が何問かありました。英語に戻して、読むと良いと思います。
この調子でSysOpsアドミニストレーターアソシエイト（SOA）も取得しようと思います。
# 8. 受験する方へのアドバイス
主観ですが、CognitoとElasticBeanstalk 関連の問題がかなり多いと感じました。対策は必須だと思います。
<font color="Red">**AWS公式の試験認定準備コース（Exam Readiness: AWS Certified Developer – Associate (Digital) ）の動画は見ておいても良いかなと思います。**</font>ある程度知識がある方であれば、問題集（Udemy、whizlabs，今回紹介したkoiwaclub等）を繰り返し解くだけで、余裕で合格できると思います。
# 関連記事＆リンク
[AWS 認定 デベロッパー – アソシエイト](https://www.amazon.co.jp/dp/4865941991)
[AWS WEB問題集（https://aws.koiwaclub.com/）](https://aws.koiwaclub.com/)
[サービス別資料　AWS](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
gitで困った時のコマンド集

gitでコンフリクトを起こした時に、なかなか解消できず
コマンドを打ちまくったので忘れないようにメモ。

# 利用場面
[1. branch名の変更](#1-branch名の変更)
[2. add取り消し](#2-add取り消し)
[3. commit取り消し](#3-commit取り消し)
[4. コンフリクト解消のために、現状の変更ファイルを避難](#4-コンフリクト解消のために、現状の変更ファイルを避難)
[5. ローカルのブランチがうまくいかず再構築する場合](#5-ローカルのブランチがうまくいかず再構築する場合)



#1. branch名の変更
```
git branch -m <旧ブランチ名> <新ブランチ名>
```

#2. add取り消し

```terminal 
# 全てリセットしたい
git reset HEAD
git reset 

# 一部のファイルをリセットしたい
git reset ファイル名
```

#3. commit取り消し
```terminal
git reset --hard HEAD~
```

#4. コンフリクト解消のために一時的に避難
コンフリクトが出ているが、commitはせずに作業を続けたい場合

```
# 避難させる
$git stash

# 避難させている作業の一覧を確認
$git stash list
stash@{0}: WIP on ブランチ名
stash@{1}: WIP on ブランチ名

# 避難させたものを復活させる
$git stash apply stash@{0}
```

#5. ローカルmasterブランチの作り直し
```
# 適当なブランチに移動
git checkout -b feature/A

# masterを削除
git master -D master

# 最新のリモートmasterをローカルに取得
$git fetch

# 最新になったローカルorigin/masterから再度masterを生やす
$git checkout -b master origin/master
 
```

## 参考
gitの仕組みがわかりやすかったもの
https://kray.jp/blog/git-pull-rebase/
https://backlog.com/ja/git-tutorial/intro/04/
Docker環境でのByebugの使い方


docker&railsの開発を学んでるとByebugを使うには一手間いるとのこと

以下docker-compose.ymlにコード追加

```docker:docker-compose.yml
services:
  web:
    stdin_open: true <= 追加する
    tty: true <= 追加する
```
続けてコードを反映するために以下をする

```
$ docker-compose up -d
```
エラーが特に出なければOK

#Byebugの使い方
コンテナIDまたはコンテナ名を調べる

```
$ docker ps
```
コンテナのIDか名前をアタッチする

```
$ docker attach <container name or ID>
```
デバッグの準備完了

#Byebug終わり方
byebugが終わり、標準出力に戻りたい場合は


Ctrl + P + Q

または

```
（byebug） quit
```
でデバッグから抜けます
Ctrl + C　で抜けようとするとめんどくさい事になるらしいのでやらないように

#参考記事
https://logicoffee.hatenablog.com/entry/2018/06/27/094027
unshareコマンドで、Namespaceを作成してみる

こんにちは。

Dockerの仕組みを学習して、__コンテナはNamespaceなどのLinuxの機能で出来ている__事が判明し、Namespaceを自分で作成できることがわかったので試してみました。
今回は__プロセス__の分離と、__ホスト名__の分離を行いました。

# $ unshare コマンドでNamespaceを作成してみる

筆者はCentOS7環境で行っています。

## プロセスの分離(PID, Mount)
まず`$ps ax`で通常のNamespaceのプロセスを表示します。

たくさん表示されます。

```shell-session
$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /usr/lib/systemd/systemd --switched-root --system --d
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:00 [kworker/0:0]
    4 ?        S<     0:00 [kworker/0:0H]
    5 ?        S      0:00 [kworker/u4:0]  
    ~~~
    2195 pts/0    R+     0:00 ps ax
```

Namespaceを作成するために以下のコマンドを実行します。


```shell-session
$ sudo unshare --pid --mount-proc --fork /bin/bash
```
* `--pid`は、PID Namespaceを分離します。
* `--mount-proc`は、`/proc`ディレクトリをマウントする設定で、これを指定しないと__親のpid名前空間__の情報を出力してしまいます。
`/proc`ディレクトリは、システムの状態などが保管されている特殊なディレクトリで、これらはメモリ上に保存される__仮想ファイル__と呼ばれるものです。
* `--fork`は指定されたプログラムを直接実行するのではなく、`unshare`の子プロセスとしてフォークします。

PID Namespaceを作成する際は、これらがセットで用いられるのが一般的のようです。

新たなNamespaceで`$ps ax`を実行すると、`bash`と`ps`のみが表示され、__プロセス空間が分離__されていることがわかります。

```shell-session
# ps ax
  PID TTY      STAT   TIME COMMAND
    1 pts/0    S      0:00 /bin/bash
   14 pts/0    R+     0:00 ps ax
```

確認ができたので、`$exit`で元の名前空間に戻ります。

```shell-session
# exit
exit
```

## ホスト名の分離(UTS)

今度はホスト名の分離をします。
ホスト名は__UTS Namespace__で管理されています。

`$hostname`で現在のホスト名を確認します。

```shell-session
$ hostname
localhost.localdomain
```

以下のコマンドで`UTS Namespace`を分離します。

```shell-session
$ sudo unshare -u /bin/bash
```

* `-u`はUTS Namespaceを分離します。

以下のコマンドで__ホスト名__を`newhost`に変更します。

```shell-session
# hostname newhost
```

再度`$hostname`を実行し、ホスト名が__変更された__ことを確認します。

```shell-session
# hostname
newhost
```

`$exit`で__元のNamespace__に戻ります。

```shell-session
# exit
exit
```

最後にもう一度`$hostname`を実行し、__元のNamespace__では__ホスト名が変更されていない__事が確認できます。

```shell-session
$ hostname
localhost.localdomain
```
【GitHub】 リポジトリの紐付けでエラー！fatal: remote origin already exists.

はじめに
---
新しく学習を始めようと思い、GitHubにリモートリポジトリを作成し、ローカルリポジトリから初回のpushを行うためリポジトリ同士の紐付けをしようとしていました。
ところが、いつも通りコマンドを実行するとエラーが...
本日は、そんなエラーが起きてしまった話をテーマに投稿させていただきます。
<br>

エラーが起きた経緯
---
以下のようにコマンドを実行すると、「remote origin already exists.」と、既にoriginは存在しているよと言われます。

```terminal.
$ git add .
$ git commit -m "⚪︎⚪︎⚪︎"
$ git remote add origin <リモートリポジトリURL>
fatal: remote origin already exists.
```
<br>

解決策
---
● 原因
① 過去に既にgit remote addコマンドで紐付けをしていた時
② アプリをクローンした時
以上のような時に起こるようです。

● 解決策
以下の3コマンドで解決できます。

```terminal.
# 既に作成済みのoriginを一度削除する
$ git remote rm origin

# 再度リポジトリ同士を紐付ける
$ git remote add origin <リモートリポジトリURL>

# 通常通りpushする
$ git push origin <ブランチ名>
```
今回私の場合は、過去にリポジトリ同士の紐付けも行っておらず、アプリ自体も新しく立ち上げたものだったので、調べた原因に当てはまらず少し謎でした...

単純なエラーですが、初めて出会ったエラーでしたので記録しておくことにしました。

<br>


終わり
---

今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になればと思っています。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
docker-compose up で突然エラーになる


#備忘録的なもの
dockerでのrails開発中にいきなり　docker-compose up　したらエラーになり頭を抱えた。

```
ERROR: for <コンテナ名>  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

ERROR: for web  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
```

長い時間解決法を探していたがDocker for Macを再起動すれば解決した。
Dockerがたまにおかしくなるらしいとのことで、、
理解するのにはまだ長い道のり

#参考記事
https://qiita.com/Kattrxvjxxde/items/cfc689b7b204ba3b1202
M1mac Pyaudioインストール時エラー対応


# Pyaudioのインストール
Pyaudioのインストール時にエラーとなったので、自分用メモ

## 実行環境
Homebrew 3.0.2
Python 3.9.2


## インストール
Pyaudioにはportaudioというライブラリが必要とのことなのでHomebrewでインストール

```
$ brew install portaudio
$ pip3 install pyaudio
```

Pyaudioインストール時に```fatal error: 'portaudio.h' file not found```というエラーが発生

## エラー対応
下記オプションを指定し再インストール

```
pip3 install --global-option='build_ext' --global-option='-I/opt/homebrew/include' --global-option='-L/opt/homebrew/lib' pyaudio
```
または
```
$ export LDFLAGS=-L/opt/homebrew/lib
$ export CPPFLAGS=-I/opt/homebrew/include
$ pip3 install pyaudio
```

## 確認
```
$ pip3 freeze
PyAudio==0.2.11
```
インストール成功！
Community Cloud の基本 ⇒ 顧客との交流

１．サポート担当 VP は顧客エンゲージメントに関してどの総計値を重視しますか?
２．Lira Financial は法人顧客が取引先ポータルでどの作業を実行できるようにしたいと考えていますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/51740606-8b04-8b98-55b0-1c36fb44df37.png)
ijenims record 2021.03.03

# Topics

> SIGNATEのpandas入門道場は2時間コースとあるが、昨日と本日ですでに7～8時間を浪費、進捗率は77%。

## 学習記録

- paiza ラーニング：レベルアップ問題集 配列メニュー
- pandas：SIGNATE pandas入門道場 77%クリア

## その他

- Deep Learning：東京大学／松尾豊教授の動画を視聴（YouTube）
  - 01.Computer will be more clever than human beings
  - 02.ＩＴ融合シンポジウム　～企業・研究者による先端事例紹介～
[python]約数を列挙するプログラム

#約数を列挙するプログラム
Pythonを利用して自然数の約数を取得する
プログラムの何通りか

>約数とは
数学において、整数 N の約数（やくすう、英: divisor）とは、N を割り切る整数またはそれらの集合のことである。
割り切るかどうかということにおいて、符号は本質的な問題ではないため、N を正の整数（自然数）に、約数は正の数に限定して考えることも多い。
自然数や整数の範囲でなく文字式や抽象代数学における整域などで「約数」と同様の意味を用いる場合は、「因数」（いんすう）、「因子」（いんし、英: factor）が使われることが多い。
 整数 a が整数 N の約数であることを、記号 | を用いて a | N と表す。

#listの内包表記
一番簡潔にかける書き方

```python:list.py
num = 30
answer = [i for i in range(1, num+1) if num % i ==0]
print(answer)

#結果：[1, 2, 3, 5, 6, 10, 15, 30]
```

#While
約数を大きい順に出力

```python:while.py

n = 30
x = n

while n > 0:
    if x % n ==0:
        print(n)
    n -= 1

#結果：30, 15, 10, 6, 5, 3, 2, 1
```
約数を小さい順に出力

```python:while.py

n = 1
x = 30

while n <= 30:
    if x % n ==0:
        print(n)
    n  +=  1

#結果：1, 2, 3, 5, 6, 10, 15, 30
```
#関数
nに数字を与えることで結果を返す

```python:while.py
def divisor(n): 
    i = 1
    table = []
    while i * i <= n:
        if n%i == 0:
            table.append(i)
            table.append(n//i)
        i += 1
    table =sorted(list(set(table)))
    return table
#結果：[1, 2, 3, 4, 6, 12, 37, 74, 111, 148, 222, 444]
```

#関数⑵
@taC_hさんより

・pythonはwhileよりforのほうが速い
・loop毎のi*i <= nを外に出したい
・sortはO(nlogn),コピーはO(n)

```python:for.py
def divisor(n):
    sq = n**0.5
    border = int(sq)
    table = []
    bigs = []
    for small in range(1, border+1):
        if n%small == 0:
            table.append(small)
            big = n//small
            bigs.append(big)
    if border == sq:#nが平方数
        bigs.pop()
    table += reversed(bigs)
    return table
```
#最後に
もっといい方法があれば知りたいです
Go 言語でリバースプロキシ

Go 言語の標準ライブラリ `net/http/httputil` には、リバースプロキシを作るための `NewSingleHostReverseProxy` 関数が用意されています。この関数を使うことで、Nginx で行うようなリバースプロキシを Go 言語のプログラム上で行うことができます。

下記コードを実行して http://localhost:10000/ にアクセスすると、`hello, world` が返ってきます。ポート番号 10000〜10003 が使われていると正常に動作しないので注意が必要です。

```golang
package main

import (
	"net/http"
	"net/http/httputil"
	"net/url"
	"time"

	"github.com/gin-gonic/gin"
)

func main() {
	// サーバーを作成する
	s10000 := gin.Default()
	s10001 := gin.Default()
	s10002 := gin.Default()
	s10003 := gin.Default()

	// s10000 へのルートパスのリクエストは s10001 と s10002 を経由して s10003 に渡る
	s10000.GET("/", makeReverseProxy("10001"))
	s10001.GET("/", makeReverseProxy("10002"))
	s10002.GET("/", makeReverseProxy("10003"))
	s10003.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "hello, world")
	})

	// 非同期にサーバーを立ち上げる
	go s10000.Run(":10000")
	go s10001.Run(":10001")
	go s10002.Run(":10002")
	go s10003.Run(":10003")

	// プログラムが終わらないようにする
	time.Sleep(time.Hour)
}

func makeReverseProxy(port string) func(*gin.Context) {
	return func(c *gin.Context) {
		remote, _ := url.Parse("http://localhost:" + port)
		proxy := httputil.NewSingleHostReverseProxy(remote)
		proxy.ServeHTTP(c.Writer, c.Request)
	}
}
```

この仕組を使うことで、モノリシックな Web サーバーを複数の Web サーバーに分割できます。将来は複数のサーバーで運用したいけれど、とりあえずはひとつのサーバーで動かしたいといったときに使えるのではと思っています。
macのPowerPointでAquaSKKを使ってCtrl+J，l(エル)で入力モードをちゃんと切り替えしたい

# やりたいこと

- [AquaSKK](https://github.com/codefirst/aquaskk/releases)で，Ctrl+Jでかなモードに，l(小文字エル)でasciiモードにしたい

# 問題点

- powerpointではCtrl+Jにショートカットが割り当てられていて，かなモードにならない

# 対策

- 入力ソースに「AquaSKK 統合」ではなく，個別に「ひらかな」「カタカナ」などを入れる
- [Karabiner\-Elements](https://karabiner-elements.pqrs.org/)を入れる
- PowerPoint用のJSONを`.config/karabiner/assets/complex_modifications/`に置く
    - または，  
      Preference -> Complex modifications -> Add rule -> import...  
      でAquaSKKで検索して出てくる設定をインポートした上で，追記する
    - 追記する内容は下を参照だが，ポイントは「japanese_eisuu」「japanese_kana」で切り替える

## 制限事項

- 全英モードとか半角カナモードなどに入ってしまうと，戻れない
    - japanese_eisuuで入力ソースをABCにした後，japanese_kanaを押しても元のモード(全英など)に戻されるので，karabinerで対応するのは難しそう
    - そんな時はCtrl+Spaceで入力ソースを切り替えれば良いわけで，頑張ってSKK互換動作を再現するのは諦めた

## 設定内容

追記する場合は，rulesのリストへ追記する．
JSONの手編集を知らないなら，下をコピペしたJSONファイルを個別に置いた方が事故がないかと．

```json
{
  "title": "AquaSKK",
  "rules": [
    {
        "description": "AquaSKK for PPT",
        "manipulators": [
            {
              "type": "basic",
              "from": {
                "key_code": "l"
              },
              "to": [
                {
                  "key_code": "japanese_eisuu"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.microsoft\\.Powerpoint"
                  ]
                },
                {
                  "type": "input_source_if",
                  "input_sources": [
                    {
                      "input_source_id": "^jp\\.sourceforge\\.inputmethod\\.aquaskk\\.(Hiragana|Katakana|HalfWidthKana)$"
                    }
                  ]
                }
              ]
            },
            {
                "type": "basic",
                "from": {
                    "key_code": "j",
                    "modifiers": {
                        "mandatory": [
                            "control"
                        ]
                    }
                },
                "to": [
                    {
                        "key_code": "japanese_kana"
                    }
                ],
                "conditions": [
                    {
                        "type": "frontmost_application_if",
                        "bundle_identifiers": [
                            "^com\\.microsoft\\.Powerpoint"
                        ]
                    }
                ]
            }
        ]
    }
  ]
}
```
そうだ、SQLの勉強をしよう24

#はじめに

今すぐに使うことは無いだろうが、一応学んでおく必要がありそうなので、少しまとめておきます。

###DCL(Date Control Language)

####権限を付与する
```sql
GRANT 権限名 TO ユーザー名
```
GRANT：付与
####権限を取り除く

```sql
REVOKE 権限名 FROM ユーザー名
```

REVOKE：取り消す
error Runner.app/Info.plist does not exist. The Flutter "Thin Binary" build phase must run after "Copy Bundle Resources".が出たら

[ここ](https://stackoverflow.com/questions/65434877/flutter-runner-app-info-plist-does-not-exist-the-flutter-thin-binary-build-p)を参考にした
ちなみに自分はAndroid StudioでClean Build Folderだけでなおった
【GitHub】コミットメッセージを幸せにする

GitHub使う際にコミットメッセージを幸せにする方法が以下です。

![スクリーンショット 2021-03-03 22.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/8db265d3-e7b4-1da9-ec07-99ef556afefe.png)

使い方は以下です。

```sh
$ git add .
$ git commit -m ":fire:~~~~~~"
$ git push
```




ちゃんと意味もあります。


🐛  `:bug:` バグ修正
👍  `:+1:` 機能改善
✨  `:sparkles:` 部分的な機能追加
🎉  `:tada:` 盛大に祝うべき大きな機能追加
♻️ `:recycle:` リファクタリング
🚿  `:shower:` 不要な機能・使われなくなった機能の削除
💚  `:green_heart:` テストやCIの修正・改善
👕  `:shirt:` Lintエラーの修正やコードスタイルの修正
🚀  `:rocket:` パフォーマンス改善
🆙  `:up:` 依存パッケージなどのアップデート
🔒  `:lock:` 新機能の公開範囲の制限
👮  `:cop:` セキュリティ関連の改善


詳しくは以下です。

https://gitmoji.dev/
https://goodpatch.com/blog/beautiful-commits-with-emojis
https://gist.github.com/nownabe/85d8595fd142adc426fbfaf2bab015e0
【Java8】TreeSet<クラス>での並び替え順&中からもっとも近いものを取得

###課題:一列のクラスリストをある順番で並び替え、そして中から目標クラスと等しい、なければそれよりもっとも近い（以下でも以上でも）のを取得


色々調べて、TreeSetというものにたどり着いたんです。今まではSet,ArrayListのようなを使ってきたが、これを使うの初めてです。
クラスのTreeSetを作るには並び順番を決める必要があるそうです。

例のクラス：

```java
public class Person {
    
    private int id;

    private int age;

    private String name;
}
```

このクラスで並びの優先度は 
###ID > AGE > NAME
とします。

##並び替え
Java8でTreeSetを作る同時に上記の並び順のComparatorを一緒に入れます。

```java
TreeSet<Person> set = new TreeSet<>(Comparator.comparing(Person::getId)
.thenComparing(Person::getAge)
.thenComparing(Person::getName)
);
```

そしていくつかのPersonを入れます

<details><summary>入れるもの</summary><div>

```java
personA.setId(3);
personA.setAge(10);
personA.setName("A");

personA2.setId(3);
personA2.setAge(5);
personA2.setName("A2");

personB.setId(2);
personB.setAge(5);
personB.setName("B");

personB2.setId(2);
personB2.setAge(10);
personB2.setName("B2");

personC.setId(1);
personC.setAge(3);
personC.setName("C");

personC2.setId(1);
personC2.setAge(3);
personC2.setName("C2");

set.add(personA);
...
...
```
</div></details>

入れた後の結果はこんな感じです

```java
set.forEach(item -> {
            System.out.print("Id : " + item.getId() + " , ");
            System.out.print("Age : " + item.getAge() + " , ");
            System.out.println("Name : " + item.getName());
});
```

```terminal
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A
```
ちゃんと ID > Age > Nameの順番で並んでいます！

##取得

次は等しい、なければもっとも近いものを取得です！

使うのmethodは下記です

```java

Person targetPerson = new Person();
targetPerson.setId(1);
targerPerson.setAge(5);
targetPerson.setName("B");

//等しくものがなければ目標より以上もっとも近いもの
Person ceiling = set.ceiling(targetPerson);

//等しくものがなければ目標より以下もっとも近いもの
Person floor = set.floor(targerPerson);

//目標より以上もっとも近いもの
Person higher = set.higher(targerPerson);
//目標より以下もっとも近いもの
Person lower = set.lower(targerPerson);
```
さっきの結果から

```terminal
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A

Target: 
Id : 1 , Age : 5 , Name : B

Ceiling Result : 
Id : 2 , Age : 5 , Name : B
Floor Result : 
Id : 1 , Age : 3 , Name : C2

Higher Result : 
Id : 2 , Age : 5 , Name : B
Lower Result : 
Id : 1 , Age : 3 , Name : C2
```

Ceiling、FloorとHigher、Lower両方とも同じ結果を取得できるが、違いは同じものを取るかどうかだけです

```terminal
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B  //Targetと全く同じ
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A

Target: 
Id : 2 , Age : 5 , Name : B

Ceiling Result : 
Id : 2 , Age : 5 , Name : B
Floor Result : 
Id : 2 , Age : 5 , Name : B

Higher Result : 
Id : 2 , Age : 10 , Name : B2
Lower Result : 
Id : 1 , Age : 3 , Name : C2

```
以上です！自由にお試してください！
TreeSetの他の取得は公式Docで
https://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeSet.html
Salesforce で Custom Tab を作成するときに指定できる motif タグの選択肢全て

# はじめに

こんにちは。
Salesforce とか API まわりのことを何でも屋的に営んでおります itouchitachi です。

今回は
**Salesforce で Custom Tab を作成するときに指定できる motif タグの選択肢全て**
として、簡単な内容ではありますが、紹介したく思います。

で、紹介したくなった理由ですが、

- **Custom Tab つくるときの motif タブって何で必須なの！？**
- **マジ色なんてどうでもいいし、指定しない場合はテキトーに決めてくんない！？**
- **でも、全部同じ内容にするとなんとなくイヤかも。。**

って私自身がよく思っていたからです！

この記事見てもらっている方はご存知と思われますが、この部分ですね。

![Qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1171492/4a9caf81-b2e5-97e2-7f54-be19f39ac095.jpeg)

ネットから拾ってきたりとか、使いまわしたりとかで耐えていたのですが、めでたく全100パターンをリストにできました！

ご活用いただけると幸いです。


# motif タグのリスト

`Custom1:Heart`
`Custom2:Fan`
`Custom3:Sun`
`Custom4:Hexagon`
`Custom5:Leaf`
`Custom6:Triangle`
`Custom7:Square`
`Custom8:Diamond`
`Custom9:Lightning`
`Custom10:Moon`
`Custom11:Star`
`Custom12:Circle`
`Custom13:Box`
`Custom14:Hands`
`Custom15:People`
`Custom16:Bank`
`Custom17:Sack`
`Custom18:Form`
`Custom19:Wrench`
`Custom20:Airplane`
`Custom21:Computer`
`Custom22:Telephone`
`Custom23:Envelope`
`Custom24:Building`
`Custom25:Alarmclock`
`Custom26:Flag`
`Custom27:Laptop`
`Custom28:Cellphone`
`Custom29:PDA`
`Custom30:Radardish`
`Custom31:Car`
`Custom32:Factory`
`Custom33:Desk`
`Custom34:Insect`
`Custom35:Microphone`
`Custom36:Train`
`Custom37:Bridge`
`Custom38:Camera`
`Custom39:Telescope`
`Custom40:Creditcard`
`Custom41:Cash`
`Custom42:Treasurechest`
`Custom43:Jewel`
`Custom44:Hammer`
`Custom45:Ticket`
`Custom46:Stamp`
`Custom47:Knight`
`Custom48:Trophy`
`Custom49:CD/DVD`
`Custom50:Bigtop`
`Custom51:Apple`
`Custom52:Balls`
`Custom53:Bell`
`Custom54:Boat`
`Custom55:Books`
`Custom56:Bottle`
`Custom57:BuildingBlock`
`Custom58:Caduceus`
`Custom59:Can`
`Custom60:Umbrella`
`Custom61:Castle`
`Custom62:Chalkboard`
`Custom63:Chip`
`Custom64:Compass`
`Custom65:Cup`
`Custom66:Dice`
`Custom67:Gears`
`Custom68:Globe`
`Custom69:Guitar`
`Custom70:Handsaw`
`Custom71:Headset`
`Custom72:Helicopter`
`Custom73:HighwaySign`
`Custom74:HotAirBalloon`
`Custom75:IPPhone`
`Custom76:Keys`
`Custom77:Locked`
`Custom78:Map`
`Custom79:MeasuringTape`
`Custom80:Motorcycle`
`Custom81:MusicalNote`
`Custom82:Whistle`
`Custom83:Pencil`
`Custom84:Presenter`
`Custom85:RealEstateSign`
`Custom86:RedCross`
`Custom87:Safe`
`Custom88:Sailboat`
`Custom89:Saxophone`
`Custom90:Scales`
`Custom91:Shield`
`Custom92:Ship`
`Custom93:ShoppingCart`
`Custom94:Stethoscope`
`Custom95:Stopwatch`
`Custom96:StreetSign`
`Custom97:Thermometer`
`Custom98:Truck`
`Custom99:TVCRT`
`Custom100:TVWidescreen`
Laravel　画像の投稿機能とシンボリックリンク

###はじめに
Laravelにて簡単な画像付きレシピ投稿アプリを作成しています。
画像のアップロード機能を実装した際にシンボリックリンクという言葉を初めて知ったので、備忘録として記録しておくことにしました。

###シンボリックリンクとは
Windouwsでいうところのショートカットのようなもの。
シンボリックリンクファイルを通して大元のフォルダを参照することができます。

###やりたいこと
投稿フォームから画像を選択し送信ボタンを押すと一覧で表示されるという仕組み。

画像ファイルを選択し送信ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632035/f1f0f314-0427-1005-368b-afc362442065.png)
一覧画面へ画像を表示
ここでレシピ投稿アプリなのに料理の写真ねーじゃん！とツッコまれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632035/9a81d8c0-47ac-cbcf-df20-f8dbab1a09c4.png)

##画像の保存先
さて、コントローラーで受け取った画像ファイルは基本的に `storage/app/public/image` 内に保存させます。

```RecipeController.php
public function create(Request $request){
        $recipe = new Recipe;
        $form = $request->all();
       
        //画像が送信されたら保存して $recipe->image_pathカラム にパスを保存する
        if (isset($form['image'])) {//変数に値が入っているかをチェック
            $path = $request->file('image')->store('image');// 画像をstorage/app/public/image配下に保存
            $recipe->image_path = basename($path);//パスからを取得したファイル名をimage_pathカラムに保存
        } else {
            $recipe->image_path = null;
        }
        
        unset($form['_token']);
        unset($form['image']);

        $recipe->fill($form)->save();
        return redirect('/home');
    }
```

ただ、実際にアプリケーションを起動するときに公開されるのはpublicディレクトリのみです。画像は`storage/app/public/image`に保存されているので画像データを持ってくることはできません。
そんなときに`publicディレクトリ`から`storage/app/public/image`へのショートカット機能の役割を果たすのががシンボリックリンクです。

##シンボリックリンクの貼り方
artisanコマンドから簡単にできます。
まずpublicディレクトリへ移動します。

~~~
$ cd public
~~~

以下のコマンドを実行します。

```
$ php artisan storage:link
```

するとpublic内にstorageフォルダができます。（ショートカットが作成されるの方がわかりやすいかも）
矢印ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632035/b0e32963-e7be-9847-b1ab-52f4c2a472a5.png)

`public/image`と進んでいくと、`storage/app/public/image`と同じ画像ファイルが存在していることがわかるかと思います。

##ビューに画像を表示させる

画像表示部分のみ

```home.blade.php
<img src="{{ asset('storage/image/' . $recipe->image_path) }}" width="100%" heigth="100%" alt="">
```
`asset('ファイルパス')`はpublicディレクトリのパスを返す関数です。
丁寧に書くと、`app/public/storage/image/[画像のパス名]`となるわけです。
さっきシンボリックリンクを貼ったおかげでこのフォルダパスを通すことができました。

終わり。
正規言語とは何か？

# 正規言語とは
正規言語とは、ある有限オートマトンで認識される言語を指します。
この、**有限オートマトン**、**認識する**、についてを今回は説明することで正規言語とは何かを紐解いていこうと思います。

# 有限オートマトン
* 有限オートマトンを簡単に説明するなら、**計算機の構造や動作を抽象化したモデル**です。
* ある内部機構を持った「**装置**」で初期の「**状態**」を持っており、外部からの「**操作**」が行われた時、その「**操作**」がその「**装置**」に受け入れられるならその「**操作**」に応じた「**状態**」を返します。

## 有限オートマトンの抽象的記述
* 下記は3つの状態を持つ有限オートマトンM<sub>1</sub>を表している。 
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/dcdb5e95-9a18-3a7e-3107-d7ed37f3950d.png)

[3つの状態を持つ有限オートマトンM<sub>1</sub>の説明]

* 上の図をM<sub>1</sub>の**状態遷移図**と呼びます。
* M<sub>1</sub>は、3つの**状態**である、 **q1**, **q2**, **q3** を持っています。

[3つの状態の詳細]

* **q1**は、**開始状態**を表します。何もない場所からの矢印で示されています。
* **q2**は、**受理状態**を表します。これは、二重の円で示されています。
* **状態**から**状態**への矢印は**遷移**と呼びます。

[オートマトンの出力]

* **受理**または**拒否**のどちらかです。

[M<sub>1</sub>への入力と動作例]
入力値を**10101**とします。

① 状態q1から動き出します。
② 1を読み出し、q1からq2へ遷移します。
③ 0を読み出し、q2からq3へ遷移します。
④ 1を読み出し、q3からq2へ遷移します。
⑤ 0を読み出し、q2からq3へ遷移します。
⑥ 1を読み出し、q3からq2へ遷移します。
⑦ 入力を読み終えた時にM<sub>1</sub>は、**受理状態q2**にあるので**受理**します。

## 数学的側面から有限オートマトンについて考えてみる
* 有限オートマトンは、5個組みのもののリストである。

```math
1 : Q は状態と呼ばれる有限集合 \\
2 : \sum はアルファベットと呼ばれる有限集合 \\
3 : \delta はアルファベットと呼ばれる有限集合 \\
4 : q_0 \in Q　は開始状態 \\
5 : F \subseteq は受理状態の集合
```

* 遷移状態関数とは、有限オートマトンにおいて状態aから状態bへ文字１をラベルとして持つ矢印がある場合、それはオートマトンが状態aに1が読み出された時に状態bへ移ることを指します。
* 数式だと下記のようになる。

```math
\delta (a,1) = b
```

* この定義に、先ほどの図の有限オートマトンM<sub>1</sub>を当てはめていくと下記のようになる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/f383b8f9-d293-58d0-7924-33bd5f0211b4.png" width="200px" />

* ここで最初の正規言語に戻ってくる。
* ある集合(すべて文字列)を受理する機械Mがあるとすると、**Aは機械Mの言語である**、もしくは**機械MはAを受理する**、もしくは、**機械MはAを認識する**という。
* つまり、**正規言語とは、ある有限オートマトンで認識される言語 = 機械Mが受理するようなある集合(すべて文字列)**と言い換えることができると思います。

# 参考文献
[計算理論の基礎 [原著第2版]](https://www.amazon.co.jp/%E8%A8%88%E7%AE%97%E7%90%86%E8%AB%96%E3%81%AE%E5%9F%BA%E7%A4%8E-%E5%8E%9F%E8%91%97%E7%AC%AC2%E7%89%88-1-%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3%E3%81%A8%E8%A8%80%E8%AA%9E-Michael-Sipser/dp/4320122070)
Power BIのツールヒントを使う 

##ヒントに使うビジュアル（グラフ）を作ります
画面下のタブで新しいページを追加します。
今回は円グラフを使います。
この円グラフを、先日作成した折れ線グラフにマウスオーバーさせたときに表示されるように設定します。
[（元データ/グラフはこちらです）](https://qiita.com/text_owleyes_0214/items/5f8a12a25638fecfeae0)
以下のような設定で作っています。

<img width="700" alt="ツールヒント1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/23bb8817-b353-614d-46a4-3fe5886c236f.png">

<img width="300" alt="ツールヒント2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/37ca0a76-caba-4e3e-6e43-e0a09c752ca7.png">

一旦、グラフエリアの選択を外して、書式アイコン（ペンキローラーの形）をクリックして、**「ツールヒント」**機能の設定を表示します。
**「〇」**を右側に移動し、**「ON」**にします。

<img width="300" alt="ツールヒント3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/9c58fcc1-d3da-34fc-48d7-7e2c454ca993.png">

<img width="300" alt="ツールヒント4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/5751c01d-3696-657b-94e7-74719fad93f0.png">

円グラフを表示したページのタブ名称を、今回は（そのまま）**ツールヒント**とします。

<img width="500" alt="ツールヒント6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/6ccfb414-d124-ecc9-0d12-7217cafc636f.png">

##ツールヒントを表示させる折れ線グラフで設定します
折れ線グラフのページに戻り、選択した状態にします。
書式アイコン（ペンキローラーの形）をクリックして、**「ツールヒント」**の設定を開きます。

<img width="300" alt="ツールヒント6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/46bac238-a3a0-d515-b50c-57ec2731001b.png">

**「ページ」**から、先ほどの円グラフのタブ名称**「ツールヒント」**を選択します。

<img width="300" alt="ツールヒント7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/b13e0b2d-b727-aefe-31a7-5651bb06e29c.png">

これで設定完了なのですが、今回の折れ線グラフにではこのまま使うと想定した表示にならないことがわかりました。
曜日ごとの凡例グラフなので、x軸上の〇月〇日上のグラフをマウスオーバーしてもその曜日の円グラフしか表示されません。

<img width="700" alt="ツールヒント8" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/a7529b82-263b-79f3-da08-37c82ce7101c.png">

そこで、右パネルの**「日付 Month」**フィールドを、その左隣のパネルの**「軸」**フィールドにドラッグします。
既に入っている**「日付」**の上に配置します。
（※**「日付 Month」**フィールドは、日付型のデータを用意すると自動で作られるようです）

<img width="800" alt="ツールヒント9" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/2d87503d-18e9-38f3-8278-0ea04fd83ff4.png">

作の集計値がプロットされるので、グラフの形は変わってしまいますが、x軸上の1目盛り上に各曜日の数字がプロットされることになります。
マウスオーバーすると、想定通りの**ツールヒント**が表示されるようになりました。

<img width="800" alt="ツールヒント10" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e5eef106-e2b4-2c9b-a540-787fbd776a53.png">

作業の区切り区切りで保存を忘れないようにします。

**了**