OmniAICreator/Qiita-1.07M huggingface dataset:
【PDO】プリペアドステートメントを利用してデータベースに値を挿入する方法

# はじめに
- プリペアドステートメントを利用してデータベースに値を挿入する方法について本やネットの情報から調べて理解したことをまとめました。
- もし、書いていることに何か間違いがある場合はご指摘いただけると嬉しいです。
- 以下のようなデータベースとテーブルがあると仮定して解説します。

**データベース名：** test_db1
**テーブル名：** user

|  name  |  email  |
| ---- | ---- |
|  -  |  -  |

# プリペアドステートメントを利用してデータベースに値を挿入するには`INSERT INTO`を使います
- データベースに値を挿入するには`INSERT INTO`を使います。
- `INSERT INTO`とは、データベースにレコードを挿入するためのSQL文です。

# INSERT INTOの書き方
```php
INSERT INTO テーブル名 (カラム名, カラム名, カラム名) VALUES (値, 値, 値);
```
## 解説
- `INSERT INTO`という命令を書いてからテーブル名を指定します。
- 次に、テーブル名を指定して、`()`にカラム名を並べていきます。
- 最後に`VALUES`と書いて、`()`に挿入するレコードの値を順番に入れていきます。（カラム名と値は同じ順番に書きます）

# コード例
```php
<?php

$user = "ここにユーザー名が入ります";
$password = "ここにパスワードが入ります";

$dbh = new PDO("mysql:host=localhost; dbname=test_db1; charset=utf8", "$user", "$password");

$stmt = $dbh->prepare("INSERT INTO user (name, email) VALUES (:name, :email)");

$stmt->execute(array(':name' => '太郎',':email' => 'taro@taro.taro'));
```

## 実行結果
**データベース名：** test_db1
**テーブル名：** user

|  name  |  email  |
| ---- | ---- |
|  太郎  |  taro@taro.taro  |

### 解説

