OmniAICreator/Qiita-1.07M huggingface dataset:
ChromeExtension(BrowerAction)で、AjaxでJSONをやりとりする簡単なサンプル


### 概要
* BrowserActionのアイコンをクリックすると、Ajaxでサーバ(PHP)と通信する。
* サーバから数値がJSONで返答され、その結果をBrowserActionのボタンに表示する
* ポップアップ画面は表示しない

![browseraction1.png](https://qiita-image-store.s3.amazonaws.com/0/50690/52ce2e00-9264-b9fb-958d-abee0af7611b.png)

クリックすると、サーバから数値がJSONで返答され、ボタンに表示される↓

![browseraction2.png](https://qiita-image-store.s3.amazonaws.com/0/50690/dde8ae9b-fcd1-dd80-ffbe-0dc3d80ef8c1.png)


### コード


```lang:manifest.json
{
    "name": "Ajax Sample",
    "version": "0.1",
    "manifest_version": 2,
    "description": "Ajax Sample",
    "permissions": ["http://sample.info/*"], 
    "browser_action": {
        "default_title": "Ajax Sample"
    },
    "background": {
	"scripts": ["background.js"]
    }
}

```

```lang:background.js
chrome.browserAction.onClicked.addListener(function(tab){
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function(){
		if(xhr.readyState == 4 && xhr.status == 200){
			chrome.browserAction.setBadgeText({text:""+JSON.parse(xhr.responseText).num});
		}
	}
	var url = 'http://sample.info/ajax.php';
	xhr.open('GET', url, true);
	xhr.send();
});
```

```lang:ajax.php
<?php

echo json_encode(array('num' => 1));
```
knife solo prepareで準備したサーバでrvm操作したらエライことになった

## 現象

```/bin/bash
$ knife solo prepare root@XXX.XXX.XXX.XXX -i ~Hirata/.ssh/KEY.pem

$ knife solo cook root@XXX.XXX.XXX.XXX -i ~ Hirata/.ssh/KEY.pem
Running Chef on XXX.XXX.XXX.XXX...
Checking Chef version...
ERROR: RuntimeError: Couldn't find Chef >=0.10.4 on XXX.XXX.XXX.XXX. 
Please run `knife solo prepare root@XXX.XXX.XXX.XXX -i /Users/Hirata/.ssh/KEY.pem` 
to ensure Chef is installed and up to date.
```

knife solo prepare 〜で初期化したサーバにおいてrvmでrubyをアップデートしてgemを使った後にローカルよりcookしたところ、上記のエラーが出ました。

## 原因
これは**rvmとchefのrubyの違い**によるものでした。
非常に迂闊でした・・・。
chefはprepareでリモートインストールすると、同時にrubyや一部gemをインストールします。
しかしこれは普通のrubyとは異なり、組み込みのrubyなのです（prepareが終わったあとリモートサーバでrubyと打ってもパスは通っていません）。
なので、その上からyumやrvmで普通のrubyをインストールすると、ラッパー情報（envのパスやrvm.sh）が邪魔をしてしまい、欲しいgemなどが見つからなくなる、というからくりがあります。
従って、今回のようにchefをリモート実行すると、ssh接続のログイン時シェルに従って転送した組み込みruby向けパスではなく普通のrubyとgemのパスを見てしまいます。
その結果、インストールしたはずのchefが見つからないよ？？？と怒られてしまうわけです。

## とりあえずの回避方法(1)
とりあえずの回避方法1つめは、普通のrubyを削除して組み込みのみで使うと言うもの。
chef以外でrubyを使わないのであれば、これが一番安全で簡単です。
おとなしくrvmにはseppukuしてもらいましょう。

## とりあえずの回避方法(2)
とりあえずの回避方法2つめは、ラッパーシェル(rvm.sh)を変更すると言うもの。
Capistrano3を使う場合などどうしても新しいrubyが欲しい場合は、こうするしかありません。
しかしこれは面倒で危険です。
ここまでしてchefを使う理由はないなぁ、というくらいに大変です。

## とりあえずの回避方法(3)
rvmのインストール方法にもよりますが、sudoを使うなどしてrvm.shを読まないユーザでchefを実行すると言うものがあります。
ただし/etc/profile.d/に放り込んでいて無条件に読まれるような設定の場合は、意味が無い場合もありますのでご注意ください。

## おそらくの抜本的回避方法
knife solo prepareを使わないでchefや必要なライブラリをrvmとgem経由で入れるというのも理論上できるはずですが、これ一筋縄でいかないんですよね。
現在深く調査中ですが、ここまでするくらいならやっぱりchefなんかｒｙ

## 最後に
個人的には、rubyを他に用いる場合chefを諦める方がいいと思います。
組み込みと本流で2つのバージョンのrubyを入れるということ自体本来はナンセンスな話ですし。
そもそも、AWSやXenを使っているなら、AMIやイメージと言う単位で冪等性は確保できますし、簡単で安全です。
デバッグ工数とか必要ないですもの・・・。
ソースとして設定を保存したいという気持ちは分からないでもないですが、あまりにも面倒すぎます。
jQuery でチェックボックスの操作まとめ


いつも忘れるのでまとめました。

# チェックされているかどうか調べる

```javascript
is_element_checked = $element.is(':checked');
```

このとき、もし `$element` が複数の要素とマッチした場合には、ひとつでも `:checked` な要素があれば `true` が返ります。

# すべてがチェックされているかどうか調べる

すべての要素がチェックされているかどうかを知りたい場合は、下記のようにひとつでも `:not(:checked)` な要素があるかどうかを調べて真偽を反転すれば実現できます（可読性がイマイチ……。もっといいやり方あったらコメントで教えてください。 `$elements.areAll(':checked')` みたいな感じのインターフェイスほしいですね）。

```javascript
are_all_elements_checked = !$elements.is(':not(:checked)')
```

# チェックをつける/はずす

[CSSは分かるけどjQueryは苦手……という人が .attr()と .prop()に親しんでくれるといいなーと思って書きました。 | Ginpen.com](http://ginpen.com/2011/10/12/jquery-attr-prop/) という記事が参考になりました。 jQuery 1.6 系からは下記のようにします。

```javascript
$element.prop('checked', true);
```

# よくある全選択/全解除の実装

こんな感じでイベントが発火した要素のチェック状態を子に引き継ぐとよいと思います。

```javascript
$parent.change(function(){
	$children.prop('checked', this.checked);
});
```
iOS8から従来の方法で横画面固定をすると黒帯が入る件

先日Xcode6にアップデートした時に起きたので忘れないうちに書いておきます！！

iOS7までの従来の方法で横画面固定をしていたのですが、iOS8に対応するべくXcode6にアップデートして実行すると
![iOS Simulator Screen Shot 2014.09.30 16.52.43.png](https://qiita-image-store.s3.amazonaws.com/0/44564/851ed100-3d6f-f5b1-edb5-970013b8b38c.png)

なんじゃこりゃぁぁぁぁ！！！！！！！！！！
仕様なんか変わったのか！？！？バグか！？！？ああん！？！？

って事で調査しました。

結論だけ申し上げますと、
AppDelegateのdidFinishLaunchingWithOptionsに定義していた

self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
の下に
[self.window setFrame:[[UIScreen mainScreen] bounds]];
を追加して対処しました。

![iOS Simulator Screen Shot 2014.09.30 16.55.34.png](https://qiita-image-store.s3.amazonaws.com/0/44564/cfe78a90-9e53-569a-2638-f5ca17c203e8.png)

これでよし。
原因が分かるまで手こずった事は内緒にしたいです。
Struts2のActionクラスから別のクラスへValidationを定義する

# ActionクラスとValidationの関係

Struts2の入力値検証、Validationの機能はActionクラスに対して定義します。
設定内容はxmlで記載するか、アノテーションで記載するかのどちらかを選べます。
ここではアノテーションベースのValidation定義の方法ならびに、Actionクラス以外にValidationを定義する方法を紹介します。

## ActionクラスにValidationを定義したときの振る舞い

Actionクラスは、リクエストパラメータの値をActionクラスのフィールドへ格納しようと試みます。この時にValidationの定義がある場合は、Actionクラスのメソッドを実行する前にValidationが実行されます。

もしValidationの結果、なんらかの入力チェックに引っかかった場合はActionクラスのメソッドが実行されずに、Actionクラスは"input"(ActionSupport.INPUT)の値をreturnします。
※このinputへ戻す動きは、Struts2標準インターセプタの workflowインターセプタによって制御されています。

そのため、Actionクラスのresultに"input"(ActionSupport.INPUT)の値が定義されていない、または継承したパッケージにも未定義である場合は、「resultの値に input が定義されてないよ(´・ω・`)？」となり、実行時の例外となってスタックトレースを含んだエラー画面を出力します。

## Actionクラスと入力フィールドの関係

Struts2は[OGNL](http://commons.apache.org/proper/commons-ognl/)を利用して、リクエストパラメータをActionクラスのフィールドへ自動変換します。これにより、リクエストパラメータは次のことが可能です。

+ オブジェクトの階層をピリオドで表現できる
+ 配列の操作も可能

例えば、画面から送信されたリクエストパラメータが次の値になっているとします。

```java
user.username=Capybara
```

Struts2はこの値を受け取ると、次の動作をします。

1. 動作したActionクラスのuserフィールドを探す。
2. userフィールドに定義したクラスのusernameフィールドを探して、Capybaraを格納する。

つまりActionクラスには、値を格納する親となるクラスを宣言し、そのフィールドを用意します。このフィールドに対してもValidationを定義するのが、VisitorFieldValidatorです。

## VisitorFieldValidatorの定義

VisitorFieldValidatorを定義すると、Actionクラスから別のクラスへValidationの定義を移譲します。VisitorFieldValidatorの定義方法は以下のようになります。

```java:SampleSubscribeAction.java

@Validations(
	visitorFields = {
		@VisitorFieldValidator(fieldName="vo" , appendPrefix=true)
	}
)
public class SampleSubscribeAction extends ActionSupport {
	@Action("subscribe")
	public String subscribe() throws Exception {
		return SUCCESS;
	}

	@Getter @Setter
	private SampleVO vo;
}
```

アノテーション@VisitorFieldValidatorにて、どのフィールドのクラスに移譲するかを定義しました。以下の属性を設定します。

|属性名|概要|
|:---|:---|
|fieldName|VisitorFieldValidatorの対象となるActionクラスのフィールド名|
|appendPrefix|trueにすると、エラー時の項目名にActionクラスのフィールド名を接頭辞につけます。|

上記の例の場合、項目エラーがあった場合の項目名は「vo.」で始まります。
移譲される側のクラスは、入力項目に対するフィールドとValidationの定義が可能です。

## 移譲される側のクラス

移譲される側のクラスは、入力項目のフィールドとValidationの定義をします。

```java:SampleVO.java
@Validations(
	requiredFields = {
		@RequiredFieldValidator(fieldName="username" , message="username.required" ) ,
	} ,
)
@Data
public class SampleVO implements Serializable {
	private String username;
	private int age;
}
```

@Data,@Getter,@Setterは[Lombokのアノテーション](http://projectlombok.org/features/index.html)です。

## ModelDriven,ScopedModelDrivenとの相性

Struts2では、入力フィールドを別クラスへ格納するためのActionクラス用インタフェースにModelDriven,ScopedModelDrivenがあります。これらを使うと、別クラスのフィールドは model へ格納します。リクエストパラメータには接頭辞 model が不要になります。
ただし、ModelDrivenは何故かget/setメソッドの役割が逆転しているため、VisitorFieldValidatorとの相性は最悪です。使う場合はScopedModelDrivenを使わなければなりません。
また、フィールドは1つだけでなく複数のモデルとして格納したいケースがあるでしょう。その場合にはModelDrivenは適しません。
Capistranoのdeploy:cleanupで「incorrect password attempt」が出て実行できない時の対応

Capistranoのdeploy:cleanupで過去のデプロイ履歴を削除できるのですが、環境（Linux）によってはうまくいかない場合があります。

SUDOを使用して、例えばroot権限などでファイルを削除しようとするのですが、
「1 incorrect password attempt」というメッセージが出たり、何度もパスワードを聞かれたりしてうまくいきません。

どうも、パスワードの最後に改行コードが無くて、どこまでがパスワードなのかOS側が認識できていないようです。

仕方ないので、deploy.rb内でcleanupタスクをオーバーライドして対応しました。

<pre>
namespace :deploy do
  task :cleanup, :except => {:no_release => true} do
    count = fetch(:keep_releases, 5).to_i
    run "ls -1dt #{releases_path}/* | tail -n +#{count + 1} | #{sudo :as => 'root'} xargs rm -rf"
  end
end
</pre>

やっていることは、通常のcleanupとなんら変わらないのですが、runで実行すると、うまく動きます。
[iphone開発] UIAlertControllerのサンプル

ios8からUIAlertViewやUIActionSheetがdeprecated(非推奨)になりました。
それの代わりとして今後はUIAlertControllerを使うことになります。

####ボタンを押したら単純なアラートを出す例
```swift
@IBAction func alertBtn(sender: UIButton) {
    let alertController = UIAlertController(title: "Hello!", message: "This is Alert sample.", preferredStyle: .Alert)
 
    let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
    alertController.addAction(defaultAction)
 
    presentViewController(alertController, animated: true, completion: nil)
}
```

その他アクション・サンプルコードはこちらからどうぞ
[[ios開発] swiftでUIAlertControllerを使うサンプルコードと解説](http://tech.eversense.co.jp/23)
DockerでMinecraftServerを建てる

Minecraftは1.7からライセンスをしっかりしてきて

購入者同士でもMinecraft(Mojangの成果物)の配布はだめだよ。となってますので

ONBUILDを使った方法でImageの配布をしてみました。

[k2wanko/minecraft Repository | Docker Hub Registry](https://registry.hub.docker.com/u/k2wanko/minecraft/)

[k2wanko/docker-minecraft Repository | Github](https://github.com/k2wanko/docker-minecraft)

# Dockerfileを作る

```:Dockerfile

FROM k2wanko/minecraft:1.8

```

と、一行のDockerfileを作成する。

作成する場所は　新規にディレクトリを作りその中に置いたほうがいいです。

※カレントディレクトリ全て追加されてしまうため

# Build

Dockerfileのある場所に移動して以下のコマンドを入れる。

` $ docker build -t minecraft .`

```:log
Sending build context to Docker daemon 4.096 kB
Sending build context to Docker daemon
Step 0 : FROM k2wanko/minecraft:1.8
Pulling repository k2wanko/minecraft
...
# Executing 2 build triggers
Step onbuild-0 : RUN download 1.8
 ---> Running in 84728c402590
######################################################################## 100.0%
 ---> cc670f2d4714
Step onbuild-1 : COPY . /data
 ---> 53f7a68bb12b
 ---> 53f7a68bb12b
Removing intermediate container 84728c402590
Removing intermediate container 072ebb2ced5a
Successfully built 53f7a68bb12b
```

# Run

以下のコマンドで実行。

```

 $ docker run -i -p 25565:25565 -e EULA=true minecraft

```

今の流れを一行にすると

```

mkdir mcserver && cd mcserver && echo "FROM k2wanko/minecraft:1.8" > Dockerfile && docker build -t minecraft . && docker run --name some-minecraft -i -p 25565:25565 -e "EULA=true" minecraft

```


# まとめ

ONBUILDを使うことで
ONBUILDが記述されているDockerfileをFROMで呼び出した
Dockerfileの処理終了後に実行される。

今回MinecraftServerのDownload処理をこのOBUILDに書き込むことで配布用のImageにライセンスでダメェって言われている物を含めることをせずに済んだということでした。

ちなみに1.7.10のforge serverも入れてますのでModServerもすぐに立ち上げられますね。
Eclipseの既存プロジェクトをAndroid Studioへ移行する


以前にAndroid Studioを使ってみたもののバグばっかりだったという印象が残っていて、それ以降ずっと「Eclipseでいいや」と思っていたのですが、最近「Android Studioいいよ」という声が聞こえてきたので改めて導入してみました。

その際に既存プロジェクトの移行に手こずっている人が結構いるそうだったのでメモっておきました。

##前提条件
Mac (OS X 10.9.5)
Eclipse (Kepler)
Android Studio (0.8.6)

##移行する

１、Android Studioを立ち上げてImport Porject
２、対象プロジェクトのAndroidManifest.xmlを指定して、あとはNext,Next,Finish

基本的にはこれだけで完了です。ライブラリはもちろん、テストプロジェクトも移行されます。

##とはいえ、世の中そうはうまくいかない
以下、打ち当たった壁をどのように突破したかをつらつらと。

### Lより低いのはダメって怒られる
importしてすぐ下記のエラーがでました。

```
Error:Execution failed for task ':myApp:processDebugManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version L declared in library com.android.support:support-v4:21.0.0-rc1
```

対処法としては、build.gradle内の

```
  compile 'com.android.support:support-v4:+'
```
を

```
  compile 'com.android.support:support-v4:20+'
```
に変えればうまくいくとのことです。
はじめは対象プロジェクトのみ変えていたのですが、うまくいかず、
最終的に使っているライブラリプロジェクトのbuild.gradleも同様に変更することでこのエラーは消えました。

他に SDK Managerの「Android Support Repository」をInstallすれば解消するなども見つけました。
また上記をしていても [Android SDK]/extras/android/m2repository というディレクトリがない人は下記コマンドを打ってインストールすることでうまくいくかもしれません。(私は一応これもやってます。)

```
android update sdk --no-ui --all --filter extra-android-m2repository   
```

### tools:replace="android:theme"をmanifestのapplicationタグに追加しろって怒られる

```
Error:(32, 9) Execution failed for task ':myApp:processDebugManifest'.
> Manifest merger failed : Attribute application@theme value=(@style/Theme.MyApp) from AndroidManifest.xml:32:9
  	is also present at MyApp:growthPushLibrary:unspecified:14:9 value=(@style/AppTheme)
  	Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:28:5 to override
```

言う通りに、applicationタグに `tools:replace="android:theme"` を追加してももちろんダメで、
加えて下記をmanifestタグに追加しないと行けないようです。

```
    xmlns:tools="http://schemas.android.com/tools"
```

ManifestタグとApplicationタグ、挿入する場所が違うので気をつけましょう。

##おまけ(ついてきたテストプロジェクトの動かし方)
簡単にテストを実行できました。
１、Rub -> Edit configuration を選択
２、左上の「＋」を選択
３、「Android Tests」を選択
４、Nameを適当に埋めて、Moduleに対象プロジェクトを選んで OK
５、Run -> Run... を選択して 先ほど作成したTestを選択すればテストが走ります。
Rubyで Enumerable#reduce / inject で処理を中断して結果を返す

Enumerable#reduce / injectメソッドで途中で処理を中断して、その時点での結果を返したいなーと思うときがあります。
どうするんだろうなーと思ったのですが、
Rubyのbreak文は引数とれるのでそこに結果を渡してあげればいいようです。

##以下説明

Rubyで1から5までの数を足し合わせるコードは以下のように書きます。

```rb
(1..5).reduce(0){|result, number|result + number}
```

このとき、もし、4以降の数字については取り除いて計算したい場合はどうするか？
*最初から1〜3の値を入れとけよというツッコミは無しで。*

```rb
(1..5).reduce(0){|result, number|
  break result if number == 4
  result + number
}
```

break文を入れるとイテレータが中断されるのはご存知の通りですが、
このときの返り値はbreakの引数となります（引数を与えなければ `nil` ）。
CentOS 7 に最新版のDockerをインストールする

* docker公式サイト上から、`docker-latest`という最新バージョンの実行ファイルを取得する

```bash
$ cd /usr/bin
$ sudo wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker
$ sudo chmod +x docker
```


* systemdで管理するので、githubに公開されているdocker用の`service`, `socket`の2ファイルを取得する

```bash
$ cd /etc/systemd/system
$ sudo wget https://raw.githubusercontent.com/docker/docker/master/contrib/init/systemd/docker.service
$ sudo wget https://raw.githubusercontent.com/docker/docker/master/contrib/init/systemd/docker.socket
```

* serviceファイルにtcp listenの設定を追記

```bash
$ cd /etc/systemd/system/
$ sudo cp docker.service docker.service.org
$ sudo vi docker.service

```

```diff
 [Service]
-ExecStart=/usr/bin/docker -d -H fd://
+ExecStart=/usr/bin/docker -d -H fd:// -H tcp://0.0.0.0:2375
```

* `docker`グループを追加

```bash
$ sudo groupadd docker
```

* `systemctl`で設定のリロード・docker起動

```bash
$ sudo systemctl daemon-reload
$ sudo systemctl start docker
$ sudo systemctl status docker

docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; static)
    :
    :
```

* 一般ユーザーにも上記で設定した`DOCKER_HOST`環境変数を設定し、dockerコマンドを叩いて正常動作するか確認する

```bash
$ whoami
hoge

$ export DOCKER_HOST="tcp://0.0.0.0:2375"
$ docker info
: (エラーにならないことを確認)
```

* リモートからのアクセスを許可する場合、firewalldの設定を変更する

```bash
$ sudo firewall-cmd --permanent --zone=public --add-port=2375/tcp
$ sudo firewall-cmd --reload
```
CSVを作成してGmailに添付する方法

Gmailのみの対応

CSVファイルを作成
↓
GmailにIntentを投げる のシンプルな流れ

```java
String tmpCsvPath = Environment.getExternalStorageDirectory().getPath() + "/tmp.csv"; 
try {
	// csvファイル作成
	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tmpCsvPath, false), "SJIS"));
	bw.write("test1,");
	bw.write("test2");
	bw.newLine();
	for (int i=0;i<=10000;i++) {
		bw.write((i + 1) + ",");;
		bw.write(Math.random()*10+"");
		bw.newLine();
	}
	bw.flush();
	bw.close();

	Intent intent = new Intent();
	intent.setAction(Intent.ACTION_SEND);
	intent.putExtra(Intent.EXTRA_SUBJECT, "");
	intent.putExtra(Intent.EXTRA_TEXT, "");
	// Gmailにファイルの添付
	Uri attachments = Uri.parse("file://" + tmpCsvPath);
	intent.putExtra(Intent.EXTRA_STREAM, attachments);
	intent.setType("application/*");
	intent.setPackage("com.google.android.gm");
	try {
		startActivity(intent);
	} catch (android.content.ActivityNotFoundException ex) {
		ex.printStackTrace();
		Toast.makeText(this.getApplicationContext(), "client not found", Toast.LENGTH_LONG).show();
	}
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
```


※追記
AndroidManifest.xmlに以下も追加

```
<!-- 外部SDカードへの書き込み -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```
docker使うメモ

#dockerの設定ファイル在り処
- centos

/etc/sysconfig/docker

#docker設定ファイルに書くこと
- DNS設定

DOCKER_OPTS="--dns DNSサーバのIP”

-  proxy設定

export http_proxy=...
export https_proxy=...

- ドライバの設定

(なんかdockerのドライバじゃ動かなかったので)
other_args=”--exec-driver-lxc"


設定ファイルを変更したら，ちゃんとdockerをリスタートすること

# DockerFile書き方
```Dockerfile:Dockerfile
From ubuntu:latest #基本とするイメージ
ENV http_proxy ... #環境変数の設定
RUN apt-get update -y #コンテナをbuildしたときに呼び出されるコマンド
CMD /bin/bash #コンテナを起動したときに呼び出されるコマンド
```

その後で
```
docker build -t タグ名 .
```
最後の.はDockerfileが格納されているフォルダ。
DockerfileをGitか何かでバージョン管理して，過去の状態に戻ってビルドしなおすとか，そういうのもできるし，フォルダごとにDockerfile書いておいて，そいつを参照するって使い方もできる。

# コンテナ起動

```
docker run --name イメージ名 -i -t タグ名
```

```-i``` はinteractiveらしい。サーバとかバックグラウンドで動作するコンテナは ```-d```(daemon)

# [ハマった] sshでログインできるようにする
(いまさらながら) knife-soloの手順書のレビューをしてほしいという要求に対して，サラのdockerコンテナが欲しかったのだけれど，sshがつながらなかったので

ちなみにsshdは基本的には立ち上げない方がいいらしい。

```Dockerfile
FROM centos:centos6

ENV http_proxy...
ENV https_proxy...

RUN yum update -y
RUN yum install -y openssh-server

CMD /etc/init.d/sshd start
```

```docker build -t centos6/sshd .```で作ったコンテナにsshでアクセスしようとする。
IPは
```
docker inspect centos6/sshd
```
とかやれば書いてある。

```
[soteam@ps-moni06 ~]$ ssh user@172.17.0.45
user@172.17.0.45's password:
Last login: Wed Oct 15 09:25:58 2014 from 172.17.42.1
Connection to 172.17.0.45 closed.
```

と，すぐコネクションが切れる現象発生。

よく分かっていないのだけれどPAMってのが悪さしているらしいので，```/etc/pam.d/sshd```を

```
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
#session    required     pam_loginuid.so
session    optional     pam_loginuid.so  ## required→optionalに変更
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include      password-auth
```

としてやって解決した。

参考URL:
http://blog.glatts.com/blog/imai/?p=949
http://open-groove.net/linux/pam-sshd/

# これからやること
 
- ユーザの設定
- ホームディレクトリの設定 (今のところ/になっちゃう)
- 設定ファイルの変更 (RUN echo ”” > ファイル がうまく動かない)
- ネットワークの設定 (コンテナ同士の接続をSDNっぽく → Docker on Dockerで，SDDCみたいなことがしたい)
- attachとかの振舞いをもう少し理解する。(どうもexitしちゃうと，detachにならんらしい)
SublimeTextでRSpec3のテストを動かすときの注意点

SublimeTextには、ショートカットでRSpecによるテストを実行できる便利なプラグイン「RubyTest」がありますが、RSpec3では行指定のテストが動かなかったり、現時点だと不具合が出てしまいます。そこで、RSpec3でもうまく動くように設定を変更していきましょう。

## 環境

- Ruby(2.1.2p95)
- rbenv(0.4.0)
- Rails(4.1.1)
- RSpec(3.0.4)


## 設定方法

1. [Sublime Text]->[Preferences]->[Package Settings]->[RubyTest]->[Settings - User]を開く
2. 中身を以下に変更

```json:RubyTest.sublime-settings

{
  "run_rspec_command": "$HOME/.rbenv/shims/rspec {relative_path}",
  "run_single_rspec_command": "$HOME/.rbenv/shims/rspec {relative_path}:{line_number}"
}
```

以上です。
これで、行指定のテストもうまくいくはずです！

## ショートカットコマンド一覧

__Command-shift-R__
今編集しているブロック内のテストを実行する。itブロック内のテストについては、そのテストを1回だけ、実行し、describeブロック内のテストはそのブロック内の一連のテストを実行する

__Command-shift-E__
最後に実行したテストを再度実行する

__Commanfd-shift-T__
現在のファイルにあるテストをすべて実行する

おつかれさまです！
Xcode6で、以前と同様にレイアウト作業する方法（SizeClassesの解除）


Xcode6でストーリーボードを表示すると、くっそ使いづらい「サイズクラス」モードで表示されますが、XCode5にもどすわけにもいかないので、従来のようにするには、以下の手順でサイズクラスを解除します。

1.プロジェクトナビゲーターからストーリーボードファイルを左クリックして選択。
2.ファイルインスペクタを選択して、Use Size Classesのチェックボックスをオフ。

以上。

##（おまけ）ストーリーボードのLayoutをプレビューする
アシスタントエディタを開き一番下のPreviewを選択。
＋Buttonで、確認したいサイズのiPhone/iPadモデルを表示。
ストーリーボード画面で、ビューコントローラを選択すると、その画面レイアウトが、各Previewで表示される。

Use Auto Layout は、オンでもオフでも可。これまでの開発スタイルに応じて利用できそうです。

閑話。サイズクラスを使ってiPhoneとiPadを同じストーリーボード上で扱うのは、ファイルがひとつになるので一見合理的なようですが、1ファイルに複数のUIオブジェクトを配置しないといけないのですよ！！！　また、オブジェクトの表示名がメニュー上で同じになるので、選択していない画面の方のオブジェクトをグレーアウトにしたとしても、ヒジョーに見づらいのですよ！！！！！！
このUI作ったやつ、絶対おかしい。間違いない。休題。
Amazon Linuxへのberkshelfのインストール


`gem install berkshelf`
は罠。1Gメモリー+1Gスワップ全部食いつぶしてなおインストール失敗した。色々頑張ってビルドしようとしたけどだめだった。

正解は
http://downloads.getchef.com/chef-dk/redhat/#/
にあるrpmつかって
`yum install https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.2.0-2.el6.x86_64.rpm`
だった。
GETリクエストをするspecを実行して"undefined method `get'"と怒られた時は

# 現象

```rb
require 'rails_helper'

describe 'あいさつ' do
  context '朝は' do
    it 'おはようと返すこと' do
      get '/geeting/morning'
      expect(response.body).to include('おはよう')
    end
  end
end
```

```bash
$ bundle exec rspec spec/greet_spec.rb
undefined method `get' for #<RSpec::ExampleGroups::Nested::Nested0:0x007fe53ec7fee0>
```

# *_spec.rbのパスに注目

### spec/greet_spec.rb

ここはだめ

### spec/requests/greet_spec.rb

ここはOK

# もしくは:type metadataで明示的に指定する

```rb
require 'rails_helper'

describe 'あいさつ', type: :request do
  context '朝は' do
    it 'おはようと返すこと' do
      get '/geeting/morning'
      expect(response.body).to include('おはよう')
    end
  end
end
```

## 逆にCapybara#visitは...

### spec/features/

に置くか、


```rb
require 'rails_helper'

describe 'あいさつ', type: :feature do
  context '朝は' do
    it 'おはようと返すこと' do
      get '/geeting/morning'
      expect(response.body).to include('おはよう')
    end
  end
end
```

`type: :feature`を指定します。
Werckerからの通知がSlackにこなくなった場合の対処法

最近CI通知がこないなと思ったら思いっきりこけてた

```bash

cd $WERCKER_SOURCE_DIR
$ export WERCKER_STEP_ROOT="/wercker/steps/sherzberg/slack-notify/0.0.11"
$ export WERCKER_STEP_ID="ae60e22b-6735-4fa5-ae3e-64e6d4cd6f99"
$ export WERCKER_STEP_NAME="slack-notify"
$ export WERCKER_REPORT_NUMBERS_FILE="$WERCKER_REPORT_DIR/$WERCKER_STEP_ID/numbers.ini"
$ export WERCKER_REPORT_MESSAGE_FILE="$WERCKER_REPORT_DIR/$WERCKER_STEP_ID/message.txt"
$ export WERCKER_REPORT_ARTIFACTS_DIR="$WERCKER_REPORT_DIR/$WERCKER_STEP_ID/artifacts"
$ mkdir -p $WERCKER_REPORT_ARTIFACTS_DIR
$ export WERCKER_STEP_TEMP="/tmp/$WERCKER_STEP_ID"
$ source '/wercker/wercker-build-essentials/init.sh'
$ mkdir -p $WERCKER_STEP_TEMP
$ export WERCKER_SLACK_NOTIFY_SUBDOMAIN="mydomain"
$ export WERCKER_SLACK_NOTIFY_TOKEN="$SLACK_TOKEN"
$ export WERCKER_SLACK_NOTIFY_CHANNEL="channel-name"
$ source "$WERCKER_STEP_ROOT/run.sh"
-bash: fatal: command not found
```

[sherzberg/wercker-step-slack-notify](https://github.com/sherzberg/wercker-step-slack-notify)のレポジトリを見に行くと
>
Changelog
0.0.11
>
change how to specify the channel(Ex. "#room", "@someone")

これだ！！

```diff
after-steps:
    - sherzberg/slack-notify:
        subdomain: u-note
        token: $SLACK_TOKEN
-       channel: "channel-name"
+       channel: "#channel-name"
+       username: wercker
+       icon_url: https://avatars3.githubusercontent.com/u/1695193?s=140
```

ついでにアイコンやら名前などもセットしてみる

![Screen_Shot_2014-09-30_at_12_34_50_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/2624/6ad0caf1-46b6-9fd1-7264-29365df3c86b.jpeg "Screen_Shot_2014-09-30_at_12_34_50_PM.jpg")

できた！
Atom Shellで0.16系にしたらCocoa APIが叩けなくなった

# 0.17.1でも別のエラーでダメ

```text
[52035:1003/063903:INFO:renderer_main.cc(227)] Renderer process started
[52033:1003/063903:INFO:CONSOLE(83)] "Uncaught Error: Module version mismatch. Expected 15, got 14.", source: /Users/kjunichi/work/atom-shell/nodobjc/node_modules/NodObjC/node_modules/ref/node_modules/bindings/bindings.js (83)
```

# 関連しそうなISSUE

- [atom-shell > 0.15.9 breaks node-pathwatcher? · Issue #649 · atom/atom-shell](https://github.com/atom/atom-shell/issues/649)
- [Is atom-shell intended to be compatible with prebuilt node modules? · Issue #533 · atom/atom-shell](https://github.com/atom/atom-shell/issues/533#issuecomment-56209512)

# やってみたこと

前述のIssueの通りApmのバージョンを新しくなっているのを確認してい、片っ端から、NodObjCが依存しているネイティブモジュールを

```
HOME=~/.atom-shell-gyp node-gyp rebuild --target=0.11.13 --arch=x64 --dist-url=https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```

とリビルド

# 結果

ダメ。
どうダメかというと。

```
[42643:0930/120103:INFO:renderer_main.cc(227)] Renderer process started
[42641:0930/120105:INFO:CONSOLE(1259)] "Uncaught Error: readObject: Cannot read from NULL pointer", source: /Users/kjunichi/work/atom-shell/nodobjc/node_modules/NodObjC/node_modules/ffi/node_modules/ref/lib/ref.js (1259)
```

# 暫定対応

0.15.9を使う。
0.16.3で動かなかった状態のまま、0.15.9で動かしてみたら、動いた。

# 関連記事

- [Atom ShellでCocoa APIが叩けるようになった: misc](http://kjunichi.cocolog-nifty.com/misc/2014/08/atom-shellcocoa.html)
Webアクセスを日本国内に制限する4つの方法


# はじめに

AWS上で構築しているサイトへのアクセスを国内のみに制限したいという要望があります。どのような方法があるか調べてみたのでまとめてみました。まだ調べはじめたばかりなので、実績等は今後できたら追加したいとおもいます。

## Route53の Geolocation Routingを使う

Route53には[Geolocation Routing](http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-geo)という機能があります。これを使うことで国単位(もっと細かい単位も可能)で振り分けができます。具体的な手順は[こちら](http://dev.classmethod.jp/cloud/route53-georouting/)によくまとまっています。

こちらをつかって、日本であれば正しいサイト、日本以外はソーリーページを表示するということが出来ます。

## CloudFrontのGeo Restrictionを使う

AWSのドキュメントにそのものずばりの「[コンテンツの地理的ディストリビューションの制限](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html)」というページがあります。

	CloudFront は、サードパーティーの GeoIP データベースを使用して、ユーザーがいる場所を判別します。IP アドレスと国とのマッピングの正確さは、リージョンによって異なります。最近のテストによれば、AWS での全体的な正確性は 99.8% です

とのことです。Route53と同じデータベースを利用しているかは、不明です。

## APNIC、JPNICより日本に割り当てられているIPを取得し、.htaccessに設定する。

Webサーバー側で対処する方法ですね。
[こちら](http://www.cgis.biz/tools/access/)に方法がまとまっていました。
IPアドレスのリストは以下から取得できます。
http://ftp.apnic.net/stats/apnic/
https://www.nic.ad.jp/ja/ip/list.html

## GeoIPデータベースを検索するモジュールを追加する

こちらもWebサーバー側になります。

GeoIPで検索すると一番に出てくるmaxmind社から[Apacheモジュール](http://dev.maxmind.com/geoip/legacy/mod_geoip2/)が提供されています。

PHPの[GEO IPモジュール](http://php.net/manual/ja/book.geoip.php)もあります。


# まとめ

国内にアクセス制限をかけるための4つの方法を紹介しました。
最初の二つ(特にCloudFrontのGeo Restriction)は簡単に実現でき、地理IPデータベースの管理もいらず、費用もかからないので、第一選択肢になるかとおもいます。

Webサーバー側で行なう場合は、精度が必要な場合です。CFのGeo Restrictionで99.8%という数字がありましたが、過去に制限をおこなった人の話ですと、国内なのに見えない、海外なのに見えるということはどうしても発生するようです。チューニングをしたい場合は自分のＷｅｂサーバー内で実施する方法になります。

他にも方法があるようでしたら教えてください。

ではでは。
【Rails】Paperclipで保存した画像のサムネイルの取得方法


以下のようなモデルがあったときに、

```ruby
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.integer :name
	  t.attachment :icon
	end
  end
end
```


```ruby
class User < ActiveRecord::Base

[:icon].each do |col|
		has_attached_file col , :styles => {:medium => "300x300", :thumb => "100x100"}, 
			:default_url => "./images/:style/missing.png",
			:url => "/images/:class/:attachment/:id_partition/:style/:filename"
		validates_attachment_content_type col,
			:content_type => ["image/png", "image/jpg", "image/jpeg"]
	end
end

```


サムネイルのディレクトリに保存した画像を表示したいです。

そんなときは、（上記例でいうと）iconの引数に":thumb"を付けてあげるとサムネイルのURLを返してくれます。

```irb
irb(main):003:0> User.first.icon(:thumb)
  User Load (0.4ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
=> "/images/users/icons/000/000/001/thumb/picture?1412045787"
```

```html:sample.html.erb
<div>
	<%= image_tag(@user.icon(:thumb)) %>
</div>
```
っ CentOS4用bash脆弱性修正済rpm

Oracle Linuxに感謝。

# download

* [bash-3.0-27.0.3.el4.i386.rpm](https://www.dropbox.com/s/z3fqryp1e25kli8/bash-3.0-27.0.3.el4.i386.rpm?dl=0)
* [bash-3.0-27.0.3.el4.x86_64.rpm](https://www.dropbox.com/s/ejjqtlm3dj40m9o/bash-3.0-27.0.3.el4.x86_64.rpm?dl=0)

元となったsrpm

* https://oss.oracle.com/el4/SRPMS-updates/bash-3.0-27.0.3.el4.src.rpm

# rpmの自作手順

* [vagrant - PackerでCentOS4.8のbox作った - Qiita](http://qiita.com/tukiyo3/items/01d3b92dde944c25d2e8)

に書きました。
macのzsh + pythonのシェルで矢印キーが効かない

題のことをすると ^]]A とか意味不明な文字がでていたのがやっと解決しました。

・xcodeをインストールし認証を許可する
これはcソースをコンパイルするため.

・brewでreadlineをいれる
% brew list readline
% brew uninstall readline
% brew install readline
% brew link --force readline
をすると確実.

・CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install -v 2.7.6

これで多分いける。。。
Ruby2.2で恒等関数Kernel#itselfが導入されるらしい、調べたらScalaにもありました

## 恒等関数
関数引数をそのまま返す関数。
Ruby2.2で追加されるという記事を読んでScalaだとどうなの？と気になって調べてみると既に導入されていました。

```scala:Predef.scala
def identity[A](x: A): A = x
```

確かに引数を返すだけ。
Predefなのでどこでも使える。

## 何が嬉しいの？
これでx=>xというちょっとアレな高階関数定義とおさらばできる。

### Before
```scala
List(10,2,4,5,3).sortBy(n=>n)
```

### After
```scala
List(10,2,4,5,3).sortBy(identity)
```

個人的には ...sortBy(itself) の方が好きではある。
いつか使いたいJavaScript(Node.js)ライブラリとか

「いつか使いたいの」なので　ほとんどちゃんと使ったことないやつです。

# Tool
## [Hubot](https://hubot.github.com/)
- https://github.com/github/hubot

チャットbot開発・実行フレームワーク
Botを作ってみたいと言う理由で使ってみたい。
あと人工無能もこれで作れそう(粉ミカン)とか理由は様々

## [MobileChromeApps](https://github.com/MobileChromeApps/mobile-chrome-apps)

ChromeAppsをAndroidやiOSで動かすためのライブラリと変換ツール

ChromeApps jsAPIを追随して実装しているようなので
chrome.socketsなど新しいAPIは開発中だったりAndroidでは使えるけどiOSでは使えないなどもある。詳細は[ここ](https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/docs/APIsAndLibraries.md)で

実は少し使ってるけど　ちゃんと使ってないので
これでアプリを作ってリリースしたい。

## [nexe](https://github.com/crcn/nexe)

Node.jsをバイナリ化してくれるツール
Node.jsの入ってない環境でバイナリだけ移して実行するとかできるそう。
使いドコロがわからないけど使いたい逸品

## [node-webkit](https://github.com/rogerwang/node-webkit)

GUIがあるアプリケーションを作る時に使える
すごいやつ
ChromeAppsにハマってるので使いたいとは思ってこなかったが
GUIを持ったツールの配布にはこれがいいんじゃないかと思ったので使いたい。

# Framework

## [Backbone.Marionette.js](https://github.com/marionettejs/backbone.marionette)

MarionetteとBackboneが合わさった様なやつ。
Backboneよりシンプルということで使ってみたい。
しかしBackboneもMarionetteも使ったことないけどいきなりこれに行っちゃっていいのかな？　「まぁいいか」といことで今度使いたい。

## ~~[AngularJS](https://angularjs.org/)~~
- https://github.com/angular/angular.js

~~大学の先輩も勧めてた。有名フレームワーク
中々使う機会がなく使えてない。
ChromeAppsにSandBox化せず使えるなら使ってみたいと思ってる。
(学習コストが高いということで戦々恐々してる)~~



# Middleware

## [connect-fluent-logger](https://github.com/hylom/connect-fluent-logger)

FluentdのMiddleware
これが使いたいというよりFluentdを通したBigQueryが使いたい

なので[node-google-bigquery](https://github.com/machadogj/node-google-bigquery)も合わせて使いたい

## [vulcanize-middleware](https://github.com/k2wanko/vulcanize-middleware)

[vulcanize](https://github.com/Polymer/vulcanize)のmiddleware
これは自分が作ったやつなんだけど中途半端なので、ちゃんと作って使いたい！

なので忘れないようにメモ

ちなみにvulcanizeはWebComponentのimportの部分を読み込んで一つのHTMLを生成してくれるツールです。

# ORMapper

## [Sequelize](http://sequelizejs.com/)
- https://github.com/sequelize/sequelize

Node.jsでMySQLとか全然使ってないからいつか使いたい
サンプルコードを見たら好みの書き方ができそうで　いつか使いたい。

## [JayData](http://jaydata.org/)
- https://github.com/jaydata/jaydata

Cross-platformのOPMapper、MongoDBやSQLiteだけじゃなくブラウザ側(LocalStorageやindexedDbなど)でも使える死角なしの無敵
  

# Other

## [pi-gpio](https://github.com/rakeshpai/pi-gpio)

巷でIoTが流行ってるので最近RaspberryPiを買ったので
Node.jsから色々やりたい！(希望)と思っているので使いたい。
一緒にArduinoも買ったけど、どっちもLチカくらいしかできてないので
せめてIRくらいはやってのけたい。
rbenvで 2.0.0-p247 以前をインストールする


※注釈 9/30
Fedora/Red Hat/CentOSの場合、です。


https://github.com/sstephenson/ruby-build/wiki#make-error-for-200-p247-and-lower-on-fedorared-hat


ファイルは以下にあるが、redmine に登録しないと取得できない。
誰でも登録できる。

https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/41808/diff?format=diff 

1. ログイン後、上記URLにアクセスするとchangeset_r41808.diffが保存される。
2. ダウンロード後、CHANGELOG のパッチの部分を削除しないとパッチがうまく当たらないので削除しておく。
3. その後、

```bash
$ cat changeset_r41808.diff | rbenv install --patch 2.0.0-p247
```

のようにするとインストールできる。
AFNetworkingのキャッシュを消す


AFNetworkingのキャッシュはNSURLCacheに残っているみたいです。

```
NSInteger diskCapacity = [NSURLCache sharedURLCache].diskCapacity;
NSInteger memoryCapacity = [NSURLCache sharedURLCache].memoryCapacity;
/* 0にする */
[NSURLCache sharedURLCache].diskCapacity = 0;
[NSURLCache sharedURLCache].memoryCapacity = 0;
/* もとの大きさに戻す */
[NSURLCache sharedURLCache].diskCapacity = diskCapacity;
[NSURLCache sharedURLCache].memoryCapacity = memoryCapacity;

```


ちなみに、

```
[[NSURLCache sharedURLCache] removeAllCachedResponses]
```
ではキャッシュが消えなかったので、調べてみたら、他にもキャッシュが消えなかった人がいました。
http://stackoverflow.com/questions/8737132/how-to-clear-cache-and-cookies-in-iphone
peco+giboで.gitignoreのテンプレを1秒で取得

```zsh:.zshrc
pecogibo() {
    gibo -l | peco | xargs gibo
}
```

![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/1044/cdd66863-9ebd-a59c-f032-728e2ac5bfb1.gif)

[gibo](https://github.com/simonwhitaker/gibo)は [https://github.com/github/gitignore](https://github.com/github/gitignore) から.gitignoreのテンプレを取得するコマンドラインツールで、`brew install gibo`からインストールできる。
RubyのClassクラスとかのモヤッと感をズバッと解決したい

`Class`クラスとか`Module`クラスの継承関係やら、
それ自体のクラスとかの関係てなんかモヤっと感あるなあと思っていて、

上手い事キレイに説明したいなと思い色々考えていたらそっぽい答えが出たので書きます.

まあひとまず以下のコード見て頂いてモヤっとしなければこんなクソ記事すぐ閉じるが宜しいかと.

もしモヤっとした方で興味があったらお読み頂ければなと.

```
'1'.class
=> String

'1'.class.class
=> Class

'1'.class.superclass
=> Object

'1'.class.class.class
=> Class

'1'.class.class.superclass
=> Module

'1'.class.class.superclass.class
=> Class

'1'.class.class.superclass.superclass
=> Object

'1'.class.class.superclass.superclass.class
=> Class

'1'.class.class.superclass.superclass.superclass
=> BasicObject
```

日本語で書いておくと、

"1"はStringクラスのオブジェクトである

`String`クラスは`Class`クラスのオブジェクトである
`String`クラスは`Object`クラスのサブクラスである

`Class`クラスは`Class`クラスのオブジェクトである
`Class`クラスは`Module`クラスのサブクラスである

`Module`クラスは`Class`クラスのオブジェクトである
`Module`クラスは`Object`クラスのサブクラスである

`Object`クラスは`Class`クラスのオブジェクトである
`Object`クラスは`BasicObjectt`クラスのサブクラスである

クラスがゲシュタルト崩壊してきた....

# オブジェクトとかクラスはただの哲学用語
カタカナで表せられるオブジェクトとかクラスはまあ哲学用語に近いというか、僕たちの認知の向こう側に埋まっている言葉で、オブジェクト指向というある種の哲学上で用いられる言葉.

だからオブジェクトとかクラスは形而上にあるもので、**感性を介しては真に認知出来ないという理解でいます.**

まあこの理解自体も僕なりの理解なので人それぞれで良いと思いますが、この記事内ではこの様なものとして扱います.

この話をしだすと長くなりそうなので必要ならばまた別で.


# クラスのRuby実装がClass
オブジェクトやクラスは感性を介しては認知出来ませんが、`Class` はそのクラスの一つの具体（解釈）で、Ruby内ではその文脈の元、クラスという言葉を使っているんじゃないかと考えるとスッキリ行く気がします.

同様に`Object` も先のある種の哲学用語であるオブジェクトのRuby上での実装なのかなと.

# メタクラスとメタオブジェクト
僕がこの言葉を知ったのは、Ruby自体のソースコードの解説書であるRubyソースコード完全解説を読んでいた時の事で、
http://www.amazon.co.jp/Ruby%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E/dp/4844317210

この著書内で述べられている事と僕の理解を合わせると、

オブジェクトとかクラスとか非常につかみづらいモノをRubyで実装、表現したい時に`Object` や`Class` として実装（解釈）したのだけども、どうやらその`Object`や`Class` というオブジェクトとクラスの実装（解釈）によると`Object` も `Class` 自体も オブジェクトかつ クラス である事が分かって（考えないといけなくなって）、「ああでは整合性が取れるように、`Class` のクラスを`Class` にしよう、けどこれはクラスを`Class` と解釈した時と文脈が違うのでメタクラス、そして`Class` と`Object` もオブジェクトとして考えないと行けないようなので、メタオブジェクトと呼ぼう」（実際には`Module` もそう）

これが `Object#class` や `Class#class`  を考えだすと少しモヤッとしてしまう原因なのかなと、こいつらは真にRubyのオブジェクトやクラスなどの解釈の中で生まれたオブジェクトやクラスでない. その解釈を保つためにオブジェクトやクラスとして見なされた、のでメタクラスとメタオブジェクトと呼ぶ事にしよう. 

何が言いたいて、オブジェクトやクラスは形而上の言葉で、それ自体のオブジェクトやクラスは思考の範疇でなくて
（神の神とかを考えないのと同じで）

それをRubyなどで具体に落とし込んだときに、生まれてしまったもの. （それをメタクラス、メタオブジェクトと名付けよう）

あえて見通しを良くするために`Module` とモジュールも抜きにしましたが、同じ原理が適応出来るかなと思う.


で結局、`Class`  というメタクラスと

`Object` と `Class` と `Module` というメタオブジェクトでRubyの世界は構築出来るよ！てお話しになると、理解するとスッキリする.

`BasicObject` は生まれた経緯が全く違うので割愛（この考え方では手に負えないし、負う必要もない）

# 実際は
ここまで適当な妄言をふかして来ましたが、実際Rubyの作者の松本さんが、Rubyのコミュニティがどう考えてきたか（いるか）は存じ上げませんし、この様に考えているとは思いませんが

ふとこいう思考をするとスッキリしたのでここに記しました.

そもそも僕の理解力の問題で、もっと単純明快な理解とか説明があればお教えください
（一番の目的）

gogo.
Xcode OrganizerのProvisioning Fileの重複を削除する

自分向けのメモ

TestFlightなどでAdhocモジュールを作成する際、Provisioning Fileが重複した場合の対処方法。

Provisioning fileを削除して、iOS devよりダウンロードしなおす。

Provisioning fileのパス

```bash
~Library/MobileDevice/Provisioning Profiles
```


----
参考

http://blog.youria.jp/kyo/xcode/delete_provisioning_profile_from_mac/
Debian on Armadillo400シリーズで使用できるJava

Java SE Embeddedが使える。
解凍して/usr/bin/javaにln -sするだけ

http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/javase-embedded-downloads-2209751.html

Javaのほぼすべての機能が使えるけど拡張文字コード（MS932など)が入っていない
で、MS932使いたい場合は別のJavaからcharsets.jarを持ってきてlibディレクトリに入れればOK
CentOS 6/7 へ MySQL-community を yum からインストールする

## リポジトリのRPMを取得

以下のリンクからパッケージを選択
[Download MySQL Yum Repository](http://dev.mysql.com/downloads/repo/yum/)

### CentOS 7
Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package

#### CentOS6
Red Hat Enterprise Linux 6 / Oracle Linux 6 (Architecture Independent), RPM Package

リンクをコピーして直接実行してもOK

```bash
$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-elx-y.noarch.rpm
```

## インストール

バージョンをかえたい場合は、利用可能なリポジトリを変更する。
デフォルトで有効なリポジトリは mysql57-community

| リポジトリ名 | バージョン |
|:---:|:---:|
| mysql57-community | MySQL 5.7 |
| mysql56-community | MySQL 5.6 |
| mysql55-community | MySQL 5.5 |

yum から行う場合は、`--disablerepo=mysql57-community --enablerepo=mysql56-community` などと指定する

```
$ sudo yum --disablerepo=mysql57-community --enablerepo=mysql56-community install mysql-community-server mysql-community-devel
```
/etc/yum.repos.d/mysql-community.repo の必要なリポジトリを enabled = 1 にそれ以外を enabled = 0 としてもよい
Railsでdate_selectの和暦版入力フォームをつくる


date_selectで生成したhtmlを受け取って、年の部分を和暦表示にするヘルパーを作った。
ちょっと無理矢理感があるけど、お手軽。

```app/helpers/application_helper.rb
  def date_select_ja(src_html)
    dst_html = src_html.gsub(/>\d{4}</) do |m|
      year = m.match(/>(\d{4})</)[1].to_i
      year_ja = case year
        when 0..1911
          "明治#{year - 1867}"
        when 1912
          "明治45/大正元年"
        when 1913..1925
          "大正#{year - 1911}"
        when 1926                                                                   
          "大正15/昭和元年"
        when 1927..1988
          "昭和#{year - 1925}"
        when 1989
          "昭和64/平成元年"
        else
          "平成#{year - 1988}"
      end
      ">#{year_ja} (#{year})<"
    end
    dst_html.html_safe
  end
```

こんな感じで使う。

```app/views/hoge.html.erb
    <%= date_select_ja(f.date_select(:date)) %>
```

表示するときには、[tomiacannondale/era_ja](https://github.com/tomiacannondale/era_ja)を使えばいいと思う。
SwiftTask(Promise拡張)でリアクティブプログラミング

前回の

1. [Swiftで有限オートマトン(ステートマシン)を作る - Qiita](http://qiita.com/inamiy/items/cd218144c90926f9a134)
2. [Swift+有限オートマトンでPromiseを拡張する - Qiita](http://qiita.com/inamiy/items/d3579b55a3ecc28dde63)
3. [SwiftTask（Promise拡張）を使う - Qiita](http://qiita.com/inamiy/items/0756339aee35849384c3)

の続きです。<del>まだこのネタ引きずってました</del>

Objective-C時代のリアクティブプログラミング用のOSX/iOSフレームワークといえば、[ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa)がデファクトスタンダードですが、使いこなせると強力な一方で、パッと見、複雑そうで敬遠している方も多いと思います（私もつい最近までそうでした）。

実際に、GitHubのソースを追うのにも一苦労し、`RACDisposable`がこれこれこうなって・・・なるほどわからん :older_man: 状態になることが少なくありません。


そこで今回、Swiftでもっと簡単に、カジュアルにリアクティブプログラミングを実装したいということで、ReactKitというライブラリを作りました。

ReactKit
https://github.com/inamiy/ReactKit


## 使用例

まずは簡単で分かりやすい KVO/KVCの例を見ていきます。

```swift
// create signal via KVO
self.obj1Signal = KVO.signal(obj1, "value")

// bind signal via KVC (<~ as binding operator)
(obj2, "value") <~ self.obj1Signal

XCTAssertEqual(obj1.value, "initial")
XCTAssertEqual(obj2.value, "initial")

obj1.value = "REACT"

XCTAssertEqual(obj1.value, "REACT")
XCTAssertEqual(obj2.value, "REACT")
```

`obj1.value`の変更に合わせて、`obj2.value`が自動的に連動しているのが分かります。

`Signal`の中身は、実は先日のQiita記事で作った[SwiftTask](https://github.com/inamiy/SwiftTask)を使用していて、`Task`のサブクラスという形で`then`-ableな設計になっています。

その代償として、Promise Chaining優先のためにRACDisposableクラス等が省かれており、 bindingを解除する際は、`signal`ごと解放します。

```swift
self.obj1Signal = nil   // release signal & its bindings

obj1.value = "Done"

XCTAssertEqual(obj1.value, "Done")
XCTAssertEqual(obj2.value, "REACT")  // not reacting
```

2014/09/30現在、`Signal`としてまともに使えるのは、

- KVO
- NSNotification
- 一部のUIControl

のみですが、その他Foundation/AppKit/UIKitクラスのSignal化も随時行っていきます。


## より実践的な例

QiitaにReactiveCocoaのとても良いサンプルがあったので、拝借させていただきました。

- [iOS - ReactiveCocoaをかじってみた - Qiita](http://qiita.com/paming/items/9ac189ab0fe5b25fe722)

4つの`UITextField`の入力値と`UIButton`の`enabled`を連動させる処理をReactKitで書くと、こうなります。

```swift
let usernameTextSignal = self.usernameTextField.textChangedSignal()
let emailTextSignal = self.emailTextField.textChangedSignal()
let passwordTextSignal = self.passwordTextField.textChangedSignal()
let password2TextSignal = self.password2TextField.textChangedSignal()

let anyTextSignal = Signal.any([usernameTextSignal, emailTextSignal, passwordTextSignal, password2TextSignal])

// create button-enabling signal via any textField change
self.buttonEnablingSignal = anyTextSignal.map { (values, changedValue) -> NSNumber? in

    let username: NSString? = values[0]?
    let email: NSString? = values[1]?
    let password: NSString? = values[2]?
    let password2: NSString? = values[3]?

    // validation
    let buttonEnabled = username?.length > 0 && email?.length > 0 && password?.length >= MIN_PASSWORD_LENGTH && password? == password2?

    // NOTE: use NSNumber because KVO does not understand Bool
    return NSNumber(bool: buttonEnabled)
}

// REACT: enable/disable okButton
(self.okButton, "enabled") <~ self.buttonEnablingSignal!
```

`map(f: T -> U)`を使って、`anyTextSignal`が変更値として返す`(values, changedValue)` tuple型をチェックし、`UIButton`の`enabled`がKVCで解釈できる`NSNumber`に変換しています。

---

以上、簡単な紹介でしたが、もし良かったらStarやPull Reqをいただけると嬉しいです。
Amazon EC2 まとめ (リンク集)

資格勉強のため、いろんな資料から抜粋

# Amazon EC2とは

IaaSに位置づけられるクラウドサービス。
システムをクラウド上で構築するための基盤となる。
数分でサーバを起動することができ、マシンの追加、削除、インスタンスタイプの変更が簡単にできる。
インフラを構築するために必要な様々なコストを削減できる。


## 料金

[Amazon EC2 料金表](http://aws.amazon.com/jp/ec2/pricing/)
[Amazon EC2 インスタンス購入オプション](http://aws.amazon.com/jp/ec2/purchasing-options/)

#### 料金オプション

##### オンデマンドインスタンス
* デフォルトオプション
* 初期費用ゼロ・従量課金（時間）
* 1年間使わない場合（４０％未満）⇒超える場合は、リザーブドインスタンス

##### リザーブドインスタンス 
* 本番可動となるシステム向け
* 1年/3年で契約
* 初期費用（予約金) + 時間課金
* 予約金の支払い　一時金を支払うことで時間単価が安くなる
* 長期間の使用で同じ期間利用したオンデマンドインスタンスよりも安くなる。（ただし、1年の40％を超える場合)
* 時間単価の割引（年間を通して割引が適用される）
* DBサーバ、常時稼働しているWeb/APサーバ
* EC2,RDS,ElasticCacheで利用できる

##### スポットインスタンス
* 初期費用０
* スポット価格（需要と供給によってリアルタイムに変動する）
* 最大額を指定し、入札することでスポット価格以上の学であればインスタンスが利用できる。スポット価格が入札額を超えるとターミネートされる。即落ちる
* 時間制約がなく、中断可能なタスクの計算コストを削減するのに向く
* 分散処理の計算ノードにむく
* 欲しいときに必ず必要な分が割り当てられるとは限らない
* Elastic Map Reduceのデータノードに利用できる

### SLA 99.95

例外もある模様
[Amazon EC2 SLA　例外事由](http://aws.amazon.com/jp/ec2/sla/)

[Amazon EC2 サービスレベルアグリーメント](http://aws.amazon.com/jp/ec2/sla/)


## 関連コンポーネント

### AMI
* 仮想マシンイメージのこと。
* EC2インスタンスはこのAMIから起動される。
* カスタムされたAMIはAmazon S3に保存される

### key pair
* 秘密鍵
* 初回時のみダウンロードできる

### Security Group
* ファイアウォールのこと
* インスタンスに設定することでグループ化
* EC2内でのiptablesの設定とは連動しないため注意

### Amazon EBS

### SnapShot

## 関連

### インスタンスアドレス
* Private IPアドレス ：VPCサブネットから割り当て
* Private DNS       ：*.internal
* Public DNS        ：*.amazonaws.com
* public IPAddress  ：オプションで付与できる
* elastic IP        ：固定IP
 
### VPC
* アカウント専用のネットワークを構築する。
* VPN接続すれば、オンプレミスと専用線で接続することも可能

### リージョン(Region)
* 世界10か所の地域

### アベイラビリティゾーン(AZ)
* 各リージョンごとに存在するデータセンター群のこと
* AZは、地理的に離れた場所に存在している。
* 同リージョン内のAZ間は高速専用線で接続されている。

# リンク集
## 公式
[Amazon EC2 ご利用開始にあたって](http://aws.amazon.com/jp/ec2/getting-started/)
[Amazon EC2 開発者用リソース](http://aws.amazon.com/jp/ec2/developer-resources/)

## slideshare
[いまさら聞けない Amazon EC2](http://www.slideshare.net/understeer/20140317-ec2-instancyetype)
[AWS Black Belt Techシリーズ Amazon Elastic Compute Cloud (Amazon EC2)](http://www.slideshare.net/AmazonWebServicesJapan/amazon-elastic-compute-cloud-amazon-ec2)
[[AWSマイスターシリーズ] リザーブドインスタンス&スポットインスタンス](http://www.slideshare.net/AmazonWebServicesJapan/20131023-aws-meisterregeneraterispotpublic?related=1)
MariaDBでOpenStackの環境構築

CentOS7.0でMySQLからMariaDBに変更になりました。MariaDBでOpenStackの環境構築する際に注意する点です。

# yumにOpenStackのリポジトリを登録する

OpenStackパッケージをインストールできるようにyumにリポジトリを登録する。

```
$ sudo yum install yum-plugin-priorities
$ sudo yum install http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/rdo-release-icehouse-4.noarch.rpm
$ sudo yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
```

※上記リポジトリは執筆時点のものです。

# MariaDBをインストールする

mariadb-serverではなく、mariadb-galera-serverをインストールする。すでにmariadb-serverがインストールされている場合、事前にアンインストールする。

```
$ sudo yum install mariadb mariadb-galera-server MySQL-python
```

MariaDBの設定ファイルを編集する。

```/etc/my.cnf
[mysqld]
...
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
```

MariaDBを起動する。

```
$ sudo systemctl enable mariadb.service
$ sudo systemctl start mariadb.service
```

データベースの初期化を行う。

```
$ sudo mysql_secure_installation
```

あとはOpenStackのインストールガイドに沿ってインストールしていきます。
OSシャットダウン時にVirtualBoxの仮想マシンを安全に停止するスクリプト

Vagrant+VirtualBoxでVMをいくつも上げてると、haltし忘れるVMが出てくるものです。（え、うっかりしすぎ？）
VMが立ち上がっている状態ではOSシャットダウンやリブートが正常終了しないため、立ち上がっているVMを調査して安全に停止するスクリプトを書きました。

```bash:/etc/init.d/vboxshutdown
#!/bin/bash

USER="XXXXXX" # VirtualBoxでVMを停止するユーザー
export PATH="${PATH:+$PATH:}/bin:/usr/bin:/usr/sbin:/sbin"

SU="su $USER -c"
CHK_CMD="VBoxManage --version"
CHK_WORD="sudo /etc/init.d/vboxdrv setup" # VBoxManageのバージョンアップが必要な場合
VMLIST_CMD="VBoxManage list runningvms"
VMDOWN_CMD="VBoxManage controlvm VMNAME savestate"

check_vms_state() {
  echo "check VMs state"
  $SU "$CHK_CMD" | grep "$CHK_WORD" >/dev/null 2>/dev/null
  if [ $? != 0 ]; then
    RUNNING_VMS=`$SU "$VMLIST_CMD" | wc -l`
    if [ $RUNNING_VMS != 0 ]; then
      echo "wait for VM shutdown"
      sleep 5
      check_vms_state
    fi
  fi
}


case "$1" in
start)
;;

stop)
$SU "$VMLIST_CMD" | cut -d\" -f2 | while read VM; do
  echo "shutdown $VM"
  $SU "${VMDOWN_CMD/VMNAME/$VM}"
done
check_vms_state

;;

status)
echo "running VMs:"
$SU "$VMLIST_CMD" | cut -d\" -f2 | while read VM; do
  echo "  $VM" 
done
;;

*)
echo "Usage: $0 {start|stop|status}"
exit 3
esac

exit 0
```

### 注意1
このスクリプトはVMを立ち上げるのはある一人のユーザーアカウントだけという前提です。複数のユーザーアカウントでVMを起動する可能性がある場合、イイカンジにスクリプトを修正してください。

### 注意2
Linux Kernelをアップデートすると、"Kernel driver not installed ..."という警告が出てVBoxManageのコマンドが受け付けられない場合があります。そのような場合、vboxdrvを使ってドライバの再セットアップが必要になりますが、CHK_WORDはその警告を検知するためのキーワードです。VBoxManageの仕様が変わったら、イイカンジにスクリプトを修正してください。

## インストール
update-rc.dあたりを使い、適切なランレベルに仕込んでください。
```
$ sudo update-rc.d vboxshutdown defaults
$ ls -l /etc/rc*.d/*vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc0.d/K20vboxshutdown -> ../init.d/vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc1.d/K20vboxshutdown -> ../init.d/vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc2.d/S20vboxshutdown -> ../init.d/vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc3.d/S20vboxshutdown -> ../init.d/vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc4.d/S20vboxshutdown -> ../init.d/vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc5.d/S20vboxshutdown -> ../init.d/vboxshutdown
lrwxrwxrwx 1 root root 22  9月 30 08:43 /etc/rc6.d/K20vboxshutdown -> ../init.d/vboxshutdown
```
QiitaドラフトをiPhone Safariで編集する方法

QiitaドラフトをiPhone Safariで編集する方法メモ。

ドラフト一覧からドラフトの編集画面に遷移しない。
ひとつのドラフトを選択しても一覧画面のままだが、URLはそのドラフトを指すようになるので、URLのおしりに /edit をつけると編集画面にいける
[Rails] date_select, datetime_selectを細かく指定。


# date_select, datetime_selectを細かく指定したい



```html+erb
<div class="birth_date_field">
  <%= f.label :birth_date %>
  <%= f.date_select(
          :birth_date,          
          use_month_numbers: true, # jan, febとかじゃなくて数字で月を表現
          start_year:     1930, # 何年から表示させるか
          end_year:       (Time.now.year), # 何年まで表示させるか
          default:        Date.new(1989, 1, 1), # 最初に表示されている年月日
          date_separator: '/') # 年月日を仕切る文字
   %>
</div>
```


もうちょっと日本ぽくすると。

```html+erb
<div class="birth_date_field">
  <%= f.label :birth_date %>
  <%= raw sprintf(
              f.date_select(
                  :birth_date,
                  use_month_numbers: true,
                  start_year:        1930,
                  end_year:          (Time.now.year - 18),
                  default:           Date.new(1989, 1, 1),
                  date_separator:    '%s'), # 年月日区切りをそれぞれ指定
              '年 ', '月 ') + '日'
   %>
</div>


```


# 参考
- http://railsdoc.com/form
- http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select
- http://blog.inouetakuya.info/entry/2014/01/31/233000
ActiveRecord#all は、idの順番が保証されないので注意！ ActiveRecord#order を使おう！

```rb
User.all.each do |user|
  print "#{user.id}, "
end
```

ってやったらid順にちゃんと```1, 2, 3, 4, 5, ...```って表示されるかなと思ったら、そんなことは無かった。

順番を保証したいのなら、 ```ActiveRecord#order``` を使いましょう！

例えば今回みたいにid順に並べたいなら、

```rb
User.order('id').each do |user|
  print "#{user.id}, "
end
```

これで順番通りに出力されます！

逆順が良いなら、```User.order('id desc').each do |user|...(以下略）``` ってやれば良いみたい。
【素手でも】git さーばー起動【カンタン】


gitサーバ立ててから、bareリポジトリを素手で作成するまでのメモ。

--
bareリポジトリは /opt/git/ 以下に作成するとします。

##git-daemonを起動
```
git daemon --enable=receive-pack --reuseaddr --base-path=/opt/git/ /opt/git/ --verbose &
```

##/opt/gitにbareリポジトリの作成

```
cd /opt/git

mkdir sandbox.git

cd sandbox.git

git --bare init
```

##export-okを作成

```
cd /opt/git/sandbox.git

touch git-daemon-export-ok
```

この時点で問題ない筈。
以下、/home/someone/tmpで
##テスト

```
cd /home/someone/tmp

git clone git://localhost/sandbox.git
```

適当に編集してから・・・

##remote追加
```
git remote add orgin git://localhost/sandbox.git
```

##最後にPushテスト。

```
git push -u orgin master
```

わーい。
CentOS7にGitLab導入(ver. 7.3.1)&Gmail設定

##GitLabとは
GitHubのクローン

##インストール手順
公式のドキュメントを参考に
https://about.gitlab.com/downloads/

作業ディレクトリで
\# yum update
\# yum install curl
\# curl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.3.1_omnibus-1.el7.x86_64.rpm
\# yum install openssh-server
\# systemctl enable sshd
\# systemctl start sshd
\# yum install postfix
\# systemctl enable postfix
\# systemctl start postfix
\# rpm -i gitlab-7.3.1_omnibus-1.el7.x86_64.rpm

/etc/gitlab/gitlab.rbを編集
external_url 'http://your-url'

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'smtp.gmail.com'
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = 'your_name@gmail.com'
gitlab_rails['smtp_password'] = 'your_password'
gitlab_rails['smtp_domain'] = 'gmail.com'
gitlab_rails['smtp_authentication'] = :plain
gitlab_rails['smtp_enable_starttls_auto'] = true

\# gitlab-ctl reconfigure
\# firewall-cmd --permanent --add-service=http # open up the firewall for HTTP and SSH requests
\# systemctl reload firewalld

ホストに接続
Username:root
Password:5iveL!fe

ログイン後，パスワードを変更し，再ログインする