OmniAICreator/Qiita-1.07M huggingface dataset:
【kintoneの基本】アプリに蓄積したデータの活用の為の手法についてのまとめ

kintoneに溜めたデータの活用はグラフなどの集計、レコードの絞り込み（レコードの検索）等があるかと思います。

>kintoneヘルプより
>アプリに登録したデータの活用
>https://jp.cybozu.help/k/ja/user/app_collectdata.html

その為にはアプリを集計などに活用可能なデータの状態にしておくことが大事です。

# データ活用方法

## レコードの絞り込み（レコードの検索）

kintoneヘルプ等では、[検索]というのはアプリやポータルの右上の検索窓からキーワードで検索することを指すようです。
ここでは、kintoneヘルプで言う所の[レコードの絞り込み]の話しです。アプリの一覧画面の漏斗マークを押下した時の処理のことですね。

レコードの絞り込みで指定できるフィールドはほとんどが対象になります。一部利用に注意するフィールドがあるので下記にまとめます。

### レコードの絞り込み条件で注意するフィールド

詳細はヘルプの補足欄を見てください。
https://jp.cybozu.help/k/ja/user/app_collectdata/filter_records.html

* テーブル：絞り込み条件で一件でも対象になると抽出されます。
* 関連レコード一覧：テーブルと同様です。

### ソートの指定で注意すること
絞り込み条件と違い、テーブルと関連レコード一覧はソートで指定ができません。
ソートするデータはテーブルと関連レコード一覧以外のフィールドに持つようにします。

>kintoneヘルプより
「ソート」で選択できるフィールドを教えてください
https://jp.cybozu.help/k/ja/user/user_faq/sort.html

さらに、下記のフィールドもソートに指定できません。

* ユーザー選択
* グループ選択
* 組織選択
* チェックボックス
* 複数選択
* 添付ファイル
* 文字列（複数行）

複数選択系のフィールドがソートに未対応ということですかね。

## レコード絞り込みTips

kintoneはアプリごとがいわゆるデータベースのテーブルなイメージです。
RDBでは無いので他のアプリ（テーブル）のデータを検索して引っ張る時には、ルックアップまたは関連レコード一覧でアプリ間を紐付けるようになります。

関連レコード一覧でアプリ間を紐付けることで、レコードの絞り込みが利用できるので、なんとかして絞り込みするアプリに関連レコード一覧で紐付けるようにアプリの構成を考える（設計する）と良いです。

関連レコードの中で関連レコードは使えないので、さらに別アプリを紐付ける場合は関連レコードで紐付ける元アプリ側ではルックアップコピーでアプリ間を紐付けるようにします。

例えば下記の図のように、顧客マスタに見積アプリを関連レコードで紐付けた場合を考えます。
![関連レコード一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/ab50b2ac-3409-0c5f-9d3e-c85cb188c446.png)

この場合、見積アプリと紐付ける商品レコードなどは見積アプリからルックアップで紐付ける（ルックアップコピーする）ようにします。

このようにして、何とか関連レコードで紐付けることができれば、別アプリの項目も絞り込みの対象にすることができます。
ssl.confの設定について

久しぶりにSSLをインストールしたのですが、設定でつまずきました。
一通りcrt等をアップロードしてApacheを再起動したら
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
と、エラーが出てしまいました。

色々試したのですが、エラーは消えず、ssl.confの
Listen 443 https
↓
 #Listen 443 https
としてコメントアウトすると無事Apacheが起動しました。
ただこれだとSSLが効かないと思い試行錯誤をしていたのですが、
この状態でもSSLでブラウザからアクセスでき、証明書もきちんと認識していました。

取りあえずはSSLでアクセスできているので良いのですが、何か腑に落ちません。
SSLをインストールする前にしたことは、PHPを5.4から7.3へアップデートしただけです。

どういうことになっているのか、お分かりの方いらっしゃいますでしょうか？
Rails初心者の「N+1って何ですか？」にのベテランエンジニアさん超絶わかりやすいアンサー！！！


 僕 「N+1ってデータを何回もやりとりしてしまうことのことですよね?(ぼんやり)」
 先輩 「そうそう！具体的にいうとね。この例を見て欲しい」

ProductモデルとPatronモデルはアソシエーションしている前提

```rb
products = Product.all　#全体の数をN件とする　
#先輩「ここでN件分の一回呼び出されるよね？正確にはeachしたときなんだけど」
```
```rb

products.each do |product| #先輩「ここではさっきN件分呼び出されたものを、一個一個取り出す。つまりN回分呼ぶよね」
 product.patrons.each do |patron|
  patron.title
 end
end
```
先輩「そうすると結局N+1回分データを取り出す作業していることはわかった？」
僕「なるほど！わかりました！」

先輩「データが少ないときには特に問題にならないかもしれないのだけど、**データが数万とかたくさんのデータを扱うとき**にN+1問題はパフォーマンスを低下させてしまう原因になってしまうんだ。」
僕　「確かにそうですよね！解消する手段はあるんですか？」
先輩「ある！結論から言うと**includesメソッド**を使うんだ。このメソッドを使うと下記の例のように**2回のやりとり**で済ませることができる」

```rb

products = Product.includes(:patrons).all #先輩「includedsメソッドはSQLでin句を発行してくれるin句に関しては下に解説を載せておいたから見ていみるといい。」
```
```rb
products.each do |product| #先輩「viewの内容は変わらないんだ。ただincludesメソッドがついているものだとここでのデータのやりとりを1回で済ませることができる。」
 product.patrons.each do |patron|
  patron.title
 end
end
```

## in句に関して
https://www.sejuku.net/blog/72497
## 僕の記事より圧倒的にわかりやすい記事を書いている中で発見しました
https://nyoken.com/rails-includes
Keynote中でLatex形式で方程式を書く際に太字のベクトル表記をする

Keynoteを使ってスライドを作る際、時々方程式の挿入でLaTeX形式で数式を書き込んでいる。

普段のLaTeXではbm環境を使って

```
\bm{A},\bm{B},\bm{C}
```
などとして
$\boldsymbol{A},\boldsymbol{B},\boldsymbol{C}$
を表示させていたが、Keynoteではbm環境が使えないので困った時のメモ。

単純に

```
\boldsymbol{A},\boldsymbol{B},\boldsymbol{C},
```
とすれば良い話だった。ちなみにQiitaの文章中でも上を$$で囲むと使えた。
Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#6(データ分析)

Google Cloud Platform (GCP)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。


クラウド コンピューティング サービス  |  Google Cloud
https://cloud.google.com/?hl=ja


## Amazon Web Services (AWS)のまとめはこちら！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


## まとめルール

まとめルールについては下記を参考ください。

Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#1(AI と機械学習/AI ビルディング ブロック) - Qiita
https://qiita.com/kai_kou/items/fa930eef23470c2f8f0b


## 概要について

サービス一覧ベージの概要を引用しています。

プロダクトとサービス  |  Google Cloud
https://cloud.google.com/products?hl=ja#product-launch-stages


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Data Analytics - データ分析

### BigQuery

ML が組み込まれた、フルマネージドでスケーラビリティの高いデータ ウェアハウス。

- 正式名称: BigQuery
- https://cloud.google.com/bigquery
- 読み方: ビッグクエリ
- 略称: なし
- 俗称: なし


### Looker

ビジネスインテリジェンス、データアプリケーション、および組み込み分析のためのエンタープライズプラットフォーム。

- 正式名称: Looker
- https://cloud.google.com/looker
- 読み方: ルッカー
- 略称: なし
- 俗称: なし


### Cloud Composer

Apache Airflow を基に構築された、フルマネージドのワークフロー オーケストレーション サービス。

- 正式名称: Cloud Composer
- https://cloud.google.com/composer
- 読み方: クラウド コンポーザー
- 略称: なし
- 俗称: なし


### Dataflow

バッチデータやストリーミング データをリアルタイムに処理します。

- 正式名称: Dataflow
- https://cloud.google.com/dataflow
- 読み方: データフロー
- 略称: なし
- 俗称: なし


### Cloud Data Fusion

コードを意識せずにフルマネージドでデータを統合できます。

- 正式名称: Cloud Data Fusion
- https://cloud.google.com/data-fusion
- 読み方: クラウド データ フュージョン
- 略称: なし
- 俗称: なし


### Cloud Dataprep by Trifacta

分析用データを探索、クリーニング、準備するクラウド データサービス。

- 正式名称: Cloud Dataprep by Trifacta
- https://cloud.google.com/dataprep
- 読み方: クラウド データプレップ バイ トライフェクタ
- 略称: なし
- 俗称: なし


### DATAPROC

Spark と Hadoop のマネージド サービス。

