OmniAICreator/Qiita-1.07M huggingface dataset:
grepの使い方

全然覚えないので

# 基本
grep [オプション...] パターン [ファイル...] 
grep [オプション...] [ファイル...] -e パターン
ファイルを指定しないと標準入力をパターンマッチング

# オプション
-a, --text, --binary-files=text
通常だとgrepがバイナリだと認識してしまうファイルも強制的にテキストとして認識させる。 テキストファイルでも最初の方に少しテキストでないバイナリがゴミとかで含まれちゃっていると、 grepはバイナリファイルだと勘違いしてしまう。バイナリ扱いになってしまうと、差分の内容が表示されないので、 無理にテキストファイルとして扱わせるオプション。
-A 行数
このオプションを指定するとマッチした行の後も指定した行数を出力する。
-B 行数
このオプションを指定するとマッチした行の前も指定した行数を出力する。
--color=always
カラーで表示する。これを付けなくてもデフォルトでカラー表示かもしれないが、 出力をパイプでつないだときは自分の環境ではこのオプションを付けないとカラー表示にならなかった。 less -R を使いたいときには、パイプなのにカラー表示したい、という状況になる。
-e パターン
パターンを指定する。-e オプションがない場合は最初のパラメータがパターンと見なされる。
-E
拡張正規表現を使う。 (foo|bar) のような表記の正規表現を使うには、 このオプションが必要。
-i
大文字小文字を区別せずにマッチングをする。
-l (小文字エル)
マッチしたファイルのファイル名のみを出力する。
-L
マッチしなかったファイルのファイル名を出力する。
--line-buffered
行ごとのバッファリングにする。tail -f などからパイプで受け取るときに便利。
-n
検索結果の出力に行番号をつける。
-H
検索結果の出力にファイル名を付ける。 検索対象のファイルが1つの場合にはデフォルトではファイル名は出力されず、 複数の場合にはデフォルトでファイル名が出力される。 このオプションを付けるとたとえファイルが1つでもファイル名が出力される。
-o
マッチした部分のみを表示する。このオプションがなければマッチした行全体を表示する。
-r
ディレクトリを再帰的にたどって検索する。
-v
通常とは逆に、マッチしない行を出力する。

