OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】わりとよく使うArtisanコマンド集


# Laravelでよく使うArtisanコマンド一覧

リーダブルにちゃんと載っているし、helpでも一覧が表示されますが、
さっとコピーして使えるように自分的によく使うコマンドをまとめておきます。
(※Lumenでは一部のコマンドしか使えないようですので要注意)

# make:migration系（DB関連）

## テーブルの作成

```
php artisan make:migration create_users_table --create=users
```

**オプション**
`--create=users`・・・テーブル名

## テーブル構造を変更する場合

```
php artisan make:migration rename_birth_to_birthdate_on_contacts_table --table=contacts
```

**オプション**
`--table=contacts`・・・テーブル名

# migrate系（DB関連）

## テーブルのリフレッシュ

全てリセットしてからマイグレーションを行う

```
php artisan migrate:refresh
```

## テーブルのロールバック

```
php artisan migrate:rollback --step=1
```

**オプション**
`--step=1`・・・戻す数

## テーブルのリセット

全てリセットする

```
php artisan migrate:reset
```

## マイグレーションの状態を確認する

```
php artisan migrate:status
```

### オプション

```
php artisan migrate:status --env=testing --database=sqlite
```

`--env`・・・環境
`--database`・・・DB

上のコマンドでいうと、テスト用のSQLiteのマイグレーションの状態を確認できます

# Seeder系（DB関連）

## Seederの生成

```
php artisan make:seeder UsersTableSeeder
```

## Seederの実行

```
php artisan db:seed --class=TestSeeder
```

**オプション**
`--class=TestSeeder`・・・クラス名

# make:controller

Controllerの生成

```
 php artisan make:controller UsersController
```

※別ディレクトリへの生成（例：Adminディレクトリ）

```
 php artisan make:controller Admin\\UsersController
```

## リソースコントローラー

```
 php artisan make:controller UsersController  --resource
```

**オプション**
`--resource`

# make:model

Modelの生成

```
php artisan make:model User
```


# make:request

Requestクラスの生成

```
php artisan make:request UserRequest
```

# 認証クイックスタート（スキャフォールディング）

```
php artisan make:auth
```

**スキャフォールディング**・・・足場づくり

# ルーティング確認

```
php artisan route:list
```

# キャッシュクリア系

## オートロード

```
composer dump-autoload
```

## キャッシュのクリア

```
php artisan cache:clear
```

## 設定キャッシュのクリア

```
php artisan config:clear
```

## ルーティングのキャッシュクリア

```
php artisan route:clear
```

## Viewのキャッシュクリア

```
php artisan view:clear
```


