OmniAICreator/Qiita-1.07M huggingface dataset:
【TypeScript】関数の宣言と呼び出しに関する基礎知識

# 概要
　関数に対するTypeScriptの作法について、学んだため共有する。自身の勉強も兼ねてTypeScriptを用いて関数を作成する際どうしたらいいのかがわからない人を対象に作成した。


# 作成関数に対する型アノテーションの設定
　TypeScriptでは、基本的に関数の**「パラメーター」**と**「戻り値」**に型アノテーションを設定することができる。しかし、できるだけTypeScriptに型を推論をさせ、明示的な型アノテーションせず、コード量を減らすことが、TypeScriptのコード作成では良いとされている。パラメーターに関しては推論できないため、型アノテーションは必須である。戻り値に関しては推論することが可能なので、省略することが普通である。

```ts
// パラメーター、戻り値に対して型アノテーションを設定
function add(a: number, b: number): number {
  return a + b;
}

// 戻り値の型アノテーションを省略
function add(a: number, b: number) {
  return a + b;
}
```
呼び出す際は、型定義をする必要はない。

```ts
add(1, 3);     // 戻り値は4
```

# オプションパラメーター
　パラメータを省略可能とする際は、パラメータの語尾に`?`をつける。必須パラメーターを先に指定し、省略可能パラメーターは後に記述する必要がある。


```ts
function log(message: string, id?: string) {
  console.log(message, id || 'Not id');
}
 
log('hoge');           // hoge Not id
log('hoge', '12345');  // hoge 12345
```

# デフォルトパラメーター
　オプションパラメーターにデフォルト値を与えることができる。これを**デフォルトパラメーター**と呼ぶ。オプションパラメーターと同様に引数を省略することができる。デフォルトパラメーターは、パラメーターのリストの最後にする必要はない。**通常は、オプションパラメーターを使用するよりデフォルトパラメーターを使用するとよい。**

```ts
function log(message: string, id='Not id') {
  console.log(message, id);
}
 
log('hoge');           // hoge Not id
log('hoge', '12345');  // hoge 12345
```

# レストパラメーター
　引数を指定する際、固定数ではなく可変長となる関数もあるだろう。その際は、**レストパラメーター**を使用する。パラメーターの前に`...`をつけるだけである。一つの関数にレストパラメーターは一つまでである。また、パラメーターのリストの最後に記述する必要がある。

```ts
function sum(...numbers: number[]) {
  return numbers.reduce((total, n) => total + n, 0);
}

sum(1, 2, 3);    // 6
sum(1, 3);       // 4
```

# 呼び出しシグネチャ
　パラメーターと戻り値のそれぞれの型を定義してきたが、関数としての型も存在する。それを**呼び出しシグネチャ**と呼ぶ。関数は引数と戻り値を所有しているためそれを用いてい関数の型を定義する。

```ts
// 呼び出しシグネチャ
(a: number, b: number) => number   // 引数の型　=> 戻り値の型
```

　デフォルトパラメーターで使用した例を呼び出しシグネチャを用いて書き変える。呼び出しシグネチャで型がアノテーションされているので、パラメーターのところで型アノテーションを指定する必要がない。

```ts
type Log = {message: string, id?: string) => void

const log: Log = (message, id='Not id') => {
  console.log(message, id);
}

log('hoge');           // hoge Not id
log('hoge', '12345');  // hoge 12345
```

# コールバック関数
　コールバック関数を呼び出す際も、呼び出しシグネチャを使用する。

```ts
function times(f: (index: number) => void, n: number) {
  for(let i = 0; i < n; i++) {
    f(i);
  }
}

times(n => console.log(n), 4);    // 0 1 2 3
```

# オーバーロードされた関数
　呼び出しシグネチャの記法は、もう一つある。たいていは、省略記法を用いるとよいが、完全版の記述が適する場合がある。それが、オーバーロードされた関数の時である。オーバーロード関数は、複数の呼び出しシグネチャを持つ関数のことである。

```ts
// 省略的な書き方
type Add = (a: number, b: number) => number 
// 完全な書き方
type Add {
  (a: number, b: number): number   
}
```
 ここで、一日だけの予定と数日に渡る予定を決めることができるオーバーロード関数`schedule`を考える。2つの呼び出しシグネチャを想定して、関数scheduleを設計する必要がある。

```ts
type Schedule = {
  (from: Date, to: Date, place: string): Scheduled
  (from: Date, place: string): Scheduled
}

const schedule: Schedule = (from: Date, toOrPlace: Date | string, place?: string) => {
  if(toOrPlace instanceof Date && place !== undefined) {
    // 数日の予定
  } else if(typeof toOrPlace === 'string') {
    // １日だけの予定
  }
}

schedule(date1, date2, 'ホテル');  // 数日の予定
schedule(date, '図書館');          // 1日だけの予定
```

# 終わりに
　以上、TypeScriptの関数宣言と呼び出しについてまとめた。間違っている個所等あればコメントお願いします。

