OmniAICreator/Qiita-1.07M huggingface dataset:
(メモ)uGUIButtonにおけるOnClick()追加の自動化とEnumによる管理

Buttonはよく使う割にコードの追加が面倒
1.Editor上でOnClick()追加するのが面倒
2.クラスが増えがち
3.String管理は嫌い

継承とEnumで管理する。

```c#:ButtonController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonController : MonoBehaviour
{
    public ButtonController button;
    [SerializeField]
    ChildButtonController.ButttonName butName;
#if UNITY_EDITOR
    Button but;
    void Reset()
    {
        but = GetComponent<Button>();
        UnityEditor.Events.UnityEventTools.RemovePersistentListener<GameObject>(but.onClick, OnClick);
        UnityEditor.Events.UnityEventTools.AddObjectPersistentListener<GameObject>(but.onClick, OnClick, gameObject);
    }
#endif
    void Start()
    {
        //改善の余地あり
        button = GameObject.Find("Canvas").transform.Find("ChildButtonController").GetComponent<ChildButtonController>();
    }
    public void OnClick(GameObject obj)
    {
        button.Click(butName);
    }
    protected virtual void Click(ChildButtonController.ButttonName buttonName)
    {
    }
}
```
```c#:ChildButtonController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ChildButtonController : ButtonController
{
    [SerializeField]
    Object Turret;
    protected override void Click(ButttonName buttonName)
    {
        switch (buttonName)
        {
            case ButttonName.Test: TestMethod(); break;
        }
    }
    void TestMethod()
    {
        Debug.Log("TEST");
    }
    public enum ButttonName
    {
        Test
    }
}
```

使い方はButtonController.csをButtonのオブジェクトにアタッチして目的の機能のEnumを選び、Canvas直下にChildButtonControllerクラスを持つChildButtonControllerを作成しておく。
以上により自分でOnClick()追加せずに、2つのクラスでEnumで管理することができる。

参考文献
[UnityのuGUIでButtonクリック時のスクリプト呼び出しを共通化しよう！](http://fantastic-works.com/archives/148)
[エディター操作で登録するのが面倒なボタンのクリックイベントを、スクリプトで登録する - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2015/05/31/233000)
var_dumpの代わりにedumpを使って簡単デバッグ＆効率良くデータの内容を把握する（PHP）

PHP等ではPrintデバッグと呼ばれる方法で値を表示してデバッグする方法が手軽で早くデバッグ出来ます。

```php:sample.php
$val = "値";
print $val;
```

またはvar_dumpを使う方法です。配列の内容を確認するにはこちらを主に使います。

```php:sample.php
$arr              = array();
$arr["greetings"] = "Hello world!";
$arr["T or F"]    = true;
$arr["check_val"] = null;
$arr["empty"]     = "";
$arr["number"]    = 100;

$arr2             = array();
$arr2[0]          = "I am an array.";
$arr2[1]          = "You can put various types of data.";
$arr["array"]     = $arr2;

var_dump($arr);
```

var_dumpでの値表示結果は以下に。
![capture-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/175742/4b357a42-5790-5c72-303d-63e74e58a576.jpeg)


printやvar_dumpは非常に簡単で手軽なのですが、Web開発においてはページが崩れてしまう等の課題があります。また一方で本格的なxdebug等を使う方法もありますが、サーバー環境によっては使えない、インストールしないといけないので手間が掛かる等の課題が多々あります。

**そこでvar_dumpよりも高機能で本格的なデバッグソフトウェアのような手間のかかる準備が不用なedumpを使いましょう。サーバーには特に何かをインストールする必要はありません。**
下記のようなビジュアルで値の確認が出来ます。

```php:sample.php
$arr              = array();
$arr["greetings"] = "Hello world!";
$arr["T or F"]    = true;
$arr["check_val"] = null;
$arr["empty"]     = "";
$arr["number"]    = 100;

$arr2             = array();
$arr2[0]          = "I am an array.";
$arr2[1]          = "You can put various types of data.";
$arr["array"]     = $arr2;

// edump関数の実行例
_v($arr); 
```

実行後ブラウザにはこのように結果が表示されます。

![capture-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/175742/15b89d76-b4cf-5c25-3fb9-31afbb3a6cd7.jpeg)


edumpを使うとメインのWebサイトのウィンドウではなくて、別のビューワーウィンドウにデバッグ中の値が表示されます。またvar_dumpとは違い、表示が綺麗に整形され、迅速に内容把握が出来ます。またGoogle ChromeやFireFoxには開発者ツールにedumpの機能が追加されるプラグインが提供されていて、インストール後は1つのウィンドウの中でWebサイトの表示とデバッグの値を同時に確認出来ます。
![capture-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/175742/eaaefc42-9017-2cbd-1f5c-8a1592022822.jpeg)

**効率の良いプログラム作成のコツは効率の良いデバッグ作業です。効率の良いデバッグ作業は「効率の良いプログラム内部での状況把握です」内部状況を迅速に把握する為には、ビジュアル性が最終的な効率化に結びつきます。**

edumpを使えばvar_dumpの気軽さで、効率的なデバッグ機能を使えます。
ただしあくまで簡易デバッガーなのでxdebugのようにプログラムを途中で一時停止するような本格的な機能は使えません。

■簡易デバッガー：edump
http://www.edump.net/

■チュートリアル
http://www.edump.net/res/GettingStartedWithEdump_ja.pdf
Python2 / numpy > ファイルの特定の列だけを別のファイルの列データで置き換える > numpy.c_を教えていただきました

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

Python2の環境で実行。

## ファイル構成

### input.tab

tab区切りのファイル。

```
x y z E v1 v2
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
```

### result.csv

```
3, 1, 4, 1, 5
3, 1, 4, 1, 5
3, 1, 4, 1, 5
```

x,y,z,v1,v2の値を格納しているとする。

### output.tab

以下のファイルを作りたい。

```
x y z E v1 v2
3.000 1.000 4.000 4.000 1.000 5.000 
3.000 1.000 4.000 4.000 1.000 5.000 
3.000 1.000 4.000 4.000 1.000 5.000 
```

- E以外の値をresult.csvの値で置き換えたい
- 少数桁数は任意

## code v0.1

Python3で使う`*`がPython2では使えない。
色々試して以下のベタ書きになってしまった。

```merge_170503.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np

tabdat = np.genfromtxt('input.tab', delimiter=' ')
csvdat = np.genfromtxt('result.csv', delimiter=',')

for aline in zip(tabdat[1:], csvdat):  # 1:skip title line
	for idx in range(0, 3):
		print("%.3f" % aline[1][idx], end=' ')
	print("%.3f" % aline[0][3], end=' ')
	for idx in range(3, 5):
		print("%.3f" % aline[1][idx], end=' ')
	print()

```

```
$ python merge_170503.py 
3.000 1.000 4.000 4.000 1.000 5.000 
3.000 1.000 4.000 4.000 1.000 5.000 
3.000 1.000 4.000 4.000 1.000 5.000 
```



Python3で実行しようとすると以下の問題になる。環境整備を考えないといけない。

> No module named numpy

### 教えていただいた事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/db2b2e5296a93671af0c/#comment-e7293157d74c08898909)にて`numpy.c_`を使ったすっきりしたコードを紹介いただきました。

情報感謝です。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.c_.html

numpy.c_で検索すると、Qiitaの記事も見つかりました。
[Numpyで行列の連結](http://qiita.com/sotetsuk/items/d0e73afdcffdc8ac3e6b)
[NumPy の配列操作 (2)](http://qiita.com/ynakayama/items/3250452949102840e624)
Android ToggleButtonの状態変更

# 1.トグルボタンの状態をプログラムで変更する場合の注意点 
プログラムから意図的にトグルボタンの状態を変更する時setTexOn("ON")や
setTexOFF("OFF")だけやっても状態は変わりません。
必ず最後に
<pre> tb1.setChecked(true);
 tb1.setChecked(false);
</pre>もやる必要あり。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/2c356302-9d78-ea3e-09a4-f716c6b0206b.png)
これでプログラムを実行すると。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/df323ee3-f62a-b8fb-14d5-78fbb4954ec6.png)
このようにONNNという記載になってくれません。。

しかし、setChecked()を実行してやれば。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/d9a68c46-8b94-c634-e290-34e5cfbe8b3f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/17f95ef6-8a90-6c7e-36e8-df348bf2c1fb.png)
こんな感じに言うことを聞いてくれます。ここで補足ですが、setCheckedはボタン押下のリスナーではやらなくても大丈夫です。