# 参考
[grep コマンド](https://hydrocul.github.io/wiki/commands/grep.html)
Heroku Set Up 2

###Install Git

```bash
sudo yum -y install git
```

###Install Heroku tool

```bash
wget -O- https://toolbelt.heroku.com/install.sh | sh
```

```bash
echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bash_profile
```

```bash
source ~/.bash_profile
```

```bash
cd /srv/www/herokutest
```

```bash
vi Gemfile
```

Add this line

```ruby:Gemfile
gem 'rails_12factor'
```

```bash
bundle install
```

```bash
vi Procfile
```

```ruby:Procfile
web: bundle exec rails server -p $PORT
```

```bash
git init
```

```bash
git add .
```

```bash
git commit -m "init"
```

```bash
heroku login
```

```bash
heroku create
```

```bash
git push heroku master
```

```bash
heroku addons:create heroku-postgresql
```

```bash
heroku run rake db:migrate
```

You can check your app info

```bash
heroku apps:info
```

Then you can access here

######https://enigmatic-depths-72341.herokuapp.com/users

If you want to access here
######https://enigmatic-depths-72341.herokuapp.com

```bash
vi config/routes.rb 
```

Add this line

```bash
root 'users#index'
```

```bash
git add config/routes.rb 
```

```bash
git commit -m "add route"
```

```bash
git push heroku master
```
htmlのページャー番号をjsとフォームに渡して実行する方法

ページャーのリンクをクリックしたときにjsのfunctionを呼び出して
クリックしたページ番号をフォームの要素に追加し、フォームをsubmitする方法。


```
<a href="#" onclick="funcPage(ページ番号);">ページ番号</a>'
```

```
    <script language="javascript" type="text/javascript">
	function funcPage(ページ番号) {
	    // エレメントを作成
	    var ele = document.createElement('input');
	    // データを設定
	    ele.setAttribute('type', 'hidden');
	    ele.setAttribute('name', 'page');
	    ele.setAttribute('value', page);
	    // 要素を追加
	    document.forms[0].appendChild(ele);
	    document.forms[0].submit();
	}
    </script>
```

ちなみにphpで受け取ったページ番号が空だったら1を入れる書き方。

```
$page = empty($_POST["page"])? 1:$_POST["page"];
```
Realm Java + Jackson でintやStringのJSON配列をデシリアライズして保存する

Realm Javaは（執筆時点のv.0.89.1では）intなどのプリミティブ型やStringのリストを[扱えません](https://github.com/realm/realm-java/issues/575)。Realm Javaが扱えるのはRealmObjectとRealmListのみで、RealmListの要素はRealmObject（のサブクラス）である必要があります。つまり、以下のようなモデル定義はできません。

```java
public class Hoge extends RealmObject {
    private RealmList<Integer> intList; // IntegerはRealmObjectじゃないのでエラー
    private RealmList<String>  strList; // StringはRealmObjectじゃないのでエラー

    // getter, setter...
}
```

これは、以下のようなJSONをGsonやJacksonなどで透過的にRealmObjectに変換できないという意味でもあります。

```json
{
  "digit" : [1,2,3],
  "str"   : ["a","b","c"]
}
```

さすがにこの制限のためにJSON側を縛るのは非現実的です。Realm側でなんとかしましょう。

# ラッパーを作る
まず、JSON配列で扱いたい値をRealmObjectでラッピングします。以下はintの例。

```java
public class RealmInt extends RealmObject {
    private int val;

    public RealmInt() { }

    public RealmInt(int val) {
        this.val = val;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }
}
```

Stringや他の型でも基本同じです。
※ フィールドがboolean型のときはgetterの名前に注意してください。Android Studioの補完機能でboolean型のgetterを自動生成すると`isVal()`のようにprefixがisとなります。getter経由でフィールドにアクセスするタイプのJSON Parserだと、`isVal()`ではなく`getVal()`にしないと値がうまく取れないことがあります。

# JSONデシリアライザを書く
上で作ったRealmIntは独自のクラスなので、JSON Parserに扱い方を教えてあげなければなりません。Gsonの場合は公式に[サンプルへのリンク](https://gist.github.com/cmelchior/1a97377df0c49cd4fca9)があるのでこれが参考になります。ここではJackson（v.2.0.0）の例を載せます。

```java
public class RealmIntArrayDeserializer extends JsonDeserializer<RealmList<RealmInt>> {
    @Override
    public RealmList<RealmInt> deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException
    {
        if (!p.isExpectedStartArrayToken()) {
            throw new RuntimeJsonMappingException("Token does not start array.");
        }
        RealmList<RealmInt> intList = new RealmList<>();
        JsonToken token;
        do {
            token = p.nextToken();
            if (token == JsonToken.VALUE_NUMBER_INT) {
                intList.add(new RealmInt(p.getIntValue()));
            }
        } while (token != JsonToken.END_ARRAY);

        return intList;
    }
}
```

Stringの場合は `JsonToken.VALUE_NUMBER_INT` が `JsonToken.VALUE_STRING` になります。ListではなくRealmListを返す点に注意してください。あとはモデル定義で、該当するフィールドにこのデシリアライザを使うようにアノテーションを付ければOKです。

```
public class Hoge extends RealmObject {
    @JsonDeserialize(using = RealmIntArrayDeserializer.class)
    private RealmList<RealmInt> digits;

    // getter, setter...
}
```

# 検証環境
- Retrofit (v.2.0.0) でAPIからJSONをもらい、
- Jackson (v.2.0.0) でJSONをパースし、
- Realm (v.0.88.2) で保存しました。
シーケンスパターンをつくる

`multislider` -> `listfunnel` -> `coll`

- `coll` に 「index, value」 のペアを入力するとそれを保存する
- `coll` に 数値 を入れるとその保存されている index の値を出力する
- `listfunnel` はリストを受け取って「index, value」のペアにして出力する

<img width="391" alt="スクリーンショット 2016-05-03 13.28.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/2568/e8bb2431-5bc6-d56e-a1fa-e86b9adc99a3.png">

```
----------begin_max5_patcher----------
676.3ocyVssbaBCD8Y3qPCuV2LRBLX5uRmNdDlMNJEj7.BWmlI+6UW.amZhA
6XyjGPxZ8Joy4nc0pW88Bxj6f5.zOP+D448pumm0jwfW6XufR1tUErZqaAB3
OxrmCl49KErS4LKUfrQ0YeCSs5ItX8xJXkxs7g3GvyPgQyMcyIlVJ8AL5WsS
QzTxEEfxtMgsF441UWuiemDEbvS8V04Jt0Zs5kBv5cfwva99llYeNZ8MTLdP
NQmm5n1IbxAS0Ka.m+Abgdl8xXZOLNreFStmLtj8avbXhHXr4CiFV.Bw1NBM
YXE3wBISGlbxO5WUh5QUn8qJg2DUoDpqYqgSjELhhhPyQInTDgfN.hdDERpM
Fmfa6vCqJWPPA4tFTzTlAUCGwSCsYwigY5S3LlX8GvPx9sphUBJnZIHXYNFf
Ok8o8Sd58LiXkrnXPEgrfzpHyGihr+67pxQLOoelGcJy6rv1B4K0SUizkLkp
hm0nb206sW.7B.8AtcWvVCVI6FIbE7Z0iMBAbN4i3BhHgt5BKFNhxrriW2hu
moKkMEJdcAO+r4LcTL1xsHpoKgLXHx9+tVi4NXRt1jH8hnmgF8tsn8B6i.wQ
ZVz.YYGvJ9iC+3+0ZXwsKdRAkajZPqqKgVLXFYrscQxmonbOketq0jUx0qKf
guroMRpq8Zn1EdwK8Znscm04qh++IlVlYr+dsnV1TspC5c05QGnWNTq3BlhK
EG6Tz6b5IddNHNlF47ZCyNbK2ImJWDdHiAOjoAOgiQenSl9jNF3DNcGWjQfm
3ICNIi.MoSFZFSnSxjgl3uTnI5KUbyXtD7ZSpbWQy1rYKTU2tjVfnKL8rrxL
LYlcHW3FZeEPPErk24uyBqRWrRoqT0T4pDrK18NhfRo98QhFtsfguYmey+e.
HdbtSB
-----------end_max5_patcher-----------
```
SQL | ORDER BY に数字を書くと...

「x番目のカラム」で並び替えがおこなわれる。

# 例

1番目のカラムで並び替える場合。

```sql
mysql> SELECT * FROM examples ORDER BY 1 ASC;

+------+-------+
| id   | name  |
+------+-------+
|    1 | Carol |
|    2 | Bob   |
|    3 | Alice |
```

2番目のカラムで並び替える場合。

```sql
mysql> SELECT * FROM examples ORDER BY 2 ASC;

+------+-------+
| id   | name  |
+------+-------+
|    3 | Alice |
|    2 | Bob   |
|    1 | Carol |
+------+-------+
```


# 環境

```
Your MySQL connection id is 8
Server version: 5.7.12 Homebrew
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
pythonで読書メーターからデータを取得する

python3で読書メーターからデータを取得する方法について書いておきます．
いろんな方法があると思いますが，個人的な趣味でpython3とscrapyを使います．

python3でもscrapyを使うために，pipでpython3に対応したバージョンをインストールします．

```shell-session:
pip install scrapy==1.1.0rc1
```

自分が必要だったのは，読み終わった日付と本のタイトル，ページ数だったので，
それを表示するようにしました．

```shell-session
scrapy runspider bookmeter.py > a.csv
```

ソースコードを以下に貼っておきます．
参考になれば．

```py3:bookmeter.py
import scrapy
import datetime
from scrapy.http import Request

class LoginSpider(scrapy.Spider):
    name = 'bookmeter'
    start_urls = ['http://bookmeter.com/login']

    def __init__(self):
        self.list_num = 1
        self.booklist_url = 'http://bookmeter.com/home?main=book&display=list&p='
        self.data = []

        self.mail = 'ここにメールアドレス'
        self.password = 'ここにパスワード'

    def getURL(self):
        return self.booklist_url + str(self.list_num)

    def parse(self, response):
        return scrapy.FormRequest.from_response(
            response,
            formnumber=1,
            formdata={'mail': self.mail, 'password': self.password},
            callback=self.after_login
        )

    def after_login(self, response):
        return Request(url=self.getURL(), callback=self.parse_list)

    def parse_list(self, response):
        maxnum = int(response.xpath("//input[@id='pages']/@value").extract()[0])

        for i in response.xpath("//div[@class='book_list_simple_box']"):
            elems = i.xpath("div/div")
            jd = elems[0].xpath("text()").extract()[0].strip()
            if jd == "読了日":
                continue
            d = datetime.datetime.strptime(elems[0].xpath("text()").extract()[0].strip(), '%Y年%m月%d日')
            t = elems[1].xpath('a/text()').extract()[0]
            p = elems[3].xpath('span/text()').extract()[0]
            self.data.append((d, t, p))

        if self.list_num == maxnum:
            for d, t, p in self.data:
                print("%s, %s, %s" % (d.strftime("%Y-%m-%d"), t, p))
        else:
            self.list_num += 1
            return Request(url=self.getURL(), callback=self.parse_list)
```
Github上のリリースを見逃さない

## GithubのリリースをRSSで受け取る
リリースページのURL末尾に、 `.atom` をつける。
例)
`https://github.com/docker/docker/releases.atom`

これでリリース(=タグ付け)をRSS化できる。

## Slackへ通知

SlackのIntegration設定のRSSに上記URLを登録すれば、リリースを見逃さない！
VMware on SoftLayerを時間課金ベアメタルで試してみた（目次）

※2019年11月現在、IBM CloudにおけるVMwareは月額課金となっており、時間課金のVMwareは選択できませんが、参考に記事は残しています。ESXiの自動インストールはされませんが、時間課金ベアメタルを「OSなし」でオーダーし、VMwareのイメージを自分で持ち込む事で、類似の構成を作る事は可能です。

「VMware on SoftLayerを時間課金ベアメタルで試してみた」のシリーズは、書きたいと考えていた内容はいったん書いたので、目次的なページを作っておきます。

[SoftLayerの時間課金ベアメタルサーバーでVMwareを試す](http://qiita.com/y_tama/items/c29ae9c05907356f5deb)

[SoftLayerでvSphere5.5とvCenter5.5をオーダーしたときのバージョン](http://qiita.com/y_tama/items/ce8dcf70f6b18544c2b3)

[VMware on SoftLayerのゲストOSにパブリックIPを付与](http://qiita.com/y_tama/items/bd7553e21f57e19b9ccc)

[SoftLayerの時間課金ベアメタルサーバー2台でvMotionやvSphere HAを試す](http://qiita.com/y_tama/items/02d6b9f57d24b0161fe7)

[SoftLayerのベアメタルとプライベートNWを使って東京からサンパウロまで18,000kmのvSphere Replicationを試す](http://qiita.com/y_tama/items/8afe1864e89002a27432)

[SoftLayerの時間課金ベアメタルサーバーでvSphere Data Protection(VDP)を試す](http://qiita.com/y_tama/items/69ae9be34981f2aa1b1f)


そうこうしているうちに、NSXやSRMもSoftLayer上でオーダーできるようになりました。月額ベアメタル + vSphere6 + NSX 等も、時期や形態は分かりませんが、アウトプットしていければ、と思います。

[SoftLayerで月額課金のVMware NSXやSRMをオーダーする方法](http://qiita.com/y_tama/items/24f9877e23bbdab31600)
Babel った方が速い

作ったライブラリのベンチマークを見ている時に気がついたのだけど、ES2015 の機能を Node.js ネイティブに実行するよりも Babel で ES5 のコードに変換した方が速くなる。

## 検証

検証に使用したのはライブラリ

- [web-audio-engine - Pure JS implementation of the Web Audio API](https://github.com/mohayonao/web-audio-engine)

ライブラリのコードは ES2015 で書いてあるけど、Node v4 で使えない構文は使っていないので Babel を使わなくても実行できる。

### .babelrc

`--presets babel-preset-es2015` をつけたのと外したので確認する。

```:.babelrc
{
  "env": {
    "production": {
      "only": [ "src" ],
      "presets": [
        "babel-preset-es2015"
      ]
    }
}
```

[実際の .babelrc](https://github.com/mohayonao/web-audio-engine/blob/master/.babelrc)

### npm run build

ビルドのタスクはこう、ベンチマークは lib に出力したものを使用する。

```
BABEL_ENV=production babel --out-dir=lib src
```

[実際の package.json](https://github.com/mohayonao/web-audio-engine/blob/master/package.json)

### benchmark
ベンチマークは benchmark.js を使って計測している。

- `OfflineAudioContext` で 1秒分 の音をレンダリング
- そのうち 0.5秒 はサイン波を出力する
- 残り 0.5秒 は「何も出力しない」をする 

```js:bench.js
const context = new wae.OfflineAudioContext(2, 44100, 44100);
const osc = context.createOscillator();

osc.start(0.25);
osc.stop(0.75);
osc.connect(context.destination);

context.startRendering().then(done);
```
[実際のコード](https://github.com/mohayonao/web-audio-engine/blob/master/benchmark/suites/OfflineAudioContext-sine.js)

## 結果

Node v6.0 で計測

"babel-preset-es2015" なし (ES2015のコードを使う)

```
OfflineAudioContext-sine.js
lib x 373 ops/sec ±1.46% (80 runs sampled)
```

"babel-preset-es2015" あり (ES5に変換したコードを使う)

```
OfflineAudioContext-sine.js
lib x 595 ops/sec ±1.67% (81 runs sampled)
```

変換した方が 1.5倍 くらい速かった。

## まとめ

ES2015 のコードでパフォーマンスが必要な時は Babel で変換した方が良い。
一例での確認なので何が原因なのかがよく分からないけど、面倒なので適当に推測すると V8 の最適化が ES5 の方にかなり効くのかなと思う。（誰かもっと検証してください）
DynamoDBで有効期限切れのレコードを削除する

AWSの[DynamoDB](http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.DynamoDb.DynamoDbClient.html)で、「有効期限切れのレコードを削除する」というよくある機能を実装するのにとてつもなく苦労したので記す。

## 結論

```php
Aws\DynamoDb\DynamoDbClient->createTable([
	'TableName' => 'テーブル名',
	'AttributeDefinitions' => [
		['AttributeName' => 'id', 'AttributeType' => 'N',], // 主キー
		['AttributeName' => 'dummy', 'AttributeType' => 'N',], // グローバルセカンダリインデックスのパーティションキー
		['AttributeName' => 'expired', 'AttributeType' => 'N',], //  グローバルセカンダリインデックスのソートキー
	],
	'KeySchema' => [
		['AttributeName' => 'id','KeyType' => 'HASH',],
	],
	'GlobalSecondaryIndexes' => [[
		'IndexName' => 'expired_index',
		'KeySchema' => [
			['AttributeName' => 'dummy', 'KeyType' => 'HASH', ],
			['AttributeName' => 'expired', 'KeyType' => 'RANGE', ],
		]],
	],
]);
```

インサート時にはexpiredにタイムスタンプを、dummyには『1』を固定で入れる。


## 解説

まずDynamoDBには、『主キーで削除する』『全削除する』以外の[削除](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)機能がない。

よって、"DELETE table WHERE expired < NOW()"はいきなり諦めざるを得ない。

次善の策として、"SELECT table WHERE expired < NOW()"で[query](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)した結果をforeachで回してそれぞれ削除する、といった回りくどい方法を取る必要がある。
[scan](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)してPHP側で判定、という方法は論外なのでパス。


```php
// SELECT table WHERE expired < NOW()
$list = Aws\DynamoDb\DynamoDbClient->query([
	'TableName' => 'テーブル名',
	'IndexName'=>'expired_index',
	'KeyConditionExpression' => '#key1 = :val1 AND #key2 < :val2',
	'ExpressionAttributeNames' => ['#key1'=>'dummy', '#key2'=>'expired'],
	'ExpressionAttributeValues' => [
		':val1' => [ 'N' => 1 ],
		':val2' => [ 'N' => time() ],
	],
]);

// DELETE table WHERE id = :id
foreach($list as $v){
	Aws\DynamoDb\DynamoDbClient->DeleteItem([
		'TableName' => 'テーブル名',
		'Key' => [
			'id' => [ 'N'=>$v['id']['N'] ],
		],
	]);
}
```

"expired < NOW()"で検索するためにグローバルセカンダリインデックスを作る必要があるわけだが、[グローバルセカンダリインデックス](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html#DDB-CreateTable-request-GlobalSecondaryIndexes
)にはHASHタイプのキー(パーティションキー)が必須。
HASHタイプのキーは=でしか検索できず、不等号での検索ができない。

HASHのキーに付随してRANGEタイプのキー(ソートキー)を作成することが可能。
RANGEキーは不等号で検索することが可能だが、RANGEだけのキーを作成することはできない。
さらに検索時もHASH+RANGEでの絞り込みが必須で、RANGEだけで検索することはできない。

そのため、今回はdummyという完全に無意味なHASHキーを作成し、全て同じ値を入れることで、実質的にRANGEだけでの検索を可能にしている。


## 感想

そもそもDynamoDBをそういう用途に使いるべきではない。
iOS9での広告ブロック内容を反映する方法

iOS9から使えるようになった広告ブロック機能。
https://developer.apple.com/videos/play/wwdc2015/511/

どういう風にしたいかはjsonで設定するのですが、たとえば、アプリ内で設定を作成した場合や、クラウドからダウンロードした時などに反映したい場合があると思います。

その時は以下のコードを呼べばOK。

    [SFContentBlockerManager reloadContentBlockerWithIdentifier:@"MYAPPIDENTIFER"
                                              completionHandler:^(NSError * _Nullable error) {
                                                  NSLog(@"Error: %@", error.localizedDescription);
                                              }];

最初2chの広告をブロックするものを作っていたのですが、ちょっと難解過ぎまして、急遽方針変更。アプリが出ているとはいえまだまだブラウザでのアクセスがそうとうあると思われるYahoo! JAPAN。ターゲットを変えてみました。

そんなこんなでYahoo! JAPANの広告をブロックするアプリをリリースしてみました。
ぜひ使ってみてください。

Y!ADBlock
https://itunes.apple.com/jp/app/y!adblock/id1109879180?mt=8
HerokuのSet Up 1


###Create environment by vagrant

```bash
mkdir learning_rails
```

```bash
cd learning_rails
```

```bash
vagrant box add "centos_6.6" https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
```

```:bash
vagrant init
```

```bash
vi Vagrantfile 
```

```Vagrantfile 
Vagrant.configure(2) do |config|
  config.vm.define "host" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.200"
  end
  config.ssh.insert_key = false
end
```

```bash
vagrant up
```

```bash
vagrant ssh
```

###Change character set

```:bash
sudo vi /etc/sysconfig/i18n
```

```:text:/etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
```

###Install Ruby and Rails

```bash
su -
```

```bash
cd /usr/local/src/
```

```bash
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz
```

```bash
tar xvzf ruby-2.3.0.tar.gz
```

```bash
cd ruby-2.3.0
```

```bash
./configure
```

```bash
make
```

```bash
make install
```

```bash
gem install rails -v 4.1.15 --no-rdoc --no-ri
```

###Install PostgreSQL

```bash
sudo rpm -i http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-3.noarch.rpm
```

```bash
sudo yum -y install postgresql93-server postgresql93-contrib postgresql-devel.x86_64
```

```:bash
sudo service postgresql-9.3 initdb
```


```:bash
sudo chkconfig postgresql-9.3 on
```


```:bash
sudo service postgresql-9.3 status
```


```:bash
sudo service postgresql-9.3 start
```


```:bash
sudo passwd postgres
```

```:bash
su - postgres
```

```:bash
psql
```

```:psql
create user vagrant createdb password 'testpassword' login;
```

exit

```:psql
\q
```

###Set Up Rails app

It is root user now.

```:bash
mkdir -p /srv/www
```

```:bash
cd /srv
```

```:bash
chown vagrant:vagrant www
```

become vagrant user

```:bash
exit
```

```:bash
cd /srv/www
```

```:bash
rails new herokutest -d postgresql
```

```:bash
cd herokutest/
```

```:bash
vi Gemfile
```

comment in

```ruby:Gemfile
gem 'therubyracer',  platforms: :ruby
```

```:bash
bundle install
```

```:bash
vi config/database.yml 
```

set these values.

```ruby:database.yml
username: vagrant
password: testpassword
```

```:bash
rake db:create
```

You can check tables

```:bash
psql -l
```

###Test to create user

```:bash
rails g scaffold User name age:integer
```

```:bash
sudo su - postgres
```

```:bash
createuser -P vagrant
```


```:bash
psql
```


```:bash
\du
```

```:bash
rake db:create
```

```:bash
rake db:migrate
```

You can run rails

```:bash
rails s
```

You can see it from this IP

######http://192.168.43.200:3000/users
ブラウザ自動更新でウェブページ開発効率改善

## 1. 課題

ウェブ開発をする際、HTML, CSS, JavaScript に小さな変更を加えるたびにブラウザを更新するのは面倒。

## 2. 解決策

ブラウザの自動更新の機能拡張を使う。ここでは Chrome と FireFox の場合について述べる。

### 2.1 Chrome の場合

__機能拡張 Easy Auto Refresh__ を使う。
__(2016/05/04追記)__ Easy Auto Refresh だと、自動更新時にページ最上部へ移動してしまうことを確認。__FireFox の TabMixPlus__ ではこの問題は起こらなかった。

1. 機能拡張 Easy Auto Refresh をインストール。無料版で問題ない。自動で有効化されていなければ有効化する。
2. ブラウザ右上にアイコンが出る（画像参照）ので、自動更新したいタブを開いた状態でアイコンをクリックし、更新頻度（秒）を指定して「__Start__」。
3. 自動更新をとめたいときは「__Stop__」

![スクリーンショット 2016-05-03 10.19.58.png](https://qiita-image-store.s3.amazonaws.com/0/109163/22a666e2-0d49-182a-a4e4-ef31bca8f1ce.png)

プレビューしたい HTML ファイルを Chrome で開き、自動更新を設定してやることで、__エディタで編集した内容が定期的に自動更新される__。


![スクリーンショット 2016-05-03 10.43.40.png](https://qiita-image-store.s3.amazonaws.com/0/109163/68f67c68-28f6-dab1-4d47-2c47a740ef81.png)

### 2.2 FireFox の場合

__アドオン TubMixPlus__ を使う。
1. TubMixPlus をインストールし、FireFox を再起動する。
2. TubMixPlus の設定で、「メニュー」→「タブのコンテキストメニュー」で「タブを再読み込みする間隔」にチェックを入れる。
3. 自動更新したいタブを右クリックすると「タブを再読み込みする間隔」が選べるので、そこから更新間隔を設定・更新を開始する。

## 3. 他のブラウザを使いたい場合

Safari にも自動更新のアドオンがあるらしい。__未調査__。

### Safari

Safari Tab Reloader という機能拡張があるらしい。Mac 版のみ？
VagrantとAnsibleでnginx php-fpm phpenv Laravelの環境を整える

※2016/5/12時点での課題
- sessionの保存先のユーザーを変えようとタスクを書いてるが反映されないorz
- Laravelのbootstrap/casheのパーミッションを変更する　　
　http://momoiro-tj.hateblo.jp/entry/2016/01/12/221657


## Github
https://github.com/MiyaseTakurou/vagrant_ansible_laravel

Ansibleの勉強で作成した環境です。
RubyでYamlを読み取って変数を共通化しているのでコンフィグファイルを１つで管理できます。
起動後はVagrantのSyncFolderを適応させるのに`vagrant reload`してください。
phpenvを利用しているのでお好きなPHPで環境を作れます。
まだまだ微調整が必要かと思いますので、プルリクなどいただけると助かります。

# vagrant_ansible_laravelについて

Laravel5を開発するのにAnsibleを利用して環境を作る為に作りました。  
なにか不具合等あればご連絡ください。  
  
PHPをビルドするので初回の立ち上げは時間がかかります。   
利用される時はLaravel推奨のVersionを利用して下さい。

## 初期設定時のURL
Laravel : [laravel.dev](https://laravel.dev/)  
phpPgAdmin : [laravel.dev:8080](laravel.dev:8080)  
- USER:vagrant
- PASS:vagrant

## 環境
- phpenv
- PHP 5.6.20
- PostgreSQL 9.5
- phpPgAdmin
- laravel5
- git
- vim
- ImageMagick
- zsh
- zsh-oh-my-zsh

## 設定

ansible/group_vars/vagrant.ymlで各種設定ができます。
ここで設定された値を元にVagrantの設定とAnsibleでのプロビジョニングを行っています。

## 起動前にVagrantのプラグインをインストール

ホストを設定するためにVagrantのプラグインhostsupdaterを利用しています。  
下記コマンドでインストールしておいてください。  

`vagrant plugin install vagrant-hostsupdater`

## vagrantについて

### 起動

`vagrant up`

### 停止

`vagrant halt`

### 再起動

`vagrant reload`
cloud9 drupal環境を作る

意外に簡単
#drupal8の参照
https://community.c9.io/t/setting-up-drupal/1705

#phpmyadminの参照
https://community.c9.io/t/setting-up-phpmyadmin/1723

cd $HOME
curl -O http://ftp.drupal.org/files/projects/drupal-7.39.tar.gz
tar xvf drupal-7.39.tar.gz
mv drupal-7.39/* workspace/
mv drupal-7.39/.htaccess workspace/
cd $HOME/workspace
mysql-ctl install
phpmyadmin-ctl install
mysql-ctl start
mysql-ctl status

#phpmyadmin
https://<workspace-name>-<your-name>.c9users.io/phpmyadmin/
user:c9
pass:なし

#db設定（デフォルト）
db_name c9
db_user root
db_pass なし
React と jQuery は共存可能なのか？

jQueryをベースに書かれたフロントエンドをReactで書き直すことを検討中です。
検討の一環として、ReactとjQueryは共存可能か調べたのでメモを残しておきます。


## はじめに

Reactはチュートリアルを終えた段階で、まだ理解が浅いです。
その前提で以下お読みいただければ。


## そもそも共存が必要なのか？

ReactはVirtualDOMという仕組みを通してDOM操作をするので、jQueryとの相性が悪そうだなというのはなんとなくわかります。

discuss.reactjs.org の[jQuery with React](https://discuss.reactjs.org/t/jquery-with-react/683/2)においても

> I don't mean to be rude but yes, don't use jQuery. In most cases you won't need anything from jQuery when properly using React.

という回答が寄せられています。

「必要でないなら使わない」というのは原則論としては賛成です。
が、現実としてjQuery plugin に頼りたくなるシチュエーションもあると思われます。

>  inherited a large application written in jQuery and from that standpoint it's quite logical to have both coexist for a while. Also, there may be libraries that do complex things which you don't want to rewrite in React yourself.

https://discuss.reactjs.org/t/jquery-with-react/683/4

同様な意見もまた、同じトピックに寄せられています。


## Reactの見解

[Use React with Other Libraries](https://facebook.github.io/react/tips/use-react-with-other-libraries.html) に見解が書かれています。


> You don't have to go full React. The component lifecycle events, especially componentDidMount and componentDidUpdate, are good places to put your other libraries' logic.

```js
var App = React.createClass({
  ...

  componentDidMount: function() {
    $(this.refs.placeholder).append($('<span />'));
  },

  componentWillUnmount: function() {
    // Clean up work here.
  },

  ...
});

ReactDOM.render(<App />, mountNode);
```

必ずしも、全てをReactで書く必要はなく、上の例では jQuery で append しています。

[サンプル](https://github.com/facebook/react/blob/master/examples/jquery-bootstrap/js/app.js)も同様にjQueryを用いています。


## VirtualDOM と Diff Algorithm

2013年と少し古いですが、Reactのdiff algorithm についてFacebook front-endチームの方が書いた記事がありました。
[React’s diff algorithm](http://calendar.perfplanet.com/2013/diff/)


この仕組みを見る限り、Reactの管理下にあるDOMを破壊あるいは丸っと差し替えることはよろしくなさそうですが、例えば末端ノードに子要素を追加するのは安全そうに思えます。


## まとめ

事前サーベイに基づく限りは、必要最低限の箇所に絞って容量用法を正しく守って使えばReactとjQueryは共存可能だと言えそうです。
[wip] Madefor Layers and ba

# 概要
layers*.txt から組み立てられるウェブサイトとして、GSI Maps のような Maps プロダクトとは対をなす、Layers プロダクトをつくる。

Maps プロダクトは、最初に位置を選んで、そこにあるレイヤ＝地図を提示するものであるが、Layers プロダクトは、最初にレイヤを選んで、それが含む位置＝地図を提示するものである。

レイヤとマップというコンポーネントが中途半端に妥協しているのが旧来の GIS であり、マップという概念に振り切ったのが gsimaps であるとすれば、レイヤという概念に振り切るプロダクトも作って対にするのがよい。それによって、旧来の GIS が導く思考停止に刺激を与えるべきである。これに類する作業は、おそらく Cesium 使いによる三次元作品の提示により行われており、あの問題意識の二次元番をやるということかもしれない。

最初の入り口はレイヤツリーで、レイヤを指定するとその直下に地図が開く形を考える。開いた情報の中には、様々な外部リンクや諸元情報があっても許されるであろう。CKAN 的なアプローチのツリー構造版という解釈も可能であろう。

これを実現するためには、レイヤの範囲情報を得る必要がある。地理院タイルの場合、レイヤには mokuroku がある。mokuroku から範囲情報を得ればよい。それを実現するためのミニツールである ba を、最初に造る。

# 蛇足
この行動を通じて、個人的には教条的な GIS の概念の手垢にまみれた「レイヤ」というワードに自分なりの定義を与え、「レイヤ」というワードをいわば「許す」ことになると思う。これまでは、レイヤというワードを回避するために t （theme）という言葉を使用するようなことをしていたが、テーマという言葉はキャッチーではない。レイヤという言葉をハイパーリンク可能なスタイルで再定義することによって、レイヤという言葉を自分のものにしていく。

# ステータス
このエントリは、率直に言えば、自分のアイディアをダンプしておいて自分の頭を整理しクリアにすることを目的としているので、上述のアイディアが実装されるための時間は長い可能性があるし、もしかすると上述のアイディアは実装されないかもしれない。

# 「* Maps」の対をなす、「* Layers」
基本的に上述の通り。ここには、より詳細な概念設計を書き込んでいくかもしれない。

作業場所又は名義については次の通り考える。命名ルールとしては、「GSI Maps の対をなすものとして GSI Layers を作る」というのが基本的アイディアである。いま、Madefor というアクティビティがあり、このアイディアの実装を Madefor の中で行って良いということになれば、Madefor Layers という名義及び作業場所で作業をしようと思う。

多分、覚えたての Riot を使いながら実装すると思う。具体的には、Riot のサンプルにツリービューのサンプルがあれば、それを使うと思う。

（参考）Riot のリストビューサンプルで layers4.txt にビューを与えた初期的な例が https://github.com/madefor/layers-for-disaster-response にある。

# mokuroku から extent 情報を取得するツール「ba」
地理院タイルのレイヤの範囲情報というアイディアは、既に第２回地理院地図パートナーネットワークで取り上げられている。

http://ccpn.gsi.go.jp/meeting_partners/data/20150204/B.pdf (PDF) でいう「範囲のJSON」である。

このアイディアを実現するシンプルで強力なツールを Ruby で実装し、ba という名前で提供する。

基本的な実装の方針は、qdltc https://github.com/gsi-cyberjapan/qdltc と同じ。つまり、ruby を使い、処理結果キャッシュとして SQLite を使う。

## ba の基本アルゴリズム
1. layers*.txt からレイヤ情報を取得する。url がタイル url であるかを、{z}/{x}/{y} の文字列の有無の判定により確認し、id を添えて「レイヤ処理」に入る。
2. （レイヤ処理）mokuroku.csv.gz に head リクエストをかけ、要更新判定を行う。更新が必要であれば、範囲算出を行う。
3. （要更新判定）id をキーにしてキャッシュデータベースに確認を行い、head リクエスト結果にある最終更新日付が、キャッシュデータベースに記録した最終更新日付よりも新しければ、更新が必要であるとする。
4. （範囲算出）当該 mokuroku.csv.gz に GET アクセスをかけてリアルタイムに

## ba のキャッシュデータベースのフォーマット
1. last_modified: キャッシュの根拠となった mokuroku.csv.gz の日付
2. id: レイヤの id
3. xy_extent: 算出した範囲（タイル番号により、lower corner の x, y, upper corner の x, y という順番の４要素配列とする。（SQLite ではどのように格納できるか確認））

## ba が提供する JSON ファイルのフォーマット
書き留めておく。地理空間情報成分を含むペイロードデータは、すべからく GeoJSON の形式を持っておくべき、という考え方に基づき、次のようなデータを提供すべきであろう。

```json
{
  "type":"Feature",
  "geometry": {
    "type":"Polygon",
    "coordinates":[[[140.0,35.333333333333336],[140.0,36.0],[141.0,36.0],[141.0,35.333333333333336],[140.0,35.333333333333336]]]
  },
  "properties": {
    "id":"std",
    "xy_extent":[143341, 453143, 312314, 13132]
  }
}
```
上記の数字は適当である。id は layers*.txt の id と一致させ、xyz はタイル番号によるextentをダンプさせるべき。中央の値を出すべきかは考えどころ。

実際には、おそらくすべてのレイヤのデータを一つの FeatureCollection にして一つの GeoJSON リソースとして提供するのが当面経済的であろう。

## ロガーの使用
```rb
require 'logger'
```

## アクセスを並列化する方法
アクセスは並列化するべきである。その方法は qdltc と同じにする。
@date ||= Date.parse(date_string) if date_string な表現はあかん

日付が取りたいので

```.rb
def initialize(date:)
  @date = date
end

def date
  @date ||= Date.parse(date_string) if date_string
end

def date_string
  # 日付文字列を探してくる
end
```

な書き方したら、`initialize`で`@date`に値が入ってても`date_string`が`nil`だと `Foo.date` で`nil`が返ってきた。

仕方ないので

```.rb
def date
  @date ||= calculate_date
end

def calculate_date
  Date.parse(date_string) if date_string
end
```

でワンクッション置いときました。
wpfでvsのフォルダ選択ダイアログみたいなダイアログを表示したい

<!--open file dialog のことだけど、利用言語はC#だし、サンプルコードはWPFだし、tagは何にすればええんや。-->

## はじめに

wpf の [OpenFileDialog](https://msdn.microsoft.com/ja-jp/library/microsoft.win32.openfiledialog(v=vs.110).aspx) にフォルダ選択モードがない。  
一方、IFileDialog (native) のオプションには、 FOS_PICKFOLDERS というフォルダを選択するモードがある。
ReferenceSourceを覗くと、wpfの実装はIFileDialog(利用できれば)を利用しているけれど、このフラグに該当するプロパティ等が実装していない。
自作しないといけないかと思ったら、Api code pack にはその実装があったのでメモ。
## 利用手順

1. api code pack を利用する。
   nuget から WindowsAPICodePack-Shell を探してインストール。
   複数見つかるけど、自分は [aybeさんバージョン](https://github.com/aybe/Windows-API-Code-Pack-1.1)を利用した。オリジナルコードにも同じプロパティがあるのでどのバージョンでも動作しそう（未確認）
2. [Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog](https://github.com/aybe/Windows-API-Code-Pack-1.1/blob/master/source/WindowsAPICodePack/Shell/CommonFileDialogs/CommonOpenFileDialog.cs#L16) インスタンスをnewする。
3. [CommonOpenFileDialog.IsFolderPicker](https://github.com/aybe/Windows-API-Code-Pack-1.1/blob/master/source/WindowsAPICodePack/Shell/CommonFileDialogs/CommonOpenFileDialog.cs#L101) プロパティをtrueにする。
4. ShowDialog()すると、フォルダ選択モードで動作する。  
   このとき、OKボタンの部分が、“開く”から“フォルダを選択”に変わっている。

## 実験コード

xaml画面

```code:xaml
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="350"
        Width="525">
  <StackPanel>
    <TextBox x:Name="SaveDirBox" />
    <Button Click="SaveButton_OnClick">SaveButton</Button>
  </StackPanel>
</Window>

```

コードビハインド

```code:csharp
using System.Windows;

using Microsoft.WindowsAPICodePack.Dialogs;

namespace WpfApplication1
{
    /// <summary>
    ///     MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void SaveButton_OnClick(object sender, RoutedEventArgs e)
        {
            var dlg = new CommonOpenFileDialog("保存フォルダ選択");
            // フォルダ選択モード。
            dlg.IsFolderPicker = true;
            var ret = dlg.ShowDialog();
            if (ret == CommonFileDialogResult.Ok)
            {
                this.SaveDirBox.Text = dlg.FileName;
            }
        }
    }
}
```

## 参考

[Select folder dialog WPF(stack overflow)](http://stackoverflow.com/questions/4007882/select-folder-dialog-wpf)
[Windows-API-Code-Pack-1.1(github)](https://github.com/aybe/Windows-API-Code-Pack-1.1)
Chromium OS Custom Build の VirtualBox へのインストール方法

今度は [Chromium OS Custom Build](http://chromiumosde.gozaru.jp/index.html) を使用して Chromium OS の仮想化に挑戦。

# 前準備
1. 元のイメージを [公式サイト](https://github.com/crosbuilder/CustomBuilds/releases/latest) から入手する。
2. ダウンロードした圧縮ファイルを解凍する。
3. VBoxManage を使用して VDI へ変換する。

ここまでは前回挫折した [CloudReady の仮想化](http://qiita.com/JhonnyBravo/items/7d3569620f01f24ef71b) と同じ手順。

# 仮想マシンの作成
名前: 任意の名前を設定する。

タイプ: Linux を指定する。

バージョン: **Linux 2.6/3.x (32-bit)** を指定する。
　(前回と同じ Other Linux(32-bit) を指定すると動きません)

メモリーサイズ: 1500 MB に設定。

# 仮想ハードディスクを搭載する
**コントローラー: SATA** に仮想ハードディスクを2機搭載する。
(コントローラー: IDE に仮想ハードディスクを搭載するとブートに失敗します)

1機目: VBoxManage で作成した VDI
　(インストールメディアとして使用する)

2機目: 空の仮想ハードディスクを新規作成する。
　(OS のインストール先として使用する)

# システム設定
設定 > システム > マザーボード > PAE / NX を有効化 にチェックを入れる。

# crosh 起動
1. 仮想マシンを起動してログインする。
2. crosh を起動して以後の操作を行うのだが ...... ここで一旦凍り付く。

**crosh の起動方法が解らない!!**

Qiita で探索してみると [Ctrl+Alt+t で起動できるらしい](http://qiita.com/yasuki/items/fa14c258df0d088c6b98) ので試してみる。
(yasuki さん、ありがとう!!)

# 管理者権限を取得する
1. 起動したシェルに ``shell`` と入力する。
2. ``sudo su`` を入力して管理者権限を取得するのだが ...... 再び凍り付く。

**パスワードが解らない!!**

公式ページを探索すると、 [初期パスワードは password](http://chromiumosde.gozaru.jp/install_special.html?highlight=password) らしい。

# インストール先デバイス名を調べる
``rootdev`` と入力する。
``/dev/sda3`` と返ってくるのだが、最後の数字を除いた ``/dev/sda`` が
1機目の仮想ハードディスク(インストールメディア)のデバイス名。

今回は2機目の仮想ハードディスクに OS をインストールしたいので
デバイス名を知るべく
公式ページのガイダンスに従って ``disklist`` と入力するが ......

```bash:disklist実行結果
bash: disklist: command not found
```

**コマンドが存在しない!?**

ならばコレでどうだろう。

```bash
ls /dev/ | grep sda

sda
sda1
sda10
sda11
sda12
sda2
sda3
sda4
sda5
sda6
sda7
sda8
sda9
```

**どれだよ!?**

ちょっと削ってみる。

```bash
ls /dev/ | grep sd

sda
sda1
sda10
sda11
sda12
sda2
sda3
sda4
sda5
sda6
sda7
sda8
sda9
sdb
```

**sdb か!?**

長くなってしまったが、

* /dev/sda = 1機目の仮想ハードディスク(インストールメディア)
* /dev/sdb = 2機目の仮想ハードディスク(OS インストール先)

であろうと推測する。

# OS インストール
``chromeos-install --dst=インストール先装置名 --skip_src_removable``
と入力すると OS インストールが始まる。
今回の(推定)インストール先は /dev/sdb なので
``chromeos-install --dst=/dev/sdb --skip_src_removable`` で実行してみる。

インストールが完了したら仮想マシンを一度シャットダウンする。

# インストールメディア除去
設定 > ストレージ > 1機目の仮想ハードディスクの割当てを解除 > 仮想マシン起動

これで終了。2機目の仮想ハードディスクから OS が起動する。

(1機目の仮想ハードディスクを割当てたまま起動すると
またインストールメディアの方が起動します)
Common Lisp 学習帳 - シーケンス処理編


# 何の記事？
Common Lispでシーケンス処理をするときのやり方を1ページでコンパクトにまとめたものです。
(という体の備忘録です。)
なるべくすぐに使えるようにするために、【Scheme手習い】みたいに対話形式で書いていきます。
詳細についてはこの記事よりはるかに詳しくまとめてある記事がたくさんあるのでそちらに譲ります。
サンプルコードの出力結果はSteel Bank Common Lisp（以下、SBCL）で実行したものです。

# 対象とする人
- Common Lisp始めてちょっと試してみたいって人
- これどうやってやるんだっけみたいに忘れっぽい人
- 細かいことはいいからサンプル見せてって人

# シーケンス処理編
- **Q** リストを処理して新しいリストを返すには？（シーケンスを`map`するには？）
- **A** `mapcar`を使います。

```cl:mapcar.lisp
(mapcar (lambda (x) (* x 2)) '(1 2 3 4)) ; => (2 4 6 8)
```
***
- **Q** リストから特定の要素のみを抜き出すもしくは排除するには？（シーケンスを`filter`するには？）
- **A** `remove-if`もしくは`remove-if-not`を使います。

```cl:remove-if.lisp
(remove-if (lambda (x) (equal (mod x 2) 0)) '(1 2 3 4)) ; => (1 3)
(remove-if-not (lambda (x) (equal (mod x 2) 0)) '(1 2 3 4)) ; => (2 4)
```
***
- **Q** リストを集計したり畳み込みしたりするには？（シーケンスを`reduce`するには？）
- **A** `reduce`を使います。

```cl:reduce.lisp
(reduce (lambda (m x) (+ x m)) '(1 2 3 4)) ; => 10
(reduce (lambda (m x) (+ x m)) '(1 2 3 4) :initial-value 10) ; => 20
```
***
- **Q** リストから重複を削除するには？
- **A** `remove-duplicates`を使います。

```cl:remove-duplicates.lisp
(remove-duplicates '(1 2 2 3 4 4)) ; => (1 2 3 4)
```
***
- **Q** リストを逆順にするには？
- **A** `reverse`を使います。

```cl:reverse.lisp
(reverse '(1 2 3 4)) ; => (4 3 2 1)
```
***
- **Q** リストのn番目の要素がほしい。
- **Q** `nth`を使います。

```cl:nth.lisp
(nth 2 '(1 2 3 4)) ; => 3
```
***
- **Q** 二つのリストを連結したい。
- **A** `append`を使います。

```cl:append.lisp
(append '(1 2 3) '(4 5)) ; => (1 2 3 4 5)
```
***
- **Q** 最初の要素がほしい。(`first`がほしい)
- **A** `first`を使います。

```cl:first.lisp
(first '(1 2 3)) ; => 1
```
***
- **Q** 最初の要素を除いたリストがほしい。(`rest`がほしい)
- **A** `rest`を使います。

```cl:rest.lisp
(rest '(1 2 3)) ; => (2 3)
```
***
- **Q** リストの最後の要素がほしい。(`last`がほしい)
- **A** `last`を使いますが、リストで帰ってくる点に注意してださい。`car`を取るとよいでしょう。

```cl:last.lisp
(last '(1 2 3)) ; => (3)
(car (last '(1 2 3))) ; => 3
```
***
- **Q** 特定の長さのリストがほしい。
- **A** `make-list`を使います。SBCLでは:initial-elementを指定しない場合nilになります

```cl:make-list.lisp
(make-list 5) ; => (NIL NIL NIL NIL NIL)
(make-list 5 :initial-element 0) ; => (0 0 0 0 0)
```

※順次追加予定
Wordpress用フレームワーク「Herbert」設定ファイル解剖

#はじめに

Wordpress用フレームワーク「Herbert」の設定ファイルを読み解こう
設定ファイルの中心はherbert.config.phpである
前記事→[Wordpress用フレームワーク「Herbert」プラグイン名の設定](http://qiita.com/tonchan1216/items/6b7fc40bb24582bb7138)

#環境
ホストOS:Windows 10
ゲストOS:CentOS 6.7
Vagrant(ローカル開発環境)
vccw(Wordpress導入用)
Wordpress 4.5.1–ja
PHP ~~5.4.45~~←5.4だと動きませんでした．
＝＝＞5.6.21

#**Config**

##バージョン管理(Constraint)
作成したプラグインを動かすのに必要なHerbertの最低バージョン(?)を指定
とは言え今のところ0.9しか出てないので．．．というかこれ更新されるのだろうか

##変数の拡張(Extend)
herbert.config.phpの中で独自の変数を定義でき，かつ他の場所で簡単に取り出せる．

```herbert.config.php
    /**
     * My plugin name
     */

    'pluginName' => 'Social Icons Pro',

    /**
     * My table prefix
     */

    'prefix' => 'sip_',

    /**
     * The Herbert version constraint.
     */
    'constraint' => '~0.9',

    /**
```

取り出すとき

```php
$pluginName = Helper::get('pluginName');
```

###名前空間による分離(Namespacing)
[前記事](http://qiita.com/tonchan1216/items/6b7fc40bb24582bb7138)の修正で，ひたすら名前空間を指定する作業をした．
形式は以下のうように決まっている．typeにはroutesやpanelsが，Namespaceには設定したい名前空間，file.phpは任意のphpファイルを指定する．

```php
'type' => [
    'Namespace' => 'file.php'
],
```

ここを読んで理解したが(お恥ずかしい)，複数の名前空間を用意すれば，機能ごとにファイルを分離する事ができる．

typeによって設定できる項目は以下４つ．細かい内容はまた後日

+ Routes(routes) →ルーティング制御
+ Panels(panels)　→管理画面のサイドバー設定
+ Api(apis)　→API
+ Views(views) →フロント制御

###ファイル読み込み(Flat Files)
独自に作成した外部phpファイルを読み込む．いわゆる`require_once`や`include`と同じ処理をまとめてしまう．

```herbert.config.php
'requires' => [
    __DIR__ . '/app/customPostTypes.php',
    __DIR__ . '/app/hooks/postIsTrashed.php'
],
```

#おさらい
herbert.config.phpに関して各設定について解剖した．
重要なトピックとしては名前空間の扱いを指定する，ということであろう．
何かと処理が複雑になってくると，名前空間を複数用意して切り離す．そんなときに色々書き換える必要がある，といったイメージでしょうか．

とりあえずは前回の修正で問題ないと信じて次に行ってみよう．

今回はここまで
フレームワーク的に大事であろうRoute,Controller,Viewなどに触れていきたい．

次回は**Routes**編
ルーティングの設定をしていこう
vimrcを1から書きなおしていく


　先日新しいPCを手に入れたので環境を整えるべく.vimrcや.zshrcなどのドットファイルをgitで管理しようとしてたのですが、誤ってそいつら消しちゃいました...。しかもアホなことにcommitする前に消しちゃったし、最近バックアップとるのさぼってたので戻し方わかりません。
　まあせっかく出しこの際1から書いていくかーってことでその時の備忘録。便利だなーと思ってるものをpick upして紹介していく

##syntax on

これは必須だろうと思ってる。構文に色を付けてくれる

```
syntax on
```

##tabstop

タブを挿入した際の幅を調整する。僕的にはデフォルトだと空きすぎて気持ち悪いので調整(2だと逆に短すぎるかも)

```
set tabstop=2
```

##incsearch

インクリメンタル検索にする。記述無しの場合、例えば「hoge」と検索をかけるとすると「/hoge」まで打ち込んでからEnter押さないとハイライトされないので分からない。これを入れておけば一字打つごとに検索をかけられるのでかなり見やすい。

```
set incsearch
```

##number

行数を左端に表示する。僕は行数見えたほうがいいかなーと思うので。

```
set number
```


##キーマッピング

デフォルトだとちょくちょく煩わしい操作があるのでキーマッピングで解決。詳細は割愛。

括弧の補完に関しては
・[カッコの補完を手軽にカッコ良く](http://qiita.com/shingargle/items/dd1b5510a0685837504a)
を参考にさせていただきました。

```
"===========================================
"キーマッピング
"===========================================
inoremap <C-c> <Esc>	"Esc押しづらいので入れておく
noremap <S-h> ^     "S-hで左端へ
noremap <S-l> $     "S-lで右端へ
  
"インサートモードでも移動
inoremap <C-j>  <down>
inoremap <C-k>  <up>
inoremap <C-h>  <left>
inoremap <C-l>  <right>
  
"括弧の補完
inoremap { {}<Left>
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap ( ()<ESC>i
inoremap (<Enter> ()<Left><CR><ESC><S-o>
inoremap ' ''<LEFT>
inoremap " ""<LEFT>
  
nnoremap == gg=G    "=を二回連続入力でバッファ全体をインデント整理
```



プラグインは後から入れる感じで、取り敢えずこれを.vimrcに設定しておけばだいぶ快適になるはず。
一応紹介した分だけ下記にまとめて置いておきます。

```.vimrc
syntax on
set tabstop=2
set incsearch
set number

"===========================================
"キーマッピング
"===========================================
inoremap <C-c> <Esc>	"Esc押しづらいので入れておく
noremap <S-h> ^     "S-hで左端へ
noremap <S-l> $     "S-lで右端へ
  
"インサートモードでも移動
inoremap <C-j>  <down>
inoremap <C-k>  <up>
inoremap <C-h>  <left>
inoremap <C-l>  <right>
  
"括弧の補完
inoremap { {}<Left>
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap ( ()<ESC>i
inoremap (<Enter> ()<Left><CR><ESC><S-o>
inoremap ' ''<LEFT>
inoremap " ""<LEFT>
  
nnoremap == gg=G    "=を二回連続入力でバッファ全体をインデント整理
```
pipのインストールにハマって悲しい思いをしているたぶんEl Capitanなあなたへ

[いつの間にかpipのインストールが楽になってた件](http://qiita.com/who_you_me/items/831d62f396e6d66dda66)

```python get-pip.py```
これを入れても

```
Collecting pip
  Using cached pip-8.1.1-py2.py3-none-any.whl
Collecting wheel
  Using cached wheel-0.29.0-py2.py3-none-any.whl
Installing collected packages: pip, wheel
Exception:
Traceback (most recent call last):
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/req/req_set.py", line 732, in install
    **kwargs
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/req/req_install.py", line 835, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/req/req_install.py", line 1030, in move_wheel_files
    isolated=self.isolated,
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/wheel.py", line 344, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/wheel.py", line 315, in clobber
    ensure_dir(destdir)
  File "/var/folders/1s/zx_tbsz12q11ff8h79g8yqy40000gn/T/tmpXAEHyo/pip.zip/pip/utils/__init__.py", line 83, in ensure_dir
    os.makedirs(path)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip'
```

こういうの出がちですよね。


そこでこういうの入れても

```curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python```


↓

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100   260  100   260    0     0     95      0  0:00:02  0:00:02 --:--:--     0
You're using an outdated location for the get-pip.py script, please use the one available from https://bootstrap.pypa.io/get-pip.py
```

時代遅れだよ、などと言われてしまいます。

↓たぶんこの1行で解決です。
```curl -kL https://bootstrap.pypa.io/get-pip.py  | sudo python
```

get-pip.pyの場所が変わってるみたいですね。
なんか「このディレクトリはあんたの権限じゃないよ」とか言われてもsudoすれば通ります。


（追記）
※どうもEl Capitanになってpipのインストールがハマりやすくなっているっぽいです。sudoしても通らないことがしばしばある様子。
↓
http://stackoverflow.com/questions/32898583/unable-to-install-nltk-on-mac-os-el-capitan

あとそもそもPythonは3.5とかも出てるけど2.7のほうが無難っぽい。


pipは普通に入れると管理者権限から外れてしまって結構厄介なようなので、管理者権限の中に入るようにダウンロード場所を工夫するのが吉のよう。
http://hacknote.jp/archives/19074/
javascript関連のツール

## JavaScript関連のツールについてまとめてみる。

ツールのタイプごとにまとめる。細かい説明は省略。

## フレームワーク
* angularjs
* reactjs

## altJS
* TypeScript
* CoffeeScript

## CSSプリプロセッサ
* Sass
* Less

## パッケージ管理
* npm
* bower

## ES6対応
* Babel

## テストフレームワーク
* mocha
* jasmine

## テストアサーション
* chai
* power-assert

## テストランナー
* karma

## ビルド
* gulp
* grunt
Goのnet/httpで、認証Proxyを超えてみる


一発で超えれるような便利関数は見当たらなかったので調べながら試したので備忘録。

```go
package main

import (
	"net/http"
	"net/url"
	"encoding/base64"
)

var (
    user string
    password string
    proxyUrl string    
)

// IDとPW
auth := user + ":" + password

// base64に変換
basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))

// Transportを用意
tr := http.Transport{}
parseProxyUrl, _ := url.Parse(proxyUrl)
tr.Proxy = http.ProxyURL(parseProxyUrl)

// httpClientを作成
client := &http.Client{Transport:&tr}

// リクエストを作成
req,_ := http.NewRequest("GET", url, nil)

// ヘッダーにProxy-Authorizationを追加
req.Header.Add("Proxy-Authorization", basic)

// アクセス
resp,err := client.Do(req)
```

色々省略しているがこんな感じで。
でも、これだとHTTPSのURLにアクセスするとStatusCodeが000になる。
CakePHP UnitTest中「ob_end_clean():failed to delete buffer」エラー対応

#UnitTest中成功したのにも関わらず以下のエラーが出てきて失敗

一部のコードです。最後まで問題なく成功したのにも関わらず以下のエラーが出て失敗しました。
「PHPUnit_Framework_Error_Notice : ob_end_clean(): failed to delete buffer. No buffer to delete」



以下のdownloadをテストしたいと思いました。

```lang:controller
 public function download() {

        $this->autoRender = false;

        $id = $this->request->params['pass']['0'];

        $info = $this->XXXX->find('first', ['conditions' => ['id' => $id, 'is_deleted' => 0]]);

        $this->response->header(['Content-type: application/pdf', 'file: ファイル名']);
        $this->response->file(ファイルパス);

    }
```

```lang:unittest
 $this->controller->XXXX= $this->getMockForModel('XXXX', ['find']);
 $this->controller->XXXX->expects($this->once())->method('find')->will($this->returnValue($info));

 $this->testAction('/XXXX/download/123', ['method' => 'get']);
 
　$file =$this->headers['file'];
 $contentType =$this->headers['Content-type'];
 $fileLength =$this->headers['Content-Length'];

 $this->assertEqual($file, ファイル名);
 $this->assertEqual($contentType, 'application/pdf');
 $this->assertEqual($fileLength, 60079);
```
同じエラーが発生する場合以下のようにコードを追加すれば解決できます。

```lang:unittest
 $this->controller->XXXX= $this->getMockForModel('XXXX', ['download','find']);
 $this->controller->XXXX->expects($this->once())->method('find')->will($this->returnValue($info));
 $this->testAction('/XXXX/download/123', ['method' => 'get']);
 
 $file =$this->headers['file'];
 $contentType =$this->headers['Content-type'];
 $fileLength =$this->headers['Content-Length'];

 $this->assertEqual($file, ファイル名);
 $this->assertEqual($contentType, 'application/pdf');
 $this->assertEqual($fileLength, 60079);

 //以下のコードを追加すればエラーなく成功になります。
 if (ob_get_length() == 0 ) {
    ob_start();
 }
```

unitコードが問題なのかPHPUnitのバグかは調べる予定です。一応対策だけ。。。

詳細なApi説明は以下を参考にしてください。
http://php.net/manual/ja/function.ob-end-clean.php
http://php.net/manual/ja/function.ob-get-length.php
http://php.net/manual/ja/function.ob-start.php


以下の内容を参考しました。
https://github.com/sebastianbergmann/phpunit/issues/390
Let's Encrypt で SSL 化対応 (Ubuntu 14.04 LTS x Nginx)

既にいろいろな方が記事を上げてくださっていますが、自分用メモに。
以下を参考にしました。

* http://qiita.com/sak_2/items/ff835b669c0a7e110b09
* http://qiita.com/hidekuro/items/482520f220a305dc147b

# 環境

* Ubuntu 14.04 LTS
* Nginx 1.4.6
* Git 1.9.1

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"

$ nginx -V
nginx version: nginx/1.4.6 (Ubuntu)
built by gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

$ git --version
git version 1.9.1
```

# 手順

ほぼ参考リンクそのままの箇所も少なくないですが、一貫した手順となるよう残しておきます。

## letsencrypt の取得

letsencrypt リポジトリから、一式取得したうえで、中に含まれる `letsencrypt-auto` を実行します。

```
$ git clone https://github.com/letsencrypt/letsencrypt.git
$ cd letsencrypt/
$ ./letsencrypt-auto --help
```

## 証明書の取得に必要な情報を収集

以下が必要になります。

* SSL 化するサイトの FQDN (インターネット上で名前解決可能な、A レコード登録済みのもの)
* Nginx で公開されているコンテンツディレクトリ

今回は、FQDN を仮に `www.encrypt.local` としておきます。

コンテンツディレクトリについては調べます。
Ubuntu では、Nginx 側の設定を大きく変更していない場合は、以下例のとおり `/usr/share/nginx/html` がコンテンツディレクトリとなっていることが多いかと思います。

```
$ cat /etc/nginx/sites-available/default | grep 'root' | grep -v '#'
	root /usr/share/nginx/html;
```

## 証明書の取得

ここまでに集めた情報を使用して、さっそく証明書を取得してみます。

```
$ ./letsencrypt-auto certonly --webroot -w /usr/share/nginx/html -d www.encrypt.local
```

コマンドが流れるとメールアドレスを要求されるため、入力します。ドメイン取得時に使用したメールアドレスを設定しておくのが良いかと思います。
利用規約の同意を求められるため、`<Agree >` を選択します。

証明書が無事に取得できると、以下のようなメッセージが表示されます。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.encrypt.local/fullchain.pem. Your cert will
   expire on 2016-07-31. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

メッセージのとおり、証明書は `/etc/letsencrypt/live/www.encrypt.local/fullchain.pem` に出力されているため、確認しておきます。

```
$ sudo ls /etc/letsencrypt/live/www.encrypt.local/
cert.pem  chain.pem  fullchain.pem  privkey.pem
```

これらのうち、`fullchain.pem` と、`privkey.pem` を使用します。

## Nginx へ設定

ここまできたら、通常と至って変わらない、Nginx への SSL 設定を行うのみです。

```conf:/etc/nginx/sites-enabled/default
server {
	listen 443;
	server_name www.encrypt.local;

	root html;
	index index.html index.htm;

	ssl on;
	ssl_certificate /etc/letsencrypt/live/www.encrypt.local/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/www.encrypt.local/privkey.pem;
```

## 証明書の自動更新を設定

Let's Encrypt の証明書は、3ヵ月で期限が切れてしまいます。
そのため、証明書を自動で更新できるよう、cron を設定しておきます。

また、この折 Nginx のリロードを行なうため、root ユーザーで cron を設定します。

```
$ which service
/usr/sbin/service

$ sudo su
# crontab -e
```

```cron:crontab
0 4 1 * * /home/{username}/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /usr/share/nginx/html -d www.encrypt.local --renew-by-default && /usr/sbin/service nginx reload
```

すこし手順はありますが、非常に簡単に、SSL 化ができました。
下手にオレオレ証明書を用意するよりも簡単な気がします。

設定を終え、このページを書き終えた後に、
以下のページも参考になるなあと、遅れて見つけた次第。

* http://qiita.com/ww24/items/9fa19594b4e3a8eb9b6f

すでに、いろいろな方が実践的に使い始めているようですね！
TaskBoardをNginxで使った時にメールが送信できない時の対処方法

# はじめに
[TaskBoard](https://github.com/kiswa/TaskBoard)は、実にシンプルで便利。(と言いましても使い始めたばかり)
Redmineを使っていたのですが、どうも、自分の開発手法と合わないと思っていた矢先に発見。
しかもslimを使用しているおかげで動作が早い気がする。
しかしながら、Nginxを使っていた私として困ったことが…

# 問題
**メーラーの動作待ちなのか次の画面に移動せずF5かESCでしか戻れない**
**メールの設定をしたのにめーるが届かない**

## エラー探し
Nginxのエラーログを見てみると…以下の様なエラーが。

```shell-session:/var/log/nginx/error.log
2016/05/02 14:45:41 [error] 14983#0: *1983 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Call to undefined function apache_request_headers() in /usr/share/nginx/TaskBoard/api/mailFactory.php on line 5" while reading response header from upstream, client: 61.115.***.***, server: task.*********.com, request: "POST /api/boards/3/items HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "task.*********.com", referrer: "https://task.*********.com/"
```

いろいろと探しまわった結果 [**APACHE_REQUEST_HEADERS**](http://smcx.jp/tags/apache_request_headers) がどうやら張本人のようです。

## 修正
```php:TaskBoard/api/mailFactory.php
function getServerHost() {
    //$headers = apache_request_headers(); //←コメントアウト
    $headers = getallheaders(); //←追加
    foreach($headers as $header => $value) {
        if (strtolower($header) == 'host') {
            return $value;
        }
    }
}
```

# 結果
文字化けしながらも届いた。

```html:メール
ozy-san created new item at board ******:
ãƒšãƒ¼ã‚¸ãƒ‡ã‚¶ã‚¤ãƒ³
ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹

Unassigned
0

2
Navigate to board!
```

### 文字化けを直す
どうやら、PHPMailerでの文字コード設定が必要なようです。
以下のように修正

```php:TaskBoard/api/mailFactory.php
function createMailObject() {
    global $MAIL_HOST, $MAIL_USERNAME, $MAIL_PASSWORD, $MAIL_SMTPSECURE, $MAIL_PORT, $MAIL_FROM, $MAIL_FROMNAME;

    $mail = new PHPMailer;

    $mail->isSMTP();
    $mail->Host = $MAIL_HOST;
    $mail->SMTPAuth = true;
    $mail->Username = $MAIL_USERNAME;
    $mail->Password = $MAIL_PASSWORD;
    $mail->SMTPSecure = $MAIL_SMTPSECURE;
    $mail->Port = $MAIL_PORT;

    $mail->From = $MAIL_FROM;
    $mail->FromName = $MAIL_FROMNAME;
    $mail->CharSet = "UTF-8"; // 追加
    return $mail;
}
```

# 最後に
ソースコードもシンプルでエラーが追いやすい。
機能もシンプル使いやすい。
あとは、このBootstrapのテーマが入れ替えられれるようになっていれば最高なんだけれども、ここは我慢でしょうか。