OmniAICreator/Qiita-1.07M huggingface dataset:
Rust: MariaDB のデータを作成 (Create)

こちらのプログラムで読むデータを作成します。
[Rust: MariaDB のデータを読む (Read)](https://qiita.com/ekzemplaro/items/6275e1c853d7abcae1e9)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── main.rs
│   └── utils.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "create"
version = "0.1.0"
edition = "2018"

#

[dependencies]
diesel = { version = "*", features = ["mysql"] }
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	create/src/main.rs

					Jul/17/2020
*/
// --------------------------------------------------------------------
use crate::utils::establish_connection;
use diesel::mysql::MysqlConnection;
use diesel::prelude::*;

mod utils;

// --------------------------------------------------------------------
fn simple_sql() {
	let connection: MysqlConnection = establish_connection();

	let mut sql_str = "drop table cities";
	connection.execute(&sql_str).unwrap();

	sql_str = "create TABLE cities
		(id varchar(10) NOT NULL PRIMARY KEY,
		name text,population int,date_mod text)";
	connection.execute(&sql_str).unwrap();

	sql_str = "insert into cities (id, Name, Population, date_mod)
		 values('t3321','岡山','43781','2000-3-15')";
	connection.execute(&sql_str).unwrap();

	sql_str = "insert into cities (id, Name, Population, date_mod)
		 values('t3322','倉敷','79124','2000-8-9')";
	connection.execute(&sql_str).unwrap();

	sql_str = "insert into cities (id, Name, Population, date_mod)
		 values('t3323','津山','31586','2000-6-21')";
	connection.execute(&sql_str).unwrap();
}

// --------------------------------------------------------------------
fn main (){
	eprintln! ("*** 開始 ***");

	simple_sql();

	eprintln! ("*** 終了 ***");
}

// --------------------------------------------------------------------
```

src/utils.rs は、こちらのものと同じ
[Rust: MariaDB のデータを読む (Read)](https://qiita.com/ekzemplaro/items/6275e1c853d7abcae1e9)

コンパイル

```bash
cargo build
```

実行

```bash
cargo run
```
Raspberry PI4が虹画面から進まない問題の解決

ラズパイ４で電子工作をしていて、ある日突然起動画面が虹色画面から進まなくなったので、それの原因特定と解決のメモ

#調査

「ラズパイ　虹画面」や「Raspberry pi rainbow screen」で検索すると、色々情報が出てくるので、一般的な原因を書くと

- 電源の電流不足（ラズパイ４は２．５A以上必要なのでそれ以下の場合は起動が不安定になるそうです）
- SDカードのカーネル読み込み失敗（SDカードが壊れてる）
- HDMIモニタが認識できていない（他のHDMIモニタだと動くかも）

など

#原因

上記調べた内容が、自分の場合には当てはまらなかったのでまずはラズパイとの接続を最小構成にして起動した所、あっけなく起動しました。

で、接続回路を増やしていくと、Arduino（STM32F103Cの互換品、通称Blue Pillと言われているもの）とUART（GPIO0とGPIO1、GND）をつないだら虹画面になりました。
※ Arduinoには５Vを繋いでおらず、電源が入っていない状態でした


#解決方法

Arduino側の電源が入ってなかったので、５Vを繋いでArduino側の電源も入れた状態でラズパイの電源をいれたら虹画面にならずに無事ラズパイ起動しました。


電子回路初心者なので、「なぜそうなる」というのは理解できていませんが、ラズパイ起動で虹画面が出た場合は、GPIO周りの配線も疑ったほうがいいよという話でした。
【ASP.NET Core】動的に生成されるチェックボックスの値を取得【C#】

* ビューモデル側
  * ビューモデルに受け取り用にプロパティを配列で定義
* ビュー側
  * 要素の`name`に受け取り用にプロパティの変数名を設定
* コントローラ側
  * ビューモデルを引数に取るアクションを定義

```c#:ビューモデル
namespace Test
{
    public class ViewModel
    {
        /// <summary>
        /// 選択された値を取得します。
        /// </summary>
        public string[] SelectedValues { get; set; }
    }
}
```

```html:ビュー
@model Test.ViewModel

@{
    ViewData["Title"] = "ページタイトル";
}
<div>
    <h1>@ViewData["Title"]</h1>
    <form asp-controller="Test" asp-action="Index" method="post">
        <ul>
            <li>
                <label for="id1"></label>
                <input id="id1" type="checkbox" name="SelectedValues" />
            </li>
            <li>
                <label for="id2"></label>
                <input id="id2" type="checkbox" name="SelectedValues" />
            </li>
            <li>
                <label for="id3"></label>
                <input id="id3" type="checkbox" name="SelectedValues" />
            </li>
            <li>
                <label for="id4"></label>
                <input id="id4" type="checkbox" name="SelectedValues" />
            </li>
            <li>
                <label for="id5"></label>
                <input id="id5" type="checkbox" name="SelectedValues" />
            </li>
        </ul>
    </form>
    <input type="submit" value="送信" />
</div>
```

```c#:コントローラ
using Microsoft.AspNetCore.Mvc;

namespace Test
{
    public class TestController : Controller
    {
        [HttpPost]
        public ActionResult Index(ViewModel model) => this.View(model);
    }
}
```


**それだけ(\*^o^\*)**
adb周りの忘備録

adb接続はファクトリーリセットで解除される．
そのためOOBE→HOMEまでの自動化にはinitializeには別のアプローチが必要．

0.tesseractやOpenCVと連携させて目的のアイテムをつかむまでループ処理
→他に展開するのが難しい（必要モジュールなどの共有）
0.最悪，端末をみながらキーイベントを順番通りに送信するなどで実装できる
→が，FWバージョン次第で環境が変化しうるのでなるべく避けたい．
【PHP】クラスプロパティの値には、動的な値を代入することができないようです。

※ 正確なタイトルは「クラスプロパティの値を代入する際は、`__construct()`を使わない限り、動的な値を代入することができないようです。」です。

### あらまし
ぼく「PHPでクラスのプロパティを定義するぞ！」
ぼく「プロパティの定義なんて慣れたもんだぜ…ｶｷｶｷ」

```PHP:ぼくのかんがえたさいきょうのクラス.php
class クラス {
    private $プロパティ = [
        strtotime('yesterday'),
        strtotime('today'),
        strtotime('tomorrow'),
    ];
}
```


ＰＣ「`PHP Fatal error:  Constant expression contains invalid operations in /ぼくのかんがえたさいきょうのクラス.php on line 5`」

ぼく「はっ？」
ＰＣ「せやから、`PHP Fatal error:  Constant expression contains invalid operations in /ぼくのかんがえたさいきょうのクラス.php on line 5`やで？」

ぼく「…。」
ぼく「意味わからん、日本語で言えや。」
ＰＣ「日本語でいうと`定数式に無効な操作が含まれています`ってことや。」

ぼく「定数式（`const`）は使ってないぞ！」
ＰＣ「知らんけど、とにかくエラー解決しないとコード動かせへんからな。ほなよろしく〜。」
ぼく「そ、そんな…」


それから１０年の月日を経て…。

ぼく「うーん、うーん」
ぼく「定数宣言してないのに定数式のエラー…意味わからん…うーん、うーん」
ぼく「どんな配列なら定義できるんだ？」

```PHP:
    private $プロパティ = [
        'yesterday',
        'today',
        'tomorrow',
    ];
```

ＰＣ「これならイケるで！」

```PHP:
    private $プロパティ = [
        strtotime('yesterday'),
        'today',
        'tomorrow',
    ];
```

ＰＣ「これはムリやで」

ぼく「えっ…？まさか…。」

```PHP:
    private $プロパティ = strtotime('yesterday');
```

ＰＣ「だからムリやっちゅーに」


ぼく「…。」
ぼく「おいおいおいおい！」
ぼく「まさかクラスプロパティの値には、関数の返り値を使うことができないのか！？」

ＰＣ「ハァ…しょうがない調べたるわ」
ｶﾀｶﾀｶﾀ…ﾁｰﾝ!
ＰＣ「PHP公式様のありがたい御言葉によるとな、関数の返り値どころか、変数展開すらムリらしいで。」

> 初期値は定数値でなければなりません。 つまり、コンパイル時に評価可能な値でなければならず、 実行時の情報がないと評価できない値であってはいけないということです。

[（参照元）](https://www.php.net/manual/ja/language.oop5.properties.php)

ＰＣ「ってことは」

```PHP:
    private $プロパティ = $他の変数;
```

ＰＣ「これもムリっちゅうことやな。」
ＰＣ「まぁ`__construct()`使えばええんちゃう？」
ぼく「そんな！このクラスの`__construct()`には他にもいろんな事をやらせるつもりなんだ！」
ぼく「ただプロパティを定義するだけの処理なんて書き込みたくないんだよ！」
ＰＣ「そんなん知らん。嫌なら使うなっちゅう話や。」

ぼく「そ…そんな…」

絶望に暮れた少年は、自らその命を断ったのであった…。

**ーBAD ENDー**
日本一簡素なPythonのメモ（クラスとかオブジェクトって）

###クラスとオブジェクトが理解できなかったので書いてみました。
####クラスとは（いろいろな例えがあり、説明する方の親切度によって説明が異なっているようです）
- オブジェクト・・・変数とそれに関連する関数をセットにしたもの⇒セットなのでプログラムしやすい
- クラス　　　・・・オブジェクトの雛型の名前
    - コンストラクタ・・　雛型の初期値 ※initはアンダーバー２個ずつで囲み、引数にはselfをつける
    - メソッド　　・・・　クラスの中で定義する関数。この関数を使ってクラスを動作させる

- インスタンス ・・・　クラス（雛型）らコンストラクタを呼び出して実際に稼働させる基
- メンバ　　　 ・・・　クラス（雛型）の引数を参照する

####今回のプログラムに当てはめると
- オブジェクト・・・ファイル名で降順にソートしたり、ファイルのサイズを測るもの関数と関連する変数のセット
- クラス　　　・・・FileControl
    - コンストラクタ・・  引数としてファイルの参照先を格納するdir変数を宣言
    - メソッド　　・・・ ファイル名で降順にソートするmake_r_listと、ファイルサイズを取得するsize_checkを宣言

- インスタンス ・・・　引数にファイルの参照先をつけてFileControlを呼び出して、インスタンスpathを作成
- メンバ　　　 ・・・　インスタンスpathに引数を格納するdirをつけて格納されている値を確認

#####つまりは
「FileControlクラスを呼びしてpathインスタンスを生成し、make_r_listメソッドでファイルを降順にソートして、そのファイルのサイズをsize_checkメソッドで計測した」ということになります。

```python:
import os
import pprint
#FiileControlクラスを定義
class FileControl:
    #コンストラクタを定義
    def __init__(self,dir):
        self.dir=dir
    #ファイル名で降順にソートするメソッド
    def make_r_list(self):
        dirs=[]
        for n in os.listdir(self.dir):
                            #　↓　ファイルサイズの計測にフルパスが必要となるためフルパスを配列に追加
            dirs.append(self.dir+n)
        dirs.sort(reverse=True)
        return dirs
    #ファイルサイズを取得するメソッド  
    def size_check(self,fname):
        s_var=os.path.getsize(fname)
        s_var=s_var/(1024*100)
        return s_var
#↑↑↑↑↑ここから上はすべて定義。
#↓↓↓↓↓ここから下が実際の稼働になります。
# FileControlを呼び出しpath（インスタンス）を作成
path=FileControl('c:/users/user/desktop/PDF/')
#メンバの確認
print(path.dir)
#ファイル名で降順にソートしてリストを返す、make_r_listを実行
list=path.make_r_list()
#list変数からファイルを一個ずつ読み込んでファイルサイズを取得するsize_checkメソッドを実行
for f in list:
#formatを使うと整数型を変換しなくても同時に表示できるため
    pprint.pprint('ファイル名:{0}--ファイルサイズ_{1:.1f}KB'.format(f,path.size_check(f)))
```
実行結果。ファイル名とサイズ（KB換算）が表示されています。
![class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205747/b5ebc205-b853-4b9c-97ef-ccf061addeff.png)

自転車のフレーム（クラス）にタイヤ(メソッド)やペダル(メソッド)をつけてタイヤには空気(引数)、ペダルに推進力（引数）を与えるようなものでしょうか？最終的にどの言語も配列とクラスを覚えなければならないというようなことをどこかで見たので書いてみました。
【CSS】可変フォントサイズをmixinで簡単に導入してみる

# 今回実現したいこと
- デバイスサイズに応じて良い感じに可変するフォントサイズを実現する
- フォントサイズの大きくなりすぎ、小さくなりすぎを防ぐために最大値と最小値を設ける
- mixinを用いて、誰でも簡単に導入できる

では早速、コードとデモを見ていきましょう。

# コードとデモ

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="flat_ito" data-slug-hash="zYrJGxJ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="zYrJGxJ">
  <span>See the Pen <a href="https://codepen.io/flat_ito/pen/zYrJGxJ">
  zYrJGxJ</a> by ito / FLAT Inc. (<a href="https://codepen.io/flat_ito">@flat_ito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

見ての通り、Sassの変数や関数を使用しています。今回は、こちらのmixinの使用方法に焦点を当てているので、Sassのコード解説は割愛します。

デモの例では、pタグに対してCSSを指定しています。
デバイスサイズ500px以下でフォントサイズが16pxに固定。また、デバイスサイズが1000px以上でフォントサイズが32pxに固定されます。500px〜1000px間は、フォントサイズが16px〜32pxの間で良い感じに可変していることが確認できます。

# 使用方法
mixin部分はコピペで使用できます。また、デモの使用例を参考に、CSSを付与したいセレクタに@includeを指定します。具体的には下記のように指定しましょう。

```ruby:使用方法
.selector {
  @include responsive("プロパティ名", "デバイスの最小幅", "デバイスの最大幅", "最小値", "最大値");
}
```

今回はフォントサイズを可変にしましたが、上記のプロパティ名を変更することでフォントサイズ以外も可変にすることができます。例えば、marginやpaddingなどですね。

# まとめ
今回は、可変フォントサイズをmixinで誰でも簡単に導入できる方法を紹介しました。
すべてのフォントサイズを可変にすることはオススメしませんが、要所要所で利用できると便利だと思います。是非使ってみてください！

# Twitterアカウント
Twitterも更新していますので、よかったらフォローお願いします！
[Twitterアカウントはこちら](https://twitter.com/flat_ito)
mPDFのCSSでハマったことまとめ

## mPDFが対応しているHTML・CSS

英文ですが[公式ドキュメント](https://mpdf.github.io/css-stylesheets/supported-css.html)に対応しているHTML・CSSなどがまとまっています。使用条件がある場合があるので、上手く効かない時は調べてみましょう。

- 昔からあるものは大体使える
- flex、calcなどの横並びに便利なものは使えない…
- absolute、floatは使えるけど条件あり
- reset.cssは不要。デバッグしづらくなる

## 今回の記述方法
基本同じファイルにHTML、CSSを分けて書くスタイルです。

``` html
<div class="hoge">
  HTML
</div>

<style>
 .hoge {
   width: 100px;
 }
</style>
```

## ハマったこと

**floatが上手く効かず、横並びにならない…**
mPDFでは、横幅の指定が無いとfloatで回り込むことができないようです。
widthを指定することで正しく動作します。 [ドキュメントにも書いてありました。](https://mpdf.github.io/what-else-can-i-do/floating-blocks.html)

**imgタグのサイズが変更出来ない…**
`img {width:100px}` といった感じで、imgタグにcssを当てても効ききません。
`<img style="width:100px;">`のようにHTMLタグに直接書くと反映されます。
`<img width="100px">`でもOK。

他にもtableタグにも直接書かないと効かない場合があったりしたので、**「効かない場合は直接書く」**が正義です。

**pタグを使うと大きく余白ができる…**
`padding`もとくに設定していないのに、どうしても余白が出来てしまいました。
これに関しては何か解決作があるのかもしれませんが、ひとまず`div`や`span`を使うことで解消しました。

**border-bottomが効かない…！**
`border-bottom: 1px solid #000;`では何も起こらず、
borderを全方向に設定し、bottom以外を打ち消すことで表現できました(謎い)




``` css 
.hoge {
  border: 1px solid #000;
  border-top: none;
  border-right: none;
  border-left: none;
}
```

## まとめ　
floatのドキュメントを見るまではガッツリハマってしまいました。
上記の現象を把握した上で、flexなど新らしいCSSを使わなければ、割とスムーズに組めると思います。
GithubのPersonal Access Tokenがどのユーザーのやつかわかんなくなったとき

# This token is 誰

個人のトークンとかチーム共有のトークンとかアプリケーション固有のトークンとかあるじゃないですか。
でもアクセストークンさん一度発行したら最後、二度とGithub上で表示されないじゃないですか。
たくさんのトークンが混ざるともうだめ。誰ですかおまえは。

# トークンを使って"自分"のユーザー情報を取得する

こうじゃ。

### Request

$TOKENのとこに正体を知りたいトークンをいれる。

``` bash
curl \
  -H "Accept: application/vnd.github.v3+json" \
  -H "Authorization: token $TOKEN" \
  https://api.github.com/user
```
### Response

loginというフィールドで名乗ってくださる。
メールアドレスとかも教えてくださる。完璧である。

``` bash
{
  "login": "my-user-name",
  "id": 123456789,
　～～以下略～～
}
```


# めでたし！！！！！！！

知らなかったの私だけかもしれないですけどね…！
keytoolで自己証明書の有効期間の最大を試してみた！

# はじめに
　自己証明書の有効期間の終了日は、最大何時まで設定できるのでしょうか。。
　MuleSoftなどシステム間の連携をする際に証明書を利用することが多くなりました。
　外部に公開しているAPIはSSL証明書を利用しますが、JWT署名やクライアント認証など閉じられた範囲で証明書を利用する場合、自己証明書を利用することが多いいのではないでしょうか？

# 検証の目的
　Oracleのkeytoolのページでは以下の事が書かれています。
　"有効期間: 各証明書は、限られた期間のみ有効になります。この期間は開始の日時と終了の日時によって指定され、数秒の短い期間から100年という長期にわたることもあります。"
[Oracle:Keytoolマニュアル引用](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/keytool.html)
　では、いったい有効期間は最大いつまで有効なのでしょうか？
　今回の検証は自己証明書の有効期間の終了日の最大を調査しました。

# 結論
　最大は終了日は9999/12/31でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/3751d6d3-4804-df2c-80eb-87b98d96957d.png)

