OmniAICreator/Qiita-1.07M huggingface dataset:
Javaにおける文字列と数値と変数とオブジェクトのまとめ

[パーフェクトJava](http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Java-PERFECT-SERIES/dp/4774139904/ref=sr_1_1?ie=UTF8&qid=1405313427&sr=8-1&keywords=%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Java)を読んだ（第2章 ～ 第3章）ので、
その簡単なまとめを載せる。
（ちなみに全ての内容を記載しているわけではありません）

## 第2章 文字と文字列
- Javaの文字列はイミュータブルなオブジェクト
- 文字列を変更する際は新しくオブジェクトを生成している。
- Javaの文字列は配列のように見えない工夫が施されていて、ひとつのオブジェクトとして扱う。
- Stringオブジェクトは読み込み専用なので、文字操作の度にインスタンスを作成して、無駄が生じる。

### StringBuilder
- オブジェクトの破壊的なメソッドはメソッドの定義だけでは判別がつかないので、イミュータブルなStringメソッドからコピーした方が安全である。（生成のコストはかかる）
- Stringオブジェクトのように文字列が変更不能であるような性質のオブジェクトを不変オブジェクトという。不変オブジェクトは予期しづらい非効率なコードになる可能性がある。
	- 文字結合を +演算子 で行う場合

### 文字比較
- Stringオブジェクトの文字列比較には == を使用するのはNG
	- == はオブジェクトの参照先が等しいか（同一性）を判別するので、値が等しいか（同値性）は判別しない。
	- 同値性を判別するには、equalsメソッドを使用する。
- 文字リテラルを == で比較する際、文字列リテラルから暗黙に生まれるStringオブジェクトは、文字列の内容が一致している場合は同一のStringオブジェクトであるので、trueになる。文字結合後の内容が一致している場合も、同一のStringオブジェクトになるので、trueになる。
	- しかし、これはたまたまtrueになるとかんがえるべきで、通常はequalsを使用する。
- 文字列リテラルとStringオブジェクトの文字比較
	- "012".equals(str)にすると安全。（str.equals("012")はstrがnullの場合、エラーになるため）
- StringBuilderの同値比較
	- StringオブジェクトとStringBuilderオブジェクトの比較は`"012".contentEquals(new StringBuilder("012"))`を使用する。
	- StringBuilder同士の比較はtoStringを使う。
- ObjectクラスにtoStringメソッドが定義されている
	- toStringメソッドは継承先のオーバーライドを前提にしている。
	- 独自クラスにtoStringはデフォルトでは「クラス名＋内部ID(HashCode)」が出力される。
	- toStringにフィールド値等を出力させる実装を独自にオーバーライドしてやると、デバックで役立つ。

## 文字
- 文字列リテラルはダブルクォートで囲む。
- 文字リテラルはシングルクォートで囲む。

# 第3章 数値
## 整数型をどのように使い分けるべきか。
- byte型, char型はバイト及び文字として限定して使う。
- short型, int型, long型
	- 基本的にはint型を使えば良い。
	- どうしても、int型でまかないきれない範囲を扱う場合のみlong型を使用する。
	- short型は正直、使わなくても良い。（ハードウェアリソースの節約で使いたがるかもしれないが、不具合を起こす可能性のほうが高いので止めるべき）

## 型変換
- 整数型の変換は拡大変換のみ可能（short → int, int → long)
- 縮小変換はコンパイルエラーになるが、キャストによる変換が可能
	- int → shortへの変換はビットがあふれる可能性があるために注意する。
```java
int i = 32768;
short s = (short) i; // -32768
```
	- キャストはバグを生む原因になりやすいので、なるべく使用を避ける。
    キャストを使うケースが多い場合は、型定義を間違えている可能性を疑う。

- char と byte と shortでの変換は必ずキャストが必要。
- int型のリテラルで定義した整数が代入先の型の範囲に収まっていれば、キャストなしで代入可能。（longは代入不可能）
- メソッドに引数にリテラル値を渡すときは代入先の型の範囲に収まっていても、キャストが必ず必要になる。

# 第4章 変数とオブジェクト
## 参照型変数とは
- 参照型変数のまとめ
    - 「参照」とはオブジェクトの位置情報を示す何かである。
    - 参照型変数は値として、「参照」を持つ
    - 「参照」は、その直接の値を意識することはない。
    - 結果として、参照型変数には「オブジェクトを指し示す役割」だけが残る。
- 参照型変数の型（暫定的な理解）
	- 参照型変数自体にも型が存在する。オブジェクト自身の型とは別に存在する。
	- 変数の型とは参照できるオブジェクトの種類を限定するもの

## オブジェクト生成と代入
- 参照型変数を他の変数に代入すると、代入元と代入先の変数は同じオブジェクトへの参照を持つ。
- nullは「何も参照していない」という状態を作る。
	- 未初期化状態
	- オブジェクトが存在しないことを明示
	- オブジェクトの参照を明示的になくす
- nullに対してのメソッドやフィールド呼び出しは、NullPointerExceptionを引き起こす。

## 変数の種類
- シャドーイング
	- 宣言した変数はその後でのブロック内にも有効になる。ブロック内に同名変数を定義すると、スコープが重なってしまう。（これをシャドーイングという）
	- Javaではこういったシャドーイングはコンパイルエラーになる。
- final変数
	- 普通は定数定義として使う。 
	- final変数が参照型変数の場合は、final修飾子は変数自体の値の変更（参照先の変更）を禁止させるが、参照先のオブジェクト自体の変更は可能である。
- 堅牢なプログラミングのための工夫
	- 変数は宣言と同時に初期化する（無理の無い範囲で）
	- 変数を使いまわさない（再代入は避ける）
	- 変数のスコープは小さくする
	- オブジェクトの寿命を意識する
	- 不変オブジェクトを活用する
vagrant-serverspec を使ってみたけどjenkinsでテスト失敗を取得できない

vagrantにはvagrant-serverspecっていう便利なプラグインがあって、`vagrant provision`した際にserverspecを流す事が出来る。

インストールは
`vagrant plugin install vagrant-serverspec`
でOK

こんなディレクトリ構成だとして

```
vagrant/
    Vagrantfile
spec/
    spec_helper.rb
    hogehoge/
        httpd_spec.rb
```

Vagrantfileの設定はこんな感じ。
specファイルの指定をVagrantfileからの相対パスで書く。

```:Vagrantfile
config.vm.provision :serverspec do |spec|
  spec.pattern = '../spec/hogehoge/*_spec.rb'
end
```

serverspecの設定はこんな感じ

```rb:spec_helper.rb
require 'serverspec'
require 'pathname'
require 'net/ssh'

include SpecInfra::Helper::Ssh
include SpecInfra::Helper::DetectOS
```

```rb:httpd_spec.rb
require '../spec_helper'

describe port(80) do
  it { should be_listening }
end
```

個人的にインフラCIする上でserverspecを使うときに一番面倒なのは地味にsshまわりの設定なのですが、vagrantだとそのへんを綺麗にまとめてくれるので助かる。

けど実際にjenkinsから
`vagrant provision --provision-with serverspec`
というコマンド実行してもjenkinsのビルドはsuccessで終わってしまう。
コンソール出力を見ればエラー出力はされているけど、パッと見で正常に終わったと見えちゃうと辛い。

実際に実行しても確かにexit code 0 だった。

```bash
[root@hoge]# vagrant provision --provision-with serverspec

==> default: Running provisioner: serverspec...

Port "80"
  should be listening (FAILED - 1)

Failures:

  1) Port "80" should be listening
     Failure/Error: it { should be_listening }
       expected Port "80" to be listening
     # /spec/ahogehoge/httpd_spec.rb:10:in `block (2 levels) in <top (required)>'

Finished in 15.93 seconds
1 examples, 1 failure

Failed examples:

rspec /spec/hogehoge/httpd_spec.rb:10 # Port "80" should be listening
[root@hoge]# echo $?
0
```

仕方がないのでjenkinsでは以下のようなコマンドごりごりで対応している

```bash
sudo vagrant up
sudo vagrant provision --provision-with serverspec > /tmp/serverspec
cat /tmp/serverspec.tmp
SPEC=`cat /tmp/serverspec | grep "0 failures" | wc -l`
RET=0
if [ $SPEC -ne 1 ]; then RET=1 ; fi
rm -f /tmp/serverspec.tmp

#some command
sudo vagrant halt

if [ $RET -ne 0 ]; then exit $RET ; fi
exit 0
```

(参考になれば・・)　[Jenkinsビルドの「シェルで実行」の失敗/成功を操作する](http://qiita.com/cs_sonar/items/0190d68c3856b6fd6878)

他にいい方法ないかなぁ。
DBのマイグレーション時に、changeでupとdownを表現する方法


はい。どうも。

# ちぇんじ

Railsのmigration、あるときから（3.xからだっけ）`change`というメソッドが使われるようになった。
たとえば`create_table`なんかだと、`up`の時にはテーブル作成をして、`down`の時にはおもむろにテーブルをdropしてくれる、っていう楽チン仕様だ。
だけど、たとえば`up`と`down`で行う動作が違う場合。
`up`の時はカラム追加しつつデータ移行もやりたい、だけど`down`の時はカラム削除だけ。みたいな。
これを上手く表現する方法がいまいち想像がつかなくて、結局これまで通り使える`up`と`down`で書いちゃうっていう、もやっとした感じのコードになっちゃってた。

# そこで`reversible`ですよ

なんの気なしに[Rails Guides](http://guides.rubyonrails.org/migrations.html#using-reversible)を読んでいたら、こんなことが書いてあった。

> If you wish for a migration to do something that Active Record doesn't know how to reverse, you can use reversible:

**！？**

というわけで早速書いてみた。

```ruby
class ChangeColumnTypeOfTwitterId < ActiveRecord::Migration
  def change
    reversible do |r|
      change_table :users do |t|
        r.up   { t.change :twitter_id, :integer, limit: 8 }
        r.down { t.change :twitter_id, :string }
      end
    end
  end
