OmniAICreator/Qiita-1.07M huggingface dataset:
実はテスト駆動開発ってしっくりこないんです

内容はあくまで私の主観です。いつも通りコメントは大歓迎ですが、長文であれば別途投稿してもらえたほうが有益だと思います。

# 自分のスタンス

- 自動テストは素晴らしい。どんどん利用していくべき。
- テスト駆動開発の主張に同意できない。

# TDDの何がしっくりこないか

## TDDの主張がしっくりこない

TDDの肝は「テストを先に書くことで思考をクリアにし、実装を早くする」「Red-Green-Refactoringの繰り返し（以下、TDDのサイクル）というガイドを用意することで開発者を安心させる」だと思っている。

まず一つめが納得いかない。世の中のプログラマは本当にテストが無いと行き当たりばったりで全く保守できないような実装をしてしまうのだろうか。少なくとも私はテストの有無に依らずそれなりの設計をする自信がある。
最初にテストがあれば「テストしやすいコードを強制させる」ことができるのはまあ正しいだろう。しかしテストを書くことが念頭にあれば実装コードは自然とそうなるし、むしろテストを書く時点で実装側の良い設計を想像するほうがよほど難しい。

次に、「テストしにくいコードがある」にもかかわらず、TDDのサイクルを強制するのが気に食わない。
あなたの作ったプロダクトを顧客に見せたら「この部分に会社のロゴを入れてくれ」と言われた。あなたはこれに対してどのようなテストを書くのだろうか。
おそらくあなたはテストを書かない。「これはリソースの変更だから」「ロジックに変更は無いから」などと言い訳する。あなた変更後アプリを実行し、確かにロゴが表示されていると確認する。これは自動テストを書く代わりに手動テストを行ったことに他ならない。ロゴが表示されていることをテストすることは可能だ。「そんな修正にテストを書くのは割に合わない」という本音を「リソース修正だから」などという建前で覆い隠しているだけだ。
どのような修正でもテストは必要だ。しかし自動テストがコストに見合うかは場合による。全ての修正に対しテストを書くことは現実的ではない。
TDDを行ったとは何なのか。「私のコードは行数にして80%をTDDしました」とでもいうつもりなのか。


## 周りのTDDerのやってることがしっくりこない

DHHもそうだが、「遅いテスト」を書いてTDDを名乗るのはやめてほしい。遅いテストによるTDDは「コミットのたびに上長の許可が必要なSubversionを使う」のと同等だ。
TDDのテストは開発者を安心させるための支えだ。本当であれば1行変更するたびにでもテストを実行して「自分の行動が間違っていない」ことを振り返りたいのだ。しかしテストが遅いと常に安心していたいのが、5分に一度の安心になり、1時間に一度、1日に一度と安心できるタイミングがどんどん減っていく。
「コミットのたびに上長の許可が必要なSubversion」はどう運用されるか。私であればリリースビルドのときだけまとめてSVNにコミットするようにするだろう。自動テストが遅いからこそJenkinsなどで夜間にテストを回すのだ。開発者は次の朝まで安心できない。

# さいごに

TDDに関して話していると、どうにも「自動テストの良さ」でありTDDでなくても恩恵を得られるものを褒め称えている人が多いように感じる。
本当にテスト駆動開発はよいものなのだろうか。
XCodeのNSLogが文字化けしてしまう件について

ここを見たけど、Product > Scheme > Edit Scheme > infoタブ
からdebuggerの選択肢にGDBが存在しなかった。 
http://seesaawiki.jp/makeapp/d/NSLog%A4%CE%CA%B8%BB%FA%B2%BD%A4%B1%A4%F2%C4%BE%A4%B9

配列の場合だとこういうのもあるみたいだけど今回は必要なさそう
http://qiita.com/yusuga_/items/85437eba2623f6ffbdbd

また今度調べる。
PDFのクリック（ダウンロード）をユニバーサルアナリティクス上で仮想ページビューとしてプロットさせる

sendpdfpv
=========

Send UA root relative pathname

PDFのクリック（ダウンロード）をユニバーサルアナリティクス上でページビュー（仮想ページビュー）としてプロットさせる。

# １．サンプルファイル
githubからcloneしてください。
https://github.com/yoshijima/sendpdfpv.git

```samplefileの構成
sendpdfpv ┬ js/ ─ uatracking.js
          │       (require jQuery)
          ├ index.html
          │ (main File)
          ├ sampledir/
          │ (include Sample PDF File)
          └ sample1.pdf
            (Sample PDF File)
```

# ２．初期設定
Universal Analyticsのタグの場合と、Google Tag Managerのタグの場合ではIDの設定のしかたが異なるので、各々のタグの設定をしてください。
uatracking.jsは、Universal Analyticsの関数を利用しているので、Google Tag Managerを利用するときには、「タグの種類」の選択で、「アナリティクス」>「ユニバーサルアナリティクス」を設定してください。
1. タグの設定(sendpdfpv/index.html)
2. sendpdfpvディレクトリをDocumentRootとかに配置して。
3. 対象とするPDFの\<a>タグにclass="gaPv"を設定する。

#３．解説

```
ga('send', 'pageview', {'page', ルート相対パス});
```
で、PDFのクリックをUniversal Analyticsにプロットすることができるので、"uatracking.js"内では、class="gaPv"のある\<a>タグから、ルート相対パスを取得して、上述のga()関数にルート相対パスを渡すことをしています。

```
<a href="sample1.pdf" target="_blank" class="gaPv">sample1.pdf</a>
```

uatracking.jsは、テスト用にconsole.log()していますが、本番ではこれをコメントアウトする必要があります。

#４．注意事項
* 同じドメイン内での処理しか対応していません。外部サイトのクリック数については、Webサイトの解析方針にもよると思うのですが、PVで処理するかイベントで処理するか検討してください。
* PDFだけでなく、mpgやwmvとかのダウンロード数の計測にも使うことができますが、これも動画のクリックをどのようにして解析するかの方針によると思います。
JUnit TestCase を用いたprojectの場合 WTP で NoClassDefFoundErrorが発生する場合の対処

+ $project名
    + プロパティ
        + Javaのビルドパス
            + ソース

