OmniAICreator/Qiita-1.07M huggingface dataset:
[Markdown]私だってわかりやすくqiita投稿したい！[リッチなスニペット編]


#目的

自分のQiitaの読みづらさに　憤　慨　
みなさまのように、ファイル名が明記してあり、一回でコピーができ、色わけもしてあるMarkdown記法を覚える話😤

#今日やること

[こちら](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)を参考にさせていただき、下記でqiitaをかけるようになる。
<img width="791" alt="Screen Shot 2020-07-15 at 20.58.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/b829b8e7-2f4d-635b-7c03-fe9d4d42f1dc.png">

#リッチなスニペットの書き方

下記のように書いているとのこと。
>(空行)
```ruby:qiita.rb
puts 'The best way to log and share programmers knowledge.'
```
(空行）

言語名:qiita.jpとあり、
言語名によりシンタックスハイライト（色などが変わる）できるみたい😎

```javascript:qiita.js
console.log('シンタックスハイライトさん！こんにちは！')
```
```ruby:qiita.rb
console.log('シンタックスハイライトさん！こんにちは！')
```

シンタックスハイライト対応可能言語は[こちら](https://qiita.com/Qiita/items/e84f5aad7757afce82ba)をご確認ください。

よし、できました🙌🙌
ReactDOM.createPortalでモーダル作ったけど、モーダルが閉じない・stateが変わらない

```jsx
  private openModal(): void {
    this.setState({ modalVisible: true });
  }

  private closeModal(): void {
    this.setState({ modalVisible: false });
  }

  render(){
    return (
      <div onClick={this.openModal}>
        <div>モーダルを開く</div>
        { this.state.modalVisible && <Modal closeHandler={this.closeModal} /> }
      </div>
    );
  }
```

# 現象
`closeHandler`として`this.closeModal`を設定している`Modal`で`closeHandler`を実行しても、
モーダルが閉じなくて、
よく見てみたらstateの値が変わらなかった

# 原因
`Modal`が`<div onClick={this.openModal}>`の要素だから、
`Modal`の`closeHandler`で`this.closeModal`実行時に
`<div onClick={this.openModal}>`の`this.openModal`も実行されて、
stateが
（元々）true →（closeModal実行）false →（openModal実行）true
と変化して結局元々の値から変わらないように見えていた

# 修正後のコード
`onclick`を仕込んだ配下に`Modal`を置かないようにした

```jsx
  render(){
    return (
      <React.Fragment>
        <div onClick={this.openModal}>
          <div>モーダルを開く</div>
        </div>
        { this.state.modalVisible && <Modal closeHandler={this.closeModal} /> }
      </React.Fragment>
    );
  }
```

# 後記
色々実験して1時間半ハマった
`closeModal`にalertを仕込んで、実行されていることを確認したけど、`openModal`にも仕込めばすぐわかったのにと反省
【Laravel】バリデーションルールの作成

この記事は以下の書籍を参考にして執筆しました。


- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


#バリデーションルールの作成
```php5
php artisan make:rule Myrule
```

`app/Rules/Myrule.php`に作られる。

```php5:app/Rules/Myrule.php
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Myrule implements Rule
{
    public function __construct()
    {
        //
    }
    public function passes($attribute, $value)
    {
        //
    }
    public function message()
    {
        return 'The validation error message.';
    }
}

```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


|メソッド|説明|
|---|---|
|passes|ルールの通過条件|
|message|問題発生時のメッセージを返す|

passesの引数は以下2つ

- $attribute(ルール属性をまとめたもの)
- value(チェックする値)

passesの戻り値はこちら

|戻り値|説明|
|---|---|
|true|問題ない|
|false|エラー|

##Myrulesの使用

HelloRequestクラスのruleメソッドを修正

```php5
'age'=>['numeric'z,new Myrules(5)]
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)
プルリクする時に画像を50%幅にしたりtableで表を作ったりするやつをSaved repliesに保存しとくとショートカットで呼び出せて捗ります

プルリクする時に画像を50%幅にしたりtableで表を作ったりよくやると思いますが、それをSaved repliesに保存しとくとショートカットで呼び出せて捗ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30423/c123c25e-09e9-21f8-192c-a3e61b060bcd.png)

▼設定はこちらから
https://github.com/settings/replies
Rubyでちょっとずつポーカーを実装する その2

#その2の流れ
前回の記事　[その1](https://qiita.com/paraizo2424/items/23f5ab031dbda184ce9d)へ

その2開始
プレイヤーはいらないカードを選択して捨てる。
ディーラはー捨てた枚数だけ補充する
終了

#カードの選び方
player.showを少し改良してカードに番号をつけたものを表示する。
プレイヤーは半角スペース区切りで捨てるカードを入力する。
playerインスタンスのhands配列から選択されたカードを~~消去する~~nilに変更する。
playerは消去された枚数のカードをディーラーに配るように要求する。
ディーラーは要求された枚数のカードをディーラーはデッキから取ってプレイヤーに渡す。
終了

#その2のコード
https://github.com/paraizo2424/poker_game/tree/a5331caa1a828ff5dc6f3b37ec381900936c5a46

#次回
[その3](https://qiita.com/paraizo2424/items/6187b5b6cd7c7ebc6eca)へ
Install docker on Fedora31

![docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260235/972bda2a-622d-4d77-8097-62dc79f6819a.png)


## Overview
開発用サーバにDockerを入れたので、その際の作業メモ
（公式ドキュメントに従えば基本問題ない）

## Docs
Docker: https://docs.docker.com/engine/install/fedora/
Docker Compose: https://docs.docker.com/compose/install/#install-compose-on-linux-systems

## How to install docker

```
$ sudo dnf -y install dnf-plugins-core  
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
$ sudo dnf install docker-ce docker-ce-cli containerd.io
$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
$ reboot (再起動)
$ sudo systemctl start docker
$ sudo docker run hello-world
```

以下が表示されればOK

```
Hello from Docker!
...
```

Docker をブート時に自動起動するには

```
$ sudo systemctl enable docker
```

sudoなしで使用するには

```
sudo usermod -aG docker [YOUR-USER]
```

## How to install docker compose

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

ここでpythonがないと言われたので

```
$ sudo dnf install python
```

してから、以下を実行しなおし

```
$ sudo chmod +x /usr/local/bin/docker-compose
```

---

なんや、簡単やん。
（なんだー、簡単じゃん。）
Rubyでちょっとずつポーカーを実装する その1

#Rubyでポーカーを実装したい
Rubyが少しずつわかってきたので、なにか動くプログラムを作成したいなと思い立ってはじめました。とにかく動くことを重視して書いていきます。何かおかしな部分や普通はこうするべきでは？というアドバイスがありましたらコメントください。

#完成形
ドローポーカー
数人のプレイヤーが卓に座ると、ディーラーが5枚のカードを配り、カードチェンジを1回して、役の勝敗を競う。

#その1のゴール
ディーラーがやってきて、カードを配って、プレイヤーがカードを5枚もらう。

#準備
トランプは4種類のスートと13枚のカードの計52枚、JOKERは入れない。
カード1枚1枚は連想配列{suit: ❤︎, num: 4}で保存する。

#流れ
ゲームスタート
その1〜
ディーラーがデッキをシャッフルして準備する。
ディーラーがデッキを上から5枚のカードをプレイヤーに渡す。
プレイヤーはディーラーからカードを受け取る。
その1〜
ゲーム終了

#クラスを抜き出してみる
ディーラー、デッキ（トランプの山札）、プレイヤー

#クラスの振る舞いを書き出してみる
ディーラーがデッキを準備する Dealer.initialize(Deck.new)
ディーラーがデッキをシャッフルする Dealer.shaffle
ディーラーがカードをプレイヤーに渡す Dealer.deal(Player, 枚数)
プレイヤーは手札に受け取ったカードを保存する Player.initialize(hands)
プレイヤーの手札を画面に表示する Player.show

#その1のコード
https://github.com/paraizo2424/poker_game/commit/850e102e661605787db6a853447c342e693807d4

#次回
[その2](https://qiita.com/paraizo2424/items/10c4a2576a53e655aef9)
docker buildでInsufficient space in download directoryが出た場合の解消方法

# 結論

```
$ docker system prune -a
```
で全ての不要なデータを消せばいい。

## 調べてわかったこと

散々調べたが、「docker Insufficient space in download directory」とかでググると

```
$ docker rm `docker ps -aq`
```
でコンテナ消せとか、

```
$ docker images | awk '/<none/{print $3}' | xargs docker rmi
```

で止まっているイメージ消せばOKとか、

```
$ docker images | awk '{print $3}' | xargs docker rmi
```

で全部のイメージ消せば完璧とか書いてあるが、これだとdocker psやdocker imageで出てこない不要なデータは消せない。

そもそも、dockerはbuild時にローカルのボリューム（60GBらしい）をマウントして、そこでインストールしたファイルやらを保存するので、例えローカルマシンに1TB空きがあろうがマウントした60GBがいっぱいになるとbuildが出来なくなる。
しかも、この60GBが使い回しなので、消せないファイル（コンテナだったりイメージだったり）が積もっていくとある日突然buildが出来なくなるということらしい。

なのでマウントする60GBを増やすのではなく、不要なデータは定期的に削除するようにしないといけない。

## 参考URL
この回答に救われました↓
https://stackoverflow.com/questions/37645879/how-can-i-fix-docker-mac-no-space-left-on-device-error

コマンドさえわかれば詳しく書いているページも結構ある↓
https://qiita.com/ksato9700/items/b0075dc54dfffc64b999
Flutterで作ったAndroidをインストールしようとすると、INSTALL_FAILED_VERSION_DOWNGRADと出て元のアプリデータが引き継げない

今既存のアプリをリニューアルする対応をしているのですが、
既存のアプリをインストールした状態でFlutterで作ったリニューアル版をインストールしようとすると
`Failure [INSTALL_FAILED_VERSION_DOWNGRADE]`
と表示され、元のアプリのデータが引き継げませんでした。
iOSの方は問題なく上書き、データの引継ぎはできているのに・・・。

元々の入ってるバージョンよりも低いバージョンになるよ！と言うエラーであることもわかっているのですが、
pubspec.yamlのバージョン指定も
`version: 5.0.0+1`
となっていて、問題なさそう。

build.gradleの指定も、

```gradle:build.gradle
android {
(省略)
    defaultConfig {
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
}
```
となっているし、バージョンを直接指定しても同じエラーが発生する。
コマンドで直接アプリをインストールしても変化なし。

※余談　コマンドの指定は
`adb install -r <アプリのパス.apk>`
ダウングレードを許容する場合には
`adb install -r -d <アプリのパス.apk>`
で行けます。

ダウングレードとエラーが出ている状態でも、
既存のアプリをアンインストールしてインストールすれば、
また上記コマンドを使用すれば、インストールできますが、
それだと、既存アプリのデータは引き継げず、全て消去されてしまいます。

万策尽きて、積んだ・・・！と思っておりましたが、
調べまくってとうとう鶴の一声を見つけて・・・！

>
INSTALL_FAILED_VERSION_DOWNGRADE
これは、エミュレータに既にインストールされているアプリと同じpackageNameのアプリをインストールしようとしているが、インストールしようとしているアプリのversionCodeが低い（バージョン番号の整数値）ことを意味します。

**versionCode**だと・・・！？
既存アプリのversionCodeを確認すると、34・・・orz
こっちかーーーーーーーーーーーーーーい！
思わず叫びそうになりました。

pubspec.yamlのバージョン指定を
`version: 5.0.0+35`
にすることで、無事にINSTALL_FAILED_VERSION_DOWNGRADEのエラーはなくなり、無事に上書きインストール、データの引継ぎはできました^^

参考：https://stackoverflow.com/questions/13808599/android-emulator-installation-error-install-failed-version-downgrade
【rails　バージョン管理】　rails バージョン　ダウングレード　

##【あらすじ】
いきなり、rails new が効かなく、固まった。。。。

```mac.terminal
Fetching sassc 2.4.0
Installing sassc 2.4.0 with native extensions
```
上記の箇所で固まって進まない。。。なぜ。。。

##【原因】
####railsのバージョンアップグレードをした為

##【解決法】
調べてみる解決法は、たくさんあるのですが、
私は**「railsのバージョンをひとつ前に戻すことにしました」**
試しにバージョン上げただけなので、、

```mac.terminal

$rails -v 
 Rails 6.0.3.2   // <- railsの現在のバージョンが表示されます①

$ gem uninstall rails 
Select gem to uninstall:
 1. rails-5.2.3
 2. rails-5.2.4
 3. rails-5.2.4.1
 4. rails-5.2.4.2
 5. rails-5.2.4.3
 6. rails-6.0.3.2
 7. All versions
> 6     // <- アンインストールしたいバージョンを選択します②

$ gem uninstall railties -v '6.0.3.2'
Continue with Uninstall? [yN]  y  // <- 「y」を入力③
```

以上!!!

他にも
sassc gemをいじる。
GCCのバージョンを上げる等解決法はあります。

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

■他解決法について
https://teratail.com/questions/231820

■3分でできるRailsダウングレード
https://qiita.com/Hassan/items/eef26c870eb26a0c68e0

■【devise】 rails g devise:install ができない、、時こそ！！
https://qiita.com/tanaka-yu3/items/8a2002921cda080907f8
Railsでシンプルなグラフを出力 gem-chartkick・groupdate使用

Railsでグラフ機能を実装したいと思い、Chartkickを使用しました。
中々記事が少なかったので、少しでも参考になればと思い載せることにしました。
今回はgem groupdateを使い、更新日時を取得しています。
使用したgemは以下の通りです。
- chartkick
- groupdate
Chartkick公式 https://chartkick.com

## 開発環境
Rails 5.2.4

## 構築
①　gemのインストール

```
gem chartkick
gem groupdate
```

②　ターミナル

```
 bundle install
```

③　Javascriptのライブラリ読み込み
app/assets/javascripts/application.jsに下記を追記。

```application.js
//= require chartkick
//= require Chart.bundle
```

④　コントローラーに記述

```top.rb
  def index
  	@users_count = User.group_by_day(:created_at).size
        # ユーザー登録数グラフ出力　gem groupdateをインストールしないと上記の記述は使用不可
  	@user_today = User.where(created_at: Date.today.all_day).count
        # ユーザーの1日の登録数
  end
```

⑤　viewに記述

```index.html.erb
	<div class="main">
		<label class="text-user">日別会員登録者数 (総会員数 : <%= @users.count %>)</label>
		<div class="graph">
		  <%= line_chart @users_count, download: true, colors: ['#FF4F02'] %>
	    </div>
	</div>
```

⑥　実際の画面（登録日と登録数）
![guraf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675326/2cc4082d-c183-0fe1-9959-1fd111886ee9.jpeg)

#### line_chart　
- 折れ線グラフの出力に使用。他に、pie_chart(円グラフ)・column_chart(棒グラフ)・bar_chart(棒グラフ水平方向)・area_chart(面グラフ)・scatter_chart(散布図)などが利用可能。

#### colors: ['rgb']
- グラフの線の色を変えられる。

#### gem groupdateについて
- groupdateは所定のタイムゾーンに基づいて、日時のデータを扱います。groupdateをインストールすると、以下のメソッドが利用可能。　参考　https://github.com/ankane/groupdate

group_by_second　(2分ごとの時間)
group_by_minute　（分）
group_by_hour　(時間)
group_by_day　(日にち)
group_by_week　(週)
group_by_month　（月）
group_by_quarter　（四半期）
group_by_year　（年）
group_by_hour_of_day　（日と時間の両方を返す）
group_by_day_of_week　（一週間事の日付を返す）
group_by_day_of_month　（月の日ごと）
group_by_month_of_year

参考①棒グラフ　column_chart使用
<img width="544" alt="スクリーンショット 2020-07-16 18.13.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675326/d2f7d2aa-89ca-1dc4-929a-3ee76f6ae005.png">

参考③円グラフ　pie_chart使用
<img width="544" alt="スクリーンショット 2020-07-16 18.13.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675326/54572032-8e2e-c179-5fc7-81ba1df09a9d.png">

group_by部分は、曖昧なところがありますが、間違っていれば、ご指摘お願いします。
chartkickは公式サイトにも画像付きで使い方がわかりやすく出ているので参考にしてみてください。
Dockerコンテナ内での作業中に うっかり Ctrl-D で終了させないようにする

Dockerコンテナにログインして, シェルであれこれ操作しているときに うっかりCtrl+D を押してコンテナを終了させてしまい, ムカつくことはないでしょうか (ぼくはありませんが……).

```
% docker run -it -p5901:5901 ubuntu:20.04 bash
root@dcc1b0029b1f:/# exit  # Ctrl-D押下でexitされる
%
```

# ignoreeof オプション (or 組み込み変数) で回避する
コンテナにログイン後に,

```
$ set -p ignoreeof
```

または

```
$ export IGNOREEOF=10
```

とすることで, 10回のCtrl-D連続入力までは, Ctrl-Dでシェルを終了させないようにできます.

```
% docker run -it -ubuntu:20.04 bash
root@00126ad53ed2:/# set -o ignoreeof
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# Use "exit" to leave the shell.
root@00126ad53ed2:/# exit
%
```

exportコマンドでセットした場合は, セットした値の分だけ連続押下しないと入力が無視されるということです. setコマンドの場合は10回です.

exportコマンドできるということは, コンテナ起動時にもセットできるってことですね.

```
docker run -it -eIGNOREEOF=1 ubuntu:20.04 bash
```

# おまけ 1 IGNOREEOF (ignoreeof) ってなんなのか
`IGNOREEOF` がなにかというと, Bashの組み込み変数です. `man bash` をみると, Shell Variables セクションに登場します.

完全に余談ですが, このオプション zshでも使えます. これがPOSIXによる仕様なのか, bash/zshそれぞれの仕様/実装なのか気になって調べてみました. POSIX仕様で定められているようです. POSIXのドキュメントに登場します.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html

# おまけ 2 POSIX非準拠のシェル (ここでは fish) の場合は?

POSIX非準拠のシェルではどうしたらいいのか. そんなに興味がなかったんですが, 最近使うようになったfish の場合を調べてみました.

`IGNOREEOF` は使えません. キーバインドを設定してやるのがいいかなと思います.

```fish
$ bind | grep "\\cd"
bind --preset \cd delete-or-exit
```

Ctrl-Dに `delete-or-exit` (文字の削除or Exit) が割り当てられているので, `delete-char` へ差し替えてやる?

```fish
$ bind \cd delete-char
```
PRML　演習問題 6.20（標準）　解答

# 問題

$(6.66)$ と $(6.67)$ の結果を確認せよ。

# 方針

ガウス過程の予測分布は正規分布であり、その期待値と分散が

```math
\begin{align}
m(\mathbf{x}_{N+1})
 &= \mathbf{k}^{\rm T} \mathbf{C}_N^{-1} \boldsymbol{\sf t}
\tag{6.66}\\

\sigma^2(\mathbf{x}_{N+1})
 &= c-\mathbf{k}^{\rm T} \mathbf{C}_N^{-1} \mathbf{k}
\tag{6.67}
\end{align}
```
であることを、同時分布

```math
\begin{align}
p(\boldsymbol{\sf t}_{N+1})
&= \mathcal{N}(\boldsymbol{\sf t}_{N+1}|\mathbf{0}, \mathbf{C}_{N+1})
\tag{6.64}
\\

\mathbf{C}_{N+1}
 &= \left(
    \begin{array}{cc}
      \mathbf{C}_{N} & \mathbf{k} \\
      \mathbf{k}^{\rm T} & c
    \end{array}
  \right)
\tag{6.65}
\end{align}
```
から示す。

# 解答

**証明**　以下の同時分布があるとき、

```math
\begin{align}
p (\mathbf{x}) &=
\mathcal{N} (
  \mathbf{x} | \boldsymbol{\mu}, \boldsymbol{\Sigma}
) \\

\mathbf{x} =
\left( \begin{array}{c}
  \mathbf{x}_a \\ \mathbf{x}_b
\end{array} \right), \ \ 

\boldsymbol{\mu} &=
\left( \begin{array}{c}
  \boldsymbol{\mu}_a \\ \boldsymbol{\mu}_b
\end{array} \right), \ \ 

\boldsymbol{\Sigma} =
\left( \begin{array}{c}
  \boldsymbol{\Sigma}_{aa} & \boldsymbol{\Sigma}_{ab} \\
  \boldsymbol{\Sigma}_{ba} & \boldsymbol{\Sigma}_{bb}
\end{array} \right)
\tag{2.65-2.67}
\end{align}
```
条件付き分布は以下のように書けることが示されている。

```math
\begin{align}
p (\mathbf{x}_a | \mathbf{x}_b) &=
\mathcal{N} (
  \mathbf{x}_a | \boldsymbol{\mu}_{a|b}, \boldsymbol{\Sigma}_{a|b}
) \\
\boldsymbol{\mu}_{a|b} &= 
\boldsymbol{\mu}_a + \boldsymbol{\Sigma}_{ab} \boldsymbol{\Sigma}_{bb}^{-1}
(\mathbf{x}_b - \boldsymbol{\mu}_b)
\tag{2.81}
\\
\boldsymbol{\Sigma}_{a|b} &=
\boldsymbol{\Sigma}_{aa}-
\boldsymbol{\Sigma}_{ab} \boldsymbol{\Sigma}_{bb}^{-1} \boldsymbol{\Sigma}_{ba}
\tag{2.82}
\\
\end{align}
```
これを $(6.64), (6.65)$ に当てはめると $(6.66), (6.67)$ が得られる。（証明終）
Git commit するときにUnitTestを自動的に行う方法

#結論

.git/hooks/pre-commitにUnittestを実行するよう記述

```:.git/hooks/pre-commit

#!/bin/sh
python -m unittest

```

#お試し方法

* git環境を作成
* hogehoge.pyとtest.pyを作成
* テストが適切に動作することを確認
* .git/hooks/pre-commitに記述
* git commitをして動作するか確認

### git環境を作成


```:git

git init

```

### hogehoge.pyとtest.pyを作成

```python:hogehoge.py

def add(a, b):
    return a + b


if __name__ == "__main__":
    i = add(1, 2)
    print(i)
```

```python:test.py
import unittest
import hogehoge


class Test(unittest.TestCase):
    def test(self):
        i = hogehoge.add(1, 2)
        self.assertEqual(i, 3)


if __name__ == '__main__':
    unittest.main()

```

### テストが適切に動作することを確認

```
>python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
```

### .git/hooks/pre-commitに記述

```:.git/hooks/pre-commit

#!/bin/sh
#pythonの仮想環境に切替
python -m unittest

```

### git commitをして動作するか確認


```

git commit -m "sample"
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
[master f422770] sample
 1 file changed, 1 insertion(+), 1 deletion(-)
```

# 参考資料
http://ayachi.hatenablog.com/entry/2012/12/30/151151
Send-MailMessageコマンドレットでメール送信

# Send-MailMessageコマンドレットでメール送信

Windows系で何か監視したり検知したりしてメール通知したい時によく使うもの。
軽くチェックできればいい程度のことに大げさな監視システムや何かの実行環境入れたくないよね、じゃあPowerShellでやろうか、という。


## 必要なもの
使っていいメールサーバー。


## 使うコマンドレット

`Send-MailMessage -SmtpServer $Server -From $From -To $To -Subject $Subject -Body $Body -Encoding $Encoding`

他にもパラメータあるがおおむねこんな書き方。
長い。一行が長くなりがちなのはPowerShellの常だが、見通しが悪いので別な書き方にする。


## スプラッティング(Splatting)による書き方

```powershell
$MailParam = @{
  SmtpServer = "mail.example.com"
  From       = "watcher@example.com"
  To         = "confirmer@example.com"
  Subject    = "メールタイトル"
  Body       = "メール本文"
  Encoding   = [System.Text.Encoding]::UTF8
}
Send-MailMessage @MailParam
```

パラメータを連想配列にしてコマンドレットに渡せる。
変数を`$MailParam`でなく@をつけて`@MailParam`と書くところに注目。MS語で分配演算子と呼ぶ。(エラーメッセージでしか見たことがない…)
こういう渡し方をスプラッティング(Splatting、分配する)という。見通しが良くなって修正や確認しやすいのでおすすめ。
詳細については MS docs の about_Splatting を読め。

実際に使う時はハードコートしないで他で組み立てた値を代入するほうがいい。
通知で使うなら、携帯メールの着信通知だけで内容わかるほうがいいので、検知した内容に合わせてタイトル本文を組み立てたり。（正常終了しましたとか、完了してませんとか）


### 複数の宛先へ送信したい

```powershell
$mailparam = @{
  To = @("confirmer1@example.com","confirmer2@example.com")
}
```

配列にしてやる。

### Body内で改行したい
``` `r`n ```を入れると改行される。CR+LFの意味。

### エンコード指定

PowerShellで何か読んでどこかへ送ったり書き出すとホイホイ文字化けするので、どのコマンドレットでもEncodingパラメータはだいたい要る。


## 送信後の戻り値が無い

`Send-MailMessage`は何も戻してくれない。
`-PathThru`パラメータもないのでどうしたらいいやら。
送信できなかった時はエラー吐くので例外キャッチでどうにかこうにかしよう。
ただ、そこまでガッチリシッカリ漏れなく監視したいなら、専門の監視システム導入するほうが良いと思う。餅は餅屋。
【Flutter】emailのバリデーション(正規表現)

# 実装背景
Flutterのアプリ側である程度のバリデーションチェックをしたいと思い、
正規表現について学習した記録と実装方法を残す

# 正規表現について
まず正規表現について学習しました。
[サルにもわかる正規表現入門](https://userweb.mnet.ne.jp/nakama/)

正規表現は
> いくつかの文字列を一つの形式で表現するための表現方法

この表現がしっくり来ました。
今回の場合メールアドレスのバリデーションチェックをしたいのですが、
メールアドレスはいろんな種類があって

- 英字+@+英字+.+英字のパターン

`hogehoge@gmail.com`

- 英数字+@+英字+.+英字

`hoge2020hoge@gmail.com`

- 英数字(特殊文字込み)+@+英字+.+英字

`hoge2020_hoge@gmail.com`

などなどいろんなパターンがありますが、
メールアドレスだと基本的には`文字+@+文字+.+文字`
のように必ず、@と.があります。(ない場合あったらごめんなさい)

なので、この形式になるように正規表現でチェックすれば良さそうです。

# メールのバリデーション(正規表現)

[バリデーションで使用する正規表現の読み方](https://qiita.com/190131start/items/20d68c4f16edb8c3731c)

正規表現を使うためにはまず、正規表現で書かれている記号の意味を理解する必要がありました。(上記の記事時の具体例がわかりやすかったです。)

emailの正規表現は

```
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
```

こちらで良さそうですが、
もっとルールを軽くしたり、重くしたりのカスタマイズもできるので
その辺りは要件に合わせてやってみるといいと思います。
※例えばgmailの`hogehoge+1@gmail.com`などの**+1**を許容しないようにするなど

# Flutter(Dart)でのバリデーションの実装
コピペで貼り付けられるように、全文を載せておきます。

```main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
　final _emailTextController = TextEditingController();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: _emailTextController,
            ),
            FlatButton(
              onPressed: (){
                _emailValidation();
              },
              child: Text('バリデーション'),
            ),
          ],
        ),
      ),
    );
  }

  void _emailValidation() {
    final email = _emailTextController.text;
    // バリデーションチェック
    // 正規表現にemailがマッチしたらtrueを返す
    if (RegExp(
        r"/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)")
        .hasMatch(email)) {
      // メールの形式が正しい時の処理
    } else {
      // メールの形式が正しくない時の処理(エラーダイアログの表示など)
    }
  }
}
```

# 最後に
最初訳わかんない文字列が並んでたのでビビってましたが、
正規表現怖くない！！
WebStormの設定を見直して軽くする

# ことの始まり
WebStormで開発を続けていると、どうにも重くて、タイピングに支障が出るほどになってきた。
毎回重くなるたびにWebStormを再起動させていたけどどうにもならないため、設定周りをいじってとにかく軽くする。

# VCSのメモリを増やす
Help > Edit Custom VM Option　を選択する。
<img width="596" alt="スクリーンショット 2020-07-16 17.39.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459932/edd851f7-a4a1-e470-ea4c-5946aaf17386.png">

出てきたファイルを書き換える
-Xms512m
-Xmx4096m
-XX:ReservedCodeCacheSize=480m

# プラグインを無効にする
WebStorm > Preference　を選択して環境設定を開く
<img width="388" alt="スクリーンショット 2020-07-16 17.49.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459932/b4fc49e8-bb38-7577-0dfc-5ceffcccd2a3.png">

Pluginを選択する
<img width="1001" alt="スクリーンショット 2020-07-16 17.49.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459932/eaf27790-f4c6-cd37-33cc-97716a9a6c1a.png">

installedの項目の中から使っていないプラグインのチェックを外す。
プロダクトやコーディングスタイルにもよるが、自分は半分以上のプラグインチェックを外した。

# Inspectionsを無効にする
多分一番効果があった気がする。Inspectionsを全て無効にする。
<img width="1000" alt="スクリーンショット 2020-07-16 18.03.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459932/4182f1b0-b2d8-362e-7e86-b29d2fe58632.png">

無効にした後、やっぱり欲しいと感じたものだけをチェック付け直し。

#
バックグラウンドイメージの透過処理（イメージを好きな色とレイヤリングする）

###  <font color='lightblue'>記事にした背景</font>
Railsでバックグラウンドの画像を表示する際、そのまま出力すると、主張が強い場合がありますよね。そこで、表示する色を薄くする方法を記述します。

<元画像>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/e8f8a8ae-9e6b-df6f-c15a-f20c99d8f7a1.png)


<※編集後>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/3a8a19f4-3889-ed22-cd22-72b3cb6c3885.png)


###  <font color='lightblue'>環境</font>
| 項目              |               内容 | 
|:-----------------|:------------------:|
| OS.Catalina      |           v10.15.4 |      
| Ruby             |            v2.5.1 |  
| Ruby On Rails    |           v5.2.4.3 | 



###  <font color='lightblue'>対応手順</font>
以下のソースを貼り付けておきます。

```scss:test.scss
.contents_1p{
  height: 100vh;
  width: 100%;
  //railsなので、app/assets/imagesの配下に画像を設置する
  background-image: image-url('test.jpg');
  //白色を貼り付けて、透過させる。これは青や、緑でも対応可能
  background-color:rgba(255,255,255,0.7);
  //混合モードの指定になります。
  background-blend-mode:lighten;
  //ついでに画像をページ全体に表示する
  background-size: 100%;
}
```

###  <font color='lightblue'>参考文献</font>
[background-blend-mode](https://developer.mozilla.org/ja/docs/Web/CSS/background-blend-mode)
[Background-image(背景画像)を透過させるCSS](https://note.com/jackinriver/n/n4383898ce0c6)

以上です。
iPhoneをアイロンにする計画

# やること
 iSHを使ってiPhoneのCPUに負荷をかけ，アツアツにします。

# iSHのインストール
 まずは[ここ](https://apps.apple.com/jp/app/testflight/id899247664?l=en)に飛んで，TestFlightをiPhoneにインストールします。
 次に，[ここ](https://ish.app/)に飛んでGet iSH beta というボタンを押します。
 すると，さっき入れたTest Flightが開くので，そのままiSHをインストールします。
 これでiPhoneでLinuxが動かせるようになりました。

# CPUに負荷をかける
 iPhoneをアツアツにするためのシェルスクリプトを作りました。

```shell:~/stress.sh
#!/bin/bash
i=1
t=$1
if [ -z $t ];  then
  t=1