end
```

動くわー。まじかー。

# まとめ

作業コスト的にはぶっちゃけ`up``down`って書くのも`reversible`を使うのも変わらないと思うけど、せっかくだしreversible使うのが良いんじゃないの。
そもそも`up`と`down`は現状のRails Guidesだと、

> Alternatively, you can use up and down instead of change:

ということになってるっぽいし。

だいたいそんな感じ( ˘ω˘)
swift による hello, world

# 山程作成されてるんでしょうねえ…

```swift:ViewController.swift
//
//  ViewController.swift
//  HelloWorldApp
//

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var label = UILabel()
        label.text = "hello, world"
        label.sizeToFit()
        label.center = self.view.center
        view.addSubview(label)
    }
}
```

#実行結果
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/28376/2593cbae-45c6-6e6e-3f80-9f02ea6c8092.png)

以下の警告が出ますが、気にしなくてイイみたいです。

```
ld: warning: relocatable dylibs (e.g. embedded frameworks) are only supported on iOS 8.0 and later (@rpath/libswift_stdlib_core.dylib)
```

cf. http://stackoverflow.com/questions/24622495/relocatable-dylibs-e-g-embedded-frameworks-are-only-supported-on-ios-8-0-and

以下を参考にしました。
http://www.atmarkit.co.jp/ait/articles/1211/07/news017.html
http://gupuru.hatenablog.jp/entry/2014/06/16/191358
PHPで SJISのcsvを fgetcsv

メモ

```php:fgetcsv-sjis-to-utf8
setlocale(LC_ALL, 'ja_JP.UTF-8');
// read by sjis
$countent = file_get_contents($file -> path)
// converter
$countent = mb_convert_encoding($countent, "UTF-8", "SJIS");
// save to utf8
$temp = fopen (tempnam($file->path, date("Y-m-d_H_i_s")), "r+");
fwrite($temp, $countent);
rewind($temp);
// read
$line = fgetcsv($temp);
```
肥大化するコントローラを避ける (CakePHP 編)

**アイデア元**
[Web アプリの MVC 設計まとめ - もやし日記](http://d.hatena.ne.jp/p4life/20091014/1255532618)

**概要**

上記のリンク先の目次がそのまま解決したい課題となっています。以下に抜粋します。

* 肥大化するコントローラを避ける
* ビジネスロジックをどこに書けば良いのか
* コントローラとモデルの間にもう一つの層があるとうまくいく？

これを CakePHP で解決する方法を検討します。

**解決案 - Logic モデルを作成する**

***※ 2015-05-12 追記***
Logic コンポーネントの方がよいのでは、という議論もコメント欄でしていますので、合わせて参照下さい。

***※ 2016-07-21 追記***
下記記事にある 「Service層」のことをやりたい、という話でした。

Webアプリケーションの構成に関する予備知識 
http://qiita.com/okeyaki/items/37eb4b66bd8ef62c1fe8

検討といいつつ自分が実践している例なのですが、上記で言う「もう一つの層」となる、Logic モデルを作成します。これによりコントローラーはルーティングや初期設定＋αの処理に徹し、実際のビジネスロジックは Logic モデルに実装することで各層の粒度（ソースコード、各メソッドの行数）を均すことができます。

```
app
|-Controller
| |- UserController.php
| |- ...
|
|-Model
| |-Logic  <- これを作成する
| | |-LogicUser.php
| |- ...
|
|-View
  |-User
  | |-add.ctp
  | |- ...
  |- ...
```

**実例**

***ブートストラップ***

Logic フォルダを Model 直下に配置し、`bootstrap.php` で自動ロードの対象に含める。

```php:app/Config/bootstrap.php
App::build( array(
    'Model' => array( APP . 'Model/Logic/' ),
) );
```

***モデル***

対象のコントローラー名に `Logic` を付加したモデルを作成し、コントローラーと一対になるようにする。
（例: `UserController` がある場合は `app/Model/Logic/LogicUser.php` に `LogicUser` クラスを作成。）

ロジックモデル内にはコントローラーの対応するアクションの処理内容を `action_` プレフィックスをつけたメソッド内に記述し、コントローラーから呼び出すようにする。

```php:app/Model/Logic/LogicUser.php
class LogicUser extends Model {

	/**
	 * テーブル名（未使用時は false を指定する）
	 * @var String
	 */
	public $useTable = false;

	public function action_add( Controller $controller ) {
		// コントローラーのアクションの処理内容を記述する
		// コントローラー内で $this で利用しているメソッド、プロパティは
		// $controller で呼び出すようにする。
		// 例) $this->request->data() → $controller->request->data()
	}
...
```

***コントローラー***

コントローラーの `$uses` に対象となるロジックモデルを読み込む。
各アクションではロジックモデルの対応するアクションを読み出す。
※ ロジックモデル内でコントローラーの処理が呼び出せるように、コントローラのインスタンス `$this` をパラメータに渡すことを忘れないようにする。

```php:app/Controller/UserController.php
class CommoditiesController extends AppController {