の src/test/java, src/test/resource の除外の設定を \**/* を追加する。

![SnapCrab_NoName_2014-5-7_10-47-37_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/26292/e6090a2e-54a0-2cec-386f-db69570bb8ba.jpeg)

　
それ以外

デプロイメント・アセンブリーから削除

+ $project名
    + プロパティ
        + デプロイメント・アセンブリー

赤枠の部分を除去する。

![SnapCrab_NoName_2014-5-7_17-1-42_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/26292/59c7cf90-cada-8605-a40d-9d44d4710027.jpeg)
シェルで文字数を数える（あるいは、Rubyにおけるシェル芸）

文字数、単純に数えようとすると

```bash
$ echo '隣の客はよく柿食う客だ' | wc -c
      34
```

バイト数になる。半角全角入り乱れたりするとよくわからなくなる。

Rubyという便利なコマンドを挟んでみる。

```bash
$ echo '隣の客はよく柿食う客だ' | ruby -pe 'gsub /./, "\\\\０ "' | wc -w
      11
```

良さそう。

```bash
$ ruby \
    -p \ # 標準入力を一行ずつ回して、結果をプリントする(sed風)
    -e \ # 後ろに伴うスクリプトを実行する
    'gsub /./, "\\\\０ "'
    # Kernel#gsub は、一行ずつ回した内容に対してString#gsubを実行するメソッド。
    # マルチバイトに対応しつつ一文字ごとに半角スペースを挿入する
```

#### 注意

http://qiita.com/udzura/items/3f141ee674cd5e619ae0#comment-64fee1ff14f7cfdec77b の影響で、「\\\\0」の「0」を全角に直しています

## 追記

シェル芸関係者に捕捉され、補足されました。

https://twitter.com/usptomo/status/463863850815594496

```bash
$ echo -n '隣の客はよく柿食う客だ' | wc -m
```

これはスマートですが、やり方は色々あるというお言葉も頂戴したので各位頑張りましょう!!!!
LPC1768のメモリ管理とスキャッタファイル

mbedLPC1768のBlinkyをExportし、MDK-ARMに取り込んで秋月のLPC1768ボードで実験しました。
かなり怪しいので、例によって「眉唾」でお願いします。

http://nora66.com/mbed/mbed-src.html#2014/05/07mem


「ここ違うよ」とか「これはこう」とか教えてくださいませ。
なにせARMは初めてなので分からないことばっかりでして。
よろしくお願いします。
Rails 4.2 写経用サンプルアプリ


**環境**
- Rails 4.2.0

**サンプル**
- https://github.com/usutani/store_rails420


~~[（参考）RAILS 4.0の変更点を、サンプルアプリケーションを作りながら確認する。](http://yukihariguchi.com/rails4-changes/)~~ リンク切れのようです。

# 製品一覧

製品の足場を作成、製品は名称と価格を持つ。

```bash
rails _4.2.0_ new store
cd store
rails g scaffold product name price:integer
rake db:migrate
```

ルートのルーティングを製品一覧に設定する。

```config/routes.rb
root 'products#index'
```

コントローラーなどの確認。製品を新規作成、編集する。

```bash
view app/controllers/products_controller.rb
view app/views/products/index.json.jbuilder
rails s
```

製品にリリース日を追加する。

```
rails g migration add_released_on_to_products released_on:date
rake db:migrate
rails s
```

ビューにリリース日を追加してもStrongParametersにより保存されない。
scaffold_controllerで衝突するファイルの差分を確認する。

```bash
rails g scaffold_controller product name price:integer released_on:date
```

# 製品名で検索

名前が部分一致した製品を表示する。

```app/models/search_form.rb
class SearchForm
  include ActiveModel::Model

  attr_accessor :q
end
```

検索フォームを追加する。

```app/views/products/index.html.erb
<%= form_for @search_form, url: products_path, html: { method: :get } do |f| %>
  <%= f.search_field :q %>
  <%= f.submit '検索' %>
<% end %>

<h1>Listing products</h1>
```

```app/controllers/products_controller.rb 
class ProductsController < ApplicationController
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  # GET /products
  # GET /products.json
  def index
    @search_form = SearchForm.new params[:search_form]
    @products = Product.all
    if @search_form.q.present?
      @products = @products.named @search_form.q
    end
  end
```

```app/models/product.rb
class Product < ActiveRecord::Base
  scope :named, ->(q) { where 'name like ?', "%#{q}%" }
end
```

# 検索をAjax化

全製品がテーブルで用意されている画面について、検索結果を受けて、項目行を表示／非表示する。

検索条件を入力、製品一覧を Ajax 呼び出し、JSONフォーマットで結果を取得、該当する製品を表示する。
まず、content_tag_for を用いて ```<tr>``` に ID を追加し、項目行を指定可能にする。

```app/views/products/index.html.erb
  <tbody>
    <%= content_tag_for :tr, @products do |product| %>
      <td><%= product.name %></td>
      <td><%= product.price %></td>
      <td><%= product.released_on %></td>
      <td><%= link_to 'Show', product %></td>
      <td><%= link_to 'Edit', edit_product_path(product) %></td>
      <td><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    <% end %>
  </tbody>
```

Ajax化した検索に成功した場合、検索結果（引数 products）に含まれる ID だけを表示する。

```app/assets/javascripts/products.coffee
ready = ->
  $('#new_search_form').on 'ajax:success', (event, products, status) ->
    $('tr.product').hide()
    ids = (products.map (p) -> "#product_#{p.id}").join(',')
    $(ids).show()

$(document).ready(ready)
$(document).on('page:load', ready)
```

検索結果（JSONフォーマットで呼ばれた場合）として、product の ID を返す。

```app/views/products/index.json.jbuilder
json.array!(@products) do |product|
  json.extract! product, :id
end
```

Ajax を用いて製品一覧を検索する。（ ```/products.json``` にアクセス）

```app/views/products/index.html.erb
<%= form_for @search_form, url: products_path(format: :json), html: { method: :get }, remote: true do |f| %>
```

（参考）rails consoleで ```app.products_path(format: :json)``` と入力すると、展開されたパスを確認できる。
Estimote Beacon をリバースエンジニアリング

![](http://f.st-hatena.com/images/fotolife/s/shu223/20140131/20140131172037.jpg)


Estimote のビーコン、先月の SDK アップデートでついに [温度センサと加速度センサをサポート](http://d.hatena.ne.jp/shu223/20140406/1396754855) したのが記憶に新しいところですが、その数ヶ月前に、Estimote のビーコンを分解したり、 **Core Bluetooth フレームワークのメソッドを Method Swizzling したり class-dump したり** してアドバタイズメント・パケットの内訳や内部実装を解析した海外記事がありました。


下記記事でその内容をかいつまんで紹介しています。


http://d.hatena.ne.jp/shu223/20140131/1391155397


結局のところ、この解析により割り出したアドバタイズメント・パケットには「加速度センサや温度センサのデータ」は入ってなかった（※当時のファームウェア）のですが、 **ソースが公開されていないSDK／フレームワーク／ライブラリの解析** ってこうやってやるのかーという点で非常に勉強になりました。


##関連記事

- [【iBeacon】Estimote iOS SDKがついに（やっと）温度センサと加速度センサをサポート](http://d.hatena.ne.jp/shu223/20140406/1396754855)
- [【MFi取得済】kontakt.io のビーコンモジュールについての調査](http://d.hatena.ne.jp/shu223/20140304/1393908483)
iPhone4sだけで起きているバグ追跡中

電車からなので詳細も書けずチラ裏と思っていただきたい。
cocos2d-xで物理アクションゲームを開発してたところ、気づいたらiPhone4sでだけSetNextSheneでフリーズ。他の物理を扱っているプロジェクトでは発生しないので、何が原因なのか帰ったら調べるよ。

またバグか滞るなぁ

追記：
えー、単純に

director->runWithScene(ここでシーン生成);

という構文で戻り値が正しく返ってなかったために起きていました。64bit版だとコンパイラの違いで自動でthisを返すようになっていて動いてたのかな。エラーで良いよもう。
pingが通ったらベルを鳴らす

ネットワークのテストだったり、リモートサーバを再起動させたときに、pingの結果を目で確認するのではなく、BEEPで確認できると楽だったりします。

確認はLinux(Ubuntu)で行いました。Unix全般でできるはずです。

### やり方

```bash
$ ping 192.168.100.100 | tr : ^G
```
`^G`の入力方法は Ctrl-V のあとに Ctrl-G を押します。


### 説明
pingが通ったとき

```bash
$ ping 192.168.100.100
PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data.
64 bytes from 192.168.100.100: icmp_req=1 ttl=64 time=3.74 ms
64 bytes from 192.168.100.100: icmp_req=2 ttl=64 time=1.40 ms
```

pingが通らなかったとき

```bash
$ ping 192.168.100.100
PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data.
From 192.168.100.101 icmp_seq=1 Destination Host Unreachable
From 192.168.100.101 icmp_seq=2 Destination Host Unreachable
```

なので、`:`を`^G`に置換すればベルが鳴ります。
windows7でスタートアップ修復を無効にする

[technet](http://blogs.technet.com/b/askcorejp/archive/2013/06/07/3577292.aspx)に載っていた。

* 検証はできていません。


# 設定確認

```bash:確認
> bcdedit | find "recoveryenabled"
recoveryenabled        Yes
```

# 有効、無効を切り替え

```bash:無効にする
> bcdedit /set {current} recoveryenabled No
```

```bash:有効にする
> bcdedit /set {current} recoveryenabled Yes
```
4088QSB+ULINK2使用時の注意

ハッキリしないけど、どうもこんな風です。

１：4088QSBのprintfは、USBシリアルとHDK UART0(p42)の両方に出てる。ただしULINK2を繋ぐとUART0だけに出る。
　つまり4088QSB＋ULINK2でのprintfではUART0(p42)を使えってことかも。

２：PCが4088QSBをドライブとして認識するのを待ってからフラッシュ焼きをしないと失敗することがある。
　待つのがじれったいアナタとワタシは、ボード右下のHDK enable jumperを外すと良いみたい。
gem moduleにrbenvでインストールしたgemを使おうとしたらハマった

Ansible 1.4から`gem`モジュールに`executable`オプションが追加されて、`gem`のパスを指定できるようになっています。
しかし`rbenv`を使ってインストールした`gem`のパスを指定するだけだと、playbook実行時にはインストールされたかのように見えるけれども、インストールしたものをコマンドラインで実行しようとしたらパスが通ってないという事態に遭遇しました。

実は`gem`モジュールはデフォルトだと`user_install`オプションが`True`になっていたために、`gem install`時に`--user-intall`オプションが追加されて、`~/.rbenv/`以下ではなく`~/.gem/`以下にインストールされていたというオチでした。

`user_install`を`False`に設定したら`~/.rbenv/`以下にインストールされるようになりました。

```yml:site.yml
- name: gem install bundler
  gem: name=bundler executable=.rbenv/shims/gem user_install=False
```
protected, privateをわかりやすく、かつ楽に

個人的に見ることの多いRubyのソースに、次のようなものが多いです。

```rb
def methodA
  ...
end

protected

def methodB
  ...
end

private

def methodC
  ...
end
```

確かに僕も書くならまあこうするっちゃします。でもやっぱりprotectedなメソッドが増えて、privateなメソッドも増えたりすれば今見ているメソッドのアクセス権もわからなければ、privateなメソッドを追加したいときにどこに追加したらいいのかわからないこともあります。

そしてこの問題の解決策の1つとしてネット上でよく見るものに次のようなものがあります。

```rb
def methodA
  ...
end

protected
  def methodB
    ...
  end

private
  def methodC
    ...
  end
```

確かにインデントのレベルを変えれば少なくともpublicなメソッドでないことが分かります。もしprivateをすべてprotectedに置き換えてしまえ！なんてプロジェクトだったらもうすぐに判別がつきますね。

ただこの場合、クラス定義全体を見るとこのようになります。

```rb
class Klass
  def methodA
    ...
  end

  protected
    def methodB
      ...
    end

  private
    def methodC
      ...
    end
end
```

そう、最後の連続のendのインデントが奇妙になるのです。まぁこの辺は慣れればなんてことないのかもしれません…(ちなみにprotected, privateの次の行からbegin...endで囲んでendのインデントを合わせる方法もありました)。

ただ、個人的に「おややっ」となるのがクラスメソッドですね。 **privateという記述より後に書こうがprivateメソッドにならない** のです。これ知らなかったときはハマりました。

どうすればいいかと言えば

```rb
def self.class_methodA
  ...
end
private_class_method :class_methodA
```

とするか

```rb
class << self # この行は instance_eval do でも(ほぼ?)同じことが可能
  private
  def class_methodA
    ...
  end
end

# ちなみにこの手法の場合はprotectedなメソッドもprivateと同様に定義可能
# 上の手法だとprivateなメソッドのみ定義可能
```

とするか、だと思います。

インスタンスメソッド定義とまとめて書けば、
(個人的にメソッドはいつも、アクセス権ごとに分けてクラスメソッドから順に定義してるのでそれに従って書きます)

```rb
class Klass
  def self.class_methodA
    ...
  end

  def methodA
    ...
  end

  protected

  def methodB
    ...
  end

  private

  def self.class_methodB
    ...
  end
  private_class_method :class_methodB

  def methodC
    ...
  end
end
```

もしくは

```rb
class Klass
  # もはやアクセス権ごとに分けるルールが適用できない(今回の件では全く重要ではないけど)
  class << self
    def class_methodA
      ...
    end

    private

    def class_methodB
      ...
    end
  end


  def methodA
    ...
  end

  protected

  def methodB
    ...
  end

  private

  def methodC
    ...
  end
end
```

という風になります(インデントレベルを変えるパターンは省略します)。
非常に面倒くさいですね！

僕の理想は次のコードです。

```rb
class Klass
  def self.class_methodA
    ...
  end

  def methodA
  end

  protected do
    def methodB
      ...
    end
  end

  private do
    def self.methodB
      ...
    end

    def methodC
      ...
    end
  end
end
```

ということで理想通りに書けるようなモジュールを書きました([Gist](https://gist.github.com/warotasan/5221234d291cc98b0470))。テストは書いてませんが…。
クラス内でincludeすれば上記のように書けます。

さて、最後ですが皆さんこの辺どうしてますか。むしろテストまで書かれた同じようなモジュールやライブラリ、もしくは別の解決策となるモジュールやライブラリがあるのでしょうか。何かいい案があればご教授下さい。
C言語のスタブ生成ツールを作ってみた

C言語のレガシーコードに対してテストを追加するときに、大量のスタブを作るのが面倒だったので、自動生成するツールを作ってみました。

# インストール
``` shell
$ gem install cstub
```

# 使い方

例として次のようなコードのスタブを作ります。

``` my_dependency.h
typedef int MY_INT;

typedef enum {
  ERROR_NONE,
  ERROR_PARAMETER,
} ERROR_CODE;

extern int depend_function(int);
extern MY_INT depend_function2(volatile unsigned  int  a, int b, int c);
extern ERROR_CODE depend_function3(int);
```

``` my_product_code.c
#include "my_dependency.h"

ERROR_CODE hello(int a)
{
  int b = depend_function(a);
  MY_INT c = depend_function2(b, 1, 2);
  return depend_function3(c);
}
```

#
`my_product_code.c`のリンクが通るようにするには、`depend_function()`と`depend_function2()`と`depend_function3()`のスタブが必要です。
これを確かめるには一旦コンパイル&リンクして`nm`で確かめるのが早いでしょう。

``` shell
$ arm-none-eabi-gcc -c my_product_code.c -o　my_product_code.o
$ arm-none-eabi-nm -u my_product_code.o > filter.txt
$ cat filter.txt
         U depend_function
         U depend_function2
         U depend_function3
```

`my_product_code.c`と`filter.txt`を元にスタブを生成することができます。

```shell
$ cstub my_product_code.c --filter filter.txt --cpp "arm-none-eabi-gcc -P -E" -D__extension__
int depend_function(int par0)
{
    return 0;
}
MY_INT depend_function2(volatile unsigned int a, int b, int c)
{
    return 0;
}
ERROR_CODE depend_function3(int par0)
{
    return ERROR_NONE;
}
```

# 注意点
コンパイラの拡張でparseが失敗することがあるので、その場合は拡張を無効にするようなマクロを定義してやってください。上の例だと"`-D__extension__`"がそれに当たります。

# その他
C言語のモックフレームワークはいろいろありますが、単に空処理の関数が欲しい時は、こういうので十分かと思いました。

# ソース
https://github.com/kunigaku/cstub
Sublime Text3で、Javaをビルド→実行する方法


参考URL
http://hyperneetprogrammer.hatenablog.com/entry/2013/12/12/204452

http://mac.liveinamerica.jp/macのターミナルでjavaが文字化け/

上記サイトを参考にさせていただきました。

sublime text3を起動してから、

上部メニューバーから、
`Tools → Build System → New Build System...`を選択して新しいファイルを作成します。


```sublime:JavaC.sublime-build
{
    "cmd": ["javac -J-Dfile.encoding=UTF-8 $file_name && java -Dfile.encoding=UTF-8 $file_base_name"],
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "path": "/usr/bin/",
    "selector": "source.java",
    "shell": true
}
```

新しいファイルの中を、上記のように記載して`JavaC.sublime-build`の名前をつけて、
`Packages/User/`の中に保存をします。

すると、Sublime Text3のメニューバーの、
`Tools → Build System`の一番下のところに`javaC`が増えていると思いますので、選択して下さい。

これで、javaファイルを編集しているときに`command+b`を押したらビルド後、下部に実行結果の表示がされます。
SSHで接続可能なDocker用のCentOSイメージをPackerで生成する


Dockerを使用する際、コンテナの状況を確認するのに、SSH経由で接続できると便利ですが、`openssh-server`のインストールや設定、`sshd_config`の変更等を行う必要があります。

下記は、SSHログイン可能なDockerイメージを[Packer](http://www.packer.io/)で生成する設定です。

```json:docker.json
{
  "builders": [
    {
      "name": "centos6-docker",
      "type": "docker",
      "image": "centos",
      "export_path": "centos6-docker.tar"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "yum -y update",
        "yum install -y openssh-server",
        "echo 'root:PASSWORD' | chpasswd",
        "ssh-keygen -q -N '' -t dsa -f /etc/ssh/ssh_host_dsa_key",
        "ssh-keygen -q -N '' -t rsa -f /etc/ssh/ssh_host_rsa_key",
        "sed -i 's/UsePAM.*/UsePAM no/g' /etc/ssh/sshd_config",
        "sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config"
      ]
    }
  ],
  "post-processors": [
    {
      "type": "docker-import",
      "repository": "centos6",
      "tag": "latest",
      "only": [
        "centos6-docker"
      ]
    }
  ]
}
```

上記では、rootログインをPASSWORDで許可しています。鍵等を使用する場合には、別途[File Provisioner](http://www.packer.io/docs/provisioners/file.html)等を使用して、設定を行う必要があります。

* 上記設定を使用してPackerでビルドします。

```
$ packer build docker.json
```

* ビルドしたイメージ`centos6`をsshdを指定して実行してみます。

```
$ sudo docker run -p 2222:22 centos6 /usr/sbin/sshd -D
```

* 下記コマンドで正しくSSHに接続できたかが確認できます。

```
$ ssh -p 2222 127.0.0.1
```
Vagrant + VirtualBox で CPU コアを2つ以上割り当てると遅い

Vagrant + VirtualBox の環境で VM に CPU コアを2つ割り当てる設定を Vagrantfile に書こうとした。

```rb
   config.vm.provider :virtualbox do |vb|
     vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "2"]
   end
