OmniAICreator/Qiita-1.07M huggingface dataset:
日時の正規化

※ **2017.04.13 仕様変更**
作ったそばから仕様変更しました。
マイナスの値に対応しました。
その影響で日付のデリミタを「-」から「/」に変更しました。
そして、日付と時間でマイナスの値は意味がちょっと違います。
日付の場合は、「0」が存在しないので、「0」を指定するとひとつ前のものになります。
なので「-1」だと2つ前になります。

```
2017/12/00 → 2017/11/30
2017/12/-1 → 2017/11/29
```
時間の場合はそのまま、

```
12:00:-1   → 11:59:59
12:-1:00   → 11:59:00
```
になります。
年のマイナスはナシの方向で…

----
# 日時を正規化する

例えば、現在時刻を取得すると「**2017-04-11 22:00:00**」だったとします。
とあるモジュールに3時間後を渡そうと思うと「**25**」になります。
しかし、**JavaScript**の**Date**は**PHP**等のように自動的に日を進めて**12日**にはしてくれない。
なので正規化するモジュールを探してみたが見つからず。
しょうがないので作ったので備忘録。

引数は「**2017/04/11 25:00:00**」のフォーマットで渡します

ちなみに**CoffeeScript**です。

```CoffeeScript
normalizeDate = (str)->
    spl = str.split(" ")
    if (spl.length < 2)
        return undefined

    date = spl[0].split("/")
    if (date.length < 3)
        return undefined

    time = spl[1].split(":")
    if (time.length < 3)
        return undefined

    # 年月日の取得
    year   = parseInt(date[0])
    month  = parseInt(date[1])
    day    = parseInt(date[2])
    hour   = parseInt(time[0])
    minute = parseInt(time[1])
    second = parseInt(time[2])

    # 秒の正規化
    key = 60
    addminute = 0
    if (second >= key)
        addminute = Math.floor(second / key)
        second %= key
    else if (second < 0)
        second = key + second
        addminute--

    minute += addminute

    # 分の正規化
    key = 60
    addhour = 0
    if (minute >= key)
        addhour = Math.floor(minute / key)
        minute %= key
    else if (minute < 0)
        ninute = key + minute
        addhour--

    hour += addhour

    # 時の正規化
    key = 24
    addday = 0
    if (hour >= key)
        addday = Math.floor(hour / key)
        hour %= key
    else if (hour < 0)
        hour = key + hour
        addday--

    day += addday

    # 日の正規化
    addmonth = 0
    addyear = 0
    lastday = parseInt((new Date(year, month, 0)).toString().split(' ')[2])
    if (day > lastday)
        while (day > lastday)
            if (day > lastday)
                day -= lastday
                addmonth++
                if ((month + addmonth) > 12)
                    addyear++
                    addmonth -= 12
            lastday = parseInt((new Date(year+addyear, month+addmonth, 0)).toString().split(' ')[2])
    else if (day <= 0)
        checkmonth = month - 1
        checkyear = year
        if (checkmonth < 1)
            checkmonth = 12
            checkyear--
        lastday = parseInt((new Date(checkyear, checkmonth, 0)).toString().split(' ')[2])
        day = lastday + day
        addmonth--

    year += parseInt(addyear)
    month += parseInt(addmonth)

    # 月の正規化
    key = 12
    addyear = 0
    if (month > key)
        addyear = Math.floor(month / key)
        month %= key
    else if (month <= 0)
        month = key + month
        addyear--

    year += addyear

    ret =
        year:year
        month:("00"+parseInt(month)).slice(-2)
        day:("00"+parseInt(day)).slice(-2)
        hour:("00"+parseInt(hour)).slice(-2)
        minute:("00"+parseInt(minute)).slice(-2)
        second:("00"+parseInt(second)).slice(-2)

    return ret
```
スクリプトの最後を見てもらうと分かりますが、年月日時分秒がオブジェクトで返ってきます。
NavigationとManipulationの違い

