OmniAICreator/Qiita-1.07M huggingface dataset:
tqdmでプログレスバーを表示させる

#環境
macOS 10.14.2
python 3.6.3

#下準備
はじめにtqdmをインストールしておきます. 

```
$ pip install tqdm
```

#基本
下のコードは100回のループを回していて, 各ループごとに1秒の間隔を空けて実行しています. 
その処理にtqdmを使用して, プログレスバーを導入します. range()関数の値をtqdm()関数に与えるだけでプログレスバーを表示することができます. 
100回分のループを渡しているので, 1回のループで1%の進捗があります. 

```python
# coding: utf-8
from tqdm import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(1)
#100%|██████████| 100/100 [01:40<00:00,  1.00s/it]
```
range()関数以外にもリストや文字列を渡すことができます. 

```python
# coding: utf-8
from tqdm import tqdm
import time

for i in tqdm([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]):
    time.sleep(1)
#100%|██████████| 10/10 [00:10<00:00,  1.00s/it]
```
```python
# coding: utf-8
from tqdm import tqdm
import time

for i in tqdm('Time is money!'):
    time.sleep(1)
#100%|██████████| 14/14 [00:14<00:00,  1.00s/it]
```
#update
update()を使うことで, 自分で進捗率を設定することができます. 
まず, 合計値(total)を設定します. そしてupdate()で進捗を設定します. 
下のコードでは, 合計値を1000, 1回のループの進捗を10に設定しています. 

```python
# coding: utf-8
from tqdm import tqdm
import time

# 合計値(total)を設定
bar = tqdm(total = 1000)
for i in range(100):
    # 進捗を設定
    bar.update(10)
    time.sleep(1)
#100%|██████████| 1000/1000 [01:39<00:00,  9.96it/s]
```
#説明文を加える
set_description()を用いることで, 説明文を設定できることができます. 

```python
# coding: utf-8
from tqdm import tqdm
import time

# 合計値(total)を設定
bar = tqdm(total = 1000)
# 説明文を追加
bar.set_description('Progress rate')
for i in range(100):
    # 進捗を設定
    bar.update(10)
    time.sleep(1)
#Progress rate: 100%|██████████| 1000/1000 [01:39<00:00,  9.98it/s]
```
Semantic UI 苦労したとこメモ

# Grid
## wide column