fi
echo "Thread: $t"
while true;  do
  yes > /dev/null &
  if [ $i -eq $t ];  then
    break
  fi
  i=$(( $i + 1 ))
done
```
適当に書いたので出来はそこそこですが，許してください。

 あとはこのシェルスクリプトを保存して，実行権限を与えます。

```
# chmod +x ~/stress.sh
```
あとは、実行するのみです。

```
# ~/stress.sh <同時実行数>
```
スクリプトを読めば分かりますが，同時実効数はデフォルトは1です。ただ，1だとあまり熱くならないので自分は200にしました。この数字は大きすぎるとiSHが落ちるので自分の環境に合わせて調整してください。
 このスクリプトはバックグラウンドで動くので，止めたい時はiSHを無理やり閉じちゃってください。

# 終わりに
 また無駄な物を作ってしまいました。
Apexで多数の文字列結合する場合には+=ではなくjoinを使おう！


#経緯
　Visualforceを利用してcsvを出力する機能を開発する際、ヘッダー部やデータ部の結合を「+=」でやっていませんか？
　自分の参画したプロジェクトでは上記が原因で「CPU TIME LIMIT」のガバナ制限に該当していまい処理を見直すことになりました。
　今回は上記を踏まえ、できるだけ早く処理するためにはどうしたらよいかをご案内します。


#文字列結合の方法

　・+=を利用する

　・String.join()を利用する

　　今回はこの２つを利用して速度の比較を行います。


#検証
◆検証方法として、"abc"という文字列に対して","（カンマ)を10万回程度連結して結合していきます。

・+=の場合

```java
Datetime start = Datetime.now();
List<String> txtList = new List<String>();
String resultStr = '';

