OmniAICreator/Qiita-1.07M huggingface dataset:
FreeBSDにおけるunbound の　CVE-2020-28935　パッチ （ 2020/12/17 obsoleted） 

# 注意　
消費期限が過ぎました。　捨てましょう。

# unbound について
言わずと知れた FreeBSD公式 のフルリゾルバです。
## version 
FreeBSD11/12 では /etc/rc.d/local_unbound が ユーザランドにあり
contrib/unbound は、 version 1.10.0 (2020/12/04現在) です。
ports の　dns/unbound は version 1.12.0 です。　

## CVE-2020-28935
2020/12/01 現在　unbound の以下のバージョンには、シンボリックリンク攻撃の恐れがあります。
<pre>
<b>versions 1.6.6 - 1.12.0 </b>
</pre>
参照 :
 https://nlnetlabs.nl/projects/unbound/security-advisories/
https://nlnetlabs.nl/downloads/unbound/CVE-2020-28935.txt
# contrib / ports の どちらを使うか
本来であれば FreeBSD のパッチが出るのを待つのも手ですが、 以前から ports の unbound の更新は先んじているので、こちらに切り替えておくべきというのもあります。　そもそも ports にしかなかったものですので、FreeBSD 11.0以前からの運用だと dns/unbound を使っていたという方もいるでしょう。

しかしcontribとはいえ公式に採用されてからは local_unbound というサービスがインストーラから選択できるようになって、新しくインストールした機材には contrib版を＊ついうっかり＊入れることもあります？

という経緯なので、わざわざ公式サポートされているものに敢えて ports を使うコストはあるかは管理コスト次第という身もふたもない話ですが、 ports から であれば気兼ねなく（？）ローカルハック・アップデートできます。無論 freebsd-update から干渉されることはありません。

# ports に手を入れる。
12/04 の時点では、まだ CVE-2020-28935 対策済みの 1.13.0 が portsにありませんので、例によって勝手に手を入れてしまいます。

<pre>
$ cd /usr/ports/dns/unbound
$ sudo sed -i -e 's/1.12.0/1.13.0/g' Makefile
$ sudo sed -i -e 's/8.1.10/8.1.11/g' pkg-plist 
$ sudo make makesum
===>  License BSD3CLAUSE accepted by the user
===>  License BSD3CLAUSE accepted by the user
===>   unbound-1.13.0 depends on file: /usr/local/sbin/pkg - found
=> unbound-1.13.0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://www.nlnetlabs.nl/downloads/unbound/unbound-1.13.0.tar.gz
unbound-1.13.0.tar.gz                                 5810 kB  197 kBps    30s
===> Fetching all distfiles required by unbound-1.13.0 for building

$ sudo portsmaster dns/unbound 
...
</pre>

# rc.conf を変える。

local_unbound を使っている場合ならば以下の手順で速やかに移行できます。
<pre>
local_unbound_enable="YES"
</pre>

を以下のように。

<pre>
unbound_profiles="local"
unbound_local_enable="YES"
unbound_local_config=/var/unbound/unbound.conf
</pre>

# contrib 版 local-unbound の件（おまけ）

以前は、公式版 unbound (local-unbound) が バイナリファイル　<code>/usr/sbin/unbound</code> 
デプロイされていました。
それは 11.3/12.0 頃までと記憶しています。11.4/12.1 からは <code>local-unbound</code> になったんですかね？？　いつからそうだったのか？？？　というと調べなければなりませんが。


# 追記（賞味期限が切れました）
2020/12/17 現在、 1.13.0 → 1.13.1 が正式になりましたんで、この記事の内容は obsolete になりました。 

<pre>
<code>
# Created by: Sergey Matveychuk <sem@FreeBSD.org>
# $FreeBSD: head/dns/unbound/Makefile 558269 2020-12-17 09:38:40Z brnrd $

PORTNAME=       unbound
PORTVERSION=    1.13.0
PORTREVISION=   1
CATEGORIES=     dns
</code>
</pre>
PowerShellでログ出力するときはOut-Fileでエンコーディングを指定しよう

# 背景
バッチからPowerShellスクリプトを実行するときに、同じログファイルにリダイレクトしたら著しく文字化けしたのを何とかしようと思って。

バッチでのログファイルリダイレクトに慣れていると、うっかりやりがちだと思います。

## どういう状況？
たとえばこんな感じです。

```batch:hoge.bat
set LOGPATH=C:\temp\hoge.log
IF NOT EXIST %LOGPATH% (
 TYPE NUL > %LOGPATH%
)

echo バッチ処理 > %LOGPATH%
@REM -PowerShellスクリプトを呼ぶバッチ
powershell -ExecutionPolicy RemoteSigned -File .\sample.ps1 %LOGPATH%
```

```powershell:sample.ps1
Param(
  [String]$logFilePath
)
echo $logFilePath
Write-Output "Powershellでの書き込み" >> $logFilePath
```

出力されたログをメモ帳で開くと、こんな感じで見えます。
絶妙に気持ち悪い。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/70a30901-e6a4-2a62-ab3a-5513fbe8a9c7.png)


## Out-Fileでエンコーディング指定すると良い

こう書けば同じログファイルに追記しても文字化けしないです。

```powershell:sample.ps1
Write-Output('Powershellでの書き込み') | Out-File -Encoding default -Append $logFilePath
```

こう見えます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/1f4665b7-43d3-f2d7-6b25-46bc49032636.png)

-Appendは追記オプションです。これがないと、上書きされてしまいます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/039b5687-5075-3a7d-36a3-d020c03e1a69.png)

## Write-Outputの文字コードデフォルトを確認してみる
単純にリダイレクトだけしてファイル作成してみると、UTF-16で書き込まれるようです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/52fc2d24-096f-7847-e700-cf538a3ee618.png)

一連の処理をバッチで実行したい場合、ログファイルを共通化するときは文字コードに注意が必要ですね。
👁を押したら●●が見える実装方法公開

