OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsでディレクトリーを指定して大量に処理するには

ディレクトリ配下にあるファイルを処理する処理が非同期処理でかつ時間とメモリを多く使う場合、何も考えないと、メモリが不足する。

同時に実行する処理の数を制限することで、これを解消する。

最近はあまりいい評判を聞かないがasync.jsを使うと以下の様に簡単に書くことが出来る。

```js
var async = require('async');

var q = async.queue(function(path, callback) {
    hoge(path, callback);
}, 10 // 同時実行数);

q.drain = function() {
    console.log('all items have been processed but writting files maybe..');
}

function hoge(path,callback) {
    console.log("hoge start",path);
    // 本来は時間が掛る処理
    // コールバックを呼ぶのが重要。
    // これが無いとasyncライブラリが、処理の終了を検出できない模様。　　
    setTimeout(callback,2000);
}

function
dirWalk(dir) {
    fs.readdir(dir, function(err, files) {
        for (var i = 0; i < files.length; i++) {
            //ファイルがディレクトリだったら再帰処理
            if (fs.statSync(dir + "/" + files[i]).isDirectory()) {
                dirWalk(dir + "/" + files[i]);
            } else {
                // 通常ファイルの場合、キューに登録
                q.push(dir + "/" + files[i], function(err) {});
            }
        }
    });
}
```

# まとめ

そもそも、Node.jsにこういう処理をさせるのもどうなのかというのもあるが、
やろうと思えば、自前で一からやらずとも、ライブラリを探してくれば
そこそこ簡単にできることがわかった。

# 関連投稿

