OmniAICreator/Qiita-1.07M huggingface dataset:
【海外】IoTソリューション(スポーツ)

## AEROPRO DRIVE PLAY (BabolaT 社)

![スクリーンショット 2015-04-20 12.16.04.png](https://qiita-image-store.s3.amazonaws.com/0/74972/55cb412c-eef2-815e-2e44-df7004781ed8.png)

http://toyokeizai.net/articles/-/47188
http://art-sports.jp/tennis/4919/

- スポーツ向けIoTソリューション
- プレー時間、ストローク数、フォアとバックの内訳などの情報をスマホに転送して分析等を行うアプリである。
- センサーはグリップに、加速度センサー、ジャイロセンサー、コントロール用IC、バッテリーを内蔵している。
- 通信方式はBluetoothを利用している。

## FULLMIERE(ACCESS社)

![スクリーンショット 2015-04-20 13.12.57.png](https://qiita-image-store.s3.amazonaws.com/0/74972/0164adde-f8d2-4e57-1c96-dcf591130d6f.png)

http://jp.access-company.com/products/smartphone/fullmiere/

- スポーツ向けIoTソリューション
- 毎秒500ポイント（9方向で4,500ポイント）の動きを捉える9軸スイングセンサーから送信されるデータを、スマートフォン上のアプリが数値解析・3D可視化を行う。
- スイングデータは独自のクラウド(FullmiereCloud) で管理していて、データの閲覧、より高度なスイングの解析、スイング比較ができる。


## PlaySight

![スクリーンショット 2015-04-20 14.43.14.png](https://qiita-image-store.s3.amazonaws.com/0/74972/cc89330e-5716-da49-006b-bf889808abcd.png)

http://www.sapjp.com/blog/archives/11148

- スポーツ向けIoTソリューション
- 選手のパフォーマンスを数値化。選手自身やコーチがその場で確認・分析することができる仕組みである。
- データ収集は、カメラ5台とネット脇のキオスク端末でサーブ/フォアハンド/バックハンドのフォームの判別ができる。
- Smart Courtを利用しているユーザーをランキング形式で表示することができる。
Yosemiteアップデートしたらmysqlが動かなくなった


10.10.3にアップデートしたら、mysql起動エラーに襲われた。

```
mysql.server start
..... ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXX-no-MBP.pid).
```

調べたらディレクトリの権限を変えれば良いという情報があったけど、上手くいかず。
エラーメッセージにあるディレクトリにいくと、以下のファイルが。

```
$ ls
xxx-no-MBP.err auto.cnf 
xxx-no-MacBook-Pro.local.err ib_logfile0                       
xxx-no-MacBook-Pro.local.pid ...
# xxxには名前が表示
```

エラーログが、xxx-no-MacBook-Proとxxx-no-MBPの２つある。中身をみると、MacBook-Proがアップデート前、MBPが後に生成されているっぽい。
xxx-no-MacBook-Pro.local.pidをコピーして、xxx-no-MBP.pidを作ったら、起動できた。

Yosemiteアップデートのせいなのか分からないが、一応解決したのでメモ。
'HttpRequest.h': No such file or directoryが出たときの対処法

1) "開発者コマンド プロンプト for VS2013"を管理者権限で実行させる。
2) `cd C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include`
3) `midl httprequest.idl`

**＝＝＝例＝＝＝**

```winhttprequest-open.cpp
#include <windows.h>
#include <stdio.h>
#include <objbase.h>

#include "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\httprequest.h"//**フルパスで記述する**

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")

// IID for IWinHttpRequest.
const IID IID_IWinHttpRequest =
{
  0x06f29373,
  0x5c5a,
  0x4b54,
  {0xb0, 0x25, 0x6e, 0xf1, 0xbf, 0x8a, 0xbf, 0x0e}
};

int main()
{
    // Variable for return value
    HRESULT    hr;

    // Initialize COM
    hr = CoInitialize( NULL );

    IWinHttpRequest *  pIWinHttpRequest = NULL;

    BSTR            bstrResponse = NULL;
    VARIANT         varFalse;
    VARIANT         varEmpty;

    CLSID           clsid;

    VariantInit(&varFalse);
    V_VT(&varFalse)   = VT_BOOL;
    V_BOOL(&varFalse) = VARIANT_FALSE;

    VariantInit(&varEmpty);
    V_VT(&varEmpty) = VT_ERROR;

    hr = CLSIDFromProgID(L"WinHttp.WinHttpRequest.5.1",
                           &clsid);

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(clsid,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_IWinHttpRequest,
                              (void **)&pIWinHttpRequest);
    }
    if (SUCCEEDED(hr))
    {
        // Open WinHttpRequest.
        BSTR bstrMethod  = SysAllocString(L"GET");
        BSTR bstrUrl = SysAllocString(L"http://microsoft.com");
        hr = pIWinHttpRequest->Open(bstrMethod,
                                    bstrUrl,
                                    varFalse);
        SysFreeString(bstrMethod);
        SysFreeString(bstrUrl);
    }
    if (SUCCEEDED(hr))
    {
        // Send Request.
        hr = pIWinHttpRequest->Send(varEmpty);
    }
    if (SUCCEEDED(hr))
    {
        // Get Response text.
        hr = pIWinHttpRequest->get_ResponseText(&bstrResponse);
    }
    if (SUCCEEDED(hr))
    {
        // Print the response to a console.
        wprintf(L"%.256s",bstrResponse);
    }

    // Release memory.
    if (pIWinHttpRequest)
        pIWinHttpRequest->Release();
    if (bstrResponse)
        SysFreeString(bstrResponse);

    CoUninitialize();
    return 0;
}
```
Docker-Composeでnet: container:serviceを試す。（続き）

# はじめに

