OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL 5.5→5.7でハマった話(レンタルサーバ編)

某レンタルサーバ(○CN)でMySQLのバージョンを5.5から5.7にアップデートしたらハマった時の対応について

#connectできない
サーバ会社から割り当てられたビルトインアカウントでphpMyAdminにはログインできるものの、他のアカウントではログインできない。当然、Webアプリからもアクセスできない。

###pluginフィールドを更新
そのままだと、set等のパスワード変更DDLも通らない。
そこで、mysql.userテーブルのpluginフィールドを更新してしまう。
もともとの値はセットされていなかった。
影響範囲がわからないので、ログインするユーザーのみ変更実行。

```SQL
update mysql.user set plugin='mysql_native_password' where user='ユーザー名';
```

###権限の更新
flush privilegesで権限の更新。

```SQL
flush privileges;
```

###パスワードの変更
パスワードハッシュをpassword関数をつかって書き換えてしまう。ちなみにold_password関数は5.7で廃止された。

```SQL
set password for 'ユーザー名'@'localhost' = password('新しいパスワード');
```

これで解決。

#潜在バグが顕在化
デフォルトのSQLモードが変更になり、GROUP BYでの指定がややこしくなる。
例えば

```
SELECT list is not in GROUP BY clause and contains nonaggregated column 'db_name.table_name.id' which is not functionally dependent on columns in GROUP BY clause
```

等のエラーが発生する。
本来はバグ潰しが本筋なんだけど、今動いている物に手を加えて検証する時間もなくて動くのを優先する場合。SQLモードを旧バージョン相当にして無理やり動かしてしまう。
そのレンタルサーバでは、my.cnfをユーザーが変更することはできなかった。しかし、5.7からユーザーディレクトリのmy.cnfも読み込むようになったので、このファイルを作成して修正する。

```
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION
```

5.7のデフォルトのSQLモードは

```
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```

そもそもは突然「OUTFILEでCSVが出力できなくなった」のが原因なんですけどね...
jsdoでconvnetjs その13

#概要
convnetjsで、画像を学習させて、経過を表示してみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/W/v/f/Wvf2.jpg?t=1496451873)

#成果物

http://jsdo.it/ohisama1/Wvf2
x,y,z方向のEの実部、虚部値からE2を計算する実装

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

### InitField-Y

線形方程式で使うY方向の成分の初期値。

```
x y z |E|^2 Ex.r Ex.i Ey.r Ey.i Ez.r Ez.i
-0.2094395102 -1.466076572 -5.235987756 0.8585939259 -0.03949275597 0.05077620167 0.01013269298 0.9101401219 -0.1444252659 -0.07169138735
0.2094395102 -1.466076572 -5.235987756 0.8585939259 0.03949275594 -0.05077620174 0.01013269297 0.9101401219 -0.1444252659 -0.07169138734
-1.047197551 -1.047197551 -5.235987756 0.5882783219 -0.114753043 0.1794066166 0.1382394146 0.7130358923 -0.105780601 -0.06483418768
-0.6283185307 -1.047197551 -5.235987756 0.722292101 -0.1150426792 0.08399581185 0.05292248654 0.8268174349 -0.1049533275 -0.06751981367
-0.2094395102 -1.047197551 -5.235987756 1.218739533 -0.04883129069 0.009991513709 -0.04352088577 1.096688684 -0.09347336258 -0.0538312286
0.2094395102 -1.047197551 -5.235987756 1.218739533 0.04883129064 -0.009991513762 -0.04352088578 1.096688684 -0.09347336258 -0.05383122859
0.6283185307 -1.047197551 -5.235987756 0.7222921008 0.1150426792 -0.0839958119 0.05292248652 0.8268174349 -0.1049533275 -0.06751981365
1.047197551 -1.047197551 -5.235987756 0.5882783217 0.1147530429 -0.1794066166 0.1382394146 0.7130358922 -0.105780601 -0.06483418766
-1.047197551 -0.6283185307 -5.235987756 0.8229977321 -0.1005506586 0.09303872152 0.1612047585 0.8794331446 -0.04899708706 -0.04940393611
-0.6283185307 -0.6283185307 -5.235987756 1.118951468 -0.06582004058 0.07355967742 0.005275536114 1.050731784 -0.06835371921 -0.02169836396
-0.2094395102 -0.6283185307 -5.235987756 1.402568429 -0.0175211999 0.02209530595 -0.1017980074 1.176857159 -0.07162677142 -0.03587802936
(後略)
```

やろうとしていること

- 上記のファイルの`|E|^2`を自分で計算する
- 行数が多いので5行で終了する

### code v0.1

```calcE2_170603.py
import numpy as np

'''
v0.1 Jun. 03, 2017
   - compare results
   - add calc_e2()
   - read data
'''

# Python 3.5.2
# coding rule:PEP8


def calc_e2(e2, xr, xi, yr, yi, zr, zi):
    xx = xr*xr + xi*xi
    yy = yr*yr + yi*yi
    zz = zr*zr + zi*zi
    return (xx + yy + zz)


INPFILE = "IntField-Y"

# 1. read data
dat = np.genfromtxt(INPFILE, delimiter=' ')
# in shown below '1:' means to skip header
xpos, ypos, zpos = dat[1:, 0], dat[1:, 1], dat[1:, 2]
E2 = dat[1:, 3]
Exr, Exi = dat[1:, 4], dat[1:, 5]
Eyr, Eyi = dat[1:, 6], dat[1:, 7]
Ezr, Ezi = dat[1:, 8], dat[1:, 9]

# 2. calc E2
for idx, tpl in enumerate(zip(E2, Exr, Exi, Eyr, Eyi, Ezr, Ezi)):
    res = calc_e2(*tpl)
    if idx == 0:
        print('original     calc')
    print(tpl[0], res)
    if idx >= 5:
        break

```

calc_e2()の引数にe2があるのは変だが、tplで渡すという手抜きでこうした。手抜きダメ。

```txt:run
$ python3 calcE2_170603.py 
original     calc
0.8585939259 0.85859392584
0.8585939259 0.858593925843
0.5882783219 0.588278321855
0.722292101 0.722292100873
1.218739533 1.21873953309
1.218739533 1.21873953309
```
ターゲット疑似クラスの使い方

ターゲット疑似クラスの使い方を忘れないうちにメモ。

```
<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>ターゲット</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style>
            #item1:target {/*ID=itemがターゲットにされた時(クリック後に発動)*/
                color: white;
                background-color: black;
            }
            ul {
                list-style: none;
            }
        </style>
    </head>
    <body>
    <div>
        <a href ="#item1">項目 1 へ</a><br />
        <a href ="#item2">項目 2 へ</a>
        <ul>
        <li id ="item1">項目 1</li>
        <li id ="item2">項目 2</li>
        </ul>
    </div>
    </body>
</html>
```
Macのvimバージョンを手っ取り早く8.0にする


## vimインストール
macOS標準インストールのvimはバージョンが古いのでv8.0のvimを
homebrewで取得&インストールする。

homebrewで「brew install vim」とすると自分でpathを通したりと何かと面倒なのでoverrideしてしまう。

```
$ brew install lua
$ brew install vim --with-lua --with-override-system-vi --with-python3
```

luaはプラグインマネージャー使用するとほぼマストだと思うのですがpythonオプションは普段の使用用途に応じて加えると良いです。
基本情報処理技術者試験を受けて

初投稿です。
平成28年の秋季に基本情報を合格しました。29年からは新社会人となり、アウトプットの大事さを教わったので勉強法などについて記しておこうと思います。これから受ける人の参考になってくれれば幸いです。


#自身について
　私自身は情報処理系の学部に4年間在籍していました。なので2,8,16進数の変換やコンピュータの構造などはある程度把握していました。プログラミング言語はCとJavaとアセンブラを勉強しており、Cでは大学1年生のときにCUIのアプリを作ってたくらいです。JavaではWebページを作れるくらいで、アセンブラはあんまり使ってないです^^;

#午前問題
##過去問を解きまくれ！
　かなーり広い範囲から80問出題されますが、そこまで突っ込んだ問題は出ません。さらに過去の問題と問題文・選択肢が全く同じ問題も出ます。なので私は過去問をひたすら解いていました。それだけでも選択肢を見たら答えがコレ！って瞬時に反応出来るくらいになります。
##分からなかった問題は徹底的に調査！
　恐らく一番大事。分からなかったところは解答を見て「どうしてそうなるのか？」という疑問をしっかり解決することが大事です。頭の中で「おｋ把握」と思えるくらいまで徹底的に解説を読んだり、テキストやネットで独自に調べたりしましょう。答えだけを見るのはNGです！ここをサボるかサボらないかで大きく変わります。
##点数が低くても泣かない
　私自身も最初に解いた午前問題の過去問の点数は3割ほどしか取れませんでした。正直落ち込みました。今見ても相当ヒドい点数ですね...(;^ω^)　それでもしっかり勉強すれば合格できます。むしろ伸びしろがあると思って開き直りましょう！

