OmniAICreator/Qiita-1.07M huggingface dataset:
ReactNativeで作ったアプリでもちゃんと数値を追うためのパッケージ４種

ReactNativeを使って３つプロダクトをリリースしてきました。クロスプラットフォームなので計６アプリになります。使えば使うほどサクサク開発できる環境の大ファンになっています。(最後にリリースしたもの宣伝してるので、どんなものが出来るか興味ある方は触ってみてください。)

これら全てPrivateなプロジェクトなんですが、ユーザーが増えてるものもあり、数字を追いたくなります。とりあえずで`Google Analytics`を使ってたんですが、綺麗なコホートとか見たくてちょっと調べてみました。結論を言っておくと、`Facebook Analytics`を使ってみようと思ってます。

### Google Analytics

react-native-google-analytics-bridge
https://github.com/idehub/react-native-google-analytics-bridge

いくつかパッケージがありましたが、上記が開発活発なようです。
おもむろにScreenViewを記録してみればいいと思います。

私はどうしてもGAのEventトラッキングは見るのが苦手で、美しさを求めて探求の旅に出ると、以下３種が見つかります。

### Mixpanel

react-native-mixpanel
https://github.com/davodesign84/react-native-mixpanel

少し前はアプリ解析といえば、mixpanelだった気がします。
最近は大手が無料で提供し始めていて胸が痛くなりますね。

ただ、ReactNativeを使う選択をしている場合、
プロトタイプなプロジェクトである場合が多いはずなので、
有料プランが目の前に見えてるmixpanelは選択肢から落ちやすいのではと思います。

### Firebase Analytics

react-native-firebase-analytics
https://github.com/evollu/react-native-firebase-analytics

Googleの仲間になったFirebaseのanalyticsです。
firebase公式のjsパッケージはReactNativeでも動くんですが、analytics系の機能はどうもネイティブのライブラリしかもってないみたいで、このパッケージが存在するようです。それでもfirebaseを使ってサクッとアプリ作るぜ！って時は管理がしやすそうです。

### Facebook Analytics

react-native-fbsdk
https://github.com/facebook/react-native-fbsdk

facebookのリポジトリにあるfacebookSDKのパッケージです。
ものすごい勢いでBreaking Changesを繰り返すReactNativeを信仰する人々にとっては、`facebook/`はとてつもなく安心感を感じるのではないでしょうか？ 0.40の変更とかリリースノートにごめんね、ってあったけど少し涙が出ました。

ログイン、シェア機能のためのパッケージかと思いきや、イベントロガーも実装されてます。Facebookログイン機能を実装するついでに解析も組み込めるのが素敵です。たぶんそれが狙いなのでしょう。

正直Facebook Analyticsの使い心地はこれからなのですが、パッと見やりたいことはできそうなので安心感を選びます。

以上、４種の紹介でした。

### こんなアプリをReactNativeで作りました。

#### 世界最大の短歌アプリ「うたよみん」
https://itunes.apple.com/lu/app/minnano-duan-ge-tou-gaokomyuniti/id675671254?l=fr&mt=8

#### ロンドン旅行する日本人必須「おいしいロンドン」
https://itunes.apple.com/jp/app/oishiirondon/id1155861022?mt=8

#### 写真で英熟語を覚える「Phrasal Verbs Flashcard」
https://itunes.apple.com/jp/app/phrasal-verbs-basic-flashcard/id1128146387?mt=8

以上、全てAndroid版もあります。ご査収ください。m(_ _)m
技術英語 > If it helps, [think of it this way]:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 630 / 12833)

> If it helps, **<font color=red>think of it this way</font>**:

`a = a - 3`の構文について、一時変数を使っての計算として考えてみる例が掲載されている。

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

> Let's put it this way.

http://qiita.com/7of9/items/f52e54b15b972f3a3147
Windows m2tsファイルのリネームバッチファイル

