OmniAICreator/Qiita-1.07M huggingface dataset:
docker-machineでError running connection boilerplate

表題通り。

## 環境

- docker: 1.9.1
- docker-machine: 0.5.0
- virtualbox: 4.3.28
- MacOSX Yosemite: 10.10.3

## エラー内容

```
Error running connection boilerplate: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.56.101:2376": dial tcp 192.168.56.101:2376: i/o timeout
You can attempt to regenerate them using 'docker-machine regenerate-certs name'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.
```

## 対応

下記を参考に。
https://github.com/docker/toolbox/issues/275

```
$ docker-machine rm dev # => 削除
$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr 192.168.60.1/24 dev # => optionを追加してcreate
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.60.101:2376"
export DOCKER_CERT_PATH="/Users/xxxxxx/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval "$(docker-machine env dev)"
```

以上です。
Shinyで時間がかかる処理をするときの一工夫

# arulesの閾値が難しい
Shinyでarulesを動かしていると、適当なパラメータで試すと止まらなくなることが分かってきました。
そりゃあ、全部の組み合わせを列挙するようになると、相当な事になりますわな。
これを避けるために、普通にRを動かしているときはsetTimeLimitという便利な関数がありますが、Shinyで使う時には一工夫が必要です。という話です。

# ShinyにおけるsetTimeLimitのベタープラクティス
いきなりベストなどという強い主張はしません。。。

```r:server.Rのいちぶ
    tryCatch({
      setTimeLimit(5,5)
      # 時間がかかる処理
      d <- apriori(as(df.test[[2]],"transactions"), parameter=list(support=input$support, confidence=input$confidence))
      setTimeLimit(Inf,Inf)
    },error=function(e){
      setTimeLimit(Inf,Inf)
      stop(e)
    })
```

