OmniAICreator/Qiita-1.07M huggingface dataset:
ESXi6.7以降では、ディスクをクイックフォーマットしないとシンプロビジョニングがシックプロビジョニングに変更される(らしい)

#(windows sever2016)(ESXi6.7以降)では、ディスクをクイックフォーマットしないとシンプロビジョニングがシックプロビジョニングに変更される(らしい)

##0.ESXiで仮想マシンを作る
・VMware　vSphereESXi6.7で仮想マシンの構築
・windows server 2016を適切なディスクにインストール
・ディスクの構成←ここのお話
　ここではディスク０にインストール、ディスク１の割り当ての際に起こりえるお話です。

##1.シンプロビジョニングとシックプロビジョニングってなんやねん 

・シックプロビジョニング（Lazy zeroed）
仮想ディスク作成時に指定したサイズ分の領域を確保するので、使わなくても要領を食ってしまう。 
・シックプロビジョニング（Eager zeroed）
仮想ディスク作成時に指定したサイズ分の領域を確保するので、使わなくても要領を食ってしまう。ゼロで初期化。 
・シンプロビジョニング
仮想ディスク作成時には最低限の領域のみ確保し、必要に応じて増加。
→今必要な分しか確保していない。(見せ方として容量があるように見せかけている。)

つまり、同じ80GBの設定でも
シック→容量確保済み。（その容量がないとそもそも作れない。でも、作ったられっきとした80GB）
シンプロ→容量未確保。（容量なくても作れる。でも、見せ方的には80GB(嘘)的な）

シンプロのほうが容量の使用効率がいいので、今回はシンプロ使いたいのです。
参考
[https://www.projectgroup.info/tips/VMware/comm_0009.html](https://www.projectgroup.info/tips/VMware/comm_0009.html)

##2.問題はディスクの構成時に
仮想マシンを作るときはシンプロビジョニングにしたはずなのに、なぜかクイックフォーマットにしないとシックプロビジョニングに自動で変わってしまう…
そんな困った現象が起きた(らしい)ので調べてみました。

##3.クイックフォーマットと普通のフォーマットの違い

・フォーマットとは
ディスクを使用可能な状態にすること、もしくは一度区切って番地を付けた領域を白紙に戻して、新しく仕切り直す一連の処理のこと。
・フォーマット
通常のフォーマットでは、データの管理情報の保存領域を消去→ディスクの不良個所のチェック
・クイックフォーマット
データの管理情報の保存領域を消去のみ。（ディスクの不良個所のチェックはせずに時間短縮)

→つまり、重要なデータがあるのであれば通常フォーマット

