OmniAICreator/Qiita-1.07M huggingface dataset:
NumPyでしきい値以上の位置を求める

# NumPyで 昇順のデータに対して value >= threshold となる index を求める
## 方法
1. 「np.array < th」の argmin
- 「np.array >= th」の searchsorted
- 「np.array < th」の長さ
- 「np.array < th」の sum
- 「np.array >= th」の where
- for ループで探す
- 「takewhile」 の長さ

7通りの方法で、結果が正しいことを確認

```py3:python
import numpy as np
from more_itertools import ilen
from itertools import takewhile

def find_index(a, ths):
    for i,v in enumerate(a):
        if v >= th:
            break
    return i

n = 10000000
x = np.arange(n)
th = n / 10
print((x < th).argmin())
print(np.searchsorted(x, th))
print(len(x[x < th]))
print((x < th).sum())
print(np.where(x>=th)[0][0])
print(find_index(x, th))
print(ilen(takewhile(lambda i: i < th, x)))
>>>
1000000
1000000
1000000
1000000
1000000
1000000
1000000
```

## 計測
```py3:python
%timeit np.searchsorted(x, th)
%timeit (x < th).argmin()
%timeit len(x[x < th])
%timeit (x < th).sum()
%timeit np.where(x >= th)[0][0]
%timeit find_index(x, th)
%timeit ilen(takewhile(lambda i: i < th, x))
>>>
3.84 µs ± 347 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
10.2 ms ± 215 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
12.5 ms ± 62.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
21.2 ms ± 411 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
43.1 ms ± 635 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
3.36 µs ± 19.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.74 µs ± 75.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```

```py3:python
th = 10
%timeit np.searchsorted(x, th)
%timeit (x < th).argmin()
%timeit len(x[x < th])
%timeit (x < th).sum()
%timeit np.where(x >= th)[0][0]
%timeit find_index(x, th)
%timeit ilen(takewhile(lambda i: i < th, x))
>>>
3.31 µs ± 24.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
9.86 ms ± 28.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
13.1 ms ± 530 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
21.7 ms ± 761 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
46.9 ms ± 1.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
3.76 µs ± 310 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
6.01 µs ± 231 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```

## 考察
- searchsortedがよい
- argmin と forループ ならば、ソートされている必要はない

以上
Google BigQuery と Treasure Data Hive Query での期間の指定方法


日時指定はどの条件でクエリを叩くときも使うけれど、毎回忘れて調べているのでメモ

## Google BigQuery


`log20170420`みたいに毎日のログが入っているとする
ref: https://cloud.google.com/bigquery/docs/wildcard-tables

### 昨日から一週間分のデータを解析したい

```sql:BigQuery 
#standardSQL
SELECT
	*
FROM
  `dataset.log*`
WHERE
  _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 7 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 DAY))
;
```

## Treasure Data Hive Query


ref: https://docs.treasuredata.com/articles/udfs



### 昨日から一週間分のデータを解析したい

`TD_SCHEDULED_TIME()`は`NOW()`と違ってスケジューラーをセットした時間であることがミソ

```sql:TD_HiveQuery
SELECT 
  *
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd',
    'JST') AS date
FROM
  log
WHERE
  TD_TIME_RANGE(
    time,
    TD_TIME_ADD(
      TD_DATE_TRUNC('day', TD_SCHEDULED_TIME(), 'JST'),
      '-7d', 
      'JST'
    ),
    TD_TIME_ADD(
      TD_DATE_TRUNC('day', TD_SCHEDULED_TIME(), 'JST'),
      '-1d', 
      'JST'
    ),
    'JST'
  )
```
チュートリアルを再表示するブックマークレット

を書きました。

## 注意点

既読フラグは通知設定と一緒に管理されていて、このブックマークレットは**HTMLに埋め込まれた**設定を読み込み、既読フラグをリセットして送信します。ページを開いた後に変更した通知設定はここには反映されないので、そういった変更点は失われる可能性があります。

要するに、ブックマークレットを実行する前にページをF5等で再読み込みしておくと安心です。念のため、実行して再読み込みした後にも設定を確認しておくといいかもしれません。

## 使い方

1. Mastodonにログインしてタイムラインを表示する
2. 下のブックマークレットを実行する
3. 「ページを再読み込みしてね！」とダイアログがでたらページを再読み込み
4. Mastodonへ、ようこそ！

```javascript
javascript:(function(){var settings=JSON.parse(document.querySelector('#initial-state').textContent).settings;settings.onboarded=false;fetch('/api/web/settings',{method:'put',headers:{'Content-Type':'application/json'},body:JSON.stringify(settings),credentials:'same-origin'}).then(()=>alert('チュートリアル既読フラグをリセットしました。ページを再読み込みしてね。'));})()
```

実行方法の例：

- お気に入りに追加してから実行する
- アドレスバーにコピペする（頭の `javascript:` が消えてたら足す）
- 頭の `javascript:` を取って開発者ツールで


## ソース

http://let.hatelabo.jp/unarist/let/hJme8ZD-2_Z7
ATOMにPHPXdebugを入れる-Windows10

#用意するもの
・ATOM
　https://atom.io/
・PHP
　http://windows.php.net/download

##PHP設定

コマンドプロントを開き任意のフォルダに移動

```
php -i > out.txt
```
上記のコマンドを入力。



下記のWebサイトにアクセス
https://xdebug.org/wizard.php
out.txt の内容を全てコピーしWebサイトの大きな四角の枠があるので
そこに貼り付けする。
「Analyse my phpinfo() output」
と書いているボタンがあるのでクリックする

すると、Webページが更新されWebページの下のほうに
1 Download と書かれている横にdllファイルを取得するリンクがあるのでダウンロードする
ダウンロードしたファイルをPHPフォルダ内のextフォルダの中にコピー又は切り取り
貼り付けする
私の場合は下記に貼り付けた
`C:\php\ext`

ダウンロードしたリンクの下に
`zend_extension = C:\php\ext\php_xdebug-2.5.1-7.1-vc14-x86_64.dll`
と記述してあるテキストをコピーする
****環境によりテキストの内容が違う場合もある

コピーしたテキストをphp.iniファイルをメモ帳で開きの一番下に貼り付け追記する

続けて以下の内容を先ほど追記した場所より下に追記し保存する
```
[xdebug]
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_connect_back=off
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
```

以降のビルドインサーバーの起動時にはポート番号9000を使うようにする
`php -S localhost:9000`

これで、PHP側の設定は終わる

##ATOMの設定
ATOMを起動しFile -> Settings -> install に移動する
検索する欄があるのでそこに
`php-debug`
と入力し検索結果がでてくるので
出てきた`php-debug`をインストールし念のためATOMを再起動する
ATOMの左下に虫のアイコンが出てくるので
それをクリックする、するとパネルが開く
ブレイクさせたい箇所にソースコードの左側をクリックすると○が表示される
コマンドプロントで○が表示されたソースコードを実行すると
プログラムが停止しATOMで出てきたデバッグ用のパネルでプログラムを制御できる

以上で全ての設定が終了

##参考サイト
http://murayama.hatenablog.com/
ターミナルにgitのbranch名を表示する

gitで管理しているプロジェクトで開発をしている時に、色々なbranchを行き来するといつも自分がいるbranchがわからなくなってしまいます。

その都度、 ` git branch ` をするのは面倒なのでターミナルにbranchを表示するようにしてみます。

add, commitされてないファイルがある場合は、それぞれ色とマーク(! or +)が表示されるようになっています。
` autoload -Uz vcs_info ` より下の行を追加しています。

https://gist.github.com/tackeyy/b2ef6fe2489c52cf887bee4a320c81c4

branchを表示する周りの設定はほぼこちらを参考にしました。
http://tkengo.github.io/blog/2013/05/12/zsh-vcs-info/

この記事はこちらの焼き直しです。
http://tackeyy.com/blog/show-git-branch-on-terminal
Mysqlの特定のカラムを形態素解析して単語を頻出順でソートするワンライナー

# ワンライナー

```bash

# 全体
mysql -h 0.0.0.0 -u user -psecret dbname -Nse 'select column_name from table_name;' | docker run -i -a STDIN -a STDOUT tsutomu7/mecab | cut -f 1 | sort | uniq -c | sort -r -n

# 名詞だけ抽出
mysql -h 0.0.0.0 -u user -psecret dbname -Nse 'select column_name from table_name;' | docker run -i -a STDIN -a STDOUT tsutomu7/mecab | awk '(index($2,"名詞") != 0) {print $1}' | sort | uniq -c | sort -r -n
```