#午後問題
##問題文を穴が空くまで読め！
問題文が一気に長くなりますが、落ち着いて問題文を読みましょう。読みながら<b>情報を整理していきます。</b>アンダーラインとかどんどん引いちゃいましょう。問題と強く関連している場所を見つけておくと良いです。過去問を情報を整理する練習としても活用してみましょう！
##午前の知識を活用せよ！
午後問題には午前問題の知識が活かせると思います。もちろんネットワークの構造が複雑になっていたりSQL文がより長いものになっていたりと全体的に難易度は上がっているので、午前の知識に上乗せする感じで勉強するといいかも。午前でサボっているとここで痛い目に見ます。


#終わりに
今回は私が基本情報合格に向けて実践していたことをまとめました。応用も受けようと思っているのでその時はまた上記の事を活かして勉強します。参考になれば幸いです。それでは！
foreachの参照渡しでハマった^^;


PHPのforeachループつかって配列の中身をいじりたいときに、参照渡しでこんなコード書いてハマりました

```php
foreach($list as &$row){
	if (!file_exist(FILEPATH . $row['filename'])){
		$row['filename'] = newfile();
	}	
}
```

参照渡しつかうことで $row を書き換えるだけで $list を更新できて便利だと思って使ってたんですが…

このサンプルコードだと、このあとで$rowを変更するとハマります。

```php
foreach($list as &$row){
	if (!file_exist(FILEPATH . $row['filename'])){
		$row['filename'] = newfile();
	}	
}
// あれこれいろんな処理
$row = [];

```

こんな風になってると ```$row = []```した瞬間に ```$list```の最後の要素まで書き換わります。

なんとなく、このサンプルでは ``` $row``` がforeachブロック内だけで有効なローカル変数のように感じるんですが、実際にはforeachブロックから外れても有効な変数なので、こういうことが発生するんですね。

やっぱり参照渡しって気づかぬうちに意図せず書き換えるコードを作り込んでしまう要因になりやすい気がします。

ってことで、ちょっと不格好な気もするけど↓の方がいいかなって思いました。

```php
foreach($list as $key => $row){
	if (!file_exist(FILEPATH . $row['filename'])){
		$list[$key]['filename'] = newfile();
	}	
}

```
Swift3で9時を起点に時計をドラッグで回転させる

時計の針がちょうど９時を起点にUIViewをドラッグで回転させてみます。回転の肝になってるところは `atan2(target.y-position.y, target.x-position.x)`この部分です。`atan2`で座標から角度を割り出しています。

![imageroteai.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/01d919ad-e00f-fc22-8e78-8b9bbd59049a.gif)

# 実装

```swift
var myView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
        myView.center = self.view.center
        myView.backgroundColor = UIColor.red;        self.view.addSubview(myView)
        myView.layer.anchorPoint = CGPoint(x: 1.0, y: 0.5)
        
        let box = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        box.backgroundColor = UIColor.blue
        myView.addSubview(box)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent!) {

        let touch = touches.first!
        if touch.view === myView.subviews[0] {
            let position = touch.location(in: self.view)
            let target = myView.center
            let angle = atan2(target.y-position.y, target.x-position.x)
            myView.transform = CGAffineTransform(rotationAngle: angle)
        }
     
```

# 説明

UIViewをインスタンス化する

```swift
var myView: UIView!
```
UIViewの実態を作って描画する

```swift

//横幅100の縦幅20のUIView
myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 20))    //viewの真ん中に配置する
        myView.center = self.view.center
        //UIViewの全体の背景色を赤色に指定する
        myView.backgroundColor = UIColor.red;   
        //画面に描画する
        self.view.addSubview(myView)
        //anchorPointに関して下記参照
        //要は(x: 1.0, y: 0.5)にすることで
        //UIViewの最下部を原点に回転させることができる
        //これを(x: 0.5, y: 0.5)とかにするとブーメランみたいに回ってしまう
        myView.layer.anchorPoint = CGPoint(x: 1.0, y: 0.5)

        //青い部分
        let box = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        box.backgroundColor = UIColor.blue
        myView.addSubview(box)
```

ドラッグ処理を実装

```swift
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent!) {
        //タッチイベント取得
        let touch = touches.first!
        //青い部分をタッチしたときだけ回転させることができる
        if touch.view === myView.subviews[0] {
            //自分の場所を取得して
            let position = touch.location(in: self.view)
            //真ん中を取得して
            let target = myView.center
            //中心点から自分xと自分yを引き算
            let angle = atan2(target.y-position.y, target.x-position.x)
           //transformで回転処理を実行する
            myView.transform = CGAffineTransform(rotationAngle: angle)
        }
```


# 参考

anchorPointに関しては下記参照


