OmniAICreator/Qiita-1.07M huggingface dataset:
Google map APIで複数地点に線を引きたいとき


mapsの Polyline(polyLineOptions) を利用します。

手順としては

1. 線を引きたい座標を用意する
LatLng(35.701139, 139.797949)

2. 線を引くための各種情報をセットする
   var polyLineOptions = {}

3. 線を引く
    var poly = new google.maps.Polyline(polyLineOptions);
    poly.setMap(map);


以上3ステップ。

ちなみに今回は複数地点の座標を既に設定していたため、
線を引く際に設定が必要なpathのために再度配列化しています。
(代入するのは配列でないといけないみたいです)

```js
// 複数地点の座標
var map_data = new Array();
map_data.push({position: new google.maps.LatLng(35.701139, 139.797949), place:'東京' });
map_data.push({position: new google.maps.LatLng(10.384458,123.798679), place:'フィリピン' });
map_data.push({position: new google.maps.LatLng(60.173468, 24.941046), place:'フィンランド' });
map_data.push({position: new google.maps.LatLng(-10.688480, -75.968200), place:'ペルー' });
map_data.push({position: new google.maps.LatLng(39.625702, -100.213340), place:'アメリカ' });

//  ラインの道筋(path)を指定するために配列を作成 
//  以前のmap_dataに入れたオブジェクトを利用
var points = new Array();
for (i =0; i < map_data.length; i++) {
    points.push(map_data[i].position);
}

function initialize() {

    var mapOptions = {
      zoom: 2,
      center: map_data[0].position,
    };

    map = new google.maps.Map(document.getElementById('gt_map'),mapOptions);

  for (i =0; i < map_data.length; i++) {

    var marker = new google.maps.Marker({
        position: map_data[i].position,
        map: map,
        icon: {
                  url: "icon.png",
                  // scalesizeでアイコンのサイズを設定
                  scaledSize: new google.maps.Size(10,10)
                }
    });

  }
  //  /for

　　 // ライン情報を設定
    var polyLineOptions = {
        path: points,
        strokeWeight: 1,
        strokeColor: "#0000ff",
        strokeOpacity: "0.5"
    };

　　 // ラインを出力
    var poly = new google.maps.Polyline(polyLineOptions);
    poly.setMap(map);

}
// /initialize

 google.maps.event.addDomListener(window, 'load', initialize);
PostgreSQLのVACUUM FULLはどういう時に行うべきか？

PostgreSQLの文書を見ると、どれも基本的にはVACUUM FULLは使うなと書いてある。
作用する全てのテーブルを排他ロックするし、おまけにインデックスが肥大化するのでREINDEXも必要になる。尚、REINDEXもそのインデックスを使用する読み込みはブロックする。

なので以下のような状況の時に初めてVACUUM FULLを検討すべき。

- DBサーバのディスク容量が逼迫している
- ほとんど更新がなくなって放置されているテーブルである（外部キーとして参照したりされたりしていないこと。ロックの影響を受けそう。要確認）

例えば、アンケートの回答を保持しているアンケート毎のテーブルなど（回答はUPDATEにてテーブルに保持）。基本、アンケートは締め切りが来てしまえばそれ以降に回答が集まることはないため、参照されそうな時間を避けてVACUUM FULL、REINDEXを行う。


### 参考

https://wiki.postgresql.org/wiki/VACUUM_FULL/ja
https://www.postgresql.jp/document/9.2/html/routine-vacuuming.html
http://dqn.sakusakutto.jp/2011/11/postgresql-reindex.html
Swiftを使ってMacで動画再生するメモ(AVPlayerView)

参考： [006 動画の再生 - Swift Docs](https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/3-avfoundation/006-dong-huano-zai-sheng)

Swiftを使ってMacで動画再生するアプリを作りたいので、とりあえずAVPlayerViewというやつを使ってみた。
ほぼ上のiOS用ドキュメント通りで動いた。

StoryboardからAVPlayerViewを設置してOutletを作って以下の通りでバンドルした動画リソースの再生までできた。お手軽。

```swift
import Cocoa
import AVKit
import Foundation
import AVFoundation

class ViewController: NSViewController {

    @IBOutlet weak var playerView: AVPlayerView!
    
    var videoPlayer:AVPlayer!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // パスからassetを生成.
        let path = NSBundle.mainBundle().pathForResource("sample", ofType: "mov")
        let fileURL = NSURL(fileURLWithPath: path!)
        let avAsset = AVURLAsset(URL: fileURL, options: nil)
        
        // AVPlayerに再生させるアイテムを生成.
        let playerItem = AVPlayerItem(asset: avAsset)
        
        // AVPlayerを生成.
        videoPlayer = AVPlayer(playerItem: playerItem)
        
        playerView.player = videoPlayer
        
        videoPlayer.play()
        
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}
```

![名称未設定 2.png](https://qiita-image-store.s3.amazonaws.com/0/5235/30bc212f-e782-1fda-acc9-4d32ed255302.png)

気づいたこと

* 上ではvideoPlayer.play()してるけど、別になくても勝手に再生が始まる
    * むしろ自動再生させない方法がわからない
* 再生・一時停止、シークバー操作、タイムコードなどは特に何もしなくても動作する
* ``playerView.showsFullScreenToggleButton = true``を追加すると最大化ボタンが出てきて、実際に動作する
Start up Vagrant

## Install

仮想環境をエミュレートするツール  
[VirtualBox](https://www.virtualbox.org/)

VirtualBox などの仮想環境エミュレータをコマンドライン上から操作するツール  
[Vargrant](https://www.vagrantup.com/)

## Add box

Vagrant は仮想イメージを `box` とよばれるフォーマットで扱う。  
`box` を手っ取り早く入手するには virtualbox が公式で提供している`box` を Atlas のサイトからダウンロードする。[こちら](https://atlas.hashicorp.com/ubuntu/boxes/trusty64)  

実際には Web ブラウザからダウンロードするのではなく

`$ vagrant box add ubuntu/trusty64`

というコマンドを実行することで、ローカルの vagrant box の一覧にダウンロードされ追加される。`ubuntu/trusty64` という部分が、追加する`box`の名前を指定する部分になる。この名前を Atlas のサイトに登録されているかどうか確認し、該当するものがあれば、ローカルにダウンロードされる。

コマンド実行後は

`$ vagrant box list`

でローカルに登録された`box` のリストを確認することができる。

## Activate Linux

`box` を登録したら仮想マシンを作成し立ち上げる。仮想マシンはディレクトリ毎に管理される。  

1. 適当なディレクトリを作成し、その中に入る
- `$ vagrant init ubuntu/trusty64` で、`ubuntu/trusty64` の`box`を指定した初期化を行う
- `$ ls` で `Vagrantfile` が作成されていることを確認する。Windows なら `dir`
- `$ vagrant up` で `Vagrantfile` を元に仮想マシンを作成し起動する
- `$ vagrant ssh` で起動したマシンに login する。デフォルトではユーザ名とパスワードは`vagrant`
  - Windows の場合は TeraTerm などから、ホスト `127.0.0.1`、ポート `2222` でログインする

> Tips : Vagrantfile が box名を管理している。
>
> ```ruby
> config.vm.box = "ubuntu/trusty64"
> ```
> マシンの`box`名を設定する部分。`vagrant init <box名>` で指定したものが記載される。  
> `vagrant up` の際に、このbox名を参照し、ローカルのbox一覧にあれば、その`box`を使用する。なければ`atlas`に探しに行く。

## Control VirtualMachine

- `$ vagrant up` マシンの作成と起動
- `$ vagrant halt` マシンのシャットダウン
- `$ vagrant reload` halt と up を行う
- `$ vagrant destroy` マシンを削除する

## Configure Network 

`Vagrantfile` に仮想マシンの設定が記載されている。マシンのネットワークの設定もそこで行える。  

### NAT

デフォルトの状態ではNAT接続になっており、仮想マシンから外のネットワークには接続できるが、外から仮想マシンには接続できない。

### PortFoward

```ruby
config.vm.network "forwarded_port", guest: 80, host: 8080
```
NAT接続の状態で、特定のポートに外からの接続を受け付けたい場合には`ポートフォワード`で対応できる。`guest:` に仮想マシン(ゲストマシン) のポートを指定し、`host:` にホストマシンのポートを指定する。ホストマシンに対して指定したポートにアクセスがあると、そのままゲストマシンに指定したポートにアクセスを投げてもらう設定

### Private


```ruby
config.vm.network "private_network", ip: "192.168.33.10"
```
ホストマシン内に閉じたネットワークを形成する。仮想マシン(ゲストマシン)は一切外のネットワークに繋がらない

### Public

```ruby
config.vm.network "public_network"
```
ホストマシンと同列のLAN内に仮想マシンがあるにようする。ブリッジ接続を行う。

## Provisioning

`$ vagrant up` 実行と同時に環境構築を行うことできる。いくつかやり方があるが、`Vagrantfile` 内に shell プログラムを書いて、up 時に実行されるようにできる。

```sh
  config.vm.provision "shell", inline: <<-SHELL
     sudo apt-get update
     sudo apt-get install -y git
  SHELL