## requirement

- mysqlがローカルで立ち上がっている
- dockerが入っている

## 解説

1. mysql -Nseでインラインでmysqlのクエリを標準出力
2. tsutomu7/mecabでmecabのコマンドを実行
3. 必要な単語を抽出
4. ソートし、 uniq -c で重複をカウント
5. sort -r -n で数字で逆順出力
シンボリックリンクを作る (パラメータの順番 → ln -s 実体ファイルのパス 作成するシンボリックリンクのパス)

ln コマンドのパラメータの順番を忘れがちなので資料として残しておく。

## 定型文

```sh
ln -s 実体ファイルのパス 作成するシンボリックリンクのパス
```

## 例

```
$ ln -s /home/nnnn/foo/bar/.vimrc ~/.vimrc

$ ls -l ~/.vimrc
lrwxrwxrwx 1 nnnn gggg 29  4月 20 10:08 /home/nnnn/.vimrc -> /home/nnnn/foo/bar/.vimrc
```

## Usage

```sh
$ ln
usage: ln [-Ffhinsv] source_file [target_file]
       ln [-Ffhinsv] source_file ... target_dir
       link source_file target_file
```
rubyでI/FのMACアドレスを取得する

```ruby
require 'socket'

# バイナリString(6octet)で返す
def if_hwaddr(if_name)
  sockaddr = Socket.getifaddrs
                   .select{|a| a.name == if_name.to_s}
                   .map(&:addr)
                   .find{|a| a.pfamily == Socket::PF_PACKET}
                   .to_sockaddr
  sockaddr[-6..-1]
end

# 文字列(16進、":"なし)で返す
def if_hwaddr_str(if_name)
  if_hwaddr(if_name).unpack('H*')[0]
end
```

```
if_hwaddr_str('eth0') #=> "382e4eb312cd"
```
1つのサーバーで2つのmastodonインスタンスを動かそうとした話とredis周りのバグっぽいなにか

# これは何か
1つのサーバーで2つのmastodonインスタンスを動かそうとして苦労した話と動かすための方法

# はじめにやったこと
１つのpostgres, 1つのredisで2つのmastodonインスタンスを動かそうとした。

postgresはDBとユーザー情報を分け、redisはコメントアウトされていたDBの設定を有効にしてDB0とDB1で分けた

# 起こった問題
起動するものの、streamingにおいて2つのPost, LocalTimeline, 通知が混ざった

リロードするとデータは正しいものが表示されるのでstreaming/index.jsのバグと踏んで確認した

# streaming/index.jsの挙動とバグっぽいなにか
streaming/index.jsは認証時にpostgresを参照し、データ自体はredisのみを参照しているようだった。
redisClientの設定で、DBの指定がされていないことを確認したので少なくともここがバグ1つめ。
DBを指定したものの、状況は改善しなかった。
実際詳しく検証すればおそらく変更したほうに古いほうからの流入は無くなる結果が得られたかもしれないが確認はしていない。

# 想定
streamingではなく、メインのAPIのほうがredisに投げ込む際に無条件でredisのDB0を参照していると考えた。ここは未確認なので完全にカンであてているだけ。

# 解決策
さすがにhostやportは有効だとおもったので、redisを別で立ててportをずらした。
結果無事2つのインスタンスが1つのサーバーで動いた。

# 結局何すればいいの？

- postgresはDB分割で1つのDBをつかっていい
- redisはインスタンスごとに立てる必要がある

# 環境
commit 5ce8a1811abbb304a6cf92616a9db4fb3cac89ee
2017/04/19 の夜22時くらいにpullしたもの

# 追記2017/04/22
直しました。本家にはプルリク送ってるとこですが急ぎで欲しい人はどうぞ。

https://github.com/dasoran/mastodon
concat || difference between Oracle and PostgreSQL



# same function different result ...

## Oracle

```sql
 a(varchar2) not null
 b(varchar2) := null
```
 a || b  = <font color=blue>a</font>


## PostgreSQL

```sql
 a(varchar) not null
 b(varchar) := null
```

 a || b  = <font color=red>null</font>

... :cry: 

 concat(a,b) = <font color=blue>a</font>

... :relaxed:  

cf. https://www.postgresql.org/docs/current/static/plpgsql-porting.html
Ruby Install Mac