ボタンの状態１つ変更するにもAndroidは大変なのであります。
<(｀･ω･´)

いじょ。
Linux/Windows間での鍵フォーマット相違について

Linux（PHP)系のプログラムとMicrosoft(.Net)系のプログラムとで暗号化通信を行おうとした際に、鍵のフォーマット相違があり、一筋縄では行かなかったので、その原因と対策をざっくりメモ。

# DERとPEM

ざっくり書くと、DERはバイナリデータ、PEMはBase64でエンコードしたデータ。
どちらもASN.1という構造体でデータは構成されている。
ｃｆ. http://qiita.com/kunichiko/items/12cbccaadcbf41c72735

# PEM形式の秘密鍵の種類

> ○OpenSSH形式
　　OpenSSHのフォーマット。秘密鍵のヘッダーに以下の文字列。
　　-----BEGIN RSA PRIVATE KEY-----
○SECSH（ssh.com）形式
　　オリジナルのSSHのフォーマット。OpenSSHはssh1.2.12から派生。
　　秘密鍵のヘッダーに以下の文字列。
　　---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
○PuTTy形式
　　PuTTyのフォーマット。秘密鍵のヘッダーに以下の文字列。
　　PuTTY-User-Key-File-2: ssh-rsa
引用元　http://d.hatena.ne.jp/machua/20110809/1312899353

# Linux系/Microsoft系での鍵フォーマット相違

DERとかPEMは、Linux系で利用されている鍵方式。Microsoft系は直接これらの鍵形式を扱えない（ASN.1ではなくPUBLICKEYBLOBというバイナリ構造体を使ってるっぽい）ので、Linux系／Microsoft系（.netとか）間で暗号化を行う場合は鍵フォーマットをどちらかに揃えてあげる必要がある。

cf. C#と.Net Frameworkを使ってPem形式の秘密鍵や公開鍵をXML形式にして暗号化や署名する方法
http://www.k-karakuri.com/entry/2017/02/03/C%23%E3%81%A8_Net_Framework%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6Pem%E5%BD%A2%E5%BC%8F%E3%81%AE%E7%A7%98%E5%AF%86%E9%8D%B5%E3%82%84%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92XML%E5%BD%A2%E5%BC%8F%E3%81%AB%E3%81%97

Windows上で、証明書や秘密鍵をPEM形式に変換してエクスポートする (1/2)
http://www.atmarkit.co.jp/ait/articles/1602/05/news039.html
日本語プログラミング言語 Mind Version 8 を改訂しました(04版)

日本語プログラミング言語 Mind Version 8 をWindows, Linux共に 8.00.04 版に改訂しました。
改訂内容の詳細とダウンロードは以下からお願いします。

http://www.scripts-lab.co.jp/mind8download/download.html
mechanizeで404とか500エラーのページどこいった？

mechanizeで404や500のようなMechanize::ResponseCodeErrorをはいた時に404や500エラーのページを取得したかったという話


考慮されたWebサービスなら404はこんな感じのレスポンスを返すはずです。
##Not Found
<img width="1132" alt="スクリーンショット 2017-05-03 8.50.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/168257/85439efe-125e-a732-146f-ca09f41eec2a.png">

このページを取得して404の際の例外処理をしたかった。
ということで下記のstack orverflowを参考に進めてみました。
http://stackoverflow.com/questions/31408547/ruby-httpnotfound-error-with-mechanize

上記stack overflowで掲載されていたのは下記のようなコード

```ruby
require 'mechanize'
require 'httparty'

@client = Mechanize.new()

url = 'http://d-ichihara.hatenablog.com/'

begin
  result = @client.get(url)
rescue Mechanize::ResponseCodeError => e
  redirect_url = HTTParty.get(url).request.last_uri.to_s
  result = @client.get(redirect_url)
end
```
ただこちらのstack overflowに関して言うと僕のやりたいことと前提が異なるようです。
404の例外処理を行いたいのは同じですが、どうやらページは存在するのにたまに404ってでるからどうしよう?と言った感じでした。
なので簡単に言うと、再度URLを取得してmechanizeで取得し直せばいいじゃん?ということでした。

じゃあ404ページを取得したい自分はどうすればいいの?

##結論
rescueした**e**にすべて持っていました。
ということで修正し直したコードが下記
故意に404ページへとばすためurlを`/test`としてあります。

```ruby
require 'mechanize'

@client = Mechanize.new()

url = 'http://d-ichihara.hatenablog.com/test'

begin
  result = @client.get(url)
rescue Mechanize::ResponseCodeError => e
  puts e.page.body
end
```
##取得結果
<img width="487" alt="スクリーンショット 2017-05-03 9.33.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/168257/16f50bb5-111d-792c-05e6-d81a2f3bfb9d.png">

うまくNot Foundのページが取得されました。
あとは、`e.page.code`や`e.response_code`でコード毎に分けたり、`e.page.body`の文字列を参照するなりしてうまく例外処理できれば解決です。

冷静に考えてみれば、`Mechanize::ResponseCodeError`でrescueしているのだからeにresponseを持っていることはすぐに分かるはずでした...
Railstutorial 4版　覚書 第５章

結構やってしまうので、初心者の方には有用な情報になると思う。

**rails sを中断するとき、cotr+cのつもりがcotr+x、cotr+zした場合**

```
ps aux | grep puma
```
とすると

```
username  13170   0.0  0.2  2706492  15960 s039  T   6:32PM   0:05.66 puma 3.4.0 (tcp://localhost:3000) [sample_app]  
```

上から、プロセス番号を見つけて

```
kill -9 13170
```



##Railsのことで個人的なまとめ

- 共通部分はパーシャルファイルに
- Railsらしい書き方　**名前付きルートを使う**
 
```
Home   /       root_path
About  /about  about_path
```


- 変換のされ方

```
root_path  ->  '/'
root_url   ->  'http://www.example.com'
```

- ルーティングを変更

```config/routes.rb 
get 'static_pages/about' #railsが差し込むもの

get '/about', to: 'static_pages#about' #'/about', to: 追記
                                       #  / => #
```

- Applicationヘルパーのテストの方法


1.ActiveSupport::TestCaseクラスにApplicationHelperモジュールをインクルード

```test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
.
.
.
class ActiveSupport::TestCase
  fixtures :all
  include ApplicationHelper # インクルードする
  .
  .
  .
end
```

2.インテグレーションテストでヘルパーに作ったメソッドを使う

```test/integration/Xxxx_Xxxx_test.rb
 # rails generate integration_test Xxxx_Xxxx で作成

  test "layout links" do
    get contact_path
    assert_select "title", full_title("Contact")
  end
```

3.test/helpers/にapplication_helper_test.rbファイルを作成しテストを書く


```test/helpers/application_helper_test.rb

require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  test "full title helper" do
    assert_equal full_title,         "Ruby on Rails Tutorial Sample App"
    assert_equal full_title("Help"), "Help | Ruby on Rails Tutorial Sample App"
  end
end
```
暗号化方式／アルゴリズム／パディング／ブロック化のまとめ

あるAPIと暗号化した通信を行う際に、API側から指定された暗号化方式について「？？？」となったので、暗号化に関する用語と概念の自分用まとめ。

# 暗号化の種類

暗号化には共通鍵暗号、秘密鍵暗号の2種類がある。

|暗号方式|主なアルゴリズム|特徴|
|-----------------|------------------|------------------|
|共通鍵暗号|AES、RC4、DES、3DES|暗号化と復号化に同じ鍵を利用|
|秘密鍵暗号|RSA、ElGamal|暗号化と復号化で異なる鍵を利用|

このうちAES,RSAがよく使われる。
またハイブリット方式というものもよく使われる（SSLとか）。