#はじめに
３月初めよりインターンで株式会社ゆめみ(https://www.yumemi.co.jp/ja) にてHoloLensの研究開発をしている近大生のよっしーです。
国内でこの１月から提供を開始したMicroSoft製MRデバイスのHoloLensについての記事を書いていきます。

#すること
**INavigationHandlerとIManipulationHandlerの違いを解説**

いったいこの違いはなんだろう。と一度は悩んだことがあると思います。自分もけっこう調べたので違いを解説します。

#そのまえに
こちら、よく解説されているサイトなのですが、IManipulationHandlerの動画とINavigationHandlerの動画を見比べて見てください。
http://noshipu.hateblo.jp/entry/2017/01/28/133818

#なにが違うの
見比べてもらうと、手の動く量に対する値の動き方が全く違うことに気づいてもらえると思います。

**INavigationHandler**は、閾値を測り-1~1の間を変動します。手が右に動いた時、それがいかに右らしいか。という値です。なので10cm~20cmも動かせばxの値は1になり、左に同じぐらいの量動かせば-1になります。

**IManipulationHandler**は、ホールド開始地点からの実際の手の動きの量を図ります。なので20cm動かしたら、その方向に0.2ぐらいです。

#IManipurationHandler利用方法と注意
ただ、手の位置からオブジェクトまでは距離があるわけで、３ｍ離れているときにホロオブジェクトが２０ｃｍしか動かなかったらおかしいですよね？なので三角形の相似を用いて以下のようにします。

```csharp:Manipulation.cs
public class SomeObject : MonoBehaviour, IManipulationHandler {

    private Vector3 manipulationPreviousPosition;

    private void Start() {
        InputManager.Instance.AddGlobalListener(gameObject);
    }

    private void OnDestroy() {
        InputManager.Instance.RemoveGlobalListener(gameObject);
    }

  
    public void OnManipulationStarted(ManipulationEventData eventData) {
        //初期位置
        manipulationPreviousPosition = eventData.CumulativeDelta;
    }

    public void OnManipulationUpdated(ManipulationEventData eventData) {
        Move(eventData.CumulativeDelta);
    }

    public void OnManipulationCompleted(ManipulationEventData eventData) {
        // Do nothing
    }

    public void OnManipulationCanceled(ManipulationEventData eventData) {
        // Do nothing
    }

    private void Move(Vector3 CumulativeDelta) {
        Vector3 moveVector = Vector3.zero;
        //最終位置との差分を取得
        moveVector = CumulativeDelta - manipulationPreviousPosition;
　　　　
        //今回の位置を最終位置に
        manipulationPreviousPosition = CumulativeDelta;

        //手の空間上の位置は取れないので、４０ｃｍくらいとする
        float distanceCameraToHand = 0.4f;
　　　　
　　　　//カメラとオブジェクトの距離を取る
        float distanceCameraToObject = Vector3.Distance(Camera.main.transform.position, gameObject.transform.position);

        //三角形の相似で、何倍にあたるかを割り出す
        float correctionValue = distanceCameraToObject / distanceCameraToHand;
        
        //相似の倍数を手の移動距離にかける
        gameObject.transform.position += (moveVector * correctionValue);
    }
}
```

このようにするとうまくいきました。
手の空間上の位置はとれないと書きましたが、なんらかの方法でもしできる場合はもっと良くなると思うので教えてください！
SlackのemojiはSketchで作るのが最強(たぶん)


# Custom Emojiのサイズ
カスタム絵文字のアップロード画面にはこんなこと↓が書いてあって,

![スクリーンショット 2017-04-11 18.51.08.png](https://qiita-image-store.s3.amazonaws.com/0/48596/568180cc-cdcd-1c2d-e3af-f6b9c855bfb8.png "スクリーンショット 2017-04-11 18.51.08.png")

* 正方形が一番いいぞ
* 縦も横も128px超えちゃダメだぞ
* ファイルサイズは64KB以下にしろよ

と教えてくれます.
実際のところ, 正方形でない画像をアップロードすると表示したときにイマイチ綺麗に見えないし,
20x20pxのすごく小さい画像をアップロードしても小さすぎて何がなんだかわからないので,
**128x128pxキッチリ**の画像を用意するのがベストです.

# Sketchは絵文字作成にて最強
Sketchはこういういい感じのデザインツールです.
http://qiita.com/takish/items/5c94327ec8d6c2294665

Sketchのアートボード使えば簡単に128x128pxの画像をバカスカ量産できて楽しいのでみんなもこれで絵文字作ろう!

## 128x128pxでアートボードをいっぱい作る
1. 左上の+アイコンの「Insert」から「Artboard」を選択して適当な大きさでアートボードを作る
2. 右上の「Size」欄で大きさを128x128にする
3. 一応「Background Color」と「Include in Export」にはチェックを付けておいて色は真っ白にする
4. 一応「Export」欄の「Size」が1xになってるのを確認


![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/48596/ea7c06f2-36df-8266-777d-c8e768263ec8.png "Untitled.png")

ができたら, 作ったアートボードを死ぬほどコピペして画像量産体制は準備完了です.

## アートボードの上に絵文字をいっぱい作る
あとはこのアートボードの上に好きな絵文字を載せていくだけです.
文字系絵文字だろうが画像絵文字だろうが何でも作れます.

赤い丸とMask機能を使ってハンコ風絵文字を作るのが個人的に好きです.

絵文字を作ったらわかりやすい名前をアートボードにつけておくといいです. 同名アートボードがあるとエクスポート時にぶつかっちゃいますし.

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/48596/1ea63cee-94cd-cb53-13c2-323c886058d2.png "Untitled.png")

これで128x128pxの画像がまとめて作れました!
あとはこれをslackにアップロードするだけです.

# 簡単でしょ?
この方法で死ぬほど絵文字を作って死ぬほど使って職場の人にウザがられよう!
UbuntuでGitLabをomnibus版の8.15.2から9.0.4にする

[前回](http://qiita.com/miyay/items/e5ac81d54367cbbda9af)の続きです。

## 手順

1. バックアップ
2. アップデート
3. 日本語化パッチ適用

```bash
# バックアップ
sudo gitlab-rake gitlab:backup:create

# アップデート
sudo apt-get update 
sudo apt-get install gitlab-ce=9.0.4-ce.0

# 日本語パッチ
wget https://raw.githubusercontent.com/ksoichiro/gitlab-i18n-patch/master/patches/v9.0.4/app_ja.patch
cd /opt/gitlab/embedded/service/gitlab-rails
sudo patch -p1 < ~/app_ja.patch
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
```

一度omnibus版にしてしまうととてもらく。
rpmをDLするまでが長い気もする・・・
Webアプリケーションエンジニアが Coursera の機械学習講座に挑戦してやり切った話

# はじめに
昨今、ディープラーニングを初めとする機械学習がメディアでも注目されています。
ロボット・自動車の自動運転・医療など様々な分野に機械学習を組み込む流れがIT業界に起こっているのではないかと感じております。
そこでWebアプリケーションエンジニアである私も機械学習の分野を学びたいと思い、Coursera の機械学習講座を受けることにしました。
この記事では機械学習講座の簡単な紹介と所感について記載します。

# Coursera 機械学習講座
[https://www.coursera.org/learn/machine-learning](https://www.coursera.org/learn/machine-learning)
Courseraでは無料で受けられるオンライン講座を複数提供しています。
今回はその中の機械学習(Machine Learning)の講座を受講しました。(無料で受講できます。)

## 機械学習講座
この講座ではシリコンバレーの企業を相手に機械学習の指導をしている Andrew Ng 氏の講義を動画で閲覧することができます。
内容は全て英語になりますが、日本語の字幕も出せるため英語に自信の無い方でも問題なく受講できるかと思います。
この講座は約3ヵ月間続き、各週それぞれに用意されているクイズと演習問題を実施することでスキルの習得と知識の確認を行うことができます。

## 学べること
この講座では機械学習の概要から、かなり詳細なアルゴリズムの世界まで学ぶことができます。
また、実際にチームで機械学習を用いたシステムを作成する際のやり方や注意点なども細かく解説してくれます。

# Coursera 機械学習講座を終えて
## 総学習時間
私が3ヵ月間でこの講座にかけた時間は約90時間でした。
仕事とは別のプライベートな時間を使用して実施しましたので結構大変でした。
しかし、それだけの時間をかけるだけの価値のある講座だと思います。
機械学習で必要な考え方を習得することができ、3か月前よりも明らかに成長できている実感が持てています。

## 3ヵ月間でやりきるために
3か月間仕事外でみっちり勉強するのは大変でした。
私の場合、一緒に挑戦する仲間がいたからこそ完了することができたのではないかと思っています。
モチベーションを保つためにも一緒に頑張る仲間がいることはとても重要だと思います。

## 所感
機械学習講座を始める前までは、機械学習を始めるにあたって何から手を付ければいいのかわからない状態でした。
本を呼んでも詳しいところの理解は全くできない状態でしたが、機械学習講座で学ぶことで"ニューラルネットワーク"や"シグモイド関数"など単語の意味だけでなく、何故それが必要なのかまで理解することができたと思います。
ただし、かなり難易度が高いところも多く、正直なところまだまだ理解できていないところもたくさんあります。
その辺はこれから実践的にモノを作っていく際に思い出して調べていければいいかなと思っています。

## 最後に
この素晴らしい機械学習講座を提供してくださいました Andrew Ng 氏と関係者の方々には本当に感謝しております。
おかげ様で機械学習の面白さを知ることができ、非常に有益な時間を過ごすことができました。
今後、学んだことを糧に機械学習を使用した新たな価値の創造を目指していきたいと思います。

# 私の機械学習講座のメモのリンク集
適当なメモなのであまり期待しないでください…。
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week1)](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week2)](http://qiita.com/KirariGlock/items/81aa37e4e090733bc5df)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week3)](http://qiita.com/KirariGlock/items/f491c866a27ca1965b74)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week4)](http://qiita.com/KirariGlock/items/e58913284efea9ffaabd)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week5)](http://qiita.com/KirariGlock/items/dc5018a6b15fcc785650)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week6)](http://qiita.com/KirariGlock/items/96a23360750cf39bb291)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week7)](http://qiita.com/KirariGlock/items/58b05c2d2ae278b86a51)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week8)](http://qiita.com/KirariGlock/items/2e055100f9e8dbe2d1ac)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week9)](http://qiita.com/KirariGlock/items/f0a2a8078d46dcec77eb)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week10)](http://qiita.com/KirariGlock/items/ed0128ff7c6adb88104f)
[Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week11)](http://qiita.com/KirariGlock/items/8834f2df2e2d2c7b2653)
[Azure] ポータルにアカウント指定でログインする方法(URL指定)

Azureで複数のアカウントを使用している場合、Azureポータルにログイン後、アカウントを切り替えて使う必要があります。

Azureポータル : https://portal.azure.com/

<img src="https://qiita-image-store.s3.amazonaws.com/0/172826/118e2dea-f552-63fd-d2b3-b46cc7c644d0.png" width=30%>

上記、オレンジの部分が実際のアカウント名ですが、デフォルト指定は1個しかできない [^1] ので、それ以外はログイン後に切り替える必要があります。

複数のプロジェクトが並行して進んでいる場合は、切り替えの回数も多くなり煩わしいです。
その手間を無くすためには、URLで「アカウントの既定のディレクトリ」を直接指定すれば各アカウントに直接ログインすることができます。

__``https://portal.azure.com/<既定のディレクトリ>``__

ここで問題になるのが既定のディレクトリ(形式は ``xxxxxxxxxxxxxxx.onmicrosoft.com``)ですが、ポータルで以下の通り確認できます。

1) 直接表示したいアカウントにログイン後、すべてのリソースを選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/172826/709caaf5-e727-e567-27fc-80918554e544.png" width=40%>

2) 表示された画面にて、既定のディレクトリ () の中に書かれているのが指定すべきディレクトリです [^2]

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/a8eaad75-f1e0-ff56-60b0-8ee848e29110.png)

後は確認したディレクトリを指定してログインすれば直接表示されるようになります。例えばディレクトリが visionartsdemoaccount.onmicrosoft.com の場合は

__``https://portal.azure.com/visionartsdemoaccount.onmicrosoft.com``__ 

となります。

アカウント所有者だけは旧ポータルでディレクトリ名を確認できますが、一般のユーザ権限では意外と見つけにくい設定です。

[^1]: 正確にはデフォルト指定するのはサブスクリプション(Subscription)で、そのサブスクリプションが含まれるアカウントがデフォルト表示されることになります。

[^2]: すべてのリソース以外でも、多くのサービスではタイトル部分に既定のディレクトリが表示されています。表示されているものはどこでも同じです。
[WIP] rspec

# 良いrspecを書くためのguide
http://betterspecs.org/jp/