# 参考URL
 - [Laravelインデックス](https://readouble.com/)

# おわり

以下もどうぞ

- [【Laravel】Laravelでよく使うroute()とview()とredirect()まとめ](https://qiita.com/sola-msr/items/4f92686d474118d1cceb)
- [【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表](https://qiita.com/sola-msr/items/fac931c72e1c46ae5f0f)
- [【Laravel】Viewのbladeの書き方](https://qiita.com/sola-msr/items/a128f4e0900f3541690c)
Azure Docker Wordpress実行

#Docker on Azure シリーズ
- [Azure Docker環境構築](https://qiita.com/seinoro/items/1bfe7ee11c1083dba11d)
- [Azure Docker Wordpress実行](https://qiita.com/seinoro/items/b8461f197161f72ccbe3)

# はじめに
Azure + DockerでWordpressを起動してみます。

**参考**
[ゼロからはじめるDocker - Dockerコンテナを利用してみよう](https://news.mynavi.jp/article/docker-3/)
[Dockerイメージとコンテナの削除方法](https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae)


## Azureにて、8080ポートを許可します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/ba388546-6bdf-4c31-c142-39b03f186824.png)



## Dockerイメージからコンテナを起動する(mysql)
```bash
$ sudo docker container run \
   --name wordpress-mysql \
   -v /opt/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mysql \
   -d \
   mysql
```

## Dockerイメージからコンテナを起動する(wordpress)
```bash
$ sudo docker container run \
   --name my-wordpress \
   --link wordpress-mysql:mysql \
   -e WORDPRESS_DB_PASSWORD=mysql \
   -p 8080:80 \
   -d \
   wordpress
```

## Webブラウザーでサイトにアクセスします。
Azure VMのURLを入力します。
http://docker1.japaneast.cloudapp.azure.com:8080

Wordpressの設定画面から初期設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/22d09c32-4233-8d57-91fc-428e0b6ab755.png)

サイトを表示するとWordpressが正常に表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/033b0e74-65b6-f2e0-795f-ebdc6d083c0b.png)


##作成したコンテナを削除する。

```bash
$ sudo docker container stop my-wordpress
$ sudo docker container stop wordpress-mysql
$ sudo docker container rm my-wordpress
$ sudo docker container rm wordpress-mysql
```
第31話 メルセンヌ数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第31話です。

```math
M_5=2^5-1=31
```

5番目のメルセンヌ数は31です。

メルセンヌ数とは、$2^n-1$の形をしている数のことで、
この数が素数のときはメルセンヌ素数と呼ばれます。

この数は第15話に出てきたフェルマー数に似ています。
あちらは2の冪乗+1でしたが、こちらは-1になっています。

この数は、第28話の完全数の時にも出てきています。
メルセンヌ素数を見つければ、完全数も見つけることができます。

メルセンヌ素数を見つけるプロジェクトがあり、
現在までに50個のメルセンヌ素数が見つかっています。
すなわち、完全数も50個見つかっていることになります。

大きな素数が見つかり、度々ニュースになりますが、ほぼメルセンヌ素数です。
これは、メルセンヌ数にだけ使える素数判定法があること、
そして、GIMPSというコンピュータをネットワークで繋いで
全体でメルセンヌ素数を探すプロジェクトがあることが理由でしょう。

しかし、それだけの事をしてもメルセンヌ素数は全部で50個しか見つかっていません。
GIMPSのプロジェクトで見つけた物に限れば十数個です。
それだけ大きい素数を見つけるのはとても面倒なことなのです。
OpenSSL で作成したファイルの SHA ハッシュ値を比較検証する（coreutils フォーマットのダイジェスト値のベリファイ）

> 以下の、<code>[OpenSSL](https://ja.wikipedia.org/wiki/OpenSSL)</code> の `openssl dgst -r` コマンドで作成した `coreutils` フォーマットのハッシュ値（ダイジェスト、チェックサム）を検証したい。

  ```bash:SHAハッシュ（ダイジェスト）ファイルの作成
  openssl dgst -r -out sample.txt.sha256 -sha256 sample.txt
  ```

つまり、受け取った sample.txt が、上記の sample.txt.sha256 とマッチするか知りたいのです。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. **チェックサムのファイルの検証には `shasum` コマンドを使います。**
1. 基本構文
    ```bash:チェックサムの基本構文
    shasum -a <SHAアルゴリズム> -c <SHAチェックサムファイルのパス>
    ```
1. 具体例
     ```bash
     shasum -a 256 -c sample.txt.sha256
     ```
    - [オンラインで動作をみる](https://paiza.io/projects/cOtllaI5zbl62ot_GeLwVw) @ paiza.IO

## TS; DR

### `openssl` ではファイルのハッシュ値は作成できても検証はできない

`openssl` では `dgst` コマンドでファイルのハッシュ値／ダイジェストを算出することができ、SHA-1 より堅牢な [SHA-2](https://ja.wikipedia.org/wiki/SHA-2)（SHA-256 や SHA-512 など）のアルゴリズムも使えます。

- [dgst](https://www.openssl.org/docs/man1.0.2/man1/openssl-dgst.html) | openssl | Docs @ OpenSSL.org

この時、`openssl dgst -r`、つまり `-r` オプションを付けると <code>[coreutils](https://ja.wikipedia.org/wiki/GNU_Core_Utilities)</code> フォーマットで出力できるため、従来の <code>[sha1sum](https://qiita.com/organizations/qiitadon)</code> コマンドのようにファイルのチェックサムとして利用できます。

問題は、この**チェックサム（ダイジェスト値／ハッシュ値）を検証するコマンドが `openssl` にはない**ことです。

`openssl dgst -verify` で検証できそうな気がするのですが、意外にできません。

なぜなら、**`-veryfy` オプションはハッシュ値（ダイジェスト値）の検証ではなく、公開鍵による署名の検証コマンド**だからです。これは、OpenSSL は元々 SSL（[Secure Sockets Layer](https://ja.wikipedia.org/wiki/Secure_Sockets_Layer)）通信の暗号化のためのライブラリだったので、データの暗号化や署名を主としているため、`-sign` オプションで署名したファイルを `-verify` で検証するために使われます。

ファイルの署名ではなく、ファイルのチェックサムを比較して検証したい場合は `shaXXXsum` 系のコマンドを使います。

`sha1sum` のように `sha256sum` や `sha512sum` などもありますが、汎用の `shasum` コマンドがシンプルでおすすめです。

> <sup>🐒 &nbsp; ハッシュ値／ダイジェスト値／チェックサムの違いは、以下の記事の「ハッシュ関数の基本と特徴」の項目をご覧ください。</sup>
>
> - [hashアルゴリズムとハッシュ値の長さ一覧（＋ハッシュ関数の基本と応用）](https://qiita.com/KEINOS/items/c92268386d265042ea16#tsdr) @ Qiita

### `shasum` の基本構文

```bash:チェックサムの基本構文
shasum -a <SHAアルゴリズム> -c <SHAチェックサムファイルのパス>
```

- `<SHAアルゴリズム>`：`1`, `224`, `256`, `384`, `512`, `512224`, `512256`
- `<SHAチェックサムファイルのパス>`：ファイル内に１行１ファイルで複数ファイルを指定することもできる。
- 留意事項
  - 比較する際のダイジェスト・ファイルのフォーマットは [`CoreUtils`](https://ja.wikipedia.org/wiki/GNU_Core_Utilities) 互換であること。
     - 形式が `<ハッシュ値> <ファイル名もしくはファイルのパス>`
  - ハッシュ作成時の `openssl dgst` に `-r` オプションを付けると `CoreUtils` 互換のフォーマットになる。
  - `openssl` の `verify` サブ・コマンドは署名の検証用。**ダイジェスト（ハッシュ値）の検証用ではない**。
  - ハッシュ値による検証は「`verify`」（証明）ではなく「`compare`」（比較）もしくは「`check`」（確認）と覚える。

```shell-session:使用例
$ # サンプルファイルの作成
$ touch sample.txt
$
$ # SHA256 のハッシュファイル作成
$ openssl dgst -r -out sample.txt.sha256 -sha256 sample.txt
$ 
$ # 中身のチェック（`-r` オプションで出力フォーマットが変わることに注意）
$ cat sample.txt.sha256
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *sample.txt
$ 
$ # 比較検証（コンペア）
$ shasum -a 256 -c sample.txt.sha256
sample.txt: OK
```

- [オンラインで動作をみる](https://paiza.io/projects/cOtllaI5zbl62ot_GeLwVw) @ paiza.IO

### 動作検証済み環境

- macOS HighSierra（OSX 10.13.6）
- `$ openssl version`: LibreSSL 2.2.7
- `$ shasum --version`: 5.84
二次判別分析の境界線をggplotで描く方法

はじパタ6章の二次判別分析で例示されている図を描く方法です。
少し泥臭いやり方です。まず網目状に格子を貼り、それぞれの点で識別関数の値を計算します。その上位2つの誤差がe以下の点のみ残し、それ以外は消去するやり方です。
おそらく、このやり方で他の判別分析の図も作れると思います。

![downloadのコピー2.png](https://qiita-image-store.s3.amazonaws.com/0/55421/820e965f-c6fe-0617-ac68-c469dac48fb9.png)


![downloadのコピー.png](https://qiita-image-store.s3.amazonaws.com/0/55421/f8d35588-b494-9237-d59a-7291dd37eda5.png)

###コード
qdaのライブラリを使ってないにも関わらず、tidymodels群のパッケージを使っているので見づらいですが。。。

```R
library(tidyverse)
library(tidymodels)

df = iris %>% select(contains("Width"),'Species')

data = df %>% recipe(Species ~.)  %>% step_center(all_predictors()) %>% step_scale(all_predictors()) %>%step_dummy(Species, one_hot = T)  %>% prep(df) %>% bake(df) 

X = data[,c(1,2)] %>% as.matrix
T = data[,-c(1,2)] %>% as.matrix
W = solve(t(X)%*%X) %*% t(X) %*% T

check_border = function(v,e){
    v_order = sort(v,decreasing = TRUE)
    v_order[1]-v_order[2] < e
}
mesh = crossing(seq(-3,3,by=.01),seq(-2,2,.01)
flag = mesh %>% as.matrix) %*% W %>% t %>% as.tibble %>% map_lgl(~check_border(.,.005)) 
border = mesh %>% filter(flag %>% t) %>% rename_all(~c('x','y')) 

df %>% recipe(Species ~.)  %>% step_center(all_predictors()) %>% step_scale(all_predictors())  %>% prep(df) %>% bake(df) %>%
ggplot(aes(x=Sepal.Width,y=Petal.Width)) + geom_point(aes(color=Species, shape=Species)) + geom_point(data=border,aes(x,y),size=.01)
Github リポジトリの削除

##リポジトリの削除方法
1. 削除したいリポジトリを開く
2. Settingを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/203285/846a52fd-3692-1078-e4e0-355e2399d4d7.png)

3. Settingページの一番下「Delete this repository」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/203285/30f6d99e-6b7c-6f04-cba2-7ee04811df6e.png)

4.削除したいリポジトリ名を入力し削除
![image.png](https://qiita-image-store.s3.amazonaws.com/0/203285/86961e05-e279-4ca3-3071-6ec4771b1692.png)
効率的に成長して行くには（記事を読んで、自己の振り返り）

お久しぶりです。仕事で詰まってしまった＋お盆で、しばらく投稿出来てませんでした。
今日からまた再開していきます。

今日はいつもと違う感じで投稿しようと思います。

TECH::NOTE様からの引用です。
<a href="https://tech-camp.in/note/technology/5952/">【プログラミング勉強法】効率よく成長する３つの方法</a>


完璧に理解をしようとしてから、コード書き始める
-
これやってしまってますね。
完全に理解しようとしてから書き始めて、
「こんな時間に立ってる！」と思うことが多々ありました。

全く考えずにコードを書いてしまうことも良くない
-
見ながらただ写すだけでは意味が無いことはわかっていたので、
わからないことは調べたりしながら少しずつ進めてました。

バランスって難しい。。。


インプットとアウトプット
-
これが出来ていなかった事が致命的ですね。

自己流で書いてみよう→理想が高すぎて挫折
このパターンの繰り返しでした。

簡単なプログラムでも良いから書いてみる。
これをおろそかにしていたことで中々成長することが
できなかったと振り返って感じました。

少しずつ簡単なプログラムを自分なりに書いてみて
Qiitaや他のところで投稿していこうと思います。

少しだけ振り返ってみて・・・
-
Qiitaのプログラムや他のサイトのプログラムを見ても
まだまだ何を書いているのかすらわからないことだらけです。

少しのプログラムの修正でも構造を理解するのに数時間
かかったりとまだまだ未熟者です。

まずはQiita以外のアウトプットから始めていこうと思います。

社内の先輩や勉強会でリアルタイムにコードを見てもらうこと
で、記憶にも残りやすい、先輩の書き方を見ることができる、
などのメリットもあると思うので実践していきます。

投稿期間が空きましたが、今後もよろしくお願いします。
Vue.js で３Dモデルを表示する。

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

vue.js で簡単に３Dモデルを表示したかったので、[vue-3d-model](https://github.com/hujiulong/vue-3d-model) を試してみました。

# サンプル
## Vue.js のプロジェクト作成

- vue-cli コマンドで基本的なプロジェクトを作成します。

```shell
vue init webpack my-project
cd my-project
npm install
```

## ３Dモデルを取得

- 以下サイトの ～.obj ファイルを使わせていただきました。

http://www.3dchaya.com/views/content/us/architecture/houryuji_pagota00.html

- static フォルダに格納

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/0d3d7f04-385c-99d7-3f8a-eafb372c6444.png)


## ３Dモデルの表示

- vue-3d-model を使えるようにインストールします。

```shell
npm install vue-3d-model --save
```

- src/App.vue を以下のように書き換える。

```html:src/App.vue
<template>
  <div id="app">
    <model-obj src="static/ryu0xb.obj"></model-obj>
    <router-view/>
  </div>
</template>

<script>
import { ModelObj } from 'vue-3d-model'
export default {
  name: 'App',
  components: { ModelObj }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

```

## 実行確認

- 実行

```shell
npm run dev
```

- http://localhost:8080/#/ をブラウザで表示すると、Vue.js のロゴが３Dモデルに変わった事が確認できる。

### 変更前

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/a140d58d-19d4-2a20-8d64-f1dd41a66c45.png)

### 変更後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/3182096d-90e6-a124-da41-cb8e1c9557ac.png)

# その他

[デモサイト](https://hujiulong.github.io/vue-3d-model/#/demo-basic) の右メニューから、扱える３Dフォーマットが確認できますのでどんな形式が使えるのか確認が必要になります。（今回は、obj形式を利用させていただきました）

また、50MB ほどの obj形式 を利用した際に描画に１０秒以上かかってしまったため低ポリゴン化などの削減が必要になるかもしれませんね。

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
【Swift】URLでパスを扱うときに便利なプロパティとメソッド

## NSStringかURLか、それが問題だ

iOSでファイルを扱うためには、パスを扱う必要があります。
NSStringにはパスを扱うための便利なプロパティやメソッドがたくさんあるので、それらを使っていたら「iOSでのファイル操作はNSStringではなくURLでするほうがいいよ」と会社の人が教えてくれたので調べてみました。

[Apple パフォーマンスのヒント](https://developer.apple.com/jp/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/PerformanceTips/PerformanceTips.html#//apple_ref/doc/uid/TP40010672-CH7-SW1)によると、以下のような理由でURLを使ったほうがいいようです。

> パスオブジェクトを再利用します。NSURLオブジェクトに関してファイルリソースにアクセスしている場合（resourceValuesForKeys(_:)メソッドを使用）、それらの値はキャッシュされます。NSURLオブジェクトを再利用すると、以降は、それらのファイルリソースにアクセスするためのファイルシステムへのアクセスを回避できる場合があります。また、NSURLオブジェクトの構築はコスト高になる場合があるので、ファイルを参照するたびに新しいインスタンスを作成するよりも、再利用する方法を選びます。

> 文字列を使ってパスを指定するルーチンよりも、NSURLオブジェクトを使ってパスを指定できるルーチンを選択してください。macOS 10.6以降では大半のURLベースのルーチンがサポートされ、Grand Central Dispatchなどのテクノロジーを利用できるように設計されています。このため、多くの介入を必要とせずに、コード内で即座にマルチコアコンピュータの効果を実現できます。

## ファイル操作用のパスをあつかうときに便利そうなプロパティとメソッド

そういうことならURLをつかおうと思って、URLでパスを扱う方法を調べてみました。

NSStringに実装しているパスを扱うプロパティやメソッドは、URLにも実装されているみたいです。今回はそのなかから、パスを扱うときに便利そうなプロパティとメソッドを集めてみました。

以下に、Playgroundでの実行結果を貼っています。

```Swift
	let path = "https://nanka-url/"
	let directory = "image"
	let imageName = "sample"
	let imageExtension = "jpg"
	
 // 文字列をURLに変換
	let urlPath = URL(fileURLWithPath: path)
	print("\(urlPath)") // https:/nanka-url
	
 // URLにディレクトリを追加（isDirectoryをtrueにした場合。falseにすると末尾に/がつかない）
	let urlDirectory = urlPath.appendingPathComponent(directory, isDirectory: true)
	print("\(urlDirectory)") //https:/nanka-url/image/
	
 // URLにファイル名を追加
	let urlImageName = urlDirectory.appendingPathComponent(imageName)
	print("\(urlImageName)") // https:/nanka-url/image/sample
	
 // URLのファイル名に拡張子を追加
	let urlExtension = urlImageName.appendingPathExtension(imageExtension)
	print("\(urlExtension)") // https:/nanka-url/image/sample.jpg
	
 // URLのファイル名の拡張子を削除
	let urlDeleteExtension = urlExtension.deletingPathExtension()
	print("\(urlDeleteExtension)") // https:/nanka-url/image/sample
	
 // URLの最後の項目を削除
	let urlDeleteLastPath = urlDeleteExtension.deletingLastPathComponent()
	print("\(urlDeleteLastPath)") // https:/nanka-url/image/
	
 // URLの最後の項目名を取得
	let fileName = urlExtension.lastPathComponent
	print("\(fileName)") // sample.jpg
	
 // URLの最後の項目の拡張子を取得
	let fileExtension = urlExtension.pathExtension
	print("\(fileExtension)") // jpg
	
 // URLの各項目を配列で取得
	let component = urlExtension.pathComponents
	print("\(component)") // ["/", "nanka-url", "image", "sample.jpg"]
```

これだけたくさんあれば、URLの扱いには困らなさそうです。

ほかにもいろいろとあるので、気になるかたは、[Apple URL](https://developer.apple.com/documentation/foundation/url)をご覧ください。
Azure Docker環境構築 

#Docker on Azure シリーズ
- [Azure Docker環境構築](https://qiita.com/seinoro/items/1bfe7ee11c1083dba11d)
- [Azure Docker Wordpress実行](https://qiita.com/seinoro/items/b8461f197161f72ccbe3)

# はじめに
いろんな記事をみて環境構築したがうまくいかず。
Ubuntuをクリーンインストールして、Docker公式ドキュメント通りインストールすると簡単にインストール出来ました。


**参考：Docker公式ドキュメント**
[Get Docker CE for Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/)




##Ubuntu Bionic 18.04 (LTS) 
イメージ選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/f6291e4b-8729-dce0-8f18-8b3ada9730a4.png)

基本設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/04300b5f-8062-7778-146d-a4a04492f353.png)

オプションでSSHは受信できるようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/cc4a016e-b637-5ccd-ac20-97b5eedaa2bd.png)

IPAddressの名前を設定しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/19f2ff67-1b82-a035-303e-e91aa16b29be.png)

##TeraTemでSSHで接続します。
New Connection
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/6481b653-dea9-5c6e-3c7e-830ea36a2174.png)
User Name & Passphraseを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/49c9401b-b905-e3c9-691d-af0cb85cf293.png)
コマンドラインが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/20ece347-48fa-ef2c-447a-57dc0886eeb0.png)

##docker install(Docker公式ドキュメント通り順番に実行)
```bash
$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo apt-key fingerprint 0EBFCD88

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

$ sudo apt-get update

$ sudo apt-get install docker-ce

$ apt-cache madison docker-ce

$ sudo docker run hello-world
```

Hello Worldの実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/c3248b12-ffd0-81b1-cbaf-71c6898502f7.png)



##docker hub から他のイメージをダウンロードして実行
```bash
$ sudo docker run docker/whalesay cowsay hello world
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154505/a4a2e441-224a-9c17-0c73-3d60a8dfb114.png)
エックスサーバーでPython CGIを動かすメモ

[ここで書いた内容](https://teratail.com/questions/117592)

.htaccess に
`AddHandler cgi-script .py`
を追加

対象のパーミッションを変更
`chmod 705 test.py`

コード

```python

#!/usr/bin/python
# -*- coding: utf-8 -*-
print("Content-type: text/html\n")
print("<html><body>Python is awesome !</body></html>")
```

http://your.domain/dir/test.py
みたいな感じ。


opencvなどの重たいライブラリをimportしたら
internal server error500が発生してしまいます

しかし、コマンドライン上ではライブラリを取り込んでも動きます
このエラー５００の回避策として、PHPからPythonを起動させて、
出力結果を取得することでCGI？ではなくPHPで動かせました。

PHP側

```php:test.php

$fullPath = 'python test.py '.$param;
exec($fullPath, $outpara);
echo $outpara;
```

Python側

```python:test.py

#!/usr/bin/python3.4
# -*- coding: utf-8 -*-

import sys
print("パラメータ１"+sys.argv[1])
print("パラメータ２"+sys.argv[2])
print("パラメータ３"+sys.argv[3])

print([sys.argv[1],sys.argv[2],sys.argv[3]])
```

問題は、パラメータの長さに限界がありますね。jsonデータで大きいものとか、
画像とかは一旦保存しないと駄目みたい
Python カメラからOCRをおこなってみるテスト

やってみたかったのは静止画からOCRで英数字を読み出すこと。

探せばいろいろな記事がみつかったので、
少し変えて、カメラで写っている画像の中から英数字を読み出してみました。

カメラで写した特定の領域を赤枠で囲み、
その中の英数字を読み出してコンソールに出力します。

```python:ocrTest.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import pyocr
from PIL import Image
import pyocr.builders

tools = pyocr.get_available_tools()
tool = tools[0]

def OcrTest():
    cap = cv2.VideoCapture(0)

    while True:

        ret, frame = cap.read()

        Height, Width = frame.shape[:2]

        img = cv2.resize(frame,(int(Width),int(Height)))

        # OCRで読み取りたい領域を赤枠で囲む
        cv2.rectangle(img, (100, 100), (Width-200, Height-200), (0, 0, 255), 10)

        ocr(img, Width,Height)

        cv2.imshow('Ocr Test', img)

        cv2.waitKey(100)

    cap.release()
    cv2.destroyAllWindows() 

def ocr(img,Width,Height):
    dst = img[100:Height-200,100:Width-200] #OCRで読みたい領域を切り出す
    PIL_Image=Image.fromarray(dst)
    text = tool.image_to_string(
        PIL_Image,
        lang='eng',
        builder=pyocr.builders.TextBuilder())

    if(text != ""):
        print(text)

OcrTest()

```

結果

![2018-08-20 (2).png](https://qiita-image-store.s3.amazonaws.com/0/7399/e4d926a8-a84e-e70e-5144-49dfaaedd78b.png)

あたりまえですが、領域内にかざそうとしている最中はノイズがはいります。
SEOに強いHTMLを書き始めるときのテンプレート OGPやcanonicalアリ

HTMLを書き始めるときのテンプレート
Webアイコンあり。

```
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="ディスクリプション">
<meta property="og:url" content="ページのURL" />
<meta property="og:title" content="ページのタイトル" />
<meta property="og:type" content="ページのタイプ">
<meta property="og:description" content="記事の抜粋" />
<meta property="og:image" content="画像のURL" />
<meta name="twitter:card" content="カード種類" />
<meta name="twitter:site" content="@Twitterユーザー名" />
<meta property="og:site_name" content="サイト名" />
<meta property="og:locale" content="ja_JP" />
<meta property="fb:app_id" content="appIDを入力">
<link rel="canonical" href="">
<link rel="apple-touch-icon-precomposed" href="画像のURL" />
<link rel="stylesheet" type="text/css" href="CSSのパス">
<link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
<title>タイトルtitle>
</head>

<body>
ここに文章がはいりますん
</body>
</html>
```
XcodeのSchemeでBuildするDeviceを指定する方法

## 本記事のまとめ

- BuildするDeviceの指定は，変更したいTARGETの`TARGETS/Build Settings/Architectures/Supported Platforms`を変更する。
- 変更は`<Project Name>.xcodeproj/project.pbxproj`の`SUPPORTED_PLATFORMS`に反映される。
- 複数TARGETを必要とするLibrary作成以外の通常の使用ではこの問題は発生しない。

## いつ発生したのか

通常通りXcodeでprojectを作成している場合には発生しませんが，今回[OperantKit](https://github.com/YutoMizutani/OperantKit)という，[RxSwift](https://github.com/ReactiveX/RxSwift)のような複数のPlatformで動作するLibraryを作成しようとした際に発生しました。

## 何が起こったのか

Swift PMによって作成した`.xcodeproj`に対し，iOS用に`Cocoa Touch Framework`を生成しました。
その後，New SchemeからiOS用およびiOS Test用のTARGETを選択し`Scheme`を生成しました。
Buildを実行しようとしたところ，iOS用のTARGETであるにも関わらずBuild DeviceがiOSではないPlatformに対してもBuildおよびTestが可能になってしまっていました (当然Testは実行できず，CIもこのために失敗しました) 。

<img width="568" alt="ss 2018-08-20 at 21.51.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/195913/8bf89f4f-caa0-c816-775f-70a2fe167509.png">

## 解決方法

変更したいTARGETの`TARGETS/Build Settings/Architectures/Supported Platforms`を変更する必要があります。

<img width="840" alt="ss 2018-08-20 at 21.53.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/195913/62fe474c-284c-8bff-441c-33bcae4ecd75.png">
(↑現状では全Platformが指定されています)

<img width="840" alt="ss 2018-08-20 at 21.53.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/195913/c05aed28-5ff4-22ac-8329-771fe1a3d209.png">
(以上のように変更します)

この変更は`<Project Name>.xcodeproj/project.pbxproj`の`SUPPORTED_PLATFORMS`に反映されています。

## 確認

画像の通り変更が反映され，macOSとwatchOSが選択から外れていることがわかります。

<img width="574" alt="ss 2018-08-20 at 21.53.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/195913/545858e1-ce48-887b-f09f-06012fe210c1.png">

## 感想

ライブラリの知見はなかなか見つからず苦労しています。
Cocoa Touch Framework/Cocoa Frameworkを利用したい方のお役に立てればと思います。

## 参照

なし
ライトプランでサービスを立ち上げる－さくらのレンタルサーバ

さくらのレンタルサーバ

[129円/月で利用できるライトプラン](https://www.sakura.ne.jp/plans.html)

スタンダードと比較すると、機能は雲泥の差！
静的ホームページか、書庫として利用するくらが関の山でしょう。

|機能|ライト|スタンダード|
|:--|:-:|:-:|
|SSH|×|○|
|WordPress|×|○|
|MySQL|×|○|
|SQLite|○|○|
|独自CGI(PHP)|×|○|

~~お金がもったいないので~~学習のために、phpのみでサービスを立ち上げました。

[![へたよみ辞書](https://heta.undo.jp/img/hetayomi/hetayomi_logo.png) ](https://heta.undo.jp/)

ポイントはデータベース。
いろいろ考えて**フラットテキスト**にしました。

- SQLiteのlike検索より、shellのgrepの方が速い
- SSHが使えないので、SQLiteを使うには手間が掛かる
- grepだけなので、SSHが使えなくても何とかなる

テキストファイルの構成は注意が必要です。
カラムを指定して検索することは~~面倒~~できないため、idにはプレフィックスを付けます。
といいつつ、付けずに正規表現で実装しちゃいましたが(^^;

----------------------------------------
ソース例

```ruby:php
$q = 検索文字列
$return = shell_exec("grep -E '".$q."' ファイル名|awk -F'\t' '{print $1}'");
$result = explode('\n',$return); 
foreach ($result as $line) {
  $items = explode('\t',$line);
    # 取得データを加工する処理
  }
}
```
```ruby:テキストファイル（タブ区切り）

--- 語句 ---
k1    強ち    あながち
k2    敷衍    ふえん

--- へたよみ ---
y1	つよち	k1	
y2	しきこう	k2

--- いいね ---
i1	ok	y1	
i2	ng	y1
```
Raspberry Pi3 Model Bのセットアップ2

[前回](https://qiita.com/kobakazu0429/items/925f99af83bf9495fb80)の続きです.

# ユーザーの作成
piユーザーのままでは危険だし何か気に入らないので新しく追加します.

```
まずrootに切り替えます
# sudo su -

hogeユーザーを追加します
$ adduser hoge

sudoを使えるようにします
$ sudo gpasswd -a hoge sudo
```

# SSH configの設定
```bash
$ ssh raspberry
```
で入れるようにします.

で

```shell:Mac
Macのターミナルで作業します

.sshディレクトリに移動します
$ cd ~/.ssh

sshを作成します
$ ssh-keygen -t rsa -f raspberry

公開鍵をコピーします
$ cat raspberry.pub | pbcopy
```

```shell:Raspberry
.sshディレクトリに移動します
$ cd ~/.ssh

$ touch authorized_keys

$ vim authorized_keys
```
先ほどコピーした公開鍵を貼り付けます

```shell:Mac
$ cd ~/.ssh
$ vim config
```

```
Host raspberry
  HostName 192.168.1.8
  Port 22
  User hoge
  Protocol 2
  IdentityFile ~/.ssh/raspberry
```
を貼り付け保存します

```shell:Mac
$ ssh raspberry
```
で入れるか確認します

# zsh & oh-my-zsh
```shell
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install zsh
$ which zsh 
$ chsh
# https://github.com/robbyrussell/oh-my-zsh
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```
Discord Policeができるまで【前編】

## はじめに
結構前からDiscordBotを作りたいなぁと思っていてやっと一つ作れたので、できるまでの道のりを書いていく。
(※なお単語リストを別にする方法もありますが、今回は一つのファイルにまとめたいのでこの方法です。)

## 用意したもの
- MacBook Pro
- Discordのアカウント
- 自分が管理しているDiscordサーバー
- 集中力

# 1.下準備
### 1.2 node.jsのインストール
とりあえずDiscordのBOTを作る前に何の言語で作るかを考えた結果JavaScriptが自分には良さそうだったのでDiscord.jsを使うことにした。
まずはnode.jsのインストールから。
以下のコマンドでnode.jsのインストールをする

```console:ターミナル
$ nodebrew install-binaly latest
```

### 1.3 DiscordのAPI TokenとClietIDを取得しておく
[DEVELOPER POTAL](https://discordapp.com/developers/applications/)で"Create an application"をクリック→"APP ICON"と"NAME"を決めて"Save Change"をクリック。
できたら画面の真ん中らへんにある"CLIENT ID"をコピー
次に左側にある"Bot"をクリック→"Add bot"→"Yes, do it!"をクリック。
その後、またまた画面真ん中らへんにある"TOKEN"の"Click to Reveal Token"をクリックしてTokenを取得。

# 2.とりあえずなんか作ってみる
### 2.1 以下の内容をコピペ

```JavaScript:bot.js
const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});
 
 client.on('message', msg => {
  if (msg.content.match(/不適切な単語１/) || msg.content.match(/不適切な単語２/)) {
  	msg.delete(100);
    msg.reply('不適切な投稿を削除しました。');
  }
});

client.login('【YOUR TOKEN】');
```

# とりあえず実行
コピペが終わったら一回起動してみる。
起動は以下のコマンドで

```console:ターミナル
$ npm install discord.js
$ node bot.js
```

とりあえずこれでBOT自体は動いているのでサーバーにBOTを招待。
以下の【ApplicationClientID】の場所に先ほどコピーしておいた"CLIENT ID"をペースト
`https://discordapp.com/oauth2/authorize?&client_id=【ApplicationClientID】&scope=bot&permissions=0`
そしてエンター。

うまくBOTがログインできていれば成功です！

ということで前編はここまで。暇があったらまた後半書きます。
Regex（正規表現）の基本的な文法

# はじめに

```sample.txt
aaa bbb ccc ddd eee
```

sample.txt ファイル内の文字列の間のスペースをコンマに変えたいとしよう。
（あくまで例えであり、実際にこのような作業が必要であるかは分からない）
この場合、スペースは 4 つだけなので手作業で変更してもさほど苦労はしないだろう。
しかし、これが 1 行ではなく、10000 行続いていたらどうだろう？
そんなものを手作業でやってたら日が暮れてしまいそうだ。
そんな時に便利なのが Regex（正規表現）である。
正規表現を使えばコマンド一つで、死ぬほど面倒くさい作業も一発である。

# 正規表現とは何か？
正規表現とはテキストから検索したい「文字列の表現方法」である。
単なる文字列だけでなく、「aから始まる単語」や「数字のみの行」などの細かい条件の指定が可能である。
よく Linux の grepコマンドと合わせて利用される。

# 正規表現の書き方
「apple」のように単語や文字そのものを検索パターンとすることをリテラルと言う。
これだと普通の検索と同じである。
正規表現ではメタ文字という特殊な記号を使うことで、もっと複雑な検索パターンを作ることができる。

## メタ文字
### .（ドット）
改行を除く任意の一文字にマッチさせることができる。
例 1 ：`a.p`とすると「app」や「arp」などがマッチする。
例 2 ：`a..le`とすると「apple」がマッチする。

`.`自身を検索したいときは`.`の前に`\`を付けてエスケープしなければならない。

### 文字種の限定
下記の記号を使うと、数字や文字など文字種を指定できる。

| 記号       |機能                  
|:---------:|:--------------------:|
| \d        | 0-9 の数字 1 文字を指す
| \D        | \d 以外の 1 文字を指す 
| \w        | a-z、A-Z、0-9、_ の内の 1 文字を指す
| \W        | \w 以外の 1 文字を指す 
| \s        | スペース、タブ、改行などを指す
| \S        | \s 以外の 1 文字を指す                


### 量指定子
文字種を限定しただけだと、例えば「word」を検索したい時、 `\w\w\w\w` のように同じものを何回も書く必要がある。
量指定子を使うと先程の `\w\w\w\w` は `\w{4}` と書くことができ、見た目をスッキリとさせられる。

| 量指定子    |機能                  
|:---------:|:--------------------:|
| {n}       | n 個連続する
| {min,max} | min 以上、max 以下の個数連続する
| {min,}    | min 以上の個数連続する
| ?         | {0,1} と同義               
| +         | {1,} と同義     
| *         | {0,} と同義    

### アンカー
アンカーを使えば行の先頭にある単語のみや、末尾の文字のみといったマッチしてほしい位置を指定できる。

| アンカー   | 機能 
|:--------:|:-----------|
| ^        | 行の先頭
| $        | 行の末尾
| \bで挟む  | 単語の境界

### 選択子
`abc|123`という風に`|`を間に入れると「または」的な意味になる。
そのため、この場合は「abc」か「123」を検索できる。
両方あれば両方にマッチする。

### 文字クラス
`[]`で囲むと`[]`内にある文字のどれか 1 文字を検索できる。
`[abc]`とすると「a」か「b」か「c」のどれか 1 文字にマッチする。（`a|b|c`と同じ意味）

### 文字クラス内で使えるメタ文字
文字クラスの`[`の**直後**に`^`を置くと否定を表現できる。
`[^ab]`Pとすると「ａ」または「ｂ」以外を表せる。

`-`で文字コードの範囲を指定できる。
`[a-z]`とすると「a」「b」「c」・・・「ｙ」「ｚ」のどれか 1 文字を検索できる。

※文字クラス内のメタ文字を文字クラス内でリテラルとして使いたい場合は`/`でエスケープする必要がある。

#### 改行とタブ
改行コードは Windows や macOS などのシステムによって異なるため注意したい。

| タブと改行コード | 説明
|:-----------:|:-----------|
| \t          | タブ
| \r\n        | 改行（Windows）
| \r          | 改行（v9 までの macOS ）
| \n          | 改行(Unix、v10 以降の macOS）
| \r\n&#124;\r&#124;\n | 改行（すべて）

### キャプチャ
検索パターンにおいて、置換で利用したい部分を`()`で囲んでおくと、囲った順に`$1`、`$2`・・・で置換の際に文字列を取り出して利用できる。
`()`で囲んだパターンにマッチする文字列を正規表現中で使うこともできる。
例えば`(\d),\1`とすると`\d`と`\1`は同じものを指し、「1,1」や「5,5」などがマッチする。

# おわりに
今回は一般的な正規表現の文法を説明した。
正規表現はエディタや Linux 、プログラミング言語などいろんな場面で利用できるが、多少ルールの違いがあるかもなので適宜マニュアルを参照するといいだろう。

# 参考文献
- [RegexOne](https://regexone.com/lesson/kleene_operators)
- [ドットインストール「エディタで学ぶ正規表現入門」](https://dotinstall.com/lessons/basic_regexp_v2)
- 三宅英明・大角祐介（2015）「新しい Linux の教科書」 SB クリエイティブ．
【Androidアプリ開発勉強】Observerパターンで非同期処理はAsyncTaskLoaderがメジャーらしい

[前回](https://qiita.com/fortegp05/items/74faf552e754d7d5621e)の続き。

>と、ここまで参考資料で調べて、
>これだとデータ保存時とかにViewModelからModelにデータを渡すやり方とか、
>取得したデータを返す方法がわからず…うーん。
>引数で渡すのは密結合すぎる気がする。

このあといろいろ調べてLoader使う?
いやこれはAPIコール用っぽい?
SQLではどうやる?
と調べた結果のメモです。

# 結論
AsyncTaskLoaderを使うのがメジャーらしい。

## Loaderを呼び出す
Activity側で以下のようにするとイベントを呼べるらしい。
`getSupportLoaderManager().initLoader(LOADER_ID, args, mCallback);`

- LOADER_IDはローダーごとに設定するものっぽい?
どこかに定数として切ってあとでデバッグしやすくしとかないとハマりそう…。

- argsはBundle型で引数を渡せるみたい。
Bundle型はAndroidのデータ保存でよく使われる型らしい。
Activityが死ぬ時によく使われるみたい。
非常にわかりやすい記事が合ったので[参考記事](#参考記事)に置いときます。

- mCallbackはコールバックを指定する。
Activityに定義したLoaderManager.LoaderCallbacks<String>型のクラスを指定して、
ロード完了後の処理を実行するみたい。
今回はDBから取得した結果を表示したり、登録/変更結果を表示するとかになりそう。
Loaderで取得した結果はonLoadFinishedというメソッドの引数に指定されるみたい。

## 実際の動きのイメージ

- ユーザーからの操作(ボタン押下とか)
Activityのイベントハンドラで(必要があれば)Loaderを呼び出す。
Modelは更新要求を処理して結果を通知する。

- Modelからの通知
ロードが終わったらActivity側のコールバックが叩かれて処理する。
このときActivityが死んでいれば恐らく叩かれないのかな?
(テストはしておいた方が良さそう)

## 終わりに
なんか本でも一冊買ったほうが良かったかなーと思い始めてきた。
いま時ネットでもいけるだろうと思っていたけど、
やはり体系的な勉強は本が一番だよなぁと。

ただ、最新の情報じゃないことが多いのでそこは良し悪しあるけれど。

あと基礎はあんまり教えてくれないのかな。
最近だとkotlinが多そうだし…。


だいたいイメージが掴めてきたのであとは以下を調べて、
具体的な設計と実装に入りたいなぁ。

+ サポートする環境の選択はどれが良いか?
+ プロジェクト作成時のアクティビティの選択はどれが良いか?
+ 使用するウィジェットとレイアウトの調査


# 参考記事
[正しいAsyncTaskLoaderの使い方](https://qiita.com/akkuma/items/a1252498e95c1f68316c)
[Bundle](https://qiita.com/kojionilk/items/138eea19dadb14997136)
Java Mapの使い方

# はじめに

スッキリわかるサーブレット&JSP入門にて勉強していて何気なく使っていた
<b>HashMap</b>がわかったつもりになっていたのでまとめてみた。

## Mapの使い方

マップ（Map）は、2つの情報をキー（key）と値（value）をペアとして格納する。

※キーとデータの組み合わせをエントリーと呼ぶ。

* <b>HashMapクラスの利用</b>

```java:HashMapのインスタンス化

Map<キーの型, 値の型> マップ変数 = new HashMap<キーの型, 値の型>(); //総称型の利用（JDK1.5）

Map<キーの型, 値の型> マップ変数 = new HashMap<>(); //型引数を省略（JDK1.7）

```

* キーと値のデータ型を指定する。
※int型の場合は<b>Integer</b>とする。

またHashMapでは下記のようなメソッドをもつ。

|戻り値　|メソッド　　　|  意味         |
|-----------|------------|----------------------|
|         |   put(●, ▲)   |マップに●と▲のペアを格納     |
|     |      get(●) |    キーの値に対応する値を取得    |
| int      |        size() |     格納されているペア数を数える     |
|        |          remove(●)|      指定した内容の要素を削除     |
| Set<●>      |       keySet() |    格納されているキーの一覧を返す    |

まだまだたくさんありますので[このリンク](http://java-code.jp/232)を参考までに。。。

注意点：Mapでは値の重複は許されるが<b>キーの重複</b>は許されない。

## サンプルコード

``` java:Main.java

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Map<String, Integer> prefs = new HashMap<String, Integer>();
        prefs.put("京都府", 255);  //要素を格納
        prefs.put("東京都", 1261);
        prefs.put("熊本県", 181);
        
        System.out.println(prefs.get("京都府"));  //要素を取り出す
        
        int Tokyo = prefs.get("東京都");  //キーを指定し、要素を取り出し代入
        System.out.println(Tokyo);
        
        prefs.put("東京都", 1500);  //解説①
        System.out.println(prefs.get("東京都"));
        
        prefs.remove("熊本県");  //要素を削除　　
        System.out.println(prefs.size());  //格納されているペア数を取得
        
    }
}

```

```java:出力結果

255
1261
1500
2
```

解説①　：同じキーで異なる値をput()すると値が上書きされてしまう。

## 最後に
わかったつもりでいると痛い目にあいますね。。笑
Visual Studioの.NET単体テストで「すべて実行」するとEntityFrameworkエラーが発生する

## 現象

* 個別実行の単体テストは成功する
* 「すべて実行」は失敗する
* EntityFramework関連のエラーが発生する

## エラーメッセージ例

> "The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information."

または、

> The Entity Framework provider type 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342' registered in the application config file for the ADO.NET provider with invariant name 'Oracle.ManagedDataAccess.EntityFramework' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application

## 解決策

いくつか条件によって異なります。

1. 正しくEntityFrameworkをnugetでインストールできているか確認する。
2. web.config/app.configに正しく設定できているか確認する。
3. [DeploymentItem]属性で外部ファイルを単体テストでロードしているか確認する。

3番目については正しく理解できていませんが、これを書いた途端にテストが失敗し出したので調べてみたら、どうやら関連がありそうでした。↓

[DeploymentItem breaks EntityFramework unit test in separate assembly](https://stackoverflow.com/questions/22714663/deploymentitem-breaks-entityframework-unit-test-in-separate-assembly)

とりあえず、意図的に`System.Data.Entity.SqlServer.SqlProviderServices`をDbContextで宣言すればテストは動きそうです。
が、外部ファイルのプロパティで出力ディレクトリにコピーを「常にコピーする」にすれば単体テストで読み込めたので、いったん[DeploymentItem]を使わずにおきます。（単体テストを自動化した際にもうまく動くかは未確認です。）
GmailをThunderBirdで快適に使うための1つの設定

プログラミングとはあまり関係がなく申し訳ありません。
ただのメモ。

# 解決したい症状
ThunderBird IMAP Gmailの受信が延々と終わらない。
どうやら「すべてのメール」フォルダのDLが終わらないようだ。
それも一度DLが終わった後も何かメールを移動したり消したりすると同期をとるために最初からDLしているようにみえる。
とにかく終わらない。

# 解決方法
##「[Gmail]」フォルダのDLをオフにする
メールボックスのメール総数が多いと各フォルダ内の移動や削除などした際に「[Gmail]」フォルダも同期しようとして、通信としては2度手間になっているようです。

そこで以下のように「すべてのメール」フォルダをオフラインで使用することをやめてメールのDLをしないようにします。

1. [Gmail]フォルダを右クリック＞プロパティ
![スクリーンショット (35)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/26413/76454e09-fd19-ec82-66e2-a8281d0d952c.jpeg)

2.「このフォルダーをオフラインで使用する」のチェックを外す
 ![スクリーンショット (36).png](https://qiita-image-store.s3.amazonaws.com/0/26413/4452c09d-f1fe-8929-1881-40a4dcce854c.png)

3.一度ThunderBirdを再起動

すると、快適になっている。はず。
awkで文字列を整数にして出力したい

# やりたいこと
- タブ等で区切られたテキストファイルの特定の列の値を整数にして出力したい
 - 例：「1,000（桁区切りのコンマつき）」や「1000.0（小数点のドットつき）」を「1000」として出力したい
 - 前提条件として、指定した列には意味的に整数値しか入らず列の挿入欠失によるズレは考慮しなくて良いものとする
- awkでさくっとできるだろうと試したが、うまくいかなかった

# テスト環境
- Linux Mint 18.1
- GNU Awk 4.1.3

# やったこと
## テストデータ

- 3列×3行のタブ区切りファイルを作成
- 1行目はヘッダー、2・3行目はデータ行
- 1列目は文字列、2・3列目は整数にしたい
 - しかし3行目の2・3列目の値が整数になっていない

```
$ cat test1.txt
str num1    num2
FOO 1000    2000
BAR 1,000.0 2,000
```

- awkでprintすると

```
$ awk -F"¥t" '{print $1,$2,$3}' test1.txt
str num1    num2
FOO 1000    2000
BAR 1,000.0 2,000
```

- そのまま表示される

# 整数として出力するために試したこと
## 計算してから出力

- 数値として扱ってあげることで数値としての自覚が芽生えるのではないか
- 0を足したり1を掛けたりしてからprintしてみる

```
$ awk -F"¥t" '{print $1,$2+0,$3*1}' test1.txt
str num1    num2 0 0
FOO 1000    2000 0 0
BAR 1,000.0 2,000 0 0
```

- だめでした
- しかもなんか末尾に0が増えた
- 状況は悪い方へ向かっています

## intで型変換

- いいかお前は整数なんだ！
- intで囲む

```
$ awk -F"¥t" '{print $1,int($2),int($3)}' test1.txt
str num1    num2 0 0
FOO 1000    2000 0 0
BAR 1,000.0 2,000 0 0
```

- だめでした

## printf

- printfならきっとなんとかしてくれる

```
$ awk -F"¥t" '{printf "%s %d %d¥n", $1, $2, $3}' test1.txt
str num1    num2 0 0
FOO 1000    2000 0 0
BAR 1,000.0 2,000 0 0
```

- これもだめでした

# まとめ
- なぜできないのか。何か根本的に間違えているのか

- 末尾に0がつくのはどうしてなのか

- もらったファイルがアナーキーなのはわれわれの業界ではよくあることなのでこういうちょっとしたことにも対応できるようにしたい
Zsh—bindkeyの魔法 ( aを入力して bを出力する )

## バインド


```
bindkey -s a b
```
`-s` オプションで文字列を文字列にバインド出来る。


## 実験

次に `aaa` と入力

```
bbb
```

これが bindkey の魔法。

## Version

- zsh 5.5.1 (x86_64-apple-darwin17.5.0)


## Links

- [zshzle(1): zsh editor - Linux man page](https://linux.die.net/man/1/zshzle)
- [Gist](https://gist.github.com/YumaInaura/42d5aa5403e80e390dd31f6c21cbe53d)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ggplot2のヒストグラムに累積比率を重ねる

(2022-05-06追記) 一時変数を使用しない + グループ別の集計に対応した方法を書いた: [ggplot2でヒストグラムに経験分布を重ねて描く - もうカツ丼はいいよな](https://rion778.hatenablog.com/entry/2022/05/05/184158)

`stat_bin()`内部で`..count..`をゴニョゴニョしつつ値を保持しておき、第2軸の描画に保持した値を流用するとそれっぽい感じに。

```{r}
library(ggplot2)
bins <- 30
ggplot(diamonds, aes(carat)) +
  geom_histogram(bins = bins) +
  stat_bin(aes(y = cumsum(cnt <<- ..count..) / sum(..count..) * max(..count..)), 
           geom = "line", bins = bins) +
  scale_y_continuous(sec.axis = sec_axis(~ . / max(cnt) * 100, name = "Cumulative percentage[%]"))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109348/de4014cd-5b55-d232-b78a-755a6c949627.png)


（グローバル環境にオブジェクト作ってしまうのがどうも気持ち悪い…もっと良い方法はないだろうか…。）

## 参考になりました

- [ggplot2のgenerated variables（..変数名..）の使い方 - Technically, technophobic.](https://notchained.hatenablog.com/entry/2015/10/11/162819)
- [ggplot2 - R/ggplot Cumulative Sum in Histogram - Stack Overflow](https://stackoverflow.com/questions/44353778/r-ggplot-cumulative-sum-in-histogram)
社内のテキストエディタをがんばってmarkdownにする話



## はじめに
プログラムに興味を持ったものの、年齢が３０や４０を超えていて 
OSSや新しい言語や社会の流れに追いつけずに日々悶々と過ごしている　おっさんもいると思います。　　

私がその1人です。 
何とか社内の古めかしいシステムを新しい物に地道に置き換えて生きましょう

## 身近なことから始めよう
・まだXPがある 
・ブラウザがIE固定　 
・会社のセキュリティが強すぎてexeをダウンロードすると ~~OSSだろうが~~ **ウィルスアラートが全社に飛ぶ** 
・**ZIPファイル**なら何とか許してもらえる
・IDEがいまだにVS2010
・決定権を持っている人がITに疎い 
・githubになじみがないけど、とりあえず一歩を踏み出したい。  
   
## 得られるもの
社内のテキストエディタに　MarkDown #Editorを導入する。 

#####MarkDown #Editorはリアルタイムでmarkdownをプレビューできるすばらしいソフトです。
Windows環境　オフライン環境で動作　手軽　オープンソース　という点でメリットは大きいと思います。
  
  
## プログラムの入手

MarkDown #Editor　は下記からダウンロードできます。
https://hibara.org/software/markdownsharpeditor/#download   


ウィルスソフトにひっかからない場合はmked.exeを利用しましょう


exeファイルをダウンロードすると**ウィルスアラートが全社に飛ぶような会社** は
githubからソースコードをダウンロードしましょう。

https://github.com/hibara/MarkDownSharpEditor
Clone or download から　DownloadZip を選択

  
VS2010 Express C#  のソリューションファイルがダウンロードされます。
お手元にあるVSからビルトして　exeファイルを作成して完成です。  

作者は Visual Studio 2010 Express, Visual Studio Express 2013 の動作確認を行っているようですが 
私は　Visual Studio Express 2015 の動作を確認しました。  
  

ぜひよいMarkdownLifeを！！
USBキーボード無しでRaspberry Pi3 Model Bのセットアップ

# はじめに
個人的備忘録です.

# 環境
- MBP 2017年モデル
- Raspberry Pi3 Model B
- Samsung microSDカード 32GB

# OSのダウンロード・インストール
今回はRaspbianをインストールします.
手順は[公式](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)通りです

## ダウンロード先
- 公式
https://www.raspberrypi.org/downloads

- (多分)北陸先端科学技術大学院大学のミラーサイト
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

公式が遅いので,今回はミラーサイトを利用させていただきました.

## インストール
落としたzipファイルを解凍すると,imgファイルが出てくると思います.

[Etcher](https://etcher.io/)をインストールします.
起動後はimgファイルを選択→インストールするSDカードを選択→実行です.
3~5分程度で書き込み終了すると思います.

# SSH
以下,ターミナル操作します

```bash
SDカードへ移動します
$ cd /Volumes/boot

SSHを有効化します
$ touch ssh
```

これでSDカードをラズパイに挿入後電源を入れ,有線LANでネットワークに接続します.

Macユーザーの方は

```bash
$ arp -an
? (192.168.1.1) at 0:3a:9d:57:e2:26 on en0 ifscope [ethernet]
? (192.168.1.8) at b8:27:eb:77:b8:ec on en0 ifscope [ethernet]
```
`b8:`から始まるものがラズパイです.

なので,

```bash
ssh pi@192.168.1.8
```
で接続可能です.
Shell芸を用いてAWSのCloudWatchで好きなようにメトリクスを見る

# TL; DR
CloudWatchの組み込みメトリクスでモニタリングできない指標を
shell芸で何とかする方法です。

# 方法
まずはaws-cliをインストールします。
次に、cloud watchの権限を持ったユーザを作成し
シークレットキーなどを入手します。
aws configで諸々の設定をすれば、準備は完了です。

あとは下記の様に、shellで取得したいメトリクスをCloudWatchに送れる様にし
crontabの設定すればもうモニタリングが出来ます。

```bash
#!/bin/bash

export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
export EC2_REGION="リージョン"
instanceid="インスタンスID"

DBSIZE=`redis-cli dbsize`

aws cloudwatch put-metric-data --metric-name "RedisDBSize" --namespace "System/Linux" --dimensions "InstanceId=$instanceid" --value "$DBSIZE" --region $EC2_REGION
```

CloudWatchで何とかするよりも、shell芸で何とかする方がよっぽど楽でした。
ただ、こんな事をし過ぎるとshellまみれになるので、
用意されているものは使って行った方が良いでしょう。(自戒)
StanとRでベイズ統計モデリング(アヒル本)をPythonにしてみる - 12.1 状態空間モデルことはじめ

[実行環境](https://qiita.com/shngt/items/ce6f2c3ef348cd80f432)

### インポート

```python
import numpy as np
import pandas as pd
import pystan
import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
%matplotlib inline
```

### データ読み込み

```python
ss1 = pd.read_csv('./data/data-ss1.txt')
```

# 12.1 状態空間モデルことはじめ

```python
plt.figure(figsize=figaspect(3/4))
ax = plt.axes()
ax.plot('X', 'Y', 'o-', data=ss1)
plt.setp(ax, xlabel='Time (Day)', ylabel='Y')
plt.show()
```
![fig12-1.png](https://qiita-image-store.s3.amazonaws.com/0/103085/a027c7c2-970b-9e22-a94b-30a5f95b08b9.png)

## 12.1.5 Stanで実装

```python
T = ss1.index.size
data = dict(
    T=T,
    T_pred=3,
    Y=ss1['Y']
)
stanmodel = pystan.StanModel('./stan/model12-2.stan')
fit = stanmodel.sampling(data=data, pars=('mu_all', 's_mu', 's_Y'), iter=4000, thin=5, seed=1234)
```

## 12.1.6 推定結果の解釈

```python
ms = fit.extract()

np.percentile(ms['s_mu'], (10, 50, 90))
```
> array([0.29572894, 0.38844306, 0.50928656])

```python
np.percentile(ms['s_Y'], (10, 50, 90))
```
> array([0.03983209, 0.13265277, 0.26266297])

```python
probs = (10, 25, 50, 75, 90)
d_est = pd.DataFrame(np.percentile(ms['mu_all'], (10, 25, 50, 75, 90), axis=0).T, columns=['p{}'.format(p) for p in probs])
d_est['x'] = d_est.index + 1

plt.figure(figsize=figaspect(3/4))
ax = plt.axes()

ax.plot('X', 'Y', 'o-', data=ss1, color='k')
ax.plot('x', 'p50', data=d_est, color='k')
ax.fill_between('x', 'p10', 'p90', data=d_est, color='k', alpha=0.2)
ax.fill_between('x', 'p25', 'p75', data=d_est, color='k', alpha=0.4)
ylim = (10, 14)
ax.vlines(T, ylim[0], ylim[1], linestyles='dashed')
plt.setp(ax, xlabel='Time (Day)', ylabel='Y', xlim=(1, 24), ylim=ylim)
plt.show()
```
![fig12-3-left.png](https://qiita-image-store.s3.amazonaws.com/0/103085/d8060fe1-7dc3-99fd-17d1-29dcb0ad63d9.png)

## 12.1.7 状態の変化をなめらかにする

```python
stanmodel = pystan.StanModel('./stan/model12-4.stan')
fit = stanmodel.sampling(data=data, pars=('mu_all', 's_mu', 's_Y'), seed=1234)
```

```python
ms = fit.extract()

probs = (10, 25, 50, 75, 90)
d_est = pd.DataFrame(np.percentile(ms['mu_all'], (10, 25, 50, 75, 90), axis=0).T, columns=['p{}'.format(p) for p in probs])
d_est['x'] = d_est.index + 1

plt.figure(figsize=figaspect(3/4))
ax = plt.axes()

ax.plot('X', 'Y', 'o-', data=ss1, color='k')
ax.plot('x', 'p50', data=d_est, color='k')
ax.fill_between('x', 'p10', 'p90', data=d_est, color='k', alpha=0.2)
ax.fill_between('x', 'p25', 'p75', data=d_est, color='k', alpha=0.4)
ylim = (10, 14)
ax.vlines(T, ylim[0], ylim[1], linestyles='dashed')
plt.setp(ax, xlabel='Time (Day)', ylabel='Y', xlim=(1, 24), ylim=ylim)
plt.show()
```
![fig12-3-right.png](https://qiita-image-store.s3.amazonaws.com/0/103085/3e858500-ac7a-548c-e0e5-8987f5ca35ba.png)
ゲーム業界にあこがれているプログラマ志望の学生さんたちに贈るメモ

母校でキャリア論の講義をする機会があったのですが、ゲーム業界に憧れている学生がいて、何から勉強すればいいか分からないので、教えて欲しい。やっぱりC++は勉強をした方がいいのか。とかいろいろ聞かれたのでこうしたらいいんじゃないかな、ってメモを残しておきます。
コンシューマ系の会社は面接受けたぐらいで働いたことはないのでツッコミ頂けると嬉しいかもしれません。

# ゲーム業界の会社って？

細かく分けるといろいろあると思うのですけど、大きく２つあると思います。

- コンシューマ系ゲーム会社
- スマホアプリ系ゲーム会社

自分が憧れている会社はどこなのか、自分が作りたいゲームがどのハード(主に家庭用ゲーム機なのかスマホなのか)で動くゲームなのか、というのはきっちり考えておいた方が良さそうです

## コンシューマ系ゲーム会社

家庭用ゲーム機の会社ですね、NintendoSwitchとかPS4とかのゲームを作っています。事業部によっては後述のスマホアプリを作っているところも多いと思います。

## スマホアプリ系ゲーム会社

元々Webでゲームを提供していてスマホでゲームを出すようになった会社です。GREEなどが有名ですね。DeNAもゲームをやっていますが、DeNAはゲーム以外の事業も活況なイメージがあります。

# 何を勉強すればいいの？

とにもかくにもどちらのゲーム会社に入るとしてもゲームを一本自分で作り上げるくらいの技術力は必要です。勉強がんばってます、ではなかなか入れないので、作って持っていくくらいの気概が必要です。じゃあ何から始めればいいの、というところですが、プログラミングを勉強するにもどこから勉強すればいいのか分からないと思います。

## C++は勉強した方がいいの？

結論から言うと勉強した方が良いと思います。しかし、必須というわけではありません。実際の開発ではゲームエンジンに依存することが多く、例えC++を使っていたとしても、C++を強く意識してプログラミングすることは少ないためです。

## 何から始めた方がいいの？

**動くものを作ることを最優先**にした方がいいです。C++も勉強したいところですが、今はスマホアプリの[Unity](https://unity3d.com/jp)が流行っているため、一番勉強しやすいです。[Udemy](https://www.udemy.com/jp/)などの動画で勉強できるコンテンツも豊富なのでとっつきやすいと思います。
まずは本やサイトに書いてあるコードの写経から始めてみて、いろいろなところを修正してみて、何を変えたら何が変わるのかを動かして確かめるのが良いです。**とにかく動かしてみること、これが一番重要です。動かないとモチベーションが続きません。**

ちなみにUnityでも[3DSの開発はできる](https://developer.nintendo.com/)ようです
書いたコードが3DSで動いたらテンションあがるかもしれない(人に依る)ので挑戦してみると良いかもしれません

元々ある程度コーディングできるとかUnityは出来るのであれば、C++のエンジンを触ってみるのも良いかもしれません。まずは2Dのゲームエンジン、3Dのゲームエンジンと触ってみるのが良いでしょう。個人的には2Dのゲームエンジンなら[SDL](https://www.libsdl.org/)がおすすめで、機能が少ないのでゲームがどういう仕組みで動いているのが理解が進むと思います。今後、他のゲームエンジンを使った際にもどのような仕組みで動いているのか、という理解はトラブルシュート時に必ず役に立ちます。

## 会社別に傾向はあるの？

コンシューマ系の会社はC++のエンジンを使っているところが多く、スマホアプリ系の会社はUnityを使っているところが多いです。しかしながら、スマホアプリ系の会社でもC++のエンジン使っていたり、コンシューマ系の会社でもUnity使っていたりするので、あくまで傾向として、という状態です。

# 就職活動はどうやるの？

ごめんなさい、新卒の時は別の業界だったため、新卒時のノウハウはあまりありません
動くものを作って見せる、ができればいいんじゃないかな、くらい
その上で系統別に特徴があったのでそこだけメモします

## コンシューマ系ゲーム会社

自分が受けた際には、なぜその会社じゃないとダメなのか、ってところを追求されました。ゲームを含めたエンタメ系ビジネスは基本的にはお笑い芸人と同じビジネスモデルなので、確度を高くしたとしても、どうしてもヒットする/しないに依存します。特にコンシューマの開発は大規模であることが多いため、厳しい状況が発生しがちです。長い期間かけて作った作品が出せない、ヒットしないなんてことはざらにあります。会社としては長く働いてもらった方が都合が良いため、厳しい状況でも残って次のヒットにつなげてくれる人材が欲しいのです。スキルを持っていてどこでも結果を出せそうな人間であればあるほど、なぜその会社なのかを追求される気がします。信仰心を試されます。

## スマホアプリ系ゲーム会社

何ができるかを細かく聞かれました。元々ベンチャー系の会社なので、スキルベースの質問が多かったです。そのため何が出来るかを的確に答えて、技術的なツッコミにも的確に答える必要があります。ゲーム以外の事業をやっている会社が多いため、コンシューマ系の会社と比べて、ヒットするしないの厳しい状況を耐えなければならない、という状態のコントロールがしやすいからではないか、と思います。もちろんゲーム事業だけ単体で見れば、ヒットするしないの戦いはありますが、事業的にゲーム系だけに縛られている状態とポートフォリオを持っている状態とでは、会社という枠組みで見ればコントロールしやすくなります。

# まとめ

だらだら書きましたが、みんながんばれ
WindowsOSコマンドによるファイル分割バッチ処理

# ❏はじめに
ファイル分割をしたいという需要が最近芽生えたので、どうにかWindows環境でできないものか調査
やりたいことが実現できたのでめもめも

# ❏要求
- 大容量ファイルを開きたい
- 大容量ファイルを比較、差分がみたい
- Windows環境のみで実現したい

# ❏実装

[split.bat]

```bat

@echo off

setlocal ENABLEDELAYEDEXPANSION

rem #======================================#
rem #            使い方
rem #======================================#

rem 　■以下の変数に任意のあたいを設定すること
rem 　max        最大分割行数
rem 　inputFile  分割対象ファイル（バッチファイルと同じディレクトリに存在するファイル名
rem 　           フルパスでもOKだが（）やスペースがあると動作しない可能性あり



rem #======================================#
rem #            変数領域
rem #======================================#

set /a num=0
set /a fileNm=0
set /a max=1000
set /a fileCount=0

set inputFile=D:\work\bat\head\test.txt
type %inputFile% | find /v /c "" > line.log
for /f "usebackq tokens=*" %%i IN (`type line.log`) DO @set line=%%i
set /a fileCount=%line% / %max% + 1

echo ■■■■■■■■■■■■■■■■■■■■
echo ■
echo ■　ファイル分割処理
echo ■
echo ■■■■■■■■■■■■■■■■■■■■

echo 処理対象ファイル名：%inputFile%
echo 分割行数　　　　　：%max% 行
echo ファイル行数　　　：%line% 行
echo 出力ファイル数　　：%fileCount%

for /f "usebackq eol= delims= skip=1 delims=" %%s in (%inputFile%) do @(
    set /a num=num+1
    
    echo %%s >> split_!fileNm!.txt
    rem echo !num!
    rem echo !max!
    
    if !num! equ !max! (
       echo split_!fileNm!.txt 書き込み完了
       set /a fileNm=fileNm+1
       set /a num=0
    )
)
:break

:end
echo .
echo 処理が完了しました！
echo .
pause

```

# ❏使い方

■以下の値を指定

- max        最大分割行数
- inputFile  分割対象ファイル（バッチファイルと同じディレクトリに存在するファイル名
             フルパスでもOKだが（）やスペースがあると動作しない可能性あり


# ❏出力
```code
■■■■■■■■■■■■■■■■■■■■
■
■　ファイル分割処理
■
■■■■■■■■■■■■■■■■■■■■

処理対象ファイル名：test.txt
分割行数　　　　　：1000 行
ファイル行数　　　：62080 行
出力ファイル数　　：63
split_0.txt 書き込み完了
split_1.txt 書き込み完了
split_2.txt 書き込み完了
split_3.txt 書き込み完了
split_4.txt 書き込み完了
split_5.txt 書き込み完了
split_6.txt 書き込み完了
split_7.txt 書き込み完了
split_8.txt 書き込み完了
split_9.txt 書き込み完了
...
.
処理が完了しました！
.
続行するには何かキーを押してください . . .
```

# ❏追記

以下のブログで紹介されている方法でもっと簡単に、一瞬でファイル分割処理ができました。。

http://mk-55.hatenablog.com/entry/2017/03/20/222935

1. PowerShell立ち上げる
2. 分割対象ファイルがあるフォルダに移動する
3. `$i=0; cat .\test.txt -ReadCount 3 | % { $_ > test$i.txt;$i++ }` を実行

→ファイル分割完了！

調整するのはファイル名「.\test.txt」と　ReadCountにしている分割行数のみ

※注意※　UNICODE文字 BOM付で出力される

今回はバッチファイルの勉強になったと思って、。

PowerShellもある程度かけるようになりたいと思いました。

でもやっぱり、linuxやunix環境があるなら、splitが楽ちんだと思います。笑
Pythonでキー入力を用いてLoopを抜けるには？


PythonでWhileなどのループを手元のキー入力で抜けたいときにどうすればいいんでしょう？
opencv使ってた身としてはwaitKey(0)的な挙動を期待したいのですが…

# 考えうる手法群
プログラムを走らせながらなんらかのキー入力をノンブロッキングで取得するには

- マルチスレッド化する http://yoshifumi.hateblo.jp/entry/20080530/p1
- termiosを用いる https://qiita.com/tortuepin/items/9ede6ca603ddc74f91ba

などが考えられます。
でもコマンド操作でBreakするだけならCtrl+Cをキャッチすれば良さそうです。

# Ctrl+Cをキャッチ
Ctrl+CはKeyboardInterruptという例外としてキャッチできるようです。

https://qiita.com/keisuke-nakata/items/e77b123d75d4b52aac77

上の記事によるならば以下のtry構文でCtrl+C後の処理などについてきちんと書けば良いでしょう。

```python

try:
    while True:  # なんらかの重い処理 (for だったり while だったり。。。)
        pass  # ここに、Ctrl-C で止めたい処理を書く
except KeyboardInterrupt:
    # Ctrl-C を捕まえた！
    # print('interrupted!')
    # なにか特別な後片付けが必要ならここに書く
    sys.exit(0)

```
Windows 10 1709とsysprep


主に@cosmo5さんへのメッセージです。人のコメント欄で関係ないことを書くのも気がひけるし連絡方法もないので、、、

Windows 17093ではsysprepを使わずに固定プロファイルを作ることができたようですが、私の場合1703、1709ともにうまくできなくて、
最終的にはsysprepを使って固定プロファイルを作りました。詳しくはこちらを参照ください。

[[Q] How to create a mandatory profile for Windows 10 Pro 1709?](https://social.technet.microsoft.com/Forums/ja-JP/979bc615-b253-4936-a621-c47d2297111f/q-how-to-create-a-mandatory-profile-for-windows-10-pro-1709?forum=win10itprosetup)

上記にも書いてありますが、こちらのビデオがすごく参考になりました。

[How to set up a mandatory profile on Windows 10 Creators Update (1703)](https://www.youtube.com/watch?v=b5WPUuG_nXA&feature=youtu.be)

不明な点があればコメント欄かtwitterにメッセージください。