[How to rotate an UIImageView using TouchesMoved](https://stackoverflow.com/questions/25220457/how-to-rotate-an-uiimageview-using-touchesmoved)

[Swift3で時計を回すようにドラッグでクルクル回転させてみる ](http://off.tokyo/blog/2017/06/03/how-to-rotate-an-uiimageview-using-touchesmoved/)
Python3 > fileIO > カンマ区切りをスペース区切りに変換 | ファイルヘッダもつける 実装 > v0.1-v0.3 > 文字列のファイル書き出し | byte書き出し

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

## 希望動作
ファイルの形式を変換する。

- ファイルヘッダを追加
- カンマ区切りをスペース区切りに変換する

### input

```txt:inp_comma_170603.txt
1.0,2.0,3.0
4.0,5.0,6.0
7.0,8.0,9.0
```

### output

```txt:out_space_170603.txt
A B C
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
```

## v0.1

とりあえずリダイレクトを用いるという方法での実装。

### code

```comma_to_tabWithTitle_170603.py
import numpy as np

'''
v0.1 Jun. 03, 2017
   - output as [standard output]
'''

# Python 3.5.2
# coding rule:PEP8

FILE_HEADER = "A B C"

data = np.genfromtxt('inp_comma_170603.txt', delimiter=',')
xpos, ypos, zpos = data[:, 0], data[:, 1], data[:, 2]

print(FILE_HEADER)
for tpl in zip(xpos, ypos, zpos):
    print("%s %s %s" % tpl)

```

### 実行例

```bash
$ python3 comma_to_tabWithTitle_170603.py > out_space_170603.txt
$ cat out_space_170603.txt 
A B C
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
```

## v0.2

リダイレクトでなく、コード内で指定したファイルに書き出すようにする。 
リダイレクトの方が便利かもしれないが、Pythonの勉強もかねて。

### 参考

- 文字列(ファイルヘッダ)の書き出し
    - https://stackoverflow.com/questions/13255758/numpy-savetxt-tuple-index-out-of-range
    - reshapeを使う部分を参考にした

- byte書き出し
   - https://stackoverflow.com/questions/35372829/numpy-savetxt-resulting-a-formatting-mismatch-error-in-python-3-5

### code

```comma_to_tabWithTitle_170603.py
import numpy as np

'''
v0.2 Jun. 03, 2017
    - output as [file]
v0.1 Jun. 03, 2017
    - output as [standard output]
'''

# Python 3.5.2
# coding rule:PEP8

FILE_HEADER = "A B C"
OUTFILE = "out_space_170603.txt"

# 1. read data
data = np.genfromtxt('inp_comma_170603.txt', delimiter=',')
xpos, ypos, zpos = data[:, 0], data[:, 1], data[:, 2]

# 2. write file header
hdr = np.array(FILE_HEADER).reshape(1,)
np.savetxt(OUTFILE, hdr, fmt="%s", delimiter=" ")

# 3. write data
tpl = xpos, ypos, zpos
with open(OUTFILE, 'ab') as f_handle:
    np.savetxt(f_handle, tpl, fmt="%.1f", delimiter=" ")

```

```txt:実行
$ python3 comma_to_tabWithTitle_170603.py 

$ cat out_space_170603.txt 
A B C
1.0 4.0 7.0
2.0 5.0 8.0
3.0 6.0 9.0
```

## v0.3

データに加工せずそのまま出力するなら、以下でも良い。

```comma_to_tabWithTitle_170603.py
import numpy as np

'''
v0.3 Jun. 03, 2017
	- refactor
v0.2 Jun. 03, 2017
    - output as [file]
v0.1 Jun. 03, 2017
    - output as [standard output]
'''

# Python 3.5.2
# coding rule:PEP8

FILE_HEADER = "A B C"
OUTFILE = "out_space_170603.txt"

# 1. read data
data = np.genfromtxt('inp_comma_170603.txt', delimiter=',')

# 2. write file header
hdr = np.array(FILE_HEADER).reshape(1,)
np.savetxt(OUTFILE, hdr, fmt="%s", delimiter=" ")

# 3. write data
with open(OUTFILE, 'ab') as f_handle:
    np.savetxt(f_handle, data, fmt="%.1f", delimiter=" ")

```
SSR無しでReactアプリをOGPとかに対応させる (Netlify編)

ということで[前回の自力Prerendering編](http://qiita.com/kiida/items/07e2c6ccb9e3ea230b16)に続いてNetlify編です。今回はそもそもprerendering以外の方法を書こうと思っていたんですが、[Netlify](https://www.netlify.com/)がものすごく簡単にprerenderingできるようだったので試してみたくなってしまいました。

# Netlifyとは

[Netlify](https://www.netlify.com/)はフロントエンドのソースコードをGitHub等のgitレポジトリにpushするだけでビルド・デプロイ・CDN付き配信してくれるサービスです。

# 手順

前回同様create-react-appで作ります。

```
yarn create react-app netlify-demo
```

## 必要なパッケージを追加

今回は自力でprerenderはしないので、react-router-domとreact-helmetのみ使います。

```
yarn add react-router-dom react-helmet
```

## Routeを作る

前回とほぼ同じ内容かつソースは[ここ](https://github.com/daikikohara/no-ssr-demo/tree/master/netlify-demo)に置いたので省略しますが、HomeとAboutの二つのルートを作ります。

## _redirectsを作る

[公式ドキュメントにある通り](https://www.netlify.com/docs/redirects/#history-pushstate-and-single-page-apps)SPAだと上手くrouteが取れないので、下記のような_redirectsというファイルを作ります。

```:_redirects
/*    /index.html   200
```

そしてpackage.jsonのbuildセクションでビルドの際にbuildディレクトリに含めるようにします。

```json:package.json
    "build": "react-scripts build && cp _redirects build/",
```

## Netlifyの設定

### デプロイ設定

アカウント作ってGitHubのレポジトリを選んで以下のようにデプロイを指定してあげるだけなので詳細な手順は省略します。

![deploy.png](https://qiita-image-store.s3.amazonaws.com/0/36003/4d6027da-fe5a-d90e-15e1-3304dec42215.png)

### prerendering設定

[prerendering](https://www.netlify.com/docs/prerendering/)のページに書かれている通りsettingsから有効化するだけでprerenderingされます。ものすごく簡単です...
ただし残念ながらフリープランでは使えないので、最低月9ドルのプランに入る必要があります。ちなみに上記のページにある通りNetlifyのprerendering以外にもPrerender.ioやその他のサービスを使ったprerenderingもできます。

![prerendering.png](https://qiita-image-store.s3.amazonaws.com/0/36003/813802df-a4dd-a3eb-6b96-cefa1f9e88ea.png)

## デプロイ

設定が済んだらレポジトリにpushするだけで毎回自動でビルド・デプロイされて最新版が配信されます。

こんな感じでデプロイの履歴が残ります。また自動でnetlifyのドメイン下で配信されますが、独自ドメイン(SSL付き)でも配信できます。

![history.png](https://qiita-image-store.s3.amazonaws.com/0/36003/859e8997-b8f9-c644-5127-2aa1fe455cc4.png)

## 確認

で、Slackで結果を確認するとこの通りrouteごとに別々の情報が取れます。

![slack.png](https://qiita-image-store.s3.amazonaws.com/0/36003/cab3ea9f-2438-5f79-7d48-9e8627ce7bdd.png)

# 最後に

ということでNetlifyのprerenderingを使ってみました。
自力prerenderingも簡単でしたが、こっちはさらに簡単で既存コードには何も手を入れずにできてしまいました。
めちゃくちゃ簡単だったので今度新規プロジェクトで使ってみたいところです。
ただ現在のプロジェクトはおそらく現状のS3 + CloudFront配信で行くので、次こそはprerendering以外の方法を紹介したいと思います。。。多分。
Mastodon 1.4.1 へのアップデートでコンフリクト

Mastodon 1.4.1が[リリース](https://github.com/tootsuite/mastodon/releases/tag/v1.4.1)されたのでアップデートするべく

```
$ git merge v1.4.1
...(中略)...
Automatic merge failed; fix conflicts and then commit the results.
```

ｱｲｴｴｴｴ!!!!ｺﾝﾌﾘｸﾄ!?ｺﾝﾌﾘｸﾄﾅﾝﾃﾞ!?

# 状況

[本家リポジトリ](https://github.com/tootsuite/mastodon)をfork/cloneして自分用のブランチを切ってHEADにしていたが、いまのところ特に変更はしていないのでHEAD = `v1.3.3`だった。
何も考えずにfast-forwardを期待してmergeを実行したらコンフリクトして頭を抱えた。

(ブランチを切らずに`git checkout v1.4.1`でアップデートする運用の場合にはこの問題は発生しないはず)

# 解決編

とりあえず

```
$ git merge --abort
```

で元に戻る。

で、`v1.4.1`をマージする代わりに

```
$ git merge 5439a81
```

とすれば多分良い(試していないので本当にちゃんと動くかはわからない)。これは`v1.3.3`の属するブランチ(`skylight`)に`v1.4.1`時点の`master`をマージしたコミットで、丁度さっきやろうとしたマージのコンフリクトを解決させたコミットということになる。(なおdiff取ってみると`v1.4.1`と微妙に違いがあるようだ)
これは執筆(2017年6月3日)時点では`skylight`ブランチの最新コミットなので、

```
$ git merge <remote>/skylight
```

でもよい。(`<remote>`は各自の設定により`origin`なり`upstream`なり)

ただ、これ`master`から離れたままなので、今後の本家リリースがどうなるかはよくわからないけれど、場合によってはリリースの度に同じ問題が発生する可能性がある。
自分のブランチを`v1.4.1`に持って行きたい場合は、

```
$ git reset --hard $(git merge-base v1.3.3 v1.4.1)
$ git merge v1.4.1
```

でいけるが、これをリモートリポジトリにpushしようとすると落ちるし(`-f`が必要)、他のリポジトリからpullしようとするとそこでコンフリクトするので、あまり安易に実行できるわけでもない。
ちなみに[`git merge-base`](https://git-scm.com/docs/git-merge-base)は2つのコミットの共通の祖先を返す。

# その他

- `--ff-only`オプションを使うとコンフリクトが発生することがないので慌てなくて済む。

```
$ git merge --ff-only v1.4.1
fatal: Not possible to fast-forward, aborting.
```

- [1.3.3のリリースノート](https://github.com/tootsuite/mastodon/releases/tag/v1.3.3)に

> This is a patch release that backports a few important improvements from the upcoming v1.4 release which is still a work in progress.

とあり、要するに1.3.3が本流から離れた保守リリースだった故に発生したのかなあと見ている(本家を詳しく追っているわけではないのでよくわかっていない顔)。

# 参考文献

- [git で共通の祖先をみつける - Qiita](http://qiita.com/taka7/items/7972e334cc33813d6942)
- [Git - Reference](https://git-scm.com/docs)
- [Git - Book](https://git-scm.com/book/ja/v2/) (ブランチとかマージとかfast-forwardとかってなんやねんみたいな場合はこれを一通り読むと良い)
Seleniumでfirefoxのabout:configでの値を指定する

## http://user:pass@ を含んだurlも巡回可能にする

* [Class: Selenium::WebDriver::Firefox::Profile — Documentation for selenium-webdriver (0.0.28)](http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Firefox/Profile)
* [Firefox でユーザー名とパスワードを含んだ URL にアクセスすると表示される警告を出ないようにする « Codaholic](http://codaholic.org/?p=2126)

```diff:
  require 'selenium-webdriver'
- driver = Selenium::WebDriver.for :firefox
+ profile = Selenium::WebDriver::Firefox::Profile.new
+ profile['network.http.phishy-userpass-length'] = 255
+ driver = Selenium::WebDriver.for :firefox, :profile => profile
```
Maximaで複数のグラフをPDFに書く

```txt
plot2d([1/(x-1),1-log(x-1)],[x,1.0,5],
[gnuplot_preamble, "set zeroaxis; 
                        set xrange [1.0:5.5];
                        set yrange [0:6]"],
[gnuplot_term,pdf],
    [gnuplot_out_file,"twoLines.pdf"]);
```

Windows10だとgnuplot_out_fileの指定で
```
C:\\towLines.pdf
```

と指定したが、権限が不足していたのか、ファイルが出力されなかった。

```txt
C:/towLines
```
としたら、/Users/hoge/c:towLinesに出力しようとするが、
cという0バイトのファイルができるだけだった。

# 参考資料

- [Maximaでgnuplotを使って複数のグラフを重ねて書きその上epsファイルを出力する - Py](http://d.hatena.ne.jp/PyPonta/20090711/1247290018)

# 関連投稿

- [Maximaでマンデルブロ集合のGIFアニメーション作成](http://qiita.com/kjunichi/items/fc37ba9ee0007bc52352)

# 関連記事

- [「プログラムでシダを描画する」をMaximaで描画する](http://abrakatabura.hatenablog.com/entry/2014/07/18/061534)
- [wxMaximaをMavericksでビルド出来た](http://abrakatabura.hatenablog.com/entry/2013/11/20/103631)
- [Maximaでリーマン予想のゼータ関数をプロットした](http://abrakatabura.hatenablog.com/entry/2012/10/12/112958)
- [YosemiteでwxMaximaがmaximaと通信できない件](http://abrakatabura.hatenablog.com/entry/2014/10/19/203214)
- [Maximaで2018年のセンター試験、数学I・数学Ａの第1問を解いてみた](http://abrakatabura.hatenablog.com/entry/2018/01/30/204125)
LLVMをVisual Studio 2017でコンパイルする

※Visual Studioのコンパイラとしてclangを使いたい人向けではありません。

先行文献：[LLVMに実行可能コードの生成をまかせたい](http://qiita.com/k2ymg/items/653c5b22b74a091be604)の方が詳しく書かれていますが、ハマったところも含めて書きます。

## 実験環境

- Win7, Visual Studio 2017インストール済み
- Visual Studio 2017でC++をコンパイルしたことがある
- __cygwinがインストールされている__

0. まずllvmのソースを入手します。素直にアーカイブを入手した方が良いかもしれません。

    ```$ git clone https://github.com/llvm-mirror/llvm.git```
0. [CMakeをインストール](https://cmake.org/download/)します。

    cygwin向けには3.5までしか存在しないようで、これはVisual Studio 2017に対応していないので、Windows用バイナリCMake3.8.2をインストールしました。
0. bin/cmake-gui.exeを実行します。
0. configureでVisual Studio 15 2017 Win64を選択します。
0. 下の空欄にhost=x64と入力します。
0. そのまま進んだところ、大量のエラーが出ました。
0. [LLVM+ClangをVisual C++でビルドしてみた。](http://tkmakwins15.jugem.jp/?eid=37)を参考に、```LLVM_DEFAULT_TARGET_TRIPLE```を```x86_64-pc-windows-msvc19```に変更します。
0. __cygwinのPythonでは```/cygdrive/d/……/LLVMBuild.txt does not exist```と怒られてしまう__ため、[stackoverflowの当該質問](https://stackoverflow.com/questions/32577085/cmake-error-file-cygdrive-src-llvmbuild-txt-does-not-exist)を参考に、__[Windows用Python2.7をインストール](https://www.python.org/downloads/release/python-2713/)します__。
0. [Getting Started with the LLVM System using Microsoft Visual Studio](http://llvm.org/docs/GettingStartedVS.html)を(今更)見てみると[GnuWin32 tools](http://gnuwin32.sourceforge.net/)が必要らしいのでインストールします。
0. その後パスをいじったりと悪戦苦闘しましたが、__環境変数Pathの中で、Windows用Python2.7.exeをcygwinのそれより手前に置いて、CMake-guiを一旦閉じてから再び実行__し、今までの手順をやり直すとうまくいきました。
0. 最後にGenerateを押すとVisual Studio向けのファイルが作成されます。
0. Open Projectを押すとVisual Studioが起動するので、普通にビルドします。とても時間がかかります。

cygwinのパスが通っていると、CMakeがcygwinのPythonを選んでしまい、```/cygdrive/d/……```などのパスを生成し、そんなディレクトリはないと怒られてしまうようです。環境変数Pathからcygwinを消したり、LIT_COMMANDを手で書き換えたり悪戦苦闘したのですが、__CMake-guiをいったん閉じて再び実行する__ことが重要だったようで、そうしたら自動で正しい方のWindows用Pythonを選んでくれました。

## 確認環境
- Win10, Visual Studio 2017インストール済み
- Visual Studio 2017でC++をコンパイルしたことがある
- Bash on Windowsがインストールされている

以下の方法でうまくいきました。GnuWin32 toolsは必要ないのか……？

0. ソースコードを入手。
0. CMake3.8.2をzipでダウンロード。(BoWのaptから持ってこれるCMakeは3.5と古いので)
0. Python2.7.13をインストール。
0. CMake-guiを実行、Visual Studio 15 2017 Win64を選択、host=x64と入力。
0. ```LLVM_DEFAULT_TARGET_TRIPLE```を```x86_64-pc-windows-msvc19```に変更。
0. Generateを押してファイルを作成。
0. Open ProjectからVisual Studioを起動してビルド。
sublimeで連番を打つ

sublime textで連番を打つplug inが非常に便利. ありがたや. 

基本的には作成された方のgit
https://github.com/kazu1107/InputSequence
を読めば全て書いてあります. 

# 環境
mac osx 10.11
sublime text 2

# install
- sublime textを開く
- 適当なページを表示(null pageでもおk)
- Sublime Text 2, Preferences, Package Control, Package Control: Add Repository
- ```https://github.com/kazu1107/InputSequence.git```を入力してreturn
- Sublime Text 2, Preferences, Package Control, Package Control: Install Package
- ```InputSequence```


# usage
- 複数行を選択 > ```command + shift + l```などをして複数箇所の入力状態にする(複数キャレット)
- ```ctrl + shift + 0```
- これで連番モードになる. 

# exapmles

|入力|結果|
|--:|:--|
|   | 0,1,...,9,10,11,...|
|  0| 0,1,...,9,0,1,...|
|  1| 1,2...,0,1,2,...|
| 00| 00,01,...,09,10,11,...|
| 01| 01,02,...,10,11,12,...|
など.
【 Material Design Toolkit 】「 Material Design Lite 」について調べてみた。 (MDL)

#はじめに
<font color="FF0281">__「 Material Design Lite ( MDL ) 」__</font>について少し調べてみたので、まとめてみる。

#「 Material Design Lite 」
2015年7月6日、Googleが発表した__マテリアルデザイン仕様のWebサイトを構築するため__の__ツールキット。__

_Material Design Liteの「 Lite 」には、依存性の少なさ、コードサイズの小ささ(27Kバイトに圧縮)、
手軽にインストールして使える、等の意味が込められているようです。
このツールキットを使用することによって、端末毎に最適化(レスポンシブ)される
Webサイトの構築を簡単に行うことができます。_

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180432/f3791927-bfd6-3236-3332-9d370f852934.png)

こんな感じのデザインを誰でも簡単に実装することができます。


##「 マテリアルデザイン 」とは
2014年6月にGoogleが発表した、__モバイルOS「Android5.0(Lolipop)」__より
採用されている<font color="FF0281">__デザインコンセプト(ガイドライン)。</font>__

シンプルで直感的なユーザーインタフェース、ディスプレイサイズに応じたデザイン最適化が特徴。

#さっそく、使ってみる。

__「Material Design lite(MDL)」__を使用するための準備は、
下記タグを```<head>```タグ内に埋め込むだけです。

```html
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
```

上記タグを埋め込んだ後は、[公式サイトのリファレンス](https://getmdl.io/components/index.html#textfields-section)を元にサイトを構築していきます。

例えば、テキストフィールドを実装したいなと思うと、

```html
<form action="#">
  <div class="mdl-textfield mdl-js-textfield">
    <input class="mdl-textfield__input" type="text" id="sample1">
    <label class="mdl-textfield__label" for="sample1">Text...</label>
  </div>
</form>
```

このような形で、あなたのWebサイトの```<body>```内にコピペするだけで、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180432/e47837c0-2279-6665-4e35-ec77596b6796.png)


こんなテキストフィールドを生成することができます。

その他にも、さまざまな要素でマテリアルデザインを簡単に実装することができます。

詳しくは、[Material Design lite - 公式リファレンス](https://getmdl.io/components/index.html#textfields-section)をご覧ください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180432/7d1ea0a0-35b6-dc25-7c14-b62c4bb99e58.png)

このような形でさまざまな要素を実装するためのサンプルコードがあるので、
試しながら「Material Design lite」の使い方を学んでいくのが良いかと思います。

意外と書く内容がなかったので、
自分で実装しながら躓いた点を随時更新していこうと思います。

#終わりに
最後までお読みいただき、ありがとうございました。
簡単そうに見えて、意外とかっこよくしようと難しい。
公式サイトはおしゃれに見えるけどｗ
非同期処理がどこに登場するのか注意しておこう

最近半日潰しましたので残しておきます。
javascriptを普通に記述しているとajaxやnode.jsならば常に気にするので気にならないのですが、思わぬところで非同期処理に出くわしていて気付かずに動作がおかしくなっていたりするので、非同期処理がどこに登場するのか注意しておこうということです。

実際に記述していたコードはforEarch処理内で画像をcanvasに描画等を行ったり色々やっていたので説明用にコードを簡潔にしますが以下のような感じになります。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<script type="text/javascript">
window.onload = function() {
    var canvas = document.createElement("canvas");
    canvas.height = 500;
    canvas.width = 500;
    document.body.appendChild(canvas);
    var context = canvas.getContext("2d");
    var img = new Image();
    img.src = "nekobean.png";
    img.onload = function () {
        context.drawImage(img, 0, 0, 246, 246);
    }
}
</script>
</head>
<body></body>
</html>
```

何も気にしないで記述していたのですが、上ではwindow.onload以外ではimg.onloadが非同期処理でforEach内でimg.onloadを多用していたら読み込むたびに描画される順番が変わる等、挙動がおかしくなっていました。img.onloadが非同期処理ということを失念していた原因によるものでした。

img.onloadを使う際は最初に全て読み込ませておくのが良いかもしれません。

イメージ（動作確認はしていません）

```js
var imagePathList = ["nekobean.png", "nekobean2.png", "nekobean3.png"];
var loadedList = [];
var loadedMap = [];

imageList.forEach(function (imagePath) {
    var img = new Image();
    img.src = imagePath;
    img.onload = function () {
        loadedList.push(imagePath);
        loadedMap[imagePath] = img;
    }
});

// 読み込み監視
var timerId = setInterval(function () {
    if (loadedList.length === imagePathList.length) {// 連想配列ではlengthがあてにならない
        clearInterval(timerId);
        func();
    }
}, 100);

function func (){
    // 処理を記述
}
```
RailsでポートとIPアドレスを指定する方法

# はじめに
例えば同じ開発環境で複数プロジェクト開発していて、こっちのプロジェクトはポート3000で、こっちのプロジェクトはポート3001でみたいなケースはよくあると思うのですが、その際の対応方法となります

# やりかた
## IPアドレスの指定方法
まず、なんのオプションもなく、`rails server`コマンドを打つとこんな感じとなります

```shell-session
$ rails server
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:30:59] INFO  WEBrick 1.3.1
[2016-12-16 12:30:59] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:30:59] INFO  WEBrick::HTTPServer#start: pid=6111 port=3000
```

この場合、デフォルトポートは**3000**となり、IPは**localhost(127.0.0.1)**となります

Macなどローカル開発している場合は特に問題ないのですが、他のサーバーにSSHで接続して開発している場合、接続することができません

なので、以下の**-b**オプションでIPアドレスを指定します

```shell-session
$ rails s -b 172.20.7.61
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://172.20.7.61:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:38:58] INFO  WEBrick 1.3.1
[2016-12-16 12:38:58] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:38:58] INFO  WEBrick::HTTPServer#start: pid=6241 port=3000
```

このように変更することができます

## ポート番号の指定方法
別のプロジェクトを同一環境で開発していて別ポートでWEBサーバーを立ち上げたいなどの場合に活用できます
**-p**オプションでポート番号を指定してあげるだけですね！

```shell-session
$ rails s -p 3200
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://localhost:3200
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:44:33] INFO  WEBrick 1.3.1
[2016-12-16 12:44:33] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:44:33] INFO  WEBrick::HTTPServer#start: pid=6354 port=3200
```

IP指定のオプションと組み合わせることも可能です！

```shell-session
$ rails s -b 172.20.7.61 -p 3100
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://172.20.7.61:3100
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:45:40] INFO  WEBrick 1.3.1
[2016-12-16 12:45:40] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:45:40] INFO  WEBrick::HTTPServer#start: pid=6407 port=3100
```

# おわりに
Railsを勉強し始めた時期に地味にここでハマった記憶がありますｗ
Railsはプログラミングだけではなくインフラ周りの知識も必要となるのでやっていて本当に楽しいっす＾＾
ZabbixのアラートをSlackに通知させる

# はじめに
現在業務で使用しているZabbixはメール通知だけなので、Slackにも通知するように設定してみました！

# 環境
- CentOS6.x
- Zabbix Server 2.4

# やりかた
## 通知スクリプトの設定
こいつを使います

https://github.com/ericoc/zabbix-slack-alertscript

## 配置
こいつを以下で定義されているディレクトリへ配置

```text:/etc/zabbix/zabbix_server.conf
### Option: ExternalScripts
#       Full path to location of external scripts.
#       Default depends on compilation options.
#
# Mandatory: no
# Default:
# ExternalScripts=${datadir}/zabbix/externalscripts

ExternalScripts=/usr/lib/zabbix/externalscripts
```

## SlackのIncomingWebhookのURIを取得
SlackのIncoming WebHooks設定画面から、チャンネルを選択し、WebHooksURIを取得する

![20170111100018.png](https://qiita-image-store.s3.amazonaws.com/0/79134/f53e562f-fd41-67c8-8609-2835fb1a1f0b.png)

## slack.shの編集
以下のCHANGEMEの部分を取得したURLで書き換える

```bash
# Slack incoming web-hook URL and user name
url='CHANGEME'		# example: https://hooks.slack.com/services/QW3R7Y/D34DC0D3/BCADFGabcDEF123
```

## Zabbixの設定
詳細はこちらを見て下さい

https://github.com/ericoc/zabbix-slack-alertscript/blob/master/README.md

# なぜかハマったところ
公式のREADME通りにやってもだめで、以下の箇所を設定したらできるようになりました！

![20170111101006.png](https://qiita-image-store.s3.amazonaws.com/0/79134/509416b2-f1a6-8e7c-a674-36e3027a6574.png)

```
/usr/lib/zabbix/alertscripts/slack.sh '#nw_watcher' "{TRIGGER.STATUS}" "{TRIGGER.NAME}-{ITEM.VALUE1}"
```

# おわりに
CentOS5.xとZabbixServer2.0の環境でも導入しようと思ったのですが、cURLのバージョンが低くて以下の記事の手順でソースからコンパイルして新しいバージョンをインストールしようとしてもなぜかできず積んでおります・・・orz

[CentOS 5.2 にcURL 7.21.1をインストール - イノベートな非日常](http://d.hatena.ne.jp/IT7C/20100815/1281853069)

# 参考
- [zabbixのアラートをSlackで受け取る - ログってなんぼ](http://okisanjp.hatenablog.jp/entry/2016/06/23/122955)
- [[zabbix]slackと連携してみたよっ！ - ADACHIN SERVER Lab](https://adachin.server-on.net/wordpress/?p=2131)
- [ZabbixからSlackに通知を送る - Qiita](http://qiita.com/takashyx/items/3c9becf345cd58ca69bf)
- [zabbix slack連携 - 世界を疑え](http://astail.net/?p=918)
git diffで差分がないのにgit statusで差分とみなされる

# どゆこと？
ぼくはいわゆるGit使ってるマンなのですが、こないだはじめての現象に出会いびっくりしたので備忘録です。

Gitでファイルをなにも編集していないにも関わらず、`git status`で変更内容を見てみると、変更していないはずのファイルが変更対象となっているじゃありませんか！

どゆこと？？

と思い、`git status`の内容をよく見てみると `No newline at end of file` の文字が・・・

なんぞそれ？

と思い調べて見ると、どうやら**POSIX的にはファイル末尾に改行が必要**なようで改行がない場合にこういった現象がおこるようです

# 直し方
Vimで対象ファイルを開き、以下のコマンドを打つだけ！

```vim
: set binary noeol
```

これで余分な差分が出ることもなく、無事にコミットすることができましたとさ！
CSVの日本語が文字化けするときの対処

# 対象
- Windowsで作成したCSVや，ダウンロードしてきたCSV
- MacのExcelで開いたら日本語が文字化けしている
- Mac，Linuxのテキストエディタで開けない/文字化けする 等

# 対処

## Terminalからiconvコマンドを使う

開きたいcsvファイルがinput.csvだとすると

```
iconv -f cp932 -t utf8 input.csv
```

別ファイルとして出力する場合は

```
iconv -f cp932 -t utf8 input.csv -o output.csv
```

標準で使えるので便利
【Ansible】with_itemsループまとめ

# はじめに
AnsibleにはPlaybookの中でループを使うことにより、タスクを繰り返し実行することができます。
その中で一番良く使うであろう**with_items**のループ処理をご紹介致します！

# 共通のルール
- タスクからループ内の要素を使用する際は**item**という名前の変数を用いる

# with_items
## 単純にリストでループしたい場合に使う
```yaml
- name: ディレクトリの作成
  file: path=/root/{{ item }} state=directory
  with_items:
    - test1
    - test2
    - test3
```

## アイテムにはディクショナリを使用することも可能
```yaml
- name: ディレクトリの作成
  file: path=/root/{{ item.name }} state=directory owner={{ item.user }} group={{ item.group }}
  with_items:
    - { name: test1, user: test1, group: test }
    - { name: test2, user: test2, group: test }
    - { name: test3, user: test3, group: test } 
```

## リストのリストは1階層まで展開される
```yaml
- debug:
    msg: "{{ item }}"
  with_items:
    - [ a, b, c ]
    - [ 4, 5, 6 ]
```

上記の場合、[ a, b, c, 4, 5, 6 ]という一つのリストをループさせた際と同じ挙動となる

## 複数のリストをまとめてループさせる
```yaml
- vars:
    - staging: [ test1, test2, test3 ]
    - production: [ test4, test5, test6 ]

- name: ディレクトの作成
  file: path={{ item }} state=directory
  with_items:
    - "{{ staging }}"
    - "{{ production }}"
```

# おわりに
with系のループ処理は色々あるので使い分けをうまくすれば効率的なPlaybookが書けそうですね！
Chrome 拡張機能を使う

- 備忘録

## sample

```json:manifest.json
{
  "name": "hoge",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "Chrome Extensions Test.",
  "content_scripts": [
    {
      "matches": ["http://xxx.xxx.xxx.xxx/chromeExt/*"],
      "js": [
        "scripts/jquery-3.2.1.min.js",
        "scripts/main.js"
      ],
      "run_at": "document_idle"
    }
  ]
}
```

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Chrome Extensions Test</title>
  </head>
  <body>
    <div id="main"></div>
  </body>
</html>
```

```js:scripts/main.js
$(function() {
  var extHtml = '<input type="button" id="extBtn" value="Download">';
  var main = $("#main");
  main.append(extHtml);
  
  $("#extBtn").on("click", function() {
    console.log("extBtn clicked.");
  });
});
```

## 参考リンク
- [Chrome Extensions](https://developer.chrome.com/extensions)
- [MDN WebAPIs](https://developer.mozilla.org/ja/docs/Web/API)
- [IANA Media Type](https://www.iana.org/assignments/media-types/media-types.xhtml)
- [W3C HTML5.1](https://www.w3.org/TR/html51/)
Zabbixで特定の曜日、時間帯に特定のトリガーを抑止する方法

# はじめに
**特定の曜日、時間帯だけ特定のトリガーが実行されないようにしたい**

という事を言われて、調べて見たら結構面倒くさかったのでメモです

# 環境
- Zabbix server v2.0.8 (revision 38017) (21 August 2013)

# 要件
- 以下の監視条件を満たしたい
  1. 日曜の2:00～6:00まで特定のトリガーの監視を抑制
  2. 日曜以外の2:00～4:00まで特定のトリガーの監視を抑制

# 使う関数
Zabbixに用意されている以下の関数を使用

- `dayofweek`
- `time`

# 条件式
```text:元の条件式
{Template_name:proc.num[pop3d,,sleep].count(#2,0,eq)}=2
```

```text:日曜の2：00～6：00まで特定のトリガーの監視を抑制する条件式
(({Template_name:proc.num[pop3d,,sleep].dayofweek(0)}=7) and
({Tmplate_name:proc.num[pop3d,,sleep].time(0)}>020000 and
{Tmplate_name:proc.num[pop3d,,sleep].time(0)}<060000)=0)
```

```text:日曜以外の2：00～4：00まで特定のトリガーの監視を抑制する条件式
(({Template_name:proc.num[pop3d,,sleep].dayofweek(0)}<7) and
({Tmplate_name:proc.num[pop3d,,sleep].time(0)}>020000 and
{Tmplate_name:proc.num[pop3d,,sleep].time(0)}<040000)=0)
```

```text:最終的な条件式
{Template_name:proc.num[pop3d,,sleep].count(#2,0,eq)}=2 and

((({Template_name:proc.num[pop3d,,sleep].dayofweek(0)}=7) and
({Tmplate_name:proc.num[pop3d,,sleep].time(0)}>020000 and
{Tmplate_name:proc.num[pop3d,,sleep].time(0)}<060000)=0) or

(({Template_name:proc.num[pop3d,,sleep].dayofweek(0)}=7) and
({Tmplate_name:proc.num[pop3d,,sleep].time(0)}>020000 and
{Tmplate_name:proc.num[pop3d,,sleep].time(0)}<040000)=0))
```

# おわりに
このぐらいの複雑度になるとZabbixで条件式書くのがとってもツラたん

# 参考
- [トリガーの曜日・時間指定での検知除外設定 - 日本Zabbixユーザー会](http://www.zabbix.jp/node/2582)
- [zabbixのトリガー条件式のメモ書き( timeとかdayofweekとか使ってみた) - FAIRWAY Engineer {Blog} ](http://dev.blog.fairway.ne.jp/zabbix%E3%81%AE%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E6%9D%A1%E4%BB%B6%E5%BC%8F%E3%81%AE%E3%83%A1%E3%83%A2%E6%9B%B8%E3%81%8D-time%E3%81%A8%E3%81%8Bdayofweek%E3%81%A8%E3%81%8B%E4%BD%BF%E3%81%A3/)
- [zabbixで特定時間帯のトリガーを無効にする - Qiita](http://qiita.com/biatunky/items/a7979331333cadb3aeba)
俺ですら使えるboxnoteを積極的に活用してあら便利な人生をおくろう

俺です。
キー太のアカウントID忘れてしまっていたので放置していましたが復活です。

[cloudpack あら便利カレンダー 2017](https://cloudpack.github.io/benri2017/)の3日目です！

記事を書いた時点では、あら便利カレンダーにはエントリされてない(してない)のですが優しい同僚が、登録してくれるって願っています。

最近お客様もまきこんでちょこちょこ取り組んでるネタです。

俺の所属している組織では、共有ストレージにboxをつかってます。
boxの共有フォルダにお客様招待してファイルシェアとかもやってます。
共有フォルダを準備するとき、お客様のメールアドレスを間違えないように登録するのがつらすぎて死にそう、もしくは死んで転生するまであるんですが、
この死線を乗り切ってしまえばファイルのやり取りについてはすべてboxでOK牧場です。
紀元前からある、メールにファイル添付したあと謎の文字列を送る儀式がなくなるので非常に楽です。

さて今回は、boxnoteという多人数が同時に編集できるノートブック機能の話です。
これがまた便利なのでMTGの議事録にちょくちょく使っています。
boxnoteが使えるようになってから、社内ではよく使ってたんですが、
お客様先へ一人で出向いた時とか、俺はシングルコア脳筋なので喋りながら議事を書くって苦手なんですね。
なのでお客様とのMTGの議事を、boxnoteをシェアして互いに書いたりしてます。

- 目の前で一緒に作れる
- お互いのもっている、用語や認識を合わせやすい (同じ用語使ってるのに、会社の違いで意味が違うみたいなケースあるじゃないですか)
- MTG終了直前にnext stepも確認しやすい
- 画像も貼れるから写真ハリーもできる。ホワイトボード最強伝説
- wikiに書くとか俺達のdocファイルに書くとか必要ないのですげーらく。MTG後に清書しようとかいう無駄な時間がなくなってハッピーすぎて最高
- 表形式など、ある程度の体裁も整えることができる
- boxnoteはauto backup機能があり、一定のタイミングで保存されるため誰かが操作ミスってデータ消しても古いバージョンからリストアできます
- boxnoteのマニュアルバックアップがあればすごく良いんですが、まーしゃーないなというかんじです

社内各位 > 内部だけではなく、ぜひお客様とつかってみましょー

SaaSは社内利用のみならず、お客様もメリットを享受できるのがいいですね。
Pythonの集合演算

# はじめに
集合に関してすぐ忘れちゃうのですよ

# 集合とは
- 集合とは、重複する要素をもたない、順序づけられていない要素の集まり
- {}内にカンマ区切りで要素を配置するか、set関数にシーケンス型を渡すことで生成

|演算種|説明|
|:---|:---|
|和（union）|A か B に含まれる|
|積（intersection）|A と B で共通|
|差（difference）|A にのみ含まれる|
|対称差（symmetric difference）|A もしくは B にのみ含まれる|

# Setオブジェクトを用いて以下のような数学的な演算を行える
## 和（union）
### A か B に含まれる
```python
>>> {1, 2, 3} | {2, 3, 4}  # 和
{1, 2, 3, 4}
```

または

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.union(b)
{1, 2, 3, 4}
```

元の集合を変更する場合

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.update(b)
{1, 2, 3, 4}
>>> a
{1, 2, 3, 4}
```

## 積（intersection）
### A と B で共通
```python
>>> {1, 2, 3} & {2, 3, 4}  # 積
{2, 3}
```

または

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.intersection(b)
{2, 3}
```

元の集合を変更する場合

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.intersection_update(b)
>>> a
{2, 3}
```

## 差（difference）
### A にのみ含まれる
```python
>>> {1, 2, 3} - {2, 3, 4}  # 差
{1}
```

または

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}   
>>> a.difference(b)
{1}
```

元の集合を変更する場合

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.difference_update(b)
>>> a
{1}
```

## 対称差（symmetric difference）
### A もしくは B にのみ含まれる
```python
>>> {1, 2, 3} ^ {2, 3, 4}  # 対象差
{1, 4}
```

または

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.symmetric_difference(b)
{1, 4}
```

元の集合を変更する場合

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a.symmetric_difference_update(b)
>>> a
{1, 4}
```

## 部分集合（subset）かの判定
### 左辺の要素すべてが右辺の集合に含まれている場合
```python
>>> {1, 3} <= {1, 2, 3}
True
```

### 左辺の要素すべてが右辺の集合に含まれていない場合
```python
>>> {1, 4} <= {1, 2, 3}
False
```

# おわりに
Pythonたのし～
ウェブサイトが更新されたらLINEで通知

興味があるウェブサイトの更新はいち早く知りたいですよね。ウェブサイトが更新されたらLINEで通知するように設定する方法を紹介します、

# やりたいこと

ウェブサイトが更新されたらLINEで通知する。

# 必要なアカウント

* LINE　　メールアドレスが登録されていること
* Codyl Connect　持っていない人は[こちら](https://connect.codyltech.com/newuser)から登録できます。

# 手順

##　1. フィードのURLの取得

### 1-1 更新を知りたいサイトにウェブブラウザでアクセスします。

例： http://quiz-tairiku.com/q.cgi

### 1-2 フィードのリンクを探します。

フィードのアイコンや「RSS」、「Atom」、「RDF」、「XML」といった文字で提供していることが多いようです。


![q01.png](https://qiita-image-store.s3.amazonaws.com/0/184984/0afc5dba-45c3-eb42-aa11-118cddf117b0.png)

### 1-3 URLをコピー

リンクを見つけたら、右クリックでURLをコピーして、PC上のテキストファイルに保存しておきます。

<img width="311" alt="q02.png" src="https://qiita-image-store.s3.amazonaws.com/0/184984/10a5baf1-c6dd-1d8b-e160-9ee950344f0d.png">

> http://quiz-tairiku.com/feed.xml

## 2. Codyl Connectの設定

### 2-1. Codyl Connectにログイン

ウェブブラウザで[Codyl Connect](https://connect.codyltech.com)にログインします。

### 2-2. シナリオをテンプレートから作成

シナリオタブをクリックして、「テンプレートから作成」をクリック

![c01s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/593dd2fb-5a26-656f-53f1-f6eb70ff7091.png)

### 2-3. テンプレートを選ぶ

テンプレート一覧が表示されるので、0045で絞り込むと、お目当の「ウェブサイトが更新されたらLINEで通知」が見つかります。「このテンプレートを使用する」をクリックします。

![c02s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/83d4ba50-f41c-6755-f37b-8f6808c66cd7.png)

### 2-4. フィードコネクターを割り当て

テンプレートの設定画面のコネクター割り当てで、フィードの下の枠をクリックして、「新規コネクター作成」を選びます。

![c03s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/70cdbfa5-c2e3-6e62-f4cc-5c3ae904b93f.png)

「新しいコネクターを作成」ダイアログが表示されます。

* コネクターにわかりやすい名前をつけます。サイト名を入れると良いでしょう、
* フィードのURLとして、先ほど保存したフィードのURLを入力します。
* 作成をクリックします、

![c04s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/92293002-9173-bf4a-a648-f02d4a635116.png)

### 2-5. LINE通知コネクターを割り当て

テンプレートの設定画面のコネクター割り当てで、LINE通知の下の枠をクリックして、「新規コネクター作成」を選びます。

![c05s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/196f7e11-7556-3d20-3904-3647a27e50e7.png)

「新しいコネクターを作成」ダイアログが表示されます。「アカウントに接続」をクリックします。

![c06s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/ab66f66d-1626-4793-8200-8d63bd02c1a7.png)

LINEのログイン画面が表示されます。LINEに登録してあるメールアドレスとパスワードでログインします。

![c07s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/f6afa6e7-652e-71a3-903a-d44b74931342.png)


トークルームの選択画面が表示されます。「1:1でLINE Notifyからの通知を受け取る」を選んで、「同意して連携する」をクリックします。

![c08s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/7fbcb21a-ddc5-0cb0-4b36-13c6cc00dc44.png)

コネクターの割り当ては完了しましたので、「シナリオ作成」をクリックします。

![c09s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/632a982f-6228-b7d6-45bd-52628eb33cf0.png)

### 2-5. スケジュール設定を有効化

上記まででシナリオが作成されました。スケジュール設定を有効化すると動き始めます。

![c10s.png](https://qiita-image-store.s3.amazonaws.com/0/184984/899e84db-5678-f0b1-28ee-d8cfbdfed633.png)


# 完成

ウェブサイトが更新されると （今回の例だと、クイズサイトに新着クイズが投稿されると）、LINEに通知が来るようになります。

![line.png](https://qiita-image-store.s3.amazonaws.com/0/184984/f5aa3e01-e048-376c-626f-060c36c56ace.png)
こよいはKotlin REPLナイト。


#なんとなくの想定
Androidガリガリ書きまっせ、的な人ではない、
「[ITに興味はないけどエンジニアになってしまった新人](http://qiita.com/m2266269151/items/be7cdc16d662bc4bb226)」のような人が、
Andfroid型の開発が人手不足っぽいシチュエーションに置かれていて、
ついに、kotlinがどうとかを聞いてしまったあたりをイメージ。
はしょって書くので、対象読者は、ググるはまぁ人並みか、それ以上にデキる人。

正直、内容は概ねkotlin公式のこのチュートリアルそのもの。
https://kotlinlang.org/docs/tutorials/command-line.html
...書いた翌朝に知ったんだけれどね。このチュートリアルは現実的で
そのまんまでいいと思うんだけれど、まぁ以下は主にAndroid向けなJVM言語kotlinが生まれたきっかけを軽く知っておくための雑文。


# ゆるくkotlinをはじめる、１つのプラン

今は昔、ITバブルの頃に当時のJavaにイラッときたギークたちが生み出した
２つの言語、GroovyとScala。

- Java-> オブジェクト指向なスクリプト言語Groovy
- Java-> ハイブリッド言語（オブジェクト指向＋関数型言語）Scala

Android向け言語として売り出し中のKotlinは、
両言語の１０年ほどの歴史をうま〜く取り込んで、
ついに　Annroidの公式開発言語のひひとつにまでなった。

そのあたりのGroovy使いやScala使いな人たちからすると、
なんだかしたたがだねぇ、、という思いもあるようだけれど、
「Kotlin=ことりん」というネーミングから
Java家の「ちゃっかり末娘ことりん」くらいに思って、
いいとこどり言語を知っておくのも悪くない。

そのためには、Groovy使いやScala使いな人たちが
kotlinを触ってみているさまをみておくといい。
「groovy kotlin」「scala kotlin」と検索してみると
いろいろな情報が出てくるよ。ちょっと古い情報も有効活用しよう。

ということで、本日は、Groovy使いな方の
[Kotlinにチャレンジしてみる（HelloWorld)](
http://qiita.com/saba1024/items/d525fb6c89d1180b409a)
からスタートしてみる。

#sdkmanでkotlinインストール

kotlinをはじめ、さまざまなJava上の言語・ツールはgroovy製のsdkmanというツールで最新版をさくっとインストールできる（[参考](http://qita.com/saba1024/items/967ee3d8a79440a97336)）。
注. windowsの場合は、Bash on Windowsなどで、まずはcurlを使えるようにしておこう（[参考](http://qiita.com/kmry2045/items/15697e734b32da2c8b51)）。

SDKMANのインストールは以下だけで大丈夫
>curl -s api.sdkman.io | bashというコマンドを実行すればOKです。
>インストールが終わったら、ターミナルの再起動...


その後は
> sdk list kotlin

で、「Available Kotlin Versions」のリストを軽く見て、kotlin最新版 のインストールだ:

> sdk install kotlin

Javaがないと怒られたり、Javaが古い人はJavaも最新版にしておこう:

> sdk install java

# KotlinでREPL

Kotlinインストール後は、kotlinc-jvmというちょっと長ったらしいコマンドでkotlinのREPLを試すことができる。
REPLとは...を書くと長くなりそうなので、要するに、以下のようにコードの実行結果をすぐに確認できるコマンドラインツールだよと言っておく。以下のようなもの。


```kotlin
$ kotlinc-jvm

Welcome to Kotlin version 1.1.2-2 (JRE 1.8.0_131-b11)
Type :help for help, :quit for quit
>>> 1+2
3
>>> println("Hello Kotlin!")
Hello Kotlin!
>>>
```

REPLは仕事中に電卓かわりに使ったりするたぐいのものだけれど（必要にかられて、ちょっとした処理を書く際にはpyhtonかgroovyのREPLがおすすめかな。）、もちろん、斜め読みしたkotlinの文法をお試しする用途にも使える。

英語で公式を読むテンションがなかったら、
[Kotlinの公式リファレンスを日本語化してみた[前編]](http://qiita.com/dogwood008/items/6e8d3225ea9bb0fe3099)
を起点に、日本語化されたドキュメントを当たってみるのが良いと思う。

ここでは、いわゆるラムダ式関連を試しておこう。
以下のコード「(1):」のとこと「(2):」のとこの出力が
どうなるか分かるかな？


```kotlin
val lst = listOf(1, 2, 3, -4, 4)

var sum = 0
lst.forEach {sum += it}
print("(1): $sum")

lst.filter { it > 0 }.forEach {  sum += it}
print("(2): $sum")
```
こうしたお試しにREPLはぴったりだ。
上のコードをREPLを貼り付けてみよう。


```kotlin
>>>val lst = listOf(1, 2, 3, -4, 4)
>>> var sum = 0
>>> lst.forEach {sum += it}
>>> print("(1): $sum")
(1): 6>>>
>>> lst.filter { it > 0 }.forEach {  sum += it}
>>> print("(2): $sum")
(2): 16
>>> sum
16

```

どうなっているのかは、(1, 2, 3, -4, 4)のところの足し算・引き算ができれば分かるよね。

ひとつのキモはforEach {sum += it}とったところだ。 「it」って何という疑問がある人は、groovy itで解決されるかもしれない。変数宣言のvalとvar の方はscalaね。

その他、どんどんお試しコードをkotlinにREPLに貼り付けていってみよう。
（REPLの終了は、Ctrl+Cとかね）

#要するに

「Javaとkotlin使えます、android開発したいです」、ていうよりも、
「Java使えます、あと、groovy, scala,kotlinなどを勉強してみました」という方が
意識高い子だな、と思われそうだということね。

今回はこれまでにして、次回は、
おっさんほいほいのJava6時代のサーブレットをkotlin
で、あたりかな。。
[Python]ディレクトリ内にある複数のファイルをソートして読み込む

# 背景
Python初心者です。
Pythonでディレクトリ内にある複数のテキストファイルを読み込むときに普段は以下のように書いていました。

```py3
#coding:utf-8
import glob

if __name__ == '__main__':

  file_list = glob.glob('path/to/dir/*.txt')

  for filename in file_list:
    with open(filename, 'r') as input:
    ...
```

しかし、このままだと `ls -U` を叩いたときと同じ順番(ソート無しの状態)でファイルが読み込まれてしまいます。

今回はファイル名でソートされた状態で順番に読み込みたかったので解決法を調べました。

# 解決策

file_listの部分を以下のように書くことで解決できました。

```py3
#coding:utf-8
import glob


if __name__ == '__main__':

  file_list = sorted(glob.glob('path/to/dir/*.txt'))

  for filename in file_list:
    with open(filename, 'r') as input:
    ...
```

# おまけ
他にも `import os` してからsorted関数のkeyを `os.path.getmtime` だとか `os.path.getsize` にすると変更時刻順とかファイルサイズ順にソートして読み込ませることができるみたいです。
便利ですね。

# 参考文献
[How is Pythons glob.glob ordered?](https://stackoverflow.com/questions/6773584/how-is-pythons-glob-glob-ordered)
STIとポリモーフォック関連は相容れない

# はじめに
TECH::CAMPで仕事をしている時に、STIとポリモーフォック関連を同時に使える場面があった。設計段階では２つとも使おうと思っていたけれども、実際に実装しようと思ったらポリモーフィズム関連が必要ないことがわかった。

# 例

例えば、以下のように `User` モデルを継承している、 `Admin` と `NormalUser` があるとする。そして、全てのユーザーが画像をいくつか持っているとする。そうすれば、STIとポリモーフォック関連を使用すると以下のようなコードが出来る。

```ruby
class User < ActiveRecord::Base
end

class Admin < User
  has_many :images, as: :imageable
end

class NormalUser < User
  has_many :images, as: :imageable
end

class Image < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end
```

だがしかし、ここで問題なのは `image.imageable_type` に本来なら、 `Admin` か `NormalUser` をいれたいはずなのだが、Railsは親クラスの `User` を使う。

# そもそもの役割

## ポリモーフィック関連
http://qiita.com/itkrt2y/items/32ad1512fce1bf90c20b
こちらのQiitaの記事が非常によく、ポリモーフィックの利点・目的を説明していると思います。結論的にいうと、ポリモーフィック関連は、名前の通り **ポリモーフィズム** を実装するために使われるものです。

## STI
http://qiita.com/yebihara/items/9ecb838893ad99be0561
こちらも非常にいい記事で、この中に 「STIは「継承」の実装、ポリモーフィック関連は「関連」の実装なので、両者を比較するのは不適切です。」という文言がありますが、僕は２つでかぶっている役割があると思います。

# 理由

ではなぜ、この２つは相容れないのでしょうか。それは、STIがポリモーフィズムも含めて実装してしまえるからです。突き詰めれば、STIはクラスの継承でしかなく、クラスの継承というものの利点の一つにポリモーフィズムが含まれています。つまりは、上記の例のように、STIとポリモーフィック関連を一緒に使ってしまうと、役割が重複してしまうのです。上記の例だと、ポリモーフィズムの最終的な目標は以下のように、 `user` が 果たして `admin` であろうが `normal_user` であろうがメソッド呼び出し時に気にせずにメソッドが使えるということです。これはポリモーフィック関連だろうが、STIであろうが実現可能です。

```ruby
def open_image(user)
  user.image.open
end

open_image(admin_user)
open_image(normal_user)
```

# どっちを使ってもいいのか
いえ、そうではありません。あくまで、STIはクラスの継承なので、ポリモーフィズムを**含む**であって、他にも素敵なオブジェクティブ指向的なものが実現されます。なので、どちらも使用可能な時はSTIを使うべきです。

# どっちも使うときはないのか
あります。例えば、今回の例で行くと、 `User` とは全く関係ないモデルが `has_many :images` の関係だとすれば、どちらも使います。ただ、これは、`User`と他のモデルなので、STIと一緒に使えるとが言えないかもしれませんが・・・
mochaで保留したいテストの書き方


javascript用のテストフレームワークであるmochaのTipsです。
mochaではdescribeやitという関数を用いて、テストを書くことができます。

ときとして、「先にテストケースだけあげたい」、とか、「中身のコードはあとで書きたい」ということがあると思います。
そんなときに以下のコードのように書いて実行すると、このテストケースは成功にカウントされてしまいます。

```js

describe('calc.jsのテスト', function () {

  it('配列の中身をすべて足した合計が返る', function () {
    // あとで書く
  });

});
```

```shell-session
$ mocha

  calc.jsのテスト
    √ 配列の中身をすべて足した合計が返る


  1 passing (15ms)

```

it関数からコールバックを除くことで、`pending`という状態にすることができます。

```js

describe('calc.jsのテスト', function () {

  it('配列の中身をすべて足した合計が返る');

});
```

```shell-session
$ mocha

  calc.jsのテスト
    - 配列の中身をすべて足した合計が返る


  0 passing (11ms)
  1 pending

```

1件のテストが`保留中`であることがわかります。
後で書くことを忘れなかったり、ほかの人がみてもまだ書かれていないテストがあることが明らかなので、とても便利だと思います。



###リンク
- https://mochajs.org/
- http://qiita.com/chihiro/items/3b40ea0cfcb492437f01
    - mochaの実行Tipsについて以前にまとめたものです。