## パスワードマスキングとは...
[![Image from Gyazo](https://i.gyazo.com/f3f015a039a1ef0da4e7365cefc125ee.gif)](https://gyazo.com/f3f015a039a1ef0da4e7365cefc125ee)
コレですね！　言葉では説明しません。



#### 導入することで解決することができる課題

> 1. 入力ミスによる認証失敗が防げる

> 2. 誤った情報を登録した場合には、ログインができなくなってしまう場合がある

> 3. パスワードを覗かれる可能性がある→セキュリティの観点で良くない



#### 個人的見解

・ユーザーにストレスを与えない、離脱率を減らす観点で、導入するに越した事はないのではないのかという見解です。導入の為への工数も少ない為、コスパの良いユーザビリティ向上手段だと感じました。

#### 有名企業のWEBサイトのパスワードマスキング導入有無の調査

・有名な企業のwebサイトで導入されているかを確認してみました。ザッと思いついたWEBサイトを４件調べてみたので、参考程度に実際にサイトを確認してもいいかもしれませんね。

##### 🔻導入調査 (アカウント登録画面について, 2020/12/4時点)

| 企業名称  | 導入の有無 |
| --------- | ---------- |
| Amazon    | ❌    (無)  |
| Instagram | 🔵　(有)    |
| 楽天      | ❌    (無)  |
| メルカリ  | 🔵　(有)    |

→4件だけの調査で一概にいえないですが、導入していない２社はどちらともECサイトなので、絶対にパスワードをチラ見させないようにしているように感じました。



## 導入方法 (Ruby on Rails) 

##### ※UIについては考慮しない実装になります



### STEP1　▶　type属性のinput要素を設置する

```haml
= f.password_field :password, class: "password-input"

```

まずはtype属性のinput要素を作成してください。

classを指定して、JSで取得できるようにします。

## STEP2　▶　目などを配置する

````html
<div class="fas fa-eye"></div>
````

今回はfont-awesomeを使用しました。



## STEP3　▶　Javascript実装

```javascript
function PassMask() {
  const PasswordInput = document.querySelector('.password-input');
  const PasswordEye = document.querySelector('.password-eye');

  PasswordEye.addEventListener("click", () => {
    if(PasswordInput.type === "password"){
      PasswordInput.type = "text";
      PasswordEye.classList.remove("fa-eye");
      PasswordEye.classList.add("fa-eye-slash");
    }else{
      PasswordInput.type = "password";
      PasswordEye.classList.remove("fa-eye-slash"); 
      PasswordEye.classList.add("fa-eye");
    }
  });
}
window.addEventListener('load',PassMask);
```



ぜひ、実装してみてください。
Python-LEGO MindstormsでPIDライントレース

今回はLEGO Mindstorms EV3(以降EV3)のPython環境であるev3dev2で提供されているPID走行のメソッドを利用して
PID走行を行う。
今回利用するメソッドではセンサーなどの割り込み制御（センサーで検知したら停止など）ができなかったので、次回はメソッドを利用しないでPID走行を行う内容を投稿する。


## EV3について
教育版 [LEGO® MINDSTORMS EV3](https://afrel.co.jp/product/ev3-introduction)

## 本記事内での環境  
* PC
Windows10
Python 3.7.3
開発環境 VisualStudioCode  

* EV3
ev3dev
[APIリファレンス](https://ev3dev-lang.readthedocs.io/projects/python-ev3dev/en/stable/spec.html)

環境構築やソースコードの作成、実行は[こちら](https://qiita.com/Hiroki-Fujimoto/items/6ce278411ca151fee750)

## 今回利用するEV3のモデル
今回はEV3を走行させるために`ベースロボ`というモデルでモーターを利用して走行を行う。
<img width="300" alt="80.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/fe1e725d-1ba6-8c52-3192-6d9aa0a7cb5b.jpeg">

## PID走行の参考
以下の記事やページを参考にした。

* [ロボット制御 – PID制御について](https://www.tsone.co.jp/blog/archives/889)
* [ev3dev2 MoveTank](https://ev3dev-lang.readthedocs.io/projects/python-ev3dev/en/stable/motors.html#multiple-motor-groups)

## ソースコード
~~~ pid-1.py
from ev3dev2.motor import OUTPUT_B, OUTPUT_C, MoveTank, SpeedPercent, follow_for_forever
from ev3dev2.sensor.lego import ColorSensor, TouchSensor


#インスタンスの生成
tank = MoveTank(OUTPUT_B, OUTPUT_C)
tank.cs = ColorSensor()


try:
    tank.follow_line(
        kp=3.2, ki=0, kd=2.5,
        speed=SpeedPercent(30),
        follow_for=follow_for_forever
    )
except :
    pass

~~~

`tank.follow_line()`でPID走行を行う。引数として`kp(P値)`、`ki(I)`、`kd(D)`、`Speed(%)`、`走行オプション(今回は走行し続けるが秒数指定などが可能)`を指定している。

走行プションが`follow_for_forever`と指定すると、`tank.follow_line()`から処理が抜け出せないためプログラムの強制終了でしか停止する手段等しか思いつかなかったため、次回はメソッド無しでPID制御を実装していく。

今回の動作としては以下のようになった。
I値は設定せず、P値をベースに設定しオーバーシュートの修正でD値を調整した。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/MbAZ85zjj3o/0.jpg)](http://www.youtube.com/watch?v=MbAZ85zjj3o)
MYSQLWorkbenchからawsのRDSに作ったDBインスタンスに接続できなくなった問題と解決法

・事象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/84b74a5a-fce9-8e56-69ea-aaa5814200eb.png)

・解決法
別のwifiに接続を切り替える。おそらくパブリックIPアドレスが変わってしまうのでDBインスタンス作成の際のwifiに合わせないといけない？
RAID構成をミスってNASの容量が足りなくなった

ほんとにしょうもないミスではあるんですが、**ちゃんと確認しないと誰にでも起こりうる**ということで、自戒の念と共にアウトプットします。

##そもそもRAIDってなに

RAID（Redundant Arrays of Inexpensive Disks、レイド）とは、複数のHDDをひとつのドライブのように認識・表示させる技術です。万が一のHDD故障時にもデータ復旧・アクセスを可能にする安全性の向上や、複数HDDへの分散書き込みによるデータ保存の高速化など、RAIDモード毎に特長があり、用途に合わせて様々なストレージ構築が可能です。(バッファロー社記事 https://www.buffalo.jp/topics/knowledge/detail/raid-about.html より引用)

例えば4TBのHDDが4枚あれば、RAIDを用いて「これは16TBのHDDだ」と認識させられるということです。


##RAIDには種類がある

単にRAIDといっても、書き込み速度や容量等、種類によってさまざまな特徴があります。
例えばRAID0は、利用可能容量がHDDの容量×本数(4TBのHDDが4本なら16TB)ですが、HDDのどれか1本が故障してしまうとデータを復旧できません。

一方RAID6は、同じHDDの容量・本数で比較すると、利用可能容量はRAID0の半分になるものの、HDD2本の故障までならデータを復旧させることができます。

ユーザーは、RAIDが持つそれぞれの特徴や利点を考慮し、実際に構成していくことになります。

##今回ミスったのはRAID5
RAID5はHDD(もしくはSSD)3本以上で構成できます。
利用可能容量は、HDDの容量× (N-1) です(Nは3以上)。

今回の場合はとある企業のデータバックアップに合計16TB必要(と後で分かった)で、リプレイス案件でもあったため、NASの選定などはお任せしてしまっていました。

作業日にお客さんから、「このNAS(4TBのHDD×4本内蔵)をRAID5で構成してリプレイスお願いします」と言われたのでその通り実装したんですが、後日、バックアップの容量が溜まっていった時に足りなくなった(12TBしか使えないから)というわけです。

##まとめ
新規設置ならともかく、リプレイス案件であればもともとのNASで使われている容量は大まかに把握できます。
いくらビジネス的に信頼関係があるお客様からの指示であろうと、鵜呑みにせずまずは確認するようにすべきでしたね。
容量の合計を知らされてなかったからそれで足りるもんだと思ってたと言い訳させてください。
ちなみにリプレイス前のNASは4TBHDD×8本でRAID6組んでたっぽい。マジか～....
性能負荷テストの進め方　～計画編～

## 概要
以前性能テスト（負荷テスト、パフォーマンステスト）の推進を行った際に学んだことや考えていたことを備忘がてらまとめていこうと思います。少し長くなりそうなので、3回ぐらいに分けて書いていこうと思います。今回は計画についてです。
※今回はロングランテストの話は省きます。

## 性能テストって何？
名前の通りシステムの性能が要件を満たしているか確認するテストです。負荷をかけた状態で要件通りの性能が出るかをテストします。負荷テストやパフォーマンステストとも呼ばれるようです。私の周りでは性能テストと呼ぶ人が多いので、ここでは性能テストと呼ぶことにします。

## テスト対象を選定する
本来的には全機能で実施すべきですが、決められたコストや納期の中ですべての機能に対して性能テストするのは現実的に厳しいです。そのため、性能問題が起きやすい機能に絞って性能検証を行うことがほとんどだと思います。例えば以下に該当するような機能を抽出し、スケジュールと相談しながら対象機能を選定していきます。

#### 性能問題が発生しやすい機能
  * 大量のデータを処理する機能
    * バッチ機能
  * 大量データのDBアクセスが生じる機能
    * 一括登録/更新機能
    * 検索機能
  * ディスクI/Oのある機能
    * ファイル出力機能
    * ファイルをインプットとする機能
  * 通信負荷が発生する機能
    * 外部APIを実行する機能
    * ファイルのアップロード、ダウンロードが発生する機能
  * ユーザから大量に実行される機能
    * ログイン機能
    * TOP画面表示
  * その他特殊な処理を行う機能
    * マルチスレッド処理
    * トランザクション分割
    * CPUを多く使用する機能（ex.圧縮処理)

## 想定負荷を考える
負荷をかけずに性能テストを実施してしまうと、実運用でアクセス負荷が上がった際に十分な性能が出ることを担保できません。そのため、性能テストでは実運用時に想定される負荷をかけながらテストを行います。どんな負荷をかけるのか、どうやって負荷をかけるのか、事前に決めておく必要があります。例として以下を決めていくことになります。

* 何年後かの想定ユーザ数やデータ数
* ピーク時の想定TPS
* テスト実施時片系なのか両系なのか （冗長構成をとる場合）
* どのテストでどこに負荷をかけるか<br>
 例）・システム内テストではネットワーク負荷はかけない<br>
　　・オンライン処理とバッチ処理を並行実施するかどうか（運用面）<br>
　　・流量制限の単位（機能単位or全体）を考慮する
* アプリサーバへの負荷のかけ方<br>
  計測対象機能が載っているサーバに対する負荷<br>
 例）・計測対象のサーバで計測対象と同一の機能を実行する<br>
　　・計測対象のサーバで計測対象とは別の機能を実行する
* インターネット負荷のかけ方<br>
  実際に発生しうる通信負荷をかける<br>
例）・外部APIの実行<br>
 　　　自システムへの想定負荷から外部APIの実行TPSを決定する。<br>
　　・ファイル授受<br>
　　　送信に時間のかかる巨大ファイル送受信やファイルの繰り返し転送により、テストシナリオの実施中常に負荷をかけるようにする。
* DB負荷<br>
  計測対象の機能が載っていないサーバでDBアクセスのある機能を実行する。
    * オンライン機能の計測中にバッチを実行する。
    * バッチの計測中にオンライン機能を実行する。
    
## 合格条件を決める
性能テストの合格条件は指標値が定められた目標値を満たすことです。この指標値と目標値も事前に決める必要があります。
各目標値については平均値などで定義することが多いです。
※インターネットなどの状況などに応じて、ごくわずかな割合で目標値に満たないことがあるため

  * 各指標値の定義
    * 負荷
    * サーバリソース
    * レスポンスタイム
  * 各指標値をどうやって測定するか
    * サーバリソース
      * vmstat等の監視コマンド
      * 他システムについてもテストする場合は、テスト実施中の対抗先サーバリソースに異常がないか確認が必要
    * レスポンスタイム(Web機能)
        * クライアントに対するレスポンスタイムで定義するならば、例えばJMeterの「Latency」「ElapsedTime」等を使用する
        * 外部APIの実行時間は差し引いて計算する
        ⇒外部APIの実行時間や、それを含めたシステム全体でのレスポンスタイムについてはシステム間テストで別枠としてテストを行う
    * レスポンスタイム(バッチ機能)
        * 基本的には処理完了までの時間を指標値とすることが多い
        * 外部APIの実行時間は差し引いて計算する
    * システム間のネットワーク帯域等、誰が測るのか、どうやって測るのか、明確に責任を分解しづらい範囲は会社間で問題となる可能性があるので注意
    

## テストで利用する環境を決める
性能テストを実施する環境についても検討が必要です。いつ、どこの環境を使用するのか調整するほか、以下についても注意が必要です。

  * テスト中占有できるのか（できない場合はスケジュールを調整する）
  * 本番環境と可能な限り同一の構成、スペックの環境を用意する。
    ⇒開発やステージング環境で実施する場合、かつクラウド環境で
    　運用するシステムの場合、開発環境のスペックを一時的に増強する等の対応を行う
  * 対抗先の利用環境は本番かテスト用の環境か確認する
  * 外部APIを使用する機能の場合、テスト時にかける負荷について
  対向先と合意を取っておく
    * 何TPSの通信が可能か
    * 連続して実行しても問題ないか
    （問題がある場合は実行間隔をあけるなどの対処が必要）
    * 実行してよい時間帯はいつか

## テスト計画書を作成する
ここまでで決定した事項をテスト計画書としてまとめます。

## 参考
性能要件を決める際はIPAの非機能要求グレードを用いるのが良いかと思います。

* システム構築の上流工程強化（非機能要求グレード）：https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html

## 続きの記事
次は準備編です。
[性能負荷テストの進め方　～準備編～](https://qiita.com/ramendaisuki/items/7aeb33c8928212b680ca)
[事例報告] Instance method ‘didTapMessage(in:)’ nearly matches defaulted requirement ‘didTapMessage(in:)’ of protocol ‘MessageCellDelegate’

本事例はMessageKitで起きた問題ですが、一般に起こりうるのでメモしておきます。

下記のようなプロトコルがあり

```swift
public protocol MessageCellDelegate: MessageLabelDelegate {
 func didTapMessage(in cell: MessageCollectionViewCell)
}

public extension MessageCellDelegate {
  func didTapBackground(in cell: MessageCollectionViewCell) {}
}

```

これを実装しようとすると

```swift
Instance method ‘didTapMessage(in:)’ nearly matches defaulted requirement ‘didTapMessage(in:)’ of protocol ‘MessageCellDelegate’
```
と怒られます。

原因がはMessageKitで用意されているMessageCollectionViewCellと同じ名前のMessageCollectionViewCellというクラスを
別にアプリ内で定義していたからでした。

気づきにくいバグでした。ご注意を‥。
WinActorのバージョンごとのサポート期限

WinActorのサポート期間について、公式の[WinActorライフサイクルポリシー](https://winactor.biz/topics/docs/WinActor%20_ProductLifeCyclePolicy_20201201_LCP202011-0.pdf) (2020/12/1版)からの抜粋メモです。

■各バージョンの定義

* **メジャーバージョン ($x$):** 製品の抜本的な改良を行った場合、メジャーバージョンアップとしてリリースします。
* **マイナーバージョン ($y$):** 新しい機能等を搭載した場合、マイナーバージョンアップとしてリリースします。
* **バグフィックスバージョン ($z$):** サポート中の最新のマイナーバージョンに対して、脆弱性対応や不具合等を改修した場合、最終バグフィックスバージョンに対して、新しいバグフィックスバージョンをリリースします。

各バージョン（$x$.$y$）でのライフサイクルは下表の通り。<font color="Red">赤字</font>が現在のステージを示します。

|メジャー$x$|マイナー$y$|リリース日|ステージ１（販売中）|ステージ2（更新受付中）|ステージ3（保守対応中）|ステージ4（保守終了）|
|:--|:--|:--|:--|:--|:--|:--|
|5|3|2019/3/25|2019/5/31迄|2020/5/31迄|<font color="Red">2021/5/31迄</font>|2021/6/1～|
|6|0|2019/5/31|2019/7/8迄|2020/7/8迄|2020/7/8迄|<font color="Red">2020/7/9～</font>|
|6|1|2019/7/8|2019/10/17迄|2020/10/17迄|2020/10/17迄|<font color="Red">2020/10/18～|
|6|2|2019/10/17|2020/3/4迄|<font color="Red">2021/3/4迄</font>|2021/3/4迄|2021/3/5～|
|6|3|2020/3/4|<font color="Red">★</font>|（左記の１年後）|（左記の１年後）|（左記の翌日）～|
|7|0|2020/1/30|2020/8/24迄|<font color="Red">2021/8/24迄</font>|2021/8/24迄|2021/8/25～|
|7|1|2020/8/24|<font color="Red">（V7.2リリース日）迄</font>|（左記の１年後）|（左記と同日）|（左記の翌日）～|

★：6.3の販売終了につきましてはご利用状況を踏まえて判断させていただきます。6.3の上記互換である7.2がリリースされる2021年1月以降を予定しております。
投稿データとユーザー情報の結びつけ方法

## まず用意したのはpost.rb(models/post)

    class Post < ApplicationRecord
  
      def user
        return User.find_by(id: self.user_id)
      end
  
    end

### そしてposts_controller

    def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
    end

### ・ポイント

post（投稿）のところにuserインスタンスメソッドを用意してあげる。

そしてposts_controllerの処理したいアクションにさっき用意したuserのインスタンスメソッドを入れてあげる。
CensOS6のサポートが切れてyum updateでError: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try againが出た時の対処法

# 起こったこと
2020-11-30でCentOS6のサポートが終了した。
Dockerfileでyum updateしてるところがあってエラーになってしまった。
今回はその対処法を残しておく。

```dockerfile:Dockerfile
FROM centos:6.6

RUN yum update -y
```

```:実行したコマンドとエラー
$ docker build -t centos6.6 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:6.6
 ---> 368c96d786ae
Step 2/2 : RUN yum update -y
 ---> Running in 7daac25d2959
Loaded plugins: fastestmirror
Setting up Update Process
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
The command '/bin/sh -c yum update -y' returned a non-zero code: 1
```

# 対処法

## Dockerfileを修正

```dockerfile:Dockerfile
FROM centos:6.6

RUN sed -i "s|#baseurl=|baseurl=|g" /etc/yum.repos.d/CentOS-Base.repo \
  && sed -i "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-Base.repo \
  && sed -i "s|http://mirror\.centos\.org/centos/\$releasever|https://vault\.centos\.org/6.6|g" /etc/yum.repos.d/CentOS-Base.repo

RUN yum update -y
```

# まとめ

本当はCentOSのバージョンを上げるべきだよ

# 参考
[yumコマンド実行時に Cannot retrieve repository metadata と出て失敗する(CentOS 6.4)](https://qiita.com/Higemal/items/5949e9d807ac278fe228)
Dockerイメージが削除できない

##事象
不要となったDockerイメージを削除しようとしたところ、エラーとなり削除することができなかった。

##発生したエラー内容
```
$ docker rmi <IMAGE_ID>
Error response from daemon: conflict: unable to delete 86ec02f67a26 (must be forced) - image is being used by stopped container 9d75bcc06a43
```

##エラーの原因
Dockerイメージを削除するには、コンテナが停止している必要がある。
また、停止されていてもコンテナとしては存在しているので、コンテナを削除してからでないとDockerイメージを削除することができない。

##対応策
psコマンド(-aオプションで停止中のコンテナも全て表示)で、停止中のコンテナのIDを確認し、
コンテナを削除後に、再度Dockerイメージを削除する。

```
$ docker ps -a
$ docker rm <CONTAINER_ID>
$ docker rmi <IMAGE_ID>
```
Laravel ログインテスト

# Laravel　Unitテスト
　ポートフォリオを作成して、ユニットテストを実行するまでの一連の流れを備忘録として記述します。
　作成したポートフォリオでは初期画面からホーム画面に遷移するのにログインする必要があるシステムでした。コントローラーのテストで下記のように実行してもエラーが表示された為、ログインテストを別で作成してモデルのテストを実行しました。

```
pubulic function testBasicTest() {
    $this->get('/home')->assertStatusOk();
    /// /homeにはログインが必要な為アクセスできない
}
```

## 1.テスト用のDatabaseの準備
今回はMySQLを使用しました。使用するデータベースに応じてテスト用のデータベースを準備。

```
$ mysql -uroot -p
$ 🔓(password入力)
mysql> create database データベース名
mysql> show databases
　　　　今回作成したデータベースがあるか確認
mysql> exit
```

Config/database.phpの'connections'にテスト用のデータベースの設定を追加。

```
'testing' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => "作成したデータベース名",
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
```
phpunit.xmlの<php>タグ内に下記を追加。

```
    <server name="DB_CONNECTION" value="mysql"/>
    <server name="DB_DATABASE" value="[データベース名]"/>
```

## 2.ファクトリーを準備する
　今回作ったポートフォリオはLaravelに標準で準備されているUserテーブルを使用した為、変更しませんが追加などしている場合は変更する。(database/factories/UserFactory.php)

## 3.テスト用ファイルの作成
下記コマンドを実行するとtests/Featureにテスト用ファイルが作成されます。

```
$ php artisan make:test LoginTest
```

作成されたLoginTest.phpを下記に変更

```
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
use App\User;
use Auth;

class LoginTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testExample()
    {
        $user = factory(User::class)->create([
            'password'  => bcrypt('laraveltest123')
            //パスワードは好きな言葉で大丈夫です
        ]);
     
        // 認証されないことを確認
        $this->assertFalse(Auth::check());
     
        // ログインを実行
        $response = $this->post('login', [
            'email'    => $user->email,
            'password' => 'laraveltest123'
            //先ほど設定したパスワードを入力
        ]);
     
        // 認証されていることを確認
        $this->assertTrue(Auth::check());
     
        // ログイン後にホームページにリダイレクトされるのを確認
        $response->assertRedirect('home');
　　　　　//作成したサイトでログイン後にリダイレクトされるルート情報を記述
    }
}
```

## 4.マイグレーションの実行
　下記コマンドを実行するとテスト用のデータベースにテーブルが作成されます。
  --database==testingを忘れないでください。この記述によりdatabase.phpに用意したtesing設定で実行されます。

```
$ php artisan migrate:refresh --database==testing
```

## 5.テストの実行
```
$ vendor/bin/phpunit
```

以上でテスト完了です！
作成したデータベースのUserテーブルには新規レコードが登録されていて正しくログイン出来ています。
【Rails】注文・カート機能のER図について（初学者向け）

# はじめに
本記事は、 <a href='https://qiita.com/advent-calendar/2020/programming-beginner'>駆け出しエンジニアの第一歩！AdventCalendar2020 4日目の記事</a>です。
この記事では、注文・カート機能を実装する上で欠かせないER図の考え方について、自分が理解できなかったことをまとめてみました。
Railsを学習し始めて3ヶ月で、まだまだ理解が浅い部分があると思いますが、もし間違っているところ等ありましたら、ご指摘いただけると幸いです。
# 対象
・注文・カート機能にはどんなテーブルが必要なのか分からない人
・それぞれのテーブルの役割が分からない人
# 概要
ご紹介する注文機能の基本的な流れは、通販と同様ですが、商品をカートに入れる　→　注文情報を入力する　→　注文確定する、です。
それぞれの工程で自分が分からなかったことについて、解説します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/a549c656-d65e-9258-0eac-52ef11fbe302.png)
# 1. カートに商品を入れる
## 1-1.カートテーブルの成り立ち
まず、通販というのはユーザーが商品を購入する行為をおこなう場所です。そのため、どのユーザーがどんな商品を購入するのか、という風に**ユーザーと商品の間で関係性を持たせる**ことが必要になります。しかし、ユーザーテーブルと商品テーブルは直接結ぶことができません。なぜなら、ユーザーはどの商品にも関係性がないからです。直接結び付けられる例として、ユーザーとブログの関係が挙げられます。![_2020-11-26_18.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/e6e8c87d-7dba-7304-80ee-fb1cbc87cecd.png)
でも、ユーザーと商品を関連づけなければ、商品を買うことはできません。そこで、ユーザーと商品の間を取り持つテーブルが必要になってきます（ここではカートテーブルとします）。カートテーブルは、ユーザーと商品を結びつける上で必然的に発生した中間テーブルです。![_2020-11-26_18.29.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/876d8b66-1902-febf-07b5-f62dd121b141.png)
## 1-2.　カートとは？
カートを理解するには、まず1つのカートは複数種類の商品をいっぱい入れておけるもの、というイメージを捨てましょう。上記のER図のカートをよく見ると、カートID1つに対して、商品IDやユーザーIDはそれぞれ1つずつ対応しています。なので、1つのカートには、1種類の商品が入ります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/5a8741fb-11c5-a3e9-f5ee-785bb3b513b0.png)
# 2.　注文情報を入力する
## 2-1.　注文テーブルに商品情報を直接入れる
注文情報の入力では、主に配送先住所、送料、支払い方法などを決定します。ここで注意したいのが、商品も注文情報の一部だからという考えから、注文テーブルの中に商品を入れてしまわないことです。
![_2020-11-27_17.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/aaee06b6-b6b9-e2c4-5f2a-2a1fc10d6c5a.png)
## 2-2.　注文テーブルと商品テーブルを直接関連づける
注文テーブルと商品テーブルを直接関連づければいいという考えから、以下のようにしてみるのもよくありません。よくない点は、いくつかありますが、一例をあげると、サイト管理者が商品を登録する際に、注文idを設定しいなければいけないことです。注文idは、注文が完了した後に、事後的に決定するものであり、サイト管理者が事前に設定するのは、少しおかしな話です。
![_2020-11-27_18.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/49ca31ea-21f9-891a-d38f-1bd864fcc89b.png)
そこで、注文テーブルと商品テーブルを結びつけるためには、間に中間テーブル（注文詳細テーブル）を作る必要があります。
![_2020-11-27_20.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/dd179ea1-535c-061c-11c1-9c26a57b8627.png)
# 3.　注文確定ボタンをクリックする
カートと注文の仕組みについて解説してきましたが、この2つのテーブル同士の関係はまだありません。しかし、結論から言うと関係づけるというよりは、**カートの情報を注文詳細へ移動させる**ということです。
![_2020-11-27_21.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869111/81408065-1e92-f814-9a7c-5c5a3cad60f3.png)
カートの情報は、移動後に削除されるようにすれば、注文確定後にカート内は空にできます。通販でも注文確定後のカート内は、空になっていますよね。カートと注文詳細の決定的な違いは、注文が未確定のものか確定済みのものかということです。
# まとめ
自分は当初この仕組みが全く理解できていませんでした。初学者の方で理解に苦しんでいる人の力に少しでもなったら幸いです。
Excelの関数やショートカットについて（初級者向け） 

##はじめに
Qiita初投稿です。
社会人になって、9年目経ちますが、どこに行っても、Excelは必要で、
使いはじめの頃は、社内でExcel使える人が少なく、Excelの関数で凄く苦労した思い出があります。

今年新卒の方と3か月ほど一緒に仕事しましたが、Excelの使い方を教えてあげられなかったなと思うところがあり、
自分のExcel知識の整理も兼ねて、Excelの基本的な関数や使えるショートカットを書いていきます。

##目次
・覚えておくと便利な関数
・覚えておくと便利なショートカット

##覚えておくと便利な関数
関数でこんなことできますよーというイメージを書いてきます。

### SUM関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/09fd8df0-7897-9bb4-ee2d-93d1de152cae.png)

指定した範囲の数を合計してくれる関数です。
レポート集計をしていると出会う確率はかなり高いです。
私もこのSUM関数が、初めて覚えたExcel関数かもしれません。


### VLOOKUP関数

既に決まってる組み合わせがあって、
その組み合わせの値を引っ張りたいときに使えるのがVLOOKUP関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/3a34940b-d6ae-7ade-a3b5-c570ba666284.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/96f6b0d0-57f0-40f3-f3e1-c9a98105e89a.png)
上図では、D列の果物を検索値にして、A1～B6の表から検索値に該当する金額をもってきています。
１つ１つ目検でやるのはしんどいので、そんな時に活躍します。

Excel始めたときに最初の壁として立ちはだかるのは、このVLOOKUP関数のような気がします。

### IF関数
処理を分岐させたいときに、使う関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/ce1d0bb2-87a0-ac06-debc-87af93f39db7.png)

例えば、150円以下の果物には●を出力したい場合、
上記のようにIF関数で簡単に出せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/9b6da5bb-d893-f617-a153-682416a1fc00.png)

上図のように、IF関数を下のセルまでコピーすれば、簡単に該当するくだものに●を出力できます。
他の関数と組み合わせて使うこともよくあり、非常に使い勝手の良い関数です。


### COUNTIF関数
指定した範囲内で、検索条件に該当する値の個数をカウントしてくれる関数です。

検索値に該当するセルの個数を数えたり、条件に該当するセルの個数を数えたり、特定の文字が含まれているセルをカウントするなど色々な活用ができ、便利な関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/ed363c9f-ae99-5291-5ff8-ab0a64b55616.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/e681e47c-7903-8aae-1d1e-6844c9ba877f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914817/ca3d1534-4a98-d58c-dd2c-d87c395643bc.png)




## 覚えておくと便利なショートカット

表にしてみました。
ショートカットを覚えると、マウスでの移動がなくなるので、作業の時短になります。

|ショートカット|内容|一言|
|:---|:---|:---|
|Ctrl + S|上書き保存|基本中の基本。無意識に使ってて、保存したかどうかわからなくなる瞬間があります|
|Ctrl + 矢印|セル移動|途中で空行があると最後まで移動しないので注意|
|Ctrl + Shift + 矢印|セル移動|範囲選択ができます|
|Ctrl + PageUp or PageDown|シート移動|覚えたら、マウスでシート移動しなくなります（たぶん）|
|Ctrl + D|上のセルをコピー＆ペースト|範囲選択と組み合わせて使うことが多いです|
|Ctrl + Shift + L|フィルタをかける|個人的に使用頻度が高く、覚えてよかったショートカットです|
|Shift + スペース|半角スペースを出す|全角で入力しているときに、半角スペースを出したいときに便利です|
|Alt → D → P|ピボットテーブル作成|範囲を選択してから入力しないと起動しないです|
|Alt → D → E|区切り位置|個人的に使用頻度は高くないのですが、タブから探すのが面倒なので地味に便利です|
|Alt → ;|可視セル|フィルタ時に使えるショートカットです|



## さいごに
Excelのショートカットを見直す良い機会となりました。


次は@ayuko902ayukoさんです。よろしくお願いいたします。
ユーザーと投稿の結びつけ「@を使ったlink_toの使い方」

#<%=link_to(@user.name, "/users/#{@user.id}") %>

##・概要説明
　目的：ユーザーの投稿詳細を表示したいのでユーザーと投稿を結びつけたい。
　ポイント：link_toのやり方は様々だが今回はpostsコントローラで定義した@userを使ってのことだったので少しややこしかった。
　
#### 指定のcontroller（僕はcontrollers/posts_controller）
    def show   
      @user = User.find_by(id: @post.user_id)
    end
###解説
User.find_by(id: @post.user_id)のUserはMysquelなどで作ったデータベースのusers。
find_byはその指定した（User）データから入手するものを定義。
@postはデータベースの投稿要素。
userのidとpostのidを結びつけたいので@user = User.find_by(id: @post.user_id)とする。
    
### 指定のview（僕はviews/posts/show.html.erb）に
####<%= link_to("表示したいもの", "表示したい内容の場所")  %>

    例えば:
    <%=link_to(@user.name, "/users/#{@user.id}") %>

とすればできます。
これから投稿していきます。

Web開発エンジニアを目指すためにいまから頑張ります。

まずは、Ruby、Railsを用いたポートフォリオの作成に挑みます。

事前知識がないので少しアウトプット
ブラウザにプログラムを反映するために

ルーティング→コントローラ→ビューの順を踏む

▼ルーティング
コントローラー、ビューがどういった定義で順で実行されていくか
定める役割


▼コントローラー
ルーティングを参照しどのビューを実行するか決める役割

▼ビュー
具体的なHTMLファイルなど実行されるプログラムを格納する場所
【効率化】ターミナル で作業ブランチを最初からDocumentsにする！

#概要
ターミナルが起動したときに「cd Documents」を毎回入力する手間を省きたいと思いました。
メモとして残します。

#今回の結論
「zshrcファイル」を設定することで、「作業ディレクトリ」を「Documents」になるように設定した


#設定方法
```terminal:terminal
# 設定ファイルへ移動
vim ~/.zshrc
```

```terminal:.zshrc
#以下を入力
cd Documents 
```
入力後、再起動で設定完了です
これで、ターミナル を起動すると、初めから「cd Documnets」が入力された状態からスタートするので、入力する手間がなくななりました！
Desktopにしたい場合は、 「cd Desktop」を入力してください。


# まとめ
「ググる力」が足りなかったため、「作業ディレクトリ」というワードに行き着くまで時間を要しました。
日頃から名称は意識して作業しなければと改めて感じました！
小さな疑問でしたが、解決してすっきりしました！


# 参照
https://www.wholenotism.com/blog/2020/07/changewkdir.html
OpenCV「連続した画像の読み込み」「連続での保存」

##概要
画像処理をしていると、連続での読み込みや連続での保存なんかしたくなる時ありますよね。特に大量に画像データがある場合は必要な技術だと思います。色々なやり方があると思いますが、ここでは僕がよく使うやり方を説明したいと思います。


##このような連続の番号の画像を用意します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843242/fd68503c-3a24-173b-71c8-c53e6d316c97.png)


##Mark7 画像の連続の読み込み

```
#include <opencv2/opencv.hpp>
#include<iostream>

#if _DEBUG
#pragma comment(lib,"opencv_world430d.lib")
#else
#pragma comment(lib,"opencv_world430.lib")
#endif;;

using namespace cv;
using namespace std;

int main()
{
	Mat img;

	for (int n = 1; n < 11; n++) {
		string filepas = "C:\\Users\\abc\\Desktop\\aaa\\" + to_string(n) + ".png";
		img = imread(filepas);
		imshow("a", img);
		waitKey(0);
	}

	

	return 0;
}

```


######解説①

```
for (int n = 1; n < 11; n++)
```

まずfor文で何枚の画像があるのかとnが何の数字なのかをここで決めます。

######解説②


```
string filepas = "C:\\Users\\abc\\Desktop\\aaa\\" + to_string(n) + ".png";
```
次にstringを使いfilepasを宣言します。filepasでなくても名前は何でもいいです。そこに画像までのパスを入れます。そして画像の名前の違うとこだけをto_string(n) でfor分の数字になるようにして、最後に""の中に画像の拡張子を入れてやればOKです。これで連続での表示はできると思います。



##Mark8 画像の連続の保存

```
#include <opencv2/opencv.hpp>
#include<iostream>

#if _DEBUG
#pragma comment(lib,"opencv_world430d.lib")
#else
#pragma comment(lib,"opencv_world430.lib")
#endif;;

using namespace cv;
using namespace std;

int main()
{
	Mat img;

	for (int n = 1; n < 11; n++) {
		string filepas = "C:\\Users\\abc\\Desktop\\aaa\\" + to_string(n) + ".png";
		img = imread(filepas);



		string filepas1 = "C:\\Users\\abc\\Desktop\\ccc\\" + to_string(n) + ".png";
		imwrite(filepas1, img);
		imshow("a", img);
		waitKey(0);
	}

	

	return 0;
}
```

######解説①

せっかくなので先ほど読み込んだ画像をファイルに保存していきます。
ほとんどさっきと同じですが、次はimwriteにパスであるfilepas1を入れて先に読み込んでいたimgを保存するようにしましょう。


```
 imwrite(filepas1, img);
```

このように保存できていればOKです。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843242/8e1c86a4-bdcf-1abe-ea93-b3d67d04d75d.png)

##最後に
そんなに難しくないと思うのでぜひやってみてください。ただ今回紹介したのはあくまでも連続の番号になってる画像に限ります。もしそうじゃないならちょっと複雑になると思うので頑張って下さい。
最近、藤井風にはまってます。とってもいいアーティストなので聞いてみてください。
Notionでページに目次を作る Table of Contents

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 4日目のエントリです。
3日目は[Notionでコードブロックにキャプションを付ける](https://qiita.com/pictiny/items/94853245674810577299)でした。

# Table of Contents
Notionではページに目次を作ることができます。
`/ToC` コマンドでページに追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/905c17e1-eb2f-60a1-ec69-a7e2ce44599d.png)
目次を追加すると、ページ内の見出しがリンク付きでまとめられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/9b90a59e-1181-0864-d67b-988376d7d47d.png)
画像のように、H2、H3の見出しには段落が付きます。

