OmniAICreator/Qiita-1.07M huggingface dataset:
ScalaのfoldLeftとscanLeft

# foldLeftとscanLeft
foldLeftは処理後の値一つを返すのに対しscanLeftは処理毎の途中結果をコレクションとして返してくれる便利なやつ。処理毎の履歴が必要な時に使えそうです。

## 例
1から100までの足し算をfoldLeftとscanLeftでそれぞれで行ってみると、foldLeftは最終的な処理結果のみが返ってきているのに対しscanLeftでは途中結果が保存されているので必要な時に途中結果を取り出すことができます。

```NumberSum.scala
object NumberSum {
  def main(args: Array[String]): Unit = {
    val sumfold = (1 to 100).foldLeft(0)(_ + _)
    // 5050
    val sumscan = (1 to 100).scanLeft(0)(_ + _)
    // Vector(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431, 1485, 1540, 1596, 1653, 1711, 1770, 1830, 1891, 1953, 2016, 2080, 2145, 2211, 2278, 2346, 2415, 2485, 2556, 2628, 2701, 2775, 2850, 2926, 3003, 3081, 3160, 3240, 3321, 3403, 3486, 3570, 3655, 3741, 3828, 3916, 4005, 4095, 4186, 4278, 4371, 4465, 4560, 4656, 4753, 4851, 4950, 5050)
  }
}

```
Socketプログラムメモ: printfとcloseするだけのサーバー作ってみた

ログ出力だけしてcloseするサーバー。
`telnet localhost 12345`で試せます。
wiresharkでlocalhostを観察しながら勉強しました。
もしくは、`sudo tcpdump -n -i lo0`


```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	int listenfd, connfd;
	struct sockaddr_in servaddr;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if(listenfd < 0) {
		perror("socket() err");
		exit(EXIT_FAILURE);
	}

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(12345);
	servaddr.sin_len = sizeof(servaddr);

	if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
		perror("bind() err");
		exit(EXIT_FAILURE);
	}

	if(listen(listenfd, SOMAXCONN) < 0) {
		perror("listen() err");
		exit(EXIT_FAILURE);
	}
	for(;;) {
		connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
		if(connfd < 0) {
			perror("accept() err");
			exit(EXIT_FAILURE);
		}
		printf("----\n");
		if(close(connfd) == -1) {
			perror("close() err");
			exit(EXIT_FAILURE);
		}
	}
	return 0;
}
```
JDT2015セッションまとめ【IT課題の解決に向けたJava EEセントリックな開発標準化の勘所】

日本オラクル　大橋勝之氏

##ユーザ企業の課題
・開発生産性の低さ
・品質の不安定さ
・運用管理コストの増大
・技術者の育成、リテンション（人材流出防止）の難しさ

##オレオレフレームワークの老朽化
　J2EEは機能が貧弱だったため、各開発ベンダがそれを補う独自のフレームワークを構築した。そして、ベンダごとの標準化が進んだ。これは当初はうまくいっていた。

　しかし、現在そのベンダ独自の「オレオレフレームワーク」が老朽化している。ベンダのフレームワーク開発が下火となり、チームに十分な予算が割り当てられず、サポートが十分でない。または、オレオレフレームワークのオペレーションコストが高くなる。

　ユーザは自分たちでフレームワークを管理し保守コストを下げたい。開発ベンダは開発費用が安く済む自前のフレームワークを使いたい。ミスマッチが起きている。

##OSSのリスク
　Struts、iBATISのサポート終了、脆弱性への対応が必要、バージョンアップ時の動作検証にコストがかかるなど、OSSにロックインしてしまうことがリスクとなる。

　JavaのOSS自体が陳腐化している。コミュニティも昔は活発だったが、今は下火。ユーザはもうOSSに辟易している。

　JavaEEの進化に追い抜かれる。陳腐化によって生産性が下がるため、「普通に使ったほうが安い」という状態である。

##JavaEEの採用
　JavaEEの中で開発する流れ（JavaEEを選択する流れ）が起きている。楽天など。

　JavaEEは、フレームワークとしてひと通りの機能は提供できるくらい成熟した。J2EE時代のように、各ベンダが追加のフレームワークを作って載せる必要がなくなった。

　JavaEEの特長は、
　　・開発ベンダのフレームワークに依存しない
　　・OSSに依存しない
　そのため、
　　・バージョンアップの対応コストがかからない
　　・各開発ベンダごとにバラバラの技術が一本化できる
　　・技術者の育成が容易である
　　・海外のリソースを利用しやすい
　さらに、
　　・バッチAPIがJavaEE７から標準化され、メインフレームからの移行が楽になる
　　・JavaEEの「標準」「後方互換性」を最大限活用できる

##JavaEEによる標準化の勘所
　・サードパーティ製のライブラリは末端の機能のみなど疎結合にする
　・インタフェース部分はJavaEEで標準化する
　・構造をパターン化し、カタログを作成する
　・パターン利用のガイドラインを作成し、リスクを限りなく排除する


JavaEEによって「フレームワーク」は標準パターンの組み合わせになる。


--
資料が公開されました
http://www.oracle.com/technetwork/jp/ondemand/online2015-javaday-2511676-ja.html
ESP8266のファームウェアをWindowsからアップロードする

