OmniAICreator/Qiita-1.07M huggingface dataset:
自爆スイッチぽちっとな

# はじめに
Smalltalkの魅力の1つはライブプログラミングにあります。ライブプログラミングとは、プログラムを動かしながらそのプログラムを変更し、その変更を反映させながらプログラムがそのまま継続実行されることを指します。

ライブプログラミングはよく活線配線に例えられます。そう、電源に繋がっていて、スイッチが入っていて、回路に電圧がかかり電流が走りまくっている中で電線を切ったりワイヤを繋げたりするようなものです。この危険と背中合わせなスリリングなプログラミングこそがSmalltalkの華といえます。ヒャッハー！

一方で、昔、あるSmalltalkerから「自分自身を壊せないような言語はだめだ」みたいなことを言われたことがあります。いやー、安全なほうがいいでしょう、とは思うのですが、一方で自爆スイッチの魅力には抗い難いものがあります。そう、Smalltalkはそのシンプルさと強力さの裏返しで、活線状態の魅力的な自爆スイッチがいっぱいあるのです。

壊す方法を知ることは、壊さないようにする方法を知ることに繋がります。さあ、みんなで安全なSmalltalkプログラミングのために、自爆スイッチを押してみましょう。今回はPharo 5で試してみました。

# Smalltalkの無の境地
Smalltalkには```Smalltalk```というグローバル変数があります。こいつはクラスを含む全てのグローバル変数を管理するとともに、Pharoなどの実装ではオブジェクトメモリの管理やスタートアップ・シャットダウンの処理などを行う大事なオブジェクトです。にやり。

```smalltalk
Smalltalk := nil
```

一発で固まりました。よしよし。

# trueとfalse、入れ替わってる〜？
Smalltalkには```become:```という素晴らしい操作があります。こいつは、2つのオブジェクトのアイデンティティを入れ替えてしまうというものです。代入と違って、オブジェクトメモリ中でのアイデンティティそのものを変更してしまうので、その波及効果はオブジェクトメモリ全域に及びます。にやり。

```smalltalk
true become: false
```

これまたすぐに固まりました。よしよし。

#無限の再帰で走りだす♪
これは多くのプログラミング言語で使える、無限再帰によるスタック食いつぶしです。みなさんが新しい言語を学んだらまず最初に試す、例のあれです。にやり。

```smalltalk
| block |
block := [block value].
block value
```

はい、ちょっと時間がかかりましたが、ちゃんと固まりました。よしよし。

# Object subclass: Process
Smalltalkではプロセス（グリーンスレッド）もオブジェクトです。この```Proesss```クラスの定義は、Smalltalkの盲腸と言われて久しいもので、これがなんと```Link```クラスのサブクラスなんです。

おお、```Process```よ、実装継承とはなさけない。というわけで、こいつを```Object```のサブクラスにしたいのだけど、なかなかうまくいかないという話を昔聞いたような。そうだよね、自分を動かしてるプロセスのクラス定義を変えるとかね、VMともガッツリつながってそうだしね、いかにもヤバそうだよね。にやり。

```
Object subclass: #Process
	instanceVariableNames: 'nextLink suspendedContext priority myList name env effectiveProcess terminating'
	classVariableNames: 'PSKeys PSKeysSema'
	package: 'Kernel-Processes'
```

お、Processの定義を変えちゃいかんという警告が。

<img width="700" alt="WarningMessage.png" src="https://qiita-image-store.s3.amazonaws.com/0/59918/1cbfb5c3-bd77-aa5a-04d5-bbf92e235467.png">

いいぞ、そうこなくっちゃ。もちろん、自爆スイッチぽちっとなする時には、警告なんて読まずにOKボタンですよね。というわけで、Proceedを押します。

…あれ、壊れない。普通に動いてるぞ。
念のためにProcessBrowserで覗いてみると…

<img width="872" alt="ProcessBrowser.png" src="https://qiita-image-store.s3.amazonaws.com/0/59918/f38d6fea-af8d-49fd-97e3-540e8f08da4a.png">

なんか、ちゃんと動いているように見える。残念ながらこの自爆スイッチは壊れているようだ。ち。
もしかして、bootstrapプロジェクトの~~せい~~おかげでしょうか？

# おわりに
Smalltalkには他にも自爆スイッチがたくさんあります。自爆スイッチの場所を知ることで、自爆スイッチに鍵をかけることも可能になります。例えば、[再帰自爆に対する防御](http://qiita.com/tomooda/items/35c99362d866cbfde377)のように技術的な対処も可能になります。

さあ、みなさん、ご安全に

**<div align="center">ぽちっとな</div>**
Chainer で Jacobi 行列を計算

Chainer では多次元ベクトル出力を出す関数のヤコビ行列計算をサポートしていないそうですが、以下のようにすれば計算できますね。

```python:Jacobian.py
def Jacobian(model,x):
    y = model(x)
    n = y.data.size
    for i in range(n):
        x.cleargrad()
        y = model(x)
        z = np.zeros((1,n),dtype=np.float32)
        z[0,i]=1
        y.grad = np.array(z)
        y.backward()
        if i==0:
            J = x.grad
        else:
            J = np.concatenate((J,x.grad))
    return J

in_size = 3
out_size = 2
Wtrue = np.array([[1,1,0],[0,0,2]]).astype(np.float32)
l1 = L.Linear( in_size, out_size, initialW = Wtrue )

x = Variable( np.array([[0,0,0]]).astype(np.float32))

W = Jacobian(l1,x)
```

出力

```python:
>>> array([[ 1.,  1.,  0.],
       [ 0.,  0.,  2.]], dtype=float32)
```
position:fixedが効かない事件簿

# 初めに

よし、ヘッダーを画面上に固定してやろ（＾ω＾）

って時に

え、ヘッダーの上に文字が来るんですけど( ‘д‘⊂彡☆))Д´) ﾊﾟｰﾝ

とか

スクロールして、動的におしゃれに上部メニューを表示させたいのにスクロール中に表示されない( ‘д‘⊂彡☆))Д´) ﾊﾟｰﾝ

とかそんな事件の対処法をテンションに任せて書いていこうと思います。


# 事件１「z-index」

## 概要

ヘッダーに`position:fixed`を指定して`top:0`,`left:0`で画面上部に固定しているのに

なんで他の要素が上に来ているの！？という事件。

## DEMO