```
一見よさそうだが、これで起動すると VM の動作が **めちゃ遅い！**
このとき、VirtualBox の設定を見るとシステムの欄に **「無効な設定が見つかりました」** という警告が出ている。

![vagrantvb.png](https://qiita-image-store.s3.amazonaws.com/0/28313/88c2b466-a210-fd6d-d6d1-3668d6561514.png)

どうやら、警告文によるとコアを複数割り当てる場合には **I/O APIC を有効化** というチェックボックスを ON にする必要があるようだ。

これを Vagrantfile の記述によって設定するには上のスクリプトにさらに
"--ioapic", "on"
という項を追加すれば OK：

```rb
   config.vm.provider :virtualbox do |vb|
     vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "2", "--ioapic", "on"]
   end
```

これで再度 vagrant up すればチェックボックスが ON になっていることを確認できる。動作が遅い現象も解消されている。

----

参考：
・http://stackoverflow.com/questions/17117063/how-can-i-create-a-vm-in-vagrant-with-virtualbox-with-two-cpus
・http://www.lefred.be/node/164
herokuアプリをコピーして別名アプリとして登録する（改訂版）


既存のherokuアプリをコピーして, 別アプリとして動かしたい. そんなときの作業記録
ほぼ[先人の知恵](http://stackoverflow.com/questions/18751063/trying-to-heroku-gitclone-after-heroku-fork-yields-an-empty-repository)のまんまです.

*前回の投稿では上手くいかないので改訂版です. すいません*

* heroku Toolbletが必要
* 既存アプリを`OLDAPP`, 新規アプリを`NEWAPP`とする.

データベースや, add-onも全て引き継いでくれるそうです.


## herokuでforkする
[ココ](https://devcenter.heroku.com/articles/fork-app)を参考に

```
$ heroku fork -a OLDAPP NEWAPP
```

forkしてもリポジトリはcloneしてくれないそうです.
なので`heroku git:clone -a NEWAPP`しても中身なし.

## `OLDAPP`をクローン

ローカルでコピーしても問題ないのですが, 今回はherokuからもらってきます.

```
$ heroku git:clone -a OLDAPP NEWAPP
```

クローンしただけなので, git remoteは

```
$ cd NEWAPP
$ git remote -v
# heroku	git@heroku.com:OLDAPP.git (fetch)
# heroku	git@heroku.com:OLDAPP.git (push)
# ...
```

になってるはず.

## remoteリポジトリを再指定する

newAPPのgit URLが

```
$ heroku info -a NEWAPP