docker-compose、ようやく1.2.0のrcが取れましたね。
というわけで、[前回の投稿](http://qiita.com/cha2maru/items/6fc8d4468db381a4f175)においてshellで無理やりやっていたネットワーク用のcontainerをdocker-composeで作るように修正してみました。

# 基本構造（おさらい）

今回作るサービスの構造はこんな感じです。
networkというコンテナはポートを外部に見せているだけで、各サービスはnetworkに相乗り（net:container:network）する形でつくります。

![コンテナ構造](https://chart.googleapis.com/chart?chl=+digraph+irc+%7B%0D%0A+++host+-%3E+network+%5Blabel+%3D+%22port%3A9000%2Cport%3A16667%22%5D%0D%0A+++network+-%3E+shout++%5Blabel+%3D+%22expose%3A9000%22%5D%0D%0A+++network+-%3E+znc+%5Blabel+%3D+%22expose%3A16667%22%5D%0D%0A+++network+-%3E+bitlbee+%5Blabel+%3D+%22expose%3A6667%22%5D%0D%0A%7D&cht=gv)

# 前回からの変更点

##  networkコンテナ

[前回の投稿](http://qiita.com/cha2maru/items/6fc8d4468db381a4f175)から追加されるnetworkコンテナの定義としては以下のようになります。

```yaml:docker-compose.yml
network:
  image: busybox
  ports: 
    - "16667:16667"
    - "127.0.0.1:9000:9000"
  tty: true
```

ポイントとしてはtty: trueを指定すること。
指定しないとbusyboxはそのまま終了しちゃいます。

##  net: container:service

net: containerの指定の仕方は基本的にあまり変わってないです。

```yaml:docker-compose.yml
znc:
  image: jimeh/znc
  expose:
   - "16667"
  volumes:
   - $HOME/.znc:/znc-data
  net: container:network
```

これまでは「net: "container:net_irc"」
とダブルクオート付きで書いていたところのダブルクオートをとっただけです。
（ダブルクオート付きだとどうなるかとかは未調査。）

# 実際のコード

```yaml:docker-compose.yml
network:
  image: busybox
  ports: 
    - "16667:16667"
    - "127.0.0.1:9000:9000"
  tty: true
znc:
  image: jimeh/znc
  expose:
   - "16667"
  volumes:
   - $HOME/.znc:/znc-data
  net: container:network
bitlbee:
  image: aostanin/bitlbee
  expose:
   - "6667"
  volumes:
   - $HOME/.bitlbee:/data
  net: container:network
shout:
  build: ./shout
  expose:
   - "9000"
  volumes:
   - $HOME/.shout:/root/.shout
  net: container:network
```

# おわりに。

前から待ち望んでいたアップデートがようやく来て、docker-composeにもっていた不満は一応解消された感じです。
複数コンテナを立ち上げないというのはあまりdocker-composeを活かしていない気もしますが、個人用途としてはnet: container:serviceのパターンは追加とかも含め便利なので試してみてくださいな。
【国内】IoTソリューション(家庭用)

## Qrio Smart Lock

![スクリーンショット 2015-04-20 11.18.06.png](https://qiita-image-store.s3.amazonaws.com/0/74972/51b1bc43-3486-f847-9086-44887f4292e2.png)

http://engineer.typemag.jp/article/qrio-saijo

- 家庭用IOTソリューション
- SONYの持っている無線セキュリティ技術を活用し、モバイル機器のアプリから住宅等の施錠、開錠ができる電子鍵である。
- 家庭や友人のみならず不動産にも応用できる。

##bocco

![スクリーンショット 2015-04-20 11.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/74972/be1eef6b-d033-8ece-51cc-402ce1136b90.png)

http://bocco.me/

- インターネット経由でスマートフォンと音声メッセージをやりとりできる。家庭内のセンサの情報をスマートフォンに通知することができる。
- 振動センサ、マグネット式の開閉センサ、光センサを提供予定である。

## GAINET(ミサワホーム)

![スクリーンショット 2015-04-27 15.09.10.png](https://qiita-image-store.s3.amazonaws.com/0/74972/ecad743c-807a-1f33-232a-663884d5802d.png)

http://itpro.nikkeibp.co.jp/atcl/news/15/042201407/?ST=iotnext

- 各戸の揺れの度合いや構造計算データ(地盤の傾きのデータ等)と照合した倒壊危険度などを、地震発生後30秒程度でクラウド上のサーバーに集約できる。
- これによって広域の被害情報を把握, 各戸の修繕の必要性なども迅速に判断できる。
- 地震計本体、3軸加速度センサーで検知できる。

## fumm (au未来研究所)

![スクリーンショット 2015-04-17 13.33.24.png](https://qiita-image-store.s3.amazonaws.com/0/74972/5972f61c-898f-83c5-47ef-adf3aa0bd6e9.png)

http://aufl.kddi.com/openlab/fumm 

- 子供靴に内蔵された各種センサー(感圧センサー、加速度センサー、気圧センサー、カラーセンサー)によって、歩く・ジャンプする・上などの子どもの動き、地面の色、走るスピードで音が変わる。
- メモ: 現状、子どものレクレーション用途だが、今後、目の障害の人のためのサポートや, 交通安全に応用できる。

## 自動給餌器 Bistro

![スクリーンショット 2015-04-17 15.41.02.png](https://qiita-image-store.s3.amazonaws.com/0/74972/a132d6fb-71ce-6448-4006-5cb6b66a0007.png)

http://catfi.com/

- 家庭向けIOTソリューション
- 水やり・ドライフードやり機能、体重計、Wi-fi接続で猫の体重、摂食状況をクラウドに蓄積して管理できる。キャットフードの栄養成分データベース有り。食事の様子を顔認識からカメラ撮影できる。
- 急な体重減少といった異変を通知していち早く健康状態の変化に気付ける。
- APIの部分をユーザー部分に公開して、最適な餌やりストラテジーやアルゴリズムをユーザー間で共有できる。
今更ながらtd-agent-1.1.20をインストールする

事情により古いバージョンのtd-agentを入れたかったのだけどやや面倒だったのでメモ。

## 2015/04/20現在のtreasuredataレポジトリには2系しか無い？

```
[vagrant@vagrant-centos65 ~]$ sudo yum --showduplicate list td-agent --enablerepo=treasuredata
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror, versionlock
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Available Packages
td-agent.x86_64    2.0.0-0.el6         treasuredata
td-agent.x86_64    2.0.1-0.el6         treasuredata
td-agent.x86_64    2.0.2-0.el6         treasuredata
td-agent.x86_64    2.0.3-0.el6         treasuredata
td-agent.x86_64    2.0.4-0.el6         treasuredata
td-agent.x86_64    2.1.0-0             treasuredata
td-agent.x86_64    2.1.1-0             treasuredata
td-agent.x86_64    2.1.2-0             treasuredata
td-agent.x86_64    2.1.3-0             treasuredata
td-agent.x86_64    2.1.4-0             treasuredata
td-agent.x86_64    2.1.5-0             treasuredata
td-agent.x86_64    2.1.5-1             treasuredata
td-agent.x86_64    2.2.0-0             treasuredata
```

1系はyumでInstallできなそうなのでrpmから入れようと思いきや

td-agent(Fluentd)をバージョン指定でインストールする - Qiita  http://qiita.com/saicologic/items/affbb4799b4a696d490f

ここを参考に手動でインストール



```
[vagrant@vagrant-centos65 ~]$ sudo rpm -ivh http://packages.treasuredata.com.s3.amazonaws.com/redhat/x86_64/td-agent-1.1.20-0.x86_64.rpm
Retrieving http://packages.treasuredata.com.s3.amazonaws.com/redhat/x86_64/td-agent-1.1.20-0.x86_64.rpm
error: Failed dependencies:
	libcrypto.so.6()(64bit) is needed by td-agent-1.1.20-0.x86_64
	libexslt.so.0()(64bit) is needed by td-agent-1.1.20-0.x86_64
	libreadline.so.5()(64bit) is needed by td-agent-1.1.20-0.x86_64
	libssl.so.6()(64bit) is needed by td-agent-1.1.20-0.x86_64
	libtermcap.so.2()(64bit) is needed by td-agent-1.1.20-0.x86_64
	libxslt is needed by td-agent-1.1.20-0.x86_64
	libxslt.so.1()(64bit) is needed by td-agent-1.1.20-0.x86_64
	libyaml-1024.so.4()(64bit) is needed by td-agent-1.1.20-0.x86_64
	td-libyaml is needed by td-agent-1.1.20-0.x86_64
```

としたのだけど、td-libyamlというのが無くてインストールできなかった。

## td-libyamlのRPM作成

そこで

treasure-data/td-libyaml  https://github.com/treasure-data/td-libyaml

こちらから

```
git clone https://github.com/treasure-data/td-libyaml.git
cd td-libyaml/
sudo ./make-rpm.sh
```
これでtd-libyamlのRPMが作成される

## td-agent-1.1.20のRPMのインストール

```
sudo yum localinstall rpmbuild/RPMS/x86_64/td-libyaml-0.1.4-1.el6.x86_64.rpm
sudo yum install libyaml
sudo yum localinstall td-agent-1.1.20-0.x86_64.rpm --enablerepo=treasuredata
```

これでインストールが通る。

```
[vagrant@vagrant-centos65 ~]$ sudo service td-agent start
Starting td-agent:                                         [  OK  ]
[vagrant@vagrant-centos65 ~]$ rpm -qa | grep td-agent
td-agent-1.1.20-0.x86_64
```
MongooseでUpsert処理

Node.jsとMongoDBを使ってUpsert処理をする場合、Native Driverなら

```js
// Collection fooにupsert処理
// _idという変数に文字列でObjectId値が入っている場合もあるし入ってない場合もある
// 入ってない場合はINSERT

db.foo.findAndModify({
_id: _id ? new ObjectId(_id) : new ObjectId()
}, ...);

```
みたいな形であとはoptionsに指定する

* remove
* new
* upsert

で更新(該当ドキュメントがなければINSERT)後の値をコールバックで取れたりしてたのですが
どうも同じ方法がパッと見でMongooseに見つからず

「えー、Modelオブジェクトからコネクション引っ張ってそこでNativeメソッド呼ぶのもやだー」としばらくドキュメントを見てたら名前が違ってるけどほぼ同じことするものがありました

[Model.findOneAndUpdate](http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate)

findAndではなくfindOneになってるのがミソですね
たいていこういう処理を強いられる対象ってfindOneですし・・・
GitコマンドでgitlabのCompare的な比較を行う

gitlabでできるCompareをコマンドでできないかと探していて

教えてもらったのでメモ。

`git log BRANCH_A..BRANCH_B`

これで、ブランチBにはあるがブランチAにはないコミットの一覧が見れる。

逆に、ブランチAにはあるがブランチBにはないコミットの一覧を見たい場合は

`git log BRANCH_B..BRANCH_A`
ビット表現を完全に保ったキャスト (C++)

# 背景

float や double のビット表現に触れたい時って多いですよね？

しかし，それらの型ではビット演算は行えません．ポインタは reinterpret_cast で変換できるのですが，値そのものは変換できません．かといって一旦ポインタを経由するのも格好悪いです．

# 作ったもの

そこで，C++11 で[覚醒した](https://www.kmc.gr.jp/advent-calendar/2013/12/23/union.html) union を使って，以下のようなキャストもどきを作りました．

```cpp
template<typename T, typename U>
union raw_cast {
 public:
  constexpr raw_cast(T t) : t_(t) {}
  operator U() const { return u_; }

 private:
  T t_;
  U u_;
};
```

# 利用例

Ideone に全体を置きました． https://ideone.com/RWLtqI

### コード

```cpp
  float a = 1.0f;
  uint32_t b = raw_cast<float, uint32_t>(a);
  cout << bitset<32>(b) << endl;
```

### 出力

```
00111111100000000000000000000000
```

# 実例

昨日公開した高速単調順位キューライブラリ radix-heap で使ってます． https://github.com/iwiwi/radix-heap
[小ネタ] pecoとdirenvでGemfileを高速で切り替える

gemを作っていて複数環境でテストを実行したり、Railsのアップデート作業中で複数のGemfileがリポジトリに含まれる事がある。
そういう時にGemfileを高速で切り替えられるようにするためのpecoの設定を作ってみた。

```zsh
function swgemfile() {
  local gemfile=$(find . \( -name "Gemfile*" -or -name "*.gemfile" \) -not -name "*.lock" -maxdepth 2 | peco)
  if [ -n "$gemfile" ]; then
    local gemfile_fullpath=$(echo ${gemfile} | ruby -r pathname -ne 'puts Pathname(Dir.pwd).join($_)')
    touch .envrc
    sed -i -e '/BUNDLE_GEMFILE/d' .envrc
    echo "export BUNDLE_GEMFILE=${gemfile_fullpath}" >> .envrc
    direnv allow .
    direnv reload
  else
    sed -i -e '/BUNDLE_GEMFILE/d' .envrc
    direnv allow .
    direnv reload
  fi
}
alias swg=swgemfile
```

BUNDLE_GEMFILEの対象をpecoで選択するのだが全体の環境変数を弄ると他のディレクトリで作業する時問題になるのでdirenvを使うようにしている。
ついでに今利用しているgemfileをプロンプトに出せるようにもしてみた。

```zsh
if type ruby > /dev/null 2>&1; then
  BUNDLE_GEMFILE_PROMPT_="%{$fg_bold[blue]%}gemfile:(%{$fg[green]%}\$(echo \$BUNDLE_GEMFILE | ruby -r pathname -ne 'begin puts Pathname(\$_).relative_path_from(Pathname(Dir.pwd)); rescue; end')%{$fg_bold[blue]%})%{$reset_color%} "
fi
```

超読み辛いw


追記:
Macだとgnu-sed入れてgsedを使うようにしないとバックアップファイルが出来てしまうので注意。
EC2(Amazon Linux)でmongodbを3.0にアップデート


まずは念のためにバックアップを取る。

```bash
mongodump --username ユーザ名 --password パスワード --db データベース名
```

または

```bash
mongodump
```

mongod を止める。

```bash
service mongod stop
```

repo ファイルを作成する
（参考：http://docs.mongodb.org/master/tutorial/install-mongodb-on-amazon/


```bash
vim /etc/yum.repos.d/mongodb-org-3.0.repo
```


```
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1
```


```bash
yum check-update
```


```
mongodb-org.x86_64                                        3.0.2-1.amzn1                                  mongodb-org-3.0
mongodb-org-mongos.x86_64                                 3.0.2-1.amzn1                                  mongodb-org-3.0
mongodb-org-server.x86_64                                 3.0.2-1.amzn1                                  mongodb-org-3.0
mongodb-org-shell.x86_64                                  3.0.2-1.amzn1                                  mongodb-org-3.0
mongodb-org-tools.x86_64                                  3.0.2-1.amzn1                                  mongodb-org-3.0
```


yum update 実行。

```bash
yum update
```

終わったら mongod 起動して終了。

```bash
service mongod start
```
AWS EC2(Amazon Linux)にrvmをインストール

```
sudo su -
```
でrootになる


```
curl -L get.rvm.io | bash -s stable
```

とするが、下記エラーが発生

```
GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.26.11.tgz' - 'https://github.com/rvm/rvm/releases/download/1.26.11/1.26.11.tar.gz.asc'!
try downloading the signatures:

    gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
```



```
curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
```

**2020-09-20**以降では下記

```
    command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
    command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
```

を実行する

再度、

```
curl -L get.rvm.io | bash -s stable
```
で、インストール完了


**完了時のログ**

```
# curl -L get.rvm.io | bash -s stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   194  100   194    0     0    593      0 --:--:-- --:--:-- --:--:--   593
100 24535  100 24535    0     0  45267      0 --:--:-- --:--:-- --:--:-- 45267
Downloading https://github.com/rvm/rvm/archive/1.29.10.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.10/1.29.10.tar.gz.asc
gpg: Signature made Wed 25 Mar 2020 09:58:42 PM UTC using RSA key ID 39499BDB
gpg: Good signature from "Piotr Kuczynski <piotr.kuczynski@gmail.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/usr/local/rvm/archives/rvm-1.29.10.tgz'
Creating group 'rvm'
Installing RVM to /usr/local/rvm/
Installation of RVM in /usr/local/rvm/ is almost complete:

  * First you need to add all users that will be using rvm to 'rvm' group,
    and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

  * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
    in all your open shell windows, in rare cases you need to reopen all shell windows.
  * Please do NOT forget to add your users to the rvm group.
     The installer no longer auto-adds root or users to the rvm group. Admins must do this.
     Also, please note that group memberships are ONLY evaluated at login time.
     This means that users must log out then back in before group membership takes effect!
Thanks for installing RVM ?
Please consider donating to our open collective to help us maintain RVM.

?  Donate: https://opencollective.com/rvm/donate
```


```
exit
```
で、通常ユーザに変更

```
source /usr/local/rvm/scripts/rvm
rvm list known
rvm install 2.2.2
rvm use 2.2.2 --default
```

.bashrcまたは.bash_profileに下記を追記する


```
. /usr/local/rvm/scripts/rvm
```

・

```
rvm use 2.2.2 --default
```
も追記してもいい


Railsを使用しているなら、rootで

```bash
gem install rails
```
Google Chromeのトラックパッドジェスチャーをオフ

2フィンガージェスチャーでの上下スクロールは便利だけれど、(個人的に)指が左右にブレると左ジェスチャーの「戻る」、右ジェスチャーの「進む」が発動してしまってちょっとうっとうしいです。

ということでジェスチャーによる「戻る」と「進む」をオフにする設定を調べました。

Mac OS X 10.9.5(Mavericks)ではターミナルを開いて

```shell-session
defaults write com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool FALSE
```

このように設定すれば左右のジェスチャーが効かなくなりました。…で、オフにしてみたのはいいけれど、やっぱりジェスチャー操作が出来ないのは少々不便…。

「戻る」と「進む」の反応をもう少し鈍くできればいいんですけど。

[Better Touch Tool](http://www.bettertouchtool.net/)でうまく設定できないものか調べ中。
最新版dockerのインストール方法

事前にパッケージからdockerが入っていたらアンインストールしておくこと。

```bash:
wget -qO- get.docker.com | sudo sh
```

```bash:dockerグループに追加
sudo usermod -aG docker ユーザ名
```

## rpiの場合

http://blog.hypriot.com
のイメージを使う。
CentOS6.8でmysql4.0.30ビルド

## ソース

* http://mirror.provenscaling.com/mysql/community/source/4.0/
* http://dbstudy.info/mysql/4.0.30/

## configure確認

```bash:
VISUAL="grep configure" mysqlbug
```

> Configure command:

を確認。

## ビルド環境

```bash:起動
sudo docker run -it -d centos:6 /bin/bash
sudo docker exec -it e9 /bin/bash
```

* [Dockerfile - mysql4.0php5.3centos6](https://github.com/tukiyo/mysql4.0php5.3.el6)
* [[CentOS6] checkinstallでrpmを作る - Qiita](http://qiita.com/tukiyo3/items/a30b604f35271be4e525)
    * /root/rpmbuild/RPMS/x86_64/opt-mysql4-4.0.30-1.x86_64.rpm
しょうがなく会社貸与のwindows PCで現実的な仮想rails開発環境を構築する


##背景
会社貸与のパソコンがwindowsなため、railsの開発ができない
（できなくはないが、windowsで構築するとトラブルだらけで現実的ではない・・・）

##どんなrailsの開発環境を構築するか

仮想環境

- vmware playerは商用利用不可（VMWARE player Proは有償で商用利用可）なので、VirtualBoxの方がいいかなと。最近、vagrantも流行っているし

OS

- クライアントOSとしてのLinuxであれば、ubuntuが無難

## rails開発環境構築方法

下記1,2のどちらかで構築する
1. bitnamiのruby-stackを利用
2. 自力で構築

###1. bitnamiのruby-stackを利用

railsに関係するライブラリ、DBサーバ等をインストール済みなので、便利かなと思い、当初、「1.bitnamiのruby-stackを利用」で構築しようとしたが、意外と、変なところで、ハードルが高かった。

- GUI環境が入っていない
- GUI環境を入れたらguestユーザしかログインできない

	useradd hogeuser
	passwd hogeuser
	でユーザを作成した
	/home/hogeuserのディレクトリがない　
　
	Ubuntu でユーザを追加するときは、useradd ではなくadduser を使わないといけない。useradd はホームディレクトリが作られない模様。または、useradd hogeuser -mを使う。


- ターミナルが起動しない
　アプリを検索してもない
　Ctr+Alt+Tでターミナルが出たけれど・・
- 日本語も入っていない
  日本語のWebアプリ作るのに必要でしょう・・・
- なんか重い

ということで、あきらめ

### 2. 自力で構築
自力で構築と言っても、ubuntuの日本語版を利用
https://www.ubuntulinux.jp/download/ja-remix-vhd
で仮想ディスクのイメージをダウンロード

あとは、こちらを参考に・・・
http://www.d-wood.com/blog/2013/09/25_4699.html

http://ksino.hatenablog.com/entry/2014/10/22/225750


## rbenvのインストール
brew install rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
brew install ruby-build rbenv-gem-rehash

## ruby-buildの最新化

rm -rf ~/.rbenv/plugins/ruby-build
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

## ruby インストール
source ~/.zshrc
brew link readline --force
export CFLAGS=-Wno-error=shorten-64-to-32
CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=`brew --prefix openssl`" RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.5
rbenv global 2.1.5
ruby -v


動作も悪くないので、これが正解ぽい
reiny v0.3.4時点の新機能


[reiny - Reactに最適化したテンプレートエンジンを作り始めた - Qiita](http://qiita.com/mizchi/items/130ab8feae8fd52c96b4 "reiny - Reactに最適化したテンプレートエンジンを作り始めた - Qiita")で紹介したreiny、どんどんバージョンあげてて今0.3.4。

[mizchi/reiny](https://github.com/mizchi/reiny "mizchi/reiny")

発表時点からの細かい改良点は無限にあって列挙できない、というか元がバグりまくってたので、ひたすら直していた。

とはいえだいぶ動くようになったので、v0.3.4時点でのめぼしい機能を紹介したいと思う。コメントが怪しい以外はちゃんと動いてると思うが、実験的な段階は脱していない。


中身の詳細はここに。 [reiny開発メモ - mizchi's blog](http://mizchi.hatenablog.com/entry/2015/04/19/191313 "reiny開発メモ - mizchi's blog")

## Natural Inline Style

次のように比較的自然なCSSを記述できるようになった。

```
.container {
  background-color: #eee
  width: 640px
  height: 100%
}
```

会社でこれ頼むと言われた。今まで通りの `backgroundColor = 'red'` みたいな書き方もできる。url()だとかシステムカラーとかはサポートしていない。

システムカラー、列挙が面倒という理由はあるんだけど、見た目から変数と区別できないことと、文字列で与えるという必要十分な回避策があること、そしてちゃんと開発しているとそもそもシステムカラーは使わないのが理由。

pegjsで書いていて嬉しい理由の一つに、ググればそこら辺にパーサが落ちてて、公式のリポジトリにもjavascriptパーサとcssパーサがあるので、必要なら持ってくればよいってのがある。

## Inline PropTypes

このテンプレートがどういうプロパティを要求してるか、テンプレート内部で宣言できるようにした。内部的にはReact.PropTypes を使っている。

```
@greeting: string
@items: number[]?

.foo(
  data-id = @foo
)
```

実行する側はこんな感じ

```js
global.React = require('react');
var template = require('./template');
var C = React.createClass({
  propTypes: template.propTypes || {},
  render: function(){
    return template(this.props);
  }
});

console.log(React.renderToStaticMarkup(
  React.createElement(C, {greeting: 'hello', items: [1, 2]})
));
```

template.propTypes に型情報が入っているというだけ。

## InlineCodeの記法

最初はmarkdown(gfm)と同じバッククオート3つでコードブロックにしてたけど、markdownに貼る時に相性最悪で結局 `---` をリーダーにした。

```
---
var foo = 1;
var bar = 2;
---

- var baz = 3;
```

一行のコードは react-jade と同じ記法。---markdown みたいな感じでここで登録したプリプロセッサに渡す、みたいに出来るとかっこいい気がしているが、シンタックスハイライターを作ろうとすると死ぬ。

## 既知の不具合

- コメントが上手くパースできない。動かねーと思ったらコメントを消すと解決したりしていて、よろしくない。どうにかしたい。

## 実装案

- Inline CSSからcss/scssを生成する。開発時に雑に書いて、あとでちゃんと移行する用途に使える気がしている
- atom用のシンタックスハイライターを提供する
- 完全なexpressionパーサを備える。かなりプログラミング言語に近くなるが、メンテが必要な領域も増えるので考えもの。

より良いテンプレートエンジンを求めて拡張していくと、自分自身が言語として機能するようにする方向性になってしまうの、結局人類はPHPに至るのか、という気持ちが若干あり、ややつらい気持ちに。

## こんな機能がほしい！

[Issues · mizchi/reiny](https://github.com/mizchi/reiny/issues "Issues · mizchi/reiny") までどうぞ
SQLアンチパターン@Rails②物理設計

パターン9:丸め誤差(ラウンディングエラー)
==
```
t.float value_wanted_precision
```
###解決策
####decimal型を使用する
```
t.decimal valuewanted_precision
```
ちなみにRailsのmigrationで指定できる型は、
http://stackoverflow.com/questions/17918117/rails-4-datatypes
とある(Rails4)。特にMySQLには厳しくて、unsignedとかもわざわざ[有識者が作ったgem](http://qiita.com/kamipo/items/11b55caf329210923a9a)を入れないといけないので注意。

パターン10:31のフレーバー(サーティワンフレーバー)
=

```
t.string salutation
(上に入る値をMr,Mrs,Ms,Drなどに限定したい)
```
DBにはCHECK制約というものがあるが、Railsのmigrationには存在しない。そのため、アプリケーションフレームでバリデーションする必要がある。したがってこのアンチパターンはそのまま引っかかるわけではない。
ただ、その値をハードコーディングするべきか、という話はある。
たとえばenumっぽく[こんなこと](http://www.techscore.com/blog/2014/03/07/rails-4-1-0-active-record-enums/)はできる。

```
enum salutation: %i(Mr Mrs Dr)
```
しかし、これはアプリケーションコードなので拡張性がよくない。そこで、DB構造にそれを移す。

```
create_table :salutation do |t|
   t.string :salutation_name
end

create_table :people do |t|
   t.string  :name
   t.integer :salutation_id
end
```
とすれば、簡単に（データ挿入で）拡張できる。ただし廃止の際はデータを消去すると整合性がなくなるので、廃止であるという情報をデータ型に加える、というのが良い。

```
@ salutation table
t.boolean :is_deprecated
```
的な。

パターン11:幻のファイル(ファントムファイル)
=
外部のファイルなどをデータとして持つ際に、ファイルパスではなくファイルそのものをDBに格納すべきだという話。さすがに賛否両論あると思う。


ただ、パス方式をとった場合、そのパス先の画像に対しての参照整合性は自分が保障しなければならないので、DBの機能を利用したほうがいいという主張はある程度納得出来る。

パターン12:闇雲インデックス（インデックスショットガン）
=
「とにかくINDEXだ！！！」みたいな。インデックスによる理解の間違いが招く自体っぽい。ちょっと考えると、もしインデックスがとにかく貼ったほうがいいようなものなんだったら最初から機能に組み込まれているべきで、そうでないのなら何かしらの選択要素があるはずだ、くらいは考えても然るべきだと思う。

```
(ridgepoleの例より)
add_index "child", ["parent_id"], name: "par_ind", using: :btree
```
要するにindexは「貼るべき」カラムにのみ貼られるべきだ、というだけのお話。選択制が高くて、更新頻度の低いカラムにのみ貼られるべき。
インデックスの利用については各RDBSシステムに依存するのでここでは書かない。

②章終わり。
既存のrailsプロジェクトを引き継ぐことになった際のポイント



##README.mdを読む
プロジェクトの概要、インストール方法が書かれている
ただし、内容とソースが乖離している可能性があるので、更新日などを注意する。

##Gemfileを読む
どのアプリケーションサーバ、データベースサーバを使っているのかがわかり、必要に応じてサーバソフトウェアをインストールする。

## /config/routes.rbを読む
どんなresource(対象)がいて、resource(対象)間の階層構造のつながりを把握する。
どんなURLがあるのか把握する。

複雑で追いにくい場合は、rake routesを実行して、
resource(対象)に対して、どんな操作（参照、登録、更新、削除）があるのかをざっと把握する。

## データモデルを把握
db/schema.rbを読む。
複雑なデータモデルであれば、
rails-erdでER図を作ってモデルを把握する。
RubyMineを使っていたらDiagramで表示する方が手軽にできる。

## 実際に動かしてみる
ソースを追って挙動がわからない場合でも、renderで何を描写しているか、どういうSQLが発行されているか等が、ログに出力されるので、動かして、ログを見る

## 最終的に個別のaction、modelを見る
VirtualBox 5 beta 2 を Ubuntu 15.04 で動かした

# インストール

## 準備

http://dlc-cdn.sun.com/virtualbox/5.0.0_BETA2/index.html から
`VirtualBox-5.0.0_BETA2-99573-Linux_amd64.run` をダウンロード

今入っているvirtualboxを削除しておく

```bash:
sudo apt remove virtualbox*
```

## install

```bash:
$ chmod +x VirtualBox-5.0.0_BETA2-99573-Linux_amd64.run 
$ sudo ./VirtualBox-5.0.0_BETA2-99573-Linux_amd64.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox for Linux installation............
VirtualBox Version 5.0.0_BETA2 r99573 (2015-04-14T18:46:55Z) installer
Installing VirtualBox to /opt/VirtualBox
Python found: python, installing bindings...
Building the VirtualBox kernel modules

VirtualBox has been installed successfully.

You will find useful information about using VirtualBox in the user manual
  /opt/VirtualBox/UserManual.pdf
and in the user FAQ
  http://www.virtualbox.org/wiki/User_FAQ

We hope that you enjoy using VirtualBox.
```

## vboxusersグループに追加

* usbデバイスを利用する場合はvboxuserグループに追加しておくこと！！

## Extension Packのインストール

`Oracle_VM_VirtualBox_Extension_Pack-5.0.0_BETA2.vbox-extpack`をダウンロードし実行。

# 新設定

## Paravirtualization

![para.png](https://qiita-image-store.s3.amazonaws.com/0/25728/46a60b06-8600-8c0f-491c-cf64be13bb66.png)

## usb3.0 サポート

![usb3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fc0af0e0-d56d-4bd8-c9e6-7c0f3de843a6.png)

## インターフェース設定

![what.png](https://qiita-image-store.s3.amazonaws.com/0/25728/095e38f3-bab7-9d17-ebea-742131698b47.png)

## 使用率制限

![cpulimit.png](https://qiita-image-store.s3.amazonaws.com/0/25728/baea62de-cd79-9de4-33b0-778db3b8553b.png)



# uninstall

```bash:
/opt/VirtualBox/uninstall.sh
```
HHVMのバグを見つけた話

最近お世話になっている [fluent-logger-php](https://github.com/fluent/fluent-logger-php)で、travis-ciのHHVMのテストがコケるという話がありました。

https://travis-ci.org/fluent/fluent-logger-php/jobs/54141689

原因を調べてみたら、ある条件でfwriteの戻り値がPHPとHHVMで異なるということを発見しました。

# どんなバグか

```php
<?php
$n = fwrite(fopen("php://memory", "r"), "hello");
var_dump($n);
```

これを実行すると、PHPではint(0)が返り、HHVMではint(5)が返ります。

https://github.com/facebook/hhvm/issues/5187

まあこういうfwriteの呼び出し方は普通しないと思うので実害はあまりないかもしれませんが...


# あるべき仕様は？

公式マニュアルを見ると

http://php.net/fwrite

> 返り値 : fwrite() は、 書き込んだバイト数、またはエラー時に FALSE を返します。

と書かれています。
PHPがint(0)を返す挙動もバグなんじゃないのという気がしなくもないですが...
どうなんでしょうか。
【PHP】複数文字列の置換(str_replace)


str_replace()で複数文字列の置換ができる。

sourceをSourceに、destinationをDestinationに置換したい場合、以下のように一括で置換できる。

```php
$subject= "source:XXX destination:XXX";
$search = array('source','destination');
$replace = array('Source','Destination');

echo str_replace($search,$replace,$subject);
//=>Source:XXX Destination:XXX
```

置換が配列の順番で対応しているので、対象の数が増えた場合に変換前と変換後の対応付けがわかりづらくなる。
その場合、連想配列で対応づけを行い、array_keys()とarray_values()でわけるとわかりやすい。

```php
$subject= "source:XXX destination:XXX";

$table = array(
  'source'=>'Source',
  'destination'=>'Destination'
);

$search = array_keys( $table);
$replace = array_values( $table);

echo str_replace($search,$replace,$subject);
//=>Source:XXX Destination:XXX
```

参考:[複数文字列置換を簡単に書く](http://wiki.poyo.jp/read/PHP/tips/string/tiny_en_decode)
Java言語の命名指針

Javaプログラムを書く上で守るべき一般的な指針をまとめておきます。

# Java言語の命名指針（ルール）

おおまかに以下のルールで命名することができます。

- すべてのUnicode文字が利用できる
    - 日本語（マルチバイト文字列）なども利用できるが慣例的に以下のみで構成することが多い
        - 英数字
        - アンダースコア( _ )
- 先頭文字に数字は使えない
- 文字数制限はない
- 大文字と小文字は区別される
- 予約語は使えない
    - （参考）予約語一覧：[Javaの予約語](https://www.k-cube.co.jp/wakaba/server/java_reserved.html)

## 1. クラス名
- Pascal記法
    - 先頭を大文字
    - それ以外は小文字
    - 言葉の区切りは大文字

例
・`PermissionsIntro`
・`AsyncTask`
・`FileCopy`
・`MainActivity`

## 2. メソッド名
- camelCase記法
    - 先頭を小文字
    - 以降も小文字
    - 言葉の区切りは大文字
    - 予約語ではない英単語と略語を組み合わせることが多い

例
・ `fileSend()`
・ `checkVersion()`
・ `addItems()`
・ `showActionbar()`

### 2.1 フィールドの値に対する取得と設定メソッド 
* フィールドの値を取得するメソッド: 先頭を`get`
* フィールドの値を設定するメソッド: 先頭を`set`
* 以降,camelCase記法

例
・`getCount()`
・`setDate()`
・`setName()`

### 2.2 boolean変数を返すメソッド
- メソッド名が命題を表すように命名する
- is + 形容詞
- has + 過去分詞
- can + 動詞

例
・`isEmpty()`
・`hasChanged()`
・`canAccess()`

## 3. 定数名
- すべて大文字
- 複合文字の場合は区切りをアンダースコア "_" で結合。（スネークケース記法）

例
・`LENGTH`
・`MIN_VALUE`
・`DATABASE_PATH`

## 4. 変数名（フィールド名）
* すべて小文字
* 複合文字の場合は区切りを大文字する

例
・`count`
・`startDate`
・`errMsg`

## 5.識別子の対称性
- 英単語の対称性を意識して命名する
  - add/remove
  -  insert/delete
  - get/set
  - start/stop
  - begin/end
  - send/receive
  - first/last
  - get/release
  - put/get
  - up/down
  - show/hide
  - source/target
  - open/close
  - source/destination
  - lock/unlock
  - old/new
  - next/previous

## 6.ちょっと気にするとよさそうな点
頭の片隅に置いておくと、良い命名が出来そうなポイントです。

- 名前を見るとデータの中身が想像できる
    - 良い:+1:：`userName`, `title`
    - 微妙:-1:：`a`, `b`, `AClass`
- 長すぎない・短すぎない
    - 良い:+1:：`keyword`
    - 微妙:-1:：`kw`, `keywordForFoodDatabaseSearch`
- ローマ字を使用しない
    - 良い:+1:：`resultScore`, `userName`
    - 微妙:-1:：`kekkaNoSukoa`, `Namae`
- 決められた記法で統一する
    - 良い:+1:：`resultValue` / `lastName` / `phoneNumber`
    - 微妙:-1:：`result_value`/ `LastName` / `Phone_Number`
- 思いやりのあるコードを書く
    - アスラムカーン(Aslam Khan)氏のエッセイの一部の言葉です

> 誰かが書いたコードの質は、必ず他の誰かが書くコードの質に影響します。もし私が質の低いコードを書いてしまったとしたらどうでしょうか。その場合は、誰か他の人が非常に質の高いコードを書いていたとしても、私のコードを利用した途端に悪影響を受け、同じレベルにまで質が低下してしまいます。(中略) 大事なのは、コードそのものの質ではなく、他への影響です。他人の存在を意識すれば、他人の書くコードにも当然良い影響を与えることになります。チームの同僚のことを考え、思いやりを持ってコードを書けば、それは同僚たちにとって価値あるコードとなり、いずれ自分にも良い影響となって返ってきます。どんなかたちであれ、そのコードに触れた誰もが、触れる前より良い人間、良いプログラマになれる、そういうコードを書くようにすべきでしょう。
> [他者への思いやりを意識したコーディング - プログラマが知るべき97のこと](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E4%BB%96%E8%80%85%E3%81%B8%E3%81%AE%E6%80%9D%E3%81%84%E3%82%84%E3%82%8A%E3%82%92%E6%84%8F%E8%AD%98%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)


## 7. その他
* 変数名で迷ったら →　[codic – デベロッパーのためのネーミング辞書](http://codic.jp/)

# 参考
- [今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単語200 | OXY NOTES](http://oxynotes.com/?p=8679)
- [delta - コーディング規約 - 命名規則](http://manual.delta-framework.org/standard/naming.html)
- [booleanを返すメソッドの命名規約 - shitstormちゃんぺろぺろブログ](http://shitstorm.hatenablog.jp/entry/2013/09/03/025738)
RDBにLoadするファイルの重複キーをなんとかする

# キー値の重複検出
RDBにデータをtxtファイルからロードするときにduplicate keyで失敗することが最近多々あるので重複行抽出したり、排除したりを取扱うスクリプトを書いた。
## 対象
RDBにロードするのに使う、tsvっぽいデータが対象。
一番左の列が主キーで、同じ主キーを持つ行が有ったり無かったりするようなものを想定。

### サンプルデータ作成
    $ cat > sample.txt
    001 duplicate
    002 duplicate
    003 value
    002 duplicate2
    001 duplicate
    001 duplicate

## 重複するキー値の抽出

    $ awk '{if(a[$1]++==1) print $1}' sample.txt
    002
    001


## 重複するキーを持つ２行目以降を排除して抽出
とりあえず、ファイル内でキー重複するのをさけるファイルを作る。

    $ awk '{if(!a[$1]++) print}' sample.txt
    001 duplicate
    002 duplicate
    003 value


## 重複するキーを持つ２行目以降を排除された行を抽出
重複した行を排除された行を出力。

    $ awk '{if(a[$1]++) print}' sample.txt
    002 duplicate2
    001 duplicate
    001 duplicate

## 雑感
sakura editorの正規表現やらexcelでがんばってたけどどう考えてもこの方が早い。
sort.SearchInts()はSort済みじゃないと動かない

以前、PHPを使っていたので、Goにも配列検索してくれる関数無いかな〜って思って調べたらそれっぽい関数が！！

＞＞＞**sort.SearchInts()**＜＜＜

sortパッケージってのが気になるけど・・・嬉々として試してみる。

```go:search1.go
package main

import (
	"fmt"
	"sort"
)

func main() {
	a := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
	res := sort.SearchInts(a, 7)
	fmt.Println("array:", a)
	fmt.Println("result:", res)
}
```

[Go Playground](https://play.golang.org/p/u-AxQU7c6C)

結果

```
array: [10 9 8 7 6 5 4 3 2 1]
result: 10
```

はぁ？
なんでやねん！7の添字は0、1、2、3、、、3やろ！

読めない英語のリファレンスを頑張って見ていると、

>SearchInts searches for x in a sorted slice of ints and returns the index as specified by Search. The return value is the index to insert x if x is not present (it could be len(a)). The slice must be sorted in ascending order.

ん？

>in a sorted slice

まさかと思い、sort.Ints(a)でソートしてからSearchIntsしてみる

```go:search2.go
package main

import (
	"fmt"
	"sort"
)

func main() {
	a := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
	sort.Ints(a)
	res := sort.SearchInts(a, 7)
	fmt.Println("array:", a)
	fmt.Println("result:", res)
}
```

[Go Playground](https://play.golang.org/p/OnEA0YM2hq)

結果

```
array: [1 2 3 4 5 6 7 8 9 10]
result: 6
```

できた。

sortパッケージだからか、sortした後のsearchしか対応してないっぽい。
【jQuery】jQueryオブジェクトから配列の取得


get()や$.makeArray()でjQueryオブジェクトから配列を取得できる。
取得後は配列なので、jQueryオブジェクトでは使用できなかった.pop()や.reverse()やjoin()が使えるようになる。

```html:対象のhtml
<p>aaa</P>
<p>bbb</P>
<p>ccc</P>
```

```js:配列に変換される箇所
console.log($('p'));

/*get()や$.makeArray()では0,1,2の部分が配列として取得できる。
0: p
1: p
2: p
context: document
length: 3
prevObject: jQuery.fn.jQuery.init[1]
selector: "P"
__proto__: jQuery[0]
*/
```

##get()

```
$array = $('p').get();
console.log($array);
/*
0: p
1: p
2: p
*/
```

##$.makeArray()

```
$array = $.makeArray($('p'));
console.log($array);
/*
0: p
1: p
2: p
*/
```
インジケーター付きのUISliderを作ってみた。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/39850/c2e6cf40-4ac5-d644-efdf-d25ba8c05a94.gif)
初投稿です。
iOSアプリを作る上でこういうのが欲しかったので作ってみました。
[GIthub](https://github.com/InoueRyuichi/ASISlider)

#概要とか
Githubに置いてあるサンプルの.xcodeprojファイルを開いて実行すると最初のgif画像の様なサンプルアプリが開きます。
このスライダーはArrowStyleIndicatorSlider(スライダー本体、UISliderのサブクラス)とArrowStyleLabelView(インジケーター部分、UIViewのサブクラス)の2つのクラスで構成されています。

#使い方
ArrowStyleIndicatorSlider.swiftとArrowStyleLabelView.swiftをインポートすれば使えます。
合計100行程度のソースですのでサンプルのViewController.swiftを見ていただければ使い方は理解できるかと思います。

#ライセンス
特に無いです。好きに使ってください。
このソースコードを使用して発生した、障害や損害について作者は一切の責任を持ちません。

#あとがき
操作中のみindicatorViewを表示する様にしたりすると汎用性高いかも。
jQueryでiframeと親window同士でイベントをtriggerする

jQueryをつかってiframeの中へイベントをtriggerする、あるいは、iframeの中から親windowへイベントをtriggerするのにハマったのでシェアしておきます。

親ウィンドウでもiframe内でもjQueryが読み込まれてる前提です。

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
</head>
<body>
  <iframe src="/iframe/" name="myIframe" frameborder="0"></iframe>
</body>
</html>
```

親windowからiframeの`document`へイベントをtriggerする

```js
document.myIframe.$(document.myIframe.document).trigger('someCustomEvent');
```

ポイントは子フレームスコープのjQueryを使うところですね。`$(document.myIframe.document).trigger(...)`だと受け取れませんので注意してください。


逆も同じ要領です。
iframeから親windowの`document`へイベントをtrigger。

```js
parent.$(parent.document).trigger('someCustomEvent');
```

受けとる側は普通です。

```js
$(document).on('someCustomEvent', function(e){

});
```
Go自分用メモ(随時更新)

Qiitaで「自分用メモ」って検索したらまぁまぁあったから僕も自分用メモをメモ帳からQiitaに移行しようと思います。
独立した記事にするまでもない事を書こうと思ってます。

// 読んでくれてありがとうございます。基本チラ裏です。あなたに有用な事は何一つ無いかもしれません。

# 配列の添字でインクリメントできない

```go
a[i++]
```

[Go Playground](https://play.golang.org/p/vkHoQTKICJ)

↑できない
というか、フォーマットの時点でエラーが出る。

フォーマット時エラー：
expected ']', found '++'
実行時エラー：
syntax error: unexpected ++, expecting :

結果

```go
a[i]
i++
```

[Go Playground](https://play.golang.org/p/rPEJHgTouw)

こうするしかない。

# intは32bit環境と64bit環境でサイズが異なる

intは32bit環境だとint32のエイリアス(別名みたいなもの)、64bit環境だとint64のエイリアスとなる。

```go
package main

import "fmt"

func main() {
	var a byte = 0xFF
	fmt.Println((int(a) << 24))
}
```

[Go Playground](https://play.golang.org/p/QHc68jQ3Ca)

Go Playgroundだと-16777216
ローカル環境(mac)だと4278190080
どちらも16進数だとFF000000だけど、32bitと64bitで全然結果が違う。
調べると32bitと64bitでintのサイズが違った。
http://golang.org/doc/go1.1#int
(1.1からだそうです。)
簡単なプログラムならintでもいいですが、大きい値が入る可能性がある箇所は明示的にint32やint64と指定したほうがいいかもしれませんね。

## 余談

```go
package main

import "fmt"

func main() {
	fmt.Println(int(byte(0xFF)) << 24)
}
```

[Go Playground](https://play.golang.org/p/CvmPUmBi3m)

これだと下記みたいなエラー出ちゃうんですよね〜

```
6: constant 4278190080 overflows int
```

なんででしょうか？


# 同名関数が使用できない

Javaとかだと同じ名前で引数が違う関数が使えますが、Goは使えないようです。

```go
package main

import "fmt"

func main() {
	f(1, 2)
	f("hello!")
}

func f(a int, b int) {
	fmt.Println(a, b)
}

func f(c string) {
	fmt.Println(c)
}
```

[Go Playground](https://play.golang.org/p/nPgITGzqR3)

エラー出ます。

```
6: too many arguments in call to f
14: f redeclared in this block
	previous declaration at /tmp/sandbox953653986/main.go:10
```

大文字小文字が違う関数はOKみたいですよ。

```go
package main

import "fmt"

func main() {
	f(1, 2)
	F("hello!")
}

func f(a int, b int) {
	fmt.Println(a, b)
}

func F(c string) {
	fmt.Println(c)
}
```

[Go Playground](https://play.golang.org/p/lN9yLuHstu)

```
1 2
hello!
```

# forで2つの変数を操作

```go
package main

import "fmt"

func main() {
	for i, j := 0, 1; i < 10 || j < 20; i, j = i+1, j+1 {
		fmt.Println("i:", i, "j:", j)
	}
}
```

# copyでslice→arrayはコピーできるけどarray→sliceはコピー出来ない

```go
package main

import "fmt"

const (
	size = 10
)

func main() {
	// slice -> array できる
	s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
	var a [size]int
	copy(a[:], s)
	arr(a)

	// array -> slice できない
	aa := [size]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
	var ss []int
	copy(ss, aa[:])
	sli(ss)
}

func sli(s []int) {
	fmt.Println(s)
	for k, v := range s {
		fmt.Println(k, v)
	}
}

func arr(a [size]int) {
	fmt.Println(a)
	for k, v := range a {
		fmt.Println(k, v)
	}
}
```
列挙型(Enum)に文字列や数値を利用する備忘録


Android の開発をしていると、値の取りうる値が数パターンの場合は、列挙型(Enum)を使いたくなります。

```java:
public enum Type {
    TYPE1,
    TYPE2,
    TYPE3,
}
```

列挙型をメソッドの引数にすると、取りうる値を制限できて何かと間違いが減りますし、

```java:
public void hoge(Type type) {
	//...
}
```

条件分岐のキーにしたりできて便利です。

```java:
switch (type) {
    case TYPE1:
         //...
         break;
    case TYPE2:
         //...
         break;
    case TYPE3:
         //...
         break;
}
```

ですが、列挙型に文字列や数値を使いたいこともあります(つまり数パターンの文字列や数値の表現に列挙型を利用する)。Androidの場合は Bundle に詰め込んだり、画面に表示したり、データストアに格納する時でしょうか。

文字列として利用する場合は、次のようにコンストラクタと、値の取得メソッドを定義します。

```java:
public enum Type {
    TYPE1("AAA"),
    TYPE2("BBB"),
    TYPE3("CCC"),
    ;

    private final String text;

    private Type(final String text) {
        this.text = text;
    }

    public String getString() {
        return this.text;
    }
}
```

普通に列挙型としても利用できますし、

```java:
Type type = Type.TYPE1;
```

次のように文字列としても利用できます。

```java:
String text = Type.TYPE1.getString();
Log.i("enumテスト", text); // AAA が出力される
```

同様に、数値として利用する場合は次のようにします。

```java:
public enum Type {
    TYPE1(10),
    TYPE2(20),
    TYPE3(30),
    ;

    private final int id;

    private Type(final int id) {
        this.id = id;
    }

    public int getInt() {
        return this.id;
    }
}
```

利用する場合は次のとおり。

```java
int id = Type.TYPE1.getInt();
Log.i("enumテスト", "" + id); // 10 が出力される
```

更に次のように、複数の値を持たせることも出来ます。

```java:
public enum Type {
    TYPE1("AAA", 10),
    TYPE2("BBB", 20),
    TYPE3("CCC", 30),
    ;

    private final String text;
    private final int id;

    private Type(final String text, final int id) {
       this.text = text;
       this.id = id;
    }

    public String getString() {
        return this.text;
    }

    public int getInt() {
        return this.id;
    }
}
```

```java:
String text = Type.TYPE1.getString();
int id = Type.TYPE1.getInt();

Log.i("enumテスト", text); // AAA が出力される
Log.i("enumテスト", "" + id); // 10 が出力される
```

## 追記(2015/04/20)

数値等から Enum へ変換するメソッドも合わせて用意すると良さげ。

```java:
public class Hoge {

    public static enum Type {
        TYPE1(10),
        TYPE2(20),
        TYPE3(30),
        ;
    
        private final int id;
    
        private Type(final int id) {
            this.id = id;
        }
    
        public int getInt() {
            return this.id;
        }
    }

    public static Type getType(final int id) {
        Type[] types = Type.values();
        for (Type type : types) {
            if (type.getInt() == id) {
                return type;
            }
        }
        return null;
    }
}
```

```java:Enumから数値への変換
int id = Hoge.Type.TYPE1.getInt();
```

```java:数値からEnumへの変換
Type type = Hoge.getType(10);
```

## 追記(2015/05/07)

Enum の要素を文字列として表現したいだけであれば、特別なコンストラクタやメソッドを用意しなくても次のように変換できる。

```java:Enumから文字列への変換
Type.TYPE1.name();
```

```java:文字列からEnumへの変換
Type.valueOf("TYPE1");
```
TCPサーバーの非同期処理はけっきょくどの手法がいいのか？

昔Unix系システムではselect()でIO処理を非同期にして、ファイルディスクリプタの状態に変化があった場合のみ処理を行うことができた。これはメモリやサーバーリソースが極端に少なかった時代に有効な手法だった(らしい)。90年代後半、00年代前半にはマルチスレッドが主流になり、サーバーサイドではAcceptして受け入れたクライアントのソケットをスレッドに渡して送受信を行うことでコネクションの多重化を行った。(もちろん目的に応じて非同期も活躍していた)

00年代後半からC10K問題が騒がれ、node.jsやnginxが登場した。大量のスレッドを生成してリソースやメモリを消費する方法よりも、再びソケットをノンブロッキングにしてディスクリプタの状態を監視する非同期処理が注目されるようになる。そして最近ではjavascript promise、RX、Reactive ExtensionなどクライアントサイドのUIに近い場所で非同期処理を効率的に記述できるライブラリが登場している。

ただし、サーバーサイドで非同期処理を考えた場合に、シングルスレッドで非同期IOを処理するだけではマルチコア、マルチCPUをあまり活かせない。なので、Accept()で受けた後にソケットのレディ状態を非同期で待ち、ソケットがレディ状態になったらスレッドで実際の送受信を行う手法もある。非同期処理自体もselect()、poll、epollなど複数の手法がある。また、処理の多重化にはスレッドを使う方法とプロセスをforkする方法がある。さらにあらかじめスレッドやプロセスを生成しておいて、それらにデータを受け渡す手法もある。



|手法|メリット|デメリット|
|---|---|---|
|select|メモリやリソース消費が抑えられる|扱えるディスクリプタに制限がある<br>一つのソケットの送受信処理の間に他のソケットを扱えない|
|poll|メモリやリソース消費が抑えられる<br>ディスクリプタ制限なし|一つのソケットの送受信処理の間に他のソケットを扱えない|
|EPOLL|pollの高速化版<br>ディスクリプタ制限なし|一つのソケットの送受信処理の間に他のソケットを扱えない|
|fork|処理待ちソケットがあまり発生しない|プロセス生成コストが大きい|
|thread|処理待ちソケットがあまり発生しない|スレッドの生成コストとコネクション分のスタック領域を消費する|
|pre-fork|処理待ちソケットがあまり発生しない<br>プロセス生成コストが起動時しかない|データの受け渡しとロック処理、プロセスの管理の手間|
|pre-thread|処理待ちソケットがあまり発生しない<br>スレッド生成コストが起動時しかない|データの受け渡しとロック処理、スレッドの管理の手間|
|EPOLL+thread|メモリとリソース消費を抑えつつ、待ち時間を最大限に低くできる|スレッド生成コスト。データの受け渡しとスレッド管理の手間|
|EPOLL+pre thread|メモリとリソース消費を抑えつつ、待ち時間を最大限に低くできる|データの受け渡しとスレッド管理の手間がより複雑だが、うまく実装すれば完璧なパフォーマンスを出すはず|


この辺りは『[Linuxネットワークプログラミングバイブル](http://www.amazon.co.jp/Linuxネットワークプログラミングバイブル-小俣光之-ebook/dp/B00O8GIL62/ref=sr_1_1?ie=UTF8&qid=1429454642&sr=8-1)』が詳しい。

個人的には「EPOLL+thread」が良いと思うが、上記の本に載っているベンチマークによると、接続時間が最も速いのは「EPOLL+thread」だが、送受信が最も速かったのは「fork」らしい。接続時間と合わせた総合的な順でいえば「pre-thread」が一番高速という結果になっていた。送受信に限って言えば、「pre-〜」も含めてforkやスレッドなど特別なことをするよりも普通に「poll」や「EPOLL」を使用した方が速いという結果になっている(本当かな??)。ちなみに「EPOLL+thread」は総合4位で「select」や「poll」や「EPOLL」よりも遅いと書かれているが、ちょっとこの結果も信じられない。

ベンチマークの内容は50回の送受信で接続する処理をさらに50回繰り返すスレッドを1000スレッド起動して、サーバーはディアルコアで、スレッド化やfork化するのはsend()の部分のみという実験らしい。

けっきょくスレッドやforkは事前生成してもデータの受け渡しや共有データのロックなどでパフォーマンスが悪くなるのだろうか。ディアルコアという点が影響している可能性もけっこうあると思う(書籍にもサーバーサイドのリソース監視はしてない単純比較と書いてある)。

「EPOLL+pre-thread」が紹介されていないので、おそらくマルチコア環境でスレッド数を適切に抑えればこれが最も速いかもしれない。自分で書くときは「EPOLL+pre-thread」でスレッド数を抑えてやろうと考えている。

ちなみにAccept自体をスレッドで複数処理するという方法も書籍には紹介されていたが、けっきょくロックしてどれか一つが受け口になるため、この方法の是非は自分にはわからない。
Oculus' Mobile VR Jam 2015 ChallengePost

# はじめに

# Mobile VR Jamに参加するには

Deviceはお近くのコネクションをご活用ください。

# せっかくスクショをとったので、ステップ

**ユーザー名をいれる。**
![スクリーンショット 2015-04-19 23.09.15.png](https://qiita-image-store.s3.amazonaws.com/0/25895/6bf8f236-a807-ca02-d8bc-ce7c513efc97.png)

**あなた自身の詳細を**
![スクリーンショット 2015-04-19 23.09.45.png](https://qiita-image-store.s3.amazonaws.com/0/25895/bf150c24-7886-0810-e8f6-b41e816cc8ed.png)

**どんなハックがすき？**
![スクリーンショット 2015-04-19 23.10.17.png](https://qiita-image-store.s3.amazonaws.com/0/25895/30648629-32b6-5958-b1f7-7923a1659ad7.png)

**ロケーションはどこ？**
![スクリーンショット 2015-04-19 23.12.25.png](https://qiita-image-store.s3.amazonaws.com/0/25895/c99c0244-1264-364a-18de-eb654f4f9e3f.png)

**完全なサインあっぷ**
![スクリーンショット 2015-04-19 23.12.43.png](https://qiita-image-store.s3.amazonaws.com/0/25895/2c2489a4-2b94-6f0e-fde6-5edd0b93e083.png)

**かくにん**
![スクリーンショット 2015-04-19 23.13.15.png](https://qiita-image-store.s3.amazonaws.com/0/25895/5cee2076-d63c-f033-7b5e-ce75ad02df2c.png)

**ツムツムへのみち**
![スクリーンショット 2015-04-19 23.13.55.png](https://qiita-image-store.s3.amazonaws.com/0/25895/e28ba1d5-6e8d-74d4-427d-b91c16179526.png)

**Oculus ID'sはOculusのサイトログインつかうemailでよかったのか。**
![スクリーンショット 2015-04-20 1.08.34.png](https://qiita-image-store.s3.amazonaws.com/0/25895/ea113de3-3255-4b99-6404-f0410cb1b52d.png)
LINQPadをQuickRunから利用する

[LINQPad](https://www.linqpad.net)、便利ですね。

特に、コード辺を入力し、すぐに評価して、[結果を確認](https://www.linqpad.net/CodeSnippetIDE.aspx)することができるところがよいです。いちいちVisualStudioで空ソリューションを作るの面倒です。

このLINQPadですが、[コマンドラインインタフェースが用意](https://www.linqpad.net/lprun.aspx)されているので、これを、QuickRunから利用する場合の設定です。

```vim
let g:quickrun_config['cs/lprun'] =
      \ {
      \   'command': 'C:\Program Files (x86)\LINQPad5\LPRun.exe'
      \ , 'cmdopt': '-lang=S'
      \ , 'exec': '%c:gs?/?\\? %o %s'
      \ , 'tempfile': '%{tempname()}.cs'
      \ , 'hook/output_encode/encoding': '&termencoding'
      \ , 'hook/sweep/files': ['%S:p:r.exe']
      \ }
```

これで、`:QuickRun cs/lprun` するか、

```vim
let g:quickrun_config.cs = {'type` : 'cs/lprun'}
```

としておいて、filetype = cs なバッファで、`:QuickRun` です。
第30回オフラインリアルタイムどう書くの解答

第30回 オフラインリアルタイムどう書くの問題を家で解きました。

問題のURL( http://nabetani.sakura.ne.jp/hena/ord30taxi/ )

45分ほど
経路の終点でちょうど値段が上がるケースは問題上ありえなかったので、ひとまずは無視しました。

都市のデータの持ち方はもっと良い方法を考えたほうが良かった気がする。

```ruby
def process(path)
  (0...(path.length-1)).map { |index|
    {
      'AB' => [ 1090, 0, ],
      'AC' => [ 180, 0, ],
      'AD' => [ 0, 540, ],
      'BC' => [ 960, 0, ],
      'BG' => [ 1270, 0, ],
      'CD' => [ 0, 400, ],
      'CF' => [ 200, 0, ],
      'DE' => [ 0, 720, ],
      'DF' => [ 0, 510, ],
      'EG' => [ 0, 1050, ],
      'FG' => [ 0, 230, ],
    }[path[index, 2].chars.sort.join]
  }.inject( {
              'A' => [ 400, 995, ],
              'B' => [ 400, 995, ],
              'C' => [ 400, 995, ],
              'D' => [ 350, 845, ],
              'E' => [ 350, 845, ],
              'F' => [ 350, 845, ],
              'G' => [ 350, 845, ],
            }[path[0]] ) { |result, distance|
    distance.zip( [ 60, 50, ] ).each { |edge_distance, price|
      result[1] = result[1] - edge_distance
      while result[1] < 0
        result = result.zip( [price, 200] ).map { |left, right| left + right }
      end
    }
    result
  }[0].to_s
end

def test(input, answer)
  result = process(input)
  if result != answer then
    puts 'test error: input = %s, result = %s, but answer = %s'%[ input, result, answer ]
  end
end

test( "ADFC", "510" )
# テストケース略
```
`c_CTRL-A`で、指定したパターンにマッチするバッファを削除する

`c_CTRL-A` は、cmdline 中で `<C-a>` を叩くという意味です。

これを利用することで、入力したパターンにマッチしたバッファを削除することができます。

通常、バッファを削除するための `:bdelete` 等のコマンドは、`bdelete 1 2 3 ...`のように、バッファ番号を列挙するか、`bdelete a.txt b.txt`のようにバッファ名を個別に列挙しなければなりません。

ただ、実際に使っている時によくあるのは、特定の拡張子をバッファリストから削除したい、とか、特定のディレクトリ以下のバッファを削除したい、とか、そういうパターンです。
こういうとき、`c_CTRL-A`を活用できます。

拡張子毎(たとえば '*.log`)にまとめてバッファを削除したい場合には、

```vim
bd log/*.log
```

ここまで入力して、`<C-a>` を押すと、ワイルドカードにマッチした内容に置き換えることができます。

```vim
bd log/2015-04-01_001.log log/2015-04-01_002.log ...
```

`:bdelete` 自体はワイルドカードによる展開はしませんが、こうすることで、簡単に複数バッファを削除できます。

(もちろん、バッファ番号を憶えているような人には不要ですねー)
発表の仕方 -自分の話など誰も聞きたくはない-

# 人間の性質
　仏教によると自分にとって良い話ほど、嫌な感じがしてしまうのが人間の性質なのだそうです。誰でも正論であったり、道徳的に正しい話や相手が自分のためを思ってしてくれた厳しい指摘を「嫌だ」と感じたことがあると思います。
　本当であればそういった事こそ耳を傾けなければならないのですが、精進が足りないとなかなか難しいことです。
　発表を成功させるためにそのような人間の性質を踏まえて、臨んではいかがでしょうか？

# 謙虚な姿勢で臨む
　発表するときは「さあ、良い発表を聞かせてやるぞ！」などと気合が入ると思いますが、期待していたほどウケが良くなかったりします。これは先の性質によるものでしょう。
　自分が話したい事を話すよりも、「この主題であれば、聴衆が聞きたい話はこれだろう」ということを用意して「発表をさせてもらう」というような謙虚な姿勢で臨めば聴衆も「うむ、では一つ聴いてやろうか」という気持ちになってくれるかもしれません。

# グダらない
　最初の性質に加えて、人間は「相手に対しては完璧を求める」という性質も持っているそうです。そのため最初から最後まで気が抜けません。PCの電源を入れ忘れていた、なかなかプロジェクタにつながらない、操作手順を間違えるなどのトラブルでグダると、発表の格が落ちてしまいます。

* 実績のある機材で臨む
* 機材トラブルなどに備えて、発表手段を複数用意しておく
* 入念にリハーサルを行う

など、グダらないよう準備をしておくと良いと思います。

# 時間を守る
　最初の性質に照らし合わせると、時間をオーバーしてしまっては余計に聴衆の心象が悪くなってしまいます。また、時間をオーバーするとどうしても準備不足の感が出てしまうので、時間内に収めるようにしたいものです。
　かといって早すぎても計画が狂って主催者にとっては都合が悪いので、やはり過不足なく時間通りに終わるのが望ましいですね。

　絶対にウケたい。注目されたい。などの執着から離れて、自分にも他人にも有意義な発表が出来るよう精進をしたいものです。

# 参考文献
[一生、仕事で悩まないためのブッダの教え: シンプルに考える、自由に生きる](http://www.amazon.co.jp/%E4%B8%80%E7%94%9F%E3%80%81%E4%BB%95%E4%BA%8B%E3%81%A7%E6%82%A9%E3%81%BE%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E3%83%96%E3%83%83%E3%83%80%E3%81%AE%E6%95%99%E3%81%88-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AB%E8%80%83%E3%81%88%E3%82%8B%E3%80%81%E8%87%AA%E7%94%B1%E3%81%AB%E7%94%9F%E3%81%8D%E3%82%8B-%E7%9F%A5%E7%9A%84%E7%94%9F%E3%81%8D%E3%81%8B%E3%81%9F%E6%96%87%E5%BA%AB-%E3%82%A2%E3%83%AB%E3%83%9C%E3%83%A0%E3%83%83%E3%83%AC%E3%83%BB%E3%82%B9%E3%83%9E%E3%83%8A%E3%82%B5%E3%83%BC%E3%83%A9/dp/4837981003/ref=sr_1_24?s=books&ie=UTF8&qid=1428250462&sr=1-24)