OmniAICreator/Qiita-1.07M huggingface dataset:
setup.pyからPipenvに移行するときの便利/迷いポイント

# はじめに

pypiに登録しない場合でもsetup.pyでパッケージ管理をするのはそれなりにポピュラーなやり方だと思いますが
そこからPipenvに移行して便利な点と少し迷った点について書きました。
以下で挙げている迷いポイントは全て考慮されていていわゆるバッドノウハウ的なものは必要ありません。

# 便利ポイント
- constraints.txtを管理しなくてよい
- `dependencies`的なものと`devDependencies`的なものの扱いが分かれている
- Dockerfileに書くときの方法も用意されている

# 迷いポイント
- 環境がどこにできるのか迷う
- setup.pyと役割が被っているがsetup.pyを無くせるのか迷う

## constraints.txtを管理しなくて良い

そもそもsetup.pyには以下のような決まりがありました。

http://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#pipfile-vs-setup-py
> ライブラリは、 setup.py の install_requires で 抽象的な依存関係 を定義します。 厳密にどのバージョンをインストールし、どこから依存パッケージを取得するかの判断は、あなたが決めることではありません!

とするとsetup.pyだけだと「実際に実行できるか」を担保できないという問題があって
constraints.txtは開発時にバージョンだけを参照するためのものとして使用されていました。

```
$ pip install -e . -c constraints.txt
```
つまりこのコマンドは

- 何をインストールするかは`./setup.py`に聞く
- どのバージョンをインストールするかは`./constraints.txt`に聞く

という意味で使われていました。

中身はただの`pip freeze`なので何かライブラリを入れたときに出力しなおす必要があって大分煩わしい感じがあったんですがPipenvなら
`$ pipenv install pyyaml`
で新しいパッケージを入れたときにPipenv.lockで自動でやってくれます。

## `dependencies`的なものと`devDependencies`的なものの扱いが分かれている
個人的にはsetup.pyの`extras_require`でテスト用の依存関係はこっちに入れるみたいな運用をしていましたが、
`$ pipenv install pyyaml`
`$ pipenv install --dev pyyaml`
のようにすると`package.json`の`dependencies`と`devDependencies`みたいな感じで分けることができるようになっています。
テスト用のツールやlinter(`tox`, `flake8`, `mypy`とか)は`--dev`で入れるとよいと思います。

## Dockerfileに書く時に良い方法も用意されている
単純なPythonアプリの場合はこんな感じになると思います。

```dockerfile
FROM python:3.7
WORKDIR /app
COPY app .
RUN pip install pipenv
RUN pipenv install --system --deploy
```
`--system`: 仮想環境を作らずにローカルにインストールする。
`--deploy`: `Pipfile`と`Pipfile.lock`に齟齬があった時に自動で更新してくれる便利機能があるが、本番用にビルドする時には余計なので齟齬があったらコケてくれる。
これでいい感じにインストールしてくれると思います。

# 迷いポイント
## 環境がどこにできるのか迷う
実際のところPipenvというツール的にはどこにできてもあまり関係ないように作られているのですが
個人的にはVSCodeで補完用のインタプリタを指定するときにどこにあるかわからないと困ったりします。
そういうときは環境変数を
`$ export PIPENV_VENV_IN_PROJECT=true`
とセットすると今いる場所に`.venv`ディレクトリの中に作ってくれます。
また、環境は作ったり消したりしたくなると思いますが、消すときは
`$ pipenv --rm` で消せます。

## setup.pyと役割が被っているがsetup.pyを無くせるのか迷う

http://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#pipfile-vs-setup-py

ここに色々書いてありますが...。
要するにpipenvは依存しているライブラリとそのバージョンを管理するものであって

- pypiに登録するためのメタデータ(バージョン情報とか)が含まれた生成物を作る機能
- 他のリポジトリからライブラリとして呼び出されるための機能
- entory_pointsなどを定義する機能

みたいなライブラリとしてのメタ情報を定義する機能は持ちません。
なのでこれらの機能を使わないのであればPipenvだけで良いですし、使うのであればsetup.pyも必要になります。
またPipenvはsetup.pyを使う場合も便利で
`$ pipenv install -e .` のようにするとsetup.pyの中に書いている依存関係も`Pipenv`,  `Pipenv.lock`によって管理してくれるので
開発環境を新たに作るときには
`$ pipenv install --dev`
で再現性のある実行環境を作ることができます。

# まとめ
`setup.py`を開発環境の定義にまで使うのはそれをテストで使用するtoxと併せて良いアイデアだなとは思いつつも
本来は外部からの見え方を定義するものであるはずなので若干の違和感はありました。
Pipenvは完全に開発環境と実行環境のツールとしての位置付けで、とても品質の高いものだと思います。
Warning: "config" scripts exist outside your system or Homebrew directories.

#brew doctorでのエラー
こんなエラーが出ました

```bash
$ brew doctor
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
```

#エラーの内容
パッケージ管理ツールのconfigが衝突しているっぽい。
自分の場合はpyenvを入れたのでそれとぶつかってバグるかもよ
みたいな内容だと思います。

#対応方法

##shellを確認

```shell
echo $SHELL
```

###bashだったら
~/.bashrcを開きます。

###zshだったら
.zshrcを開きます。

##追記します
ユーザー名、phpenvなど適宜調整していただきまして以下を追記します。
alias brew="env PATH=${PATH/\/Users\/example\/\.pyenv\/shims:/} brew"

これでbrewを実行する時だけpyenvのパスを外すという設定になったとの事。

#ターミナル再起動
これで自分の環境ではエラーが消えました。

```shell
$ brew doctor
Your system is ready to brew.
```


#参考にさせていただきました
ありがとうございました！
大変お世話になりました。
https://qiita.com/takc923/items/45386905f70fde9af0e7
https://qiita.com/isoppp/items/965ecb8e933a9557d7bf
http://www.task-notes.com/entry/20141223/1419324649
[BitcoinCashアドレス監視bot] BCHクジラ監視くんについて