```
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir -p ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

```.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```


```
$rbenv install 2.4.0
$rbenv local 2.4.0
$rbenv rehash 
```

## 参考

http://qiita.com/emadurandal/items/a60886152a4c99ce1017
MySQLのクエリログに色を付ける


[MySQLのクエリログに色を付けるスクリプト myloghi ](https://github.com/grohiro/dotfiles/blob/master/bin/myloghi)作った。

![スクリーンショット 2017-04-18 18.18.49.png](https://qiita-image-store.s3.amazonaws.com/0/126845/29eb3bee-d7bc-b984-65b4-a0564fd5d5ac.png "スクリーンショット 2017-04-18 18.18.49.png")

クエリログを使ってデバッグとか調査するとき見にくいなと思っていたので。

標準入力から読み込んでANSIエスケープコードで色付けしているだけなので `tail` と組み合わせて使う。


- PrepareやConnect, Quitなどのログは削除
- トランザクション系のログは赤文字
- SELECT 文の from _table_ は水色
- クエリの日時は緑

## Install

```bash
$ curl https://raw.githubusercontent.com/grohiro/dotfiles/master/bin/myloghi > myloghi
$ chmod 755 myloghi
```

## Usage

```bash
$ tail -f query.log | myloghi
```
STUN / TURNのURI構造

## はじめに
日本語のSTUN/TURNに関わる情報が少ないので、書いてみました。
ここではあくまで、STUN / TURNを使いたい時のURIの文法を紹介します。

### STUN / TURNのプロトコルを理解したい場合
以下を参考にしてください。

* そもそも STUN / TURN って何だっけ
  * [【初心者向け】STUN/TURNサーバをざっくり解説してみた](http://qiita.com/okyk/items/a405f827e23cb9ef3bde)
* TURN周りのプロトコルについて
  * [TURN-TCP (TCP to UDP) について](http://qiita.com/voluntas/items/fd5d633a10272720978d#tcp-to-udp)
* TLS / DTLS、セキュリティ全般について
  * [WebRTCセキュリティレポート](http://webrtc-security.github.io/report_ja/)

## STUN
それぞれportは省略できます。

* UDPまたはTCP

```js
stun:<host>:<port>
```

* TLS-over-TCP

```js
stuns:<host>:<port>
```

## TURN
クライアント-TURN間のプロトコル別URIです。
こちらもそれぞれportは省略できます。
プロトコルを指定する必要がないのであれば、`?transport=XXX`も省略できます。

* UDP

```js
turn:<host>:<port>?transport=udp
```

* TCP

```js
turn:<host>:<port>?transport=tcp
```

* DTLS-over-UDP

```js
turns:<host>:<port>?transport=udp
```
RFC7065には "in the future, DTLS-over-UDP"とあるので、この時点ではこの書き方も一応作っておいた、くらいなのでしょう。

* TLS-over-TCP

```js
turns:<host>:<port>?transport=tcp
```

## 参考
* [RFC7064](https://tools.ietf.org/html/rfc7064)
  * URI Scheme for the Session Traversal Utilities for NAT (STUN) Protocol
* [RFC7065](https://tools.ietf.org/html/rfc7065)
  * Traversal Using Relays around NAT (TURN) Uniform Resource Identifiers
* [RFC5389](https://tools.ietf.org/html/rfc5389) 
  * Session Traversal Utilities for NAT (STUN)
* [RFC5766](https://tools.ietf.org/html/rfc5766)
  * Traversal Using Relays around NAT (TURN)
Mac & Clipy | スクリーンショットをクリップボードの履歴に保存する

# 環境設定

2017年4月現在、v1.1.3ではベータ機能という扱いだ。
環境設定で有効にしよう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/9175a7cc-5d5e-cfbd-4313-6c9a0f885d4a.png)

# 画面

`cmd + shift + ctrl + 4` でスクリーンショットを撮ると、Clipyの履歴に加わる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/7190c5bd-5111-841f-7c98-e39e58b3309e.png)

すごい良い機能なのでぜひ、メジャーバージョンに取り入れてほしい。Clipy万歳。

# 環境

- Clipy v1.1.3
- MacOS Sierra








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
技術英語 > Does size matter? / Does the size matter?

@ http://thecodist.com/article/the-six-goals-of-every-programming-project

> Security and performance are also quality issues. If the app **dies** all the time, is horribly slow and your users are being hacked, none of the wonderful features or design **matter**. 

良いサービスであっても快適に使える速度でないとユーザは離れて行ってしまう。

<hr>
関連して思い出したのは

> Does the size matter?

google検索「Does the size matter」 53,700件
google検索「Does size matter」460,000件

対象となっているものが特定できる場合にtheが付くように思う。
( 間違っているかもしれない。 )
参考: 冠詞マスター教本 by 石井隆之さん

適当英会話。
Suzuki 「I would like to mount the [NVIDIA DGX-1](http://www.nvidia.co.jp/object/deep-learning-system-jp.html) on my Raspberry Pi.」
Satoh 「Does the size matter?」
Suzuki 「It sure does.」
Mac | Clipy の干渉しにくい オススメショートカット設定 ( Option + V )

# 自分の設定

こんな感じ。
`Option+V` に履歴を割り当て、あとはオフにしている。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/9eb1d381-d6a2-bc7c-93b9-073c8bac634c.png)

# 良いところ

- 他のアプリケーションと干渉しにくい。
- 普段使っている `Command+V` と、指を1キー分変えるだけなので、直感的に覚えやすい。
- 結局僕らはClipyに何を求めているか。それはクリップボードの履歴を再度ペーストすることである。なのでショートカットは1個だけで良いのだ。(メインメニューをショートカットで開きたいと思う人が、どれぐらいいるだろう？)

# 経緯

- Clipyが非常に便利なことは理解していたが、ショートカットが他のアプリケーションと干渉して「なんだよ！」ってなったことが何回もあった。
  - (確か)初期設定の `Ctrl+Command+V` は押しにくくて指が曲がった気がする。
- この無限のキーボードの組み合わせの中から、適切なショートカットを3個も考え出すことを考えると、途方に暮れてしまった。
  - `考慮すべき組み合わせ数 = アルファベット26文字+記号 * Option/Commans/Shift/Ctrlの組み合わせ * 3ショートカットの組み合わせ`
  - ショートカットを色々工夫していると「履歴を出したいのに、このショートカットはスニペットだった！」とかいうことも増え、さらに途方に暮れた。
  - このため1年ほどClipyを封印していた。

## * Ctrl+Command+V

熟練の技が必要な押し方。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/68c10961-489c-2e7a-d3db-aa1933681841.png)


# 環境

- Clipy v1.1.3
- MacOs Sierra 










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Stylishを使ってfriends.nicoをニコニコっぽいUIにしてみる

ニコニコの運営するMastodon http://friends.nico が公開されたので、niconico風のテーマを作りました。
![css.png](https://qiita-image-store.s3.amazonaws.com/0/177100/36d2c514-ffba-5096-e725-d1b8ef9e5659.png)

# Mastodon niconico風テーマ
https://userstyles.org/styles/141535/mastodon-nico-theme

# 使い方
1. 上URLを開いてブラウザ拡張のStylishをインストールします。
  - 「To use this style, first install Stylish.」の青いボタン
2. Stylishがインストールされてる状態だと同じ場所のボタンからテーマのインストールができます。
3. https://friends.nico を開く。
4. 実家のような安心感

# その他
- chrome,firefoxでのみ表示確認しています
- friend.nicoのドメインでしか有効にしてないです
  - ブラウザ右上のStylishのアイコンから色々いじれます
- ログイン画面や設定画面のスタイルはそのままです
- その他のMastodonテーマはこちら https://userstyles.org/styles/browse/Mastodon
PHP7とMongoDBのDriver情報（解決済み）

FuelPHP1.8を使用したプロジェクトで、ubuntuにMongoDBをインストールした際の覚書

インストール済みパッケージ
・PHP 7.0.15-1ubuntu4（apt-get）
・MongoDB shell version v3.4.3
・MongoDB extension version 1.2.3
※MongoDBは、https://www.mongodb.com/download-center?jmp=nav#communityから取得

症状
FuelPHP1.5で作成していたプログラムをそのまま使うと以下のエラーが発生した。

>Fuel\Core\Mongo_DbException [ Error ]:
>The MongoDB PECL extension has not been installed or enabled

```
/fuel/core/classes/mongo/db.phpの
if (!class_exists('Mongo')) でエラー（141行目）
```

で動作しない。

ただし、簡易的なテストプログラムでMongoDBの動作は確認済みなので
インストールには問題がない様子・・・
（FuelPHPを使用しないプログラムでの動作）


【対策（解決済み）】
PHP7のドライバとPHP5で互換性がないみたい・・
以下のアダプタをインストールしないとだめだったようです。
https://github.com/alcaeus/mongo-php-adapter

>composer require alcaeus/mongo-php-adapter


FuelPHP1.9では、アダプタなしになるだろうか・・・
IE11でLocalStorageが使えない時の対処法

## Windows Update で改善（2017年9月）
更新がだいぶ遅くなってしまいましたが... 
[Ask CORE の記事](https://blogs.technet.microsoft.com/askcorejp/2016/01/24/windows-8-windows-8-1-low-mandatory-level-1/) に更新があり、2017年9月13日の更新プログラム
[KB4038782 (OS ビルド 14393.1715)](https://support.microsoft.com/ja-jp/help/4038782/windows-10-update-kb4038782) で本記事の問題が修正されたとのことでした。

----

IE11でのHTML5のLocalStorage参照エラーの対処法です。
なかなかハマったので記録。

# 現象
社内用のWebアプリを作っているんですがIE11で画面真っ白。
Developer Toolを開いてコンソールを見てみたら、こんなん出てました。

```logos:console.error
SCRIPT5: アクセスが拒否されました。
```

エラー箇所を追ってみたら、LocalStorageにアクセスできてないみたい。
エラー発生のパターンは

* Windows 10 OS の IE11 ブラウザ 
* エラーが発生するのは、特定の社内端末のみ
* でも、InPrivate ブラウズではエラー発生しない

という謎現象。
とりあえずインターネットオプションから諸々リセットしてみたけど改善されず。
IEめ。

# 原因と対処
どうやら、間違った設定のプロファイルのテンプレートを使って
社内端末のセットアップが行われたことによって、
AppData\LocalLow ディレクトリへのアクセス権限が付与されなかったことが原因だったっぽい。

コマンドプロンプト等で、以下のコマンドを実行することで無事解決。

```text:
  icacls %userprofile%\AppData\LocalLow /t /setintegritylevel (OI)(CI)L