# まとめ
ページが大きくなってきたら、ページの先頭に目次を付けておくといいでしょう。

ToCについては[Table of contents](https://www.notion.so/Table-of-contents-50de58f824bf4100a4a9fa5b6f783c2b)に公式ドキュメントがありますので、そちらもご覧ください。
【GCP】GKEのpodにログインできるのか？

kubernetesの公式ドキュメント
https://kubernetes.io/ja/case-studies/


コンテナの操作について
https://qiita.com/suzukihi724/items/241f7241d297a2d4a55c

作成したpodにログインしたいと思って、GKEで作成したけど、podにログインして何かするものでもないみたい。


kubectl exec [POD] -- [COMMAND] 
のコマンドでPODからコマンドを打てるようになる
例）kubectl exec hello-app-787cbc8855-ctqmb -- ping 10.10.0.4
機械学習　「非線形回帰モデル」

#非線形回帰モデル
- 非線形回帰モデル
- 基底展開法
- 基底関数（多項式関数、ガウス基底関数、２次元ガウス基底関数）
- 未学習と過学習
- 正則化法（罰則化法）
- 汎化性能
- ホールドアウト法
- クロスバリデーション（交差検証）
- グリッドサーチ

##非線形回帰モデル
非線型回帰モデルとは、複雑な非線型構造を内在する現象である。

```math 
説明変数：x_i = (x_{i1},x_{i2}…,x_{im})　は実数^m←説明変数の数
非線形関数ベクトル：φ(x_i) = (φ_1(x_i),φ_2(x_i),…,φ_k(x_i))^T は実数^k←基底関数の数
非線形関数の計画行列：φ^{train} = (φ(x_1),φ(x_2),…,φ(x_n))^T は実数^{n×k}
最小二乗法による予測値：y^ = Φ(Φ^{(train)T}Φ^{(train)})^{-1}Φ^{(train)T}y^{(train)}
```
##基底展開法
非線形回帰モデルの予測値を求める方法の一つが基底展開法である。回帰関数として、基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線形結合を使用する。
未知パラメータは、線形回帰モデルと同様に最小二乗法や最尤法によって推定することができる。

```math    
y_i = w_0 + ∑w_jφ_j(x_i) + ε_i
```
##基底関数
###多項式関数
多項式関数は基底関数の一つである。

```math  
φ_j = x^j　　と表すことができる。
```

###ガウス基底関数

```math 
φ_j(x) = exp{\frac{(x-µ_j)^2}{2h_j}}
```

###２次元ガウス基底関数

```math 
φ_j(x) = exp{\frac{(x-µ_j)^T(x-µ_j)}{2h_j}}
```
##未学習と過学習
###未学習
学習データに対して、十分小さな誤差が得られないモデルのことである。対策としては、モデルの表現力が低いため表現力の高いモデルを利用する。

###過学習
小さな誤差は得られたけど、テスト集合誤差との差が大きいモデルのことである。対策は３つある。
一つ目は、学習データの数を増やす。二つ目は、不要な基底関数を削除して表現力を抑制する。三つ目は、正則化法を利用して表現力を抑制する方法である。
不要な基底関数の削除に関しては、モデルの複雑さは基底関数の数や位置やバンド幅によって変化するため、ときたい問題に対して適切な基底関数を用意することを心がける。

##正則化法（罰則化法）
基底関数の数が増加するとパラメータが増加し、残差は減少（モデルが複雑化）する。
モデルの複雑さに伴って正則化項は大きくなる。正則化項は形状によっていくつもの種類があり、それぞれの推定量の性質が異なる。また、正則化項は最小二乗推定量とL２ノルムを利用するRidge推定量とL1ノルムを利用するLasso推定量に分けることができる。
<b>Ridge推定量</b>はパラメータを０に近づけるように推定するのに対し、<b>Lasso推定量</b>はいくつかのパラメータを正確に０に推定する。つまり、<b>Lasso推定量</b>の方がモデルの複雑さを訂正することができる。

```math 
S_γ = (y - Φw)^T(y - Φw) + γR(w)  γ(>0)
```

##汎化性能
非線形回帰モデルを適切なモデルにすることはつまり、汎化性能が高いモデルを探すことである。汎化性能とは、学習に使用した入力だけでなくこれまで見たことのないで新たな入力に対する予測性能のことである。
汎化誤差（テスト誤差)は学習データとは別に収集された検証データでの性能を測ることで推定することが得きる。汎化誤差が小さいものが良い性能を持っているため、できるだけ０に近づける方が良いデータということができる。

