OmniAICreator/Qiita-1.07M huggingface dataset:
公開鍵認証

# クライアント側

鍵を作成する。

    ssh-keygen -t rsa

鍵名を入力する。(カレントディレクトリにファイルが作成される。)
空エンターの場合はユーザディレクトリ配下の.sshフォルダにid_rsaとid_rsa.pubが作成される。

    Enter file in which to save the key (/home/<user>/.ssh/id_rsa):

パスフレーズの入力をする。

    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:

以下のファイルが作成されます。

    <ファイル名>(秘密鍵)
    <ファイル名>.pub(公開鍵)

鍵名の入力で空エンターをしなかった場合は自分で.sshフォルダを作成して作成した秘密鍵を移動します。

    mkdir .ssh
    mv (秘密鍵) .ssh

作成した公開鍵をサーバーへ転送します。
クライアント側の公開鍵は転送後は削除しても大丈夫です。

    scp .ssh/id_rsa.pub <user>@<server>:<path>

鍵のパーミッションを変更する。

    chmod 600 .ssh/id_rsa

# サーバ側

.sshフォルダを作成する。(既にあれば必要ない)

    mkdir .ssh

.sshフォルダのパーミッションを変更する。
(パーミッションが775などだと疎通確認時に公開鍵認証がうまくできなかった。)

    chmod 700 .ssh

クライアントから転送した公開鍵を.sshフォルダに移動しauthorized_keysに追加する。

    mv id_rsa.pub authorized_keys <- authorized_keysがない場合
    cat id_rsa.pub >> authorized_keys <- authorized_keysが有る場合

鍵のパーミッションを変更する。

    chmod 600 authorized_keys

# 疎通確認

クライアントから以下のコマンドを実行します。

    ssh -l <user> -i <秘密鍵のパス> <server>

パスフレーズを聞かれるので鍵作成時のパスフレーズを入力します。

    Enter passphrase for key '.ssh/id_rsa':

ログイン出来れば問題ありません。

# パスワードログイン禁止

公開鍵でログインできるようになったら、サーバーにパスワードでログインできないように設定を変更します。

    sudo vi /etc/ssh/sshd_config

PasswordAuthenticationをnoに変更します。

    PasswordAuthentication no

sshdを再起動します。

    sudo systemctl restart sshd

パスワードでログインできなければ設定完了です。
【Python】文字列から指定した文字を削除

競技プログラミングメモ。
たぶん、もっとスマートな書き方がありそう。


### 問題(要約)
- 文字列が標準入力で与えられる。
- a, i, u, e, o を含んでいれば削除して表示する。

http://abc002.contest.atcoder.jp/tasks/abc002_2


### コード

書いたやつ。

```py
print(('').join(list(filter(lambda c: c not in ['a', 'i', 'u', 'e', 'o'], [i for i in input()]))))
```

噛み砕いたやつ。

```py
# 内包表記を使って、入力された文字列を、文字のリストに変換。
[i for i in input()]

# lambdaを使って、各文字が['a', 'i', 'u', 'e', 'o']内のどれかと一致するかチェック。
lambda c: c not in ['a', 'i', 'u', 'e', 'o'], [i for i in input()]

# 一致しない文字をフィルター。
filter(lambda c: c not in ['a', 'i', 'u', 'e', 'o'], [i for i in input()])

# filterの返すiteratorをリスト化。
list(filter(lambda c: c not in ['a', 'i', 'u', 'e', 'o'], [i for i in input()]
)))

# 文字列結合。
('').join(list(filter(lambda c: c not in ['a', 'i', 'u', 'e', 'o'], [i for i in input()]
)))

# 標準出力。
print(('').join(list(filter(lambda c: c not in ['a', 'i', 'u', 'e', 'o'], [i for i in input()]))))

```

<sub>※Python3


### 追記

より良い解法を見つけたかもしれないのでメモ。
内包表記を作成する段階で、条件をかければよかった。

```py
print(('').join([i for i in input() if i not in ['a', 'i', 'u', 'e', 'o']]))
```
Zybo > Chronicles blog 27 > to align the decimal points with C

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-Seven-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/438888


> To perform the final addition with constant C we need to have the decimal point aligned. Therefore, we need to divide the results and Ax2 and Bx by a power of two to align the decimal points with C. The result will also be formatted in this value which is 8,8.

|  | A Format | Bx Format | Cx2 Format |
|:-:|:-:|:-:|:-:|
|   | 8,8 | 5,27 | 8,40 |
| *1  |   | 2^19 | 2^32 |

ここで*1: Divider to align decimal points for addition

http://qiita.com/7of9/items/d93bec590e19ed6d6aae
> 8,8 > 8 integer bits and 8 fractional bits

上記の表の理解としては、

- 5,27をX,8の形式にするには 19ビットずらすので2^19
- 8,40をX,8の形式にするには 32ビットずらすので2^32
Zybo > Chronicles blog 27 > scaling factors > location of the decimal point

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-Seven-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/438888

> the scaling factors (location of the decimal point)

| Constant | Unscaled | DP Location | Resultant Format | Scaled |
|:-:|:-:|:-:|:-:|:-:|
| A  | -0.0088  | 16  | 0,16  |  -577 |
| B  | 1.7673  | 15  | 1,15  | 57910  |
| C  | 131.29  | 8  | 8,8  | 131  |

ここで、DP: Decimal Point

http://qiita.com/7of9/items/d93bec590e19ed6d6aae
> 8,8 > 8 integer bits and 8 fractional bits

DP LocationというのはLSBから数えての位置だろうか。

Scaledという値と他の列の値の関係性は未消化。
Zybo > Chronicles blog 26 > 8,8 > 8 integer bits and 8 fractional bits

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-Six-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/433722

今後使う表記について

> The normal way of representing the split between integer and fractional bits within a fixed-point number is x,y where x represents the number of integer bits and y the number of fractional bits. For example 8,8 represents 8 integer bits and 8 fractional bits while 16,0 represents 16 integer and 0 fractional.
技術英語 > I appreciate your [bringing this to my attention], Commander. But…

@ Star Trek Voyager > LIFESIGNS

トム・パリスの仕事の態度（遅刻の多発）についてChakotayがJanewayに報告している。Janewayの回答

> I appreciate your bringing this to my attention, Commander. But…


自分で解決してほしいとのこと。

<hr>
関連して

http://qiita.com/7of9/items/f702bbef1c1eb7d51cf1

> It should be noted, Sir that …

...

> May I have your attention please.
arduinoでtimer5

#概要
arduino megaでtimer5をctcモードで使って見た。
クロック１６MHｚなので、プリスケーラ１０２４、１５６２５カウントで１秒。
#写真
![ctc.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b8fe2929-80a9-10c3-97ca-918167e31d5f.jpeg)

#サンプルコード
```
volatile int sec1 = 0;
volatile int sec2 = 0;
volatile int sec3 = 0;
ISR(TIMER5_COMPA_vect)
{
	sec1++;
}
ISR(TIMER5_COMPB_vect)
{
	sec2++;
}
ISR(TIMER5_COMPC_vect)
{
	sec3++;
}
void setup()
{
	Serial.begin(115200);
	TCCR5A = 0;
	TCCR5B = 0;
	TCCR5B |= (1 << WGM52);
	TCCR5B |= (1 << CS52) | (1 << CS50);
	TCNT5 = 0;
	OCR5A = 15624;
	OCR5B = 15624;
	OCR5C = 15624;
	TIMSK5 = 0;
	TIMSK5 |= (1 << OCIE5A);
	TIMSK5 |= (1 << OCIE5B);
	TIMSK5 |= (1 << OCIE5C);
}
void loop()
{
	int a1;
	int a2;
	int a3;
	long b;
	a1 = sec1;
	a2 = sec2;
	a3 = sec3;
	b = millis();
	Serial.print(a1);
	Serial.print("\t");
	Serial.print(a2);
	Serial.print("\t");
	Serial.print(a3);
	Serial.print("\t");
	Serial.println(b);
	delay(1000);
}
```
手元のwindowsからリモートのcentos7にssh接続する

# 前提
centos7 は最小構成のデフォルトインストール。
デフォルトで ssh は通信許可されている。
ネットワークは有効にしていること。
デフォルトで root で ssh ログインできるようになっているので最後に拒否すること。
windows 側の ssh クライアントは teraterm を使う。

# windows 側の準備
teraterm の設定 >SSH 鍵生成で鍵を生成し、適当なフォルダに保存する。
パスフレーズの入力は不要。
生成された鍵のペアの名前を `id_rsa` と `id_rsa.pub` とする。

# centos7 側の準備

root でパスワードログインする。デフォルトでログインできる。