for (integer i=0; i<100000; i++) {
    txtList.add('abc');
}
for (String s : txtList) {
    resultStr += s + ',';  
}
Datetime fin = Datetime.now();
System.debug('START' + start);
System.debug('FINISH' + fin);
```

CPU Time：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657185/3f5ebad3-b83d-931f-748e-b60e69fc147e.png)


・String.join()の場合

```java
Datetime start = Datetime.now();
List<String> txtList = new List<String>();
    
for (Integer i=0; i<100000; i++) {
    txtList.add('abc');
}
String resultStr = String.join(txtList,',');
Datetime fin = Datetime.now();
System.debug('START' + start);
System.debug('FINISH' + fin);
```

CPU Time：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657185/b3eea9ed-cf09-b53a-1a05-775faad4b398.png)




#結論
　結合の方法を変更するだけでパフォーマンスが改善されましたね。
　Javaのエンジニアの方であれば既知の内容である「+=ではなくStringBufferを使う方が高速になる」（今もそうかわかりませんが）
　というノウハウについてApexでも類似した検証をした結果、速度に結構な差が出ました。
　もしパフォーマンス面で見直しを余儀なくされているApexクラスがありましたら、今回の内容が少しでも参考になれば幸いです。
【WebAPI】駆け出しエンジニアの金の卵を見つけよう【Node.js】

##前文
世は空前のエンジニア転職ブームです。
かくゆう私も数年前に飲食業界からプログラミングスクールを経てエンジニア転職を果たしました。
当時と比べ、プラグラミングスクールの増加、オンラインサロンの認知度の向上、エンジニアYouTuberの台頭などで未経験者の方にとってインプットのための情報源は非常に増えましたね。

Twitterでは__#駆け出しエンジニアと繋がりたい__や__#今日の積み上げ__などのハッシュタグを通じて学習状況の進捗を共有されているのをよく見かけます。
ですがQiitaに投稿するという行為は非常に心理的なハードルが高いと思われます。
なので、それにもかかわらず多くのLGTM数を獲得している金の卵、鬼滅の刃で言えば柱候補にあたる記事を探してみます。

##実行環境
Node.js 14.5.0

##調査方法
Qiita APIを使用して下記の条件で記事情報を取得します。

+ 駆け出しエンジニアもしくは未経験エンジニアのタグを含む記事
+ LGTM数を調べる

##実装
前述の通りNode.jsを使用します。
LGTMの最低ラインを５に設定します。

```javascript:index.js
const axios = require('axios');
async function main() {
    let url = "https://qiita.com/api/v2/items?page=1&per_page=100&query=tag:" + encodeURIComponent("未経験エンジニア") + " OR tag:"+ encodeURIComponent("駆け出しエンジニア");
    let response = await axios.get(url);
    response.data.forEach(value => {
        if (value.likes_count > 5) {
            console.log("タイトル: " + value.title, "LGTM: "  + value.likes_count, "URL: " + value.url);
        }
    });
}
```
##結果発表
|タイトル|LGTM|URL|
|:---|:---|:---|
|高卒フリーターから、Web系自社開発企業のエンジニアになるまで|495|https://qiita.com/halhal23/items/073913754cd7f7d9352d|
|未経験が受託企業に入って1年経ったので、学んだスキル全部書いてみる|148|https://qiita.com/wann/items/5de4445dfd35376c71c0|
|未経験からエンジニア転職活動　with コロナ|15|https://qiita.com/yujisugaya/items/6f764b75f49d4adccbcf|
|Gitのrebaseとmergeの挙動の違いをGitHubを用いて検証してみた|81|https://qiita.com/minakawa-daiki/items/c8a939b5d529ee39eac1|
##感想
LGTM数3桁を獲得している猛者の方がいらっしゃいました。
上位の４記事はタイトルも内容も具体的でスライドを交えたりなどで視覚的にも飽きさせない工夫がしてありました。
これから私もQiitaで投稿をしていくのでここであげられた記事を参考に分かりやすく丁寧な投稿を心がけていきたいと思います。
Perl: ImageMagick のサンプル

```pl:image_magick_size.pl
#! /usr/bin/perl
#
# ----------------------------------------------------------------  
use strict;
use warnings;
use utf8;
use Image::Magick;
binmode STDOUT, ":encoding(UTF-8)";
binmode STDERR, ":encoding(UTF-8)";
# ----------------------------------------------------------------  
print STDERR "*** 開始 ***\n";