Grid の中で N wide column と幅を変えた div を設置できる (https://semantic-ui.com/collections/grid.html#columns) が、これは常に 16分割 (正確には、設定した 分割数、default は 16) を基準とした数の N 倍となる

以下、分割数が default の16のままの場合の例を示す

```html
<div class="ui grid">
  <div class="column"></div><!-- 1/16 サイズ -->
  <div class="column"></div><!-- 1/16 サイズ -->
  <div class="two wide column"></div><!-- 2/16 サイズ -->
  <div class="four wide column"></div><!-- 4/16 サイズ -->

  <div class="eight wide column"></div><!-- 8/16 サイズ -->
</div>
```

`eight column grid` のように column 数（Mとする）を変えたときに、たとえば `two wide column` としても、分母は M にならず、16　である

```html
<div class="ui eight column grid">
  <div class="column"></div><!-- 1/8 サイズ -->
  <div class="column"></div><!-- 1/8 サイズ -->
  <div class="two wide column"></div><!-- 2/16 サイズ -->
  <div class="four wide column"></div><!-- 4/16 サイズ -->
</div>
```

`eight column row` のように column 数を変えた row を作っても同じ

```html
<div class="ui grid">
  <div class="eight column row">
    <div class="column"></div><!-- 1/8 サイズ -->
    <div class="column"></div><!-- 1/8 サイズ -->
    <div class="two wide column"></div><!-- 2/16 サイズ -->
    <div class="four wide column"></div><!-- 4/16 サイズ -->
  </div>
</div>
```

仕方ないので 16 を基準にして倍数を設定した。なお、M column 時に 1/16 のサイズを作るには `one wide column` とする

```html
<div class="ui eight column grid">
  <div class="column"></div><!-- 1/8 サイズ -->
  <div class="column"></div><!-- 1/8 サイズ -->
  <div class="two wide column"></div><!-- 2/16 サイズ -->
  <div class="four wide column"></div><!-- 4/16 サイズ -->

  <div class="one wide column"></div><!-- 1/16 サイズ -->

  <div class="five wide column"></div><!-- 5/16 サイズ -->
</div>
```


（間違ってたらコメントお願いします）
AWS Cloud9でLaravelの環境構築をする時にやったこと

# これは何？

Laravelはおろか、PHPすら触ったことが無いし、何ならAWS Cloud9も初めて使う著者が、試行錯誤した時のメモです。

# 環境

- Windows 10 Home
- AWS Cloud9
  - t2.micro
  - Cloud9Default-2019-04-26T15-18 (ami-01e86b109a9e95f06)
- PHP 7.3.4
- Laravel
  - Installer 2.0.1
  - Framework 5.8.14

# やったこと

## とりあえずPHP環境を整える

AWS公式にうってつけな感じのガイドがあったので、試します。
[AWS Cloud9 の PHP サンプル](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-php.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159718/8d7197b1-7d4b-68ef-032c-c4ceab581f6e.png)

ちなみにCloud9の見た目はこんな感じ。大したことはしてないが、見た目は非常にCOOLですね。
PHPのバージョンがデフォルトだと5.6系で古いので、7系まで上げておきましょう。
以下のコマンドで、php7.3をデフォルトにします。
(php7系は自分で入れる必要があるかも。色々いじったので元から入っていたのか分からなくなった…。)

```
sudo alternatives --set php /usr/bin/php-7.3
```

ステップ4でComposerのインストールを行うので、そこまで進めます。
`$HOME/environment`下ではなく、`$HOME`直下でインストールしました。

## Laravelを入れる

[公式](https://laravel.com/docs/5.8)を参考に、Composerを使ってLaravelをインストールします。
※Laravelで検索すると出てくる[日本語版(?)](https://readouble.com/laravel/4.2/ja/quick.html)はバージョンが古い気がするので注意した方が良いかも。

以下のコマンドを`envirionment`下で実行(そうしないとIDEから見えない)して、blogというプロジェクトを作ります。

```
laravel new blog
```

## サーバを立ててみる

以下でサーバが上がるはずなんですが、色々ハマりました。

```
php blog/artisan serve --port=8080
```

以下解決までにやったこと色々です。

- `$HOME/vendor`ディレクトリを、まるっと`$HOME/environment/blog`下にコピーする。
  - bootstrapと同じ階層に必要

- `mbstring`がmissingと言われるので、yumで入れる。
  - `php -m`で見てみると、確かにmbstringが無い。
  - 以下のコマンドを実行

```
sudo yum list | grep mbstring
sudo yum install php73-mbstring.x86_64
```

- php.iniの設定を書き換え、mbstringを使うようにする。(不要かも？)
  - [こちら](https://nackeymama.biz/?p=1049)を参考に。 
  - php.iniの場所は、`php -r "echo phpinfo();" | grep "php.ini"`で確認可能ですが、たぶん`/etc/php.ini`にある。

- 起動時のportは8080～8082にする必要がある。
  - AWS Cloud9の制約。
  - https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/troubleshooting.html#troubleshooting-app-preview

- encryption keyが特定されていないエラーで、ターミナルからcurlすると、500 Server Errorになる。
  - 以下のように怒られる。
  - logは`storage/logs`配下に作られる。

```
[2019-04-30 09:21:07] production.ERROR: No application encryption key has been specified. {"exception":"[object] (RuntimeException(code: 0): No application encryption key has been specified. at /home/ec2-user/environment/blog/vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php:44)
``` 

[こちら](https://www.kabanoki.net/2524/)に書かれている通り、以下のコマンドを実行。

```
cp .env.example .env
php artisan key:generate
php artisan config:clear
```
※ちゃんと`.env.example`はありました。隠しファイルなのでIDEからは見えませんでしたが。

これで、`Preview`→`Preview Running Application`として、どうにかデモ画面が起動。
(コンソールのURLから`Open in Preview`とした場合はうまく開かず。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159718/e54aa111-a85a-1d4c-32b4-e6bd38823de6.png)

なお、IDEから開く限りでは、AWS Cloud9を動かしているEC2インスタンスのセキュリティグループはいじらなくて問題なかったです。

# 雑なまとめ

環境構築で疲れたので今日はここまでです。
(まとめですらない)
Qiitadon > 令和最初のTootはもらった

```txt:動作環境
Ubuntu 18.04 LTs
Jupyter Notebook v5.7.8 
(Python 3.6.7 (default, Oct 22 2018, 11:32:17) )
```
### 概要

- Qiitadon令和最初のToot


### 関連

- [Qiitadon (Mastodon) > create_app()のto_fileで保存されるclient_id.txtの中身 | AnyPointSystem始めました](https://qiita.com/7of9/items/f8deafc9c301d9e01e2b)
- [AnyPointSystem (powered by Qiitadon) > 2019-04-27 システム設計](https://qiita.com/7of9/items/45aba268f6358541080c)

### 前準備

0. Mastodon.pyのセットアップ
1. アプリの登録 (Qiitadonの開発にて登録「AnyPointSystem」）
2. client_id.txtの生成 (client_idとclient_secret: 手順2の登録情報から)
3. access_token.txtの生成 (手順2の登録情報から)



### 実装


```py
import datetime
import time
import sys
from mastodon import Mastodon


def toot(atxt, mastodon):
    print(atxt)
    mastodon.toot(atxt)
    #print(datetime.datetime.now())    

# SET start time
start_time = [ 
    datetime.time(18,36,0),
    datetime.time(18,36,3),
    datetime.time(18,36,6),
]
words = [
    'toot1',
    'toot2',
    'toot3',
]

url = "https://qiitadon.com"
cid_file = 'client_id.txt'
token_file = 'access_token.txt'

mastodon = Mastodon(
    client_id=cid_file,
    access_token=token_file,
    api_base_url=url
)

for idx, atime in enumerate(start_time):
    while True:
        start_str = atime.strftime("%H:%M:%S")
        now_time = datetime.datetime.now()
        if start_str == now_time.strftime("%H:%M:%S"):
            toot(words[idx], mastodon)
            time.sleep(1)
            break
        time.sleep(0.1)  # [sec]

print("end")
```

### 動作

指定の時刻にTootされます。


### 後日談
(追記: 2019-05-01)

令和最初のTootは
@mafumafuultu さんに奪取されたようです。

https://qiitadon.com/@mafumafuultu/102015723333116028

https://qiitadon.com/@7of9/102015727051846893
https://qiitadon.com/@7of9/102015727702782747
Access VBA学習

■勉強の目的
・システム間連携のプログラムの単体検証をより容易にするため

■利用したもの
・Access VBAのサイト
　http://accessvba.pc-users.net/object/collection.html

■理解録
4/30
 ・モジュール、クラス、オブジェクト、インスタンス という概念が一通りあり、対象にテーブルをとれるというところが特徴的なところなのだろう
 ・メソッドはオブジェクトに対して特定のふるまいをとるようだ
 ・SUB、FUNCTION、PROPERTY プロシージャという概念があり、呼び出せるスコープを決めることができる
 ・クエリには、選択クエリと、アクションクエリがあり、アクションクエリには、テーブル作成、追加、更新、削除がある。
 ・詳細はよくわからんが、DAOとADOがあり、それぞれ速度などに特徴がある
インフラの勉強前に押さえておきたい最低限の基礎知識④〜インターネット層について〜

## 概要
前回の記事の続き
インターネット層について簡単にまとめて行きます

## 対象
インフラ勉強始めたいけど何からやったらいいのかよくわからない人向け

##インターネット層の働きとは
コンピューターから他のコンピューターまでデータを届けるための働きに関する部分。IPアドレスを用いてその機能を提供している。

##IPアドレスを用いて通信する仕組み
####ルーターとは何か
データを送信する働きを持つ機械。ネットワーク同士を繋げ、宛先までの経路を検索したりする。
ルーターが宛先までの経路を検索することをルーティングと呼ぶ。

####IPv4とは
２進数で表した文字列を8ビットの毎に「.（ドット）」で区切り、10進数表記で表します。区切ったそれぞれの値は0～255まであります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281917/f5df984d-7f32-7b63-f5b0-00aa5658df72.png)
>wikipediaより引用

####IPv4のヘッダーの構造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281917/46166309-7624-1b98-553a-d58c9d0d5dd1.png)
>https://www.itbook.info/study/p89.htmlより引用

パケットのIPアドレスにはには上記のような情報が付加されて使用される。
ポケットには生存期間があり、それをこれると消滅させられる。

####IPv6とは
IPv4ではIPアドレスが枯渇することが予想されてきたため、合計１２８ビットのIPv6が発明されました。IPv４と互換性はないので、今は移行が進められている段階です。



####IPv6のヘッダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281917/97d893ba-87cd-7003-9c32-e67cf41c8c33.png)
>引用　https://docs.oracle.com/cd/E19683-01/816-6184/6mc9cfmgc/index.html

ホップ制限→データのながさ
ホップリミット→生存期間

####IPアドレスの部分による違い
IPアドレスはネットワーク部とホスト部の二つで構成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281917/85701809-410c-0033-49b9-c7cf09ef32de.png)
>引用：https://www.atmarkit.co.jp/ait/articles/0212/06/news002_2.html

ネットワークアドレス部の長さは、可変長でありホストアドレスの長さももそれに従って変化します。
その仕組みをサブネットマスクと言います。

####プライベートIPとは
ルーターがそのルーターに接続されている機器を区別するためのもの。

グローバルIPが割り当てられるのは、基本的にルーター単位です。

グローバルIPが割り当てられるルーター単位でインターネットネットワークでは通信が行われ、その先の機器へは直接機器に接続されているルーターが通信します。

ルーターに接続している機器の通信は、ルーターが割り当てるプライベートIPを使って区別します。

ルーターに接続されている機器には全てプライベートIPが割り当てられているので、通信がごちゃごちゃにならずにすんでいるのです。


##ルーティングについて

####ASとは何か
ルーターなどのプロバイダが集合して構成されているネットワーク

####ルーターは複数のIPアドレスをもつ
そのまんま。ASのようなネットワークに複数所属するため、それぞれ別のIPアドレスを割り当てられる。

####ルーティングテーブルとは
そのルーターに隣接するルーターのIPの情報が保存されているテーブル。各ルーターに存在する。
ルーティングテーブルは基本的に動的に自動で設定される。また、デフォルトルートを設定することで宛先が見つからない場合のリクエストの送り先を設定できる。

####動的ルーティングのプロトコル
距離ベクトル型・リンク状態型

距離ベクトル型・・・途中に存在するルーターの数が少ない経路を計算する。
リンク状態型・・・接続されているルーター同士の状態を保存しておき、適宜最適な経路を計算する。

####OSPFとは何か
AS内部で使用されるプロトコル（Open Shortest Path Firstの略）
リンク状態型であり、定期的に接続状況を交換しあってそのAS内部の接続状況をそれぞれのルーターで保存しておく。

####BGPとは何か
ASとASの接続で使用されるプロトコル（Border Gateway Protocol）
距離ベクトル型のプロトコル。途中のASまでにどこを経由するのかも記録して経路表をそれぞれ作成している。

####ICPMメッセージとは何か
データ転送中のトラブルの通知などで使用されるプロトコル。
ルーターの通信でトラブルが生じたときにICPMメッセージを送信する。
[STM32メモ] スタックポインタの設定

マイコン上でCプログラムを動かせるようにするためには色々な設定が必要だが、最近は自動生成コードに大体のことが書かれている。ただ、スタックポインタの設定が見当たらなかったのが気になったので調べてみた。

#スタックポインタの設定
STM32では、起動後 CPUが0x0000 0000の値をスタックポインタ(R13レジスタ)に格納する。
0x0000 0000から始まる領域には、リセットまたはリセット解除後またはスタンバイからの復帰後のBOOT0,1ピンの設定でMain Flash, SRAM, システムメモリ(出荷時にブートローダが書かれている)のいずれかがマップされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/ce2dceb8-b508-ca1f-ab8a-94bcae6314a8.png)

スタックポインタのアドレスは、STM32Cubeで自動生成されるstartup_stm32*.s内のベクタテーブルの先頭__initial_spで設定されている。

```:stm32f072xb.s
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
Stack_Size		EQU     0x400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp                   ; Top of Stack
                DCD     Reset_Handler                  ; Reset Handler
                DCD     NMI_Handler                    ; NMI Handler
                DCD     HardFault_Handler              ; Hard Fault Handler
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
```

マイコンによっては明示的にSPを設定する必要があるが、STM32ではCPUが勝手にやってくれることが分かった。

#参考
* [RM0091: STM32F0x1/STM32F0x2/STM32F0x8 advanced ARM®-based 32-bit MCUs](https://www.stmcu.jp/design/document/reference_manual/51371/)
* [AN2606: STM32 マイクロコントローラ システム・メモリ・ブート・モード](https://www.stmcu.jp/design/document/application_note/51328/)
Macでbash-completionを有効化する方法

もしあなたが普段多くのサーバーにログインしている場合、sshログインする際のホスト名の自動補完ツールとしてbash-completionが有用である。

例えばMac環境では以下のコマンドでbash-completionをインストール・有効化できる。

```
mac@xxxxxx:~$ brew install bash-completion
mac@xxxxxx:~$ vi ~/.bash_profile
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
```
typelessでReduxチュートリアルのTodoListを作ってみた


↓の記事で[typeless](https://typeless.js.org/)というツールキットを知ったので、typelessを使って、[ReduxチュートリアルのTodoList](https://redux.js.org/basics/basic-tutorial)を作ってみました。

- [typelessというReact向け状態管理ライブラリがめっちゃいい - Qiita](https://qiita.com/sisisin/items/1ee2c798309da614c648)

# ソースコード

- [training-typeless/todos at cf138ab3b6d264e5fd7c6fab6d0e7cf01a7f5be8 · yskoht/training-typeless](https://github.com/yskoht/training-typeless/tree/cf138ab3b6d264e5fd7c6fab6d0e7cf01a7f5be8/todos)


# メモ

## redux-devtools-extension

```tsx
// src/index.tsx

import React from 'react';
import ReactDOM from 'react-dom';
import { RootEpic, RootReducer, TypelessProvider } from 'typeless';
import { createStore } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import { App } from './components/App';

const rootEpic = new RootEpic();
const rootReducer = new RootReducer();
const store = (() => {
  if (process.env.NODE_ENV === 'production') {
    return createStore(rootReducer.getReducer());
  }
  return createStore(rootReducer.getReducer(), composeWithDevTools());
})();

ReactDOM.render(
  <TypelessProvider rootEpic={rootEpic} rootReducer={rootReducer} store={store}>
    <App />
  </TypelessProvider>,
  document.getElementById('app')
);
```

[redux-devtools-extension](https://github.com/zalmoxisus/redux-devtools-extension)を使えるようにします。

## stateが初期化されるタイミング

素のReduxだと`@@INIT`のタイミングで初期状態がstateの中に保存されています↓

![スクリーンショット 2019-04-30 17.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223255/c712adc9-9cdf-67e2-de84-a79c4a76a580.png)

typelessでは`useModule`が呼ばれたタイミングで`@@typeless/added`がdispatchされて初期状態が保存されます↓

![スクリーンショット 2019-04-30 17.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223255/99e66ca0-585d-5985-1bcb-4956c5f335e6.png)

`VisibleTodoList`の中では`todos`と`visibilityFilter`の両方の状態を使うので、
[typelessのクイックスタート](https://typeless.js.org/introduction/quick-start)にあるように`useModule`してコンポーネントを返す、というのができませんでした。なので`useModule`とコンポーネントを別々に呼び出しています。（ここうまく書く方法がわからない…）

```tsx
// components/App.tsx

import React from 'react';
import {
  useTodoListModule,
  AddTodoComponent,
  VisibleTodoListComponent
} from '../features/todoList/module';
import { useFooterModule, FooterComponent } from '../features/footer/module';

export function App() {
  useTodoListModule();  // <- useModuleのみ
  useFooterModule();    // <- useModuleのみ

  return (
    <>
      <AddTodoComponent />
      <VisibleTodoListComponent />
      <FooterComponent />
    </>
  );
}
```
【AWS】APIGateway・Lambda動作の流れをわかりやすく解説

## はじめに
API Gateway・Lambda(Python)環境構築にあたり、
わからないことをしらみ潰しに調べたので、
そのメモを公開します。

まず、前提として以下の記事を参考に作ってみて下さい
[【API Gateway】AWS Lambda統合のPythonでHello, world](https://qiita.com/baikichiz/items/2de7c4c0dcf9b051037a)

## 動作の流れ
クライアント→API Gateway→Lambdaの順で呼び出される
※GET、POST、PUT、PATCH、DELETEなどに対応している
![Untitled Diagram-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/e79afca2-2177-0ce1-ff9d-3b35d1332eb4.png)



## API Gateway
>AWS または他のウェブサービス、AWS クラウドに保存されているデータにアクセスする API を作成できます。

要はクライアントから見たエンドポイントになってくれるサービス
完全マネージド型サービスのため、サーバレスアーキテクチャとして使用できます。
また、API Gatewayから呼び出すサービスの選択肢は以下があります。

1.Lambda
⎻ AWSのLambdaファンクションの呼び出し
2.HTTP
⎻ EC2上で構築したWebAPIや外部のWebサービスの呼び出し
3.Mock
⎻ バックエンドが未実装などの場合に、API Gatewayから直接固定的なレスポンスを返すことが可能
4.AWS Service
⎻ 各AWSのサービスの呼び出し
⎻ Lambdaファンクションを**非同期**で呼び出す場合などに利用

### 細かい動作内容
API GatewayへのアクセスはHTTPSが使用される
受け取り後の処理順序はメソッドリクエスト→統合リクエスト→Lambdaの順に処理され、
Lambda→統合レスポンス→メソッドレスポンスの順に返却処理が行われる。

・API Gatewayのマネジメントコンソール
![apiGatewayConsole.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/605575f6-a0d3-907e-e8fe-b692e15b3dad.jpeg)




### メソッドリクエスト
受け取った内容(GETリクエストならパスパラメータ、POSTならbody本文に記載される)の認証・入力チェックを行う
※チェック不要の場合、デフォルトのままでOK

####認証
呼び出し元の制限を行いたい場合設定
IAMや呼び出し元IPアドレスの制限、CORSなどがある
※外部公開のWebページ上のスクリプトからの呼び出しを想定したAPIの場合、
CORSを使用し、呼び出し元オリジンを検証する

####入力チェック
各パラメータの必須チェックがしたい場合に設定
例えばGETリクエストの場合

https://ドメイン名/dev/apiName
というAPIアクセスポイントを作成し、nameというパスパラメータを必須にした場合

https://ドメイン名/dev/apiName?name=dog
は200のステータスを返し、
https://ドメイン名/dev/apiName?id=001
は400(形式不正)のステータスを返すように設定可能


###統合リクエスト
呼び出し先へのパラメータ設定を行う

lambdaを利用する場合
マッピングテンプレートを利用しJSON形式のデータを渡す

```ruby:設定例
{ 
   "dogName": "$input.params('name')" 
}
```

$input変数は、API Gatewayへのパラメータに対する取得などの関数を提供する変数
上記例はGETリクエストの"name"パスパラムの値を"dogName"というキーとしてJSONに定義している。
※その他のメソッドが知りたい場合は、公式ドキュメント参照
[API Gateway マッピングテンプレートとアクセスのログ記録の変数リファレンス](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
※文字列のチェックやエンコード・デコードは$util変数のメソッドを使用可

## Lambda
>AWS Lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。

自分はコードを書いてアップするだけで、良い感じにしてくれるサービス(しゅごい！)
サーバー用意して、環境構築して、、、みたいなことが一切不要になる

### 特に説明することがないため、コードサンプルの解説

以下のソースは呼び出しが行われたら、何もせず

```ruby:設定例
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': {
                    "message": event["dogName"],
                    "data":json.dumps('Hello from Lambda!')
                }
    }
```

eventの中にAPIGatewayで設定した値がマッピングされているため、
今回の例は上記マッピングテンプレートで設定した"dogName”を取得している。

#### json.dumpsとは
Pythonの関数の一つ
デフォルトはUnicodeでエンコードするため、文字化けする場合は、
json.dumps(dict, indent=2, ensure_ascii=False)と記載する
[参考：Pythonでjson dumpsを使いこなそう！](https://www.sejuku.net/blog/79338)

#### event変数について
呼び出し元のイベント情報(APIGatewayやDynamoDb)が格納されている
APIGatewayの場合は、統合リクエストで設定した値が入る
[参考：Python の AWS Lambda Context オブジェクト](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context-object.html)

#### context変数について
>呼び出し、関数、および実行関数に関する情報を示すメソッドおよびプロパティを提供します。

要約すると、実行環境に関する値がたくさん入っている。(あんまり使う場面ないかなー)

##まとめ
APIGatewayとLambdaを使えば、自分の考えたAPIがフルマネージドで提供できる
(しかも1年間無料!!)
nodebrew install-binary latestを実行したときにFailed to create the fileが発生する場合

nodebrewのインストール後に最新版のnode.jsとmpnをインストールしようとしたときのエラー対応の備忘録です。

# 環境
macOS High Sierra(10.3.6)
nodebrew 1.0.1

# 実行コマンド
- brew install nodebrew

```
hogePC:~ hoge$ brew install nodebrew
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
〜〜〜中略〜〜〜
==> Summary
🍺  /usr/local/Cellar/nodebrew/1.0.1: 8 files, 38.6KB, built in 6 seconds
```

- nodebrew -v

```
hogePC:~ hoge$ nodebrew -v
nodebrew 1.0.1
```

nodebrewのインストールは成功したようです。

- nodebrew install-binary latest

```
hogePC:~ hoge$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v12.1.0/node-v12.1.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/hoge/.nodebrew/src/v12.1.0/node-v12.1.0-darwin-x64.tar.gz: No 
Warning: such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 1058)
download failed: https://nodejs.org/dist/v12.1.0/node-v12.1.0-darwin-x64.tar.gz

```

うーん、node.jsとnpmのインストールに失敗してますね。

# 原因と解決

brew install nodebrew を実行したときのメッセージを再度読んでみると以下のような記述がありました。

```
You need to manually run setup_dirs to create directories required by nodebrew:
  /usr/local/opt/nodebrew/bin/nodebrew setup_dirs

Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH
```

手動でnodebrew setup_dirsを実行してね。との記載がありました。
なので、以下のコマンドを実行しました。

```
hogePC:~ hoge$ cd /usr/local/opt/nodebrew/bin/
hogePC:bin hoge$ nodebrew setup_dirs
```

再度、nodebrew install-binary latestを実行。

```
hogePC:~ hoge$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v12.1.0/node-v12.1.0-darwin-x64.tar.gz
〜〜〜中略〜〜〜〜
######## 100.0%
Installed successfully
```

無事、インストール完了！
django-debug-toolbarを設定する

# 概要
こんにちは、すずです。
今回はrunserverを起動しながらエラーを迅速に対処するためのツールをご紹介いたします!(^^)!

それでは実際に使っていきましょう！
# 環境
> Pytho3.7.2  
> Django2.1.7  
> django-debug-toolbar1.11


# やり方
まずはdjango-debug-toolbarをインストールしましょう↓↓  
`$ pip install django-debug-toolbar`

これで自身の環境にdjango-debug-toolbarを入れることができました！
次はsettings.pyにアプリ使用の設定をしましょう(^^)/  
### settings.py
```python
# mysite/mysite/settings.py
# settings.pyの一番下に付け足しましょう

・・・・
・・・・・・・

if DEBUG:
    def show_toolbar(request):
        return True


    INSTALLED_APPS += (
        'debug_toolbar',
    )
    MIDDLEWARE += (
        'debug_toolbar.middleware.DebugToolbarMiddleware',
    )
    # ここで表示する内容を設定できます↓↓基本的にはこれでok
    DEBUG_TOOLBAR_CONFIG = {
        'SHOW_TOOLBAR_CALLBACK': show_toolbar,
    }

```

if文を使ってDEBUGがTrueだった場合、設定を後付けするようにしております。  
次にurls.pyの設定をしていきます  
### urls.py

```python
# mysite/mysite/urls.py
# urls.pyの一番下に付け足しましょう

・・・・・
・・・・・・・

if settings.DEBUG:
    import debug_toolbar

    urlpatterns += [
        path('__debug__/', include(debug_toolbar.urls)),
    ]
```


# まとめ
今回はデバックツールの紹介でしたが、
このdjango-debug-toolbarはDjango使う上で必須のツールだと思います。 


また実用編としては前に記事にもさせていただいた  

>[Djangoでsettings.pyを上書きする方法](https://s2notc2.hatenablog.com/entry/2019/04/25/145513)

と併用して使用することをお勧めします！
プロジェクトごとに何度も書くのはめんどくさいですからねｗ  

この記事の詳しい内容はブログに書いてありますので見てみてください
またTwitterではこんな感じなお役立ち情報を流してますので是非覗いてみてください↓↓  

>[webアプリが世に出ていくまでのブログ](https://s2notc2.hatenablog.com/)
[Twitter すず(@S2notC2)](https://twitter.com/S2notC2:embed:cite)


# 参考資料
>[django-debug-toolbarを設定する](https://s2notc2.hatenablog.com/entry/2019/04/29/162849?_ga=2.140302131.1670472886.1556515734-627501173.1547535733)
MacBookのクリックが反応しないときはMagicMouseを切る

#経緯
MacBookProを購入した直後から、左クリックだけが反応しなくなる症状が多発した。
調べてみると出てくる情報としては、

* [SMCのリセット](https://support.apple.com/ja-jp/HT201295)
* [PRAMのリセット](https://support.apple.com/ja-jp/HT204063)

で治ると書いてある記事がたくさん出てくる。

実際、SMCのリセットを行うとしばらくはクリックができるので、単によくある不具合だと考え、一年間どうにか誤魔化してきた。

しかし、先ほどSMCリセットやセーフブートを何度行ってもクリックができない状況に陥ってしまった。

#解決策
必死になって関連記事を探すが、解決策が見つからない。
「もう修理に出すしかないか...」と思い始めたとき[こんな記事](http://wordpress.ideacompo.com/?p=9783)を見つけた。

>思いもよらぬ解決方法
>TrackPadの電源を切ることで、元の状態に戻ることができました

ん？確かにTrackPadは持ってないけど、MagicMouseはバッグの中に入ってたはず...
ダメもとでMagicMouseの電源を切ってみるとなんとクリックできる！！！

#まとめ
同じ症状に苦しめられている方のお役に立てると嬉しいです。
もっと早くに気づきたかった。
KerasでBatchNormalization層を転移学習をする際の注意点

- Keras 2.2.4
- 以下の記事を要約したもの
    - [The Batch Normalization layer of Keras is broken](https://blog.datumbox.com/the-batch-normalization-layer-of-keras-is-broken/)


# 概要

ResNetのようなBatchNormalization層を含んだ学習済みモデルを元に転移学習するときに、とある`Keras`のバグに行き当たることがある。その内容と対策をまとめた。

# 再現条件

学習済みモデルに含まれるBN層をフリーズ（`layer.trainable = False`）させた上で転移学習を行うときに発生する。

# 現象

正しく学習・予測ができない。

特にエラーやWarning等が発生するわけではなく、学習がうまく収束しない、なかなか予測の精度が上がらない、といった現象が発生する。

# 原因

BN層では学習時、予測時に次のような処理を行う。

- 学習時
    - 各アクティベーションの平均・分散（ミニバッチ移動平均・分散）で出力値を正規化し、さらに係数$\beta$、$\gamma$で１次変換する
- 予測時
    - 学習時に用いた各アクティベーション平均・分散の値と、学習した$\beta$、$\gamma$の値で同じ処理を行う

詳細はググるなりして調べて欲しい。要は学習時にはミニバッチ統計量を使ってゴニョゴニョし、予測時には（ミニバッチなど存在しないので）学習時に使っていたミニバッチ統計量をそのまま用いてやはりゴニョゴニョする。

このBN層をフリーズさせて転移学習するために、期待する動作と実際の動作を以下の表にまとめた。

||期待する`Keras`の動作|実際の`Keras`の動作|
|---|---|---|
|**学習フェーズ**|転移元のデータセットのミニバッチ統計量を使う|*転移先*のデータセットのミニバッチ統計量を使う|
|**予測フェーズ**|転移元のデータセットのミニバッチ統計量を使う|転移元のデータセットのミニバッチ統計量を使う|

上記の表の通り、**フリーズさせているにも関わらず、学習時に転移先のデータセットのミニバッチ統計量を使ってしまう**のが原因となる。

# 回避方法

２つある。

## 回避方法１：パッチを当てる

[元の記事](https://blog.datumbox.com/the-batch-normalization-layer-of-keras-is-broken/)の筆者が[問題修正済みブランチ](https://github.com/datumbox/keras/tree/bugfix/trainable_bn)を公開している。こちらを使うのが一つ目の方法。

※[元記事](https://blog.datumbox.com/the-batch-normalization-layer-of-keras-is-broken/)の冒頭にもある通り、プルリクエストを投げているが、既存の動作を変更してしまうことになる、という理由からマージはされていないとのこと。

## 回避方法２：特徴量抽出だけ先に行う

学習データである画像と教師ラベルを用いて学習するのではなく、

```
image --> [Trained Model] --> [Your Model] --> supervised label
          <------------->     <---------->
              freeze             train
```

以下のように、まず学習データである画像から学習済みモデルを用いて特徴量抽出のみを行い、次に、抽出した特徴量と教師ラベルで学習を行う。

```
(i) 特徴量抽出
image --> [Trained Model] --> feature

(ii) 抽出した特徴量で学習
feature --> [Your Model] --> supervised label
```

これは計算量を節約する目的でよく用いられる方法であるが、それだけでなく、上述した`Keras`の謎の挙動を回避することもできる！

- 補足：なぜこれで回避できるの？
    - `Keras`は内部的に`learning phase`というフラグを持っている。`Model#train()`等の学習用のメソッドを実行する際には`learning phase`が`1`に設定され、`Model#predict()`等の予測用のメソッドの実行時には`learning phase`が`0`に設定される。
    - `learning phase`の値によってBN層の挙動が制御される。`1`であればミニバッチ統計量をデータセットから計算し、`0`であれば学習時のミニバッチ統計量を流用する。
    - そこで第１段階として`Model#prediction()`等で特徴量抽出だけを先にすることで、ミニバッチ統計量を元のデータセットから流用するように動作してくれる

# その他

この記事は要約したに過ぎないので、やはり[元の記事](https://blog.datumbox.com/the-batch-normalization-layer-of-keras-is-broken/)を読むことをオススメする。

また（なるべく記事更新でキャッチアップするつもりだが）最新のKerasで解決されているのかを確認した方が良い。
Nuxt & scssで、UA によってスタイルを適用し分ける方法

## 0. はじめに

- 「レスポンシブでイケそう、でもアプリとしては UA 分割する」ような場合有効そう
- 今回は Desktop or その他(= Mobile) で分岐させています

|package|version|
|:--|:--|
|nuxt|2.6.1|
|vue|2.6.10|
|nuxt-device-detect|1.1.4|

## 1. User Agent を判定する
https://github.com/dotneet/nuxt-device-detect
を利用しましたが、ここはなんでも大丈夫です。

グローバルの Mixin として、こんな感じに layout を分岐させると便利です。

```~/plugins/global-mixins.js
import Vue from 'vue'

Vue.mixin({
  layout({ app }) {
    return app.$device.isDesktop ? 'desktop' : 'mobile'
  }
})
```

### レイアウトコンポーネント

レイアウトコンポーネントがそれぞれ `#desktop` or `#mobile` を持っていることが重要です。
下記では 2レイアウト準備していますが、動的に出力しても問題ありません。

```~/layouts/desktop.vue
<template>
  <div id="desktop">
    <nuxt />
  </div>
</template>
```

```~/layouts/mobile.vue
<template>
  <div id="mobile">
    <nuxt />
  </div>
</template>
```


## 2. あとは scss でなんとかする

```scss:mixins.scss
@mixin desktop {
  #desktop & {
    @content;
  }
}

@mixin mobile {
  #mobile & {
    @content;
  }
}
```

もちろん SCSS 周りの設定もいくつか必要ですが、割愛します

参考:

- [@nuxtjs/style-resources](https://github.com/nuxt-community/style-resources-module)
- https://ja.nuxtjs.org/faq/pre-processors/


## 3. 使用例
```scss:~/components/TheFooter.vue
<template>
<script>
<style lang="scss" scoped>
.footer {
  color: red;

  @include desktop {
    color: green;
  }
}
</style>
```
祖先に `#desktop` や `#mobile` があれば適用するモノですね。
いつかレスポンシブになるかもしれない際、mixin 内を変更すれば、メディアクエリへの移行も比較的楽に出来そうです。

## Help wanted.
**Desktop 時に、Mobile 時の CSS を出力しない** ような方法はありませんか？ 下記のように。

```scss:HogeHoge.vue
<style scoped v-if="$device.isDesktop">
.hoge {
  width: 800px;
}
</style>

<style scoped v-else>
.hoge {
  width: 100%;
}
</style>
```
TwitterのDMのグループ会話にPOSTする方法

###教えてください

##これまでできてること
・Twitter APIを通じて個人宛にDMを送ること
・TweetDeckの該当のリクエストの中身をみて、該当のapiを正規のaccess_tokenとかで叩くとforbiddenであることを確認すること※

##公式ドキュメントに乗っているDMのエンドポイント
https://api.twitter.com/1.1/dm/new.json/1.1/direct_messages/events/new.json

```javascript:request_body
event: {
  type: "message_create",
  message_create: {
    target: { recipient_id: 1111111 },
    message_data: { text: text }
  }
}
```

追記　recipient_idにおそらくグループ会話ごとに設定されているconversation_idなるものを設定してもforbiddenになった
recipient_idの代わりにconversation_idとして、"11111-22222"みたいな、相手と自分のidを付与すると普通に送れた
なぜgroup会話はだめなんだーーーーーー

##forbiddenになったTweetDeckのエンドポイント※
https://api.twitter.com/1.1/dm/new.json
こちらは公式ドキュメント上に存在しないapiであった（私が確認する限り）

```javascript:request_body
{
  text: "test",
  ext: "altText",
  conversation_id: 1111111,
  cards_platform: "Web-13",
  include_entities: 1,
  include_user_entities: 1,
  include_cards: 1,
  send_error_codes: 1,
  tweet_mode: extended,
  include_ext_alt_text: true,
  include_reply_count: true
}
```

m(_ _)m
Talibで使えるローソク足ドキュメントまとめ

#Talibで使用できるローソク足の関数について
この記事はTalib内にあるローソク足分析に関する関数の中身のまとめになっています。
各トピックに分かれていますのでご覧ください。
また、資料の不備や違う点などありましたらコメントお願いします。

#その１ ローソクとは？
[ここから飛んで下さい](https://qiita.com/Mea/items/e0f091367e2ce32144c0)
#その２同じタイプのローソク線の羅列パターン
[ここから飛んで下さい](https://qiita.com/Miku_F/items/66f754e8cf285c9e3702)
#その3 同時線のパターン
[ここから飛んで下さい](https://qiita.com/17zuma_241/items/df71df9a5c5888aceb5d)
#その４ 収束するような形のパターン
[ここから飛んで下さい](https://qiita.com/17zuma_241/items/0516c254769e97b04b5e)
#その５その他
[ここから飛んで下さい](https://qiita.com/merry1221/items/84156872c30d19a51920)
#その６その他
[ここから飛んで下さい](https://qiita.com/k0miya/items/0153d238ed8ec3e710b5)
#その７その他
[ここから飛んで下さい](https://qiita.com/Mea/items/a6c9aee82ffb6feaf3f4)

#上記のパターンの頻出まとめ
[ここから飛んで下さい](https://qiita.com/Miku_F/items/7ca38f495f907159dfdf)
dockerで単体ファイルをマウントしたときに更新が反映されない問題の対策

ついに平成が終わりますね。

せっかくなので以前から書こうと思っていた小ネタを置いておきますね。

# 問題遭遇

ある日、dockerを使って作業をしていると「単体ファイルをマウントしたとき、ホスト上（マウント元）のファイルを更新してもコンテナ内（マウント先）に反映されていない」ことに気づきました。これまでも同様の作業を行ったことはあるのですが、その際にはそのような現象は見られなかったのにです。

そのときは深く考えずにディレクトリマウントに変更して問題を回避して作業を続けたのですが、後日同じ問題に遭遇したので再度詳しく調査してみました。
その際に Stack Overflow では幾つか記事（[ここ](https://stackoverflow.com/questions/42557299/sharing-a-single-file-from-host-machine-with-docker-container-and-having-the-con)とか[ここ](https://stackoverflow.com/questions/53547973/files-within-docker-bind-mount-directory-not-updating)）も見つかるのですが、日本語ではパッと見無さそうだったので、調査した結果と対策をまとめてみます。

# 原因

docker 自体はシングルファイルのバインドマウントの更新をコンテナに反映します。[公式のドキュメント](https://docs.docker.com/storage/bind-mounts/)でも特にこれについての制限は記載されていません。

今回の問題の原因はファイルの i-node にあります。シングルファイルをバインドマウントした場合、docker は対象ファイルの i-node を指してマウントします。このため、ホスト上のファイルの更新によって i-node が変更された場合、以降コンテナ内でその変更は反映されなくなるのです。

# 回避方法

根本原因は i-node ですので、i-node が変更されないようにすれば更新が反映されます。これを考慮にいれると問題を回避しつつ更新を反映する方法は以下の2つが考えられます。

* 編集対象のファイルを含むディレクトリをマウントする
* 編集時に i-node を変更しないようにする

以下、それぞれについて詳しく検討します。

### ファイルを含むディレクトリをマウントする

最初に問題に遭遇した際にとった方法です。安直な対処法ですが、また同じ問題を（別の人が）踏んで戸惑う可能性があるのであれば、こちらの方法をとって回避するほうが望ましい場合があるかもしれません。

### i-node を変更しないようにする

環境によって違いがあるのですが、自分がとった方法を列挙しておきます。

* 編集方法（例えば、エディタの保存方法）を変更する

エディタについて言えば、お使いのエディタのヘルプを参考にして i-node が変わらないような設定に変更してください。そのほかの場合も編集時に i-node が変わらない方法（例えばリダイレクトによる追加など）を取れば大丈夫です。

* ファイルパーミッションを変更する

本記事を書くために当該のページを探したところ見つからないのですが、Stack Overflow に記載があった方法を試してみたところ回避できたので記載しておきます。
その記事では、パーミッションが 644 のファイルをマウントしている場合にはこれを 664 に変更すると i-node が変更されなくなるためコンテナ内に変更が反映されるようになると書かれてありました。
確かに手元の Ubuntu 上での vim による編集では同様の挙動を示しており、実際に問題を回避できたのですが、このような挙動を取る詳しい理由までは調べきれていません。（ファイルシステムやエディタの設定によるようですが）


# まとめ

忘れた頃に遭遇してあれっ？と思うので、他にも同じ様に引っかかる人の助けになれば幸いです。
大雑把すぎるインデックスの説明

## 概要

- ここで言うインデックスとは、RDBMSのインデックスのことです。
- データベースが初めての方にも理解しやすいよう、できるだけ平易な言葉と身近な例えで表現してみました。

## インデックスとはなんぞや？

電話帳からある人の電話番号を探すとき、名前の50音順で整理されたものから探すのと、無秩序に並んだものから探すのでは、明らかに前者が速く目的の番号を見つけることができますよね。この「50音順に整理しておく」がインデックスに当たります。インデックスを作成することを、インデックスを「張る」とも言います。

## インデックスが使用されるには条件がある

先ほどの電話帳の例だと、名前が「さ」で始まる人を列挙する場合はインデックスが有効ですが、名前の途中や最後に「さ」が付く人を列挙する場合は、結局、全部を探さなければなりません。

- `kana LIKE 'さ%'` 速い :thumbsup:
- `kana LIKE '%さ%'` 遅い 
- `kana LIKE '%さ'` 遅い

## インデックスは張りすぎてもダメ

あなたが電話帳を管理する係だとします。名前の50音順だけでなく、電話番号順や、住所順でも探しやすくするため、それぞれにインデックスを用意しなければならなくなったら、新しい連絡先を追加する作業は確実に遅くなりますよね。
インデックス増やすほど、挿入、更新、削除の操作は遅くなります。

1年に1回しか更新されないテーブルなら、検索の速さを重視してたくさんインデックスを張る。5分に1回挿入があるようなテーブルなら、より注意深く、厳選してインデックスを張る。のようにバランスが大切ということになります。
Dockerでpyenv環境を構築

# 0. はじめに
## 0-1. やること
Dockerでpyenvを構築します。
(Dockerならpython側仮想化して環境管理しなくても良くない？という突っ込みは無しで)

## 0-2. 動作検証環境
``` shell-session
$ uname -a
Linux versapro-centos7 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ docker --version
Docker version 18.09.5, build e8ff056
```

# 1. 手順
## 1-1. Dockerfileの作成
``` shell-session
$ vim Dockerfile
```
``` Dockerfile:Dockerfile
FROM centos:centos7
ENV HOME /root
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/bin:$PATH
RUN yum update -y && \
    yum install -y gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git libffi-devel && \
    curl https://bootstrap.pypa.io/get-pip.py | python && \
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv && \
    echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```
## 1-2. Dockerfileのbuild
``` shell-session
$ docker build -t myimage:pyenv-20190430 .
（省略）
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
myimage             pyenv-20190430      b5d3ac72fbc0        About a minute ago   541MB
centos              centos7             9f38484d220f        6 weeks ago          202MB
```
## 1-3. コンテナの起動＆動作確認
``` shell-session
$ docker run -it -d myimage:pyenv-20190430 --name pyenv -v /hogehoge/work:/pyenv
$ docker exec -it pyenv /bin/bash
[root@a353872d7f4e /]# pyenv --version
pyenv 1.2.11-11-g7dd5014
[root@a353872d7f4e /]# pyenv install --list
（省略）
[root@a353872d7f4e /]# pyenv install anaconda3-2019.03
Downloading Anaconda3-2019.03-Linux-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-x86_64.sh
Installing Anaconda3-2019.03-Linux-x86_64...
Installed Anaconda3-2019.03-Linux-x86_64 to /root/.pyenv/versions/anaconda3-2019.03

[root@a353872d7f4e /]# pyenv versions
* system (set by /root/.pyenv/version)
  anaconda3-2019.03
[root@a353872d7f4e /]# mkdir -p /pyenv/anaconda3-2019.03
[root@a353872d7f4e /]# cd /pyenv/anaconda3-2019.03
[root@a353872d7f4e anaconda3-2019.03]# pyenv local anaconda3-2019.03
[root@a353872d7f4e anaconda3-2019.03]# python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
[root@a353872d7f4e anaconda3-2019.03]# cat .python-version
anaconda3-2019.03
[root@a353872d7f4e anaconda3-2019.03]#
```
# 2. 参考
Docker上のCentOS7にpyenvをインストールしてpythonを管理する
　https://daichan.club/linux/78292
Dockerfileを書いてみる
　https://qiita.com/nl0_blu/items/1de829288db2670276e8
PythonとJuliaをお気楽に併用する。

# お気楽併用法のヒントを3行で
- anacondaを入れる
- juliaをインストール
- 用いるancondaのバージョンを指定して、PyCallパッケージとCondaパッケージを入れる。

anacondaのところはminicondaでも良い。
conda系が嫌いな人は、普段使いのpythonを別にしても良いけれど、パッケージをjuliaとpythonとで共有したい場合、素直にcondaにpythonのバージョン管理を任せてしまった方が良い。

# 私がやったこと
以下、apt updateが使えないUbuntuでの作業例。
git/curl等が入っていること、前提。

## ①pyenv経由で、anaconda入れる
pyenv使うことで、何かあった時にanacondaから離れることも簡単にできる。

```sh
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install -l | grep ana
pyenv install anaconda3-2019.03
```
## ②juliaをインストール

```sh
curl https://julialang-s3.julialang.org/bin/linux/x64/1.0/julia-1.1.0-linux-x86_64.tar.gz
tar zxvf julia-1.1.0-linux-x86_64.tar.gz
echo 'export PATH="$PATH:/home/kmr/julia-1.1.0/bin"' >> ~/.bashrc
```
## ③用いるancondaのバージョンを指定して、PyCallパッケージとCondaパッケージを入れる。
ここは多少戸惑う可能性が高い。
Pythonとjuliaを併用する場合、PyCallパッケージとCondaパッケージについてある程度理解しておいた方が良いので、以下など参考にしてご自身で入れてみよう(私も多少試行錯誤した)。

http://heine98.hatenablog.com/entry/2018/10/13/095003
https://qiita.com/tenfu2tea/items/d2ac1427eaed7a548287

# 正しくCondaが使えるようになっているかの確認
pip経由で使いたいpythonライブラリを入れてからjuliaのREPLに入る。
Conda.list()で、目的のライブラリ(私の場合janome)を確認できればOK。

```julia
julia> using Conda

julia> Conda.list()
[ Info: Running `conda list` in root environment
WARNING: The conda.compat module is deprecated and will be removed in a future release.
# packages in environment at /home/kmr/.pyenv/versions/anaconda3-2019.03:
#
# Name                    Version                   Build  Channel
_ipyw_jlab_nb_ext_conf    0.1.0                    py37_0
alabaster                 0.7.12                   py37_0
anaconda                  2019.03                  py37_0
..(以下、ずらすらとanaconda経由のパッケージが出てくる)..
janome                    0.3.8                    pypi_0    pypi
....
```

#JuliaでJanome

```janome.jl
using PyCall

jt = pyimport("janome.tokenizer")
t = jt.Tokenizer()
doc ="""Juliaでjanomeの助けを借り、形態素解析界隈のハローワールド、
すもももももももものうちをしてみんと思う。"""

for tk in t.tokenize(doc)
    println("$(tk.surface) : $(tk.part_of_speech)")
end
```

> $ julia janome.jl
Julia : 名詞,一般,*,*
で : 助詞,格助詞,一般,*
janome : 名詞,一般,*,*
の : 助詞,連体化,*,*
助け : 名詞,一般,*,*
を : 助詞,格助詞,一般,*
借り : 動詞,自立,*,*
、 : 記号,読点,*,*
形態素 : 名詞,一般,*,*
解析 : 名詞,サ変接続,*,*
界隈 : 名詞,一般,*,*
の : 助詞,連体化,*,*
ハロー : 名詞,一般,*,*
ワールド : 名詞,一般,*,*
、 : 記号,読点,*,*
 : 記号,空白,*,*
すもも : 名詞,一般,*,*
も : 助詞,係助詞,*,*
もも : 名詞,一般,*,*
も : 助詞,係助詞,*,*
もも : 名詞,一般,*,*
の : 助詞,連体化,*,*
うち : 名詞,非自立,副詞可能,*
を : 助詞,格助詞,一般,*
し : 動詞,自立,*,*
て : 助詞,接続助詞,*,*
みん : 動詞,非自立,*,*
と : 助詞,格助詞,引用,*
思う : 動詞,自立,*,*
。 : 記号,句点,*,*
クロムブックで Raspberry Pi に ssh 接続

クロムブックにインストールした Linux から Raspberry Pi に接続してみました。

ping のインストール

```bash
sudo apt install iputils-ping
```

Avahi が使えなかったので IP を直接いれます。

1) ping で IP　アドレスを調べます。

```bash
ping -c 3 192.168.8.100
```

2) ssh で接続

```bash
ssh 192.168.8.100
```

Raspberry Pi 2台に接続している様子

![raspberry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/78573236-b8a1-5164-0b00-a65050afa115.png)
Alexaスキル開発 基礎トレーニングが済んだらテンプレートからスキル開発


[先日の投稿](https://qiita.com/toctoc0352/items/1224167f3581d8de7035)でAlexaスキル開発の基礎トレーニングを紹介させていただきました。

本日は基礎トレーニングを終えた後、テンプレートからAlexaスキル開発する方法について記載します。

# テンプレート

今回は音声ゲームを題材にしたテンプレートを紹介します。
以下に紹介するテンプレートはそれぞれ機能が実装されたサンプルになっていますが
手順の終盤にカスタマイズ方法が記載されているので、そこで自分のアイディアを形にできるかと思います。

* [クイズゲーム](https://github.com/alexa/skill-sample-nodejs-quiz-game/tree/ja-JP)
* [トリビアクイズゲーム](https://github.com/alexa/skill-sample-nodejs-trivia/tree/ja-JP)
* [アドベンチャーゲーム](https://github.com/alexa/interactive-adventure-game-tool)

# 私が選定したジャンル

私は上記テンプレートのアドベンチャーゲームを選定して、日本語版にリメイクしている最中です。

# 参考

[Alexa音声ゲーム](https://developer.amazon.com/ja/alexa-skills-kit/gaming)
Sassでプログラミング的な処理が出来る

SassはCSSの拡張子で、その特徴としてプログラミングのような処理が出来る。
いくつかまとめてみました。。。

##ネストが使える##
同じセレクタを何度も記入する必要がない。
セレクタの変更があった場合でも修正が容易。

*例：bodyセレクタにCSSの記述を行う場合...

```
:hello.rails
.block {
   background-color: #000;
  .title {
    color: #FFF;
    font-size: 70px;
    text-align: center;
  }
  .text {
    font-size: 15px;
    color: #FFF;
    span {
      color: red;
      font-size: 20px;
    }
  }
}
```
CSSだとblock.title、block.textと記述しなくてはいけないが、ネスト構造にすることでセレクタの記述が不要になる。
メリット：①セレクタ名が変更になっても修正が容易になる。
　　　　　②可読性が上がる。

##同じ値を繰り返し使える##
###変数###
**$変数名: 値;**と記述することで変数が使用出来る。

```
$main-color:#000;
section {
  background-color: $main-color;
}
```
###mixin###
プロパティやセレクタをひとまとめにして繰り返し使用できる。

```
@mixin mixin名() {}
```
｛｝の中にプロパティやセレクタを記述

```
@mixin clearfix() {
  &:after {
    content: '';
    display: block;
    clear: both;
  }
}
```
上記をインクルード（読み込み）をすることで記述内容を引っ張り出せる。

```
@include mixin名(); {}
```

```
.menu {
  @include clearfix();
  ...

  .menu__list {
    float: left;
    ...
  }
}
```
##複数のファイルをひとまとめに出来る##
ひとつのファイルにすべての記述をすると膨大な記述量になってしまい、管理が難しく、可読性も悪くなってしまうため、パーシャルを利用し、ファイルを分けて作成し、後からひとまとめにすることが出来る。
###パーシャル###
分割したSassファイルのこと。
ファイル名を```_（アンダースコア）```
パーシャルファイルの読み込みを```@import ファイル名```で行う。

```
_reset.scss
<!-- 上記の名前でファイル名を作成。下記の記述で呼び出す -->
 @import "body"; 
```
#GoogleChrome で正規表現でページ内検索をする

この拡張を利用。

[Chrome Regex Search - Chrome ウェブストア](https://chrome.google.com/webstore/detail/chrome-regex-search/bpelaihoicobbkgmhcbikncnpacdbknn)

60Wとか30Wとか、単位を探すときに便利かも。

![image](https://user-images.githubusercontent.com/13635059/56943363-21cfb580-6b5a-11e9-9ed6-3949e839dc77.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1551








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
固有値分解、特異値分解のメリット(機械学習の学習  #1)

# はじめに
機械学習の学習をはじめました。調べたこと学んだことを記録しています。

# 1.行列の種類と特徴
機械学習の学習で出会ったものをまとめます。学習が進めば編集する予定です。
![行列まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/797022ed-981c-977f-769d-4e2924b9425d.png)

# 2.固有値分解
## 2.1. 固有値と固有ベクトル
正方行列$A$、スカラ$\lambda$、0ベクトルでないベクトル$\vec{x}$に対して以下が成り立つとき、
$$
A\vec{x}=\lambda\vec{x}
$$
$\lambda$を行列$A$の**固有値**、$\vec{x}$を行列$A$の**固有ベクトル**といいます。
## 2.2. 固有値分解
正方行列$A$が固有値$\lambda$、固有ベクトル$\vec{v}$を持つとき、

```math
\begin{align}
A &=V\Lambda V^{-1} \\
\end{align}
\\
ただし、
\Lambda = \begin{pmatrix}
 \lambda_1 & & \\ 
  &\lambda_2 & \\ 
  & & \ddots 
 \end{pmatrix}
　　　
V = \begin{pmatrix}
 \vec{v_1} & \vec{v_2} & \cdots \\ 
 \end{pmatrix}
 ```
と変形することを**固有値分解**といいます。で、
$A=V\Lambda V^{-1}$は　正方行列＝正則行列・対角行列・正則行列　の形になります。
## 2.3. 固有値分解のメリット

- 行列の特徴が見えやすくなります。
- ゼロに近い固有値は行列全体に与える影響が小さいため、この固有値を無視すること（次元削減）で、高精度で近似計算できます。近似することで、計算コストが下げられたり、データ量が減らせたりします。
- $A^n$の計算がラク。

## 3.特異値分解
### 3.1.固有値分解に似せて説明してみる
正方行列$AA^T$が固有値$\sigma$、固有ベクトル$\vec{u}$を持つとき、

```math
AA^T=USS^TU^{-1} \\
\\
ただし、
S = \begin{pmatrix}
 \sigma_1 & & \\ 
  &\sigma_2 & \\ 
  & & \ddots 
 \end{pmatrix}
　　　
U = \begin{pmatrix}
 \vec{u_1} & \vec{u_2} & \cdots \\ 
 \end{pmatrix}
 ```
と変形できます。おなじく、
正方行列$A^TA$が固有値$\sigma$、固有ベクトル$\vec{v}$を持つとき、

```math
A^TA=VS^TSV^{-1} \\
\\
ただし、
S = \begin{pmatrix}
 \sigma_1 & & \\ 
  &\sigma_2 & \\ 
  & & \ddots 
 \end{pmatrix}

V = \begin{pmatrix}
 \vec{v_1} & \vec{v_2} & \cdots \\ 
 \end{pmatrix}
 ```
と変形できます。これらを使い、

```math
A=USV^{-1} \\
```
と変形できます。これを特異値分解といいます。$A$は正方行列である必要はありません。（$AA^T$は常に正方行列（対称行列）になります。）で、
$AA^T=USS^TU^{-1}$は　対称行列＝直交行列・対角行列・直交行列　の形になります。$A^TA$も同様です。詳細は参考サイトのほうでご確認いただければと思います。$U$、$V$は直交行列なので、
　
　　$A =USV^{-1} =USV^T$＝**直交行列・対角行列・直交行列**
　
となります。

## 3.2.特異値分解のメリット
- 行列$A$が正方行列でなくても、固有値分解のメリットを享受できます。
- $AA^T$や$A^TA$が分析対象として**意味のある行列**のときに、シンプルな形で表現できます。計算機で扱いやすい、といえます。意味のある行列ですが、$AA^T$は分散共分散行列を表せるようです（参考サイト4より）。

# 4.参考にしたサイト様
[1 線形代数レクチャーノート](http://minami106.web.fc2.com/math/linear_lecture.pdf "線形代数レクチャーノート")
[2 理数アラカルト](https://risalc.info "理数アラカルト")
[3 対角化、固有値分解、特異値分解、そしてジョルダン標準形](https://kriver-1.hatenablog.com/entry/2018/10/07/010758 "対角化、固有値分解、特異値分解、そしてジョルダン標準形")
[4 ダンゴムシでもわかる特異値分解](http://ronri-rukeichi.hatenablog.com/entry/2018/03/19/012335 "ダンゴムシでもわかる特異値分解")

# おわりに
筆者は、数学もQiitaも素人です。いろいろ気を付けて記載しているつもりですが、誤り等指摘していただけると泣いて喜びます。

# 蛇足
上記はすべて実数の世界で考えています。ネットで調べていると複素数の話が出てくるのですが、難しいのでスルーしています。
[Xcode10]iOSシミュレータでDebug > Locationが動かない時

#環境
swift4
xcode10.1
#前提
位置情報アプリを開発する時にデバッグがクソめんどくさいです。
そんな時にiOSシミュレータのメニュー > Debug > Location > City Run
とか選択するとシミュレータ上で位置情報を更新してくれます。

[参考](https://qiita.com/mattak/items/420039c674fe4392a647)

#やること
上記操作で位置情報を更新してくれてよかった！
と思いきや位置情報を更新してくれない時の対処

#操作
Xcode10のバグらしくCity Runを設定しても位置情報を更新してくれないことが
多々ありました。
これの解決手段はCity Run →　None →　Apple → City Run
みたいに、5,6回変更すると突然動き出すようです。

私の環境だと
City Run → Apple
で位置情報を何回か更新して
City Runに戻すとその後は正しく更新してくれました。

シミュレータで位置情報を更新できなくて地味に困ったので共有しときます。

[参考](https://forums.developer.apple.com/thread/109634)
AWS Organization

##■AWS Organization でできること##

- 複数のAWSアカウントを一元管理
- AWSアカウント新規作成の自動化
- 請求の簡素化


##■構成要素##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/f3bea176-37f1-d762-6be4-4fc00675f567.png)


##■機能セット##

- 支払一括代行：支払一括代行のみを実施する場合に選択。
- アカウントの全体管理：支払一括代行も含めて、企業内で複数アカウントを統制したいときに使う。


##■マスターアカウント##

- 組織全体のAWS利用料の支払い
- 新規AWSアカウントの作成
- 既存AWSアカウントの招待
- 組織内に登録されたAWSアカウントの削除
- 組織ポリシーの適用（SCP）

と大きな権限をもつので、マスターアカウントでは基本的にリソースなどの作成には利用しない。


##■SCP##
SCPにだけ軽く触れておきます。

- 組織内の組織ルート、OU、アカウントに対して割り当てることができ、階層構造に基づいて継承して適用される。
- マスターアカウントは対象外。メンバーアカウントでは、IAMユーザー・ロールだけでなくルートアカウントも対象。
- サービスやAPI、アクションへのアクセスを許可・拒否できる。


- 複数のポリシーがアカウントに適用される場合、許可はAND条件となる。
- アカウント内のアクセス制限に対して、フィルタとして動作する。
 - 許可：SCPは必要条件だが、十分条件ではない。SCPで許可されていてもIAMポリシーやリソースポリシーで許可されていないと利用できない。
 - 拒否：SCPで拒否とすると他で許可されていても、利用できない。

- ブラック方式・ホワイト方式どちらで運用するかを考える。


##■一括請求##

- ボリュームアカウントが合算して計算される。
- リザーブドインスタンスによる割引がデフォルトで共有される。


##■比較##

||1アカウントのみで分離 |複数アカウントにして分離|
|---|---|---|
|権限の分離|IAMポリシー|IAMポリシー+Organizationsのポリシー|
|料金|タグ付けをして使用状況をレポートで確認|アカウントごとで確認できる|
|支払い||一括請求|
|料金||ボリュームディスカウントの合算などの値引きの共有|
|VPN|1つのVPCしか使わない場合は1接続で対応できる|VPN接続はVPCごとに必要|
|管理ユーザの管理||スイッチロールやAWS SSOを利用できる|
|システム間連携||VPCピアリングやスナップショット共有など|


##■参考になりそうなハンズオン##
[AWS Organizations を実際に初めてみる第一歩](https://qiita.com/akiray03/items/07e9a786d1cc054f4e22)
[AWS Organizationsの新規設定と確認](https://qiita.com/tamo_breaker/items/854c94379e4e8c8711e4)
STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(3)

STM32を使用する環境としてSTM32CubeIDEのLチカまでを説明します～の続きの続きです。

なお、本内容は、YoutbeのHow to use STM32CubeIDEをもとに作成しています。
https://www.youtube.com/watch?v=eumKLXNlM0U

前回はコード生成の説明まででした。
今回はYoutubeの内容を最後まで行きましょう。

106行目と48行目に以下を追加します。
今回は、Ctrl+スペースを押しても補完してくれないと思います。
なぜならば、設定ができていないからです。

コードを簡単に説明します。
48行目
```
int LED_State = 0;
```
LED_Stateを作成します。
これは初期値を０にします。

106行目(107行目？）
```
LED_State = HAL_GPIO_ReadPin(LD2_GPIO_Port, LD2_Pin);
```
LED_State はLD2_Pinを読み取った値とします。
これで、LEDが点灯するとLED_Stateが0から１に変更することになります。

![30-2-0-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/95a2856c-e08e-3c01-b086-78c9e5574c4f.jpeg)
![30-2-0-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/22b11eef-2dbf-af21-fbf9-9d8682c8cf4b.jpeg)

次に、この内容を表示できるようにします。
Run⇒DebugConfigurationsをクリック
![31-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7ab95ddc-d5a9-bf18-b6cc-332b258f23a5.jpeg)
デバッガ⇒シリアル　ワイヤ　ビューアを有効にし　CoreCloksを84.0にします。
注意：クロックは、搭載しているマイコンの周波数にしてください。
今回のF401は84MHzですが、別のマイコンでは、周波数が異なります。
![31-4-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5099ff65-aaa8-4f1a-1f61-ba2c4b2ef136.jpeg)
右上の検索バーにLIVEと入れます。
![32-0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8341e371-e6cb-e7b2-a226-837d95561560.jpeg)
Live Expressionを選択します。
![32-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/21d63c7b-8133-5547-2177-49506e971afe.jpeg)
右側の値にLED_Stateを入れます。
ここにLEDの値が表示されます。
![32-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8e9a8f89-980f-ca86-fa16-c21f73c20efd.jpeg)

次に、SWVを入力し、SWVデータトレースタイムトレイングラフを選択します。
![32-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/46ea8dd7-109b-9195-3f05-7155da456d9a.jpeg)

右下のアイコンをクリックします。
![32-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3ca5109f-c117-23c8-5748-e7fbb3f03f1a.jpeg)
データトレースを居k氏、LED_Stateを入力しOKを押します。
![32-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6eb35dec-ed3e-1212-a0cb-2452cdc5f5c5.jpeg)
デバッグ後、赤丸を押します。
![32-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/956ff938-e8c2-af8c-70ca-d8b1af5db1de.jpeg)
そして、再生すると、LED_Stateは０，１を交互に繰り返すとともに、グラフにパルスが表示されます。
![32-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/29c9fc14-a72f-38b5-e8d5-813a8a6c49c3.jpeg)

LEDがパルス出力で点滅しているのがこれでわかると思います。
複数人開発時に git log の 特定 author を一括変更する

# はじめに

github は`git config`に記載されたメールアドレスを照合して草を生やします。

そのため、git config に誤ったメールアドレスを記載をした場合や、そもそもメールアドレスを記載していないと草が生えません。

```sh
$ git config --list # 設定の確認

# 名前の設定
$ git config --global user.name "Foo Bar"
# メールアドレスの設定
$ git config --global user.email "sample@example.com"
```

## 本題

複数人で開発を行っている中、上記に後から気付いた時、あなたは草が生えないことにショックを受けるでしょう。

`git filter-branch`を利用すれば、全コミットの author を書き換えられますが、それでは、他のユーザーの author 情報も書き換えてしまう可能性があります。

```sh:update-all-git-author.sh
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Foo Bar'; GIT_AUTHOR_EMAIL='sample@example.com'; GIT_COMMITTER_NAME='Foo Bar'; GIT_COMMITTER_EMAIL='sample@example.com';" HEAD
```

しかし、シェルスクリプトを利用することでそのようなニーズを満たすことが可能です。

```sh:update-git-author.sh
#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
```

```sh
$ chmod 755 update-git-author.sh # 実行権限さえ与えればいいので 111 でも構いません

# 実行
$ ./update-git-author.sh

# 変更を github 上へ反映
$ git push origin master --force
```

## 終わりに

私がまさに上記の問題に直面していたので本当に助かりました。

シェルスクリプト様には頭が上がりません。

### 参考

- [How to change the author and committer name and e-mail of multiple commits in Git?
](https://stackoverflow.com/questions/750172/how-to-change-the-author-and-committer-name-and-e-mail-of-multiple-commits-in-gi)
Leetcode #130: Surrounded Regions


```swift
func solve(_ board: inout [[Character]]) {
    let row = board.count
    let column = board.first != nil ? board.first!.count : 0
    for i in 0..<row {
        helper(i, 0, row, column, &board)
        helper(i, column-1, row, column, &board)
    }
    for j in 0..<column {
        helper(0, j, row, column, &board)
        helper(row-1, j, row, column, &board)
    }
    for i in 0..<row {
        for j in 0..<column {
            if board[i][j] == "$" {
                board[i][j] = "O"
            } else if board[i][j] == "O" {
                board[i][j] = "X"
            }
        }
    }
}

private func helper(_ i: Int, _ j: Int, _ row: Int, _ column: Int, _ board: inout [[Character]]) {
    guard i >= 0 && i < row && j >= 0 && j < column else {
        return
    }
    if board[i][j] == "O" {
        board[i][j] = "$"
        helper(i-1, j, row, column, &board)
        helper(i+1, j, row, column, &board)
        helper(i, j-1, row, column, &board)
        helper(i, j+1, row, column, &board)
    }
}
```