```php
$dbh = new PDO("mysql:host=localhost; dbname=test_db1; charset=utf8", "$user", "$password");
```

 `new PDO()`でデータベースに接続します。データベース接続について詳しくは[こちら](https://qiita.com/e2_waka/items/fac99da7bb3d0b39878c)に書いてます。

```php
$stmt = $dbh->prepare("INSERT INTO user (name, email) VALUES (:name, :email)");
```
- `:name` `:email`は名前付きプレースホルダと呼びます。変化する値の部分を確保するものです。
- `$dbh->prepare()`で[PDO::prepare](https://www.php.net/manual/ja/pdo.prepare.php)メソッドを使ってSQL文を実行する準備をします。

```php
$stmt->execute(array(':name' => '太郎',':email' => 'taro@taro.taro'));
```
- プリペアドステートメントを実行するには、[PDOStatement::execute](https://php.net/manual/ja/pdostatement.execute.php)メソッドを使います。
- `execute()`に挿入する値を配列に格納して実行することで、データベースにデータが挿入されます。
pythonで上のディレクトリ内ファイルをimportする方法

# はじめに
普段はC++を使っているのですが，Pythonで何気なくプログラミングをしていて，ソースコードが長くなることを避けるために関数のファイルを分割して`import`をしようと思いました．

同じことで困る人もいると思ったので，素早く解決できることを願います．短気な方は[こちら](https://qiita.com/ysuzuki19/items/55e2907a7c8f06889581#改善)へジャンプしてください．

他のコードからも`import`することを見越して，

```bash:
$ tree
.
├── dir1
│   ├── mod1.py
│   ├── mod2.py
│   └── mod3.py
└── dir2
    └── main.py
```

のようなフォルダ構造でやろうと思っていました．
また，書くときに面倒にならないように，`dir1.mod1.func1()
`のようではなく，`func1()`と関数を使用できるようにしたかった．


# 問題
```py:main.py
from ..dir1 import mod1

print('import was completed!')
```
のようにすると，

```bash:error
$ python main.py 
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from ..dir1 import mod1
ValueError: attempted relative import beyond top-level package
```

と怒られてしまった．`ディレクトリに入れてないのかな`と思い，`mod1.py`を一つ上の階層に移して

```py:main.py
from .. import mod1

print('import was complated!')
```

と変更した結果，

```bash:error
$ python main.py 
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from .. import mod1
ValueError: attempted relative import beyond top-level package
```

また怒られた．

# 解決方法
調べてみると，
>　実行ディレクトリをルートとする

という仕様があるらしく，上のディレクトリにいけないらしい．
そこで，

```py:main.py
import sys
sys.path.append('../')
from dir1.mod1 import *

if __name__ == '__main__':
    importTest()
```

```py:dir1/mod1.py
def importTest():
    print('import was completed!')
```

と変更して実行すると,

```bash:run_main
$ python main.py 
import was completed!
```

できた．

# 改善
このままでは，`dir1/`内の`mod1.py`,mod2.py`,`mod3.py`全てを`import`する場合，３行要してしまうのは嬉しくなく，

```bash:folder
$ tree
.
├── dir1
│   ├── __init__.py
│   ├── mod1.py
│   ├── mod2.py
│   └── mod3.py
└── dir2
    └── main.py
```
のようにした．各ファイルの中身は以下のようにした．この書き方をすることで，関数をそのまま使うことができた．

```py:main.py
import sys
sys.path.append('../')
from dir1 import *

if __name__ == '__main__':
    importTest1()
    importTest2()
    importTest3()
```
```py:__init__.py
from .mod1 import *
from .mod2 import *
from .mod3 import *
```
```py:mod1.py
def importTest1():
    print('mod1 import was complated!')
```
```py:mod2.py
def importTest2():
    print('mod2 import was complated!')
```
```py:mod3.py
def importTest3():
    print('mod3 import was complated!')
```
この実行結果は

```bash:result
$ python main.py 
mod1 import was complated!
mod2 import was complated!
mod3 import was complated!
```
これで当初の目的が果たされた．

# Gitで使う際
以上のものを使用する際には`__pycache__`が邪魔だったため，`.gitignore`へ以下を追記．

```:.gitignore
*__pycache__/
```

# 参考
- https://chaika.hatenablog.com/entry/2018/08/24/090000
    - 上の階層のPATHを追加
- https://note.nkmk.me/python-relative-import/
    - 別ディレクトリからの`import`の仕方
- https://qiita.com/karadaharu/items/37403e6e82ae4417d1b3
    - ディレクトリ丸々`import`


# おわりに
一応希望通りの動きは果たせたのですが，応急処置感が否めないので，もっといいやり方があったら教えていただけると幸いです．
NumPy.arrayの要素演算子まとめ

NumPyのarrayはリストを拡張したクラスで、要素演算子[]に非常に多様な使い方がある。なのでここでまとめて置こうと思う。

#数字を指定する
基本的にリストと同様の使い方ができる。

```python:2次元配列
# 1つだけ取り出す
myarray = xx[10,13]

# 0行目から10行目を取り出す
myarray = xx[0:10,:]

# 2列目から4列目を取り出す
myarray = xx[:,2:4]
```

#配列を入れる
リストやタプルで取り出す成分を複数指定することもできる。結果は1次元で返ってくる。

```python
# yyにある第(0,1),(1,2)成分を取り出す
yy = [[0,1],[1,2]]
myarray = xx[yy]
```

#条件式を入れる
条件式を入れることで、条件を満たす要素を取り出すことができる。結果は1次元で返ってくる。

```python
# 0.5以上の要素を返す
myarray = x[x>0.5]
```

# 参考サイト
* Numpyのファンシーインデックス(Fancy Index)で配列を自由に操作する<br>
https://qiita.com/python_walker/items/a0b337b05b458644eb33<br>
こういう操作はファンシーインデックスと言うらしい。
【初心者用】LaravelをMacにインストール

# はじめに
PHPのフレームワーク```Laravel```をMacにインストールしていきます。

Laravelのインストールには、
PHPのライブラリ管理ツール```Composer```を使用します。
Composerをインストールする時には、
```Homebrew```というパッケージ管理ツールを使うので、
それに伴い、PHPもHomebrewでインストールしておく必要があります。

下記の記事を参考にPHPをHomebrewでインストールしておいてください。
> 参考：https://qiita.com/5ryo_ryo5/items/f38edd2b5ed3e30e7760

# 目次
1. Homebrewをアップデート
2. Composerをインストール
3. パスを通す
4. Laravelアプリ作成
5. Laravelアプリ起動


## 1. Homebrewをアップデート
一応Homebrewをアップデートして起きます。

```:terminal
$ brew upgrade
```

## 2. Composerをインストール
Homebrewを使って、```Composer```をインストールしていきます。

```:terminal
$ brew install composer
==> Downloading https://getcomposer.org/download/1.8.5/composer.phar
######################################################################## 100.0%
🍺  /usr/local/Cellar/composer/1.8.5: 3 files, 1.8MB, built in 14 seconds
```

バージョンを確認していきましょう

```:terminal
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.8.5 2019-04-09 17:46:47
```
超かっこいいじゃん、これ笑！

## 3. パスを通す
どこでも使えるようにパスを通していきましょう

```:terminal
$ export PATH="$PATH:$HOME/.composer/vendor/bin"
```

以下のコマンドで変更を反映

```:terminal
$ source ~/.bash_profile
```

## 4. Laravelアプリ作成
さっそくLaravelアプリ作成していきましょう！

Laravelアプリは、指定のディレクトリで```laravel new アプリ名```で作成できます。

```:terminal
# 指定のディレクトリに移動
$ cd 指定のディレクトリ名

# Laravelアプリ作成(test_appというアプリ名で作成)
$ laravel new test_app
Crafting application...

〜〜〜だいぶ省略〜〜〜

Application ready! Build something amazing.
```

```Application ready! Build something amazing.```
となれば、アプリ作成完了です！

追記：```laravel new test_app```だと、ダウングレードすることがあるらしく、```composer create-project laravel/laravel:5.5.* test_app --prefer-dist```で、アプリ作成した方が良いみたい

## 5. Laravelアプリ起動
先ほど作成したアプリのフォルダに移動し、
```php artisan serve```で起動してみましょう！

```:terminal
#作ったアプリのディレクトリに移動(上記で作ったtest_appに移動)
$ cd test_app

#アプリを起動
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

http://127.0.0.1:8000
にアクセスしてみましょう！
![Alt text](https://gyazo.com/35b678f320bef5a7468c128d1f3d8264.png)

このページが表示されていれば、起動できてます！

ちなみに終了する際は、```control + C```で終了できますぅ〜

### 参考サイト
https://qiita.com/igz0/items/bd5ab0aedc75d8476c76
今更ラムダ式について雑に説明してみる

#はじめに
初めて記事書くので間違ってたり誤字ってたら教えてください。

今回は、今更ラムダ式について解説してみようと思います。タイトルまんまですね。

###そもそもラムダ式って？
ラムダ式というのは超絶ざっくりいうと、**簡単にメソッドを記述できるすげー奴**です。

#なんかよくわからんがとりあえず使おう
なんかこれだけじゃよくわかりませんね。まぁとりあえず使ってみます。

```LamdaTest.cs
using System;
using UnityEngine;

public class LamdaTest : MonoBehaviour {
	// デリゲート型を定義
	delegate void Hoge(string x);

	private void Start() { 
		// デリゲート型の変数を宣言して匿名関数を代入
		Hoge hoge = (x => Debug.Log(x));
		//hogeに代入された関数を実行
		hoge("Hello World!!");
	}
}

```

はい、またしても意味がわかりませんがここからは細かく解説してきます。

``delegate void Hoge(string x);``
まずこの部分がわからない方は、今回は知ってる程で行くので[ここ](https://ufcpp.net/study/csharp/sp_delegate.html)とか見るなりして調べてくみてださい。

気を取り直して解説します。
デリゲートの登録は

```cs
private void Start() {
	Hoge hoge = Piyo;
}

void Piyo(string x) {
	Debug.Log(x);
}
```
のように関数を登録しますが、
毎回これだけのために関数定義するの**面倒くさい**です。すごく

なので、名前とか付けないでそこでしか使わない関数書きたいです。
そんな時に

```cs
private void Start() {
	Hoge hoge = (引数 => 処理);
}
```
的な感じで名前とか付けないで引数と処理だけ書けるようにしたのがラムダ式です。
`(引数 => 処理)`のところはかっこ無くても構いません。

```cs

((引数) => {
	処理
	処理
})
```
みたいにも書けます。割と自由

<br>
このラムダ式の凄いところ、それは引数を

```cs
Action<int> action = (x => //処理);
```
のように型を省略できるところです。
`var`ってありますよねあれみたいに引数を推測してくれます。なかなか慣れないかもしれませんが、慣れるとストレスフリーに気持ちよく書けるようになります。

#なんかもうざっくり言うと

```cs
using System;
using UnityEngine;

public class LamdaTest : MonoBehaviour {
	delegate void Hoge(string x); //デリゲートHogeは引数にstringを持つ、これ絶対
	private void Start() {

		Hoge hoge = x => Debug.Log(x);//これがラムダ式
				  //引数 => 処理の流れがあれば基本動く
				  //Hogeは絶対に引数にstringとるからラムダ式での引数も勝手にstringになる
				//   これだけ覚えとけばなんとかなる
		hoge("Hello World!!");
	}
}

```

これだけ覚えとけばなんとかなります。長い処理なら{}で囲んだり、複数ある引数を()で囲んでおくなりして見やすく書くと吉

こんなかんじですかね。

#感想？
タイトル通りめっちゃ雑な説明になっちゃいましたが、初めてのアウトプットができたので個人的には満足です。
書き終えても未だに間違ってる気がして仕方ないので間違ってたら教えてください。本当にお願いします。
ステートフルとステートレスの比較

ステートフル、ステートレスの詳解は他の記事に譲り、ここでは SMTP と HTTP を例にして、
具体的な挙動を比較してみたいと思います。

# 一般的なお話

##セッションの状態

- 一連のインタラクティブな操作(session)における各状態(state)のこと。

## ステートフル

- サーバがクライアントのセッションの状態を**保持している**、という制約のこと。
  - **特徴**: セッションの状態によってリクエストに対するレスポンスが変わる。
  - **例**: FTP, SMTP

## ステートレス

- サーバがクライアントのセッションの状態を**保持しない**、という制約のこと。
  - **特徴**: リクエストに対するレスポンスが変わらない。
  - **例**: HTTP

# ステートフル と ステートレス の比較

では、サーバが一連のインタラクティブな操作における各状態を保持している・保持していないとはどういうことか、具体的に、

- メールを送信する操作 (SMTP) 
- Webページを取得する操作 (HTTP)

を例にして挙動を確認してみます。

## SMTP の場合

メールを送信する場合は以下のような `手続き` が必要となる。
(localhost が サーバで、telnet コマンドでセッションを張っている。)


```shell
$ telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix
helo example.com ★
250 example.com
mail from: sender@example.com ★
250 2.1.0 Ok
rcpt to: recipient@example.com ★
250 2.1.5 Ok
data ★
354 End data with <CR><LF>.<CR><LF>
Message-id: aaaa@bbbbc ★
From: <sender@example.com> ★
To: <recipient@example.com> ★
 ★
test mail ★
. ★
250 2.0.0 Ok: queued as 89F9E1A0058
exit ★
221 2.0.0 Bye
Connection closed by foreign host.
```

- ★は手動入力した内容（つまり、クライアントから送信された内容）
- メールの送信には、 `helo ...` => `mail from: ...`  => `rcpt to: ...` => `data ...` => `. (ドット)` という一連の操作(手続き)を実行する必要がある。
- 各操作には 2XX や 3XX などのサーバからのレスポンスが存在する。

ここで意図的に操作の順番を変更してみる。
例として、`rcpt to: ...` を入力せずに `data` コマンドを実行すると、

```shell
$ telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix
helo example.com ★
250 example.com
mail from: sender@example.com ★
250 2.1.0 Ok
data ★
554 5.5.1 Error: no valid recipients
```

`554 5.5.1 Error: no valid recipients` のレスポンスが返ってくる。
つまり、サーバが `rcpt to: ...` の情報（セッションの状態）を保持しているため、
エラーを返してきたことになる。

## HTTP の場合

一方、HTTP の場合、Web ページを取得する場合は、

```shell
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1 ★
Host: localhost ★

HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)

（省略）

<!DOCTYPE html>
<html>

（省略）

</html>
```

- ★は手動入力した内容（つまり、クライアントから送信された内容）
- リクエスト (GET) => レスポンス (200 OK ...) で手続きが完結。
- SMTPのように複数の `手続き` を踏む必要はなく、その時の状態も保持していない。

# 参考

- [Webを支える技術](https://www.amazon.co.jp/o/ASIN/4774142042/gihyojp-22)
- [HTTP の概要 - HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Overview)
- [Use Telnet to test SMTP communication on Exchange servers \| Microsoft Docs](https://docs.microsoft.com/en-us/exchange/mail-flow/test-smtp-with-telnet?view=exchserver-2019)

以上。
picoCTF writeup (now you don't)

pngファイルが渡される．
一見するとただ一面赤い色で塗られた画像に見える．

[このサイト](https://www.peko-step.com/tool/alphachannel.html)で画像の透過ができる．
適当な箇所の色を透明にすると，フラグが表示される．
フラグの文字とそうでないところで，RGBの1ビットしか違いがなかったからわからなかったのである．
【2分でイメージをつかむ】Node.jsのサーバー起動

## なんでこれ書いたか
- 100万回こすられてきた、Node.jsのサーバー起動のイメージを自分のために残したかったから
- JavaScriptでサーバーサイドを書くというのが、イメージしづらかったから

## 最初に完成品を

<img width="281" alt="スクリーンショット 2019-05-19 18.02.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247053/f379178b-485c-c6d9-e025-18ed363a7ed4.png">

※「Hello! World」が相場かと思いますが、私のイメージでは、
このサーバーは野球のキャッチャーです!

![キャッチャー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247053/b281b025-278e-5e00-6741-029e4351a060.jpeg)

## 続いてソースコード
playball.js

```javascript

// ライブラリ類のロード(今回はhttpオブジェクトを呼ぶ)
var http = require('http');
// httpオブジェクトの「createServer」メソッドを呼び出す
// Node.jsの「サーバー」となる部分
var server = http.createServer();

// ピッチャーがストレート（request）を投げてきたら,キャッチャーは叫ぶ（doRequest）
server.on('request', doRequest);

// キャッチャーはストレート投げてこいよ！（=8000番ポート開けて待ってるからね）とキャッチャーミットを構える（listenする）
server.listen(8000);

// リクエストの処理（= ピッチャーがストレート投げてきたときのキャッチャーの挙動を書く）
function doRequest(req, res) {
	res.writeHead(200, {'Content-Type': 'text/plain'});
	res.end('Nice Ball!!!');
}

// このファイルが呼び出されたとき試合開始（プレイボール！）
console.log('プレイボール！（と審判が言った）');

```

## 早速、試合開始

### プレイボール！
```console
$ node playball.js
```

```console
> プレイボール！（と審判が言った）
```

### キャッチャーは準備を始める

```javascript

// サーバーを立てないと！（キャッチャーミットとか装備）
var http = require('http');
var server = http.createServer();
```

### キャッチャーは深呼吸する

```javascript

// ピッチャーがストレート（request）を投げてきたら,叫ぶぞ！（doRequest）
server.on('request', doRequest);
```

### キャッチャーミットを構える

```javascript

// キャッチャーはストレート投げてこいよ！（=8000番ポート開けて待ってるからね）（待ち受け状態）
server.listen(8000);
```

### ピッチャーが渾身のストレートを投げる

```javascript

// リクエストの処理が発動（= ピッチャーがストレート投げてきたときのキャッチャーの挙動!）
function doRequest(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Nice Ball!!!');
}
```

### NiceBall!!


### おわりに
- もっといいイメージが湧いたら書き直します

## 参考
- [Express(Node.js)チュートリアル](https://qiita.com/MASAYUKIABE/items/856172b2958701d42808)
- [初心者のための Node.jsプログラミング入門](https://www.tuyano.com/index3?id=1126003)
UIImage, NSAttributedStringのテスト方法

# はじめに

FBSnapshotTestCaseを拡張してUIImage, NSAttributedStringの検証を行う方法です。

```swift
extension FBSnapshotTestCase {
```

## UIImageを検証するメソッド

```swift
func FBSnapshotVerifyImage(_ image: UIImage, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) {
    FBSnapshotVerifyView(UIImageView(image: image), identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line)
}
```

## NSAttributedStringを検証するメソッド

```swift
func FBSnapshotVerifyAttributedString(_ string: NSAttributedString, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) {
    let label = UILabel()
    label.attributedText = string
    label.numberOfLines = 0
    label.sizeToFit()
    FBSnapshotVerifyView(label, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line)
}
```

## 検証方法

```swift
    FBSnapshotVerifyImage(UIImage(named:"hogehoge"))

    let string = NSMutableAttributedString(string: "あいう")
    ....
    FBSnapshotVerifyAttributedString(string)
```
Leetcode #52: N-Queens II

```swift
func totalNQueens(_ n: Int) -> Int {
    if n == 0 {
        return 0
    }
    var board: [[Character]] = Array(repeating: Array(repeating: ".", count: n), count: n)
    var answer = 0
    helper(board, 1, n, &answer)
    return answer
}

private func helper(_ board: [[Character]], _ queen: Int, _ n: Int, _ answer: inout Int) {
    if queen > n {
        answer += 1
        return
    }
    for i in 0..<n {
        if board[queen-1][i] == "." {
            var tmp = board
            tmp[queen-1][i] = "Q"
            for x in stride(from: queen, to: n, by: 1) {
                tmp[x][i] = "X"
            }
            var x = queen
            var y = i + 1
            while x < n && y < n {
                tmp[x][y] = "X"
                x += 1
                y += 1
            }
            x = queen
            y = i-1
            while x < n && y >= 0 {
                tmp[x][y] = "X"
                x += 1
                y -= 1
            }
            helper(tmp, queen+1, n, &answer)
        }
    }
}
```
PHP7とスカラー型宣言とわたくし（メモ）

# 問題
引数をintで宣言しているのに、intではない値で関数を呼び出せてしまうのですが・・・
（なぜ例外が発生しないの？）

# 結論
・PHPファイルの先頭行に

~~~ php
declare(strict_types=1);
~~~

を書くと厳密な型チェックが行われるので、型宣言と異なる引数で実行しようとした場合、例外が発生する。ただし、有効になるのは
>それを有効にしたファイル の中からの関数呼び出しだけです。

・コード規約等で「厳密な型チェックモードで開発する」ように取り決めておく

# 気持ち
せめてphp.ini で設定できるようにしてくれんか
ゆるい型でスカラー型宣言する意味、ある？


# 前提となる話（参考）
## PHPマニュアル関連ページ
- PHP 型の比較表
https://www.php.net/manual/ja/types.comparisons.php

- PHP 5.6.x から PHP 7.0.x への移行 (新機能)
https://www.php.net/manual/ja/migration70.new-features.php

- 強い型付け
https://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict

## 参考記事
- [PHP] 型宣言(PHP7)
https://qiita.com/hikaru_/items/2c12068eafea75e51cce

- declare(strict_types=1)の効力範囲について
https://qiita.com/Hiraku/items/734f0666ab3d34c52efa

- お前は PHP 7 における Fatal Error / Catchable Fatal Error / Error / ErrorException / Exception の違いを言えるか？
https://qiita.com/mpyw/items/c69da9589e72ceac470c


# 具体例
以下のようなPiyoクラスがあり、hogeメソッドの第一引数はint型宣言しているので、
整数の1、2以外の引数でこのメソッドを呼び出した場合、例外が発生して欲しい気持ちです。

~~~ php

class Piyo{
    /**
     * @param int $fugaId
     * @param array $data
     * @return array
     */
    public function hoge(int $fugaId, array $data)
    {
        switch ($fugaId) {
            case 1:
                return $this->type1($data);
                break;
            case 2:
                return $this->type2($data);
                break;
            default :
                throw new \InvalidArgumentException();
                break;
        }
    }
}
~~~

以下の要領でテストを書く

~~~ php
class PiyoTest extends PHPUnit\Framework\TestCase{
    /**
     * @dataProvider hogeDataProvider
     * @param $fugaId
     */
    public function testHoge($fugaId){
        $object = new Piyo();
        $actual=$object->hoge($fugaId,[]);
        try{
            $this->assertTrue(is_array($actual));
        }catch(\Error $e){
            //本当は、型が違う場合はこっちを通ってほしい

        }catch(\Exception $e){
            //整数で、1、2以外の値の場合はここを通ってほしい
        }

    }

    /**
     * テストケース
     */
    public function hogeDataProvider()
    {
        return [
            [1],//当然成功してよい
            [2],//当然成功してよい
            [1.5],//成功してしまう
            ["1"],//成功してしまう
            ["2"],//成功してしまう
            [true],//成功してしまう
        ];
    }
}
~~~

コメント中にもある通り、1.5、"1"、TRUE、などは暗黙の型変換でintの1扱いとされるので、結果hogeメソッドは例外を発生させずに、正常に実行できてしまう。

PHPの動きとしては当然そうなんでしょうけど、非常にアレですよね
[Flutter] Flutter WebでURLが遷移時に変わるようにする方法

## [Navigate with named routes](https://flutter.dev/docs/cookbook/navigation/named-routes)を使う

下記のようにroutes、initialRouteを使用するように変更して

```dart
MaterialApp(
  initialRoute: '/',
  routes: {
    '/': (context) => FirstPage(),
    '/second': (context) => SecondPage(),
  },
);
```

下記のようにpushNamedを利用して遷移することでURLが変わるようになるようです。

```dart
onPressed: () {
  Navigator.pushNamed(context, '/second');
}
```

## [Navigate with named routes](https://flutter.dev/docs/cookbook/navigation/named-routes)で書き換えてみた
以前書いた[[Flutter] 既存のFlutterのコードをFlutter Webで動かしてみた](https://qiita.com/hiko1129/items/7cb497fd219039f9f4f8)を[Navigate with named routes](https://flutter.dev/docs/cookbook/navigation/named-routes)で書き換えてみました。


https://hiko1129.github.io/flutter-basic-layout/


![navigate-with-named-routes.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/f4e292e8-ba90-60b3-6ff8-61f611504f92.gif)
ちゃんとURLが変わるようになりました!
php-master-changes 2019-05-18

今日はテストで使うデータファイルのリネーム、ext/enchant の pkg-config への移行、ドキュメントの整理、字句解析器用の定義ファイルのリネーム、makedist スクリプトのリファクタリングがあった！

# 2019-05-18
## petk: Use *.data for tests data files
- https://github.com/php/php-src/commit/83bfbc290376da07a4aa51595b9eaad7e608f0f6
- [7.4~]
- テストで使うデータファイルを拡張子 .data にリネーム

## hughmcmaster: Use PKG_CHECK_MODULES to detect the Enchant library
- https://github.com/php/php-src/commit/0655191a9c486290bc7ccfb4305625ee9ce4bad8
- ext/enchant で、依存ライブラリチェックを pkg-config へ移行

## petk: Add enchant pkg-config notice in UPGRADING
- https://github.com/php/php-src/commit/0f7d641724d2f36548256fef9f1adcd1c9208bcc
- [7.4~]
- ↑を UPGRADING へ追記

## petk: Move copyright/license headers to CONTRIBUTING.md
- https://github.com/php/php-src/commit/63ef554fe48a042088066fc97a7422cbfe983205
- [7.4~]
- 新しいソースコードへ付ける用のテンプレライセンス文言 header と zend/header を CONTRIBUTING.md へ統合

## petk: Rename *.l files to *.re
- https://github.com/php/php-src/commit/969047749d33bb88a0573aa91a57e2070335111a
- [7.4~]
- re2c に食わせる字句解析器用の定義ファイルを *.l から *.re へ改名

## petk: Enhance makedist script
- https://github.com/php/php-src/commit/29bff939c7bb2385b3ec2c6e610bc921360a8a4b
- [7.4~]
- makedist スクリプトの改善
- snapshot 作成スクリプトとの統合
- リファクタリングや help 追加等
ABC - 016 - A&B&C

#AtCoder ABC 016 A&B&C
[AtCoder - 016](https://atcoder.jp/contests/abc016)

#A - 12月6日

```java
	private void solveA() {
		int m = nextInt();
		int d = nextInt();
		out.print(m % d == 0 ? "YES" : "NO");
	}
```

#B - A±B Problem

```java
	private void solveB() {
		int a = nextInt();
		int b = nextInt();
		int c = nextInt();

		boolean p = a + b == c;
		boolean m = a - b == c;

		if (p && m) {
			out.println("?");
		} else if (!p && !m) {
			out.println("!");
		} else if (p && !m) {
			out.println("+");
		} else if (!p && m) {
			out.println("-");
		}

	}
```

#C - 友達の友達

 - 無向グラフの頂点間の距離を求める
    - 友達を頂点とする
    - 友達との距離は1（友達間の距離は同じ）
    - 友達の友達は頂点間の距離が2
    - 友達の友達の友達は頂点間の距離が3

そろそろワーシャルフロイド法以外での解き方覚えないと。。。

```java
	private void solveC() {
		int n = nextInt();
		int m = nextInt();

		int[] a = new int[m];
		int[] b = new int[m];
		int[][] graph = new int[n][n];
		for (int i = 0; i < n; i++) {
			//MAXで埋めておく
			Arrays.fill(graph[i], Integer.MAX_VALUE / 2);
			//自分への移動コストは0
			graph[i][i] = 0;
		}
		for (int i = 0; i < m; i++) {
			a[i] = nextInt() - 1;
			b[i] = nextInt() - 1;
			//隣接行列の作成
			graph[a[i]][b[i]] = 1;
			graph[b[i]][a[i]] = 1;
		}

		//ワーシャルフロイド法
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				for (int k = 0; k < n; k++) {
					graph[j][k] = Integer.min(graph[j][k], graph[j][i] + graph[i][k]);
				}
			}
		}

		/*
		 * 自分からの移動コスト
		 * 1=友達
		 * 2=友達の友達
		 * 3=友達の友達の友達
		 * 4=友達の友達の友達の友達・・・
		 * 以下続く
		 */
		for (int i = 0; i < graph.length; i++) {
			int res = 0;
			for (int j = 0; j < graph.length; j++) {
				res += graph[i][j] == 2 ? 1 : 0;
			}
			out.println(res);
		}
	}
```
Leetcode #51: N-Queens

```swift
func solveNQueens(_ n: Int) -> [[String]] {
    if n == 0 {
        return [[]]
    }
    let board: [[Character]] = Array(repeating: Array(repeating: ".", count: n), count: n)
    var answer = [[String]]()
    helper(board, 1, n, &answer)
    return answer
}

private func helper(_ board: [[Character]], _ queen: Int, _ n: Int, _ answer: inout [[String]]) {
    if queen > n {
        var ar = [String]()
        for i in 0..<n {
            var str = String()
            for j in 0..<n {
                if board[i][j] == "X" {
                    str += "."
                } else {
                    str += String(board[i][j])
                }
            }
            ar.append(str)
        }
        answer.append(ar)
        return
    }
    for i in 0..<n {
        if board[queen-1][i] == "." {
            var tmp = board
            tmp[queen-1][i] = "Q"
            for x in stride(from: queen, to: n, by: 1) {
                tmp[x][i] = "X"
            }
            var x = queen
            var y = i + 1
            while x < n && y < n {
                tmp[x][y] = "X"
                x += 1
                y += 1
            }
            x = queen
            y = i-1
            while x < n && y >= 0 {
                tmp[x][y] = "X"
                x += 1
                y -= 1
            }
            helper(tmp, queen+1, n, &answer)
        }
    }
}
```
JavaでEnum Strategy パターン


オブジェクトを生成する際、if文やswitch文を使って条件分岐させるのではなく、enumを使うとコードがスッキリすることがあると思います。

以下、鳴き声を入力すると、それに対応する動物を返すEnumの実装例です。


```java:AnimalCreator.java
public enum AnimalCreator {

	CAT("nyaa", Cat::new), 
	DOG("waon", Dog::new), 
	BIRD("pii", Bird::new);

	private String nakigoe;
	private Supplier<Animal> create;

	AnimalCreator(String nakigoe, Supplier<Animal> creator) {
		this.nakigoe = nakigoe;
		this.create = creator;
	}

	//鳴き声からAnimalを逆引きするMap
	private static final Map<String, AnimalCreator> map = 
			Stream.of(AnimalCreator.values())
				.collect(Collectors.toMap(a -> a.nakigoe, a -> a));
	//factory method
	public static Animal of(String nakigoe) {
		return Optional.ofNullable(map.get(nakigoe))
				.map(a -> a.create.get())
				.orElseThrow(IllegalArgumentException::new);
	}

}
```


呼び出し側はこのようになります。条件分岐がないので、コードがスッキリしました。

```java:main.java		
    Animal cat = AnimalCreator.of("nyaa");
    Animal dog = AnimalCreator.of("waon");
    Animal bird = AnimalCreator.of("pii");

    Animal mouse = AnimalCreator.of("chu");
    // java.lang.IllegalArgumentExceptionが発生
```
GoとDockerでscratchを使うときに気をつけること

# TL;DR
- cgoに気をつける
- ルートCA証明書に気をつける
- timezoneに気をつける
- [2020/08/12追記] Go 1.15ではtimezoneは[tzdata](https://golang.org/pkg/time/tzdata/)をインポートするだけで良い
    - https://golang.org/doc/go1.15#time/tzdata

# はじめに
　DockerはDockerfileの`FROM`に[scratch](https://hub.docker.com/_/scratch)を指定できます。`scratch`はその名の通り何も入っていないためこれをベースにイメージを作れば非常に軽量になります。基本的にマルチステージビルドを利用してビルドします。

　Goは`libc`に非依存のため静的リンクをするとバイナリ一つを持ち歩くだけで済みます。ですがいくつか気をつけないと困ることがあるためそれをまとめます。

## cgo
　唐突ですが、先ほどGoは`libc`に非依存だと言いましたがあれは嘘です。Go1.4から`net`パッケージなどでおそらく速度向上のためデフォルトでは`libc`に依存しています。そのため、利用可能な環境では`cgo`を利用してdynamic linkを行なっているようです。

```
root@d466ec4c1889:/go/src# cat main.go 
package main

import "net/http"

func main() {
        http.ListenAndServe(":9090", nil)
}
root@d466ec4c1889:/go/src# go build main.go 
root@d466ec4c1889:/go/src# ldd main
        linux-vdso.so.1 (0x00007ffca11f5000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5c65afe000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c6575f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5c65d1b000)
root@d466ec4c1889:/go/src# 
```

　しかしこれでは`scratch`ベースのイメージに持ってきた際に動かなくなり非常に不便です。解決策として`cgo`を切ります。`go build`等を利用してビルドすると思いますが、その際に

```
CGO_ENABLED=0
```

の環境変数を渡すと`cgo`が無効化されてビルドされます。
Dockerのマルチステージビルドを利用してビルドした場合は

```dockerfile
ARG CGO_ENABLED=0
```
を`go build`の前に書いておけば大丈夫です。

## ルートCA証明書
　HTTPSでサーバに対して通信する際、サーバ側の証明書が正当なものか検量するために各システムにはルートCA証明書が保存されています。しかし、`scratch`にはそれがありません。安全にHTTPS通信を行うためにはこれが必要です。
　Goがどこに保存されているルートCA証明書を参照するかは[crypto/x509/root_linux.go](https://golang.org/src/crypto/x509/root_linux.go)に保存されています。Linuxに関してはこれです。
　このファイルを別のイメージから持って来る必要があります。

```dockerfile
COPY --from=golang:1.12 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 
```

Dockerの`COPY --from`はステージだけでなくイメージも利用できます。ステージではなくイメージを利用しているのはBuildkit等を利用した際並列化がしやすそうであるからで、`golang` イメージを利用しているのはマルチステージでビルドするためのイメージとして利用している可能性が高いからです。デフォルトで`/etc/ssl/certs`を持っていれば他のイメージでも大丈夫です。

## タイムゾーン
　Goがデフォルトのタイムゾーンを決定する仕組みについては[Golangのローカルのタイムゾーンが決まる仕組みと指定方法](https://qiita.com/shoichiimamura/items/a080975c6c7e23498944)という記事がよく纏まっていてわかりやすかったです。

　簡単に説明するとUNIX環境においては、`TZ`環境変数で指定がなければ`/etc/localtime`を読みに行き、これが失敗すれば`UTC`。UTC以外を取得した場合は[time/zoneinfo_unix.go](https://golang.org/src/time/zoneinfo_unix.go)の`zoneSources`のリスト内のデータを利用してゾーンネームとオフセットの変換を行なっているようです。(Asia/Tokyo→+09:00など)

　Dockerにおいては`/etc/localtime`はなくとも`TZ`環境変数を指定すれば問題ありませんが`zoneSources`がないとデータベースを使うときなどに面倒なことになりがちです。

これも先ほどと同じように

```dockerfile
COPY --from=golang:1.12 /usr/share/zoneinfo /usr/share/zoneinfo
```

でコピーできます。また、別の解決策としてファイルをコピーせずに`time.Local`に直接コードから指定することもできます

### Go 1.15の場合[2020/08/12追記]
日本時間2020/08/12でGo 1.15がリリースされました。Go 1.15では`time/tzdata` パッケージが追加されました。Go 1.15以降では

```go
import _ "time/tzdata"
```
のようにインポートするとシステム上に存在しなくてもtzdataパッケージを参照してくれます。

参照: https://golang.org/doc/go1.15#time/tzdata


## alpineの場合
`scratch`ほどでないものの`alpine`はかなり軽量なイメージです。同じくデフォルトだと存在しませんが、パッケージマネージャがあるので

```sh
apk add --update --no-cache ca-certificates tzdata
```
このように追加できます。

# まとめ
`scratch`でイメージを作る際に私が苦労した点と解決策をまとめました。
他にも何かあれば追記していこうと思います。`scratch`とGoで快適なDockerライフを！
【初心者用】Homebrewを使って、PHPをインストール

# やること
Homebrewを使って、```PHP7.2```をインストールしていきます。

# 目次
1. Homebrewをアップデート
2. PHPのバージョン確認
3. HomebrewでインストールするPHPパッケージを確認
4. Homebrewを使って、```PHP7.2```をインストール
5. バージョン確認

## 1. Homebrewをアップデート
一応Homebrewをアップデートして起きます。

```:terminal
$ brew upgrade
```

Homebrewをインストールしていない方は、インストールしておいてください。
> 参考サイト：https://qiita.com/naente_dev/items/1195ff834c65be4be5a6

## 2. PHPのバージョン確認
PHPインストール前に```php -v```でバージョンを確認しておきましょう。

```:terminal
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:08:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

## 3. HomebrewでインストールするPHPパッケージを確認
```brew search php```で、インストールできるPHPのバージョンを確認しましょう！

```:terminal
$ brew search php
==> Formulae
brew-php-switcher             php-code-sniffer              php@7.1                       phplint                       phpmyadmin                    phpunit
php                           php-cs-fixer                  php@7.2                       phpmd                         phpstan

==> Casks
eclipse-php                   eclipse-php                   netbeans-php                  netbeans-php                  phpstorm                      phpstorm
```

## 4. Homebrewを使って、```PHP7.2```をインストール
PHPの7.2をインストールするので、上で確認した```php@7.2```をインストールしていきます。

```:terminal
$ brew install php@7.2
```

インストール完了後、```php -v```でバージョンを確認しましょう。

```:terminal
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:08:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

あれ？？変わってない。。

インストール後は、必ずパスを通さないといけませんね！

```:terminal
$ export PATH="/usr/local/opt/php@7.2/bin:$PATH
```

一応、使用するパッケージを指定しておきます。

```:terminal
$ brew link php72
```

既に、Homebrewを使って、PHPをインストールしている場合は、```unlink```してから、
上記のコマンドでバージョンを切り替えてください。

```:terminal
$ brew unlink php71 #PHPバージョン7.1のパッケージにlinkしてる時
```

## 5. バージョン確認
```:terminal
$ php --v
PHP 7.2.18 (cli) (built: May  2 2019 13:03:01) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.18, Copyright (c) 1999-2018, by Zend Technologies
```

できた！！！


### 参考記事
https://qiita.com/saken649/items/b5830de62211b600f7ee
https://qiita.com/igz0/items/bd5ab0aedc75d8476c76
Pythonで計算アプリ作成

# github
  [keisan.py](https://github.com/Progwan/keisan.py)
* * *
# どんなもの？
 - コマンドライン上で計算問題が解ける
 - 解析や円グラフ表示も可能

* * *
# エラー
  Webサーバーが働かない
* * *
## 対処法
  これはシンプルです。
  **webサーバーを使わない！！** 
<br><br><br><br><br><br><br><br>
  .   .   .    対処に困っている方すみません。
* * *
# これからやりたいこと
  - どんどん機能を増やす。
SolidWorksとノートPC

###一般ノートPCでSolidWorksとイチャコラする話

よくある構成のノートPCでSolidWorks動かしたらどう？っていう内容です。
以前グラフィック関係でSolidWorksが落ちた話も書いときます。

###普段の環境
・Windows10 Home 1809
・CPU：i7 7500U
・RAM：8GB（→16GB）
・GPU：intel HD Graphics 620

###CPU関係
　当然グラフィックのサポートがないので、レンダリング系の処理はクソ重い。
Part作成、Assemblyの作成でQuadro積んだPCと差を感じたことはあまりない。複雑極まりないPartを作ったことないっていうのもあるけど。
それよりも、CPUスペックの差のほうが体感的には大きい気がする。intel core i HQシリーズ以上のCPUだと明らかにスケッチ修正した後のPartの再構築が速い。特に関数で形状を出してる歯車系なんかでは、数値いじって再構築した時の速度に差が出る。

また、エッジの選択などでかなりの数のエッジを選択しているときとかのグリグリ動かす動作でノートPCはもたつく。中でもintel core Uシリーズは遅い。しょうがないけど。

###RAM
　8GBだとChromeとかで調べ物しながらスケッチ引いてるだけで、SolidWorksの警告出ることが多数あった。正直SolidWorksの警告がストレスで後から8GB足しました。
仮想メモリ設定で改善するところでもあるんだけど、根本的には解決していないし、解析を回したりだとかほかのソフトを裏で立ち上げようと思ったら、12GB以上は欲しい。

###GPU
　intel HD Graphics 620なのでもちろん非正式対応。エラーが出ることがある。

SolidWorks2017では、通常通りにSolidWorks2017を立ち上げて、スケッチを開始するとSolidWorksが落ちるエラーが一部PCで出ていた。（確か、SP3だった気がする）

自分の知る限りではHD Graphics 520 ,HD Graphics 620が原因みたいで、これらのGPUが載るPCにのみエラーが発生していた。
「SolidWorks　スケッチ　エラー」などで検索してもなかなか解決せず困っていたところ、通りすがりのツイッタラーに

「SolidWorks > システムオプション(歯車アイコン) > パフォーマンス > ソフトウェアOpenGLを使用　にチェックを入れる」

事でエラーを回避できると教えてもらい無事解決した。
　OpenGLは3Dモデルの描画などに使われるGPUのプログラムの規格で、どうもそのあたりで動作が不安定になっていた模様。（プログラム系には明るくないので詳しくは知らない）
要はGPU計算させるとエラーが起こるから、CPUでGPUがやるはずだった計算もさせましょって話らしいんだけど、CPU側で処理させる分動作がメチャクチャ重くなる。正直使ってられないくらい重かった。
　特にAssemblyの回転などで、3Dモデルがグリグリ動くような場面ではマウスでの入力に画面表示が全くついてこない。2~3秒のラグはデフォ、一部透過表示させようものなら、SolidWorksが反応しなくなることもしばしばあった。
　しかもこの問題、3Dモデルの座標計算そのものが重たくなってるから、モデルの表示を設定を落として軽くしてもあんまり動作が改善しない気がした。

###まとめ
普通のノートPCでもSolidWorksは動くけど、メモリは16GBくらいあったほうがいい
sambaのインストールからWindowsで見れるようになるまで

## はじめに
自宅サーバのクリーンインストールを行ったらsambaの設定に躓いたので一連の流れを自分用に記録。

## 環境
  - OS: Ubuntu 18.04 64bit

## sambaのインストール
```bash
sudo apt install samba
```

## 共有フォルダの作成
```bash
sudo mkdir /home/Share
sudo chmod 777 /home/Share
```

## sambaの初期設定
```bash
sudo nano /etc/samba/smb.conf
```

以下、追加した部分のみ

```bash:smb.conf

[global]

## Browsing/Identification ###
  # 文字コード設定
  unix charset=UTF-8 
  dos charset=CP932

  # ネットワーク一覧に共有フォルダを表示させない(アドレスを指定してのアクセスは可)
  browseable = no

# /home/xxx(ログインユーザ名)フォルダの共有設定
[homes]
  # 作成ユーザ以外が読み書き実行できないパーミッション設定
  create mask = 0700
  directory mask = 0700
  # 読み書き可
  writeable = yes

[Share]
  # 先程作成したディレクトリを指定
  path = /home/Share
  # すべてのユーザが読み書き実行できるパーミッション設定
  create mask = 777
  directory mask = 777
  # 読み書き可
  writeable = yes
```

## sambaユーザの追加
```bash
pdbedit -a ユーザー名
# パスワードを求められるので、2回入力
```

## sambaサービスの再起動
```bash
sudo systemctl restart smbd
sudo systemctl restart nmbd
```

## 最後に
ユーザ追加を忘れがちだが、忘れるとゲスト以外でのログインが不可となる。
この手順ではユーザ以外のアクセス制限をしていないため、使用する環境に合わせて適宜設定する。
Raspberry PiのストレージをHDDからSSDに換装してみたときの性能比較

# はじめに
[ラズパイをファイルサーバ化](https://qiita.com/shinmai88/items/46b7287941820c065c68)してからしばらく使ってたけど、スピードが遅くてちょっと使い勝手悪かった…。
だからSSDに換装して高速化することにしました。
せっかくだから性能もざっくり比較してみようと思います。

# 構成
ざっくりストレージの構成です。

```bash

pi@raspberrypi:~ $ df 
ファイルシス          1K-ブロック     使用    使用可 使用% マウント位置
/dev/root                28820984  8383008  18950900   31% /          #SDカード
devtmpfs                   470116        0    470116    0% /dev
tmpfs                      474724        0    474724    0% /dev/shm
tmpfs                      474724    36140    438584    8% /run
tmpfs                        5120        4      5116    1% /run/lock
tmpfs                      474724        0    474724    0% /sys/fs/cgroup
/dev/mmcblk0p6              69553    22540     47013   33% /boot
/dev/mapper/VG01-LV01   625115136 55994496 569120640    9% /mnt/lv     # ポータブルHDDを論理ボリューム化してマウント
tmpfs                       94944        0     94944    0% /run/user/1000
```

今回換装する対象となる論理ボリュームについては下記。

```bash
pi@raspberrypi:~ $ sudo fdisk -l /dev/mapper/VG01-LV01 
Disk /dev/mapper/VG01-LV01: 596.2 GiB, 640117899264 bytes, 1250230272 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
```


# SSD
今回購入したのは[こちら](https://www.amazon.co.jp/dp/B07JDWLBN7/ref=cm_sw_r_tw_dp_U_x_6HOYCbTA3V5XC)です。
SSDも240GBが3000円台で買えるんですね。



# 性能測定
Linuxでディスク性能を計測できる[fio](https://github.com/axboe/fio)を使います。
(fioについての説明は[こちら](https://qiita.com/toshihirock/items/fa4d310115e6921ab0ac)を参照ください。)

## job
下記のジョブファイルを使ってfioを動作させます。

```nas.fio
[global]
directory=/mnt/lv/tmp/

[seq-read]
rw=read
bs=256K
size=100M

[req-write]
rw=write
bs=256K
size=100M

[rand-read]
rw=randread
bs=4K
size=100M

[rand-write]
rw=randwrite
bs=4K
size=100M
```

# 測定結果
測定結果を記載します。
各項目についてざっくり説明すると

- bw・・・データ転送帯域。実際にデータを読み書きできる速度。大きいほどうれしい。
- iops・・・I/O per second。1秒間に読み書きしたブロックの数。大きいほどうれしい。
- runt・・・実行時間。小さいほどうれしい。

になります。


## sequence read
|  | HDD | SSD | SSD/HDD[%] |
|:---:|:---:|:---:|:---:|
|bw|100392KB/s|31762KB/s|31.6|
|iops|392|124|31.6|
|runt|1020msec|3224msec|316|

連続領域の読み込みは、HDDに比べるとSSDは30%ほどの速度しか出ていない遅いという結果になりました。
HDDは物理的に回転して、ヘッドが磁気データを読み取るという行為を行うので連続領域のほうが読み書きは早いですが、SSDよりも早いのは意外でした。

## sequence write
|  | HDD | SSD | SSD/HDD[%] |
|:---:|:---:|:---:|:---:|
|bw|11254KB/s|30386KB/s|270|
|iops|43|118|274|
|runt|9099msec|3370msec|37|

連続領域の書き込みについては、SSDのほうが約2.7倍速いようです。


## random read
|  | HDD | SSD | SSD/HDD[%] |
|:---:|:---:|:---:|:---:|
|bw|720908B/s|4594.7KB/s|637|
|iops|176|1148|652|
|runt|145452msec|22287msec|15.3|

ランダム領域については流石にSSDがぶっちぎりです。
読み込みは6倍以上の差が付きました。

## random write
|  | HDD | SSD | SSD/HDD[%] |
|:---:|:---:|:---:|:---:|
|bw|720913B/s|21695KB/s|3009|
|iops|176|5423|3081|
|runt|145451msec|4720msec|32|

こっちはもっとぶっちぎりでした。
ランダム領域への書き込みは30倍以上もの差が付いています。

# 所感
SSD圧勝かと思いましたが、sequence readだけはHDDに軍配が上がりました。しかも結構な差で。
これなんでなんですかね？
あんまり期待した結果ではないので、ちょっと残念です。
高速なファイルサーバーって難しいですね。
Windows上にフォルダで保存したGitリポジトリをGithubに以降したときのコマンド

いつの間にか年度末の忙しい間にGithubのプライベートリポジトリが無料になっていました。
MSのGithub買収の力でしょうね..

GWにWindows上のエクスプローラーに仮保存していたリポジトリをGithubに移行したときのコマンドを忘備録としてメモっておきます。

```` コマンド
rem # まずgithub上でプロジェクトをつくる
set git=RepositoryName
cd C:\Workspace\movegit
git clone --mirror C:\GitRepositoryPath\%git%
cd %git%.git
git remote set-url --push origin git@github.com:GitHubAccount/%git%.git
git push --mirror

````

こちらの記事を参考にしました。多謝です。
「手元にあるGit リポジトリをGitHub のリポジトリへ移行する - Qiita」https://qiita.com/TsutomuNakamura/items/058cb851a61bbb1f715b
Leetcode #10: Regular Expression Matching

```swift
func isMatch(_ s: String, _ p: String) -> Bool {
    var s = Array(s)
    var p = Array(p)
    var dp = Array(repeating: Array(repeating: false, count: p.count+1), count: s.count+1)
    dp[0][0] = true
    for i in stride(from: 1, through: p.count, by: 1) {
        if p[i-1] == "*" {
            dp[0][i] = i == 1 || (i >= 2 && dp[0][i-2])
        }
    }
    for i in stride(from: 1, through: s.count, by: 1) {
        for j in stride(from: 1, through: p.count, by: 1) {
            if s[i-1] == p[j-1] || p[j-1] == "." {
                dp[i][j] = dp[i-1][j-1]
            } else if p[j-1] == "*" {
                dp[i][j] = j >= 2 && (dp[i][j-2] || ((s[i-1] == p[j-2] || p[j-2] == ".") && dp[i-1][j]))
            }
        }
    }
    return dp[s.count][p.count]
}

```
【Go】Paizaとかで標準入力から配列を入手する定型句

# インプット

```
3 5
101 102 103 104 105
201 202 203 204 205
301 302 303 304 305
```
始めの1行が行x列を表しています。

# 結論

```Go
package main
import (
    "fmt"
    "bufio"
    "os"
    "strings"
    "strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func scanLine() []int {
    sc.Scan()
    s := sc.Text()  // 1行読み込み
    sl := strings.Split(s, " ") // 1行をスペースで分割
    ret := []int{}
    for i:= range sl {
        v, _ := strconv.Atoi(sl[i]) // 1要素ずつ整数に変換
        ret = append(ret, v) // スライスに追加
    }
    return ret
}

func main() {
    sl := scanLine() // まず1行読み込む

    data := [][]int{}

    // 行数分だけループ
    for i :=0; i < sl[0]; i++ {
        line := scanLine()
        data = append(data, line)
    }

    // あとはご随意に
}
```

# ボヤキ
Rubyだったら1行分 `gets.split(" ").map{|v| v.to_i}` で済むのに...
#django のモデルで rails の SomeModel.first / SomeModel.last みたいに最初/最後のレコードを取得する

```
SomeModel.objects.earliest('id')
```

```
SomeModel.objects.latest('id')
```


 # NOTE

モデル側で設定しておくと引数なしで実行できるっぽいです。

[python - Django: earliest() and latest() require either fields as positional arguments or 'get_latest_by' in the model's Meta - Stack Overflow](https://stackoverflow.com/questions/52720637/django-earliest-and-latest-require-either-fields-as-positional-arguments-or)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1918








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
発達障害者(ADHD)でもプログラマーになれるのか？

これが初めての投稿になります。

スキルアップのための投稿ではなく記録のために残します。
もし自分と同じ悩みの人がいたら共感しあえたら嬉しいです。

私はADHD(発達障害者)です。
３０歳になったばかりの時に発覚しました。

2019年の2月に職を失いました。
現在障害者手帳の申請をしています。

主に自分は注意障害を持っているようで
どの仕事やっても上手くいかなかったです。

ADHDの特徴として、主にマルチタスクが苦手です。
１つの物事をこなすのに対して複数の物事をこなすことが
出来ない特性があります。
代わりに一つのことになら熱中してこなすことが
出来るという特性がありました。

１社目に大手の飲食店に入社しましたが
マルチに色々なことをこなさなければならなかったため
精神的に病んでしまい辞めてしまいました。

倉庫勤務していたこともありますが
単純作業の繰り返しで自分が何をしているのか
よくわからなくなり退社しました。

現場仕事を行ったこともありますが、
マルチにこなさなければならないことがあり、
他のことが気になってしまい、本来やるべきことを
こなすことが出来ずにいました。

プログラマーになりたいと思ったのは

昔から画面と向き合うことが好きだったこと、
ワードプレスを趣味で扱いブログを作ったことがあったりと
エンジニアには数年前から興味がありました。

これらの経験からプログラマーの転職を目指すようになりました。


同じ悩みを持っている方がいたら
その人たちへの励みになったらいいなと思い
ADHDでもプログラマーになれるということを
証明していきたいと思っています。

気づいたことや学びがあったらQiitaに投稿します。

よろしくお願いいたします。
pandasでワンホットエンコーディング（ダミー変数）

# 参考図書
[Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)

# ワンホットエンコーディング（ダミー変数）とは
カテゴリ変数をモデルに学習させれるように、数値に置き換えるための手法。
カテゴリ変数を0と1の値を持つ新しい特徴量で置き換える。

例えば、
「雇用形態(workclass)」という特徴量があり、「公務員(Government Employee)」、「自営業(Self Employed)」、「民間企業従業員(Private Employee)」の３つのカテゴリが値として入っている。

このデータに対して、

- 新たに「公務員」、「自営業」、「民間企業従業員」という3つの特徴量を追加する
- 対応するものは値1を入れ、それ以外には0を入れる

こうすることで、カテゴリ変数を数値に置き換えることができる。

## 例
### オリジナル

|id|workclass|
|:---:|:---:|
|1|Government Employee|
|2|Self Employed|
|3|Private Employee|
|4|Private Employee|

### ワンホットエンコーディング実施後

|id|Government Employee|Self Employed|Private Employee|
|:---:|:---:|:---:|:---:|
|1|1|0|0|
|2|0|1|0|
|3|0|0|1|
|4|0|0|1|

# Pandasを使ってワンホットエンコーディング

まずはダミーデータを作成

```
df_dummy = pd.DataFrame({'workclass': ['Government Employee', 'Self Employed', 'Private Employee', 'Private Employee'], 'age': [22, 34, 27, 45]})
df_dummy
```

|   |     workclass     |age|
|:--:|:-------------------|:--:|
|  0|Government Employee| 22|
|  1|Self Employed      | 34|
|  2|Private Employee   | 27|
|  3|Private Employee   | 45|

`get_dummies`関数を使ってワンホットエンコーディングを実行。

```
# カラム指定したい場合は、pd.get_dummies(df_dummy, columns=['workclass'])
df_one_hot_encoded = pd.get_dummies(df_dummy)
df_one_hot_encoded
```

|   |age|workclass_Government Employee|workclass_Private Employee|workclass_Self Employed|
|:--:|:--:|:----------------------------:|:-------------------------:|:----------------------:|
|  0| 22|                            1|                         0|                      0|
|  1| 34|                            0|                         0|                      1|
|  2| 27|                            0|                         1|                      0|
|  3| 45|                            0|                         1|                      0|


## 値が数値のカテゴリ変数の場合

例えば、「間取り(Layout)」 という特徴量があって、1が「1LDK」、2が「2LDK」、3が「2DK」、4が「3LDK」 といったデータがあったとする。

この場合、値は数値だが、特徴量「間取り(Layout)」 はカテゴリ変数。しかし`get_dummies`関数は、すべての数値を連続値として扱い、ダミー変数を作らないため、**DataFrameの列を数値から文字列に変換する必要がある**。

まずはダミーデータ作成

```
df_dummy = pd.DataFrame({'layout': [1,2, 1, 3, 4]})
df_dummy
```

|   |layout|
|--:|-----:|
|  0|     1|
|  1|     2|
|  2|     1|
|  3|     3|
|  4|     4|

### 文字列に変換する前に `get_dummies` を実行してみる

```
df_one_hot_encoded = pd.get_dummies(df_dummy)
df_one_hot_encoded
```

|   |layout|
|--:|-----:|
|  0|     1|
|  1|     2|
|  2|     1|
|  3|     3|
|  4|     4|

変化なし・・・

### 文字列変換して`get_dummies`を実行

```
df_dummy['layout'] = df_dummy['layout'].astype(str)
df_one_hot_encoded = pd.get_dummies(df_dummy)
df_one_hot_encoded
```

|   |layout_1|layout_2|layout_3|layout_4|
|--:|-------:|-------:|-------:|-------:|
|  0|       1|       0|       0|       0|
|  1|       0|       1|       0|       0|
|  2|       1|       0|       0|       0|
|  3|       0|       0|       1|       0|
|  4|       0|       0|       0|       1|
【Ansible】そのCopy、Blockinfileの方が良いかも？

# はじめに

構成管理ツールのAnsibleで対象にファイルを転送する際、通常はCopyモジュールを使用すると思います。
けれど、シェルの設定ファイル（.bashrcや./config/fish/config.fish）のように、様々なタイミングで追加編集が必要になるファイルはblockinfileでコピーしたほうが便利なケースが多いので簡単な使い方を紹介します。

# copyの代わりにblockinfileを使用する

blockinfileを使用して、with_fileで指定したファイルの内容を対象ファイルに追記します。

参考
[blockinfile - Ansible Documentation](https://docs.ansible.com/ansible/latest/modules/blockinfile_module.html)


```YAML
- name: test blockinfile    
  blockinfile: 
    path: ~/test.txt   # 展開対象のファイルパス
    create: yes        # ファイルが存在しない場合は作成(格納フォルダが存在しない場合はフォルダも作成)
    insertbefore: BOF  # ファイルの先頭に追加（BOFを文字列にすると、その文字列の直前に追加されます）
#    insertafter: EOF   # ファイルの末尾に追加（EOFを文字列にすると、その文字列の直下に追加されます）
    marker: "# {mark} ANSIBLE Fish-shell basic setup." # 追加部分を示すマーカー
    block: "{{item}}"  # 展開する内容（ここではwith_fileで読み込んだファイル内容）
  with_file:
    - files/test.txt
```

blockinlineでマーカー付きの差し込みを行っておけば、ロールを再実行して内容を更新しても、ほかのロールから書き込んだ内容は保持されます。

# copyを使った場合

ファイルを転送する際、普通は次のようにcopyモジュールを使って展開すると思います。

```YAML
- name: test copy   
  copy:
    src: files/test.txt
    dest: ~/test.txt
```

この場合、対象マシンに「~/test.txt」が存在していた場合は上書きされてしまいます。

前出のようにblockinfileで展開していれば、もし対象ファイルが存在していた場合でも冪等性を維持しながら、markerで指定した変更部分のみが更新されるようになります。
パケットキャプチャ学習1日目

#パケットキャプチャとは
パケットキャプチャ端末が持っているNICを通過するパケットをソフトウェア的に傍受してキャプチャする。

##キャプチャを行う環境構築
・時刻合わせ
時刻がずれているとパケットの突合せが大変。

・キャッシュクリア
ARPキャッシュ、DNSキャッシュ、HTTPプロキシキャッシュなど
キャッシュはNW上のトラフィックを減らす機能、
パケットキャプチャ時にクリアしないと本来のパケットシーケンスにならない。

##WinPcap
Wireshark使用に必要なツール
パケットをキャプチャするのに必要なアーキテクチャ(デバイスドライバや、ライブラリの集まり)
NPF、packet.dll、wpcap.dll

##プロミスキャス
ONにすると自分と関係ないパケットもキャプチャする。

##名前解決機能

・MACアドレス機能
パケットのMACアドレスのOUI(ベンダー識別子)をベンダー名に変換する。

・ネットワーク名解決
IPアドレスをホスト名に変換する

・トランスポート層解決
パケットのポート番号をサービス名に変換する

##キャプチャフィルタ
メリットはキャプチャするパケットの量が減る。
負荷の軽減につながる。
リモートデスクトップ(RDP)でHTTPサーバーにアクセスし、クライアントからくるパケットをキャプチャしたい場合に、
RDPのパケットは不要。

##キャプチャフィルタの基本構文
[プロトコル名][ディレクション][タイプ][値]

例)
ether src 00:00:00:00:00:00  送信元MACアドレスが「*:*.」のイーサネットフレーム
ether host 00:00:00:00:00:00 送信元MACアドレスか宛先MACアドレスが「*:*.」のイーサネットフレーム
arp ARPフレーム
ip src host 192.168.0.1 送信元IPアドレスが「192.168.0.1」のIPv4アドレス
ip net 192.168.0.0/24 /24のセグメントのIPアドレスのパケット
tcp src port 53 送信元ポート番号が「53」のTCPセグメント

論理演算も使える
not port 3389 ポート番号が「3389」以外のTCpセグメント/UDPデータグラム

##表示フィルタ
キャプチャしたデータの中から画面上に表示するデータをフィルタする機能
・基本構文
[フィールド名][リレーション][値]
フィールド名について
eth.addr MACアドレス
arp ARPフレーム
ip IPv4アドレス
ipv6 IPv6アドレス
tcp TCpセグメント
tcp.port TCPのポート番号

リレーションについて
eq ==
ne !=
gt >
lt <
ge >=
le <=
contains 含む
matches に合致する

論理演算も使える
調査したいパケットのヘルプ機能は書式タブ

##パケットの表示に関わる機能
・時刻表示の切り替え
・パケットのマーク機能
・自動スクロール

・列の編集(OSI参照モデルの階層)
問題が特定のレイヤーにあるとわかっている場合

#レイヤー2プロトコルの解析
送信側の物理層はデータから信号に変換する時に符号化を行っている。
L2の代表プロトコル
有線LAN→Ethernet
無線LAN→IEEE802.11

##Ethernetの規格の見分け方
[帯域幅]BASE-[ケーブルの種類]
【帯域幅】通信規格の帯域幅を表している
[ケーブルの種類]
T UTPケーブル
S 光シングルケーブル
L 光マルチケーブル
C 同軸ケーブル

##Ethernetプロトコルの詳細
Ethernetネットワークを流れるパケットの事を「Ethernetフレーム」という

##ethernet 2 フレームフォーマット
[プリアンブル][src/dst MACアドレス][タイプ][ペイロード][FCS]

[Ethernetヘッダー]
[src/dst MACアドレス][タイプ]の二つをまとめた呼称


[プリアンブル]
これからEthernetフレームを送る合図を意味する64bit(8Byte)の特別なビットパターン
Wiresharkではキャプチャできない。

[src/dst MACアドレス]
MACアドレスは端末を表す48bitの識別ID

[タイプ]
L3でどんなプロトコルを利用しているか表す16bitの識別子

[ペイロード]
上位層のデータそのもの
データサイズはデフォルトで46バイトから1500バイトと決められている。

足りなければ、パディング(詰め物)、多ければ、分割
Ethernetフレームに入るデータの最大サイズをMTUと呼ぶ。

FCS(Frame check sequence)は、Ethernetペイロードが壊れていないかどうかを確認するためにある32bitのフィールド
送信側でチェックサム計算(CRC)を行っている。その後パケットに付与。
受信側で同様の計算を行う。突合。

[MACアドレス]
各ノードの端末IDを表す。
48bitで構成される。
16進数で表記される。

・IG(Individual/Group)ビット
MACアドレスが1:1のためのユニキャストアドレスか、1:n通信のマルチキャストアドレスかを表してる。
・UL(unique/Local)ビット
MACアドレスがグローバルアドレスかローカルアドレスかを表している。
WireSharkでは「LG bit」と表記される。

・OUI(ベンダー識別子)
先頭24bit
IEEEが割り当てる。

・L2スイッチの役割
送信元MACアドレスと自分自身のポート番号を管理している。
Ethernetフレームの転送先を切り替え、通信の効率化を図っている。(L2スイッチング機能)
送信元MACアドレスとポート番号を管理するテーブルをMACアドレステーブルという。
VLANを実装。
1台のL2スイッチを仮想的に複数のL2スイッチにみせかける技術。

###ポートVLAN/タグVLANの違い
・ポートVLAN
VLANの数だけポートとケーブルが必要

・タグVLAN
VLANの数に関係なく、1ポート、1ケーブルだけで済む

##ARP
MACアドレスはNICのROMに書き込まれていている物理的なアドレス
L3で使用するOSで設定する論理的なアドレスの事をIPアドレスという。
この2つのアドレスを紐づけるプロトコルがARP
最短でEC2等の各AWSコンソール画面にアクセスするよ！（CLI除いて最短だと思う）

#マネジメントコンソール画面から、ちまちまAWSリソースを開くの辞めにしません？？
例えば、
1. ChromeのURLバーから https://console.aws.amazon.com を開く
2. 下記画像ページから入力エリアにEC2と入れてEnter
3. EC2のトップページに飛ぶ
<img width="836" alt=" 2019-05-19 15.39.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198460/31309c73-de30-1900-90db-a232c6b14fd2.png">
こんなやり方してません？？

#最短でAWSの各コンソールページに飛べる方法を見つけたよ！
やり方は簡単、https://console.aws.amazon.com の後に"/"と使いたいAWSリソース名を小文字で入れるだけ。※とあるAWSの中の人も知りませんでした！

1. ChromeのURLバーに、"co"と入力。AWSよく使う方は、自動補完されるはず。
2. macの場合、"ctrl + E"で、カーソルを最後に持っていく。
3. 使いたいAWSリソース名の小文字"/***"を入力。EC2なら、https://console.aws.amazon.com/ec2

<img width="419" alt=" 2019-05-19 15.43.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198460/05e6f4e5-45a4-2015-a714-9460e61e5957.png">

僕のmacで、新規タブ開いてからEC2開くまで4秒でできました！速いぜ！

#各AWSリソースのURL例
基本的なサービスは対応しているみたい。
Lightsailに対応するURLは見つからなかった。。。
※小文字で打ってね。

| AWSリソース | URL |
|:--:|:--:|
| EC2 | https://console.aws.amazon.com/ec2 |
| S3 | https://console.aws.amazon.com/s3 |
| Route53 | https://console.aws.amazon.com/route53 |
| Lambda | https://console.aws.amazon.com/lambda |
| CloudWatch | https://console.aws.amazon.com/cloudwatch |
| Sagemaker | https://console.aws.amazon.com/sagemaker |
| RDS | https://console.aws.amazon.com/rds |
| Amplify | http://console.aws.amazon.com/amplify |
| Cloud9 | https://console.aws.amazon.com/cloud9 |
| IAM | https://console.aws.amazon.com/iam |