my $filename = "sample01.jpg";
my $image = Image::Magick->new;
$image->Read("$filename");

my ($width, $height) = $image->Get('width', 'height'); 

print "width = " . $width . "\n";
print "height = " . $height . "\n";

undef $image; 

print STDERR "*** 終了 ***\n";
exit();

# ----------------------------------------------------------------
```


テストに使う画像

```text
$ file sample01.jpg 
sample01.jpg: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=0], baseline, precision 8, 270x180, components 3
```

実行結果

```text
$ ./image_magick_size.pl 
*** 開始 ***
width = 270
height = 180
*** 終了 ***
```
LaravelにてPHP Unitでテストを指定して実行する方法

# はじめに
LaravelにてPHPUnitを実行する際にテストを指定して、実行する方法をまとめました

# 環境
```bash
$ php artisan -V
Laravel Framework 5.8.29
```

# 実行方法

- 実行するテスト

```project/tests/Unit/HogeTest.php
<?php

namespace Tests\Unit;

use Tests\TestCase;

class HogeTest extends TestCase
{
    /**
     * @test Hoge::hello()
     */
    public function testHello()
    {
        $result = Hoge::hello();
        $this->assertTrue($result);
    }
}
```

- テスト実行例

```bash
# テストを指定して実行
$ ./vendor/bin/phpunit project/tests/Unit/HogeTest.php　--filter "testHello"
```
ImageMagick7 + im4java

im4java経由でImageMagickを呼び出す。環境はwindows 10。

# 環境
* windows 10
* ImageMagick-7.0.10-21

# ソースコード

```gradle
implementation 'org.im4java:im4java:1.4.0'
```

```java
import java.io.IOException;

