OmniAICreator/Qiita-1.07M huggingface dataset:
Mysql:AutoIncrementIdを推測するワザ

## 概要
バイナリサーチでAIDを推測するだけ
## ありがちな遅いクエリ
```
SELECT *
FROM `sugoi_table`
WHERE `create_time` >= '2019-10-01'
(48,126 合計, クエリの実行時間 28.3798 秒)
```

### Explainの結果
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| ---- | ---- | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 1 | SIMPLE | sugoi_table |range|PRIMARY|PRIMARY|4|NULL|32715643|Using where|

**rows(走査範囲)が多すぎる!!**

* MySQLは「1番目のレコードから全てのレコードのcreate_timeが10/1より大きいか？」を判断するので大変遅い
* 本番write用のDBにこんなもん流した日にはしばらくサービスが反応しなくなる
* せめて迂闊なselectを投げる前にindexが効いてるか確認しよう・・・

## シンプルな解決方法
### AIDで走査範囲を絞る

```
SELECT *
FROM `sugoi_table`
WHERE `user_id` >=50000000
AND `create_time` >= '2019-10-01'
(48,153 合計, クエリの実行時間 0.0621 秒)
```

**早くなった**
### Explainの結果
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| ---- | ---- | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 1 | SIMPLE | sugoi_table |range|PRIMARY|PRIMARY|4|NULL|500844|Using where|

**rowsが3200万→50万に減ったのが要因**

* 適当に作った調査クエリを流して「結果が返ってこない・・・」とかなりそうな時は事前に使おう

## だがしかし、それっぽいAIDを調べるのが面倒くさい！！

### create_timeで二分探索(バイナリサーチ)すればいい

