OmniAICreator/Qiita-1.07M huggingface dataset:
LocalStackでユニットテスト

LocalStackは、AWSのサービス（と同じインターフェイス）をローカルに構築します。
Macで実行する場合、Docker for MacのFile Sharingで一手間かかかるので、pipインストールをお勧めします。

## 環境

- Mac 10.13
- [LocalStack](https://github.com/localstack/localstack)

## LocalStack用プロファイルの作成

```bash
$ aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-west-2
Default output format [None]: 

$ cat ~/.aws/credentials
[localstack]
aws_access_key_id = dummy
aws_secret_access_key = dummy

$ cat ~/.aws/config
[default]
[profile localstack]
region = us-west-2
```

## pipでLocalStackをインストール

```
$ pip install localstack
$ localstack start
Starting local dev environment. CTRL-C to quit.
Starting mock ES service (http port 4578)...
Starting local Elasticsearch (http port 4571)...
〜
2018-06-05T11:11:02:WARNING:infra.py: Service "elasticsearch" not yet available, retrying...
Ready.
```
『Ready』になれば、準備完了。
GitHubからGitLabへのレポジトリ変更

# 起
GitHubからGitLabにレポジトリを変更したので、メモ程度に記録を残すことにする。

# アカウト作成
まずはhttps://gitlab.com/ にアクセスし、アカウントを作成する

<img width="1056" alt="Safari002.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/2cdc5144-0db9-187c-650c-1aad725d24cc.png">

アカウントの作成に関しては別段解説する必要もないかと思うので、割愛する。

# GitHubからGitLabへの移管
次に上のメニューからNew Projectを選択する。

<img width="1321" alt="Safari003.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/41aaae98-15eb-b97c-73b1-6a063efd3dd1.png">

下のタブからGitHubを選択する。

<img width="1321" alt="Safari004.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/472e33a1-5b31-dc34-2ae2-b4da69816579.png">

**Import repositories from GitHub**の下にある**List your GitHub repositories**をクリックする。

<img width="1321" alt="Safari005.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/8e3e3556-d689-bd05-a994-7f97710d8ba0.png">

GitHubにページが遷移するので、**Authorize gitlabhq**をクリックする。

<img width="1321" alt="Safari006.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/e7da5d82-413d-8a82-fab3-4378bbe22259.png">

パスワードなどを入力すると、GitHub上にあるレポジトリが表示されるので、移行したいレポジトリを個別選択するか、全て移行する場合は、**Import all repositories**をクリックする。

<img width="1321" alt="Safari007.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/eba16a7f-8fa0-24c7-3010-e7c0a6c4d13d.png">

これでGitHubにあった自分のレポジトリがGitLab移管されるのだが、大規模なレポジトリや履歴が多いレポジトリは完全に移管されるまでに数時間とかかかったりする場合もあるので、気長に待つように。

<img width="1320" alt="Safari009.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/4fe8f242-c476-bd68-dc85-c91dee0f702c.png">


移管が完了すると次のようにGitLabの機能が使えるようになる。

<img width="1320" alt="Safari010.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/785a6b0f-72f4-878d-5b3a-2bc3795c0430.png">

# レポジトリのパーミッション
移管の際のレポジトリのパーミッションだが、初期時は**Private**に設定されているので、安心してほしい。
パーミッションの変更方法は、各レポジトリのページに飛び、**Settings**から**Permissions**の**Expand**をクリックする。

<img width="1320" alt="Safari011.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/83db0e74-22af-3e61-8ec0-a10d87044fa7.png">

**Permissions**の設定から**Project visibility**の設定を変更すればパーミッションの変更ができる。

<img width="1320" alt="Safari012.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/2f027fe3-3b72-d2f8-a8ab-f4d8baed4b52.png">

# 移管完了後の作業
GitLabへのレポジトリの移管が終わったら、GitHub上にあるレポジトリを削除しておく。
また、Soucetreeなどの外部アプリを使用している場合、GitHubへのリンクを削除し、新たにGitLbのレポジトリを取得しておく。

# 結
以上でGithubからGitLabへのレポジトリの移管の解説は終わりだ。
GitLabの費用だが、小規模なオフィスであれば無料、もしくは月4ドル程度で済むはずだ。無論、チームで開発する場合はライセンス形態が変わってくるので注意して欲しい。
Python + OpenCV でWindowsの日本語フォントを描画する

画像に日本語を描画したいけど

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV(オープンシーブイ)',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)

とか記載しても画像に文字を表示させようとするとOpenCV(???????)となって日本語部分が??????と文字化けして表示されます。

そこで、 PIL.ImageFont を使って日本語を表示する方法を記載しておきます。

## 入力画像

背景が真っ黒の画像を作ってこの画像の上に『OpenCV(オープンシーブイ)』と表示させてみましょう。

![img.png](https://qiita-image-store.s3.amazonaws.com/0/255677/f0decb64-5162-5d9c-7248-2ae4f5c37cce.png)



## サンプルコード

~~~py
import numpy as np
from PIL import ImageFont, ImageDraw, Image
import cv2

# 背景が黒になるように、すべての要素を0とし、200*500でRGB値3つを格納でき、
# 要素のデータ型は8bit(1byte)の符号なし整数とする配列(背景画像)を作る。
img = np.zeros((200,500,3),np.uint8)

# 表示
cv2.imshow('img',img)
cv2.imwrite("img.png", img)

# 表示する色
b,g,r,a = 0,255,0,0 #B(青)・G(緑)・R(赤)・A(透明度)

# 表示させる文字
message = 'OpenCV(オープンシーブイ)'

## Use cv2.FONT_HERSHEY_XXX to write Japanese.(失敗パターン)

position = (50,50) # テキスト表示位置
cv2.putText(img, message, position, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (b,g,r), 1, cv2.LINE_AA)

## Use HGS創英角ゴシックポップ体標準 to write Japanese.
fontpath ='C:\Windows\Fonts\HGRPP1.TTC' # Windows10 だと C:\Windows\Fonts\ 以下にフォントがあります。
font = ImageFont.truetype(fontpath, 32) # フォントサイズが32

img_pil = Image.fromarray(img) # 配列の各値を8bit(1byte)整数型(0～255)をPIL Imageに変換。

draw = ImageDraw.Draw(img_pil) # drawインスタンスを生成

position = (50, 100) # テキスト表示位置
draw.text(position, message, font = font , fill = (b, g, r, a) ) # drawにテキストを記載 fill:色 BGRA (RGB)

img = np.array(img_pil) # PIL を配列に変換

## 表示
cv2.imshow("res", img)
cv2.imwrite("res.png", img)

cv2.waitKey(0)
cv2.destroyAllWindows()
~~~

## 出力結果

上が HERSHEY_SIMPLEX という日本語対応していないフォント。
下が Windows の HGS創英角ゴシックポップ体標準 というフォント。

![res.png](https://qiita-image-store.s3.amazonaws.com/0/255677/ed9eea8e-6cec-fda3-9272-1e4c7362a1a5.png)

## おまけ

コロンビア大学の研究者たちによって FontCode なんていう目には見えない「秘密のメッセージ」を送る新手法が開発されていますので、OpenCV + PIL で作った画像をインスタのストーリーに乗せて、簡単に秘密の指令が送れるかもね。:sunglasses:

以下はFontCodeの仕組みについての動画説明
[![https://www.youtube.com/embed/dejrBf9jW24](http://img.youtube.com/vi/dejrBf9jW24/0.jpg)](https://www.youtube.com/watch?v=dejrBf9jW24)

## 参考情報
https://stackoverflow.com/questions/37191008/load-truetype-font-to-opencv
https://wired.jp/2018/06/04/invisible-messages-steganography/
Python入門：10本ノック

#　目的
python使ったことない人向けにPythonの勉強をする課題
問題文，ヒントから自分で調べ，実装する力をつける

#　環境
python3
GoogleColab

#　対象
一度もpython触ったことない人向け
環境構築なしで手軽におさわりする用のコード
対象者のレベル：一つの言語が初心者—中級者の間

#　所感
研究室ゼミ用なのでレベルの跳躍が見られる点には注意．
特にhelloworld→fizzbuzzなのは，以前のゼミでfizzbuzzを扱ったため．

基本的な修得項目は

- print,input
- if,for
- リスト内包表記
- ライブラリのimport(numpy，pandas，matplotlib)

である.


#　課題
###　1.　hello worldしてみよう！
###　2.　fizzBuzzしよう
###　3.　行列を作成しよう(*numpyを使用すること
```math
\begin{pmatrix}
1 & 2 & 5\\
3 & 4 & 6 
\end{pmatrix}
```
###　4.　3.の配列の行数と列数、要素数を表示しよう
###　5.　配列の足し算をしよう
```math
\begin{pmatrix}
1 & 2 \\
3 & 4 
\end{pmatrix}+
\begin{pmatrix}
1 & 2 \\
3 & 4 
\end{pmatrix}
 ```

###　6.　for文を使って0から10要素分のリスト(配列)を作成、表示する
###　7.　リスト内包表記で６と同じリストを作成→表示
###　8.　sin波を出力してみよう(リスト内包表記とmatplotlib　
　　　　　＊sin：numpy.sin

###　9.　pandasを使って以下のDataframeを作成しよう
| 0 | 1 | 2 |
|:-:|:-:|:-:|
| 1  |  2 | 3  |
|  4 | 5  | 6  |

https://qiita.com/sqrtxx/items/a5e234c9deb5e503ca7b

###　10.　[t,y]の二次元配列を生成しよう。ただしtは0.1ずつ0-1までの値、yは

```math
y = sin(t)
```
出力は以下．

| t | y |
|:-:|:-:|
|  0 | ?  |
|  0.1 |  ? |
|  0.2 |  ? |
|  0.3 |  ? |
|  0.4 |  ? |
|  0.5 |  ? |
|  0.6 |  ? |
|  0.7 |  ? |
|  0.8 |  ? |
|  0.9 |  ? |

#　使ってみての感想
2時間で，7~8あたりまで進んだ．
表のセンタリング(cellの中身ではなく表自体の)の仕方がわからないので誰かわかる方いたら教えてほしいです・・・
Atomでsassファイルをwatchしてコンパイルする

# 準備
- node.jsを入れる
- ターミナルから`node-sass` を入れる
    - `npm -g  install node-sass` だと、installを繰り返してしまい、インストールが終わらない
    - 下記コマンドでインストールできました。
    - `npm -g --unsafe-perm install node-sass`
    -  `node-sass -v` でバージョン確認できれば大丈夫。

# Atom
- `Preference` -> `Install` で、`sass-autocompiled` をインストール
- コンパイルしたいscssファイルを開き、**ctrl + shift + c** で、開いたファイルを監視してくれる。

## オプション

### 指定したフォルダにコンパイル
scssファイルの行頭に`// compileCompressed: ` で、コンパイル先を指定する。

```:scss
// compileCompressed: path/to/css/hoge.css
```
### import先のファイルもwatchする
import先のファイル行頭に`//main: `で、import元の親ファイルを指定する。

```:scss
//main:hoge.scss
```
PostgreSQLにおけるスキーマ管理

###スキーマ管理
データベースを「用途別に分割した単位」です

PostgreSQLでは、デフォルトで「publicスキーマ」が存在し、各ユーザーがスキーマ名を指定せずにオブジェクトを作成した場合、自動的に「publicスキーマ」オブジェクトになります
ただし、各オブジェクトは作成したユーザーに帰属していますので、許可なしに他ユーザーが作成したオブジェクトを操作することはできません

PostgreSQLでは、スキーマリストを保持する「スキーマ検索パス」機能を利用し、スキーマ名の指定のないオブジェクトがどのスキーマに属しているのかを判別します
デフォルトの設定では、「1.接続ユーザーと同じ名前のスキーマ」「2.public」の順となります

###ファイル構造
PostgreSQLでは1つの表ごとに1つ以上のファイルが作成されます
PostgreSQLの表領域(テーブルスペース)は任意のディレクトリに表データを格納したい場合に使用します
これにより任意の位置に表を構成するファイルを分散させてディスクアクセスの負荷分散を行うことができます
ですが1つのファイルに複数の票のデータを格納することはできません
3大クラウド（AWS、GCP、Azure）のデータベースサービスを比較してみた

# 比較対象
以下の3大クラウドのデータベースサービスについて、「2018/06/04」時点の情報を元に比較してみた。

- [Amazon RDS](https://aws.amazon.com/jp/rds/?hp=tile&so-exp=below)
- [Cloud SQL](https://cloud.google.com/sql/?hl=ja)
- [Azure SQL Database](https://azure.microsoft.com/ja-jp/pricing/)

# 特徴

## Amazon RDS

- DBの種類は、MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、Amazon Auroraから選択可能。

## Cloud SQL

- DBの種類は、MySQLとPostgreSQL（ベータ版）から選択可能。

## Azure SQL Database

- DBの種類は、SQL Serverと互換性がある「SQL Database」。
- サービスの種類として「Managed Instance」「エラスティックプール」「Single Database」があり、「エラスティックプール」「Single Database」では、それぞれ「vCore」と「DTU」の選択が可能。
- 一部、プレビュー期間中のため、情報が変更される可能性あり。

※Azure には「Azure SQL Database」以外にも、MySQLを対象とした「[Azure Database for MySQL](https://azure.microsoft.com/ja-jp/services/mysql/)」とPostgreSQLを対象とした「[Azure Database for PostgreSQL](https://azure.microsoft.com/ja-jp/services/postgresql/)」がある。

# 価格比較

各クラウドの価格を、極力同じ条件になるよう必要最低限のプランで比較してみた。

| <font color="white">xxxxxxxxx</font> | Amazon RDS | Cloud SQL | Azure SQL Database |
|:--|:-:|:-:|:-:|
|データベース| MySQL | MySQL第2世代 | SQL Database |
|リージョン| 東京 | 東京 | 西日本 |
|(1)インスタンス| $0.052/時間<br>※「db.t2.small」の場合 | $0.0650/時間<br>※「db-g1-small」の場合 | ￥37.63/時間<br>※「Single Database(vCore)」の場合 |
|(2)ストレージ| $0.138/GB/月 | $0.22/GB/月 | ￥19.97/GB/月 |
|(3)バックアップ| DBと同サイズまで無料。<br>追加の場合、$0.095/GB/月 | $0.10/GB/月 | プレビュー中は無料。DBと同サイズまで無料。<br>長期保存用の場合（無料範囲を超える場合？）は、￥5.60/GB/月 |
|(4)データ転送| 上りは無料。<br>下りは1GBまで無料。<br>1GB～9.999TB/月までは、$0.14/GB | 上りは無料。<br>下りは$0.19/GB | プレビュー中は無料 |
|価格<br>（月額円換算）| (1)￥4,176 <br>(2)￥3,795 <br>(3)￥0 <br>(4)￥1,525 <br> 合計：￥9,496 | (1)￥5,220 <br>(2)￥6,050 <br>(3)￥2,750 <br>(4)￥2,090 <br>合計：￥16,110 | (1)￥27,470 <br>(2)￥4,993 <br>(3)￥0 <br>(4)￥0 <br>合計：￥32,463 <br>※ただし、プレビュー価格 |
|割引|１年間、３年間の前払いで割引あり| 継続利用すると割引あり | Azureハイブリッド特典による割引あり |
|無料枠| 「db.t2.micro」インスタンスを750時間/月、20GB のストレージ、20GB のバックアップ を12ヶ月間利用可能 | 12ヶ月間利用可能な $300 相当のクレジット、無料トライアル期間あり | 30日間利用可能な ￥22,500のクレジット、最初の12ヶ月 250GBまでのストレージ |

※月730時間、１ドル110円で計算
※ストレージ、バックアップは250GBで計算
※データ転送は100GB/月として計算
※「db.t2.small」は「１コア、メモリ２GB」
※「db-g1-small」は「CPU共有、メモリ1.7GB」
※「Single Database(vCore)」は「1コア、メモリ7GB」（2018/06/05 現在プレビュー中）

# まとめ

- 「Amazon RDS」は、必要最低限のプランの場合は一番安くなりそう。他のプランでも概ね安いため、価格で選ぶなら「Amazon RDS」か。
- 「Azure SQL Database」は、一部プレビュー価格のため、正式運用後の価格が不透明。
- 「Azure SQL Database」は、価格が日本円のため、為替の影響を受けない。
- 「Azure SQL Database」は、SQL Server からの移行なら選択肢としてありかも。
- 「Cloud SQL」は、あらゆる面で「Amazon RDS」より劣っているように見える。
- サービス面や性能面は比較できていないため、その結果によっては「Cloud SQL」もありかも。
Vagrant環境内のDBにSequal Proで接続する


# 手順

1. vagrant ssh-config コマンドでSSH設定を確認する
2. 設定を ~/.ssh/config に追加する
3. Sequal Proの接続情報をSSHで設定する

# SSH設定の確認

```
$ vagrant ssh-config --host qiita-local
Host qiita-local
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/qiita/.vagrant.d/boxes/qiita-local/0/virtualbox/vagrant_private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

表示された情報を ~/.ssh/config に追加します

# Sequal Proの設定

スクリーンショットを参考に適宜設定します
SSH ホストには先程確認したホスト名を入力します

> --host qiita-local

![スクリーンショット 2018-06-05 10.39.22.png](https://qiita-image-store.s3.amazonaws.com/0/180244/6209457d-42a7-44ae-cdf8-35cb5d3ea3b9.png "スクリーンショット 2018-06-05 10.39.22.png")
laradock メモ

# laradock mariadb

Not system error?

```sh
$ mysql -u root -p -h 127.0.0.1
Enter password:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"
# 再び コマンドの実行
$ mysql -u root -p -h 127.0.0.1
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.

```
【保存版】いろんな言語のyyyymmddhhmmss文字列

※編集リクエスト超絶大歓迎

# プログラミング言語編

## PHP
~~~ PHP
date('YmdHis');
// Carbon版
\Carbon\Carbon::now()->format('YmdHis');
~~~

## C# 
~~~ CSharp
DateTime.Now.ToString("yyyyMMddHHmmss");
// どんな国のサーバーでも日本時間の現在時刻を取得するなら(Azure Web Apps考慮)
DateTime.UtcNow.AddHours(9).ToString("yyyyMMddHHmmss");
~~~

## Java（7以前）

~~~ java
new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())
~~~

## Java（8以降）

~~~ java
DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now())
~~~

## python
~~~ python
datetime.datetime.now().strftime('%Y%m%d%H%M%S')
~~~


## javascript
https://gist.github.com/froop/962669

~~~ javascript
//現在時刻取得（yyyymmddhhmmss）
function getCurrentTime() {
	var now = new Date();
	var res = "" + now.getFullYear() + padZero(now.getMonth() + 1) + padZero(now.getDate()) + padZero(now.getHours()) + 
		padZero(now.getMinutes()) + padZero(now.getSeconds());
	return res;
}

//先頭ゼロ付加
function padZero(num) {
    return (num < 10 ? "0" : "") + num;
}
~~~

# SQL編
## Oracle / PostgreSQL
~~~ sql
TO_CHAR(CURRENT_TIMESTAMP, 'YYYYMMDDHH24MISS')
~~~

## MySQL
~~~ sql
DATE_FORMAT(NOW(), '%Y%m%d%H%i%S')
~~~

## SQL Server
~~~ sql
Format(GetDate(),'yyyyMMddHHmmss')
~~~


# コマンドライン編
## シェルスクリプト
~~~
date +%Y%m%d%H%M%S
~~~

## コマンドプロンプト
~~~
set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
echo %now%
~~~
スキーマ定義とは？

###スキーマとは？
スキーマという用語について

データベースにおけるスキーマとはデータの構造、性質やほかのデータとの関連、データベースを操作するときのルールや表現法などを定義したもののことです

データベースとはどんなものかをデータベースの要素を3つに分けて、それぞれを定義することによって、全体を定義しようと考えた
それが3層スキーマです

「スキーマ」という単語は構造と読みかえても大丈夫です

3つの分け方は、「外部スキーマ, 概念スキーマ, 内部スキーマ」という分け方と「概念スキーマ, 論理スキーマ, 物理スキーマ」という分け方が有名です

スキーマという概念を持っているデータベースは、「Oracle, SQLServer, PostgreSQL」です
同じ「スキーマ」という用語が出てきますが、その意味はデータベースによって異なります。


###3層スキーマとは？
「外部スキーマ, 概念スキーマ, 内部スキーマ」

1. 外部スキーマ
概念スキーマで定義された論理データから必要なデータを取り出したもの
ユーザーから見たデータベース
ビューに相当する

2. 概念スキーマ
DB上の論理データ
DBに保持するデータの要素およびデータ同士の関係を定義する
開発者から見たデータベース
論理設計で設計を行う

3. 内部スキーマ
概念スキーマで定義された論理データを具体的にどのようにDBMS内部に格納するかを定義する
DBMSから見たデータベース
物理設計で設計を行う
Selenideをやってみる

## はじめに
[Seleniumをやってみる](https://qiita.com/hirotatsuuu/items/6a87df10c635a37ade16)の続きです。
Selenideとやらを動かしてみます。

Selenide公式: http://selenide.org/

## Selenideとは
Seleniumの機能をラッパーしたブラウザによるUIテストツール

## Mavenの設定ファイルの修正
- pom.xmlに依存ライブラリを追記

```pom.xml
<dependency>
    <groupId>com.codeborne</groupId>
    <artifactId>selenide</artifactId>
    <version>4.12.1</version>
</dependency>
```
- 参考
    - https://search.maven.org/#artifactdetails|com.codeborne|selenide|4.12.1|jar

## サンプルコードの作成
- chromedriverのダウンロードは[Seleniumをやってみる](https://qiita.com/hirotatsuuu/items/6a87df10c635a37ade16)を参照してください

```SelenideTest.java
package com.example;

import org.junit.Test;

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.WebDriverRunner;

public class SelenideTest {

	@Test
	public void isSelenidePage () {
		Configuration.browser = WebDriverRunner.CHROME;
		final String PATH = "(chromedriverの格納されている場所)";
		System.setProperty("webdriver.gecko.driver", PATH);

		Selenide.open("http://selenide.org");
		Selenide.$("div.short.wiki h3").shouldHave(Condition.text("What is Selenide?"));
		Selenide.$$(".quicklinks ul.gray-boxes li").shouldHaveSize(5);
	}

}
```
- SelenideTest.javaを実行するとChromeブラウザを開いてSelenideの公式ページにアクセス後、テストを実行する

## Selenideによるテストコードの作成
- テスト対象ファイルは[Seleniumをやってみる](https://qiita.com/hirotatsuuu/items/6a87df10c635a37ade16)を参照してください
    - WebContent直下にあるindex.jspをテスト対象とする
    - tomcatにデプロイ後、http://localhost:8080/maven_sample/index.jsp へアクセスして画面が表示されることを確認する
- テストファイルの作成

```SelenideTest.java
package com.example;

import org.junit.Test;

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.WebDriverRunner;

public class SelenideTest {

	@Test
	public void test () {
		Configuration.browser = WebDriverRunner.CHROME;
		final String PATH = "(chromedriverの格納されている場所)";
		System.setProperty("webdriver.gecko.driver", PATH);

		Selenide.open("http://localhost:8080/maven_sample/index.jsp");

		Selenide.$("h1").shouldHave(Condition.exactText("Fruits Shop"));

		ElementsCollection lists = Selenide.$$("li");

		lists.shouldHaveSize(3);

		lists.get(0).shouldHave(Condition.text("Apple"));
		lists.get(1).shouldHave(Condition.text("Banana"));
		lists.get(2).shouldHave(Condition.text("Cherry"));
	}

}
```

## おわりに
なんとかSelenideを使えました。
Seleniumをちょっと簡単に使えるようになった感じですね、、
参考になれば幸いです。

以上、JUnitからSelenideまで単体テストツールを動かしてみました。

## まとめ
- [EclipseでMavenによるプロジェクト作成からJUnitテストまでをやってみる](https://qiita.com/hirotatsuuu/items/234d1d511382fa1a9542)
- [DbUnitをやってみる](https://qiita.com/hirotatsuuu/items/7413ac25d0244a89a792)
- [Mockitoをやってみる](https://qiita.com/hirotatsuuu/items/586e1f2f6bdd408dbafc)
- [Seleniumをやってみる](https://qiita.com/hirotatsuuu/items/6a87df10c635a37ade16)
- [Selenideをやってみる](https://qiita.com/hirotatsuuu/items/e2db0dde99f477d2ff3e)
PowerShell で XML を扱う時に名前空間がついている事に気づかずはまった

[ブログからの転載](http://1bed.allright.life/?p=2687)

XML を読み込んで XPath を使って特定の要素を取得する、至って普通のことをやっているつもりだったけど、何故か取得できずハマった。言い訳をいうときっと夜中に作業をしてたからだと思うｗ


## ネームスペースなし

```powershell
PS> $xml = @"
<?xml version="1.0" encoding="utf-8"?>
<root id="0000001" >
    <items>
        <item name="Name1">ほげ1</item>
        <item name="Name2">ほげ2</item>
        <item name="Name3">ほげ3</item>
    </items>
</root>
"@

PS> $docXml = [xml]$xml
PS> $docXml.SelectNodes('//item[@name="Name1"]')
name  #text
----  -----
Name1 ほげ1  
```

こうなる予定でした


## ネームスペースあり

```powershell
PS> $xml = @"
<?xml version="1.0" encoding="utf-8"?>
<root id="0000001" xmlns="http://tempuri.org/hoge.xsd">
    <items>
        <item name="Name1">ほげ1</item>
        <item name="Name2">ほげ2</item>
        <item name="Name3">ほげ3</item>
    </items>
</root>
"@

PS> $docXml = [xml]$xml
PS> $docXml.SelectNodes('//item[@name="Name1"]')

```
なにもない... 

ちなみに Node を辿ることは可能

```powershell
PS> $docXml.root.items

Name            : items
LocalName       : items
NamespaceURI    : http://tempuri.org/hoge.xsd
Prefix          : 
NodeType        : Element
ParentNode      : root
OwnerDocument   : #document
IsEmpty         : False
Attributes      : {}
HasAttributes   : False
SchemaInfo      : System.Xml.XmlName
InnerXml        : <item name="Name1" xmlns="http://tempuri.org/hoge.xsd">ほげ1</item><item name="Name2" xmlns="http://tempuri.org/hoge.xsd">ほげ2</item><item nam
                  e="Name3" xmlns="http://tempuri.org/hoge.xsd">ほげ3</item>
InnerText       : ほげ1ほげ2ほげ3
NextSibling     : 
PreviousSibling : 
Value           : 
ChildNodes      : {Name1, Name2, Name3}
FirstChild      : item
LastChild       : item
HasChildNodes   : True
IsReadOnly      : False
OuterXml        : <items xmlns="http://tempuri.org/hoge.xsd"><item name="Name1">ほげ1</item><item name="Name2">ほげ2</item><item name="Name3">ほげ3</item></items>
BaseURI         : 
PreviousText    : 
```

解決方法は XmlNamespaceManager を使う

```powershell
PS> $NsMgr  = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $docXml.NameTable
PS> $NsMgr.AddNamespace('d',  $docXml.DocumentElement.GetAttribute('xmlns'))
PS> $docXml.SelectNodes('//d:item[@name="Name1"]', $NsMgr)
name  #text
----  -----
Name1 ほげ1  
```
10.4-RELEASE で security/acme-client が標準オプションでは正しく動作しない

#対策結果
libressl 込みで build すると幸せになれる😊

#内容
OS に組み込み済みの OpenSSL 1.0.1u-freebsd だと初期導入は可能だが、証明書更新時に失敗😱する__コト__がある。
<ぼそ>11.1-RELEASE の OpenSSL 1.0.2k-freebsd でも同様の事案が発生する__トキ__もあった</ぼそ>

#手順
/etc/make.conf ファイルに libressl を利用するように設定ファイルに記述する。

```text:/etc/make.conf
DEFAULT_VERSIONS+=ssl=libressl
```
2018/6/6 追記
libressl を default 指定すると、OpenSSL を要求する ports に当然影響を及ぼす。
具体例：ftp/curl
以下のように強制的に OpenSSL を利用しないように設定する事で回避する。

```text:/etc/make.conf
ftp_curl_SET=GNUTLS
ftp_curl_UNSET=OPENSSL
```

追記ここまで

あとは、普通に acme クライアントの ports をインスコすると幸せ😉になれる。

```text
# cd /usr/ports/security/acme-client
# make install
Composerをバージョン指定してダウンロード・インストールする方法

バージョン指定の方法について日本語が無いので、メモ用含めた目的で作成。

以下のサイトを参照
https://getcomposer.org/download/

以下のコマンドをターミナルで実行

```
  php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```

```
  php -r "if (hash_file('SHA384', 'composer-setup.php') ===  '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
```

```
  php composer-setup.php --version=1.5.2
```

```
  mv composer.phar /usr/local/bin/composer
```

```
  sudo mv composer.phar /usr/local/bin/composer
```
Azure CLI2.0でIoT Hubのデバイス登録をする

# コマンド

Azure Portalのクラウドシェルでも実行可能

```bash

# デバイス登録をする
az iot device create --hub-name MyIotHub --device-id MyDevice


# デバイスの接続文字列を取得する
## 指定したデバイスのプライマリキーの接続文字列を取得する
az iot device show-connection-string --hub-name MyIotHub --device-id MyDevice

## トップ100デバイスの接続文字列を取得する
az iot device show-connection-string --hub-name MyIotHub --top 100


# デバイスのプロパティ（デバイスツインのetag)を更新する
az iot device update --hub-name MyIotHub --device-id MyDevice --set property1.property2=value1

```


# 参考
* [az iot device | Microsoft Docs](https://docs.microsoft.com/en-us/cli/azure/iot/device)

* [Working with the IoT Hub using Azure Command Line Interface (CLI 2.0) – Sander van de Velde](https://sandervandevelde.wordpress.com/2017/04/02/working-with-iot-hub-using-azure-command-line-interface/)
DeviceSetupManager でエラーを吐きまくる……　プリンタのドライバ入れ直したっけ？？？

プリンタドライバ再インストールした時だと思うのですが
なんかイベントID　152でエラーが出まくる
```
デバイス ノード 'SWD\PRINTENUM\WSD-c7513430-96c9-456c-8faf-55ba51fb18f3.003e' の削除に失敗しました。エラー コード: 0x800F020B。
```

イベントID　123でも警告が……
```
デバイス 'SWD\PRINTENUM\WSD-C7513430-96C9-456C-8FAF-55BA51FB18F3.003E' でのドライバーのクエリ/ダウンロード/インストールで DSM サービスが 21 秒遅れました
```

うーん　問い合わせた方が良いのかな……
GSuiteの同一ドメイン(社内)でのGoogle Hangouts のクローラーで躓いた話

## 経緯
クローラーを弾く処理を書いてるときに、 社内アカウントで `GoogleHangouts` でリンクを踏むとで異なるUAで2度飛んで来てた

## 原因
クローラーの判定は[woothee](https://github.com/woothee/woothee)を使ってUAで見てたけど、通常のchromeのように振る舞っていてクローラーとしての判定が効いておらず、また`GoogleHangouts`自体、ユーザーがリンクを踏んだ際か2度アクセスが飛んでいるみたい。
あと、通常のユーザー(ドメインが `gmail.com` になってるとき)の場合は同一のUAだが、同一GSuite内のドメインだとUAが変わってる。
(Google側でなにか検知でもしてるのかな？)
~~実際なんでこんな動きをするのかはよくわからない。~~

ちなみに同一GSuite内のドメインだとこんなUAが刺さってた
```
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 Google (+https://developers.google.com/+/web/snippet/)
```
`Google (+https://developers.google.com/+/web/snippet/)` て部分が付加されており、またhostもユーザーのアクセス元のIPとは違うところから飛んで来てる

## 対策
同一GSuite内のドメイン の場合は、
`Google (+https://developers.google.com/+/web/snippet/)` 
がUAに含まれているので、それを見てやればいけそうだけど、通常のユーザー(ドメインが `gmail.com` になってるとき)はUA全く一緒だったから、弾くの難しそうだね・・・
.NETとCache'のODBとしての連携（概要）

SQLではポリモーフィングが非常にしづらいので、SQLを書かずにデータベースを扱う方法。

VisualStudio(VS), Cache'がインストールされていることが前提。

手順をまとめると
１：Cache'と.NETを結びつけるために、.NET上で動くクラス（プロキシクラスと呼ばれている）をCache'から出力する。
http://docs.intersystems.com/cache20171j/csp/docbook/DocBook.UI.Page.cls?KEY=GBMP_proxy#GBMP_proxy_generating

２：VSで項目に追加する。
３：クラスとして宣言し、Newしてインスタンスを生成し、Saveで保存する。
４：保存されたデータは既にデータベースになっている。

☆ここからが本題
ODBが普通のプログラムと違うところは
A：VS上でNewすると、`%Persistent`から継承したプロキシクラスでは、ディスク上にインスタンスが生成される（つまり、データテーブルに、新しい行が追加されるのと等価）→一度生成したインスタンスは明示的にDeleteするまで消えない。ディスク空間をあたかもメモリ空間のように使える。

B：生成したインスタンスには一意のIDが割り振られる。

C：過去に保存したデータを呼び出すときは、`OpenID()`という関数でIDを指定して呼び出すか、あるいはテーブルを丸ごと読み出して、その中から検索するかのいずれかである（次回以降に詳述）
vagrantでマウントした領域でphpからセッションファイルが読めない場合

# 環境

- Windows10
- PHP 7.1

# 事象

CakePHPなどでvagrant経由でマウントした領域にセッションファイルを生成した場合にファイルが読み込めずにエラーとなってしまう

# 対処方法

ファイルのオーナーがvagrantのままだと発生するので、Vagrantfileで権限を指定する

```
  config.vm.synced_folder "./", "/owner_apache", owner: 'apache', mount_options: ['fmode=777','dmode=777']
```
Laravel でデータの受け渡し

次のページを参考にしました。
[データの受け渡し](https://www.ritolab.com/entry/48#aj_CCCC_5)

完成すると次のような表示がされます。
![laravel_jun0502.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1c87351c-6fa3-5ead-dbe4-9f4f0ce45da6.png)

<ol>
<li>プロジェクトの用意</li>

```bash
laravel new sample_project
cd sample_project
php artisan make:controller HelloController
```

>新規に作成しないで、こちらで作成したプログラムを改造することもできます。
[Laravel で HelloWorld](https://qiita.com/ekzemplaro/items/c74e7431a8a90e2feb03)

<li>app/Http/Controllers/HelloController.php の編集</li>

```php:app/Http/Controllers/HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
  public function index()
  {
    // 配列の初期化
    $data = array();

    // データ格納
    $data['name'] = '鈴木';
    $data['message'] = 'こんにちは';

    // 現在日時
	date_default_timezone_set('Asia/Tokyo');
	$data['today'] = date('Y年m月d日 H:i:s');

    return view('hello', $data);
  }
}
```

<li>resources/views/hello.blade.php の作成</li>

```php:resources/views/hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My First Page</title>
</head>
<body>
  <p>{{$name}}さん</p>
  <p>{{$message}}</p>
  <p>現在は {{$today}} です</p>
<p>Jun/05/2018</p>
</body>
</html>
```

<li>routes/web.php の編集</li>

最後に一行を加えます。

```php:routes/web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('hello', 'App\Http\Controllers\HelloController@index');
```

<li>サーバーを動かします。</li>

```bash
php artisan serve --host 0.0.0.0
```

ブラウザーで、 http://localhost:8000/hello にアクセスします。

冒頭の画面が表示されます。

</ol>

## 次の環境で確認しました。

```text
$ uname -a
Linux iwata 5.13.0-27-generic #29-Ubuntu SMP Wed Jan 12 17:36:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.8, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.8, Copyright (c), by Zend Technologies

$ php artisan --version
Laravel Framework 8.82.0

```
自動運転シミュレータ CARLA の Windows 版ビルド手順について


1. Tool をダウンロードしてくる。
	※ [How to build CARLA on Windows](http://carla.readthedocs.io/en/latest/how_to_build_on_windows/) に記載されている各種ツールを Install してください。
	※ make.exe に関しては、先に本体を展開後、依存ファイルを本体を置いているフォルダに上書きコピーする。

2. Visual Studio 2017 の x64 版のコンソールを立ち上げて
   make.exe のパスを環境変数に設定してください。
   set Path=(make.exeを置いているフォルダパス);%Path%

	※ Install 時に cmake の環境変数の設定をしていない場合は、環境変数 Path に cmake.exe のパスを設定してください。
   set Path=(cmake.exeを置いているフォルダパス);%Path%

3. Protoc.bat から protobuf をビルドする。
	※ [ソースコードからのビルドに対応したバッチ](https://gist.github.com/marcgpuig/57946f9b684f64e5f08487089c437ea3)
	※ パスに日本語があると、Visual Studio 2017 でのビルドに失敗するケースがあるので注意する。

4. boost のインストール
   ※ (x64 版をダウンロードすること)
   ※ なるべくなら msi でインストールしておくべき?(パスとかが影響する?)
	※ Utils¥Build フォルダに boost-install フォルダを作成してその中にフォルダをコピーする。

5. carla の root フォルダに戻り make コマンドを実行

6. Unreal¥CarlaUE4 に Util/ContentVersions.txt のメモを確認しつつ、ファイルを取得する。
   取得後、Unreal¥CarlaUE4 に Content フォルダを作成後、その中に展開したファイルを入れる。

   ※ 0.8.2 なら https://drive.google.com/open?id=1llrBkZDvJmxXYh4r3jz0wuwz8Q8jRQeZ
      にアクセスしてファイルをダウンロードする。
   ※ tar.gz 形式なので、7-zip 辺りの解凍ソフトを用意すること。
   ※ ファイルは 10GB 程あるので 空き容量に注意すること。

7. Unreal/CarlaUE4/CarlaUE4.uproject を選択して carla を立ち上げる。
   ※ boost のパスがうまく通らなかったので、
      Unreal/CarlaUE4/Plugins/Carla フォルダの 
      CarlaServer¥lib フォルダに boost のライブラリを追加した。


Unreal Engine 上での実行画面
![calra.png](https://qiita-image-store.s3.amazonaws.com/0/46426/55022f0a-45c2-a911-0a1a-36504eec6aa2.png "calra.png")


参照先

[ドキュメント]
(http://carla.readthedocs.io/en/latest/)

[Github]
(https://github.com/carla-simulator/carla)

[キー操作一覧]
(http://carla.readthedocs.io/en/latest/simulator_keyboard_input/)

[自動車マテリアルアセットの適用(Windows のみ)]
(http://carla.readthedocs.io/en/latest/epic_automotive_materials/)

[Python による自動運転操作(ルール作成)]
(http://carla.readthedocs.io/en/latest/benchmark_creating/)
[Python による自動運転操作(実行)]
(http://carla.readthedocs.io/en/latest/benchmark_start/)

[独自道路作成に関して]
(http://carla.readthedocs.io/en/latest/map_customization/)

[(Unreal Document)自動車モデルサンプルのいじり方]
(https://docs.unrealengine.com/en-us/Engine/Physics/Vehicles/VehicleUserGuide)

[(Unreal Document)Blueprint Spline Editor Tool Reference]
(https://docs.unrealengine.com/latest/INT/Engine/BlueprintSplines/Reference/SplineEditorTool/index.html)
PHPでバックスラッシュを含む文字列の扱い

変数同様シングルクォートで囲えば展開されないと思っていたが、間違えていた。

```
var_dump("\n");// string(1) "
"
var_dump('\n');// string(2) "\n"
var_dump('\あ');// string(4) "\あ"
var_dump('\\あ');// string(4) "\あ"
var_dump('\\');// string(1) "\"
var_dump('\\\\');// string(2) "\\"

var_dump('\');// syntax error
var_dump('\\\');// syntax error
```

バックスラッシュ2つでバックスラッシュ1つになる様子

* バックスラッシュ含むJSONを扱う例

```
$str1 = '[{"pattern":"\\s*","replacement":""}]';
$str2 = '[{"pattern":"\\\s*","replacement":""}]';
```

$str1は`{"pattern":"\s*","replacement":""}`なのでエラー

```
var_dump(json_decode($str1));// NULL
var_dump(json_last_error_msg());// string(12) "Syntax error"
```

$str2は`{"pattern":"\\s*","replacement":""}`なので成功

```
var_dump(json_decode($str2));

/*
array(1) {
  [0]=>
  object(stdClass)#1 (2) {
    ["pattern"]=>
    string(3) "\s*"
    ["replacement"]=>
    string(0) ""
  }
}
*/
```

# input等の入力欄での扱い

バックスラッシュを3つ入れれば良いのかと思い
input等の入力欄に`[{"pattern":"\\\s*","replacement":""}]`を入れるとパースエラー
入力値のバックスラッシュは適切に処理されるので
ダンプをとると`"[{"pattern":"\\\s*","result":""}]"`
ダンプで3つ出てパースエラーということは`\\\\\s`のように変換されている
よって入力値は素直にJSON本来の形式で良い

* ソースコード上では`'[{"pattern":"\\\s*","result":""}]'`

* input等の入力欄で`'[{"pattern":"\\s*","result":""}]'`

    (`$input === '[{"pattern":"\\\s*","result":""}]'`はtrueになった)
リンククリックでNEM送金を実行するコントラクト

リンククリックのタイミングで仮想通貨NEMを送金するコントラクトサンプルです。
もちろんHTML側を加工することでボタンにもタイマーにすることも可能です。

注意点としては、秘密鍵直埋めなので汎用的に利用することはできません。
また、連打すればその回数分送金されてしまうので、何かしらのセキュリティ対策は必要です。

それ以上にNEMの可能性を感じて欲しい点として
自分でサーバを準備できる人であればこの程度分量のプログラムで送金プログラムが書けてしまいます。自分だけがアクセスできないような場所で送金プログラムを書くことができれば、もうそれはウォレットですよね。
最近ではサーバレス環境なども増えてきていますので、今後もいろいろな送金方法をご紹介していきたいと思います。

```js:nodejs


var FAUCET_PRIKEY = "秘密鍵";
const express    = require('express');
const nem        = require("nem-sdk").default;

var app = express();
app.use(function(req, res, next){
    res.header("Access-Control-Allow-Origin","*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
})

app.listen(1337);

var NODES = Array(
"http://alice2.nem.ninja",
"http://alice3.nem.ninja",
"http://alice4.nem.ninja",
"http://alice5.nem.ninja",
"http://alice6.nem.ninja",
"http://alice7.nem.ninja"
);

function getEndpoint(){
	
	var node_url = NODES[Math.floor(Math.random() * NODES.length)];
	return node_url;
}

app.get('/tip/account', (req, res,next) => {

	var endpoint = nem.model.objects.create("endpoint")(getEndpoint(), nem.model.nodes.defaultPort);
	let transferTx = nem.model.objects.create("transferTransaction")('NYYYYYYYYYYYYYYYYYYY', 1, "XEMBook tip to @account");
	let common     = nem.model.objects.create("common")("", FAUCET_PRIKEY);
	let transactionEntity = nem.model.transactions.prepare("transferTransaction")(common, transferTx, nem.model.network.data.mainnet.id);
	nem.model.transactions.send(common, transactionEntity, endpoint)

	res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
	res.write("ok");
	res.end();
});



```
awkで文字列の最後のスペースだけをタブやカンマに置換する

`aa bb cc 0.98`のような入力を受け取って、`aa bb cc,0.98`といった感じで最後のスペースだけ別の文字に置換したいとします。
以下のようにしたらできました。

```shell-session
$ echo 'aa bb cc 0.98' |
awk -v OFS=',' '{
  l = length($0);
  for(i=l; i>0; i--){
    if(substr($0, i, 1)==" ") {
      break
    }
  };
  print substr($0,1,i-1), substr($0,i+1,l)
}'
aa bb cc,0.98
```
とにかくサクッとRedmine

# この文書は
とかくめんどくさいRedmineをとにかく簡単に動かすためだけのガイド。

# これだけは知っておけ

コンテナは実行環境というか実行している実体、イメージはコンテナのスナップショット。

# 動かす

dockerをインストールして下のコマンドを実行するだけ。dockerグループじゃない人はsudoしよう。
※(コンテナ名)には好きな名前を指定しよう。

```
docker run -d --restart=always -p 80:3000 -v /repos:/repos --name (コンテナ名) redmine
```

そうするとdockerhubのredmineイメージを持ってきて(コンテナ名)のコンテナとして実行してくれる。--restart=alwaysを指定してあるのでホストを再起動するとコンテナも再起動してくれる。

この時点でホストには/reposができているはずだ。/reposはコンテナ内部の/reposと繋がってるので。Redmineで/repos以下に作ったリポジトリを指定すれば使える。ちなみに/repos:/reposは前がホスト側、後のがコンテナ内。

なお、このオプションだとホストのポート80にアクセスするとRedmineが使える。デフォルトのユーザーとパスワードは両方共adminなのでさっさとログインしてパスワードを変更しよう。

### コンテナを消す

何か気に入らなくてやり直したいときはこれ。

```
docker rm -f (コンテナ名)
```

# 状態を保存

ユーザーとかプロジェクトを作ったら下のコマンドを実行してその状態をイメージに保存しとこう。
※(イメージ名)には例によって好きな名前を指定しよう。

```
docker commit (コンテナ名) (イメージ名)
```

そして「redmine」の代わりに(イメージ名)を指定してdocker-runすればその状態から始められる。

### イメージが要らなくなったら

これで消せる。

```
docker rmi (イメージ名)
```

# リポジトリへのアクセス

Redmineはリポジトリを作ってくれないので手動で作る必要がある。/reposの下にリポジトリを作ってそれをRedmineのプロジェクト設定で指定すれば使える。リポジトリ自体を操作するときはホストで。
Pythonを始める 環境構築

#環境構築　【所要時間　約1時間】

https://qiita.com/kaki_k/items/511611cadac1d0c69c54

windows環境なので↓
https://qiita.com/kaki_k/items/1fff7fefcf26dc4b69bc

インストール時に環境変数に追加のチェックを忘れた。

↓こちらで解決。
https://qiita.com/huushihi/items/c7f578bf51c0017c9076

PyCharm Professional をインストール


#Hello World!!
```
#!/usr/bin/env python
print("Hello World")
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253796/19d4f929-42f9-2643-7c7e-453249cdeea1.png)
OculusGoでUnityChan Toon-Shader 2.0のサンプルプロジェクトをビルドする時の注意とかのメモ

友人がOculusGoを買ってからUnity初めて
「とりあえず、Unityちゃんみてから遊ぶのがいいと思う～」って伝えたら
盛大にビルドエラーで泣いてたので
Unity初心者の方で「【Unite Tokyo 2018】Oculusで作るスタンドアローン・モバイルVRコンテンツ 」
（https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-2018oculusvr-96453609）
の設定周りそのまんまでUnityUnityChan Toon-Shader 2.0をビルドする時の注意点を軽くメモ程度に残して起きます。



■まず問題点
・OculusGoはSinglePass推奨とあるがSinglePassにするとImageEffectsとかPostProcessingのShaderが
「undeclared identifier 'sampler_CameraDepthTexture'」とビルド時にエラーを返す




■とりあえずな回避方法
SinglePassじゃなくMultiPassでビルドする
又は
エラー吐いてるShader削除
（これやると、他のサンプルシーン見ようとしたときに困るかもしれないけど「トゥーンシェーダーのかわいいユニティちゃんをOcuGoでみたい！」ならまずそれでいいと思う）


こんな感じでサンプルプロジェクトのToonShaderのシーンをビルドできるようにさせて落ち着かせました。

ちなみに友人に
「トゥーンじゃなくて普通のスタンダードシェーダーのSDユニティちゃんでもいいじゃん」
って言ったら「なんかかわいくないからやだ」って言ってきてその時眠気MAXな僕はイラッときました（ΦωΦ）

もっとちゃんとした解決方法とかサンプルとか準備したかったですが
これ書いてる僕はとても眠いので一旦このへんで

シェーダー周りは知識不足なのでなにかツッコミありましたらよろしくお願いします！（ΦωΦ）
Charlesを使って本番環境にローカルのファイルを適応する方法

Charlesを使って本番環境にローカルのファイルを適応する方法メモ。

##事前準備

1.Proxy > macOS Proxyにチェックを入れる

2.Proxy >SSL Proxying Setting > Enable SSH Proxyingにチェックを入れる

3.Proxy >SSL Proxying Setting > AddでLocationを追加する
「Host」を「*」にして対象を全てにしておく

##リモートとローカルの設定をする
1.Tools > Map Local > AddでLocationを追加する

2.Map Fromには本番環境の情報を、Map Toにはローカルにあるファイルを選択する

これで、ローカルのファイルを本番完了に適応することが出来る。

##本番環境がhttpsだった場合
Help > SSL Proxying > Install Charles Root Certificateで証明書を発行
*証明書が有効になっているのを確認し、ログインキーチェーンをロックする。

おわり。
Pythonでのメール送信時、smtplib.SMTPで止まる

http://www.statsbeginner.net/entry/2018/02/12/202232

あたりを参考にさせていただき、Pythonでのメール送信を試みるが、

```py
server = smtplib.SMTP(srv_smtp, srv_port)
```

でフリーズしてしまう……。
という場合、SMTPS送信していないか確認する（465番ポートを指定しているなど）。

SMTPSの場合は、

```py
server = smtplib.SMTP_SSL(srv_smtp, srv_port)
```

と、SMTP_SSLにする必要があるようだ。
初心者が学ぶ TypeScript 入門 Ver.0.2 【準備編】

# What is TypeScript?

> TypeScript はマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語である。
(Wikipediaより)

[公式サイト](https://www.typescriptlang.org/)

公式サイトでは node のパッケージとしての提供が記述されていたので、今回も nodeでTypeScript環境を構築してみる。

```terminal
$ npm install -g typescript
```

一度、Nodeについて、簡単に振り返ってみたい。 のでこの Ver.0.2.0　では、Nodeについて書いてみたいと思います。

# node.js　の勉強

- 1. hello world の出力

```js:server.js

const http = require('http');
const server = http.createServer();

server.on('request', function(request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write('hello world');
    response.end();
});

server.listen(3000);

```

```terminal
$ node server.js
```

`http://localhost:3000` とブラウザでアクセスすることで Hello World が表示される。


- 2. ルーティングをやってみる。

```javascript:server.js

const http = require('http');
const server = http.createServer();
let message = '';

server.on('request', function(request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});

    switch (request.url) {
        case '/about':
            message = 'Welcome About Page.';
            break;
        case '/company':
            message = 'Welcome Company Page.';
            break;
        case '/recruit':
            message = 'Welcome Recruit Page';
            break;
        default:
            message = 'Page Not Found';
            break;
    }
    response.write(message);
    response.end();
});

server.listen(3000);

```

`http://localhost:3000/about` や　`http://localhost:3000/company` とブラウザで実行することで 各対応したメッセージ が表示される。

- 2.1 HTMLファイルを読み込んだりする。

```javascript:server.js

const http = require('http');
const filSystem = require('fs');
const server = http.createServer();
let message = '';

server.on('request', function(request, response) {
    filSystem.readFile( __dirname + '/service.html', 'utf-8', function(error, data) {
        // エラー発生時
        if (error) {
            response.writeHead(404, {'Content-Type' : 'text/plain'});
            response.write('page not found22');
            return response.end();
        }
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write(data);
        response.end();
    });
});

server.listen(3000);

```

# まとめ

ひとまずここまでの作業、としておく。続きは明日かな。

明日は、nodeでWebアプリケーションを作ってみて、実際にTypeScriptを入れてみたプロジェクトを作ってみるつもりです。

# 宣伝

転職をきっかけにいろいろな試みをやってます。

## ほぼ日AWS

[ほぼ日AWS](https://ikkitang1211.hatenablog.jp/archive/category/%E3%81%BB%E3%81%BC%E6%97%A5AWS)

AWSの各ソリューションについて 「このソリューションはどういうもの？」 って観点でまとめてみたものです。

## もくもく独書 for Swift実践入門

[もくもく独書 for Swift実践入門](https://ikkitang1211.hatenablog.jp/archive/category/Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80)

Swift実践入門の書籍を毎日読みながら必要に応じてコードを書いてまとめていっているものです。
Windows版Python（だけ？）でpip install dotenvするとエラー

`$ pip install dotenv`

すると、こんなエラーで怒られる。

    AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'

ググった時に最初見落としてしまったが、Stack Overflowで普通に挙がっている。

https://stackoverflow.com/questions/49328525/pip-install-dotenv-error-code-1-windows-10

`$ pip3 install python-dotenv`
もしくは
`$ pip install python-dotenv`

ただそれだけで解消。
SVGデータをwebfontにする方法

[icomoon.app](https://icomoon.io/app/#/select)を使ってSVGデータをwebfontにする方法メモ。

##事前準備
・データはアウトラインをとってSVGで保存

##webfontにする
[icomoon.app](https://icomoon.io/app/#/select)を使ってwebfontに変換する

1.Import IconsでSVGをインポート

2.webfontにしたいデータを選択

3.Generate FontでSVGにするデータを確認、Download

##使い方

１.ダウンロードしたデータの「fonts」ファイルと、「style.css」を任意の場所に移動、読み込み

２.適応したい要素にclassを付与する

おわり。
nuxt-community/express-templateが1年以上ぶりに更新されたので差分だけ追う #nuxtjs #vuejs

// 自分も1年以上ぶりに更新する形に...

Vue.js/Nuxt.jsを使うときは構築するのが容易なので、vue-cliから使えるテンプレートをよく使っています。

その中の一つにexpress-templateというのがあり、このテンプレートが１年以上ぶりに更新され、~~比較的破壊的に更新されるという事件~~もといアップデートがあったので差分だけ追います。

ざっくりと修正されているのは以下のところです。


- [backpackでbuildしていたものをnuxt onlyに 修正](https://github.com/nuxt-community/express-template/pull/99/files#diff-ebf2741126a75bcd0ccbf8df09b0f0fdL8)
- [nuxtをmiddleware, serverをexpressにしていた部分](https://github.com/nuxt-community/express-template/pull/99/files#diff-4d45704d4fa2fcdc135e99c197c05215L20)
をnuxtのみにし、[expressはserverMiddleware Propertyに修正](https://github.com/nuxt-community/express-template/pull/99/files#diff-ab6b79105e8be7d546b7510a53d2dd71R38)
- `vue init nuxt-community/express-template`でscaffoldした際に[最新版のnuxtが使われるように](https://github.com/nuxt-community/express-template/pull/99/files#diff-ebf2741126a75bcd0ccbf8df09b0f0fdR18)




もともとのexpress-templateはbackpackを使っていたり、比較的てんこ盛りな構成だったと思いますが、今回の更新でだいぶスッキリしたように見えますね。


```
$ tree
.
├── README.md
├── api
│   ├── index.js
│   └── routes
│       └── users.js
├── assets
│   ├── css
│   │   └── main.css
│   └── img
│       └── logo.png
├── components
│   └── Footer.vue
├── layouts
│   ├── default.vue
│   └── error.vue
├── nuxt.config.js
├── package.json
├── pages
│   ├── _id.vue
│   └── index.vue
├── plugins
│   └── axios.js
├── static
│   └── favicon.ico
└── yarn.lock
```



個人的にはサーバをexpress、middlewareとしてnuxtをバインドしている構成が好みだったので、今度からは自前でテンプレートを用意しておこうかなとおもいます。
sublimetextでデータの差分を確認する方法

##まずはプラグインをインストール

1.```Shift``` + ```Command``` + ```P```でPackage Controlを呼び出し

2.「install」と入力して「Package Control: Install Packagde」を選択

3.「Compare Side-By-Side」と入力してEnter

インストール完了！

##データの差分を確認する

1.差分を確認したいデータを開く

2.右クリックで「compare with...」を選択

3.差分確認したいファイルを選択する

確認したいデータが左右に表示され、差分はハイライトで確認できる。

おわり。
Nuxt.jsでPWAを手っ取り早く本番環境で試す手順を雑に紹介する

まずはじめに、現状ではNuxt2でPWAはうまくいきませんのでご注意を。

今回、開発環境は Docker for Mac、本番環境は Heroku を想定しています。
WindowsでVagrant上にDockerを立てる場合はローカルでは別途設定、オプション追加、パスの追加指定が必要となります。

まずは初期ディレクトリ、初期ファイルを作成します。

![スクリーンショット 2018-06-05 0.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/237863/5ff5669b-3eae-a799-8b6f-ba51af03e9f8.png)


```dockerfile:pwatest/nuxt/Dockerfile
FROM node:9

RUN mkdir -p /nuxt
COPY . /nuxt
WORKDIR /nuxt

RUN npm uninstall -g yarn && \
    npm install -g yarn && \
    chmod u+x /usr/local/bin/yarn && \    
    yarn global add nuxt vue-cli create-nuxt-app

ENV HOST 0.0.0.0
EXPOSE 3000
```

```docker:pwatest/nuxt/.dockerignore
node_modules
.nuxt
npm-debug.log
package-lock.json
```

```yml:pwatest/docker-compose.yml
version: '3'
services:
  nuxt:
    build: ./nuxt
    command: yarn dev
    volumes:
      - ./nuxt:/nuxt
    ports:
      - '3000:3000'
```

ターミナルで作業していきます。

```bash
# docker-compose.ymlのあるディレクトリに移動
$ cd pwatest

# コンテナを起動してNuxt.jsプロジェクトの初期化
$ docker-compose run nuxt yarn create nuxt-app
```

対話形式で質問に答えていきます。
下記は一例です。適当でも大丈夫です。

```
? Project name (enter)
? Project description (enter)
? Use a custom server framework (express)
? Use a custom UI framework (bulma)
? Choose rendering mode (Universal)
? Use axios module (yes)
? Use eslint (no)
? Author name (enter)
? Choose a package manager (yarn)
```

```bash
# PWAモジュールのインストール
$ docker-compose run nuxt yarn add @nuxtjs/pwa
```

ファイルを編集します。

```diff:pwatest/nuxt/nuxt.config.js
  modules: [
+   '@nuxtjs/pwa'
  ],
+ workbox: {
+   dev: true
+ },
```

```diff:pwatest/nuxt/Dockerfile
FROM node:9

RUN mkdir -p /nuxt
COPY . /nuxt
WORKDIR /nuxt

RUN npm uninstall -g yarn && \
    npm install -g yarn && \
    chmod u+x /usr/local/bin/yarn && \    
-    yarn global add nuxt vue-cli create-nuxt-app
+    yarn global add nuxt vue-cli create-nuxt-app && \
+    yarn install && \
+    yarn build

ENV HOST 0.0.0.0
EXPOSE 3000
+ CMD ["yarn", "start"]
```

ターミナルで作業します。

```bash
# Nuxtアプリのビルド
$ docker-compose run nuxt yarn run build

# Docker imageのビルド
$ docker-comose build nuxt

# heroku-cliのインストール
$ brew install heroku/brew/heroku

# herokuにログイン
$ heroku login

# コンテナ用のプラグインを追加
$ heroku plugins:install heroku-container-registry

# コンテナにログイン
$ heroku container:login

# アプリの作成（作成されたアプリ名称を控えておく）
$ heroku create

# Nuxtプロジェクトのディレクトリに移動
$ cd nuxt/

# コンテナをデプロイ
$ heroku container:push web -a {your_heroku_app_name}

# コンテナのリリース（2回目以降のデプロイの場合）
$ heroku container:release web -a {your_heroku_app_name}

# ブラウザで確認
$ heroku open -a {your_heroku_app_name}
```

以上でPWAの作成完了です。
スマートフォンでアクセスしてホームに追加すると、次回以降はブラウザではなくPWAとして起動します。

![a0bbyf5p.jpg](https://qiita-image-store.s3.amazonaws.com/0/237863/bfa6cbbd-6322-8ae8-8ec4-f293a1948541.jpeg)
【Android】Deep Linkのdata設定がタスキ掛けされる件

## 概要
Deep Link設定で意図しないURLが反応していたことがあったので、調べて確認しました。

## 事象
```
<data android:scheme="a2kaido" android:host="a2kaido.github.io" android:pathPrefix="/ice" />
<data android:scheme="https" android:host="a2kaido.github.io" android:pathPrefix="/cream" />
```
このような設定の場合に、
`a2kaido://a2kaido.github.io/ice`と`https://a2kaido.github.io/cream`だけでなく、
`a2kaido://a2kaido.github.io/cream`と`https://a2kaido.github.io/ice`に反応してました。

そんなつもりはなかったのに。。

## 公式ドキュメント
https://developer.android.com/training/app-links/deep-linking

公式ドキュメントにも、schemeとhostの設定がタスキ掛けされるように書かれています。
pathPrefixの設定もタスキ掛けされるんですね。

## 回避方法
`<data>`をひとつの`<intent-filter>`の中に書いていたところを、
分割して別々の`<intent-filter>`に書けばよいです。

## サンプルコード
https://github.com/a2kaido/android-deeplink-sample

```xml:AndroidManifest.xml
<activity android:name=".MainActivity">                                                                                                              <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- a2kaido://sample -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="a2kaido" android:host="sample" />
    </intent-filter>

    <!-- a2kaido://a2kaido.github.io/ice -->
    <!-- a2kaido://a2kaido.github.io/cream -->
    <!-- https://a2kaido.github.io/ice -->
    <!-- https://a2kaido.github.io/cream -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="a2kaido" android:host="a2kaido.github.io" android:pathPrefix="/ice" />
        <data android:scheme="https" android:host="a2kaido.github.io" android:pathPrefix="/cream" />
    </intent-filter>

    <!-- a2kaido://a2kaido.github.io/sand -->
    <!-- a2kaido://a2kaido.github.io/witch: no reaction -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="a2kaido" android:host="a2kaido.github.io" android:pathPrefix="/sand" />
    </intent-filter>

    <!-- https://a2kaido.github.io/witch -->
    <!-- https://a2kaido.github.io/sand: go to browser-->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" android:host="a2kaido.github.io" android:pathPrefix="/witch" />
    </intent-filter>
</activity>
```

## 検証方法
adbコマンドでintentを送ると簡単です。

```
adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "a2kaido://sample"
```
MyBatis の文字列比較

MyBatis を使ってて xml で動的SQLの記載で情報が発散していたので実際にどうすればよいか確認中
シングルコーテーション使えるのか？

他のメンバーが確認してダメだったと報告あり．．．
どんな Exception 発生したかは確認できず．．．
いったんは char 型だけど業務仕様として数字しか入らないからシングルコーテーションなしでクリア
また必要になったときに確認予定

```xml
　　 <!-- Exception発生 -->
    select * from table
    <if test="args != '9'">
        where colum = #{args}
    </if> 

　　 <!-- いったんの対応 -->
    select * from table
    <if test="args != 9">
        where colum = #{args}
    </if> 

```
Rictyフォントの文字間隔を修正する

# RictyフォントをWindowsで利用する
[プログラミング用フォントRicty](https://rictyfonts.github.io/)という素晴らしいフォントがあります。
Macではすんなり使えますが、Windowsだとなぜか文字間隔が広くなってしまいました。

また、Vimmerにとってきれいな環境を作ることは至上命題で、Powerlineフォントも入れたいので一緒に解決します。

# なにがだめなのか
[FontForgeで生成した日本語TrueTypeフォント文字幅広すぎ対策](http://itouhiro.hatenablog.com/entry/20140910/font)の方がすべて述べられてますが、fontforgeを通すと文字間隔が広がるようです。
Rictyフォントの作者の方も`os2version_reviser.sh`という修正スクリプトを公開されていますが、自分の環境では効果がありませんでした。

# 環境を準備する
Linux, Mac, WSLなどで以下のプログラムを用意します

- fontforge
- fontforgeのpythonライブラリ
- fonttools

自分はWindowsなので、WSLでUbuntu 18.04を入れて以下のコマンドでサクッとインストールしました。

```
$ sudo apt install fontforge python-fontforge fonttools
```

また、Powerlineフォントを作成する方はfontpatcherをcloneしておきます。

```
$ git clone https://github.com/powerline/fontpatcher
```

# 修正手順
[Rictyのサイト](https://rictyfonts.github.io/)の生成方法に従ってファイルを配置します。
その後、以下のスクリプトを使い、フォントの生成と文字間隔を修正します。

```bash
#!/bin/bash

rm -f Ricty*.ttf Ricty*.ttx Ricty*.ttx.bak
sh ricty_generator.sh auto
if [ -f "fontpatcher/scripts/powerline-fontpatcher" ]; then
  for R in Ricty*.ttf; do
    python fontpatcher/scripts/powerline-fontpatcher "$R"
  done
fi
for P in Ricty*.ttf; do
  ttx -t OS/2 "$P"
  sed -i.bak -e 's,xAvgCharWidth value="940",xAvgCharWidth value="500",' "${P%%.ttf}.ttx"
  mv "$P" "${P%%.ttf}.orig.ttf"
  ttx -m "${P%%.ttf}.orig.ttf" "${P%%.ttf}.ttx"
done
```

# 完成
できあがったフォントをインストールして確認してみましょう。
モンテカルロ木探索を学ぶための書籍

# はじめに

コンピュータ囲碁やコンピュータ将棋に加えて、最近では[RNA合成](https://www.ncbi.nlm.nih.gov/pubmed/29110632)や[ルービックキューブ](https://arxiv.org/abs/1805.07470)にも適用されているMCTS(Monte Carlo Tree Search: モンテカルロ木探索)を日本語で学ぶことができる書籍を紹介します。

# 書籍紹介

## [コンピュータ囲碁―モンテカルロ法の理論と実践―](http://www.kyoritsu-pub.co.jp/bookdetail/9784320123274)

ディープラーニングが囲碁に適用される前の2012年11月刊行の書籍ですが、モンテカルロ木探索や、それに関連するUCTアルゴリズムについて、わかりやすく解説されています。

## [最強囲碁AI アルファ碁 解体新書](http://home.q00.itscom.net/otsuki/alphaGo.htm)

2017年7月刊行の書籍で、2016年1月の[AlphaGoの論文](https://www.nature.com/articles/nature16961)を理解するための一通りの解説があり、モンテカルロ木探索も解説されています。2018年7月に刊行予定の[増補改訂版](https://www.amazon.co.jp/dp/4798157775/)では、[AlphaGo Zero](https://deepmind.com/blog/alphago-zero-learning-scratch/)にも対応しているようです。

## [将棋AIで学ぶディープラーニング](https://book.mynavi.jp/ec/products/detail/id=88752)

2018年3月刊行の書籍で、AlphaGoや[AlphaZero](https://arxiv.org/abs/1712.01815)の手法をコンピュータ将棋に適用した将棋AIが一通り解説されています。モンテカルロ木探索のPythonによる実装も読むことができます。