`input$support`等の値によっては、`apriori`の処理にかなり時間がかかる可能性があるので、これを`setTimeLimit`してどうにかしたいのですが、単に`setTimeLimit`するとShinyのプロセス自体が死んでしまいます。（Shinyを動かしているときは、RStudioのコンソールが反応しなくなりますよね。RStudioのコンソールとリンクしているRのプロセスを、Shinyが持って行ってしまっているからですね。）
tryCatchの中でsetTimeLimitを元に戻すことにより、他のエラーが発生することを避けます。
サンプルは、[例によってQlik Senseで](http://qiita.com/sasanquaneuf/items/cd4aefdd466c4c999d99)動かしています。

## supportがある程度高めで、絞り込まれるとき
<img width="863" alt="qss1.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/3b717e03-6bc0-5734-214d-78036b7ef9e5.png">
## supportを低くして莫大なルールが発生するとき
<img width="862" alt="qss2.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/430bd26e-56bc-f34e-4c6b-db172011c3f9.png">
今さら聞けないASOの基礎知識

# ASOとは

「 App Store Optimization」の略で、モバイルアプリケーションストア（AppStore/GooglePlayStore）に最適化することです。
具体的にはランキングで上位に載るための施策だったり、検索結果の上位に表示する施策を指します。

最近ではランキングロジックが複雑になり、検索エンジンの評価対象がメタデータ（タイトルやキーワード）やダウンロード数だけでなくDAU／MAU、レビュー評価など多様化してきています。

そこで一口に「ASO対策」といってもやることが増えてきて、なにやればいいんだっけ？状態になりがちなので一度整理したいと思います。

この記事では具体的なASO対策にはあまり言及しません。
ASOの目的やアプリストアの特徴を理解することが目的です。
ASO担当者やこれからASOに注力したいと思っている方に、基礎知識として覚えていただけると幸いです。

_**※ 内容に関しては個人的な予想も含まれますのでご注意ください**_


# ASO対策の目的とは
せっかくアプリを作って配信しても、ユーザーに届かなければ頑張って作った価値を提供できず、苦労が水の泡です。
また、ユーザーが例えば「家計簿をつけたい」と目的を持って検索しても、そこに適切なアプリが表示されないとユーザーにとってもデメリットとなります。
つまり、**適切なASO対策はデベロッパー/ユーザーの双方にメリット**が生じます。

簡単にまとめると

 * 潜在ユーザー（**※1**）の目に触れる機会を多くする
 * 潜在ユーザーがアプリをインストールする
 * 顕在ユーザー（**※2**）が目的のアプリに出会いやすくする
 * 利用ユーザーの満足度を上げて、更にランキングを上げる

ということがASOの大まかな目的になります。

_**※ 「潜在ユーザー」とはあなたの作ったアプリをインストールするつもりがないユーザー**_
_**※ 「顕在ユーザー」とはあなたの作ったアプリをインストールするつもりで検索するユーザー**_

### ランキング・検索順位の向上
ランキングは「潜在ユーザー」にとってアプリを知るキッカケになります。

「最近こんなアプリが流行っているのかぁ」
「このアプリ良さそう」

といったように、必要性が顕在化していないユーザーに対してもアプローチすることができます。

一方、ストアの検索窓から「家計簿」と検索した場合もランキングで表示されます。
これは「家計簿をつけたい」という目的が顕在化したユーザーに対してリーチすることが出来ます。

どちらも他アプリと順番で並ぶので一つでも上にあることでよりダウンロードしてもらう確率があがり、１人でも多くの方に価値を提供できる機会を得ることができます。

### ユーザーとの接点から効率的に集客する

ユーザーとの接点は実に多様です。
ASO施策とはその接点を効果的に使い、いかに多くのダウンロードにつなげるかの施策といっても過言ではありません。
具体的な施策は色々なところで言及されているかと思いますので今回は割愛させていただきますが、各接点でやれることは多く存在します。

* ストア内検索の検索結果画面
* ストアおすすめ、特集
* 人気検索（AppStore）
* 検索時のサジェスト
* 他アプリの詳細画面下部にある関連アプリ
* デベロッパーページ（GooglePlay）
* WEB検索
* 広告
* TV（CM）
* 書籍等

### コンバージョン率の向上

冒頭でも触れたとおり、ストアのランキングはダウンロード数よりもより使われているか、ユーザーに満足いただけているか、といった指標にシフトしつつあります。

もちろん１人でも多くのユーザーにダウンロードしてもらいたのですが、残念ながら「思ってたのと違う」といって使われなくなったりアンインストールされてしまったりすると満足度の平均は下がってしまいます。

とにかくダウンロードしてもらうのではなく、より満足していただけるユーザーにダウンロードしてもらう工夫が必要になります。

アプリの詳細ページ（ダウンロードページ）にはアイコンの他にスクリーンショット、説明文などがあります。
ダウンロードする前の時点で、「このアプリで何ができるのか」「どういった価値を提供しているのか」を適切に説明することでユーザー理解が深まります。
アプリに対する理解を深めたうえでアプリを使ってもらうと、使い始めたあとの起動率や継続率が向上します。
結果的にDAU/MAUが向上するのでランキングも上がり、さらに多くのユーザーに使ってもらうといういいサイクルにつながるのです。


もうひとつ重要なこととしてKPIまでのコンバージョンを上げる目的もあります。

Twitterでは初日に5人以上フォローしたユーザーの継続率が高い

といった、アプリを成長させるうえでのKPIが存在します。
それらのKPIが定まっている場合は、アプリダウンロード前に「このアプリは友達をフォローしたりフォローされたりするものですよ」とマインドセットしてKPIまでのスムーズに誘導することが可能です。


* **内容を十分理解してもらうことで継続率・起動率の向上、アンインストール率の低下につながる**
* **成果地点を意識して、インストール前にユーザーに訴求することで利用率を上げる**


# Storeのランキング・検索順位に影響する指標とは
ストアのランキングに影響する指標はストアによって異なります。
また、検索結果のランキングとカテゴリのランキングでも若干指標が変わります。


## AppStore
AppStoreはダウンロード数を重視する傾向にありましたが、最近ではキーワードとの関連性や、DAU/MAUをより重視するようになりました。
また最近ではタイトルやキーワードだけでなく説明文も分析対象に含まれているのではないかと感じます。

* イントール数（カテゴリでのランキングはこれが顕著）
* タイトル
* キーワード
* 説明文
* DAU/MAU


## GooglePlayストア
GooglePlayはAppStoreに比べ、非常に多角的な視点からランキングを形成しています。
GoogleさんらしくWeb側も含めて評価しているのが特徴です。

* イントール数（カテゴリでのランキングはこれが顕著）
* アンインストール率（ただし、一定期間内のアンインストールのみ計測）
* DAU/MAU
* メタデータ全般
* 被リンク
* 評価
* +1（Google+）
* [App Indexing  |  Google Developers](https://developers.google.com/app-indexing/?hl=ja)


# ランキングを上げるには

指標は様々あり、それら全てに対してなにかしらの施策を行うのは非常に大変です。
小手先のテクニックは山ほどあり、これまでに色々トライしてきましたが、本質的には下記に集約されると感じています。

* **ユーザーに価値あるサービス/機能を提供すること**
* **その価値を理解してもらうこと**
* **各プラットフォームのガイドラインを意識し、使いやすいアプリを作ること**


そうすることでユーザーからも評価され、結果としてストアからも評価されることになるのではないかと考えています。

**といってもそれが一番難しい**
メール.appのペースト時にスタイルが付くのを無効にする

システム環境設定 > キーボード > ショートカット > アプリケーション

![1.png](https://qiita-image-store.s3.amazonaws.com/0/105818/e6d4fc06-162a-e02d-a487-c77ef303b49f.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/105818/ad4965da-02d0-3e42-1de1-35aacf56c08b.png)
![　3.png](https://qiita-image-store.s3.amazonaws.com/0/105818/b50e942c-617e-0567-88c2-b4d2a3a7ddc9.png)

これでメール.appアプリケーション内のペースト時に、スタイルが付くのを無効にできる :innocent: 

参考
>[OSX: How to copy plain-text always, everywhere, without exception? - paste copypaste plaintext | Ask MetaFilter](http://ask.metafilter.com/187733/OSX-How-to-copy-plaintext-always-everywhere-without-exception)

追記
上記設定をしていると、メールの件名にペーストできない現象を確認 :poop:
turboruby のご紹介

## はじめに

わたしは、日頃は Ruby でお仕事をしていて、ここ 1 年ぐらい Rust を勉強しだし、最近では [Rust of Us](https://rust-of-us.doorkeeper.jp/events/35267) という有志の勉強会をやっています。
この AdventCalender に登録した時点では、Rust でわたしが作りだしたライブラリについて書くつもりでした。しかし、先日の RubyKaigi で発表のあった  [turboruby](https://github.com/tildeio/turboruby) が、かなり面白かったのでその紹介をさせていただきます。

## turboruby とは

turboruby とは、[TILDE](http://www.tilde.io/) という会社によって作られたものです。

TILDE は、Rust Core team の [wycats](https://github.com/wycats) 等がいます。
wycats は各所で Rust の発表を行なっており、[本の貸し借りで Rust の Ownership を説明するスライド](https://speakerdeck.com/wycats/what-is-rust?slide=37) を見たことがある人もいるでしょう。

彼の働く TILDE では、Ruby on Rails を使ってプロダクトをつくっており、彼の過去の発表では [Ruby と Rust を連携させるもの](https://speakerdeck.com/wycats/hello-rust) もありました。
このときの発表では、FFI を使って Ruby から Rust のプログラムを呼んでいました。

しかし、[今回の RubyKaigi での発表](https://speakerdeck.com/chancancode/turbo-rails-in-rust) では、今までの FFI を使っていたところを turboruby というライブラリを使うようになりました。この turboruby により、Ruby でRust のコードの文字列を返すメソッドを記述することで、Ruby の拡張ライブラリを Rust で記述できるようになります。

## どうやって動かすの

turboruby のリポジトリにある README は、bundler によって生成されたままの README なので、情報がないです。そこで、[integration_spec.rb](https://github.com/tildeio/turboruby/blob/master/spec/integration_spec.rb) を参考、String クラスに `hello` と返すだけのメソッドを追加するものを作ってみました。

- https://github.com/takkanm/turboruby_example

リポジトリに含まれている、run.sh がコマンドの流れ、compile.sh が turboruby のコードをコンパイルするためのスクリプトになります。

まず lib ディレクトリには、src というディレクトリを用意して、その中に trb ファイルを記述します。また、lib ディレクトリには gemspec ファイルも用意しておきます。今回の trb ファイルは、このようになっています。

```ruby
class String
  def hello
    <<-RUST
      println!("hello");
    RUST
  end
end
```

このリポジトリのトップで、`bundle exec ruby compile.rb lib out` とすると、out ディレクトリ内にコンパイルされた Rust のコード類が生成されます。実行後の out ディレクトリの構成は以下のようになります。

```
$ ls -lR out
total 32
-rw-r--r--  1 takkanm  staff  350 12 16 20:05 Cargo.toml
-rw-r--r--  1 takkanm  staff  168 12 16 20:05 extconf.rb
-rw-r--r--  1 takkanm  staff  467 12 16 20:05 hello.c
-rw-r--r--  1 takkanm  staff  463 12 16 20:05 hello.gemspec
drwxr-xr-x  3 takkanm  staff  102 12 16 20:05 src/

out/src:
total 8
-rw-r--r--  1 takkanm  staff  305 12 16 20:05 lib.rs
```

では生成された、lib.rs の中身を見てみましょう。

```rust
extern crate libc;
extern crate ffi_buf;

use ffi_buf::Buf;

trait RubyString {
    fn trb_hello(&self);
}

impl<'a> RubyString for &'a str {
    fn trb_hello(&self) {
        println!("hello");
    }
}

#[no_mangle]
pub extern "C" fn trb_string_hello(rb_self: Buf) {
    rb_self.as_slice().trb_hello()
}
```

RubyString の中に trb_hello というメソッドができて、 'hello' と表示されるようになっているのがわかります。

この後、run.sh に書かれている手順で、crate の build 、make を行なうと hello.bundle(mac の場合)ができ、その共有ライブラリを Ruby に読み込ませて実行できることがわかります。

## 最後に

今回は単純に文字を表示するメソッドを追加しただけですが、[turboruby のリポジトリにある例のように](https://github.com/tildeio/turboruby/blob/master/spec/fixtures/fast_blank/src/fast_blank.trb)、Ruby のオブジェクトを Rust 側に渡して値を返すということもできます。

turboruby は、ソースを読むとまだまだ実験的なライブラリで、機能が足りてないことがわかります。
しかし、これが成長すれば普段 Rails で仕事しているような私にはとっても恩恵があるような気がしており、とても楽しみです。
ChromebookでGo！(ChromebookでGo言語を楽しんでみる)

## Chromebookが安い

年末だからなのかなんなのか知りませんが、最近、Chromebookのたたき売りが多いです。

+ [【特価情報】楽天でDell Chromebook 11（2014年モデル）が19,800円で売ってる](http://chromesoku.com/dell-chromebook-11-sale-rakuten/)
+ [【特価情報】AmazonサイバーマンデーにASUS Chromebook flipとDell Chromebook 11が登場](http://chromesoku.com/cyber-monday-deal-2015/)

いずれも[Chrome速報](http://chromesoku.com/)より引用しました。

かくいう僕も、先月末に、娘にWindowsタブレットを壊されたのをキッカケに、Chromebookを買いました。中古のAcer C720をじゃんぱらで。17,800円也。

Chromebook買うならC720しか考えられなかった僕としては最高の買い物でした。

全額嫁負担ですけど。

## ChromebookでGo言語

CroutonでUbuntuを起動する方法が、おそらく、Chromebookで開発をするスタンダードなのかもしれませんが、Go言語に限って言えば、もっと簡単に環境構築ができます。

### 構築手順

https://github.com/golang/go/wiki/ChromeOS  
ここに書いてあることをするだけ

1. デベロッパーモードになる  
2. ダウンロードする  
3. croshからシェル起動
4. ダウンロードしたものを解凍
5. ワークスペースの作成
6. パスを通す
7. テストコードを書く
8. 実行！

カップラーメンにお湯を注いでからやっても、麺はのびません！！

### 追加手順

とはいえ、go getでパッケージのインストールができない状態です。なぜなら、gitがないから。

ここは、[chromebrew](https://github.com/skycocker/chromebrew)の出番。

1. shellにコピペする

>wget -q -O - https://raw.github.com/skycocker/chromebrew/master/install.sh | bash

手順はたったこれだけ。インストールには30〜40分くらいかかりますが、西武池袋線で池袋から飯能に行くよりは早く終わります。

で、昨日から、僕は、Goでスクレイピングのコードを書き始めたんですが、今のところ、特に困ったことはありません。むしろ楽しいです。最高です。

## 別解

先に、Chromebrewを入れて、crew install goのほうが無駄が少ないかも知れません。でも、サクっと動く感動が薄れると思うので、僕はオススメしません！

あとは、croutonでubuntuっていうのもいいと思いますが、割りとめんどくさいです。僕だけかも知れませんが、USBにxubuntu入れようとしたら、途中でキーボードもタッチパッドも無反応になって、何度かやり直しました（結果的には問題なくインストールできましたけど）。

## まとめ

Chromebook最高かよ！
Dockerのルートディスクサイズを増やし方

###スペック
docker v1.3.3
centos6.5

##なぜ増やした
初期設定の10GBだと足りなくなってしまったので増やすことにしました。
ちなみに

```
# cat /var/lib/docker/devicemapper/metadata/
{"device_id":0,"size":10737418240,"transaction_id":1,"initialized":true}
```
これで確認できるかと思います。

##どうやって増やす
[Dockerでルートディスクサイズを調整する](http://qiita.com/HommaHomma/items/a3ad028ba619aae76fa9)
こちらを参考にさせていただいたところ
/etc/sysconfig/docker-storageを用意して「DOCKER_STORAGE_OPTIONS=" --storage-opt dm.basesize=40G" 」を追加してあげればいいのかと思って

```
# service docker stop
# rm -rf /var/lib/docekr
/etc/sysconfig/docker-storage # 追加
# service docker start
```
このように対応しましたが

```
# cat /var/lib/docker/devicemapper/metadata/base
{"device_id":0,"size":10737418240,"transaction_id":1,"initialized":true}
```
と増えませんでした。

##少し違っていた
https://github.com/docker/docker/tree/ec1002db58e8f84fc6d8306a3dd580e5fa88872c/contrib/init/sysvinit-redhat
Dockerを使用しているサーバーには上記のURLからinitを持ってきてdockerはgithubにあるバイナリを使ってました。
initのdockerの方を見てみると

```
# Description: Daemon for docker.com
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

prog="docker"
exec="/usr/bin/$prog"
pidfile="/var/run/$prog.pid"
lockfile="/var/lock/subsys/$prog"
logfile="/var/log/$prog"

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

prestart() {
```
一部抜粋ですが、/etc/sysconfig/$progと/etc/sysconfig/dockerのみ叩いていました。
ですので、/etc/sys/config/docker-storageでなくて/etc/sysconfig/dockerを変更するようにしました。

####before

```
# /etc/sysconfig/docker
#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker daemon

other_args=""
```

####after

```
# /etc/sysconfig/docker
#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d

other_args=" --storage-opt dm.basesize=40G"
```
と変えてあげて先ほどの手順を行ったところ

```
# cat /var/lib/docker/devicemapper/metadata/base
{"device_id":0,"size":42949672960,"transaction_id":1,"initialized":true}
```

増やすことに成功しました。

##終わり
今回調べてみたらほとんど/etc/sysconfig/docker-storageに「DOCKER_STORAGE_OPTIONS=" --storage-opt dm.basesize=40G"」を記載してあげればいいとの事だったのでv1.3.3より大きいDockerならばこのお方法は必要ないかと思います。
Internet Explorer 11 では Date#toLocaleString() の文字列に不可視な文字が含まれる

# 現象

[Date#toLocaleString()](https://msdn.microsoft.com/ja-jp/library/wb66sb9s(v=vs.94).aspx) は、下記のように日付をその地域の文字列で返します。

```js
var date = new Date();
console.log(date.toLocaleString()); // "‎2015‎年‎12‎月‎16‎日‎ ‎13:‎02‎:‎27"
```

この結果、一見ただの日付に見えますが、IE 11 では数字の前後に Left-to-Right マークが存在します。

```js
// Left-to-Rightを「!」に置換
console.log(date.toLocaleString().replace(/\u200E/g, '!'));
//=> "!2015!年!12!月!16!日! !13!:!02!:!27"
```

※Left-to-Rightマーク(`U+200E`、HTMLでは`&#8206;`または` &lrm;`): 文字の記述方向を示すコントロール文字（[Wikipedia Left-to-right mark](https://en.wikipedia.org/wiki/Left-to-right_mark))

なお、`Date#toLocaleDateString()` でも同様です。

# なにが起こるか

* 文字列の長さ(`String#length`)がChromeなど他のブラウザと異なる
* HTTPで送信(ajax / form submit)したときに文字`&#8206;`として処理される

# どうするべきか

文字列をそのまま表示する以外の目的でこのメソッドを使うべきではないでしょう。

特に年月日などの数字が欲しい場合に、この文字列をパースしようなどと考えてはいけません :feelsgood: :finnadie: :feelsgood: 
（年：`getFullYear()`、月：`getMonth()+1`、日：`getDate()`を使います）


# 参考リンク

http://stackoverflow.com/questions/25574963/ies-tolocalestring-has-strange-characters-in-results
Koa 2.0.0 の開発版で Async を使う


Koa 2.0.0 の開発版でミドルウェアの戻り値に ES6 (ES2015) の Promise が使われるようになりました。ES7 (ES2016) で提案されている Async を使えば、ロジックを把握しやすくなります。

Babel のセットアップ
------------------

まずコマンドラインツールを導入します。

```bash
npm install -g babel-cli
```

node v5 で導入されていない ES6 の機能を使うために `babel-preset-es2015-node5` を導入します。Async/Await の構文のためのプラグインも別に導入します。ブラウザーでの Async 対応に関しては「[Async/Await を使って HTTP リクエストを送信する](http://qiita.com/masakielastic/items/96e5142f1326b6998533)」の記事をご参照ください。

```bash
npm install --save \
node-fetch babel-preset-es2015-node5 \
babel-plugin-syntax-async-functions \
babel-plugin-transform-async-to-generator
```

`package.json` で使うプリセットとプラグインを指定します。

```js:package.json
{
  "babel": {
    "presets": ["es2015-node5"],
    "plugins": [
      "syntax-async-functions",
      "transform-async-to-generator"
    ]
  }
}
```

Koa のインストール
----------------

```bash
npm install --save koa@^2.0.0-alpha.3
```


ミドルウェアを書く
--------------

`README` に記載されているロガーのコードを試してみましょう。オブジェクトの生成に `const` が使われていて、最初に見たときはびっくりしましたが、MDN の[ドキュメント](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const)を読むと、オブジェクトの属性は保護されないことが明記されています。


```js:src.js
import Koa from 'koa';
const app = new Koa();

// ロガー

app.use(async (ctx, next) => {
  const start = new Date;
  await next();
  const ms = new Date - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

// レスポンス

app.use(ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);
```

トランスパイルと起動
----------------

コードの分量が少ないので、`babel-node` でトランスパイルとアプリの起動を同時にやってみましょう。

```bash
babel-node src.js
```

ブラウザーにアクセスして、ターミナルにメッセージが表示されれば、動作の確認は終了です。

アプリを停止させたら、今度は `babel` コマンドは ES5 対応のコードにトランスパイルしてみましょう。

```bash
babel src.js --out-file app.js
```

アプリケーションを起動してみましょう。

```bash
node app.js
```


Promise 版
----------

比較のために `async` を使わないバージョンは次のようになります。`async` を使う場合と比べて、コールバックがある分だけ、構造を把握するための時間がかかります。

```js:src.js
const Koa = require('koa');
const app = new Koa();

app.use((ctx, next) => {
  const start = new Date;
  return next().then(() => {
    const ms = new Date - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
  });
});
```
【Android】カスタムビュー用のattrsの属性の名前が重複する問題を解決する

# attrsの属性の名前が重複する
Androidでカスタムビューを作る際に、attrsにカスタム属性を定義することがあると思いますが、重複する名前は宣言することができません。

うかつにカスタムビューの中で同じ属性を使うと`error: Attribute “***” has already been defined when using two library projects in Android`というエラーが出てしまいます。

重複している名前を変更すれば良いのですが、汎用的な名前はAndroid SDKの中で定義済みの事が多いですし、似たような名前の属性がたくさんあると使う時に混乱するので、他の解決策がないか調べてみました。

# 解決策
要約すると、解決策は以下の3通りしかありません。

* 重複する属性にprefixをつける
* 共通の属性を宣言する
* Android SDKで定義されている属性を再利用する

## 重複する属性にprefixをつける 
これが一番簡単な解決策です。

```attrs.xml
<resources>
    <declare-styleable name="CustomView1">
        <attr name="my_text" format="string" />
    </declare-styleable>

    <declare-styleable name="CustomView2">
        <attr name="my_text" format="string" />
    </declare-styleable>
</resources>
```

となっている所を

```attrs.xml
<resources>
    <declare-styleable name="CustomView1">
        <attr name="CustomView1_my_text" format="string" />
    </declare-styleable>

    <declare-styleable name="CustomView2">
        <attr name="CustomView2_my_text" format="string" />
    </declare-styleable>
</resources>
```

と変更します。

これで大抵の場合解決しますが、なんだか冗長で芸がない気がします。（とはいえ、場合によってはこの方法でしか解決できないこともあるでしょう。）

## 共通の属性を宣言する
同じアプリ内で共通の属性を使用したい場合、共通の属性を宣言すれば解決できます。

```attrs.xml
<resources>
    <declare-styleable name="CustomView1">
        <attr name="my_text" format="string" />
    </declare-styleable>

    <declare-styleable name="CustomView2">
        <attr name="my_text" format="string" />
    </declare-styleable>
</resources>
```

となっている所を


```attrs.xml
<resources>
    <attr name="my_text" format="string" />

    <declare-styleable name="CustomView1">
        <attr name="my_text" />
    </declare-styleable>

    <declare-styleable name="CustomView2">
        <attr name="my_text" />
    </declare-styleable>
</resources>
```

と変更すれば同じ属性を複数箇所で使用できます。

この方法だと、読み込んだライブラリに含まれている属性と重複している場合は解決にならないので、他の方法で解決する必要があります。

## Android SDKで定義されている属性を再利用する
backgroundやtextなど、汎用的な単語はandroid:xxxとしてSDK内で既に定義されていることが多いです。

これを使いたい場合は

```attrs.xml
<resources>
    <declare-styleable name="CustomView1">
        <attr name="my_text" format="string" />
    </declare-styleable>

    <declare-styleable name="CustomView2">
        <attr name="my_text" format="string" />
    </declare-styleable>
</resources>
```

となっている所を

```attrs.xml
<resources>
    <declare-styleable name="CustomView1">
        <attr name="android:text" />
    </declare-styleable>

    <declare-styleable name="CustomView2">
        <attr name="android:text" />
    </declare-styleable>
</resources>
```

と書き換えましょう。(`android:text`の箇所はフレームワークで宣言されている属性であれば何でも使用できます。)

この方法を使えば、レイアウトファイル内で
`app:text="hoge"`のような記載をしなくても`android:text="hoge"`で属性を指定できます。

# まとめ

基本的には３番目の方法を使いつつ、それで不足な分は1番目と2番目の方法で補っていくのが良いと思います。
UIColorからCIColorへの変換

# Problem

普通にCIColorプロパティを使おうと思ったら、エラーが発生した

```
❌ UIColor.whiteColor().CIColor
```

エラー

```
reason: '*** -CIColor not defined for the UIColor UIDeviceWhiteColorSpace 1 1; need to first convert colorspace.'
```

# Solution

以下のようにすると、正常に変換できる

```
⭕️ CIColor(CGColor: UIColor.whiteColor().CGColor)
```
QGISのprocessingでできそうなこと

この記事は、FOSS4G AdventCalenderの16日目の内容です。

FOSS4G2015Tokyoではprocessingを活用してみんなで課題解決をしましょう。といったセッションが開かれました。こうしたことから、自分も含めてprocessingをどう活用できるかは手探りな部分が多いのかもしれません。

事実「QGIS processing」なんかで検索したときに日本語の記事はあまり出てこないですし（探し方が下手とか言わない）、全体的にプログラマー寄りであったり、研究的であるような記事が多いような気がします（探し方がへｔ）。そもそもGISとはそういうものなのかもしれませんが・・・

QGISの使用用途
----------------
私のQGISの使用用途はもっぱら業務で使うことが多いです。そもそもQGISしか使ったことがないので、他に選択肢があまりありません。業務用途でGISを使う方法としては、データの整形であったり同じ処理を大量のデータに対して一括で行うためのバッチ処理であることが多いです。どちらの場合もGISである必要はないのですが、渡されたデータがGIS用のファイルだから仕方なくQGISで処理するというケースもあったりするのです。
○rcGIS？知らない子ですね、はは。

こうした作業はQGIS単独でできなくはないですが、processingを使うことによって結構便利にできるようになったりします。QGISの場合、できないことはプラグインを追加することで実現できたりすることが多いですが、たくさんあるプラグインの中から自分がしたいことと似ているプラグインを探すのは大変ですし、似たようなケースであるだけでピンポイントなケースとしてのプラグインは意外と少ないです、使ってみたけどコレジャナイ感むんむんです。さらに足を引っ張るのが社内のセキュリティ事情です。QGISは入れてもいいけどサードパーティーのプラグインは入れてちゃダメ、という会社は多いと思います。

こうした問題を解決してくれるだろうと信じているのがprocessingです。

今のところprocessingでやることは以下のようなところです。

* QGISのメイン機能と同じことをやる
* QGIS以外の機能を使う（比較する）
* コマンドを組み合わせてオリジナルのスクリプトを作る
* processingからバッチ処理


QGISのメイン機能と同じことをやる
---------------
QGISのメイン機能というか、もっぱらftoolsの方ではありますが、同じ機能は大抵登録されています。日本語で利用するときはftoolsの方が翻訳されてprocessingのどの機能と対応するのかわかりにくくなってしまっていますが`「設定」→「オプション」`から`「ロケール」`で`「システムロケールを上書きする」`にチェックを入れて有効になるプルダウンで`U.S. English`に設定してからQGISを再起動してみましょう。
英語版のQGISが立ち上がると思います。このとき、ftoolsの項目とprocessingの項目が一致するので、どれが同じ機能なのかが明白です。
もとに戻したいときは`「Settings」→「Options」`と辿り`「Locale」`で`「Override system locale」`のチェックを外してQGISを再起動すれば元に戻ります。
そしてこれはFOSS4Gの会場で知ったことですが、メイン機能よりも出力形式が豊富にあるという不思議な恩恵を受けることができます。シェープファイルではカラムのバイト数制限の問題が・・・とお悩みの方はprocessingに切り替えるだけで幸せになれます。また、出力には**メモリレイヤ**や**テンポラリ**としての出力も可能なので動作確認だけしたいのに不用なファイルが増えるのはちょっと・・・なんて心配もありません。


QGIS以外の機能を使う（比較する）
----------
QGISでできずとも他のソフトでできることもあるかもしれません。また、同じ機能がGRASS・SAGAとかにもあったりします。例えば、Dissolveとか検索しちゃったりなんかするだけでこんなに出てきます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59288/9ff5c193-bfd6-8f78-27ce-c53db005f7bb.jpeg" width=80%>
さらに余り好ましいことではないかもしれませんが、微妙に設定できるパラメータが違ったりして結果が異なったりするので自分の期待通りの結果を返してくれる機能を探すのもいいかもしれません。

ところで、QGIS以外の機能に関しては各ツールがインストールされていることが条件です。GDAL/OGR・GRASS・SAGAあたりはWindowsの場合はインストーラ使えば一緒にインストールすることができるのですぐ使えるようになりますが、OTB・LASToolsなどは別途自分で設定する必要があります。OTBはOSGeo4Wから入れることができるので比較的利用しやすいかと思います。OSGeo4Wから入れる場合、管理者権限で実行する必要があるかもしれないので注意が必要です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59288/1bc51ffe-943c-0a14-4a99-f8930104e16f.jpeg" width=80%>
R・・・は、ご存知の方いたら教えてください。

コマンドを組み合わせてオリジナルのスクリプトを作る
-------------
ここは[チラシの裏](http://qiita.com/Zero_Kohaku/items/e24bcb7e8e67ca08f988)にでも書いておきましょう。


processingからバッチ処理
-----------
[公式ドキュメント](http://docs.qgis.org/2.8/ja/docs/user_manual/processing/batch.html)に書かれていたりOSGeoのMLでも流れていましたが、processingの各コマンドはバッチで動かすことができるようになっています。このバッチの機能は単体のコマンドだけではなく自身で作ったモデルやスクリプトに対しても使えます。
ということは、何かしらのデータを整形して・・・整形した後にデータを集計して・・・集計した結果を何かしらの形で出力する。といったオリジナルのモデルも大量のデータを金曜日に動かして帰って月曜日に出社したら、はいできたー。なんてことも夢ではないかもしれません。

という、非常に自己満足度が高い内容になりましたが、少しでも使ってみようかなという気持ちになっていただけたらいいな、と思う次第であります。
QGISのprocessingを使ってパンシャープン画像作ってみた

AdventCalender FOSS4G 二個目だよ16日目の記事です。

学習も兼ねて実際にprocessingのグラフィカルモデラーでモデルを組んでみました。今回のゴールはLANDSAT8の短バンド画像群からパンシャープン画像を作ることにします。使用したバンドは２、３、４、８帯とお馴染みのバンド帯を使用しています。

パンシャープン化のアルゴリズムはいくつか存在するようですがここでは触れません。純粋に、高解像度なカラー画像を作成することを目的とします。

ワークフロー
-------------
実際の作業フローは以下のような感じになります。
S. QGISでレイヤ読み込み（Input）
1. バンド２，３，４帯からカラー画像（マルチスペクトル画像）を作成
2. 作成したカラー画像をバンド８帯の高解像度画像とスケールを合わせる
3. 画像合成
R. パンシャープン画像できる（Output）

それぞれをprocesingのコマンドに置き換えると
1. Build Virtual Raster[GDAL]
2. Superimpose sensor[OTB]
3. Pansharpening（bayes）[OTB]
※インプットとアウトプットは省略

です。なんということでしょう、ほとんどOTBです。これだったらOTBを直接いじくった方が効率がいいのでは？と思わなくもないですが、使い慣れたツールから少しの冒険をするだけでいろんなことができるようになる。というところがおもしろいのです。

そして、これをグラフィカルモデラーで表現すると下図のようになります。
<img width="796" alt="graphical_modeler.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/59288/3aebfaf2-4851-91f5-8182-8eadbbcbc24d.jpeg">

上の方にある紫色のボックスが「入力」と呼ばれるインプットレイヤです。今回のケースで言えばLANDSAT8の衛星画像の短バンドラスタデータです。
真ん中にある白いボックスが「アルゴリズム」と呼ばれるprocessingのコマンドです。
最後の下の方にある水色のボックスが出力結果を表しています。

では、順を追って説明していきます。

入力の追加
------------------
パンシャープン画像を作るには４枚のラスタデータが必要なので、入力するためのボックスも４つ用意します。
グラフィカルモデラーの左側にあるペインの中で「入力」タブを選ぶと色々なボックスが出てきますが、今回は全てラスタデータなので「Raster layer」を４つD&Dかﾀﾞﾌﾞﾙｸﾘｯｸで右側のペインに登録します。このとき、適当な名前と各入力ボックスがモデルの中で必須項目なのかどうか聞かれますがどちらもでいいと思います。それぞれ言葉通りの意味だと思います。

それ以外の入力ボックスは使ってみたものの感覚だと

|入力|予想|
|:---|:---|
|Boolean|YES/NO判定に使うフラグとかのチェックボックスに対応する|
|Number|バッファとかの距離（数値）を入力するテキストボックスに対応する<br>（なぜか数値の範囲指定もある）|
|String|コマンドオプションなどを入力するテキストボックスに対応する|
|Table field|ベクタ・テーブルなどのカラムに対応する|

他、Extent・File・Tableはちょっとよくわかりません。それぞれそのまんまだと思うのですが、入力を受け付けてくれるコマンドを探すだけで一苦労・・・ExtentなんかはNumberと重複しているのだけど逆では・・・？と思わなくもなかったり。


アルゴリズムの追加
------------------
「入力」を追加したら、次は使用するアルゴリズムを左側のペインにある「アルゴリズム」タブから選びます。
今回はカラー画像を作成する「Build Virtual Raster」「Superimpose sensor」「Pansharpening（bayes）」を探し出して「入力」と同様にD&Dかﾀﾞﾌﾞﾙｸﾘｯｸで選びます。
それぞれのアルゴリズムで単独のコマンド実行時のパラメータ設定を求められますが、後で修正できるので適当に入力してエラーが出ずに右側ペインに登録できればいいです。


各アルゴリズムを接続
------------------
単体のアルゴリズムは必ず入力に対して出力が存在します。つまり各アルゴリズムを接続するというのは、処理したアルゴリズムの出力を、次のアルゴリズムの入力にしてしまうということです。ということは、Build Virtual Rasterで作成したカラー画像を、次のSuperimpose Sensorの入力として使用し、Superimpose Sensorでスケールアップしたカラー画像を、Pansharpening（bayes）の入力としてしまうことです。
非常に複雑に見えてしまうかもしれませんが、グラフィカルモデラーではそこまで複雑ではないです。今回のケースの場合、下の図が実際にSuperimpose Sensorのパラメータ設定画面ですが、右側ペインに登録されている入力ボックス以外に赤い枠のような項目が出てきます。図で言えば「仮想 以下のアルゴリズムより'Make Color Image'」とあり、これが'Make Color Image'のコマンドに対応する出力を意味していますので、これを選択するとアルゴリズムの接続ができます。
![chane.jpg](https://qiita-image-store.s3.amazonaws.com/0/59288/18e30621-5e2d-11ea-3b0b-491f56820d21.jpeg)

ちなみに'Make Color Image'というのは登録したアルゴリズムの別名です。実際は'Build Virtual Raster'のことを意味します。


出力の追加
------------------
出力に対するボックスは存在しないようです。代わりに、最後のアルゴリズムから出力ボックスを発生させます。最後のアルゴリズムのボックス右下の鉛筆マークから編集画面を開きます。
コマンドには必ず出力結果の保存先を入力するボックスがあるので、そこに出力にふさわしい名前を入力するだけでOKです。えぇ、なんでもいいです。
<img width="80%" alt="output.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/59288/89160e3e-26cf-d7de-2f4e-58998f6d62b0.jpeg">
ハラショー

実行テスト
------------------
これで入力から出力までのモデルができあがりました。試しに、ちゃんと動くか（ここではフォームが表示されるか）確認してみます。
左上のツールバーに歯車が噛み合わさったアイコンを選択してフォームが表示され、ちゃんと入力と出力、場合によっては他の設定値入力が期待通りに表示されればひとまず完成です。あとは実行してみて期待通りの結果が返ってくるか確認するだけです。


以上
Hamlで条件に合う時だけ特定のクラスを加えたい

Padrinoでwebアプリを書いている。Template engineにはhamlを使っているが、特定の条件の時だけ特定のクラスを付与したいようなことがある。例えばある期間以外ではリンクを無効にしておきたいなど。

```haml
- if some_condition
  %a.wrapper.disabled{href: "some_URI"}
    %span.content Some Content
- else
  %a.wrapper{href: "some_URI"}
    %span.content Some Content
```
DRYでない。Hamlではruby構文のスコープとタグのスコープが均しくインデントで制御されているのでちょっと面倒だった。試してみた所、{}の中で宣言したclassと外で宣言したclassはマージされるらしいので、こう書くとDRYになる。

```haml
%a.wrapper{href: "some_URI", class: [some_condition ? "disabled" : nil]}
  %span.content Some Content
```
Embulk Meetup Tokyo #2 レポート

![5d912123dec64931a097dda2e471793b.png](https://qiita-image-store.s3.amazonaws.com/0/31694/0bd7e46e-af36-f870-04ec-0ceeb3d02592.png)

<iframe src="//www.slideshare.net/slideshow/embed_code/key/uJA6Oje9BNEiDw" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/frsyuki/embulk-56197273" title="Embulk - 進化するバルクデータローダ" target="_blank">Embulk - 進化するバルクデータローダ</a> </strong> from <strong><a href="//www.slideshare.net/frsyuki" target="_blank">Sadayuki Furuhashi</a></strong> </div>

<img width="848" alt="meetup-screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/31694/97e59f19-7525-7b24-92a5-3945b8af5e1e.png">
コマンド終了前に後片付けをする


# やりたいこと

長いbashシェルスクリプトがあり、終了箇所がいくつもある場合に
後片付けをしたい。

```bash
#!/bin/bash

echo "start"

func1() # この中で終わるかもしれないし
func2() # こちらで終わるかもしれない
func3() # はたまた
func4() # ...

```

# それtrapでできるよ！

```bash:random_exit.sh
#!/bin/bash

exit_finally() {
  echo "cleanup"
}

# 終わるかもしれないし終わらないかもしれない
func1() {
  local param=$1
  local num=`expr $RANDOM % 10`
  if [ $num -eq $param ]; then
    echo "param=$param is end"
    exit 0;
  fi
}

echo "start"
trap exit_finally EXIT

func1 1
func1 2
func1 3
func1 4
#func2  # こんなのが無数にある
#func3
```

```bash
$ ./random_exit.sh
start
param=2 is end
cleanup
$ ./random_exit.sh
start
cleanup
```

# 参考

シェルスクリプトで trap を忘れちゃいませんか - 理系学生日記
http://kiririmode.hatenablog.jp/entry/20130109/p1
アロー演算子

■ CakePHPのカスタマイズで初めてお目にかかったPHPのアロー演算子
http://blog.s-giken.net/103.html
http://blog.s-giken.net/104.html#comment-168

PHPのクラスは比較的に他のクラスより動きが解りやすいので、
バージョンアップして、、難解になる前に今のうちに習得しておいたほうが良い。

■ クラスに関しては以下を参照
http://www.objective-php.net/basic/about

関係ないのだが、C++の構造体が夢の続き。。。
http://vivi.dyndns.org/tech/cpp/ex-struct.html
Slackの新しいフレームワークBotkitを試してみる


今日、Slackプラットフォームの発表がありました。

http://slackhq.com/post/134878632730/launch-platform

その記事の中に新しいSlackのフレームワークBotkitなるものがあったので試してみました。

## Botkitの準備

まずはGitHubからcloneしてきます。

```
$ git clone git@github.com:howdyai/botkit.git
```

## Slackの設定

以下のリンクからお使いのSlackのチームにbotユーザを追加します。

https://my.slack.com/services/new/bot

適当にbotの名前を入力します。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/4116/4f171b2d-925b-40d6-77fd-00ab879af8b1.png "01.png")

画像をアップロードして「Save Integration」をします。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/4116/9d58e59d-95af-a6e1-d85b-af6ad042b0f6.png "02.png")


API Tokenをコピーして、先ほどcloneしたリポジトリに移動して以下のコマンドを実行します。

```
$ cd botkit
$ token=REPLACE_THIS_WITH_YOUR_TOKEN node bot.js
```

そうするとdarth_vaderがオンになります。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/4116/11cec7e9-886d-a671-0073-7670a047b7ce.png "3.png")

## 試す

適当なチャンネルにbotを招待します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/4116/a14c0dde-d89f-cf6e-1786-2d74fd03abab.png "4.png")


あとは、そのチャンネルでbotにメンションするとなんか返してくれます！

![5.png](https://qiita-image-store.s3.amazonaws.com/0/4116/bed2594d-2e52-0a0b-e213-8bead69344fc.png "5.png")


## まとめ

いままで、Hubot使っていたのですが、それに比べるとだいぶ気軽に試せていいですね。
PythonでKinesis操作する



# Kinesisストリームとは

大量のデータレコードをリアルタイムで収集し、処理する。
1時間当たり何テラにもなるデータを連続的に取得し保存できる。
データの保存期間は24時間。課金することで7日まで延ばすことができる。


## シャード

ストリームのスループットの単位。
シャードを増やすことでそのストリームのスループットを増やすことができる。

## データレコード

ストリームに保存されるデータの単位。
レコードは、シーケンス番号、パーティションキー、データBLOBで構成されている。
データBLOBとはデータそのもの。Base64でエンコードされて保存される。


# Kinesisの制限

- 1レコードの容量は1MB

## 読み取り
どちらかにひっかかるとエラーなります。

- 1シャードにつき2MB/s
- 1シャードにつき5トランザクション

## 書き込み
どちらかにひっかかるとエラーなります。

- 1シャードにつき1MB/s
- 1シャードにつき1000トランザクション

# PythonでKinesisからget/putする

## 準備

pipでbotoをインストールする。
AWSでアクセスキーとシークレットキーを取得しておく。
プログラムと同じ階層に`.boto`として以下のようなファイルを作成する。

```lang:.boto
[Credentials]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
```

## getする
   
```
from boto impor kinesis

# 使用するKinesisのリージョンを指定する
conn = kinesis.connect_to_region(region_name = 'リージョン名')

# 指定したstreamの情報を取得する
stream = conn.describe_stream('ストリーム名')

# さっきとってきたストリームの情報の中からシャード情報を取得する
# シャードが複数ある場合は、リストで返る
shards = stream['StreamDescription']['Shards']

# 全てのシャードから取得する
for shard in shards:
  shard_id = shard['ShardId']

  # 取得する位置を得る
  # 第1引数：ストリーム名
  # 第2引数：シャードid
  # 第3引数：読み取りタイプ
  #         LATEST:シャードの一番最後から読み取る
  #         TRIM_HORIZON:シャードの一番最初から読み取る
  #         AT_SEQUENCE_NUMBER:指定したシーケンス番号から読み取る。第4引数でシーケンス番号を指定
  #         AFTER_SEQUENCE_NUMBER:指定したシーケンス番号の次から読み取る。第4引数でシーケンス番号を指定
  iterator = conn.get_sahrd_iterator(stream['StreamDescription']['StreamName'], shard_id, shard_iterator_type='LATEST')['ShardIterator']

  # Kinesisからデータを取得
  # 第2引数で取得上限指定可能(limit)
  result = conn.get_records(iterator)
  print result

```

streamをdescribeしたやつをprintするとわかりやすいと思います。

## putする

```
from boto import kinesis


# 使用するKinesisのリージョンを指定する
conn = kinesis.connect_to_region(region_name = 'リージョン名')

# putする
conn.put_record('ストリーム名', data = 'hogehoge', partition_key = 'partition_key')

```

### partition_key

パーティションキーは、データレコードを分離してストリームの異なるシャードにルーティングするために使用される。
ストリームに2つのシャードがある場合、2つのパティションキーを使用し、どのシャードにどのデータを格納するか制御することができる。

# 参考

- https://aws.amazon.com/jp/kinesis/streams/details/
IT企業の営業担当になって2年経つ私が思うこと。

自分がQiitaに記事を投稿する日が来るなんて思ってなかったので、
ガクブルしながら文字を打ってます( ´；д；)

みなさま、ナマステー。

会社のエンジニアに交じって記事を投稿する事になりました…
**「っしゃ、やったるで！」**
と思ったものの、
やっぱりまともな技術系の記事を書ける訳もないので、
営業担当は営業担当らしく、自分の業務に関係する記事を書こうかなと思います(+･`ω･´)ｷﾘｯ

まぁ、タイトル通り、
**営業担当になってみて感じたこと**っていうか…**主張**なんですけども、
私自身、営業担当をやってみて思った事が**3つ**あります。

1. IT用語知らなくても出来ちゃった！
2. やっぱり元気と笑顔が大事だわ。
3. 実務経験がなくても、努力次第でエンジニアの道は開けるんですね…

## ■IT用語知らなくても出来ちゃった！
…というのも、去年の春、新卒入社で今の会社に入った私は、
それまで、広島県のど田舎でのほほーんと生活しておりました。
得意科目は英語と国語、苦手（むしろ嫌い）科目は数学、理科。
英語のテストが100点に対して、数学のテストは8点とかいう、まぁーなんて素直な子。
ご覧の通り、**IT**とは全く無縁の場所にいた人間です。

そんな私は勿論、入社当時のIT知識はゼロ。
**「Javaってなんだよ」**
**「ふおぉぉぉ、これがMacか…!!」**
と、まぁ、そんな感じのレベル。

それでも、2年経った今、
**「クライアント側とサーバー側が…」**
**「Xcodeっていうのはね…」**
なんてドヤ顔で言っちゃうレベルに。

ーなんでIT知識がついたの？

営業担当は、お客様との打ち合わせや日々流れている案件に必ず触れるもの。
そこで出てくるのは**IT用語**。
それを逐一メモして、自分で調べて理解するっていう**習慣**をつける事によって、
どんどん、自分の脳みそにあるIT用語フォルダが埋めていったのです。

というわけで、結局何が言いたいかっていうと、
**「覚えようって意識さえあれば、自然に身に付くぜ」**
って事。
特に身構える必要もなければ、資格を取る必要もない。
場数こなせば、ドヤ顔で用語をずらずら言える日がきます。

もちろん、覚えた事をパーフェクトに説明できる訳ではないですが…
IT企業の営業担当をやるのに、文系も理系も関係ないんですね。

## ■やっぱり元気と笑顔が大事だわ。

これはもう、言葉通りなんですが…。
IT企業の営業である以上、IT用語や周辺知識が入っていれば、話はしやすい…。
だけども、それ以上に**元気**と**笑顔**があれば、
大抵の事は乗り越える事ができます。
もちろん、空元気とかじゃダメですけどねヾﾉ･`ω･)

こればっかりは、IT企業だろうがどの分野だろうが関係ないですね。
営業の大事なポイントは、**相手と仲良くなること** や **相手の話を聞くこと**。
当たり前のことで、とっっっても大事なポイントです。

## ■実務経験がなくても、努力次第でエンジニアの道は開けるんですね…

営業やってると、業界の色々な部分が見えちゃうのも面白かったり。
そこで感じました。
**「あー…やっぱり実務経験がもの言うんだな」**
と。
どれだけ「バリバリにコーディングできます！」のようなキャッチコピーがあっても、
実務経験が2ヶ月とかだったら、中々お客様は振り向いてくれません…。

でも、そこで気付いた事があります！
**アウトプット（＝成果物）があれば、ある程度乗り切れる！**
ということに！

「あ？なんだと？実務経験がないからダメだって？
　この成果物が目に入らぬか！」

ってぐらいのガッツがあれば、実務経験なんて所詮数字だぜ…と思えるのです。
アウトプットっていうのは、
例えば個人制作で開発したアプリだったり、
一人でストアにリリースした経験があるとか、そういう**+α**になるもの。

それさえあれば、お客様のハートはばっちりGET☆

もう「実務経験が…」なんて言わせない！
だからエンジニアのみなさん、まずが何かやってやりましょう！
その行動が、自身のエンジニア人生でとても大事なキーになる。


｡:+* ﾟ ゜ﾟ *+:｡:+* ﾟ ゜ﾟ *+:｡:+* ﾟ ゜ﾟ *+:｡:+* ﾟ ゜ﾟ *+:｡:+* ﾟ ゜ﾟ *+:｡


さてさて、
いざ書き始めると、言いたい事がぽんぽん出てきて、
中々長文になってしまた…( ﾟωﾟ )さーせん。

上記に挙げたのはあくまでごく一部。
他にも営業担当を2年やってると、いろーーーんな事が見えてきました。

山あり谷あり…良いことも悪いこともたくさんあります。
ただ、楽しく仕事ができてるなーと自分自身も実感しています。

それは、**一緒に働いている社員の皆様のおかげ**だったり、
周りで**サポート**してくれるたくさんの人のおかげ。

結局は人とのつながりがあってこその仕事なんですね。

なんて、最後に良い事言ってやろうと思ったのに失敗したところで、
私の主張はこれにて終了！

## ご清聴ありがとうございました！･:*:･d(*´∀`*)b ･:*:･
CS-Cart: 現在ユーザのユーザ情報を取得する

CS-Cartで現在セッション中のユーザを取得するには、Registryから取ってくる。

```php
\Tygh\Registry::get('user_info');
```

```
array(7) {
  ["user_id"]=>
  string(1) "1"
  ["user_login"]=>
  string(5) "admin"
  ["company_id"]=>
  string(1) "0"
  ["firstname"]=>
  string(4) "John"
  ["lastname"]=>
  string(3) "Doe"
  ["email"]=>
  string(24) "admin@example.com"
  ["user_type"]=>
  string(1) "A"
}
```
Mongo Shellの--evalオプションでオブジェクトをJSON出力する

この記事は[MongoDB Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/mongodb)の16日目です。

`mongo`コマンドで起動できるMongo Shellには`--eval`オプションがあり、対話式のMongo Shellを開かずに直接コマンドを評価・実行することができます。

しかし、この機能で普通にオブジェクトを出力しようとすると、対話式モードと違い以下のような出力になってしまいます。

```
$ mongo --eval 'rs.conf()'
MongoDB shell version: 3.0.6
connecting to: oreno-mongodb00-00:27017/test
[object Object]
```

中身が見えない！！

そこで`printjson()`です。これを使うと`--eval`であってもオブジェクトの中身まで表示できます。

```
$ mongo --eval 'printjson(rs.conf())'
MongoDB shell version: 3.0.6
connecting to: oreno-mongodb00-00:27017/test
{
	"_id" : "oreno-mongodb00",
	"version" : 11,
	"members" : [
		{
			"_id" : 0,
...
```

やったね。

- [MongoDB Shell (mongo) — Getting Started With MongoDB 3.0.4](https://docs.mongodb.org/getting-started/shell/client/)
[iOS8~]セルの高さ可変UITableView(コードベース)


備忘録。UITableViewCellの`contentView`って存在を知らなかった。

調べてもxibでAutoLayoutしてるケースばかりで詰まった。

# やりかた
1. `UITableViewCell`の**`contentView`**の大きさをAutoLayoutで設定する。

2. `estimatedRowHeight`と`rowHeight`の設定

``` swift
tableView.estimatedRowHeight = 464//だいたいの高さの見積もり？
tableView.rowHeight = UITableViewAutomaticDimension
```



※以下のデリゲートメソッドは実装しない
> func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
Sublime Text 3に関するTips

環境
====
Mac OSX Yosemite
Sublime Text 3

ShiftJISへの対応
====
Package Control (CMD+SHIFT+P)でinstall
ConvertToUTF8を検索してインストールする

また、コーデックも必要なので、Codecs33というプラグインを下記のリポジトリからダウンロードして解凍し、手動でPackagesディレクトリに設置します。

seanliang/Codecs33 · GitHub
https://github.com/seanliang/Codecs33/tree/osx

ブランチ名がosxであることに注意。

* 設置方法

Sublime Text 3のPreferencesから、Browse Packagesを選択すると、ファインダーでPackagesディレクトリが開きます。その直下に、Codecs33という名前で解凍したディレクトリを設置します。
ダウンロードした状態では、Codecs33-osxなので、自分で名前変更することを忘れずに！

テーマのカスタマイズ
====

Monokaiテーマで、選択行を目出させたい。
次のファイル

    Applications/Sublime Text.app/Contents/MacOS/Packages/Color Scheme - Default.sublime-package

を作業用フォルダにコピーし、拡張子`sublime-package`を`.zip`(つまりファイル名は`Color Scheme - Default.zip`)にして展開する。

展開したディレクトリ`Color Scheme - Default`を開いて、中のファイル`Monokai.tmTheme`を編集する。以下のように修正する。

修正前：

    <key>lineHighlight</key>
    <string>#3E3D32</string>
    <key>selection</key>
    <string>#49483E</string>

修正後：

    <key>lineHighlight</key>
    <string>#7E7D72</string>
    <key>selection</key>
    <string>#89887E</string>

保存したら、`Color Scheme - Default`ディレクトリをまるごと、

    /Users/[ユーザー名]/Library/Application Support/Sublime Text3/Packages

以下に置く。つまり、保存後は

    /Users/[ユーザー名]/Library/Application Support/Sublime Text3/Packages/Color Scheme - Default

になる。

Sublime Text 3を再起動して、`Preference` -> `Settings User`を開いて、

	"color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",

としておけば、修正版が反映される。

NFSマウントしたストレージのフォルダやファイルが消せないことへの対応
----

削除出来ないのは、ゴミ箱がNFSマウントしたストレージにないことが原因。

    /Applications/Sublime Text.app/Contents/MacOS/Packages

の

    Default.sublime-package

をコピーして、Desktopなど作業用のディレクトリに置く。拡張子を.zipとして（ファイル名は`Default.zip`になる)展開する。
ディレクトリの中に入り、`send2trash/plat_osx.py`を以下のように編集する。

    def send2trash(path):
        if not isinstance(path, bytes):
          &nbsp; path = path.encode('utf-8')
    
        fp = FSRef()
        opts = kFSPathMakeRefDoNotFollowLeafSymlink
        op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None)
        check_op_result(op_result)
        opts = kFSFileOperationDefaultOptions
        op_result = FSMoveObjectToTrashSync(byref(fp), None, opts)
        if(op_result == -120):
            op_result = CoreServices.FSDeleteObject(byref(fp))
        check_op_result(op_result)

※修正するのは、

        if(op_result == -120):
            op_result = CoreServices.FSDeleteObject(byref(fp))

を追加するだけ。

その後、Sublimeを再起動

（おまけ）._ファイルを表示しない
----
`Preferences`から、`User Setting`を開いて

    "folder_exclude_patterns": ["._*"],
    "file_exclude_patterns": ["._*"]

を追加。つまり、全体で

    "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
    "ignored_packages":
    [
        "Vintage"
    ],
    "theme": "Monokai.sublime-theme",
    "folder_exclude_patterns": ["._*"],
    "file_exclude_patterns": ["._*"]

のようにする。（最後の２行を追加した）

参考：http://www.sublimetext.com/forum/viewtopic.php?f=2&t=5739
Unity 5.3 では Visual Studio 連携に特に準備作業いらないぽい

ググってみると過去のバージョンで必要だった作業過程（プロジェクトごとに Visual Studio Tools を Import Package など）とかいろいろ出て来るが、今やそういう作業いらなくなったみたいなのでメモ。

#Unity 5.3 のインストール
※ 作業環境は Windows 10
![Unity_5.3_installation.png](https://qiita-image-store.s3.amazonaws.com/0/54184/22ed08be-5bc7-e7e5-9b01-332806a7392d.png)
チェック外さなければデフォで `Microsoft Visual Studio Tools for Unity` が入るようになっているのでそのままインストール。

#Visual Studio と Unity を接続
※ Visual Studio はインストールされている前提で
![Import_Package.png](https://qiita-image-store.s3.amazonaws.com/0/54184/a869ea6b-8608-a2e5-6310-3cd6ff98e990.png)
そもそも Import Package のリストに Visual Studio Tools for Unity が出て来ない。

![Open_Project_0.png](https://qiita-image-store.s3.amazonaws.com/0/54184/243e1c5f-b493-4753-ed8b-c55ca93119ce.png)
メニューの Assets から `Open C# Project` とやってもよいし

![Open_Project.png](https://qiita-image-store.s3.amazonaws.com/0/54184/984ca1a2-fcd1-4c23-eca1-7377eef51e0d.png)
Project View のところとかから適当に `Open C# Project` してもよい。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/54184/db854088-a74d-b2b1-70fd-b4365a4bd6cb.png)
Preferences でエディタが Visual Studio になっていれば

![Opening_VS.png](https://qiita-image-store.s3.amazonaws.com/0/54184/b9f84ccd-8387-8d81-c201-02c21aef7ae5.png)
そのまま立ち上がる。

Visual Studio から Unity に接続する。
接続だけするか、接続してそのまま Unity 側に Play させるか選べる。
![Attach_to_Unity.png](https://qiita-image-store.s3.amazonaws.com/0/54184/41cbd636-e321-9765-9451-0f4d08748b3a.png)

![Attach_to_Unity_and_Play.png](https://qiita-image-store.s3.amazonaws.com/0/54184/8447f180-a383-c18f-a85b-88021608dadb.png)
`Attach to Unity and Play` してみると

![Debugging.png](https://qiita-image-store.s3.amazonaws.com/0/54184/ab8c9b04-84c7-be13-bfd9-7d6f9b11a78e.png)
デバッグ始まってる。

ちなみに Standard Assets Example Project で同じことをやってみようとすると
![Example_Project_Build.png](https://qiita-image-store.s3.amazonaws.com/0/54184/9dba4917-2753-7cbc-9a02-6c890d455aab.png)
ビルドでコケてしまうが

メニューの `デバッグ` から
![Attach_Unity_Debugger.png](https://qiita-image-store.s3.amazonaws.com/0/54184/dbd23f00-8f34-36a3-a90d-343faab2e284.png)

`Attach Unity Debugger` を選ぶと
![Select_Unity_Instance.png](https://qiita-image-store.s3.amazonaws.com/0/54184/2dd07f96-6518-7bbd-8f26-cc2f9bdd5617.png)
手動で Unity 側と接続できてデバッグに入れた。
コマンドラインでpdfを連結する方法

# ghostscript
```bash
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf input1.pdf input2.pdf ...
```
でいける。

# convert
```bash
convert input*.pdf output.pdf
```

# pdftk
[pdftk](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)とは、pdfを編集するコマンドラインツール。結合だけじゃなく、分割や透かし入れたり色々出来る。[ここ](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?pdftk)とか[ここ](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/928splitpdf.html)とかに詳しい。
Homebrewで入れるには

```
$  brew search pdftk
No formula found for "pdftk".
==> Searching pull requests...
Closed pull requests:
pdftk: 2.02 - a Handy Tool for Manipulating PDF Documents (https://github.com/Homebrew/homebrew/pull/25953)
```

ということなので、

```
$  brew pull https://github.com/Homebrew/homebrew/pull/25953
######################################################################## 100.0%
==> Applying patch
Applying: pdftk: 2.02 - a Handy Tool for Manipulating PDF Documents
==> Patch closes issue #25953
==> Patch changed:
 Library/Formula/pdftk.rb | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
```

で、searchできるようになる。

```
$  brew search pdftk
pdftk
$ brew install pdftk
```

結合するときは

```
$ pdftk input1.pdf input2.pdf input3.pdf cat output out.pdf
```

`cat`で結合
`output filename`で出力するファイル名
Thymeleafのfragmentは、引数の記法を揃えよう


Thymeleafをお使いのリーファーの皆様、こんばんは。Thymeleafのfragmentに引数を渡すときにハマったので自分用にメモです。

たとえば以下のような引数を二つ持つフラグメントがあるとしましょう。

```
<th:block th:fragment="func(flag1, flag2)">
  <p th:if="${flag1 == true}">flag1です。</p>
  <p th:if="${flag2 == true}">flag2です。</p>
</th:block>

```
それを呼び出すときに、いろいろあって以下のように書いてしまいました。

```
<th:block th:replace="func(true, flag2=false)" />
```
非常に残念ながらこれではシステムエラーになります。どうやら記法を揃えなければならなかったようです。次のように書いてあげましょう。

```
<th:block th:replace="func(flag1=true, flag2=false)" />
```

もちろん次のようにもかけますが、読みやすさを考えると、上のほうが色々な人に怒られずに済みます。

```
<th:block th:replace="func(true, false)" />
```
恋愛の研究をまとめてみた

恋愛の研究は主に”認知系”や”心理学系”の「愛ってなに？」というものからIT技術を使って恋愛を拡張させるものまで様々なものが存在します。

ここでは技術を使ったどのような研究があるかを紹介します。

#調査研究
主にマッチングサービスが公開している情報です。
膨大な情報を処理し、よりよいサービス開発に使われます。

zooskがまとめたデータでは
男性は午前9-10時に女性は午後10-11時に頻繁にアクセスをするそうです。つまり、その時間帯の少し前くらいにメッセージを送ると返信してくれる確率が上がるかもしれません。

また、[okcupid](https://www.okcupid.com/)　が写真とメッセージの受信数に関しておもしろい発表をしました。
okcupidはサービス上に見ている人の顔を1~5で評価する機能を一時的に追加しました。
その結果、3や4と評価が多く3.2と評価されてもメッセージはこないが、5と1が多いため評価が3.2になると平均より倍以上メッセージを受信していることがわかりました。
つまり、メールを送るのはその人を5と評価する人が多いということなので、メッセージを受け取りたいなら、どの層からメッセージを受け取りたいかを考えたほうが良さそうです。



#アルゴリズム研究
マッチングのアルゴリズは非常に複雑なため、各社研究をしています。
okcupidは登録時に何百問という質問に回答させ、マッチングさせています。
しかし、okcupidは一時的に事実ではないマッチ率をユーザに提示させたところ、虚偽のマッチ率が高くてもマッチ率が上昇したことを発表しています。
![alt](http://cdn.okccdn.com/blog/humanexperiments/full-matrix.png)


#インタラクション
インタラクション系の研究は特にアカデミックな分野で進んでいます。
MITがお互いのモニターにクリックすることで色が変わるボタンと表示させました。その結果、ただ色が変わるという現象に人間は意味を感じとり、ミニマルなアクションでも愛情が伝わる可能性を示唆しました。[論文](http://alumni.media.mit.edu/~jofish/writing/kaye-less-is-more8.pdf)

他にもオリジナルなデバイスを開発したり、様々なものが存在します。

日本はどの分野も発展途上ですが、少しづつ日本でも認知度が高まっているので今後に期待です。
あなたのRailsアプリはいくら？

## はじめに
僕は`Rails`は触ったことがあるけど`Ruby`はほとんど触ったことがなかったので、今回は`Rubyスクリプト`を書いてみた。
※しかも`Github`に公開するのも初めて。

・・・と言っても、ここで紹介するのは`Ruby`の事ではなく作ったプログラムの査定についてです。

## 今作っているプログラムは幾らですか？
プログラムの値段って大体において適当ですよね？
私も適当ですw

そこで、思い立ったのが適当に係数を与えてプログラムを査定すると幾らくらいになるんだろうか？
と今日突然思い立って[こちら](https://github.com/syou007/how_much_your_rails_app)のプログラムを作って見ました。

## 実行方法
このプログラムはスクリプトなので[Github](https://github.com/syou007/how_much_your_rails_app)からクローンして実行してください。

```sh
$ ruby how_much.rb rails_root_path [output_folder]
```

## こんな感じで出力されます。

<img width="1278" alt="スクリーンショット 2015-12-16 17.57.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/79216/70a910b6-5da1-c703-f857-59d27a1b930f.png">

## 設定ファイルで自由に係数を変えれます。
`config/app.yml`に値段の元となる係数などを定義していますので、プロジェクトに合わせて金額をつけてください。

```yaml
# アプリケーションに関する設定内容
app:

  # 基本設定
  base:
    # 対象外にするフォルダ
    # ※外部から持ってきたフォルダは対象外にすると正確になる。
    ignore_dir:
      - .git
      - tmp
      - log
      - test
      - vendor
      - .idea

    # 対象外にするファイル
    ignore_file:
      - bootstrap.js
      - bootstrap.min.js
      - schema.rb

    # デバッグフラグ
    debug: false

  # 解析するプログラム単位での設定
  program:
    # 基本設定
    base:
      # ファイル一つに対する金額
      file_price: 800

      # 一行毎に発生する金額(円)
      line:
        # 通常行の値段
        line_price: 100
        # 制御処理行の値段
        proc_line_price: 300
        # コメント行の値段
        comment_line_price: 50

      # メソッドに発生する値段(円)
      method:
        price: 500
        # メソッド行数が長い場合に発生するペナルティ（コメントは含まず）
        max_line: 20
        # メソッド行数が長い場合に引かれる金額(通常の値段は別途入ります。)
        # 設定行が長い場合は相殺されるので丁度良いかと。
        max_line_over_price: -90

    # Ruby設定(baseと同じ)
    ruby:

    # Migrate設定
    migrate:
      # ファイル一つに対する金額
      file_price: 2000
...
```

## パーサー
`model`配下にパーサー（と呼んでい良いのか微妙なもの）があるので、プログラムに合わせて追加する事ができます。

もちろん`プルリク`大歓迎です！

## プログラムの説明について
惰性で作ったプログラムなので、、、説明するほどの事はないですが・・・
ストック数が多かったら別記事で説明します！

## 筆者について
筆者は[TownSoft](http://townsoft.jp)で活動している個人事業主です。
お仕事引き受けます！
Swiftの正規表現は面倒くさい！

#対象
　swiftの正規表現は面倒くさい！
　でも、ライブラリを導入するのも面倒くさい！
　コードは汚くてもいいからとにかく動くやつを！
　そんな物臭な方。

#環境
-Xcode 7.01
-Swift

#使い方と出力例
```swift
//Stringの拡張クラスとして提供

//Matchメソッド
//　出力は["一致パターン全文","グループ1","2"...]
"http://goowa.jp".Match("([a-zA-Z0-9]*)://(.*)")
// -> ["http://goowa.jp","http","goowa.jp"]


//Matchesメソッド
//　出力は["一つ目の一致パターン全文","グループ1","2"...]
//  　   ["二つ目の一致パターン全文","グループ1","2"...]
"むかしむかしあるところに".Matches("むかし")
// -> [["むかし"]["むかし"]]
```

#コード

```swift:StringEX.swift
    /**
     正規表現で検索を行う
     - parameter pattern:検索パターン
     - returns: [String]で検索結果を返す.
    */
    func Match(pattern:String) -> [String]
    {
        let nsstr = self as NSString
        var returns:[String] = []
        if let regex = try? NSRegularExpression(pattern:pattern, options:NSRegularExpressionOptions())
        {
            if let result = regex.firstMatchInString(nsstr as String, options: NSMatchingOptions(), range: NSMakeRange(0, nsstr.length))
            {
                for var i : Int = 0; i < result.numberOfRanges; ++i
                {
                    returns.append(nsstr.substringWithRange(result.rangeAtIndex(i)))
                }
            }
        }
        return returns
    }
    
    /**
    正規表現で検索を行う
    - parameter pattern:検索パターン
    - returns:[[String]]で検索結果を返す
    */
    func Matches(pattern:String) -> [[String]]
    {
        let nsstr = self as NSString
        var returns:[[String]] = []
        if let regex = try? NSRegularExpression(pattern:pattern,options:NSRegularExpressionOptions()){

            let result = regex.matchesInString(nsstr as String, options: NSMatchingOptions(), range: NSMakeRange(0, nsstr.length))
            for var i = 0; i < result.count; ++i
            {
                var temp : [String] = []
                for var j = 0; j < result[i].numberOfRanges; j++
                {
                    temp.append(nsstr.substringWithRange(result[i].rangeAtIndex(j)))
                }
                returns.append(temp)
            }
        
        }
        return returns
    }
```
詳細度をもう一度勉強してみる

#**詳細度をもう一度勉強してみる**#
##詳細度って何？##
一言でいうと、スタイルが重複したとき、どのスタイルを優先するか？の優先度を評価したものです。


##詳細度をなぜ考えるのか？##
当たり前かとは思いますが、個人的には以下の3点が考えるきっかけになりました。

###1. 不要なネスト化###
ネスト化自体が悪いわけではなくて、過度なネスト化が悪いと考えているわけです。
大規模なページになればなるほど、過度なネスト化に発展する傾向は高まります。沢山の人が関わるサイトになると、以前に書かれたコードを見直すのは面倒だし、時間がかかる。それなら手っ取り早くスタイルの汚染の確率の下がる方法で決めてしまえばいいっていう安易な判断に繋がっていってしまうわけです。

###2. 後述のセレクタに汚染される###
詳細度の評価の仕方が理解できないが為に、IDセレクタを先頭に立てたりと、
優先度の高いものをとにかく乱暴に設定しまい、前述に設定したセレクタが汚染され・・崩壊というシナリオに繋がります。


###3. 再利用が効かない###
同じクラスを他の要素に付与しても、同じようにスタイルが適用されなくてはなりません。再利用が利くということは、無駄なコードが増えるという問題が無くなりますし、可読性が良くなると、ソースコードに触れる人も、クラスにアクセスしやすくなるわけです。
つまり、メンテナンス性が高い事が非常に重要であるということです。
peco でプロセスを選んで reptyr で pty を付け替える

reptyr が便利すぎるので peco からプロセスを選んで使えるようにしてみました。

```sh
function reattach-pty {
    local process=$(ps aux | grep "^$USER" | peco | awk '{print $2}')
    [[ -n "$process" ]] && reptyr "$process"
}
```

この関数を `.zshrc` などに書いておいて、ターミナルから `reattach-pty` と打つと、peco が起動してプロセスの一覧が見れます。
その中からひとつを選ぶと、reptyr されます。
何も選ばずに peco を終了した場合は何もしません。

## 参考

* [Linux - うっかり起動してしまった時間のかかるプロセスをtmux上に付け替えたい - Qiita](http://qiita.com/__cooper/items/c0d21cf24436621052c3)
* [nelhage/reptyr](https://github.com/nelhage/reptyr)