OmniAICreator/Qiita-1.07M huggingface dataset:
【npm + Karma + Jasmine】JavaScriptの単体テスト環境を構築する

JavaScriptの単体テスト環境構築のまとめ。
テストランナーとして「[Karma](http://karma-runner.github.io/0.12/index.html)」、テストフレームワーク・アサーションライブラリとして「[Jasmine](http://jasmine.github.io/)」を使う。

#前提条件
下記が使用できること。

- node
- npm

検証環境

- MacOS X 10.9.2


#package.json生成

```
$ npm init
```

- 対話形式でprojectの初期設定をする。
- 不要な項目は、空欄のままEnter
- 最終的に、package.jsonファイルが生成される（直接編集も可）


![console12.png](https://qiita-image-store.s3.amazonaws.com/0/31862/b23d7394-3aa4-c767-4b1f-f4994e7e7722.png)


#karmaインストール

```
$ npm install --save-dev karma
```

- node_modules/が生成され、その中に karma 関連ファイルが格納される
- option「–save-dev」によって、install 対象の library 情報が自動で package.json に記述される

```json:package.json
{
  "name": "JSTestSample",
  "version": "0.0.0",
  "description": "Sample for JS Test.",
  "main": "index.js",
  "scripts": {
    "test": "node_modules/karma/bin/karma start"
  },
  "author": "",
  "license": "not commedical",
  "devDependencies": {
    "karma": "~0.12.9"
  }
}
```

# karma init

```
$ node_modules/karma/bin/karma init
```

- 対話形式で情報を入力
- karma.conf.jsが作成される
- package.json に jasmine 関連ファイルと、chrome-lancher が記述される

![f7b5a0c19662aca94a8b1185006aff11.png](https://qiita-image-store.s3.amazonaws.com/0/31862/a070bcff-45e3-55c0-2bb8-e575b5a884d1.png)

```json:package.json
"devDependencies": {
 "karma": "~0.12.9",
 "karma-jasmine": "~0.1.5",
 "karma-chrome-launcher": "~0.1.3"
 }
```

#プロダクトコード+テストコード

- [jasmine](http://jasmine.github.io/) の文法で

```js:Logic.js
function Logic() {
 
}
 
Logic.prototype.squaredNumber = function(num){
    return num * num;
};
```

```js:LogicTest.js
describe("TestSample>", function(){
    describe("Logic>", function() {
        it("multiNumber", function() {
            var target = new Logic();
            var num = 3;
            var expected = 10;
 
            var result = target.squaredNumber(num);
 
            expect(expected).toEqual(result);
 
        })
    });
});
```

#テスト実行コマンドを設定

```json:package.json
{
  "name": "JSTestSample",
  "version": "0.0.0",
  "description": "Sample for JS Test.",
  "main": "index.js",
  "scripts": {
    "test": "node_modules/karma/bin/karma start"
  },
  "author": "",
  "license": "not commedical",
  "devDependencies": {
    "karma": "~0.12.9",
    "karma-jasmine": "~0.1.5",
    "karma-chrome-launcher": "~0.1.3"
  }
}
```

#テスト実行してみる

```
$ npm test
```

- package.json の情報を元にテストが実行される
- chromeが自動で起動する

![9543f2264fdc21a1e9324dedb508ef50.png](https://qiita-image-store.s3.amazonaws.com/0/31862/df874b02-4d0f-a096-de28-5eb59933efd0.png)

- テスト成功時

![92b6b0307cd4d648c7eb2c0d593333dc.png](https://qiita-image-store.s3.amazonaws.com/0/31862/0aa05fa6-3b81-6909-847a-b871a677e23e.png)

- テスト失敗したときはこんな感じ

![92b6b0307cd4d648c7eb2c0d593333dc1.png](https://qiita-image-store.s3.amazonaws.com/0/31862/38c65361-c43b-48a0-6a36-2d4c1e74a319.png)
UILabelでうまく改行できないときの確認ポイント


#概要

UILabelでうまく改行できないときの確認ポイント

## Storyboard

* Linesが1以外（０で無制限）

* Line BreaksがCharacter Wrap(場合によってはWord Wrap)

* Use AutoLayoutにチェックを入れ、Constraintを設定する。(iOS7では必須）

 * Storyboard下方にあるPINボタン(|- + -|)を押すとConstraint設定画面に移る

## Code

* adjustsFontSizeToFitWidthプロパティをNO(フォントサイズの変更でアジャストされてしまう）

* テキストを設定後、sizeToFitメソッドをコール

## 補足

Webで情報を検索するとConstraintに触れられていないことが多く、iOS6まではこの設定が不要だったのかも 

## 参考
* http://blogios.stack3.net/archives/417
AppleScriptでアプリケーションのウインドウ数を取得



AppleScriptでアプリケーションのウインドウ数を取得する処理を作ってみた。

肝はこれ

	tell application アプリケーション名
		set 変数 to number of windows
	end tell


【処理】

	--引数　：アプリケーション名（ex. "Safari" )
	--戻り値：整数
	to tellAppToGetWindowCount(inAppName)
		set windowCount to 0
		tell application inAppName
			set windowCount to number of windows
		end tell
		return windowCount
	end tellAppToGetWindowCount


使い方（Safariのウインドウを数える）

	tellAppToGetWindowCount("Safari")


結果

	2
AppleScriptで現在日時の文字列を取得する


現在の日時オブジェクトを取得（AppleScript エディタで実行）

	current date

結果
	
	date "2014年8月8日金曜日 7:10:15"


これをつかって現在日時をMySQLの日付書式で取得する処理を書いてみた。


	-- 戻り値：文字列（ex. '2014-03-16 10:17:05'）
	to getCurrentDateString()
		set current_date to current date
		
		set val_year to year of current_date
		set val_month to month of current_date as number
		set val_day to day of current_date
		set val_time to time string of current_date
		set date_time_string to ""
		
		if val_month < 10 then
			set val_month to "0" & val_month as string
		end if
		
		if val_day < 10 then
			set val_day to "0" & val_day as string
		end if
		
		set date_time_string to val_year & "-" & val_month & "-" & val_day & " " & val_time as string
		return date_time_string
	end getCurrentDateString
カメラで撮った写真を加工する際の注意


カメラで撮った写真からサムネイルを生成する際に、UIImage->CGImage->UIImageというふうに変換した。その際、画像が意図せずに回転する現象に遭遇した。
(ex. iPhoneを縦にして撮る->生成したサムネイルが90度回転した状態になる)
以下、原因と対処に関するメモ。

カメラで撮った写真(UIImage)は、imageOrientationプロパティに写真の向きに関する情報を保存している。
(ref. http://horsewater.blog112.fc2.com/blog-entry-25.html)
この情報により写真の向きは適切に保たれるが、この情報がCGImageを経由してUIImageを加工した際に失われる場合がある。

```objective-c:
# (注) UIImageのカテゴリとして実装しているため、self.imageOrientationでアクセスできる
NSLog(@"Orientation(Before):%@", [NSNumber numberWithInteger:self.imageOrientation]);
CGRect croppedSquare = CGRectMake(x, y, length, length);
CGImageRef ref = CGImageCreateWithImageInRect(self.CGImage, croppedSquare);

UIImage *croppedImage = [UIImage imageWithCGImage:ref];
NSLog(@"Orientation(After):%@", [NSNumber numberWithInteger:croppedImage.imageOrientation]);
CGImageRelease(ref);

(ログ出力)
2014-08-08 02:19:40.242 bribum[4536:60b] Orientation(Before):3
2014-08-08 02:19:40.244 bribum[4536:60b] Orientation(After):0
```

向きの情報を失わなずに加工したUIImageを取得するためには、`[UIImage imageWithCGImage:]`ではなく`[UIImage imageWithCGImage:scale:orientation:]`を使用して
元の画像の向きを教えてやる必要がある。

```objective-c:
NSLog(@"Orientation(Before):%@", [NSNumber numberWithInteger:self.imageOrientation]);
CGRect croppedSquare = CGRectMake(x, y, length, length);
CGImageRef ref = CGImageCreateWithImageInRect(self.CGImage, croppedSquare);

UIImage *croppedImage = [UIImage imageWithCGImage:ref
                                            scale:[UIScreen mainScreen].scale
                                      orientation:self.imageOrientation];
NSLog(@"Orientation(After):%@", [NSNumber numberWithInteger:croppedImage.imageOrientation]);
CGImageRelease(ref);

(ログ出力)
2014-08-08 02:41:25.350 bribum[4551:60b] Orientation(Before):3
2014-08-08 02:41:25.354 bribum[4551:60b] Orientation(After):3
```
Swiftの関数引数とタプルについて思ったこと


「[Swiftの関数の引数は、常に一つ](http://qiita.com/dankogai/items/46fedc447dd93d1e0fbc)」を読んで，そうであるならば，

```swift

let g = {(a: Int, b: Int) -> Int in a + b}
var v: (Int, Int) = (1, 2)

var w = g(v)

```
とタプルを直接渡して関数起動してくれてもいいじゃないかと思います．
しかし「引数の数が合わない」というエラーであえなく撃沈．
引数リストを全部埋めるのが面倒くさいので前もって用意したタプルをどんと渡したいということも時にはあると思いますけど．例えば，4引数をとる関数fnがあったとして，

```swift
let x = (a+b, a-b, a*b, a/b) // 本当はもっと複雑な計算
let y = fn(x)       //どんと一発起動

```
なんてことをやりたいかも．
　

さて，件の記事からcall関数を再掲すると，

>func call<A,R>(f: A -> R, a: A) -> R {
>    return f(a)

となっています．タイプ指定を見るとクロージャfは，あくまで1つの引数を受け取って1つの結果を返す，と処理系に敢えて認識させてるからこの定義は通るんですね．どんなタイプであっても1つであれば受け付ける．
現処理系は，関数起動表現において，文法チェック後に，まず引数の数をチェックして，それから各引数のタイプチェックしている印象です．数と個々の要素のタイプチェックですね．関数名の後ろのカッコ表現をただのタプルと見なせば，これってただのタプルのタイプチェックですね．内部的には，確かに関数起動には"引数列というタプル"が唯一必要だということが分かります．

ところで，[Swiftの言語リファレンス](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AboutTheLanguageReference.html#//apple_ref/doc/uid/TP40014097-CH29-XID_503) のParenthesized Expressionのところを見ると，

> If there is only one value inside the parenthesized expression, the type of the parenthesized expression is the type of that value. For example, the type of the parenthesized expression (1) is Int, not (Int).

なんていう説明があります．(1)のタイプは(Int)じゃなくてIntであると．
であるならば，関数起動g(v)での(v)は実は((Int, Int))なのでタイプは(Int, Int)です．g(1, 2)と表現しているようなものです．全然問題ないじゃないですか．
単純にタプルとしてのタイプチェックだけをしてくれれば，g(a)も実行できるはず．

例えば，次のような変数a,bを定義したとき，

```swift
var a: (Int, Int) = (1, 2)
var b: ((Int, Int), Int) = ((1, 2), 3)

g(a)   // O.K
g(b)   // error
```
g(a)は(a)のタイプ合致で起動可能．
g(b)では(b)が(Int, Int)ではなくタイプ不一致だからエラーとなってほしいところです．そもそも引数の数なんてものはタイプに包含されているから，タイプチェックの前に数を勘定する必要なないはずです．
もう一度いいます，「引数の数はタイプに包含されている」んですよと．
imagePickerControllerを使った画像トリミングがうまくいかない

imagePickerControllerでeditableにした時に、画像が正方形にトリミングできます。
しかし、カメラロールから取得した場合は、トリミング位置の移動ができて、
カメラで撮影した場合はうまくいきません。なぜだ！！！！
わかる方教えて下さい！！！
### カメラの場合のみトリミング位置の縦移動ができない
```objc
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.allowsEditing = YES;
```
### カメラロールは問題なし
```objc
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.allowsEditing = YES;
```
### 問題の画面
![写真.PNG](https://qiita-image-store.s3.amazonaws.com/0/10532/74a9a4cf-9e34-2973-7cd2-81aac9ba46f5.png)
Symfony2+Doctrine2でEntityを操作するのは、Repositoryのお仕事

Symfony2を使い始めたときに、Entityの操作をどこでやるのがいいのか、よく分からなかったのですが、Doctrine2のドキュメントを読んで知った事があります。

```
orm:generate-repositories
```

このDoctrineのCommandによって、EntityからRepositoryというクラスを生成してくれます。
またEntityのannotationなどにも、どのEntityで、どのRepositoryを使うのかが、追記されます。

## 今のところの設計方針

今のところRepositoryには、Entityを操作する処理だけの層として、設計するのが良いと判断しています。

データを取得してからの、複雑な処理に関しては、Serviceとして、登録したクラス郡に任せるのが良さそうです。
pandas によるデータセットの加工 (1)

## サンプルデータの抽出

統計解析においてはデータの前処理が欠かせません。まず計算機で扱えるようデータを読み込むわけですが、大きめのデータを扱う計算処理においてはそのターンアラウンドがしばしば問題になります。このようなときに採るべき策はいくつかあります。

* データのサイズを減らす
* ボトルネックを特定し計算量の削減をする
* 計算機の性能を上げる

ビッグデータなどと言われて久しいですが実際には標本のサイズを大きく取る必要はありません。[標本抽出法](http://qiita.com/ynakayama/items/d7f6989a4e17ed8a05ec)によって有意なサンプルを抜きだしましょう。

多くのデータ集中処理では I/O がボトルネックになります。このとき必要なデータだけを読み込むようにする、もとのデータを適切に分割して入力サイズそのものを減らす、といったことを検討するのが良いでしょう。

## サンプルデータのスライスと集計

###  スライシング

pandas でデータを扱う場合、スライシングは簡単におこなえます。

```py3
# 30 歳までのデータを抽出
data_y = data[:"30"]
# 31 歳以上のデータを抽出
data_o = data["31":]
```

またこのようにスライシングした[データセットをマージする](http://qiita.com/ynakayama/items/358a7e043194cecf28f9)こともできます。

### 集計

期間平均を利用して月次データを四半期のデータに集計する例です。

```py3
data.resample('Q',how="mean")
```

how には "sum","mean", "median", "max", "min", "last", "first" が利用可能です。


## 欠損値の処理

データセットは必ずしも綺麗にそろったデータとは限りません。 pandas は欠損値の処理において現場の人々が培ったさまざまなイディオムが追加されています。

### 穴埋め

```py3
data.fillna(0)
```

上の例では欠損値を 0 に置き換えています。 data.fillna(data.mean()) などとすると平均値で穴埋めします。

直後の値で埋めるには method = "ffill" を指定します。

```py3
data.fillna(method='ffill')
```

また欠損値の前後の値で[線形補間](http://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E8%A3%9C%E9%96%93)するのも簡単です。

```py3
data.interpolate()
```

欠損値を含むデータを削除することも多いでしょう。次のように取り除きます。

```py3
data.dropna(axis=0) # 行 axis=0 か列 axis=1
```

## データの追加と置換

data['New'] という新しい列を追加します。

```py3
data['New']=rand(data.shape[0])
```

同じく今度は行を追加します。 .append() 関数にデータフレームを指定すれば追加することができます。

```py3
data = data.append(pd.dataFrame([1,2,3,4,5],columns=["A","B","C","D","E"],index=data[-1:].index+1))
```

置換するデータを data.iloc に渡せば上書きできます。 data.shape はデータフレームの行列数を表しますのでこの行列個数分だけ乱数を生成して代入することで乱数による上書きができます。

```py3
# 1 行目を乱数で上書きする
data.iloc[0]=rand(data.shape[1])
# 1 列目を乱数で上書きする
data.iloc[:,0]=rand(data.shape[0])
```

データを並び替えるには .sort() 関数にカラム名のリストを渡します。次の例では 1 列目を優先に 2 列目までのカラムで昇順ソートします。結果はレシーバに返ります。

```py3
data.sort(columns=list(data.columns[0:2]),ascending=True)
```

## まとめ

pandas を利用してデータセットの加工をするときに便利な処理をまとめました。
Java入門 メソッド 引数

Java入門
メソッド 引数の渡し方

##引数
メソッドは、文字列や整数といった情報を引数として関数に渡して処理を行うことができます。
渡す引数が無いとしても

```java:sample.java
メソッド名()
```

この形でなければなりません。

それでは実際に引数として文字列を渡してみます。

```java:sample.java
public class Sample {
	public static void main(String[] args) {
		// メソッドの呼び出し、名前を渡す
		sayHello("ゆかりん");
		sayHello("王国民");
	}
	// メソッドの定義
	public static void sayHello(String name) {
		System.out.println( "ようこそ" + name + "さん");
	}
}
```

実行結果

```lang:sample.java
ようこそゆかりんさん
ようこそ王国民さん
```

文字列をメソッドに渡して、「ようこそ◯◯さん」と表示させました。


今度は整数を引数として2つ渡します。

```java:sample.java
public class Sample {
	public static void main(String[] args) {
		// 引数として整数を2つ渡す
		add(50, 50);
		add(500, 900);
	}
	// 2つの値を合計するメソッド
	public static void add(int x, int y) {
		int sum = x + y;
		System.out.println ("合計は" + sum + "です。");
	}
}
```

実行結果

```lang:sample.java
合計は100です。
合計は1400です。
```

引数が複数ある場合はカンマ「,」で区切ります。メソッド側では受け取る型と変数名を一緒に宣言します。
メソッド側の型と渡す引数の型が一致しなければエラーになります。

##実引数と仮引数
送る側と受け取る側、どちらも引数と呼ばれますが細かく分けると

・送る側の引数　→　実引数
上のコードで言うと**add(50, 50)**の引数が実引数です。

・受け取り側のの引数　→　仮引数
上のコードで言うと**add(int x, int y)**の引数が仮引数です。

##引数と戻り値
引数に配列を指定することも可能です。
その場合はメソッドの仮引数を配列に指定あげるだけです。

```java:sample.java
public class Sample {
	// 配列を受け取り、要素を表示する
	public static void printArray(int[] array) {
		// 配列の数だけ繰り返す
		for (int element : array) {
			System.out.println(element);
		}
	}
	public static void main(String[] args) {
		int[] array = {10, 20, 30, 40};
		// printArrayメソッドに配列arrayを渡す
		printArray(array);
	}
}
```

実行結果

```lang:java
10
20
30
40
```

配列の場合は**変数の型[]**この形を忘れないようにしましょう。
「Skitch PNG」とはなにか？


画像に文字や図形を描くとき多用している Skitch ですが、ファイルのエクスポートに「Skitch PNG」という謎のファイル形式があるのを発見。

![](http://blog.amay077.net/assets/images/posts/skitch_png_01.png)

調べてみると、

* [Skitch For Mac Updated With A Format That Keeps Annotations Editable](http://www.addictivetips.com/mac-os/skitch-updated-with-a-special-format-that-keeps-annotations-editable/)

> Skitch PNG is a new format for saving pictures that you’ve annotated in Skitch. These are almost like regular PNGs, except that you can open them in Skitch later on and edit the previous annotations. 

な、なんだってー！PNG なのに **「アノテーションが再編集可能」** だってー！！

## 試しに

![](http://blog.amay077.net/assets/images/posts/skitch_png_02.png)

[photo by Nesster, CC-BY](http://www.gatag.net/10/16/2009/110000.html)

上の画像、「Skitch PNG」で保存したものですが、Skitch で開き直すと、下図のように文字や矢印が再編集できます。

![](http://blog.amay077.net/assets/images/posts/skitch_png_03.png)

これからはこれをデフォで使っていこうと思います。
ちなみに「モザイク」は復元できないみたいです。うむ安全設計。
[状態マシン図] Any Stateパターン



これはFM-AMラジオの状態マシン図である。

![radio2.png](https://qiita-image-store.s3.amazonaws.com/0/11188/bac77f3b-1531-f5ca-3995-2421bf3bba56.png)

on 状態のサブ状態では、FMとAMが切り替えられるようになっていて、FM状態のときにevAMが起きるとAM状態に、AM状態のときにevFMが起きると FM状態に遷移する。また、on状態のサブ状態には、浅い履歴疑似状態が設定されていて、初めて入ったときはFMが、２回目以降入ったときは、前回選ばれていたほうの音源が鳴る。

そのFM-AMラジオに機能拡張の仕様変更が着た。これは４つの音源を切り替えられるCDラジオの状態マシン図である。

![radio4.png](https://qiita-image-store.s3.amazonaws.com/0/11188/2028d781-f84b-07d9-fe4f-fff2a7b2eb42.png)

on 状態は、コンポジット状態であり、そのサブ状態には、ＦＭ、ＣＤ、ＡＭ、および、ＴＶの４つの状態があり、on状態であれば、それぞれに対応する４つのイベントがいつ起きても、その状態に直接遷移する。たとえば、evCD が起きれば、ＦＭ、ＡＭ、ＴＶいずれからでも、ＣＤ状態に遷移する。

このような場合、状態が４つ、イベントが４つあるので、遷移が４ x ３＝１２本となり、とても見にくいモデルとなってしまう。そんなときに次のモデルのように描くと、すっきり描くことができる。

![radio4_anystate.png](https://qiita-image-store.s3.amazonaws.com/0/11188/7ad2ea85-2e69-ea02-05e6-d903012bf8dd.png)


on状態を起点とする遷移を書くと、それはon状態であればいつでも、という意味になる。on状態のときはどこであっても、evFMがあれば、FM状態に遷移する。

これをAny Stateパターンと言う。 リアルタイムUMLワークショップという本の中で、ブルースダグラスさんが命名している。

リアルタイムUMLワークショップ [大型本]
ブルース・ダグラス (著), 鈴木 尚志 (翻訳)
[http://www.amazon.co.jp/dp/4798121118/](http://www.amazon.co.jp/dp/4798121118/)

このように、Any Stateパターンを使うと、１２本の遷移を４本で済ませることができる。
マリオでStateモナドを理解する（気になる）


# Stateモナド
今まですごいH本を何回読んでも理解できなくて、理解できない度に諦めて、間を置いたらまた解んなくなっての悪循環を繰り返してきたStateモナド。それが今日やっと理解できた気になったので忘れないうちに思い出を綴ります。

Stateモナドは定義にしてたったの数行

```haskell:state.hs
instance Monad (State s) where
 return x        = state $ \s -> (x,s)
 (State h) >>= f = state $ \s -> let (a, newState) = h s
                                     (State g) = f a
                                 in g newState
```

returnはわかります。現在の値を文脈に入れるだけだから。
\>>=がこうなってる理由が全然わからなかった。

# ところでMaybe、List
話は変わってState以外のこれらのモナドについて。これらは包むものが具体的です。
実数データだったり代数データだったりするので、現実世界と関連付けやすく具体的なイメージが湧きやすいです。Maybeは中身があるかどうかわからない箱、リストは候補がいっぱい詰まった箱。どれもわかりやすい。
けど、Stateって箱には何が詰まってるの？

# マリオ
さらに話は変わって、今日ふとマリオを見た時に「マリオにも状態があるんだよなぁ」となんとなく思いました。そしてキノコを食ったらチビからデカに変わるって考えた時に「もしやこれがStateなのか？」と直感しました。
というわけでマリオの変化をコードに落としてみました。

```haskell:mario.hs
import Control.Monad.State

data Mario = Chibi | Deka | Die deriving (Show, Eq)
type Shout = String

kinoko :: State Mario Shout
kinoko = state kinoko'
  where kinoko' s 
          | s == Die  = ("...", Die)
          | otherwise = ("hyahoo!!", Deka)

kuribo :: State Mario Shout
kuribo = state kuribo'
  where kuribo' s
          | s == Deka = ("mamma-mia", Chibi)
          | otherwise = ("...", Die)
```

マリオは状態を持つデータです。チビ時々デカです（よく臨終されてもいます）。そしてキノコがStateモナドです（ついでにクリボーも）。
キノコはチビマリオという状態を受け取り奇声を発しながらマリオの状態をデカマリオ変化させます。そしてくりぼーに当たるとマリオは奇声とともにデカマリオからチビマリオ、チビマリオは臨終に変化させます。
試してみましょう。

```
*Main> runState kinoko Chibi
("hyahoo!!",Deka)
*Main> runState kuribo Deka
("mamma-mia",Chibi)
*Main> runState kuribo Chibi
("...",Die)
```

うまく動いています。

# Stateは状態じゃなくて状態遷移
今まではStateって言うくらいだから、Stateの箱に入ってるものは状態そのもの（つまりマリオ）が入ってるんだっていう前提でコードを理解しようとしてました。理解の方向が全く違ってたので理解ができなかったんだなと。
箱にキノコを入れてみて理解が一気に進みました。

# >>=
箱の中身がわかったところでバインドはどう理解しましょう。
まずは`h s`で現在の状態を取り出します。んでもって次に取り出した値を関数で移します。写した結果、新しい状態遷移が取得できる云々。
こんなことはコードを読めば分かる事なので、具体的な事はキノコを移す関数を作って観察します。

```haskell:tamago.hs
tamago :: Shout -> State Mario Shout
tamago x = state $ \s -> (take 3 x ++ "...Detteiu!!", Die)
```

このタマゴをかけたキノコを食べると、「でっていう」という謎の言葉を残して絶命してしまいます。
試してみましょう。

```
*Main> runState (kinoko >>= tamago) Chibi
("hya...Detteiu!!",Die)
*Main> runState (kinoko >>= tamago) Deka
("hya...Detteiu!!",Die)
```

デカマリオさえも１撃でしとめる卵。サルモネラ菌ってほんと恐ろしいですね。
けど過程がよくわからんかったので、少しずつ展開していきます。

```haskell:tamago-detail.hs
--まずは h を kinoko に展開
let (a, newState) = kinoko s
    (State g) = f a
 in g newState
--sがChibiに適用される予定でkinokoを適用
--aが"hyahoo", newStateがDekaとなる
let ("hyahoo", Deka)
    (State g) = f "hyahoo"
 in g Deka
--"hyahoo"にf (=tamago)を適用
let ("hyahoo", Deka)
    \s -> ("hya...Detteiu!!", Die)
 in g newState
--最後にDeka(元newState)をg(元tamago)に適用
 ("hya...Detteiu!!", Die)
```

状態を遷移させたあとのデータにそれぞれ関数を適用させています。
こうやって見れば他のモナドとやってる事は変わんないのですね。

# さいごに
足掛け数年、キノコという具体的なものを想像してやっとStateが理解出来た気になりました。まさか子供の頃に散々見てたマリオが数十年後にこんな形で役に立つとは思いもしませんでした。
Mysql関係の備忘録

### ユーザの作成

#### GRANT権限を持つユーザを作る

GRANT権限とは。
http://dev.mysql.com/doc/refman/5.1/ja/grant.htmlより引用。

> GRANT ステートメントは、システム管理者が MySQL ユーザ アカウントを作成し、アカウントに権利を与える事を可能にします。GRANT を利用する為には、GRANT OPTION 権限を持ち、また自分が供与している権限を持つ必要があります。REVOKE ステートメントは、アカウント管理者が権限を削除する事に関連し、それを可能にします。詳しくは 「REVOKE 構文」 を参照してください。

要はユーザを作れるという事っぽい。

* ユーザの作成方法

```mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザー名@localhost IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
```

ちなみに、こうすると特定のデータベースだけにアクセス出来るように作れる。

```mysql
mysql> GRANT ALL PRIVILEGES ON データベース名.* TO ユーザー名@localhost IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
```

### GRANT権限を持たないユーザを作る

```mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザー名@localhost IDENTIFIED BY 'パスワード';
mysql> FLUSH PRIVILEGES;
```

### 特定の実行権限だけ持つユーザ

```mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード';
mysql> FLUSH PRIVILEGES;
````

## DBを作る

* 文字コード指定してDB作る

```mysql
mysql> CREATE DATABASE データベース名 CHARACTER SET utf8;
``` 

* 文字コードは後から指定する

```mysql
mysql> CREATE DATABASE データベース名;
mysql> ALTER DATABASE データベース名 DEFAULT CHARACTER SET=utf8;
```

* DBを削除する

```mysql
DROP DATABASE データベース名;
```

## ユーザの権限について

### 権限を追加する場合

```mysql
mysql> GRANT CREATE ON データベース名.* TO ユーザ名@localhost;
mysql> GRANT DROP ON データベース名.* TO ユーザ名@localhost;
mysql> GRANT ALTER ON データベース名.* TO ユーザ名@localhost;
```

### 権限を確認する

```mysql
mysql> SHOW GRANTS FOR ユーザ名@localhost \G
```

### 権限を削除する

```mysql
mysql> REVOKE ALL PRIVILEGES ON *.* FROM ユーザ名@localhost;
mysql> REVOKE 削除する権限 ON 対象(データベース名.*) FROM ユーザー名;
```

## ユーザの削除

* 削除

```mysql
mysql> DELETE FROM mysql.user WHERE user='ユーザ名' AND host='localhost';
mysql> FLUSH PRIVILEGES;
```

* 削除確認

```mysql
mysql> SELECT Host, User, Password FROM mysql.user WHERE user='ユーザ名';
```
XAMPPとEclipseを利用したPHP環境の構築(Windows編)


# XAMPPとEclipseを利用したPHP環境の構築(Windows編)

## Eclipse(PDT)のダウンロード

下記URLからPHP用のEclipseをダウンロードする。
[Eclipse(Pleiades All in One)のダウンロードはコチラ](http://mergedoc.sourceforge.jp/)

バージョンはお好きなものを。
(※グループやチームで環境を合わせる場合は、どれをダウンロードするか合わせておきましょう。)

<pre>例) Eclipse 4.4 Luna の場合
1. "Eclipse 4.4 Luna Pleiades All in One"をクリックする
2. PHP列の"Standard Edition"をクリックしてダウンロード
※Full EditionにするとXAMPPがくっついてきます。
　今回はXAMPPは別で設定するので、ここではStandard Editionを選択することにします。
</pre>

ダウンロードしたzipファイルを解凍すると下記２つのディレクトリが作成されるので、任意のディレクトリに移動しましょう。
例) C:¥develop直下とか

* .metadata.default
* eclipse

## XAMPPのインストール

下記URLからXAMPPをダウンロードしてインストールする。
[XAMPPのダウンロードはコチラ](https://www.apachefriends.org/jp/index.html "XAMPP")

※XAMPPのインストールディレクトリもここではC¥:develop直下に設定した前提で進めます。

インストール完了したら、xampp-control.exeを実行します。
実行するとXAMPPコントローラの画面が表示されます。

この画面でApacheやMySQLを起動することが可能となります。

## 動作確認

EclipseとXAMPPの設定が完了したら、XAMPPコントローラを開いてApacheを起動させます。

Apacheが起動したら、ブラウザから下記URLに接続します。

[http://localhost/](http://localhost/)

XAMPPの画面が表示されれば、設定完了です。

## Eclipseの設定

ワークスペースは"C:¥development¥xampp¥htdocs"を設定します。
(XAMPPで起動しているApacheのホームディレクトリはここになります。)
UnityでMacで作成したプロジェクトがWindowsでコンパイルが通らない

文字コードと改行コードの問題の可能性あり。

改行コードのgitの設定で。
git config --global core.autocrlf input

文字コードは...。

とりあえず、UnityはUTF-8(BOM付き), CR+LFじゃないと駄目っぽい。
Chefで文字列置換をする

chefで文字列置換しようと思ったらちょっとはまったのでメモ
Chef::Util::FileEditを使う

```ruby:
file '/home/user/hogehoge' do
  _file = Chef::Util::FileEdit.new(path)
  #マッチした次の行に挿入
  _file.insert_line_after_match(/regex/, 'newline')
  #マッチしなかったら文末に挿入
  _file.insert_line_if_no_match(/regex/, 'newline')
  #マッチした文字列/行を削除
  _file.search_file_delete(/regex/)
  _file.search_file_delete_line(/regex/)
  #マッチした文字列/行を置換
  _file.search_file_replace(/regex/, 'replace')
  _file.search_file_replace_line(/regex/, 'replace')

  #old_fileを作ったうえで置換
  _file.write_file
end
```

馬鹿っぽいけど正規表現は//でくくんなきゃだめだよね。。。
' 'でくくっててはまった
"mkmf.rb can't find header files for ruby"の対応

今日のはまりどころ

```
$ gem install bson_ext -v '1.10.2'
Building native extensions.  This could take a while...
ERROR:  Error installing bson_ext:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.0 extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h


Gem files will remain installed in /home/ec2-user/.gem/ruby/2.0/gems/bson_ext-1.10.2 for inspection.
Results logged to /home/ec2-user/.gem/ruby/2.0/gems/bson_ext-1.10.2/ext/cbson/gem_make.out

$ less /home/ec2-user/.gem/ruby/2.0/gems/bson_ext-1.10.2/ext/cbson/gem_make.out
/usr/bin/ruby2.0 extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h
```
[ぐぐる。](https://sites.google.com/site/shimesabanote2/linux/centos/ruby_on_rails/raisl_install)

```
$ sudo yum -y install ruby-devel
```
いろんなものが`gem install`/`bundle install`できるようになった。
[Swift]数字を三桁ごとにカンマ区切りにする

よくお金の表記なんかで使う奴ですね。
2,048
こういうやつ。

```
let int = 2048
var num = NSNumber(integer: int)

var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
formatter.groupingSeparator = ","
formatter.groupingSize = 3
        
var result = formatter.stringFromNumber(num)
```

書き方は特にObjective-Cと変わりませんでした。
強いて上げるならば
NSNumberFormatterDecimalStyle
が
NSNumberFormatterStyle.DecimalStyle
という書き方に変わっているところでしょう。
LXC で Java を実行する時は -Xms/-Xmx を付けよう

JavaVM のバグなんですけど、LXC コンテナ上で Java を実行する時にデフォルトのヒープサイズ (物理メモリ×1/64 ～ 1/4) を__コントロールホストの__メモリ量から算出してしまい、実際にコンテナに割り当てた量を上回って起動できないことがあります。Docker も LXC で構成するから同じなのかな?

LXC で Java を使うときは明示的にヒープサイズを指定しましょう。

```
torao@cumin00$ java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

torao@cumin00$ java -Xms64m -Xmx64m -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
```
AndroidStudioからワンアクションでDeployGateにアップロードする

AndroidStudioのあの緑のRunボタンでDeployGateにAPKをアップロードする方法です
![image](http://i.gyazo.com/e4faf73c346e19390667d98512ef8768.png)

# 準備
今回使う物は以下の物です
* AndroidStudio 0.8.5(これ以下でも多分大丈夫)
* Gradle
* deploygate-gradle-plugin

普通にAndroidStudioで開発してて、DeployGate使ってdeploygate-gradle-plugin使ってる人だったらなんも準備必要ないです
deploygate-gradle-pluginをまだ使ってない〜〜〜って人はここら辺をご参照ください
https://github.com/DeployGate/gradle-deploygate-plugin/blob/master/README.md

# 設定する
やり方は簡単です
まずRunボタン左横のプルダウンメニューを開いてEdit Configurations...を選択
![image](http://i.gyazo.com/f701cbb4210090faa79e780217b95be9.png)

次に、開いたウィンドウの左上の+ボタンを押してGradleを追加する
![image](http://i.gyazo.com/8d88c72cfaa9c148953d4cac74eca1b0.png)

![image](http://i.gyazo.com/a65723c212edeed0931c0d412b0192cc.png)

追加するとなんか新しい画面になるので、Nameを適当に入力したり、Gradle Projectを設定(右のフォルダアイコンクリックで選択出来る)したり、gradleのTasksを設定する
Tasksは、こんな感じに実行したいタスクをスペース区切りで書けばOK
```
clean assembleDebug uploadDeployGate
```

最終的にはこんな感じになると思います
![image](http://i.gyazo.com/bab7fe909ee78d4beb3b4655a435c187.png)

これで設定完了！！！！！！！！！！！！！！

# アップロード！
あとは新しく作成したConfigurationを選択した状態でRunボタンを押せば、設定したgradleタスクが実行されて成功すればDeployGateにアップロードされます！
便利！！！
![image](http://i.gyazo.com/d199d3c71a3eee2254a80ff3118c425f.png)
onError, onHandlerNotFound, onBadRequestなどをGlobalSettingsに定義する


# onError, onHandlerNotFound, onBadRequest とかをちゃんと定義したいと思った。

本番環境において、エラーがplay用のやつがでちゃうのはまずい。

* onError : ランタイムエラー
* onHandlerNotFound : NotFound
* onBadRequest : badRequest　

# コード

※　特に ```play.mvc.Results.internalServerError``` という風にに play.mvc.とフルパスで指定してあげる事でIDEがうまいこと補完してくれる。

```java

public class Global extends GlobalSettings {
	@Override
	public Promise<Result> onError(RequestHeader request, Throwable t) {
		return Promise.<Result>pure(play.mvc.Results.internalServerError(
				views.html.error_page.render("エラーが発生しました")
	        ));
	}

	@Override
	public Promise<Result> onHandlerNotFound(RequestHeader request) {
		return Promise.<Result>pure(play.mvc.Results.notFound(
	            views.html.error_page.render("Not Founds!!")
	        ));
	}

	@Override
	public Promise<Result> onBadRequest(RequestHeader request, String error) {
		return Promise.<Result>pure(play.mvc.Results.badRequest("Don't try to hack the URI!"));
	}
}
```

# 本番環境と開発環境でconfを分ける事で、GlobalSettingsを分離する
今後はこういう事も必要になりそう。なのでメモ。
* http://qiita.com/takudo/items/bfe8335673839070bb99

## 参考
* http://stackoverflow.com/questions/14501976/playframework-2-0-onerror-get-request-body
* http://www.playframework.com/documentation/2.0/JavaGlobal
screenで画面共有

screenを開始する
```screen -S <session_name>```

userさんに画面共有出来るようにする
```^a :multiuser on
^a :acladd user```

userさんが、この画面に接続するときのコマンド
```screen -x <myname>/<session_name>```

userさんが画面を操作できないようにする
```^a :chacl user -w "#"```

userさんが「ウィンドウ2だけ」を操作できるようにする
```^a :chacl user +w 2```
LabVIEW Tips: コンピュータ名を取得

# コンピュータ名を取得
Win32APIを叩かずとも、以下のようにすれば実行しているPCのコンピュータ名を取得(GetHostname)できます。

![_GetHostname.png](https://qiita-image-store.s3.amazonaws.com/0/43526/fe90bce6-7bad-ba5d-65be-0296f93955bc.png)

ずいぶん前からこの手法が紹介されているページがあったようですが、今まで気づかなかった。

http://digital.ni.com/public.nsf/allkb/4B3877DB13370AA586257542003945A9

しばらくすると忘れてしまいそうなので、ここに投稿しておきます。

ちょっとだけ違うのは、
Win7で試すとドメイン名までついてくるようなので、WinXPと同じになるようにドメイン名を削除する処理を入れているせいです。
Intel c++ compilerにおける二重ブラケット[[にまつわるC++11規格違反

[N3337](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)(pdf注意)の7.6.1 Attribute syntax and semantics　第6段落によれば
Two consecutive left square bracket tokens shall appear only when introducing an attribute-specifier. [ Note:
If two consecutive left square brackets appear where an attribute-specifier is not allowed, the program is ill
formed even if the brackets match an alternative grammar production. — end note ] 

[[はアトリビュートと共にしか使えない。
従って、operator[]内でラムダ式を直接書く事ができない。

しかしながら手元の icpc version 14.0.3ではこれが通る。
危うく規格違反なコードを書く所であった。

典型的なworkaroundは()でラムダ式を囲ってしまう事だ。
しかしながらこのworkaroundはダサい。
何か良い方法はないものか。
【Google Drive】共有リンクの「ドライブに追加」ボタンでマイドライブに表示されたフォルダ（自分がオーナー）を非表示に戻したい

# 概要
他ユーザーがオーナーのフォルダの下に、自分がオーナーのフォルダを作成した状態では、マイドライブには作成したフォルダは表示されない。
しかし、共有設定の共有リンクを開いた画面で、「ドライブに追加」ボタンを押すと、マイドライブに表示されるようになる。
このとき、「ドライブに追加」ボタンを押す前の状態（マイドライブに非表示の状態）に戻す手順を説明する。
前提として、このフォルダの共有リンクを他ユーザーに通知したために、単純に削除してからの再作成ができない状況だとする。
ただし、この方法は、作成したフォルダのオーナーを、他ユーザーに委譲できる状況でしか使えない。

# 問題
共有リンクの「ドライブに追加」ボタンを押したために、マイドライブに表示されるようになったフォルダを非表示にしたいが、単純にゴミ箱に移すと、自分がオーナーのフォルダの場合、他のユーザーがオーナーのフォルダからも削除されてしまい、誰もアクセスできなくなってしまう。
「ドライブに追加」は、一方向の機能なため、簡単には元の状態に戻せないらしい。（サポート談）

# 解決策
フォルダのオーナーを別ユーザーに変更してよいなら、このフォルダのオーナーを別ユーザーに変更して、マイドライブから削除すればよい。

# 手順
1. いったん、該当フォルダのオーナーを別ユーザーに変更する。
2. マイドライブに表示されている該当フォルダを削除する。
3. 共有アイテムに該当フォルダが表示されるようになるので、共有アイテムに表示されている該当フォルダを削除する。
4. これで、マイドライブ、共有アイテムから、該当フォルダが非表示になったが、他のユーザーがオーナーのフォルダには、該当フォルダが残っているので、「ドライブに追加」ボタンを押す前の状態に戻せた。
5. オーナーが変更されているので、委譲したオーナーに頼んで、自分をオーナーに戻してもらう。（未検証）
Protractor × CoffeeScript × AngularJS （使い方編）

海よりも深い事情のため導入方法より先に使い方を書きます。
導入方法は後で気が向いたら書きます。→ [気が向きました。](http://qiita.com/amoO_O/items/a99e2d4bd873b7c92ec7)

# 概要
以下で紹介する各種コマンドは、promise を返す。
promise はコマンドが実行されることで resolved （解決）される。
promise 達は 内部で勝手に 連結されていくので、
我々が .then などで連結していく必要は無い。
イメージとしては、activeObject パターンに近い。

```coffeescript
describe "top page", ->
  c = (n) -> console.log n
  url = (path) -> "#{browser.baseUrl}#{path}"
  beforeEach ->
    c 1
    browser.get(url "/top").then -> c 2
    c 3
    browser.waitForAngular().then -> c 4
    c 5

  it "LOGIN ボタンを押すと ログイン ページへ遷移する", ->
    c 6
    button = By.id("LOGIN").then (elm) -> c 7; elm
    c 8
    button.click().then -> c 9
    c 10
    expect(browser.getLocationAbsUrl().then (actual) -> c 11; actual).toEqual url "/login"
    c 12
```
上記のテストを実行すると、ログには

1,3,5,2,4,6,7,8,10,12,9,11

の順に表示される（6,7,8 の並びに注意）。
実行順序としては、

- （1,3,5）… beforeEach の各種 コマンドが「登録される」（実行はされない）
- （2,4）… beforeEach で登録したコマンドが実行される
- （6,7,8,10,12）… it 内のコマンドが登録される。ただし、DOM の取得はその場で行われる
- （9,11）… it 内で登録したコマンドが実行される

# コマンド覚書
使うたび追加していく感じで。

## browser
### browser.get someUrl
someUrl へアクセスする（というコマンドを登録する。以下「〜というコマンドを登録する」省略）

### browser.waitForAngular()
angular による画面のレンダリングが終わるのを待つ

### browser.getLocationAbsUrl()
現在の URL を取得する

## By
本当は小文字の by というグローバル変数も用意されているが、by は CoffeeScript の予約語なので、大文字の By の方を使う。使い方は全く同じ。

By の各要素は関数であり、基本的には locator と呼ばれるオブジェクトを返す。あとで説明する element という関数にこの locator を渡すことで、該当する DOM 要素を検索し、それに対していろいろな指示を出すことが可能となる。

```coffeescript
locator = By.id "hoge"
hoge = element locator

# つなげて書くと、
hoge = element By.id "hoge"
```

document.elementById に似ているので覚えやすい。

### By.id someId
someId を使って要素を検索する（という locator を返す）

## element
locator を受け取って、ElementFinder クラスのインスタンスを返す。
ElementFinder のインスタンスは再び element という要素を持ち、 子要素に絞って検索することが出来る。

```coffeescript
parent = element By.id "parent"
child = parent.element By.id "child"
```
Tips: Android のコードスタイルのハンガリアン記法について

[Android Open Source Project のコーディングガイドライン](https://source.android.com/source/code-style.html) には、いくつかのハンガリアン記法があります。

`public`でなく、かつ`static`でないフィールドには`m`を、static なフィールドには`s`をつけるのが Android 流のハンガリアン記法のようです。

が、そもそも Java を使って、かつ IDE を使っている時点で、ハンガリアン記法を取り入れるメリットはそんなに無いように思われます。

このあたりは、[Twitter での Jake Wharton と Romain Guy のやりとり](https://twitter.com/JakeWharton/status/497243553311907840)の中でその経緯が語られています。

このやりとりを要約すると、以下のような内容です。

```
Jake Wharton: Android の Java にハンガリアン記法を使うことにしたやつ謝れ。
Romain Guy: 激しく同意。C++やってる人とか Vimmer に Java を書かせるとこうなる。IntelliJ ならプレフィクスのサポートあるから助かってるけど。
Jake Wharton: たまに公開 API にプレフィクスついたやつが露出しとるけどな。"this" でええやん。
James Wald: そんなことより、SDK アップデートしたらローカルの m2 リポジトリがなくなるとかのほうがよっぽどえらいこっちゃで。
Jake Wharton: ほんまやで。
```

:)
Ruby on Rails を使ったチーム開発の現場に入る新人プログラマに最低限読んで欲しいもの

## この記事の趣旨

今まで長く一緒の現場で働いていたメンバーしかいなかったチームが、僕らのチームに新しいメンバーを迎え入れる際に、僕らが大事にしていることを知ってもらうために、最低限読んでおいてほしいものをまとめたものです。

あくまで、自分たちのチーム目線のもののため、読まれる方によってはそぐわなかったり、過不足があったりするかもしれませんが、備忘もかねて投稿します。
おすすめの記事や良書などあればコメントいただけると幸いです。

## チームの特徴

* 僕らは Ruby on Rails を使ったアプリケーション開発を行っているチームです。
* 小さいイテレーションを回して継続的に価値を届けるスタイル（いわゆるアジャイル開発）で開発を行っています。
* Git および GitHub でソース管理を行い、 Pull Request でコードレビューを行っています。

## Git 関連

### 基礎

Git (ないし GitHub )使ったこと無い！という人はこちらから。

* Git初心者のための資料まとめ http://morizyun.github.io/blog/git-biginner-web-develop/

### flow

僕らのチームは git-flow と GitHub flow を併用したような形で運用しているので、以下の二つ。

* GitHub flow の説明 https://gist.github.com/Gab-km/3705015
* いまさら聞けない、成功するブランチモデルとgit-flowの基礎知識 http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html

## Ruby on Rails

以下のいずれかを読んでやっておいてほしい。

* Ruby on Rails チュートリアル http://railstutorial.jp/
* RailsによるアジャイルWebアプリケーション開発 第4版http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06866-9

## Linux

Linux 実践入門 http://gihyo.jp/book/2013/978-4-7741-5813-6?ard=1393804409

## その他

* アジャイルサムライ http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06856-0
* リーダブルコード http://www.oreilly.co.jp/books/9784873115658/

## 参考記事

* Rails開発に加わる前に学んで欲しいこと http://qiita.com/reikubonaga/items/60b4f6ee0a86ed06e83b
エミュレータが横向きにならない場合

eclipseのAndroidのエミュレータではCtrl+F12　or Ctrl+F11でエミュレーターを
横向きにできる。
しかし、エミュレーター自体は横向きになっても、
画面が縦のままになってしまっていることがある。
こちらはAndroid　APIがlevel 19以上、Android4.4.2の場合のバグだそうです。
APIが18をターゲットに設定すると、エミュレーターを横向きにした時に、画面を横向きにすることができます。

API18にするって、どうするの？
eclipse→ウィンドウ→Android SDKマネージャーを起動する。
一覧からAPI18などの別のものを選択して、インストールを行う

API18のエミュレーターをどうやって設定するの？
eclipse→ウィンドウ→Android 仮想デイバスマネージャーを起動する
新規作成で、ターゲットの項目にて、上記SDKマネージャーで新しくインストールした
API18のものを選択する
Chrome Extention の Postman - REST Client (Packaged app) で cURL コマンドを直感的に生成する

まず Chrome Extention の Postman - REST Client (Packaged app) を Install します。
![スクリーンショット 2014-08-07 18.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/18869/5322b3f4-3f49-69dd-72d0-7e7bebd469f4.png)

その後、HTTP request に送信したい値を入力し、画面下部の Preview を押してからから画面上部の Curl を押すと cURL コマンドが出てきますよと。

![スクリーンショット 2014-08-07 18.20.22.png](https://qiita-image-store.s3.amazonaws.com/0/18869/25c05015-a336-eb1a-19aa-57cd7b857b3d.png)
AWSのLaunchConfigをLaunchConfigurationNameで絞るコマンド

AWSのLaunchConfig一覧をLaunchConfigurationNameで絞るコマンド

```
aws autoscaling describe-launch-configurations \
    | jq '.LaunchConfigurations[] \
    | select(.LaunchConfigurationName \
    | contains("*LAUNCH_CONFIG_NAME*")) \
    | .LaunchConfigurationName ' \
    -r \
```

selectした後にcontainsする技は

[ようへいの日々精進 XP - よく使う aws-cli 「私的」コマンドチートシートとか jq の使い方とか](http://inokara.hateblo.jp/entry/2014/01/17/163949)

を参考に。[Kappa](http://qiita.com/inokappa)さんありがとうございます！
iOS端末の向き(orientation)を強制的に変更する方法


iOS6,iOS7の端末の向きを強制的にPortrait方向に変更する、一番簡単な方法は下記のようにする。

```objectivec:snippet
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationPortrait] forKey:@"orientation"];
```

UIDeviceのproperty「orientation」を直接変更してしまう。

iOSの向き（orientation）の制御は画面ごとに、orientationを許すだとか、ContainerViewControllerの場合はなどなど、凝りだすと以外とややこしい。

iOS5と6で大幅に仕様が変更されていることもあるので、Googleなどで記事を検索する場合はiOSのバージョンと記事の作成日時はチェックしておいたほうがいいでしょう。
Hashで全要素の値がfalseであることを確かめるには

#`Hash#any?` ではHashの全要素の値が `false` でも `false` が返ってこない
ブロック無しの `Hash#any?` を使えば、Hash の全要素の値が `false` ならば `false` を返してくれるのではないかとイメージしました。
残念ながら `Hash#any?` は実装されておらず `Enumerable#any?` が呼ばれます。このため、値だけを評価するのでは無く、キーと値のペア配列 *自身* を評価するように働きます。
このため、

```ruby
{a: false, b: false, c: false}.any? 
# == [[:a, false], [:b, false], [:c, false]].any?
#=> true
```

となってしまい、当初にイメージしていた `false` が返ってきてくれません。

#対策０：`Hash#values` を使って値だけの配列を作る（追記）
@Ueno1969 さんコメントのやり方です。

```ruby
{a: false, b: false, c: false}.values
#=> [false, false, false]
```

これをメソッドチェーンして `Enumerable#any?` を使えば、求めている `false` が返りますね。

```ruby
{a: false, b: false, c: false}.values.any?
#=> false
```

このやり方が一番キレイだと思います。
同様に `Hash#values` から `Enumerable#all?` へのメソッドチェーンなども使えますね。

#対策１：ブロックで処理
キーと値のペアを評価したかったのではないので、値を呼んで評価しましょう。

```ruby
{a: false, b: false, c: false}.any? { |k, v| v }
# = [false, false, false]
#=> false
{a: false, b: false, c: true }.any? { |k, v| v }
# = [false, false, true]
#=> true
```
##るりま引用
>##instance method Enumerable#any?
```ruby
any? {|item| ... } -> bool
```
ブロックを伴う場合は、各要素に対してブロックを評価し、すべての結果 が偽である場合に false を返します。ブロックが真を返した時点 で、ただちに true を返します。
例:

>```ruby
p [1, 2, 3].any? {|v| v > 3 }   # => false
p [1, 2, 3].any? {|v| v > 1 }   # => true
```
[instance method Enumerable#any?](http://rurema.clear-code.com/1.9.3/method/Enumerable/i/any=3f.html)

#対策２：モンキーパッチ
モンキーパッチは Ruby のコアライブラリの仕様を書き換えます。require した gem などに影響して、思わぬところで不具合が出るリスクがあります。実務で使うことは避けた方が良いでしょう。

```ruby
class Hash
  alias :__any__? :any?
  def any?
    self.__any__? { |k, v| v }
  end
end
```

では使ってみましょう。

```ruby
{a: false, b: false, c: false}.any?
#=> false
{a: false, b: false, c: true }.any?
#=> true
```

もちろんこれでは `any?` にブロックを付けられないので不完全ですが、ひとまずはこれで十分でしょう。

#訂正：
冒頭のスクリプトですが、当初は

```ruby
{a: false, b: false, c: false}.any? 
# == [:a, false, :b, false, :c, false].any?
```
と書いていました。しかし

```ruby
{a: false, b: false, c: false}.all?
#=> true
```
なので、 `Hash` から `Enumerable` を扱うときに、キーと値のペアを作る `Hash#to_a` が使われて

```ruby
{a: false, b: false, c: false}.any? 
# == [[:a, false], [:b, false], [:c, false]].any?
```
と解釈しないとおかしい事が分かります。

訂正いたします。m(_ _)m
JIRAのワークフローをBug Fix用にカスタマイズする


# なにそれおいしいの
JIRAはAtlassianのIssue Tracking Serviceで、弊社もRedmineから徐々に移行中。移行の理由はWYSWIG EDITOR（画面上でみんなで見ながらその場でいろいろ編集）が強いことと、他の開発ツール（主にBitbucket、HipChat、Confluence）と連携が取れること。

JIRAにはIssue Tracking用に予めWorkflowが用意されているが、けっこう簡単にカスタムして使うこともできるので、チームやその時やりたいことに合ったWorkflowを定義することでより効果的に運用できる。

今回はリリースに向けてアプリのテストを開始したので、開発タスクとは別にBug Trackign用のWorkflowを定義してみた。

# JIRAのWorkflowを編集する
必要な作業は以下の通り（新規のWorkflowを作る場合）

1. JIRAのAdministration（右上のコグ）からIssuesを選択
2. Add Workflowで新規のWorkflowを作成
3. Workflowを作る（後述）
4. JIRA ProjectのAdministrationで作成したWorkflowをアサインする
5. （必要があれば）既存のIssueのStatusを変換してDeploy

## Workflowの編集
WYSIWYGなダイアグラムエディタがあるので、ステップ（ステータス）を定義して間をTransitionでさくさく繋いでいく。

![Screenshot 2014-08-07 17.10.46.png](https://qiita-image-store.s3.amazonaws.com/0/46482/d3ade4e6-edb7-473b-d5e1-ad93978b6808.png "Screenshot 2014-08-07 17.10.46.png")

編集中のWorkflowはDraftなので、Publish Draftして公開。すでにActiveなWorkflowの場合はそのまま変更が適用されるハズ。

## 今回の変更
最初チーム内ではJIRAのSimple Issue Tracking Workflowを使っていたが、Start → Start Working → In Progress → Doneという超シンプルなものだったので、Bug Tracking用に以下の項目を追加した。

- BugのステータスはOpen（Active）→Resolved→Closedで遷移
- ResolveされたBugは必ずVerifyされてClosedになる。ClosedはThis bug is no longer an issue.の意味。
- ResolveのResolutionは複数あり、Fixed、Won't Fix（直しません）、By Design（仕様です）、Duplicate（重複しています）、External（外部要因です）、Postponed（次のマイルストーンに延期）、Not Repro（再現しない）など。これらは同じJIRAのAdministrationの、Issue AttributesのResolutionで追加できる。理由はResolveする際のコメントで追加する。
- Resolveする時はOpenerにBugを戻して、ResolutionがOKか確認してもらう仕組み。
- ワークフローとは別にJIRAユーザーとしてTriageというユーザーを作成。対策を決めるのにディスカッションが必要なものはそこにAssignした上で、Bug Triage Meetingでディスカッションする。

# 雑感
- 編集はかなり簡単。適用もそんなに難しくないので誰でもできるだろう。
- ただしある程度回しながら全員がワークフローに慣れないと、ちゃんと運用されない。スクラムとかを活用するべし。
- うちのチームではテスト期間中は毎日Bug Triage Meetingをやることにして、一応新規Bugは全て見る＆既存Bugのステータスをチェックすることにした。システムまかせは便利なのだけど、ワークフローのどこかで淀んだりする傾向があるのでそういうのをまさにスクラムやBug Triageでカバーするのがよい気がしている。コミュニケーションによってアイデアも生まれるし。
- 外部ベンダーさんにテストを依頼してたりするチームの場合は、HipChatの個別の部屋に特定JIRA Projectのアップデート流すみたいな連携をしたいんだが、できるんだっけか（調べる）
- 垂直に立ち上がるBug！！燃え上が〜れ〜燃え上が〜れ〜
![Screenshot 2014-08-07 17.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/46482/82e0c10c-65f0-6aa0-eaad-8bd1a9285f59.png "Screenshot 2014-08-07 17.43.22.png")


以上。
Document Base Applicationで気をつけること


Document Base Applicationを作っていると、まず`Application`(`NSApplication`のサブクラス)、`myDocument`(`NSDocument`のサブクラス)と`WindowController`のサブクラスをどう協調させていけばいいかに悩みます。

そこで、まずはどういう順番で、どのクラスのどのメソッドが呼ばれるか調べてみました。
	結果は以下の通りでした。

1.	Application - init
1.	Application - awakeFromNib
1.	MyDocument - init
1.	MyDocument - makeWindowControllers
1.	WindowController - init
1.	WindowController - awakeFromNib
1.	MyDocument - awakeFromNib
1.	Application - applicationDidFinishLaunching


あとは `init`と`awakeFromNib`の関係ですが、

* `init`は、`IBOutlet`ではないインスタンスの初期化メソッド
* `awakeFromNib`は、`IBOutlet`とインターフェースビルダーでバインドしたオブジェクトがセットされた後呼び出され、outletの設定・初期化を行うためのメソッド

と、考えておけば良さそうです。
そう考えると、MyDocumnent.xibのFile's OwnerであるMyDocmentクラスが、xibの内部にある各オブジェクトの初期化が終わって、アウトレットとのバインドが終わるまで`awakeFromNib`が呼ばれない事に辻褄が合います。
PerlからODBCでSQL Serverのデータを取得

## はじめに
PHPでLinuxクライアントからSQL Serverを見に行くことはできるのですが、
SQL Server側のデータが

- 日本語テーブル名
- 日本語データベース名
- 日本語カラム名
- 3万件以上

という環境だとまともに取得してくれませんでした。

PHP本体側のバグらしいそうで多分、
内部EncodingがUnicode化されたPHP7を待つ他ないという状況です。

PHP側のバグであればPerlやPython、Rubyだと問題ないのだろうかと試してみたくなりました。
今回はPerlの入門も兼ねてPerlの接続にチャレンジしてみることにします。

## 接続方法
今回は、FreeTDSとunixODBCを使って接続する方法を取ります。
図解すると下記のようになります。

```:接続方法
DBD::ODBC(Perl) <-> unixODBC <-> FreeTDS <-> SQL Server
```

unixODBCやFreeTDSのインストールや設定は
下記の私の投稿をご覧ください。
[LinuxからSQL ServerにODBCで接続する](http://qiita.com/arachan@github/items/5863c945dbe7507975d8#4-3)
unixODBCやFreeTDSの設定が終わっているものとして次に進みます。

## DBD::ODBCをGetする

### Perlの確認
Linuxであれば相当絞った構成にでもしない限りPerlは入っています。
一応、Perlのバージョンの確認をしましょう。

```pl:Perlのバージョン確認
$ Perl -v

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-th
read-multi...(省略)...

```
入っていますね。

### CPANでCPANM


#### cpanm をインストール

```shell-session:cpammをインストール
# cpan App::cpanminus
```

#### makeとunixodbc-devをインストール

私の環境下ではインストールされていなかった。

CPANのコンパイルにmakeが必要です。

```shell-session:makeとunixodbc-devをインストール
$ sudo apt-get install make unixodbc-dev
```

#### DBD::ODBCをインストール

```shell-session:DBD：：ODBCをインストール
# cpanm DBD::ODBC
```
参考サイト
[Installing Perl Module](http://www.cpan.org/modules/INSTALL.html)

#### DDPをインストール

配列の中身を見せてくれる便利なライブラリーです。
日本語文字列も文字化けせずに表示してくれます。

```shell-session:DDPインストール
# cpanm DDP
```
参考サイト
[Perlのデータ構造をダンプするためのモジュール群](http://hirobanex.net/article/2013/09/1380449012)


これで取得完了。
ソースを書いてみます。



## PerlでSQL Serverにアクセス
早速、47万件の商品マスターを表示させます。
まずは完成コード。

```pl:PerlでSQLServerに接続　perl-mssql.pl
# !/usr/bin/perl -l
use strict;
use utf8;
use DBI;

my $dbh=DBI->connect('dbi:ODBC:estimate','sa','password') or die $!;
my $sth=$dbh->prepare("select [商品名1] from [システム].[dbo].[商品] where 商品ID='1000125'") or die $dbh->errstr;

# 出力エラー対策
$sth->{LongTruncOk}=1;
$sth->{LongReadLen}=2000000;

$sth->execute or die $dbh->errstr;

while(my $arrayref = $sth->fetchrow_arrayref){
        use DDP;
        p $arrayref;
}

$sth->finish;
$dbh->disconnect;
```
実行結果

```pl:実行結果
$ perl perl-mssql.pl
\ [
    "日本語の商品名"
]
```

### 解説

下記の部分にまず注目
大量のデータを見に行くときにLongTruncOkをEnableに
LongReadLenの長さを20000ぐらいに延長しておく必要があります。

```pl:出力エラー対策
# 出力エラー対策
$sth->{LongTruncOk}=1;
$sth->{LongReadLen}=2000000;
```

これを設定しないと以下のようなエラーが出ます。

```shell-session:LongTruncOKとLongReadLenを設定してない時のエラー
DBD::ODBC::st fetchrow_arrayref failed: st_fetch/SQLFetch (long truncated DBI attribute LongTruncOk not set and/or LongReadLen too small) (SQL-HY000) at perl-mssql.pl line 15.
```
参考サイト
[Database fetchrow_array failed long truncated DBI attribute - Stack Overflow ](http://stackoverflow.com/questions/12315397/database-fetchrow-array-failed-long-truncated-dbi-attribute)



## 結論
結局、Perlで47万件のデータを何の問題も無く見れてしまった。
Perlの勝利！！
2次元配列をReDimする

うん、馬鹿馬鹿しいね。でも、VB6 からコンバートしてたら、そんなソースができちゃったんだ

で、関数作った。

```vbnet
    Public Sub Redim2(Of t)(ByRef array(,) As t, w As Integer, h As Integer)
        If array Is Nothing Then
            ReDim array(w, h)
        ElseIf array.GetUpperBound(1) < h Then
            ReDim Preserve array(array.GetUpperBound(0), h)
        ElseIf array.GetUpperBound(0) < w Then
            Dim newarray(,) As t = New t(w, array.GetUpperBound(1)) {}
            For i As Integer = 0 To array.GetUpperBound(0)
                For j As Integer = 0 To array.GetUpperBound(1)
                    newarray(i, j) = array(i, j)
                Next
            Next
            array = newarray
        End If
    End Sub
```
Rails+Carrierwave+fog+Heroku+S3でハマったメモ


Herokuにのっけている、Railsのアプリケーションでアップロードした画像をS3に保存したい。

その中でいろいろハマったのでメモ。

実装方法は

[Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp](http://www.workabroad.jp/tech/1118)

[RailsとCarrierWaveでAmazon S3に画像を保存する | Workabroad.jp](http://www.workabroad.jp/posts/1186)

などを参考にした。

今回はその中でハマったことを書いていく。

# ハマったこと

## S3側でやること
Security Credentials → Access Keysから Create New Access Key を押す → Download Key Filesを押す

csvファイルがダウンロードできる。

> You will not have access to this secret access key again after this dialog box closes

らしい。

- [Managing Access Keys for your AWS Account - Amazon Web Services](http://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.html)

- [Coming soon! An important change to how you manage your AWS account’s access keys - AWS Security Blog](http://blogs.aws.amazon.com/security/post/Tx1JPM2L6BKDBK5/Coming-soon-An-important-change-to-how-you-manage-your-AWS-account-s-access-keys)



## carrierwaveで実装するとき

- multiport => true を入れる。

## ファイル名が日本語である場合の対応

```ruby:app/initializers/carrierwave.rb
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
```

- [CarrierWave - ガイアが俺にもっとコード書けと囁いている](http://f96q.github.io/blog/2012/08/02/carrierwave/)


## Rmagickを使うとstack level too deepが出た

のでmini_magickをやりました。

## Herokuにあげるときの注意点

```ruby:app/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => ENV['AWS_ACCESS_KEY'],
    :aws_secret_access_key  => ENV['AWS_SECRET_KEY'],
    :region                 => ENV['AWS_REGION']
  }
  
  	config.fog_directory = ENV['S3_BUCKET_NAME']
  end
  config.cache_storage = :fog #キャッシュの場所をS3に変更
  config.cache_dir = "#{Rails.root}/tmp/uploads" #for Heroku
end

```

- [Ruby - HerokuでCarrierWaveを使う場合に注意すること - Qiita](http://qiita.com/Oakbow/items/802da14fa3cf67763ba7)

- [Configure Carrierwave for Amazon S3 Storage and Heroku](https://gist.github.com/cblunt/1303386)

- [CarrierwaveでS3にアップロードさせるとき、キャッシュもS3に置く - Qiita](http://qiita.com/doima_/items/677a8acbcaf018dd9ec9#comment-f2a6a5996b005d2b9001)
Google スプレッドシート のアドオン「Google Analytics」の覚書

基本的なアドオンの入れ方・使い方は下記が詳しいです。

* [Google スプレッドシートで Analytics の集計をする | SlackHack](http://slackhack.net/863.html)
* [Google Drive スプレッドシートアドオン「Google Analytics」を試してみた | infoScoop開発者ブログ](http://www.infoscoop.org/blogjp/2014/04/25/google-drive-%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3%E3%80%8Cgoogle-analytics%E3%80%8D%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF/)

困ったら、とにかく[Google公式ガイド](https://developers.google.com/analytics/devguides/reporting/core/v3/reference)をチェック。
（ここでいいのか謎ですが、とても役に立ちます・・）

実際に使ってみて、覚えておきたいことをメモしていきます。

# Google スプレッドシート のアドオン「Google Analytics」の覚書

* 期間を指定する *Start Date/End Date* より *Last N Days* の設定が優先される

* *Filters* を複数指定したいときは、; で区切ると AND 条件に、, で区切ると OR 条件になる。その際スペースを入れないこと。
（例）
`ga:sessions==1;ga:sessions==3`　→　セッション数が 1 かつ 3。何も表示されず。
`ga:sessions==1,ga:sessions==3`　→　セッション数が 1 か 3 のものが表示。
`ga:sessions==1; ga:sessions==3`　→　エラー。

* *View (Profile) ID / ids* の数字は、レポートの URL の p の次の 8 桁の数字のこと
（例）
`a33333333w44444444p55555555`　→　ga:55555555 と設定してやれば OK。

* *Filters* は正規表現が使える。
その際には、== と != ではなく =~ と !~ を使う。
（例）
`ga:source=~(.*)search(.*)`　→ 「search」という言葉が含むものを出す
`ga:source!~(.*)search(.*)`　→ 「search」という言葉が含まれていないものを出す
※「含む」系のときは正規表現を使うまでもなく =@ と !@ でよいようだ。
* *Sort* で降順にしたいときは - を追加する
（例）
`-ga:sessions`　→ セッション数が多い順に表示
* ga:goalXXCompletions などで、 XX のところには目標1なら 1 が入る（01じゃない）
（例）
`ga:goal1Completions`　→ 目標1の完了数
`ga:goal15Completions`　→ 目標15の完了数
* Run Report をしても、Report Status と出たまま真っ白な小さいウィンドウが表示されるだけで動かなくなってしまった時はきっとFirefoxを使っているときだと思うのでChromeを使う。
VB.NETにおける配列、辞書の初期化リテラル

ふとJavaScriptみたくリテラルによる配列や辞書の初期化ができないかと思い調べてみたら、できることが分かったのでメモを残す。
http://msdn.microsoft.com/ja-jp/library/dd293617.aspx

配列の初期化

```lang:VB.NET
Dim names As New List(Of String) From _
                                 {"yamada", "tanaka", "sato"}
```


辞書の初期化

```lang:VB.NET
Dim employees As New Dictionary(Of String, String) From _
            {{"A0001", "yamada"}, _
             {"A0002", "tanaka"}, _
             {"A0003", "sato"}, _
             {"A0004", "suzuki"}}
```

JavaScriptに比べたらちょっとごちゃつくけど、.Add()よりはマシだと思う。
ユニットテスト時の初期化等活躍しそう。
Qiitaで箇条書きを階層的に記述する

自分用にメモです。

Qiitaで箇条書きをするときは

```
* 項目
```

のようにしますが、2階層、3階層と階層を深くしたい場合は `*` の前に半角スペースを**4つずつ**入れます。

```
* 1階層
    * 2階層
        * 3階層 ・・・
```

* 1階層
    * 2階層
        * 3階層 ・・・

このようになります。
たとえば3階層目の場合は、5～7個のスペースでも良いようですが、階層を多重にする場合は「4つずつ」と覚えておくのがわかりやすそうです。

※ [こちら](http://blog.qiita.com/post/76302336136/easy-list-editor-is-out)を参考にしました。