```

こうすることで、up 時に 

- `sudo apt-get update`
- `sudo apt-get install -y git`

の２つのコマンドが実行され、自動的に `git` がインストールされた環境を手に入れることができる。  
`$ vagrant provision` コマンドを実行しても、実行される。  

Provisioning は shell 以外にも chef や puppet を利用できる。
関数型プログラミングうんぬん

[とある本](http://www.amazon.co.jp/dp/4798043761)を読んでみましてメモ。
もう表紙から言って明らかに自分的に刺さらないやつだとは思ったのだけど、中身は（amazonでのレビューに反して）なかなかよかったかな。まだ半分しか読んでないけど。

こーゆー事できますよね、ていう考え方が学べたのはとてもよい。
面倒なので[gist](https://gist.github.com/kakikubo/cf3b66bf4d93c5dd4807)で。
1コマンドで端末からapkを取り出す

割とよく使うのでメモ代わりに書いておきますー
MacでNexus5 5.1でのみ動作確認しています。

これです

```bash
adb pull `adb shell pm list packages -f | sed -e 's/package:\([^=]*\).*/\1/g'|grep 取り出したapkのパッケージ名`
```

## なにをやっているのか？

```bash
adb shell pm list packages -f
```
で

```
package:/data/app/com.google.android.GoogleCamera-2/base.apk=com.google.android.GoogleCamera
package:/data/app/com.android.widgetpreview-1/base.apk=com.android.widgetpreview
package:/data/app/com.google.earth-1/base.apk=com.google.earth
package:/data/app/com.h6ah4i.android.example.materialshadowninepatch-1/base.apk=com.h6ah4i.android.example.materialshadowninepatch
package:/data/app/org.domokit.sky.demo-1/base.apk=org.domokit.sky.demo

```
こんな感じのアプリのapkのパスのリストが出ます。しかし邪魔な文字列が入っているので、それをsedで取り除きます。

```bash
adb shell pm list packages -f|sed -e 's/package:\([^=]*\).*/\1/g'
```

```
/data/app/com.google.android.GoogleCamera-2/base.apk
/data/app/com.android.widgetpreview-1/base.apk
/data/app/com.google.earth-1/base.apk
/data/app/com.h6ah4i.android.example.materialshadowninepatch-1/base.apk
/data/app/org.domokit.sky.demo-1/base.apk
```


あとは探したいパッケージ名を指定してadb pullするだけです。

２つ以上マッチすると上手く動かないので注意が必要です。(xargsにすればうまく動くかも？)
あとpecoとかにして選択してadb pullしてもいいと思います

```bash
adb pull `adb shell pm list packages -f | sed -e 's/package:\([^=]*\).*/\1/g'|peco`
```
GeoDjangoの管理画面でGoogle Mapsを使う


# なにをするの？

GeoDjangoはOpenLayersを使ってマップタイルの描画を行っており、DjangoのデフォルトでOSGeo(VMAP0タイル)とOpenStreetMapのタイルを使用することが出来る。`django.contrib.gis.admin.OSMGeoAdmin`を継承したAdminクラスを作成することでカスタマイズ出来るっぽいので試してみた。

と言ってもスニペットをまとめただけなので制限がいろいろある（後述）。アップデートしたら書き直すかも。


## カスタムクラスの定義

OSMGeoAdminを継承したクラスを書く。

```python:route/admin.py
from django.contrib.gis import admin
from django.contrib.gis.maps.google import GoogleMap

from route.models import Route


GMAP = GoogleMap(key='abcdef')


class GoogleAdmin(admin.OSMGeoAdmin):
    extra_js = [GMAP.api_url + GMAP.key]
    map_template = 'gis/admin/google.html'