	public $uses = array( 'LogicUser', // ... );

	public function add() {
		return $this->LogicUser->action_add( $this );
	}
...
```

***基底クラスの継承、およびビヘイビア***

モデルで共通するメソッドを実装したい場合には、基底クラスを作成して各ロジッククラスで継承するか、ビヘイビアとして別で作成して基底クラスおよび当該クラスで `$actsAs` から読み込むようにする。
※ ビヘイビアは振る舞いを実装する箇所なので、この辺りは気に入らなければ基底クラスのみを使うようにした方がよい。ただその場合は基底クラスが膨れ過ぎないように注意。

```php:app/Controller/UserController.php
App::uses( 'Model', 'Model' );

class AppModel extends Model {
	public $actsAs = array(
		'DateUtil', 'ArrayUtil', 'SessionUtil', 'MailUtil', // ...
	);
...
```

**課題や気になる点**

* モデル内でコントローラーの処理を行うのは自然ではないのでコンポーネントを利用した方がよいのかもしれない。ただビジネスロジックはモデルに近い位置にあるし、ロジックモデルとした方がしっくりくる。
* 複数のコントローラーから呼び出すためのロジックモデルはまだ想定されておらず、命名規則もない。参考URLのアイデアに沿うならばサービスモデル `ServiceHogehogeModel` を作成することになるか。

**まとめ**

まだ完成した形ではないですが、この方式によりコントローラーはだいぶすっきりして見通しがよいコードになりました。
もっとこうした方がいいとかこれはマズいとかあれば、指摘頂けると幸いです。
curl と jq でサクッと RubyGems 名を探す

curl + jq という割りと鉄板ネタの応用ですが、、、
RubyGems をつくろうと思った時に一番はじめにぶち当たる壁は
**gem の名前決め** じゃないでしょうか。

そんな時に

* 思いついた名前が登録済みか調べたい
* 関連キーワードから gem 名を一覧したい

という上記2点を curl と jq の併用でサクッと実現できます。


"sns" という名前で探す場合のコマンド例
```
$ curl -s -S 'https://rubygems.org/api/v1/search.json?query=sns' | jq '.[].name'
```

`grep` 等で検索文字列をハイライトするとさらに便利になりますね。
![qiita_curl_jq_rubygems_search.png](https://qiita-image-store.s3.amazonaws.com/0/23043/afa986eb-8350-10a3-9703-00ce20dfb984.png)

もっとスマートな方法があれば教えてください！

※rubygems.org に登録されていない gem もたくさんあるので参考程度で利用するイメージです。
『情報科学入門―Rubyを使って学ぶ』第9章で、view.rb のグラフ表示が表示されないときの対処法


![cover.jpg](https://qiita-image-store.s3.amazonaws.com/0/26536/e1da6040-028e-fddc-3435-f6024ba1172b.jpeg)

『[情報科学入門―Rubyを使って学ぶ](http://www.amazon.co.jp/dp/4130624520/)』（増原英彦、東京大学情報教育連絡会 著）


の「第9章 再帰データ構造」
で使う、view.rb を[サポートページ](http://lecture.ecc.u-tokyo.ac.jp/johzu/joho-kagaku/text/)の[配布プログラム](http://lecture.ecc.u-tokyo.ac.jp/johzu/joho-kagaku/text/code/)からダウンロードして使っても、有向グラフが表示されませんでした。


view.rbをみると；
`dotPathInMacOSX = "/Applications/Graphviz.app/Contents/MacOS/Graphviz"`
という記述があるので、
データ構造を表すグラフ表示をさせるには（少なくともMacでは）、[Graphviz](http://www.graphviz.org)がアプリケーションフォルダにインストールされている必要があるようです。

　
GraphvizのMacへのインストールは、Homebrewを使ってインストールすることもできるようですが、[公式サイトのダウンロード](http://www.graphviz.org/Download_macos.php)でMac用のバイナリが配布されていたのでこちらの方が手軽かもしれません。

上記サイトから、Mountain Lion用のgraphviz-2.36.0.pkgをインストールしたところ、OS X 10.9.4 Mavericksでも問題なくグラフ表示ができました。

　
####参考）
→・[『情報科学入門―Rubyを使って学ぶ』を読むのに必要なソフト一覧 - noanoa 日々の日記](http://blog.livedoor.jp/noanoa07/archives/1992376.html)
Rubyで使う機会があれば嬉しい「乙な」メソッドたち


##背景
* [Coderbyteのプログラミング問題](http://coderbyte.com/CodingArea/Challenges/)をやっていて、他の人の解法で遭遇したメソッドたち。
* 使う機会があればかなり嬉しい、乙なメソッドを集めたつもりです。
* 順次追加します。

--

#String

###count(letter) -> int
* 文字列に対して呼ぶと、letterで指定した文字が何個存在するか教えてくれる
* letterに二文字以上の文字列を入れると、一文字ずつ検索して、全部合算した個数を教えてくれる

```
"word of string".count "o" #=> 2
"word of string".count "wo" #=> 3
```

###next -> new_str
* 文字列が持つ英数字の中で一番右端の一文字を、 __"アルファベット/10進数の数字の並び順で次にあたる文字"に変更する__
* succでも呼べる 

```
"9".next #=> "10"
"hello".next #=> "hellp"
```

#Array

###permutation(n) -> enum
* 与えられた配列から、 __順番を並び替えた新しい配列を作れるだけつくり__、それらを二次元配列として格納して返す。
* 引数で数字を渡すと、 __その数字を配列の長さとしたときに作成可能な配列を返す__。
* (数学に慣れている人への説明: 「順列」)

```ruby
[1,2,3].permutation.to_a    #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
[1,2,3].permutation(2).to_a #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
```

###combination(n) -> enum
* 与えられた配列から、 __順番を無視して、n個の長さとして作成可能な新しい配列をつくり__、二次元配列で返す。
* (数学に慣れている人に取っての: 「組み合わせ」)

```ruby
[1,2,3].combination(3).to_a #=> [[1,2,3]]
[1,2,3].combination(2).to_a #=> [[1,2],[1,3],[2,3]]
```
Ubuntu の長期サポート版 (LTS) をアップグレードする

今日はいつもと趣向を変えて [Ubuntu 14.04 LTS Trusty Tahr](http://www.ubuntu.com/) を導入する話です。 2014 年 4 月 17 日に Ubuntu 14.04 LTS がリリースされてから執筆時点で約 3 ヶ月経ちました。 Ubuntu Japanese Team の連載記事では大抵いつも [xx.04.1 LTS リリース後に導入したほうがオススメ](http://gihyo.jp/admin/clip/01/ubuntu-topics/201404/18)といったことが書かれているのですが、この 3 ヶ月でデータ分析用の環境に導入したり仮想環境や物理環境で検証を進めたこともあり、特に Ubuntu 12.04 LTS からのアップグレードをすることを前提に導入について触れたいと思います。

## アップグレードの準備をする

以前の Ubuntu であれば LTS Upgrade も失敗するようなこともあったのですが、最近のリリースではかなり安定性が高くなってきています。とはいえハマりどころもあります。これだけをしておけば万全というわけではありませんが、まず気をつけるべき事柄を列挙します。

### システムを最新にする

アップグレードを試す前に必ずシステムを最新の状態に保っておく必要があります。[以前の記事](http://qiita.com/ynakayama/items/24acb6eaa11b869eaa3e)でも触れた通り、セキュリティ上の理由で日常に自動的なシステム更新をしているでしょうから、通常であれば必要は無い作業です。何らかの理由で自動更新をしていない場合は手動で最新にします。執筆時点で Ubuntu 12.04.4 LTS になっているはずです。

### 既定以外の環境を除去する

筆者は[以前も書いた](http://qiita.com/ynakayama/items/2a4d4802c93eb5c40eab)通りプログラミング言語については必ず /opt 以下にビルドインストールすることにしています。これは /usr や /usr/local の下に既定以外のバージョンのプログラミング言語を導入した場合、システム全体の動作が変わってしまうおそれがあるためです。たとえば Python 3.x 系を使うために apt でパッケージを導入していた場合、 do-release-upgrade が異常終了してしまうので apt-get remove するなどして取り除かなければならなくなります。こういったトラブルにもつながりますから、システム管理者が手動で追加するソフトウェアはできるだけ /usr 配下ではなく /opt といった別のディレクトリに導入することを強くおすすめします。詳細は [Filesystem Hierarchy Standard](http://www.pathname.com/fhs/) を参照してください。

### 十分なストレージ空き容量を確保する

/usr などに十分な空き容量が無いとアップグレードが失敗してしまうことがあります。足りない場合は不要なデータを削除したり [LVM の構成を変更する](http://qiita.com/ynakayama/items/74096212b8177234be8a)などして対処します。

### リリースノートに目を通す

導入前に[リリースノートを読む](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0321)のは基本中の基本です。今回は LTS アップグレードを想定していますから、システム管理者が触っていない部分やそもそも使ってない部分の変更点はほぼ気にしなくても良いのですが、アプリケーションが依存している部分に変更点があった場合は注意を払う必要があります。とはいえデータ分析の場合、導入するものといえばプログラミング言語とせいぜいミドルウェア程度でしょうし、前述したとおり /opt といったディレクトリに独立してインストールしているのであれば、 GNU/Linux ディストリビューションの環境の変化が問題になることはほとんど無いと思います。

### バックアップを取得する

これも[以前書いた](http://qiita.com/ynakayama/items/f4d8070130c964d53400)通り重要なデータを障害に備えて自動バックアップするのは基本ですから、改めて何かしないといけないといった必要に迫られることはほとんど無いはずです。

## アップグレードする

アップグレードは非常に簡単です。基本的に次のコマンドを入力するだけです。

```
sudo do-release-upgrade -d
```

途中いくつかの対話的な質問が表示されますのでそれに応答します。

## アップグレード後に設定をする

システムをアップグレードして再起動したあと、新しいバージョンにあわせてソフトウェアの設定をする必要に迫られることがあります。

多くの情報が次のサイトにありますので参照すると良いでしょう。

Ubuntu 14.04 LTS をインストールした直後に行う設定 ＆ インストールするソフト
http://www.k5.dion.ne.jp/~r-f/sicklylife/memo/ubuntu1404/settings.html

デスクトップを使っている場合、[特に日本語入力まわりでは注意が必要](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0319)です。

## まとめ

Ubuntu の長期サポート版アップグレードについて触れました。データ分析をしたりアプリケーションを稼働させる環境は長く安定したサポートが提供されていることも大切なのですが、アップグレードを続けていても変わりなく使い続けることができることも重要です。その点 Ubuntu ならば 2 年毎にメジャーアップデートしても安定して使い続けることができますから安心です。
RailsでBULK INSERTしたい


Rails等のActive recordでBULK INSERを使うときに、activerecord-importという便利なものがある。

github https://github.com/zdennis/activerecord-import

```rb
gem "activerecord-import"
```

上記のgemで
importメソッドができ、BULIK INSERTすることができる。

```rb
users = []
100.times do |i|
  users << User.new(name: "sample_#{i}")
end
User.import users
```
AFNetworking2.x サーバーレスポンスエラー時にステータスコードを取得する.

NSURLSessionDataTask.responseから取得できるっぽい。


```objc
-(void)loginTest
    AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    NSDictionary* parameters = @{...}; // 認証に必要な情報を設定
    [manager POST:@"http://IPアドレス/login"
    parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
        // ログイン成功!!
        [self logined];
    } failure:^(NSURLSessionDataTask* task, NSError* error) {
        // エラー
  
        // レスポンスのステータスコードを取得.
        NSHTTPURLResponse* response = (NSHTTPURLResponse*)task.response;
        // 認証失敗!!
        if( response.statusCode == 401 ) {
            [self showMessage:MessageIdInvalidUserIdOrPassword];
        // その他のエラー
        } else {
            NSLog(@"loginPhase2 error:%@", error);
        }
    }];
}
```

参考

- stack overflow [is there an easy way to get the http status code in the failure block from AFHTTPClient?](
http://stackoverflow.com/questions/8469492/is-there-an-easy-way-to-get-the-http-status-code-in-the-failure-block-from-afhtt)
ifconfig eth1 ≒ ip addr show eth1



```console
$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 08:00:27:5b:c6:28
          inet addr:192.168.0.5  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2945 (2.9 KB)  TX bytes:12307 (12.3 KB)
```

```console
$ ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:5b:c6:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.5/24 brd 192.168.0.255 scope global eth1
       valid_lft forever preferred_lft forever
```
Vim 初心者ガイド

## コマンドを使いこなして、素早く編集

[前回](http://qiita.com/marrontan619/items/dc99db67cf4c0a25a327 "Vimスタートガイド")はVimの基本的な使い方を書いたが、ここではVimを便利だと感じるような、よく使うコマンドを書いていく。

「それくらい大抵のエディタやIDEでもできるよ。」と思うかもしれないが、重要なのは「ササッと起動して、パッと編集できる」こと。  
(使い込めば、よくできたIDE並みの性能も発揮できるらしい。)  
場面に応じて使っていこう。

これさえ覚えれば便利に使えるレベルのものをまとめる。

以下は、全てノーマルモードでの操作

## カーソル移動

| 動作 | コマンド |
| --- | -------: |
| 指定行へ | (行数)G |
| ファイルの先頭へ | gg |
| ファイルの末尾へ | G |
| 行頭へ | ^ |
| 行末へ | $ |
| "hogehoge"がある場所へ（文字列検索） | /hogehoge |

次のコマンドは概念が共通しているので、まとめて覚えよう。  
数字 + コマンドで、数字分だけ飛ぶことも可能。  
e.g. 5w -> 5つ先の単語へ

| ○○へ | コマンド | 覚え方 |
| ----- | :------ | ---- |
| 次の単語（先頭） | w | word |
| 次の単語（末尾） | e | end |
| 前の単語 | b | back |
| 次の文字 | l | letter |
| 上 | k |   |
| 右 | l |   |
| 下 | j |   |
| 左 | h |   |

最近のPCはだいたい十字キーがついてるので、上下左右は手を動かすのがよほど面倒で無ければ覚える必要なし。  
最初に覚えるコツは、人差し指と中指に上下差を作って配置してみること。

## コピー&ペースト
コピペと言っても、クリップボードを使うのではなく、バッファを利用したもの。
「ヤンク」と呼ばれている。

① 操作

| 動作 | コマンド |
| --- | -------: |
| ヤンク | y |
| 削除 & ヤンク | d |
| カーソル位置より右にペースト | p |
| カーソル位置より左にペースト | P |
  
感覚的には、Pの方が普段使っている貼り付けの動作に近いだろう。

② 単位

| 単位 | コマンド |
| --- | ------: |
| 行    | y |
| 単語   | w |
| 文字   | l |
| 行末まで | $ |
| 行頭まで | ^ |

大まかな操作の流れは

1. ①から操作を選ぶ
2. 数字で範囲を選ぶ（1の場合は省略可能）
3. ②から選択したい単位を選ぶ

e.g.   
カーソル位置の行の内容を、1行上にずらす  
    dd → k → P  
    
カーソル位置から5単語文の内容を、ファイルの末尾にコピペする  
    y5w → G → p

とりあえず、サクサク作業するのに必要なコマンドはこれだけ。
[次回](http://qiita.com/marrontan619/items/541a1374e1ac672977e6 "Vim 設定ガイド")は、快適にVimを使うための設定について書く予定。
Vimスタートガイド

メモがてら、よく使うvimの設定やコマンドを書いていこうと思う。
色々な事ができるらしいが、私は主に、ササッとファイルの編集をしたいときなどに使う。
vimの全てを書くのではなく「役に立つ」、「使いやすい」の感覚までを目指して。

## vimって何？
コンソール上で動くテキストエディタ。
gitの標準core.editorにもなっているので、guiツールを使わない変態には必須。
愛されている。

## 使い方
    $ vim <filename>
これだけ。そのファイルがない場合は、保存すれば新規ファイルになる。

## モードの概念
正確にはもう少しあるが、大きく分けてコマンドモードと挿入モードがある。
ちなみにカーズ様は光のモード。

* 挿入モード
普通のテキストエディタのように、文字を入力するモード。特に解説も不要だと思うので割愛。

* コマンドモード
入力に対応した操作を実行してくれるモード。
挿入モードからescキーを押すことで起動する。
ここから更に":"を入力すると、exモードに突入する。
最低限必要なコマンドを書いておくと

    * :w    保存。
    * :q    終了。
    * :q!   変更を保存しないで終了。
    * :wq   保存して終了。要するにwとqを同時に行う。
    * ZZ    保存して終了。


これだけじゃイマイチわからないだろうから、実際に適当なファイルを作ってみる。
 
1. $ vim foo                #これでvimが起動。
2. "i"を入力                #挿入モードに 。
3. "bar"と入力              #テキストを入力。
4. esc, :wqの順に入力       #内容を保存して終了する。ZZでも可。

これで"bar"と書かれたfooという名前のファイルが出来る。

ここまでだと、ただのめんどくさいエディタなので、本題は[次回](http://qiita.com/marrontan619/items/94228ff809f01198b613 "Vim 初心者ガイド")から。
CoreDataで１対多関連の小要素を完全に削除する

ドキュメントを参照すればもっと楽に解決するかもしれませんが、１対多の小要素の削除方法のメモです。(MagicalRecordも利用しています）

# １対多で小要素を削除したとき

```objc

