OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryのextendで既に存在するプロパティが上書きされないようにマージする

#上書きされちゃう
```js:
var obj = {};

$.extend(obj, {
    hoge: {
        str: 'HOGE'
    }
});

$.extend(obj, {
    hoge: {
        num: 12
    }
});

console.log(obj.hoge.str); // undefined
console.log(obj.hoge.num); // 12
```

#上書きされないようにマージさせる
```js:
var obj = {};

$.extend(true, obj, {
    hoge: {
        str: 'HOGE'
    }
});

$.extend(true, obj, {
    hoge: {
        num: 12
    }
});

console.log(obj.hoge.str); // HOGE
console.log(obj.hoge.num); // 12
```

第一引数に `true` を渡す。

#参考
- [jQuery.extend() メソッドの使い方まとめ | Tips Note](http://www.tam-tam.co.jp/tipsnote/javascript/post3853.html)
DockerRegistryのコンテナ一覧を見るDockerIndexをつくった

先日、会社の[エンジニア全員が参加するハッカソン](http://ch.nicovideo.jp/dwango-engineer/blomaga/ar576966)でDocker Indexというアプリを作りました。

名前はさておき、Docker Index とは、Docker Registoryに登録されているコンテナを一覧表示するWebApplicationです。
Docker RegistoryはDocker Hub（のようなもの）を自分のサーバにたてられようなものです。

ただ、WebUIは一切用意してくれていないので、
会社でみんながDocker Registoryに作成したコンテナをpushしてくれていても、
どんなコンテナが存在するのか確認する術がありませんでした。

これが、作成しようと思った動機。

## 使用言語、フレームワーク

このハッカソンのルール（？）は、普段業務であまり使っていない言語・フレームワークを選択しよう！というもの。
そこで、何にしようかと考えたところ、DockerもGoで書かれているし、Goで書くということにしました。

フレームワークは、普段業務ではPlay2/Scalaを使っているため、雰囲気が似ているというRevelを使ってみようと思い採用しました。

そして、どうせならやっぱりDockerコンテナで動かしたいよね。

ということで、ゴールは“DockerコンテナでDocker Registoryに保存されているコンテナを一覧表示するWebUIを作る”というものを設定しました。

4, 5時間で、初めての言語、初めてのフレームワークということなので、このくらいの課題でちょうどいいかなと思います。
ハッカソンは何か動くものを作るのが目標なので。

## つくってみた

とりあえず、ローカルで環境をつくりgo/revelの環境をつくり、hello worldを済ませました。

最初IntelliJでやっていたんだけど、微妙な感じだったので（うまく設定できてない？）atomでやりました。
入れたパッケージは多分こんな感じ
 - typester/atom-gocode
 - joefitzgerald/go-plus

ドキュメントとかは適当にココらへんを読んだり、Golangテーブルでハッカソンしてる人に聞いたりしてしました。
  - [Golang.doc](http://golang.org/doc/)
  - [revel go docs](http://revel.github.io/docs/godoc/index.html)

内部的にはディレクトリの内容をみて、一覧しているだけなので大したことはしてません。

しかも、パッケージの切り方がよくわからず、全てコントローラーに突っ込んであります（※ハッカソンです）。

そして、できたのがこんなかんじ。

![docker-index](http://i.gyazo.com/fe2de79c089269253eea079e19840765.png)


## 問題

###パッケージの切り方がよくわからなかった

なんか、単純にpackageを`/`できって、ディレクトリ構造と合わせてみてもならなかったので、時間の都合上後回しにしました。

### `docker build` しようとすると`buildable`じゃないと怒られる

`docker build`したときに`buildable`じゃないと言われ、途中で止まってしまう問題が発生しました。  
多分、実行用にいろいろしなきゃいけないんだろうなぁと思いながら、時間がないのでとりあえず`revel run`で動く状態で放置してました。

```
Step 4 : RUN go get github.com/ringohub/docker-index
 ---> Running in cf9d1b96d14f
package github.com/ringohub/docker-index
	imports github.com/ringohub/docker-index
	imports github.com/ringohub/docker-index: no buildable Go source files in /gopath/src/github.com/ringohub/docker-index
```

リターンコードが`0`じゃないと途中で止まってしまうっぽかったので、
対症療法として、`;echo ''`を実行しリターンコードを誤魔化したりしてみました。

どなたか、正しいやり方教えてください。

## 感想

- 半日で何かを作るのは時間的に難しいかった。
- でも、使ったこと無い言語やフレームワークに挑戦するのは楽しい！
- ハッカソンテーマが「出会い」ということをすっかり忘れていて、発表が始まってから気づいた
- gopherがかわいくみえてきた（人形欲しい）

来年もまたがんばります。

## 成果物

今回作った、revelアプリやDockerfileはこちらにおいてあります。  
突っ込みどころ満載なので、プルリクし放題です。  
golangerたちのプルリクを頂けると勉強になるとおもうのでお待ちしております！

- [GitHub: ringohub/docker-index](https://github.com/ringohub/docker-index)
- [DockerHub: ringo/docker-index](https://registry.hub.docker.com/u/ringo/docker-index/)

[dwanGo](http://dwgo.connpass.com/event/7557/)も開催されます！
OSXでssh-copy-idを使ってリモートサーバにパスワードなしでログインする



OSXで`ssh-copy-id`を使う方法です。

## 何ができる？

1. sshでサーバにログインする際のパスワード入力が不要になる。
2. そのために必要なssh公開鍵の配布を簡単に行うことができる。

## インストール

[beautifulcode/ssh-copy-id-for-OSX - GitHub](https://github.com/beautifulcode/ssh-copy-id-for-OSX)を使います。

1. ダウンロード

		curl https://raw.githubusercontent.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id

2. 実行権限を付与

		chmod +x /usr/local/bin/ssh-copy-id
	
## 使い方

1. 公開鍵を生成します。`~/.ssh/id_rsa.pub`が存在する場合は不要です。

		ssh-keygen	

	以下が生成されます。

		~/.ssh/id_rsa.pub


2. 公開鍵を配布します。

	通常

		ssh-copy-id [ユーザID]@[リモートサーバ]
		ssh-copy-id root@192.168.100.10 #例

	`~/.ssh/id_rsa.pub`以外の公開鍵を使う場合
	
		ssh-copy-id -i 公開鍵のフルパス [ユーザID]@[リモートサーバ]
		ssh-copy-id ~/.ssh/myidentity.pub root@192.168.100.10 #例

	※ ログインパスワードを聞かれるので入力します。

3. sshでリモートのサーバにログインします。

		ssh [ユーザID]@[リモートサーバのアドレス]
		ssh root@192.168.100.10 #例

	※ ログインパスワードは聞かれません。
UIScrollViewとsetContentSize:とAutoLayout

UIScrollViewとAutoLayoutが相性が悪いという声を聞きますが、
別にそこまで悪いとは思わないので、簡単な考え方をまとめてみます。

今回は、テストケースとして、
UIScrollView（可変）
　- 320x320のUIView（固定）
　- 320x320のUIView（固定）

という単純なケースを考えてみます。

この場合、まずstoryboard(or xib)で、次のように設定します。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/8588/20ca51b3-ed16-2c70-bca9-97259f8e84b6.png)

画面いっぱいにUIScrollViewを配置し、Constraintsを設定します。
Constraintsは、上下左右マージン０です。
VisualFormat的には、"V:|-0-[view]-0-|", "H:|-0-[view]-0-|"となります。

次に内側のビューを２つ配置します。

作業のしやすさ的に、
ViewControllerのサイズをFreeformにして、サイズを変更しておくと良いでしょう。
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/8588/442dbfba-fc46-b77b-009d-21e371344796.png)

その後、ルートのviewのサイズを320x640にしてピッタリ収まるようにします。
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/8588/0d671d62-f46f-a947-12d3-6bf7a401b3d0.png)

次に内側の２つのビューそれぞれに以下のようなConstraintsを設定します。
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/8588/35843d7e-c803-96e4-ba5a-4d239884f2a8.png)


これはVisualFormat的には
"H:|-0-[_view1(320)]-0-|"
"H:|-0-[_view2(320)]-0-|"
"V:|-0-[_view1(320)]-0-[_view2(320)]-0-|"
となります。


さてい、これで実行させてみると、setContentSize:の指定が無いにも関わらず、
かつコードも一行も書かずに、
見事次のようなスクロールが実現できます。

![result.gif](https://qiita-image-store.s3.amazonaws.com/0/8588/8b59ff81-6f0e-c54c-68b0-576a064a25ac.gif)


何が起きているかというと、UIScrollViewは、
**「下の階層ビューがConstraintsによって一意に定まる場合、それがcontentSizeになる」**

ただこれだけです。

設定手順は多少有りますが、理解してしまえば、なんてことはなく、
UIScrollViewとからめても、AutoLayoutは非常に強力な配置方法と言えます。
是非みなさん試してみてはいかがでしょうか？
VirtualBoxによる仮想環境構築（windows7＋CentOS6）

# VirtualBoxダウンロード
公式サイトより取得
https://www.virtualbox.org/wiki/Downloads

# VirtualBoxインストール
取得した実行exeを実行

# CentOSダウンロード
公式サイトよりMinimal Install Images取得。
https://www.centos.org/download/

今回は以下のURLよりCentOS-6.5-i386-netinstallを取得 
http://ftp.tsukuba.wide.ad.jp/Linux/centos/6.5/isos/i386/

# 仮想マシン作成
1.  VirtualBoxを起動し、[新規]クリック
2. 「仮想マシンの作成　名前とオペレーションシステム」にて以下設定後、[次へ]クリック
   * 名前：任意
   * タイプ：Linux
   * バージョン：Red Hat(32bit)
3. 「仮想マシンの作成　メモリサイズ」にてサイズ設定後（任意）、[次へ]クリック
4. 「仮想マシンの作成　ハードドライブ」にてデフォルトのまま[作成]クリック
5. 「仮想ハードドライブの作成　ハードドライブのファイルタイプ」にてデフォルトのまま[次へ]クリック
6. 「仮想ハードドライブの作成　物理ハードドライブにあるストレージ」にてデフォルトのまま[次へ]クリック
7. 「仮想ハードドライブの作成　ファイルの場所とサイズ」にてサイズ設定後（任意）、[次へ]クリック

# VirtualBoxの設定
1.  [設定] > [ネットワーク] > [アダプター2]タブ選択。以下を設定。
   * ネットワークアダプターを有効化：チェック（ON）
   * 割り当て：ホストオンリーアダプター
2.  [ストレージ] > [ストレージツリー] > [コントローラーIDE]に上記で取得したCentOSのイメージファイルをマウント。

# CentOSインストール
1. VitualBoxにて[起動]クリック
2. 「Welcome」画面でEnter
3. 「Disc Found」画面はSkip
4. 「Choose a Language」画面でEnglishを選択
5. 「Keyboard Type」画面でjp106を選択
6. 「Installation Method」画面でURLを選択
7. 「Networking Device」画面はデフォルトのまま
8. 「Configure TCP/IP」画面はデフォルトのまま
9. 「URL Setup」画面でCentOSのイメージファイルを取得したURLを設定
    * 今回の例では以下のURLを設定     
 http://ftp.tsukuba.wide.ad.jp/Linux/centos/6.5/os/i386/

10. CentOSのトップ画面でEnter
11. 「What type of devices will your installation involve?」画面はデフォルトのまま
12. hostnameは任意
13. timezoneはAsia/Tokyoを選択
14. rootユーザのパスワードを設定
15. 「Which type of installation would you like?」画面は任意
16. インストールするCentOSのタイプは任意（今回はMinimalを選択）
17. パッケージインストール完了後、リブート実行
18. リブート後、仮想マシンを終了
19. Vitualboxにて[ストレージ] > [ストレージツリー] > [コントローラーIDE]でCentOSのイメージファイルをアンマウント。
20. Vitualboxにて[起動]選択、CentOSが起動。rootユーザでログインできることを確認

# CentOS設定
ネットワークの設定
`$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
 # 以下を記載
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.56.1 #<-任意
NETMASK=255.255.255.0
NETWORK=192.168.56.0
`

インターフェースを有効化
`$ ifup eth1`

ホストOS（windows7）よりSSH接続できることを確認
メモ: Redmine2.5.2にbacklog v1.0.6のdb:migrate失敗

AlminiumからRedmineに移行しようとしたが、
存在しないテーブルは以下

* banner
* chart_done_ratios
* chart_issue_statuses
* chart_time_entries
* code_review_project_settings

ここまではdb/data.ymlから削除すれば良いのですが、

* issues.position

が存在しない。
backlogsプラグインを入れていないのが原因。

## 試した手順

* ubuntu14.10

```bash:redmineインストール
apt-get install -y redmine-sqlite
cd /usr/share/redmine/
ruby script/rails server webrick -e production
```

```bash:Gemfile.local
gem 'yaml_db'
gem 'git-issue'
```

```bash:
bundle install
export RAILS_ENV=production
bundle exec rake db:data:dump
bundle exec rake db:data:load
RAILS_ENV=production rake db:data:load -R /var/lib/gems/2.1.0/gems -r yaml_db
```

## backlogsプラグインのインストール

```bash:
gem install holidays
cd ./lib/plugins
git clone git://github.com/backlogs/redmine_backlogs.git
git tag | tail
git checkout v1.0.6
cd -
RAILS_ENV=production rake redmine:load_default_data
rake generate_secret_token
rake redmine:plugins:migrate
```

```bash:
# rake db:migrate
rake aborted!
uninitialized constant Backlogs::IssueQueryPatch::RbRelease

Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)
```

# ubuntuのdb設定管理

```bash:/etc/dbconfig-common/redmine/instances/default.conf
dbc_dbname='redmine_default'
dbc_basepath='/var/lib/dbconfig-common/sqlite3/redmine/instances/default'
```

この設定で以下を参照するようになる。

* /var/lib/dbconfig-common/sqlite3/redmine/instances/default/redmine_default

```bash:
rm /var/lib/dbconfig-common/sqlite3/redmine/instances/default/redmine_default
rake db:create
db:migrate
```
MySQL 5.6 でインクリメンタル履歴検索、タブ補完

## 概要

MySQL 5.6 で C-r してもインクリメンタル履歴検索ができなくて困った。
調べたところ、MySQL 5.6 から [libedit が使われていて](http://dev.mysql.com/doc/refman/5.6/en/license-libedit-56.html)、デフォルトでは C-r がインクリメンタル履歴検索に割り当てられてない。

**追記** タブ補完もできないことに気づいたので、同じく ``~/.editrc`` で解決。

## 解決策

```:~/.editrc
mysql:bind -e
mysql:bind "^r" em-inc-search-prev # enable incremental backward search
mysql:bind "\\t" rl_complete       # enable completion
```

``rl_complete`` は ``man editrc`` しても載ってない。。。
参考記事の2つ目の Gist で知った。

## 参考記事

[mysqlでいちいちshow databasesとか打つのがめんどい→readlineのマクロで解決](http://d.hatena.ne.jp/hirose31/20090531/1243777478)
[jderrett / VI and tab completion irb bindings OSX](https://gist.github.com/jderrett/210568)
AlminiumのDBをyaml化してバックアップ

yml化することで、redmineで使うDBを sqlite3<-->mysql 切り替える事ができる。

```bash:yaml_db
# cd /opt/alminium
# echo "gem 'yaml_db'" >> Gemfile.local
# bundle install
# RAILS_ENV=production bundle exec rake db:data:dump
```

* /opt/alminium/db/data.yml が生成される。

## alminium -> Redmine3への移行

```bash:dump
mysqldump -ualminium -palminium alminium > alminium.sql
```

```mysql:以下実行してからyaml化
DROP TABLE banners;
DROP TABLE chart_done_ratios;
DROP TABLE chart_issue_statuses;
DROP TABLE chart_time_entries;
DROP TABLE code_review_project_settings;
DROP TABLE rb_issue_history;
DROP TABLE rb_project_settings;
DROP TABLE rb_release_burndown_caches;
DROP TABLE repositories;
ALTER TABLE issue_statuses DROP is_default;
ALTER TABLE issue_statuses DROP position;
ALTER TABLE issues DROP position;
ALTER TABLE issues DROP release_id;
ALTER TABLE issues DROP release_relationship;
ALTER TABLE issues DROP remaining_hours;
ALTER TABLE issues DROP story_points;
ALTER TABLE users DROP mail;
ALTER TABLE users DROP mail_notification;
```

```bash:load
RAILS_ENV=production bundle exec rake db:data:load
```

```bash:
docker run -d --name redmine3 redmine
```

## 新しいチケットを作成しようとするとエラーが出る場合

 ![aa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/00db529b-0c33-2da3-34ac-828236a877a6.png)

> デフォルトのチケットステータスが定義されていません。設定を確認してください（管理→チケとのステータス）。

トラッカー のデフォルトステータスが空の場合、上記メッセージが出た。

![ab.png](https://qiita-image-store.s3.amazonaws.com/0/25728/75168885-9f7d-9a81-78f1-0a3500709142.png)

デフォルトのステータスを選択し保存にて解決。
RailsからiPhone、Androidへのpush通知メモ


RailsからiPhoneやAndroidにpush通知した。
使ったのは下記Gem。

* https://github.com/jpoz/APNS
* https://github.com/spacialdb/gcm

## 必要なもの

### iPhone
* 証明書ファイル [証明書の取得はこちらなどを参考に](http://www.lancork.net/2013/08/how-to-ios-push-first/)
* 送信する端末のdevice token

### Android
* api_key [api_keyの取得はこちらなどを参考に](http://techbooster.org/android/application/16261/)
* 送信する端末のregistration id

## iPhoneへpush通知

Gemfileに追加後bundle install

```Gemfile
gem 'apns'
```

まずpemファイルを作ってあげないといけない

```
openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts
```

作ったpemファイルを```/path/to/cert.pem```に配置し、下記でpush通知が送れる。

```
APNS.host = 'gateway.push.apple.com' 
APNS.pem  = '/path/to/cert.pem'
APNS.port = 2195 

device_token = 'xxxxxxxxxxxxxxxxxxxx' # 送りたい端末のdevice token
APNS.send_notification(device_token, :alert => 'Hello iPhone!', :badge => 1, :sound => 'default')
```

## Androidへpush通知

Gemfileに追加後bundle install

```Gemfile
gem 'gcm'
```

下記実行するとandroid側に通知が飛ぶ

```
require 'gcm'

api_key = "xxxxxxxxxxxxxxxxxxxx"
registration_ids = ["a1", "a2", "a3"] # 送りたいregistration_idの配列
gcm = GCM.new(api_key)
options = {data: {score: "123"}, collapse_key: "updated_score"}
response = gcm.send_notification(registration_ids, options)
```

options内のdataハッシュ内に自由にキーを設定して送信してあげるとAndroid側で取得して色々処理できたりします
jenkinsのインストール簡単すぎて驚いた

# warをダウンロード

![スクリーンショット 2014-07-19 7.04.09.png](https://qiita-image-store.s3.amazonaws.com/0/25728/362b7735-b92a-faac-ca62-8239a8cd7f39.png)

# 起動

```bash:
java -jar jenkins.war
```

もしくは`jenkins.war`をダブルクリック。

http://localhost:8080/ でアクセスが出来る。

## port番号変更

```bash:
java -jar jenkins.war \
--httpListenAddress=127.0.0.1 --httpPort=8081
```

* [Starting and Accessing Jenkins - 日本語 - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JA/Starting+and+Accessing+Jenkins)

# 終了

```bash:
killall java
```

# 活用方法

* cronの代わり
* plugin
    * Git Plugin
    * Gitlab Hook Plugin
    * Mail Commander Plugin

----

# ubuntu

* [Debian Repository for Jenkins](http://pkg.jenkins-ci.org/debian/)

```bash:
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
echo "deb http://pkg.jenkins-ci.org/debian binary/" > /etc/apt/sources.list.d/jenkins.list
apt-get update
apt-get -y -qq install jenkins
```

----

# docker

```bash:docker
docker run -p 8080:8080 jenkins
```

```bash:docker-compose.yml
jenkins:
  image: jenkins:latest
  volumes:
    - /data/jenkins:/var/jenkins_home
  ports:
    - "8080:8080"
```
【Ruby】Nokogiriでbrタグを改行(¥n)に変更したい時【Nokogiri】

Nokogiriでいろいろなサイトをスクレイピングしてると、たまに（主にHTMLが）すごいことになってるサイトに出会いますよね。

Nokogiriでスクレイピングしたのに、brタグだらけなページがあります。
こういうサイトって古めの、テーブルレイアウト使いまくりのサイトに多い気がしますがどうなんでしょう。

今回はそんなページから、なんとかしてテキストを抜き出す方法をメモしておきます。

普通に

```rb
page.text
```

したら、改行されるべきところが改行されてないのが出てきたりしますね。


そういう時は、

```rb
page.search('br').each do |br|
  br.replace("¥n")
end
```

ってやればOKです。

brタグが自動的に¥nに置き換えられて、

```
page.text
```

するとキレイに改行されたテキストが出てくるようになります。
pt(The Platinum Searcher) で検索し peco で絞り込んで emacs で該当行を開く

[ag(The Silver Searcher)で検索しpecoで更に絞り込みvimで該当行を開く](http://qiita.com/fmy/items/b92254d14049996f6ec3)
を見て、emacsで同じことができたらいいなーって思って書きました。
ほとんど同じです。ぶっちゃけパクりです。
僕の趣味でag(The Silver Searcher)じゃなくてpt(The Platinum Searcher)を使ってますが、書き換えれば動くと思います。
# 環境
zsh
[pt(The Platinum Searcher)](https://github.com/monochromegane/the_platinum_searcher)
[peco](https://github.com/peco/peco)

# 設定
```zsh:zshrc
function ptemacs () {
  emacs $(pt "$@" | peco --query "$LBUFFER" | awk -F : '{print "+" $2 " " $1}')
}
```

# 使い方
```
ptemacs 検索文字列
```
で peco の画面で選択して決定

# 既知の問題
ファイル名にスペースが入ってると使えません。
SublimeText3のパッケージの説明まとめ（参加型）

# はじめに
シンプルかつ拡張性の高いテキストエディタ、Sublime Text。
Qiitaでも、入れているパッケージをリストして説明している投稿があり、参考にさせてもらっています。

ただ後で困るのが、これいいなと入れたにも関わらず使ってなくてパッケージをダイエットしたい時、キーバインドが重なったときにデバッグするとき。

自分用にまとめ。
順番は【List Package】順。
なお、コメントいただければ、おすすめのパッケージとして別テーブルで紹介を追加しようと思います。

gifスクリーンショットには【Recordit】を使用。

| スター | 重要度 |
|--------|--------|--------|
| <i class="fa fa-star gi"></i>| 無くてもよいけどたまに使う |
| <i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | 縁の下の力持ちで意外と頼っている |
| <i class="fa fa-star gi"></i><i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | これがあるからこそSublimeText使っているようなもの |

# 趣旨を変更
ひとつひとつパッケージを細かく説明しようと思ったら長くなりすぎそうなので、この投稿は一覧にして、別でひとつひとつ投稿を書くことにした。

# 自分が入れているパッケージ
自分がいま入れているパッケージリスト。
パッケージ名をクリックすれば、パッケージの紹介の投稿に飛びます。

----

| スター | パッケージ | 概要 |
| ---- | ---- | ---- |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | [AutoFileName](http://qiita.com/fainder/items/1766dbada63afb6c7bdc) | hrefやsrcで外部ファイルパスを指定する時、補完候補として一覧を出してくれるパッケージ。
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | BracketHighlighter | 開始タグと終了タグ、言語によっては`()`、`[]`、`{}`を分かりやすく四角線でかこってくれるパッケージ。
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | Emmet | 一世を風靡した、Zen Codingの後継であるEmmet機能を追加するパッケージ。
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | Gist | SublimeText上からGitHubのGistを新規追加・編集できるパッケージ。
<i class="fa fa-star gi"></i> | Goto-CSS-Declaration | カーソル中のIDやCLASSを、開いているCSSファイルの中から記述してある箇所までジャンプしてくれるパッケージ。
<i class="fa fa-star gi"></i> | HTML-CSS-JS Prettify | 
<i class="fa fa-star gi"></i> | HTML5 | 
<i class="fa fa-star gi"></i> | JS Snippets | 
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | Package Control |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | SFTP |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | SideBarEnchancements |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | SublimeCondeIntel |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | SublimeLinter |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | SublimeLinter-jshint |
<i class="fa fa-star gi"></i> | SublimeSuperSelect |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | Tag |
<i class="fa fa-star gi"></i><i class="fa fa-star gi"></i> | TrailingSpaces |

# 疲れた
いったん投稿。

# TODO
- AutoFileName : `ctrl`+`space`だとSpotlightが起動しちゃいますが、本当にキーバインドは存在するのか？
- Emmetキーバインド翻訳
test-kitchenでnodeをテストする.kitchen.ymlの設定

`test-kitchen`で、`nodes`の内容に応じてテストする場合の`.kitchen.yml`サンプル

```yaml
<%
require 'json'

def suites(&block)
  Dir.glob(File.join(File.dirname(__FILE__), 'nodes', "*.json")) do |file|
    suite_name = File.basename(file, '.json')
    block.call(
      suite_name,
      JSON.parse(
        open(file).read
      )
    )
  end
end
%>

---

driver:
  name: vagrant

provisioner:
  name: chef_solo

platforms:
  - name: centos-6.4

suites:
<%
  suites do |name, json|
%>
  - name: <%= name %>
    run_list: <%= json["run_list"] %>
    attributes: <%= json["attributes"] %>
<%
  end
%>
```
mac OSX で sedを使ってtabの文字列を置換

http://qiita.com/kyanagimoto/items/37cc8e7a242ca2d1a29e で、「Ctrl+v -> Tab」を押せば使える＝コピペじゃ使えないとあったので試してみました。

```
sed -e 's/[[:cntrl:]]/\"[[:cntrl:]]\"/g' tes.tsv >> tes_t.tsv
```

動く…。


OS X は  `¥t` や `/t`, `\t` ではいかず `[[:cntrl:]]` でタブが表現できる模様。

ただしこれはPOSIX文字クラスのうちの「制御文字」と呼ばれる範囲で、つまりCRとかにもマッチしちゃう…。
ASCIIコードの 0x00-1F, 0x7Fですね。


これが有効に使えるのも、状況限定ですね。
それ以外は都度、Terminal.app上で 「Ctrl+v -> Tab」 と打つしかないかもです。。


また、一度テキストファイルに出していいのなら

```
echo -e "This is\t\tTab"
```
など出来るので、 `echo -e "\t" >>tab.txt" などに書き出して使っても良さそうです。
JavaScriptの「ポケット・ナイフ」とは？【JS界でじわじわ来るライブラリ】実用編

最近では、使うライブラリが増えすぎてひたすら容量が加速することが懸念されているプロジェクトがあるとかないとか

そんな時はこれを検討してみるのはいかかでしょうか

#なぜ紹介するの？
あまり広まってない感があったからです。少なくとも私の周りで使っている人がいませんでした
→一応Qiitaでも検索0件ヒットでしたのでちょうどよいですね
ただ知ってる方には無意味な情報かもしれません、申し訳ないです

まずはひとつだけ紹介します、また時間を作って追加します。

#MicroJS

このフレームワークは、JSで使うライブラリ集が詰まったものとして開発されています
そのため、無駄な容量もかかりません（MicroJSの公式には各ライブラリは5K未満と記載があります)
→ちょいちょい使える実装も多いので、自分の開発ソースに組み込んでみるといいかもしれません（OSSなので）


まずは、みなさん大好きな公式に飛んでみましょうか
→http://microjs.com

やたらとカラフルな画面ですね
検索で何か入れてみるとわかりますが、それに纏わる有益なJSライブラリが検索結果として表示されると思います


##ライブラリ追加時の作法
* data.jsに追加します
→属性として、名前, タグ, URL, ソースを入れます
* 依存関係が必要不可欠（ライブラリ集なので）
* 有益なライブラリである必要がある
* MIT/BSDライセンスか、それに類似するもの（まぁどれもこんなものでしょう）
* 圧縮時に5K未満である必要がある

```
$ uglifyjs yourlib.js | gzip -9f | wc -c
```
こちらのコマンドで各自ファイルの容量がわかります

などなど

実際は、ライブラリを追加するというよりは、検索して引っかかってきたものを自分のアプリに組み込んだりとそういう使い方のほうがまだまだ多そうです

今回は、これしか紹介しませんが、役に立つと思います
第1回Android Studio勉強会#1 -プロジェクトの作成-


## はじめに

ここでは、Android Studioを用いたプロジェクトの作成を行います。HelloWorldが実行できたら成功です。

## プロジェクトの概念（Eclipseとは異なる）

プロジェクトの作成の前に、プロジェクトについて説明します。Eclipseでもプロジェクトという単位は存在しましたが、Eclipseとは意味が異なります。具体的には、1プロジェクトがライブラリも含めた1アプリという考え方です。

Eclipseでは、1プロジェクト=1アプリでしたが、ライブラリも1プロジェクトとして作成し、互いのプロジェクトを関連付けることでライブラリとして使用することができました。

Android Studioで作成したプロジェクト内には、モジュールという単位でアプリ本体やライブラリが内包されています。

## 新規プロジェクトを作成する

それでは新規プロジェクトを作成しましょう。Android Studioを起動すると、次のような画面が表示されます。表示されない方は、既にアプリの開発をされたことがあるのでしょう。画面上部メニューから `File > Close Project` を押すと、同様の画面を表示できます。

![studio-lanch.png](https://qiita-image-store.s3.amazonaws.com/0/16620/5fc750e0-c85f-a3cb-e9ac-c0b5e132ef3e.png)

`New Project...`をクリックします。

![studio-create-project.png](https://qiita-image-store.s3.amazonaws.com/0/16620/4a7f26d2-e15d-ca4e-07d5-f7f0ce62eecb.png)

それぞれ入力します。

* Application name: 
	* アプリ名。プロジェクト名にもなります。

* Company Domain: 
	* ドメイン名。

* Package name: 
	* パッケージ名。ドメイン名をアプリ名を追加した逆ドメイン記法で自動的に埋まります。

* Project location
	* プロジェクトの場所。デフォルトは自分のユーザディレクトリにフォルダが作られて、その内部に配置されます。EclipseでいうWorkspaceです。

`Next`を押します。

![studio-select-platform.png](https://qiita-image-store.s3.amazonaws.com/0/16620/d5e2e572-011e-6c58-48ae-b3f5e25e915d.png)

どのプラットフォームのアプリを作るか聞かれます。これは今までのEclipseではなかった画面（Android StudioでもBetaから登場）です。今回はスマホアプリなので、そのままで、Minimum SDKもそのままで、`Next`を押します。ここから先はデフォルトのまま`Next`を押していき、最後の`Finish`までいきます。

ここでEclipseと変わっていた点は、テンプレートが多いなーっていうのと、Blank Acitivityで[Next]を押した後のActivity名が MainActivityではなくMyActivityになっている点です。

## 実行する

画面上部メニュー Run > Run 'app'をクリックすることでアプリを実行できます。HelloWorldが表示されたら成功です。


[#2へいく](http://qiita.com/sugoi_wada/items/2025ea24b8f4fd1ac851)
アップロードしたファイルを保存する

```html:index.cshtml
<h2>ファイルアップロードのサンプル</h2>

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="uploadFile" />
    <input type="submit" />
}
```

```csharp:HomeController
using System.Web;
using System.Web.Mvc;

namespace WebApplication4.Controllers
{
    public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileWrapper uploadFile)
        {
            if (uploadFile != null && uploadFile.ContentLength != 0)
            {
                uploadFile.SaveAs(Server.MapPath("~/uploads/") + uploadFile.FileName);
            }

            return View();
        }
    }
}
```
Androidアプリ開発①

#Androidアプリ開発
##趣旨
Androidアプリを開発するに当たって成果物や得た知識、手順などをまとめていきたいと思います。
##開発環境
開発に当たって使用する環境一覧

###PC
OS:Windows7(64bit)
###Android端末
端末:Galaxy Nexus(sc-04d)
OS:Android4.2.2(Jelly Bean)
###IDE
Eclipse
Android Studio
##使用IDEについて
過去に簡単なAndroidアプリを作成したときはEclipseを使用しました。
なので今回は、Android Studioを用いてみようかと思います。
とはいえ、不具合等も出てくると思うのでEclipseとAndroid Studioを併用していきます。

---
次回から具体的に進めていきます。
まずは開発環境のセットアップからです。
正規表現で特定のタグ以外のHTMLタグを除去する

HTMLタグを除去したいけど特定のタグは残したい事情があったので作りました。もとい、ググり倒しました。
需要はないかもしれませんが備忘録がてら残します。
サンプルのスクリプトが雑ですが、色々なページでコンソールに打ち込めばいい親切設計です...（震

```js:removeTag.js

/**
 * HTMLタグを文字列から除去する
 * 第二引数にHTMLタグを指定した場合、指定されたHTMLタグは除去されずに残る
 * 
 * @param      {string}       str            処理対象の文字列
 * @param      {string|Array} arrowTag       許容するHTMLタグ名。配列形式で複数指定可能。
 * @return     {string}       タグが除去された文字列
 */
function removeTag(str, arrowTag) {
    // 配列形式の場合は'|'で結合
    if ((Array.isArray ?
        Array.isArray(arrowTag)
        : Object.prototype.toString.call(arrowTag) === '[object Array]')
    ) {
        arrowTag = arrowTag.join('|');
    }

    // arrowTag が空の場合は全てのHTMLタグを除去する
    arrowTag = arrowTag ? arrowTag : '';

    // パターンを動的に生成
    var pattern = new RegExp('(?!<\\/?(' + arrowTag + ')(>|\\s[^>]*>))<("[^"]*"|\\\'[^\\\']*\\\'|[^\\\'">])*>', 'gim');

    return str.replace(pattern, '');
}

// Alias
var log = function (arg) { console.log(arg); };

// ページ全体のHTMLを取得
var htmlString = document.documentElement.outerHTML || document.documentElement.innerHTML;

// 全てのHTMLタグを除去
log(removeTag(htmlString));

// a タグのみ許容
log(removeTag(htmlString, 'a'));

// a タグ、 span タグを許容
log(removeTag(htmlString, ['a', 'span']));

// 閉じタグが無いタイプのタグもOK(inputなど)
log(removeTag(htmlString, 'input'));

```

##注釈について
1. 古いブラウザ向けの対応を兼ねているので、配列の判定にやたら読みづらい事になってます。詳しくは下記ページにて。<br>
[Array.isArray - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Compatibility)

##正規表現の説明
助けてドラえm(ry

1. `(?!<\\\/?(' + arrowTag + ')(>|\\\s[^>]*>))` は別に驚いてるわけじゃありません。否定先読みというものらしいです。<br>
`(?!pattern)`の場合、`pattern`をマッチングから除外するものです。<br>
※[正規表現 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions#special-negated-look-ahead)の「否定先読み」の解説部分
2. `<("[^"]*"|\\\'[^\\\']*\\\'|[^\\\'">])*>`は「[JavaScriptでHTMLタグを削除する正規表現 - Qiita](http://qiita.com/miiitaka/items/793555b4ccb0259a4cb8)（[@miiitaka](http://qiita.com/miiitaka)様）」でも紹介されているHTMLタグを除外する定番の正規表現です（多分）。<br>
今回はこれに特定のタグをマッチさせないように正規表現を追加したものです。

また、文字列から正規表現のオブジェクトを生成しているのでエスケープがうっじゃうっじゃしています。あとで見て自分で混乱しないよう、おまけ程度に補足。
`'\\/'` は、文字列としては `'\/'` になります。
`'\\\''` は、文字列としては `'\''` になります。

##最後に
正規表現はいつ見ても暗号にしか見えません...。
上の正規表現も無駄やミスがあるかもしれないので、変な挙動があったら教えていただけると、それはとってもうれしいなって。

以上です。ここまでお読みいただきありがとうございました！

##参考
[JavaScriptでHTMLタグを削除する正規表現 - Qiita](http://qiita.com/miiitaka/items/793555b4ccb0259a4cb8)（[@miiitaka](http://qiita.com/miiitaka)様）
[Array.isArray - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Compatibility)
[正規表現 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)
[メモ]Vimのfiletypeプラグインを新規追加する際の手順


vimで開くファイルの種類(拡張子)に応じてインデントなどの設定を入れかえたいという場合は、filetypeプラグインを作成すると良いようだ。

(ref.) http://vim-jp.org/vimdoc-ja/filetype.html#filetype-plugins
(ref.) http://whileimautomaton.net/2008/09/07213145

Gradleのファイル(.gradle)に対するfiletypeプラグインはグローバルには提供されていない(特に設定を変更していなければ、$VIMRUNTIME/ftpluginディレクトリを見れば確認できる)ようなので、ローカルにfiletypeプラグインを追加した。

```
$ cat ~/.vim/ftplugin/gradle.vim

" この設定ではグローバルにfiletypeプラグインが追加されても読み込まれない。追加されたら、~/.vim/after/ftplugin下に移動する
if exists('b:did_ftplugin')
    finish
endif
let b:did_ftplugin=1

setlocal tabstop=4
setlocal shiftwidth=4
```

filetypeプラグインはその名の通り、filetypeが指定されたときに読み込まれる。

```
(FileTypeの指定)
:set filetype=gradle
```

...と思っていたがそれも設定次第のようだ。基本的には`filetype plugin indent on`で大丈夫...なのか?

(ref.) http://d.hatena.ne.jp/wiredool/20120618/1340019962


特定の拡張子のファイル(上記例だと.gradle)を開く際には、自動でfiletypeを設定するように以下の設定を.vimrcに記述しておく。

```
filetype plugin indent on
au BufRead,BufNewFile *.gradle set filetype=gradle
```

...と思っていたが、autocmdの設定は`~/.vim/ftdetect/(filetype).vim`や、`~/.vim/filetype.vim`に置くようだ。

(ref.) http://vim-jp.org/vimdoc-ja/filetype.html#new-filetype
teratail(テラテイル)っていうサイト使ってみたよ

最近出来たっぽい"[teratail【テラテイル】｜思考するエンジニアのためのQAプラットフォーム](http://teratail.com/)"の話です

![imgFooterLogo_2.png](https://qiita-image-store.s3.amazonaws.com/0/36389/054ea3f6-86b7-4c76-b7a7-8ae244556e66.png)


面白そうなのでとりあえずアカウント作ってみました
ぼく→http://teratail.com/users/a

ちなみに回し者ではありません

#感想
はっきり言って「Yahoo!知恵袋 for プログラマ」ってかんじです.

まだできたばかりなのでユーザー少ないですが,使いやすかったので流行ればいいなーと思って紹介します.

#すごい
プログラミングに特化してないオールジャンルの知恵袋とくらべるのだめなきがするけど似たようなサイトだし対比していきます.

##markdown使える,シンタックスハイライトもある
インデント全て消去されてシンタックスハイライトもない知恵袋に比べてすごく見やすい.

##フィードがある
Qiitaのホーム画面のようにMyタグのついた投稿や注目・新着投稿のフィードがあります.

##対応が速い
ご意見フォームもあるし,teratailタグをつけて投稿すると公式アカウントからお返事が来ます.速いです.
関係無いですが公式アカウントのアイコンが手描きなの気になります.
その公式アカウントがこちら
http://teratail.com/users/teratail

##これから

特定のユーザーにピンポイントに質問を行うことができる機能を検討中とのことです.

まだヘルプページもないぐらい新しいサイトですが今後に期待しています！！！！
([ヘルプがないについて](http://teratail.com/questions/932))
またThe Ruby openssl extension was not compiled. Missing the OpenSSL lib?かよ

端末また調子が悪くになってきた。。。

Rubyは1.9.3を使ってますので、最新にしちゃうかなと思ったが、2.2.0をインストールするとエラーが出ました。

```
Cloning https://github.com/ruby/ruby.git...
Installing ruby-2.2.0-dev...

BUILD FAILED

Inspect or clean up the working tree at /var/folders/0n/18bwv5x16t7gy319d5wbn9480000gn/T/ruby-build.20140718233658.48380
Results logged to /var/folders/0n/18bwv5x16t7gy319d5wbn9480000gn/T/ruby-build.20140718233658.48380.log

Last 10 log lines:
                              bigdecimal 1.2.5
                              io-console 0.4.2
                              json 1.8.1
                              psych 2.0.5
                              rake 10.3.2
                              rdoc 4.1.0
installing bundle gems:       /Users/liubin/.rbenv/versions/2.2.0-dev/lib/ruby/gems/2.2.0 (build_info, cache, doc, extensions, gems, specifications)
installing rdoc:              /Users/liubin/.rbenv/versions/2.2.0-dev/share/ri/2.2.0/system
installing capi-docs:         /Users/liubin/.rbenv/versions/2.2.0-dev/share/doc/ruby
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?
```

[こちら](https://github.com/sstephenson/ruby-build/issues/377)を調べんでんですけと試しながら下記の手順で何とか無事にインストール出来ました。

```
brew uninstall openssl
brew --prefix openssl
brew install openssl
brew link openssl --force
brew --prefix openssl
CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.2.0-dev
```
Solr、ElasticsearchをはじめとするHTTP APIのレスポンスキャッシュ方針

Webサービスでは、Solr、Elasticsearchをはじめとする検索エンジンの結果をキャッシュしたいことは比較的よくあるはなしではないだろうか。ユーザー向けに提供している検索では、人気のワードで検索されやすく、それ相応の負荷になる。また、[コンテンツに付加されているタグをクリックすると同じタグが付けられているコンテンツが検索される事例](http://www.pixiv.net/member_illust.php?mode=medium&illust_id=44741620)など、おなじようなクエリが投げられやすい状況は容易に推測できる。

さて、このような場合検索エンジンにおいてはどのようなキャッシュ戦略をとれば良いか。

## 1. Solr、Elasticsearchなどの検索エンジンに内蔵されているキャッシュ機能を利用する

![図1](https://qiita-image-store.s3.amazonaws.com/0/5218/4451ccb7-33a7-5aaa-9aab-e6211a6b63fd.png)

ElasticsearchではFilterCache、SolrではさらにFilterCache、QueryResultCache、documentCacheなどより細かなキャッシュ機能を利用できる。これらのキャッシュはすべてメモリキャッシュであり、それほど大きなキャッシュ容量は期待出来ないが、最低限のキャッシュとしては有効だ。また、検索エンジン自体に内包されているキャッシュであるため、インデックス更新などで適切に破棄される。

- <b>メリット:</b>
  - 検索エンジンの設定だけで提供することができる
  - キャッシュのウォームアップができる
  - インデックス更新で適切に破棄される
- <b>デメリット:</b>
  - インメモリキャッシュであり、大きなキャッシュ容量は期待できない
  - 検索エンジンとリソースを共有するのでチューニングが難しい
  - コンテンツの内容や属性によってキャッシュを制御するのは難しい

## 2. アプリケーション側でキャッシュする

![図2](https://qiita-image-store.s3.amazonaws.com/0/5218/ade3f4d3-448a-c4f5-f80d-4e9013177eab.png)

次に思いつくのがアプリケーション側で取得した検索結果をキャッシュする方法である。アプリケーション側でRDB、KVS等のデータストアを用意し、検索結果をキャッシュする。ミドルウェアとしてはMemcached、Redisなどが一般的だろうか。

この方法では、アプリケーション側に実装があるので、アプリケーションの機能やコンテンツの内容、属性によってキャッシュするかどうか、更新頻度、有効期限を調整しやすい。アプリケーションの性質に合わせたきめ細かな設定ができるのが特徴だ。

反面、キャッシュ機能がアプリケーションと密結合してしまうため、APIとキャッシュの両方の面倒を見なければならず、コードの可読性は低下し、メンテナンスしづらくなる。また、1つのミドルウェアのAPIを複数のアプリケーションから参照している場合、それぞれのアプリケーションでキャッシュ機能を実装する必要も出てくる。

- <b>メリット:</b>
  - アプリケーション固有のキャッシュ機能を提供できる。
  - アプリケーションの変更だけで設定変更が出来る。
  - コンテンツの内容、性質に応じて更新頻度、有効期限を設定できる。
- <b>デメリット:</b>
  - アプリケーション上でキャッシュの管理を行わなければならない
  - 複数アプリケーションでキャッシュの共有ができない
  - API側の負荷に応じたキャッシュ調整が難しい

## 3. APIをプロキシ経由にすることでキャッシュする

![図3](https://qiita-image-store.s3.amazonaws.com/0/5218/055ad9ba-ebc6-fa3c-3afe-0860cbdafca8.png)

3番目の方法は、アプリケーションとAPIをもつミドルウェアの間にプロキシを設置しキャッシュを行う方法である。キャッシュ機能を持つプロキシとしては、nginx、Varnish Cache、Apache Traffic Server、Squidなどが挙げられる。これらは特にミドルウェアに特有のキャッシュ機能を提供するわけではなく、標準的なHTTPレスポンスの殆どをキャッシュすることが出来る。

この方法では、アプリケーションに変更を加えることなく、キャッシュ機能を提供できる。また、インメモリではなくディスクを利用したキャッシュも可能であり、大容量のキャッシュを実現できる。アプリケーションに手を加えないため、API側の負荷に応じて適切なキャッシュの有効期限を設定することが可能だ。弊社では、この方法でSolrの検索結果をキャッシュしている。

- <b>メリット:</b>
  - アプリケーションコードの変更が必要ない
  - キャッシュだけの設定をすれば良いので、設定が比較的簡単
  - 大容量のキャッシュを実現できる
- <b>デメリット:</b>
  - アプリケーションに固有のキャッシュ調整の実現は難しい
  - HTTP APIによる応答しかキャッシュすることが出来ない
  - 運用するプロダクトが1つ増える

## まとめ: 銀の弾丸はない

まあ、だいたいの場合そんなものはない。どの方法も一長一短あるし、組み合わせて使うこともできる。アプリケーション特有のキャッシュであればアプリケーションでカバーすればよいし、そうでなければプロキシキャッシュも候補に入るだろう。[Kusabana](https://github.com/voyagegroup/kusabana)のようにアプリケーション特有のキャッシュ機能をもったプロキシもあることはある。また、そもそもSolrやElasticsearchではリソースにあわせて必要十分なキャッシュ設定を行うべきであろう。

注意しなくてはいけないのは、実際のWebアプリケーションではこの3つをうまく組み合わせて作る技術が必要になる。しかし、透過的ではないキャッシュ機構はシステムの複雑性を確実に増加させる。それぞれの場合に応じて、適切な判断が必要だ。

アプリケーションの速度と開発速度のトレードオフを見極め、ユーザーに適切に価値を提供できるシステムを目指さなくてはならない。もしくはハードウェアの進歩を夢見るかである。
【解決】Unity4.5.2がOS X Marvericksで起動しなかった

# はじめに
Unity4.5.2をOS X Marvericksで起動したがすぐに**応答なし**になり起動しない。
最初はUnityのバグだと思い、ダウングレードを行ったりしたが一向に起動しない。
そこで、ソフトの競合を疑った。

# 原因：解像度の強制変更
自分は、MBP Retinaを使っており、QuickRes.app で無理やり解像度を2880x1800に変更していた。
そこで、QuickRes.appで解像度を1680x1050(Macでデフォルトで用意されているHiDPI)に変更すると、無事起動した。

# おわりに
しかし、解像度変更した結果、起動しなくなるとは思っていなかった。
今までそのようなソフトの競合が無かったため、全く気づかなかった。
今後も何かしら問題があれば解像度を元に戻して確認してみよう。

結局、今日中にUnity触れなかった…
AngularJSからjQueryを呼び出すための汎用ライブラリ

AngularJSは便利ですが、jQueryが過去に蓄積してきた膨大なライブラリがそのまま使えないという欠点があります。もちろん、ラッパーとなるAngularJSモジュールがあれば良いわけですが、存在しなかったり、すべての機能がサポートされているわけじゃなかったりして自作したり、既存ライブラリに手を入れないといけないことが多々あります。

ただ、毎回似たようなコードを書くのが面倒だし、いちいち仕様を考えたり、覚えたりするのも面倒です。そこで、Angular jQuery Wrapperという、汎用的なWrapperを書きました。

javascriptオブジェクトとして、スキーマを与えてやると自動的にAngularJSのディレクティブを生成してくれるというDDD（ドメイン駆動開発）の変形のような設計になっています。このため、任意のjQueryプラグインが使えるわけではなく、サポートしているプラグインのみですが、簡単に他のプラグインも追加できる仕様になっています。

今のところ使えるのは、jQuery UIの全ウィジェットと、jQuery MultiDatePickerだけです。今後は、bootstrap系のプラグインなどを追加していきたいと思っています。

GitHub:
https://github.com/norami/angular-jquery-wrapper
Demo:
http://norami.github.io/angular-jquery-wrapper/
Bower:
bower install angular-jquery-wrapper

# 使用方法

## インストール
bower install angular-jquery-wrapper

## ヘッダ

こんな感じ。通常は必要なプラグインだけを読み込みます。

```html
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/jquery-ui/jquery-ui.js"></script>
<script src="lib/multidatespickr/jquery-ui.multidatespicker.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-jquery-wrapper/dist/angular-jquery-wrapper-core.js"></script>
<script src="bower_components/angular-jquery-wrapper/dist/multidatespicker.js"></script>
<script src="bower_components/angular-jquery-wrapper/dist/jquery-ui.js"></script>
```  

## ディレクティブ

### jqw-{plugin_name}
そのプラグインの使用を宣言します
### jqw-{plugin_name}-{option-name}="{angular_expression}" 
angular式をオプションにバインドします。可変なオプションについては双方向バインディングになります。

```js
setter: $(selector).{plugin-name}("option", "{OptionName}", value);
getter: $(selector).{plugin-name}("option", "{OptionName}");
```

### jqw-{plugin_name}-{field-name}="{angular_expression}" 
angular式を以下のフィールドにバインドします。可変なフィールドについては双方向バインディングになります。

```js
setter: $(selector).{plugin_name}("set{FieldName}", value);
getter: $(selector).{plugin_name}("get{FieldName}");
```

例1：jqw-datepicker-dateは、datepickerでpickされる値をDateオブジェクトとしてバインドします。

例2: jqw-multidatespicker-listは、選択可能な値のリストを、Dateオブジェクトの配列としてバインドします（この機能は、標準のjQuery multiDatePickerには存在しない）

### jqw-{plugin_name}-{event_name}="{angular_expression}" 
angular式をイベントにバインドします。angular式は呼び出し可能な関数でなければいけません

```js
$(selector).on("{plugin_name}{event_name}", function(event, ui){
    {angular_expression}(event, ui);
})
```

# 利用している技術

[AngularJSで、属性として与えられた任意のAngular式を双方向バインドする](http://qiita.com/norami_dream/private/8fe08fc88e5b4c1eee8c)
vim置換

## 置換
```vim
:%s/置換前/置換後/
```
これだと一行中で一番初めに当たったものしか置換されないので

```vim
:%s/置換前/置換後/g
```
とすると1行中に複数マッチしても置換されます。

頭に%と置くと今開いているファイルという意味になるので

```vim
:1,100s/置換前/置換後/g
```
とすると1行から100行までと行を指定できます。
置換したい範囲をビジュアルモードで選択した後 `:` を打つと選択範囲ないを指定することもできます。

## 置換前の文字を流用
```vim
:%s/\(文字\)/h(\1)/
```
とかすると\\(\\)内にある文字が流用でき

```text
 h(文字)
```
と言うように置換されます。

```vim
:%s/\(\)　\(\)　\(\)//
```
のように複数 `\\(\\)` があると、左から順に　`\\1　\\2 \\3` となります。

## 最小一致
vimの正規表現は最大一致になっています。

```vim
:%s/<.\{-}>//
```
とすると最小一致で文字を置換できます。
上の場合だと `< >` で括られているものが削除されます。

最小一致なので、上の場合だと

```php
<input value="<?php echo $aa; ?>"　type="text" name="aa" id="text">
```
のようなものがあった場合

```php
<input value="<?php echo $aa; ?>
```
までが判定されます。
結果

```php
"　type="text" name="aa" id="text">
```
が残ります。
RubyのHashからファットアローを撲滅せよ

**ファットアローでRubyのHashを記述するのが許されるのは1.8系までだよね**

と言われてしまうのでこれを

```:旧記法
{
	:hoge     => params[:hoge],
	:fugafuga => params[:fugafuga]
}
```

こうしたい

```:新記法
{
	hoge:     params[:hoge],
	fugafuga: params[:fugafuga]
}
```


**正規表現で置換する**

```:検索文字列
":([a-zA-Z_][a-zA-Z0-9_]+)( *) => "
```

```:置換文字列
"$1:$2 "
```

**rubymineだったらこんな感じで入力すればOK**
![スクリーンショット 2014-07-18 22.49.01.png](https://qiita-image-store.s3.amazonaws.com/0/15269/50127bc1-ab77-d2f7-bcfb-e96ede59b005.png "スクリーンショット 2014-07-18 22.49.01.png")
capistranoでのデプロイ失敗時にhipchatに通知する

以下の拡張です。
[capistranoデプロイ時に、新しくリリースされるgitのコミットログをHipChatに通知](http://qiita.com/ysk_1031/items/91010b8e6d5c995e23c7)

capistrano 3.1.0から`deploy:failed`というデプロイ失敗を検知するhookが追加されたので、それを利用してデプロイ失敗時にhipchatへ通知するようにしましょう。

## 変更箇所

`config/deploy.rb` にデプロイ失敗時のhookを追加

```rb:config/deploy.rb
  after 'deploy:failed', 'hipchat:update:fail'
```


`lib/capistrano/hipchat.cap`にデプロイ失敗時の処理を記述

```rb:lib/capistrano/hipchat.cap

require 'hipchat'

HIPCHAT_TOKEN = 'YOUR_HIPCHAT_TOKEN'
ROOM_NAME = 'ROOM_NAME_TO_NOTIFY'

client = HipChat::Client.new(HIPCHAT_TOKEN)[ROOM_NAME]

namespace :hipchat do
  namespace :update do
    desc 'Notify when failed to deploy'
    task :fail do
      run_locally do
        client.send('Deploy',
          "#{deploy_user} FAILED to deploy #{fetch(:application)} to #{fetch(:rails_env)} ;(",
          { color: 'red', notify: true }
        )
      end
    end
  end
end

def deploy_user
  `git config user.name`.strip || ENV['USER']
end
```

するとhipchatには以下のように通知されます。

> bob FAILED to deploy アプリ名 to 環境 ;(

---

参考

- https://github.com/capistrano/capistrano/issues/708
- http://qiita.com/ysk_1031/items/91010b8e6d5c995e23c7
jQueryでシンプルなstickyのプラグイン

# 概要
初期位置とスティッキーとして配置しておく位置を指定するだけのプラグインを書いたのでメモがてら投稿。

# コード
```js

(function($) {
	'use strict';
    $.fn.stickeyMenu = function(options) {
        var $this = $(this);
        var defaultSetting = {
             startTop : 0 ,
             stopTop : 0 ,
             zIndex : 10
        }
        var settings = $.extend( {},defaultSetting,options);
        var init = function() {
            var $self = $(this);

            $self.css( {
                'position' : 'fixed' ,
                'top' : settings.startTop ,
                'zIndex' : settings.zIndex
            })

            $(window).on('load scroll',function() {
                var _top = settings.startTop - $(this).scrollTop();
                if(settings.stopTop <= _top ) {
                    $self.css( {
                        'top' : settings.startTop - $(this).scrollTop()
                    });
                }
                else {
                    $self.css( {
                        'top' : settings.stopTop
                    });
                }
            })
        };

        this.each(function() {
            init.apply(this);
        });
        return this;
    }
})(jQuery);

$(function() {
    var _startTop = 500; // 初期位置
    $('.gloval_menu_section').stickeyMenu( {
        startTop : _startTop
    });
});
```
備忘：UNIXコマンドの小ネタ

普段からバリバリ使うわけではないが、覚えておくと便利なコマンドの使い方をメモしていく。

## エイリアス

設定は

    $ alias

で確認できる。
最初から設定されているものも結構あるので、確認のこと。

    ls -l

なんて打ってる人がいたら、aliasの存在を教えてあげよう。（大抵は"ll"で登録してある）

aliasの内容は、~/.bashrcか~/.bash_aliasesで定義しておけばターミナル起動時から有効になる。

**__ぼくの.bash_aliases__**

```bash:~/.bash_aliases
# Enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# My aliases
alias gs='git svn'
alias gk='gitk --all &'
alias clip='xsel -i -b'


function ud () {
    if [ $# -ne 1 ]; then
        echo "不正な引数の数"
        return 0
    fi

    expr "$1" + 1 >/dev/null 2>&1
    if [ $? -ge 2 ]; then
        echo "不正な引数の型"
        return 0
    fi

    i=0
    until [ $i -ge $1 ]
    do
        cd ../
        i=`expr $i + 1`
    done
}
```
ちゃっかり自作のコマンド入ってます。
ll 以外に特によく使うのは gk と clip（両方共ソフトをインストールする必要はあるけど）


## ディレクトリを監視するのに使える watch コマンド

    $ watch -n 1 "ls -l"

1秒毎に"ls -l"を実行して、結果を表示してくれる。エイリアスは使えない。
オプションに-dを入れると、前回との差分をハイライトしてくれるので、それもオススメ。


## 多才な tail コマンドさん

普段私は -n と -f オプションをそのまま使うくらいだが、--help を読んだら結構面白かったので紹介。

### -n +K

K行目から末尾までを読み込む

    $ tail -n +2 hoge.xml > piyo.xml

これで hoge.xml のxml宣言以外をpiyo.xmlにコピーできる。


### --follow=name

単純に -f オプションを使うとログのローテートなどでファイル名が変更された場合に、追跡が終わってしまう。（"tail -f"は"tail --follow=descriptor"と同じ）
--follow=nameにしておくと、ファイルが一旦消えても同名のファイルが再出現した場合に追跡を再開してくれる。ちなみに、

```
tail: hoge.log: そのようなファイルやディレクトリはありません
tail: 'hoge.log' が現れました。新しいファイルの終端を追跡します
```

こんなメッセージが出る。


### ログ監視の結果を grep に渡す

    $ tail -follow=name access.log | grep -v " 200 "

これで HTTP のステータスコードが200以外のログを監視できる。
ArrayIteratorにバッファオーバーラン?脆弱性?

[ArrayIterator](http://jp1.php.net/manual/ja/arrayiterator.uksort.php)は、ソート中に自分自身を変更することはできません。
まあ普通は、ソート中に中身を書き換えられたらすごく困りますね。

```php
<?php
	$arrayIterator = new ArrayIterator(['A','B']);
	$GLOBALS['arrayIterator'][0] = 'C'; // 問題なし

	// ソート中に中身を変更
	function badsort($a, $b) {
		$GLOBALS['arrayIterator'][0] = 'D';
		return $a > $b;
	}
	$arrayIterator->uksort('badsort'); // Warning: Modification of ArrayObject during sorting is prohibited
```

Warningが発生し、中身の変更は拒否されます。

ところで何となくJVNを見ていたらJVNDB-2014-003302、CVE-2014-4698というものを発見しました。
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003302.html
https://bugs.php.net/bug.php?id=67539
解放して、もう使わなくなったはずのメモリにアクセスしてしまうバグだそうです。
場合によってはサービス運用妨害に至るそうです。
これはバッファオーバーランなのかな？
2014/06/29に発見され、2014/07/02に修正されています。
当然PHP5.6.0RC2の時点では修正されていません。

```php
<?php
	$arrayIterator = new ArrayIterator(['A','B']);
	
	// ソート中にunserialize
	function badsort($a, $b) {
        $GLOBALS['it']->unserialize($GLOBALS['it']->serialize());
		return $a > $b;
	}
	$a->uksort('badsort'); // エラーは出ない
```

unserializeだとエラーが発生せずに中身が書き換えられます。
エラーは出ませんが、実はC言語レベルでは不正なメモリ読み出しが発生しています。
そのあたりはMemcheckで確認可能です。

あとはArrayIteratorの中身をうまいこと書き換えれば、メモリの不正な読み出し箇所にコードを忍ばせて何か攻撃できるかもしれません。
が、そのあたりは詳しくないので具体的にどのようにすればいいかはよくわかりません。
というか、そもそもソート中に中身を書き換えるようなソースを書く方が悪いだろこれ。
JVNでの深刻度は4.6ですが、本当にこれで影響を受けるシステムが存在するのか疑問に思うレベル。

ちなみに

```php
<?php
	$arrayIterator = new ArrayIterator(['A','B']);
	
	// ソート中にunserializeで中身を入れ替え
	function badsort($a, $b) {
		$d = new ArrayIterator(['C','D']);
		$e = $d->serialize();
		$GLOBALS['arrayIterator']->unserialize($e);
		return $a > $b;
	}
	$a->uksort('badsort');
	
	// ソート中に$arrayIteratorを直接変更
	function badsort2($a, $b) {
		$GLOBALS['arrayIterator'] = new ArrayIterator(['C','D']);
		return $a > $b;
	}
	$arrayIterator->uksort('badsort2');
```

このように書くと書き換えができるうえに不正なメモリ読み出しも発生しません。
意味がわからぬ。
【メモ】AWSサミット東京2014 Day2

# 背景
* Day1: http://qiita.com/alingogo/items/e8061cac834fe6859440

# 経過
### キーノート
* なんでAWS低価格
    * 固定から変動
    * 継続的な値下げ
    * お客様の利用に合わせた料金
        * オンデマンド/リザブート/スポート
    * 割引
* 感想
    * その以外は、人件費
    * 大部分的な会社に、使える技術
    * ドキュメント、SDK、コンソール、コマンドラインで、操作便利
    * 勉強会へ参加し、技術共有
    * （無料なお昼ご飯）


### CloudFrontを利用したサイト高速化及びセキュア配信
##### 高速化
* 80:20法則
    * 80: CSS, js, png
    * 20: 動的html
        * ページ共通、パーソナル
* キャッシュの活用（ページ共通）
    * 例：商品詳細、カテゴリ一覧、人気商品一覧
    * 一定期間ページ更新が不必要なものは、積極的にキャッシュ
        * Cache-Control HeaderとMinimum TTLで調整
    * キャッシュヒット率向上
        * キャッシュ時間
        * URLの共通化
        * Etag/Last-Modifiedヘッダーの活用
        * Query Stringsパラメータ値の固定化
        * 転送対象Header値の固定化
* 動的なコンテンツでの活用
    * POST/PUT, Header, Cookie対応
    * Keep-Alive Connection
    * TCPスロースタート
* DNS Lookup

##### セキュア配信
* HTTPS
* geo restriction
* Signed URL
    * 指定可能ポリシー
    * 作成方法
    * ダウンロードとストリーミング配信

# VPCデザインパターン
* システム再現パターン
* インターネットサービスパターン
* 内部向けアプリケーションパターン
* バックホームパターン

# Redshift

# AutoScale*ゲーム
* AutoScale+スポートインスタンス
    * ZABBIXで、入さ価格を監視
    * Jenkinsで、AutoScaleのconfigを変更
    * 入札価格は、オンデマンドの価格より、やすいときに、AutoScaling
    * 高いときに、オンデマンド利用

# DynamoDB
* アプリのイベント履歴管理
* マルチプレヤーゲーム
* 友達リスト一覧と画像
* 投票システム
java.io.tmpdirのOSによる値の差異について

##概要
一時ファイル等を作成する際に利用するシステムプロパティ*java,io.tmpdir*。
実行するOSによって、値に差異がありました。
本番サーバがLinux。開発環境はWindowsなんて場合に起きやすいかも。
気が付きにくい割に結構、致命的だったので調査結果を記載。

##サンプル
具体的なプログラムを下記に記載。
こんな感じでコーディングしてました。

```java:sample
import java.io.File;

public class TempDir {
	public static void main(String[] args) {
		// 一時ディレクトリに作成したファイルのパスを取得する
		String tempDir = System.getProperty("java.io.tmpdir") + "mydir" + File.separator + "filename.txt";
		
		// パスを表示
		System.out.println(System.getProperty("java.io.tmpdir"));
		System.out.println(tempDir);
	}
}
```
この出力結果がOSによって差異があるのです。
Windwos7
`C:\Users\username\AppData\Local\Temp\
C:\Users\username\AppData\Local\Temp\mydir\filename.txt`

Linux(CentOS)
`/tmp
/tmpmydir/filename.txt`

おおっと
*java.io.tmpdir*の値の末尾の区切り文字の有無の違いがありますね。
どちらかの環境のみでテストをしていると気が付きません…

*endsWith( File.separator)*で末尾の区切り文字の有無を確認して差異を吸収してあげることで対処。


他のOSに関してはこちらの記事参照。
参照：[java.io.tmpdir Inconsitency](http://rationalpi.wordpress.com/2007/01/26/javaiotmpdir-inconsitency/)
Bitcasa を Ubuntu 14.04 にインストール

Bitcasa は Docker 化ができず（マウントしたディレクトリをマウントし直すことはできない），ホストにインストールする必要があるので，メモ．

# インストール
```
apt-get update -qq && apt-get -y install wget uuid-runtime
echo "deb http://dist.bitcasa.com/release/apt debian main" > /etc/apt/sources.list.d/bitcasa-release.list
wget -O- http://dist.bitcasa.com/release/bitcasa-releases.gpg.key | apt-key add -
apt-get update -qq && apt-get -y install bitcasa
```

# マウント
予めキャッシュ用とマウント用のディレクトリを作っておく．ここでは，/storage/bitcasa/cache と /storage/bitcasa/data を使うことにした．

```
mount.bitcasa <email address> /storage/bitcasa/data -o password=<password>,cachedir=/storage/bitcasa/cache
```
ionic導入編


# はじめに
[ionic](http://ionicframework.com/)はHTML5でネイティブアプリが作成できるUIフレームワークです。PhoneGap、Monacaなどのフレームワーク同様、[Cordva](http://cordova.apache.org/)がベースにあります。

最も大きな特徴は、はじめからAngularJSを使用することを念頭に作成されている点です。AngularJSから一通りの機能を操作できるような設計になっています。

また、スタイルもCSSではなくSassでできるようになっています。


# 環境設定(Mac)
## npm
ionicのインストールのためにnpmコマンドが使用できるようにします。
以下のコマンドを実行し、npmコマンドをインストールします。

```
~ brew install node
~ npm -v
1.5.0-alpha-3
```

## cordva, ionic
はじめに書いた通り、ionicはcordvaをベースに作られていますのでcordvaとionicをどちらもインストールします。

```
~ npm install -g cordova ionic
```

# プロジェクトの作成〜起動

ここまででionicを使用する準備はできました。プロジェクトを生成していきます。

```
# 以下のいずれかを実行

# まっさらな状態
~ ionic start helloWorld blank

# ナビゲーション＋タブ
~ ionic start helloWorld tabs

# サイドメニュー付き
~ ionic start helloWorld sidemenu
```

これでhelloWorldというフォルダが生成されたかと思います。そのフォルダに移動し、iOSプラットフォームで動くような設定をします。

```
~ cd helloWorld
~ ionic platform add ios
```

iOSで動かす場合、仮想のsimが必要なため、以下のコマンドでインストールします。

```
~ npm install -g ios-sim
```

最後にアプリをビルドしてエミュレータで実行します。

```
~ ionic build ios
~ ionic emulate ios
```

これでエミュレータが起動し、タブ付きのアプリが起動したかと思います。


以上でアプリの導入は完了です。


# 参考
[The lonic Book](http://ionicframework.com/docs/guide/)
Butterfly Persistence + Oracle 環境でプリペアードステートメントがうまくいかない件

表題の通り。

```java
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl("jdbc:oracle:thin:@****:1521:****");
        dataSource.setDriverClassName(oracle.jdbc.driver.OracleDriver.class.getName());
        dataSource.setUsername("****");
        dataSource.setPassword("****");

        String sql = "select * from hoge where id = ?";
        PersistenceManager pManager = new PersistenceManager(new ScopingDataSource(dataSource));
        try {
            IObjectDao dao = pManager.createDaos().getObjectDao();
            System.out.println(dao.read(Hoge.class, sql, 1));
        } catch (PersistenceException e) {
            e.printStackTrace();
        }
```

こんな感じのコードで下のようなエラーが出る。

```
com.jenkov.db.itf.PersistenceException: Error retrieving parameter count for prepared statement: oracle.jdbc.driver.OraclePreparedStatementWrapper@7966340c
...
Caused by: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
...
```

僕が選んだ解決方法は、dao.getConnection().preparedStatement(sql) で、JDBC の Prepared Statement を生成して、食わせるというやり方だ。

```java
        try {
            IObjectDao dao = pManager.createDaos().getObjectDao();
            PreparedStatement stmt = dao.getConnection().prepareStatement(sql);
            stmt.setInt(1, 1);
            System.out.println(dao.read(Hoge.class, stmt));
        } catch (PersistenceException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
```
Guard 関連記事まとめ

# Guard 関連記事まとめ

更新日: 2014/07/18 21:53:14

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Ruby  Guard gem  guard list コマンドで plugin の一覧を確認する](http://qiita.com/tbpgr/items/1a4f7c1c1162c12fcb15)|2014/07/18 21:51:52|0|
|2|[Ruby  Guard gem  guard show コマンドで plugin と option を確認する](http://qiita.com/tbpgr/items/1142c000cc578a77ed45)|2014/07/18 21:52:31|0|
|3|[Ruby  Guard gem を利用してファイルの変更を検出し、rubocopを自動実行する](http://qiita.com/tbpgr/items/b81dd18b12f8fc941424)|2014/07/18 21:48:40|0|
|4|[Ruby  Guard gem を利用してファイルの変更を検出し、任意のタスクを自動実行する](http://qiita.com/tbpgr/items/f5be21d8e19dd852d9b7)|2014/07/18 21:45:50|0|
|5|[Ruby  GuardでRSpec/RuboCopを自動実行して結果をGrowlに表示する](http://qiita.com/tbpgr/items/7016d47e87d068ba0ad7)|2014/07/18 21:50:50|0|