参考
[https://tech.nikkeibp.co.jp/it/pc/article/NPC/20060329/233687/](https://tech.nikkeibp.co.jp/it/pc/article/NPC/20060329/233687/)

##4.なんでシンプロがシックに変わるねん
「標準フォーマットではシンプロビジョニングで指定した仮想ディスクのサイズのほとんどが物理的に割り当てられてしまい、シンディスクの意味がありません。
シンディスクを使用する場合、ゲストWindows OSではクイックフォーマットを使用しましょう。」

Windows Server 2008 / Windows Vista以降からフォーマットの仕様が変更されたことに原因がある…(?)
Windows Server 2003 / Windows XPまでは標準フォーマットでもシンディスクが一杯にはならなかった。
→Windows Server 2008 / Windows Vista以降の標準フォーマットでは、領域の割り当て方が違う。
→シンプロなのにシック現象が発生。
参考
[http://norimaki2000.blog48.fc2.com/blog-entry-1232.html]
(http://norimaki2000.blog48.fc2.com/blog-entry-1232.html)

##5.こういう事象があるってことの把握
めっちゃ大切ですね。
用語調べるだけでもためになるので続けていきます。
機械学習のための数学(微分基礎問題脳筋トレーニング)

頭で覚えるよりも体で覚える人のための微分問題！！
微分を知らなかった人が自分で問題を作って、解く特訓結果集！！

#指数の公式使えば解ける系

001
問題: $ f(x)=(3x+5)(2x-1)$
解答: $ f'(x)=12x+7$

002
問題: $ f(x)=x^{4}+x^{3}+x^{2}+x+1$
解答: $ f'(x)=4x^{3}+3x^{2}+2x+1$

003
問題: $ f(x)=-\frac{3}{2}x^{4}+\frac{1}{3}x^{3}-5x$
解答: $ f'(x)=-6x^{3}+x^{2}-5$

004
問題: $ f(x)=(x^{3}-1)^{2}$
解答: $ f'(x)=6x^{2}(x^{3}-1)$

005
問題: $ f(x)=\frac{\sqrt[3]{x^{2}}}x$
解答: $ f'(x)=-\frac{1}{\sqrt[3]{x^{4}}}$

006
問題: $ f(x)=3x^{2}-4x^{3}$
解答: $ f'(x)=6x-12x^{2}$

007
問題: $ f(x)=\frac{3}{2}x^{2}-\frac{4}{5}x^{3}$
解答: $ f'(x)=3x-\frac{12}{5}x^{2}$

008 
問題: $ f(x)=\frac{9}{\sqrt[4]{7x^{3}}}$
解答: $ f'(x)=-\frac{27}{4\sqrt[4]{7x^{7}}}$

009
問題: $ f(x)=-\frac{1}{x^{2}}$
解答: $ f'(x)=\frac{2}{x^{3}}$

010
問題: $ f(x)=\frac{1}{\sqrt[5]{x^{4}}}$
解答: $ f'(x)=-\frac{4}{5\sqrt[5]{x^{9}}}$

011
問題: $ f(x)=-5x^{5}+4x^{4}-3x^{3}+2x^{2}-x$
解答: $ f'(x)=-25x^{4}+16x^{3}-9x^{2}+4x-1$

012
問題: $ f(x)=\frac{1}{x^{10}}$
解答: $ f'(x)=-\frac{10}{x^{11}}$

013
問題: $ f(x)=\frac{x^{3}-2x^{2}+3x-4}{x}$
解答: $ f'(x)=2x^{2}-2+\frac{4}{x^{2}}$

014
問題: $ f(x)=(x^{2}-3x+4)(x^{2}-3x-1)$
解答: $ f'(x)=4x^{3}-18x^{2}+24x-9$

015
問題: $ f(x)=\frac{1}{\sqrt{x^{3}}}$
解答: $ f'(x)=-\frac{3}{2\sqrt{x^{5}}}$

016
問題: $ f(x)=3x^{3}+2x^{2}+x+9$
解答: $ f'(x)=9x^{2}+4x+1$

017
問題: $ f(x)=\frac{1}{\sqrt[4]{x^{8}}}$
解答: $ f'(x)=-\frac{2}{x^{3}}$

018
問題: $ f(y)=-xyz$
解答: $ f'(y)=-xz$

019
問題: $ f(x,y)=x^{2}y-xy^{2}$
解答: $ f_x(x,y)=2yx-y^{2}$
解答: $ f_y(x,y)=x^{2}-2xy$

020
問題: $ f(x,y)=\frac{y\sqrt{x}}{x\sqrt{y}}$
解答: $ f_x(x,y)=-\frac{\sqrt{y}}{2\sqrt{x^{3}}}$
解答: $ f_y(x,y)=\frac{1}{2\sqrt{xy}}$

021
問題: $ f(x)=x^{3}-2x^{2}+5x-5$
解答: $ f'(x)=3x^{2}-4x+5$

022
問題: $ f(x)=\sqrt{x^{3}}$
解答: $ f'(x)=\frac{3}{2}\sqrt{x}$

023
問題: $ f(x)=(x^{3})^{-4}$
解答: $ f'(x)=-\frac{12}{x^{13}}$

024
問題: $ f(x,y)=x^{2}-3xy+2y^{2}$
解答: $ f_x(x,y)=2x-3y$
解答: $ f_y(x,y)=-3x+4y$

025
問題: $ f(x,y)=x-2y$
解答: $ f_x(x,y)=1$
解答: $ f_y(x,y)=-2$

026
問題: $ f(x,y)=x^{2}y+3xy^{5}+x^{3}$
解答: $ f_x(x,y)=2xy+3y^{5}+3x^{2}$
解答: $ f_y(x,y)=x^{2}+15xy^{4}$

027
問題: $ f(x)=\frac{1}{2}x^{3}-\frac{3}{4}x^{4}$
解答: $ f'(x)=\frac{3}{2}x^{2}-3x^{3}$

028
問題: $ f(x)=\frac{1}{\sqrt[8]{x^{3}}}$
解答: $ f'(x)=-\frac{3}{8\sqrt[8]{x^{11}}}$

029
問題: $ f(x)=\frac{1}{\sqrt[9]{x^{15}}}$
解答: $ f'(x)=-\frac{5}{3\sqrt[3]{x^{8}}}$

030
問題: $ f(x,y)=x^{3}y-xy^{3}+x^{2}$
解答: $ f_x(x,y)=3x^{2}y-y^{3}+2x$
解答: $ f_y(x,y)=x^{3}-3xy^{2}$

031
問題: $ f(x,y)=2x^{2}y-3xy^{4}$
解答: $ f_x(x,y)=4xy-3y^{4}$
解答: $ f_y(x,y)=2x^{2}-12xy^{3}$

032
問題: $ f(x)=\sqrt[3]{x^{2}}$
解答: $ f'(x)=\frac{2}{3\sqrt[3]{x}}$

033
問題: $ f(y)=\frac{x}{y^{2}}$
解答: $ f'(y)=-2\frac{x}{y^{3}}$

034
問題: $ f(y)=xy^{\frac{1}{2}}$
解答: $ f'(y)=\frac{x}{2\sqrt{y}}$
openpyxl 色　早見表

# 背景
opnepyxlの棒グラフのcolorが実際どんな色かわからない。確認しようと思う。
（ちょっとずつ追記していきます。）

# prstClr
https://openpyxl.readthedocs.io/en/stable/api/openpyxl.drawing.colors.html

```
prstClr
Value must be one of {‘yellowGreen’, ‘darkSeaGreen’, ‘mediumBlue’, ‘maroon’, ‘lightCoral’, ‘pink’, ‘orangeRed’, ‘ltCyan’, ‘ltGrey’, ‘navajoWhite’, ‘saddleBrown’, ‘sienna’, ‘medSeaGreen’, ‘firebrick’, ‘lightGrey’, ‘blue’, ‘dkGoldenrod’, ‘darkGreen’, ‘lightGreen’, ‘indigo’, ‘wheat’, ‘mediumSlateBlue’, ‘linen’, ‘skyBlue’, ‘midnightBlue’, ‘darkOrchid’, ‘dkGray’, ‘brown’, ‘lightBlue’, ‘medSlateBlue’, ‘ivory’, ‘purple’, ‘dkOliveGreen’, ‘chocolate’, ‘darkSlateGrey’, ‘darkGrey’, ‘cornflowerBlue’, ‘dkGrey’, ‘dkRed’, ‘chartreuse’, ‘indianRed’, ‘deepPink’, ‘aqua’, ‘darkSalmon’, ‘whiteSmoke’, ‘lightGoldenrodYellow’, ‘turquoise’, ‘paleGreen’, ‘slateGray’, ‘lightGray’, ‘mediumSpringGreen’, ‘ghostWhite’, ‘seaShell’, ‘gray’, ‘darkKhaki’, ‘deepSkyBlue’, ‘lightSlateGrey’, ‘snow’, ‘darkSlateBlue’, ‘slateBlue’, ‘black’, ‘peru’, ‘plum’, ‘ltCoral’, ‘forestGreen’, ‘darkMagenta’, ‘dimGray’, ‘cornsilk’, ‘burlyWood’, ‘cadetBlue’, ‘lavenderBlush’, ‘orange’, ‘violet’, ‘mediumOrchid’, ‘fuchsia’, ‘ltYellow’, ‘silver’, ‘ltSalmon’, ‘tan’, ‘lightSkyBlue’, ‘dimGrey’, ‘lightPink’, ‘moccasin’, ‘darkGray’, ‘cyan’, ‘paleTurquoise’, ‘aliceBlue’, ‘dkBlue’, ‘ltPink’, ‘royalBlue’, ‘seaGreen’, ‘steelBlue’, ‘medOrchid’, ‘antiqueWhite’, ‘darkGoldenrod’, ‘khaki’, ‘paleGoldenrod’, ‘ltSeaGreen’, ‘dkCyan’, ‘red’, ‘crimson’, ‘dkSeaGreen’, ‘limeGreen’, ‘paleVioletRed’, ‘thistle’, ‘dkMagenta’, ‘salmon’, ‘ltGoldenrodYellow’, ‘powderBlue’, ‘blanchedAlmond’, ‘grey’, ‘springGreen’, ‘ltBlue’, ‘ltGreen’, ‘mediumAquamarine’, ‘papayaWhip’, ‘darkTurquoise’, ‘mediumVioletRed’, ‘dkOrange’, ‘green’, ‘oldLace’, ‘white’, ‘dkTurquoise’, ‘coral’, ‘medVioletRed’, ‘lightSteelBlue’, ‘blueViolet’, ‘greenYellow’, ‘hotPink’, ‘medTurquoise’, ‘dkViolet’, ‘orchid’, ‘dkOrchid’, ‘mediumTurquoise’, ‘darkRed’, ‘medSpringGreen’, ‘ltSteelBlue’, ‘sandyBrown’, ‘dodgerBlue’, ‘tomato’, ‘ltSlateGray’, ‘lightYellow’, ‘medAquamarine’, ‘magenta’, ‘rosyBrown’, ‘gainsboro’, ‘darkOrange’, ‘dkSlateGrey’, ‘darkViolet’, ‘medBlue’, ‘beige’, ‘dkSlateBlue’, ‘lightSlateGray’, ‘lightSalmon’, ‘lavender’, ‘floralWhite’, ‘slateGrey’, ‘dkKhaki’, ‘mistyRose’, ‘bisque’, ‘darkOliveGreen’, ‘dkGreen’, ‘peachPuff’, ‘lightSeaGreen’, ‘gold’, ‘navy’, ‘medPurple’, ‘yellow’, ‘mediumSeaGreen’, ‘lemonChiffon’, ‘ltSlateGrey’, ‘azure’, ‘lightCyan’, ‘goldenrod’, ‘darkCyan’, ‘ltGray’, ‘aquamarine’, ‘lime’, ‘honeydew’, ‘darkBlue’, ‘mediumPurple’, ‘darkSlateGray’, ‘teal’, ‘olive’, ‘lawnGreen’, ‘dkSlateGray’, ‘ltSkyBlue’, ‘oliveDrab’, ‘mintCream’, ‘dkSalmon’}
```

# yellowGreen
<img width="353" alt="スクリーンショット 2019-12-09 19.30.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223104/2822dadd-f5b3-6f88-5238-d75b6ff1ec8d.png">

#
Rails6 数値入力時にtypeをnumberにしたのに数値として扱われず困った話

# 目的

- 勉強の実施時間を記録するwebアプリ作成の際に数値のinputで詰まり、コミュニティの方に助けていただいた話をまとめる
- そもそもセオリーを理解できていなかったので二度とこんなことない様にまとめる。
- `.to_i`を使って数値に変換できることはなんとなく知識としてあったが定着していなかったのでまとめる。

# 目標

- すでにDBに格納されている数値に入力数値を足してDBに格納する。
- 不動小数点や符号などはとりあえず考えず前述の目標をクリアする。

# 結論

- 教えていただいた現役エンジニアさんのお言葉「入力値はtype指定してもStringになってしまうので受け取った側で型を指定して変換する」

# 問題のコード

- 下記に問題のコードの一部を抜粋する。

- コントローラ

    ```ruby
    def update
      @post = Post.find_by(id: params[:id])
      @post.study_time = @post.study_time + params[:study_time]
      @post.save
      redirect_to("/posts/#{@post.id}")
    end
    ```

- ビュー

    ```erb
    <%= form_tag("/posts/#{@post.id}/update") do %>
      <p>今日つみかさねた時間</p>
      <input type="number" name="study_time">
      <input type="submit" value="今日のつみかさね登録">
    <% end %>
    ```

# 詰まったところまでの概要

1. 前述の問題のコードにて「今日のつみかさね登録」ボタンを押したところ下記のエラーが出た。

    ```
    no implicit conversion of integer into string
    ```

1. エラーの内容から足そうとしている数値の型があっていないことがわかった。
1. 筆者はビューファイルの`input`で`type="number"`を指定して入力型を数値にしようと試みたが同じエラーが出た。
1. 解決しようと試みたがいろいろ試してくうちに混乱してしまった。

# 解決方法

- コントローラで受け取った値の型を数値に変換すことにより問題は解決した。

# 正常動作したコード

- 下記に教えていただいた内容を元に修正を行なったコードを記載する。

- コントローラ

    ```ruby
    def update
      @post = Post.find_by(id: params[:id])
      @post.study_time = @post.study_time + params[:study_time].to_i
      @post.save
      redirect_to("/posts/#{@post.id}")
    end
    ```

- ビュー

    ```erb
    <%= form_tag("/posts/#{@post.id}/update") do %>
      <p>今日つみかさねた時間</p>
      <!-- type="number"だと0~9までの入力しか受け付けられないためおって修正が必要 -->
      <input type="number" name="study_time">
      <input type="submit" value="今日のつみかさね登録">
    <% end %>
    ```

# 反省

- `.to_i`で数値に変換できることは知ってはいたが使いどころが理解できてなかった。
- そもそもセオリーを理解できていなかった。
- 今考えると諦めなければ自己解決できたかもしれない。

# よかったこと

- エラー文をコピペで解決することをしなかった。
- エラー文から問題箇所を特定することができた。
無名再帰 (JavaScript)


Z コンビネータ？いえ、知らない子ですね。[^1]

[^1]: 冗談はさておき、素直に Z コンビネータ実装してしまうと最適化が悲しいことになることが多いので。

~~~js
const fix = f => f = f((...x) => f(...x));
~~~

使い方

~~~js
// 5 の階乗
console.log("fact 5 =",
    fix(rec => n => n < 1 ? 1 : n * rec(n - 1))(5)
);
// > fact 5 = 120
~~~

再帰するのに、一々変数に入れたり、`function` にしたりしたくない時に。

以下応用例

## トランポリン

トランポリンと組み合わせてスタック溢れを回避してみる。
トランポリン自体の解説は先人がいらっしゃるので、そちらに丸投げします。

- [JavaScript・再帰・トランポリン - Qiita](https://qiita.com/41semicolon/items/985bdd2f551d9392463c)

~~~js
// トランポリン化
const trampoline = f => (...x) => {
    for (let y = f(...x); ; y = y())
        if (typeof y !== 'function') return y;
};

// 0 から n の合計
const sum = trampoline(fix(rec =>
    (n, s = 0) => n < 1 ? s : () => rec(n - 1, s + n)
));

console.log("sum 100000 =", sum(100000));
// > sum 100000 = 5000050000
~~~

## メモ化

~~~js
// メモ化, 1 引数のみ
const memo = f =>
    ((map, setter) => x => map.has(x) ? map.get(x) : setter(map, x, f(x)))
    (new Map(), (m, k, v) => (m.set(k, v), v));

// メモ化再帰でフィボナッチ数
const fib = fix(rec => memo(
    n => n < 2 ? n : rec(n - 1) + rec(n - 2)
));

// ローカルなメモにするなら
const fibL = n => fix(rec => memo(
    n => n < 2 ? n : rec(n - 1) + rec(n - 2)
))(n);

console.log("fib 50 =", fib(50));
// > fib 50 = 12586269025
~~~
【Rails】エラーメッセージを使い回す

全てのフォームで、エラーメッセージを使いまわせるようにします。

関連：[【Rails】バリデーションを実装する](https://qiita.com/d0ne1s/items/822f66d16d65ae28162b)

##リファクタリング前
以下のような書き方だと、`@task`に対するエラーメッセージしか表示できないので、エラーメッセージ出力部分の記述をパーシャルに分けて使い回すことができません。

```erb:view
<h1>新規タスク</h1>
<% if @task.errors.any? %>
  <div>
    <ul style="color: red">
      <% @task.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
<%= form_for(@task) do |f| %>
.
.
```




##リファクタリング後
フォームの中に`<%= render 'shared/error_messages', object: f.object %>`と書き込み

```erb:view
<h1>新規タスク</h1>
<%= form_for(@task) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
・
・
```
パーシャルで`object.errors`を使ってエラーメッセージを呼び出します。

```erb:shared/error_messages.html.erb
<% if object.errors.any? %>
  <div>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>
```

##注意
エラーメッセージが特定のActive Recordオブジェクトに関連付けられている場合のみ使える
→SessionはActive Recordオブジェクトに管理づけられていないので、ログインなどでは使えない
→flashで代用する必要がある
RETROF-16　基板レイアウト

#RETROF-16（令和版）の基版レイアウト

本記事は主に画像のアップのみです。
[対応する回路図はこちら](https://qiita.com/RETROF/items/08aec337163b24c49cff)

* ごく普通の有鉛両面基板で外形は222mm×178mmです
* 部品面のシルクの一部は、個人情報等のためマスクしています。
* 本基板はKiCad（バージョンは5.1.4）でデザインしました。
* 製造はFUSION社に依頼しました。価格、納期、日本語対応、完成品質、いずれも良好でした。（10枚で約87ドル＋送料、発注から到着まで7日）

##実際の基板（部品面）

![DSC02619.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/df7faefe-d7a6-1e1f-04b7-99318bf207e9.jpeg)


##実際の基板（裏面）

![DSC02620.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/722d58b4-9b28-50fc-299c-e2c6718b228d.jpeg)




##基板全体図（KiCadで編集中の画面）
![WS2019_000257.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/10c8fba0-568e-de6e-4a46-c2ae2d9a8830.png)


##パターンのみ（KiCadで編集中の画面）
* 赤色が部品面、緑色が裏面の銅箔パターンになります。
![WS2019_000259.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/a8c9832d-777a-39d4-8545-26d1ec244b6b.png)


##部品面パターン（KiCadで編集中の画面）
![WS2019_000261.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/63ae756c-bf27-5f39-0782-b55bf25fe9ac.png)


##裏面パターン（KiCadで編集中の画面）
![WS2019_000260.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/132b210e-7359-8133-77d7-713ab9de98b0.png)
Swift：自作CocoaPodsライブラリでAssets Catalogを使う

1.自作フレームワーク内に`.xcassets`ファイルを作成
2.普通にリソースを加える
3.Assets Catalogからリソースを取得

```swift:画像を取得する例
public func bundleImage(name: String) -> NSImage? {
    // ↓ライブラリのデモTarget用
    var bundle = Bundle(identifier: "ライブラリTargetのBundle Identifier")
    // ↓ライブラリをimportした時用
    if bundle == nil {
        bundle = Bundle(for: このメソッドがあるクラス名.self)
    }
    return bundle?.image(forResource: NSImage.Name(name))
}
```

4.`.podspec`にリソースを使うことを書き加える
 
```shell:.podspec
spec.resources = "ライブラリ名/**/*.xcassets"
```

↑ライブラリ名と言うのはつまりプロジェクトのルートフォルダのことを指します。

## 参考
[How to use images asset catalog in cocoapod library for iOS
](https://stackoverflow.com/questions/32577227/how-to-use-images-asset-catalog-in-cocoapod-library-for-ios)
Active RecordをRailsではなくRubyで使うまで

## 概要
Active RecordをRailsではなく、Rubyから利用する機会があったので、手順についてまとめておく。

```
$ ruby -v
```

```
ruby 2.6.3p62 (2019-04-16 revision 67580)
```

## 準備
今回はMySQLを利用することを前提とする。

MySQL2とActiveRecordの2種類のgemをインストールする。

```
gem install mysql2
```

```
gem install activerecord
```

## データベースの準備
Mysqlで事前に、`sample`データベースを作成し、`uses`テーブルを作成しておく。
データベースや、テーブルの作成方法については、ここでは説明を省く。

## 利用

UserクラスでActiveRecordが利用できるようにする。

```ruby

require "active_record"

ActiveRecord::Base.establish_connection(
	:adapter	=>"mysql2", 
	:host	=>"<ホスト名>",
	:database	=>"<db名>",
	:username	=>"<user名>",
	:password	=>"<パスワード>",
)

class User < ActiveRecord::Base
	def self.create_User
		User.create(name: "taro",age: 18) <= nameカラムとageカラムがある場合
	end
end
```

以上のような形で、`users`テーブルに新たなレコードを追加することができる。当然`create`だけでなく、CRUD処理の全てを行うことができる。

## まとめ
RailsからしかActiveRecordを利用したことがなかったが、Rubyからも簡単に利用することができた。
Nuxt.jsでいい感じにAdobe fontsのwebフォントを読み込む

Adobe fontsで日本語（東アジアの言語）を含むフォントを選択した場合、こんな感じのスクリプトの埋め込みを指示されると思います。

```html
<script>
  (function(d) {
    var config = {
      kitId: '######',
      scriptTimeout: 3000,
      async: true
    },
    h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='https://use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s)
  })(document);
</script>
```

これをNuxt.jsのプロジェクトへ組み込むメモです。

## スクリプトの読み込み
adobeからスクリプトを読み込ませます。

```javascript:nuxt.config.js
export default {
  head: {
    script: [
      { src: 'https://use.typekit.net/<PROJECT_ID>.js' }
    ]
  }
  /* 他の設定は省略 */
}
```
`<PROJECT_ID>`にAdobe Fontsで設定したWebプロジェクトのIDを入れてください。

## Typekitを実行

任意の場所で`Typekit.load({async: true})`を実行するとフォントが読み込まれます。

```vue:layout/default.vue
<script>
export default {
  mounted() {
    Typekit.load({async: true})
  }
}
</script>
```

フォントの読み込みが完了する前に字形の異なる文字が表示されると都合が悪い場合は、loading周りといい感じに連携してください。

```vue:layout/default.vue
<script>
export default {
  loading: false,
  mounted() {
    this.$nextTick(() => {
      this.$nuxt.$loading.start()
      Typekit.load({
        async: true,
        active: () => {this.$nuxt.$loading.finish()}
      })
    })
  }
}
</script>
```

```vue:components/loading.vue
<template>
  <transition name='l'>
    <div v-if="loading" class="h-screen fixed inset-x-0 top-0 bg-white"></div>
  </transition>
</template>

<script>
export default {
  data: () => ({ loading: true }),
  methods: {
    start()  { this.loading = true  },
    finish() { this.loading = false },
  },
}
</script>

<style lang="css" scoped>
.l-enter-active { transition: all .5s ease-out }
.l-leave-active { transition: all .5s ease-out }
.l-enter, .l-leave-to { opacity: 0 }
.l-enter-to, .l-leave { opacity: 1 }
</style>

```
```javascript:nuxt.config.js
export default = {
  loading: '@/components/loading.vue'

  /* 他の設定は省略 */
}

```

## さいごに
`scriptTimeout`の設定は無視してるんで、そこはまたいい感じに...
TJBotを会社の仲間に紹介してみた

他人に教えるほど詳しい訳ではありませんが、ちょうどAIやプログラミングのスキルが求められてきたので、何ができるのかイメージを掴んでもらうために会社の仲間に紹介してみました。
ちょうど有志だけのゆるい勉強会のテーマとして手を挙げてます。

# TJBotの紹介
最初に、TJBotは何者で、どうやって作るのか、何ができるのかなど紹介しました。
"TJ"は「Tomas Watson Jr.」に由来してるとか、レーザーカッターの話で思わぬ盛り上がり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209601/1d72bb26-e218-d618-375f-b2cd65d49c55.jpeg" width=50%>


# TJBotでのデモ
以下のような簡単なデモを実施して、何ができるのかイメージを膨らませてもらいます。
### 見えたものを判別
画像認識の機能を使ってカメラで見たものを喋ってもらいました。
「PCを操作する人」など無難な分析結果に安堵。
### 年齢判別
事前にどれくらいの精度かは確認してますが、カメラで写した顔写真から性別・年齢の幅を喋ってもらいました。
白髪混じりの男性だと50歳台、髪の毛が黒いと40歳台、童顔の40台だと30歳台にそして女性は概ね実年齢マイナス15歳という忖度ぶり。
「いいやつだねー」となかなかの評判です。
### 顔表情や動き判別
サンプルコードを利用して、顔の表情でランプを点灯させます。歯が見えるとご機嫌な赤ランプです。
最後は手を挙げるとTJBotも手を挙げる・・・はずなのですが、なかなか挙げてくれません。

### NODE-REDの紹介
デモで利用したコーディング内容を紹介して、従来のコーディングとは異なる簡単な開発環境をご案内。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209601/4d83eeaa-3932-f2e1-7255-032c4ae70d09.jpeg" width=50%>

# TJBotで何ができるかディスカッション
最後にTJbotで何をしたいか何をしてほしいか、みんなでディスカッションです。
・子どもと会話させたい。
・子どもが何をしてるのかリモートで観察できると便利。
・タイヤやキャタピラ付けて動けるようにしたい。
・夜、オフィスの灯りが消えたら人を検知してそこだけ灯りを付けてほしい。
・英語モードにして英語で会話したい。
などなど・・・うーん頑張ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209601/fb401917-1ac7-32b1-e96b-f6284537bb8e.jpeg" width=50%>

# 終わりに
この小さなボディーに目も耳も口も腕もあるロボットをコーディングできてしまう感動を皆さんに伝えられたか分かりませんが、とても楽しいひとときでした。
もう少しバージョンアップしてまた企画します。
CentOS で ssh に突然パスワードが求められるようになった。。

# 事象

ある日気がついたら、vagrant up で起動中に

```
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```

となって起動に失敗する
とはいえ、vagrant sshでpasswordがもとめられ、passwordを入力したらログインはできる。

```
$  vagrant ssh
vagrant@127.0.0.1's password:
Last login: Sun Dec  8 21:25:06 2019 from 10.0.2.2
```

でも、ローカルのディレクトリはマウントされていないんです。。

## 環境
windows10 + vagrant + CentOS

## 解決方法

環境構築したてだと、.sshの権限周りとか、
windows updateに伴う、vagrant ssh-configから確認できるホスト側の秘密鍵の権限とか
あるみたいですが、

今回の場合、ちょっとした必要があって、 /home/vagrant のpermissionを777にしたのが原因でした。

chmod 700 /home/vagrant
で無事解決

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/a3c69d96-649d-ad70-6f73-ae5c8f11d1bd.png)
[Python] pathlib.Pathのリストを自然順ソートする

## 概要

pathlib.Path形式の要素を持つリストには，natsorted()関数が適用できません．
そこで，自然順ソートするための関数を自作しました．

## sorted()関数とnatsorted()関数

sorted()関数は，リストの要素を辞書順ソートする関数です．
例えばこのようなリストがあるとき，

```Python
strs = ["dir/10", "dir/1", "dir/3" , "dir/24"]
```

このように書けば，

```Python
for s in sorted(strs):
    print(s)
```

こうなります．

```
dir/1
dir/10
dir/24
dir/3
```
辞書順なのでまあそうなるのが妥当なんですが，人間の感覚ではいささか気持ち悪いですね．

対してnatsorted()関数は，リストの要素を自然順ソートする関数（モジュールが必要）です．
同じリストに対して，このように書けば，

```Python
from natsort import natsorted

for s in natsorted(strs):
    print(s)
```

こうなります．

```
dir/1
dir/3
dir/10
dir/24
```
やっぱり，こっちの方がしっくりきます．
natsorted()関数最高！

## Pathが要素だとどうなるか

例えば下のようなディレクトリ構造のとき，

```
dir
  ├ 1
  ├ 3
  ├ 10
  └ 24
```

このようにpathlib.Path形式のリストが作成できます．
pathlibモジュールに関しては調べれば解説がたくさん見つかるので割愛で．

```Python
import pathlib

paths = [p for p in pathlib.Path("./dir/").iterdir() if p.is_dir()]
```

じゃあこれを自然順ソートしてみると，

```Python
from natsort import natsorted

for p in natsorted(paths):
    print(p)
```

こうなります．

```
dir\1
dir\10
dir\24
dir\3
```

**辞書順じゃん！**
まあきっとPath形式には対応していないんでしょうな．
だから辞書順で読み込んで，そのまんまになっていると．
要素はstrとかintじゃないといかんということですかね（記事投稿から数年たったが調べていない）．

## 解決策

こんな関数を自作しました．
sorted()関数はkeyを引数に指定できることを利用しています．
#コメントでnatsorted()でも同じ書き方ができることを教えていただきました！

```Python
def paths_sorted(paths):
    return sorted(paths, key = lambda x: int(x.name))
```

これをこうやって使えば，

```Python
for p in paths_sorted(paths):
    print(p)
```

こうなります．

```
dir\1
dir\3
dir\10
dir\24
```

望み通りの結果が得られました！

## その他

この場合はディレクトリ名が数値だったのでディレクトリ名をintに変換してkeyとしました．
no1, no2...みたいに文字列を含む場合はstrにしてnatsorted()を使えばよいかと思います（モジュールは必要だけど）．
ディレクトリじゃなくてファイルでも同様の方法が適用できるはずです．
kinesisを利用した際のアンチパターン

パーソンリンクアドベントカレンダー11日目の投稿です。
こんにちは桑原です。

kinesisを案件で使った際にサクッとうまく行かない構成で開発を行ったのでアンチパターンとしてメモしておきます。

#kinesisとは
まず初めにkinesisについて解説します。
ざっくりいうと膨大なデータをシャードという単位でまとめて別のシステム送信するサービスとなります。
送信先にはS3、Lambda、Firehoseなど様々なAWSのサービスへ連携が可能です。

以下、AWS公式の解説です。
Amazon Kinesis でストリーミングデータをリアルタイムで収集、処理、分析することが簡単になるため、インサイトを適時に取得して新しい情報に迅速に対応できます。Amazon Kinesis は、アプリケーションの要件に最適なツールを柔軟に選択できるだけでなく、あらゆる規模のストリーミングデータをコスト効率良く処理するための主要機能を提供します。Amazon Kinesis をお使いになると、機械学習、分析、その他のアプリケーションに用いる動画、音声、アプリケーションログ、ウェブサイトのクリックストリーム、IoT テレメトリーデータをリアルタイムで取り込めます。Amazon Kinesis はデータを受信するとすぐに処理および分析を行うため、すべてのデータを収集するのを待たずに処理を開始して直ちに応答することが可能です。

※https://aws.amazon.com/jp/kinesis/

##仕組み
![product-page-diagram_Amazon-Kinesis-Data-Streams.074de94302fd60948e1ad070e425eeda73d350e7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16537/1d52b5f9-95e7-4a78-1753-730206ec0e5d.png)


#kinesisに連携可能なサービス
今回は案件で利用しようとした2つを紹介します。
##Amazon Kinesis Data Firehose
　Firehoseはkiensisからのデータを別のサービスへロードすることができます。
　kinesis →　Firehose → s3のような連携であればコンソールからの設定のみで実行可能です。
![product-page-diagram_Amazon-Kinesis-Data-Firehose.9340b812ab86518341c47b24316995b3792bf6e1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16537/7369fce8-bda6-ca6a-f08e-75b51a98c7df.png)
※https://aws.amazon.com/jp/kinesis/data-firehose/

##Amazon Kinesis Data Analytics
　Analyticsはkinesisから受け取ったデータをリアルタイムで分析を行うことが可能です。
![product-page-diagram_Amazon-Kinesis-Data-Analytics.cf473c775449f721253e75499195c8a8dfb3d86c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16537/c19ea7cc-c636-20db-77b8-68e06b9bf988.png)
※https://aws.amazon.com/jp/kinesis/data-analytics/


#今回陥った事象
上記のkinesisに連携可能なサービス一覧に連携できない状態に陥りました。
##kinsisに合わない仕様(AWSサポートお墨付き)
kinesisはデータを送信する際にレコード単位で処理できる想定ですが、今回の用件ではデータが圧縮されて送信される状態でした。
圧縮することでシャード数を削減し、料金を大幅に下げることが可能なためこの仕様を選択したとのことでした。(一理あります)
詳しい数字は出せないのですが計算上シャード数は10分の1程度まで下がり料金的にも大幅な削減となっていました。
しかし圧縮することで連携できないサービスがあることが判明しました。

##連携できないサービス
kinesisに連携可能なサービス一覧で記載した下記サービスに非対応の圧縮ファイルを用いることで意図した挙動で処理が実行されない状態でした。
マネージドサービスが使えずにとても悲しかったことを覚えています。
・Firehose
・Analytics(zipは対応しているようです)

##対応方法
Firehoseが利用できないことがわかったため、lambdaとfluentdを使ってkinesisからデータ取得を行っています。
それぞれの処理途中で解凍処理を実行しています。
現状では膨大なデータでの連携テストを実施できていないですが、秒間数千程度であれば処理途中での解凍は問題なく実行できています。
処理速度の問題でPythonからGoへ言語を変更するなどを行いました。

#今後起きる可能性がある未解決事項
kinesisの後続処理で解凍とリアルタイムでのデータ送信を行っているため、秒間数十万件というデータが流れてきた場合にkinesisと同じ速度でデータを流すことが可能なのかの検証が必要です。
スケールアウト可能な設計になっているのでkinesisで節約した分がここに乗る気がしています。

#まとめ
サービスにあった仕様で構築できれば公式のベストプラクティスに当てはまった開発もでき期間の短縮が可能だったと思います。
サービスには想定された使い方がありそこから外れると大変な目に合ったという体験談でした。
link_toメソッドの具体的な仕組み


Scaffoldでプロジェクトを作ると下記のようなリンクがindexなどに生成されるとおもうが、link_toメソッドの中に何があるのかいまいち理解せずに進めてしまっていた。

```
<% @products.each do |product| %>

----省略ーーー
<span><%= link_to 'Show', product %></span> 
<span><%= link_to 'Edit', edit_admin_product_path(product) %></span> 
<span><%= link_to 'Destroy', admin_product_path(product), method: :delete, data: { confirm: 'Are you sure?' } %></span>
```
Showは表示される名前であることはわかると思います。

しかしproductってなんだ？？

多分eachメソッドのproducなんだろうけどproduct単体でいるのがよくわからない。。。

**実はこれ省略されているんです！！**
[参考](https://web-camp.io/magazine/archives/16857)

```
<span><%= link_to 'Show', product_path(product) %></span>
```
これが省略せずに書いたものです。productはパラメーターとして渡されているんですね。
下記の流れをちゃんと把握しているとよく理解できると思います！


- 画面からリンク押下してURLとHTTPメソッドがリクエストされる
 - それが ターミナルにログとして出る
- コントローラーで想定したアクションが呼び出される
 - どのコントローラー、アクションが選択されたかログとして出る
 - アクションの途中で値が見たくなれば pやputs でできる
- レスポンスして画面が表示される
LINEMessagingApiを使って簡単なBOTを作成する

### SDKのインストール
https://github.com/line/line-bot-sdk-php
`composer require linecorp/line-bot-sdk`

### WebhookをLINEDevelopersの管理画面から登録する
<img width="757" alt="スクリーンショット 2019-12-09 18.53.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236230/0fbded58-6dcd-22f5-d418-f20b2f3a6c39.png">

ページ真ん中にある「Webhook settings」にwebhookのURLを設定（httpsじゃないとダメです）して、「Use webhook」のトグルをONにします。
<img width="1403" alt="スクリーンショット 2019-12-09 18.55.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236230/95f005dd-8eeb-48c3-02b9-99ce3c9ff861.png">

### メッセージを受け取ったときに、送信されたメッセージを返すBOTを作る

``` PHP
$signature = $request->headers->get(HTTPHeader::LINE_SIGNATURE);

$httpClient = new CurlHTTPClient('管理画面から取得できる Channel access token');
$bot = new LINEBot($httpClient, ['channelSecret' => '管理画面から取得できる Channel secret']);
$events = $bot->parseEventRequest($request->getContent(), $signature);
foreach($events as $event) {
    if($event instanceof MessageEvent) {
        $bot->replyText($event->getReplyToken(), '「' . $event->getText() . '」と発言しましたね。');
    }
}
```

このBOTに対して何か発言するとこんな感じになります。
![ZKToOKlTueo67AVSXTYL1575886195-1575886200.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236230/25f6f149-728f-cf9c-b29d-4d3623054119.gif)

### ちょっと改造する
先ほどのコードを少し改造して、確認ダイアログ的なものを出してみたいと思います。
先ほどは、`replyText`メソッドを呼んでただのテキストメッセージでしたが、replyMessageメソッドにはMessageBuilderのインスタンスを渡せるのでちょっとリッチなメッセージを送れたりします。
https://github.com/line/line-bot-sdk-php/blob/4e16fb07379a9cab76b9136ff3057fbf40ef8360/src/LINEBot.php#L123-L129

``` PHP
if ($event instanceof MessageEvent) {
    $confirmBuilder = new ConfirmTemplateBuilder('「' . $event->getText() . '」と発言しましたね。', [
        new MessageTemplateActionBuilder('はい', 'はい'),
        new MessageTemplateActionBuilder('いいえ', 'いいえ'),
    ]);
    $builder = new TemplateMessageBuilder('test', $confirmBuilder);
    $bot->replyMessage($event->getReplyToken(), $builder);
}
```
![PDf9C8oRuOmz7NadEVbS1575888539-1575888551.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236230/d90e1b94-261e-5b1b-5590-c2c4b347016e.gif)


### 終わりに
https://developers.line.biz/ja/docs/messaging-api/
MessagingAPIでできることはまだまだたくさんあるので、相手の発言によってアクションを変える等すればもっとBOTっぽくなりますね。
相手からのメッセージを正規表現で判定等しないといけなさそうではありますが。。。
WP2StaticにてクロールするURLを追加/削除する

タイトルのままなのですが、WP2StaticにてクロールするURLを追加/削除するための
フィルターがあるので、そちらの紹介です。
公式ページには書いておらず、GitHubにあるドキュメントを読まないとわからないという…。
ちょっと調べるのも面倒だったので、こちらに書いておこうと思います。

# wp2static_modify_initial_crawl_list
WP2StaticはクロールするURLが自動で生成されるのですが、クロールするURLを変更できるwp2static_modify_initial_crawl_listというフィルターフックが用意されています。

```
apply_filters(
    'wp2static_modify_initial_crawl_list',
    $url_queue
);
```
$url_queue にクロール対象になるURLが入ります。
最終的にこの変数をクロールさせたいURLのみにします。

# サンプル
### 追加
追加したいURLがある時は`$url_queue`に追加して返します。
この場合は`$additional_urls`で指定しているURLがクロール先として追加されます。
以下は公式にのっているものをちょちょっと書き直したものです。

```
function add_additional_urls( $url_queue ) 
{
    $additional_urls = [
        '/custom_link_1/',
        '/custom_link_2/',
    ];

    $url_queue = array_merge(
        $url_queue,
        $additional_urls
    );

    return $url_queue;

}
add_filter('wp2static_modify_initial_crawl_list', 'add_additional_urls');
```

### 削除
逆にクロールしてほしくないURLは`$url_queue`から削除します。
（いろいろやり方はあると思いますが、例を…。）

例：クロール対象のURLが以下で、entry_23をクロール対象外とする場合
/blog/entry_22/
/blog/entry_23/
/blog/entry_24/
/blog/entry_39/

```
function remove_extra_urls($url_queue) 
{
	$idx = array_search('/blog/entry_23/',$url_queue);
	if($idx !== false) 
	{
	    array_splice($url_queue,$idx,1);
	}

    return $url_queue;
}

add_filter('wp2static_modify_initial_crawl_list', 'remove_extra_urls');
```

※書き方はいろいろあると思います…。最終的にクロールしてほしくないURLをぬいたものがreturnできていればよいです。

クロール対象は以下のURLになります。
/blog/entry_22/
/blog/entry_24/
/blog/entry_39/


# 注意事項など
add_filterで関数をひっかけていくのですが、追加/削除の関数を別にしている場合は
関数の実行順序管理をしっかりとしてないとちょっと泣きます。

WP2Staticの自動検出だと日付アーカイブはクロールされないので自分で作成した関数で追加し、テーマフォルダの中にあるjsなどを拾いに行ってしまうので、削除したり。
自動だとちょっと上手くいかない…というときはどうぞ。
遺伝的アルゴリズム的なものを作ってみたお話

#はじめに

最近AI/アルゴリズムの講演を聞きました。そこで、遺伝的アルゴリズムに興味を持ったので「作ってみたい！」と思い、作成したので、何かの参考になればと思いご紹介します。

[遺伝的アルゴリズムとは~Wikipedia~](https://ja.wikipedia.org/wiki/%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)

#実際の挙動

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/30af46bd-89a5-cd7d-66f3-a11a69e1fe65.gif)
---

![movie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/44c5b0b0-c2bd-da16-1e9f-90f13ddd1404.gif)

---

![movie2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/37a9f785-94da-b1b9-1e92-8a89226f5bcd.gif)


これらは毎フレームランダムに動かしているだけですが、とても人工知能ぽくみえます。


##実践

ソースコードはこちら
※3D空間上でXZ平面を走っているのを上から撮影しています

``` car.cs
float rotVelo = Random.Range(-rotateSpeed, rotateSpeed);
transform.eulerAngles = transform.eulerAngles + new Vector3(0, rotVelo, 0);

float posVelo = Random.Range(0, moveSpeed);
transform.position += transform.forward * posVelo;
```

このObjectを

![movie3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/69703150-d575-72ae-0b56-769ac63dfdfa.gif)

20体用意して、


![movie4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/d3b2e0ef-8224-49c6-d740-53aaa0eb3ed7.gif)

100mごとに障害物を置きます。

##移動データの記録

それから動いた記録を保存するデータを作成します。

```data.cs
[Serializable]
public struct MoveData
{
    public float pos;
    public float rot;
    public MoveData(float _pos, float _rot)
    {
        pos = _pos;
        rot = _rot;
    }
}
```

これのリストを作ってランダムに動いた結果を保存しておきます。
具体的な保存の値はそれぞれ、上記の```rotVelo```と```posVelo```です。

全員が壁にぶつかったら集計をします。

その際にどのObjectが一番進んだかを確かめて次の世代を生成します。

##遺伝子の受け継ぎ

``` marry.cs

for (int i = 0; i < 一,二番優秀移動データリスト.Count; i++)
{
  bool l = Random.Range(0,2) == 0;
  次世代.移動データリスト.Add(l ? 一番優秀.移動データリスト[i] : 二番優秀.移動データリスト[i]);
}
```

こうすることで二人の親の遺伝子(移動データ)を持った子供が生まれます。
parent1+parent2->child1
parent1+parent3->child2
parent2+parent3->child3
parent2+parent4->child4
parent3+parent4->child5
parent3+parent5->child6

と子供を作っていきます
child7は一番優秀のデータをそのまま受け継ぎます。(最高記録が下がらないように)
chaild8,9,10はランダムに選んだ二人の遺伝子を組み合わせます。


ですがそこで突然変異を起こします。

##突然変異

一定の確率で値をおかしくしてほしいので、

``` totuzennhenni.cs
if(突然変異する)
{
  for (int i = 0; i < 突然変異.移動データリスト.Count; i++)
  {
    突然変異.移動データリスト.Add(l ? 一番優秀.移動データリスト[i] : 二番優秀.移動データリスト[i]);
  
    foreach(var 移動データ in 突然変異.移動データリスト)
    {
      if(Random.Range(0 , 突然変異でどれくらい変わるか) != 0)
      移動データ.pos *= Random.Range(0,2);
      移動データ.rot *= Random.Range(-2,2);
    }
  }
}
```

こんな感じで突然変異させます。

これらの出来上がったデータをObjectに記録させて、
第２世代が始まります。

##第２世代

第２世代は遺伝で受け継いだデータのとおりに動きます。
データがなくなったらランダムに動き始めます。

これらを繰り返して行くとこんな感じになりました。

[YouTube AI/Algo DEMO](https://www.youtube.com/watch?v=gKUPaMVZBc4)


#終わりに
講演とかYoutubeの動画を見ながらこんな感じで作るのかなーって作りきりました。
いいお勉強になって楽しかった。
jQueryしか書けなかった自分がVueを使えるようになるまでの話と同じような環境の人たちへ

この記事はVue #2 Advent Calendar 2019の10日目です。

昨日は @i-ryo さんの [【Vue.js】Vuexの「状態管理」はいったい何の状態を管理しているのか調べた](https://www.i-ryo.com/entry/2019/12/03/063040) でした。

# JavaScriptといえば、jQueryだった

Vueを触る前はHTML+CSS+jQuery+WordPressが主な使用言語でした。以前は小〜中規模なWebサイト制作がメインだったので、JavaScriptを操作する場面というのは多くありませんでした。

使ってもハンバーガーボタンの操作やjQuery プラグインのスライダー、ちょっとしたエフェクト程度です。少なくとも状態管理をするような案件はほとんどなく、DOM操作がメインなのでjQueryで十分でした。

1つだけ状態管理をする案件があり、案件としてはVueに最適でしたが、jQueryでごり押しました。過去の自分に教えてあげたい。

# VueってWebアプリケーションやSPAのためのものでしょ？

Vueを学習する前は自分もそう思っていました。Webサイト制作がメインの自分にはあまりメリットがないのかと。確かに小規模でSPAでもないWebサイトであればVueで作るメリットは少ないです。中規模になってくると、共通パーツが出てきたり、さまざまなインタラクション処理が出てきます。そこでVueのコンポーネント機能や便利なAPIを活用できます。

クリックやホバーといったマウスアクションに対する処理やフォーム入力、キーボード操作などにもAPIが用意されているので、楽にその処理を書けます。Vue単体ではSPAになりますが、Vueを拡張したフレームワークNuxtを使えばSPAの利点を活かしつつ静的サイトも作れます。

# jQueryしか分からない自分がVueを始めてぶち当たった壁

Vueを学習し始めて、いくつか壁にぶつかりました。

## JavaScriptの知識が足りてない

jQueryしか触ってこなかった自分には素のJavaScriptの知識が不足していました。DOM操作はdocument.querySelecter()などで置き換えればよかったですが、配列の操作などはpushとshiftくらいしか分かりません。filterメソッドの書き方もよく分からなかったですし、コールバック関数もあまり理解していませんでした。さらに、API取得で重要な非同期処理についてはほとんど知識0の状態です。

そのためVueの課題に出てくるfetchメソッドや配列操作など、Vueとは別のところで苦戦しました。Vue学習と並行して、JavaScriptの勉強もしました。

## state管理という概念
Vuexを用いたstate管理というのは新しい概念でした。それまでのjQuery案件ではそんなに状態管理をする場面がありませんでした。せいぜいメニュー、アコーディオンの開閉状態くらいです。それをstoreで集中管理するという概念は新しいものでした。

最初はそのありがたみはよく分かりませんでした。上記のような例であれば関数内に状態を持たせてしまえば良いですが、WebアプリケーションやSPAなどのページ遷移をせず、画面が切り替わる場合には面倒になってきます。

SPAなどでなくても、現代のWebサイトは単純に表示するだけでなく、画面内で処理を行う場面が増えてきました。メニューの開閉以外にも入力状態などを管理するときにstoreを用いた集中管理は便利です。

## 学習半ばでVue CLIに手を出した。
実際の現場では`<script>`タグで読み込むよりはnpm(yarn)で環境構築して開発する方が多いかと思います。教本のテンプレート機能の章を飛ばして、単一ファイルコンポーネントによる開発に手を出してしまいました。そのためエラーが起きてもテンプレートの構文ミスなのか、単純な処理のミスなのか問題の切り分けが大変で、自らの首を締める結果になりました。

## 同時にTypeScriptにも手を出した。
さらには全く触ったことのないTypeScriptにも手を出したので、より難易度は高まってしまいました。これは先程の問題と同様TypeScriptエラーなのかどうかも分からず、苦戦が続きました。（~~とりあえず、anyでつぶした~~）

先回りや近道などせず、地道に教本の通りに進めていくのが良いです。

# それでもVueは習得できた

そんな自分でもVue自体の習得は難しくなかったです。というのもVue自体はフレームワークであり、「書き方」さえ覚えれば使えるようになります。もちろん、mutation, actionによるstate変更手続きやdispatchの記法などや、Vuexによるstateの管理など新しい概念はありましたが、書き方自体はすごく難しいわけではありません。
 
# 大事なのはJavaScriptがきれいに書けること

結局、自分が一番時間をかけたのは中の処理の書き方、つまりJavaScriptを書けるようになることでした。VueはJavaScriptのフレームワークであるので、JavaScriptがきちんと書けることが大切です。基本的な配列の操作、非同期処理の知識はVueを使いこなす上で大切になってきます。現代的なJavaScriptの書き方（ES6仕様やアロー関数など）も同時に勉強しました。

自分の場合、Vueを使えるようになってもJavaScriptが稚拙だったので、初めてオリジナルで作ったVueプロジェクトは今見返すと、結構ひどい出来でした。（一応目的通り動きますが、全然スマートな書き方ではありませんでした。）

逆を言えば、Vue自体の学習コストはそこまで高くなく、導入は簡単です。教本の通りに進めていけば、TODOリストなりのSPAはすぐに作れるようになります。

# さいごに

フレームワークは面倒なことを手軽に実装できます。jQueryは画面（DOM）操作を簡単にし、VueはJavaScriptによる動的な処理や状態管理の実装を簡単にしてくれます。VueとjQueryの目的はそれぞれ違うので、完全上位互換というわけでもありません。

最近のWebサイトは単純なDOM操作だけでなく、画面上の動的な処理を行う場面も増えてきていますので、Vueを活用できる機会もより増えてくると思います。もし、自分と同じようにjQueryしか書けず、Vueに挑戦したい人の助けになれば幸いです。
FeSS概論

# FeSSとは
私達のチームで検証改善を繰り返しながら取り組んでいる、オリジナルのスクラムフレームワークです。
__F__lexibl __e__　__S__cale　__S__crum の略称で、LeSSをモジッた名称を掲げています。

## FeSS導入により目指したい姿
より状況にFitするように
よりDoneを意識するように
より変化に柔軟であるように

## FeSSの前提条件
* バックログアイテムやIceboxは常にリファインメントされている
* 新たに発生したストーリー（≒チケット）は、早いうちにポイント見積もりが済まされている

## ストーリーとDoneの定義
* ストーリーのディスクリプションは、いつ見ても内容が理解できる粒度で定義されている。
* ストーリーは、１スプリント以内でDone出来るレベルで細分化されている。
* ストーリーは、PO目線で理解・判断出来る単位で分割され、Doneの定義が言語化されている。
* ストーリーには、エンジニア目線で理解・判断出来る単位でタスクが分解され、進捗が可視化されている。

## チーム編成
* チームはスプリント毎に１つ以上のストーリーを担当し、スプリント内でDoneさせる。
* スプリント毎に、そのスプリントでパフォーマンス最大化出来るチーム編成を行う。
* 先行着手などで、次スプリントにWIPが引き継がれる際、そのチーム編成はスプリントプランニングの場で改めて検証を行う。
* チーム全体で最善の選択と判断する場合、__全員で１チーム__や__１人チーム__という編成も許容する。

## スクラムイベント

| イベント名 | 内容 | 参加者 |
|---|---|---|
| スプリントプランニング1 | 次スプリントで対応すべきストーリーを決定し、最適なチーム編成を行う。 | 全員 |
| スプリントプランニング2 | チームごとに分かれ、ストーリーをエンジニア目線でタスク分割を行う。<br>その際、スプリント内で消化ができるか、余白が生まれるかの議論も行ない、担当ストーリーの削減、追加の検討を行う。 | 各チーム |
| スプリントプランニング3 | プランニング2で出た結論を各チームの代表者が持ち寄り、POと共にスプリント内で取り組むストーリーの調整を行ない、最終確定する。 | PO・SM・チーム代表者 |
| デイリースクラム1 | 各チームの日々の進捗と課題についてチーム内で共有する。 | 各チーム |
| デイリースクラム2 | 各チーム代表者とPOで、状況の共有を行う。 | PO・SM・チーム代表者 |
| スプリントレビュー | スプリントでの成果物をPOに向けてデモを実施し、Doneの定義に沿っているか、価値提供が出来るかの判断を仰ぐ。<br>デモの実施は、各タスクの担当者ではなく、ストーリー単位で代表者が行う。 | 全員<br>ただし、発表者はチームの代表 |
| スプリントレトロスペクティブ | 前スプリントを振り返り、ファクトの洗い出しと考察、ネクストアクションの決定を行い、改善活動を行う。 | 全員 |
（ネタがなかったので）2日ほどかけて社内向け端末管理アプリを作ってみた

この記事は[フラー Advent Calendar 2019](https://adventar.org/calendars/5034)の 10 日目の記事です。

この会社に入って一年半、Androidエンジニアとして走り続けました。
しかしながら、土日に入って「何を書こうかな」と考えた所、なんだかどれも記事にしづらかったり、記事にしていいのかわからない内容だったりしました。
ので、新しく記事にできそうなものを作ろうと思い立ちました。

##何故、端末管理アプリを作ったか

起稿の１週間ほど前にちょうど弊本部長から、「端末管理を`フラーに合った形`で、ちゃんと運用できるようにしてほしい」との依頼が入り、どうするかちょうど考え中でした。

現在弊事業部では、端末の貸し出し管理を紙で運用しています。
貸し出しを行う時には、紙に「貸出端末」「貸出者」「借りた日」を記載し、返却時に「返却済み」にチェックを入れます。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547773/c7fb5376-0b7f-e7a6-0503-5ebbdacdb6c7.png)

……辛いですね。
何が面倒かというと
**1.フラー社内の端末管理対象が増え続けていて、どんどん書き込まれていくため見辛い**
**2.定期的な棚卸しがしづらい（されてない）**
**3.紙運用で、誰が持っているかとかを確認しづらい（そもそも面倒なので書かない）**
この辺でしょうか。

スタートアップの初期段階では紙運用でも問題なく回っていたのだと思いますが、フラーも従業員＆端末が爆増中。紙運用が辛くなってきた次第です。

GoogleCalendarや、Slack、Jiraでの運用も考えましたが、やっぱりそれ用に作られたものじゃないのでつらいなぁという感じ。
あと、みんなの前職で端末管理どうやってたか聞くと、やっぱりそれ用のソフトウェアを使っていたりしたので、どうせそこに行き着くんだろうなという結論に至り作り始めました。

##構成
フラーは柏の葉と新潟の２拠点あり、それぞれで端末を借りることができます。
この特性上、`sharedpreferences`などを使ってローカル管理するわけにもいかないので、サーバーらしきものを立てないといけません。
しかしながら私はしがないAndroidエンジニア、サーバーを立てたりし始めると時間がかかってしまいます。
そこで長岡花火アプリでもお世話になった、FireStoreを使うことにしました。
構成は単純で、FireStore上に更新されそうなデータ達「端末データ」「貸出者データ」「事業部データ」「支社データ」を格納して、それをReadWriteするだけです。

##実際に作ったもの
登録したデータは簡単にこんな感じ
<img width="1017" alt="スクリーンショット 2019-12-09 17.08.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547773/4e127d95-846f-5479-65fa-a7b32850f981.png">

アプリ側はこんな感じでリストが見れ、条件で検索もできます。
![スクリーンショット 2019-12-09 17.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547773/6a56a096-081b-b1ee-7623-edce556f1dfb.png)

RecyclerViewのアイテムをタップすると詳細が見れて、貸出する場合はユーザーと返却予定日を入力させます。
![スクリーンショット 2019-12-09 17.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547773/c3a9342c-f00c-2fe9-a9b4-8bbd2b6da76e.png)


##FireStoreQueryの動的生成
動的生成にちょっとだけ詰まったので。

FireStoreへの問い合わせQueryは、普通にするなら以下の感じでいけます。

```kotlin
collection
    .whereEqualTo("company_id", companyId)  
    .get()
    .addOnSuccessListener {
```

しかし今回、検索機能をつけているので、EditTextなどの条件を元に、FireStoreに問い合わせるQueryを変更しなければなりません。

最初は以下の感じで実装すれば、collectionに条件をどんどん追加してくれるんだと思っていたのですが、これをやると検索条件が追加されていなかった。

```kotlin
var collection = db.collection(getString(R.string.firestore_devices_collection_name))
    val companyId = binding.editCompanyId.text.toString()
    collection.whereEqualTo("company_id", companyId)
collection
    .get()
    .addOnSuccessListener {
      // ...
    }
```

一旦collectionのQueryをとって、` collection = collection.whereEqualTo`をやってやらないといけないんですね。

```kotlin
var collection =
    db.collection(getString(R.string.firestore_devices_collection_name)) as Query

    val companyId = binding.editCompanyId.text.toString()
    collection = collection.whereEqualTo("company_id", companyId)
collection
    .get()
    .addOnSuccessListener {
...
```
ちょっと分かりづらかった。

##終わりに
デザイナーがいないので見た目がちょっと雑になってしまいましたが、一旦これを端末保管場所の隣に置いて運用してみようかと思います。
だいたい２日でProject作成から一旦完成まで持っていくことができました。
今後は返却日超過者などをSlackに通知できるようにしたりして、棚卸しへの対応などもできるようにしたいなと思っております。
FireStore、便利だなぁ… :relaxed:
Go 並行処理

ゴルーチンやチャンネルといった並行処理についてまとめます

## ゴルーチンとは
- Goにはゴルーチンという軽量スレッドの仕組みがある。（main()関数も1つのゴルーチンの中で実行されている）
- go構文を用いて、任意の関数を別ゴルーチンとして起動することで処理を並行にして走らせることができる

## チャネル
- 複数のゴルーチン間でデータをやり取りしたい場合に用いる
- メッセージパッシング(情報をメッセージとして送受信する)によってデータを送受信することができる
- make()関数に型を指定して生成することで、その型のデータの書き込みと読み出しができる。

```go:main.go
// stringを扱うチャネルを生成
ch := make(chan string)
// チャネルにstringを書き込む
ch <- "a"
// チャネルからstringを読み出す
message := <- ch
```

ゴルーチン内で取得したステータスコードをチャネルに書き込み、main()のゴルーチンで読み出すことでデータの受け渡しを実現する

```go:main.go
package main
import "fmt"

func main() {
  urls := []string {
    "https://example.com",
    "https://example.jp",
    "https://example.net",
  }
  statusChan := make(chan string)
  for _, url := range urls {
    go func(url string) {
      res, err := http.Get(url)
      if err != nil {
        log.Fatal(err)
      }
      defer res.Body.Close()
      statusChan <-res.Status
    }(url)
  }
  for i := 0; i < len(urls); i++ {
    fmt.Println(<-status)
  }
}
```
docker for windows on nginx 設定方法

#備忘録

nginxの設定ファイル
nginx.conf

デフォルトはコンテナの中にあるため編集する場合はアタッチする。

```
## 実行中のコンテナからnginxの設定を取得する。
$docker exec CONTAINER_ID nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

## プロキシー環境の場合は以下の設定を行う
$ export http_proxy="http://HOST_NAME:PORT_NUMBER/"

## コンテナにviをインストールする
$ apt-get update
$ apt-get upgrade
$ apt-get install vim

## nginxの設定を編集する。
$ docker exec -i -t CONTAINER_ID /bin/bash
$ vi /etc/nginx/nginx.conf
```
Xcode：CocoaPodsで入れたライブラリを上書きしてprint挟んでも出力されなかった

自分で作ったライブラリをCocoaPodsに上げて、それを使ってアプリ開発をしていたのですが、途中でライブラリ内の関数でprintデバッグしたくなったのになかなか出力されなくて困りました。

ちなみに、上書きしようとするとこんな感じのポップアップが出てきますよね。
![Screen Shot 2019-12-09 at 18.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/f0857d6f-fd8c-ee5d-5069-26071a2ee625.png)

とりあえず普通にリビルドしてもダメ。こう言う時はDeriveDataだと思って消してみてもダメ。そうだCleanしようと思ってshift + command + Kを押してビルドしてみてもなんかダメ。なんだこれは？ってなってググってみても全然解決策が出てこない。と言うか、このような案件で困る人がいないっぽい？？と思いながら粘って検索していたら、Stack Overflowに答えがありました。
[Xcode/Swift: Display “print” that I added to CocoaPod](https://stackoverflow.com/questions/32577227/how-to-use-images-asset-catalog-in-cocoapod-library-for-ios)

え？結局クリーンするのかよ、それはもう試したよと思いながら、ふと思いつき、ショートカットからではなくメニューバーから直接Clean Build Folderを叩いたところ、あっさりprintされました。一体なんだったんでしょうか...。

ショートカットでクリーンしたかどうかは直接の原因じゃない気がしますが、とにかく正しくクリーン＆リビルドすれば良かったらしいです。
（React）親要素から受け取ったデータの型は使いたいものだけ使えば良い

型でいつも怒られているTypeScriptに何故か怒られなかったので共有します。

MainComponentはSubComponentをimportして使用しています。
MainComponentでは`TestType`という型を定義して、その型が持っている要素に`'comp1'`と`'comp2'`という文字列を代入しています。そして、それをSubComponentに渡しています。

```tsx:MainComponent.tsx
import { SubComponent } from './SubComponent';

const MainComponent =>{

  type TestType = {
    comp1: string;
    comp2: string;
  };

  const components: TestType = {
    comp1: 'comp1',
    comp2: 'comp2',
  };

 return(
   <SubComponent  {...components} />
 );

}
```

SubComponentはMainComponentから受け取ったpropsからcomp1というキーの値をdiv要素に入れて返しています。

ここで、SubComponentでもTestPropsという型を定義しています。この型はMainComponentで定義したTestTypeという型からcomp2というキーを削除したものになります。

```tsx:SubComponent.tsx

type TestProps = {
  comp1: string;
};

const SubComponent = (props: TestProps) => {
  console.log(props); // {comp1: "comp1", comp2: "comp2"}

  return (
    <div>{props.comp1}</div>
    // <div>{props.comp2}</div> // コメントアウトを外すとエラーになる
  )
};

export default SubComponent;
```

上の例はコンパイル成功しますが、SubComponentの中で`props.comp2`を使用しようとすると、エラーになってしまいます。これは`props`の型が`TestProps`と定義しているからです（`TestProps`はcomp2という要素を持っていない）。

しかし、`props`の中身を見ると`comp2`の要素も入っています。

これはTypeScriptがデータは受け取るが、型宣言に入っていないものは弾くようによしなにやってくれてるんだと思います（調べてもよく分からなかったので分かる人教えてください）。

確かにデータ受け取っても宣言してないもの以外は使用できないようにすれば問題なさそうなので、上手く活用していきたいと思います。
証明書発行元の信頼性担保 のための評価システム

# 証明書の発行

* ブロックチェーンの利用例としてポピュラー
    * ERC725/734/735などの標準化の動き
* 発行元(Issuer)→発行先(Subject)に対して証明書を発行
    * 発行元：大学の卒業証書/学位、国家資格/ベンダー資格、など
    * 発行先：学生、研究者、エンジニア、など
* 発行先は、発行元への信頼によって資格を証明される
    * 大学→卒業証書→大卒の証明
    * ノーベル財団→ノーベル賞→特定分野で顕著な功績を残した証明

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/c2e9b15b-5cc9-4a09-78af-5299d0247b9f.png)

---

# 発行元の信頼？

* ブロックチェーンを使えば経歴詐称などはなくなるかもしれない
    * 証明書自体の偽造や改竄は難しい
    * ショーン・K
* 発行元は信頼できるのか？＝証明書の信用
    * 卒業の証明：大学では数年で破棄？大学がなくなったら？
    * プライバシーマーク：誰が何を証明してるのかすら不鮮明？
    * ノーベル賞：安倍首相がトランプ大統領を推薦した？

---

# 相互評価？

* 発行元は発行先に証明書を発行する
* 発行先は発行元を評価する
* 某ハッカソン中にも[ERC1757](https://github.com/ethereum/EIPs/issues/1757)として提案された

**これで発行元の信頼性を担保できたと言えるか？**
↓
**評価の相対取引になってしまう**

* 相対取引のリスク
    * お互いの評価を自由に設定できる
    * 評価の値が社会＝市場とは無関係に設定できる
    * 詐欺にあう
    * 納得のいく相互評価になるまで時間がかかる

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/bcefe284-3d5a-cec1-b383-bbb9cf524db2.png)

---

# 一旦結論

```
相互評価は筋が悪そう
```

---

# 代替案

```
信頼のおける第三者機関が評価
```

---

# 発行元の評価をブロックチェーンが行う

* `IssuerReputation` コントラクトが評価
* あらかじめ合意された契約に沿って発行元への評価が行われる
* 評価は自動的に行われ発行元/発行先は直接関与しない

**信頼のおける第三者が評価**

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/7e1f91c4-3eb1-a60a-bab2-d7db09b6e0c3.png)

---

# 発行先が評価されると発行元の評価にフィードバックされる

* 証明書の発行先が、**他の**発行元からどれだけ証明書を発行されているかを集計
* 自分(発行元)が発行した証明書は、自分の評価に入らない
    * 証明書を濫発すれば自己評価をどんどんあげられてしまうので

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/16e3057f-4274-06f8-a9bf-d91e677a6d0f.png)

---

# 流れ

発行先のSubjectが「人」として、その人が価値を生み出すと発行元のIssuerから何かしらの評価/証明書を得られる仕組み
その評価/証明書の価値を決めるため、発行元の評価を公正に行う

---

## 発行先への最初の評価

IssuerA → SubjectA/B
証明書を発行しただけでは、発行元の評価は変わらない

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/e7d3a467-7b2b-a179-dac0-dc7a6d08b8e9.png)

その後、SubjectBが価値を生むと…

---

## 発行先に評価が集まる

IssuerB → SubjectB
IssuerC → SubjectB

SubjectBが証明書を集める

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/bb232c79-815c-913d-4219-601595c86e31.png)

---

## 発行元が評価される

SubjectBに証明書を発行していた(＝評価していた)IssuerAの評価が上がる
2つの証明書が増えたのでIssuerAには評価が+2されるイメージ

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/2eb89f71-d913-c005-787c-5aa4b540cc2f.png)

---

## 発行先の評価方法

* ReputationにはERC20を利用
    * 人材の価値を担保にトークンを発行
    * 複数のトークンを用意すれば評価軸が増える
    * 発行元の分割/統合時には契約に則った信頼残高の移動ができる
    * 発行元の消滅時にも評価を残すことができる

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/78b2aa39-0e67-7dbd-07dd-139efa6ce206.png)

---

## 効果

* 早く評価した発行元へのメリット
    * Subjectが証明書を集める＝活躍するほどIssuerの評価が上がる
    * 先に証明書を発行していたIssuerほど評価が上がる(原石発見者)
* 発行先にアウトプットを求める
    * 外部でも評価されると発行元の評価が上がるので、外部へのアウトプットを促す
    * 少子化・高齢化によって人材の流動化や働き方改革が進む中でマッチしそうな仕組み

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/80d2c0b0-71a5-2f88-12f2-d9becdf80c4b.png)

---

# 具体例

企業人事が学生の評価を知りたい場合、学生の持つ評価/証明書(Claim)やその評価(Reputation)を取得することでその価値を客観的に知ることが出来る

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/2e6eac5d-b51b-8d01-9929-bfdf919fa7ad.png)

---

# あとがき

Claimという英語に自信がない
Claimってなに…？
Gmail(SMTP)経由でメール送信する

# 記事の主旨

GmailのSMTP利用する際には、

- Googleアカウントのセキュリティ設定を忘れず、済ましておいてくださいね
- 「安全性の低いアプリの許可」に逃げず、「二段階認証／アプリパスワード」を使いましょう

というだけの記事です。

`SMTP Error: Could not authenticate.`
エラーにつまった人向けの備忘録です。

# メール送信のサンプルコード
https://github.com/kasssy/php_sendmail

# Googleアカウント作成〜メール送信に成功するまで
Googleセキュリティ設定を意識せずに、作業をした場合に起こること・対処方法です。

## Googleアカウントを作成する。
- ID : サンプルコード内の`from@gmail.com`
- PW : アカウントの`マスタパスワード`

##### (point)作成段階のデフォルト設定では、セキュリティ上、SMTPエラー（アクセス不可)になってます。

## サンプルコードで、テスト送信してみる。が、あえなくエラー発生。
以下を実行しても

```.bash
## ID / PW を作成したアカウント情報に書き換えて、以下を実行
$ php test_sendmail.php
```

エラーが発生する。

```
2019-12-09 08:30:35     SERVER -> CLIENT: 535-5.7.8 Username and Password not accepted. Learn more at
                                          535 5.7.8  https://support.google.com/mail/?p=BadCredentials o15sm24713268pgf.2 - gsmtp
2019-12-09 08:30:35     SMTP ERROR: Password command failed: 535-5.7.8 Username and Password not accepted. Learn more at
                                          535 5.7.8  https://support.google.com/mail/?p=BadCredentials o15sm24713268pgf.2 - gsmtp
2019-12-09 08:30:35     SMTP Error: Could not authenticate.
2019-12-09 08:30:35     CLIENT -> SERVER: QUIT
2019-12-09 08:30:35     SERVER -> CLIENT: 221 2.0.0 closing connection o15sm24713268pgf.2 - gsmtp
2019-12-09 08:30:35     SMTP Error: Could not authenticate.
PHP Fatal error:  Uncaught PHPMailer\PHPMailer\Exception: SMTP Error: Could not authenticate. in /home/ec2-user/tests/vendor/phpmailer/phpmailer/src/PHPMailer.php:2019
```

<https://support.google.com/mail/?p=BadCredentials>を見て頓挫する。。人は続きを読んでください。

## 通信が届いていることを確認する。
問題なし。（まぁ、ログ上でも到達できているので、当たり前ですが一応。）
```
$ telnet smtp.gmail.com 587

Trying 74.125.23.108...
Connected to smtp.gmail.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP g191sm26005183pfb.19 - gsmtp
```

## Googleアカウント側(Gmail)を確認する。
以下のようなメールが届く。
（メール届いてない方は、純粋に ID/PW間違いを疑ってください。）
¥<img width="555" alt="スクリーンショット 2019-12-09 17.40.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305750/fbb959e9-a6ab-2697-4e71-6822de1d5269.png">

## *非推奨*Google側のアクセス許可を"有効"にする。
https://support.google.com/mail/?p=BadCredentials
に習って、

<img width="736" alt="スクリーンショット 2019-12-09 17.44.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305750/943d05ae-0912-3c4a-c039-44e056688839.png">

を"有効"にして、再度テスト送信する。
→無事にメールが受信できた。けど！！この方法は、非推奨なので、次の項までやってくださいね。

## Google側の二段階認証を有効にし、アプリパスワードを発行する。
注意) *安全性の低いアプリの許可*を"無効"に戻すことは忘れないように。