- [IFTTTで連携したDropboxの英語ぽい日付入りのファイル名をNode.jsで扱う - Qiita](https://qiita.com/kjunichi/items/817211723d0c905eed9e)

# 関連記事

- [以前やったNode.jsで顔検出を改良した](http://abrakatabura.hatenablog.com/entry/2014/11/09/124922)
[XML] 空要素の属性でMapをつくる方法

## やりたいこと
下記のようなxmlをパースしてMapを作りたい。

```xml
<?xml version="1.0" encoding="utf-8"?>
<config>
  <map name="aaa">
    <entry key="1" value="a"/>
    <entry key="2" value="b"/>
    <entry key="3" value="c"/>
    <entry key="4" value="d"/>
    <entry key="5" value="e"/>
  </map>

  <map name="bbb">
    <entry key="1" value="ee"/>
    <entry key="2" value="ff"/>
    <entry key="3" value="gg"/>
    <entry key="4" value="hh"/>
  </map>

  <map name="ccc">
    <entry key="1" value="iii"/>
    <entry key="2" value="jjj"/>
    <entry key="3" value="kkk"/>
    <entry key="4" value="lll"/>
  </map>  
</config>
```

## やってみたこと

### XPathを使う。

```java
public class Main {
	public static void main(String[] args) throws Exception {
		File f = new File("./res/sample.xml");
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.parse(f);
		XPathFactory xPathfactory = XPathFactory.newInstance();
		XPath xpath = xPathfactory.newXPath();
		XPathExpression expr = xpath.compile("/config/map[@name=\"aaa\"]/entry");
		NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
		for (int i = 0; i < nl.getLength(); i++) {
			Element element = (Element) nl.item(i);
			System.out.println(element.getAttribute("key") + ":" + element.getAttribute("value"));
			// Mapを用意しておいて値をセットしていけばいい。
		}
	}
}
```

[参考: How to get specific XML elements with specific attribute value?](http://stackoverflow.com/questions/8445408/how-to-get-specific-xml-elements-with-specific-attribute-value)

### Simpleを使う。
[Simple](http://simple.sourceforge.net/home.php)というライブラリを使っているのでこれを使ってもっとさくっと簡単に同じようなことをやりたいのだけどわからない。うーん。
Unity 2D 画面タッチでカメラ移動する

Unityでタッチ判定を使って画面を横に移動する機能を作ってみた。
*3Dではなく2Dでの画面移動です

OS: Mac OSX 10.9.5
Unity ver: 4.5.0f6
言語: C#

ツールやアセットを一切使わずに作成しました。（何らかのツールで簡単にできるよ！というのがありましたらご教示願います）

```code
public class GeneralFuncController : MonoBehaviour {

	private bool scrollStartFlg = false; // スクロールが始まったかのフラグ
	private Vector2 scrollStartPos	=	new Vector2(); // スクロールの起点となるタッチポジション
	private static float SCROLL_END_LEFT = -15f; // 左側への移動制限(これ以上左には進まない)
	private static float SCROLL_END_RIGHT = 15f; // 右側への移動制限(これ以上右には進まない)
	private static float SCROLL_DISTANCE_CORRECTION = 0.8f; // スクロール距離の調整

	private Vector2 touchPosition	=	new Vector2(); // タッチポジション初期化
	private Collider2D collide2dObj	=	null; // タッチ位置にあるオブジェクトの初期化

	// Use this for initialization
	void Start () {

	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButton(0)) {

			touchPosition   = Camera.main.ScreenToWorldPoint(Input.mousePosition);
			collide2dObj = Physics2D.OverlapPoint(touchPosition);
			
			if (scrollStartFlg == false && collide2dObj) {
                // タッチ位置にオブジェクトがあったらそのオブジェクトを取得する
　　　　　　　　　 // スクロール移動とオブジェクトタッチの処理を区別するために記載しました
				GameObject obj = collide2dObj.transform.gameObject;
				Debug.Log(obj.name);
			}else{
　　　　　　　　　 // タッチした場所に何もない場合、スクロールフラグをtrueに
				scrollStartFlg = true;
				if(scrollStartPos.x == 0.0f){
　　　　　　　　       // スクロール開始位置を取得
					scrollStartPos   = Camera.main.ScreenToWorldPoint(Input.mousePosition);
				}else{
					Vector2 touchMovePos	=	touchPosition;
					if(scrollStartPos.x != touchMovePos.x){
						// 直前のタッチ位置との差を取得する
						float diffPos	=	SCROLL_DISTANCE_CORRECTION * (touchMovePos.x - scrollStartPos.x);

						Vector2 pos = this.transform.position;
						pos.x -= diffPos;
                        // スクロールが制限を超過する場合、処理を止める
						if(pos.x > SCROLL_END_RIGHT || pos.x < SCROLL_END_LEFT){
							return;
						}
						this.transform.position = pos;
						scrollStartPos = touchMovePos;
					}
				}
			}
		}else{
            // タッチを離したらフラグを落とし、スクロール開始位置も初期化する 
			scrollStartFlg	=	false;
			scrollStartPos	=	new Vector2();
		}
	}
}
```

上記スクリプトをシーンのCameraにひもづけるだけで使用可能になります。
IDEA, WebStromで選択したテキストをタグで包む


ST使ってた時に重宝してた Wrap Selection With Tag を使いたくて調べたというか嘆いたらぐらぷすさんが教えてくれたのでみんな使うと良いよ。


## これを
![sorroundEmmet1.png](https://qiita-image-store.s3.amazonaws.com/0/6586/c8f552c4-186e-bf1b-bcfb-a237f9b5674f.png "sorroundEmmet1.png")

## こうしたい
![sorroundEmmet5.png](https://qiita-image-store.s3.amazonaws.com/0/6586/bd3fb363-583e-0f60-3cec-7629543c357c.png "sorroundEmmet5.png")


## 手順

### 選択する 
![sorroundEmmet2.png](https://qiita-image-store.s3.amazonaws.com/0/6586/1b1b0df9-49cb-8002-72e6-77c8ead542ec.png "sorroundEmmet2.png")

### `Cmd` + `Alt` + `j`(Surround with live template)
 ![sorroundEmmet3.png](https://qiita-image-store.s3.amazonaws.com/0/6586/94ff3e52-1cc9-51d9-2c0b-17a000dbe483.png "sorroundEmmet3.png")

### タグを指定（ここではEmmetを使う）
![sorroundEmmet4.png](https://qiita-image-store.s3.amazonaws.com/0/6586/58658216-8161-8b0d-dbbe-e3cb34fdde88.png "sorroundEmmet4.png")


## 完成！！
![sorroundEmmet5.png](https://qiita-image-store.s3.amazonaws.com/0/6586/bbc93ba3-0e46-e245-4cb9-1a30ed7d1c66.png "sorroundEmmet5.png")


## おまけ
この手順でも何だかんだでショートカット押してEmmet選択してタイプして、ってちょっと面倒だから以下に省略したい


- テキスト選択
- ショートカット
- タグ入力

なので、そもそものEmmetの機能にショートカットを追加する

### 設定画面でキーワード入力( `cmd` + `,` -> [surround])
![keymap1.png](https://qiita-image-store.s3.amazonaws.com/0/6586/071972f8-36d2-4a40-c4ea-c5e9df4863ce.png "keymap1.png")


### キーボードショートカット追加
![keymap2.png](https://qiita-image-store.s3.amazonaws.com/0/6586/61d761db-4767-adcf-5367-0458d846baff.png "keymap2.png")

### キーを決める
![keymap3.png](https://qiita-image-store.s3.amazonaws.com/0/6586/96bfb4ba-7921-7222-4854-de6382df8726.png "keymap3.png")
僕はSTで使ってた `Cmd` + `shift` + `w` にしてる

IDEA良いよIDEA。マルチセレクト以外ほぼIDEAで良い感じになってきてる気がする。
zlibを使ってNSDataに圧縮/展開機能を追加する

`NSData`と言えばバイト配列を扱うデータホルダー的なクラスです。
データホルダーなら、保持するデータを圧縮する機能があっても良いはず。
ということで`NSData`を拡張してzlib機能を追加してみましょう。

まずはインタフェース。

```objc:NSDataExt.h
#import <Foundation/Foundation.h>

@interface NSData (NSDataZlibExtension)
- (id)deflate:(int)compressionLevel;
- (id)inflate;
@end
```

そして実装です。

```objc:NSDataExt.m
#import "NSDataZlib.h"
#import <zlib.h>

@implementation NSData (NSDataZlibExtension)
- (z_stream)initialized_zStream {
  z_stream zStream;
  zStream.zalloc = Z_NULL;
  zStream.zfree = Z_NULL;
  zStream.opaque = Z_NULL;
  return zStream;
}

- (id)deflate:(int)compressionLevel {
  z_stream zStream = [self initialized_zStream];
  Bytef buffer[131072];
  deflateInit(&zStream, compressionLevel);
  zStream.next_in = (Bytef *)self.bytes;
  zStream.avail_in = (UInt)self.length;
  int retval = Z_OK;
  NSMutableData *ret = [NSMutableData dataWithCapacity:0];
  do {
    zStream.next_out = buffer;
    zStream.avail_out = sizeof(buffer);
    retval = deflate(&zStream, Z_FINISH);
    size_t length = sizeof(buffer) - zStream.avail_out;
    if (length > 0)
      [ret appendBytes:buffer length:length];
  } while (zStream.avail_out != sizeof(buffer));
  deflateEnd(&zStream);
  return ret;
}

- (id)inflate {
  z_stream zStream = [self initialized_zStream];
  Bytef buffer[131072];
  inflateInit(&zStream);
  zStream.next_in = (Bytef *)self.bytes;
  zStream.avail_in = (UInt)self.length;
  int retval = Z_OK;
  NSMutableData *ret = [NSMutableData dataWithCapacity:0];
  do {
    zStream.next_out = buffer;
    zStream.avail_out = sizeof(buffer);
    retval = inflate(&zStream, Z_FINISH);
    size_t length = sizeof(buffer) - zStream.avail_out;
    if (length > 0)
      [ret appendBytes:buffer length:length];
  } while (zStream.avail_out != sizeof(buffer));
  inflateEnd(&zStream);
  return ret;
}
@end
```
32bit float/16bit short表現のグレースケール画像を CGImage化する

OpenCVなどで様々な実験をしていると、32bit float/16bit shortで表現された画像を扱う機会も多くなりますね。
これを`cv::imageShow()`などを使わずに、Cocoaネイティブで扱いたい時のテクニックです。最後には`NSImage`のインスタンスを作成するので、これを`NSImageView`などに貼ればOK。

##32bit float
```objc
void *imageData = xxx;  //32bit float 表現のイメージバイト列
size_t width = xxx;     //イメージ幅
size_t height = xxx;    //イメージ高さ

NSColorSpace *cs = [NSColorSpace genericGrayColorSpace];
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8 * sizeof(float), width * sizeof(float), cs.CGColorSpace, kCGBitmapByteOrder32Host|kCGBitmapFloatComponents|kCGImageAlphaNone);
CGImageRef image = CGBitmapContextCreateImage(context);
NSImage *nsImage = [[NSImage alloc] initWithCGImage:image size:NSZeroSize];
CGContextRelease(context);
CGImageRelease(image);
```

##16bit short
同様に、16bit shortで表現された画像も扱うことができます。
ほとんど32bit floatの時と同じで、ちょっと引数が違うだけです。

```objc
void *imageData = xxx;  //16bit float 表現のイメージバイト列
size_t width = xxx;     //イメージ幅
size_t height = xxx;    //イメージ高さ

NSColorSpace *cs = [NSColorSpace genericGrayColorSpace];
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8 * sizeof(short), width * sizeof(short), cs.CGColorSpace, kCGBitmapByteOrder16Host|kCGImageAlphaNone);
CGImageRef image = CGBitmapContextCreateImage(context);
NSImage *nsImage = [[NSImage alloc] initWithCGImage:image size:NSZeroSize];
CGContextRelease(context);
CGImageRelease(image);
```
プロパティから自動でgetterとsetterを作成する

Spring Tool Suite（以下STS）でプロパティから自動的に「getter」と「setter」を作成する方法です。

以下のようにプロパティを作成したとします。

```
package パッケージ名;

public class FormData {

　private String input;

}
```

マウスでプロパティ名「input」を選択した状態にしてSTSメニューの[Source]-[Generate Getters and Setters...]を選択します。

![generateGetterSetter.png](https://qiita-image-store.s3.amazonaws.com/0/31735/24cd9ec3-cc3d-54d3-37a8-0a71dea383cf.png)

上記のようなウィンドウが開くのでOKを選択すると自動的に「getter」と「setter」が作成されます。

```
public class FormData {

　private String input;

　public String getInput() {

　　　return input;

　}

　public void setInput(String input) {

　　this.input = input;

　}

}
```
Spring Rooでアプリケーションを開発する

「Spring Tool Suite-3.6.2」（以下STSと記述します）で「Spring Roo」（以下Rooと記述します）でアプリケーションを開発する方法です。
書籍を読むと、STSに標準でRooが入っていたようですが、STS-v3.5からRooが標準から外されたようで、別途インストールする必要があるようです。

「STS」ではRooが最初からインストールされていないので、自分でインストールを行う必要があります。

(1)STSにRooをインストール

STSを起動し「Spring Dashboard」の「Help and Documentation」にある「Extensions」を押下するとインストールできるプラグインが表示されます。

![dashBoardHelp.png](https://qiita-image-store.s3.amazonaws.com/0/31735/ed8e9301-a83a-6b1c-8e96-d5348b749f0d.png)


Find：に「Roo」を入力し、Enterを押下すると検索が行われます。

表示されたリストから以下を選択してインストールします。
■ Spring Roo
■ Spring IDE - Roo Extention

![spring.png](https://qiita-image-store.s3.amazonaws.com/0/31735/f9b96145-f39a-afd6-7b9a-20e7ed39d6d6.png)


インストールが終了するとSTSの再起動を行うかのダイアログが表示されるので再起動を行うとSTSでRooが利用可能になります。

(2)Spring Rooプロジェクトの作成方法

STSを起動し[File]-[New]-[Other]からSpringを開き「Spring Roo Project」を選択します。

「Roo Shellビュー」の「roo > 」に「web mvc setup」を入力しEnterで実行します。
![rooShell.png](https://qiita-image-store.s3.amazonaws.com/0/31735/57516dc2-b9fa-e756-a732-122b939cdae6.png)

最後に「tc server」に追加するので、「Serverビュー」の「Pivotal tc Server Developer Edition v3.0」を右クリックし「Add and Remove...」を押下し、表示された画面で作成したRooプロジェクトを追加します。

(Serverビュー)
![tcServer.png](https://qiita-image-store.s3.amazonaws.com/0/31735/b367785d-27ef-a17f-7ae3-c546b97b75cb.png)

(Add and Remove...)
![tcServerAdd.png](https://qiita-image-store.s3.amazonaws.com/0/31735/7944d1d3-e8a6-a374-31b8-5700ce62d75f.png)

(Add and Remove...画面)
![tcServerAdd2.png](https://qiita-image-store.s3.amazonaws.com/0/31735/6b6ee8a2-9e5f-884a-5739-0425e59b0b39.png)
README に載っていない rust-peg の文法の詳細

[rust-peg](https://github.com/kevinmehall/rust-peg/) の文法について、 README に載っていない範囲のうちよく使うと思われるものについて補足する。

# README に書いてあること

- `.` - 任意の1文字にマッチ
- `"literal"` - リテラル文字列にマッチ
- `[A-Za-z]` - セット内の1文字にマッチ
- `[^A-Za-z]` - セットに含まれない1文字にマッチ
- `rule` - その名前で定義されたルールにマッチし、マッチした結果を返す
- `expr*` - 式の0回以上の繰り返しにマッチし、マッチした結果を `Vec` で返す
- `expr+` - 式の1回以上の繰り返しにマッチし、マッチした結果を `Vec` で返す
- `expr?` - 式の0回または1回の出現にマッチし、マッチした結果を `Option` で返す
- `&expr` - この位置で式にマッチすればマッチする。文字列を消費しない
- `!expr` - この位置で式にマッチしなければマッチする。文字列を消費しない
- `expr ** delim` - デリミタで区切られた式の0回以上の繰り返しにマッチし、マッチした結果を `Vec` で返す
- `expr ++ delim` - デリミタで区切られた式の1回以上の繰り返しにマッチし、マッチした結果を `Vec` で返す
- `e1 / e2 / e3` - 式1にマッチすればその結果を返す。マッチしなければ式2のマッチを試す
- `e1 e2 e3` - この順序で並んだ式にマッチする。最後の式の結果（ここでは `e3`）を返す
- `a:e1 b:e2 c:e3 { rust }` - この順で並んだ式にマッチする。マッチが成功したらブロックの中の rust 式または文を評価する。式にマッチした結果はコロン左側の文字列と同じ名前の変数でブロック内から参照できる。ブロックの返り値が式の結果となる

# README に書いてないこと
## カッコについて
式はカッコ `( )` でグルーピングできる。たとえば `(e1 e2)+` は「『e1 に続いて e2 にマッチする』が1回以上繰り返される」を表す。

## 結合強度について
`/` の結合強度はスペースより弱い。 `e1 e2 / e3 e4` は「『e1 に続いて e2 にマッチする』または『e3 に続いて e4 にマッチする』」を表す。

結合順を変えるにはカッコでグルーピングする。 `e1 (e2 / e3) e4` は「e1 に続いて『e2 または e3』にマッチし、続いて e4 にマッチする」を表す。

## 式の結果について
複数の式からなる式は、最後の式の結果が全体の結果となる。たとえば、 `i -> int`, `u -> uint`, `s -> String` なる3つのルールがあるとき、式 `i u s` の結果は `String` になる。

`/` で区切られた複数の式は、それぞれの節の結果の型が等しくなる必要がある。 `i s / u s` は、それぞれの節の結果が `String` となるので正しいが、 `i s / u s?` は左辺が `String` で右辺が `Option<String>` なので不正である。

結果の型をそろえるには、たとえば `i s:s { Some(s) } / u s?` のようにする。この式の型は `Option<String>` である。

## 返り値のないルールについて
「マッチした結果を返す」と書かれていないパターン（`.` や `[a-z]`） は返り値を持たない。このような式の型は `()` （ユニット）である。これらの式と返り値を持つ式を `/` で組み合わせるとき、全体の式の型を `()` としたければ、返り値を持つ式の後に `{ () }` を書くとよい。たとえば `r = [a-z] / [A-Z] [a-z]? { () }` とする。

## `{ }` について
`{ }` は任意の式の位置に出現することができる。また、 `{ }` の前の `a:e1` は必ずしも直前にある必要はなく、出現しなくてもよい。たとえば、これらは式として正しい：

- `{ 42 }`
- `e1 e2 { 42 } e3`
- `e1 a:e2 e3 { a }`

## 部分文字列の取得について
C の peg ライブラリでは、 `< e1 e2 > e3 { ... }` のようにアングルブラケットを使うと、ブロック内で `e1 e2` にマッチした部分文字列を参照できる。 

rust-peg では部分文字列を参照することはできない。部分文字列を取得するには、部分式をサブルールとしてくくり出し、マッチ全体を文字列として返すようにする：

```text
r -> String = a:e1_e2 e3 { a }

e1_e2 -> String = e1 e2 { match_str.to_string() }
```
fragmentManager.executePendingTransactionsで NullPointerExceptionが出た時の対応

##事象
fragmentManager.executePendingTransactions()を行うと、Null Pointer Exception(NPE)が発生する時があります。

自分の例では、DialogFragmentを使って、ローディング中のダイアログを出すような実装で、特定の画面のローディングでNPEが発生しました。

\#logcatの内容

```
11-09 08:20:04.206    2051-2051/com.hoge.hogeapp.alpha E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at android.app.BackStackRecord.run(BackStackRecord.java:656)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
            at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:474)
            at com.hoge.hogeapp.ui.LoadingDialogFragment.onStartUploading(LoadingDialogFragment.java:75)
```

\#エラーが出ていた箇所

```java

//LoadingDialogFragment.java

private final static String FRAGMENT_TAG = "loading";
public void onStartUploading(Activity activity, FragmentManager fragmentManager)     
{
        if (fragmentManager != null && activity.isCustomResumed()) {
            if (fragmentManager.findFragmentByTag(FRAGMENT_TAG) == null) {
                FragmentTransaction ft = fragmentManager.beginTransaction();
                ft.add(this, FRAGMENT_TAG);
                ft.commit();
                fragmentManager.executePendingTransactions();   //Null Pointer Exception が発生
            }
        }
    }
```

##原因
executePendingTransactions()の内部で、すでにremoveされているfragmentがremove,commitされようとして、remove(null)が起きていたことが原因です。これは、.remove(null)にかぎらず、.show(null) or .add(null), attach(null), .detach(null), .hide(null)で起きる可能性があります。


### executePendingTransactions()って何？
executePendingTransactions()はキューにたまったcommit()処理を即時で反映するためのメソッドです。
FragmentTransactionにより実行されたcommit()は非同期にメインスレッドでスケジューリングされ、実行されます。これだと、commit()したfragmentに対して何か処理を行おうとした場合、NPEが発生してしまいます。そこで、executePendingTransactions()を呼び、commit()を即時反映させます。

### executePendingTransactions()の注意点
executePendingTransactions()はキューにたまったfragmentのトランザクション処理を全て実行します。このメソッド実行以前に実行したremoveやshowといったトランザクションが全て実行されるわけです。
その時にすでにremoveされたfragmentがあると、当然NPEが発生します。

自分のケースでは、別メソッドですでにremoveしていたfragmentを再度removeしていたのが、executePendingTransactions()で即時処理されたためにこのタイミングでNPEが発生していました。全然関係ないアクティビティのところでremoveしていたので、デバッグに非常に時間がかかりました…。


##対応
executePendingTransactions()実行の前ですでにremoveしたfragmentに対してトランザクション処理(show, detach, hideなどなど)を実施していないか、確認する。

しかし、Fragment…管理しずらいよ…。


##参考：
http://stackoverflow.com/questions/13393693/android-fragmentmanager-backstackrecord-run-throwing-nullpointerexception
Android Studio + Scala メモ


# まずは環境構築

- Genymotion + Android Studio on Mac
http://qiita.com/Sam/items/8d551f575b617fa0be7e

- Scala と Android Studio の組み合わせを触ってみた
http://qiita.com/daneko0123/items/c255964a53bee9b15e00
build.sbt に以下を加える
``platformTarget in Android := "android-20"``

Android Studio で使う場合は ``$ android list targets`` に含まれるIDを確認して、``$ android update project --target <ID>`` としてIDEA用のファイルを生成する．

## その他
### sbtでビルドする
まず、SBTのプラグインをインストールしてから、
`run` -> `Edit Configurations...` -> `Android  Application` の `Before launch:` で、
`Gradle`を削除して`Run SBT Action 'android:package'`を追加する．

## ハマったところ
### パスにスペースが入っててうまくビルドできない．
結局、`AndroidStudio.app` にリネームした．

### こんなかんじのエラーでビルドできない．

```
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
        at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:501)
        at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:276)
        at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:490)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:167)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)
```
        
これはGradleを使うのやめて、`sbt`に変更して解決した．前述の 「sbtでビルドする」を参照．
昨日のハッカソンCakePHPまとめ


##データベース
画像ファイルをそのままDBに入れる時はblob型を使う。
MySQLだとこんな感じ。

```sql
img_file MEDIUMBLOB,
```


ミディアムで16MBまで入るとのことなので、普通はこれでいけそう。
Cakephpのモデルがどうなるのか全く未知だが、おそらくfreadかなんかしてそのまま渡すんだろう。

##ビュー




CSSとJSの読み込み方は以下の通り。

```php
echo $this->Html->css('bootstrap.min');
echo $this->Html->script('bootstrap.min');
```

フォームクリエイトに `enctype="multipart/form-data"` を付けたい時は以下のようにする。

```php
echo $this->Form->create('Emotion', array('type' => 'file'));
```

hiddenの場合。

```php
echo $this->Form->input('Emotion.img_file', array('type' => 'hidden', 'value' => ''));
```

DBの型がTEXT型だと自動でtexrareaになってくれるみたい。
以下は一見するとただのフォームだがtextareaになる。

```php
echo $this->Form->input('', array('class' => 'form-control', 'rows' => '3', 'placeholder' => '分析結果'));
```

##コントローラ

レイアウトを使わない時はコントローラに以下を書く。

```php
$this->layout = false;
```

そもそもビューを使わない時は

```php
$this->autoRender = false;
```

##モデル

SUMとか取る時の返り配列が[0]とかになっちゃうのを避ける方法。

```php
$this->virtualFields['sum'] = 0;
$options = array(
	'fields' => array('Emotion.my_emotion', 'SUM(Emotion.my_emotion_val) as Emotion__sum'),
    'group' => array('Emotion.my_emotion')
);
$result = $this->find('all', $options);
```

IS NOT NULL の書き方。

```php
$options = array(
	'conditions' => array('NOT' => array('Emotion.img_file' => null)),
);
```
1.7.1までViewModelだったのが1.7.2でPresenterになったFuelPHPの話をしよう

##何があったし

すごい今更感（1.7.2のリリースは2014年7月）ですけど、業務で使用してリリースした後はすっかりご無沙汰だったので気づけませんでした…。びっくりしすぎて思わず投稿してしまいました。てっきり1.8になったら ViewModel が廃止になるだけだとばかり思っていました。

GitHubのChangelogにこうありました。
[fuel/CHANGELOG.md at 1.7/master · fuel/fuel · GitHub](https://github.com/fuel/fuel/blob/1.7/master/CHANGELOG.md)

> As of 1.7.2, the Viewmodel class is deprecated, and replaced by the Presenter class. Functionality has remained largely the same, and a Viewmodel alias is present to maintain backward compatibility.

>It has proven difficult to explain what a Viewmodel is and does, and why you should use it. Also having a classes/view and a views folder was very confusing for a lot of people. It is also a step closer to Fuel v2, there this class is also called Presenter.

Google先生による翻訳を脚色すると

> 1.7.2では、ViewModel が廃止されて Presenter に置き換えられました。機能はほぼ同じで、ViewModel のエイリアスが下位互換性維持のために存在してます。

> ViewModel が「何」で「何をするか」、「なぜ使うのか」が説明困難であることが判明しました。また、classes/view と views フォルダがあることが多くの人を混乱させました。
ViewModel は Presenter とも呼ばれ、Fuel v2 でも同様です。

みたいです。脚色は適当です。

##何が変わったのか

Changelog にもありましたが、

これが
http://fuelphp.jp/docs/1.7/general/viewmodels.html
↓
こうじゃ
http://fuelphp.com/docs/general/presenters.html

**内容あんまり変わってないじゃん！！**

1.7.x 系のアップデートでそんなにバッチリ変えてくるとはさすがに思いませんでした（震
素直に 1.8.0 からの導入でいいのではなかったのか…。

（※本家サイトは古いバージョンのドキュメントがすぐ見つけられなかったので、とりあえず日本語訳版の1.7のドキュメントを引っ張っています）

##Presenterって何？

Google先生に問い合わせたところ下記のサイトを返してくれたのでざっと読んでみました。

[MVPVM 設計パターン - WPF 向けのモデル - ビュー - プレゼンター - ビューモデル設計パターン](http://msdn.microsoft.com/ja-jp/magazine/hh580734.aspx)
[T90 きっと怖くないmvvm & mvpvm](http://www.slideshare.net/akatukisiden/t90-mvvmmvpvm)
[一生涯プログラマ : FuelPHPのViewModelについて](http://blog.livedoor.jp/rapple_lab/archives/6534192.html)

MVVMパターン、MVPVMパターンなどの言葉がやたらと出てきましたが、読んでるとまるで Presenter は Controller みたいな動作をするもののような気がします。もちろん該当しない部分もありますが。

でも今回FuelPHPで置き換えられた Presenter は、そのまんま ViewModel という感じなので、なんとも違和感のあるアップデートです。今後役割が大きく変わってくるのでしょうか。「MVPVMパターンでいくからController消します＾＾」みたいな。業務が熱くなります…。

##今使ってる僕らはどうすればいいの

日本語ドキュメントにはすっきり書かれていました。
[ビューモデル - 概要 - FuelPHP ドキュメント](http://fuelphp.jp/docs/1.8/general/viewmodels.html)

Changelog にあった通り、エイリアスが用意されているようですので、1.7.1以前からのアップデートを検討している案件などではそれでしのぐか、将来性を考えてサクッと Presenter に置き換えるかだと思います。

置き換える場合は、View_Sample_Index を Presenter_Sample_Index にすればいいんでしょうか。でもクラス名をコマンドで一発置換するとか恐ろしいですね…。Grep&Replaceを手動でやるとなると、大きいプロジェクトは大変そうです。

##アップデートしなくていいやって？ダメです(｡◔｀◡◔+)ｂ

セキュリティ関連のアップデートがあります。特にクエリビルダに関するものが含まれているので、ちゃんとアップデートしませう。DBアクセスゼロなサービスはあまり無いと思うので…。

> Database

> A potentional vulnerability was discovered in the way column name quoting was done. This has been fixed. This means that coding SQL functions manually was something you could get away with earlier now require you to use DB::expr() to encapsulate the function.

```php

// old code, no longer works
$result = DB::select("LOWER \"field\")")->from($table)->execute();

// has to be replaced by
$result = DB::select(DB::Expr("LOWER \"field\")"))->from($table)->execute();

```

##最後に

僕は FuelPHP のコーディング標準が好きです。はい、全然関係ないです。
[Coding Standards - General - FuelPHP Documentation](http://fuelphp.com/docs/general/coding_standards.html)

お読みいただきありがとうございました！(日曜 AM 5:50 のテンションで)
ひらがなかカタカナなのか判定したい #golang


## ひらがなとカタカナの判定
`unicode`パッケージを眺めていたら、`Katakana`と`Hiragana`という変数を見つけた。
`*unicode.RangeTable`という型らしい。さらに`unicode.In`という関数を発見。

```
func In(r rune, ranges ...*RangeTable) bool
```

ほうほう。これはひらがなかカタカナか判定できるぞ。

http://play.golang.org/p/cKKSuzrn_F

```
package main

import (
	"fmt"
	"unicode"
)

func main() {
	for _, r := range "あいうえおアイウエオｱｲｳｴｵ" {
		fmt.Println(string(r), "is Hiragana", unicode.In(r, unicode.Hiragana))
		fmt.Println(string(r), "is Katakana", unicode.In(r, unicode.Katakana))
	}

}
```

## 判定じゃなくて変換がしたいんだ

判定するだけなんてあまり用途がない。
顧客や上司からデータは半角カナオンリーね。って言われたらどうするんだ。
かといって、ユーザに半角カナを入力させるなんてナンセンスだ。
我々はひらがなをカタカナに、全角カナを半角カナに変換したいんだ。

`strings`パッケージを眺めていると`ToLowerSpecial`という関数があった。

```
func ToLowerSpecial(_case unicode.SpecialCase, s string) string
```

第1引数に`unicode.SpecialCase`を取る。`unicode.SpecialCase`は`unicode.CaseRange`のスライスっぽい。
`unicode.CaseRange`は何なのかというと、

```
type CaseRange struct {
        Lo    uint32
        Hi    uint32
        Delta d
}
```

というやつだ。
`Lo`とか`Hi`は`unicode.RangeTable`の`R16`とか`R32`とかにあったやつだ。
可能性を感じる。

`unicode.d`ってなんだ。小文字だから外から使えないじゃないか。

```
type d [MaxCase]rune
```

おっ。

```
unicode.CaseRange{
			Lo:    ...,
			Hi:    ...,
			Delta: [unicode.MaxCase]rune{0, 0x131 - 0x49, 0},
}
```

こんな感じで、リテラルで指定すればよいか。
しかし、何書いたらいいのかよくわからない。

わからん。

今日はここまで。
分かったらまた書きます。
すいませんでした。
NSDでおてがるにDNSサーバをたちあげる

##NSDとは

[NSD](http://www.nlnetlabs.nl/projects/nsd/)はシンプルかつ高速なオープンソースのDNSコンテンツサーバです。
DNSサーバとしては[BIND](http://www.isc.org/downloads/bind/)が有名ですが、それに対してパフォーマンス、サイズ、設定の面で軽量なのが利点になります。

なお、DNSキャッシュサーバとしての機能はありませんが、同じ開発元による[Unbound](https://unbound.net/)が利用できます。

##目標と準備

###目標

IPv4に限定した、正引きと逆引きを行えるごく基礎的なDNSコンテンツサーバを立ち上げます。

###環境

さくらVPS + ArchLinux

###準備

ArchLinuxはインストール済みで、インターネットまわりの設定も終わっているものとします。
設定例ではドメインを *example.com* 、IPアドレスを *100.150.200.250* とします。

##インストールと設定

###インストール

```pacman -Sy nsd```

###NSDの設定

設定サンプルをコピーして使います。

```cp /etc/nsd/nsd.conf.sample /etc/nsd/nsd.conf```

```nano /etc/nsd.conf```

```
do-ip6: no

zonesdir: "/etc/nsd/zone"

//正引き
zone:
　　name: “example.com”
　　zonefile: “example.com.zone”

//逆引き
zone:
　　name: 200.150.100.in-addr.arpa
　　zonefile: 200.150.100.in-addr.arpa.zone
```

IPアドレスを反転させたものを逆引きのゾーンとして使います。

###ゾーンファイルの設定

RFCで規定されたゾーンファイルになります。BINDで使用しているものも使えるはずです。

```mkdir /etc/nsd/zone```

####正引きゾーンファイル

```nano /etc/nsd/zone/example.com.zone```

```
$TTL 3600

@ IN SOA ns.example.com. root.example.com. (
        201xxxxx ;Serial 有効な開始日
        3600 ;Refresh
        900 ;Retry
        3600000 ;Expire
        3600 ) ;Minimum
IN NS ns.example.com. ;ネームサーバー
example.com. IN MX 10 mail.example.com. ;メールサーバー
@ IN A 100.150.200.250
mail IN A 100.150.200.250
```

####逆引きゾーンファイル

```nano /etc/nsd/zone/200.150.100.in-addr.arpa.zone```

```
$TTL 3600
@ IN SOA ns.example.com. root.example.com. (
       201xxxxx ;Serial
        3600 ;Refresh
        900 ;Retry
        3600000 ;Expire
        3600 ) ;Minimum
IN NS ns.example.com.
IN A 255.255.254.0 ;サブネットマスク
100 IN PTR ns.example.com.
100 IN PTR mail.example.com.
```

###NSDの起動

```
systemctl start nsd
systemctl enable nsd
```
Tech-Circle#1 OpenStackハンズオンマテリアル（応用編）

先に[基礎編](http://qiita.com/tominaga443/items/4c907642923e4386eb7b)を実施してください。基礎編で作成したマシンイメージ、キーペア、Floating IPを応用編でも使用します。

このハンズオンでは、OpenStackのオーケストレーション機能であるHeatを使って、プロビジョニングやアプリケーションデプロイの自動化を体験します。

応用編では、サンプルテンプレートを使って**Web/DB分離構成のWordPressを立ち上げること**が目標です。

![alt](https://raw.githubusercontent.com/tominaga443/openstack_hands_on/master/images/hands_on_advanced.png)

## ①事前準備

事前に、基礎編で作成したインスタンス、ルーター、ネットワークを削除します。
マシンイメージ、キーペア、Floating IPは応用編で引き続き使用します。

* インスタンスの削除
  * test-instanceのアクションから【インスタンスの終了】を実行します。
* ルーターの削除
  * ルーターの名前を選択して詳細画面に移動し、【インターフェースの削除】を実行します。
  * ルーターの一覧画面に戻り、my-routerにチェックをつけて【ルーターの削除】を実行します。
* ネットワークの削除
  * internalにチェックをつけて【ネットワークの削除】を実行します。

※インスタンスやルーターが接続しているネットワークは削除できません。
　先にインスタンスとルーターの削除を実施してくださいしてください。

ネットワークトポロジーを表示して、外部ネットワークだけになっていることを確認します。

## ②スタックの作成
[サンプルテンプレート](https://github.com/tominaga443/openstack_hands_on/blob/master/heat_template/wordpress_web_db.yaml)を使ってWordPressを構築します。
サンプルテンプレートを使ってスタックを作成すると、以下のリソースが新規に自動構築されます。

* 内部ネットワーク
* ルーター
* Webサーバ用セキュリティグループ
* DBサーバ用セキュリティグループ
* Webサーバ用インスタンス
* DBサーバ用インスタンス

メニューの[オーケストレーション]-[スタック]から、【スタックの起動】を選択します。

>【テンプレートの選択】
　　テンプレートの指定方法：URL
　　テンプレートURL：https://raw.githubusercontent.com/tominaga443/openstack_hands_on/master/heat_template/wordpress_web_db.yaml
　　環境設定の指定方法：ファイル
　　環境設定ファイル：選択しない
【スタックの起動】
　　スタック名：wordpress
　　作成タイムアウト時間(分単位)：60
　　ユーザー "xxx"のパスワード：受付で配布したOpenStackのパスワード
　　image_id：fedora-20.x86_64
　　key_name ：my-key
　　その他のパラメーターはデフォルトのままで構いません
　　イメージ名や鍵の名前を違うものにした場合、そちらを入力してください。

起動を実行すると、新しいスタックが作成されます。
ネットワークトポロジーを表示すると、リソースが作成されていく様子を見ることができます。
また、スタックの詳細画面からパラメータ一覧や実行されたアクションを見ることができます。

## ③Floating IPの割り当て

スタックの作成が完了したら、WordPressにアクセスできるようにするためにWebサーバにFloating IPを割り当てます。
インスタンスの一覧からwordpress-WebServer-xxxxを選択して、アクションから【Floating IPの割り当て】を実行します。
割り当てを実行するとWebServerのIPアドレス欄にIPアドレスが追加されます。

## ④Webサーバにアクセス

WordPressが立ち上がっているか確認します。
ブラウザからhttp://[WebServerのFloating IP]/wordpressにアクセスします。
WordPressのWelcomeページが表示されれば、WordPress構築成功です。

</br>
サイト名、ユーザ名、パスワード、メールアドレス(ダミー可)を入力して【install WordPress】を実行すると、WordPressを利用できるようになります。

## ハンズオンマテリアル一覧

[【Tech-Circle#1 OpenStackハンズオンマテリアル（準備編）】](http://qiita.com/tominaga443/items/3c19205d71a7a8dcac14)
[【Tech-Circle#1 OpenStackハンズオンマテリアル（基礎編）】](http://qiita.com/tominaga443/items/4c907642923e4386eb7b)
【Tech-Circle#1 OpenStackハンズオンマテリアル（応用編）】（このページです）
gradlewが謎のエラーで動かない件について


この記事は自分のはてなブログに書いた記事のqiitaコピペ版です．http://programmermot.hatenablog.com/entry/2014/11/09/033433

# 何が起こったのか
gradle普通にやると，gradlewとかいうgradleを持ってない下々の者でもgradleを利用できるようになる便利ツールがあるんだけど，なぜか「Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain」というエラー吐いて今動かなかった．

色々調べてると，<project root>/gradle/wrapperの中にある，gradle-wrapper.jarが存在しないからと言われた．

# 何が原因だったのか

色々調べてると，\<project root\>/gradle/wrapperの中にある，gradle-wrapper.jarが存在しないからと言われた．

実際これを追加すると動いて，なんで消えちゃったんだろうみたいに思ったけど，よくよく考えるとgitignoreで*.jarがなかったことにされてるからだった．

# 復旧方法
まず，gradle-wrapper.jarを作る．gradleのコマンドで作れる．

```
$ gradle wrap
```

これで，gradle/wrapper/gradle-wrapper.jarが作成される．

あとgitignoreしちゃっててコミットできない人は，-fで無理やりできる．

```
$ git add -f gradle-wrapper.jar
```

あとはお好きにコミットをどうぞ．
MacのVirtualBoxでYosemiteを起動する方法


つまずいた部分があったのでまとめておきます。
前回のVirtualBoxインストール以降にMacOSのバージョンアップを行った場合、起動できない可能性があります。エラーが発生したら、VirtualBoxを再度インストールしてください。

## ステップ

### イメージファイルの準備

1. AppStoreでYosemiteをダウンロードする（すでにYosemiteをインストールしている場合も、ダウンロードする。続行するかどうか聞かれるので、そのまま続行。ここで、ダウンロードしていない場合、のちのコマンド実行時にinput file does not exitのエラーがでる）

  ![macPng 2014-11-08 19.58.35.png](https://qiita-image-store.s3.amazonaws.com/0/32746/7463bb8c-4470-49d0-e8e8-02f613002873.png "macPng 2014-11-08 19.58.35.png")

1. Yosemiteのインストーラーが立ち上がったらインストールせずに終了する

1. ターミナルで次のコマンドを入力 
`gem install iesd`
もし、インストールできなかったら
`sudo gem install iesd`
を打ち、Mac本体で設定しているパスワードを入力
1. 同じくターミナルで次のコマンドを入力
`iesd -i "/Applications/Install OS X Yosemite.app" -o yosemite.dmg -t BaseSystem`
↓
`hdiutil convert yosemite.dmg -format UDSP -o yosemite.sparseimage`
↓
`hdiutil mount "/Applications/Install OS X Yosemite.app/Contents/SharedSupport/InstallESD.dmg`
↓
↓
`hdiutil mount yosemite.sparseimage`
↓
`cp "/Volumes/OS X Install ESD/BaseSystem."* "/Volumes/OS X Base System/"`
↓
`hdiutil unmount "/Volumes/OS X Install ESD/"`
↓
`hdiutil unmount "/Volumes/OS X Base System/"`
↓
`diskutil unmountDisk $(diskutil list | grep "OS X Base System" -B 4 | head -1)`
↓
`diskutil unmountDisk $(diskutil list | grep "OS X Install ESD" -B 4 | head -1)`
1. アンマウント
`hdiutil convert yosemite.sparseimage -format UDZO -o yosemitefixed.dmg`
ここで、`hdiutil: convert failed - リソースが一時的に使用できません`というメッセージがターミナル上にでた場合、
ディスクユーテリティを開き「yosemite.sparseimage」と「Install ESD」を取り出してください。
1. UDZOフォーマットに変換
`hdiutil convert yosemite.sparseimage -format UDZO -o yosemitefixed.dmg`
1. yosemite.iso yosemitefixed.isoは削除しないでください

### VirtualBoxの操作

- 起動時にKernel driver not installed (rc=-1908)とでた場合は、VirtualBoxを再インストールしてください。(設定ファイル等は適宜保存してください)

#### VirtualBoxでイメージを作成
- Mac OSXを選ぶ
- メモリーは6GB以上（目安）
- 仮想ディスクは9GB以上(インストールに8.86GB)

仮想ディスク参考情報
- CommandLineToolsを使う場合は追加で3.51GB

#### VirtualBoxでイメージで設定
- 一般->高度->クリップボードのコピー　ドラッグ&ドロップ について双方向とする
- システム->マザーボード->チィップセットをPIIX3に変更
- ストレージ->ストレージツリー->空を選択しCDのマークをクリックしてyosemitefixed.isoを選択する。live CD DVDにもチェックをいれる

#### 起動後のインストール操作
1. 「主に日本語を使用する」を選択
1. 「続ける」を選択
1. 「続ける」を選択
1. 「同意する」を選択
1. 画面内で[ユーティリティ->ディスクユーテリティ]を選択
1. ディスクユーテリティ内のパーティションで現在の設定を1パーティションに変更
1. 名前をmacosyosemite
1. フォーマットをMacOS 拡張　ジャーナリングに変更
1. インストーラーに戻り、macosyosemiteのディスクを選択してインストール続行



## 終わりに

インストール終了後の起動では、 ストレージ->ストレージツリーで設定したyosemitefixed.isoの項目を削除してください。削除しないとMacOSのインストーラーが起動します。

### 参考にした記事など
VirtualBox
https://www.virtualbox.org/wiki/Downloads
Install OS X 10.10 Yosemite in VirtualBox
https://gist.github.com/frdmn/de12c894a385bc8e6bff
VirtualBoxで"Kernel driver not installed"
http://qiita.com/ottyajp/items/72febadd445ea31b934a
BigQueryに放り込む用のCSVファイル生成（Twitter）その２

[前回](http://qiita.com/FScoward/items/d10a69f3fa94e9620ae2)は100件しか取れなかったので、根こそぎとれるようにソースコードを思いつくままに変更しました。

とりあえずちゃんと取れるようになったので、BigQueryにcsvファイルをつっこんでみたら・・・

ひたすらエラーを吐く！！！

エラーの原因は"（ダブルクォーテーション）がしっかりと閉じられていないから。

で、実際のデータを見てみると

**screen name**

こいつに改行が入っているユーザーがいる。

そのせいでエラーを吐いていた。 :sweat: 

メンドクサイのでscreen nameを入れないようにしました。

BigQueryに入れることに成功したよ！やったね！タエちゃん！

*追記
実はtextにも改行(\r) が入ってました。

# ソースコード
ソースコードむっちゃ汚いんでアレ（誰かリファクタリング・・・

あと、#zanmaiのデータ取るのむっちゃ時間かかる( ◔ิω◔ิ)

```clj
(ns tweet-bigdata-clj.core
  (:import [twitter4j TwitterFactory Query QueryResult])
  (:require [clojure-csv.core :as csv]
            [clojure.java.io :as io]))

(declare twitter get-tweets tweets-to-map to-csvfile to-csv make-csv get-all-tweets)

(def twitter (.getInstance (TwitterFactory.)))

(defn get-tweets [hash-tag]
  "tweet取得"
  (let [query (doto (Query.)
                (.setQuery hash-tag)
                (.setCount 100)
                (.setSince "2014-11-03")
                (.setUntil "2014-11-04"))]
    (->> (.search twitter query))))

(defn tweets-to-map [tweets]
  "tweetsをmap形式に変換する"
  (map #(zipmap [:screenName
                 :name
                 :text
                 :createdAt]
                [(.. % getUser getScreenName)
                 (.. % getUser getName)
                 (clojure.string/replace (.getText %) #"\n" " ")
                 (.. % getCreatedAt toString)]) tweets))

(defn to-csvfile [text]
  "csvファイルを作成"
  (with-open [out-file (io/writer "out-file.csv" :encoding "utf-8" :append true)]
    (.write out-file (apply str text))))

(defn to-csv [{text :text name :name screen-name :screenName created-at :createdAt}]
  "カンマ分割"
  (csv/write-csv [[screen-name text created-at]]))

(defn make-csv [query]
  (->> query
       (.getTweets)
       (tweets-to-map)
       (map #(to-csv %))
       (to-csvfile)))

(defn get-all-tweets [#^QueryResult query]
  (loop [q query]
    (when (.hasNext q)
      (Thread/sleep 5000)
      (let [nq (doto (.nextQuery q)
                 (.setCount 100))
            nqr (.search twitter nq)]
        (make-csv nqr)
        (recur nqr)))))

(defn get-first-page [query]
  (let [q (.search twitter query)]
    (dosync(alter result-list conj q))
    q))

(defn -main[]
  (let [first-tweets (get-tweets "#zanmai")]
    (make-csv first-tweets)
    (get-all-tweets first-tweets)))
```

#RT数で並べた
(※tweetの取得に時間かかりすぎて、全量じゃないです。）

![zanmai.png](https://qiita-image-store.s3.amazonaws.com/0/39243/bcb9d835-43eb-259e-5713-be98a0130d1d.png)

## 結果
大事件です
https://www.youtube.com/watch?v=_RufZecxXKQ
JavaScriptでもがんばるぞい！

パクリです。 [Ruby - 今日も1日がんばるぞい！ - Qiita](http://qiita.com/giiko_/items/8c3442e8e7a83cc0b91a) ／ [PHP - PHPでもがんばるぞい！ - Qiita](http://qiita.com/kimama1997/items/5b1e9f12720782146751)

```html:zoi.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>JSでもがんばるぞい！</title>
    <script src="zoi.js"></script>
</head>
</html>
```

```js:zoi.js
var count=0,
    dic=[["今日","ぞい"],["も"],["1","ぞい"],["日","ぞい"],["がん","ぞい"],["ばる","ぞい"],["ぞい！"]];

do{
    var arr = [];
    dic.forEach(function(ob){
        var rndm = Math.floor(Math.random()*2);
        arr.push(ob.length == 1 ? ob[0] : ob[rndm]);
    });
    document.write(arr.join("")+"<br>");
    count++;
}while(arr.join("") != "今日も1日がんばるぞい！");

document.write('<br>☆がんばるまで'+ count +'zoiでした☆');
```

　
もう少し簡潔に書きたい、、、

#疲れた
![aaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/58581/3666d7b0-41b5-13fd-2288-a225c9b02ae7.jpeg)
node-webkitでもbrowserify使いたいしnodeのrequireも使いたい

Atom-shell使ってみたんだけど、いつものgulp + browserifyなスケルトンで挑んだら結構詰まる

クライアント側のコードでfs使いたいんだけど、普通に`var fs = require('fs')`しても空のオブジェクトが返ってくる。

これはbrowserifyが `require` をどうにかしちゃってるから。

ググったらsubstack本人の書き込みあった。
https://github.com/substack/node-browserify/issues/481

```bash
$ browserify --no-detect-globals --bare -t coverify test/*.js | node | coverify
```
「↑コマンドラインだとこういうノリでやってくれ」って言ってる。
でも、gulpでbrowserifyしてる場合、`detectGlobals: false`するだけじゃダメで、builtinsをいじる必要がある。
こんな感じ。

```js
gulp.task('scripts', function () {
  var bundler = browserify({
    entries: config.entries,
    extensions: ['.coffee'],
    debug: true,
    detectGlobals: false,
    builtins: []
  });
  bundler.transform('coffeeify');
 
  return bundler.bundle()
    .on('error', gutil.log.bind(gutil))
    .pipe(source('app.js'))
    .pipe(gulp.dest(config.dst));
});
```

今回atom-shellでやったけどnode-webkitもこれでおｋなはず
cocos2d-xでのFlash使用


<h2>LightWeight SWF ー LWF</h2>
Greeで開発したオープンソースSWF変換ツール＆ライブラリ
SWFをLWFファイルに変換してHTML5、Unity3D、cocos2d-xなどで使用できる。

<h3>LWF紹介ページ</h3>
http://gree.github.io/lwf/

<h3>LWFガイドライン</h3>
http://gree.github.io/lwf-demo/pdf/FLASHforLWFproductionguideline.pdf

このガイドラインによるとShape、Maskが使えない。
もちろんAS2、AS3も使えない。
ただし、stop(), gotoAndPlay()のような”Action”はOK！

<h2>SWF→LWF 変換</h2>
SWFをLWFに変換するツールを提供。
ターミナルで変換もできる。

<h3>LWFS</h3>
http://code.google.com/p/lwfs/downloads/list
使いやすいツールです。指定されたフォルダーにSWFファイルを入れると自動的に変換をされます。

参考サイト
http://lwf-users.org/index.php?title=LWFS%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9


<h3>swf2lwf（コンソール）</h3>
http://gree.github.io/lwf/

大量のファイルを変換したい場合はこの方がいいと思います。
紹介サイトでダウンロードできます。

参考サイト
http://www.loveloveheart.com/unity/lwf/swf2lwf.php

<h3>swf2lwf 使用時の問題?</h3>
MacでRubyでgemファイルをインストールする時下記のようなエラーが発生しました。

libpng、jpeg この二つをインストールしてもエラーは消えません。
Macでpng.hファイルが存在することも確認しました。
png.hのパス設定が必要なのか、Yosemiteを使っているのが問題なのか… 未だに原因不明です！

<pre>
img.c:13:10: fatal error: 'png.h' file not found
</pre>

https://github.com/gree/lwf/issues/65

<h2>cocos2d-xとLWF</h2>

LWFはcocos2d-x用のライブラリを提供します。
が、紹介ページでライブラリをダウンロードするよりはサンプルプロジェクトを見る方がわかりやすいと思います。

http://lwf-users.org/index.php?title=LWF_for_cocos2d-x


<h2>関連サイト</h2>
http://lwf-users.org/
Tech-Circle#1 OpenStackハンズオンマテリアル（準備編）

## 準備編

このハンズオンでは、SoftLayer上に構築されたOpenStackを利用します。このOpenStackはインターネットに公開されていないので、ハンズオン用のVNCサーバにログインして操作を行う必要があります。

準備編では、VNCクライアントをセットアップして、**ハンズオン環境にログインできること**が目標です。

使用するPCがWindowsの場合とMacの場合で手順が異なりますので、注意してください。

## １．VNCクライアントのインストール

### 【Windowの場合】

VNCクライアントをダウンロードして、PCにインストールします。
以下のページを参考にして、VNCクライアントをインストールしてください。
http://kb.seeck.jp/archives/5892
（VNCサーバに接続できるツールであれば、必ずしも上記サイトのものでなくても構いません。）

### 【Macの場合】

標準でVNCクライアントが用意されているので、インストールは不要です。


## ２．VNCサーバにログイン

### 【Windowの場合】

以下のページを参考にして、VNCサーバにアクセスしてください。
アクセス情報は受付で配布したものを使用してください。
http://kb.seeck.jp/archives/5902

### 【Mac】の場合

以下のページを参考にして、VNCサーバにアクセスしてください。
アクセス情報は受付で配布したものを使用してください。
http://qiita.com/toshiro3/items/808537690bdfe04a391c#2-6

## ３．ハンズオン環境にログイン
VNCサーバに接続するとハンズオン環境のログイン画面が表示されます。
受付で配布したアカウント名を選択してログインしてください。

デスクトップ画面が表示されたら、ブラウザを起動して【基礎編】と【応用編】のハンズオンマテリアルを開いておいてください。
パラメータやURLをコピー＆ペーストできるので、ハンズオンを迅速に進められます。

## ハンズオンマテリアル一覧

【Tech-Circle#1 OpenStackハンズオンマテリアル（準備編）】（このページです）
[【Tech-Circle#1 OpenStackハンズオンマテリアル（基礎編）】](http://qiita.com/tominaga443/items/4c907642923e4386eb7b)
[【Tech-Circle#1 OpenStackハンズオンマテリアル（応用編）】](http://qiita.com/tominaga443/items/35c14d442f5b0a986a33)
(SublimeText)ティラノスクリプトでSyntax Highlight

ティラノスクリプトの開発の時にちょっと迷ったのでメモ。
http://tyrano.jp/

[概要]
こちらのリポジトリで提供されているプラグインを利用する。
開発者さんには感謝ですね。。
URL: https://github.com/yamamotosuzume/o2syntax

[手順]
1. (未導入なら)Sublime TextにPackage Controlを導入する。
2. `Cmd+Shift+P`でコマンドパレットを開く
3. `Add Repository`と入力しEnter
4. Page下部の"GitHub or ... Repository URL"欄にリポジトリのURL( https://github.com/yamamotosuzume/o2syntax )を入力しEnter
5. `Install Package`と入力しEnter
6. `o2syntax`と入力しEnter

以上の手順で、ティラノスクリプトのファイルもSyntax Highlightされるようです。
※あくまで吉里吉里向けのSyntax Highlightが効くだけなので、http://tyrano.jp/home/tag に網羅されているすべてのタグでは無いみたいですが。。

色が付かないとやる気がでないという方は是非試してみては！
[PHP]ジェネレーターを用いた再帰

今さら感がありますが、PHP5.5で追加されたジェネレータの再帰で少しハマったのでメモ。
ジェネレータを使った再帰を試してみたくて、ファイル探索で試してみた。
基本的には、参考URLの「1. scandir()とis_file()/is_dir()を組み合わせる」の方法を
ジェネレータの再帰で書きなおしてみました。
んーなんか無理矢理感があるけど、これでよいのかな？？

参考：
（PHPで）指定ディレクトリ以下を全部チェックしてファイル一覧を取得する方法
http://blog.asial.co.jp/1250

書き直したもの。

```php:FindFile.php
/*
 *再帰的に特定ディレクトからファイル名の完全一致で検索する
 */
class FindFile
{
    /**
     * 再帰的に指定フォルダ以下からファイル名の完全一致からファイルを探す
     * @param $dir
     * @param $filename
     * @return \Generator
     */
    public static function find($dir, $filename)
    {
        foreach (self::ls($dir) as $data) {
            if ($data['name'] === $filename) {
                yield $data;
            }
        }
    }
 
    /**
     * 再帰的に指定フォルダ以下のファイル一覧を取得
     * @param $dir
     * @return \Generator
     */
    public static function ls($dir)
    {
        $files = scandir($dir);
        $files = array_filter($files, function ($file) {
            return !in_array($file, array('.', '..'));
        });
        foreach ($files as $file) {
            $fullPath = rtrim($dir, '/') . '/' . $file;
            if (is_dir($fullPath)) {
                foreach (self::ls($fullPath) as $res) {
                    yield $res;
                }
            } else {
                yield ['dir' => $dir . '/', 'name' => $file];
            }
        }
 
    }
}
```
Choregrapheが起動しない人に

windows8に、Choregrapheをインストールしたけど、いざ起動したら起動しない
人いませんでしたか？

以下の方法で解決。
結論：アカウント名が日本語により、Choregrapheが立ち上がりませんでした。
暫定対処：アカウントを英語（例：pepper）にすることにより、問題なく起動しました。

前提：
　（環境）
　　　　ASUS X202E
　　　　Windows8.1
　　　　インテルCore i3 プロセッサー
　　　　メモリー4GB
　　　　64bit

　（検証結果）
　　　　■アカウント：稲益広史　権限：Administrator
　　　　　結果：Choregrapheが立ち上がらない。タスクマネージャーに一瞬現れて消える
　　　　■アカウント：pepper　権限：Administrator
　　　　　結果：Choregraphe問題なく起動

　（その他）
　　　　Choregrapheをインストールした後に、windowsの「C：ユーザ」を見ていたら、
　　　文字化けのフォルダーを発見しました。過去に海外製のパッケージで日本語にからんで
　　　同様に動かないケースがあったので偶然気が付きました。
Android StudioでJavaDocを生成する


頑張って書いたJavaDocをAndroid Studioから生成する手順

# 環境

Android Studio 0.8.6
jdk1.7.0_60.jdk

# 手順

## メニューの[Tools] -> [Generate JavaDoc...]を選択

![スクリーンショット_2014-11-09_0_19_48.png](https://qiita-image-store.s3.amazonaws.com/0/280/431bb849-2283-5bc7-71f9-1dfe225409d1.png "スクリーンショット_2014-11-09_0_19_48.png")

## JavaDocを生成するScopeを選択

### 初期状態

初期状態はこんな感じのはず

![スクリーンショット 2014-11-09 0.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/280/d878fcb9-2b92-1d38-1b0e-823052fd6b79.png "スクリーンショット 2014-11-09 0.28.51.png")

### [Custom scope]の[...]を選択

![スクリーンショット_2014-11-09_0_28_51.png](https://qiita-image-store.s3.amazonaws.com/0/280/7b24d078-d9ce-48b1-ebd2-20dbf7334290.png "スクリーンショット_2014-11-09_0_28_51.png")

### [+]ボタンを選択

![スクリーンショット 2014-11-09 0.27.10.png](https://qiita-image-store.s3.amazonaws.com/0/280/e53abf1d-7bc7-aa97-e404-998b30c70dd5.png "スクリーンショット 2014-11-09 0.27.10.png")

### とりあえず[Local]で良いっぽい

![スクリーンショット 2014-11-09 0.27.18.png](https://qiita-image-store.s3.amazonaws.com/0/280/57973671-dd76-e45f-53be-baade616653c.png "スクリーンショット 2014-11-09 0.27.18.png")

### scopeの名前を入れる

何でもいいが、今回は`app`とした

![スクリーンショット 2014-11-09 0.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/280/a00269cf-3fb2-54ef-c11b-6e908c75084f.png "スクリーンショット 2014-11-09 0.27.29.png")

### scopeを作る

JavaDocを生成するscopeを選択できるようになるので、
[Include]とか[Exclude]を使ってscopeを作る

![スクリーンショット 2014-11-09 0.21.12.png](https://qiita-image-store.s3.amazonaws.com/0/280/128556d4-e14f-8f72-d534-34b5951e8308.png "スクリーンショット 2014-11-09 0.21.12.png")

## オプションの指定

### scopeを設定して帰ってくるとこんな感じになる

![スクリーンショット 2014-11-09 0.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/280/7f224a82-6dbc-cd12-35da-4b5377e8a6a7.png "スクリーンショット 2014-11-09 0.23.42.png")

### [Output directory]を指定する
そのままで、生成したJavaDocを保存する場所のこと

![スクリーンショット_2014-11-09_0_35_21.png](https://qiita-image-store.s3.amazonaws.com/0/280/5299b78b-db8d-0bdb-61d7-0b89a9b15930.png "スクリーンショット_2014-11-09_0_35_21.png")

### 実行のオプションを入力する
場所は[Other command line arguments]
入力として

```
-encoding UTF-8 -bootclasspath /path/to/android-sdks/platforms/android-21/android.jar
```

今回はJavaDocに日本語を使っていたこともあり、文字コードを指定している
また、`android.jar`を指定しないと数多のエラーを吐いて死ぬので、sdkを置いてある場所から`android.jar`を探しだしてそのPATHを`-bootclasspath`として指定する

![スクリーンショット_2014-11-09_0_37_02_1.png](https://qiita-image-store.s3.amazonaws.com/0/280/adaa8523-8610-f973-9d55-609ce029df46.png "スクリーンショット_2014-11-09_0_37_02_1.png")

## これでOK

ブラウザで勝手にJavaDocが表示されるので楽しむ
【Android】テストをコマンドで実行する

久しぶりに投稿します。
今回はAndroidアプリの自動テストの実行についてです。

テストプロジェクトをEclipseなどから実行するのではなく、apkにしてインストールして実行したいときなどに使うコマンドです。

### 前提
テストプロジェクトのパッケージは`com.hello.test`とします

### 実行する
* パッケージ(com.hello.test)に含まれるすべてのテストを実行する

```
adb shell am instrument -w com.hello.test/android.test.InstrumentationTestRunner
```

上記のように、adb shell am instrument -w　+　パッケージ名　+　/android.test.InstrumentationTestRunner　とします。

* 特定のテストクラス(MyTest)、テストスイートのみを実行する

```
adb shell am instrument -w -e class com.hello.test.MyTest com.hello.test/android.test.InstrumentationTestRunner
```

adb shell am instrument -w　+　-e class パッケージ名.テストクラス名(テストスイート名)　+　パッケージ名　+　/android.test.InstrumentationTestRunner　とします。

* 特定のテストクラスのテストメソッド(testMain)を実行する

```
adb shell am instrument -w -e class com.hello.test.MyTest#testMain com.hello.test/android.test.InstrumentationTestRunner
```

adb shell am instrument -w　+　-e class パッケージ名.テストクラス名#テストメソッド名　+　パッケージ名　+　/android.test.InstrumentationTestRunner　とします。

* 特定のアノテーション(SmallTest)が付与されているテストを実行する

```
adb shell am instrument -w -e size small com.hello.test/android.test.InstrumentationTestRunner
```

adb shell am instrument -w　+　-e size small　+　パッケージ名　+　/android.test.InstrumentationTestRunner　とします。
「-e size small」の部分はMediumTestアノテーションの場合は「-e size medium」、LargeTestアノテーションの場合は「-e size large 」となります。



以上になります。
wordpress pluginのコードをひたすら読むために(ghq+peco)

いろんな事情でwordpressのpluginのコードを読むことになった人向け。
想定環境はwindows。

### 使うもの

* Chocolatey
* peco
* ghq
* Atom

### Chocolatey

https://chocolatey.org/
windows用のパッケージマネージャー。
色々揃っていて便利

* トップページにインストール方法が書かれているので、それにそってインストール
* 操作するときは管理者権限でpowershellを起動する


#### Chocolately経由で入れるもの

* Atom
* go
* svn
* git
* Mercurial 

```
choco install atom
choco install golang
choco install svn
choco install git
choco install hg
```

* golangインストール時に` C:\tools\go\bin`を`PATH`に追加と言われるので従う


### peco + ghq

githubのコードを見るときなど、この組み合わせが凄く便利。
それぞれの使い方はQiitaで検索

* インストール前に、環境変数GOPATHを適当なところに設定する。
* peco単体であれば、golangはいれなくてもいいがghqを使うために必要

参考：　[例えば、pecoをビルドしない](http://qiita.com/lestrrat/items/de8565fe32864f76ac19)


go getでpecoとghqを入れる。

```
go get github.com/peco/peco/cmd/peco
go get github.com/motemen/ghq
```

設定したGOPATHにpecoとghqがインストールされる。

wordpress pluginはsuverionで管理されているため、ghqで管理するためには一手間必要で、`.gitconfig`に以下を追加(git 1.8.5以上）

```
[ghq "http://plugins.svn.wordpress.org/"]
vcs = svn
```


これでsvnで管理されているwordpress pluginをghq経由で管理できる。

```
# 例
ghq get http://plugins.svn.wordpress.org/akismet/
ghq list
```


### Atom

説明略。

使いやすいように幾つかpackageをインストール。

```
apm install file-icons 
apm install minimap
```

#### ghq、pecoと組み合わせて手元のリポジトリを開く

```
atom $(ghq list --full-path | peco)
```