OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxのコマンドラインやスクリプトからスマホにプッシュ通知する。（ntfyというツールの紹介）

[ntfy](http://ntfy.readthedocs.io)が便利だったので紹介します。

ntfyを使うと、Linuxのコマンドラインやスクリプトからさまざまなアプリへ簡単にプッシュ通知を送信することができます。Pythonで書かれています。いろいろサポートしていますが、僕が試してみたのは下記の３つ：

- [Pushover](https://pushover.net/) (便利ですがアプリが500円ほどします。この価格で安心が買えるなら安いですかね。)
- [slack](https://slack.com) (チームでslackを使ってるなら便利だと思います。)
- [Pushbullet](https://www.pushbullet.com/) (Chromeブラウザのアプリは使えますが、今のところスマホのアプリはイマイチでした。)

結果的にPushoverが必要十分だったので、僕はPushoverを使っています。

## インストール

pipで簡単にインストールできます。

```
pip install ntfy

# slackを使う場合
pip install ntfy[slack]
```

## `~/.ntfy.yml`を準備する

お使いになるアプリの設定画面から`token`や`user_key`を取得して`~/.ntfy.yml`に下記のような感じで書き込みます。

```
---
backends:
    - pushover
    - slack
    - pushbullet
pushover:
    user_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
slack:
    token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    recipient: "#general"
pushbullet:
    access_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

## 使ってみる

```
# 単純にプッシュ通知する
ntfy -t 'Test' send "This is a test."

# コマンドが終了したら通知する(例：sleepコマンド)
ntfy done sleep 10
```
設定がうまく行っていればアプリに通知が届きます。（`-t`オプションはメッセージのタイトルです。）

## pythonのコードから使ってみる(例: Pushover)

```
>>> import ntfy
>>> ntfy.backends.pushover.notify(title="Test", message="This is a test.", user_key="XXXXXXXXXXXXXXXXXXXX")
```

- [ntfy - Python Module Index](http://ntfy.readthedocs.io/en/latest/py-modindex.html)

## 感想

障害アラートや時間のかかるバッチジョブの実行に便利です。
再帰的にバイナリを strip する

指定したディレクトリの中のバイナリファイルをすべて strip する。

```sh
find /path/to/dir -type f -print0 | sudo xargs -0 sh -c '
  for f in "$@"; do
    if file -bi "$f" | grep -E "^application/(x-executable|x-sharedlib|x-archive)" >/dev/null; then
      echo "$f"
      strip -p "$f"
    fi
  done
' --
```
AWS CertificateManager で サブドメイン の ワイルドカード証明書 も取得する

# 概要
AWS Certificate Manager で サブドメインのワイルドカード証明書も取得する

# はじめに

SSL/TLS 証明書は、今まで、Ra◯idSSL 等の「証明書発行業者」から取得していました。
その際、Webサイトが複数必要な場合は、「ワイルドカード証明書」を申請していましたが、以下のような問題がありました。

 - 結構お高い。年間 39,000円 程度。
 - サブドメインは有効でない。(一階層のみ有効)  
例えば、 *.k2s.io の証明書を取得した場合、
   - mail.k2s.io は有効
   - line.k2s.io は有効
   - A.line.k2s.io は、使えない！！
   - B.line.k2s.io は、使えない！！

AWS CertificateManager サービス によって、 ELB, CloudFront での用途に限り、SSL/TLS 証明書 を**無料**で取得することが可能になっています。
(注 : CloudFront での使用は 東京リージョンは 2016/09/22 時点ではまだ未対応)

サブドメイン毎のワイルドカード証明書も、**もちろん無料**で、取得できますよね？ はい、できます！

※本記事のドメインは架空です

# 手順

```k2s.io``` のドメイン管理者である場合を例にします。

```*.k2s.io``` の SSL/TLS 証明書は取得済みで、追加で、```*.line.k2s.io``` を取得する場合を考えます。


手順は特に難しくありませんが、気をつけることは

 - AWS マネジメントコンソールからの申請時に、サブドメイン ```line.k2s.io``` の webmaster, postmaster 宛に 確認メールが送られてくるので、受信できるようにしておく必要があります。
   - DNS (例: Route53) で、サブドメイン に対して MX レコード が設定されていること。
   - MTA (例: Postfix) で、サブドメイン に対して 受信できるように設定されていること。

        ```:/etc/postfix/main.cf
myhostname = mail.k2s.io
myhostname = line.k2s.io        ← ここ
```

 - 確認メールに対して承認すると、無事に、サブドメインのワイルドカード証明書が使えるようになります。

![スクリーンショット_2016-09-22_11_53_53.png](https://qiita-image-store.s3.amazonaws.com/0/69410/e4421258-babc-5a05-15b8-076764c69123.png)


# まとめ
 - AWS CertificateManager では、サブドメインのワイルドカード証明書も取得できました。
 - これで今まで、無理矢理に一階層のドメインで頑張ってきた部分を、キレイに階層化できますね！！
R > データ構造 > データフレーム > 構造確認 > str()

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```
 
R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

str()で構造が分かるようだ。

```R
> o<-data.frame(w<-0:2, x<-1:3, y<-3:1, z<-5:3)
> nrow(o)
[1] 3
> ncol(o)
[1] 4
> o
  w....0.2 x....1.3 y....3.1 z....5.3
1        0        1        3        5
2        1        2        2        4
3        2        3        1        3
> str(o)
'data.frame':	3 obs. of  4 variables:
 $ w....0.2: int  0 1 2
 $ x....1.3: int  1 2 3
 $ y....3.1: int  3 2 1
 $ z....5.3: int  5 4 3
```
R > データ構造 > データフレーム > nrow(x) / ncol(x)

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

nrow()とncol()で行と列の数を数えられる。

以下の例を考えた。

```R
> o<-data.frame(w<-0:2, x<-1:3, y<-3:1, z<-5:3)
> nrow(o)
[1] 3
> ncol(o)
[1] 4
> o
  w....0.2 x....1.3 y....3.1 z....5.3
1        0        1        3        5
2        1        2        2        4
3        2        3        1        3
```
R > データ構造 > データフレーム > 作ってみる

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

data.frame()を使って「データフレーム」オブジェクトを作る例がある。

例を考えてみた。

```R
> x<-data.frame(Idx=1:3, Name=c("Tuvok","7of9","Janeway"))
> x
  Idx    Name
1   1   Tuvok
2   2    7of9
3   3 Janeway
```
R > データ構造 > データフレーム > Sleepオブジェクト / summary()

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

p42
> データフレーム
> Rでもっとも重要なデータ構造です。...Sleepオブジェクトを取り上げます。

```R
> head(sleep)
  extra group ID
1   0.7     1  1
2  -1.6     1  2
3  -0.2     1  3
4  -1.2     1  4
5  -0.1     1  5
6   3.4     1  6
> summary(sleep)
     extra        group        ID   
 Min.   :-1.600   1:10   1      :2  
 1st Qu.:-0.025   2:10   2      :2  
 Median : 0.950          3      :2  
 Mean   : 1.540          4      :2  
 3rd Qu.: 3.400          5      :2  
 Max.   : 5.500          6      :2  
                         (Other):8  
> sleep$extra
 [1]  0.7 -1.6 -0.2 -1.2 -0.1  3.4  3.7  0.8  0.0  2.0  1.9
[12]  0.8  1.1  0.1 -0.1  4.4  5.5  1.6  4.6  3.4
> sleep$group
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
Levels: 1 2
> sleep$ID
 [1] 1  2  3  4  5  6  7  8  9  10 1  2  3  4  5  6  7  8  9 
[20] 10
Levels: 1 2 3 4 5 6 7 8 9 10
```
R > which(x %in% c("zun","doko")) > 要素が"zun"か"doko"であるものを探す

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

`%in%`を使って、複数の要素のいずれかに対応するか確認できるようだ。

例題を考えてみた。

```R
> x<-c("zun","doko","hoi")
> which(x %in% c("zun","doko"))
[1] 1 2
```

要素1と2が見つかる。
R > TRUEは1, FALSEは0 > sum(x) > TRUEの数をかぞえる

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

TRUEは1として、sum(x)でTRUEの数を数えることができるようだ。

例題を作ってみた。

```R
> x<-1:5
> y<-sample(x,10,rep=T)
> sum(y %% 2 == 0)
[1] 5
> y
 [1] 4 4 2 5 1 4 3 3 1 4
```

偶数の数を数えている。
4,4,2,4,4
R > 剰余 > %でなく%%

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703


参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん

剰余は`%%`を使うようだ。

```R
> 5 %% 2
[1] 1
> 5 % 2
Error: unexpected input in "5 % 2" 
```
git > tags > "^{}"付のもの

```txt:動作環境
bitbucket
SourceTreeのターミナル
Windows 7 pro
```

SourceTreeのターミナルにおいてbitbucketのリポジトリのタグ整理をしていた。

`git ls-remote --tags`コマンドを実行していて`^{}`付のタグがあることに気づいた。
それは何かというとstackoverflowに記載があった。
http://stackoverflow.com/questions/15472107/when-listing-git-ls-remote-why-theres-after-the-tag-name

> answered Mar 18 '13 at 8:19
Tuxdude

の記載が詳しい。
timeout と tail で１秒間のリアルタイムなログを集計する

- CentOS 7.2.1511
- bash 4.2.46
- coreutils 8.22

例えば、急にものすごいアクセス数が増えていて、１秒間のリアルタイムなログを集計したいときとか。

次のようにすれば Apache のアクセスログから IP アドレスで集計した結果を得られます。

```sh
cat access_log | awk '{print $1}' | sort | uniq -c | sort -rn
```

リアルタイムに書き込まれたログを表示するといえば `tail -f` ですが、次のようにしても、

```sh
tail -n0 -f access_log | awk '{print $1}' | sort | uniq -c | sort -rn
```

`tail` を止めるために Ctrl+C するとパイプ先のプロセスまで一緒に死んでしまいます。

## timeout を使う → 失敗

`timeout` を付けて `tail` を実行してみます。

```sh
timeout 1 tail -n0 -f access_log | awk '{print $1}' | sort | uniq -c | sort -rn
```

だめでした。タイムアウトしたときにパイプ先のプロセスまで死んでいます。

`timeout` はタイムアウトしたときにプロセスグループを皆殺しにしていました。

言い換えると、上の書き方でパイプ先にまでタイムアウトを掛けることができているということですね。

## timeout --foreground を使う

`man timeout` によると `--foreground` をつけると大丈夫そうなのでやってみました。

```sh
timeout --foreground 1 tail -n0 -f access_log | awk '{print $1}' | sort | uniq -c | sort -rn
```

成功です、開始から1秒で `tail` だけ死んで集計結果が表示されました。

## timeout と setsid を使う

CentOS 6 の `timeout` だと `--foreground` がありませんでした・・

`timeout` がプロセスグループ皆殺しにするのをどうにかすればいいだけなので、パイプ先で `setsid` してプロセスグループが変わるようにしてみました。

```sh
timeout 1 tail -n0 -f access_log | setsid sh -c "awk '{print \$1}' | sort | uniq -c | sort -rn"
```

成功です。

## timeout と timeout を使う

次のようにパイプ先で `timeout` しても大丈夫でした。

```sh
timeout 1 tail -n0 -f access_log | timeout 2 sh -c "awk '{print \$1}' | sort | uniq -c | sort -rn"
```

`timeout` はプロセスグループを皆殺しにするために `setpgid(0, 0)` でプロセスグループリーダーになるようです。

なので↑のようにすると先頭の `timeout` とパイプ先の `timeout` でプロセスグループが変わり、先頭の `timeout` がパイプ先の `timeout` を殺せなくなります。

例えば、次のようにすると３つの `sleep` は別々のプロセスグループになりますし、Ctrl+C でも死ぬのは最初の `sleep` だけになります。

```sh
timeout 30 sleep 30 | timeout 30 sleep 30 | timeout 30 sleep 30
```

```sh
pstree -agp 1318
# bash,1318,1318
#   ├─timeout,17993,17993 30 sleep 30
#   │   └─sleep,17998,17993 30
#   ├─timeout,17994,17994 30 sleep 30
#   │   └─sleep,17997,17994 30
#   └─timeout,17995,17995 30 sleep 30
#       └─sleep,17996,17995 30
```

`--foreground` をつけるとこの動きが変わり、３つの `sleep` が全部同じプロセスグループになりました。

```sh
timeout --foreground 30 sleep 30 | timeout --foreground 30 sleep 30 | timeout --foreground 30 sleep 30
```

```sh
pstree -agp 1318
# bash,1318,1318
#   ├─timeout,18008,18008 --foreground 30 sleep 30
#   │   └─sleep,18013,18008 30
#   ├─timeout,18009,18008 --foreground 30 sleep 30
#   │   └─sleep,18011,18008 30
#   └─timeout,18010,18008 --foreground 30 sleep 30
#       └─sleep,18012,18008 30
```

この場合は `timeout` は直接の子プロセスだけ殺します。
Macのログイン画面のマウス速度を変更する方法

# そのような設定は無いようです
ソース : [Q.ログイン画面時のマウスの移動速度を変更したい](https://discussionsjapan.apple.com/thread/10102788)

# ではどうするか
上の質問の回答通りですが矢印キーを使うのが手っ取り早いようです
pstorm コマンドの再インストール

PhpStorm をアップデートしても、pstorm コマンドが古いバージョンのままで、CLI 経由では古いバージョンが起動することがあった。

新しいバージョンを GUI で起動して、下記手順で再インストールすれば ok。

* `Shift` + `Shift` で `Search Everywhere` 起動
* `command-line` を入力
* `Create Command-line Launcher` を実行

![Create_Launcher_Script_と_list5-1-111_php_-_php-techical-master-sample_-____sandbox_php-techical-master-code_.png](https://qiita-image-store.s3.amazonaws.com/0/12272/5fe55e79-ea35-2f02-0047-dde36de457be.png "Create_Launcher_Script_と_list5-1-111_php_-_php-techical-master-sample_-____sandbox_php-techical-master-code_.png")


`-h` オプションでヘルプが見れる。`pstorm diff` で差分が見れたりする。（表示は、IDEに出る）

```
$ pstorm -h
Usage:
  /usr/local/bin/pstorm -h |-? | --help
  /usr/local/bin/pstorm [-l|--line line] file[:line]
  /usr/local/bin/pstorm diff <left> <right>
  /usr/local/bin/pstorm merge <local> <remote> [base] <merged>
```

https://www.jetbrains.com/help/phpstorm/2016.2/working-with-phpstorm-features-from-command-line.html
出力されたHTMLを見ただけで、CakephpのどのViewの内容なのかすぐに分かるようにする

デザイン変更でCakephpのViewファイルを修正する際に、該当のHTML箇所がどのViewファイルの内容なのか少し特定しづらいことがあります。
それが一つのViewで完結しているならまだしも多数のElementを使用しているとなおさらですね。
idやclassで検索するのもめんどくさい。。もう検索しなくてもぱっと特定出来るようにしたい。

そこでローカル環境に限ってHTML上にどのViewファイルの内容なのかコメントを出力するHelperメソッドを作成しました。

具体的なHelperメソッドの処理を以下に記載します。

```SampleHelper.php
    /**
     * View開始のHTMLコメント
     */
    function viewStartComment()
    {
        return $this->viewComment();
    }

    /**
     * View終了のHTMLコメント
     */
    function viewEndComment()
    {
        return $this->viewComment(true);
    }

    /**
     * ViewのHTMLコメント出力共通処理
     */
    private function viewComment($viewEnd = false)
    {
        if (env("CAKE_ENV") !== "local"])) {
             return "";
        }
        $debugBackTrace = debug_backtrace();
        $viewPath = $debugBackTrace[1]["file"];
        $status = $viewEnd ? "END" : "START";
        return "<!-- {$status} {$viewPath} -->";
    }
```

やっていることはphpのdebug_backtraceメソッドを使用して、呼び出し元のViewファイルパスをHTMLコメントとして出力します。
※ちなみに`$debugBackTrace[1]["file"]`としている理由は、`$debugBackTrace[0]["file"]`だとviewCommentメソッドを呼んだviewStartComment/viewEndCommentメソッドの情報になりHelperのファイルパスが取れてしまうからです。

あとはこれらのHelperメソッドをViewの最初と最後に呼ぶだけ。

```index.ctp
<?= $this->Sample->viewStartComment()?>

<div>サンプルだよ</div>

<?= $this->Sample->viewEndComment()?>
```


すると出力されたHTMLでは・・

```html
<!-- START /var/www/html/sample/app/View/Samples/index.ctp -->

<div>サンプルだよ</div>

<!-- END /var/www/html/sample/app/View/Samples/index.ctp -->
```

となります。
もしよければ参考にしてください。
またはもっと良い方法があればコメントでの共有お待ちしています :grinning:
ビットコインエクスプローラーでハッシュ値を出す

ここではビットコインで利用されているハッシュ関数について理解します

# ハッシュ関数の特徴

* ハッシュ関数はざっくりと説明すると何かを入力したら一定のルールに従い何かを返すものです。
* 特徴
 * 入力に対する結果が決まっている。かつ、ユニークである。
 * 出力が固定長である 
 * 一方向性である（出力から入力を算定することがほぼ不可能）

![hash.png](https://qiita-image-store.s3.amazonaws.com/0/27772/c0dbad58-e965-1b5e-c44e-9008c2483e9a.png)


# ビットコインエクスプローラー

ビットコインエクスプローラーで内容を確認してみます

参照：https://raw.githubusercontent.com/libbitcoin/

# BXのインストール（Mac OSX）

 GitHubからダウンロードインストールを実行する
 ビルドにはかなり時間がかかってしまうので注意すること

````bash:
$ wget https://raw.githubusercontent.com/libbitcoin/libbitcoin-explorer/version2/install.sh
--2016-09-18 00:32:38--  https://raw.githubusercontent.com/libbitcoin/libbitcoin-explorer/version2/install.sh
Resolving raw.githubusercontent.com... 151.101.100.133
Connecting to raw.githubusercontent.com|151.101.100.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18805 (18K) [text/plain]
Saving to: ‘install.sh’

install.sh               100%[==================================>]  18.36K  93.7KB/s    in 0.2s    

2016-09-18 00:32:40 (93.7 KB/s) - ‘install.sh’ saved [18805/18805]

$ chmod +x install.sh
$ ./install.sh
Make jobs: 4
Make for system: Darwin
　：
　：
PASS: libbitcoin_explorer_test_runner.sh
============================================================================
Testsuite summary for libbitcoin-explorer 2.2.0
============================================================================
# TOTAL: 1
# PASS:  1
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

real	26m2.944s
user	64m47.463s
sys	4m24.932s
````

# bxコマンドを利用した例

ハッシュ関数 SHA-256

````bash:
$ echo 1234567890 | bx sha256
6c450e037e79b76f231a71a22ff40403f7d9b74b15e014e52fe1156d3666c3e6
$ echo 1234567891 | bx sha256
1ce98679f2f7a245044742f558e89d8e2adf0ac80e2d4a2449f49c614b25e9ed
````

ハッシュ関数 RIPEMD-160

````bash:
$ echo 1234567890 | bx ripemd160
06a57a74afecfe1500bb460b227c0a9ee4a3ba5c
$ echo 1234567891 | bx ripemd160
5d66d3b0aa4b0cee4918a367ea479b3210a28c75
````
Swift 3 での NotificationCenter の書き方、キーボードの表示を検知したい

Swift 2系の情報が多く 3 の情報が少なかったのでメモ
ViewContoroller に以下のように記述

```swift

override func viewDidLoad() {
    super.viewDidLoad()
    let nofitiShow = Notification.Name.UIKeyboardWillShow
    let nofitiHide = Notification.Name.UIKeyboardWillHide

    // Notification の追加       
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.keyboardWillShow(notification:)),
        name: nofitiShow,
        object: nil
    )
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.keyboardWillHide(notification:)),
        name: nofitiHide,
        object: nil
    )
}

// キーボード出現時
func keyboardWillShow(notification: NSNotification) {
    print("open")
}

// キーボード閉じる時
func keyboardWillHide(notification: NSNotification) {
    print("close")
}

```

これでテキストフィールドがキーボードで隠れてしまう時の処理が書ける！
rails after initialize

写在config/initializer中

```rb
Rails.application.config.after_initialize do
end
```

写在application. rb中

```rb
module MyApp
  class Application < Rails::Application
    config.after_initialize do
      GC.disable # Disable garbage collector
      p "Test instances before after_initialize: #{Test.count}"
      Test.instantiate
      p "Test instances after after_initialize: #{Test.count}"
    end
  end
end
```

还有其他一堆乱七八糟的 https://github.com/rails/rails/blob/master/railties/lib/rails/railtie/configuration.rb#L51-L71
iTunesConnect及びAppleDeveloperのメンバーを追加してみた

作業メモ。

# 状況

+ Apple Developer(有料)プログラムは参加済み
+ 上記をチームで使いたいが、アカウント情報を使いまわしたくない
+ iTunes Connect及びApple Developerのアカウントはユーザーを追加できるのでやってみた

# 大切だと思ったこと

+ iTunes ConnectとApple Developerのアカウントは同一にできるが別物のようである
+ iTunes ConnectのアカウントはAppleIDでのログインとなっていたがと紐付いていない(?)のか事前にAppleIDの必要がなかったようにみえた
+ Apple Developerのメンバーに追加する場合、事前にAppleIDを作成すること(自分の場合、AppleIDがないと招待メールは送れるがそのあとの承認などがうまくできなかったようにみえた）

上記より、新規にメンバーを追加する場合には該当するメンバーのメールアドレスで事前にAppleIDの作成及びAppleDeveloperへのログイン後、Admin権限を持った人からInvitationを送るとスムーズではないかと思います

# iTunes Connectでのメンバーの追加

[1から始めるiOSチーム開発：iTunes Connectにメンバーを追加する](http://qiita.com/kurumaya/items/95dc2a6fc3c080f73706)

上記を参考にやるとできました。

なお、iTunes Connectのメンバーの役割(Role)は

+ チームエージェント
+ 管理者
+ メンバー

の3つが現状あるようです。
できることの説明は以下のドキュメントにありました。

[プログラムにおける役割と iTunes Connect における役割](https://developer.apple.com/support/roles/jp/)

# Apple Developerのメンバー追加

[1から始めるiOSチーム開発：Apple Developer Programにメンバーを招待する](http://qiita.com/kurumaya/items/9c007685543f51f14dd2)

2016年9月22日現在、画面キャプチャが上記とは少し異なりますが、遷移は同じで Apple DeveloperのAdmin権限のユーザーでログイン後、People->Invite Peopleで対象ユーザーに招待メールを送ります。

Invite as AdminsでAdminユーザーとしての招待、Invite as Membersでメンバーとしての招待となります。

なお、それぞれで出来る事のまとめは以下に記載がありました。

[Program Roles and iTunes Connect Roles](https://developer.apple.com/support/roles/)

招待メールが届いたユーザーはリンクより遷移し、Apple Developerサイトにログイン後、表示される画面でAcceptすることでチームへ参加できます。

なお、参加したメンバーは最初はAdmin権限がないため、必要な場合には、設定が必要です。
対象ユーザーでAccept後、Admin権限のユーザーでPeople->対象ユーザー選択->Change to Adminの操作によってAdmin権限を与えることが出来ました。(試してないですがAccept前にも設定できるのかも)
Node.js 4系と6系でfor文のconst変数宣言の動作に気を付けよう

まず const で宣言した変数（定数）に再代入しても 4 系 ではエラーにならず無視されることに気を付けましょう。

それを踏まえて、下の例では for..of 文の変数を const で宣言しています。4 系では意図した結果になっていないものの、これで通ってしまいます。

```
$ node -v
v4.5.0

$ node
> for (const el of [1, 2, 3]) {
... console.log(el);
... }
1
1
1
```

6 系では問題なく動作します。

```
$ node -v
v6.6.0

$ node
> for (const el of [1, 2, 3]) {
... console.log(el)
... }
1
2
3
```

eslint で const 強制を指定したときに指摘されて 6 系では const にできることを知って気づいた Tips でした。
macOS SierraにしたらGitが動かなくなった時の対処法

macOS Sierraにアップグレードしたあと、以下のようなエラーでGitが動かなくなるかもしれない。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcru
```

アップグレード作業によりXcode Command Line Developer Toolsが壊れてしまったのかもしれないため、再インストールが必要である。再インストールには以下のコマンドを実行すればよい。

```
xcode-select --install
```

ダイアログが出現するので、指示に従ってインストールすれば、またGitが使えるようになる。
SQLインジェクションしようとしたアクセスを弾く

(プログラム側で入力値チェックやエスケープしているものとする)

`QUERY_STRING`に不正な文字が来たらサーバーのリソースを使わせるのはもったいないため
即座に終了させる。(毎分延々とアクセス来たりするため)
海外のサーバー50台からアクセス来てた。

```php:必要に応じてブロックしたい文字を追加すること
// (, by ,' が来たらdie()
if(preg_match('/(\(|%28|%20[Bb][Yy]%20|\'|%27)/',$_SERVER['QUERY_STRING'])){
    header("HTTP/1.0 404 Access denied.");
    die("your access has been blocked.");
}
```

* %20 : 半角スペース
* %28 : `(`
* %27 : `'`

## 不正アクセス例

```html:不正アクセス例
?hoge=fuga'
?hoge=fuga' AND BENCHMARK(2999999,MD5(NOW())) GrOup BY 20&
?hoge=fuga' And sLEEp(3)) #&
?hoge=fuga%27%20UNION%20SELECT%20CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45),CHAR(45,120,49,55,45,81,45),CHAR(45,120,49,56,45,81,45),CHAR(45,120,49,57,45,81,45),CHAR(45,120,50,48,45,81,45),CHAR(45,120,50,49,45,81,45),CHAR(45,120,50,50,45,81,45),CHAR(45,120,50,51,45,81,45),CHAR(45,120,50,52,45,81,45),CHAR(45,120,50,53,45,81,45)%20--%20/*%20order%20by%20%27as%20/*
?hoge=fuga%22%20or%20(1,2)=(select*from(select%20name_const(CHAR(111,108,111,108,111,115,104,101,114),1),name_const(CHAR(111,108,111,108,111,115,104,101,114),1))a)%20--%20%22x%22=%22x
```

* これらの共通点は`カッコ`があることだとわかった。`(`と`%28`をブロック。
* また[IPAのpdf](https://www.ipa.go.jp/files/000024396.pdf)によると`シングルクォート`の例や、ネットの情報では`order by`などの例を発見。
* [最新版のPDF71page](https://www.ipa.go.jp/files/000017316.pdf)
    * [安全なウェブサイトの作り方：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/vuln/websecurity.html)
* [We Analyze Web Hosting.](http://hostingcompass.com/) IPアドレスから地域を特定


## アクセス数多い順にIP表示

* [WEBサーバのログからアクセス数順にIPアドレスを抜き出すワンライナー - Qiita](http://qiita.com/hash/items/53e11f625919c8430583)

```
cat /var/log/httpd/access_log | awk -F " " '{print $1}' | sort | uniq -c | sort -n -r | head
```

## ブラックリスト化

```php:blacklist.php 
<?php
$ip_blacklist = array(
	// 2016-09-22 (Thu) SQL injection access.
	'89.146.221.7',
	'134.213.119.7',
	'23.91.70.7',
	//
);

if(in_array($_SERVER['REMOTE_ADDR'], $ip_blacklist)) {
	die("blacklisted.");
}
unset($ip_blacklist);
?>
```
GitHubでGit入門

## 対象
* Windows or MacOS の PC を使用している
* 使ってみたいけど始め方がわからない
* 手っ取り早く手順だけ知りたい
* 学生（無料で Private リポジトリを使う場合）

## Git とは？
気になる方は，Git の利点から基本的な使い方まで詳しく説明しているサイトがあるので，まずはそちらを参照してください．

多少知ってるからとりあえず始めたいという方は別に読まなくても結構です．

[サルでもわかるGit入門](http://www.backlog.jp/git-guide/)

## GitHubでの設定
### GitHub アカウント登録
まずは以下のリンクから， GitHub アカウントを取得する．
[GitHub](https://github.com)

### リポジトリ作成
Public リポジトリであれば誰でも無料で利用できる．ソースコードを公開したくない場合は Private リポジトリを利用する必要がある．後述する GitHub Education 申請を行うことで，学生であれば無料でPrivateリポジトリを利用できる．申請が通るまでは，Private リポジトリを利用することはできないので，ここでは Public にしておく．

Start a project をクリック

必要事項を入力

* **Repository name**: 任意の名前．何のプロジェクトなのかわかりやすい名前．
* **Description**: 詳しめのプロジェクトのの説明．特に書く必要はない．
* **Public/Private**: 最初は Public を選択．
* **Initialize this repository with a README**: チェック．
* **Add .gitignore**: 使用する言語 を選択（オブジェクトファイルなど，ソースファイル以外の余計なものを同期対象から外す設定．）．
* **Add a lisence**: None を選択．

以上の必要事項を入力，選択した後，Create Repository をクリックすると，GitHub のサーバ上にリポジトリが作成される．

## PC での設定
### Git のインストール
下記リンク先の GitHub Desktop をインストールする．

[GitHub Desktop](https://desktop.github.com/)

インストールが完了したら，アプリケーションを起動し，GitHub アカウントでログインする．本来，SSH 公開鍵登録ということが必要になるが，今回の場合は GitHub Desktop が全部やってくれるのでスキップできる．

## git clone
以上の手順でサーバ，PC の設定が完了したら，GitHub のサーバ上で作成したリポジトリの複製をPC上に作成する．

GitHub Desktop の左上に表示されている➕ボタンから Clone を選択し，先程作成したリポジトリ名を選択する．

以上でGitを使う準備は完了．


<br/><Div Align="center"><A Href="http://qiita.com/fiftystorm31/items/f53e065dcf3da57968ef">◇</A> <A Href="http://qiita.com/fiftystorm31/items/e10aab9b3f5f1bf542ed">基本的な使い方＞＞</A></Div>

## GitHub Education 申請
ソースコードを公開したくない場合,Private リポジトリを使用する必要がある．申請は以下のリンク先から行うことができる．

[GitHub Education](https://education.github.com/)

記入例に従って，全て英語で記入する．

[無料でGitHubのprivateリポジトリを作る方法](http://qiita.com/YamanakaFumiya/items/d8c06c9a28ce04d3043a)
「早すぎる最適化は諸悪の根源」について

この、ドナルド・クヌース先生の有名な格言について考えてみます。

プログラムのコードをきれいな状態に保つことと、実行速度の向上や必要なリソースの削減といった最適化を図ることとは両立しない場合が多々あります。こうした場合にどちらを優先すべきか？という問いに対し、クヌース先生は「まずコードをきれいにしろ」と答えています。

ソフトウェアのユーザにとって、コードがきれいかどうかは何の価値もありません。対して実行速度などは使いやすさに直結する重要な要素です。それなのになぜ、きれいなコードのほうが優先されるべきなのでしょうか？

# きれいなコードとは？ なぜ最適化と両立しない？

まず考える必要があるのは「きれいなコード」とは何か？ということです。
それは、開発者がコードを眺めて「なんて美しいんだ！」と悦に入るためのものではありません。

きれいなコードの条件として、大きく以下の2つが挙げられると思います。

・理解しやすい
・修正しやすい

「理解しやすい」ためには、コードの一部だけを見ることで、それが何をするためのものなのかが判断できるということが必要です。
逆に「コードを全て読んで初めて、とある関数が何をしているのかが分かった」などというのでは、理解しやすいとは言えません。

「修正しやすい」ためには、コードの一部を修正した場合、その影響が他の部分へ及ばないことが必要です。
逆に「ここを書き換えたら、何が起こるかわからない」というのでは、修正は困難になります。

どちらの条件も、コードの各部分が独立性を保っていることがカギとなります。どこから参照されてるかわからないグローバル変数が使われているとか、何故だか処理Ａは処理Ｂの前に必ず呼ばなくてはならないといった制約がある、といった場合には独立性が損なわれていることになります。

実のところ、「オブジェクト指向」や「抽象化」といった概念は、この、各部分の独立性を保つということを実現するためにあります。
さらに言うと、コードの各部分とはクラスや関数の形で表れることになりますが、それぞれが適切な大きさであり、ふさわしい名前が付けられているといったことも重要です。

これに対し、最適化を行う場合には、たとえば処理Ａの過程でできたリソースを、せっかくだから処理Ｂで使いまわせば効率が良いじゃないか、といったことが行われます。もったいない精神と考えてもいいかもしれません。

こうした場合、処理Ｂは処理Ａの内容に依存することになります。Ｂへの影響が及ぶことからＡをおいそれとは修正できなくなり、恐らくはそれぞれの処理を呼び出す順序にも制約が生じることになります。つまり、ＡとＢそれぞれの独立性が失われるわけです。きれいなコードと最適化されたコードが両立しない理由はここにあります。

# きれいなコードを最適化するのは容易。逆は困難。

きれいな（修正が容易な）コードであれば、最適化も容易です。
逆に最適化によって修正が難しくなったコードは、きれいにするのも困難です。

また、ある一定以上の規模のソフトウェアであれば、機能追加や修正がまったく発生しないということはほぼありません。そのソフトウェアが使われなくなるまで、コードをきれいにしておくことで、メンテナンス性を保つということが重要になります。

したがって、状況にもよりますが、まずはきれいなコードを書き、必要に応じて最適化を施す、というのが開発における理想的な戦略になります。

# コードのどこが遅いのかは、予測するのが難しい

でもやっぱり、速く動作するソフトウェアには価値がある。最適化を優先したい。と考える開発者もいると思います。が、ちょっと待ってください。

コードを書いていると、つい「この関数が呼ばれるたびにこのインスタンスを生成することになっちゃうのか。なんだか効率が悪そうだな。。。」なんてことを考えます。

しかしこうした「このせいで動作が重くなるのでは？」という推測は、しばしば外れます。実際動かしてみれば、心配してたほどの影響はない、という場合が非常に多いのです。逆に、思いもよらない場所がボトルネックになることもよくあります。

さらには、動作が重いというとき、その実行時間の大部分がプログラムのほんの一部分において費やされるといった状況もよく発生します。この場合、それ以外の部分に最適化を施しても、その効果は微々たるものになります。

# 最適化は推測ではなく、実測に基づいて行うべし

最適化を行う上で重要なのは、どこを最適化すれば効果的なのかを判断することです。これは、時間計測のコードを挿入したり、プロファイラを利用するなどして、実測を行った上で決めるべきです。

実測をせずに推測だけで行う「早すぎる最適化」は、何の効果も上げられないまま、いたずらにコードを汚してしまう可能性があります。開発者がソフトウェアの性能に対して行う推測は、あてにならない場合が多いのです。

最適化の作業は、しばしば開発者を没頭させる甘い罠です。それは本当に行う価値があるのか？裏付けをもって行いましょう。

# まとめ

きれいなコードとは、各部分の独立性が保たれることによって、理解しやすく修正しやすいコード。

最適化を行うと、きれいなコードを汚してしまう場合がある。

まずはきれいなコードを書き、その後必要に応じて最適化を行うべし。

最適化を行う場合は、どの部分を最適化すべきかを判断することが重要。

どの部分を最適化すべきかの判断を、推測に基づいて行うのは良くない。実測してから行うべし。
Quantum Chemistry - Superposition Principle 3: Example

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Superposition Principle 3: Example
https://www.youtube.com/watch?v=f65sIWYGUIg&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=35

- 重ね合わせの原理の例を見る
- 緑の式
  - [このビデオ](https://www.youtube.com/watch?v=EK6C6mpxP-g&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=17)の右下ピンクの式
- 紫の式
  - [このビデオ](https://www.youtube.com/watch?v=uK60QAKooyM&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=16)の右下緑の式
- 薄紫の式
  - [このビデオ](https://www.youtube.com/watch?v=PHus6stbje0&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=33)の左上緑の式
  - f(x)にプサイ(x)を使っている
- 白の式
  - [このビデオ](https://www.youtube.com/watch?v=H7aejrEU8Jo&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=34)の左下水色の式
  - c_n*はc_nの複素共役
  - c_nは複素数 (Cの太字)
- ピンクの式
  - normalization condition
  - [このビデオ](https://www.youtube.com/watch?v=H7aejrEU8Jo&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=34)の右下オレンジの式
  - normalizationにより総和の値が1となる
- グラフ
  - プサイnのグラフ
  - n=1,n=2,n=5の場合
     - https://www.desmos.com/calculator/zqo7bncevb
     - において左上のn=1を2や5に変えた時の青の線
- 中段緑の定義
  - n=1,2,5の時の係数
- 紫の式
  - 左上薄紫の式に係数c_nと`|n>`のnを代入した
- ピンクの式
  - average energy
  - c_nがsqrt(1/2)の時、その複素共役c_n*もsqrt(1/2)
     - 虚数単位iにかかる値が0のため
  - 左上白の式のc_n*とc_n、E_nにそれぞれの値を代入した式
- 黄色の式
  - ピンクの式のE_1などに左上紫の式(E_n=)を代入した
- 水色の式
  - 黄色の式を整理して得られた
- 右上オレンジの式
  - 状態nの測定の確率p_nを見る
  - n=1,2,5についてみる
  - n=3,4,6,...についてはc_n=0となる
  - p_nはc_nの二乗に比例する、という説明をしている
      - p_n = という表記でなく
      - p_n ∝という表記が正しいだろう
- 緑の定義
  - expt(Experiment: 実験で観測されるEnergy)
  - 確率p_nはc_nに比例することからそれぞれのEnergyでの確率が得られる
  - 左中段のc_1, c_2, c_5の定義から
  - c_1は(1/2)のsqrtから50%
  - c_2は(1/5)のsqrtから20%
  - c_5は(3/10)のsqrtから30%
     - E_3という記載は間違いでE_5が正しい
  - 合計すると100%
- 右下の図
  - それぞれのEnergyの値と確率
  - E_5の右25と記載はn=5の二乗
  - E_1,E_2についても同様
  - 右上緑の確率(50%, 20%, 30%)を記載
  - (nの二乗)と確率をかけた値をn=1,2,5で平均すると`<E>`が8.8   
      - 1 * 0.5 +
      - 4 * 0.2 +
      - 25 * 0.3 = 
      - 8.8
技術英語 >[When all the dust settles], the Exit Sub approach does appear more readable and maintainable,

@ Code Complete (No. 13032 / 36077)

> <font color=red>When all the dust settles</font>, the Exit Sub approach does appear more readable and maintainable, ...

色々な作業をした後に、「落ち着いてから」という意味で使われている。
面白い表現だと思う。

@ Avengers: Age of Ultron
上のフレーズを見た数日後に見た映画にてUltronのセリフでも同じ表現が使われていた。
http://www.imdb.com/title/tt2395427/quotes
> It means nothing! When the dust settles, the only thing living in this world, will be metal.

<hr>
1999年に2週間だけ行ったロンドンの語学学校(College of Central London, 講師: Tamsin Walkerさん)のことを思い出した。

当時のホストマザーに使った言葉が

> I can let my hair down.

http://ejje.weblio.jp/content/let+my+hair+down
> 1. (idiomatic) To relax and enjoy oneself.

短髪でdownしない髪型だったので受けた（と思う）。
ホストマザーはけたけた笑っていた。
インストールISOイメージ作成：macOS Sierra (10.12)

## 概要
- [OS X El Capitan(10.11.6)のインストールISOイメージ作成](http://qiita.com/mt08/items/9b8512e9b6376d46a1ee)と同様。
- [OSX-KVM : Running Mac OS X 10.11.6 El Capitan on KVM + QEMU](https://github.com/kholia/OSX-KVM)のスクリプトを使用。
- [20160927更新]スクリプトが更新された模様. <del>`"/Application/Install OS X ほにゃらら"` から `"/Application/Install macOS ほにゃらら"` に変更されてるので、スクリプトの該当箇所を変更する。</del>

## 環境
- AppStore から、macOS Sierraがダウンロードできる、OSXまたはmacOSの実行環境

## 手順

1. AppStoreから、**macOS Sierra**をダウンロード
2. インストーラが立ち上がったら、終了
3. ターミナルを開いて、以下実行。

    ```bash:[20160927更新]スクリプトのファイル名が変更された
cd ${HOME}
# rm -rfv iso
mkdir iso
cd iso
curl -O https://raw.githubusercontent.com/kholia/OSX-KVM/master/create_install_iso.sh
curl -O https://raw.githubusercontent.com/kholia/OSX-KVM/master/pbzx
chmod +x ./create_install_iso.sh
chmod +x ./pbzx
time sudo ./create_install_iso.sh -n -m 2
```
`Error: Can't mount installation image` が出たら、再起動して、もう一度やる。

4. 待つ

    ```shell-session:実行例
Resulting .iso location:
/Users/mt08/iso/Install_macOS_Sierra_(OS_X_10.12).iso

    Removing temporary files...

    real    16m6.238s
user    6m9.206s
sys    1m33.376s
```



## その他
- 某tualBoxにて、ISOイメージ起動、インストール、初期設定、HDDイメージ起動、Xcodeインストールくらいまで、行った模様。
- Vitual某xで使う場合は、VM作成後にうまい設定を行わないといけないらしい。<br>ヒント?: `cpuidset 1 000206a7 02100800 1fbae3bf bfebfbff`



<!-- https://twitter.com/kate3_0_0/status/792347914055983104 -->
<!-- 禁断の書だったのか! https://twitter.com/A1ces/status/839442264640253952 -->
最初に sudo を実行した時に表示されるメッセージ


最初に sudo を実行した時に

```shell-session
$ sudo -i
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for mapk0y: 
```

と表示される。
これがどのように制御されるか調べてみたのでメモしておく。
ただし、`Debian GNU/Linux 8.5 (jessie)` で strace を利用して調べただけなので正しくないかもしれない。

- この表示は "lecture" と呼ばれているようだ。
- このメッセージは `/usr/lib/sudo/sudoers.so` に埋め込まれている（strace と strings より）。
  - sudo のバージョンによっては sudo 本体に埋め込まれていることもあるらしい。 
- 初回起動かどうかのチェックは `/var/lib/sudo/lectured/username` があるかどうかで確認しているようだ。

書いてある内容に関しては以下の記事を参考にして欲しい。
[sudo初回実行時のメッセージ - Qiita](http://qiita.com/amichang/items/70679909045d92a76d55)
@at-rootディレクィブで変数を局所化する

[@at-root][1]ディレクィブは、変数を局所化するのに使える。

```
$color: blue;

@at-root {
  $color: red;

  .a {
    color: $color;
  }
  .b {
    color: $color;
  }
}

.c {
  color: $color;
}
```

はこのようにコンパイルされる：

```
.a {
  color: red;
}

.b {
  color: red;
}

.c {
  color: blue;
}
```

  [1]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#at-root
最近のAndroid Studioでの MMDAgent のビルドメモ


MMDAgent-1.6.1 が Android Studio 2.2(gradle 2.2.0)でビルドできたので、マニュアルとの差分を記録してみました。

#前提
基本的には現時点でも、[2015年3月4日、MMDAgentのマニュアル公開（暫定版）](http://www.udialogue.org/ja/download-ja/107-mmdagent.html)にあるマニュアルPDFの「MMDAgent を Android で利用する手順」にしたがえばよい様です。
ただし、MMDAgent, Andoroid Studio 共に、バージョンアップで変更となっている部分もあるので、そういった読み替えが必要となる部分があります。

#変更内容
具体的には以下のような部分は変更となります。

##gradleバージョン対応
Q1にあるgradleバージョンの書き換えは行わず、かわりに2箇所ある project.plugins.findPlugin ( 'com.android.application' ).getNdkFolder () をplugins.getPlugin('com.android.application').sdkHandler.ndkFolder に書き換えるとよい様です

参考) [Android Gradle Plugin 1.1.0 - getNdkFolder() not found anymore, any replacement?](http://stackoverflow.com/questions/28615439/android-gradle-plugin-1-1-0-getndkfolder-not-found-anymore-any-replacement)

##その他
- ￼6.マニフェストファイルの編集　で行う、MMDAgent¥app¥main¥AndroidManifest.xml の編集は編集前のファイルの内容にあわせて、android:label　等を設定する。
- 7.local.properties の編集　は不要の様なので、確認のみ実施する。
- 8.build.gradle の編集 は編集前のファイルのdefaultConfig,buildTypes を残し、task makeConfigFile の内容は MMDAgent-1.6.1　の Makefile 中、config.h の作成部分にあわせる。

#後記
Android Studio 2.2 では cmake が導入されたので、対応すると色々捗りそうですが、これはとりあえずのメモです。
Macでcapybara-webkitがbundle install出来ないとき

未来の自分が詰まったとき用

まず公式を見る
https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit

あとこことかも参考になるかも
http://stackoverflow.com/questions/39492617/xcode-8-error-project-error-xcode-not-set-up-properly-even-though-the-licens
TestLinkのデータベースからproject情報を吸い出してjsonで出力するgolang

```go
package main

import (
	"database/sql"
	"fmt"
	"gopkg.in/gorp.v1"
	"github.com/wulijun/go-php-serialize/phpserialize"
	"encoding/json"
	_ "github.com/go-sql-driver/mysql"
)

type Project struct {
	Id                       int    `json:"id"`
	Active                   int    `json:"active"`
	IsPublic                 int    `json:"is_public"                  db:"is_public"`
	TcCounter                int    `json:"tc_counter"                 db:"tc_counter"`
	IssueTrackerEnabled      int    `json:"issue_tracker_enabled"      db:"issue_tracker_enabled"`
	ReqmgrIntegrationEnabled int    `json:"reqmgr_integration_enabled" db:"reqmgr_integration_enabled"`
	OptionReqs               int    `json:"option_reqs"                db:"option_reqs"`
	OptionPriority           int    `json:"option_priority"            db:"option_priority"`
	OptionAutomation         int    `json:"option_automation"          db:"option_automation"`
	InventoryEnabled         int64  `json:"inventory_enabled"`
	RequirementEnabled       int64  `json:"requirement_enabled"`
	TestPriorityEnabled      int64  `json:"test_priority_enabled"`
	AutomationEnabled        int64  `json:"automation_enabled"`
	ApiKey                   string `json:"api_key"                    db:"api_key"`
	Notes                    string `json:"notes"`
	Prefix                   string `json:"prefix"`
	Options                  string `json:"options"`
	Color                    string `json:"color"`
}

func get_member_value(m *phpserialize.PhpObject, key string) int64 {
	tmp, _ := m.GetPublicMemberValue(key)
	if tmp != nil {
		return tmp.(int64)
	} else {
		return 0
	}
}

func initDb() *gorp.DbMap {
	db, err := sql.Open("mysql", "root:@tcp(192.168.0.100:3306)/bitnami_testlink")
	if err != nil {
		panic(err.Error())
	}
	return &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{}}
}

func main() {
	dbmap := initDb()
	var proj []Project
	_, err := dbmap.Select(&proj, "select * from testprojects")
	if err != nil {
		panic(err.Error())
	}

	for x:=0;x<len(proj);x++ {
		r, err := phpserialize.Decode(proj[x].Options)
		if err == nil {
			m := r.(*phpserialize.PhpObject)

			proj[x].InventoryEnabled     = get_member_value(m, "inventoryEnabled")
			proj[x].RequirementEnabled   = get_member_value(m, "requirementEnabled")
			proj[x].TestPriorityEnabled  = get_member_value(m, "testPriorityEnabled")
			proj[x].AutomationEnabled    = get_member_value(m, "automationEnabled")
		}
	}

	bytes, _ := json.Marshal(proj)
	fmt.Println(string(bytes))
}

```

そのうち、rest api みたいなのが作りたい。
Jetson TX1 の初期設定

#はじめに
Deep Learningの勉強とGPUの性能評価のためにJetson TX1を購入しました。
( Amazonの商品ページ: [Jetson TX1開発キット](https://www.amazon.co.jp/NVIDIA-Jetson-TX1%E9%96%8B%E7%99%BA%E3%82%AD%E3%83%83%E3%83%88-TX1-Module/dp/B01FD3IFF0/ref=sr_1_1?ie=UTF8&qid=1474477877&sr=8-1&keywords=Jetson%E3%80%80TX1) )
以下に私の初期設定内容を記載します。
![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/141396/41ca3fa5-4982-dac1-1725-b8d15eb41de1.jpeg)

#JetPackを用いたセットアップ
Jetson TX1に対しホストPCからJetPack2.3を用いてインストールする。
(ホストPCとしてWindows10とデュアルブートさせた64bit版Ubuntu14.04LTSを使用)

参考リンク: [JetPackを用いたセットアップ]( http://takesan.hatenablog.com/entry/2016/06/26/005516 )

#タイムゾーンの設定
「System Settings->Time & Data->Location->Tokyo」を選択

#キーボードレイアウトの変更
1.System Settings->Keyboard」を選択 
![1.png](https://qiita-image-store.s3.amazonaws.com/0/141396/89724674-4aa8-be55-d932-dab6e4d20a5e.png)
2.TextEntryをクリック
![2.png](https://qiita-image-store.s3.amazonaws.com/0/141396/757ba67f-d5d6-c044-df89-50b76826d5b7.png)
3.「+」マークをクリック
![3.png](https://qiita-image-store.s3.amazonaws.com/0/141396/6f474a3a-6b64-5f21-5a05-7b3799047d51.png)
4.Japneseを選択
![4.png](https://qiita-image-store.s3.amazonaws.com/0/141396/68a6cea3-a385-689c-9be4-40125aebee98.png)
5.English(US)を削除
 * English(US)をクリック
 * 「-」ボタンをクリック
 * Japneseだけになっているかを確認
![5.png](https://qiita-image-store.s3.amazonaws.com/0/141396/863bc0c1-1525-b3fc-59f1-20d5da9635d5.png)
7.日本語レイアウトになっているかを確認
 * 「"」や「*」がキーボード通りに打てるかを確認

#SDカードの内蔵ドライブ化
##内蔵eMMCの(個人的な)問題点
JetPack2.3によるOSアップデートとCUDA環境のインストールのみで、eMMCを9.5GB使用している(残り4.4GB)。
eMMCだけで運用するのは無理がありそうなので、外付けSDカードを使用することにしました。
(お金に余裕がある人はSSDの方が無難だと思います)
(CUDAのサンプルを削除すれば1GB程度余裕ができる?)
![DSC_0134.JPG](https://qiita-image-store.s3.amazonaws.com/0/141396/2a787cb8-69be-7b3d-e63d-953367523218.jpeg)

##SDカードの下準備
使用したのはAmazonで購入した東芝のmicroSDXC 64GB
( Amazonの商品ページ: [東芝 microSDXC 64GB](https://www.amazon.co.jp/gp/product/B01FU2GQSW/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1 "Amazon") )
SDカードを挿入すると自動で認識されるので、フォーマットを実行する。
フォーマットはSDカード認識後にSDカードのアイコンを右クリックし「Format」。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/141396/7e0e3206-dc2c-b80c-e2b3-e62480f075ca.png)
ここではフォーマットタイプとしてExt4を選択しました
![DSC_0135.JPG](https://qiita-image-store.s3.amazonaws.com/0/141396/a4d338c8-bdcd-0374-17a1-fdada802f6e2.jpeg)

##SDカードのマウント
1. マウント先のディレクトリを作成
 * ターミナルにて「sudo mkdir /mnt/sd64」を実行する 
 * (ディレクトリ名「sd64」は任意)
2. SDカードのデバイスファイル名を取得
 * ターミナルにて「fdisk -l」を実行する
 * 私の環境では「/dev/mmcblk1p1」として認識されていたので、以下この名称で進めます。
3. SDカードをマウント
 * ターミナルにて「sudo mount /dev/mmcblk1p1 /mnt/d」を実行する。
4. SDカードがマウントされたかを確認
 * ディレクトリ「/mnt/sd64」を右クリックし、propertyを表示しSDカードの容量と同じかを確認する。
 * (もしくはSDカードに保存されたファイルが表示されるかを確認する)
5. 起動時にマウント
 * ルート権限で「/etc/rc.local」を編集する
 * (例)ターミナルで「sudo nano /etc/rc.local」を実行する

```/etc/rc.local
if test -b /dev/mmcblk1p1; then
 echo -n "Mounting SD memory"
 sudo mount /dev/mmcblk1p1 /mnt/sd64
 check_status
fi
```

参考リンク: [Linuxでのマウントに必要なコマンド]( https://pctrouble.net/extra/linux_mount.html )
参考リンク: [起動時にマウントする方法]( https://users.atmark-techno.com/comment/277#comment-277 )

#おわりに
以上、Jetson TX1の初期設定の一例を紹介しました。
今後、QiitaにてJetson TX1を用いたDeep Learningの事例やGPUの性能評価の結果を載せていきたいと考えています。
[Laravel]直近のクエリ文を出力する

# クエリ文を文字列として出力する

``` php
$sql = User::orderBy('id', 'desc')->toSql();
var_dump($sql);
```
* 出力結果

``` bash
 'select * from `users` where `users`.`deleted_at` is null order by `id` desc' (length=75)
```

# もっと詳細を出力する場合

``` php
DB::enableQueryLog();
$users = User::orderBy('id', 'desc')->paginate(30);
dd(DB::getQueryLog());
```
* 出力結果

``` bash
array:2 [▼
  0 => array:3 [▼
    "query" => "select count(*) as aggregate from `users` where `users`.`deleted_at` is null"
    "bindings" => []
    "time" => 0.38
  ]
  1 => array:3 [▼
    "query" => "select * from `users` where `users`.`deleted_at` is null order by `id` desc limit 20 offset 0"
    "bindings" => []
    "time" => 0.56
  ]
]
```
Pythonでtsvを取り込む

# 結論
Pythonではtsvもcsvと同等に扱える。

# コード
```text:data.tsv
aaaa  bbb   cc    d     ee    fff   gggg
```

```py:sample.py
import csv

tsvFile = file("data.tsv")
tsv = csv.reader(tsvFile, delimiter = '\t')

for s in tsv:
    print s 
```
```text:console
aaaa
bbb
cc
d
ee
fff
gggg
```
CLOSでaccessorとmethodの名前衝突を回避する

# 目的
パッケージを分けてdefmethodしている場合に総称関数の名前の衝突を回避したい。

# 名前の衝突
```cl:clos-sym.lisp
;; foo
(in-package :cl-user)
(defpackage pfoo
  (:use :cl)
  (:export :foo
           :x
           :y))
(in-package :pfoo)

(defclass foo ()
  ((x :accessor x
      :initform 1
      :initarg :x)))

(defmethod y ((foo foo))
  (print "foo"))

(in-package :cl-user)

;; bar
(in-package :cl-user)
(defpackage pbar
  (:use :cl)
  (:export :bar
           :x
           :y))
(in-package :pbar)

(defclass bar ()
  ((x :accessor x
      :initform 2
      :initarg :x)))

(defmethod y ((bar bar))
  (print "bar"))

(in-package :cl-user)

(use-package :pfoo)
(use-package :pbar)
```

`x`と`y`がぶつかる。
`use-package`しなければいいけど、それだとパッケージを指定しなくてはいけない。

# キーワードを使う
```cl:clos-kw.lisp
;; foo
(in-package :cl-user)
(defpackage pfoo
  (:use :cl)
  (:export :foo))
(in-package :pfoo)

(defclass foo ()
  ((x :accessor :x
      :initform 1
      :initarg :x)))

(defmethod :y ((foo foo))
  (print "foo"))

(in-package :cl-user)

;; bar
(in-package :cl-user)
(defpackage pbar
  (:use :cl)
  (:export :bar))
(in-package :pbar)

(defclass bar ()
  ((x :accessor :x
      :initform 2
      :initarg :x)))

(defmethod :y ((bar bar))
  (print "bar"))

(in-package :cl-user)

(use-package :pfoo)
(use-package :pbar)
```

書き方が`(:y foo)`や`(:x foo)`みたいになるけど、衝突はおきない。

Common Lispっぽくないかも？
paizaで戦うために便利なRubyのメソッド

## paizaとは
[paiza](http://paiza.jp) はリクルーティング・サービスで、応募者のレベルを測るのに競技プログラミングを使っているのが特徴です。paizaはコーディングの結果をもとにユーザーを６段階でランク付けします。Topcoderのような他のメジャーな競技プログラミングサービスと違って、[多くの言語](http://paiza.jp/guide/language) をサポートしていて、この業界では人気のないRubyもサポートしています。

当方普段Railsを使っているので、コーディング言語としてRubyを選びました。下記はその中で学んだテクニックです。

## String#ljust, String#rjust
paizaではしばしば出力のフォーマットを要求されます。Rubyには複雑なこともできるsprintfもありますが、多くの場合String#ljust, String#rjustで十分です。

### 入力

```text
2
apple banana orange
1 2 3
```

### 期待される出力

```text
apple     banana    orange    
1         2         3         
```

### 良い例

```ruby
total_rows = gets.to_i
db = []
total_rows.times { db << gets.chomp.split }

db.each do |line|
  # 文字列が10文字より小さければスペースで埋める
  formatted = line.map { |str| str.ljust(10) }
  puts formatted.join
end
```

## Array#transpose
データベースのそれぞれのカラムの合計を返す問題を考えましょう。
ラベルと行数、各行のデータが与えられて、期待される出力はカラム名と合計です。

### 入力

```text
apple banana orange
5
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
```

### 期待される出力

```text
apple 17
banana 22
orange 27
```

Rubyの強みの一つにメソッド・チェーンがあります。もし要求が同じ行の値の合計なら簡単に実装できます。
残念ながらpaizaは水平方向の計算を好みます。 競技プログラミングではコンソールに出力をだすという制約があるので問題に難しさを足すのに便利なやり方なのかもしれません。以下は配列のインデックスを使った例です。

### 悪い例

```ruby
label = gets.chomp.split
total_rows = gets.to_i
db = []
total_rows.times { db << gets.split.map(&:to_i) }
result = []
# Rubyは列操作が苦手
(0...label.size).each do |i|
  sum = 0
  db.each { |line| sum += line[i] }
  result << sum
end

(0...label.size).each do |i|
  puts "#{label[i]} #{result[i]}"
end
```

このコードは動くものの、自分はもっと複雑な問題で何度かインデックスを数え間違えました。個人的な意見ですが、C風のインデックスの多用は自然なRubyの使い方でない気がします。

Rubyの配列には行と列をいれかえる **transpose** というメソッドがあります。これを上手く使うときれいに書けエラーを防げます。

### 良い例

```ruby
label = gets.chomp.split
total_rows = gets.to_i
db = []
total_rows.times { db << gets.split.map(&:to_i) }
result = []
# tranposeを使って簡単に表現
db.transpose.each { |arr| result << arr.reduce(&:+) }

[label, result].transpose.each do |pair|
  puts pair.join(' ')
end
```
iOS10 にアップデートしたら Web ページの Google マップが動かなくなったという場合の対処法

## エラー内容
クライアントから「Web ページの Google マップが突然動かなくなった！」という連絡、詳しく聞いてみると「iOS10 にしてからのような気がする」とのこと、そこで Safari の Web インスペクタを使って調べてみるも

```
[Error] TypeError: undefined is not an object (evaluating 'c.pageX')
	Bt (common.js:123:116)
	Be (common.js:208:367)
	kn (common.js:206:642)
	（anonymous 関数）
	dispatchEvent
	A (controls.js:177:453)
	（anonymous 関数）
	trigger (js:94:127)
	（anonymous 関数） (controls.js:28:336)
	（anonymous 関数） (common.js:200:308)
	v (js:31:309)
	m (common.js:200:284)
	（anonymous 関数）
	（anonymous 関数） (common.js:62:421)
```

という謎のエラー。そのエラーが起こっているのはどうやら、common.js という Google のライブラリ一部のファイルのようです。

## 解決策

解決策が見当たらない…そんなときに頼れる [Stack Overflow](http://stackoverflow.com/) ですね！9月18日に解決策が挙げられていました。

[Google Maps Javascript API Doesn't Respond to Touch Events in iOS 10 - Stack Overflow](http://stackoverflow.com/questions/39540515/google-maps-javascript-api-doesnt-respond-to-touch-events-in-ios-10)

どうやら、Google Maps JavaScript API を読み込む script タグで囲まれた部分の signed_in を false に変更したら解決できました。

＜エラーが出る＞

```
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&signed_in=true&callback=initMap"
  async defer></script>
```

＜falseにするとエラーが出ない＞

```
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&signed_in=false&callback=initMap"
  async defer></script>

```

この回答者も明確な見解を持っていないようですが、「Google マップの右上に出てくる『ログイン』のボタンがタッチイベントになんらかの影響を与えているのではないか？」ということでした。そのうち Google さんが対応すると思いますが、一旦これで解決できました。
data属性の値をcssのcontent:attrで入れてtableのレスポンシブをしてみた

久々の投稿です。

data属性はいつもJSで操作するときにいじることが大半だったのですが、疑似要素を使って表現する方法があることを知りました。知らなかったのでメモTipsとして残しておきます。

さっそくやってみた。

完成したサンプルコードはこんな感じでやってみました。
[http://codepen.io/redamoon/pen/ORyYQR](http://codepen.io/redamoon/pen/ORyYQR)

HTMLは以下のような構造で記述してみました。

```html
<!-- contet:attr(data-title)を使ったサンプル -->
<table class="base-table">
  <thead>
    <tr>
      <th></th>
      <th>title1</th>
      <th>title2</th>
      <th>title3</th>
      <th>title4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>category01</th>
      <td data-title="title1">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
      <td data-title="title2">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
      <td data-title="title3">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
      <td data-title="title4">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
    </tr>
    <tr>
      <th>category02</th>
      <td data-title="title1">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
      <td data-title="title2">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
      <td data-title="title3">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
      <td data-title="title4">サンプルテキストサンプルテキストサンプルテキストサンプルテキスト</td>
    </tr>
  </tbody>
</table>
```

サンプルのCSS（SCSS）になります。
メディアクエリを使っての切り替えで、767px以下のときにdata-titleをtbodyのtdに疑似要素:beforeにcontent attrで代入するようにしています。

```sass
*{
  margin:0;
  padding: 0;
}
.base-table{
  width: 100%;
  margin:0;
  th, td{
      padding: 10px;
  }
}
@media only screen and (min-width:767px) {
  .base-table{
    border-collapse: collapse;
    border: 1px solid #999;
    thead{
      th{
        background: #CCC;
        border: 1px solid #999;
      }
    }
    tbody{
      th{
        background: #47cf73;
        border: 1px solid #999;
      }
      td{
        border: 1px solid #999;
      }
    }
  }
}

@media only screen and (max-width:767px) {
  .base-table{
    box-sizing: border-box;
    thead{
      th{
        display: none;
      }
    }
    tbody{
      th{
        display: block;
        background: #47cf73;
        margin-bottom: 20px;
      }
      td{
        padding: 0 10px 10px;
        margin: 0;
        display: block;
        width: 100%;
        position: relative;
        box-sizing: border-box;
        &:before{
          background: #CCC;
          width: 100%;
          display: block;
          box-sizing: border-box;
          padding: 10px;
          margin-bottom: 10px;
          font-weight: bold;
          content: attr(data-title);
        }
      }
    }
  }
}
```

たまたま案件で見た参考サイトの表組みが、このようなattrを使った表現でレスポンシブをやっていたので試してみました。
attrは今後頻繁に使う可能性があると思ったので、今後のためのメモとして簡単なエントリーとしてまとめておきます。

タイムテーブルだったり大量のデータをテーブルで表現しているサイトなどをレスポンシブ化するときには便利な方法だと思いました。
※今回はtableで表現しましたが、違ったレイアウトパターンのときでも使えると思います。
MotionBuilderのFlat Shader適用時にShader表示がなんかおかしいとき

頂点カラーが入っている可能性が高い。

各々のDCCツールで頂点カラーを確認すると、おそらくMotionBuilderのおかしい見た目と同じようなカラー表示になっていると思うので、頂点カラーを削除して再度インポートするべし。
Laravel 5.3で環境ごとにconfigの内容を切り替える方法


* サーバ環境変数 + 環境別.envファイルを用いて、環境ごとに設定を切り替えることができる。

## アプリケーション側

### 環境別ファイルの作成

* .envをコピーして環境別ファイルを作成

	``` console
	cd /your/project/path	
	cp .env .env.development     # 開発環境用設定
	cp .env .env.test            # 試験環境用設定
	cp .env .env.staging         # 検証環境用設定
	cp .env .env.production      # 本番環境用設定
	```

* それぞれのファイルへ環境別設定を記述

## サーバ側

### 環境変数APP_ENVの設定

* Nginxの場合

	``` console
	vi /etc/nginx/conf.d/your-setting-file.conf
	```
	
	```
	server  {
		...
		
		location ~ .php$ {
			...
			
			fastcgi_param   APP_ENV development;	#追記
		
			...     	
		}
	}
	```

# 追記
* APP_ENVの設定は、おそらく.htaccessでも可能。(未検証)
Python3でslackに投稿する

pythonからslackに投稿するまでの手順をまとめます。
時間のかかる処理の完了通知や実行途中の情報（エラー等）を通知するのに便利です。

## おおまかな流れ
 - slackでIncoming Webhookの設定をする
 - pythonからIncoming WebhookのURLへpostする

## slackでIncoming Webhookの設定をする

[Incoming Webhookの設定ページ](https://my.slack.com/services/new/incoming-webhook/)へアクセスする
投稿先のチャンネルを選択して、「Add Incoming WebHooks Integration」をクリック

![スクリーンショット_2016-09-21_23_44_40.png](https://qiita-image-store.s3.amazonaws.com/0/113553/f29952c8-69dd-8bbc-f7dd-6614f5f18619.png)

Webhook URLをコピーする

![スクリーンショット_2016-09-21_23_47_46.png](https://qiita-image-store.s3.amazonaws.com/0/113553/5ed1d35a-7de2-9e76-a22b-0852974d492c.png)

「Save Settingsをクリック」

![スクリーンショット_2016-09-21_23_52_59.png](https://qiita-image-store.s3.amazonaws.com/0/113553/fe7b7cda-1fa4-d158-3109-ce6b745526ba.png)

## pythonからIncoming WebhookのURLへpostする

POSTを簡単に実装するため、slackwebをインストールする

``` sh
# pipがインストールされていない場合はインストール
$ sudo easy_install pip

# slackwebをインストール
$ sudo pip install slackweb
```

``` python:postToSlack.py
#coding: UTF-8

import slackweb

slack = slackweb.Slack(url="コピーしたWebhookのURL")
slack.notify(text="pythonからslackさんへ")

```

pythonスクリプトを実行する

``` sh
$ python postToSlack.py
```

投稿結果を確認する

![スクリーンショット 2016-09-22 0.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/113553/f13a99a9-3810-d73b-442b-4ea4532c00fe.png)


## 参考
 - [PythonでSlackに投稿する](http://qiita.com/polikeiji/items/f8fa08331bd4a12f66df])
 - [slack API - Incoming Webhooks](https://api.slack.com/incoming-webhooks)
 - [Slackにincoming webhook経由でpythonからメッセージをPOSTする](http://qiita.com/satoshi03/items/14495bf431b1932cb90b)
定期実行するwatchコマンドの使い方まとめ

watchコマンドを使うことで、指定したコマンドを定期的に実行することができます。
その使い方をまとめます。

### watchコマンドのインストール

``` sh
# Homebrewを導入していない場合はインストール
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# watchコマンドをインストール
$ brew install watch
```

### 基本的な使い方

``` sh
# COMMANDを2秒ごとに定期実行する
$ watch COMMAND
```

### オプション（一部抜粋）
実行環境によっては動作しないオプションもあるので注意。

``` sh
# 実行間隔を秒単位で変更する(-n, --interval)
$ watch -n 60 COMMAND

# 実行コマンドの結果がエラーとなった場合にビープ音を鳴らす  (-b, --beep)            
$ watch -b COMMAND

# 出力結果にカラー情報を付与する(-c, --color)
$ watch -c COMMAND

# 実行コマンドの結果に変化があった場合に変化点をハイライトする(-d, --differences)
$ watch -d COMMAND

# 実行コマンドの結果に変化があった場合に終了する(-g, --chgexit)
$ watch -g COMMAND

# 実行コマンドの結果がエラーとなった場合に終了する（-e, --errexit）
$ watch -e COMMAND

# 実行結果のヘッダーを非表示にする（-t, --no-title ）
$ watch -t COMMAND
```