https://blog.saboh.net/smtpgmailcom/
上記サイトが大変分かりやすいので、参考にしてください。

```.bash
## PWを発行した「アプリパスワード」に書き換えて、以下を実行
$ php test_sendmail.php
```
→無事にメールが受信できた。お疲れ様でした。
税制改正（令和2年）月例給与について

#1. 想定読者
・月例給与計算のシステム開発関係者
　（この時期なので既に対応済みだと思いますが）

#2. はじめに
・ここでは標記のうち、甲欄の電子計算機の特例処理の変更点について紹介します。
　（※税額表での計算でない）

#3. 税制改正の変更点
**①基礎控除額が一律でなくなった**
　基礎控除額はこれまで一律「31,667円」だったが、これが「社保料等控除後金額」に
　よって、控除額が4つに分かれた。
　これにより、別表が1つ追加になった。

**②これまでの別表1の金額も変更になった**
　「給与所得控除の額」の「社保控除後加算額」が変更になった。
　（社保控除後額のレンジも一部変更）

※国税庁の資料は以下になります。
https://www.nta.go.jp/publication/pamph/gensen/zeigakuhyo2019/data/18.pdf

#4. 終わりに
これにより、月額の社保料等控除後金額が約70万円超の富裕層の方は控除額が少なく
なり、金額に応じて所得税額は増加になります。
上記でない場合、所得税額は少しくらい下がるのかと思いましたが、月例給与としては
残念ながら、私を含めた一般庶民の所得税額はこれまでと変わらないですね。。。