OmniAICreator/Qiita-1.07M huggingface dataset:
ViewからViewControllerを取得する

viewからview controllerの直接的な参照はないのですが、Responder chainを追って行くとview controllerが取得できます。Auto Layout用のtopLayoutGuideを、view側のlayoutSubviewから取得できるのでかなり便利です。逆に、viewのレイアウト以外の用途でこのテクニックを使うとしたら、本当にそれが必要が考え直した方が良いと思います。

MVCパターン的にはこれは禁じ手です。
Use it well.

## 実装

UIViewのカテゴリとして実装しています。

```objc
- (UIViewController*) btk_parentViewController
{
    UIResponder *responder = self;
    while ((responder = responder.nextResponder) != nil) {
        if([responder isKindOfClass:[UIViewController class]]){
            return (UIViewController*)responder;
        }
    }
    return nil;
}
```

## 根拠

公式ドキュメント
https://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/nextResponder

```text
UIView implements this method by returning the UIViewController object that manages it (if it has one) or its superview (if it doesn’t)
```
CIKernel を使用してCore Imageのカスタムフィルタをつくる

Core Image の CIFilter を使うといろいろなフィルタ処理（画像処理／画像加工）ができますが、iOS 8で <b>CIKernel というクラスが追加され、そのフィルタ（CIFilter）を自作</b>できるようになりました。

以下、CIKernel のフィルタ処理を記述し、それを使ってオリジナルの CIFilter を定義し、画像に適用するまでの手順です。

（更新履歴）本記事は2014年のiOS 8がまだベータ版だった頃に書いたもので、**Objective-Cコードは古くなっている可能性**があります。Swiftコードは2017年12月に追記したもので、**Swift 4対応**です。

## CIKernel をつくる

### カーネルを書く

カーネルは<b>GLSLのサブセット</b>で書きます。

```
kernel vec4 swapRedAndGreenAmount ( __sample s, float amount )
                  { return mix(s.rgba, s.grba, amount); }
```

### CIKernelオブジェクトを生成する

上記で書いたシェーダを <b>文字列として CIKernel の初期化メソッドに渡します</b>

```objc:objc
CIKernel *kernel = [CIKernel kernelWithString:kernelStr];
```

```swift:swift
let kernel = CIColorKernel(source: kernelStr)!
```

## CIFilter サブクラスをつくる

上記で生成した CIKernel オブジェクトを使用して、CIFilter サブクラスをつくります。

ヘッダには下記のようにプロパティを定義します。

```objc:MyFilter.m
@interface MyFilter : CIFilter

@property (nonatomic, strong) CIImage *inputImage;
@property (nonatomic, copy) NSNumber *inputAmount;

@end
```

実装ファイル側は長くなるので省略しますが、CIKernelを適用して出力する部分はこんな感じす。

```objc:MyFilter.m
- (CIImage *)outputImage
{
    return [[self myKernel] applyWithExtent:self.inputImage.extent
                                  arguments:@[self.inputImage, self.inputAmount]];
}
```

Swift 4で書くと、こんな感じになります。

```swift:MyFilter.swift

class MyFilter: CIFilter {

    private let kernelStr =
    "kernel vec4 swapRedAndGreenAmount ( __sample s, float amount ) { return mix(s.rgba, s.grba, amount); }"

    private let kernel: CIColorKernel
    
    var inputImage: CIImage?
    var inputAmount: Float = 1.0

    override init() {
        kernel = CIColorKernel(source: kernelStr)!
        super.init()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func outputImage() -> CIImage? {
        guard let inputImage = inputImage else {return nil}
        return kernel.apply(extent: inputImage.extent, arguments: [inputImage, inputAmount])
    }
}
```



##画像に適用する

使い方は **普通の CIFilter （ビルトインフィルタ） と同じ**。

```objc:objc
NSDictionary *params = @{kCIInputImageKey: ciImage,
                         @"inputAmount": @(1.0),
                         };
CIFilter *filter = [CIFilter filterWithName:@"MyFilter"
                        withInputParameters:params];
```

Swift 4の場合：

```swift:swift
let filter = MyFilter()
filter.inputImage = inputImage
let outputImage = filter.outputImage()
```




###実行結果

![results.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/887af996-a3d6-5315-87dd-620b014f4d57.jpeg)

（左：元画像 右：カスタムフィルタ適用後の画像）

##参考資料

- Developing Core Image Filter for iOS (WWDC 2014 Session 515)
- CIKernel Class Reference
- Core Image Kernel Language Reference

##関連記事

ちょっと古いものもありますが、Core Image、画像処理関連の記事は他にもいろいろと書いているので、よろしければご参照ください。