#「BCHクジラ監視くん」とは
BCHクジラ監視くん(https://twitter.com/BCHwhalewatch) とは、
BitcoinCash(BCH)の保有数がTOP100のアドレスを監視して、監視対象に送金・入金があればツイートでお知らせするbotです。

#主な機能
監視中のアドレスに1度に1000 BCH以上の送金・入金があればツイートします (送金・入金アラート)。
監視対象となる保有数TOP100アドレスのリストは「Bitcoin Cash Rich List」(https://bitinfocharts.com/top-100-richest-bitcoin%20cash-addresses.html) から毎日1回データを取得して更新しています。
監視アドレスの残高・トランザクション件数情報はCSVに記録し、定期的に残高が一番増えたアドレスと一番減ったアドレスの情報をツイートします (定時レポート)。
また1日の終わり(23:45 頃)に以下の情報をツイートします(監視結果レポート)。
・TOP100アドレスの総残高と増減枚数(前日比)
・前日より最も残高が増えたアドレスと減ったアドレスとその増減枚数
・TOP100アドレスのその日のトランザクション(TX)件数と最もTX件数が多かったアドレスとその件数

#その他の機能
CoinMarketCap(https://coinmarketcap.com/) よりBitcoinCashのランキング、価格(＄とBTC建て)、24時間の出来高、循環供給量、ドミナンス、トータルハッシュレートのデータを取得して毎日1回ツイートします (通貨データ)。

※今後、機能は追加or修正する可能性あり

#通知スケジュール
・送金・入金アラート　→　1000 BCH以上の移動が確認された時
・定時レポート　→　8:00/16:00/23:30
・監視結果レポート　→　23:45
・通貨データ　→　7:00
※大体です

#使用したAPIなど
ソースコードを公開しようか迷いましたがひとまず非公開にします。
そのため私が使ったAPIやモジュールなどをざっくり書きたいと思います。
同様のことをやりたい時に何か参考になればと思います。興味がない方、Pythonに詳しい方は読み飛ばしてください。

使用したAPI
・アドレスやトランザクション情報の取得 → BTC.com (https://bch.btc.com/api-doc)
・BitcoinCashの通貨データの取得 → CoinMarketCap (https://coinmarketcap.com/ja/api/)
・ツイッター → (https://apps.twitter.com/)

使用したおすすめのPythonモジュール
・schedule (https://schedule.readthedocs.io/en/stable/)
ジョブのスケジューリングが出来るモジュール。日時や曜日などの設定を決めておくと、その時間に関数が実行されます。scheduleモジュールとthreadingモジュールを組み合わせてマルチスレッドにすることで、メイン処理は別にやりつつ設定した時間にサブ処理が走るので便利です。私は同様の方法を使ってサブ処理内でフラグの書き換えを行い、メイン処理内に「フラグが立ったらツイートする」という処理をいくつか組み込んで各ツイートを行っています。

・cashaddress (https://github.com/oskyk/cashaddress)
BitcoinCashのレガシー⇔キュッシュアドレスに変換出来るモジュール。

・BeautifulSoup4 (https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
Webスクレイピングするためのモジュール。TOP100アドレスの取得は「Bitcoin Cash Rich List」からrequestsモジュールのget関数でHTMLデータを取得して、そこからこのモジュールを使ってアドレス名だけスクレイピングしています。

・tweepy (http://tweepy.readthedocs.io/en/v3.5.0/)
PythonでTwitter APIを操作するためのモジュール。
ツイッターのOAuth認証やつぶやきがサクッと出来ます。


その他使用したモジュール(説明は省略)
・csv
・datetime 
・time
・requests
・json
・traceback
・re
・threading
・emoji

#開発環境
・Python 3.6
・Windows 8.1

#実装環境
・Python 3.5.3
・Raspberry Pi 3 Model B(OS:raspbian)
Terraformを使ってAWS環境を構築するやり方(Workspace機能)

前回の続きになります。
環境ごとにリソース名の分岐するための機能です。

````sh:コマンド説明
Usage: terraform workspace

  Create, change and delete Terraform workspaces.

Subcommands:
    delete    Delete a workspace
    list      List Workspaces
    new       Create a new workspace
    select    Select a workspace
    show      Show the name of the current workspace
````

* 開発環境・本番環境の２つを作成します。

`$ sh bin/terraform_aws.sh workspace new dev`

````sh:コマンドログ
Created and switched to workspace "dev"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.`
````

`$ sh bin/terraform_aws.sh workspace new prod`

````sh:コマンドログ
Created and switched to workspace "prod"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.`
````

---

* 環境の切り替え方法について

`$ sh bin/terraform_aws.sh workspace select dev`

````sh:コマンドログ
Switched to workspace "dev".
`````


環境変数を使って、リソース名を切り替えます。

````
${terraform.workspace}
````

---

本家サイトドキュメント
https://www.terraform.io/docs/state/workspaces.html
ＶＴＬ＿ｏｎ＿ＦＰＧＡ[その１ VTLと「VTL_on_FPGA」について]

#始めに(ＶＴＬ再び)
　マイコンの黎明期にＶＴＬという言語(インタープリター)が存在した。
　メモリー容量１ＫＢ程度で動作する言語は当時の小メモリな環境にマッチし、それなりに繁栄した。
　時が経ちマイコンの成長によりメモリは潤沢となり、小メモリはアドバンテージとならずＶＴＬは忘れ去られていった。
　しかし再び、ＦＰＧＡという小メモリ環境が新たに生まれて来ている。
　勿論高価なＦＰＧＡは潤沢なメモリを有しているが、リーズナブルなＦＰＧＡは高々数１０ＫＢ程度である。
　これにＶＴＬを乗せることにより、安価にＦＰＧＡ＋ＣＰＵのシステム(おもちゃ)構築が可能と考える。
##FPGAについて
　これを読んでいる人には恐らく説明不要だろうが、取敢えず説明はしておく。
  FPGAとは、ソフトで回路を組める(変更できる)半導体チップである。
  開発の難易度としては、例えばarduinoでＣ言語(C++?)が判れば、理解は可能ではと考える。
  ハード環境としては、数千円程度の安いボードでも、初期のマイコン(8080,6800)程度は構築可能。
  ただ、利用できるハードがバラバラで、資料の一貫性が乏しく敷居が高いのが難点であろう。
  ※FPGAを解説した雑誌が有るが、個人的には下記の感想を持つ(それなりの理由は有ると思うが)。
　　　1.FPGAマガジン　事例がピンポイントでこちらのニーズに合わない、高度すぎてついていけない。
　　　2.トラ技　　　　付録ハードがプアで、追加投資とはんだ付けが必要で、すごく面倒くさい。
　初心者＋α程度を引き付る魅力が無いと、アマチュアは先細りとなりお先真っ暗では。
　安い市販ボード(中華製?)をターゲットにして、LED点滅の少し上程度を解説すべきではと考える。
##VTLについて
　VTLの黎明はインターネット以前であり、現存する資料は少ないが「VTL GAME」等で検索すると出てくる。
　[［VTL系言語の歴史］](https://www.mztn.org/rvtl/vtltabl.html)
　VTLの方向性は、言語解析の能力を犠牲にしても、小規模マンマシンI/Fを実現することにあると思う。
　言語の可読性や機能向上を目指すあまり肥大するのは、VTLの方向性にはそぐわないと考える。

#なぜやるのか
　1.なんとなく、CPUを作ってみたかった。
　2.なんとなく、コンパイラを作ってみたかった。
　3.比較的安いFPGA基盤が出回って来ており、安いFPGA基盤でも実現できそう。
　4.FPGA+CPUに画像入力+AIを追加し、画像認識をチープなハードで実現できたらいいな。

#ＶＴＬ＿ｏｎ＿ＦＰＧＡ
　「VTL_on_FPGA」の言語は上記のVTL(GAME-III)に連なる言語であり、開発環境でもある。
　なお、(手抜きにより)仕様の一部を省略しているので、ここではVTL(モドキ)と称している。

##１．今回の目標
　　1.FPGA上でVTLを稼働させる。
　　2.処理速度向上の為に、VTLはコンパイルして稼働させる。
　　3.パソコンを必要とせず、FPGA基盤単独での稼働を可能とする。
　　4.コンパイラをVTL_on_FPGA上でコンパイルできれば完成とする。
##２．構成
　「VTL_on_FPGA」開発環境は次のものより構成している。
　　1.GAME86 　パソコン上で動作する、Ｃ言語で書かれた「GAME-III」ベースのインタープリター
　　　　　　　　[［その２　ＧＡＭＥ８６インタープリター］](https://qiita.com/hi631/items/156f5454ffbc22b9c909)
　　2.TD4x4  　FPGA上で動作する、verilog言語で書かれた16ビットCPU(VTL実行環境)
　　　　　　　　[［その３　ＦＰＧＡ上のＶＴＬ実行環境］](https://qiita.com/hi631/items/d2c96be05d40fc41c1b7)
　　3.GM80  　「GAME80」ベースのVTL言語コンパイラー
　　　　　　　　[［その４　ＶＴＬ＿ｏｎ＿ＦＰＧＡコンパイラー](https://qiita.com/hi631/items/1c292db6fbc2e5b71855)
　　4.拡張IO 　TD4x4に追加した、テキスト/グラフィックディスプレーとPS2キーボード
　　　　　　　　[［その５　ＶＴＬ＿ｏｎ＿ＦＰＧＡの拡張ＩＯ］](https://qiita.com/hi631/items/2af8506e070a830349a7)
　　5.TD4_SIM　パソコン上のFPGAシミュレーター
　　　　　　　　[［その６　ＶＴＬ＿ｏｎ＿ＦＰＧＡのシミュレーション］](https://qiita.com/hi631/items/c19fe4a5f513d56b87ab)

  各プログラムソースはGitHubに上げています。
  [［VTL_on_FPGA］](https://github.com/hi631/VTL_on_FPGA)
  

##３．操作の流れ
　1.VTL言語のコンパイル
　　(1)パソコン上のGAME86インタープリター上で、GM80コンパイラーを動かす。
　　(2)GM80にVTLで書かれたソースプログラムを読み込ませる。
　　(3)VTL_on_FPGAのコンパイル結果(機械語)を出力する。
　2.VTL_on_FPGAの回路のコンパイル
　　1. GM80によるコンパイル結果(機械語)をTD4x4環境にコピー。
　　2.TD4x4をコンパイルしてFPGAのProgrammingFileを作成。
　3.実行
　　1.ProgrammingFileをFPGAに書き込む
　　2.シリアル通信を接続して、VTL_on_FPGAの起動を行う。
　　　※通信モード　115200bps　8.n.1
　　3.シリアル通信からVTLソースを入力し、コンパイル/実行を行う。
　　4.拡張IOを接続し、スタンドアローン(単独)で動かす。

##４．完成品の外観
　上段　VGAディスプレイ(640x480 8bitカラーで表示)
　中段　FPGAボード
　下段　キーボード
　FPGAボードは一切手を加える必要が有りません。
　<ボードとの接続>
　　左側　USBシリアルによる電源と書き込み(USBブラスター相当)
　　右側　RS232C
　　　　　PS2キーボード
　　　　　VGA


![Image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/f9089ded-372a-2790-b0f8-5434ef975cd7.jpeg)
PHP(入門編) メモ書き

ドットインストールを元に、気になったことを調べて追記。
そのままメモに残しているものです。
※進めていくうちに追記していきます。

レッスン内容はPHP入門(全24回)
https://dotinstall.com/lessons/basic_php_v2


## String関数 echo文

http://php.net/manual/ja/function.echo.php

```php
<?php
/****************************************************************************************
 * echo 文でやりがちなミス。
 * - echo は関数のような動作をさせることはできない。
 * - 下の三項演算子を使った構文の場合、echo を使った文章はエラーを吐くが、print文なら関数として動作できるのでエラーは出ず、そのまま出力される。
 ****************************************************************************************/
$some_var = true;
($some_var) ? echo 'true' : echo 'false';
($some_var) ? print 'true' : print 'false';
?>
```

## PHPのビルトインwebサーバー機能

 * PHPのビルトインwebサーバー
 - PHPはサーバーサイドスクリプト言語、というわけで動作させるにはwebサーバーが必要。
 - 「でもそんなのめんどくさい」という時にはPHPに備わっている簡易的にwebサーバーを立ち上げる機能を使うと楽。
 - ただしPHP5.4からなので、使う場合はPHP5.4以上をインストールすること
※環境はローカル環境です。使用OSはMacOSです。


ターミナル上で
``` php -S localhost:8000 ```

とコマンドを打つと


```
Listening on http://localhost:8000
Document root is /Users/~~~~
Press Ctrl-C to quit.
```
とでます。これでたちあげOK！
http://localhost:8000
にアクセスするとあら不思議ってなもんです。

コマンドで「-t」オプションをつけるとドキュメントルートを変更できます。
また、「Press Ctrl-C to quit.」とありますが、そのままCtr + Cでシャットダウンできます。

## 文末
特に何もないならば、PHP構文「<?php ?>」の
文末の「?>」は外すのを推奨しているので外す。



## PHPのデータ型
 * - 文字列 String
 * - 数値 interger float(floatは浮動小数点)
 * - 論理値 boolean
 * - 配列 Array
 * - オブジェクト Object
 * - null

```php
$msg = "hello from the  TOP";
echo $msg;
echo '<pre>';
echo var_dump($msg);
echo '</pre>';
```

```string(19) "hello from the  TOP"```
と表示される。こんな感じでダンプするとデータの型と中身を教えてくれる。


## 定数
- 変更することのない、変更されない値を格納するための変数

```php
//第一引数に定数名を入力(慣習的に大文字を使う)、第二引数に値を入力する
define('MY_EMAIL', 'y-matsuri@hoge.com');
echo MY_EMAIL;
```
定数にはあらかじめ決められたものがあったりする。

```php
echo '<pre>';
echo var_dump(__DIR__); //現在のディレクトリを取得する
echo '</pre>';
```
```php
//すでに定数で定義されているものだから以下だとエラーがでる。
var $dir = __DIR__;
echo '<pre>';
echo var_dump($dir);
echo '</pre>';
```

## 演算

```php
$x = 10 % 3;
$y = 30.2 / 4;

```
代入演算子は掛け算もいける

```php
$z = 5;
$z *= 3; //15

echo '<pre>';
echo var_dump($z);
echo '</pre>';

echo '<pre>';
echo var_dump($x);
echo '</pre>';

echo '<pre>';
echo var_dump($y);
echo '</pre>';
```

## 文字列
「""」 -> 特殊文字(\n など改行コードとか)　あと変数も内容が展開される
「''」 -> '' 単純な文字列
Windows10でgulpのパスが通らなくなったときに（ていうか、ユーザーフォルダ名を変えたときにパスが通らなくなったときに）

windows10のユーザーフォルダ名を変更している途中で、環境変数がいくつか消えちゃって
gulpのPATHが通らなくなって、
ググっても出てこなかったので、
記事を書きました。

こんなレアケースないだろうし、
技術ある人なら別にこんな記事いらんかもしれんけど、
ちょっとだけハマったので、共有。

たぶん、gulpにまつわる問題というより、ユーザーフォルダ名を変更して、パスが消えちゃったときの問題。

#エラー内容
ターミナル（PowerShell）でgulpって打っても以下のエラーが出る。当然gulpのインストールや、タスク等は登録済み。

```gulp : 用語 'gulp' は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。```

↑　パス通ってないんだろうなあ。。

#環境変数に追加

`C:\Users\USERNAME\AppData\Roaming\npm`

環境変数に↑を追加。
（USERNANMEは各自のやつを入れます。）

#PCを再起動

再起動してください。

#とおた！

`gulp -v`
でバージョンが出たのでOK！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59927/2343723d-fddd-3bec-4fe0-686db5bbe44c.png)
Azure Log Analytics の更新プログラム適用のスケジュールを停止する 

Log Analytics の「[Update Management ソリューション](https://docs.microsoft.com/ja-jp/azure/automation/automation-update-management?WT.mc_id=AZ-MVP-5003113)」を利用して[更新プログラムの適用をスケジューリング](https://docs.microsoft.com/ja-jp/azure/automation/manage-update-multi?WT.mc_id=AZ-MVP-5003113#schedule-an-update-deployment)しています。
今回、諸事情により、このスケジュールを一時停止しなければなりません。

以下に、どのように操作したか、その手順を記します。

#どうやって停止させる？
さて、[Azure ポータル](https://portal.azure.com) にサインインして、更新プログラムの管理で「スケジュールされた更新プログラムの展開」タブを開き、設定しよう...「あれ？どうやるんだっけ？」 と思ってしまい、手が止まってしまいました。

![更新プログラム01](https://qiita-image-store.s3.amazonaws.com/0/230264/5c467c25-89cc-ed54-a671-02e2923ad001.png)

#Azure Automation の一機能でしたね
Update Management ソリューションは、Azure Automation の一機能として提供されています。(と、[先日](https://qiita.com/tetsuya-ooooo/items/ba142d3090ae6b5d05c3)お話ししてましたね(汗))
なので、いつもどおり Automation アカウント > 共有リソース > スケジュール で該当のスケジュールを編集します。

![更新プログラム02_01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/aac71b34-bd38-2150-9023-dd17b44d6f44.png)

[有効] 項目で「いいえ」を選択、[開始時] 項目で「日時 (編集している今時点から 15 分後以降の日時)」を入力して、保存します。

![更新プログラム03_01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/39f05695-b923-020e-21ab-9aabf1499f5d.png)

状態が「オフ」になっていることを確認します。

![更新プログラム04_01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/fdc69c67-ea30-6352-691b-352675856dfa.png)

「スケジュールされた更新プログラムの展開」タブの内容はとくに変化はありません。

![更新プログラム05_01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/583fdaac-43ee-926a-e196-0e1fe6de53a3.png)

これで操作は終わり。更新プログラムが適用される予定の時刻が何事もなく過ぎるのを待ちます。

#スケジュールが実行されていないことを確認
「スケジュールされた更新プログラムの展開」タブを確認すると、該当のスケジュールの「次回の実行時刻」が設定されています。

![更新プログラム11_01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/cb86d1df-62bc-8d7c-1503-3ae78fbee243.png)

「更新プログラムの適用」タブを確認すると、該当のスケジュールが掲載されていない、すなわち実行されていないことが確認できます。

![更新プログラム12_11.png](https://qiita-image-store.s3.amazonaws.com/0/230264/e74f617a-79fd-a308-2b8d-fc1694f12200.png)

「ホントに実行されていないよね？」って確認するために、Automation アカウント > プロセス オートメーション > ジョブ も確認します。該当のスケジュールが実行される予定だった日時にジョブがひとつも登録されていないことが確認できます。

![更新プログラム13_01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/b5152939-2f0f-445c-a889-6064f0b01c48.png)


最後まで読んでいただきありがとうございました。
この記事で紹介した内容がみなさんの業務や知識の向上に少しでもお役に立てればと思います。
WSLのdocker daemonを自動起動させる

紹介記事：[WSL上でDocker Engineが動くようになっていたっぽいという話]
(https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87)

WSLでLinuxのdockerが動くようになったようです(Docker for Windowsも不要！)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/d960bc58-186b-f43d-4ced-972a4d8e05a5.png)

後は、
管理者権限でWSLを動かしてdockerのサービスを(手動)起動する
手間を減らしてみます。

# 環境
・Windows10 april 2018 update 適用 (Windows10 (Pro?) 1803)
・Ubuntu 16.04 (Microsoft Store版)

Windows10 april 2018 update から、WSLのdaemonが動くようになりました。
あと、Ubuntuは16.04をインストールして下さい。以下手順でdockerを入れる場合、18.04では動かないようです。

# dockerのインストール
```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install docker.io
```

# dockerの自動起動設定
## シェルスクリプト作成
以下シェルスクリプトを作成して任意のパスに置いておきます。

```
#!/bin/sh
sudo cgroupfs-mount
sudo usermod -aG docker $USER
sudo service docker start
```
例) ~/dockerstart.sh

(2018/08/14 追記)
別PCで、dockerが起動しない現象が有りましたが、
BIOS の Intel Virtualization Technology を OFF にしてUbuntuを入れ直したら起動するようになりました。
同様に動作しないという方は試してみて下さい。

## タスクスケジューラ設定
Windowsのスタートメニューから、「Windows 管理ツール」-「タスクスケジューラ」を開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/6dda4be0-bd1d-efd8-9126-de9c9c8abc73.png)

右側の「タスクの作成」を選択して以下を設定します。

全般
「名前」：Docker (任意で)
「最上位の特権で実行する」にチェックを入れる（必須！）

トリガー
「新規」で作成し、
「タスクの開始」：ログオン時を選択
「設定」：特定のユーザを選択

操作
「新規」で作成し、
「操作」：プログラムの開始を選択
「プログラム/スクリプト」：wsl.exe
「引数の追加」：~/dockerstart.sh
　パスはWSL(Linux)形式で指定します。(C:ドライブ以下は、/mnt/c/)

条件
「コンピューターをAC電源で使用している場合のみタスクを開始する」チェックを外す

設定
「タスクが失敗した場合の再起動の間隔」：1分間


以上が完了したら、PCを再起動させます。

WindowsにログインするとWSLのコンソールが起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/3a03b5fc-9689-0f2a-def9-c89c02f7b68d.png)

sudoのパスワードが求められるので入力します。
これを省略したい場合は以下記事を参考にして下さい。
[sudo のパスワードを入力なしで使うには]
(https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7)

タスクマネージャーのバックグラウンドプロセスに dockerd が有れば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/00eb1c26-fbc5-129d-24c3-03e6276c1387.png)


## docker を使う
管理者権限不要です。WSL又は、WSL対応のコンソールを起動してdockerコマンドを使用します。
```
$ docker run hello-world
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/d960bc58-186b-f43d-4ced-972a4d8e05a5.png)

# 参考資料
[WSL上でDocker Engineが動くようになっていたっぽいという話]
(https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87)

[Windows10 - 管理者権限が必要なアプリを自動起動（スタートアップ）]
(https://pc-karuma.net/windows-10-task-schedule-without-uac-prompt/)

[WSLを使うなら必須！「wsltty」で快適シェル環境を整える！]
(https://linuxfan.info/wsltty)
vertical-align(メモ）

# vertical-alignとは
vartical-alignプロパティとは**要素の縦方向の配置の基準を指定する**ことができる。
このプロパティは**インライン要素にのみ有効**

「vertical-alignを指定した要素のどこを、親要素のどこに合わせるか」

# 一覧

|オプション   |説明|
|:---------:|:---:|
|baseline|親要素のベースラインに揃える|
|middle|対象の要素と親要素の中央ラインを親要素に揃える|
|text-top|対象要素と親要素の最上部ラインを親要素の文字の最上部に揃える|
|text-bottom|対象要素と親要素の最下部ラインを親要素の文字の最下部に揃える|
|top|対象要素の行の最上ラインを親要素の行の最上部ラインに揃える|
|bottom|対象要素の行の最下部ラインを親要素の行の最下部ラインに揃える|
|数値＋単位|対象要素のベースラインを、親要素のベースラインから指定ぶんの距離を置いた位置に揃える|
|%|対象要素のline-heightの高さを100%として、対象要素のベースラインを親要素のベースラインから指定の割合ぶんの距離を置く|


# ラインとは

```html:a.html
   <div>
       hoge
       <span>huga</span>
   </div>
```
<img width="597" alt="スクリーンショット 2018-07-07 13.21.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/255152/7bd5ba52-aaee-153d-c971-2f41948b6e3e.png">

要素の基準となる線がある

#　例
```style.css
span{
 vertical-align: text-top;
}
```

とすると


<img width="700" alt="スクリーンショット 2018-07-07 13.25.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/255152/3290462e-8be4-ea07-3062-8a5fb7784a12.png">

hoge(親要素）のtext-topのラインと、huga（対象のインライン要素）のtext-topのラインが一致するようになる
ブラウザ(chrome, firefox等)のネイティブダイアログを閉じる方法

# 問題

Capybara(selenium)などでテストをしている時に、ファイルアップロードなどでブラウザネイティブのダイアログが開く時がある。

![da97e9547eced288b1211dcc2d5fa18b-2.png](https://qiita-image-store.s3.amazonaws.com/0/16757/2acd4bd3-7fcf-5627-f067-4397054b4cf5.png)

seleniumでは調べてみた限りJavascriptで表示されるような`alert` `confirm` ダイアログの操作はできるが、ブラウザネイティブで表示されるダイアログはどうにも出来ない様子

# 解決方法

ダイアログが開いた状態でブラウザ自体に`escape`キーが送れれば良いのでOSXの場合はAppleScriptを使う。

```osascript:dialog_escape.script
# activate application "Google Chrome" chromeの場合はこっち
activate application "Firefox"
tell application "System Events"
  key code 53
end tell
```
特定のアプリケーションをフォーカスして、`escape`キーを送っているだけ


上記のファイルを保存して`ruby`などから以下のように実行

```rb
system("osascript /path/to/dialog_escape.script")
```
RPGの戦闘シーンを作って見た

他の方がRPGの戦闘シーンをプログラミングしているのを見て、いい題材だと思って真似してみました。

```rb
p_life = 100
step = 0
encounter = 0

#戦闘シーンをメソッド化

def battle(player)
    
    puts "敵が現れた"
    sleep (1)
    e_life = rand(10..50)
    puts "敵の体力は#{e_life}です"
    sleep (1)
    
    while true
        p_atack = rand (15..20)
        e_atack = rand (1..20)
        e_life -= p_atack
        player -= e_atack
        puts "あなたの攻撃！"
        puts "#{p_atack}のダメージ"
        sleep(1)
        if e_life < 0
            puts "勝利！！"
            sleep (1)
            break
        end
        puts "敵の体力は残り#{e_life}です"
        sleep (1)
        puts "敵の攻撃"
        puts "#{e_atack}のダメージ"
        if player < 0
            puts "あなたは死にました"
            sleep (1)
            break
        end
        sleep (1)
    end
    return player
end

while step < 8
    encounter = rand(0..2)
    puts "・・・"
    sleep (1)
    if encounter == 2
        p_life = battle(p_life)
        if p_life < 0
            break
        end
        puts "あなたの残り体力は#{p_life}です"
    end
    step += 1
end
```

覚えた事を全力で駆使して作成してみました。
とりあえず、戦闘シーンをメソッド化してみて、歩いていたらランダムに敵と遭遇して遭遇したら戦闘が始まるといった感じにしてみました。
説明不足感がすごいですけど、何かご指摘や改善案がありましたら教えて頂けると助かります。
Raspbianをインストール直後にやること（超必要最低限）

## Raspberry piにRaspianをインストールして最初にやる事

#### 兎にも角にも`sudo raspi-config`が楽

* piユーザーでログイン後、`sudo rasps-config`を実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208639/65d6f5a7-c0c4-8bf1-e8a7-66f916d52e74.png)

* 下記を順に設定する
    * 1. Change User password でpiユーザーのデフォルトパスワード変更
    * 2. Network Options -> N2 Wi-fi でWiFiを有効化
    * 5. Interfacing Options -> P2 SSH でsshを有効化
    * 7. Advance Options -> A1 Expand Filesystem でファイルシステムを拡張
    * Finishでリブート

* リブート後、WiFiでIPアドレスが取得でき、PCからssh接続ができればOK
bash よく間違える declare -l と local

たまに bashスクリプトを書くと `declare -l local_var` って書いてしまって結局 `man bash` するのでいっそQiitaに書いておこうと思った始末。 (>= bash 4)

 この場合の正解は `local` :confounded: 


# local [option] [name[=value] ...]

> For each argument, a local variable named name is created, and assigned value. The option can be any of the options accepted by declare. When local is used within a function, it causes the variable name to have a visible scope restricted to that function and its children. With no operands, local writes a list of local variables to the standard output. It is an error to use local when not within a function. The return status is 0 unless local is used outside a function, an invalid name is supplied, or name is a readonly variable.


# declare [-aAfFilrtux] [-p] [name[=value] ...]

> Declare variables and/or give them attributes. If no names are given then display the values of variables. The -p option will display the attributes and values of each name. When -p is used with name arguments, additional options are ignored. When -p is supplied without name arguments, it will display the attributes and values of all variables having the attributes specified by the additional options. If no other options are supplied with -p, declare will display the attributes and values of all shell variables. The -f option will restrict the display to shell functions. The -F option inhibits the display of function definitions; only the function name and attributes are printed. If the extdebug shell option is enabled using shopt, the source file name and line number where the function is defined are displayed as well. The -F option implies -f. The following options can be used to restrict output to variables with the specified attribute or to give variables attributes:

## declare -l

> -l
> When the variable is assigned a value, all upper-case characters are converted to lower-case. The upper-case attribute is disabled.


[bash\(1\): GNU Bourne\-Again SHell \- Linux man page](https://linux.die.net/man/1/bash)
Python3 > colorText_180707.py > v0.1 > optという文字に色付けした結果を出力

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
GNU grep 2.25
```

### 処理概要

- テキストを読込む
- htmlタグで特定の文字に色付けして標準出力

Pythonの復習もかねて実装。

### code v0.1

```colorText_180707.py
import re


'''
v0.1 Jul. 07, 2018
  - add color html tag for a fixed text ('opt')
'''

# on Python 3.5.2

SRC_FILE = 'in_180707.txt'
COL_TEXT = 'opt'
inRed = '<font color=red>' + COL_TEXT + '</font>'

with open(SRC_FILE) as fd:
    lines = fd.readlines()
    for aline in lines:
        wrk = aline.replace(COL_TEXT, inRed)
        print(wrk, end='')

```

### 使用例

```in_180707.txt
This opt is used as a option.
opt.list=1
suboption is also specified so that
```

```session
$ python3 colorText_180707.py 
This <font color=red>opt</font> is used as a <font color=red>opt</font>ion.
<font color=red>opt</font>.list=1
sub<font color=red>opt</font>ion is also specified so that
```

標準出力を貼り付けたのが以下。
This <font color=red>opt</font> is used as a <font color=red>opt</font>ion.
<font color=red>opt</font>.list=1
sub<font color=red>opt</font>ion is also specified so that

### TODO

- 色付けする文字列を実行時引数で指定できるように
Visual StudioからVisual Studio Codeを起動する

# はじめに
今回はVisual Studioの外部ツールとしてVisual Studio Codeを登録し、VIsual Studio上でVisual Studio Codeを起動する
までの手順をまとめてみました。


![4.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/f56cd97b-ecdb-a9dc-1f3b-0f0fc02337ae.gif)

# 環境
Windows 10
Visual Studio 2017 Community

# 1. 外部ツールの編集
「ツール」 -> 「外部ツール」を選択します

<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/fce00993-a432-d9ae-0b2c-5617b37b1128.png" width = 340>

# 2. 追加
追加ボタンをクリック
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/178fc6ef-ccc2-fd55-0bb6-e192fb326d5f.png" width = 340>


外部ツールが追加されます
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/fe0d008b-c06a-b146-fcc6-984b84472222.png" width = 340>

# 3. 名前を変更
まずは名前を設定していきます。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/430bf77e-7fae-ee01-a0b0-8dca1a933368.png" width = 340>


Visual Studio Codeを起動したいので名前に「VS Code」を入力
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/d42f6da1-f569-fd51-88e0-542877a16d86.png" width = 320>

# 4. コマンドの指定
次にコマンドを指定します。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/acba4a71-649f-0b60-412a-430bf02b51b7.png" width = 340>
今回はVisual Studio Codeを起動したいので、Visual Studi Codeのexeのファイルパスを指定します。

## exeのファイルパスの入力
**...**と書かれたボタンをクリックします。

<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/e039c481-2bbd-1e5e-0ca1-255a90ca9e55.png" width = 320>

Visual Studio Codeのexeファイルを選択して「開く」をクリック。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/2a6470f5-70ba-7509-614b-9efdd5d91964.png" width = 340>

コマンドの部分にCode.exeのパスが入ります。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/bd1252ae-50f5-dd29-ab98-20d1d91fb45a.png" width = 340>

以上でコマンドの設定は終わりです。

# 5. 引数の設定
VS Codeが開くワークスペースとVSが開いているソリューションを一致させたいので、
コマンド引数を設定します。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/ef9384f8-45b1-e08a-0dbe-972671e4bbb4.png" width = 320>

三角アイコンが書かれたボタンをクリックします。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/a2cd4b2a-ac69-e4ee-82af-6f3703eec204.png" width = 320>

出てくる一覧の中から「ソリューションディレクトリ」を選択します。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/80019fe6-7e3c-c7ba-59ce-3126cee637ef.png" width = 320>

# 設定完了
すべての設定が完了すると以下のようになります。

<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/0cb9c8aa-78c5-6e30-5f9c-090b256ffe2a.png" width = 350>

OKを押せば設定完了です。

# VS Codeを起動してみる
外部ツールに「VS Code」が追加されているので、これをクリックするとVisual Studio Code(VS Code)が起動します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/884b4675-b4e5-255a-08f9-caf70f32fb8d.png)

<br>
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/f56cd97b-ecdb-a9dc-1f3b-0f0fc02337ae.gif" width = 500>

# 関連URL
Visual Studioの外部ツール機能を活用してみよう
https://qiita.com/nia_tn1012/items/d5510dcb7f1bf0d54381
ssh接続が一定時間で切れてしまうのを防ぐ

```
Write failed: Broken pipe
```
と表示後にsshが切断される対策

```
vi .ssh/config
```

下記を追記するだけ

```
# 15秒間隔で、サーバに応答確認を送る設定です。
ServerAliveInterval 15
```
iOSアプリでTableViewのセルの間に広告を挟む（Swift）

## 経緯
TableViewCellの間に広告をはさみたい
できるだけ難しいことはしたくない。
実務をしているとこういったケースはよくあります。
これについてシンプルな記事がなかったためまとめます。

皆さん結構面倒くさい実装をされていたのでちょっと考えてみました。



## こういった方におすすめ
- UITableViewのセルに広告を挟み込みたい
- DataSourceを汚染したくない


## 説明
TableViewCellに広告があるCellと広告がないCellを作るだけ。

説明上直接TableViewにCellを入れていますが実際はxibなど適宜。
わかりやすいよう背景を変えてあります。

あとは広告を出したい行のタイミングで「広告付き」のセルを呼び出すだけ。

<img width="499" alt="スクリーンショット 2018-07-07 11.40.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/46527/10a7beea-796f-a3ad-0c4d-9a28d2d92039.png">
grep > grep --color=always opt *.c | grep -v option > optionが除外されない理由

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
GNU grep 2.25
```

### 症状

```
$ grep opt *.c | grep -v option
```

```
$ grep --color=always opt *.c | grep -v option
```

後者では結果にoptionも含まれる。何故か?

### 理由

参考: https://stackoverflow.com/questions/24093365/different-results-in-grep-results-when-using-color-always-option

以下と理解した。

1. `option`のoptにANSI escape codesが追加される
    - 例: `at your ESC[01;31mESC[KoptESC[mESC[Kion) any later version.` 
2. optionで除外しようにも、optionという文字列は１の時点で喪失している
createsuperuser と username

モデルのusernameとかを色々いじったあとに、createsuperuserをしようとしたらエラーが出た。

```python
TypeError: create_superuser() missing 1 required positional argument: 'username'
```

結局、usernameに変更したらうまくいくんですが、どうしてこうなるのかを調べたのでまとめておきます。

# Situation
一般的にやることはないと思うが、Userモデルの名前をusername以外に設定しておきたいなって時に気をつける必要がある。
具体的には、

```python:model.py
from django.db import models
from django.contrib.auth.base_user import AbsractBaseUser

class User(AbstractBaseUser):
    new_username = models.CharField()
    ... 

    USERNAME_FIELD = new_username
```

みたいなことを考えた時に、createsuperuserでハマりました。

# Why error occurred?

エラーを読むと、create_superuserにusernameという必要な引数が不足しているってなっています。

該当する箇所は、django.contrib.auth.management.command.createuseruserです。
ソースは[こちら](https://github.com/django/django/blob/master/django/contrib/auth/management/commands/createsuperuser.py)

該当箇所は

```python
user_data = {}
...

if username:
    user_data[self.UserModel.USERNAME_FIELD] = username
    user_data['password'] = password
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
```

のあたり。create_superuserに辞書型で値を渡している様です。
dictを渡すと、key, valueが引数と値に対応する感じらしいです。

この辺は、以下の記事が詳しいです。ありがとう
https://note.nkmk.me/python-argument-expand/

create_superuser()を探すと、contrib.auth.modelsにいます。
https://github.com/django/django/blob/master/django/contrib/auth/models.py

```python
def create_superuser(self, username, email, password, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)

    if extra_fields.get('is_staff') is not True:
        raise ValueError('Superuser must have is_staff=True.')
    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(username, email, password, **extra_fields)
```
となっているので、**user_dataで渡した際に、usernameのkeyが存在しないとエラーを吐きます。

# Conclusion

usernameを変更して使う際には、この辺の依存関係を考慮して、適宜オーバーライドするなりして対応する必要がありそうです。
あーむずかしい。
Cocoon + Chosen の使い方


今後も使いそうな組み合わせなので、備忘録です。

[Cocoon](https://github.com/nathanvda/cocoon) は親テーブルのフォームで子テーブルのデータをまとめて更新するフォームを作りたいときに、よきにはからってくれる Gemです。
[Chosen](https://harvesthq.github.io/chosen/) は、選択リストで検索を使えるようになる jQueryのプラグインです。


```haml:app/views/parents/_form.html.haml
-# simple_form 内を抜粋
=link_to_add_association '追加する', f, :child, data: {"association-insertion-node" => "div#children", "association-insertion-method" => "append"}
%div
  %div#children
    = f.simple_fields_for :children do |child|
      = render partial: 'child_fields', locals: { f: child }
```


```haml:app/views/parents/_child_fields.html.haml
%div
  = f.input :item_id, collection: Item.all, as: :select, label: false, input_html: { class: 'chosen-select' }
```


```js:app/assets/javascripts/children_select.js
$(function() {
  $(".chosen-select").chosen();
  $('div#children').on('cocoon:after-insert', function(e, insertedItem) {
    $(".chosen-select").chosen()
  });
});

```


`$(".chosen-select").chosen();` だけだと、「追加する」ボタンで子フィールドセットを追加した際に `chosen()` が呼ばれていない素の選択リストになってしまいます。
そこで、Cocoon が提供する callback を使って、追加時にも `chosen()` を呼ぶようにします。
grep > パイプ(|)後にも色を保持する > --color=always > grep -vは無効になる

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
GNU grep 2.25
```

### grepとパイプ(|) > 単色になる

ADDAという光散乱数値シミュレーションのソースコードを読み続けている。

```param.c
...
opt_index opt; // main option index; it is also defined as extern in param.h
...
```


optはどこで使われるかgrepしてみるが、optionsやoptimizationなどの無関係なものも表示される。
パイプ(|)後に`grep -v`で除外キーワードを指定すると、grepの結果が単色になってしまう。

パイプ後にも色を保持するにはどうするか?


### 対処 > `--color=always`

参照: [Preserve colouring after piping grep to grep](https://stackoverflow.com/questions/2327191/preserve-colouring-after-piping-grep-to-grep)

`--color`でalwaysを指定する。
https://explainshell.com/explain?cmd=grep+--color%3Dalways

```shell
$grep --color=always opt *.c | grep -v options
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9351d9cd-a848-9d77-3df9-66b6b0db97b4.png)

パイプの後でも色付けが保持された。

### `| less`との組合せはだめ　

lessと組合わせた場合は下記となった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0dcb5a03-0346-df50-bd71-ec0d6a770053.png)

スクロールできるようにするには別の方法が必要。

### bug? > grep -vが無効になる

```shell
$grep --color=always opt *.c | grep -v options
```

結果にoptionsも含まれている。

[grep > grep --color=always opt *.c | grep -v option > optionが除外されない理由](https://qiita.com/7of9/items/ddebcb1cf4d7b65791fd)
にその理由を書いた。


### 備考 > naming

一般過ぎるoptというキーワードはソースリーディング者の負担が大きい。
検索性の高い変数名を定義できるのは、良きエンジニアの特性だと考えている。
Pythonで世界地図(cartopy版)

#####実行した環境
Ubuntu Stdio 18.04LTS
Python 2.7.15rc1

Python3は、下記エラーが解決出来ませんでした。
Python3はitertoolsのifilterが実装されていないようです。
http://kk6.hateblo.jp/entry/20110521/1305984781
File "/usr/local/lib/python3.6/dist-packages/shapely/topology.py", line 18, in _validate
    raise ValueError("Null geometry supports no operations")
ValueError: Null geometry supports no operations

#####参考
Met Postさん
http://metpost.hatenablog.com/

#####インストールしたもの
最初は別のものをやっていたので下記のものが必要かどうかわかりません。
下記以外も必要ですが、すでにインストールしてあったものです。
$ pip install xray
$ pip3 install Pydap
#####都道府県を色分けする。
奄美大島が沖縄と同じ色になっていますが、1953年の奄美大島がアメリカから変換される前のデータのようです。

```python:
#!/usr/bin/python
# coding: UTF-8

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature #県境・川

#都道府県着色---
import cartopy.io.shapereader as shapereader
import itertools

# Natural Earthから州データセットを取得する
shpfilename = shapereader.natural_earth(resolution='10m',
                                        category='cultural',
                                        name='admin_1_states_provinces')

# get shapefile records
reader = shapereader.Reader(shpfilename)
provinces = reader.records()

# 日本の国をフィルタリングする
provinces_of_japan = itertools.ifilter(lambda province: province.attributes['admin'] == 'Japan', provinces)

# plot
colors = itertools.cycle(['red', 'blue', 'green', 'lime', 'orange', 'cyan', 'purple','gray','yellow','violet','magenta'])
#都道府県着色---

plt.figure(figsize=[5,5])

states_10m  = cfeature.NaturalEarthFeature('cultural', 'admin_1_states_provinces_lines', '10m', #県境
                                           edgecolor='gray',
                                           facecolor='none')  # no filled color
## 10m resolution
ax1 = plt.axes(projection=ccrs.PlateCarree())
ax1.coastlines(resolution='10m')

#都道府県着色---
for province in provinces_of_japan:
    geometry = province.geometry
    ax1.add_geometries(geometry, ccrs.PlateCarree(), facecolor=next(colors))
#都道府県着色---

ax1.set_extent([120,150,20,50], ccrs.PlateCarree())
ax1.add_feature(states_10m) #県境
ax1.set_title('10m coastline')

plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/c1c12e4b-805a-db1e-86cc-00decd0b0510.png)
[iOS]通信デバッグ

<p>最近、iOS端末のパケット・キャプチャでデバッグしたので、その情報をまとめた。</p>

<p>Appleからの情報は、<a href="https://developer.apple.com/library/archive/qa/qa1176/_index.html">Technical Q&A QA1176 Getting a Packet Trace</a>だ。</p>

<p>Remote Virtual Interfaceの準備と解除の手順は以下のとおり。</p>

<p># 端末の識別子を調べる。</p>

<pre><code>・Macに端末をUSBで接続する。
・Xcodeを立ち上げ、Window / Devices and Simulators を選ぶ。
・端末のIdentifier: の値を選択してコピーする。
</code></pre>

<p># 端末をつなぐ。</p>

<pre><code>・Terminal.appで以下のコマンドを叩く。
　$ rvictl -s 端末の識別子
　Starting device 端末の識別子 [SUCCEEDED] with interface rvi0
</code></pre>

<p># 端末を外す。</p>

<pre><code>・Terminal.appで以下のコマンドを叩く。 
　$ rvictl -x 端末の識別子
</code></pre>

<p>リモート仮想インタフェースの確認</p>

<pre><code>$ ifconfig -l
lo0 gif0 stf0 XHC20 en0 p2p0 awdl0 en1 en2 bridge0 utun0 utun1 utun2 pktap0 en4 rvi0
</code></pre>

<p>HTTPSのキャプチャの例。</p>

<pre><code>$ sudo tcpdump port https -I rvi0
</code></pre>

<p>RFCからオープンとクローズのパケットの流れを抜き出す。</p>

<pre><code>      TCP A                                                TCP B
  1.  CLOSED                                               LISTEN
  2.  SYN-SENT    --> <SEQ=100><CTL=SYN>               --> SYN-RECEIVED
  3.  ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK>  <-- SYN-RECEIVED
  4.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK>       --> ESTABLISHED
  5.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED
          Basic 3-Way Handshake for Connection Synchronization
</code></pre>

<pre><code>      TCP A                                                TCP B
  1.  ESTABLISHED                                          ESTABLISHED
  2.  (Close)
      FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT
  3.  FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT
  4.                                                       (Close)
      TIME-WAIT   <-- <SEQ=300><ACK=101><CTL=FIN,ACK>  <-- LAST-ACK
  5.  TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED
  6.  (2 MSL)
      CLOSED
                         Normal Close Sequence
</code></pre>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/91202/">BUKURO.swift 2018-07</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
Gitで管理外ファイルが適応されない場合の原因と対応方法

# `.gitignore`や`exclude`で指定したファイルが管理外にならない場合の原因と対応方法

## 原因
`.gitignore`（または`exclude`）が管理外対象とするのはインデックスに登録されていないファイルのみのようです。インデックスに登録されてしまったファイルは管理外の対象になりません

インデックス登録済みの`.hoge`と未登録の`.huga`で比較してみます

<img width="741" alt="スクリーンショット 2018-07-07 10.15.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/261661/72e50ac4-f1f1-c8e2-8ad0-96657c9f5b45.png">

この状態で`.gitignore`に`.hoge`と`.huga`を登録してみます
<img width="373" alt="スクリーンショット 2018-07-07 10.20.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/261661/c0276ed8-847a-9d7a-10ef-4d571beb753b.png">

`git status`を確認します
<img width="538" alt="スクリーンショット 2018-07-07 10.22.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/261661/deb91000-a2d5-1626-2df8-4a03f54dce21.png">

`.huga`のみ管理外となりました

## 対応方法
対象ファイルをインデックスから削除します

```
git rm --cached .hoge
```

`git status`を確認します
<img width="543" alt="スクリーンショット 2018-07-07 10.31.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/261661/82bec178-03fc-cb05-8af1-1335ad893875.png">

`.hoge`も管理対象から外れました！

以上です
Google Chrome からスクロールバーを削除・非表示する方法

# 1. 拡張機能 Rescroller をインストール

- [davidofwatkins/rescroller](https://github.com/davidofwatkins/rescroller)
- []Chrome ウェブストア](https://chrome.google.com/webstore/detail/rescroller/ddehdnnhjimbggeeenghijehnpakijod)

# 2. Rescroller のオプションで以下を追記

```css
::-webkit-scrollbar {
    display:none; <=====これ！

    }
    ::-webkit-scrollbar-button {    

    }
    ::-webkit-scrollbar-track {    

    }
    ::-webkit-scrollbar-track-piece {    

    }
    ::-webkit-scrollbar-thumb {    

    }
    ::-webkit-scrollbar-corner {    

    }
    ::-webkit-resizer {    

    }
```
python tips ヒヤドキュメント

このtips  は、ヒヤドキュメントを実行(exec)したい人向けです。
そういった人は、ほとんどいないと思いますが、さらに、ヒヤドキュメント内に、
ヒヤドキュメントを配置したいと思う人は更にいないでしょう。


ま、自分向けのメモです。

```python
x="""
print('start\\n')
xx=\"""
tanuki
buta
\"""[1:-1]
print(xx)
"""[1:-1]
```
で、これを実行します。
exec(x)
KL-Divergence の実装に関するメモ


##ポイント
* Multivariate Normal Distribution における KL-Divergence を実装し、具体的な数値で確認。

##サンプルコード
```python
tf.reset_default_graph()

# KL Divergence for Multivariate Normal Distributions with Diagonal Covariance

# API
def kl_divergence_norm_1(mu_q, sig_q, mu_p, sig_p):
  dist_q = tf.contrib.distributions.MultivariateNormalDiag(loc = mu_q, scale_diag = sig_q)
  dist_p = tf.contrib.distributions.MultivariateNormalDiag(loc = mu_p, scale_diag = sig_p)
  
  #return tf.contrib.distributions.kl_divergence(dist_q, dist_p)
  return dist_q.kl_divergence(dist_p)

# Manual
def kl_divergence_norm_2(mu_q, sig_q, mu_p, sig_p, dim):
  calc_1 = tf.reduce_sum((sig_q * sig_q) / (sig_p * sig_p), axis = 1)
  calc_2 = tf.reduce_sum(tf.square(mu_q - mu_p) / (sig_p * sig_p), axis = 1)
  calc_3 = 2.0 * tf.reduce_sum(tf.log(sig_q / sig_p), axis = 1)
  
  return 0.5 * (calc_1 + calc_2 - dim - calc_3)

# Monte Carlo
def kl_divergence_norm_3(mu_q, sig_q, mu_p, sig_p, n, batch_size, dim):
  dist_q = tf.contrib.distributions.MultivariateNormalDiag(loc = mu_q, scale_diag = sig_q)
  dist_p = tf.contrib.distributions.MultivariateNormalDiag(loc = mu_p, scale_diag = sig_p)

  x = np.random.normal(loc = mu_q, scale = sig_q, size = [n, batch_size, dim]).astype(np.float32)
  log_q = dist_q.log_prob(x)
  log_p = dist_p.log_prob(x)

  return tf.reduce_mean((log_q - log_p), axis = 0)

#mu_q = np.array([[1.0, 0.0, 0.0]]).astype(np.float32)
#sig_q = np.array([[2.0, 1.0, 1.0]]).astype(np.float32)
#mu_p = np.array([[0.0, 0.0, 0.0]]).astype(np.float32)
#sig_p = np.array([[1.0, 1.0, 1.0]]).astype(np.float32)

#mu_q = np.zeros(shape = [batch_size, dim], dtype = np.float32)
#sig_q = np.ones(shape = [batch_size, dim], dtype = np.float32)
#mu_p= np.zeros(shape = [batch_size, dim], dtype = np.float32)
#sig_p= np.ones(shape = [batch_size, dim], dtype = np.float32)

n = 1000
batch_size = 5
dim = 3

mu_q = np.random.normal(size = [batch_size, dim]).astype(np.float32)
sig_q = np.random.uniform(size = [batch_size, dim]).astype(np.float32)
mu_p = np.random.normal(size = [batch_size, dim]).astype(np.float32)
sig_p = np.random.uniform(size = [batch_size, dim]).astype(np.float32)

kl_api = kl_divergence_norm_1(mu_q, sig_q, mu_p, sig_p)
kl_man = kl_divergence_norm_2(mu_q, sig_q, mu_p, sig_p, dim)
kl_mc = kl_divergence_norm_3(mu_q, sig_q, mu_p, sig_p, n, batch_size, dim)

with tf.Session() as sess:
  
  print ('API: {}'.format(sess.run(kl_api)))
  print ('Man.: {}'.format(sess.run(kl_man)))
  print ('MC: {}'.format(sess.run(kl_mc)))
```
##アウトプット
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/65444823-60e9-737a-ab58-ed2cf8cd4f97.png)
Siv3Dテキスト・フォントリファレンス


## はじめに
Siv3Dはものすごく便利で、非常にナウいゲームライブラリです。
C++で記述できるため、動作が早く、結構適当な記述で、計算量ぶん回してもなんとかなってしまうことがあります。
しかし、テキスト・フォントを含め、何を行う関数なのかのリファレンスが少し少ないため、自分でも少しまとめてみようと思います！

## -1.クラス名

### Typeface
線の太さを規定します。
fontインスタンスを生成するときに、Typeface::Defaultなどと設定する事ができます。

### FontStyle
フォントのスタイルを規定します。
fontインスタンスを生成するときに、FontStyle::Boldなどと設定することができます。

### FontProperty
よくわかっていないです。
多分内部で使われているんだと思います。

### TextOutlineStyle
よくわかっていないです。
多分内部で使われているんだと思います。

### Font
一番使うクラスです。
基本的にこのクラスのインスタンスを生成して、そのインスタンスに文字列を渡すことで描画します。

### DrawableString
よくわかっていないです。
多分、Fontのインスタンスに文字列を生成したときに、内部で生成されているテキスト描画用のString型だと思っています。

### FontManager
パソコンにインストールされていないフォントを管理します。

## 0.基本

Fontクラスのインスタンスを予め定義しておき、そのインスタンスに文字列や、変数を渡します。
drawメソッドを実行すると、文字列を描画することができ、長方形が返り値として帰ってくるため、そのままつなげて書くことができます。

## 1.font(L"ABC").draw()

文字列ABCを指定した位置に描画します。
drawメソッドには、記述位置や、色、そして行間のスペースサイズが設定できます。

## 2.font(L"ABC").drawAt()

文字列ABCを指定した位置に描画します。
draw関数と異なる点として、drawAt関数では、drawAt関数に設定した位置を中心として、テキストを描画します。
例えば、ABCDという文字列をPoint(0,0)を引数として描画しようとすると、ABCDという文字列の中央がPoint(0, 0)の位置に来るため、画面上にはCDの下半分のみが移ります。


## 3.font(L"ABC").drawCenter()
調べてみたところ、drawAtと一緒でした。
なにか違うのだろうか。。。

## 4.font(L"ABC").region()
文字列ABCを描画するサイズの長方形を返します。
引数に何も設定しないとRect(0, 0, 60, 40)など、(0,0)を基準とした長方形が帰ってきます。
引数に描画する位置を規定すると、その位置を基準とした長方形が帰ってきます。

## 5.font(L"ABC").regionCenter()
文字列ABCを描画するサイズの長方形を返します。
regionメソッドと異なる点として、引数に渡した位置を文字列の長方形の中心として描画します。

## 6.font(L"ABC").write()
writeメソッドは、Imageインスタンスに文字列を書き込みます。
そして、そのImageインスタンスをTextureインスタンスなどに渡すことで、画像に文字列などを書き込むことができます。

## 7.font(L"ABC").drawAt()
これまでと同様に、中心点が異なるだけです。
Swift:「Value of tuple type '(key: String, value: Any)' has no member 'subscript'」の対処方法

#はじめに
jsonをパースする際に発生した初歩的なエラーですが、直接的に解決できそうな記事がなく、初心者のため備忘録を含め記録として残したいと思います。

##①Value of tuple type '(key: String, value: Any)' has no member 'subscript'について。

```swift:somethingWrong
if let results = data as? [String: Any] {
   for key in results {
       let data = key["downloadURL"] as [String:Any]
       }
   }
}
```

上記のようなコードで`key`がタプル型の場合に、発生するエラーのようです。
タプル型のため、以下のようなコードを記述すれば値が取得できるかと思います。

```swift:resolve
if let results = data as? [String: Any] {
   for key in results {
       print(key.key)
       print(key.value)
       }
   }
}
```
ご参考になれば幸いです。
Itsybitsy M4のUSBドライバが適用されないので適用させた

こんにちわ。

Adafruitから先月新発売されたばかりの[ItsyBitsy M4 Express](https://www.adafruit.com/product/3800)ですが、パフォーマンス/サイズに惹かれて、早速輸入してしまいました。
(公式通販で注文から到着まで3日!)

![20180703_025351.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/97e2784c-729d-74a1-a57c-c57eb3abc3c9.jpeg)


# USBドライバが適用されない
はい、新製品の罠です。

以前、Trinket M0を購入した際に[Adafruit USB Driver](https://github.com/adafruit/Adafruit_Windows_Drivers/releases)は入れていたので、動くだろうと思っていましたが、甘かったようです。
ドライバがまだ対応していませんでした。


# ドライバを改造して適用させる
## 1. Adafruit USB Driverの再インストール
![itsybitsy-m4-1.png](https://qiita-image-store.s3.amazonaws.com/0/253070/eb524fb0-b09a-98cc-ead6-869c8bdf9be7.png)
欲しいのはインストーラー内にある`Adafruit_usbser.inf`だけなのですが、手っ取り早く抽出する為に、適当に再インストールして`%temp%`へ展開させます。
(画像の選択肢で、どれか1個にチェックがあれば全ファイル展開されました)


## 2. ドライバファイル編集
![itsybitsy-m4-2.png](https://qiita-image-store.s3.amazonaws.com/0/253070/c000ae73-4b05-9ddb-01e2-88a95f97d7c4.png)

```ini:%Temp%\adafruit_drivers\Drivers\Adafruit_usbser\Adafruit_usbser.inf
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
"%ITSYBITSY_M4_EXPRESS% Bootloader (002B:04)"=DriverInstall, USB\VID_239A&PID_002B&MI_04
"%ITSYBITSY_M4_EXPRESS% (802B:00)"=DriverInstall, USB\VID_239A&PID_802B&MI_00

[DeviceList.NTamd64]
"%ITSYBITSY_M4_EXPRESS% Bootloader (002B:04)"=DriverInstall, USB\VID_239A&PID_002B&MI_04
"%ITSYBITSY_M4_EXPRESS% (802B:00)"=DriverInstall, USB\VID_239A&PID_802B&MI_00

[Strings]
ITSYBITSY_M4_EXPRESS="Adafruit ItsyBitsy M4 Express"
```
マイコンボードをPCに接続し、デバイスマネージャーで`VID/PID`を確認しながら、抽出したドライバファイルに追記します。

なお、通常接続時/ブートローダー接続時で、それぞれ`VID/PID`が異なります。

ブートローダーモードへ行くには、リセットボタンを2回連打します。
通常モードへ戻る場合は、更にリセットボタンを1回押下します。


## 3. 改造ドライバ適用
![itsybitsy-m4-3.png](https://qiita-image-store.s3.amazonaws.com/0/253070/2709193a-2384-c81b-7d55-f098209822b5.png)

後はデバイスマネージャーから、手動で改造済の`Adafruit_usbser.inf`を読み込ませれば、無事に認識するはずです。


# 待望のLチカ!
かつてこんなに苦労したLチカがあっただろうか。
いやあったわ...PICをASMでチカらせた時...Bank切替...MOVWF...ｳｯ頭がｯ...

そんな事はさておき、これでようやくマトモに使える環境が整いました。

何作ろうかなぁ...(続く?)