```

アクセス権が付与され、問題なくWebアプリを参照することができました。

色々調べてみたら、システム準備ツール (Sysprep) を使って
OSインストールをすると、設定によっては起こるみたいです。


## 参考：
1. ["SCRIPT5: Access is denied" error when accessing web sites using LocalStorage](https://social.technet.microsoft.com/Forums/ja-JP/066767a5-f9d5-45f4-95cf-dcd0ff030090/script5-access-is-denied-error-when-accessing-web-sites-using-localstorage?forum=ieitprocurrentver)
2. [Windows 8 / Windows 8.1 / Windows 10 環境において、展開後の一部フォルダーに Low Mandatory Level アクセス権が付与されない](https://blogs.technet.microsoft.com/askcorejp/2016/01/24/windows-8-windows-8-1-low-mandatory-level-1/)
3. [2017 年 9 月 13 日 - KB4038782 (OS ビルド 14393.1715)](https://support.microsoft.com/ja-jp/help/4038782/windows-10-update-kb4038782)
Microsoft Data Amp について簡単なまとめ


SQL Serverを主役としたMicrosoft Data Ampというオンラインイベントがあったので簡単にポイントだけまとめておく。（おそらく誰かが綺麗にまとめてくれる気が・・・）もちろんオンデマンドで視聴できるので必要あればURLにアクセスしていただきたい。
https://www.microsoft.com/en-us/sql-server/data-amp


# こちらのお二人がメインスピーカー
Microsoft Data Groupで一番お偉いさんにあたる Joseph Siroshは来月日本で開催する[de:code](https://www.microsoft.com/ja-jp/events/decode/2017/)でも登壇予定だ。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/c38360d9-f8a2-e9fc-d6f3-7ca43848592e.png)

私のホストマネージャーのLaraもデモラーとして登場した。

![image](https://qiita-image-store.s3.amazonaws.com/0/33998/26a9d7e8-b92e-5a24-6957-d241ad5779f1.png)

# 次期 SQL Serverの正式名称がSQL Server 2017に決定
ダウンロードは[こちら](https://www.microsoft.com/en-us/sql-server/sql-server-2017)から。目玉のLinux対応やGraph DataサポートやR&Pythonサポートされている。

![image](https://qiita-image-store.s3.amazonaws.com/0/33998/e649febf-4ec1-869f-b212-4e0adfdbd91b.png)

そもそもSQL Serverに機械学習に関連する実装が組み込まれている理由は何なのだろうか？
以前はDBではなくアプリレイヤーでintelligenceの実装をしていたが、セキュリティ、コンプライアンス、データ移動、管理性、可用性などの点で課題があった。それらを解決するためにAll-in-OneであるSQL Server 2017にInteligenceに関連する機能が組み込まれることになった。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/6b5d8f7a-85e8-10a5-938a-967058b38b48.png)

# Azure SQL Database の新機能
SQL Server使いには嬉しいSQL Agent、SQL Server Profier、CDC、DBMail、Service Broker等がサポートされる。また、外部テーブルを定義しなくてもCross-database/Cros-Instance Queryも利用できるようだ。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/fb461db6-5934-ef0e-28f4-a91f68ea54d8.png)

Migration Serviceを利用することでSQL Server、Oracle、MySQL等のDBからワンストップでマイグレーション出来るので移行が捗る。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/aa939764-3f7b-010d-16aa-0770ba608001.png)

# Azure Analysis Services GA
SQL Serve Analysis ServicesのフルマネージドにあたるAzure Analysis Servicesが正式提供開始だ。 
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/0d660e9f-4d15-c94d-5020-eae3ebb96dfb.png)

# R Server 9.1 のアナウンス
GPUのサポートが追加されたためDeep Learnigでの用途が広がった。詳細を知りたい方は[こちら](https://www.youtube.com/watch?v=q4hRaKuHJjQ)の動画を視聴していただきたい。

![image](https://qiita-image-store.s3.amazonaws.com/0/33998/da1af7b8-fa6b-0aa2-63f4-f766d7dc36d3.png)

 
来月のde:codeやBuild Developer Conference も楽しみ♪
C# の string.Format() の丸め方式

※C# の`string.Format()` に数値を与えた時の丸め方式について他の方と会話した際、まとまっているページが見当たらなかったので情報提供用にまとめました。(+ 会話時に誤った説明をしてしまっていたので、整理用)

`string.Format()` で数値を文字列化したときには、端数は四捨五入で丸められます。

```csharp
var s = string.Format("{0:0.000}", 1.2345); // = "1.235"
```

これは「カスタム数値書式指定文字列」という、数値を文字列化する際の指定の挙動によるものです。上の例の「`0.000`」の部分が書式指定で、この場合「整数 + "." + 小数桁3桁の形式にする」という指定をしたことになり、「0」("0" カスタム指定子) で指定した桁をあふれた端数の部分が四捨五入で丸められます。

[日本語版のMSDN](https://msdn.microsoft.com/ja-jp/library/0c899ak8(v=vs.110).aspx) だと

>指定子が "00" の場合、値は一の位で丸められ、小数点以下のゼロは常に切り捨てられます。 たとえば、"00" を指定して 34.5 を書式設定すると、結果の値は 35 になります。

という切り捨てなのか四捨五入なのか判断しづらい説明になっていますが、[英語版のMSDN](https://msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx) だと

> The "00" specifier causes the value to be rounded to the nearest digit preceding the decimal, where rounding away from zero is always used. For example, formatting 34.5 with "00" would result in the value 35.

となっており、「常に四捨五入される」(rounding away from zero is always used) と説明されています。

※ away from zero (round half away from zero) は「ゼロから遠い方に丸める」という意味で、0.5 を 整数に丸めると 1 に、-0.5 を整数に丸めると -1 になることを示しています。

※ `Math.Round()` で `MidpointRounding.AwayFromZero` を指定しない場合や、`Convert.ToInt32()` では偶数丸め (最近接偶数への丸め / round half to even) が行われ、 0.5 や -0.5 を整数に丸めると 0 に、1.5 を整数に丸めると 2 になります (一番近い偶数に丸められる)。

## 四捨五入にならないケース

MSDNの説明では上記ですが、「[String.Formatで四捨五入させないほう方](https://social.msdn.microsoft.com/Forums/ja-JP/549c2cdf-33a4-4b4c-b363-8be9224373cd/stringformat?forum=csharpgeneralja)」というMSDNのフォーラムのスレッドに、四捨五入にならないケースが紹介されています。

> まず、四捨五入ではありません。
> 例えば↓は、"0.02"になります。
> string str = string.Format("{0:#.00}", 0.01499999999999999);

(実際には 整数部に "#" を用いているので "0.02" ではなく ".02" になります)

精度の高い(桁数の多い)実数を文字列化する場合は予期しない値になることがありそうです。

- 上記の例の「0.01499999999999999」は double型として扱われます。double型の有効桁数は15～16桁で、「0.01499999999999999」は小数桁が17桁あるので、そのせいでおかしくなっているように思います。小数桁を16桁にした「0.0149999999999999」だと、期待通り ".01" になります。
- 実際にコードを動かして`string.Format()` 内をステップインで辿っていくと内部で `Number.FormatDouble()` というメソッドによって文字列化が行われていることを確認できますが、どのように文字列化しているかはわかりませんでした。(`Number.FormatDouble()` の中にステップインできないので詳細が確認できないのと、`Number.FormatDouble()` の公式の説明が見つけられない)
- 0.01499999999999999 を `Math.Round(0.01499999999999999, 2, MidpointRounding.AwayFromZero)` で四捨五入した場合は、0.01 になります。
- `string.Format("{0:#.00}", 0.01499999999999999m)` と decimal型(m) にすると ".01" になります。
node.jsでGmailメール受信をトリガーしてなにか処理する


npm install inbox
npm install mailparser

```javascript:mail_trigger_sample.js

'use strict';

var inbox = require('inbox');

//var nodemailer = require('nodemailer');
//var iconv = require('iconv');
//var conv = new iconv.Iconv("UTF-8", "UTF-8");

const simpleParser = require('mailparser').simpleParser;

var client = inbox.createConnection(false, 'imap.gmail.com', {
    secureConnection: true
    ,auth: {
        user:'yourmailaddress@gmail.com'
        ,pass:'password'
    }
});

client.on('connect', function() {
    console.log('connected');
    client.openMailbox('INBOX', function(error) {
        if (error) throw error;
    });
});

client.connect();