# rspec実行
```shell-session
# RAILS_ENVの指定を忘れなく。
RAILS_ENV=test bundle exec rspec
# --format documentationを付けて、実行結果がdocumentとしても分かりやすいのが確認した方がいい
RAILS_ENV=test bundle exec rspec　--format documentation　
```
virtualenvとdirenvによるpython環境構築

システムのpythonを使わず，出来るだけ簡単にpythonのバージョン管理と仮想環境の構築をする．

# pythonインタープリタのバージョン管理
## pythonzのインストール
```bash
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
$ echo '[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> $HOME/.bashrc
$ exec $SHELL
```
## pythonのインストールとリストアップ
```bash
$ pythonz list -a # インストールできるpythonの確認
$ pythonz install 3.6.0
# インストールしたpythonのリスト
$ pythonz list
```

# ユーザのデフォルトpython環境の設定
## virtualenvのインストール
このときだけはシステムのpythonを使わなければならない

```bash
$ sudo pip install virtualenv
( or $ pip install --user virtualenv)
```

## デフォルト用の環境構築
```bash
$ mkdir -p $HOME/.virtualenvs
$ virtualenv -p $HOME/.pythonz/pythons/CPython-3.6.0/bin/python $HOME/.virtualenvs/default
$ echo ". $HOME/.virtualenvs/default/bin/activate" >> $HOME/.zshrc
$ exec $SHELL
```

## プロジェクトごとの環境構築
### direnv のインストール
go がインストールされている前提

```bash
$ go get github.com/direnv/direnv
$ cd $GOPATH/src/github.com/dirnev/direnv
$ go install
$ echo 'type direnv > /dev/null 2>&1 && eval "$(direnv hook bash)" ' >> $HOME/.zshrc

```

### direnv の使い方
```bash
$ mkdir -p project
$ cd project
$ direnv edit .
```

```..envrc
layout python $(pythonz locate 3.6.0)
```

# 参考

