OmniAICreator/Qiita-1.07M huggingface dataset:
sqliteのupdateはlimit出来ない

[元ブログ、sqliteのupdateはlimit出来ない - 技術は熱いうちに打て！](http://blog.dalt.me/1036)

```:開発環境
SQLite 3.8.8.3
```

※ただし、自分でソースコードをビルドして入れたものは大丈夫だそうです。

[1.0 The SQLite Amalgamation](https://www.sqlite.org/amalgamation.html)

すごいつまづきました。

select, insert, create table等は出来るのにupdateが出来ない。
みてみたらsqlite3_prepare_v2()がSQLITE_OKを返していない。

問題となったクエリは以下です。

```mysql
update user set name = 'daiki1003' where id = 1 limit 1;
```

**※たとえ、idを絞っていてもdeleteやupdateを叩く際は必ずlimitを付ける癖を付けています。**

## amalgamationはlimitをサポートしていない

文法的にどこも間違っていないのに突っぱねるsqlite3_prepare_v2()。
調べてみたらamalgamationだとlimitは出来ないそうです。

[SQL As Understood By SQLite](https://www.sqlite.org/lang_update.html)

SQLITE_ENABLE_UPDATE_DELETE_LIMIT オプションが必要だそう。

誰かのお役に立てば。
コードをハイライトつきでコピペする

Keynoteにコードを貼付けたいときなどに使えるTipsです。
[Highlight](http://brewformulas.org/Highlight)というツールを使います。

#1. Highlightをインストール
Homebrew以外の方法は[公式ページ](http://www.andre-simon.de/doku/highlight/en/highlight.php)から探してください。

```shell
$ brew install highlight
```

#2. コマンドでクリップボードにコピー

## ファイルを指定してハイライト
```shell
$ highlight -O rtf -S java sample.java | pbcopy
```

## クリップボードの中身をハイライト
```shell
$ pbpaste | highlight -O rtf -S java | pbcopy
```

#3. オプション、対応言語など
* [テーマサンプル](http://www.andre-simon.de/doku/highlight/en/theme-samples.php)
* [対応言語](http://www.andre-simon.de/doku/highlight/en/langs.php)
* [オプション](http://www.andre-simon.de/doku/highlight/en/highlight.php#ch2_2)

| オプション | 内容 | 例 |
|:--:|:--|:--:|
| -O | フォーマット | rtf, html |
| -S | 言語 | java, ruby |
| -k | フォント | 'Source Code Pro'
| -K | フォントサイズ | 16,32 |
| -s | テーマ | テーマ

#4. その他Tips
エイリアス指定しとくと便利。

```.zshrc
hlcopy() { pbpaste | highlight $* -O rtf | pbcopy }
```
のようにしておくと、クリップボードにコピーしてから以下を実行すればハイライトできる。

```shell
$ hlcopy -S java -s Moria
```
これまでに販売されたiOSデバイスのBLE対応状況一覧

iOSデバイスのうち、BLE（Bluetooth Low Energy）をサポートしているデバイスは **iPhone でいえば 4s 以降、というのは頭に入ってるものの、iPad や iPod touch のことはよく知らない**ので、整理してみました。

<table class="data-table">
    <tr>
        <th></th>
        <th class="border-right">対応</th>
        <th>非対応</th>
    </tr>
    <tr>
        <td>iPhone</td>
        <td class="border-right">- iPhone 4s<br/>- iPhone 5<br/>- iPhone 5c<br/>- iPhone 5s<br/>- iPhone 6<br/>- iPhone 6 Plus</td>
        <td>- iPhone<br/>- iPhone 3G<br/>- iPhone 3GS<br/>- iPhone 4</td>
    </tr>
    <tr>
        <td>iPad</td>
        <td class="border-right">- iPad (3rd gen)<br/>- iPad (4th gen)<br/>- iPad Air<br/>- iPad Air 2<br/>- iPad mini<br/>- iPad mini with Retina display<br/>- iPad mini 3</td>
        <td>- iPad<br/>- iPad 2</td>
    </tr>
    <tr>
        <td>iPod touch</td>
        <td class="border-right">- iPod touch 5th gen</td>
        <td>- iPod touch<br/>- iPod touch 2nd gen<br/>- iPod touch 3rd gen<br/>- iPod touch 4th gen</td>
    </tr>
</table>


ざっくりまとめると、

- iPhone ・・・ **iPhone 4s 以降の全機種**
- iPad ・・・ **第3世代以降の全機種とmini全機種**
- iPod touch ・・・ **第５世代**

で BLE をサポートしていることがわかります。

##参考

この表は、Apple のドキュメント [iOS Device Compatibility Reference](https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Introduction/Introduction.html) の、Table 1-1 〜 1-7 （これまでに販売された全iOSデバイスの Required device capabilities の各値への対応状況をまとめた一覧）から、"**bluetooth-le**" についての対応状況を抜き出し、再構成したものです。


そして、この表は下記書籍の執筆にあたりまとめたものです。iOS x BLE というニッチな内容で480ページ！3/26発売です。どうぞよろしくお願いします！

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51XxjzdT%2BKL._SL160_.jpg" alt="iOS×BLE Core Bluetoothプログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank">iOS×BLE Core Bluetoothプログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 15.03.11</div></div><div class="amazlet-detail">堤 修一 松村 礼央 <br />ソシム <br />売り上げランキング: 1,106<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
phpメモ

### -r,--runオプション
コマンドラインでphpが実行できます.
例：試しに実行してみたい時などに...
``php -r 'exec("whoami", $output, $return_var); print_r($output);'``

### -i,--infoオプション
phpinfoの実行結果をコマンドライン形式で返してくれます.

例：Apache経由で確認するのが面倒な時や、
新しくモジュールを追加した際など、Apacheを再起動する前の確認にも使えます.[^1]
``php -i | grep "newrelic"``
※CGIモードだとhtml形式で出力量が多いようです. 試してないのであれですが( ◞‸◟ )
これも多くなるんだろうか...``php -r "phpinfo();" | grep newrelic``

### 複数台一気に確認したい時
```cat serverList | xargs -I0 ssh 0  "php -i | grep apc.shm_size"```
#### xargs
引数を標準入力から受け取る
-I ・・・ 標準入力より渡されたデータを、任意の位置の引数に展開

[^1]: 始めはrオプションでphpinfoを実行していましたが、phpinfo用のオプションがあるとのことを[ツイッター](https://twitter.com/sugimoto1981/status/575618196885016576)にて教えていただき変更しました！m(_ _)m
仮想開発環境構築ツールまとめ

VagrantとDockerの理解がどうも曖昧だったので整理するために、それぞれどうゆうものなのかをまとめました  

## Vagrant
Vagrantとは、違う環境に移行可能な開発環境を簡単に構築・管理し、配布することができる仮想開発環境構築ソフトウェア。仮想マシンの構築手順を'Vagrantfile'という設定ファイルに記述する。 
VagrantのパッケージにはRubyの実行環境が含まれているので、Rubyをインストールしなくても使用可能。 
VirtualBoxやVMWareといった仮想環境の上に仮想マシンを構築して利用する。
>*1.0.x系はrubygemsでも公開していたが、現行ではパッケージからインストール形式を取っている

### 公式サイト
https://www.vagrantup.com/

#### 主要なコマンド
Vagrantfileに記述した設定に従い仮想マシンを起動

```shell-session:terminal
$ vagrant up
```
- 仮想マシンにSSHログイン

```shell-session:terminal
$ vagrant ssh
```
- 仮想マシンの状態を確認

```shell-session:terminal
$ vagrant status
```
- 仮想マシンを停止

```shell-session:terminal
$ vagrant halt
```
- 仮想マシンを削除

```shell-session:terminal
$ vagrant destroy
```
- ssh_configを保存(出力)

```shell-session:terminal
$ vagrant ssh-config >> ~/.ssh/config
```
## Docker
Docker Inc. がオープンソースで開発しているコンテナ型仮想化技術、ソフトウェア。
Dockerfileに設定を記述していく。
### 公式サイト
https://www.docker.com/
### コンテナとは(LXC) 
一つのホスト上で複数の隔離されたLinuxシステム(コンテナ)を走らせる、OSレベルの仮想化ソフトウェア。 
VMに比べ、消費リソースが少い、起動が早い、オーバヘッドが少いというメリットがある。
### Docker Hub
Dockerイメージの保存、共有が出来るサービス。
docker pullコマンドでダウンロードが出来る
https://hub.docker.com/
#### 主要なコマンド
- Dockerイメージのダウンロード

```shell-session:terminal
$ docker pull <イメージ名>:<タグ名>
```
- イメージの一覧

```shell-session:terminal
$ docker images
```
- コンテナの実行

```shell-session:terminal
$ docker run <オプション> <--name コンテナ名> <イメージ名>:<タグ名> 
```
- コンテナの一覧

```shell-session:terminal
$ docker ps -a
```
- コンテナの停止

```shell-session:terminal
$ docker stop <オプション> <コンテナ名>
```
- コンテナの起動

```shell-session:terminal
$ docker start <コンテナ名>
```
- コンテナの強制終了

```shell-session:terminal
$ docker kill <コンテナ名>
```
- コンテナの削除

```shell-session:terminal
$ docker rm <コンテナ名>
```
- イメージの削除

```shell-session:terminal
$ docker rmi <イメージ名>
```

## プロビジョニングツール
### プロビジョニングとは
provisioning : [供給／準備／設備／引き当て（すること）]
ネットワーク設備やシステムリソースなどを事前に用意しておき、ユーザーの要求に応じてそれを割り当てて迅速にサービスの提供を行うこと。
### Puppet
ruby製、独自の宣言型言語によりシステムのあるべき状態を管理する。
参考 : http://gihyo.jp/admin/serial/01/puppet/0001?page=2
### Chef
Puppet同様、サーバ管理ツールで設定ファイルをrubyで記述できる。
cookbook,Recipe等独自の概念を持っている

Chefについては気力がある時に、またまとめようとおもいます。。。

## 2015-06-10 追記
Dockerについてブログにまとめました。 
http://carefree-se.hatenablog.com/entry/2015/06/08/001107

こちらの内容 + Dockerfileについても触れています
ローカルの Git リポジトリ消して大丈夫？　を確かめる

# 経緯

少し前にローカルのリポジトリを整理したくなった。

```
Bitbucket や GitHub に複製があれば良いので、しばらく使っていない不要なローカルリポジトリは消してしまおうかな。
でも「全ての必要なファイルは復旧できること」「消してしまうファイルは不要なものだけであること」はちゃんと確認したいな。
```

という感じ。自分で確認した事項と、実施した手順を書いておく。

# 確認した事項

1. ローカルの最後のコミットからファイルの変更がない
2. ローカルのコミットが全てリモートに存在している
3. "Git が無視しているファイル" は全て消してよいか

意外と 3. を忘れがち。
例えばディレクトリごと無視している ```logs``` に大事なファイルが紛れ込んでいるケースがある。
うっかりまるごと消すとどこにも複製がなく、取り返しがつかない。

# 手順（コマンド）

というわけで、 1. 2. 3. のコマンドを以下に書き留めておく。

## 1. ローカルの最後のコミットからファイルの変更がない

```shell-session
$ git status --porcelain
$
```

何も表示されなければ OK

## 2. ローカルのコミットが全て origin に存在している

```shell-session
$ git log --branches --not --remotes=origin
$
```

これも何も表示されなければ OK
branches というオプション名だけれど、実際は commit 毎の単位を指しているようだ（？）。

なおこの not での否定は複数にできる。

もし複数のリモートリポジトリがあるとして、例えば origin と origin2 のどちらかに存在していれば構わないときは、

```shell-session
$ git log --branches --not --remotes=origin --remotes=origin2
$
```
とすればいい。

## 3. "Git が無視しているファイル" は全て消してよいか

さてこれが問題。

```git check-ignore``` すれば、そのファイルが無視されているか調べることができるらしい。

なので find コマンドで全てのファイルを列挙し、 xargs で渡すことにした。

実行例:

```shell-session
$ find . -type f -print | xargs git check-ignore
./.DS_Store
./.python-version
./bin/.DS_Store
./bin/__pycache__/main.py
```

これらは目視で確認した。
よし、このリポジトリは消しても大丈夫そうだ。

# 参考

http://git-scm.com/docs/git-log
http://qiita.com/marutanm/items/1401e15e249e8f48b645
http://stackoverflow.com/questions/2657935/checking-for-a-dirty-index-or-untracked-files-with-git
http://stackoverflow.com/questions/466764/show-ignored-files-in-git

# 免責

「この内容の通り確認した後 ```rm -rf``` したら△△と○○が消えてしまった！」ということがあっても、筆者は何も保証しません。

# 余談

それでも怖い時は tar で固めて暗号化して Amazon S3 に置くという手がある。
Restletフレームワークを使いAndroidアプリ上でHTTP JSON APIサーバーを動かす


# Andriod版のRestletをzipでダウンロードして解凍する

http://restlet.com/downloads/current/#release=stable&edition=android&distribution=zip

(またはプロジェクト生成後maven経由で依存関係解決するようにappのbuild.gradleを設定する)

# Android Studioで新規プロジェクトをつくる

[New Project] -> [プロジェクト名とかを適当に決める] -> [Blank Activity]

# Restletのjarを配置する

`~/Downloads/restlet-android-2.3.1/lib/`から
`~/AndroidstudioProjects/適当なプロジェクト名/app/libs/`に

```
org.restlet.ext.json.jar
org.restlet.ext.nio.jar
org.restlet.jar
```

をコピーする。
Android Studio上で増えたファイルを右クリックして[Add as library]をする。

# アプリを編集する

```java:MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Component serverComponent = new Component();
        serverComponent.getServers().add(Protocol.HTTP, 8081);
        final Router router = new Router(serverComponent.getContext().createChildContext());
        router.attach("/test", TestResource.class);
        serverComponent.getDefaultHost().attach(router);
        try {
            serverComponent.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
```

`TestResource.class` のところでそんなクラスないぞと警告が表示されるはずなので、インスペクタから `Create Class:TestResource` をする。
そして以下のようなコードを書く。

```java:TestResource
public class TestResource extends ServerResource {
    public TestResource()
    {
        Set<Method> allowedMethods = new HashSet<Method>();
        allowedMethods.add(Method.GET);
        allowedMethods.add(Method.PUT);
        setAllowedMethods(allowedMethods);
    }

    @Get
    public JsonRepresentation getResource()
    {
        JSONArray jsonArray = new JSONArray();
        jsonArray.put("hoge");
        return new JsonRepresentation(jsonArray);
    }

    @Put("json")
    public JsonRepresentation
        saveOrUpdateResource(Representation rep)
        throws JSONException, IOException
    {
        JSONArray jsonArray = new JSONArray();
        jsonArray.put("hoge");
        return new JsonRepresentation(jsonArray);
    }
}
```

## マニフェストの設定

```xml
    <uses-permission android:name="android.permission.INTERNET"/>
```

がないと起動できない。


# 動作確認
実機かエミュレーターにインストールして起動完了後にブラウザで http://localhost:8081/test を開く

# 現実的には
ActivityじゃなくてServiceとしてバックグラウンドで動作するように実装すべきですがとりあえずRestletが本当にまともにAndroidで動くのか確認したかったという話です。
【s3cmd】ヘッダの追加 CloudFrontのTTLの調整

#概要

「--add-header」オプションをつけることでs3に転送時に、ファイルにヘッダを付与することができます。
例えばCloudFrontを利用した場合、Cache-Control:max-age=3600というヘッダをつければCloudFront側でキャッシュする時間を3600秒(1時間)に指定することができます。

下記のような感じで指定します。

#s3cmd

```

#!/bin/sh
s3cmd sync --add-header=Cache-Control:max-age=3600 ***** s3://バケット名

```

転送後、ファイルを選択して「Metabase」のパネルを開くと確認できます。

![スクリーンショット 2015-03-11 19.05.04.png](https://qiita-image-store.s3.amazonaws.com/0/67591/cf05d300-4a53-7498-8ddd-2155b8b09e01.png)
S3のバケットURL(仮想ホスト形式とパス形式)


S3のバケットにアクセスするには２つの形式のURLがある。
仮想ホスト形式(virtual-hosted-style)とパス形式(path-style)である。

# 仮想ホスト形式

バケットがどのリージョンにあっても下記の形式でアクセスできる。

`http://bucket.s3.amazonaws.com`

リージョンごとのエンドポイントでもアクセスできる。
下記は東京リージョンの場合。

`http://bucket.s3-ap-northeast-1.amazonaws.com`

# パス形式

パス形式の場合は仮想ホスト形式と違ってリージョンの指定が必須。
US Standard endpointの場合。

`http://s3.amazonaws.com/bucket`

東京リージョンの場合。

`http://s3-ap-northeast-1.amazonaws.com/bucket`

# 注意点

## ホスト名とアンスコ

バケット名を付ける時はドメインに含まれることを想定すること。
とりあえず、バケット名にアンスコは含めない方が無難。

[Bucket Restrictions and Limitations](http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)
[Virtual Hosting of Buckets](http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html)

## 署名付きリクエストとリージョンなしURL

署名付きリクエストでS3にアクセスする場合リージョンを含まないURLだとSignature Version 4が使えない。
スコープの一部にリージョン情報を使ってるっぽい。
CloudFormationからS3にアクセスするとVer2にフォールバックする警告がでる。

[Authenticating Requests by Using the Authorization Header (Compute Checksum of the Entire Payload Prior to Transmission) - Signature Version 4](http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html)
ECS LIVA に入れたLINUXの無線LAN (WiFi)がうまく動かない

## 参考リンク

http://qiita.com/tukiyo3/items/5b66da8febd9c2535629
http://forums.gentoo.org/viewtopic-t-1006786.html

## 環境等

* Archlinux
* Linux version 3.14.35-1-lts (builduser@andyrtr) (gcc version 4.9.2 20150304 (prerelease) (GCC) ) #1 SMP Sat Mar 7 19:24:12 CET 2015
* model name      : Intel(R) Celeron(R) CPU  N2807  @ 1.58GHz
* MemTotal:        1940292 kB
* 無線設定でつかってるもの: netctl - wpa-supplicantでWPA-EAP,PEAP,identity,password使い、dhcp

## ドライバを入れる

ggって入手して、以下設置

```
/usr/lib/firmware/brcm/brcmfmac43241b4-sdio.txt
```

## modはboot後に組み込む

```
rmmod brcmfmac 
rmmod brcmutil 
echo on > /sys/bus/platform/drivers/sdhci-acpi/INT33BB\:00/power/control 
modprobe brcmfmac
netctl restart interfaces/wlan0 
```

## Known Issue

以下のようなログが出るけどつながってます。
闇は深そうなので放っておく。

```
[  338.518365] brcmfmac: brcmf_sdio_chip_drivestrengthinit: No SDIO Drive strength init done for chip 4324 rev 5 pmurev 17
[  338.786754] brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Jul 17 2013 07:36:07 version 6.10.197.71 (r412987) FWID 01-882d2634
[  338.790678] brcmfmac: brcmf_fil_cmd_data: Failed err=-23
[  338.792338] brcmfmac: brcmf_fil_cmd_data: Failed err=-23
[  338.793500] brcmfmac: brcmf_fil_cmd_data: Failed err=-23
[  338.795529] usbcore: registered new interface driver brcmfmac
[  338.879107] brcmfmac: brcmf_fil_cmd_data: Failed err=-23
[  338.908189] brcmfmac: brcmf_add_if: ERROR: netdev:wlan0 already exists
[  338.908798] brcmfmac: brcmf_add_if: ignore IF event
[  338.911021] brcmfmac: brcmf_fil_cmd_data: Failed err=-23
[  338.916680] brcmfmac: brcmf_construct_reginfo: channel 1: f=2412 bw=0 sb=0
```
findFirstVisibleItemPosition()って何返してるのか気になったので調べた

LinearLayoutManagerの
findFirstVisibleItemPosition()
findLastVisibleItemPosition()
はそれぞれ何を返してるのか気になったので調べてみた。

findFirstVisibleItemPosition()
公式にはこう書いてある
>Returns the adapter position of the first visible view.

このfirst visibleが実際どんな意味なのかちょっと気になったので調べてみた。
あとremoveAndRecycleViewAtとかで子供を殺した時はどうなるのかなとか

結論言っちゃうとほんとにその時見えているものベースで判断するらしい。

たとえば以下のようにViewのリストがあるとする
[0,1,2,3,4]
最初は0,1,2が見えているとすると
この時
findFirstVisibleItemPosition()
で取れる値は
先頭の0となる

そのままスクロールしていき、画面に見えている要素が[1,2,3]となっていたら
findFirstVisibleItemPosition()
で取れる値は
先頭の1となる

スクロールを戻してまた画面に見えている要素が[0,1,2]となっていたら
0が返る


0が画面外に出たのでremoveAndRecycleViewAtで先頭(0番目)を消した場合
スクロールを戻しても0は出てこず見えてる要素が[1,2]になると思う
そしたら当然
findFirstVisibleItemPosition()は
1を返す

findLastVisibleItemPosition()はちゃんと動き見てないけどまあ同じことだろうと思う。
FreeBSDでgitインストール

結構ハマったのでメモ．

## install方法

公式サイトによれば，FreeBSDでのインストールは
`# cd /usr/ports/devel/git`
`# make install`
でいいらしい．
http://git-scm.com/download/linux

というわけで，makeコマンド打ったら表示されるconfig用windowに適当にチェック入れてインストール開始
![スクリーンショット 2015-03-11 18.07.05.png](https://qiita-image-store.s3.amazonaws.com/0/58048/c0aea972-1055-9651-5e83-2de1f2f97c93.png)

と思ったらcurlのinstallでコケる．（エラーメッセージはコピーしてなかったので適当に拾ってきたものです）

```
===>  License MIT accepted by the user
===>  Found saved configuration for curl-7.24.0_3
===> Fetching all distfiles required by curl-7.24.0_3 for building
===>  Extracting for curl-7.24.0_3
=> SHA256 Checksum OK for curl-7.24.0.tar.lzma.
===>   curl-7.24.0_3 depends on file: /usr/local/bin/perl5.12.4 - found
tar: Unrecognized archive format
tar: Error exit delayed from previous errors.
*** Error code 1

Stop in /usr/ports/ftp/curl.
*** Error code 1
```

どうやらtarがlzmaって形式に対応してないので入れなおさないといけないらしい．

## 最新(?)のTarのインストール

デフォルトで入っているtarが2系だったので入れなおし．
例のごとくディレクトリ移動して make install

```
# cd /usr/ports/archivers/libarchive
# make install clean
```

既存のtarコマンドを置き換え(installしたbsdtarにリンクを貼り直し）て，
versionの確認．3系になってればlzma形式の解凍ができるっぽい．

```
# ln -sf /usr/local/bin/bsdtar /usr/bin/tar
# tar --version
bsdtar 3.1.2 - libarchive 3.1.2
```

参考サイト
https://forums.freebsd.org/threads/curl-unrecognized-archive-format.39917/

ありがとうSadokさん．

## gitインストール続き

もう一回gitディレクトリに移動してinstallをやり直し．

```
# cd /usr/ports/devel/git
# make install
```

順調と思いきや，古いsvnが既にinstallされていたためエラー発生．
`# pkg-delete` コマンドで消せるらしい（とエラーメッセージに書いてた）けど，上手くuninstallが出来きなかったので
`# make config` で設定画面をもう一度出してsvnのチェックを外してもっかいやり直し．

![スクリーンショット 2015-03-11 18.05.45.png](https://qiita-image-store.s3.amazonaws.com/0/58048/9e63a2af-4af7-f2ab-9fb1-fe7745182c0f.png)

もう一度`# make install`すると無事gitコマンドがinstall出来ました．
Capistrano3でasset_syncしてからデプロイする

asset_syncをcapistranoでのデプロイ時に実行するようにしました。
asset_syncの実行と実行したあとに出来るmanifestファイルのpushが何とかならないかと思い、capistranoのrun_locallyとuploadを使ってみました。

asset_syncで参考にしたサイト:
[asset_sync を使ってデプロイを高速化しつつ転送料も節約する](http://cohakim.com/archives/5671)

### 環境
- Rails 4.1.8
- capistrano 3.2.1
- asset_sync 1.1.0

### やりたいこと
- asset_sync(asset:precompile)をローカルで実行して、AWS S3にassetを置く
- ソースコードをデプロイする
- ローカルにできる public/assets/manifest〜.jsonをデプロイ先にアップロードする

### deploy.rbの記述
```ruby:config/deploy.rb
# SSHKit.conifg
SSHKit.config.command_map[:rake] = 'bundle exec rake'

namespace :deploy do
  desc 'Run asset_sync'
  task :asset_sync do
    run_locally do
      with rails_env: fetch(:rails_env) do
        execute :rake, 'assets:precompile'
      end
    end
  end

  desc 'Upload manifest'
  task :upload_manifest do
    on roles(:app) do |host|
      if test "[ ! -d #{release_path}/public/assets ]"
        execute "mkdir -p #{release_path}/public/assets"
      end
      file_path = Dir::glob('public/assets/manifest*').first
      upload!(file_path, "#{release_path}/public/assets/")
    end
  end

  before :starting, :asset_sync
  after :publishing, :upload_manifest

```

### タスクの内容


```rb
# SSHKit.conifg
SSHKit.config.command_map[:rake] = 'bundle exec rake'
```
rakeをbundleで実行したいので、command_mapで`bundle exec rake`に設定しています。


```rb
  file_path = Dir::glob('public/assets/manifest*').first
  upload!(file_path, "#{release_path}/public/assets/")
```
manifestのアップロードですが、Rails4系の場合、manifestのファイル名にハッシュ値がつくので、`Dir::glob`でファイル名を取得してuploadに渡すようにしました。アップロード先は、shared_pathではなく、release_pathにしています。shared_pathだと、以前のファイルを消していかないといけないので。

```rb
  before :starting, :asset_sync
  after :publishing, :upload_manifest
```
あとは、デプロイを開始するまえに、beforeで`asset_sync`のタスクを実行して、ソースデプロイ後にafterで`upload_manifest`をしてデプロイを完了させています。

capistranoについては、こちらがとても参考になりました。
[Capistrano3のデプロイフレームワークの使い方](http://qiita.com/yuku_t/items/01c0ec4389db143e27f5)
cssの競合を調べるやつ

# cssの競合を調べるやつ

追記：
書いた後に推敲してたら用途とタイトルが一致しなくなったｗ
競合調べるのはページ中程の方法で。


nodejs の css parser がいい感じだったので、
cssの競合を検出するやつ書いてみた。

## usage

* `./css2dict.js a.css b.css c.css`
* `./css2dict.js $(ls css/*.css)`

とか。

## 概要

読み込んだ複数のcssを

```
{
    cssセレクタ: [
      declarations,
      declarations,
      ...
    ],
    cssセレクタ: [
      declarations,
      declarations,
      ...
    ],
}
```

の形に整形する。
declarationsは個別定義の配列。


## 競合を調べるには

セレクタの競合が無ければ declarations は1件しか無いはずなので、
これでセレクタの競合がチェックできる。はず。

```js
var ret = css2dict([
            "a.css",
            "b.css",
            "c.css",
        ]);

// 競合チェック
for(var csssel in ret) {
    var dec = ret[csssel];
    if(dec.length > 1) {
        console.log("'" + csssel + "' is conflicted!!");
    }
}
```

## ソース

もうちょい綺麗にまとめようかと思ったけど、まぁいいや。

```js:css2dict.js
#!/usr/bin/env node
"use strict"

var fs = require('fs');
var css = require('css');

function css2dict(files) {
    var dict = {};
    for(var i in files) {
        var file = files[i];
        var text = fs.readFileSync(file, 'utf8');
        var ast = css.parse(text, {source: file});

        for(var j in ast.stylesheet.rules) {
            var rule = ast.stylesheet.rules[j];
            var selectors = rule.selectors;
            if(!selectors)
                continue;

            for(var k in selectors) {
                var selector = selectors[k];
                if(!dict[selector]) {
                    dict[selector] = [];
                }
                dict[selector].push(rule.declarations);
            }
        }
    }
    return dict;
}



if (require.main === module) {
    var args = process.argv.concat();
    args.shift();
    args.shift();

    var ret = css2dict(args);
    // to stdout
    console.log( JSON.stringify(ret) );
}
```
ウェブ開発者向け Mac Safari の拡張機能まとめ


ウェブ開発者寄りの Mac Safari の拡張機能まとめです。一部は誰が使っても便利な拡張機能だと思います。


## ユーティリティ
### 1Password
言わずと知れた 1Password
https://extensions.apple.com/details/?id=com.agilebits.onepassword4-safari-2BUA8C4S2C

### Translate
現在みているページを翻訳する
https://extensions.apple.com/details/?id=com.sidetree.Translate-S64NDGV2C5

### Sava to Pocket
Pocketにワンクリックでwebページをクリップ
https://getpocket.com/safari/

### Shortly
短縮URLを作成してくれる
http://zzhc.org/shortly/

### Invisible Status Bar
リンクにマウスポインタを重ねた時にだけウィンドウ下にリンク先URLを表示
http://dbergey.github.io/

### QR Coder
現在みているサイトの QR コードの生成
https://extensions.apple.com/details/?id=com.sonicbunny.qrcoder-V9VQ2RXE25

### AutoPagerize
Googleの検索結果など、複数ページに渡るものを2ページ目以降をページ最下層にいくと自動で読み込んでくれる
http://autopagerize.net/

## ディレクター向け
### Coda Notes
https://extensions.apple.com/details/?id=com.panic.CodaNotes-VE8FC488U5
Webページに付箋、ペイントを行って共有できる

### Alexa Site Info
現在みているサイトの世界ランキングを確認できる
https://extensions.apple.com/details/?id=com.farnabaz.alexasiteinfo-9SN9W787KT

## デベロッパー向け
### Awesome Screenshot
Webサイトのスクリーンショットを保存できる
https://extensions.apple.com/details/?id=com.diigo.safari.awesomeScreenshot-5DXNM3K2CT

### MeasureIt
任意の画像やエリアの大きさを計測できる
https://extensions.apple.com/details/?id=us.frayd.measureit-C48BX2LTZ2

### L-Square Browser Pixel Rulers
ウィンドウにルーラーを表示できる
https://extensions.apple.com/details/?id=com.hescoding.safari.l-square-NK45FETKD5

### ResponsiveResize
ウィンドウサイズをワンクリックで変更できる
https://extensions.apple.com/details/?id=com.midwinterdg.responsiveresize-ZVT624LFPW

### Responsive Browser
ウィンドウサイズをワンクリックで変更できる
https://extensions.apple.com/details/?id=com.mirkosantangelo.responsivebrowser-V3P3GWNRDN

### BetterSource
新しいタブで現在みているサイトのHTMLを表示できる
https://extensions.apple.com/details/?id=com.awarepixel.safari.bettersource-24E7DYSH92

### Unicorn
W3C 統合検証サービス
https://extensions.apple.com/details/?id=com.coder.app.unicorn-MR88LRDSNG

### YSlow
https://extensions.apple.com/details/?id=com.yahoo.yslow-8LD2Q8N8RM
Markdownファイルの中にCSSを入れ込んでみた

# Markdownファイルの中にCSSを入れ込んでみた

cssファイルをmarkdownに入れ込めないかいろいろ調べたら、

    <style scoped></style>

っていう、styleにscoped属性ってのがあることを知った。

これでmarkdownファイルの一番下に指定したいスタイルを定義しておけば、一つのファイルにできそう。

とりあえずこんな作業手順メモに、

    1. るる
    	- ～かどうか確認する。
    		- ～の場合アレをアレする。
    	- ～する。

こんなスタイルを定義しておくと、

    <style scoped>
    	body {
    		font-family: 'MS Gothic';
    	}
    	li{
    		margin-top:1px;
    		margin-bottom:1px;
    	}
    	li:before{
    		content: '☑';
    		color:#DDDDDD;
    		margin-right:3px;
    	}

    	pre {
    		background-color: #f8f8f8;
    		border: 1px solid #ccc;
    		font-size: 13px;
    		line-height: 19px;
    		overflow: auto;
    		padding: 6px 10px;
    		border-radius: 3px;
    	}
    </style>

こんな感じになった。
![2015-03-11_11h09_08.png](https://qiita-image-store.s3.amazonaws.com/0/16970/842747c5-9d1e-88d3-0c9d-5af40cabd71e.png)

スタイルのファイルを別にしたくない理由は、社内でmarkdownを知らないであろう人が多い上、エクセル方眼紙が全盛でブラウザ上で情報共有の環境がないので、ファイルを引き継いでいくうちに、絶対にスタイルのファイルがどこかに消えると思ったため。

一つのファイル、それもテキストファイルにしておけば、Markdownを知らない人は普通のテキストファイルとして読めるし、markdown記法を知っていればmarkdownの見やすさの恩恵に与れるとおもった。

え？作業手順メモなんか作らずに作業手順自動化しろって？うるせえシーケンサぶつけんぞ
IoT時代のアジャイル開発 - 受け入れテスト

# 背景
#### IoTとは
* 個人的な理解： http://qiita.com/alingogo/items/d6dd91e9d27932d0a5b9
* IoT構成
 * デバイス、スマホ、サーバー、インターネット、API......

#### 個人な開発作業
* Android開発を担当している
* Androidアプリを実装した後に、リリースされたデバイスAPIより、どんどん結合テストをやる

# 開発プロセス検討
#### IoT時代の開発プロセス
* IoT時代の開発は、スマホ、サーバーだけじゃんくて、デバイス開発もある。
* 普通のウォータフォールで開発すると、時間が長くなるね。
* ウォータフォールより、アジャイル開発は、開発時間が短くなった

#### アジャイル vs. ウォータフォール
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/13451/6c4f3518-d789-59db-bf12-a997e46a6a60.png)

* 違いは、スマホ開発は、デバイスが完全に開発される完了後に、開発が始まる
* デバイス側に、小さい部分の開発完了したら、スマホ側に、関連部分を開発できる

# 問題が来た
* デバイスがリリースされたAPIについて、よく「XXXXX_API(※制約あり)」の記述を見えるけど、デバイスが対応できない部分は、制約として、リリースされる。スマホ側の開発者は、困っているよ
 * 制約が何か？　制約があって、スマホ側の関連部分機能を結合テストで確認できるか？
* 開発時間が短くなって、小さい部分が出て、リリースしたけど、品質は、どう保証するか？
 * 特に、開発完了した機能は、次のバージョンに、バグが出て、誰にもまずくなる
* 仕様があるけど、スマホ開発に、実は、重要度がある、　どっちのAPIが重要ですか？　APIの間に、何か関連があるか？　これは、デバイス開発者は、分からないです。
* 進捗：　↑に言った「制約あり」のことに対して、進捗をどうコントロールするか？　制約ありということは、本当に完成するか？しないか？
* アジャイル開発は、開発時間が短くなれるけど、困っていることが、いっぱいあるw

# 対策 → 受け入れテスト
* スマホAPIを開発するときに、もちろん、Mockとテストを書かないといけない。そのときに、スマホAPIと連携して、デバイステスト用の受け入れテストを実装しよう
 * 受け入れテストを、どう実装するか？だれは、実装するか話は、この文書に検討しない
![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/13451/7a54b102-d205-daac-1a78-c9611ebafe48.png)


# メリット
* デバイスがリリースされたAPIについて、「XXXXX_API(※制約あり)」が、受け入れテストに通らないケースなので、一回に受け入れテストが走って、理解しやすい
* デバイスAPI開発者は、受け入れテストを、自動化して、簡単的に品質保証できるようになれる
* スマホ開発者は、受け入れテストを書くと、APIの重要度と優先度をテストシナリオに入って、デバイス開発者は、受け入れテストより、実装順番を決める
* 受け入れテストに、いろいろなケースがあって、テスト通ったら、グレーンになって、通らない場合は、レッドになって、進捗を確認しやすい

# 補足
* 開発者けど、スクラムマスタじゃないので、以上の対策は、案として、みんなは、検討できるようにしたいと思う
* 感想、意見であれば、コメントをよろしくお願いします
リンクの http: や https: を省略して現在のプロトコルでリンク先にアクセスさせる

`<a>`タグの`href`などで指定するURIは、`http:`や`https:`を省略できます。

具体的には、

```html
<a href="http://google.co.jp">
```

を

```html
<a href="//google.co.jp">
```

と書けます。

省略することで、遷移元のページを
`http`で開いているときは`http`でアクセスさせられます。
`https`で開いているときは`https`でアクセスさせることができます。

`<a>`以外にも`<script>`, `<iframe>`, `<link>`などURI全般でこの書き方を使えます。CSSでも使えます。

# メリット
`https`で開くページの中に`http`のリンクが混在することを予防できます。
逆に[混在すると中間者攻撃を受ける可能性があります](https://support.mozilla.org/ja/kb/how-does-content-isnt-secure-affect-my-safety)が、それを防ぐことができます。
中間者攻撃を受ける理由は、おおざっぱにいってこうなっています：
1. ユーザが`https`を使って、あるページにアクセス
2. そのページに`http`へのリンクが混在していると、`http`なアクセスが飛ぶ
3. 攻撃者が`http`コンテンツを置き換えたり盗聴したりする

また、混在していると、ブラウザの設定によって警告が表示されたりします。Google Chromeの場合はこんなエラーが出てしまいます。
![invalid.jpg](https://qiita-image-store.s3.amazonaws.com/0/44676/716ce4f5-86bf-2ed4-0cb3-60a26ae6909a.jpeg)

# 詳細
このURIの書き方は[RFC3986](http://www.ietf.org/rfc/rfc3986.txt)で定義されています。
[RFC3986](http://www.ietf.org/rfc/rfc3986.txt)の「4.2.  Relative Reference」に載っています。
このようなスキーマを省略する書き方は相対参照の一種とされて、`network-path reference`と名付けられているようです。

~~[Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.html)の中でも[1番最初の項目でこの書き方が推奨されています](https://google.github.io/styleguide/htmlcssguide.html#Protocol)。~~

# 注意
現在使っているプロトコルでリンク先を取得しに行くので、そのリソースを`http`と`https`の両方で取得できるようになっている必要があります。

また、`http:`や`https:`の省略は2018-01-18現在、Google的に非推奨です。
[Google HTML/CSS Style Guide
](https://google.github.io/styleguide/htmlcssguide.html#Protocol)に記載のある通り、全てのURLでHTTPSを指定することが推奨されています。

Googleは世界中のWebサイトにHTTPSを推奨するよう取り組んでいるので、その一環だと思われます。
参考：

* https://jp.techcrunch.com/2017/10/21/20171020https-is-booming-says-google/
* https://japan.cnet.com/article/35100589/

なお、Google的に非推奨という件は @hibikikudo さんから編集リクエストで教えていただきました。ありがとうございます。

# その他
今回はURIのスキーマを省略すると現在使用しているプロトコルでアクセスするという話でしたが、全体的に、URIがどのようにして解釈されるかは、[RFC3986](http://www.ietf.org/rfc/rfc3986.txt)の「5.2.2.  Transform References」に疑似コードで紹介されています。
Google Apps ScriptでGoogle アナリティクスのリアルタイムAPIを利用

クラス名がわからなかったので備忘録を残す

## 参考
 * [Real Time Reporting API - 概要 - Google アナリティクス — Google Developers](https://developers.google.com/analytics/devguides/reporting/realtime/)
 * [GoogleAnalytics - Google Analytics Real Time Reporting API 事始め - Qiita](http://qiita.com/gfx/items/5d8478461d801f3a8baa)

## コードサンプル
```js
function realTime() {
  var result = Analytics.Data.Realtime.get(
    reportConf_.gaInfo.viewId, // view id
    "rt:activeUsers", // 指標
    {
      'dimensions': 'rt:pagePath'
    }
  );
  var sheetRealtime_   = SpreadsheetApp.getActive().getSheetByName("realtime");
  var outputStartCell = sheetRealtime_.getRange("A1");
  for( var i = 0; i < result.rows.length; i++ ){
    outputStartCell.offset( i, 0, 1, 2 ).setValues( [ result.rows[i] ] );
  }
}
```
UIWebView ダブルタップでスクロールするのを禁止する

# 対処

bakerでこの問題を対処していた。

- https://github.com/Simbul/baker/blob/master/BakerView/BakerViewController.m#L616

下記のようにwebview以下のすべてのviewに関してgestureを外すと、webviewのダブルタップでスクロールする現象を回避できる。

```swift
@IBOutlet weak var webview: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.removeWebViewDoubleTapGestureRecognizer(webview)
}

func removeWebViewDoubleTapGestureRecognizer(view: UIView) {
    if let gestureRecognizers = view.gestureRecognizers {
        for recognizerAnyObject in gestureRecognizers {
            if let tapRecognizer: UITapGestureRecognizer = recognizerAnyObject as? UITapGestureRecognizer {
                if tapRecognizer.numberOfTapsRequired == 2 {
                    view.removeGestureRecognizer(tapRecognizer)
                }
            }
        }
    }

    for subviewAnyObject in view.subviews {
        if let subview = subviewAnyObject as? UIView {
            self.removeWebViewDoubleTapGestureRecognizer(subview as UIView)
        }
    }
}
```
全角かどうか、半角カナかどうかチェック

#### 全角かどうか

```php
preg_match('/^[^ -~｡-ﾟ\x00-\x1f\t]+$/u', $value)
```
[^...]の部分で半角文字以外を表現

|正規表現|説明|
|:--|:--|
|\t|タブ文字|
|\x00-\x1f|制御文字。念のため|
| -~｡-ﾟ|半角文字|


#### 半角カナかどうか

半角の句読点（｡と､）はＮＧ
半角空白ＯＫとする

```php
preg_match('/^[ｦ-ﾟｰ ]+$/u', $value);
```

> `ｦ-ﾟ`を`｡-ﾟ`とすると句読点もＯＫになる
> [PHPで半角カタカナの入力チェック（正規表現）](http://blog.96q.org/2008/08/21/php-regular-expression/)


正規表現チェック前にtrimするとき

```php
trim(mb_convert_kana($value, "s", 'UTF-8'));
```
> より確実にトリム処理したいときはこちらのコメントを参照
> [PHPで全角スペースのtrimがうまくできない時に試すこと](http://qiita.com/saku/items/2cac8fbd7cfd4c493b52)
mongooseで_idに手動で値を設定する


# 背景

MongoDBの`_id`を二重投稿対策に利用したい。
予め`_id`に入れたい値を生成しておいて、それをリクエストで引き回す。実際にドキュメントを作成するときにユニークチェックをすれば、同じリクエストが二重に走っても大丈夫なはず。
普通だと`_id`はDB保存時に自動で設定されるが、以下の方法で`_id`に任意の値を設定できる。

# 設定方法

## スキーマに_idを明示的に定義する

タイプは`Schema.Types.ObjectId`にしておく。

```js:
var Thing = new mongoose.Schema({
    _id: Schema.Types.ObjectId,
    // (略)
});
```

## ObjectIdの生成

新規インスタンス作成時に、_idも手動で設定してやる。

```js:
// 新規作成用_idを作成して引き回す
var id = new mongoose.Types.ObjectId;

// ドキュメント作成時に、リクエスト越しに渡ってきたIdを設定
var m = new Thing;
m._id = id
m.save()
```

以上の設定で、指定した`_id`のドキュメントを作成することができる。

# ちなみに

## ObjectIdはユニーク

ObjectIdはちゃんとユニークになるように設計されているらしい。

[mongodbのObjectIdの生成規則 - としたにあんの左脳](http://toshitanian.hatenablog.com/entry/2014/02/14/015314)

# 参考

javascript - How to set _id to db document in Mongoose? - Stack Overflow
http://stackoverflow.com/questions/19760829/how-to-set-id-to-db-document-in-mongoose

Mongoose SchemaTypes v3.8.24
http://mongoosejs.com/docs/schematypes.html

mongodbのObjectIdの生成規則 - としたにあんの左脳
http://toshitanian.hatenablog.com/entry/2014/02/14/015314
ES7 の Async/Await を使ってみた

[Taming the asynchronous beast with ES7](http://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html)

babel の experimental に ES7 の Async/Await が入ったというので、さっそく導入してみた。対象は画像を点字を変換するわりかしどうでも良いモジュール。

- [seurat - JavaScript utility to generate a braille text from an image](https://github.com/mohayonao/seurat)

## 導入前
ファイル読み込みや画像の変換に非同期処理を多用しており、node.js スタイルの 非同期API(コールバックを渡すやつ) を [prominence](https://github.com/mohayonao/prominence) というユーティリティ関数で Promise 化していたが、行ごとに then が出てきたり、複数の値を渡すために Promise.all を使ったりと、あまり読みやすいとは言えないコードだった。(コールバック地獄になるよりはマシだと思うけど..)

```js:convert.js
import gm from "gm";
import pngparse from "pngparse";

// 画像を点字に変換する
let convert = (src, opts) => {
  // 画像を GraphicsMagick の形式に変換
  return Promise.resolve(gm(src)).then((im) => {
    // サイズを取得
    return Promise.all([ im, prominence(im).size() ]);
  }).then(([ im, size ]) => {
    // 画像を加工 (省略)
    return im;
  }).then((im) => {
    // PNGに変換
    return prominence(im).toBuffer("png");
  }).then((buffer) => {
    // PNGをパース
    return prominence(pngparse).parse(buffer);
  }).then((png) => {
    // PNGを点字に変換 (省略)
    return "点字";
  });
};
```

## 導入準備
まず babel をアップデートして、devDependencies から dependencies に移動。

```json:package.json
"dependencies": {
    "babel": "^4.7.8"
}
```

`.babelrc` で ES7 機能を使うフラグを設定。

```json:.babelrc
{
  "experimental": true
}
```

async/await を使うファイルで `babel/polyfill` をインポートする。これがないと実行時に "regeneratorRuntime is not defined" というエラーが出る。

```js
import "babel/polyfill";
```

## 導入後
await を使う関数自体を `async function` にして、非同期処理を行う関数呼び出しに `await` を追加するだけ。手続き型言語！！という感じで、コードの見通しは非常に良くなったと思う。使う側のコードに変更は不要で、書き換える前と同じインターフェース(この場合はPromise)で使える。

```js:convert.js
import gm from "gm";
import pngparse from "pngparse";

// 画像を点字に変換する
export async function convert(src, opts) {
  // 画像を GraphicsMagick の形式に変換
  let im = gm(src);

  // サイズを取得
  let size = await prominence(im).size();

  // 画像を加工 (省略)

  // PNGに変換
  let buffer = await prominence(im).toBuffer("png");

  // PNGをパース
  let png = await prominence(pngparse).parse(buffer);

  // PNGを点字に変換 (省略)
  return "点字";
};
```

## 知見
事前にPromise化していた効果が大きかったのか、コードの書き換えはあっという間にできた。最近 Promise がいまいち使いづらいと思い始めていたけど、使い続けるモチベーションにはなった。

## 失ったもの
- lint (jshint) が使えなくなったので消した

## diff
https://github.com/mohayonao/seurat/commit/dc84628ac0a3fc546b6e93259388f3751d014dcd
Javascriptで非同期処理を一度だけ行う（非同期メモ化）

javascriptで非同期で一度だけ処理を行いたいという状況があります。たとえば、サーバに情報を問い合わせる処理が、さまざまなモジュールで独立で使われるという状況です。

非同期でなければ、「得られた結果をキャッシングして、それを返す」というのは、「メモ化」(memoization)と呼ばれる良く知られたパターンになります。しかし、非同期の場合、これをそのまま使うことはできません。なぜなら、非同期で結果が得られる前に、複数回処理が開始されてしまうためです。これを回避するためには、コールバック関数をlistenerとして登録して、処理が終わったら登録されたlistenerを呼び出す処理を入れる必要があります。

特段複雑な処理というわけではないですが、listenerの登録、キャッシングといった、本質的ではない処理をさまざまな場所に書いていたら、コードが見づらくなって仕方ありません。そこで、これを汎用性のある形で書いてみました。

```js
function once(handler){
    var response;
    var listeners = [];// Array: task not finished, null: task finished
    return {
        exec: function(callback){
            if(listeners){
                listeners.push(callback);
                if(listeners.length == 1){
                    handler(function(){
                        response = Array.prototype.slice.call(arguments)
                        var _listeners = listeners;
                        listeners = null;
                        _listeners.forEach(function(listener){
                            listener.apply(null, response);
                        })
                    })
                }
            }else{
                callback.apply(null, response);
            }
        },
        reset: function(callback){
            listeners = [];
            if(callback){
                this.exec(callback);
            }
        },
        isFinished: function(){
            return !listeners;
        },
        getResponse: function(){
            return !listeners && response;
        }
    }
}	
```

例：

```js
var requestOnce = once(function(callback){
  requestToServer(function(result){
    callback(result); 
  })
})

requestOnce.exec(function(function(result){
// use result
})

```

コード中にコメントした通り、listenersという変数をコールバック関数の登録と、処理終了のフラグという2つの用途に使っているのは、好みが分かれるところかもしれません。

一方、処理終了後にいったん、_listenerという変数で受けているのは、コールバック関数の中で、再度execやresetが呼ばれることを考慮するためです。
NginxとWordpressの404ページがproxy cacheできない

Nginxとwordpressの組み合わせで、404ページもキャッシュをかけようとしたところうまく行きませんでした。
調査したところ下記のような投稿がみつかりました。

「WordPressは404の時、ヘッダーに “Cache-Control:no-cache, must-revalidate, max-age=0″ を付けてレスポンスを返す」
参照：http://cloudrop.jp/wordpress/more_tuning_on_nginx

wp-includes/class-wp.phpのソースを改変する方法が書かれていますが、出来るだけソースは触りたくないので、フックしてこれらのheaderを削除するようにします。

functions.phpに以下のフックを追加しましょう。

```php
function remove_nocache_on_404(){
    if(is_404()){
        header_remove("Pragma");
        header_remove("Cache-Control");
        header_remove("Expires");
    }
}
add_action('wp','remove_nocache_on_404');
```

こうすることでnginxでキャッシュがかかるようになりました。
注文一覧の本番環境とテスト環境の違いについて

![uploading Yahoo! - 403 Forbidden-20150311161033.png...]()
APIを通して商品登録はできました。
そこで注文を起こして、注文一覧を取得しました。

テスト環境では、商品登録も注文一覧の取得も問題なくできました。
しかし、同じプログラムを本番環境に移行して実行すると
1. 商品登録はできます。(認証も問題ないです)
2. 注文一覧も取得をすると403エラーを返します。

なぜでしょう？
しかもXMLエラーが返ってくるのではなく、HTMLで返ってきます。
認証の問題ならXMLで返ってくると思うのですが違うのでしょうか？

ご教授願います。
SoftLayerの無料ベアメタルでOpenStackの学習をする(1) - 環境の用意

[次回はこちら](http://qiita.com/orz/items/bb23d01b3f05b734ae5f)
***
# はじめに

OpenStackの学習をしようと思っていたところ、[OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門](http://www.shoeisha.co.jp/book/detail/9784798139784)が出たので購入。
![OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門](http://www.seshop.com/static/images/product/17681/L.png)

HPのパブリッククラウドでの構築の説明もあるが、やはり実機でテストしたい。実機の環境にはSUSE Cloud、Red Hat RDO、DevStackから選べるようになっている。ただ、32GBのメモリーを積んだマシンを想定した記述だ。本文には16GBなら仮想マシンのメモリーを半分にしてねと書いてあるが、自由に使えるのは、8GBのノートPCぐらい。

そこで、思い出したののがSoftLayerの\$500キャンペーン。[SoftLayerはIBMの子会社のクラウド屋さん](http://www.ibm.com/cloud-computing/jp/ja/softlayer.html)。新しいデータセンターができると、そのデータセンターの最初のオーダーから\$500を引いてくれる[(このリンクは2015-03-31までの東京だけど、シドニーとか他にもある)](http://www.ibm.com/cloud-computing/jp/ja/softlayer_tokopen.html)。しかもベアメタルといって仮想マシンではなく、サーバーを一台まるごと貸してしてくれる。月額\$500以下のマシンをオーダーして、次の月締め日(アニバーサリーデート)までにキャンセルすれば、完全に無料のはずだ。
会社の指定ソフトが入っていないノートだと、会社のLANにつなげられないので、自宅でしか学習できない。クラウドに環境を作れば、自宅からでも会社の空き時間でもテストできる。これしかない。

# SoftLayerのベアメタルをオーダー
SoftLayerのアカウントは、前に[30日間クラウド無料トライアル](http://www.ibm.com/cloud-computing/jp/ja/softlayer_freecloud.html)作っていたので、早速オーダー。

* ベアメタルをマンスリーでオーダー
  
![01-01.png](https://qiita-image-store.s3.amazonaws.com/0/71995/74178f1d-225a-4956-8d50-ca08ecd793c8.png)

* 32GB可能な一番安いサーバーを選択

 ![01-02.png](https://qiita-image-store.s3.amazonaws.com/0/71995/f5f93766-5f1b-5f10-1140-898fd38139b6.png)

* 2015/03末までクーポンが利くのは、東京・メキシコ・フランクフルト。今回はフランクフルトを選択
![01-03.png](https://qiita-image-store.s3.amazonaws.com/0/71995/87f4e5e9-5a64-685f-6a97-341dd4da5ca6.png)

* メモリーを32GBに変更。これが、本体より高い
![01-04.png](https://qiita-image-store.s3.amazonaws.com/0/71995/c8b5e00c-b877-8ae5-aeb8-6a7a301ff85c.png)

* 無料のUbuntu 14.04
この本はNested KVMでの構築になる。CentOSも無料だけとNested KVMがデフォルトでオンではないらしいのでデフォルトでオンのUbuntu 14.04を選択。この本のRDOはFedora 19、DevStackはUbuntu 14.04を前提としているので、その意味でもUbuntu 14.04を選択

![01-05.png](https://qiita-image-store.s3.amazonaws.com/0/71995/50eb7488-db41-67b7-0744-f74bad942d36.png)

* お金がないのでDiskはそのまま

![01-06.png](https://qiita-image-store.s3.amazonaws.com/0/71995/161f519a-4e51-e60a-fefb-e0489ddc7978.png)

* いい感じの金額になったので

![01-07.png](https://qiita-image-store.s3.amazonaws.com/0/71995/19395adb-3707-621b-c58f-e321c00cb6d8.png)

* フランクフルト用のプロモコードを入力して、\$0のオーダー

![01-08.png](https://qiita-image-store.s3.amazonaws.com/0/71995/faa0990c-fe7d-be3b-08f5-77da532c1390.png)

デプロイをしばらく待つ。

***

Softlayerではアニバーサリーデートという月締めで料金が請求される。何日になるかは、最初のオーダーで決まる。月額料金のサーバーを月の途中でオーダーすると、次のアニバーサリーデートまで日割りで件際される。プロモ前のMonthly金額が本当の月額で、Prorated Totalが日割り後の今月の料金。
\$500のプロモーションが利くのは、今月分のみ。アニバーサリー直前にプロモでオーダーをすると、もったいない一方、期間は短くてもいいから高スペックをダダで使いたい場合は、日割り後に\$500以下になるように調整すればいいはず。

***
[次回はこちら](http://qiita.com/orz/items/bb23d01b3f05b734ae5f)
配列の並び替え

```php:配列の並び替え
$array = array(
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

echo "\n";

$sort = array_fill_keys(array('b', 'd', 'a', 'c'), null);

$array = array_merge($sort, $array);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}
```

```bash:結果

a : 1
b : 2
c : 3
d : 4

b : 2
d : 4
a : 1
c : 3

```


***

配列を`foreach`で回してテーブル作成などをよくします。
しかしデータベースのカラム順が良くなかったり、SELECT順を操作出来なかったり、後から表示順を入れ替えてほしいと言われたりすることがある。
表示順のキー配列を別途用意し`foreach`して出力することもできるが、出力対象自体を繰り返してないので違和感があるし、viewに余計な変数も渡したくはない。
そこで配列を直接並び替えようと思ったが、それらしい関数も記事も出てこず、昇順・降順の並び替えばかり引っかかってしまう。

普通に代入や`foreach`でも出来ると思うが、`'' => ,`を書いたり縦にスペースが取られるのが嫌だし、`foreach`も簡単なものでも読むのが結構しんどいので楽にしたかった。

ただし、`array_merge`は数値添字に使うと振り直しが起きるので文字列の連想配列にしか使用できない。

もっと楽にできるならしたい。

# 追記
## それ、`array_replace`で出来るよ

`array_merge`を上書きすることで並べ替えが出来ると言う意図で使っていたが、数値添字が振り直される問題があった。*最初の配列の値を後の配列の値で置き換える*のならば`array_replace`がある。
これならば数値添字にも対応できる。
[array_replace](http://php.net/manual/ja/function.array-replace.php)

```php:問題のある並び替え
$array = array(
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
    1   => 100,
);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

echo "\n";

$sort = array_fill_keys(array(1, 'b', 'd', 'a', 'c'), null);

$array = array_merge($sort, $array);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}
```

```bash:結果

a : 1
b : 2
c : 3
d : 4
1 : 100

0 :
b : 2
d : 4
a : 1
c : 3
1 : 100

```

`array_merge`では同じ数値添字は追加のうえ値の振り直しが起きる。

`array_replace`ならば数値添字もそのまま。

```php:array_replace
$array = array(
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
    1   => 100,
);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

echo "\n";

$sort = array_fill_keys(array(1, 'b', 'd', 'a', 'c'), null);

$array = array_replace($sort, $array);

foreach ($array as $key => $value) {
    echo "$key : $value \n";
}

```

```bash:結果

a : 1
b : 2
c : 3
d : 4
1 : 100

1 : 100
b : 2
d : 4
a : 1
c : 3

```

今回は他の記事で`array_replace`が出ていて気になったから気づけたが、「`array_merge`で出来たから振り直しは許容しよう」と思っていたので自戒の意で`array_merge`は残す。また`array_merge`でやりそうだし。

しかし、`array_replace`はこの数値添字の動作を変えただけの`array_merge`なのだろうか。手元の書籍には`array_replace`についての記述がないし、ドキュメントの書き方も対になっているような記述じゃないし…
MySQLのrootパスワードの変更


# 目的

1. 開発用でパスワードなしで接続したいとき
2. rootのパスワード変更したいとき

# 手順

```bash
$ mysql -uroot -p
Enter password:
```

```bash
mysql> use mysql
mysql> update user set password='' where User='root';
mysql> flush privileges;
```

```bash
$ mysql -uroot
```

出力結果

```bash
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.6.23 Homebrew

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
サイコロの展開図


```cpp:hena29.cpp
// http://qiita.com/Nabetani/items/4c21127f07bfa68fa1f8
// http://nabetani.sakura.ne.jp/hena/ord29devdice/

#include <iostream>
#include <string>
#include <set>
#include <regex>
#include <algorithm>
#include <functional>
using namespace std;

char rot_face(char f){
	string key="D2T3S6114455";
	int idx=key.find_first_of(f);
	if(idx==string::npos)abort();
	return key[idx^1];
}

string rot_dice(const string&s){
	return string()+rot_face(s[5])+s[0]+s[1]+'/'+rot_face(s[4])+rot_face(s[2])+rot_face(s[6]);
}

string rev(string s){ //参照渡し不可
	reverse(s.begin(),s.end());
	return s;
}

bool enum_patterns(set<string>&pattern,function<bool(string)>&blk,string c="146/53D"){
	if(pattern.find(c)!=pattern.end())return true;
	pattern.insert(c);
	if(!blk(c))return false;
	if(!enum_patterns(pattern,blk,rev(c)))return false;
	if(!enum_patterns(pattern,blk,rot_dice(c)))return false;
	return true;
}

int main(){
	string src;
	for(;getline(cin,src);){
		string target=src;
		for(int i=0;i<target.size();i++)if('w'<=target[i]&&target[i]<='z')target[i]='.';
		regex re(target);
		string answer;
		set<string>pattern;

		function<bool(string)>blk=[&](string s)->bool{
			if(regex_match(s,re)){
				if(answer.empty()){answer=s;return true;}
				return false;
			}
			return true;
		};

		if(!enum_patterns(pattern,blk)){
			cout<<"many"<<endl;
		}else if(answer.empty()){
			cout<<"none"<<endl;
		}else{
			string ret;
			for(int i=0;i<src.size();i++){
				if(src[i]!=answer[i]){
					if(!ret.empty())ret+=',';
					ret=ret+src[i]+'='+answer[i];
				}
			}
			cout<<ret<<endl;
		}
	}
}
```
Macでリモートへファイル転送



Mac において、WinSCPのようなツールが見当たらないので、コマンドラインにてリモートホストへファイル転送または取得する為の覚え書き。

```
scp ファイル名 ユーザ名@リモートホスト名:転送先ディレクトリ名
password : xxxxxx 
```


サーバからファイルを取得することも可能。

```
scp ユーザ名@リモートホスト名:転送元ディレクトリ名/ファイル名 .
password : xxxxxx 
```
PHPのbase64_encodeをURLで使用する場合に記号を%に変換しない方法

# 概要
URLのGETでbase64_encodeを渡わたす場合は、**+記号(プラス)**[^1]を**%2b**、**/記号(スラッシュ)**を**%2f**に変換するのですが、**%?**が入るとURLが長くなるので変換されない方法を調べました。

[^1]: **+記号(プラス)**をURLに直接入力すると**スペース**とみなされます。

# 方法
エンコード時に**+記号(プラス)**と**/記号(スラッシュ)**を**%(パーセント)**に変換されない記号(**-記号(マイナス)**, **_記号(アンダーライン)**)に変換し、デコード時に元に戻します。ソースは、公式サイトに書いていました。

```php:base64url.php
<?php 
function base64url_encode($data) { 
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
} 

function base64url_decode($data) { 
  // = 埋めしなくてもいける
  return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); 
} 
```
[参考](http://php.net/manual/ja/function.base64-encode.php#103849)


# 記号が発生するコード
**+記号(プラス)**、**/記号(スラッシュ)**が発生する文字列を調べると、`248,249,250,251,252,253,254,255`の文字コードで記号が発生しました。

# base64とは
簡単に調べました。

64文字にデータを変換します。URL非対応は**+記号(プラス)**と**/記号(スラッシュ)**です。文字数を4の倍数に調整する為**=記号(イコール)**を末尾に追加します。

**使用する64文字**

分類|内容|文字数
---|---|---
大文字|A-Z|26文字
小文字|a-z|26文字
数字|0-9|10文字
記号|+/|2文字



```php:main.php
<?php
// 248,249,250,251,252,253,254,255 が、記号が発生する
$a = pack('C*', 248);
$b = base64_encode($a);
var_dump(array(
    $b,
    base64_decode($b)
));
```
```:output
array(2) {
  [0] =>
  string(4) "+A=="
  [1] =>
  string(1) "ø"
}
```

# 注釈
Azure CLIとjqでPublicなLinux VMイメージのリストを取得する

# Azure CLIのインストールと設定
こちらを参照ください
http://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli/

# jqについて
こちらを（ｒｙ
http://stedolan.github.io/jq/

# コマンド

```shell-session
azure vm image list --json | jq '. | map(select(.category=="public", .operatingSystemType=="Linux"))'
```

# MSさんに一言
標準イメージのIDが欲しかっただけなので、WebコンソールのVM起動画面の端っこにでもイメージID書いておいてくれても良いんですよ…
scala - split

文字列分割

カンマで分割

```scala
scala> "a,b,c" split ","
res96: Array[String] = Array(a, b, c)
```

Stringを渡すと正規表現なので

```scala
scala> "a,b,c" split "[,]"
res97: Array[String] = Array(a, b, c)
```

Charで渡すとエスケープしてくれるので、Char使おう。

```scala
scala> "a,b,c" split ','
res98: Array[String] = Array(a, b, c)
```

なので｜とかで分割したいときはStringだとできない。

```scala
scala> "a|b|c" split "|"
res99: Array[String] = Array(a, |, b, |, c)
```

Charで

```scala
scala> "a|b|c" split '|'
res100: Array[String] = Array(a, b, c)
```

Array[Char]で複数指定

```scala
scala> "a|b,c" split Array('|', ',')
res101: Array[String] = Array(a, b, c)
```

結局は正規表現になるのでこれと同じ

```scala
scala> "a|b,c" split "[|,]"
res102: Array[String] = Array(a, b, c)
```
正規表現の後方参照を用いて、重複した文字列を見つける方法

文字列から重複した部分を抽出したい時、ありますよね。
この方法を知っていれば、for文を用いて難解なロジックを組まずとも解決出来ます。

## サンプルデータ

住所の正規化を行う際に、大字の前後に同じ文字列が入ることがあります。
今回は次の住所を例に正規表現を紹介します。

* 入力：東京都日野市日野大字日野123-4
* 出力：東京都日野市日野123-4

## サンプルコード

次のように、後方参照を用いて、直前で評価された結果の文字列を`\1`と参照してマッチさせる手法を使います。

```rb
# 同一な文字列があればマッチしたものが取得できます
pry(main)> '東京都日野市日野大字日野123-4'.match(/(.+)大字(\1)/)
=> #<MatchData "日野大字日野" 1:"日野" 2:"日野">

# 同一な文字列が無いと、空文字が返ります
pry(main)> '東京都日野市日野大字ああ123-4'.match(/(.+)大字(\1)/)
=> #<MatchData "大字" 1:"" 2:"">

# 重複文字列の抽出にも応用できます
pry(main)> '東京都日野市日野市ほげほげ'.match(/(.+)(\1)/)
=> #<MatchData "日野市日野市" 1:"日野市" 2:"日野市">
```

あとはお好きなように、アレンジしてみてください。

## 併せて読みたい

* JavaScriptの動かないコード (中級編) 正規表現で同じ文字の連続を検出したい - 置換前パターン中での後方参照 - 主に言語とシステム開発に関して<br />
http://d.hatena.ne.jp/language_and_engineering/20080927/1222508705
xamppの起動方法とブラウザーとエディタの設定

動かしたらApacheの「Start」ボタンを押す
![WS_2015-03-11_002.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/149c844c-1631-1be9-a5c1-6951bdb8756c.jpeg)

そうするとこんな感じで動き出す
「Admin」ボタンを押すとブラウザでトップページが出る
![WS_2015-03-11_004.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/e12877d7-080b-e2fe-b9b6-2eb04911b207.jpeg)


ちなみにブラウザの設定とかと変更したいときは「Config」で
![WS_2015-03-11_001.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/76801861-1711-258a-4101-8f5be07e0ebb.jpeg)

Editor(エディター設定)　
Browser(ブラウザー設定)
を変更すると、好きなブラウザー、エディタが使用できます
![WS_2015-03-11_000.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/16789130-380d-6706-e976-4edc83b0c671.jpeg)