# 参考
　[Boris Cherny 著　「プログラミングTypeScript」](https://www.oreilly.co.jp/books/9784873119045/)
1/3を2進数で表せますか？

##1. はじめに
　**1/3 (10)を2進数で表せますか？**2進数とは0と1で数を表す方法です。そして自然数を2進数で表す方法は多くの方が知っていると思います。小数はどのように表すのでしょうか？例えば1/4、つまり10進数の0.25は2進数で0.01 (2)と表わせます。では1/3はどうすれば表せるでしょうか？


##2. 答え
正解は0.0101010・・・ (2)です。0と1を交互に繰り返します。

##3. 解説その1
　直感的に分かる説明をします。まず1/3は0と1/2の間ですよね。そのため次のように表せることがわかります。

0 < 1/3 < 2/2　⇔　0 (2) < 1/3 < 0.1 (2)

次に1/3は1/4と1/2の間にあることが分かります。そのため次のように表せます。

1/4 < 1/3 < 2/4　⇔　0.01 (2) < 1/3 < 0.10 (2)

以下、これを繰り返していきます。

2/8 < 1/3 < 3/8　⇔　0.010 (2) < 1/3 < 0.101 (2)
5/16 < 1/3 < 6/16　⇔　0.0101 (2) < 1/3 < 0.1010 (2)
・・・

したがって1/3を2進数で表すとおそらく0.01010・・・(2)のようになると予測できます。


##4. 解説その2
やっていることは同じなのですが、こっちの方が自分は好きです。

1/3 = 1/4 + 1/12
    = 1/4 + 1/4 ・ 1/3
    = 1/4 + 1/4 ・ (1/4 + 1/12)
・・・

したがって1/3 = 0.01010・・・(2)
初学者のプログラミング　NoMethodErrorの解決について

##データをオブジェクトに追加する時に起きた
```console
NoMethodError (undefined method `books' for #<Author:0x00007fecdeca2fd8>)
```
データを作成して、紐付けてあるオブジェクトに追加しようとして起きた。
調べてみるとエラー文の内容は「定義されていない」という意味だったため、コンソール上で確認してみたところ、データは確認できたため、定数を再度、定義しなおしたら解決した。

## さいごに
プログラミングの初学者です。その日に学んだことを学習の一環としてアウトプットしています。より深く学習していきたいと考えておりますので、ご指摘等いただけますと幸いです。

参考図書：パーフェクト Ruby on Rails【増補改訂版】すがわらまさのり/前島真一/橋立友宏/後藤優一/五十嵐邦明
Dockerコマンド exitとdetachの違い

## 概要
dockerのコンテナから出るためには「exit」コマンドと「detach」コマンドがあるのでその違いについて書いてみた。

## exit
### 構文
```
exit
```
### 説明

exitを使うとプロセスも消える


## detach


### 構文
```
docker detach <コンテナID>
```
### 説明
detachを使ってもプロセスは残ったまま
docker attach <コンテナID>

## どっちつかえばいいの?

プロセス切り忘れがあるので、「exit」コマンドを使うのがbetterだと思います。

## 備考

下記コマンドを実行すると各コンテナのstatusがわかり、理解が深まるので興味あるかたはお試しください。

```
docker ps -a
```
docker (docker-compose) on vagrant環境を構築する

## 前提
・vagrant,virtualboxがインストールされている
## 構築手順
・vagrantfileの作成(vagrant initコマンドでvagrantfileが作成される)

```bash
$ vagrant init
```

・プラグインのインストール

```
$ vagrant plugin install vagrant-vbguest
$ vagrant plugin install vagrant-docker-compose

```

・vagrantfileを以下のように編集

```ruby

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  # config.vm.network "private_network", ip: "192.168.33.10"
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = false
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  # ホスト側のファイルを仮想環境にマウント
  config.vm.synced_folder "./data", "/vagrant"
  config.vm.provision :docker#, run: 'always'
  config.vm.provision :docker_compose
end
```

・vagrant upコマンドで仮想環境構築

```
$ vagrant up
```

・仮想環境にログイン

```
$ vagrant ssh
# 環境構築完了
vagrant@ubuntu-bionic:/vagrant$
```
上記のようになれば環境構築完了

### vagrantfileの変更内容を仮想環境に反映したいとき
- 仮想環境を削除してから作り直す必要がある。
  - vagrant reloadでできるという記事もあったが、うまく行かないときがあった。)

・ docker,docker-composeがうまくインストールされるか確認

```bash
# docker
vagrant@ubuntu-bionic:/vagrant$ docker
# --- 実行結果-------
Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers
・・・・・・・・・・
# -------------
# docker-compose
vagrant@ubuntu-bionic:/vagrant$ docker-compose
# --- 実行結果 ----

Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

# --------------
```
・ ファイルがマウントされていること確認

```bash
vagrant@ubuntu-bionic:/vagrant$ cd /vagrant/
vagrant@ubuntu-bionic:/vagrant$ ls
test

```
```
$ vagrant destory
$ vagrant up
```
Power Automate DesktopでSAPにログオンする

#**はじめに**
Power AutoMate Desktop　学習1日目です。
動いた記録を残します。
Qiitaもこれが初です。
宜しくお願い致します。

#**●前提条件(実行環境)**
Windows10
Office365 E3
Power Automate Desktop(無償版)：以後PADと略します
SAP GUI for Windows 7.60

#**●やりたいこと**
Power Automate Desktop(PAD)を使ってみたい
SAPのログオン（ログイン）を自動化したい
自動化後も、SAPのログオンパスワードが変更された時に簡単に対応したい。
各種SAPの処理を自動化するための第1歩と思って作ってみました。

#**●事前準備**
エクセルにSAPのIDとパスワードを入力して保存する。

以後、パスワード変更時にはこのエクセルファイルをメンテナンスします。
PDAのソースにパスワードを埋め込みたくなかった。
エクセルの表はこんな感じです。（例）
![Excel_IDPass.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219936/f2580eee-dbe9-ef25-1ef7-7ed998a68753.jpeg)
この後、PADでB1セルとB2セルを読込んで、SAPのログイン画面へ渡します。

#**●PAD画面でフローの作成**
最初はデスクトップレコーダーを使って、記録しました。
修正後、この流れで動きました。

![Souse_Logon.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219936/31834b41-0291-f9a5-b329-4bf5e118e1f1.jpeg)

#**●できたこと**
1行目　エクセルの自動起動（ファイル指定）
2-3行目　エクセルからデータを抽出：PADの変数へ保存
5-7行目　SAPのプログラムを起動
9-12行目　SAPメニュー画面から目的の名前を選ぶ。
14-16行目　IDとパスワードを貼り付けて、エンターキーを押下

#**●キー送信**
頭書、デスクトップレコーダーで記録された内容を調整しても、ログオンできずに止まるケースがあった。
原因はSAP画面のUI要素が変わることがあり、自動実行時に「要素が無い」で止まることがあった。
1日目で、まだ詳しいことが分からないので、回避策として、
「キー送信」を使い、アクティブウィンドウにキーストロークで値を送信することとした。

#**●Waitの追加**
各所に画面の切り替わりを待つために、Waitを入れています。
画面が出ていないのに、PADが次のステップでキー送信を行うときがある。
これもPADの機能で次の画面表示を待ってくれそうなのですが、まだわかっていないので、Waitで時間調整することとした。

今回はここまで。
シンプルにワークブックを開くための努力が詰まったVBAルーチン

Microsoft Excelのファイルを開く際、とにかく早く処理をしたくて余計な動作を全部省くことを考えました。
再計算はなし、リンクは開かない、マクロなんか実行するものか、書式設定？関係ないでしょ、でゴリゴリにやってみますとこんなルーチンになりました。

元々は「ブックがパスワード付きかどうか？」を判別するために作ったものなので「パスワードが設定されていれば開かないけど開けなかったという事象はわかる」程度には優秀（？）です。

限界はありまして、
1. ワークブックClose時のマクロ実行は止められない。
2. 壊れたワークブックを開こうとすると、呼び出したこのVBAも落ちる。

です。回避策があったら教えて下さい。
"ｆ"というファイルオブジェクトを入力としたサブルーチンです。

```
'引数はファイルオブジェクト"f"。
'つまり直接は出てこないけどもFilesystemObjectを使っているので
'参照設定 Microsoft Scripting Runtime が必要となります。

Sub execute(f As file)

'「パスワード付きファイルは開けない」でいいので適当
Const パスワード = " "

Dim 拡張子 as string
Dim ws As Worksheet

Dim flg_open As Boolean
Dim chkFn As Long

'実用上、あったほうがいいルーチンもおまけ。
’まずは一時ファイルを読み飛ばす
    If Left(f.Name, 2) = "~$" Then
        Exit Sub
    End If

' 拡張子を見てみる。
    拡張子 = Right(f.Name, Len(f.Name) - InStrRev(f.Name, "."))

'Microsoft Excelのファイルだったら開くけど、
'テンプレート開くとややこしいことになるのでスルー
    If Left(拡張子, 3) <> "xls" Then
        Exit Sub
    End If
'おまけはここまで

    'ワークブックを読み取り専用で開く
    'パスワード付ファイルは適当なパスワードで開いて開かなければ読み飛ばす
 
    'Application.ScreenUpdating = False
    'メッセージが出るのを抑止
    Application.DisplayAlerts = False
    'ワークブックオープン時の自動計算を止める
    Application.Calculation = xlCalculationManual
    'ワークブックオープン時のマクロ自動実行を止める。
    Application.EnableEvents = False
    
    On Error Resume Next 'これをいれないとパスワードが違うのメッセージが出る。
    '読み取り専用、リンクを更新しない、「読み取り専用で開きますか？」の確認を抑止
    Workbooks.Open Filename:=f.path, ReadOnly:=True, UpdateLinks:=0, _
                            IgnoreReadOnlyRecommended:=True, Password:="", WriteResPassword:=パスワード
    '
    Application.DisplayAlerts = True
    Application.EnableEvents = True
    On Error GoTo 0
    DoEvents
    
    flg_open = True
    If ActiveWorkbook.Name <> f.Name Then
        Call ファイルが開けなかったときの処理(f.Name)
        flg_open = False
    Else
        Call ファイルが開けたときの処理(f.Name)
    End If

    'Saveするとき､ホントにセーブするか尋ねてくるのがうっとうしいので､確認画面を表示しない｡
    Application.DisplayAlerts = False
    DoEvents
    
    'ブックが開いていることを確認してからクローズする｡
    On Error Resume Next
    If Not flg_open Then
        chkFn = FreeFile
        On Error Resume Next
        Open f.path For Append As #chkFn
        Close #chkFn
    End If
    
    If Err.Number <= 0 Then
        Workbooks(f.Name).Close savechanges:=False
    End If
    On Error GoTo 0
    
    DoEvents

    Application.EnableEvents = True
    '確認画面を表示しない設定を続けると本当にエラーが出た時困るので戻す。
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub
```

呼び出し方はこんなかんじ。
定数Pathで指定したフォルダに有るファイル（の中のMicrosoftExcelブック）を順次開いて処理する。

```
Sub main()

Const Path = "D:\"

Dim fso As FileSystemObject: Set fso = New FileSystemObject
Dim objFile As file
        
    ' GetFolder(フォルダ名).Filesでフォルダ配下のファイル一覧を取得
    For Each objFile In fso.GetFolder(Path).Files
        Call execute(objFile)
        DoEvents
    Next

End Sub
```
【Swift】info.plistでダークモードを無効にしてもダークモードになってしまう問題を解決する

# どういうことか

ダークモードを無効にするためにinfo.plistにて `User Interface Style` を `Light` にしても実機でビルドしてもダークモードで表示されてしまう。

## 原因とやってみたこと

Controllerにて

```swift:HomeViewController.swift
self.overrideUserInterfaceStyle = .light
```

と書く。
そしたら `'overrideUserInterfaceStyle' is only available in iOS 13.0 or newer` というエラーが出た。プロジェクトをiOS12から対応するように設定しているから出るみたい。fixボタンを押すと

```swift:HomeViewController.swift
if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .light
}
```

こんな感じになり、ライトモードで表示されるようになる。
――が、それを全部のControllerに書くか？？というとちょっとどんくさすぎる。

## 解決策

info.plistに `User Interface Style` ではなく `Appearance` と書いて `Light` を指定するとうまくいく。

### 参考

**UIUserInterfaceStyle key is not available in Info.plist in Xcode 12, how to disable Dark Mode in Xcode 12 from Info.plist?**
<https://stackoverflow.com/questions/64027842/uiuserinterfacestyle-key-is-not-available-in-info-plist-in-xcode-12-how-to-disa>
dockerでcomposer require が killed になる場合の対応

# はじめに
dockerで構築したLaravel環境にて[nunomaduro/larastan](https://github.com/nunomaduro/larastan)をinstallしようとしたところKilledとなり失敗。

```shell-session
$ composer require --dev nunomaduro/larastan
（中略）
Killed
```

# 環境
- docker for mac

# 解決策
調べてみるとどうやらPHPのメモリ不足が原因のようで一旦メモリ使用量を無制限に。

```php:php.ini
memory_limit = -1
```

コンテナ内にて反映確認。

```shell-session
$ php -i | grep memory_limit

