OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelのVaridatorでalphaルールはa-zではない

# はじめに

Laravelのvalidatorに`alpha`というルールがあります。てっきりA-Zとa-zの事だと思って使ったら日本語などにもマッチするのではまりました。

ドキュメントには「フィールドが全部アルファベット文字であることをバリデートします。」(原文: "The field under validation must be entirely alphabetic characters.")とあるのですが...

検索するとそういうものだから独自のルールを定義するか正規表現使えとありますが、なんだか納得いかないですね。

# 調査

ソースを調べたら以下のようになっていました。

`Illuminate/Validation/Concerns/ValidatesAttributes.php`:

```php
    /**
     * Validate that an attribute contains only alphabetic characters.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    public function validateAlpha($attribute, $value)
    {
        return is_string($value) && preg_match('/^[\pL\pM]+$/u', $value);
    }
```

つまり説明文からはaからzの大文字小文字のような印象をうけがちですが、ユニコードのプロパティでいうところのLetterとMarkなので、日本語を含む様々な言語の文字(アクセント記号とかウムラウトとかそういう類の記号も)がすべて含まれているのです。広い意味での「アルファベット」ということなのでしょう

`alpha_num`と`alpha_dash`も同様でした。数字は0から9ではなくこれまたユニコードのNumberプロパティなので、ローマ数字や丸つき数字などいろいろなものが含まれます。

```php

    /**
     * Validate that an attribute contains only alpha-numeric characters, dashes, and underscores.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    public function validateAlphaDash($attribute, $value)
    {
        if (! is_string($value) && ! is_numeric($value)) {
            return false;
        }

        return preg_match('/^[\pL\pM\pN_-]+$/u', $value) > 0;
    }

    /**
     * Validate that an attribute contains only alpha-numeric characters.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    public function validateAlphaNum($attribute, $value)
    {
        if (! is_string($value) && ! is_numeric($value)) {
            return false;
        }

        return preg_match('/^[\pL\pM\pN]+$/u', $value) > 0;
    }
```

# まとめ

a-zや0-9でバリデーションしたいときは正規表現を使いましょう。

# 追記