[NodeMCU](http://www.nodemcu.com/index_en.html)の[nodemcu-flasher](https://github.com/nodemcu/nodemcu-flasher)を使ってESP8266にWindowsからファームウェアをアップロードしてみます。NodeMCUのファームウェアはLuaスクリプトでマイクロコントローラを操作できるようです。ATコマンドで動作確認したいので前回と同様に[Electricdragon](http://www.electrodragon.com/w/ESP8266_Firmware)のAT-0942ファームウェアで確認します。

## ブレッドボード配線

PL2303HXを内蔵した[USB-TTLシリアル変換ケーブル](http://www.amazon.co.jp/dp/B00L8SP7U6)を使います。ロジックレベルは3.3V、電源は5Vです。ESP8266は3.3V動作なのでArduino Unoの3.3Vから電源を供給します。ESP8266のファームウェアを更新するときはGPIO0をGNDに接続します。

![ESP8266-firm.png](https://qiita-image-store.s3.amazonaws.com/0/43745/28c17963-c694-b6b5-e6b9-4806331d4aa1.png)

## ファームウェア

[Electricdragon](http://www.electrodragon.com/w/ESP8266_Firmware)のファームウェアは[Oldフォルダ](https://drive.google.com/folderview?id=0B_ctPy0pJuW6d1FqM1lvSkJmNU0&usp=sharing)からAT-0942.binを使います。

## nodemcu-flasher

[nodemcu-flasher](https://github.com/nodemcu/nodemcu-flasher)から64bit版の実行ファイルをダウンロードして実行します。ダウンロードしたファームウェアを0x000000に書き込みます。

![firmware.png](https://qiita-image-store.s3.amazonaws.com/0/43745/c88a193c-8a4f-1a95-4bfd-99a68663a7bf.png)

CoolTermからATコマンドを実行してファームウェアの更新を確認します。
![coolterm.png](https://qiita-image-store.s3.amazonaws.com/0/43745/53619093-e8ba-5e89-5217-c017d4344b5c.png)
Raspberry PIをNAS化する



- サーバーからパッケージ・リストを入手する

<pre>>$ sudo apt-get update</pre>

- パッケージをアップグレードする

<pre>>$ sudo apt-get upgrade</pre>


- ntfsフォーマットを扱えるようにする

<pre>>$ sudo apt-get install ntfs-3g</pre>

- sambaをインストールする

<pre>>$ sudo apt-get install samba</pre>

- USBポートを1.2Aに変更する

<pre>>$ sudo vim /boot/config.txt</pre>

- config.txtの最後に下記を記入して保存する

```txt:config.txt
>safe_mode_gpio=4
>max_usb_current=1
```
- 再起動をする

<pre>>$ sudo reboot</pre>

- USBハードディスクを接続する

- 接続ができているか確認する

<pre>
>$ sudo fdisk -l
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          32  3907028991  1953514480    b  W95 FAT32
>pi@raspberrypi ~
</pre>

- マウントポイントを作成する

<pre>>$ sudo mkdir /mnt/usbhdd</pre>

※usbhdd部分は任意のものをつける

- マウントをする

<pre>>$ sudo mount -t ntfs-3g /dev/sda1 /mnt/usbhdd</pre>

- sambaの設定

<pre>>$ sudo vim /etc/samba/smb.conf</pre>

```conf:smb.conf
[RaspNAS]
comment=USBHDD
path=/mnt/usbhdd
public = Yes
read only = No
writable = Yes
guest ok = Yes
force user = pi
```

- sambaの再起動

<pre>>$ sudo service samba restart</pre>

- Windwosからの接続

<pre>¥¥IPアドレス</pre>

- Macからの接続

<pre>>smb://IPアドレス</pre>
Raspberry PIメモ


## 買う

- Raspberry PI
- MicroSD
- キーボード
- マウス
- 無線LAN


## GUI

>$ startx

## 無線がプチプチ切れる

>$ sudo vim /etc/modprobe.d/8192cu.conf


``` 8192cu.conf
options 8192cu rtw_power_mgnt=0
```

## 電力アップ

- config.txtの最後に下記を記入し、保存する。

>$ vim /boot/config.txt


``` config.txt
safe_mode_apio=4
max_usb_current=1
```

>$ sudo reboot
EclipseでNode.jsを使う


### Eclipseのnodeclipseプラグインをインストールする
1.メニューから「ヘルプ」 -> 「新規ソフトウェアのインストール」を選択する。
2.「作業対象」に http://www.nodeclipse.org/updates/ を入力する。
3.「1st Nodeclipse Core」と「Enide Tool Collection」にチェックを入れ、次へをクリックする。

![nodeclipse.png](https://qiita-image-store.s3.amazonaws.com/0/52545/237c4773-d671-d161-a25e-2587f06aaba8.png "nodeclipse.png")

4.ウィザードにそって適当に進める。

<br />

### プロジェクトを作成する

1.メニューの「ファイル」 -> 「新規」 -> 「プロジェクト」を選択する。
2.「Node.js Express Project」を選択し、次へをクリックする。

![menu_node.png](https://qiita-image-store.s3.amazonaws.com/0/52545/bca5ba87-9642-cd74-923f-664d2be613e0.png "menu_node.png")

3.プロジェクト名を入力して、完了をクリックする。

<br />

### 起動する
1.メニューから「実行」 -> 「実行構成」を選択する。
2.「Node Application」を選択し、右クリックのメニューから新規を選択する。
3.実行をクリックする。
<br />
実行するとエラーになる原因のわかる人いたら教えて下さい。
<pre>
module.js:338
    throw err;
          ^
Error: Cannot find module '/Users/suesan/Documents/workspace'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3
</pre>

※わかったら更新します。
【Unity】メソッドの返り値に複数の型を指定する方法【C#】

Unityと言うよりはC#の話です。C#ではメソッドの返り値に1つの型しか指定することができません。
そこで複数のパラメータをメソッドで返す場合にどうしたら良いかを紹介したいと思います。

#自分で新しくクラスや構造体を定義する
**最も無難で正統派な方法。**自分でそういった複数の型を内部に持つクラスや構造体を作ってしまう。
用途に合わせていちいちクラスを定義することは結構面倒くさいのが難点だが、コードの可読性はかなり高まる。


# outキーワードを使う
[Pyhisics.Raycast](http://docs.unity3d.com/ja/current/ScriptReference/Physics.Raycast.html)等でも登場するoutを使うパターン。
メソッドの引数定義にoutを指定することで、その引数を出力用の変数として宣言することができます。
ただoutを使うとコードが汚くなっていくので自分はあまり好きじゃないです。

```csharp:out
void Start()
{
    string loadData;
    var isSuccessed = LoadData(out loadData);
    if (isSuccessed)
    {
        Debug.Log(loadData);
    }
}

/// <summary>
/// データをロードする
/// </summary>
/// <param name="data">読み込み成功時の値</param>
/// <returns>ロードの成否</returns>
bool LoadData(out string data)
{
    try
    {
        //なんかロード処理
        data = ("ロードしたデータ");
        //成功したらtrueを返す
        return true;
    }
    catch
    {
        data = null;
        //例外が出たらfalseを返す
        return false;
    }
}
```

# ValueTupleを使う

C#7以降ならValueTuple（タプル）が使えます。
返り値のパラメータ数が多くないならValueTupleでも十分使えます。

```csharp
protected void Start()
{
    // 分解代入できる
    var (isSucceed, result) = LoadData();

    if (isSucceed)
    {
        Debug.Log(result);
    }

}

private (bool,string) LoadData()
{
    try
    {
        //ココらへんでロード処理

        return (true, "ロードしたデータ");
    }
    catch
    {
        return (false, null);
    }
} 

```

#まとめ

* 専用の型を用意してそれにまとめるのが一番安全だが、面倒くさい
* ValueTupleは便利だが、戻り値の数が増えるとぐちゃぐちゃになるので乱用は注意
Socketプログラムメモ: lsof でのlisten確認

socketの勉強のため、macでsocketでlistenして、lsofで確認しようとしてはまった。
port:12345をlistenしているはずなのに、`lsof -n -i:12345`しても何も出てこない。数時間はまったが、
`sudo lsof -n -i:12345 -P`で解決しました。
`sudo`必要でした。
なお、`netstat`では`netstat -an`で、sudoなしでも大丈夫でした。



以下は、確認に使ったプログラム。
このプログラムの実行時に`sudo`しているのだから、`lsof`も`sudo`必要なのはもっと早く気がつくべきであった。

```listen_test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	int listenfd;
	struct sockaddr_in servaddr;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if(listenfd < 0) {
		perror("socket() err");
		exit(EXIT_FAILURE);
	}

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(12345);
	servaddr.sin_len = sizeof(servaddr);

	if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
		perror("bind() err");
		exit(EXIT_FAILURE);
	}

	if(listen(listenfd, SOMAXCONN) < 0) {
		perror("listen() err");
		exit(EXIT_FAILURE);
	}
	while(1);
}
```
cakePHP DebugKitが導入できない問題 ~3系への変遷~

#cakePHPのDebugKitの導入が出来ない…

DebugKitの導入は以下のページを参考にするなどして簡単に出来ます。
[CakePHP DebugKit の導入手順](http://qiita.com/BUN/items/403cccad9eaa831e6fd8)

…出来るはずでした。

```
Error: DebugKit.ToolbarComponent could not be found.
Error: Create the class ToolbarComponent below in file: /Applications/MAMP/htdocs/practice/twitter_login/app/Plugin/DebugKit/Controller/Component/ToolbarComponent.php
```

なぬ、出来ない！！

#まさかの3系対応
READEME.mdをよく見てみると、

```
The master branch has the following requirements:

CakePHP 3.0.0 or greater.
PHP 5.4.16 or greater.
SQLite or another database driver that CakePHP can talk to. By default DebugKit will use SQLite, if you need to use a different database see the Database Configuration section below.
```
masterブランチは3.0.0以上対応ですよということか。

```
If you want DebugKit for your 2.x application, you can use the latest 2.2.y tag or the 2.2 branch.
```

2系はブランチの「2.2」を使えば良いとのこと。

「2.2」を使えば無事出来ました！

ちなみに、ブランチはgitHubの左上のあたりにあります。
いつの間にか変更されていて戸惑いましたがちゃんと書いてありましたね。
Unity4->5移行に伴いjenkins用ビルドマシンで気を付けること

まぁUnity5入れときゃいいじゃん程度に思ってたら色々引っかかり…

## Proライセンスを再度入力しないといけない
起動したときにちょっとドキドキしました。
そういうものだそうです。Unity5あるあるですよね。

## AndroidSDKのpathを再設定しないといけない
設定しないとビルド途中にpath設定ウィンドウが開き、選択するまでビルドが進まなくなります…

## JDKのLocationを設定しないといけない
こんなのUnity4にあったっけ？なんですが、設定しなくても困らないのかな？
どこだっけ？とちょっと調べてしまいましたが、選択すると普通に最初からpathが開いてました。私の環境だと。
Pythonで関数型プログラミング Project Euler 2


[Problem 2](https://projecteuler.net/problem=2)

> # [「偶数のフィボナッチ数」](http://odz.sakura.ne.jp/projecteuler/index.php?Problem%202)
> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

# 無限リスト
一般的なプログラミング言語では無限の長さを持つリストを定義することはできません。
しかし、関数型言語には遅延評価という仕組みがあり無限リストを簡単に作ることができるため、フィボナッチ数列は無限リストとして定義するのが関数型らしい方法です。
Pythonでは厳密には無限リストを作ることはできませんが、ジェネレータを使うことで無限リストに近いものを表現することができます。

# ジェネレータ
普通の関数ではreturnで値を返しますが、ジェネレータ関数ではyieldで値を返します。

```python3:ジェネレータ関数
def generate():
    n = 1
    yield n
    n += 1
    yield n
    n += 1
    yield n
```

ジェネレータ関数を実行するとジェネレータオブジェクトが作成されます。

```pycon
>>> generator = generate()
>>> for i in generator:
...     print(i)
... 
1
2
3
```

1回目に呼ばれると最初のyieldで値を返し、そこで中断します。
2回目に呼ばれると前回中断したところから処理が始まり、次のyieldで値を返し、そこで中断します。
yieldでは値を返しても関数から抜けないところがreturnと違うところです。

# takewhile関数
itertoolsモジュールには関数型プログラミングで使用するための関数が用意されています。
この問題では4000000以下の要素だけを取り出すためにtakewhile関数を使用します。
takewhile関数は条件を満たす間だけ要素を返すイテレータを作成します。
filter関数と違って一度でも条件が満たされなければそれ以降の要素は返されません。

```pycon
>>> from itertools import takewhile
>>> x = takewhile(lambda n: n < 10, range(100))
>>> list(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

# 解答例

```python3
# -*- coding: UTF-8 -*-
from itertools import takewhile

def generateFibonacci():
    '''フィボナッチ数列を生成するジェネレータ関数'''
    n1, n2 = 1, 2
    while True:
        yield n1
        n1, n2 = n2, n1 + n2

# ジェネレータ関数でフィボナッチ数列を作る。
fibonacci_sequence = generateFibonacci()

# takewhile関数で4000000以下の要素に範囲を絞る。
fibonaccis = takewhile(lambda n: n <= 4000000, fibonacci_sequence)

# filter関数で偶数のみを抽出する。
even_fibonaccis = filter(lambda n: n % 2 == 0, fibonaccis)

answer = sum(even_fibonaccis)
print(answer)

```
Unity5移行したらjenkinsでIOException: Failed to Move File / Directory from ...と怒られた(iOS用)

Unity5移行にともないjenkinsを見ていたところ、Tempにある内容をxcode用プロジェクト用ディレクトリにコピーできない！と怒られました。
よく見てみると作ったはずのプロジェクト用pathが無い！いや、確かに作ったはずなのに…不思議な動き。

プロジェクト用ディレクトリは以下の様に作っていました。

```lang:シェルの実行に記入
mkdir -p $WORKSPACE/package/ios/build/
```

うーん、まさかねーと思って、バッチの方に以下の様に書き足しました。

```lang:BatchBuild.cs
private static bool iOSBuild() {
    System.IO.Directory.CreateDirectory("package/ios");

    string errorMsg = BuildPipeline.BuildPlayer(scenes, "package/ios", BuildTarget.iOS, opt);
```
ビンゴ！ディレクトリ作るところからバッチ側で書かないといけないのね…
これUnity4.6までは問題なかったのに…
乗るしかない！このBIGW(ry。 Electronを使った始めてのデスクトップアプリケーション

ElectronはJavaScriptを使ってデスクトップアプリケーションを作成することのできる、今ノリノリのソフトウェアです。少し前までAtom Shellと呼ばれていました。
テキストエディタである[Atom](https://atom.io/)や先ほど発表された、[Visual Studio Code](https://code.visualstudio.com/)もElectronで作成されています。
作成したアプリケーションはWindows/Mac/Linuxに配布することができます。
JavaScript+HTMLでいろいろなアプリケーションを作成する流れは今後も加速していくでしょう。その流れに乗るために、今のうちにElectronを触っておきましょう。

本投稿ではElectronを使っての簡単なアプリケーションの作り方を紹介します。

# Electronのセットアップ
Electronのセットアップはダウンロードによるものとnpmによるものがありますが、今回はダウンロードによるもので行います。
まずは[こちら](https://github.com/atom/electron/releases)から環境に合うZIPファイルをダウンロードします。
そして、ダウンロードしたZIPファイルを展開します。
セットアップは以上です。簡単ですね。

# Electronでアプリケーションの作成
アプリケーション用のディレクトリを作成し、その中に3つのファイルを作成します。
ディレクトリ名はなんでも良いのですが、後々の事を考慮するとappとしておくのが良いです。

```
app —————————————— アプリケーションが配置されるディレクトリ 
　└package.json —— アプリケーションの設定を記したファイル
　└index.js —————— 最初に起動されるJavaScript
　└index.html ———— 表示する画面
````
では、各中身を見て行きましょう。

```json:package.json
{
  "name"    : "first-application",
  "version" : "0.1.0",
  "main"    : "index.js"
}
```

package.jsonにより、最初に起動するのがindex.jsであることが指定されています。


```js:index.js
// アプリケーションのライフサイクルをコントロールするモジュール
var app = require('app');
// アプリケーションのウィンドウを作成するためのモジュール
var Window = require('browser-window');
// GCで回収されないようにメインウィンドウはグローバル領域で宣言します。
var mainWindow = null;
// Electronの初期化が完了したら呼び出されます。
app.on('ready', function() {
	// 画面を表示します。
	mainWindow = new Window({
		width : 800,
		height : 600
	});
	// 画面の内容となるHTMLファイルをロードします。
	mainWindow.loadUrl('file://' + __dirname + '/index.html');
	// ウィンドウが閉じられたら、アプリも終了するようにします。
	mainWindow.on('closed', function() {
		app.quit();
	});
});
```

index.jsによって、index.htmlがウィンドウに読み込まれます。

```html:index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>はじめてのElectron</title>
</head>
<body>
	<h1>初めてのElectron!</h1>
	JavaScript+HTMLでデスクトップアプリケーションを作成することができます。
</body>
</html>
```

# 実行する
ダウンロードしたElectronのアプリケーションを実行すると、ウインドウが表示されます。
そのウインドウに作成したアプリケーションのディレクトリをドラッグ&ドロップするとアプリケーションが実行されます。

# 実行する　その２
実行のもう一つの方法は、作成したアプリケーションのディレクトリを、ダウンロードしたElectronの下にあるリソースディレクトリに配置し、Electronを実行することです。
配置するディレクトリは、Windows/Linuxだったら、resources です。
Macでしたら、展開したElectronアプリを右クリックし、「パッケージ内容を表示」で表示される Contents/Resources です。

# Electronで簡単デスクトップアプリケーション
Electronに興味を持っていただけましたか？
Electronをつかえばお手軽にデスクトップアプリケーションを作成できる事を知っていただけたと思います。
配布も簡単なので、あなただけのアプリケーションを作成して皆に配ってみてはいかがですか？

# リンク集
最後に、さらにElectronに親しんでいただくために標準ドキュメントのリンクをご紹介して、シメの代わりとさせていただきます。
Electronのドキュメント https://github.com/atom/electron/tree/master/docs
・Quick Start https://github.com/atom/electron/blob/master/docs/tutorial/quick-start.md
・使えるAPI群 https://github.com/atom/electron/tree/master/docs#api-references
・配布方法 https://github.com/atom/electron/blob/master/docs/tutorial/application-distribution.md
すべての依存モジュールを開発版(リポジトリ)からインストールするように変更する

書き捨てです

```js:do.js
var npm = require("npm")
var fs = require('fs')

getPackages(require('./package'), function(err, package){
    fs.writeFileSync('./package_new.json', JSON.stringify(package, null, '  '), {flag: 'w'})
})

function getPackages(package, cb){
    Object.keys(package["dependencies"]).map(function(p){
        fetchRepositoryURL(p, function (err, url) {
            package["dependencies"][p] = url
            cb(err, package)
        })
    })
}

function fetchRepositoryURL(name, cb) {
    npm.load({}, function (er, api) {
        api.commands.view([name], function(err, result){
            var p = result[Object.keys(result)[0]]
            if (p.repository) cb(null, p.repository.url)
        })
    })
}
```

```
node do.js
mv package_new.json package.json
```

こうなってる

```
  "dependencies": {
    "babel": "https://github.com/babel/babel",
    "body-parser": "https://github.com/expressjs/body-parser",
    "cookie-parser": "https://github.com/expressjs/cookie-parser",
    "csurf": "https://github.com/expressjs/csurf",
    "debug": "git://github.com/visionmedia/debug.git",
    "express": "https://github.com/strongloop/express",
    "express-state": "git://github.com/yahoo/express-state.git",
    "flux-router-component": "git://github.com/yahoo/flux-router-component.git",
    "fluxible": "https://github.com/yahoo/fluxible",
    "fluxible-plugin-fetchr": "git://github.com/yahoo/fluxible-plugin-fetchr.git",
    "fluxible-plugin-routr": "^0.3.0",
    "react": "https://github.com/facebook/react",
    "serialize-javascript": "https://github.com/yahoo/serialize-javascript.git",
    "serve-favicon": "https://github.com/expressjs/serve-favicon"
  },
```

## npm API非依存版

ローカルに既にnode_modules/ がある前提のスクリプトも書いた。標準モジュールしか使ってないので ~/bin/rewrite_repo_urls.js とかで呼び出せる。

```js:rewrite_repo_urls.js
#!/usr/bin/env node

var fs = require('fs');
var exec = require('child_process').execSync;

var myPackage = require(process.cwd() + '/package');

var paths = exec('find ./node_modules -type f -depth 2 -name package.json').toString().split("\n");
paths.map(function(path){
    if(path.length === 0){
        return;
    }

    var name = /node_modules\/(.+)\/package.json/.exec(path)[1];
    var package = require(process.cwd() + '/' + path);
    if(myPackage['dependencies'][name] && package.repository){
        myPackage['dependencies'][name] = package.repository.url;
    }
});

fs.writeFile('./package.json', JSON.stringify(myPackage,  null, '  '), {flag: 'w'});
```
pythonで今週の日付を任意のフォーマットで求める

週次なバッチ実行で今日から一週間分の日付とか欲しくなったので備忘録。

``` py:weekly_dates.py

from datetime import datetime, timedelta

# 1つづつ出力
for i in xrange(7):
        print (datetime.now()+timedelta(i)).strftime("%Y/%m/%d")

# リスト内包表記でリストに突っ込む
print [(datetime.now()+timedelta(i)).strftime("%Y/%m/%d") for i in xrange(7)]


```

実行結果はこんなん。

```sh

$ python weekly_dates.py
2015/05/01
2015/05/02
2015/05/03
2015/05/04
2015/05/05
2015/05/06
2015/05/07
['2015/05/01', '2015/05/02', '2015/05/03', '2015/05/04', '2015/05/05', '2015/05/06', '2015/05/07']


```
Ruby で JavaScript を書く、 Opal を使ってみる #opalrb

## :gem: 概要
Ruby で JavaScript を書く、 Opal を使ってみます
## <i class="fa fa-question-circle" style="font-size:1em;"></i> Opal とは？
<i class="fa fa-external-link" style="font-size:1em;"></i>[Opal Official](http://opalrb.org/)
***Opal is a ruby to javascript compiler.***

Ruby の文法で JavaScript を書くための AltJS 言語です。
## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
CDN 版を利用してみます。
### <i class="fa fa-code" style="font-size:1em;"></i> ソースコード
~~~html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Opal Sample</title>
  <script src="http://cdn.opalrb.org/opal/current/opal.min.js"></script>
  <script src="http://cdn.opalrb.org/opal/current/opal-parser.min.js"></script>
</head>
<body>
<script type="text/ruby">
3.times { |i| puts "Hello Opal #{i}" }
puts ('a'..'f').map(&:upcase)
Person = Struct.new(:name, :age)
tanaka = Person.new('tanaka', 34)
suzuki = Person.new('suzuki', 23)
[tanaka, suzuki].map { |e|"#{e.name} - #{e.name}" }.each(&method(:puts))
</script>
</body>
</html>
~~~

### コンソール出力

~~~
Hello Opal 0
Hello Opal 1
Hello Opal 2
A,B,C,D,E,F
tanaka - tanaka
suzuki - suzuki
~~~ 

![opal.png](https://qiita-image-store.s3.amazonaws.com/0/43480/203ae6cf-88dd-5fbd-61db-d4d3ce65ca7c.png)

### <i class="fa fa-play" style="font-size:1em;"></i> デモ

<i class="fa fa-external-link" style="font-size:1em;"></i> [Opal デモ](http://bl.ocks.org/tbpgr/75e3f58b99b39b52e5b9)
※開発ツールでコンソールを確認すると結果が出力されている

## :memo: メモ
興味を持った誰かが Opal を深掘りしてくれることを期待 :smirk:

## 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i>[Opal Official](http://opalrb.org/)
* <i class="fa fa-external-link" style="font-size:1em;"></i>[Opal Document](http://opalrb.org/docs/)
Vaultとconsul-templateを連携する

[前回の記事](http://qiita.com/yunano/items/bfaac7868ce4fb946ee5)ではVaultとConsulの連携を行ってみたが、Vaultのリリースに対応してconsul-templateが0.9.0でVaultからも値を取得することができるようになったのでこちらも試してみた。

consul-templateのインストール。

```
# wget https://github.com/hashicorp/consul-template/releases/download/v0.9.0/consul-template_0.9.0_linux_amd64.tar.gz
# tar xvf consul-template_0.9.0_linux_amd64.tar.gz
# cp consul-template_0.9.0_linux_amd64/consul-template /usr/local/sbin/
```

consul-templateがVaultに接続できるようにするためには2つの環境変数VAULT_ADDRとVAULT_TOKENに値をセットする必要がある。
VAULT_ADDRはVaultのアドレス、VAULT_TOKENは`vault init`や`vault token-create`で取得したトークンをセットする。

```
# export VAULT_ADDR='http://127.0.0.1:8200'
# export VAULT_TOKEN=8c535adc-f7c7-32d7-09ae-14c32da1e6b6
```

[ドキュメント](https://github.com/hashicorp/consul-template/blob/master/README.md)を見ると設定ファイルを使えばvault {}内にこの辺りの設定を書けば良いように見えるが、実際やってみると書いた設定がまったく効いていなかった。

次のようなテンプレートファイルを作成すると、Vaultのsecret/templateのkey1の値がファイルに書き込まれる。
[ドキュメント](https://github.com/hashicorp/consul-template/blob/master/README.md)には「vault」ではなく「secret」と書かれている箇所があるが誤りである。

```/tmp/vault.tmpl
{{with vault "secret/template"}}{{.Data.key1}}{{end}}
```

Vaultのsecret/templateにkey1=value1をセットしておく。

```
# vault write secret/template key1=value1
```

consul-templateを起動してみる。
Consulのアドレスを指定していないが、ConsulとVaultとは完全に別のデータソース扱いのようで、consul-templateとVaultだけでも（つまり、Consulがなくても）利用することができるように見える。

```
# consul-template -template "/tmp/vault.tmpl:/tmp/_vault_" &
```

出力されたファイルを開けると先程セットした値が表示される。

```
# cat /tmp/_vault_
value1
```

consul-templateではConsulから値を取得している場合は、使用しているキーの変更がトリガーになってファイル書き換えが行われるが、Vaultの値が変更された場合はどうだろうか。

Vaultのsecret/templateのkey1の値を変更してみる。

```
# vault write secret/template key1=value1a
```

残念ながらファイルの方の値は変わらなかった。
Vaultの値変更はトリガーにはなってくれないらしい。

```
# cat /tmp/_vault_
value1
```

Consulからも値を取得するようにテンプレートを変更して、Consulの方の値を変更したらどさくさまぎれに一緒にVaultからの値も変更されないか見てみたが、変更されたのはConsulの方の値だけだった。
今のところVaultからはconsul-temnplate起動時にのみ値を読み込んでいるように見える。
GeoLite2を使ってIPアドレスから国・都市を検索する

MaxMind社のGeoLite2というIPアドレスから国や都市といった位置情報を返すデータベースがあります。
より精度の高いGeoIPは有償ですが、GeoLite2はCreativeCommons(表示・継承)ライセンスで無償配布されています。

http://dev.maxmind.com/geoip/geoip2/geolite2/

またこのデータベースを利用するGeoIP2ライブラリも各種言語版が同社のGitHubから配布されています。Java版のライブラリはこちら。

https://github.com/maxmind/GeoIP2-java

このGitHubページの説明ではウェブサービス版のクライアントや有償DBの使い方の説明が主ですが、無償版のGeoLite2もこのライブラリを使って問題無く利用出来ます。

GeoLite2の利用にあたってはRDB等のセットアップは不要で、メモリ上にデータを読み込んで利用することが出来るため大変手軽です。精度が低いとはいえざっくり国名を引っ張る程度であれば十分だと思います。ログ解析等の目的で大量のIPアドレスに国情報をつけたいときなどに便利です。

# 使い方

一般的なMavenプロジェクトを例に使用方法を説明します。

## GeoIP2ライブラリをプロジェクトに追加

```xml:pom.xml
<dependency>
    <groupId>com.maxmind.geoip2</groupId>
    <artifactId>geoip2</artifactId>
    <version>2.2.0</version>
</dependency>
```

## GeoLite2データベースをダウンロードして解凍・プロジェクトに追加

上記ページからGeoLite2 CityまたはGeoLite2 Country databaseの"MaxMind DB binary"版をダウンロード、解凍して下さい。解凍時のサイズは都市情報も含むCity版で35MB程度、国情報だけのCountry版はその十分の一程度です。

データベースファイルの読み込み方法ですが、今回の例ではクラスローダー経由で読み込みます。/src/main/resourceディレクトリ以下にサンプルプログラムのパッケージと同じ階層のディレクトリを作成してデータベースファイルを配備します。

![Screen Shot 2015-05-01 at 14.44.15.png](https://qiita-image-store.s3.amazonaws.com/0/57214/61692629-cd44-38f8-4836-32ecb6b95c0d.png)

## サンプルコード

qiita.comの地理情報を取得してみます。この例では都市名まで取得出来ていますが、実際は仮に都市名が取得出来たらラッキー程度に考えておいた方が無難かもしれません。

```java

public class GeoLiteSample {

    public static void main(String[] args) throws Exception {

        // クラスパスからデータベースファイルを読み込むInputStreamを作成
        InputStream in = GeoLiteSample.class.getResourceAsStream("GeoLite2-City.mmdb");

        // DatabaseReader.Builderクラスを用いてInputStreamからDatabaseReaderオブジェクトを作成
        DatabaseReader cityDB = new DatabaseReader.Builder(in).build();

        // 都市情報を問い合わせ。引数はInetAddressオブジェクトです
        CityResponse res = cityDB.city(InetAddress.getByName("www.qiita.com"));

        // 大陸名を表示 -> Asia
        System.out.println(res.getContinent().getName());

        // 国名を表示 -> Japan
        System.out.println(res.getCountry().getName());

        // 地域名を表示 -> Tōkyō (東京都)
        // 日本の場合LeastSpecificSubdivisionもMostSpecificSubdivisionも県名
        System.out.println(res.getLeastSpecificSubdivision().getName());
        System.out.println(res.getMostSpecificSubdivision().getName());

        // 都市名を表示 -> Tokyo
        System.out.println(res.getCity().getName());

        // 各地域情報からは国コードや言語別の表示名を取得出来ます
        // 国コード -> JP
        System.out.println(res.getCountry().getIsoCode());
        // 日本語での地域名 -> 東京都
        System.out.println(res.getLeastSpecificSubdivision().getNames().get("ja"));
        // 緯度・経度・タイムゾーン -> [latitude=35.685, longitude=139.7514, timeZone=Asia/Tokyo]
        System.out.println(res.getLocation());
   }
}

```
Docker on Mac OS X (boot2docker使用)

既出だとは思うのですが、自分用にメモです。

# 事前に必要なもの

* **Virtual Box**

入れてください。

# boot2docker について

**boot2docker** ( http://boot2docker.io/ ) は、Windows は Mac OS X のような非Linux系OS上でも Docker を動作させるためのソフトです。仕組み的には Virtual Box 上に仮想Linuxを構築し、その上でDockerを動作させると言う仕組み。

ワンステップ挟む状態にはなるのですが、使っている限りは違和感無く、通常のLinux上で使っている感覚でDockerを使うことが出来ています。

# boot2dockerのインストール

`homebrew`等で入れる事も出来ますが、公式上からパッケージを落として来てインストールする事も可能です。(自分は通常のパッケージからインストールしました)

https://docs.docker.com/installation/mac/

それ移行の手順については、こちらに乗っています。要約すると、以下のような感じ

```shell-session
$ boot2docker init
$ boot2docker start
$ eval "$(boot2docker shellinit)"
```

`boot2docker shellinit` で表示される環境変数は、毎回設定するのが面倒なので、`.bashrc`辺りに追記しておくとよさげ
管理者権限なしでPowerShellスクリプトを実行する方法


PowerShellのスクリプトはデフォルトでは実行できないようになっています。
スクリプトを実行するためにはGet-ExecutionPolicyコマンドレットで実行ポリシーをRestricted以外に変更する必要があります。

```:PowerShell
Set-ExecutionPolicy RemoteSigned
```

ところが、上のようにコマンドを実行するとエラーとなり、PowerShellを管理者として実行するように指示が表示されます。
でも大丈夫。管理者権限がなくてもスクリプトを実行できる方法があります。

---
実行ポリシーについては下の記事に詳しく説明されています。
[Tech TIPS：WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する - ＠IT](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)

# 方法1: スコープを指定してExecutionPolicyを変更する
スコープを実行中のプロセスに絞れば実行ポリシーを変更できます。

```:PowerShell
Set-ExecutionPolicy RemoteSigned -Scope Process
```

# 方法2: PowerShellの起動オプションとして実行ポリシーを指定する
PowerShellの起動時に起動オプションで実行ポリシーを指定することもできます。

```bat:コマンドプロンプト
powershell -ExecutionPolicy RemoteSigned
```

ファイル名を指定すれば直接スクリプトを実行することもできます。

```bat:⚪︎
powershell -ExecutionPolicy RemoteSigned -File script.ps1
```

もちろん、上のコマンドをバッチファイルに書いておけばバッチファイルをダブルクリックするだけで実行できます。

ただし、順序を入れ替えるとダメみたいです。謎ですね。

```bat:×
powershell -File script.ps1 -ExecutionPolicy RemoteSigned
```

# 方法3: ファイルの内容を一度文字列として読み込んでから実行する
最後に、スクリプトの内容をまるごと文字列として読み込んで実行する方法もあります。

Get-Contentはファイルの内容を各行を１つの文字列とする配列として読み込むので、改行を入れて結合してからInvoke-Expressionで実行します。

```:PowerShell_2.0
(Get-Content [ファイル名]) -join "`n" | Invoke-Expression
```

PowerShell 3.0にはファイルの内容をまるごと１つの文字列として読み込む-Rawパラメータがあります。

```:PowerShell_3.0
Get-Content [ファイル名] -Raw | Invoke-Expression
```
---
こうしてみると、案外抜け穴がいろいろありますね。
PowerShellの実行ポリシーというのはスクリプトを実行できなくするためのものではなくて、不用意にスクリプトを実行してしまわないようにしている程度のものだということがわかります。
jQueryValidationEngineで、フォーカス外した時にバリデーション処理をさせない方法

#フォーカス外した時の警告表示を防ぎたい

ブラウザ上で比較的簡単に入力内容の判定ができるjQueryValidationEngineですが、判定対象のフォームからフォーカスを外した時に吹き出しが出ることを防ぎたい時もあります。

## 呼び出し時にbinded:false を指定する。

答えはgithubに記述されていました。

下記リンク先の Options あたりに
https://github.com/posabsolute/jQuery-Validation-Engine

> validationEventTrigger 
Name of the event triggering field validation, defaults to blur.

と、記述があります。
blurイベント（＝要素がフォーカスを失った時）にその領域の判定をするよ！　ということです。
そして、もう少し下のあたりに


> binded　
If set to false, it removes blur events and only validates on submit.

とか書いてあります。

要は、validateさせたいフォームに対して、 binded:false を指定することによって、blur event を取り除き submitボタンが押されたタイミングでしか処理しないようになります。

こんな感じで呼び出してあげればOK

<pre>
jQuery(document).ready( function() {

	/*こんな感じで、binded:false を指定する*/
	return jQuery('#formid').validationEngine('attach',{binded:false});
	
});
</pre>
OpenLDAPでよみがな(phonetic)を有効にする方法


OpenLDAPで作ったLDAPサーバで、`cn;lang-ja;phonetic`とか付けたいときに、変更する方法。なお、salpd.confじゃ無くてslapd.dで管理している場合の話です。

実行は全部root権限です。まずは、現在の設定を確認します。。

```
# ldapsearch -Y EXTERNAL -H ldapi:// -b cn=config -s base 
```

上の結果に`olcAttributeOptions`が無いなら、下記を実行します。

```
# ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=config
changetype: modify
add: olcAttributeOptions
olcAttributeOptions: lang- phonetic

EOF
```

何も設定されていないデフォルト状態だと`lang-`だけ設定されている扱いになるので、`lang- phonetic`として設定を上書きするのがコツらしいです。再度、確認用コマンドを実行して、追加されているのを確認します。もし、既に`olcAttributeOptions`がある場合は、LDIF部分を追加じゃ無くて変更に書き換えて下さい。

なお、CentOS7パッケージのOpenLDAPとかなら、`/etc/openldap/slapd.d/cn=config.ldif`の中身が書き換わっているはずです。サービス再起動も不要のはずだけど、反映されていないなら、サービス再起動して下さい。

全然プログラミングの話じゃないとQiitaに投稿するのに気が引けるような気がするので、ついでに、OpenLDAPでのschemaファイルをslapd.dで動作しているLDAPサーバに投げ込めるldifファイルに変換するツールを貼っときます。
https://gist.github.com/raccy/d392c23456d395a155d6
eduperson.schemaとgakunin.schemaが問題なくいけたので、たぶん、どのschemaファイルでもいける気がしますが、無保証です。samba.schemaはパッケージにldifファイルがこっそり含まれているますので、それを使えば不要です。
複数databaseのmigration


複数のdatabaseもきちんとmigrationを使って管理したいです。

たとえば `foo` というデータベースを追加で管理したい場合、以下のようなrakeタスクを作ることで良い感じに運用できます。

```lib/tasks/database_foo.rake
namespace :foo do

  desc "Configure the variables that rails need in order to look up for the db
    configuration in a different folder"
  task :set_custom_db_config_paths do
    ENV['SCHEMA']                                     = 'db_foo/schema.rb'
    Rails.application.config.paths['db']              = ['db_foo']
    Rails.application.config.paths['db/migrate']      = ['db_foo/migrate']
    Rails.application.config.paths['db/seeds.rb']     = ['db_foo/seeds.rb']
    Rails.application.config.paths['config/database'] = ['config/database_foo.yml']
    ActiveRecord::Migrator.migrations_paths           = 'db_foo/migrate'
  end

  namespace :db do
    task drop: :set_custom_db_config_paths do
      Rake::Task["db:drop"].invoke
    end

    task create: :set_custom_db_config_paths do
      Rake::Task["db:create"].invoke
    end

    task migrate: :set_custom_db_config_paths do
      Rake::Task["db:migrate"].invoke
    end

    task rollback: :set_custom_db_config_paths do
      Rake::Task["db:rollback"].invoke
    end

    task reset: :set_custom_db_config_paths do
      Rake::Task['db:drop'].invoke
      Rake::Task['db:create'].invoke
      Rake::Task['db:migrate'].invoke
    end

    task seed: :set_custom_db_config_paths do
      Rake::Task["db:seed"].invoke
    end

    task version: :set_custom_db_config_paths do
      Rake::Task["db:version"].invoke
    end

    namespace :test do
      task prepare: :set_custom_db_config_paths do
        Rake::Task['db:drop'].invoke
        Rake::Task['db:create'].invoke
        Rake::Task['db:migrate'].invoke
      end
    end
  end

end
```

railsのルートに

- db_foo
- db_foo/migrate/.keep
- db_foo/schema.rb
- db_foo/seeds.rb

を配置します。
もともと `db` ディレクトリにあるファイル群と同じです。

それと `config/database_foo.yml` を配置します。これももともとある `database.yml` と同様のものです。

これでdb周りのタスクが別databaseに対して使えるようになります。

migrateしたい場合には

```
$ rake foo:db:migrate
```

となります。
Phalcon Model::find の結果を Ginq にする方法

※前提として、yield を使うので PHP5.5 以上であることが必要です

Phalcon の Resultset (Model::findの返却値) は多少の機能はありますが、ほぼORM機能を持ったクエリ結果カーソルの域を出ないので Ginq を使っています。

# Resultset → Ginq

変換するには Ginq::fromLazy と yield を使います。

```php
$rs = BlogEntries::find();
$entries = Ginq::fromLazy(function() use (&$rs) {
	foreach ($rs as $item) {
		yield $item;
	}
});

// 一日の中で PV 数が最上位のブログ記事を取得
$entries = $entries
	->groupBy(['e'=>'e.getDate()'])
	->select(function(GroupingGinq $g) {
		return $g->max(['e'=>'e.getPV()']);
	});

// 出力（これを View でやる）
foreach ($entries as $date => $entry) {
	echo $date . ":" . $entry->getTitle();
}
```

本来 Resultset はイテレータなので、そのまま `Ginq::from(BlogEntries::find())` と書いても動くはずなのですが、なぜか要素がところどころ抜け落ちたりしました。
原因は不明ですが yield を使うことで極限まで抽象化できるので Ginq::fromLazy で解決できます。

# find の返却値自体を Ginq にしちゃう

継承する中間クラスとして ModelBase クラスを定義し、find メソッドをオーバーライドします。

```php
use Ginq\Ginq;
use Phalcon\Mvc\Model;

class ModelBase extends Model {
	
	/**
	 * @param array $parameters
	 * @return static[]|Ginq
	 */
	public static function find($parameters = null) {
		$rs = parent::find($parameters);
		return Ginq::fromLazy(function() use (&$rs) {
			foreach ($rs as $item) {
				yield $item;
			}
		});
	}
	
} 
```

すべての Model で ModelBase を継承するだけで、find の結果が Ginq に統一されます。
思い切ったやりかたではありますが、中途半端に Ginq を使い分けるよりもコーディングポリシーを統一できるので、私は実際のプロダクトを一気にリファクタリングしました。

# 注意が必要なところ

いまのところ、この方法を使う上で以下の点に気を付ける必要があります。

## count($entries) ではなく $entries->count()

`count($entries)` では正しく数量が計算できませんでした。
Ginq の count メソッドを使って `$entries->count()` と記述する必要があります。

## Volt テンプレートエンジンの for 文の特殊変数が機能しない

Volt のループ構文では[ループコンテキスト](http://docs.phalconphp.com/ja/latest/reference/volt.html#id9)という特殊変数が使えますが、このうち

- `loop.first`
- `loop.last`
- `loop.length`

などは使用できませんでした。もちろん `$entries->toList()` でプリミティブの配列にすれば使えます。

```html
{% for entry in entries.toList() %}
	{{ loop.last }}
{% endfor %}
```

このへんは責任が持てませんので、各自で検証してください。

---

暇があったら[ページネータ](http://docs.phalconphp.com/ja/latest/reference/pagination.html)の GinqAdapter を書こうと思ってます。
io.jsのgit版でネイティブモジュールのビルドを通す

まずnode-gypのコードを書き換えます。

`git clone https://github.com/TooTallNate/node-gyp`

> lib/install.js

```diff
@@ -279,7 +279,9 @@ function install (gyp, argv, callback) {

         // download SHASUMS.txt
         async++
-        downloadShasums(deref)
+        //downloadShasums(deref)
+        cb();
+        return;

         if (async === 0) {
           // no async tasks required
```

チェックサムでnodejs.orgのホストへ見に行ってしまうので無視するようにします。

```js
@@ -219,11 +219,11 @@ function install (gyp, argv, callback) {

       // download the tarball, gunzip and extract!

-      if (tarPath) {
-        var input = fs.createReadStream(tarballUrl)
-        input.pipe(gunzip).pipe(extracter)
-        return
-      }
+      //if (tarPath) {
+      //  var input = fs.createReadStream(tarballUrl)
+      //  input.pipe(gunzip).pipe(extracter)
+      //  return
+      //}

       var req = download(tarballUrl)
       if (!req) return
```

コンパイルにV8のヘッダを使ったりするのでio.jsのソースコードをダウンロードする処理があります。
引数で`--tarball`を渡すと強制でローカルパスから読み込んでしまうのでリモートからダウンロードしてもらうようにします。

```
./bin/node-gyp.js install --tarball="https://github.com/iojs/io.js/archive/master.tar.gz"

gyp info it worked if it ends with ok
gyp info using node-gyp@1.0.3
gyp info using node@2.0.0 | darwin | x64
gyp http GET https://github.com/iojs/io.js/archive/master.tar.gz
gyp http 200 https://github.com/iojs/io.js/archive/master.tar.gz
2.0.0
gyp info ok
```

`node-gyp list` で`2.0.0`が見えるようになります

```
./bin/node-gyp.js list
# ...
1.6.2
1.8.1
2.0.0
```

実体は `~/.node-gyp` ディレクトリ以下です

## 注意 (1)

`npm install -g node-gyp`してしまうとio.jsに対応していないnode-gypコマンドがパスに追加されてしまいます。
`which node-gyp`しても出てきませんが実は`npm install`時に`~/.nvm/versions/io.js/v2.0.0/lib/node_modules/npm/bin/node-gyp-bin/node-gyp`が透過的に使用されています。

## 注意 (2)

リリース版とV8のバージョンがことなるので(`deps/v8/include/v8-version` で確認できる)いくつかのモジュールでネイティブコードを修正しないとコンパイルできなくなります。

`cp -a ~/.node-gyp/1.8.1 ~/.node-gyp/2.0.0` でリリースバージョンを流用してしまうとか、
`node-gyp rebuild --target="v1.8.1"`でファイルセットを指定してしまうとかで回避できました。
exercism 演習ダウンロード

演習問題install
めっちゃでたー！

```
[root@entaku19890818 exercises]# exercism configure --key=%APIを書く% --dir=%パスを書く%                                                                                     
The configuration has been written to /root/.exercism.json
Your exercism directory can be found at /root/exercises
[root@entaku19890818 exercises]# ll
合計 0
[root@entaku19890818 exercises]# exercism fetch 

Not Submitted:            23 problems
clojure (Bob)             /root/exercises/clojure/bob
coffeescript (Bob)        /root/exercises/coffeescript/bob
cpp (Bob)                 /root/exercises/cpp/bob
csharp (Leap)             /root/exercises/csharp/leap
elixir (Bob)              /root/exercises/elixir/bob
erlang (Leap)             /root/exercises/erlang/leap
fsharp (Sum Of Multiples) /root/exercises/fsharp/sum-of-multiples
go (Leap)                 /root/exercises/go/leap
haskell (Leap)            /root/exercises/haskell/leap
java (Etl)                /root/exercises/java/etl
javascript (Bob)          /root/exercises/javascript/bob
lisp (Point Mutations)    /root/exercises/lisp/point-mutations
lua (Hamming)             /root/exercises/lua/hamming
objective-c (Bob)         /root/exercises/objective-c/bob
ocaml (Bob)               /root/exercises/ocaml/bob
perl5 (Bob)               /root/exercises/perl5/bob
php (Hamming)             /root/exercises/php/hamming
plsql (Hamming)           /root/exercises/plsql/hamming
python (Bob)              /root/exercises/python/bob
ruby (Hamming)            /root/exercises/ruby/hamming
scala (Bob)               /root/exercises/scala/bob
scheme (Point Mutations)  /root/exercises/scheme/point-mutations
swift (Leap)              /root/exercises/swift/leap

New:                      23 problems
clojure (Bob)             /root/exercises/clojure/bob
coffeescript (Bob)        /root/exercises/coffeescript/bob
cpp (Bob)                 /root/exercises/cpp/bob
csharp (Leap)             /root/exercises/csharp/leap
elixir (Bob)              /root/exercises/elixir/bob
erlang (Leap)             /root/exercises/erlang/leap
fsharp (Sum Of Multiples) /root/exercises/fsharp/sum-of-multiples
go (Leap)                 /root/exercises/go/leap
haskell (Leap)            /root/exercises/haskell/leap
java (Etl)                /root/exercises/java/etl
javascript (Bob)          /root/exercises/javascript/bob
lisp (Point Mutations)    /root/exercises/lisp/point-mutations
lua (Hamming)             /root/exercises/lua/hamming
objective-c (Bob)         /root/exercises/objective-c/bob
ocaml (Bob)               /root/exercises/ocaml/bob
perl5 (Bob)               /root/exercises/perl5/bob
php (Hamming)             /root/exercises/php/hamming
plsql (Hamming)           /root/exercises/plsql/hamming
python (Bob)              /root/exercises/python/bob
ruby (Hamming)            /root/exercises/ruby/hamming
scala (Bob)               /root/exercises/scala/bob
scheme (Point Mutations)  /root/exercises/scheme/point-mutations
swift (Leap)              /root/exercises/swift/leap

unchanged: 0, updated: 0, new: 23
```
Ubuntuでsudoできなくなった

Ubuntu といえば sudo 
sudo といえば Ubuntu 
そんなことはないですが。。。

自分のミスでsudoできなくなって超焦ったのでメモ  

#どうしてなったのか  
```usermod -G [グループ] [ユーザ]```
をしくじった。  
usermodの-Gオプションがグループを上書きすることに気づかなかった  

#どうやって戻したのか
##焦らず確認
1. リカバリモードで起動(rootプロンプトに入る)  
2. ```/etc/group-```に前の設定があるようだったので確認、メモ  

##再設定  
1. ```usermod -G [グループ1,グループ2,グループ3...] [ユーザ]```  
2. ```reboot```

いろいろゴニョゴニョやってしまったり複数回usermodしてしまった場合は僕にはもうわかりません、南無三かもしれません。

詳しい人にきいてください。
では。
ActiveRecordでグループ中の特定のカラムに着目してレコードを選択する


「男女別で最年長のユーザを選びたい」など、グループ化した際にどのレコードを選ぶのかを特定のカラムにより決めたいことが時々ある。

たとえば以下の`users`テーブルで男女ごとに最年長の人を選ぶ時、次のように書く。

|id|name|age|sex|
|:--|:---|:--|:--|
|1|suzuki|20|male|
|2|sato|25|male|
|3|tanaka|35|female|
|4|hayashi|30|female|


```ruby
# sexカラムのグループ中で最大のageを持つレコードのidを収集する
sql = 'select id from users as m where age = (select max(age) from users as s where m.sex = s.sex);'
user_ids = User.find_by_sql(sql).map(&:id)
# User Load (0.5ms)  select id from users as m where age = (select max(age) from users as s where m.sex = s.sex);
# => [2, 3]

users = User.where(id: user_ids)
# User Load (0.2ms)  SELECT "users".* FROM "users"  WHERE "users"."id" IN (2, 3)
# => #<ActiveRecord::Relation [
#      #<User id: 2, name: "sato", age: 25, sex: "male", created_at: "2015-05-01 10:27:54", updated_at: "2015-05-01 10:27:54">,
#      #<User id: 3, name: "tanaka", age: 35, sex: "female", created_at: "2015-05-01 10:28:04", updated_at: "2015-05-01 10:28:04">
#    ]>
```

## 余談
この方法を見つけるまで同じような問題に対して次のコードのように`order`と`group`で取り組んでいたが、この方法では上手くできない。

```ruby
User.order('age desc').group(:sex)
```

そのため、これまでは`order`でソートだけ行って同じグループのレコードを繰り返し表示しないように制御するというグダグダな方法をとっていた。

調べたところSQLによる解決方法を紹介しているページはいくつか見つかったが、ActiveRecordの例は見つからなかったのでここに書いてみた。
もっとスマートな方法を知っている人がいれば、ぜひ教えてほしい:)


## 参考記事
- [同一グループの中で最大のレコードを取得する SQL を書く - TIM Labs](http://labs.timedia.co.jp/2014/10/selecting-max-record-in-group-by.html)
gulp.js 設定メモ


TypeScriptとSass環境の備忘録

##まずはセットアップ
```bash:ターミナル
$ npm install -g gulp # 初回インストール時のみ
------------------------------------------
$ npm init
$ npm install --save-dev gulp
$ npm install --save-dev gulp-sass
$ npm install --save-dev gulp-typescript
$ npm install --save-dev gulp-concat
$ npm install --save-dev gulp-sourcemaps

```




```javascript:gulpfile.js
var gulp    = require("gulp");
var sass    = require("gulp-sass");
var ts      = require("gulp-typescript");
var concat  = require("gulp-concat");
var sourcemaps = require("gulp-sourcemaps");

// Sass
gulp.task('sass', function() {
    gulp.src('./sass/**/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('./public/css'));
});

// TypeScript
gulp.task('ts', function () {
    var tsResult = gulp.src('./ts/**/*.ts')
        .pipe(sourcemaps.init())
        .pipe(ts({
            out   : 'main.js',
            target: 'ES6',
            removeComments: true
        }))

    return tsResult.js
        .pipe(sourcemaps.write())
        .pipe(gulp.dest('./public/js'));
})


// 監視モード
gulp.task('watch', function(){
    gulp.watch(["./sass/*.scss", './ts/**/*.ts'], ["sass", 'ts']);
});

 // デフォルトの場合、ts,sassを起動して、監視モードに移行
gulp.task('default', ['ts','sass','watch']);
```



## 最後にgulp起動
```bash:ターミナル
$ gulp
```
libcurl で FTP通信

需要があるか不明だが、調査したのでポスト。

## FTP GET
以下のコードでFTP GETできる。
なお、CURLOPT_URLに与えたパスがディレクトリの場合、ディレクトリの内容が表示される。

```cpp
CURLcode curl_code;
CURL *curl = curl_easy_init();
if (curl == NULL) {
    // エラー
}

// 取得したファイルデータを格納するファイルハンドルをオープン
// 後続のcurl_easy_perform が終了するまでオープンしておく。
FILE *out = fopen("outputfile.txt", "w");

// 取得元のURL を指定する　ftp://ftpuser:ftppasswd@localhost/path でも可。
curl_code = curl_easy_setopt(curl, CURLOPT_URL, "ftp://localhost/path");
// エラー処理は省略

curl_code = curl_easy_setopt(curl, CURLOPT_USERNAME, "ftpuser");
curl_code = curl_easy_setopt(curl, CURLOPT_PASSWORD, "ftppasswd");

// 出力先のファイルハンドルを指定する
curl_code = curl_easy_setopt(curl, CURLOPT_FILE, out);

// テキストモードでファイル取得したい場合は、以下を指定する。
// デフォルトでは、バイナリモードで転送される。
curl_code = curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1);

curl_code = curl_easy_perform(curl);
if (curl_code != CURLE_OK) {
    // curl_easy_strerror(curl) でエラー文字列が取得できる。
    fprintf(stderr, "FTP GET failed: %s\n", curl_easy_strerror(curl_code));
} else {
    fprintf(stderr, "FTP GET OK\n")
}

if (fclose(out) == EOF) {
    // エラー。
}

// CURLハンドルをクローズする。
curl_easy_cleanup(curl);

```

## FTP PUT
GETとの違いは、以下の通り。

  -  CURLOPT_URLにアップロードするパスをファイル名込みで指定する。
  -  CURLOPT_FILE ではなく、CURLOPT_INFILE に送信するファイルのハンドルを指定する。
  -  CURLOPT_UPLOAD に 1 を設定する。

## FTP LIST
前述のとおり、GET のソースコードでディレクトリの一覧は表示できる。ファイル名だけ取得する場合は、CURLOPT_FTPLISTONLY に 1 を設定する。
CURLOPT_FILEで指定したファイルに、ディレクトリのエントリが１ファイルにつき１行出力される。

## 転送状況の表示
CURLPOT_NOPROGRESS に 0 を設定する。

CURLOPT_PROGRESSFUNCTION に コールバック関数を指定する。（オプション）
指定する関数は以下のシグネチャのとおり。

```cpp
int progress_callback(
    void *userptr,   // CURLPOT_PROGRESSDATA に指定したポインタ
    double dltotal,  // ダウンロードするバイト数
    double dlnow,    // ダウンロードした累計バイト数
    double uptotal,  // アップロードするバイト数
    double upnow);   // アップロードした累計バイト数
```

CURLOPT_PROGRESSDATA　にコールバック関数の第一引数に渡すデータのポインタを指定する。（オプション）

CURLPOT_INFILESIZE にアップロードするファイルサイズを指定する。（PUT時のオプション）指定しない場合は、コールバック関数のuptotalには-1が設定される。

## FTPコマンドの表示

CURLPOT_VERBOSE に 1 を設定すると、FTPコマンドのやり取りが出力される。
デフォルトでは標準エラー出力に出力されるが、CURLOPT_STDERR に出力先のファイルハンドルを指定できる。
【PHP】【CakePHP】foreach対象の配列チェックを省くtips


foreach対象が配列でない場合、Warningが出力される。


配列チェックを入れてもいいが、arrayキャストするとチェック処理を省くことができる。
※nullは要素0の配列となり、文字列などは要素一つの配列となるため。

```php
$user_list = null;

//対象がnullだとWarningが出力される。
foreach($user_list as $user){
    
}

//配列チェックを行う場合
if(in_array($user_list)){
  foreach($user_list as $user){
    
  }
}

//キャストすることでチェックを省くことができる
foreach((array)$user_list as $user){
    
}
```

##例えばどこで使うか
CakePHPでpostされた値を取得する場合、値がなければnullが返る。
postされた値でforeacchするとき、arrayキャストすればチェック処理を省略できる。

````php
$user_list = $this->request->data('user_list');

foreach((array)$user_list as $user){
    
}

```

参考：[PHPのforeach文でnullチェックなしでエラー回避](http://quartet-communications.com/info/topics/7094)
unity5.0で特定アセットバンドルのみをビルドする

アセットバンドルの名前にルールがあれば、以下の方法で特定アセットバンドルのみをビルドできます。
例えば"test"が含まれるアセットバンドルをビルドする場合。

			string outputPath = "Android/";
			if (!Directory.Exists(outputPath))
				Directory.CreateDirectory(outputPath);
			string[] allAssetBundleNames = AssetDatabase.GetAllAssetBundleNames();
			List<AssetBundleBuild> buildList = new List<AssetBundleBuild>();
			foreach(var abname in allAssetBundleNames){
				if (abname.Contains("test")==false) continue;//アセットバンドル名からビルドが必要かを判断する
				var newBuild = new AssetBundleBuild();
				newBuild.assetNames = AssetDatabase.GetAssetPathsFromAssetBundle(abname);
				newBuild.assetBundleName = abname;
				buildList.Add(newBuild);
			}
			BuildPipeline.BuildAssetBundles(outputPath, buildList.ToArray(), 0, EditorUserBuildSettings.activeBuildTarget); 

AssetDatabase.GetAllAssetBundleNamesで全アセットバンドル名をリストアップできるので、それを元にAssetBundleBuildを作れば、欲しいアセットバンドルをビルドできます。
Ruby - lotus new の使い方まとめ

# lotus new の使い方まとめ
## lotus new ディレクトリ名
`lotus new myapp`と打つと、カレントディレクトリに`myapp`というディレクトリを生成し、その下にアプリケーションを置く。
ディレクトリが先にある場合は

```
cd myapp
lotus new .
```
とかやればおｋ

ちなみにこのコマンドは省略形もあり、`lotus n myapp`でも行ける。

## DB指定してnewする場合(-d オプション)
`lotus n myapp -d mysql2`
`lotus n myapp -d pg`
などで指定する。デフォルト状態だとファイルシステムになるので注意。

## テストフレームワークを指定する場合(--test オプション)
`lotus n myapp --test=rspec`
`lotus n myapp --test=minitest`

今のところ、この2つが指定できる。
デフォルトは`minitest`。ちなみに`capybara`はどちらの指定でも勝手に入ってくる。

## アーキテクチャを指定する場合(--architecture オプション)
`lotus n myapp --architecture=container`
※デフォルト`container`
正直なところ、現段階では指定する必要がない。
これから増えていくようなのでそれをお楽しみにという感じ。
https://github.com/lotus/lotus#architectures

## アプリケーション名を指定する場合(--application オプション)
`lotus n myapp --application=bookshop`
と指定すると`myapp/apps/bookshop/`にアプリケーションを置いてくれる。
デフォルトは`web`

## アプリケーションのベースURLを指定する場合(--application-base-url オプション)
`lotus n myapp --application-base-url=bord`

```rb
#apps/web/config/routes.rb
get '/', to: 'home#index'
```
などとすると
http://localhost:2300/bord でアクセスできるようになる

## アプリケーションを指定したディレクトリに生成する場合
`/home/username/public_html/exampleapp`というディレクトリがある場合
`lotus n myapp --path=/home/username/public_html/exampleapp`
を実行すると``/home/username/public_html/exampleapp`配下にアプリケーションが生成される。

## Lotusのコンポーネントを全部インストールするか(--lotus-head, --no-lotus-head)
`lotus n myapp --lotus-head`
コンポーネントを全部インストールする
`lotus n myapp --no-lotus-head`※デフォルト
`lotusrb`と`lotus-model`をインストールする

参考: https://github.com/lotus/lotus/blob/master/lib%2Flotus%2Fgenerators%2Fapplication%2Fcontainer%2FGemfile.tt
seed_dumpを使ってseed用のデータを簡単に書き出す

# 悩ましいseed用データ作り

`db/seeds.rb`で利用するデータは大別すると以下の２つに分かれるかと思います。

- マスタデータ（例：国名、首都、都道府県、市区町村など）
- 環境別の初期データ（例：開発環境の登録済みユーザアカウントなど）

これらのうち、マスタデータについてはそれほど問題はないのですが、登録済みのユーザアカウントとなるとユーザーテーブルと関連するテーブルが増えるほど作成が面倒になってきます。これを解決するためにdevelopment環境でもFactoryGirlを使ってテスト用のデータを読み込むという手を使うこともできるのですが、FactoryGirlをdevelopmentで使うのを避けたいという人はいるでしょう。

## seed_dumpを使ってデータベースの中身をダンプする

そこで活躍するのが[seed_dump](https://github.com/rroblak/seed_dump)です。このgemはデータベースにあるデータを`db/seeds.rb`でそのまま使えるコードとしてdumpしてくれます。`db:seed:dump`というrake taskを呼ぶことでデータをダンプしてくれるのですが、デフォルトだと**その時点でデータベースに入っているデータで`db/seeds.rb`を上書きする**というワイルドな動作をするので環境変数でオプション指定するほうがいいでしょう。書き出し先ファイルは`FILE`で指定できます。

```rb
rake db:seed:dump FILE=tmp/users.rb
```

他にも`MODELS`,`LIMIT`などのオプションがあるので、READMEを参照してください。

## 開発環境用の初期ユーザデータをテストデータベースから取り出す

アプリケーションの開発が進んでくると、往々にしてseeds.rbのデータが古くなってきます。新たなメンバーがプロジェクトに入ったり、なんらかの理由でデータベースをリセットしない限りこの問題は気づかれないことが多いです。seeds.rbのデータのうち、特に登録済みユーザのデータが正しく登録できないと開発環境で操作することができないということになります。

このような場合、他の開発者が持っている開発用データベースから必要なテーブルだけdumpしてseeds.rbを更新するという手もありますが、テストが書かれていればテスト用データベースからデータをダンプするという手があります。この方法であれば、（作業をした時点では）実質的にFactoryGirlをseeds.rbに入れるのと同じことになります。

やり方は簡単で、

- seed_dumpをテストでも使えるようにしておく（Gemfileでgroup :development, :testに入れておく）
- ユーザ登録用のエンド・ツー・エンドテストでユーザ登録が完了したタイミングで`pry`などを用いてテストの実行を止める。
- `RAILS_ENV=test rake db:seed:dump FILE=tmp/test_data.rb`のようにしてテストデータをダンプする。

のようにして行えます。この方法はシードデータを作るときだけでなく、テストの任意の時点で「どういうデータ構成になっているんだ？？」というときにも便利かもしれません。SQLをダンプするよりはRubyで表現されているほうがわかりやすいでしょう。