# === NEWAPP
# ...
# Git URL:       git@heroku.com:NEWAPP.git
# ...
```

になってるので, ここのGit URLをherokuとする

```
$ cd NEWAPP
$ git remote rm heroku
$ git remote add heroku git@heroku.com:NEWAPP.git
```

確認

```
$ cd NEWAPP
$ heroku info
# === NEWAPP
# ...
```

## push

あとはいつもどおりに

```
$ git push heroku master
```

でOK

## 参考
[Trying to heroku git:clone after heroku fork yields an empty repository](http://stackoverflow.com/questions/18751063/trying-to-heroku-gitclone-after-heroku-fork-yields-an-empty-repository)

[Forking Applications](https://devcenter.heroku.com/articles/fork-app)
SinatraでSQLServerを参照する

##概要
**Ruby、sinatra-activerecordからSQLServerの参照について簡単に纏める。**

##やりたいこと
Rubyを使用してSQLServerの既存テーブル(m_user)を参照する。

m_userのテーブル構造

| UserID | UserName |
|:-----------|------------:|
| 00000001     |      纏 流子 |
| 00000002     |    満艦飾 マコ| 

##環境
* Windows 8.1 
* Ruby 1.9.3p545
* SQLServer 2008R2
* sinatra (1.4.5)
* activerecord-sqlserver-adapter (3.2.12)
* tiny_tds (0.6.1 x86-mingw32)

1.GemFile

```ruby:GemFile
source "https://rubygems.org"

gem 'activerecord-sqlserver-adapter', '3.2.12'
gem 'tiny_tds', '0.6.1'
gem 'sinatra', '1.4.5'
```

2.database.yml

```ruby:database.yml
development:
  adapter:  "sqlserver"
  host:     "ホスト名(端末名,IPアドレス等)"
  username: "ユーザー名"
  password: "パスワード"
  database: "データベース名"
```

3.コントローラー

```ruby:app.rb
# coding:utf-8
require 'activerecord-sqlserver-adapter'
require 'sinatra'
require 'tiny_tds'

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)
use ActiveRecord::ConnectionAdapters::ConnectionManagement

class User < ActiveRecord::Base
#既存のテーブル名を使用(m_user)
	self.table_name = "m_user"
end

get '/' do
	@users = User.all(:order =>"userid")
	erb :index
end
```

4.ビュー

```html+erb:index.erb
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>ユーザ一覧</title>
</head>
<body>
	<table border ="1" CELLSPACING="0" CELLPADDING="0">
		<thead>
			<tr>
     			<th>ユーザーID</th>
     			<th>ユーザー名</th>
			</tr>
		</thead>
		 <tbody>
	    	<% @users.each do |user| %>
		<tr>
			<td><%= user.UserID %></td>
			<td><%= user.UserName %></td>
		</tr>
		<% end %>
	  	</tbody>
	</table>
</body>
</html>

```

5.bundle install

```:
bundle install --path vendor/bundle
```

6.実行

```:
bundle exec ruby app.rb
```


7.ブラウザで確認

![名称未設定-1.gif](https://qiita-image-store.s3.amazonaws.com/0/29940/130e05b7-f405-cd9d-7f1e-6df5f7732e9d.gif)
Sorting Japanese Words in Indexes (2)

> This article follows [Sorting Japanese Words in Indexes (1)](http://qiita.com/kuroky_plus/items/53f5f13c2ad93e3c3731)

For the sake of sorting, first we translate (pronunciation of) a word to a very normal form, then sorting the words using the very normal forms.  If a pair of words are the same position in the very normal form, then we get back its appearance and break the tie.

# Character class

We recognize the following character classes and their order.  If you would like to add original character classes, you are required to keep consistency in the original classes and several rules, but we will skip the details.

|Order|Character class|
|---:|:---------|
|[1](http://qiita.com/kuroky_plus/items/b21e96af76adaaf98422#1-1)|Space|
|[2](http://qiita.com/kuroky_plus/items/b21e96af76adaaf98422#1-2)|Punctuation mark (except for brackets)|
|3|Bracket|
|4|Academic sign (including mathematical signs)|
|5|General sign|
|6|Denomination|
|7|Arabic numerals|
|8|Greek alphabet and Cyrillic alphabet|
|9|Latin alphabet|
|10|_Hiragana_ and _katakana_|
|11|_Kanji_|
|12|_GETA_ MARK|

If you face a character excluding the above table or your original definition class, it is just eliminated from the normal form.
For example, '゛' (`Ux309B`, `KATAKANA-HIRAGANA VOICED SOUND MARK`) and '゜' (`Ux309C`, `KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK`) are out of the table.

We will separate the entries to describe the details of each class.  Please follow the link in the 'Order' column.

It is note that _JIS X 4061_ does not care the difference of Unicode points due to width or similar meaning, but in the context of source file for TeX-related system, we are required to think about their identification.
JPA2で出力されるSQLでbindされているパラメーター表示を行なう方法


JPA2で`persistence.xml`で

```xml
<property name="eclipselink.logging.level" value="FINE" />
```

を設定しても、実行される(であろう)SQLはログ上に表示されますが、
SQLにbindされる値は、以下のようになって確認できません。

> bind => [1 parameter bound]|#]

このバインドされているパラメーターを見えるようにするためには、

```xml
<property name="eclipselink.logging.parameters" value="true"/>
```
を追加する事で実際に流れるSQLパラメーターも確認可能になります。

> bind => [hoge, piyo, null]

Stackoverflowに聞いたところ[Is it possible to make glassfish3/eclipselink to log bind varibles values into log file?](http://stackoverflow.com/questions/8212244/is-it-possible-to-make-glassfish3-eclipselink-to-log-bind-varibles-values-into-l)というそのまんまの質問が見つかりました。

当然ですが、EcliseLinkのドキュメントにも書いてあります。

* [EclipseLink/Examples/JPA/Logging](http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging)

公式リファレンス大事。
文字列中のタブを空白に置換する

vimscriptで文字列中のタブ文字を空白に置換したい。
バッファに対してなら ``retab`` でいいんだけど、あくまで文字列に対して実行したい。そういう関数があるんじゃないかと思ったけど、見つけられなかった。

自分で実装するなら、こんな感じ？

```vim