[Pythonの開発環境を構築(pythonz, virtualenv, direnv)](http://qiita.com/jnotoya/items/ca9a0dfee6b9f084f4da)
デバッグ用のコードが残っているとGitでコミットできないようにする（Python編）


[デバッグ用のコードが残っているとGitでコミットできないようにする - Masteries](http://papix.hatenablog.com/entry/2017/04/02/185223)
の記事の返歌です。

こちらの記事では、`git commit` の際(pre-commit)に、変数の中身を人間が見やすい形で出力する [`Data::Printer`](http://search.cpan.org/~garu/Data-Printer-0.38/lib/Data/Printer.pm) を`use`しているのかどうか [The Silver Searcher](https://github.com/ggreer/the_silver_searcher/blob/master/doc/ag.1.md) の`ag`コマンドを使ってPerlスクリプトを検索し、残っていればcommitできないようにしています。

この発想を借りて、PythonではPerlのDDPに相当するのが [pprint](https://docs.python.jp/3/library/pprint.html) なので、これを検索文字列として以下のようにすれば同様のことができそうです。

```bash:pre-commit
#!/bin/sh

word='pprint'

if ag --python $word $(git rev-parse --show-toplevel); then
    echo "some file contains code for debugging: $word"
    exit 1;
fi
```

個人的には「pprintが残っているかどうか」だけじゃなく、「pprintが残っているかどうか、残っていればどこに残っているのか」まで出力して欲しいなと思ったため、元記事にある `> /dev/null` の部分を削除しています。これでcommit時に`ag`コマンドでの検索結果をそのまま出力してくれるので、こちらの方が便利そうです。

また、`ag`を導入している場合は上記のpre-commitファイルで問題ないですが、導入していない場合は`grep`を使った下記のスクリプトでも良さそうです。（ただし、`.py`という拡張子が付いているファイルが検索対象となるので、`ag`と多少挙動が変わります。）

```bash:pre-commit
#!/bin/sh

word='pprint'

if grep -r $word $(git rev-parse --show-toplevel) --include='*.py'; then
    echo "some file contains code for debugging: $word"
    exit 1;
fi
```

※ そもそもデバッグ時に `pprint` を使っていないよ、という人がいると思います。そういった人はこの発想を元に __デバッグに使っているコードを検索対象とする__ ようにすれば良さそうですね。
Python スクリプト実行時に標準出力がパイプされているかどうか判断する

[実行時に標準出力がパイプされているかどうか判断するにはisattyを使う - Qiita](http://qiita.com/yuku_t/items/1613f1fccad7b3b0a511)

これを Python でもやろうと思って調べたのでメモ。

``` py:isatty.py
import sys

print(sys.stdout.isatty())
```

実行するとこうなる

```
$ python isatty.py
True
$ python isatty.py | cat
False
```

## 補足
これでもいいっぽい

``` python:isatty.py
import os, sys

print(os.isatty(sys.stdout.fileno()))
```
Embulkについて色々調べたことの俺得リンク集

過去に色々Embulkについて調べてgistなどに書き散らかしてた記事のリンク集です。
どこに書いたかわからなくなってしまったので、、、
将来FAQみたいなものになるといいな。

書いてあることについて詳しく知りたい方は、[私に(hiroysato)](https://twitter.com/hiroysato)にお問い合わせください。

### JSONデータ中の時刻欄に`""`がありnullとしたい。

```json
{ "time":"2017-02-22", "name":"Alice" }
{ "time":"", "name":"Bob" }
```

こんなデータの2番目のデータを時刻(時刻なし)としてパースしたい。

#### 回答: フィルタで処理

jsonは`null`は通常`{ "time": }`のように書くため、jsonlパーサーでは上記データを時刻として取り扱うことはできません。

次のプラグインを組み合わせると`""`を時刻なしとして扱うことができます。

* time部分は文字列型として取り込み
* [embulk-filter-null_string](https://github.com/hiroyuki-sato/embulk-filter-null_string)で`""`を`null`に変換
* [embulk-filter-timestamp_format](https://github.com/sonots/embulk-filter-timestamp_format) で時刻をパース、時刻型に変換

### PostgreSQLのuuid型を利用したい。

column_optionsを使いましょう

* [例](https://gist.github.com/hiroyuki-sato/2a6e54c9281b5650312c2e514749ac9b)


### 時刻のフォーマットが複数あるのをパースしたい。

[embulk-filter-timestamp_format](https://github.com/sonots/embulk-filter-timestamp_format) を使いましょう。

## 複雑なJSONデータを利用したい。

### 回答

embulk-parser-jsonpathとembulk-filter-expand_jsonを組み合わせると良いと思います。[例](https://gist.github.com/hiroyuki-sato/b117a3bf19bd26214c9d518a48b5785b)


### runはうまく動くのにPreviewは失敗する

これはguessやpreviewが最初のファイルの32KBしか読まないのが原因です。
[こちら](https://github.com/embulk/embulk/pull/572)の機能で将来PreviewやGuessのサイズを指定できるようになります。

### CSVパーサのnull_stringの使い方がよくわからない。

公式ドキュメントに表を書きました。[CSV parser plugin](http://www.embulk.org/docs/built-in.html#id3)

## embulk selfupdateってembulk実行中にアップデートしても大丈夫？

* 大丈夫みたいです。https://gist.github.com/hiroyuki-sato/4fa1cac16beda8f52a4aeefcb16b0564
* [参考twitter](https://twitter.com/sonots/status/849913359319220224)


## embulk-input-postgresqlってviewは読めるの？

読めます。

* [テスト](https://gist.github.com/hiroyuki-sato/d3d1b79c594801a85f54186f707db4ba)
* [参考](https://twitter.com/hishidama/status/851700141102735360)


## type: fileで、path_prefixがシンボリックリンクだとエラーになる。

現在(0.8.18)はそのような動作です。これがマージされたら直ります。

* [Fix #584 follow link if path prefix is symlink.](https://github.com/embulk/embulk/pull/585)


## type: renameのcolumnsは非推奨？

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hiroysato">@hiroysato</a> 記事のケースの場合はコメントされているようにinの方にcolumnsをつければ大丈夫かと思います。カラム名を直接指定するrenameは混乱が多く、使わないで済むなら使わないことを推奨…という感じですね (not recommendedであってdeprecatedではありません)</p>&mdash; Dai MIKURUBE (@dmikurube) <a href="https://twitter.com/dmikurube/status/857164779705839616">2017年4月26日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## embulk-filter-timestamp_format

* [embulk-filter-timestamp_format のjavaとJRubyのパーサーの動作について](embulk-filter-timestamp_format のjavaとJRubyのパーサーの動作について) `2015-01-27 19:23:49 aaa`のようなデータをパースした場合、JRubyはパースできるが、Javaはエラーになる。
Ansible で WAN につながっている Routerの if を up down する。

# 必要となった理由
WAN側回線工事をするので、ほっとくと、IFがup/downしたりしてなんか辛そうなので、
あらかじめ落としておいて、工事が終わるころにまた上げるようにするのを自動化したいという要望があったため。

# NW構成
よくあるWAN回線2本に
それぞれWANルータがぶら下がってその下にFWがある感じ。
WAN-RT はCisco(IOS-XE)でした。

```
WAN回線A - WAN-RT01 --+--FW -- internal   
WAN回線B - WAN-RT02 --|
```

# ファイル構成
```
+inventory
+ifchange.yml
+tasks/
  +if_check.yml
  +if_up.yml
  +if_down.yml
```

# ファイル
## inventory

```
[RT01]
192.168.1.1   interface=GigabitEthernet0/0/0

[RT02]
192.168.1.2   interface=GigabitEthernet0/0/1
```

## ifchange.yml
```
- hosts: "{{ host }}"
  connection: local
  gather_facts: false
  vars:
    ansible_python_interpreter: "path to python"
    cli:
      host: "{{ inventory_hostname }}"
      username: login user name (priv 15)
      password: login pasword
  tasks:
    - fail:
        msg: 'mode is not set or invalid. require "up" or "down".'
      when: mode is undefined or not( mode == "up" or mode == "down")

    - include: tasks/if_check.yml
    - include: "tasks/if_{{ mode }}.yml"
    - include: tasks/if_check.yml      
```

## tasks/if_check.yml
```
- name: interface check
  iso_facts:
    gather_subset: interface
    provider: "{{ cli }}"
```

## tasks/if_up.yml
```
- name: interface up
  iso_config:
    provider: "{{ cli }}"
    lines:
      - "no shutdown"
    parents: "interface {{ interface }}"
  when: item.key == "{{ interface }}" and not item.value.operstatus == "up"
  with_dict: "{{ ansible_net_interfaces|default({}) }}"
```
## tasks/if_up.yml
```
- name: interface up
  iso_config:
    provider: "{{ cli }}"
    lines:
      - "shutdown"
    parents: "interface {{ interface }}" 
  when: item.key == "{{ interface }}" and item.value.operstatus == "up"
  with_dict: "{{ ansible_net_interfaces|default({}) }}"
```

# 実行方法
```
RT01のインターフェースを落とす
# ansible-playbook -i inventory ifchange.yml -e "mode=down host=RT01"
RT02のインターフェースを上げる
# ansible-playbook -i inventory ifchange.yml -e "mode=up host=RT02"
```


# なんでこんなことしたの？
時間が余ったからです。

最初はワンショット的に使えればいいということで
ルータ1のIFを落とすplaybookとルータ1のIFを上げるplaybook を書いてました。

# 実際どう使ってるの？
```
echo 'ansible-playbook -i inventory ifchange.yml -e "mode=down host=RT01" | sendmail mail@address.com' | at hh:mm MM/DD/YY
```
とか

```
echo 'ansible-playbook -i inventory ifchange.yml -e "mode=up host=RT01" | sendmail mail@address.com' | at hh:mm MM/DD/YY
```
とか
そんな感じで使ってます。

# おわりに。

ある程度パラメータ化しつつ、 最終的にはこういうのを貯めたやつをまとめつつ、WEB画面つくって、ぽちっとすると登録される
みたいなものが作れると良いかなぁなんて。

こういうのは自分のワークフローに従ってよく発生するものを
個別になんとなく、楽できるようにつくって、それを集めて持っておく
というのが正解なんだろうか。
postgresqlでデータベースの一覧をSQLで取得する


短いTIPSなので、さっそく本題に。

```bash
psql -d "postgres" -h {host} -U postgres
```

```sql
SELECT 
  d.datname AS "Name",
  a.rolname AS "Owner",
  pg_encoding_to_char(d.encoding) AS "Encoding",
  d.datcollate AS "Collation",
  d.datctype AS "Ctype",
  d.datacl AS "Access privileg"
FROM pg_database d
  JOIN pg_authid a ON a.OID = d.datdba
;
```

こんな感じでリストが取得できるはずです。

|   Name    |  Owner   | Encoding |  Collation  | Ctype | Access privileges |
| --------- | ----------|----------|----------|----------|----------|----------|
| postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | {=c/postgres,postgres=CTc/postgres}
| template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | {=c/postgres,postgres=CTc/postgres} |

ではでは。
クラス変数をDOTweenする



DOTween http://dotween.demigiant.com/ でクラス変数をトゥイーンさせるとき、ややこしくていつも忘れてしまうので、そのメモです。


##やりかた

```csharp:dotween
public float piyo = 0;

void hoge(){
	//piyo を tgt に time時間 でトゥイーン
	var tgt = 100f;
	var time = 1f;
	DOTween.To (()=>piyo, (value)=>piyo = value, tgt, time).SetEase(Ease.InOutSine).OnComplete(hogeCallback);
}

void hogeCallback(){
	//終了したら呼ばれます
}
```

なんとVector3とかでもいけます。

```csharp:dotween
public Vector3 piyo = 0;

void hoge(){
	//piyo を tgt に time時間 でトゥイーン
	var tgt = new Vector3(1f,2f,3f);
	var time = 1f;
	DOTween.To (()=>piyo, (value)=>piyo = value, tgt, time).SetEase(Ease.InOutSine).OnComplete(hogeCallback);
}

void hogeCallback(){
	//終了したら呼ばれます
}
```

## 違うやり方

こっちのほうが手軽

```csharp:dotween
//DOVirtual.Float(from, to, duration, onUpdate)
DOVirtual.Float(0f, 100f, 3f, value =>
{
  Debug.Log("value: " + value);
  hoge = value;
});
```


## 参考にしたページ
http://albatrus.com/main/unity/7413
『一番乗りの人』がGit&Eclipseでプロジェクトを作成する方法

# はじめに
フレームワークを使用した開発の際に『一番乗りの人』がやる手順。
なんかイマイチ覚えきれないので覚え書き。

## サーバーでの作業
### Bareリポジトリを作成する。
```
[root@server ~]# su - gituser
[gituser@server ~]$ cd git
[gituser@server ~]$ pwd
/home/gituser/git
[gituser@server ~]$ mkdir newRepo.git
[gituser@server ~]$ cd newRepo.git
[gituser@server ~]$ git init --bare --share=true
```
サーバーには特に作業ファイルが不要ないため[--bare]オプションを付加しておく。

## Eclipseでの作業
### Gitリポジトリの複製
1. [Gitリポジトリー]-[Girリポジトリーを複製し、このビューへ追加]
1. URIの複製を選択し、[次へ]を押下します。

![010-010.PNG](https://qiita-image-store.s3.amazonaws.com/0/173979/4b2e46ae-ac1e-3202-b208-4f09940287f6.png)

### リポジトリのロケーションを入力
サーバーへ接続するため、作成したリポジトリ名を指定します。

![010-020.PNG](https://qiita-image-store.s3.amazonaws.com/0/173979/ced264b6-bc0b-099c-8708-088df9f9c41a.png)

### ローカルの保管場所を指定します。
クライアントの適当なディレクトリを指定します。
これでクライアントに、Gitのクローンリポジトリが作成されます。

![010-030.PNG](https://qiita-image-store.s3.amazonaws.com/0/173979/f2d258e3-f5b7-bae4-080b-87e82fd7096d.png)

### プロジェクトの作成
Eclipseから『一番乗りの人』が作成するプロジェクトを作成します。
[ファイル]-[新規]-[Javaプロジェクト]

ロケーションに***リポジトリのクローンを作成したディレクトリ***を指定します。

![020-020.PNG](https://qiita-image-store.s3.amazonaws.com/0/173979/0984c1e2-1c3b-b99f-332b-59d33f0ef201.png)

後は、いつもの様にすればOK
pandasのDataFrame形式の２つの確率分布のcos類似度を計算するスクリプト



```python:utils.py
def calc_cos_mat(mat_df1, mat_df2):
    """
     Args:
        pd.DataFrame: mat_df1, mat_df2
        The modals of mat_df1 column and mat_df2 column must be same!
    Returns:
        pd.DataFrame: cosign_simularity_matrix_df

    """
    import pandas as pd
    from sklearn.preprocessing import normalize

    assert type(mat_df1) == pd.core.frame.DataFrame
    assert type(mat_df1) == pd.core.frame.DataFrame
    assert mat_df1.shape[1] == mat_df2.shape[1]

    normalized_mat_df1 = pd.DataFrame(normalize(mat_df1), index=mat_df1.index)
    normalized_mat_df2 = pd.DataFrame(normalize(mat_df2), index=mat_df2.index)

    return normalized_mat_df1.dot(normalized_mat_df2.T)


def get_sorted_mats(mat_df):
    """ change the order column for each row

     Args:
        pd.DataFrame: mat_df
    Returns:
        pd.DataFrame: sorted_column_mat, probability_mat

    """

    jan_mat = pd.DataFrame()
    prob_mat = pd.DataFrame()

    for i, idx in enumerate(mat_df.index):
        jan =  pd.DataFrame(mat_df.sort_values(idx, axis=1, ascending=False).columns).T
        jan.index = [idx]
        prob =  pd.DataFrame(mat_df.sort_values(idx, axis=1, ascending=False).loc[idx].values).T
        prob.index = [idx]
        jan_mat = pd.concat([jan_mat, jan])
        prob_mat = pd.concat([prob_mat, prob])

    return jan_mat, prob_mat
```
UICollectionViewに設定したUIRefreshControlが常に動くようにする

## 実行環境

* Xcode 8.3.1
* Swift 3.1
* Deployment Target 9.0

## 問題と対応

* UIColelctionViewのコンテンツ(CellやSectionView)が画面全体を覆っていない場合にUIRefreshControlが動いていなかった
* 下記コードを追加して対応

```swift
collectionView.alwaysBounceVertical = true
```

## 参考にしたページ

* [http://stackoverflow.com/questions/14678727/uirefreshcontrol-on-uicollectionview-only-works-if-the-collection-fills-the-heig](http://stackoverflow.com/questions/14678727/uirefreshcontrol-on-uicollectionview-only-works-if-the-collection-fills-the-heig)
Azure Machine Learning の実行環境

Japan Taxiでは、Azure Machine Learningを機械学習の環境として用いていますが、様々な検証を様々なスケールで試していく中で、どういう計算機環境が使われているのか気になりました。

Azure Machine LearningにはRやPythonのスクリプトを実行する環境があるので、システム環境を調べることができます。

# Azure Machine Learning が実行されているOSは？

```R
Sys.Info()
```

```R
 sysname         release         version        nodename         machine 

      "Windows"         "7 x64"    "build 9200"        "CLIENT"        "x86-64" 

          login            user  effective_user 

"Administrator" "Administrator" "Administrator" 
```
Windowsのクライアント64bit OS Windows 8のようです。（ビルド9200より）この辺は充てられたノードによって違うのかもしれませんが、OSはクライアントOSがクラスタ内にあり割り当てられているということでしょうか？

## Azure Machine Learning で使われているCPUは？

いろいろやりましたが、はっきりとしたことはわかりませんでした。

```R
Sys.getenv(...)
```
これは使えないようでした。

```R
library(benchnmarkme)
get_cpu()
```
こちらはライブラリが用意されていないようです。

```R
library(parallel)
detectCores()
```
２コアのノードが割り当てられるということがわかりました。クラスタサイズなどはおそらく知る由もないので、おそらく検出できるのはこの辺までかと思われます。。。


# まとめ

Azure Machine Learningで処理をしていると、スケールを2倍にしてもスピードが変化しないなどオートスケーリングしているとしか思えない動きをします。その仕組みを知らなくても十分使えるのですが、行っている処理がどれほど重いものなのかをつい忘れてしまうので、処理量を測る方法がほしいなと思うのは私だけでしょうか？
Sublime Text/Emmet の自動ベンダープレフィックス補完を切る

Emmetのユーザー設定ファイルに下記内容を追加する。 

```json:Emmet.sublime-settings
{
	"preferences": {
		"scss.autoInsertVendorPrefixes": false,
		"autoInsertCssPrefixedEnabled": false
	},
}
```
【iOS】ステータスバーのカスタマイズ【Swift3.0】

簡単そうでひと手間必要なステータスバーのカスタマイズ。すぐ忘れるのでメモ。

# Ex. 文字色を白にし、黒系の背景にする
<img width="375" alt="スクリーンショット_2017-04-12_10_29_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/8162bfc2-c95a-9fe8-ae80-499d5319da2b.png">


## 1. 背景色を変更する

ステタースバーの背景を直接操作する方法はないので、同サイズのViewを敷きつめることにより実現

```Swift
// UIViewControllerを継承しているクラスで

let statusBar = UIView(frame:CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
statusBar.backgroundColor = UIColor(red: 0.286, green: 0.208, blue: 0.208, alpha: 1.0)
        
view.addSubview(statusBar)
```

## 2. 文字色を白に変更する
### 1. ターゲット設定のGeneral -> Deployment info　`Status Bar Style`にてLightを選択
<img width="1018" alt="スクリーンショット 2017-04-11 17.15.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/f8f00b46-08a5-7cdd-75a9-db6f5bab229f.png">

### 2. info.plistに`View controller-based status bar appearance`を追加し、値を`NO`に。

※ 1. だけではスタートアップスクリーンのみにしか適用されない
配列で送られてきたparamsの取り出し方

# 配列で送られてきたparamsの取り出し方
formなどで子要素などを親要素のparamsの中に配列で入れて送った場合など

## 取り出したいparams

```
"questions"=>[
{"content"=>"質問1",
"question_choices"=>[
{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}
]},
{"content"=>"質問2",
"question_choices"=>[
{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}
]}
]
```

##### 送られてきたparamsの説明
- 質問(question/親)は二つ
- 各質問に対して二個ずつ選択肢(question_choice/子)を設定
- 質問と選択肢は一つのフォームでまとめて送るようにしてある

## 取り出し方&DBへの保存の仕方
```
questions_require.each do |question_require|
  question_params = question_require.permit(:content)
  question = Question.new(question_params)

  question_choices_require = question_require[:question_choices]

  question_choices_require.each do |question_choice_require|
    question_choice_params = question_choice_require.permit(:content)
    question.question_choices.build(question_choice_params)
  end
end


private

def questions_require
  params.require(:questions)
end
```

##### 説明
- まずquestions_requireで

```
{"content"=>"質問1",
"question_choices"=>[
{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}
]},
{"content"=>"質問2",
"question_choices"=>[
{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}
]}
```
を取り出してくる

- question_requireで

```
{"content"=>"質問1",
"question_choices"=>[
{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}
]}
```
と

```
{"content"=>"質問2",
"question_choices"=>[
{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}
]}
```
をそれぞれeachで回して取り出してくる

- question_require.permit(:content)で

```
"content"=>"質問1"
```
と

```
"content"=>"質問2"
```
をそれぞれeachで回してpermit
->これでちゃんとストロングパラメータが書けたのでQuestion.newできる

- 次に
question_choices_require = question_require[:question_choices]で

```
[{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}]
```
と

```
[{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}]
```
をeachで回して取り出してくる

- question_choice_require.permit(:content)で

```
"content"=>"選択肢1.1"
```
と

```
"content"=>"選択肢1.2"
```
と

```
"content"=>"選択肢2.1"
```
と

```
"content"=>"選択肢2.2"
```
をそれぞれeachで回してpermit
=>これでストロングパラメータがちゃんと書けたのでbuildできる


eachで回した分を丁寧に書いたらめっちゃ見にくくなってしまった。。。むむむ
Redashで複数データソースの結果をpandasを使って可視化する

RedashでBigQueryとRedshiftのクエリ結果を組み合わせて使いたいときはないでしょうか。
Redashでは[Query Results (Alpha) Data Source](https://redash.io/help/queries/using-datasets-as-data-sources.html) という機能もあるのですが、 OSS版では2017/4/11時点ではまだ提供されていないようです。

そこでPython pandasを使い、複数のクエリ結果を組み合わせてデータの可視化をしてみます。

以下、PythonのData Sourceを選択しているものとします。

# redash編
## 他のクエリ結果を取得する
<クエリID>はクエリのURL末尾の数字です。
`get_query_result` で他のクエリで作成した結果を取得できます

```py

get_query_result(<クエリID>)['rows']
```

## 結果を出力する
### カラムを設定する
`add_result_column` でカラムを設定できます

```py
result = {}

add_result_column(result, 'date', '', 'date')
add_result_column(result, 'hoge_count', '', 'integer')
add_result_column(result, 'piyo_count', '', 'integer')
```

### データをつめる
`add_result_row` でデータを詰めて行くことが出来ます。

```
 add_result_row(result, { hoge: 'ほげほげー' }
```

# pandas編
別にpandasは必須ではないですが、結果をマージしたりグルーピングしてカウントしたいとかだと使った方が良さそうです。

## DataFrameにデータをつめる
pandasではDataFrameというのに値を詰めて色々とゴニョるらしい

```py

import pandas as pd

rows = get_query_result(<クエリID>)['rows']
df = pd.DataFrame(rows)

```

## クエリの結果をマージする
同じ `user_id` というカラムを持つクエリ結果を取得してマージしたいときは以下のようにすればよい。
left joinするとき、値にNanがあると集計処理とかでpandasがエラーを吐いたりして辛いので、 `fillna` すると良さそうです。

```py

a_rows = get_query_result(<クエリID>)['rows']
b_rows = get_query_result(<クエリID>)['rows']

# inner join
pd.merge(a_rows, b_rows)
# left join
pd.merge(a_rows, b_rows, how='left')
# left join (Nanになる箇所を0で穴埋め)
pd.merge(a_rows, b_rows, how='left').fillna(0)
```

## 条件に一致する結果のみ取得する
```py
df[df['hoge_flag'] == True]
```

## XX別に集計してDataFrameにする
Jupyter Notebook とかでやるならこんなことする必要あんまりないと思うのですが、最終的にRedashで出力することを考えると、 `groupby` `count` とかしたあとにもう一度DataFrame形式にしたほうが色々と都合がよいです。カウントした結果を以下のようなDataFrame形式で再度扱いたいときは、こうします。

|user_id|count|
--- | ---
1 | 50
3 | 24
5| 13


```py
pd.DataFrame({'count': df.groupby('user_id').size()}).reset_index()
# 日付別集計とか
pd.DataFrame({'count': df.groupby(pd.to_datetime(df['created_at']).dt.strftime('%Y-%m-%d')).size()}).reset_index()
```

## DataFrameから一行ずつ取り出してデータに詰める
`df.iterrows()` とすると `for index, row in...` の形式で一行ずつ中身を `add_result_row` にしていくことができます

```py

for index, row in df.iterrows():
    add_result_row(result,
    { 
        'date': row['created_at'],
        'hoge_count': row['hoge_count'],
        'piyo_count': row['piyo_count'],
    })
```

これで後は普通にSQLを書いたときと同じくグラフ化したりすることが可能です。
Bitnami Wordpress on Azure 利用メモ

# 想定読者

* Azure で Bitnami Wordpress 触ってみようと思う方
* Bitnami プロダクトは、触ったことない方

オンプレで何度か利用したことがあったので、Azureでも検索上位だったので使ってみようと試したときのメモです。


# Azure で Wordpress

クラウドサービス利用のメリットの一つとして、テンプレート化されたマシンなどが用意されてることと思います。Microsoft Azureの場合は、Marketplaceから、Compute （VM）やStorageなどが選べる形になってます。

![marketplace_on_azue.png](https://qiita-image-store.s3.amazonaws.com/0/33044/8e6ec41e-7bf1-9baa-d092-401c0c444b36.png)

ここからWordpressを選択すると、Wordpressセットアップ済みのCompute （VM） が作成されて、あら便利。ただ、作成元のテンプレート内容を少し知っておかないと、使うときに戸惑います（あたりまえですが。。。）

# Bitnami プロダクト

今回 [WordPress 4.7.3-0 (Ubuntu 14.04) , 公開元 Bitnami] を選択してWordpressを構築してみました。デプロイモデルを選択する画面で、詳しく説明されている情報を見逃さずに進めることがポイントです。

![bitnami-wordpress-on-azure.png](https://qiita-image-store.s3.amazonaws.com/0/33044/f13c881b-a034-7d2c-8c84-a7e500ea44cf.png)

* Default サーバ管理者名 ： user
* パスワードを知るために : [ここを参照](https://docs.bitnami.com/azure/faq/#how-to-find-application-credentials)

上記のサイトに書いてある重要な情報としては、デプロイ後の初回起動時にのみ初回アクセス用のパスワードが、ブート診断 （Boot diagnostics） に出力されてるという点。

![azure-boot.png](https://qiita-image-store.s3.amazonaws.com/0/33044/36d2f06a-346c-8c73-6a83-3b6589bd7539.png)

さくっと見逃して一度停止してしまった私は、発見できず使えないVMを削除しました。。。次のように、あらゆるところで利用しますので、適切なパスワードに変更まで無くさないようにしましょう（再起動すると、もう見れませんから）。


## Wordpress

次のような構成で構築されています。

* Apache 2.4.x (Listen 80, 443:SSL自己証明書)
* FastCGI + PHP 7.x
* MySQL 5.7.x

Wordpressの管理画面アクセスの為には、前述の管理者名とパスワードを使ってログイン可能です。

## phpMyAdmin

Wordpressのバックエンドの MySQL 管理のために構築済みです。ただし、デフォルトではlocalhostからのアクセスしか受け付けていません。

* アクセスするための [Quickguide](http://wp011.southeastasia.cloudapp.azure.com/bitnami/index.html)

上記によるとSSHで接続して、ポートフォワーディング / Tunnel を使ってね、という事でした。Windowsの場合はPutty、Linux&Macの場合にはsshコマンドの例があります。

設定例としては、次のようなものが説明されていました。設定後、接続側PCのブラウザで http://localhost:8888/phpmyadmin/ でアクセスOKです。

* サーバ側（Remote） : localhost:80
* 接続側（Local） : 8888 port

phpMyAdmin管理画面アクセスの為には、rootと前述のパスワードを使ってログイン可能です。

## MySQLに直接接続したい場合

[Bitnami MySQL for Microsoft Azure](https://docs.bitnami.com/azure/components/mysql/)

* mysql -uroot -p

で、パスワードは前述のとおり（アプリケーションパスワードと同じ）です。


## 説明バナーを削除したい

これらの説明が書かれてるBitnamiのバナーの削除方法です。

* [QuickGuide](https://docs.bitnami.com/azure/components/bninfo/)

bnconfig というBitnamiツールを利用するのが一番はやいようでした。

* sudo /opt/bitnami/apps/APPNAME/bnconfig --disable_banner 1
* sudo /opt/bitnami/ctlscript.sh restart apache


# その他

各種 /opt/bitnami/ 配下に収められているので、何が専用なのかハッキリするのはメリットかな。aptやyumの管理下ではないので、confファイルの配置などは、自分で追いかけるなどしてなれる必要はありますね。


先ほどのパスワードの件ですが、ログないかなーって探してみたら、こちらに！？が、このファイルは起動の度に上書きされるので、やはり一度見逃して、再起動・停止＆起動を行った場合には見れないようです。

* /opt/bitnami/var/log/pre-start.log 

作ったインスタンスは、ちゃんと管理者権限まで確認してからシャットダウンしましょうという教訓。
カスタムViewをNibから初期化の最新版

# はじめに
[カスタムViewをNibから初期化し、IBDesignableとIBInspectableで便利に使う](http://himaratsu.hatenablog.com/entry/ios/customview)
こちらの記事を参考にしてXibをコードから生成したり、View部品を作っています。
対象の記事が古くなっていたので、コードの部分のみを書き直します。

# 親クラスを作成する。
元の記事ではそのまま書かれていましたが、僕はいくつもの部品を作りたかったので親クラスを作成しました。

```swift
class UINibView: UIView {
    // コードから初期化はここから
    override init(frame: CGRect) {
        super.init(frame: frame)
        comminInit()
    }
    
    // Storyboard/xib から初期化はここから
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        comminInit()
    }
    
    // 初期化後に呼びされる。
    func afterInit() {}
    
    // xibからカスタムViewを読み込んで準備する
    private func comminInit() {
        // MyCustomView.xib からカスタムViewをロードする
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: self.className, bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
        addSubview(view)
        
        // カスタムViewのサイズを自分自身と同じサイズにする
        view.translatesAutoresizingMaskIntoConstraints = false
        let bindings = ["view": view]
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|",
                                                      options:NSLayoutFormatOptions(rawValue: 0),
                                                      metrics:nil,
                                                      views: bindings))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|",
                                                      options:NSLayoutFormatOptions(rawValue: 0),
                                                      metrics:nil,
                                                      views: bindings))
        
        self.afterInit()
    }

    // このメソッドはextensionにすると使い勝手が良いです。
    var className: String {
        get {
            return type(of: self).className
        }
    }
}
```

後は元記事の以下のコードを変更します。

```swift
class MyCustomView: UIView {
...
}
```

↓

```swift
class MyCustomView: UINibView {
// ここのコードは不要です。

    // 以下のコードはサンプルですが、後は普通に接続できます。
    @IBOutlet weak private var nameLabel:UILabel!
    
    // 初期化後
    override func afterInit() {
        nameLabel.text = "テスト"
    }
}
```

# 最後に
NibのViewについている`Refelencing Outlets`は不要なので消しちゃってください。
つけたままにしていると落ちると思います。

@himara2さんありがとうございます。
Smarty使ったらtimezone関連のエラー表示が出てきたので対応した

【エラー内容】
Smarty内のクラスで使っている```strftime()```が使えません、という内容。

```PHP
PHP Warning: strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.
```

【対処】
```strftime()```を使っているメソッドの最初で```date_default_timezone_set("Asia/Tokyo")```を実行する。

(参考)
https://kngy.net/2011/04/28/php5-timezone-warning/
Re:dashでデータソースにPythonを追加する

# 公式ドキュメント
https://redash.io/help-onpremise/setup/supported-data-sources-options-reqs.html#python

# サーバーログイン
ログインしてRe:dashのルートディレクトリ移動

`$cd /opt/redash/current`

# 設定ファイルに追加
`$vim /opt/redash/.env`

```

export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python
↑この一行を一番下に追加
```

# Re:dash 再起動
`$ sudo supervisorctl reload`
Docker と UFW を共存させる

`Docker` はなんだか `UFW` を無視するそうで。
以下の様に味付けをする必要があるみたい。

```
# /etc/default/ufw

...

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"

...
```

```
# /etc/default/docker

...

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

...
```

```
# /etc/docker/daemon.json

{"iptables": false}
```

```
sudo service ufw restart
sudo service docker restart
```

で、なんとなく `UFW` 動いてる風なんだけど、 `docker-compose` で複数の（dockerネットワーク）環境を作ったりすると、コンテナ内からインターネットに繋がらなくなったりする。
で、調べると `IPマスカレードがうんたら` とか出て来るので、以下の様に書くとなんか元気に動き出す。

```
# /etc/ufw/before.rules

#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#

# こっから ============================

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.16.0.0/12 -j MASQUERADE

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

# ここまでを追加 ========================

# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines

...
```

ネットワークまじで無知故、正しいのかどうか大分怪しい。
ので、自己責任で。
Power BI で座席表を作る　実践編

以下のような記事でPowerBIの意外な利用方法を紹介しました。
[Power BI で座席表を作る　その１／２](http://qiita.com/Masutani/items/b590f81fc7f48c0472a0)
[Power BI で座席表を作る　その２／２](http://qiita.com/Masutani/items/244a6e79ffed3a8ccd86)

元々は、GeoJSONの扱いをもう少し踏み込んだら何ができるのか、ということでやってみたのですが、社内での評判も良かったので、まじめに作ってみました。
最終的には、PowerBIの[Sinoptic Panel](https://okviz.com/synoptic-panel/)というオプションビジュアルを使ってやっておりまして、元のサンプルが施設内の配置図でしたので、それに近い利用方法といえます。

# レポート

具体的なやり方は前の記事を見ていただきたいと思います。難しいところは特になくて、席次表のSVGファイルを作成するのが、少し慣れない人が多いと思います。デザイナーさんやCADをされている人が近くにいたら頼んでもよいかもしれません。

私は、社内の建築図面から、トレースして自作しました。
Microsoft Design (!フリーです）でトレース、整形をして、SVGエクスポート、[Sinoptic Designer](https://synoptic.design/)でタグつけを行いました。
弊社JapanTaxiの座席はせいぜい数十程度しかないので、何とかなりますが、大企業で何フロアもあるような場合は、CADなどの既存データがつかえた方がいいですね。

以下で作成したレポートの例を示します。座席だけでなく社内ソーシャルネットワーク解析的な使い方も可能なので、一度作っておくと、用途ごとにいろいろつかえてお薦めです。

## 座席表

座席表をExcelで管理していたので、そのExcelから直接取り込めるようにしました。やったのはExcelシートをコピーし座席番号を定義、さらにもう一枚シートを作成して串刺しでセルを結合。そうすると、名前と座席番号のペアができるので、それをPowerBIで分解して関連付けという形をとりました。

![JTXSheet1.png](https://qiita-image-store.s3.amazonaws.com/0/146939/810d4749-6153-73e8-7ff1-c7ac4c40e80a.png)

座席表に表示させる内容は名前だけですが、ツールチップに任意の属性を表示できるので、適宜追加します。内線番号などを調べるのに便利です。グラフはおまけですが、座席がどのくらい余っているか、などを表示しています。

## グループ解析

解析というほどではないですが、グループとプロジェクトの相関を表示させて、今プロジェクトがどの程度あるのか、プロジェクトの規模感がぱっと見でわかります。どういう観点で見せるか、見せ方には一考の余地がありそうです。

![JTXSheet2.png](https://qiita-image-store.s3.amazonaws.com/0/146939/70e3387b-809e-c13c-f34a-7b467d5b0426.png)

## 社内ネットワーク解析

これもオプションのビジュアルを使っています。いくつかネットワーク表示ができるプラグインがありますので、好きなものを使うとよいと思います。人をつなぐのがプロジェクトという観点にすると、複数のプロジェクトにまたがる人などが見えてきます。また関連の強いプロジェクトも容易に発見できるので、新入社員などが使う分には役立つシーンもあるでしょう。

![JTXSheet3.png](https://qiita-image-store.s3.amazonaws.com/0/146939/5356aac7-ba5e-92af-9b8b-7a4d765490cb.png)

## WordCloud

これは使えるシーンが限られますが、単純に名前を表示してみると面白いことがわかりました。以下は、下の名前だけにしていますが、苗字の方で社内のかぶりがわかり、苗字がいつまでユニークIDとして使えるか管理できます（笑）

![JTXSheet4.png](https://qiita-image-store.s3.amazonaws.com/0/146939/fddfb435-ffd6-a274-16f9-984adefae3f9.png)

# まとめ

この座席表はスタティックなデータを単純に可視化するだけでしたが、イベントデータを接続することで、在席確認などより活用度があげることができますので、今後育てていきたいと思います。

関連記事
[Power BI で座席表を作る　その１／２](https://qiita.com/Masutani/items/b590f81fc7f48c0472a0)
[Power BI で座席表を作る　その２／２](https://qiita.com/Masutani/items/244a6e79ffed3a8ccd86)
[Power BI で座席表を作る　実践編](https://qiita.com/Masutani/items/449dd303a2ce2e17265f)
label switching memo


<dl>
  <dt><a href="http://www.stats.ox.ac.uk/~cholmes/Reports/mcmc_label_switching_holmes.pdf">Markov Chain Monte Carlo Methods and the Label Switching Problem in Bayesian Mixture Modelling</a></dt>
  <dd>おしい。コードがみっかんない。Gibbsサンプラーなら問題なし？</dd>
  <dd>そんなわけなさそうだが、TracePlotでは良さそうな記載が。</dd>
<dt><a href="https://arxiv.org/pdf/1503.02271.pdf">label.switching: An R Package for Dealing with the Label Switching Problem in MCMC Outputs]</a></dt>
  <dd>クラスタリングのようだ</dd>
</dl>
nginxのエラーログをcloudwatch logsに送信する

## nginxのエラーログをcloudwatch logsに送信する

### awslogs install
```
 sudo yum install -y awslogs
```
### awslogs.conf修正

``` /etc/awslogs/awslogs.conf
[/var/log/nginx/access.log]
log_group_name = nginx-error_log
log_stream_name = {instance_id}
file = /var/log/nginx/error.log
datetime_format = %Y-%m-%d %H:%M:%S,%3N
initial_position = start_of_file
buffer_duration = 5000
```

### awscli.conf修正
``` /etc/awslogs/awscli.conf 
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1
```

### awslogs起動
``` 
  sudo service awslogs start
```
rbenvでRuby 2.5.0-devをインストールする

[動作確認がしたかった](http://b.hatena.ne.jp/entry/329484331/comment/tikkss)ので、手近な環境でインストールしてみたら、少々躓いたのでメモします。

- OS: CentOS 6.8

```
# ruby-buildを更新
cd ~/.rbenv/plugins/ruby-build/
git pull origin master

# 2.5.0-dev をインストール
rbenv install 2.5.0-dev

# autoconf command not found
# -> autoconf をインストール
sudo yum install autoconf

# 再度 2.5.0-dev をインストール
rbenv install 2.5.0-dev

# Autoconf version 2.67 or higher is required
# -> http://ftp.gnu.org/gnu/autoconf/ より最新版をインストール
sudo yum remove autoconf
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar zxfv autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
make
sudo make install

# 再度 2.5.0-dev をインストール
rbenv install 2.5.0-dev

# make: bison: Command not found
# -> bison をインストール
sudo yum install bison

# 再度 2.5.0-dev をインストール
rbenv install 2.5.0-dev

# インストール成功！
rbenv global 2.5.0-dev
ruby -v # ruby 2.5.0dev (2017-04-11 trunk 58313) [x86_64-linux]
```
pagespeedを導入する際にしておいた方が良い設定


## 機能の有効無効
```
pagespeed EnableFilters collapse_whitespace,elide_attributes,remove_comments,remove_quotes,rewrite_javascript,rewrite_css;
pagespeed DisableFilters inline_images,rewrite_images,resize_images;
```

## 特定ファイルのpagespeed無効化
```
pagespeed Disallow "*/*.min.js";
pagespeed Disallow "assets/*.png";
```
Amazon Linux(EC2)でcssをminifyする

WordPressのstyle.cssをLinux上のコマンドでminifyしたいな・・
と思って調べたのですが、そのようなコマンドは無いみたいです。

ちょうど、rubyの環境が作ってあったので、rubyで簡単に自作することにしました。

uglifyjsやuglifycssというのもあるようなのですが、yumでインストールできず、手動でnode.jsからインストールしないとダメなようでしたので、今回は避けました。

## 前提条件
rubyの環境は構築済みとします。
必要なGemは`sass`です。

## minifyするrubyスクリプトの作成

```ruby
#!/bin/ruby
require "sass"
puts Sass::Engine.new(ARGF.read, :syntax => :scss, :style => :compressed).render
```

`#!/bin/ruby`は各環境に合わせてください。

私の環境では`RVM`を使用しているので、以下のようになりました。

```ruby
#!/usr/local/rvm/rubies/ruby-2.4.0/bin/ruby

require "sass"
puts Sass::Engine.new(ARGF.read, :syntax => :scss, :style => :compressed).render
```

ここでは仮に`cssmin`というファイルにしておきます。

```
chmod 755 cssmin
```
などとして、実行できるようにしておきます。

## 実行

```
cssmin style.me.css > style.css
```
のような形です。

---

※参考URL
http://qiita.com/masayuki_oguni/items/5c2975ea7928d55f4693
codeigniterでjoinした時にカラム名が重複した場合

codeigniterjoinした時にカラム名が重複した場合

無限に増え続ける可能性が低いテーブルであれば

```php:model.php
public function get_assoc_all($where = array()) {
		$tmp = $this->db->where($where)->get("sample")->result_array();
		return $this->to_assoc($tmp);
	}
	
private function to_assoc($tmp) {
		if (empty($tmp)) {
			return array();
		}

		$result = array();

		foreach ($tmp as $value) {
			$result[$value['id']] = $value;
		}

		return $result;
	}
```
```php:controller.php
$data = array(
			'foo' => $this->foo_model->get_all(),
			'bar' => $this->bar_model->get_group_assoc_all(),
		);
$this->load->view('foo/index.php', $data);
```
```php:view.php
<?php
foreach ($foo $value) {
?>
 <tr>
   <td><?= $bar[$value['foo_id']]['foo_name'] ?></td>
 </tr>
<?php } ?>
```
のようにする。
ちなみに

`$this->to_assoc($tmp);`
ここの部分にdbが入っていないので、to_assocはそのクラスからしかアクセスできない（クラス内にfunctionがある）事がわかる。

上記よりも規模がでかい場合（userなど無限に増える規模）では、いつまでもforeachが終わらないので、joinします。

```php
	public function join() {
		$this->db->select('talent_group.name AS talent_group_name, talent.*, talent_group.*');
		$this->db->from('talent')->join('talent_group', 'talent.group_id = talent_group.id', 'left');
		return $this->db->get()->result_array();
	}
```

生成されるSQL↓

```
SELECT `talent_group`.`name` AS `talent_group_name`, `talent`.*, `talent_group`.*
FROM `talent`
LEFT JOIN `talent_group` ON `talent`.`group_id` = `talent_group`.`id` 
```
ブログ運営最強ツール「ワールドプレス」

ブログ運営最強ツールが出現したようで。

* [ワールドプレスっていうブログ運営最強ツールを知ってる？？](http://www.katagirigirito-ku.net/entry/wa-ld) (楽しいことを全力に！)
* [話題のワールドプレス、BurpSuiteでもできるよ](http://blog.tokumaru.org/2017/04/burpsuite.html) (徳丸浩の日記)
* [ワールドプレスっていうブログを運営するための最強ツール](https://gist.github.com/hasegawayosuke/74bc582a20432ec053b4ecdcd13da748)

私もやってみました!!

WordPress をインストールして、WordPress をインストールしたディレクトリの `.htaccess` に以下を追記するだけ!! これでワールドプレスのインストールは完了!!

```bash
$ tail -n2 /path/to/wordpress/.htaccess
AddOutputFilterByType	SUBSTITUTE text/html
Substitute "s/WordPress/ワールドプレス/"
```

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/27073/16001fee-5040-e5cb-3346-44e13d88386d.png)

[mod\_substitute](http://httpd.apache.org/docs/2.4/en/mod/mod_substitute.html) が必要です。
XaaSってどのくらい種類あるの？？

#前置き
「XaaS」なる言葉。
"X as a Service"とか"Everything as a service"って意味らしい。
いわゆるワイルドカード。


「SaaS」とか「Baas」とかはまだわかるけど、「GaaS」まで。
多すぎてよくわからんので、まとめてみた。


#＊aaS一覧
| XaaS | Everything as a service | EaaS, *aaS と表記されることも |
|:---|:---|:---|
| AaaS | Analytics as a service |  |
| AaaS | Authentication as a service |  |
| BaaS | Backend as a service |  |
| BaaS | Backup as a service |  |
| BaaS | Blockchain as a service |  |
| CaaS | Communication as a service |  |
| CaaS | Container as a service |  |
| DaaS | Data as a service |  |
| DaaS | Desktop as a service |  |
| EaaS | Eexploit as a service | これはサイバー攻撃らしい |
| EaaS | Email as a service |  |
| FaaS | Framework as a service |  |
| FaaS | Function as a service |  |
| GaaS | Gaming as a service |  |
| GaaS | GPU as a service |  |
| IaaS | Infrastructure as a service | 過去に HaaS（Hardware as a service）と呼ばれていたらしい |
| GaaS | Gpu(GPU) as a service |  |
| KaaS | Knowledge as a service |  |
| LaaS | Location as a service |  |
| LaaS | Logging as a service |  |
| MaaS | Monitoring as a service |  |
| NaaS | Network as a service |  |
| OaaS | Office as a service |  |
| OaaS | Optimization as a service |  |
| PaaS | Platform as a service |  |
| QaaS | Quality as a service |  |
| RaaS | Ransomware as a service |  |
| RaaS | Recovery as a service |  |
| SaaS | Software as a service | これがスタートかな |
| TaaS | Testing as a service |  |
| TaaS | Tool as a service |  |
| UaaS | Umbraco as a service |  |
| UaaS | Understanding as a service |  |
| UaaS | Video as a service |  |
| WaaS | Windows as a service |  |
| WaaS | Workplace as a service |  |
| YaaS | hYbris as a service | これは変化球 |
| ZaaS | Zangyo as a service | 見事に落ちをつけて頂きました |


#終わりに
興味本位で書き始めましたが、これは、もう、清々しいほど無法地帯！
＃随時更新しようと思ったけど、心が折れました...