[DEMO](https://theimaginationwasunbroken.com/position-fixed/sample1.html)

## キャプチャ

![fixed_sample1 (1).gif](https://qiita-image-store.s3.amazonaws.com/0/81308/3ec9bf2c-8ae6-712b-0ac5-c7b34ce19d48.gif)


## code

### html

```html
<body>
    <div class="div_elm">
        hoge
    </div>
    <div class="fixed_elm">
        hoge
    </div>
    <div class="div_elm">
        hoge
    </div>
</body>
```

### css

```css
.fixed_elm {
    height: 100px;
    width: 100px;
    background: red;
    position: fixed;
    top: 0px;
    left: 0px;
}

.div_elm {
    position: relative;
    background-color: yellow;
    text-align: center;
}
```

## 解決策

`position:fixed`にしている要素の前後に同じdiv要素を配置しているのに、なんで`position:fixed`にしている要素の次の要素は上に来ているのか・・・

原因はdiv要素に`position:relative`を指定している時は、`position:fixed`にしている要素に`z-index`を指定していないからでした。

下記のように修正するときちんと動きました。

```css
.fixed_elm {
    height: 100px;
    width: 100px;
    background: red;
    position: fixed;
    top: 0px;
    left: 0px;
    z-index: 1;
}
```

# 事件２「Transform」

## 概要

ヘッダーに`position:fixed`を指定して`top:0`,`left:0`で画面上部に固定しているのに

位置がなぜか画面上部にならない！？

## DEMO

[DEMO](https://theimaginationwasunbroken.com/position-fixed/sample2.html)

## キャプチャ

![sample2.gif](https://qiita-image-store.s3.amazonaws.com/0/81308/44ed6fde-c85b-a1da-a5e5-6005cbe5af1d.gif)

## code

### html

```html
<body>
    <div class="fixed_elm">
        hoge
    </div>
</body>
```

### css

```css
body {
    transform: translate3d(0, 0, 0);
    height: 300px;
    background-color: black;
}

.fixed_elm {
    height: 100px;
    width: 100px;
    background: red;
    position: fixed;
    top: 0px;
    left: 0px;
}
```

## 解決策

原因はbodyに指定している`transform: translate3d(0, 0, 0);`です。

どうやら親要素に`transform`が指定してあると子要素の`position:fixed;`は親要素からの相対位置になるっぽいです。

w3cでもバグ？として言われているっぽいです。

[https://www.w3.org/TR/css-transforms-1/#transform-rendering](https://www.w3.org/TR/css-transforms-1/#transform-rendering)

解決策は親要素から`transform`を外すか、`position:fixed;`の要素の親子関係を解消させるか現状なさそうでうす。

# 事件３「スクロール」

## 概要

iPhoneでスクロールして、動的に上部メニューに`position:fixed;`を指定して画面上部に固定させたいのにスクロール中に画面上部に固定されない・・・

stack overflowにも同じような悩みの人が・・・

[iOS 9 Safari: changing an element to fixed position while scrolling won't paint until scroll stops](http://stackoverflow.com/questions/32875046/ios-9-safari-changing-an-element-to-fixed-position-while-scrolling-wont-paint)

## 解決策

どうやらスクロール中にクラスを付与して`position:fixed;`を指定してあげても

描画はCPUが行うのでスクロールが終わるまで反映されないそうです。

そのため、解決策としては`position:fixed;`を指定するクラスに

`transform: translate3d(0, 0, 0);`を指定するとスクロール中にも反映されます。

これは、`transform: translate3d(0, 0, 0);`を指定すると描画をGPUが行うため解決できるそうです。

# 最後に

`position:fixed;`は便利ですが、たまにはまったりするので気をつけましょう(´・ω・｀)
Macで.NET Coreのプログラムでファイルの読み書きをしてみる


[Macで.NETのプログラムを書いてみる](http://qiita.com/fukuit/items/b2adbe4c89e036bb6f12)の続き。

# ファイルを読み込んでみる
## StreamReaderの罠にハマる
「C#でファイルの読み書き」くらいのキーワードで検索して、さっそくコードを描いてみる。

	using System;
	using System.IO;
	
	namespace ConsoleApplication
	{
    	public class Program
    	{
        	public static void Main(string[] args)
        	{
              string filename = "input.txt";
            	using (StreamReader sr = new StreamReader(filename))
            	{
                	while(sr.Peek() >0){
                    	String line = sr.ReadLine();
                    	Console.WriteLine(line);
                	}
            	}
        	}
    	}
	}

簡単だ。実に分かりやすい。ファイルをStreamReaderで開いて、ReadLine()メソッドで行単位で読みだす。

ところが、これは、フルの.NET Frameworkでは動作するのだけれど、.NET Core環境では動作しない。

エラーメッセージによると、 ```/Program.cs(11,55): error CS1503: Argument 1: cannot convert from 'string' to 'System.IO.Stream'``` とのことで、```StreamReader sr = new StreamReader(filename)```というのがイカンらしい。

## 修正版
エラーメッセージを見れば分かるように、StreamReaderのコンストラクターに渡す引数として、string型の文字列でファイルパスを渡すのは間違っているらしい。
ここには、Streamを渡す必要があるようだ。というワケで、FileStreamを渡す。
```new StreamReader(new FileStream(filename, FileMode.Open)))```

というワケで、修正した。

	using System;
	using System.IO;
	
	namespace ConsoleApplication
	{
    	public class Program
    	{
        	public static void Main(string[] args)
        	{
            	string filename = "input.txt";
            	using (StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open)))
            	{
                	while(sr.Peek() >0){
                    	String line = sr.ReadLine();
                    	Console.WriteLine(line);
                	}
            	}
        	}
    	}
	}

これで、buildすればOK。

	Compiling hello for .NETCoreApp,Version=v1.1
	Compilation succeeded.
	    0 Warning(s)
	    0 Error(s)
	Time elapsed 00:00:03.0119207

(私にとって)意外なハマりポイントだったので、メモっておいた。
ウィルコクソンの符号順位検定

対応のある2群のデータ

```math
X=(x_1, x_2, x_3 \cdots x_n)\\
Y=(y_1, y_2, y_3 \cdots y_n)
```
について、二群間の代表値に違いがあるかどうか検定したい。
まず、二群間の差 $d_i = |x_i - y_i|$、差の符号 $s_i = sig(x_i - y_i)$をそれぞれ取る。
$d_i$を小さい順に並べたときの順位$r_i$を
$s_i > 0$である$i$について足し合わせて$R_{plus}$
$s_i < 0$である$i$について足し合わせて$R_{minus}$
とする。
統計量は$R=min(R_{plus}, R_{minx})$と表される。

$n'$($d_i=0$であるものを除いた要素数)が$n'=<25$のときは検定表から有意性検定を行う。

```R
x <- c(1.83, 1.50, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.30)
y <- c(0.88, 0.65, 0.60, 1.05, 1.06, 1.29, 1.06, 2.14, 1.29)
d <- x - y
s <- sign(d)
r <- rank(abs(d))
R_plus <- sum(r[which(s>0)])
R_minus <- sum(r[which(s<0)])
R <- min(R_plus, R_minus)
R
```
$n'>25$のとき


```math
E(R)=\frac{n'(n'+1)}{4}\\
SD(R)=\sqrt{\frac{n'(n'+1)(2n'+1)}{24}}
```
とすると

```math
z=\frac{R-E(R)}{SD(R)}
```

は標準正規分布に従うので、これによりp値を求める事ができる。

```R
n <- sum(sign!=0)
mu <- n*(n+1)/4
sigma <- sqrt(n*(n+1)*(2*n+1)/24)
V <- abs(w-mu)/sigma
pnorm(V, lower=F)
```

```R
wilcox.test(x, y, paired=T)
```
AWS EC2でWindows Server2012 R2 インスタンスを起動してMacからRemote Desktopするまで　~最小ネタ~

初めてやった時の手順です。殴り書きです。
インスタンス構築は1分もいりませんが、引っ掛かる場所としては、キーペア、パスワードの生成、Remote Desktop時のセキュリティの設定(FW)ではないでしょうか？
AWS初心者の困った誰かが助けられれば幸いです。1分でできることにハマるなんて悲しすぎる。。笑
（注:私はすんなりいきました)

Amazon公式のユーザーガイド(https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html?icmpid=docs_ec2_console)

※これ見れば基本引っかかるところはないと思います。

#インスタンスのデプロイ

1.AWSマネジメントコントロールより```ソリューションの構築```内の```仮想マシンの起動```を選択
2.```ECインスタンスの迅速な起動```画面にて、```使用を開始```を選択
3.```EC2インスタンス名の指定```画面にて任意の名前を入力し、```この名前を入力する```を選択
4.```OSの選択```画面にて```Windows Server 2012 R2 Base```を選択
5.```インスタンスタイプの選択```にて```t2.micro```を選択
6.```続行```を選択するとインスタンスが起動中の画面になるため、```EC2コンソール画面へ```

#Remote Desktop

7.```インスタンス```項目を選択し、作成したインスタンスを選択し```接続```を選択する
8.インスタンス作成時にキーペアをダウンロードするはずなので、```パスワードの取得```から取得しているキーペアを選択し、```パスワードの複合```でパスワードを生成する
9.Macに```Microsoft Remote Desktop```をインストールする
10.```ネットワーク&セキュリティ```の```セキュリティ```項目より対象のインスタンスを選択し、下部にある```インバウンド```タブで以下のように編集

| タイプ | プロトコル | ポート範囲 |　送信元 |
|  RDP  | TCP |  3389  |  任意の場所  |

11.Macにて```Microsoft Remote Desktop```を起動し、```パブリックDNS```・```ユーザー名```・```パスワード```を入力し接続する。
12.以下の画面にたどり着けば完成です。

無料の範囲でできるので暇つぶしにやってもいいかも。(暇つぶしにもならない)

![image](https://qiita-image-store.s3.amazonaws.com/0/117067/f4288329-666e-1d0d-c408-8aa67d853f56.png)

注意点としては再起動のたびにIPが変わることと無量利用分を超えないように気をつけることくらいです。

これから、AWS ×　Windows Server × Ansible , Dockerを触っては記事にしていきます。。
たった一行の.vimrcで劇的にシェルスクリプトが捗る

`.vimrc` に次の一行を加えます。

```vim
autocmd FileType sh :noremap R :.w !$SHELL<Return>
```

そして適当なシェルスクリプトを開いて`R`キーを押すと、カーソル下や選択範囲のスクリプトが実行されます。
submitボタンのnameがsubmitだとsubmit()が効かない

ちょっと特殊なパターンで`form.submit()`が動かなくてハマったので共有しておきます。

formのサブミットを捕まえて、間にちょっとした処理を挿入したかったので下記のようにしました。

```html
<form>
  ...
  <input type="submit" name="submit-send" value="Send" />
</form>
<script>
  var $form = $("form");
  $form.submit(function(){
    //一度処理したら正常にsubmitするためのフラグ
    var submited = false;
    if(submited === false){
      submited = true;
      //ここでちょっとした処理。
      $form.submit();
      return false;
    }
  });
</script>
```

フラグを使ってる辺りあまりきれいじゃありませんがご勘弁を。で、これで期待した通り動いたのですが、これを既存のとあるページに組み込んだところ動きませんでした。

そのページのサブミットボタンはこんな感じでした。

```html
<form>
  ...
  <input type="submit" name="submit" value="送信する" />
</form>
```

そう、`name`が`submit`になっていました。

HTMLFormElementには`submit()`という関数があって、フォームをjsからサブミットする時に使うのですが、jQueryの`submit()`もそれを利用してるようです。

で、HTMLFormElement、つまり上記コードの文脈でいうと`$form[0]`のもう一つの特徴として、内包するフォームエレメントにname属性でアクセスできるという特徴があります。`$form[0].submit`はサブミットボタンのエレメントをさすようになってしまい、関数が上書きされて呼べなくなったんですね。

さらに`$form.submit()`とjQuery経由で呼び出すとエラーにならずに何もおきないのでしばらく気づきませんでした。

回避する方法は[StackOverFlow](http://stackoverflow.com/questions/26393970/form-elements-overwrite-default-properties-of-a-form-object)にありました。

```js
var submit = HTMLFormElement.prototype["submit"].bind($form[0]);
submit();
```

prototypeから関数を取り出してthisをすり替えてやる感じですね。

[この辺](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement)にメソッドやプロパティ一覧があるので、名前が被らないようにしたほうが色々良さそうですね。
chronyのうるう秒対策

# うるう秒
平成29年（2017年）1月1日（日）午前8時59分59秒と午前9時00分00秒の間に「8時59分60秒」が挿入される。
# chronyとは
CentOS7/RHEL7からntpdに代わり標準となったNTPクライアント兼サーバ。


# 結論：この設定しておけば大丈夫！？


```/etc/chrony.conf
leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001 leaponly
```

# この設定なに
※間違っていたらすいません。

* leapsecmode slew
うるう秒におけるモード設定。クロッキングプロセスを無効にするらしい。

* maxslewrate 1000
slew モードでの同期速度。slewレート1000ppm。1秒のずれを17時間34分かけて同期。

* smoothtime 400 0.001 leaponly
長期間オフラインになっていた後でもスムーズに時刻同期してくれる。leaponlyオプションよりうるう秒のときだけ。

#うるう秒確認
下記コマンドで確認。

```
# chronyc tracking
Reference ID    : xxx.xx.xxx.xxx (xxxxx.xxxx.jp)
Stratum         : 4
Ref time (UTC)  : Tue Dec 20 12:22:04 2016
System time     : 0.000088983 seconds fast of NTP time
Last offset     : +0.000108704 seconds
RMS offset      : 0.000115711 seconds
Frequency       : 9.257 ppm slow
Residual freq   : +0.003 ppm
Skew            : 0.056 ppm
Root delay      : 0.006996 seconds
Root dispersion : 0.000607 seconds
Update interval : 1043.6 seconds
Leap status     : Normal
```

最終行に、Leap status が「Insert second」に変わるとLeapフラグが立ち、leapを受信するようです。
leapはうるう秒挿入の24時間前から受信が始まるようです。


# 注意点
うるう秒に関するオプション設定「leapsecmode」はバージョン2.1.1から追加されたオプションであり、
RHEL7.1にデフォルトで入っているchronyのバージョンは古いため「leapsecmode」オプションはない。
そのため、パッケージアップデートが必要。
RHEL7.3からはデフォルトでインストールされているchronyは2.1.1であるため「leapsecmode」オプションを設定することが可能。
F# テキストファイルの入出力

#始めに
F#でのファイル入出力処理を書いてみました
ついでにyahooファイナンスからURLを抽出する処理も書いてみました

#コード
```fsharp
module File3

open System.IO;
open System.Text;

//一文字単位の解析を行う
//ダブルクオテーションで囲まれている文字列を抜き出す
let rec parseStr1 strs hasDoubleQuaote =
    match strs with
    |x::xs -> match x with
              //ダブルクオーテーションが見つかったときの処理
              |'"' -> match hasDoubleQuaote with
                      //すでにダブルクオテーションが見つかっている場合は、ここまでが切り出し対象
                      |true -> '|' :: parseStr1 xs false
                      //まだにダブルクオテーションが見つかっていない場合は、ここからが切り出し対象
                      |false -> parseStr1 xs true
              //ダブルクオーテーション以外の文字がマッチしたら、ダブルクオテーションがすでに見つかっている場合のみ、
              //文字の切り出しを行う
              |_   -> match hasDoubleQuaote with
                      |true  -> x::(parseStr1 xs hasDoubleQuaote)
                      |false -> parseStr1 xs hasDoubleQuaote
    |[]->[]
let parseStr strs = parseStr1 strs false

//一行単位の解析を行う
//テキストファイルから1行読み込んだ文字列を解析します
let analyzeText (str:string) f = 
    let ff1 = str.ToCharArray(0,str.Length) |>  //文字列を文字型の配列にする
              Array.toList                  |>  //配列をリストに変換する
              f                             |>  //引数で渡された関数を実行する
              List.toSeq                    |>  //実行結果をシーケンスに変換する
              Seq.map string                |>  //シーケンスのオブジェクトを文字列型に変換する
              String.concat "" ;                //シーケンスに含まれる文字列を連結する
    let  n = ff1.IndexOf("http:");
    let f3 = match n > 0 with
             |true  -> ff1.Substring(n) + "\n"
             |false -> null
    f3

//テキストファイル全体の内容を解析する
let rec printParsedStr series = 
    match series with
    |(x:string)::xs -> match x.IndexOf("http")>0 with
                       |true  -> analyzeText x parseStr +  printParsedStr xs
                       |false -> printParsedStr xs
    |[] -> ""

//yahooファイナンスのhtmlファイルを読み込み、そこに含まれるurlを抽出する
let inputPath = @"C:\test\yahoo.txt" //yahooファイナンスのhtmlソースが含まれている
let outputPath= @"C:\test\result.txt" //抽出結果が格納されているテキストファイル
File.WriteAllText(
    outputPath, 
    Seq.toList (File.ReadLines(inputPath)) |> printParsedStr  //A
) 
```
ローカルマシンにWordpressの開発環境を構築する


ローカルマシンにWordpressの開発環境を作る必要に迫られたのでいろいろ調べてみたら、[VCCW](http://vccw.cc/)で作るのが良いということで、早速作ってみました。

## VirtualBoxとVagrantをインストール

VCCWは[Vagrant](https://www.vagrantup.com/)をベースにしているので、まずはVagrantをインストール。
Vagrantは[VirtualBox](https://www.virtualbox.org/)が必要なので、事前にインストールしておきましょう。

## VCCWダウンロード

zipファイルを落とすという手もあるのですが、ちょっと理由があって（後述）githubからチェックアウトします。
作業ディレクトリで下記コマンドを実行します。

```console
git clone https://github.com/vccw-team/vccw.git 
```

## PHP 5.6系を使いたい

作業ディレクトリにvccwディレクトリが作成されるので、そこに移動して作業を行います。

VCCW v3ではphpenvが廃止され、phpのバージョンが7系に固定されています。
今回は某レンタルサーバにアップする予定なのですが、レンタルサーバの仕様上、phpのバージョン5.6系を使わないといけません。
ということで、phpenvが入っているVCCW v2を使います。

```console
git checkout v2
```

上記コマンドでVCCW v2系が使えるようになります。

## お好みに合わせた設定（カスタマイズ）

カスタマイズは、site.ymlを書き換えて行います。が、初期状態では存在しないので、provision/default.ymlをコピーして作成します。


```console
cp provision/default.yml site.yml
```

### Wordpressの言語を日本語に変更

site.ymlの下記項目を変更

``` site.yml
lang: ja
```

### pluginを入れたい

site.ymlの`plugins`にプラグイン名を列挙

``` site.yml
plugins:
  - contact-form-7
  - siteguard
```

## VCCW起動と停止

あとは普通のVagrantと同様に下記コマンドで仮想マシンを起動します。

``` console
vagrant up
```

起動を見届けた後、ブラウザでhttp://192.168.33.10にアクセスしてWordpressの画面が表示されたらOKです。

停止する場合は、下記コマンドを実行します。

``` console
vagrant halt
```


## 参考

[VCCW v2](http://v2.vccw.cc/)
[WordPressをVagrant環境にらくらくインストールする。 - VCCW](http://qiita.com/naru0504/items/58011181f2c271808c7f)
SlackのAPIでメッセージ通知を送る(PHP)

#1. APIを使うためにAPIキーを取得
- https://api.slack.com/web
    1. <b>Authentication</b>配下の<b>Genarate test token</b>ボタンをクリック
    -  通知を送りたいチームで<b>Create token</b>ボタンをクリック
    - できた<b>token</b>をKEYとする

#2. PHPでSlackに通知を送る
```
<?php
$slackApiKey = 'xxxx-xxxxxxxxx-xxxx~~~~'; //上で作成したAPIキー
$text = 'こんにちは';
$text = urlencode('投稿されたよ。' . $text);
$url = "https://slack.com/api/chat.postMessage?token=${slackApiKey}&channel=%23random&username=huga-bot&text=${text}&as_user=true";
file_get_contents($url);
```

- urlencode($text)：urlに埋め込むときはurlエンコードをする。
- リクエストパラメータ（token, channel, textは必須パラメータ）
    - token：作成したAPIキー
    - channel：通知を送るチャンネル名（%23は#のurlエンコード。この例なら、チャンネル名は「#random」）
    - ダイレクトメッセージの場合は、@のエンコードである%40を頭に付けて、送信先のユーザー名を記載すればOK
    - username：通知を送るbot名(この例なら、投稿者は「huga-bot」)
    - text：通知内容
    - as_user：これを指定しなければ「bot」が投稿。trueにしたら、「APIキーの作成者」が投稿。
    - ドキュメントは下記参照。
    - https://api.slack.com/methods/chat.postMessage


```$text = 'Hello!';```をPOSTで受け取ったテキストにするなどカスタマイズして色々遊べそう
PythonでSublime Text3のタブを検索できるようにするプラグインを作成する

Sublime Text3で自分はタブを大量に開くのですが、皆さんはどのように大量のタブの中から対象のタブを探しているのでしょうか？
色々やり方はあると思うのですが、多くは以下になるかなと思います。

- ctrl + tab(control + tab)で移動して探す
- Alt + 数字(Command + 数字)で番号でジャンプする
- そもそもタブを大量に開かない。。。

このうちだと、`ctrl + tab` で探すのもめんどくさいし、 `Alt + 数字` でジャンプするのは10個以上タブ開いてるし、そもそも番号わからない。。。
3つ目はちょっと。。。

ということで、勉強がてらタブを検索する機能を作ってみました。
ちなみにPython初心者です。

そもそも、Sublimeにタブを検索する機能あるんですかね？

## 前提

- Windowsです
- Sublime Text3を日本語化してます

## プラグイン作成準備

[ツール] => [プラグイン追加] をクリック。
ひな形が作成されるので、 `ctrl + s` で保存する。

保存する場所として `Packages/User` が選択されていることを確認して、適当な名前を拡張子 `.py` で保存する

## ソースコードを書く

以下のソースコードのみでタブ検索を実現できます。
すっごい簡単

```
import sublime, sublime_plugin
import os

class FindTabListCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        def on_done(index):
            if index == -1:
                return;
            window = sublime.active_window()
            tabs = window.views_in_group(window.active_group())
            window.focus_view(tabs[index])
        
        window = sublime.active_window()
        tabs = window.views_in_group(window.active_group())
        tabNames = []
        for item in tabs:
            if item.name() != "Find Results":
                fileName = os.path.basename(item.file_name())
                tabNames.append(fileName)

        window.show_quick_panel(tabNames, on_done)
```

## ショートカットを設定する

キーバインドの設定で以下のように設定すれば完了です。

```
{ "keys": ["ctrl+t"], "command": "find_tab_list"}
```

実行するとSublimeではおなじみの以下のような検索ボックスが開いてタブを検索することが出来ます。

![2016-12-20_20h47_23.png](https://qiita-image-store.s3.amazonaws.com/0/49429/3ce4915d-9d92-72b7-d2e1-ef8cf8f13ae1.png)
emscripten and DDD

# speaker

<img height="32" width="32" src="https://qiita-image-store.s3.amazonaws.com/0/27516/7943275c-97ea-da5d-a036-7d973acde70d.jpeg" /> janus_wel@CureApp

- https://github.com/januswel
- http://qiita.com/janus_wel
- https://twitter.com/janus_wel
- a master of Chaldea
- wanna play SaGa Scarlet...

---

![kanashii.png](https://qiita-image-store.s3.amazonaws.com/0/27516/93043949-153c-348a-f07f-5af881265ed5.png)

---

# DDD

---

a way of

- design methodology
- team building
- business

<img height="192" width="151" src="https://qiita-image-store.s3.amazonaws.com/0/27516/c78d9ba5-026d-1a5b-05b0-839a08a85e2f.jpeg" />

---

# domain model

---

e.g.

- GTD tool
    - todo
- vending machine
    - price
    - coins dropped in
    - change

---

# demo

---

https://github.com/januswel/react-emscripten-todo
https://januswel.github.io/react-emscripten-todo/src/public/index.html

---

# summary

---

# C++ is great!!

---

# emscripten is also awesome!!

--- 

I wish...

- support multi-platform
    - Universal JavaScript
    - adapting standards for modules
        - CommonJS
        - ES Modules
- (garbage colection)
    - `.delete` is hard for JavaScripter
ゲームジャムに参加しましょうー！

※この記事は「AltPlus Advent Calendar 2016」の２１日目の記事です。

※日本語で記事を書くのは初めてですので、分からない部分があれば、教えてもらえればとの事です！

<h2>はじめに</h2>
皆さん、こんにちは！この記事では、ゲームジャムのお話しをします！多分ゲーム業界で働いてる人はご存知だと思うのですが、「まだゲーム業界に入ったばかりの人」、「ゲーム業界で働いてみたい人」、「自分のゲームを作ってみたい人」ー そんな人向けに書いてみました。ゲーム作りにパッションがある方で、まだゲームジャムに参加した事が無い方はぜひ読んでもらいたいです！

<h2>ゲームジャムとは何か</h2>
「ジャム」と言う言葉は音楽家がよく使うフレーズで、「集まって曲を作る」と言う意味があります。それを元に、ゲームジャムとは色々な人が集まってゲームを短時間で作るイベントです。制限時間はゲームジャムによりますが、平均で言うと、２４〜４８時間です。ゲームジャムのイベントではいつもゲームのテーマがありまして、それをベースにしてゲームを作ると言うイメージですね。

そこで今一番有名なゲームジャムが (GGJ) Global Game Jam です。GGJ 毎年開かれるイベントで、今年の一月に９３国から、３万６千人以上の参加者が同時にゲームを作りました。GGJでは、各場所にイベント会場がありまして、そこで参加者の皆さんが集まり、自己紹介、チームを組み、テーマの公開を待ち、４８時間の短い時間でゲームを作ります。来年の２０１７年１月にまたゲームジャムが開かれるので、<a href="http://globalgamejam.org/2017/jam-sites?title=&country=JP&locality=&field_site_address_administrative_area=">こちらのリンク </a>でイベント会場を探してみましょう！

<h2>「参加者に何のメリットがあるんですか？」</h2>
そうですねー。ゲームジャムは基本コンクールとは違うので、賞品・賞金とかはもらえません。イメージとしては、「自分が一生懸命作ったゲームが一番の賞品」っと言うロマンチックな感じかなー？

多分人によって参加する目的が違ってくると思うんですが、良く有るのが「自分のアイデアを試したい」、「自分の限界を試したい」、「ゲームを作ってみたい」、「ゲームを作る仲間が欲しい」、とかですかね。そんな感じな人がゲームジャムに集まります。

そう言う事なので、メリットは自分の成長・野望・パッション（？）ってところかなー。でもそんなに真剣に考えなくても、少しでも「なんかゲーム作りたいなー」って気持ちがあれば、それで十分だと思います。

<h2>「でも自分はゲームを作った事が無い」。。</h2>
または「ゲームを作れる自信が無い」、「足手まといになる」、と言う風に思ってる人には、怖がらず、参加してもらいたいです。自分も来年のゲームジャムで５年目になるのですが、毎回「足手まといになりたくない」、「ダメなゲームは作りたくない。。」と言う気持ちでいっぱいです。多分ゲーム業界で働いてる人はそう言う「怖い」と言う感情と向き合って仕事をしているのでしょう。（デザイナー・プランナーさんは特に）

ゲームジャムに参加する人は、そう言う怖さを知ってるので、皆さんは怖がらず、自信がなくても参加しましょう！ あと、一人でゲームは作れないのは当たり前なので、「分からない部分」または「これ自分は出来ない事わ。。」って事がある場合は、チームメイトに任せましょう。

<h2>まとめ</h2>
次のGGJは１月20〜22日になりますので、ぜひ参加してください！その日にちに来れ無い人は、Ludum Dareをお勧めします。Ludum Dareのゲームジャムはネット上で行われるので、自分の家・カフェからゲームを作るっと言う感じですね！

最後まで読んで下さってありがとうございます！

<a href="http://globalgamejam.org">Global Game Jam</a>
<a href="http://ludumdare.com/compo/">Ludum Dare</a>
今さらRubyのshallow copyで詰まった

データベースで検索した結果を、広告媒体ごとのハッシュでまとめて返す次のようなメソッドを書いていました。

```ruby
DEFAULT = {medium1: [], medium2: []}.freeze

# 検索結果を広告媒体にまとめて返す
# @param [String] query 検索文字列
# @return [Hash] 広告媒体ごとの検索結果
def search_medium_data(query)
  rows = request_to_database(query)
  return DEFAULT if data.nil?
  rows.each_with_object(DEFAULT.dup) do |row, hash|
  hash[row[:account_type]] ||= []
  hash[row[:account_type]] << row
  end
end
```

ところが、呼び出すたびに、定数のつもりで定義した```DEFAULT```の中の配列に、どんどん値が追加されていってしまっていました。

これは、

* freezeは配列の中身までイミュータブルにしない
* dupメソッドはハッシュの中身まで複製しない浅いコピー (shallow copy) である

ことが原因でした。

http://ref.xaio.jp/ruby/classes/object/clone

> cloneとdupは「浅いコピー」を作ることに注意してください。上記のCatクラスの例では、@nameがoriginalからcopiedにコピーされますが、@nameが指しているオブジェクト（文字列）は同じものです。copiedの@nameに対して破壊的なメソッド（レシーバ自身を変更するメソッド）を呼び出すと、originalの@nameが指している文字列も変更されます。

Rubyのドキュメントは「浅いコピー」の説明がざっくりとしすぎているので、[Pythonのドキュメントの同じような箇所](http://docs.python.jp/3/library/copy.html)を引っ張ってきました。

> 浅い (shallow) コピーと深い (deep) コピーの違いが関係するのは、複合オブジェクト (リストやクラスインスタンスのような他のオブジェクトを含むオブジェクト) だけです:
> 
> * 浅いコピー (shallow copy) は新たな複合オブジェクトを作成し、その後 (可能な限り) 元のオブジェクト中に見つかったオブジェクトに対する 参照 を挿入します。
> * 深いコピー (deep copy) は新たな複合オブジェクトを作成し、その後元のオブジェクト中に見つかったオブジェクトの コピー を挿入します。
> 
> 深いコピー操作には、しばしば浅いコピー操作の時には存在しない 2 つの問題がついてまわります:
> 
> * 再帰的なオブジェクト (直接、間接に関わらず、自分自身に対する参照を持つ複合オブジェクト) は再帰ループを引き起こします。
> * 深いコピーでは、何もかも をコピーするため、例えば複数のコピー間で共有されるべき管理データ構造までも、余分にコピーしてしまいます。

「[新人エンジニアがはまるかもしれないrubyの浅いコピーと深いコピーともろもろ背景](http://qiita.com/sue738/items/92228f0ae0518bf0a693)」という記事で詳しく説明されていました。

対処法は```Marshal```を使う方法がありますが、

```ruby
DEFAULT = {medium1: [], medium2: []}.freeze
b = Marshal.load(Marshal.dump(DEFAULT))
b[:medium1] << 1
p b
# => {:medium1=>[1], :medium2=>[]}
p DEFAULT
# => {:medium1=>[], :medium2=>[]}
```

はっきり言って醜いので嫌な感じがします。

他にもこちらの[stack overflow](http://stackoverflow.com/questions/8206523/how-to-create-a-deep-copy-of-an-object-in-ruby)によると[ruby_deep_clone](https://rubygems.org/gems/ruby_deep_clone)というgem使う方法もあるみたいです。

```ruby
require "deep_clone"
object = SomeComplexClass.new()
cloned_object = DeepClone.clone(object)
```

ただし、これだけのことをするためにgemを入れるのはイケてないなという感じがします。

結局、メソッドの中で毎回ハッシュを新しく作り直すことにしました。

```ruby
# コードの他の箇所でも使っているので残している
DEFAULT = {medium1: [], medium2: []}.freeze

# 検索結果を広告媒体にまとめて返す
# @param [String] query 検索文字列
# @return [Hash] 広告媒体ごとの検索結果
def search_medium_data(query)
  rows = request_to_database(query)
  default = {medium1: [], medium2: []}
  return default if data.nil?
  rows.each_with_object(default) do |row, hash|
    hash[row[:account_type]] ||= []
    hash[row[:account_type]] << row
  end
end
```

これもこれで、「媒体名が増えてハッシュのキーが増える」ような場合があったら困りそうなのですが。
指数分布のKLダイバージェンスを導出する

#この記事は？
二つの指数分布のKullback–Leibler divergence(以下、KLダイバージェンス)の導出過程を紹介します。
地味に苦労したし、簡単に調べてだけでは導出過程が見つからなかったので、誰かのためになればと思い記事にしました。

#KLダイバージェンスとは
まず式を紹介します。
連続分布の$P$と$Q$を用意します。
すると、KLダイバージェンス$D(P || Q)$は

``` math
D(P || Q) = \int_{0}^{\infty }P(x)\log \dfrac {P\left( x\right) } {Q(x)}dx
```
離散分布では$\int$が$\sum$に代わります。
簡単に言うと、二つの分布の類似度を表すものです。
クラスタリングをするときに距離の代わりとして使われることもあるそうですが、$D(P||Q) \neq D(Q||P)$であり厳密には距離ではないので注意。
詳しくは[ここ](https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence)を見ましょう。

#導出
一つ目の指数分布を$P(x) = \frac{1}{\mu}e^{-\frac{x}{\mu}}$、二つ目の指数分布を$P(x) = \frac{1}{\mu'}e^{-\frac{x}{\mu'}}$とします。

```math
\int_0^\infty \frac{1}{\mu}e^{-\frac{x}{\mu}}log\frac{\frac{1}{\mu}e^{-\frac{x}{\mu}}}{\frac{1}{\mu'}e^{-\frac{x}{\mu'}}}dx = \int_0^\infty \frac{1}{\mu}e^{-\frac{x}{\mu}} \{log\frac{1}{\mu}e^{-\frac{x}{\mu}}}-log{\frac{1}{\mu'}e^{-\frac{x}{\mu'}}\}dx\\
=\int_0^\infty \frac{1}{\mu}e^{-\frac{x}{\mu}} \{log\frac{1}{\mu}+log\ e^{-\frac{x}{\mu}}-(log\frac{1}{\mu'}+log\ e^{-\frac{x}{\mu'}})\} dx\\
=\int_0^\infty \frac{1}{\mu}e^{-\frac{x}{\mu}} \{log\frac{1}{\mu}+log\ e^{-\frac{x}{\mu}}-log\frac{1}{\mu'}-log\ e^{-\frac{x}{\mu'}}\}dx\\
=\int_0^\infty \frac{1}{\mu}e^{-\frac{x}{\mu}} \{log\frac{1}{\mu}-\frac{x}{\mu}-log\frac{1}{\mu'}+\frac{x}{\mu'}\}dx
```
長くなってきたので$dx$は省略します。

```math
=log\frac{1}{\mu}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
-\frac{x}{\mu}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
-log\frac{1}{\mu'}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
+\frac{x}{\mu'}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
```
項の順番を入れ替えます。
ついでに下の式第3項と第4項の$x$の位置を少し変えたことに注意してください。

```math
=log\frac{1}{\mu}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
-log\frac{1}{\mu'}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
+\frac{1}{\mu'}\int_0^\infty x\frac{1}{\mu}e^{-\frac{x}{\mu}}
-\frac{1}{\mu}\int_0^\infty x\frac{1}{\mu}e^{-\frac{x}{\mu}}
```
上の式の第1項と第2項は$log\ a-log\ b=log\frac{a}{b}$の法則でまとめます。

```math
=log\frac{\mu'}{\mu}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}
+\frac{1}{\mu'}\int_0^\infty x\frac{1}{\mu}e^{-\frac{x}{\mu}}
-\frac{1}{\mu}\int_0^\infty x\frac{1}{\mu}e^{-\frac{x}{\mu}}
```
ここで、連続分布の期待値の公式より、上の式の第2項と第3項の$\int_0^\infty x\frac{1}{\mu}e^{-\frac{x}{\mu}}$は$\mu$と変換できます。
短くなってきたので$dx$を戻します。

```math
\begin{align*}
&=log\frac{\mu'}{\mu}\int_0^\infty\frac{1}{\mu}e^{-\frac{x}{\mu}}dx
+\frac{1}{\mu'}\mu
-\frac{1}{\mu}\mu\\
&=log\frac{\mu'}{\mu}[-e^{-\frac{x}{\mu}}]_0^\infty
+\frac{\mu}{\mu'}
-1\\
&=log\frac{\mu'}{\mu}\{-e^{-\frac{\infty}{\mu}}-(-e^{-\frac{0}{\mu}})\}
+\frac{\mu}{\mu'}
-1\\
&=log\frac{\mu'}{\mu}\{0-(-1)\}+\frac{\mu}{\mu'}-1\\
&=log\frac{\mu'}{\mu}+\frac{\mu}{\mu'}-1\\
\end{align*}
```
というわけで、指数分布同士のKLダイバージェンスが導出できました。
どこかに間違いがあったらご指摘ください。

~~数式の「＝」をそろえるのってどうするんだろう~~
>y-murata
ありがとうございます、=をそろえることができました。
知見の重要性

#進捗が出なかったのでQiitaで技術的といえるか微妙な話を上げることになってしまった話
題の通りです。技術的か微妙なのでQiita外で書こうかとも思いましたが、わざわざそのために他でアカウント作るのも面倒だったので…
特に誰とは言いませんが、点と点を結んだり空腹のバカでいろって動画を見せられた世代なのでそれに関する話。

#知識はどこから得ているのか
例えばWebサイトを運営されていたり、Webアプリを作成していたり、はたまた複数人で開発をしている皆さんならバージョン管理の重要性をよくご存じだと思います。
端的に言えばそんな時はgitを使えっていうことですが、gitを知るきっかけになるものは何だったでしょうか?
例えばhttps://codeiq.jp/magazine/category/git-ai/ このような記事で知ったという方もいるのではないでしょうか。


#検索すること
昨今では多くの人が個人でドメインを所有し、（ドメインを所有していない人でもQiitaなどで）ネットに多くの記事を上げてくれています。
そういえば、自分の周りにはあまり知られていなかったのですが、検索のときに "hoge" とすることで強調出来たり、 -hoge とすることで検索結果からhogeを除外したりできたりします。やはり基本は検索によって知識をつけることが多いのではないでしょうか?
ここ、唯一の技術的な話なので重要ですよ。

他にもSNSという手もありますね。
例えばTwitterなどで、技術的な話をしてくれるアカウントをフォローしてると色々な情報が流れてきますね。自分の場合、HaskellやIchigojamなどの話が次々と流れてきます。上のcodeIQの記事ももともとはTwitterで知ったりしましたね。

#メルマガを購読する
今回一番押したいのはココ
皆さんはメルマガとか読んだりしますか? 自分もメルマガは読み比べたりとかできるほど多く取ってはいないのですが、メルマガは偏った知見に幅を持たせてくれます。例えばhttp://www.hyuki.com/mm/ 自分が読んでる中で最も楽しみなメルマガはこれですが、結城先生の最近の話題に対しての個人の感想などが書かれています。最初は数学に関してぎっしり書いてあるのかと思っていたのですが、社会の幅広い内容が書いてあって面白かったです。
ネットサーフィンでは自分の興味がある偏りがちですがメルマガはいいぞ。

#メルマガはいいぞ
布教するわけではないですが、結城先生のメルマガはいいぞ。
Unityでの、Center・Pivotの違いについての簡単な説明。

Unity の操作画面において、当時のバージョン 3.x.x の頃から一貫して存在する、『Center』『Pivot』ボタンがあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/153239/edea496f-7f6b-3e5a-8707-4abd6540f80b.png)
正直言うと、今まで1年間半 Unity を触っていて、この機能を使った事は1度もありません（汗）。大きな理由としては、「いまいち機能が良く分からなかった」からです。
これからもこれを使う機会はあるのだろうか？と思いながら調べてみた結果、物凄く初歩的な操作であれば、この2つのモードの違いが分かる様になりましたので、完全に俺得ですが説明しておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/153239/30789ea3-6ab6-f0d2-107b-0db37945f47d.png) ![image](https://qiita-image-store.s3.amazonaws.com/0/153239/0558a1a7-8942-c428-1e26-6330ef461909.png)

まず上記の様に、適当な Sphere と Cube を Hierarchy ビューに生成し、Cube を Sphere の子オブジェクトにして下さい。そして、Hierarchy ビュー > Sphere をクリックした状態で、ハンドツールの真ん中のボタンを押します。

![image](https://qiita-image-store.s3.amazonaws.com/0/153239/683cb076-4076-a585-0279-cc894efe0e4d.png)
**<font color="Brown">※ハンドツールの真ん中のボタンは、選択したオブジェクトを任意の方向に回転させる機能です。</font>**

では、この状態になったら、早速『Center』『Pivot』を押して、回転の中心点がどう変わるのかを確かめてみて下さい。
![image](https://qiita-image-store.s3.amazonaws.com/0/153239/f982b000-cd5b-03cf-1ccf-f7b3af7ef166.png) ![image](https://qiita-image-store.s3.amazonaws.com/0/153239/7f426eca-e9e9-1d37-6dbc-042e963cd7e7.png)
**<font color="Brown">※左が『Center』状態、右が『Pivot』状態。</font>**

『Center』モードでは、親子オブジェクトそれぞれを合わせた際の中心を基準に回転するのに対し、『Pivot』モードでは、親オブジェクトの中心を基準に回転します。

![image](https://qiita-image-store.s3.amazonaws.com/0/153239/935c0b60-5163-1898-998e-ffd539666f5b.png) ![image](https://qiita-image-store.s3.amazonaws.com/0/153239/c4f7efcf-e31d-e777-920a-1044357cd927.png)
**<font color="Blue">※左が『Center』状態、右が『Pivot』状態。</font>**

親子オブジェクト全体をそのまま回転調整したい場合は『Center』で、あくまで親オブジェクトを基準にして全体を回転調整したい場合は『Pivot』で、という風に切り替える事で、いざという時に役に立つモードでは無いかと感じました。

個人的に一番分かりやすい例を上げましたが、オブジェクトの構成によっては編集が非常に容易になると思います。知らなかった方はこれを参考に、『Center』『Pivot』モードを使いこなして頂ければと思います。

「さいたまげーむすライト」のページ。
***https://play.google.com/store/apps/developer?id=さいたまげーむすライト***

「さいたまげーむす」のページ。
***http://saitamagame.com/***
どんなに辛くても土日に夕方まで寝てはいけない

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の14日目ぐらいの記事です。


##生活リズムの乱れは人生の乱れ
仕事が毎日遅くて、睡眠時間も慢性的に足りない生活をしていると、土日はついつい夜遅くまで寝てしまいます。


しかし、いけません。
金曜日の夜や土曜日の朝などに帰ってきたときは明日は休みだと思ってついつい徹夜や夜更かしをして自分の時間を取り戻そうとするものです。

しかし、人間は基本的に夜寝て朝起きるように作られています。

金曜日の夜はお風呂に入って遊びたい気持ちをぐっとこらえて早く寝て、土曜日の朝は早起きして午前中は部屋の片付けをするのがいいんじゃないかとおもいます。

筆者は、金曜日の夜は朝の6時ぐらいまでで起きててそのまま夜の19時ぐらいまで寝て、みたいな生活をしていました。
土日の昼間は寝て夜はパソコンやアニメ視聴をだらだらと続けていました。
部屋が汚くても夜遅いので掃除機もかけれないし洗濯機も回せません。
タスクばかりが貯まっていく焦燥感にかられながらも遊んで時間を取り戻すことばかり考えていました。
そして生活リズムががたがたになった状態で月曜日を迎え・・・

今にして思えば、やはり早寝早起きが人間の生活を作ると思います。
なので、金曜日の夜は遊びたい気持ちをぐっとこらえて早く寝るのが良いんじゃないかなと思います。
goroutineを用いてGetWild

こちらは[GetWild AdventCalender](http://qiita.com/advent-calendar/2016/getwild)の22日目の記事です。

# はじめに
ネタが...思い浮かばない...
![image](https://qiita-image-store.s3.amazonaws.com/0/126/738ee7e6-9d20-6161-fc60-a969fd891a29.png)

しかし、書かねばなりません。

# そうだgoにはgoroutineがあった

そこで私は思い出しました。普段使っているgoには[goroutine](http://golang.jp/effective_go#goroutines
)があることを。
これを使えば私もいつでも気軽にWildを得る事ができるはずです。

# 早速実装します
今回はgoroutineを用いて標準出力に"G" "e" "t" "W" "i" "l" "d" の
7文字からランダムに1文字抽出し、"GetWild"になったタイミングに何かが起こる事にします。

```go
package main

import (
	"fmt"
	"math/rand"
	"time"
)

var (
	getWildWords = []string{"G", "e", "t", "W", "i", "l", "d"}
)

func main() {
	c := make(chan string)
	w := ""

	for {
		go getWildAndTough(c)
		w += <-c
		if len(w) == len(getWildWords) {
			fmt.Println(w)
			w = ""
		}
	}
}

func getWildAndTough(c chan string) {
	rand.Seed(time.Now().UnixNano())
	c <- getWildWords[rand.Intn(len(getWildWords))]
}
```

これでgoroutineを使用して、チャンネル経由で7文字の文字列を受け取る事が出来るようになりました。
しかし、これは `if len(r) == len(getWildWords) {` あたりがかっこ悪いので7本のワーカーでそれぞれ1文字づつ返却するようにします。

```go
package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

var (
	getWildWords = []string{"G", "e", "t", "W", "i", "l", "d"}
)

func main() {
	wg := &sync.WaitGroup{}
	c := make(chan string)

	for {
		r := ""
		for i := 0; i < 7; i++ {
			wg.Add(1)
			go getWildAndTough(wg, c)
			r += <-c
		}
		wg.Wait()
		fmt.Println(r)
		r = ""
	}
	close(c)
}

func getWildAndTough(wg *sync.WaitGroup, c chan string) {
	defer wg.Done()
	rand.Seed(time.Now().UnixNano())
	c <- getWildWords[rand.Intn(len(getWildWords))]
}
```

syncパッケージを利用し、それぞれのgoroutineが処理を終えるまで待ち文字を出力するようにしました。駅の掲示板にXYZと書いて待っている時の心で書きます。

```
package main

import (
	"fmt"
	"math/rand"
	"os/exec"
	"sync"
	"time"
)

var (
	getWildWords = []string{"G", "e", "t", "W", "i", "l", "d"}
	g            string
)

const (
	textGetWild = `
  ____      _    __        ___ _     _
 / ___| ___| |_  \ \      / (_) | __| |
| |  _ / _ \ __|  \ \ /\ / /| | |/ _  |
| |_| |  __/ |_    \ V  V / | | | (_| |
 \____|\___|\__|    \_/\_/  |_|_|\__,_|
`
)

func init() {
	for _, v := range getWildWords {
		g += v
	}
}

func main() {
	wg := &sync.WaitGroup{}
	c := make(chan string)

	for {
		w := ""
		for i := 0; i < 7; i++ {
			wg.Add(1)
			go getWildAndTough(wg, c)
			w += <-c
		}
		wg.Wait()
		if isGetWild(w) {
			fmt.Println(textGetWild)
			exec.Command("say", "-v", "Ava", w).Run()
			break
		}
		w = ""
	}
	close(c)
}

func getWildAndTough(wg *sync.WaitGroup, c chan string) {
	defer wg.Done()
	rand.Seed(time.Now().UnixNano())
	c <- getWildWords[rand.Intn(len(getWildWords))]
}

func isGetWild(w string) bool {
	if g == w {
		return true
	}
	return false
}
```

上記のようにすれば下記のようにGetWildとAAを出力させつつ
槇村香のように「Get Wild」と喋ります。

```
  ____      _    __        ___ _     _
 / ___| ___| |_  \ \      / (_) | __| |
| |  _ / _ \ __|  \ \ /\ / /| | |/ _  |
| |_| |  __/ |_    \ V  V / | | | (_| |
 \____|\___|\__|    \_/\_/  |_|_|\__,_|
```

皆様、2016年も残り短くなりましたが2017年もタイヤを切りつける勢いで
GetWildしていきましょう。くれぐれもWildなコードは書きませんように。
D言語くんの宇宙進出に関する計画

2015年、2016年の研究によりD言語くんの繁殖については、かなり明らかになった。
しかし、その先には何があるのだろう？
![bugg.png](https://qiita-image-store.s3.amazonaws.com/0/100320/c1f645d9-8d23-6162-7025-a6f4f090a0eb.png)

★★★タブレット必須のゲームです！！★★★

Windowsタブレット版：https://onedrive.live.com/?id=F7E340CFC6666A27%2162172&cid=F7E340CFC6666A27
Android版：https://onedrive.live.com/?id=F7E340CFC6666A27%2162172&cid=F7E340CFC6666A27
iOS版：デベロッパ登録してない

■目的
D言語くんをできるだけ沢山ロケットに積み込み、宇宙に発射しましょう。
他の星にもD言語くんの素敵さを伝えたい。
ロケットへは、上から投げ込むことで積み込むことができます。
■操作方法　　
画面上の矢印ボタンをタップすることにより、主人公(Dちゃん)の左右移動とジャンプができます。
D言語くんをスワイプすることで、直接動かしたり投げたりできます。
Dちゃんもドラッグにより動かしたり投げたりできますが、制御は難しいです。
■Tips
ロケットの着地点にD言語くんを大量に置いておくと、着地の際に自動的に積み込みます。
時間内に沢山のD言語くんを送り出すには、この自動積み込みを二つのロケットで極力続けることが重要です。
画面外にも沢山D言語くんが居ますが、それを動かすためにはDちゃんをうまく移動させることが必要です。
矢印ボタンとスワイプでうまく移動しましょう。
[環境構築] Python 2.7 で CaboCha を使用して係り受け解析

Ubuntu 14.04 向け、日本語の自然文係り受け解析を行う CaboCha を Python 2.7 から使用できるようにするための環境構築をメモ書き。

まず CaboCha の下層で形態素解析を行う MeCab が先に必要。Ubuntu 14.04 であれば apt-get で MeCab 0.996 をインストールできる。

```
$ sudo apt-get install build-essential mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8 python-mecab
$ mecab --version
mecab of 0.996
$ mecab-config --version
0.996
$ mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

続いて [CRF++-0.58.tar.gz](https://taku910.github.io/crfpp/#download) のビルド。CaboCha のライブラリが参照するらしく先に CRF++ をインストールしておく必要がある。MeCab が *条件付き確率場* (CRF) を使用している影響で内部的に `crf_learn` コマンドを使用しているのか、コンパイル用のヘッダか lib が必要なのかな?

```
$ tar zxvf CRF++-0.58.tar.gz
$ cd CRF++-0.58/
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
```

公式サイトから [cabocha-0.69.tar.gz](http://taku910.github.io/mecab/#download) をダウンロードして CaboCha 0.69 + cabocha-python をビルドする。

```
$ tar zxvf cabocha-0.69.tar.gz
$ cd cabocha-0.69
$ ./configure --with-mecab-config=`which mecab-config` --with-charset=UTF8
$ make
$ sudo make install
$ cabocha --version
cabocha of 0.69
$ cabocha
すもももももももものうち
すももも-D
    ももも---D
      ももの-D
          うち
EOS
$ cd python
$ python setup.py install  # sudo すると /usr の方に入るかも
$ python -c "import CaboCha; p=CaboCha.Parser(); print(p.parseToString('すもももももももものうち'))"
すももも-D
    ももも---D
      ももの-D
          うち
EOS
```

なお `setup.py` が Python 3 の構文制約に対応していないので Python 3 に言える場合は修正が必要 (検索すれば出てくる)。

以上。
テスト > 状態に基づく処理 (over Ethernet)

### 状況

UDPで通信する2つのソフトがあるとする。
1つのソフトからもう１つのソフトの状態を取得し、状態に基づく処理をする。

![](http://yuml.me/diagram/class/[Monitor PC]-監視->[Target PC])


### 経過時間

- 5分経過時
   - 状態Aかどうか
- 7分経過時
   - 状態Bかどうか
- 20分経過時、30分経過時、40分経過時、50分経過時、60分経過時
   - 状態Cかどうか

### 全パターン実施時の試験時間

それぞれ状態X「である/でない」を調べる(2通りずつ)。
全部で14通り。

単純な時間の総和[分]は
5*2 + 7*2 + 20*2 + 30*2 + 40*2 + 50*2 + 60*2 = 440分

完全自動化すれば8時間以内で終わる。
手動で行う場合、プラスアルファの時間がかかるだろう。

異なるPC上でやりとりする場合、状態のON/OFFをどのように実装することになるだろうか。

## 案1

- Target PCからトリガー信号を出す
  - トリガー信号を受けたMonitor PCは、経過時間を初期化する
- Target PCはタイマーを持つ
  - タイマーにより[5分経過/7分経過/20分経過...]の管理を行う
  - タイマーの情報を元に、それぞれの計時での状態Xの「ON/OFF」を行う
  
## 結論

上記のような仕組みを実装するのは興味深い。「だが、それを書くには、 この余白(実装時間)は狭すぎる(短すぎる)。」ref. フェルマーの最終定理

440分、動作試験することになりそう。

状態Cは1つの経過時間のチェックにして、時間経過自体のチェックを別途する、など工夫する点はありそう。
5*2 + 7*2 + 20*2 = 64分 + アルファ

## 案2

- Monitor PC側のソフトを以下のようにする
    - タイマーを持たせる
    - Target PCの通信はダミーにする
    - [5分経過/7分経過/20分経過...]の開始処理を行うクラスを実装する
    - こちらの方が余分な通信を考慮しなくていい分、楽そう
    
「だが、それを書くには、 この余白(実装時間)は狭すぎる(短すぎる)。」ref. フェルマーの最終定理

こういう試験が3回必要になった時に実装を検討しよう。
Slack のファイル名がおかしくなるやつを解読する

# Slack のファイル名がおかしくなる？

* ある時からアップロードされたファイルをダウンロードすると日本語のファイル名がおかしくなっていたらしい
    * 個人的にはあまりファイルダウンロードしないので気づいていなかったけど、なんか社内で話題になっていたみたいなので調べてみることにした


# どういう状況か

例えば `オトバンク.txt` というファイルが `u30aau30c8u30d0u30f3u30af.txt` こうなる。ということらしいです。

この時点で PHPer には見覚えがある文字列が並んでいる気がしますね。(や、他の言語でも見れると思うけど)

`u****` が続いているという規則性がありますね。これは PHP `json_encode` した時のと同じじゃないですか！ということでサクッと

```php
<?php
$filename = 'u30aau30c8u30d0u30f3u30af.txt';
echo preg_replace_callback('/(u[0-9a-z]{4})/', function($matches) {
    return json_decode(sprintf('"\\%s"', $matches[1]));
}, $filename);
```

こういうものを書いてみました。ビンゴ。
(いやしかし雑なコードだなあ。PHP 最高)


# これは何か

つまり、ユニコードエスケープされているところから stripslashes かましちゃった感じですね。
再現するなら

```php
<?php

echo stripslashes(json_encode('久々にPHP書いたわ.mp3'));
```

こんな感じで作れます。意味ないけど。


# まとめ

Slack に報告するのはこちらになるのではないでしょうか？
https://slack.com/help/contact


# おまけ

ついでだったので、JavaScript ですぐに文字列作れるやつも書いてみました。
http://jsdo.it/riaf/wa5U
AWSライクな開発環境をDockerで構成してみた件

AWSって便利ですよね、Elastic BeansTalkを使えば環境構築がすぐに終わり
DBもキャッシュサーバもロードバランサも構築されます。
（EBは関係ないですが必然的にS3も使うことでしょう）

---

# 今日の弊社の開発環境

---

- 開発はローカルサーバ（Docker or Vagrant）
- ステージングは共用のステージング専用サーバ
- プロダクションはAWS

ローカル、ステージングをAWSの外に置くことにより開発時のランニングコストを押さえています。
しかし、S3だけは常にAWSを利用していました。

---

# 問題点

---

ローカルサーバはDBも開発者それぞれ、
しかし、S3のバケットは共用なため
他の人にファイルを上書きされたり
勝手に消されたりしてしまう懸念があります。

---

# そこで（本題)

---

#AWSライクな開発環境をDockerで構築した件

---


レシピ

```
version: "2.0"
services:
  lb:
    image: nginx
    ports:
      - 10081:80
    volumes:
      - ./nginx:/etc/nginx/conf.d
    links:
      - web1
      - web2
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db
    ports:
      - 10082:80
    environment:
      PMA_HOST: hoge
      PMA_USER: hoge
      PMA_PASSWORD: hoge
  web1:
    build: ./
    links:
      - db
      - redis
      - maildev
    volumes:
      - ./:/var/www
  web2:
    build: ./
    links:
      - db
      - redis
      - maildev
    volumes:
      - ./:/var/www

  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: hoge
      MYSQL_DATABASE: hoge
      MYSQL_USER: hoge
      MYSQL_PASSWORD: hoge
  redis:
    image: redis
  maildev:
    image: djfarrelly/maildev
    ports:
      - 10084:80
  minio:
    image: minio/minio
    ports:
      - "10085:9000"
    volumes:
      - "./storage/files:/export"
    environment:
      MINIO_ACCESS_KEY: AKIAIOSFODNN7EXAMPLE
      MINIO_SECRET_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    command: server /export
```

---

#なにをしているのか

---

## lbコンテナ

ロードバランシングをしてもらっています。
Elastic Loadbarancingの代わりです。

```nginx.conf
upstream web {
    server web1;
    server web2;
}

server {
    listen 80;
    location / {
           proxy_pass http://web;
    }
}
```

---

## web1,web2コンテナ
EC2の代わりのウェブサーバです。
build先のDockerfileはPHP7-apacheに
redisエクステンションを組み込んだものになってますので
各自自由に構築してください

---
## db

RDSの代わりです。MariaDBを採用

## redis

ElasticCacheのかわりです

---

#minio

S3の代わりです。
詳しく設定を加えたことがないんですが
読み書きだけなら
environmentを設定するだけでいけたので採用しました！

---
おまけ

phpmyadmin コンテナ
MariaDBの確認用においておきました。

maildev コンテナ
メール確認用に、maildevをSMTP先に設定すれば
外部にメールがとぶことはありません

---

総括

これで、よく使うAWSのサービスをローカルで再現して開発ができ・・・るはずです！

イニシャルコストを払わずに開発を開始できるため、フリーランスやスタートアップにぴったりだと思います！
Cloud9でMailCatcherを使う

Cloud9でMailCatcherを使う場合の覚書です。

### 1.インストール

```
$ gem install mailcatcher
```

バージョン確認

```
$ mailcatcher --version
mailcatcher 0.6.5
```

### 2.MailCatcherの起動

```
mailcatcher --http-port 8081 --ip $IP
==> smtp://0.0.0.0:1025
==> http://0.0.0.0:8081
```

### 3.MailCatcherにアクセス確認
https://xxx-xxx-xxx.c9users.io:8081/
![image](https://qiita-image-store.s3.amazonaws.com/0/113212/36b6dd98-d026-6593-5bc9-12db39dfafd2.png)

### 補足
#### ポートの指定について
Cloud9で外部からアクセスできるポートは限られているので、ポートは`8081`を指定しています。
ref https://docs.c9.io/docs/multiple-ports

#### MailCatcher手動での終了方法
本来はMailCatcher画面右上の「Quit」ボタンで終了すべきですが、画面にアクセスできな位場合などは、手動での終了するしかなさそうでした。（もっといい方法あったら教えて欲しいです）

```
$ netstat -tulpn | grep :1025
tcp        0      0 0.0.0.0:1025            0.0.0.0:*               LISTEN      4517/mailcatcher --
$ kill 4517
```
jQueryで指定した文字列を含む要素を取得する方法

以下の様に```contains('文字列')```を使う
・調査範囲はこ要素まで及ぶ
・文字列ではなく、要素を指定したい場合はhas()を使う

```javascript
$("element:contains('文字列')")
```

http://www.jquerystudy.info/reference/selectors/contains.html
部屋にグランドピアノが来た #アセットアドカレ

この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 15日目の記事になります。

おそらくこの記事を読んでいる方は、小さいころからピアノが大好きだったけど、家庭の事情で購入ができなかったグランドピアノへの憧れが捨てられず、今も恋い焦がれていることでしょう。しかし今の技術ならタダで部屋に置けます。場所も取りません。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/def6518f-104c-f32f-e25a-8c90e18430c2.png)


*Unity Asset Storeならピアノも購入もできる。しかも無料で*
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/4827958f-24a4-3be2-d14b-6905d5352f74.png)](https://www.assetstore.unity3d.com/jp/#!/content/154)


## 本題「HoloLensでモデルデータを部屋の好きな場所に配置する方法」

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/ea3ca57e-641e-cb79-afbb-fd2503d5ce7d.png)

今回はHoloToolkit-Unityに含まれるTapToPlaceのデモシーンを利用します。
これは、空間認識をしてくれる便利なSpatialMappingプレハブを使って、部屋の中に浮くCubeをAir-Tapで選択して好きな位置に置けるサンプルのシーンになっています。

TapToPlaceデモシーンの仕組みは、Cubeに設定されているTapToPlaceスクリプトがキーになります。
ManagersゲームオブジェクトにアタッチされているGestureManagerからSendMessage("OnSelect")を受け、視線のGazeManagerでカーソルの位置と、SpatialMappingで壁や床として認識して生成された空間のメッシュのぶつかった座標にCubeを移動。
再度Air-Tapを押すとCubeを固定できるものになっています。

## CubeとPianoを入れ替える

ただし、TapToPlaceはモデルデータのRotationが0で移動する作りになっているので、今回使うPianoのモデルデータのように右手座標系で作られている場合は、モデルのx軸を90度変えるような座標変換や、TapToPlace.csを弄るかする必要がある。

今回は手っ取り早く、Mesh Rendererを除いたCubeの子にPianoのモデルデータを配置する。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/c290dde1-0dcc-5e04-52b8-e348e3505821.png)

あと、ShaderをHoloLensでの表示に最適化されたShaderに入れ替え。これはHoloToolkit-Unityに含まれるShaderから適当に選ぶ。

実際のスケールもHolographic Remoting Playerで実行しながら調整すれば完成。

Tap To PlaceはBox Coliderの面で移動するので、ピアノのモデルサイズと合わせて調整する。
【atom】導入しては消しを繰り返した結果、今でも使っているおすすめパッケージを紹介

atomユーザーが増えるといいな…
設定のパッケージから追加しましょう！

## 基準
★★★★★　ほぼ絶対必要。自分でatomを入れ直したとしてもすぐ導入する
★★★★☆　かなり便利。導入をおすすめする
★★★☆☆　そこそこおすすめ。たまに活躍する
★★☆☆☆　なくてもいいけど、ワンポイントで便利だったりする


## 全体
#### project-manager
- フォルダを指定してプロジェクトとして管理できる
- おすすめ度：★★★★★

#### file-icons
- ファイルごとに可愛いアイコンをつけてくれる（わかりやすい）
- おすすめ度：★★★★★

#### auto-encoding
- 自動的に文字コードを判定してくれる（たまにうまくいかない時がある）
- おすすめ度：★★★☆☆

#### advanced-open-file
- デフォルトのファイル検索の拡張版
- おすすめ度：★★★★☆

## markdown系
#### markdown-pdf
- mdで書いたテキストをhtml書き出しせず一発でpdfにできる
- おすすめ度：★★★★☆

#### markdown-scroll-sync
- md編集とプレビューのスクロールを揃えてくれる（なぜか自分のwindowsでは動かない…）
- おすすめ度：★★☆☆☆

#### markdown-writer
- マークダウンの入力補助、リストなどの動きがよくなる。
- おすすめ度：★★★★☆

## 選択系
#### Sublime Style Column Selection
- alt + 左クリック→ドラッグで矩形選択（複数箇所をまとめて選択）ができる
- おすすめ度：★★☆☆☆

#### multi-cursor
- カーソルを増やして一気に選択できる（縦に増やして単語を一気に選択など）
- おすすめ度：★★★★☆

#### highlight-line
- 選択中の行をハイライトしてくれる（わかりやすい）
- おすすめ度：★★★★★
- ※同シリーズでcolumnもあるが、個人的にそっちは見づらかった

#### highlight-selected
- 選択中の文字列をハイライトしてくれる（わかりやすい）
- おすすめ度：★★★★★

## minimap系
#### minimap
- スクロール時にソース全体のイメージを出してくれる。
- おすすめ度：★★★★☆

#### minimap-autohide
- スクロールし終わったらminimapを隠してくれる
- おすすめ度：★★★★☆

#### minimap-bookmarks
- minimapにブックマークをハイライト表示してくれる
- おすすめ度：★★★★☆

#### minimap-highlight-selected
- 選択中の行をminimap上でハイライトしてくれる
- おすすめ度：★★★★☆

## シンタックス系
#### autoclose-html
- 閉じタグを自動で入れてくれる。
- 自動改行せずインラインで閉じてほしいものも個別に設定できる（title, h1, h2, h3, h4, h5, h6, td, thなど）
- おすすめ度：★★★★★

#### split-diff
- パネル間で差分を見やすくしてくれる（変更点の確認などめちゃくちゃ便利）
- おすすめ度：★★★★★

#### atom-beauty
- ソースコードをきれいに整形してくれる
- おすすめ度：★★☆☆☆


## 番外編　UI Theme
#### Atom Dark Slim
- シンプルで小さくてよい！
- おすすめ度：★★★☆☆
[nodejs]CSVからデータを読み込んでDynamoDBへ登録するサンプル


# 何がしたい
DynamoDBに登録するデータがリスト形式で手元にあるとき、そのリストを読み込んでDynamoDBにPUTリクエストを送りたかったからスクリプトを書いたのでメモ
重い処理でもなんでもなかったからAWS Lambdaで動かしています

# 注意
単発使用のためのもので面倒だったのでCSVファイルも一緒にZIP化しています。

# 使用モジュール
- aws-sdk
- comma-separated-values

# 実装

```javascript:index.js

'use strict';

var fs = require('fs');
var CSV = require("comma-separated-values");
var aws = require('aws-sdk');
var docClient = new aws.DynamoDB.DocumentClient({region: '### region ###'});

exports.handler = function (event, context) {

    fs.readFile('./list.csv', 'utf8', function (err, data) {
        var csv = new CSV(data, {header: true}).parse();
        var len = csv.length;
        var lim = 0;
        for (var cnt = 0; cnt < len; cnt++) {

            var item = {
               column_1: String(csv[cnt].column_1),
               column_2: String(csv[cnt].column_2),
               column_3: String(csv[cnt].column_3)
            };
            var params = {
                TableName: 'items',
                Item: item
            };

            docClient.put(params, function (err, data) {
                lim++;
                if (err) {
                    console.log('[ERROR]',err);
                    if (len === lim){
                        context.succeed();
                    }
                } else {
                    console.log('[INFO]',data);
                    if(len === lim){
                        context.succeed();
                    }
                }
            });
        }
    });
};

```

## 使用するリスト

```txt:list.csv
column_1,column_2,column_3
hoge,fuga,fugaga
```

こんな感じのヘッダー付きCSVを想定

# さいごに
何回か使うならデータ格納先はS3にして、引っ張ってくるのが良いと思う。
MacOSXで画像プレビュー時にできる隠しファイル「._〜」をgitignoreする

画像ファイルをプレビューすると「._画像ファイル名」ができてgitの追加対象に出現してイライラ。
解決策を色々模索したが、結局gitignoreで対応する方針にした。

.gitignore_global に以下を追加
>._*

参考URL
http://amarron.hatenablog.com/entry/2013/11/15/214624
特殊データをUserDefaultsに保存する【Swift3.0】

メモ


## Ex: UIColorデータをUserDefaultsに保存・読み込み

#### 保存

**NSKeyedArchiver.archivedData**でData型にシリアライズ

```Swift
  // Swift3.0

  let bgColor:Data = NSKeyedArchiver.archivedData(withRootObject: UIColor.green)
  UserDefaults.standard.set(bgColor, forKey: "bgColor")
```

#### 読み込み

**NSKeyedUnarchiver.unarchiveObject**で任意の型にデシリアライズ

```Swift
  // Swift3.0

  if let wk = UserDefaults.standard.object(forKey: "bgColor") as? Data
      if let bgColor = NSKeyedUnarchiver.unarchiveObject(with: wk) as? UIColor {
           // 何か処理
      }
   }
```
数式の練習

[Qiitaの数式チートシート](http://qiita.com/PlanetMeron/items/63ac58898541cbe81ada) を参考にした。

# 関数

```math
\begin{align}
f: \, &X \rightarrow Y \\
&x \mapsto f(x)
\end{align}
```
# 行列

```math
\begin{pmatrix}
a & b \\
c & d 
\end{pmatrix}
\\
\begin{bmatrix}
a & b \\
c & d 
\end{bmatrix}
\\
\begin{vmatrix}
a & b \\
c & d 
\end{vmatrix}
```

# 分数

```math
\frac{1}{2} - \frac{1}{3} = \frac{1}{6} \\
1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{2}}}}}
```

# e

```math
e = 2.71828...
```

# 黄金比

```math
\phi = \frac{1 + \sqrt{5}}{2} = 1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{1 + \cdots}}}
```

# 関数合成

```math
\begin{align}
&f^{[1]} = f \\
&f^{[2]} = f \circ f \\
&f^{[n]} = \overbrace{f \circ f \circ \cdots \circ f}^{ n }
\end{align}
```