function! ExpandTab(text, tabstop)
    let tokens = split(a:text, '\v\t\zs')
    let replaced = map(tokens, 
                    \'v:val[-1:] != "\t" ? v:val :
                    \ v:val[:-2] . repeat(" ", a:tabstop - (len(v:val)-1) % a:tabstop)')
    return join(replaced, '')
endfunction
```

1. splitで、各タブ文字の後ろで文字列を分割
2. mapで、分割後の各文字列の長さがtabstopのn倍になるようにタブを空白に置換
3. joinで文字列を再結合

で終わり。
Unityのロードランナー風ゲームでお宝を全部取得したらハシゴとゴールが表示されるようにする


はじめに
=======

[前回](http://qiita.com/mokemokechicken/items/c592b8abfae986de7213)からの続きです。

今回は、お宝を全部取得した時に、新たなはしごを出現させて、ゴールも出現させるようにしてみます。
あと、敵キャラも配置するようにしました。


方針
----

宝を全て取得したら出現するはしご（隠れはしご、と呼びましょう）とゴールは最初にStageデータに記述しておきます。
Stageを最初構築する際に、「設置はしておくけど表示しない」ようにしておいて、「宝を全て取得したら表示する」と良さそうです。

Goalオブジェクトには、Playerとの当たり判定を付けておいて、当たったらクリアということにします。

Goalの作成
====

オブジェクトの作成
----------------
なんでも良いので、GoalになるObjectを作ってPrefab化しておきます。
StageControl.csに、その他のObjectと同様に関連付けしておいて、Stage構築時に描画できるようにしておきます。

今回は手抜きですが、以下のようなものをGoal Objectにしました。

![Stage_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/63bb4a6c-0c10-ad8c-b953-53f0624bb2e1.png "Stage_unity_-_RoadRunner_-_Web_Player.png")

衝突判定用のColliderを付けておき、'trigger'にチェックを入れておきます（はしごや宝と同じ）。

GoalControl
----------------

このGoalにPlayerが到達したらStageクリアです。とりあえず、以下のように StageControllerの`PlayerHitGoal()`を呼ぶようにしておきます。

```csharp:GoalControl.cs
public class GoalControl : MonoBehaviour
{
	void OnTriggerEnter(Collider other) {
		if (other.gameObject.tag == Tag.PLAYER) {
			Global.stageControler.PlayerHitGoal();
		}
	}
}
```


宝を全て取得したら出現するようにする
=========

初期のStage配置時に、"隠れはしご"と"Goal"は表示されないようにします。
`GameObject#SetActive(bool)`を使えば良さそうです。そして、最後の出現させるべきGameObjectを `hiddenObjects`というListに入れておきます。

```csharp:StageController.cs

	void BuildStage(string stageData) {
		...
					case HIDDEN_LADDER:
					case GOAL:
						instance.SetActive(false);
						hiddenObjects.Add(instance);
						break;
```


お宝を全てGETしたら、`showGoal()`を呼び出して、そこでは `hiddenObejcts` に対して`SetActive(true)`を呼びます。
これで隠れはしごとGoalが表示されるようになります。

```csharp:StageController.cs
	public void PlayerGotTreasure() {
		numTreasure--;
		Global.score += 100;

		if (numTreasure == 0) {
			showGoal();
		}
	}

	private void showGoal() {
		foreach (var obj in hiddenObjects) {
			obj.SetActive(true);
		}
	}
```

また`PlayerHitGoal()`では、Stage Clear処理を書きます。
とりあえず、UnityChanをズームアップして、3秒くらいWaitするようにします。3秒したらまたStageを再ロードさせます。

なんか流れ的やっつけ仕事で `Global.paused` というのも作ってしまいました。
本当は何がやりたいかはっきりさせて、もう少し考えるべきですね。

```csharp:StageController.cs

	public void PlayerHitGoal() {
		cameraObject.camera.fieldOfView = 40;
		Global.paused = true;
		loadNextAt = Time.time + 3;
	}
```



ついでに敵も配置する
=======

せっかくなので敵も配置するようにしました。何度も繰り返しになるので詳細は割愛しますが、修正は以下の部分になります。
https://github.com/mokemokechicken/UnityChanRoadRunner/commit/d27d6f0d0f2e031d1717f03ac2a1f86c4baf1a89


さいごに
====

一応敵もいるし、クリアもあるので、ゲームみたいなものになってきた気がします。

* 今回のバージョンのWebPlayer版
	* https://dl.dropboxusercontent.com/u/21300511/UnityRoadRunner/demo1k/demo1k.html
* ソースコード
	* https://github.com/mokemokechicken/UnityChanRoadRunner/tree/demo1k
[git][SourceTree]ローカルに残ってしまっているリモートブランチを一括削除


SourceTree と github を使っていると, 他の人が `push` したブランチや
`merge` 済みのブランチがガンガン残っちゃいます.

ローカルではそんなの不要なので削除する方法をメモっておきます.


- SourceTree の`ツールバー`->`リポジトリ`->`フェッチ`(or Shift+Command+F)
- **リモートで削除された追跡ブランチは取り除く**にチェック
- `OK`ボタンをクリック

以上です.

まぁやってることは cmd で

```shell
$ git fetch --prune
```

たたいてるだけなんですけどね♪
instanceof演算子で"Incompatible conditional operand types"が出る場合の対応(eclipse)

Eclipseでjavaコーディング中に、クラスのオブジェクトを比較するinstanceof演算子を利用した時に、"Incompatible conditional operand types"というエラーが出る場合の対応方法。  

例  

```java
if(mActivity instanceof HogeActivity){
...
}
//=>"Incompatible conditional operand types Activity and HogeActivity"
```
### 原因
Eclipseで適切なクラスファイルがimportされていないため。

### 対応方法
以下をimportする。

```java
import com.hoge.Hoge.Activity
```
Github の wiki ページで改行する

# 困り事

GitHub の wiki ページ内（Markdown記法）で改行されない
（特にテーブル内）

# 結論

* 改行の記法
    * 行末に半角スペース 2 つ
* テーブル内での改行
    * **\<br>** を使う

## 例1）リストの文章

以下のように表示したい

* あいうえお<br>かきくけこ

NG な例

```
* あいうえお
  かきくけこ
```

OKな例1（行末に半角スペース2つ）

```
* あいうえお(ここに半角スペース2つ)
  かきくけこ
```

OKな例2（`<br>`を埋め込む）

```
* あいうえお<br>かきくけこ
```

※追記）リストの場合は半角スペース2個の方法もあるとコメント頂きました
（@kimama1997 さん、@hilohiro さんありがとうございます！）


## 例2）テーブルのセル内の文章

以下のように表示したい

|カラム1|カラム2|
|---|---|
|あいうえお<br>かきくけこ|改行したくない文章|


NG な例

```
|カラム1|カラム2|
|---|---|
|あいうえお
かきくけこ|改行したくない文章|
```

OKな例

```
|カラム1|カラム2|
|---|---|
|あいうえお<br>かきくけこ|改行したくない文章|
```
さくっとヘッドホンの抜き差しを取得する


必要があって調べていましたが、
ネット上の情報が古くなってきていると感じたので書きます。

`AVAudioSession`を使います。


```objectivec:init
// 明示的にアクティブにしておく必要があった
[[AVAudioSession sharedInstance] setActive:YES error:nil];

// Notificationの設定
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeAudioSessionRoute:) name:AVAudioSessionRouteChangeNotification object:nil];

```

で、上で指定した`didChangeAudioSessionRoute:に状態の変更が通知されるので、今どうなってるか調べればいい。

```objectivec:notification

- (void)didChangeAudioSessionRoute:(NSNotification *)notification
{
    for (AVAudioSessionPortDescription *desc in [[[AVAudioSession sharedInstance] currentRoute] outputs]) {
        if ([desc.portType isEqual:AVAudioSessionPortHeadphones]) {
            NSLog(@"ヘッドホン刺さった");
        } else {
            NSLog(@"ヘッドホン抜けた");
        }
    }
}

```
さくっとならコレで十分だと思いますが、本当に **ヘッドホンが抜けた** とか **刺さった** 状態であるかどうかは、直前の状態を見ないとわからないので、

もうちょっと詳しく書くと以下のようになります。

```objectivec:notification2
- (void)didChangeAudioSessionRoute:(NSNotification *)notification
{
    // ヘッドホンが刺さっていたか取得
    BOOL (^isJointHeadphone)(NSArray *) = ^(NSArray *outputs){
        for (AVAudioSessionPortDescription *desc in outputs) {
            if ([desc.portType isEqual:AVAudioSessionPortHeadphones]) {
                return YES;
            }
        }
        return NO;
    };
    
    // 直前の状態を取得
    AVAudioSessionRouteDescription *prevDesc = notification.userInfo[AVAudioSessionRouteChangePreviousRouteKey];
    
    if (isJointHeadphone([[[AVAudioSession sharedInstance] currentRoute] outputs])) {
        if (!isJointHeadphone(prevDesc.outputs)) {
            NSLog(@"ヘッドフォンが刺さった");
        }
    } else {
        if(isJointHeadphone(prevDesc.outputs)) {
            NSLog(@"ヘッドフォンが抜かれた");
        }
    }
}
```

`userInfo`で直前の状態が取れるので、その時ヘッドホンが刺さっていたかどうかを調べています。

なんだか、あまり効率的ではなさそうですが

`userInfo`から`AVAudioSessionRouteChangeReasonKey`で`AVAudioSessionRouteChangeReason`が取得できますので、その中の

- `AVAudioSessionRouteChangeReasonNewDeviceAvailable`
- `AVAudioSessionRouteChangeReasonOldDeviceUnavailable`

ここら変を見るようにすればもうちょっと無駄なく書けそうかな。
Pythonでコマンドを叩く（Windows）

コマンドプロンプトを叩いたようにコマンドを実行するPython。

```py3

# coding:utf-8
import os

cmd = "ipconfig /all > D:\\ipconfig.txt"
os.system(cmd)

cmd = "tree D:\\Doc /f > D:\\tree.txt"
os.system(cmd)

```

実行ファイルにすれば.batみたいに配布できる。

もっと賢い書き方があったら教えて下さい。

いじょ
sshのrootログインを禁止する

sshでいきなりrootに入られてしまうのは怖いので設定する


```text:アジェンダ
sshで入るユーザの作成。  
普段はこのユーザから入り、サーバ内でsuする。
このユーザからしかrootに入れないよう設定する
```
## rootになれるユーザの作成 

既存のグループの確認
  
```text:/etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
tty:x:5:
disk:x:6:
lp:x:7:daemon
mem:x:8:
kmem:x:9:
wheel:x:10:
…
…
```
このwheelというグループに新規ユーザ(ops)を入れる(wheelグループ指定)
  
```text:cmd
# adduser ops -g wheel
# passwd ops
```

作業用にdevも作っておく

```text:cmd
# adduser dev
# passwd dev
```

確認
最後の行に以下が設定されていればok

```text:/etc/passwd
…
…
ops:x:502:10::/home/ops:/bin/bash
dev:x:503:503::/home/dev:/bin/bash

```
 補足:passwdの見方

* ops -> ユーザ名
* x ->パスワード(シャドウパスワード使用中はx表記)
* 502 ->ユーザ番号(重複不可)
* 10 ->グループ番号

### rootになれるユーザを限定する
opsユーザとdevユーザを作成したのでwheelグループのopsのみrootに入れるようにしておく
※設定ファイルを変更後、すぐに反映するので注意
  
```text:/etc/pam.d/su
- # auth		required	pam_wheel.so use_uid
+   auth		required	pam_wheel.so use_uid

```
運用する際にopsからrootに移行する際に毎回パスワードをいれるのは時間のロスなので、wheelグループ(この場合はrootとopsのみ)はsuの際にパスワードを入力しなくていいようにする。
  
```text:/etc/pam.d/su
- # auth		sufficient	pam_wheel.so trust use_uid
+   auth		sufficient	pam_wheel.so trust use_uid
```
### sudo作業が出来るようにする
普段はopsユーザのままで作業を行う。
install等はなるべく、sudoで行う

* 特定のユーザにsudo権限を付与する

```text:visudo
+ ops     ALL=(ALL)       ALL
```

* wheelグループに所属しているユーザにsudo権限を付与する

```
- # %wheel        ALL=(ALL)       ALL
+   %wheel        ALL=(ALL)       ALL
```

* sudo時にパスワードレスにする

```
- # %wheel        ALL=(ALL)       NOPASSWD: ALL
+   %wheel        ALL=(ALL)       NOPASSWD: ALL
```

* wheelに所属しているユーザのみsudo権限(パスワードレス)

```
- # %wheel  ALL=(ALL)       NOPASSWD: ALL
+   %wheel  ALL=(ALL)       NOPASSWD: ALL
```



## rootでのログインを禁止する
※これがやりたかった

  
```text:/etc/ssh/sshd_config
- # PermitRootLogin yes
+   PermitRootLogin no
```



### ファイルの変更後、sshdを再起動する
  
```text:cmd
# service sshd restart
```

これでrootでsshで入れなければ設定が無事完了。  
あとはopsに鍵認証で入ればストレス無く作業が出来るはず。
Grape+KaminariでAPIのページング対応


kaminari https://github.com/amatsuda/kaminari というgemを使うことにした。

bundle installしてrails g。

```Gemfile
gem 'kaminari'
```

```
bundle install
rails g kaminari:config
```

モデルクラスに一度のリクエストで出力する数を設定しておく。

```Ruby
class Post < ActiveRecord::Base

  paginates_per 5
  ...

end
```

あとはこんな感じでModel.query().page(params[:page])をつけて書くだけ。
Model.query().page(params[:page]).per(10)見たいな形でモデルに設定した値でなくても取って来れるので、offset,limitみたいな使い方も簡単。

```Ruby
# coding: utf-8
class Post_API < Grape::API
  resource :posts do

    # http://localhost:3000/api/v1/posts
    params do
      optional :page, type: Integer, desc: "Page Num"
    end

    get do
      Post.where(published: true).page(params[:page])
    end

  end
end
```
vim7.4のバックスペースでも特殊記号を削除したい


macのvimは標準にインストールされているやつだと
クリップボードの共有の設定がそもそも出来ないそうです。
それでは不便なので

brew install vim

でささっとアップデート。以下記事を参考にしました

[MacのVimでHomebrewを使ってクリップボード連携を有効にする](http://qiita.com/shoma2da/items/92ea8badcd4655b6106c)

しかしインストールごクリップボード共有は設定出来たのですが
編集モードで特殊記号がバックスペースで削除出来ない・・・！
以下の設定をvimrcに記述する事で解決しました。

```.vimrc

set backspace=indent,eol,start

```

7.3と7.4の違いも分からないし、ゆっくり勉强したい
S3 バケットが取れるまで頑張るスクリプト

ある AWS アカウントで取った S3 バケットを、別のアカウントの持ち物にしたくなったとき、同名のバケットを同時に作ることはできないので、一旦元のアカウントのバケットを削除してから、別のアカウントで作ることになります。

その際、別のアカウントですぐ作ろうとしても、こんなメッセージが出て作れません。

> A conflicting conditional operation is currently in progress against this resource. Please try again.

じゃぁどうするか？取れるまで自動で叩くしかないでしょう。

`AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` が export されているなど、適切な権限がある状態で、このシェルスクリプトを実行して下さい。`your-bucket-name` と `your-region-name` は適当に書き換えて下さい。

```bash
while :; do
  date
  aws s3api create-bucket --bucket your-bucket-name --create-bucket-configuration LocationConstraint=your-region-name && break
  sleep 60
done
```

ファイルにした版はこちら: [i-want-this-bucket.sh](https://gist.github.com/rch850/807bc3776bf1673286cf)

個人的にハマったのが、リージョン指定。`AWS_DEFAULT_REGION` を指定してもうまくいかず、`--region ap-northeast-1` としてもうまくいかず。結論、上記のように `--create-bucket-configuration` を指定する必要がありました。

参考: [[1.2.10][s3api] IllegalLocationConstraintException when using dots in bucket name · Issue #589 · aws/aws-cli](https://github.com/aws/aws-cli/issues/589)
mysqlbinlog凡ミス


binlogの動きを確認してみようと簡単に設定してみたが、意図通りにいかなかった・・・

`/etc/my.cnf`に`bin-log=mysql-bin`と指定してデフォでinsert、deleteを走らせてみたがバイナリログが吐かれてはいるようだが謎の出力。

```
$ mysqlbinlog mysql-bin.00002
...
mysqlbinlog: File 'mysql-bin.000002' not found (Errcode: 13)
...
```

で読み取り権限が無いので一般ユーザーでみれてなかった

```
$ sudo chmod o+r mysql-bin.*
```

あるある過ぎて泣けてくる
.bind .delegate .live から.on()へ 

.click()は今時使わないらしい。
.on()で.click()の代わりに表す。

onだけでbindやdelegateとliveも表現できる。

# bind delegate live からon()にする。

## bindから書き換えると

.bindは各DOMにイベント（クリックとか）が発生したら、function以下が発動する。
直接的にイベントを指定しているため（以下の例でいうと、）$関数実行時になかったDOMについては、イベントが登録されない。

`$('.btn').bind('click',function(){なにか});`
(bind ←→ unbind)
(非推奨です)

### .onだと、

`$('.btn').on('click',function(){なにか});`
(on ←→ off)



## delegateから書き換えると

delegateは、イベントを発生する親の要素に対してイベントを定義するため、
bindと違い、間接的なイベントの指定をすると言える。


`$('.content').delegate('.btn','click',function(){なにか});`
(delegate ←→ undelegate)
(非推奨です)

### .onだと

`$('.content').on('click','.btn',function(){なにか});`

## liveから書き換えると
liveは、delegateと同じようにイベントを発生する親の要素に対して行いますが、
liveは、イベントの張り付ける対象がdocumentにしか指定できません。

`$('.content').live('click',function(){なにか});`
(live ←→ die)
### →liveとdieはjQuery 1.9で廃止されたようです。

### onだと

`$(document).on('click','.btn',function(){なにか});`

liveとdelegateは.on()では違いはないみたいです。
↑の使いどころがいまいちわかりません。


liveの例のように、廃止されてきてるので、推奨のon()を使うようにします。

## クリックするとボックスが追加されていくデモ
### bindとdelegateの違い

#### bindボックス
追加されたbindボックスは、再び第３のボックスを追加できない。
$('.bind')実行時に、1つ目のボックスしかなく、その時にないDOMに対してイベントは登録されないから。

#### delegateボックス
イベントが張り付いている.content（親要素）からバブリングにより、bodyまで上がり、そこで、同じ’.delegate’文字列を探し、イベントを登録するこができるから、ボックスが次々と追加できる。
（bindのように$関数実行時に第2,第3のボックスがなくても、文字列で探すからDOMがなくても関係ない。）

### html

```
<!doctype html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>.bind.delegate.live</title>
	<script type="text/javascript" src="js/jquery-1.11.1.min.js"></script>
	<script type="text/javascript" src="js/on.js"></script>
	<link rel="stylesheet" href="css/style.css">
</head>
<body>
	<div class="content">
		<a href="#" class="bind">bind</a>
	</div>
	<div class="content">
		<a href="#" class="delegate">delegate</a>
	</div>
</body>
</html>
```

### js

```
$(window).on("load", function(){
	// bind

	$('.bind').on('click',function(){
		$('body').append('<div class="content"><a href="#" class="bind">bind</a></div>');
	});

	// delegate

	$('body').on('click','.delegate',function(){
		$('body').append('<div class="content"><a href="#" class="delegate">delegate</a></div>');
	});


});


```

### 面倒なのでcssも

```
@charset "UTF-8";

body{
	background: #eee;
}
.content{
	width: 70px;
	height: 30px;
	border: 2px #eee;
	background: #fefefe;
	padding: 20px;
	margin:10px;
}
```


# イベントのバブリングとは

clickイベントすると、DOM上で上へ上へと親要素へとイベントが伝わること。
下から上へ泡がぶくぶく上がっていくように伝わるから、バブリング。delegate時に起こる。
⇒発生源はどこか調べられる。

delegate だと複雑なセレクタだと実行まで少しタイムラグがあったりするらしい。
複数に指定しないならばbind。複数指定するならば、delegate
JavaScriptのスコープとクロージャとletステートメント

#スコープ
javascriptのスコープは少々特殊である。
javascriptはブロックによるスコープを作らず、関数によってのみスコープを作る。

```js:ブロックによるスコープを作らない例
for(var i = 0;i < 10;i++){
    var sum = sum || 0;
    sum += i;
}
console.log(sum);    //45, エラーにならない
```

```js:関数によってスコープが作られる例
for(var i = 0;i < 10;i++){
    function add(){
        var sum = sum || 0;
        sum += i;
    }
    add();
}
console.log(sum);    //エラー, ReferenceError: sum is not defined
```

#クロージャ
クロージャは外のスコープの値への参照保持する。

```js
var name = 'test';
var age = 20;
function myAlert(){
    alert(name+', hello!' + ' age:'+age);
}
myAlert();    //test, hello! age:20 とアラートされる
```

注意することは"参照"を保持しているということである。
`myAlert`は実行すると常に同じ文章を表示するわけではない。
例えば以下のように`myAlert`を定義した後、`name`,`age`を変更すると表示内容が変わる。

```js
var name = 'test';
var age = 20;
function myAlert(){
    alert(name+', hello!' + ' age:'+age);
}
myAlert();    //test, hello! age:20 とアラートされる
name = 'test2';
age = 30;
myAlert();    //test2, hello! age:30 とアラートされる
```

この仕様は以下のような罠を含んでいる。
[いつかあなたが絶対に引っかかる、ある一つのJavaScriptの罠 - Qiita](http://qiita.com/ukiuni@github/items/463493a690265cec8bb7)

#letステートメント
JavaScript 1.7では`let`ステートメントを使用することでブロックスコープを実現できる。

```js
for(var i = 0;i < 10;i++){
    let sum = sum || 0;    //ループの最初ではsumはundefinedのため常に0で初期化される
    sum += i;
}
console.log(sum);    //エラー, ReferenceError: sum is not defined
```

この`let`ステートメントを使用すると上記の記事にあるJavaScriptの罠を容易に解決できる。

```js
//firefoxのコンソールなどで実行可能
for (var i = 0; i < 3; i++) {
    let _i = i;
    setTimeout(function() {
        console.log(_i);
    }, 0);
}

//0, 1, 2 とログがでる
```

#まとめ
ブロックによるスコープをつくらないために変数名をよく考えてつける必要がある。
非同期処理でクロージャを使う場合は注意する。
JavaScript 1.7は`let`ステートメント以外にも便利な機能があるので早く使えるようになって欲しい。
openSUSEで無線LANプリンタ（ブラザーDCP525J）の設定

#はじめに
puppylinuxでもブラザーDCP525J(無線LANプリンタ)を設定して使えたので、openSUSE13.1x64でも同じように使えるのか確認してみた。いくつか設定方法に違いはあるものの、印刷できるようになったので備忘録代わりに記録しておく。

#ドライバーの入手
印刷の設定がYastのプリンタから設定するようになっている。
ブラザーのサイトから対応するプリンタードライバー(今回はDCP525J)を2つ(lprとcupswrapper)ダウンロードしてくる。rpm形式とdeb形式の2種類用意されているので、openSUSEなのでrpm形式のものをダウンロードする。

http://support.brother.co.jp/j/b/downloadtop.aspx?c=jp&lang=ja&prod=dcpj525n

#ドライバーのインストール
    # sudo rpm -ivh xxx-lpr-vvv.i386.rpm
    # sudo rpm -ivh xxx-cupswrpper-vvv.i386.rpm

    xxx はプリンター名、vvvはバージョン番号

そういえば、今回64bitなのにi386とついてるドライバをインストールしてまったが、動いたからよしとする。ダウンロードリストには32bit 64bit の選択肢なかったし。

# プリンタの設定
ドライバをインストールしても、Windowsと違ってすぐにプリンタが使えるようにはならない。設定が必要。設定はYastから行う。
Yastのプリンタの設定に入る前にファイアウォールの設定を変更する必要がある。デフォルトは外部ネットに接続するになっていてほとんどのポートがふさがれているので、ネットワークのプリンタ設定や印刷できない。
今回使ったノートPCも無線LANなので、無線LANのファイアウォールの設定を外部から内部に変更する。（これだとほぼポート全開なので、外で利用する場合には要注意。）
ファイアウォールの設定もYastから設定する。
この後の設定が、ブラウザベースでCUPSを設定する場合とは違っている。

おおまかにいうと、接続形式に、TCPポート(AppSocket/JetDirect Port9100)を選択、接続確認した後に、メーカー名指定して表示される一覧から、該当するプリンターを選択すればOK。以下が具体的な手順。
なお、無線LANプリンタのIPは固定にしておいた方がよい。

#具体的な手順
1.Yast >> プリンタ >> プリンタの設定画面で「追加」ボタンを押す。

2.接続ウィザードボタンを押す。

3.接続ウィザード画面で
　「以下を介してネットワークプリンタや印刷サーバにアクセス」のTCPポート(AppSocket/JetDirect)を選択。TCPポート番号9100はそのまま。

4.無線LANプリンタのIPアドレスを入力して、テストボタンをして「成功」なら、プリンタの製造元にBrotherを選択してからOKボタンを押して次のステップ。
失敗」なら無線LANプリンタIPアドレスを確認するか、ファイアウォールの設定確認。

5.新しいプリンタ設定の追加の画面
ここの接続の指定のリストで前のステップで追加したプリンタが表示、選択されているかを確認。

    モデル=Brother
    接続=socket://xxx.xxx.xxx.xxx:9100

指定したIPアドレスとポート番号が合っていればOK。
その状態でドライバの発見と割り当て、一覧から該当するプリンタドライバを探して選択。
（たくさん表示されて探せない場合は、検索のところで "brother dcp" とキーワードを追加して再度検索すると絞り込みできる。）
任意の名称にはあとでみてプリンタ名がわかりやすいように、プリンタ名型番の名称にしておくとよいです。これは、印刷時に表示されるプリンタ名になります。
  規定の用紙サイズでA4/Letterか選択できるので、A4にする。運がよければ、デフォルトの用紙選択がA4になる。
  OKボタンをおすとプリンタ設定の画面に戻る。

5.テスト印刷
  プリンタ設定の画面に戻って、リストに、プリンタが追加されているはず。
  追加したプリンタを選択した状態で、テストページを印刷する、でテスト印刷して確認。テストページが印刷されるはず。
HHVM 3.0.1をCentOS 6.5 (64-bit)にインストールする

# CentOS6.5を用意する

```
$ cd /etc/yum.repos.d
$ sudo wget http://www.hop5.in/yum/el6/hop5.repo 
```

hop5のrepoを追加

# HHVMのインストール

```
$ sudo yum clean all
$ sudo yum install hhvm
$ sudo yum update hiphop-php
```

# 動作確認

```
[vagrant@vagrant-centos65]$ hhvm --version
HipHop VM 3.0.1 (rel)
Compiler:
Repo schema: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
```
インストール完了！ここまでは簡単！

# nginxのインストール

```
$ sudo yum install nginx
```

# nginxのConfig修正と起動

```
$ sudo cp -av /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.20140526
$ sudo vi /etc/nginx/conf.d/default.conf
ーーー
#以下修正
    location / {
        root   /var/www/htdocs;
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$args;
    }

#以下を server ディレクティブ内に追記
    location ~ \.php$ {
        root           /var/www/htdocs;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
```

```
$ sudo /etc/init.d/nginx start
```

# HHVMの起動

```
$ sudo hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000
```

# 動作確認

http://192.168.33.10 など、設定したIPアドレスにアクセス
「HipHop」と表示されていれば動作中

# daemonで起動する方法

調査中
viewのdate_selectでyear, month, dayで別々のclassを当てたいときどうするか？

普通に使うと、

```html
> f.date_select_or_confirm :birth_date, {}, {class: "date"}
<select class="date" id="user_birth_date_1i" name="user[birth_date(1i)]">
<select class="date" id="user_birth_date_2i" name="user[birth_date(2i)]">
<select class="date" id="user_birth_date_3i" name="user[birth_date(3i)]">
※<option>は省略してます。
```

みたいな感じになって、全部同じclassがあたってしまいますが、以下のように`with_css_classes `を追加すると解決します。

```html
> f.date_select_or_confirm :birth_date, {with_css_classes: true}
<select class="year" id="user_birth_date_1i" name="user[birth_date(1i)]">
<select class="month" id="user_birth_date_2i" name="user[birth_date(2i)]">
<select class="day" id="user_birth_date_3i" name="user[birth_date(3i)]">
```

それぞれのselectタグに固有のclassが付いてます！

`datetime_select`でも追加で、hour, minuteが付きます。

ちなみにドキュメントに書いてありました。

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select

> :with_css_classes - Set to true if you want assign different styles for 'select' tags. This option automatically set classes 'year', 'month', 'day', 'hour', 'minute' and 'second' for your 'select' tags.

`:nth-child()`とか使わないとだめ？って思ったけどIEで使えないなど問題ありますが、これでよかったんですね。

ではでは〜
django-debug-toolbarをローカル以外で使用する


普通に使う手順は
http://qiita.com/seizans/items/ff9da996070105707bcc
でも見てください。

ローカルでは普通に出てますが、ローカル以外で使うときに探したのでメモ。
簡単で、以下を追記すれば良い。

```settings.py
INTERNAL_IPS = ["xxx.xxx.xxx.xxx"]
```
として出したいクライアントのIPを書く。
ネタ元は普通に公式のインスールガイド：
http://django-debug-toolbar.readthedocs.org/en/1.0/installation.html
phpで「配列」〜 foreach文の使い方


## 配列から要素1つずつを取り出す

foreach文とは配列の要素を１つずつ取り出し、最後まで到達すると自動でループを終了してくれる構文です。「while文」の時の様に、終了条件を自分で設定しなくても動作するのがポイントです。

以下にforeach文の例を書いてみます。

```php

<html>
<head>
</head>
<body>
		
<?php  
$azumanga = array("ちよ", "かぐら", "おおさか", "さかき", "よみ", "とも");

foreach ($azumanga as $name) {
	echo "{$name}<br />";
}

?>

</body>

</html>


```

↓実行結果

![php_2001.png](https://qiita-image-store.s3.amazonaws.com/0/35975/cdc29c3c-b5c2-51fe-36be-8dc69b57100f.png "php_2001.png")


上記例の`$azumanga as $name`は配列`$azumanga`の要素を`$name`に１つずつ取り出していくという意味です。

これにより、先頭の要素、２番目の要素、３番目の要素・・・と、先頭の要素から順番に処理されていきます。

`echo "{$name}<br />";`の部分が先頭から取り出され格納された`$name`に何の処理をするかです。ここでは「表示して改行する」の意味になります。


foreach文についてはひとまずここまでにして、次回はユーザー定義関数をやってみます。
Google TTSで読み上げ（100文字まで）

#やりたいこと
・シェルスクリプトで簡単な読み上げ機能を実装したい。
・日本語と英語。できたら中国語も。
・プラットフォームはRaspberry Pi (raspbian wheezy)。
・やり方はapt-getでインストールするタイプのものと、WebのAPI呼出しのものの２種類。（インターネットに接続できる場合は後者を使用。）

#やってみた
・日本語対応のソフトとしてはOpen JTalkをインストール。問題なし。（参考は[ここ](http://shokai.org/blog/archives/6893)。）
・英語対応はeSpeakとFestivalをインストールしたが、前者の勝ち。（参考は[ここ](http://elinux.org/RPi_Text_to_Speech_(Speech_Synthesis))。）
・WebのAPI形式のものはGoogle translateのTTS機能(text to speech)があった。英語は圧倒的に高品質。ただし、100文字の制約あり。URLは`http://translate.google.com/translate_tts?tl=en&q=Hello+World!`って感じ。

#疑問点
・Google translateは日本語にも対応しているのだが、ChromeブラウザからURL入力だとうまくいく（[こんにちは](http://translate.google.com/translate_tts?tl=ja&q=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%82)）のに、bashからはうまくいかない。
・URI encodeした文字列もだめ。
・日本語はアクセントが少しおかしいが、なんとかbashから使いたい！

#解決策
・英語（tl=en）の場合と違って、日本語(tl=ja)の場合にはUser-Agentのチェックがかかっていたからうまくいかなかった。
・mplayerの場合には-user-agentは効かないので、~/.mplayer/configに以下を記載したらOKでした。
```
user-agent='Mozilla/5.0 (X11; Linux i686; rv:10.0.4) Gecko/20100101 Firefox/10.0.4'
```
Gitの作成者/コミッターのデフォルト値を変更したい

# 発端
そもそもこの項目は、PCの設定か何かを読み込んで初期値が割り振られるようです。
個人PCや仕事現場で与えられたPCならば、登録したユーザ情報がそのまま表示されるので問題ないのですが。。
会社や学校の共通端末で、全てのログインユーザ/メールアドレスが同じなんて事になると面倒くさい。
全てのコミッターが `Admin <admin@hogehoge.co.jp>` なんて悲惨な事になってしまう。
仕方なくコミットするときに書き換えても、次のコミットでは元に戻ってしまうので、これはなんとかしたい。

# 作成者/コミッターを登録する
`環境設定`を開く
`チーム`>`Git`>`構成`>`ユーザー設定`>`エントリーの追加...`のボタンを押す。
`キー`に`user.email`と入力し、`値`に`UserName@gmail.com`などと入力。
`エントリーの追加...`をもう一度押して、
`キー`に`user.name`と入力し、`値`に`UserName`などと入力する。
そうしたらば`OK`ボタンを押そう。

# 確認
リポジトリを適当に変更して、コミットしてみる。
作成者とコミッターに `UserName <UserName@gmail.com>` と入力されてあればOKです。
Haxeで疑似乱数生成

Haxeで疑似乱数を生成するためのコードです。
標準ライブラリにMath.random()などがありますが、シード値を使えないので自分で作ってみました。
Xorshiftアルゴリズムを利用しています。
x,y,z,wはシード値です。UIntの正の整数か0を入力してください。
ただし、x + y + z + w = 0だと動かないので注意！

```hx
class Xorshift {

	private var x:UInt;
	private var y:UInt;
	private var z:UInt;
	private var w:UInt;
	
	private var t:UInt;
	
	public function new(x:UInt = 1234, y:UInt = 5678, z:UInt = 9876, w:UInt = 5432) {
		this.x = x;
		this.y = y;
		this.z = z;
		this.w = w;
	}
	
	public function nextUInt():UInt {
		t = x ^ (x << 11);
		x = y;
		y = z;
		z = w;
		return w = (w ^ (w >>> 19)) ^ (t ^ (t >>> 8)); 
	}
	
	public function nextFloat():Float {
		t = x ^ (x << 11);
		x = y;
		y = z;
		z = w;
		w = (w ^ (w >>> 19)) ^ (t ^ (t >>> 8));
		return w / 4294967295;
	}
	
}
```

nextUInt関数は0以上4294967295以下のUInt値、nextFloatは0以上1以下のFloat値を返します。

参考: 
http://ja.wikipedia.org/wiki/Xorshift
http://d.hatena.ne.jp/pashango_p/20090717/1247848900