# 検証方法
下記のコマンドを実行してJavaキーストアを作成し、証明書に変換します。
[-validity]オプションで基点の本日から有効期間の終了日までの日数を設定できます。

```
$keytool -genkeypair -keystore keydir/keystore_7985y.jks   -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown"  -keypass password  -storepass password  -keyalg RSA  -sigalg SHA1withRSA  -keysize 2048  -alias test -ext SAN=DNS:localhost,IP:127.0.0.1 -validity 2914436
$keytool -exportcert -keystore keydir/keystore_7985y.jks -alias test -file keydir/mykeypair_7985y.der
```

# 終了日が最大を超過した場合
キーストアーは作成できますが、証明書作成時に下記のエラーが発生します。

```
keytoolエラー: java.security.cert.CertificateParsingException: java.io.IOException: Parse Generalized time, invalid format
```

# 日数を指定しない場合
 日付をして指定しない場合の日数は90日でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/a0847db0-c193-b8f7-c338-2d11dca69762.png)

# 最後に
　結果はほぞ想定内でしたが、証明書なので10年や100年といった制限がかけられていると思っていました。システム的な制限のみだったので驚きでした。
　有効期間は要件のサブ的なお話なので、お客様との会話の中でこのような話があった場合は「さらっ」と確認出来たらいいですね。では！
#zsh PROMPTの気に入らないところだけ直す/時計代わりにする 