    // 親要素
    Parent* parent = [Parent MR_createEntity];
    parent.name = @"p1";
    
    // 小要素
    Child* child1 = [Child MR_createEntity];
    child1.name = @"c1";
    Child* child2 = [Child MR_createEntity];
    child2.name = @"c2";
    
    [parent addChildrenObject:child1];
    [parent addChildrenObject:child2];
    
    NSLog(@"count=%d", parent.children.count); // 2
    
    // 全ての子要素を削除する.
    while( parent.children.count > 0 ) {
        Child* c = (Child*)[parent.children anyObject];
        // parentから関連を削除する
        [parent removeChildrenObject:c];
        // CoreData上からも削除する
        [c MR_deleteEntity];
    }
    
    NSLog(@"count=%d", parent.children.count); // 0.
    
    NSArray* children = [Child MR_findAll];
    NSLog(@"count=%d", children.count); // 0.

```


## NG case [Parent removeChildrenObject:child]で削除する.

Parentに関連付くChildrenオブジェクトを、parent removeNSManagedObjectにて削除すると、parentからは削除されるけど、CoreDataからは削除されない。

```objc
    Parent* parent = [Parent MR_createEntity];
    parent.name = @"p1";
    Child* child1 = [Child MR_createEntity];
    child1.name = @"c1";
    Child* child2 = [Child MR_createEntity];
    child2.name = @"c2";
    
    [parent addChildrenObject:child1];
    [parent addChildrenObject:child2];
    
    NSLog(@"count=%d", parent.children.count); // 2
    
    // ここで小要素を削除
    [parent removeChildren:parent.children];
    
    NSLog(@"count=%d", parent.children.count); // 0. parentからは削除される
    