client.on("new", function(message) {
    console.log('日時:' + message.date);
    console.log('送信者:' + message.from.name + '-' + message.from.address);
    console.log('タイトル:' + message.title);

    var stream = client.createMessageStream(message.UID);
    simpleParser(stream)
        .then(mail=> {
            console.log('本文(HTMLテキスト):' + mail.textAsHtml);
        })
        .catch(err=> {
            console.log(err);
        });

});
```
SourceTreeから始めないGit

# はじめに
私は業務でPerforceを使っていますが、自宅で個人的な開発作業を行うとき、ライセンス面でPerforceを利用できないため、Gitを使ってみることにしました。

Gitを使い始める際、世の中ではSourceTreeを使う事がデファクトスタンダードのようですが、SourceTreeでリモートリポジトリを作成する場合はGitHubかBitbucketのアカウントが必要です。

個人開発なのに自分の手の届かない範囲のリソースに依存しなければならないのは決して気持ちの良い状況ではありません。（ローカルリポジトリだけで作業する選択肢もありますが……）

つまるところ、ローカルリポジトリで作業し、リモートリポジトリにpushするというGitのスタンダードなワークフローを、ローカル環境のみでやりきりたいのです。これはどうもSourceTreeのみではできないようなので、GitをCUIで使うことにしました。

# ゴール
ローカル環境にリモートリポジトリを作成し、そこからcloneしたローカルリポジトリで作業した内容をpushできるようにする事を目指します。

# 読み進める前に
残念ながら、この記事には特筆すべきテクニックや新規性のある運用アイディア等は含まれていません。私と同じような（ひねくれた）Git初心者が、同じようなところでつまづかないための記事として書きました。

# 手順
1. リモートリポジトリの作成
2. ローカルリポジトリの作成
3. ローカルリポジトリへファイルを新規に追加してcommit
4. ローカルリポジトリのcommitをリモートリポジトリへpush

## リモートリポジトリの作成
まずはリモートリポジトリを配置するディレクトリを作成します。
```
$ mkdir sample.git
```

ディレクトリ名のポストフィックスである`.git`は、リモートリポジトリ名の慣習（仕様？）のようです。
次に、`git init`コマンドに先ほどのディレクトリを指定して、リモートリポジトリを作ります。このとき、`--bare`オプションと`--share`オプションを指定します。

```
$ git init sample.git --bare --share
```

`--bare`オプションが、実質的にリモートリポジトリの作成オプションです。このオプションを指定して作成したリポジトリは、作業コピーを持ちません。つまり、pushされたりpullされるだけのリポジトリ＝リモートリポジトリになります。

`--share`オプションは、リモートリポジトリが管理するファイルのパーミッションに関係しており、指定しない場合、パーミッションエラーでpushできなくなります。（後から管理ファイルのパーミッションを直接変更する方法で対処できるようです。）

特にエラーが発生しなければ、`sample.git`以下にリモートリポジトリ用の管理ファイルが生成されます。これで、`sample.git`ディレクトリはリモートリポジトリになりました。

## ローカルリポジトリの作成
リモートリポジトリと同様、ローカルリポジトリも、まずは配置場所となるディレクトリを作成します。
```
$ mkdir work
```

次に、リモートリポジトリから`clone`コマンドでローカルリポジトリを作成します。

```
$ git clone sample.git work
```
これで、`sample.git`リモートリポジトリのクローンとして`work`ディレクトリにローカルリポジトリが出来上がります。
ちなみに、次のような警告が出ますが、空のリポジトリのクローンを作成した事に対する警告のようです。

```
warning: You appear to have cloned an empty repository.
```

## ローカルリポジトリへファイルを新規に追加
まずはローカルリポジトリ`work`に移動して、なんでも良いのでファイルを一つ作ります。

```
$ cd work
$ echo a>test.txt
```

次に、新しく作成したファイルをインデックスに追加し、コミットします。

```
$ git add test.txt
$ git commit -m "test commit"
```

これでローカルリポジトリのmasterブランチに`test.txt`ファイルが新規追加ファイルとしてコミットされました。

## ローカルリポジトリのcommitをリモートリポジトリへpush
いよいよ最後の工程です。最後は`push`コマンドで、ローカルリポジトリの変更内容をリモートリポジトリへ反映します。

```
$ git push origin master
```

`origin`はデフォルトではクローン元のリモートリポジトリのURLとして解釈されます。設定は、ローカルリポジトリ直下の`.git/config`ファイルに記載されています。

`master`は、commitで何も指定しなかった場合のブランチ名です。要はトランクのようなメインコードラインの事です。

# おわりに
せっかくGUIの素晴らしいフロントエンドツールが存在するのに、どこまでCUIでやり切るべきなのか、そのあたりは全然考えていません。結局のところ、GitHubにアカウントを作成し、ローカルのリモートリポジトリからpushしてSourceTreeを使う日が来るのでしょう。
しかし、本記事が、試しにGitを使ってみたいけれどもあまり複雑なことは考えたくない入門者にとって、はじめの一歩を後押しする記事になれば幸いです。

そして、「実はSourceTreeでもローカルのリモートリポジトリを作れるよ！」というオチを望んでいます。
Reactで文字列内のURLをリンク(<a>タグ)にする方法


# TL;DR;
- 文字列内のhttp~を`<a>`タグでリンクにしたい
- [react-string-replace](https://github.com/iansinnott/react-string-replace/tree/master/example)を使えば簡単にできたのでメモ＆共有
- [サンプル](https://github.com/shisama/react-string-replace-sample)おいておく

# react-string-replace
- `npm i -S react-string-replace`する(もしくは`yarn add -S react-string-replace`)
- `react-string-replace`をimportもしくはrequireする
- 正規表現でマッチした文字列を`<a>`タグで囲むだけ
- 配列の文字列とかでももちろん問題なく動く

`import reactStringReplace from "react-string-replace"`して、
`reactStringReplace(text, regExp, callback);`とするだけ

以下サンプル

```js:ListView.js
import React from "react";
import reactStringReplace from "react-string-replace";

const ItemList = ["https://www.google.com", "www.gentoo.org", "link to http://www.yahoo.com", "http://www.google.com"];
const regExp = /(https?:\/\/\S+)/g;

export default class ListView extends React.Component {
  render() {
    return (
      <div>
        <ul>
        {ItemList.map((item) => {
          return (
            <li>
              {reactStringReplace(item, regExp, (match, i) => (
                <a href={match}>{match}</a>
              ))}
            </li>
          )
        })}
        </ul>
      </div>
    )
  }
}
```

render関数が構築するDOMは以下のようになります。
ちゃんとマッチさせたい部分がリンクになっています。

```html

<div>
  <ul>
    <li>
      <a href="https://www.google.com">https://www.google.com</a>
    </li>
    <li>
      www.gentoo.org
    </li>
    <li>
      link to <a href="http://www.yahoo.com">http://www.yahoo.com</a>
    </li>
    <li>
      <a href="http://www.google.com">http://www.google.com</a>
    </li>
  </ul>
</div>
```

以上になります。
もっといい方法とかあればご教授ください！
Pythonによるソケット通信とマルチスレッド処理

マルチスレッド処理をして、サブのスレッドがサーバとなって、メインスレッドからの入力を受け付けるようになっています。
ターミナル上で実行したのち、適当な文字列を打ってEnterキーを押すと、メインスレッドからサブスレッドへとソケット通信によって文字列が送られます。
サブスレッドのほうで文字列を受け取ると、print文により、ターミナルに出力されます。

環境
・Python2.7

```python:thread_socket.py
import threading
import socket
import time
import datetime


# for receiving
class TestThread(threading.Thread):
    def __init__(self):
        super(TestThread, self).__init__()
        
        self.host = ""
        self.port = 12345
        self.backlog = 10
        self.bufsize = 1024
        
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.bind((self.host, self.port))

    def run(self):
        print " === sub thread === "
        self.sock.listen(self.backlog)
        conn, address = self.sock.accept()
        while True:
            mes = conn.recv(self.bufsize)
            if mes == 'q':
                print "sub thread is being terminaited"
                break
            print mes
        
        self.sock.close()


if __name__ == '__main__':
    th = TestThread()
    th.setDaemon(True)
    th.start()

    time.sleep(1)
    # time.sleep(100)  # これは長すぎる（１００秒待て、という指令）

    print " === main thread === "
    
    ip = "localhost"
    port = 12345
    bufsize = 1024
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    while True:
        inp = raw_input("YOU>")
        sock.send(inp)
        time.sleep(1)
        if inp == 'q':
            th.join()
            print "main thread is being terminated"
            break
        
    sock.close()
    
```
Python+OpenCVによるカメラからの画像取得

主に個人的なメモです。
以下のコードをCtrl+C & Ctrl+Vして実行すると動きます。

環境
・Python2.7
・OpenCV2

```python:capture.py
import cv2

cap = cv2.VideoCapture(0)

while(True):

    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == 27:
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
```
AWSにDjango環境を構築する

#versions
Python : 2.7
Django : 1.10

# Environment
EC2インスタンス : Amazon Linux
WSGI : gunicorn
Proxy : nginx

# install python packages

```
sudo yum update
sudo yum install gcc
sudo yum install python-devel
sudo yum install python-psycopg2
sudo yum install postgresql-devel
pip install -r requirements.txt
```

__sudoをつけてpip installをするとpkg_resources.DistributionNotFound: pip==6.1.1と表示されインストールができない場合__

```
sudo vi /usr/bin/pip
```
pip==6.1.1と記載されている部分を現在インストールされているpipのバージョンに書き換えてあげましょう

# reverse proxy

```
sudo yum install nginx
sudo vi /etc/nginx/nginx.conf
```

* nginx.confに追記 line : 49

```
location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# http://mydomain/static/ をDjangoのsettings.pyでSTATIC_ROOTに指定したディレクトリへルーティング
location /static/ {
    autoindex on;
    alias   /usr/share/nginx/html/django-project-name/staticfiles/;
}
```

```
sudo chmod 777 -R /usr/share/nginx/html ※1
sudo service nginx restart
gunicorn django-project-name.wsgi -D
```

# gunicornの再起動
サービスを止めずにソースコードの変更を反映する場合

```
pgrep gunicorn
kill -HUP masterpid
```

# Memo

```
python manage.py runserver 0.0.0.0:8000  # 全てのホストアドレスからのアクセスを許可
python manage.py migrate
python manage.py createsuperuser