> 共通鍵暗号では、処理時間が高速なのですが、第三者に鍵の情報が分かってしまうとデータが復号されてしまうという問題があります。また、公開鍵暗号では、安全に鍵の情報を保持できるのですが、処理時間が非常に遅いという問題があります。そこで、これら2つの方式の利点を兼ね備えたハイブリッド方式という手法があります。ハイブリッド方式では、共通鍵を安全に渡すために、鍵交換の際には公開鍵暗号を使用して、実際のデータの暗号化には共通鍵を使用します。これにより鍵は安全に配布でき、高速処理できます。
> http://www.infraexpert.com/study/security4.html

# ブロック単位での暗号化

AESにせよRSAにせよ、通常、暗号化は鍵のサイズと同じバイト長を１ブロックとして暗号化する。1024ビットの鍵ならば128バイトを1ブロックとして暗号化する。
※「ブロック暗号」といった場合は共通鍵暗号の話っぽい

> ブロック暗号（ブロックあんごう、英語: Block cipher）とは、共通鍵暗号の一種で、固定長のデータ（ブロックと呼ぶ）を単位として処理する暗号の総称である。　cf. https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E6%9A%97%E5%8F%B7

# パディングモード（パディング方式）

分割する時にブロックで綺麗に割り切れない場合は、パディングで穴埋めする。

|パディングモード|特徴|
|-----------------|------------------|
|PKCS#5 とか PKCS#7|AESと組み合わせることが多い|
|Optimal Asymmetric Encryption Padding（OAEP）|RSAと組み合わせることが多く、その場合はRSA-OAEPと呼ばれる。|

cf. http://pentan.info/doc/block_cipher.html#anc_padding

# ブロック暗号　暗号化モード（暗号利用モード）

ブロック暗号の方式なので、共通鍵暗号（AESなど）の時に出てくる用語

|暗号化モード|特徴|
|-----------------|------------------|
|ECB|ブロックに分割しそのまま暗号化。そのため鍵と暗号対象データが同じであれば、同じ暗号データになる。|
|CBC|最初のブロックについては初期ベクトル（IV）と暗号対象データをXOR計算した結果を暗号化する。次のブロックについては、前のブロックとそのブロックをXOR計算した結果を暗号化する。そのため、元のデータと鍵が同じでも一意の暗号データになりにくい。|

cf. http://qiita.com/hibara/items/c9096376b1d7b5c8e2ae

その他の種類については https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89

# 暗号化の用語が分からなければ

下記がめちゃめちゃ良くまとまっててわかりやすい

https://www.tohoho-web.com/ex/crypt.html#encryption_hash
オブジェクトの分割代入の実験：「分割代入する変数の順番入れ替え」「既定値が使われるケース」

ちょっと気になったところを実験

```js
'use strict'
// 1
{
  // オブジェクト
  const a = {
    b: 1,
    c: 2,
    d: 3
  };

  {

    // 1-1 代入する値の順番を入れ替えるどうなる？
    const { c, d, b } = a;
    console.log('1-1:', b, c, d);
    // 1 2 3 
    // ちゃんとプロパティ名と一致する変数に値が代入される
  }

  // 1-2じゃこれは？
  {
    const { b: c, c: d, d: b } = a;
    console.log('1-2:', b, c, d);
    // 3 1 2 
  }
}

// 2
{
  const a = {
    b: 1,
    c: 2
  }
  // 関数の引数としての分割代入
  function f({ b, c, d = 3 }, sectionNo) {
    console.log(`${sectionNo}:`, b, c, d);
  }
  f(a, '2-1');
  // 1 2 3
  // 未定義のプロパティは既定値が代入される

  a.d = undefined;
  f(a, '2-2');
  // 1 2 3
  // undefinedだと既定値が代入される

  a.d = null;
  f(a, '2-3');
  // 1 2 null
  // nullだと既定値が代入されない。この挙動は普通の変数の既定値と同じ。
}
```

以上
Python / numpy > list > 与えられた行列から任意の位置の列リストを取り出す > Elist = src_data.T[3:] / 次元数による使い分け / PEP 3132 -- Extended Iterable Unpacking 

与えられた行列から、列リストを取り出す。

内包表記を使ってみた。

http://ideone.com/Vj9pxS
(Python3)

```py
import numpy as np
amatrix = np.array([[3, 1, 4], [1, 5, 9], [2, 6, 5]])


l1, l2, l3 = [ amatrix[:, idx] for idx in range(0,3) ]
print(l1)
print(l2)
print(l3)
```

```txt:run
[3 1 2]
[1 5 6]
[4 9 5]
```

### 教えていただいた事項

@shiracamus さんに読みやすい実装を教えていただきました。
情報感謝です。