```text
[root@centos7 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@centos7 ~]# useradd sshuser
[root@centos7 ~]# su - sshuser
[sshuser@centos7 ~]$ id
uid=1000(sshuser) gid=1000(sshuser) groups=1000(sshuser)
[sshuser@centos7 ~]$ 
[sshuser@centos7 ~]$ mkdir -m 700 .ssh # 権限は 700 であることが必須
[sshuser@centos7 ~]$ cat >> .ssh/authorized_keys
# id_rsa.pub の内容をコピペする
[sshuser@centos7 ~]$ cat .ssh/authorized_keys
# id_rsa.pub と同じ内容が出力されることを確認する
[sshuser@centos7 ~]$ chmod 600 .ssh/authorized_keys # 権限は 600 であることが必須。
[sshuser@centos7 ~]$ exit
[root@centos7 ~]# id
uid=0(root) gid=0(root) groups=0(root)
```

# ログイン確認
ここで別の teraterm を立ち上げて証明書認証を使った接続ができるか確認する。
パスワードログインしている teraterm は落とさないこと（設定ミスの場合は再接続できなくなる）。

teraterm のファイル > 新しい接続を選択し、サービスに SSH を選択する。
SSH 認証ウィンドウで、ユーザ名に sshuser を入力し、RSA/DSA 鍵を使うを選択する。
秘密鍵として先ほど作成した `id_rsa` を指定する。
パスフレーズは空欄のままで良いので OK をクリックする。

正常に接続できれば、続けて以下の設定を追加する。


# 事後作業

```text
[root@centos7 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@centos7 ~]# passwd sshuser
# ユーザのパスワードを設定する。
[root@centos7 ~]# usermod -aG wheel sshuser # ROOT に代わって管理者とする
[root@centos7 ~]# id sshuser
uid=1000(sshuser) gid=1000(sshuser) groups=1000(sshuser),10(wheel)
[root@centos7 ~]# vi /etc/ssh/sshd_config
[root@centos7 ~]# cat /etc/ssh/sshd_config | grep -vE '#|^$'
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
PermitRootLogin no # root ログイン不可
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication no # パスワードログイン不可
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM no # PAM 認証(パスワードログイン、チャレンジレスポンス)不可
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem       sftp    /usr/libexec/openssh/sftp-server
[root@centos7 ~]# 
[root@centos7 ~]# systemctl restart sshd
[root@centos7 ~]# 
```

UsePAM が no なので PasswordAuthentication は設定不要な気がする。

以上
Racketでhackerrankの問題を解いてみる（IO入力）

https://www.hackerrank.com

HakcerrankでRacketが使えることに気がついたのでプログラミングの練習がてら何問かといてみた。
問題を解くこと自体はできるけどIO周りがすごく難しかったのでメモ。
もっと良いやり方があればアドバイスくださるとうれしいです。

### 固定個のデータ(例は2個）

改行でもスペースでもOK。

```racket:input.rkt
(define (solve a b)
  (+ a b))

(let ([a (read)]
      [b (read)])
  (printf "~a~%" (solve a b)))

```

### 一行取ってリストにする

```racket:input.rkt
(define (sum xs)
  (if (empty? xs)
      0
      (+ (car xs) (sum (cdr xs)))))

(let ([xs (map string->number (string-split (read-line)))])
  (printf "~a~%" (sum xs)))

```
Sublime TextでEmacsのような自動インデント機能を実現する

Emacs系のエディタは自動インデント機能がとても強力で、ある行で`Tab`を押すと、文字列がコンテキストに合わせて適切に自動インデントされ、`Tab`をそのまま押しっぱなしにしていても文字列が遙か彼方に移動することもなく、適切にカーソルが停止します。

Sublime Textでも同様のことができないかと調べてみたところ、以下のようにキーバインドを設定すると、だいたい同じ動きになりました。

```js
{
  "keys": ["tab"],
  "command": "run_multiple_commands",
  "args": {
    "commands": [
      {
        "command": "reindent"
      },
      {
        "command": "move_to", "args": {"to": "eol", "extend": false},
      },
      {
        "command": "move_to", "args": {"to": "bol", "extend": false}
      }
    ]
  },
  "context": [
    {"key": "selection_empty", "operator": "equal", "operand": true}
  ]
}
```

