OmniAICreator/Qiita-1.07M huggingface dataset:
TitaniumでAndroidのタブアイコンが小さくなる時の対処方法


お疲れ様です。ジャックです。最近Titaniumにはまっています。Ti初心者です。
今回は、TitaniumでAndroidのタブアイコンが小さくなる時の対処方法についてのメモです。

## 現象
Alloyでsampleプロジェクトを作成し、app/views/index.xmlで下記のようにタブアイコンを指定しました。

```app/views/index.xml
<Alloy>
	<TabGroup>
		<Tab title="Camera" icon="icon/camera40x40.png">
			<Window title="Tab 1">
				<Label>壊れかけのカメラ</Label>
			</Window>
		</Tab>
		<Tab title="History" icon="icon/history40x40.png">
			<Window title="Tab 2">
				<Label>壊れかけのヒストリー</Label>
			</Window>
		</Tab>
	</TabGroup>
</Alloy>
```

40×40pxのアイコンを指定したのですが、下記画像のようにとても小さくて視認性の悪いタブアイコンが配置されました。

![Screenshot_2014-12-20-12-00-06.png](https://qiita-image-store.s3.amazonaws.com/0/41823/ee94015e-c314-cab5-b01e-08812fbc25c9.png "")


## タブアイコンを大きくする

tiapp.xmlに下記を追記します。
anyDensity = falseにする事で、解像度に応じてタブアイコンを調整してくれるらしいです。

```tiapp.xml
<android xmlns:android="http://schemas.android.com/apk/res/android">
	<manifest>
    	<supports-screens android:anyDensity="false"/>
   	</manifest>
</android>
```

タブアイコンが大きくなりました。

![Screenshot_2014-12-20-12-01-26.png](https://qiita-image-store.s3.amazonaws.com/0/41823/9716c27d-9afb-8a94-0cd1-33ca00fbf6d1.png "")

まだまだTi初心者なので、地道に頑張ります。
関数の定義方法いろいろ

Swift完全初心者のメモです。

## `->` で戻り値の型を指定

    func greet(name: String, day: String) -> String {
        return "Hello \(name), today is \(day)."
    }
    greet("Bob", "Tuesday")

## tupleを使えば複数の戻り値を設定できる

    func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
        var min = scores[0]
        var max = scores[0]
        var sum = 0
        for score in scores {
            if score > max {
                max = score
            } else if score < min { 
                min = score
            }
            sum += score
        }
        return (min, max, sum)
    }
    let statistics = calculateStatistics([5, 3, 100, 3, 9])
    statistics.sum
    statistics.2

## 関数はネストできる

    func returnFifteen() -> Int {
        var y = 10
        func add() {
            y += 5
        }
        add()
        return y
    }
    returnFifteen()

## 関数はファーストクラスなので戻り値で他の関数自体を返せる

    func makeIncrementer() -> (Int -> Int) {
        func addOne(number: Int) -> Int {
            return 1 + number
        }
        return addOne
    }
    var increment = makeIncrementer()
    increment(7)

## 関数は引数に他の関数を取れる

    func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
        for item in list {
            if condition(item) {
                return true
            }
        }
        return false
    }
    func lessThanTen(number: Int) -> Bool {
        return number < 10
    }
    var numbers = [20, 19, 7, 12]
    hasAnyMatches(numbers, lessThanTen)

## クロージャ(後で呼ぶことが出来るコードのブロック)も使える。
Objective-Cでいうところのブロックのようなもの。

    func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    println("Result: \(mathFunction(a, b))")
    }
    printMathResult(addTwoInts, 3, 5)
    // prints "Result: 8"


## 外部パラメータ

引数の前にスペースを空けて外部パラメータ名を付けられる。
関数を使う人間が、各引数がどういう役割をするのか分かりやすいようにできる。

    func join(string s1: String, toString s2: String, withJoiner joiner: String)
    -> String {
        return s1 + joiner + s2
    }

呼び出し側では、

    join(string: "hello", toString: "world", withJoiner: ", ")
    // returns "hello, world"

便利。

`#` を使えばローカル名と外部パラメータ名を兼用して宣言できる。

    func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
        for character in string {
            if character == characterToFind {
                return true
            }
        }
        return false
    }

    let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
    // containsAVee equals true, because "aardvark" contains a "v"

便利。

## 引数のデフォルト値

    func join(string s1: String, toString s2: String,
        withJoiner joiner: String = " ") -> String {
            return s1 + joiner + s2
    }

    join(string: "hello", toString: "world", withJoiner: "-")
    // returns "hello-world"
    
    join(string: "hello", toString: "world")
    // returns "hello world"

外部パラメータ名を与えなくても、ローカル名が外部パラメータ名みたいに使える。

    func join(s1: String, s2: String, joiner: String = " ") -> String {
        return s1 + joiner + s2
    }

    join("hello", "world", joiner: "-")
    // returns "hello-world"
swift: extension を使って既存Classに格納型Propertyを追加する方法


はじめに
========

swiftの extension では通常格納型のProperty を追加できません。
しかし、 ObjectiveC の時代からある仕組みを使うと一応できるようになります。

方法
==========

こんな感じに `objc_getAssociatedObject`、 `objc_setAssociatedObject` を使います。
少し気をつける必要があるのが、  `transitionAgentKey` のようにget/setで同一のポインタアドレスを渡すようにすることです。（String Literalだと上手く行きませんでした）。

```swift
private var transitionAgentKey: UInt8 = 0

extension UIViewController : TransitionViewControllerProtocol {
    public var transitionAgent: TransitionAgentProtocol? {
        get {
            return objc_getAssociatedObject(self, &transitionAgentKey) as? TransitionAgentProtocol
        }
        set {
            objc_setAssociatedObject(self, &transitionAgentKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }
}    
```

さいごに
======

こういうのは多用すると危ない感じですが、Frameworkとかを作る際にピンポイントで使うととても便利かな、と思います。
Gitに脆弱性が見つかったのでMacでGitを最新版にしてみる


##Gitで脆弱性が見つかったみたいです。


<a href="http://www.forest.impress.co.jp/docs/news/20141219_681222.html">
![スクリーンショット 2014-12-20 11.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/15812/a78e684c-af15-ca9c-8351-98701c079bac.png "スクリーンショット 2014-12-20 11.19.44.png")
</a>

```

　分散型バージョン管理システム「Git」の最新版v2.2.1が、18日に公開された。本バージョンではWindows/Macに影響する脆弱性が1件（CVE-2014-9390）修正された。本脆弱性は旧版にも影響するため、メンテナンス対象となっている旧版に対しても最新版となるv1.8.5.6/v1.9.5/v2.0.5/v2.1.4がリリースされている。

```
引用元：窓の社

<b>問題はここ</b>

```

　本脆弱性の内容は、「Git」リポジトリをクローンしたりチェックアウトする際に、“.git/config”ファイルを上書きできてしまう不正な「Git」ツリーが作成できるというもの。最悪の場合、攻撃者によってクライアントPCで任意のコマンドが実行できるようになるとのこと。

```
引用元：窓の社

http://www.forest.impress.co.jp/docs/news/20141219_681222.html

なにやらやばそうなので、Gitを最新版にしてみる。

### 前提条件
 - MacOSX version 10.9.5


### 手順１：brew をアップデートする

```

brew update

```

![スクリーンショット 2014-12-20 11.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/15812/63fff9f9-065a-7e2a-a2de-f8a9150d9bca.png "スクリーンショット 2014-12-20 11.29.41.png")

### 手順２：brewでgitをアップデートする

```

brew upgrade git

```