admin.site.register(Route, GoogleAdmin)
```


## カスタムテンプレートの作成

`gis/admin/openlayers.html`を継承してGoogle Maps用に`gis/admin/google.html`を作成する。

```html:templates/gis/admin/google.html
{% extends "gis/admin/openlayers.html" %}
{% block extrastyle %}{{ block.super }}
<style type="text/css">v\:* {behavior:url(#default#VML);}</style>
{% endblock %}
{% block openlayers %}{% include "gis/admin/google.js" %}{% endblock %}
```

JavaScriptファイルも `gis/admin/openlayers.js`を継承して作成する。やっているのはベースレイヤを切り替えているだけ。

```javascript:templates/gis/admin/google.js
{% extends "gis/admin/openlayers.js" %}
{% block base_layer %}new OpenLayers.Layer.Google("Google Base Layer", {'type': G_NORMAL_MAP, 'sphericalMercator' : true});{% endblock %}
```


# 見た目

こんな感じの管理画面が出来る。

![Kobito.gKmh9N.png](https://qiita-image-store.s3.amazonaws.com/0/29860/954f82a7-34e9-9839-548c-2390266a74a7.png "Kobito.gKmh9N.png")


# 制限

古いスニペットを使ったためか以下の問題がある。

* Google Mapsをスクロール出来ない(!)
* Google MapsのコントロールとOpenLayersのコントロールの位置が重なっている


# 参考

* [google.html template for GoogleAdmin](https://djangosnippets.org/snippets/1145/)
* [google.js template for GoogleAdmin](https://djangosnippets.org/snippets/1146/)
* [GoogleAdmin: GMaps base layer in Geographic Admin (GeoDjango)](https://djangosnippets.org/snippets/1144/)
[C++14] 関数内で引数のinitializer_listのサイズに依存したメタプログラミング

関数に`std::initializer_list`を渡した時にサイズに依存してメタプログラミングしたい事がある。
典型的には、特定の要素数のみを受け取りたい時など。

まちがい
=======
まず、私が犯した過ちは

```cpp
constexpr void f (std::initializer_list<int> list)
{
    static_assert(list.size() == 3, "");　// error - listはconstexprじゃない
}

int main ()
{
    f({1, 2, 3}); // OKになってほしい
    f({1, 2});    // NGになってほしい
}
```

`std::initializer_list<T>::size()`はC++14からconstexpr指定されるが、fの定義内では、listはconstexprに見えないので、コンパイルエラーになる。
constexpr関数はconstexprでない文脈でも呼ばれる可能性があるので、constexpr関数内で引数がconstexprであることを前提にしたコードは書けない。

対策
====
基本的に、initializer listの構文(brace-init-list)を使って関数の実引数に`std::initializer_list`を作ってしまうとサイズをconstexprで取り出すことはできない。

ところで、関数呼び出しにinitializer listの構文を使う際は、*リスト初期化*の方法によって引数が初期化される。
また、引数の初期化の順番は[本の虫](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#dcl.init.list)に書いてある通り。
重要な事は、引数がクラスで、initializer listが空でなく、引数の型が初期化リストコンストラクタを持たない場合、initializer listは実引数リストとみなされ、展開される。

つまり

```cpp

struct foo
{
    template <typename ... Args>
    foo (Args ... args) // これが呼ばれる。
    {

    }
};

void f (foo) {}

int main ()
{
    f({1, 2, 3});
}
```

となる。

これを使えば、`sizeof...(Args)`で関数呼び出しの際の初期化リストのサイズをconstexprの文脈で取得できる。

ただし、`args`を`f`の中で使おうとすると、`foo`のメンバに渡すしかないが、`foo`のメンバの型を決めるのにinitializer listのサイズを使う事はできない。
結局、`f`の中でやりたいことを`foo`のコンストラクタに委譲するしかない。

となると最終的に次の様になる。

```cpp

template <typename Func, typename ReturnType>
struct init_list_proc
{
    ReturnType value;
    template <typename ... Args>
    constexpr init_list_proc (Args && ... args) { value = Func()(std::forward<Args>(args)...); }
};

struct f_impl 
{
    template <typename ... Args>
    constexpr int operator() (Args && ... args) noexcept // ここにやりたい処理を書く
    {
        static_assert(sizeof...(Args) == 3, "");
        return 1;
    }
};

int f (init_list_proc<f_impl, int> proc)
{
    return proc.value;
}

int main ()
{
    f({1, 2, 3}); //OK
    f({1, 2}); // NG
}

```

条件で`f`の型を変えたい場合は`f_impl::operator()`をオーバーロードして、`f`の方もオーバーロードすれば良い。
ただし、これでもまだ、`f`の返り値の型をメタプログラミングで導出する事はできない。

もっと簡単な方法がある気もする。

参考
===
[本の虫](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#dcl.init.list)
[cppreference](http://en.cppreference.com/w/cpp/language/list_initialization)
gulp をごっくんごくごく #Jade 編

## 環境
* OS X Yosemite 10.10.3

## 前提
* Node.js v0.11.16
* npm 2.3.0
* Gulp 3.8.11

## gulp-jade をインストール

```
$ npm install gulp-jade --save-dev
```

## gulpfile.js を作成

```
$ vim gulpfile.js
```

## 中身をこんな感じに

各種パスはご自身の環境に合わせてください

```js
var gulp = require('gulp');
var jade = require('gulp-jade');

gulp.task('jade',function(){
	return gulp.src(['./*.jade'])
		.pipe(jade({ pretty: true}))
		.pipe(gulp.dest('./'));
});

gulp.task('watch',function(){
	gulp.watch('./*.jade',function(event){
		gulp.run('jade');	
	});
});

gulp.task('default',function(){
	gulp.run('watch');
});
```

### 実行

```
$ gulp
```
GoでSSH Serverを立ち上げる

https://github.com/cloudfoundry-incubator/diego-ssh
は、cloudfoundryのdiegoコンテナにアクセスするためにつくられたものですが、 
これを使うことでOpenSSHを使わずに簡単にSSH Serverを立ち上げることができます。  

dockerコンテナ内でOpenSSHを使ってSSH Serverを立ち上げようとすると https://docs.docker.com/examples/running_ssh_service/ 
にあるような操作が必要で、OSによって手順が変わります。(上記はubuntuの手順)
diego-sshは依存関係のないバイナリ(10MB程度)になるので軽量コンテナとの相性がとても良いです。


```
## go getでインストール
$ go get github.com/cloudfoundry-incubator/diego-ssh/cmd/sshd

## 認証なし、2223ポートでSSH Serverを起動
$ $GOPATH/bin/sshd -allowUnauthenticatedClients -address=":2223"
```
Windowsで使用してないシリアルポートを整理する

# まず、何を言ってるのか？
Windowsは、Arduinoなどのデバイスを使用するようになると、ボード毎、また刺したUSBポート毎などにシリアルポート（COM）の割り当てられる。
その結果、ポート番号は増えていくばかり。
自分の場合、ポート番号が100を超えたので、整理してみた。

# 整理の手順

1. デバイスマネージャーをbatファイル経由で開く
2. 未使用デバイスを表示させる
3. 削除したいポートを右クリックし、削除する

## 1. デバイスマネージャーをbatファイル経由で開く

下記のバッチファイルを用意し、右クリック -> 管理者権限で実行 する。

```device.bat
set devmgr_show_nonpresent_devices=1
start devmgmt.msc
```

## 2. 未使用デバイスを表示させる
上記、バッチファイルがうまく動けば、デバイスマネージャが開くので、表示 ->  非表示のデバイスの表示 にチェックを入れる。

これで、非表示だったポート群が表示される。

![skitch.1.png](https://qiita-image-store.s3.amazonaws.com/0/10770/e76f4955-7589-b1c1-f5be-bfa7871dc02b.png)

## 3.削除したいポートを右クリックし、削除する
あとは、整理（削除）するのみ。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/10770/1b321a28-cb1b-d35f-42b7-803c0a507ff2.png)
Android端末からapkファイルを取り出す


## 検索

```コマンド
$ adb shell pm list packages -f | grep hoge
package:/data/app/com.hoge.apk
```

## 取得

```コマンド
$ adb pull /data/app/com.hoge.apk
8303 KB/s (8972567 bytes in 1.055s)

```
ある種の書籍にみられるAmazonレビューコメント評価の傾向

Amazonのレビューは集合知として興味深い観察対象である．

 いま話題になっている[「関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間」](http://www.amazon.co.jp/dp/4798043761/)という書籍，本稿ではその内容については触れないが，どうも各方面からボッコボコに叩かれている様子．それに対して，[「俺を嫌うやつらが徒党を組んで邪魔をしているんだ！」](http://kenokabe-techwriting.blogspot.jp/2015/05/title3.html)と，著者の方は見えない敵と闘っているようである．まあ，どうも実際に徒党を組んで批判している人々も多少は居るらしいのだが，その規模が数百人にも膨れ上がっているというのは大間違い．以下，同氏が「見えない敵のしわざ」であると主張している現象は，見えない敵による作為的なものでもなんでもなく，炎上案件に関してわりと普遍的にみられることであるということを説明しておきたい．
#いくつかの例
さて，問題とされている現象だが，氏の言い分はこう．

* ☆5つなど高い評価のレビューコメントには「参考にならない」が付けられている
* ☆1つの低い評価のレビューコメントには不当に「参考になる」が付けられている

それを全てのレビューコメントに対して繰り返すことで，レビュー全体，ひいては書籍自体を貶めようという「現象」が起こっているというのである．これが，（見えない敵の）悪意によって引き起こされていて，言論に対するテロ行為だ，というのだが…．
##問題のレビュー
たしかに，状況をみるとかなり悲惨なことになっていて，ちょっと可哀想ではある．
![fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/78069/22688975-530a-dc3e-f59f-b92ba2f34fed.jpeg)
##他の書籍でも似たような状況が
でもねえ，こういうケースって，他にもたくさんあるのだ．例えばコレ．
![fig2.jpg](https://qiita-image-store.s3.amazonaws.com/0/78069/2cbc1fa6-27a6-b39f-2a49-a482b7e37310.jpeg)

これなんて，もっと悲惨．2,747人中2,720人が支持してる☆1つのレビュー，どんだけ高い支持率なんだって．
##有名な著者ですら…
もっと有名な著者[^1]が書かれた書籍では，こんなのも
![fig3.jpg](https://qiita-image-store.s3.amazonaws.com/0/78069/c3de7dfc-df65-d8fb-46ad-0199a40e2def.jpeg)

「狂気のラインを超えた一冊」って，酷い，酷いよママン…．ま，それにしてもこの高支持率は，なんてこった！
#炎上作品には普遍的に見られる傾向
別の角度から論考してみよう．次のグラフ，横軸の値は「参考になった」/（「参考になった」+「参考にならなかった」），すなわち支持率を0.0から1.0までの値で示したものである[^2]．縦軸はレビューコメントの長さ．本質的には意味がないのだが，グラフを見やすくするためにとりあえず使っている．
![fig4.jpg](https://qiita-image-store.s3.amazonaws.com/0/78069/58818e93-9811-83c3-b4bc-c0d9edbba3d8.jpeg)
赤い十字は☆1つ，水色の四角が☆5つのレビューコメントで，5段階のレビューコメントがそれぞれプロットされている．先に挙げた例と異なり，この書籍では☆5つと☆1つの両極端に評価が割れていることである[^3]．さて，このグラフから，明らかに，高い評価のレビューコメントは支持されず，低い評価のレビューコメントは強く支持されるという傾向を見てとることができるだろう．
##多かれ少なかれこの傾向は存在
ようするに，これって普遍的に見られる現象なのである．次のグラフは，ちょっとややこしいのだけれども，過去のベストセラー作品に対するレビューの平均値をプロットしてみたもの[^4]．
![fig5.jpg](https://qiita-image-store.s3.amazonaws.com/0/78069/7a9fe3c1-9113-cbad-9475-f5d12654bbf0.jpeg)
レビューの平均値が1.5以下！であるベストセラー作品がある[^5]というのもオドロキではあるが，まあそれはさておくとして，横軸はレビュースコアの単純平均，縦軸は，各レビューコメントの支持率で加重平均を取ったスコアと単純平均との差である．わりときれいに右上がりになっていることにお気づきだろうか．
##根底にあるのは同調圧力
なぜこうなるかというと，低評価が多い作品においては低いレビューコメントの支持率が高く，反面，高いレビューコメントの支持率が低いので，加重平均を取ると単純平均より「より低く」なってしまうからだ．すなわち，単純平均との差分をとると，マイナスになる．それは，評価の平均値が低くなればなるほど顕著になるということが，このグラフから読みとれる．

なお，素晴らしい作品で高評価なものは，加重平均するとより高くなるという点も見過ごせない．その境界は☆4つあたりか．
#まとめ
で，結論．もうこれは日本人のサガなのでしょうがない．いわゆる，水に落ちた犬を…というやつ．見えない敵なんてものはいないのだから，仮想敵と闘っているそのエネルギーを次の作品執筆に向けてほしいものである．

参考文献：
飯尾淳，CGMレビュー評価の分布と炎上状態の関係，情報科学技術フォーラム講演論文集 11(3), 55-58, 2012-09-04 http://ci.nii.ac.jp/naid/110009622285

[^1]: TVにもよく出られてた方．最近，見なくなったなあ…
[^2]: また別の書籍についてのレビュー．これも内容とは別の観点で話題になった．炎上する条件のひとつかも．
[^3]: もっとも，☆5つのほとんどはマトモなレビューではなく，レビューに対するレビュー，メタレビューになっていたり，お遊びのレビューになっていたりして，皮肉として☆5つが付けられているものが多いのだが．
[^4]: 上記のグラフは1つの点が1レビューだったが，これは1つの点が1作品であることに注意．
[^5]: なんでそんなことが起こりえるんだろう？炎上マーケティングの底力が発揮されたのかな．
Xamarin Android PlayerでLolipopなデバイスが起動しない

Xamarinの公式AndroidシミュレーターにLolipopが追加されましたね！
→ [Lollipop Support comes to the Xamarin Android Player](http://blog.xamarin.com/lollipop-for-xamarin-android-player/)

「デバイスをダウンロードして早速起動したけど、ロード中にフリーズして起動しない」なんてことが私の環境でありました。
このとき、「Hyper-Vを無効にしないとパフォーマンスが落ちるよ」という警告を無視していたのですが、Hyper-Vを無効にして起動するとうまくいきました。
AlphaBeta探索で経路依存の値を判定する方法

# なんぞ？

AlphaBeta探索では、ゲーム木を木構造とみなして探索しているけど、現実的には合流があったりするので、それを効率的に処理するため(だけではないけど)に置換表があったりして、しかしゲームによっては辿った経路によって発動したりしなかったりするルールがあったりなんかもして、色々めんどくさいわけです。

そんなわけで、AlphaBeta探索をしていて、その時の評価値が経路に依存したものなのか否かを判定したくなったりすることもあるわけですが、割と頭がこんがらかるので、実装方法をまとめてみました。


# どうやるの？

↓こんな感じ。

* 末端では、それが経路依存な性質を持つか否かでフラグを設定する。
* ~~αを超えた場合(βカットを含む)は、αを超えた子ノードがtrueなときだけtrueにする。~~
* ~~αを超えなかった場合は、子ノードがどれか一つでもtrueならtrueにする。~~
* β以上の子ノードがあった場合、それがtrueな時だけtrue、でなくばfalseにする。[^beta]
* β以上の子ノードが無かった場合、子ノードがどれか一つでもtrueならtrueにする。[^alpha]

[^beta]: これがtrueな場合、falseでかつβカットする別の子ノードがある可能性もあるが、それを探すとMinMaxになってしまうので妥協する。falseな場合は、少なくともその手がβ以上である事が分かっているので他の手を見る必要はない。(false positive)
[^alpha]: 子ノードでのβカット時の判定がfalse positiveなので、この結果もfalse positiveになる。全ての子ノードがfalse(経路非依存)としてβカットしたなら、そのノードは経路に依存しないことは保証できている。(が、裏は真ならず)

## 間違えてました！ (2015/05/10追記)

@merom686 にご指摘頂きました。

追加で、以下の条件を満たせばbestValueが下限にはなるという知見も。

* αを超える
* αを超えた子ノードがfalse
* αを超えなかった子ノードがどれか一つでもtrue

この場合、bestValue自体は経路依存ではあるけれど、bestValue以上であることは経路に依存せず保証できているようです。

# 擬似コードで

```C++
Value AlphaBeta(SearchStack* ss, 他色々) {
    ss->isHistorical = false;

    if (経路非依存な判定) {
        return 値;
    }
    if (経路依存な判定) {
        ss->isHistorical = true;
        return 値;
    }

    for (Move move : pos.GetMoves()) {
        pos.DoMove(move);
        Value v = -AlphaBeta(ss + 1, -beta, -alpha, 色々);
        pos.UndoMove(move);

        /* ここでvが経路依存か否かが (ss + 1)->isHistorical に入ってる。 */

        if (beta <= v) {
            // βカットする場合は、その子ノードがtrueなときだけtrueにする
            ss->isHistorical = (ss + 1)->isHistorical;
        }
        if (v < beta) {
            // βカットしない場合は、子ノードがどれか一つでもtrueならtrueにする
            ss->isHistorical = ss->isHistorical || (ss + 1)->isHistorical;
        }
    }

    /* ここでは bestValue が経路依存か否かが ss->isHistorical に入ってる。 */

    return bestValue;
}
```

# 結局、何に使うの？

「経路依存な場合は置換表に入れない」とかしておくと、少しだけ気分が良くなるかもしれません。(それだけ)
Atomインストールメモ


# what is Atom

* Githubが作成しているテキストエディタ
* sublineTextに似ているが無料
* プラグインで各種拡張が可能

## 参考サイト
http://www.geeks-dev.com/atom-がヤバイ！sublimetextを余裕で凌駕してしまっていた件/
http://wayohoo.com/atom/markdown-function-of-the-atom-is-very-convenient.html

# インストール
　https://atom.io/ から zipファイルをダウンロードしてApplicationディレクトリに突っ込む


# 基本
dotinstallでいろいろ調べてみる。
http://dotinstall.com/lessons/basic_atom

- タブ型の普通のテキストエディタ
- 下メニューに文字数や文字コード、ファイルタイプなどが表示される。
- フォルダを開くと左にファイルの一覧がツリービューで表示される。
- ファイルの操作も可能
	- `⌘ - ¥`で表示非表示の切り替え
	- `CTL-0`でツリーとエディタ画面のフォーカス切り替え

- コマンドパレット
	- Shift-cmd-p
	- メニューでも可能だがいろいろな機能が実行
	- setting で設定メニュー
		- Show Invisibles → スペース表示
		- Show Indent Guide → インデントがわかる縦線
		- keybindingでキーバインドが見れる。検索も可能

- 言語ごとの設定
	- 言語ごとにパッケージが入っているのでその設定を変えれば良い
	- Snipetも便利。登録されているものがTABキーで補完できる。

- ファイル検索
	- cmd-t 今いるフォルダからファイル検索
	- cmd-b 今開いているタブのなかから検索

- テキスト検索
	- cmd-f
		- cmd-g / cmd-shift-g で次
	- 置換も可能
	- cmd-shift-f でフォルダ内検索
	- cmd-r シンボル検索。変数やメソッド名を検索できる。

- 移動
	- 逆ハットをクリックでスコープの折りたたみ
	- ctl-m 対応するカッコに移動
	- ctl-cmd-m 対応するカッコ内を全選択
	- ctl-g 行指定の移動
	- cmd-F2 でブックマーク、F2でブックマークに移動、ctl-F2で一覧

- マルチカーソル
	- cmdを押しながらクリックで複数にカーソル
		- 一気に編集。
		- 解除はESC
	- 単語を選んでcmd-dで順次選ぶ。
		- キャンセルはcmd-u
		- cmd-k は一個飛ばし
		- cmd-ctl-g で一気に選択

- 行単位の編集
	- cmd-ctl-↑ 行を移動
	- cmd-l 行を選択
	- ctl-shift-k 行を削除
	- cmd-shift-d 行を複製
	- cmd-[ / cmd-] インデント
	- cmd-Enter 行挿入
	- cmd-shift-enter 前に行挿入

- パネル分割
	- cmd-k → 矢印 で分割
	- cmd-k → cmd-矢印で移動
	- cmd-w でパネル削除

- パッケージの導入
	- setting で導入
	- コマンドパレットのinstall packages

- autocomplete plus
	- 補完機能
	- タブキーで補完できる
- file icons
	- フォルダのツリービューのアイコンが変わる

- markdown のプレビュー
	- ctl-shift-m
	- リアルタイムで表示
	- japanse wrap のパッケージを入れて、コマンドパレットからsoft warpを実行すると日本語文章も適切に折り返される。

- atom / apm⌘の導入
	- install shell commands
	- atom/apm のコマンドがインストールされる。CUIでatom を起動することができる。
	- atom : 現在いるディレクトリを対象にatomが立ち上がる
	- apm : パッケージマネージャ
		- apm list でパッケージを見る
		- apm search で検索


## 他にもいろいろ入れてみる
- vim-mode
	- vim風のキーバインド
- script
	- コードの即時実行
	- ctl-iで実行できるが、、、coffeescriptはpathが通っていないので実行できない。
	- http://qiita.com/takeyuichi/items/e32d7b4b551e434c5262 を参考に対応・・・。
XBeeのRemote AT Command Requestを使う場合の設定例

XBeeを2台用意し、送信側(TX)から受信側(RX)にRemote AT Command Requestを送り受信側のXBeeに接続されたLEDのON/OFFを制御します

## XBeeの2台の基本情報
XBee Series1を使い、Firmwareは10ecに揃えています
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/c2b2cc40-6c36-818f-3dce-f010c2bdaf6e.png)

## TX側の設定
送信側はAPIモード(Escapeあり)にするだけです
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/2cf2e410-fb11-48a7-b613-6fab038a4cf4.png)

## RX側の設定
APIモードに加え、RX側にはDIO1と2番にLEDを着けているため、D1,D2を設定します
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/4c555d72-6b4c-ebed-0097-b6e711582c39.png)

## 補足
### DD: Device Type Identifier
新しいXBeeでは問題なさそうですが、古いものを使っているためか、設定を工場出荷時に戻すとDDが空のためエラーになっていました。
そのため画像のRefreshボタンを押して読み取った値をTX,RXともに書き込んでいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/47e567cf-ccdc-7ba7-4495-88674f930ff2.png)

### KY: AES Encryption Key
暗号化はしないため、KYは空で問題ありません
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/1504e2dd-b54c-38fa-898c-ff3145e7704f.png)

## ATコマンド送信: XBee API Frame generator
TXから送信するデータ(API frame)を作成します。自分で組み立てることもできますが、最近のXCTUにはgeneratorが付いているのでそれを利用します。
以下の画像がDIO1にHIGHを送信する例です
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/ccf5786d-5de9-8ea1-3c6e-7bc9ca89c4e5.png)

- Frame typeはRemote AT Commandを選択
- AT commandはASCIIでD1を入力
- Parameter valueはHEXで05を入力。LOWの場合は04です
- 64,16bitともにDestination addressはデフォルトのままとしていますが、RXが複数台ある場合なども考えると基本的に設定することが望ましいです。入力する場合には64-bit dest.の欄に今回の例であればRX側のMACアドレス0013A20040B0E23Fを入力します。

### 送信例
設定が正しく行われており、XBeeが互いに通信できていれば以下の画像のようにRequestに対してResponseが返ってきます
![image](https://qiita-image-store.s3.amazonaws.com/0/53936/30efc706-857e-68b4-d9ab-2ef96ef40446.png)

## うまくいかない時に確認すること
- そもそもResponseが返ってこない場合は、XBee同士が通信できていないためTX,RXの間に障害物がある、距離が開きすぎている場合や、Destination addressを間違えているなどが考えられます。
- Responseが返ってきてはいるがLEDなどの反応がない場合は、Responseがエラーになっていないか確認して下さい。問題なければ以下のようにStatus OKとなっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/53936/8b00c67e-2b31-5f20-15f0-b38be56531e9.png)
Vagrant上のNodeアプリをChromeの開発者ツールでデバッグ

日本語の記事で探したけど見つからなかったので。


###仮想マシンのポートフォワーディング設定

```ruby:Vagrantfile

  config.vm.network :forwarded_port, guest: 3001, host: 3001

```

###node-inspectorインストール・実行

```
$ npm i -g node-inspector
$ node --debug ./bin/www
```

↑とは別プロセスで以下を実行

```

$ node-inspector --web-port=3001
Visit http://127.0.0.1:3001/debug?ws=127.0.0.1:3001&port=5858 to start debugging.

```

いんすぺくたーさんに言われた通り、
http://127.0.0.1:3001/debug?ws=127.0.0.1:3001&port=5858
にchromeでアクセスしてやると開発者ツールが動くのであとは煮るなり焼くなり。


###参考サイト
http://leolanchas.tumblr.com/post/79649181185/debugging-a-node-js-application-with
【jQuery】チェックボックスのON/OFFで、表示/非表示切り替え


チェックボックスのON/OFFで表示/非表示を切り替える。
例えば、tableのtrの表示/非表示を切り替える。

```html:html
<label><input id="hide_over_30" type="checkbox">30歳以上を非表示</label>    

<table>
  <thead>
    <th><td>名前</td><td>年齢</td></th>
  </thead>
  <tbody>
    <tr class="over_30"><td>鈴木</td><td>35</td></tr>
    <tr class="over_30"><td>佐藤</td><td>30</td></tr>
    <tr><td>斎藤</td><td>28</td></tr>
  </tbody>
</table>
```

チェックボックスが切り替わるごとに、toggle()を使いtrの表示/非表示を切り替えている。

```js:jQuery
$(function(){
  $('#hide_over_30').change(function(){
    $('.over_30').toggle();
  })
})
```
EC-CUBE 3 Version 3.0.0-beta をサーバにインストールしてみる（デザイナー／コーダーでも出来る！）

どうしてもWEBサーバ環境で新しいec-cube3 を動かしたく。。。
いろいろ探して見つけたサーバ。
新しいEC-CUBEは、根本的な部分が変わっているので、リリースされてもいちはやく対応できるように
もちろん開発部分は、プログラマーに任せるとして、やっぱりフロント側は、購買につながる箇所なので、デザイン変更、Twigのカスタマイズは、勉強の意味で必要。

#インストール可能なサーバ条件（自分の求める環境）
1. SSHが使える
2. Mysqlが使える
3. サーバのコンパネがある
4. FTP接続も可能
5. phpmyadminが使える

結果
レオサーバで試してみたらインストールできた。
ちなみにPostgreSQLを使った場合、insert data で何故かこけるので、MYSQLに変えてインストール。

レオサーバはお試し期間が１ヶ月あり無料で使える。メール関連が使えないだけで、SSHも使えるのでオススメです。
http://www.leosv.jp/

実際のサーバの稼働環境
1. phpのバージョン 5.3.29
2. mysqlのバージョン 5.0.95

#実際にインストールした手順
参考にしたのは、EC-CUBEの公式のGit
https://github.com/EC-CUBE/ec-cube
ちなみにmysqlで行ったのですが、１箇所、 eccube_install.sh ここで
権限がねーよと怒られるので
```chmod u+x eccube_install.sh
```で権限変更。

あとは手順通りにコマンド叩けば完了する。

**補足**
Coda2.5以上で、Twigのsyntax modeは、プラグインを入れることでソースの記述が楽になる。
https://panic.com/coda/plugins.php#Picks 「Serach All」のところにtwigと入れれば検索で出て来ます。

#テンプレートファイルの位置

EC-CUBE3系はSmartyを使わなくなり、Twigを利用するという発表はだいぶ前にあったが
では実際どこのファイルを編集すればいいか。。。
（あっちいったり、こっちいったりしないために）

**フロント側**
/src/Eccube/View/
**管理画面**
/src/Eccube/View/Admin
Swift ネットワーク状況の判定 オフラインか!? オンラインか!?


## 検証環境
|確認環境|
|:--:|
|iOS7 〜 iOS8.3|
|Xcode6.3.1|
|Swift1.2|

Swiftでネットワークの状況の確認をする際はライブラリを使うみたいね。
自分が試した方法を書き残します。

## 導入

まず[こちら](https://github.com/Isuru-Nanayakkara/IJReachability)からライブラリーをダウンロード

![ss 2015-05-09 19.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/40993/a3309d72-2621-d086-8fbc-42b6a228ddf4.png "ss 2015-05-09 19.59.18.png")


ほいで、解凍してくださいな。
したらば、以下のファイルがありますんで、

![ss 2015-05-09 20.05.41.png](https://qiita-image-store.s3.amazonaws.com/0/40993/d9e5c103-30a1-9bbc-6d50-f5214bd964fb.png "ss 2015-05-09 20.05.41.png")

自分のXcodeのプロジェクトファイルに **IJReachability.swift**ってファイルだけ持ってきてあげてください。

![ss 2015-05-09 20.09.16.png](https://qiita-image-store.s3.amazonaws.com/0/40993/295fe750-2535-bf98-6c54-3254d1834657.png "ss 2015-05-09 20.09.16.png")

## HOW TO

ほいで、オンラインチェックをしたいところで、以下を記述してみそ。

```Swift:AnyViewController.swift
	if IJReachability.isConnectedToNetwork() {
		println("僕らはいつも以心伝心♪")
	}
	else {
		var av = UIAlertView(title: "接続失敗", message: "オフラインの為接続できませんでした。", delegate: nil, cancelButtonTitle: nil, otherButtonTitles: "OK")
		av.show()
	}

```

---
## 余談
ちなみに、Androidのネットワークチェックはこちら↓
[Android Java ネットワーク状況の判定 オフラインか!?オンラインか!?](http://qiita.com/kntr/items/4170759ca43daab04bed)
Slack通知にTwiplaイベントの開催日カウントダウン。

Twiplaで案内されているイベントの日付取得して後何日かをSlackに通知。
SlackのサービスとRubyとCronで。

### Slack設定

WebHooksを使えるようにする。
https://XXXXXXX.slack.com/services/new

![スクリーンショット 2015-05-09 19.28.06.png](https://qiita-image-store.s3.amazonaws.com/0/9907/c60ab0ed-398e-d7a3-bdd8-8ae5bfff3a56.png)
Incoming WebHooksを+Addします。

・Post先のチャンネルを設定
・Webhook URLを控える

### Ruby
Twiplaの日付を取得してSlackへ通知する

~~~ slack.rb
require 'open-uri'
require 'nokogiri'
require 'date'
require 'curb'
require 'json'
require 'yaml'

class CountDown

  def initialize
    @config = YAML.load_file("config.yml")
  end

  def parseDate
    html = open(@config['twipla']['url']) do |f|
      f.read
    end
    page = Nokogiri::HTML.parse(html, nil)
    # タイトル
    title = page.title.split(' ')
    @title = title[0]
    # 開催日抽出
    theDate = [];
    page.xpath('//span[@class="largetext"]').children.each do |child|
      text = child.text.to_i
      if !text.zero?
        theDate.push(text)
      end
    end
    # 開催日
    date = Date::new(theDate[0], theDate[1], theDate[2])
    # あと何日
    @diff = (date - Date.today).to_i
  end

  def notification
    # ２週間以内なら通知
    if @diff > 0 && @diff <= @config['days_ago']
      # メッセージ
      message = "#{@title}まで、あと#{@diff}日ですよ。"
      payload = {}
      payload[:channel]     = @config['webhook']['channel']
      payload[:username]    = @config['webhook']['username']
      payload[:text]        = message
      payload[:icon_emoji]  = @config['webhook']['emoji']
      p payload.to_json()
      c = Curl::Easy.http_post(@config['webhook']['url'], Curl::PostField.content('payload', payload.to_json()))
    end
  end
end

slack = CountDown.new
slack.parseDate()
slack.notification()
~~~

### 設定(config.yml)

~~~ config.yml

#config.yml--------------------
---
# ツイプラ
twipla:
  url: 'http://twipla.jp/events/93420'

# Slack
webhook:
  url: 'https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZ'
  channel: '#general'
  username: 'bot'
  emoji: ':coffee:'

# 開催日の何日前から通知するか
days_ago: 14
~~~

### Cron設定

Rubyはどこにある

~~~ sh
% which ruby
/usr/local/bin/ruby
~~~

Cron設定

~~~ sh
% crontab -e
5 23 * * * cd '/home/hoge'; '/usr/local/bin/ruby' 'slack.rb'
~~~
ChefのOmnibus installerでインストールできるもの色々

Chef-Clientやknifeコマンドをインストールする時に使うOmnibus installerのinstall.shを読んでいたら、Chef-ServerやChef DKもワンライナーでインストールできるようになってるみたい。

しかし公式ドキュメントに-Pオプションのことが書いていなくて、首を傾げております。書いてないってことは推奨されないってことなのかな？便利そうなのに。
https://docs.chef.io/install_omnibus.html

この辺を読んで書き写してます。
https://github.com/chef/opscode-omnitruck/blob/master/views/install.sh.erb#L496

# chef

おなじみChef-Clientやknifeコマンド。-Pオプションを指定しないとこれが入ります。

```bash
$ curl -sL https://www.chef.io/chef/install.sh | sudo bash

$ ls /opt/chef/bin
chef-apply
chef-client
chef-service-manager
chef-shell
chef-solo
chef-windows-service
knife
ohai
```

# chefdk

Chef Development Kitですね。chefパッケージに加えてBerkshelfやTestKitchenなども入ります。その分パッケージサイズも大きめ。

```bash
$ curl -sL https://www.chef.io/chef/install.sh | sudo bash -s -- -P chefdk

$ ls /opt/chefdk/bin
berks
chef
chef-apply
chef-client
chef-service-manager
chef-shell
chef-solo
chef-vault
chef-windows-service
fauxhai
foodcritic
kitchen
knife
ohai
rubocop
```

# server

Chef-Serverってワンライナーでインストールできたんですか。

```bash
$ curl -sL https://www.chef.io/chef/install.sh | sudo bash -s -- -P server

$ ls /opt/chef-server/bin
chef-server-ctl
wait-for-rabbit
```

# angrychef

…なんぞこれ。初めて聞いたぞ。追加されるコマンドはChefと同じみたいです。ググっても良くわからない…

```bash
$ curl -sL https://www.chef.io/chef/install.sh | sudo bash -s -- -P angrychef

$ ls /opt/angrychef/bin
chef-apply
chef-client
chef-service-manager
chef-shell
chef-solo
chef-windows-service
knife
ohai
```

# container

Chef-Container関連？ 展開先が/opt/chefなので、chefパッケージと競合します。違いは詳しく調べていません。

```bash
$ curl -sL https://www.chef.io/chef/install.sh | sudo bash -s -- -P container
```
SublimeTextでjavascript実行するまでの環境構築手順(Mac)

javascriptのコードをsublimeで
実行→確認したくなった時の環境構築メモです。

前提
===
以下のサイトを参考にnvmとnode.jsをインストール
http://qiita.com/dribble13/items/e895208727c85ef9bc52

環境
===
Mac 10.10.3
Sublime Text 3

手順
===
1.SublimeTextを立ち上げTools＞Build System＞New Build Systemをします。


2.以下を追記して保存します。
（ファイル名はnode.Sublime-buildとしました)

```
{
    "cmd": ["node","$file"]
}
```

3.Preferences>Settings - User で、以下の記述を追加し、nodeのパスを通します

```
,"build_env": 
{
    "PATH": "/Users/ユーザー名/.nvm/v0.11.16/bin:$PATH"
}
```

上記手順で環境できあがったと思います^^;


あとは、実行したいファイルを開き
Tools > Build System > node を選択し
command + b とすると
実行結果が画面下部に表示されます。


good luck!
DMM mobileのAPN設定メモ

DMM mobileのAPN設定覚え書き 及び 簡易性能測定。

APN: vmobile.jp
USER: dmm@dmm.com
PASS: dmm
AUTH: PAP or CHAP

バッグボーンはdocomoで、SIMカードもドコモのピンクSIM(ドコモUIMカード バージョン5)。

OOKLA Speedtestで簡易計測を実施。(測ったらアップデートする)

|Device                |Radio Access Technology|Downlink(Mbps)|Uplink(Mbps)|RTT(msec)|計測日時|補足|
|----------------------|----------------|----|----|---|----|----|
|docomo SONY XPERIA Z Tablet SO-03E|LTE|3.82|2.00|118|2015/05/09 18:44||
|docomo SONY XPERIA SO-01B    |HSDPA|N/A|N/A|N/A|N/A|古すぎてSpeedTestインストールできず…|
|emobile HUAWEI GL01P |HSDPA|3.09|0.37|120|2015/05/09 18:59|LTEも稀に掴める|
|docomo LG L-02C |LTE|19.77|6.74|87|2015/05/31 17:50|公式接続ツールのAPNから設定可能|
Android Java ネットワーク状況の判定 オフラインか!?オンラインか!?


Androidでオフライン判定オンライン判定をしたくて検索かけてみたら色々関係無いものがいっぱい出てくるもんで、
調べ方が悪いんだろうけど。
自分のためのメモ書きって事で。

## HOW TO

まずは、マニフェストに以下の機能を使いますよって記述

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

判定クラスみたいなんを作ってそこに記述

```Java:Decision.java
public class Decision {
	// オンライン、オフライン判定
	public static boolean isConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = cm.getActiveNetworkInfo();
		if(networkInfo != null) {
			return cm.getActiveNetworkInfo().isConnected();
		}
		return false;
	}
}
```
使いたいファイルでメソッドを呼ぶそんで引数にContextを渡す

```Java:AnyActivity.java
if (Decision.isConnected(this.getApplicationContext())) {
	// 僕らはいつだって繋がっているんだ♪
}
else {
	// 繋がってへんよ〜。
}
```

---
## 余談
Swiftでのネットワークチェックはこちら↓
[Swift ネットワーク状況の判定 オフラインか!? オンラインか!?](http://qiita.com/kntr/items/d1090d064dc8d9b4ac3c)
[C++11, C++14] initializer listはテンプレート実引数推定されない

initializer listはテンプレート実引数推定されない
============================================
initializer listは、テンプレート仮引数が`std::initializer_list<T>`でない限り、テンプレート実引数推定で、`std::initializer_list`を導かない。
>14.8.2.5/5  *Deducing template arguments from a type*
>A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.

なので次のコードでは、テンプレート実引数の推定に失敗し、他にオーバーロードされた関数がなければ、関数呼び出しに失敗する。

```cpp
template <typename T>
void f (T) {}

int main () {
    f({1, 2, 3}); // f<std::initializer_list<int>>が呼ばれて欲しいが、コンパイルエラー。
}
```

ちなみに、関数の戻り値型の推定でも`std::initializer_list`は導出できない。
変数宣言での`auto`指定子を使った型推定では、`std::initializer_list`を導出できる。

対策
====
テンプレート実引数推定に頼らなければ良い。

```cpp
template <typename T = std::initializer_list<int>>
void f (T) {}

int main () {
    f({1, 2, 3}); // テンプレート実引数の推定に失敗するが、デフォルトテンプレートパラメタが代入される。
}
```

ただし、この方法では、`std::initializer_list`のテンプレートパラメタを固定しなければならない。
次の様にすれば、テンプレートパラメタを固定するタイミングを関数呼び出し時にまで遅らせる事ができる。

```cpp
template <typename S, typename T = std::initializer_list<S>>
void f (T) {}

int main () {
    f<int>({1, 2, 3}); // std::initializr_listのテンプレートパラメタを指定する。
}
```

ただし、いずれにしてもユーザーが手で型を指定しなければならないので、使い辛い。
上手い方法があれば教えて欲しい。
画像をまとめてリサイズするスクリプト


画像を一括でリサイズします。リサイズした画像はthums/フォルダ以下に格納されます。`chmod +x`してパスの通った場所におくと便利です。

## 使い方

```
$ resize 50% a.png b.png
convert -resize 50% a.png ./thums/a.png
convert -resize 50% b.png ./thums/b.png

$ resize 320x480 a.jpg b.jpg
```

## ソースコード

[mytool/resize](https://github.com/ongaeshi/mytool/blob/master/resize)


```ruby
#!/usr/bin/env ruby
# Resize images  using the ImageMagick
#
#   $ resize 50% a.png b.png
#   convert -resize 50% a.png ./thums/a.png
#   convert -resize 50% b.png ./thums/b.png

require 'fileutils'
require 'rake'

size = ARGV.shift

ARGV.each do |path|
  dst_dir = "#{File.dirname(path)}/thums"
  FileUtils.mkdir_p dst_dir

  dst = "#{dst_dir}/#{File.basename(path)}"
  
  sh "convert -resize #{size} #{path} #{dst}"
end
```
Swiftで画像をデータベースに保存と取得するときのポイント

今回はiOS8以上でswiftを使って画像をデータベースへ保存する方法とそれを取得する方法についてメモしておこうと思います。
ここでは画像データをどのように変換しデータベースに保存するか、また取得した際に画像に再変換するにはどのようにするかを取り扱いますがPOSTやJSON受け取りなどの細かな処理については扱いませんのでご了承ください。


必要なライブラリなどは特にありません。

# 環境
* xcode 6.3
* swift 1.2
* MySQL 5.5 (charset: UTF-8)

# はじめに

まずデータベースを編集します。
MySQLの場合はPHPMyAdminなどから自身の定義したテーブルに画像保存用のカラムを追加します。  
![qi1.png](https://qiita-image-store.s3.amazonaws.com/0/78060/2ade01ae-7c4c-66aa-dc3c-e813de1fcb14.png)


種別は画像の最大サイズとなり以下の種類がありますので各自の想定に合わせて設定してください。
今回はMEDIUMBLOBを選択しました。

|種別|最大サイズ|
|:--:|:--:|
|TINYBLOB|256byte|
|BLOB|64KB|
|MIDIUMBLOB|16MB|
|LONGBLOB|4GB|

準備は以上です。

# 画像をデータベースへ保存する

データベースへ送る際にはUIImageなどのままでは送信できないため一度BASE64でNSDataに変換したものをStringにし、それを送信します。


```swift
//UIImageをデータベースに格納できるStringに変換する
func Image2String(image:UIImage) -> String? {
     
    //画像をNSDataに変換
    let data:NSData = UIImagePNGRepresentation(image)
        
    //NSDataへの変換が成功していたら
    if let pngData = data {

          //BASE64のStringに変換する
          let encodeString:String =  
          pngData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
        
          return encodeString

     }

     return nil

}
```


NSDataへの変換は上記ではPNGとなっていますが *UIImageJPEGRepresentation* を使用すればJPEGも変換可能になります。
JPEGの方を使用する際には第二引数に圧縮率を入れる必要があります。


後はこの関数の戻り値がnilでなければそのままPOSTしてデータベースに格納してあげるだけで保存は完了。



# データベースから取得した文字列を再びUIImageに戻す


ここではデータベースから取得した文字列を引数にし、UIImageに変換して返す関数が必要となります。


```swift
//StringをUIImageに変換する
func String2Image(imageString:String) -> UIImage?{

        //空白を+に変換する
        var base64String = imageString.stringByReplacingOccurrencesOfString(" ", withString:"+",options: nil, range:nil)

        //BASE64の文字列をデコードしてNSDataを生成
        let decodeBase64:NSData? = 
        NSData(base64EncodedString:base64String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
 
        //NSDataの生成が成功していたら
        if let decodeSuccess = decodeBase64 {
            
            //NSDataからUIImageを生成
            let img = UIImage(data: decodeSuccess)
            
            //結果を返却
            return img
        }

        return nil

}

```

上記の関数で一番ポイントとなる点は空白を+に変換している行です。
BASE64では半角英数に加え ' / ' , ' + ' , ' = 'の記号が使用されます。しかしswift上で文字列に変換しデータベースに保存する過程で' + 'は空白にエスケープされて保存されます。そのためデータベースから取得する文字列も同様に' + 'の部分が全て空白になっているため、これらを一括して元に戻すために*stringByReplacingOccurrencesOfString*関数を利用して変換しています。

それ以降の行については送る時の逆の処理を行い、最後にNSDataをUIImageに変換する処理をしています。


使用するときはこの関数で返却された値が *nil* でなければ *UIImageView.image* に設定する、などとすれば無事画像として表示されます。
【fpp】Facebook PathPicker を使いこなそう


Facebookが新たにコマンドラインツールを公開しました。

http://facebook.github.io/PathPicker/


![fpp.gif](https://qiita-image-store.s3.amazonaws.com/0/5391/49966ff3-1e7b-ea93-7f1b-18e16cd18698.gif "fpp.gif")



`git status`などのコマンドの標準出力に表示されるファイルパスに対して操作を行うツールです。
以下の様な操作ができ、使いこなせるとかなり効率が上がります。

- `git status` のファイル一覧から複数選択して`git checkout`する
- `git diff`のファイル一覧から選択してエディタで開く
- `find`でzipファイルだけ検索し、複数選択して`scp`する



似たようなコマンドとして、`peco`, `percol`がありますが、`fpp`はファイルに特化しており、自動ファイル名検出とコマンド入力モードが特徴です。

## インストール
Macの場合はhomebrewでインストールできます

```
$ brew update
$ brew install fpp
$ fpp --help
```

Linuxやhomebrewのない環境などでは

```
$ git clone git@github.com:facebook/PathPicker.git
$ cd PathPicker
$ ln -s fpp /path/to/bin/
```

のようにcloneしてパスの通っているディレクトリにシムリンクを貼ればOKです。

### 動作環境
python > 2.6 and < 3.0 のインストールされたbash環境となっております。
zshにも対応してますが、エイリアス展開などのごく一部の機能は動作しないとのこと。
自分はzshで使っていますが特に問題は感じません。

## 使い方


ファイルを表示するコマンドにパイプをつなげて使います。
gitコマンドやfindコマンド、grepコマンドなどと相性がいいです。

使用例

- `git status | fpp`
- `git grep 'regex' | fpp`
- `git diff HEAD~3 --stat | fpp`
- `fpp . -name "*.py" | fpp` 


### ファイル選択
使用例のようにコマンド入力すると、fppは入力に対してファイルパスに相当する部分を自動検出します（図のアンダーライン部分）。[^1]
[^1]: スペースを含むもの、拡張子がないものなどは今現在は未対応なようです。https://github.com/facebook/PathPicker/issues/7
![スクリーンショット 2015-05-09 17.49.06.png](https://qiita-image-store.s3.amazonaws.com/0/5391/5ddf76b4-b63e-ed12-3109-eaf6c3a706e6.png "スクリーンショット 2015-05-09 17.49.06.png")

一番下のガイドにあるように操作は次のように行います。

- `f` : 選択/非選択
- `A` : 全選択
- `j`,`↓` : 下に移動
- `k`,`↑` : 上に移動
- `space` : 1ページ下に移動
- `b` : 1ページ上に移動
- `enter` : 開く（`$EDITOR`環境変数のエディタで開く）
- `c` : コマンド入力


`j``k`で移動しファイルを選び`enter`もしくは`c`を押します。
複数選択したい場合は、`f`で選んでから`enter`もしくは`c`を押します。
![スクリーンショット 2015-05-09 17.56.38.png](https://qiita-image-store.s3.amazonaws.com/0/5391/9521f516-9b38-734c-c77b-1d6da2b9f466.png "スクリーンショット 2015-05-09 17.56.38.png")

### コマンド入力

`c`を押した場合は更にコマンド入力画面が表示されます。
![スクリーンショット_2015-05-09_18_01_44.png](https://qiita-image-store.s3.amazonaws.com/0/5391/4d01a954-f4e9-fa02-6706-99d8d3bc7e20.png "スクリーンショット_2015-05-09_18_01_44.png")


選んだファイルに対して実行したいコマンドを入力するモードになります。
選んだファイルをコマンドの中で使いたいときは`$F`で参照できます。

コマンド例

- `git checkout`
- `git add`
- `git diff`
- `mkdir /tmp/test; cp $F /tmp/test/`
- `cat $F | wc -l`
- `scp $F server:~/backup/`

### その他 tips
- `fpp`コマンド単体で入力すると、前回の標準入力や、ファイル選択がそのまま使用されます。
EC-CUBE3 twig（テンプレートのキャッシュ制御）

# 現象

テンプレートを触って、リロードを行っても全く変更がされない。

# 原因
app/cache/twig
以下の twig のキャッシュファイルを全て削除すると、変更分が反映される。
どうも、キャッシュが優先されて、新しい変更分が反映されないらしい。

# 対応
twig の debug を true にすると、強制的にキャッシュを無効にできるらしい。

src/Eccube/Application.php 内の __construct() 内で、
debug の true, false の設定が行われているっぽい。

```lang:src/Eccube/Application.php
    public function __construct(array $values = array())
    {
        $app = $this;
        static::$app = $this;
        ini_set('error_reporting', E_ALL | ~E_STRICT);

        parent::__construct($values);

        // set env
        if (!isset($app['env']) || empty($app['env'])) {
            $app['env'] = 'prod';
        }
        if ($app['env'] === 'dev' || $app['env'] === 'test') {
            $app['debug'] = true;
        }

………

    }
```

[EC-CUBE3のデバッグモードへの変更の仕方](http://qiita.com/shinichi-takahashi/items/c73fff63580e9560a4dc)
ここに有りました。

設定ファイルで指定したい。
Node.js URLルーティングのテスト

<p>Node.jsの本やサイトを読んである程度の知識はあるものの、浅く広くぐらいしかないからURLルーティングをコードの意味を理解しながら書いてみた。</p>

<h2>簡単なURLルーティング</h2>

<div id="no_code">
 <pre>
var http=require('http');
var fs=require('fs');
var server=http.createServer();

server.on('request',function(req,res){
  switch(req.url){
    case '/index.html':
      fs.readFile(__dirname+'/index.html','utf-8',function(err,data){
        if(err){
          res.writeHead(404,{"Content-Type":"text/html"});
          res.write('Not found');
          return res.end();
        }
       
        res.writeHead(200,{"Content-Type":"text/html"});
        res.write(data);
        res.write(req.url);
        res.end();
      });
    break;
    
    case '/alissa.html':
      fs.readFile(__dirname+'/alissa.html','utf-8',function(err,data){
        if(err){
          res.writeHead(404,{"Content-Type":"text/html"});
          res.write('Not found');
          return res.end();
        }
       
        res.writeHead(200,{"Content-Type":"text/html"});
        res.write(data);
        res.write(req.url);
        res.end();
      });
    break;
    
    case '/jake.html':
      fs.readFile(__dirname+'/jake.html','utf-8',function(err,data){
        if(err){
          res.writeHead(404,{"Content-Type":"text/html"});
          res.write('Not found');
          return res.end();
        }
       
        res.writeHead(200,{"Content-Type":"text/html"});
        res.write(data);
        res.write(req.url);
        res.end();
      });
    break;
    
    default:
      res.writeHead(404,{"Content-Type":"text/html"});
      res.write('Error!');
      res.end();
  }
 
}).listen(8000);
console.log('Server is starting');
 </pre>
</div>

<p>switch使ってURL別にいちいちどのページに飛ぶかを設定するのはめんどくさい。まあ、モジュールでコードを別ファイルに分けたり、関数とか使えば楽になることは知っているが、今回は基本を理解するうえこんなめんどくて長い文を書いただけ。ストリーム使えばもっと短くなるし。</p>

<h2>今回のメモ</h2>
<p>①req.urlは「localhost:8000/html_load/index.html」の/index.htmlの部分</p>
<p>②仮に「localhost:8000/html_load/public/index.html」なら/public/index.htmlの部分</p>
【Unity】Webページ側からWebGLの関数を呼び出す

#概要

[WebGLからWebページ側の関数を呼び出す](http://qiita.com/kingpanda/items/a08b110c2bc3b1e416f1 "WebGLからWebページの関数を呼び出す")という内容の続きで、今度は逆にWebページ側からWebGLの関数を呼び出すということをやりました。
Web Playerと同様にWebページ側で記述した`SendMessage()`でそのやりとりを行います。

以下はそのサンプルの手順です

#Unity側

![スクリーンショット 2015-05-08 22.06.00.png](https://qiita-image-store.s3.amazonaws.com/0/67591/8373c861-1b1d-98d0-4697-f989b6fa4031.png)

具体的なUnityでの作業内容は説明しませんが、簡単に言うと赤玉（Sphere）を作って、それをprefab化して動的に生成されるようにします。
ボタンをクリックすれば、浮かんでるCubeから赤玉が産み出されるようなイメージです。

スクリプトは以下の通りです。これを「sample」という名をつけた空のオブジェクトにアタッチします。


```js:test

var tama : Transform;

function tamaide () {
		Instantiate(tama,transform.position,transform.rotation);
}

```



#Webサイト側

出力された「index.html」を開いて編集します。

表示さえされればいいので、適当な位置に`<button>`タグを追記


```html

<center>
      <button>スーパー玉出</botton>
</center>

```

`</body>`直前の`<script></script>`タグ内に以下のスクリプトを追記します。


```js

var s = document.querySelector("button");

s.addEventListener("click", function() {
    SendMessage("sample", "tamaide");
});

```

`SendMessage()`の第1引数に「object名」を第2引数に「関数名」で引数に渡すパラメータを指定して、「tamaide」を呼び出します。
これでボタンがクリックされる度に、赤玉が生成されて出てきます。


#実行・検証

せっかくなので動画で

[https://www.youtube.com/watch?v=V8_8INlGCCE&feature=youtu.be](https://www.youtube.com/watch?v=V8_8INlGCCE&feature=youtu.be)

[![](http://img.youtube.com/vi/V8_8INlGCCE/0.jpg)](https://www.youtube.com/watch?v=V8_8INlGCCE&feature=youtu.be)
コードリーディングをすぐに始めるためのcrコマンドを作った


[Rubyのgemのソースコードを効率的に読む方法 - ブログのおんがえし](http://ongaeshi.hatenablog.com/entry/read-a-ruby-gem-code-efficiently)を自動化するためのスクリプトを書きました。`~/.bashrc`に追加します。

```bash
# Setup Code Reading
# ex. cr https://github.com/ongaeshi/milkode.git
cr() {
    local repo=$1
    local basename=`basename $1`
    local dir=${basename%.*}

    git clone $repo
    cd $dir
    git checkout -b codereading
    
    milk add .
    milk config update_with_ctags_e true
    milk update

    pwd
}
```

## 使い方

`cr チェックアウトしたいソースコード`です。

1. git clone
2. codereadingブランチの作成
3. milkodeにデータベース追加
4. ctagsファイルの作成

をまとめて行ってくれます。

```
# .bashrcに上記コマンドを追加
$ source ~/.bashrc
$ cd ~/Documents
$ cr https://github.com/ongaeshi/milkode.git
Cloning into 'milkode'...
remote: Counting objects: 9906, done.        
remote: Total 9906 (delta 0), reused 0 (delta 0), pack-reused 9906        
Receiving objects: 100% (9906/9906), 5.59 MiB | 1.16 MiB/s, done.
Resolving deltas: 100% (4254/4254), done.
Checking connectivity... done.
Switched to a new branch 'codereading'
.
.
result     : 1 packages, 119 records, 119 update. (0.46sec)
*milkode*  : 34 packages, 8264 records in /Users/ongaeshi/.milkode/db/milkode.db.
/Users/ongaeshi/Documents/milkode
```

Milkodeデータベースの作成は要らない、タグファイルはetags派などはお好みで改造してください。
DockerをWindowsから使う (boot2docker使用)


# 事前に必要なもの

特になし！！

# Boot2docker をダウンロード

http://boot2docker.io/

「**Windows**」版をダウンロード

# Boot2docker をインストール

Boot2dockerはその作り上、

* **Virtual Box**
* **MSysGit (Windowsの場合)**

を必要とする。

これらはインストーラにも含まれているので、**事前にインストールしなくてもOK!** (逆を言えば勝手にインストールされるので、「**なんか勝手にインストールされた！**」と怒らないであげてね・・・)

Virtual Box、MSysGitもインストールを行った場合(元々インストールされていない場合)、それなり時間が掛かると思うので気長に待とう。

# Boot2docker の初期処理実行

初めにVirtual box上にイメージを作成する等の、初期化処理が必要になる。

スタートメニューから「**Docker**」→「**Boot2Docker Start**」を実行。

VMの作成等、色々勝手にやってくれる。

## start.sh と言うファイルがエディタ等で開かれてしまう場合

`MSysGit` に `.sh` ファイルが関連付いていない場合などに発生する。

もし**`MSySGit`** がインストールされていない等の場合には、別途インストールが必要。

MSysGit をインストールしたが、`.sh` への関連付けを行わなかった場合には、手動で「Git Bash」を起動し、このシェルを実行する必要がある。

例）

1. スタートメニューより「Git」→「Git Bash」
2. `cd`で、Boot2dockerをインストールしたディレクトリに移動（例：`cd C:\Program Files\Boot2Docker for Windows`）
3. `./start.sh` にて Boot2docker start を手動実行する

# Docker VMの起動

`boot2docker start` コマンドを実行する。(これは Git bash 等ではなく、普通のコマンドライン上でOK)
bashのコマンドラインに日時を挿入

# まえおき
開発や運用などをやっていると、ファイル名やディレクトリ名に、日時やホスト名などを埋め込みたいことがよくある。
例えば、数台のサーバから messages ログを収集しなきゃいけない時、ホスト名-messages-収集日 としたり、リリース物を作るなら、プロフダクト名-snapshot-日付.tar.gz とするなど。

よくある記法は ${HOSTNAME}-messages-\````date +%Y%m%d```\`のような記法だと思う。
この記法は、いろいろな意味で良い記法だと思う。汎用の手順書とかであれば尚更。

とはいえ、普段使いとしてはタイプ数が多すぎる。
なんとか楽ができないかと思って調べてみた。

# readlineでコマンドラインの編集
readline の設定を追加することで、入力中のコマンドライン文字列を編集できる。

まずは、bash で次のコマンドを叩いてみる。

```lang:.bashrc(抜粋)
bind -x '"\C-x;": READLINE_LINE=${READLINE_LINE:0:${READLINE_POINT}}$(date +%Y%m%d)${READLINE_LINE:${READLINE_POINT}}; ((READLINE_POINT+=8))'
bind '"\C-xh": "'${HOSTNAME}'"'
```

すると、```Ctrl+x;```で、カーソル位置に yyyymmdd 形式の年月日、```Ctrl+xh```でホスト名を挿入できる。

これらコマンドを ~/.bashrc あたりに仕込んでおけば、bash の入力中にかぎり横着ができる。

READLINE_LINE は入力中のコマンドライン文字列、READLINE_POINT はカーソル位置を示す変数で、それぞれを書き換えることでコマンドラインをプログラマブルに編集できる。
少なくとも bash で使用する限りにおいては bash のコマンドや、外部コマンドが使用できるため、応用範囲はかなり広いと思われる。

# 課題
使っている機能は readline の機能であるため、本来は bash 以外でも使えるはず。
そう思い、~/.inputrc に同設定を組み込んだが、同じ様には動いてくれなかった。 \# 結果は無影響
bash から読み込んだ時くらい動いても良さそうなものだが、エラーすら出ない。
もう少し、readline について調べてみる。