```math 
訓練誤差：MSE_{train} = \frac{1}{n_{train}}∑(y^{ハットtrain}_i - y_i^{train})^2
テスト誤差：MSE_{test} = \frac{1}{n_{test}}∑(y^{ハットtest}_i - y_i^{tesT})^2
```
汎化しているモデル：訓練誤差もテスト誤差もどちらも小さい
過学習：訓練誤差は小さいがテスト誤差が大きい
未学習：訓練誤差もテスト誤差もどちらも小さくならない

##ホールドアウト法
有限データを学習用とテストように分割して、予測精度や誤り値を測定するために使用する。
基底展開法に基づく非線型回帰モデルでは、基底関数の数、位置、バンド幅の値とチューニングパラメータのホールド値を小さくするモデルで決定する。

#### 注意点
- 学習用が多くなればテスト用が減り、学習精度は良くなるが性能指標の精度は悪くなる。
- 一方、テスト用が多くなり学習用が少なくなると学習のそのものの精度が悪くなる可能性がある。
- 手元にデータがたくさんある場合を除いて、良い性能を与えないという欠点がある。

##クロスバリデーション（交差検証）
交差検証とは、汎化性能を評価する統計的な手法で、分類でも回帰でも用いることができる。
交差検証は、n個のデータがあったとしたらそのうちの一つをテスト用に回し、それ以外を学習用にする。そして、すべてのデータが1回ずつテスト用データになるようn回学習を行って精度の平均をとる手法だ。