memory_limit => -1 => -1
```

再度実行してみるも解決せず。。

```shell-session
$ composer require --dev nunomaduro/larastan
（中略）
Killed
```

Docker for Macのリソース制限の問題でした。

![スクリーンショット 2021-03-19 8.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378711/392374a4-f8d7-ff0d-58ea-5fa377e40f94.png)

とりあえず
Memory 2GB → 5GB
Swap 1GB → 2.5GB
へと変更。

※Memoryの変更だけでも問題ないかもしれません

上記で再度実行したところ無事インストール完了🎉

# おわりに
docker環境利用時のメモリ不足などの問題の際はDocker for Macのリソース制限についても疑っていこうと思いました。
記事まとめ(mitsu4310) 2021年3月19日更新

自分が書いた記事をまとめました。


## Excel VBA
[Excel VBA セル範囲を表にする](https://qiita.com/mitsu4310/items/14451b4e66dfe0ae74a2)

[Excel VBA 変数をセルに表示させるには?](https://qiita.com/mitsu4310/items/01a5f77863f36609de7f)

## Python
[辞書の値を取得する方法、2通り思いつきますか (Python)？](https://qiita.com/mitsu4310/items/bc338deaa89b1270316a)

[appleとAppleは辞書順ではどちらが先か？](https://qiita.com/mitsu4310/items/9de8c1e49f41face597a)

[Pythonでf文字列を用いて辞書の値を表示させる (2021年3月9日一部訂正のため追記)](https://qiita.com/mitsu4310/items/96d188ad2cc1e192f49a)

[Pythonの辞書キーを引用符で囲うか？](https://qiita.com/mitsu4310/items/1ea589820fd558bb74ed)

[print関数を用いずにHello Worldを表示する](https://qiita.com/mitsu4310/items/1dd727d124b21fa139dc)

## その他
[音量調整をキーボードだけでしたい！(Windows)](https://qiita.com/mitsu4310/items/50bb1f684a6fdfa238a2)

[どうしてもWindows10でpipコマンドを使いたい！！！](https://qiita.com/mitsu4310/items/cc64f8d1a3b4fb0ac3f8)

[1/3を2進数で表せますか？](https://qiita.com/mitsu4310/items/69b0fb23114743b1059d)

## お蔵入り
[2つ以上の関数で変数を定義する時はその都度変数の定義が必要じゃなかったみたい (2021年3月11日追記)](https://qiita.com/mitsu4310/items/102238efb5a3051803c5)
【Go 言語】interface のポインタからメソッドコールできないのはなぜ？

## 結論

簡潔に言うと「interface を指すポインタは interface を実装した構造体のポインタのポインタになるから」です。
これだけではよくわからないので詳しくみていきましょう。

## interface のポインタからメソッドコールができないとは？

interface の Mammal とそれを実装した Human という構造体を考えましょう。

```go
type Mammal interface {
	GetAge() int
}

type Human struct {
	Age int
}

func (h *Human) GetAge() int {
	return h.Age
}
```

この時、以下のように Mammal というインターフェースのポインタから GetAge() をコールしようとするとコンパイルエラーになってしまいます。

```go
func Foo(human *Mammal) {
	_ = human.GetAge()  // コンパイルエラー
}
```

GetAge() をコールするためには *Mammal ではなく Mammal を引数に取る必要があります。

```go
func Foo(human Mammal) {
	_ = human.GetAge()
}
```


## そもそも Go 言語の interface とは？

以下のブログにわかりやすく Go の interface とは何かが説明されています。ざっくりまとめると、 interface は型情報と値情報をフィールドに持った構造体になります。これらの型情報と値情報は interface を受ける変数に代入されることで、動的に変化するようです。

https://tyablog.net/2020/01/05/difference-between-interface-and-pointer-in-golang/

## interface のポインタ

変数 human が interface の Mammal そのものを指す場合、以下の図のようになり、構造体の実体からはポインタに当たるものなので GetAge() をコールすることができます。

![スクリーンショット 2021-03-19 7.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235453/16e1b124-8383-2cae-88c2-5cc0ae21fba4.png)

しかし、human が interface の Mammal のポインタの場合、下の図を見ると、構造体の実体からはポインタのポインタに当たるものになってしまっているので GetAge() をコールすることができなかった訳です。

![スクリーンショット 2021-03-19 7.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235453/be6ebff7-0c2e-dbc6-9020-6a0587834025.png)

ポインタのポインタは １ 段階デリファレンスしてやれば最終的な参照先のメソッドをコールすることができます。つまり、interface のポインタはデリファレンスしてやることでメソッドコールが可能になると言うことです。

```go
func Foo(human *Mammal) {
	_ = (*human).GetAge()
}
```
Mock Service Workertつかってみた

#Mock Service Workerをつかうと、簡単にhttpレスポンスのモックテストができるのでやってみました。

参考ページ
翻訳すればいける、ここぐらいしか記述が無い。。
https://mswjs.io/docs/basics/request-matching

チュートリアルとあわせてみると理解が深まる
https://www.wakuwakubank.com/posts/765-react-mock-api/

index.js
サービスの起動、ここでリクエストがあった場合に返すレスポンスを決める

``` react
import { setupWorker, rest } from 'msw'

const worker = setupWorker(
  rest.get('/users/:userId', (req, res, ctx) => {
    const { userId } = req.params
    return res(
      ctx.json({
        id: userId,
        firstName: 'John',
        lastName: 'Maverick',
      }),
    )
  }),
)
worker.start()
``` 
呼び出し元、下記で呼び出す（やり方は何でもOK

``` react
const response2 = await fetch("/users/500")
        .then((response) => response.json())
        .then((data) => data);
```

mocksの中のjsも一応

``` react
// src/mocks/browser.js
import { setupWorker } from "msw";
import { handlers } from "./handlers";
// This configures a Service Worker with the given request handlers.
export const worker = setupWorker(...handlers);


// src/mocks/handlers.js
import { rest } from "msw";
export const handlers = [
  rest.post("/login", (req, res, ctx) => {
    // Persist user's authentication in the session
    sessionStorage.setItem("is-authenticated", "true");
    return res(
      // Respond with a 200 status code
      ctx.status(200)
    );
  }),
  rest.get("/user", (req, res, ctx) => {
    // Check if the user is authenticated in this session
    const isAuthenticated = sessionStorage.getItem("is-authenticated");
    if (!isAuthenticated) {
      // If not authenticated, respond with a 403 error
      return res(
        ctx.status(403),
        ctx.json({
          errorMessage: "Not authorized",
        })
      );
    }
    // If authenticated, return a mocked user details
    return res(
      ctx.status(200),
      ctx.json({
        username: "admin",
      })
    );
  }),
];

```
##注意点として
公式チュートリアルのTroubleshootingを見ておくと良い
pi picoでmicropython その13

#概要

picoでmicropythonやってみた。
ラジオを鳴らしてみた。

#手順

ピン17に、10ｃｍくらいの銅線をつなぎます。アンテナです。
ＡＭラジオを600kHzに、合わせます。
なんか、聞こえるはずです。

#サンプルコード

```

import utime
from machine import Pin, PWM

CLOCK = 1000000
UA = 1
SILO = 2
DO = 3
DOSH = 4
RE = 5
RESH = 6
MI = 7
FA = 8
FASH = 9
SO = 10
SOSH = 11
LA = 12
SIFL = 13
SI = 14
DOHI = 15
DOHS = 16
REHI = 17
REHS = 18
MIHI = 19
FAHI = 20
FAHS = 21
END = 0
OFF = 1
T03 = 3
T06 = 6
T09 = 9
NOTE = 32

musicData = [DO, FA, FA, FA, MI, RE, DO, RE, DO, DO, UA, DO, RE, RE, RE, RE, FA, RE, MI, UA, OFF, UA, DO, RE, RE, FA, SO, FA, MI, FA, MI, RE, RE, DO, RE, RE, RE, LA, FA, LA, SO, OFF, DO, FA, FA, FA, MI, RE, DO, RE, DO, DO, UA, DO, RE, RE, RE, RE, FA, RE, MI, UA, OFF, UA, DO, RE, RE, FA, SO, FA, MI, FA, MI, RE, RE, DO, RE, RE, RE, LA, FA, LA, SO, END]

