OmniAICreator/Qiita-1.07M huggingface dataset:
validateで引っかかった際にModelからエラーメッセージを受け取ってくる

[前回](http://qiita.com/te2ka/items/77cb6c846b9031100a83)に引き続きAlloyのModelについて書いていきます．

## 今回やったこと
* validateに引っかかった際，任意のエラーメッセージをcontroller側で取得する

## ソースコード(一部)
``` javascript:app/model/user.js
extendModel: function(Model) {
  _.extend(Model.prototype, {
    /* validateプロパティだけど呼び出す時はisValid() */
    validate: function(attrs){
      for(var key in attrs){
        var value = attrs[key];
        switch(key){
          case 'name':
            if(value.length <= 0 || 20 < value.length){
              this.errorMsg = '名前は１文字以上20文字以下です';
              return 'Error: name';
            }
            break;
          case 'age':
            if(value.length <= 0 || isNaN(value)){
              this.errorMsg = '年齢は数字のみです';
              return 'Error: age';
            }
            break;
          case 'email':
            if(!(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/.test(value))){
              this.errorMsg = 'Eメールが正しくありません';
              return 'Error: email';
            }
            break;
        }
      }
    },
    errorMsg: ''
  });

  return Model;
}
```

``` javascript:app/controller/index.js
if(newUser.isValid()){
  newUser.save();
  alert('success');
  $.userName.setValue('');
  $.userAge.setValue('');
  $.userEmail.setValue('');
} else{
  alert(newUser.errorMsg);
}
```

今回は_.extendの第2引数内のvalidateと同じレベルでメッセージを格納しておく為のプロパティを宣言しておき，validateに引っかかった際にそこへエラーメッセージを格納するという方法を試してみました．
私が思いつくことなので，おそらくこれが一番簡単な方法なのかなと思います．(公式にもしかしたら何か書いてあると思いますが，あまり見てないので他の方法はわかりません)
結果的にもcontroller側でエラーメッセージを取得できたのでうまくいったのかなと思います．

## シミュレータで確認
![Image1](http://i.gyazo.com/5a325a2a80a7ab157f44292d13be71b5.png)
名前の部分を入力せずに「登録」を押すと
![Image2](http://gyazo.com/70d22374d2e04befd9b55b7047ddf5d6.png)
のようにアラートが出てきます．うまくいきました．:)
ついでに他の入力がvalidateで引っかかった場合は
![Image3](http://gyazo.com/da29a833d5c7ba5e8d0686640659116c.png)
![Image4](http://gyazo.com/b1bf252fd61307e8fa462a02801a30e0.png)
こんな感じでエラーメッセージを取得してくることができました．
Windowsでのkarmaのセットアップについて

## はじめに

node.jsはインストール済であることを前提としています。また、karmaのセットアップ～開始/終了だけ説明しています。テストの書き方に関しては解説していません。

Windows+VisualStudio使用の場合について説明しています。グローバル領域フォルダパス、テストファイルのフォルダパスが一般的なものではないかもしれません。


## セットアップ手順

### 1.karmaのインストール

今回はグローバル領域にインストールするためにgオプションをつけている。 
グローバル領域は、 C:\Users\\<ユーザー名>\AppData\Roaming\npm\ 以下。

```
npm install -g karma
npm install -g karma-cli
```


### 2.設定ファイルの作成

<ソリューションルート>/Scripts/testsフォルダ※を作成、そこをカレントフォルダにした状態で

```
C:\Users\<ユーザー名>\AppData\Roaming\npm\karma.cmd init
```

実行すると、会話形式で初期化内容を設定する。入力内容がカレントフォルダの karma.conf.js に生成される。

※ NugetでDefinitelyTypedインストールすると/Scripts/typeing 以下にインストールされるため、Scripts直下にtestsを作成し、テスト用フォルダとして使用する想定です。

### 3.karmaの開始

```
C:\Users\<ユーザー名>\AppData\Roaming\npm\karma.cmd start <設定ファイルパス>
```


### 4.karmaの終了

```
C:\Users\<ユーザー名>\AppData\Roaming\npm\karma.cmd stop
```
PhantomJSで引数を渡してサイトのHTMLソースとキャプチャをとってくるメモ

# 備忘メモです
phantomJSの場合、nodeとは引数をとってくる方法が異なるようなのでメモ
とりあえずサンプル的に作ったので、UAとAccept-Languageは設定してません。。


## 起動方法

```shell-session: 起動方法
$ phantomjs test.js "http://google.co.jp" "/tmp/google-top.jpg"
```

### コマンド / 引数
Command phantomjs
1st 実行するスクリプト名
2nd 取得したいページのURL
3rd 画面キャプチャの保存先

## サンプルスクリプト

```js:test.js
var args = phantom.args;

url = args[0]
imgpath = args[1]

var webPage = require('webpage');
var page = webPage.create();

if (url == undefined) {
	phantom.exit();
}

page.viewportSize = {
	width : 1920,
	height : 1080
};
page.open(url, function start(status) {
	page.render(imgpath, {
		format : 'jpeg',
		quality : '80'
	});
	console.log(page.content);
	phantom.exit();
});
```
Struts2でThymeleafを使う

# 最新バージョンの記事を掲載しました。
[Struts2.5でThymeleaf3を使う](http://qiita.com/alpha_pz/items/5a43b4abb07141becbcd) に最新の記事を掲載しています。

## Thymeleaf

Struts2の非公式ですが、Thymeleafプラグインが[github:codework/struts2-thymeleaf-plugin](https://github.com/codework/struts2-thymeleaf-plugin)にて公開されております。
このプラグインを導入すると、画面出力にThymeleafが扱え、Struts2のメッセージ出力やActionクラスのフィールド出力がカンタンです。

ThymeleafはHTMLをテンプレートに使えますので、HTMLのデザインや構成を崩さずに扱えます。

## プラグインの導入方法

先ほど公開されているソースは、Struts2.3.16.3＋Thymeleaf2.1.3を指定しております。
それも使うことができますが、Spring frameworkと組み合わせて使いたい場合などもある場合は、以下にForkしたものを公開しております。

[github:A-pZ/struts2-thymeleaf3-plugin](https://github.com/A-pZ/struts2-thymeleaf3-plugin)

これを取得してください。

Eclipse4.xであればgithubから入手後に、構成＞mavenプロジェクトへ変換することで、すぐに使えます。
バージョン表記はStruts2にあわせています。

## プラグインの設定

* Struts2-thymeleaf3プラグインを/WEB-INF/libに含めます。
* mavenであれば、先ほど導入したStruts2-thymeleaf3プラグインを指定します。
* Eclipse4.xのm2eプラグインであれば、Struts2-thymeleaf3プラグインのプロジェクトを、プロジェクト参照した後にプロジェクトアセンブリーに追加してください。

Thymeleafプラグインはレスポンスの形式を定義するResultを拡張したプラグインです。プラグインの標準では、継承元パッケージに struts-tymeleaf、result-typeにthymeleafを指定します。
Spring frameworkのbeanも使う場合は、result-typeにthymeleaf-springを指定してください。

以下にプラグインのstruts-plugin.xmlを示します。

```xml:struts-plugin.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
        "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
    <bean type="org.codework.struts.plugins.thymeleaf.spi.TemplateEngineProvider" name="default" class="org.codework.struts.plugins.thymeleaf.spi.DefaultTemplateEngineProvider" />

    <package name="struts-thymeleaf" extends="struts-default">
        <result-types>
            <result-type name="thymeleaf" class="org.codework.struts.plugins.thymeleaf.ThymeleafResult"/>
        </result-types>
    </package>
</struts>
```

## 使い方

Actionの継承パッケージを result-typeにthymeleafを定義したものを指定します。標準では struts-thymeleaf で良いです。
その後、resultにthymeleafを指定します。

以下にActionクラスの例を示します。

```java:SampleSubscribeAction.java
@Namespace("/")
@ParentPackage("struts-thymeleaf")
@Results({
	@Result(name = ActionSupport.SUCCESS, location = "form" , type="thymeleaf"),
})
@Slf4j
public class SampleSubscribeAction extends LumiActionSupport {
	@Action("subscribe")
	public String subscribe() throws Exception {
		
		welcome = "おめでとう！Struts2-Thymeleafが実行できました。";
		return SUCCESS;
	}

	@Getter @Setter
	private String welcome;
}
```

このサンプルでは [Struts2-conventionプラグイン](http://struts.apache.org/release/2.3.x/docs/convention-plugin.html) ならびに [project lombok](http://projectlombok.org/) のアノテーションを使っています。

## HTMLテンプレートでActionクラスのフィールドを表示する

Actionクラスのフィールドを表示する方法は、action.(フィールド名)を指定するだけです。

```html:welcome.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:th="http://www.thymeleaf.org" lang="ja">

<head>
</head>
<body>
  <h2 th:text="${action.welcome}">ここはHTMLプロトタイプです</h2>
</body>
</html>
```

実行すると、h2タグのテキストが、Actionクラスのフィールドの値に置換されて表示されます。
VirtualBoxのフォルダ共有を使うときの注意点

#開発環境の変化
開発環境の変化と多様化は目覚ましいです。新しいところだとDockerが流行ったり、伝統的なところでは、開発サーバ上でviで編集したり、FTPアップロードしたりしているチームもまだあるかもしれません。

gitなどのバージョン管理を導入しているチームでは、個別の環境を構築した方が便利だったりするケースもあるので、VMWareやVirtualBoxを使って開発する、という方も多いのでは無いでしょうか？

#開発に便利なVirtualBoxのSharedFolder(共有ファイル)

VirtualBoxには共有フォルダという機能があり、
ホストOS(Windows/Mac)のファイルシステムをVM上にマウントする事ができます。

開発をしていると、
① RemoteのファイルをLocalにマウント(sshfs)、
② LocalのファイルをRemoteにマウント(smbfs, vboxfs)、
③ Remoteのファイルを直接編集するか(vim)、

の選択肢があるのですが、
eclipseなどのIDEを使って開発している場合は③はできませんし、
①②のそれぞれの方法にもデメリットのトレードオフが発生してしまいます。

① IDEの処理が全体的に遅くなる
② アプリケーションの応答速度が遅くなる

#VirtualBoxのSharedFolderでは②のデメリットが少しだけマシになる
体感的なところですが、Samba(TCP)などを経由してマウントするよりは、VirtualBox(vboxsf)でマウントする方が、
アクセスが早いように感じます。

と、いうわけでvboxsfを使用して開発しているのですが...


#起きたトラブル

##更新が反映されない！！
phpファイルには問題がなかったのですが、cssや静的なhtmlを編集しても、
反映されないという問題が発生しました。

##CSSの末尾の方におかしなバイナリ値が付与されている気配に注意
ChromeのWeb Developer Tool などでCSSを確認すると

```css: Chromeで見たCSSファイル
body{
  background-color : red;
}

.....
```

のように「.......」が表示されていました。
ファイルの末尾に意味不明なバイナリが追記されているようでした。

##ファイルディスクリプタのキャッシュが原因？？
Linux系 OSには、処理高速化のためのページキャッシュが実装されていますが、
これがvboxfsを経由した場合にうまく働かず、古いキャッシュをそのまま返す事があるそうです。

##回避策：Nginx, Apacheの設定を見直そう
この問題を回避するためのは簡単で、
Apacheでは

```text:httpd.com
EnableSendfile Off
```

```text:nginx.conf
sendfile : off;
```

としてやればOK。

## 感想
原因の箇所(vboxfs)と対処方法さえ分かってしまえばあっさりと解消できるのですが、
初めて遭遇した場合はどこにもログが出てくれないので、
なにが起こっているのかさっぱり分からないです。


## ちなみに
MacはLinux系OSなので、MAMPやBitNami、HomeBrewなどを使ってPHP開発をする事ができるのですが、
特殊なライブラリを使いたい場合に、そのライブラリがインストールできないと一気に手詰まりになります。
また、そのインストールのノウハウが本番環境へのデプロイに活かされないため、
最悪２度苦しむことになるので、私はMacでの直接開発はなるべく避けるようにしています。

※嵌まったのはlibssh2のインストール...
ansibleでパスワード認証&suでのroot実行

パスワード認証ありのサーバに接続する必要があり、
且つ踏み台（こちらもパスワード認証）を越える必要があった。

この時の作業メモ

パスワード認証を通るためには
sshpassが必要なので入れておく。

```
# yum -y install --enablerepo=epel sshpass
```

ansible.cfgを使って回避する。

```ansible.cfg
[ssh_connection]
scp_if_ssh = True

# 下記に記載の<gateway-server>を踏み台サーバIPに書き換えてください。
ssh_args = -o ProxyCommand='sshpass -f passfile ssh -l %r <gateway-server> -W %h:%p'

```
passfileにsshログインパスワードを書いておく

```passfile
loginpasswd
```

プレイブックの中身

```playbook(site.yml)
- hosts: all
  gather_facts: False
  su: True
  remote_user: loginuser
  su_user: root

  tasks:
    - name: command whoami
      command: whoami
      register: result

    - debug: msg={{result.stdout}}
```


で、実行。
ansible実行時に頭にLANG=Cを付けないと固まる。

```
$ LANG=C ansible-playbook -i host site.yml -k --ask-su-pass
SSH password:
su password:

PLAY [all] ********************************************************************

TASK: [command whoami] ********************************************************
changed: [client1]

TASK: [debug msg={{result.stdout}}] *******************************************
ok: [clinet1] => {
    "msg": "root"
}

PLAY RECAP ********************************************************************
client1                      : ok=2    changed=1    unreachable=0    failed=0
```
【プログラミング48(/2 -1)手】Adapter


## ポイント

Adapter（適合させる人、適応的動作）パターン。
要は、会社でたとえるならば、
管理職オブジェクトと、
一般社員オブジェクトから
getKyuryouみたいなインスタンスをそれぞれから引っ張ってくる場合、
こっちは月計算だけど、こっちは年俸とかフォーマット違ってややこしいので、それをクライアントから呼び出すときに両方を適応させる間の
インターフェースを作ろうぜと。
そうすれば、元の管理職、一般職オブジェクトの実装変えなくても
良いじゃんていう話らしい。

以下GoF本引用。
「あるクラスのインターフェースを、クライアントが求める他のインターフェースへ変換する。
Adapterパターンは、インターフェースに互換性のないクラス同士を組み合わせることができるようにする。」
だそうな。

## サンプルコード
<script src="https://gist.github.com/onody/34fb5b5782ad4bbc77c2.js"></script>
https://gist.github.com/onody/34fb5b5782ad4bbc77c2


## 所感

* ラッパーの発想。
* Rubyでサンプルコード書いたのですが、ちとまだよくわからない点あり。
　Rubyだとクラスの多重継承は駄目じゃないですか。
　だから、Adapterクラスは、Targetクラスの継承と、Adapteeモジュールのインクルードにしたのです。
　ってことは、2つのTargetとAdapteeが両方クラスだったら、
　どっちかをmoduleに変えないといけないということなのだろうか。
* Bridgeパターンが似て非なるものとのことなので、次はそっちをトライして比較してみたい。
　

## 参考にしたサイト
http://www.itsenka.com/contents/development/designpattern/adapter.html
http://www.doyouphp.jp/phpdp/phpdp_02-1-3_adapter.shtml
http://d.hatena.ne.jp/keyesberry/20080816/p1
Thymeleafで階層をもったオブジェクトを表示する

## Thymeleafとは

[Thymeleaf](http://www.thymeleaf.org/)というテンプレートエンジンがございます。
これはHTMLをそのまま使ってテンプレートにできるものでして、JSPはもとより、Velocoty、FreeMarkerよりもHTMLにやさしく記述できます。Spring frameworkともよく馴染みますし、非公式ながらStruts2でもプラグインが出ております。

## Thymeleafで階層構造をもったオブジェクトを表示する方法

例えばUserクラスは、userid,usernameのプロパティをもっているとします。

```java:User.class
@Data
public class User {
	private String userid;
	private String username;
}
```

@Data は [project lombok](http://projectlombok.org/)のアノテーションです。

これを表示する入力フォームを考えた場合、<input>要素は次のようになります。

```html:form.html
<form action="subscribe.html" th:attr="action=@{/subscribe}" role="form" method="POST">
  <div class="form-group">
    <input type="text" id="userid" name="user.userid" value="ユーザーID" th:attr="value=${user.userid}" />
    <input type="text" id="username" name="user.username" value="ユーザー名" th:attr="value=${user.username}" />
  </div>
</form>
```

このように、ピリオドつなぎでプロパティを指定すると、オブジェクト階層を構成して値の表示をします。Thymeleafは[OGNL](http://commons.apache.org/proper/commons-ognl/)を使っており、java.util.Mapでもjava.util.Listでも、String配列もカンタンに扱えます。

## オブジェクトがnullだった場合は？

例えば先ほどのUserクラス、nullを渡した場合はどうなるか。何とランタイム例外で落ちます。
これについては次の2通りの対応があります。

* OGNLのNullHandlerを実装する
* Thymeleafのタグ階層でnull時の制御をする

ここでは後者を使った場合を紹介します。

## Thymeleafを使ったオブジェクト階層と、子要素の関連

オブジェクト階層の記述方法には、[4.3. expressions-on-selections-asterisk-syntax](http://www.thymeleaf.org/doc/usingthymeleaf.html#expressions-on-selections-asterisk-syntax)にもあるように、${...}で記載したオブジェクトの子要素を*{...}で表記できます。
ポイントは、親となるオブジェクトをHTMLタグの要素の階層にあわせて記述することです。

先ほどのHTMLテンプレートを書きかえると、次のようになります。

```html:form2.html
<form action="subscribe.html" th:attr="action=@{/subscribe}" role="form" method="POST">
  <div class="form-group" th:object="${user}">
    <input type="text" id="userid" name="user.userid" value="ユーザーID" th:attr="value=*{userid}" />
    <input type="text" id="username" name="user.username" value="ユーザー名" th:attr="value=*{username}" />
  </div>
</form>
```

しかしこの状態でも ${user}はnullのままなので、後続の*{userid}で再びランタイム例外となります。

そこで、HTML上でnullチェックを実施して、回避する方法が以下の例です。

```html:form3.html
<form action="subscribe.html" th:attr="action=@{/subscribe}" role="form" method="POST">
  <div class="form-group" th:object="${#objects.nullSafe(user, new sample.vo.User())}">
    <input type="text" id="userid" name="user.userid" value="ユーザーID" th:attr="value=*{userid}" />
    <input type="text" id="username" name="user.username" value="ユーザー名" th:attr="value=*{username}" />
  </div>
</form>
```

OGNLで記述できますので、HTML中で、new しております。
[rbenv]gem installでインストールしたvagrantを消す方法

# 対象
・macOSX
・gem installでvagrantをインストールしたユーザー
・rbenvでrubyのバージョン管理をしている

# gem installで提供しなくなったvagrant

vagrantはgem installで提供せず、dmgをダウンロードしてpkgファイルからインストールするようになった。

ところが、rbenvでバージョン管理をしている環境下において、
vagrantをgem経由でインストールしている場合、
新しいvagrantをpkgファイル経由でインストールしたとしても
残り続けるという問題がある。
(/Users/[ユーザー名]/.rbenv/shims/vagrant　に残り続ける)

一時的に、/Users/[ユーザー名]/.rbenv/shims/vagrantを
rmコマンドで削除したとしても、
次回mac起動時に復活するなど、ややこしい。

rbenvでrubyのバージョンをかえたとしても、
なぜかrbenvがvagrantコマンドを参照し続けるという厄介な問題があり、
vagrant pluginのインストール等で
厄介な障害をうむ。

とかく糞面倒くさい。

# アンインストール方法

### まずgem installにてvagrantを入れたrubyのバージョンをrbenv経由で消す。

まず、rubyのバージョンチェック。

```
ruby -v
>> ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
```

消す対象となりうるrubyではない事を確認する

```
rbenv uninstall 1.9.3-p194（バージョン名）
```
一度消すかどうか聞かれるが「yes」でタイプして消去。

アンインストールに成功したら、
その後、

```
rm /Users/[ユーザー名]/.rbenv/shims/vagrant
```

で rbenv配下のコマンドを消す。

# 新バージョンvagrantをインストール

上記が完了した上で、
https://www.vagrantup.com/downloads.html
にアクセスし、dmgをダウンロードし、インストール。

これでrbenvが新バージョンのvagrantを阻害しないようになる。
View で共通に利用するオブジェクトをスマートに定義する方法


Pyramid アプリの各ビューで共通に利用するオブジェクトは、Root Object の仕組みを利用すると、スマートに定義できます。

``` python
class RootResource(object):
    u""" Application の Root Resource
    Traversal を利用しないので、そのまま context として View に渡される。
    """

    __name__ = None
    __parent__ = None
    __acl__ = []

    def __init__(self, request):
        self._repos = {
            'user': UserRepository(),
        }

    @property
    def repos(self):
        u""" 各リポジトリを辞書を介して提供 """
        return self._repos

```

アプリケーション定義で root_factory 引数に渡せば、

``` python
config = Configurator(
    settings=settings,
    root_factory="foo.resource.RootResource"
)

```

view から以下のように repos にアクセスできます。

``` python
@view_config(route_name="user_detail")
def user_detail(context, request):
    user_repo = context.repos['user']
    user = user_repo.getById(...)
    return ...
```

## 参考

- [リソース - The Pyramid Web Application Framework](http://docs.pylonsproject.jp/projects/pyramid-doc-ja/en/latest/narr/resources.html)
bowerを利用したUI Bootstrapの導入方法


bowerを利用したUI Bootstrapの導入にちょっと手こずったのでメモ
これでいける

使い方については公式を参照
http://angular-ui.github.io/bootstrap/

``` bower.json
"dependencies": {
"angular": "~1.2.23",
"angular-ui-bootstrap": "~0.11.0",
"angular-ui-bootstrap-bower": "~0.11.0",
"bootstrap-css-only": "~3.2.0"
}
```


``` index.jade
link(rel="stylesheet", href="/bower_components/bootstrap-css-only/css/bootstrap.min.css")
script(src="bower_components/angular/angular.js")
script(src="bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js")
```
Cordovaを使用したAndroidアプリ作成メモ


#Apach Cordovaについて
##Apach Cordova
* iOSやAndroidなどのに対応した、クロスプラットフォームのハイブリットアプリを作成するためのツール
* Apach Cordovaプロジェクトとして管理されている
* PhoneGapはアドビが提供するCordovaのディストリビューションの１つ

###Cordovaのハイブリッドアプリって？
* ハイブリットアプリとは、アプリのパッケージ内に、アプリ内ブラウザ(WebView)とネイティブコードを持っていて、ブラウザがJavaScriptを実行し、HTMLを出力します。

###Cordovaの役割
* 作成するアプリのフレームワーク的な存在です。
* アプリ内ブラウザ(WebView)の生成
* JavaScriptからネイティブコードのAPIをコールする仕組みの提供
* プラグインと呼ばれる機能拡張の仕組みの提供
* セキュリティ機能
* カメラ、GPSのデバイス用APIの提供

###UIについて
* CordovaはUIを持たないので、Jquery Mobileを使用する事にする



#開発環境整備(Windows)
[参考](http://phonegap-fan.com/startup/android.php)

##JDKのインストール
JDKは６以上が必要
[JDK download](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
##Eclipse(3.4以上)のインストール
Eclipseはなんでも良い。
とりあえず、junoのEclipse IDE for Java EE Developersを入れる
[juno download](http://www.eclipse.org/downloads/packages/release/juno/sr2)
##Android SDKのインストール
[AndroidSDK download](http://developer.android.com/sdk/index.html)から
「GET THE SDK FOR AN EXISTING IDE」の下にあるstand-alone版のWindows用インストーラをダウンロードして、インストールする
##ADT PluginのEclipseへのインストール
[ADT Plugin download](http://developer.android.com/sdk/installing/installing-adt.html)から「To add the ADT plugin to Eclipse:」を参考に、以下のURLを使用して、ダウンロードとインストールを行う
「https://dl-ssl.google.com/android/eclipse/」

* エクリプスを起動して、Help→Install New　Softwareを選択する
* Addを押下して、上記のURLと名前を指定する
* 表示されたチェックボックスを選択して、Nextを選択してダウンロードとインストールを行う

##node.jsのインストール(nodist使用)
[nodistとnode.jsのインストール](http://nantokaworks.com/p1039/)
##Antのインストール

##Cordovaのインストール


#Androidアプリの作成

##エミュレータの設定

##Cordovaプロジェクトの作成

##AndoridプラットフォームのEclipseプロジェクト作成

##Eclipseでの取り込み

##Eclipseでの設定
Python で DCI


DDDのリポジトリパターンとコンテキストマップを利用するにあたって、インスタンスに対して動的に振る舞いを付与したくなったので、Python で DCI (Data Context Interaction) を実現する方法について調べてみました。

## Roles パッケージを使う

[DCI in Python](https://groups.google.com/forum/#!msg/object-composition/D8tlM-olErg/_Sr1a8QAWL0J)スレから産まれたらしい Python の DCI パッケージ

- https://github.com/amolenaar/roles

わりと古くて人気もなさそうだけど、よくできている。

``` python
class Person(object):
    def __init__(self, name):
        self.name = name


from roles import RoleType
class Carpenter(object):
    __metaclass__ = RoleType
    def chop(self):
          return "chop, chop"
```

のように Person, Carpenter を定義すると、

``` python
>>> person = Person("John")
>>> Carpenter(person)
<Person+Carpenter object at 0x...>
```

Person インスタンスに Carpenter の振る舞いを付与できる。

## Dynamic Mixin

- http://zderadicka.eu/dynamically-mix-in-methods-into-an-instance-in-python/

Mixin クラスの属性をインスタンスに動的に追加する関数を実装。

``` python
import types

def mixin(instance, mixin_class):
    """Dynamic mixin of methods into instance - works only for new style classes"""
    for name in mixin_class.__dict__:
        if name.startswith('__') and name.endswith('__') \
        or not  type(mixin_class.__dict__[name])==types.FunctionType:
            continue

        instance.__dict__[name]=mixin_class.__dict__[name].__get__(instance)
```
### 使い方
``` python
class Person(object):
    def __init__(self, name):
        self.name = name

class CarpenterMixin(object):
    def chop(self):
          return "chop, chop"
```
と定義されていたとして、

```
>>> person = Person("John")
>>> mixin(person, CarpenterMixin)
>>> person.chop()
    'chop, chop'
```

わりと手軽。
## Dynamic Mixin (2)

- http://hyperthese.net/post/python-run-time-mixins/

instance のクラスの継承ツリーを動的に書き換えるアグレッシブな方法。
説明は省略。リンク先を見てください。

## その他

インスタンスそのものに振る舞いを付与するのを諦めて、Delegation で実現するのもありかと思います。

## 参考情報
以下のページを大いに参考にさせて頂きました。

- [ServiceとDCIについて ~振る舞いはどこにあるべきか~](http://j5ik2o.me/blog/2014/01/03/dci-service/)
- [『DCI なんて面倒なだけで Service 使えばいい』への返答](http://rosylilly.hatenablog.com/entry/2014/01/02/104732)
- [「『DCI なんて面倒なだけで Service 使えばいい』への返答」を読んだ感想とポエム](https://gist.github.com/monzou/8eaf32f1f8fda92e18e3)
WordPress に API として機能してもらう方法


# WordPress に API として機能してもらう方法
WordPress に投稿したデータを、WordPress 外から利用したい場合ってありますよね。
最近の WordPress では、XML-RPC を標準で利用できるようになっておりますので、簡単な実装で、すぐにやりたいことを実現できるようになっています。

## XML-RPC とは？

> http://www.weblio.jp/content/XML-RPC

WordPress では、この技術をリモートでの投稿や、pingback の処理等で利用しています。

## 具体的に何が行われるか？

まず、WordPress の XML-RPC が有効化されているかの確認と、どのようなやりとりを行うかのイメージです。

```
$ curl -d '<?xml version="1.0"?><methodCall><methodName>demo.sayHello</methodName></methodCall>' http://(WordPressのURL)/xmlrpc.php
```
こんな感じで WordPress に POST してみましょう。

```
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <params>
    <param>
      <value>
      <string>Hello!</string>
      </value>
    </param>
  </params>
</methodResponse>
```
こんなレスポンスが返ってくるかと思います。

## ブログタイトルを返す API の作成

それでは、こんな感じのものをひとつ作ってみましょう。

おなじみ functions.php に記述していきます。

```functions.php
/**
 * エンドポイントを追加します。
 * 
 * @param array $methods
 * @return array
 */
add_filter( 'xmlrpc_methods', 'append_custom_methods' );
function append_custom_methods( $methods ) {
	$methods['mywp.sample_method'] = 'api_mywp_sample_method';
	return $methods;
}
function api_mywp_sample_method($args) {
	return get_bloginfo('name');
}
```

まず、xmlrpc_methods というフィルターフックを利用します。
利用できるメソッドがホワイトリストで設定されているので、そちらに任意のメソッドを追加します。
上記では、api_mywp_sample_method() を呼び出す、mywp.sample_method というメソッドを追加しています。

api_mywp_sample_method() 内では、もちろん WordPress の関数群が利用できますので、こうしてブログタイトルも呼び出せます。

それでは、実際に呼び出してみましょう。

```
$ curl -d '<?xml version="1.0"?><methodCall><methodName>mywp.sample_method</methodName></methodCall>' http://(WordPressのURL)/xmlrpc.php
```

このような感じで、設定したメソッドを呼び出します。

```
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <params>
    <param>
      <value>
      <string>(ブログタイトル)</string>
      </value>
    </param>
  </params>
</methodResponse>
```

いかがでしょうか？ブログのタイトルが返されましたでしょうか？

## 任意の記事タイトルを返す API の作成

もうひとつメソッドを追加してみましょう。
今度は、引数を利用します。

```functions.php
/**
 * エンドポイントを追加します。
 * 
 * @param array $methods
 * @return array
 */
add_filter( 'xmlrpc_methods', 'append_custom_methods' );
function append_custom_methods( $methods ) {
	$methods['mywp.sample_method'] = 'api_mywp_sample_method';
	$methods['mywp.sample_method2'] = 'api_mywp_sample_method2';
	return $methods;
}
function api_mywp_sample_method($args) {
	return get_bloginfo('name');
}
function api_mywp_sample_method2($args) {
	$post = get_post( $args[0] );
	return $post ? $post->post_title : 'Not Found.';
}
```

api_mywp_sample_method2() では、引数に記事IDを受け取って、該当するものがあればその記事タイトルを返すようにしています。

以下のように呼び出せます。

```
curl -d '<?xml version="1.0"?><methodCall><methodName>mywp.sample_method2</methodName><params><param><value>(記事ID)</value></param></params></methodCall>' http://(WordPressのURL)/xmlrpc.php
```

先ほどのレスポンスの（ブログタイトル）部分が、今度は指定した記事IDのタイトルになっているかと思われます。（該当記事がなければ、Not Found. になりますね。）

## セキュリティの問題（重要）
ちなみに、この XML-RPC は、DDOS 攻撃に利用されてしまう可能性があります。

従いまして、実際に利用する場合は、利用するメソッドを限定したりするなどしておくといいかもしれません。
Pyramid でカスタムの View Decorator を実装する


``` python
# -*- coding: utf-8 -*-
from pyramid.view import view_config


def json_api(**params):
    u""" JSON API 用 view decorator """
    settings = dict(renderer='json', xhr=True, _depth=1)
    settings.update(params)

    def wrapped(func):
        return view_config(**settings)(func)

    return wrapped

```

こんな感じで使えます。

```
@json_api(route_name="api_user_detail")
def user_detail(request):
    return {"id": 1, "name": "junya"}
```

decorator のネストの数だけ _depth パラメータをインクリメントする必要があるので、そこだけ注意。
SwiftでUIRefreshControlを使う


##SwiftにおけるUIRefreshControlの使い方
UIRefreshCotnrolはTableViewやWebViewを下に引っ張って更新するアレ

```swift:viewController.swift
  var refreshControl:UIRefreshControl!

  override func viewDidLoad()
    {
        super.viewDidLoad()

        self.refreshControl = UIRefreshControl()
        self.refreshControl.attributedTitle = NSAttributedString(string: "引っ張って更新")
        self.refreshControl.addTarget(self, action: "refresh", forControlEvents: UIControlEvents.ValueChanged)
        self.tableView.addSubview(refreshControl)
    }

   func refresh()
  {
     // 更新するコード(webView.reload()など)
  }
```

更新が終了したときに

```swift
refreshControl.endRefreshing()
```

を書いてぐるぐるを終了させる
alias templateが関数内で使えなかった話(alias declarationとalias templateは似て非なるものだった)

以下のようにmain関数でalias declaration的なのりでalias templateを使おうとしたらうまく行かなかった。

```cpp
int main(int argc, char const* argv[]) {


    template<typename T>
    using MyType = T;

    return 0;
}
```

でたコンパイルエラーは

>a template declaration cannot appear at block scope

そこで規格(n3242)を読んでみたら14章のテンプレートのところに下記の記述があった。

>A template-declaration can appear only as a namespace scope or class scope declaration.

ようするにテンプレートの宣言は名前空間のスコープあるいはクラスのスコープ内でしかできないというもの。
そしてAlias templatesは名前の通りテンプレート。
どおりでできないわけだ。

alias declarationとalias templateは似て非なるものだったんですね。
Authenticate WordPress by Node.js (Socket.IO)


```javascript
// For database connection.
var DSN = '';
// WordPress database name.
var WPDB = '';
// Salt constants in wp-config.php.
var LOGGED_IN_KEY = '';
var LOGGED_IN_SALT = '';
// siteurl option in wp_options table.
var SITEURL = 'http://example.com/';

var crypto = require('crypto');
var md5 = crypto.createHash('md5');
var mysql = require('mysql2');
var dbh = mysql.createConnection(DSN);
dbh.connect();
dbh.query('USE ' + WPDB);

io.on('connection', function (socket) {
	var cookies = {};
	socket.request.headers.cookie.split(';').forEach(function(cookie) {
		var parts = cookie.split('=');
		cookies[parts[0].trim()] = (parts[1] || '').trim();
	});
	md5.update(SITEURL, 'utf8');
	var authInfo = unescape(cookies['wordpress_logged_in_' + md5.digest('hex')]).split('|');
	dbh.execute('SELECT * FROM `wp_users` WHERE `user_login` = ?', [authInfo[0]], function(err, res) {
		// Generate hash-key
		var hmac = crypto.createHmac('md5', LOGGED_IN_KEY + LOGGED_IN_SALT);
		hmac.update(res[0].user_login + res[0].user_pass.substr(8, 4) + '|' + authInfo[1]);
		var hashKey = hmac.digest('hex');

		// Generate hmac-hash
		var hmac = crypto.createHmac('md5', hashKey);
		hmac.update(res[0].user_login + '|' + authInfo[1]);
		var hash = hmac.digest('hex');

		if (authInfo[2] === hash) {
			// Authenticated.
			socket.emit('chat message', 'Logged in. Hello ' + res[0].display_name + ' san.');
		}
	});
});
```
Rails+Passengerでサブディレクトリ公開しているときにActiveAdminのリンクがおかしい場合の対策

Rails+Passengerを使って、サブディレクトリにアプリケーションを公開し、そこでActiveAdminを動かしている際、メニューなどのリンク先が全部ルートディレクトリからのパスになってしまい、正常に遷移できなくなってしまう場合があります。

その際はconfigのどこかに以下の定義をします。(サンプルはmy_app以下に公開する場合)

```ruby
Rails.application.routes.default_url_options[:script_name] = '/my_app' 
```

ActiveAdmin以外への影響もないようです。

参考: [Navigation URLs aren't generated correctly when using Passenger's RackBaseURI](https://github.com/activeadmin/activeadmin/issues/101)
[AWS] CloudWatch でロードアベレージとかメモリ使用量とか監視

# CloudWatchで監視！

## そもそも CloudWatch って何よ

AWS には CloudWatch と呼ばれる監視サービスがあります。
CloudWatch内では、「メトリクス」と呼ばれるグラフを使ってアラートメールを飛ばしたりEC2のオートスケール管理ができたりします。

EC2インスタンスを立てると、標準でいくつかのメトリクスが用意されているのですが、
その中には Load Average とかメモリ使用量とか、色々足りていないものが多いので、自前で用意する（カスタムメトリクスを作成する）必要があります。

## AWS側でツール提供してたよね？

http://aws.amazon.com/code/8720044071969977
上記の見て頂ければわかるのですが、、、まさかの `Load Average` がないっていう・・・＼(^o^)／

LAだけ専用のツール使うのは嫌なので、一つにまとめたい所です。

# 詳細手順

https://github.com/moomindani/aws-mon-linux
こちらのツール使います。

## `pip` インストール

```
$ mkdir ~/work
$ cd work/
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
```

## `aws cli` インストール

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

```
$ sudo pip install awscli
```

## アクセスキーなどの設定

```
$ mkdir ~/.aws
$ cd ~/.aws
$ vi config
```

以下の内容を ` ~/.aws/config` に設定

```
[default]
aws_access_key_id=xxxxxxx
aws_secret_access_key=XXXXXX
region=ap-northeast-1
# 各所インスタンスの設定に書き換える
```

これがないと `Unable to construct an endpoint for ec2 in region None` のようなエラーが出ます。
以下を叩いて正常に結果（JSON）を取得できればOK.

```
$ aws ec2 describe-instances --filters "Name=instance-type,Values=m1.small,m1.medium" "Name=availability-zone,Values=ap-northeast-1c"
```


## `aws-mon-linux` を落とす

https://github.com/moomindani/aws-mon-linux

github よりダウンロード

```
$ mkdir ~/lib
$ cd ~/lib
$ git clone https://github.com/moomindani/aws-mon-linux.git
```

使い方は `README.md` にあるとおりですが、こんな感じ

```
$ ./aws-mon.sh --mem-util --load-ave1  --disk-space-util --disk-path / --verbose --verify
```

ちなみに `320` 行目の `System/Detail/Linux` を `System/Linux` に変更すると、 `Custom Metrix` の箇所ではなく `Linux System` というメトリクスがコンソールに表示されます。
※AWS側で設定している予約語？？

## パスを通す

`aws` コマンドは `/usr/local/bin` に入ります。
が、このまま crontab の設定をしても、`/usr/bin:/bin` ぐらいしかパスが通っていないため、 `.profile` に `/usr/local/bin` を追加する必要があります。

```.profile
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games"
```


## crontab に設定

あとは crontab の設定をして、終了。

```
$ crontab -e
*/5 * * * * . /home/user/.profile; /home/user/lib/aws-mon-linux/aws-mon.sh --load-ave1 --mem-util --unicorn-mem-util --disk-space-util --disk-path / >> /home/user/cron/cron.log 2>&1
```
grunt-wiredep使用の環境でmomentの日本語ロケールファイルを含めたい


より正確にいうとgrunt-wiredep使用の環境で[angular-moment](https://github.com/urish/angular-moment)でロケール指定したい、ということ。

angular-momentをインストールする

```zsh
% bower install angular-moment --save
```

これでgruntタスクを実行すれば、momentも依存関係でインストールされて、wiredepで差し込まれてめでたしめでたし…

```index.html
  <!-- bower:js -->
  <!-- 略 -->
  <script src="bower_components/moment/moment.js"></script>
  <script src="bower_components/angular-moment/angular-moment.js"></script>
  <!-- endbower -->
```

いやいや。これだとロケールファイルが含まれていない。

bower_components/下のmomentを見ると、minディレクトリにmoment-with-locales.jsがある。

なので、プロジェクトのbower.jsonでmainをoverrideする。

```bower.json
{
// 略
  "overrides": {
    "moment": {
      "main": "min/moment-with-locales.js"
    },
    "angular-i18n": {
      "main": "angular-locale_ja-jp.js"
    }
  }
```

ロケール入りになった。

```index.html
  <!-- bower:js -->
  <!-- 略 -->
  <script src="bower_components/moment/min/moment-with-locales.js"></script>
  <script src="bower_components/angular-moment/angular-moment.js"></script>
  <!-- endbower -->
```

これで設定できる

```app.coffee
myapp.run((amMoment) ->
    amMoment.changeLocale('ja')
)
```
Virtualboxのkernelモジュールを作る

ホストOSにCentOS7 x86_64にて確認。

```bash:kernelソースとdkmsをインストール
yum install -y dkms kernel-devel
yum install -y VirtualBox-4.3
```

```bash:install&nbsp;VirtualBox-4.3
Trying to register the VirtualBox kernel modules using DKMS [  OK  ]
Starting VirtualBox kernel modules [  OK  ]
```

```bash:モジュール確認
$ lsmod | grep vbox
vboxpci                23227  0
vboxnetadp             25670  0
vboxnetflt             27613  0
vboxdrv               430263  3 vboxnetadp,vboxnetflt,vboxpci
```
EC2インスタンス内でリージョンを取得する方法

# はじめに

IAMロールをつかったEC2インスタンスは認証情報を設定することなくAWS CLIが利用できますが、リージョンだけは設定する必要があります。面倒ですね。ということでリージョンを取得する方法を見つけてきました。

# コード

これだけです。

```bash
curl -s http://169.254.169.254/latest/meta-data/local-hostname | cut -d '.' -f2
```

実行した結果はこんなかんじです。

```bash
[ec2-user@ip-172-31-11-236 ~]$ curl -s http://169.254.169.254/latest/meta-data/local-hostname | cut -d '.' -f2
us-west-2
[ec2-user@ip-172-31-11-236 ~]$
```

と書いたところ、 [masaomoc](http://qiita.com/masaomoc@github)さんより、こんなかんじでも取れますとのことでした。こちらのほうがスマートですね。

```bash
[ec2-user@ip-172-31-11-236 ~] $ curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g'
us-west-2 [ec2-user@ip-172-31-11-236 ~]$
```

[masaomoc](http://qiita.com/masaomoc@github)さん(一応仮名ですよね?) ありがとうございました。

ではでは。
PHPでCSVファイルを出力する時のメモ

PHPでCSVファイルににデータをダウンロードする場合、
下記のソースコードを使いました。

###【説明】
######1. PHPファイルのエンコーディング: EUC-JP(適切に変更してください）
   目的：$data_arrayのデータのエンコーディング　と タイトルのエンコーディングを EUC-JPにするため。

######2. Excelで文字化けしないように、SJISに変更する必要があります。
   echo mb_convert_encoding($str,"SJIS","EUC-JP");

######3. 数字の場合、Excelで勝手に変な数字に変換されないように
   ="数字"　の形式で出力しましょう。
※変な数字：数字は大きすぎる場合、科学表記になってしまう等

######4. 出力データにコンマ(,), 改行コードも入っている場合、
ダブルクォーテーション(")でデータを囲んで出力する。 例) "データ1", "データ2", "データ3"....

------------------------------------------------------------------------------
```php
$now = date("Ymd_His");
mb_http_output("EUC-JP");

header("Content-Type: application/octet-stream");
header("Content-disposition: attachment; filename=filename_".$now.".csv");
$str = "カラム１, カラム2, カラム3, カラム4\n";
foreach ($data_array as $row) {
    $str .= "\"".$row[1]."\",";
    $str .= "\"".$row[2]."\",";
    $str .= "\"".$row[3]."\",";
    $str .= "=\"".$row[4]."\","; // 数字はExcelで綺麗に表示されるように ="数字" の形に出力する
    $str .= "\n";
}
echo mb_convert_encoding($str,"SJIS","EUC-JP");
exit;
```
HAML にて attributes をスッキリ書く

そういえば Ruby 入門した時に混乱したなぁと思い出した。

# 経緯

むかしむかし Ruby におけるハッシュの書き方はやや冗長なものでした。

```rb:=>を使う
animals = { :carp => 10, :tiger => 4, :whale => 3, :buffalo => 0 }
```

Ruby 1.9 からはハッシュキーが symbol の場合には以下のように省略して書けるようになりました。

```rb:Ruby1.9以降、省略形式
animals = { carp: 10, tiger: 4, whale: 3, buffalo: 0 }
```

スッキリして良いですね。

# HAML

ところで HAML にて DOM の attributes を定義する場合にはハッシュが多用されます。

```haml:文字列でattributesを定義
%div.modal{ "aria-hidden" => "true", "aria-labelledby" => "unlock-modal-label", "role" => "dialog", "data-foo" => "abc", "data-bar" => "xyz", "my-name" => "kakipo", "my-age" => "30", "my-addr" => "Shibuya" }
```
ちょっと冗長ですね。また、エディタによってはダブルクオーテーションで囲われた部分が通常の文字列と同じハイライトになって見づらい場合がありますね。

これは以下のように symbol を使って書き直すことができます。

```haml:symbolをつかう
%div.modal{ aria: {hidden: :true, labelledby: "unlock-modal-label"}, role: :dialog, data: {foo: "abc", bar: "xyz"}, my: {name: "kakipo", age: 30, addr: "Shibuya"} }
```

ポイントは 2 つ。

- 文字列は symbol で置き換え可
    - 決まった値を取るものは symbol で、そうでないものは string で書くと意図が明確になって良いです
    - `ActiveSupport::HashWithIndifferentAccess` のおかげで、string と symbol どちらでもアクセスできるハッシュが利用できる
- prefix 単位でまとめることができる
    - 上記の例だと `aria`, `data`, `my` が prefix
    - `data-xxx` はよく使うので便利ですね


こうするとスッキリ見えますね。

# 参考

- [string - Why use symbols as hash keys in Ruby? - Stack Overflow](http://stackoverflow.com/questions/8189416/why-use-symbols-as-hash-keys-in-ruby)
- [ActiveSupport::HashWithIndifferentAccess - APIdock](http://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess)
Lissajous.js  ヤバイ、マジヤバイ

Live Text Step Sequencer...for your pleasure!!! 

###**あなたのChromeライブコーディングでみんなが踊りだす？**


どんなものかは[ここ:]
(https://github.com/kylestetz/lissajous/blob/master/API.md)
(https://github.com/kylestetz/lissajous/blob/master/API.md)

###遊び方

Chromeを立ち上げて（Chromeでしか動きません）…

[Lissajous.js](http://lissajousjs.com/)へ行く

ブラウザ内、右クリックで「要素を検証」を選ぶ

Consoleをクリック。


いろいろ出て来て始まる。

プロンプトに

>t = new track()


といれる。

空のトラックが出来た。次に

>t.beat(4)

と入れて音を出す。デフォルトの音はmiddle C(MIDI note no: 64)かな？
四分音符が無限に続く。

>t.notes(0,2,4,5,7,9,11).trans(64)


と入れるとピアノの白い鍵盤のドレミファソラシにシーケンスが変わる。

>t.vol(1.4)

と入れて音量を変更。

>t.beat(2,1,1,2,1,1)

と入れてリズムを変更。1=16分、2=8分...etc

>t.nl(0.4)

でnote length(音符の長さ)を変える。


>t.trans(12)

と入れると１オクターブ上がる。

>t.trans(-12)

でもとのオクターブに戻る。

>t.saw()

で波形をのこぎり派に変更。.sine() .square() .tri()等も選べる。

>t.delay(2).dfb(0.65)

でディレイをかけ、フィードバックを指定。


面白くなくなくなくなくなくなくない？（スチャダラパーを引用）



ではもうひとつトラックを並行で走らせましょう。今度はサンプルを使用。すでにデフォルトでdrumsというWAVファイルがロードされているのでそれを使う。自分でもドラグアンドドロップで追加できる。

> s = new track()

> s.sample(drums)

これも先ほどのように無限リピートさせる。

> s.beat(4)

今二つのトラックが走っていますよね。

トラックを解除したいときはargumentなしでbeat()を呼ぶ：

>t.beat()

>s.beat()

全部止めたければ、URL入れるところの横のリロードのやつを押せば良いです。

とりあえず、ご紹介しました。今から低賃金労働に行くので、また後で、追加でアップデートします。

（間違いの指摘などお願いします、もしあれば）
[Objective-C] UITableViewをスクロールさせる


`UITableView`をスクロールする方法はいくつかあります。
今回、自分が作っているアプリで一番上にスクロールさせたいなと思った時に、`UISearchBar`を`tableHeaderView`に設定していた場合に望んだ結果にならなかったので、備忘録と合わせてメモしておこうと思います。

## スクロールさせるメソッド

スクロールに使えるメソッドは以下。（全部じゃないかも）

| メソッド | 説明 |
|:-------------------------------|:-------------------------|
| `setContentOffset:animated:` | | オフセットの位置までスクロールさせる |
| `scrollToRowAtIndexPath:atScrollPosition:animated:` | NSIndexPathで指定したセルまでスクロールさせる |
| `scrollRectToVisible:animated:` | 引数で渡した矩形領域を表示するようスクロールさせる |
| `scrollToNearestSelectedRowAtScrollPosition:animated:` | 最後に選択したセルの位置にスクロールさせる |
| `selectRowAtIndexPath:animated:scrollPosition:` | セルを選択状態にしてスクロールさせる |


## UISearchBarをtableHeaderViewに設定した場合

どうやら`tableHeaderView`に設定された`UISearchBar`分だけinsetsが設定されているようで、`setContentOffset:animated:`で`CGPointZero`を指定すると微妙にずれてしまいました。
なので、`tableView`に設定されている`contentInset`からinset分マイナスしてあげることで望みの動作になりました。

```objc
UIEdgeInsets insets = self.tableView.contentInset;
CGPoint point = CGPointMake(0, -insets.top);
[self.tableView setContentOffset:point animated:NO];
```

もっとちゃんとしたやり方がありそうな気がしますが、なんか見つからなかったので。
AWS CLIにてCloudWatchにログをあげる

AWSのリソース以外のログを、カスタムメトリクスとしてCloudWatchにあげてみる。

# AWS CLIのインストール
## Ubuntu
sudo apt-get install pip
sudo pip install awscli

# コマンド使用方法
## 初期設定
"aws configure"
上記のコマンドで、環境変数を設定

```
aws configure
AWS Access Key ID [None]: {アクセスキー}
AWS Secret Access Key [None]: {シークレットアクセスキー}
Default region name [None]: {リージョン(ex: ap-northeast-1)}
Default output format [None]: {ex: json}
```

## 実際にPOSTさせるコマンド

日付のフォーマットは、"yyyy-MM-dd'T'hh:mm:ss'Z'"
linuxのdateコマンドを使うと、date -u +"%Y-%m-%dT%H:%m:%SZ"

aws cloudwatch put-metric-data --metric-name {メトリック名} --namespace {グラフ名} --value {値} --timestamp {日付}
[JAWS-UG CLI] IAM:#3 IAMユーザの認証情報管理 (一般ユーザ)

http://jawsug-cli.doorkeeper.jp/events/13796 でのハンズオン資料です。

このハンズオンでは、一般ユーザとしてIAMユーザの下記の設定を行ないます。

* アクセスキーの管理 (作成、変更、削除)
* パスワードの変更





1. アクセスキー作成
====================

まず、アクセスキーを作成してみましょう。

1.1. アクセスキーの作成
----------------------

```bash:コマンド:
$ aws iam create-access-key --user-name ${IAM_USER_NAME}
```

```json:結果(例)：
   {
       "AccessKey": {
           "UserName": "taro", 
           "Status": "Active", 
           "CreateDate": "2014-09-07T21:15:22.168Z", 
           "SecretAccessKey": "0xx00XXx0xx0XxX00XX0xx0xxxxxXX0X0xX0xXxx", 
           "AccessKeyId": "AKIAJxxxxxxxxxxxxxxx"
       }
   }
```

AccessKeyIdがアクセスキーIDで、SecretAccessKeyがシークレットアクセスキーになります。

[参考] アクセスキーは1ユーザあたり2つまでしか作成できないので、3回目には下記のエラーメッセージが表示されます。

```text:
A client error (LimitExceeded) occurred when calling the CreateAccessKey operation: Cannot exceed quota for AccessKeysPerUser: 2
```

1.2. アクセスキーの確認
-----------------------

アクセスキーの一覧を表示してみましょう。

```bash:コマンド:
$ aws iam list-access-keys --user-name ${IAM_USER_NAME}
```

```json:結果(例)：
   {
       "AccessKeyMetadata": [
           {
               "UserName": "taro", 
               "Status": "Active", 
               "CreateDate": "2014-09-07T21:15:22Z", 
               "AccessKeyId": "AKIAXXXXXXXXXXXXXXXX"
           }
       ]
   }
```

アクセスキーは2つまで作成できます。


2. パスワードの変更
====================

カレントIAMユーザのパスワードを変更することができます。

事前にlogin profileの設定をしておく必要があります。

```bash:コマンド:
$ IAM_PASSWORD_OLD='userPass'
$ IAM_PASSWORD_NEW='newPass'
```

```bash:コマンド:
$ aws iam change-password --old-password ${IAM_PASSWORD_OLD} --new-password ${IAM_PASSWORD_NEW}
```


3. アクセスキー非活性化/再活性化
===============================

一時的に使わなくなったアクセスキーの非活性化や、再び使うことになったときの再活性化も可能です。

3.1. 非活性化
---------------

IAM_KEY_IDは、list-access-keyコマンドで調べます。

```bash:コマンド(例):
$ IAM_KEY_ID='AKIAXXXXXXXXXXXXXXXX'
```

```bash:コマンド:
$aws iam update-access-key --user-name ${IAM_USER_NAME} --access-key-id ${IAM_KEY_ID} --status Inactive
```

```text:結果:
  (戻り値なし)
```

3.2. 再活性化
---------------

IAM_KEY_IDは、list-access-keyコマンドで調べます。

```bash:コマンド(例):
$ IAM_KEY_ID='AKIAXXXXXXXXXXXXXXXX'
```

```bash:コマンド:
$aws iam update-access-key --user-name ${IAM_USER_NAME} --access-key-id ${IAM_KEY_ID} --status Active
```

```text:結果:
  (戻り値なし)
```


4. アクセスキー削除
===============================

使わなくなったアクセスキーは必ず削除しておきましょう。

IAM_KEY_IDは、list-access-keyコマンドで調べます。

```bash:コマンド(例):
$ IAM_KEY_ID='AKIAXXXXXXXXXXXXXXXX'
```

```bash:コマンド:
$ aws iam delete-access-key --user-name ${IAM_USER_NAME} --access-key-id ${IAM_KEY_ID}
```

```text:結果:
  (戻り値なし)
```
Mac OS にNodeclipse環境を構築する


# Env
- Mac OS X 10.9
- eclipse 4.4
- Nodeclipse 0.16

# Eclipse LUNAをインストール
1. https://www.eclipse.org/downloads/ にアクセス
1. Eclipse Standard 4.4を，32bit or 64bit のいずれかをダウンロード (200MB位)
1. 解凍して，eclipseフォルダごとアプリケーションフォルダに移動
1. Eclipse.appを起動

## 以下JVMのエラーが出る場合は，JDK 7をインストール
![スクリーンショット 2014-09-07 15.47.32.png](https://qiita-image-store.s3.amazonaws.com/0/32107/be3cba7e-e0c0-be4e-f456-ea4b7cf225f2.png "スクリーンショット 2014-09-07 15.47.32.png")

1. http://www.oracle.com/technetwork/java/javase/downloads/index.html にアクセス
1. ページ内の [Java SE 7u67](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html) をクリック
1. JDK 7 Update 67.pkgを起動してインストール
1. Mac OS X x64	186.01 MB  	  jdk-7u67-macosx-x64.dmg (186MB位)
1. Java SE Development Kit 7 Downloadsをダウンロード

## nodeeclipse プラグインをインストール
1. 下記コマンドを実行してインストール
  1. $ npm install nodeclipse
  1. $ npm install -g express-generator
  1. $ npm install -g express
1. Eclipseを起動して HELP > Eclipse Marketplaceを起動
1. nodeclipse を検索してインストール

# New Projectからプロジェクトを作る
![スクリーンショット 2014-09-08 8.14.29.png](https://qiita-image-store.s3.amazonaws.com/0/32107/188c6d56-4240-7320-d9a3-bd08eb911707.png "スクリーンショット 2014-09-08 8.14.29.png")


# See Also
- [Intel ベースの Mac のプロセッサが 32 ビットか 64 ビットかを識別する方法](http://support.apple.com/kb/HT3696?viewlocale=ja_JP)
- [eclipse](https://www.eclipse.org/downloads/)
- [Nodeclipse - Installation Instructions](http://www.nodeclipse.org/updates/)
- [Node.js、Express、AngularJS、および MongoDB を使用してリアルタイム・アンケート・アプリケーションを作成する](http://www.ibm.com/developerworks/jp/web/library/wa-nodejs-polling-app/)
sys.processで複数のProcessBuilderを接続した場合にブロッキングが発生する問題（2.12.0-M1で解決予定）

外部のコマンドを連続で叩く用途に`sys.process`を使っていて気づいたのですが、ProcessBuilderを繋げて使用する場合に、例えば以下のような状況で、内部でブロックしてしまって応答がなくなることがあります。（[[SI-8768] scala.sys.process.PipedProcesses.runAndExitValue() may block and never return value - Scala](https://issues.scala-lang.org/browse/SI-8768)）

```scala
import sys.process._

def input = new ByteArrayInputStream("input".getBytes)
// wcコマンドにinputという文字列を標準入力から渡す x 100回
for (i <- 0 until 100)
  "wc" #< input !!
```

ソースを調べると、`ProcessImpl.scala`の`PipedProcesses`中で、`SyncVar`を介した値のやり取りで、タイミングによってブロッキングが発生する感じです。（以下のコード中で、`first`と`second`が正常に接続されず、かつ`second`が標準入力のデータを前提としている場合にブロックする）

```scala
  private[process] class PipedProcesses(a: ProcessBuilder, b: ProcessBuilder, defaultIO: ProcessIO, toError: Boolean) extends CompoundProcess {
    protected[this] override def runAndExitValue() = {
      val currentSource = new SyncVar[Option[InputStream]]
      val pipeOut       = new PipedOutputStream
      val source        = new PipeSource(currentSource, pipeOut, a.toString)
      source.start()

      val pipeIn      = new PipedInputStream(pipeOut)
      val currentSink = new SyncVar[Option[OutputStream]]
      val sink        = new PipeSink(pipeIn, currentSink, b.toString)
      sink.start()

      def handleOutOrError(fromOutput: InputStream) = currentSource put Some(fromOutput)

      val firstIO =
        if (toError)
          defaultIO.withError(handleOutOrError)
        else
          defaultIO.withOutput(handleOutOrError)
      // この処理より
      val secondIO = defaultIO.withInput(toInput => currentSink put Some(toInput))
      val second = b.run(secondIO)
      val first = a.run(firstIO)
      try {
        runInterruptible {
          val exit1 = first.exitValue()
          currentSource put None
          // こっちのが早いタイミングで実行されると、プロセスが正常に接続されない
          currentSink put None
          val exit2 = second.exitValue()
          // Since file redirection (e.g. #>) is implemented as a piped process,
          // we ignore its exit value so cmd #> file doesn't always return 0.
          if (b.hasExitValue) exit2 else exit1
        } {
          first.destroy()
          second.destroy()
        }
      }
      finally {
        BasicIO close pipeIn
        BasicIO close pipeOut
      }
    }
  }
```

また、このクラスではリソースリーク（[[SI-7350] scala.sys.process.ProcessImpl.PipedProcess.destroy() does not clean up pipe threads - Scala](https://issues.scala-lang.org/browse/SI-7350)）なども発生することがあります。

ちょっとアレなので使用を避けるべきかちょっと考えたのですが、結局修正して使うことにしました。送ったパッチは[マージされた](https://github.com/scala/scala/pull/3920)ので、Scala 2.12.0-M1で恐らく修正が反映されるはずです。僕ぐらいのショボい英語力でもpull requestを送ってやりとりするのに問題ない（ほんとか？）ことがわかったのは収穫でした。

それほどレアなユースケースではないと思うんですが、「このDSLカッケーっしょー？」って`sys.process`の記事を見かけるわりに、誰も気がついていないということはもしかして、みんな実際には`sys.process`を使ってない…？
CentOS6のzshのsrpmからCentOS5のrpm作成手順


preztoがzsh4.3以降対応。zsh_vcsも入っていなかった。
centos5のzshが4.2と古かったので4.3に上げたかった。

# 参考

[CentOS 5でCentOS 6用のzshのSRPMをビルドする方法 - ククログ(2012-11-21)](http://www.clear-code.com/blog/2012/11/21.html)


# 手順

```bash:ビルド環境の準備
vagrant init chef/centos-5.10-i386
vagrant up
vagrant ssh
```

```bash:必要なパッケージをインストール
sudo yum install -y epel-release
sudo yum install -y rpmdevtools
sudo yum install -y libcap-devel texinfo tetex texi2html ncurses-devel
```

```bash:rpm作成準備
rpmdev-setuptree
# ~/rpmbuild/ が作られる。
wget http://vault.centos.org/6.5/os/Source/SPackages/zsh-4.3.10-7.el6.src.rpm
rpm --nomd5 -i zsh-4.3.10-7.el6.src.rpm
rpmbuild -bb ~/rpmbuild/SPECS/zsh.spec
```

* ~/rpmbuild/RPMS/i386/zsh-4.3.10-7.i386.rpm

が出来上がる。

なおCentOS7のsrpmでCentOS5用のはできなかった。
2014-06-18 の Jeff Bezos キーノートの構造分析

キーノートプレゼンテーションについて、内容ではなくて構造の分析をすることにより参考としたい。

分析対象：https://www.youtube.com/watch?v=w95kwXy_MOY

0:00　【紹介】サービスが愛されていること（ユーザ動画2分）。
2:30　【統計】ユーザベースの拡大（グラフ）。
4:50　【宣言】renew は leaky にしない宣言（バケツのビジュアル）。
5:50　【紹介】ユーザ評言の紹介（twitter 引用）。
7:00　【紹介】メディア評言の紹介（記事引用）
9:00　【宣言】顧客の信頼重要宣言（無地背景）
10:00　（信頼を得るためのレシピ）
11:00　【紹介】業界ランキングで上位であることの紹介
12:00　（絵本の引用）
13:40　【提示】設計指針（How it would be different?）の紹介
14:00　【提示】製品提示、製品特徴提示
18:30　【提示】付属サービス提示、引き続き製品特徴提示
19:10　【紹介】他社製品の問題を提示、引き続き製品特徴提示
23:00　【紹介】ユーザの状況の紹介（プロ撮影ビデオ2分）
25:00　【提示】状況を変える機能の提示
26:00　【提示】新機能（システム系）の提示（デモ5分）
31:00　【紹介】技術的背景の紹介
37:00　【提示】SDK
37:00　（ビデオ30秒）
38:00　【提示】問題意識の提示（イラストベースビデオ2分）
40:00　【提示】新機能（UI系）の提示（デモ12＋3分）
55:00　【紹介】技術的経緯の説明（10分）
65:00　【提示】SDK
65:00　（ビデオ3分）
68:00　【提示】UIの工夫の提示
72:00　【提示】製品の提示、補助説明者in（製品価格）
79:30　（補助説明者out）※結果的にwrap upさせている
80:00　wrap up＋one more
81:30　（ビデオ3分）
85:00　短い挨拶＆終了

※途中から、時間の数値をかなり概数にしている。

後ろになればなるほど、話題の切り替え頻度が下がっている。この結果、細部にわたってやたら詳しい話がされた、という印象が生まれているのではないだろうか。
ChromeのSHA-1終了への予定


* [Google Online Security Blog: Gradually sunsetting SHA-1](http://googleonlinesecurity.blogspot.jp/2014/09/gradually-sunsetting-sha-1.html)


## Chrome 39 (Branch point 26 September 2014)

![](https://lh4.googleusercontent.com/dNSUl_1Dq9vJlT42NuiyTFacrvPppggsSAie57P6Y9mHRS-__zEwXASVO0MchT-CBNyJtNWEEGWxW2wBgFnsMDoFw9RnvWDLf37nY_Ae93IcQoz-ZRg7_YzTFNk9yETcqg)

* 三角マークがつく

## Chrome 40 (Branch point 7 November 2014; Stable after holiday season)

![](https://lh5.googleusercontent.com/aD-fYOmEpF0zySYiuwZF0AyMnOuehwsA9iQ97jkrJT6zCSm-hwx_GUJzAQdCW-PvGHG9TS8LQvSX6H6mDy7bTugCWlmXsokMtL0njKqqlpphe6a8Mdd5mSlFHzM_AOxJXg)

* 鍵マークではなくなる

## Chrome 41 (Branch point in Q1 2015)

![](https://lh5.googleusercontent.com/ZCARm-6SJVTwKpDCAlm_y4sLDQafi-8TasJpQmKt-trWMIjEPzTWNnFPOFzS2A7iBsQLQRWKmGqxvwWyxEgnzv3Wuh8vw3DRDN5mBHkzJoFgcuKAoZiSXgAWedUDykHz9w)

* 鍵マークが×になる
GulpでCoffeeScript、Sassをコンパイル


###Gurntに比べての利点って何？
[こちら](http://lxyuma.hatenablog.com/entry/2014/05/25/162218)と、[こちら](http://jaysoo.ca/2014/01/27/gruntjs-vs-gulpjs/)の記事に詳細な比較が書かれています。

# Install
```bash
$ npm install -g gulp
$ npm install --save-dev gulp gulp-coffee gulp-sass
```

## Coffee Compile

/path/to/coffee/source/にCoffeeのファイルがあったとして、
/path/to/js/dest/にCompileして生成されたjsファイルを吐き出す。

```CoffeeScript:gulpfile.coffee
gulp   = require 'gulp'
coffee = require 'gulp-coffee'

gulp.task 'compile-coffee', () ->
    gulp.src 'path/to/coffee/source/**/*.coffee'
        .pipe coffee()
        .pipe gulp.dest('/path/to/js')
```

**実行**

```bash
$ gulp compile-coffee
```


## Sass Compile
/path/to/sass/source/にscsssのファイルがあったとして、
/path/to/css/dest/にCompileして生成されたcssファイルを吐き出す。

```CoffeeScript:gulpfile.coffee
gulp = require 'gulp'
Sass = require 'gulp-sass'

gulp.task 'compile-sass', () ->
    gulp.src '/path/to/sass/source/**/*.scss'
        .pipe sass()
        .pipe gulp.dest('/path/to/css')
```

**実行**

```bash
$ gulp compile-sass
```

### Compileしたjs, cssファイルを一つに結合する。
HTTPリクエストを軽減するために、RailsのAssetPipelineのように、js, cssを一つのファイルに纏める。

#### install
```bash
$ npm install --save-dev gulp-uglify gulp-minify-css gulp-concat
```

```CoffeeScript:gulpfile.coffee
gulp        = require 'gulp'
coffee      = require 'gulp-coffee'
uglify      = require 'gulp-uglify'
sass        = require 'gulp-sass'
minifyCss   = require 'gulp-minify-css'
concat      = require 'gulp-concat'

# compile coffeescript files
gulp.task 'compile-coffee', () ->
    gulp.src '/path/to/coffee/**/*.coffee'
        .pipe coffee()
        .pipe gulp.dest('/path/to/js')

# ugilify js file and concat javascript file to application.js
gulp.task 'compile-js', () ->
    compileFileName = 'application.js'
    gulp.src ['/path/to/js/**/*.js' '!/path/to/js/' + compileFileName]
        .pipe concat(compileFileName)
        .pipe uglify(preserveComments:'some')
        .pipe gulp.dest('/path/to/js')

# compile sass file
gulp.task 'compile-sass', () ->
    gulp.src '/path/to/sass/**/*.scss'
        .pipe sass()
        .pipe gulp.dest('/path/to/css/')

gulp.task 'compile-css', () ->
    compileFileName = 'application.css'
    gulp.src [ '/path/to/css/**/*.css',
				 '!/path/to/css/' + compileFileName ]
        .pipe concat(compileFileName)
        .pipe minifyCss()
        .pipe gulp.dest('/path/to/css')

gulp.task 'compile', ['compile-coffee', 'compile-sass', 'compile-js', 'compile-css']
```

**実行**

```bash
$ gulp compile
```

実行後、/path/to/js/application.js、/path/to/css/application.cssが作成されていることを確認してください。



#### 参考
[Introduction to Gulp.js with practical examples](http://julienrenaux.fr/2014/05/25/introduction-to-gulp-js-with-practical-examples/)
[Grunt vs Gulp - Beyond the Numbers](http://jaysoo.ca/2014/01/27/gruntjs-vs-gulpjs/)
[gulp vs Grunt](http://lxyuma.hatenablog.com/entry/2014/05/25/162218)
[gulpのアプローチ "なぜグローバルとローカルにインストールが必要なのか"](http://nakajmg.github.io/blog/2014-09-03/gulp-structure.html)