OmniAICreator/Qiita-1.07M huggingface dataset:
バーコード型ローディングの実装をSASSで頑張ってみた

![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/33722/fcbd401a-cebe-b13c-0efc-372d9ece74ee.png)

こんな感じのバーコード型ローディングをSASSで作ってみました

```
// HTML
<div class="loader_barcode"><div><i></i><i></i><i></i><i></i></div></div>

// SASS
.loader_barcode{
	position: relative;
	width: 300px;
	height: 300px;
	
	div{
		position: absolute;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		margin: auto;
		margin-left: auto;

		@include loader_barcode(graph, 42px, 32px);
	}
}

// SASS MIXIN
@mixin loader_barcode($animation-name, $width, $height, $speed:1.2s){

	$w_margin: $width/4/9;
	$w_bar: $width/4 - $w_margin * 2;
	$scale_min: 0.8;
	$scale_max: 1.6;

	&{
		width: $width;
		height: $height;
	}

	& i{
		background-color: $bg_loading;
		width: $w_bar;
		height: $height;
		margin: 0 $w_margin;
		display: inline-block;
		-webkit-animation: stretchdelay $speed infinite ease-in-out;
		animation: stretchdelay $speed infinite ease-in-out;

		&:nth-child(1){
			-webkit-animation-delay: -1.1s;
			animation-delay: -1.1s;
		}
		&:nth-child(2){
			-webkit-animation-delay: -1.0s;
			animation-delay: -1.0s;
		}
		&:nth-child(3){
			-webkit-animation-delay: -0.9s;
			animation-delay: -0.9s;
		}
		&:nth-child(4){
			-webkit-animation-delay: -0.8s;
			animation-delay: -0.8s;
		}
	}

	@-webkit-keyframes stretchdelay {
		0%, 40%, 100% {
			-webkit-transform: scaleY($scale_min);
		}
		20%{
			-webkit-transform: scaleY($scale_max);
		}
	}
	@keyframes stretchdelay {
		0%, 40%, 100% {
			transform: scaleY($scale_min);
			-webkit-transform: scaleY($scale_min);
		}
		20% {
			transform: scaleY($scale_max);
			-webkit-transform: scaleY($scale_max);
		}
	}
}
```
FreeRADIUSでレルムをもとにVLAN番号を返す

# はじめに
無線LANなどで1X認証する際に「ID@グループ名」のようなレルム付きアカウントにして
利用するネットワークを決めれるとうれしいですね

# 設定方法
CentOS6にバンドルされたバージョン2系のFreeRADIUSを使います

```config:/etc/raddb/radiusd.conf
instantiate {
        echo
}
```

としてechoを有効にします

```config:/etc/raddb/users
DEFAULT         User-Name =~ "^([^@]+)@([a-z]+)"
                Tunnel-Type = "VLAN",
                Tunnel-Medium-Type = "IEEE-802",
                Tunnel-Private-Group-Id = `%{echo:/etc/raddb/conv_vlan.sh %{1} %{2} %{Client-Shortname}}`,

```

シェルスクリプトはこんな感じです

```sh:conv_vlan.sh
#!/bin/sh

PATH='/usr/local/bin:/usr/bin:/bin'
USERLIST='/etc/raddb/userlist'

test $# -eq 3 || exit 1
case "${3}" in
  'network1')
    VLANLIST='/etc/raddb/vlanlist1'
    ;;
  'network2')
    VLANLIST='/etc/raddb/vlanlist2'
    ;;
  *)
    exit 2
    ;;
esac
grep -q "^${1}@${2}$" ${USERLIST} || exit 3
( grep "^${2}:" ${VLANLIST} | cut -d: -f2 | tr -d "\n" ) || exit 4
exit 0
```
そのグループのVLANが使えるユーザリスト

```config:userlist
taro@hoge
jiro@hoge
saburo@fuga
```

グループ名とVLAN番号の変換テーブル

```file:vlanlist1
hoge:100
fuga:200
```
とするとTunnel-Private-Group-Idに適切なVLAN番号が割り当てられます
例えばあるネットワークだとhogeは100番だけど違うネットワークだと別の番号になる場合は別途VLAN変換テーブルvlanlist2を準備するとよいです

無線LANのAPのアドレス帯で
%{Client-Shortname}を分けるには下記のような設定をします

```config:/etc/raddb/clients.conf
client 192.168.0.0/24 {
        shortname   = network1
}
client 192.168.1.0/24 {
        shortname   = network2
}
```
iOSでDebugの時だけの時間計測クラス

2017/04/28
今更だけど肝心のNSLogで出力を最後に入れ忘れてた...

重たい処理を高速化する時の目安程度に作ってみた

#時間計測クラス
```objc:Measure.h
#import <Foundation/Foundation.h>

#ifdef DEBUG

//デバッグ時だけ計測
#define MEASURE_START [Measure measureMethod:^{
#define MEASURE_END_M(message) } withMessage:(message)];
#define MEASURE_END }];
#else

#define MEASURE_START
#define MEASURE_END_M(message)
#define MEASURE_END

#endif


typedef void (^measureBlock)();

@interface Measure : NSObject
+(void)measureMethod:(measureBlock)block;
+(void)measureMethod:(measureBlock)block withMessage:(NSString *)message;
@end

```

```objc:Measure.m

#import "Measure.h"

@implementation Measure
+(void)measureMethod:(measureBlock)block{
[Measure measureMethod:block withMessage:nil];
}

+(void)measureMethod:(measureBlock)block withMessage:(NSString *)message{
  NSDate *start = [NSDate date];
  block();
  NSTimeInterval time = -[start timeIntervalSinceNow];
  NSString *log = [NSString stringWithFormat:@"process time = %lf", time];
  if (message) {
    log = [NSString stringWithFormat:@"%@ process time = %lf", message, time];
  }
  NSLog(@"%@", log);
}
@end

```

#使い方
```objc:howToUse.m
#import "Measure.h"
.
.
.

//メッセージをつけない場合
MEASURE_START
[self hogehoge1];
MEASURE_END

//戻り値がない場合
MEASURE_START
[self hogehoge1];
MEASURE_END_M(@"[hogehoge1]")

//戻り値がある場合   __blockがいるよ
__block UIImage *hogeImg = nil;
MEASURE_START
hogeImg =[self hogehoge2];
MEASURE_END_M(@"[hogehoge2]")

.
.
.
```

#出力
process time = 0.065342
[hogehoge1] process time = 0.065342
[hogehoge2] process time = 0.12345
SoftLayer Object StorageをLinuxへマウントする方法

EC2の無料のUbuntuにSoftLayer Object Storageをマウント

増幅処理をしたデータをObject Storageにあげる必要があり、増幅処理をするまえのデータをObject Storageへアップし、マウントして増幅処理を行えばアップロード時間短縮ができるのでは、と思ってやってみた。

１．EC2上にUbuntsuを構築
　今回は無料枠のUbuntsuを選択

２．必要なツールをインストール
\# sudo su -

\# apt-get update
\# apt-get install build-essential libcurl4-openssl-dev libxml2-dev libssl-dev libfuse-dev
\# apt-get install git
\# apt-get install libjson0 libjson0-dev

３．CloudFuseのインストール
\# git clone https://github.com/redbo/cloudfuse   
\# cd cloudfuse
\# ./configure
\# make
\# make install

４．Object Storageの接続情報を設定
\# vi ~/.cloudfuse
 ※下記情報を入力。（SoftLayer management consoleで情報を取得）
　username=xxxxx
　api_key=xxxx
　authurl=xxxx

５．マウント
\# cloudfuse /mnt
\# df
Filesystem      1K-blocks    Used  Available Use% Mounted on
udev               503212      12     503200   1% /dev
tmpfs              101636     332     101304   1% /run
/dev/xvda1        8115168 1073556    6606336  14% /
none                    4       0          4   0% /sys/fs/cgroup
none                 5120       0       5120   0% /run/lock
none               508160       0     508160   0% /run/shm
none               102400       0     102400   0% /run/user
**cloudfuse      8589934588       0 8589934588   0% /mnt**

以上。
ズンドコキヨシ(AS3)

無いといわれてたのでとりあえず。

```as3:Zundoko.as
do
{
	var i: int = Math.random() * 2;
	var history: int = (i << 4) | (history >> 1);
	trace(["ドコ", "ズン"][i]);
}
while (history != 0x0F)
trace("キ・ヨ・シ！");
```
new RegExp と String.raw の相性が割と良かった

## 文字列を正規表現オブジェクトにするときの問題
例えば

```js:
re = /hoge\s*fuga/i
```

みたいな正規表現の`fuga`の部分に変数を使いたいときは`RegExp`を使えばいいのですが、

```js:
str = "fuga"
re = new RegExp("hoge\s" + str, "i");
```

とすると意味が変わってしまいます。これは`"hoge\s"`が文字列としての値を返す際にバックスラッシュの処理がなされ、実際には「`hoges`」という文字列になっているからです。そのため、

```js:
str = "fuga"
re = new RegExp("hoge\\s" + str, "i")
```