[アルゴリズムを勉強するなら二分探索から始めよう！ 『なっとく！アルゴリズム』より](https://codezine.jp/article/detail/9900?p=2)

### 文字が読みたくない人向け

* 全体の中心のデータを見て「大きい」なら後ろ、「小さい」なら前を繰り返して検索する方法
* 計算量はO(log2 n)だそうな

## 実装してみる
```
/**
 * 指定テーブルの指定日付のAIDを推測する
 */
public static function guessAid( $tableName, $targetKey, $targetDateTime) {

	//まず最大のAIDを取得する
	$maxId = self::_getMaxAid($tableName, $targetKey);

	$low	= 1;
	$high	= $maxId;
	$loopCnt = 0;
	$guess	= 0;

	while ( $low <= $high ) {
		$loopCnt++;
		$mid = (int)(($high + $low) / 2); //中央値を作成 floatにならないように
		$sql = "SELECT create_time FROM {$tableName} WHERE {$targetKey} >= {$mid} LIMIT 1";
		$tmpData = Db::query($sql);
		if ( empty($tmpData)) {
			//データが無い時の処理(投げやり);
			break;
		}
		if (strtotime($tmpData['create_time']) < strtotime($targetDateTime)) {
			//時間が小さい時に推測候補を保持しておく
			//逆条件の時にループが終わると指定時間ちょい後のAIDになってしまう場合がある為
			$guess = $low; 
			$low = $mid + 1;
		} else {
			$high = $mid - 1;
		}
		//データが消されている可能性も考慮して一定ループで抜ける
		if ( $loopCnt >= 50 ) {
			break;
		}
	}
	//echo("だいたいこの辺じゃろ");
	$id = $guess;
	return $id;
}

/**
 * テーブルのMAX_AIDをとる
 */
private static function _getMaxAid( $tableName="", $targetKey="") {
	$sql = "SELECT MAX({$targetKey}) FROM {$tableName}";
	$data = Db::query($sql);
	return $data;
}
```
TypeScript any型から学ぶ健全な技術選定

詳しくは割愛しますが、先日 TypeScriptの`any`型に対するスタンスでTwitter等で論争が起きるという事象が発生していました。TypeScriptはJavaScriptの互換性の点で、とても素晴らしい利点を持つ言語です。ただ同時に、JavaScriptの負債をモロに受けてしまうという点で非常に繊細な言語であるとも言えます。技術選定には、健全な理由と不健全な理由がそれぞれ存在し、それらを慎重に加味しなければ、不利益を被ることがあります。そもそもこのような論争が発生しながらも、無理して使い続けてしまうことが今回もっとも不健全だと強く感じました。

`any`型を持つTypeScriptを選ぶべき健全なケースとして次のようなケースが考えられます。JavaScriptの資産が多く残っており、徐々に移行を進めるというシチュエーションでは、any型を使い十分推論可能な部分から型を明示していくなど`any`型が十分活躍し`any`型 == 悪　ではありませんし、むしろ歓迎すべきポイントとなります。

逆に新規開発をする上で、TypeScriptを熟達した人間ばかりでなく、不用意に`any型`を使用してしまいJavaScriptと変わらないか、それよりも悪化してしまうようなケースを**不健全**であると感じます。もちろんtsconfigやeslintを使えば`any`だけでなく他の罠を回避することができますが、キチンと設定しなければならない。せっかくのJavaScriptの自由さが損なわれてしまう。などの不健全さはすべて拭い切ることはできません。今回の論争を鑑みるに健全さをキープできない環境が多いのではないかと推測できました。

それでは、なるべく不健全さが生じない健全な言語の選び方に、どのような駆け引きがあるでしょうか？ 例えば、[elm](https://elm-lang.org)のようにany型が存在しない言語を選ぶこともできます。そもそも存在しないものに関して議論する余地は起き得ないのです。とても健全ですね？ もちろんすべてのケースにおいてelmが健全ではありません。どのようなケースにも不健全さは生じます。例えば、JavaScriptの資産を使うだけで運用し続けれてしまう場合には、わざわざelmを使わなくても良いですし、JavaScriptの資産を無理やり呼び出す(JavaScriptのコードを呼び出す[ports
](https://guide.elm-lang.jp/interop/ports.html)という仕組みがあります)のは利点をかなり殺してしまいます。

# 以下、単なるelmの宣伝です。苦手な方はお気をつけください。

他、TypeScriptを使っていて不健全だと思い、Elmで解決できるという点を列挙したいと思います。

- 実行時エラーが起き、その度デバッガを見ている -> [No Runtime Exceptions](https://elm-lang.org)
- VDOMのパフォーマンスが気になる -> [Great Performance](https://elm-lang.org)
- package.jsonの管理が煩雑で、依存関係解決に工数がかかってしまう -> [Enforced Semantic Versioning](https://elm-lang.org)
- アセットサイズが重くなってしまう -> [Small Assets](https://elm-lang.org/news/small-assets-without-the-headache)
- コンパイル時間が遅い -> [Compile Times](https://elm-lang.org/news/small-assets-without-the-headache)
- エラー文章がわかりにくい -> [親切過ぎるエラーメッセージを届ける言語 Elm
](https://qiita.com/ababup1192/items/8dae437da47f25811658)
- 機能が多くキャッチアップや教育に時間がかかってしまう -> [all syntax](https://elm-lang.org/docs/syntax), [elm-guide](https://guide.elm-lang.jp)
- 状態管理やMiddlewareのライブラリ選ぶに困ってしまう -> [The Elm Architecture](https://guide.elm-lang.jp/architecture/)
- イミュータブルを導入するために特定のライブラリに依存してしまう -> [elm core packages](https://package.elm-lang.org/packages/elm/core/latest/)
- 複雑なフォームに対応できない -> [フォームバリデーションからフォームデコーディングの時代へ](https://qiita.com/arowM/items/6c32db1f9e4b92445f3b)

以上のどれかに多く時間を割いてしまった経験がある方は、是非elmを検討してみてください。学習コストを払うだけの価値は十分にあるはずです。WEBフロント開発をするときのデファクトスタンダードの一つとなることを願っています。少しでも不健全な状態が減ると良いですね！
railsでscopeがnilを返すとallが返る

### railsのscope
- 文字通り、そのクラスの一部のインスタンスを返します
- 意外と知られてないですが、nilを返すとallが返ります
- クラスメソッドと全く同じ挙動ではない。classメソッドはnilを返せばnilが返る

scope

```ruby

[1] pry(main)> class User < ApplicationRecord
[1] pry(main)*   scope :nil_scope, ->() {  
[1] pry(main)*     nil    
[1] pry(main)*   }    
[1] pry(main)* end  
=> :nil_scope
[2] pry(main)> User.nil_scope
  User Load (4.0ms)  SELECT `users`.* FROM `users`
=> [#<User id: 1, email: "xxx@gmail.com", created_at: "2018-04-14 12:05:50", updated_at: "2019-09-05 01:01:24", provider: "facebook", uid: ...]

pry(main)> User.nil_scope.size
   (0.9ms)  SELECT COUNT(*) FROM `users`
=> 355
```

class method

```ruby
[1] pry(main)> class User < ApplicationRecord
[1] pry(main)*   def self.nil_scope
[1] pry(main)*     nil
[1] pry(main)*   end  
[1] pry(main)* end  
=> :nil_scope
[2] pry(main)> User.nil_scope
=> nil
```
Azure Notification Hubを使ってC#でiOSアプリにプッシュ通知を送信

#はじめに
Azure Notification Hubを使ってC#でiOSアプリにタグ指定でプッシュ通知を送信するメモ。
Azure Notification Hubを使うと、任意のデバイスに任意のタグ指定（スマホアプリ側で指定した任意の文字列）で
送信することができるので実装が楽。

#環境
・Azure Notification Hub
・Windows 10 Pro
・C#（Visual Studio 2019）
・.NET Core 2.1
・コンソールアプリケーション
・使用したデバイス　iPad Air

#事前準備
１．Azure Notification Hubの構築
APNSの設定等あるので詳細はMicrosoftのドキュメントをご確認ください。
　　
作成時に以下の情報をメモ
・Notification Hubの名前
　　-> Overview/Name
　　　　
・Notification Hubの接続文字列
　　-> Manage/Access Policiesの送信権限が付与されているPolicyのConnection String
　　　（デフォルトだと：DefaultFullSharedAccessSignatureのほう）


２．スマホにテスト用アプリをインストール
・接続時に指定したTagをメモ


３．NuGetで使用するパッケージをインストール

Visual Studioでプロジェクトを開き
NuGetパッケージマネージャで以下のパッケージを検索しインストール
　　
・Microsoft.Azure.NotificationHubs(作成者:Microsoft)


#実装

```C#:Program.cs
using Microsoft.Azure.NotificationHubs;
using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "Azureに作成したNotificationHubのConnection String";
            string hubName = "送信対象のハブ名";
            string payload = @"{""aps"":{""alert"":""test""}}";
            string tag = "送信対象のタグ";

            // クライアントを作成 
            var client = NotificationHubClient.CreateClientFromConnectionString(connectionString, hubName);

            // iOSにタグ指定でJsonデータを送信
            var task = client.SendAppleNativeNotificationAsync(payload, tag);
            
            // AndroidもSendFcmNativeNotificationAsyncを使うことで簡単にできそうだが未確認
            
            // ～以下略～
        }
    }
}
```
mysqldumpで最低限必要な権限

# 結論
`GRANT SELECT, SHOW VIEW, TRIGGER ON *.* TO 'ユーザー名'@'接続元';`

# 理由
> ダンプされるテーブルに対する SELECT 権限、ダンプされるビューに対する SHOW VIEW、ダンプされるトリガーに対する TRIGGER、および --single-transaction オプションが使用されない場合には LOCK TABLES が少なくとも必要です。

参考：https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html

# 備考
特定のDBのみをdumpしたかったものの、
調べていて「そんな権限必要？」ってなったので調べてみました。

# きっかけ
DB間で同期(レプリケーションではない)をとりたくて調べていたら、
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.SmallExisting.html
これが出てきて、適切な権限を付与したくなったので調べてみました。
[量子コンピューター]Qisikitでアダマールゲートを実装する


```<img width="397" alt="スクリーンショット 2019-10-04 22.28.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278640/3a5efe52-4b35-b483-35b1-241675565c91.png">


はじめに、仮想環境を構築します。


```ruby:create_env
$ conda create -n envname python=3 
```

envnameには、仮想環境の名前を入れます。

conda info -eで自分の作った仮想環境の一覧を見ることが出来ます。

```
$ conda info -e
```


```
$ source activate name_of_my_env
```

qiskitをインストールします。

```
$ pip install qiskit
```


```python

import numpy as np
from qiskit import *
%matplotlib inline
```

量子回路を作成するにはQiskit内のQuantumCircuitというモジュールを使います。()の中は使用するqubitの数です。

```python

circ = QuantumCircuit(3)
```

続いてアダマールゲートの実装の仕方です。hがアダマールゲートを指し、()内の数字は何qubit目の量子ゲートを使用するかを表しています。


```python

circ.h(0)
```

結果はこのようになります。

<img width="421" alt="スクリーンショット 2019-10-04 22.52.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278640/81e49b4e-f6ee-d49c-686c-6670b86cc005.png">


こうしてアダマールゲートをqiskit上で実装することが出来ました。


Qiskitのインストール
https://qiskit.org/documentation/locale/ja/install.html
Qiskitでアダマールゲートを実装する
https://github.com/Qiskit/qiskit-iqx-tutorials/blob/master/qiskit/fundamentals/1_getting_started_with_qiskit.ipynb

----------------------------------------------------------
SQL小技集
https://qiita.com/ool/items/75da830e7373138c8125
UTCとJST
https://qiita.com/ool/items/6be9cc290c8ad9e0f5bc
今流行りの量子コンピューター
[量子コンピューター]Qisikitでアダマールゲートを実装する
https://qiita.com/ool/items/1a5041edddc11b14efc0
[Qiskitのアカウント認証の仕方]Qiskit IBMQ プロバイダー
https://qiita.com/ool/items/e80c1266cda68984a103
Qiskitの使い方
https://qiita.com/ool/items/2227d2d515caa5087752
[量子コンピューター]Qiskit Tutorials
https://qiita.com/ool/items/2a5038df1471635d442c
Cloud CDN 署名付き URL を作るプログラムの Node.js 向けサンプル

# 概要

https://cloud.google.com/cdn/docs/using-signed-urls?hl=ja の"署名付き URL をプログラムで作成する" のところに Node.js のサンプルプログラムがないので作ってみた。

# 準備

```bash
$ npm i -S urlsafe-base64
$ npm i -S crypto
$ npm i -S moment
```

# サンプルプログラム

```javascript
const URLSafeBase64 = require("urlsafe-base64")
const crypto = require("crypto")

function signUrl(url, expiration, keyName, key) {
  const decodedKey = URLSafeBase64.decode(key)

  const sep = url.indexOf("?") != -1 ? "&" : "?"
  const signingUrl = `${url}${sep}Expires=${expiration}&KeyName=${keyName}`
  const signature = crypto.createHmac("sha1", decodedKey).update(signingUrl).digest()

  const encoded = URLSafeBase64.encode(signature)
  return `${signingUrl}&Signature=${encoded}`
}
```

# 使い方例

引数 key は、この例のように BASE64 エンコードされたものです。これは Cloud DNS の URL 署名鍵で自動生成されたものを使うことができたり、自分で作ったものを使うことができます。しかし、その**署名鍵は安全に保管**してください。
誤ってGitHubの公開リポジトリーに公開するとか、Webで公開してしまうとかいったことがないようにしてください。

```javascript
const moment = require("moment")
const url = signUrl("https://myhost/path/to/image.jpg", moment().add(1, "hours").unix(), "my-key", "YmFzZTY0ZW5jb2RlZAo=")
```
【Rails】turbolinksをfalseのページとtrueのページに分ける

こんばんは！
ポートフォリオ作成中にハマったエラーの簡単な解決方法を備忘録として。

## いいね機能をremote: trueで動かす

railsチュートリアルにて学習した`remote: true`を使ったajax通信。jsが苦手な私にぴったり！

#### turbolinksが必要みたい

`Uncaught ReferenceError: Turbolinks is not defined`

```js:application.js

/=require turbolinks

```

![demo](https://gyazo.com/4b5b599f4a790ac5058e625a51f528ac/raw)

動きます。

## 次はこっちが動かないのね

`<%= link_to "新規投稿", new_meal_path, class:'hoge'%>`に遷移して`file_field`に画像添付したらimageがpreview表示されなくなった

リロードすれば正常に動作します

![demo](https://gyazo.com/b0e602bcd628854e0fa00d06b7c7230b/raw)

## 解決方法

```erb:index.html.erb

<%= link_to "新規投稿", new_meal_path, class:'hoge',data: {"turbolinks"=>false} %>


```

`data: {“turbolinks" => false}`は遷移先ページのみturbolinksを切ることが出来ます

## まとめ

jsファイルにajax通信を記述すればturbolinksがtrueでも問題ないみたいです

`remote: true`を使ったajax通信とjsイベントを両方実装している時にどちらかのイベント発火しない場合があれば`data: {"turbolinks"=>false}`が役立ちます

#### 終わり
【Unity】Animationによるプロパティの変更を検知する

`void OnDidApplyAnimationProperties()` が使えます。

https://docs.unity3d.com/ja/2019.1/ScriptReference/UI.LayoutGroup.OnDidApplyAnimationProperties.html

```c#
// アニメーションのプレビューでも値をチェックしたいのでExecuteAlwaysする
[ExecuteAlways] 
public class Foo : MonoBehaviour
{
    public float foo; // TimelineとかAnimationでこの値を変更する

    void OnDidApplyAnimationProperties()
    {
        // ……すると、このメソッドが呼ばれる
        Debug.Log("foo changed!")
    }
}
```

どの値が変更されたのかはわからないので、古い値をとっておいて自分でチェックする必要があるっぽい。マジか……？

```c#
[SerializeField] private _foo;
float _lastFoo;

[SerializeField] private _bar;
float _lastBar;

void OnDidApplyAnimationProperties()
{
    if (_foo != _lastFoo)
    { 
        Debug.Log("foo changed!")
    }
    if (_bar != _lastBar)
    { 
        Debug.Log("bar changed!")
    }

    _lastFoo = _foo;
    _lastBar = _bar;
}
```

もっといい方法あれば教えてください。

## 参考

- TextMeshProの作者が困ってた様子 https://forum.unity.com/threads/help-please-with-animation-component-public-properties-custom-inspector.229328/
ts-node を使った TypeScript + node の環境構築

`Node.js` + `TypeScript` の環境構築手順の備忘録です。

## 最小構成(最小ではない)
`npm run start` で `main/app.ts`を動かす。

```package.json
{
  "dependencies": {
    "ts-node": "^8.4.1",
    "typescript": "^3.6.3"
  },
  "scripts": {
    "start": "ts-node main/app.ts"
  }
}
```

```tsconfig.json
{
  "compilerOptions": {
    "target": "es6",
    "outDir": ".dist",
    "sourceMap": true,
    "module": "commonjs",
    "strict": true,
    "moduleResolution": "node",
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "esModuleInterop": false,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true
  }
}
```
Swift5.1 dynamicMemberLookup^KeyPathを使ってSwiftにKotolinのapplyを実装する

### デモ

``` .swift
final class ViewController: UIViewController {
    override func loadView() {
        view = UILabel().apply { $0
            .text("Apply Swift")
            .textAlignment(.center)
            .textColor(.white)
            .font(.boldSystemFont(ofSize: 24))
            .backgroundColor(.black)
        }
    }
}
```

<img width="375" alt="Simulator Screen Shot - iPhone 8 - 2019-10-10 at 22.43.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166241/31904bd4-9ad3-746f-ddb2-e3839afc82fa.png">

---

私以外にもKotolinのapplyをSwiftでもやりたいと思ったことのある人はいるでしょう。
例えば以下のようにUILabelを定義する場面を考えます。

``` .swift
let label: UILabel = {
   let it = UILabel()
   it.text = "label.." 
   return it
}()
```

以前までは、以下のようなプロトコルを定義することで

``` .swift
protocol Applicatable {}

extension Applicatable {
  func apply(_ closure: ((Self) -> ())) -> Self {
        closure(self)
        return self
    }
}

extension NSObject: Applicatable {}
```

それっぽく実装することができました。

``` .swift
let label = UILabel().apply { it in
   it.text = "label.."
}
```


しかし言語の進化により、もっとKotolinのapplyに近づけることができるようになりました。
つい先日[DuctTape](https://github.com/marty-suzuki/DuctTape)というライブラリが公開されたのをきっかけにそれが可能になってたことを知りました。（Swiftのキャッチアップに遅れぎみです）


### dynamicMemberLookup 

Swift４.2で追加された機能ですが

``` .swift
@dynamicMemberLookup
struct StringMaker {
    subscript(dynamicMember value: String) -> String {
        return value
    }
}

let maker = StringMaker()
debugPrint(maker.id) // String: id
debugPrint(maker.name) // String: name
```

Swift5.1からKeyPathを使えるようになったみたいです。

```
@dynamicMemberLookup attribute requires ‘xxx’ to have a ‘subscript(dynamicMember:)’ method that accepts either ‘ExpressibleByStringLiteral’ or a keypath
```


これを使って参考ライブラリをパクりつつインターフェースの変更を40行程度実装すると

``` .swift
      let label = UILabel().apply { $0
            .text("Apply Swift")
            .textAlignment(.center)
            .textColor(.white)
            .backgroundColor(.black)
        }

debugPrint(label.text) // Optional(Apply Swift)
```

上記のような実装をすることができました。
一応ソースはGistに公開しておきます。

https://gist.github.com/churabou/7243d4ac9121a56513bb16023e3698f7
CakePHP3の嵌りポイント


CakePHPは簡単かつウェブサイトが楽に作れる大変ありがたいフレームワークですが、たまに嵌りポイントがあります。
使っていてハマった点を忘れないように纏めます。
- - -
##No.1 - patchEntity, save等で孫テーブルがうまく動かない(マージ/保存できない)
親-子-孫の関係になっているテーブルに対し、hasOne/hasManyも定義しているのに親テーブル追加/更新で孫まで上手く反映されない。子まではうまく動く、get/findもうまく動く、エラーは出ない。という場合。
例: Companies --(hasMany)--> Users --(hasMany)--> UserSettings

###可能性① associationの書き方が間違ってる
get()とは違い、**ネストした中にもassociatedを再度書く必要がある**。

```
#get()の場合
$query = $companies->get($id, [
    'contain' => [ 'Users' => ['UserSettings'] ]
]);

#newEntity/patchEntityの場合
$company = $companies->newEntity($data, [
    'associated' => [
        'Users' => [
            'associated' => ['UserSettings']
            // ↑ここにも'associated'が必要
        ]
     ]
]);
```
＊[公式マニュアル](https://book.cakephp.org/3.0/ja/orm/saving-data.html#converting-request-data)にも書いてあるものの、まさかget/findと違うことはないだろと思って読み飛ばしがち
＊参考にさせてもらったページ(https://qiita.com/zaramme/items/719f77480c5f0cde0ae1)
###可能性② Entityの$_accessibleに子/孫要素が入ってない
この指定がtrueになっていないと無視される。
bin bakeで自動で設定してくれるはずなものの、条件によっては？親側のEntityに書いてくれていない事があるようで、bakeしなおすか手動で追加が必要。
(普通にget/findしてアクセスするときと同様、hasOneなら単数形、hasManyなら複数形で子テーブルの名前を追加)

###可能性③ dirtyフラグが立ってない
newEntityやpatchEntityでエンティティ作成後、手動で何か追加/変更した場合、dirty()も呼ばないと更新対象にならない。([公式](https://book.cakephp.org/3.0/ja/orm/saving-data.html#id16))

```
$company->author->name = 'Master Chef';
$company->dirty('author', true);
```
- - -
##No.2 - 更新処理で子/孫テーブルのデータが追記/作り直される(delete/insertされる)
例: Users --(hasMany)--> UserSettings
親テーブル更新時に子テーブルのデータもまとめて更新したいが、親はupdate処理されるものの、子テーブルのデータはupdateしてくれず、追加(or deleteで一回消され、insertで新規保存)されてしまう場合。
(どっちになるかはsaveStrategy次第)
updateでないため子テーブルのprimary keyが変わってしまい、他との関係性が壊れる。

###可能性: 子/孫テーブルのprimary keyが渡されてない
Entityにprimary keyが無いとpatchしようがないので、追加/入れ直しになる。
ちゃんとあればupdate処理になる。

＊patchEntityに渡すデータ(フォームからの入力、get/findで取ってくるデータ)の両方にprimary keyが必要。
　つまりパッチ元のget/find時にも更新したい関係テーブルをcontainで指定しておく必要がある。

- - -
##No.3 - 単数/複数形の規約で混乱する
###単数/複数の変形
規約で使い分けた気持ちは分かるけど不規則の場合はどうする？
[実際のCakePHPの変換を出してくれるサイト](http://www.cpa-lab.com/tech2/inflects/)を参照。(古い？)
最新Verで動いている[cakePHP公式のサイト](https://inflector.cakephp.org/)もあり。
pokemonは単複同型です。


###DBからcontainで纏めて取ってきた子/孫テーブルの形は？
例: Companies --(hasMany)--> Users --(hasOne)--> Addressies

hasOne, belongsToは単数形、そのまま要素にアクセスできる。
`$user->address->street` ←addressと**単数形になる**

hasMany, belongsToManyは複数形で配列。
`$company->users[0]->name`

- - -
##No.4 - 関連テーブルでのwhereで失敗する
そんなカラム無いといわれて失敗する。
hasMany先相手だとSQLが分割されるが原因で、普通にwhereに書くだけではダメ。
目的によってcontainにfunctionを指定、queryBuilderを渡す、matchingを使ったりする。
[マニュアル参照](https://book.cakephp.org/3/ja/orm/query-builder.html#contain)
＊[参考](http://www.kojion.com/posts/537)

- - -
##No.5 - hasMany先の特定の1個だけくっつけて取得したい
[StackOverflowのここ](https://stackoverflow.com/a/30270675)が分かりやすい。
サブクエリで取ってくる「Join strategy - Using a subquery for the join condition」が個人的に好み。

- - -
##No.6 - DebugKitが動かない
[マニュアル](https://book.cakephp.org/debugkit/3.x/ja/)の通りではあるけど

###可能性① forceEnableしてない
安全のためローカル環境(localhostとか)出ないと動かないようになっている。
それでも動かしたい場合はマニュアルの通りforceEnableを設定する。
これが嫌なら、hostsにテスト環境をmytest.localとかで登録する手もある。

###可能性② pdo_sqliteが無い
デフォルトでSQLliteを使ってるので、pdo_sqliteが無い場合は入れてやる必要がある。
普通にlogs/error.logに出るけどブラウザからは特に何も言われないので。
FlutterにDIコンテナを自作する

#DIコンテナとは
インスタンスの生成方法を知っているもの。
利用者はインスタンスの作成方法を知らなくてもいい。
インターフェースを用意して、実装とモックを切り替えたり、シングルトンを作ったりできる。

##DIコンテナの作成
Laravelのサービスコンテナを参考にしました。

```dart
class Container {
  /// Typeをキーにするのがみそ
  static final Map<Type, Object Function()> _container = {};

  /// シングルトン
  static final Container _singleton = Container._();
  factory Container() {
    return _singleton;
  }
  Container._();

  /// インスタンスの生成方法を登録
  bind<T>(T Function() bind) {
    _container[T] = bind;
  }

  /// シングルトン登録
  singleton<T>(T singleton) {
    _container[T] = () => singleton;
  }

  // T型のインスタンスを自動で作成
  T make<T>() => _container[T]();
}
```
##つかう
```dart:クラスの作成
class Hoge{
  String getHoge() => "hoge";
}


class Api{
  Future<String> getJsonData() async{
    final response = await http.get('https://jsonplaceholder.typicode.com/todos/1');
    return response.body;
  }
}
class ApiMock implements Api{
  @override
  Future<String> getJsonData() async{
    return '{"userId": 1,"id": 1,"title": "delectus aut autem","completed": false}';
  }
}
```
```dart:コンテナに登録
main(bool debug) {
  final container = Container();

  // Hogeインスタンスの登録
  container.bind<Hoge>(() => Hoge());

  if (debug) {
    // デバッグがONのときはモックを登録
    // bindのジェネリクスにインターフェースになる側のApiを指定しておくのがみそ
    container.bind<Api>(() => ApiMock());
  } else {
    // 通常時
    container.bind<Api>(() => Api());
  }
}
```
```dart:DIの仕方
class HogeWidget extends StatelessWidget {
  // 自動的に型に合わせたインスタンスを生成してくれる
  // Apiがモックかどうかに依存せずに使える
  final Api _api = Container().make();
  final Hoge _hoge = Container().make();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _api.getJsonData(),
      builder: (context, snapShot) {
        if (!snapShot.hasData) return CircularProgressIndicator();
        return Text(_hoge.getHoge() + snapShot.data);
      },
    );
  }
}
```
【AWS lambda】update-function-configurationしようとして謎のエラーに焦った話

環境変数を指定しようとして

```
$ aws lambda update-function-configuration --function-name <関数名> --environment Variables={Key1=value1,Key2=Value2}
```

このコマンドを使おうとしたら、次のエラーが。

```
Unknown options : Variables=Key2=Value2
```

aws cliでは複数の環境変数の設定ができないのか....！！
と焦ったのですが、試行錯誤の末いくつかの解決策が。

#### 解決策1

**カンマの利用**
ってか、カンマが正しく認識されていない.....???
そこで**カンマの前にバックスラッシュ**を入れたらエラーが出ずに通りました。

ちなみに、macで「\(バックスラッシュ)」の出し方は、「Option」+「¥」です。


```
$ aws lambda update-function-configuration --function-name <関数名> --environment Variables={"Key1"="value1"\,"Key2"="Value2"}
```

#### 解決策2

**シングルクウォートの利用**
中括弧全体をシングルクウォートでくくると、なんでかわかんないけど大丈夫だった！

```
$ aws lambda update-function-configuration --function-name <関数名> --environment Variables='{Key1="value1",Key2="Value2"}'
```
JSで配列をn個ずつに分割

何気にいろんなとこで使うのでメモしてると思っていたが、なかったのでメモ。

# コード
```javascript
const split = (array, n) => array.reduce((a, c, i) => i % n == 0 ? [...a, [c]] : [...a.slice(0, -1), [...a[a.length - 1], c]], [])
```

# 使い方
```javascript
split([1, 2, 3, 4], 2) // -> [[1, 2], [3, 4]]
```
VRMの一人称視点で影を付ける方法

VRMはVRアプリケーション向けのアバターフォーマットなので、一人称用に便利な機能があります(`VRMFirstPerson`)。しかし、セットアップを実行すると一人称視点で自分の頭の影(`THIRDPERSON_ONLY_LAYER`の影)が見えなくなってしまうので、これを解決する方法です。

方法としては、`THIRDPERSON_ONLY_LAYER`を`Clone`し`FIRSTPERSON_ONLY_LAYER`に変更。`Cast Shadows`を`Shadows Only`に変更することで影のみを表示するオブジェクトを一人称レイヤーに追加しています。スクリプト化すると以下のようになります。これをシーンに読み込んだVRMにアタッチすることで、一人称でも頭等の影が表示されます。

```csharp:VRMFirstPersonWithShadow.cs
using UnityEngine;
using VRM;

public class VRMFirstPersonWithShadow : MonoBehaviour
{
    private VRMFirstPerson vrmFirstPerson;

    void Start()
    {
        vrmFirstPerson = GetComponent<VRMFirstPerson>();
        vrmFirstPerson.Setup();

        foreach (var renderer in GetComponentsInChildren<SkinnedMeshRenderer>(true))
        {
            if(renderer.gameObject.layer == 10){
                var obj = Instantiate(renderer.gameObject, renderer.gameObject.transform.position, renderer.gameObject.transform.rotation);
                obj.transform.parent = renderer.gameObject.transform;
                obj.gameObject.layer = 9;
                var skin = obj.GetComponent<SkinnedMeshRenderer>();
                skin.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;

                foreach (Transform child in obj.transform) {
                    GameObject.Destroy(child.gameObject);
                }
            }
        }

        foreach (var renderer in GetComponentsInChildren<MeshRenderer>(true))
        {
            if(renderer.gameObject.layer == 10){
                var obj = Instantiate(renderer.gameObject, renderer.gameObject.transform.position, renderer.gameObject.transform.rotation);
                obj.transform.parent = renderer.gameObject.transform;
                obj.gameObject.layer = 9;
                var mesh = obj.GetComponent<MeshRenderer>();
                mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
                
                foreach (Transform child in obj.transform) {
                    GameObject.Destroy(child.gameObject);
                }
            }
        }
    }
}
```

実際の動作イメージです。一人称でも良い感じに影が出ました。
左:`vrmFirstPerson.Setup();`を実施
右:`vrmFirstPerson.Setup();`を実施後、影用のObjectをCloneしたケース。
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20884/a67443ac-a720-3a3b-49f7-84858a0aba49.png">

・セットアップ参考
[VRMFirstPersonの使い方](https://vrm.dev/docs/dev/programming/univrm_use_firstperson/)
Anaconda3でOpenCVを使えるようにした

# OpenCVって何？
OpenCV（Open Source Computer Vision Library）っていう名前の画像処理とかをして幸せになれるライブラリ．
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369956/a8659551-e88a-319f-1c57-919fa5c3143c.png)

# Anaconda仮想環境を生成
"Anaconda Navigator"から"Environments", "Create"ボタンでつくる．
"Name"には"openCV"と入力し，python3.6を選択．
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369956/1a87dc2d-f9e7-3f13-ebf2-a2cafba84630.png)


# OpenCVをインストールする
右上のプルダウンを"Installed"から"Not installed"へ変更し，以下を検索．

- git
- opencv
- notebook
- matplotlib

検索したらクリックしてApply,Apply.
これでおｋ．
"Installed"に戻って確認すると4つすべて入ってることがわかります．

# Githubからダウンロード
作ったopenCVの横の三角ボタンから"Open Terminal"を選択しターミナルを起動．
![2019-10-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369956/0079ca03-146a-8176-1138-5cb93a48ee59.png)

以下のコマンドを入力します．

```
mkdir git
cd git
git clone https://github.com/informramiz/Face-Detection-OpenCV
```

gitディレクトリを作成しその中にコードをダウンロードしました．

# Jupyter Notebookで実行
先ほど作成したgit →　Face-Detection-OpenCV → Face-Detection.ipynb　を選択．

これでいろいろできるよ，やったね．

# 遊んでみる
さっき開いたFace-Detection.ipynbをいろいろ実行してると，どうやら"Haar"っていうのと"LBP"っていうのがあるらしい．正直何が違うのかわかりませんが，Haarって方式のほうが少し速いみたいです．
C:\Users\ユーザ名\git\Face-Detection-OpenCV\data
ここに使っている画像フォルダがあるのでいじってみます．

- まずは普通に実行

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369956/f4d5355a-adb5-a247-98b7-9fc61f50610a.png)

test5.jpgって画像にあるいろんな人の顔が認識されました．
すごいね．

- 次に画像を変えて実行

![cvtest2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369956/b8d0712f-3bd1-1ecd-84a4-758208af6227.png)

もんも！！ちゃんはなんとか認識されているみたいですが，シャミ子は顔認識されていません．
これはシャミ子が悪いんだよ！！！

# 結論
...
......
............
**シャミ子が悪い．**
............
......
...



### 参考だよ
[【環境構築】OpenCVをインストールしてjupyter notebook上で顔認識してみた](https://rightcode.co.jp/blog/information-technology/opencv-jupyternotebook-face-recognition)

サイトそのまんま丸パクリだよ．
むしろ↑を見たほうがいいよ．
JavaScriptの暗黙の型変換(小ネタ)

## 暗黙の型変換
JavaScriptの暗黙の型変換によるちょっと不思議な動きを以下に記載しました。

```javascript
const array = ['Alice', 'Bob'];
const greeting = `Hello ${array}`;
```

`greeting`をコンソールに出力すると、`"Hello Alice,Bob"`が出力されます。

文字列+配列(オブジェクト)を行う際、オブジェクトが文字列に変換されることでこのような動作をするとかなんとか。

## 最後に
仕事中にたまたま見つけた挙動ですが、こんな動きするとは思いませんでした。
まだまだ勉強不足だなと思った次第です。(他の言語でもこのような動きするものあるんですかね…?)

JavaScriptで文字列結合するときは、結合元にどんな値が入っているか確認してから行わないと意図しない文字列になったりするので、気をつけたいところです。
form_forのf.date_select実装時のエラー undefined method `map' for "translation missing: ja.date.order":String


# undefined method `map' for "translation missing: ja.date.order":String

form_forにてf.date_selectを実装しようとした時のエラー

rails 5.2.3
ruby 2.5

birthdayカラムはdate型

調べるとrails４で良く起きているらしい。rails5なのに。。。。

とりあえず。。。
# 解決方法

config>locales>ja.ymlを作成

```ja.yml
ja:
  date:
    formats:
      default: "%Y/%m/%d"
      short: "%m/%d"
      long: "%Y年%m月%d日(%a)"

    day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
    abbr_day_names: [日, 月, 火, 水, 木, 金, 土]

    month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
    abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]

    order:
      - :year
      - :month
      - :day

  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      short: "%y/%m/%d %H:%M"
      long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z"
    am: "午前"
    pm: "午後"
```

を追記とりあえず解決
ingress-nginxはどうやって動いているのか（１）

# ingress-nginxって何？

ingress-nginxの説明をする前に、KubernetesのIngressとIngress Controllerの説明を少し。

## Ingressって何？

[Ingressの公式ドキュメント](https://kubernetes.io/docs/concepts/services-networking/ingress/)によると、Ingressとは、

> An API object that manages external access to the services in a cluster, typically HTTP.
> Ingress can provide load balancing, SSL termination and name-based virtual hosting.

サービスへのアクセスを制御する機能として、ロードバランシングや、SSL、バーチャルホストなどの機能を提供するためのAPIオブジェクトのこと。

## Ingress Controllerって何？

[Ingress Controllerの公式ドキュメント](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)によると、Ingress Controllerとは、

> In order for the Ingress resource to work, the cluster must have an ingress controller running.

Ingressリソースが設定で、その設定どおりに動く実態がIngress Controllerといった感じ。
実装としては、envoyベースやHAProxyベース、nginxベースなど、様々なものが存在しており、それぞれIngressが定める仕様を満たしつつ、様々な独自の拡張機能（Canaryリリースの仕組みなど）を提供している。
ユーザーが自分たちの要件に合わせて、どの実装をIngress Controllerとして選択して利用するかを決めることになる。

実際には、通常のアプリケーションのように、Ingress Controller用のDeploymentやServiceをKubernetesにデプロイする必要がある。

## ingress-nginxって何？

ようやく本題。[kubernetes/ingress-nginx](https://git.k8s.io/ingress-nginx/README.md)は、Ingress Controllerの実装の１つで、Kubernetes Communityのリポジトリとして開発が進められている。

nginxベースのIngress Controllerとして、NGINX, Inc.が提供している[NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller)もあるが、こちらとは別物。
ingress-nginxはコミュニティベースが開発が進められているため、実験的な機能なども多く追加されている。

具体的な差異については、[公式ドキュメント](https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/nginx-ingress-controllers.md)にも書かれている。

# ingress-nginxはどのような仕組みで動いているのか

[how-it-works.md](https://github.com/kubernetes/ingress-nginx/blob/master/docs/how-it-works.md)に概要が書かれているが、ソースコード(v0.26.1)を見ながら全体を図示してみるとこんな感じ（なはず）。

![how-nginx-ingress-works.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315538/2e8ba34e-446e-c41a-7e22-859f5f6396a6.png)

## メイン処理

メインのプロセスはGoでビルドされたバイナリが実行され、Kubernetesのリソース(Ingress, ConfigMap, Service, etc..)情報を元に、nginxの制御を行っている。具体的には、

- Kubernetesのリソース情報を取得
- nginxプロセスの起動／リロード
- nginx.confの作成／更新
- LuaモジュールのConfigurationの更新

のような処理を行っている。

### Kubernetesリソースの監視

Ingressリソースなど、nginxのConfigurationを構成するための情報が更新された場合、ingress-nginxにも反映させなければいけない。そのために、ingress-nginxは[kubernetes/client-go](https://github.com/kubernetes/client-go)ライブラリを通じて、Kubernetesの各種リソースの監視を行っている。

どのような仕組みで監視を行っているかは、[sample-controllerリポジトリのcontroller-client-go.md](https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md)がわかりやすいので、気になる人はこちらを見てほしい。

## Luaモジュール

Goでビルドされたバイナリの他に、ingress-nginxは、nginxプロセス内で動くLuaモジュールも提供している。これらのモジュールは、受け取ったConfiguration情報を元に、各種アルゴリズムでのロードバランシング、Canaryリリースの制御などを行っている。

# 続き
[ingress-nginxはどうやって動いているのか（２）](https://qiita.com/s-shirayama/items/a590b40cf6bbf448aecc)では、より詳細な処理の流れをコードを追いながら見ていく。
【SQL】データ加工(文字の切取・置換、フォーマット変換、日付の加工)

データを置換したり切り取ったり、型変換したりする方法を調べたらここにまとめています

#文字の切り取り
文字列の一部を切り取る方法
前方、後方、一部分など

##SUBSTRING
何文字目から何個分文字を切り取るか指定する関数
名前の2文字目1文字を抜き取るならこんな感じ。

```SQL:SUBSTRING
SELECT SUBSTRING(first_name, 2, 1) FROM first_grader
```
「五十嵐」さんなら「十」が抽出される

##LEFT
左から何個分の文字を切りとるかを指定する関数
名前の先頭文字を切りとるならこんな感じ

```SQL:LEFT
SELECT LEFT(first_name, 1) FROM first_grader
```
「五十嵐」さんなら「五」が抽出される

##RIGHT
右から何個分の文字を切りとるかを指定する関数
名前の最後の１文字を切りとるならこんな感じ

```SQL:RIGHT
SELECT RIGHT(first_name, 1) FROM first_grader
```
「五十嵐」さんなら「嵐」が抽出される

#文字の置換
部分的に書き換えたいときに使う
もし対象がなければそのまま表示される
ReplaceとTranslateがあり、RDBMSによって使える使えないがあるらしい。ややこし。

##REPLACE
こちらは「Access」「SQLServer」「Oracle」「PostgreSQL」で使える

```SQL:REPLACE
SELECT REPLACE(first_name, '十', '百') FROM first_grader
```
「五十嵐」さんなら「五百嵐」さんにレベルアップ？する

##TRANSLATE
こちらは「Oracle」「PostgreSQL」「MySQL」で使える。つまりMicroSoft系では使えない。

```SQL:TRANSLATE
SELECT TRANSLATE(first_name, '十', '百') FROM first_grader
```
書き方も結果も同じですね

#フォーマット変換
データの本質は変えない？けど、見え方を変えるやつ。

##FORMAT
数字や日時を都合のいい形に変更します。
前方ゼロ埋めや有効桁数、日時に"/"を入れたり入れなかったりしたい時に使います。
MS系のOSやDBMSで使える型はこちらのサイトの下の方に一覧で書かれています。

```SQL:Format
SELECT FORMAT(student_number, '0000')
   FROM first_grader
```
これで数値が前方ゼロ埋めされた4桁の文字列が返されるので、"1"なら"0001"になる。
今回は省略しているけど、第三引数(culture)を指定すると、便利にできるらしい。

##CONVERT
型を変換する。日付型や数字を文字列にすることができる。

```SQL:Convert
SELECT CONVERT( VARCHAR(10), 100) + student_name
   FROM first_grade
```
数字と文字列は型が違うので文字列として結合ができないが、
CONVERTを使って数字を文字列に変換すると結合することができる。

```SQL:Convert_2
SELECT CONVERT( VARCHAR(30), admission_day, 111)
   FROM first_grade
```
日付型のデータを文字列に変換している。
第三引数に渡している数字で変換後の形が決まり、
上記"111"の場合は"yyyy/mm/dd"の形になる。

```SQL:Convert_3
SELECT CONVERT( DATETIME, '2020-01-01 15:21:08')
   FROM first_grade
```

#日付操作
日付の加算減算や、月初日の取得など
##DATEADD
DATE型のデータに対して、年月日や時間の加算、減算をおこなう。
下の例文では1ヶ月前を出力している。

```SQL:DATEADD
SELECT DATEADD(MONTH, 1, admission_day)
   FROM first_grade
```
MONTH以外にも多くの時間表現を操作することができる。

|記述シンボル|省略形|
|:--:|:--|
|year|yy, yyyy|
|quarter|qq, q|
|month|mm, m|
|dayofyear|dy, y|
|day|dd, d|
|week|wk, ww|
|weekday|dw, w|
|hour|hh|
|minute|mi, n|
|second|ss, s|
|millisecond|ms|
|microsecond|mcs|
|nanosecond|ns|

##CONVERT & DATEADD & LEFT
表示方法を変換して文字の置換をすることにより、月初日や月末などを取得することができる。

```SQL:GET_FirstDay
SELECT CONVERT(DATETIME, LEFT(CONVERT(VARCHAR, admission_day, 112), 6)+'01')
   FROM first_grade
```
admission_dayが"2020/04/06"とすると、
CONVERT(VARCHAR, admission_day, 112)は"20200406"となり、
LEFT(CONVERT(VARCHAR, admission_day, 112), 6)は左から6桁を取得するので"202004"となる。
これの右端に"01"をつけてDATETIME型に再度CONVERTすると、"2020/04/01"の月初になる。

```SQL:GET_LastDay
SELECT DATEADD( DAY, -1, CONVERT(DATETIME, LEFT(CONVERT(VARCHAR, admission_day, 112), 6)+'01'))
   FROM first_grade
```
先ほどの要領でadmission_dayの月初日を取得して、1日減算することで前月の月末日を取得することができる。

```SQL:GET_FirstDayOfLastMonth
SELECT CONVERT(DATETIME, LEFT(CONVERT(VARCHAR, DATEADD(MONTH, -1, admission_day), 112), 6)+'01')
   FROM first_grade
```
GET_LastDayのDAYをMONTHに変えても取得できるが、CONVERTをする前にDATEADDで1月前にして、その月初日を取得することもできる。
初心者によるプログラミング学習ログ 117日目

# 100日チャレンジの117日目。

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

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

117日目は、


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>117日目です<br><br>udemyみながらフォトショップで架空のwebサイト作成<br><br>以前やってたやつとは違うサイトなので、またレイアウトからです<br><br>そしてヘッダー部分作成で寝落ち…<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#webデザイン</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1179145144441831425?ref_src=twsrc%5Etfw">October 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

コード自体はいっさい書いていないのですが、、、継続学習のトリガーみたいなものなので自分的には問題なし。
Django1.11に関する初心者のメモ

1.11なので古いです。

## インストール
```
$ pip install django
```

## プロジェクト作成
```
$ django-admin startproject mysite
```
その場にmysiteというプロジェクトディレクトリが作成される. 

## アプリケーション作成
Djangoではプロジェクトの中にアプリケーションを作る. 

```
python manage.py startapp myapp
```
1つのプロジェクトの中に複数のアプリケーションを作ることが出来る. Webサービス全体の枠組みとしてプロジェクトがあり、その中の各機能（データベース、ブログシステム等）をアプリケーションで実装する. 

## 開発サーバを起動してみる
```
cd mysite
python manage.py runserver
```
ブラウザで http://127.0.0.1:8000 にアクセスして下記のようなメッセージが出れば成功
![スクリーンショット 2019-10-04 17.08.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415290/c74769a4-23c5-2469-0261-f1183a060f26.png)

## webページに"Hello World"を表示しよう
https://docs.djangoproject.com/ja/1.11/intro/tutorial01/

## データベースを操作しよう

## memo
- `python manage.py [command]`  
とにかくよく使う. サーバ立ち上げもアプリケーション作成もマイグレートもこれでやる. 自分で定義したカスタムコマンドを実行させることも可能らしい([参考](https://qiita.com/checkpoint/items/b6947501774b4008e077))
【顔認識入門】顔識別して「ウワンさん、こんにちわ」♪

[昨夜のコード](https://qiita.com/MuAuan/items/c90f9dee6d2ff874c106)に前回のtext2speakを追加すると、念願の「ウワンさん、こんにちわ」ができました。
【参考】
①[【Speak入門】text2speakとQRcode2speakを自作して遊んでみた♪](https://qiita.com/MuAuan/items/74bc382af64aca8861f9)
話は簡単なので、昨夜のコードの差分だけ説明します。
**ストーリーは、顔識別したらその識別結果に「txt+さんこんにちわ」として、それをtext2speakに渡す**ということです。
###コード全体は以下に置きました
・[face_recognition/recognize_vgg16_camera_ohayo.py](https://github.com/MuAuan/face_recognition/blob/master/recognize_vgg16_camera_ohayo.py)
###コード解説
利用する追加Libは以下のとおりです。

```py
import pyaudio
import wave
import time
import re
```
text2speak関数は丸々追加します。

```py
def text2speak(num0):
．．．
```
text2speakの追加個所は以下のとおりです。
yomikomi関数で顔識別した結果をtxtに代入して、それをnum0=txt+"さんこんにちわ"として、このnum0を渡します。こうして「ウワンさんこんにちわ」と発話できます。
※ここでちょっとロジック入れれば「おはよう」とか「おつかれさま」とか発話出来ます

```py
                try:
                    roi = cv2.resize(roi, (int(224), 224))
                    cv2.imshow('roi',roi)
                    txt, preds=yomikomi(model,roi)
                    print("txt, preds",txt,preds*100 ," %")
                    txt2=conv.do(txt)
                    cv2.imwrite(path+"/"+label+"/"+str(sk)+'_'+str(txt2)+'_'+str(int(preds*100))+'.jpg', roi)
                    num0=txt+"さんこんにちわ"
                    print(num0)
                    text2speak(num0)
```
センテンスが短いので、はっきり綺麗に発話できました。
また、「まゆゆさんこんにちわ」「あかりんだーすーさんこんにちわ」と変化してくれました。
###まとめ
・「ウワンさんこんにちわ」などと識別結果に基づいて変化してくれました

・笑顔、悲しい顔、怒り顔、普通の顔などの情感変化に基づいた発話させたい
・もう少し複雑な会話形式のロジックと識別結果と連携して発話させたい
Faceware Analyzer のメモ

# Faceware Analyzer とは?

https://www.facewaretech.com/software/analyzer

Facial landmark 検出 & 編集ツールです.
オフライン映像向けです.
Analyer だけではあまり使い道がなく, 以下の faceware retargeter と連携して使います.

Faceware retargetter で VTuber を目指すメモ
https://qiita.com/syoyo/items/dd4823352f3bc86b2a18

facial landmark 編集ツールとしてはそこそこ機能があるように見えますが, エディットにおいてはユーザが使いやすいたぐいのものというわけではないです.

facial landmark 検出だけという点では,  dlib とか OpenFace とかディープラーニング系の face tracker のほうが性能がよいです.

Faceware Live というリアルタイムトラッキングできるのもありますが(著者は未検証), リアルタイム向けなら iPhoneX とかの face tracker のほうがお手軽そうな気がします.

iPhoneX で顔トラッキングをして Unity で BlendShapes を動かし vtuber を目指す
https://qiita.com/syoyo/items/f0ad3eb4ed3387ee6462

## Auto track

だいたい Auto track でうまくトラッキングできます. 基本はこれでだいたい解決します.
必要であれば Neutral face 画像を用意してそれを与えることで, より確実にトラックできるはずです.

Auto track でうまく行かなかった場合, 以下にあるように手動で landmark を編集します. 
(あとは, Jaw の位置をアノテートしてより精度高くトラッキングするとかの場合も手作業が必要です)

### Train

特定の顔(動画)で landmark 位置を編集し(いわゆるアノテーション), 指示してあげてそれで学習します. 最低 3 フレームは必要です.

## Landmark editor

intelligent drag あたりを使うと, 唇形状はうまく画像に合わせてフィッティングしてくれたりします. うまく活用しましょう.

## 問題点, 制約点

* 映像の特定の範囲だけで auto track したり, train したりなどはできません. 最初に映像をカットごとなどによろしく trim しておく必要があります.
  * AutoTrack は映像全体で処理されるので, 映像にカットが含まれていて顔が切り替わるなどですとうまくいかないケースが多い 
* フレーム間(時間軸)で landmark を移動させるなどはできません.
* 横顔のトラッキングには強くありません. だいたい 45 度くらいが限界でしょうか.
* AutoTrack では顔全体の画像が必要です. mouth だけトラッキングしたいので口元だけの画像を与えてもうまくトラッキングできません. 適当にダミーの目や眉毛の画像と合成して(landmark detector がうまく理解できればいいので, 人間の見た目で多少おかしくなっていてもよい)ソース映像を用意しましょう.

### 動画 Aspect ratio

https://faceware.zendesk.com/hc/en-us/articles/204024085-What-video-codecs-are-supported-by-Analyzer-?mobile_site=true

標準的な解像度はサポートとありますが, Premiere Pro のデフォルト? である HDV(1440x1080, aspect ratio 1.3333)は対応していませんでした.

ffmpeg などを用いて Square pixel(aspect 1.0)などに変換しておきましょう.


## 不都合?

auto track では, 最初のフレームあたりはうまくいかないことが多いようです.

また, ソース動画によっては最初のフレームだけうまくデコードできないのか, シーンを作るときにファイルがすでにある(実際にはファイルは無い)エラーがでるケースがありました.
何フレームかスキップして読み込むことで解決しました.

## スクリプト処理したい

スタンダード版(199/year)では, トラッキングしたデータを他のフッテージで使いまわしたり, バッチ処理ができません. 多量の動画をトラッキングする場合は Studio Plus ライセンスを買いましょう
(スタンダード版で 100 本近い動画を手動でマウスぽちぽちで処理しなければならず, 面倒すぎました)

API は python でいじれるっぽい?
 
## TODO

* 機械学習やディープラーニング方面の facial landmark detector を使って, analyzer に渡すことができるか試す(python scripting 経由でいけるか?)
* Analyzer のエディタを自前 facial landmark detector 用の教師データ生成ツールとして使えないか試す
  * 少なくとも landmark points を XML で export する機能は付いているので.
  * landmark editor では, http://landmark.io/ などがあるが, これらに比べるとまだ Analyzer のほうが使いやすそう
* Faceware Analyzer 以外に, 商用でよいのでいい感じの facial landmark annotation ツールがあるか調べる
[Rails]動画プレビュー機能

#はじめに
今回、動画のプレビュー機能を追加したのでその方法について、説明します。

####環境
Rails 5.2.3
Ruby 2.5.1

##導入方法
####ビューファイル
気を付ける点は、`file_field`に`id: "upload-image"`をjQueryを使用する為に記述します。

```ruby:new.html.haml
= form_for @video do |f|
　　　　　　省略
 .movie-group-form__field--right--mask
   = f.label :image, for: "upload-image", class: "movie-group-form__movie" do
     = fa_icon "cloud-upload fa-spin", class: "icon"
     = f.file_field :image, class: "hidden", id: "upload-image"
     = f.label :動画を選択してください , class: "movie-group-form__choice"
 = f.submit "投稿する", class: "btn btn-dark"
```

####jQuery
次にJSファイルに動画プレビューをさせる記述をします。
`$fileField`にビューの`id`に記述した`upload-image`に`#`を付けて記述します。

`$preview`には動画をプレビュー表示させたい部分(今回は`.movie-group-form__choice`)に記述します。
`$preview.append($('<video>').attr({`内にCSSを記述してます。`autoplay: "autoplay"`、`loop: "loop"`で動画のプレビューをオート再生させています。
`playsinline: "true"`はスマホで動画を投稿した際に、オート再生するのに使用します。


```javascript:preview.js
$(document).on('turbolinks:load', function() {
  $fileField = $('#upload-image')

  $($fileField).on('change', $fileField, function(e) {

      file = e.target.files[0]
      reader = new FileReader(),
      $preview = $(".movie-group-form__choice");

      reader.onload = (function(file) {
        return function(e) {
          $preview.empty();
          $preview.append($('<video>').attr({
            src: e.target.result,
            width: "45%",
            height: "110px",
            class: "preview-image",
            autoplay: "autoplay",
            loop: "loop",
            playsinline: "true",
            title: file.name
          }));
        };
      })(file);
      reader.readAsDataURL(file);
    });
  });
```
今回はJS内にCSSを直接記述しているので、CSSファイルの変更は必要ないです。後は好みで調整して下さい。

#まとめ
動画のプレビューも画像のプレビューとほぼ同じで、後はappendに`'<video>'`か`'<img>'`を記述するだけで、動画か画像のプレビュー表示かを変更する事が出来ます。気になったら試してみて下さい。
DirectX11でトゥーンシェーダー

DirectX11で簡易的なトゥーンシェーダーの実装をしたいと思います。

# トゥーンシェーダーとは？
![toon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/24ce6832-4b4d-1d98-21b3-2697cd590224.png)

トゥーンシェーダーはこのように陰影がハッキリしています。アニメ調のゲームなどで使用されています。

# ToonMapクラス
トゥーンシェーダーではトゥーンシェーダー用のテクスチャを用意します。
![toonmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/fa8d3abe-d8c1-6fff-7238-6ac83b7da046.png)
拡散反射光などは計算によって色を決めますが、トゥーンシェーダーはこのテクスチャから色を決めます。
ライティングの計算を行った後、その値をUV座標のX成分としてこの画像からライティングの値をフェッチします。

```C++:ToonMap.h
ID3D11Device* g_d3dDevice;  //構築済みとする
ID3D11DeviceContext* g_d3dDeviceContext  //構築済みとする

public:
    ToonMap() {}
    ~ToonMap() {}

    //初期化
    void Init();
    //テクスチャをピクセルシェーダーに設定する、モデルをドローする時に呼んでください
    void SetShaderResourceView();
private:
    ID3D11ShaderResourceView* m_srv = nullptr; 
```

```C++:ToonMap.cpp
void ToonMap::Init()
{
    //テクスチャを読み込みます
    DirectX::CreateDDSTextureFromFile(
    g_d3dDevice, // D3Dデバイス
    L"Assets/shader/toonmap.dds",  //テクスチャのファイルパス
    nullptr,   //nullptrでいい
    &m_srv  //シェーダーリソースビュー
    );
}

void ToonMap::SetShaderResourceView()
{
    //ピクセルシェーダーにテクスチャを設定します。
	ID3D11ShaderResourceView* srvArray[]{
			m_SRV
	};
	d3dDeviceContext->PSSetShaderResources(4, 1, srvArray);
}
```

# シェーダー
```hlsl:model.fx
Texture2D<float4> toonMap : register(t4);  //toonシェーダー用のテクスチャー

//以下の実装と頂点シェーダーの実装は省きます
Texture2D<float4> albedoTexture : register(t0);  //モデルのテクスチャー
sampler Sampler : register(s0);  //サンプラー
//ディレクションライト
cbuffer LightCb : register(b1) {
	float3 dligDirection;
};
///ピクセルシェーダーの入力
struct PSInput{
	float3 Normal		: NORMAL;
	float2 TexCoord 	: TEXCOORD0;
};

//ピクセルシェーダー
float4 PSMain( PSInput In ) : SV_Target0
{
    //モデルのテクスチャから色をフェッチする
    float4 color =  albedoTexture.Sample(Sampler, In.TexCoord);

    //ハーフランバート拡散照明によるライティング計算
    float p =  dot(In.Normal * -1.0f, dligDirection.xyz);
    p = p * 0.5f + 0.5f;
	p = p * p;

    //計算結果よりトゥーンシェーダー用のテクスチャから色をフェッチする
    float4 Col = toonMap.Sample(Sampler,float2(p,0.0f));

    //求まった色を乗算する
    return color *= Col.xyz;
}	  
```

こちらのサイトを参考にしました
http://maverickproj.web.fc2.com/pg35.html
Proc lambada


## 基本

```

proc = Proc.new{|x| p x}
p proc.call(1)

→ 1
```

```
def func x
 x + yield
end

p func(1){2}
→ 3

```


## lambada


```ruby
lmd = lambda{|x| p x}

p lmd.call(1)

```


## ブロックを受けるメソッド


## 配列

```
[1,2,3].each do |value|
  p value
end
```

## ハッシュ

```
{:a => 1, :b => 2}.each do | key, value|
  p "#{key}:#{value}"
end
```

- key

```
{:a => 1, :b => 2}.each_key do | key, value|
    p "key:#{key}"
end
```

- value

```
{:a => 1, :b => 2}.each_value do |value|
    p "value:#{value}"
end
```

- range 

```
("a".."z").each do |value|
 p value
end
```

- upto  

```
2.upto(4) do |i|
 p i
end
```

スレッド
Lookerで積上げ棒グラフを作成する方法


Lookerの積上げ棒グラフの作成手順メモです。

簡単なはずなのですが、手順しょっちゅう忘れてしまうので、手順残し。

##やりたい事
Lookerで積上げ棒グラフを作成する

##作業手順
![Looker積上げ棒グラフ_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/1e64ee5e-408d-f51f-4123-4075d9ad4e3a.png)
![Looker下矢印.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7f596f16-34f2-fdca-24ca-4cf4cc78dfd6.png)
![Looker積上げ棒グラフ_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/306d4c94-48de-e9a5-9f4d-69d1444f4709.png)

##まとめ
EDITから多様な設定が出来るのがLookerの特徴でもあるのですが、積み上げ棒グラフぐらいであればグラフ選択時に選べると良いなぁと。Lookerさんに改修要望出すかちょっと検討してみます。
Pythonを学ぶ理由

# Pythonを学ぶ理由

## 1.案件の数が多い
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/549a0a5b-1178-ac1f-5d42-7bae604e6f90.png)

[レバテック](https://freelance.levtech.jp/)

- `Instagram` や `YouTube` など日常生活でよく使うアプリケーションの開発に `Python` が使われてきています。
- AIブームなどで注目を集める `Python` は需要が高く、近年では案件が多く存在する傾向にあります。
- 上記の画像は[レバテック](https://freelance.levtech.jp/)というフリーランスエンジニアの求人サイトです。
- `Pythonの求人` で検索をかけたところ `528件` がヒットしました。
- このことから `Python` の案件が多いことがわかるかと思います。


## 2.案件の単価が他言語と比較して大差がない
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e02937a8-fd10-0bb3-c642-328d67455659.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/74774d39-6b04-ea8b-8db1-f63407b8999f.png)

- フリーランスの求人サイトを見ると `Python` の案件が年々増加する傾向にあります。
- 案件が増加する一方で `Python` を扱える `エンジニアの不足` から需要は高まっている状況です。
- 上記の画像は [レバテック](https://freelance.levtech.jp/) のPython(上)とJava(下)の一番高い求人の比較です。
- Python(上)が `~95万円` 、Java(下)が `~105万円` と大差がないように感じます。

## 3.他言語と比べて習得難易度が低い

- `Python` では、 `＄` や `括弧` などの記号を極力廃して、シンプルなコードを書くことができるように設計されています。
- そのため、 `コード量が減り` 、シンプルで生産性が高いコードを書くことが可能となります。
- また、 `ライブラリが豊富` なため、ほとんど覚えることは少なく、比較的習得しやすい言語になっています。

# まとめ

- 案件の数が多い

- 案件の単価が他言語と比較して大差がない

- 他言語と比べて習得難易度が低い

以上のことから投資対効果に期待でき、比較的習得難易度が低いPythonを習得することをおすすめします。
Iot検定に向けて分からない用語の確認をする(後編)

#7.データ分析
##機械学習及人工知能に関する知識
- 教師あり学習 -> 学習データに正解ラベルをつけて学習する方法。回帰と分類がある。
- 教師なし学習 -> 学習データにラベルをつけないで学習する方法。クラスタリングがある。
- 強化学習 -> ある環境内におけるエージェントが、現在の状態を観測し、とるべき行動を決定する問題を扱う。エージェントは行動を選択することで環境から報酬を得る。
- 決定木 -> 段階的にデータを分割していき、木のような分析結果を出力する。
- サポートベクトルマシン -> 教師あり学習を用いるパターン認識モデルの一つである。
- 遺伝アルゴリズム -> データを遺伝子で表現した「個体」を複数用意し、適応度の高い個体を優先的に選択して交叉・突然変異などの操作を繰り返しながら解を探索する。
- クラスタリング -> 分類対象の集合を、内的結合と外的分離が達成されるような部分集合に分割すること。

#8.セキュリティ
##暗号化
- 情報セキュリティの３大要素 -> 機密性(confidentiality),完全性(integrity),可用性(availability)。

##攻撃対策
- サイドチャネル攻撃 -> 暗号解読手法の一つで、暗号を処理している装置の物理的な特性を外部から観察・測定することにより、秘密情報の取得を試みる攻撃手法。

##認証技術
- リスクベース認証 -> リスクベース認証とは、ユーザのアクセス履歴などを元に「不正のリスク」を判定し、高リスクと判定された場合には追加認証などを行うことで、なりすましを防ぐ認証技術。

##監視・運用
- SNMP -> (Simple Network Management Protocol)の略。UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコル。
- パケットフィルタリング -> 通信が正しく行われるように特定のルールに基づいて検査、あるいは通信セッションの前後関係の整合性を検査し、不正だと判断した場合パケットを破棄するフィルタリング手法。
- NTP -> (Network Time Protocol)の略。ネットワークに接続される機器において、機器が持つ時計を正しい時刻へ同期するための通信プロトコル。
- Syslog -> ログメッセージをIPネットワーク上で転送するための標準規格。
Rails EngineのRootからRSpecを実行すると、Webpackerのエラーが出たので対応する

##状況
アプリケーションが複数のUIで構成されているので、以下のような対応をしていた。分離することで、Webpackのバージョンから何やら分けることができる。

Webpackerのインスタンスをクラスメソッドで定義して、別のところから呼び出せるようにする。

```rb
module Convenience
  ROOT_PATH = Pathname.new(File.join(__dir__, ".."))

  class << self
    def webpacker
      @webpacker ||= ::Webpacker::Instance.new(
        root_path: ROOT_PATH,
        config_path: ROOT_PATH.join("config/webpacker.yml")
      )
    end
  end
end
```

ヘルパーに以下を記載し、先程のインスタンスを呼ぶようにすれば、stylesheet_pack_tagやjavascript_pack_tagが呼びだせる。

```rb
module Convenience
  module ApplicationHelper
    include ::Webpacker::Helper

    def current_webpacker_instance
      Convenience.webpacker
    end
  end
end
```

ちなみにこのメソッドは、カレントWebpackerインスタンスを返すので、先程のConvenienceの例だと、ConvenienceのWebpackerインスタンスを返すようにOverrideしてあるようだ。

```rb
module Webpacker::Helper
  # Returns current Webpacker instance.
  # Could be overridden to use multiple Webpacker
  # configurations within the same app (e.g. with engines)
  def current_webpacker_instance
    Webpacker.instance
  end
```

##RSpecでエラー
ただ、EngineRootからrspecを実行するとエラーになるので、test環境だけ分岐する必要がある。もしかしたらもっといい方法があるのかもしれないが、一旦EngineRootから直でrspecを呼び出すという要件に合わせるためにコードを追記した。

```rb
module Convenience
  module ApplicationHelper
    include ::Webpacker::Helper

    unless Rails.env.test?
      def current_webpacker_instance
        Convenience.webpacker
      end
    end
  end
end
```

なお、コードは https://github.com/rails/webpacker/blob/master/docs/engines.md#using-in-rails-engines こちらからコピペしたものだと予想できる。