# 事前にsettings.pyにSTATIC_ROOTを設定する (defaultでは記載されていない)
python manage.py collectstatic  # STATIC_ROOTに指定したディレクトリに静的ファイルが生成される
```

※1 : このディレクトリ下にDjangoプロジェクトを設置
当初はSTATIC_ROOTに設定したディレクトリのシンボリックリンクのみをここに貼ったが
静的ファイルを読み込む際に403エラーが発生してしまうためプロジェクトごとこのディレクトリに設置
所有がrootのディレクトリに対して、パーミッションを777に設定してしまうのは多少疑問が残るところ

# SSL証明書
証明書は[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/)で発行し、Elastic Load Balancerにインストール
ELBとEC2間の通信はhttpとなるが、ELBとEC2が同じリージョンにある場合セキュリティの問題はなさそう
Docker Composeのインストール


```
[root@Dockh ~]# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   600    0   600    0     0    730      0 --:--:-- --:--:-- --:--:--   729
100 8076k  100 8076k    0     0  27171      0  0:05:04  0:05:04 --:--:-- 10926
[root@Dockh ~]# chmod +x /usr/local/bin/docker-compose 
[root@Dockh ~]# 
[root@Dockh ~]# curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose --version | awk 'NR==1{print $NF}')/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11743  100 11743    0     0  18460      0 --:--:-- --:--:-- --:--:-- 18434
[root@Dockh ~]# 
[root@Dockh ~]# ls -l /etc/bash_completion.d/docker-compose 
-rw-r--r-- 1 root root 11743  4月 19 03:13 /etc/bash_completion.d/docker-compose
[root@Dockh ~]# 

[root@Dockh ~]# docker-compose version
docker-compose version 1.12.0, build b31ff33
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
[root@Dockh ~]# 

```
Ubuntu XenialのDNSを設定する


これが正しいやりかたかわからないけど……

１．/etc/resolvconf/resolv.conf.d/baseに以下の一文を追加

```bash
nameserver 8.8.8.8
```

２．変更を反映する

```bash
$ sudo resolvconf -u
```

３．試す

```bash
$ ping www.google.com
PING www.google.com (216.58.221.4) 56(84) bytes of data.
64 bytes from nrt13s38-in-f4.1e100.net (216.58.221.4): icmp_seq=1 ttl=52 time=5.41 ms
64 bytes from nrt13s38-in-f4.1e100.net (216.58.221.4): icmp_seq=2 ttl=52 time=8.75 ms

```
Packer の QEMU Builder で Ubuntu Cloud Images を使う

[Ubuntu Cloud Images](https://cloud-images.ubuntu.com/) で提供されている QCOW2 フォーマットのイメージを元に、Packer の [QEMU Builder](https://www.packer.io/docs/builders/qemu.html) で OS イメージをビルドしたかったので、その手順をまとめます。

## 事前準備

今回は macOS Sierra 上でビルドするため、事前に Packer と QEMU をインストールしておきます。インストールには [Homebrew](https://brew.sh/index.html) を使用します。また、後述する一部の作業で Docker を使用するため、[Docker for Mac](https://www.docker.com/docker-mac) もインストールしておきます。

```
$ brew install packer qemu
```

## cloud-init の設定イメージの作成

Ubuntu Cloud Images で提供されているイメージは、[cloud-init](https://launchpad.net/cloud-init) を利用して AWS などのクラウドプロバイダーから初期設定を起動時に取得することを前提とした作りになっています。しかし今回は Packer を使用して QEMU 上でビルドするため、cloud-init が初期設定の取得先を見つけることができず、正しく起動できません。

しかしながら `cloud-localds` というツールを使用して初期設定を含むイメージを作成し、それを QEMU の起動時に指定しておくことで、クラウドプロバイダーの初期設定が無くとも cloud-init を正しく実行できます。今回はまずその設定イメージを作ります。

`cloud-localds` を使用するには Linux が必要です。今回は Docker コンテナを使用して `cloud-localds` をインストールして、設定イメージを作ることにします。まずは Ubuntu のコンテナを起動します。

```
$ docker run -it -v `pwd`:/tmp/host --rm ubuntu:16.04
```

Ubuntu コンテナが起動したら、*cloud-utils* パッケージをインストールします。

```
# apt update
# apt install -y vim cloud-utils
```

続いて、cloud-init の設定フォーマットに従い、初期設定を含んだ設定ファイルを作成します。以下の例ではデフォルトユーザーの初期パスワードを *ubuntu* に設定し、SSH 経由でのパスワードログインを有効化しています。

```
# vim cloud.cfg
```
```file:cloud.cfg
#cloud-config
password: ubuntu
ssh_pwauth: true
chpasswd:
  expire: false
```

設定ファイルを作成したら、`cloud-localds` コマンドを使用してイメージに変換します。コンテナの外で使えるようにホストからマウントしたパスに書き出します。

```
# cloud-localds /tmp/host/cloud.img cloud.cfg
```

これで cloud-init の初期設定を含むイメージができました。

## Packer でのビルド

続いて、Packer のテンプレートファイルを以下のように用意します。*qemuargs* キーの *-fda* オプションで先ほど作成した cloud-init の初期設定を含むイメージを指定します。この設定で先ほどのイメージがフロッピーディスクとして使用され、cloud-init がそこから初期設定を読み込むようになります。また、イメージからの起動には少し時間がかかるので *ssh_wait_timeout* キーの値も調整しておくのが良さそうです。

```
$ vim template.json
```
```file:template.json
{
  "builders":
  [
    {
      "type": "qemu",
      "iso_url": "ubuntu-16.04-server-cloudimg-amd64-disk1.img",
      "iso_checksum": "3a4b7f6115ca074c4728e4628ca73160e6b7ef6995db3c382015545940568939",
      "iso_checksum_type": "sha256",
      "disk_image": true,
      "output_directory": "output",
      "disk_size": 5000,
      "format": "qcow2",
      "disk_compression": true,
      "headless": true,
      "accelerator": "none",
      "ssh_username": "ubuntu",
      "ssh_password": "ubuntu",
      "ssh_port": 22,
      "ssh_wait_timeout": "300s",
      "vm_name": "ubuntu",
      "use_default_display": true,
      "qemuargs": [
        ["-m", "1024M"],
        ["-smp", "1"],
        ["-fda", "cloud.img"],
        ["-serial", "mon:stdio"]
      ]
    }
  ]
}
```
これで Packer でのビルドの準備ができました。以下のように `packer` コマンドを実行すれば Ubuntu Cloud Images を使った OS イメージが *output* ディレクトリに生成されます。

```
$ packer build template.json
```
LINEのトーク履歴を整形する

# 背景

LINEはトーク履歴をテキストファイルでエクスポートできます。最近、トーク履歴を引用して使う用事があったのですが、そのままだと使いづらいのでsedで整形しようと思い立ちました。

#作成したシェルスクリプト

```bash:bash
sed -e "s/[0-9][0-9]:[0-9][0-9]\t//" -e "s/\t/: /g" -e "s/\r//" before.txt > after.txt
```

# 整形した内容

 * LINEのトーク履歴は、改行コードがCR+LFであるため、EmacsやVimで開くと`^M`が表示されることがあります。こちらを削除します。
 * 要素がタブ区切りだったのでスペースに置換します。
 * 時間表示も消しました。
 * 名前の後にコロンを入れるようにしました。

```text:before
23:10	taumu	ほげほげほげほげ^M
23:11	cywath10	ふがふがふがふが^M
```

```:after
taumu: ほげほげほげほげ
cywath10: ふがふがふがふが
```
【WebSphere Liberty Hints & Tips】Windowsサービスに登録する方法


## はじめに
WebSphere Liberty 16.0.0.4あたりから（正確なバージョンは曖昧です）、serverコマンドでWindowsサービスに登録できるようになったようですので試してみました。

## 前提環境
* Windows 7 （古いですが。。）
* IBM Java SDK 8
* WebSphere Liberty 17.0.0.1

## Liberty とIBM Java SDK 8のセットを導入
1. [ここから](https://developer.ibm.com/assets/wasdev/#asset/runtimes-webprofile7-ibm-java)ダウンロード
2. 任意のフォルダでZipファイルを展開
![Kobito.qlDbvt.png](https://qiita-image-store.s3.amazonaws.com/0/129662/cb6a103d-c1d2-058b-e2d2-061d3a1d6140.png "Kobito.qlDbvt.png")

3. \<WLP_ISNTALL_DIR>¥java¥javaに展開されているJDK 8をJAVA_HOMEに指定してPATHに通す

## サービス登録するサーバーを作成
ここでは server1というサーバーを作成します。

```server作成コマンド
server create <server_name>
```
![Kobito.BxfyHL.png](https://qiita-image-store.s3.amazonaws.com/0/129662/8cc2a007-8edc-c20f-f4a3-bff19ff8cc3a.png "Kobito.BxfyHL.png")


## 以下のコマンドを実行

1. まずは上記で作成したserver1を登録します。

```serverのサービス登録コマンド
server registerWinService <server_name>
```
![Kobito.1cY2l9.png](https://qiita-image-store.s3.amazonaws.com/0/129662/73ad86a0-0252-9e5a-90d3-ad8338bada86.png "Kobito.1cY2l9.png")


2.　Windowsサービスに登録されているのがわかります。これを開始します。

```serverのサービス開始コマンド
server startWinService <server_name>
```

![Kobito.12ZgaE.png](https://qiita-image-store.s3.amazonaws.com/0/129662/7c9577ea-50c9-667a-dd93-7bd4cd6d5c67.png "Kobito.12ZgaE.png")

3.　停止コマンドは以下のとおりです。サービスが停止したことがわかります。

```serverのサービス停止コマンド
server stopWinService <server_name>
```

![Kobito.13X3Xo.png](https://qiita-image-store.s3.amazonaws.com/0/129662/3a75229a-2038-2ac7-57a9-4dd74848c085.png "Kobito.13X3Xo.png")

4.　サービスから削除するには以下のコマンドを実行します。

```serverのサービス削除コマンド
server unregisterWinService <server_name>