    NSArray* children = [Child MR_findAll];
    NSLog(@"count=%d", children.count); // 2. CoreData上には残っている。
```
カレントディレクトリのxcodeプロジェクトを簡単に起動させたい


**注意** oh-my-zshでxcode pluginを導入すれば `xc` で同じ挙動になりました。
以下は不要です。すいません。(2014/11/4追記)
　

[ghqを使いGoっぽくリポジトリを管理させて頂いて](http://qiita.com/abe00makoto/items/7ac8ce6bd4d09f56850d)幸せなんですが
gh-openを使って移動した後に簡単にxcodeから該当プロジェクトを開きたいと思いました。

で以下を.zshrcに追記しました


```zsh:~/.zshrc

setopt nonomatch

function xcopen() {
    local xcp
    local xws
    xcp=$(\ls -d *.xcodeproj 2>/dev/null )
    xws=$(\ls -d *.xcworkspace 2>/dev/null )
    if [[ $xws != '' ]] ; then
        echo "try open $xws" ;
        open $@ $xws;
    else
        if [[ $xcp != '' ]] ; then
            echo "try open $xcp" ;
            open $@ $xcp;
        else
            echo "this is not xcode project...\n"
        fi
    fi
}

alias xco='xcopen -a /Applications/Xcode.app'

```

```xcopen``` で
project.xcworkspaceがあればそっちを開き、なければproject.xcodeprojを開きます。

Xcode betaを入れるとbetaで開こうとするので
```xco```か```xcopen -a /Applications/Xcode.app``` でXcode.appで開きます
Sequel(ruby)+JDBC(Oracle)でDB接続する方法

大人の理由から、RubyからJDBCを使ってDB接続しなきゃならん時が出てくると思いますので、その方法を書いておきます。

構成

```
Gemfile
example.rb
ojdbc14.jar
```

※`ojdbc14.jar`は、Oracle JDBC thin (type 4) Driverです。OTNからダウンロードしてきてください。

```:Gemfile
ruby "1.9.3", :engine => "jruby", :engine_version => "1.7.13"
source "https://rubygems.org"
gem "sequel"
```

```example.rb
require "sequel"
require "./ojdbc14.jar"
DB = Sequel.connect('jdbc:oracle:thin:USER/PASS@//DBHOST:1521/SERVICE')
puts DB.from("V$VERSION").all
```

実行結果

```
$ bundle exec ruby example.rb
{:banner=>"Oracle Database 10g Release 10.2.0.5.0 - 64bit Production"}
{:banner=>"PL/SQL Release 10.2.0.5.0 - Production"}
{:banner=>"CORE\t10.2.0.5.0\tProduction"}
{:banner=>"TNS for Solaris: Version 10.2.0.5.0 - Production"}
{:banner=>"NLSRTL Version 10.2.0.5.0 - Production"}
```

ポイント

1. JRubyの上で動きます
1. `ojdbc14.jar`だけあれば、JDBC接続可能
2. `Sequel.connect`の`@`以降に指定できる接続文字は、TNSNAMESの他、簡易接続ネーミングが使用可能

そんなところです。
VMware ESXi 5.X をコマンドラインから操作する #VMWare

#目的
VMWareの作成をGUIからではなく、コマンドラインからの操作をする。

#どうすればできる？

VIX API を使えばできるようです。

>The VIX API helps you write scripts to automate virtual machine operations and manipulate files within guest >operating systems. 
>VIX programs run on different systems and support management of vSphere, Workstation, Player, and Fusion. 
>Bindings are provided for C, Perl, and COM (Visual Basic, VBscript, C#).

# できるようにした

CentOS6.5でできるようにしました。

ダウンロード
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0|PLAYER-600-A|drivers_tools

```
sudo sh VMware-VIX-1.13.0-1295980.x86_64.bundle
```

以下のようなエラーが出るので、シンボリックリンクを張って回避。
 SSLLoadSharedLibraries error Failed to load OpenSSL libraries. libdir is /usr/lib/vmware

```
ln -s /usr/lib/vmware-vix/Workstation-10.0.0-and-vSphere-5.5.0/64bit /usr/lib/vmware
```

参考：http://virtlab.wordpress.com/2013/11/23/vmware-vix-1-13-and-the-sslloadsharedlibraries-error/

#できること

1.Power Commands
2.Snapshot Commands
3.Guest Operating System Commands
4.Maintenance Commands
5.VProbes Commands

マシンの起動、停止、スナップショットの取得、ゲストOSへのコマンドの実行などはできそうなのですが、
マシンを新しくつくる、ということができなさそう。
＋現在あるマシンからcloneを作成しようとしても、そのようなオペレーションはサポートされていないというエラーがでてしまう。

参考：https://www.vmware.com/support/developer/vix-api/vix112_vmrun_command.pdf
参考：http://www.virtuatopia.com/index.php/Controlling_VMware_Virtual_Machines_from_the_Command_Line_with_vmrun


#サンプルコマンド

-リスト表示

```
 vmrun -T esx -h 192.168.X.XX -u <user> -p <password> list

Total running VMs: 2
[ha-datacenter/hdd] vm01/vm01.vmx
[ha-datacenter/hdd] vm02/vm02.vmx
```

スナップショットを取得
```
vmrun -T esx -h  192.168.X.XX -u <user> -p <password>  snapshot "[ha-datacenter/hdd] vm01/vm01.vmx" mysnapshot
```

取得したスマップショットの表示
```
vmrun -T esx -h 192.168.X.XX -u <user> -p <password> listSnapshots "[ha-datacenter/hdd] vm01/vm01.vmx"
Total snapshots: 1
mysnapshot
```

-clone
```
vmrun -T esx -h 192.168.X.XX -u <user> -p <password>  clone  "[ha-datacenter/hdd] vm01/vm01.vmx"  "[ha-datacenter/hdd] test/test.vmx" full
```
これが、オペレーションがサポートされていないとでてしまう。。

-削除
```
vmrun -T esx -h 192.168.X.XX -u <user> -p <password>  deleteVM  "[ha-datacenter/hdd] vm01/vm01.vmx"
```

#ほんとにやりたいことは

仮想環境をコマンドラインからつくりたいのですが。。

これ、知っている人がいたら、教えてください！

#（ちょっと宣伝）東洋経済オンラインで連載はじめました

毎週日曜日の夜18時更新です〜。

http://toyokeizai.net/articles/-/42540

![img_6027d31591e9809474754482881bf99a85306 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/b9bf4e42-3835-53f5-838b-53ca0f1c1b48.jpeg)

応援よろしくおねがいします。
Chromeで日本語入力を禁止する

##Chromeで日本語入力を禁止したい
・IEやFFと同じようにChromeで日本語の入力を禁止したい
・ChromeはCSSのime-mode:disabledに対応していない
・「とにかくヤレ」と神の声を賜ったので、JavaScriptで頑張ってみる

>2015/9/17編集
>masa-kunikataさんアドバイスの正規表現方式に変更。
>textareaで改行・タブもとおるようにしました。

```js:filter_mbc.js
jQuery(document).ready(function() {
	
    // ime-modeが使えるか
    var supportIMEMode = ('ime-mode' in document.body.style);
	
    // 非ASCII
    var noSbcRegex = /[^\x00-\x7E]+/g;

    // 1バイト文字専用フィールド
	jQuery('.sbc_field')
	.on('keydown blur paste', function(e) { 
		
        // ime-modeが使えるならスキップ
        if (e.type == 'keydown' || e.type == 'blur')
            if (supportIMEMode) return;
		
        // 2バイト文字が入力されたら削除
        var target = jQuery(this);
        if(!target.val().match(noSbcRegex)) return;
        window.setTimeout( function() {
          target.val( target.val().replace(noSbcRegex, '') );
        }, 1);        
        
	});
	
});
```

```css:test.css
.sbc_field { ime-mode: disabled; }
```

```html:test.html
<input type="text" value="abcde" class="sbc_field" />
```

##デモ
[Demo](http://jsfiddle.net/tgenstake/oz6s3de9/94/)はこちら

●確認した環境
Chrome 36b
Internet Explorer 10
Firefox 30
（Windows 7）

●自賛
IMEが有効でもテンキーで数字の入力はできる
（先にevent.keyCodeの監視で書いてました）

●欠点
一瞬チラチラみえてかっこわるい
リモートブランチの内容を最新にして、masterにcheckoutして、masterの内容を更新して、masterにmerge済みのbranchを消すのを.gitconfigに書いた


プルリクをMergeした後とか、久しぶりに作業する時に、毎回以下のようなコマンドを手で打ってたのですが、いい加減にめんどくさくなって来たので、作ってみました。

ネットの情報を見ずに自分で適当にやってみたので、もっと良い書き方とかあれば教えて下さい〜。

#### `.gigconfig`

```.gitconfig
[alias]
    delete-merged-branches = !git branch --merged | grep -v \\* | xargs -I % git branch -d %
    up = !git fetch -p && git checkout master && git pull origin master && git delete-merged-branches
```

#### 使い方
```sh
git up
```


こんな感じです。`delete-merged-branches`の部分は、

- [Git でマージ済みのブランチを一括削除する](http://qiita.com/kyanny/items/10a57a4f1d2806e3a3b8)

こちらを参考にさせて頂いてます。
管理画面で使ってたTwitterBootstrapを2系から3系にアップデートした話


クラス名やコンポーネントのタグ構成など根本的に変わってる箇所があり修正が大変でした。
今回は管理画面でTwitterBootStrapを使っていたので、どの管理画面もおそらく使っているようなコンポーネントは似たようなもんだと思うので、参考になればこれ幸い。
先人様がBootstrap3移行ガイドを書いてくれているので、コード量が多い場合はURLを記載しておくのでそちらを参考にしてください。

```css:before
TwitterBootstrap.version2{
	value:2系のソースコード;
}
```
```css:after
TwitterBootstrap.version3{
	value:3系のソースコード;
}
```


### グローバルバビゲーション(ヘッダーメニュー)
まず最初に目についたのがグロナビが落っこちてた。
http://cccabinet.jpn.org/bootstrap3/components1.php#navbar-default

要素の構成はそれほど変わってないが、クラス名が9割変わってた。死にたい。

### パンくずリスト
リストに表示されるスラッシュがなんか多い…仕切りに使ってたタグがいらなくなった。

```css:before
<ul class="breadcrumb">
  <li><a href="#">ホーム</a> <span class="divider">/</span></li>
  <li><a href="#">ライブラリ</a> <span class="divider">/</span></li>
  <li class="active">データ</li>
</ul>
```
```css:after
<ul class="breadcrumb">
  <li><a href="#">ホーム</a></li>
  <li><a href="#">ライブラリ</a></li>
  <li class="active">データ</li>
</ul>
```

### リストグループ(サブメニュー)
以前はul liタグで作っていたけどもうタグの種類も変わってる。
何もかも変わってる。	

```css:before
<ul class="nav nav-tabs nav-stacked">
  <li class="active"><a href="#">ホーム</a></li>
  <li><a href="#">プロフィール</a></li>
  <li><a href="#">メッセージ</a></li>
</ul>
```

```css:after
<div class="list-group">
  <a href="#" class="list-group-item active">ホーム</a>
  <a href="#" class="list-group-item">プロフィール</a>
  <a href="#" class="list-group-item">メッセージ</a>
</div>
```

### 入力フォーム
水平フォームなどに利用するcontrol-groupクラス名が変更された。
http://cccabinet.jpn.org/bootstrap3/css.php#basic-form

```css:before
<form class="form-horizontal">
	<div class="control-group">
		<label class="control-label" for="text">名前</label>
		<div class="controls">
			<input type="text" id="Name" placeholder="名前">
		</div>
	</div>

	<div class="control-group">
		<div class="controls">
			<button type="submit" class="btn">送信</button>
		</div>
	</div>
</form>
```

```css:after
<form class="form-horizontal">
	<div class="form-group">
		<label class="col-sm-2 control-label" for="text">名前</label>
		<div class="col-sm-10">
			<input type="text" id="Name" placeholder="名前">
		</div>
	</div>