zshのプロンプトを編集しようと思ったのだが、`zshenv`にも`zshrc`にもPROMPTの定義が見つからず、いちから再定義するとよかったところまで消えた。いいとこ取りしたい時にどうすれば？と言う記事です。

#現在のPROMPTの値を取得
シェルで
`$ echo $PROMPT`とすると、現在のPROMPTの値が返ってくるのでこれをコピーする。

```echo.sh
$ > echo $PROMPT
${SSH_TTY:+"%F{9}%n%f%F{7}@%f%F{3}%m%f "}%F{5}${_prompt_sorin_pwd}%(!. %B%F{1}#%f%b.)${editor_info[keymap]}
```

次に`$ vi ~/.zshenv`として以下のような行を追記する。

```.zshenv.sh
PROMPT='${SSH_TTY:+"%F{9}%n%f%F{7}@%f%F{3}%m%f "}%F{5}${_prompt_sorin_pwd}%(!. %B%F{1}#%f%b.)${editor_info[keymap]} '
```
これで再現は完了。（''で括るのと、末尾の空白を忘れないように）

#現在の時刻をプロンプトに表示し、1秒おきに更新
これを以下の3行のように変更すると、プロンプトが常に最新の時刻を表示するようになる。

```.zshenv.sh
PROMPT='%F{6}%D %*%f ${SSH_TTY:+"%F{9}%n%f%F{7}@%f%F{3}%m%f "}%F{5}${_prompt_sorin_pwd}%(!. %B%F{1}#%f%b.)${editor_info[keymap]} '
TMOUT=1
TRAPALRM() { zle reset-prompt }
```

![スクリーンショット 2020-07-17 12.07.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10766/e9ceac73-6058-9d26-b416-38805b8f3c4b.png)

ん〜。便利！

- プロンプトには常に現在時刻が入ることになる
- 時刻は改行した時点で確定するのでいつそのコマンドを打ったか後で遡れる
- 作業に没頭して予定や約束に遅れるというようなことを防止できると考える
kintone認定試験学習用kintoneアプリを作ったけどkintone hack 2019では予選落ちだった話