def playTone(tone, tempo):
   h = 0
   w = 0
   if tone == UA:
      h = 466 / NOTE
      w = int(CLOCK / 466)
   elif tone == SILO:
      h = 493 / NOTE
      w = int(CLOCK / 493)
   elif tone == DO:
      h = 523 / NOTE
      w = int(CLOCK / 523)
   elif tone == DOSH:
      h = 554 / NOTE
      w = int(CLOCK / 554)
   elif tone == RE:
      h = 587 / NOTE
      w = int(CLOCK / 587)
   elif tone == RESH:
      h = 622 / NOTE
      w = int(CLOCK / 622)
   elif tone == MI:
      h = 659 / NOTE
      w = int(CLOCK / 659)
   elif tone == FA:
      h = 698 / NOTE
      w = int(CLOCK / 698)
   elif tone == FASH:
      h = 739 / NOTE
      w = int(CLOCK / 739)
   elif tone == SO:
      h = 783 / NOTE
      w = int(CLOCK / 783)
   elif tone == SOSH:
      h = 830 / NOTE
      w = int(CLOCK / 830)
   elif tone == LA:
      h = 880 / NOTE
      w = int(CLOCK / 880)
   elif tone == SIFL:
      h = 932 / NOTE
      w = int(CLOCK / 932)
   elif tone == SI:
      h = 987 / NOTE
      w = int(CLOCK / 987)
   elif tone == DOHI:
      h = 1046 / NOTE
      w = int(CLOCK / 1046)
   elif tone == DOHS:
      h = 1108 / NOTE
      w = int(CLOCK / 1108)
   elif tone == REHI:
      h = 1174 / NOTE
      w = int(CLOCK / 1174)
   elif tone == REHS:
      h = 1244 / NOTE
      w = int(CLOCK / 1244)
   elif tone == MIHI:
      h = 1318 / NOTE
      w = int(CLOCK / 1318)
   elif tone == FAHI:
      h = 1396 / NOTE
      w = int(CLOCK / 1396)
   elif tone == FAHS:
      h = 1480 / NOTE
      w = int(CLOCK / 1480)
   else:
      h = 880 / NOTE
      w = int(CLOCK / 880)
   while tempo > 0:
      tempo = tempo - 1
      if tone == OFF:
         utime.sleep_us(50000)
      else:
         for i in range(int(h)):
            pwm.duty_u16(30000)
            utime.sleep_us(w)
            pwm.duty_u16(0)
            utime.sleep_us(w)

pwm = PWM(Pin(17))
pwm.freq(600000)

def main():
   i = 0
   tone = OFF
   tempo = T03
   while (tone != END):
      tone = musicData[i]
      i = i + 1
      playTone(tone, tempo)

main()




```


以上。
LLVM のライブラリ群を cmake を使ってリンクさせる

# LLVM のライブラリはたくさんあります。
LLVM のライブラリをコンパイラに引数として渡すときにはたとえば

```bash
$ clang hello.c $(llvm-config --libs)
```

この llvm-config の展開だけするとこうなります。

```bash
$ llvm-config --libs
-lLLVMWindowsManifest 〜中略〜 -lLLVMDemangle
```
多すぎて書くのは省略しますが、とにかくいっぱい出ます。
ですので、これを cmake に反映させてみたいと思った時にいっぱいあるのを全部書き写す…。
なんてことをしていました。

## cmake にすべてを書くのは面倒である
ので、なんとかならないかと思い調べていたところ下記のURLにヒントが有りました。
https://opensource.apple.com/source/clang/clang-703.0.29/src/projects/compiler-rt/CMakeLists.txt.auto.html
これを基に、書いてみると。

```cmake
execute_process(COMMAND "llvm-config" "--libs"
        OUTPUT_VARIABLE LLVM_LIBS)
string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" "" LLVM_LIBS ${LLVM_LIBS})
```
これ、何をしているというと、

```cmake 
execute_process
```
でllvm-configを呼んでその返り値を LLVM_LIBS
に代入しています。
で、肝心なのは次の行です。コレがないと、cmake 時にエラーがでます。


```bash
  " which has leading or trailing whitespace.  This is now an error according
  to policy CMP0004.
```

要するに文字列に余計な改行等が入っているので、ダメだよん、と言っているみたいです。
そこで

```cmake
string
```
で文字列変換をしているわけです。
これで、無事cmake が通るようになりました。
あとはこの変数 LLVM_LIB_NAMES を setしてあげればOKなはずです。

```cmake
set(STATIC_LLVM_LIBRARIES "${LLVM_LIBS}")
```

これにて完。
深層学習。GopsとAccuracyの関係グラフ（2系統）。

#はじめに

深層学習に関して、主要なモデルに関する、**横軸Gops、縦軸Accuracyのグラフ**をよく見かける。
2系統あると思うので、念のため、整理して、記事にする。

#その１
##論文

https://arxiv.org/abs/1605.07678

An analysis of deep neural network models for practical applications

Canziani, Alfredo, Adam Paszke, and Eugenio Culurciello. "An analysis of deep neural network models for practical applications." arXiv preprint arXiv:1605.07678 (2016).

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/89220a91-a14a-2a40-a01d-4df77bba0f52.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/3b610729-6617-d9ef-acf3-ff1cb3bf99f8.png)


##論文著者による記事、github等
https://culurciello.medium.com/analysis-of-deep-neural-networks-dcf398e71aae

↓論文より、情報がアップデートされている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/2c7179e2-8340-dd88-c145-0b93b405f77b.png)

##この2系統の引用関係
こちらが先なので、引用される側。

#その２
##論文
https://arxiv.org/pdf/1810.00736.pdf

Benchmark Analysis of Representative Deep Neural Network Architectures

Bianco, Simone, et al. "Benchmark analysis of representative deep neural network architectures." IEEE Access 6 (2018): 64270-64277.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/a009748a-bec7-1ab9-0d60-8c88076c305c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/de9b9883-ed8d-c2c6-4b08-166ad832e205.png)

↓　Top-1のみを大きく表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/050c5f85-a2a3-e2dd-f9a4-391c2c1ae591.png)


##論文著者による記事、github等
https://celuigi.github.io/models-comparison.pytorch/

##この2系統の引用関係

以下は、論文引用。以下のように、引用している。
>Canziani et al. [4] in the first half of 2016 proposed a comprehensive analysis of some DNN architectures by performing experiments on an embedded system based on a NVIDIA Jetson TX1 board.

##コメント
(どうでもいいことですが。。。）グラフの〇の大きさが謎。普通、面積比にするのでは。:no_good:

# 少し話がずれて、GOPsについて
グラフではなくて、数字が書かれているサイトの例。

https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet
https://github.com/opencv/open_model_zoo/blob/master/models/public/index.md



#関連記事（本人）
[文献『AN ANALYSIS OF DEEP NEURAL NETWORK MODELS FOR PRACTICAL APPLICATIONS』を読む。](https://qiita.com/enoughspacefor/items/ea5a3225c6c54c469326)

#まとめ
特にありません。
もしかすると、他の系統もあるかも。。。
情報や、ご指摘などあれば、コメント等お願いします。:candy:
Supabaseのサーバーが置いてある都市までの距離

追記 2021年8月20日
東京サーバーが追加されていました。

# DBサーバーまでの距離

SupabaseはFirebaseの代替になるように開発されているBaaS（Backend as a Service）です。

Firebaseと違うのは、一つとしてFirebaseのDB（データベース）がNoSQL（Firestore）なのに対して、
SupabaseはRDB（PostgreSQL）になっているところです。

※RDB:Relational Database（リレーショナルデータベース）

しかし、このSupabaseのDBサーバーは日本の近くに置かれていません。
なのでちょっと距離を調べてみました。

東京との距離順にソート済み

| 都市 | 距離 |
|:-:|:-:|
|Southeast Asia Singapole|5,325.950648km|
|South Asia Munbai|6,738.533635km|
|Oceania Sydney|7,833.161128km|
|Canada Central|8,068.703487km|
|West US North California|8,557.173548km|
|Cenntral EU Frankfurt|9,346.654556km|
|West EU London|9,573.164282km|
|West EU Ireland|9,661.791953km|
|East US North Virginia|10,984.257083km|
|South Africa Cape Town|14,754.541759km|
|South America Sao Paulo|18,552.832931km|

Supabaseで新規にプロジェクトを作成する時はシンガポールを選びましょう。

# 参考
２地点間の距離と方位角 - 高精度計算サイト
https://keisan.casio.jp/exec/system/1257670779
TwitterのTLを絶対日時表記にする

# 相対日時はウザい
お前ら海外の風習を押し付けんな。
日本にはタイムゾーンが1つしか無いんだし、UXが悪い。
(ローカライズも大事！)

絶対時間 ⇒ 相対時間の順に認識する自分としては、先に相対時間来られても割と理解出来ない。

(昨今のスマートフォンの着信履歴とか、見ても何時かかってきたのか解りづらくてマジ困る。。。)

なので、TwitterのTLを絶対時間表記に置き換えるUserScriptを作った。


# 環境
* Chrome
* Tampermonkey

# User Sscript
```javascript:User&#x20;Script
// ==UserScript==
// @name         TLを絶対時間に置き換える.
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://twitter.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    // Your code here...
    let WEEK_LABEL = ['日', '月', '火', '水', '木', '金', '土'];

    let toFormatedDateString = function(date) {
        // yyyy/mm/dd (aaa) HH:MM
        let ret = "";
        ret += date.getFullYear();
        ret += '/';
        ret += ('0' + (date.getMonth() + 1)).slice(-2);
        ret += '/';
        ret += ('0' + date.getDate()).slice(-2);
        ret += ' (';
        ret += WEEK_LABEL[(((date.getDay() % WEEK_LABEL.length) + WEEK_LABEL.length) % WEEK_LABEL.length)];
        ret += ') ';
        ret += ('0' + date.getHours()).slice(-2);
        ret += ':';
        ret += ('0' + date.getMinutes()).slice(-2);
        return ret;
    }

    let f = function() {
        document.querySelectorAll('main div[data-testid="primaryColumn"] section article a[href*="/status/"] time').forEach(function(e) {
            let a = e.parentNode;
            let span = document.createElement('span');
            let s0 = e.getAttribute('datetime');
            let s1 = toFormatedDateString(new Date(s0));
            span.setAttribute('datetime', s0);
            span.setAttribute('local-datetime', s1);
            span.textContent = s1;
            a.appendChild(span);
            a.removeChild(e);
        });
    };

    setInterval(f, 1000);
})();
```
# before after
取り敢えず適当なトレンドでサンプル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/244f280f-9c85-11d7-86de-c8cf1c85689a.png)
e感じ

# 解説
時間表記にはハイパーリンクがあり、その中の ``timeタグ`` で時間が表示されている。その ``textContent`` を置き換えれば良いのだけれど。``timeタグ`` は相対時間の定期更新の標的になっているため、``spanタグ``　で作り直している。ポーリングなので、処理回数を減らすため、CSSセレクタの条件も、絶対時間に置き換えた後は引っかからない様にしている。

# 補足
Q. なんでポーリングなの？

A. PJAXで画面遷移されるから、イベント捕まえるのムリゲ。

Q. Date.toLocaleString()で良くね？

A. 表記に ``ゼロ付き`` と ``曜日`` が欲しかった。(会社員になってからは、日にちより、曜日で生きている感ある。)

Q. ラムダ式使えよ。。。

A. え？

Q. 書式長いの無駄じゃない？

A. 認識出来ない表記に意味はないので。

Q. ``相対時間だと何時かわからない`` の意味がわからない・・・・

A. (´・ω・&#x60;) 左右盲なもんで、他にも理屈じゃなく認識速度が落ちる物事が多いんです。
AWS IoT thing shadowの取得と更新

Thing shadowの読み書きを行う方法はいくつかある。それらのまとめ。

## イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/585b2e4a-59ae-057b-399b-035c2779977c.png)

## アプリケーション側　(Eg. Lambda)

### 準備

Lambda関数を作成し`AWS IoT Data`へのアクセス権限を割り当てる。

### 基本動作

```js
// 初期化
const iotdata = new aws.IotData( { endpoint: <エンドポイント> } );