![スクリーンショット 2014-12-20 11.32.20.png](https://qiita-image-store.s3.amazonaws.com/0/15812/ddfcff7e-7bbd-c5db-b088-6c278528fc2a.png "スクリーンショット 2014-12-20 11.32.20.png")

### 手順３：Path をとおす
```

vim ~/.bash_profile

```
「/.bash_profile」に以下の内容を追記

```.bash_profile

export PATH=/usr/local/git/bin:$PATH
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH

```

変更内容を反映

```

source ~/.bash_profile

```

### 手順４：Gitが最新のバージョンになったか確認する

```

git --version

```

![スクリーンショット 2014-12-20 11.41.09.png](https://qiita-image-store.s3.amazonaws.com/0/15812/387a66bc-255e-0e36-34ec-d478a9b5e905.png "スクリーンショット 2014-12-20 11.41.09.png")
Xcodeでのレイアウト定義の王道とは


# 概要
開発環境として下記の要件を満たしていると、主にプレゼンテーションレイヤーの開発の効率化につながる。

#### 要件
- 一目瞭然で視覚的にレイアウトが確認できる
- 仕様変更に柔軟に対応できるよう、共通するレイアウト定義は１つにまとまっている。

Android はこれを実現する仕組みがあるが、Xcodeにはあるのか？という調査依頼があったので、せっかくなのでまとめてみた。

Xcode初学者なので、もっとよい方法があればぜひ教えてほしい。

## Xcodeバージョン
6.1.1

## 言語
Objective-C

# 結論
レイアウトを全部Interface Builderで完結させることはできない。
（例えば角丸にするには今の所コードを書かないといけない。）
下記のいずれかはXcodeでも実現可能。

a. xibファイルに視覚的にレイアウト定義したものをコードから読み込む
b. コードでレイアウト定義したものをIB(xib or storyboard)に表示する

xibファイルにレイアウト定義したものをStoryboardに置くことはできる。
しかし、xibで定義したレイアウトがStoryboardに反映されるわけではないので、１つ目の要件を満たしていない。
さらに、Storyboard側でプロパティを上書きすることができないので、この画面のボタンだけこうしたい、というのは結局コードでやらないといけない。
もしくは、xibファイル分ける、というのもあるが、これは２つ目の要件を満たさなくなってしまう。

# 以下の理由から、個人的にはb の方法がオススメ
## 一覧性を確保できる
a だと、部品がxibに分かれてしまって全体が把握できない、という問題がある。
b なら、カスタムボタンの見た目もすぐにStoryboardで確認できる。
さらにいいところは、Storyboard側で上書きできるように拡張できる、というところ。（全てのプロパティでそれをやるのはちょっと難しいかも）
なおIB_DESIGNABLEとprepareForInterfaceBuilder は必須。

## コードでのレイアウト定義はIBに比べて自由度が高い
同じような属性、プロパティは徹底的にまとめることができる。

## b のデメリット
フレームワークの動きをきちんと理解していないと、コードで部品を作るのはIBでやるのに比べたら難易度が高いということ。
レイアウトに関するAPIをいろいろ覚えないといけない。

# 調査用に作ったもの

 - b の方法でカスタムボタンを作ってみたサンプル  
https://github.com/AkiroomBootcamp/CustomButtonTest  
（プルリク募集）

# 参考
Xcode6 からはIB_DESIGNABLE やIBInspectable といった機構がIBに追加され、コードとIBの連携がスムーズに行えるようになった。

- What's New in Interface Builder  
https://developer.apple.com/videos/wwdc/2014/
【mixi-iOSTraining】確認問題の回答例:1.1 Objective C の基礎

mixiさんのiOSTraining資料に掲載されている確認問題に取り組んでみました。
・参考資料
[1.1 Objective C の基礎](https://github.com/mixi-inc/iOSTraining/wiki/1.1-Objective-C-%E3%81%AE%E5%9F%BA%E7%A4%8E)

#クラスの作成
MixiSampleClassの内容は参考資料をご確認ください。

```objc
#import "MixiSampleClass.h"
```
ヘッダファイルを追加します。

```objc:ViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    MixiSampleClass *test = [[MixiSampleClass alloc] init];
    
    test.name = @"unchi";
    NSLog(@"%@",test.name);//unchi
}
```

# カテゴリからNSStringを拡張
## Xcode6でカテゴリ作成
Xcode6でカテゴリの作成の仕方がわからなかったので、以下を参考にしました。
http://stackoverflow.com/questions/24324021/how-do-i-create-a-category-in-xcode-6
File -> New -> File -> Objective-C fileでFile TypeをCategoryに設定します。

## 実装
NSStringの拡張は省略しています。

```objc
#import "NSString+HogeAddition.h"
```
ヘッダファイルを追加します。

```objc:ViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    MixiSampleClass *test = [[MixiSampleClass alloc] init];
    
    test.name = @"unchi";
    //追加
    NSLog(@"%@",[test.name addHoge]);//unchihoge
}
```
d3.jsでお金を稼ぐ

# はじめに
はじめまして！
最近d3.jsに興味を持って勉強しだしたpecomeriです。
この記事はd3.js Advent Calender 19日目の記事です。

最近いじりだしたばっかりで、あんまり技術的に深い話はまだできなそうなので、ちょっとひねってみました。

新しい技術を学ぶときって何か題材無いかな～って探しますよね？
なんか題材やりつつお小遣いももらえたらな～って思う一石二鳥を狙う人のために、世の中にどんなd3.jsの需要があるのか調べてみました。
はい、単なるお仕事紹介です。

# どこにそんな仕事が転がってるのさ？
クラウドソーシングです。
日本のランサーズ、クラウドワークスだとあんまりd3.jsを使った仕事がなかったので、アメリカのoDeskというサービスで検索しました。

この記事が読まれるうちは仕事先のリンクが切れませんように。。。

# 面白そうな仕事
## d3.jsでFacebookの交友関係を可視化して！そんでクリスマスツリーっぽくして！
https://www.odesk.com/o/jobs/job/_~01d7f5d05ef668acc5/

サイトを見ると結構面白そうですね。
http://prcweb.co.uk/lab/d3-tree/

今はただ乱数を発生させてツリーを表示させてるぐらいでしょうか。

週10時間程度を1週間の作業量だそうです。


## ヘルスケアアプリのデータビジュアライゼーション部分を作って！
https://www.odesk.com/o/jobs/job/_~01e5031bf3487d407e/

d3.jsやd3.jsのラッパー等でグラフを作ってほしいみたいですね。
来年はもっと仕事あるから継続的にお願いしたいよって言ってます。

週10～30時間を1か月～3か月程度で、向こうの時間に合わせられることが条件だそうです。

# おわり
いかがでしたでしょうか？
残念ながら英語でしかなかったのですが、ある程度読み書きでコミュニケーションできるならありかと思います。
CustomViewのOnClickが反応しない時の対処方法

カスタムビューを作成して`OnClickListener`をセットしたのにタップしても反応しない時の対処方法です。

#問題の現象

例えばこんな感じのカスタムビューを作った時。

```custom_button.java
public class CustomButton extends RelativeLayout {

    private OnClickListener listener;

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 略
    }

    // 略
}
```

`OnClickListener`をセットしても反応しません。

```java
mCustomButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d(TAG, "clicked");
    }
});
```

#対処方法

OnClickイベントをカスタムビュー自身でハンドリングしてあげると反応するようになります。

```custom_button.java
public class CustomButton extends RelativeLayout {

    private OnClickListener listener;

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 略
    }

    // 略

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (listener != null) listener.onClick(this);
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP
                && (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER
                || event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
            if (listener != null) listener.onClick(this);
        }
        return super.dispatchKeyEvent(event);
    }

    public void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
    }

}
```
それは後方参照じゃない

正規表現を用いた置換で，キャプチャーした文字列を置換文字列において参照することを「後方参照」と書いている文章をよく見かけますが，これは「後方参照」ではありません。「後方」ってどこよ？

後方参照というのは，たとえば `(\d)\1` でゾロ目（同じ数字が二つ続いた文字列）を検索する場合の `\1` のように **検索パターンの中で** 後方（左の方）でキャプチャーした文字列を参照することです。
WordBench東京（2014年12月）参加メモ

# はじめに

これは、2014年12月のWordBench東京の勉強会に参加した際のメモです。

## 基本情報
日時：2014年12月14日(日)　14:00～18:00
勉強会のイベントページ
http://wbtokyo.doorkeeper.jp/events/18289

![wbtokyo201412.jpg](https://qiita-image-store.s3.amazonaws.com/0/44791/f9d777cd-2ba5-d03c-e9f1-77b64ff45c22.jpeg)

## 参加の経緯
* 最近Skype英会話を知って英会話の勉強がマイブームとなり、楽しく英語を勉強する方法を模索中だったところ、[WordPress.tv](http://wordpress.tv/)に字幕つける方法があることを知り、試しに翻訳を作ってアップロードしてみました。
* しかし改めてWordPress.tvを見ると、字幕がついている動画はほとんどなくて、もしかして、何かマズいことをしてしまったのではないかと、ちょっと気にかかりつつも放置。
* そんな中、WordBench東京がWordPress.tvの字幕に関するテーマで開催されると知り、ぜひ参加していろいろ教えてもらおうと思い参加。

# 当日の参加メモ
* 会場のビルが、日曜日は開いていないようで、ビルに入るために、ちょっと苦労しました。（これについては、後でDoorKeeperの方からメールで指示が来ていたことに気づきました。守衛さんゴメンナサイ…）
* 14:25 WordBench東京のご紹介
* 14:30 今回のテーマ「WordPress.tv」について
* 14:40「WordCamp東京2014の動画を登録」チーム、「日本語動画に日本語字幕付け」チーム、「英語動画に翻訳字幕付け」チームに分かれて作業開始。私は、「日本語動画に日本語動画付け」チームに参加
* 進捗共有用シート
　https://docs.google.com/spreadsheets/d/1Q4o9pqVqU2souin2IMELTWkXn9iwwsbQigrjjWuW2ms/edit#gid=0

* 17:30　WordPress NewsDec. 2014 Late November -Early December
　WordPressの最新ニュースをいろいろ教えていただきました。
　スライド → https://www.slideshare.net/secret/6wTszE8QUIxJN6
* 18:00　各自より、本日の成果発表
* 私の成果 http://amara.org/ja/videos/0Gtz1hOqNQTn/info/
* 非常に雑ですが、とりあえず字幕付け作業をひととおりやりたかったので、字幕として全然不足の状態。また後日改めてちゃんとした字幕を付けたいと思います。
* その後、懇親会。

# その他メモ
## 分業の仕方
1. 時間配分を調整する
- 各々のパートに字幕を付ける
- エクスポートする（SBV？が良いらしい）
- テキストファイルなので、中を見ながら、合体させる
- アップロードする

## 字幕付け作業に関する基本情報
* WordPress.tvにある字幕の付け方説明動画

　http://wordpress.tv/2014/08/08/how-to-add-subtitles-and-translations-to-wordpress-tv-videos/
　上記動画を含む説明ページ（英語）
　http://wordpress.tv/using-amara-org-to-caption-or-subtitle-a-wordpress-tv-video/

## TIPS
* amara.orgで字幕付けを始める際、英語に「English」というのが無い。「英語（米国）」を選択するのが吉

##slack

　最近話題の slack への登録の仕方を教えていただきました。
　日本のWordPressのSlackのページ→https://wpja.slack.com/
　登録手順→http://wpdocs.sourceforge.jp/WordSlack%E3%81%B8%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95
　（参考）WordPress Slack について ‹ nuuno→http://nuuno.net/note/wordpress-slack/
　英語版（というか本家）の説明→https://make.wordpress.org/chat/

# 最後に
* WordBench東京は以前から参加したかったので、今回ついに参加できてよかった！
* とはいえ、私は基本関西ということもあり、なかなか参加できないので、遠くから応援しています。
Railsでシンプルな管理画面をサクッとつくれる「ActiveAdmin」

## いつ使えるの？

Railsでサクッと管理画面を作成したい時に使えます。

## 公式リポジトリ

[activeadmin](https://github.com/activeadmin/activeadmin)

## activeadminをインストール

```ruby:Gemfile
gem 'activeadmin', github: 'gregbell/active_admin'
gem 'sass-rails' # 入っていなければ追記
gem 'devise' # ユーザー認証
```

```
$ bundle install --path vendor/bundle
```

で gem をインストールします。

## セットアップ

activeadminをセットアップした後、DBを作成してサーバ起動します。 

```
$ bundle exec rails g active_admin:install
      invoke    active_record
      create    db/migrate/20141216115002_devise_create_admin_users.rb
      create    app/models/admin_user.rb
      invoke    test_unit
      create    test/models/admin_user_test.rb
      create    test/fixtures/admin_users.yml
      insert    app/models/admin_user.rb
       route    devise_for :admin_users
        gsub    app/models/admin_user.rb
        gsub    config/routes.rb
      insert    db/migrate/20141216115002_devise_create_admin_users.rb
      create    config/initializers/active_admin.rb
      create    app/admin
      create    app/admin/dashboard.rb
      create    app/admin/admin_user.rb
      insert    config/routes.rb
      create    app/assets/javascripts/active_admin.js.coffee
      create    app/assets/stylesheets/active_admin.css.scss
      create    db/migrate/20141216115007_create_active_admin_comments.rb

```

```
$ bundle exec rake db:migrate 
$ bundle exec rails s
```

あとはサーバーを立ち上げて http://localmoss:3000/admin にアクセスすると、シンプルな管理画面ができています。


## 管理画面のデザイン

![activeadmin00.png](https://qiita-image-store.s3.amazonaws.com/0/36485/f26fae22-3deb-235a-416c-689a66138d4d.png)

デフォルトのEmailとパスワード

・ Email: admin@example.com
・ Password: password

## 管理画面の中のデザイン

![activeadmin01.png](https://qiita-image-store.s3.amazonaws.com/0/36485/8c3b4e99-99d1-c756-0179-c186fc3f4112.png)

デフォルト画面の完成。

## bookモデルを作成して管理

```
$ bundle exec rails g model book title:string color:string 

$ bundle exec rake db:migrate

# Ativeadminで管理できるように
$ bundle exec rails g active_admin:resource book
    create  app/admin/book.rb

```

## 管理画面を編集

```ruby:app/admin/book.rb

register Book do
  permit_params :id, :title, :color

  index do
    column "ID", :id
    column "タイトル", :title
    column "色", :color
    # 管理画面に画像を表示させる
    # column "画像", :image_thumbnail do |c|
    #   image_tag(c.image, :height => '100')
    #end
    actions
  end

# Newするとき
  form do |f|
    f.inputs Book do
      f.input :title
      f.input :color

      f.actions
    end
  end

  show do |b|
    attributes_table do
      row :id
      row :title
      row :color
    end
      active_admin_comments
  end

end

# 検索
ActiveAdmin.register Book do |u|
    filter :id, :label => 'IDで検索'
end

```

こんな感じで表示するものを変更できます。

```
$ bundle exec rake db:migrate 
```

## Vagrantで開発している方

Vagrantで開発している場合は、メモリ不足でエラーになることがあるので注意してください。

```rb:Vagrantfile
   config.vm.provider "virtualbox" do |vb|
     # Don't boot with headless mode
     vb.gui = true
  
     # Use VBoxManage to customize the VM. For example to change memory:
     vb.customize ["modifyvm", :id, "--memory", "1024"]
   end
```

Vagrantfileの上記部分のコメントアウトを外して、メモリを与えるとエラーがなくなると思います。
RubyOnRailsでこんなコードを書いてたら今すぐリファクタリングして１行にまとめちゃおうぜ！small tips!

RubyOnRailsで開発していると、よく無駄に長いコードや読みにくいコードを書いてしまうことがあります。

私もそんな失敗経験があるため、それを自分へのメモがてら書き留めていこうと思います。
今回はよくあるBlogテーブルとCommentテーブルを例に説明していきます。

## リファクタリング 1st
true/falseの条件分岐でif,else,endを使ってしまう。
#### before 
```rb
Class Blog < ActiveRecord::Base
  has_many :comments

  def has_comments?
    if self.comments.count > 0
      true
    else
      false
    end
  end
end
```
**長いです！長いです！長いです！こんなコードに５行も要りません！１行に圧縮してしまいましょう！**

#### after
```rb
Class Blog < ActiveRecord::Base
  has_many :comments

  def has_comments?
    self.comments.count > 0
  end
end
```
**ちなみに、間違っても下記のような無駄なコードは書いてはいけません。気をつけましょう！**

```rb
Class Blog < ActiveRecord::Base
  has_many :comments

  def has_comments?
    self.comments.count > 0 ? true : false
  end
end
```

### リファクタリング 2nd
@blog.commentsなどの関連モデル全てが同じ条件を満たすかどうかの判定を書くとき。

#### before
```rb
Class Blog < ActiveRecord::Base
  has_many :comments
  belongs_to :user

  def only_my_comments?
    return_value = true #default
    self.comments.each do |comment|
      if comment.user_id != self.user_id 
        return_value = false
      end
    end
  end
end
```

悪くはないのですが、やはり長いですね。これも１行に圧縮してしまいましょう。
#### after
```rb
Class Blog < ActiveRecord::Base
  has_many :comments
  belongs_to :user

  def only_my_comments?
    self.comments.all?{|comment| comment.user_id == self.user_id}
  end
end
```

## リファクタリング 3rd
わりとよくある、`present?`メソッドを使って条件分岐させるパターンです。
#### before
```erb
# erb風でのview表記
<% if @blog.present? %>
  <%= @blog.name %>
<% else %>
  <%= "No title" %>
<% end %>
```
よく使う分、こういうコードを書かれうと玄人の方々にとっては少し頭を悩ませてしまいます。下記のようにリファクタリングしてしまいましょう。
#### after
```erb
<%= @blog.try(:name) || "No Title" %>
```
## リファクタリング 4th
`each`メソッドでループをまわして、それぞれの合計値を取るというパターンです。数量や価格やイイネ数などを取るときによく使われます。
#### before
```rb
all_like_count = 0
@blogs.each do |blog|
  all_like_count += blog.like_count
end
```
このリファクタリングで活躍するのが`map`メソッドと`inject`メソッド。ある程度こなしているプログラマーならばこういうリファクタリング済みコードを見るとテンションがあがる。
#### after
```rb
all_like_count = @blogs.map(&:like_count).inject(:+).to_i
```
上記で最後に`.to_i`メソッドを使っているのですが、人によってはこんなのいらないという人もいるかもしれません。しかし、`@blogs = nil`のときは`all_like_count = nil`になってしまいます。一見無駄に見えますが必要なコードなので忘れないようにしましょう。


### 最後に
実際にRailsアプリケーションを書いていると、Routingまわりやhelper周りなどでもたくさんの改善ポイントがあったりします。ですがとりあえず今回は１行に集約できるリファクタリングのみとして４tipsまでにとどめ提供してみました。楽しいプログラミングに役立つことができれば幸いです。
Rails4アプリをGatlingで負荷テストする

# 前提
* Yosemite
* Rails 4.1.4
* Railsのログイン認証はDevise
* Gatling 2.0.0

# 準備
GatlingのサイトからLatest releaseのGatling bundleをダウンロード

http://gatling.io/download/



# テスト用のコード作成し、user-files以下に配置

```
import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._

class Test1 extends Simulation {

  val basicAuthUser = "basic認証のユーザ"
  val basicAuthPassword = "basic認証のパスワード"
  val authUser = "ログインメールアドレス"
  val authPassword = "password0001"
  val baseUrl = "https://example.com/"
  val paramNameLogin = "user[email]"
  val paramNamePassword = "user[password]"
  
  object Login {

    val login = exec(http("request_0")
       .get("""/admin/login""")
       .basicAuth(basicAuthUser, basicAuthPassword)
       .check(regex("""<meta content="(.*?)" name="csrf-token" />""")
       .saveAs("auth_token")))
       .exec(http("request_1")
       .post("""/admin/login""")
       .header("X-CSRF-Token", "${auth_token}")
       .formParam(paramNameLogin, authUser)
       .formParam(paramNamePassword, authPassword)
       .basicAuth(basicAuthUser, basicAuthPassword)
       .check(status.is(200)))

  }

  object Shop {

    val headers_0 = Map(
      """Accept""" -> """text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8""",
      """Cache-Control""" -> """max-age=0""")

    val headers_1 = Map("""Cache-Control""" -> """max-age=0""")

    val shops = exec(http("request_2")
       .get("""/admin/shops""")
       .basicAuth(basicAuthUser, basicAuthPassword)
       .check(status.is(200)))
  }

  val httpProtocol = http
    .baseURL(baseUrl)
    .inferHtmlResources()
    .acceptHeader("""image/webp,*/*;q=0.8""")
    .acceptEncodingHeader("""gzip, deflate, sdch""")
    .acceptLanguageHeader("""en-US,en;q=0.8,ja;q=0.6""")
    .userAgentHeader("""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36""")

  val scn = scenario("Login").exec(Login.login)
  val scn2 = scenario("Shop").exec(Shop.shops)

  setUp(
    scn.inject(atOnceUsers(1)),
    scn2.inject(atOnceUsers(5))
  ).protocols(httpProtocol)

}

```

# 実行

bin/gatling.sh -sf user-files/ -s Test1
Railsで定期的にバッチ回す「Whenever」

## 何ができるか

Railsでcronのバッチを作成して、定期的に回すことができます。

## 公式リポジトリ

[whenever](https://github.com/javan/whenever)

## wheneverをインストール

```ruby:Gemfile
gem 'whenever', :require => false
```

```
$ bundle install --path vendor/bundle
```

#### 設定ファイルを作成

```
$ bundle exec wheneverize . 
    [add] writing `./config/schedule.rb'
    [done] wheneverized! 

```

config/schedule.rb に設定を記述します。


```ruby:config/schedule.rb

require File.expand_path(File.dirname(__FILE__) + "/environment")
set :output, 'log/cron.log'

# 1分毎に回す
every 1.minute do
  command "echo 'mossmossmossmossmossmoss'"
end

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

# every 1.day, :at => '4:30 am' do
#   runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
# end

# every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
#   runner "SomeModel.ladeeda"
# end

# every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
#   runner "Task.do_something_great"
# end

# every '0 0 27-31 * *' do
#   command "echo 'you can use raw cron syntax too'"
# end

```

## cronに反映する際のコマンド

- 設定の確認 

```
$ bundle exec whenever 
$ bundle exec crontab -e
```
- cronにデータを反映 

```
$ bundle exec whenever --update-crontab 
```
- cronからデータを削除
 
```
$ bundle exec whenever --clear-crontab
```

これで定期的にバッチを回せます。


## CapistranoでWhenever

デプロイ時に、本番環境にもcronの値をセットしたい時は、Capistranoの設定ファイルに下記を追記します。

```ruby:config/deploy.rb
set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"
```

これで cap deploy を行なえば、デプロイ先のcrontabに値が反映されます。
Railsのマニフェストファイルを使ったJsとStylesheetの呼び出し

RailsにおけるJsとStylesheetの呼び出しは、マニフェストファイルから読み込みたいものをまとめて設定し、複数存在するであろうerbファイルからはマニフェストファイルだけを読み込むことで、JsとStylesheetの呼び出しを代わりにやってもらうという仕組みになっています。この仕組みをSprocketsと言います。

※マニフェストファイルを使っていない場合
![スクリーンショット 2014-12-20 8.11.52.png](https://qiita-image-store.s3.amazonaws.com/0/48577/039cd1e5-5361-e6be-80f8-b2d56fab0eb9.png)


※マニフェストファイルを使った場合
![スクリーンショット 2014-12-20 8.11.38.png](https://qiita-image-store.s3.amazonaws.com/0/48577/73f2657f-fd8b-70e5-551e-ff455bfaa239.png)




ここでは、
>①マニフェストファイルからの読み込みの設定方法
>②erbファイルからのマニフェストファイルの呼び出し方法

この２つの流れで説明してみたいと思います。


#①マニフェストファイルからの読み込みの設定方法
app/assets/javascripts/application.js
app/assets/stylesheets/application.css
この２つが、マニフェストファイルと呼ばれます。

マニフェストでは、読み込みたいJsとスタイルシートをまとめて設定することが出来ます。なので、その他のerbファイルが共通で読み込みたいものをこちらで設定します。デフォルトで既に以下のようなものが設定されています。

```lang:application.js
//= require jquery
//= require jquery_ujs
//= require jquery turbolinks
//= require jquery_tree .
```

```lang:application.css
*= require_self
*= require_tree .
```
それぞれの意味については、ここでは深く触れませんが、表を載せておきます。自分のapp/assets/に配置されているファイルとウェブ上での実行結果を実際に見比べてみると理解が深まるかと思います。

| ディレクティブ | 概要  | 
|:-----------|:------------|
| require path       |指定されたファイルpathをインクルード(１度だけ) |
| include path     | 指定されたファイルpathをインクルード(何度でも) |
| require_directory path        |指定されたフォルダpathをインクルード(アルファベット順)| 
| require_tree path         |指定されたフォルダpathの配下を再帰的にインクルード|
| require_self       |現在のファイルの内容を、他のrequire/includeの前に挿入| 

マニフェストファイルにこれらを設定し、layouts/erbファイルからマニフェストファイルを呼び出すことで、マニフェストファイル経由で読み込んでほしいJsとスタイルシートを読み込むことが出来るようになります。

#②erbファイルからのマニフェストファイルの呼び出し方法

```lang:test1.html.erb
<head>
<%= sylesheet_link_tag "application", media: "all", data-turbolinks-track" => true %>
<%= javascript_include_tag "application", data-turbolinks-track" => true %>
</head>
```
それぞれに設定されている２つめのオプションの"application"の部分は、
/assets/application.css　
/assets/application.js
このファイル2つ、すなわちマニフェストファイルを呼び出すことを意味しています。

マニフェストファイルを通さずに呼び出すには、このように指定すれば、/assets/test1/test.cssと、/assets/test2/test.jsを呼び出せるかと思います。

```lang:test2.html.erb
<%= sylesheet_link_tag "test1/test", media: "all", data-turbolinks-track" => true %>
<%= javascript_include_tag "test2/test", data-turbolinks-track" => true %>
```
paperclipから呼び出すコマンドの負荷を少しでも下げたい

運用をしていてpaperclipから呼び出すimagemagickのコマンドの負荷を少しでも下げたい場合がある
paperclipの[この](https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/helpers.rb#L25)メソッドからコマンド実行するときにioniceとniceを付ける

#### helpers.rbのrunメソッドをoverrideする
* 開発環境がmacの場合ioniceを入れるのが面倒そうだったのでproductionのみ付けるようにした
* 優先度は最低(```ionice -c3 -n7 nice -n19```)にした

##### config/initializers/paperclip_helpers.rbにoverrideを記述する

```rb
require 'paperclip/helpers'
Paperclip::Helpers.module_eval do
  def run(cmd, arguments = "", interpolation_values = {}, local_options = {})
    command_path = options[:command_path]
    Cocaine::CommandLine.path = [Cocaine::CommandLine.path, command_path].flatten.compact.uniq
    if logging? && (options[:log_command] || local_options[:log_command])
      local_options = local_options.merge(:logger => logger)
    end
    Cocaine::CommandLine.new("#{Rails.env.production? ? 'ionice -c3 -n7 ' : ''}nice -n19 #{cmd}", arguments, local_options).run(interpolation_values)
  end
end
```
CakePHPのキャッシュファイルからスキーマ情報をサルベージする

皆さん、ちゃんとMigrationsファイルは作っていますか？DB設計書は作っていますか？

深遠なる理由で（例えば片手間で作ったシステムが思いっきり使われてしまっていて、そのまま運用してたり）、MigrationsファイルもDB設計書もないときに

```
＿人人人人人人人＿
＞　突然のDB死　＜
￣Y^Y^Y^Y^Y^Y￣

＼(^o^)／オワタ
```

で、どこかに「スキーマ情報残っていないものか」と考えた挙句思いついたのが

 **スキーマ情報のキャッシュファイル** 

です。

## CakePHPのスキーマキャッシュファイル

CakePHPのデフォルトのキャッシュ対象に、実はデータベースのスキーマ情報情報があります。
さらにデフォルト設定だとファイルキャッシュで `app/tmp/cache/models/` に保存されています。

これが、実はただのシリアライズファイル(+タイムスタンプ)なので、ここからスキーマ情報情報のサルベージを試みてみました。

## サルベージスキーマ.php

```php
<?php
define('MODEL_CACHE_DIR', __DIR__ . '/app/tmp/cache/models');

// app/Config/Schema/schema.phpのヘッダ行
$header = <<<EOF
<?php 
class AppSchema extends CakeSchema {

    public function before(\$event = array()) {
        return true;
    }

    public function after(\$event = array()) {
    }


EOF;

// app/Config/Schema/schema.phpのフッタ行
$footer = <<<EOF

}
EOF;

$out = $header;

// emptyファイルの削除と*_listファイルからキャッシュファイル名のprefixを取得
$prefix;
$schemaCacheFiles = array();
foreach (glob(MODEL_CACHE_DIR . '/*') as $filePath) {
    $fileName = basename($filePath);
    if ($fileName === 'empty') {
        continue;
    }
    if (preg_match('/^(.+)_list$/', $fileName, $matches)) {
        $prefix = $matches[1];
        continue;
    }
    $schemaCacheFiles[] = $filePath;
}

// 各キャッシュファイルからスキーマ情報をサルベージ
foreach ($schemaCacheFiles as $filePath) {
    $fileName = basename($filePath);
    $tableName = preg_replace('/^' . $prefix . '_/', '', $fileName);
    $out .= '    public $' . $tableName . ' = ';
    $contents = explode("\n", file_get_contents($filePath));
    $serialized = $contents[1];
    $out .= var_export(unserialize($serialized), true);
    $out .= ';' . "\n";
}

$out .= $footer;

echo $out;
```

これを

     $ cd /path/to/project_root/
     $ cp /path/to/salvage_schema.php ./

こうして

     $ php salvage_schema.php > app/Config/Schema/schema.php

こう！

     $ ./Vender/bin/cake -app app schema create

復活！！

## というわけで

ちゃんとスキーマ情報は記録しておきましょう。
論理削除機能の変遷とYasd Plugin for CakePHP

@zuborawka さんにハードルを上げられてしまったので、便利そうなな話をがんばります。

ちなみに最初にアドベントカレンダーに投稿しようと思っていた **闇** なエントリーは[こちら](http://qiita.com/k1LoW/items/655270d69be8d3deb494)

---

今回のアドベントカレンダーでは [modifiedを更新するために](http://qiita.com/k1LoW/items/dc144d961489664646a8)論理削除の話をしようと思います。


CakePHP界隈でも論理削除のPluginは多くあります。

- [mariano/syrup](https://github.com/mariano/syrup) の `soft_deletable.php` (CakePHP 1.3.x)
- [CakeDC/utils](https://github.com/CakeDC/utils) の `SoftDeleteBehavior.php`
- [kozo/LogicalDeleteBehavior](https://github.com/kozo/LogicalDeleteBehavior) (CakePHP 1.3.x おそらく @kozo がCakePHP2.x対応版を隠し持っている)

## Fusicの論理削除の変遷

**以下、個人的見解です**

### 古き良きCakePHP1.xの時代

かつてCakePHP1.xを利用していたころ、まだPluginへの切り出しは少なく、Behaviorとして公開されていた[soft_deletable.php](http://bakery.cakephp.org/articles/mariano/2007/04/16/soft-delete-behavior)だけが広く認知されていました（`初期soft_deletable.php`)。

当初上記 `初期soft_deletable.php` はPostgreSQLに対応しておらず(BOOLEANの扱い)、Fusicではこれを拡張してPostgresSQLでも使えるようにして利用していました。

### CakePHP2.xの登場

CakePHP2.xの登場によりBehaviorの書き方が変更になり、`初期soft_deletable.php` をそのまま使えなくなりました。

当時、しっかりと管理されていた論理削除機能をもつPlugin(で見つけられたもの)は[CakeDC/utils](https://github.com/CakeDC/utils)だけでしたが、これは、「論理削除の挙動」が`初期soft_deletable.php`と異なり、そのまま何も考えずつかってしまうことで度々「仕様の勘違いによる不具合」を発生させることがありました。

具体的には `delete_flg = NULL` の時の挙動が、以下のように異なります

- `初期soft_deletable.php` はfindで取得する
- [CakeDC/utils](https://github.com/CakeDC/utils)だとfindで取得しない

これはDBのテーブルが `default 0` 設定をしていなかったり、途中から論理削除機能を導入しようとしたときに問題になります。

ここから **論理削除機能は群雄割拠時代を迎えます**。

### 論理削除群雄割拠

`初期soft_deletable.php` の挙動に慣れてしまっている人はPosgreSQLに対応した[mariano/syrup](https://github.com/mariano/syrup)を、独自にCakePHP2.xに対応させて利用していました。

また、[CakeDC/utils](https://github.com/CakeDC/utils)を検討し、正しく活用する人もいました。

この時には既に「Behaviorのまま配布するのは良くない。全てはPluginに内包すべき」という流れがはじまり、`初期soft_deletable.php`派の人たちによる論理削除プラグイン亜種が発生することになりました。

## Yasd: Yet Another SoftDeletable Behavior

拙作Yasdの紹介をします。

https://github.com/k1LoW/Yasd

Yasdはまさに「 `初期soft_deletable.php` 亜種」の部類に入ります。またFusicの事情(PostgreSQL / MySQLの混在)にもマッチしているものになっています。

特徴としては

- `delete_flg = NULL` の場合もfindで取得できる
- hasOne、hasMany、hasAndBelongsToMany 先のModelに対しても1階層論理削除チェックを行う
- テストケースが書かれている
- CIがMySQL / PostgreSQLで実施されている [![Build Status](https://secure.travis-ci.org/k1LoW/Yasd.png?branch=master)](http://travis-ci.org/k1LoW/Yasd)

というものがあります。

さらに、最近の機能追加で

- `初期soft_deletable.php` や [CakeDC/utils](https://github.com/CakeDC/utils) で要求されていた「フラグ `delete_flg` 」と「削除日時 `deleted`」の2つのフィールドを、どちらか1つのフィールドだけでも動くように対応

というものもあります。

## 使い方

```php
<?php

class AppModel extends Model {
    public $actsAs = [
        'Yasd.SoftDeletable'
    ];

...

```

と書いておけば、該当モデルで`delete_flg` と `deleted` が存在していれば、勝手に論理削除機能が発動します。

```php
<?php

class AppModel extends Model {
    public $actsAs = [
        'Yasd.SoftDeletable' => [
            'field' => false,
            'field_date' => 'deleted',
        ]
    ];

...

```

と設定すると、該当モデルで `deleted` だけ存在していれば、勝手に`deleted`を利用した論理削除機能が発動します。

## というわけで

論理削除機能にYasdはいかがでしょうか？
Flycheckで捗らせる

FlycheckはRustに対応しています。

![スクリーンショット 2014-12-20 3.16.53.png](https://qiita-image-store.s3.amazonaws.com/0/13430/01ec9783-44d0-b2b2-dd0a-079f35b471e1.png)

捗りますね。
Androidアプリの構成

#画面の作り方の違い

作成するとき迷ったので，皆さんの意見を聞きたいです．．．

##1つのActivityに1つのXML
画面の遷移は`Intent`を利用して別Activityに移動しレイアウトXMLを設定することで表現する形式．

**メリット**

* Activityを部品化

**デメリット**

* Activityの乱立
* Activity間の情報共有の難しさ

##1つのActivityに複数のXML
画面の遷移は`setContentView(R.layout.~)`を利用して同一のActivityで各画面のレイアウトXMLを設定する形式．

**メリット**

* 各画面のレイアウトXMLとActivityだけというシンプルな構成

**デメリット**

* Activityがコントローラとなり全ての画面の操作が必要．複雑になる？

##1つのActivityに1つのFragment
画面の遷移は`Intent`を利用して別Activityに移動しFragmentを設定することで表現する形式．

**メリット**

* Fragmentを部品化

**デメリット**

* Activityの存在意義？

##1つのActivityに複数のFragment
画面の遷移は`FragmentTransaction`を利用して，同一のActivity内でFragmentを切り替えることで表現する形式．

**メリット**

* Fragmentを部品化
* Activityに情報を持たせることで情報の共有が楽

**デメリット**

* Activityがちょっと複雑化？


#その前に
Fragmentを使うのは主流？なのでしょうか？
Androidアプリに関して根本的なことろは勉強していなかったので，どなたかご教授いただけたら嬉しいです．

自分がサークルで作成したアプリはTabHostを実現したかったのですが，ActivityGroupが非推奨ということもあり，迷った挙句TabWigetが押されたらFragmentを切り替えるようにして作成しました．先ほどの**1つのActivityに複数のFragment**といったところでしょうか．

実際はどのように作成されている方が多いのでしょうか？
AndroidでTCPDUMP

#キッカケ
AndroidのTCPDUMPはtPakcetCaptureが有名なんだけど、せっかくROOT化してるのだし、直に生パケットが欲しかったので設定してみた。※Root化前提です。Root化はググってね。

方法は2通り。
1.AndroidSDKのAVDを立ち上げて、tcpdumpを引っこ抜いて実機に置く。
2.１からビルドする。

##AndroidSDKのAVDから引っこ抜く
簡単。単純に`android`コマンドからAVDを立ち上げて、`adb pull /system/xbin/tcpdump ./`でtcpdumpを引っこ抜く。このとき移し替える実機のOSヴァージョンとエミュのヴァージョンを合わせること。んで、以下の通り実行する。

途中で、remountしてsystem以下を書き込みおkにするので、慎重に行うこと。system以下のファイルから実行権限抜くとAndroidが文鎮化します。文鎮化した場合、fastbootからOSの焼き直しかバックアップファイルからのOS復旧を行う。

```file:command
$ adb device
$ adb push ./tcpdump /sdcard/tcpdump
$ adb shell
shell@android:/ $ su
root@android:/ # mount -o remount,rw /dev/block/mtdblock0 /system
root@android:/ # ls /system/xbin/tcpdump
root@android:/ # cp /sdcard/tcpdump /system/xbin/tcpdump
root@android:/ # ls -l /system/xbin/tcpdump
-rw-rw-r-- root     root       652964 2013-10-26 11:46 tcpdump
root@android:/ # chmod 755 /system/xbin/tcpdump
root@android:/ # ls -l /system/xbin/tcpdump
ls -l /system/xbin/tcpdump
-rwxr-xr-x root     root       652964 2013-10-26 11:46 tcpdump
```

ちなみに、shell@android -> root@androidにするのが面倒というか、直にadb shell tcpdumpを叩きたい場合は、

```
$ adb root
$ adb remount
```
でリマウントさせるか、[adbd-Insecure-v2.00.apk](http://forum.xda-developers.com/showthread.php?t=1687590)を使って常時Rootにする（後者の方がプログラム組むとき楽）。

実行は
`$ adb -s 015d3f18d124061a shell tcpdump -s 0 -vv -w /sdcard/test.pcap`
のように行う。

```
$ adb -s 015d3f18d124061a shell tcpdump -s 0 -vv -w ./test.pcap
$ tcpdump: test.pcap: Read-only file system
```
上記のように直接ホストに保存するように叩くと怒られる。

ただ普段、AVDを使わずに実機やらkvmやらvirtualboxやらを使ってるとめっちゃ面倒な方法。

参考:[Android でパケットキャプチャしてみる](http://logroid.blogspot.jp/2013/10/android-tcpdump-packet-capture.html)


##1からビルドする。
こちらは[USB Sniffing with tcpdump](http://omappedia.org/wiki/USB_Sniffing_with_tcpdump)を参照

###Building tcpdump以下の通りにやる
まず[Android NDK](http://developer.android.com/tools/sdk/ndk/index.html)からAndroid-ndkを落としてくる。その後、

```
$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
$ ./android-ndk-r10c-darwin-x86_64.bin
```

で解凍する（ちょっと長い）。次にBuild-tcpdump.tar.gzをダウンロードする。解凍すると`build-tcpdump`がでてくる。次にbashに変えて、以下を実行する。
```
$ export NDK=/path/to/android-ndk-r10d
$ sh build-tcpdump
```
で終わり。なお、build-tcpdumpの中にAPIを設定する部分があるので、適宜変変更する。4.x系のみ掲載しておく。今回は17で作ってみた。あとは、前述の`command`と同操作。

>Android 4.0.x==14	Ice Cream Sandwich
Android 4.0.3==15	Ice Cream Sandwich MR1
Android 4.1.x==16	Jelly Bean
Android 4.2.x==17	Jelly Bean MR1
Android 4.3==18	Jelly Bean MR2
Android 4.4==19	KitKat

###Building manually from source
フルでビルド。後でやってみる。
LinuxでHaxeが書きたい時のソリューション

## Haxeを書くときに使うエディタ・IDE
Haxeを書くときに一つ決めなければならないことがあります。
そう、エディタをどうするか、ということです。
プログラマの商売道具であるエディタを選ぶ作業はとても重要なのです。

では、Haxeはどんなエディタで書けるのでしょうか。
Javaなどの言語ならナイスなIDEが沢山あり、ヨリドリミドリなのですが、Haxeだとそうもいかないようです。
ちょっとどんなエディタがあるか見てみましょう。

[Haxe IDE and Editors](http://old.haxe.org/com/ide)

このページを見ると、
`Javaなどの言語ならナイスなIDEが沢山あり、ヨリドリミドリなのですが、Haxeだとそうもいかないようです。`
この言葉には矛盾があると思われるかもしれません。
しかし、Linuxを使用しているなら、それだけでもプラットフォームの壁がありますし、
そうでなくてもすべてのIDEが活発に開発が進められているとは限りません。

では、いくつかのエディタ・IDEを例に挙げて、なぜ採用に至らなかったのか見てみましょう。

### Intellij
確かに使いやすいIDEで、特に不便もなく使えていました。
しかし、**Haxe用プラグインのアップデートによりバグが生じ、現在は自動でコンパイル \-> 実行ができない**
(OpenFL、hxcpp使用時)
謎のコンパイル時エラーを吐きそこで止まってしまいます。
正確には、コードのコンパイル自体は正常にできているのですが、
おそらくhaxeコンパイラの出力をintellijプラグインが文字解析する際のプロセスに何らかの不具合があり、
正常な出力をエラーとして認識してしまっていると考えられます。
コンソールを別で開き、手動で生成された実行ファイルを実行するするなどの手段で実行可能です。

### monodevelop
そもそも謎のエラーを吐き、コンパイルできない。

### gedit
インストール用にシェルスクリプトが用意されていましたが、そもそもそのスクリプトに問題がありました。
手動で治すも、プラグインの実行がうまく行かず断念。

### FlashDevelop
windowsのみ対応。素晴らしいIDEだと思います。
windowsをお使いなら、これで問題ないでしょう。

### Emacs
宗教的な理由により、使用できません。

## Linuxで使えるエディタ
というように、色々と壁があります。
上で述べたようにwindowsならFlashDevelopで問題ないでしょう。
しかし、そうはいきません。
Intellijは使いやすいIDEで、バグが出るまでは僕も使っていたのですが...

最終的に僕が選んだのは**vim**でした。
[Haxeを書くためのvimプラグイン](https://github.com/jdonaldson/vaxe)があり、
設定もそこまで難しくなかったです。
ctagsなどと組み合わせることにより、前述のIDEと変わらないくらいの機能性を持たせることが可能です。
(ctagsの設定ですが、[Haxe IDE and Editors](http://old.haxe.org/com/ide)の下の方に載ってます。)

Qiitaにもvimプラグインの設定方法を書かれている方がいらっしゃるので、参考にされてみてはいかがでしょうか。

是非試してみてください！
Goのhttpモック用モジュールを作ってみた

[github.com/hiroosak/gomock](https://github.com/hiroosak/gomock) - [GoDoc](http://godoc.org/github.com/hiroosak/gomock)

[ソースに一行追加するだけですべての HTTP 通信をロギングするモジュールを書いた #golang](http://motemen.hatenablog.com/entry/2014/12/02/go-loghttp) をみて、`Transport`を実装すれば、リクエストを行う前に処理を挟めることを知ったので試しに書いてみた。


```go:main.go
package main

import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"

  "github.com/hiroosak/gomock"
)

func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("/me", func(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    w.WriteHeader(200)
    fmt.Fprintf(w, "Request OK")
  })

  transport := gomock.NewTransport()
  transport.Stub("graph.facebook.com", mux)

  client := &http.Client{
    Transport: transport,
  }

  resp, err := client.Get("https://graph.facebook.com/me")
  if err != nil {
    log.Fatal(err)
  }

  body, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println(string(body)) // Response OK
}
```

`http.DefaultTransport`を書き換えれば、どんなリクエストでもチェックできる。

```go
http.DefaultTransport = transport
defer gomock.ResetDefaultTransport() // 処理終わったら初期化

client := &http.Client{}
```

`RoundTrip`内で`transport.Stub()` でリクエストのURLがマッチした場合に、[net/http/httptest](http://golang.org/pkg/net/http/httptest/)を立ち上げてそっちを参照するようにしている。

## どんなときに使うのか

通常のサーバーへのリクエストをテストで行う場合は、[net/http/httptest](http://golang.org/pkg/net/http/httptest/)を使うべき。
だけど、その場合URLをテストコード側から自由に設定できるようにしておく必要がある(リクエストURLの向き先を変えなければいけないから)。
なので、本当はリファクタリングしたいけれど、出来ないとき用のものが欲しかった。
JFileChooserをインスタンス化すると、とあるDLLが正常動作しなくなった件

# はじめに
仕事でSwingを使う機会があったのですが、その時に一箇所ドハマリした所があったので、メモ的に残します。
問題を起こしていたのは、SwingのJFileChooserです。 今時、Swingを使う方はほとんどいないとは思いますが、同じ事象にあってしまった方限定で書いてみます。
ちなみに、解決策は自分では見つけられませんでした・・・。
良い方法があったら教えて下さい。

# 出会ってしまった事象
JFileChooserをインスタンス化したあとに、JNAでとあるDLLの関数を呼び出すとDLL内で必ずエラーが発生し正常動作しなくなる。

# なんでこんなことが、、、？
情弱なので、憶測の域を出ないのですが恐らくこんなことが起こっていると思われます。

* JFileChooserがインスタンス化すると、インスタンスがネイティブライブラリをロードしインスタンスが参照を外れてもGCで開放されず掴んで離さなくなる。
* JNAで呼びだそうとしているDLLがそのライブラリを使用している。
なので、必要なライブラリ読み込みができずDLL内でこけて、エラーを返す。

# だったら、JFileChooserの参照を消せばいけるのでは・・・！？
結論から言うと、上手くいきませんでした。
スニペットですが、以下の様なコードを動かすとします。

````java:test.java
public static void main (String[] args) {
    int retVal;

    // JNAでDLLを呼び出します。
    retVal = callDllFunc();

    if(retVal == 0) {
        // 呼び出したDLLが正常動作している場合
        System.out.println ("DLL work properly")
    } else {
        // 呼び出したDLLが異常動作した場合
        System.out.println ("DLL doesn't work properly")
    }
    
    // JFileChooserをインスタンス化します
    JFileChooser fc = new JFileChooser();
    // 参照を外します
    fc = null;

    // JFileChooserの参照が外れている状態で、DLLを呼びだします。
    retVal = callDllFunc();

    if(retVal == 0) {
        System.out.println ("DLL work properly")
    } else {
        System.out.println ("DLL doesn't work properly")
    }
}

/**
 * 戻り値が0なら正常、1なら異常とします。
 */
private int callDllFunc() {
    int retVal = Dll.INSTANCE.hogeProcess();
}

/**
 * JNA用のインターフェースです。
 */
private interface Dll extended Library {
    Dll INSTANCE = (Dll)Native.loadLibrary("C:¥hoge.dll", Dll.class);
    int hogeProcess();
}

```

ここで、以下のように標準出力に出力されることを期待していたのですが、、、

```
DLL work properly
DLL work properly
```

結果は、

```
DLL work properly
DLL doesn't work properly
```

となってしまいます。

# JFileChooserは参照が外れたあともオブジェクトが生き続ける・・・？
というのを、試してみました。

```java:gcTest.java
public void gcTest() {
    // JFileChooserをインスタンス化します。
    JFileChooser fc = new JFileChooser();

    // 弱参照を作ります。
    WeakReference<JFileChooser> wf = new WeakReference<JFileChooser> (fc);

    // オブジェクトの参照を外します。
    fc = null;
    
    // GCしてみます。
    Runtime.getRuntime().gc();
    
    // オブジェクトの生死を確認します。
    if (wf.get() != null) {
        System.out.println("生きています");
    } else {
        System.out.println("もういません・・・");
    }
}

```

gcTestを試しに1000回ループで回してみましたが、ただの一度もオブジェクトがGCで回収されることがありませんでした・・・。

## もしかして・・・
JFileChooserが一度でも描画されると、以降GC対象にならないというバグが昔ありました。
[Bug ID:JDK-4255413](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4255413)
これ、、、なおっているのでしょうか・・・？
試しに動かした感じは、直っていないような挙動をしていますが・・・

# で、結局どうしたかというと・・・
JFileChooserの使用は諦めて、AWTのFileDialogで代替したら上手くいきました。。。
びっくりするほど、バッドプラクティスなので何とかしたいのですが・・・
改めて、もし良い方法をご存知の方がいたらアドバイスをお願いしたいです・・・
Sublime Text 3のショートカット（Mac OS X向け）

OS X向けのよく使うショートカットの一覧です。

# 編集関連

### 行の入れ替え

	ctrl + command + 上/下

### キャレットの追加

	ctrl + shift + 上/下

※Macのミッションコントロールのショートカットを無効にする必要あり

### 選択範囲を拡張して同じ単語を選択

	command + D

### 選択を取り消す

	command + U

### ソートする

	F5

### 閉じタグを挿入する

	command + option + .

### HTMLのタグの中身を選択

	command + shift + A

# 検索関連

### Goto Anything

	command + P

projectにあるファイルに即座に移動できる。
すごい便利な機能。

### 指定の行に移動

	ctrl + G

### 次/前を検索

	command + F で検索をした後に
	command + G / command + shift + G

### 一括置換実行

	command + option + F

で置換モードにして、

	ctrl + option + Enter

# 表示関連

### 集中モード

	command + shift + ctrl + F

### フォントを大きくする

	command + shift + ;

### フォントを小さくする

	command + -

### 左右のタブに移動

	command + shift + [ / ]


### サイドバーをフォーカスする

	ctrl + 0

### 隣の分割されたグループに移動

	command + k, command 左/右

または

	ctrl + 1/2/3/4



# ショートカットではないが、便利な技

### 短形選択

	optionを押しながらドラッグ

### キャレットを任意の場所に追加

	commandを押しながらお好きな場所をクリック

# 同じファイルを複数タブで開く

同時に開きたいファイルをアクティブにし、File > New View into Fileを選択する
上下左右に画面を分割すれば見やすい
Ubuntu12.04LTSにtig2.0.3をインストール


なぜ12.04なのというのは置いといて.

https://github.com/jonas/tig/releases から最新tarballをwgetで落とす

以前から`/usr/bin/tig`に入ってた古いバージョン(0.1.7とかそのへん)は`sudo apt-get purge tig`で消しておく.
日本語に対応するためncurseをいれて設定を忘れずに.

```
$ sudo apt-get install libncursesw5-dev
$ LDLIBS=-lncursesw CFLAGS=-I/usr/include/ncursesw make prefix=/usr/local
$ LDLIBS=-lncursesw CFLAGS=-I/usr/include/ncursesw sudo make install prefix=/usr/local
```


```
$ which tig
/usr/local/bin/tig
$ tig --version
tig version 2.0.3
`````
ちゃんとRESTでつくるWebAPI


## 切ない思い出

少し前だけれど、ASP.NET Web APIを使って開発をした。
開発要件からすると大変いい感じにフレームワーク選定したと思うし、急に決めた割には、今思っても良かったと思う選択だった。

ただいざクライアントに提供する機能を作ってるうちに、なんか変なことになってきた。

## とりあえずPOST

クライアントからDBに対して読み書きしたい用事があるときは当然Webサーバーで、ASP.NET Web APIで作った機能を経由することにした。ただその時に、DBのテーブル（単体）に対するCRUDだったらテーブルからScaffoldした処理を使い、そうじゃない複数のテーブルがからむ処理は、基本POSTにしてそれぞれクラスを作って処理することにした。

今思うとなんでそんなことしたのかと思うが、System.Net.Http.HttpClientを使って通信する場合に、POSTにしておけばどんなオブジェクト渡しても同じようにシリアライズして送信してくれるからいいよね、という発想だったと思う。
確かに検索っぽい処理（何らかの情報を元に、何らかの情報を取ってくる）のときに、単純に特定のテーブルの属性値を渡すのではなくて、クライアント側が使っているオブジェクトをそのままシリアライズして渡してしまえば楽であろうという局面もあった。

結果的に、POSTメソッドだけ実行したコントローラーがたくさんできて、それぞれのコントローラーにはRPCで呼ばれる的な名前がついた。

これは例えば、
- 本
- 利用者
- 貸出リスト（本・利用者の中間テーブル）

![kobito.1418700964.699912.png](https://qiita-image-store.s3.amazonaws.com/0/5603/31f20954-8e78-69e5-0dc9-1530a28279e6.png "kobito.1418700964.699912.png")

みたいな構成のテーブルがあって、特定のユーザーの貸出情報を取得するときに、URIが
POST http://hostname/get_lendinguser
になっていて、BODYにuser_idが入っているみたいな感じだ。

## やってしまうパターン

ASP.NET WebAPIにかぎらず、scaffoldの機能があるフレームワークは多い。
それでとりあえずチュートリアルとか見ながら作っていくと、だいたいテーブルがDBにあって、それに応じてModelとControllerとまあViewも生成されますみたいなことになる。
それでRESTのインターフェースもできているので、ああなるほどCRUDできますねみたいに覚えるのだけれども。

実際には、当然なにかリクエストがあったときに複数のテーブルを結合した結果を返したり、複数のテーブルで更新したりする。
そうするとその操作対象が何かということよりも、だんだんどんな操作をするのかというほうに頭が行き、結局APIとしてはよくわからないようになってしまったんであろう。

## リソース。

とにかくRESTで重要なのは、サービスとしてアクセスできる対象をリソース（もの）でとらえることだ。
だから、アクセスするときにつかう表現に動詞っぽいものが入ってきたらそれはほぼほぼおかしい。

名詞でコントローラー名がついて、それに対してHTTPメソッドによって操作内容がかわるというかたちになるようにする。

## 名詞の選び方

といってもテーブル名そのままなら名詞化っていうのは簡単なわけだが、例えば複数テーブルをJoinした結果に対してどのような名前をつけるか。

きれいに行く形というのはその複数のテーブル（物理レベル）が表現しているデータの概念の方（概念レベル）の名前にする場合と思われる。

例えば、さっきと同じく
- 本
- 利用者
- 貸出リスト（本・利用者の中間テーブル）

![kobito.1418700964.699912.png](https://qiita-image-store.s3.amazonaws.com/0/5603/31f20954-8e78-69e5-0dc9-1530a28279e6.png "kobito.1418700964.699912.png")
みたいな構成のテーブルがあって、特定のユーザーの貸出情報を取得するようにすると、URIは
GET http://hostname/lendinguser/{user_id}
にする。

別にテーブルを物理レベルで見ると貸出中のユーザーなんてないんだけれども、クライアントからみた概念としては自然に見える。もちろん貸出が発生したら、同じURIでPOSTするということも自然に想定できる。


## 利点

RESTfulなインターフェースにしておく利点として、単純にAPIとしてわかりやすいということもあるだろうけれど、例えばRPC的に毎度サーバー側に処理を実装しなくても、2,3回リクエストすれば処理が完了できるようなケースでサーバー側の処理の負担が減る良さがあると思う。

クライアント・サーバー構成のシステムでサーバーがWebAPIで機能を公開するようなときは、サーバー側でインターフェースを公開するときにクライアント側もどんなインターフェースになるか調整しないといけないから、負担はお互いそれなりにかかる。
サーバー側で用意されているものを使うだけでやれるなら、クライアントがの実装としても楽になる。

## 例外

ちなみに、本当にクライアントからサーバー側の処理を呼びたいだけのときというのは、RPC的にインターフェースを作っても誰も文句は言わない。

## コントローラーを増やすときの心構え

コントローラーを増やすときなので、以下のことに気をつける。

* クラス名は「概念を表す名詞」をつける。

このあたりは、概念としてデータを捉えられていないととっさに変な命名をしがちなので、普段から整理することも大事だと思う。
絶望とともに学ぶパッケージソフトウェア開発


まず、パッケージソフトウェアの開発について、大変役立つ[書籍](http://www.amazon.co.jp/%E9%A2%A8%E3%81%AE%E6%AD%8C%E3%82%92%E8%81%B4%E3%81%91-%E8%AC%9B%E8%AB%87%E7%A4%BE%E6%96%87%E5%BA%AB-%E6%9D%91%E4%B8%8A-%E6%98%A5%E6%A8%B9/dp/4062748703 "風の歌を聴け") があるので紹介する。その本の冒頭には次のようにかかれている。

>完璧な文章などといったものは存在しない。完璧な絶望が存在しないようにね。

初めてこの小説の冒頭部分を読んだ時に、たいして感慨を持ったおぼえはない。しかし、パッケージソフトウェアの開発に関わることになって数年が立った時、この文章がリアリティを伴って感じられるようになり、しだいに開発者がパッケージソフトウェアに関わるときの苦悩が延々と書かれている文章としか思えないようになった。
なによりも、ここに引用したように、この小説は絶望についての記述で始まる。

## 絶望？

なぜ絶望のはなしから始めるのか。

パッケージソフトウェアがリリースされ、それからバグが出ると、開発者が絶望するからだ。

このリリース後のパッケージソフトウェアにバグが出た時ほどの絶望は、他に思いつかない。なぜそれほどに絶望が深いのかといろいろ考えてきたが、まあパッケージソフトウェアが、リリースされた後に修正できないせいであろう。
パッケージソフトウェアはCDないしDVDで出荷されてたくさんのPCやなんかにインストールされてしまう。それらに配られたものを直接修正することはできない。

本当は、パッケージソフトウェアのバグを根絶する方法を紹介できたらよかったのだが、それはやはりできない。


## バグのあるパッケージソフトウェアに対してできること

バグが出た時は絶望するしかないが、数分休めばデバッグができるようになる、そうすると修正版をリリースできるようになる。


## ビルドプロセス

### Visual Studio でできるビルド設定の種類

というわけで、せめてビルド設定を行って少しでも修正版のリリースを簡易にしようというのが本題だ。

リリースするモジュールの作成には手間がかかるし、ミスがあると不具合に直結する。CD-ROMなどにパッケージされてリリースされるソフトウェアともなれば、そのCD-ROMの構成にファイルを配置するのに丸一日作業することだってあり得る。

で、例としてはVisual Studio 2013になるが、ビルドプロセスの設定としては、いくつか選択肢がある。

http://msdn.microsoft.com/ja-jp/library/cyz1h6zd(v=vs.110).aspx

１． IDEを使用する

- なにより簡単
- 多少カスタマイズできる

２． MSBuild コマンドライン

- 細かい設定やカスタマイズができる

http://msdn.microsoft.com/ja-jp/library/dd393574(v=vs.110).aspx

３． Team Foundation ビルド

- 便利らしい


### IDEでのビルド設定

このなかで、多少とも説明できるのはIDE上での設定なので、それについて説明する。



①ビルド構成の追加

構成マネージャーから、新規作成で構成を追加できる。

![kobito.1418478449.234630.png](https://qiita-image-store.s3.amazonaws.com/0/5603/10c85d35-9f2b-04e9-6576-7ccd6840ce3f.png "kobito.1418478449.234630.png")


②出力先の変更

プロジェクトのプロパティにて

![kobito.1418478631.123685.png](https://qiita-image-store.s3.amazonaws.com/0/5603/93938d69-e6d6-a2c9-b477-7bb96350c3c3.png "kobito.1418478631.123685.png")

ここで出力先が追加できるので、複数のソリューションがある場合は、リリースされるメディアの構成に沿った形で出力されるようにする。

③いらないファイルをでなくする。

pdbファイルが出力されないようにするには

プロジェクトのプロパティ > ビルド　> 出力　から
詳細設定を選ぶ。

![kobito.1418478827.129967.png](https://qiita-image-store.s3.amazonaws.com/0/5603/3681cd4b-81b3-0915-701a-499873ecf07e.png "kobito.1418478827.129967.png")

それで、出力 > デバッグ情報を none にする。

![kobito.1418479058.512496.png](https://qiita-image-store.s3.amazonaws.com/0/5603/406a0b43-fed7-94ed-c7c2-0607e85c6e0e.png "kobito.1418479058.512496.png")


vshost.exe が出力されないようにするには

プロジェクトのプロパティ > デバッグ > デバッガーを有効にする　で、
Visual Studio ホスティング プロセスを有効にする　のチェックを外す。
![kobito.1418481799.265263.png](https://qiita-image-store.s3.amazonaws.com/0/5603/b905cbcf-b5d2-f66a-b688-d8915127c73d.png "kobito.1418481799.265263.png")

④Debugフォルダのファイルをコピーする

たまに、Debugフォルダにいれて使っていたファイル（なんかDLLとか）をそのままリリースするディレクトリに移したい時があると思われるので、
プロジェクトのプロパティ >　ビルドイベントにて設定する。
![kobito.1418482659.268663.png](https://qiita-image-store.s3.amazonaws.com/0/5603/42013192-c861-7173-6ea7-acf83ddebc5e.png "kobito.1418482659.268663.png")


### 最後に

バグのないソフトウェアが存在しないなら、バグを恐れて心労を重ねるのも無意味であるように思える。
バグは必ずあるし、心労は品質に寄与しないしないからだ。

でも、CD-ROMが早く焼ければそれは意味がある。
何度でも焼けばそれでいいことなのだ。