- [Core Image の遷移エフェクトを使う](http://d.hatena.ne.jp/shu223/20130311/1362962817)
- [たったの6ステップ！『漫画カメラ』風に写真を加工するiPhoneアプリの作り方](http://d.hatena.ne.jp/shu223/20121129/1354145960)
- [『第３回 iphone_dev_jp 東京iPhone/Mac勉強会』で vImage について発表してきました](http://d.hatena.ne.jp/shu223/20120721/1342858736)
- [「顔以外」のものを画像認識する](http://qiita.com/shu223/items/ffd2202eaf92d342f83d)
iOS7以降でUDIDを取得する方法

iOS6以前では、UDID取得アプリから取得する事が出来ましたが、
iOS7以降は、正しい値を返さなくなった為、アプリから取得する事が出来ません。
下記の方法で取得可能です。
WindowsとMacともiPhone構成ユーティリティとiTunesで取得出来るので、
状況に応じて、使い分ける事が可能です。

#Windows

##iPhone構成ユーティリティ

####1. iPhone構成ユーティリティのインストール
下記ページよりiPhone構成ユーティリティ（2014/6/30現在 3.6.2）をインストールしてください。
http://support.apple.com/kb/DL1466?viewlocale=ja_JP

####2. iPhoneをWindowsに接続
「Apple iPhone」の窓が表示されるので、
「MicroSoft スキャナとカメラのウィザード」を選択し、
「OK」をクリック

####3. 左ペイン「ライブラリ」→「デバイス」→「該当のiPhone」をクリック

####4. ナビゲーションの「書き出し」をクリック
「xxx.deviceinfo」というファイルが書き出されます。

####5. 書き出された「xxx.deviceinfo」をテキストエディタで開く。

####6. 「deviceIdentifier」で検索

```lang:xxx.deviceinfo
<key>deviceIdentifier</key>
<string>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</string>
```

string部分がUDIDです。


##iTunes


**※iTunesでiPhoneとPC上のデータを同期させない方法です。**
「左上のアイコン」→「設定」→「デバイス」→「iPod、iPhone、および iPad を自動的に同期しない」をチェック「OK」

###手順

####1. iTunesのインストール
下記ページよりiTunes（2014/6/30現在 11.2.2）をインストールしてください。
http://www.apple.com/jp/itunes/download/

####2. iPhoneをWindowsに接続
「Apple iPhone」の窓が表示されるので、
「MicroSoft スキャナとカメラのウィザード」を選択し、
「OK」をクリック

####3. iTunes起動
####4. ナビゲーションの「iPhone」ボタンを押す。
####4. シリアル番号をタップ
####5. 識別子（UDID）に切り替わったら、右ボタン
####6. 「コピー」をクリック


#Mac

##iPhone構成ユーティリティ

####1. iPhone構成ユーティリティのインストール
下記ページよりiPhone構成ユーティリティ（2014/6/30現在 3.5）をインストールしてください。
http://support.apple.com/kb/DL1465?viewlocale=ja_JP

####2. iPhoneをMacに接続

####3. 左ペイン「ライブラリ」→「デバイス」→「該当のiPhone」をクリック

####4. 「概要」タブ、識別子の欄の文字列（40桁）をコピー


##iTunes

**※iTunesでiPhoneとPC上のデータを同期させない方法です。**
「iTunes」→「環境設定」→「デバイス」→「iPod、iPhone、および iPad を自動的に同期しない」をチェック「OK」

###手順
####1. iPhoneをMacに接続
####2. iTunes起動
####3. ナビゲーションの「iPhone」ボタンを押す。
####4. シリアル番号をタップ
####5. UDIDに切り替わったら、cntr + クリック
####6. 「コピー」をクリック
ORM ( O/Rマッピング O/Rマッパー ) について調べてみた

# 雑感
* インピーダンスミスマッチを解消するためのアプローチをひっくるめてORMというらしい。つまり、インピーダンスミスマッチがキーワード。
* とりあえずDDDとか出てくるけどそっちには(本質的には)関係なさげ
* ORMよりO/Rマッピングでググったほうが解説が易しい気がする

# インピーダンスミスマッチについて
* オブジェクト指向でいうところのオブジェクトとDBとのデータの範囲(オブジェクトとかテーブル)の違いのこと
* あるオブジェクトの情報を取得しようとしたときに複数のテーブルからデータを集めるとかそういうこと
* 継承が発生した場合に継承先のオブジェクトで必要なカラムが継承元用のORMオブジェクトで定義できない
* 解決法としては静的動的いろいろあるけど、その部分を吸収してくれるのがORMオブジェクト

# ORMの向き不向き
* 向き不向きがあるらしい。全カラム(SELECT *)できるようなテーブル設計だといいのかもしれない
* テーブル設計をオブジェクトに合わせて柔軟に変更できないとORMが足かせになるという記事も・・・
* また、フレームワーク/ライブラリ毎にアプローチも結構違うらしいので、思っている以上に範囲の広い言葉
* 完全にORMオブジェクトのみで開発するのは無理があるという意見が多数の模様

# ORMの利点
* テーブルの(疑似)差分継承ができる！
* ↑と書くと誤解が生まれるかもしれないが、継承元のORMオブジェクトが管理しているテーブルと継承先のORMオブジェクトが管理しているテーブルが合成されたテーブルを扱うことができる模様
* ↑これによりOOP時のオブジェクトのデータと整合性を取ることができるのが最大の利点

# ORMの欠点
* 全部SELECTするorクエリの数だけORMオブジェクトを定義する
* 全SELECTは兎も角、クエリの数だけ定義の対処方だとオブジェクトの管理で死にそう
* それでもカバーできない部分はSQLを直書きする必要がある。これによりソースの統一性が損なわれる

# 個人的結論
* ORMを使うかどうかはどちらを推すにせよ宗教
* ORMを使うのであればModel層をORM用とそれを使うModel用に切り分けるのがわかりやすそうに感じた(未使用者の感想です

# FuelPHPだと
* リレーションの設定などをORMのModelクラスに内包？
* [FuelPHPのORM](http://w.builwing.info/2012/06/06/fuelphp%E3%81%AEorm%EF%BC%88%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%9E%E3%83%83%E3%83%91%E3%83%BC%EF%BC%89/)
* [FuelPHP Orm](http://press.nekoget.com/fuelphp_doc/packages/orm/relations/intro.html)
* [FuelPHP1.6、ORMモデルのfind()を理解する。](http://piyopiyocs.blog115.fc2.com/blog-entry-558.html)

# 参考サイト
[O/Rマッピングで緩和されるインピーダンスミスマッチには静的と動的の側面がある](http://d.hatena.ne.jp/ryoasai/20110501/1304252041)
[SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か？](http://www.slideshare.net/kwatch/sqlor)
[O/Rマッピングツールに対する誤解をときたい](http://blog.jnito.com/entry/20100528/1274998429)
[ORM利用すると性能が出ないってホント？](http://d.hatena.ne.jp/ogin_s57/20130417/1366222047)
[インピーダンス・ミスマッチを解決する、O/Rマッピングの設計](http://www.aerith.net/design/OR-Mapping-j.html)
[ORMがアンチパターンである11の理由](http://tech.a-listers.jp/2011/06/16/orm_is_an_antipattern/)
Provisioning file の置き場所


Jenkins で iOS アプリをビルドさせたい時に、どこに Provisioning file を置けばいいか分からなかったので調べました。

# 各ユーザごとに分かれて置かれる

```
/Users/#{username}/Library/MobileDevice/Provisioning Profiles
```

## Jenkins の場合

pkg で jenkins をインストールした場合は jenkins ユーザーが作られる。その場合はここに。

```
/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles
```

# Provisioning file の UUID 

iPhone 構成ユーティリティ で確認できます。
http://support.apple.com/kb/DL1465?viewlocale=ja_JP

Profile Iedentifier の部分が UUID 。

![Screenshot 2014-06-30 16.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/27210/a166588c-093a-1b1b-7a1f-a2050e6c22f8.png "Screenshot 2014-06-30 16.39.49.png")
Eclipse、Android Studio、Xcodeで良く使うショートカット対応表（Mac編）

Eclipse、Android Studio、Xcodeを操らなければならない辛いエンジニアの方へ。ショートカットはMacです。

※適宜追加・修正されるおそれがあります。

&nbsp;                          | Eclipse         | Android Studio  | Xcode
--------------------------------|-----------------|-----------------|---------
__戻る__                        | Cmd + [         | Cmd + Alt + ←  | Cmd + Ctrl + ←
__進む__                        | Cmd + ]         | Cmd + Alt + →  | Cmd + Ctrl + →
__プロジェクト内文字検索__      | Ctrl + H        | Cmd + Shift + F | Cmd + Shift + F
__コードフォーマット__            | Cmd + Shift + F | Cmd + Alt + L   | Ctrl + I 
__ファイル構造（File structure）*1__| Cmd + O         | Cmd + F12       | Ctrl + 6
__ファイル検索 (Find resource)__ | Cmd + Shift + R | Cmd + Shift + O | Cmd + Shift + O
__オブジェクト検索（Find type)__  | Cmd + Shift + T | Cmd + O         | -
__参照先検索（Caller）__         | Cmd + Shift + G | Opt + F7       | *2
__定義箇所へ移動（Go to declaration）__ | F3        | Cmd + B        | Cmd + Ctrl + J
__.hと.mファイル切替__ 　　　　　　| -              | -               | Cmd + Ctrl + ↑ or ↓

*1
ファイル内のクラスやメソッド一覧が見れます。

*2
以下の順序で実行できます
* コード内のメソッドを選択
* Ctrl + 1
* Callersを選択
SubsystemとForceCommand

sshは接続側で色々できるが、ssh-server側でも色々できる。

## 参考

* [Subsystems (SSH, The Secure Shell: The Definitive Guide)](http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch05_07.htm)
* [サーバ運用のネタ帳(アプリ編)](http://www.fumi.org/neta/201204sv3.html)


## sshd_configの最終行に記述。

```bash:/etc/ssh/sshd_config
...
UsePAM yes

Subsystem sftp internal-sftp
Subsystem yo /bin/echo yo
Subsystem man /usr/bin/man sftp-server

Match Group sftponly
  ForceCommand /bin/echo yo
```

syntax checkは`sshd -t`でできます。

```bash:
# sshd -t
# initctl restart ssh
```

# Subsystemを利用してみる

* `ssh 192.168.100.3 -s サブシステム指定`

という書式。

```bash:
$ ssh 192.168.100.3 -s yo
yo
$ ssh 192.168.100.3 -s man
man sftp-serverが実行され接続が終了する。
$ ssh 192.168.100.3 -s sftp
```
spring-commands-anyでRailsプロジェクトのマイタスクも高速化する

rails, rake, rspec等に加えて自作のコマンド（bin/scriptディレクトリのスクリプト）もSpringで高速化できるように[spring-commands-any](https://github.com/tyn-iMarket/spring-commands-any)というGemを作りました。

GemといいつつSpringと連携する部分のコード自体はとても少ないので、コマンドに直接書いてもいいかも。

以下、実際に試してみます。
<br>

#### spring-commands-anyを追加

```rb:Gemfile
group :development do
  gem 'spring-commands-any'
end
```

bundle installすると自作のコマンド（hogehoge）もhelpで出てくるようになります。

```shell
./bins/spring help

Commands for your application:

  rails           Run a rails command. The following sub commands will use spring: console, runner, generate, destroy.
  rake            Runs the rake command
  rspec           Runs the rspec command
  hogehoge        Runs the tdnet command
```
#### spring binstubを実行

```shell
bundle exec spring binstub hogehoge
```

bin/hogehogeにbin/springをloadするスクリプトが挿入されます。このまま使うとbundle execでタスクを実行した際にもSpringが起動してしまうので、回避コードを追加します。

```rb:bin/hogehoge
begin
#  load File.expand_path("../spring", __FILE__)
  load File.expand_path("../spring", __FILE__) unless defined?(Bundler)
rescue LoadError
end
```

#### コマンドを実行する

Springが起動している場合は一旦止めてください。次の起動時にspring-commands-anyがrequireされます。

```shell
./bin/spring stop

time ./bin/hogehoge download 2014/06/29 2014/06/29

real	0m1.927s
user	0m0.110s
sys	0m0.050s

time ./bin/hogehoge download 2014/06/29 2014/06/29

real	0m0.491s
user	0m0.110s
sys	0m0.048s

./bin/spring status

53743 spring server | test-app | started 2 mins ago      
53744 spring app    | test-app | started 2 mins ago | development mode
```

Springが起動して高速化されていますね。デフォルトのenvironmentはdevelopmentですが、-eや--environment=で指定できます。
npm install -g gruntしてもgruntが使えない時の対処


## 事象
Grunt を使いたいと思って

```
$ npm install -g grunt
```

としたが、

```
zsh: command not found: grunt
```

となってしまい利用できない。

/usr/local/binにもgruntが作成されない。


## 解決策
コマンドラインからgruntを使うときは

```
$ npm install -g grunt-cli
```

とする。

### 備考
grunt-cliのcliは「Command Line Interface」の略
RequireJSのやつにキャッシュ対策仕込む

`"@@cache_buster"`は[grunt-replace](https://github.com/outaTiME/grunt-replace)なり[gulp-replace](https://github.com/lazd/gulp-replace)なり、あるいはPHPやerbで置換するものとして。

## まちがい

```html
<script src="/scripts/require.js" data-main="/scripts/main.js?_=@@cache_buster"></script>
```

## せいかい

```html
<script>
  window.require = { urlArgs:'_=@@cache_buster' };
</script>
<script src="/scripts/require.js" data-main="/scripts/main.js"></script>
```

* http://requirejs.org/docs/api.html#config-urlArgs

## 以上です

何卒よろしくお願い致します。
PhoneGap(Cordova) で Sentry を使う


ローカルにファイルを持っているので普通の設定だとできないっぽい。
けどこの設定はこの設定で微妙感ある。

## Sentry 管理画面の設定

プロジェクト設定で許可ドメインを `*` にする

## HTML 側の設定

こちらは通常どおり。

```javascript:index.html
<script src="//cdn.ravenjs.com/1.1.15/jquery,native/raven.min.js"></script>
<script>
Raven.config('https://<key>@app.getsentry.com/<id>').install();
</script>
```

## 参考

- [Raven doesn't work in Chrome App · Issue #157 · getsentry/raven-js](https://github.com/getsentry/raven-js/issues/157)
- [Sentry](https://getsentry.com/welcome/)
JavaScript、「New」表示

JavaScript、「New」表示
==========


■about
----------

JavaScript、「New」表示




■code
----------

```JavaScript:JavaScript
// 一定期間New/Upマークを表示する
function newUp(y, m, d, c) {
  delDay = 7; // 何日後に削除するか
  oldDay = new Date(y + "/" + m + "/" +d);
  newDay = new Date();
  d =(newDay - oldDay) / (1000 * 24 * 3600);
  if(d <= delDay) {
    // Newマーク
    if(c == "new") document.write("<img src='http://crm.synergy101.jp/wordpress/wp-content/themes/synergy-crm/img/icon_new.gif' style='vertical-align:baseline;'>");
  }
}
```

```html:html
//実行場所に記述
<script type="text/javascript">newUp(2014,5,1,"new")</script>
```
WordPress、「New」表示

WordPress、「New」表示
==========


■about
----------

WordPress、「New」表示




■code
----------

```php:php
<?php
//表示させたい場所に記述
$days = 7; //Newを表示させたい期間の日数
$today = date_i18n('U');
$entry = get_the_time('U');
$kiji = date('U',($today - $entry)) / 86400 ;
if( $days > $kiji ){
echo 'New!';
}
?>
```




■reference
----------
WordPressでNew!を表示するパターン別４つの方法 | WordPress（ワードプレス）コミュニティ
http://wp3.jp/2011/12/25/wordpress-new/
df コマンドの容量単位

用途： OSのHDD容量を調べたいとき
OS：CentOS 6.5
コマンド：df

OSが現在どれだけの容量を使っているのかを調べたいときは「df」コマンドを使う。
ただ、普通に実行しても、予想と違う数値が表示される。

「man」で調べれば分かることではあるのだが、
これは、512バイト単位で出力されているため、慣れないとどれだけの容量を使用しているのか、分からない。
（UNIX系に慣れている人はこの方が分かり良いのかな？）

そこで、以下のオプションを指定することで、見やすくする。

df -k
　　1024(K)バイト単位で表示する。
df -m
　　1024*1024(M)バイト単位で表示する

※ -g は「1024*1024*1024(G)バイト」ではない。そのようなオプションは存在しない。

df -h
　　サイズにより、（G、M、K）などの標記で表示される。
boot2docker + vboxfs な環境を用意したい(Macで)

## tl;dr

* https://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories/

の通り、boot2dockerが公式にMacのファイル共有に対応したのでそちらをお試しください。

----

## 昔はこれでドヤ顔できた

```bash
$ brew install boot2docker
$ curl -L http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso > ~/.boot2docker/boot2docker-vboxfs.iso
$ boot2docker --vm=boot2docker-vm-vboxfs --iso=~/.boot2docker/boot2docker-vboxfs.iso init
$ alias boot2docker='boot2docker --vm=boot2docker-vm-vboxfs'
$ boot2docker up
$ export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375       
$ docker version
```

## more...

### `docker` クライアントと `boot2docker` を入れる

ホームブリューで良いと思う。

### `boot2docker.iso` を持ってくる

`boot2docker` は初期化の際にベースとするisoファイルを選べるので、インターネット上にあるvboxfsが有効になったisoを持ってくる。

このisoが何者かについては https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c を見よ。

具体的な作り方は、 https://gist.github.com/mattes/2d0ffd027cb16571895c を参考に同じことをすれば良いらしいので、インターネットを信用しないとか、やってみたいとか、そういう場合は自分で作れば良いだろう。

### init

オプションを指定。

```bash
boot2docker --vm=boot2docker-vm-vboxfs --iso=~/.boot2docker/boot2docker-vboxfs.iso init
```

長いのでエイリアス切る。

```bash
alias boot2docker='boot2docker --vm=boot2docker-vm-vboxfs'
```

### あとはよくある手順

```bash
$ boot2docker up
$ export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375       
$ docker version
```

## Mac → VBox のフォルダ共有

```bash
#!/bin/bash
VM_NAME=boot2docker-vm-vboxfs
WORKSPACE=`pwd`

VBoxManage sharedfolder \
  add "$VM_NAME" \
  --name $( basename $WORKSPACE ) \
  --hostpath $WORKSPACE \
  --transient

boot2docker --vm=$VM_NAME ssh \
  "sudo modprobe vboxsf && sudo mkdir -p $WORKSPACE && sudo mount -t vboxsf $( basename $WORKSPACE ) $WORKSPACE"
```

こういう感じのスクリプトを書いておいたら捗ると思う。

`--transient` オプションなので `boot2docker restart` とかすればマウントも解除される。

同じ名前で共有してるのは、まあ、ややこしくなくていいかなと思ったからです。

## シェアさせていただきます

上述の手順で共有設定のあとは、

```bash
docker run -d -p 22 -v ${WORKSPACE-`pwd`}:/path/to/share $IMAGE_NAME /bin/echo hello
```

こんな感じでプロジェクトのルートとコンテナでディレクトリ共有が可能になる。

```
Mac の /Users/udzura/hogehoge-puppet
↓
boot2dockerインスタンス の /Users/udzura/hogehoge-puppet
↓
コンテナの /path/to/share
```

という感じ（puppetなのはイメージです）。まあ、ファイル共有（`-v`オプション）さえちゃんと動けば、ローカルMacでのドッカーデヴェロップメントもそれなりに捗るんじゃないでしょうか。
Zaif の Trade API を Ruby で操作する


国内の BitCash, Monacoin の交換所である https://zaif.jp/ は，Trade API を提供しています．
これを使うと，自動トレードを行うbotを自作できます．
(私は，日曜日の趣味プログラミングで，作りました．)

## コード例

コードを示したほうが早いと思うので．細かい説明は省きます．

[API の説明ページ](https://zaif.jp/doc_api)にあるとおりに愚直に実装しています．
secret_key と public_key は https://zaif.jp/api_keys で生成します．
perms は，生成後に上記ページのチェックボックスを入れ，"Save"をクリックして設定します．
お使いになりたい API により決まりますが，info と trade は要るでしょう．

## API クラスの使い方

```Ruby
public_key = ENV['public_key']
secret_key = ENV['secret_key']
api = Etwings::TradeApi.new(public_key, secret_key)
```

などしたあとで，

```
  info = api.post('get_info', {})
```

や

```
    trade = api.post('trade', { "currency_pair" => "mona_jpy", "action" => "ask", "price" => "#{new_price}", "amount" => "#{mona}" })
```

などします．


```Ruby
# Copyright (C) 2014 Masaki "monaka" Muranaka
# MIT License
#
# -*- coding: utf-8 -*-
require 'json'
require 'openssl'
require 'net/https'
require 'pp'

module Etwings
  class TradeApi
    attr_reader :result
    attr_reader :response

    def initialize public_key, secret_key
      @public_key = public_key
      @secret_key = secret_key
      @response = nil
      @result = nil
      @nonce = Time.new.to_i
    end

    def post(method, params)
      @nonce += 1
      hmac = OpenSSL::HMAC.new(@secret_key, OpenSSL::Digest::SHA512.new)
      params['nonce'] = @nonce.to_s
      params['method'] = method
      param = params.map { |k,v| "#{k}=#{v}" }.join("&")
      digest = hmac.update(param)

      http = Net::HTTP.new('exchange.etwings.com', 443)
      http.use_ssl = true
      http.set_debug_output(STDERR)
      headers = {
        'Content-Type' => 'application/x-www-form-urlencoded',
        'Key' => @public_key,
        'Sign' => digest.to_s }
      path = '/tapi'
      response = http.post(path, URI.escape(param), headers)

      if response.code.to_i == 200
        @result = JSON.parse(response.body)
      else
        @result = nil
      end
      @response = response
      @result
    end
  end

  class PublicApi
    attr_reader :uri
    attr_reader :response
    attr_reader :result
    def initialize(uri)
      @uri = uri
    end
    def get()
      max_retry_count = 5
      url = URI.parse(@uri)
      response = nil
      max_retry_count.times do |retry_count|
        http = Net::HTTP.new(url.host, url.port)
        http.use_ssl = true if (443==url.port)

        http.verify_mode = OpenSSL::SSL::VERIFY_PEER
        http.verify_depth = 5
        response = http.get( url.path )

        case response
        when Net::HTTPSuccess
          break
        when Net::HTTPRedirection
          url = URI.parse(response['Location'])
          next
        else
          break
        end
      end
      if response.code.to_i == 200
        @result = JSON.parse(response.body)
      else
        @result = nil
      end
      @response = response
      @result
    end
  end
end

```
Puppetの --detailed-exitcodes オプション

`--detailed-exitcodes` というオプションを `puppet apply` の際に渡すと便利らしい。

> --detailed-exitcodes

>> Provide transaction information via exit codes. If this is enabled, an exit code of '2' means there were changes, an exit code of '4' means there were failures during the transaction, and an exit code of '6' means there were both changes and failures.

つまり、

* 変更がなくエラーもなければ `0` で終了する。
* 変更があれば `2` で終了する。
* なにも変更が無く、エラーがあった場合 `4` で終了する。
* 何かが変更されてエラーもある場合は `6` で終了する。

逆にCIの時は `2` で終了した場合でもハンドルしとかないといけない。
WordPress、カテゴリ一覧ページ、ページ送り、aタグにclass属性を追加

WordPress、カテゴリ一覧ページ、ページ送り、aタグにclass属性を追加
==========


■about
----------

WordPress、カテゴリ一覧ページ、ページ送り、aタグに属性を追加
関数
get_next_posts_link
get_previous_posts_link
の
引数
$attr
をコントロール。




■code
----------

```php:php
//functions.php
//前後の記事のリンクにclassを追加
function add_prev_posts_link_attr(){
 return 'class="arw"';
}
add_filter('previous_posts_link_attributes', 'add_prev_posts_link_attr');

function add_next_posts_link_attr(){
 return 'class="arw right"';
}
add_filter('next_posts_link_attributes', 'add_next_posts_link_attr');
<?php endif; ?>
```




■reference
----------
Wordpressで前後のページへのリンクをカスタマイズする | ちいさな創々
http://www.petitec.com/2012/06/wordpress%E3%81%A7%E5%89%8D%E5%BE%8C%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B/
RubyでDaemonのような常駐アプリを作るためのForeverGem


Cronとか使えばいいんですが、Cronだと毎回RubyのVMを起動しなおしてるようなものなのであんまりスマートじゃない
あとCron苦手

そこで登場するのが Forever
https://rubygems.org/gems/forever

一年間メンテされてないけど`2.1.2-p95`でも動いた

使い方は簡単
`$ gem install foreverb`
して、Rubyのファイルに

```ruby
require 'forever'

Forever.run do
  every 10.minutes do
    # 処理
  end
  every 1.hour do
    #処理
  end
end
```
等とする。
他にもいろいろある(毎n時のみ動かすとか)のでGithubのREADMEをみてほしい。
結構便利。Growl、Faradayと合わせて適当なサービスの更新とかを受け取れるようにするとか。
ToDoアプリとかを適当に叩いて通知してくれるとか考えられる。
knife-soloでtmpディレクトリが転送されない原因を調べてみた


## あらまし

環境構築をVagrantのchef−soloからknife-soloに変更したところ、一部のファイルが実行側の環境に転送されていないためにchefがコケる事案が発生。
chef-soloに戻すと完走するのだが、knife-soloにするとコケるということでknife-soloのソースコードを追いかけて調査してみた。

## 環境

* VirtualBox (4.3.10)
* Vagrant (1.6.2)
* CentOS (6.5)
* knife-solo (0.4.2)

## 調査

今回転送されなかったのはディレクトリで以下の様な配置になっていた。

* cookbook/templates/tmp/hoge.txt.erb

tamplatesディレクトリに中には他のテンプレートファイルもあったのだが、こちらは無事に転送されていることから、VM側にファイルを送っているまわりが怪しいということで、knife-soloのソースを適当に漁る。
ソースを眺めていると、knifeがcookbookなどをuploadするためにrsyncしている部分が見つかったので多分この辺だろうと探してみたらexcludeしている箇所を発見。

* rsyncをしている箇所のコード:[lib/chef/knife/solo_cook.rb#L259](https://github.com/matschaffer/knife-solo/blob/master/lib/chef/knife/solo_cook.rb#L259)

```ruby:lib/chef/knife/solo_cook.rb#L259
      def rsync(source_path, target_path, extra_opts = '--delete-after')
        if config[:ssh_gateway]
          ssh_command = "ssh -TA #{config[:ssh_gateway]} ssh -T -o StrictHostKeyChecking=no #{ssh_args}"
        else
          ssh_command = "ssh #{ssh_args}"
        end

        cmd = ['rsync', '-rL', rsync_debug, rsync_permissions, %Q{--rsh=#{ssh_command}}, extra_opts]
        cmd += rsync_excludes.map { |ignore| "--exclude=#{ignore}" }
        cmd << adjust_rsync_path_on_client(source_path)
        cmd << %Q{:#{adjust_rsync_path_on_node(target_path)}}
        cmd = cmd.flatten.compact
        Chef::Log.debug cmd.inspect
        system!(*cmd)
      end
```

rsync_excludesで検索してみると、該当のメソッドを発見。
コードを見るとどうやらgitとかsubversionなどのVCS関連のディレクトリと、tmpと言う名前が付けられたものはrsyncから除外されるらしい。

* 該当のコード箇所:[lib/chef/knife/solo_cook.rb#L195](https://github.com/matschaffer/knife-solo/blob/master/lib/chef/knife/solo_cook.rb#L195)

```ruby:lib/chef/knife/solo_cook.rb#L195
      def rsync_excludes
        (%w{revision-deploys tmp .git .hg .svn .bzr} + chefignore.ignores).uniq
      end
```

ちなみにrsyncコマンドの--excludeオプションを調べると、excludeで指定されるものはパターンらしい。

```
--exclude=PATTERN
パターンに一致するファイルをコピーしない。
```


よって今回転送されなかった以下のディレクトリにはrsync_excludesで指定されているtmpが含まれているため転送されなかった模様。

* cookbook/templates/tmp/hoge.txt.erb


## まとめ
### わかったこと
* knife-soloではcookbook_pathやrole_pathなどで指定されたディレクトリがrsyncコマンドでchef-soloの実行対象サーバに転送される
* rsyncで転送される際にオプションとして"--exclude=tmp"が渡されている
* rsyncの"--exclude=pattern"はpatternにマッチするものを転送しない
* よってknife-soloで転送する対象の中でtmpと名前の付いているディレクトリ（並びにその直下のファイル）やファイルは転送されない

### 結論
ようするにknife-soloでrsyncする対象のディレクトリ内にtmpディレクトリを作るなということらしい。

## 参考

* [matschaffer/knife-solo](https://github.com/matschaffer/knife-solo)
* [rsync でディレクトリの同期（バックアップ） - maruko2 Note.](http://www.maruko2.com/mw/rsync_%E3%81%A7%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8C%E6%9C%9F%EF%BC%88%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%89)
WordPress、カテゴリ一覧ページ、ページ送りを設置

WordPress、カテゴリ一覧ページ、ページ送りを設置
==========


■about
----------

WordPress、カテゴリ一覧ページ、ページ送りを設置
基本はposts_nav_link()
利用頻度は高いが
カスタマイズ性が良くない
htmlを変えたい場合は下記コードを。


■code
----------

```php:php
//category.php
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); 
//var_dump($post);		
?>
	// 投稿のループ処理
<?php endwhile; ?>
<?php
    // リンクが無い場合はNULLが返ってくる
    $prev_link = get_previous_posts_link('前のページ');
    $next_link = get_next_posts_link('次のページ');
 
    if ( isset( $prev_link ) or isset( $next_link ) ) {
        echo '<ul id="pagination">', PHP_EOL;
        if( isset( $prev_link ) ) {
            echo '<li>',$prev_link,'</li>', PHP_EOL;
        }
        if( isset( $next_link ) ) {
            echo '<li>',$next_link,'</li>', PHP_EOL;
        }
        echo '</ul>', PHP_EOL;
    }
?>
<?php endif; ?>
```




■reference
----------
category.phpでのページ送りを設置する方法。 | ぱんにゃっと／H＆Y
http://pannyatto.net/category-php-pagenation/

WordPressテーマの作り方 » ページ送りを設置する
http://wordpress.hitsuji.me/add-paginations/

Function Reference/get next posts link « WordPress Codex
http://codex.wordpress.org/Function_Reference/get_next_posts_link
WordPress、ホームページ、カテゴリ一覧インデックス書き出し

WordPress、ホームページ、カテゴリ一覧インデックス書き出し
==========


■about
----------

WordPress、ホームページ、カテゴリ一覧インデックス書き出し
ループ処理の開始タグの前に1行追加し「どんな記事を探してくるか」などの条件を付加してやることで、
表示件数を指定したり、特定のカテゴリーのみを抽出して一覧表示できるようになります。



■code
----------

```php:php
//index.php
//カテゴリーIDが2の記事を2個表示する
<?php query_posts('cat=2&posts_per_page=2'); ?>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); 
//var_dump($post);		
?>

<div id="post-<?php the_ID(); ?>">
  <div class="bl_li"> <a href="<?php the_permalink(); ?>" class="alpha_">
    <div class="bl_li_thumbnail"><img src="<?php bloginfo('template_url'); ?>/img/bnr_index_<?php echo get_page_uri(get_the_ID()); ?>.png" alt="<?php the_title(); ?>"></div>
    <div class="bl_li_title"><?php the_title(); ?></div>
    <div class="bl_li_caption"><?php echo get_the_excerpt(); ?>...</div>
    </a> </div>
</div>
<?php endwhile; ?>
<?php endif; ?>
```




■reference
----------
【WordPress】ループ処理で記事の表示件数やカテゴリーを指定する方法
http://studio-freetown.com/post-765/
WordPress、カテゴリ一覧ページ、インデックス書き出し

WordPress、カテゴリ一覧ページ、インデックス書き出し
==========


■about
----------

WordPress、カテゴリー、インデクス書き出し




■code
----------

```php:php
category.php
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); 
//var_dump($post);		
?>

<div id="post-<?php the_ID(); ?>">
  <div class="bl_li"> <a href="<?php the_permalink(); ?>" class="alpha_">
    <div class="bl_li_thumbnail"><img src="<?php bloginfo('template_url'); ?>/img/bnr_index_<?php echo get_page_uri(get_the_ID()); ?>.png" alt="<?php the_title(); ?>"></div>
    <div class="bl_li_title"><?php the_title(); ?></div>
    <div class="bl_li_caption"><?php echo get_the_excerpt(); ?>...</div>
    </a> </div>
</div>
<?php endwhile; ?>
<?php endif; ?>
```




■reference
----------
関数リファレンス/have posts - WordPress Codex 日本語版
http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/have_posts

the_post:WordPress私的マニュアル
http://elearn.jp/wpman/function/the_post.html
Flex Framework Mate の基本的な使い方 その1

いまさら感のあるFlexですが、フレームワークの覚え書きまでに記述しておきます。


**ダウンロード**

Flex Framework Mate のサイトへ訪れてダウンロードページからswcライブラリファイルをダウンロードします。

http://mate.asfusion.com/

![mate_download_page.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/5baae873-8c44-c896-6026-156100bced40.png)

**プロジェクトの作成**

FlashBuilderにてFlexプロジェクトを作成します。プロジェクト名は適当な名前です。

![mate_create_project.png](https://qiita-image-store.s3.amazonaws.com/0/3184/3ba1f7a7-5e40-96f5-74ac-bec4584aba7b.png)

**ビルドパスの設定**

プロジェクトのビルドパスにダウンロードした Mate_09_1.swc を含めます。
![mate_add_lib.png](https://qiita-image-store.s3.amazonaws.com/0/3184/d46b8977-e43b-e07c-f31d-6ab590594f3a.png)

**プロジェクトのパッケージ構成**

特にパッケージ構成に決まりはありませんが、私の場合、プロジェクトに最低限必要なファイルパッケージ構成は下記のようにしています。
![mate_project_files.png](https://qiita-image-store.s3.amazonaws.com/0/3184/f8d8435a-a7f5-ce89-9c00-7a8af2072a72.png)

**プログラム詳細**

それでは次回は、それぞれのプログラム詳細を覗いてみましょう。
http://qiita.com/tajihiro/items/27987f25fa3e79cafc6a
スパム撃退レシピ

```bash:SPAM格納ディレクトリ作成
# mkdir -p /var/procmail/spam/
# cd /var/procmail/spam/
# mkdir new cur tmp
# touch procmail.log
# chmod 700 *
```

```bash:/etc/procmailrc
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=/var/procmail/procmail.log
SPAMDIR=/var/procmail/spam/new/.
PATH=$PATH:/bin:/usr/bin

# 件名マッチ
:0
*^From .*@(docomo.ne.jp|ezweb.ne.jp|softbank.ne.jp|i.softbank.jp|yahoo.co.jp|gmail.com)
* ? nkf -w | egrep "　ID:|To:.*ID:|当選|無料|BS.CS|☆|★|♪|!!|！|ｗ|ロト|○|┃|《|▼|『|競馬|通販|釘付|億|LINE|ＬＩＮＥ|「|本人認証"
$SPAMDIR

# 送信元ドメイン
:0
* ^From .*@.*.asia
$SPAMDIR
```

```bash:スパムフォルダを確認。
$ sudo mutt -f /var/procmail/spam/
```
phpのシンタックスチェック


変更したファイルがシンタックスエラーかどうかチェックするのが面倒なのでまとめて調べる方法がないか調べてたら記事にしてくれていた人がいたので自分用にカスタマイズしたものをアップ

参考:
> http://kaworu.jpn.org/kaworu/2007-11-17-2.php


```
#!/bin/sh
# $1 phpの文法チェックをしたいディレクトリ
#http://kaworu.jpn.org/kaworu/2007-11-17-2.php

flg=0

phpsyntaxcheck()
{
	for i in `find -E "$1" -regex '.*\.(php|inc)' `
	do
		msg=`php -l "$i"` 
		check=`echo $msg | cut -c 1-25 `
		if [ "$check" != 'No syntax errors detected' ] ; then
  			echo $msg
  			echo ''
  			flg=1
		fi
	done
}

echo ''
for i in "$@"
do
        phpsyntaxcheck "$i"
done

if [ $flg -eq 1 ] ; then
	echo 'Syntax check error!'
else
	echo 'Syntax check OK!'
fi
echo ''
```
[GMail] ラベルのない受信メールの送信アドレスと受信回数を教えてくれる処理作った。

##なにこれ？##
Gmailでラベルのついていない受信メールを一通りチェックして、そのメールの送信者のアドレスと受信回数を一覧にしてメールで教えてくれるGoogle Apps Scriptです。
自動化っていいですよね。

メイドちゃん構想で色々作ってる中のひとつです。
http://qiita.com/tienlen/items/34aa9da98149d1992dfc

##公開理由##
Google Apps Scriptで作ったものの制約が結構きつかったり、Google Apps Scriptの挙動の問題でこれだったら他の言語で書いたほういいわぁってところがあり、実際使うにせよ、他の言語でGmail API使って作りなおしたほうがいいかもと思い、使わなそうなので公開することにしました。
つまりいらない子なので、里子に出しました。

##注意事項##
* Archiveしてるメールも対象にしてるので、検索範囲をInboxのみにしてません。そのせいでチャットも対象になっちゃってるけど... 
* 500件以上を一気にとろうとしてますが、それを外部関数にしたのはHash(連想配列)に別の連想配列を追加／連結する処理を色々試してみましたがデバッグしてて期待値を得られなかったからです。(ぶっちゃけ諦めただけ)
* 注意事項というか、実際使っててなんですが、1500件ぐらいのデータさばこうとしたら処理時間がかかるだの、タイムアウトだのでGoogleさんにエラーメッセージはかれて怒られました。
多分、100〜300件ぐらいしか実際はさばけないと思います。
* メールアドレスのヴァリデーション(正規表現のチェック)外したらちょっとは早くなるかな？

##ライセンス##
これに関しては今後使わないかもしれない可能性大なので、どうでもいいんですが、かといって他の人が「これ俺が作った」って言いやがったら嫌なので、MITライセンスのつもりで使ってください。

##ソースコード##

``` recieved.gs
// 他の処理でも使ってるものは定数にしている
// set your email address.
var YOUR_EMAIL_ADDRESS = "あなたのGmailアドレス";
// string for regular expression check
var EMAIL_REGEX = /[a-zA-Z0-9\._\-]+@[a-zA-Z0-9\.\-]+\.[a-z\.A-Z]+/g;

function getNoLabelSenders() {
  var query = 'has:nouserlabels';
  var threadAll = 0;
  var offset = 0;
  var limit = 500;
  var mailAddress = getEmailAddress();
  var AddressList = {};
  var hasMore = true;
  while (hasMore) {
    var threads = GmailApp.search(query, offset, limit);
    if (threads.length < limit) {
      hasMore = false;
    }
    offset = offset + limit;
    for (var i = 0; i < threads.length; i++) {
      var thread = threads[i];
      var firstMessage = thread.getMessages()[0];
      var sender = firstMessage.getFrom().match(EMAIL_REGEX)[0];
      if (sender && sender != mailAddress) {
        if (AddressList[sender] != undefined) {
          AddressList[sender] += 1;
        } else {
          AddressList[sender] = 1;
        }
      }
      // Logger.log(sender);
    }
    // GmailApp.searchだと1回で500件までしか取れないので、
    // whileで回して全件取るようにしてますが、
    // 数が多いとタイムアウトとかで怒られるので、
    // その場合は強制的にhasMore = falseにしてください。
    // hasMore = false;
  }
  // Logger.log(AddressList);
  if (AddressList) {
    var message = "These messages don't have label \n\n";
    for (key in AddressList) {
      message = message + key + ': ' + AddressList[key] + " messages\n";
    }
    GmailApp.sendEmail(mailAddress, '[Report] No label massages', message);
  }
}

function getEmailAddress() {
  // Sessionだと認証を求められる代わりに定数や変数で指定しなくてもOK
  // 嫌だったら YOUR_EMAIL_ADDRESSの方を使ってください
  return Session.getEffectiveUser().getEmail();
  // return YOUR_EMAIL_ADDRESS;
}
```
CodeIgniterのformヘルパーでhtml5のフォーム指定


##`type="tel"`や`type="email"`

telなら'type' => 'tel'を追加すればおk
emailも同じ感じで。

```
$data = array(
              'name'        => 'username',
              'id'          => 'username',
              'value'       => 'johndoe',
              'maxlength'   => '100',
              'size'        => '50',
              'style'       => 'width:50%',
				'type'		   => 'tel' 
);

echo form_input($data); 
```


## required

```
$data = array(
              'name'        => 'username',
              'id'          => 'username',
              'value'       => 'johndoe',
              'maxlength'   => '100',
              'size'        => '50',
              'style'       => 'width:50%',
              'required' => 'required'
);

echo form_input($data); 
```

参考: [php - CodeIgniter: input box using HTML5 required attribute - Stack Overflow - ](http://go.shr.lc/1ogRBUD)
Futureをマスターする -おまけ-

# シリーズ目次
[はじめに](http://qiita.com/mtoyoshi/items/08766629abea6eb8e4bc)
[コンパニオンオブジェクト操作](http://qiita.com/mtoyoshi/items/297f6acdfe610440c719)
[インスタンス操作](http://qiita.com/mtoyoshi/items/f68beb17710c3819697f)
[おまけ](http://qiita.com/mtoyoshi/items/cc34d95bdffb6ce012e9)
[Futureにハマる](http://qiita.com/mtoyoshi/items/78912722f8ccc13d80f6)

# おまけ
```Future{ ... }```と書けば、必ず新しいスレッドで処理が行われるのかと思っていたがそうではなく、実際は色々と複雑に制御されているようだ。
※Futureのソースコードを読んだわけではないので何故このような動きになるのかといった解説まではできていない。

```scala
object Main extends App {
  println("in main : " + Thread.currentThread().getId())

  val f1 = Future{ println(s"f1 : ${Thread.currentThread().getId()}"); 1 }
  val f2 = Future{ println(s"f2 : ${Thread.currentThread().getId()}"); 2 }

  val f = f1.flatMap { n1 =>
    println(s"f1#flatMap : ${Thread.currentThread().getId()}");

    f2.map{ n2 =>
      println(s"f2#map : ${Thread.currentThread().getId()}");
      n1 + n2
    }
  }

  f.onSuccess {
    case result => println(s"f#onSuccess : ${Thread.currentThread().getId()}")
  }

  Await.ready(f, Duration.Inf)
}
```

この実行結果は以下となる。
f1とf2は同一スレッドで実行されていることが確認できる。冒頭で述べたFuture{...}と書けば別スレッドで処理されると思っていたら違っていた、はこれを見たことによる。

```
main : 1296
f1 : 1290
f2 : 1290
f1#flatMap : 1297
f2#map : 1297
f#onSuccess : 1297
```

次に、f1とf2を以下のように変える。

```scala
  val f1 = Future{ Thread.sleep(3000); println(s"f1 : ${Thread.currentThread().getId()}"); 1 }
  val f2 = Future{ Thread.sleep(3000); println(s"f2 : ${Thread.currentThread().getId()}"); 2 }
```

結果は以下。
今度は別スレッドで実行されるようになった。

```
main : 1304
f1 : 1290
f1#flatMap : 1290
f2 : 1305
f2#map : 1290
f#onSuccess : 1290
```

次は更にonSuccessをforeachで書き換える。

```scala
  f.foreach {
    println(s"f#foreach : ${Thread.currentThread().getId()}")
    println(_)
  }
```

結果は以下。
なんとforeachのスレッド番号はMainと同じになった。それを裏付けるように出力順序も早くに出てくる。
もちろん結果は一番最後。
プログラマから見るとonSuccessと同じかもしれないが、実際は細かいレベルで振る舞いは異なるようだ。

```
main : 1313
f#foreach : 1313
f1 : 1306
f2 : 1314
f1#flatMap : 1306
f2#map : 1306
3
```

ほんの少しの変更だが今度は以下のように変えてみた。

```scala
  f.foreach { r =>
    println(s"f#foreach : ${Thread.currentThread().getId()}")
    println(r)
  }
```

結果は以下。
今度はforeachはMainとは別スレッドで呼ばれており、表示順も最後の方になった。
結果を変数に束縛するようにしたからなんだろう。

```
main : 1322
f1 : 1314
f1#flatMap : 1314
f2 : 1323
f2#map : 1314
f#foreach : 1314
3
```
golangの実行ファイルからファイルパスを除きたい

先に言っておくと根本的な解決方法は無いです。

# goの実行ファイルにはファイルパスが含まれている
golangで書いたアプリケーションには、ビルド時のフルパスが必ず含まれていいます。これはパニックした時のメッセージにファイルパスが含まれることからもわかります。つまりこういうことです。

```shell-session
panic: hogehoge

goroutine 16 [running]:
runtime.panic(0x495080, 0xc208000170)
        /usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
main.main()
        /home/umisama/go/src/github.com/umisama/hogehoge/main.go:7 +0xf3
```

実行ファイルを開けてみると、確かにファイルのフルパスが入っていることがわかります。

![Screenshot from 2014-06-30 12:07:19.png](https://qiita-image-store.s3.amazonaws.com/0/18520/f9193d00-6e4c-f9cf-0ab7-69ef3b8ee916.png)

これはgolangでオンプレ開発をやるに当たって障害になり得ます。（いや、今の現場は困らないんですが）
問題点は2つあります。

 1. panic時に使用者の目に触れる形でビルド環境のパスが出ること
 1. そもそもバイナリにパスが含まれていること

# 対処方法
最初にも書いたように、対処方法は無いです。これは[フォーラムのissue](https://groups.google.com/forum/#!topic/Golang-Nuts/Xr2Zsa0YfKs)にも上がっているのですが、runtime.Callとの問題があって簡単には治らなさそう。
とりあえず、「使用者に見えないようにする」ためにはgcflagに"-trimpath"を渡してあげて

```shell-session
 $ go build -gcflags="-trimpath=/home/umisama" main.go
 $ ./main
panic: hogehoge

goroutine 16 [running]:
runtime.panic(0x495080, 0xc208000170)
        /usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
main.main()
        hogehoge/main.go:7 +0xf3

goroutine 19 [finalizer wait]:
runtime.park(0x412d10, 0x544410, 0x542f69)
        /usr/local/go/src/pkg/runtime/proc.c:1369 +0x89
runtime.parkunlock(0x544410, 0x542f69)
        /usr/local/go/src/pkg/runtime/proc.c:1385 +0x3b
runfinq()
        /usr/local/go/src/pkg/runtime/mgc0.c:2644 +0xcf
runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445
```

という風に、表示から除くコトはできます。
ただバイナリの中には同じくパスが残っているので、あんまり解決になってないですね。残念。
ローカルのjsonファイルを同期読込

```coffeescript
config = require 'config.json'
```

ドキュメント
http://nodejs.org/api/modules.html#modules_file_modules

教えてくれた人
http://stackoverflow.com/questions/5726729/how-to-parse-json-using-nodejs
http://dim5.net/nodejs/express-const-value.html
TreeFrogのORMオブジェクト読み込み

TreeFrogのORMオブジェクトの基本的な読み込み方法です。
以下のようなblogテーブルから` tspawn s blog` で生成したモデルを想定しています。

| Field | Type | Extra |
|:-----------|------------:|:------------:|
| id       |        int(11) |     auto_     |
| title     |      varchar(20) |        |
| body       |        varchar(200) |          |
| created_at         |          timestamp |            |
| updated_at       |       timestamp |        |
| lock_revision    |     int(11) |       |

##全モデルを取得
```cpp:
QList<Blog> blogList = Blog::getAll();
```
##主キーで１レコードを取得
```cpp:
TSqlORMapper<BlogObject> mapper;
Blog blog = Blog::get(id);
```
###モデルが見つからない場合、404ページを表示
```cpp:
TSqlORMapper<BlogObject> mapper;
Blog blog = Blog::get(id);
if (blog.isNull()) {
    renderErrorResponse(404);
    return;
}
```
##TCriteriaを使用してクエリーする
```cpp:
TSqlORMapper<BlogObject> mapper;
TCriteria crt(BlogObject::Title, "hoge");
BlogObject blog = mapper.findFirst(crt);
```
##条件を追加する
```cpp:
TSqlORMapper<BlogObject> mapper;
TCriteria crt(BlogObject::Title, "hoge");
crt.add(BlogObject::Body, TSql::NotEqual , "");
BlogObject blog = mapper.findFirst(crt);
```
##OR
```cpp:
TSqlORMapper<BlogObject> mapper;
TCriteria crt(BlogObject::Title, "hoge");
crt.addOr(BlogObject::Body, "piyo");
BlogObject blog = mapper.findFirst(crt);
```
##BETWEEN
```cpp:
TSqlORMapper<BlogObject> mapper;
QDateTime from = QDateTime::fromString("2014-06-27 17:21:40", Qt::ISODate);
QDateTime to = QDateTime::fromString("2014-06-27 17:21:50", Qt::ISODate);
TCriteria crt(BlogObject::CreatedAt, TSql::Between, from, to);
BlogObject blog = mapper.findFirst(crt);
```
##NOT BETWEEN
```cpp:
TSqlORMapper<BlogObject> mapper;
QDateTime from = QDateTime::fromString("2014-06-27 17:21:40", Qt::ISODate);
QDateTime to = QDateTime::fromString("2014-06-27 17:21:50", Qt::ISODate);
TCriteria crt(BlogObject::CreatedAt, TSql::NotBetween, from, to);
BlogObject blog = mapper.findFirst(crt);
```
##IN
```cpp:
TSqlORMapper<BlogObject> mapper;
QList<QVariant> list;
list << "hoge" << "piyo";
TCriteria crt(BlogObject::Title, TSql::In, list);
BlogObject blog = mapper.findFirst(crt);
```
##NULL
```cpp:
TSqlORMapper<BlogObject> mapper;
TCriteria crt(BlogObject::Title, TSql::IsNull);
BlogObject blog = mapper.findFirst(crt);
```
##ORDER BY
```cpp:
TSqlORMapper<ReceiptObject> mapper;
mapper.setSortOrder(BlogObject::CreatedAt, Tf::DescendingOrder);
BlogObject blog = mapper.findFirst();
```
##OFFSETとLIMIT
```cpp:
TSqlORMapper<ReceiptObject> mapper;
mapper.setOffset(1);
mapper.setLimit(1);
BlogObject blog = mapper.findFirst();
```
##TCriteriaを使用して集計を行う
###count
```cpp:
TSqlORMapper<BlogObject> mapper;
TCriteria cri(BlogObject::Title, "Hello world");
int count = mapper.find(cri);
```
` TCriteria`で必要なクエリーを生成できない場合、` TSqlQuery`を使用する。

##直接SQL文を使用
```cpp:
TSqlQuery query;
query.prepare("select max(id) from blog");
query.exec(); // クエリ実行
query.next();
int cnt = query.value(0).toInt();
```
NSTableViewにカスタムセルを使用する


NSTableViewにNSTableCellViewを継承して作ったカスタムセルを表示する方法のメモ。
とりあえず2通りの方法があるようです。もしかしたらもっとあるのかもしれません。

1. チュートリアルなどで、よく見かける方法。
1. 正攻法（たぶん）。

## チュートリアルなどで、よく見かける方法
NSTableViewDataSourceプロトコルのメソッドを実装します。
単純なテーブルを実装する場合によく見かけますが、
カスタムセルを使う際は使われていないようです。

```swift
func tableView(tableView: NSTableView!, objectValueForTableColumn tableColumn: NSTableColumn!, row: Int) -> AnyObject!
```

こちらでは、下記の動作になります。※推測含む

1. メソッド内で自分でセルを作る(セルA)
1. 内部的にセルが作られる(セルB)
1. セルB のsetObjectValueに セルA が渡される
1. セルA は破棄されて セルB が使われる

setObjectValueを実装していないとまっさらなセルが表示されます。
リファレンスに書いてあるんでしょうか、見つけられなくてすごくハマりました。

## 正攻法（たぶん）
NSTableViewDelegateプロトコルのメソッドを実装します。
1つ目の方法と似ていますが、プロトコルと第二引数と戻り値が違います。

```swift
func tableView(tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row: Int) -> NSView!
```

こちらでは、下記の動作になります。

1. 関数内で自分でセルを作る(セルA)
1. セルA がそのまま使われる

Web上で公開されているTipsなどではコチラがよく使われていますが、
私はしばらく違いに気づきませんでした。

## まとめ
こういう時は引数名を確認↓
「コピペすると動くけど、手打ちだと(うっかり見慣れたメソッドを使ってしまって)動作が変わった」
RSpecでRails.envをstubし、test環境以外の振る舞いのspecを書く

## 答え

たとえば、本番環境の振る舞いをテストしたいときは下記のようにする。

RSpec 3

```rb
expect(Rails).to receive(:env).and_return('production'.inquiry)
```

RSpec 2

```rb
Rails.stub(:env).and_return('production'.inquiry)
```

## 解説

下記のようにすると、 `Rails.env` は `ActiveSupport::StringInquirer` のインスタンスだということがわかります。

```rb
[1] pry(main)> Rails.env.class
=> ActiveSupport::StringInquirer
```

[ソース見るのが早い](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/string_inquirer.rb)と思いますが、 `ActiveSupport::StringInquirer` は文字列が等しいかどうかをメソッドで聞けるようになります。また、 `String#inquiry` も[追加される](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/string/inquiry.rb)ので、下記のような振る舞いになります。

```rb
[2] pry(main)> 'production'.inquiry
=> "production"
[3] pry(main)> 'production'.inquiry.class
=> ActiveSupport::StringInquirer
[4] pry(main)> 'production'.inquiry.production?
=> true
```
Win鯖管なら知っておいたほうがいい！指折りに便利なRemote Desktop Connection Manager

# Win鯖管なら知っておいたほうがいい！指折りに便利なRemote Desktop Connection Manager #

これは結構知ってるひとも多いのかもなんですが、便利なのでご紹介。
常日頃から沢山のお客様とサーバを監視、管理する訳なので、当然大量のWindowsサーバを管理、構築する事がよくあります。

ただ、リモートデスクトップに使うRDPファイルを管理保存する上でファイルでは限界が来ちゃうんですね。
大量のWindows鯖管理をする人のためのMS謹製ツールがこちら

[Remote Desktop Connection Manager](http://www.microsoft.com/en-us/download/details.aspx?id=21101)
http://www.microsoft.com/en-us/download/details.aspx?id=21101

## 便利な所 ##

- ツリー構造で管理できる。
- グループに定義したIDやパスワード、接続設定を継承でき、固有の所だけを変更するなどが可能
- グループに対しての一括接続、一括切断
- 必要に応じてフルスクリーンにできる。
- 小さく並べて、目視管理も可能

という具合に、日頃からAzureとかAWSでWindows serve使う人達は、とっても便利なので是非使ってみてくださいね。

![RemoteDesktopConnectionManager.png](https://qiita-image-store.s3.amazonaws.com/0/24782/fe010d47-ec0f-0005-35a1-22c7978943f3.png)
dateコマンドでunixタイムを文字列に変換する


## unixtimeから人が見やすい文字列

```shell-session
$ date -r 1404988200
2014年 7月10日 木曜日 19時30分00秒 JST
```

## ISO8601形式の文字列からunixtime

```shell-session
$ date -jf '%Y-%m-%dT%H:%M:%S%z' '2014-07-10T19:30:00+0900' +%s
1404988200
```


## 参考にした記事
http://quiwamu.tumblr.com/post/16117661721/osx-unixtime
python 2.6 のOpenSSL version確認

python2.7ではssl.OPENSSL_VERSIONが使えるが、2.6では使えない。
2.6で確認できないかと試したのが以下のコマンド。

```
python -c 'import ssl,commands; print commands.getoutput("strings {0} | grep \"^OpenSSL \"".format(commands.getoutput("ldd {0} | grep ssl ".format(ssl._ssl.__file__)).split(" ")[2])) '
OpenSSL 1.0.1e-fips 11 Feb 2013
```
gulpのインストール→Stylusのコンパイル

まずは、gulpをインストール

```
sudo npm install -g gulp
```

適当な場所にプロジェクトフォルダを作る

```
mkdir -p project/stylus project/css
cd project
```

gulpをプロジェクトにインストール

```
npm install --save-dev gulp
```

続いて、Stylusのプラグインをインストール

```
npm install gulp-stylus
```

gulpfile.jsファイルを作る

```js
var gulp = require('gulp');
var stylus = require('gulp-stylus');

gulp.task('stylus', function() {
    gulp.src('stylus/*')
      .pipe(stylus())
      .pipe(gulp.dest('css/'));
});
```

Stylusファイルを「stylus」フォルダ内に作成する

```sass
body
	background-color: #ccc
	
	.main
		font-size: 10px
```

gulpを起動

```
gulp stylus
```

CSSフォルダ内に、.cssファイルが生成されていればOK。
GitHubユーザが入れるべきChrome Extensionまとめ


# Do Not Merge WIP for GitHub

WIP(Work In Progress)とタイトルに入っているPull Requestや、コメント内にチェックボックスがあるけどまだ全てチェックされてないPull Requestではマージボタンを無効にする。
まだ作業中のPull Requestを誤ってマージしてしまったという事故を防げる。

https://chrome.google.com/webstore/detail/do-not-merge-wip-for-gith/nimelepbpejjlbmoobocpfnjhihnpked

![donot.png](https://qiita-image-store.s3.amazonaws.com/0/22653/1bc542c6-49de-7de5-451b-e29c48fffc7c.png)

# Pretty Pull Requests

https://chrome.google.com/webstore/detail/pretty-pull-requests-gith/ljnjpkadhhcdniohpfilddnhahoigdec

GitHubで差分を見ている時に、追加された部分や削除された部分のみ表示することができる。
また、邪魔なdiffはアコーディオンで閉じれるので、ページが長過ぎて延々スクロールするなんてこともない。

![prettypr.png](https://qiita-image-store.s3.amazonaws.com/0/22653/2b10cdd5-2599-0b88-a5fd-d0491530c7a5.png)

# LGTM

https://chrome.google.com/webstore/detail/lgtm/oeacdmeoegfagkmiecjjikpfgebmalof

GitHubのコメントを書いている時にワンクリックでLGTM画像を挿入できる。

![lgtm.png](https://qiita-image-store.s3.amazonaws.com/0/22653/31990ecb-27a1-ed4a-4371-bac3f9b8b1f6.png)

# Github Omnibox

https://chrome.google.com/webstore/detail/github-omnibox/jbfhklldhgbomclinhlgbmjjiimafolo

Chromeの検索ボックスから直にGitHub内のリポジトリやユーザ、Gistを検索できるExtension。

![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/22653/d8a2dd50-f918-0869-bc04-c792823f3eb7.png)

`gh dtaniwaki`などのようにして使う。

使い方詳細は[GitHub](https://github.com/ProLoser/Github-Omnibox)に書いてある。

# Github Checker

https://chrome.google.com/webstore/detail/github-checker/dejgifcjoefbogdjpjokobdlddjhbich

自分で作ったgemです。
自分にアサインされているPull Requestの数が常にアイコンに表示されているので忘れずに済む。
アサインされているレビューだけでなく、自分が作成したりメンションされたりしたPull Requestも一覧ですぐ出せる。

![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/22653/999c27a2-4262-4959-9847-a9bf322a34da.png)


他にも良いものがあれば追加するのでコメントで教えてください！
Akka: 5秒おきに処理を行いたい


AkkaのActorで数秒おきなど一定間隔で処理を行うには、Schedulerを使うことでできる。

```scala
import akka.actor.{ ActorLogging, Actor, ActorSystem, Props }

object Boot extends App {
  val system = ActorSystem("my-actor-system")
  val heartBeat = system.actorOf(Props[HeartBeatActor])
}

import concurrent.duration._
import concurrent.ExecutionContext.Implicits.global

class HeartBeatActor extends Actor with ActorLogging {

  // 5秒おきに "I'm alive" とログに出す
  context.system.scheduler.schedule(0.seconds, 5.seconds)(log.info(s"I'm alive."))

  override def receive: Receive = {
    case _ =>
  }
}

```

自分自身にメッセージを来る方法もある。何かActor内の状態を変更する場合は、こちらのほうがメッセージがメールボックスにキューイングされるので、スレッドセーフになると思う。

```scala
// ...

case object HeartBeat

class HeartBeatActor extends Actor with ActorLogging {
  context.system.scheduler.schedule(0.seconds, 5.seconds, self, HeartBeat)

  override def receive: Receive = {
    case HeartBeat => log.info("I'm alive")
    case _         =>
  }
}
```