```

![Kobito.m6CYkx.png](https://qiita-image-store.s3.amazonaws.com/0/129662/38c62ea0-8b52-c872-d787-39f14982f266.png "Kobito.m6CYkx.png")


## まとめ
以上でWindowsサービスにWebSphere Libertyを登録・開始・停止・削除するまでの流れをまとめました。
ちなみにserver.batファイルの中身を確認すると、上記のコマンドを実行する際に、prunsrv.exe を呼び出しているのがわかります。

## 参考
* https://developer.ibm.com/wasdev/blog/2016/11/18/beta-websphere-liberty-and-tools-novemberdecember-2016/
* https://www.ibm.com/developerworks/community/blogs/aimsupport/entry/Running_Liberty_profile_Server_as_a_Microsoft_Windows_Service?lang=ja
* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/twlp_setup_new_server.html
Apacheインストール手順

####事前準備
```bash
yum install gcc
yum install gcc-c++
```


<br>
####APRのインストール


```bash
cd /usr/local/src/
wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-1.5.2.tar.gz
tar zxvf apr-1.5.2.tar.gz
cd apr-1.5.2/

vim configure
```

```configure
    $RM "$cfgfile"
```
↓変更する

```configure
    $RM -f "$cfgfile"
```


```bash
./configure --prefix=/opt/apr-1.5.2 
make
make install
```
./configureに--prefixを指定しない場合、デファルトで/usr/local/aprにインストールされる
<br>
####APR-Utilのインストール
```bash
cd /usr/local/src/
wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-util-1.5.4.tar.gz
tar zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4/
./configure --with-apr=/opt/apr-1.5.2
make
make install
```
./configureには、APRのインストールディレクトリを指定する

<br>
####PCREのインストール
```bash
cd /usr/local/src/
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
tar zxvf pcre-8.40.tar.gz 
cd pcre-8.40/
./configure --prefix=/opt/pcre-8.40
make
make install
```

<br>
####Apacheのインストール
```bash
cd /usr/local/src/

wget http://ftp.tsukuba.wide.ad.jp/software/apache//httpd/httpd-2.4.25.tar.gz
tar zxvf httpd-2.4.25.tar.gz 
cd httpd-2.4.25/
./configure --with-apr=/opt/apr-1.5.2 --with-pcre=/opt/pcre-8.40/ --prefix=/opt/apache/2.4.25
make
make install
```

httpポート開放

```bash
firewall-cmd --zone=public --add-service=http
firewall-cmd --add-port=8080/tcp
```
配列を取り出すときに気を付けること

##気を付けること

今回が初投稿です！♪
今回は自分がやらかしてしまった失敗をまとめておこうと思い作成しました。
※かなり初心者なので記載に曖昧さがあります。

指定した配列のみを取り出し、表示させようと考え下記のように作成。

`$product = array_column($f, 'product');`
`print_r($product);`
`echo $product[0];`

あれ？、`print_r`は表示できたのに`echo`で表示できないぞ？
あれやこれやといじっては戻してを繰り返した挙句に出た答えは

`$product = array_column($f, 'product');`
`echo $product[0];`

`print_r`の消し忘れは気を付けようという反省でしたｗ
しかし、`print_r`で表示したものは`echo`で表示できないってことですかね？
勉強不足な記事でしたｗ
同じような所で引っかかってしまった方がいれば少しでもお力になれたらうれしいです♪
headless な環境で electron --help してもなにもでないとき

小ネタすぎて投稿するか迷ったんですけど同じ事でハマる人がいるかもしれないので。

Xが動いてなくて環境変数 DISPLAY が設定されてないと electorn は `--help` や `--version` しても何も出してくれません。`--enable-logging` を付けると詳細なログが出てくるので、それで原因を調べましょう。

```
% node_modules/electron/dist/electron --enable-logging
[15542:0419/224954.661886:ERROR:browser_main_loop.cc(272)] Gtk: cannot open display: 
```

`cannot open display` なので、ヘルプを出すだけでも xvfb なりを使いましょうということですね。

他の原因で動かないときも `--enable-logging` すれば何か分かるかもしれないので、頭の片隅にでも入れておくといいでしょう。

## 参考

- https://github.com/electron/electron/issues/8757
opcodeダンプするのにvldもphpdbgも要らなくなってた

PHP 7.1からopcodeダンプがopcacheで出来るようになってたみたいですね。

```php:test.php
<?php
$a = 1;
$b = $a * 2;

var_dump($b * $b);
```

上記プログラムのopcodeダンプは次のようにすれば取得できます。

```
$ php -dopcache.enable_cli=1 -dopcache.opt_debug_level=0x10000 /tmp/test.php

$_main: ; (lines=8, args=0, vars=2, tmps=5)
    ; (before optimizer)
    ; /private/tmp/test.php:1-6
L0:     ASSIGN CV0($a) int(1)
L1:     T3 = MUL CV0($a) int(2)
L2:     ASSIGN CV1($b) T3
L3:     INIT_FCALL 1 96 string("var_dump")
L4:     T5 = MUL CV1($b) CV1($b)
L5:     SEND_VAL T5 1
L6:     DO_ICALL
L7:     RETURN int(1)
int(4)
```

コマンドラインオプションの`0x10000`は最適化前を表すフラグなんだそうです。各最適化フェーズの出力例は「[PHP 7\.1からOPcacheに増えた設定値「opcache\.opt\_debug\_level」とは何か \- Qiita](http://qiita.com/hnw/items/0b2cc00fc704a738e46c)」を参照のこと。

下記は同じopcodeダンプをphpdbgで取得したものです。

```
› phpdbg '-p*' /tmp/test.php
function name: (null)
L1-6 {main}() /private/tmp/test.php - 0x110ab21b0 + 8 ops
 L2    #0     ASSIGN                  $a                   1
 L3    #1     MUL                     $a                   2                    ~0
 L3    #2     ASSIGN                  $b                   ~0
 L5    #3     INIT_FCALL              96                   "var_dump"
 L5    #4     MUL                     $b                   $b                   ~0
 L5    #5     SEND_VAL                ~0                   1
 L5    #6     DO_ICALL
 L6    #7     RETURN                  1
[Script ended normally]
```

両者を見比べてみると1:1で対応していますね。opcacheの出力の方が断然可読性が高いので逆にopcodeダンプに見えないんですが、中の人（nikicさん）はこちらを推奨しているようなので、今後はこれに慣れていった方がいいのかもしれません。

# 参考URL

- [PHP 7 Virtual Machine](http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html) nikicさん最新作。私もいま読んでいるところです。
Visual Studio 2017ではO/R デザイナがデフォルトでは使えない

タイトルの通りです。.dbmlファイルをダブルクリックしてもXMLが表示されるだけでデザイナが起動しないのは、「LINQ to SQLツール」がデフォルトの設定ではインストールされないためです。

ということでインストールしましょう。
インストーラを起動して「変更」を選び「個別のコンポーネント」タブを表示します。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/42710/b7a13ff3-e955-aad0-87bb-83f7cd1614b6.png)

するとその中に「LINQ to SQLツール」があるので、それをチェックしてインストールします。
Rantly(property based testing tool)でテストデータ生成 - dict

Rantly#dict でランダムに辞書（Hash）を作ります

## <i class='fa fa-question-circle'></i> 関連記事
[tbpgr の rantly 関連記事](http://qiita.com/search?utf8=%E2%9C%93&q=user%3Atbpgr%20tag%3Arantly)

## <i class='fa fa-flask'></i> サンプル
dict は引数を指定しないとサイズ 5 の辞書を作ります。
引数を指定すれば任意のサイズになります。

```ruby
Rantly { dict { [string,integer] }}
# => {"'GG6Xp"=>-1301088469925242630,
 ".r^;Cr"=>-830747007937150311,
 "0oRi4L"=>1002763082389889594,
 "&eGhC{"=>-1470201177124146980,
 "Ybqd}@"=>1690862045511562062,
 ">|zP>o"=>169353729525519484}