const params = {
    thingName: <thing名>,
    payload: <更新内容>
};
// データ更新
/// 非同期で更新する。
const res = iotdata.updateThingShadow(params, (err, data) => {
    // 実行後のコールバック関数
});
/// 同期的に更新したい。
const res = await iotdata.updateThingShadow(params).promise();

// データ取得
const params = {
    thingName: <thing名>
};
let res = await iotdata.getThingShadow(params).promise();
console.log(res)

```

同期的な更新では`AWS.Response()`オブジェクトの`promise()`を利用。
イベントハンドラの第三引数`callback`を用いる方法もあるが面倒。
→ [公式ドキュメント:AWS.Response](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html)
→ [公式ドキュメント:promise](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/using-promises.html)

### イベント駆動な呼び出し

shadowの特定の変化をトリガしてLambdaを実行するように`Rule`と`Action`を設定する。
デバイス側からのreportedの値が変化したことや一定の閾値を超えたことを検出して特定のActionを実行する。
ActionはLambdaに限らず種々のAWSサービスを利用できる。

設定方法などはここでは省略、以下参照。

https://dev.classmethod.jp/articles/aws-iot-rule-shadow/

## デバイス側

同じくaws-sdkを用いることもできるが、デバイスに入れるモジュールサイズに制限がある環境等ではaws-sdkは70MBほどと大きすぎるためAWS IoT特化のsdkを利用。

### 準備

shadowと通信するための準備。
thingを作成済みであり、作成時に生成した或いは登録した証明書はローカルに落としている前提とする。

```js
var awsIot = require('aws-iot-device-sdk');

var thingShadows = awsIot.thingShadow({
    keyPath: "./xxxxxxxxxx-private.pem.key",
    certPath: "./xxxxxxxxxx-certificate.pem.crt",
    caPath: "./rootCA.pem",
    clientId: "<thing名>",
    host: "xxxxxxxxxxxxx-xxx.iot.ap-northeast-1.amazonaws.com"
});
```

`keyPath`および`certPath`には証明書のパスを指定する。
`caPath`はルート証明書。[公式](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/server-authentication.html#server-authentication-certs)から落としてきて保存したファイル名とパスを指定する。`clientId`はthing名、`host`はエンドポイント名である。エンドポイントはAWS IoTコンソールのサイドバーにある`設定`から参照できる。もしくは、各thingの`相互作用`の項目からも確認可能。

### 基本動作

```js
thingShadows.on('connect', function () {
    // AWS IoTのthingとの接続時の処理をこの中で書く。
    thingShadows.register(<thing名>, {}, function () {
        // 登録作業。
    });
}

thingShadows.on('status',
    function (<thing名>, stat, clientToken, stateObject) {
        // shadowの取得や変更はstatus変化として扱われこのイベントを受け取る。(パラメータのstatはstateが来る。)
        // stateObjectにshadowの値が含まれる。
    }
);

thingShadows.on('delta',
    function (<thing名>, stat, clientToken, stateObject) {
        // "desired"と"reported"に差異が生じた場合にはこのイベントを受け取る。
        // なお、stateObjectにはdelta部分のみ含まれる。
    }
);

// shadow全取得 → なお、取得する値は上記の'state'イベントとして受け取る。
thingShadows.get(<thing名>);
```

### イベント駆動な呼び出し

上記の`delta`を利用。

## ほか

thingを作成した初期のshadowには`welcome`の様な適当な値が入っていてコンソールの`編集`から削除するも消えなくて地味に苦労する。shadowは直接消して削除するのではなく値に`null`を指定して更新してあげることで削除できるのでその様に更新すると初期の`welcome`を消すことができる。
なお、中の要素が全てなくなると`desired`や`reported`のキー自体がなくなる。 また、これはdeltaでトリガすることができないので注意。

## 公式sdk資料

* https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/IotData.html#updateThingShadow-property
* https://github.com/aws/aws-iot-device-sdk-js/blob/master/README.md
カスタムEditorWindowで自由な形状のRectをクリックする

エディタ拡張のカスタムEditorWindowで、
自由な形のRectをクリックする処理のサンプルを書いたのでコードを貼っておきます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちょっと自主勉強。<br>エディタ拡張パネルの特定領域をクリックする機能。 <a href="https://t.co/BwleusJCnG">pic.twitter.com/BwleusJCnG</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1372599195190714368?ref_src=twsrc%5Etfw">March 18, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#コード

```cs:TouchSampleWindow.cs
using UnityEditor;
using UnityEngine;

namespace ScreenPocket
{
    public sealed class TouchSampleWindow : EditorWindow
    {
        [MenuItem("Tools/ScreenPocket/TouchSample")]
        private static void Open()
        {
            const string title = "TouchSample";
            var window = CreateWindow<TouchSampleWindow>();
            window.name = title;
            window.titleContent = new GUIContent(title);
        }

        private bool _isClick;

        private void OnGUI()
        {
            var mousePos = Event.current.mousePosition;
            //座標表示
            EditorGUILayout.LabelField(mousePos.ToString());
            
            var eventType = Event.current.type;
            //ボタンの範囲
            var buttonRect = new Rect(50f,50f,200f,200f);
            //マウスがRectの範囲内
            var containsMousePosition = buttonRect.Contains(mousePos);

            if (eventType == EventType.MouseDown)
            {
                _isClick = containsMousePosition;
            }
            else if (eventType == EventType.MouseUp)
            {
                _isClick = false;
            }
            else if (eventType == EventType.MouseDrag)
            {
                _isClick = containsMousePosition;
            }

            DrawRect(buttonRect, _isClick);
            
            Repaint();
        }

        /// <summary>
        /// 矩形描画
        /// </summary>
        /// <param name="rect">矩形</param>
        /// <param name="fillCenter">塗りつぶすかどうか</param>
        private static void DrawRect(Rect rect, bool fillCenter)
        {
            Handles.DrawSolidRectangleWithOutline(rect, fillCenter ? Color.red : Color.clear, Color.white);
        }
    }
}

```
#使い方など
メニュー > Tools > ScreenPocket > TouchSample でパネル表示。
GUILayout.Button()ではないクリック処理を書きたいときに使えるかと。
検索しても自分が欲しい感じの記事が見つけられなかったので、メモとして置いておきます。
Dockerイメージ stilliard/pure-ftpd で複数ユーザ設定可能にする


# stilliard/pure-ftpd だとFTPユーザを複数設定しにくい

よく利用されているFTP用コンテナのひとつに stilliard/pure-ftpd があります。
https://hub.docker.com/r/stilliard/pure-ftpd
手軽にFTPサーバを用意でき、ユーザやパスワードも環境変数で決められます。

```bash
FTP_USER_UID
FTP_USER_GID
FTP_USER_NAME
FTP_USER_PASS
FTP_USER_HOME
```

楽ですね。

ただ、やや物足りないのが、上記のとおり、環境変数で設定できるのが1ユーザだけである点です。
複数ユーザ設定は当然需要があり、issueも起票されていますが、オーナからは「コンテナに入ってコマンド叩いてユーザ作成してねー」との案内に留まっています。
https://github.com/stilliard/docker-pure-ftpd/issues/136
ちょっと手間です。もっと良い方法はないものでしょうか。

# atmoz/sftp のやり方を拝借する

というわけで、他から助けを借りることにします。
https://github.com/atmoz/sftp
上記はSFTP用のコンテナです。 `ユーザ:グループ:ユーザID:グループID:ホームディレクトリ` の形式を複数用意し、引数としてentrypointに渡してやれば、複数ユーザのいるSFTPコンテナを起動することができます。

該当のshellを stilliard/pure-ftpd に持ち込んで、複数ユーザ設定可能になるよう書き換えます。

* stilliard/pure-ftpd を `git clone` して、
* 環境変数でFTPユーザ設定するのはやめて、
* 代わりに `ユーザ:グループ:ユーザID:グループID:ホームディレクトリ` の形式でentrypointの引数を用意してやって、
* atmoz/sftp と同様、各引数に対して「validation」「ユーザ作成コマンド発行」を行うようにすればOKです

簡単ですね。

# おわりに

この投稿では stilliard/pure-ftpd で複数ユーザ設定できようにする方法を書きました。
issueにもその旨コメントしている方がいるので、大体の人がやっている方法だと思います。
https://github.com/stilliard/docker-pure-ftpd/issues/136#issuecomment-649404150

それではごきげんよう。
Bashスクリプトの引数解析をgetoptsで行う際の問題と解決策

# 何？

Bashスクリプトで実行時引数の解析を行う時に用いるBash組み込みのパーサコマンド`getopts`は、「**オプション引数の前に位置引数がある**」ような場合、うまく処理できない。この場合エラーを出すようにする方法を考えた。

なお、競合する`getopt`コマンド単体を用いるとこの問題は解決する。どうしても`getopts`がいい場合には今回の方法を用いるといい。

## 具体例

optstringが`d:`で、同時に位置引数を受け取りたい。

```bash:hoge.sh
#!/bin/bash

DIR=''
while getopts d: OPT
do
  case "$OPT" in
    d) DIR=$OPTARG ;;
    *) exit 1
  esac