##グリッドサーチ
交差検証はモデルの汎化性能を測定する手法だったが、それに対してグリッドサーチは学習モデルに用いられるハイパー（チューニング）パラメータを調整していき、モデルの汎化性能を向上させる方法を探す手法である。全てのチューニングパラメータの組み合わせで評価軸を算出する。
室内ドローンの飛行レベル2020

## はじめに

室内でドローンを飛ばして、ビジネス利用する取り組みを1年くらいやってきました。

初めはどんな課題が起きるか、どのレベルの取り組みなのか全くわからず進んでいましたが、
ある程度、室内でのドローンのビジネス活用でクリアしないといけないことが見えてきました。

単純に飛行ルート設定と画像認識で省人化を測れると思っていましたが、
まだまだ課題があり、自動車の自動運転のように室内ドローンにも飛行レベルを定義し、
みんなでレベルを引き上げる必要があると感じています。

そこで、勝手に定義してみました。

### 前提
室内ドローンではGPSによる自己位置推定は使えない
基本的に現時点の障害検知の制御レベルだと、何かしら障害検知をしてしまう
室内ドローンなので、基本的に人や機械が周辺で移動している

## 室内ドローンの飛行レベル
| 段階 | 名称　| 主体 | 飛行領域 | 障害検知 | 環境の変化 |
|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|0 | 運転自動化なし　|　人 | - | - | - |
|1 | プログラムによる規則的移動飛行　|　人| 限定的 | OFF | なし |
|2 | 規則的移動と位置補正による自律安定飛行　|　ドローン | 限定的 | 一部有効 | 限定的に対応 |
|3 | 目的地指定と位置補正による自律安定飛行　|　ドローン | 限定的 | 一部有効 | 限定的に対応 |
|4 | 目的地指定による完全自動飛行　|　ドローン | 限定的 | 常に有効| 限定なし |
|5 | 作業指定による完全自動飛行　|　ドローン | 限定なし | 常に有効 | 限定なし |

