OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryにテンプレートシステムを導入するjQuery-templateの使い方

#背景
jQueryでよくやるやつだと、$.getJSONでデータ取って、HTMLに値をズコズコ突っ込んでいくやつですね。

```js
$.getJSON('hoge.com',function(json){
	$("#name").text(json.data.name);
	$("#address").text(json.data.address);
});
```

#テンプレート化したいときも

リスト表示みたいに数が未定で、１つテンプレート用意して
それを複製したいときなどもありますね。
こんな感じですかね―。
ちょっと苦しい。

```js
var template = '' +
'<div>' +
  '<div id="name"></div>' +
  '<div id="address"></div>' +
'</div>';

$.getJSON('hoge.com',function(json){
	$(template).find('#name').text(json.data.name);
	$(template).find('#address').text(json.data.address);
});
```


#そんなときにjQuery-Templateです。

https://github.com/codepb/jquery-template

上記からcloneしたら
jquery.loadTemplate-x.x.x.min.js
をjsフォルダに突っ込んでHTMLに読み込んでください。

#基本の使い方

###まずはテンプレートとなるHTMLを用意します。

user.html

```html
<div>
  <div data-content="name"></div>
  <div data-content="address"></div>
</div>
```

地味に嬉しいのが、jQueryなのにidやclassを使わないで、data-contentを使って変数を入れる所。これだったら、デザイナーさんと作業が切り離せますね。

###getJSONから呼び出します。
```javascript:
$.getJSON('hoge.com',function(json){
	$("#area_user").loadTemplate(
	  "js/templates/user.html",
	  {
        "name" : json.data.name,
        "address" : json.data.address
    });
});
// area_userはテンプレートをはめ込む親divです。
```

JSONで変数を入れます。簡単です。

これだと上書きなので、追記モードの時はこんな感じ。

```javascript:追記の時
$.getJSON('hoge.com',function(json){
	$("#area_user").loadTemplate(
	  "js/templates/user.html",
	  {
        "name" : json.data.name,
        "address" : json.data.address
      },
      {append:true}
   );
});
```

第3引数にappend:trueを入れることにより、#area_userへの追記モードになります。

思いがけず、結構いい感じにAJAX部分とテンプレート部分を切り離すことができました。
これでコードが少しキレイになります。
さくらのレンタルサーバにNode.jsをインストール