import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;
import org.im4java.core.ImageMagickCmd;

public class ImageMagickMain {
	public static void main(String[] args) throws IOException, InterruptedException, IM4JavaException {
		ImageMagickCmd magick = new ImageMagickCmd("magick");
		IMOperation operation = new IMOperation();
		operation.addImage("src.png");
		operation.resize(300, 300);
		operation.addImage("dest.png");
		
		System.out.println(operation.getCmdArgs());
		magick.run(operation);
	}
}

```

# 7以前との注意点
詳細はぐぐると出てくるが、7からモジュール名が```convert```から```magick```に変更されている。具体的にwindowsでいうと```convert.exe```から```magick.exe```になっている。そのため7では、```new ImageMagickCmd```の引数のImageMagickのモジュール名は```magick```の必要がある。既存資料を参考にする場合はその点に注意が必要。

ただし、引き続き```convert```も使用可能。その場合はインストール時に下記のようにInstall legacy utilitiesにチェックが必要。これにチェックすると```convert.exe```もインストールされる。

<img width="373" alt="Untitled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/acb2cf68-612b-2453-f257-29bf3aec00e1.png">
【Unityゲーム開発】「コルーチン」の導入と使いどころ

#解説動画
・https://youtu.be/l3C_0ZqAW7c

#コード
```Sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    // コルーチン：処理を待機させるためのもの
    // 使い方：
    // ・関数の返り値をIEnumeratorにする
    // ・yield return XX; XXの間、待機
    // ・関数の実行にはStartCoroutine(関数);

    // おすすめコルーチン
    // 1.trueになるまで待機する：yield return new WaitUntil
    // ・Inputとの組み合わせで入力まちができる
    // 2.別のコルーチンが終了するまで待機すく： yield return 関数名

    bool isGameOver;
    void Start()
    {
        isGameOver = false;
        // DummyBattle();
        StartCoroutine(Battle());
    }

    IEnumerator Battle()
    {
        Debug.Log("バトル開始");
        while(isGameOver == false)
        {
            yield return PlayerTurn();
            yield return EnemyTurn();
        }
        Debug.Log("バトル終了");
    }


    IEnumerator PlayerTurn()
    {
        yield return new WaitForSeconds(1f);
        Debug.Log("Playerの攻撃");
        yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
    }

    IEnumerator EnemyTurn()
    {
        yield return new WaitForSeconds(1f);
        Debug.Log("敵の攻撃");
        yield return new WaitForSeconds(1f);
    }


    /*
    void DummyBattle()
    {
        Debug.Log("バトル開始");
        Invoke("PlayerAttack", 1f);
        Debug.Log("敵の攻撃");
        Debug.Log("バトル終了");
    }
    void PlayerAttack()
    {
        Debug.Log("Playerの攻撃");
        Invoke("EnemyAttack", 1f);
    }
    void EnemyAttack()
    {
        Debug.Log("敵の攻撃");
    }
        IEnumerator Battle()
    {
        Debug.Log("バトル開始");
        yield return new WaitForSeconds(1f);
        Debug.Log("Playerの攻撃");
        yield return new WaitUntil( () => Input.GetKeyDown(KeyCode.Space));
        yield return new WaitForSeconds(1f);
        yield return EnemyTurn();
        Debug.Log("バトル終了");
    }

    */

}
```

#スタジオしまづから
・スタジオしまづでゲームの作り方を学びたい人向けのサロン▶︎https://camp-fire.jp/projects/view/149191
・スタジオしまづ ▶︎ https://fromalgorithm.jimdo.com
Nuxt2.13.0にamplify3系をインストールした時に発生したerror

## 発生したエラー

```bash
 ERROR  ERROR in $HOME/management-app/node_modules/@aws-amplify/api-graphql/lib-esm/types/index.d.ts(1,30):                                                                                                                                                       nuxt:typescript 16:46:17