	<div class="form-group">
		<div class="col-sm-offset-2 col-sm-10">
			<button type="submit" class="btn">送信</button>
		</div>
	</div>
</form>
```

### アイコン(グリフアイコン)の設定の仕方

```css:before
<button type="button" class="btn">
  <i class="icon-star"></i> Star
</button>
```

```css:after
<button type="button" class="btn btn-default">
  <span class="glyphicon glyphicon-star"></span> Star
</button>
```
アイコン一覧はこちら
http://cccabinet.jpn.org/bootstrap3/components1.php#icon2

### グリッドシステム

クラス名に指定していたspan2やspan10が変更されてる。
http://cccabinet.jpn.org/bootstrap3/css.php#grid


```css:before
<div class="span2"></div>
<div class="span10"></div>
```

```css:after
<div class="col-md-2"></div>
<div class="col-md-10"></div>
```

まだたくさん対応しなければならない所はあるんでしょうが、目立ったのはこんなもんでした。
フォームの数が多いのでお刺身タンポポ的な作業でもめちゃしんどい…。
Material Design風のQiitaアプリ（Android）作ったよ！


## はじめに
すきま時間に手軽にQiitaの投稿を閲覧できるアプリを作りました。本稿では、デザインのポイント等を簡単に紹介します。iPhone版もいずれ出したいなと思っています。

アプリのURLはこちら
https://play.google.com/store/apps/details?id=com.appspot.parisienneapps.qiita&hl=ja


## 機能一覧
* すべて／登録したタグの新着投稿を表示する機能
* 自分のストックした投稿を表示する機能
* 投稿の検索機能
* ユーザ別の、投稿／ストックした投稿を表示する機能
* タグ別の投稿を表示する機能
* （ログイン時）投稿のストック／解除をする機能


## デザインのポイント
### 配色
Material Designのカラーパレットにある色を使いました。
http://www.google.com/design/spec/style/color.html

メインで使用した色は以下のとおりです。

* Cyan
* Lime
* Teal
* Gray


### アクションバー
画面ごとに ActionBar の色とアイコンを変えてみました。他のアプリにはない特徴的な点ではないかと思います。色は、前述の Cyan, Teal, Gray を使用しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/39324/6c324f99-410d-e146-daf2-14322decaaf6.png "promo.png")


### タブ
タブのインディケータを細めにしています。Material Design のサンプル画面にあったものを参考にしています。
http://www.google.com/design/spec/components/tabs.html#tabs-usage

ライブラリはこちらを使用しています。
https://github.com/astuetz/PagerSlidingTabStrip

![promo2.png](https://qiita-image-store.s3.amazonaws.com/0/39324/becee9c2-33e8-2424-4c9c-ddead64edd93.png "promo2.png")


### 引っ張って更新
Support Library revision 19.1.0 で追加された SwipeRefreshLayout を使用しています。こちらも Material Design のカラーパレットにある色をしています。4色を選ぶのが難しいですね。。 

導入にはこちらのページが参考になると思います。
http://dev.classmethod.jp/smartphone/swiperefreshlayout/

![promo3.png](https://qiita-image-store.s3.amazonaws.com/0/39324/51507ff3-794b-8954-b538-98677dae57b0.png "promo3.png")



### 文字サイズ
Material Designの文字サイズの基本セットのうち 12sp, 14sp, 16sp を使いました。
http://www.google.com/design/spec/style/typography.html#typography-roboto



### アニメーション
画面切り替えに、 fadein、right-slidein、right-slideout を使用しています。


## 最後に
アプリに関してのご質問・ご要望などありましたらコメントをお願いいたします！
同一のアクション内で複数モデルのページネーションを実装する


HogeModelとFugaModelのページネーションをindexアクションに実装する。

paginate['Hoge']にページネートの条件を追加してからpaginate('Hoge')メソッドを呼び出して、次のFugaを同様の手順でページネートしようとすると、結合条件やLimitが反映されなかったりした。
そのためHogeとFuga要素に条件を追加してからpaginate('Hoge') paginate('Fuga')を呼ぶ必要がある。

```PHP:SampleController.php
<?php
	class SampleController extends AppController{

		public $uses = array('Hoge', 'Fuga');
		public $paginate;

		public function index(){
			$hogePaginate = $this->Hoge->getPaginate();
			$fugaPaginate = $this->Fufa->getPaginate();
			$this->paginate['Hoge'] = $hogePaginate['Hoge'];
			$this->paginate['Fuga'] = $fugaPaginate['Fufa'];
			$this->set('hoge', $this->paginate('Hoge'));
			$this->set('fuga', $this->paginate('Fufa'));
		}

	}
?>
```

```PHP:Hoge.php
<?php
	class Hoge extends AppModel{
		public $name = 'Hoge';

		public function getPaginate(){
			'Hoge'	=> array(
				'fileds' => array(
					'Hoge.*'
				),
				'limit' => 10
			)
		}
	}
?>

```

```PHP:Fuga.php
<?php
	class Fuga extends AppModel{
		public $name = 'Fuga';