done

echo "DIR=$DIR"
echo "before: $@($#)"
shift $((OPTIND-1))
echo "after: $@($#)"
```

のようなパーサに対して、実行時引数の順序を「オプション引数の後に位置引数」とすると、

```:Terminal
# オプション引数の後に位置引数
$ ./hoge.sh -d ./test hello
DIR=./test
before: -d ./test hello(3)
after: hello(1)
```

となり、オプション引数は処理され、`shift`の後に、位置引数が位置パラメータ`$@`に残っていることがわかる。
しかし、「オプション引数の前に位置引数」とすると、

```:Terminal
# オプション引数の前に位置引数
$ ./hoge.sh hello -d ./test
DIR=
before: hello -d ./test(3)
after: hello -d ./test(3)
```

となり、オプション引数は処理されていないばかりか、`shift`の後であっても、すべての引数が残っていることがわかる。

`getopts`を素で使う以上は、後者のような場合エラーを出して`exit 1`したい。

## 解決策

競合の`getopt`コマンドを用いて以下のようにする。

<details>
<summary>diff</summary>
<div>

```diff:hoge.sh
#!/bin/bash

DIR=''
while getopts d: OPT
do
  case "$OPT" in
    d) DIR=$OPTARG ;;
    *) exit 1
  esac
done


+ args=($(getopt :d "$@")) argnum="$#"
- echo "DIR=$DIR"
- echo "before: $@($#)"
shift $((OPTIND-1))
+ if [ "${args[0]}" != "--" ] && [ "$argnum" -eq "$#" ]
+ then
+   echo 'cmd is placed before the options?' >&2
+   exit 1
+ fi
+ echo "DIR=$DIR"
+ echo "before: $args($argnum)"
echo "after: $@($#)"
```

</div>
</details>

```bash:hoge.sh
#!/bin/bash

DIR=''
while getopts d: OPT
do
  case "$OPT" in
    d) DIR=$OPTARG ;;
    *) exit 1
  esac
done

args=($(getopt :d "$@")) argnum="$#"
shift $((OPTIND-1))
if [ "${args[0]}" != "--" ] && [ "$argnum" -eq "$#" ]
then
  echo 'cmd is placed before the options?' >&2
  exit 1
fi
echo "DIR=$DIR"
echo "before: $args($argnum)"
echo "after: $@($#)"
```

こうすると

```:Terminal
$ ./hoge.sh -d ./test hello
DIR=./test
before: -d(3)
after: hello(1)
```

```:Terminal
$ ./hoge.sh hello -d ./test
cmd is placed before the options?
```

ハンドル出来た。

## 参考

- @b4b4r07さんの[bash によるオプション解析](https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb#%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E7%89%B9%E5%BE%B4--getopt-%E3%81%A8-getopts-%E3%81%AE%E9%81%95%E3%81%84)の`getopts`に関する記述

> デメリット
>
> - コマンドの引数のあとでオプションが使用できない
>
> bash スクリプトでオプション解析をする際には、bash 組み込みコマンドの `getopts`  を使っていれば大抵の場合は問題ありません。しかし、`getopts` だと、コマンドラインの後半でオプションを指定できないことに気がつきました。 具体的には、
> 
>     Usage: command.bash [-a] [-d dir] item1 item2 ... 
> 
> のような構文の場合に、`-d dir` を `item` の後ろに指定しても、期待した処理がされません。
[PHP] json_encode の第2引数を整数で指定する

値をJSON形式にして返す関数が json_encode です。
第2引数にエンコードのオプションを指定できます。

# 結論

定数と整数，どちらで指定しても同じです。
以下が対応表になります。[参考](https://www.php.net/manual/ja/json.constants.php#115783)

```php
JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3

JSON_ERROR_SYNTAX => 4

JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1

JSON_BIGINT_AS_STRING => 2
```

つまり以下の2つは全く同じです。

```php
$arr = ['a' => "<p>hello</p>"];

echo json_encode($arr, JSON_HEX_TAG); // {"a":"\u003Cp\u003Ehello\u003C\/p\u003E"}
echo json_encode($arr, 1); // {"a":"\u003Cp\u003Ehello\u003C\/p\u003E"}
```

# 解説

[公式ドキュメント](https://www.php.net/manual/ja/function.json-encode.php)では以下のように定義されています。

```php
json_encode (mixed $value, int $flags = 0, int $depth = 512) : string|false
```

オプション引数を指定しない場合

```php
$arr = ['a' => 1, 'b' => 'hello'];
echo json_encode($arr); // {"a":1,"b":"hello"}
```

## php-src を追ってみる

[この部分](https://github.com/php/php-src/blob/dcac654fd56a2cecec0c187ba061ecc82bbc9031/ext/json/php_json.h#L61-L78)で定数が定義されています。

```
/* json_encode() options */
#define PHP_JSON_HEX_TAG                    (1<<0)
#define PHP_JSON_HEX_AMP                    (1<<1)
#define PHP_JSON_HEX_APOS                   (1<<2)
#define PHP_JSON_HEX_QUOT                   (1<<3)
#define PHP_JSON_FORCE_OBJECT               (1<<4)
#define PHP_JSON_NUMERIC_CHECK              (1<<5)
#define PHP_JSON_UNESCAPED_SLASHES          (1<<6)
#define PHP_JSON_PRETTY_PRINT               (1<<7)
#define PHP_JSON_UNESCAPED_UNICODE          (1<<8)
#define PHP_JSON_PARTIAL_OUTPUT_ON_ERROR    (1<<9)
#define PHP_JSON_PRESERVE_ZERO_FRACTION     (1<<10)
#define PHP_JSON_UNESCAPED_LINE_TERMINATORS (1<<11)

/* json_decode() and json_encode() common options */
#define PHP_JSON_INVALID_UTF8_IGNORE        (1<<20)
#define PHP_JSON_INVALID_UTF8_SUBSTITUTE    (1<<21)
#define PHP_JSON_THROW_ON_ERROR             (1<<22)
```
1つ見てみましょう。

```
#define PHP_JSON_UNESCAPED_UNICODE          (1<<8)
```

PHP_JSON_UNESCAPED_UNICODE という名前の定数を，256 という値で定義しています。

1<<8 というのはシフト演算です。1を8ビットだけ左にシフトするという意味です。要は，1を左に8桁シフトしているだけです。
10進数の 256 は，2進数だと 100000000 です。末尾に0が8個ついていますね。



ちなみに，json_encode の実装は [この部分](https://github.com/php/php-src/blob/dcac654fd56a2cecec0c187ba061ecc82bbc9031/ext/json/json.c#L219-L259)です。

# 最後に

今回は知らないと困るような内容ではないですが，気になったので調べてみました。
何か間違いなどあればご指摘いただければ幸いです。
Streamlitで地図を表示する

##Streamlitについて
簡易的なWebアプリが迅速に作成・デプロイできるツールです。
動的なグラフなどを短いコードで作成でき、しかもPythonだけで完結します。最近は徐々に認知度が高くなっており、利用者も増加傾向にあるようです。

公式へのリンクは下記に貼っておきます。

https://docs.streamlit.io/en/stable/installation.html

##地図上にピンとエリアを表示する
地図ツールのfoliumとstreamlitを組み合わせたPythonのサンプルコードです。
地図の上にスライダーをつけて拠点からの半径を調整できるようにしました。
VSCodeなどでファイルを作成してください。

```python
import folium
from streamlit_folium import folium_static
import streamlit as st
import pandas as pd