1:30 Could not find a declaration file for module 'graphql/language/ast'. '/Users/tai-hatake/workspace/wanderer/management-app/node_modules/graphql/language/ast.js' implicitly has an 'any' type.
  Try `npm install @types/graphql` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql/language/ast';`
  > 1 | import { DocumentNode } from 'graphql/language/ast';
      |                              ^
    2 | export interface GraphQLOptions {
    3 |     query: string | DocumentNode;
    4 |     variables?: object;
```

## 解消方法

```bash
npm install @types/graphql@14.0.0 
```
git rebase ではなく、スカッシュマージしてコミットを一つにまとめる

備忘録です。

## 課題

```
$ git log
$ git rebase -i [コミット番号]
# or
$ git rebase -i HEAD~123
```

`git log` して差分のあるコミットを一気にまとめたい時に
コミット番号や何個前のコミットか指定するのが面倒だと感じることがありました。

## 解決方法

もう一個ブランチ作ってそこにスカッシュマージする方法を考えました。

```
$ git switch master
$ git switch -c feature/issue-xxx

めっちゃコミットする

# 作業したブランチの名前を適当に変える
$ git branch -m feature/issue-xxx-org

# 元のブランチから新しくブランチを切り直す
$ git switch master
$ git switch -c feature/issue-xxx

# 作業したブランチをスカッシュマージする
$ git merge --squash feature/issue-xxx-org

# 変更点がステージされてる状態なのでコミットしてプッシュする
$ git commit -m "まとめてコミット"
$ git push origin HEAD
```

素直に `git log` してコミット番号指定してまとめた方が速いかもしれない...
ローカルのcsvを元にpandasで新たにcsvを作成する

## ローカルのcsvを元にpandasで新たにcsvを作成する

次のcsvがローカルにあるとします。

```sample.csv
id,age,name,money
111,11,sato,1100
222,22,suzuki,20000
333,33,takahashi,330000
444,44,tanaka,440000
555,55,ito,500000
666,66,yamamoto,800000
777,77,nakamura,1000000
```

これを元に以下を満たすcsvを新たに作成します。

* csvのデータを一部並び替えたい
* 固定のヘッダー名+1行のcsvを元のcsvの行数分作成したい
* 新規作成するcsvのファイル名は既存データを元に命名する

## 実行環境

* MacOS 10.15.5
* Python 3.7.3
* pyenv 1.2.19
* pip 20.1.1
* pandas   1.0.5

## コード
```python:gencsv.py
import pandas as pd

id_list = []
age_list = []
name_list = []
money_list = []

read_csvfile = 'sample.csv'
def stack_data():
    global name_list
    global id_list
    global age_list 
    global money_list 

    # csvからデータを読みこむ
    data = pd.read_csv(read_csvfile)
    # 各リストに格納する
    for name in data['name']:
        name_list += [name]
    for i in data['id']:
        id_list += [i]
    for age in data['age']:
        age_list += [age]
    for money in data['money']:
        money_list += [money]


def generate_csv():
    # 取得したデータをデータフレームに代入する
    for i in range(len(name_list)):
        df = pd.DataFrame({
            'name': name_list[i],
            'age': age_list[i],
            'money': money_list[i],
        },index=[i,])

        csv_title =  'personID=' + str(id_list[i]) + '.csv'

        # データフレームを元にcsvを生成する
        df.to_csv(csv_title, index=False)
        print(csv_title+'が生成されました')
    print("全て作成完了")


stack_data()
generate_csv()
```

## 実行結果

```
$ python3 gencsv.py
personID=111.csvが生成されました
personID=222.csvが生成されました
personID=333.csvが生成されました
personID=444.csvが生成されました
personID=555.csvが生成されました
personID=666.csvが生成されました
personID=777.csvが生成されました
全て作成完了
```

## 終わりに
* 何かありましたらコメントお願いいたします。
Pythonのクロージャのサンプル

Schemeではおなじみのクロージャ＋高階関数の例（counter，[Wikipediaの『クロージャ』](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3)を参照）をPythonで書き直したものを備忘録的に記載する．

#Python（3.X）の場合

ポイントは，内包される外部変数の値を関数本体で書き換えたい場合は，nonlocalで宣言する必要があることだろうか．

```python:counter.py
>>> def new_counter(c):
...   def retfunc():
...     nonlocal c
...     c += 1
...     return (c)
...   return (retfunc)
...
>>> c1 = new_counter(10)
>>> c1()
11
>>> c1()
12
>>> c1()
13
```

#Schemeの場合

実行は[Gauche](https://www.jdoodle.com/execute-scheme-online/)で確認．

```python:counter.scm
gosh> (define new_counter
        (lambda (c)
          (lambda () (set! c (+ c 1)))))
new_counter
gosh> (define c1 (new_counter 10))
c1
gosh> (c1)
11
gosh> (c1)
12
gosh> (c1)
13
```
【Git】コミット履歴込みでリポジトリの移行を行う。（Git to Git）

メモとして残します。
BitbucketからBacklogに移行する機会があったため、自分用のメモです。
コミット履歴、タグ、ブランチ、全て込み込みで移行します。
#■やり方
##0.新リポジトリを作成する。
新リポジトリとなるリポジトリを作成する。
**注）空の新品のリポジトリであること。**
##1.旧リポジトリをローカルにミラーでクローンする
```bash
git clone --mirror 旧リポジトリURL ./
```
上記の場合はあらかじめフォルダを作成してそのフォルダ内に移動して
`./` でclone --mirrorしたソースを展開しています。
##2.リモートURLを新リポジトリに変更する。
```bash
git remote set-url --push origin 新リポジトリURL
```
##3.リモートにpush
```bash
git push --mirror
```
#■余談
上記の作業後に、Backlog（新リポジトリ）上で確認してみると
一部のコミット履歴が正しく表示されないことがありました。
「失敗したかな？」と思い、TortoiseGitで確認してみたら、backlog上だと見れなかったコミット履歴も問題なく見れたので、backlogのWeb上で閲覧する場合の不具合でしょう。。。
Developers.IO 2020 CONNECT

# クラスメソッドのイベントです。

AWS関連の調べものをGoogle検索すると、かなりの確率でDevelopers.IOブログに辿り着き、結構参考にさせてもらっていたので、「クラスメソッド」という名前は知っていました。リモートワーク中、かつ、オンライン開催ということもあったので、「Developers.IO 2020 CONNECT」参加してみました。

### すでに終わってしまっていますが。。　まだ大丈夫です。
現在でも視聴可能なコンテンツがありますので、興味がある方は、ご覧になってください。
https://classmethod.jp/m/devio_2020_connect/


Day1　AWSとクラスメソッドの文化
Day2　データ分析を支える技術
Day3　ソーシャル、IoT、クラウドがもたらすUX
Day4　機械学習の現在地と、サーバーレス、IaC、ほか
Day5　ビジネスとマネジメント
Day6　Modern Application Development
Day7　クラスメソッド、17年目の"Still Day 1"

いくつかは、引っかかるコンテンツがあるかもしれません。


## 個人的に面白いと思ったコンテンツ

Day1
はじめてのAWS設計でやりがちな失敗パターンまとめ　
にしざわ

AWSインフラ構築する立場の方には、地味に響く内容だと思います。


Day7
就職せずに自己資本でクラスメソッドを起業して16年掛けて年商200億円になった話
代表取締役社長 横田聡

ブログ文化の原点。

Day3
IoTは作らずに創る!!すぐに使えて組み合わせ自在のSORACOMビルディングブロック
株式会社ソラコム 大瀧隆太氏

個人的に、「LTEボタン」という物理デバイスを趣味レベルで使っています。
 物理ボタンを押すと、ランプが点滅して、ただ、データを送信するだけの、極めてシンプルな装置ですが、設定次第で、AWS lambda 等と連携出来るので、なかなか面白いです。
[GKE] TCP/UDP が混在するロードバランサをデプロイできない

# 概要

- GKE上では TDP/UDP が混在したL4ロードバランサ（spec.type: loadBalancer）を作成できない。
- プロトコル毎（TCP用、UDP用）に L4 ロードバランサを作成する。
- それぞれのロードバランサには、異なる IP アドレスが割り当てられてしまう。
- 内部ロードバランサの場合、割り当てたい内部IPアドレスを共有アドレスとして予約しておくことで、それぞれのロードバランサに同じIPアドレスを VIP として割り当てることができる。


# 現象

GKE 上で稼働している Zabbix Server へ SNMPTrapd を実装する必要があり、次のように Service マニフェストファイルに `snmptrapd` (162/udp) を追加しました。

```yaml:svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-zabbix
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  namespace: zabbix
  labels:
    run: svc-zabbix
spec:
  type: LoadBalancer
  ports:
  - port: 80
    name: http
    protocol: TCP
    targetPort: 80
  - port: 10051
    name: zabbix-trapper
    protocol: TCP
    targetPort: 10051
  - port: 162
    name: snmptrapd
    protocol: UDP
    targetPort: 162
  selector:
    run: zabbix
  loadBalancerIP: 10.128.1.56
```

これをデプロイすると `cannot create an external load balancer with mix protocols` と叱られます。

```bash
$ kubectl apply -f svc.yaml
･･･
cannot create an external load balancer with mix protocols
```

# 内部IPアドレスをVIPとして予約

次のコマンドで、内部IPアドレスを 共有VIPとして予約します。

ちなみに `--purpose` オプションは、外部IPアドレスの場合は適用されないようです。（[参考](https://cloud.google.com/sdk/gcloud/reference/beta/compute/addresses/create)）

```bash
$ gcloud beta compute addresses create zabbix-address \
    --region asia-northeast1 \
    --subnet example-vpc-subnet-1 \
    --addresses 10.128.1.56 \
    --purpose SHARED_LOADBALANCER_VIP
```

内部IPアドレスが予約できたか確認します。

```
$ gcloud compute addresses list zabbix-address
NAME             ADDRESS/RANGE  TYPE      PURPOSE  NETWORK  REGION           SUBNET                STATUS
zabbix-address   10.128.1.56    INTERNAL                    asia-northeast1  example-vpc-subnet-1  RESERVED
```

# プロトコル別にロードバランサ作成

TCP、UDP別に Service マニフェストを作成します。

```yaml:svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-zabbix-tcp
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  namespace: zabbix
  labels:
    run: svc-zabbix-tcp
spec:
  type: LoadBalancer
  ports:
  - port: 80
    name: http
    protocol: TCP
    targetPort: 80
  - port: 10051
    name: zabbix-trapper
    protocol: TCP
    targetPort: 10051
  selector:
    run: zabbix
  loadBalancerIP: 10.128.1.56
---
apiVersion: v1
kind: Service
metadata:
  name: svc-zabbix-udp
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  namespace: zabbix
  labels:
    run: svc-zabbix-udp
spec:
  type: LoadBalancer
  ports:
  - port: 162
    name: snmptrapd
    protocol: UDP
    targetPort: 162
  selector:
    run: zabbix
  loadBalancerIP: 10.128.1.56
```

Service を GKE へデプロイします。

```bash
$ kubectl apply -f svc.yaml 
service/svc-zabbix-tcp created
service/svc-zabbix-udp created
```

同じ 内部IPアドレス（`10.128.1.56`）が割り当てられた L4 ロードバランサが２つ作成されました。

```bash
$ kubectl get svc
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                         AGE
svc-zabbix-tcp  LoadBalancer   10.1.161.66    10.128.1.56   80:32216/TCP,10051:32232/TCP    2m51s
svc-zabbix-udp  LoadBalancer   10.1.162.198   10.128.1.56   162:30825/UDP                   2m51s
```
SYMBOL(NEM) テストネット ノード情報

2020年12月メインネットローンチ予定のNEMブロックチェーン次期バージョン通称「SYMBOL」。
すでにパブリックテストネットは公開され、Slackコミュニティの投稿ではノード情報が共有されましたが、投稿が流れてしまうので個人的なメモがてらまとめます。

まだ、NEMを使ってブロックチェーンの開発をしたことがない方は、是非これを機にトライしてみてください。
ブロックチェーンのプラットフォームはEthereumやHyperledgerなど数多くありますが、その中でもNEMを導入するメリットはKyokot[[@kyokot](https://twitter.com/kyokot)]さんの記事によくまとめられていますのでこちらをご覧になってみてください。
https://www.thankthee.net/sakura/2020/07/05/the-intrinsic-value-of-symbol-from-nem/
<br>

※以下のバージョンは2020年7月16日時点の最新バージョン（v0.9.6.3)

## Endpoint（公式）
http://api-01.us-east-1.096x.symboldev.network:3000/
http://api-01.eu-west-1.096x.symboldev.network:3000/
http://api-01.us-west-1.096x.symboldev.network:3000/
http://api-01.ap-southeast-1.096x.symboldev.network:3000/
http://api-01.eu-central-1.096x.symboldev.network:3000/
http://api-01.ap-northeast-1.096x.symboldev.network:3000/

## Endpoint（有志）
* Opening Lineさん（Daokaさん[[@DaokaTrade](https://twitter.com/DaokaTrade)]）<br>
https://sym-test963.opening-line.jp:3001/
* planet★箒星さん[[@planethouki](https://twitter.com/planethouki)]<br>
http://0963-api.48gh23s.xyz:3000/<br>
https://0963-api.48gh23s.xyz:3001/


## Faucets
http://faucet-96x-01.symboldev.network
http://faucet-96x-02.symboldev.network

## Explorer
http://explorer-96x.symboldev.network

## Bootstrap
なお、こちらのブートストラップを使ってご自身でテストノードを建ててみることもできますので、是非チャレンジしてみてください。
https://github.com/nemfoundation/symbol-testnet-bootstrap/releases/tag/0.9.6.3-beta1
How to prevent unauthorized access in data centers?

In some large data centers or telecommunications rooms with complex management personnel or multiple departments, it’s important to ensure that the optical connection is not disconnected by some misoperations.

Lockable fiber optic connectors are products based on this security requirement.On the basis of ordinary fiber optic connectors, the lock connector adds a unique locking and independent unlocking tool, which uses to lock the dedicated fiber port.It can effectively prevent accidental inserting and removing by other personnel and improve the security of the entire network.

How does it work?
Here are two lockable connectors: SC secure lockable connector and LC secure lockable connector.
![149.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/1e86525c-1002-004f-4626-d5b3de8e3f38.jpeg)

Secure-Keyed SC connector has unique keying details and can be locked by simply plugging it into the adapter. Once the connector is locked, only the matching color key can open and release the connector. The security lock sc connector comes in five different colors and can be used in different applications. For fiber ports that are not being used temporarily, dust caps with the same locking function have also been developed. The difference is that the dust cap can be opened with any color key.

![148.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/94825530-ed3e-25c0-6c95-bf10e1289182.jpeg)

The secure locking LC connector was developed from adding a lockable accessory to the traditional duplex connector. The removal of the security lock will not interfere with the LC adapter or cause network performance degradation.

Both locking LC/SC fiber optic connectors are fully compatible with conventional adapters without the need to use specific cables or adapters. It can be easily installed and removed without affecting adjacent ports.

It is especially suitable for networks with higher security levels such as military, government, finance, education, and medical treatment, which can effectively prevent unauthorized tampering.

About HYC Co., Ltd
HYC has 20 years of OEM/ODM manufacturing experience in optical passive devices in the optical communications industry and is committed to providing high-quality connected products for global data users. At present, HYC has several major product lines such as optical fiber connectors, optical fiber jumpers, PLC optical splitters, WDM wavelength division multiplexers, and MEMS optical switches. The factory has more than 1,000 employees and has strong production capabilities.
Discord でバーチャルオフィスを作る

# 雑談しながら作業がしたい！

リモート勤務数ヶ月目に突入、たまには雑談しながら仕事したいよね〜〜〜〜と1日zoomつないで仕事してたりしましたが、色々めんどくさかったのでdiscordでバーチャルオフィス作ってみることにしました。

<img width="241" alt="スクリーンショット 2020-07-16 15.36.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77274/ca317f15-044f-f7d3-c7a8-c7209bdf04fc.png">


## チャンネルの設定

基本的なコミュニケーションはslackの方でとっているので、discordでは音声コミュニケーションのみです。

### テキストチャンネル

テキストチャンネルの方はgeneral, 雑談, 共有, 音楽再生用の4つを作成。
general, 雑談, 共有はぶっちゃけ使い分けはあまりしておらず、話題に出たもののリンクを貼ったり、gif画像貼る位にしか使ってません。
音楽再生用は、fredBoat（音楽再生用BOT）のコマンド入力用です。


### ボイスチャンネル
とりあえず雑談作業部屋, 執務室, エンジニアルーム, 休憩時間や終業後にスプラトゥーンをする用のイカ部屋を作成。
雑談作業部屋は喋ったり音楽聴きながら作業したい人向け、執務室・エンジニアルームは静かに作業したい時や各チームで打ち合わせしたりするのに使ってます。そのうちMTGルームチャンネルを作ったりするかもしれません。

イカ休憩はエンジニアロールがついている人だけが見れるプライベートチャンネルで作ってます。仕事時間以外でやってるので後ろ暗いことはないのですが、一応・・・w
終業後オンライン麻雀やボードゲームで遊ぶこともあるので、そういう部屋もそのうち作る予定です。

## ロール設定

デフォルトのeveryone以外に、社員, エンジニアのロールを使ってます。

# 感想

とりあえず無料で始めてみたばかりなので、今のところエンジニアチーム中心にしか使ってないのですが、
音声通話のみで使う分にはzoomやmeetとかに比べてかなり快適です。
毎朝エンジニアMTGしているのですが、そこで10人前後集まってビデオonで喋るとちょっと重いかなという感じではありました。その辺りはzoomの方が良さそう。
割と気軽に使えるし、いちいちルームを立ち上げたりホストが招待したりがないので、ふらっと入って仕事の質問したり、雑談にいる人に仕様の壁打ちに付き合ってもらったりと面白く使えそうです。
laralvel5.7 php で OG画像、メタタグ、タイトルを取得

サイトをスクレイピングしてOG画像やメタタグ、タイトルを取得したい。
スクレイピングしてあれこれしていたが、ライブラリがあるので使う。

今回紹介するのはEmbed
https://packagist.org/packages/embed/embed


インストール

```

composer require embed/embed
composer require slim/psr7

```


利用


```HogeController.php


use Embed\Embed;

class HogeController extends Controller
{

    public static function test(Request $request)
    {

        //Load any url:
        $embed = new Embed();
//        $info = $embed->get('https://www.youtube.com/watch?v=PP1xn5wHtxE');
        $info = $embed->get('https://love-letter.club/to/amichan_555');

//        pd($info->image);
        $metas = $info->getMetas();
        $all_meta = $metas->all();
        
        pd($all_meta);
        pd($all_meta['twitter:image']);
        pd($all_meta['og:title']);
        pd($all_meta['og:image']);
        pd($all_meta['og:site_name']);
        pd($all_meta['og:description']);


//        pd($metas->all());

        die;


```

以上
Laravel 環境でAppleIDログイン

# Laravel Socialite でApple SignIn

Laravel 5.7想定です。

以下のプラグインをインストールします。

https://socialiteproviders.netlify.app/providers/apple.html


```
APPLE_CLIENT_ID
APPLE_CLIENT_SECRET
APPLE_REDIRECT_URI
```

上の情報は、下記の手順で取得します。

https://github.com/GeneaLabs/laravel-sign-in-with-apple

以上です。
section, article, aside, nav の役割と使い分け

#セクションを表す要素4つ

###1.```<section>```

その範囲が一般的な「章・節・項」であることを示す
サイトをひとつのテーマを取り扱う文書と考えた場合、文書を構成する要素に属するのであれば```<section>```を使用する

###2.```<article>```

その範囲がセクションの中で独立している
サイトをひとつのテーマを取り扱う文書と考えた場合、文書の構成を外れた、全く独立したコンテンツであれば```<article>```を使用する

###3.```<aside>```

メインコンテンツとは関連性が薄い要素に使用する。
補足や広告など。

###4.```<nav>```

その範囲がナビゲーション（文書でいうところの目次に当たるもの）であることを示す。


サイトがひとつのテーマを取り扱う「本」や「論文」と考えてみると、それぞれのセクショニングタグの役割がわかりやすいなと思いました。