さくらインターネットのレンタルサーバ スタンダードプランにNode.jsをインストールするためのメモ。
portsで入れる記事が多かったけれども、[root権限なしでNode.js、MongoDBをインストールする方法](http://uguisu.skr.jp/Windows/node.html) を参考に、portsを使わずに入れてみた。


# 本記事で使用するバージョン

* [libexecinfo-1.1_3](http://portsmon.freebsd.org/portoverview.py?category=devel&portname=libexecinfo)
* [node-v0.10.25](http://nodejs.jp/nodejs.org_ja/docs/v0.10/download/)

# libexecinfoのインストール

下準備として以下のディレクトリを作成。

```
% mkdir ~/local/
% mkdir ~/local/include
% mkdir ~/local/lib
% mkdir ~/local/src
% mkdir ~/local/src/libexecinfo
```

libexecinfoをダウンロードして解凍。

```
% cd ~/local/src/libexecinfo
% wget http://pkg.freebsd.org/freebsd:11:x86:32/latest/All/libexecinfo-1.1_3.txz
% tar xvzf libexecinfo-1.1_3.txz
```

includeとlibにあるファイルをlocal配下のincludeとlibにコピー。

```
% cp ./usr/local/include/* ~/local/include/
% cp ./usr/local/lib/* ~/local/lib/ 
```

~/.cshrcに以下を追加。

```text:.cshrc
setenv CPATH ~/local/include
```

変更を反映。

```
% source ~/.cshrc
```

# Node.jsのインストール

~/.cshrcに以下を追加。
※「(username)」の部分を環境に合わせて書き換える。

```text:.cshrc
setenv PATH ${PATH}:${HOME}/local/bin
setenv NODE_PATH ${HOME}/local/lib/node_modules
setenv NODE_MODULES ${HOME}/local/bin/node_modules
setenv LD_LIBRARY_PATH
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/home/(username)/local/lib
```

変更を反映。

```
% source ~/.cshrc
```

下準備として以下のディレクトリを作成。

```
% mkdir ~/local/src/node
```

Node.jsをダウンロードして解凍。

```
% cd ~/local/src/node/
% tar xvzf node-v0.10.25.tar.gz
```

```
% cd node-v0.10.25
```

./deps/v8/tools/gyp/v8.gypを編集。

```rb:./deps/v8/tools/gyp/v8.gyp
676             ['OS=="freebsd"', {
677                 'link_settings': {
678                   'libraries': [
679                      # '-L/usr/local/lib -lexecinfo',  ※この行をコメントアウト
680                 ]},
```

./deps/v8/src/platform-freebsd.ccを編集。
※ [さくらでnode.js](http://d.hatena.ne.jp/itake2/20130112/1357971533) を参考にしたが、どう対処するのが良いかは課題。


```cpp:./deps/v8/src/platform-freebsd.cc
298 int OS::StackWalk(Vector<OS::StackFrame> frames) {
299   return 0; // ※この行を追加
300   int frames_size = frames.length();
```

編集したら以下を実行。終わるまでしばらく待つ。

```
% ./configure --prefix=~/local
% gmake
% gmake install
```

変更を反映。

```
% source ~/.cshrc
```

インストールされたか確認。

```
% node -v
v0.10.25
```

バージョンが正常に表示されればインストールは完了。

# 課題

1. ./deps/v8/src/platform-freebsd.cc の OS::StackWalk についての対処法。

2. Node.jsのv0.12.xへの対応。
【Emacs】yasnippetでphpunitのためのsnippetを書く


# はじめに

phpunitで `$this->assertEquals('hoge' $hoge);` とか書いたりしますが、これが面倒なので、`aseq<tab>` とかで補完して欲しい！ということで、（プロコンとかでも知ってたら便利だし）ちょっとyasnippetを見てみようと思いました。

* Emacs 24.3


# 色々見てみる

`yasnippet/snippets` にいろいろsnippetが入っているので見てみます。（つまりこのディレクトリはちゃんとgitで管理しなきゃいけないのか...）
とりあえず　snippets　に移動して `ls` してみると... php-mode というディレクトリは無いのか...

手頃なところで、 `yasnippets/snippets/c++-mode` が（僕の環境では）あったので、これの中の `assert` というやつを見てみることに。

```
# -*- mode: snippet -*-
# name: assert
# key: ass
# --
assert($0);
```

もひとつ参考に map あたりを見てみることに

```
# -*- mode: snippet -*-
# name: map
# key: map
# --
std::map<${1:type1}$0> ${2:var};
```


# 書き方

どうやら、

* key が補完されるために入力する文字列である
* $1, $2, ... はこの順番にカーソルがハイライトされ、最後に行き着くのが $0
* ${1:type1} の type1 の部分はプレースホルダー

っぽいのでこれの通りに書いてみます。

php-mode ディレクトリを作成し、その中に入れます。こうしてみました

```
# -*- snippet -*-
# name: assertEqual
# key: aseq
# --
$this->assertEquals($1, $2);$0
```

`aseq` と入れてtabを押すと補完されました！さらにtabを押すとカーソルが動きます。
が、`aseq` が左手を酷使して辛かったので `ae` にしました。もし衝突したらその時に変えます。



# emacs上で直接yasnippetの編集画面を呼ぶ

しかしこの編集方法では問題があります。snippetを編集した後にemacsを再起動しなければいけません。そこで、emacsからコマンドを叩いてyasnippetを呼ぶようにします。emacsからyasnippetの新規スニペットを作成する方法は `M-x yas-new-snippet` です。この方が、最初からテンプレートが用意されていて楽です。

snippetを書いたら、 `C-c C-c` を入力すると編集を終了します。
`Choose or enter a table` と聞かれるので、 `php-mode` とか入力します。
`Save to a new File?` 的なこ事を効かれるので `y` を押します


`~/.emacs.d/snippets/php-mode is not writable`



普通に .emacs.d 直下に snippet ディレクトリがある場合は問題無いですが、僕は、 `.emacs.d/elisp/yasnippet/snippets` が snippetのディレクトリなので、`yas/root-directory` とやらにこれを指定してあげなくてはいけないようです。

というわけで指定します。.emacs.d/init.el を開き、

```
(setq yas/root-directory (locate-user-emacs-file "elisp/yasnippet/snippets"))
```

を追記しました。

今度は `y` と答えた後に「ファイル名どうしますか」的なことを聞かれました。デフォルトではnameの値が入っているようなのでそのままEnterします。

ちゃんと追加されました。

# 利用できる snippet を確認する

yasnippet関連の関数は `yas-` プレフィックスがついています。使えるyasnippetを調べるには、 `M-x yas-describe-table` です。
Service Workerを使ってみた。

## やりたいこと

とにかくService Workerを使ってみたい。
とりあえずウェブページをオフラインでも見れるようにしたい。

## Service Workerについて

Service Workerはクライアントとサーバ間の通信を監視するプロキシの働きをする。
Service Workerのグローバルオブジェクトはwindowではない。
そのため、DOM操作ができないなど一般的なJavaScriptとは若干異なっている（console.logはつかえた）。
初めて見る関数いっぱい。

将来的にPush APIなどクライアント端末の低レイヤの機能も使えるようになるらしい。
（Pushは今も使えるけど使い勝手が悪いらしい。）

まだ先人のノウハウがあまりない。MDNのページも翻訳されてない。
頑張ってちょこちょこ翻訳してるけどどうも日本語がおかしい気がする。

HTTPSかローカルホストでないと動作しない。HTTPはセキュリティ上使えない。
デバッグがめんどくさいのでシークレットウインドウで作業したほうがよい。

## コード

``` javascript
// script.js
/* Service Workerの登録 */
if("serviceWorker" in navigator)
{
  navigator.serviceWorker.register("/sw.js");
};
```

``` javascript
// sw.js
/* Service Workerのグローバルオブジェクトでは外部スクリプト読み込みの関数がデフォルトで存在する。 */
importScripts("https://raw.githubusercontent.com/coonsta/cache-polyfill/master/index.js");

/**
 * Service Workerインストール時の関数
 * ==========
 * オフライン時、キャッシュに登録されていないURLにアクセスした場合に表示するHTMLを取得する。
 * オンライン時にこのファイルにアクセスすることがないため。
 */
addEventListener("install", function(event)
{
  event.waitUntil(
    caches.open("myCache")
      .then(function(cache)
      {
        return cache.addAll(["/nodata.html"]);
      })
  );
});

/**
 * スコープ内でファイル取得のリクエストが飛んだ時の関数
 * スコープはService Workerのjsファイル以下のディレクトリになる。
 * serviceWorker.register()時に明示的に指定することもできる。
 * ==========
 * 1. オンライン時は普通にファイルを取得させ、キャッシュにも保存させる。
 * 2. オフライン時はキャッシュされているファイルを返すようにする。
 * 3. リクエストしたURLに対応するファイルがキャッシュにない場合は、インストール時に登録したnodata.htmlを返す。
 */

addEventListener("fetch", function(event)
{
  var online = navigator.onLine;

  if(online)
  {
    /* 1 */
    event.respondWith(
      fetch(event.request)
        .then(function(response)
        {
          if(!response || response.status != 200) return;

          caches.open("myCache")
            .then(function(cache)
            {
              cache.put(event.request, response);
            });
        })
    );
  }
  else
  {
    event.respondWith(
      caches.match(event.request)
        .then(function(response)
        {
          /* 2 */
          if(response)
          {
            return response;
          }
          /* 3 */
          else if(event.request.context == "internal")
          {
            return caches.match("/nodata.html")
              .then(function(responseNodata)
              {
                return responseNodata;
              });
          }
        })
    );
  }
});
```
Turbolinksでの遷移時にリンクをホワイトリストで弾く


Turbolinksを有効にしたいが、特定のリンク間でしか有効にしたくないケースがある。

`page:before-change` は Cancellableだとドキュメントにあるので、event.data.urlに遷移しようとするリンクが入っているので、この情報をみてpreventDefault するかどうか決める。

[rails/turbolinks](https://github.com/rails/turbolinks "rails/turbolinks")

タイトルでホワイトリストといってるが実装は正直何でもいい。正規表現でもいい。

```js
// cancel state change by whitelist
const ALLOWABLE_LINKS = [
  '/foo',
  /'bar'
];

window.addEventListener('page:before-change', e => {
  if (!ALLOWABLE_LINKS.some(link => link === e.data.url) ) {
    e.preventDefault();
    location.href = e.data.url;
  }
  return true;
});
```
LAN-GT JU3H3 インストール

検証 CentOs6.5

## ドライバを落とす
http://www.asix.com.tw/FrootAttach/driver/

2016/8/26現在　1.14.4
## 必要なマシンに移して解凍

bzip2 -dc ファイル名 | tar xvf -

## 必要パッケージのインストール
yum install kernel-devel kernel gcc & reboot

kernel-source内のリンクを修正する必要があるかも。

## インストール
make 

make install
TFTPサーバ構築

#目的
Juniper SSG5のファームウェアアップデートに使用するTFTPサーバを構築する。
#環境
* AWS
* Amazon Linux AMI release 2015.03
* Installed:tftp-server.x86_64 0:0.49-7.7.amzn1
* Dependency Installed:xinetd.x86_64 2:2.3.14-39.9.amzn1

#設定
##公開DIR作成
```
$ sudo mkdir /tftpboot
$ sudo chmod -R 777 /tftpboot
$ sudo chown -R nobody:nobody /tftpboot
```

##設定ファイル
1.  disableは=noに変更し、有効化
2.  server_argsに作成した公開DIRを-cを付けて定義

```/etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -c -s /tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
```

##FW
* inbound

| Type | Protocol | Port Range | Source |
|:-----------|------------:|:------------:|:------------:|
|     All UDP     |     UDP     |     0 - 65535     |     IPアドレス/プレフィックス     |


* aws使用していない場合

```/etc/hosts.allow
#juniper - for maintenance
in.tftpd: ***.***.***.***

```

##サービス起動
`$ sudo service xinetd restart`


#動作確認
##クライアントからTFTPでファイルをUPLOADする
```
c:\Users\****>tftp -i ***.***.***.*** put c:\Users\****\juniper\firmware\ssg5ssg20.6.3.0r19.0
転送を正常に完了しました: 118 秒間に 13384482 バイト、113427 バイト/秒
```

##UPLOADされたファイルを確認する
```
$ ls /tftpboot 
ssg5ssg20.6.3.0r19.0
```

#後処理
1.インストール直後からONになっているので、OFFにする。

```
$ chkconfig --list
xinetd          0:off   1:off   2:off   3:on    4:on    5:on    6:off
xinetd based services:
        rsync:          off
        tftp:           on
```

```
$ sudo chkconfig xinetd off
$ chkconfig --list
xinetd          0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

2.サービス停止
`$ sudo service xinetd stop`

3.FWも閉じ、hosts.allowで定義したものもコメントアウトする。
vue.jsでバリデーション(vue-validatorは使わずに)

大抵の場合、これで十分なんじゃないかとか思いました。
すべて正しく入力したらボタンが出てきます。

http://jsbin.com/hukaderoxa/edit?html,js,output

```html
<!DOCTYPE html>
<html>
<head>
<script src="http://vuejs.org/js/vue.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <input type="text" v-model="name" placeholder="名前">
  <input type="text" v-model="zipCode" placeholder="郵便番号">
  <select v-model="prefecture" placeholder="都道府県">
    <option value="0">-</option>
    <option value="1">東京</option>
    <option value="2">北海道</option>
  </select>
  <div v-if="validation">{{validation}}</div>
  <div v-if="!validation">
    <button>OK!</button>
  </div>
</body>
</html>
```

```js
new Vue({
  el: 'body',
  data: {
    name: '',
    zipCode: '',
    prefecture: '0'
  },
  computed: {
    validation: function() {
      if (!this.name) {
        return '名前は必須です';
      }
      if (!/[0-9]{7}/.test(this.zipCode)) {
        return '郵便番号(7桁 ハイフン無し)で入力して下さい';
      }
      if (this.prefecture === '0') {
        return '都道府県を選択して下さい';
      }
      return '';
    }
  }
});
```
[WIP]VagrantでTime Machineを作る

既に運用しているので手順を思い出しながら書く。

## 構成

- Windows
- 外付けHDD（こいつをVagrantのOSにマウントしてTime Machineにする）

## 手順

1. 何かしらVagrantのOS用意
1. Virtual Boxを起動して、外付けHDDの領域をストレージとして追加
2. VagrantのOSで上記をフォーマット、マウントする
3. netatalkの設定
4. MacのFinderでafpマウント（これにより、Time Machineのディスクとして見えるようになる）
5. Time Machineとして設定


## 手順詳細

### 4. netatalkの設定

port548をforwardしておく。

```ruby:VagrantFile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
.
.
  config.vm.network "forwarded_port", guest: 548, host: 548
.
.
end
```


### 5. MacのFinderでafpマウント

Command+Kを押して以下のように入力。

```
afp://hostname
```
column cannot be null


通常はnot null制約のカラムに対してnullを入れようとして起こられるエラーですが、これがトリガー経由でも同じエラーが出るようです

sampleのSQLを下記で用意

historyテーブルのflagが0->1になった時にsummaryテーブルに値が加算されます

```
CREATE TABLE `history` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`a_id` INT(10) DEFAULT NULL,
`b_id` INT(10) DEFAULT NULL,
`flag` tinyint(4) DEFAULT NULL,
`last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ( `id` )
) DEFAULT CHARSET=utf8;

CREATE TABLE `summary` (
`a_id` INT(10) NOT NULL,
`b_id` INT(10) NOT NULL,
`sum` INT(10) default null,
 PRIMARY KEY (`a_id`,`b_id`)
) DEFAULT CHARSET=utf8;

DELIMITER $$
CREATE TRIGGER before_update_history BEFORE UPDATE ON history
FOR EACH ROW
BEGIN
  IF NEW.flag = 1 AND OLD.flag = 0 THEN
    INSERT INTO summary ( a_id, b_id, sum )
      VALUES ( new.a_id, new.b_id , 1 )
    ON DUPLICATE KEY UPDATE
      sum = sum + 1;
  END IF;
END;
$$
DELIMITER ;
```

通常であればhistoryテーブルをflag=1で更新すればsummaryテーブルも更新されます

```
mysql> insert into history (a_id,b_id,flag) values ( 1, 1, 0 );
mysql> select * from history;
+----+------+------+------+---------------------+
| id | a_id | b_id | flag | last_update         |
+----+------+------+------+---------------------+
|  1 |    1 |    1 |    0 | 2015-08-12 16:43:45 |
+----+------+------+------+---------------------+
mysql> update history set flag=1 where id=1;
mysql> select * from history;
+----+------+------+------+---------------------+
| id | a_id | b_id | flag | last_update         |
+----+------+------+------+---------------------+
|  1 |    1 |    1 |    1 | 2015-08-12 16:43:52 |
+----+------+------+------+---------------------+
mysql> select * from summary;
+------+------+------+
| a_id | b_id | sum  |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+
```

ここでb_idがnullのレコードを挿入して、flagを1にしてトリガーを動作させます

```
mysql> insert into history (a_id,flag) values ( 1, 0 );
mysql> select * from history;
+----+------+------+------+---------------------+
| id | a_id | b_id | flag | last_update         |
+----+------+------+------+---------------------+
|  1 |    1 |    1 |    1 | 2015-08-12 16:43:52 |
|  2 |    1 | NULL |    0 | 2015-08-12 16:46:25 |
+----+------+------+------+---------------------+
mysql> update history set flag=1 where id=2;
ERROR 1048 (23000): Column 'b_id' cannot be null
```

もちろん普通にnullを突っ込もうとしても同じエラーになるようです

```
mysql> insert into summary ( a_id, b_id, sum ) values ( 1, null, 1 );
ERROR 1048 (23000): Column 'b_id' cannot be null
```

開発時や、例外時にこういうパターンに陥ってしまった時に見つけるまで時間がかかったのでメモとして残しておきます
aws-cli で elb からインスタンスを解除する & インスタンスを elb に登録する

### ELB に登録されているインスタンスを全て解除する

``` bash
#!/bin/bash

aws="/usr/bin/aws --region ap-northeast-1"
elb_names=("elb-1" "elb-2")

deregister_instances_from_elbs()
{
    for elb_name in ${elb_names[@]}
    do
        # get registerd instance ids per elb
        deregister_instance_ids=$(${aws} elb describe-load-balancers \
            --load-balancer-names ${elb_name} \
            --query 'LoadBalancerDescriptions[].Instances[].InstanceId' \
            --output text)

        # deregister instances from elb
        ${aws} elb deregister-instances-from-load-balancer \
            --load-balancer-name ${elb_name} \
            --instances ${deregister_instance_ids} \
            || echo "ERROR. failed to deregistered ${deregister_instance_ids} from ${elb_name}" | exit 1

        echo "OK. deregistered ${deregister_instance_ids} from ${elb_name}"
    done
}

deregister_instances_from_elbs

```

### 指定したインスタンスを指定した ELB に登録

リストで持たせた NAME TAG から InstanceId を取得して一気に ELB に登録します。
また、登録した全てのインスタンスが InService になるまで待ちます。

``` bash
#!/bin/bash

aws="/usr/bin/aws --region ap-northeast-1"
elb_names=("elb-1" "elb-2")
regist_servers=("web-1" "web-2" "web-3" "web-4")

register_instances_with_elbs()
{
    for elb_name in ${elb_names[@]}
    do
        # get instance ids from Name Tag
        for regist_server in ${regist_servers[@]}
        do
            regist_instance_id=$(${aws} ec2 describe-instances \
                --filters Name=tag-value,Values=${regist_server} \
                --query 'Reservations[].Instances[].[InstanceId]' \
                --output text)

            regist_instance_ids+=("$regist_instance_id")
        done

        # register instance with elb
        ${aws} elb register-instances-with-load-balancer \
            --load-balancer-name ${elb_name} \
            --instances ${regist_instance_ids[@]} \
            || echo "ERROR. failed to registered ${regist_instance_id[@]} with ${elb_name}" | exit 1

        ## check in service
        regist_num=${#regist_instance_ids[@]}
        i=0
        while true
        do
            in_service=$(${aws} elb describe-instance-health --load-balancer-name ${elb_name} \
                --query 'length(InstanceStates[?State==`InService`].[State])')

            if [ ! -z ${in_service} ]; then
                if [ ${in_service} = "${regist_num}" ]; then
                    echo "OK. ${regist_servers[@]} is InService at ${elb_name}"
                    unset regist_instance_ids
                    break
                fi
            fi

            i=`expr $i + 1`
            sleep 5
        done
    done
}

register_instances_with_elbs
```

`elb_names` と `regist_servers` の持たせ方を工夫するとメンテナンスとかで使えそうな気がしたので晒してみました。
macでrsyncコマンドを実行する時に不必要なファイルを簡単に除外しよう

ファイルを一斉にバックアップしたり、sshやftpでサーバーと同期したり。
何かと便利な同期コマンドのrsyncですが、余計なファイルも全て同期してしまうのが不便でした。

今回は除外ファイルリストを使って、Mac特有の不必要なファイルを除外しつつ同期をする方法をメモ代わり。

```$HOME/.rsync/excludes
.Spotlight*
.Trash*
.AppleDouble*
Thumbs.db
.DS_Store
```

改行区切りで不必要なファイルをどんどん追加していきましょう。
ワイルドカードが使えるので、開発者の方は.gitや.env等も追加しておいた方がいいかもしれません。

これでrsyncコマンドを利用する時にオプションとして```--exclude-from=$HOME/.rsync/excludes```
を渡すと、除外リスト一覧を参照しながら同期してくれます。

すでに除外したいファイルを同期してしまっているのであれば、```--delete```オプションを渡してあげると、除外リストに当てはまるファイルを削除同期してくれる筈です。

大体の場合、上記excludesのような不必要リストを作っておいて、

```$HOME/.bash_rc
alias rsync='rsync --exclude-from=$HOME/.rsync/excludes'
```
とでも追加しておくと、スマートに同期コマンドが利用出来て便利ですよ！
1.EC2のインスタント立ち上げ手順メモ


## VPCの作成
EC2の立ち上げではVPC内に設置する必要があるので、まずはVPCから作成 (EC2 Classicを使用すればVPCに置かなくてもOK)

ブロックサイズは16 ~ 28の間
![40f2f108-ca22-97e9-1ca1-98217e8fa6c8.png](https://qiita-image-store.s3.amazonaws.com/0/70031/d1eac702-593c-57c2-ddef-9405f5c2595d.png "40f2f108-ca22-97e9-1ca1-98217e8fa6c8.png")


箱だけ作成した
![スクリーンショット 2015-08-12 2.54.43.png](https://qiita-image-store.s3.amazonaws.com/0/70031/d3151bd6-6b2b-3aa6-2ce9-a2a92cc147c7.png "スクリーンショット 2015-08-12 2.54.43.png")

## 2.サブネットの作成
![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/47e74bc0-ebf4-71e9-f104-5ccbbb9d847f.png "VPC_Management_Console.png")


VPC内にサブネットを置いた
![スクリーンショット 2015-08-12 3.18.15.png](https://qiita-image-store.s3.amazonaws.com/0/70031/c5ae4b31-5138-986e-784f-0963350772d0.png "スクリーンショット 2015-08-12 3.18.15.png")

## 3.インターネットゲートウェイの作成
![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/9fca64e2-a7d8-619d-7a02-015ddc948f1d.png "VPC_Management_Console.png")

続いてルートテーブルを作成して外部インターネットに接続できるようにする
![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/dd54da07-755b-1203-8693-f3f9d3c5add4.png "VPC_Management_Console.png")

作成したルートテーブルとGatewayを関連付け
![VPC_Management_Console_と_aws_md.png](https://qiita-image-store.s3.amazonaws.com/0/70031/c2398ff8-99d0-10c6-603b-fe482875f711.png "VPC_Management_Console_と_aws_md.png")

窓口ができた
![スクリーンショット 2015-08-12 14.17.08.png](https://qiita-image-store.s3.amazonaws.com/0/70031/05a00f59-8457-6914-3baf-b3eeab510452.png "スクリーンショット 2015-08-12 14.17.08.png")

## 4.セキュリティグループの設定
セキュリティグループでインバウンド / アウトバンドルールをそれぞれ設定する

![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/5d91761f-f207-6424-74e3-a1ecc7340331.png "VPC_Management_Console.png")


* インバウンド
![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/c20b4af2-a4a7-aa88-3aaa-851ab0cec1ba.png "VPC_Management_Console.png")

* アウトバウンド
![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/b945a69a-bd20-5bf4-9479-4568c781e0e3.png "VPC_Management_Console.png")

## 5.インスタンスの作成
インスタンスの作成ボタンを押したあとに下記のページに遷移

![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/68f61a41-4f8b-da0e-3e07-501d96421605.png "EC2_Management_Console.png")



![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/db4e448c-6b97-b5f7-ba1b-e2692e256ae5.png "EC2_Management_Console.png")



![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/81abae95-abfa-bf20-d9a5-ad04d795c1ed.png "EC2_Management_Console.png")




![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/70031/fcc7fb77-8de1-8a86-f6e1-d324eb375540.png "EC2_Management_Console.png")

EC2が置けた
![スクリーンショット 2015-08-12 16.14.20.png](https://qiita-image-store.s3.amazonaws.com/0/70031/9ffbb6b3-7a1e-8ac1-2fc4-ac764a63404b.png "スクリーンショット 2015-08-12 16.14.20.png")

あとはSSHで立ち上げたインスタンスにログインができればOK
gruntがインストール出来ない

mac10.9.5環境下
node,npm,homebrewはインストール済み。
grunt-cli v0.1.13。

作業用ディレクトリ下で
”npm init”を実行後続けて”npm install grunt”を実行。

多数のnpm ERR!が発生し、gruntがインストールされたかどうか
"grunt -version"で確認するも
「grunt-cli v0.1.13」とだけ表示されgrunt自体はインストールされてない模様。

類似エラーを探して見るもなかなか原因が分からない状態です。
SSL自己署名証明書作成（webサーバ：nginx）


# Manual

## SSL鍵配置ディレクトリを作成

```
## root user

cd /etc/nginx
pwd
mkdir -p ssl/{work,key,cert}
chmod 700 ssl/key

DOMAIN_NAME='example.com'
echo $DOMAIN_NAME
```

## 乱数生成

```
## 
## 鍵を作成するための乱数を生成する
## 

cd /etc/nginx/ssl
dd if=/dev/urandom of=work/${DOMAIN_NAME}.rand count=1024 bs=1024
chmod 700 work/${DOMAIN_NAME}.rand

```

## 秘密鍵生成

```
## 
## openssl genrsaコマンドでRSA形式の秘密鍵を生成
## 擬似乱数を渡して、2048bitで暗号化している
## 
cd /etc/nginx/ssl
openssl genrsa -rand work/${DOMAIN_NAME}.rand -des3 2048 > key/${DOMAIN_NAME}.key
  # 秘密鍵のパスフレーズを入力

ls -l key/${DOMAIN_NAME}.key
chmod 700 key/${DOMAIN_NAME}.key
```

## CSR生成

```
##
## CSRとは、サーバ証明書への署名を認証局へ要求するための申請書のようなもの
## Certificate Signing Request
## CSR作成時に、コモンネーム（https通信したいドメイン名）や運営者情報などの入力を促される
## （各認証局に署名を依頼する場合、email, passwordなどの入力はemptyのままにしておくよう注意書きしている認証局が多い）
## CSRはここで入力した情報に加えて、さっき作った秘密鍵と対になる公開鍵情報も含まれている
## 
cd /etc/nginx/ssl
openssl req -new -key key/${DOMAIN_NAME}.key -out work/${DOMAIN_NAME}.csr
  # pass phraseは、先ほど設定した秘密鍵のパスを入力する
  # 秘密鍵から公開鍵を算出するため、秘密鍵を指定する必要がある
  # （秘密=>公開の特定は簡単、公開=>秘密の特定はほぼ不可能という暗号アルゴリズムの特性）
chmod 700 work/${DOMAIN_NAME}.csr
```

## 自己署名

```
cd /etc/nginx/ssl
openssl req -x509 -in work/${DOMAIN_NAME}.csr -key key/${DOMAIN_NAME}.key -out cert/${DOMAIN_NAME}.self.crt -days 3650
  # 10年間有効な自己署名のサーバ証明書を作成
chmod 700 cert/${DOMAIN_NAME}.self.crt
```

## パスフレーズ解除版の証明書作成する

```
cd /etc/nginx/ssl
openssl rsa -in key/${DOMAIN_NAME}.key -out key/${DOMAIN_NAME}.nopass.key
  # 秘密鍵作成時に指定したパスフレーズを入力
chmod 700 key/${DOMAIN_NAME}.nopass.key
```

## conf

`server{}`ディレクティブ内に以下を記述して再起動.

```
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/nginx/ssl/cert/${DOMAIN_NAME}.self.crt;
ssl_certificate_key /etc/nginx/ssl/key/${DOMAIN_NAME}.nopass.key;
```

# Environment

```
$yum list nginx
インストール済みパッケージ
nginx.x86_64         1:1.6.2-1.22.amzn1         @amzn-updates
```
reactでtableを作るときは、tbodyを使うこと

reactでtableを作るときに

これだと、うまく更新されない
table > tr > 

これだとうまくいった。
table > tbody > tr > 


tbodyを使わないと
初回のデータは自動で作成されたtbodyの中に作られて、更新データはtbodyの外に書かれた。
eb コマンドラインが機能しなくなる

# 問題
いきなりebコマンドラインが機能しなくなる
`$eb list
...
  SecurityWarning
ERROR: Credential must have exactly 5 slash-delimited elements, e.g. keyid/date/region/service/term, got 'xxxx/xxxx/yyyymmdd/region/elasticbeanstalk/ternm'
`
/ で分割してるけど要素数5つないとだめと怒られる。
アクセスキーに / が含まれてるのがだめみたい

# 解決方法
AWS アクセスKey を新しく発行する

~/.aws/ にアクセスキーとか設定するところあるのであたらしいアクセスキーシークレットキーに書き換える

原因は謎
vagrantについて（メモ）

> 一貫した開発環境を作るツールである。「私の環境では動く」バグにサヨナラしましょう～

# プロジェクトのセットアップ
```bash
# プロジェクトディレクトリ作成
$ mkdir my_project
# プロジェクトディレクトリに移動
$ cd my_project
# カレントフォルダをルートディレクトリに指定
# Vagrantfile　生成
$ vagrant init 
```
**$ vagrant init --minimal**で実行すれば、最低限、コメント無しのVagrantfile が生成される。

# Vagrantfile
Vagrantfileの主要機能は、プロジェクトに必要なマシンタイプ、そして、これらのマシンをどのように設定/プロビジョンするかを記述することです。
構文はRubyです。
Vagrantはカレントディレクトリから順番に上の階層へVagrantfileを探す。
複数Vagrantfileが有る場合、新しい設定は古い設定を上書きする。

## 基本のVagrantfile構造
```rb
Vagrant.configure("2") do |config|
  #...
end
```
**"2"**は**config**のバージョンを指定する。設定可能なのは：１、2。

## 設定項目
```rb
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "CentOS"
  config.vm.hostname = "pc_name"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 1024
    vb.cpus = 2
    vb.name = "vm_name"
  end
  config.vm.synced_folder "../helloWorld", "/var/www/html/helloWorld"
  config.vm.provision :shell, :path => "shellScript.sh"
end
```

# BOX
vagrantではベースイメージのことをboxという。
##  boxのインストール
```bash
$ vagrant box add box_name box_url_or_imagePath
```
## boxの使用
Vagrantfileを編集
```rb
Vagrant.configure("2") do |config|
  config.vm.box = "box_name"
end
```
[online box list](https://atlas.hashicorp.com/boxes/search)

## boxの作成
下記のコマンドを使って、自分のBOXを作る。
* vagrant package
* vagrant repackage

# 起動とSSH接続
```bash
$ vagrant up
$ vagrant ssh
```
# 共有フォルダ
デフォルトでは、Vagrantfileが所在するフォルダは仮想マシンの **/vagrant**として同期されている。
##  共有フォルダの指定
* Vagrantfileに下記のように記述する
```rb
config.vm.synced_folder "../helloWorld", "/var/www/html/helloWorld"
```
* Apacheのwebパスを変更する
```bash
$ rm -rf /var/www/html
$ ln -fs /vagrant /var/www/html
```   

# 保留/中断/破壊
* vagrant suspend
* vagrant halt
* vagrant destroy

# その他のコマンド
* vagrant box list
* vagrant box remove
* vagrant provision
* vagrant reload
* vagrant resume
* vagrant status
* vagrant package

> 参考：
* http://lab.raqda.com/vagrant/index.html
* http://qiita.com/hiroyasu55/items/11a4c996b0c62450940f
コマンドラインから github のレポジトリを作るワンライナー

ただのメモ

```
curl -u sonots https://api.github.com/user/repos -d '{"name":"'foo'"}'
```

パスワード聞かれるので打つと作成される。

~/.bashrc とかに次のような関数を書いておくと `git-create-repo foo` でできるようになって便利

```bash
function git-create-repo() {
  curl -u sonots https://api.github.com/user/repos -d "{\"name\":\"$1\"}"
}
```

curl だけ入ってれば使えるので portable
LollipopのFragment Transitionが期待通りに動作しないときの対応

LollipopのFragment Transitionがなかなか期待通りに動作せず、いろいろ試した結果をメモとして残します。
※自分用のworkaroundとしては使えていますが、とんでもない勘違いなどがあるかもしれませんのでご容赦ください。

#Shared ElementがShared Elementにならない場合
Fragment間のトランジションでShared Elementを設定すると、Fragment全体のトランジションにオーバーレイするようなかたちで、特定のViewのみがFragmentをまたがって変化していくアニメーションを実装できるはずなのですが、条件が揃っていないとうまく動作しないようです。失敗している場合はViewがSharedElementになりません（前後のFragment内で個別にアニメーションが行われ、Fragment全体のトランジションの影響も受ける）。

##原因
SharedElementに指定したViewは、トランジションの間のみ自動的にViewOverlayに描画される仕様のはずなのですが、そのように動作させるには次の条件を満たす必要があるようでした。


###条件1: ChangeTransfromを使う
setSharedElementEnterTransitionで、ChangeTransfromを必ず適用します。

```lang:java
    TransitionSet transitionSet = new TransitionSet();

    ChangeBounds changeBounds = new ChangeBounds();
    transitionSet.addTransition(changeBounds);

    //不要でも追加
    ChangeTransform changeTransform = new ChangeTransform();
    transitionSet.addTransition(changeTransform);

    fragment.setSharedElementEnterTransition(transitionSet);
```

なお、ViewOverlayへの描画をsetReparentWithOverlayで強制的にオフにすることで、正しい条件下でもSharedElementとして動作しなくなるのが確認できます（デフォルトはtrue）。

```lang:java
changeTransform.setReparentWithOverlay(false);
```



###条件2: Viewの座標（View自身のマージンを含むグローバルな左上座標）が前後のFragmentで異なっているようにする
座標が変わらない場合はSharedElementにならないようです。前後のFragmentでViewの構造が似通っていて、SharedElementにしたいViewの位置がlayout_marginでしか差がついていないような場合は注意しないといけません。


これらの条件を満たしたうえで、その他の設定が正しく行われていればSharedElementとしてアニメーションが動作するはずです。


#現在のFragmentがトランジション開始時に消えてしまう
FragmentTransactionのreplaceメソッドを使って画面遷移を行うと、現在のFragmentが実行した瞬間に消えてしまい、画面遷移らしいトランジションになりません。SharedElementに指定したViewは描画されますが、その他の要素が残らないのは期待とはちょっと違うような気がします。
トランジションの開始よりも先に、現在のFragmentのonDestroyViewが呼ばれてしまうのが理由のようですが、その回避方法は自分では見つけられませんでした。
対策としては、トランジション前のViewをキャプチャして、ビットマップを上位のコンテナの背景などに一時的に適用する方法などが考えられます。次のような感じです。

```lang:java
    Transition fade = new Slide(Gravity.RIGHT);
    
    prepareCaptureImage(targetViewGroup); //現在のFragmentをBitmap化して保存する

    fade.addListener(new Transition.TransitionListener() {
        @Override
        public void onTransitionStart(Transition transition) {
            setCaputreImageToContainer(upperViewGroup); //上位のViewGroupの背景などにBitmapを適用する
        }
        @Override
        public void onTransitionEnd(Transition transition) {
            upperViewGroup.setBackgroundResource(0); //背景解除
            destroyCaptureImage(); //Bitmapを破棄
        }
        ....
```
Swiftで分割コンパイル


ソースファイルごとに異なったオプション（主に最適化オプション）でコンパイルしたくなるときがあります．Xcodeで設定してもなぜか反映されません（？）．そこで，コマンドラインでmakeなどを使ってビルドできるよう，分割コンパイルの方法を調べてみました．


### `swift -frontend` とは
Xcodeでのビルドログを眺めると`-frontend`というスイッチを使ってごちゃごちゃとやっていたので，試しにコマンドラインで`swift -frontend -help`と打ってみると，ずらずらと見慣れないヘルプが出てきます．
基本的な使い方は，

```
swift -frontend [MODE] [OPTIONS] [SOURCES]
```
となるようです．
[MODE]はアセンブラで出力(`-S`)とかオブジェクトファイルで出力(`-c`)とかがあります．
分割コンパイルで最重要なのは`-primary-file`というオプションです．ソースファイル名の直前にこのオプションをつけると，そのソースだけがコンパイル対象になります．

### 分割コンパイル例
いま，TestA.swift, TestB.swiftというソースがあるとします．TestBはTestAに依存（TestAの関数を参照している）とします．
TestAの最適化なしオブジェクトファイル(.o)を出力:

```
swift -frontend -c -Onone -primary-file TestA.swift TestB.swift -sdk SDK
```

TestBの最適化ありオブジェクトファイル(.o)を出力:

```
swift -frontend -c -O TestA.swift -primary-file TestB.swift -sdk SDK
```
(SDKは/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk など)
ソース間に依存関係がある場合は，とりあえず全ソース名を並べてターゲットの前に`-primary-file`を付けるのが無難です．

### 実行ファイル生成
各オブジェクトファイルをリンクします．

```
swiftc TestA.o TestB.o -o Test
```
これでTestという実行形式が出来上がります．

### その他
- モジュール名（例えばMyTest）を付けたい場合は`-module-name MyTest`を追加します．
- 他でインポート可能なモジュールを作りたい場合は，`-emit-module`を付けます．.swiftmoduleというファイルが作られます．（生成したモジュールを他で使えるようにするのは少々手間がかかるので後ほど．．．記述するかも．．）
Mockito で @hide なメソッドをモックする

## Mockito を使ってメソッドのモックをする普通の方法

```java

public class SomeTest {
  private TestTarget mTarget;

  @Test
  public void something() {
    Something something = mock(Something.class);
    when(something.hogehoge()).thenReturn("mock");

    mTarget.setSomething(something);
    mTarget.doit();

    // 以後アサーション
  }
}
```

何も難しいことはないですね。
でも、`Something#hogehoge()`が`@hide`だったらどうでしょう。
当然`TestTarget`内でもリフレクションで呼び出すことになりますが、Mockito でモックする場合はどうするのがよいでしょう。

## `@hide`なメソッドをモックする

まず適当なユーティリティを作ります。

```java
public Utility {
  public static final String TAG = Utility.class.getSimpleName();

  private Utility() {
    throw new AssertionError();
  }

  public static Object callHiddenMethod(Object target, String methodName, Class[] argTypes, Object[] args) {
    try {
      Class clazz = target.getClass();
      Method method = clazz.getDeclaredMethod(methodName, argTypes);
      return method.invoke(target, args);
    } catch (NoSuchMethodException e) {
      Log.e(TAG, "no method found", e);
    } catch (InvocationTargetException e) {
      Log.e(TAG, "something went wrong while executing the method.", e);
    } catch (IllegalAccessException e) {
      Log.e(TAG, "cannot access to the method", e);
    }
    return null;
  }
}
```

簡単ですね。リフレクションでメソッドを呼び出すためのユーティリティです。
次に、このユーティリティを使って以下のようにテストコードを書きます。

```java

public class SomeTest {
  private TestTarget mTarget;

  @Test
  public void something() {
    Something something = mock(Something.class);
    when(Utility.callHiddenMethod(something, "hogehoge", null, null)).thenReturn("mock");

    mTarget.setSomething(something);
    mTarget.doit();

    // 以後アサーション
  }
}
```

`when`でのメソッド呼び出しの指定をユーティリティのものに置き換えただけですね。簡単ですね。

これでテストを動かしてみると……

```

BUILD SUCCESSFUL
```

ちゃんと動きます。やったねたえちゃん！

## もっと普通の方法

`@hide`なメソッド、たいていはフレームワークが持っているものなので、そのフレームワークのクラスをラップするだけのクラスを作ってそいつをモックするほうがずっとはるかに単純で分かりやすいと思います。
メモ）brew updateでエラーを吐かれた

brew updateでエラーを吐かれたのでメモ。
Homebrewのgithubには6日前（2015/8/6）にissueあがってた。
エラー出てももう一度updateすれば大丈夫みたい。

# 参考
Error: uninitialized constant Formulary::HOMEBREW_CORE_FORMULA_REGEX #42553
https://github.com/Homebrew/homebrew/issues/42553

# エラー内容

```
$ brew update
Error: uninitialized constant Formulary::HOMEBREW_CORE_FORMULA_REGEX
Please report this bug:
    https://git.io/brew-troubleshooting
/usr/local/Library/Homebrew/formulary.rb:227:in `loader_for'
/usr/local/Library/Homebrew/formulary.rb:176:in `factory'
/usr/local/Library/Homebrew/cmd/update.rb:173:in `block in report'
/usr/local/Library/Homebrew/cmd/update.rb:159:in `each_line'
/usr/local/Library/Homebrew/cmd/update.rb:159:in `report'
/usr/local/Library/Homebrew/cmd/update.rb:24:in `update'
/usr/local/Library/brew.rb:140:in `<main>'
```

# やったこと

```
$ brew --version
0.9.5

$ brew update
Updated Homebrew from 000000fb to 000000fb.
...

$ brew update
Already up-to-date.
```
Visual Studio + ReSharper C++ 1.1RC で条件式での代入を警告してくれるようになった

[RSCPP-14289](https://youtrack.jetbrains.com/issue/RSCPP-14289)

ReSharper C++ 1.1RCで条件式での代入をエディタ上で警告してくれるようになりました。
これで、`==`を誤って`=`と書いてしまうミスを防げます。
![スクリーンショット 2015-08-12 13.29.52.png](https://qiita-image-store.s3.amazonaws.com/0/62550/b49dcaaf-85a8-76bf-3830-fd3d1f2331cd.png)

Visual Studioにも警告レベルを上げることでビルド時に条件式での代入を警告する機能はありますが、エディタ上で警告してくれる分ReSharper C++の方が優秀な感じです。

左側に出てくる💡マークをクリックすると、警告に対する対処を選択できます。

- `( )`で囲って警告を黙らせる。
- `=`を`==`で置き換える。(たいていはこっちでしょう)

![スクリーンショット 2015-08-12 13.30.19.png](https://qiita-image-store.s3.amazonaws.com/0/62550/663bd999-4efd-ac8a-9145-47761a2320cd.png)

ただし、`( )`で囲って黙らせられる仕様が微妙です。
この警告を黙らせる目的で書いたものでない`( )`でも警告しなくなってしまう場合があります:
![スクリーンショット 2015-08-12 13.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/62550/92ceca42-2a0b-3629-4096-94bf0ba2ef85.png)
名前に「&」が入っているGitブランチを操作する際の落とし穴

「git checkout -b branch-name origin/branch-name」でリモートブランチをチェックアウトしようとしたら、ブランチ名に「&」が入っていて上手くいかず、5分くらい悩んだ。
あまり無いケースではあると思いますが、一応解決策を書いておくことにしました。

# 事象

リモートに「sugar&salt」みたいなブランチがあるとします。それをターミナル操作でチェックアウトしようとすると上手くいきません。どうなるかというと、以下のような感じになります。

```bash
$ git checkout -b sugar&salt origin/sugar&salt

[1] 8210
[2] 8211
-bash: salt: command not found
-bash: salt: command not found
```

「&」が入っているせいで、&以降のブランチ名がbashコマンドと見なされてしまっているようですね。
ちなみに上のコマンドを実行すると、リモートブランチの参照に失敗し、現在いるブランチから「sugar」というブランチが切られる結果になります。

# 対策

__ブランチ名をダブルクォーテーションで囲む__

具体的には以下のようにすれば良い。

```bash
$ git checkout -b "sugar&salt" "origin/sugar&salt"
```

こうすることで、「&」がbashコマンドの一部と見なされずに済むので、ターミナル上でも操作が上手くいきます。

# 所感
ブランチ名に記号を混ぜるのはやめた方が良いということを知れてよかったです。朝の貴重な時間が・・。
Xcode 多数のプロジェクトがあるときにフォルダ移動をサポート

多数のXcodeプロジェクトを扱っている場合、フォルダ移動やプロジェクトを開くのが面倒です。
これらのコマンドを利用すると、指定したプロジェクトに移動したり、プロジェクトを開いたりできます。

[xcode_scripts](https://github.com/hmuronaka/xcode_scripts.git)



# コマンド

|コマンド|説明|
|:------ |:---|
|xccd    |Xcodeプロジェクト名からそのディレクトリに移動する|
|xcopen  |Xcodeプロジェクト名から任意のディレクトリのXcodeを開く|
|xcconfig|コマンドのパラメータを表示する|
|xclist  |指定したディレクトリ以下のXcodeプロジェクトの一覧を出力する|
|xcindex |Xcodeプロジェクトのパスをインデックスする|
|xo      |xcopenのalias|
|xc      |xccdのalias|

## xccd (alias xc)

指定したプロジェクトのパスに移動します。

![xc.gif](https://qiita-image-store.s3.amazonaws.com/0/37443/fe733e9e-9563-ece8-7f0d-8c13c9721d28.gif)


```bash
$ xc XVim # xvim のプロジェクトのあるフォルダへ移動

＄xc タブ # 探索先パス内にあるプロジェクト名の一覧を表示します
NSStringTextObject UDPLogger PSUserDefaultsMonitor RLRegEx

$ xc NSタブ #プロジェクト名を補完して、NSStringTextObjectになります

$ popd # 移動はpushdで行うので、popdで戻る事ができます。

$ xc # パラメータ無しの場合はhisotryから選択できます。
0: NSStringTextObject: ~/src/xcode/lib/NSStringTextObject
1: UDPLogger: ~/src/xcode/lib/UDPLogger
select a path >  # 0または1を入力する。qを入れるとキャンセルする。
```

デフォルトでは、カレントディレクトリからプロジェクトを探索します。
~/.xc_configのsearch_pathsの"."を"~/src"等と変更することで、探索するパスを設定できます。


## xcopen (xo)

指定したプロジェクトをXcodeで開きます。

![xo2.gif](https://qiita-image-store.s3.amazonaws.com/0/37443/aaab2dfe-6b97-e7e2-0747-d4c813d5fce3.gif)

```bash
$ xo XVim # xvim のプロジェクトのあるフォルダを開きます

＄xo タブ # 探索先パス内にあるプロジェクト名の一覧を表示します
NSStringTextObject UDPLogger PSUserDefaultsMonitor RLRegEx

$ xo NSタブ #プロジェクト名を補完して、NSStringTextObjectになります。

$ xo # パラメータ無しの場合はhisotryから選択できます。
0: NSStringTextObject: ~/src/xcode/lib/NSStringTextObject/NSStringTextObject.xcworkspace
1: UDPLogger: ~/src/xcode/lib/UDPLogger/UDPLogger.xcproject
select a path >  # 0または1を入力する。qを入れるとキャンセルする。
```

## xcconfig

```bash
$ xcconfig # 設定を表示する
search_paths: ["."]             # プロジェクトを探索するパス
search_depth: 4                 # 探索する深さ
exclude_paths: [".git", "Pods"] # 除外するパス
history_num: 12                 # 履歴の数 
```

```bash
$ xcconfig --generate # 設定ファイル~/.xc_configを生成する
```

## xclist

指定したディレクトリ以下のプロジェクト名を表示します。プロジェクト名の補完のために内部で利用しています。

```bash
$ xclist ~/src 4 # 4は探索する深さ
NSStringTextObject
UDPLogger
PSUserDefaultsMonitor
RLRegEx
```



## xcindex

xc xo はフォルダ探索を都度行うため、探索パスを深く設定した場合、遅くなる場合があります。そこでXcodeプロジェクトのパスのインデックスを作成することで、高速化できます。

```bash
$ xcindex ~/src 10 # ~/srcが探索元のフォルダ.10はインデックスを作成する階層。

xc UDPLogger # ディレクトリを探索する代わりにindexを検索.
```

xcindexを実行すると~/.xcindexファイルが生成され、自動的にインデックスが有効になります。無効にするには~/.xcindexを削除します。


# インストール

```bash
$ cd ~
$ git clone https://github.com/hmuronaka/xcode_scripts.git
$ cd xcode_scripts
$ ./install.sh
```

.bash_profileに以下を追加

```bash
$ source ~/.xcode_scripts/xcode_script.bash
```

Xcodeプロジェクトを多数管理している方には、便利かもしれません。
Google Play Serviceの分割AARからEclipseのライブラリプロジェクトを作ってメソッド数制限を回避する

## はじめに

最近、お仕事でUnityとかcocos2dxのプロジェクトを触る機会があるのですが大抵の場合Eclipse形式のプロジェクト（or Unityプロジェクト）です。
Eclipse形式のプロジェクトで困るポイントの一つがGoogle Play Serviceの導入です。
Android SDKに含まれているGoogle Play Serviceのライブラリプロジェクトが全部盛りの超巨大ライブラリなせいで、こいつをそのまま使うとあっという間にメソッド数の64K制限に引っかかってきます。

この問題を回避するため、Android Studio（Gradle）では機能毎に分割されたAARファイルを使うことができるのですが、残念ながらライブラリプロジェクトは用意されていません。

ただ、AARはJarファイルとリソースをひとまとめにした普通のZipファイルなのでこいつを解凍し、Eclipseプロジェクトのディレクトリ構成にしてやればEclipseでライブラリプロジェクトとしてImportすることができます。

## AARファイルを入手する

Android SDKがインストールされていない場合は、Android SDKをインストールしてください。
AARファイルを使用するためにはSDK Managerで`Google Repository`をインストールします。

AARファイルは`$SDK_ROOT/extras/google/m2repository/com/google/android/gms/play-services-[モジュール名]/[バージョン]`に格納されています。

今回はplay-services-baseの7.5.0を例に説明します。
まずは以下のファイルを適当な作業フォルダにコピーして拡張子を`zip`に変更、解凍します。

```
$SDK_ROOT/extras/google/m2repository/com/google/android/gms/play-services-base/7.5.0/play-services-base-7.5.0.aar
```

## AARの中身をEclipseプロジェクトの構成に変更する

解凍したファイルのディレクトリ構成は次のようになっています。

```
play-services-base-7.5.0
├── AndroidManifest.xml
├── R.txt
├── classes.jar
├── proguard.txt
└── res
    ├── color
    ├── drawable
    ...
```

これをEclipseのライブラリプロジェクトの構成にするには

1. `libs`フォルダと`src`フォルダを作成する
2. `classes.jar`を`libs`フォルダ配下に移動する
3. `R.txt`は不要なので削除する
4. `project.properties`というファイルを作り、`android.library=true`の1行を追加する

これだけです。最終的に以下の構成になります。

```
play-services-base-7.5.0
├── AndroidManifest.xml
├── libs
│   └── classes.jar
├── proguard.txt
├── project.properties
├── res
│   ├── color
│   ├── drawable
│   ...
└── src
```

```:project.properties
android.library=true
```

このディレクトリをEclipseからAndroid ProjectとしてImportすることができます。
また、Unityの`Plugin/Android`フォルダ配下に入れることも可能なはずです。

## スクリプト

やっていることは非常に簡単なのでPythonでスクリプトにしてみました。ただし、Mac OS Xでしか動作は確認してません。
また、Android SDKにコマンドのパスが通っている必要があります。

[Gist: play_service_proj_builder.py](https://gist.github.com/chibatching/38555ecd29e53f2ef87a)

Gistからローカルにコピペかダウンロードしてきて実行します。
使い方は作成するモジュール名とバージョンを指定するだけです。

```
python play_service_proj_builder.py <module name> <version>
```

今回のplay-services-base 7.5.0の場合には次のようになります。

```
python play_service_proj_builder.py base 7.5.0
```

なお、Android SDKにGoogle Repositoryがインストールされていない場合には勝手にインストールします。あしからず。
Excelファイルのシリアル値をPHPで日付に変換する


単刀直入に言うと、`$date = date('Y年m月d日', ($serial - 25569) * 60 * 60 * 24);` でOK

確認をば。

```php:serial.php
<?php

$date = '';

$array = array(
    '1990/01/22',    // 一般?的な日付の書き方
    '2015-08-12',
    '19900122',
    '20150812',
    '32895',         // これがExcelのシリアル値
    '38576'
);

foreach ((array)$array as $key => $value) {
    if (preg_match('/\A[0-9]{4}[\/-]?[0-9]{2}[\/-]?[0-9]{2}\z/i', $value)) {
        $date = date('Y年m月d日', strtotime($value));
    } elseif (preg_match('/\A[0-9]{5}\z/i', $value)) {
        // ここが変換部分。この計算で既にUnix タイムスタンプになるためstrtotime()は不要
        $date = date('Y年m月d日', ($value - 25569) * 60 * 60 * 24);
    } else {
        $date = false;
    }

    echo '変換前   : '.$value."\n";
    if ($date !== false) {
        echo '変換後   : '.$date."\n\n";
    } else {
        echo 'false'."\n\n";
    }

}

```

結果

```bash
変換前   : 1990/01/22
変換後   : 1990年01月22日

変換前   : 2015-08-12
変換後   : 2015年08月12日

変換前   : 19900122
変換後   : 1990年01月22日

変換前   : 20150812
変換後   : 2015年08月12日

変換前   : 32895
変換後   : 1990年01月22日

変換前   : 38576
変換後   : 2005年08月12日
```
screenコマンドのプリフィックスキーを実行時に指定する

-eオプションで指定する。例えばcontrol-tにするなら以下のように。

```
screen -e'^Tt'
```

# あとがき
.screenrcに書けよって話ではあるけれど、共用のサーバ/ユーザだとそうもいかないので。そもそもなんでデフォルトのキーバインドがcontrol-aなの、それじゃあ行頭に戻られへんやん。
ScrollView、HorizontalScrollViewのスクロールバーを消す

備忘録として。

ScrollViewの縦のスクロールバーを消したいときはこうする。

```
ScrollView scrollView = new ScrollView(this);
scrollView.setVerticalScrollBarEnabled(false);
```

そして、HorizontalScrollViewの横スクロールバーを消したいときはこうする。

```
HorizontalScrollView hScrollView = new HorizontalScrollView(this);
hScrollView.setHorizontalScrollBarEnabled(false);
```

xmlで記述するときには、

```
android:scrollbars:none
```

と指定する。


これをやるのに、時間がかかったので書いておきます。
[Swift] UITableViewの上部にマージン(inset)が自動で設定されてしまうのをstoryboardで解除する。

UITableViewやcellをカスタムで作った場合にUITableViewの上部に少しのinsetが表示されることがある。その対処法

## コードで対処する方法
直接insetを上書きすることで無理やりinsetを変更することができる。

```swift
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
```

## storyboardで対処する方法
UITableViewを含むViewControllerを選択，下の画像のViewController, Layoutの部分にあるAdjust Scroll View Insetのチェックを外す。
こうすることでinsetがviewdidload時点で変更されることがなくなる。

![スクリーンショット 2015-08-12 12.59.12.png](https://qiita-image-store.s3.amazonaws.com/0/63865/fe93f330-2d94-f5f5-608e-5b72edb484b5.png "スクリーンショット 2015-08-12 12.59.12.png")
ES6で可変長の引数に配列を渡す

ES6の可変長の引数に配列を渡すやり方がわかりやすくなってたので調べてみた。

可変長の引数は下記のように数に指定なく複数の引数を渡せる。

```lang:js
function test() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}

test("あ","い","う");
// -> あいう
test("あ","い","う","え","お");
// -> あいうえお
```

複数の引数を受け取り関数内でargumentから値をとりだしている処理に対して、配列を渡したい場合、ES5では下記のようにapplyを使い書く。

```lang:js
function test() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}

var aiu = ["あ","い","う"];
test.apply(null, aiu); // -> あいう
```

ES6では、下記のようにスプレッドオペレータを使い書ける。

```lang:js
var aiu = ["あ","い","う"];
test(...aiu); // -> あいう
```

配列を展開してくれる機能のスプレッドオペレータがES6では実装されているので、読みやすいコードが書けるようになった。
CakePHP3 ログイン後のURLを固定する

CakePHP3で、ログイン後のURLを指定する場合、
Authコンポーネントを使って以下のように書きますね。

```php:src/Controller/AppController.php
public function initialize()
{
    parent::initialize();
    $this->loadComponent('Auth', [
        'authorize' => 'Controller',
        'authenticate' => [
            'Form' => [
                'fields' => [
                    'username' => 'email',
                    'password' => 'password'
                ]
            ]
        ],
        'unauthorizedRedirect' => [
            'controller' => 'Users',
            'action' => 'login'
        ],
        'loginRedirect' => [
            'controller' => 'Articles',
            'action' => 'index'
        ],
        'logoutRedirect' => [
            'controller' => 'Users',
            'action' => 'login'
        ],
        'authError' => __('You need Logged In.')
    ]);
}
```

この記述だと、未ログイン状態で例えば
http://sample.com/comments
にアクセスすると
http://sample.com/users/login
にリダイレクトされて、ログインに成功すると
http://sample.com/comments
に戻されます。

アクセスしようとしたURLに戻してくれるので便利といえば便利なのですが、ログイン後のURLを固定したい場合もあるでしょう。

固定したい場合は、sessionからAuth.redirectを消します。

```php:src/Controller/UsersController.php
public function login()
{
    if ($this->request->is('post')) {
        $user = $this->Auth->identify();
        if ($user) {
            $this->Auth->setUser($user);
            $this->Flash->success(__('Log In Success.'));
            $this->request->session()->delete('Auth.redirect');
            return $this->redirect($this->Auth->redirectUrl());
        }
        $this->Flash->error(__('Invalid username or password, try again'));
    }
}
```

これで、実現できました。
Java用JSON文字列へ変換


### code

```groovy:foo.groovy
'''\
[
  {"key" : "value1"},
  {"key" : "value2"}
]
'''.eachLine {
  def line = it.trim()
  print line.replaceAll('"', '\\\\"')
}
```

### result


```
[{\"key\" : \"value1\"},{\"key\" : \"value2\"}]
```
Python3でjsonを返却するwebAPIにアクセスして結果を出力するまで



## 今回は天気情報を返してくれるopenweathermap.orgのAPIにアクセス

```
import urllib.request
import json

url = 'http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp'
response = urllib.request.urlopen(url)
content = json.loads(response.read().decode('utf8'))
print(content)
```

## 出力結果

```
{
    "base": "stations", 
    "clouds": {
        "all": 40
    }, 
    "cod": 200, 
    "coord": {
        "lat": 35.69, 
        "lon": 139.69
    }, 
    "dt": 1439347788, 
    "id": 1850147, 
    "main": {
        "humidity": 70, 
        "pressure": 1005, 
        "temp": 305.28, 
        "temp_max": 312.04, 
        "temp_min": 299.82
    }, 
    "name": "Tokyo", 
    "sys": {
        "country": "JP", 
        "id": 7619, 
        "message": 0.014, 
        "sunrise": 1439323035, 
        "sunset": 1439372096, 
        "type": 1
    }, 
    "visibility": 10000, 
    "weather": [
        {
            "description": "scattered clouds", 
            "icon": "03d", 
            "id": 802, 
            "main": "Clouds"
        }
    ], 
    "wind": {
        "deg": 110, 
        "speed": 2.6
    }
}
```
[Unity][Android]Unity画面からfinishしてAndroidの画面に戻す方法

単純に`finish()`するだけだとアプリが落ちてしまうようです。
次のように実行したところ元画面に遷移しました。

UnityPlayerNativeActivityを継承したActivityを作成する。
次の内容のメソッドを実装する。

```
public void end() {
  runOnUiThread(new Runnable() {
      @Override
      public void run() {
          mUnityPlayer.quit();
          finish();
      }
  });
}
```

一応これで元画面に戻ったのですが、
内部的には一回アプリを落として再起動しているようで、
static変数ですら初期化されてしまいました。
rubyの基礎文法 メモ

## 夏休みにrubyやることになったので、自分メモを記述していく

公式サイト
https://www.ruby-lang.org/ja/
コアリファレンス
http://ruby-doc.org/core-2.2.2/


## print

```
print "hoge" # 終わったあとに改行がない
puts "hoge" # 改行がある
p "hoge" # データの形式がわかるように表示
```

## 定数
全部大文字で書けばOK


## 文字列オブジェクト

* ダブルコーテーションとシングルコーテションで異なる点に注意する

```
name = "hoge"
x = "my name is #{name}\n" # 変数展開、特殊文字(\t \n)
y = 'my name is #{name}\n' # なんもならずに、そのまま表示される
```


## 破壊的メソッド、真偽値を返すメソッド

```
* 破壊的メソッドを使うと元の変数の値が書き換わる。
s = "hoge"
s.upcase!
puts s
=> "HOGE"
```

```
s = ""
x =  s.empty?　# ⇛空文字か検査
puts x
⇛ true
```

## 配列オブジェクト

```
array = [5, 8, 4]

p array[0..2] # 要素の0から2まで
⇛[5, 8, 4]

p array[0...2] # 0を起点に2つ
⇛[5, 8]

p array[-1] # 最後の1つ
⇛4

p array[1, 2] # 1番目の要素から2つぶん
[8, 4]


array  = [5, 8, 4]
array[0...2] = [1, 2]
p array
⇛[1, 2, 4]

(要素の削除)
array[0, 2] = []
p array
⇛[4]
# なんか違和感あるけど、初期化される

(配列の末尾に要素追加)
array.push(100)
とか
array << 100 << 102
```


## ハッシュオブジェクト
(波括弧ですよ!!)

```
array = {"hoge" => 200, "huga" => 300}
p array["hoge"]
⇛200

array = {:hoge => 200, :huga => 300}
p array[:hoge]
⇛200

array = {hoge: 200, huga: 300}
p array[:hoge]
⇛200

p array.has_key?(:hoge)
⇛true
```
## %記法


```
下記が同じ感じで扱える
s = "ho\"ge"
s = %Q(ho"ge)
s = %(ho"ge)　# Qは省略可能

s = 'ho\"ge'
s = %q(ho"ge)

a = ["a", "b", "c"]
put a
⇛["a", "b ", "c"]

a = %W[a b c]
put a
⇛["a", "b ", "c"]
```

## 真偽値

```
false : false nil(オブジェクトが存在しない)
true それ以外(0 ''を含む)
```


## loop 処理

```
3.times do
	put "hoge"
end

3.times do |i|
	put "#{i}: hoge"
end
```

## ループ制御

```
break
next # 他の言語でいうcontinue
```

## each

```
["hoge", "fuga", "pero"].each do |x|
    puts x
end
```


## クラス

```
class User
	@@ count  = 0 # クラス変数

	def initialize(name)
		@name = name #インスタンス変数
		@@count  += 1
	end

	def sayHoge # インスタンスメソッド
		puts "hogehoge"
	end

	def Person.SayFuga # クラスメソッド
		puts "fugafuga"
	end

	attr_accessor : name # インスタンス変数nameに対するアクセサ

	=begin
	attr_reader : name # ゲッタ
	attr_writer : name # セッタ
	=end
end
```

* newしてみる
`tom = User.new("tom")`  


* クラスメソッド呼ぶ
`User.sayFuga()`


## 継承

class  SuperUser < User
あるディレクトリをgithubにコミットする

```bash
cd ~/targetProject
git init
git config -l　| grep remote #リモートの設定がない
git remote add origin https://github.com/hoge/fuga.git # コミットしたいurlを指定
git config -l | grep remote #リモート設定確認できる
git pull
git add .
git commit -m 'init commit'
git push origin mater
```