- 正式名称: DATAPROC
- https://cloud.google.com/dataproc
- 読み方: データプロック
    - 参考: [ブレインパッド、国内最大規模の運用型広告最適化ツール「L2Mixer」の環境を「 Google Cloud Platform 」へ移行 \| ブレインパッド](https://www.brainpad.co.jp/news/2017/04/06/4983)
- 略称: なし
- 俗称: なし


### Cloud Pub/Sub

規模の大小を問わず、あらゆる場所からイベント ストリームを取り込みます。

- 正式名称: Cloud Pub/Sub
- https://cloud.google.com/pubsub
- 読み方: クラウド パブ/サブ
- 略称: なし
- 俗称: なし


### Data Catalog (beta)

フルマネージドでスケーラビリティの高いデータ検出およびメタデータ管理サービス。

- 正式名称: Data Catalog
- https://cloud.google.com/data-catalog
- 読み方: データ カタログ
- 略称: なし
- 俗称: なし


### Cloud Life Sciences (beta)

コンテナ化されたワークフローで、大規模なゲノムデータや生物医学データを処理、分析、アノテーション付けします。

- 正式名称: Cloud Life Sciences
- https://cloud.google.com/life-sciences
- 読み方: クラウド ライフ サイエンス (サイエンシズ?)
- 略称: なし
- 俗称: なし
関数とメソッドの違い【golang】

# オブジェクト指向言語では
# 関数
- オブジェクト関係なく、呼ぶと何か処理をする`プログラムの部品`

# メソッド
- オブジェクト指向で登場する用語で、`オブジェクトの動作を定義したもの`らしい。


# golangはオブジェクト指向？？
- golangを勉強し始めて1週間。
- 今まで、同義的に使っていたメソッドと関数という言葉・・・
- golangがオブジェクト指向なのかはよくわからない（[オブジェクト指向言語としてGolangをやろうとするとハマること](https://qiita.com/shibukawa/items/16acb36e94cfe3b02aa1)）けど、まとめてみたらオブジェクト指向言語っぽく使えることを理解した。
- とにかく、**関数とメソッドは明確に違いがあるらしい**とのことでまとめてみた
- 諸先輩方、認識が違ったらご指摘お願いいたします。
- ※比較しやすいよう同じ処理をする

# 関数
- `func`で始まる処理の塊の中で構造体（型）に紐づけられていないもの

```go:main.go

type Square struct {
    X, Y int
}

func Area(s Square) int {
    return s.X * s.Y
}

func main() {
    s := Square{5, 5}
    fmt.Println(Area(s))  // >>25
}
```

# メソッド
- 構造体（型）に紐づく処理の塊
- `Area(s Square)`の部分が↑の`型に紐づく`を実装している部分
- こうすることで`Area`は`構造体：Square`の持ち物となり、`s.Area()`として呼び出すことができる。これがメソッド。
- この紐づけた構造体（型）のことを`レシーバ(receiver)`と呼ぶらしい。

```go:main.go
type Square struct {
    X, Y int
}

func (s *Square) Area() int {
    return s.X * s.Y
}
func main() {
    s := Square{5, 5}
    fmt.Println(s.Area())  // >>25
}
```

# ポインタレシーバ
- ↑の`レシーバ`を使用して実態を書き換えることを`ポインタレシーバ`と呼ぶらしい。耳なじみのある言い方で言うと`参照渡し`。
- 例えば、SquareのArea()の前にSquareを拡張する`Scale`というメソッドを用意してみる。実態が変わるため出力は`2500`となる。
- `(s *Square) Scale`の部分のアスタリスク（*）を削除すると`値レシーバ（値渡し）`となり出力は`25`となるので[コチラ](https://go-tour-jp.appspot.com/welcome/1)でこのソースをコピペして試してみてください。

```go:main.go
type Square struct {
    X, Y int
}

func (s Square) Area() int {
    return s.X * s.Y
}

func (s *Square) Scale(i int) {
    s.X = s.X * i
    s.Y = s.Y * i
}

func Area(s Square) int {
    return s.X * s.Y
}
func main() {
    s := Square{5, 5}
    s.Scale(10)
    fmt.Println(s.Area()) // >> 2500
}
```

- とりあえず、関数とメソッドの違いでした。
完・WebGLについて

この記事は先日投稿した[こちらの記事](https://qiita.com/alicial/items/be950db2f506212b1d1d)の続きとなります。

# はじめに
前回までで、生のWebGLでの描画を行いました。
描画ができましたので、今回はthree.jsを使用して感動したいと思います。

### three.js is何
[wiki](https://ja.wikipedia.org/wiki/Three.js)を引用
> three.jsは、ウェブブラウザ上でリアルタイムレンダリングによる3次元コンピュータグラフィックスを描画する、クロスブラウザ対応の軽量なJavaScriptライブラリ及びアプリケーションプログラミングインタフェースである。 
WebGLというWeb標準技術の登場により商用のブラウザ拡張機能に頼る必要なしに、HTMLファイル内に埋め込まれたJavaScriptを介して、GPUアクセラレーションによる動的表現を描画することが可能になった。three.jsは、**WebGLのAPIを簡略化するためのラッパ**である。 

ラッパ

# れっつthree.js
特に用意するものも必要ない上に、[公式のサンプル](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene)も丁寧で豊富です。

```html
<html>
<head>
    <title>Hello three.js.</title>
    <meta charset="utf-8" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/99/three.min.js"></script>
    <script>
        window.addEventListener('load', init);
        function init() {

            // 表示領域を指定
            const width = 600;
            const height = 600;

            // レンダラーを作成
            const renderer = new THREE.WebGLRenderer({
                canvas: document.querySelector('#canvas')
            });
            renderer.setPixelRatio(window.devicePixelRatio);
            renderer.setSize(width, height);

            // カメラを作成
            const camera = new THREE.PerspectiveCamera(45, width / height);
            camera.position.set(0, 0, +1000);

            // シーンを作成
            const scene = new THREE.Scene();

            // boxを作成
            const geometry = new THREE.BoxBufferGeometry(200, 200, 200);

            // マテリアルを作成
            const material = new THREE.MeshNormalMaterial();

            // メッシュを作成
            const mesh = new THREE.Mesh(geometry, material);

            // シーンに追加
            scene.add(mesh);

            animate();

            // フレーム時に実行されるイベント
            function animate() {

                // 回転速度
                mesh.rotation.x += 0.005;
                mesh.rotation.y += 0.01;

                // レンダリング
                renderer.render(scene, camera);
                requestAnimationFrame(animate);
            }
        }       
    </script>
</head>

<body>
    <canvas id="canvas"></canvas>
</body>
</html>
```

今回は公式の[こちらの例](https://threejs.org/examples/#webgl_geometry_cube)を参考に自分なりにやっていることを修飾してみました。

作成しているジオメトリを変更するだけで描画物が変更されます。

```javascript
// boxを作成
const geometry = new THREE.BoxBufferGeometry(200, 200, 200);
// ↓
// sphereを作成
const geometry = new THREE.SphereBufferGeometry(200, 200, 200);
```
例えば、上記の変更のみで描画物が箱から球体に変化します。

### くるくる
![box.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275170/780008e0-2e13-3d13-b414-f126c46fe915.gif)


# おわりに
シェーダのコンパイルや回転行列の生成、描画物の頂点の定義などを意識しなくても様々なオブジェクトを生成できるのはやはり便利です。
実際にサンプルを参考にして、多少手を加えるだけですぐにイメージしていたものを作ることができました。
このようなライブラリを使用すれば、中で何をしているかを知らなくてもそれっぽいものはかんたんに作れてしまうと思います。

今回は自分はあえて生のWebGLでの描画からはじめたので、こちらのサンプルコードや公式の説明がなにを意味しているのかをわりとすんなりイメージすることができました。
なにかライブラリを使用する前にその機構が裏で何をしているかを簡単にでも理解すると、ライブラリを使用した際になにをしているかのイメージができることがわかりましたので、今後も時間に余裕があれば事前に生を試して行こうと思います。
iptables nat ルールの削除

参考: https://www.cyberciti.biz/faq/how-to-iptables-delete-postrouting-rule/

`$ sudo iptables -t nat -L --line-numbers`

```
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    MASQUERADE  all  --  192.168.80.0/24      anywhere
2    MASQUERADE  all  --  192.168.50.0/24      anywhere

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
```

↑ の num を指定する

`$ sudo iptables -t nat -D POSTROUTING 1`
OR 
`$ sudo iptables -t nat --delete POSTROUTING 1`
rustでnn

# 概要

plunkerでtensorflow.jsやってみた。
xorやってみた。
tf.variableで書いてみた。
学習したweight、biasを取り出した。
rustで、推論してみた。

# サンプルコード

```


fn tanh(x: f64) -> f64 {
	let a: f64 = (x).exp();
	let b: f64 = (-x).exp();
	return (a - b) / (a + b);
}
fn sigmoid(x: f64) -> f64 {
	return 1.0 / (1.0 + (-x).exp());
}
fn main() {
    let w1 = [[-3.4681022, 0.379121, -1.4711456, 2.2247136, 2.3135107, 2.7624693, -1.83576, -1.1545312], [2.1978209, 0.2895245, 2.0881913, -1.3450832, -1.4154571, 1.9255028, 3.2867477, 1.956522]];
    let b1 = [-0.6591252, 0.3864409, 0.4982838, 0.3707547, 0.3982254, -0.3612466, 0.4284867, 0.2701645];
    let w2 = [[1.4324994 ], [0.7911373], [-2.3011343],	[-1.7614117], [-2.4442003],	[3.9701838], [-1.837263], [-1.3641325]];
    let b2 = [0.9285715];
    for i in 0..4
    {
        let mut x = [0.0, 0.0];   
        let mut y = [0.0];
        let mut h = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
	    if i == 0
	    {
	        x = [1.0, 0.0];
	        print!("1, 0 = ");
	    }
	    if i == 1
	    {
	        x = [0.0, 1.0];
	        print!("0, 1 = ");
	    }
	    if i == 2
	    {  
	        x = [1.0, 1.0];
	        print!("1, 1 = ");
	    }
	    if i == 3
	    {
	        x = [0.0, 0.0];
	        print!("0, 0 = ");
	    }
	    for k in 0..2
	    {
		    for l in 0..8
		    {
		        h[l] += x[k] * w1[k][l];
		    }
	    }
	    for l in 0..8
	    {
	        h[l] += b1[l];
	        h[l] = tanh(h[l]);
        }
	    for k in 0..8
	    {
	        for l in 0..1
	        {
			    y[l] += h[k] * w2[k][l];
            }
	    }
	    for k in 0..1
	    {
		    y[k] += b2[k];
		    y[k] = sigmoid(y[k]);
	    }
	    println!("{} ", y[0]);
    }
}



```


# 成果物

https://paiza.io/projects/EaA1eDglVA6rd_2cptbTNA

以上。
【TypeScript】Generics(ジェネリックス)を理解する

# 概要

TypeScriptにおける`Generic(ジェネリック)`とは何かサンプルコードと共に簡単にまとめました。

# Genericsとは？

まず、`C#`や`Java`といった言語もGenericsを搭載しており、TypeScriptに限った機能ではありません。

Genericsは抽象的な型引数を使用して、実際に利用されるまで型が確定しない`クラス`・`関数`・`インターフェイス`を実現する為に使用されます。
これだけだとイメージが湧きづらいと思いますので、実際にサンプルコードを交えて理解していきます。

# Genericsの簡単な具体例(関数編)

下記のように同じようなコードを別の型で繰り返す場合があるとします。

```ts
// number型
function test(arg: number): number {
  return arg;
}

// string型
function test2(arg: string): string {
  return arg;
}

test(1); //=> 1
test2("文字列"); //=> 文字列
```

これをGenericsを使用する事で下記のように書く事が可能です。
`test<string>`の引数はstring型だけ、また`test<number>`の引数はnumber型だけが許されるようになります。


```ts
function test<T>(arg: T): T {
  return arg;
}

test<number>(1); //=> 1
test<string>("文字列"); //=> 文字列

//※ Genericsでも型推論ができるので、引数から型が明示的にわかる場合は省略が可能
test("文字列２"); //=> "文字列２"
```

つまり、上記では抽象的な型引数`<T>`を関数に与え、実際に利用されるまで型が確定しない関数を作成しています。


## 複数の型引数を定義する

複数の型引数を使用することも可能です。
型引数の名前に特に決まりはありませんが、慣習的に`T`, `U`等の大文字のアルファベットが使用される事が多いです。


```ts
function test<T, U, P>(arg1:T, arg2: U, arg3: P): P {
  return arg3;
}

//※ Genericsでも型推論ができるので、引数から型が明示的にわかる場合は省略が可能
test("文字列", true, 4); //=> 4
```

# Genericsの簡単な具体例(クラス編)

Generic関数の様に型引数を渡す事で、クラスもジェネリック化する事が可能です。
型引数`T`はメソッドの返り値の型や、引数の型として、クラスを通して使用されている事が見てとれます。

```ts
class Klass<T> {
  item: T;

  constructor(item: T) {
    this.item = item;
  }

  getItem(): T {
    return this.item;
  }
}

let strObj = new Klass<string>("文字列１");
strObj.getItem(); //=> "文字列１"

let numObj = new Klass<number>(5);
numObj.getItem(); //=> 5
```
# Genericsの簡単な具体例(インターフェイス編)

こちらも上記のGeneric関数・クラスと同じ要領でGenericインターフェイスを作成する事が可能です。

```ts
interface KeyValue<T, U> {
    key: T;
    value: U;
}

let obj: KeyValue<string, number> = { key: "文字列", value: 2 } //= {key: "文字列", value: 2}
```

# 型引数に制約を付ける

ここまで紹介したGenericの型引数はどんな型の引数も受け入れてきました。
しかし、引数で受け入れる値を特定の型のみに制限したい場合もあります。

例えば下記の例では`arg`の`name`というプロパティを取得しようとしていますが、全ての型が`name`を持つ訳ではないので、コンパイラが警告を出しています。

```ts
function getName<T>(arg: T): string {
  return arg.name; // Property 'name' does not exist on type 'T'.
}
// argの型はこの時点でnameを持つか不明なので、コンパイラは警告を出す。
```

その様な場合、下記の様に書くことで、`T`は`extends`で指定したインタフェースを満たす型でなければならないということを指定する事ができます。
これにより、実装時にコンパイラエラーも起こりません。
また、関数を呼び出す際に制約に違反する引数を渡した場合にはエラーを出してくれます。

```ts
interface argTypes {
  name: string;
}

function getName<T extends argTypes>(arg: T): string {
  return arg.name;
}

getName({ name: "鈴木一郎" });
```

# 参考
- [Generics · TypeScript](https://www.typescriptlang.org/docs/handbook/generics.html)
- [Generics in TypeScript ← Alligator.io](https://alligator.io/typescript/generics-in-typescript/)
始まりの町でWindows10アップデートに潜む闇と戦う異世界勇者達へ

#序章
ファットクライアント必須の環境で日々Windows10アップデートに潜む闇と戦っている駆け出し勇者（Administrators）の方々へ。

#第一章　来るべき波
あれ、Excelが発動しない。
ん、スタートメニューが石化された。
わいのPCがゾンビ化して再起動繰り返す。

まちの人たちが一斉に騒ぎはじめる。
鳴り止まない通信装置、**内線**。・・災厄、再び。

#第二章　合成アイテム
S級勇者であれば、上級魔法、**ポリシー**。もしくは特殊スキル、**管理ソフト**で何とか解決できるかもしれない。
しかし、異世界召喚されたばかりの駆け出し勇者は、初期装備でkbモンスター（バグ付きWindows10更新プログラム）の駆除に追われるのである。

その運命に逆らう唯一のアイテム、
**batファイル**
オートメーションスキル（kbファイル削除自動実行）を格納したbatファイルをまちの人に配って共闘する方法を紹介する。

## 手順その１、**ライブラ（バグ付き更新プログラム確認）**
まず、不具合が起こっているまちの人のPCから、kbを調べる。
コントロール パネル　-　Windows Update　-　更新履歴の表示、
最近のインストールされたkdファイル名を確認しておく。

## 手順その２、**合成**
１．メモ帳を開く
２．次のコードを作成（ライブラリしたkb名を入れる。）
３．名前をkbファイル名(任意)にして保存
４．拡張子、txtをbatに変更

```kbcl.bat
wusa.exe /uninstall /kb:4524147
```
kbファイルの番号で名前を付けると分かりやすい。
例ではkb4524147を削除したい場合なので、ファイル名はkbcl4524147.batにしている。
4524147の部分を削除したいkbファイル名に変更して作成する。

#第三章　作戦開始
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/4c28e5a9-2cb2-c188-7813-7b8ddcca7e0a.jpeg)

batファイルをファイルサーバーなどの共有ストレージに保管。
まちの人に在処を伝え、デスクトップに保管したフォルダのショートカットを用意しておいてもらう。
来るべき波が来たとき、一斉アナウンスにより全員戦闘開始。
複数存在する場合、上から順に発動。
再起動後、kbモンスター駆除完了。
まちの人と共闘することで、勇者一人の駆除ロールプレイングを回避でき、まちの復興も早くなる。

その間、wsus作戦（設定）変更。
必要に応じて王都（保守ベンダー）に兵の派遣要請。

#召喚されて間もない勇者の方々へ
あくまでもこれらの対策は組織の仕事を止めないための応急処置です。
エンジニア経験もなし。知識なし。
それでも、ある日突然異世界召喚され、恐ろしい闇と戦うことになることもあるかもしれません。
同じような異世界で奮闘している勇者の皆様、一緒にレベル上げ頑張りましょう！
photonnetwork.instantiateを使用せずデータの同期をする方法#ゲーム制作03

どうも、わたたかです。
半ベソをかきながらもTwitterでアドバイスを頂き前回の問題を解決したので
その方法について書いていきます。

[前回](https://qiita.com/wttk05/items/f8cea345db8ed00c72fd)
[前回の補足](https://qiita.com/wttk05/items/3d44495eaa479ba96614)

上リンクを見て頂けると分かる通り自身が作成したCardControllerでは
photonnetwork.instantiateを使用することが出来ずどうにか他の方法は無いかと模索していました。

そこでRPCと言うものを使って生成と同期の処理を行うことにしました。


**参考リンク**
https://connect.unity.com/p/pun2deshi-meruonraingemukai-fa-ru-men-sono3

## 訂正箇所

前回

```C#:CardController.cs
    public void Init(int cardID)
    {
        model = new CardModel(cardID);// 生成
        view.Show(model);// 反映
    }
```
訂正後

```C#:CardController.cs
using Photon.Pun

    [PunRPC]
    public void Init(int cardID)
    {
        model = new CardModel(cardID);// 生成
        view.Show(model);// 反映
    }

    [PunRPC]
    public void OnlineInit(int cardID)
    {
        photonView.RPC(nameof(Init), RpcTarget.All,cardID);
    }

```
こうすることによってphotonnetwork.instantiateを使用しなくてもオブジェクトを生成することが出来ました。空のオブジェクトにPhoronView.csをつけるのを忘れないように。

あとは追加で

```C#:GameManager.cs
    // ルーム入室時に呼ばれる関数
    public override void OnJoinedRoom()
    {
        Debug.Log("ルームへ入室しました！");
        StartGame();
    }
```
ルームに入室してからゲームを始める処理を開始することでよく分からないサーバーエラーから逃れることが出来ました。

## まとめとこれから

無事カードを生成することが出来ましたがそれも束の間。
次は**Illegal view ID:0** method: Init GO:PlayerCard （PlayerCardは空のカードPrefabの名前)
と言ったエラーが出て今度は頭を捻らせてます。
一難去ってまた一難はこういうことなんですね。

オブジェクトにPhoton viewID?と言うのが付いていないから出ているエラーっぽいですが
スクリプトのPhotonView.csを外すと生成すらされなくなるので外せないです。


解決策が分かる方がいましたらコメント、Twtter（@wttk05）のDMお待ちしてます。

３月までに人に遊んでもらえる状態まで持っていきたいなぁ...（遠い目）
それではさようなら。
PostgreSQL サーバを Ubuntu18.04 に設定する

意識低い感じでUbuntuレポジトリそのまま使ったインストール・設定方法

```

$ sudo apt install postgresql
```

インストールしたら、postgresユーザで操作

```

$ sudo su - postgres
```
testデータベース作る

```

$ createdb test
```
テーブル作る 「sensor」テーブルは英語、日本語が通るかのテストのために「センサ」テーブルも作ってみた。

```
create table if not exists sensor (
id SERIAL NOT NULL,
sensor integer,
 temp real,
 hemi real,
 memo text
);

create table if not exists センサ (
id SERIAL NOT NULL,
センサ integer,
 温度 real,
 湿度 real,
 メモ text
);
```
テストデータ入れてみる

```
test=# INSERT INTO センサ ( センサ,温度,湿度,メモ ) VALUES (1,22.0,85.0,'ストーブON');
INSERT 0 1
test=# INSERT INTO sensor ( sensor,temp,hemi,memo ) VALUES (1,22.0,85.0,'ストーブON');
INSERT 0 1
```
確認

```

test=# select * from sensor;
 id | sensor | temp | hemi |    memo    
----+--------+------+------+------------
  1 |      1 |   22 |   85 | ストーブON
(1 row)

test=# select * from センサ;
 id | センサ | 温度 | 湿度 |    メモ    
----+--------+------+------+------------
  1 |      1 |   22 |   85 | ストーブON
(1 row)


```

# ネットワーク経由で接続できるように設定

ユーザ作る

```

$ createuser webdb -p
Enter password for new role: 
Enter it again: 
```
このwebdbユーザは参照と更新だけできて削除などできないようにしたい。

psqlにログインしてデフォルトスキーマ「public」に対して権限設定。

```

test=# GRANT SELECT,INSERT,UPDATE ON ALL TABLES IN SCHEMA public TO webdb;
```


/etc/postgresql/10/main/postgresql.conf を編集

```

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
```
↓

```

listen_addresses = '*'         # what IP address(es) to listen on;
```

 /etc/postgresql/10/main/pg_hba.conf を編集

```

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
onf  
```
↓

```

# IPv4 local connections:
host    all             all             0.0.0.0/0            md5
onf  
```

変更を反映

```

$ sudo service postgresql restart
```
ネストしたindexにYoutube動画埋め込み

# ネストしたindexへの動画埋め込み備忘録
https://qiita.com/Kairi_Yasunnde/items/8e931a4670549ba8237e
上記の記事を参考にしたが、自分はgroupテーブルにYoutube_urlを入れてcreateに定義し、groupでネストしたmessages/indexに埋め込もうとして、コントローラーの差異があり出来なかったと推測する。

```routes.rb
  resources :groups, only: [:new, :create, :edit, :update, :show, :destroy] do
    resources :messages, only: [:index, :create, :destroy]
  end
```

なのでYoutube_urlを生値のまま取り出し、ビュー上で末尾１１桁をとり出すようにした。
※Youtubeは末尾１１桁の文字、数字が各動画に割り当てられている。

# 手順

まずは、groupにYoutube_urlのカラムを追加する。
ターミナル上で、groupテーブルにyoutube_urlをstring型でカラムを追加。↓

```
rails g migration AddYoutube_urlToGroups youtube_url:string
```
追加後、rails db:migrateで実行

次に、コントローラーでYoutube_urlの値をpermitで許可する↓

```groups_controller.rb
  private
  def group_params
    params.require(:group).permit(:name, :image, :content, :youtube_url, user_ids: [])
  end
```

createまたはupdateアクションでurlをテーブルに入れたいのでフォームを作る↓
※_formはnewとeditアクションの部分テンプレート

```groups/_form.html.erb
<%= f.text_field :youtube_url, class: "form-control", placeholder: "Youtube_url" %>
```

そして、ビュー上で末尾１１桁の値をlastメソッドで取り出し、Youtube動画埋め込みのテンプレートにはめこむ↓
<%=(@groups.youtube_url).last(11)%>の部分

```messages/index.html.erb
<iframe width="560" height="315" src="https://www.youtube.com/embed/<%=(@groups.youtube_url).last(11)%>" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
```

以上で埋め込み完了
createまたはupdateアクションで入力したurlの動画が埋め込まれる
便利なシェルコマンド たち

# 概要
　最近シェルコマンドに触れたので、その際に使った便利なシェルコマンドを紹介したいと思います。芸まで昇華させるには茨の道ですが、時々触って行こうと思います。

## find
　ファイルとかを見つけたい時に便利です。*このディレクトリには絶対に入ってないから対象外にしたい* と思ったことはありませんか？そんな時には以下のコマンド

```
find ./hogehoge -type d -name maguro -prune -o -type f -print 
```

これでhogehogeの配下にある、**maguro**フォルダ以外を対象として検索してくれます。めでたしめでたし。

## xargs
　xargsと調べると、 **コマンドラインを作成して実行する** と出てきます。自分はコマンドを組み合わせる時に使うパイプ **|** と一緒だと勘違いしていましたが、実際に使ってみると全然違いました。以下のようなコマンドだとわかりやすいです。

A

```
find . -type f | xargs grep "printf"
```

B

```
find . -type f | grep "printf"
```

　Aはファイルの中身に **printf** が含まれるファイルのpathと該当行を返してくれますが、Bはファイル**名**にprintfが含まれるものを返してくれます。

## awk
　awkコマンドはすごく便利です。テキストの削除も切り出しもこのコマンド一つでできてしまいます。正規表現が自由自在に使える方は愛用してそうだと勝手に思いました。
　awkの使い方の一例として、 xargsのAの実行で以下のような結果になったとします。
Aの実行結果

```
./hogehoge/aaa.c:          printf('Hello, World!');
```

pathは邪魔でコードのところだけ欲しいという方は

```
find . -type f | xargs grep "printf" | awk '{$1 = ""; print}'
```

とすることで取り除いてくれます。便利便利。
他にも、 特定の文字以降を消し去りたいと思った方は、

```
awk '{sub("\/.*", "");print $0;}'
```
このように用いることで消し去ってくれます。愉快愉快。

## まとめ
　今回挙げたコマンド以外にも、**sed**や**cut**など調べたコマンドはございましたが、**awk**の方が最強なんじゃないかなと今の知識レベルでは思ったので割愛させていただきます。また、シェル芸と正規表現は表裏一体なのかなと思うので機会があれば正規表現の記事も書こうと思います。
admobの広告を実機で表示する際にエラーが起きたときの対処

# やりたかったこと

iOS向けのアプリケーション作成に手を出しはじめたのですが、admobによる広告表示を実機で確認しようとしたとき、
下記のエラーに見舞われましたが、なんとか表示まで持っていけたという話です。

公式のスタートガイド(https://developers.google.com/admob/ios/banner?hl=ja) に従い進めたところ、
シミュレータでのテスト広告表示まで問題なく確認できたが、実機(iPad mini 4)でのテストで躓いた部分を書きます。

# 前提/背景

admobによる広告表示のため、Xcodeのプロジェクトを作成した後に、CocoaPodsを用いて`Google-Mobile-Ads-SDK`をインポートしました。

公式ガイドの通りに実装をしてiPhoneSE, iPhone8のシミュレータでテスト広告の表示まで順調に確認できてました。

# 実機でのテストにおけるランタイムエラー  

しかし、いざ実機でアプリケーションを動かそうとしたときに問題が発生しました。
ビルドは成功するのだが、実行時エラーでアプリケーションが落ちてしまう事象に遭遇しました。

- エラーメッセージは下記の通りです(一部)。

> dyld: Library not loaded: @rpath/GoogleUtilities.framework/GoogleUtilities
Referenced from 〜以下略

# 原因

iOS 13.3.1 以降はfree developerの作成したアプリでは、ダイナミックフレームワークを拒否するようで、実行時にエラーが起きるらしいです。
詳しく理解できていないのですが、Googleの提供するフレームワークはOSアップデートにより、開発用アカウントの作成したアプリでは動かないみたいです。

# 対応

Podfileの下記部分を変更し、`pod update`を行ったところ無事実機での動作を確認できました。

```diff
target 'xxx' do
  # Comment the next line if you don't want to use dynamic frameworks
-use_frameworks!
+use_modular_headers!
```

記事作成時に気がついたんですが、思いっきり該当するコメントありますね...
` # Comment the next line if you don't want to use dynamic frameworks`
もしかしたら上記の変更ではなく、コメントアウトだけで動作するのかもしれないですね。

開発者登録していないアカウント(下記参照先の原文におけるfree developer)で起こる事象のようなので、
きちんと年貢を納めていれば起こらないエラーなのでしょうね。

多分事象が起こる対象が限定されることから、日本語記事があまり見つかりませんでした。
私のような駆け出しの方が躓くようなことがあった時に助けになれば幸いです。

# 環境

- Xcode: Version 11.3.1
- iPad mini 4: システムバージョン 13.3.1

# 参照先
- https://stackoverflow.com/questions/60249693/application-crash-when-calling-method-firebaseapp-configure-in-a-real-device/60303927#60303927
- https://github.com/firebase/firebase-ios-sdk/issues/4723

---
WindowsにてCP932(Shift-JIS)エンコード以外を開く際の注意点


#はじめに
　現在、機械学習を学習している初心者です。kaggleにて先人のコードを模写することでその方法を学んでいた時に起きたエラーとその解決方法を備忘としてまとめます。

　概要としては、Windowsの場合はデフォルトでCP932へ変換しようとします。しかし、CP932に変換出来ない場合は、UnicodeEncodeError例外が発生するため、その対処方法をまとめました。

参考url
https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e

https://qiita.com/butada/items/33db39ced989c2ebf644

#環境
Windows 10 Home 
Python 3.7.4.

#問題点と解決方法

```python

embedding_dict={}
with open('xxxxx.txt','r') as f: 
    for line in f:
        values=line.split()
        word = values[0]
        vectors=np.asarray(values[1:],'float32')
        embedding_dict[word]=vectors
f.close()
```

UnicodeDecodeError: 'cp932' codec can't decode byte 0x93 in position 5456: illegal multibyte sequence


と出ました。
　これは、Windows環境を使用している場合、デフォルトはcp932でコーディングされるとのこと。その場合、変換できないコードが含まれている場合はエラーが出ます。今回具体的なコードは不明ですが、kaggleにて海外の方のコードを模写しているためと思われます。

従って、プログラムにUTF-8でコーディングする様に記述を加えます。



```python

embedding_dict={}
with open('xxxxx.txt','r',encoding="utf-8") as f:
    for line in f:
        values=line.split()
        word = values[0]
        vectors=np.asarray(values[1:],'float32')
        embedding_dict[word]=vectors
f.close()

```

encoding="utf-8"を加えるだけ、ですがこれで解決しました。

　エラー自体はWindows特有の課題であることやコーディングのされかたについて学ぶことができました。
LIMIT句を使用してページネーションに必要な件数分を取得する図

```sql
LIMIT 取得開始行, 取得件数;
```

「**取得開始行**」は0から始まる数値を指定するため、仮に11〜15までの5件分を取得したい場合は以下のような指定になる。

```sql
LIMIT 10, 5;
```
4ページ目のデータ行を7件分取得する場合のSQL

```sql
SELECT * FROM members LIMIT 21,7;
```

仮にこの取得したパラメータ「4」から「21」を指定するための逆算を行う。
そのためには、<span style="color:#900;font-size:20px">**過去のページ数に表示件数分を掛ける**</span>必要がある。

![](https://i.imgur.com/fnlFUN6.jpg)

![](https://i.imgur.com/tyx3Y0k.jpg)



```php
// offsetとは基準値から差分を相殺した値のこと
$offset = ($page - 1) * 7;
```

これで各ページごとに、毎回必要な件数分のデータだけを取得することができるようになる。
初心者によるプログラミング学習ログ 251日目

#100日チャレンジの251日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。

すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

251日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>251日目<br>・webサイト模写<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1233121521423355904?ref_src=twsrc%5Etfw">February 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
国会動画にショートカットキーを追加するユーザースクリプト


# 国会動画のUIの欠点

YouTubeでは巻き戻し/早送り等のショートカットキーを使用できるが、[衆議院インターネット審議中継](http://www.shugiintv.go.jp/)や[参議院インターネット審議中継](https://www.webtv.sangiin.go.jp/webtv/index.php)では使用できなかった。
何回か聞かないと頭に入ってこないことがあり、ショートカットキーで巻き戻しや一時停止を行いたい。

# 国会動画にショートカットキーを追加してみた

```html:HTML
<video preload="metadata" playsinline="" webkit-playsinline="" src="blob:http://www.shugiintv.go.jp/7770cb33-4a44-5f67-8d9f-abcde88b8811" style="width: 100%; height: 100%; pointer-events: none; position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 1;"></video>
```

```javascript:JavaScript
> $$("video")[0].currentTime
< 6711.462079
```

`<video>`の属性値`currentTime`は開始してからの秒数を表しており、この属性値に値を代入すれば再生位置を変更することができる。

実は、巻き戻し/早送りは簡単にプログラミングすることができる。5秒巻き戻しなら`currentTime`から5を減算すればいい。`addEventListener`でキーボードイベントを拾ってプログラミングする。

# 使い方

拡張機能のTampermonkeyなどを使ってユーザースクリプトを登録する。

ユーザースクリプトはGitHubで公開中。
https://github.com/querykuma/snippets/blob/master/kokkai/Add_ShortcutKeys_Kokkai.user.js

|キーボード ショートカット  |機能  |
|---|---|
|Space キー  |再生 / 一時停止。  |
|左矢印キー / 右矢印キー  |5 秒巻き戻し / 早送り。  |
|j / l キー |10 秒巻き戻し / 早送り。  |
|Control+左矢印キー / Control+右矢印キー  |30 秒巻き戻し / 早送り。  |
|Control+Shift+左矢印キー / Control+Shift+右矢印キー  |60 秒巻き戻し / 早送り。  |
|数字の 1～9|動画の 10～90% の位置に移動。|
|数字の 0|動画の先頭(0%の位置)に移動。|
|上矢印キー / 下矢印キー  |音量を 5% 上げる / 下げる。  |
|f  |全画面モードで表示。全画面モードが有効になっているときに F キーまたは Esc キーを押すと全画面モードが終了します。  |
|q / w / e / r キー|再生速度を1倍、1.25倍、1.5倍、2倍にする。 |
|b キー|直前の再生位置に戻る(qwerキーと1234キーを間違えて押したときのため)。動画を閉じて開き直した場合、直前に開いていた再生位置に戻る。|

基本的にYouTube互換のキーを採用しているが、Control+(Shift+)左矢印キーとQ/W/E/R キーとbキーを独自に追加した。

# 動作検証環境

Chrome 80.0.3987.132
Tampermonkey 4.9
Firefox 74.0
terraform を使って GCP にロードバランサを設置してみた ～その②～

こんにちわ @ktoshi です！

※ 前回の下記の記事の続きです。
[terraform を使って GCP にロードバランサを設置してみた ～その①～](https://qiita.com/ktoshi/items/a43a54005aa73be1254d)

前回の記事で [terraform](https://www.terraform.io/) を使ってロードバランサを構築する方法をお話しました。
ただ、昨今重要視されているHTTPS化ができていません。
そのため、今回はHTTPS化させる方法をお話します。

# 概要
前回作成したロードバランサにHTTPS用の転送ルールを追加して、HTTPSでの接続を有効にします。
なお、今回はGCPが提供するSSL証明書を利用します

# 環境

* Terraform v0.12.20
  * こちら を参考にGCPのProviderの設定をしてください。
  * 今回は「google-beta」のプロバイダも必要となります。
* gcloud 280.0.0

# 事前準備
今回、GCPが提供するSSL証明書を利用するのでドメインとAレコードの設定をお願いします。
Aレコードに設定するIPアドレスは前回作成したロードバランサに紐づけたIPアドレスとなります。

# Let's Enjoy!!!
まず、ささっと一通りの設定書いちゃいます。
前回のコードに下記のコードを加えてください。
[サンプルコード](https://github.com/toshekey/terraform-sample/tree/master/gcp-lb-ssl)

```lb-instance.tf
# 転送ルールの作成
resource "google_compute_global_forwarding_rule" "global-forwarding-rule-https" {
  name       = "global-forwarding-rule-https"
  target     = google_compute_target_https_proxy.target-https-proxy.self_link
  port_range = "443"
  ip_address = google_compute_global_address.lb-address.address
}

# HTTPS転送ターゲット
resource "google_compute_target_https_proxy" "target-https-proxy" {
  name             = "target-https-proxy"
  description      = "target-https-proxy"
  url_map          = google_compute_url_map.url-map.self_link
  ssl_certificates = [google_compute_managed_ssl_certificate.ssl.self_link]
}

# 証明書の作成（test01.example.com と test02.example.com 用の証明書が作成されます。）
resource "google_compute_managed_ssl_certificate" "ssl" {
  provider = google-beta
  name = "ssl"
  managed {
    domains = ["test01.example.com", "test02.example.comh"]
  }
}
```
上記の設定を追加後、terraform apply を実行すればHTTPSでの接続が可能となります。
ただ、証明書作成までには少し時間がかかるので、気長にお待ちください。
apply を実行後すぐに接続してもエラーがでるのはこれが原因です。

一回、ロードバランサを作成してしまうと、HTTPS化はそこまで複雑ではないですね。

# まとめ
前回の記事をほぼほぼ流用して、HTTPS化したロードバランサを作る設定ファイルを説明しました。
さして大きく難しいことはありません。
証明書を準備し、それ用の転送ルールを設定するだけですね。

なお、この構成ではLBがSSLの処理を行うので、LB <---> インスタンス間の通信は HTTP での
通信となりますので、それを頭にいれて構築を行ってください。

少しこれとは話が異なりますが、最近はやりのゼロトラストネットワークを使って、
インスタンスにグローバルIPアドレスを紐づけないサーバの構築、運用方法をお話しできればと思います。

それではみなさん、素晴らしい負荷分散ライフを…！
"幸せ"の多い生涯を送って来ました。[COTOHA APIを使って「人間失格」を"幸せ"に]

## はじめに
この間太宰治著の「人間失格」を読みました．
読んだことある人はわかると思いますが，
ほとんどジメジメした雰囲気で読んでいてかなり暗い気持ちになりました．

じゃあ，
**幸せな文章に書き換えてみましょう．**

## 使ったもの
・[COTOHA API](https://api.ce-cotoha.com/contents/reference/apireference.html#parsing)
　　感情分析機能を使用して，文内の感情判断を行ったキーワード(感情キーワード)と感情キーワードが表す感情を取得します．
・[word2vec](https://qiita.com/Hironsan/items/8f7d35f0a36e0f99752c)
　　感情キーワードに別の単語を足したり引いたりして，その意味にあった単語を取得します．

## 使用する文章
幸せになってもらう文をいくつかピックしました．

```
「恥の多い生涯を送って来ました。」

「つまり、わからないのです。
隣人の苦しみの性質、程度が、まるで見当つかないのです。」

「女のひとは、死にました。
そうして、自分だけ助かりました。」

「神に問う。
信頼は罪なりや。」

「人間、失格。
もはや、自分は、完全に、人間で無くなりました。」
```

## 1. "幸せ"を足してみた
### 方法
1. COTOHA APIを使ってそれぞれの文から１行ずつ感情キーワードを取得します．
2. 感情キーワードにword2vecを使って"幸せ"を足した単語を取得します．
3. 取得した単語を感情キーワードと置き換えます．

**例：**
1.　「人生の春を謳歌しています」から感情キーワード「謳歌」取得します．
2.　「謳歌」に「不幸」を足すと，「苦難」「不幸せ」「破滅」などが取得できます．
3.　「謳歌」を「苦難」と置き換えます．
そうして
`「人生の春を謳歌しています」`
が
`「人生の春を"苦難"しています」`
になります．

### 結果
```
「"喜び"の多い生涯を送って来ました。」

「つまり、"わかる"のです。
隣人の"苦しむ"の性質、程度が、まるで見当つかないのです。」

「女のひとは、死にました。
そうして、自分だけ"助かり"。」

「神に問う。
"幸福"は罪なりや。」

「人間、"不正スタート"。
もはや、自分は、完全に、人間で無くなりました。」
```

いい感じに幸せそうになりました．
でも所々「神に問う。"幸福"は罪なりや。」のように幸福を強調するだけになっています．

では，感情キーワードをもう少し強めに単語を出してみましょう

## 2. 原文を強調しつつ"幸せ"を足してみた
### 方法
1. COTOHA APIを使ってそれぞれの文から１行ずつ感情キーワードを取得します．
2. 感情キーワードにword2vecを使って"幸せ"を足した単語を取得します．
3. **取得した単語に感情キーワードを足し他単語を取得します．**
4. 取得した単語を感情キーワードと置き換えます．

**例：**
1.　「人生の春を謳歌しています」から感情キーワード「謳歌」取得します．
2.　「謳歌」に「不幸」を足すと，「苦難」「不幸せ」「破滅」などが取得できます．
3.　「苦難」に「謳歌」を足すと，「苦悩」「繁栄」「苦しみ」などが取得できます
4.　「謳歌」を「苦悩」と置き換えます．
そうして
`「人生の春を謳歌しています」`
が
`「人生の春を"苦悩"しています」`
になります．

### 結果
```
「"悲しみ"の多い生涯を送って来ました。」

「つまり、"判る"のです。
隣人の"苦しん"の性質、程度が、まるで見当つかないのです。」

「女のひとは、死にました。
そうして、自分だけ"助かっ"。」

「神に問う。
"幸せ"は罪なりや。」

「人間、"スタート事故"。
もはや、自分は、完全に、人間で無くなりました。」
```
所々文章としておかしい箇所ができてしまうのは今回は無視します．

原文のジメジメした部分が強く出過ぎてしまいました．
原文をそのまま足したのではこのようにジメジメしてしまうのであれば，
感情キーワードの表している感情を引いてみましょう．

## 3. 感情を引いて"幸せ"を足してみた
### 方法
1. COTOHA APIを使ってそれぞれの文から１行ずつ感情キーワードを取得します．
2. 感情キーワードにword2vecを使って"幸せ"を足し，**感情を引いた**単語を取得します．
3. 取得した単語を感情キーワードと置き換えます．

**例：**
1.　「人生の春を謳歌しています」から感情キーワード「謳歌」取得します．
2.　「謳歌」に「不幸」を足し，感情「喜ぶ」を引くと，「破滅」「多難」「苦難」などが取得できます．
3.　「謳歌」を「破滅」と置き換えます．
そうして
`「人生の春を謳歌しています」`
が
`「人生の春を"破滅"しています」`
になります．

### 結果
```
「"幸せ"の多い生涯を送って来ました。」

「つまり、"判る"のです。
隣人の"苦しむ"の性質、程度が、まるで見当つかないのです。」

「女のひとは、死にました。
そうして、自分だけ"幸せ"。」

「神に問う。
"誠実"は罪なりや。」

「人間、"勝者"。
もはや、自分は、完全に、人間で無くなりました。」
```

とても幸せそうになりました！
あの有名はフレーズの
`「恥の多い生涯を送って来ました。」`
が
`「"幸せ"の多い生涯を送って来ました。」`
と順風満帆で幸せな人生を送って北ことがわかります．

もう一つの有名なフレーズの
`人間、失格。`
が
`人間、"勝者"。`
になっています．
人間関係良好で，ちゃんと仕事して，お酒に溺れないような人生だったのでしょうね．

### 結論
それなりに"幸せ"になれた．
MySQLで時差を補正（時刻の加算更新）したときのメモ

米国山岳部標準時（MST）で記録されてしまったテーブルの日時フィールドを、**SQL**で日本標準時（JST）に書き替えた。
今後も度々ありそうなので、自分用にメモする。

# SQLコマンド
MSTとJSTの時差である16時間を足す、という操作になる。

### 日時フィールドが`DateTime`型の場合

```sql
UPDATE t_rawdata SET TargetTime = (TargetTime + INTERVAL 16 HOUR) WHERE ID = xxx;
```

### 日時フィールドが`UNIX time`の場合 
日時フィールドが`unsigned int`型や`time_t`型の **[UNIX time](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)**（協定世界時UTCの1970年1月1日からの経過秒数）なら秒換算する。

```sql
UPDATE t_rawdata SET TargetTime = (TargetTime + 16 * 60 * 60) WHERE ID = xxx;
```

UNIX time は`from_unixtime()`で整形できる。

```sql
SELECT
    ID,
    yyy,
    from_unixtime(min(TargetTime), "%Y/%m/%d %H:%i:%S") as start_time,
    from_unixtime(max(TargetTime), "%Y/%m/%d %H:%i:%S") as end_time
FROM t_rawdata
WHERE ID = xxx
GROUP BY yyy ORDER BY end_time;
```

シェルスクリプトからなら`date -d '@1234567890'`という感じ。

# UNIX timeをExcelで表示するには
`= ( UNIX time の列名 + 32400 ) / 86400 + 25569` でExcelのシリアル値に変換できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/df6eb457-03e2-9d42-7329-b7eeaff58097.png)

シリアル値は、[セルの書式設定] から任意の日付フォーマットで表示できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/b81010d9-a30a-2abe-f4e6-5ac9343337c2.png)
初めてFigmaを使う時にエンジニアが押すボタン

Figmaが多機能すぎて操作に手間取ったので、初めに覚える必要最低限の機能・操作をメモ。

----

### ヘッダーメニューのカーソルボタン
この状態で要素をシングルクリックすると、要素の選択ができる。
![スクリーンショット 2020-02-28 1.11.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197129/0858384e-f573-485e-a867-b9e12295ff52.png)

### Codeボタン
要素選択中に他の要素にカーソル当てると要素間の距離が表示されるようになる。
サイズやフォント、色などの情報がここで取得できる。
![スクリーンショット 2020-02-28 1.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197129/c141ece7-5393-4ee7-14e1-ed121236c636.png)

プラットフォーム別に実装コードサンプルが生成される機能があるので、
デザイン再現にあたり言語によっては複雑だったり馴染みのない実装になるものでも時間をかける必要なし！
![スクリーンショット 2020-02-28 1.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197129/9ea69e51-c793-dcd8-c4ec-d27826c86010.png)

### Designボタン
ここの機能で要素を素材としてエクスポートできる。
![スクリーンショット 2020-02-28 1.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197129/88e4f1ef-33dc-05f5-36a4-51718c09c13e.png)
Codeforces Round #624 C. Perform the Combo

https://codeforces.com/contest/1311/problem/C

# 概要
- 半角英字で組み合わされた文字列sをタイピングし終わるのに、各キーは何回打たれるか出力しろ
- ただし、そのトライ中、数列$p = [ p1, p2, ... , pm ] $においてi回目にその$p_{i}$文字目を打ち間違えてしまう。この際、最初から文字を打ち直す。
- `尚、打ち間違えた文字も「打たれた文字」としてカウントすること。（「打とうとした文字、と解釈したほうがスムーズですね）`

# 例:
$s="abca", p=[1,3] $とした場合、$ a -> abc -> abca $ となるので、答えは、$[4, 2, 2]$となる。

# アプローチ
愚直に上記のシミュレーションをしてしまうと、$O(2 \cdot 10^{9})$となり、間に合わない。

このため、あらかじめ、$n 文字目までに打たれる文字数$ を記録しておく。上記の例をとると、

```
1文字目a: [1, 0, 0]
2文字目b: [1, 1, 0]
3文字目c: [1, 1, 1]
4文字目a: [2, 1, 1]
```
となり、$p=[1,3]$とは、「1文字目まで打ち込み」「3文字目まで打ち込み」「最後まで(=4)まで打ち込んだ」ということに他ならないので、
`[1,0,0] + [1,1,1] + [2,1,1]` = `[4, 2, 2`と計算できる。

```Python
from copy import deepcopy
q = int(input())
for _ in range(q):
    n, m = map(int, input().split())
    s = input()
    datp = list(map(int, input().split()))
    kmap = [0] * 26
    totalkey = []
    for i in range(n):
        # a=0, b=1
        c = ord(s[i]) - ord('a')
        kmap[c] += 1
        totalkey.append(deepcopy(kmap))
    res = [0] * 26
    for i in range(m):
        #print("i", i)
        for k in range(26):
            res[k] += totalkey[datp[i] - 1][k]
    for k in range(26):
        res[k] += totalkey[-1][k]
    print(" ".join(list(map(str, res))))
```
https://codeforces.com/contest/1311/submission/71786585
オレ プログラム ウゴカス オレ ゲンダイ イケル

# オレ プログラム ウゴカス オレ ゲンシジンゴ ハナセル
僕らは [@Harusugi](https://qiita.com/Harusugi) さんと [COTOHA API](https://api.ce-cotoha.com/contents/index.html) のおかげで、僕らの言葉を[原始人語](https://qiita.com/Harusugi/items/f499e8707b36d0f570c4)に翻訳することができるようになった。

現代人語から原始人語への翻訳は [COTOHA API](https://api.ce-cotoha.com/contents/index.html)を使えば、簡単に実現できる。
[1] 入力文を COTOHA API で解析する
[2] 解析結果から助詞を除去する
[3] 各 token の読み（カタカナ）を出力する

これだけで、僕らは原始人語を話すことができるようになる。

例えば、「私はたわしを買った」は「ワタシ タワシ カッタ」となる。 ※適宜、半角SPCを入れています

これなら原始人にも理解できるだろう。
これで、僕らは原始人とコミュニケーションできる、と思った。

しかし、コミュニケーションは双方向だ。
僕らが一方的に原始人語で話しかけるだけではなく、僕らが原始人の言葉を理解できなくてはならない。
僕らは原始人のカタカナのみの言葉を理解できるのだろうか？
そこで、原始人語を現代人語に翻訳する方法を考えてみる。

# オレ ゲンダイジンゴ ハナシタイ
原始人語を COTOHA API で解析できるだろうか？
原始人語の「ワタシタワシカッタ」（現代人語：私はたわしを買った）を COTOHA API で解析してみると、「ワタシタワシカッタ：名詞」と解析されてしまう。
連続するカタカナ文字列は一語の名詞と解析されるようだ。
これでは言語処理ができない。

そこで、原始人語から現代人語への翻訳は　原始人語（カタカナ文字の系列）⇒現代人語（token の系列）とみなして、deep learning のニューラル機械翻訳でも使われている seq2seq で原始人語を現代人語に翻訳することにする。

実際には[『詳解 ディープラーニング 第2版』](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-TensorFlow-Keras%E3%83%BBPyTorch%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0/dp/4839969515)を参考にして、英日データの5万文の日本語データから原始人語⇒現代人語のデータを生成し、LSTM で学習してみた。

ちなみに、↑の本では学習と翻訳がひとつのプログラムになっているが、学習後に save_weights() で学習結果を保存し、予測時には保存したデータを読み込むようにしてみた。、

# オレ ガクシュウシタ
学習後に、学習データの原始人語を LSTM で翻訳してみた。

入力（原始人語）：ワタシテニスブインデス。
出力（現代人語）：私はテニス部員です。

入力（原始人語）：パソコンツカイカタシッテイマスカ。
出力（現代人語）：パソコンの使い方を知っていますか。

入力（原始人語）：ワタシキミシンライシテイル。
出力（現代人語）：私は君を信頼している。

入力（原始人語）：ボクテレビミルノアキタヨ。
出力（現代人語）：僕はテレビを見るのに飽きたよ。

入力（原始人語）：ハハワタシバースデーケーキツクッテクレルダロウ。
出力（現代人語）：母は私にバースデーケーキを作ってくれるのだろう。

原始人はけっこう文化的な生活を送っているのか、テニス、パソコン、テレビもちゃんと翻訳できている。

学習データに含まれないテストデータでも、それなりの結果が得られるようになった。

入力（原始人語）：カレラワタシヒトリソコイカシタ。
出力（現代人語）：彼らは私を一人でそこに行かせた。

入力（原始人語）：コノモンダイカンタンデハナイ。
出力（現代人語）：この問題は簡単ではない。

入力（原始人語）：エイゴハナセタライイノダガ。
出力（現代人語）：英語を話せたらいいのですが。

# オレ ゲンダイ イケルカ
現代人語から原始人語への翻訳は、うまくいかない場合もある。

入力（原始人語）：フナタビトテモタノシイ。
出力（現代人語）：船旅はとても楽しい状態。

入力（原始人語）：ワタシカゾクイッショキャンプイッタ。
出力（現代人語）：私の家族は昨日１へ行った。

原始人語を完全に翻訳できるところまではできなかった。
原始人の皆様には多少の不便が残るけれど、ぜひ現代に来てほしい。
Google Cloud PlatformにOAuth 同意画面のスコープを追加する

# はじめに
会話の内容を分析することで、フリーランスの作業を見える化する時間管理ツール「[CotoGoto](https://www.cotogoto.ai/)」を提供していますが、

CotoGoto(コトゴト)
https://www.cotogoto.ai/

作業時間や予定を登録した時にGoogle カレンダーに連携をしており、OAuth経由でGoogle カレンダーのAPIを利用するアプリケーションでは審査が必要になりました。無事に通過したので経緯と、受けた指摘事項を紹介します。

* 審査をクリアしていないアプリはOAuth認証画面で**未認証アプリ**の警告が表示され、ユーザ数にも制限がかかるらしい。


前までは大丈夫だったのにいつの間にか警告が出ていたので、対応しました。
もうちょっとメールとかをみて、仕様の変更は目を通さないといけないですね、、、

# 経緯

## ユーザーコメントで指摘を受ける。

Google homeの認証で、「ログインしようとしたら信用のできないサービス云々といわれたので、使うのやめましたー」っというコメントがありました。
調べると**「10月21日からセンシティブなスコープの認可を求めるアプリでは、OAuth同意画面で警告を出すよ」**とのこと。

## 申請

![FireShot Capture 146 - 同意画面 - linedesign - Google Cloud Platform - console.cloud.google.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/fb22c8d6-9f8d-412b-4a0d-7467ef3f1523.png)


Google People APIのJavaライブラリを使って、カレンダー許可`https://www.googleapis.com/auth/calendar`を指定していましたが、同意画面の設定項目において明示しました。

![FireShot Capture 145 - 同意画面 - linedesign - Google Cloud Platform - console.cloud.google.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/d8d6ba6a-5a12-6255-2727-69064426ed28.png)


`確認のため送信`というボタンが増えており、これが申請ボタンでした。


## 次の日

次の日にはメールの返信があり、以下の内容で届いていました。※英語できます。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/9abf73b5-feab-d3d8-33c7-226689226dd0.png)


確認プロセスを続行するには、OAuthスコープを使用してアクセスするデータの使用方法を示すYouTube動画へのリンクを作成して提供する必要があります。具体的には、デモビデオの詳細を英語で記載する必要があります。

* プロジェクトにログインする方法（クライアントIDを含むURLバーがはっきり見えるようにする）

* OAuthトークンをリクエストする方法（OAuth同意画面/許可ページ）

* プロジェクトの機能がリクエストされたスコープをどのように利用するのか<br>：https://www.googleapis.com/auth/calendar

注：デモで個人的に目立つ必要はなく、ビデオのナレーションを付ける必要もありません。キーボード/画面ビューからプロセスを実演するだけで十分です。

実はこのメール内容はあまり読まずに **「YouTube動画」**だけを送信していまい、何回かやり取りがこの後続きます。

## 1回目の動画送信

全然ダメでしたね。いろいろ指摘されました。。。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/fcf739b4-afa9-00ed-1fcf-e729bb22dfa8.png)

* スクリーンキャストがYoutubeでホストされていることを確認してください。
* 検索バーにURLが表示されるように、スクリーンキャストで画面全体が表示されることを確認してください。
* ビデオが許可ページを公開していることを確認してください。 許可ページに、このフォームでリクエストされている正しいスコープが表示されていることを確認する必要があります。
* 許可ページが正しいプロジェクト番号に接続されていることを確認してください。 このメールに添付されている写真を参照して、ビデオがこの厳しい要件を満たしていることを確認してください。

![Client_id (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/c7c70f77-8da0-7f80-5284-672e44bcf8d2.png)

![Permission_page (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/c40952b9-e114-51f7-3ecc-0018ad69c055.png)


## 2回目の動画送信

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/20e26723-a09f-6874-8623-323467299187.png)

プロジェクトリクエストOAuthトークンにログインするプロセスを示すデモビデオと、英語に翻訳されたWebページを含むYouTubeリンクを提供してください。 Google Translate拡張機能を使用すると、これを行うのに役立つ場合があります。

日本語サイトの画面キャプチャなので、翻訳したやつを動画にして送ってみました。

なので、メールへの返信で再レビューを依頼しました。

## 審査通過

また翌日の早朝に返信があり、無事に審査を通過しました。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/a12d5aa4-d311-1d47-e812-b7b553b6cce2.png)

あれですね、、、
最初にメールをよく読んで返信していれば、何回もやり取りが発生しなかったのですが、とりあえず送っちゃえ的な勢いで送ったので出戻りが発生しましたが、審査自体は結構簡単に通りますね。

これで、正常に認証がされるようになりました～。
【Laravel6系】php artisan make:authが使えない問題の対処法

####はじめに
Laravelの６系から `php artisan maek:auth` コマンドを使用すると下記画像のメッセージが出てしまいます。
![スクリーンショット 2020-02-28 0.20.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283595/21b91f29-02ff-1ed6-c355-8082b0df382f.png)


[こちらの記事](https://qiita.com/hetare_phper/items/654f7a9171ae5ccf3e83)を見て環境構築をする度に出くわして、その度々で解決方法を調べていたのでそろそろ言語化して記憶の片隅に残しておきます。

####開発環境
| 言語・FW     　　　 |   バージョン      |    
|:-----------------|---------------:|
| Laravel          |        6.14.0  |
| PHP              |        7.2.26  |

####何が変わったのか
Laravel6系から認証機能（[Laravel/ui](https://github.com/laravel/ui)）が別パッケージとして管理されるようになりました。そのためまずはcomposerでパッケージをインストールしましょう。

####composerでlaravel/uiのインストール
```
~/workspace/sampleProject/src/ $ composer require laravel/ui

Using version ^1.2 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravel/ui (v1.2.0): Loading from cache
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
```

####php artisanコマンドの実行
今回[こちらの記事](https://qiita.com/hetare_phper/items/654f7a9171ae5ccf3e83)でDocker環境でLaravelの開発構築を行ったので、コンテナ内で `php artisan`コマンドを実行します。

```
~/worksoace/sampleProject $ docker-compose exec php bash

// 下記からphpコンテナ内
root:/var/www/# php artisan ui vue --auth

Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.

 The [auth/login.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [auth/passwords/confirm.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [auth/passwords/email.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [auth/passwords/reset.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [auth/register.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [auth/verify.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [home.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
 The [layouts/app.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes
Authentication scaffolding generated successfully.
```

####まとめ
これで下記ルーティングの通りLaravel６系でもLaravelデフォルトの認証機能を使うことができるようになりました。
![スクリーンショット 2020-02-28 0.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283595/c2785a9a-7601-f8d9-59c5-273bc85b0818.png)
テキスト音楽「サクラ」で微分音（19平均律）を鳴らして遊ぶ

#サクラで微分音（19平均律）
サクラというのは、[テキスト音楽「サクラ」](https://sakuramml.com/)のことだ。ドレミファの音名でも曲が書けるし、BASICみたいなプログラムで曲を表現することもできる、なかなか愉快なフリーソフトだ。もちろん和音も鳴らせるし、ポルタメントなんかもちょちょいのちょいだ。で、[19平均律はWikipedia](https://ja.wikipedia.org/wiki/19%E5%B9%B3%E5%9D%87%E5%BE%8B)を見てもらいたい。それだけで、別にどうということはないが、下記のような感じで、19平均律も楽しく遊べる。

個人的には、19平均律で曲を作って、ヴォーカルは近い音程の12平均律に丸めたMusicXMLを生成して、AIきりたんに歌ってもらって、19平均律との誤差をAudacity with pythonで修正して19平均律上の音を復元し、伴奏をサクラで鳴らせようかな、なんて思ってやり始めてみたのだが、いつもながら趣味だと限りなくやりたいことが発散して、なかなかアウトプットにならない。だって、4和音の構成音を60～180セントくらいの滑らかな幅で動かすだけで、凄くマジカルな和声進行ができるんだぜ。和声で遊ぶだけで余暇を使い切っちゃうのだ。なので、小ネタをQiitaに書いておく。

そんなわけでみんな、微分音で楽しもう。12平均律はもうそろそろ飽きたよね？

```
Function Note19(val,octave=5){
	Switch(val){
		Case(0){FineTune(64) n(0+12*octave)}
		Case(1){FineTune(40) n(1+12*octave)}
		Case(2){FineTune(81) n(1+12*octave)}
		Case(3){FineTune(57) n(2+12*octave)}
		Case(4){FineTune(34) n(3+12*octave)}
		Case(5){FineTune(74) n(3+12*octave)}
		Case(6){FineTune(51) n(4+12*octave)}
		Case(7){FineTune(91) n(4+12*octave)}
		Case(8){FineTune(67) n(5+12*octave)}
		Case(9){FineTune(44) n(6+12*octave)}
		Case(10){FineTune(84) n(6+12*octave)}
		Case(11){FineTune(61) n(7+12*octave)}
		Case(12){FineTune(37) n(8+12*octave)}
		Case(13){FineTune(77) n(8+12*octave)}
		Case(14){FineTune(54) n(9+12*octave)}
		Case(15){FineTune(94) n(9+12*octave)}
		Case(16){FineTune(71) n(10+12*octave)}
		Case(17){FineTune(47) n(11+12*octave)}
		Case(18){FineTune(88) n(11+12*octave)}
		Case(19){FineTune(64) n(12+12*octave)}
	}
}
@(Violin)
q(95)
l(16)
Note19(0,5)
Note19(11,5)
Note19(0,6)
Note19(11,5)
l(8)
Note19(2,5)
Note19(3,5)
Note19(5,5)
Note19(6,5)
Note19(9,5)
Note19(13,5)
```
git pull origin masterしたら「error: Your local changes to the following files would be overwritten by merge」となる

## 事象

`master`ブランチを親とする`feature`ブランチをチェックアウトした状態で`git pull origin master`をしたら、「error: Your local changes to the following files would be overwritten by merge」となった。

```shell
$ git branch
  master
* feature
$ git pull origin master
From github.com:Example-Git/api-repo
 * branch            master     -> FETCH_HEAD
Updating 5966be1..1c8aaff
error: Your local changes to the following files would be overwritten by merge:
        Makefile
Please commit your changes or stash them before you merge.
Aborting
```

## 原因

`master`ブランチの変更により上書きされるファイル`Makefile`が、ローカルの`feature`ブランチで変更されたまま未コミットであったためだった。

```shell
$ git status
On branch feature
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Makefile

no changes added to commit (use "git add" and/or "git commit -a")
```

## 解消

`Makefile`の変更はコミット不要だったので、`git checkout`により変更を破棄したら正常に`git pull origin master`できた。

```shell
$ git checkout Makefile
$ git status
On branch feature
nothing to commit, working tree clean
$ git pull origin master
From github.com:Example-Git/api-repo
 * branch            master     -> FETCH_HEAD
Updating 5966be1..1c8aaff
Fast-forward
 Makefile                                                     |    3 +-
 sam.yml                                                      |   26 +
 2 files changed, 28 insertions(+), 1 deletions(-)
 create mode 100644 src/handlers/__init__.py
```

以上