		public function getPaginate(){
			'Fuga'	=> array(
				'fileds' => array(
					'Fuga.*'
				),
				'limit' => 10
			)
		}
	}
?>

```

上記のコードが動くかどうかは未検証です。
もっとスマートな方法があればコメントにて教えていただければ小躍りします。
bcache

SSDをHDDのキャッシュに使えるkernelモジュール。
3.10から入った。(CentOS7には無い)

* /lib/modules/`uname -r`/kernel/drivers/md/bcache/bcache.ko.gz

```bash:インストール
yum install -y gcc libblkid-devel
git checkou http://evilpiepirate.org/git/bcache-tools.git
cd bcache-tools
make
```

専用パーティションをHDDとSSD側に用意する必要がある。
HDDが / に全部割り当てていてpartedで稼働中に変更が出来ないため断念。

SSDに普通にlinuxインストールしました。

bcacheの手順は
[Bcache を使って SATA ドライブを速くする方法](https://jp.linux.com/news/linuxcom-exclusive/413722-lco20140225)
でいけるとおもう
KotlinでのTimer,TimerTask


ソースコードは https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/concurrent/Timer.kt で、以下の様に使えた。

```kotlin
timer(initialDelay = 1000, period = 1000) {
    System.out.print("hello")
}
```

良い感じ。
ChromeAppsをCoffeeScriptで書くためにYeoman generator作りました。

ちなみにCoffeeScriptだけではなく
htmlにはjadeを
cssにはstylusを
jsonにはyamlを
使えるようにし

煩わしい囲み忘れともおさらばです。

そして皆大好きgulp(coffee)でビルドします。

あと物のついでにChromeAppStoreに上げるためのzipを作るために
package taskも用意しときました。

ただgulp初心者なのでwatchはどうするのかな〜と調べてるところです。

Repository: https://github.com/k2wanko/generator-chromeapp-coffee

# インストール

`npm i -g yo bower gulp`
`npm install -g generator-chromeapp-coffee`

# セットアップ
`mkdir my-chrome-project && cd $_`
`yo chromeapp-coffee`

# とりあえずコンパイル
`gulp`


あとはchromeのツール>拡張機能>パッケージ化されていない拡張機能を読み込むで
project内のappディレクトリを指定してあげればOKです。

#予定
とりあえずwatchは必須ですね。

あとはgulp-ccaができるか作れるかすればmobile chrome appsにも対応したいところです。

####追記(2014/7/14)
gulp.watchは別に難しくなかった
DXGIのAlt+Enterによるフルスクリーンモードへの移行を無効にする方法

D3D11CreateDeviceAndSwapChainを呼び出した後を想定します。
コピペで動くようなコードではないのでご注意下さい。

```cpp
// 以下の変数は設定済みと仮定
// IDXGISwapChain *psc;
// HWND hWnd;

//---------------------------------
// D3D11CreateDeviceAndSwapChain を呼び出した後のコード
HRESULT hr;
IDXGIFactory* pfac = nullptr;
hr = psc->GetParent( __uuidof( IDXGIFactory ), (void**)&pfac );

// エラー処理
if( !dxgi_error_test( hr ) ) return; 
if( !pfac ) return;

// 余計な機能を無効にする設定をする。
pfac->MakeWindowAssociation( hWnd, DXGI_MWA_NO_WINDOW_CHANGES 
                                             | DXGI_MWA_NO_ALT_ENTER );

```
#解説とか#
##そもそものやりたいこと##
Directx11を使ってプログラムを書いてたら、
Alt+Enterで勝手にフルスクリーン化されてしまう。

>DXGIがアプリケーションのメッセージ キューを監視

とかまじきもい。やめてほしい。

IDXGIFactory::MakeWindowAssociation()関数を呼び出せば
無効にできるらしいけど、この関数ってどうやったら呼び出せるの？

##DXGIとかよくわかんないし##
理解しなければならない事柄がいくつかあります。

DXGIの親子構造はここに図があります。
http://msdn.microsoft.com/ja-jp/library/ee421924(v=vs.85).aspx

IDXGISwapChainの作成方法は2種類あり、
Direct3Dを利用する場合は、
D3D11CreateDeviceAndSwapChain() を呼び出します。
Direct3Dを利用しない場合は、
IDXGIFactory::CreateSwapChain() を呼び出します。 
http://msdn.microsoft.com/ja-jp/library/ee421953(v=vs.85).aspx

今回はDirectx11を使っていたので、
D3D11CreateDeviceAndSwapChain()により作成された、
IDXGISwapChain * psc オブジェクトを利用して、
設定を行わなければならないことになるはずです。

##設定する手順##
IDXGIFactory::MakeWindowAssociation()を呼び出すために、
D3D11CreateDeviceAndSwapChain()で作成した IDXGISwapChain * psc から、
親オブジェクトである IDXGIFactory を取得するために、
IDXGIObject::GetParent()を呼び出し、
取得した IDXGIFactory * pfac を利用して、
MakeWindowAssociation()を呼び出します。

以上です。


...

なにか間違っていたら突っ込んでください。
django の QueryDict に関する覚書


`request.POST` とかで使われているやつです。 `dict` との挙動の違いを確認する必要があったのでメモ。

特長は、

- クエリストリングを渡してインスタンスを作る
- Immutable (でも mutable=True を渡せる)
- 値をリストで保持している (MultiValueDict を継承している)

```python
>>> from django.http import QueryDict
>>> qd = QueryDict('spam=1&egg=2')

# get で取得すると文字列が返る
>>> qd.get('spam')
u'1'

# getlist で取得するとリストが返る
>>> qd.getlist('spam')
[u'1']

# クエリストリングに戻す
>>> qd.urlencode()
u'egg=2&spam=1'

# 値をセットしてみる
>>> qd['spam'] = 100
AttributeError: This QueryDict instance is immutable

# mutable=True で QueryDict を作る
>>> qd2 = QueryDict('spam=1&egg=2', mutable=True)                                                                                                                                 
>>> qd2.get('spam')
u'1'
>>> qd2['spam'] = 100
>>> qd2.get('spam')
100

# dict に変換してみる
>>> d = dict(qd)
>>> d.get('spam')
[u'1']
```
Check! Amazon Mobile Analytics アマゾン モバイルアナリティクス

早速、コンソールから Amazon Mobile Analytics にアクセスしてみました！

![20140713_amazon_mobile_analytics_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/2cbbbcb5-ced7-235e-a77d-8ad3e78f1423.png)

取り急ぎ、和訳してみました。
----
Amazon Mobile Analytics は、スケールにおけるアプリの利用状況を、容易に収集、可視化、理解するためのサービスです。

アプリからの受信データから、60分間分の利用レポートを配信するよう設計されています。そのため、利用者はそのデータをもとにより早く行動できるようになります。

このサービスは、1億イベント/月まで無料で利用できます。

手順
----

### ステップ1. Cognitoへ

Amazon Cognito のアイデンティティプールを作成します。もしすでに Cognito のアイデンティティプールを作成している場合、もしくはIAMユーザで認証されている場合、スキップしてステップ2.へ進んでください。

### ステップ2. 簡単なSDKダウンロードと統合

AWS Mobile SDK をダウンロードし、iOSやAndroid、FireOSアプリに統合してください。

### ステップ3. レポートを見る

あなたのアプリのエンゲージメントレポートとモニタリングデータを見てください。

----

実際にどんなレポートが見れる？
----------------------------------
[View Anazon Mobile Analytics Demo](https://console.aws.amazon.com/mobileanalytics/home/?region=ap-northeast-1#/overview?appTitle=Demo%20App&platform=allplatforms) でデモアプリのレポートを見ることができます。

![Capture: Amazon Mobile Analytics Demo](https://qiita-image-store.s3.amazonaws.com/0/3812/f7cd838b-ff25-701a-c1a1-b9d57fafb17f.png)

* Overview
  * Lifetime Users
  * Lifetime Value Per User
  * Daily Active Users (DAU)
  * Monthly Active Users (MAU)
  * New Users
  * Sticky Factor
  * Total Sessions
  * Day 1 Retention
  * Average Revenue Per DAU (APPDAU)
  * Paying Daily Active Users Average Revenue Paid DAU (ARPPDAU)
* Active Users
* Sessions
* Revenue
* Retention
* Custome Envets

各詳細レポートでは、以下の詳細を確認できます。

* グラフは、折れ線グラフと、棒グラフ
* csvで出力できる

Epilogue
-------------
100 million が 1億であることに驚愕しました(笑)
引き続き、どんなデータで何が知れるのか、などを確認していきたいと思っています。
vagrant-omnibusでChefが入ってないboxでもプロビジョニング

Chefが入っていないBoxの場合、vagrant upやvagrant provisionしようとしても、できません。

ChefをインストールしてBox作り直しは手間なのですが、vagrant-omnibusのプラグインを利用すれば、Chefのインストールをprovision前にしてくれます。

##インストール方法
```
vagrant plugin install vagrant-omnibus
```

Vagrantfile

```rb
Vagrant.configure("2") do |config|
  config.omnibus.chef_version = "11.12.8"

  その他の設定

end
```

reloadしろって言われたら実行

```
vagrant reload
```
AIR for iOS 複数のアプリでデータ共有したい

#概要
ADOBE AIR for iOS で開発した複数のアプリ間でパラメーターの引き渡しをしたいと思い、試行錯誤したログです。参考サイトのリンク集的な感じになってます。

##環境
Flash CS6 + Adobe AIR for iOS 3.8

各バージョンのSDK入手先
http://helpx.adobe.com/jp/air/kb/archived-air-sdk-version.html

任意のバージョンの追加方法
http://www.yeahbutisitflash.com/?p=4141


#試行１：Shared Object

ブラウザ+Flash Playerの場合は、第２引数にパスを入れれば、同じドメイン内の複数のswfで共有ができたので、これが使えないか、という仮説。
http://hakuhin.jp/as3/shared_obj.html#SHARED_OBJ_01

古いバージョンまでは、Shared Object を使うとリジェクトされたらしい。
今は、` SharedObject.preventBackup = true;` といれればOK。
http://www.oboeyo.com/pc-memo2/2013/08/25/sharedobject%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%EF%BC%9Aflashcc%E3%81%A7iphone%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A2/

##結論
第２引数を設定しても同じ場所に保存されることはなく、故に、データ共有には使えない。（Shared Object の動作自体はうまくいく。）

#試行２：データ保存

テキストなり、SQLite で特定のフォルダに保存すればよいだろう、という仮説。
正直、これならいけると思っていた。

まず、データの保存先に制限がある。
技術上というより、Shared Object同様、リジェクトされる要因になるようだが、ルールに従えばOK。
http://cuaoar.jp/2011/11/ios-air.html

` File.userDirectory.nativePath + ’/Library/PrivateDocuments’; ` を使えば、同じフォルダーを読みにいけるかと思った。

参考：AIR アプリで SQLite
http://www.atmarkit.co.jp/fwcr/rensai/air02/air02_1.html
※ちょっと記事が古く、最新版では記述が変わっていますが。

##結論
` File.userDirectory ` がアプリごと別のフォルダーになっているため、データ共有には使えない。（ファイル保存自体はうまくいく。）

#試行３：クリップボード

試行２までであきらめかけてましたが・・・クリップボードで引き渡す、ということを思いつく。（やりたいことは、一時的なデータ引き渡しだけだったので。

AIR でクリップボードの読み書き
http://help.adobe.com/ja_JP/AIR/1.1/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7d60.html

##結論
+ ボタンをタップするなど、ユーザーアクションがトリガーとなれば、うまくいく。
+ 例えば、フレームアクションで、立ち上げた瞬間にクリップボードのデータ取得、というのはうまくいかない

#さいごに

ユーザーアクションをトリガーにするという使いにくさはあるが、クリップボードを使えばパラメーターの引き渡しはできそう。

iOS は、いろいろ制約が多いですなー。
ネイティブ言語なら方法あるのかもしれませんが、備忘録まで。
【Androidアプリ】簡単作成 英語版 第１巻～第１３巻

「Qiita」の記述方法が少しづつだけど分かってきたよ～

----
# HQ版の「ブラよろ」は、全巻での容量が大きい、また、同じアプリが多くUPされると、ストアに負担が掛かるかもしれませんので、ある程度ストアにUPされ始めたら、この記事内のソースファイルは削除する予定ですので、ご了承下さい。「サンプルアプリ」や「野良アプリ」として利用する分には、何の制約も御座いません＾＾ｖ

# 【目次】
　０．概要
　１．英語版 第１巻～第１３巻
　２．その他事項
　　　■resフォルダ配下のファイル内容変更について
　　　■利用jarについて
　　　■注意事項
　　　■免責事項

# 【０．概要】

英語版の第１巻～第１３巻のソース＆リリース用のデータをまとめました！！
ふへ～。日本語版と合わせて２６アプリ分、意外と疲れた罠＾＾；

各手順は、[下記](http://qiita.com/Katemag/items/9a36b0fcc803f13fadbf)を参考にして下さい。
※[【ソースのインポート手順】](http://qiita.com/Katemag/items/9a36b0fcc803f13fadbf#1-4)
※[【改修】設定ファイルのパッケージ名を1行変更するだけ＾＾ｖ](http://qiita.com/Katemag/items/9a36b0fcc803f13fadbf#1-5)
※[【リリース方法】](http://qiita.com/Katemag/items/9a36b0fcc803f13fadbf#1-6)

# 【１．英語版 第１巻～第１３巻】

## 英語版 第１巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第２巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第３巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第４巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第５巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第６巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第７巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第８巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第９巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第１０巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第１１巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第１２巻
+ ~~ソース~~
+ ~~リリース用データ~~

## 英語版 第１３巻
+ ~~ソース~~
+ ~~リリース用データ~~

---

#【２．その他事項】

##　■resフォルダ配下のファイル内容変換について
　　利用リソースファイル(resフォルダ配下)は、全て提供していますので、
　　好きなように変更して頂いても構いません。動作保証はしませんが＾＾；

　　アプリタイトルなどご存じとは思いますが、
　　下記ファイル内に設定してありますのでお好きなように変更して下さい。
　　「res/values/strings.xml」

##　■注意事項
　　漫画「ブラックジャックによろしく」は、医療系漫画の為、
　　内容にやや過激な部分や、人体局部など描かれている個所が存在します。
　　「res/drawable-nodpi」配下にすべての画像ファイルは存在しますので、
　　各自の判断で修正等加えて下さい。

　　また、リリース時のコンテンツレーディングも
　　「ユーザー成熟度 - 高」を選択しておくと良いと思います。
　　配布地域も「日本」のみにしても良いと思います。

##　■免責事項
　　このプログラム利用による、どの様な被害に関しても、
　　利用者がその一切の責任を負うものとし、
　　当方もその他情報の提供者も
　　このプログラムの提供者も一切の責任を負わないものとします。

　　バグ等の情報や要望は、コメントに書き込んで頂けますようお願い致します。
　　ただし、お応えできるかは、責任を負わないものとします。
facebook認証状態を調べるFB.getLoginStatusでできるグロースハック3つ


FB.getLoginStatusメソッドを使えばアプリのfacebook認証状態を簡単に取得できます。
https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

```
FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    // facebookログインしていて、アプリ認証している
  } else if (response.status === 'not_authorized') {
    // facebookログインしているが、アプリ認証していない
  } else {
    // facebookログインしていない
  }
 });