# 概要
[rplsinfo](http://saysaysay.net/rplstool/rplsinfo)を使って取得した情報でm2tsファイルをリネームするバッチファイル
[m2ts Viewer](https://www.minagi.jp/2013/12/30/m2tsviewer/)で手作業でコツコツやってたんですが疲れたので。
自分用に書いているので、お好きなようにカスタマイズして使ってください。

# 前提
アニメなど、しょぼいカレンダーに登録されている場合はこちらのリネームツールのほうが高機能だと思います。
[ts-renamer – 録画ファイルを自動でリネーム –](https://rndomhack.com/2015/12/15/ts-renamer/)
私が主に録画している番組がしょぼいカレンダーに対応していなかったのでこのようなバッチファイルを書きました。
※KawaiianTV、pigooHDなど。要するにアイドル関連です。

rplsinfo.exeがあるフォルダと同じフォルダに配置して使うことを想定しています。Windows7環境で動作確認しています。

# 実行イメージ
### m2ts Viewerで見た情報
<img width="287" alt="screenshotm2ts_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/149787/cdfabaac-f7a8-9b5e-56d9-eaa84c9ed36d.png">

### 実行後のファイル名
<img width="345" alt="screenshotm2ts_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/149787/d953504b-3563-7bf0-91c0-9e4c60f43dc4.png">


# 実装
``` bat:rename.bat
@echo off
cd /d %~dp0
setlocal enabledelayedexpansion
rem このファイルをrplsinfo.exeと同じフォルダに配置すること

for %%F in (%*) do (
for /f "DELIMS=" %%A in ('call rplsinfo.exe %%F -b') do set NAME=%%A
for /f "DELIMS=" %%B in ('call rplsinfo.exe %%F -i') do set DETAIL=%%B
echo !NAME!
echo !DETAIL!
rem ここから
rem 内容の冒頭に【がある前提（環境に応じてカスタマイズ）
for /f "DELIMS=】 TOKENS=1,2" %%1 in ("!DETAIL!") do (
if not "%%2"=="" set NAME=!NAME!%%1】
echo !NAME!
)
rem ここまで
rename %%F "!NAME!%%~xF"
)
pause;
```
バッチファイルに対してリネームしたいファイルをドラッグ＆ドロップで起動します。
【ここから】～【ここまで】の部分が、個人用のカスタマイズ部分なので必要に応じて書き換えてください。
for文で回しているため、複数ファイルをまとめてドラッグ＆ドロップしても全て処理してくれますが
複数ファイルでうまく行かなかった場合でも、単一のファイルをドラッグ＆ドロップすると処理が成功することがあります。
また、リネームのみなので失敗してもファイルがなくなる恐れは少ないですが、念のため元ファイルをバックアップしておいて作業することを推奨します。

# 参考文献
[rplsinfo](http://saysaysay.net/rplstool/rplsinfo)
[【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ](http://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a)
[DOSで、プログラムの標準出力を変数に入れる](http://d.hatena.ne.jp/iww/20110526/p1)
[コマンドプロンプトを使ってみよう！](http://ykr414.com/dos/dos05.html)
pandasにexcel出力のcsvを読ませる時に注意する点

pythonに読ませるなら、文字形式はutf-8にして欲しいものですが、
データ出力側も色々な事情ありますから、受け側で変換して読み込まなければならないケースも多々あります。

Windows&Excelの環境で出力されるcsvは、シフトＪＩＳです。。。
ということで、pandasで、

```python
import pandas as pd
dataset1 = pd.read_csv("hogehoge.csv",encoding="shift_jis")
```
とやれば、ＯＫだなーと思って油断してると、たまにちゃんと読めないことがあります。

```test.csv
山田,1000
佐藤,2000
山本,3000
```
これは読めますが、

```test2.csv
1,山田,1000
2,髙橋,2000
3,黑﨑,3000
```
もれなく、下記のエラーが出ます。。。

```python
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xfb in position 0: illegal multibyte sequence
```

これは、test2.csvに、
・ハシゴダカ "**髙**"
・タチサキ "**崎**"
等の、windows拡張文字列が混ざっている事に起因します。
このような文字を読むためには、文字コードをcp932としてやる必要があります。

```python
encoding='cp932'
```

こういう事があるので、windowsだから、shift_jisで読んどけばＯＫという意識ではなく、
最初から、cp932で読むようにしておけば、無駄なトラブルに悩まされなくて良いというお話でした。


```python
import pandas as pd
dataset1 = pd.read_csv("hogehoge.csv",encoding="cp932")
```

※下記サイト大変参考になりました。
「Shift_JIS と Windows-31J (MS932) の違いを整理してみよう」
http://weblabo.oscasierra.net/shift_jis-windows31j/
Slackのスレッド機能について雑なまとめ

スレッド利用できるようになっていたので気になる点について雑にまとめてみた。

## スレッド開始について

特定のReplyに対して `Start a thread` をクリックするとスレッド開始

<img width="532" alt="スクリーンショット 2017-01-20 1.09.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/132bd186-1ff2-c90d-4a59-7bfbc3203b5b.png">

## スレッド参加のトリガー

- 以下のようなイベントで参加になるようす
  - スレッドを開始する
  - スレッドをフォローする
  - スレッドに対して自分から投稿する
  - スレッド内の誰かからメンションをもらう
      - 他人を参加させるにはこの方法しかなさそう(/invite のようなコマンドも無い)
      - `@channel` が効かないようなので、強制的にチャンネルメンバー全員参加させるのは無理？（一人ひとり追加すれば良いけど…）

## スレッドに参加すると起こること

- All Threadsにスレッドが表示され、通知が確認できる

## スレタイっぽいことしたい

- それ自体の機能は無さそうだけど、開始したReplyが常に上に表示されるので、開始するReplyをスレタイっぽく書けば代わりに使えそう

<img width="620" alt="スクリーンショット 2017-01-20 1.27.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/8dcd1fe6-9899-81ba-443f-5a7354195033.png">



## スレッドから抜けたい

- スレッドを選択して、右上「…」から `Unfollow this thread` をクリックすると抜けられる（通知も来なくなる）

<img width="625" alt="スクリーンショット 2017-01-20 1.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/214cb35f-c14e-84e6-2c89-521f9b9e31bf.png">


- 再度参加したいときには、上記参加トリガーを発生させれば良い

## チャンネル側におこること

- 基本的には `開始リプライ／参加メンバー／リプライ数` が表示される

<img width="377" alt="スクリーンショット 2017-01-20 1.14.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/dd90f6fc-0dd7-f30b-66fa-6a58e0a294b9.png">


- チャンネル側に投稿表示したいときはスレッド内で投稿する時に `Also send to チャンネル名` のチェックボックスをONにしてリプライする

<img width="332" alt="スクリーンショット 2017-01-20 1.16.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/10cb610e-2e9e-f890-2bc2-bae759671f86.png">

↓以下のような感じで表示

<img width="602" alt="スクリーンショット 2017-01-20 1.17.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/c14a7e19-cfac-187c-d5c9-f01c26e182ea.png">


<br>

## 雑な感想

- All Threadsが便利だし最近のスレッドがきちんと優先して表示されるので、使い方を間違えなければ良さそうという印象
- いまのところ快適だが、スレ乱立すると破綻しそうなのでもう少しスレが増えたら印象変わるかも
- `@channel`が効かないので、スレッド内から「チャンネルにはいるが、スレッドに参加していない人たち全員にも通知したい」という用途には使えなさそう
Phalconのクエリビルダーで生SQL取得

# Phalconクエリビルダーから生SQLを取得しよう

Phalconのクエリビルダーは便利だが、SQLのボトルネックを探す時に必要なSQLが取得できない。PHQLという独自のクエリは簡単に取得できるのだがドキュメントがあまりないのでハマった。独自にSQLに書き換えるのもいいが現実的ではない。。。

## 前提の環境
Phalcon : 3.0.x
PHP : 7.0.x

## Phql文の取得
Phql文の取得は公式ドキュメントにもあるように簡単にできる。

```php
<?php
use \Phalcon\Mvc\Model;

class Robot extend Model{
     
    public function testfunc(){
        $statment = $this->getModelsManager()->createBuilder()
                 ->from(self::class)
                 ->getPhql();
        return statment;
    }
}

$robot = new Robot();
echo $robot->testfunc();// SELECT * FROM [Robot] 
```

このPHQLを書き換えてSQLにしようかと思ったが、現実的ではない。
色々なページを検索してみたところ記載があった。
http://stackoverflow.com/questions/21339274/get-raw-sql-from-phalcon-query-builder
実は公式ドキュメントではマニュアルは見当たらないが、`getQuery()`を実行した後に`getSql()`を実行することで簡単に取得できることが判明。

```php
<?php
use \Phalcon\Mvc\Model;

class Robot extend Model{
     
    public function testfunc(){
        $statment = $this->getModelsManager()->createBuilder()
                 ->from(self::class)
                 ->getQuery();

        // getSqlは実行前と実行後でそれぞれ実行が可能
        $sql_info = $statment->getSql();
        return $sql_info;
        
　　　　// returnを外して、$statment->execute()も実行可能。
    }
}

$robot = new Robot();

var_dump($robot->testfunc());// $sql_infoにはSQLとその他パラメータが入る
```

これで、SQLの確認もやりやすくなります。
Goのバイナリのエントリポイント

Go言語よくわからないけどとりあえず調べてみようというきっかけとして、そういえばGoってlibcにすら依存しないんだっけ、エントリポイントどうなってるだろ、と思って調べてみました。

- 環境

```
$ go version                                                         [kubo39:~]
go version go1.7.4 linux/amd64
$ cat /proc/version                                                  [kubo39:~]
Linux version 4.8.0-34-generic (buildd@lcy01-21) (gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12) ) #36-Ubuntu SMP Wed Dec 21 17:24:18 UTC 2016
```

まずreadelfを使ってエントリポイントアドレスを調べてみます。

```
$ readelf -h `command -v go`                                              [kubo39:~]
ELF ヘッダ:
  マジック:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  クラス:                            ELF64
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Advanced Micro Devices X86-64
  バージョン:                        0x1
  エントリポイントアドレス:               0x4d1620
  プログラムの開始ヘッダ:          64 (バイト)
  セクションヘッダ始点:          624 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                64 (バイト)
  プログラムヘッダサイズ:            56 (バイト)
  プログラムヘッダ数:                10
  セクションヘッダ:                  64 (バイト)
  セクションヘッダサイズ:            36
  セクションヘッダ文字列表索引:      13
```

`nm` で調べると、エントリポイントのシンボル名はLinuxの場合は `_rt0_amd64_linux` であることがわかりました。

```
$ nm -f posix `command -v go` | grep 4d1620                          [kubo39:~]
_rt0_amd64_linux T 00000000004d1620 0000000000000012
```

定義されているsrc/runtime/rt0_linux_amd64.sをみると、

```asm
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "textflag.h"

TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8
	LEAQ	8(SP), SI // argv
	MOVQ	0(SP), DI // argc
	MOVQ	$main(SB), AX
	JMP	AX
...
```

という感じでmainにコマンドライン引数を渡して呼んでるるだけのようです。

というかstaticなバイナリだとcrt*.oを静的リンクしたりとかそういう面倒なかんじのものがなかったりするんですかね。(リンカ読めって話っぽい)
golang ioテンプレート



ファイルを作成して、書き込み
-----

```go
package main

import (
	"fmt"
	"os"
)

func main() {

  file, err := os.Create("foo.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

  bf := bufio.NewWriter(file)

  // 文字列を書き込むなら`WriteString`の方がおそらく高速。
  // なぜなら、[]byteにキャストをするとメモリコピーが発生するから
  // `WriteString`は内部でポインタで参照している...と思う
  bf.Write([]byte("Hello World\n"))
  bf.WriteString("Hello World\n")

  fmt.Println(file.Fd())
}
```

※ []byteキャストのことは[ここ](http://qiita.com/mattn/items/176459728ff4f854b165)に詳しく書かれています。




参考サイト
-----

* http://golang.jp/pkg/bufio
* http://golang.jp/pkg/os
* http://golang.jp/pkg/io
Reekの警告をコメントで無効化する方法

Ruby の静的解析ツールである Reek の警告をコメントで無効化する方法についてまとめます

## <i class='fa fa-check-circle'></i> 概要
基本的には [config.reek](https://github.com/troessner/reek#configuration-options) の設定に応じて規約をチェックするが、
一部だけ例外的に警告対象外にしたいケースがあると思います。

例えばFeatureEnvyの警告がでた際に、オブジェクトにセットしてまとめて引数に渡したいが
渡す相手が自分で変更できない外部ライブラリだった場合などがあります。

## <i class='fa fa-file-text'></i> コメントによる除外方法
以下のコメントをクラスかメソッドに対して指定することで警告対象外にすることができます

```ruby
  # :reek:警告名称
```

## <i class='fa fa-flask'></i> サンプル
out, out_out 双方が LongParameterList（長すぎる引数。デフォルトだと4つで警告される）に
引っかかっていますが、 out は除外コメントによって警告対象外になっています

~~~ruby
# Hoge
#
# Hoge です
class Hoge
  def safe(hoge, hige, hage)
    puts "#{hoge} #{hige} #{hage}"
  end

  # :reek:LongParameterList
  def out(hogea, higea, hagea, hegea)
    puts "#{hogea} #{higea} #{hagea} #{hegea}"
  end

  def out_out(hogeb, higeb, hageb, hegeb)
    print "#{hogeb} #{higeb} #{hageb} #{hegeb}"
  end

  def safe_safe(hogec, higec, hagec)
    print "#{hogec} #{higec} #{hagec}"
  end
end
~~~

Hage, Hoge 双方のクラスが DuplicateMethodCall(メソッドの重複呼び出し)に
引っかかっていますが、 Hige は除外コメントによって警告対象外になっています

~~~ruby

# Hage
#
# Hage です
class Hage
  def test
    sample = 3/2
    sample_sample = 3/2
    sample_sample_sample = 3/2
  end
end

# Hige
#
# Hige です
# :reek:DuplicateMethodCall
class Hige
  def test_test
    sample = 1/2
    sample_sample = 1/2
    sample_sample_sample = 1/2
  end
end
~~~

## <i class='fa fa-image'></i> キャプチャ
![reek_smell1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9f7087cc-c5ae-0883-049a-814093edd2c5.png)
![reek_smell2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f70cf2cc-591b-6515-64a6-3af9b567a9a5.png)

## <i class='fa fa-book'></i> 関連資料
* [troessner/reek - GitHub](https://github.com/troessner/reek)
* [Reek関連記事 - Tbpgr Blog](http://tbpgr.hatenablog.com/archive/category/Reek)
Node.jsをChromeで快適デバッグ

# Node.jsをChromeで快適デバッグ

うまく検索で引っかからないので、ざっくりまとめておく。

- Nodeのv6.3.0以上を使う。
- nodeに--inspect(デバッグする)と--debug-brk(最初に止まる)をつけて起動する。<br>
```
node --inspect --debug-brk hoge.js
```
- [NIM](https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj)を入れる。

## 元ネタ。

- [node-inspectorなしでNode.jsをデバッグする](http://qiita.com/y_fujieda/items/c190cbcc2fab6dd49809)
- [node --inspectの chrome-devtools://... コピペを自動化するChrome拡張を使う](http://qiita.com/onionmk2/items/de8a22d70e2be0b0ff92)
Mac Book の画面回転の恐怖と復旧方法

## TL;DR
Error Message: `Could not load displays preference pane.`
fb-rotate を使う

# 概要
* macOS の隠し設定使うと戻せない恐怖がある。
* 「画面回転は現状使えるものではない[^1]」し戻し方も手間がかかるのでやらないほうがいい。

![IMG_6821.JPG](https://qiita-image-store.s3.amazonaws.com/0/40717/4d0fd257-77a7-04ca-ed53-980923658e7e.jpeg)

# はじまり
　研究室の後輩が"やむを得ない事情"で Mac Book の画面回転をさせたらどうしても戻せなくなったらしく、諦めて Clean Install したという話を聞いた。
　俺は絶対 「defaults あたりの設定で戻せるだろう」と思ったことを話すと、ラボメンからの熱い警告と　**「戻せる自信があるならやってみれば？」** という煽りを受けて挑戦してみた。

OS バージョンは **macOS Sierra 10.12.2**


# 挑戦
そもそも画面回転というのが隠し設定をいじるもので、つまり公式でサポートしているものではない。
手順: `システム環境設定 → command+optionキーを押しながら「ディスプレイ」を開く→ 回転： [ 標準　] を [90° ] に変更` 

実際に起ったことは↓と全く同じ事が起こった。
https://origin-discussions-jp.apple.com/thread/10160710?start=0&tstart=0

画面回転は表示されずすぐに真っ暗になる。

この状態はとりあえず再起動するしかなさそう(?)。

# 症状
* 起動時は正しい向きで起動する。ログインしてプログレスバーが半分超えたときに表示が乱れて縦画面に切り替わる。
* Display の設定を開こうとすると、「Could not load displays preference pane.」と出て開けない。つまり設定からは戻せない。他の設定は開ける。

# 試したこと
## 外部モニタ
とりあえず外部モニタにつなげてみる。
-> 強制終了される。

## defaults read
`defaults read > defaults_xxx.conf` で設定を吐き出して友人のと比べる。
-> Display の設定項目っぽいのは見つけられなかった。
-> 俺、焦りがピークに達する

## systempreferences.plist
`~/Library/Preferences/com.apple.systempreferences.plist` を削除(移動)して再起動。
-> 症状変わらず

-> 俺、.zsh_history とか作業中のリポジトリのブランチをプッシュし始める(保険)。

# 解決策
**fb-rotate** を使った。
https://github.com/CdLbB/fb-rotate

インストールして r オプションに 0 を指定する

```
./fb-rotate -d 0 -r 0
```

SystemPreference の display 設定も正常に開けるようになり、外部ディスプレイ接続も問題なくなり症状がすべて解決する。

## 他にわかったこと(自分の現環境では)
fb-rotate で 0 以外に回転させると、問題手順と同様に **直後に暗転して再起動が必要になる** 。冒頭の「使えるものではない」というのは、これがゆえ。

[^1]: [他にわかったこと参照](#他にわかったこと(自分の現環境では))

(画面回転用の安全なアプリケーションがもしかしたらあるかもしれないです。)

fb-rotate で 0 に戻した時だけは再起動もなく正常の画面方向に治る。


# 最後に
友人の警告には耳を傾けよう。
静的メソッドのコンテキスト内で$thisを使ってメソッドを呼んでみる

下記のコードだとEntryのdoit()がエントリーポイントで、ModelのdoSomething()が呼ばれ、パッと見**Modelのsave()**が呼ばれるように見えるが……

```PHP
<?php

namespace Sample;

class Entry {
    function doit() {
        Model::doSomething();
    }

    public function save() {
        echo __METHOD__;
    }
}

class Model {
    public function doSomething() {
        $this->save();
    }

    public function save() {
        echo __METHOD__;
    }
}

$entry = new Entry();
$entry->doit();


```

```bash
~ $ php -v
PHP 5.6.29 (cli) (built: Dec  9 2016 07:03:56)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

~ $ php -d error_reporting=0 Entry.php
Sample\Entry::save
~ $ php -d error_reporting=0 Entry.php | cowsay
 ____________________
< Sample\Entry::save >
 --------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

~ $ ./echo-sd --stress \  \  Entry「もしかして……」 Model「私たち………」 「「入れ替わってるーーー！！！」」 | tail -n 7
Entry「もしかして……」
　　　　↘
　　　Model「私たち………」
　　　　↙
＿人人人人人人人人人人人人人人人人人人人＿
＞　「「入れ替わってるーーー！！！」」　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣
```

これが言いたいだけだった。（[ネタ元](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72#echo-sd%E3%81%AF%E3%81%93%E3%82%93%E3%81%AA%E3%81%93%E3%81%A8%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%93%E3%81%A7%E3%81%99)）

安心してください。staticキーワードがないメソッドの静的呼び出しで警告は出ます。

```bash
~ $ php Entry.php
PHP Deprecated:  Non-static method Sample\Model::doSomething() should not be called statically, assuming $this from incompatible context in /Users/user1/Entry.php on line 7

Deprecated: Non-static method Sample\Model::doSomething() should not be called statically, assuming $this from incompatible context in /Users/user1/Entry.php on line 7
Sample\Entry::save%
```

PHP7ならそもそも実行できない。

```bash
~ $ brew unlink php56
Unlinking /usr/local/Cellar/php56/5.6.29_5... 17 symlinks removed

~ $ brew link php71
Linking /usr/local/Cellar/php71/7.1.0_11... 39 symlinks created


~ $ php Entry.php
PHP Deprecated:  Non-static method Sample\Model::doSomething() should not be called statically in /Users/user1/Entry.php on line 7

Deprecated: Non-static method Sample\Model::doSomething() should not be called statically in /Users/user1/Entry.php on line 7
PHP Fatal error:  Uncaught Error: Using $this when not in object context in /Users/user1/Entry.php:17
Stack trace:
#0 /Users/user1/Entry.php(7): Sample\Model::doSomething()
#1 /Users/user1/Entry.php(26): Sample\Entry->doit()
#2 {main}
  thrown in /Users/user1/Entry.php on line 17

Fatal error: Uncaught Error: Using $this when not in object context in /Users/user1/Entry.php:17
Stack trace:
#0 /Users/user1/Entry.php(7): Sample\Model::doSomething()
#1 /Users/user1/Entry.php(26): Sample\Entry->doit()
#2 {main}
  thrown in /Users/user1/Entry.php on line 17
```
AndroidでdataBindingを実装する


dataBindingを有効にする

```build.gradle
    dataBinding {
        enabled = true
    }
```

bindingするクラスを追加

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <!-- Userクラスにバインドする -->
        <variable
            name="user"
            type="com.herokuapp.aqueous_spire_22637.test.User"/>
    </data>
<LinearLayout
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.herokuapp.aqueous_spire_22637.test.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="@{String.valueOf(user.id)}"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="@{user.name}"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"/>
</LinearLayout>
</layout>
```

Userクラスを定義して、ObservableFieldを使う

```java:User.java
import android.databinding.ObservableField;
import android.databinding.ObservableInt;

public class User {
    public ObservableInt id = new ObservableInt();
    public ObservableField<String> name = new ObservableField<>();

    public User(Integer idInt, String nameString){
        id.set(idInt);
        name.set(nameString);
    }
}
```

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setUser(new User(1, "joji"));
    }
}
```
Yeomanってどう？その2

# Yeomanってどう？

- Generatorって自由に使えるの？
- yeoman-environmentを使うらしい。
- でも、よくわからない......
- あと、TestAdapterとかあるらしい。

## yeoman-environmentの使い方

こうすると、なんとなく動く。

```javascript
var yeoman = require('yeoman-environment');
var adapter = require('yeoman-test/lib/adapter');

function yo(name, args, opts, answers, callback) {
  // 初期化。args?opts?知らない......
  var env = yeoman.createEnv(args, opts, new adapter.TestAdapter(answers));
  // generatorを探してくる
  env.lookup(function () {
    // 呼び出す。
    env.run(name, {'skip-install': true}, callback);
  });
}
yo('node:readme');

```

## 自前のgeneratorを登録するには

```
var yeoman = require('yeoman-environment');
var adapter = require('yeoman-test/lib/adapter');
var path = require('path');

function yo(name, generator, answers, opts) {
  // 初期化。opts?未調査......
  var env = yeoman.createEnv(name, opts, new adapter.TestAdapter(answers));
  // 自前のgeneratorを登録。nameは、xxx:xxxじゃなくても大丈夫なはず。
  env.register(generator, name);
  // 呼び出す。
  env.run(function () {
    console.log();
  });
}

yo('test',　'generator.js'), answers);
```

## 自前のgeneratorの作り方

```:ディレクトリ構成
generator.js     // 任意の名前
templates/       // 固定。this.templatePathで取得可能。
  _template.js   // 任意の名前
```


```js:generator.js
var yeoman = require('yeoman-generator');

module.exports = yeoman.Base.extend({
  prompting: function () {
    var prompts = [{
      type: 'confirm',
      name: 'someAnswer',
      message: 'Would you like to enable this option?',
      default: true
    }, {
      name: 'moduleName',
      message: 'input moduleName',
      default: 'newName',
    }];

    return this.prompt(prompts).then(function (props) {
      this.props = props;
    }.bind(this));
  },

  writing: function () {
    this.fs.copyTpl(
      this.templatePath('_template.js'),
      this.destinationPath(this.props.moduleName + '.js'),
      this.props
    );
  },
});
```

```js:answers
{
  someAnswer: true,
  moduleName: 'test', 
}
```

## 問題点

- とりあえず、自動ではできそう。
- validateを書いて失敗すると固まったりする？エラーになってくれないのかな？
- promptsを取るというか、answersのキー名の取得が大変。promptを差し込めば行けそうだけど。タイミングがあるのかな？


## 改善点

- generator.promptingをpromptsとdoneに分ける。(doneは、内部で勝手に持てば要らないか。)
- writingも、copyTpl固定にすれば、source/destだけで行ける。
- でも、propsがそのまま、writingに行けるとは限らない。→doneで良しなに変換することができればOKか。

## まとめ

なんか、軽いラッパを作れば、yeomanが使いやすいものにできそう。
よし、先が見えた気がする。
さくらのレンタルサーバーでStaticPressは鬼門

# 前書き

この記事は走り書きな上、解決方法は書いていません。
ただただ、下記にあてはまる条件でどうにかしようとしている人に向けたメッセージです

* さくらのレンタルサーバーを利用
* 共用SSLを有効 (独自ドメインはなし)
* Wordpress + StaticPress を運用したい

そんなあなた、**やめておきなさい**

---

# 現象

StaticPress に限らず、サーバー側 (PHP) で自身のサイトを取得する系 (つまり自サイトに対して file_get_contents とか wget とか curl する感じ) のものは、正しく動かない可能性が高いです。

原因の特定には至りませんでしたが、
例えば `https://example.sakura.ne.jp` という URLの場合、

```php
$body = file_get_contents('https://example.sakura.ne.jp');
```

は、リダイレクトループ (301 Moved Permanently が延々) に陥ります。

翻って、

```php
$body = file_get_contents('https://example.sakura.ne.jp/article/111');
```
とかいうパーマリンクだったら取得できました。

---

# 参考

ということで、**StaticPress を使っても、トップページだけ静的ファイルが作れない現象**にドはまりしました。24時間近く。

参考にしたサイトは下記。さくらのレンタルサーバーにおいてのSSLの扱い方等、参考になります。

* https://webtatan.com/blog/coding/php/file_get_contents_redirect
* https://masshiro.wpblog.jp/sakura-ssl-redirect/

---

# 対応

とっても**アレ**な内容なので話半分に読んで下さい。

404ページがなく、トップページの内容は テーマのindex.php に書いてあるので、StaticPress内にベタで トップページへのリクエストだった場合、 __存在しないパーマリンク__ を呼び出してみることにしました。

(`<title>`なんかも固定なので…)

```class-static_press.php
	private function remote_get($url){
		if (!preg_match('#^https://#i', $url))
			$url = untrailingslashit($this->get_site_url()) . (preg_match('#^/#i', $url) ? $url : "/{$url}");

        // ここから追記
        if ($url == "https://example.sakura.ne.jp/") {
            $url = "https://example.sakura.ne.jp/404"; // こんなページはない
        }

		$response = wp_remote_get($url, $this->remote_get_option);

        if ($url == "https://example.sakura.ne.jp/404") {
            // むりやりレスポンスボディを渡す
            return array(
                'code' => 200,
                'body' => $this->remove_link_tag($response['body'], 200),
            );
        }

		if (is_wp_error($response))
			return false;
		return array(
			'code' => $response['response']['code'],
			'body' => $this->remove_link_tag($response['body'], intval($response['response']['code'])),
			);
	}
```

はー、なんぞこれ…こんな作業したくなかった

ぼやきがてらの注意喚起ということで。
JRubyを使ってAzure IoTHubにメッセージを送信する

Javaの IoT DeviceClient SDK をJRubyで呼び出して， IoTHubにメッセージを送るサンプルです．


### サンプルコード
```ruby
require 'java'

require "./iot-device-client-1.0.17-with-deps.jar"

java_import "com.microsoft.azure.sdk.iot.device.DeviceClient"
java_import "com.microsoft.azure.sdk.iot.device.IotHubClientProtocol"
java_import "com.microsoft.azure.sdk.iot.device.Message"
java_import "com.microsoft.azure.sdk.iot.device.IotHubEventCallback"


class EventCallback
  include IotHubEventCallback
  def execute(status, context)
    # status: IotHubStatusCode
    # context: Object
    puts "Callback #{context} : #{status.to_s}"
  end
end

connection_string = "<接続文字列>"

client = Java::ComMicrosoftAzureSdkIotDevice::DeviceClient.new(connection_string, IotHubClientProtocol::AMQPS)
client.setOption("SetSASTokenExpiryTime", 10)

print "opening..."
client.open()
puts "Done."

require 'json'
10.times do |i|
  puts({"i" => i}.to_json)
  msg = Message.new({"i" => i}.to_json)
  msg.setExpiryTime(5000)
  client.sendEventAsync(msg, EventCallback.new, "ID:#{i}")

  sleep 1
end

print "closing..."
client.close()
puts "Done."
```

### 実行結果

```
pening...Done.
{"i":0}
Callback ID:0 : OK_EMPTY
{"i":1}
Callback ID:1 : OK_EMPTY
{"i":2}
Callback ID:2 : OK_EMPTY
{"i":3}
Callback ID:3 : OK_EMPTY
{"i":4}
Callback ID:4 : OK_EMPTY
{"i":5}
Callback ID:5 : OK_EMPTY
{"i":6}
Callback ID:6 : OK_EMPTY
{"i":7}
Callback ID:7 : OK_EMPTY
{"i":8}
Callback ID:8 : OK_EMPTY
{"i":9}
Callback ID:9 : OK_EMPTY
closing...Done.
```
Zabbix監視で特定のアラートだけを通知OFFにする。

# はじめに
Zabbixの監視アラートで、一時的にアラートを停止したい場合ってありますよね？
例えばDiskアラートが発生した場合など、クリティカルでないので後で対処したい場合など。
そんな場合はトリガーを無効にすれば解決です。一応、備忘録も兼ねて方法を書いてみました。

# 方法
[設定] > [ホスト] をクリックします。
![zabbix01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/cca7a1bd-ca2e-652b-75f2-b2c4ca6d01d6.png)


[対象ホスト] > [トリガー] をクリックします。
![zabbix02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6c2d93cd-b9ff-c2c4-9445-07753382747b.png)

停止したいアラートのステータス欄の [有効] をクリックします。
![zabbix03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/9bea4573-0d98-9f77-1b7e-517299f416da.png)

「トリガーを無効にしました」 が表示され、ステータスが [無効] になれば完了です。
![zabbix04.png](https://qiita-image-store.s3.amazonaws.com/0/82090/e09ead12-9202-d6af-013a-79650d6d8234.png)


# おわりに
Zabbixを普段使っている人であればなんでもない作業だと思います。
でも、普段触れていない人にしてみたら地味にわかりにくいかなと思います。トリガー、アイテムとか。。。
Hololens事始め

どうしても誘惑に負けて個人手配したHololensが本日到着しました。
まずは簡単に試してみるために起動するところと所感をすこし。

# 外観など着け心地
![2017011923033900.jpg](https://qiita-image-store.s3.amazonaws.com/0/152548/15d4e4a3-52b6-579e-4344-daad6d81c09e.jpeg)
Hololens本体は600g弱でかなりずっしりしてます。
あまり長時間すると首が疲れてきます。
頭に取り付ける際にかなりしっかりと固定することはできるので、
ちょっとしたことではずれにくい形になっていました。
ただ、これも長時間つけていると締め付けが。。。

#電源ONから起動まで
電源を入れると、まずは音声入力で「Next」を言えと言われます。
その後、一通りのジェスチャーの使い方などチュートリアルへと進みます。
途中、MSアカウント、WiFi設定など基本的な設定も必要です。

#起動後少し遊んでみた所感
スタートページはWindows 10 Mobileに近い印象でした。
なお、Hololensのcoltana自体は英語版です。
手を閉じてから開くと、スタートメニューが出てきます。いくつかのゲームも
試してみましたが、かなり現実の物体に違和感なく溶け込んでいて今までにない体験。
スピーカーは耳の付近にありますが、かなりはっきりと聞こえかなり臨場感がある印象でした。

##思ったより残念だった点
<dl>
  <dt>・描画エリアが意外と狭い。</dt>
  <dd>あまり視線を外すとウィンドウを見失いことがあります。
</dd>
  <dt>・ジェスチャーが疲れる。</dt>
  <dd>まだ、慣れていないだけかもしれないですが、タップなどは付属のClicker使うほうがいいと思います。</dd>
</dl>
   
##触って感動した点
<dl>
  <dt>・ウインドウを空間に固定すると、その位置にとどまっている。</dt>
  <dd>固定するとその場にウィンドウはとどまっているので、後ろに回ったり斜めからみたりと3次元のマルチウィンドウが楽しめます。</dd>
  <dt>・ウインドウを現実の物体（壁など）に持っていくと張り付く</dt>
  <dd>壁の当たりにウィンドウを移動すると壁に吸い付くように動きます。そのままポスター的になります。あとで戻ってきてもそこにあるので、現実空間と同じ座標系でウィンドウを描画しているようです。</dd>
  <dt>・自分位置とウインドウの間に現実世界の物体（柱など）があるとちゃんとその部分だけウィンドウの描画が遮られる。</dt>
  <dd>視野にある現実世界の物体については常にセンサー類で形状を把握しています。何もない空間をタップすると柱や壁に沿って荒いポリゴンが見えるので視界内の物体は自分の位置からの深度などを数値で持っているようです。</dd>
</dl>

#この後
もう少し一通り動作確認したりした後、実際にHololens用のアプリを何か作りたいとは考えているので、まずは開発環境を整えるところから進めていく予定です。
Chrome Extension のアイコン複数サイズ作るの面倒くさい

Let's 自動化！ ビバシェルスクリプト!!

このシェルスクリプトは `./icons/source.png` から `./icons/16.png`, `./icons/46.png`, `./icons/128.png`の3つのアイコンを生成します。
このスクリプトを実行するには ImageMagick が必要です。

`unsharp`は綺麗にするオプションです。調べてもよくわからないのですが…。

```bash:generate_icons.sh
#!/bin/bash

for size in 16 48 128
do
  convert icons/source.png -resize ${size}x  -unsharp 1.5x1+0.7+0.02 icons/${size}.png
done
```

manifestはこんな感じですかね。

```json:manifest.json_(iconのみ抜粋)
{
  "icons": {
    "16": "icons/16.png",
    "48": "icons/48.png",
    "128": "icons/128.png"
  }
}
```
Apache のログレベルと PHP エラーログの関係

デフォルトでは PHP のエラーは Apache のエラーログ /var/log/httpd/error_log に出力される。
この場合、PHP のエラー出力が Apache の [LogLevel](http://httpd.apache.org/docs/2.4/ja/mod/core.html#loglevel) の設定に影響を受けるのかを検証した。

## 検証環境
* CentOS 7.3.1611 (minimal)
* Apache 2.4.6 (base)
* PHP 5.1.6 (base)

## LogLevel と PHP エラー出力の対応表
`LogLevel` を `error` 以下に設定すると PHP エラーが出力できることを確認した。
なお、デフォルトでは `LogLevel` は `warn` に設定されている。
[error_log](http://php.net/manual/ja/errorfunc.configuration.php#ini.error-log) を設定して Apache のエラーログとは異なるファイルに出力した場合は `LogLevel` の設定の影響を受けない。

LogLevel|出力
--------|:-:
emerg   |×
alert   |×
crit    |×
error   |○
warn    |○
notice  |○
info    |○
debug   |○

## エラー出力レベルと出力内容の対応表
`error_reporting` の設定と実際に出力されるエラー内容を確認した。
Apache の `LogLevel` が `error` 以下であればどの LogLevel でも差はなかった。

エラー|未指定|E_ALL|E_DEPRECATED|E_STRICT|E_NOTICE|E_PARSE|E_WARNING|E_ERROR|
---------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
error_log()          | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
PHP Parse error      | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
PHP Deprecated       |   | ○ | ○ |   |   |   |   |   |
PHP Strict Standards |   | ○ |   | ○ |   |   |   |   |
PHP Notice           | ○ | ○ |   |   | ○ |   |   |   |
PHP Warning          | ○ | ○ |   |   |   |   | ○ |   |
PHP Fatal error      | ○ | ○ |   |   |   |   |   | ○ |

### エラー確認用ソースコード
```php
error_log('error_log()');
```
```php
~                                // PHP Parse error
```
```php
$d =& dir('/');                  // PHP Strict Standards
```
```php
set_magic_quotes_runtime(false); // PHP Deprecated
```
```php
echo $undefined;        // PHP Notice
```
```php
ini_set();                       // PHP Warning
```
```php
undefined();                     // PHP Fatal error
```
htaccessでHTTPSにリダイレクトする

エンジニアたるものhttpは使わないようにしましょう。使う意味がありません。
しかし、世の中にはすでにhttpで運営されてるサイトやAPIがたくさんあります。
そこで今回はすでにhttpだけど、httpsでの運用に切り替えるときに使うhtaccessを書こうと思います。
（検索しても意外と決定版みたいなのないので）

## 単純な場合

これはapacheが1台の構成の場合のものです。特に上流にバランサ(ELBなど)がない場合を想定しています。
下記のような内容で.htaccessを書きましょう。

```/var/www/html/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

このなかでRewriteRuleの最後に書いてある`[R=301,L]`のとこなのですが、`R`がリダイレクトを指しており、`=301`を省略すると`302`がデフォルトになります。
用途に応じて使い分けると良いでしょう。

- `[R=301,L]` 永久的なHTTP→HTTPS
- `[R,L]` 一時的なリダイレクト

## ロードバランサー(80,443対応)の配下にある場合

これはAWS環境でELBがある場合や、その他のプロプライエタリなロードバランサ(LoadMaster、BigIP、Coyote、A10など)の場合に適用できます。もちろんNginxなどのリバースプロキシを使う場合も有効です。
基本的には上流のバランサーにHTTP／HTTPSに応じてリクエストヘッダーを付与してもらいます。
apacheではその内容に応じた`RewriteCond`を記述します。

例えばAWS環境のELBの場合は下記のようになります。

```/var/www/html/.htaccess
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

2行目の`RewriteCond`はHTTPだった場合に付加されるリクエストヘッダーを想定しています。これは製品によって異なりますが、`%{HTTP:X-Forwarded-Proto}`はAWSのELBの標準的なリクエストヘッダーです。

## まとめ

apacheでやる限りだいたい上記の2パターンで事が足りるでしょう。もし細かく制御したいケースやご要望などあれば追記しますので、コメントなどでどうぞ。
Windows10 アップデート後Apacheがダウン KB890830 KB3213986

#再起動後に毎回おかしなことがおきるWindows10ちゃん！

今回はApacheが起動していない現象が発生。

原因はこの謎のPID:4が80番ポートを専有していること。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/6b1b1fb4-4321-e59c-334f-3c8bb45adb62.png)

ぐぐってみると、「[Windows10にアップグレードしたらApache起動しなくなったので対策に乗り出したっていう話](http://thk.kanzae.net/net/windows/t1846/)」という、今回と全く同じような現象がみつかりました。

やはり、こちらの環境でもIISが起動していました。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/aedf5542-29ff-2c19-b1d7-6519036c1aea.png)

即刻チェックを外して再起動です。
Gitkrakenのインストール手順

#Gitkrakenのインストール手順

##はじめに

###▼この記事で分かること
この記事ではGitのGUIクライアントツールである
gitkrakenのインストール手順をまとめています**(2017/01/19現在)**。
※Git自体のダウンロードについては割愛しています。

###▼Gitkraken?
![icon.jpg](https://qiita-image-store.s3.amazonaws.com/0/66429/0dba40a4-1908-76ec-df0c-66bffe69029a.jpeg)
Ω「これ、スプラトゥーン？」 
Ω「いいえ、Gitkrakeeeeeeeeenです(ちがう)」

冒頭で軽くふれていますが、GitkrakenはGitのGUIクライアントツールの1つです。
本家様のリリースノートを見ると「2016/3/29」にVersion 1.0.0がリリースされており、
Gitのクライアントツールとしては後発の部類に入ることになります。

本記事作成中ではVersion 1.9.3がリリースされていました。

##Gitkrakenのインストール
では、さっそくインストール方法の説明に入ります。

###▼Step1
下記のダウンロードページからインストーラーをダウンロードしてください。
今回はWindouws7を対象として以降の話を進めていきます。
ダウンロードが済んだら、インストーラーを実行してください。
[Gitkraken]https://www.gitkraken.com/

###▼Step2
インストーラーが終了するとGitkrakenが起動します。
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/66429/25234c00-e78b-e43a-babe-8e0cfd3955b2.jpeg)

###▼Step3
Gitkrakenを使用するにはアカウントの作成が必要になります。
先の画像にある「Create a GitKraken Account」をクリックしてアカウント作成に入りましょう。
次の画像のように進むので、必要な情報を入力し利用許諾に問題がなければチェックを入れ、
「Create a GitKraken Account」をクリックしてください。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/66429/66913640-fea4-2cbf-8eb3-d4feddffb1df.jpeg)

すると以下の画像のように表示されるので、メールアドレスの認証を済ませましょう。
一旦画面から離れ、メールボックスにメールが届いているか確認しに行ってください。
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/66429/1ddc720f-28a8-ae87-47d6-62abea405fb6.jpeg)

下のような画像の認証メールが送られていると思います。
「Click here」と書かれた箇所をクリックしてください。
メールアドレスの認証が済み「Thank You!」と書かれたページに遷移すると思います。
※遷移したページではインベーダーゲームで遊べます(笑
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/66429/5c5bfcd3-ee34-77cd-3542-39c71f576d6b.jpeg)

###▼Step4
メールアドレスの認証が済んだら、Gitkrakenの画面にもどりましょう。
「Success!」と書かれたダイアログが表示されたままでしたら、
「Use GitKraken」と書かれたボタンをクリックしてください。
そして、画面左下に出ている「10 Days to Activate」というボタンもクリックしましょう。

これでインストール自体は終了です。

##GitHubとの連携について
別記事にて記載しております～くコ:彡
[GitkrakenとGitHubとの連携手順](http://qiita.com/electric_Sheep/items/7032c2a339abc2134f5f)
Mysqlのパスワードを再取得する

Mysqlのrootパスワードしたんけど、そんなパスワードを忘れちゃったことがありますか？
僕は何回もそんなことになっていました。:sweat:
グーグルで検索してrootのパスワードの再設定方法を見つけました。今から共有します。

CentOSで下記の流れのとおりにします。
- mysqlのプロセスをストップする

```
/etc/rc.d/init.d/mysqld  stop
```

- `mysqld_safe`を走る

`mysqld_safe`についてもっと知りたかったら、下記んおリンクを参照してください。
https://dev.mysql.com/doc/refman/5.6/en/mysqld-safe.html

```
mysqld_safe --skip-grant-tables &
```

- mysql にログインする

```
mysql -u root
```

`-p`オプションは必要ないです。

- rootユーザーに新パスワードを設定する

```
use mysql;
update user set password=PASSWORD("NEW-ROOT-PASSWORD") where User='root';
```

- ユーザーの権限をリロードする

```
flush privileges;
```

- mysqlプロセスを再起動する

```
/etc/rc.d/init.d/mysqld start
```

- mysqlのコンソルを引き払って　mysqlにもう一度ログインしてみる

```
mysql -u root -p
```

その後、設定したばっかの新パスワードを入力してみます。

上記はmysqlのrootユーザーのパスワードを再設定する方法です。
僕の場合は成功しました。
もし同じ問題に会ったらこの方法で設定してみてください。:v:
CentOS で PHP のエラーログが出力されない

## error_log
デフォルトでは PHP のエラーログは Apache のエラーログ /var/log/httpd/error_log に出力される。
PHP の ini ファイルで [error_log](http://php.net/manual/ja/errorfunc.configuration.php#ini.error-log) に値を指定するとそちらにエラーログが記録されることになっているが、CentOS のデフォルト状態ではそれだけでは出力されない。

```ini:php.ini
error_log = /var/log/php_error.log
```

## よく見かける対策
「[php.ini で設定しても出力されないエラーログをちゃんと出すポイント！ – oki2a24](http://oki2a24.com/2013/02/13/set-php-error-log/)」などで記載されている対策が、`touch` コマンドでのファイルの作成と `chown` コマンドでの所有権の変更だ。
ただし、CentOS のデフォルトの状態ではこれでも出力されない。

```bash
touch /var/log/php_error.log
```
```bash
chown apache:apache /var/log/php_error.log
```

## もう一つ必要な対応
実はデフォルトで有効になっている SELinux のせいで出力されない。
以下のコマンドで /var/log/httpd/error_log と同等のコンテクストを設定する。

```bash
chcon -t httpd_log_t /var/log/php_error.log
```

これで無事エラーログが出力されるようになる。
`error_log` で指定したログファイルにエラーログが出力されるようになると、Apache のログには出力されなくなる。

## まとめ
以下のコマンドが必要。

```bash
touch /var/log/php_error.log
chcon -t httpd_log_t /var/log/php_error.log
chown apache. /var/log/php_error.log
chmod 600 /var/log/php_error.log
```

## ログの例
Apache のエラーログと PHP のエラーログでは、メッセージ内容は同等だが日付等の表記が異なる。

### Apache エラーログ
```
[Thu Jan 19 21:25:09.225123 2017] [:error] [pid 10594] [client 192.168.56.1:50552] PHP Notice:  Undefined variable: undefinedVariables in /var/www/html/index.php on line 4
[Thu Jan 19 21:25:09.225182 2017] [:error] [pid 10594] [client 192.168.56.1:50552] PHP Deprecated:  Function set_magic_quotes_runtime() is deprecated in /var/www/html/index.php on line 5
[Thu Jan 19 21:25:09.225194 2017] [:error] [pid 10594] [client 192.168.56.1:50552] PHP Warning:  ini_set() expects exactly 2 parameters, 0 given in /var/www/html/index.php on line 6
[Thu Jan 19 21:25:09.225202 2017] [:error] [pid 10594] [client 192.168.56.1:50552] PHP Fatal error:  Call to undefined function undefined() in /var/www/html/index.php on line 7
```
### PHP エラーログ
```
[19-Jan-2017 21:51:14 Asia/Tokyo] PHP Notice:  Undefined variable: undefinedVariables in /var/www/html/index.php on line 4
[19-Jan-2017 21:51:14 Asia/Tokyo] PHP Deprecated:  Function set_magic_quotes_runtime() is deprecated in /var/www/html/index.php on line 5
[19-Jan-2017 21:51:14 Asia/Tokyo] PHP Warning:  ini_set() expects exactly 2 parameters, 0 given in /var/www/html/index.php on line 6
[19-Jan-2017 21:51:14 Asia/Tokyo] PHP Fatal error:  Call to undefined function undefined() in /var/www/html/index.php on line 7
```
td-agent 3 beta をWindowsで試してみた

# td-agent 3 のbetaがリリースされたので、Windowsから試してみました
## 検証環境は以下の通りです。
![image](https://qiita-image-store.s3.amazonaws.com/0/33070/30f7e1a0-a53b-dce3-e5a9-feecbd05bb4a.png)



# Treasure Agent 3 has beed released!
https://groups.google.com/forum/?utm_content=buffera5143&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer#!msg/fluentd/sxwka_X_viQ/PsQMFWXYCAAJ

# Windows版を試す
td-agent 3はWindowsをサポートしているので、早速試してみました！
まずは公式ガイドに沿って導入してみます。
http://docs.fluentd.org/v0.14/articles/install-by-msi

## Step1: Install td-agent
リンクからインストーラーをダウンロードします。
https://td-agent-package-browser.herokuapp.com/3/windows


![image](https://qiita-image-store.s3.amazonaws.com/0/33070/9216bcbf-c996-a870-604b-8c06243703ee.png)
インストーラーを実行します

![image](https://qiita-image-store.s3.amazonaws.com/0/33070/e5f58de0-cf82-7884-46d8-713421a4534a.png)
デフォルトだと、C:\opt\にインストールされるようです

![image](https://qiita-image-store.s3.amazonaws.com/0/33070/a80301cd-53f4-b8a9-9433-b0412f4f2a83.png)
スムーズにインストールされました！

## Step2: Run td-agent from Command Prompt
テスト用のコンフィグを準備して、以下の名前で保存します。
c:\opt\td-agent\conf\td-agent.conf

```
<source>
  @type forward
</source>
<match test.**>
  @type stdout
</match>
```

[スタートメニュー][すべてのプログラム][Td-agent][Td-agent Command Prompt]を起動します。

```
> fluentd -c conf\td-agent.conf
```
Td-agent Command Promptから、メッセージを送ります。

```
> echo {"message":"hello"} | fluent-cat test.event
```

![image](https://qiita-image-store.s3.amazonaws.com/0/33070/ec6a682f-a409-5659-72fe-0d76f6b77bf4.png)

動きました！

## Step3: Register td-agent to Windows service
サービスへの登録は以前と同じコマンドでした。

```
> fluentd --reg-winsvc i
> fluentd --reg-winsvc-fluentdopt '-c C:/opt/td-agent/conf/td-agent.conf -o C:/opt/td-agent/td-agent.log'
```
※管理者権限でTd-agent Command Promptを起動しないと権限のエラー「Input/Output error - OpenSCManager: Access is denied.」が出ました。
![image](https://qiita-image-store.s3.amazonaws.com/0/33070/72a7c140-dbc1-85c9-3da0-391f66f85ad8.png)

※既にfluentdがサービスに登録されている場合は、「The specified service already exists.」が出ます。
私の環境には以前にインストールしていたため、出力されてしまいました。
![image](https://qiita-image-store.s3.amazonaws.com/0/33070/f9934629-5a21-550d-a872-bd329e4019c5.png)

この場合は、以下の手順で一度サービスから削除した後に再度登録を行うことで登録できました。

```
> fluentd --reg-winsvc u
> fluentd --reg-winsvc i
```

## Step4: Run td-agent as Windows service
ここではサービスからFluentd Windows Serviceを選択し、自動起動にしたり、サービスを開始します。
![image](https://qiita-image-store.s3.amazonaws.com/0/33070/e8084c10-efc0-b02a-ef95-a7784a5dc09d.png)

## Step5: Install Plugins
あとは好きなプラグインを入れて使いましょう！


# まとめ
今までWindowsでfluentdを動かす場合は、rubyやgitをインストールしたり、fluentdをコンパイルしたりといろいろ面倒でしたが、驚くほど簡単に使えるようになり感動しました！
試すだけではなく、しっかり使って何かしらコミュニティにフィードバックできればと思っています。
PowerShellの便利なワンライナー

# PowerShellの便利なワンライナー

※自分用まとめです。


- 作成日時変更[^TS]

``` PowerShell
powershell -Command Set-ItemProperty C:\hoge.txt; -name CreationTime -value '2015/12/29 01:23:45'
```

- 更新日時変更[^TS]

``` PowerShell
powershell -Command Set-ItemProperty C:\hoge.txt; -name LastWriteTime -value '2015/12/29 01:23:45'
```

- サービスのプロセスIDを取得する[^PID]

``` PowerShell
$ID = (Get-Wmiobject Win32_Service | ? { $_.Name -eq $ServiceName }).ProcessID
```


## 参考用URL

[^TS]: [引用元：Windows、ファイルのタイムスタンプ（作成日時、更新日時）を変更する2（前の記事の改訂版）](http://piyopiyocs.blog115.fc2.com/blog-entry-1012.html)
[^PID]: [落ちないサービスの止め方](http://www.vwnet.jp/Windows/PowerShell/KillService.htm)
目的のクエリパラメタの値を取得するコード

#目的のクエリパラメタの値を取得する

目的のGETパラメタの値を取得するためのJavaScriptコード

```js:
(function(q){
  var ret, param;
  var s = document.location.search;
  if(!!s){
    param = s.substring(1).split('&');
    for(var i=0,len=param.length; i<len; i++){
      if(!param[i].indexOf(q+'=')){
        ret = param[i].split('=')[1];
        break;
      } 
    }
  }
  return ret;
})('id'); /*欲しいGETパラメタの変数名をカッコの中に入力する*/
```
上記コードは`id`という名前のGETパラメタがURLに含まれるとき、その値を出力する。

例えば、サイトのURLが

```
hoge.com?qt=test&id=2394&ref=hoga
```

のとき、`id=2394`なので2394を返す。
`id`がGETパラメタに存在しないときは`undefind`が返ってくる。

URLに同じ名前のパラメタが2つ含まれるとき、このコードは一番前方で見つかったパラメタの値を返す。

例えば、サイトのURLが

```
hoge.com?qt=test&id=2394&ref=hoga&id=5555&id=0011
```
のときも2394を返す。

違うGETパラメタの値を取得したいときは、一番最後の行の`id`部分を変更すればOK

例えば、`utm_source`というパラメータの値を取得したいときは、一番最後の行を

```
})('utm_source');
```
と変えればOK



## ひとりごと
`Array.prototype.forEach.call`で短く書きたかったけど、

- 処理速度的にメリットが無い
- 非エンジニアに説明し辛くなる

と、良い事なさそうなのでボツ。最終的に上記のコードに落ち着いた。

[Googleタグマネージャ](https://www.google.com/intl/ja/tagmanager/)でクエリパラメタを取得するときは既存の機能で対応できるので、このコードは不要。

![image](https://qiita-image-store.s3.amazonaws.com/0/103957/22888402-c7e5-3dea-9ce8-3c5c14c74656.png)


**完**
Yeomanってどう？その1

# Yeomanってどう？

- ソースの自動生成をしてみたい。
- Eclipseだと、ソースの追加とかできるよね。
- 便利そうなんだけど？
- いまいち使われていなくない？
- なんか、軽く使うのは面倒見たい。
- 自分で作る？

## Generatorとして欲しい要件をまとめてみる。

- さくっと作りたい。スクリプト(Json定義？)＋テンプレート＋コピー処理。
- 毎回コンソールでうたないといけないのが邪魔。yo name hoge hogeで作りたい。

## でも、その前にYeomanを調べてみよう！

yeoman-environment@1.6.6に基づきます。

## generatorの検索の仕方は？

yeoman-environmentをローカルに入れると、このような構成になっている。

```
/foo/bar
 node_modules/yeoman-environment/lib
 .package.json
```

そこで、lib/resolver.jsの人は、以下の順序でディレクトリを検索する。

```:getNpmPaths
${NVM_PATH}/node_modules
${NODE_PATH}
${__dirname}/../../../../ => /foo(よくわからないが.....)
${__dirname}/../../       => /foo/bar/node_modules(ローカルのところ)
${APPDATA}/npm/node_modules(グローバルのところ:Windows)
/usr/lib/node_modules(グローバル:Unix)
/usr/local/lib/node_modules(グローバル:Unix)
カレントディレクトリまでのすべてのnode_modules
```

次に、そのディレクトリに、以下のディレクトリを探す。

```js:findGeneratorsIn
generator-*
```

さらに、以下のファイルを探す。

```
${dir}/*/index.js
${dir}/generators/*/index.js
${dir}/generators/lib/*/index.js
```

## まとめ

ざっくりまとめると、以下のところにおいておけば、インストールしなくても見つけてくれる。
/foo/bar/node_modules下においてもいいけど、そこだと、npmが動かなくなることがあるのでやめたい。
つまり、上位階層でgenerator-xxxを作って(/foo/generator-*)、yo generatorで作るのが楽である。
でも、yo generatorって、npmのチェックをしに行くのよね......

```
/foo
  bar(←ここで作っている)
  generator-*/*/index.js
  generator-*/generators/*/index.js
  generator-*/generators/lib/*/index.js
```
pandasのDataFrameで.locと.ilocを同時に参照する

# .ixは非推奨に

pandasのDataFrameを参照する際に何かと便利な`.ix`ですが、理解していないと罠にはまります。  

例えば下記のようなDataFrameがあったとします。

```python
from pandas import DataFrame

df = DataFrame(
    [['a0', 'b0'], ['a1', 'b1'], ['a2', 'b2']],
    index=[2, 4, 6],
    columns=['a', 'b'])
```
<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>a</th>      <th>b</th>    </tr>  </thead>  <tbody>    <tr>      <th>2</th>      <td>a0</td>      <td>b0</td>    </tr>    <tr>      <th>4</th>      <td>a1</td>      <td>b1</td>    </tr>    <tr>      <th>6</th>      <td>a2</td>      <td>b2</td>    </tr>  </tbody></table>

ここで`2番目(0から開始して)の行`の`a列`を参照したい場合、どのようにすればよいでしょうか？期待する結果は`a2`です。  
`.ix`は順序もインデックスも受け付けるので、下記のように参照すると・・・

```python
df.ix[2, 'a']
```

結果は`a0`が返ってきます。  
これは`.ix`で数値を与えた場合の参照がインデックスが存在する場合にはインデックスを、インデックスに存在しない場合は順序を見に行っているからです。  

このように`.ix`の参照には曖昧さがあるため、pandasのバージョン0.20では非推奨となるようです。

# 順序とインデックス名を同時に参照するには

ベストな解ではないかもしれませんが、`.iloc`による参照をしてみます。
ただし、これでは順序による参照しかできないため、[pandas.Index.get_loc](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.get_loc.html)を併用します。
これは行名(または列名)を検索し順序を返すメソッドです。  

```python
df.iloc[2, df.columns.get_loc('a')]
```

期待する結果である`a2`が返ってくるようになりました。

上記の例では列名を指定していましが、行の名前を指定する場合には下記のようにします。

```python
df.iloc[df.index.get_loc(6), 0]
```

行と列の名前が事前にわかっている場合は普通に`.loc`を使えば問題ありません。

```python
df.loc[6, 'a']
```

同様に、行と列の順序が事前にわかっている場合は`.iloc`で大丈夫です。

```python
df.iloc[2, 0]
```

# まとめ
`.ix`の挙動を理解していないと意図しない動作をします。
例え挙動を理解していても、インデックスの中身を把握している必要があるため、`.ix`を使用するのは極力避けた方がよさそうです。
PHP PSR一覧 2017年版

# [PHP Standards Recommendations](http://www.php-fig.org/psr/)

2017/01/20現在、18個のPSRが存在します。
内訳は8個がACCEPTED、1個がREVIEW、8個がDRAFT、1個がDEPRECATEDとなっています。
以下の日付は決定した日ではなく、変更がcommitされた日です。


# ACCEPTED

## PSR-1 [Basic Coding Standard](http://qiita.com/katsukii/items/e68183f14407722de9cc#psr-1)
2012/03/24に提出、2012/06/05に受理。
最低限準拠すべき基本的なコーディング規約を規定している。
BOM無しUTF-8にしろとか勝手にechoやini_setするなとかレベルなので本当に超絶基礎的。

## PSR-2 [Coding Style Guide](http://qiita.com/katsukii/items/e68183f14407722de9cc#psr-2)
2012/05/04に提出、2012/06/05に受理。
いわゆるコーディング規約、およびコーディングスタイル規約。
後継のPSR-12が提出中。

## PSR-3 Logger Interface
2012/11/29に提出、2013/01/06に受理。
ロギング処理の標準化。

## PSR-4 [Autoloading Standard](http://qiita.com/inouet/items/0208237629496070bbd4)
2013/05/07に提出、2013/12/04に受理。
オートローディングの仕様で、PSR-0の上位版。

## PSR-6 [Caching Interface](http://qiita.com/rana_kualu/items/b37c226363f3015951b6)
2012/02/25に提出、2015/12/11に受理。
キャッシュ処理の標準化。
検索結果などを保持しておいたりとか。

## PSR-7 [HTTP Message Interface](http://qiita.com/asaokamei/items/b86e384867bcf0379cea)
2013/01/01に提出、2015/05/19に受理。
HTTPリクエストとリスポンスの標準仕様。
`$_REQUEST`に`$_SERVER`、`$_FILES`などの入力はRequestInterfaceから受け取り、出力はResponseInterfaceに突っ込めば万事OK、的な運用。

## PSR-13 Hypermedia Links
2015/10/28に提出、2016/11/16に受理。
異なる種類のメディアでデータを受け渡す方法の標準化だと思うのだがよくわからん。
HTMLとJSONとMathMLでやりとりできるとかそんなん？

## PSR-16 [Simple Cache](http://qiita.com/rana_kualu/items/f25ab973b975a274b151)
2016/05/30に提出、2017/01/01に受理。
キャッシュ処理の標準化で、PSR-6とほとんど同じなんだけど、より単純で機能が少ないぶん簡単に使えるらしい。


# REVIEW

## PSR-11 [Container Interface](http://qiita.com/rana_kualu/items/a45829de16380af5acd0)
2015/04/01に提出。
DIコンテナの標準化。

# DRAFT

## PSR-5 [PHPDoc Standard](http://qiita.com/rana_kualu/items/8b2d9d42b81e9f6f0fd1)
2013/08/06に提出。
@param、@returnなどコメントのフォーマットを規定している。
だいたいphpDocumentor2。

## PSR-8 Huggable Interface
2014/02/23に提出。4月1日ではない。
こいつの意味は未だにわからない。
開発者同士仲良くしようぜっていういい話でいいんだろうか。
実際は[そうそううまくはいかない](https://groups.google.com/d/msg/php-fig/YvHARo5G1w4/UN1c8L9yAQAJ)みたいですが。

## PSR-9 Security Advisories
2014/11/05に提出。
セキュリティ問題対策のうち、開発者に向けての告知。
フォーマットを取り決め、必要な情報を揃えやすくするような作りになっている。

## PSR-10 Security Reporting Process
2015/02/09にPSR-9から分割。
セキュリティ問題対策のうち、使用するユーザ側に向けての告知。
詳細な項目とかはなくて、方針みたいなのしか書いてないっぽい。

## PSR-12 [Extended Coding Style Guide](http://qiita.com/rana_kualu/items/28f169bb3eadc6f9e3f3)
2015/08/23に提出。
PSR-2の置き換えを目指した新たなコーディングスタイル規約。
主にPHP7への対応となる。

## PSR-14 [Event Manager](http://qiita.com/rana_kualu/items/aa60378265d802051397)
2016/03/18に提出。
PHPにイベント駆動型の仕組みを提供する。
Observerパターン。

## PSR-15 HTTP Middlewares
2016/05/10に提出。
HTTPミドルウェアの標準化。
Laravelで使われてるみたいなやつ。

## PSR-17 HTTP Factories
2016/05/24に提出。
PSR-7互換のリクエスト/レスポンスオブジェクトを作成するファクトリ。


# DEPRECATED

## PSR-0 Autoloading Standard

2010/11/05より前に提出・受理、2014/10/08に廃棄。
オートローディングを自動化するための仕組み。
上位版のPSR-4が受理されたため廃棄された。

# まとめ

コーディング規約がありInterfaceがありただの指針もありと、わりかしまとまりがない。
あまり知らないPSRは適当な紹介なので間違ってるところがあるかもしれない。
DjangoでGETリクエストのクエリパラメータを取得


# 目的
- 自分向け備忘録。
- GETリクエストのパラメータを取得する方法を整理


本質的に正しいかは知らないけれども、ひとまずこれで取れる。


# 取得方法


http://~~~~~~~~~~~?query_param=AAA 
と指定された時の **query_paramの値** を取得する。

```python:クエリパラメータの取得
from rest_framework.views import APIView

class SampleView(APIView):

	def get(self, request):
		if "query_param" in request.GET:
			# query_paramが指定されている場合の処理
			param_value = request.GET.get("query_param")
		else:
			# query_paramが指定されていない場合の処理
```

一応値が存在するかはチェックしたほうが行儀が良い。


# 補足

get()では、キーに対応する値が存在しない場合に、
デフォルトの値を指定することができるらしい。

こんな感じ??

```python:getにおけるデフォルトの値の指定
param_value = request.GET.get(key="query_param", default="hogehoge")
```



# 参考

http://docs.djangoproject.jp/en/latest/ref/request-response.html