### レベルの定義
レベル0: マニュアル操作で人がドローンを操作する

### レベル1
プログラムによるドローンの操作により、固定された環境で決まった動きをする。

ドローン自体は飛行中に自的要因、外的要因で必ずズレが生じるので、
小さい範囲での限定的な飛行のみ可能

基本的に人がみていてサポートする必要がある

### レベル2
プログラムによるドローンの操作により、決まったルートを移動するが、
順次位置補正を行い、正確で広範囲での移動が可能

移動の際に障害検知をOFFにする必要があるが、基本的には障害検知を有効にして、
周囲の人や移動物体と衝突しない状態

開始終了の人のサポートは必要だが、飛行中は目視する必要なし

### レベル3
段階的な移動ではなく、目的地とルートを指定し、自律飛行によって指定されたルートを移動
障害物がある際は避けてルート修正する。

技術的にはGPSによる目的地指定が使えない中で、3Dマップを保持し、自己位置推定を繰り返すSLAMの活用が必要と考えられる

### レベル4
SLAMの活用が安定し、移動物体の検知、ルート補正が可能な状態

完全自動飛行が可能という状態。

### レベル5
作業中に充電ステーションに移動、自動充電を繰り返し、充電ステーションの複数配置で
ドローンは少なくて済む
（複数機体を同時に制御することも可能）

消灯後にライトによる作業など
要件に沿ったカスタマイズが可能で、作業を完全に自動化できている状態。


## その他課題

さらっとレベル5に自動充電という話を記載しましたが、
現状のドローンのビジネス利用における最大の課題は稼働時間だと思います。

稼働時間がスマホのように長くなったり、自動充電が可能になればドローンによる省人化、完全自動化が現実的になってくるかと。

また、今だとメンテナンスの工数や機体やバッテリーが毎日利用した場合、どのくらい持つのかも
中々見えないところはあります。（DJIのサポートは一年ですし）

室内で飛ばすとなるとかなり正確な飛行と障害検知が必要なので、
障害検知をもっと細かく制御できないと、厳しいシチュエーションも考えられますし、
ズームの距離を伸ばしたり、カメラの性能、
飛行中に撮影した画像を元に補正をする際の通信速度の向上などドローンの性能自体の向上も必要かと。

ドローン自体安いものではないので、投資するには見えない部分が多過ぎるという課題もあると思います。

ドローン市場自体も、日本向けには稼働時間を犠牲にして、航空法に引っかからない軽い機体にしたり、
ドローンを検証できる場所が少なかったり、日本の法律自体、室内ビジネス向けには不利な状態かと思います。

## 願望

DJIから観測用のLiDAR搭載ドローンが発表され、配送向けのドローンが琵琶湖を超え、有人飛行ドローンが成功するなど、屋外向けのドローンは結構盛り上がっていると思いますが、室内向けドローンは事例自体がほとんどありません。

おそらく、今はビジネス利用向けに検証してみた人は、レベル2の途中で断念という感じだと思います。

課題は多く、室内向けドローンの検証結果は「人類には早すぎた」となっている気がしています。

PoC的にこれは厳しいねという結果も正解だとは思いますが、中々その結果を世に出せないし、
ニーズが届かないのは辛いなと思ったので、断片的にここで思ったことを書きました。

実際にドローンをビジネス利用するということは、ゴールをどこに設定するかが大事だと思います。

日本のおじさんはドローン大好きなので、自動運転車のようにみんなで盛り上げていけたらと。
DB 直積　innerjoin outerjoin　使い分け

直積
https://wa3.i-3-i.info/word15315.html

全ての組み合わせが出る！！！

テーブルA  テーブルB
a          d
b          e
c          f

3*3
テーブルA.a= テーブルB.dで繋いだら、両者が持つ属性にはヒットするが、お互いに同じ属性を持っていないと該当しない。

innerjoin outerjoin
https://zenn.dev/naoki_mochizuki/articles/60603b2cdc273cd51c59

テーブルA  テーブルB
a          d
b          e
c          

テーブルAは持っているが、テーブルBは持っていないため、テーブルを連結させた時に、テーブルBが持っていない属性に対して、あえてテーブルAの属性と一致しないテーブルを空白にしたい時


ex)絵のテーブルと作者のテーブル
実は、作者が不明な属性を持つときはあえて、innerjoinで空白にする

テーブルA  テーブルB
a          d
b          e
c
Protocol Buffers Style Guide (和訳)

# スタイルガイド

このドキュメントは `.proto` ファイルのスタイルガイドです。
下記の規則に従えば、Protocol Buffer Message の定義と対応するクラスの一貫性を保つことができて、容易に読めるようになります。

Protocol Buffer は時間とともに進化してきたので、異なる規則やスタイルで書かれた .proto ファイルを見ることがあります。
それらのファイルを修正するときは、**既存のスタイルを尊重してください**。
**一貫性は鍵となります**
しかしながら新しく .proto ファイルを作るときは、現在のベストスタイルを採用することが最良です。

## 基本的なファイルフォーマット
* 一行は80文字まで
* インデントはスペース2個
* 文字列はダブルクォートを選ぶように

## ファイル構造
ファイル名は lower_snake_case.proto にするべきです。
すべてのファイルは以下の順番で記述してください
1. ライセンスヘッダー (もし適用できるなら)
2. ファイルの概要
3. syntax
4. package
5. import (ソートする)
6. ファイルオプション
7. それ以外

## package
パッケージ名は小文字で、ディレクトリ構造と同様に命名してください。
例: ファイルが `my/package/` というディレクトリ内にある場合は、パッケージ名は `my.package` にします。

## message とフィールド名
message 名は CamelCase (最初の文字も大文字) にします。
例: `SongServerRequest`
フィールド名 (oneof や extension のフィールド名も含む) は `unserscore_separated_names` のようにアンダースコアで文字をつなぎます
例: `song_name`

```
message SongServerRequest {
  required string song_name = 1;
}
```

このフィールド名の命名規則は下記の Accessor にしてもらえます。