```

これってなかなかに注目すべきメソッドで、下記のようなグロースハックが可能だと思います。

### 1. 流入ユーザが既にfacebookに認証済かどうかわかる
流入ユーザのステータスが'connected'だったら既にアプリ認証しています。
facebookログインボタンを訴求してちゃんとログインできるよう配慮してあげましょう。

### 2. 流入ユーザがfacebookアカウントを持っているかどうかがわかる
流入ユーザのステータスが'not_authorized'だったら認証していないがfacebookのアカウントを持っているユーザです。facebookとの連携を強化したいサービスであればfacebookで登録するボタンを訴求しましょう。

### 3. ログインしているユーザがfacebookアカウントを持っている事がわかる
既にログインしているユーザのステータスが'not_authorized'だったらfacebookのアカウントは持っているが連携していないユーザです。
facebook連携を訴求してfacebook連携率を高める事が可能です。

細かな所ですが、登録・ログインの離脱は1%でも下げたい所なのでしっかり対策を取りたいですね。
WordPressで自動更新したい時のパーミッション、もしくはFS_METHOD手動設定やめようって話

何番煎じかわかりませんが、ファイル書き込みにFTP/SSHを経由させない（所謂「接続情報の入力」を回避する）話です。

# プラン

* コアの更新をできるようにしたい -> 全体を書き込み可能に
* パーマリンクほげほげ -> .htaccess
* ファイルアップロード -> wp-content/uploads
* テーマ編集 -> wp-content/themes
* プラグイン更新 -> wp-content/{plugins,upgrade,あとthemesも？}

など。いずれにせよwp-config.phpは読み取り専用がよいでしょう。

# おさらい：FS_METHODの自動判定

以下の条件を全て満たした場合に FS_METHOD=direct が選択され、PHPから直接ファイル操作が行われます。

* 対象ディレクトリにダミーファイルを作成できるか
* ダミーファイルの所有者は~~PHPの実行ユーザー~~**コアファイルの現在の所有者**と等しいか
 （[WordPress4.1から判定基準が微妙に変わりました](https://github.com/WordPress/WordPress/commit/9b9289e0a3b6a0359217bc33205b3c194d3fd3cf)）

たとえPHPがファイルを作成できたとしても、所有者がApacheユーザーやrootユーザーのままではWebサイトのオーナーが（FTPなどで）ファイルを操作できなくなる危険性があるため、この確認が行われています。

※過去に書いていた「グループの書込権+direct強制」はこの罠にはまる可能性があります。多分はまります。

というわけで無闇なFS_METHOD=directには要注意ということで。

# 所有者・グループをPHPの実行ユーザーにできる場合

コア更新をできるように、wp-config以外を書き込み可能にする例。

```bash
cd /path/to/wordpress

# 基本は所有者まで書き込み可
find . -type d -exec chmod 755 {} +
find . -type f -exec chmod 644 {} +

# wp-configはPHPから書き込めないように
chmod 400 wp-config.php

# 所有者・グループの変更
chown -R www-data:www-data .
```

# 所有者は押さえておきたい場合（WP4.1以降限定）

前述のような「書き込みはできるけど所有権がまずい」環境でも既存のファイルの更新は問題なく行えることから、WordPress4.1以降では**ファイルの追加を伴わない書き込み**だけ行えるようになっているようです。コアファイルのアップグレードであっても同様です。

この機能を利用する場合、PHPの実行ユーザーを所有グループにして書き込み許可を与えるか、誰でも書き込み可能にするか、どちらかにしておきます。FS_DIRECTの指定は行いません。

この場合ファイル追加の必要なアップグレードは失敗するので、手動でアップグレードを行う必要があります。

```bash
cd /path/to/wordpress

# 基本はグループまで書き込み可
find . -type d -exec chmod 775 {} +
find . -type f -exec chmod 664 {} +

# wp-configはPHPから書き込めないように
chmod 640 wp-config.php

# グループの変更
chgrp -R www-data .
```

もしくは、誰でも書き込み可能。

```bash
cd /path/to/wordpress

# 誰でも書き込み可
find . -type d -exec chmod 777 {} +
find . -type f -exec chmod 666 {} +

# wp-configはPHPから書き込めないように
chmod 644 wp-config.php
```

# それでも自由にアクセスさせたい

検証してないので詳細は省きますが、

- 自分はグループとしてアクセスできるようにしておいて、umaskもいい感じにしておいて
- setgidビットで所有グループを継承させて
- [wp-config.phpで`FS_CHMOD_xxx`をよしなに、`FS_METHOD`をdirectに設定して](https://codex.wordpress.org/Editing_wp-config.php#Override_of_default_file_permissions)

とかやるといけるかも。

# 参考

* [Changing File Permissions « WordPress Codex](http://codex.wordpress.org/Changing_File_Permissions#Permission_Scheme_for_WordPress)
* [Updating WordPress « WordPress Codex](http://codex.wordpress.org/Upgrading_WordPress#One-click_Update)
* [WordPress更新時にFTP情報入力画面が表示される場合の対処方法3つ](http://www.sandalot.com/wordpress%E6%9B%B4%E6%96%B0%E3%81%A7ftp%E5%85%A5%E5%8A%9B%E7%94%BB%E9%9D%A2%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)
* [#10424 (change get_filesystem_method()'s code for direct to reflect actual purpose) – WordPress Trac](https://core.trac.wordpress.org/ticket/10424)
pythonでformat

Rubyだと`"%s" % "str"`みたいな書き方だったけどpythonではちょっと違った

```python
print "{0}, {1}".format("abc", "def")
```
個人的には`%`記法が好きだったけどなんかこっちをつかうのがデファクトスタンダードらしい。
winpcapでpcap_set_rfmonが見えない話

自分が忘れてしまいそうなので、メモがてら。

[gopacket](https://code.google.com/p/gopacket/)/pcap で最近 pcap_set_rfmon に対応するコードが[入った](https://code.google.com/p/gopacket/source/detail?r=70a9543b8f192951452e66a9806bb295b7658c4c)。ところが WinPcap ではビルドできない。

原因は WinPcap 側で `__declspec(dllexport)` が抜けていて、リンカーがリンクできないため。

WinPcap のソースコードを[ダウンロード](http://www.winpcap.org/devel.htm)して眺めてみると、こういう事らしい：

```diff
--- winpcap/wpcap/PRJ/WPCAP.DEF.old     2014-07-13 23:09:44.009092400 +0900
+++ winpcap/wpcap/PRJ/WPCAP.DEF 2014-07-11 20:50:40.348113700 +0900
@@ -90,4 +90,6 @@
                pcap_set_buffer_size
                pcap_hopen_offline
                pcap_setdirection
-               pcap_free_datalinks
\ No newline at end of file
+               pcap_free_datalinks
+               pcap_set_rfmon
+               pcap_can_set_rfmon
\ No newline at end of file
```

この`WPCAP.DEF` ファイルを参照して `wpcap.lib` が生成されるのだが、通常の方法だとコンパイル環境がないといけない。ビルド済みのバイナリは既にあるので、[dlltool]("http://www.mingw.org/wiki/dlltool") で裏技的に生成するのが簡単だろう。

```bash
dlltool.exe --input-def WPCAP.DEF --output-lib wpcap.lib
```

生成された `wpcap.lib` を `C:\WpdPack\Lib\x64` にコピーすればOK。

ところでバグレポするにしても、[ML が機能していない](http://www.winpcap.org/bugs.htm)ってのは、なんだかなぁ。いろんなプロジェクトではまってるのを見かけるけど、メールサーバの運用ってのは、大変だなぁ。