OmniAICreator/Qiita-1.07M huggingface dataset:
fluent-plugin-inline-classifier で reqtime を分類する


[fluent-plugin-inline-classifier](https://github.com/yosisa/fluent-plugin-inline-classifier) という input プラグインを作りました。このプラグインを使うと、メッセージのとあるキーに入っている値に基づき、メッセージを分類し、結果を別のキーとして挿入することができます。

アクセスログを fluentd で流している時には `reqtime` にレスポンスタイムが入っていることが多いと思います。しかし、reqtime は数値なので、Kibana で Terms panel を使って Pie chart や table で表示しようとしてもうまくいきません。

そんな時にこのプラグインを使えば、reqtime を元にログをいくつかのカテゴリに分類することができます。分類結果は有限なので、Terms panel を使って各カテゴリに該当するログがどれだけあるかが一目瞭然になります。

## インストール
gem でインストールできます。

```
$ gem install fluent-plugin-inline-classifier
```

## 設定
設定例を載せておきます。

```
<match raw.access.**>
  type inline_classifier
  add_prefix classified
  remove_prefix raw
  <rule>
    key reqtime
    type range
    store speed
    class1 ~20ms * 0.02
    class2 20-50ms 0.02 0.05
    class3 50-100ms 0.05 0.1
    class4 100-200ms 0.1 0.2
    class5 200-500ms 0.2 0.5
    class6 500-1000ms 0.5 1.0
    class7 1000ms~ 1.0 *
  </rule>
</match>
```

`type`, `add_prefix`, `remove_prefix` は見たままです。

分類方法は `rule` セクションで指定してやります。`rule` セクションは複数指定することが可能です。

* `key`: 分類に使用するキーを指定します。
* `type`: 分類方法を指定します。v0.1.0 では `range` のみサポートしています。
* `store`: 分類結果を書き出すキーを指定します。
* `classN`: クラス名と条件を指定します。条件は type に依存します。条件は N の昇順にチェックされ、最初にマッチしたクラス名が分類結果になります。

### range classifier
条件は `min max` の形で指定します。判定は min <= x < max になります。min や max には `*` を指定することもでき、指定した側の値は考慮されなくなります。今のところ `* *` には対応していません。

上のサンプルによれば、`reqtime` が 0.02 未満なら `speed` に ~20ms という値が挿入されます。同様に、`reqtime` が  0.1 なら `speed` に 100-200ms という値が挿入されます。

## Elasticsearch の設定
`speed` というキーが Elasticsearch に登録されると、適当に解析されてしまってうまく表示できないと思います。そんな時には [Elasticsearch の index templates で解析方法を指定する（または、default mapping が効かない時に）](http://qiita.com/yosisa/items/b0bb44548bbd527005cc) を参考にしてください。
Providerを用いた依存性注入

# Providerとは
## Providerという考え方
対象とするオブジェクトを直接注入するのではなく、そのオブジェクトを取得する機能をもったオブジェクトを注入します。コードを見た方が理解しやすいので、下記にCoreData用のプロトコルを引用します。

```objc:protocol
#import <Foundation/Foundation.h>

@protocol BTKCoreData <NSObject>

@property(strong,readonly,nonatomic) NSManagedObjectModel *managedObjectModel;
@property(strong,readonly,nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property(strong,readonly,nonatomic) NSManagedObjectContext *managedObjectContext;

@end


@protocol BTKCoreDataProvider <NSObject>

- (id<BTKCoreData>) get;

@end
```

BTKCoreDataProviderの依存関係を注入しておくと、必要なタイミングでBTKCoreDataを取得することが出来ます。

## Providerを用いるメリット
依存関係のタイミングを遅らせることができるため、下記のようなメリットがあります。

1. 循環参照の回避
    * initializerで依存関係を注入する場合、Providerを用いないと相互参照はすべて循環参照となります。Providerを用いると、相互参照をintializer内で双方から使用しない限り循環参照となりません。
2. オブジェクト生成タイミング遅延
    * 必要になるまでオブジェクト生成を遅延することができます。オブジェクトの生成コストが高い場合に有効です。
3. オブジェクト注入コストの低減
    * Providerはロックなしで注入できるので、大量にsingletonを注入する場合などにはちょっと効果があるかもしれません。

# Typhoon FrameworkにおけるProvider
残念ながらTyphoon FrameworkとしてのProviderの書き方はありません。
ただ、Provider用のクラスにTyphoonComponentFactoryを注入するだけで簡単に実現できるので、あまり困ることはないと思います。

```objc:interface
@interface BTKCoreDataProviderImpl : NSObject<BTKCoreDataProvider>

@property(strong,readonly,nonatomic) TyphoonComponentFactory* factory;

- (id)initWithFactory : (TyphoonComponentFactory*) factory;

@end
```

```objc:implementation
@implementation BTKCoreDataProviderImpl

- (id)initWithFactory : (TyphoonComponentFactory*) factory;
{
    self = [super init];
    if(!self){
        return nil;
    }
    _factory = factory;
    return self;
}

- (id<BTKCoreData>)get
{
    return [self.factory componentForType:@protocol(BTKCoreData)];
}

@end
```

```objc:assembly
- (id) coreDataProvider
{
    return [TyphoonDefinition withClass:[BTKCoreDataProviderImpl class]
                         initialization:^(TyphoonInitializer *initializer)
            {
                initializer.selector = @selector(initWithFactory:);
                [initializer injectWithComponentFactory];
            }];
}
```
Excel表の選択範囲のセルをもとにTwitterBootstrap2.xのテーブル(HTML)を生成するVBA

Excelおじさん用だよ！
TwitterBootstrapのテーブルをつくるときExcelの表をもとにしたいのでつくりました。
VBAデス！

# 使い方
表にしたい範囲を選択してから実行してくださいね。
生成されたHTMLはクリップボードにコピーされるよ。
※1行目はヘッダーだよ。

# ソース
```vbnet

' Excel表の選択範囲のセルをもとにTwitterBootstrap2.xのテーブル(HTML)を生成する
' 2013.08.09 Fukaya

' ※生成されたHTMLはクリップボードにコピーされます。
' ※１行目はヘッダ行になります
' ※メニューの「ツール」→「参照設定」で「Microsoft Forms 2.0 Object Library」を選択しておく必要があります。（クリップボード操作のため）

Option Explicit
Dim htmlOut As String ' 生成されるHTML

Sub MakeBootStrapHtmlTable()
    ' 選択範囲
    Dim x0 As Integer
    Dim y0 As Integer
    Dim w As Integer
    Dim h As Integer

    ' 変数
    Dim x As Integer
    Dim y As Integer
    Dim rowHtml As String


    ' 選択範囲取得
    x0 = Selection.Cells(1).Column
    y0 = Selection.Cells(1).Row
    w = Selection.Cells(Selection.Count).Column - x0 + 1
    h = Selection.Cells(Selection.Count).Row - y0 + 1
    
    Debug.Print "選択範囲:" & x0 & "," & y0 & "," & w & "," & h
    
    If w < 1 Or h < 2 Then
        MsgBox "選択範囲が狭すぎます。" & vbCrLf & "1桁2行以上を選択する必要があります。"
        Exit Sub
    End If
    
        
    ' 生成されるHTML初期化
    ClearHtml
    
    ' 処理開始
    ' テーブル
    AddHtml 0, "<table class='table table-striped table-bordered table-condensed'>"
    
    ' テーブルヘッダ
    AddHtml 1, "<thead>"
    rowHtml = "<tr>"

    For x = x0 To x0 + w - 1
        rowHtml = rowHtml & "<th>" & MakeHtml(Cells(y0, x)) & "</th>"
    Next
    rowHtml = rowHtml & "</tr>"
    AddHtml 2, rowHtml
    AddHtml 1, "<thead>"
    
    ' データブロック
    AddHtml 1, "<tbody>"
    

    For y = y0 + 1 To y0 + h - 1
    
        ' データ行
        rowHtml = "<tr>"
        For x = x0 To x0 + w - 1
            rowHtml = rowHtml & "<td>" & MakeHtml(Cells(y, x)) & "</td>"
        Next
        rowHtml = rowHtml & "</tr>"
        AddHtml 2, rowHtml
    Next
    AddHtml 1, "<tbody>"
    
    ' /テーブル
    AddHtml 0, "</table>"
    
    ' 完了
    Debug.Print htmlOut
    
'   'A) InputBoxで結果を表示する場合（文字列長制限あり）
'    InputBox "コピーしてお使いください", "テーブル用HTMLを生成しました。", htmlOut
       
    'B) クリップボードにコピーする場合（参照設定が必要です）
    CopyToClipboard htmlOut
    MsgBox "テーブル用HTMLを生成しました。" + vbCrLf + "クリップボードにコピーしました。"
    
End Sub

Sub ClearHtml()
    htmlOut = ""
End Sub


Sub AddHtml(tabs As Integer, str As String)
    Dim i As Integer
    For i = 0 To tabs - 1
        htmlOut = htmlOut & vbTab
    Next
    htmlOut = htmlOut & str & vbCrLf
End Sub

Function MakeHtml(str As String) As String
    str = Replace(str, vbLf, "<br/>")
    MakeHtml = str
End Function

Sub CopyToClipboard(str As String)
    Dim MyDataObject As DataObject
    Set MyDataObject = New DataObject
    MyDataObject.SetText str
    MyDataObject.PutInClipboard
End Sub
```
今回のiOSプロジェクトで利用したOSSライブラリ達

今回のiOSプロジェクトで利用したOSSライブラリ達
チョー便利。すぺしゃる感謝
# ライブラリ
##【BlocksKit】
※ActionSheetやURLConnectionなどコールバックにdelegateを使用していた処理をblocksで記述出来る。
※コードがかなり見通し良くなります。
※現状32bit版しかないのでプロジェクトを32bit専用に指定しておくこと
zwaldowski / BlocksKit
https://github.com/zwaldowski/BlocksKit
iOSコーディングスタイルを変えてしまうBlocksKitの紹介 - 中継地点
http://d.hatena.ne.jp/h_mori/20120220/1329691866
iOS開発でBlocksKitを使うよ！（現時点2012/10/24での最新） - 僕の車輪の再発明
http://kazuph.hateblo.jp/entry/2012/10/24/173824

##【SVProgressHUD】
※プログレスダイアログを簡単に表示出来る
samvermette/SVProgressHUD · GitHub
https://github.com/samvermette/SVProgressHUD
SVProgressHUD
http://dev.classmethod.jp/smartphone/ios-loading-svprogresshud/
超簡単！iOSでたった数行でかっこいいローディング表示 – SVProgressHUD ｜ Developers.IO
http://dev.classmethod.jp/smartphone/ios-loading-svprogresshud/
iOSアプリでインジケーターのアニメーションが動かない！？ « ツール工房 覚書　（マルチスレッド）
http://studio.tgl.jp/blog/?p=1522

##【VCTransitionsLibrary】
※タブの切替アニメーションを追加する / スワイプで切り替え操作も可
VCTransitionsLibrary
https://github.com/ColinEberhardt/VCTransitionsLibrary
VCTransitionsLibrary を実際に使ってみる - Debian GNU/Linux 3.1 on PowerMac G4
http://d.hatena.ne.jp/paraches/20131015/1381808476

##【Toast for iOS】
※ AndroidのToastぽいのを表示するライブラリ
scalessec/Toast · GitHub
https://github.com/scalessec/toast

##【MKNumberBadgeView】
※バッジ (今回は使わなかった)
iPhone のバッジを好きな場所に表示する | アカベコマイリ
http://akabeko.me/blog/2011/08/iphone-%E3%81%AE%E3%83%90%E3%83%83%E3%82%B8%E3%82%92%E5%A5%BD%E3%81%8D%E3%81%AA%E5%A0%B4%E6%89%80%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/

##【lakesoft/LKbadgeView】
※バッジ こちらを使おう
lakesoft/LKbadgeView · GitHub
https://github.com/lakesoft/LKbadgeView
Cocoaの日々: バッジ描画ライブラリを公開
http://cocoadays.blogspot.jp/2011/09/blog-post.html
【facebook php sdk】アクセストークンを2ヶ月にする

#アクセストークンを2ヶ月にする方法
1. facebookのインスタンスを取得する
2. アクセストークンを2ヶ月にする
3. アクセストークンを取得する

```php:ac_token.php
$config = array(
    'appId'  => APPID,
    'secret' => SECRET
);
$facebook = new Facebook($config);
$facebook->setExtendedAccessToken();
$longToken = $facebook->getAccessToken();
```

これでfacebookのアクセストークンの有効期限(通常は1～2時間)が2ヶ月間となる
Redisサーバー、Redisクライアントの起動と終了

# Redisサーバー

## Redisサーバの起動

```
redis-server
```
```
redis-server /usr/local/etc/redis.conf
```

## Redisサーバーの終了

クライアントからshutdownで終了しないとディスクに保存されません。

```
Crtl+ C
```

# Redisクライアント

## Redisクライアントの起動

```
redis-cli
```

## クライアントからサーバーのデータをディスクに保存してサーバーを終了

```
shutdown
```

## Redisクライアントの終了

```
exit
```
Redisのインストール


## Windows

https://github.com/MSOpenTech/redis

git clone git://github.com/SOpenTech/redis.git

取得したソースの/Redis-バージョン/bin/releaseにあるzipファイルを展開します。

redisbin.zipが32bit版、redisbin64.zipが64bit版です。

Redis本体のディレクトリを適当な場所に移動します。

解凍して得られる、redis-server.exeがRedisサーバー、redis-cliがRedisクライアントです。

## OSX

brew install redis

http://qiita.com/checkpoint/items/58b9b0193c0c46400eeb

http://shimotori.github.io/blog-it/2012/08/10/1-install-redis-on-windows/

## Linux

http://qiita.com/sora083/items/a3b7e754cfaffdb9a51c
UNIXドメインソケットを試す

![c04f1b7fd932ac123a30c2c95e55f5b6.gif](https://qiita-image-store.s3.amazonaws.com/0/6978/28eb853a-7bfd-0226-9486-28e4c27e844f.gif)

UNIXドメインソケットは、異なるプロセス間で情報のやり取りを行う方法のひとつ。あるプログラムでファイルのようにして ~~.sockファイル~~ UNIXドメインソケットをどこかに置いておき、もう一方のプログラムでそのファイルに向けて接続すれば、やりとりが行える。試しに使ってみた。

サーバのコード。

```rb:server.rb
require 'socket'

time = 0

count = Thread.new do
  loop do
    time += 1
    Thread.pass
    sleep 1
  end
end

sock = Thread.new do
  Socket.unix_server_loop('server.sock') do |sock, addr|
    p sock
    Thread.new do
      loop do
        begin
          sock.write(time.to_s + "\n")
        rescue Errno::EPIPE => e
          p e
          break
        end
        Thread.pass
        sleep 0.2
      end
    end
  end
end

puts 'server launched!'

count.join
```

クライアントのコード。

```rb:client.rb
require 'socket'
require 'logger'

log = Logger.new(STDOUT) # 時刻をサクッと知りたかったのでLogger使った

UNIXSocket.open('server.sock') do |sock| # .sockファイルに対してopenする
  while true
    log.info sock.readline.chomp!
  end
end
```

こうすると、トップに貼ったgifのような感じで情報が取れる
Library not loaded エラー？ここを見直そう

はじめに
=======

Xcode で開発していると、以下のエラーに出くわすことが多いかと思います。

```
Dyld Error Message:
  Library not loaded: /Library/Frameworks/xxx
  Referenced from: /Users/USER/Desktop/MyApp.app/Contents/MacOS/MyApp
  Reason: image not found
```

Dyld とは dynamic loader という実行時にライブラリを読み込む機構のことです。
「ライブラリが見つからないよ」と言われているわけです。

プロジェクトに外部ライブラリを組み込んだ場合によく起こりますね。


対応方法
=======

Linked Frameworks and Libraries を見直す
----------------

General > Linked Frameworks and Libraries に該当のライブラリが設定されているか見直しましょう。

![ZowLog_—_ZowLog.jpg](https://qiita-image-store.s3.amazonaws.com/0/7823/078afa73-7527-84ad-9754-a69d48604cfd.jpeg)


Copy Files Phase を見直す
----------------

Build Phases > Copy Files に該当のライブラリが設定されているか見直しましょう。

![ZowLog_—_ZowLog.jpg](https://qiita-image-store.s3.amazonaws.com/0/7823/4c66adab-29a7-940d-999b-5b0a9999ebb8.jpeg)

「Copy Files」が見つからない場合は、メニューの Editor > Add Build Phase > Add Copy Bundle Resources Build Phase から追加可能です。

![Add_Build_Phase_と_Editor_と_Menubar.jpg](https://qiita-image-store.s3.amazonaws.com/0/7823/4b3262e0-30f7-1396-1270-0533d19db874.jpeg)



Runpath Search Paths を見直す
----------------

Build Settings > Linking > Runpath Search Paths に `@loader_path/../Frameworks/` と記述してあげましょう。

![ZowLog_—_ZowLog.jpg](https://qiita-image-store.s3.amazonaws.com/0/7823/adaa79be-2bc3-bf82-0901-2936cd36678d.jpeg)


Installation Directory を見直す
----------------

ライブラリをサブプロジェクトとして組み込んでいる場合、もしくは自分で **.framework** を作成して組み込んでいる場合。
**ライブラリ側のプロジェクト** の Installation Directory を見直しましょう。
Build Setting > Deployment > Installation Directory から確認が可能です。

`@rpath` と記述してあげましょう。

![ZowLog_—_EvernoteSDK.jpg](https://qiita-image-store.s3.amazonaws.com/0/7823/3abc4b3d-c728-6722-499c-1d099450e5c9.jpeg)


参考
---------------

- [mikeash.com: Friday Q&A 2009-11-06: Linking and Install Names](https://mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html)
- [[OpenFrameworks] ofxSyphon追加時の dyld: Library not loaded: @loader_path … のエラー | Hi-farm blog](http://blog.hi-farm.net/2011/12/09/openframeworks-ofxsyphon%E8%BF%BD%E5%8A%A0%E6%99%82%E3%81%AE-dyld-library-not-loaded-loader_path-%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC/)
Mac OS X El Capitan‎ で Powerline を導入して tmux で表示するまで

# 完成イメージ
![2014_04_19_19_41.png](https://qiita-image-store.s3.amazonaws.com/0/10213/620515db-0905-9ae5-cf71-ecf51ddf9d95.png)

# 前提条件
|名称|バージョン|
|:--|:-------|
|Mac OS X|10.11.3|
|tmux|2.1|
|powerline-status|2.3|

# 手順

## pyenvのインストール
- https://github.com/yyuu/pyenv#homebrew-on-mac-os-x

## pythonのインストール
```bash
pyenv install 2.7.9
pyenv global 2.7.9
```

`brew` との干渉を避けるため `*shrc` に以下のように書く:

```bash
# cf. https://github.com/yyuu/pyenv/issues/106#issuecomment-94921352
if which pyenv 2>&1 >/dev/null; then alias brew="env PATH=${PATH//$(pyenv root)\/shims:/} brew"; fi
```

## フォントのインストール
```bash
brew tap sanemat/font
brew install Caskroom/cask/xquartz
brew reinstall --powerline --vim-powerline ricty
```

## Powerline のインストール
必要なパッケージをインストールする。

```bash
pip install -U psutil powerline-status netifaces
pyenv rehash
```

## 設定
`tmux.conf` に以下を書く。

```bash
source ~/Library/Python/2.7/lib/python/site-packages/powerline/bindings/tmux/powerline.conf
```

これでデフォルトの設定で Powerline が有効になるが、あまり融通が効かないので、
`powerline.conf` を参考に自分で `tmux.conf` を設定したほうがいいかもしれない。

画像のようにするには、参考リンクに示した自分の実際の設定ファイルを参照してほしい。

# 参考リンク
- [Ricty for Powerline を homebrew で簡単インストール - Qiita](http://qiita.com/znz/items/e94b7377f201e7b1683e "Ricty for Powerline を homebrew で簡単インストール - Qiita")
- [Homebrew Python, Macvim: getting user scheme error (--user) · Issue #552 · Lokaltog/powerline](https://github.com/Lokaltog/powerline/issues/552 "Homebrew Python, Macvim: getting user scheme error (--user) · Issue #552 · Lokaltog/powerline")
- [Powerline に○○が表示されない？ なら作ればいいじゃない（4日目 tmux 編） | blog.remora.cx](http://blog.remora.cx/2013/05/add-segments-to-powerline-for-tmux.html "Powerline に○○が表示されない？ なら作ればいいじゃない（4日目 tmux 編） | blog.remora.cx")
- [Powerline — Powerline beta documentation](https://powerline.readthedocs.org/en/latest/index.html "Powerline — Powerline beta documentation")
- [yewton/dotfiles](https://github.com/yewton/dotfiles "yewton/dotfiles")
MVCとかWAFとかを最初に理解するにあたってイメージしたこと

# MVCとかWAFとかを最初に理解するにあたってイメージしたこと

## 概要

* 4月だしねー
* 自分が分かりやすいスキームに当て込んで考えるとしっくりきた
 * 飲食で働いてた経験が長かったので、そこに当て込んでイメージを掴んだ
* 型にはまってさえすれば一連の流れというのは大体はイメージしやすい

## Request

* 顧客、何を食べたいか、どれだけ食べたいかで支払いが増える
 * Webサービスでも同じで、情報を多く欲しい時はそれだけ時間と手間がかかる

## WAF(Dispatcher)

* レジ、どの席に何人入るか等を調整したり支払いの請求をする
 * 適切なコントローラ(席)にリクエスト(顧客)を割り振る係
 * リクエスト(顧客)の情報を事前に伝えたりもする

## Controller

* ホール係、注文を聞いて厨房に届けるという役割を担う
 * 調理(ビジネスロジック)を行わずに、厨房には料理(モデル)に専念してもらう係

## Model

* 厨房係、ビジネスロジック
 * 食材を調理して、出来上がった料理を提供する係

### 食材

* 料理の材料、データモデル
 * DBに格納されるレコード単位な立ち位置

### 冷(蔵|凍)庫

* 食材を保存する場所
 * ここがDBなんだなってイメージした

### 調理器具

* 食材を切ったり、焼いたりする道具
 * ライブラリ

## View

* 料理
 * ```Model``` で作られたものをそのまま出すだけではなく、Controllerで付随する要素を追加したりする
 * Ex. カスターセット

## Response

* 支払い
 * 料金(処理にかかった時間)と引き換えにサービスの一単位が完了する

## 結論

* 自分はこれで最初期は腑に落ちた
 * MVCとかよくわからんなヒトは自分がイメージしやすいものに当て込んでく方がいいかなって
Railsで、画像をアップロード、ダウンロードするREST API


たくさんの方が書かれてる内容ではありますが、備忘録として書いておきますネ
RESTfulじゃない！とかRails wayじゃない!とか是非ツッコミください。

特に追加するgemは無いです。

##Model

画像データとstringのタグを持つImage Modelを作ります。

```bash:
$ rails g model Image tag:string data:binary
$ rake db:migrate
```

##Routes

こんな感じのルートを定義してみました。
dataは空のままPOSTして、その後Request Bodyにバイナリを直接突っ込んでPUTでアップロードするという使い方です。


```ruby:routes.rb
get 'images/:id' => 'images#show'
post 'images' => 'images#create'

get 'images/:id/download' => 'images#download'
put 'images/:id/upload' => 'images#upload'
```

##Controller
```bash:
$ rails g controller Images
```

```ruby:images_controller.rb
class ImagesController < ApplicationController
  def show
    image = Image.find(params[:id])
    render json: image, except: [:data]
  end

  def create
    image = Image.new
    image.tag = params[:tag]
    image.save!
    render json: image, except: [:data]
  end

  def download
    image = Image.find(params[:id])
    send_data image.data, type: "image/png", disposition: 'inline'
  end

  def upload
    image = Image.find(params[:id])
    image.data = request.raw_post
    image.save!
    render json: image, except: [:data]
  end
end
```

##curlで試す
```bash:
$ rails s
$ curl --request POST -H 'Content-Type: application/json' -d '{"tag":"trumpet"}' http://localhost:3000/images
$ curl --request PUT -H 'Content-Type: application/octet-stream' --data-binary "@icon.png" http://localhost:3000/images/1/upload
$ curl http://localhost:3000/images/1/download > icon_downloaded.png
```
***
さすがrails, お手軽です。
REST APIのバックエンド作るだけならもっとシンプルなsinatraとか使った方が良いかもしれませんが・・・
QiitaのMarkDownでリストの順番を簡単に並べ替える方法

小ネタです。

MarkDownで番号付きリストを使うと番号が自動で振られて便利ですが、あとで並べ替えるのが面倒。
と思い込んでましたがちゃんと考慮されていたのでメモ。

```text:番号付きリスト
1. hoge
2. foo
3. bar
```

### 番号付きリストの記述方法（入れ替え簡単版）

#### MarkDown
ポイントは、 **文頭の数字は連番でなくていい**ということ。

```
1. はじめに
1. そのつぎ
1. つぎのつぎ
1. まだ続く

または

1. はじめに
* そのつぎ
* つぎのつぎ
* まだ続く

```
文頭の数字は全部同じでも（違っても）勝手に連番になるから、1. 1. 1. などにしておくと直すのが楽！最初が 数字. なら次行以降は * などでもOK。連番でなくていいのです。

↓入れ替えがめんどくさい版MarkDown

```
1. はじめに
2. そのつぎ
3. つぎのつぎ
4. まだ続く
```

#### 簡単版で書いたときの実際の表示

1. はじめに
1. そのつぎ
1. つぎのつぎ
1. まだ続く



### Kobitoのチートシートより。これが罠でしたｗ
> 文頭に「数字.」を入れると順序つきリストになります
> 1.2.3.と入れていくといい具合です

[オフィシャルサイトにものっていました。(http://qiita.com/Qiita/items/c686397e4a0f4f11683d#3-6)](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#3-6)
ニコニコ大百科データからMeCab辞書を生成する

#概要
[国立情報学研究所Webサイト](http://www.nii.ac.jp/cscenter/idr/nico/nico.html)にある「ニコニコ大百科データ」(by 有限会社未来検索ブラジル)から、
[MeCab](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html)の辞書を生成・適用する。
研究目的でテキストマイニングをするならこの方法もありかもしれない。
　※実行環境はLinuxMint13(Ubuntu12.04 LTS)です。

#方法
##01.ニコニコ大百科データを取得する。
http://www.nii.ac.jp/cscenter/idr/nico/nicopedia-apply.html
　※head.zipをダウンロード・解凍する。

##02.解凍後のheadフォルダと同じ階層に下記Pythonコードを配置する。
```py:nc2mecab.py
# -*- encoding: utf-8 -*-

import os
import csv
import re

def main():
  #入力フォルダ名
  pth = 'head'
  #出力ファイル名
  wtnme = 'ncnc.csv'
  #単語整形用の削除文字列パターン
  rmvptn = re.compile(r'(^\d[1,2]月\d[1,2]日$)|((\(|（).+(\)|）)$)') #月日タグとタグ後ろのジャンル名は削除

  with open(wtnme,'wb') as wtfh:
    wt = csv.writer(wtfh)
    fnmes = os.listdir(pth)
    for fnme in fnmes:
      with open(os.path.join(pth,fnme),'rb') as rdfh:
        rd = csv.reader(rdfh)
        for row in rd:
          if row[3]=='a':
            wrd = rmvptn.sub('',row[1]).lower()
            if(0 < len(wrd)):
              wt.writerow(
                [wrd,'0','0',int(max(-32768.0, (6000 - 200 *(len(wrd)**1.3)))),'名詞','一般','*','*','*','*',wrd,row[2],row[2],'ニコニコ大百科']
              )

if __name__ == '__main__':
  main()
```
※出力する単語に重複がある。データ整形の精度も甘い。
※コスト計算方法は[こちらのサイト](http://yu8star.blog9.fc2.com/blog-entry-16.html)を参考にさせてもらった。

##03.Pythonコードを実行する。
```
python nc2mecab.py
```
※ncnc.csvが同階層に出力される。

##04.MeCabの辞書を生成・適用する。
出力したCSVを使い、[MeCab: 単語の追加方法](http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html)の「ユーザ辞書への追加」を実行した。
ただし、辞書生成コマンドは下記のようにした。
```
/usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic -u ncnc.dic -f utf-8 -t utf-8 ncnc.csv
```

#結果
vocaloidとラブライブ！はニコ厨の嗜み。

vocaloid	名詞,一般,*,*,*,*,vocaloid,ボーカロイド,ボーカロイド,ニコニコ大百科
と	フィラー,*,*,*,*,*,と,ト,ト
ラブライブ！	名詞,一般,*,*,*,*,ラブライブ！,ラブライブ,ラブライブ,ニコニコ大百科
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
ニコ厨	名詞,一般,*,*,*,*,ニコ厨,ニコチュウ,ニコチュウ,ニコニコ大百科
の	助詞,連体化,*,*,*,*,の,ノ,ノ
嗜み	名詞,一般,*,*,*,*,嗜み,タシナミ,タシナミ
。	記号,句点,*,*,*,*,。,。,。
EOS
iOS7でカスタムURLスキームでMapアプリに遷移する。

UIActivityViewControllerなどで、Mapアプリに遷移したいときにiOS7から方式が変わったのでメモ。
参考リンク
https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html
http://ascii.jp/elem/000/000/852/852280/index-2.html

サンプルコードはこんな感じ

```objectivec
NSString* q = @"http://maps.apple.com/maps?q='渋谷駅'";
NSURL* url = [NSURL URLWithString:[q stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
  [[UIApplication sharedApplication] openURL:url];
```

いろいろオプションはあるのですが、URLに日本語を使うときは`stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding`でエスケープするのを忘れずに。
mongodbを使用するとkaminariでorderが使えない

# 問題
```rb
def index
  @tweets = Tweet.page(params[:page]).per(50).order("id desc")
end
```
みたいなことをやりたいが

```
undefined method `order' for #<Mongoid::Criteria:0x007fb98df18aa8>
```

と出力されてしまう．

# 解決法
```rb
def index
  @tweets = Tweet.page(params[:page]).per(50).desc(:id)
end
```
`desc(:id)`のように書く．

調査不足なので，mongodbを使った場合特有の現象なのかは調べきれていませんが，これでやりたいことができたので共有します！
gitで管理されているtexファイルの差分pdfを作成するスクリプト

# シェルスクリプト
`git-latexdiff.sh`に以下のソースをコピー．

``` bash 
#!/bin/bash

# 作業用の一時ファイルを作成
TMPDIR=$(mktemp -d /tmp/git-latexdiff.XXXXXX)
export this=`mktemp $TMPDIR/latex-diff.XXXXXX`
export that=`mktemp $TMPDIR/latex-diff.XXXXXX`

# gitからソースを取得
git show "$2:$1" > $this
git show "$3:$1" > $that

latexdiff -e utf8 -t CFONT "$this" "$that" > $TMPDIR/diff.tex
platex -output-directory $TMPDIR $TMPDIR/diff.tex
dvipdfmx $TMPDIR/diff.dvi

# macを使用している場合
open diff.pdf

rm -rf $TMPDIR
```

# 使い方
```bash
sh git-latexdiff.sh document.tex HEAD HEAD^
sh git-latexdiff.sh 対象ファイル 旧リビジョン 新リビジョン
```

複数ファイルに分割している場合動かなさそうだったり，目次ファイルが正しく出力されなかったり，要改善な状態ですが，メモとして残しておきます．

# 参考文献
http://quickhack.net/nom/blog/2013-06-16-latexdiff-for-japanese-documents.html

http://tex.stackexchange.com/questions/1325/using-latexdiff-with-git
MySQL: INSERT...ON DUPLICATE KEY UPDATEまとめ


[INSERT...ON DUPLICATE KEY UPDATE構文](http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html)を使うと

- レコードがなければINSERT、あればUPDATE
- 複数行の一括UPDATE
- フィールド毎に条件判定して更新

を１度のクエリで行うことができる。集計処理などに便利。

# 基本

- レコード（行）がなかったらINSERTあったらUPDATEという処理を１クエリで行える。
	- ユニークなフィールドに対して重複する行が挿入される場合はUPDATEという判定
		- なので利用には **UNIQUEインデックス（かPRIMARY KEY）を指定する必要** がある

```sql:基本例：aはunique
INSERT INTO
       table (a, b, c)
   VALUES
       (1, 12, 100)
   ON DUPLICATE KEY UPDATE
		b = 20
		, c = 200;
```

a=1の行がなかった場合
>  a=1,b=12,c=100 の行が追加

a=1の行が既にあった場合
> a=1の行がa=1,b=20,c=200に更新

- VALUES()関数を使うとINSERTに使おうとした値をUPDATEに使える

```sql:VALUES()の例
INSERT INTO
       table (a, b)
   VALUES
       (1, 10)
   ON DUPLICATE KEY UPDATE
		b = b + VALUES(b)
```

|  a|  b|
|:-:|:-:| 
|  1|  5|

↓

|  a|  b|
|:-:|:-:| 
|  1| 15|




# 複数行の一括UPDATE

```sql:複数行追加・更新の例
INSERT INTO
       table (a, b, c)
   VALUES
       (1, 10, 100), (2, 20, 200)
   ON DUPLICATE KEY UPDATE
		b = b + 21
		, c = VALUES(c) + 201;
```

とすると a=1,a=2 に対して追加/更新が行われる。

|  a|   b|  c|
|:-:|:--:|:-:|
|  1|   5| 15|

↓

|  a|   b|  c|
|:-:|:--:|:-:|
|  1|  26|301|
|  2|  20|200|



# 条件にあうフィールドだけ更新

- DUPLICATE KEY UPDATE にはCASEやIFが使えるので、フィールド毎に更新条件を設定できる。
	- デフォルト値を使って値を更新されないようにもできる。

```sql:取得した数字がレコードの数字より大きければ更新
INSERT INTO
       table (user_id, fb_like, tweet, updated)
   VALUES
       (1, 12, 10, NOW()), (2, 8, 9, NOW()) ... (1000, 42, 30, NOW())
   ON DUPLICATE KEY UPDATE
       fb_like = IF(fb_like > VALUES(fb_like), fb_like, VALUES(fb_like))
       , tweet = IF(tweet > VALUES(tweet), tweet, VALUES(tweet))
		, updated = NOW()
```

# SELECT文

```sql
INSERT INTO toppings (id, restaurant_id)
SELECT
       t.id
       , t.restaurant_id
    FROM
       toppings AS t
       LEFT OUTER JOIN pizzas AS p
            ON p.id = t.pizza_id
ON DUPLICATE KEY UPDATE
    restaurant_id = IF(p.restaurant_id > 0, p.restaurant_id, 0) 
```
client denied by server configurationが出るとき

以下設定する。
---------

```apache:
<Directory /srv/www>
	Require all granted
</Directory>
```

`Require all granted`が肝。

よくある間違い
--------------

```apache:間違い
<Directory /srv/www>
	Order allow,deny
	Allow from all
</Directory>
```

```diff:これは穴を突かれた時/以下をapache権限の範囲で見られると思う
  <Directory />
          Options FollowSymLinks
          AllowOverride None
-         Require all denied
+         Require all granted
  </Directory>
```
UnityをGit管理するときの.gitignoreメモ


下記の設定で良さそうです。

```
# Mac
.DS_Store

# Unity
[Ll]ibrary/
[Tt]emp/
[Oo]bj/

## Autogenerated VS/MD solution and project files
/*.csproj
/*.unityproj
/*.sln
/*.suo
/*.user
/*.userprefs
/*.pidb
/*.booproj
```


[参考]
https://github.com/github/gitignore/blob/master/Unity.gitignore
Ubuntu 14.04インストールしたメモ

ffmpegの代替
===========

ffmpegがdeplicateになったのでlibav-toolsのavconvで代用。
aac使う場合は`libavcodec-extra-54`を入れる。

```bash:
$ sudo apt-get install -y libav-tools libavcodec-extra-54
```

[avconv preset](http://dev.beandog.org/x264_preset_reference.html)

と思ったが、やはりffmpegがいいので[ffmpegのビルド](http://qiita.com/tukiyo3/items/ac36375d426d39f203fb)をした。

sambaのエラー出力対応
==================

sambaをインストールした後sudoすると下記エラーが出力される。

`no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory`

[バグ情報](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=728666)

```bash:おもむろに削除。
$ sudo dpkg --purge libpam-smbpass
```
フォロワーのTLを作る案

書いた人(author_id)をカラムとして持つ、time_lineテーブルを使った場合、

>
  SELECT * FROM time_line WHERE author_id IN(フォロワーID)
  ORDER BY id 

にようなSQLになりファイルソートが起きるし、かなり重めのSQLになってしまう。。。

レコードを作るときに、Redisに対して、
>
 user_id array( time_line.id,・・・・)

なキャッシュを作る。
Redisのmgetコマンドで複数レコードを一気に引けるので、
1.フォロワーIDを取得
2.Redisからmgetでtime_lineのインデックスを取得
3.2をキーの降順でソートして必要な範囲を切り出す
4.
  >
  SELECT * FROM time_line WHERE id in(   time_line.id,xxxx)

とするとかなりうまうまにTLを作れる気がするのでメモ
Rails で PG::ConnectBad エラーを捕捉して画面表示する

# 課題

Rails + postgresql で Rail アプリが起動中に postgresql が停止してしまった場合、productio モード、development モードでこんな画面が出る。

### production モード

![uncatch_error.png](https://qiita-image-store.s3.amazonaws.com/0/14958/bbfcb032-d12c-017e-67bc-eca15c8d48f2.png)
 
### develoment モード

![development.png](https://qiita-image-store.s3.amazonaws.com/0/14958/dedbb1b7-e30e-bc68-0b8f-d7b58e98de55.png)

development 時は これでもよいが、production モードの画面は、カスタマイズしたい場合がある。
こんな画面にする例を作ってみる。

### カスタマイズしたエラー画面

![catch_error.png](https://qiita-image-store.s3.amazonaws.com/0/14958/8041f20a-6707-fbb2-aef2-b68357f689e7.png)

# 実装ポイント

* 実装例は [https://github.com/katoy/rails-canvas](https://github.com/katoy/rails-canvas) に置いた。

* Postgresql 接続のエラーは controller 部ではキャッチできない。
そこで、 rake middleware に PG::ConnectioBad 例外をキャッチする rack アプリを登録する。
その rack アプリでは、サイトの画面テンプレートでレイアウトした画面を表示する。

* [config/application.rb](https://github.com/katoy/rails-canvas/blob/master/config/application.rb)
 - class DatabaseFailure を登録する。
 - これを 次のようにして登録する。

```ruby:application.rb
config.middleware.insert_before ActiveRecord::ConnectionAdapters::ConnectionManagement, ActionDispatch::Rescue do
      rescue_from PG::ConnectionBad, DatabaseFailure
    end
```

### 変更と加える前の rake middleware の出力結果と、変更後の rake middleware の出力結果を比較する。

Rescue アプリが追加された事がわかる。

* 変更前

```
...
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
...
```

* 変更後

```
...
use ActionDispatch::Callbacks
use ActionDispatch::Rescue
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
...
```

### 動作確認

- postgressqlを稼働させる。rake s で rails アプリを稼働させる。  
(postgresql が 未稼働だと、rails 開始時にエラーになってしまう。) 
- rails を稼働させる。

```
$ bundle install
$ bundle exec rake db:drop db:create db:migrate db:fixtures:load
$ rails s
```
http://localhost:3000 に web browser でアクセスして、正常な画面が出る事を確認する。
- その状態で、 postgresql を停止する。
- 再度、  http://localhost:3000 にアクセスする。
カスタマイズした画面が出ることが確認できる。


# 参考
- http://irohiroki.com/2011/06/15/rescue-rack-middleware-exceptions
   Rack middlewareで発生する例外をrescueする
	 
  > ...
  > 例えばMySQLを使っていてデータベースサーバに接続できない場合、
  > ActiveRecord::ConnectionAdapters::ConnectionManagementというmiddlewareから
  > Mysql2::Errorが発生します。
  > ...
  > つまり、どうやってもアプリケーションではrescueできません。
  > ...
  > Rack middlewareで発生した例外はActionDispatch::Rescueというmiddlewareで捕捉できます。ActionDispatch::ShowExceptionsと違い、ActionDispatch::Rescueは例外クラスに対してハンドリングするRackアプリケーションを指定できます。
  > ...


- http://yuuxxxx.hatenablog.com/entry/2013/08/29/205741
404ページ、500ページのつくりかた
rails の controller で捕捉できるエラーについて、 404, 500  の画面は、このページで述べられている方法で対処できる。
Googleが公開しているAndroidの各バージョンシェア率

>※この記事に記載れているグラフの内容は2014年4月のものです。
 すでにGoogle公式で新しいものが公開されています。


社内の非開発者、非アプリエンジニア向けに社内Qiitaに投稿したところ、
好評だったのか外にも書いたほうが良いのではという意見があったためこちらにも掲載。

ある程度のAndroid開発者であれば、キャッチアップしている事だと思いますが、参考になれば嬉しいです。

#Googleが公開しているAndroidの各バージョンシェア率

公表されているのは全世界のもので、以下に掲載されている。
大体月1ペースで更新されている様子。
[developer.android.com Platform Versions](http://developer.android.com/about/dashboards/index.html)

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/38069/d35329be-6a9c-07a6-a39d-904f11399c12.png)

| Version | Codename | API | Distribution |
|:-----------:|:------------:|:------------:|:------------:|
|2.2	|Froyo	|8	|1.1%|
|2.3.3~2.3.7|Gingerbread|10|17.8%|
|3.2	|Honeycomb	|13	|0.1%|
|4.0.3~4.0.4|Ice Cream Sandwich|15|14.3%|
|4.1.x	|Jelly Bean|16|34.4%|
|4.2.x	|Jelly Bean|17|18.1%|
|4.3	|Jelly Bean|18|8.9%|
|4.4|KitKat|19|5.3%|

※上記リンクより4/1日時点
※シェア率の算定基準は、集計日の過去7日間にGoogle playを訪問したデバイスのOSバージョン
　(2.1以下は新しいGoogle Playをサポートしていないので集計されないらしい)
※0.1%未満のシェア率はこの表には載っていない

ただ、日本は日本独自仕様などやキャリアの方針もあり

* OSアップデートが積極的に行われない
* OSアップデートされても半年～1年遅れる
* 新機種に搭載されるOSバージョンが少し前のもの

という傾向がある。
そのため、日本においては2.3系(Gingerbread)や4.0~4.1(Ice Cream Sandwich)の割合が大きいと考えられる。

#OSバージョンシェア率からアプリの対応OSバージョンを決める場合

実際に使いたいAPIやライブラリ・対応コストなども踏まえた上で、総合的に対応OSバージョンは判断すべきだと思うが、
シェア率は対応OSバージョン(APIレベル)を決める１つのヒントになる。

##2.3系を切るケース

日本においては、先ほども述べたとおり世界平均よりも若干2.3型の割合が高いと見られる。
※Googleでは国別は公開されていないが、自社のアプリを参考にするとシェア率だと30%はまだある感じ。

2.3ユーザーは今後減っていくとみられるが、現時点では2.3系をサポートしないと結構な割合で分母となるユーザーを失ってしまうので注意が必要である。

ちなみに、2.3系を切ると決断した場合、
3系は最も多いAPIレベル13ですら、グラフで判別できないほどのシェア(0.1%)しかないので、
2.3を非対応とする場合は、3系も一緒に非対応とする調整をしたほうが、対応や検証のコストを削減できる。

##2.2系を切るケース

2.2系のシェアは全世界で1%、日本の国の事情を考慮しても5%程度であると見ている。
該当するOSが搭載されている機種は殆ど発売から3年経っており、新規アプリであればサポート対象から外しても良いと思う。

細かい話だが、2.3以上を対応とする場合、GingerbreadのAPIレベル9(2.3~2.3.2)のシェアは0.1%未満であるため、
対応OSのを2.3.3以上(APIレベルを10)としても殆ど不都合が生じない。
(日本で普通に買えるAPIレベル9の端末としてはdocomoのXperia arcで一度もOSのアップデートしてないものくらいだったと思う)
Haxeで正規表現を動的に生成する

動的片付け言語に慣れすぎていると正規表現って文字列で定義出来るものだから、
動的に正規表現を生成したい場合に、そういえばどうやるんだっけな？と迷ってしまう。

## 普通に正規表現を定義

```hx
// haxe公式サイトのドキュメントにこんな感じの書き方しかのっていない
var regex = ~/^.+/i;
```

## 動的に定義

```hx
// 第一引数に正規表現の文字列、第二引数に正規表現のオプションを指定する
var regex1 = new EReg("^.+", "i");    // -> ~/^.+/i
// オプションを指定したくない時は、第二引数は空の文字列を指定する
var regex2 = new EReg("^.+", "");     // -> ~/^.+/
```

いつの間にかhaxe公式サイトからAPIドキュメントのリンクが出来ていた。
http://api.haxe.org/
haxe公式サイトのドキュメント(haxe.org)よりこっち(api.haxe.org)見たほうがいいかもね。
即売会サービスを作ろう６



今回はUIとシーン管理機能を作ります。

##シーン管理について
シーンとはショップ画面、メニュー画面等、遷移することがある画面のことをさしていて、
切り替えはActivityでなくViewで行い、これらシーン階層を操作するクラス(SceneManager https://gist.github.com/nagai/11076564 )を作りました。

このクラスはActivity内に存在しているViewAnimatorを操作するクラスです。


```Java
public class MenuActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_menu);

		// アプリ全体で一つ SceneManager を取得する
		CustomApplication app = CustomApplication.getInstance();
		SceneManager manager = app.getSceneManager();

		// このActivity 内で遷移するようにする。 id は ViewAnimator のID
		manager.setup(this,R.id.flipper);
		// シーンを切り替える
		manager.change( new S030menu() );
	}
}
```
このような形で activityごとに初期化をして

```Java
CustomApplication app = CustomApplication.getInstance();
app.getSceneManager().push( new S040circlemenu(), SceneManager.Animation.LeftScroll );
```

切り替えたいシーンはpush、戻る場合はpopを呼び出すことで実現しています。

## まとめ
そんな感じで本日の作業はこちら
https://github.com/nagai/freemarket/tree/20140419
次はサークル登録通信処理を作ります。
Eloquentのモデル生成法比較：newとcreate

Laravelで入っているEloquent ORMの、本当に微妙な使い方の話です。

Eloquentのモデルからエンティティオブジェクトを生成するには、２つ方法があります。

```php
$entity1 = new Model();
$entity2 = Model::create( array() );
```

この２つの方法の違いは、createを使うと、すぐにDBに保存されます。
まぁ殆ど差がないわけです。が、リレーションを使う場合にちょっと
createのほうが使いやすいかもしれません。

具体的なケースとして、簡単なブログとコメントの場合を考えます。

```php
class Blog extends Eloquent {
  public comments() {
    return $this->hasMany('Comment');
  }
}
class Comment extends Eloquent {
  public blogs() {
    return $this->BelongsTo('Blog');
  }
}
```

よくあるブログのサンプルです。
で、新しいブログとコメントを一度に作って保存しようとすると…

```php
$blog = new Blog();
$comment = new Comment();
$blog->comment()->save($comment); // 例外発生！
```

原因は…$blogはDBに保存される前なので、キー（ID）が設定されてない状態になっている。
にもかかわらずリレーションで使おうとすると例外が発生する（なのだと思われます）。

で、createを使ってエンティティを生成していると、例外が発生しません。

```php
$blog = Blog::create(array());
$comment = Comment::create(array());
$blog->comment()->save($comment); // 問題なし！
```

ひとまずエンティティはcreateメソッドを使って生成しようと
思ってます。

### 問題点は？

まだEloquentを使い始めたばかりなので、
よく知りませんが、思いつく問題点としては…

新しく生成したのかDBから読み込んだエンティティなのか、
判定する方法としては、

*   getKey()でキーが存在するかどうか、
*   existsフィールドがfalse、

がありますが、どちらも使えません。
少なくともオブジェクトを調べただけでは判別できなくなります（多分）。

それと、

> <small>エンティティを生成した後に問題が発生して、処理をキャンセルする場合を考えると、トランザクションの中で走らせる必要はあると思います。が、リレーションを設定すると、（BelongsToのassociateを除いて）設定した時点でDBに保存されるので、どちらにしてもトランザクション使わないと問題あるので同じな気はします。</small>

などでしょうか。
NSIntegerのpropertyに値が代入されているかどうかの判定


初期化する際に、``NSNotFound``を代入する
NSNotFoundかどうかで値が代入されたかどうか判定する

```

@interface Paginator

@property (nonatomic, assgin) NSUInteger currentPage;

@end

@implementation 

- (id)init
{
    self = [super init];
    if (self) {
        self.currentPage = NSNotFound;
    }
}

- (BOOL)hasCurrentPage
{
    return _currentPage != NSNotFound;
}

@end
```

### 参考
* restkitで実装されてた
    * https://github.com/RestKit/RestKit/blob/v0.20.3/Code/Network/RKPaginator.m#L72
ubuntuのmysqlのdatadirを移動させる

ubuntu 13.10のmysqlのdatadirを ```/var/lib/mysql```から、partitionの容量の問題で、```/home/mysql```に移動させ、```/etc/mysql/my.cnf```のdatadirを書き換えた。らば、動かなくなった。

/var/log/mysql/error には次のようなエラーが。

    /usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
	140419 15:14:19 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

でも、```/home/mysql/mysql/plugin.frm```は存在する。
さて。なんだろう?

調べた所、 http://askubuntu.com/questions/247568/unable-to-start-mysql-server-after-install-config が見つかった。どうもapparmorというsecurityの為のmiddleが上書いてたっぽい。

man apparmorすると色々書いてある。

とりあえず、 ```/etc/apparmor.d/usr.sbin/mysqld```を次のように改変。

```diff
32,33c32,33
<   /var/lib/mysql/ r,
<   /var/lib/mysql/** rwk,
---
>   /home/mysql/ r,
>   /home/mysql/** rwk,
```

で動くようになった。
これはわからんわー。qiitaでもapparmorで検索しても数件しかhitしない。
Vagrantで起動しているVMを一覧する

## 2020-07-28 追記
[vagrant-global-status plugin](https://github.com/fgrehm/vagrant-global-status)
> NOTICE: This plugin is no longer being maintained as its functionality has been implemented on Vagrant core and will be available with Vagrant 1.6+.

すでに Vagrant 本体に組み込まれているため、このPlguinはメンテナンスされていません！
代わりに `vagrant global-status` を利用してください！

----

VagrantでVMをポコポコ起動していると、どこで何を起動して、どのVMが生きているのか良くわからなくなる。
いつも、VirtualBoxを起動して確認するのも面倒くさいしイケてないきがする。
`vagrant status`はVagrantfileがある場所でしか表示されないし、
表示されてもその場にあるVMに関しての情報しか表示されない。

調べてみると、vagrantには`vagrant-global-status`というpluginがあるらしい。
なんと、このpluginをインストールすると、`vagrant global-status`コマンドで、
いつでもどこでも全てのVagrantVMの状態を一覧で表示することができる。素晴らしい。

### vagrant-global-status のインストール

    $ vagrant plugin install vagrant-global-status 

### 使い方
次のコマンドを実行するとVM一覧が表示される。

    $ vagrant global-status

こんな感じで表示されて便利。

    /Users/ringo/work/vag
      default      running      (virtualbox)   2014-03-12 14:43:07 +0900

    /Users/ringo/work/docker
      default      running      (virtualbox)   2014-03-12 14:43:59 +0900

試しにVMを一つ落として実行してみると。。。
シャットダウンした奴は表示されません。

    /Users/ringo/work/docker
      default      running      (virtualbox)   2014-03-12 14:43:59 +0900

`-a, --all`オプションを使うと起動していないやつも表示されます。

    $ vagrant global-status -a

    /Users/ringo/work/vag
      default      poweroff     (virtualbox)   2014-03-12 14:43:07 +0900

    /Users/ringo/work/docker
      default      running      (virtualbox)   2014-03-12 14:43:59 +0900

### 注意
このプラグインを入れた後に起動したVMしかリストされないので、
起動している場合は、一度落として立ち上げ直すと一覧されるようになります。

オプションはこのallとhelpしかないっぽい。

    $ vagrant global-status -h
    Usage: vagrant global-status [--all]
        -a, --all                        Displays information about all machines (instead of just the active ones)
        -h, --help                       Print this help


## 参考
- [Vagrantで仮想マシンの一覧を簡単に取得する方法](http://www.ryuzee.com/contents/blog/6752)
APCで任意のユーザキャッシュをクリアする


特定のキー名にマッチするキャッシュをクリアする。

```php

//すべてのユーザキャッシュを取得する
$userCache = apc_cache_info('user');

foreach($userCache['cache_list'] as $key => $cacheList){

	//	キーにabcが含まれているキャッシュを削除する
    if(strpos($cacheList['info'],'abc') !== false){
	   apc_delete($cacheList['info']);
	 }

}
```
Docker で X11 アプリを動かす.


漢なら docker コンテナで X11 アプリを sandbox 実行したいですね!
X11 アプリを動かしてみましょう.

http://stackoverflow.com/questions/16296753/can-you-run-gui-apps-in-a-docker

firefox のサンプルがあるのでこれを pull してみます.

```
$ sudo docker pull creack/firefox-vnc
```

コンテナ内で 5900 ポートに VNC が張られます(パスワードは 1234) ので, ホストにも port を expose して docker run します.

```
$ sudo docker run -p 5900:5900 creack/firefox-vnc
```

vncviwer で繋いでみます.

```
$ vncviewer localhost:0
```

![docker-x11vnc.png](https://qiita-image-store.s3.amazonaws.com/0/36275/2faccf6f-1d45-6c52-5d6d-cf0240e737ec.png "docker-x11vnc.png")

Cool!

## Todo

* NV/AMD の proprietary driver を使って OpenGL が HW(GPU) で動くようにする(GLX 拡張)
VagrantでSnapShotを撮る

Vagrantプラグインに`vagrant-vbox-snapshot`というものがある。
これを使うと簡単にスナップショットが撮れて便利なのでメモ。

スナップショットを使うと、その瞬間のVMの状態をまるごと記憶しておくことができる。

例えば、サーバに様々なミドルウェアをインストールして、ごちゃごちゃになってしまったとしても、
スナップショットを撮っておけば、インストール前の状態に戻すことができる。
ちょっと、手元でChefのレシピを流したいときなどに便利です。

### vagrant-vbox-snapshot のインストール

    vagrant plugin install vagrant-vbox-snapshot


### 使い方

- スナップショット一覧

        vagrant snapshot list

- スナップショットを撮る

        vagrant snapshot take [NAME]

- スナップショットへ戻る（ロールバック）

        vagrant snapshot go [NAME]

### 参考
- [[Vagrant] 仮想マシンのスナップショットとるならvagrant-vbox-snapshotが便利](http://blog.code-life.net/blog/2013/06/12/vagrant-vbox-snapshot/)

### おまけ
溜まってるドラフト記事を放出していきたい。。。
AntでForce.comのStatic Resourceファイルを作成する

Force.comで開発していく上で、Static Resourceファイルを作成するのは手動で行うには面倒です。

Static Resourceファイルはファイル拡張子だけ変更してアップロードしてしまう方法もありますが、そうしてしまうとどんどんファイル数が多くなってしまいので、ZIP圧縮でファイルを一つにまとめてしまったほうがすっきりします。

とはいえ、JavaScriptやCSSを変更するたびに手作業で　不要ファイルを除去→ZIP圧縮→ファイル名変更　するのはさすがに厳しいです。そこで、AntでStatic Resourceファイルを作成させてしまえばいいんじゃないか、というわけです。

# 前提とするファイル構成
ここでは下記のようなファイル構成となっているとします。

```
[プロジェクト]
 ├ build.properties
 ├ build.xml
 ├ [build](自動で作成する)
 ├ [resource]
 |  ├ [SampleResource]
 |  └ [...]
 └ [src]
    ├ [staticresources]
    └ [...]
```

# Antの呼び出し部分
以下のようにarchiveタスクにリソース名(SampelResource)を指定すると、src/staticresource/SampelResource.resourceを作成するようにAntマクロを作成してみました。中間ファイルとしてbuild以下にZIP圧縮前のファイルをコピーしています。

```xml
<target name="make">
  <archive resource="SampleResource" />
</target>
```

# Antマクロ
実際にStatic Resourceファイルを作成しているAntマクロは下記のようになっています。属性として指定されたリソース名に基づいて処理を実行します。一旦build以下にStatic Resourceに含めたいファイルのみコピーしてからZIP圧縮していますので、不要なファイルを開発組織にデプロイすることもなくなります。

```xml
<macrodef name="archive">
  <attribute name="resource" />
  <sequential>
    <echo message="compress: @{resource}" />
    <delete dir="${build.dir}/@{resource}" />
    <copy todir="${build.dir}/@{resource}" preservelastmodified="true">
      <fileset dir="${resource.dir}/@{resource}">
        <patternset>
          <include name="**/*.gif"/>
          <include name="**/*.png"/>
          <include name="**/*.js"/>
          <include name="**/*.css"/>
        </patternset>
      </fileset>
    </copy>
    <zip
      basedir="${build.dir}/@{resource}"
      destfile="${src.dir}/staticresources/@{resource}.resource"
    />
  </sequential>
</macrodef>
```

元ファイルは [こちら](https://gist.github.com/10573052) です。

# まとめ
これでStatic Resourceファイルを手軽に作成できるようになりました。
本格的にやるのであればGruntなどを使ってもいいところですが、インストールするものが多くなってしまうので、Antでちゃちゃっとやるのもいいと思います。

Enjoy Deploying!
UICollectionViewで非同期に画像を取得して表示


よくある、Cellに表示する画像を非同期でダウンロードするやつです。
ダウンロード中のくるくるも表示してみます。
セルの再利用を意識してなかったせいで結構ハマったのでメモ。

##カスタムセル作成

まずカスタムセルを作ります。

```objectivec:CustomCell.h

#import <UIKit/UIKit.h>

@interface CustomCell : UICollectionViewCell

@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *indicatorView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

```
CustomCell.xibで配置して接続しておきます。

##UICollectionView

```objectivec:ViewControler.m

#import "ViewController.h"
#import "CustomCell.h"

static NSString* const kCellIdentifier = @"cell";

@interface ViewController ()<UICollectionViewDataSource, UICollectionViewDelegate>

@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@property (nonatomic) NSCache* imageCache;
@property (nonatomic) NSOperationQueue* queue;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.collectionView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellWithReuseIdentifier:kCellIdentifier];
    self.imageCache = [[NSCache alloc] init];
    self.queue = [[NSOperationQueue alloc] init];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:kCellIdentifier forIndexPath:indexPath];
    
    cell.imageView.image = nil;
    [cell.indicatorView stopAnimating];
    
    UIImage* image = [self.imageCache objectForKey:indexPath];
    if (image) {
        cell.imageView.image = image;
    } else {
        [cell.indicatorView startAnimating];
        
        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"画像のURL"]];
        
        [NSURLConnection sendAsynchronousRequest:request queue:self.queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            CustomCell* aCell = (CustomCell *)[collectionView cellForItemAtIndexPath:indexPath];
            UIImage *aImage = [UIImage imageWithData:data];
            
            [aCell.indicatorView stopAnimating];
            [self.imageCache setObject:aImage forKey:indexPath];
            [collectionView reloadItemsAtIndexPaths:@[indexPath]];
        }];
    }
    
    return cell;
}

@end

```
collectionView:cellForItemAtIndexPath:デリゲートメソッドで、まずセルのimageView, indicatorViewを初期状態に戻します。
これを忘れてたので、画像の表示されるセルがおかしくなったりしてハマりました。。。

UITableView, UICollectionViewにはいつも悩まされます。
名前付きルーティングを使って、viewにパラメータ込みでリンクを作成

#名前付きルーティングを使って、viewにパラメータ込みでリンクを作成する方法

**fuel\app\config\routes.phpで名前付きルーティングを作成**
ルーティング名：link_test
パラメータ名：id
`'hello/linktest/:id' => array('hello/linktest', 'name' => 'link_test')`
  URL ⇒ array(コントローラ/アクション名, 'name' ⇒ ルーティング名)

**view側**
`echo Html::anchor(Router::get('link_test', array('id' => 4649)), 'テストへのリンク');`
第一引数：ルーティング名
第二引数：パラメータ

fuel/core/classes/router.phpにRouter::get()の詳細が書いてある。
AWS勉強メモ

##アカウント作成
AWSのサイトにアクセスしてアカウントを作成する。基本的に画面をみながら進めていけば特に困ることはない感じ。クレジットカードの登録と電話認証が必要になる。

https://aws.amazon.com/jp/

##基本的な用語
* EC2(Elastic Compute Cloud): 仮想サーバ
* RDS(RElational Database Service): データベース
* S3(Simple Storage Service): ストレージ

##仮想サーバの立ち上げ(EC2)
###リージョンの選択
ログイン後にメニューが表示されるのでその中にあるEC2をクリックする。ページが表示されたら画面右上のヘッダーメニューでリージョンを選択する。(Tokyoを選択)

###インスタンスの立ち上げ
インスタンスを立ち上げるためにLaunch Instanceボタンをクリックする。

###OSの選択
Amazon Linux AMIが便利とのこと。
Selectボタンで選択。

All instance typesからスペックを選択できる。
あとで変更可能なのでひとまずは一番低い「t1.micro」(Very Low)を選択しておく。

NEXT:Configure Instance Detailsボタンで次の設定にすすめる。
Review AND Launchボタンでレビュー画面までスキップできる。
※詳細設定には必須設定があり

作成したインスタンスの一覧はメニューのInstanceを選択すると確認できる。

###Instance Action
対象インスタンスを右クリックして選択できる。
* Terminate-インスタンスの停止。データも消えるので注意。
* Reboot-インスタンスの再起動。
* Stop-インスタンスの停止。
* Start-インスタンスの開始。

##データベースの立ち上げ(RDS)
EC2とは別に立ち上げ設定を行う。
立ち上げ後はEC2からアクセスしたりして使う。

##ストレージサービスの利用(S3)
Create BacketボタンからBacketを作成する。
Backetの名前はユニークになるようにする必要がある。
リージョンはTokyoを選択。
Createボタンで作成完了。

Uploadボタンからファイルをアップロードしたりできる。
アップロードしたファイルはURLを参照するだけでアクセスできる。

より便利に使うためにSDKが用意されているとのこと。
S3をつかってWebサイトを運用するといった使い方も可能とのこと。

##料金の確認
料金はアカウント→アカウントアクティビティから確認できる。
※日本語ページ
Ubuntu 14.04 LTSでPython 3.4のpyvenvが失敗する


Python3.4のvenvをつくろうとすると・・・

```bash
$ pyvenv-3.4 <directory>
Error: Command '['<directory>/bin/python3.4', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1
```

と、エラーがでてしまいます。

直接コマンドを実行すると以下のようなエラーになるので、`ensurepip`モジュールがない、と。

```bash
<directory>/bin/python3.4: No module named ensurepip
```

仕方がないので、`--without-pip`オプションを付けてvenvを作ってから、手動でpipをインストールして回避してます。

```
$ pyvenv-3.4 --without-pip <directory>
$ source <directory>/bin/activate

# setuptoolsのインストール
$ curl -O https://pypi.python.org/packages/source/s/setuptools/setuptools-3.4.4.tar.gz
$ tar xvfz setuptools-3.4.4.tar.gz
$ cd setuptools-3.4.4/
$ python setup.py install

# pipのインストール
$ curl -O https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz
$ tar xvfz pip-1.5.4.tar.gz
$ cd pip-1.5.4/
$ python setup.py install
```

venvの再構築はそんなに手間じゃないのでとりあえず上記で回避しつつ修正待ち。

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=732703
Java データ構造

Java のデータ構造で使いそうなものを自分なりにまとめたメモ。
標準ライブラリの他に、Guava 等もまとめの対象です。

## java.util.List
- 順序を持つ
- 重複要素を許可

### ArrayList
- 内部的には配列
- 挿入、削除はその要素以降の要素の再配置が行われるため遅い
- 追加やget(index)は速い

### LinkedList
- 数珠つなぎ構造
- get(index)は遅い
- 挿入、削除が速い

### org.apache.commons.collections4.list.TreeList
- 挿入、削除が速い
- 追加やget(index)も速いが、ArrayList には劣る
- 挿入・削除が多い場合は LinkedList より TreeList を選択したほうが大抵良いらしい。
- AVL tree で実装されている

## java.util.Set
- 重複要素を持たない
- 順序を保証しない

### HashSet
- 順序を保持しない

### TreeSet
- ソートされた順序を保持する。自然順序か指定された Comparator の昇順。
- Red-Black tree で実装されている

### LinkedHashSet
- 順序は挿入順

## java.util.Map
- key と value が対になった要素を持つ。
- key の重複は許可されない。
- 順序を保証しない

### HashMap
- 順序を保持しない

### TreeMap
- key がソートされた順序を保持する。自然順序か指定された Comparator の昇順。
- Red-Black tree で実装されている

### LinkedHashMap
- key の順序は挿入順。アクセス順にすることもできる。

## com.google.common.collect.BiMap
- value もユニークである Map
- BiMap#inverse で key と value を入れ替えることができる
- HashBiMap、EnumHashBiMap、EnumBiMap がある

## com.google.common.collect.Multiset (Bag)
- 重複を許可した Set のようなもの
- 重複要素の数をカウントするのに便利
- Bag と呼ばれるものと同じ。org.apache.commons.collections4.Bag など。
- Set のように扱えるが Set は継承していない
- HashMultiset、TreeMultiset、LinkedHashMultiset、EnumMultiset がある

## com.google.common.collect.Multimap
- key 重複を許可した Map のようなもの
- Map に似ているが key - value が1対多
- `Map<key, Collection<value>>` の扱いやすい版
- Map は継承していない
- ListMultimap系、SetMultimap系 などがある

## com.google.common.collect.Table
- `Table<row, column, value>` というテーブル構造
- key が2次元になった Map のようなもの
- `Map<key1, Map<key2, value>>` の扱いやすい版
- ArrayTable、HashBasedTable、TreeBasedTable がある

## stack
- 先入れ後出し(First-In Last-Out, FILO)のデータ構造
- java.util.Stack や、java.util. Deque の様々な実装を stack として使用できる

## queue
- 先入れ先出し (First-In First-Out, FIFO)のデータ構造
- PriorityQueue, BlockingQueue など、java.util.Queue の様々な派生がある
colorscheme にマッチした highlight 設定を追加する

本記事は [Vim Advent Calendar 2013](http://atnd.org/events/45072) の 137 日目です。
136 日目は @manga_osyo さんの[Vim script で関数のデフォルト引数を設定したい](http://d.hatena.ne.jp/osyo-manga/20140415/1397571244)でした。

highlight を追加したい場面
==========================

Vim で日本語を扱う上で便利な設定、例えば IM が有効になっている場合にカーソルの色を変えたり、全角スペースを表示させたりするような設定はおよそ highlight 設定を用いてなされる場合が多いです。

```vim
  augroup UsingJapanese
    au!
    autocmd ColorScheme * highlight CursorIM guibg=Purple guifg=NONE
    autocmd VimEnter,ColorScheme * highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen
    autocmd VimEnter,WinEnter * match IdeographicSpace /　/
  augroup END
```

highlight 設定なので colorscheme を変更した際に削除されないよう `autocmd ColorScheme` 設定で行いますが、変更する色は固定なのでどの colorscheme でも同じ色にしか設定できません。

解決策
======

既に定義されている highlight 定義と link して設定します。

まず `:hi` して既存の定義一覧を確認して、よさ気な色を探します。
見つけたら、`highlight def link` します。

```vim
  augroup UsingJapanese
    au!
    autocmd ColorScheme * highlight def link CursorIM Search
    autocmd VimEnter,ColorScheme * highlight def link IdeographicSpace Visual
    autocmd VimEnter,WinEnter * match IdeographicSpace /　/
  augroup END

```

例では CursorIM を Search (検索ワードのハイライト色) に、全角スペース定義 IdeographicSpace を Visual (Visual モード選択時の色) にリンクさせています。IM のほうはともかく、全角スペースはわりとそれっぽくなります。

そもそも全角スペースを表示するプラギンねーの？
=============================================

[という話題になった](http://lingr.com/room/vim/archives/2014/03/29#message-18683394)ので、やってみました。

https://github.com/0xBADDCAFE/vim-highlightIdeographicSpace

というより、ほぼ以下の記事のままです。

http://vim-users.jp/2009/07/hack40/

ドキュメントもない。すいません。

はい
====

以上 Vim Advent Calendar 2013 137 日目の記事でした、次回 138 日目は @manga_osyo さんの[neobundle.vim でリポジトリ内の任意のディレクトリをプラグインとして読み込む](http://d.hatena.ne.jp/osyo-manga/20140418/1397747117)でした。