@knoguchi さんの[コメント](http://qiita.com/7of9/items/5280690c9777d36a847a/#comment-e70ae6ee49bb28680640)にて次元数による使い分けを教えたいただきました。
情報感謝です。

@shiracamus さんの[コメント](http://qiita.com/7of9/items/5280690c9777d36a847a/#comment-38d7fddb05e96da453f7)にてPEP 3132について教えていただきました。
情報感謝です。
python での　スレッドの使用例

```python3:thread01.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
# --------------------------------------------------------------------
import threading
import time
import sys
# --------------------------------------------------------------------
def ff01 (aa,bb,cc):
	sys.stderr.write("*** ff01 *** start ***\n")
	for it in range (3):
		print (str (it) + "\t" + aa + "\t" + bb + "\t" +cc)
		it += 1
		time.sleep(1)
	sys.stderr.write("*** ff01 *** end ***\n")
#
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
th1 = threading.Thread(target=ff01,args=("hello","Good","Morning"))
th1.setDaemon(True)
th1.start()
#
try:
	icount = 0
	while True:
		sys.stderr.write("icount = %d\n" % icount)
		time.sleep(3)
		icount += 1
except KeyboardInterrupt:
	print ("STOP")
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

実行結果

```text
$ ./thread01.py 
*** 開始 ***
*** ff01 *** start ***
0	hello	Good	Morning
icount = 0
1	hello	Good	Morning
2	hello	Good	Morning
icount = 1
*** ff01 *** end ***
icount = 2
icount = 3
icount = 4
icount = 5
^CSTOP
*** 終了 ***
```

次の環境で動作を確認
>Arch Linux (4.15.15-1-ARCH)
Visual Studio Code備忘録

# Visual Studio Code備忘録

以降では「Visual Studio Code」を「vscode」と略します。

## 表示しているファイル内のシンボルの一覧を表示する

vscodeでは、関数やクラス、メソッド等を「シンボル」として認識します。

以下のキーを押すと、表示しているファイル内のシンボルの一覧が表示されます（関数やクラス、メソッドの一覧が表示されます）。

| mac                | windows          |
|--------------------|------------------|
|command + shift + o | Ctrl + Shift + o |

上述のキーを押した後、**「:」をタイプすると、シンボルがクラスやメソッド等のカテゴリごとにソートされます。**

一覧からシンボルを選択し、Enterキーを押すとそのシンボルに移動します。

## シンボル名で検索する

以下のキーを押した後、シンボルの名前の一部をタイプすると、そのタイプした文字列に合致するシンボルをプロジェクト内のファイルの中から検索し、該当するシンボルの一覧が表示されます。

| mac                | windows  |
|--------------------|----------|
|command + t         | Ctrl + t |

一覧から表示したいシンボルを選択し、Enterキーを押すとそのシンボルに移動します。

## 元にいた場所に戻る

各種ナビゲーション系の操作で移動した後、以下のキーを押すと元にいた場所に戻ってくることができます。

| mac      | windows |
|----------|---------|
|ctrl + -  | Alt + ← |

## ファイル名でファイルを検索
指定した文字列をパスに含むファイルの一覧を表示します。

| mac       | windows |
|-----------|---------|
|command + p|         |

## サイドバー関連

サイドバーの表示、非表示を切り替えます。(View: Toggle Side Bar Visiblity)

| mac       | windows |
|-----------|---------|
|command + b|         |

サイドバーにフォーカスします。(View: Focus into Side Bar)

| mac       | windows |
|-----------|---------|
|command + 0|         |
技術英語 > For a change of air / For a change  / need some fresh air

技術英語の記事のうち、適度に忘れたものを３個ずつ復習している。

1. 復習したい記事３個をブックマークする
2. １つのフレーズに注目する (例: use it for prognostics)
3. 他の作業で集中力がとぎれた時に「use it for prognostics」のようにフレーズが思いだせるかどうか
   - 思い出せたらxを１つ付ける
   - 思い出せない場合、覚え方を検討する
4. xが3つそろったら、そのフレーズはブックマークから消す
5. 手順2から手順4を3つ分繰り返す

<hr>
「集中力がとぎれた時に」関連で思い出したのは以下のフレーズ。
For a change of air, 

検索すると「転地」という意味で使われる例が見つかる。「気分転換」という例をEnglish Journalで16年ほど前に見たような気がする。
(But, I am not sure if my memory is correct.)

http://eikaiwa.dmm.com/uknow/questions/2083/
> 1. for a change

...

>I need some fresh air.
virtualenvの使い方


virtualenv環境の作成

```
$ pyenv virtualenv (pyenvのversion) (virtualenv-name)
```

確認

```
$ pyenv versions
```

環境の切り替え

```
# システム全体
$ pyenv global (virtualenv-name)

# カレントディレクトリのみ
$ pyenv local (virtualenv-name)
```

環境のアンインストール

```
$ pyenv uninstall (virtualenv-name)
```
pep8に準拠する


参考：
[Pythonのコーディング規約PEP8に準拠する](http://qiita.com/ynakayama/items/8616f4c0c6e372de9a42)

[Pythonのスタイルガイドとそれを守るための各種Lint・解析ツールまとめ！](http://blog-ja.sideci.com/entry/python-lint-pickup-5tools)

インストール：

```
pip install pep8
pip install pyflakes #pythonの論理的なエラーのみを検出
```

pep8を実行

```
$ pep8 [ファイル名]
```

問題箇所を表示

```
$ pep8 --show-source (ファイル名)
```

直し方の説明を見る

```
$ pep8 --show-pep8 (ファイル名)
```

pyflakesを実行

```
$ pyflakes (ファイル名)
```
pickleでオブジェクトをファイルに保存する


[ライブラリ：pickle](http://www.lifewithpython.com/2013/05/pickle.html)

```
import pickle
```

オブジェクトをファイルに保存する

```python
mydict = {1: 'Pochi',
          2: 'Taro',
          3: 'Jiro'}
with open('xxx.dump', 'w') as f:
    pickle.dump(mydict, f)
```

オブジェクトをファイルから読み出す

```python
with open('xxx.dump', 'r') as f:
    mydict_load = pickle.load(f)
print mydict_load  # {1: 'Pochi', 2: 'Taro', 3: 'Jiro'}
```
2ch.sc 公式 p2 の動作を Chrome 拡張で改造する (2)


## 概要

- p2 で不要なスレをスレ一覧から非表示にする機能を実装します。

### 前回

- [2ch.sc 公式 p2 の動作を Chrome 拡張で改造する (1) - Qiita](http://qiita.com/yousorojp/items/7df9f94f54b4a6453e93)

## スレッド一覧の改造

前回、ゴミ箱ボタンの表示だけ追加しました。今回、ボタン押下時の動作を追加してみます。

![スクリーンショット 2017-05-01 23.26.31.png](https://qiita-image-store.s3.amazonaws.com/0/170980/75bae7dd-8631-c916-431b-35b328356177.png "スクリーンショット 2017-05-01 23.26.31.png")

### スレッド非表示ボタンのイベントハンドラの追加

前回も貼りましたが、ページはこんな感じに作られています。tr 毎に td > span を追加し、ボタンとしました。

![スクリーンショット 2017-05-01 23.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/170980/9c4ff3db-a4d8-8599-bdc8-dbbcfd7ab705.png "スクリーンショット 2017-05-01 23.14.45.png")

どのボタンが押されたのか識別・記録するため、span に id を設定します。各スレッドが ID を持っているので、それをそのまま使いたいと思います。

スレッド ID は td.tl か td.tl2 の下の a タグの URL 内に含まれているので、それを取り出します。

- class の tl と tl2 は、背景色の違い(白か青)だと思います。(詳しくは見ていないです。)
- コードでは a:last としていますが、これは新着スレの場合には a タグがもう一つあるためです。:last にしておけば、同じ種別の a が取得できます。


```javascript:contentscript.js
$(function() {
  $('tr:not(.tableheader)').each(function() {
    var url = $(this).find('.tl>a:last, .tl2>a:last').attr('href');

    if (typeof url !== 'undefined') {
      var result = url.match(/&key=([^&]+)&/);
      var threadId = result[1];

      $(this).append('<td class="t"><span id=\'' + threadId + '\'>🗑</span></td>');
    }
  });
});
```

拡張をリロードして、ページを再読み込みすると、以下のように id が設定されます。

![スクリーンショット 2017-05-03 3.19.02.png](https://qiita-image-store.s3.amazonaws.com/0/170980/04d405b1-605a-f781-726d-2667e9ff6b78.png "スクリーンショット 2017-05-03 3.19.02.png")

その id に対して、click イベントの処理を追加します。

処理内容は id(span) がクリックされた際に、親(td)の親(tr)を非表示(hide)します。

```javascript:contentscript.js
$(function() {
  $('tr:not(.tableheader)').each(function() {
    var url = $(this).find('.tl>a:last, .tl2>a:last').attr('href');

    if (typeof url !== 'undefined') {
      var result = url.match(/&key=([^&]+)&/);
      var threadId = result[1];

      $(this).append('<td class="t"><span id=\'' + threadId + '\'>🗑</span></td>');
      
      $('#' + threadId).click(function() {
        var id = $(this).attr('id'); // span

        var tr = $(this).parent().parent(); // span > td > tr
        tr.hide();
      });
    }
  });
});
```

ゴミ箱をクリックすると、そのスレッドが消えます。スタイルを付け直さないので、ストライプ表示が崩れていますが、それは取り急ぎ放置しておきます。

クリックした状態は保存しないので、ページをリロードすると前に非表示にしたスレッドも再度表示されます。

- クリック前

![before.png](https://qiita-image-store.s3.amazonaws.com/0/170980/162b7ad6-7294-79aa-e98a-dc311bb04574.png "before.png")

- クリック後

![after.png](https://qiita-image-store.s3.amazonaws.com/0/170980/f63af5ea-d048-288a-c7a8-b6d3cb4e8d12.png "after.png")

## まとめ

- すいません。ただの jQuery 処理で、Chrome 拡張要素がなかったですね。
- 次はクリックされたボタンの id をストレージに保存して、ページロード時にそれを読み込むようにしたいです。
cssCombのハマりどころ

# 概要
最近いろいろと設定方法が変わっていたのでメモ。

# プロジェクトルートもしくはそれ以上の階層に設定ファイルを置く
- `.csscomb.json`という設定ファイルを作成して配置する。
- 1つのファイルを作っておいて統一的に利用する場合は1つを最上層においておけばよい。
- プロジェクトごとに作りたい場合は各プロジェクトルートに置く。

# プロパティをアルファベット順に並べたい場合
- `sort-order: ["..."]`の記述を追加する。
- 公式サイトの「buildConfig」から作成すると、この記述が抜けている。

# Atom
Atomで使う話
## 数種類同様のパッケージがある
- [このパッケージ](https://atom.io/packages/css-comb)が、上記設定で並び順も適用でき、ちゃんと動く。
- ショートカットは`cmd + alt + C`。
第28回基準値を超えるシェル芸勉強会

例のごとく出勤だったので不参加。

問題だけ解答します。動画はまだ見てない。

# 問題

[【問題のみ】第28回基準値を超えるシェル芸勉強会 – 上田ブログ](https://blog.ueda.asia/?p=9602)

# Q1

最初から飛ばしすぎな感じがあります。
超えていたのは初心者の基準値だったようです。

```console:Q1
$ cat contents.tex \
    | awk '/\\begin{figure}/,/\\end{figure}/{print}' \
    | grep -E 'includegraphics|caption' \
    | sed -r -e 's/.*\{//' -e 's/\}//' \
    | xargs -n 2 \
    | awk '{print $2,$1}'
```

# Q2

おなじみの空白行を残して改行を省く処理 @@@@@@@@@

```console:Q2
$ grep -vE '\%' contents.tex \
     | sed -re 's/^$/@@@@@@/' \
     | tr -d '\n' \
     | sed -re 's/@@@@@@/\n/g' \
     | sed -re '/^\\section/,/^\\section/d' \
     | sed -rne '1s/。/&\n/gp' \
     | sed -rne '1p'
```

# Q3

難解でした。ネストの深さを覚えておく問題だったので再帰したかった。

```console:Q3
$ cat contents.tex \
    | tr -d '\n' \
    | sed 's/[{}]/\n&\n/g;s/\\footnote/\n&/g' \
    | awk '
        BEGIN {S=0;T=0}
        /^\\footnote/ {print; T=1;}
        /{/ {if(T){S++;}}
        S>0 {print}
        /}/ {if(T){S--;} if(!S){T=0}}
        ' \
    | tr -d '\n' \
    | sed 's/\\footnote/\n&/g' \
    | grep footnote
```

# Q4

珍しくファイルを出力する問題でしたがまだ簡単。

```console:Q4
$ cat contents.tex \
       | awk '
        /\\section/{ gsub(/\\section{|}/,"",$0);gsub(/ /,"_",$0);TITLE=$0; next}
        TITLE{print $0 > TITLE}'
```

# Q5

一般化しなくても良いということで。`grep -C n` を使ってみました。

```console:Q5
$ cat contents.tex \
    | mecab \
    | grep 座標 -C1 \
    | grep -E '名詞|--' \
    | awk '{print $1}' \
    | tr -d '\n' \
    | sed 's/--/\n/g' \
    | grep '.座標系$' \
    | sort -u
```

# Q6

意味分からなすぎて悶絶した。

```console:Q6
$ cat contents.tex \
    | awk '
        BEGIN {W=0}
        /^\s*%/ { print; next }
        /^$/ {W=1;print;next}
        /^\\(sub)*section|^\\begin|^\\end/ {W=0}
        W {W=0;print "　" $0;next }
        {print}
    '
```

# Q7

Q6 で悶絶したので慣れました。

```console:Q7
$ cat contents.tex \
    | awk '
    /^\s+|^$|^%/ {if(buf){print buf}; buf = ""; print; next}
    /begin|end|section/ {if(buf){print buf}; buf = ""; print; next}
    {buf = buf $0}
    '
```

# Q8

Q7 と同様、吹っ切れたので簡単でした。

```console:Q8

$ cat contents.tex | grep section | grep -v % \
    | awk '
    /%/ {next}
    /\\section/ {a+=1;b=0;c=0}
    /\\subsection/{b+=1;c=0}
    /\\subsubsection/{c+=1}
    /section/{
        label=a
        if(b){label=label "." b}
        if(c){label=label "." c}
        gsub("\\\\label.*", "")
        gsub("}$","")
        gsub("\\\\(sub)*section{","")
        print label " " $0;
    }
    '
```
Travis CIとSlackの連携

[iOSアプリ開発でのTravis CIを試す](http://qiita.com/matsuda/items/b0ea11956ec8b23eda4d)の続きで`Travis CI`と`Slack`を連携させる。
[SlackでTravisCIからの通知を受け取る](http://qiita.com/kitaro_tn/items/c3118747fbd14012225e)を参考にそのままだが備忘録として残しておく。

## Slackでの設定

1. アカウント名をクリックして表示されるメニューから`Apps & integrations`を選択
2. `https://xxx.slack.com/apps`のフォームから`travis`でインクリメントサーチ結果として表示される`Travis CI`を選択
3. installボタンを押下
4. `Post to Channel`でchannelを選択して`Add Travis CI integration`ボタンを押下

## Travis CI側の設定

「Browse Apps > Travis CI > Edit configuration」の「Setup Instructions」をもとに設定。
表示されている内容（Token）をそのまま`.travis.yml`に記載するとセキュリティに十分でないので、[Travis CI command line client](https://github.com/travis-ci/travis.rb)を利用して認証情報を暗号化する。

### install

```
$ gem install travis --no-rdoc --no-ri
```

### login

特に必要ない？
参考サイトに記載があったので実行

```
$ travis login
We need your GitHub login to identify you.
This information will not be sent to Travis CI, only to api.github.com.
The password will not be displayed.

Try running with --github-token or --auto if you don't want to enter your password anyway.

Username: <username>
Password for <username>: ********
Successfully logged in as <username>!
```

### Encrypting your credentials

```
$ travis encrypt "<team>:<token>" --add notifications.slack
Detected repository as {github repository}, is this correct? |yes| yes
```

もし`fork`したプロジェクトだったり複数のリポジトリがあって一つのリポジトリを特定できない場合だったり？した場合は、明示的にリポジトリを指定する必要がある

```
$ travis encrypt "<team>:<token>" --add notifications.slack -r accountName/repoName
```

### .travis.ymlの設定

上記の暗号化コマンドを実行すると`.travis.yml`に以下の項目が追記される。
しかも空行やコメントが削除された。  

```.travis.yml
...
notifications:
  slack:
    secure: Eywg....
```

ちなみに特に暗号化コマンドを実行するディレクトリの指定はなく、たまたまプロジェクトルートで暗号化コマンドを実行したけど、適当なディレクトリだとしても追記されるんだろうか？

### 通知結果

![travisci-slack.png](https://qiita-image-store.s3.amazonaws.com/0/1057/7556f85c-38c2-fd2d-7890-70eb62e1b4cb.png)

## 参考

* [SlackでTravisCIからの通知を受け取る](http://qiita.com/kitaro_tn/items/c3118747fbd14012225e)
* [Travis CIのbuild結果をSlackに通知する](http://qiita.com/vmmhypervisor/items/b6cd3f8db7b434fbb933)
Rails5でクレジットカード決済サービス pay.jpのgemを使ってみた(定期課金)

サンプル: https://github.com/eccentricyan/payjp-ruby-sample
間違いがありましたら、ご指摘ください。mm
<a href="https://gyazo.com/eaebb328e473f2cf453f3c232455b2ca"><img src="https://i.gyazo.com/eaebb328e473f2cf453f3c232455b2ca.gif" alt="https://gyazo.com/eaebb328e473f2cf453f3c232455b2ca" width="548"/></a>
## sampleコードについて
支払いボタンの表示, userにcustomer_id(顧客ID)がある場合、再度支払い情報を入力しない

```app/views/items/show.html.erb
<%= form_for(Order.new, url: item_orders_path(@item)) do |f| %>
    <% if @user.customer_id %>
    <%= f.submit "購読する" %>
    <% else %>
    <script src="https://checkout.pay.jp/" class="payjp-button" data-key="pk_test_0383a1b8f91e8a6e3ea0e2a9"></script>
    <% end %>
<% end %>
```

顧客情報取得

```app/controllers/orders_controller.rb
if customer_id = @user.customer_id
  customer = Payjp::Customer.retrieve(id: customer_id)
else
  customer = Payjp::Customer.create(card:payjp_token)
  @user.customer_id = customer.id
  @user.save!
end
```

プラン情報取得(プランIDはアイテムIDと購読期間(毎月month、毎年yearなど)で作成)

```
plans = customer.subscriptions.data.collect(&:plan).collect(&:id)
plan_id = "#{@item.id}_#{@item.interval}"
if plans.include?(plan_id)
  plan = Payjp::Plan.retrieve(id: "#{@item.id}_#{@item.interval}")
else
  plan = Payjp::Plan.create(id: "#{@item.id}_#{@item.interval}", amount: "#{@item.price}", interval: "#{@item.interval}", currency: "jpy")
end
```

定期課金

```
subscription = Payjp::Subscription.create(customer:customer.id, plan: plan.id)
```

ユーザー情報更新

```
update_role(subscription)
def update_role(subscription)
  if subscription.status == "active"
    @user.role << "#{@item.interval}_subscribed"
    @user.role = @user.role.uniq
    @user.save!
  else
    @user.role.delete("#{@item.interval}_subscribed")
    @user.save!
  end
end
```

ユーザー情報更新rake(whenever gem で毎日実行する)

```lib/admin.rake
namespace :admin do
  desc 'refresh user admin'
  task :refresh => :environment do
    Order.gt(current_period_end: Time.now).each do |order|
      subscription = Payjp::Subscription.retrieve(id: order.subscription)
      if subscription.status == "active"
        order.current_period_end = Time.at(subscription.current_period_end)
        order.save!
      else
        user = order.user
        user.role.delete("#{order.item.id}_#{order.item.interval}")
        user.save!
      end
    end
  end
end
```

参考:
https://pay.jp/docs/api/#subscription-定期課金
http://blog.pay.jp/entry/2016/11/14/181023
https://github.com/payjp/payjp-ruby
プロキシ環境下でemergeを使う

家でInstallbattleしたgentooを学校のプロキシ下で使おうとして少し嵌ったので。
##環境変数の設定
とりあえず環境変数を設定しました。
`$export http_proxy="http://hostname:port"`
この設定でpingやw3mは使えましたが、しかし、emergeができませんでした。
## /etc/portage/make.confの設定
それでしばらく嵌っていましたが
make.confに

```bash:/etc/portage/make.conf
HTTP_PROXY="http://hostname:port"
```

を追記することで解決しました。
めでたしめでたし
Anacondaで構築したPython + py2appでBuildしたアプリを動かす方法


AnacondaでMacに構築したPython環境でpy2appでMac用Appを作成したのですが、下記のようなエラー画面で起動しませんでした。


![ScreenCapture at Wed May 3 01:10:28 JST 2017.png](https://qiita-image-store.s3.amazonaws.com/0/22777/d63dca2a-3ab7-7f59-1f33-1e2a0db803bc.png "ScreenCapture at Wed May 3 01:10:28 JST 2017.png")


色々調べてみると、py2appコマンドでビルドする前にsetup.pyのOPTIONSに下記のようにlibpython3.5m.dylibのパスを指定してやるといいみたいです（libの名前は各自の環境により異なります）


----ここから
OPTIONS = {'argv_emulation': True,
           'plist': {
               'PyRuntimeLocations': [
                '@executable_path/../Frameworks/libpython3.5m.dylib',
                '/Users/*****/.pyenv/versions/anaconda3-4.1.0/lib/libpython3.5m.dylib'
               ]
           }}
----ここまで
【Laravelでエラー対処】PHP Fatal error:  Uncaught UnexpectedValueException: The stream or file "/var/www/base_path/storage/logs/laravel-yyyy-mm-dd.log" could not be opened: failed to open stream: Permission denied



LaravelのWebサーバーにリクエストした際、以下のようなエラーが出力され、期待した処理が行われない場合の原因と対策。

<h3>エラー出力</h3>
<code>
tail -f /var/log/httpd/error_log  # WebサーバーがApacheの場合
PHP Fatal error:  Uncaught UnexpectedValueException: The stream or file "/var/www/base_path/storage/logs/laravel-yyyy-mm-dd.log" could not be opened: failed to open stream: Permission denied
</code>

Laravelのエラーログには出力されず、*Apacheのエラーログに出力される。
*Webサーバーの種類は環境による

<h3>原因</h3>
Laravelのlogファイルにapacheユーザーが書き込み権限を持たないため、logに書き込めずに例外が発生している。

```
[root@prod_sv /]# ls -latr /var/www/base_path/storage/logs/
合計 1819392
...
-rw-r--r-- 1 apache apache 597379535  4月 29 23:59 laravel-2017-04-29.log
-rw-r--r-- 1 apache apache 116592494  4月 30 23:59 laravel-2017-04-30.log
-rw-r--r-- 1 apache apache  54962096  5月  1 23:59 laravel-2017-05-01.log
-rw-r--r-- 1 root   root      817338  5月  2 00:23 laravel-2017-05-02.log
drwxr-xr-x 2 apache apache      4096  5月  2 00:23 .
```
このように-rw-r--r-- root root などの権限だと、apacheユーザーが書き込めない。

<h3>対策</h3>
・logファイルを削除する（場所を変更・名前を変更でも可）
<code>
\# logファイルを削除する
\# rm -r /var/www/base_path/storage/logs/laravel-2017-05-02.log
</code>


・logファイルの権限を変更する（apacheユーザーに書き込み権限を付与）

<code>
\# logファイルの所有者・所属グループをapache:apacheに変更する。
\# chown apache:apache /var/www/base_path/storage/logs/laravel-2017-05-02.log
</code>

これで解決。
serverless frameworkを使ってec2を起動 / 停止するスケジュールを組む

## 作った理由
ec2で動かしているバッチサーバーの節約のため

最近、serverless framework勉強したから
awsの各サービスの画面ポチポチをコードで管理できて素敵ですよね。。

## 使い方

1. custom.dev.yml をcustom.ymlに編集し
必要なパラメータを打ち込む

2. serverless.ymlのfunctionsにスケジューリングを記載する

3. あとは、devなりprodなりデプロイをするだけ

```bash
$ serverless deploy -v --stage=dev
```

## Github

https://github.com/KoheiMisu/serverless-ec2-invoke

## Todo

slackに通知するようにしたい

### 参考

http://dev.classmethod.jp/cloud/aws/lambda-scheduled-event-updown/
Ubuntuでoh-my-zshを使う

すぐできるようにメモ。

# zshに切り替える

```
$ which zsh
/usr/bin/zsh
$ chsh
Password:
Changing the login shell for hoge
Enter the new value, or press ENTER for the default
        Login Shell [/bin/bash]: /usr/bin/zsh
```

# oh-my-zshを入れる

[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)

```
$ sudo sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
```
トランジスタ入門


現在のテクノロジーを裏で支えるトランジスタについて勉強しましたので、初めてトランジスタを使う方向けに記述して行きます。

また認識に間違い等あればコメントにてお願いします。


#簡単に例えると
トランジスタを簡単に例えると「リレー」と「可変抵抗」です。

リレーは電源のON/OFFで動作する電気的なスイッチです。
そのリレーに可変抵抗の機能を一体化させたのが"トランジスタ"です。

幾つものスイッチを電気のON/OFFでコントロールする事で計算が出来る様になり、今ではPC、スマートフォンやタブレットなど様々な端末に使われています。

#トランジスタの使い方

トランジスタは「エミッタ, コレクタ, ベース」の端子があります。

![f_02-04_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/33673/8296d74f-82c7-ddef-511d-ba3c90399fe1.jpeg "f_02-04_01.jpg")


| 名称 | 役割 | 順番 |
|:-----------|------------:|:------------:|
| ベース       |スイッチのON/OFF(抵抗)|①|
| コレクタ     |本流電源|②|
| エミッタ       |GND|③|


ベースに電気を流す事で、コレクタとエミッタ間が繋がりON/OFFする事が出来るのでよくスイッチと例えられます。

また、ベースに流す電流によってコレクタからエミッタに流れる電気の抵抗を変える事が出来る為、可変抵抗にも例えられます。
【Rメモ】多変数の関係性を視覚化する関数（パッケージ）まとめ

自分の覚書的な意味合いも含め、Rで多変数からなるデータフレームの関係性を視覚化する
関数（パッケージ）をまとめます。


#多変数視覚化パッケージ＆関数まとめ


##pairs：散布図行列
既定で利用できる```pairs```関数。
見やすく加工するには色々パラメータをいじる必要があります。

```r:pairs
pairs(iris, panel = panel.smooth)
```

![01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165789/1789bb78-af49-82e7-0d9c-638347525600.jpeg)


##{psych}pairs.panels：散布図・相関行列図
個人的に一番好きなグラフ。
１変量も２変量も相関も分かりやすいです。

```r:pairs.panels
library(psych)
psych::pairs.panels(iris)
```
![02.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165789/1d42b4b1-92fc-2a25-f963-fdfd5c39a26e.jpeg)






##{corrplot}corrplot：相関行列図（円）
円の大きさで相関を表す相関行列図。
変数が多くても、パッと見分かりやすいかも。

```r:corrplot
library(corrplot)
corrplot::corrplot(cor(iris[,-5]))
```

![03.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165789/0d527273-8914-2af2-598e-e43a989e437c.jpeg)






##{qgraph}qgraph：ネットワーク図
各変数間の相関関係をネットワーク図で表示。こんな表現の仕方もありかー。

```r:qgraph
library(qgraph)
qgraph(cor(iris[,-5]),edge.labels=T )
```
![04.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165789/a2015633-5177-9c81-5b89-df8d9825c232.jpeg)






##{tabplot}tableplot：テーブルプロット
ある変数をソートしてグラフ化。
ソートする変数は```sortCol="xxxxx"```のパラメーターで指定可能。

```r:tableplot
library(tabplot)
tableplot(iris)
```

![05.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165789/c31bb399-1e53-1ca7-a7ce-f7839f005441.jpeg)





##{GGally}ggpairs：モダンな散布図・相関行列etc
グラフ生成に時間がかかりますが、恐らく一番簡単に凝った多変数の関係図が可視化できるパッケージ。

```r:ggpairs
library(ggplot2)
library(GGally)
ggpairs(iris,aes_string(colour="Species", alpha=0.5))
```

![06.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165789/5be90c4b-8fa3-6616-35d1-477d02ccf036.jpeg)




#おわりに
探せばまだまだ視覚化に便利なパッケージがありそうです。
色々パラメータを操作すれば、自分好みにできる自由度の高いグラフも多いです。

データ分析の第一歩は、データの構造を理解することから。
上記のグラフがぱぱっと作れると、色々便利になりそうです。
stm32(Nucleo-F411RE)でTIM割込を使用する

#目的
STM32F411REでTIM4を用いたタイマ割込を実装したのでメモ。

#環境
開発環境：Sytem Workbench for STM32(以下、OpenSTM)@Windows10 64bit
使用基板：NUCLEO-F411RE
ファーム：StdPeriph(STM32F4xx_DSP_StdPeriph_Lib_V1.8.0)

構築環境は以下の通り。
http://qiita.com/takoke/items/066d06b9a6fc18e2f975


#ソースコード
```cpp:main.c
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"


void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET ){
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
		GPIO_ToggleBits(GPIOA,GPIO_Pin_5);
	}
}

int main(void)
{
	/********************************/
	/* GPIOの設定@ユーザLED			*/
	/********************************/
	//GPIO_Aへクロック供給
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

	//ユーザLEDに対応するピンの設定
	GPIO_InitTypeDef pin_PA5;
	pin_PA5.GPIO_Pin = GPIO_Pin_5;
	pin_PA5.GPIO_Mode = GPIO_Mode_OUT;
	pin_PA5.GPIO_OType = GPIO_OType_PP;
	pin_PA5.GPIO_PuPd = GPIO_PuPd_DOWN;

	//GPIOの初期化・スタート
	GPIO_Init(GPIOA, &pin_PA5);

	/********************************/
	/* TIM4の設定					*/
	/********************************/

	//割込の設定
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 5; //0が最高優先度、15まで。
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);

	//TIM4にクロック供給
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

	//TIM4の設定
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);

	//カウントアップタイマの設定
	//APB1のクロック100MHzに対し、2000*50000=100Mcnt。
	//1sでタイマ割込がかかる
	TIM_TimeBaseInitStruct.TIM_Prescaler = 2000-1; //2000
	TIM_TimeBaseInitStruct.TIM_Period = 50000; //50000

	//TIM4の初期化、スタート
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM4,ENABLE);

	while(1){
		;
	}
}
```
#メモ
・system_stm32f4xx.cの上の方にクロック関連の設定一覧がある。（表タイトル：Supported STM32F411xx/STM32F410xx devices）
・NUCLEO-F411REはSystem Clock sourceとしてHSI(16MHz)をPLLにかけて生成。
・システムクロック(SYSCLK)は100MHz。
・以下のプリスケーラの設定より、APBx timer clocksも100MHz。
　・AHB Prescaler:1
　・APB1 Prescaler:2
　・APB2 Prescaler:1
・クロックツリーはリファレンスマニュアル(RM0383:DocID026448 Rev.1)より以下の通り。
![クロックツリー.png](https://qiita-image-store.s3.amazonaws.com/0/177972/d95cfa8e-1b39-496b-9a63-db1dbc3b6e64.png)
・以下の"TIM4_IRQn"は、stm32f4xx.hのIRQnから持ってくる。
NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
・割込ハンドラのTIM4_IRQHandlerは、startup_stm32f411xe.sのベクタテーブルから取ってくる。
Macにanyenvを入れる


anyenvという便利なものを見つけたので入れてみます。
rubyだけじゃなくphpとかnodeとかも快適に使いたいので。

### rbenvの削除
もともとrbenvだけ使ってたので削除します。

```
$ brew uninstall rbenv
$ brew uninstall ruby-build
```

### anyenvのインストール
```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ vi .bash_profile
//以下を追加
if [ -d $HOME/.anyenv ] ; then
    export PATH="$HOME/.anyenv/bin:$PATH"
    eval "$(anyenv init -)"
    # tmux対応
    for D in `\ls $HOME/.anyenv/envs`
    do
        export PATH="$HOME/.anyenv/envs/$D/shims:$PATH"
    done
fi
$ source .bash_profile
```

### phpenv, rbenvを入れる
```
$ anyenv install phpenv
$ anyenv install rbenv
$ anyenv versions
phpenv:
* system (set by /Users/ryo/.anyenv/envs/phpenv/version)
rbenv:
* system (set by /Users/ryo/.anyenv/envs/rbenv/version)
```

### ruby 2.3.4のインストール
```
$ rbenv install 2.3.4
$ rbenv global  2.3.4
$ rbenv rehash
$ ruby -v
```

### php 5.6.30のインストール
インストールしようとしたらエラーが出ないので追加でモジュールをインストールします。

```
$ phpenv install 5.6.30
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
-----------------------------------------

$ brew install libmcrypt
```

それでもopenssl関連でエラーがまた出ます。

```
$ phpenv install 5.6.30

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
          _Nullable
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdio.h:475:6: note: insert '_Nonnull' if the pointer should never be null
FILE    *funopen(const void *,
        ^
          _Nonnull
/var/tmp/php-build/source/5.6.30/ext/openssl/openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
#include <openssl/evp.h>
         ^
330 warnings and 1 error generated.
make: *** [ext/openssl/openssl.lo] Error 1
-----------------------------------------
```

なんか調べてみると、ビルド時のオプションを指定してやらねばならなそう。

```
$ brew install openssl libxml2 autoconf automake libjpeg libpng libmcrypt
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)" PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 5.6.30
```

すごいやり方だけど、環境変数にとりあえず置いといても良さそう。
コンパイルうまくいくと、macbookのファンが少しうなる。
まあ一旦これで行けたのでよし。

### nodenvもインストールする
node.js環境も整えたいのでnodenvもインストールします。

```
$ anyenv install nodenv
$ exec $SHELL -l
$ nodenv --version
nodenv 1.1.0-3-g27f0d7b
```

とりあえず最新版を入れてみます。

```
$ nodenv install 7.10.0
$ nodenv global 7.10.0
$ nodenv rehash
$ node -v
v7.10.0
```

特に問題なくインストールできました。
SWITCH文｜PHP学習始めました

##Switch文の勘違い
Switch文の型を勘違いしていました。

<?php
swicth(変数名){
  case 0:
    //変数が0の時の処理;
　　　　break;

  case 1:
    //変数が1の時の処理;
　　　　break;
}
?>

switchの後の{}を付け忘れていてエラー続きでした。
初心者の方への共有です。
シェル芸100% ちゃらい

二度と使わないであろうちゃらいワンライナーです。(随時更新)

## 1 ～ 100の間の素数を出力する。
```
seq 1 100 | factor | awk '(NF == 2){print $2}'
```
※factorは素因数分解を行うコマンド。使い所が見当たらない。ちゃらい。



## awkによって正規表現にマッチした文字列を含む行を出力。
```
awk '/[0-9]+/'
```
※これは数字を含む行を抽出する。ワンライナーのコンボパーツにどうぞ。grepで良いのでかなりちゃらい。


P.S.
個人的にyesコマンドはかなりちゃらいなと思っているんですがまだワンライナーにはできていません。
yesを使ったちゃらいワンライナーをご存知の方は教えて下さい。
zshのプラグインマネージャーantigenを導入する

antigenはzshのプラグインマネージャーです。
コマンド一つで簡単に様々なzshのプラグインをインストール出来るようになります。

[zsh-users/antigen](https://github.com/zsh-users/antigen)

## antigenのインストール
gitリポジトリをクローンするだけで完了します。
クローンする場所は何処でも大丈夫ですが、今回は`~/.zsh/antigen/`に配置します。

```
$ git clone https://github.com/zsh-users/antigen.git ~/.zsh/antigen/
```

### .zshrcの設定
antigenの設定は`.zshrc`に直接書いても問題ないのですが、参考にさせて頂いた[ブログの記事](http://blog.glidenote.com/blog/2012/10/25/antigen/)のやり方が非常にスマートだったのでそちらに従って設定を記述していきます。 
antigenの設定を他のファイルに分離するために`.zshrc`にはantigenの設定ファイルの読み込みだけを記述します。

```
# antigenの設定ファイルを読み込む
source ~/.zshrc.antigen
```

## antigenの設定
antigenの設定は`~/.zshrc.antigen`という設定ファイルを作成し、そこに記述するようにします。

```
$ touch ~/.zshrc.antigen
```

公式のREADME.mdに書かれている設定の例を基に設定ファイルを記述した例です。

```
# antigen.zshの読み込み
source ~/.zsh/antigen/antigen.zsh

# Load the oh-my-zsh's library.
antigen use oh-my-zsh

# oh-my-zsh上にあるプラグインのインストール 
# Bundles from the default repo (robbyrussell's oh-my-zsh).
antigen bundle git
antigen bundle heroku
antigen bundle pip
antigen bundle lein
antigen bundle command-not-found

# oh-my-zsh以外のzshプラグインのインストール
# Syntax highlighting bundle.
antigen bundle zsh-users/zsh-syntax-highlighting

# Load the theme.
antigen theme robbyrussell

# Tell antigen that you're done.
antigen apply
```

## antigenの起動
ターミナルを再起動するか、以下のコマンドで`.zshrc`を再読み込みすれば`.~/zshrc.antigen`が読み込まれてantigenが利用可能になります。

```
$ source ~/.zshrc
```

## 参考
[zshのプラグインマネージャーantigenでoh-my-zshの良いとこ取りをする - Glide Note](http://blog.glidenote.com/blog/2012/10/25/antigen/)
Selenium で別ウィンドウが開くまで待つ

# 問題

Selenium で Web ページを操作しています。あるリンクをクリックすると別ウィンドウが開き、そのウィンドウに制御を移したいです。

```py
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.tagindex.com/html_tag/link/a_target.html')
driver.find_element_by_css_selector('[href="target_example.html"]').click()

driver.switch_to.window(driver.window_handles[1])
```

ただしこのコードでは `driver.window_handles[1]` が存在せずに `IndexError` で失敗することがあります :sob:

# 解決策

[WebDriverWait.until()](http://selenium-python.readthedocs.io/api.html?highlight=WebDriverWait#selenium.webdriver.support.wait.WebDriverWait.until) を使うことで、別ウィンドウが開くまで待機することができます。

```py
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
driver.get('http://www.tagindex.com/html_tag/link/a_target.html')
driver.find_element_by_css_selector('[href="target_example.html"]').click()

WebDriverWait(driver, 3).until(lambda d: len(d.window_handles) > 1)
driver.switch_to.window(driver.window_handles[1])
```

これにより確実に別ウィンドウに制御を移すことができます :blush:
UbuntuにphpbrewでPHPをインストールしてNginxで動かす

# 環境

- Ubuntu 16.10
- Nginxで動かしたい
- testuserというユーザで作業している

# phpbrewのインストール

phpbrewの[github](https://github.com/phpbrew/phpbrew)ページにインストール方法が書いてあります。

# php-5.6.30のインストール

最初、`phpbrew install 5.6.30 +all`をやろうとして延々エラーが出て、調べて必要なものをインストールしてを繰り返しており、時間がかかりました。ふと+defaultでいいかと思ってやったら、とりあえずインストールは問題なくできました。しかし、+defaultだけだと、fpmなどがなかったので、改めて下記でインストールしてみました。

```
$ sudo phpbrew -d install 5.6.30 +default +dbs +mb +fpm +debug +cgi +hash +json
```

問題なく完了しました。同じバージョンをインストールする際に、一度削除した方がいいのかなと思いましたが、消さずにインストールして大丈夫でした。php.iniも上書きされました。

デフォルトのバージョンを5.6.30にします。

```
$ phpbrew switch php-5.6.30
```

## fpmの設定

初期状態だとfpm起動時にエラーがでました。下記を実施したら、スタートしました。

### php-fpm.confの設定

```
$ sudo vim ~/.phpbrew/php/php-5.6.30/etc/php-fpm.conf
```

130行目付近

```
; pool name ('www' here)
[www-data]
```

149行目付近

```
user = www-data
group = www-data
```

164行目付近

```
listen = /home/testuser/.phpbrew/php/php-5.6.30/var/run/php-fpm.sock
```

177行目付近

```
;listen.owner = www-data (コメントアウトしたまま)
listen.group = www-data
listen.mode = 0660
```

### パーミッションの調整

```
$ sudo chown -R www-data:www-data ~/.phpbrew/php/php-5.6.30/var/log
$ sudo chown -R www-data:www-data ~/.phpbrew/php/php-5.6.30/var/run
$ sudo chmod 770 ~/.phpbrew/php/php-5.6.30/var/log
$ sudo chmod 770 ~/.phpbrew/php/php-5.6.30/var/run
$ sudo gpasswd -a testuser www-data
```

### php-fpmの実行

```
$ phpbrew fpm start
Starting php-fpm...
NOTICE: [pool www-data] 'user' directive is ignored when FPM is not running as root
NOTICE: [pool www-data] 'group' directive is ignored when FPM is not running as root
```

スタートしました。その他、`phpbrew fpm stop`で停止。`phpbrew fpm restart`で再起動です。

# Nginxの設定

```
$ sudo vim /etc/nginx/sites-available/hoge
```

下記のような感じで、fastcgi_passに、php-fpm.comfで設定したパスを入れます。

```hoge
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name hoge.com;

  ssl_certificate     /etc/letsencrypt/live/hoge.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/hoge.com/privkey.pem;

  root /home/testuser/pj/html/;
  index index.php;
  location / {
    try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
  }

  location ~ \.php(/|$) {
    fastcgi_index  index.php;
    fastcgi_pass   unix:/home/testuser/.phpbrew/php/php-5.6.30/var/run/php-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  error_page 500 501 502 503 504 /500.html;
}

```

site-enableにリンクさせます。

```
$ sudo ln -s /etc/nginx/sites-available/hoge /etc/nginx/sites-enabled
```

Nginxを再起動（起動）します。

```
$ sudo systmctl restart nginx
```


## （参考）Variantsの種類

全部で下記があるようです。+表記に置換しました。

```
+all +apxs2 +bcmath +bz2 +calendar +cgi +cli +ctype +curl +dba +debug +dom
+dtrace +editline +embed +exif +fileinfo +filter +fpm +ftp +gcov +gd
+gettext +gmp +hash +iconv +icu +imap +inifile +inline +intl +ipc +ipv6
+json +kerberos +libgcc +mbregex +mbstring +mcrypt +mhash +mysql +opcache
+openssl +pcntl +pcre +pdo +pgsql +phar +phpdbg +posix +readline +session
+soap +sockets +sqlite +static +tidy +tokenizer +wddx +xml +xml_all +xmlrpc
+zip +zlib +zts
```