OmniAICreator/Qiita-1.07M huggingface dataset:
Seasar2 を利用しなくても利用したい Seasar2 の ユーティリティ

総称型を取得するのに便利

1. [GenericUtil](http://www.seasar.org/source/browse/s2container/trunk/s2-tiger/src/main/java/org/seasar/framework/util/tiger/GenericUtil.java?view=markup)
1. [CollectionsUtil](http://www.seasar.org/source/browse/s2container/trunk/s2-tiger/src/main/java/org/seasar/framework/util/tiger/CollectionsUtil.java?view=markup)

```java:example
package jp.mirageworld.dao;

import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Map;

import org.seasar.framework.util.tiger.GenericUtil;

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class AbstractDao<E> {

	protected final Class<E> entityClass;

	@SuppressWarnings("unchecked")
	public AbstractDao() {
		Class<E> entityClass = null;
		Map<TypeVariable<?>, Type> map;
		map = GenericUtil.getTypeVariableMap(getClass());
		for (Class<?> c = getClass(); c != Object.class; c = c.getSuperclass()) {
			if (c.getSuperclass() == AbstractDao.class) {
				Type type = c.getGenericSuperclass();
				Type[] arrays = GenericUtil.getGenericParameters(type);
				entityClass = (Class<E>) GenericUtil.getActualClass(arrays[0], map);
				break;
			}
		}
		this.entityClass = entityClass;
	}
}
```
AngularJS 1.2.0の"Controller As" Syntax

AngularJS 1.2.0の"Controller As" Syntax
===================================

AngularJS 1.2.0より"Controller As" Syntaxが追加されました。
割りとググラビリティが低く、ドキュメントも探しづらいですが、
Controllerを綺麗に書くために非常に有効な機能なので、書いていきます。

# Controller As Syntaxとは

"Controller As" Syntaxはng-controllerに新たに追加された記法で、
`ng-controller="hogeCtrl as hoge"`と記述することでhogeCtrlをhogeという名前でscopeに詰めることができます。
またこれを利用することで、かなりControllerを$scopeの依存から切り離すことが可能になります。

# 書き方

## View側

View側では今まで`ng-controller="hogeCtrl"`と記載していた部分を`ng-controller="hogeCtrl as hoge"`などに変更し、
ng-click等は`ng-click="clickFuga()"`から`ng-click="hoge.clickFuga()"`に変更します。
※この`clickFuga`メソッドは`hogeCtrl`によってscopeに登録されていたとして。

__Controller As利用前__

``` html:Controller_As利用前.html
<div ng-controller="hogeCtrl">
  <span>{{name}}</span>
  <button ng-click="clickFuga()">
</div>  
```

__Controller As利用後__

``` html:Controller_As利用後.html
<div ng-controller="hogeCtrl as hoge">
  <span>{{hoge.name}}</span>
  <button ng-click="hoge.clickFuga()">
</div>  
```

## Controller側

Controller側は今まで`scope`に対して設定していたプロパティや、関数をController自体のプロパティ、メソッドとして登録します。

__Controller As利用前__

```coffeescript:Controller_As利用前.coffee
angular
    .module('hogeApp', [])
    .controller 'hogeCtrl', ['$scope','$window',
        ($scope, $window)->
            $scope.name = 'Hoge'
            
            $scope.clickFuga = ()->
                $window.alert($scope.name)
    ]
```

__Controller As利用後__

```coffeescript:Controller_As利用後.coffee
angular
    .module('hogeApp', [])
    .controller 'hogeCtrl', ['$scope','$window',
    class HogeCtrl
        constructor:(@$scope, @$window)->
            @name = 'Hoge'
        clickFuga:()->
            @$window.alert(@name)       
    ]
```

上記のように、DIはしていますが、scopeは実際には利用していません。
また各方面から怒られそうですが、classっぽい書き方でも利用が可能になります。

# まとめ

個人的には"Controller As" Syntaxにより、Controllerがかなり書きやすくなり、
Coffee Scriptとの親和性が高くなったなーと思っています。

またあまり`scope`に何かを突っ込んでいく書き方が個人的には気持ち悪さがあったので、
かなり好きになりました。

ただし、このSyntax自体は、[賛否両論](https://groups.google.com/forum/#!topic/angular/84selECbp1I)あったみたいなので、
使い方や、もう少しノウハウがほしいところかなーと思います。

# 参考

* http://alxhill.com/blog/articles/angular-coffeescript/
* http://egghead.io/lessons/angularjs-experimental-controller-as-syntax
pg_bulkloadを使ってCSVファイルから固定長のバイナリファイルを出力する

[pg_bulkload](http://pgbulkload.projects.pgfoundry.org/index_ja.html)（PostgreSQL 向けの高速データロードユーティリティ）には，独自のバイナリフォーマットがあります．
[公式ドキュメント](http://pgbulkload.projects.pgfoundry.org/pg_bulkload-ja.html)に，pg_bulkloadの使い方が載っていますが，バイナリファイルを出力するためのサンプルとなる制御ファイルはありません．
そこで本ページでは，CSVファイルをpg_bulkloadのバイナリフォーマットに変換するための制御ファイルを紹介します．

# 想定するロード先テーブル
```
         Table "public.users"
 Column |       Type        | Modifiers 
--------+-------------------+-----------
 name   | character varying | 
 age    | integer           | 
 weight | real              | 
```

# サンプルCSVファイル

```input.csv
"taro",17,55.0
"jiro",15,53.0
"saburo",13,45.0
```

# サンプル制御ファイル

```output_binary.ctl
# 入力はCSVファイル
TYPE = CSV
# 標準入力から読み込む
INPUT = stdin
WRITER = BINARY
OUTPUT = /tmp/test.bin

# カラムの型情報をOUT_COLで指定する
OUT_COL = VARCHAR(10)
OUT_COL = INTEGER(4)
OUT_COL = FLOAT(4)
```

# コマンド

```
$ pg_bulkload output_binary.ctl < input.csv
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
        0 Rows skipped.
        3 Rows successfully loaded.
        0 Rows not loaded due to parse errors.
        0 Rows not loaded due to duplicate errors.
        0 Rows replaced with new rows.
```

# 出力
```
$ od -c /tmp/test.bin
0000000   t   a   r   o                         021  \0  \0  \0  \0  \0
0000020   \   B   j   i   r   o                         017  \0  \0  \0
0000040  \0  \0   T   B   s   a   b   u   r   o                  \r  \0
0000060  \0  \0  \0  \0   4   B
0000066
```
```/tmp/test.bin.ctl
INPUT = /tmp/test.bin
OUTPUT = test
LOGFILE = /tmp/test.bin.log
PARSE_BADFILE = /tmp/test.bin.prs
DUPLICATE_BADFILE = /tmp/test.bin.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = YES
VERBOSE = NO
TRUNCATE = NO
WRITER = DIRECT
TYPE = BINARY
COL = VARCHAR (10)
COL = INTEGER (4)
COL = FLOAT (4)
# ENCODING = SQL_ASCII
```
スライド作成用HTML5フレームワークとWEBサービス

# スライド作成用HTML5フレームワーク

### BESPOKE.JS
![](http://bashooka.com/wp-content/uploads/2013/11/bespoke.jpg)
[http://markdalgleish.com/projects/bespoke.js/](http://markdalgleish.com/projects/bespoke.js/)

### IMPRESS.JS
![](http://bashooka.com/wp-content/uploads/2012/11/impress-js-1.jpg)
[http://bartaz.github.com/impress.js/](http://bartaz.github.com/impress.js/)

### FLOWTIME.JS
![](http://bashooka.com/wp-content/uploads/2013/11/flowtimejs.jpg)
[https://github.com/marcolago/flowtime.js](https://github.com/marcolago/flowtime.js)

### REVEAL.JS
![](http://bashooka.com/wp-content/uploads/2012/11/reveal-5.jpg)
[http://lab.hakim.se/reveal-js/](http://lab.hakim.se/reveal-js/)

### SLIPPY
![](http://bashooka.com/wp-content/uploads/2012/11/slippy-2.jpg)
[https://github.com/Seldaek/slippy/](https://github.com/Seldaek/slippy/)

### DECK
![](http://bashooka.com/wp-content/uploads/2012/11/deck-js-4.jpg)
[http://imakewebthings.com/deck.js/](http://imakewebthings.com/deck.js/)

### SHOWER
![](http://bashooka.com/wp-content/uploads/2012/11/shower-6.jpg)
[https://github.com/pepelsbey/shower](https://github.com/pepelsbey/shower)

### LEAVEROU/CSSS
![](http://bashooka.com/wp-content/uploads/2012/11/csss-7.jpg)
[https://github.com/LeaVerou/CSSS](https://github.com/LeaVerou/CSSS)

### HTML5SLIDES
![](http://bashooka.com/wp-content/uploads/2012/11/presentation-8.jpg)
[http://code.google.com/p/html5slides/](http://code.google.com/p/html5slides/)

### DZSLIDES
![](http://bashooka.com/wp-content/uploads/2012/11/dzslide-9.jpg)
[http://paulrouget.com/dzslides/](http://paulrouget.com/dzslides/)

### FATHOM.JS
![](http://bashooka.com/wp-content/uploads/2012/11/fathom-10.jpg)
[http://markdalgleish.com/projects/fathom/](http://markdalgleish.com/projects/fathom/)

### CONTROLDECK.JS
![](http://bashooka.com/wp-content/uploads/2013/11/controller-17.jpg)
[http://controldeck.aws.af.cm/](http://controldeck.aws.af.cm/)

# WEBサービス系

### SlideShare
[http://www.slideshare.net/](http://www.slideshare.net/)

### SpeakerDeck
[https://speakerdeck.com/](https://speakerdeck.com/)

### slid.es
[http://slid.es/](http://slid.es/)

### strut.io
[http://strut.io/](http://strut.io/)

### glide
[http://glide.so/](http://glide.so/)
redirect_toのレスポンスコードをデフォルトで302 Foundではなく301 Moved Permanentlyにする


302じゃなくて301を使う理由は、[301リダイレクトと302リダイレクトの違い]
(http://www.suzukikenichi.com/blog/difference-between-301-redirect-and-302-redirect/)参照。

重要なところを抜き出すと、

>301リダイレクトは、”Permanent Redirect”で「恒久的な転送」、一方、302リダイレクトは、”Temporary Redirect”で「一時的な転送」を表します。

検索エンジンのインデックスに関して：

> - 302リダイレクト：旧URLのまま
> - 301リダイレクト：新URLへ

というようになっている。

ちなみにRailsでは、デフォルトで302が返るようになっている。
これを変えるには、

```ruby
redirect_to root_path, status: :moved_permanently
redirect_to root_path, status: 301
```

とすれば良いのだが、自分が通常redirectしているところでは、新しいURLに移動などが多いので、移動先のURLを検索エンジンがインデックスしてくれて構わない。なので301をデフォルトにする用に書き換えておきたい。

そのためには、アプリケーションコントローラーに以下のコードを書けばOK。
(alias_method_chainの枠組みに乗ったため、ちょっと関数名が変だが、どうせredirect_toしか使わないので気にしない。)

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def redirect_to_with_moved_permanently(options = {}, response_status = {})
    response_status.reverse_merge!(status: :moved_permanently)
    redirect_to_without_moved_permanently(options, response_status)
  end
  alias_method_chain :redirect_to, :moved_permanently
end
```

これで、デフォルトで301になり、

```ruby
redirect_to root_path, status: :found
redirect_to root_path, status: 302
```

等と書いた時だけ302を返すようになる。

ちなみに、元の`redirect_to`のコード以下にあるので、ご参照あれ。
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/redirecting.rb

### ちなみに

301 のリダイレクトは、Rails的にはrouterを使うことを推奨している模様。

```config/routes.rb
  get "/hoge" => redirect("/fuga")
```

これだと、デフォルトで301になる。

自分の考えたケースだと、controllerの`redirect_to`も301デフォルトの方が良いと思ったけれど、それで良いかは自己責任でお願いします。
proxmoxでクラスタリング

# 参考

* [公式wiki](https://pve.proxmox.com/wiki/Proxmox_VE_2.0_Cluster)
* [Proxmox VE 3.1で複数ノードを管理してみた | 俺的備忘録 〜なんかいろいろ〜](http://orebibou.com/2013/11/proxmox-ve-3-1%E3%81%A7%E8%A4%87%E6%95%B0%E3%83%8E%E3%83%BC%E3%83%89%E3%82%92%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)

* ノードの削除をされたソフトウエアRAIDを組んだ端末は次回OS起動できなくなる

## ノードの説明

* Proxmox-5 : 通常master機 (192.168.100.5)
* Proxmox-6 : 通常backup機 (192.168.100.6)
* ProxmoxCluster : Proxmox-5, Proxmox-6のクラスター名


# クラスタ構築

## Proxmox-5で実施

```bash:クラスタ作成
Proxmox-5# pvecm create ProxmoxCluster
```

```bash:nodes
Proxmox-5# pvecm nodes
```

```bash:status
Proxmox-5# pvecm status
```

## Proxmox-6にてクラスタに参加

* sshの鍵のコピーと、クラスタに参加が始まる。

```bash:
Proxmox-6# pvecm add 192.168.100.5
```

```bash:nodes
Proxmox-6# pvecm nodes
Node  Sts   Inc   Joined               Name
   1   M      4   2014-11-04 05:58:20  Proxmox-5
   2   M      8   2014-11-04 06:02:15  Proxmox-6
```

```bash:status
Proxmox-6# pvecm status
```

## クラスタから削除

Proxmox-6が障害でダウン、クラスタから切り離したいという場合。

参考:

* [Remove Node Cluster (forever) on Proxmox 2.2](http://wmunguiam.blogspot.jp/2013/02/remove-node-cluster-forever-on-proxmox.html)

```bash:Proxmox-5にて作業
# pvecm nodes
Node  Sts   Inc   Joined               Name
   1   M     68   2014-11-19 12:30:07  Proxmox-5
   2   X      0                        Proxmox-6
# pvecm delnode Proxmox-6
cluster not ready - no quorum?
# pvecm expected 1
# pvecm delnode Proxmox-6
# pvecm nodes
Node  Sts   Inc   Joined               Name
   1   M     68   2014-11-19 12:30:07  Proxmox-5
```

削除成功！
クラスタ定義は `/etc/pve/cluster.conf`に記述されている。

# クラスタ再構築

以下は行ってはいけない。

* Proxmox-6にて作業

```bash:
# pvecm add 192.168.100.5
authentication key already exists
# pvecm add 192.168.100.5 -force
```

## 注意点

クラスタ参加している状態でホスト名を変更してしまうと、
`/etc/pve/cluster.conf`内にホスト名が一致せずcmonが起動できない。


# スレーブ設定についてあれこれ

仮想OSがいない場合
------------------
クラスターに参加するマシン上に仮想OSがいないことを確認。(マスター側には仮想OSいて問題なし。)
`-force`オプションで強制参加もできるが、スレーブの仮想OSの設定(/etc/vz/conf/)が消えてしまうことに注意。


仮想OSがいる場合
------------------
* /etc/vz/conf/*.conf を事前にバックアップ、スレーブに参加したあとに復元すればよい。
* 仮想OSは止めなくて大丈夫です。

仮想OSがいるがconfをバックアップし忘れた時
------------------
* 仮想OSを作って conf をコピーし、以下情報を適宜書き換えればOKです。

```bash:
HOSTNAME="test1.local"
IP_ADDRESS="192.168.11.244"
VE_PRIVATE="/var/lib/vz/private/301"
```

クラスター時のストレージパス
===========
クラスター組むときは、ストレージのディレクトリを全台共通にしておくこと！！
-------------------------------
異なる場合、データ消されます。

失敗例
--------
* マスター側に パス名: hdd 、パス: /data/、クライアント側にパス名: hdd、パス: /hdd がある場合、
  パスがマスター側に上書きされます。
* この状態で /data/ に入っている仮想OSをスレーブにMigrationすると スレーブの /data宛に転送を試みる。
  しかし /dataは存在しないのでデータ転送失敗。しかしMigrationは終わりスレーブ側に仮想OSがいる。
  この段階でマスター側から仮想OSとデータが消えていないので、スレーブにうつったconfをマスターに戻せばOK。
How to remove Mac App Store's applications from updates (without removing from my applications)

Japanese procedure is below.

* Left click the desired app and Show the package content.
* Rename _CodeSignature and _MASReceipt (possibly by adding underscore).
* Put the app into Trash
  * Now it is invisible from App Store
* Put the app into Applications back
  * When you restart App Store, it will scan Applications, but since we have hidden App Store info, it is not recognized as installed via App Store.

### Note
* The processed app is affected by Gatekeeper.
* I don't come up with good usage other than that "I cannot update iMovie after upgrading iMac (Mid 2007) to Mavericks".
* Now that iMovie 10.0.1 is installable on iMac (Mid 2007), this article is just a reference :p

Japanese procedure
* 当該appを右クリックし「パッケージの内容を表示」する
* _CodeSignatureと_MASReceiptを(末尾にアンダーバーを付与するなど)リネームする
* 当該appをゴミ箱に移動する
  * これでApp Storeの監視から外れる
* 当該appをアプリケーションに戻す
  * App Storeを再び起動した時にスキャンが行われるようだが、App Storeの情報を潰しているのでStore経由と認識されない

### 備考
* 処理したappはGatekeeperの影響を受けます。
* iMac (Mid 2007)をMavericksに上げた後iMovieが更新できないとかの場合しか有効な例を思いつきません^^;
* iMovie 10.0.1はiMac (Mid 2007)にインストール可能なようです。これでこの記事は参考資料レベルになってしまいました--;

[for search] Mac App Storeアプリをアップデート対象から外す
Rails4でGoogleMapを表示させる	


## RailsでGoogleMapを表示させたい！
と思って調べてみたら、早速出てきました。
その名も[Google Maps for Rails](https://github.com/apneadiving/Google-Maps-for-Rails)。

## 早速使ってみる
Githubに載っているチュートリアルに従ってコードを書いて行きます。
YouTubeにも[動画が上がっています](http://www.youtube.com/watch?v=R0l-7en3dUw&feature=youtu.be)。


#### とりあえずプロジェクトを用意します。

```shell
rails new gmap 
cd gmap
```

#### 用意するGemを記述

```ruby:Gemfile
gem "gmaps4rails"
gem "geocoder"
```

```shell
bundle install
```

#### 緯度経度のデータを格納するModelを用意します。

```shell
rails g scaffold user title:string description:string address:string latitude:float longitude:float
rake db:migrate
```
Userができたら以下のコードを記述します。

```ruby:user.rb
class User < ActiveRecord::Base
  geocoded_by :address
  after_validation :geocode
end
```

#### JSのURLを指定します

```erb:views/layouts/application.html.erb
<script src="//maps.google.com/maps/api/js?v=3.13&amp;sensor=false&amp;libraries=geometry" type="text/javascript"></script>
<script src='//google-maps-utility-library-v3.googlecode.com/svn/tags/markerclustererplus/2.0.14/src/markerclusterer_packed.js' type='text/javascript'></script>
```

underscore.jsは[こちら](http://underscorejs.org/underscore-min.js)よりコピーしてきます。

```javascript:vendor/assts/javascripts/underscore.js
(省略)
```

```javascript:assets/javascripts/application.js
//= require underscore
//= require gmaps/google
```


#### 地図ページを用意します

```shell
rails g controller map index
```
```erb:views/map/index.html.erb
<div style='width: 800px;'>
  <div id="map" style='width: 800px; height: 400px;'></div>
</div>

<script type="text/javascript">
	handler = Gmaps.build('Google');
	handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
	  markers = handler.addMarkers(<%=raw @hash.to_json %>);
	  handler.bounds.extendWith(markers);
	  handler.fitMapToBounds();
	});
</script>
```

#### Controllerを編集します

```ruby:controllers/map_controller.rb
class MapController < ApplicationController
  def index
    @users = User.all
    @hash = Gmaps4rails.build_markers(@users) do |user, marker|
      marker.lat user.latitude
      marker.lng user.longitude
      marker.infowindow user.description
      marker.json({title: user.title})
    end
  end
end
```


#### Userデータを登録
この時点で先にUserにデータを入れておきます。
Userの作成ページにて、Addressに適当な地名を入力します。
更新時にgmap4railsのほうで緯度経度を取得してLatitide/Longitudeに格納してくれます。
どの程度までかわかりませんが、日本語で登録しても問題ないようです。
こんな感じで。

| title | address | latitude | longitude |
|:-----------:|:------------:|:------------:|:-----:|
| 名古屋の場所  | 名古屋  | 35.1814464 | 136.906398 |
| 浜松の場所  | 浜松  | 34.7108344 | 137.7261258 |
| 静岡の場所  | 静岡  |34.975562 |138.3827956 |


#### 動作確認！

さて、いよいよ起動です。
rails s して[localhost:3000/map/index](localhost:3000/map/index)にアクセスしてみます。
デフォルトのままだと味気ないのでTwitterBootstrapRailsを見た目を多少整えています。

![My](https://s3-ap-northeast-1.amazonaws.com/github-images-jacoyutorius/Mymyap-1.jpg)


### というわけで
簡単でしたね。
ここまででYouTubeの動画の半分くらいです。後半は色々なオプションの説明となっていました。
それ以外の機能については[Wiki](https://github.com/apneadiving/Google-Maps-for-Rails/wiki)のほうに色々書いてあるみたいですよ。
Anemone gem (ruby) で指定したURLだけクロールする方法


# 1行概要

rubyのgem anemonを使って指定した正規表現のURLだけクロールし続けるサンプル

# 犯行動機

友人がよからぬ事をしようとしていたので援護射撃

# 方法

```ruby:crawl.rb
require 'anemone'

Anemone.crawl('http://example.com/start_page.html') do |anemone|

  # クロールするごとに呼び出される
  anemone.focus_crawl do |page|

    # 条件に一致するリンクだけ残す
    # この `links` はanemoneが次にクロールする候補リスト
    page.links.keep_if { |link|
      link.to_s.match(/detail/)
    } 
  
  end
 
  # ここがメインの部分
  anemone.on_every_page do |page|

    # クロールした結果をごにょごにょ
    p page.doc.at('title').inner_html

  end
end
```

# 結論
anemoneすごい。

twitterはこちら -> https://twitter.com/tady_jp
Emacsで画像プレビュー image-diredを使用可能にする

Mac OSXではconvertコマンドが標準で入っていないので、homebrewなどでimagemagickを入れると使えるようになります。

`brew install imagemagick`

diredで画像があるディレクトリに行き、`M-x image-dired`とします。
ウィンドウを3分割すると良いと思います。

![sss2.png](https://qiita-image-store.s3.amazonaws.com/0/8920/0605755d-4b05-fb68-a92c-383df72e441c.png)


diredの画像ファイル名の上に表示させる`C-t C-t` (Macでは`M-x image-dired-dired-toggle-marked-thumbs`、Linuxでは`M-x image-dired-dired-insert-marked-thumbs`)とする方法もあるようです。

画像のときだけ、Finderとの行き来が生じていたので少し便利になりました。
C言語のif文がうまくいかないときにチェックすること

ifの条件の部分でつかえるのは、

```c
a == b;
a <(=) b;
a (=)> b;
a != b;
```
や、これらとあわせて使う

```c
&&, ||, !
```
です。
したがって、```if(1<a<3)```などと書くとうまくいきませんよっと。
iOSアプリの部品の表示/非表示を切り替える方法

#alphaを設定する

ある部品（例えばボタンやラベルなど）をこのときは表示したい、
別のときは表示したい、ということが多くあると思います。

例えばbtnという名前のボタンをつくったとしましょう。

```objc
 btn.alpha = 0; //表示されない
 btn.alpha = 1; //表示される
```
となるので、まずはじめに

```objc
[self.view addSubview:btn];
```
しておけば、あとは条件によってalpha値を変えるだけです。
alphaが0のときは、そこを押してもボタンは押されません。

ボタンでも、ラベルでも、セグメンテッドコントロールでも、
大概のものはこの方法が適用できます。


removeFromSuperviewがなぜかつかえなかったのだ…
わりと始めの方で悩む問題だと思います。
RSpec で capybara を使用してファイルアップロードをする場合


使用した各バージョン
* ruby 2.0.0p247
* Rails 4.0.0
* rspec-rails 2.14.0
* capybara 2.1.0

RSpec で rails のテストを書く場合、form にテキストを擬似的に入力するときに capybara を使うと思います。
テキストフィールドの場合、` fill_in ` を使うことは知ってたんですが、

```html.erb
<%= form_for(@content) do |f| %>
  <div class="field">
    <%= f.label :upload_file %><br>
    <%= f.file_field :upload_file %>
  </div>
  <div class="actions">
    <%= f.submit "Upload" %>
  </div>
<% end %>
```
この html のようにファイルアップロードの場合どうやってやるのか分からなかったので調べてみました。

結論は、ファイルアップロードの場合は、`attach_file` を使用する。

```ruby:rspec
attach_file "Upload file", "/tmp/test.txt"
```

ここら辺の使い方は、capybara のドキュメントに書いてあります。
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions

チェックボックスとかラジオボタンの操作など色々用意されてるんですね。
capybara 便利！！！！！
オブジェクト初期化子の罠

コードを書いていてよく使用するオブジェクト初期化子の話です。
整理できるので便利ですが、注意して使わないと痛い目に遭います。

こんなコードを書きました。

```csharp
// メイン処理
try
{
	Debug.WriteLine( "Try" );
	using ( new MyClass( ) { Member = ThrowableMethod( ) } );
}
catch
{
	Debug.WriteLine( "Catch" );
}
```

```csharp
// ThrowableMethod
static int ThrowableMethod( ) { throw new InvalidOperationException( ); }
```

```csharp
// MyClass
class MyClass : IDisposable
{
	public int Member { get; set; }
	public MyClass( ) { Debug.WriteLine( "Constructor" ); }
	public void Dispose( ) { Debug.WriteLine( "Dispose" ); }
}
```

MyClass インスタンスを、オブジェクト初期化子を使用して初期化しています。

これを実行すると、こうなります。

```
Try
Constructor
'Example.vshost.exe' (マネージ (v4.0.30319)): 'C:\...\mscorlib.resources.dll' が読み込まれました
'System.InvalidOperationException' の初回例外が Example.exe で発生しました。
Catch
```

ヾ('ω')ﾉ゛　('ω')えっ

using を指定し、コンストラクタを最後まで処理したにもかかわらず、
MyClass オブジェクトが解放されませんでした。

こんな動作になるわけは、オブジェクト初期化子を使用するしないの違いを
ILで比較してみるとわかります。

```csharp
// MethodA
static void MethodA( )
{
	var value = new MyClass( );
	value.Member = ThrowableMethod( );
}
```

```csharp
// MethodB
static void MethodB( )
{
	var value = new MyClass( ) { Member = ThrowableMethod( ) };
}
```

MethodA ではオブジェクト初期化子を使用せず、
MethodB ではオブジェクト初期化子を使用しています。

ILにすると、こうなります。

```il
// MethodA
.method private hidebysig static 
	void MethodA () cil managed 
{
	.maxstack 2
	.locals init (
		[0] class Example.Program/MyClass 'value'
	)

	IL_0000: nop
	IL_0001: newobj instance void Example.Program/MyClass::.ctor()
	IL_0006: stloc.0 // ここで value にセットする
	IL_0007: ldloc.0
	IL_0008: call int32 Example.Program::ThrowableMethod()
	IL_000d: callvirt instance void Example.Program/MyClass::set_Member(int32)
	IL_0012: nop
	IL_0013: ret
}
```

```il
// MethodB
.method private hidebysig static 
	void MethodB () cil managed 
{
	.maxstack 2
	.locals init (
		[0] class Example.Program/MyClass 'value',
		[1] class Example.Program/MyClass '<>g__initLocal1'
	)

	IL_0000: nop
	IL_0001: newobj instance void Example.Program/MyClass::.ctor()
	IL_0006: stloc.1
	IL_0007: ldloc.1
	IL_0008: call int32 Example.Program::ThrowableMethod()
	IL_000d: callvirt instance void Example.Program/MyClass::set_Member(int32)
	IL_0012: nop
	IL_0013: ldloc.1
	IL_0014: stloc.0 // ここで value にセットする
	IL_0015: ret
}
```

MethodA と MethodB は同じ処理　　　と　思いきや　全然違いました。
Member プロパティの set である set_Member を実行するタイミングが、
　MethodA では　”参照を value に代入した後”　になっていますが、
　MethodB では　”参照を value に代入する前”　になっています。

要するに最初のコードは、using 変数が初期化されない(null)まま例外が発生し、
using 変数の Dispose 呼び出しがスキップされたという事のようです。

オブジェクト初期化子の中で例外が一度でも発生すると途端にどうしようも無くなるので、
~~指定できるだけ全て使うのではなく、安全なメンバに限って使った方が良さそうです。~~
```IDisposable```な型ではオブジェクト初期化子を使用しないようにします。

```csharp
// メイン処理
while ( true )
{
	try
	{
		using ( new FileStream( "FILE", FileMode.Create ) { Position = -1 } );
	}
	catch ( Exception ex )
	{
		Console.WriteLine( ex.Message );
	}
	Console.ReadKey( );
}
```

これも実行すると最初は ArgumentOutOfRangeException ですが、
2回目からは IOException になります。
non confirmation with cp

cpでいちいち上書き確認させない方法。

普通は-rfオプションをつけるといける

```shell-session
$ cp -rf source target
```

ただOSによっては勝手にaliasを設定いるらしく、これでもひとつずつ聞かれる。
このエイリアスを一時的に無効にする場合はバックスラッシュをいれるとできる

```shell-session
$ \cp -rf source target
```
vps_memo

Qiita試しに備忘録

■ユーザー設定
adduser hoge
passwd hoge 
	pass_fuga
■sudo設定
visudo
	//末尾挿入
	hoge ALL=(ALL) ALL
■SSH
vi /etc/ssh/sshd_config
	Port 12222
	PermitRootLogin no
/etc/init.d/sshd restart
■yumアップ
sudo yum update

■火壁
vim /etc/sysconfig/iptables

//////

*filter
:INPUT    DROP    [0:0]
:FORWARD  DROP    [0:0]
:OUTPUT   ACCEPT  [0:0]
:SERVICES -       [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4  -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport 12222 -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT

/////

service iptables restart

■アパッチ
sudo yum install httpd
sudo /etc/rc.d/init.d/httpd start
sudo /sbin/chkconfig httpd on
	DocumentRoot "/var/www/html"
■パーミッション
sudo chown hoge /var/www/html
objdumpのインストール


```Bash
$ objdump -h program 
-bash: objdump: command not found
```

objdumpしようと思ったら入っていなかったのだが。
objdumpだけでバラ売りしてるわけじゃなかったのでメモ。
MacPorts使ってインストールしようと思っている人はご参照あれ。

```Bash
$ sudo port install binutils
```

下記を参照した。
>[EAGLE 雑記](http://d.hatena.ne.jp/eagletmt/20080629/1214723290)
nodetoolでリモートホストを指定した時に接続が拒否される時に確認すべきこと


Cassandraでnodetoolを-hオプション付きで実行するとき、ポートを閉じていないにもかかわらず接続が拒否されてしまうことがある。
オプションなし、あるいはホスト指定がlocalhostだと動作する。

CassandraというかJMXに起因する問題で、接続先サーバーのホスト設定が間違っているために発生する。

ホスト指定してnodetoolが実行できないサーバーで、
```hostname -i```
を叩いて
```127.0.0.1```
が帰ってくるようであればNG.

解決のためには /etc/hosts を編集し、ローカルIPを設定する必要がある。

```
xxx.xxx.xxx.xxx my.host.domain
```

/etc/hosts を変更した後、
```hostname -i```
を実行して設定したIPアドレスが帰ってくるようであればOK.

設定後にCassandraの再起動が必要なため、再起動すればそのホストへのnodetool実行が可能になる。

# 参考
http://wiki.apache.org/cassandra/FAQ_JP#jmx_localhost_refused
http://ise0615.blogspot.jp/2010/12/jmxtomcat.html
http://d.hatena.ne.jp/ihiroky/20090403/1238721947
Backbone.jsでViewの初期化のちょっとしたサンプル

今日ちょっと話題になった事をまとめておく。

 * Backbone.Viewのイベントのセットっていつ行われるんだっけ？→initializeしてから。だからinitializeで動的にDOMを作成しても、その作成したDOMにイベントをバインドできる。
 * そのイベントのセットってどういう条件なんだっけ？→基本はDOM構造をセレクタで当てるだけなので、静的に作られていようが、動的に作ろうが大丈夫。
 * Backbone.View.elのエレメント自身にイベントをセットするのはどうやるんだっけ？→セレクタを書かなければ自分自身になる。

```html
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js"></script>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js"></script>

<script>
$(function(){
var MyView = Backbone.View.extend({
	el: '#great',
	events: {
	  'click .action': 'alertHoge',
	  'click': 'test'
	},
	initialize: function(){
		$('<div class="action">Test!</div>').appendTo(this.$el);
	},
	test: function(event){
		alert('test');
	},
	alertHoge: function(event) {
		alert('hoge');
	}
});

var myView = new MyView({
});
})
</script>
<style>
	#great{
		background-color: black;
		padding: 20px;
	}
	
	.action{
		background-color: white;
	}
</style>
<div id='great'>
</div>
```
Xcode5から追加されたAsset Catalog最大のメリット


![](https://developer.apple.com/library/ios/recipes/xcode_help-image_catalog-1.0/Art/about_image_catalogs_2x.png)

## 最大のメリットはバージョン管理でコンフリクトしづらくなること

Xcode5から追加されたAsset Catalog（ファイルとしては.xcassets）で画像の管理がだいぶ楽になったけど、これの最大のメリットは、新たにプロジェクトに画像ファイルを追加してもプロジェクトファイル（.pbxproj）が変更されないので、svnやgitを使ってる他の開発メンバーとコンフリクトする確率がぐっと下がる...！

従来通りにAsset Catalogを使わなくても開発は進められるけど絶対使った方がいい。

### （メリット・デメリットを比較せず）Asset Catalog使わないと言い切ってしまうのは老害ということでどうぞよろしくお願いしたいです

（ただ、各メンバーがお互いに画像を追加しあったら.xcassetsが更新されてコンフリクトする気がしないでもないけど、.xcassetsファイル自体はディレクトリで、その下にさらにディレクトリを置いて、そこにあるそれぞれのjsonファイルが有るかどうかで見ている様子なので単純に増やしたり減らしたりではコンフリクトはしなさそう）

## 参考

Xcode5から追加されたAsset Catalogの挙動をいろいろ試してみた
http://qiita.com/takabosoft/items/ac4f337a6dea31e95885


iOS Developer Library - Asset Catalog Help
https://developer.apple.com/library/ios/recipes/xcode_help-image_catalog-1.0/Recipe.html
awk のハマるポイントまとめ


### ダブルクォートではなくシングルクォートでくくること

ダブルクォートでくくると，シェルが引数と勘違いするので，シングルクォートでくくるかエスケープすること．

#### 誤

    awk "{print $1}" /etc/hosts

#### 正

    awk '{print $1}' /etc/hosts
    awk "{print \$1}" /etc/hosts

### 区切り文字を複数設定するとき

`-F`オプションで，文字クラス指定できる．が，1字ずつで区切られてしまう．
そのため，`*`を必ずつけること．

#### 誤

    awk -F '[= ]' '{print $1,$2}' /etc/sysctl.conf
    awk -F "[= ]" '{print $1,$2}' /etc/sysctl.conf

#### 正

    awk -F '[= ]*' '{print $1,$2}' /etc/sysctl.conf
    awk -F "[= ]*" '{print $1,$2}' /etc/sysctl.conf

ただ，この方法だと，先頭に空白がある場合に$1が空白になるので注意．
（方法知ってる方コメントお願いします．）

### SSHコマンドでリモートホストにawkコマンドを流すとき

そのままだと`$`記号が有効にならないので，エスケープする．
（上記参考）

    ssh hoge.com "awk '{print \$1}'"
    ssh hoge.com 'awk "{print \$1}"'

awkはそれ単体だけでなく，grep等と組み合わせることが多いので，リモートに送るコマンドは（シングル or）ダブルクォートでくくっておく．
クォートがないとパイプ前の出力結果をローカルホストで受け取ることになり，NWに負担がかかる．

    ssh hoge.com "grep POST /usr/local/apache/logs/access_log | awk '\$9 ~ /^50/ {print \$0}'"

### EXITステータスはエラーにならない限りEXIT_SUCCESS 
（2014/03/14追記）
grepとおなじ感覚で使ってて痛い目に合ったので。
参考：[Exit Statement - The GNU Awk User's Guide](https://www.gnu.org/software/gawk/manual/html_node/Exit-Statement.html)

```bash
% cat <<EOS | grep hoge
aiueo
fuga
EOS
% echo $?
1
 
% cat <<EOS | awk '/hoge/{print $0}'
aiueo
fuga
EOS
% echo $?
0
```
CreareJSのTextで指定した幅で自動折り返しした複数行テキストを返す関数（日本語対応）

EaselJS(0.6.1で確認)においてTextに日本語を指定すると、lineWidthが効かず改行されません。
これはこの問題を解決するための関数です。（Haxeコードです）

```haXe:hoge.hx
import createjs.easeljs.Text;
class Main {
	//指定した幅(lineWidth)で自動折り返しした複数行テキストを返す
	public static function wrapText(text:Text, lineWidth:Int):String {
		text.lineWidth = null;
		
		var str = text.text;
		var newStr:String = "";
		var r:EReg = new EReg("[\r\n]+|[\n]+|[\n]+", "g");
		var lines:Array<String> = r.split(str);
		
		var line:String;
		var words:Array<String>;
		var oneLineStr:String;
		var len:Int = lines.length;
		for (i in 0...len) {
			line = lines[i];
			text.text = line;
			if (text.getMeasuredWidth() < lineWidth ) {
				newStr += line;
				if(i < len-1) newStr += "\n";
				continue;
			}
			
			words = line.split("");//一文字ごとに分割する
			oneLineStr = "";
			for (w in words) {
				text.text = oneLineStr + w;
				if (text.getMeasuredWidth() > lineWidth ) {
					newStr += oneLineStr + "\n";
					oneLineStr = "";
				}
				oneLineStr += w;
			}
			newStr += oneLineStr;
			if(i < len-1) newStr += "\n";
		}
		
		text.text = newStr;
		
		return newStr;
	}
}
```
Ruby で Hash.new に空配列をうっかり渡して怪我した

ハッシュでvalueの初期値を空配列にしようとしてうっかりやってしまった。
欲しかったのは、単純化すると以下のようなハッシュ。

```rb
h[0] # => [0]
h[1] # => [0, 1]
h[2] # => [0, 1, 2]
h[3] # => [0, 1, 2, 3]
h['a'] # => []
```

実際に書いたコードは以下のような感じ。

```rb
h = Hash.new([])
(0..9).each do |key|
  h[key] << (0..key).to_a
end
```

実際の動作はというと、

```irb
> h = Hash.new([])
=> {}
> (0..9).each do |key|
  h[key] << (0..key).to_a
end
=> 0..9
> h
=> {}
> h.keys
=> []
> h.values
=> []
> h.empty?
=> true
> h[0]
=> [[0],
 [0, 1],
 [0, 1, 2],
 [0, 1, 2, 3],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4, 5],
 [0, 1, 2, 3, 4, 5, 6],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
> h[9]
=> [[0],
 [0, 1],
 [0, 1, 2],
 [0, 1, 2, 3],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4, 5],
 [0, 1, 2, 3, 4, 5, 6],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
> h['a']
=> [[0],
 [0, 1],
 [0, 1, 2],
 [0, 1, 2, 3],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4, 5],
 [0, 1, 2, 3, 4, 5, 6],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
```

マニュアルでnew(ifnone = nil)をみると、

````
空の新しいハッシュを生成します。ifnone はキーに対 応する値が存在しない時のデフォルト値です。設定したデフォルト値はHash#defaultで参照できます。
デフォルト値として、毎回同一のオブジェクトifnoneを返します。 それにより、一箇所のデフォルト値の変更が他の値のデフォルト値にも影響します。
````
[http://docs.ruby-lang.org/ja/2.0.0/class/Hash.html](http://docs.ruby-lang.org/ja/2.0.0/class/Hash.html)

Hashにデフォルト値を与えるのは良くないと考えてなかったので、あまり使っていなかったが、気をつけよう。
Haxe+JSでClosure Compilerで圧縮可能なコードを出力するための工夫

前提としてHaxeでは、以下のような文法で構造体 (匿名オブジェクト) を生成することができます。

```haXe:hoge.hx
class Main {
    static function main(){
        var user:Dynamic = {
            name : "Nicolas",
            age : 32
        };
    }
}
```

しかし、この記述方法を使用して出力したjavascriptコードをClosure CompilerのADVANCED_OPTIMIZATIONSで圧縮するとオブジェクトのプロパティがリネームされてしまうため、そのプロパティにクォートされた文字列でアクセスするようなロジックがあると正常に動かなくなります。
このような場合には匿名オブジェクトは使用せず、以下のように記述するとで回避できます。

```haXe:hoge.hx
class Main {
    static function main(){
        var user:Dynamic = { };
        untyped __js__("user['name'] = \"Nicolas\"");
        untyped __js__("user['age'] = 32");
    }
}
```

また、外部から読み込んでJSON形式からパースしたオブジェクトにアクセスする場合にも、以下ののように記述すると「response.result」がリネームされてしまうので、

```haXe:hoge.hx
class Main {
    static function main(){
        var xhr:XMLHttpRequest = new XMLHttpRequest();
        var response:Dynamic = {};
        response = Json.parse(xhr.responseText);
        var result:String = response.result;
    }
}
```

これも

```haXe:hoge.hx
class Main {
    static function main(){
        var xhr:XMLHttpRequest = new XMLHttpRequest();
        var response:Dynamic = {};
        response = Json.parse(xhr.responseText);
        var result:String = untyped __js__("(response['result'] != null) ? response['result'] : null");
    }
}
```

のように記述することでリネームを回避することができます。

js出力したコードを最終的にClosure Compilerで圧縮する際にハマった罠でした。
MySQLの結果を簡単にcsvにする方法


以下のようにやればカンマ区切りで結果がファイルに吐出されます。

```zsh
mysql -u user_name -p -h host_name db_name -e "select * from table_name;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' | sed '1d' > /var/tmp/table_name.csv
````
Redmine / チケットをPDFでダウンロード＆関連チケットと添付ファイルもダウンロード


[前回](http://qiita.com/akiko-pusu/items/e890fe59a9f74d57ff94) の続きです…。
jsonで処理するため、標準的な shell (bash) とは言いながら[jq](http://stedolan.github.io/jq/ "jq")というjsonのパーサを使うことにしました。
### jqを準備する

今回は、RedmineのデータをAPI経由/jsonで取得します。
取って来たjsonをパースするために、jqをここからインストール。

* http://stedolan.github.io/jq

### ダウンロードのshell

* REDMINE_URL / API_KEY / ISSUE_IDS (チケットのID) は環境変数とかで渡すのが前提とします。
* ISSUE_IDS は空白スペースで区切って指定します。
  * (Exp. export ISSUE_IDS="1 2 100")

```
rm -fr *

for ID in ${ISSUE_IDS}
do
   # PDF取得
   wget -nv --content-disposition ${REDMINE_URL}/issues/${ID}.pdf?key=${API_KEY} \
           --output-document=${ID}.pdf
   wait

   # jsonデータ取得
   wget --header="X-Redmine-API-Key:${API_KEY}" --header="Content-Type: application/json" \
            -N -O issue.json ${REDMINE_URL}/issues/${ID}.json?include=attachments,relations
   wait

   # jq を使って添付ファイルのidを抽出
   FILES=`cat issue.json | jq '.issue.attachments[].id'`

   # 添付ファイルをダウンロード
   for FILE in $FILES
   do   
     wget --content-disposition --restrict-file-names=nocontrol \
             --header="X-Redmine-API-Key:${API_KEY}" ${REDMINE_URL}/attachments/download/${FILE}
     wait
   done

   # jq を使って関連チケットのidを抽出
   RELATIONS=`cat issue.json | jq '.issue.relations[].issue_id'`

   # 関連チケットをダウンロード
   for RELATED in $RELATIONS
   do   
     wget -nv --content-disposition ${REDMINE_URL}/issues/${RELATED}.pdf?key=${API_KEY} \
             --output-document=${RELATED}.pdf
     wait
   done
done 
```

### ポイント
* jsonの場合でも、xmlの場合でも同じなのですが、wgetを使って、 **パラメータを複数指定する場合は、認証用のキーの情報をパラメータで渡すと、うまくデータが抽出できません**。（オプションを変えてcurlで実行した場合でも、APIキーとその他のパラメータが同居するとうまくいきません）

* このため、認証用のAPIキーは、HTTP Request Headerの _X-Redmine-API-Key_ をセットしてあげています。
trace出力の有無の切り替え方法(-compiler.omit-trace-statements)

普段はFlashDevlopとかのIDEでコンパイルしていたので気がつかなかったのですが、trace出力の有無ってコンパイラオプションに「-debug=true|false」を追加するだけじゃ切り替えられないんですね。

したがってtrace()が含まれいるコードをコマンドラインでコンパイルする場合は

```text:qiita.text
mxmlc Test.as -omit-trace-statements=true
```

のように「-omit-trace-statements」というオプションにtrueを指定しないとtrace出力がされてしまいます。
逆にデバッグ用にtrace出力を有効にする場合は

```text:qiita.text
mxmlc Test.as -omit-trace-statements=true -debug=true
```

とします。
デバッグ用に本番環境からdumpしたDBのデータをローカルにぶちこむ



下記

```zsh
be rake db:drop
be rake db:create 
mysql -u root hogehoge_development < dump2013xxxx.sql
```
普段は

```zsh
be rake db:drop
be rake db:create 
be rake db:migrate
be rake db:seed
```
とかしてたけど
今回はmigrate seedはしなくてよろし

***
追記
be は bundle exec のエイリアスですね
（OSにインスコしたgemじゃなくて）そのrailsプロジェクトのbundlerでインストールしたgemだけ使いますよ
というアレです

hogehoge_development　→　dbname
dump2013xxxx.sql　→　dump.sql
と書いたほうが一般的らしいですね

@kag_webさんありがとうございました


***
追記２

```zsh
mysql -u root hogehoge_development < dump2013xxxx.sql
```

は

```zsh
mysql -u root DB名 < dumpデータ名
```

なのであしからず。

ついでに
rake db:dropとかは
rubyのオブラートにつつまれたSQL文なのでSQLの動きを理解して使いましょう（お前が言うな感ありますが）
http://www.re-labo.com/hiroro-blog/2009/03/rake-db.html
ここなどをご参考に


---
追記

```zsh

be rake db:drop
be rake db:create 
be rake db:migrate
be rake db:seed

```



は省略できます。



```zsh

be rake db:migrate:reset
be rake db:seed

```

と等価ですね。
AWSで動かしてるサーバのApacheとTomcatのログのタイムスタンプがずれている

AWSに置いてあるアプリケーションサーバのログを監視していたら
ApacheとTomcatのログの時刻が9時間ずれている...
access_logがJSTで、TomcatログがUTCで記録されている模様

### /var/log/httpd/access_log

~~~
xxx.xxx.xxx.xxx - - [14/Nov/2013:15:00:00 +0900] "GET (以下略)
~~~

### log4jで出してるTomcat配下のアプリケーションログ

~~~
2013/11/14 06:00:00 INFO (以下略)
~~~

!!?
ちなみにdateコマンドのlocaleはあってるっぽい

~~~
diff /etc/localtime /usr/share/zoneinfo/Japan 
# なし
~~~

ぬーん。
とりあえずログの時刻がズレてると色々支障があるので設定を追加

### setenv.sh

(Tomcatインストールディレクトリ)/bin/ に setenv.sh を作っておいとく

~~~
CATALINA_OPTS='-Duser.timezone=Asia/Tokyo'
export CATALINA_OPTS
~~~

Tomcatを再起動したら、タイムスタンプが揃ったー
Oracleのstatspack取るだけのシェルスクリプト

#環境

- [CentOS-6.4-x86_64](http://www.centos.org/)

#やること
スナップショットの採取。sqlplus起動してヒアドキュメントでコマンド流し込む。

```bash:createSnapshotOfStatspack.sh
#!/bin/sh
sqlplus perfstat/xxxx << EOF
  execute statspack.snap
  exit
EOF
```

レポートの作成。引数にsnapshot idのbeginとendを渡す。idは、一度下記スクリプトを引数無しで実行すればspreport.sqlがエラーで終了する直前にidのリストを出力されるのでそっから選ぶ。ぶっちゃけ雑仕様。

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

# ./createReportOfStatspack.sh 84 85 -> create sp_84_85.lst
sqlplus perfstat/xxxx << EOF
  @$ORACLE_HOME/rdbms/admin/spreport.sql
  $1
  $2
  sp_$1_$2.lst
  EXIT
EOF
```
CentOS6でのGlustarFSを使ってみる。 

### CentOS6でのGlustarFSを使ってみる。

いまさら感漂いますが、久しぶりにGlustarFSを使ってみたので備忘録。

Glustarのアリンコちゃんも素敵なのでCentOS6で構築してみた。

GlustarFSの詳細は超長くなるので構築手順のまとめだけ…

### 手順
#### クライアント・サーバーすべてにする作業

##### GlustarFSの公式からrpmを拝借

```bash
wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/epel-6.4/x86_64/glusterfs-3.4.1-2.el6.x86_64.rpm

wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/epel-6.4/x86_64/glusterfs-cli-3.4.1-2.el6.x86_64.rpm

wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/epel-6.4/x86_64/glusterfs-fuse-3.4.1-2.el6.x86_64.rpm

wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/epel-6.4/x86_64/glusterfs-libs-3.4.1-2.el6.x86_64.rpm

wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/epel-6.4/x86_64/glusterfs-server-3.4.1-2.el6.x86_64.rpm
```

ほかにもreplecationもあるけど今回は使わない。

##### rpmをインポート

```
rpm -ivh glustarfs-*
```

##### glusterfs を起動

```
service glustarfs start
```

##### fuse で認識させるためカーネルモジュールを追加

```
modprobe fuse
```

#### サーバーサイドでの作業
##### マウント用のディレクトリを各サーバーで用意

```
mkdir /home/vol1
```

#### クライアント側での作業
##### サーバをpeer として台数分登録

```
gluster peer probe サーバー名
```

##### peer の登録確認

```
gluster peer status
```

##### volumeを作る

```
gluster volume create vol1 stripe 2 transport tcp サーバー名:/home/vol1 サーバー名:/home/vol1
```

今回はstripe だが、ミラーリングやらある。意味はRAIDのstriping や mirroringと同じ。

##### volumeを有効にする
```
gluster volume start vol1
```

##### volume 確認

```
gluster volume info all
```

##### マウントする

```
mount -t glusterfs サーバー名:vol1 /mnt/vol1
```

このときのホストはどれでもいい、ボリューム名だけほしいだけだから。 クライアント側にもfsdを立ち上げてるので ｌocalhost:vol1 でも良い

以上！

### おわりに

Qiitaの書き方が良くわかってないゴリラ。うほ。
Markdown の記事を見直そう。


ちなみにノード追加はpeer を追加してbrickを追加するだけ。
Twitter投稿埋め込みの「元のツイートを含める」チェックボックスがバグってた


ので、チェック消しても会話が消えなかった。つらい。

![チェック外してもきえない](http://gyazo.com/8a93ca60bdffb955bad935912c9e6e85.png)

ぐぐって公式チェック。

[埋め込みツイート | Twitter Developers](https://dev.twitter.com/ja/docs/embedded-tweets)

> それぞれのツイートのスレッドを表示したくない場合は、以下のようにdata-conversation属性を使って会話を隠すことができます。
> 
> ```
<blockquote class="twitter-tweet" data-conversation="none">...</blockquote>
```

ということでした。手動でこれをつけたら会話消えた。

なんでバグってるのかなー。
特定のURLの、ツイート数・いいね数を取得するAPI


よく使うのでメモ。

## URLのツイート数

### http://fnobi.com のツイート数を取得

```
http://urls.api.twitter.com/1/urls/count.json?url=http://fnobi.com/
```

### 返り値

```
{"count":1,"url":"http:\/\/fnobi.com\/"}
```
count 1ですかfnobi.com…。


## URLのいいね数

### http://google.com/ のいいね数を取得

```
http://graph.facebook.com/http://google.com/
```

### 返り値

```
{
   "id": "http://google.com/",
   "shares": 7582903,
   "comments": 133525
}
```

※fnobi.comはいいね数ゼロでつらかったので、google.comにしました。
CentOSでrbenv + Rails4 + puma + Nginxを使う

puma, Nginx で Rails4 を動かしていますが、puma の設定や起動スクリプトなどがあまり多く紹介されていなかったので、自分の設定を晒しておきます。
なお、ここでは、Railsは `/home/rails/myapp` にあり、railsユーザというもので動かす想定です。

といっても、基本的には [GitLab](http://gitlab.org/) の [gitlab-recipes](https://github.com/gitlabhq/gitlab-recipes) をベースにしたものを使っているだけ。

# puma.rb

pumaの設定は、gitlab-recipes では、[こちら](https://github.com/gitlabhq/gitlab-recipes/blob/master/app-server/puma/puma.rb) にある。

自分が使っている物も、application_path が違うだけ。以下の通り。

- [Gist: kikumoto/puma.rb](https://gist.github.com/kikumoto/7329027)

これを `/home/rails/myapp/config/puma.rb` において使っている。もちろん、それ以前に Gemfile に

```
gem 'puma'
```
を記載して、`bundle install` はしている。

# puma起動スクリプト

CentOS6を使っているので、gitlab-recipes の[こちら](https://github.com/gitlabhq/gitlab-recipes/blob/master/init/sysvinit/centos/gitlab-puma) を参考にしている。

gitlab では puma 以外に sidekiq というサービスも起動するようになっているのでそれを削って、かつ rbenv を利用するようにして使っている。

- [Gist: kikumoto/init_puma_myapp](https://gist.github.com/kikumoto/7329032)

これを `/etc/init.d/myapp` のように保存して、

```
# chkconfig --add myapp
# /etc/init.d/myapp start
```

のようにしている。

# Nginx設定

gitlab-recipes には[こちら](https://github.com/gitlabhq/gitlab-recipes/blob/master/web-server/nginx/gitlab-ssl) に Nginxの設定例がある。

今の自分の環境は SSL 不要なので、

- [Gist: kikumoto/nginx_puma_myapp.conf](https://gist.github.com/kikumoto/7329037)

のような設定を使っている。

以上、参考にされば幸いです。
ツッコミ、間違いなどあれば是非コメントいただけると助かります。
Chefでsupervisorのレシピを適用する時、デフォルトのreloadは全てのプロセスを再起動してしまうので注意

※ fluentd自体は問題ではありません。が、supervisorを使って複数のプロセスを管理していると起こりえる問題です。

Chefを使ったProvisioningで初回の起動時にsupervisorで動かしているfluentdのプロセスが多重起動してしまう事があったのでメモ。

## 起こった現象

###以前のレシピ

```rb:site-cookbooks/supervisord/recipes/default.rb
template "supervisord.conf" do
    path "/etc/supervisord.conf"
    source "supervisord.conf.erb"
    owner "root"
    group "root"
    mode "0644"
end

service "supervisord" do
    supports :status => true, :restart => true, :reload => true
    action [ :enable, :start ]
    subscribes :reload, "template[supervisord.conf]"
end
```

上記レシピでは最初の起動時にsupervisorがstartした直後（fluentdが起動し終わる前に）reloadが実行されfluentdが多重起動してしまいます。

## このように対応しました

- reload_commandを定義してデフォルトのreloadでなくsupervisorctl updateを使うようにしました。

###変更後のレシピ

```rb:site-cookbooks/supervisord/recipes/default.rb
template "supervisord.conf" do
    path "/etc/supervisord.conf"
    source "supervisord.conf.erb"
    owner "root"
    group "root"
    mode "0644"
    notifies :reload, "service[supervisord]", :delayed
end

service "supervisord" do
    supports :status => true, :restart => false, :reload => true
    reload_command "supervisorctl update"
    action [:enable, :start]
end
```

/etc/init.d/supervisordのuploadでなくsupervisorctl updateが実行するようになるので、fluentdのプロセスが多重に起動されることはなくなりました。

## /etc/init.d/supervisordのuploadとsupervisorctl updateにはどういう違いがあるのか？

/etc/init.d/supervisordのuploadはHUPのシグナルを送っているようです。

```bash:/etc/init.d/supervisord
reload()
{
        echo -n $"Reloading $prog: "
        if [ -n "`pidfileofproc $SUPERVISORD`" ] ; then
            killproc $SUPERVISORD -HUP
        else
            # Fails if the pid file does not exist BEFORE the reload
            failure $"Reloading $prog"
        fi
        sleep 1
        if [ ! -e $PID_FILE ] ; then
            # Fails if the pid file does not exist AFTER the reload
            failure $"Reloading $prog"
        fi
        RETVAL=$?
        echo
}
```

HUPのシグナルを送ると、supervisorはプロセスを全てリスタートしてしまうようです。

http://supervisord.org/running.html

>SIGHUP
>supervisord will stop all processes, reload the configuration from the first config file it finds, and restart all processes.

プロセスが多重に起動してしまうのはreloadによるプロセスの再起動が原因だったようです。

###supervisorctl update

supervisorctl updateというコマンドを使えば、変更があった設定のプロセスだけ再起動されるので、start直後の設定の変更がないので状態ではreloadは無視されるのでプロセスが再起動されることはありません。

http://www.onurguzel.com/supervisord-restarting-and-reloading/

>This command only updates the changes. It does not restart any of the managed applications, even if their configuration has changed. New application configurations cannot be started, neither. (See the “update” command below)
>
>supervisorctl update


## まとめ

- chefのserviceリソースで supervisord を使う場合、デフォルトのreloadが実行された場合全てのプロセスを再起動されます。
- supervisordの初回起動時にはstartの直後にreloadが実行されるのでプロセスが多重起動されてしまう場合もあるかもしれません。
- そこでデフォルト（/etc/init.d/supervisord）のreloadでプロセスが再起動しないようにreload_commandで上書きして設定に変更のあったものだけ再起動するようupdateを使うようにして対応しました。


他に解決方法などあったら教えてください。よろしくお願いします。


以上
モダンブラウザとIE8を含めてvideoに対応したい場合

http://v4e.thewikies.com/
でフォールバックコードをジェネレートすると良いのでは無いでしょうか。
flashでできたmp4のプレイヤーを差し込めば良いということなので、カスタマイズも楽な印象です。

http://html5media.info/
も良さそうでしたが、柔軟性を考えると上かな？どうしてもobjectタグを書きたくないならこちらですが、実際には同様にflashのプレイヤーが再生される様子。

またflashのプレイヤーの場合、幅高さがvideoタグと同様のcssでは動かないでしょう。ここはwidthとheightの属性をresizeイベント等をトリガーに変更すれば大抵のプレイヤーでは大丈夫なのでは無いでしょうか。
SOCKS5プロキシ環境でvagrant-awsを使う

SOCKS5プロキシを利用したSSH接続についてはこちら：[SOCKS5プロキシを利用したSSH接続 - Qiita [キータ]](http://qiita.com/mechamogera/items/ac06f6363f99d674af63)
SOCKS5プロキシごしにsshするためにVagrantfileで以下のようにproxy_commandを指定する

```rb
...
Vagrant.configure("2") do |config|
  ...
  config.vm.provider :aws do |aws, override|
    aws.access_key_id = ...
 
    override.ssh.username = "ec2-user"
    override.ssh.private_key_path = "~/test.pem"
    override.ssh.proxy_command = "[connectコマンドのパス] -S [SOCKS5プロキシサーバー]:[SOCKS5プロキシポート] %h %p"
  end
  ...
end
...
```
SOCKS5プロキシを利用したSSH接続

 * コマンドラインでssh

```bash
ssh -o ProxyCommand="[connectコマンドのパス] -S [SOCKS5プロキシサーバー]:[SOCKS5プロキシポート] %h %p" [sshのターゲットサーバ]
```
* .ssh/configで設定

```bash
Host  [sshのターゲットサーバ]
  ProxyCommand [connectコマンドのパス] -S　[SOCKS5プロキシサーバ]:[SOCKS5プロキシポート] %h %p
```

## 認証情報の設定
 SOCKS5プロキシで認証情報を設定する場合以下のような方法がある
なお、ユーザだけ設定した場合はssh実行時にパスワードの入力を求められる

### 設定方法1：環境変数
 * 以下の環境変数を設定
  * SOCKS5_USER：[ユーザ名]
  * SOCKS5_PASSWD：[パスワード]

### 設定方法2：.connectrc設定
 * ~/.connectrcを作成しに以下のように記述する

```bash
SOCKS5_USER=[ユーザ名]
SOCKS5_PASSWD=[パスワード]
```

### 設定方法3：.ssh/config設定

* .ssh/configで以下のように設定

```bash
Host target.server
  ProxyCommand [connectコマンドのパス] -S [ユーザ名]@[SOCKS5プロキシサーバ]:[SOCKS5プロキシポート] %h %p
```

## connectコマンドインストール
### ubuntu
```bash
apt-get install connect-proxy
```

### centos
 1. RPMForge導入
  * [AdditionalResources/Repositories/RPMForge - CentOS Wik](http://wiki.centos.org/AdditionalResources/Repositories/RPMForge)
  * [RPMforgeリポジトリ導入(RPMforge) - CentOSで自宅サーバー構築](http://centossrv.com/rpmforge.shtml)
 1. yumでインストール

```bash
yum installl connect
```
Play2.2をherokuで動かした時にはまったポイント

○起動スクリプトのパスが変わっている

https://devcenter.heroku.com/articles/play-support
に詳しく書かれていますが、Procfileに記述する内容が2.0.x～2.1.xと、2.2.xでは変わっていました。

2.2.x：
web: target/universal/stage/bin/{your project name} -Dhttp.port=$PORT

日本語ドキュメントは2.1.xベースなので、日本語ドキュメント読んでやろうとしていたらはまりました。


○New Relic(add-on)が動かない
New Relicのページに書かれているやり方の通りにやってもうまく動きませんでした（agentが起動せず、データが転送されない）

結論としては、以下のようにして解決しました。

・プロジェクトのルートディレクトリ直下にlibディレクトリを作って、newrelicの各種ファイルをその中に移動
　libディレクトリ内のファイルは自動でclasspathに追加されます。
　参考：http://www.playframework.com/documentation/2.2.0/SBTDependencies
　別のディレクトリにおいて明示的に指定することもできるかもですが、それは試していません。

・newrelic.ymlだけは、プロジェクトのルートディレクトリ直下に移動

・Procfileに記述する起動コマンドに、
　-J-javaagent:lib/newrelic.jar
　を追加
　play2.2では、JAVA_OPTSに書いてもダメなようです。
　参考：http://stackoverflow.com/questions/19070748/java-play-2-2-doesnt-support-javaagent
--rbindでマウントしたディレクトリをアンマウント

chroot環境に入る前におなじみの

```
# export CHROOT=/mnt/chroot
# mount -t proc none ${CHROOT}/proc
# mount --rbind /dev ${CHROOT}/dev
# mount --rbind /sys ${CHROOT}/sys
# chroot ${CHROOT} /bin/bash
```

ですが，chroot環境から出て

```
# umount ${CHROOT}/sys
umount: /mnt/chroot/sys: target is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))
```

となる原因と解決案がようやくわかった．

rbindはrecursive bind，なのでディレクトリを再帰的にマウントしてるんですね．
/proc/mountsを見るとわかるとおり，
/sysの下の/sys/kernelや/sys/fsもマウントしてるのでアンマウントできない．
なので

```
# awk '{print $2}' /proc/mounts | grep ${CHROOT} |  sort -r | xargs umount
```

すれば階層の深い順にアンマウントされる．
tmux の水平線が多バイト文字にならないように patch を当てて brew で入れる



#おかしくなる

tmux の水平線が多バイトもじになっていて iterm2 で表示がおかしくなる。

![border-1.png](https://qiita-image-store.s3.amazonaws.com/0/2528/2d1ce680-a276-5b6b-495b-c8dc35289c7a.png "border-1.png")

#patch がある

水平線をハイフンにする patch が https://github.com/silenvx/PKGBUILD/blob/master/tmux/borders.patch  にある。

#bew で入れたい
brew の formula にパッチの設定をします。

##場所

formula は ```/usr/local/Library/Formula/tmux.rb``` にあった。

##patches メソッドを変更する

これを

``` ruby
  def patches
    # Fixes installation failure on Snow Leopard
    # http://sourceforge.net/mailarchive/forum.php?thread_name=CAJfQvvc2QDU%3DtXWb-sc-NK0J8cgnDRMDod6CNKO1uYqu%3DY5CXg%40mail.gmail.com&forum_name=tmux-users
    # http://sourceforge.net/p/tmux/tickets/41/
    # Fixes abnormal displaying Korean letters on Mac OS X
    # https://gist.github.com/niceview/5343842
    # Accepted upstream, can be removed in next version.

    DATA unless build.head?
  end
```

こうした。

``` ruby
  def patches
    # Fixes installation failure on Snow Leopard
    # http://sourceforge.net/mailarchive/forum.php?thread_name=CAJfQvvc2QDU%3DtXWb-sc-NK0J8cgnDRMDod6CNKO1uYqu%3DY5CXg%40mail.gmail.com&forum_name=tmux-users
    # http://sourceforge.net/p/tmux/tickets/41/
    # Fixes abnormal displaying Korean letters on Mac OS X
    # https://gist.github.com/niceview/5343842
    # Accepted upstream, can be removed in next version.

    if build.head?
      'https://raw.github.com/kminiatures/PKGBUILD/master/tmux/borders.patch'
    else
      DATA 
    end
  end
```

```DATA``` はなにかと思ったら、ファイルの中の ```__END__``` 以下が File オブジェクトになるとのこと。
--HEAD でインストールするときには、水平線変更 patch があたるようにした。

#インストール
まず ```brew uninstall tmux``` で削除してから、
```brew install --HEAD tmux``` で入れる。
開発版にパッチがあたってインストールされる。

水平線がハイフンになった。

![hosoi.png](https://qiita-image-store.s3.amazonaws.com/0/2528/3e8c8b72-2bd7-d9c2-6827-629de4aab605.png "hosoi.png")