```
C++:
  const string& song_name() { ... }
  void set_song_name(const string& x) { ... }

Java:
  public String getSongName() { ... }
  public Builder setSongName(String v) { ... }
```

もしフィールド名に数字がある場合は、アンダースコアの後に数字を入れるのではなく文字のあとに数字を入れるべきです。
例: `song_name_1` の代わりに `song_name1` を使う

## repeated フィールド
repeated フィールドは複数形の名前を使います。

```
repeated string keys - 1;
...
repeated MyMessage accounts = 17;
```

## enum
enum タイプは CamelCase (最初の文字も大文字) で、値の名前は CAPITALS_WITH_UPDERSCORES (大文字のスネークケース) を使います。

```
enum FooBar {
  FOO_BAR_UNSPECIFIED = 0;
  FOO_BAR_FIRST_VALUE = 1;
  FOO_BAR_SECOND_VALUE = 2;
}
```

各 enum の値の最後はコンマではなくセミコロンを使うべきです。
一般的には enum の値は message の括弧の中の代わりとなります。
0 の enum の値は `UNSPECIFIED` の接尾辞を持つべきです。

## service
`.proto` に RPC service を定義する場合、service名と RPC メソッド名の両方とも CamelCase (最初の文字も大文字) を使うべきです。

```
service FooService {
  rpc GetSomething(FooRequest) returns (FooResponse);
}
```

## 避けるべきこと
* required フィールドの利用 (proto2 のみ)
* group 修飾子の利用 (proto2 のみ)

# References
https://developers.google.com/protocol-buffers/docs/style

# Date
2020/12/04
react-konvaでお絵描き


canvasを組み込んだwebサービスを作る機会があり、その際に利用したreact-konvaが使いやすかったので紹介です。

今回はreact-konvaとhookを利用して簡単なお絵描き機能を作っていきます。
以下のような感じです。
https://codesandbox.io/s/elastic-agnesi-pn76b
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927140/35104b0e-dacf-47b3-0216-fbd8a39ef7e5.gif)

#react-konvaとは
canvasのjsフレームワークkonva.jsを名前の通りreactで利用できるものです。
konva.jsのオブジェクトクラスがコンポーネントとして提供されています。
####konva.js
https://konvajs.org/docs/overview.html