# はじめに
@YoshihikoTakeuchi による [kintone hack 2019の予選敗退ネタを供養する](https://qiita.com/YoshihikoTakeuchi/items/54877f8e2449f4053475) 記事のパクリです。

# 自己紹介です
ｲｼｲｹﾝﾀﾛｳです。刷毛をつくってる会社にいます。
[![main_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/564c7de8-6fc7-61c7-a97f-f8d0a7c9943d.jpeg)](https://www.maru-t.co.jp/painting_brush/)
- 刷毛をつくっている会社の兼業情シスです。kintone認定資格は3つとも取得済です
- その他にITストラテジストや[情報処理安全確保支援士](https://riss.ipa.go.jp/r?r=010775)などの国家資格をいくつか取得しています
- kintoneのカスタマイズは社内向けのみで、プラグインは作ってません（作れません）

![アソシエイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/761a3907-f9f7-4da5-c5e9-9ae9e9d90e04.png)　![アプリデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/3fa2bf0c-e0f9-f8ea-a9fb-88611caa545b.png)　![カスタマイズ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/476db7b8-509f-a484-7913-2dd61afa63f2.png)

# やりたいこと
1. 選択肢は4つだが、択一選択ではなく、複数正解を設定したい 
2. 正解選択肢をビジュアルで記憶しないように、再挑戦した場合は選択肢の順番を変えたい 
3. レコード編集画面にするのは面倒なので、レコード詳細画面のまま学習したい
4. 解説も読みたい
5. 成績も管理したい

# 完成！
![ezgif-2-b0f8a28cbb29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/0332f99f-6afb-672f-61f5-b8c0721c1fed.gif)


# おわりに
- もし作り方の需要があればまた記事書きます
- 今回はエントリーできそうにないけど見学したいです！偉い人お願いします！
- 塗装用ローラーもつくってます
[![main_image (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/d20f1b7b-355a-1524-829f-71fcd21bdfed.jpeg)](https://www.maru-t.co.jp/painting_roller/)
【備忘録】JQueryのhoverアクションで箱にカーソルがのったら小さくし、かつflex-wrap:wrap;が崩れないようにしたい

初投稿なので見ずらかったらすみません。

タイトルの通り、JQueryのhoverアクションでcssで作成したデザインにカーソルが乗った時と離したときに発生するアクションの備忘録です。

下記のように大きい箱の中に小さい箱が入っているデザインを作成し、
その小さい箱にカーソルが乗ったら小さく、カーソルが外れたら元の大きさに戻るようにしたときの記録です。

```sample.html
<div class="main-box">
      <div class="sub-box">
        <p>箱</p>
          <div class="hover">
          </div>
      </div>
      <div class="sub-box">
        <p>箱</p>
          <div class="hover">
          </div>
      </div>
      <div class="sub-box">
        <p>箱</p>
          <div class="hover">
          </div>
      </div>
    </div>
  </div>

```

```sample.css
.main-box {
  align-items: center;
  background   : #fff;
  border-radius: 10%;
  display: flex;
  flex-wrap: wrap;
  height       : 380px;
  margin       : auto;
  width        : 380px;
}

.sub-box {
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}

.hover {
  background   : #000;
  border: #fff solid 1px;
  border-radius: 10%;
  width        : 100px;
  height       : 100px;
}
```

さて、ここでJQueryのhoverアクションを記述するのですが、

```sample.js
$(function(){
    $(".hover").hover(function(){
      $(this).css("height", "80px");
      $(this).css("width", "80px");
    },
    function(){
      $(this).css("height", "100px");
      $(this).css("width", "100px");
    });
});
```
最初はこのようにJQueryを記述しましたが、箱が小さくなった時に下記のように隣接する別の箱との距離が近くなってしまいました。
<img width="396" alt="スクリーンショット 2020-07-17 11.56.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674242/3f443516-6b8d-8256-fe38-19ccb4d16d75.png">
※若干ですが、小さくなった箱に隣の箱が寄ってしまいます。高速でカーソルを乗せたり離したり繰り返すとすごく気持ち悪いです。

そこで、マウスが乗った時にmargin-right,leftも変更するように記述し、箱の大きさ100pxを変えないようにしてみました。

```sample.js
$(function(){
    $(".hover").hover(function(){
      $(this).css("height", "80px");
      $(this).css("width", "80px");
      $(this).css("margin-left", "10px");//左右で２０px減る分を補う
      $(this).css("margin-right", "10px");//左右で２０px減る分を補う

    },
    function(){
      $(this).css("height", "100px");
      $(this).css("width", "100px");
      $(this).css("margin-left", "0px");
      $(this).css("margin-right", "0px");
    });
});
```
こうすると、小さくなった分をmarginが補うため小さい箱全体の大きさが変わりませんでした。
<img width="409" alt="スクリーンショット 2020-07-17 11.56.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674242/778293d7-686c-8484-841b-42496bde4bf9.png">

これで小さくなっても均等を保持することに成功しました。

恐らく、箱のCSSもJQueryもこんなやり方でなくてももっとシンプルなコードで実装はできると思いますが、こんな形で解決させました。では！
AlphaZeroで6x6オセロ

#最初に
コードはここには書かないのでこのリンクを参照していただきたい。
https://github.com/AokiMasataka/AlphaZero
環境
windows10
python 3.7
tensorflow 1.12
keras 2.2.4

CPU i7 7700
メモリ 16GB
GPU GTX1070
モンテカルロやデュアルネットワークなどは、探索回数や畳み込みフィルターの枚数を減らして実装していたり、その他諸々省いていたりしているが悪しからず。

参考：
https://www.amazon.co.jp/AlphaZero-深層学習・強化学習・探索-人工知能プログラミング実践入門-布留川-英一/dp/4862464505

https://www.amazon.co.jp/最強囲碁AI-アルファ碁-アルファ碁ゼロ対応-深層学習、モンテカルロ木探索、強化学習から見たその仕組み-TECHNOLOGY/dp/4798157775/ref=pd_lpo_14_t_2/356-1858719-2898113?_encoding=UTF8&pd_rd_i=4798157775&pd_rd_r=1f8e06c7-6fac-4a9c-8129-208fc49fcc60&pd_rd_w=AKVsz&pd_rd_wg=BcevS&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=NEM5B7FTTXX3G5G8SBJN&psc=1&refRID=NEM5B7FTTXX3G5G8SBJN
#実装
##model.py
このファイルにはデュアルネットワークのインスタンスを生成するModelクラスを入れている。
デュアルネットは、3層畳み込みレイヤーのボトルネック型のレズデュアルブロックを8層重ねPolicy、Valueの二つの出力へ続けている。
ブロックの数とフィルターの枚数はconfig.pyで変更できるのでPCスペックに応じて調整していただきたい。
##game.py
今回は6x6オセロで実装しているが、将棋やチェスなどのボードゲームでもニューラルネットの入出力サイズを変更するだけで動くはず。多分…
##game_c.pyx
実行速度を上げるためにcythonバージョンで書いてあり、コンパイルしてMCTS.py, main.py, self_play.pyのimportを

```python
from game_c import Game
```

に書き換えることで自己対戦の速度を1.2倍くらいにできる。

##config.py
アルゴリズムに影響する各種パラメーターを記述している。
学習速度が遅いと感じたら、SARCH_NUMを160から80くらいに減らすと学習がスムーズになる。

##self_play.py
自己対戦によるデータ生成とモデルの評価などを行う。
なるべく同じような局面にならないように、最初の数手は完全にランダムな手を打つようにしている。

##MCTS.py
選択可能なアクションなど現在の盤面の状態を入れるNodeクラスと、
そのNodeを広げて探索を行うMCTSクラスが入っている。
デュアルネットワークを使用したモンテカルロ探索の具体的な解説はhttps://postd.cc/alphago-zero-how-and-why-it-works/
こちらがわかりやすく説明してある。

##main.py
Mainクラスでは学習を進めるtrainメソッドがあり、その際生成した学習データをdataフォルダに、モデルをmodelフォルダに保存する。

##play.py
学習したAIと対戦することができる。playインスタンスを生成するときの引数で対戦するAIの世代の選択が可能。
GUIを練習がてら実装したが、バグが大量にあり尚且つかなり使いにくくなってしまった。
修正する予定はないです。MACで起動するとtkinterライブラリのせいで落ちてしまうので悪しからず

#学習結果、学習したAIと戦った感想
自己対戦による学習データ生成→対戦データの学習→一つ前の世代との対戦(評価)の流れを一つのサイクルとし、最終的に14世代まで学習を進め、そのAIと実際に対局し評価した。
結果として5世代目で完全に歯が立たなくなり、それ以降は自分自身の実力では勝率0%なので、AIの評価ができなっかた。一応世代を進めるには一つ前の世代に52%の勝率を出さないといけないので、確実に強くはなっているはずである。
当初は、AIを実装するにあたって「自分と同じくらいの実力程度になればいいか」ぐらいに思っていたので、正直その成長速度には驚かされた。
機械学習の教材を一通り読んだ感想

##機械学習の難しさを痛感

まず初めに私にとってこの記事が初投稿になるので、私の思ったことを書いた記事であることをご了承ください。
偏差値が低くても入れる文系大学の学生の私が人工知能に興味をひかれ、特に機械学習という分野を実際に学んでプログラムとして動かしてみたい、そして将来仕事として扱いたいと思い、今年の３月ごろから学び始めました。勉強は独学です。
勉強する上で使ったのが**[達人データサイエンティストによる理論と実践　Python機械学習プログラミング](https://www.amazon.co.jp/Python-機械学習プログラミング-達人データサイエンティストによる理論と実践-impress-gear/dp/4295003379/ref=pd_lpo_14_img_0/358-8353692-6692522?_encoding=UTF8&pd_rd_i=4295003379&pd_rd_r=468859d1-f37a-45c0-8da1-13d109c12997&pd_rd_w=Ekpau&pd_rd_wg=Ty5Gd&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=R7D526N5HZ2ZKPRKGHN3&psc=1&refRID=R7D526N5HZ2ZKPRKGHN3)**という教材です。この教材は機械学習の基礎から数学的理論の解説、そして実際にpythonを使ったプログラムがぎっしりと載っている初心者の私にしてはハードな内容でした。それでも記載されているpythonコードを打ちながら必死にテキストを一通り読んできました。そこで感じたことをまとめていきたいと思いま
す。

##感じたこと
- 数学の基礎が身についていない分、理論が理解ができていない。
- コードをそのまま入力するだけでそのコードの流れや仕組みが理解できてない。
- pythonのプログラミングスキルが圧倒的に足りない。
- 記載されているコードを写して自分の画面上に結果は出力できたけど結局このコードは何が目的で何をしたかったの？となってしまい頭に入っていない。
- じゃー次は自分で考えてプログラムを作成出来るかと言われたら絶対できない。

##今後に向けて
以上が私が教材を一通り読んだ感想でした。何が言いたいかというと**教材を手にしたから学んでいる訳ではない**ということが伝えたかったことです。こういった自分の未熟さを感じたのと同時に機械学習がいかに難しく時間がかかるものかを心から痛感することができたのは、今後の勉強に対しての取り組みを改善することができる良い機会になったとも思っています。今後は基礎を重点的にやり、理解するまで同じことを繰り返すようにする、また1つの分野に絞り、回帰分析ならそれを理解してから次に進むようにしようと思います。
他に良い学び方があれば教えてもらえると助かります。
python+selenium execute_scriptを使うと半角カタカナが文字化けしない

### 検証環境

- Windows 10 Pro, 64bit Version 2004 ビルド 19041
- Python 3.8.4
- ChromeDriver 83.0.4103.39 (ccbf011cb2d2b19b506d844400483861342c20cd-refs/branch-heads/4103@{#416})
- selenium.version 3.141.0
    - [seleniumのバージョン確認方法](https://askubuntu.com/questions/261499/how-do-i-check-the-version-of-the-selenium-api-installed)

### send_keys、execute_scriptをそれぞれ使ったサンプル

[【Selenium】SendKeysの文字入力が遅いときは『executeScript』で入力すると一瞬 \| シラベルノート](https://srbrnote.work/archives/3025)を参考にしました。

```python:<NG>send_keysをつかう（文字化けするパターン）
el = driver.find_element_by_id('target_id')
el.send_keys('ﾓｼﾞﾊﾞｹ ｼﾏｽ')
```

```python:<OK>execute_scriptをつかう（文字化け回避できる）
driver.execute_script(
  'document.getElementById("target_id").value="%s";' %
  'ﾓｼﾞﾊﾞｹ ｼﾅｲ!'
)
```


### 半角カタカナが文字化けする理由について見つかった記事

深堀りして調べておりませんが、IEのWebDriverはパッチを当てられると書いてありますね。ChromeDriverはレポジトリが公開されていなさそう。

- [2019/05の記事][【Selenium】半角カタカナがWindowsで文字化けするときの対処法 \| エンジニアの眠れない夜](https://sleepless-se.net/2019/05/16/selenium-windows-input-hankaku-kana-error/)
- [2013/09の記事][Selenium WebDriver \- SendKeys で半角カナを入力する : @jsakamoto](https://devadjust.exblog.jp/19710089/)
【Visual Studio】ビルド時に発生するエラーの解消法

コードを開いた際にいきなり、下記のエラーが発生。
それに対して対して調べて出てくる内容は一通り検証。
その結果1つだけ解消できた内容があったので書き残しておく。

```
エラー：CS0006 メタデータ ファイル：参照ファイルのパス/参照ファイル名.dllが見つかりませんでした。
エラー：LC.exe コード-1を伴って終了しました。
```

1．Visual Studioを閉じる。
2．対象プロジェクトのbinフォルダとobjフォルダを削除
3．対象プロジェクトのPropertiesフォルダにあるlicenses.licxをテキストエディタで開き、内容をすべて削除(ファイル自体は残しておく)
4．Visual Studioを開いて下記の内容の順に実行
　・ビルトメニューから「ソリューションのクリーン」
　・ビルドメニューから「ソリューションのリビルド」

参考サイト：https://kb.jp.infragistics.com/?p=955



-*作業環境*-
OS:Windows10 64bit
IDE：Visual Studio 2015
保存されている関連モデルを検索したい時(has_one, has_many, belongs_to)

## これ何

rails consoleから対象モデルに対して、保存されている関連モデルを検索したい時がある。
簡単に検索できるmethodを書いたのでメモ。

## 検索用method
rails console内で以下のmethodを定義することで簡単に検索できる。
返り値として `name` を利用しているが、探したい情報に応じて、柔軟に拡張することができる。

```ruby
def search_has_one(resource)
  resource.class.reflect_on_all_associations(:has_one).select{ resource.send(_1.name) }.map{ _1.name }
end

def search_belongs_to(resource)
  resource.class.reflect_on_all_associations(:belongs_to).select{ resource.send(_1.name) }.map{ _1.name }
end

def search_has_many(resource)
  resource.class.reflect_on_all_associations(:has_many).select{ resource.send(_1.name).limit(1).present? }.map{ _1.name }
end
```

## 実際に使ってみる

関連が存在するレコードを簡単に検索することができる。

```ruby
employee = Employee.first
search_belongs_to(employee)
# => [:office, ...]
```

## 参考
- [[rails] Modelに紐づく関連テーブル名一覧を取得するメモ](https://qiita.com/uuchan/items/3771c8fc86d2aad0cad6)
SwiftUI に新規追加：セクション（グループ）内のコンテンツの表示・非表示に DisclosureGroup を使用

WWDC 2020で紹介された `DisclosureGroup` を使えば、SwiftUI コンテンツのセクション（グループ）の表示・非表示が行えます。

<img width="350" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/7f9fa75d-a092-2b5a-e2d4-70f08242b8f4.gif">

```swift
struct ContentView: View {
    
    @State var catMenuExpanded: Bool = false
    @State var dogMenuExpanded: Bool = false
    
    var body: some View {
        
        DisclosureGroup("私の猫たち", isExpanded: $catMenuExpanded) {
            Text("ネコノヒー")
            Text("ムギ")
            Text("レオ")
        }.padding()
        
        DisclosureGroup("私の犬たち", isExpanded: $dogMenuExpanded) {
            Text("アズキ")
            Text("マメ")
        }.padding()
        
    }
    
}
```

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">
【Kotlin】takeIfIsInstance的なことをする

よく忘れるのでググったときに出てくるよう残します。

# TL;DR
- `as?`（`Safe cast`）を使う

# やりたいこと
`Kotlin`の`Collection`には`filterIsInstance`という関数が用意されています。
例えば、以下のように使うことができます。

```kotlin
val list: List<Any> = /* 何らかのリスト */

// 素朴に書くと型チェック -> キャストで書くことになる
val filtered: List<String> = list
        .filter { it is String }
        .map { it as String }

// filterIsInstanceで書けば、スマートキャストが効く
val filtered: List<String> = list.filterIsInstance<String>()
```

一方、`takeIf`には、`filter`に対する`filterIsInstance`のような、`takeIfIsInstance`的なものは用意されていません。

```kotlin
val any: Any = /* 何か */

// 素朴に書いた場合
val str: String? = any.takeIf { it is String }?.let { it as String }

// こんな感じに書きたい
val str: String? = any.takeIfIsInstance<String>()
```

## 正解
`as?`を使うと以下のように書けます。

```kotlin
val str: String? = any as? String
```
祝！藤井聡太新棋聖 驚くべき勝率に隠された不利な状況をデータで読み解く

2020年7月16日、ついに藤井棋聖が誕生しました。私はあまり将棋が強くありませんが、明るいニュースがない昨今、棋聖戦の挑戦権獲得の前からどうなるか注目していました。

藤井棋聖になるまでの道のりで、多くの対戦がなされていますが、実は相当不利な状況で多くの勝ち星を挙げているのです。今回はそこをデータで考察してみましょう。

●公式戦の勝敗
まずは、藤井棋聖の、2016年度のデビューから棋聖獲得までに戦った公式戦の勝敗をまとめてみます。
<img width="298" alt="pic1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/da6c65d7-f4bf-114c-090f-93110d1dc1f1.png">
183勝34敗で、勝率84.3%と堂々たる成績です。プロ棋士では、たとえ1年間の成績でも80%以上の勝率を残すのは非常に難しいと言われています。

●先手、後手の割合
今度は、公式戦の先手（番）と後手（番）の割合を同様にまとめてみます。
<img width="293" alt="pic2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/53126856-a244-0f18-82d7-988ef2f3bc9b.png">
一般に将棋では、後手は先手に比べ若干不利だと言われています。棋士の先手後手は振り駒（歩を振り放ってランダムに決める方法）や、対局ごとに先手、後手、先手、後手・・というように先手、後手交互に指すケースがあります。ただ、ある程度対局数がある棋士であれば、先手と後手の割合は50%ずつになることが期待されます。しかし、**藤井棋聖の場合は、後手の割合が56%と非常に高いのです。**今回、棋聖を獲得した対局でも後手で勝利しました。


後手の割合が確率的に高いことを統計的に示すために割合の検定を行ってみます。帰無仮説を“後手の割合は50%である”、対立仮説を”後手の割合は50%より大きい”　としたときの仮説検定の結果を示します。
<img width="216" alt="pic3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/2b0fb807-6bab-8263-b32d-7be1bb8405f1.png">
検定のp値は0.0515です。有意水準を5%とするとぎりぎり有意ではないですが、ほぼ5%に近い値なのです。

ここで出てくるp値の0.0515（約5.2%）とは次の確率を表していることになります。

細工をしていない歩の駒（表と裏がでる確率が等しい）を217回投げて、そのうち121回以上裏（と金）がでる確率を示しています。どちらも同じ確率ででるのであれば、217回中その半分である108回か109回が期待される裏の枚数です。偶然121回以上も裏がでる確率は約5.2%で、非常に稀なことなのです。

今後さらに対局が増えれば、先手、後手の割合が等しくなっていくと思われますが、現時点ではかなり不利な環境で、高い勝率を残していることになります。

●先手/後手と勝敗の関係は
では、先手の勝率と後手の勝率を比較してみましょう。統計では2つのカテゴリ変数間の関係をみるときにクロス集計を行いますが、次のようなモザイク図を描くと視覚的にわかりやすく関係を考察できます。
<img width="240" alt="pic4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/10bc0eee-8333-6d5f-88f2-bcf0d5dc5f86.png">
縦軸が勝ち負けの割合を示しますが、これを先手/後手で分けて勝ち負けの割合を表しています。
横軸は先手と後手のデータ数の割合に比例して幅を決めています。先に示したように藤井棋聖は後手が多いので、後手の幅が先手の幅に比べて広くなっています。

縦軸でみると赤色の棒の長さが勝ちの割合を示しますが、先手の勝率は87.5%、後手の勝率は81.8%で、その差は約5.7%です。藤井棋聖も例外なく、先手の勝率が良いのです。藤井棋聖が得意としている角換わりの戦法は先手が有利だと言われていますので、納得のいく結果です。

対戦相手の強さなども考慮すべきなので単純には言えませんが、もし後手の割合がほぼ対等である50%であったのであれば、もっと勝率は高くなっているのかもしれません。

●年度別に後手の割合と勝率を見てみると
今度は、年度別に後手の割合と勝率をみるために、グラフを描いてみます。2016年度は藤井棋聖のプロデビューの年ですが、対戦数が少ないため、2016年、2017年で1つのカテゴリにまとめています。

棒グラフ（青色）：年度ごとの勝率を表します（左軸）。
折れ線グラフ（赤色）：年度ごとの後手の割合を示します（右軸）。後手の割合が50%のところに参照線を引いています。
<img width="374" alt="pic5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/83ace185-5399-fbe8-c54d-f19b0822eeb3.png">
折れ線グラフから2019年度までは後手が非常に多かったことがわかります。特に2018年度は後手の割合が約66%であり、3回中2回は後手という不運さです。それでも、どの年度もコンスタントに高い勝率を残しているのが、素晴らしいです。2019年度の後手の割合は約52.3%とその前の年より割合は低くなっていますが、タイトル戦の本戦や挑戦者決定戦に出場して強い棋士と当たるようになり、若干勝率が落ちていますが、80%以上をキープしているのはさすがです。

2020年度は、さらに強い棋士と当たる回数が増えてくるでしょう。その中で、高い勝率を残せるのかは注目ですが、後手の割合がどうなるのかも注目です。

次回は、対局時間も含めて勝敗を調べてみます。

つづく


■	さあ始めよう！
JMPの全機能を30日間試せるトライアル版で、データからさらなる情報を導き出せることを実感してください。
さあ始めましょう。

ダウンロードは[**コチラ！**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)

■	JMPについて
JMP（ジャンプ）は世界中のエンジニア、データアナリストに選ばれているインタラクティブで可視的なデータ分析ツールです。

＜ SNSで様々な情報をお届けしています ＞
[**Facebook**](https://www.facebook.com/JMPjpn)
[**Twitter**](https://twitter.com/JMP_Japan)
Laravel の Notification の通知先を環境変数から設定する

[Laravel Notifications](https://laravel.com/docs/7.x/notifications) を利用すると簡単にメールや Slack などの通知機能を実装することができます。今回は小ネタとして、 Slack の通知先チャンネルを環境変数から設定する方法とその注意点について紹介します。

## TL;DR

- 専用の config ファイルを作成して環境変数から WebHook URL を読み込むようにする。
- 通知のジョブを処理するワーカーの実行環境をアプリと分離している場合でも、環境変数はアプリの実行環境に設定する。

## 実装

以下では EC サイト上で注文が作成された際に Slack の特定のチャンネルに通知するシチュエーションを想定しています。

まず Slack の通知先チャンネルの WebHook URL を取得するため、 [Laravel Configuration](https://laravel.com/docs/7.x/configuration#retrieving-environment-configuration) に従って設定を行います。設定ファイルは好きな名前で構いませんが、ここでは `config/slack.php` という名前にしてみます。

```php:config/slack.php
return [
    'orders_channel_url' => env(
        'SLACK_ORDERS_WEB_HOOK_URL',
        'https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx'
    ),
];
```

環境変数 `SLACK_ORDERS_WEB_HOOK_URL` が設定されていれば `orders_channel_url` にその値を設定しますが、設定されていない場合は `env()` の第二引数が使用されます。
ローカル環境や開発環境からの通知先として開発専用のチャンネルを作成し、その WebHook URL をデフォルトに設定しておくと便利です。

次に通知先の情報を持つ Notifiable クラスを作成します。[依存パッケージとして laravel/slack-notification-channel が必要](https://laravel.com/docs/7.x/notifications#slack-notifications)なので composer 等で事前にインストールしておいてください。

```php:notifiable
<?php

namespace Infra\Notification\Notifiable;

use Illuminate\Notifications\Notifiable;

class OrdersChannelNotifiable
{
    use Notifiable;

    private $slackWebHookUrl;

    public function __construct()
    {
        $this->slackWebHookUrl = config('slack.orders_channel_url');
    }

    public function routeNotificationForSlack()
    {
        return $this->slackWebHookUrl;
    }
}
```

`config('slack.orders_channel_url')` で先ほどの config に設定された WebHook URL が取得できるため、それが `routeNotificationForSlack()` の返り値となるようにします。

後は[ドキュメント](https://laravel.com/docs/7.x/notifications)や以下の記事などを参考に Notifications を構築していきましょう。

- [Laravel Notification をやさしく解説する \- Qiita](https://qiita.com/ikasama/items/de7c5aa8c6056b79adf3)
- [【Laravel】 通知に関する補足と拡張の手引き \- Qiita](https://qiita.com/mpyw/items/9d5874166add98d34d58#comments)

## 環境変数の設定先

アプリ側のレスポンスタイムの悪化を避けるため、 [Notification をキューに積む](https://laravel.com/docs/7.x/notifications#queueing-notifications)こともできます。
キューの利用に伴ってアプリ環境とワーカー環境を分離するインフラ構成を採用している場合でも、環境変数は `config('slack.orders_channel_url')` を実行して Notifiable インスタンスを生成するアプリ側に設定する必要があります。
ワーカー環境に環境変数を設定しても通知先チャンネルはデフォルトのまま変わらないので注意してください。
DataFrameなどの変数をpickleではなく、joblibで圧縮して読み書きする

大規模のDataFrameをpickleで保存というのを良くするのですが、
gitにアップするときにpickleだと容量の関係でpushできないことがありました。
そこで、joblibで圧縮してgitにもデータの管理をすることにしました。

pickleで保存と読み込む場合

```save_pickle.py

import pandas as pd
df = pd.DataFrame([1,2,3])
df.to_pickle('df.pickle')
```

```read_pickle.py
import pandas as pd

df = pd.read_pickle('df.pickle')
```

joblibで保存、読み込む場合はこちら。
compressで圧縮率を変えることができます。
圧縮しすぎると圧縮するにも読み込むにも時間がかかるので、
自分の場合は4が良さそうでした。

```save_joblib.py

import pandas as pd
import joblib

df = pd.DataFrame([1,2,3])
joblib.dump(df, 'df.joblib', compress=4)
```

```read_joblib.py
import pandas as pd
import joblib

df = joblib.load('df.joblib')
```
ruby serialportをWSL環境にインストールする

#WindowsのWSLでserialport gemを使おうとしたら盛大にハマったので備忘録。
serialport gemをインストールしようとしたときにコンパイルできない。

環境
Windows 10 WSL Ubuntu 20.04 LTS

とりあえずアップデート
```sudo apt update```

ruby-dev と build-essentialがserialportビルドに必要なようだ
```sudo apt install -y ruby ruby-dev build-essential```

serialportインストール
```sudo gem install serialport```

これで無事にインストールできた。
AWS IVS をやってみた

streampack の Tanaka です。

つい先日に Amazon Interactive Video Service(IVS)が発表されました。

IVSとは、**マネージドなライブ配信ソリューション** + **インタラクティブな動画体験**を提供するサービスです。

数ステップでライブ配信チャンネルの作成から視聴までできるのが、プロ向けである AWS Media Services と比べると、魅力なサービスの一つとなっております。

インタラクティブな動画体験の具体的な詳細・実装方法はドキュメント見る限りだと現時点ではなさそうですが、下記のようなことがドキュメントで提供されております。

- ライブチャット
- 投票
- eコマース商品への誘導
- リアルタイム質疑応答

https://aws.amazon.com/jp/ivs/

今回は配信から視聴までの簡単さを共有させていただきます。

## 配信設定

### ステップ1 - チャンネル作成

まずは、配信のセットアップのために、チャンネルを作成します。

![スクリーンショット 2020-07-17 9.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/24a2dd15-4a32-9ee5-e487-4e58f3e57647.png)

### ステップ2 - ストリームを配信

ストリームキーと配信URLが払い出されます。
"ステップ3 - エンコーダーを使って配信" で使用するので、メモしておきます。

![Amazon_IVS_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/0e8ea98a-abc0-2baa-677f-4b487c2a1716.png)

### ステップ3 - エンコーダーを使って配信

今回は FFMPEG のソフトウェアエンコーダーを使って配信します。

```
$ ffmpeg -re -stream_loop -1 -i ~/Desktop/story-for-sample.mp4 -vcodec copy -acodec copy -flags +loop-global_header -f flv "rtmps://xxxxxxx.global-contribute.live-video.net/app/sk_us-east-1_ZRHXQE2Wfnws_I5rmxxxxxxNLBiiEEMWCbiLLNugoZ7k"
```

### ステップ4 - プレビュー

配信すると、"ライブストリーム"で視聴可能です。

![スクリーンショット 2020-07-17 9.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/f09c29db-bf1b-1b0d-8c46-40e769a8075b.png)

> （c）copyright 2008、Blender Foundation / www.bigbuckbunny.org

配信URLを直接Safariやプレイヤーに埋め込んでも視聴可能です。
わずか、5分足らずで配信セットアップから視聴までできました。

### オプション

![スクリーンショット 2020-07-17 9.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/af958cb2-9190-8a9a-56e0-b986d2aa7bf0.png)

その他の配信オプションとして、

- チャンネルタイプ
    - 最大フルHD
    - または最大SD
- 動画のレイテンシー
    - 超低レイテンシー
    - 標準レイテンシー

必要最低限のオプションで、動画配信初心者でも理解しやすいオプションになってます。ライブ配信で求められる、遅延対策の**超低レイテンシー**をサポートしているのが、IVSの魅力的な一つです。

### IVSプレイヤー

プレイヤーSDKも提供されております。

- iOS SDK
- Android SDK
- Web SDK

下記は Webベースのサンプルコードです。
広く普及しているVideoJSベースなので、しっくり来る方も多いかと思います。

https://codepen.io/amazon-ivs/pen/bdc01e977102051eae5fb85482f88276

### まとめ

IVSは手軽に配信したい場合は、Media Servicesに比べると絶対にオススメです。
今後は、インタラクティブな動画の詳細アップデートに乞うご期待です。
リモートワークを振り返って

## はじめに
コロナウィルスの影響でフルリモートワークが始まって約3ヶ月が経過しました。
日々の業務で気付いた良かったこと、課題など気づいたことを整理してKPTの形式でまとめてみようと思います。
KよりPTのほうが興味があると思うので、記載順はPT->Kの順にしました。
読んでみて、うちでは他のやり方で解決してるぞ！とかあれば教えてほしいです。

## 忙しい人向けのサマリー
 - コミュニケーションが減少しがちなので、機会を設けよう
 - ルーティーンを作って、公私を切り替えよう。
 - オンラインの会議にトラブルは付き物。それも含めた時間配分をしよう。
 - 途切れた音声などは遠慮せずに聞き直しましょう。無駄に時間を過ごすよりマシです。
 - web会議では発言者が孤独になりがちです。リアクションを取ってあげましょう。

## PROBLEM(課題) & TRY(解決策)
### **コミュニケーションの減少**
普段の何気ない雑談から仕事にまつわる連絡や質問まで、全てにおいてハードルが上がりました。
相手の状況が見えないから声をかけづらいし、ちょっとした連絡をするにもチャットでの連絡やweb会議の設定の設定などオフラインより手間がかかります。
 - **TRY**
 ・ランチミーティングやコーヒータイム(任意参加で休憩時間を揃えて雑談する)など、コミュニケーションを取りやすい環境を作る
 　仕事中に雑談をしようとするとハードルが高いので、それをするための場を設ける。そうすることで少しでも話しやすい空気を作れると思います。
 ・雑談をするためのチャットスペースをつくる。
 　オフラインでの雑談をこのスペースで再現できるようにする。社内twitterみたいな使い方ができると良さそう。

### **公私の切り替え**
いままでは出勤/退勤を行うことで生活のON/OFFを切り替えていました。それがなくなったことで仕事を始めるときにだらだらとしてしまったり、仕事が終わった後もちらっとslack見たりと仕事とプライベートの境界線が希薄になってしまいました。
 - **TRY**
 ・切り替えスイッチを作る
 　出勤/退勤に変わる切り替えるためのルーティンを作る。ex)着替え、散歩などなど。

### **会議がやりづらい**
web会議だとどうしても発言が途切れたり、映像がとまったりで会議の進捗が遅くなりがちです。また、ホワイトボードや付箋などアナログなツールが使えなくなったので、図を書いたり付箋で話を整理したりすることが難しくなりました。
 - **TRY**
 ・割り切る
 　映像や通話が途切れたりするのは避けられないです。進捗が遅れることも視野に入れた時間配分にしましょう。途切れて聞き取れない場合は遠慮せずに聞き直しましょう。内容を把握的ないまま時間を過ごすほうが無駄です。
 ・ツールを使う
 　ホワイトボードや付箋などはツールがあるのでそれに置き換える。スプレッドシートやwebex teamsのホワイトボード※など。  

**※webex teamsのホワイトボードのサンプル**
<img width="1440" alt="スクリーンショット 2020-07-17 9.01.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645177/65fb1f85-be85-2f23-0640-4bb6a6e646f0.png">

### **発言に気を使う**
どうしても会話ではなく、文でコミュニケーションをすることが増えるため表現に気を使います。文章は対面で話すよりも得られる情報が少ないため、受け手に伝わらなかったり、誤解を与えてしまうことがたまにあります。
 - **TRY**
 ・勢いや流れで発言しない
 　文は基本的に攻撃的になりがちです。書いた後にすぐ送るのではなく、ほかの表現がないかなど文を見直してから発言する癖をつける。
 ・絵文字やリアクションを積極的に使う
 　文では感情を表現しにくいので、絵文字やリアクションでそれを表現する。そうすることで相手により情報を伝えることができる。

### **会議での発言中に孤独感を感じる**
 WEB会議中はノイズが乗ると迷惑なので、喋る人以外マイクをミュートにすることが多いと思います。それにより発言者が聞いている人のリアクションをもらえず孤独に陥ってしまいます。
  - **TRY**
  ・リアクションをとる
  　カメラを付けていい場合はカメラを付けて、うなずいたり大げさにリアクションを取ったりすることで話し手に伝える。
  　カメラをつけれない場合は、チャットなどを用いて発言に対する反応をしてあげる。

## KEEP(良かったこと・継続したいこと)
### **出勤時間が0になる**
辛い満員電車に長い時間揺られることがなくなったことで、ストレスが大分無くなりました。長時間通勤してる人にとっては大きいメリットだと思います。

### **勉強会の参加がしやすくなる**
移動時間や開催場所にとらわれることが無くなるため比較的参加しやすくなりました。あと、会場の人数制限にも縛られなくなったのも大きいです。

### **仕事に集中しやすい**
周りから割り込みで仕事を依頼されることが減るため、自分が集中している状態を維持しやすくなったと思います。
tensorflowで躓きました。

#tensorflowを使用しようとしたら
tensorflow超絶初心者です。
間違いがあればズバッとご指摘お願いいたします。

バリデーションを行うために、まずはネットで調べて出てきたバリデーションをするためのコードを参考にしようとしたところ

```python
tf.Session()
```
を呼び出した際にattribute errorとなった。

#エラーの原因
調べた結果、tensorflow2.0のアップデートに伴うものと出てきました。

#そもそも何を行うメソッドか？
セッションを行うためのメソッドらしい
>セッションとは
https://wa3.i-3-i.info/word1791.html







#そもそもセッションっているの？
基本的にはバッチ処理に必要らしい。
>TensorFlowのセッションとは、構築されたデータフローグラフの演算処理を実際に行うランタイムへのクライアントのことだ。https://www.atmarkit.co.jp/ait/articles/1804/20/news131.html

#結局のところ
バッチ処理のメリットは
>大規模データを効率的に処理
リアルタイム処理ではインタラクティブなデータ処理は可能でも、大規模なデータを処理するのには向いていません。
基本的にオペレーターが逐一データを打ち込む必要があるため、作業的にかなり非効率となります。imkk.jp/blog/what-is-batch-processing.html

となっており、効率性を求めないのならば<strong>必要ない</strong>のかなと考えました。

#ちょっとここからは話がそれます

#データフローグラフにおける評価
データフローグラフを評価する際にはrunメソッドを使うのですが、
サイトを見てもrunメソッドは見つからず。。
データフローグラフを評価するには以下の方法が適切かも？
>学習済みモデルの評価: Model.evaluate()https://note.nkmk.me/python-tensorflow-keras-basics/
WifiなしのデスクトップPCをMAC経由でテザリングでネット接続する方法

#忘備録として

以下の状況から急遽テザリングが必要になるのだが、たまにしか使わないのでよく忘れる。

- ネット環境が整備されていない現場のPCで、メンテナンス時にどうしてもネット接続が必要なことがある。
- デザリングができるスマホはiPhoneしかない。
- PCにiTuneはインストールできない。

###必要なもの(各1ずつ)
- ネット接続したいデスクトップPC
- MAC Book Air
- iPhone
- Lightning ケーブル
- USB-Ethernet アダプタ
- LANケーブル

MACとiPhone7 を USB-lightningで接続。
MAC - USB-Ethernet変換- PC　を接続

あとはMAC上で設定するだけ。

![スクリーンショット 2020-07-17 午前10.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/99a32c73-84a9-c8ec-d31e-1085432739f5.png)

![スクリーンショット 2020-07-17 午前9.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/3663aa78-9034-0f55-793a-12a3a457cb88.png)

![スクリーンショット 2020-07-17 午前9.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/d05beb1e-a576-97f5-146d-7125a8bc140c.png)

![スクリーンショット 2020-07-17 午前9.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/7c9afd1d-35d0-95f8-226c-0043afa3033e.png)

![スクリーンショット 2020-07-17 午前9.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/d2d2abe9-2fa5-4a9b-435a-aefbbd1a72a2.png)

これでテザリング開始。
次はMACのルーター化。

![スクリーンショット 2020-07-17 午前10.04.09 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/8962e78a-7cc9-874a-1774-6b0d71010f47.png)

![スクリーンショット 2020-07-17 午前10.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324061/1e6d2b14-e42e-d2c3-9170-fba5c06ccc1d.png)

以上！
【jQUery】 jQuery ドロップダウンメニュー　表示　マウスホバー時

##【ゴール】
下のような、マウスがホバーした際に表示されるボタンを作成

![画面収録 2020-07-17 10.09.25.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/29e21725-3c67-adda-80c1-1f4703e2cd91.gif)


##【メリット】
■　UXの向上
■　jQUey理解度向上


##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

##【実装】

####html
＊「id="open_menu"」を付与
＊「id="menu"」を付与,「style="display: none;"」で非表示に

```html:hoge.html.erb
<div id="open_menu">
  <h2>logolog</h2><br>
  <div id="menu" style="display: none;">
    <%= link_to "logologとは", homes_about_path, class:'btn btn-primary' %>
    <%= link_to "会員登録", new_user_session_path, class:'btn btn-primary' %>
    <%= link_to "お問い合わせ", homes_inquiry_path, class:'btn btn-primary' %>
  </div>
</div>
```

####js
＊（#open_menu）がhoverしたときに発火
＊「fadeToggle」は隠れたり、現れたりするメソッド

```js:hoge.js
$(function () {
  $('#open_menu').hover(function () {
    $('#menu').fadeToggle();
  });
});
```

以上

##【合わせて読みたい】

■ 【jQuery】初心者でもよく理解できたやつ
https://qiita.com/tanaka-yu3/items/a03734b248c3f2ee8461

■ 【jQuery】　scroll スクロールすると浮き上がってくるやつ　はじめました。
https://qiita.com/tanaka-yu3/items/9a66c4c0e058291694dd

■ 【jpostal】　jQuery　住所自動入力　rails おそらく一番簡単な方法で
https://qiita.com/tanaka-yu3/items/e5403e717e3ee3c3f64e
QR コードをコマンドライン上にサクッと表示する

## 最終イメージ

`qr` コマンドで任意の文字列を QR コードに変換して表示できるようになります。

<img width="461" alt="Screen Shot 2020-07-17 at 9.51.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551568/2b31dd50-c79f-0aa2-c5c2-65b13ef30f57.png">

## 準備

### 前提条件

`pip` コマンドが利用できる事を前提とします。
https://pypi.org/project/pip/

### qrcode インストール

利用するパッケージはこちら
**qrcode**
https://pypi.org/project/qrcode/

`pip` でインストールします。
画像ファイル書き出しのために、 **pil** ([Pillow](https://pypi.org/project/Pillow/)) も同時にインストールします。

```shell
pip install qrcode[pil]
```

## 実行

ターミナルで下記のようなコマンドを実行すると、すぐに QR コードが表示されます。

```shell
qr 'Hello, World!'
```

`>` の後にファイル名を指定すると、画像データとして書き出すことができます。

```shell
qr 'Hello, World!' > qr.png
```

## おわりに

便利な Web サービスなども多くありますが、利用を少しためらうシーンはありませんか？
そんなときに手元でサクッと生成できる手段を持っておくと開発時や動作確認時にとても便利です。
SHA-1、SHA-2、SHA256が結局なんなのかわからないので調べた

SHA-1、SHA-256はGoの標準パッケージにも入っています。存在は知っていたものの得体が知れなくてスルーしていたのですが、セッションを理解する上で避けては通れなくなってしまったので調べてみました。


##SHA-1、SHA-2、SHA-256とは
~~サーバ証明書が正規のものであるかをチェックする際に用いるハッシュ関数のことです。~~(7/17修正)
ハッシュ値を生成するハッシュ関数のことです。様々なことに利用されています。例えば任天堂のWiiでは起動時の署名にSHA-1が使われていたり、サーバ証明書が正規のものであるかをチェックする際に用いられたりもしています。（関連→[SSLサーバ証明書がChromeで見れた！](https://qiita.com/souhub/items/5b27a807f8b08f04c92f)）
ちなみにハッシュ関数とは入力した値に対してアルゴリズムを実行し、異なる値を出力する関数のことです。

##SHA-1、SHA-2、SHA-256の違い
Goの標準パッケージをみていて、「どうしてSHA-1ともうひとつが256？？」とずっと謎でした。その謎がやっと解けました。
###SHA-1とは
SHA-1とは、160ビットのハッシュ値を生成するハッシュ関数です。
詳細は以下です。
>SHA-1はアメリカ国家安全保障局が考案し、1995年から米国政府の標準として使用されているハッシュ関数です。任意のデータから160ビットのハッシュ値を生成します。
SHA-1はこれまで広く使用されてきましたが、衝突に関する脆弱性が発見されたため、より安全なハッシュ関数を使うことが推奨されています。
2017年、GoogleがSHA-1でハッシュ値が衝突する事例を発見したため、SHA-1で暗号化されたデータであっても悪意のある第三者がすり替えて攻撃できることが明らかになりました。


###SHA-2とは
224、256、384、512ビットのハッシュ値を生成する関数です。SHA-1よりセキュアとされています。
詳細は以下です。
>SHA-224、SHA-256、SHA-384、SHA-512の4つのバリエーションが存在し、それぞれ224、256、384、512ビットのハッシュ値を生成することができます。SHA-1よりもビット数が多いため、より多くのハッシュ値を生成することができ、それだけ衝突の可能性が低くなります。
引用元：https://tech-camp.in/note/technology/44817/

つまりGoの標準パッケージに入っているSHA-256はSHA-2のうちの一つということです。よくGoのcryptoパッケージを見たらSHA-224、SHA-384、SHA-512も入っていました。

##SHAで実際に暗号化させてみる
Goのcryptoパッケージを使って実際に「Hello World」を暗号化させてみたいと思います。
せっかくですので、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512の全種類で変換させてみます。
コードは以下です。

```go:main.go

package main

import (
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"fmt"
)

func main() {
package main

import (
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"fmt"
)

func main() {
	s := "Hello World"
	b := []byte(s)

	sha1 := sha1.Sum(b)
	sha224 := sha256.Sum224(b)
	sha256 := sha256.Sum256(b)
	sha384 := sha512.Sum384(b)
	sha512 := sha512.Sum512(b)

	fmt.Println(sha1)
	fmt.Println(sha224)
	fmt.Println(sha256)
	fmt.Println(sha384)
	fmt.Println(sha512)
}



    //　　結果
    //   ==>[10 77 85 168 215 120 229 2 47 171 112 25 119 197 216 64 187 196 134 208]
	//	    [196 137 15 175 253 176 16 93 153 26 70 30 102 142 39 102 133 64 27 2 234 177 239 67 114 121 80 71]
	//	    [165 145 166 212 11 244 32 64 74 1 23 51 207 183 177 144 214 44 101 191 11 205 163 43 87 178 119 217 173 159 20 110]
	//	    [153 81 67 41 24 107 47 106 228 161 50 158 126 230 198 16 167 41 99 99 53 23 74 198 183 64 249 2 131 150 252 200 3 208 233 56 99 167 195 217 15 134 190 238 120 47 79 63]
	//	    [44 116 253 23 237 175 216 14 132 71 176 212 103 65 238 36 59 126 183 77 210 20 154 10 177 185 36 111 179 3 130 242 126 133 61 133 133 113 158 14 103 203 218 13 170 143 81 103 16 100 97 93 100 90 226 122 203 21 191 177 68 127 69 155]
```
こうみるとSHA-512の長さが際立っています。

##次世代ハッシュ関数SHA-3
既に次世代ハッシュ関数のSHA-3が決まっています。SHA-3はSHA-1tpSHA-2とは異なる内部構造を持っており、セキュリティの向上が期待されています。
将来的にSHA-3に移行が進むとみられています。

##参考

- [Quita  【Go】文字列のハッシュ値を取得(SHA, MD5,RMD160)](https://qiita.com/kou_pg_0131/items/4ea1af8320bec60dd2f6)
- https://golang.org/pkg/crypto/
- https://tech-camp.in/note/technology/44817/
【ふくだ学習録】インフラエンジニア教本-ネットワーク構築技術解説- part4【54日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本

#### 技術系
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)
[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/dp/4798052582/ref=cm_sw_r_tw_dp_U_x_zzeyEbJBSQ5Y0 )
[サーバ/インフラを支える技術](https://www.amazon.co.jp/dp/4774135666)


#### ビジネス系
[サブスクリプション](https://www.amazon.co.jp/dp/B07HY1TND9/ref=cm_sw_r_tw_dp_U_x_lp4NEb3EEGD7Y)
[Running Lean ―実践リーンスタートアップ](https://www.amazon.co.jp/dp/4873115914/ref=cm_sw_r_tw_dp_U_x_UsMREbV6Y41Y8)
[amazon 世界最先端の戦略がわかる](https://www.amazon.co.jp/dp/4478105057)
[Lean Analytics ―スタートアップのためのデータ解析と活用法](https://www.amazon.co.jp/dp/4873117119)
[ピーター・ティール 世界を手にした「反逆の起業家」の野望](https://www.amazon.co.jp/dp/4864106010)
[Airbnb Story 大胆なアイデアを生み、困難を乗り越え、超人気サービスをつくる方法](https://www.amazon.co.jp/dp/4822255190)
[ユダヤの商法](https://www.amazon.co.jp/dp/4584139008)
[How Google Works](https://www.amazon.co.jp/dp/4532198348)
[イシューからはじめよ](https://www.amazon.co.jp/dp/4862760856)
[ピクサー流　創造するちから](https://www.amazon.co.jp/dp/4478016380)
[ストーリーでわかる財務３表超入門](https://www.amazon.co.jp/dp/4478015619)


### 今読んでいる本
[インフラエンジニア教本 ~ネットワーク構築技術解説](https://www.amazon.co.jp/dp/4774170348)

# 第1章 DHCPサーバーの教科書

### KickStartとは
KickStartは、RHELやFedoraのインストーラである「Anaconda」が提供する機能。
GUIで設定項目を入力する代わりに、テキストファイル（KickStartファイル）に設定項目を記載しておくことで、インストール処理を自動化できる。

ここにPXEブートと組み合わせることで、新しく購入したサーバをネットワークに接続するだけで、OSインストールが開始される。

### PXEブートとは
インターネット経由で、OSインストールすることができる機能。
サーバに搭載されたNIC（ネットワークカード）自身が持つ機能で、インストーラと連携する。
[初めてのPXEブート](http://lab.astamuse.co.jp/entry/2018/10/24/160000)

### tcpdumpとは
ネットワーク通信の生のデータをキャプチャし、その結果を出力してくれるキャプチャツール。
[超絶初心者むけtcpdumpの使い方](https://qiita.com/tossh/items/4cd33693965ef231bd2a)

### スマートフォンのIPアドレス
スマートフォンのIPアドレスは、プライベートIPアドレス。
通信事業者のネットワーク内でIPマスカレード処理を行なってから、インターネットへ接続される。

# 今日の一言
なかなか進まん！もっと早よ起きよ！
JupyterでCrystalを動かすICrystalの紹介

## はじめに

JupyterでCrystalを使えるカーネルがようやく登場しました。
[ICrystal](https://github.com/RomainFranceschini/icrystal)は2020年に登場した新しいJupyter kernelです。内部では[icr](https://github.com/crystal-community/icr)を使用しているようです。

Githubのリポジトリ

* https://github.com/RomainFranceschini/icrystal

作者はイタリアのコルシカ島在住のようです。

## インストール

公式のREADMEと同じです。2020年7月時点での情報を日本語でも記載しておきます。

### 依存

  * Jupyter
  * ZeroMQ

ZeroMQがきちんと導入できていることが大事です。詳しくは [zeomq-crystal](https://github.com/crystal-community/zeromq-crystal) を参照ください。

順番にコマンドを打ち込んでいきます。

```sh
git clone https://github.com/RomainFranceschini/icrystal.git
cd icrystal
shards install
shards build
bin/icrystal register
```

最終的に下のように表示されたら完了です。



`Registered ICrystal at /home/kojix2/.local/share/jupyter/kernels/crystal`

## 実行

```
jupyter lab
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/c5f56ab0-27c9-6941-156b-65ee179d9669.png)

この記事は以上です。