# サンプル用の緯度経度データを作成する
sales_office = pd.DataFrame(
    data=[[32.0,131.1],
          [33.1,131.2],
          [34.2,131.3]],
    index=["本社","A営業所","B営業所"],
    columns=["x","y"]
)

# データを地図に渡す関数を作成する
def AreaMarker(df,m):
    for index, r in df.iterrows(): 

        # ピンをおく
        folium.Marker(
            location=[r.x, r.y],
            popup=index,
        ).add_to(m)

        # 円を重ねる
        folium.Circle(
            radius=rad*1000,
            location=[r.x, r.y],
            popup=index,
            color="yellow",
            fill=True,
            fill_opacity=0.07
        ).add_to(m)

# ------------------------画面作成------------------------

st.title("サンプル地図") # タイトル
rad = st.slider('拠点を中心とした円の半径（km）',
                value=40,min_value=5, max_value=50) # スライダーをつける
st.subheader("各拠点からの距離{:,}km".format(rad)) # 半径の距離を表示
m = folium.Map(location=[33.1,131.0], zoom_start=7) # 地図の初期設定
AreaMarker(sales_office,m) # データを地図渡す
folium_static(m) # 地図情報を表示
```

ターミナルでファイルを実行します。

```
streamlit run [ファイル名]
```

##実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429192/c3ac8501-dda3-c32d-b08a-ff7548cbb1c5.png)

※この地図は拡大と縮小ができます。

上記で５０行以下のコードです。またStreamlitでは、以下のことも簡単に実装できます。
・サイドバーや各種ボタンをつける
・ファイルをアップロードする
・テーブルデータを表示する
・Plotlyやdashなどの可視化ライブラリを組み合わせて表示する

これ以外にも応用例がたくさんあり、機械学習のモデル検証などにも活用されています。
ポートフォリオ作成記録③（DB設計編）

前回の記事の続きです[作成記録②はこちら](https://qiita.com/engineer_PT/items/40d62d7b9672438d4537)

<h2>DB設計図作成</h2>

投資用不動産の営業マンの口コミサイトを作成するためのDB設計図を作成しました。
先にDB設計図の軸になる「Usersテーブル」とその他のテーブルを貼ります。

[Usersテーブル]
![スクリーンショット 2021-03-19 0.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693783/417ddf51-0c6b-6ff6-0533-4b697eb3ecf8.png)

[その他のテーブル]
![スクリーンショット 2021-03-19 0.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693783/a2ec67b9-1c8f-fec4-589e-98c74be640bf.png)

ER図も作成

[ER図]
![スクリーンショット 2021-03-19 0.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693783/51ed6a0d-688f-8c3e-629c-50abe2130063.png)



テーブル設計に関してはスプレッドシートを利用
参考にしたサイトは[こちら](https://qiita.com/nishina555/items/a79ece1b54faf7240fac)。

ER図はいろいろツールがあるようですがdraw.ioを採用。(https://app.diagrams.net/)
理由はGoogle Driveに保存できることと、スプレッドシートと一緒に管理ができるためです。



Usersテーブルは個人情報や不動産営業マンなら所有資格、一般ユーザーなら自己資金や年収などを一緒につぎ込んだら１８カラムもできてしまいました。。汗

その他のテーブルはUsersテーブルとリレーションさせたテーブルになります。多対多、一対多のテーブルがそれぞれ入っています。（詳しい内容は割愛）


<h2>DB設計を作成してみて</h2>
思ったことが3つあります。

<h4>①悩まずにサクサクできました。</h4>
良い設計かは置いておいて、業界知識があったので「何が必要か？」というのがすぐに頭に浮かび、設計図を書くのに苦労しませんでした。

自社開発企業が未経験でも業界知識のある人を採用する理由が体感的に理解できた気がします。

また、エンジニアとして働くときも<b>作るサービスに関する業界知識を自分から吸収していく必要がある</b>と感じました。

<h4>②実際にユーザーは使ってくれるのか？</h4>
このポートフォリオを考えたきっかけは不動産業界にいたときに出会ったサ○師系不動産営業マンに対する不満から生じた物です。

しかし、設計図を書いてみたらチャット機能、フォロー機能、口コミ機能、CRUD処理、保有資格、所有不動産…などなど、<b>自分が入れたい機能を好きなだけ突っ込んでユーザーが見えなくなってるんじゃないか?</b>と今更ながら思っています。

実装では本当に必要だと思っている機能（まずは口コミ機能）を取り入れて形にしたいと思いました。

面接の際に「実装機能が設計より少ない」と聞かれたら思ってることをそのまま話しますが、「手を抜いた」と判断される方もいらっしゃるといるはず。
機能を減らした場合は、その分をデザイン面を工夫する方向で補おうかな？と思案中。

<h4>③実際にサービスとしてマネタイズできるのか？</h4>
まず営業マンの登録ありきな内容のため、
運用するなら最初は完全無料で以下①〜④を当分の間ループさせます。

１）営業マンに登録してもらう
↓
２）一般ユーザーさんに口コミしてもらう
↓
3）口コミで評判が良い営業マンにユーザーが集まる
↓
4）登録する営業マンが増える



[ここでパッと思いつく課題]
・有料化までどの程度期間を要するのか
・どこでいくら収入を得るのか
・最初に営業マンが登録するメリット
・何人営業マンが登録したら1件書き込みがきて、その中で1人の営業マンとユーザー間で取引が発生するまでのKPIが全然わからない
・どうやってサイトを認知してもらうのか
・そもそも本当に優れた営業マンは登録しないでも仕事が回ってるのでは？

…という訳で、マネタイズが現時点で絶望的だと気づいてしまいました。
今の時点でプログラミングスキル以外の課題が見つかったのはプラスに捉えてもいいかなとは思います。

新規事業を作ってマネタイズするって超難しいなと感じますし、エンジニアとして会社の売上を出すには、マーケティング（サービスを買ってくれる仕組み作り）に関する知見はプログラミングと並行して学ぶ必要があるのではと痛感。

<h2>終わりに</h2>
設計が終わっただけなんですが、反省点は既にたくさんありました。
実装に入ったらおそらくエラー連発して泣きそうになると思いますが、なんとか形にしたいと思います。


また、急に話が変わるのですが、
知り合いの方から「リリースしたいプロダクトがある」と相談を受けております。

プロダクト自体は社会的意義を感じる素敵な内容です。
こちらに関して細かいところの擦り合わせでどうなるかわからないですが、お話が纏ったらそちらの方の案をベースにポートフォリオ作り直すかもしれません。
（擦り合わせはお金ではないです）

こちらに関してはもうすぐ方向性が見えるので、
明日はポートフォリオ作成はお休みして土曜日からまた進めていこうと思います。

また日記みたいになってしまった！！
終わり。
＃1,プログラミング始めました。

##これは何？
-来月4月から情報系大学1年生になるのでプログラミングを先にやろうと、電通生に教えてもらい学んだことをQiitaに書き連ねていく自己満復習成長記です。
markdownもうまく使えないので見づらいのはご了承ください。
ギットハブも貼っておきます
https://github.com/Takeyannn
##所持品
ラップトップのMacBook Pro
スペックは
- 13-inch, 2020, Four Thunderbolt 3 ports
-プロセッサ：2 GHz クアッドコアIntel Core i5
-メモリ：16 GB 3733 MHz LPDDR4X

##まずはこうしろ！
###レポートはTeX
-TeXとはマークアップ言語の1つ
-HTMLの仲間である（HTMLとは何ぞや）
######“HTMLとは、ハイパーテキスト・マークアップ・ランゲージ（Hyper Text Markup Language）の略。簡単にいうと、コンピューターが理解できる、マークアップをするための言葉です。”
https://techacademy.jp/magazine/4843引用
-数式をいい感じにすることができる
でも手元に環境を構築するのは大変らしく、「Cloud LaTeX」を使うといいらしい

###メモはMarkdown
-Markdownもマークアップ言語の1つ
(アップなのかダウンなのかややこしい…)
-文法構造が簡単で使いやすい
-HTMLに容易に変換可能で、HTMLになるということは簡単にPDFになるということ

###とりあえずPython
PythonはAIブームの火付け役ともいえるプログラミング言語
比較的簡単で何でもできる
-機械学習
-ディープラーニング
-自然言語処理
-Web/スマホアプリ
-統計処理
-数値計算

paiza https://paiza.jp/student から
paizaはプログラミング言語学習プラットフォーム
Pythonの学習教材がそこそこ揃っていて提出したコードから利用者をランク付けしてくれるのでランクに応じて就職オファーが来る
大学在学中はアルバイトとして卒業したら入社みたいなことも可能

#####Pythonのプログラミングに慣れたら
-メモリ管理・ポインタなど、重要な概念がたくさんある『C』
https://9cguide.appspot.com/
通称「苦C」一番苦しまずにわかりやすく『C』言語を学べる

-オブジェクト指向の代表格の『java』
www.isl.ne.jp/pcsp/JavaToYou/

JavaならJava言語入門〜C言語を学んだ君へ〜

##エンジニア必須アイテム〈三種の神器〉
1.Twitter
疑問点を投げるとどっかの大学教授が答えてくれたりするらしい

2.Qiita
自分が勉強したことを、誰かに伝えるつもりで書く
復習になるし、実績にもなる

3.GitHub
プログラムコード向けのクラウドのようなもの
自分が書いたコードを上げておく

4.Compass
に限らず技術系のカンファレンス・シンポジウムには どんどん参加すべき
自分で勉強するよりも、人に訊く方が却って楽で訊くは一時の恥・訊かぬは一生の恥
学生は参加費無料になったりする


（いや4つあるやん！）

###まとめ

今日から頑張るよ。
jQuery3系にてfadein,fadeoutがフェードしない時

# 現象
jQueryを1,2系から3系にバージョンアップした際、fadein()やfadeout()がうまく動かず、瞬間的に表示/非表示が切り替わる挙動を示すことがある。

# 原因
3系にて現在時刻の取得処理がjQuery.now()ではなく、Date.now()を利用するようになっている。
Date.now()をグローバルに上書き[^1]してしまうような、日時操作系の古いライブラリなどが共存している環境においては干渉しアニメーションが異常な動作となる。


2系のタイマー処理
https://github.com/jquery/jquery/blob/2.2-stable/src/effects.js#L31
3系のタイマー処理
https://github.com/jquery/jquery/blob/main/src/effects.js#L42

# 対応策
- 問題となっている日時操作ライブラリを最新に更新する。
- 更新してもDate.now()の挙動が変わらない場合、可能であればPRを出すか、あるいはそのライブラリの使用を辞める。
- メンテがとうの昔に終わっており、代替案もすぐには用意できずどうにもこうにもならない場合は、最悪ライブラリに手を入れて自社管理することも考える。（こういうケースではだいたい自サーバーでホスティングしていると思うので…）

[^1]: コンソールでDate.now()を実行した時に、Unixタイムスタンプではなくフォーマット済の時刻文字列を返却するように変えるライブラリが存在し、こういったものが該当する。
社内のファイルサーバーを自作する場合

若干他人のふんどしで相撲をとった感じの内容なのですが、世の中にお困りの方も多いと思うので、アイデアとして共有しておこうと思います。
（セットアップしたのは私ではないという意味で。運用・保守はしています。）

ちなみにここで書かれている方法を実践される場合は自己責任で。

# ファイルサーバーの容量が足らなくなる問題

今いる会社では、開発の資料や、容量が大きくなりがちなデザインファイル、アプリのバイナリー、もっというと容量が大きくてVMに乗り切らない（社内にVMサーバー用のワークステーション機がある）ものは、NFSで別のファイルサーバーに逃がしています。

数年前は合計4TBで足りてたのに、年々容量不足になっていっています。

# ファイルサーバーをセットアップ

外付けHDDでも認識すれば、RAIDは組めます。
今の会社にはちゃんとしたサーバールーム的なものがないので、ラックマウント型の装置を起きづらい。
どこで割り切るかですが、ファイルサーバーをどうするかは以下になるのかなと思います。

- 高価で爆音のディスクアレイ装置を設置して装置自体の信頼性を高めるか。
- 多少のネットワークトラフィックと、従量課金してクラウド化してファイル保全の安全性を高めるか
- 専門業者に依頼でファイルサーバーを設置するか
- ケチって手間をかけて自前で構築するか

今の御時世にはあってない考えかもしれないですね。

今の会社の場合、本当に重要なファイルは別の場所でちゃんと管理されていたりするみたいなんですが、容量を大量に消費する開発ファイルは、自前で作ってしまってます。サーバーやっているっていうプライドみたいなものもあるのかもしれませんが。

ちなみに以下の構成は少し変えればご自宅でもできると思います。

## ハードウェア構成

- 本体
    - 普通のPCにLinux（CentOS）をインストールしたもの。
    - できればUSB3に対応した機材がいい。
- ディスクアレイ
    - [裸族のスカイタワー 10Bay IS (CRST1035U3IS6G)](https://www.century.co.jp/products/crst1035u3is6g.html)
    - [裸族のスカイタワー 10Bay USB3.2 Gen2 IS (CRST1035U32CIS)](https://www.century.co.jp/products/crst1035u32cis.html)
- その他パーツ
    - 裸族のスカイタワー 10Bay USB3.2 Gen2 IS (CRST1035U32CIS)対応用
        - [ORICO PCI-E拡張カード USB3.2 Gen2（20Gbps） Type-C インターフェースカード 増設PCIeボード PCI-E x4（3.0） PCI-E x8 PCI-E x16対応 SATA 15PIN電源 ASM3242搭載 Windows 8/10 / Linuxに対応 PE20-1C-BK](https://www.amazon.co.jp/dp/B08DTC2PJP/)
        - [UGREEN Type C ケーブル USB 3.1 Gen1 PD対応 最大60W/3A 急速充電 4K 60HZビデオ伝送 高耐久ナイロン編み 5Gbps Macbook Pro、Galaxy S9 S9 Plus、Huawei P20 P20 Pro、Xperia XZ、 等対応 2M](https://www.amazon.co.jp/dp/B086VCWT35/)
    - HDD（NAS用でOK。裸族は1スロットあたり18TBまで認識するらしいのでコスパのいいものを選んで）

### お断り

- 本体によっては、認識しないことがあるかと思います。最近のものであれば大丈夫でしょう。
- ケーブルがUSB3 Gen2に対応していないので、対応したものを探すといいでしょう。
- Linux OSによってはUSB3 Gen2に対応してない場合があります。Kernelの問題なんだとか。CentOS 7を使ったのですが微妙だったかも。Ubuntu 20ぐらいならよかったかも。
- RAID1で構成します。mdを使いますので、ディスク障害が起こったときは自力でリカバリーする必要があります。

### 構成案（追加）

スカイタワーを2台用意して、各ディスク同士をRAID1で構成すれば、ハードウェア障害を低減できるかも。
一応、スーパーブロックにどのディスク同士でRAIDを組んでいたかの情報が記録されているらしく、Linux本体を変えても、ファイルを復旧できるみたいです。

# ファイルサーバーの運用は難しい

私はサーバー系ですが、プログラマなので、社内サーバーの管理は厳密には仕事ではないと思っています。
ですが、扱える人が少ないのと歴史的経緯で見てしまっているところがあります。

みんなや同じ職種の人に言ってもあまり理解してもらえないのですが、資源は有限、足らなくなったら開発する必要がありますし、資源を維持するコストもかかると私は考えています。

なので、

- 無駄にバックアップなどの大量のファイルを作っているのであれば、定期的に整理する。
- 大きなファイルを扱うときは、別途ストレージを用意する。
- 終了案件は、アーカイブ用のディスクに保存する。

などしてほしいところです。

まぁ、クラウド化もあまりしていないし、拠点間バックアップもしていない（バックアップ先の拠点がない）、専門部隊が存在せず開発部プログラマの仕事になっているということで、わたしもそれぐらいにしか考えていませんが。

クラウド化にしていないのは、単純にファイル転送速度の問題もあったりするので、ローカルエリア内においておきたいというのもあります。

以上。
git for windowsでpatchファイルの生成および適用方法

最近gitを使っている分、パッチファイルを生成してメンバーに修正差分を展開するシーンがたくさん出てきていました。linuxではpatchが内装されているらしいがあいにく手元の作業環境がwindows+vscodeとなっていて、windowsにおいてもpatchコマンドを使える方法を探ってみました。  
## パッチの適用
1. デフォルト設定でgit for windowsをインストールすれば、「C:\Program Files\Git\usr\bin」にwindows用のpatch.exeコマンドがあるはずです。このフォルダーはシステムパスに含まれないので、cmdではなくgit bashを使えば、コマンドへのアクセスが可能となります。
2. git bashを開いて、`patch -p1 < xxx.patch`を実行すれば、今いるフォルダーをルートパスに（オプション`-p1`）、パッチが適用されます。別の階層で適用したい場合オプション`-p1`を必要に応じて変更していただければと思います。  

## パッチの生成
gitでのパッチ生成する方法の一つはコマンド  
`git diff commit1 commit2 > filename.patch`  
を叩けば、commit1⇒commit2のパッチが指定されたファイル名で生成されます。