OmniAICreator/Qiita-1.07M huggingface dataset:
runstantで作成したアプリをスマホのホーム画面アイコンから遊ぶ方法


![20141216.png](https://qiita-image-store.s3.amazonaws.com/0/63071/765b44e9-fecd-7b60-8496-b5911d1b851d.png)

プログラミングに挑戦する敷居を大きく下げてくれた[runstant](http://phi-jp.github.io/runstant/release/alpha/)、
作成したアプリはJavaScript製なのでＰＣでもスマホでも動作します。

せっかくならスマホで遊ぶときはホーム画面にアイコンを表示して
他のネイティブアプリ達と並べて遊びたいと思いました。
お友達に遊んでもらう際にも活用できるはずです。
<br>

<手順><ol><li>アイコン画像を作成してウェブ上の画像置き場(DropBox)に置く</li><li>runstant上でアプリのアイコン画像として設定する</li><li>スマホからアプリにアクセスしてホーム画面に配置する</li></ol>

※アイコン画像が自動取得されるスクリーンショットで構わない場合には１、２の作業は必要ありません

<テスト環境>
　・iPhone5S-iOS8.1-Safari 
　・Android-AQUOS-Chrome 


#①アイコン画像を作成してウェブ上の画像置き場に置く

<参考>
[お気に入りアイコン（ファビコン）を指定する](http://www.tagindex.com/html_tag/page/link_favicon.html)
[Web Clipアイコンを指定する](http://www.tagindex.com/html5/page/link_webclip.html)

※ファビコン（ＰＣ用）と同じ画像の場合でもWeb Clipアイコン（スマホ用）は指定する必要があるようです

![apple-touch-icon.png](https://qiita-image-store.s3.amazonaws.com/0/63071/3c9b20c1-8da9-6938-bcd8-62b6e242855b.png)

##アイコン画像を作成する
上記画像はpng形式、114×114ピクセルで作成しました。
ファイル名はapple-touch-icon.pngです（違っても大丈夫です）。
今回は横着して同じ画像を使用しますが、ＰＣ用のファビコンは
サイズの合う画像をきちんとico形式で作成した方が良いかと思います。

##[DropBox](https://www.dropbox.com/ja/)にアップロードする
[DropBox](https://www.dropbox.com/ja/)（ドロップボックス）はウェブ上にファイルを置かせてくれるサービスで、
アップロードしておけばＰＣ以外にも色んなところからファイルにアクセスすることが可能になります。
この記事のために登録してみましたが、自分用のサーバーを持っていなくても
ファイルが共有できる便利そうなサービスです。

runstantからアクセスするためにウェブ上にアイコン画像をアップロードします。
（すでにファイルをアップロードできる場所をお持ちならDropBoxは使用する必要がありません）

DropBoxのホーム画面へファイルをドロップするだけでアップロードは完了です。

![41216_2.png](https://qiita-image-store.s3.amazonaws.com/0/63071/3c17d08d-989c-dc33-0756-42a18d367b9e.png)

#②runstant上でアプリのアイコン画像として設定する
<参考>
[DropboxのPublicフォルダ以外の画像を直接リンクする](http://shiba-sub.sakuraweb.com/?p=5917)

##画像のurlを取得する
DropBoxのアイコン画像の上で右クリック→『共有』を選択します。
![20141216_3.png](https://qiita-image-store.s3.amazonaws.com/0/63071/897212e6-5722-de0c-a0df-a871b2d13bc1.png)

そこに表示されたurlを右クリック→『コピー』します。
そして適当なエディタ（メモ帳など）に貼りつけて

<pre>https://www.dropbox.com/●/●●●?dl=0</pre>

この●/●●●の部分をコピーして

<pre>http://dl.dropbox.com/●/●●●</pre>

この●/●●●の部分に貼り付けます。

<例>
<pre>https://www.dropbox.com/s/2zgcusdxi7xy8ab/apple-touch-icon.png?dl=0</pre>

この場合

<pre>http://dl.dropbox.com/s/2zgcusdxi7xy8ab/apple-touch-icon.png</pre>

このようになります。
これでrunstantからもアクセスできるurlができました。
（ASSETSでアドレス指定するときにもこのurlが使用できます）

##runstantの設定
htmlのhead部分に下記を追加します。

**&lt;link rel="shortcut icon" href="アイコンファイルのurl" type="image/png"&gt;
&lt;link rel="apple-touch-icon" href="アイコンファイルのurl"&gt;**


#③スマホからアプリにアクセスしてホーム画面に配置する
runstantでsaveしてから右上shareでシェア画面を開きます

![share画面](http://dl.dropbox.com/s/mc3b3s276m6unvn/20141216_4.png)

このときに表示されるアドレスを手入力やメール送信などの手段でスマホのブラウザで開きます。

開いたページのshareを押して（スクロールしないと表示されない場合があります）、
さらに左下のFullscreenを押すとそれがアプリ本体のページになります。

あとは

Androidの場合：メニュー→ホームに追加（機種により異なるかもです）
iPhoneの場合 ：送るメニュー→ホーム画面に追加

でそれっぽいアイコンがホーム画面に作成されます！

![20141216.png](https://qiita-image-store.s3.amazonaws.com/0/63071/765b44e9-fecd-7b60-8496-b5911d1b851d.png)

iPhoneの場合透過部分が黒くなってしまうところが難点ですが、ネイティブアプリも
透過しないですし気になる方は透過なしのデザインにすれば問題ないかと思います。

<hr>

以上です！
AndroidとiPhoneのネイティブアプリ開発の知識がなくても
両方のホームに作ったアプリのアイコンが表示できるという誰得？自分得な内容でした！
CakePHPでAPI（JSONで）続き。アソシエーションとの関係

チーム（teams テーブル）があって、それが複数のメンバー（members テーブル）と紐づいているようなケースを想定する。

アソシエーションが、`Team hasMany Member` とした場合のJSONは、以下のようになる。

```json
{
    "data": [
        {
            "Team": {
                "id": "1",
                "name": "A Team"
            },
            "Member": [
                {
                    "id": "1",
                    "team_id": "1",
                    "name": "Yamada"
                },
                {
                    "id": "2",
                    "team_id": "1",
                    "name": "Maeda"
                }
            ]
        },
        {
            "Team": {
                "id": "2",
                "name": "B Team"
            },
            "Member": [
                {
                    "id": "3",
                    "team_id": "2",
                    "name": "Ishida"
                },
            ]
        }
    ]
}
```

`Member belongsTo Team` を`Model/Member.php`に追加しても同じ結果になる。

さらに以下のようにjoinsを使ってLEFT JOIN した場合は、

```php:Controller/ApiController.php
$options['joins'] = array(
	array(
			'table' => 'members',
			'alias' => 'Member',
			'type' => 'LEFT',
			'conditions' => array(
					'Team.id = Member.team_id',
			)
	)
);
$options['fields'] = array('*');
$data = $this->Team->find('all', $options);
```

一行一行のデータになる。

```json
{
	"data": [
		{
			"Team": {
				"id": "1",
				"name": "A Team"
			},
			"Member": {
				"id": "1",
				"team_id": "1",
				"name": "Yamada"
			}
		},
		{
			"Team": {
				"id": "1",
				"name": "A Team"
			},
			"Member": {
				"id": "2",
				"team_id": "1",
				"name": "Maeda"
			}
		},
		{
			"Team": {
				"id": "2",
				"name": "B Team"
			},
			"Member": {
				"id": "3",
				"team_id": "2",
				"name": "Ishida"
			},
		}
	]
}
```

例えばここで、モデルTeam.phpに

```php:Model/Team.php
public $virtualFields = array(
	'member_name' => 'Member.name'
);
```

と記述すれば、同じモデル名にすることはできるが、入れ子にはならない。

```json
{
	"data": [
		{
			"Team": {
				"id": "1",
				"name": "A Team",
				"member_name": "Yamada"
			}
		},
		{
			"Team": {
				"id": "1",
				"name": "A Team",
				"member_name": "Maeda"
			},
		},
		{
			"Team": {
				"id": "2",
				"name": "B Team",
				"member_name": "Ishida"
			},
		}
	]
}
```
Postgresqlで現在のシーケンスの一覧を調べる

うまいやり方を知りたい...

```sql
create or replace function func_dump_seq()
returns integer
AS '
DECLARE 
	rec RECORD;
	stmt VARCHAR(200);
	last_value INT;
BEGIN
	FOR rec IN SELECT sequence_name FROM information_schema.sequences ORDER BY sequence_name LOOP
		EXECUTE ''SELECT last_value FROM '' || rec.sequence_name || '';'' INTO last_value;
		RAISE NOTICE ''%->%'', rec.sequence_name, last_value;
	END LOOP;
	RETURN 0;
END;
'
language 'plpgsql';
```
D3.js 棒グラフ目盛の設置

domain : 表示上のサイズ
range : 実際の出力サイズ (px)

例：幅が400pxの横棒グラフで最大値5000円として表示したいとき

```js
    // スケール設定
    var xScale = d3.scale.linear() // スケールを設定
        .domain([0, 5000]) // 表示上のサイズ
        .range([0, 400]); // 実際の出力サイズ
    // x軸の描画
    svg.append("g")
        .attr("class", "axis")
        .attr("transform", "translate(0, 0)") // 出力起点
        .call(d3.svg.axis()
            .scale(xScale) //スケールを適用する
            .orient("bottom") //下段に描画（bottomはデフォルトなので省略でもよい）
        );
```

domainは表示上のサイズなので、rangeで指定した400px目に5000の目盛が表示されることになる。

上記のように適当に数値設定すると1円が0.08pxとなるので棒のrect幅計算が複雑になる。
その辺に注意して設置したほうがよい。
Androidの画面操作をキャプチャしてgif画像にする

こんな感じで画面の動きを説明したい時、gifがあるとわかりやすくていいですよね。

![0c18a668-4fd0-2747-bcbb-188946bb7a76.gif](https://qiita-image-store.s3.amazonaws.com/0/15267/60e66e21-e937-c59b-c5cc-72bcde119c30.gif "0c18a668-4fd0-2747-bcbb-188946bb7a76.gif")


画面操作をキャプチャしてgif化する方法を説明します。
あくまで自分のやり方なのでちょっとめんどいです。もっと簡単なやり方があれば教えてください！

#Recordableを使って画面操作をmp4にして保存
[Recordable](http://recordable.mobi/)というツールを使って、画面操作をmp4の動画ファイルにして保存します。RecordableはPCにもアプリをインストールする必要がありますが、端末のルート化が不要なので気軽に試せます。

##1. Android端末にアプリをインストールする
[Recordable](https://play.google.com/store/apps/details?id=uk.org.invisibility.recordable)を端末にインストールします.
無料版は[こちら](https://play.google.com/store/apps/details?id=uk.org.invisibility.recordablefree)。無料版にはスクショにロゴが入りますが、まぁ問題ないと思います。

##2. PCにRecordableActivatorをインストールする
[インストールページ](http://recordable.mobi/install)からRecordableActivatorをインストールします。

##3. RecordableActivatorでキャプチャの準備
PCからRecordableActivatorを起動します。

![Recordable_Activator__3_6_1_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/45bfdc76-d8a2-6ce0-49e9-16521400fd2d.png "Recordable_Activator__3_6_1_.png")

USBで端末に接続すると、Activateを開始します。

![Recordable_Activator__3_6_1_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/d3ec1d4c-0965-6198-f338-fda72bccfcb1.png "Recordable_Activator__3_6_1_.png")

Activation Completeが表示されればOKです。端末でRecordableが起動しているはずですが、起動していなければ手動で起動しましょう。ここまでくれば、USBを外しても大丈夫です。
ちなみに端末を再起動したら、もう一度この操作を行う必要があります。

![Recordable_Activator__3_6_1_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/1935f757-51ff-e3f0-bc07-88f856288a35.png "Recordable_Activator__3_6_1_.png")

##4. 端末のRecordableで画面操作を記録
Recordableを開いて画面操作を記録します。

![Screenshot_2014-12-16-16-59-09.png](https://qiita-image-store.s3.amazonaws.com/0/15267/9943b8e0-e7ae-7268-b55b-109441805c5c.png "Screenshot_2014-12-16-16-59-09.png")

右上の右から2番目のアイコンをタップして、ホームボタンを押すと開始前のカウントダウンが始まり、記録開始です。

![Screenshot_2014-12-16-17-02-23.png](https://qiita-image-store.s3.amazonaws.com/0/15267/c218d7e2-8934-9543-bba5-8484ca07160f.png "Screenshot_2014-12-16-17-02-23.png")

再度Recordableを開くと記録完了です。mp4ファイルが作成されます。

![Screenshot_2014-12-16-16-59-56.png](https://qiita-image-store.s3.amazonaws.com/0/15267/45cdf966-aedc-5d5b-f677-f1cb2c682a1f.png "Screenshot_2014-12-16-16-59-56.png")


#Video to GIF converterを使ってgifに変換

作成したmp4をPCに送って、[Video to GIF converter](http://ezgif.com/video-to-gif)というサービスを使ってgifファイルに変換します。
ちなみに端末で作成したmp4は自動的にDropboxで同期するようにしています。
gifに変換するアプリもあったのですが、処理時間が遅かったり変換後に画質が落ちたりトリミングできなかったりしたのでやめました。

Video to GIF converterは、開始・終了時間の設定やトリミングなど最低限の機能が入っているのですぐ使えると思います。mp4をアップロードして色々いじってダウンロードボタンを押すだけです。

----
以上です。アプリだけでもっと簡単に作成できたらいいんですが。。。他にいいやり方を知っていたらぜひ教えてください！
Swiftで単純なアラート制御（UIAlertControllerの実装）

# はじめに

勇んで書き残した前のTips[【iOS8非推奨】Swiftで単純なアラート制御（UIAlertViewDelegateの実装）](http://qiita.com/hirocueki/items/a68b456a42c397ad8260)はiOS8非推奨だったというわけで、 **iOS8推奨** のアラートを書きます。

# OK・キャンセル

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    var alertType: Int!;
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    @IBAction func tapButton(sender: UIButton) {
        var alert = UIAlertController(title: "iOS8のアラート！", message: "OK/Cancel?", preferredStyle: .Alert)
        
        let okAction = UIAlertAction(title: "OK", style: .Default) {
            action in NSLog("OK！")
        }
        
        let cancelAction = UIAlertAction(title: "いいえ", style: .Cancel) {
            action in NSLog("Cancel！")
        }
        
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        
        presentViewController(alert, animated: true, completion: nil)
    }
}
```

# ラーメン・寿司・おあずけ

```swift
import UIKit

class ViewController: UIViewController {

    var alertType: Int!;
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    @IBAction func tapButton(sender: UIButton) {
        var alert = UIAlertController(title: "iOS8のアラート！", message: "?/?/?", preferredStyle: .Alert)
        
        alert.addAction(UIAlertAction(title: "ラーメン ?", style: .Default) {
            action in NSLog("?！")
            })
        
        alert.addAction( UIAlertAction(title: "寿司 ?", style: .Destructive) {
            action in NSLog("?！")
        })
        
        alert.addAction( UIAlertAction(title: "おあずけ ?", style: .Cancel) {
            action in NSLog("?！")
        })
        
        presentViewController(alert, animated: true, completion: nil)
    }
}
```

## 実行結果

![ios8-alert.png](https://qiita-image-store.s3.amazonaws.com/0/32256/9aa52a85-5b4c-9804-3a05-17045ac20ba7.png)


# 要点

1. `デリゲート`から`クロージャ`に変更となり、処理が散らばらない！
2. `UIAlertAction`が選択項目１つと結びついてるので読みやすい。直しやすい。
3. 一時変数をつくらず、`alert.addAction(UIAlertAction(title: "OK", style: .Default) { action in NSLog("OK！") })`できて嬉しい。
4. コード量も減ってステキ
5. `.Destructive`指定すると、寿司の文字が赤くなり、鮪とマッチしてよい


# ここより参考になるリンク

- [【iOS】【Swift】UIAlertControllerの基本的動作のまとめ](http://qiita.com/kitanoow/items/fbf58a943fb2cd1c2127)
- [iOS8でUIAlertViewはこうやってUIAlertControllerに置き換える](http://qiita.com/mo_to_44/items/8cfa139c6f38ba3ab3d2)

# まとめ

寿司食いたい。
RetrofitでMultipartをらくらくPOST


Square社の[Retrofit](http://square.github.io/retrofit/ "Retrofit")はREST通信を簡潔に行うことができる出来た子ですが、いろいろと面倒なMultipartのPOST（PUT）送信も簡潔にできます。

####いつもどおりにRestAdapterからAPIアクセス用のインスタンスを作成します。

```
final Executor executor = Executors.newCachedThreadPool();
final OkHttpClient okHttpClient = new OkHttpClient();
RestAdapter mRestAdapter = new RestAdapter.Builder()
	.setClient(new OkClient(okHttpClient))
	.setExecutors(executor, new MainThreadExecutor())
	.setEndpoint("https://api.hoge.com")
	.setRequestInterceptor(requestInterceptor)
	.setConverter(new GsonConverter(new Gson()))
	.build();
Api mApi = mRestAdapter.create(Api.class);
```


####API通信側を作成。


```Api.java
@Multipart
@POST("/upload")
void updateMultipart(
	@Header("Authorization") String token,				//ヘッダー
	@Part("fileContent") TypedFile file,				//単一ファイル
	@PartMap HashMap<String, TypedFile> fileParams,		//複数ファイル
	@Part("textContent") String text,					//単一ファイル
	@PartMap HashMap<String, String> stringParams,		//複数テキスト
	Callback<MultipartResponse> callback				//非同期にしたいのでコールバックを渡す
    );
```

####APIをコールします。

```

//複数ファイル用
HashMap<String, TypedFile> fileParam = new HashMap<String, TypedFile>();
//複数テキスト用
HashMap<String, String> stringParams = new HashMap<String, String>();

fileParam.put("fileContent1", new TypedFile("image/jpeg", new File(filePath1)));
fileParam.put("fileContent2", new TypedFile("image/jpeg", new File(filePath2)));

stringParams.put("textContent1", "text1");
stringParams.put("textContent2", "text2");

Api.updateMultipart(
		"token",
		new TypedFile("image/jpeg", new File(filePath)),
		fileParam,
		"hoge",
		stringParams,
		new Callback<CreateResponse>() {
            @Override
            public void success(MultipartResponse mMultipartResponse, Response response) {
            		//リクエスト成功
            }

            @Override
            public void failure(RetrofitError error) {
            		//リクエスト失敗
            }
        });
		
```

以前のAndroidでのMultipartリクエストに比べて随分と簡潔に記述できるようになったと思います。
Node.jsのWebサーバ基本処理

１．動作確認

httpのcreateServerを使うだけ。
listenにポート指定してやればよい。

```js
var http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {
        "Content-Type": "text/plain"
    });
    response.write("Hello World");
    response.end();
}).listen(8888);
```


２．リクエスト情報取得

requestはIncomingMessageのインスタンス。
つまり、Readable Streamインタフェースを持つので情報を取得する場合は'data'イベントを追加してやればよい。
処理の終了時に'end'イベントを指定しておく。

```js
var http = require("http");
var querystring = require("querystring");

http.createServer(function(request, response) {
	var postData = "";

	request.on("data", function(chunk) {
		postData += chunk;
	});
	request.on("end", function() {
		res.writeHead(200, {"Content-Type": "text/plain"});
		res.write("POST DATA is " +  querystring.parse(postData).text);
		res.end();
	});
}).listen(8888);

```
Struts2の自動型変換エラーの扱い

## 自動型変換とは

Struts2はリクエストパラメータに対して、Actionクラスのフィールドで受け取ります。その際の型はActionクラスのフィールドへ自動的に型変換を試みます。

例えば金額入力の項目に対して、ActionクラスのフィールドではBigDecimalで用意しておけば、自動的にBigDecimalへの型変換を試み、もし数値以外の値が入っていた場合は「型変換エラー」として、入力チェック(Validation)に引っかかった扱いとなります。

この時、JSPへ表示する場合は、入力されていたテキストをそのまま表示したい場合があります。エラーだからと言って自動的に消えてしまうのは良くないなぁ、と思う利用者さんもいます。そのため、Actionクラスのフィールドと型があわなくても再表示できる仕組みが存在しています。

## Struts2はOGNLで扱う

Struts2は、リクエストパラメータをいったんOGNLで扱います。このOGNL変換したパラメータやコンテキスト属性は、Struts2内の ValueStack と呼ばれる蓄積領域に格納して、さまざまなリクエスト受け取りの前処理、レスポンス出力の前処理に使います。

具体的なクラスは、OGNLValueStack ( com.opensymphony.xwork2.ognl パッケージ )です。

この流れを、例えば金額入力を行う画面と、それを受け取って処理を行うActionクラスの場合で考えます。

```JSP:form.jsp
<s:form action="send.action">
  <s:textfield id="price" name="price"/>
  .........
</s:form>
```

金額のパラメータ名はpriceです。

```java:SendAction.java
public class SedndAction extends ActionSupport {
  public String execute() throws Exception {
    // 何かの処理.....
    return SUCCESS;
  }
  
  @Getter @Setter
  private BigDecimal price;
}
```

ActionクラスはBigDecimalで受け取ります。

Struts2は、リクエストパラメータ price を、Actionクラスのpriceへ格納しようと試行します。もしpriceの値が、数値でない場合(例：AAAAAA)、以下の動作をします。

* OGNLValueStackにあるMap型のoverridesフィールドへいったん退避します
* Actionクラスへの格納はしません。
* FieldErrorの1つであるTypeConvertionErrorが付与されます。

そしてデフォルトの振る舞いであれば、Validationに引っかかった場合はActionクラスは実行されず、Actionクラスのresult値 "input" に定義した先へ処理が委譲します。通常はJSPですね。

## JSPで値を表示しているときに行われること

Struts2のJSPでは、ただ値を表示するだけでなく、型変換に失敗したパラメータがあった場合は、もともとの内容に書きなおして表示する仕組みを提供します。

実際には、先ほどのOGNLValueStackのoverridesフィールドに、同じパラメータ名のものがあった場合はoverridesの内容を出力します。この機構を使ってJSPの出力をしています。
Bashでコマンド履歴から検索して実行する

## コマンド履歴を後方検索

Bashを使っている時に以前実行したコマンドをもう一度または少し変えて実行したい場合があります。

そんな時は`Ctrl-r`で検索モードにしてからコマンドを入力することで以前実行したコマンドを簡単に後方検索することができます。`Ctrl-r`を実行する度に以前のコマンドが表示されるので、何度か`Ctrl-r`を実行すると目的のコマンドが出てくると思います。

```bash
$ (Ctrl-r)
(reverse-i-search)`git': git commit
```
もし`Ctrl-r`を実行しすぎて目的のコマンドを通り過ぎた場合は、`Ctrl-s`で履歴を戻ることもできます。

ただし、通常は`Ctrl-s`にスクリーンロックがかかっていて戻れないことが多いです(スクリーンロックしてしまったら`Ctrl-q`で解除してください)。そんな時は`Ctrl-s`に割り当てられているスクリーンロックを解除することで戻れるようにできます。

## スクリーンロックを解除して前方検索出来るように設定

ショートカットキーの割当状況を確認します。もし`stop=^S`になっていれば以下の操作によって解除してください。

 ```bash
 $ stty -a
 ```

スクリーンロックを未定義にする。

 ```bash
 $ stty stop undef
 ```

`stop=<undef>`になっているか確認する。

 ```bash
 $ stty -a
 ```

## `history`で検索

もちろん`history`コマンドを実行して履歴番号をもとに実行(出力)することもできます。`grep`を使って絞り込んだりできるので、この方が便利なこともあります。必要に応じて使い分けてください。

```bash
$ history
...
122  git statu
123  git diff app/
...
$ !123↵   <== 123番目のコマンドを実行する
$ !123:p↵   <== 123番目のコマンドを出力(echo?)する
$ !123
      ^--- ここで ESC Control-e を押す
```
【iOS8非推奨】Swiftで単純なアラート制御（UIAlertViewDelegateの実装）

# はじめに

>Important: **UIAlertView is deprecated in iOS 8**. (Note that UIAlertViewDelegate is also deprecated.) 
>（あのね、これiOS8では非推奨になってるから。）

（え）

## iOS8推奨版に書きなおしました

- [Swiftで単純なアラート制御（UIAlertControllerの実装）](http://qiita.com/hirocueki/items/a68b456a42c397ad8260)

# OK・キャンセル

```swift
import UIKit

class ViewController: UIViewController , UIAlertViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    
    @IBAction func tapButton(sender: UIButton) {
        let alert: UIAlertView! = UIAlertView(
                    title: "Confirm",
                    message: "OK/Cancel",
                    delegate: self,
                    cancelButtonTitle: "Cancel",
                    otherButtonTitles: "Ok")
        alert.show()
    }
    
    func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
        if buttonIndex == 0 {
            NSLog("pushed Cancel Button")
        } else if buttonIndex == 1 {
            NSLog("pushed OK Button")
        }
    }
}
```


# 3択（寿司・ラーメン・断食）

```swift
import UIKit

class ViewController: UIViewController ,UIAlertViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    @IBAction func tapButton(sender: UIButton) {
        let alert: UIAlertView! = UIAlertView(
                    title: "どちらかえらべ",
                    message: "食べます",
                    delegate: self,
                    cancelButtonTitle: "断食",
                    otherButtonTitles: "寿司", "ラーメン")
        alert.show()
    }
    
    func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
        if buttonIndex == 0 {
            NSLog("(ヽ´ω`)ぎゅるるぅぅ。。。")
        } else if buttonIndex == 1 {
            NSLog("?")
        } else if buttonIndex == 2 {
            NSLog("?")
        }
    }
}
```



# 要点

1. `UIAlertViewDelegate`プロトコル宣言
2. `Action`時に、`alert`作成と、実行
3. `alertView`の実装
4. iOS8では非推奨!!`(ヽ;ω;)`
tmux上でrbenv 経由でRubyのバージョンが切り替わらなくなった件


最近、開発環境周りを刷新してやろうと、色々とゴニョゴニョやってたら、
いつのまにかtmux上で

```
$ rbenv global xxx(rbenvでインストールしたrubyバージョン)
```

が実行できなくなっていた。

# 環境

| 環境     | バージョン |
|:---------|:--------|
| MacOSX   | 10.9.5  |
| Homebrew | 0.9.5   |
| tmux     | 1.9a    |
| rbenv    | 0.4.0   |

# 現象

具体的には現象はこう。

```iTerm2
$ rbenv versions
  system
* 1.9.3-p125 (set by /Users/uryu/.rbenv/version)
  2.0.0-p576
  2.1.3
  jruby-1.7.3
```

```tmux
$ rbenv versions
* system (set by /usr/local/opt/rbenv/version)
```

systemしかない…
しかも、set by の部分が「/usr/local/opt/rbenv」になってる。
(rbenv を Homebrew でいれてるからだと思う。）

そのまま無視して、ruby のバージョン切り替えようと実施しても

```tmux
$ rbenv global 2.1.3
rbenv: version `2.1.3' not installed
```

で、ですよね…
PATHは下記の通り。

```iTerm2
$ echo $PATH
/Users/uryu/.rbenv/shims:/Users/uryu/.rbenv/bin:...(snip)...
```

```tmux
$ echo $PATH
/usr/local/opt/rbenv/shims:/Users/uryu/.rbenv/bin:/Users/uryu/.rbenv/shims:...(snip)...
```

/usr/local/opt/rbenv が先頭に来てますね。
$HOME/.rbenv/shims tmux上でもロードされてるのは.zshrcにこのパスだけベタで書いてるからです。
tmux上でもrbenvのパスを固定できるようにできないのかな。

- [tmux環境でrbenvによるバージョン変更が出来ない現象](http://qiita.com/omega999/items/5dbea9571efad07754ae "tmux環境でrbenvによるバージョン変更が出来ない現象")
- [tmux + rbenv の環境で指定した Ruby が使われない件](http://d.hatena.ne.jp/akishin999/20130627/1372284674 "tmux + rbenv の環境で指定した Ruby が使われない件")

ここらへん参考にしてみても原因が違うのか解決にいたらず。
ぐぬぬ…orz

解決に至ったら追記します。

# 追記(2014/12/16 18:30)
~/.zshrcに下記のように RBENV_ROOT を追加すれば解決しました。

```~/.zshrc
$ cat ~/.zshrc
...(snip)...

export RBENV_ROOT=$HOME/.rbenv ← 追記
eval "$(rbenv init - zsh)"
```

## 解決に向かった要因

```
$ eval "$(rbenv init - zsh)"
```

こいつが怪しいんじゃないかと思い、
=> ~/.zshrc から上記コマンドを消してパス見てみたら、rbenvのパスが追加されていない
=> じゃあ、パスに~/.rbenv/shims のパスをベタで書いて、eval 実行しなかったらどうなるんだろう。
=> パスは通ってるけど、現象は変わらず。（しかも補完も効かなくなった…）
=> eval が /usr/local/opt/rbenv/shims のパスを追加してるんだ。
=> こいつを~/.rbenv/shims に固定することできないかな… ← 追記前まで

調べても出てこないし、rbenv-initスクリプトの実装を見てみました。

```/usr/local/Cellar/rbenv/0.4.0/libexec/rbenv-init(l.74-76)
...(snip)...

mkdir -p "${RBENV_ROOT}/"{shims,versions}

echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"'

...(snip)...
```

お、echo だけど、こいつ怪しいな。
$RBENV_ROOT ってなんだよ…

```iTerm
$ echo $RBENV_ROOT

```

```tmux
$ echo $RBENV_ROOT
/usr/local/opt/rbenv
```

tmux 上では設定されるのね。
(これがどこで設定されているかまでは追えませんでした…)
んで、今度は/usr/local/Cellar/rbenv/0.4.0/libexec/rbenv の実装を見てみると

```/usr/local/Cellar/rbenv/0.4.0/libexec/rbenv(l.23-28)
...(snip)...

if [ -z "${RBENV_ROOT}" ]; then
  RBENV_ROOT="${HOME}/.rbenv"
else
  RBENV_ROOT="${RBENV_ROOT%/}"
fi
export RBENV_ROOT

...(snip)...
```

となっている。
$RBENV_ROOT が既に設定されていたら、そこをルートディレクトリにすると。よくあるパターンですね。

ってことは、$RBENV_ROOT を常に~/.rbenv にしておけば、
tmux 上でも$RBENV_ROOT は変わらないよね！(ﾄﾞﾔｧ

※

```~/.zshrc
export RBENV_ROOT=""
```

でもいける気がするけど、なんか気に食わかなったのでやりませんでした。
ubuntuでtmuxでコピーでクリップボードへ放り込むメモ

多分Ubuntuじゃなくても`xsel`入れば何でもいいと思う。

1. `apt-get install xsel`とかでxsel(クリップボード操作するツール)インスコする
2. `.tmux.conf`に以下のように書く

```
setw -g mode-keys vi
bind-key -t vi-copy Enter copy-pipe "cat | xsel -i --clipboard"
``` 

コピーモードのキーバインドをvim風にする設定と混じってる気がするけどよく分からないのでtmuxマスターの皆さんは適宜読み替えてください。

ペーストは知りません、適当にやってください。
僕はクリップボードへ入りさえすれば満足だった。
Hubotで始める簡単Bot開発


こんにちは，sai研M1の [@hico_horiuchi](https://twitter.com/hico_horiuchi) です．
この記事は [SLP KBIT Advent Calendar 2014](http://www.adventar.org/calendars/417) の16日目です．
今回は，最近ハマっている [Hubot](https://hubot.github.com/) について書きます．

## もくじ

  - BotとHubotの概要について簡単に説明します．
  - Windows上でHubotを動かしてみよう．
  - 簡単なHubot Scriptを作ってみよう．

## Botとは?

> チャットに常駐して，発言に応じて応答を返したり，決められた条件に従って発言して参加者に通知したりするようなプログラムのことをBotと呼びます．
> Botを使うことで，定型的な処理を自動化したり，人工無能のような受け答えをさせることでチャットを楽しくしたりすることができます．

TwitterのBotを想像してもらうと分かりやすいかな．
「特定のキーワードに反応する」「リプライを返す」「定期的に呟く」など，やることは同じです．

## Hubotとは? 

> Hubotとは [GitHub](https://github.com/) が開発したBotフレームワーク(枠組み)です．
> CoffeeScript(またはJavaScript)で処理を書くことで，簡単に機能を拡張できます．
> また，TypetalkやTwitterなど，複数のサービスに対応させることができます．

「フレームワーク」なので，実際の処理部分だけの開発で済みます．
Botとしての基本的な機能(チャットの取得と発言など)は，Hubotが提供してくれます．

## Windowsで動かす

Hubotは [Node.js](http://nodejs.org/) というJavaScript環境上で動作します．
今回は，[nodist](https://github.com/marcelklehr/nodist) というWindows用のNode.js環境をインストールします．

  1. [コチラ](https://github.com/marcelklehr/nodist/archive/master.zip) からnodistの最新版をダウンロード
  2. `nodist-master.zip`を解凍して，`C:\nodist`に配置する．
  3. コマンドプロンプトを開き，以下のコマンドを実行する．

```
> setx /M PATH "C:\nodist\bin;%PATH%"
> setx /M NODIST_PREFIX "C:\nodist"
> nodist selfupdate
> node -v
v0.10.33
```

次にHubotをインストールします．
引き続きコマンドプロンプトで作業します．

```
> npm install -g hubot coffee-script yo generator-hubot
> mkdir C:\nodist\mybot
> cd C:\nodist\mybot
> yo hubot
```

対話形式でHubotの初期設定をしますが，全てEnterを押してください．
終わったら，Hubotを実行してみましょう．

```
> bin/hubot.cmd
Hubot> hubot ping
PONG
Hubot> hubot time
Server time is: Tue Dec 16 2014 15:35:30 GMT+0900 (東京 (標準時))
```

こんな感じで`hubot`に続けてコマンドを打つと，対応する結果を返してくれます．

## 簡単なscriptを作る

「SLPの活動時間を教えてくれる」scriptを作ってみましょう．
`C:\nodist\hubot\scripts\slp.coffee`を作って，好きなエディタで開いてください．
開けたら，以下の内容をコピペします．

```coffeescript
module.exports = (robot) ->
  robot.respond /slp$/i, (msg) ->
    msg.send 'SLPは毎週水曜日と金曜日の19時から活動しています!'
```

`robot.respond`は，`hubot`とBotの名前を付けた発言に反応します．
その後の`/slp$/i`という正規表現にマッチすると，`msg.send`で発言します．
実際に実行して，動くか確認してみましょう．

```
> bin/hubot.cmd
Hubot> hubot slp
SLPは毎週水曜日と金曜日の19時から活動しています!
```

## まとめ

BotとHubotについて解説した後，実際にHubotを動かしたり，scriptを書いたりしてみました．
今回は単純なコマンドに反応させただけですが，Hubotは他にも色んなことができます．

  - GitHubのリポジトリの更新(`push`，`issue`など)を通知
  - 他サービスのAPIを呼出(アニメの放送時間をチェックなど)

[Hubot Advent Calendar 2014](http://www.adventar.org/calendars/384) で @bouzuya さんがHubotについて連載しています．
興味のある人はチェックしてみてください．

また，TypetalkのSLPトピックに私が作ったHubot「[Huboco](https://github.com/hico-horiuchi/huboco)」が居ます．
ぜひ話しかけてあげてください．

## 参考文献

  - [第1回 Hubotとは何か:GitHub社謹製! bot開発・実行フレームワーク「Hubot」 | gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/hubot/0001)
  - [Hubot / ChatOps とは - Qiita](http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696)
RAC環境のOracleDatabaseからの高速エクスポート


##課題
Infiniband接続でのEXADATA → ZFSストレージへのエクスポートがHWスペックの割に低速

##結論
・PARALLEL指定＋ダンプファイルの複数化(%u)が有効だった
　→これによりdatabase nodeのCPU使用と、ディスクIOが分散されリソースを有効活用出来た

##条件
Oracle Database 11gのEnterprise Editionでのみ有効
・オブジェクト単位の分散処理のため、単一の巨大テーブルだとあまり意味がないと思われる
・EXADATAのみでなく、OracleDatabaseApplianceでも有用

##コマンド例

```
$ expdp {SCHEMA}/{PASSWORD}@{接続先DB} dumpfile=FULL_DUMP_DIR:EXPTEST%u.DMP logfile=FULL_DUMP_DIR:EXPORT_EXPTEST.log schemas={SCHEMA} COMPRESSION=ALL PARALLEL=6
```

## 計測値
＜ケース１＞
　　6分　→　2分40秒
性能：274.2GB/h
＜ケース２＞
　　4時間　→　52分
性能：86.4GB/h

##参考
http://docs.oracle.com/cd/E16338_01/server.112/b56303/dp_export.htm#i1006404
C++-LIKE Object Oriented Matlab!

# Summary

C++、Objective-CみたいにObjectiveに書く方法がMatlabで実装されていて、
まとめてみます。

ずばり、**ファイル分割できる**ことが管理の面での強み(?)といえます。

*※setter, getterはクラスファイル内でしか定義できないとのこと。*

# 本題

## 実装

引用すると下記の通り。

> 複数のファイルへのクラス定義の分配</p><p>複数のファイルを使用してクラスを定義する場合は、すべてのクラス定義ファイル (classdef とすべてのクラス メソッド ファイルを含むファイル) を単一の @ 
ClassName フォルダーに配置します。
> ![distributing_ja_JP.png](https://qiita-image-store.s3.amazonaws.com/0/19990/ebe27f64-d6dc-243e-83e7-ec62eb4873ce.png)
> この @ フォルダーは、MATLAB パス上のフォルダー内になければなりません。@ フォルダーには、クラスを 1 つだけ定義できます。
> パス フォルダーには、@ フォルダーで定義されているクラスと、@ フォルダーを使用せずに単独ファイル内で定義されているクラスの両方を含めることができます。
> via [クラス ファイル - MATLAB &amp; Simulink - MathWorks 日本](http://jp.mathworks.com/help/matlab/matlab_oop/saving-class-files.html)

## 実装のうえでのルール

###別ファイル内のメソッド

留意点としては、

* getter/setterはクラスファイル内、

* 外部ファイルに書く関数はクラスファイルでは中身を定義しない

といったことが挙げられます。
以下、ドキュメント見て行きましょう。

>クラス @ フォルダー内の別のファイルにクラス メソッドを定義できます。
>この場合は、関数と同じ名前を付けた別のファイル (functionname.m) に関数を作成します。
>そのメソッドの属性の値を指定する場合は、classdef ブロックのメソッド ブロック内でメソッドのシグネチャを宣言しなければなりません。次に、例を示します。

```matlab:myClass.m
classdef myClass
   methods (AttributeName = value,...)
      tdata = testdata(obj,arg1,arg2) % ここではまだ実装しない。C++の.hファイルみたい。
 ...
   end % methods
 ...
end % classdef
```

>別のファイルのメソッド ブロックは使用しないでください。メソッドを関数として定義します。
>上記の例を使用すると、ファイル testdata.m は、関数 testdata の定義を含まなければなりません。
>シグネチャはすべて同じであることに注意してください。

```matlab:testdata.m
function tdata = testdata(myClass_object,argument2,argument3)
   ...
end
```

>別々のファイルに定義したメソッドには、以下の制限が適用されます。
>別のファイルに定義されたメソッドの属性を指定する場合、
このメソッドを classdef ブロックの属性値を指定するメソッド ブロックで宣言する必要があります。
>メソッドブロックで宣言される構文は使用される場合、メソッドの function 行に一致する必要があります。
>別のファイルは、クラスの @ フォルダーになければなりません。
>コンストラクター メソッドは、classdef ブロックで定義する必要があり、別のファイルには存在できません。
>このメソッドの詳細は、「クラス コンストラクター メソッド」を参照してください。
>プロパティ set と get access メソッドは、classdef ブロックに定義しなければならないので、別々のファイルには存在できません。これらのメソッドの詳細は、「プロパティ アクセス メソッド」を参照してください。
via [通常のメソッド - MATLAB &amp; Simulink - MathWorks 日本](http://jp.mathworks.com/help/matlab/matlab_oop/ordinary-methods.html#brdqipw-3)

## 使用シーンへの考察

C++のように、Headerと実装ファイルを分けて書くことに慣れている方、
関数が多くなりすぎて、関数一覧だけまとめて見たい人などがこのようにすると
良いと思います。

上記例にて最初ClassNameA.mだけ作成していたものを、
関数が増えたから
@ClassNameA---ClassNameA.mへと移動するのは全く労力ではないので、
意外にクラスファイルが長くなったら整理にために切り分ける、といったところだと思います。

現実的なメリットが見えづらいですが、おそらくこんなところでしょう。

# 結言

Matlab正直書きやすいのかどうかいまだに謎ですが、
パッケージ制がとられていたりで、一応Object Orientedに書くことはできます。
頑張りましょう。
Node.js EventEmitterの基本


emitter.on : リスナーの追加
emitter.once : 一回限りのリスナーの追加
emitter.removeListener : リスナーの削除

emitter.emit(event, [arg1], [arg2], [...]) : eventに対応するリスナーを実行argは引数

以下のコードで動作確認。

```js
var util = require("util");
var events = require('events');

function MySample() {
	events.EventEmitter.call(this);
}
util.inherits(MySample, events.EventEmitter);

MySample.prototype.log = function(data) {
	console.log(data);
}

var sample = new MySample();
```

１．onとonceの違い

```js
sample.on('data', sample.log);
sample.once('data_once', sample.log);


sample.emit('data', 1);
sample.emit('data', 2);
sample.emit('data_once', 3);
sample.emit('data_once', 4);
```

実行結果

```text
1
2
3
```

onceは引数3のemitでリスナーから削除されている。


２．onceをonとremoveListenerで表現

```js
sample.on('data', sample.log);
sample.on('data_once', sample.log);

sample.emit('data', 1);
sample.emit('data', 2);
sample.emit('data_once', 3);
// 3を実行後に'data_once'リスナーを削除する
sample.removeListener("data_once", sample.log);

sample.emit('data_once', 4);
```

実行結果

```text
1
2
3
```

console.log(sample.listeners('data_once'));を適所に入れてやるとリスナーの状態がわかる。
once指定のときとonでは中身のfunctionが異なるが１と２は実質同じ動きをする。
Redmine インストール

rootユーザーのパスワード変更・匿名ユーザー削除ほかセキュリティ向上

MySQLのセキュリティ向上のために、初期設定ツール mysql_secure_installation を実行してrootパスワードの設定や不要なユーザー・データベースの削除を行います。

mysql_secure_installation
      :
    (中略)
      :
Enter current password for root (enter for none):   (そのままEnterキーを押す)
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y
New password:   (MySQLのrootユーザーに新たに設定するパスワードを入力)
Re-enter new password:   (新パスワードを再入力)
Password updated successfully!
Reloading privilege tables..
 ... Success!
      :
    (中略)
      :
Remove anonymous users? [Y/n] y  (匿名ユーザーを削除)
 ... Success!
      :
    (中略)
      :
Disallow root login remotely? [Y/n] y  (rootユーザーの接続元をlocalhostに限定)
 ... Success!
      :
    (中略)
      :
Remove test database and access to it? [Y/n] y  (testデータベースを削除)
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!
      :
    (中略)
      :
Reload privilege tables now? [Y/n] y  (これまでの変更を直ちに適用)
 ... Success!
MySQLのrootユーザーに設定した新パスワードは、今後MySQLにrootで接続してデータベースの管理操作を行うときに入力を求められます。

Redmine用データベースとユーザーの作成

mysql -uroot -p
mysql> create database db_redmine default character set utf8;
mysql> grant all on db_redmine.* to user_redmine@localhost identified by '********';
mysql> flush privileges;
mysql> exit;
※ ******** の部分は任意のパスワードを設定してください。このパスワードは後述のdatabase.ymlの設定で使用します。




root
Promiseを使ったforループ

こんな感じのループ処理をPromiseでやりたい。

```js
for (var i = 0; i < 10; i++) {
  console.log(i);
}
console.log('END!!!');
```

関数を作ってみた。

```js
function loop(init, condition, callback, increment) {
  return new Promise(function(resolve, reject) {
    init().then(function _loop() {
      condition().then(function(result) {
        if (result)
          callback().then(increment).then(_loop, reject);
        else
          resolve();
      }, reject);
    }, reject);
  });
}
```

`init`, `condition`, `callback`, `increment`はそれぞれ全て`Promise`を返す関数として実装します。
同期処理的に書くとこんな感じ。

```js
for (init(); condition(); increment()) {
  callback();
}
```

使い方

```js
var i;
loop(function() {
  return new Promise(function(resolve, reject) {
    i = 0;
    resolve();
  });
}, function() {
  return new Promise(function(resolve, reject) {
    resolve(i < 10);
  });
}, function() {
  return new Promise(function(resolve, reject) {
    console.log(i);
    resolve();
  });
}, function() {
  return new Promise(function(resolve, reject) {
    i++;
    resolve();
  });
}).then(function() {
  console.log('END!!!');
});
```

上記の例では`resolve`しか呼んでませんが、ループ途中で例外を投げたり`reject`を呼ぶと処理を中断してループを抜け、loop関数が返した`Promise`が`rejected`になります。

うーんもっと簡単に書けないかなぁ…

`return new Promise`は固定なので`loop`の中に入れるという手もある。ただPromiseをどうやって生成するかはプログラマ側に任せたほうが良いかもしれない。Promise対応ライブラリの呼び出しということもありうるし。
Xcode4プロジェクトをXcode5で開いたときのInterface Builderの不具合


（投稿整理のため、過去にはてなBlogで書いたものの移植記事です。）

先日、以前Xcode4で作ったアプリをアップデートしようとXcode5で開いたところ、Interface Builderに不具合が起こりました。とはいえ、修正自体は簡単だったので、もし同じ状況になってしまった方のヒントにでもなればと思います（今更感満載ですが）。


## ボタンが青くなる問題

さて、何が起こったかといいますと、Interface Builderで設置したUIButtonが何やら真っ青になっています。画像を見てもらえるとすぐ分かるかと思います（画像は英単語アプリの一部です）。

![20140311220719.png](https://qiita-image-store.s3.amazonaws.com/0/48393/8f05e7fc-02ce-4a6f-2027-ae52ea4031e5.png "20140311220719.png")

さて、Interface Builderを覗いてみます。こんな感じ。

![20140311221204.png](https://qiita-image-store.s3.amazonaws.com/0/48393/aabade00-6d63-30bd-1354-b3913ef8e935.png "20140311221204.png")

青いですね…。青いです。原因ですが、UIButtonのTypeがなぜか「System」に置き換わっていました。UIButton全部ではなく一部だけなので原因は定かではありませんが、どうやらここが問題のようです。

![20140311223008.png](https://qiita-image-store.s3.amazonaws.com/0/48393/c9a88f06-fc2e-9fd0-30b2-319cf369cd41.png "20140311223008.png")

Typeの項目を「System」から「Custom」へ変更すると無事直りました。簡単ですが、どうやら一部不具合がある模様。見えないところで悪さをしてないことを祈ります…。
SHのPC相対について

【追記】元記事が修正されました。

『[熱血！アセンブラ入門](http://www.shuwasystem.co.jp/products/7980html/4180.html)』の[書籍の補足情報](http://kozos.jp/books/asm/information.html)に以下の記述があります。

> ■ SHのＰＣ相対について (2014/10/04)
> 
> ＰＣ相対によるメモリアクセスの際に，ＰＣの値が４バイトアラインメントされて いるという記述がありますが，すみませんちょっと筆者の勘違いが残ってしまって いたようです．(情けない…) 
> 
> sh-elf.dを実際に見てみたところ，以下のようになっているようです． 
> 
> ・ ＰＣ(プログラムカウンタ)は，２つ先の命令を指している． 
> ・ mov.wで２バイトをＰＣ相対でロードする際には，ＰＣ＋オフセットで アドレスを計算している．(単純に加算するだけ) 
> ・ mov.lで４バイトをＰＣ相対でロードする際には，ＰＣを４バイトアラインメント して，さらにオフセットを加算することでアドレスを計算している． (４バイトロードなので，アラインメントされる) 

これについて検証してみました。

# mov.w

`mov.w`命令で近くのメモリから値を読み込みます。

※ 機械語を見るためのコードで、実行は想定していません。

```text:sh1.s
test0a:
    mov.w 0f,r0
    nop
0:  .word 0x7788

test0b:
    mov.w 0f,r0
    nop
0:  .word 0x7788

test1a:
    mov.w 0f,r0
    nop
    nop
0:  .word 0x7788

test1b:
    nop
    mov.w 0f,r0
    nop
    nop
0:  .word 0x7788
```

`mov.w`命令の相対アドレス（`90 XX`のXXの部分）に注目します。

```text:逆アセンブル結果
00000000 <test0a>:
   0:	90 00       	mov.w	4 <test0a+0x4>,r0	! 7788
   2:	00 09       	nop	
   4:	77 88       	add	#-120,r7

00000006 <test0b>:
   6:	90 00       	mov.w	a <test0b+0x4>,r0	! 7788
   8:	00 09       	nop	
   a:	77 88       	add	#-120,r7

0000000c <test1a>:
   c:	90 01       	mov.w	12 <test1a+0x6>,r0	! 7788
   e:	00 09       	nop	
  10:	00 09       	nop	
  12:	77 88       	add	#-120,r7

00000014 <test1b>:
  14:	00 09       	nop	
  16:	90 01       	mov.w	1c <test1b+0x8>,r0	! 7788
  18:	00 09       	nop	
  1a:	00 09       	nop	
  1c:	77 88       	add	#-120,r7
```

この結果を見ると、4バイトアラインメントの影響はなく、以下の記述は正しいようです。

> ・ ＰＣ(プログラムカウンタ)は，２つ先の命令を指している． 
> ・ mov.wで２バイトをＰＣ相対でロードする際には，ＰＣ＋オフセットで アドレスを計算している．(単純に加算するだけ) 

# mov.l

`mov.l`命令で近くのメモリから値を読み込みます。

```text:sh2.s
test0a:
    mov.l 0f,r0
    nop
0:  .long 0x778899aa

test0b:
    nop
    mov.l 0f,r0
0:  .long 0x778899aa

test1a:
    mov.l 0f,r0
    nop
    nop
    nop
0:  .long 0x778899aa

test1b:
    nop
    mov.l 0f,r0
    nop
    nop
0:  .long 0x778899aa
```

`mov.l`命令の相対アドレス（`d0 XX`のXXの部分）に注目します。

```text:逆アセンブル結果
00000000 <test0a>:
   0:	d0 00       	mov.l	4 <test0a+0x4>,r0	! 778899aa
   2:	00 09       	nop	
   4:	77 88       	add	#-120,r7
   6:	99 aa       	mov.w	15e <test1b+0x142>,r9

00000008 <test0b>:
   8:	00 09       	nop	
   a:	d0 00       	mov.l	c <test0b+0x4>,r0	! 778899aa
   c:	77 88       	add	#-120,r7
   e:	99 aa       	mov.w	166 <test1b+0x14a>,r9

00000010 <test1a>:
  10:	d0 01       	mov.l	18 <test1a+0x8>,r0	! 778899aa
  12:	00 09       	nop	
  14:	00 09       	nop	
  16:	00 09       	nop	
  18:	77 88       	add	#-120,r7
  1a:	99 aa       	mov.w	172 <test1b+0x156>,r9

0000001c <test1b>:
  1c:	00 09       	nop	
  1e:	d0 01       	mov.l	24 <test1b+0x8>,r0	! 778899aa
  20:	00 09       	nop	
  22:	00 09       	nop	
  24:	77 88       	add	#-120,r7
  26:	99 aa       	mov.w	17e <test1b+0x162>,r9
```

この結果を見ると、以下の記述は少し補足が必要なように思います。

> ・ ＰＣ(プログラムカウンタ)は，２つ先の命令を指している． 
> ・ mov.lで４バイトをＰＣ相対でロードする際には，ＰＣを４バイトアラインメント して，さらにオフセットを加算することでアドレスを計算している． (４バイトロードなので，アラインメントされる) 

一般的にアラインメントでは切り上げすることが多いように思いますが、`a: d0 00`と`1e: d0 01`は~~切り下げ~~切り捨てでアラインメントされています。というわけで~~「切り下げ」~~「切り捨て」を明記した方が誤解が少ないように思います。

【追記】「切り下げ」という言い方は一般的ではなく、普通は「切り捨て」と言うというご指摘を受けました。
Redmine インストール　EPELリポジトリの登録でつまづきました。


http://daiki2034.hatenablog.com/entry/2014/10/14/214106

EPELリポジトリの登録
これが手順通りだと下記のエラーになりました。

[root@localhost sysconfig]# rpm -Uvh epel-releasehttp://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
エラー: epel-releasehttp://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm のオープンに失敗: そのようなファイルやディレクトリはありません
そのためyumを使ってインストールします。

[root@localhost sysconfig]# yum install epel-release



そのあと
yum repolist
はエラーがでますが以下のようにすると
大丈夫です。



vi /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
ssh-keygenをパスフレーズの確認なしで作成する

GHEのレポジトリ毎に鍵を作る必要があったので、
自動化スクリプトを作るためにssh-keygenをノンパスで入力確認無く作成出来る方法を探したので一応メモ

```
ssh-keygen -f ${file_name} -t rsa -N ""
```
$.ajax でオブジェクトの配列を POST したい

## 事案

`$.ajax({ type: 'POST'})` でオブジェクトの配列を Rails に送るぞー！


### POST するコード

```coffeescript:ajax.js.coffee
$.ajax
  type: 'POST'
  url: url
  dataType: 'json'
  data:
    users: [
      room: 201
      name: 'ゆの'
    ,
      room: 202
      name: '宮子'
    ]
```

### 理想

```ruby:params
{
  "users" => [{
    "room" => 201,
    "name" => "ゆの"
  }, {
    "room" => 202,
    "name" => "宮子"
  }]
}
```

### 現実

```:FormData
users[0][room]:201
users[0][name]:ゆの
users[1][room]:202
users[1][name]:宮子
```

```ruby:params
"users" => {
  "0" => {
    "room" => "201",
    "name" => "ゆの"
   },
  "1" => {
    "room" => "202",
    "name" => "宮子"
  }
}
```

▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああ

### 原因

[jQuery API Documentation](http://api.jquery.com/jquery.ajax/) を見ると、

> It is converted to a query string, if not already a string. It's appended to the url for GET-requests. See processData option to prevent this automatic processing. Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same key based on the value of the traditional setting (described below).

と書いてありました。Object や Array を渡した場合は jQuery が `$.param` でシリアライズするんですね。

## 解決策

* `$.ajax` のオプションで `contentType: 'application/json'` を指定する。
* `data` の値を `JSON.stringify` などで JSON 文字列に変換する。

```coffeescript:ajax.js.coffee
$.ajax
  type: 'POST'
  url: url
  dataType: 'json'
  contentType: 'application/json'
  data: JSON.stringify(
    users: [
      room: 201
      name: 'ゆの'
    ,
      room: 202
      name: '宮子'
    ]
  )
```

```:RequestPayload
{"users":[{"room":201,"name":"ゆの"},{"room":202,"name":"宮子"}]}
```

```:params
{
  "users" => [{
    "room" => 201,
    "name" => "ゆの"
  }, {
    "room" => 202,
    "name" => "宮子"
  }]
}
```

✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌ 送れた！

## 参考

* [How do I POST an array of objects with $.ajax (jQuery or Zepto)](http://stackoverflow.com/questions/11109795/how-do-i-post-an-array-of-objects-with-ajax-jquery-or-zepto)
* [What is the difference between form data and request payload?](http://stackoverflow.com/questions/10494574/what-is-the-difference-between-form-data-and-request-payload)
Chromeの開発ツールでDOM検索すると便利だった

CSSセレクター使えた！というお話。

## 文字
![moji](https://qiita-image-store.s3.amazonaws.com/0/25772/308cf1a8-6ddc-b9af-39a6-26d2981701db.png)


## class
![class](https://qiita-image-store.s3.amazonaws.com/0/25772/9783e77a-53db-08ca-23dc-c39579570fec.png)

# id
![id](https://qiita-image-store.s3.amazonaws.com/0/25772/39c1761a-815b-7500-b554-41d41b5cc01c.png)

# nameとか
![sonota](https://qiita-image-store.s3.amazonaws.com/0/25772/dc8f9330-9c53-c9cd-4693-bb16ac899b20.png)
AWS SDK for JavaScript in Node.js with Promise

AWS SDKのメソッドをPromise使って呼びたいなと思ったので簡単なラッパーを書いてみました。

```js
var AWS = require('aws-sdk'),
  Promise = require('promise');

var s3 = new AWS.S3({
  accessKeyId: 'PUT_YOUR_KEY',
  secretAccessKey: 'PUT_YOUR_SECRET_KEY',
  region: 'ap-northeast-1'
});

for (var method in s3) {
  if (typeof s3[method] === 'function')
    exports[method] = (function(method) {
      return function(params) {
        return new Promise(function(resolve, reject) {
          s3[method](params, function(err, result) {
            if (err)
              reject(err);
            else
              resolve(result);
          });
        });
      }
    })(method);
}
```

## 利用例

```js
var s3 = require('./s3');

s3.listObjects({
  Bucket: 'YOUR_BUCKET'
}).then(function(result) {
  console.log(result);
}, function(err) {
  console.error(err);
});
```

便利！
Swiftでenumの要素数（項目数）を得られるようにするには


## はじめに

自動的に0から連番を振ってもらえる整数の列挙型に限定した内容です。

* Xcode 6.1.1 + Playground

CやObjCでは以下のような感じで最後に適当な要素を用意してカウントするのが定石だと思いますが、

```objc:Objective-C
// 名前はいい加減です。
typedef enum {
    A = 0
    B,
    C,
    
    count, // カウンタ
} Test;
```

Swiftの列挙型で同様の事を実現する方法を考えてみました。

## 案１

以下のような方法が簡単でしょうか。

```swift:Swift
import UIKit

enum Test: Int {
    case A
    case B
    case C
    
    case _count // ダミーカウンタ
    static let count = _count.rawValue // 利用するものはこちら
}

println(Test.count) // 3
```

これなら利用時にわざわざrawValueやコンバージョンを利用しなくてもInt型として要素数が利用できるかなと。


特に、次のような、要素の型がInt型以外の場合に効果が有るのではないかと思います。

```swift:Swift
import UIKit

enum Test: UInt8 {
    case A
    case B
    case C
    
    case _count // ダミーカウンタ
    static let count = Int(_count.rawValue) // Int型へコンバージョン
}

// こういった引数にInt型を要求されるような場所で可読性が上がる気がします。
let array = [Hoge](count: Test.count, repeatedValue: Hoge())
```

## 案２

tottokotkd様よりコメントを頂きまして、それをヒントに自分なりにいじってみました。

```swift:
import UIKit

/// 列挙体の要素数をカウントします。
func countEnumElements(test: (Int) -> Any?) -> Int {
    var i = 0
    while test(i) != nil {
        i++
    }
    return i
}

enum TestInt: Int {
    case A
    case B
    case C
    case D
    
    static let count = countEnumElements({TestInt(rawValue: $0)})
}

enum TestUInt8: UInt8 {
    case A
    case B
    case C
    
    static let count = countEnumElements({TestUInt8(rawValue: UInt8($0))})
}

println(TestInt.count) // 4
println(TestUInt8.count) // 3
```

こちらの方はダミーカウンタ(_count)が不要なので、少しスッキリするかもしれません。
ただ、初回実行時にカウント処理が１回は走りますので、膨大な要素数が存在する場合は案１の方が高速かと予想されます。

## 終わりに

もっと良い方法があれば教えて下さい。
UITableViewのaccessoryViewにUIViewを設定するときの注意点

#accessoryViewにUIViewを設定すると上手くリサイズされない

UITableViewのaccessoryViewにカスタマイズしたUIViewを設定するとき、そのまま以下のように設定してもUIViewの大きさがセルの高さに合わせてリサイズされない。(AutoLayoutは使用していない。)
(customViewは次の投稿のCustomView2を参考に作成)
>[UIViewをNibから初期化する](http://qiita.com/gonsee/items/230cea1ee511d54b3e85)

```
tableview.accessoryView = customView;
```

また、以下のようにsetFrameを実行して小さくする場合はルートになっているViewは大きさが変わるものの、貼り付けてあるSubViewは上手く表示されない。

```
[customView setFrame:CGRect()];
```

結局SubViewの設定では,ビュー内部の大きさを変えないように設定して大きさ固定で表示させるようにした。
見た目は特に問題はなくなったが,できればリサイズを有効にできるようにしたい。
素直にAutoLayout使えばいいのかもしれないが、iOS5サポートすると使えないんだよなぁ。
Emacsだけでシーケンス図を書く。リアルタイムに確認も

シーケンス図を書くのに、[astah](http://astah.change-vision.com/ja/) を使ってたり、他のツールを使っている方も多いと思われるが、マウス操作が面倒（だよね？）

[websequence diaglams](https://www.websequencediagrams.com/) というWebサービスを使えば、（簡単な？）スクリプトを書くだけでシーケンス図が書けてしまうというのを知り、このスクリプト用の prog-mode を探していると、何とこのサービスのAPIを叩いてリアルタイムに確認までできるものを発見。
（他にも似たようなものがあった気もしつつ、本題は後述のものなので...）

## 使うもの

wsd-mode
https://github.com/josteink/wsd-mode

## 確認した環境

OSX 10.10.1
Xcode 6.1.1 (command line tools をインストール済み)
Emacs 24.4.1

## インストール

load-path の通った場所で。

```shell-session
cd ~/.emacs.d/lisp
git clone https://github.com/josteink/wsd-mode
```

あとは init.el などで

```el
(require 'wsd-mode)
```

とするだけ。
サンプルの test.wsd が付属しているので、開いて ```C-c C-c``` すれば、動作確認は可能。

## ハマった点、既知の問題

### eww のエラー
eww 起動後に libxml2 が無いよ的なエラーが出てうまく表示できず。
どうやら libxml2 はビルド時に /usr/include/lbixml2 を見に行ってるようなので、 command line tools インストール前にビルドしていたのかもしれない。

既に command line tools はインストール済みなので、改めてビルドしなおしたら、問題なく動作した。

ビルドの方法は過去の [Yosemite で Emacs-24.4 をビルドして動かす](http://qiita.com/scalper/items/b7d81beb8fbaada3ce5f) を参考にどうぞ。

### export がうまく動作しない

wsd-api-key が無いからかな？
15ドル/月, 120ドル/年は、お試しにはちょっと...
うまくいった方、コメントください！
【メモ】httpとhttpsの混在環境でクッキーを利用する

#httpとhttpsの混在環境におけるクッキーの問題点

先ずhttps対応された次のログインページにログインする。

> https://あああ.net/login.php

ログインするとセッションIDをクッキーにセキュア属性付きで保存してクライアントに渡す。
セキュア属性付きのクッキーはhttpsでのみ送受信可能な為、盗聴の危険は無い。

```cookie
session_id = "1351321";
```

次に下記のhttpsではないマイページに飛ぶものとする。

> http://あああ.net/mypage.php

先ほどのクッキーに保存されたセッションIDはセキュア属性が付いている為httpsでしか見れない。よってmypage.phpではセッションが続かず、ログインページへのリダイレクトを余儀なくされてしまう。

これでは困るだろうという話。

#前準備：セキュア属性を付けずにセッションIDをクッキーに保存する
httpでもセッションを継続させたいならセキュア属性を付けずにセッションIDをクッキーに保存する必要がある。

先ほどと同様に

> https://あああ.net/login.php

にログインし、今度はセキュア属性を付けずにクッキーにセッションIDを保存する。

```cookie
session_id = "1351321";
```

「セキュア属性＝暗号化ではない」事を一応捕捉しておく。ログインページはhttpsなのでこのクッキーは暗号化されてクライアントに送信される。よって今回セキュア属性を付けずに送信したが、この段階では盗聴はできない（ここがとても重要）

次に下記のhttpsではないマイページに飛ぶ。

> http://あああ.net/mypage.php

クッキーに保存されたセッションIDは今回はセキュア属性が付いていないのでhttpでも送信される。

問題はhttpでは暗号化が行われない為、この送信時に初めて平文でセッションIDがネット上に流れる事になる。

セッションIDがクッキーに入っており、対応するセッションがサーバー上で展開されていれば本人であるとしていた場合、セッションIDが盗聴されれば本人に成りすます事が出来る。

この状態だと、パスワードやクレジットカード番号等を確認できるページを用意していた場合漏洩してしまうので、対策が必要になる。

#対策１：単純にログインページを設ける
パスワードやクレジットカード番号等の漏洩すると危険なページでは再度のログインを求めるようにしておく。
セッションIDからパスワードまでは判らないのでセキュリティを求められるものは全て再ログインを求めるようにしておけばとりあえずは防げる。

#対策２：再ログインをさせたくない場合https時にセッションIDの他にトークンを送信する

この方法では先ずログイン時に適当なトークンを発行し、それをクッキーに保存する。
先ほどの流れに捕捉しながら解説する。先ずhttps対応された次のログインページにログインする。

> https://あああ.net/login.php

ログイン後セッションIDをクッキーに保存する。セッションIDに対してセキュア属性は付加する必要は無い。

```cookie
session_id = "1351321"; #セキュア属性なし
```

これ以外に更に適当なトークンを保存させる。このトークンにはセキュア属性を付加する。

```cookie
session_id = "1351321"; #セキュア属性なし
token = "6846516"; #セキュア属性有り
```

セキュア属性に関わらず上記のクッキーはhttpsのログインページからは暗号化して送信される。よってこの段階では盗聴されることはない。
次に下記のhttpsではないマイページに飛ぶ。

> http://あああ.net/mypage.php

クッキーに保存されたセッションIDはセキュア属性が付いていないのでhttpでも送信される。しかしトークンはセキュア属性が付いている為送信されない。

よってこの段階ではセッションIDは盗聴可能だがトークンは盗聴する事が出来ない。

ここでクレジット番号を確認する次のページにアクセスする。

> https://あああ.net/credit.php

マイページと同様クッキーをサーバーに送信する。このページはhttpsな為セキュア属性のついているトークンも同時に送信される。

サーバー側（もといcredit.php）では送信されたトークンとセッションIDを確認し、セッションIDに対応するセッション変数に、送信されたトークンが格納されていたら認証できたものとする。

例えば盗聴者がセッションIDを盗聴できたので早速クッキーに設定し、意気揚々とcredit.phpにアクセスする。
しかし盗聴者のクッキーにはトークンが設定されていないのでこれでは認証できない。仕方ないので盗聴者はトークンも盗聴しようとするのだが、上述の通りトークンはhttpsプロトコルでしかやりとりされないので盗聴できない。

これによって成りすましを防ぐのがトークンを用いた方法となる。

#どっちが良いんだろ
無駄な気がするけど両方共やった方が良いんじゃないかなぁとか思ったり思わなかったり・・・
Hubotで「どのコマンドにも一致しない」ときの処理


この記事は [Hubot Advent Calendar 2014](http://www.adventar.org/calendars/384) の17日目です．

Hubotで「どのコマンドにも一致しないときは雑談」というのをやりたかったので，実装してみました．
5日目の「[Hubotでdocomo「雑談対話」APIを使う - “敬称”をHubotコマンドに | 半月記](http://pasero.net/~mako/blog/s/685)」をベースにしています．

## コマンド一覧を取得

`robot.helpCommands()`でコマンドの一覧を取得できます．
ただし`Commands:`コメントから生成されてるので，説明なども含まれており，整形する必要があります．
また，全てのscriptで`Commands:`を書いておかないと，漏れが発生してしまいます．

```coffeescript
cmds = []
for help in robot.helpCommands()
  cmd = help.split(' ')[1]
  cmds.push cmd if cmds.indexOf(cmd) is -1
```

これで，`cmds`に重複なくコマンドの一覧を格納できます．
[Huboco](https://github.com/hico-horiuchi/huboco)で`cmds`を出力した結果は，こんな感じ．

```coffeescript
[ 'anime',
  'date',
  'hello',
  'help',
  'member',
  'omikuzi',
  'semi',
  'thesis',
  'time',
  'version' ]
```

## 「どのコマンドにも一致しない」判定

実際にscriptを書く場合は，先程の`cmds`を使って以下のように書きます．

```coffeescript
robot.respond /(.+)$/i, (msg) ->
  cmd = msg.match[1].split(' ')[0]
  return unless cmds.indexOf(cmd) is -1

  # どのコマンドにも一致しない場合の処理
```

## cmds取得の効率化

`cmds`の取得処理を`robot.respond`の下に書くと，チャットする度に実行されてしまいます．
そこで，`module.exports`の下に書き，起動時に1回だけ実行するようにします．

ここで注意することは，このscriptを最後に読み込む，ということです．
読み込み途中で実行すると，そこまでのコマンドしか格納されません．
ファイル名を`z_hogehoge.coffee`などにして，最後に読み込まれるようにします．

## 雑談script

「どのコマンドにも一致しない場合は雑談する」scriptです．
docomoの雑談対話APIを使用しています．

  - [huboco/z_dialogue.coffee at master · hico-horiuchi/huboco](https://github.com/hico-horiuchi/huboco/blob/master/scripts/z_dialogue.coffee)

参考記事に追加で，`place`や`nickname`を指定するようにしました．

## まとめ

Hubotで「どのコマンドにも一致しない」処理の書き方でした．
今回は雑談をさせていますが，他にも色々出来るんじゃないかなと思います．
zsh + peco-select-histroy でhistoryをユニークにする

update: 同じことをしている方がいて、そちらのほうが優秀なので、下記参照

http://qiita.com/wada811/items/78b14181a4de0fd5b497

-------------------------

巷に公開されている peco-select-history だと、同じコマンドの履歴が沢山表示されて不便なので、ユニークに表示されるようにした。
ユニークにしたときに、順番が崩れないようにソートしなおしてる。

```zsh
function peco-select-history() {
    BUFFER=$(\history 1 | \
                    sort -r -k 2 |\
                    uniq -1 | \
                    sort -r | \
                    awk '$1=$1' | \
                    cut -d" " -f 2- | \
                    peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```