ドキュメントのバグとしてissue出そうかと思ったのですが、調べたところすでに修正のPR([Clarify allowed characters in alpha, alpha_num and alpha_dash #3412](https://github.com/laravel/docs/pull/3412))が出ていて、しかも却下されていました。これはどうにもならなそうですね...
Ubuntu Server 18.04 LTSの無線LAN接続

Ubuntu 18.04ではネット接続の設定には"Netplan"を利用する．
従来のバージョンで利用してきた"/etc/network/interfaces"を開いてみると以下のように記載されていた．

```conf:/etc/network/interfaces
# ifupdown has been replaced by netplan(5) on this system.  See
# /etc/netplan for current configuration.
# To re-enable ifupdown on this system, you can run:
#    sudo apt install ifupdown
```

# Netplanの設定
デフォルトでは"/etc/netplan/50-cloud-init.yaml"で設定されている．

```conf:/etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp5s0:
            addresses: []
            dhcp4: true
            optional: true
    version: 2
```

これに設定を追記していき，無線LAN設定していく．
（[netplan.io](https://netplan.io/,"netplan.io")を参考にした．）

有線LANの設定は"ethernets"以下に記述し，無線LANの設定は"wifis"以下に記述する．
無線LANアダプタは"wlp9s0"として認識されていたので，以下の内容を追記する．

```conf:
    wifis:
        wlp9s0:
            addresses: []
            dhcp4: true
            optional: true
            access-points:
                SSID1:
                    password: PASSWORD1
                SSID2:
                    password: PASSWORD2
```

なお，SSID1やPASSWORD1などは適宜修正する．（並列で記述することで複数設定が可能．）

また，無線LANの接続については"NetworkManager"を用いる必要があるらしい．
まずは，NetworkManagerをインストールし，設定ファイルの"renderer"オプションを追加する．

```sh
sudo apt-get install network-manager
```

```conf:/etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp5s0:
            addresses: []
            dhcp4: true
            optional: true
    wifis:
        wlp9s0:
            addresses: []
            dhcp4: true
            optional: true
            access-points:
                SSID1:
                    password: PASSWORD1
                SSID2:
                    password: PASSWORD2
    version: 2
    renderer: NetworkManager
```

最後に

```sh
sudo netplan apply
```

で設定完了．
【Laravel入門】CRUD実装〜一覧表示

今回はCRUDの``Read（読み取り）``を実装し、今まで投稿された記事を一覧表示できるようにする。

# コントローラ追記

``Articleコントローラ``に下記の内容を追記する。

```ArticleController.php
public function index()
{
    $articles = Article::all();
    return view('article.index', ['articles' => $articles]);
}
```

``indexアクション``はこのような流れになる。

- ``Articleクラス``の``allメソッド``で全てのレコードを取得し、``$articles``へ代入する。
- ``$articles``を``'article.index'ビュー``へ配列形式で渡す。
- ビューの中で``$articles``、つまり取得したレコードを使用できるようになる。

この``allメソッド``は、元は``Collectionクラス``のメソッドらしい。そして取り出したレコードは``Collectionクラスのオブジェクト``として利用できる。

公式ドキュメントより（一部抜粋）

>getメソッドであれリレーションによるものであれ、Eloquentが複数のレコードをリターンする場合Illuminate\Database\Eloquent\Collectionオブジェクトが返されます。EloquentコレクションオブジェクトはLaravelのベースコレクションを継承しているので、Eloquentモデルの裏にある配列をスムーズに操作するために継承した多くのメソッドがもちろん使用できます。

``Collectionクラス``を使用しているのが``Eloquent``だから、``EloquentのクラスであるArticleクラス``のインスタンスとして扱うことができるのか・・・？その辺りの繋がりが正直よく分からない。

# ルーティング設定

ユーザー側からPOSTする情報は無いので、設定するのは``GET``に対応したルートのみで良い。

```
Route::get('/article/index', 'ArticleController@index')->name('article_index');
```

# ビュー作成

``resources/views/articleディレクトリ``に``index.blade.php``を作成し、編集する。今回はtableタグを使ってみた。

``@foreachディレクティブ``を使用し、コントローラから渡された``$articles（全てのレコード）``から1件ずつ``$articleインスタンス``を取り出し、``各プロパティを表示``している。

```resources/views/article/index.blade.php
@extends('...layouts.layout')

@section('article_index')
    投稿一覧<br>
    <table>
        <tr><th>ユーザーID</th><th>タイトル</th><th>内容</th></tr>
    @foreach($articles as $article)
        <tr>
            <td>{{ $article->user_id }}</td>
            <td>{{ $article->title }}</td>
            <td>{{ $article->content }}</td>
        </tr>
    @endforeach
    </table>
@endsection
```

こちらの記述も忘れずに。

```resources/views/layouts/layout.blade.php
@yield('article_index')
```

今回はあっさりしているが、ここまで。
Go言語でクロージャと goroutine を組み合わせた時に起こること

> この記事は go 公式 FAQ [What happens with closures running as goroutines?](https://golang.org/doc/faq#closures_and_goroutines) の翻訳です。

クロージャと並行処理を組み合わせる時よく混乱が起こります。次のコードを見てみましょう:

```go
func main() {
    done := make(chan bool)

    values := []string{"a", "b", "c"}
    for _, v := range values {
        go func() {
            fmt.Println(v)
            done <- true
        }()
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}
```

間違って、上のプログラムの出力が a b c になると予想する人がいるかもしれません。しかし、実際は c c c になります。これは、ループの各イテレーションは同じ変数 `v` を参照するためです。つまり、各クロージャは同一の変数を共有しています。クロージャが実行される時、fmt.Println の実行によって v を出力しますが、その v は goroutine がローンチされた以降に変更されているかもしれないのです。`go vet` コマンドを使うと、この種の問題等を事前に検出することが出来ます。

ループの各 `v` の値をクロージャに対してバインドするためには、ループの中で新しい変数が作られるように修正しなければなりません。一つの方法は、変数をクロージャのパラメータとして渡す方法です:

```go
    for _, v := range values {
        go func(u string) {
            fmt.Println(u)
            done <- true
        }(v)
    }
```

この例では、`v` の値は無名関数のパラメータとして渡されています。この関数の中では、その値に対して変数 `u` としてアクセスすることが出来ます。

より簡単な方法は、単に新しい変数を宣言する方法です。この記法は一見変に見えるかもしれませんが、Go 言語においては問題のない記法です:

```go
    for _, v := range values {
        v := v // create a new 'v'.
        go func() {
            fmt.Println(v)
            done <- true
        }()
    }
```
Raspberry Pi 2/3/Zero でiPhoneのUSBテザリングを使う

[以前書いた記事](http://d.hatena.ne.jp/embedded/20151025/p1)の更新です。


Raspbian のstretch を使用しています。

```
sudo apt install ipheth-utils libimobiledevice-utils
```

iPhoneの設定画面からインターネット共有をオンにして、ラズパイとUSBケーブルでつなぎます。
「このコンピュータを信頼しますか」と聞かれるので、「信頼する」を選択します。
これで、ラズパイからiPhoneを経由してインターネットに接続できるようになります。

# 他のシングルボードコンピュータで同様のことをするには

ipheth-utils と libimobiledevice-utils およびこれらが依存しているパッケージをインストールします。
これは [Debian パッケージ検索](https://packages.debian.org/ja/) で調べることができます。

また、Linuxカーネルには ipheth のカーネルモジュールが必要です。

tinkerboardでは以下のインストールでいけました。

```
sudo apt install ipheth-utils libimobiledevice-utils usbmuxd
```
qiitactlなら…qiitactlならなんとかしてくれる…！

[qiita垢作っておいて初手から躓く大失態](https://qiita.com/astrorobot110/items/324a5b360e87ff8947e5)で途方に暮れて、色々探し回ってる間に[qiitactl](https://qiita.com/minodisk/items/74a02c564b88a6632f40)なるいいものが見つかったのでそれのセッティングをしております…が、これはこれで現在詰んでおります。

## 何事？

上の本人の解説に合わせて環境変数をあちこち試しながら、最終的にvimに追加してスクリプト書いたんですけどどうにもこうにもBad requestが止まらない。疑問に思ってとりあえずPowershellでちゃんと確認しよう、と思ったんですけど…

```PowerShell
PS > qiitactl --debug create post test.md

POST https://qiita.com/api/v2/items HTTP/1.1
	:
	:
	:
Content-Type: application/json
{
  "id": "",
  "url": "",
  "created_at": "2018-05-05T15:08:01+09:00",
  "updated_at": "2018-05-05T15:08:01+09:00",
  "private": false,
  "coediting": false,
  "tags": null,
  "user": {
    "description": "",
    "facebook_id": "",
    "followees_count": 0,
    "followers_count": 0,
    "github_login_name": "",
    "id": "",
    "items_count": 0,
    "linkedin_id": "",
    "location": "",
    "name": "",
    "organization": "",
    "permanent_id": 0,
    "profile_image_url": "",
    "twitter_screen_name": "",
    "website_url": ""
  },
  "title": "test",
  "body": "",
  "rendered_body": "",
  "tweet": false,
  "gist": false
}
HTTP/1.1 400
	:
	:
	:
{"message":"Bad request","type":"bad_request"}
Bad request
```

![DQMI0AqUEAEt3l9.jpg](https://qiita-image-store.s3.amazonaws.com/0/254657/3469d131-af43-9720-cc98-b51729e8f65b.jpeg)

jsonのuserの項目がユーザー情報すっからかんなんですけど、これ大丈夫なんです？ってなってるところです…

## んでスクリプトは？

多分出来てるので後日

## その後

とても間抜けなミスが発覚したのでテストも含めて今日中に…
「配列」, 「for文」とは？

# 内容
* 配列とfor文の理解

#配列とは
配列は同じ型の複数の要素を１つの変数名と添字によって管理できる便利なものです。
配列によって今まで別々に宣言していた同じ型の変数を一括で宣言できるようになります。

簡単に説明すると、今までA君、B君、C君、D君の4人のテストの点数を別々に宣言していたとします。
こんな感じ。

```
int scoreA = 90;
int scoreB = 67;
int scoreC = 74;
int scoreD = 83;
```

<img width="601" alt="スクリーンショット 2018-05-05 14.44.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/225909/f6168e3a-2a0a-8b84-9e1d-cb74d47e7b7b.png">
4人ならまだしも、100人とかだったら毎行宣言するのはとても面倒ですよね。
配列を使うと人数分の箱を1行で用意することができます。

```
int[] score　= new int[4];
```

まだ変数に値は代入してはいないのですが4人分の宣言を１行ですることができました。 

- 変数型の後ろに[ ]をつけると、「配列を使います」という宣言をしたことになります
- 変数名は配列を使う前と同じように書きます
- newは演算子の一種で、「新しく配列のための箱を準備します」という意味です
- int[4]は「int型の４つの箱を準備します」という意味です


配列を使い、それぞれに値を代入すると下のようにscoreという複数の箱を添字で簡単に管理することができるようになります。
<img width="590" alt="スクリーンショット 2018-05-05 14.48.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/225909/626b24eb-9f04-e9e1-aff8-f63dc5913536.png">

ちなみに、要素や添字は下の通りです。
<img width="595" alt="ド.png" src="https://qiita-image-store.s3.amazonaws.com/0/225909/9dc4f99a-6f93-e9cc-cb0a-ebc2c3993ed1.png">

同じ型の複数の要素を扱うときは配列を使ってみてください

#for文とは
for文とは簡単に言うと繰り返し文です。決まった回数同じ処理をさせることができます。

```
for(int i=0; i<5; i++){
    Debug.Log(i)
}
```
上のコードだと、0,1,2,3,4が順番に出力されます。
構造的には以下の通りです。

```
for(①; ②; ③){
    ④
}
```

for文での処理の流れは以下の通りです。

1. ①int i=0 (最初の一回だけ実行される。初期化)
2. ②i<5 (条件判定：条件を満たしているか確認、条件を満たさなかったらループを抜ける)
3. ④Debug.Log(i) (させたい処理)
4. ③i++ (ループのカウンタを変更)
5. 2~4を繰り返す

プログラミングで繰り返し処理を書くときはfor文を使ってみてください
Pixelmatorでニアレストネイバーの拡大縮小をしたい

Pixelmatorでニアレストネイバーの拡大縮小をする方法です。
ドット絵をドット絵のまま拡大したいときなどに重宝するかと思います。

検索するとプラグインを使用する方法が見つかりますが、
Pixelmator 3.4.1 にて本体に機能が追加されています。

# やりかた

メニューバーの、
イメージ＞イメージのサイズ
のダイアログで、
**Optionキーを押しながらOKを押す**
とニアレストネイバーで拡大縮小できます。
Visual Studio Codeで.NET Coreをデバッグするためのセットアップ

# はじめに

Visual Studioは、強力な開発ツールです。
本心は、Visual StudioのEnterprise版でガンガン開発したいです。
ただ、零細企業では、開発者全員分の最新版のライセンスが用意出来ません・・・。

そこで、可能な限り、今後はVisual Studio Codeで開発を進めようと企んでいます。

Visual Studio Codeだけでは、UWPなんて開発はできそうにないですが、ASP.NET Coreとか、コンソールアプリなんかは、Visual Studio Codeだけで十分ではないかと思っています。

ただ、思っているだけで、全然証明できていないので、色々検証してみようかと思います。

まずは、Visual Studio Codeで.NET Coreをデバッグするためのセットアップ手順です。
ただ、以下のサイトの方がおすすめです・・・。

https://docs.microsoft.com/en-us/dotnet/core/tutorials/using-on-macos

Macでの手順ですが、Windowsでも十分参考になります。
日本語訳もありますが、MSの日本語ドキュメントは自動翻訳のようで、日本語がまだまだ変です。（昔から比べると大分ましになりましたが）

# 環境

- Windows 10
- .NET Core SDK 2.1.105
- Visual Studio Code V1.23

# .NET Core SDKのインストール

以下より、.NET Core SDKをダウンロードし、インストールする。

https://www.microsoft.com/net/download/windows

# Visual Studio Codeのインストール

以下より、Visual Studio Codeのインストーラーをダウンロードして、インストールする。

https://code.visualstudio.com/download

# プロジェクトの作成

プロジェクトを格納するフォルダを作成する。
本手順では、「C:\dev\DotNetProject」とする。

Visual Studio Codeを起動する。

最初の起動時に、Gitがインストールされていなければ、インストールを求められるので、必要であれば、Gitをインストールする。

Visual Studio Codeにて、「ファイル」→「フォルダー開く」を選択し、「C:\dev\DotNetProject」を選択する。

Visual Studio Codeにて、「Ctrl + @」でVisual Studio Code上でターミナルを起動する。
初回は、ターミナルの種類がPowerShellやコマンドプロンプトやgit bashから選択できる。

以下のコマンドを実行する。

```
 dotnet new console
```

「Program.cs」などのファイルが自動生成される。

# C# for Visual Studio Codeのインストール

Visual Studio Codeにて、「Ctrl + Shift + X」にて拡張機能を表示する。

拡張機能の検索ワードに「C# for Visual Studio Code」と入力する。
「C# for Visual Studio Code」を一覧から選択し、「インストール」をクリックする。
「再読み込み」をクリックする。

# デバッグの実行

Visual Studio Codeにて、「Ctrl + Shift + D」にてデバッグを表示する。
デバッグのセレクトボックスにある「構成の追加」を選択する。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/254172/1685a765-1067-9d8d-f626-d1a0121642ca.png)

デバッグ可能な種類の一覧が表示されるので、「.NET Core」をクリックする。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/254172/00cb9452-a38c-f99e-6532-f25c9257ba74.png)

Visual Studio Codeにて、「Program.cs」を開く。

「Program.cs」の「Console.WriteLine("Hello World!");」の行番号の左側をクリックし、赤い丸のマークを付ける。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/254172/5baeb2d4-773a-5704-da86-baac4ae600fe.png)

デバッグの再生ボタンをクリックする。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/254172/e889817f-13c2-84f9-9509-0d06a81d9fa9.png)

ブレークポイントで実行が止まる。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/254172/ba98190e-f5c6-f891-dbb3-f80023918685.png)

# 最後に

簡単に、無料でC#がデバッグできるようになりましたね！

# 参考サイト

https://www.microsoft.com/net/download/windows
Laravel5.6　MysqlのデータとしてNullで管理するメリット・デメリット

現在、Laravel５．１から５．６にバージョンアップをしています。
Mysqlへのデータ登録時、５．１までは入力がない場合は””としてデータベースのカラムに登録されていましたが、５．６になるとNullで登録されます。
Nullに変換されるロジックは判明しましたが、そもそもデータベースのデータの在り方として、””で管理するほうがよいのか、Nullで管理するほうがよいのか迷っております。
それぞれのメリットとデメリットが分かれば判断がつくのですが、ご教授のほど宜しくお願いします。

基本的な質問でしたら申し訳ございません。
独学のため、初歩的なことがわかっていない可能性がございます。
Node-RED でBLEビーコン（iBeacon）の情報を取得する

#node-red-contrib-bleacon のインストール
iBeaconタグの読み取り（受信）又はエミュレート（送信）するノードです

node-red-contrib-bleacon
https://flows.nodered.org/node/node-red-contrib-bleacon

```shell
npm install node-red-contrib-bleacon
```

#フローの作成
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/240467/f93f0dfd-3414-2bdf-9fcc-fc8c373c2870.png)

今回は Cypress Semiconductor の CYALKIT-E02 を使用しました。
太陽光発電で温湿度を送信してくれます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/240467/170797b6-b7ba-d7e8-1ff0-c662ebd6b439.png)

ちょっと肌寒い5月5日のこどもの日でした。

#参考
[Raspberry PiでiBeaconを受信する（Node.js + bleacon）](https://qiita.com/yuyakato/items/739443960fac2668f4a3) - @yuyakato さん
Railsの勉強に役立ちそうなチュートリアルをまとめてみた[初級者,中級者向け]

今回は、僕がRailsを勉強していく中で出会ったよさそうなチュートリアルを適当にまとめておきます。

僕自身まだ手を出せていないものもあるのでやって見たら是非コメントください！

## Railsチュートリアル
https://railstutorial.jp/

みなさんご存知のRailsチュートリアルです。
初心者の方はまずこちらから挑戦して見てください！

これもすこし難しいと感じる方は「Progate」などから先にやる方がいいかもです。

## Rails5 「中級」　チュートリアル
https://techracho.bpsinc.jp/hachi8833/2018_02_05/51343

Rspecを使ったTDDやActionCableを使ったインスタントメッセージ機能なども実装するみたいです！
本家のRailsチュートリアルを終わらせて次に何をしようか悩んでいる人は挑戦してみてはいかがでしょうか？

ただし、一つ問題があります。

元々は英語のチュートリアルっぽいんですが、まだ全て翻訳されていないみたいです。
中盤以降は本家の英語版で学習するようにしてくださいね！

以下URL
https://medium.freecodecamp.org/lets-create-an-intermediate-level-ruby-on-rails-application-d7c6e997c63f


## GoRails
https://gorails.com/

英語です。
でも動画なのである程度わかると思います。

**RailsでVueJsを使ってみたりいろいろなトピックを扱ってくれているので飽きません。**
YouTubeにもチャンネルがあるので確認して見てください！

## 終わり

まだまだいろんなチュートリアルなどがあると思います！
一緒にまとめておいて欲しいチュートリアルがあればコメントで教えていただければ幸いです！

僕もまだまだ初心者なのでお互い助け合いましょう！

ありがとうございました！

いいねとフォローもしていただけると、やる気が出ます！！！！！
S2Strutsのチュートリアルをやってみよう(#4_180505)

##本日の成果
・Seasar2-exampleプロジェクトへのlocalhostアクセス成功
　
　原因はいくつかあった
　⇒V1.2.4以降はexampleプロジェクトがなくなっていた
　⇒本来はs2struts、s2struts-exampleという2本立てで実施するチュートリアルだった

##困った点
　①該当プロジェクトがjava1.6、tomcat6を基準としていた
　　変更手順は以下を参考にした
　　⇒http://www.shookuro.com/entry/2016/08/27/115354
　　⇒https://ameblo.jp/oregano-blog/entry-11418600682.html

##コメント
　ということであとのタスクは以下2点
　　・Ant⇒Maven化
　　・GitHubに公開

　今月中には終わるなぁ・・・
　新しいタスクを考え始めなきゃ。
wemos d1でoled

#概要
wemos d1でoledやってみた。

#写真

![MVC-006F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b3c64aae-eea0-c043-0f67-acd9891d1852.jpeg)


#回路図

![wemos.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/09995f20-b0f2-1956-15ce-d4197915ae92.jpeg)

#サンプルコード


```
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 oled(16);

void setup()
{
	Serial.begin(115200);
	Serial.println("\nok");
	oled.begin(SSD1306_SWITCHCAPVCC, 0x3c);
	oled.clearDisplay();
	oled.display();
	oled.setTextColor(WHITE);
	oled.setTextSize(2);
	oled.setCursor(0, 0);
	oled.print("oled 1");
	oled.display();
}
void loop()
{
	oled.clearDisplay();
	oled.setTextSize(2);
	oled.setCursor(0, 0);
	oled.print("oled 1");
	oled.setCursor(0, 25);
	oled.setTextSize(4);
	oled.print("Hello");
	oled.display();
	delay(500);
	Serial.println("\nok");
}

```

以上。
docker execでpg_restoreしたらリストアが失敗する

コンテナ外のホストからPostgreSQLのコンテナのバックアップとしてpg_dumpしてたカスタムのアーカイブファイルをpg_restoreしようとしたら `[custom archiver] could not read from input file: end of file` となってリストアできなかった。

```sh
$ docker exec db_1 pg_restore -Fc -c -d db -U user latest.dump
pg_restore: [custom archiver] could not read from input file: end of file
```

PostgreSQLのコンテナ(db_1)にbashで入って

```sh
$ docker exec -it db_1 bash
```

コンテナ内でpg_restore実行したら成功した

```sh
$ pg_restore -Fc -c -d db -U user latest.dump
```
【Swift】 TextFieldをタップした時に全選択できるようにする

> 追記
> ・本処理における不具合の対処方法を追記しました。

# 環境
- macOS HighSierra 10.13.4
- Xcode 9.3
- Swift 4.1

# 目的
TextFieldをタップした時に、TextFieldの値が存在する場合において全選択をできるように設定する。

# 準備
- ViewControllerにUITextFieldDelegateを設定する。

```swift:ViewController.swift
class ViewController: UIViewController, UITextFieldDelegate {

	// UITextFieldの定義
	@IBOutlet weak var myTextField: UITextField!
	
	override func viewDidLoad() {
        super.viewDidLoad()
        
        // UITextFieldDelegateの設定
        self.urlTextField.delegate = self
	}
    
    func textFieldDidBeginEditing(_ textField: UITextField) {
    	// ここに本処理を記述していく
    }

}
```

# 処理
## 1. TextFieldの選択範囲を指定する方法:`textRange(from: UITextPosition, to: UITextPosition)`
```swift:ViewController.swift
func textFieldDidBeginEditing(_ textField: UITextField) {

	// TextFieldの選択範囲を最初から最後まで(全選択)に指定する
	textField.selectedTextRange = textField.textRange(
		from: textField.beginningOfDocument,
		to: textField.endOfDocument) 
}
```

## 2. TextField内の文字列を選択状態にする方法:`selectAll(sender: Any?)`
```swift:ViewController.swift
func textFieldDidBeginEditing(_ textField: UITextField) {

	// nilチェック
    if textField != self.urlTextField {
        return
    }
    
    // TextField内の文字列を選択状態にする
    textField.selectAll(self.textField.text)
}
```

# 問題
## 2回に1度しか全選択の状態にならない
本処理において、
「2回に1度しか全選択の状態にならない」という不具合に対する対処方法を追記しました。

> [[Swift] TextField全選択時の処理で「2回に1度しか全選択の状態にならない」場合の対処方法](https://qiita.com/_CHUBURA/items/2807cee528edc851b216)
FlutterでOS判定をする

Flutterでのアプリ開発する際にデザインは基本マテリアルデザインを踏襲していくと思いますが、
やはりiOSとAndroidでUIを変えたいと感じることがあると考えられます。
もしくは、外部サービスを利用する際に発行されるIDがAndroidとiOSは別アプリなので個別発行されることにより、内部で切り替えたいといったケースも考えられます。

そこでOSを判定する必要がでてきます。
判定するための実装内容は非常に簡単です。

```dart
import 'dart:io';

// OS名を取得、自分でごりごりやりたいならこちら
String os = Platform.operatingSystem;

// OSごとで判定するプロパティも提供されている
bool isAndroid = Platform.isAndroid;
```
上記のように、OSを取得して自身で振り分けをする方法と、`isAndroid`といったようなプロパティ任せにする方法があります。

内部では以下のような実装になっており単純に文字列比較をしてフラグ管理をしているだけです。やることは変わらないかと思われます。

```dart
//Platform.operatingSystem
static String get operatingSystem => _operatingSystem;

//Platform.isAndroid
static final bool isAndroid = (_operatingSystem == "android")
```

他にも、`isIOS`、`isFuchsia`、`isLinux`、`isMacOS`、`isWindows`といったプロパティが用意されていました。どこまで視野に入れているのだろうかと思わせるプロパティ群ですね。

以上になります。
attr_accessorの使い方を解説してみる

##attr_accessorとは

インスタンス変数を直接変更して操作ができるようにするもの。

##簡単に説明
例えば、Perosonクラスがあったとしましょう。

```ruby
class Person    
                                                                                    
  def initialize name
    @name = name
  end

  def say
     puts "私の名前は" + @name + "です"
  end

end

person = Person.new "taro"
person.say
```
**実行結果**

```
私の名前はtaroです
```

①personインスタンスを生成した時にインスタンス変数`(@name)`にtaroが入る。
②personに対してsayメソッドを呼び出して値を保持したインスタンス変数`(@name)`を表示。

という流れです。

しかし、クラスの外からインスタンス変数(ここでいう`@name`)を変更させたいと思ったとき、どのようにすれば良いのでしょうか。

次の例をみてみましょう。

```ruby
class Person   
                                                                                   
  def initialize name
    @name = name
  end

  def say
     puts "私の名前は" + @name + "です"
  end
end

person = Person.new "taro"
person.name = "hanako" #インスタンス変数の値を更新
person.say
```

**実行結果**
```undefined method `name=' for #<Person:0x007fad1d0e35b8 @name="taro"> (NoMethodError)```

インスタンスから直接nameを変えようとしましたが、nameなんてメソッド定義してねぇよ！と怒られます。
もちろん、`person.@name = "hanako"　`とするのもダメです。
これはインスタンス変数にアクセスできていないからです。


そこでインスタンス変数にアクセスさせるために使うのが、attr_accessorというもの。
今回はインスタンス変数である`@name`の値を変えたいので、次のように追記します。

```ruby
class Person 
  attr_accessor :name #追加
                                                                                     
  def initialize name
    @name = name
  end

  def say
     puts "私の名前は" + @name + "です"
  end
end

person = Person.new "taro"
person.name = "hanako" #インスタンス変数の値を上書き
person.say
```
**実行結果**
`私の名前はhanakoです`

これでクラス外からインスタンス変数であるnameを操作できるようになりました。

attr_accessor :　（インスタンス変数)　とすれば、指定されたインスタンス変数が外部からでも変更できるようになるので必要に応じて設定するようにしてみましょう。
SwiftPMのテスト結果を xcpretty で見やすく

SwiftPM をCLIツールやライブラリの開発をしていると開発をするとき、テストは 

```swift 
swift test
```
とコマンドを実行する。ただ、このままではテスト結果が非常に見にくい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/49589/bf98dfff-f7a0-3499-8f3e-4649221866c4.png" height=300px>

そこで xcpretty を使うと見やすくなる。出力が標準エラー出力に出ているので　`2>&1` を追加している。

```shell
swift test 2>&1 | xcpretty
````

<img src="https://qiita-image-store.s3.amazonaws.com/0/49589/90f8db1c-3aee-515b-4826-f1ab7e3b792c.png" height=300px>

fastlane にも SwiftPM のコマンドを実行するようのアクションがある。こちらに xcpretty を使えるようにプルリクを投げたところマージされた😁
https://github.com/fastlane/fastlane/pull/12450
Gitのルーティン

#Gitのルーティン
ファイルの作成/変更/削除をgitのインデックスに追加

```
git add ファイル.html
```

変更をローカルにコミット

```
git commit -m "add new file"
```

状態確認

```
git status
```

プッシュしてリモートに反映

```
git push origin master
```
vscodeでjsx/tsxを書く際に閉じタグを補完する

vscodeでjsx/tsxを書いていて閉じタグを補完して欲しい時に入れるプラグインはこちらです。

https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag

(vscodeはbuiltinでhtmlファイルの閉じタグ補完は行うけど、拡張子jsx/tsxのファイルでやるにはこのプラグインが必要っぽい)
PHP7とMySQLの環境構築


**自分用メモ**
-PHPのインストール
-MYSQLのインストール

##PHPのインストール
remiリポジトリの追加

```rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

PHP7をインストール
```yum --enablerepo=remi-php70 install -y php php-cli php-devel php-common php-mbstring php-mysql php-fpm php-gd php-mcrypt php-opcache php-pdo php-xml
```

PHPinfoを確認
```
<?php
 phpinfo();
```


##MySQLのインストール
mariaDB、既存mysqlを削除

```
yum remove mariadb-libs
yum remove mysql*
```


インストール

```
yum install http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum -y install mysql-community-server
```

バージョンチェック

```
mysqld --version
```

起動、自動起動設定

```
systemctl start mysqld.service
systemctl enable mysqld.service
```

初期パスワード確認

```
cat /var/log/mysqld.log | grep 'password is generated'
```

初期設定

```
$ mysql_secure_installation

Enter password for user root: //ログに出力されていた初期パスワードを入力
Set root password?　//ルートのパスワードを変更しますか？ Yでパスワード設定
Remove anonymous users?　//誰でもログイン可能になっているが消しますか？ Yで消しとく
Disallow root login remotely?　//リモートからrootログインを許可しませんか？ Yでしない
Remove test database and access to it?　//テストデータベース消していいですか？ Yで消す
Reload privilege tables now?　//設定をすぐに反映しますか？ Yで反映
All done!
```
Ubuntuで匿名性の高い環境を構築する方法

Tailsだとデータ消えちゃうから、Ubuntuに自分で環境構築してしまえってことで、その方法のメモ。うっかりNSAの秘密を暴露しちゃった人の普段使い用。
なお、当然のことですが本稿の技術を犯罪に使わないでください。本稿は一切のサイバー攻撃や犯罪行為等を手助けするものではありません。

##Ubuntu
最新版はUbuntu 18.04 LTS。古いバージョンでもよければ17.10の日本語Remix版を使う。
インストールするときに「安全のため新しいUbuntuのインストールを暗号化する」を選択する。これでディスク全体が暗号化される。バールのようなものでこじ開けられて、HDDだけ取り出されても中身がわからない。安全。
起動時に二度パスワードを入力するのが面倒な場合は自動ログインを有効にしておく。
##Firefox
設定→プライバシーとセキュリティを下記の通り設定
・Firefoxに履歴を一切保存させない
　履歴を保存させないのは主に次回起動時のCookieによる特定を防ぐため。利用用途によって、好きに設定してください。
・トラッキング防止→常に
・「Firefoxが技術的な対話データをMozillaへ送信することを許可する」のチェックを外す

続いて下記リンクからNoScriptをインストールする。
https://addons.mozilla.org/ja/firefox/addon/noscript/
デフォルトだと数十近いサイトのスクリプトが許可されてしまっているので、NoScript→Options→Per-site Permissionsで各サイトをTRUSTEDからDEFAULTに変更する。
##匿名通信
Torでブラウジングしたいだけなら、Tor Browserだけインストールすればよい。
今回はTorの先に自分で用意したプロキシを使いたかったのでProxychainsを利用できる環境を構築する。なんでそんなことがしたいのかは察して欲しい。
Proxychainsを使うことによってPC→Tor→プロキシ→サイトの経路で接続できる。
###Tor

Torをインストールして、自動起動を有効化する。

```
$ sudo apt install tor
$ sudo systemctl start tor
```

###Proxychains
Proxychainsをインストールするための事前準備をする。

```
$ sudo apt install git
$ sudo apt install make
$ sudo apt install make-guile
$ sudo apt install gcc
```

Proxychainsのパッケージを取得する。

```
$ git clone https://github.com/rofl0r/proxychains-ng
$ cd proxychains-ng
```

そのままだとインストール時に怒られるので、Makefileの85~86行目を以下のものに書き換える。

```
 $(CC) -shared $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -lpthread $(LIBDL) -o $@ $(LOBJS)
```

Proxychainsをインストールする。

```
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ sudo make install
$ sudo make install-config
```

下記コマンドで接続経路の編集を行う。デフォルトでは最初にTorに接続する。超能力でプロキシを手に入れたら、proxychains.confの最終行に入手したプロキシを追加することで、Torの先につなげるプロキシを指定できる。プロキシのタイプによって異なるが、「http IPアドレス ポート」という書き方でいけるはず。

```
$ sudo gedit /etc/proxychains.conf
```

以下のコードで指定した接続経路でFirefoxを使える。

```
$ proxychains4 firefox
```

コマンドラインで期待の経路で接続されているか、また確認君+にアクセスして指定プロキシのIPアドレスになっているかを確認すること。
それでは楽しい匿名Ubuntuライフを！

##参考にしたサイト
初心者が解説するTor browserの基本 - NAVER まとめ
https://matome.naver.jp/odai/2145977345281799201

proxychains-ngを使ってみた - 以下省略!
https://abyssluke.hatenablog.com/entry/2016/09/29/204521

symbol lookup error: ./libproxychains4.so: undefined symbol: pthread_once · Issue #53 · rofl0r/proxychains-ng · GitHub
https://github.com/rofl0r/proxychains-ng/issues/53/29/204521
vscodeのPrettier設定とtslintの設定が競合した場合にやること


Prettierはpackage.jsonに設定を記述できるので、tslint側に合わせてあげればOKです。

自分の場合は、シングルクォートと末尾のセミコロンの設定がひっかかったので、

```json
"prettier": {
  "singleQuote": true,
  "semi": false
}
```

を追記しました。
MacOSでDockerを動かしてみた

#Docker登録
[docker](https://www.docker.com)
![スクリーンショット 2018-05-05 9.54.26.png](https://qiita-image-store.s3.amazonaws.com/0/236643/509ce8e9-0bf6-1a96-8778-6792270c989a.png)

Create Docker IDから登録します
 
#Dockerダウンロード
[docker community edition](https://www.docker.com/community-edition)
![スクリーンショット 2018-05-05 10.01.31.png](https://qiita-image-store.s3.amazonaws.com/0/236643/7486c1d5-426a-d1fd-5cfe-865aa8d179b2.png)

Docker CE for Macをダウンロードします。

#Dockerインストール
ダウンロードしたdmgファイルをダブルクリックし、インストール

#CentOSをPull
ターミナルから$ docker pull centos

#CentOS起動
$ docker run -itd centos /bin/bash

#コンテナIDを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
**877xxxxxxxx**        centos              "/bin/bash"         About an hour ago   Up About an hour                        vibrant_shirley

#コンテナへアタッチ
$ docker attach 877xxxxxxxx

#コンテナからログアウト
Linuxからログアウトするようにexitコマンドを打つと、コンテナが停止してしまいます。コンテナを停止せずにログアウトするのは**Control+p→Control+q**です。
Lambda用のプログラムをローカルでテスト実行する方法（簡単編）


Serverless Frameworkやaws-sam-localを利用する方法もありますが、そんなに複雑じゃないコードは下記のようにテストするのがいいようです。

## 方法

### lambda用コード

必要に応じていろいろ書く。でも、このコードは実行できない（できるけどテストできない）。

```js:index.js
exports.handler = (event, context, callback) => {
    console.log("foo");
    callback(null,"hoge");
}
```

### テスト用コード

index.jsを呼び出してやるだけだけど、最低限のお作法に従う。

```js:local.test.js
//require
const lambda = require('./index.js');

//とりあつ空っぽで（設定も可能）
const event = "";
const context = "";

//callackの定義
function callback(error, result){

	//まあ、書かなくても大丈夫
    if(typeof error !== 'null'){
        console.error(result);
        process.exit(1);
    }
    //出力（ここがメイン）
    console.log(result);
    process.exit(0);
}

//呼び出し
lambda.handler(event, context, callback);
```

### ローカルでのテスト

ローカルでの確認時はlocal.test.jsを呼び出す（ファイル名は何でも）。

```bash
node local.test.js
```

### zipする

全部zipしてアップしても問題ないと思いますが、local.tset.jsを除いてzip。後はアップロードするだけ。

```bash
zip -r test.zip index.js node_modules
```


## 参考

* http://www.hakopako.net/entry/2016/08/29/100000
* https://api.wp-kyoto.net/test-aws-lamnda-nodejs-as-local/
よく使うターミナルコマンド

#はじめに
Qiita初投稿です。
学習用で始めましたので、ガツガツご指摘頂けましたら幸いです。
こちらの記事では、自分がよく使うターミナルコマンドと、そのオプションをまとめていきます。
#諸々versinon
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
High Sierra 10.13.4
#諸々コマンド
- cd
 - `cd ../`一階層を戻る
 - `cd `ルートにいける
 - `cd ../..`二階層戻る
- pwd
 - 今いるところを教えてくれる
- mkdir 
 - ディレクトリ作成
 - `mkdir hogehoge`
- touch
 - ファイル作成コマンド(vimで作っちゃうのであまり使わない) 
 - `touch hogehoge.txt`
- ls
 - 現在の階層にあるものを表示  
- cat
 - ファイル閲覧コマンド。lessの方が使いたい。短いファイルはこれで良いかも
 - `cat hogehoge` 
- less
 - ファイル閲覧コマンド。 色々できる。
 - -Nオプションで行番号の表示
 - 閲覧中qで閉じる。vでvimで開く。/検索文字列 で検索
 - `less -N hogehoge.txt`←よく使う
- find 
 - ファイル検索　
 - `find hogehoge.txt`
- grep
 - 文字列検索
 - -rで階層表示
 - ./*で現在の階層以下
 - `grep -r hogehoge ./*`
- rm
 - ファイル削除 
- rmdir
 - ディレクトリ削除

#最後に
本当に、自分でよく使うものしか載せていません。
まだまだ、PGとしても初心者ですので、先輩方からのご指摘や、「これよく使うよー」、「このオプション便利だよー」等がありましたら是非教えて頂きたいです。
chainerの作法　その9

#概要
chainerの作法を調べてみた。
手書きを推定してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/5d7a7f8f-bf50-c2a2-9f38-6aa7c367765c.png)

#サンプルコード


```
import sys
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PIL import Image
import chainer
import chainer.functions as F
import chainer.links as L
from chainer import training, Chain, datasets, serializers
from chainer.training import extensions
import PIL

class MLP(Chain):
	def __init__(self, n_units, n_out):
		super(MLP, self).__init__(l1 = L.Linear(None, n_units), l2 = L.Linear(None, n_units), l3 = L.Linear(None, n_out))
	def __call__(self, x):
		h1 = F.relu(self.l1(x))
		h2 = F.relu(self.l2(h1))
		return self.l3(h2)

class pline(QWidget):
	def __init__(self, parent = None):
		QWidget.__init__(self, parent)
		self.px = None
		self.py = None
		self.points = []
		self.psets = []
		self.points_saved = []
		self.image2 = QImage(180, 180, QImage.Format_RGBA8888)
		self.image2.fill(qRgb(0, 0, 0))
	def mousePressEvent(self, event):
		self.points.append(event.pos())
		self.update()
	def mouseMoveEvent(self, event):
		self.points.append(event.pos())
		self.update()
	def mouseReleaseEvent(self, event):
		self.pressed = False
		self.psets.append(self.points)
		self.points_saved.extend(self.points)
		self.points = []
		self.update()
	def paintEvent(self, event):
		painter = QPainter(self)
		painter.setPen(QPen(Qt.black, 8, Qt.SolidLine))
		for points in self.psets:
			painter.drawPolyline(*points)
		if self.points:
			painter.drawPolyline(*self.points)
		painter2 = QPainter(self.image2)
		painter2.setPen(QPen(Qt.white, 8, Qt.SolidLine))
		for points in self.psets:
			painter2.drawPolyline(*points)
		if self.points:
			painter2.drawPolyline(*self.points)
	def save(self):
		self.image2.save(r'd:/test.png', 'png')
	def clear(self):
		self.points = []
		self.psets = []
		self.points_saved = []
		self.image2 = QImage(180, 180, QImage.Format_RGBA8888)
		self.image2.fill(qRgb(0, 0, 0))
		self.repaint()

class MainWindow(QWidget):
	def __init__(self, parent = None):
		super(MainWindow, self).__init__(parent)
		Button0 = QPushButton("recog")
		Button0.clicked.connect(self.recog)
		self.pain = pline()
		self.setGeometry(200, 200, 200, 200)
		layout = QVBoxLayout()
		layout.addWidget(self.pain)
		layout.addWidget(Button0)
		self.setLayout(layout)
		self.image = np.zeros((paint_width, paint_height, 3), np.uint8)
		self.setWindowTitle('MNIST')
	def recog(self):
		self.pain.save()
		img = Image.open('d:/test.png')
		img = img.resize((28, 28))
		img = img.convert('L')
		img_arr = np.array(img, dtype = np.float32).reshape(1, -1) / 255
		x = img_arr
		y = model.predictor(x)
		y = y.data
		p = y.argmax(axis = 1)[0]
		msg = QMessageBox()
		msg.setText("推定は、" + str(p))
		msg.setWindowTitle("recog")
		msg.setStandardButtons(QMessageBox.Ok)
		retval = msg.exec_()
		self.pain.clear()

paint_width = 180
paint_height = 180
model = L.Classifier(MLP(1000, 10))
serializers.load_npz('mnist3.model', model)

if __name__ == '__main__':
	app = QApplication(sys.argv)
	main_window = MainWindow()
	main_window.show()
	sys.exit(app.exec_())


```

以上。
VS Code1.23の新機能 - プロセスエクスプローラ

# Visual Studio Code 1.23の新機能
## プロセスエクスプローラ

https://code.visualstudio.com/updates/v1_23#_see-the-running-visual-studio-code-processes

VS Codeで現在実行中のプロセスの状況を確認できる**プロセス エクスプローラ**の機能が追加された。

**ヘルプ**メニューから「**プロセス エクスプローラを開く**」を選択するか、コマンドパレットから「**開発者: プロセス エクスプローラを開く**」でプロセスエクスプローラのウィンドウが表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/a49cd0e4-df3e-1e99-c76d-55e7da53c50d.png)

- 表示項目は、CPU使用率、メモリ使用量、プロセスID、プロセス名。
- CPU使用率とメモリ使用量は最大値が青字で表示される。
- プロセスを右クリックするとコンテキストメニューからプロセスを終了させることができる。
僕の考えたさいつよの2カラムデザイン【サイドバーCollapse可能】

Webの新しいGmailのデザインを参考にしてみました。

> https://japan.googleblog.com/2018/04/gmail.html

![Screenshot from 2018-05-05 10-38-03.png](https://qiita-image-store.s3.amazonaws.com/0/208363/6113e9e2-90bc-4014-e361-13d1120d84e4.png)


`.body`をflexにし、`nav`の`width`を固定値に`main`の`width`を100%にすることで、navを閉じる(navのwidthを変える)と自動でmainの幅が調節される！

<p data-height="265" data-theme-id="0" data-slug-hash="aGLzNj" data-default-tab="html,result" data-user="04" data-embed-version="2" data-pen-title="僕の考えたさいつよの2カラムデザイン" class="codepen">See the Pen <a href="https://codepen.io/04/pen/aGLzNj/">僕の考えたさいつよの2カラムデザイン</a> by John Doe (<a href="https://codepen.io/04">@04</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# まとめ
Google I/Oでもにかが **PWA Starter Kit** について語るらしいからみんな見てあげてね。

> https://events.google.com/io/schedule/?section=may-9&sid=cf302209-4151-4c6b-8590-7243d2c6c3c3

# 追記1
`main`の`width: 100%`はなくても大丈夫なようです。

<p data-height="265" data-theme-id="0" data-slug-hash="mLBeLv" data-default-tab="html,result" data-user="04" data-embed-version="2" data-pen-title="僕の考えたさいつよの2カラムデザイン" class="codepen">See the Pen <a href="https://codepen.io/04/pen/mLBeLv/">僕の考えたさいつよの2カラムデザイン</a> by John Doe (<a href="https://codepen.io/04">@04</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
PipenvでPythonのバージョンを切り替える方法

現在PyenvとPipenvを使って開発を進めているんですが、Pyenvでグローバル設定していてもpipenvで作った環境が異なる時がありました。

pipenvをしたフォルダ以下で下記のように確認すると2.7でした。これを3.6.5にしたいと思います。

```python
% pipenv shell
Spawning environment shell (/usr/local/bin/zsh). Use 'exit' to leave.
% python -V
Python 2.7.11
```
pipenv sync --python 3.6.5とします。

```python
% pipenv sync --python 3.6.5
Virtualenv already exists!
Removing existing virtualenv…
Creating a virtualenv for this project…
Using /Users/yujikawa/.pyenv/versions/3.6.5/bin/python3.6m (3.6.5) to create virtualenv…
```

これでOK!!
サーバーの基本（５．TCP/IPについて）

サーバーやネットワークについて勉強したことをまとめます。

1.サーバーとは何か
2.サーバーの種類
3.パーミッションについて
4.RAIDについて
5.TCP/IPについて

長くなるので、投稿を分けます。
この記事では、５.TCP/IPについてを記載していきます。
##TCP/IPとは
インターネットで標準的に利用されるプロトコル（通信方式）のことをいいます。

インターネットは、ネットワーク同士が相互に結びつきあうことで成立する世界最大・唯一のネットワークです。
全世界が同じプロトコルに統一し、ネットワーク内の機器同士が通信することで、初めてこれが実現しています。これは、IETFやIEEE、W3Cなどの国際的な標準団体によって定められています。

インターネットがない時代のコンピュータネットワークでは、OSメーカーなどが独自に決定していたため、同じLANに接続しても異なるOS間では通信ができなかったり、ネットワークが独立していたため、それぞれの会員同士しか通信できませんでした。
プロトコルを統一することで、現在は、異なるOSや異なるプロバイダー間での通信が可能となりました。


##ネットワークの階層とプロトコル
ネットワーク内では様々なプロトコルや機器が働いていますが、それらの役割を明確にするために、階層モデルが定められています。

Webページを見る際のプロトコルは次のようになります。

| ネットワークの階層（プロトコル）|階層の説明|プロトコルの説明|
|:-:|:-:|:-:|
|アプリケーション層（HTTP）|WebやWebメールなどのサービスを提供する|Webページを見るためのプロトコル|  
|トランスポート層（TCP）|アプリケーション層とインターネットを仲介すし、データを正しく届けるための手配をする|データを確実に届けるためのプロトコル|
|インターネット層（IP）|IPアドレスを手掛かりに、遠隔地にあるPCにもデータを届けられるようにする|一般的な通信に使うプロトコル|
|ネットワークインターネット層（イーサネット）|ネットワークカードなどの通信用のハードウェアを制御し、実際にデータを伝送する。|有線LANでデータを送るためのプロトコル|

アプリケーション層はサービスを提供し、その他３つの層はデータを届ける通信機能を担当します。

プロトコル群のなかにもTCP/IPがありますが、一般的にはインターネットで使用するプロトコル一式のことをTCP/IPといいます。
（プロトコル群であることを強調する場合、TCP/IPプロトコルスイートと呼ばれます。

##ネットワークでの通信
①LANケーブルでPCやサーバースイッチと繋げることで、物理的に同じネットワーク同士で接続する。

②別のネットワークに接続するには、スイッチの先にルーターを設置する。（DNSサーバーで名前解決し、通信する）

③TCP/IPによりネットワーク間の住所を定め、データをやり取りする。（DHCPサーバーで割り振られる）

##IPアドレスとは
ネットワーク間の住所のようなもので、ネットワーク内の全ての機器には、DHCPサーバーによりIPアドレスが割り振られています。
IPアドレスを手掛かりにデータのやり取りをしています。

ネットワーク部とホスト部に分かれています。

- ネットワーク部...複数あるネットワークの中で、目的のホストがどのネットワークに属しているのか特定する。（学校で例えれば2年1組といったクラス）


- ホスト部...ネットワーク内で重複しないように割り当てられているアドレス。（学校で例えれば、出席番号）

##IPアドレスの確認方法
ここでは、ターミナルソフトで確認する方法について記載します。

ifconfigかip addrで確認できます。

● ifconfig
![ifonfig.jpg](https://qiita-image-store.s3.amazonaws.com/0/232451/a93236be-f7c4-009b-6817-65ee4d9328ff.jpeg)

●ip addr
![ip_addr.jpg](https://qiita-image-store.s3.amazonaws.com/0/232451/7ad3e792-39ea-c694-a3f7-69d271cb7d0c.jpeg)

※現在のLinux環境では、ipコマンドが推奨されています。

画像内の四角で囲ってある部分は、
黄...インターフェイス名
赤...IPアドレス
緑...サブネットマスク

を表しています。

サブネットマスクは、IPアドレスのどこまでがネットワークアドレスで、どこまでがホストアドレスか示すものです。
「255」になっている部分がネットワークアドレス、「0」となっている部分がホストアドレスとなります。

ip addrでは、サブネットマスクがなく、IPアドレスの後ろに/8のような記載が追加されていますが、その「/8」の部分がネットワークアドレスの長さ（ビット数）を表しています。


##ポート
IPアドレスは、「コンピュータ」は特定できますが、そのコンピュータが、Webページを見たいのか、メールを送信したいかなど、どの「アプリケーション」かまでは判断できません。

アプリケーションを判断するために、サーバーは「ポート」という出入口を用意しています。

各プロトコルにはそれぞれ、ポート番号が定められており、それにより適切な処理が行われます。

例えば、HTTPは80番、HTTPを暗号化したHTTPSは443番、FTPは21番といったようにです。

##ポートの確認方法

``netstat -ano``
で確認できます。
![port_check.jpg](https://qiita-image-store.s3.amazonaws.com/0/232451/88b83901-0600-0b1b-2bde-3cdf62ad5e27.jpeg)

どのファイルがそのポート番号を使用しているかを調べるためには、ポート番号と同列の一番右のPIDを確認し、

`` tasklist / svc / fi "PID eq PID番号" ``

を入力します。

<img width="500" alt="port_file_check.png" src="https://qiita-image-store.s3.amazonaws.com/0/232451/fbd84aff-b7fb-57c8-79bb-bdebac56fccf.png">

xampp等でポート番号が重複してエラーが出たときに、ファイルを特定するのに使用できます。

##参考資料
・「いちばんやさしいLinuxコマンド入門教室」著：中島能和　株式会社ソーテック社　2018年
・「スラスラわかるネットワーク＆TCP/IPのきほん　第２版」著：リブロワークス　SBクリエイティブ株式会社出版　2018年
・http://www.atmarkit.co.jp/ait/articles/0207/20/news003.html
・http://www.atmarkit.co.jp/ait/articles/0207/20/news003_2.html
Python素人の自分が、「ゼロから作るDeep Learning」を読みながらDeep Learningに触れるの巻 その1

#まえがき
最近巷で流行っている人工知能だのAIなるものを、素人の自分もしてみむとしてするなり

ということで、1冊本を買ってきて、それの実装をやってみるという流れを記録することにしました。
対象の本は以下の通り。
[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](http://amzn.asia/0GbqyPT)

自分の目標として、書いたものを人に見せることで、発信したいという思いもあるので、
アウトプットの訓練も兼ねて、Qiitaに投稿することにしました。
生暖かい目で見守ってやってくださればと思います。

5/5現在、3章の途中まで執筆中。さいごまで心折れないようにがんばる。

# 筆者レベル
* 業務としては4年ほどASP.NET MVCを触って開発しています。Windowsプログラマです。
* 業務で触る言語は上記以外だとC#がメインで、少しだけC++を触ります。
* またWebフロントエンドも触るのでHTML/Javascript(jQuery含む)の知識はすこしあります。
* なお、業務ではPythonは全く出てきませんし、ほとんど触ったことはありません
* 況や人工知能をや。(大学の授業で習ったけれども、身についている感はないです)

というわけで、プログラミングはできるけど、Pythonや人工知能はよーわからん、という人向けのお話になります。

とはいえ、本の内容そのままのコードをここに記載することは無いと思います(本に書いてあるままですし)

# 実装に入る前に
**※ 今後、この記事ではWindows 10 Pro(x64)を使用することとします。**

個人的に、ちゃんとしたIDE(統合開発環境)は欲しい。
Visual Studioに慣らされた体の自分にとって、**IDEがないのはとんでもない苦痛**です。
ということで、本の中では特に触れられていませんが、統合開発環境を入れることにしました。
入れたのはこちら → [PyCharm](https://www.jetbrains.com/pycharm/)
とりあえず、FreeのCommunity版を入れることにします。
ついでに、1章で言及されているAnacondaディストリビューションから、Python 3.6を入れます。 → [Anaconda](https://www.anaconda.com/download/)

使っているうちに嫌になったら、お気に入りのエディタを探す旅に出ることにしますが、今の時点ではこれでいきます。

# 本題
## 1章 Python入門
1章はサクッと。メソッド名定義は`def`、コンストラクタは`__init__`で定義するのね。
自分のインスタンスを`self`で明示するのは変な感じするけど、こういうものなんですね

と思ったら、そのままではPyCharmがnumpyを引いてくれない事案発生。検索して以下の方法で解消する
[PyCharmでNumPyを使うためのメモ書き](https://qiita.com/mao_ya/items/82f278723734779376a4)
実行用の仮想環境にnumpyやらmatplotlibを明示的にinstall packageしないといけないらしい

plotまで試して終了。

## 2章 パーセプトロン
いよいよ人工知能らしいワードが。入力値に重みをかけたものを足し合わせて、一定値Θを超えたかどうかで0/1を決めるのがパーセプトロン。
原理はわかりやすい。これでAND/NAND/ORを作るということね。

線形関数を使ってパーセプトロンを作る = 座標面のあらゆる点を直線で2つに識別する
だが、点の分布によっては直線で分けられないことがある。まぁそうだよね
ということで、曲線もOKにする = 非線形関数を使って識別する ということだが、
「非線形に識別する」ということを、パーセプトロンを多層にする(2層以上)にすることで実現できる。
この「多層に出来る」ことがパーセプトロンの強みだそう。

## 3章 ニューラルネットワーク
ニューラルネットワークは多層にしたパーセプトロンと同じつながり方で実現出来る。
すなわち、
　入力層(第0層)　→ 中間層(第1層) → 出力層(第2層)
の構造。

入力層 → 中間層 を 活性化関数h(x)を使って表す。
活性化関数はステップ関数やシグモイド関数など、いくつか種類があるが、コレがいずれも非線形関数であることが重要。
なぜなら、**非線形関数でないと多層にするメリットがなくなってしまう**から。
線形関数を何層に重ねても意味が無い(何層にも重ねたものも、1層で表現できてしまう)から、とのことだ

とりあえずここまで。また読み進めたら先に行きます。
オフラインリアルタイムどう書く F06 の実装例( Go )

オフラインリアルタイムどう書く F06 の実装例( Go )

問題 : http://nabetani.sakura.ne.jp/hena/ordf06numit/
実装リンク集 : https://qiita.com/Nabetani/items/deda571c9451bd7d3175

```go:実装
package f06

import (
	"strconv"
	"strings"
)

func implNoMemo(root, target int) int {
	if root == target {
		return 1
	}
	if root < target {
		return 0
	}
	return implNoMemo(root/2-10, target) + implNoMemo(root*2/3, target)
}

func solveNoMemo(src string) string {
	split := strings.Split(src, ",")
	root, _ := strconv.Atoi(split[0])
	target, _ := strconv.Atoi(split[1])
	return strconv.Itoa(implNoMemo(root, target))
}

func impl(root, target int, memo map[int]int) int {
	if root == target {
		return 1
	}
	if root < target {
		return 0
	}
	val, contains := memo[root]
	if contains {
		return val
	}
	c := impl(root/2-10, target, memo) + impl(root*2/3, target, memo)
	memo[root] = c
	return c
}

func solve(src string) string {
	split := strings.Split(src, ",")
	root, _ := strconv.Atoi(split[0])
	target, _ := strconv.Atoi(split[1])
	memo := make(map[int]int)
	return strconv.Itoa(impl(root, target, memo))
}
```

```go:テスト
package f06

import (
	"testing"
)

func Test(t *testing.T) {
	var tests = []struct {
		name  string
		input string
		want  string
	}{
		{"0", "123,4", "5"},
		{"1", "1,1", "1"},
		{"2", "2,1", "1"},
		{"3", "3,3", "1"},
		// 中略
		{"30", "5745432,1032", "1287"},
	}
	for _, test := range tests {
		got := solve(test.input)
		//got := solveNoMemo(test.input)
		if got != test.want {
			t.Errorf("%v: solve(%q)=%q, want %q\n", test.name, test.input, got, test.want)
		}
	}
}
```

やはり、再帰呼び出ししつつメモ化の一択。
とはいえ、折角 Go なので、メモ化なしも用意してみた。

今回はサクッと書けた。
問題が簡単すぎるのか、私が慣れたのか。

簡単なので見どころはあまりないんだけど、一応再帰を描いたのは初めてかな。

ちなみに、メモ化ありだと0.01秒ぐらい。
メモ化なしでも0.89秒ぐらいで、結構速い。
pandasのaxisの方向の覚え方

# pandasのaxisの疑問

pandasのデータフレームに対して関数を適用する際に、軸の指定をすることはよくあることです。
その際にaxisの指定の仕方について疑問に生じたこととその回答についてメモしておきます。

# 前提
以下のようなデータフレームの操作に関する場合を考える。

```python
df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
     columns=["col1", "col2", "col3", "col4"])
df
   col1  col2  col3  col4
0     1     1     1     1
1     2     2     2     2
2     3     3     3     3
```
# 平均を取る
`df.mean(axis=1)`として平均を取ると、行ごとの平均が求まります。

```python
df.mean(axis=1)
0    1
1    2
2    3
```
# 削除する
一方で、`df.drop(name, axis=1)`とすると、列を削除することになります。

```python
df.drop("col4", axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3
```

# 疑問
平均を取る作業では、`asis=1`によって、行の平均が求まり、
削除の作業では、`axis=1`によって、列を削除することになります。

このpandas仕様は非常にわかりにくいように思います。

# 回答
stackoverflowにて非常にわかりやすい説明があったので、実は[そちら](https://stackoverflow.com/questions/25773245/ambiguity-in-pandas-dataframe-numpy-array-axis-definition)を簡単に和訳したものがこの記事です。

`axis=0`はそれぞれの列に対してだったり、それぞれの行ラベル(インデックス)に対してメソッドを適用する場合に用います。

`axis=1`はそれぞれの行だったり、列ラベル(列名)に対してメソッドを適用する場合に用います。

これをわかりやすく説明した画像を[元の記事](https://stackoverflow.com/questions/25773245/ambiguity-in-pandas-dataframe-numpy-array-axis-definition)から引用します。
![stack](https://i.stack.imgur.com/DL0iQ.jpg)

## 覚え方
axis=0('index')  →***列ごとに処理を行う***
つまり、垂直方向に次元が圧縮される
結果、行が残る

axis=1('columns')→***行ごとに処理を行う***
つまり、水平方向に次元が圧縮される
結果、列が残る

この3段階の理解をしておくと忘れにくいはずです。

dropの処理も、レコードを1つ1つ削除していくことで、結果列を削除していると考えればうまく理解できる
## 補足
ちなみにこのpandasの仕様はnumpyの仕様に従っているらしいです。
詳しくは[こちら](https://docs.scipy.org/doc/numpy/glossary.html)
pandas python データフレーム　indexとcolumnsのタイトルのつけ方(行名、列名ではない）

行名、列名では無く、データフレームindexとcolumnsのタイトルのつけ方。
日本語ググってすぐに出てこなかったから、メモ。

インデックスのタイトル
df.index.name = colname1

列のタイトル（列名ではない）
df.columns.name = colname2

参考リンク
https://stackoverflow.com/questions/18022845/pandas-index-column-title-or-name
stravaでロードバイクの偏差値を計算してみた


ふと自分のロードバイク偏差値が気になったので計算してみた。

まず、Stravaのアプリを登録して、CLIENT_SECRETをゲット

https://medium.com/@annthurium/getting-started-with-the-strava-api-a-tutorial-f3909496cd2d

対象となるセグメントの全ランキングを取得。
今回は、ベイエリアのライダーがベンチマークにしている Old La Honda(https://graphics.stanford.edu/~lucasp/grade/oldlahonda.html) を使用。

``` python
import requests
import json
import time

apiPath = "https://www.strava.com/api/v3/segments/8109834/leaderboard"

headers = {'Authorization': 'Bearer STRAVA_CLIENT_SECRET'}

pageLimit = 100

firstPagePath = apiPath + "?page=1&per_page=" + str(pageLimit)
firstPage = requests.get(firstPagePath, headers=headers).json()
totalCount = firstPage["entry_count"]

pageCount = totalCount / pageLimit

entries = []

for num in range(pageCount):
    pageNum = num + 1
    path = apiPath + "?page=" + str(pageNum) + "&per_page=" + str(pageLimit)
    pageData = requests.get(path, headers=headers).json()
    entries += pageData["entries"]
    time.sleep(0.5)

print json.dumps(entries)

```

Jupiter notebookでヒストグラムと偏差値を計算

``` python
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import json


f = open('oldlahonda.json', 'r')
entries = json.load(f)

elapsed = []
ranking = {}
power = []

for entry in entries:
    ranking[entry["rank"]] = entry

for t in ranking.values():
    elapsed.append(t["elapsed_time"])

np_scores = np.array(elapsed)  
mean = np.mean(np_scores)
std = np.std(np_scores)

score_a = 1531 #　My best record

deviation = (score_a - mean) / std
deviation_value = 50 - deviation * 10

print(deviation_value)

plt.hist(elapsed, bins=200)
plt.plot()
```

偏差値　57.8らしい　精進せねば

ヒストグラムはこんな感じ（x軸は秒）
![download.png](https://qiita-image-store.s3.amazonaws.com/0/77716/b09df11e-11ce-91c1-a809-ed28c8cbf611.png)
VS Code1.23の新機能 - 検索ビューの条件ボックスが再度分割

# Visual Studio Code 1.23の新機能
## 検索ビューの条件ボックスが再度分割

https://code.visualstudio.com/updates/v1_23#_return-of-the-separate-search-include-and-exclude-input-boxes

前回のリリースで１つに統一された、検索ビューの包含/除外条件の入力ボックスが、再度２つに分割された。

v1.21|v1.22|v1.23
:-:|:-:|:-:
![検索ビューv21.png](https://qiita-image-store.s3.amazonaws.com/0/181011/64ce1c2d-fdef-edf3-1836-f63d4d25b6a6.png)|![検索ビューv22.png](https://qiita-image-store.s3.amazonaws.com/0/181011/0ade6c12-c075-2242-f81c-4b23e6db6c83.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/83ef5c0d-1d50-819d-e718-530687759ba5.png)

[この](https://github.com/Microsoft/vscode/issues/46315)Issueで議論されていて、それによると、

- 包含と除外の両方を複数指定した場合、ボックスが分かれているほうが分かりやすい
- 除外を表す`!`は、１つのボックス内で包含/除外条件が混在していると見分けにくい
- 条件を頻繁に変更する際にボックスが１つだとやりづらい
- 包含側(あるいは除外側)の条件だけを一時的に全部消したい場合などに不便

なるほどー。

ちなみに、前回ボックスを１つにした理由としては、

- カーソルを1つのボックスに置いたまま条件指定ができる
- 過去の検索履歴をたどる際にボックスが１つであれば、包含/除外の条件をセットで履歴参照できるので便利
- レイアウト上のスペースの節約になる
- 他のエディタと同じにしたい

なるほどねー。

確かに使い方によってどっちのほうが便利かは変わってくるねー。

いやー、UXって難しい！
メモ：node.js での debug 出力

```sh:CommandPrompt
> set DEBUG=*
> node index.js
```

```sh:bash(macOS/Linux/WSL)
DEBUG=* node index.js
```

これをやっておくと、**[debug](https://www.npmjs.com/package/debug)** を使っている依存モジュールの動きが見えることが多い。
\# 自分もきちんと書かないと...
AWS code commit を触ってみた感触

いまさらながらAWSのマネージドgit repositoryサービス code commit を触ってみた。

gitリポジトリの選択肢はいろいろある
・SaaS系[特化型]　（例：GitHub、BitBucket、backlog）
・SaaS系[クラウドベンダ製]　(例： AWS codecommit、GCP Cloud Source Repositories )
・OSS系（例：gitbucket, GitLab）

また、GitHubなどSaaS系でも、オンプレミス環境で設置可能なEnterprise版もあり、どの環境で利用したいか（パブリックでもOKなのか、プライベートに閉じるのかなど）セキュリティ要素も加味すると選択肢も変わる。


https://aws.amazon.com/jp/codecommit/
http://aws.typepad.com/sajp/2017/03/aws-black-belt-online-seminar-aws-code-services-slides_qa.html

codecommitの特徴はおそらく
・アクセス制御をIAMで管理できる
・マネージド（インスタンス管理・パッチ適用等が不要）
・AWS SNSやCodeBuild、Lambdaなど、AWSの他サービスとの親和性
あたりでしょうか

ちなみにGitHubやそのcloneのgitbucketなどでおなじみのFork機能はありません。

ざっくりとした利用までの流れとしては
1. AWSコンソールのCodeCommitで、リポジトリを作成する
2. 利用者は個々にIAMページで、リポジトリアクセス用の認証情報（SSH公開鍵）を登録する。また対象IAMユーザにCodeCommit利用に必要なポリシー設定をしておく。
3. あとは個々にローカル環境にgit cloneして利用

注意点としては、現時点でCodeCommitはパブリックアクセスが前提で、東京リージョンの場合は
git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/XXX
というエンドポイントに対して、httpsかsshで接続することになる。
PrivateLink / VPC Endpointには対応していない。
完全にclosedな環境や、一切のパブリックアクセスを認めたくない場合は、PrivateLink / VPC Endpoint対応を待つ必要がありそう。

VPC的な要素を置いておく場合、例えばgithub + jenkinsのような、ソースコードバージョン管理→テスト＆ビルド→デプロイのようなCI/CDフローを、CodeCommitとCodeBuildなどを組み合わせてマネージドで実現できる。

また、SNSの連携で、プルリクがあったことをメールで通知したりもできる。

コスト面は、毎月5アクティブ ユーザーまでは無料の枠もあり、追加分は 1USD/月/user（10GB/月、2,000 Gitコマンドの発行）とお得。
なお、リポジトリデータはKMS暗号化される。