複数コマンド実行のために[sublime-text-multiple-commands](https://github.com/Just-MadDEN/sublime-text-multiple-commands)という古いプラグインを使っていますが、同様の機能の他のプラグインでも実現できると思います。
Pythonで使えるリファクタリングツールたち

# リファクタリングとは

> リファクタリングとは、プログラムの振る舞いを変えることなくソースコードを変更すること。
> ソフトウェア開発では、ソースコードの作成が進むにつれて、中途での設計変更やバグフィックスなどでプログラムは冗長で汚いものとなっていくことが多い。これらの問題点を解決し、将来の仕様変更に柔軟に対応できるようソースコードの手直しを行うことを「リファクタリング」という。
>
>リファクタリングとは｜refactoring - 意味/定義 ： IT用語辞典
>http://e-words.jp/w/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0.html

# Pythonで使えるリファクタリングツールたち

こちらを参照しました。素晴らしいスライドなので一読することをお勧めします。

> リファクタリングツールあれこれ 〜 May the force be with you 〜
> http://tell-k.github.io/pyconjp2014/#/

## flake8

> flake8 2.5.4 : Python Package Index
>https://pypi.python.org/pypi/flake8

**flake8**は`PyFlakes`と`pep8`双方のツールを合体させたツールで、
このflake8ひとつで大概のチェックができます。

*git* などのVCSを使っていれば、flake8が**pre-commitなどのフック**を作ってくれるコマンドもあります。

```text
flake8 --install-hook
```

また、このflake8は**拡張プラグイン**を利用することができて、
たとえば *PEP257*（docstringのコーディング規約）に対応した**flake8-docstring**などがあります。

> flake8-docstrings 0.1.0 : Python Package Index
> https://pypi.python.org/pypi/flake8-docstrings/0.1.0

あなたが**Vimmer**であれば、**vim-flake8**というVimプラグインもちゃんとあります。

> nvie/vim-flake8: Flake8 plugin for Vim
> https://github.com/nvie/vim-flake8

## autopep8

> autopep8 1.2.4 : Python Package Index
> https://pypi.python.org/pypi/autopep8

**autopep8**は自動でpep8に準拠したコードに整形してくれるツールです。

個人的には、このような自動整形ツールを使うよりも、
flake8を使ってエラーを一つ一つ自分の手で修正していくほうが、
コードの書き方などを習得できると思うので、あまり推奨しません。

## autoflake

> autoflake 0.6.6 : Python Package Index
> https://pypi.python.org/pypi/autoflake

**autoflake**は、PyFlakesのエラーに準拠した自動整形ツールです。

## docformatter

> docformatter 0.7.1 : Python Package Index
> https://pypi.python.org/pypi/docformatter

**docformatter**はautopep8などと同じ種類の、自動整形ツールです。
docformatterはコードの整形ではなく、コードの中で使っている**docstring**の整形をしてくれます。

## radon

> radon 1.3.2 : Python Package Index
> https://pypi.python.org/pypi/radon

**radon**は、ソースコードから様々なメトリクスを計算するPythonのツールです。

### メトリクスとは

> メトリクスとは、韻律学、作詞法という意味の英単語。また、測定基準、尺度、計量、距離などを意味する名詞“metric”の複数形。分野や対象を表す名詞に伴って、「～の尺度」「～の測定法」「～の計量法」などの意味を付加する接尾辞でもある。

> メトリクスとは｜metrics - 意味/定義 ： IT用語辞典
> http://e-words.jp/w/%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9.html

つまりソースコードの保守性などを測定し、評価してくれるということですね。
radonでは、評価は**A〜Fの6段階**で行われます。

radonが測定してくれるのは以下の三種類です。

* **Cyclomatic Complexity** - 循環的複雑度
* **Maintainability Index** - 保守容易性指数
* **Raw** - コードの情報を表示

だいたい２つ目の保守性を調べることが多いですかね。

## インストール方法

上記のツールたちは、すべて

```
pip install [tool]
```

このように**pip**を使ってインストールすることができます。

快適なリファクタリングライフを！
NSTableRowView と NSTableCellView

# 構造

NSTableRowView と NSTableCellView は NSView-based NSTableView / NSOutlineView で使われるビューです。NSTableRowView は行全体、NSTableCellView は行列で見たときのセルにあたります。

> ![](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/Art/SplitOut_View.jpg)
> ![](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/Art/NSTableCellView.jpg)
> https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/TableViewOverview/TableViewOverview.html

# ハイライトカラー

行のハイライトカラーは規定ものが適用されており、システム環境設定のアピアランスで指定した強調表示色に依存しています。
<img width="780" alt="Capture 2016-05-27 22.56.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/676e92c4-30b0-d7c2-cc21-c1db6e6fc707.png">

行のハイライトカラーはウインドウの選択状態にも依存します。ウインドウがアクティブである時は強調表示色になりますが、インアクティブの時にはグレーになります。
<img width="158" alt="Capture 2016-05-27 23.22.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/439dbd97-0c12-6b7a-00b3-b6031ba79e50.png">
*ウインドウがアクティブ*
<img width="158" alt="Capture 2016-05-27 23.22.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/be8d142e-09b0-ee44-9664-96fffb11703d.png">
*ウインドウがインアクティブ*


またこれらの色は NSColor でも得られます。

```swift:NSColor
// ウインドウがアクティブで、行が選択されている時の色
alternateSelectedControlColor()
// ウインドウがインアクティブで、行が選択されている時の色
secondarySelectedControlColor()
```

# ハイライトカラーの変更

Cocoa Touch (iOS) では UITableViewCell の backgroundView だとかを使って色を変更しますが、Cocoa ではちょっと面倒くさいです。NSTableRowView のサブクラスで `drawSelectionInRect(dirtyRect:)` をオーバーライドしてベジェパスで色を塗りつぶします。

```swift:MyTableRowView.swift
import Cocoa

class MyTableRowView: NSTableRowView {
	override func drawSelectionInRect(dirtyRect: NSRect) {
		// ここではハイライトスタイルを Regular に限定している
		if selectionHighlightStyle == .Regular {
			if selected == true {
				if emphasized == true {
					// ウインドウがアクティブ状態
					NSColor(red: 0.188, green: 0.514, blue: 0.985, alpha: 1.0).set()
					var fillRect = bounds
					fillRect.size.height -= 1
					NSBezierPath.fillRect(fillRect)
					return
				}
				//else {
					// ウインドウがインアクティブの状態
				//}
			}
		}
		
		super.drawSelectionInRect(dirtyRect)
	}
}
```
```swift:NSOutlineViewDelegate
extension ViewController: NSOutlineViewDelegate {
func outlineView(outlineView: NSOutlineView, rowViewForItem item: AnyObject) -> NSTableRowView? {
		let identifier = "Row"
		var rowView = outlineView.makeViewWithIdentifier(identifier, owner: self) as? MyTableRowView
		if rowView == nil {
			rowView = MyTableRowView(frame: NSZeroRect)
			rowView!.identifier = identifier
		}
		
		return rowView
	}
}
```

ハイライトカラーを青色にしてみた例。

<img width="158" alt="Capture 2016-05-27 23.23.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/0b9ace0d-1014-e089-ec48-149f815905aa.png">
Login Named User on Matlab and EC2

AWS(EC2)でMatlabを使うには、Login Named Userのライセンス形態を使う必要がある。

######Standalone Named Userとの違い

- Standalone Named User:ライセンスを使用する端末のhostidに紐付ける（4台まで）

- Login Named User:Matlab立ち上げ時にライセンスに紐付いているユーザ名（メールアドレス）、パスワードを入力する

スポットインスタンス使用時などに、以前に保存したAMIから異なるインスタンスを立ち上げた時にはhostidが変わるので、Standalone Named Userだと認証に失敗する。

######やること
1. Mathworksのアカウント変更
以下のリンクから行う。Cookieを一度削除しないとアクセスできないかも
https://www.mathworks.com/licensecenter/hosting_provider

2. Hostnameの変更
以下のリンクを参考にした
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html
設定ファイル
/etc/sysconfig/network
/etc/hosts
を書き換え、```sudo reboot```で再起動し、コマンドプロンプトのホスト名が変わっていることを確かめる。

3. cloud.cfgの編集
これだけだと新しいスポットインスタンスを起動時に設定ファイルが元に戻ってしまうので、そうならないように
/etc/cloud/cloud.cfg
を編集
```- update_hostname```とある行をコメントアウト
CentOS6ではこの設定は関係無い？

4. すでにMatlabをインストールしている場合にはdeactivate、その後activate
「Authenticate (log in) each time the software starts」というオプションが表示されるので、そのボタンをチェック
- [ ] Authorize this computer now
- [x] Authenticate (log in) each time the software starts

やっぱりスポットインスタンス起動時にhostnameが元に戻る。。引き続き調べることにする。
とりあえず```sudo hostname xxx```と叩けば使えるけど。
FuelPHPの配列のバリデーションについて

FuelPHPで配列のバリデーションを行う場合はいくつかパターンがあるのでここで紹介します。

**パターン1：配列の要素毎にバリデーションルールを設定**
Validationインスタンスのadd/add_fieldメソッドで配列の要素を一つずつ設定することが出来ます。
要素一つ一つの形式をチェックしたい場合はこの方法が良いと思います。

例.

```php
$validation = Validation::forge();  
$options = Input::post('option');
if (is_array($options)) {
	foreach ($options as $i => $v) {
		// 要素毎にバリデーションルール設定
		$validation->add_field("option.$i", 'オプション', "required|numeric_between[1,10]"); 
	}
}
$validation->run();
return $validation->error_message();

```

上記のように配列要素は「{パラメータ名}.{配列キー}」で指定します。
または「"option[$i]"」のように「{パラメータ名}[{配列キー}]」の書き方でも構いません。


**パターン2：closureを使用**
closureって何ぞや？という方は[こちら](http://qiita.com/ya-sasaki/items/ae7a1e6814e53da6df3f)を参考に。

closureは要素毎の形式ではなく、配列全体もしくは他要素と関連するバリデーションを行う場合に向いています。
例えば以下は配列の要素の数や要素の値の重複をチェックしています。

```php
$validation->add('option', 'オプション')
    ->add_rule('required')
    ->add_rule(function($options) {
        // 3つ以上選択してるか
        if (count($options) < 3) {
            Validation::active()->set_message('closure', 'オプションは3つ以上選択してください');
            return false;        
        }
        
        // 値が重複してないか
        $unique_options = array_unique($options);
        if (count($unique_options) != count($options)) {
            Validation::active()->set_message('closure', 'オプションの値が重複しています');
            return false;        
        }
        return true;
    });
$validation->run();
return $validation->error_message();
```

ケースによってはどちらとも使うこともあります。
どのようにバリデーションを行いたいか、またはどのようにエラーを表示したいかによって使い分けると良いでしょう。
[普及版]ジェネラティブ・アートの図4.3をネタにSverchokする

引き続き[[普及版]ジェネラティブ・アート―Processingによる実践ガイド](http://www.amazon.co.jp/%E6%99%AE%E5%8F%8A%E7%89%88-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3/dp/4861009634)の例をネタに[Sverchok](https://github.com/nortikin/sverchok)の勉強です。

　図4.3はらせん状の例になっていて、マネしてみた結果は次のようになりました。
![結果](https://qiita-image-store.s3.amazonaws.com/0/13938/5101d068-f91d-5c99-b1bd-35d8eb3df98d.png)

　そして最終的なノードは次のようになりました。線のメッシュを Line ノードで生成して、各成分毎に分解します。 x 成分だけが増加していくので、それをパラメータとした Sin/Cos の結果を x,y 成分とするベクトルにします。さらに次第に半径が大きくなるようにスケールをして完成です。
![ノード](https://qiita-image-store.s3.amazonaws.com/0/13938/c9e79b24-55ea-a302-747e-c7165520fe5e.png)
editorconfig on emacs

こんにちは。 editorconfig 使っていますか？ とっても便利です！

が、何回かつまづいたところがあるので、ここにまとめておきます。私の環境での話なので、もしかしたら再現性ないかもです。その折はすみません。

# `.editorconfig` はこう書く

```
[*.php]
indent_style = tab
indent_size = 2
tab_width = 2
```

`indent_size` も `tab_width` も整数で設定します。公式 ( http://editorconfig.org/#file-format-details ) には

> indent_size: a whole number defining the number of columns used for each indentation level and the width of soft tabs (when supported). When set to tab, the value of tab_width (if specified) will be used.
> tab_width: a whole number defining the number of columns used to represent a tab character. This defaults to the value of indent_size and doesn't usually need to be specified.

と書いてあるので

```
[*.php]
indent_style = tab
indent_size = tab
```

で良いと読めますが、これではだめでした。また、

```
[*.php]
indent_style = tab
indent_size = 4
tab_width = 2
```

もだめでした。「だめ」とは、タブとスペース混合でインデントされてしまう、の意味です。

`php-mode.el` で `tab-width` が設定されているので、これと衝突しているのかもしれません。あるいは、 `whitespace-mode` を使ってタブを `»-` と表示しているので、これと衝突しているのかもしれません。正確な原因はまだわかりません。

# editorconfig-core は elisp 版がおすすめ

`editorconfig-core` には外部プログラム版と elisp 版があります。 elisp 版がおすすめです。外部プログラム版は `tramp` 先で使えないという制約 ( http://stackoverflow.com/questions/35957195/editorconfig-does-not-work-over-tramp-in-emacs) がありますが、 elisp 版にはありません。

elisp 版については、 http://qiita.com/10sr/items/5e5d9519874ea3602d96#comment-d15a9b728c842dfb4cf8 に詳しく載っています。現在、elisp 版 `editorconfig-core` は MELPA では `editorconfig` の依存として追加されています。このため、 elisp 版 `editorconfig-core` を明示的にインストールする必要はありません。

`init.el` 等に 

```
(setq editorconfig-get-properties-function
      'editorconfig-core-get-properties-hash)
```

と書けば、外部プログラム版ではなく elisp 版の `editorconfig-core` が使われるようになります。
【WEBマーケTIPS】滞在時間を計測する仕組みと改善への生かし方

この記事は、
>WEB解析Hacks Eric.T.Peterson著 を参考に記述しております。
http://shop.oreilly.com/product/9780596009885.do

#基本的な用語と概念

##ページ別滞在時間
あるページがリクエストされた時刻を、次のページへのリクエストが行われた時刻から引いたものです。
時間の長短 = 善し悪しとは一概に判断できないため注意が必要です。

##サイト滞在時間
その訪問の最初のリクエスト時刻を、訪問の最終リクエスト時刻から引いたものです。"平均"訪問時間は長期的に見るとほとんど変化しないことがほとんどです。
直接コントロールすることは難しいのでKPIに設定することは難しいでしょう。

##訪問の有効期限
訪問(アプリケーションによってはセッションとも呼ぶ)は、大概の場合30分で１単位とみなされます。

#サイトで滞在時間を算出するときに不正確となる要因

##訪問の最終ページの扱い
ページ滞在時間の定義で述べたように、計測アプリケーションは"次に続く"ページリクエストが存在しない限り最終ページの滞在時間を計測することができません。

>※出口ページにfunction噛ませば取れないこともないようです
http://www.flavours.ac/blog/web-production-tips/analytics-outbound.html

このことはつまり、全体PVから全体セッション数を引いた数×滞在時間分の記録が計測値から抜け落ちてしまうことを意味します。従ってサイト全体の平均滞在時間を計測する際は注意が必要です。


##人間の行動の無作為性
平均値というものは、異常値によって全体の特性を代表する数値としての意味が損なわれやすいという性質を持っています。分散の多いデータを見るときは算術平均ではなく中央値を採用することで、母集団全体の特性を正しくつかむことができるでしょう。

滞在時間指標は、分散の非常に大きいデータです。なぜなら、1時間サイト全体を回遊する人もいれば、30秒でサイトを出る人もいるようにその行動は予測不可能なものだからです。
滞在時間は単純平均しないという点は是非覚えておきたいところです。

#ページ閲覧時間の評価
改善とは「あるべき姿と現状の差」を埋めていく行為だということができます。
それでは滞在時間指標における"あるべき姿"とは一体何になるでしょうか？
それは観察によってしか得ることのできない数値です。

実際にユーザーテストを行い、彼ら彼女らが必要な情報をサイトから得るためにどれくらいの時間が必要であるのか観察してみましょう。

###旅行サイトならばお気に入りのプランを見つけるまでにどれだけの時間がかかるのか？

###ブログサイトなら、１記事を読み終えるまでにどれだけの時間がかかるのか？

これらの"典型的な"値と実測値とを見比べることによって、単なる数字でしかない[サイト滞在時間:30秒]というデータから、ユーザーの使用ケースを想像することができ、効果的な打ち手に繋がります。

今回は以上です。
本番・開発環境の2つ同時にssh接続させないためのアイディア

本番と開発環境の両方にssh接続して、開発の方のターミナルで作業していたつもりが、実は本番でトラブルを起こしてしまった、というのは案外ある話ですね。

片方しか接続できない（or しにくい）ようにできれば、上のようなリスクを軽減できそうです。
単なるアイディアレベルですが、メモを残しておきます。

# 1. 本番・開発サーバには、踏み台サーバを経由しないとSSHログインできないようにする。

iptablesなどのネットワークか、開発・本番サーバのsshd_configで実現できそう。

# 2. 踏み台サーバには、各ユーザは接続数は1までにする

limits.confのmaxloginsで実現できそう。

# 3. 踏み台サーバにsshログインしたら、本番・開発のどちらかにsshログインするか、そのままログアウトを強制する

sshd_configのForceCommandで実現できそう。

これならいけそうな気がする。サーバ側の設定だけで済みそう。

環境を用意するのが手間がかかって、検証できそうにないですが。
悪いREGEXと良いREGEXと最良REGEX 

#1.REGEXとは ​
正規表現（RegExp/regex）とは、文字列のパターンを表現する表記法​
                      

      /pattern/
#2. 良いREGEXと悪いREGEX ​
*`[2016-05-02T16:05:18 #92430]  INFO -- : Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)​`*
必要な情報​

    時間: 2016-05-02T16:05:18 #92430​
    種類: INFO​
    情報: Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)​

     1. \[(.*)\]\s+(.*)\s--\s:\s+(.*) ​
     2. \[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d
        +#\d+)\]\s+(.*)\s--\s:\s+(.*)​

​２つレゲックス patternを見ると、どれが良いですか、すぐに答えられます。
**基本的に、レゲックス pattern は長ければ長いほど良いです。**もちろん、正解なければなりません。
なぜは？
普通は、なんでも検索するとき、くわしく情報を入力すると、結果が正しくなって、時間もかからない。これも一緒。
​
#3.マッチする入力とマッチしない入力​
     1. \[(.*)\]\s+(.*)\s--\s:\s+(.*) ​
     2. \[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d
        +#\d+)\]\s+(.*)\s--\s:\s+(.*)​
*`[2016-05-02T16:05:18 #92430]  INFO -- : Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)​`*
（１）すべて文字を受けるように、(.*) を使います-> マッチしない入力​
（２）時間の詳細フォーマットを使います->マッチする入力​
​
#4.良いREGEXと悪いREGEXの比較​
**`\[(.*)\]\s+(.*)\s--\s:\s+(.*)`**
<img width="1194" alt="Screen Shot 2016-05-21 at 16.01.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/114590/2b8a3734-64eb-0909-fc01-bdecfe4d73c2.png">

<img width="984" alt="Screen Shot 2016-05-21 at 16.03.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/114590/a9f2ea7a-a47d-7bf5-6a72-d85f8f2ac95c.png">

１−４ステップまで文字同じとき（マッチする入力​）、一つステップがかかる。
しかし、ステップ ５のとき, .*をひかく（比較）した後で, 次の文字を検索するために、レゲックスは最後から最初までゆっくり検索しなければなりません。
ここで、158ステップに見えます。
マッチしない入力のじゃくてん（弱点）がすぐに見えます, うしろの文字は長ければ長いほどステップがかかります。時間もかかる
後ろの(. *) も同じ 
すべては324 ステップがかかる。
 **`\[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d+#\d+)\]\s+(.*)\s--\s:\s+(.*)​`**
<img width="1105" alt="Screen Shot 2016-05-21 at 16.06.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/114590/08338aba-69d8-c3e1-54a6-cbfa480cfab5.png">

<img width="1038" alt="Screen Shot 2016-05-21 at 16.08.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/114590/68511bed-a85f-084f-cee8-f73a18c32ae6.png">

 マッチする入力​を使いますから、文字同じとき、一つステップがかかる。
それで、27 ステップに時間が検索することを完了しました。すべては１５８ステップがかかる。
実際に、まだ最良REGEX​じゃない、改善できます。
#5.最良REGEX​
（２）の間(.*)にがあります。よくないです。改善できます。
**`\[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d +#\d+)\]\s+([A-Z]*)\s-+\s:\s+(.*)​`**
(.*)はpatternの最後にある時、大丈夫です、一つステップがかかる
#6.まとめ
良いregexを書くために：​
-マッチする入力を使います。（ステップ数が減る）​
- patternの間に（.*）を使わないようにする。​
Visual Studio Code を Markdown プレビュー付きエディタとして使う方法

Viaul Studio Code は標準で Markdown に対応しています。
プレビューしながら編集もできますのでその方法を説明します。

# 方法
## 1. 普通に[.md]ファイルを開いて、右上の「エディタの分割」ボタンをクリックします。
![Image3.png](https://qiita-image-store.s3.amazonaws.com/0/124069/c1367c43-22b3-eb08-0c52-191080271032.png)
## 2. エディタが2画面に分割されるので、続いて右上の「プレビューを開く」ボタンをクリックします。
![Image4.png](https://qiita-image-store.s3.amazonaws.com/0/124069/67f8d3cb-2ced-4063-d6b4-c59a2f156ef4.png)
## 3. これでプレビューが確認できます。
![Image5.png](https://qiita-image-store.s3.amazonaws.com/0/124069/b6e8bfba-f646-ebd1-1589-47c4d9372882.png)
## 4. 左ペインで編集すると右ペインですぐにプレビューが反映されます。
![Image6.png](https://qiita-image-store.s3.amazonaws.com/0/124069/3905a272-b29c-cf51-b0f5-0dbd04db3308.png)

# 注意点
~~保存してあるファイルを開いたときにしかプレビューは有効にできないようです。
逆に、新規ファイルとして入力して、言語モードを「Markdown」に切り替えてもプレビューは有効にできません。~~

※2016/11/09追記
現在は未保存の状態でもプレビューが有効にできるようです。
Gitのマージ済のブランチを削除

# はじめに
https://news.ycombinator.com/item?id=11532281
を見ていて確かにgithub上のmerge済のブランチのdeleteって忘れるよなぁーと思いつつ、作業用のlocalマシン(mac)のがほぼ放置となってブランチが多数あることに気づいた

なので作業用マシンにあるマージ済のブランチを削除するTipsにする

# 前提
## 環境
* Mac OS X El Capitan
* git version 1.8.4
* 本流のブランチを `master`とする

# コマンド
## いきなりはちょっと怖いのでdry run的に試す
```
git branch --merged | grep -v master | grep -v '*' | xargs -I % echo %
```
* `--merged`オプションを使う。masterにマージ済のブランチを取得
* `grep -v` でカレントブランチとmasterブランチを除外
* 結果を`echo`

## 本番
```
git branch --merged | grep -v master | grep -v '*' | xargs -I % git branch -d %
```
* ドライランの`echo`の部分を`git branch -d`に置き換えて実行するとマージ済の不要なブランチが削除される


## ちょっと使いやすく
* 上記のコマンドは覚えるのはつらいのでalias設定をする

```lang:.git/config
[alias]
    delete-merged-branch = !git branch --merged | grep -v master | grep -v '*' | xargs -I % git branch -d %
```

これで`git delete-merged-branch`で実行できる
TensorFlow学習パラメータのsave, restoreでつまった

TensorFlowのsave, restoreで少しつまったのでメモ．

## 基本的な使い方

Tensorflowの学習パラーメータのsave, restoreには**tf.train.Saver**を用います．

### 保存

保存には**tf.train.Saver**の**save**メソッドを使います．

```py

# 幾つか変数作成
w1 = tf.Variable(..., name="v1")
w2 = tf.Variable(..., name="w2")
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")

...

saver = tf.train.Saver()

...

# 保存
saver.save(sess, "model.ckpt", global_step=100)
```

上記により，変数`w1,w2,b1,b2`が`model.ckpk`に保存されます．
その際同時に，chackpointファイル（model作成履歴のようなものが入っている）と，metaデータが保存されます．global_stepの指定は任意ですが，学習を途中で中断しまた後から再開したいときなどに有用です．

`tf.train.Saver()`に何も引数を指定しない場合は全ての変数が保存されますが，下記のように保存する変数を指定することもできます．

```py

# v1をmy_v1として保存
tf.train.Saver('my_v1': v1)

# v1, v2のみ保存
tf.train.Saver([v1, v2])
```

### 読み込み

読み込みには**tf.train.Saver**の**restore**メソッドを使います．

```
w1 = tf.Variable(..., name="v1")
w2 = tf.Variable(..., name="w2")
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")

with tf.Session() as sess:
  # 変数の読み込み
  saver.restore(sess, "model.ckpt")

```

上記によりw1, w2, v1, v2に保存された値が読み込まれます．


また，保存されたデータがあるかどうかは，

```
ckpt = tf.train.get_checkpoint_state('./'):
```

により，チェックできます（例えば'./'にない場合はNoneが帰ります）．

そのため，

```py

with tf.Session() as sess:
	ckpt = tf.train.get_checkpoint_state('./'):
	if ckpt: # checkpointがある場合
		last_model = ckpt.model_checkpoint_path # 最後に保存したmodelへのパス
        print "load " + last_model
        saver.restore(sess, last_model) # 変数データの読み込み
    	...

    else: # 保存データがない場合
    	init = tf.initialize_all_variables()
    	sess.run(init) #変数を初期化して実行
```

のように，保存データの有無で，変数を読み込むか，新規に学習を始めるかを分岐させることができます．

## 注意どころ

### **保存の際の`tf.Variable`のnameと，読み込み時に宣言する`tf.Variable`のnameを揃える．**

当然変数名ではなく，nameの指定が揃っていなければ，正しく読み込まれません．

### **保存した変数の数と，`saver = tf.train.Saver()`を呼ぶまでに宣言する変数数をそろえる．**

保存，読み込みともに，`tf.train.Saver()`が呼ばれる前までに呼ばれた引数が対象になります．
そのため，何も保存時も何も変数が宣言されていない状態で`tf.train.Saver()`を呼び出すと，`ValueError: No variables to save`と怒られます．

### **読み込んだ変数に関しては初期化は不要**

`saver.restore(sess, model)`により読み込まれた変数は，Initializeをしなくても値が入っている状態です．
そのため，restoreを読んだ後に

```py

init = tf.initialize_all_variables()
sess.run(init) #変数を初期化して実行
```
などとしてしまうと，読み込んだ値が初期化されてしまいます．

w1,w2は読み込んで，w3は新しく学習させたい，という際には` tf.initialize_variables() `を用います．
Eloquentのメソッド saveとupdateは処理が異なる

Laravelでデータの保存をするときに使う
`update()`と`save（）`は処理が異なるので注意が必要

# 先に結論
- **update()は更新データとの差分を見てないで更新する** :expressionless: 
- **save()は更新データとの差分を見て更新するか決めてる** :eyes: 


# どういうことだ
ちょっと例を添えて説明

下記2例のように
データを保存をすることがあるかと思う

``` php:update()を使った場合
App\Flight::where('id', 1)
          ->update(['name' => $request->name]);
```

``` php:save()を使った場合
$flight = App\Flight::find(1)
$flight->name = $request->name;
$flight->save();
```


## この時、もし`$request->name`が既存データと同じデータだとしたら
### `save()`
updated_atのカラムが更新されない
### `update()`
updated_atのカラムが更新される

そんな挙動になる／(^o^)＼一緒じゃないのね

## Eloquentのメソッドの中身を見てみるとわかる

`vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php`の`save()`を見てみると
すでにデータが存在している場合(つまりINSERTの処理の時)は`performUpdate（）`というメソッドが呼ばれている

そこで以下の処理

``` php:performUpdate（）の中身
// 変更されたデータを取得
$dirty = $this->getDirty();
// 変更があったら挿入の処理をするよ
if (count($dirty) > 0) {
   ~~ここでデータ挿入の処理~~
}
```

こんな感じで`save()`はデータの更新を行っているということでした。
ちなみに`update()`は何を判定することなく、そのままデータをガツンと入れてます。

気をつけよう :innocent:
オブジェクト指向初心者の私がJavaScriptにも再入門 「変数の扱い編」 〜JavaScriptパターン 学習2日目【逃げメモ】〜

*2016/5/31 タイトルを変更しました。*

# 必須パターン

## グローバル変数はできるだけ使用しない

グローバル変数はどこからでもアクセスできる変数。そこに適当な変数を作っていると、複数人でコーディングを行ったり、どこかで拾ってきたコードを使用したりすると、予期せぬ所でその同じ変数名が使われていて正しく動作しないといった問題が起きる事があります。

そういう事を防ぐために、やたらめったらにグローバル変数は使用しないように心がける必要があります。

### varで宣言する

JavaScriptは変数の宣言の時に、特に接頭に何もおかなければ、それはすべて **グローバル変数として宣言**した事となります。

```js
function result(){
    ret = "結果がここに";
    return ret;
}

console.log(result());
console.log(ret);
```

のように書いたら値が`ret`から値が取れる、とありましたが、ブラウザで表示してみた所ReferenceErrorと出ましたので、現在では暗黙的にグローバル変数となることはないのかな、と思いますが、接頭に`var`を書いて宣言するクセを身につけておいた方が良いかなと思います。

```js
function result(){
    var ret = "結果がここに";
    return ret;
}

console.log(result());
console.log(ret);
```

## 単独varパターン

変数を宣言する時にイチイチ一つ一つに`var`を書くのは面倒な時にまとめて書くことができます。宣言が上から為されていくので、途中の`sum`も数値がキチンと入ります。

```js
function func1 (){
    var i,
        l,
        a = 2,
        b = 3,
        sum = a + b;

        console.log(sum);
}

func1(); //5
```

## 巻き上げ

同一スコープ({}の中)で`var`が散在していると、自動的にスコープの頭で一括して **宣言だけ**が行われるみたいです。ただ値の代入は書かれた所で行われるので、以下のコードのような事になる。このような挙動を **巻き上げ**という。

```js
function func2 (){
    var i,
        l,
        a = 2,
        sum = a + b;

        console.log("sum" + sum); //NaN

        var b = 3;

        console.log("a:" + a + " b:" + b); // a:2 b:3
}

func2();
```

`sum = a + b;`の時点でbは宣言されていないのだけれども、スコープ内の下の方で宣言が行われているため宣言だけはスコープの開始時に行われている。ただ、値が入っていないので、`sum = a + b`の時点では、`a + undefined`となり、`NaN`が返ってくる事になります。

スコープ内の下の方で宣言が行われなかった場合(`var b = 3;`が無かった場合)は、ReferenceErrorが起こり、宣言されていないエラーとして扱われます。

## forループ

配列や配列に似たオブジェクトに対してループをかけたい時に使います。

対象

- 配列
- HTMLCollection

HTMLCollectionはDOM標準以前から導入されたオブジェクトで、`document.getElementsByName()`や`document.getElementsByClassName()`や`document.getElementsByTagName()`で返ってくるオブジェクトのことです。

下記の方法が一般的な書き方ですが、forが回る毎に`myarray.length`が呼ばれ、DOMを毎度舐めるので、処理が重たくなります。

```js
for (var i = 0; i < myarray.length; i++){
	//処理
}
```

それを避けるために、for文の宣言に新たに`max`という変数に配列の個数を1度だけ取っておき、判定部分はその`max`の値と比較するだけとなるので速度アップの向上が見込まれるという事です。

```js
for (var i = 0, max = myarray.length; i < max; i++){
	//処理
}
```

## for-inループ

配列以外のオブジェクトの繰り返し処理に向いているもの。順序が取れないもの（indexで管理されていない等）に使えます。

`hasOwnProperty`は自分自身の持ち物であれば`true`を返します。この仕組みを利用して、プロトタイプで追加されたプロパティは除外する一文を入れてあります。

```js
//オブジェクト

//オブジェクト
var devices = {
    idevice:4,
    android:2,
    eink:2
};
//すべてのオブジェクトにメソッドを追加
Object.prototype.clone = function(){};

//オブジェクトのループ。ループ対象がオブジェクト自身の持ち物であれば出力
for (device in devices) if (devices.hasOwnProperty(device)) {
    console.log(device,devices[device]);
}
//idevice - 4
//android - 2
//eink - 2

```

## evalは避ける

`eval()`は引数に文字列でJavaScriptの文章が入っているものを実行してしまう脆弱性の元となるようなものなので、絶対に使わないようにしましょう。

`setInterval()`なども文字列で実行できてしまったりするが、それもよろしくないので避けましょう。

# リンク

次回はこちら

[オブジェクト指向初心者の私がJavaScriptにも再入門 「オブジェクトとコンストラクタ編」 〜JavaScriptパターン 学習3日目【逃げメモ】〜](http://qiita.com/syakegon/items/a0d87f0a5409383289eb)

前回はこちら

[オブジェクト指向初心者の私がJavaScriptにも再入門 「JavaScriptの基本編」 〜JavaScriptパターン 学習1日目【逃げメモ】〜](http://qiita.com/syakegon/items/d77d36ebbd701163e229)
MSYS2の端末ソフトをConEmuにする

MSYS2をインストールしたものの、デフォルトの端末エミュレータが気に入らなかったのでConEmuを導入。
MSYS2導入後にConEmuを導入する方法を解説します。

#第1ステップ―MSYS2の導入
https://msys2.github.io/
MSYS2の公式DLページからインストーラーを落としてきます。
64bit用はmsys2-x86_64
32bit用はmsys2-i686
です。

ページの指示通りに、pacmanやシステムの更新をしておきましょう。

#第2ステップ―ConEmuの導入
http://conemu.github.io/
"Download"のボタンからDLページに飛べます。
使用する環境にあったものを落としましょう。
32bit、64bit同梱なので、特に何もなければPreviewのInstallerで大丈夫です。

落としてきたインストーラーを実行して、指示通りにインストールし終わったら導入完了です。

#ラストステップ―MSYS2とConEmuをリンクする
ConEmuは初回起動時になにか設定ダイアログが出てきますが、ひとまず飛ばしておきます。
ConEmuが起動されたら、画面右上のボタンから、"Setteings.."を開きます。
ConEmuは設定項目がとても多く、自分好みにカスタマイズできるのも大きな特徴です。
右側のツリータブの"Startup"->"Tasks"からタスク設定画面を開きます。
ここで、MSYS2のコンソールを開くタスクを書きます。
タスクの新規作成は"Reload…"の下の"+"ボタンからできます。
taskの名前はmsys2とでもしておきましょう。

```
set CHERE_INVOKING=1 & %ConEmuDrive%\msys64\usr\bin\bash.exe --login -i -new_console:C:"%ConEmuDrive%\msys64\msys2.ico"
```

ConEmuをデフォルトの場所にインストールしていて、MSYS2もCドライブ直下にインストールしている場合はタスクは上記のコードのコピペで実行可能です。
もしMSYS2の場所が違う場合は、"%ConEmuDrive%\msys64\msys2.ico" の部分を書き換えてください。
シェルはbashじゃなくて、zshがいい、という人は、MSYS2にzshが導入されていれば、%ConEmuDrive%\msys64\usr\bin\bash.exe の"bash.exe"を"zsh.exe"に書き換えればログインシェルをzshに設定できます。
また、必要であれば"Default Shell"にチェックを入れておきましょう。

以上の設定を終えたら、"Save Setteings'で設定を保存しましょう。
画面右上の"+"ボタンの横の▼ボタンから、さっき書いたタスクを実行しましょう。
いつも自分が使ってるように使えれば成功です。

#参考までに―筆者の環境
+ Windows 7
+ MSYS2 20160205
+ ConEmu 160522
+ zsh

#後日談―tmuxが動かない
無事msys2の端末エミュレータをConEmuに変更出来たものはいいものの、重大な問題が発覚しました。
なんとConEmuではtmux(ターミナルマルチプレクサ)が起動しないのです。
tmuxユーザーである私は、泣く泣くminttyへと戻りました。
まぁConEmuのペイン機能使ってもtmuxと同じようなことできるんですがね。
Multichainを用いたプライベートブロックチェーン開発(1)：環境構築

今回からMultichainを用いたプライベートブロックチェーン開発について紹介致します。

## Multichain
MultichainとはBitcoinをフォークしたブロックチェーンです。参加するnodeを制限できるためプライベートブロックチェーンとして利用可能です。
ブロックの採掘時間(Bitcoinは約10分)、ブロックの最大サイズ、各nodeの権限の個別設定などが可能です。
具体的にどんなパラメータを調整可能かについては、[こちら](http://www.multichain.com/developers/blockchain-parameters/)を見てください。

ちなみにMultichainはBitcoinから分岐すると、元のBitcoinには戻れません。この点、[Elements](https://elementsproject.org)や[Rootstock](http://www.rootstock.io)などの2-way-pegのSidechainとの違いです。

## 環境構築

### 必要環境
以下の環境が必要です。
(Mac, Windowsでは使えないので、その場合はVagrantで仮想環境を作る、AWSにインスタンスを立てるなどしてください)

- Linux (64-bit), supports Ubuntu 12.04+, CentOS 6.2+, Debian 7+, Fedora 15+, - - RHEL 6.2+ (Windows/Mac to come)
- 512 MB of RAM
- 1 GB of disk space


## インストール

以下のコマンドを実行してください。

```
cd /tmp
wget http://www.multichain.com/download/multichain-1.0-alpha-21.tar.gz
tar -xvzf multichain-1.0-alpha-21.tar.gz
cd multichain-1.0-alpha-21
mv multichaind multichain-cli multichain-util /usr/local/bin (to make easily accessible on the command line)
```

## ブロックチェーン作成
最初にchain1という名のブロックチェーンを作りましょう。

```
> multichain-util create chain1
```

chain1の初期設定を見ましょう。これらは好きに設定出来ます

```
> cat ~/.multichain/chain1/params.dat
```

続いてchain1を初期化しましょう。genesis blockのマイニングが開始されます。

```
> multichaind chain1 -daemon

MultiChain Core Daemon build 1.0 alpha 18 protocol 10005

MultiChain server starting
New users can connect to this node using
multichaind chain1@10.0.2.15:4785

Node started
```
これでnodeがdaemon(バックグラウンド)でスタートしました。これでブロックチェーンに自由にアクセス出来ます。



## まとめ
今回はMultichainの環境構築について書きました。次回から具体的な利用方法に移ってまいりましょう。




###　参考記事
http://www.multichain.com/
hubotでのbot開発とテスト環境整備まで

## hubotの開発環境構築とプロジェクト作成

- [hubotのドキュメント](https://hubot.github.com/docs/)を読んでプロジェクト作成
 - `yo hubot`まで
- テストで使うライブラリをdevDependenciesに追加
 - [hubot-test-helper](https://www.npmjs.com/package/hubot-test-helper)をhubotのテストに使用するのがポイントです

```
  "devDependencies": {
    "mocha": "^2.5.3",
    "chai": "^3.5.0",
    "coffee-script": "^1.10.0",
    "hubot-test-helper": "^1.4.4"
  },

```

- npm installでライブラリをインストール

## テストコードを書いてからスクリプトを書く

- `test/kanban.coffee`
 - 今回、[タスクかんばんみたいなbot](https://github.com/ykokw/kanban-bot)がほしくて、タスクを保存するテストを書いています

```
Helper = require('hubot-test-helper')
expect = require('chai').expect
helper = new Helper('./../scripts/kanban.coffee')

describe 'kanban', ->
  room = null

  beforeEach ->
    room = helper.createRoom()

  afterEach ->
    room.destroy()

  context 'user asks Hubot to add a task to kanban', ->
    beforeEach ->
      room.user.say 'yuki', 'kanban add task1'

    it 'should add a task to brain', ->
      expect(room.robot.brain.data.kanban).to.eql ['task1']

```

- 実際のスクリプト

```
# kanban bot script

module.exports = (robot) ->
  robot.brain.data.kanban = []
  robot.hear /kanban add (.*)$/i, (res) ->
    robot.brain.data.kanban.push(res.match[1])
    res.reply 'Added kanban to' + res.match[1]

```

- package.jsonでタスクを追加

```
  "scripts": {
    "test": "mocha --compilers coffee:coffee-script/register tests"
  },
```

- test実行

```
$ npm test

> kanban-bot@0.0.0 test /workspace/nodeProject/kanban-bot
> mocha --compilers coffee:coffee-script/register tests



  kanban
    user asks Hubot to add a task to kanban
[Fri May 27 2016 20:55:05 GMT+0900 (JST)] INFO /workspace/nodeProject/kanban-bot/scripts/kanban.coffee is using deprecated documentation syntax
      ✓ should add a task to brain


  1 passing (287ms)
```

## coモジュールを使う

- 複数メッセージをやりとりしたときのテストで、beforeEachに数行設定しておく場合はcoモジュールを使う
- 使わないと書き込みとbotの応答が非同期処理なのでroom.messageに交互に入ってくれなくてテストしにくい
- devDependenciesにcoを追加

```
  "devDependencies": {
    "mocha": "^2.5.3",
    "chai": "^3.5.0",
    "coffee-script": "^1.10.0",
    "hubot-test-helper": "^1.4.4",
    "co": "^4.6.0"
  },
```

- テストコード側でモジュールを読み込む

```
co = require('co')
```

- beforeEachでcoモジュールを使う

```
    beforeEach ->
      room.robot.brain.data.kanban = ['task1']
      co =>
        yield room.user.say 'yuki', 'kanban add task2'
        yield room.user.say 'yuki', 'kanban list'

```

- room.messagesが書き込みとbotの応答が交互に入るようになる

```
    it 'should return task list', ->
      expect(room.robot.brain.data.kanban).to.eql ['task1', 'task2']
      expect(room.messages).to.eql [
        ['yuki', 'kanban add task2']
        ['hubot', '@yuki Added kanban to task2']
        ['yuki', 'kanban list']
        ['hubot', '@yuki \n1. task1\n2. task2\n']
      ]
```

## 参考資料

- [HUBOT DOCUMENTATION](https://hubot.github.com/docs/)
- [Testing Hubot Scripts](https://amussey.github.io/2015/08/11/testing-hubot-scripts.html)
 - hubotの大体のパターンでどうテストしてるか書いてあるので感動しました
Sprocketsで生成したCSSのインライン化する方法


AMP対応でつかった

```erb:
<style amp-custom>
  <%= raw Rails.application.assets['amp.css'].to_s.remove('@charset "UTF-8";').remove('!important') %>
</style>
```
これでdevelopment環境でも、プリコンパイルされた本番環境でもうまくインライン化された。
`remove('@charset "UTF-8";').remove('!important')`はAMPが対応していないCSSを除去している。
iOSプロジェクトの初回設定考えてみた

新しいアプリを作ろうとおもうと、ライブラリ管理ツールやCI用の設定をすることになる。

これが、毎回だとめんどう。。。。

そこで、作成例のプロジェクトで作ってみた。
作成例：https://github.com/ppengotsu/iosProjectTemplate
また、最後にxcodeでプロジェクト作ったあとに、上記テンプレートと再現する方法を載せます。

# 目的
iOSアプリのローカルビルド、テストの簡易化
Bitrise(CI)でのビルドとローカルでのビルド環境をできる限り近づける

# やってないこと
ストア申請(fastlaneでできるけど、このスクリプトではlane設定していない。また、自分がまだfastlaneでの申請を試していないため)



# 使用するツール

| ツール名 | 目的 |
|:-----------|:------------:|
|  Xcode     |     |
|  rbenv     | Rubyのバージョン固定のため    |
|  HomeBrew     |     |
|  carthage     |     |
|  cocoapods     |     |
|  fastlane     | ビルド、申請などの簡易化    |
|  Bundle     |  cocoapodsとfastlaneのバージョン管理   |
|       |     |
|       |     |
|       |     |
|       |     |
|       |     |




# 再現方法

下記スクリプトを実行するとほぼ再現できます。
最新：https://github.com/ppengotsu/iosProjectTemplate/blob/master/init_project.sh

```lang:bashscript.sh
#!/bin/sh
#  プロジェクトに、必要な初期設定などをします。
#
#
#
#

# HomeBrew
if [ ! -f "/usr/local/bin/brew" ]; then
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

# rbenv
if [ ! -f "/usr/local/bin/rbenv" ]; then
  brew update
  brew install rbenv
fi

# fix Ruby Version
rbenv local 2.1.0

# bundler
rbenv exec gem install bundler
rbenv rehash

touch Gemfile

echo "source \"https://rubygems.org\" " >> Gemfile
echo "gem 'fastlane', '1.89.0' " >> Gemfile
echo "gem 'cocoapods', '1.0.0' " >> Gemfile

rbenv exec bundle install --path bundle

# carthage
if [ ! -f "/usr/local/bin/carthage" ]; then
    # carthage install
	brew update
	brew install carthage
fi


touch Cartfile #make Cartfile (like Podfile)
carthage update --platform iOS


#fastlane
rbenv exec bundle exec fastlane init



#cocoapods
rbenv exec bundle exec pod init
rbenv exec bundle exec pod install








#test
rbenv exec bundle exec fastlane test #run test code




```


再現できていない部分は、
fastlaneのlane設定です。
それぞれで、設定してください



# 参考

[CocoaPoderと賢者の宝石　〜 まだ bundle exec で消耗してるの？ 〜 ](http://www.slideshare.net/niwatako/cocoapoder-bundle-exec)
td-agent つかって超楽に slack にエラーログを送る

# なるべく楽して slack にエラーログを送りたい
## 要件
- host 名を出したい。
- CRITICAL が含まれる行を出したい

1. slack の incoming web hook つくって url 取得する
1. td-agent2 intall. (もし td-agent が 1 だったら一度消す)
1. plugin を install する

```
# yum --setopt=tsflags=noscripts remove td-agent
# yum --setopt=tsflags=noscripts remove td-agent2
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
# /usr/sbin/td-agent-gem install fluent-plugin-slack
# /usr/sbin/td-agent-gem install fluent-plugin-rewrite-tag-filter
```


td-agent.conf (この例は daemontools で起動している plack の log です)

```
# tail で拾う
<source>
  @type tail
  path /service/my-web/log/main/current
  pos_file /var/log/td-agent/error.log.pos
  tag plack.raw
  format /^(?<message>.*)$/
</source>

# 条件で tag つけなおす rewrite
<match plack.raw>
  @type rewrite_tag_filter
  rewriterule1 message ^.*CRITICAL.*$ plack.error
  rewriterule2 message ^.*HTTP/1.0" 404 .*$ plack.error
</match>

# host 名付与する
<filter plack.*>
  @type record_transformer
  <record>
    host ${hostname}
  </record>
</filter>

# slack になげる
<match plack.error>
  @type slack
  webhook_url https://hooks.slack.com/services/xxxx/xxxx/xxxx
  channel hoge
  username error
  icon_emoji :gear:
  flush_interval 10s
  message_keys host,message
  message "[%s] %s"
</match>
```
c#でズンドコゲッター

#概要
paiza.ioのc#でズンドコゲッター作って見た。
#実際
https://paiza.io/projects/BJ9Fkt5TBjwXp7gaSAKtbg
#サンプルコード
```
using System;

public class Hello
{
    public static Random rnd = new Random();
    public static void Main()
    {
        int i = 0;
        while (true)
        {
            string s = str();
            if (s == "ドコ")
            {
                System.Console.Write("ドコ　");
                if (i == 4) break;
                i = 0;
            }
            else
            {
                System.Console.Write("ズン　");
                i++;
            }
            
        }
        System.Console.WriteLine("キ・ヨ・シ！");
    }
    public static string str()
    {
        string url = "http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko";
        System.Net.WebClient wc = new System.Net.WebClient();
        wc.Encoding = System.Text.Encoding.UTF8;
        string source = wc.DownloadString(url);
        wc.Dispose();
        return source;
    }
}


```
firefoxで表示しているページをemacsで表示する

たとえばfirefoxでブラウジング中にemacsの[コードの断片を見つけ](http://qiita.com/styzo/items/72197ad6717eb9266315)て、ちょっと試してみようと思ったときに、そのwebページをemacsで表示して、コードの部分を選択して、`M-x eval-region`できれば簡単。
たとえばfirefoxでブラウジング中に誤って英語のサイトを開いてしまい、仕方なく[emacs上でGoogle翻訳](http://qiita.com/styzo/items/72197ad6717eb9266315)を使って読もうと思ったときに。

firefoxにadd on [Open With](https://addons.mozilla.org/ja/firefox/addon/open-with/?src=api) をインストール。
open withの設定
名前 `w3m`
コマンド　`....\emacs\bin\emacsclientw.exe` linuxでもemacsclientのパスを設定
引数　`-a emacs -n --eval "(w3m-goto-url \"%s\"))"`

または
名前 `eww`
コマンド　`....\emacs\bin\emacsclientw.exe`
引数　`-a emacs -n --eval "(eww \"%s\"))""`

emacsの設定
ewwやemacs-w3mがなければインストール。
windowsの場合、w3m.exeのバイナリは[Cygwin](https://www.cygwin.com/)のw3mパッケージにある。または[w3m for windows](http://hp.vector.co.jp/authors/VA052357/w3m_w32.html)にもある。

```el:.emacs
(server-start)
```

firefoxの表示しているページで右クリック→アプリで開く→w3mまたはewwを選択。
emacs上にwebページが表示される。

逆にemacs-w3mで表示しているwebページを別のブラウザ(Firefox)で開くには、`M` (`w3m-view-url-with-browse-url`)をタイプ。
ewwでは`&` (`eww-browse-with-external-browser`)をタイプ。
Google Play Services Library v9.0.0で変なログが出るけど心配しないで


### TL;DR

* logcatに `V/GoogleSignatureVerifier: com.google.android.gms signature not valid.` という心配になるメッセージと長いシグネチャが現れる
* Googler「ごめんログレベルをミスった。今度直すね。動作には影響ないよ！」

起きていること
----------

Google Play Servicesライブラリのv9.0.0を動かそうとすると、次のようなログが出ます。

![スクリーンショット_2016-05-27_19_18_44.png](https://qiita-image-store.s3.amazonaws.com/0/2276/245a5dac-e2b6-fdaf-86aa-4e6895efcd05.png "スクリーンショット_2016-05-27_19_18_44.png")

```
V/GoogleSignatureVerifier: com.google.android.gms signature not valid.  Found: 
```

こわいですね。何か設定をミスったかなと心配になります。

問題ないらしい
----------

調べてみたら、四日前にStackOverflowで話題になっていました。

android - GoogleSignatureVerifier signature not valid message (not using the google maps api) - StackOverflow
http://stackoverflow.com/questions/37333220/googlesignatureverifier-signature-not-valid-message-not-using-the-google-maps-a

Googlerが「ごめん、それバグだ！」から始まる回答をしてくれています。

まあ見た目怖いので心配になりますし、質問した人も念を入れていました。

> Googler: This shouldn't affect the behavior of your app at all.
> 質問者: So it doesn't do anything? We shouldn't worry? 
> Googler: Shouldn't worry.
> 質問者: ok then. Thank you. Have +1 for the effort :) 

問題ないみたいなので、スルーしながら修正を待ちましょう。

### 余談

ちなみに私はGCMで遭遇したのですが、似たようなAPIを持つFCMのほうでは遭遇しなかったので、似ていても内部実装は違うんですね〜

現場からは以上です。
Linuxサーバ全体をソース管理するアイディアについて

タイトルの通り、本当に思いつきベースの考えなのでポエムのカテゴリ。

# 解決したいこと
例えば、サービスをホストするLinuxサーバって、独自のシェルが構築されていると思うが、それらは開発中や運用中にどんどん変更されていくものだと思う。
シェルに限らず、.bash_profileのような環境周りの設定ファイルも変わるかもしれないし、場合によってはミドルウェアもどんどん入れ替えていくかもしれない。

そんな状態の時、誰がいつ何をしたか、そして障害が起こった時に戻せるかが重要になってくると思うが、どうやって記録を残し、最悪、サーバが壊れた時にどうやって戻すか、ということについてのアイディアを以下に書きます。

# 従来方法
よくやりがちなのは、hoge.sh.BK20160527 みたいにファイルコピーで退避しておく方法だけど、それだと何をしたか分からないし、新規追加したフォルダ、ファイルの見分けがつかない。
手順書やチケットを残すことはあるが、開発中に毎度、それらの文書を残すことは大変だ。

# 改善方法
そこで、いっそのこと、Root以下をすべてソース管理してしまってはどうだろうか？
もちろん、ログなどの日々変わっていくファイルはignoreする。
Root以下が難しければ、一部のユーザー（システムの実行ユーザー）のhome以下に絞ってもいいかもしれない。

# 私見
以上のように考えて、検索してみたのだが、キーワードが悪いのか事例が見つからない。
筋としては悪くないように思うが、皆さんはどう思うだろうか？
jquery div内でのスクロール上下判定及び制御

今回documentではなく、divの中からスクロールを制御する機能を実装することがありました。
色々方法を探しながら何となく見つけた方法を共有します。

```lang:html
<div class="notify">
  <ul id="lists">
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ul>
</div>
```

```lang:javascript
$(document).on("mousewheel", function(e) {
  var delta = e.originalEvent.deltaY ? - (e.originalEvent.deltaY) : e.originalEvent.wheelDelta ? e.originalEvent.wheelDelta : - (e.originalEvent.detail);

  if ($(e.target).parents(".notify #lists").size() > 0) {
    if ($(".notify #lists")[0].scrollHeight - $(".notify #lists").scrollTop() == $(".notify #lists").outerHeight()) {
      if (delta < 0) {
        e.preventDefault();
      }
    }
    if ($(".notify #lists").scrollTop() == 0) {
      if (delta > 0) {
        e.preventDefault();
      }
    }
  }
});
```

このようなコードがあるとします。

まずマウスを使ってスクロールするのでこちらを定義します。
```$(document).on("mousewheel", function(e) {});```

次にulのlistsの中でスクロールが起きているのかを判定するためにこちらを追加します。
```if ($(e.target).parents(".notify #lists").size() > 0) {}```

document(divの外)からスクロールすると上記のifはfalseになり、#listsの中だったら1になるはずです。

その次にこちらのコードでdivの一番下なのかがわかります。
```if ($(".notify #lists")[0].scrollHeight - $(".notify #lists").scrollTop() == $(".notify #lists").outerHeight()) {}```

```
$(".notify #lists")[0].scrollHeightはスクロールの全体の高さ、
$(".notify #lists").scrollTop()はスクロールの現在の高さ、
$(".notify #lists").outerHeight()はulである#listsの高さです。
```

最後に一番下だったらdocument(画面)のスクロール及び、全ての動作を止めたかったので次のコードを書きました。

```
if (delta < 0) {
  e.preventDefault();
}
```

上記のコードに

```
if ($(".notify #lists").scrollTop() == 0) {
  if (delta > 0) {
    e.preventDefault();
  }
}
```
のようなifがありますが、それは現在のスクロールが一番上だったら同じく処理を止めるため使ったものです。

単純に上下を判定したいのならこちらのコードで済みます。

```
if (delta < 0) {
  alert("一番下です。");
} else {
  alert("一番上です。");
}
```