のようにしなければなりません。

[正規表現：RegExp('Hello\sworld!')はマッチしない](http://qiita.com/ykob/items/6e4d0b07bed57881a2bd)


## タグ付けテンプレートリテラルが便利

ES2015（ES6）で、テンプレートリテラルが加わると同時に文字列をエスケープせずそのまま扱うための仕組みも加わりました。

[JavaScript の テンプレートリテラル を極める！](http://qiita.com/kura07/items/c9fa858870ad56dfec12)

これを使うとなんと、

```js:
str = "fuga"
re = new RegExp(String.raw`hoge\s${str}`, "i")
```

のように書けちゃいます。バックスラッシュが一回でいい上、変数が埋め込めて便利です。

もっと複雑な例をあげてみます。`\(^o^)/`にマッチする正規表現の場合、

```js:
re = /\\\(\^o\^\)\//
```

です（なんかキモい）。この口の部分を変数で指定したいとき、従来だと

```js:
mouth = "o"
re = new RegExp("\\\\\\(\\^" + mouth + "\\^\\)/")
```

となりもはや何をやっているかわかりませんが、String.rawを使えば

```js:
mouth = "o"
re = new RegExp(String.raw`\\\(\^${mouth}\^\)/`)
```

と、リテラルを使った表現に近くなります。


## おまけ：メタ文字のエスケープ

変数の部分に外部からの入力を使う場合、メタ文字が入っていると正規表現全体の動作に関わってしまいます。これを防ぐために以下の関数を用意します。 

[正規表現 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)

```js:
function escapeRegExp(string) {
  return ("" + string).replace(/[.*+?^=!:${}()|[\]\/\\]/g, "\\$&");
}
```

これを入力された文字列に適用します。

```js:
mouth = prompt("好きな口を入力してください") || "o"
re = new RegExp(String.raw`\\\(\^${escapeRegExp(mouth)}\^\)/`)
```

テンプレートリテラルも囲めば`\(^o^)/`をわかりやすく出来ますが、場合によっては正規表現である意味がなくなります。

```js:
mouth = prompt("好きな口を入力してください") || "o"
re = new RegExp(escapeRegExp(String.raw`\(^${mouth}^)/`))
```
Xcodeのバージョンを上げた時に動かなくなってしまったプラグインを再設定する方法

Xcode7.3がリリースされ、以前まで動いていたプラグインが動かなくなりました。

以下解決方法になります。

# 手順

##DVTPlugInCompatibilityUUIDを取得

1.ターミナルで以下を実行

```defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
```

2.出てきたUUIDを追加

```
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add "１．で取得したUUID"
```

3.Xcodeを再起動してLoadBundleを選択

これで、以前まで使えていたプラグインが動作するようになります。
OpenStack Liberty構築時にはまったところまとめ

この記事は、2016/03/01 前後に、Open Stack Liberty環境をマシン1台に対してall in one構成で構築した時にはまったところをまとめた記事です。

# 構築した環境 
* 物理マシン上に作成
* OS: CentOS7.2(minimal)
* インストールツール: packstack
  - 2015-10-21に修正されたものを使用
  - https://repos.fedorapeople.org/repos/openstack/openstack-liberty/rdo-release-liberty-2.noarch.rpm


# 1. Dashboardからインスタンスを生成する時のエラー
## 問題
OpenStackのDashboardからインスタンスの起動を行う時に、以下のようなエラーメッセージが表示され、インスタンスの生成ができませんでした。

`'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range`

Dashboardを開くブラウザの言語を英語にしても同様の症状でした。

## 解決法
pythonのデフォルトエンコーディングをascii から utf-8に変更する


* `/usr/lib64/python2.7/site-packages/sitecustomize.py` と `/usr/lib/python2.7/site-packages/sitecustomize.py`に以下の内容を追加することで解決しました。

```
try:
    import apport_python_hook
except ImportError:
    pass
else:
    apport_python_hook.install()

import sys
sys.setdefaultencoding('utf-8')
```

* sitecustomize.pyのファイルがない場合は、同様のファイル名でファイルを作成してください。もし、デプロイしてしまった後でも、同様のことを行い、OpenStackの動いているマシンの再起動を行うと治るはずです。

# 2. ボリュームのリソース上限が取得できないエラー
## 問題

Dashboard上のSystem => Defaultを開く時とIdentify => ProjectからProjectを作成する時に以下のエラー文が表示され、一部の項目の値が取得・変更できませんでした。

`Error: Unable to retrieve volume limit information`

## 解決法
/etc/cinder/cinder.confを修正する

* 参考： https://ask.openstack.org/en/question/87045/error-unable-to-retrieve-volume-limit-information/

* /etc/cinder/cinder.conf 内の `[keystone_authtoken] ` 以下に下記の内容を記述する。
    * auth_uriとauth_urlの`{your_keystone_ip}`の部分と`{cinder password}`の部分は自分の環境にあったものに変更してください。
    * cinder passwordは、packstack実行時のanswerファイル内に記述されているCONFIG_CINDER_KS_PWの値を使用してください。

```
[keystone_authtoken] 
auth_uri = http://{your_keystone_ip}:5000 
auth_url = http://{your_keystone_ip}:35357 
auth_plugin = password 
project_domain_id = default 
user_domain_id = default 
project_name = services 
username = cinder 
password = {cinder password}
```


* 修正後は設定を反映させるため、cinder apiのサービス、もしくはマシンの再起動を行ってください。

# おまけ
* [Packer](https://www.packer.io/)を使ってOpenStack Libertyに対してインスタンスを生成する場合、`packer build`の途中で、SSH 接続がTimeoutする場合があります。その時はPackerのバージョンを0.90以上にすると治る場合があります。
mne pythonを使っていて'Qstring'  has already been set to version 1云々みたいなエラーが出た時の対策


# 症状
ipythonを起動した後

```python
from mayavi import mlab
```
とタイプすると再現できる時はできます。
**'Qstring' has already been set to version 1**
みたいなメッセージが見られます。

# 原因
よくわかりませんが、Qt(GUIのコントロールをしてるライブラリの1つ)のバージョンがmne(が使っているmayavi)とpython本体で違うとかなんとか、そんな話のようです。

# 対策
手元の環境ではIPython/__init__.py
の最初の方(自分はfrom __future__ import absolute_importの下)に

```py
import sip
sip.setapi('QDate', 2)
sip.setapi('QDateTime', 2)
sip.setapi('QString', 2)
sip.setapi('QVariant',2)
sip.setapi('QTextStream',2)
sip.setapi('QTime',2)
sip.setapi('QUrl',2)
```
と追記したらうまく動くようになりました.

```shell-session
ipython --matploblib=qt
```

でも動きました.

他にも'Qなんとか'が出てきたら同様に書くとうまく行くのではないかと思います.
CentOS6でVLANマッピング

# はじめに
あるネットワークと別のネットワークでVLAN番号を変えたい場合があると思いますが
お高いスイッチを準備しなくてもNIC2枚挿しのサーバで代替可能です

# 設定方法
CentOS6をサーバにインストールします 最小構成で十分です
VLANタグを認識するようにします

```config:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
GATEWAY=192.0.2.254
VLAN=yes
VLAN_NAME_TYPE=DEV_PLUS_VID_NO_PAD
```
再起動してちゃんとモジュールがロードされているか確認します

```tcsh:
% lsmod |grep 8021q
8021q                  20362  0 
garp                    7152  1 8021q
```
NIC2枚はeth0とeth1としてudevに認識されますが
MACアドレスでちゃんと固定したい場合は``/etc/udev/rules.d/70-persistent-net.rules``に設定してください

このeth0とeth1の各VLANをブリッジインターフェースで紐付けます
例えばeth0のVLAN番号100をeth1のVLAN番号200にマッピングしたい場合は

```config:/etc/sysconfig/network-scripts/ifcfg-eth0.100
DEVICE=eth0.100
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
BRIDGE=br200
```

```config:/etc/sysconfig/network-scripts/ifcfg-eth1.200
DEVICE=eth1.200
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
BRIDGE=br200
```

```config:/etc/sysconfig/network-scripts/ifcfg-br200
DEVICE=br200
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
STP=off
```

としてそれぞれのインターフェースをUPするか
ネットワークサービスを再起動します
Pythonでモルダー案件

## まえがき

[Ruby でモルダー、あなた疲れてるのよを出力する方法](http://qiita.com/supermomonga/items/3a3da5518ae72b35ce8b)
Python でも「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりする機能を求められることがあると思ったので書きました。

## コード
```
# -*- coding: utf-8
import random
from more_itertools import chunked
from math import ceil

def mulder():
    s = u"モルダー あなた 疲れてる のよ".split()
    s2 = sum([darui(x) for x in chunked(random.sample(s, len(s)), 2)], [])
    s2.insert(2, u"、")
    return "".join(s2)

def darui(l):
    a1, a2, b1, b2 = sum([divide_rough(x) for x in l], [])
    return [a1, a2, b1, b2] if random.randint(0, 1) else [b1, a2, a1, b2]

def divide_rough(l):
    " 真ん中らへんで分割"
    return _join(chunked(l, int(ceil(len(l)/2.0))))

def _join(l):
    return map(lambda x:"".join(x), l)

i = 0
s = None
while s != u"モルダー、あなた疲れてるのよ":
    s = mulder()
    print(u"{0}: {1}".format(i, s))
    i += 1
```

## 実行例
```
0: 疲れてる、のよあなダーモルた
1: モルダー、疲れてるあなたのよ
2: のよ、疲れてるモルダーあなた
3: 疲れてる、のよモルダーあなた
4: モルてる、疲れダーあなたのよ
5: あなよ、のた疲れてるモルダー
6: あなてる、疲れたモルよのダー
7: モルた、あなダーのよ疲れてる
8: のてる、疲れよモルたあなダー
9: あなてる、疲れたのダーモルよ
10: 疲れてる、のよあなたモルダー
11: 疲れてる、モルダーあなよのた
12: あなた、モルダー疲れよのてる
13: あなた、モルダー疲れてるのよ
14: モルダー、疲れてるのよあなた
15: モルダー、あなた疲れよのてる
16: 疲れてる、あなたモルダーのよ
17: 疲れた、あなてるモルよのダー
18: のた、あなよ疲れダーモルてる
19: のた、あなよ疲れてるモルダー
20: のよ、モルダー疲れてるあなた
21: あなた、のよモルダー疲れてる
22: 疲れダー、モルてるのよあなた
23: あなよ、のたモルてる疲れダー
24: あなてる、疲れたモルよのダー
25: のよ、疲れてるモルダーあなた
26: 疲れてる、あなたのダーモルよ
27: 疲れてる、のよあなダーモルた
28: あなよ、のた疲れてるモルダー
29: モルダー、あなた疲れてるのよ
```

- more-itertoolsは標準ライブラリではない
- sum(l, [])はflattenの代用(2次ネストのみ)
- もっと綺麗に書けると思うけどだるくなってしまった
VerilogとChiselで「加算を代入」したときの違い

「8ビット同士を足して9ビットに代入する」を深く考えずに書いた場合の挙動の違いについて。


#Verilog

```verilog
wire[7:0] a;
wire[7:0] b;
wire[8:0] c;

assign c = a + b;
```

`a = 8'b1111_1111` , `b = 8'b0000_0001`のとき、`c = 9'b1_0000_0000`になります。

#Chisel

```scala
val a = UInt(width = 8)
val b = UInt(width = 8)
val c = UInt(width = 9)
c := a + b
```

`a = 8'b1111_1111` , `b = 8'b0000_0001`のとき、`c = 9'b0_0000_0000`になります。

#なんで?

VerilogもChiselも、Mビット + Nビットの結果は Max(M,N)ビットなのですが、
Verilogの場合、代入の場合は例外として、左辺のビット数に合わせます。
Chiselはそんなことしません。

コードで示すと、

```verilog
wire[7:0] a;
wire[7:0] b;
wire[8:0] c;

// assign c = a + b と同じ
assign c = {1'b0, a} + {1'b0, b};
```
verilogは、ゼロ拡張してから足します。


一方上記ChiselコードのVerilog出力は、

```verilog
wire[7:0] a;
wire[7:0] b;
wire[8:0] c;
wire[7:0] T0;

assign T0 = a + b;
assign c = {1'h0, T0};
```

のようになります。(イメージ)
足してから、ゼロ拡張します。

verilogでいうところの、`assign c = a + b;`は、Chiselでは

```scala
val a = UInt(width = 8)
val b = UInt(width = 8)
val c = UInt(width = 9)
c := Cat(UInt(0), a) + Cat(UInt(0), b)
```
になります。
CentOS6 上のPHPでImageMagickを動かす

###初めに
瞬殺ではありました。
記録の為に記載するが、誤り等あれば指摘して下さい。

###インストール環境
CentOS release 6.7 64ビット

###必要な作業。

####1. ImageMagickのインストール
yum install ImageMagick
で一発。

####2. PECL imagickのインストール
pecl install imagick
で済まそうと思ったが、5.4>=のPHPが必要と言われて撃沈。
pecl clear cache
した後、
pecl install imagick-3.2.0b2
してみたら、通った。
別のWindows環境でPHP5.4で通ったバージョンを指定したまで、もっと新しくても行けるかも知れない。

####3. php.iniへの記載
ファイルの最後に
[PECL]
extension=imagick.so
記載。

####4. httpd再起動

Windowsに比べると、超絶楽でした。
SharePoint Client Object Model でビューの表示列を変更するコード


ビューの設定画面でやると面倒で間違いやすいですよね。

```
// 引数は、リスト表示名(ListName)、ビュー表示名(ViewName)、列内部名の配列(Fields)
function changeViewFields(ListName, ViewName, Fields){

	// コンテキストオブジェクト取得
	var custCtx = SP.ClientContext.get_current();

	// サイトオブジェクト取得指示
	var custWeb = custCtx.get_web();

	// リスト（ライブラリ） オブジェクトの取得指示
	var custList = custCtx.get_web().get_lists().getByTitle(ListName);

	// ビューオブジェクトの取得指示
	var custView = custList.get_views().getByTitle(ViewName);
	custCtx.load(custView);

	// ビュー表示列オブジェクトの取得指示
	var custViewFields = custView.get_viewFields();
	custCtx.load(custViewFields);

	// 取得実行
	custCtx.executeQueryAsync(
		function () { // 成功時コールバック
			// ビューの表示列を初期化
			custViewFields.removeAll();
			
			// ビューの表示列を追加
			for(i = 0; i < Fields.length; i++) {
				custViewFields.add(Fields[i]);
			}
			
			// ビューの更新指示
			custView.update();

			// 更新実行
			custCtx.executeQueryAsync(
				function () { // 成功時コールバック
					 alert('Change view [ ' + ListName + ' - ' + ViewName + ' ] fields complete.');
				}, function (sender, args) { // 失敗時コールバック
					 alert('Change view [ ' + ListName + ' - ' + ViewName + ' ] fields failed. ' + args.get_message() + '\n' + args.get_stackTrace());
				}
			);
		}, function (sender, args) { // 失敗時コールバック
			 alert('Get view [ ' + ListName + ' - ' + ViewName + ' ] fields failed. ' + args.get_message() + '\n' + args.get_stackTrace());
		}
	);
}
```

```
// 呼び出し例
changeViewFields("おしらせ", "すべてのアイテム", ['Title',　'Created',　'Message']);
```
今更Swiftでズンドコキヨシ。Protocol Extension編。

## まずはコード

``` swift
protocol 節系 {
    init()
    func 鳴らす()
}

extension 節系 {
    func 鳴らす() {
        print(self)
    }
}

protocol フィニッシュ系: 節系 { }

struct ズン: 節系 { }
struct ドコ: 節系 { }
struct キ・ヨ・シ！: フィニッシュ系 { }

let 節集: [節系] = [ズン(), ドコ()]
var ズンカウント = 0
let フィニッシュズンカウント = 4

while true {
    let 節 = 節集[random() % 節集.count]
    節.鳴らす()
    
    if 節 is ズン {
        ズンカウント += 1
    } else if 節 is ドコ
        && ズンカウント == フィニッシュズンカウント {
        break
    } else {
        ズンカウント = 0
    }
}

キ・ヨ・シ！().鳴らす()

```

### ポイント

* `ズン`と`ドコ`と`キ・ヨ・シ！`を文字列としてハードコーディングしていません。（ホントか？？！！
* Protocol Extensionで`鳴らす`を実装しています。
* `キ・ヨ・シ！`の最後の`!`がアンラップに見える。

## 出力

```
...
ズン()
ドコ()
ズン()
ズン()
ズン()
ズン()
ズン()
ドコ()
ドコ()
ズン()
ドコ()
ズン()
ズン()
ズン()
ズン()
ドコ()
キ・ヨ・シ！()
```

## まとめ

ほんとごめんなさい
osxのmampでxdebugを有効にする


## php.iniファイルの場所を確認

```
phpinfo();
```

Loaded Configuration File
/Applications/MAMP/bin/php/php5.5.18/conf/php.ini

## php.iniファイルを編集

```
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php5.5.18/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
```

完了
MacにHomebrewでインストールしたJenkinsのホームディレクトリの確認方法

HomebrewでサクッとインストールしたJenkinsのホームディレクトリがどこなのか、いまいちわかっていなかったのでメモ。

前回の続き的な。
[MacにHomebrewを使ってJenkinsをインストールする方法 - Qiita](http://qiita.com/unsoluble_sugar/items/db26dca5fc7df0033ae8)

#JENKINS_HOME を設定している場合
JENKINS_HOME を設定している場合は

```
$ echo $JENKINS_HOME
```
で確認できる。

…が、当環境ではコマンドを叩いても何も出てこなかった。
<img width="299" alt="スクリーンショット 2016-03-30 14.29.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/e03ac8ac-2b31-2984-bbab-272e26d69afc.png">
(´･_･`)

環境設定ファイルを見ると JENKINS_HOME の記述が無い。
Homebrewでインストールしたから省略されたのかな？

#JENKINS_HOME 未設定の場合

Jenkinsを起動して [Jenkinsの管理] - [システムの管理] を選択。
<img width="900" alt="スクリーンショット 2016-03-30 14.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/8070064d-9cdd-31f9-6a7a-3a6503994df2.png">
ここにホームディレクトリのパスが書かれている。

ザッと眺めてみたところジョブの設定ファイルやログ、プラグイン一式などが入っていた。
どうやらここがJenkinsのワークスペースとなっている模様。

JENKINS_HOME は環境設定ファイルにパス追加すれば別の場所に変更できるっぽい。
必要に応じて変更しよう。
WordPressなどにリバースプロキシする際にバックエンドのホスト名でURL生成されるのを防ぐ

wordpressなど、バックエンド側でサーバ変数のHTTP_HOSTを使用してURLを生成しているスクリプトがある場合、リバースプロキシの設定のProxyPreserveHostをOnにすることで、バックエンドのホスト名でURLが生成されるのを防ぐことができます。

ProxyPreserveHostは、バックエンドへのプロキシの要求に、クライアントがリクエストしたホスト名を伝播します。
http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypreservehost

バックエンドで動作しているPHPなどのスクリプトは、URLを組み立てる際$_SERVER['HTTP_HOST']を使用します。

HTTP_HOSTには、[現在のリクエストに Host: ヘッダが もしあればその内容]が入っているので、バックエンドのスクリプトは、クライアントがリクエストしたホスト名(public.co.jp)からURLを組み立てます。
http://php.net/manual/ja/reserved.variables.server.php

ただし、この方法は、バックエンドのサーバが別の用途でも使用されている場合は、注意が必要です。
特に、HTTP_HOSTを単に自ホスト名として利用しているスクリプトがある場合は、プロキシすることで、意図しないURLを生成したりするかもしれません。


```bash
<VirtualHost public.co.jp:80>

    ServerName public.co.jp
    DocumentRoot /var/www/html
    ErrorLog /var/log/httpd/error_log
    CustomLog /var/log/httpd/access_log combined

    # Reverse Proxy settings.
    # Cookie's proxy settings.
    ProxyPassReverseCookieDomain public.co.jp backend.co.jp
    ProxyPassReverseCookiePath / /

    # プロキシリクエストに、受け付けた Host HTTP ヘッダを使う.
    # Using accepted Host HTTP header at proxy request.
    # @see http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypreservehost
    ProxyPreserveHost On

    #wordpress
    ProxyPass /wp/ http://backend.co.jp/wp/
    ProxyPassReverse /wp/ http://backend.co.jp/wp/

</VirtualHost>
```
どどんとふ1.46.00を最小構成のCentOS7から構築できた時の手順

[こちら](http://qiita.com/fusagiko/items/fd5aeb36f493319ab961)や[こちら](http://qiita.com/Akagi/items/64d266df4d2320abb77b)の手順にしたがってどどんとふのセットアップをしていたが、それだけでは動かなかったのでほんの少し追記したものを自分でもう一度まとめて書く。CentOS7をminimumな感じでインストールしたあとから始める。  

# 必要なものどもを取得

```console
$ sudo yum update
$ sudo yum install wget libyaml-devel gcc httpd unzip policycoreutils-python
```
# rubyのセットアップ

```console
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz
$ tar -zxvf ruby-2.1.6.tar.gz
$ cd ruby-2.1.6
$ ./configure
$ sudo make install
```
# どどんとふのセットアップ

```console
//どどんとふの取得&展開
$ cd ~
$ wget http://www.dodontof.com/Download/DodontoF_release/DodontoF_Ver.1.46.00_MASTERPIECE.zip
$ unzip DodontoF_Ver.1.46.00_MASTERPIECE.zip
$ sudo mv DodontoF_WebSet/* /var/www/
//所有権とかセキュリティコンテクストとか権限の変更
$ cd /var/www
$ sudo chown -R apache:apache public_html/ saveData/
$ sudo chcon -R -t httpd_sys_content_t public_html/ saveData/

$ cd public_html/DodontoF 
$ sudo chmod -R 705 saveDataTempSpace fileUploadSpace replayDataUploadSpace ../../saveData ../imageUploadSpace

$ sudo chmod 700 DodontoF*.rb

$ sudo chmod 600 log.txt*
```

/etc/httpd/conf/httpd.conf を編集する。

```httpd.conf
- DocumentRoot "/var/www/html"
+ DocumentRoot "/var/www/public_html"

- #AddHandler cgi-script .cgi
+ AddHandler cgi-script .cgi .rb

- <Directory "/var/www/html/">
+ <Directory "/var/www/public_html/">

+ <Directory "/var/www/public_html/DodontoF/">
+ DirectoryIndex DodontoF.swf
+ Options ExecCGI
+ </Directory>
```

DodontoFServer.rbを編集する。

```rb:DodontoFServer.rb
- #!/user/local/bin/ruby -Ku
+ #!/user/local/bin/ruby -EUTF-8
```

SELinuxを切る。

```:/etc/selinux/config
- SELINUX=enforcing
+ SELINUX=disabled
```
再起動しないと反映されないので注意。

```console
reboot
```

httpdをstartする。

```console
$ systemctl start httpd
```

以上で動くようになる。このあとセキュリティとかの設定をする必要がある。
GameObject起動時に自動でNullチェックを行う

## nullポで動きません？
SerializeField属性を使いinspectorで参照を入れるプロパティは、nullでない前提で制作を行う事が多いと思います。
しかし、変数名のリネームなどで、うっかりnullになっている事がしばしばあります。

## 自動でバリデーションをかける
もしそういった事があっても、すぐに気づけるようにStart()のタイミングで自動でnullチェックをするというアイディアのサンプルです。
nullを許容したい場合もあるかと思いますので、SerializeFieldを全部チェックではなく、あらたなAttributeを定義し、それでマークされた変数をチェックする事にします。

```c#
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Assertions;
using System.Reflection;
using System.Diagnostics;

class NullCheckMonoBehaviour : MonoBehaviour 
{
    // カスタムAttribute [NotNull] の定義
    [AttributeUsage(
        AttributeTargets.All,
        AllowMultiple = true,
        Inherited = false)]
    public class NotNull : Attribute {}


    [SerializeField, NotNull]
	GameObject go;

    [SerializeField, NotNull]
    GameObject go2;

    [SerializeField, NotNull]
    public Transform tr;

    [SerializeField, NotNull]
    protected Button btn;

    // 独自クラスでのテスト用
    class Something
    {

    }

    [NotNull]
    Something some;

	void Start () 
	{
        CheckNull();
	}

    [Conditional("DEBUG")]
    void CheckNull()
    {
        foreach (FieldInfo fieldInfo in GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
        {
            if (fieldInfo.GetCustomAttributes(typeof(NotNull), false).Length > 0)
            {
                object field = fieldInfo.GetValue(this);

//                Assert使うならこちら
//                Assert.AreNotEqual(null, field, string.Format("{0} : [{1}] is null", gameObject.name, fieldInfo.Name));

                if (field == null || field.Equals(null))
                {
                    string log = string.Format("{0} : [{1}] is null", gameObject.name, fieldInfo.Name);
                    UnityEngine.Debug.LogError(log);
                }
            }
        }
    }
}
```

上記コードをコピペしたクラスをgameObjectにアタッチし、インスペクターから変数をいれたり、わざとNoneにしたりして試して下さい。

## 解説

#### ・独自の属性の定義
冒頭で、カスタム属性のNotNullを独自に定義しています。(NotNullというクラス名は適当です (^_^;))

#### ・開発環境でのみ実行
Conditional属性で制御しています。

#### ・リフレクション
リフレクションを使ってNotNullが設定された変数を取得しています。

#### ・field.Equalsでnullチェック

```c#
if (field == null || field.Equals(null))
```
field.Equalsも使用しているのは、UnityEngine.Objectを継承している変数が field == null でtrueを返さないためです。
あまり深く調査していませんが、UnityEngine.Objectが独自に == を実装しているためと思われます。
（[object.ReferenceEquals(someObject, null) の方が someObject == null より早い…が、盲目的に使うのは危険](http://tsubakit1.hateblo.jp/entry/2015/05/28/014440)を参照）

#### ・タイミング
Start()でバリデーションをかけていますが、好きなタイミングに変えても良いでしょう。
Perlでの単独shiftとは

perl初心者の自分ようメモです。。。。


perlでのshift関数の一般的な使い方の例

my @city = ("東京", "大阪");
my $val = shift(@city);
print "$val¥n";

→東京　と表示される


では配列変数の引数がない単独shiftはどのようになるのか。

mainモジュールでは「@ARGV」がデフォルトの引数で、sub内では、「@_」がデフォルトの引数になる。
「@ARGV」は、コマンドラインの引数の配列で、「@_」は、サブルーチンの引数の配列。

◆サンプル
subx(4000);

sub subx {
    my $para = shift || 3000;
    print $para, "\n";
}

◆サンプル実行結果
C:\perltest>perl shift.pl
4000
PHPで配列のソート

## よく使うソート関数

- sort() 値でソート
- ksort() キーでソート
- usort() 比較関数で条件を指定し値でソート
- uksort() 比較関数で条件を指定しキーでソート
- shuffle() シャッフルするランダムを使いたい場面で

## あまり使わないが覚えておきたいソート関数
- asort() キーと値を維持し、配列中の位置をソートする
- array_multisort() 第一引数の配列の値で並べ替え、同時に第二引数の配列を第一引数のキーと同じ順番に並べ替える

## 逆順ソートは、rつき関数を使う。
rsort()、krsort()、arsort()

## sort()、ksort()については説明不要

## usort()
ユーザー定義の比較関数でソート

第2引数には関数名のほか、直接関数を書くことができます。
ここでしか比較関数を使用しない場合、直接書いた方が見やすいかもしれません。

```php
$a = array(3, 2, 5, 6, 1);
usort($a, function($a, $b) {
  if ($a == $b) {
    return 0;
  }
  return ($a < $b) ? -1 : 1;
});
```
## PHPマニュアル 配列のソート
http://php.net/manual/ja/array.sorting.php
エディターでの正規表現リファレンス（Sublimetext、Atom）


## よく使う正規表現

### ある文字が含まれる行を削除する

```
^.*不要.*\n
```




## その他
|^  |先頭行 |
|---|---|
|.  |改行以外の1文字 |
|$  |行末（A$でAで終わる文字列） |
|\ |直後のメタ文字をエスケープする（\.で「.」ととなる。） |

## 文字クラス
|[0-9] |数字1文字 |
|---|---|
|\w |アルファベットか数字かアンダースコア1文字 |
|\d |[0-9]と同じ |
|[A-Z] |大文字のアルファベット |
|\n  |改行 |
|\t  |タブ |
|[a-z]_- |[]内のいずれかの文字列 |
引用：<a href="http://hodade.com/seiki/page.php?s_mail" target="_blank">正規表現サンプル(メールアドレスを検索する)</a>

## 量指定子
|*|直前の文字列が0でもok。wor、word、worddに「word*」でworも引っかかる|
|---|---|
|+|直前の文字が1回以上の繰り返し|
|?|直前の文字が0回または1回の出現（windows?→window、windows。windows ?98→windows98、windows 98）|
|()|グループ化　(じゃ)+ーん→「じゃーん、じゃじゃーん、じゃじゃじゃーん」+だけだと「ゃ」だけの連続に。|
| ｜（本来は半角ですが、エスケープされないため全角）| いずれかの文字列。(ぼく｜わたし)は帰宅します→明日ぼくは帰宅します、明日わたしは帰宅します|


引用：<a href="http://okumocchi.jp/php/re.php" target="_blank">正規表現チェッカー PHP: preg_match() / JavaScript: match()</a>


## 正規表現（Atom）

|^\r\n|先頭の改行のみ|
|---|---|
|\d*\.|連続する文字列で、「.」まで。例：「11.」|
Rails で"Is the server running locally and accepting  connections on Unix domain socket "/tmp/.s.PGSQL.5432"?"

`⚠この方法ではデータベースのデータが削除されるのでご注意ください。`

PC内で複数環境をつくっていたら、ぶっ壊れて、このようなエラーがでた。

```
[1] pry(main)> User.all
Hirb Error: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

#環境
* macOS
* Homebrew 
* Rails 
* PostgreSQL

#解決方法


以下のコマンドで解決できました。

```
$ rm -rf /usr/local/var/postgres
$ initdb /usr/local/var/postgres
```

special thanks

http://web.sfc.keio.ac.jp/~t11240rk/blog/?p=191
Sentiment Treebankファイルのリーダー

[stanford sentiment treebank dataset](http://nlp.stanford.edu/sentiment/trainDevTestTrees_PTB.zip) のファイルを読み込むプログラムを書いた．

使用例
https://github.com/niitsuma/word2vec-keras-in-gensim/blob/master/example/treebank-classify.py

word2veckerasというパッケージの一部になっているので

```bash
pip install world2veckeras
```

で使える．

この[使用例](https://github.com/niitsuma/word2vec-keras-in-gensim/blob/master/example/treebank-classify.py)ではgensimのdoc2vecで分類精度が高いパラメータをsklearn.grid_search.GridSearchCVを使ってサーチするようになっている．この例で使っている[SentenceClassifierとDoc2VecClassifierについてはこちらの解説を参照](http://qiita.com/niitsuma/items/cbdbc602a1e2a65db2ba)

実装の本体は
https://github.com/niitsuma/word2vec-keras-in-gensim/blob/master/word2veckeras/treebank.py
でnltkのTree classに読み込むようになっている．
実装は非常に簡単．

他に
https://pypi.python.org/pypi/pytreebank/
という似たパッケージもあったがfine grade，positive negativeなどの細かい設定ができないようだったので，単純にnltkのTreeに流し込むだけにしてTreeデータをいろいろいじれるようにした
NPMのunpublishポリシーが変わるって


日本時間の3/23日頃、npm界隈で事件がありました。その経緯は以下の記事が簡潔にまとまっていて、大変分かりやすいです。

http://uasi.hatenablog.com/entry/2016/03/23/215308

さて、同記事で言及されているnpmのunpublishについてですが、ポリシーが変わるとのことです。

http://blog.npmjs.org/post/141905368000/changes-to-npms-unpublish-policy

# 新ポリシー

要点だけざっと翻訳してみると、以下の感じでしょうか。英語力が低くて所々よく分からない。


* (publishしてから？)24時間未満であればunpublishできる。その場合当該パッケージは完全にレジストリから削除される。ただし、同じ名前・バージョンで新たにパッケージを公開することはできない。
* 24時間を過ぎているとunpublishできない。unpublishしたいなら、 `support@npmjs.com` にその旨伝える。
* npmは連絡を受けたら、当該パッケージを削除することにより壊れる依存パッケージがないかチェックする。もしそのような依存パッケージがあれば削除しない。その場合は当該パッケージの所有者を変更するか、当該パッケージに依存しないように、依存パッケージの所有者に変更してもらわないといけない。
* パッケージの全バージョンが削除されたら、安全にプレースホルダーパッケージ(?)で置換する。これは第三者からの攻撃から守るため。
* コミュニティの別のメンバが同じ名前で安全なプレースホルダーパッケージとして公開したい場合、`support@npmjs.com` にその旨伝える。そしてnpmが許可するかを決める。
基本的には許可する。



# 読んでよく分からなかったこと

* 最初の24時間ルールはpublishしてから？
* 依存チェックされるのは、同じくpublishされているパッケージのみ？野良パッケージ等はチェックされない？
* プレースホルダーパッケージとは？第三者が勝手にとれないように、ということだと思うがnpmの仕様としてそういうものがあるのか？それとも本当にダミーパッケージがあるのか？
* いつからそうなる？　このポリシー変更は今後もnpmをよくしていくための最初の一歩(継続して改善していく)だとか、何か意見があればコメントしてね、というのは読み取れたけど、実際にいつから新ポリシーを適用する予定かについては言及されていなかったと思う。まだ草案ってことなのかな？

---

＜ 3/30 16:10頃 追記 ＞

新ポリシーの「第三者からの攻撃から守るため」に関連する [@itの記事](http://www.atmarkit.co.jp/ait/articles/1603/30/news078.html) があったので追記します。
記事中の手順1「細工したモジュールをユーザーの環境にインストールさせる」の足がかりにされてしまうおそれがあるということです。
BashのプロンプトにGitのブランチ名を含める。

# はじめに

目下、以下の書籍

[独習Git (翔泳社 2016/2/26初版)](http://www.amazon.co.jp/dp/4798144614)

を使ってGitを学習しておりまして、この本の第9章「9.6 さらなる探求」で、
首題のように**シェルプロンプトにブランチ名を含めよう**というトピックが
載っていたので実際にやってみました。その手順を以下に記載しました。

# インストール対象マシン

- Mac mini (Late2012)
- OS X El Captitan バージョン 10.11.3

# 現状確認

ターミナルを起動。現状のプロンプトは、以下のようにカレントディレクトリのみ

**~ $** date
2016年 3月30日 水曜日 12時19分02秒 JST
**~ $** cat ~/.bash_profile | grep PS1
export PS1='\W $ '
**~ $** cd gitwork
**gitwork $** pwd
/Users/ykt68/gitwork
**gitwork $**

# git-prompt.shの入手

以下のgit-prompt.shを自分のホームディレクトリにダウンロード

https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh

ダウンロードしてきたgit-prompt.shの冒頭に、使い方が書いてあるのでざっと読む。（英文）

# 隠しファイルにリネームする。

**~ $** mv git-prompt.sh .git-prompt.sh
**~ $** ls -la .git-prompt.sh
-rw-r--r--@ 1 ykt68  staff  16102  3 30 12:37 .git-prompt.sh

※今後も git-prompt.shは改良されるかもしれないので、ファイルサイズは変わる
かもしれません。

# .bashrc に追記

.git-prompt.shの冒頭のコメント

> 2) Add the following line to your .bashrc/.zshrc:
> 　　　　source ~/.git-prompt.sh

のとおりに .bashrc をviなどで開き、最後に

```bash
source ~/.git-prompt.sh
```
を追加して保存

# .bash_profile の　PS1を修正

.git-prompt.shの冒頭のコメント

> 3a) Change your PS1 to call \_\_git_ps1 as
>　　　command-substitution:
>　　　Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

のとおりに、.bash_profile　で指定しているPS1の設定を修正する。

修正前：

```bash
export PS1='\W $ '
```

修正後：

```bash
export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
```

上記のように修正して保存


# 動作確認

上記のように、.bashrcと.bash_profileを修正して保存後、あらためてターミナル
を起動し、以下のように修正が反映されていることを確認した。

**[ykt68@MacMini ~]$** cd gitwork
**[ykt68@MacMini gitwork]$** cd math
**[ykt68@MacMini math (another_fix_branch)]$** git branch
* another_fix_branch
  master
  new_feature
**[ykt68@MacMini math (another_fix_branch)]$** git checkout master
Switched to branch 'master'
**[ykt68@MacMini math (master)]$** git checkout new_feature
Switched to branch 'new_feature'
**[ykt68@MacMini math (new_feature)]$**

なお、上記のディレクトリ mathおよび各ブランチは、[独習Git (翔泳社 2016/2/26初版)](http://www.amazon.co.jp/dp/4798144614)
にそって実習したときに作成したもの。

以上
Mac OS X Yosemite で Vagrant と VirtualBox をアップデートする手順

MacOSの場合はdmgから生成されるpkgファイルを使ってアップデートするだけなので非常に簡単です。
このメモのポイントはバージョンの確認方法ですかね。

# 現行環境
　MacBook Air (13-inch, Early 2014) 1.4GHz Core i5/ Mem 8GB
　Mac OS X Yosemite

# バージョン差分

|   製品    | 更新前 | 更新後 |
|:---------|------:|-------:|
|VirtualBox| 4.4.30 | 5.0.16  |
|Vagrant   |  1.7.2 |  1.8.1 |

# 元のバージョン確認

```:cli
$ VBoxManage -v
4.3.30r101610
$ vagrant -v
Vagrant 1.7.2
```

# アップデート

それぞれの公式サイトからdmgを落としてインストールするだけ

↓Download - Vagrant by HashiCorp
https://www.vagrantup.com/downloads.html
↓Downloads – Oracle VM VirtualB
https://www.virtualbox.org/wiki/Downloads

# 確認

```:cli
$ VBoxManage -v
5.0.16r105871
$ vagrant -v
Vagrant 1.8.1
```
Atomメモ

個人的なAtom使用メモ．適宜追加していく予定．

# Proxyの設定
packageのInstallとかにProxyの設定が必要．（Updatesは必要ないっぽい？）

```
$ apm config set proxy http://proxy:port
$ apm config set https-proxy http://proxy:port
```

# Emacsキーバインド
Preferences->Installでatomic-emacsを検索，インストールするだけ．

# コード整形
atom-beautify
綺麗にフォーマットしてくれる．
Emacsのキーバインドと被るのでconfigのkeymap.csonに以下を追加

```
'.editor':
  'ctrl-alt-b': 'atom-beautify:beautify-editor'
```
PlayFrameworkでBootstrapを使うときに便利なplay-bootstrap

# play-bootstrapとは
playframeworkでテンプレートヘルパーのようにBootstrapをレンダリングできるライブラリ
公式ドキュメントが充実している
http://adrianhurt.github.io/play-bootstrap/


# 事前準備
## build.sbt

- libraryDependenciesに以下を追加

PlayとBootstrapのバージョンによって使うものが違う
ここではPlay2.5とBootstrap4用のplay-bootstrapを追加している

libraryDependencies ++= Seq(
  javaJdbc,
  cache,
  javaWs,
  **"com.adrianhurt" %% "play-bootstrap" % "1.0-P25-B4-SNAPSHOT"**
)

- resolverを追加

libraryDependenciesの下にでも以下を追記

```resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"```

## 好きな手段でBootstrapを読み込む

CDN、Webjar、Bower、直接、etc
今回は公式を参考にしてヘッダーにCDNを記述した
http://v4-alpha.getbootstrap.com/getting-started/introduction/

```<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" integrity="sha384-y3tfxAZXuh4HwSYylfB+J125MxIs6mR5FOHamPBG064zB+AFeWH94NdvaCBm8qnd" crossorigin="anonymous">```


# 使い方
- Viewに使いたいフィールドコンストラクタをインポート

・Vertical forms
・Horizontal forms
・Inline forms
・Clear field constructor
の4つがある
とりあえずVertical formを指定してみる

```@import b4.vertical.fieldConstructor```

- フォーム部分

公式のサンプルをコピペしてちょっと変更
playのヘルパーにはsubmitやresetがないが、
play-bootstrapにはこれが用意されているのが素晴らしい


```
@b4.form(routes.HomeController.login) {
  @b4.email( form("email"), '_label -> "Email", 'placeholder -> "example@mail.com" )
  @b4.password( form("password"), '_label -> "Password", 'placeholder -> "Password" )
  @b4.checkbox( form("remember"), '_text -> "Remember me", 'value -> true )
  @b4.submit('class -> "btn btn-primary"){ Sign in }
}
```

- 表示

![playbootstrap.png](https://qiita-image-store.s3.amazonaws.com/0/77685/8c6a7f59-170f-0a86-535c-6a95877ef9e7.png)


# 余談
PlayでBootstrapを使いたいときはよくあるが、
ディフォルトのテンプレートヘルパーでレンダリングされるHTMLはBootstrapに則してくれない
先人たちの対処を見てみると、Bootstrapに則すように独自のヘルパーを作って、
それをimplicitFieldConstructorして……とやってごり押し気味に解決している
何とかならないのかと思って良さそうなのを探したら、あった
gensim Doc2vecのパラメータをsklearn.grid_search.GridSearchCVでサーチ

gensim.models.word2vec.Doc2VecのパラメータをsklearnのGridSearchCVでサーチするプログラムを書いた

使用例

https://github.com/niitsuma/word2vec-keras-in-gensim/blob/master/example/sentence-classify.py

word2veckerasというパッケージの一部になっているので

```bash
pip install world2veckeras
```
で使えるようになる．

SentenceClassifierとDoc2VecClassifierの２つのclassはそれぞれ

- SentenceClassifier:既にパラメータ設定済みなdoc2vecインスタンスdv=Doc2VecをSentenceClassifier(doc2vec=dv)などと入力して文の分類器を作る
- Doc2VecClassifier:文の分類精度が高くなるようなDoc2Vecのパラメーターサーチを行う


この例ではbrownコーパスの文をnews, religion, hobbies, science_fiction, romance, humorのカテゴリに分類する精度を上げるようなパラメータをサーチしている．


より詳細な実装は
https://github.com/niitsuma/word2vec-keras-in-gensim/blob/master/word2veckeras/doc2veckeras.py
の中のSentenceClassifierとDoc2VecClassifierというclassを見るとよいが，100行以下の単純な実装となっている．やっていることは単純でDoc2VecClassifierの_init__が以下のようになっているだけだ

```python
from sklearn.base import BaseEstimator,ClassifierMixin

class SentenceClassifier(BaseEstimator, ClassifierMixin):
...

doc2vec_init_param_dict={'dm': 1, 'dm_mean': 0, 'hs': 1,...}

class Doc2VecClassifier(SentenceClassifier):
    def __init__(self,...):
        ...
        vars(self).update(doc2vec_init_param_dict)
```


とすることでDoc2Vecのメンバー変数と同じ名前のメンバー変数を作って，Doc2VecにコピーすることでsklearnのGridSearchCVを使うようにしている.
gensimの他のclassも同様にパラメータサーチすることが可能と思われる
Xcode7.3が立ち上がらなくなった時にやったこと

何が原因か分からないけど、今朝Xcodeが死んだ。
立ち上げようとしてもDockに一瞬アイコンが表示されてすぐにkillされる。
長い間連れ添った家族のようなry


#1
Xcodeが前に開いたプロジェクトに起因して死んだ気がしたので、

`defaults write -app "Xcode" NSQuitAlwaysKeepsWindows -bool false`

で、起動時にkill前のウィンドウ表示をしないようにしてみた。

-> ダメ


#2

`/Users/${User}/Library/Developer/`

を削除してXcodeを再インストール

-> ダメ

#3

`~/Library/Application Support/Developer/Shared/Xcode/Plug-ins`
を削除

-> 動いた


#結論
プラグインがダメ。Appleを疑う者には死をって感じだった。
Aerospikeクラスターからノードを外す

以下、Aerospike 3.X系-3.8.x

### 20160902追記
>※3.9でpaxos-recovery-policy、Cluster-dunはOmmitされた模様・・・
※Nodeを外す場合は、該当のAerospikeプロセスをStop
※復活してくれませんかねえ。

# 概要
Aerospike、メンテとか、ローリングアップデートしたいじゃないですか。
でも、いきなりクラスタからノード外すと、
やっぱり色々不都合が有ったりするわけで・・・

システム側でリトライとか仕込んでても、リトライしても失敗するとか。
なので、メンテの際はやっぱりクラスタからノード外してえなと。


## Aerospikeのクライアント側のマッピング
Aerospikeは、クライアント側にデータのマッピング情報を持っており
tend thread がデフォルトで1秒間隔で、このマッピング情報が書き換えれられる。
[http://www.aerospike.com/docs/client/c/usage/shm.html]

（もちろんある特定ノードが死ねば、他のノードにあるデータを見に行く）

が！デフォ1秒なので、ノードが落ちたりした場合
timeout 100ms, Retry Interval 200ms とかでリトライさせても
同じにノードにデータを取りに行って、結局取れなかったりする。
※関し感覚はtendIntervalで変更も可能。


# どうすんの？
```bash

$ asadm [-h HOST] [-p PORT] [-U USER] [-P [PASSWORD]]
Aerospike Interactive Shell, version 0.0.16
Found X nodes
Online:  192.168.XX.XX:3000,,,,

# 現在のクラスタ確認 
Admin> info service

# クラスタからノードを外す
Admin> cluster dun 192.168.XX.XX:3000 # ←これでクラスターから外れる
# asinfo dun でもできるが、NODE IDで指定なので面倒

# Cluster Sizeが変わる、Migratesが起こる ので確認
Admin> info service

# コネクション減ったの確認
Admin> info network   
# またはAMCで確認
 

# 諸々終わったらノードをクラスタに戻す
Admin> cluster undun 192.168.XX.XX:3000
 
# migrateの値が0になるまで待機。migrateが落ち着いたらまた次のノードを作業など
Admin> info service 

```

それでは良いAerospike活用を！
PowerShell による CAB 解凍＆圧縮


InfoPathフォーム(*.xsn)の中身を書き換えるのに使いました。

# 解凍

```
# 解凍したいファイルを指定
$FilePath = "(ファイルパス)"

# 解凍先フォルダを指定
$extractedFolderPath = "(フォルダパス)"


# 使いやすいようにファイル情報クラスを作成
$fi = New-Object IO.FileInfo($FilePath);

# 解凍先フォルダ作成
$tempDir = New-Item ($extractedFolderPath) -ItemType Directory -Force

# CABファイルを解凍
expand ("""" + $fi.FullName+ """") -F:* $tempDir
```

# 圧縮

```
# 圧縮後のファイルを指定
$FilePath = "(ファイルパス)"

# 圧縮するフォルダを指定
$archivingFolderPath = "(フォルダパス)"


# 使いやすいようにファイル情報クラスを作成
$fi = New-Object IO.FileInfo($FilePath);

# FSOを作成(短い形式のフォルダを作るため)
$fso = New-Object -ComObject Scripting.FileSystemObject

# テンポラリフォルダに ddf ファイルのパスを生成
$ddfFile = [System.IO.Path]::GetTempFileName()

# ddfファイルの内容を作成
$ddfHeader =@"
;*** MakeCAB Directive file
;
.OPTION EXPLICIT 
.Set CabinetNameTemplate=temp.cab
.Set DiskDirectory1={0}
.Set MaxDiskSize=CDROM
.Set Cabinet=on
.Set Compress=on
"@ -F $fso.GetFolder($fi.Directory.FullName).ShortPath

# ddf ファイルを生成
$ddfHeader | Out-File -filepath $ddfFile -force -encoding oem

# 圧縮するフォルダの内容を ddf ファイルに書き出す
$tempDir.GetFiles() | %{ 
    '"' + $_.Fullname + '"' | 
    Out-File -FilePath $ddfFile -Encoding ASCII -Append
}

# ddf ファイルを指定して圧縮する
makecab /f $ddfFile
# ddf ファイルを削除
del $ddfFile

# ファイル名を整える（ddf ファイルにマルチバイトのファイル名が指定できないので、一時的に temp.cab で作成した後に直す）
$fi.Directory.GetFiles("temp.cab")[0].MoveTo($fi.Name)

# ごみが出るので削除
$fi.Directory.GetFiles("setup.*") | Remove-Item
```
Mac上にデータ分析で使用するAnacondaをインストールし、IDEを起動するまで

# 環境
Mac OSX: 10.11.3
Python: 2.7.10(System)
Pyenv: 20160202
Anaconda: 3-2.4.1 ※2016/03/27現在の最新バージョン
Python: 3.5.1(Anaconda)

# Pyenvをインストール

```shell-session
brew install pyenv
```

※brewコマンドはHomebrewのインストールが必要です

# Pyenvの設定
以下を追記する。

```shell-session:~/.bash_profile
export PATH="$HOME/.pyenv/shims:$PATH"
```

# Anacondaをインストール
以下のコマンドでインストールできるAnacondaバージョンを確認する

```shell-session
pyenv install --list | grep anaconda
```

そして、以下のコマンドで指定のバージョンをインストールする

```shell-session
pyenv install anaconda3-2.4.1
```

* Anacondaを利用するときのPythonはAnaconda内のPythonのバージョンに依存します
* Mac OSX 10.11の標準Pythonバージョンは2.7.10だが、Anaconda3-2.4.1は、3.5.1

# パッケージのインストール
パッケージのインストールは、Anaconda内のpipを利用して、インストールすること。Anacondaのpipを指定せずにpipコマンドを実行してしまうと、標準で使用しているPythonを呼び出しインストールするため使用できないと思うので注意（未検証）。

```shell-session
~/.pyenv/versions/anaconda3-2.4.1/bin/pip install [パッケージ名]
```

e.g.

```shell-session
~/.pyenv/versions/anaconda3-2.4.1/bin/pip install pulp
~/.pyenv/versions/anaconda3-2.4.1/bin/pip install ortoolpy
```

# IDEの起動
## Anacondaランチャー画面起動
Anacondaをインストールするとショートカットがデスクトップ上に作成されるので、ダブルクリックすると、Anacondaのランチャー画面が出現します。

※以下の.appをダブルクリックでももちろん起動します

```shell-session
~/.pyenv/versions/anaconda3-2.4.1/Launcher.app
```

## Spyder起動(IDE)
Anacondaランチャー画面のspyderの右にある「Launch」をクリックすると、Spyder(IDE)を起動できます。

# まとめ
データ分析するための環境がこんなに簡単に構築できちゃうなんて、とてもありがたいですね。
今後は、データの収集・加工・分析・最適化などで使用していきたいと思います。
それらの記事も投稿していきたいと思います。
スクロールするViewの中でCardViewが落ちる問題の解決法


#はじめに
スクロールするView(ScrollViewとかRecyclerView等)の中に長いCardView(TextViewなどが入って可変の場合など)を入れた状態でActivityOptions.makeSceneTransitionAnimationをしてアクティビティがアニメーションしながら閉じる瞬間に落ちる問題の解決法です。
そもそもそんな長いCardViewを作るなという話なんですが、すぐに対応しないと行けない場合は有効です。

#エラー

```
Fatal Exception: java.lang.IllegalStateException
Unable to create layer for CardView raw
```

#対処法
対象のスクロールするViewのxmlに```android:transitionGroup="true" ```入れるとクラッシュせずにアニメーションできるようです。
この設定によりViewGroup全体がActivityと一緒にActivityTransitionするようになるようです。

```xml
<android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"           
            android:transitionGroup="true" />
```

#参考
http://stackoverflow.com/questions/26626344/scene-transition-with-hero-elements-throws-layer-exceeds-max-dimensions-support
GCEでログインできなくなった

#突然繋がらなくなるSSH
特に断りがなければ全てWEBコンソールでの操作とする。
##警告を上がるPuTTYさん

```
---------------------------
PuTTY Fatal Error
---------------------------
Disconnected: No supported authentication methods available (server sent: publickey,gssapi-keyex,gssapi-with-mic)
---------------------------
OK   
---------------------------
```
##SSHキーの整理をする
VM インスタンスの設定画面のSSHキーの項目と
Compute Engine->メタデータ->sshキーにあるキーを確認して同じアカウント名で違う公開鍵があれば
そいつが原因。
同じアカウント名を整理するか新しいアカウント名で鍵を作るとログインできるはず。

##どうやらキー情報は共有化された
GCEのWEBコンソールからCompute Engine->メタデータ->sshキーと辿ると今まで登録したSSHが見える。
どうやら各インスタンスに個別に書いていたSSH キーがここに纏められたようだ。

ある日突然「プロジェクト全体の SSH キーをブロック」と言う文言がVM インスタンスの設定画面に出てきたので
いつの間にかキーの共有化が行われたと考えるのが普通だろう。
##どうしてこうなった
解決後、手付かずのインスタンスには通常通りログインできたので違いをみてみると、メタデータにSSHキーのデータが残っていた。
つまり、もともとインスタンスにあったSSHキーは共通へ移され、メタデータに既存のSSHキーも残り、GCEの中の人(scriptかなにか)が.sshを書き換え時に同じアカウント名に違う公開鍵が記録されログインに異常がおきた。といった具合だ。

異常があったインスタンスはvisudoでrootの設定を変えていたので、問題解決に余計に手間取った。
##SSHキーの管理は確実に
共有化できて便利なった。GCEは便利なのでキーの管理が煩雑になってたのは認める。そしてちゃんと管理すべきだと思う。
しかし何もアナウンスが無く（もしかしたらいんぐりっしゅなアナウンスがあったかもしれないが、知らんて。。）、いきなりと言うのはさすがGOOGLE-SANといったところだ。
「自分で判断する」と「勝手に判断しない」のバランスの取り方

働き始めて結構な人が悩むことで、「なんでそんなことも判断できない？」と「自分で勝手に判断するな」の2種類のお叱りを受ける場合があるという不条理、非常によくあります。どうすりゃいいんだと。

※「自分で考えた上で決裁を求めればいい」という模範解答がよく出てくるけど「そんなことまでいちいち聞くな」と言われるだけです。

結論から先に言います。**「勝手に判断するな」の方が重要な指示です。**「自分で考えろ」は忙しくて対応するのが面倒という気持ちがついぽろっとこぼれてしまっただけの言葉です。上司も先輩も完全たり得ない人間であるということです。後輩の成長を願う先輩の立場から言っているケースもありますが、だとしてもトラブルをコントロールすべき管理職の立場からの「勝手に判断するな」の方がずっと重い指示であることに変わりはありません。

そして、自分で判断すべき事項と判断を仰ぐべき事項のラインがよく分からない場合どうすればいいか。
まずそんなラインは存在しないと諦めてください。だって人間そんなにデジタルに動いていません。
そして上司が明確なラインを持っていない一方で、あなた自身の信頼度も日々変動しています（基本的には日々上昇しているはず）。だからラインらしきものがあったとしてもそれは動いているからです。
「これは以前自分の判断でさせてくれたから以降こっちの領分」と地道に実績を作っていってください。

もちろん本当に必要なのは、上司が「なんでそんなことも判断できない？」とも「自分で勝手に判断するな」とも叱らないことです。こういうことで叱責していいことなんかありません（「任せる」/「それは事前に相談してほしかった」と言えば十分ですよね）。ご自身は、そういう先輩・上司にならないよう心に留めておいてください。
ReactiveCocoaでズンドコキヨシ

RxSwiftでのズンドコキヨシはあるようですがReactiveCocoaでのズンドコキヨシがなかったので作ってみました。

```swift
enum Zundoko: String {
    case Zun = "ズン"
    case Doko = "ドコ"
    
    static func next() -> Zundoko {
        return arc4random_uniform(2) % 2 == 0 ? .Zun : .Doko
    }
}

SignalProducer<Zundoko, NoError> {
    observer, disposable in
    disposable += QueueScheduler().scheduleAfter(NSDate(), repeatingEvery: 0.1) {
        observer.sendNext(Zundoko.next())
    }
    }.scan([Zundoko]()) { (array, value) -> [Zundoko] in
        print(value.rawValue)
        return Array((array + [value]).suffix(5))
    }.takeWhile { array -> Bool in
        array != [.Zun, .Zun, .Zun, .Zun, .Doko]
    }.startWithCompleted {
        print("キ・ヨ・シ！")
}

```

SignalProducerでZunもしくはDokoを連続して作成します。scanで最終5個までの配列を作成します。takeWhileで終了条件であるズンズンズンズンドコと照合して終了するかを決定します。終了条件に合致するとキ・ヨ・シ！を出力して終了です。
Sublime text | 「現在開いているファイル」のパスを得る

1. メイン表示領域のどこかを右クリックする。（タイトルバーではない）
2. *Copy File Path* を選ぶ。

![スクリーンショット 2016-03-30 12.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/90607/1f1dcce9-48b5-95f8-53a9-cbda56ce6f2a.png)

こんなに簡単だった！

# 余談

- 「タイトルバーではない」が罠すぎる。

# 参考

- http://stackoverflow.com/questions/29743615/how-to-easily-get-current-file-path-in-sublime-text-3



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Cocos2d-x js セットアップ + スマフォブラウザ周りの動作確認

覚え書きです。

# 開発環境

- cocos2d-x 3.10
- OSX 10.11.4 (El Capitan)
- Google Chrome 49.0.2623.87

# セットアップ

git submodule を入れておかないとプロジェクト生成時に必要なファイルがコピーされない。

```bash
$ pushd cocos2d-x
$ git submodule update --init --recursive
$ popd
$ cd ${WORKSPACE}
$ cocos new SandBoxWeb -p com.smith.sandbox.web -l js -d .
```

# 起動確認

ローカルサーバにビルドされたアプリがブラウザで開かれる

```bash
$ cocos run -p web
```

サーバ再起動無しでjsへの変更を反映したい場合、ブラウザリロードで反映される。
キャッシュが利用される場合は強制リロードすればOK。
(chromeであれば shift+cmd+R など)


# コンパイル対象ファイルを編集

poject.json に対象ファイルを追記する。
ここは自動生成したい。

```${PROJECT_ROOT}/poject.json
{
    "project_type": "javascript",

    "debugMode" : 1,
    "showFPS" : true,
    "frameRate" : 60,
    "noCache" : false,
    "id" : "gameCanvas",
    "renderMode" : 0,
    "engineDir":"frameworks/cocos2d-html5",

    "modules" : ["cocos2d"],

    "jsList" : [
        "src/resource.js",
        "src-es5-transpiled/app.js",          // added
        "src-es5-transpiled/another_scene.js" // added
    ]
}

```

# es5 で書いてみる

### パッケージインストール

```bash
$ npm init
... # 適当に
$ npm install gulp --save
$ npm install gulp-babel --save
$ npm install babel-preset-es2015 --save
$ echo '{ "presets": ["es2015"] }' > .babelrc
```

### タスク定義

```gulpfile.js
var gulp  = require("gulp");
var babel = require("gulp-babel");

var path = require("path");

var es5SrcDir  = path.join(__dirname, "src-es5");
var es5DestDir = path.join(__dirname, "src-es5-transpiled");

gulp.task("transpile", () => {
    return gulp.src(path.join(es5SrcDir, "*.js"))
        .pipe(babel())
        .pipe(gulp.dest(es5DestDir));
});

```

Scene の実装は割愛。

### transpile & run

```bash
$ gulp transpile
$ cocos run -p web
```

# その他

## スマフォブラウザでの動作確認

### Android 5.0.2 / Zenfone2 Lazor / Chrome

- スプライトアニメーションちゃんと動く
- ローカルストレージ機能する
- フルスクリーンになってくれる
- サウンド再生される

### Android 5.0.2 / Zenfone2 Lazor / android.webkit.WebView (アプリ内ブラウザ)

- 動かない

### iOS 9.1 / iPhone / Safari

- スプライトアニメーションちゃんと動く
- ローカルストレージ機能する
- フルスクリーンにならない (IOS 9から？)
- ナビゲーションバーとかが描画領域にかぶる
- 音声フォーマットの認識が厳しい
適当なフリー素材のmp3のBGMが再生されなかった
iTunesで当該ファイルを読み込んで、mp3で書き出したら再生されるようになった。

- イヤフォンジャック経由でないと音がならない

### iOS 9.1 / iPhone / UIWebView (アプリ内ブラウザ)

- スプライトアニメーションちゃんと動く
- サウンド再生が怪しい

### iOS 9.0.3 / iPod6 / Safari

- スプライトアニメーションちゃんと動く
- ローカルストレージ機能する
- フルスクリーンにならない (IOS 9から？)
- ナビゲーションバーとかが描画領域にかぶる
- イヤフォンジャック経由でも音がならない(バグ？)

## ES対応状況

- 公式非対応、自前で頑張れ


## パフォーマンス(描画)

### 条件

SpriteSheetでアニメーションするNodeを1000個配置。
Batchなどの利用は明示していない。

### Zenfone2 Lazor / Android 5.0.2) / Chrome

__10 - 15 fps__

ちなみに、Node 500個で 25fps 程度。

### iPod6 / iOS 9.0.3) / Safari

__30 fps__


### 通信系API

- HTTP通信用APIがない
- socket.ioが申し訳程度に置いてある

### デプロイ

- ファイル更新のみで済む
- ブラウザキャッシュ対策は必要
[memo]Vagrant環境のProvisioningにAnsibleを使う

Vagrant環境のセットアップをAnsibleで行いたい場合、Vagrantfileに以下の記載をする

```
config.vm.provision "ansible" do |ansible|
  ansible.playbook = "ansible/sites.yml"
  ansible.verbose = "vv"
  ansible.sudo = true
end
```