react-konvaはStageというコンポーネントを土台に、その上にいろいろな要素を載せて実装を進めていきます。
例えば、LayerコンポーネントをStage上に複数載せることで、絵を描くときにあると嬉しいレイヤー機能を簡単に実装することができます。
イメージとして以下のようなコンポーネント階層を作っていきます（[公式](https://konvajs.org/docs/overview.html)より抜粋）
![スクリーンショット 2020-12-04 13.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927140/572837c5-3f2e-fb29-afcc-92019c613017.png)




hookを使った実装ではstateにオブジェクト要素を詰め込んでいき、その内容をcanvas上に描画していきます。

canvas上に絵を描くという目的を達成するために必要な処理は大まかに以下です。
①mouseDownなどのeventに反応してstateに線の描画位置や色設定などを詰め込んでいく。
②Layerコンポーネント内でstateの値を走査し、オブジェクトを描画していく。

canvasの描画内容をstateで管理できるため、すごく楽に実装を進められます。

実装イメージ（いろいろ省いて抜粋）


```react:sample.js
const App = () => {
  const [lines, setLines] = React.useState([]);
  const handleMouseDown = (e) => {
    const pos = e.target.getStage().getPointerPosition();
      // mouseDownなどのeventに反応してstateに値（線の描画位置や色設定など）を詰め込んでいきます。
      setLines([...lines,{points: [pos.x, pos.y], color, size}
    ]);
  };

  return (
    <>
       <Stage
         onMouseDown={handleMouseDown}
       >
          <Layer>
            {/* stateを走査して詰め込んだ値を描画していきます。 */}
            {lines.map((line, i) => (
              <Line
                key={i}
                points={line.points}
                stroke={line.color}
                strokeWidth={line.size}
                tension={0.5}
                lineCap="round"
              />
            ))}
          </Layer>
        </Stage>
      </>
  );
};
export default App;
```


#最後に
業務はサーバーAPI構築がメインのためReactの勉強がてらと思いreact-konvaを選んだのですが、webは技術進歩が目覚ましく、すぐに置いていかれてしまいますね、、

（記事の内容と直接関係ないのですが）特に今では当たり前のように使われているオンラインエディター（今回はCodeSandbox）が使いやすく驚きました。
UE4 ALSのサウンドキューの仕組み

## はじめに
どうも鴉です。
今回はUnreal Engine4のアニメーション制御アセットである「Advanced Locomotion System V4」（以下ALS）
のFootsteps（足音）の鳴らし方を書いていきます。

ALSはかなり高度で複雑なアニメーション制御アセットであり、足音の関数もかなり応用されていたように見えますが、便利で汎用性も高いと思いました。


##中身を見てみる
![ALS_FS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/929488/66fab927-16cb-ee98-bc61-b47b7939890d.png)
これがALSの足音のサウンドキューです。
まず最初に、Step　Walk/Run　Jump　Land、計4つに分けられています。次にModulatorで音量とピッチのMultiplyが設定され、Randomノードを通ってランダマイズされた音が鳴る仕組みになっています。

そして最後にSwitchノードです。
このノードはIntegerパラメーターのノードで、パラメーターの名前を指定してあげると、そのパラメーターに基づいて音を切り替えて鳴らしてくれます。

##Footstep_AnimNotifyを見てみる。
![ALS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/929488/a2c2069a-2aa9-89cf-6326-9a37e4c0d148.png)
これがFootstep_AnimNotifyの全体像です。アニメーション側で配置した通知を受け取り、音量やピッチのMultiplyもここで設定できるようになっています。
上記のFootstep_CueはSpawn Sound Attachedというノードに置かれています。

![enum1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/929488/b46f648c-9932-7a7b-4da3-d579f5322708.png)
そしてリターンノードの直前でSet Integer Parameterが繋がっています。
よく見てみると設定されている値の名前は、
先ほど見たスイッチパラメーターの名前「FootstepType」と同じ名前になっています。
![Enum_defo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/929488/5f0e9d3c-1297-0dc8-e8bf-ba19dd807b50.png)
さらにIn Intに繋がっているEnum変数の中身を見てみると、
サウンドキューで設定したカテゴリに切り替えられるようになっています。
Spawn Sound Attachedで鳴らす音を指定してあげて、そこからEnum変数をIntegerに変えて、サウンドキューでスイッチできるようになってます。

##Switchの使い方
サウンドキューの中にあるSwitchノードは、アニメーションの通知を設定する際に使います。
Footstep_AnimNotifyをアニメーションに配置し、そこからアニメーション毎にStepならStepのFootstep Type、WalkならWalk/RunのFootstep Typeを指定してあげます。

そうすることで、それぞれのアニメーションに適した音を、1つの通知と1つのサウンドキューで足音の実装と切り替えが出来るようになります。

AninNotifyは1つ1つの通知の設定を変えれるので、1つ目はLandで2つ目はWalkにする。みたいなこともできます。
![notify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/929488/789c5cc1-dd60-b09e-b61b-4a49d992a32e.png)


##Enumの設定
このFootstepTypeはData→Enumの中にあるFootstepTypeというEnumで作られています。
上からStep Walk/Run Jump Landと設定されていて、これに基づいてサウンドキューもカテゴリを分けています。
デフォルトではこのような設定ですが、自分好みに変えたかったら、WalkとRunを分けたり、すり足とか引きずり、とかに変えてみても良さそうです。
![Enum_memo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/929488/1a3102bf-b4d3-6493-5ad4-2eb05d69808e.png)


##まとめ
ALSに使われていたこのサウンドキューの仕組みですが、足音以外にも、様々なアニメーションの音の制御に使えそうだなと感じました。
攻撃の大中小や魔法を属性ごとにスイッチ出来るようにしてみても面白そうです。
ALSはUE4の機能をフル活用したアセットなので、理解するのは最初難しかったですが、今回の勉強を通してUE4のサウンドの実装を今まで以上に深く理解できるようになったと思います。

この記事がお役に立てば幸いです。
boost::spirit::x3 Unicode対応メモ

探したけど、x3版の対応方法は出てこなかったのでメモ。

## はじめに
boost::spiritは、特に指定しなければx3::standardに定義された文字エンコードが使われる。

``` cpp:char.hpp
namespace standard
    {
        typedef any_char<char_encoding::standard> char_type;
        constexpr auto char_ = char_type{};

        constexpr literal_char<char_encoding::standard, unused_type>
        lit(char ch)
        {
            return { ch };
        }

        constexpr literal_char<char_encoding::standard, unused_type>
        lit(wchar_t ch)
        {
            return { ch };
        }

    }

    //ここで、boost::spirit::x3 (標準の名前空間）に展開される。
    using standard::char_type;
    using standard::char_;
    using standard::lit;
```

これは、次の通りの定義になっている。

``` cpp:standard.hpp
    struct standard
    {
        //エンコードに使われるchar型
        typedef char char_type;
        typedef unsigned char classify_type;
        
        // ------中略----------

        // 文字判定部分
        static bool
        ischar(int ch)
        {
            // uses all 8 bits
            // we have to watch out for sign extensions
            return (0 == (ch & ~0xff) || ~0 == (ch | 0xff)) != 0;
        }

        //--------中略----------
    };
```

C++におけるchar型はUnicodeに対応しておらず、
判定部分でも、0xffを超えるコードポイントの文字は範囲外とされてしまう（文字と判定されない）。

これは日本語や、中国語などの一部外国語がパースできないことを指し、特に文字列をデータとしてハードコードするDSLを作成する場合、ローカライズ対応する際に非常に困る。

そこで、boost::spiritにはunicode対応の文字セットが用意されている。

## 方法
利用方法はシンプルで、```BOOST_SPIRIT_X3_UNICODE```マクロを定義してやるだけで良い。

``` cpp
//unicode対応マクロ
#define BOOST_SPIRIT_X3_UNICODE

//対応マクロ宣言のあとに、ヘッダを読む
#include <boost/spirit/home/x3.hpp>

namespace parser
{
	using x3::unicode::alpha;
	using x3::unicode::alnum;
	using x3::unicode::char_;

    //識別子のパース
	auto const identifier_def
		= raw[lexeme[(alpha | '_') >> *(alnum | '_')]];
    //文字列のパース
	auto const string_literal_def = '"' >> lexeme[*(~char_('"'))] >> '"';
}

```

※前バージョンのboost::spirit::qiを使う場合は、```BOOST_SPIRIT_UNICODE```マクロになる。

unicodeの定義は次の通り

``` cpp:unicode.hpp
    struct unicode
    {
        typedef ::boost::uint32_t char_type;
        typedef ::boost::uint32_t classify_type;

        static bool
        ischar(char_type ch)
        {
            // unicode code points in the range 0x00 to 0x10FFFF
            return ch <= 0x10FFFF;
        }
    };
```
文字判定の部分の範囲が0x10FFFF（unicodeの最大範囲）まで広がっており、char_typeも32bitに広がっていることがわかる。
（boost::uint32_tとやらが、UTF-32を保証する型なのかは調べてないんですが、どうなんですかね…。詳しい人教えて下さい）

## 参考
- [C++標準化委員会、ついに文字とは何かを理解する: char8_t](https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b)
- [boost :: spiritを使ってUTF-8を解析する方法は？](https://stackoverrun.com/ja/q/3690771)
VScode liveshere

### まずはじめに
今回、業務でペアプロをすることになり、VScodeのliveshereが便利だったので紹介したいと思います。

### 用意するもの
①エディタ：VScode
→liveshereのプラグインを導入します
https://visualstudio.microsoft.com/ja/services/live-share/

②Githubアカウント or Microsoftアカウント
ログイン方法：[Live Share] ステータス バーの項目をクリック
→サインインを求める通知が来ると思うので、そこからログインができると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418704/17e773b8-4a94-af33-6340-bea16ca5f909.png)


### ディレクトリを共有する人
VScodeの左にメニューバーのようなものがあると思います。
そこから、先程導入した、LiveShereを選択してください。
すると、セッションの詳細の下に、「共有（読み取り/書き込み）」があり、クリック後「コラボレーション リンクをコピー」から、共有するためのURLを作成します。
作成したURLを一緒に開発する人に共有してみてください。
（スクショの「共有（読み取り専用）」にすると、相手は書き込むことができないので、もし自分のコードを触られたくない場合はそちらを選択してください）

![Menubar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418704/ef219947-070f-be23-6c00-0760d391e0ef.png)![スクリーンショット_2020-12-04_11_26_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418704/dd74ed71-4e8c-9fac-b5cd-fed3e7b1d636.png)


### 参加する人
共有するひとから、URLをもらいアクセスします。すると、ブラウザ側で、「VScodeで開く」などのポップアップがでてくるとおもうので、VScodeを開いてください（）

すると、自分のローカルにあるVScodeではなく、相手の共有したいディレクトリ配下のVScodeを開くことができます。
【個人アプリ作成】情報管理アプリ制作5日目

今日は5日目。Bootstrapの使い方と複数条件指定の機能のキャッチアップをしました。

#Bootstrapについて

stratbootstrapからデザインを落としてきて、VScodeで編集するのはできるようになりました。
rubyでいじれるようにするためには、下記の4つのgemのインストールを行うなどが分かりました。
少し、時間がなくてまとめられないので、こちらもまとめていきたいと思います。

gem "sass-rails", "~>5.0"
gem "bootstrap-sass", "~>3.3.6"
gem "jquery-rails"
gem "jquery-ui-rails"

ただ、BtoBに近い感じなのでBootstrapはバージョンアップが早くてrubyで実装には向かないかもと思い始めました。
そのため、CSSデザインをこだわりすぎるといつまで経っても実装できないので、プログラミングスクールのデザインを流用しつつ、自分で作ろうと思います。


#複数条件指定の機能

rubyのGemで「ransack」というGemがあり、検索のためのフォームを作成したりコントローラーでの検索メソッドを簡潔にできるようになります。
具体的にはこんなメソッドを組み込むことで検索ができるそうです。
>_eq	：条件に合った検索を行う
_lteq	：「〜以下」という検索条件
search_form_for　：「ransack特有の検索フォームを生成するヘルパーメソッド」、
collection_selectメソッド　：　DBにある情報をプルダウン形式で表示できるヘルパーメソッド

そのほか学べたこととしてはseeds.rbのfiあるには元からあるDBにデータを入れておくことができること、distinctで重複する結果を省くことができることです。検索結果を盛り込み次第、コードも開示できればと思います。


#まとめ

こんな感じで毎日書くとなると結構しんどいですが、継続が最大の近道だと思うのでこれからも頑張ります！！
これから機械学習するなら  Azure Machine Learning が最高の環境！

この記事は、[求ム！Pythonを使ってAzureで開発する時のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-python) の 2 日目です（後から追っかけで書いています）。

----

これから機械学習するなら AzureML が最高の環境！って話です。

## [Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/?WT.mc_id=AZ-MVP-5001601) が最高の環境の理由は何があるんでしょうか？ 他じゃダメなんでしょうか？

その理由は以下になります。

* 問題
    * 誰しも（Pythonの）コードを書けるわけではない
    * 上に対処しないと、コードを書かない人間の手を動かさないのに口だけ動かして好き勝手するという悪影響がある
* 解決策
    * 「[Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/?WT.mc_id=AZ-MVP-5001601) ならドラッグ＆ドロップで機械学習のステップやアルゴリズムを構築でき、細かい設定をいじれば、機械学習モデルを作成することができる」ので、誰しも手を動かすことができる
    * 誰しも手を動かすことができるので、口だけ動かして好き勝手するということができなくなる（＝悪影響が消える）

ただ、[Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/?WT.mc_id=AZ-MVP-5001601) においてドラッグ＆ドロップで機械学習のステップやアルゴリズムを構築し、細かい設定をいじって構築した機械学習モデルだと痒いところに手が届かないことがあります（実務だと頻発します）。

そういった場合、[Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/?WT.mc_id=AZ-MVP-5001601) であれば、ドラッグ＆ドロップで機械学習のステップやアルゴリズムを構築し、細かい設定をいじって構築した機械学習モデルをベースに Python でコードを書くこともできるので、問題点を解消しつつ、実務にも耐えられる構造になっています。

こうすることで、メンバーが自分事として、機械学習におけるフェーズや登場人物、必要なスキル、アルゴリズム、データを理解し易い土壌となります。

**3 日目は @changeworld の「[Azure Functions で MeCab を使ってみた！](https://qiita.com/changeworld/items/52db9101ba192a3d0af0)」です。引き続きお楽しみください。**
AnsibleでcronのMAILTOとMAILFROMを設定する

cronでメールの送信先及び送信者を指定するオプションである、
MAILTOとMAILFROMをAnsibleを使ってcronに設定したい場合、
envをtrueにし、nameとjobにそれぞれ変数名と値を設定する。

```tasks/main.yml
- name: Install cron
  yum:
    name: crontabs
    state: present

- name: Setup cron env
  cron:
    name: MAILTO
    user: root
    job: mailto@example.com
    env: true
- name: Setup cron env
  cron:
    name: MAILFROM
    user: root
    job: mailfrom@example.com
    env: true
```

```shell
# crontab -l
MAILFROM="mailfrom@example.com"
MAILTO="mailto@example.com"
```

jobがvalueのエイリアスになっている事に多少違和感を感じるが、
cronのjobと変数定義で共通化する際などに便利かもしれない。
個人的には分かりにくいので分けて書いたが。

## 参考

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/cron_module.html
【箇条書きで紹介】Github Octoverse2020の要点まとめ

こんにちは。今回はgithubの2020年の[octoverse](https://octoverse.github.com/)(年次レポート)が発表されていたので、それについて、超ざっくりと、簡単に箇条書きで紹介します。

## 要点

- JavaScriptは相変わらず多くの人に使われていますが、今年になってTypeScriptが爆速で伸び、JS、Python、Javaに次ぐ4番目まできた 

![スクリーンショット 2020-12-04 12.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509690/5bfd9a26-4a9a-2338-8490-1da78dde3607.png)
引用：[github](https://octoverse.github.com/)

- githubアクティブユーザー1人当たりのossのプロジェクト作成数が前年と比べて爆伸びした

![スクリーンショット 2020-12-04 12.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509690/4974a502-af57-7feb-7ca4-5ca65db5381f.png)
引用：[github](https://octoverse.github.com/)

- 自宅にいることを余儀なくされている時代に、開発者たちは会社とは異なるオープンソースというコミュニティを見つけることで、会社の仕事からのいい逃避になっている

- 5月にローンチされたGitHub Discussionsのユーザーがいい感じに増えている
- GitHub Discussionsはコミュニティーメンバーの定着率をあげた

## 参考
もっと細かい情報もレポートにはあります。
[github octoverse](https://octoverse.github.com/)