OmniAICreator/Qiita-1.07M huggingface dataset:
Python 2系と3系の共存

#はじめに
macOS SierraにおいてPython2系とPython3系を共存させる環境を整えます。

環境を整える上で押さえておくポイントが三つ
1. Homebrew:Mac用のパッケーシマネージャ。Pythonの使用の有無に関わらず入れておくと便利
2. pyenv:複数バーションのpythonを管理するツール。今回はPython2系とPython3系を切り替えるときに使う
3. anaconda:複数のパッケージがひとまとめになっているPythonのディストリビューション。これを入れるだけで基本的な科学技術計算は問題なくできる（らしい）

#Homebrewをインストール
ターミナルを起動し、以下のコマンドを打ち込んでHomebrewをインストールする。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

上のコマンドは[公式サイトのインストール欄](https://brew.sh/index_ja.html)に書いてある。

#pyenvをインストール
pyenvはPythonのバーション管理を行うコマンドラインツールで、複数のバーションのPythonのインストールや切り替えを容易に行うことができる。ちなみにWindowsでは使えないらしい。

Homebrewを使ってpyenvをインストールする。
ターミナル状で以下のコマンドを打ち込む。

```
brew install pyenv
```

その後、~/.bash_profileに以下を追加する。

```
export PATH="$PYENV_ROOT/bin:$PATH"
export PYENV_ROOT="$HOME/.pyenv"
eval "$(pyenv init -)"
```
追加したら、変数を反映させる。

```
source .bash_profile
```

反映後、以下のコマンドでバージョンが表示されたら問題なくインストールできている。

```
pyenv -v
```

#anacondaのインストール
[anaconda](https://www.continuum.io/downloads)はpyenvを利用すれば簡単にインストールすることができる。

```
pyenv install -l
```

を実行すれば、pyenv経由でインストールできるPythonのバージョン一覧が表示される。
anacondaに限定して表示させたい場合は、

```
pyenv install -l | grep anaconda
```
とすればOK
##Python2系のインストール

```
pyenv install anaconda2-x.x.x
```

##Python3系のインストール

```
pyenv install anaconda3-x.x.x
```
#インストールしたバージョンの確認
pyenvでインストールしたPythonのバージョンを確認する場合は

```
pyenv versions
```
と打ち込めば、インストールしたバーションの一覧が下のように表示される。

```
* system (set by /Users/yourname/.pyenv/version)
  3.6.1
  anaconda2-4.3.1
  anaconda3-4.3.1
```
*は現在設定されているPythonのバージョンを指定している。systemはOSに標準で入っているPython。なので、単純にpyenv install ~としただけでは所望のPythonをインストールすることができるが、使用することはできない。Pythonのバージョンを変更するために`pyenv global`と`pyenv local`を使用する。

#バージョンの切り替え
Pythonバージョンを切り替えるときは、`pyenv global`と`pyenv local`を使用する。

```
pyenv global 3.6.1
```
のようにすれば、Python全体が切り替わる。
または、特定の　ディレクトリに移動した状態で、

```
pyenv local anaconda2-4.3.1
```
のようにすればそのディレクトリ以下にいる時だけ指定したバージョンを使用できる。

# 追記
**「Anaconda2/3の切り替えでpython2/3を切替える利点」**について質問をいただきました。正直なところ、私自身もよくわからないまま環境構築していました。質問に答えられず申し訳ありません。
質問しくださった方の体験では、Anaconda2で作ったpython3環境では動かなかったものがAnaconda３で作ったpython3環境だと動いたという声をいただきました。確信はありませんが、メリットは有るのかもしれません。詳しくはコメント欄を呼んでください。
Staticなクラスの__destructを擬似的に呼び出すのに他のクラスは必要か

# (最初は)何がしたい

staticメソッドの集合のクラスで、スクリプトの最後に処理を実行したい。
≒`static function __destruct()`を使いたい。
# 参照元

[php - How to emulate __destruct() in a static class? - Stack Overflow]

(コード以外ほとんど読んでない…)

>```php
class ConfigDestructor
{
  public function __destruct()
  {
    Config::destruct();
  }
}
>
class Config
{
  static private $destructorInstance;
  static private $autoSave;
  static public function get() {} /* set(), save(), load(), etc. */
>
  static public function init($autoSave)
  {
    if (null === self::$destructorInstance) 
        self::$destructorInstance = new ConfigDestructor();
>
    self::$autoSave = $autoSave;
  }
  static public function destruct()
  {
    if (self::$autoSave)
      self::save();
  }
}
```

この方法でやりたいことは満たせた。

# 気になる点

`__destruct()`を呼び出すために一つクラスを新設している点。
話は逸れるが、クラス内で使う(一行継承)例外クラスの記述をそのクラスファイル内でするのは、クラス名とファイル名が対応しているという原則っぽいものに触れないか？という点と似通う。
別ファイルに分けるにも大げさ過ぎるので、指針がほしいが、今回は置く。

# どうしようと思ったか

読んだ当初はPHP7に上げたら無名クラスで代用してやる…と思っていた。

# どうしたのか

PHP7には上がらない。
最近久しぶりに使いたくて見たら、これ自分自身のシングルトンで収まらないか？と気になった。
staticの`__destruct`を別のクラスで呼び出すぐらいなら、自分のインスタンスを作ってもいいのでは？PHPはクラス全体がstaticには出来ないのだし…

```php
<?php
class Config
{
    private static $config;
    public static function init() {
      if (!static::$config) {
          static::$config = new self();
      }
    }

    private static function destruct() {
      echo "static\n";
    }

    public function __destruct() {
      echo "destruct\n";
      self::destruct();
    }
}

Config::init();
```

予期どおり

```
destruct
static
```

が出力されるが、何か落とし穴があるのかなーと悩み中。


# そもそもどうしてこんなことに…

べた書きと関数のスクリプトファイルに1塊の所々に挟まる処理を追加することになった。
とりあえず新設の処理なので、状態を持つしそのファイル内だけで使うクラスにしてメソッドで処理を書いていたが、使う段になって使いにくいことに気づく。
たくさんの関数の引数にインスタンスを新たに渡さなくてはならないことがまず大変。
また、既存の返り値をインスタンスを含めた配列に変換するのが酷。
(引数で渡したインスタンスの、関数内での変更は呼び出し元でも副作用的に継続するものの、その動きが気に入らない)
仕方ないのでstaticおじさんになり、引数と返り値の悩みから開放されたが、`__destruct()`でやる予定の処理の扱いに困り上記の記事へたどり着く。
今回の場合は`register_shutdown_function`でも構わないのだが、クラスを飛び出す感じが嫌だし、条件を満たした場合に終了時処理を登録する都合、
登録済みかどうかのフラグを持つぐらいならシングルトンでいいんじゃないかなと思った次第。




[php - How to emulate __destruct() in a static class? - Stack Overflow]:https://stackoverflow.com/questions/6984470/how-to-emulate-destruct-in-a-static-class
Pythonでの日本語間の空白の削除

先日投稿した[PythonでアクセスしたWebページのテキストのみの取り出し(Selenium, Beautiful Soup)](https://qiita.com/ryu022304/items/98d07736ac2011b1fdaf)で取り出したテキストに不要な空白が多く見られた。

そこで、Pythonで英単語間の空白を残したまま、日本語間の空白の除去をやってみたので備忘録。

OS : macOS Sierra(10.12.3)
Python : 3.5.1

## コード
入力は日本語版wilipediaのトップページのテキストを抽出したときに見られた不要な空白を含む文章です。

```python
import re

str = "ウィキペディア へようこそ ウィキペディアは 誰でも編集できる フリー 百科事典 です。"

result = re.sub('([あ-んア-ン一-龥ー])\s+((?=[あ-んア-ン一-龥ー]))',r'\1\2', str)

print(str)
print(result)
```

```
ウィキペディア へようこそ ウィキペディアは 誰でも編集できる フリー 百科事典 です。
ウィキペディアへようこそウィキペディアは誰でも編集できるフリー百科事典です。
```

## 簡単な解説
### 文字列の置換の手法
Pythonでは文字列の置換の方法は２種類あるようです。今回は正規表現を使いたいので、re.subを用います。

- replace(正規表現なし)

```
置換後の文字列 = 対象の文字列.replace(置換される文字列, 置換する文字列 [, 回数])
```

- re.sub(正規表現あり)

```
置換後の文字列 = re.sub(正規表現パターン, 置換する文字列, 置換される文字列 [, 回数])
```

### 正規表現
```
([あ-んア-ン一-龥ー])\s+((?=[あ-んア-ン一-龥ー]))
```
- [あ-んア-ン一-龥ー]

[]が集合を表しますので、上記の正規表現は「ひらがな、カタカナ、漢字、長音」のいずれか一文字にマッチします。

- \s+

\sが空白を、+が１回以上の繰り返しを表すので、１回以上の空白にマッチします。

- ?=

Pythonでの肯定先読みの表現です。「xx(?=oo)」で、「ooが後に付くxx」にマッチします。ですので、今回は「日本語が後に付く、日本語+一文字以上の空白」にマッチします。

なぜこのようなことをしているのかと言うと、例えば、「日　本　語」という文字列の空白を除去しようと考えた場合、肯定先読みを用いず、日本語の間の空白を除去しようとするとします。すると、まず「日　本」にマッチして置換します。そしてその後、既に「本」にはマッチしていますので、「　語」にはマッチせず、最終的に「日本　語」と言う置換のされ方になってしまいます。

しかし、肯定先読みを使っていると、「日本語が後に付く、日本語+一文字以上の空白」にマッチするので、まず「日　」にマッチし、次に「本　」にマッチするので、最終的には「日本語」という結果が得られます。

- r'\1\2'

かっこで指定したマッチした部分の一つ目と二つ目を繋げるように置換します。これで空白を取り除いています。ここでもし、r'\1-\2'と記述した場合は、日本語に挟まれた空白が-に置き替わります。

## まとめ
以上です。
間違いや改善点等があったらコメントで指摘して頂ければ幸いです。

## 参考にしたサイト
- [Pythonで文字列を置換する：replace(), re.sub()](http://uxmilk.jp/8662)
- [Python3で漢字の判定](https://qiita.com/acro5piano/items/e0a48905159e8a4911ab)
- [python正規表現入門3「先読み、後読みの、肯定と否定」](http://youya66.net/python/685)
Macの上のメニューバーがおせない

Macをつかってるとたまにwifiのボタンなど、この欄のボタンがおせなくなることがある。
![スクリーンショット 2017-11-13 10.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/114212/0d0b6d5f-d2e0-e3cf-3f6a-62a1679b918e.png)

そうゆうときはターミナルで

```
$ killall SystemUIServer
```

治った！
raspberry pi ピン配置



| Wedge Silk	| Python (BCM)	| WiringPi GPIO	| Name	| P1 Pin| Number|	Name	| WiringPi GPIO	| Python (BCM)	| Wedge Silk |
|:---------|:-----------|:-----------|:---------|:-----------|:-----------|:---------|:-----------|:-----|:-----|
| | ||3.3v DC Power|	1|	2|	5v DC Power|	| ||
|SDA|	|8	|GPIO02 (SDA1, I2C)|	3|	4|	5v DC Power|||	
|SCL||9	|GPIO03 (SCL1, I2C)	|5	|6	|Ground|	
|G4	|4	|7	|GPIO04 (GPIO_GCLK)	|7	|8	|GPIO14 (TXD0)	|15|	|TXO|
||||Ground	|9	|10	|GPIO15 (RXD0)	|16	||RXI|
|G17	|17	|0	|GPIO17 (GPIO_GEN0)	|11	|12	|GPIO18 (GPIO_GEN1)|1|	18|G18|
|G27	|27	|2	|GPIO27 (GPIO_GEN2)	|13	|14	|Ground	|
|G22	|22	|3	|GPIO22 (GPIO_GEN3)	|15	|16	|GPIO23 (GPIO_GEN4)|	4|23|G23
||||3.3v DC Power	|17	|18	|GPIO24 (GPIO_GEN5)	|5	|24	|G24|
|MOSI||12	|GPIO10 (SPI_MOSI)	|19	|20	|Ground|	
|MISO	||13	|GPIO09 (SPI_MISO)	|21	|22	|GPIO25 (GPIO_GEN6)	|6	|25|G25|
|||(no worky 14)|GPIO11 (SPI_CLK)	|23	|24	|GPIO08 (SPI_CE0_N)	|10|	|CD0|
||||Ground	|25	|26	|GPIO07 (SPI_CE1_N)	|11||CE1|
|IDSD||30	|ID_SD (I2C ID EEPROM)	|27	|28	|ID_SC (I2C ID EEPROM)	|31||IDSC|
|G5	|5	|21	|GPIO05	|29	|30	|Ground|	
|G6	|6	|22	|GPIO06	|31	|32	|GPIO12	|26	|12	|G12|
|G13	|13	|23	|GPIO13	|33	|34	|Ground	|
|G19	|19	|24	|GPIO19	|35	|36	|GPIO16	|27	|16	|G16|
|G26	|26	|25	|GPIO26	|37	|38	|GPIO20	|28	|20	|G20|
||||Ground	|39	|40	|GPIO21	|29	|21	|G21|
46歳から機械学習を学習する (1)

#猫も杓子も機械学習
　最近、様々なソフト開発会社から発表されるソフトウェアにほぼ共通して含まれるのが「機械学習」というキーワード。
　業務用ソフトウェアの選定に係る立場にいるので、知っておく必要があるかなと思う。
　しかし、正直なところよくわからないので、自分で勉強することにした。

#機械学習の本を買って読んでみた。

[Python機械学習プログラミング 達人データサイエンティストによる理論と実践](https://www.amazon.co.jp/Python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%81%94%E4%BA%BA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-impress-top-gear/dp/4844380605)


　うーむ、難しい（汗。
　専門用語と数式とグラフの羅列だ。
　まず取っ掛かりを探さないと・・・

#ネットで調べてみた。
　どうやら数学と Python の知識が必要のようだ。
　数学といっても、主な分野はつぎの３つらしい。

- 微分
- 線形代数
- 統計

#さらに調べてみた。
　ライブラリの使い方を理解する必要があるようだ。

#今回の結論
　ジュンク堂に行ってきます。
ColaboratoryでTreasure Data にクエリを投げる

Colaboratoryというhosted Jupyter + Google Driveなど連携などがされた便利なサービスがfree to useで提供されています。

> Is it free to use?
> Yes. Colaboratory is a research project that is free to use.
> https://research.google.com/colaboratory/faq.html


なので、下記の手順でTreasure Dataにクエリを投げれます。

Colaboratoryでは任意のライブラリをインストールするには、`!pip install`を利用します。
つまり、

```
!pip install td-client
```

で、https://github.com/treasure-data/td-client-python のインストールが可能です。

あとは、下記のようにしてクエリが投げれますね。簡単。

```
import tdclient

with tdclient.Client(apikey='<YOUR APIKEY>') as td:
    job = td.query("sample_datasets", "SELECT COUNT(1) FROM www_access", type="presto")
    job.wait()
    for row in job.result():
        print(repr(row))
```

![Untitled0_ipynb_-_Colaboratory.png](https://qiita-image-store.s3.amazonaws.com/0/34543/ed363ccb-99ca-6d85-9964-11ef0ac1224d.png)
UIButton, UILabelをXcodeでサクッと角丸にする方法

#XcodeのStoryboardを使用してアイテムを角丸にする方法
角丸にする方法はカスタムクラスを作ったり、Extentionで実装したりと色々とありますが、
ここではXcodeで特定のパーツのみサクッと角丸にする方法をご紹介します。

1. Xcode で角丸にしたいアイテム（UIButton等）を選択し、Utilitiesエリア（右側） の Identity Inspector（左から３つ目）を開く
2. User Defined Runtime Attributedsの「Key Path, Type, Value」を追加

|Key Path|Type|Value|
|:--|:--|:--|
|layer.cornerRadius|Number|10|
Valueの値で角丸の半径が決まりますので調整します。

## UILabelの場合
~~UILabelの場合はもう一行必要です。~~
（コメントでご指摘いただきましたが、）UILabelの場合はUtilitiesエリア（右側） の Attributes Inspector（右から３つ目） にて Clip to Bounds のチェックを入れればOKです。

## シミュレータまたは実機で確認
この方法では、Xcode上のプレビューでは角丸は反映されません。
シミュレータまたは実機で実行すれば反映されています。
新人エンジニアとのジェネレーションギャップ

ふと自分がベテランエンジニア(おっさん)になってしまった、、、と感じたので書いてみる。

Javaとか普通に使われてると思うし、makeもC系だと普通だとおもうし、メッチャ偏見を入れて書いていることをご了承ください (笑)

## バージョン管理ツール

新人

- Gitしかやったこと無い
- SVN聞いたことあります
- CVS？CSVじゃなくて？

おっさん

- SVNやCVSって言うのがあってだな
- VSSって知ってるか？
- ファイルサーバで上書きされることとかあったよー

## サーバインスタンス
新人

- ポチポチ (AWS、GCP、さくらVPS)
- Herokuでいいっすか？ GAEでいいっすか？

おっさん

- 納品まで時間が掛かるから、早めにスペック確定して発注しないと
- サーバルーム行ってくる
- ソコのおいてあるのが開発用サーバだから電源消しちゃダメだよ

## プログラミング言語

新人

- PythonとScalaなら触ってました
- Swift書いたことあるけどObjectiveCは触ったことないです
- C++なら授業で少しだけ。Cは触ったことないです
- Java書いたことない

おっさん

- CとC++のポインタがつまづくとこだよね！
- Javaはなかなか良いんだよ！ 型がいい！ チェック例外とstream処理の相性最悪だけど
- ObjectiveCで書いてるときはちゃんと自分でメモリ管理していたんだよ

## ビルド&リリース

新人

- CodeDeploy、Cloud Formation、Kubernetes
- CircleCI、TravisCI
- Ansible、Fabric
- jenkins聞いたことある。おっさんのやつでしょ？

おっさん

- make最強
- おれのshell力をみせてやる
- ローカルでコンパイル、ビルドしてFTP転送
- ハドソンってしってるか？ ゲーム会社とは別なんだよー

## データのやり取り

新人

- スプレッドシートに一覧にします
- wikiにまとめておきますね
- 議事録 スマホのカメラでパシャっとしてアップロード
- ファイルをbox、google driveに上げときますね

おっさん

- 開発項目\_最新(3)\_fix版\_修正.xls
- 今、図を書いているので待って下さい！
- MOは容量が大きくていいな〜 CD-Rは書き換えれないからな

## チャットツール

新人

- Slack、ChatWork、Hangout
- LINE
- Facebook Messenger

おっさん

- 仕事中はチャットツール禁止
- IP Messenger
- MSN Messenger, Yahoo Messenger
- ICQ (カッコー)


# コメント下さい

こんなあるある思いついたらコメントにメッセージ下さい (笑)
raspberry pi 3 でstretch その8

#概要
raspberry pi 3 でstretchやってみた。
webサーバやってみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/a239fcf3-93e9-7bf4-d0a7-4342617a207b.png)


#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch

#インストール

sudo aputitude install apache2 php mysql-server php-mysql

#MariaDb設定
sudo mysql_secure_installation

```
パスワード設定
```

sudo mysql -uroot -p

```
create database mydb;
create user 'yamada'@'localhost' identified by 'tarou';
grant all on `mydb`.* to 'yamada'@'localhost';

```
#確認
nano info.php

```
<?php
	phpinfo();
?>
```
sudo cp info.php /var/www/html

ブラウザで「localhost/info.php」を開く。

nano test.php

```
<?php
    $conn = mysqli_connect('localhost', 'yamada', 'tarou', 'mydb');
    if (mysqli_connect_errno() > 0)
    {
        print "接続に失敗しました";
        exit;
    }
    print "ok";
?>
```
sudo cp test.php /var/www/html

ブラウザで「localhost/test.php」を開く。

以上
【Python】Windows Subsystem for LinuxでSelenium環境を整える

# やりたいこと

* 前回までに、Windows10にWindows Subsystem for Linuxをセットアップし、Python環境を構築した
    * https://qiita.com/kkdmgs110/items/972b65a77ab27c00519e
* 今回は、Windows Subsystem for Linux下のPythonでSeleniumを使えるようにする

# 結果

* Chromeが自動起動され、Seleniumを動かせるようになった

![cmd.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/d5b66e88-2114-f55c-81e7-d4a4a1a5fb2f.gif)

# ソースコード

```python:setup.py
import sys
import os
from selenium import webdriver

//1
driver = webdriver.Chrome(executable_path='/mnt/c/workspace/pydev/chromedriver.exe')
//2
driver.get("https://www.google.co.jp/")
print(driver.title)
```

# 手順

下記のページを参照

【Python】Windows Subsystem for LinuxでSelenium環境を整える

https://review-of-my-life.blogspot.jp/2017/11/pythonbash-on-windowswindows-subsystem.html
Bash on WindowsからUbuntu環境を構築し、Python環境を整える(Windows10)

# やりたいこと

* Windows Subsystem for Linuxを利用して、WindowsにUbuntuが使えるようにし、Python環境を構築します
    * Virtual Box入れるのめんどいし
    * Anacondaも個人的に好きではない
    * Win上でサクッと入れられないものか
    * Windows Subsystem for Linuxよさそう！

# 結果

* コマンドライン上でBashシェルが使えるようになります。
    * lsやらなんやらが使えてます。

![cmd.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/592c155f-6371-967c-793e-cc41855088f9.gif)

# 手順

* こちらの記事を参照してください。

Windows Subsystem for LinuxでUbuntu環境を構築し、Python環境を整える|Review of My Life 

https://review-of-my-life.blogspot.jp/2017/11/bash-on-windows-ubuntu-pydev.html
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part1-5, 2-1

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part1-5 グリッドシステムを使う
##グリッドシステムとは？
bootstrapに含まれているもので、レイアウトを綺麗にできるものです。[公式サイト](https://v4-alpha.getbootstrap.com/layout/grid/)

[このサイトが非常にわかりやすい！](http://websae.net/twitter-bootstrap-grid-system-21060224/)

１２分割されていて大きさを指定できます。レスポンシブなHPにできます。

##container, row, colの順に入れていく。
先ほどのリンクを見てもらうのが一番です。[このサイト](http://websae.net/twitter-bootstrap-grid-system-21060224/)

containerという入れ物にrowを設置し、その中のcolが平行に設置されていく。

##CSSの

#自己課題
- Hello World!をgrid systemを用いて真ん中に表示させよ。なお、colは６。
- cssも追加。

#part2-1 Deviseの導入
##Deviseとは。
ログイン認証を実装するgem。登録してメールが届いたり、パスワード変更するときとかの変更メールも送れちゃうらしい。
[deviseの公式？ページ](https://github.com/plataformatec/devise)

##導入方法
    gem 'devise'
をgemfileに追加。
    rails g devise:install
を実行。

あとは公式ページおっていけばわかる。

##モデルについて。
モデルとは、データベースとデータをやり取りするために使われるもの。コントローラーに支持によって動かされる。

#自己課題
- deviseをインストール。
- ターミナルに表示された処理を行う。
- devise Userモデルを作成
BitbucketとCircleCIをwrite権限ありのSSH鍵で連携させる

# 概要
Bitbucketで管理しているプロジェクトで、
変更があったとき（push、PRマージなど）に、CircleCIが自動で走るように連携させてみた。

そのときに、CircleCIからpushしようとしたら権限が足りずはまったのでメモ。

# メモ
CircleCIの管理画面でBitbucket連携をすると、
自動でSSH鍵の設定がされるようだが、
read onlyの鍵で登録される様子。

write権限を持たせるために。
1. CircleCI上のssh鍵登録画面で、Hostname: bitbucket.org で秘密鍵を登録
2. Bitbucket上の `User` のSSH設定画面で、公開鍵を登録

デフォルトで登録されるのが、deployment keyで、
write権限ありに設定したのはuser keyなのかなと思ってる。
子どもにプログラミング教育を始めるならば何から？

プログラミング教育をするうえで、具体的な道具ではない部分で必要なものは？

#子どもの興味やきっかけ
「学校教育でプログラミングが必須化するから勉強させなきゃ！」と親は焦るかもしれませんが、そもそもそんなこと子供にとっちゃ全く関係ないこと。それこそ「習ったことのないピアノを今すぐ始めなさい」と同じレベルで「プログラムを始めなさい」とわけわからないまま押し付けたら、やる気が失せるどころか、**一生プログラミングなんかやるものか、というトラウマにもなりかねない**。

子どもにとって**「ゲームを作りたい」**が一番わかりやすい、身近な理由ですね。
**「プログラムで絵を描く」「プログラムで音楽を鳴らす」「プログラムでボタン入力受け付ける」**とかも、ありだとおもいます！
成果がすぐにでてくるものが、教材としてはベターです！いきなりアセンブラでボード動かせとかあえりないです！

こういう意味では、**micro:bit** や**プチコン**というのは、教育にかなり向いているなあ、と個人的にはお勧めします。

#制御できている安心感

では、**プログラミングが嫌になる理由**はなんでしょうか。その１つは**「わけわからない」**状態に陥る事と考えます。

何をしたいかなあを、**頭に思い浮かべる**。
頭に思い浮かべていることを、**ソースコード**を記述します。
ソースコードを、コンパイルして**実行ファイル**に変換する。
実行ファイルを実行して、**実行結果**が得られる。

ところが、その命令の１つ１つを理解せずに「ソースコードをまるごと写せば動く」と捉えると、
一字一句写すことだけを考えてしまう。そして記述ミスがあると動かなくなり、自分が制御できていないように感じる。
すると途端に自分は何もできていない、無力・無能であるかのように感じてしまう。
こうなるとプログラミングなんてやだー！どうして**頭に思い浮かべた内容が、実行結果で得られない**んだー、となる。
これじゃいけない。

大切なのは「制御できている安心感」。プログラミングの世界では正直なところこれくらいハードルは低い[^2]。

- コンパイル時にエラーがでている ＝ 「ソースコードの記述に問題が起きていることが分かっている」
- 予期しない動作をしている ＝ 「問題が起きている事がわかっている」

## ボトムアップでやるならば
- まずは小さい物を作ってみる 
- 徐々にその周辺を作っていく
- 最終的には、全部を束ねて完成品にする。

## トップダウンでやるならば
- 関数などがスタブ（空）でいいので全体をまず作る。
- 中ぐらいの粒度のものを作る。
- 細かい実装を作る

ここで重要なのは、どっちのアプローチが優れているのか、という話ではなく「結局わかることしか分からないのだから、問題を最小単位でとらえて、１つずつ解決させていく」というスタンスで進める事が必要ということ。

#「なんで？」「なぜ？」にこたえられる、親の知識と忍耐力

ある程度プログラミングができてくると、次にでてくるのは膨大な疑問である。
「どうしてこのやり方なのか」等などの部分について、理解すればするほど疑問が増える。

こうした話が出てきたときに、親が面倒がって流してはいけない。

一番いいのは「子供と一緒に調べてみる」である。
次善策は「それには、高校・大学の知識が必要になるから、今はそれをうまく使っておいて、後で調べよう」である。
最悪なのは「分からない、自分で調べておいて」である。

例えば、小学生だって三角関数の概念は、「グラフを描く機能」さえあれば、大体理解できる（私はしていた）。
それこそ倍角の公式とかは全く分からないでも、「円を描くことができる」関数としては理解できる。

#明確なゴールと、達成感
最後に、プログラミング教育で最も重要な事は**「ゴール設定」**である、と主張したい。

仮に子供が「ゲームを作りたい」といったとしたら、ゲームを作ることが達成するべきゴールなのだろうが、
しかしそれではゲームが完成しなければそれは無駄な時間だったのだろうか？否。

"今、何を解決するのか"という**スモールゴール**を設定し、それを少しずつクリアしていくことで、**最終的なゴール**に到達できるということを体感できること、それがプログラミング教育によって子供に与えられる最大の体験であると考える。

複雑な物事も、小さい物事の積み重ねから成立している[^1]、ということを理解することは、問題解決能力向上において重要な要素だと私は考える。

# 最後に、一番大切な事。

子どもが一歩でも前進したら、そのことを親も一緒に喜びましょう！！

算数でいうならば、九九が全部覚えられたら素敵な事ではあるけど、いきなり全部覚えろなんて言わないですよね？
**１の段ができた、おめでとう！　２の段ができた、いいぞ！　３の段ができた、おっけー！**

プログラミングも一緒です。
**文字が表示できた、おめでとう！　文字が入力出来た、いいぞ！　文字で連結できた、おっけー！**
こうやって少しずつ学んで理解して、自分のものにしていく実感を感じられるから、楽しいんです。

でもそれを喜ぶのは、子供が内発的に喜ぶのもそうですが、他人に認められればもっと強く喜びを感じられる。
子供が徐々に成長していくのを一番喜べるのは、**一番身近な家族** なんだと思います。

どうか、**楽しいプログラミングライフを家族でお過ごしください**。


[^1]: ただし世の中には「複雑系」と呼ばれる、複雑な物事を無理に分解せずにそのまま解釈しちまおうぜ、っていう分野もありまして…　まあそこらへんはもっともっと後から理解できればいいと思うのです。
[^2]: 一番まずいのは「正常に動いているように見えるんだけど、ちょっとデータが違うとぐちゃぐちゃになる」とか、「正常に動いているように見えるんだけど、なんで正常に動いているのか分からない」とか、「正常に動いているように見えるんだけど、よく見ると精度が…」とか。
Assembly code and Assembler on Windows 10.　Windows 10でアセンブリ+ラして実行形式.exeを作成方法.

Good Morning.

1. install MASM.
2. 2.type Assembly code below and Assembler and got an Execute code.

```Assembly
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
  Hello db "Hello Assemblerrr!!!",0
  numb dword 5
.code
start:
    invoke StdOut, addr Hello
    xor     eax,eax
    mov     ebx,    17
    mov     ecx,    edi
    add     ebx,    [edi]
    mov     ecx,    numb
    ror     ebx,  cl
    invoke  ExitProcess, 0
end start
```

Assembly -> save in .asm file -> Assembler this.
You will have below files and You need link them for one of two environments.

```text

2017/11/13  05:12               521 mytest.asm
2017/11/13  05:12               625 mytest.obj
```

Chose console link Object file.（出来上がったobj fileをlinkしてあげてexeを作成が必要）

```text

2017/11/13  05:15               521 mytest.asm
2017/11/13  05:15             2,560 mytest.exe
2017/11/13  05:12               625 mytest.obj
```
above files comes up with no errors and You got an executable.

and then run this on your windows CLI. (mytestって打つだけ）
Now You will have a running executable program.

```text
C:\masm32>mytest
Hello Assemblerrr!!!
C:\masm32>
```

Enjoy :robot:
機械学習論文読みメモ_104


[DSSD : Deconvolutional Single Shot Detector](https://arxiv.org/abs/1701.06659)
本論ではSOTAのobject detection手法に新たなコンテキストを取り入れて性能向上を行う．
まず始めにresnetをSSDと組み合わせる．
またさらにdeconvolution layerを用いて，小さな物体に対しても認識性能を向上させる．
しかしながらこれら構造の導入は簡単ではなく，慎重な調整と共に取り入れる事で
性能向上を実現した．

[Adversarial discriminative domain adaptation](https://arxiv.org/abs/1702.05464), NIPS2016
最近のdomain adaptation手法は2つのドメインをそれぞれ同じ特徴空間へ写像する事を目的としてきた．
この場合，maximum mean discrepancyやcorrelation distancesを元にしてその共通の特徴空間上で2つのドメイン間の差異を最小化させる．
一方でadversarial learningを用いた手法が提案されており，この場合，domain discriminatorモデルを騙す事を通じてドメイン間の差異を最小化する．
本論では特にadversarial learningに注目し，従来手法を俯瞰しつつそれらを統合した新たな手法を提案する．
従来手法を分析すると，それらは元々のタスクに対応したモデル構造，重みをどのように共有するか，どのような損失を利用するか，の３つの観点において様々なアプローチが提案されている．
それらを統合して考え，提案手法は分類モデルに関して，重み共有をせず通常のadversarial lossを用いた手法が最適なものであるとして提案する．

[Pyramid Scene Parsing Network](https://arxiv.org/abs/1612.01105), CVPR2017
本論ではpyramid pooling moduleを提案し，これを用いる事で異なったコンテクストの集約を可能にする事で高性能なsemantic segmentation性能を実現した．
このモジュールでは，入力画像に対してCNNで特徴抽出を行った特徴量を入力とし，
それを異なったreceptivi fieldを用いてマルチスケールに処理を行い，それらから得られた特徴を統合する事で高性能なモデルを実現する．
RubyでgRPCのストリーミング

# 概要
- gRPCの双方向なストリーミング機能をRubyで利用する方法

# 前提
- 以下でgRPC用のgemをインストール

```
$ gem install grpc
$ gem install grpc-tools
```

# 方法
## protoファイル
- service定義で、パラメータと戻り値に"stream"を付ける

``` ruby:sample.proto
syntax = 'proto3';

package sample;

service Echo {
    rpc Talk (stream Request) returns (stream Response);
}

message Request {
    string message = 1;
}

message Response {
    string message = 1;
}
```

## コンパイル

```
grpc_tools_ruby_protoc --ruby_out=lib --grpc_out=lib sample.proto
```

- 上記protoファイルをコンパイル
    - sample_pb.rbとsample_services_pb.rbが生成される

## プログラム実装（例）
- サーバ側、クライアント側双方、Enumeratorを介してやりとりする

### サーバ側

``` ruby:sample_server.rb
#!/usr/bin/env ruby

this_dir = File.expand_path(File.dirname(__FILE__))
lib_dir = File.join(this_dir, 'lib')
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)

require 'grpc'
require 'sample_services_pb'

class EchoServer < Sample::Echo::Service
  def talk(requests)
    return enum_for(:talk, requests) unless block_given?

    requests.each do |request|
      sleep rand(5)
      message = "received (#{request.message})"
      yield Sample::Response.new(message: message)
    end
  end
end

def main
  s = GRPC::RpcServer.new
  s.add_http2_port('localhost:50051', :this_port_is_insecure)
  s.handle(EchoServer)
  s.run_till_terminated
end

main
```

- サーバ用クラスのメソッドの引数には、クライアント側から渡されたEnumeratorなオブジェクト（後述）が渡ってくる
- 上記Enumeratorオブジェクトに対して、eachでブロックを渡す
    - yieldでレスポンス用のオブジェクトを渡すようにしておく
- メソッドの戻り値としてEnumeratorオブジェクトを返す
    - 実行時にはブロックなしで呼ばれるので、ブロックなしで呼ばれたらObject#enum_forで自メソッドをEnumerator化して返すようにしておく
    - このEnumeratorオブジェクトがクライアント側のスタブの戻り値になる

### クライアント側
- サーバ側がObject#enum_forだったので、サンプル的にEnumerator.newで

``` ruby:sample_client.rb
#!/usr/bin/env ruby

this_dir = File.expand_path(File.dirname(__FILE__))
lib_dir = File.join(this_dir, 'lib')
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)

require 'grpc'
require 'sample_services_pb'

def main
  requests = Enumerator.new do |yielder|
    loop do
      print "\ninput: "
      message = STDIN.gets.chomp
      next if message.size == 0
      break if %w(quit exit).include?(message)

      yielder << Sample::Request.new(message: message)
    end
  end

  stub = Sample::Echo::Stub.new('localhost:50051', :this_channel_is_insecure)

  responses = stub.talk(requests)
  responses.each do |response|
    puts "\nresponse: #{response.message}"
  end
end

main
```

- リクエスト用にスタブのメソッドにEnumeratorオブジェクトを渡す
    - これがサーバ側メソッドの引数になる 
- スタブの戻り値にサーバ側から返したEnumeratorオブジェクトが渡ってくる
    - each実行でサーバ側メソッド（のenum_forでEnumerator化されたもの）が実行される
    - サーバ側メソッド内でeachが実行されることで、リクエスト用に渡したクライアント側のEnumerator(Enumerator.newしたもの)が実行される
    - Enumerator.newのブロック内でEnumerator::Yielder#<<に渡したリクエスト用オブジェクトがサーバ側のeachのブロック引数として渡る
    - サーバ側でyieldに渡されたレスポンス用オブジェクトが、クライアント側のeachのブロック引数として渡ってくる
[とあるコンテスト:web server編] シンプルなweb serverの構築手順

いや～、久しぶりの投稿です。

とある学生コンテストに参加する予定なので、それに向けてやっていることを今のうちに仲間たちのためにも、久しぶりにサーバーを構築する自分のためにも備忘録として書いておきます。（ここで書いてあるような設定をしたサーバーは、間違っても外部に公開しないで下さいー＞即、餌食にされます）

今回はあくまで web server の構築に焦点を当てるので、必要最低限のこと以外はここでは説明せず省略します(おいおいそれらについても書いていこうと思っています)。
その代わり最後にまとめて参考になりそうなリンクを貼っておくので、必要に応じて参照してしてください。

#構築環境
- virtualbox上のGestOS　Ubuntu 16.4 LTS
- Docker-container上のOS　CentOS 7.4.1708 (ipv4 address : 172.17.0.2/16 と仮定)
- Apache version 2.4.6

#構築目標
basic認証を使って、許可されてるユーザーのみウェブページにアクセスできるようにします。
ブラウザはubuntu上のものを使います。

#いざ構築
分かりやすい(?)ように、プロンプトにdocker上では**[docker]**を付け足します。

##docker-container 起動 & apache install
コンテナ名は`http_test`とし、127.0.0.1の8080番ポートから192.168.0.2の80番ポートへポートフォワーディングさせます。

```
$ sudo docker run -d --privileged -p 127.0.0.1:8080:80 --name http_test centos /sbin/init
$ sudo docker run exec -it http_test /bin/bash
[docker]# yum update
[docker]# yum install httpd
```

##chromeから**127.0.0.1:8080**アクセスして**Hello World**と表示させる
###①httpd.confの記述を少し変更
この環境では/etc/httpd/conf/に格納されていた`httpd.conf`を開き、**ServerName 172.17.0.2:80**(95行目あたり)と書き込みます。
**DirectoryIndex index.html**(165行目あたり)となっているのを確認し、なっていなければ左記を書き込んでください。
これを書かないとアクセスされたディレクトリに格納されているものの一覧が表示されてしまいます。

###②HTMLファイル作成

```
[docker]# vi /var/www/html   (<h1>Hello World</h1>と書き込み保存)
```

###③サーバー起動

```
[docker]# sytemctl start httpd
```
上記のコマンドでサーバーを起動させ、ブラウザから**127.0.0.1:8080**にアクセスすると、Hello Worldと表示されます。

##basic認証を設定
###①認証をするディレクトリと成功時に表示させるものを作成

```
[docker]# cd /var/www/html
[docker]# mkdir auth
[docker]# vi auth/success.html 　　(<h1>Success</h1>と書き込み保存)
```

###②アクセス許可するユーザー情報のファイル作成
アクセス許可するユーザー名は「test」、パスワードは「auth」、ファイル名は「pass」とします。

```
[docker]# cd /var/www
[docker]# mkdir etc
[docker]# cd etc
[docker]# pwd
/var/www/etc
[docker]# htpasswd -cbB pass test auth   (crypt_blowfish algorithm を使ってパスワードを暗号化)
```
passファイルに書き込まれている行の先頭が**test:\$2y\$**となっていればOKです。
ちなみに$マークの間の`2y`は、使用するアルゴリズムによって異なります。/etc/shadowと同じような記述方法ですね。

###③httpd.confへの追記

```
<Directory "/var/www/html">
     (省略)
</Directory>
```
のあとに、以下を追記

```
<Directory "/var/www/html/auth">
     AuthType basic
     AuthName "arbitrary"
     AuthBasicProvider file
     AuthUserFile "/var/www/etc/pass"
     Require valid-user
</Directory>
```

それから、**Directory index.html**の横に**access.html**を追記します。
これにより、authディレクトリにアクセスされても格納ファイル一覧が表示されることはありません。

これで、設定は完了です！！！
いざ、アクセス！！！
ブラウザで**127.0.0.1:8080/auth**にアクセスして、認証ダイアログにユーザー名「test」、パスワード「auth」を打ち込むと、**Success**と表示されるでしょう。

#参考
- Dockerインストール方法 for [ubuntu](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/) / [centos](https://docs.docker.com/engine/installation/linux/docker-ce/centos/)
- [Docker基本的な使い方](https://docs.docker.com/get-started/)
- [Apache document](https://httpd.apache.org/)
- [Apache基本設定方法](https://httpd.apache.org/docs/2.4/en/howto/htaccess.html)
- [htpasswdコマンドの使い方](https://httpd.apache.org/docs/2.4/en/programs/htpasswd.html)
- [認証の設定例](https://httpd.apache.org/docs/2.4/en/howto/auth.html)
JavaScriptをついばむ：変数と値

JavaScriptの勉強メモ。知らなかったことやハマりそうなところを書いてる。

## 変数宣言の巻き上げ(Hoisting)
* 変数宣言がコードの最後で行われても最初に行われたことになる
* 初期化は巻き上げられない 
* ただし、可読性が下がるので使うべきではない

## ブロックスコープ
波括弧{}の中を有効範囲とするスコープ。
下記はES6から導入された変数宣言子。

* let:ローカル変数を宣言する。
* const:定数を宣言する。

## データ型
基本型と参照型にデータ型は分類できる。

* プリミティブ型
	* 数値
	* 文字列
	* 真偽値
	* 特殊な値・・・null, undefined
	* シンボル

* オブジェクト型
	* 配列
	* オブジェクト
	* 関数

## 数値リテラル
数値を16進数や8進数で表現できる
### 整数リテラル

|表記法  |説明  |例  |
|---|---|---|
|10進数  |何も付けない。  |10  |
|2進数  |先頭に0bを付ける(ES6から使用可能)  |0b1010  |
|8進数  |先頭に0oを付ける(ES6から使用可能) <br>先頭に0を付ける記法もあるが処理系によって使用できない |0o12  |
|16進数  |先頭に0xを付ける  |0x0A  |

### 浮動小数点リテラル

|表記法  |説明  |例  |
|---|---|---|
|整数.小数  |そのまま  |1.23  |
|.小数  |整数が0なら省略可能  |.23  |
|仮数e指数  |8.02×10^23  |8.02e23  |
|仮数E指数  |8.02×10^-23  |8.02E23  |
Pythonで今日が今月の第何何曜日か調べる

#概要
「今日は第3火曜日です」とか「今日は第1金曜日です」ってのを知りたかったんだけど、調べる方法がなさそうだったので実装した。
（もしかしてもっとちゃんと調べるとあるんですかね、僕は見つけられませんでした・・・）

AWS Lambdaでいろいろやっていたときに使いたかったものなので、言語はPython3.6。
別にどの言語でも関係ないような処理だけど・・・。

説明が下手だったり変数名がイマイチな部分は、大変申し訳ないです。

#解説
その曜日がその月に何回出現したかを数えれば、今日が第何回目の何曜日かわかるんじゃない？と思った。

今日の日付データ取得し、それを基準にして1週間前の日付が同月かどうか調べる。
今日を含め、日付が1日以降であれば出現回数+1していくようなループで調べられるかなあ、と思った。

#コード
```Python
import datetime

def get_weekday():
	#日本時間での現在の日付データ取得
	#念のためUTCの時間を取得してから時差分を足してる
	jstTime = datetime.datetime.utcnow() + datetime.timedelta(hours=9)
	day = jstTime.day

	#曜日を漢字で取得したかった
	#.weekday()ではint型の数が取得でき、0が月曜日で6が日曜日なのでリストと組み合わせた
	wd = ["月","火","水","木","金","土","日"]
	weekday = wd[jstTime.weekday()]

	#1週間前の日付が同月かどうか調べる -> 1日より前か後かで判別
	#dayが1日以降(同月)なら出現回数+1してdayに1週間前の日付を代入(-7する)、1日より前(前の月の日付)なら処理終了
	weeks = 0
	while day > 0:
		weeks += 1
		day -= 7

	"""
	例：今日が2017/11/13の場合、day = 13
	1ループ目・・・ day(=13) > 0 なので出現回数+1(weeks += 1)、1週間前の日付代入(day -= 7)
	2ループ目・・・ day(=6) > 0 なので出現回数+1(weeks += 1)、1週間前の日付代入(day -= 7)
	3ループ目・・・ day(=-1)は day > 0 を満たさないのでループを抜ける
	"""

	print('今日は、今月の第' + str(weeks) + weekday + '曜日です。')
	#例：今日は、今月の第2月曜日です。

	return
```
機械学習論文読みメモ_103


[Subcategory-aware Convolutional Neural Networks for Object Proposals and Detection](https://arxiv.org/abs/1604.04693)
CNNベースの物体検出では，scale variation, occlusion, truncationの影響によりregion proposalの部分が難しくなってくる．
また従来手法は2Dの物体検出のみを行い，検出された物体の詳細についての予測は行わない．
本論でsubcategory-awareなCNNを物体検出のために提案する．
提案するregion proposal networkでは対象のサブカテゴリ情報も用いたproposal genereting processを提案する．

[Laplacian Pyramid Reconstruction and Refinement for Semantic Segmentation](https://arxiv.org/abs/1605.02264)
CNNは画像認識タスクにおいて高い性能を発揮してきた．
しかしそのためにはpooling機構へ頼る必要があり，高解像度な画像に対するpixelレベルの推論は難しくなっている．
本論では特徴抽出の過程において低解像度になったとしても，それら特徴は対応する位置に関するpixelレベルの情報を保持している事が分かった．
またlaplacian pyramidの構成を利用したマルチ解像度の再構成を行い，そこに高解像度特徴からのskip connectionを利用する事でpixelレベルの推論精度を改善させる．

[OUTRAGEOUSLY LARGE NEURAL NETWORKS: THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER](https://arxiv.org/abs/1701.06538), ICLR2017
Neural networkのキャパシティはそのパラメータの数に制限される．
ネットワークの一部のみをサンプル毎に活性化させるconditional computationはネットワークの計算量を増加させる事なくキャパシティを上げる事が出来る理論として最近提案されてきている．
しかしながら，パフォーマンス面とアルゴリズム面においてその実現において課題は残っている．
本論ではそれらを解決し，計算効率に関する微小な損失のみで1000倍のmodel capacityを実現する事を可能にした．
そのための手法として本論ではsparsely-gated mixture-of-experts layerを提案する．
この構造は最大で数千の層から成り立たせる事が出来る．
搭載されている学習可能なgated networkはサンプル毎に利用するネットワークを自動的に選択する事を可能にする．
Spring BatchでTaskletジョブを実装してみた

Spring BatchではChunkとTaskletの2パターンの実装方式がありますが、Spring Batchの[Getting Start](https://spring.io/guides/gs/batch-processing/)はChunkで実装されており、Tasklet実装の例がありません。
なので、Getting StartをTasklet化してみました。
ChunkとTaskletのアーキテクチャについてはNTTデータさんが[TERASOLUNAの開発ガイドライン](https://terasoluna-batch.github.io/guideline/5.0.0.RELEASE/ja/single_index.html#Ch02_SpringBatchArch)で詳しくまとめているのでそちらが参考になるかと思います。

# 実施手順
## Getting Startの実装
まずは、Spring Batchの[Getting Start](https://spring.io/guides/gs/batch-processing/)を実装します。
単純にコピペすれば動くため、Getting Startプロジェクトの実装については省略します。
なお、Tasklet化のプロジェクト構成は下図とします。

![プロジェクト構成.png](https://qiita-image-store.s3.amazonaws.com/0/177076/bc079426-84eb-14d0-510a-98702c337421.png)


## PersonTaskletの実装
Getting StartのPersonItemProcessor#processと同じ処理をTasklet#executeに実装します。
TaskletばChunkと異なり、データ読み書きのタイミングを開発者が自由に決定できます。
今回は、BatchConfigurationのWriterとReaderをDIして直接利用する方針としています。
実装例は以下となります。

```java:PersonTasklet.java
public class PersonTasklet implements Tasklet {

    private static final Logger log = LoggerFactory.getLogger(PersonTasklet.class);

    @Autowired
    ItemStreamReader<Person> reader;

    @Autowired
    ItemWriter<Person> writer;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

        Person person = null;

        ArrayList<Person> personList = new ArrayList<Person>();

        try {
            reader.open(chunkContext.getStepContext().getStepExecution().getExecutionContext());

            while ((person = reader.read()) != null) {
                String firstName = person.getFirstName().toUpperCase();
                String lastName = person.getLastName().toUpperCase();
                Person transformedPerson = new Person(firstName, lastName);
                personList.add(person);
                log.info("Converting (" + person + ") into (" + transformedPerson + ")");
            }

            writer.write(personList);

        } finally {
            reader.close();
        }
        return RepeatStatus.FINISHED;
    }
}
```
Chunkではコミットインターバルの設定することで、自動で設定した処理件数ごとにコミットを実行してくれますが、Taskletは開発者がコミット処理を実装しない限り、全でデータ一括のコミットとなります。今回の実装例では、一括コミットとなっています。Taskletで中間コミットを実現したい場合は、処理件数をカウントして一定の件数でコミットを実行する処理を追加してやることで実現できます。

## BatchConfigurationの修正
作成したPersonTaskletのBean定義の実装及び、BatchConfiguration#step1のstep定義をchunkからtaskletに変更します。
実装・変更内容は以下のとおりです。

```java:BatchConfiguration.java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
　　　
    //省略

    //PersonTaskletのBean定義を追加
    @Bean
    public PersonTasklet tasklet() {
        return new PersonTasklet();

    }

    //省略

    //step定義のtasklet化
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }
}
```
あとは、実行することでGetting Startと同じ結果になればOKです。
Bash on windows(Creators Update)でrootでログインして壊れたsudoから復旧する

# sudorsをぶっ壊した時に復旧する方法(Creators Update版）

### Bash on 初期状態だとsudoでパスワード聞かれるのが嫌で
- 適当な知識で、ググったら下記書いてあって、そのまま打ち込んだ

```
$ sudo bash -c "echo \"[デフォルトユーザ名] ALL=(root) NOPASSWD: ALL\" >> /etc/sudoers.d/nonpass_sudo"
$ sudo chmod 0440 /etc/sudoers.d/nonpass_sudo
$ sudo visudo -c
```
- 最後の sudo visudo -c にてエラーが出なければOK。壊れたらインストールからやり直しって書いてあったのに実施してしまった。これ超危険。
最初からvisudo でチェックしないと！！！

### 案の定ぶっ壊れました。
```
$ sudo su -
sudo: >>> /etc/sudoers.d/dev: syntax error near line 1 <<<
sudo: parse error in /etc/sudoers.d/dev near line 1
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
```
### 壊れたら、アンインストールと書いてあったので、やり直した。
```
c:\lxrun /uninstall /full
Windows Subsystem for Linux でインストール、アンインストール操作が保留中です。
```

### うーん。次の手 sudo できないなら、 rootになろう
```
c:\>lxrun /setdefaultuser root
UNIX ユーザーが見つかりました: root
既定の UNIX ユーザーが次に設定されました: root
```
うまくいきそう！と思ったのに、　bash してもユーザが変わらない・・・
Creators Updateで入れた Ubuntuは上がうまくいかないようですとMSDNに情報がありましたよ
```C:\> ubuntu config --default-user root
```
これで bash を起動するとrootでログインできるので、晴れて最初の壊れてるsudorsを編集できるようになりました。
もう二度と直接sudorを編集しない！
Armbian/Orange Pi向けのUSB WiFiの利用実績メモ

# この記事について
Orange PiはWiFi搭載モデルも出ていますが、基本的には技適を通っていないので国内での理由はNGです。という事で、安めのUSB WiFiについて動作確認してみました。まぁ、Orange Piに限らずLinux全般における対応状況ですが、Armbianのkernelが3.4.113ベースという事でmainlineよりは対応状況は厳しいのかもしれません。またOrange Piで通れば、ほぼほぼRaspberry Piでも同じ手順でいけると思います。

PC上のUbuntu 16.04.3でも動作状況を確認したので、Orange Piユーザ以外の参考にもなるかも。

# ドライバの対応状況
現在3つのデバイスについて記述。今後確認するような事があればここに追記します。出荷時期によって違うチップを使ってる事もあるので、あくまでも参考に。

## TP-Link TL-WN725N
購入時の価格で695円。

PC上の4.4.0-98-genericでは特別な作業なしにデバイスをwlx&lt;mac address&gt;というデバイス名で認識。

```shell-session:lsusb
ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
```

Armbian/Orange Piの標準状態では動作しませんが、GitHubにある[こちら](https://github.com/lwfinger/rtl8188eu)のドライバで認識しました。

```shell-session:README.mdに書かれている通り
% git clone https://github.com/lwfinger/rtl8188eu.git
% cd rtl8188eu
% make all
% sudo make install
```
```modprobe 8188eu``` または再起動すると認識されるはず。wlx&lt;mac address&gt;というデバイス名で認識される環境とwlanNという普通の名前で認識される環境がありました。

## エレコム WDC-150SU2MBK
購入時の価格で663円。

PC上の4.4.0-98-genericでは特別な作業なしにデバイスをwlx&lt;mac address&gt;というデバイス名で認識。

```shell-session:lsusb
ID 056e:4008 Elecom Co., Ltd
```

TL-WN725N同様に上記のドライバをインストールする事で認識しました。

## Keepjoy USB2.0 WIFI
2017/11/22時点で215円。宇宙やばい。

PC上の4.4.0-98-genericではmt7601u.koがハンドルするもエラーで最終的には認識せず。このドライバは4.2でマージされた[kuba-moo](https://github.com/kuba-moo/mt7601u)版かな？

Armbian上でいくつかのドライバを試したが、成功例は今のところなし。ifconfig -aでra0として見えるくらいには動くケースもあったけど、ドライバの初期化中にエラーがあって最終的に動かないのはどれも同じ。

歴史的な経緯を調べると、オフィシャルのドライバのクオリティが低くてmainlineに取り込まれなかったのをコミュニティでスクラッチから書き直してmainlineに入れたのがkuba-moo版。ただし3.19より前のkernel向けにbackportするのは構造体とかも結構変わってて、詳しい人じゃないと簡単ではなさそうでした。portも手間だし、compileしたところで動かない可能性のほうが高いので、あまり深追いしませんでした。

```shell-session:lsusb
ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
```

# 無線LANへの接続
この辺りはLinuxの一般知識ではありますが、ここに書かれているような情報を探している時に一緒に知りたい情報かとは思うので、おまけ的に記載しておきます。

## nmtui-connectを使う方法
コンソールからの設定で一番らくちんな方法かと思います。nmtui-connectで起動すればCUIで見えているアクセスポイント一覧が表示されるので、選んでパスワード入力するなりすれば設定完了。

## ステルス設定のネットワークに繋ぐ場合
[CentOS7でステルスSSIDへ接続する方法](https://qiita.com/n7aka/items/64e8fdd11e3f7ceaa49c)がそのまま利用できました。一度この方法で接続してしまえば、設定が作成され、nmtui-connectからも見えるようになります。
数学証明メモ（領域と弧状連結と折れ線連結）

+ 大昔の学生の時学んだ数学を再勉強していて、Qiitaの数学記法がノートの代わりとして使えそうなので書いてみます。


# 問題

$\Omega \in \mathbb{R}^n$ 開集合。
$\Omega$に関する次の命題は同値である。

1. $\Omega$は領域
2. $\Omega$は弧状連結
3. $\Omega$は折れ線連結

だだし、 $\Omega$が折れ線連結とは$\Omega$の任意の2点$x,y$に対して、$x,y$を結ぶ$\Omega$内の折れ線が存在することである。


# 証明

+ 方針：3→2→1→3を証明する

### 3→2

折れ線は連続であるから、弧状連結の定義より$\Omega$は弧状連結。

### 2→1

[別途証明](https://qiita.com/yshutaro/items/ac5e747e6dcc118c5235)

### 1→3

$x_0 \in \Omega$ fix

```math
g(x) = \left\{
\begin{array}{ll}
1 & (xがx_0と\Omega内の折れ線で結べる) \\
0 & (xがx_0と\Omega内の折れ線で結べない)
\end{array}
\right.
```

**$g(x) = 1$の時**

$\Omega$は領域だから
$\exists r > 0 \  s.t \ B_r(x) \subset \Omega$ ($B_r(x)$は$x$を中心とした半径$r$の開球)
$\forall y \in \ B_r(x)$
$[x, y] \subset \ B_r(x)$
$x_0$と$x$を結ぶ折れ線を$\Gamma$とすると$[x, y] \cup \Gamma$は$x_0$と$y$を結ぶ折れ線
$∴ g(y) = g(x) = 1 (\forall y \in B_r(x))$
$g$は$x$で局所定数関数

**$g(x) = 0$の時**

$g(x) = 1$の時と同様
$\exists r > 0 \  s.t \ B_r(x) \subset \Omega$ ($B_r(x)$は$x$を中心とした半径$r$の開球)
ここでもし、$\exists y \in B_r(x) \ s.t \ g(y) = 1$なら$x_0$と$y$が折れ線で結べ、$x$と$y$は線分で結べるから$g(x) = 1$となってしまう。
すなわち$g(y) = 0 \ (\forall y \ \in B_r(x))$
よって$g:\Omega \to \mathbb{R}$は局所定数関数

$\Omega$は領域だから連結より局所定数関数$g$は定数関数。
$g(x_0) = 1$であるから
$\forall y \in \Omega \ \  g(y) = 1$　($g(y) = 0$となる点は存在しない)


よって$\Omega$は折れ線連結
WebVRとは

[WebVR技術でWebサイトを三次元で表現してみる！](https://qiita.com/haruan2394/items/a2d54101377b96ba08f2)も読んでみてください。

#WebVRとは
Webブラウザ上でVRを使える技術のこと。
>
WebVR とは、ウェブブラウザ上で VR 体験を提供することです。狭義には、ウェブブラウザ上で 3D グラフィクスを表現する技術である WebGL をつかって、VR 体験を提供する技術を指します。
残念なことに、WebGL を直接利用して 3D グラフィクスを作るには、シェーダーやポリゴンといった 3D グラフィクスに特有の技法を学ぶ必要があります。そのため、WebGL を直接扱うのではなく ThreeJS をはじめとする WebGL の記述を楽にしてくれる Javascript ライブラリを用いて作られることが多いです。
[WebVR はじめよう](https://qiita.com/tushuhei/items/2509e7e23172ec402110)から引用

## WebVRのメリット
ブラウザでＶＲコンテンツを見ることができるので、インストールが不要。
見たいときにすぐ見れる。

## WebVRのデメリット
Unityで作ったような高度なコンテンツはまだできない。
動作が重い。

#WebVRを体験
[サンプル　http://cardboardclub.jp/study/160511/](http://cardboardclub.jp/study/160511/)
<img width="956" alt="スクリーンショット 2017-11-12 23.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/188304/319ceff8-5dd6-dbfb-ce45-3da216408fdc.png">
こんな感じです。スマホをハコスコなどにいれれば,VRっぽくなります。

#WebVRを使うには
今現在、簡単にできる方法は２つあります。

- Three.jsを使う
- A-Frameを使う

## Three.jsを使う
 JSで3Dオブジェクトをかけるライブラリ。
カスタマイズさせることでWebVRにすることが可能。
[公式サイトはこちら](https://threejs.org/)
## A-Frameを使う
Mozillaが作ったWebVR構築ライブラリ。なんと**HTMLでWebVRを作れる**。これはすごい。
[公式サイトはこちら](https://aframe.io/)

# WebVR技術でWebサイトを三次元にしてみたい（本題）
 Three.jsとA-Frameどちらがそれに向いているといえばA-Frameです。
Three.jsはあくまでも、ブラウザで3Dオブジェクトを作ったりするためのものであり、WebVRに特化してません。
それに比べて、A-FrameはWebVRのためのものなのでThree.jsよりやりやすいです。
しかし、A-Frameは少し重いです。

# A-Frameの入門
**WebVRを開発するときはfirefoxを使いましょう。firefoxはWebVR仕様ですが、他のブラウザは違います。ただし、基本的なことはchromeでもできます。**
##A-Frameの導入
``` html:index.html
<!doctype html>
<html>
  <head>
    <title>My first VR site</title>
    <script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
  </head>
  <body>
  </body>
</html>
```
```html
<script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
```
まず、HTMLファイルにJSを読み込んでください。
##3Dオブジェクトを置く
```
<body></body>
```
の中にコードを書きましょう。

``` html:index.html
<!doctype html>
<html>
  <head>
    <title>My first VR site</title>
    <script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
  </head>
  <body>
  <a-scene>
  </a-scene>
  </body>
</html>
```

a-sceneを追加しました。scene（シーン）とは、三次元の空間のことです。
この中にものを入れてきます。

``` html:index.html
<!doctype html>
<html>
  <head>
    <title>My first VR site</title>
    <script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
  </head>
  <body>
  <a-scene>
　   　<a-box color="red" depth="3" height="3" width="3" position="0 -1 -6"></a-box>
    <a-sky color="#87ceeb"></a-sky>
  </a-scene>
  </body>
</html>
```
A-FrameではHTML要素に属性をを指定することで３Dオブジェクトを作れます。
a-skyは空間の色などを決めます。colorで色を決めてます。一番最後に書きましょう。
a-cubeは立方体のオブジェクトを追加する要素です。colorでその箱の色、depth、height、widthでその箱の大きさを決めてます。positionは位置を決めてます。X軸、Y軸、Z軸の順番で指定します。デフォルトは0
です。
プレビュー
<img width="588" alt="スクリーンショット 2017-11-18 20.32.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/188304/2e3190cb-234c-bc97-3b1b-5770d703f114.png">

次は
[WebVR A-Frameで注視点カーソルを作る](https://qiita.com/haruan2394/items/80f840a83dd1a0a5240d#_reference-8d5be3e6d778d9fdfff5)
または
[WebVR技術でWebサイトを三次元で表現してみる！](https://qiita.com/haruan2394/items/a2d54101377b96ba08f2)
に進みましょう。
#まとめ
これから、WebVR技術でWebサイトを三次元化するために、A-Frameでもっと色々作っていきたいと思います。
A-Frameでは簡単に注視点カーソルが使えたり面白いので頑張ってみます。
数学証明メモ（連結と弧状連結）

+ 大昔の学生の時学んだ数学を再勉強していて、Qiitaの数学記法がノートの代わりとして使えそうなので書いてみます。


# 問題

位相空間$X$が弧状連結ならXは連結。

# 証明
$X$は弧状連結であるから
$x_0 \in X$ fix
$\forall x \in X$
曲線　$\psi:[\alpha, \beta] \to X$が存在して、$\psi(\alpha)=x_0 \ , \
 \psi(\beta)=x$
$C_x := \psi([\alpha, \beta])$
は連結で$x_0$と$x$を含む。
そこで
$X$の連結部分集合族$\\{C_x\\}\_{x \in X}$を見ると、定義から $\cup_{x \in X}C_x = X$ 
$x, y \in X$について、$x_0 \in C_x \cap C_y$
よって$C_x \cap C_y \neq \phi$
すなわち$X = \cup_{x \in X}C_x$は連結　(※）


## 補足（※）

$ (Y_\lambda)\_{\lambda \in \Lambda} $
を位相空間 $X$ の連結部分集合族で、 $Y_\lambda \cap Y_\mu \neq \phi$ $(\lambda, \mu \in \Lambda)$ が成立しているなら
$Y = \cup_{\lambda \in \Lambda}Y_\lambda$ は連結部分集合
新Python生活三日目(振返り)【PyQ/6章】※不明点あり

心機一転して再開したアンパン生活･･･ならぬ、Python生活も復習三日目。
後で振り返られるように、初のMarkdownに戸惑いながら、
今日も技術ブログ残していきます。

###リストの要素確認
```py3
if B in S1: #S1って名前のリストの中にBがあれば～
    print('S1リストの中にBはありまーす') #表示するよ
```

###キーもしくは値があるかの確認
```py3
fruits = {'りんご':'red'
         ,'みかん':'orange'
         ,'バナナ':'yellow'} #fruitsって名前の辞書に、キーと値が設定されて3つが登録されてるよ

if 'りんご' in fruits.kyes(): #fruits辞書のキーの中に'りんご'はあったかな？
    print('りんごあるよー') #あった時は表示する

if 'yellow' in fruits.values(): #fruits辞書の値の中に'yellow'はいたっけ？
    print('yellowいました') #いたら表示する
```

###辞書の各数値を計算する
```py3
T1 = {'a': 10, 'b': 20, 'c': 30} #T1って名前の辞書に、キーと値が設定されて3つが登録されてるよ

T1['a'] = T1['a'] + 10 #キーaは10だったけど、10+10=20が代入されたよ
T1['b'] = T1['b'] - 5 #キーbは20だったけど、20-5=15が代入されたよ
```
**<font color="Red">★分からんポイント
↑ここまではなんとか理解。でも続きの以下の回答がよく分からず。</font>**

```py3
for k, v in count.items():
    print(k + ':' + str(v))
```
```text:出力結果
a:20
b:15
c:30
```
キーと値をコロンで区切って並べて表示させたいんだろーけど、
なんでいきなり**k**とか**v**が出てくるのか、PyQ内に説明も本家Pythonへのリンクもない。。

うーん。
一度で全部理解しようとせずに一旦先に進もう。

###計算の省略
↑でさっき書いた計算式を省略して記述出来るそうです。
私はこの記載の仕方が逆に分かりづらくて苦手です。。

```py3
T1['a'] = T1['a'] + 10
↓
T1['a'] += 10


T1['b'] = T1['b'] - 5
↓
T1['b'] -= 5
```
###集計
リスト内に各値が何個ずつあるのかを集計

```py3
S1 = ['A', 'B', 'C', 'A', 'A', 'B', 'A', 'B', 'A', 'C'] #S1って名前のリストの中身を集計する
count = {'A': 0, 'B': 0, 'C': 0} #countって名前の辞書を、キーはA,B,C、値は0で作成する
```
**<font color="Red">★分からんポイント
↓が私にはちょっと理解しにくい。</font>**

```py3
for val in S1: #S1リストの要素の1つ1つを変数valに代入していく？？
    count[val] += 1 #count辞書のキーに1ずつ足していく？？

for k, v in count.items(): #また分かんないの来た！！！
    print(k + ':' + str(v))
```
```text:出力結果
A:5
B:3
C:2
```

↑ではcount辞書に「キーをA,B,C、値を0」で先に指定してから作成していた。
キー等を指定しないで空っぽの辞書を作成するしとく事も出来るが、
それだともう少し行を追加しとく必要があるみたい。

```py3
S1 = ['A', 'B', 'C', 'A', 'A', 'X', 'B', 'A', 'B', 'A', 'C', 'Y'] #S1って名前のリストの中身を集計する
count = {} #今回はcountって名前の辞書を中身空っぽで作成する

for val in S1:
    if val in count.keys(): #if文でcount辞書のキーを1つずつ変数valに代入していく？？
        count[val] += 1 #count辞書のキーに1ずつ足していく？？
    else:
        count[val] = 1

# 表示
for k, v in count.items():
    print(k + ':' + str(v))
```
```text:出力結果
A:5
B:3
C:2
X:1
Y:1
```

この辺りから理解度が低下してきて、
進捗が停滞→モチベーションダウンしてしまったんですよね。

一度で理解できなくても、何周かしていくうちに慣れてくる･･･と信じて毎日少しずつでも進めていきます。
分布について考える-乱数と分布1

### **一様乱数**
一様乱数はプログラムを書くものにとって
最も馴染み深い乱数だと思う

単純化すればコインの裏表や
サイコロの出た目の分布だ

例えばサイコロを振って
出た目を棒グラフに記録していく
最初のうちはデコボコだが操作を繰り返せば
全体の割合は「一様」となっていく
![qiita01_01-1.png](https://qiita-image-store.s3.amazonaws.com/0/172785/d5f492e9-0cac-ded7-9a51-ddcfeef3e6e3.png)
![qiita01_01-2.png](https://qiita-image-store.s3.amazonaws.com/0/172785/54210fa8-a52b-38fb-329c-cf7f8a553bb9.png)

組み合わせを使うことによって
もっと大きな「目」を作る事ができる
サイコロでもいいがここではオセロの石を使おう
オセロの石に番号を書いておいて振る
（番号を書くのは振った後に見分けがつくようにだ）
3枚に番号を書いて振れば
2^3 = 2*2*2 = 8通りの「目」を表現できる
オセロの石の数をn個とすると
2^n通りの「目」を表現する事ができる
![qiita01_01-3.png](https://qiita-image-store.s3.amazonaws.com/0/172785/2aee7dca-fae7-4f2a-adb6-5542de48d654.png)

コンピュータは2進数で数を表現する
つまりこれらの「目」は「値」と呼ぶこともできる

それでは2^nではない
例えば3つの「値」を使いたい場合は
どうすればいいだろうか?

3より多い種類の値を作り
値を3種類にまとめればいい
完全な3等分は無理だが2^nのnが大きければ
近い数を取ることはできる
例えば8枚のオセロ石を使って
256種類の値を
85・85・86種類の値ごとにそれぞれまとめれば
3つの値に近い形にする事ができる
[1種類捨てて85・85・85でいいのでは?：r-de-r氏のコメント参照]
![qiita01_01-4.png](https://qiita-image-store.s3.amazonaws.com/0/172785/d4496e93-324e-6536-94ca-c402b45f039a.png)

Rではrunif()というという関数を使って
これらの「一様」な分布を持った
0〜0.9999999までの乱数を生成できるようだ
()の中には生成したい乱数の数を入れる

```r
x <- runif(100000) #乱数100000個をベクトル（1次元配列）としてxに代入
```

runif()の頭のrは random の r
unifは「一様分布／Uniform distribution」の略だ
つまりこれらの乱数の分布は「一様分布」となる

生成した乱数は hist() で分布を表示でき
histのbreaks の値で分割する数を決定する事ができる
[sample()を使ったやり方：r-de-r氏のコメント参照]

```r
hist(x,breaks=20) #xの分布を20個に分割して表示
```
<img width="256" alt="qiita01_01-5.png" src="https://qiita-image-store.s3.amazonaws.com/0/172785/2da1e10b-5ca7-19b7-bfb2-2e98afbe8fb2.png">


細かい話をすればrunif()の場合
~~乱数の値は小数点以下7桁までなので
出てくる値は単精度浮動小数点数のようだ~~
倍精度浮動小数点数のようだ
[単に表示が7桁なだけで内部ではbinary64：r-de-r氏のコメント参照]

~~単~~ 倍精度浮動小数点数の仮数部は大抵
~~23ビット~~52ビット（+1ビットの固定値?）らしいので
~~23枚~~52枚のオセロ石を使っていることに等しい

なお64枚のオセロ石を使えば
小数点以下19桁くらいまでの値を表現できる
プログラミング 8 か月目

プログラミングを始めて 8 か月が経とうとしています。

　特に新しいことを学んだという感じはなく、1 周回って戻ってきた感じです。これから 2 周目に入り、学んだ言語をより深いところまで理解していこうということで復習を始めました。今回も前回と同様に書きたいと思います。

#:pencil2: 進捗状況

**Progate**

SQL Ⅱ:　Paiza のおかげか割と出来たような気がします
Sass Ⅰ: 新登場。ドットインストールのおかげで問題なくできました



#:pencil2: 新着事項
　8 か月目で新たに取り入れたことや、プログラミングで意識したことを書いていこうと思います。

###:page_facing_up: Boostnoteを使ってみた
 
　「Qiita に投稿するほどでもないけど、Qiita のようなプログラミング向けのメモアプリが欲しい」ということで探して検討した結果**「Boostnote」**を使うことにしました。

　 Markdown 記法で打ち込むので Qiita と同様な感覚で出来るのはもちろんのことですが、そのほかに**印刷ができる機能**（※1）が欲しかったいうことでこのメモアプリを選択しました。
 
　備忘録としてメモしたり、スニペット集としてコードを張り付けたり。かなり便利で重宝しています！

 ※1 あまり PC に触れる時間がないのと、印刷したものに気づいたこと等を手書きでメモできるようにしておきたいというのがあります。あとは、手書きの方が頭に残るようなので。


# :star: 最後に
　
　Boostnote で備忘録やスニペット集がある程度溜まってきて、Qiita に投稿できそうなときは投稿しようと思っています。あまり複雑で冗長なものは避け、ミニプログラムや気を付けようと思ったこと等の簡易的で分かりやすいものを中心に投稿しようと思います。

　まだ分からないことがたくさんありますが、一日でも早く上達できるように頑張りたいと思います。
文末に改行して文字列追加する正規表現というか．

特定の文字列を行末に，できれば改行して追加したい，更にできれば文末の空改行は全部なかったことにしたいって要望があって，最初普通に「\n文字列\n」みたいなの追加してたらまあ当然なんですが，更新する度にどんどん「文字列」の前に改行増えてっちゃってみっともなかったので，どうにかならんかと．
とりあえず３行もかけてこれで希望の動作にはなった．

```javascript:
	str.value = str.value.replace(/文字列|\n文字列/,"");
	str.value = str.value.replace(/\n+$/,"");
	str.value = str.value.replace(/$/, "\n文字列\n");
Excelで作られたCSVファイルの改行コード「CR」を処理する前に「LF」に置換してしまう。

Wordpressのプラグインを改造しないといけない状況になり、~~Windows~~旧Macの特有の仕様に悩まされました。 
既存のプラグインに影響を与えないような改善となると、題名のような処理が要求される事になったのでその事について触れます。

## 注意
プラグイン本来の使い方をしないので、環境やバージョンによってはプラグイン自体の動作に影響があるかもしれません。 
もし、影響があっても責任を取れませんので、自己責任で行ってください。 
また、今回は運用でカバーできないという判断があって既存のプラグインを改造しています。 
既存のプラグインを変更する事は、動作の保証ができなくなるという事です。 
安易に改造せず、運用でカバーする事も視野に入れてください。

## 状況
Wordpressのユーザー情報のインポートに「[import-users-from-csv](https://ja.wordpress.org/plugins/import-users-from-csv/)」というプラグインを使用していました。 
実際に運用する人は、インポートするCSVを作る時、~~Windows~~(恐らく)旧MacでExcelを使用しています。 
（設定次第かもしれませんが）そのためか、改行コードがCR(\r)になってしまいます。 
実際に動くサーバーがlinuxな事、このプラグインがCRの改行に対応していない事もありプラグインで改行できない現象が起きました。

## 実践
本来のプラグインについては、[import-users-from-csv](https://ja.wordpress.org/plugins/import-users-from-csv/)」をみてください。 
また、実際の変更箇所にについてはgithubにソースを載せています。 

### github
https://github.com/websandbag/issue_update_Import_Users_from_csv

## 改修方針
- fopenして、fgetcで解析をするまでの間に、改行コードをLF（\n）に書き換える。
- 既存の処理を出来る限り書き換えない。

この対応をするにあたり、2つの方法を試みました。
結局、後者の方で対応したのですが、このやり方は後々使えそうなので、備忘録としてどちらも記載します。

### 方法1　テンポラリファイルを作ってそこにCSVの内容を流し込む。
POSTされたfileデータのテンポラリを書き換えられるのか疑問に思った時に思いついた方法です。
下記のように、テンポラリを作ってfwriteで、置換したファイルを書き出しそれを処理のファイルに渡すという方法です。
理論上は、同じ型で中身は改行コード以外同じなので、期待した結果が得られると思いましたが、ファイルを解析した結果NULLで帰ってきました。

```
public function changeEndOfLineFromRToN($filename)
{
    $temp = tmpfile();
    $strings = file_get_contents($filename);
    fwrite($temp, preg_replace("/\r\n|\r|\n/", "\n", $strings));
    return $temp;
}
```

#### 解決できなかった気になる点

- 同じresource型のファイルですが、fopenで開いたresourceは「ストリームリソース」と呼ばれる状態のようです。
    これは引き続き調査しています。

    ```
    resource(8) of type (stream)
    ```

- 仮に、fopenしたとしてfcloseはどうするのか？   
    参照渡しをすれば解決出来るかもしれませんが、上記が解決できなかったので保留にしています。

### 方法2　POSTのテンポラリファイルを直に書き換える。
POSTされたテンポラリファイルを直接書き換えてしまいます。　
有効期限の心配もありましたが、書き換えは下記の処理で実現できました。 
テンポラリを直接書き換えているので、ライブラリの処理でもれなくリソースの解放をします。   

```
public function changeEndOfLineFromCRToLF($filename)
{
    $current = file_get_contents($filename);
    $current = preg_replace("/\r\n|\r|\n/", "\n", $current);
    file_put_contents($filename, $current);
    return $fileName;
}

```

## 置換をする時に注意する事
preg_replaceで改行コードを置換するのですが、改行コードを扱う場合は、ダブルコーテーション（"）で要素を囲む必要があります。
シングルコーテーションで囲んだ場合、「\n」という文字で出力されてしまうからです。

```
$current = preg_replace("/\r\n|\r|\n/", "\n", $current);
```
### 参考URL
https://qiita.com/dayone80/items/00ab49e2d02be6a3bc87
Pythonで言語処理100本ノック2015 問題02

自然言語処理100本ノック挑戦中です。
早速３問目いきましょう！

>問題02：「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

#解答

```:Python3
s1 = 'パトカー'
s2 = 'タクシー'
ans = ''

for i,j in zip(s1,s2):
    ans +=  i + j

print(ans)
```

```:実行結果
パタトクカシーー
```

#参考
すぐに上記の実装に至ったのですが他のやり方など調べているとなんと100本ノックで自分の１００倍しっかりした記事を書いている方がいました。笑
https://qiita.com/segavvy/items/725b20f21951975a06fd

以上です！