Rantly { dict { [sized(1){string(:lower)}, integer] }}
# => {"p"=>-403261935239693816,
 "m"=>475774335339514313,
 "k"=>2132551303218903518,
 "v"=>-1883921175450006491,
 "j"=>-1033096277449261467,
 "e"=>1058547638967033816}
Rantly { dict { [sized(1){string(:lower)}, integer] }}
# => {"u"=>-375542874201149255,
 "j"=>351664663262723674,
 "d"=>-951337550544971658,
 "k"=>-782281327314853422,
 "h"=>2118713526316693343,
 "i"=>-2232548483101729706}
Rantly(2) { dict(3) { [sized(1){string(:lower)}, integer] }}
# => [{"j"=>-566113549079247193, "q"=>609365110960907502, "r"=>-1253962267943844375},
 {"l"=>1587258912403808212, "j"=>1895970862047795813, "z"=>-1962425143609660140}]
Rantly(2) { dict(3) { [sized(1){string(:lower)}, integer] }}
# => [{"t"=>-1769463747311768954, "q"=>-1771712619822802431, "f"=>-583081247595236601},
 {"a"=>750466744831683401, "t"=>-1181796705103785463, "o"=>268753520267603397}]
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [abargnesi/rantly](https://github.com/abargnesi/rantly)
Bitcoin

Bitcoin調べる。
[bitcoin/bitcoin](https://github.com/bitcoin/bitcoin)
[Bitcoinプログラミングの入り口](http://blog.nayuta.co/blockchain/2014/12/14/bitcoin%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%85%A5%E3%82%8A%E5%8F%A3/)

[Bitcoinウォレットを実装する](http://bitcoin.peryaudo.org/implement.html)
Rubyでウォレットのサンプルを作っているサイト。実用としては使えないが、８００行くらいらしいので勉強に最適らしい。


# btcd
[github.com/btcsuite/btcd](github.com/btcsuite/btcd)
GoでできたBitcoin実装。フルノード。ウォレット機能はない。

bitcoinはC++だから、C++勉強しながらコードをみようと思ってたけど、これを見つつファブリックとかいうのを見たらよいのかなあと思った。

# ブロックチェーン
[hyperledger/fabric](https://github.com/hyperledger/fabric)

BitcoinがC++でかかれてる。テストはPython。
fabricはGo言語っぽい。なにかはいろんな言語でつくれるらしい。何かが何かわからない。
ブロックチェーンのオープンソースは沢山あって、結構Go言語でかかれてる。

# bitcoinのテスト環境
[Testnet](https://en.bitcoin.it/wiki/Testnet)というのがある。実際のbitcoinを体験できるけどテスト環境でコインの価値はない。コインも簡単に[ゲット](https://tpfaucet.appspot.com/)することができるらしい。Testnetのブロックチェーンは[ここ](https://testnet.blockexplorer.com/)で確認することができる。
React.jsでaタグとLinkタグの相違点メモ

HTML5のaタグとReactのLinkタグどっちともリンクを描画することができるが、動きの違いをメモする。

**1. リンク先を省略し、onClick処理で実装したい場合**

| aタグ       |       Linkタグ |
|:-----------------|:------------------|
| href属性の記載を除く場合、ロールオーバー表現ができない。<br />ロールオーバー表現を維持するために、href=""の記載が必要になる。|hrefとto属性の記載は不要。|
|onClickハンドルでe.preventDefault();の呼び出しが必要。|onClickハンドルのe.preventDefault()の呼び出しが不要。|

**2. 外部リンクを開きたい場合*

| aタグ       |       Linkタグ |
|:-----------------|:------------------|
|target="_blank"設定ありの場合、外部リンクが新タブで開く|target="_blank"設定ありの場合、外部リンクが新タブで開く|
|target="_blank"設定なしの場合、外部リンクが今のタブで開く|target="_blank"設定なしかつto属性を設定する場合、今のタグで外部リンクのドメインを除いたリクエストURLを今のドメインでアクセスしてしまう。例：locationが```http://localhost/req1```の状態で外部リンク```http://google.co.jp/aaa/bbb```をクリックすると、```http://localhost/aaa/bb```に飛んでしまい、該当ルートの存在しないエラーがwebコンソールに出力される。|

**3. Linkタグのhref属性**
　　Linkタグで基本的にto属性を使用すべきですが、hrefタグの利用も可能である。その時、普通のaタグと違いがなさそうである。
if文でも三項演算子でもない第三のIf文を書いてみる

何を言ってるか分からないと思いますが、ちゃんと説明します。

こんなコードを書かなきゃいけないときって思わず眉間に皺が寄りますよね

```java:
String s = null;
if (testSomeCond()) {
    s = "is true";
} else {
    s = "is false";
}
doSomething(s);
```
こんなとき役に立つのが三項演算子で

```java:
String s = testSomeCond() ? "is true" : "is false";
doSomething(s);
```
みたいな感じで書けます。

この三項演算子ですが、可読性が良いとか悪いとかでしばしば論争が起きたりしていて、Go言語とかだとばっさりカットされてたりします。
個人的には三項演算子好きですが、条件や戻り値部分が長くなると確かに読みづらいなと感じます。

そこでこんな書き方はどうでしょう

```java:
String s = If.correct(testSomeCond()).then("is true").orElse("is false");
doSomething(s);
```
この「If文」なら普通に英語を読むような感覚で処理が理解できると思いませんか？
また、条件や戻り値部分が多少長くなっても読みやすさはそこまで損なわれません

```java:
String s = If.correct(testSooooooooooooooooooooooooooooooooomething())
        .then("is trueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
        .orElse("is falseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
doSomething(s);
```
上記は当然コンパイルエラーになりますので、使用する場合は以下の3クラスを追加ください。(Java8以上のみ対応です)

```java:
public class If {
    public static BoolSaver correct(Boolean b) {
        return () -> b;
    }
}

@FunctionalInterface
public interface BoolSaver {
    Boolean get();

    default <A> Else<A> then(A a1) {
        return (A a2) -> get() ? a1 : a2;
    }
}

@FunctionalInterface
public interface Else<A> {
    A orElse(A a2);
}
```
サンプルとかgithubにアップしてるので興味があったら見てみてください。
https://github.com/mt-village/nagare

---
以下、追記

```java:
int[] a = {1,2};
int i = 3;
int result = If.correct(i < a.length).then(a[i]).orElse(-1);
```
みたいなパターンだとa[i]は実際には使われないのに例外（ArrayIndexOutOfBoundsException）が発生してしまうという問題を解決するために少し手を加えました。


```java:
int[] a = {1,2};
int i = 3;
// 通常の書き方
int a = If.correct(i < a.length).then(a.length).orElse(i);
// 戻り値の片方が例外を発生し得る場合の書き方
int b = If.correct(i < a.length)
    .then(() -> a[i])
    .orElse(() -> -1);
```
引数にSupplierを取れるようにしました。
安全面から考えるとSupplierの方だけにしたほうがいいと思いますが、そもそもの目的である可読性の向上という面から考えて、両方できるようにしておきました。

上記の書き方を有効にするには1クラス増えて、4クラスの追加が必要になります。

```java:
public class If {
    public static BoolSaver correct(Boolean b) {
        return () -> b;
    }
}

@FunctionalInterface
public interface BoolSaver {
    Boolean get();

    default <A> Else<A> then(A a1) {
        return (A a2) -> get() ?  a1 : a2;
    }

    default <A> ElseSaver<A> then(Supplier<A> a1) {
        return (Supplier<A> a2) -> get() ? a1.get() : a2.get();
    }
}

@FunctionalInterface
public interface Else<A> {
    A orElse(A a2);
}

@FunctionalInterface
public interface ElseSaver<A> {
    A orElse(Supplier<A> a2);
}
```
@saka1029 さん、ご指摘ありがとうございました！