OmniAICreator/Qiita-1.07M huggingface dataset:
fluentdのカスタムParser Pluginを作ってみる

# なぜParser Pluginが必要なのか。
独自フォーマットのログをパースするときに、デフォルトのin_tail pluginの正規表現では対応が難しい場合ががあります。
例えば、下記のログが挙げられます。
このログは、Key=Valueが順不同で発生したり、そもそも発生してたりしていなかったりしてます。
さらに要求として、keyをカラム名にValueを値という形で使いたい場合にはどうすればよいでしょうか。

```
[2013-01-01 00:00:00] key1=value1&key2=value2
[2013-01-01 00:00:00] key2=value2&key1=value1&key3=value3
```

このような場合では、fluentdのParser Pluginを作るとで対応することができます。
その他の案として、[Tailインプットプラグインパーサーをカスタマイズする](http://docs.fluentd.org/ja/articles/plugin-development#tail)こともできますが、
こちらの方法だとread_from_headerなどの最近追加されたオプションが使えません。
オプションが追加されたNewTailInput pluginを同様の方法で作成する方法もありますが、
少々NewTailInputが複雑そうなので今回はやめておきます。
それぞれの方法のサンプルとなるpluginを挙げます。

- parser plugin
    - [fluent-plugin-grok-parser
](https://github.com/kiyoto/fluent-plugin-grok-parser/blob/master/lib/fluent/plugin/parser_grok.rb)
    - [fluent-plugin-multi-format-parser
](https://github.com/repeatedly/fluent-plugin-multi-format-parser/blob/master/lib/fluent/plugin/parser_multi_format.rb)
- TailInput
    - [Tailインプットプラグインパーサーをカスタマイズする](http://docs.fluentd.org/ja/articles/plugin-development#tail)
- NewTailInput
    - [fluent-plugin-nata2](https://github.com/studio3104/fluent-plugin-nata2/blob/master/lib/fluent/plugin/in_mysqlslowquery_ex.rb)

# Parser Pluginを作る

それでは、Parser Pluginを作ります。
サンプルは下記です。

```
# filename: parser_test_format.rb
require 'fluent/parser'

module Fluent
  class TextParser
    class TestFormatParser # TestFormatParserを任意変更
      include Configurable

      def initialize
        super
      end
      def configure(conf)
        super
        @time_format = conf['time_format'] || '%Y-%m-%d %H:%M:%S'
      end
      def call(text)
        # begin: 1レコードを編集処理
        elements = /^\[(.+)\] (.+)$/.match(text)

        time = elements[1]
        time = Time.strptime(time, @time_format).to_i

        # key1=value1&key2=value2&... -> [key1=value1, key2=value2, ...]
        messages = elements[2].split('&')

        # [k1, v1, k2, v2, ...] -> {k1=>v1, k2=>v2, ...}
        record = {}
        messages.each do |message|
          kv = message.split('=') 
          while (k = kv.shift) && (v = kv.shift)
            record[k] = v
          end
        end
        # end

        if time && record
          if block_given?
            yield time, record
            return
          else
            return time, record
          end
        end
      rescue # ignore parser error
      end
    end

    # test_formatとTestFormatParserを任意変更
    register_template('test_format', Proc.new { TestFormatParser.new })
  end
end
```

# Parser Pluginを使う

設定ファイルは下記の通りに記載します。
Gem化していない場合は、td-agentの場合には、/etc/fluent/pluginフォルダ以下に格納します。
あとは通常通りにfluentdを起動すれば大丈夫です。
NewTailInputを使うことができるので、read_from_head等のオプションも利用できます。

```
<source>
  type tail
  tag test.parser
  format test_format # registerで指定した名前
  path /var/log/test/test.log
  pos_file /var/log/td-agent/test.pos
  read_from_head true
</source>
```

# まとめ
ログは、ログをパースすることも考えて、プログラミングでインプットが容易なログのフォーマットで保存するようにしましょう。
ログサイズは大きくなりますが、LTSV形式とかをおすすめしておきます。
ストレージを気にする時代でもないので、1レコードのサイズが大きくなっても問題ないでしょう。
viをほとんど使ったことない人のvimコマンド備忘録


#viの扱い方

少しvi触ったことがある程度の人が書いてます。（普段はsublimeText使用）
後、Macユーザーです。
ssh状などコンソールで作業する機会があったので、viの勉強がてら使いました。
ここに書いてあるコマンドである程度は編集できると思います。
最後にviで編集しようとする際に使えると便利なvi以外のコマンドも少し書きます。


基本的に ESC でノーマルモードに移行してから書くコマンドを入力する流れです。

## モード変更

基本的に少し編集するぐらいなら
最初はノーマルモード、インサートモードだけでいけそう

```
ESC　ノーマルモード
i　　インサートモード（書き込み）
v　　ビジュアルモード（範囲選択）
V　　行単位のビジュアルモード
```


## 編集

```
:w  保存
:q  終了
:wq 保存終了
:q! 強制終了

u　　   　　 戻る
ctrl + r　　進む

h　　左に移動
j　　下に移動
k　　上に移動
l　　右に移動
（方向キーでもいけます。なれるとこっちの方が手が動かなくていいみたい）

gg  ファイルの先頭に移動
G   ファイルの最後に移動
0　　行の先頭に移動
$　　行の最後に移動
dd  行削除
yy  コピー（ヤンクというらしい）
p　　ペースト
m　　マーク
```

### マークを使った部分コピペ
1.コピーしたい部分の先頭で

```
mm（mというマークを付ける）
```

2.コピーしたい部分の最後にカーソルを移動させて

```
y`m（マークまでをコピー）
```

3.そのままペースト

```
p
```

### 複数ファイルを同時編集

ウィンドウを分割

```
:vs (縦に分割）
:sp（横に分割）
```

ウィンドウ間の移動

```
ctrl + w は同時押しで
その後の移動コマンドは同時押しじゃなくて大丈夫なようです

ctrl + w  h　左のウィンドウに移動
ctrl + w  j　下のウィンドウに移動
ctrl + w  k　上のウィンドウに移動
ctrl + w  l　右のウィンドウに移動

いっぱい分割できるよ！！！
何かのファイルを参考にしながら編集するときにめちゃくちゃ便利
ウィンドウ間のコピペも上のやつでいけます
```

ファイルを開く（カーソルのいるウィンドウで開かれる）

```
:e ファイル名
```


## 検索

```
:/　　下検索
:?  　上検索
:n 　 次の検索結果
:N  　逆方向の次の検索結果
:noh  検索結果のハイライトを消す
:ls　　ファイル一覧表示（vi上でも使えるみたい）
```


## viではないよ

```
ag キーワード
でキーワードが含まれたファイルを検索できる。
大量にファイルがある場合やある程度ファイル名に目星が付いている場合は
grep キーワード
も使って絞込した方が目的のものが見つけやすい

例： ag hello | grep .txt
hello というキーワードが含まれている.txtファイルの検索

※agコマンドは初期では入っていないのでHomebrewでインストール
brew install ag

```
【jQuery】IEでフォーカスが外れるまでをイベントにしてしまう時の対応法


IEで`change`を使用したときに、要素からフォーカスが外れるまで、処理が完了しない時があります。
これは、IEがフォーカスが外れるまでをイベントとしてしまっているかららしく、とても困りました。
※IE8でこの現象が起きました。

以下のように、`blur`を使うことで解決することが出来ます。

```jquery.js
$(function(){
	$(.select).change(function(){
		$(this).toggleClass("checked");
		$(this).blur();
	});
});
```
 command


```
alt + shift + k
```

##Fish shell
http://fishshell.com/

Make fish default shell

```
echo /usr/local/bin/fish >>/etc/shells
```

```
chsh -s /usr/local/bin/fish
```


##Force empty Trash
```bash
sudo rm -rf ~/.Trash/*
```

##Clear Cache
```bash
open $TMPDIR../C/
```

##Screen resolution
```bash
system_profiler SPDisplaysDataType | grep Resolution
```

##Disable Reportcrash
```bash
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
```

```bash
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.DiagnosticReportCleanUp.plist
```

##Dropbox : Get Multiple Account Support

```bash
HOME=$HOME/Dropbox-Second /Applications/Dropbox.app/Contents/MacOS/Dropbox &
```


##TCP port on Mac OS X
```bash
sudo lsof -i -n -P | grep TCP
```

###Default Shell
```
cat /etc/shells 
```

```
chsh -s /usr/local/bin/zsh
```

##Auto start

```
cp /usr/local/Cellar/php56/5.6.11_2/homebrew.mxcl.php56.plist ~/Library/LaunchAgents/
```
```
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
```

######Check sure PHP-FPM is listening on port 9000:
```
lsof -Pni4 | grep LISTEN | grep php
```
Swiftプロジェクトに入る前に読んだことまとめ


半日くらいswift勉強したのとgithubとかのライブラリも調べてみた。Qiitaにいろいろまとめが多くて理解の助けになった！！

### 公式ドキュメント
* https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_449

* 下のQiitaの記事でも保管できるけど、``Automatic Reference Counting``と``Optional Chaining``は読まないとすべてのコードに関係するから必要
* EnumerationsやPropertiesやSubscriptsは、新しく覚える必要あるけど理解というよりそういうmethodがあるんだと感じ
* ExtensionsとProtocolsとGenericsは、これからswiftでうまくコードを書く上で必要そう

### 読んでおくべきQiitaの記事

* Optional(!や?について)
    * Optional型についてのまとめ http://qiita.com/cotrpepe/items/e30c7442733b93adf46a
    * ↑ サンプルも充実しているし、分かりやすかった
    * 
SwiftのoptionalとObjective Cのnilの違い http://qiita.com/tomohisaota/items/b50ebb788cf2706e7e25
    * ↑ !演算子よりも、このoptional bindingを使うべき。詳しく書いてある
* ARC
    * Swiftのクロージャと循環参照について http://qiita.com/satoshia/items/9e855a56a36be8cbb2dd
    * ↑ クロージャでselfを呼び出すと循環参照する。その対策。
* Arrayの扱い方
    * SwiftのArrayが実はすばらしかった http://qiita.com/koher/items/47f444200d4e02b6414e
    * ↑ Arrayが値型かつCopy-on-write

* 関数の引数について
    * 
Swiftの関数の引数は、常に一つ http://qiita.com/dankogai/items/46fedc447dd93d1e0fbc
    * ↑ swiftの関数の引数は常にtupleということ

### beta版の経緯
* Xcode 6 Beta 5 における変更点 http://qiita.com/dankogai/items/39ba636dae3cfe097fbc
* Xcode6 Beta5にアップデートしたらたくさんコンパイルエラーになった http://qiita.com/susieyy/items/d3013fd04bcb21cd5227
* Xcode6 Beta4 でアクセス修飾子がきた！ http://qiita.com/susieyy/items/1eddfe26b248c741b902
* Xcode6とSwift&iOS8のアプリ開発で踏んだ地雷たち http://qiita.com/susieyy/items/019d5bc69f0921250437

### github動向
* https://github.com/trending?l=swift&since=monthly
* matttさんのHTTP networking library https://github.com/Alamofire/Alamofire
* iOS8の機能について説明しているブログプロジェクト https://github.com/ShinobiControls/iOS8-day-by-day
* swiftのdesignパターン https://github.com/ochococo/Design-Patterns-In-Swift
* Hacker News reader https://github.com/Dimillian/SwiftHN
    * extension todayも実装されている
* ラベルエフェクトライブラリ https://github.com/lexrus/LTMorphingLabel
* swift custom operator https://github.com/mattt/Euler
* test framework https://github.com/Quick/Quick
* A set of Swift extensions https://github.com/pNre/ExSwift

### stackoverflow
* SwiftはC++なみに``-Ofast``をつけると速い http://stackoverflow.com/questions/24101718/swift-performance-sorting-arrays
* singleton http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift


### その他
* SwiftでJavaScript http://qiita.com/dankogai/items/052a3ad6f32d114a33fc
* Swiftで面倒なJSONの取り扱いをさらに10倍便利にするclass JSON http://qiita.com/dankogai/items/e3d9882f4d25bc44cc03susieyy/items/749c4ac5d82d765c12c6
AngularJSでURL末尾の"/"スラッシュを削除

app.config内で

```lang:js
$urlRouterProvider.rule(function ($injector, $location) {
        var path = $location.url()
        // check to see if the path has a trailing slash
        if ('/' === path[path.length - 1]) return path.replace(/\/$/, '')
        if (path.indexOf('/?') > 0) return path.replace('/?', '?')
        return false;
      })
});
```
vagrantで作ったローカル環境(centOS)にnginxを導入してみた

前提条件
　vagrantをインストール済み
　自分の作業ディレクトリへ移動済み

# vagrant環境構築

・Vagrantfileファイル作成
<pre>vagrant init</pre>

・Vagrantfile編集

<pre>vi Vagrantfile</pre>
<pre>config.vm.box = "base"
↓上記を下記の様に変更(vagrant box listで表示される中にあるもの)
config.vm.box = "centos6.5-64"

# config.vm.network :private_network, ip: "192.168.33.10"
↓上記を下記の様に変更
config.vm.network :private_network, ip: "192.168.33.15</pre>

vagrant up

vagrant ssh

・ipアドレスの確認
<pre>
ifconfig

inet addr:192.168.33.15

exit;
</pre>

# nginxの導入

・nginxインストール
<pre>vagrant ssh
sudo su - 
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx
/etc/init.d/nginx start</pre>

・webブラウザで確認
<pre>http://192.168.33.15/
※「Welcome to nginx」 が表示されるはず</pre>

# おまけ

・DocumentRootの変更
<pre># /etc/nginx/conf.d/default.confを編集。
vi /etc/nginx/conf.d/default.conf
"/usr/share/nginx/html"
↓上記を下記の様に変更
"/var/www/html"
var配下が存在しないので、自分で作る
cd /var
mkdir www
cd www
mkdir html
cd html
vi index.html

/etc/init.d/nginx restart</pre>

 ・webブラウザで確認
<pre>http://192.168.33.15/
index.htmlの内容が表示される。</pre>

# さらにおまけってか、メモ

・自動起動の設定の参考サイト
<pre>http://qiita.com/kkyouhei/items/c313953c6a027bab5855</pre>

・ログ情報
<pre>/var/log/nginx
access.log
error.log</pre>

・起動と停止
<pre>/etc/init.d/nginx start
/etc/init.d/nginx stop</pre>

参考サイト
・vagrant
http://www.absolute-keitarou.net/blog/?p=579#IP

・nginx
http://tejunsho.com/nginx/20140207000183.html
Eclipseからサーバへソースをアップロードする方法


ヘルプ->Eclipseマーケットプレースを選択し、”リモート・システム・エクスプローラー”をインストールする。

Eclipseを再起動した後、ウィンドウ->ビューの表示->リモート・システム->リモート・システムをクリックする。

リモートシステムビューが表示されるので、”リモート・システムの接続を定義”のアイコンをクリックする。

![スクリーンショット 2014-08-14 16.25.58.png](https://qiita-image-store.s3.amazonaws.com/0/1152/8e8b4b20-9842-4305-ea62-3165d2211333.png "スクリーンショット 2014-08-14 16.25.58.png")

今回はサーバごとごっそり定義する。

・”SSH接続”を選択
・ホスト名、接続名は接続したいホストを入力する。

![スクリーンショット 2014-08-14 16.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/1152/cad97cf9-bbe8-2d9a-7658-502c82c22fc3.png "スクリーンショット 2014-08-14 16.30.27.png")

・”ssh.files”を選択

![スクリーンショット 2014-08-14 16.53.00.png](https://qiita-image-store.s3.amazonaws.com/0/1152/f6a9b7ce-f601-ebcc-4b5c-80fd31a746ff.png "スクリーンショット 2014-08-14 16.53.00.png")



接続したいホストを選ぶと、ユーザ、パスワードを求められるので入力する。

![スクリーンショット 2014-08-14 16.55.08.png](https://qiita-image-store.s3.amazonaws.com/0/1152/be6184c7-ebb2-fbc0-74fe-374f127e7e4a.png "スクリーンショット 2014-08-14 16.55.08.png")


これでドラッグ＆ドロップでアップロードできるようになる。
Noto Sans JapaneseのThin-Windowsって？

Noto Sans JapaneseとSource Han Sans JPのどっちを使おうかなと思いながら両方ダウンロードしてみた。

全体的な比較はこの辺とか： [フォント - Noto Sans Japaneseと源ノ角ゴシック (Source Han Sans JP)の違い - Qiita](http://qiita.com/shimoju/items/94a17e0d58e82384ce50)

![archive-diff.png](https://qiita-image-store.s3.amazonaws.com/0/25051/babddb8b-43fe-958a-1a9b-f1fe7cb8857f.png)

各ウェイトの名前が違うのはともかく、`Thin-Windows`って何？

## Google

[9435c66c9bff - noto - Fonts that support all languages/characters in Unicode - Google Project Hosting](https://code.google.com/p/noto/source/detail?spec=svn67a00274deb39645f41bc1b0ea6044a195308ed2&r=9435c66c9bffc73f76c46c7638c5abff5609c41e)

> Add Windows-specific versions of Noto CJK Thin fonts.
>
> This is to work around a but in Windows that automatically applies fake bolding to fonts with a usWeight lower than 250. See for example http://typophile.com/node/103397.

Thin(ExtraLight)のウェイトは100なので、Windows版にウェイトを変更したものを用意したと。

```py:nototools/fix_noto_cjk_thin.py
    assert font['OS/2'].usWeightClass == 100
    font['OS/2'].usWeightClass = 250
```

フォント名・ウェイト名はThinのままなので、OSの違いで問題になることはなさそう。

## Adobe

[Source Han Sans JP側のGithub](https://github.com/adobe-fonts/source-han-sans/issues)にはこれに関するIssueは上がっていないものの、Adobeの開発者向けページにこの問題に関する記述は発見。

[Setting font weights for Windows | Adobe Developer Connection](http://www.adobe.com/devnet/opentype/afdko/topic_font_wt_win.html)

> The applications which have problems all appear to exhibit the same problems with the same fonts. Some examples of common problem applications include PageMaker 6.5.x, Word 97, and Word 2000.

今はもう気にしなくていいのか、更新されていないだけなのか・・・。
モジュールの削除(設定ごと)する場合

Raspberry Pi のOSである Raspbian に,
とあるモジュールをインストール。
設定のconfigが出てきて、設定を間違えた私。

慌ててとった行動は、ターミナルから
rm -rf XXXXXXX
設定が残ってしまいました。。。

この場合、reinstall コマンドでは
「最新バージョンです」
となり、ディレクトリだけ元に戻すことはできません；；
(恥ずかしい記事でごめんなさい)

そこで私が涙目で調べ、たどりついたコマンドが以下です

aptitude purge パッケージ名

これ実行後、設定も削除してくれるコマンドです。
aptitude は、パッケージマネージャの操作をしてくれます。
http://www.garunimo.com/program/linux/aptitude.xhtml

その後、apt-get install で無事設定からやり直すことができました。てへぺろ。
ゲッタでnil判定してインスタンス変数を作成する際のはまりどころ

ここ半年くらい、コードでサブビューをインスタンス変数として持つUIViewControllerを作成するときに、readonlyのプロパティでゲッタを定義してnilのときのみ作成するということをやっていました。
コードはこんな感じです

```objc
// interface
@property (nonatomic, readonly) UIView *subview;

// implementation
@synthesize subview = _subview;

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addSubview:self.subview];	
}

- (UIView *)subview {
	if (_subview == nil) { // <- (2)

		CGRect frame = self.view.bounds; // <- (1)
		_subview = [[UIView alloc] initWithFrame:frame];
	}
	return _subview;
}
```

この書き方のメリットは、subviewが必要なときに作成されるのでnilが返ることを心配しなくてよいというところです。
しかし、-subviewがviewDidLoadの前（self.view == nilのとき）に呼び出されるとどうなるのか…？

(い) まず(1)の部分でself.viewを呼び出しているのでself.viewが作成されviewDidLoadが呼ばれます。

(ろ) 次に、viewDidLoadが呼ばれますが、このときはまだ _subview == nil なので(2)の条件式を通り_subviewにビュー(A)が代入され、viewDidLoadに戻ってビュー(A)がself.viewにaddされます。

(は) ここで(い)のとき呼び出されていた-subviewに戻ってきて、ビュー(A)が入っている_subviewにビュー(B)が代入されます。

この条件だとself.viewにaddされているビューインスタンスとself.subviewに入っているのが別人になります。
CoffeeScriptでサブクラスを判定

`SubClass.prototype instanceof SuperClass` で判定します。

検証コード：

```
assert = require 'assert'

Foo = class
Bar = class extends Foo
Baz = class extends Bar
Hoge = class

assert(Bar.prototype instanceof Foo)
assert(Baz.prototype instanceof Bar)
assert(Baz.prototype instanceof Foo)
assert(Foo.prototype instanceof Foo is false)
assert(Hoge.prototype instanceof Foo is false)

assert(Foo.prototype instanceof Object)
assert(Foo.prototype instanceof Array is false)
```

なお、これは Node.js の `util.inherits` で作成したサブクラスの判別方法と同じです。
Goソースをgrep → pecoで選択 → vimで該当行番号にジャンプした状態で開くワンライナー

## こんな感じ
※コメント行も含めたければ途中の`| grep -v "[0-9]:\s*//"`を省略する

```bash:oneliner
% vi $(grep -n <STRING> **/*.go | grep -v "[0-9]:\s*//" | peco | awk -F ":" '{print "-c "$2" "$1}')
```

自分は`zshrc`に↓こういう関数用意して、`vig <STRING>`って使い方してる

```bash:.zshrc
function vig {
    STR="$1"
    vi $(grep -n ${STR} **/*.go | grep -v "[0-9]:\s*//" | peco | awk -F ":" '{print "-c "$2" "$1}')
}
```

## 動作確認環境
grepのバージョンは下記2つで試した。

```
% grep --version
GNU grep 2.5.3

Copyright (C) 1988, 1992-2002, 2004, 2005  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
```
% grep --version
grep (BSD grep) 2.5.1-FreeBSD
```
tmuxで"protocol version mismatch"と言われてもattachする方法

tmuxのバージョンアップ後"protocol version mismatch"と言われて既存セッションにattachできないことがある。

```shell-session
$ tmux at
protocol version mismatch (client 8, server 7)
```

tmuxのプロセスidを調べて`/proc/${pid}/exe`と呼び出すことでバージョンアップ前のtmuxを実行しattachすることができる。

```shell-session
$ pgrep tmux
12345
$ /proc/12345/exe at
```
Eclipse4.4(Luna)でCDTが動作しない


Eclipse4.4(Luna)でCプロジェクトを作成しようとすると

```
選択状態したウィザードは開始できませんでした。
プラグイン org.eclipse.cdt.ui はクラス org.eclipse.cdt.ui.wizards.CProjectWizard をロードできませんでした。
バンドル org.eclipse.cdt.ui (489) を自動的に有効化している間にエラーが発生しました。
```

というエラーが発生した。
Eclipseの環境設定でCを選択しようとしても同様のエラーが発生する。

調べてみるとpleiadesで日本語化しているとCDT周りで問題が発生するとのこと。

eclipse.iniに下記のオプションを追加することで回避することができるそうなので、いったんこれで回避する。

```eclipse.ini
-Xverify:none
```

無事、Eclipseの起動、日本語化、Cプロジェクトの作成も行うことができた。
UITextViewでカーソルを右端に持ってくる方法

UITextViewにはselectedRangeというプロパティがあり、NSRange型で選択範囲を指定できます。NSRangeのメンバー変数にはlengthとpositionがあって、そのlengthを0にするとpositionによってカーソルの位置を指定することができます。しかし、長文が見た目上で改行されている場合、その行の右端にカーソルを持ってこようとしてposition指定しても、次の行の先頭にカーソルが来てしまいます。これを回避してカーソルを右端に表示する方法を発見しましたので開示します。
以下ではtextViewにUITextViewのインスタンスが格納されているとします。

```objc:Objective-C
UITextRange *cur = textView.selectedTextRange;
CGRect endRect = [textView caretRectForPosition:cur.end];
UITextPosition *pos = [textView closestPositionToPoint:CGPointMake(100000, endRect.origin.y + endRect.size.height / 2)];
textView.selectedTextRange = [textView textRangeFromPosition:pos toPosition:pos];
```
素人のdocker実習(1)

# dockerの学習
お盆休みを利用してのdockerの学習を思い立ちました。
ありきたりですが、覚え書きとして書き残しておきます。

## インストールするサーバ
サーバは既存のさくらVPS(1G)。Ubuntu Server 14.04LTS(64)です。

他の勉強やテストには使っていますが、実用のサービスを動かしてはいませんので、まあ好きに使えます。

## dockerのインストール
[いまさら聞けないDocker入門(2)](http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html)
の手順にしたがってインストールして見ました。
本当に今さらですみません。

>sudo apt-get update
>sudo apt-get install docker.io

ubuntu/debianではdockerという別パッケージがあるので、docker.ioというパッケージ名にしてあるそうです。
## シンボリックリンクを張る
上記理由によりいちいちdocker.ioと打たねばラならないのですが、めんどうなのでシンボリックリンクを張ります。
>$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

## userをdockerグループに入れる
dockerはroot権限がいるそうなので、いちいちsudoするわけですが、それも面倒なので、dockerグループに普段使っているユーザ名を登録します。

>$ sudo gpasswd -a ubuntu docker
をして再ログイン。

## バージョン確認
 ここまでやってdocker versionを見ましたら0.9.なんぼということでちょっと古い。
せっかくversion 1.0になったという話なのでアップデートしたいですがパッケージがどうにもで、いろいろ調べたらubuntuの場合は以下の純正手順でインストールすれば最新のバイナリが入るようです。

なんだ、やりなおしかｗｗ
ついに1.0がリリース！とか煽る記事のとおりにやったら0.9が入るってそりゃないよｗ

## 再インストール

[Ubuntu docker documentation](http://docs.docker.com/installation/ubuntulinux/#ubuntu-trusty-1404-lts-64-bit)
を見ながらインストール。
lxc-dockerというパッケージをインストールすればいいらしいです。
>$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

でリポジトリを追加して、lxc-dockerのパッケージを追加します。

>$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
>$ sudo apt-get update
>$ sudo apt-get install lxc-docker

再インストールしたので、
>$ sudo gpasswd -a ubuntu docker

をもう一回実行しておきます。

sudo docker versionすると、
>Client version: 1.1.2
>Client API version: 1.13
>Go version (client): go1.2.1
>Git commit (client): d84a070
>Server version: 1.1.2
>Server API version: 1.13
>Go version (server): go1.2.1
>Git commit (server): d84a070

ということで最新のようです。
## 起動テスト
ドキュメントでは
>$ sudo docker run -i -t ubuntu /bin/bash

を実行してみるとbashのみのコンテナが動くので、これで動作チェックしとけというようなことが書いてあります。
起動してみるとイメージをダウンロードしてbashを起動してくれます。
>root@534fba960fd7:/# 

やや、２回目以降は一瞬でbashのプロンプトが出る。
lsしてみると
>root@534fba960fd7:/# ls
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr

ちゃんと動いてるみたい。
ハイパーバイザ型の仮想化とは全然違うレスポンスです。これは楽しみだなあ。

試しに
>$ sudo docker run -i -t centos /bin/bash

としてみたら、ちゃんとcentosが起動しました。

とりあえずサーバはここまで。
次はdocker imageを書いて動かす段取りに。
MySQLでインデックスが貼られているかを確認するSQL

MySQL で index が貼られているか SQL を使って確認します。

# indexを確認

```mysql:indexを確認するコマンド
show index from テーブル名;
```
例えば log という名前のテーブルの index を確認する場合です。

```mysql:indexを確認する例
show index from log;
```

log テーブルに貼られている index が表示されます。

# おまけ
indexを追加したり削除する場合です。
http://qiita.com/pugiemonn/items/8a6b322654aa65e2966b
$array["inf"] など

# Perl 5.8

```perl
$ perl -Mwarnings -MConfig -e '@ARRAY = (1, 2, 3); printf "%vd\t%s\t%s\t%s\t%s\t%s\n", $^V, $Config{archname}, $ARRAY["inf"] || "false", $ARRAY["-inf"] || "false", $ARRAY["nan"] || "false", $ARRAY["string"] || "false"'
Argument "string" isn't numeric in array element at -e line 1.
5.8.9   x86_64-linux-thread-multi       3       1       1       1
```

# Perl 5.14

```perl
$ perl -Mwarnings -MConfig -e '@ARRAY = (1, 2, 3); printf "%vd\t%s\t%s\t%s\t%s\t%s\n", $^V, $Config{archname}, $ARRAY["inf"] || "false", $ARRAY["-inf"] || "false", $ARRAY["nan"] || "false", $ARRAY["string"] || "false"'
Argument "string" isn't numeric in array element at -e line 1.
5.14.2  x86_64-linux-gnu-thread-multi   3       1       1       1
```

# Perl 5.18

```perl
$ perl -Mwarnings -MConfig -e '@ARRAY = (1, 2, 3); printf "%vd\t%s\t%s\t%s\t%s\t%s\n", $^V, $Config{archname
}, $ARRAY["inf"] || "false", $ARRAY["-inf"] || "false", $ARRAY["nan"] || "false", $ARRAY["string"] || "false"'
Argument "string" isn't numeric in array element at -e line 1.
5.18.2  x86_64-linux-thread-multi       3       1       1       1
```

# Perl 5.20

```perl
$ perl -Mwarnings -MConfig -e '@ARRAY = (1, 2, 3); printf "%vd\t%s\t%s\t%s\t%s\t%s\n", $^V, $Config{archname}, $ARRAY["inf"] || "false", $ARRAY["-inf"] || "false", $ARRAY["nan"] || "false", $ARRAY["string"] || "false"'
Argument "string" isn't numeric in array element at -e line 1.
5.20.0  x86_64-linux-thread-multi       3       false   1       1
```

http://search.cpan.org/dist/perl-5.20.0/pod/perldelta.pod#Better_64-bit_support で動作が変わったのですかね。
Raspberry Pi Model B+セットアップ


# Raspberry Pi Model B+セットアップ

- [Raspberry Pi Model B+](http://www.amazon.co.jp/Raspberry-Pi-Model-B-Plus/dp/B00LT4BOK6/)の初期設定メモ
- パスを適宜変更してもらえれば動くと思います

![RasPiB+.JPG](https://qiita-image-store.s3.amazonaws.com/0/16986/0b58ccd8-0007-52cb-e2ab-7d26ef7d5766.jpeg "RasPiB+.JPG")



## セットアップ環境
- OS: Mac OSX (10.9.4)
- SD: Transcend MicroSD (32GB)
- ネットワーク: 有線LAN
- 周辺機器: キーボード・マウスなし

## OSインストール
- [Raspbianの最新版](http://www.raspberrypi.org/downloads/)をDL 
- 現時点（2014/8/14）の最新版は以下の通り
 - 2014-06-20-wheezy-raspbian.zip
 - Raspbian
 - Debian Wheezy
 - Version: June 2014
 - Release date: 2014-06-20
- MacにMicroSDを挿して、マウント先を確認

```shell-session:OSXターミナル
$ df -h
```

- 自分の場合は/dev/disk1s1だった。アンマウントする。

```shell-session:OSXターミナル
$ sudo diskutil unmountDisk /dev/disk1s1
```

- DLしたRaspbianをunzipしてimgファイルを生成、MicroSDにimgファイルを書き込み。30分くらいかかった。

```shell-session:OSXターミナル
$ sudo dd if=2014-06-20-wheezy-raspbian.img of=/dev/disk1 bs=4m
```


## 初期設定
- MicroSD、LANケーブル、電源ケーブルを挿してRasPiを起動
- ルータのDHCPクライアントリストを見てIPアドレスを確認 (自分の場合は192.168.1.3)、該当アドレスにSSHで接続

```shell-session:OSXターミナル
ssh pi@192.168.1.3
pi@192.168.1.3's password: raspberry
```

- RasPiにVNCサーバを設置

```shell-session:RaspberryPi
$ sudo apt-get install tightvncserver
$ vncserver :1 -geometry 1280×800
```

- Finder上でcommand+Kして、サーバ接続を立ち上げ。上記IPにVNC接続する。

```shell-session:OSXサーバ接続
$ vnc://pi@192.168.1.3:5901
```

![RasPi_VNC.png](https://qiita-image-store.s3.amazonaws.com/0/16986/04767165-6fba-7844-a33c-0d58f3853210.png "RasPi_VNC.png")


## 参考にしたサイト

- [Raspberry Pi + OpenRTM-aist 活用事例 >> Raspberry Pi の初期設定 ](http://openrtm.org/openrtm/ja/node/266)

- [Raspberry PiをUSBキーボードもディスプレイも使わずにセットアップする方法](http://blog.nambo.jp/2013/07/23/raspberrypi-mac-osx/)
NginxとLibreSSLを組み合わせて使用する

### 環境
**OS** - CentOS7
**Nginx** - nginx-1.7.9
**Libressl** - libressl-2.1.3

##1. ソース

```lang:ls
# ls -l nginx-1.7.9.tar.gz libressl-2.1.3.tar.gz
-rw-r--r-- 1 root root 2847182 Jan 22 09:38 libressl-2.1.3.tar.gz
-rw-r--r-- 1 root root  827263 Dec 24 00:38 nginx-1.7.9.tar.gz
```

##2. libressl の make

```lang:make
# LVERSION=2.1.3
# tar xzf libressl-${LVERSION}.tar.gz && cd libressl-${LVERSION}
# ./configure
# make
```

##3. nginx の make

```lang:make
# cd ..
# NVERSION=1.7.9
# tar xzf nginx-${NVERSION}.tar.gz && cd nginx-${NVERSION}
# ./configure --prefix=/usr/local/nginx-${NVERSION} --with-openssl=../libressl-${LVERSION}
# make
```

##4. 確認
```lang:nginx
# objs/nginx -V
nginx version: nginx/1.7.9
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) 
configure arguments: --prefix=/usr/local/nginx-1.7.9 --with-openssl=../libressl-2.1.3
```
JSONをplistに変換したい


JSONで用意されているデータを`NSArray`や`NSDictionary`にして使いたかった。

## 結論
これでいい

```
$ plutil -convert xml1 hoge.json -o hoge.plist
```

## 解説

`plutil`はplistがらみのユーティリティで、一コマンドにいろんな機能がまとまった<del>良くない設計の見本みたいな</del>便利ツールです。

`plutil`が変換できるフォーマットは以下の3種類。

* json
* xml1
* binary1

plistにはXML形式とバイナリ形式があることをご存知なら、特に説明はいらないと思います。

`-convert`の引数には出力フォーマット名を書きます。
入力のフォーマットは自動で認識してくれるみたいです。
`json -> xml1` だけでなく、　`xml1 -> json` もできます。

ちなみに`-o`オプションを忘れると _入力ファイルを上書きされる_ ので注意しましょう。
（stdoutに出てくるものだと思ってはいけない。`-o -`とすればstdoutに出てくる）

## あとは

適当に`NSBundle`とかでファイルパスを取ってきて`NSArray#arrayWithContentsOfFile`とかで使えるようにしたら幸せになれた。
Akka - Log into files

Ref:
[1]: [Stackoverflow - How to redirect logging in akka?](http://stackoverflow.com/questions/10494656/how-to-redirect-logging-in-akka)
[2]: [How to setup SLF4J and LOGBack in a web app - fast](https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast)
[3]: [Stackoverflow - Akka (2.3.0) fails to load Slf4jEventHandler class with java.lang.ClassNotFoundException](http://stackoverflow.com/questions/21943353/akka-2-3-0-fails-to-load-slf4jeventhandler-class-with-java-lang-classnotfounde)
[4]: [Akka - Logging](http://doc.akka.io/docs/akka/2.3.4/scala/logging.html)


It is essentially import to write logs in the file system when you are tracking issues or benchmark your Akka program. And it is quite a surprise that Akka can not directly log into files.

To achieve this, you will also need ***logback*** and ***slf4j***.

***NOTE***:

All the dependency for this issue are changing these days, the version of Akka matters much. How you do this may change slightly according to your own version, but still could hurt much (at least to me).

Here is some version info of mine:

- Akka: 2.3.4

# Add dependency

In your `build.sbt`

```scala
resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.3.4",
  "com.typesafe.akka" % "akka-slf4j_2.10" % "2.3.4",
  "ch.qos.logback" % "logback-classic" % "1.0.13",
)
```

# Config Akka

In your /src/resources/application.conf, change default logger to Slf4jLogger.

```
akka {
    loglevel = "DEBUG"
    loggers = ["akka.event.slf4j.Slf4jLogger"]
}
```

# Config logback

Create a file named `logback.xml` in /src/main/resources to config logback.

```xml
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>log/log.log</file>
        <append>true</append>
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d,%msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="FILE" />
    </root>
</configuration>
```

The destination of log is in *file* element.
The pattern of each line is set in *pattern* element.

Other config could refer to [Logback's official document](http://logback.qos.ch/documentation.html).

There is one thing show be pointed out: the date time in the pattern `%d`, is not the time when program call `Log.info(msg)` but the time when the line is written.
Emacs で Python のソースコードを編集するあいだ常に PEP8 のチェックをおこなう

[昨日](http://qiita.com/ynakayama/items/8616f4c0c6e372de9a42)は Python のコーディング規約 [PEP8](http://legacy.python.org/dev/peps/pep-0008/) について書きました。

Emacs で Python のソースコードを書いているあいだ、常に PEP8 の適合性が検査され、それが可視化されるとさらに便利です。

今回紹介する Emacs Lisp を利用すると、下のように常に PEP8 の適合性違反が Emacs 上に可視化されます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/80c9b2a2-9f89-d785-ad49-ac51fd26e44f.png)

また Python の編集中のみ、特定のキーバインドでミニバッファに PEP8 のチェック結果を表示することができるようになります。

## 前提となる Emacs Lisp

まずは Emacs で Python の開発をするための前提となる Emacs Lisp を用意します。

### python-mode.el

Python のメジャーモードとしてはいくつかありますが筆者のおすすめは python-mode.el です。

python-mode.el
http://www.emacswiki.org/emacs/PythonProgrammingInEmacs

これは最も機能が豊富です。

### flymake-cursor.el

Emacs 23 以降で既定となった flymake と協調し、ミニバッファ上の現在の行に flymake のエラーを表示します。

flymake-cursor.el
https://github.com/illusori/emacs-flymake-cursor

## Python モードの設定をおこなう

[昨日](http://qiita.com/ynakayama/items/8616f4c0c6e372de9a42)の記事では (when (load "python-pep8") (define-key global-map "\C-c\ p" 'python-pep8)) としましたが、これだとあらゆるファイルを編集中に C-c p で pep8 のチェックが走ってしまいます。そこで python-mode のフックを利用し Python を編集中のみ有効にすると良いでしょう。

これを踏まえて、次のように python-mode のための設定を Emacs Lisp で記述します。

```el
;; python-mode をロードする
(when (autoload 'python-mode "python-mode" "Python editing mode." t)
  ;; python-mode のときのみ python-pep8 のキーバインドを有効にする
  (setq python-mode-hook
  (function (lambda ()
    (local-set-key "\C-c\ p" 'python-pep8))))
  (setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
  (setq interpreter-mode-alist (cons '("python" . python-mode)
                                     interpreter-mode-alist)))

;; flymake for python
(add-hook 'python-mode-hook 'flymake-find-file-hook)
(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      ;; 昨日紹介した自作のシェルスクリプトを指定する
      ;; 各々の環境にあわせて編集してください
      (list "/usr/local/sbin/pyck"  (list local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pyflakes-init)))
(load-library "flymake-cursor")
```

これで冒頭で紹介した状態になります。なお、無視したいエラーは、上から呼ばれるシェルスクリプト内および python-pep8 で指定することができます。

python-pep8.el でエラーを無視するには、次のように Emacs Lisp を編集して pep8 のオプションとして渡します。

```el
(defcustom python-pep8-options '("--ignore=E302")
  "Options to pass to pep8.py"
  :type '(repeat string)
  :group 'python-pep8)
```

## まとめ

Emacs の設定は人によりそれぞれですが、今回の内容をもとに各々が開発しやすい環境を作るとより幸せになれるでしょう。
Sass(SCSS)のmixin, extendなどまとめ

Sass(SCSS)のややこしそうな機能まとめ。


# 変数
共通な色や数値などを定義しておける。
他に、文字列や真偽なども定義可能。

```scss:style.scss
$baseColor: #1967D3;

h1 {
  background-color: $baseColor;
  color: #fff;
}
```

```css:style.css
h1 {
  background-color: #1967d3;
  color: #fff;
}
```

# mixin
引数を使うことができる。
初期値を設定しておくことも可能。
定義しても、`@include`で呼び出さないと使えない。

```scss:style.scss

@mixin border($color:#666) {
  border-bottom: 1px solid $color;
}

#header {
  @include border(#999); 

  #gnav {
    overflow: hidden;
    @include border;
  }
}
```

```css:style.css
#header {
  border-bottom: 1px solid #999999;
}

#header #gnav {
  overflow: hidden;
  border-bottom: 1px solid #666666;
}
```

引数の初期値を入れたい場合は、「:」の後に値を入れる。

```scss
@mixin border($color: #666) {
  border-bottom: 1px solid $color;
}
```

引数を複数指定したい場合は、「,」で区切る。

```scss
@mixin box($color: #666, $width: 300px, $height: 300px) {
  border: 1px solid $color;
  width: $width;
  height: $height;
}
```

引数使わないときは以下の書き方でOK。()なくて良い

```scss
@mixin border {
  border-bottom: 1px solid #999;
}
```

# extend

定義しているスタイルを継承する。
コンパイルすると、セレクタがグループ化される。
グループ化した状態にしたくない場合は、extendにしない方が良いかも。

```scss:style.scss
.box {
  margin-top: 15px;
  padding: 10px;
  background-color: #ccc;

  p {
    line-height: 1.3;
  }
}

.contentsBox {
  @extend .box;
  background-color: #eee;
}

```

```css:style.css
.box, .contentsBox {
  margin-top: 15px;
  padding: 10px;
  background-color: #ccc;
}

.box p, .contentsBox p {
  line-height: 1.3;
}

.contentsBox {
  background-color: #eee;
}
```

extendする元のスタイルをCSSに出したくないとき、プレイスホルダーセレクタを使う。
「#」や「.」の代わりに「%」で定義する。

定義しても呼び出さないと使えないのは、`@mixin`と同じ。
（Sass3.2から追加された機能）

```scss:style.scss
%box {
  margin-top: 15px;
  padding: 10px;
  background-color: #ccc;
}

.contenteBox {
  @extend %box;
  p {
    line-height: 1.3;
  }
}

.noteBox {
  @extend %box;
}
```

```css:style.css
.contenteBox, .noteBox {
  margin-top: 15px;
  padding: 10px;
  background-color: #ccc;
}

.contenteBox p {
  line-height: 1.3;
}

```

# mixinとextendまとめ

## mixin
・何度も使うスタイルを定義できる
・引数を使える
・`@include`で呼び出さなければ使えない

## extend
・定義したスタイルを継承（入れ子になっているものも全て）
・グループ化される
・プレイスホルダーセレクタ（`%hoge`）で定義したものを`@extend`できる


どっちを使った方が良いかは、シーンによって変わりそうです。
適宜、より良い方をセレクトする必要がありますね。
wp2txtでwikipediaのコーパスを作るまでの道のり

Wikipediaのダンプデータから、xml構文などを取り除いてくれるwp2txtを入れるのに苦労したのでメモしておく。
まあrubyに詳しくないせいなんだけど・・・。
wp2txtについては[https://github.com/yohasebe/wp2txt](https://github.com/yohasebe/wp2txt)を参照

ちなみにMacでやっているので、既にrubyがある状態から始めてます。

#公式のインストール方法

```bash
$ gem install wp2txt
```

うわー超簡単やーん。と思って、wp2txtを実行しようとすると、やたらエラーがでた・・・。
どうやら依存するパッケージを入れないとダメらしい。

#実際にやったインストール方法

bundleってやつを使ってインストールしました。
bundle使うと、依存するライブラリを全部入れてくれる。偉い。
手順は以下のようになる。

```bash
$ gem install bundle
$ mkdir ~/ruby_bundle
$ cd ~/ruby_bundle
$ bundle init
Writing new Gemfile to /file_to_path/ruby_bundle/Gemfile
$ echo 'gem "wp2txt"' >> Gemfile
$ bundle install
```

偉いんだけど、ちょっとめんどくさい。特にGemfileにインストールするパッケージを書くのが。
Gemfileは`bundle init`を実行すると、実行したディレクトリに作られる。
Gemfileはvimとかで編集してもいいけど、1行だけだからechoで追記しといた。
後は`bundle install`で依存ライブラリも含めてインストールしてくれる。

なお、[ツールを使いたいだけの人のための bundler 入門 (例: vagrant + veewee)](http://qiita.com/znz/items/5471e5826fde29fa9a80)で、`bundle install`を行う時に`--paht`つけると便利って書いてあったが、パス指定でインストールすると動かなかったので、そのまま入れた。
ログを見ると既存のrubyとの関係性っぽかったが、一旦諦めた・・・。

#wp2txtを使う
wp2txtを使うために、そもそもwikipediaのダンプが必要。
[http://dumps.wikimedia.org/jawiki/latest/](http://dumps.wikimedia.org/jawiki/latest/)からダウンロードしておく。
ダウンロードするのはjawiki-latest-pages-articles.xml.bz2でいいと思う。

後は以下のコマンドで。どっかのバージョンから、インプットファイルを指定する時にオプション指定が必要になったみたい。

```bash
$ wp2txt --input-file jawiki-latest-pages-articles.xml.bz2
```

時間かかるので、ひたすら待つのみ
UIPasteboardでのNSURLとNSStringの違い

メモ帳やsafariでよく使うコピー&ペーストのをアプリで実装するのに使うUIPasteboardクラスのメソッドの違い。

##まずは簡単な使い方
インスタンスをつくってメソッドを呼び出す。  

```objc:ViewController.m
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];

//文字列コピー
[pasteboard setValue:@"文字列" forPasteboardType:@"public.text"];

//画像コピー
UIImage *image = [UIImage imageNamed:@"hoge.jpg"]
[pasteboard setValue:image forPasteboardType:@"public.image"];

```

##本題、NSURLとNSString
コピーのメソッドにNSString用とNSURL用があるので、その違いを検証する。

NSURLコピーのメソッド

```objc:ViewController.m
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
[pasteboard setURL:url];

```

####メモアプリにペースト
ハイライトされ、クリックするとsafariが起動しURL先に飛ぶ。

####同じことを文字列コピーのメソッドでコピーしたURLで
ハイライトされ、クリックするとsafariが起動しURL先に飛ぶ。
**一緒ですやん。**個人的にNSStringでコピーしたものはURLとして認識されないのかなぁと思いきやそうでもなかった。メモアプリ側で変換してるからコピー側はあまり意識しなくてもいいのか。

使い分けがいまいち分からない。
Apple Configuratorで無料アプリがインストールできないときに疑う設定

Apple ConfiguratorはiOS端末のキッティングをサポートする無料ツールですが、はまりどころが結構あります。

今回は「無料アプリを端末にインストールしたいのだけどなぜかインストール出来ない」という現象への対処です。

このような場合にはプロファイルの設定を見直しましょう。

```
制限→メディアコンテンツ→許可されるコンテンツレーティング→App
```

という設定項目に、何らかの制限が課されている場合、アプリがインストールされません。
cloudwatchの内容をNewRelicにて表示する


metorics管理をnewrelicに一元化したいので、awsのcloudwatch情報もnewrelicへ連携します。

[newrelic-platform/newrelic_aws_cloudwatch_plugin](https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin)

## require

- newrelic account
- t1.micro instance
- readonly権限のIAM account

## IAMにてreadonly権限を持ったユーザーを作成

create group 'NewRelicCloudWatch'

	{
	  "Version": "2012-10-17",
	  "Statement": [
	    {
	      "Action": [
	        "autoscaling:Describe*",
	        "cloudwatch:Describe*",
	        "cloudwatch:List*",
	        "cloudwatch:Get*",
	        "ec2:Describe*",
	        "ec2:Get*",
	        "ec2:ReportInstanceStatus",
	        "elasticache:DescribeCacheClusters",
	        "elasticloadbalancing:Describe*",
	        "sqs:GetQueueAttributes",
	        "sqs:ListQueues",
	        "rds:DescribeDBInstances",
	        "SNS:ListTopics"
	      ],
	      "Effect": "Allow",
	      "Resource": "*"
	    }
	  ]
	}


create user 'NewRelicCloudWatch'

- credentialをdownloadしておく

## t1.microをnewrelicのAMI使って作成

AMIはここ

[https://aws.amazon.com/marketplace/pp/B00DMMUO0O/](https://aws.amazon.com/marketplace/pp/B00DMMUO0O/)

鍵とかはmonitoringなんで別にしておくと良いかも。

## cookbook

さて、manualで入れんのはだるいのでcookします。

cookbookはココ

- [newrelic_plugins](https://supermarket.getchef.com/cookbooks/newrelic_plugins)

まずひな形作成

	$ knife solo init monitoring
	$ cd monitoring
	$ berks init .
	$ vim Berksfile
	
	cookbook 'newrelic_plugins', '~> 1.0.0'

	$ berks install

これでまず下ごしらえ。

次にrunlist作ります。めんどうなので１個

	$ vim nodes/foo-newrelic.json
	{
	  "newrelic": {
	    "license_key": "LICENSE_KEY",
	    "aws_cloudwatch": {
	      "install_path": "/opt/aws_cloudwatch",
	      "user": "newrelic",
	      "aws_access_key": "AWS_ACCESS_KEY",
	      "aws_secret_key": "AWS_SECRET_KEY",
	      "agents": [
	        "ec2",
	        "ebs",
	        "rds",
	        "elasticache",
	        "sqs",
	        "elb"
	      ]
	    }
	  },
	  "run_list": [
	    "newrelic_plugins::aws_cloudwatch"
	  ]
	}

cook

	$ knife solo bootstrap ubuntu@INSTANCE_IP_ADDRESS nodes/foo-newrelic.json

## その他

このままだとアレなので、cookbookに

- fwの設定を見直す
- 作業ユーザーを作る
- アクセスユーザーを作って鍵交換

とかやった方がいいかもです。


## その他Reference

- [https://aws.amazon.com/marketplace/usageinstructions?product=abe54c72-7613-405d-b150-83b4a0fcc9ed&version=4]
Twitterbotを作るときにGmailエイリアスを利用する

Twitterbot を作るときに使える技を記録しておきます。
仮に自分のアカウントがある場合、以下のようにGmailのエイリアスを
使用することができます。

▼自分のアカウント
myaccount@gmail.com の場合
▼エイリアス
myaccount+hoge@gmail.com

これを使うと、同じメールアカウントで管理したい場合はとても便利です。
CoffeeScript実行環境を整える 〜 JSおくのほそ道 #020

こんにちは、ほそ道です。

今回からよりアジャイリーな開発を目指して、とりあえずCofeeScriptを取り上げます。
今後Yeoman/anguler.js/Synthまたはsails.jsなども取り上げながらリッチなアプリケーションをよりカジュアルに作りたいなという狙いがあり、その第一歩となります。

**今回は文法的な所はスルーします。実行方法とコンパイル、その為の環境構築を取り上げます**

[目次はこちら](http://qiita.com/setzz/items/ad9a9c99a4fda041a563)

# Coffeeを飲んでみた理由

TypeScript/Scala.js/PureScriptも少し触ってみましたが下記の３点を評価基準にしたときに一番良いかなーと思いました。

- **短く書けそう**
- **小回りが効き、他ツールと連携の選択肢もある**
- **コンパイルされたJSが見易く、ファットにならない**
- **変換後のJSコードのグッドパーツな感じを見たい**

TypeScriptはJS拡張的な位置づけの為、元のJSがイケてないとグッドパーツにしてくれないのでは？という懸念があり今回は見送り。

ScalaベースのScala.jsは出力されたJSがファットで、元の構文がライブラリ内に散らばる感じが惜しいなという感じ。

HaskellライクなPureScriptは動作させるまでにHaskellのパッケージインストールが結構面倒だったのと、出力されたJSはまとまっているのすが大量のコードに囲まれていて何となく重々しい感じ。

きっとどの言語も素敵だと思いますが、今回はCoffeeScriptのフットワークの軽さと他ツール連携が多いと思われる部分を取りました。

# Nodeでインストール＋実行

## インストール

Nodeで実行出来るよう、コンソールで下記のコマンドを叩きましょう。
どこからでも叩きたいのでグローバルインストールとします。

```bash:インストール
sudo npm install -g coffee-script
```

`coffee`コマンドを叩くと対話型のコンソールになりますね。アラ簡単。

## 実行

さっそくコードを書いてみましょう。ファイル名はfirst.coffeeとします。
JSには無いキーワード`class`を使ってみます。わくわくです。

```coffeescript:first.coffee
class Man
  constructor: (@name, @age) ->

  greet: (arg) ->
    console.log 'Hello I\'m ' + @name + "!";

h = new Man "Hosomichi", 30
h.greet()
```

ファイルを保存したらコンソールで実行です。

```bash:実行
coffee first.coffee    # Hello I'm Hosomichi!
```

とりあえずイイ感じ！

## JSコンパイル

今度はコードをJavaScriptコードに変換してみましょう。
コンソールで下記のコマンドを叩きましょう。

```bash
coffee -c first.coffee
```

同じディレクトリに`first.js`というのが出来上がっております。サクサク出来ますね。
中身を拝見してみましょう。

```js:first.js
// Generated by CoffeeScript 1.7.1
(function() {
  var Man, h;

  Man = (function() {
    function Man(name, age) {
      this.name = name;
      this.age = age;
    }

    Man.prototype.greet = function(arg) {
      return console.log('Hello I\'m ' + this.name + "!");
    };

    return Man;

  })();

  h = new Man("Hosomichi", 30);

  h.greet();

}).call(this);
```

フムフム、即時関数の中に収まる形で作られるんですね。

そして`class`で宣言したオブジェクトは即時関数の内部でクロージャを使って安全に生成され、
メソッドはprototypeに設定されると。

そして記述量が３倍ほど違います。

面白いですねぇ。

# ブラウザで実行

さてaltJsという事でブラウザでも使いたいですね。
フツーにJSコンパイルして出力ファイルをブラウザに読み込ませるのが常套手段だと思いますが、[公式で紹介していた](http://coffeescript.org/#scripts)面白い方法を試してみます。

まず[coffee-script.js](http://coffeescript.org/extras/coffee-script.js)をダウンロードしてHTMLから参照できる場所に配置します。
HTMLファイルは次のようにしてみました。

```coffeescript:HTMLファイル
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>FirstCoffeeScript!</title>
  </head>
  <body>
    <script src="js/coffee-script.js" type="text/javascript"></script>
    <script type="text/coffeescript">
      class Man
        constructor: (@name, @age) ->
      
        greet: (arg) ->
          alert 'Hello I\'m ' + @name + "!";

      h = new Man "Hosomichi", 30
      h.greet()
    </script>
  </body>
</html>
```

重要ポイントは下記の二点です。
- scriptタグのtype属性が`text/coffeescript`
- ダウンロードしたcoffee-script.jsを読み込ませている

Node実行の際の`console.log`は折角なので`alert`にしてみました。

この状態でブラウザを開いて読み込むとメッセージダイアログが表示されます。
これはカジュアルに実行できて非常によろしいですね！

今回は以上です。
jqでハイフン(-)を含むkeyでフィルタできないときの対処法

詳しくは
[Github: Cannot select field if field name has dashes #38](https://github.com/stedolan/jq/issues/38)

```json:test.json
{
  "foo-bar": "valueA",
  "hoge-fuga": "valueB"
}
```

失敗例

```
$ cat test.json | jq '.foo-bar'

error: bar is not defined
.foo-bar     1 compile error
```

修正

```
$ cat test.json | jq '.["foo-bar"]'

"valueA"
```

ハイフンを別の用途で使ってるから、エスケープしないといけない、って感じ？
[jq Manual](http://stedolan.github.io/jq/manual/#Builtinoperatorsandfunctions)
[OBJC] 多言語対応に作成したUIKitカテゴリ

　ボタンやらラベルやらの文字列を多言語化する際に、いちいちNSLocalizedStringを記述するのが面倒だったので、以下のメソッドを追加して対応しました。

```objc
@implementation UIButton (Localized)

-(void)setLocalizedKey:(NSString*)key forState:(UIControlState)state {
    NSString* text = NSLocalizedString(key,key);
    [self setTitle:text forState:state];
}

@end
```

利用例

```objc
[self.button setLocalizedKey:@"RETRY" forState:...];
```

UILabel, UIButton, UIAlertViewについては、
[Github](https://github.com/hmuronaka/Objc-Localized/tree/master/Objc%2BLocalized/Localized)に参考ソースがあります。

# 画像にも...

画像を差し替える場合も、同様に

```objc
[UIImage imageLocalizedName@"retry"];
```

とし、画像のファイル名にretry_en.pngやらretry_jp.pngなどのルールを設けて対応しました。

---- 

便利なライブラリや、より楽な方法をご存知な方、教えて頂ければ幸いです。。。
【C#の定数】const と readonly、static readonly の使い分け

C#で時々迷う定数定義、const と static readonly の使い分けに関してまとめた。

#const

constフィールドは、コンパイル時定数の扱い。（[MSDN](http://msdn.microsoft.com/ja-jp/library/e6w8fe1b.aspx)）

- 変数のように扱える**定数**（暗黙的 static）
- **宣言時にのみ**初期化可能（コンパイル時に値が埋め込まれる）
- readonly より実行速度が速い
- switch文やデフォルト引数に使える
- インスタンスを new した結果は割り当てられない（C#の組み込み型のみ）
- **※注意**
 - コンパイル時に決定されてしまうため、クラスライブラリなどでpublicなconst定数を定義しそれをアセンブリをまたいで参照してしまった場合、将来ライブラリ側の定数を変更しても参照されたアセンブリ側をコンパイルしなおさない限り更新されないという問題がある([constのバージョニング問題](http://ufcpp.net/study/csharp/sp_const.html#versioning))

#readonly

readonlyフィールドは、実行時定数の扱い。（[MSDN](http://msdn.microsoft.com/ja-jp/library/acdd6hb7.aspx)）

- 実際は、読み取り専用の代入不可な**変数**
- 宣言時の他に、**コンストラクタ内でも**初期化可能
- 定数であるconstよりは、僅かに実行速度が遅い
- switch文やデフォルト引数には使えない
- インスタンスを new した結果を割り当てられる


#static readonly

- constが使いたいけど、使えない場合に、static readonly を使用する。

>定数値のシンボル名が必要で、その値の型を const 宣言で使用できない場合、またはその値をコンパイル時に計算できない場合は、static readonly フィールドが役に立ちます。([MSDN – 定数用の static readonly フィールド](http://msdn.microsoft.com/ja-jp/library/aa645753(v=vs.71).aspx))

#まとめ

基本的に、static readonly を使用する。
constは、属性に指定するパラメータや列挙型の定義など、コンパイル時に値が必要な場合にのみ使用する。
[Effective C#](http://www.amazon.co.jp/Effective-C-4-0-%E3%83%93%E3%83%AB%E3%83%BB%E3%83%AF%E3%82%B0%E3%83%8A%E3%83%BC/dp/4798122513/ref=sr_1_1?s=books&ie=UTF8&qid=1397487209&sr=1-1&keywords=Effective+C%23) でも、const よりも readonly の使用が推奨されている。

>高いパフォーマンスが求められていて、なおかつ将来にわたって変更されることがないことが明らかな場合にのみコンパイル時定数を使用するべきです。
Vim の起動が遅いとき

```
vim --startuptime startup.log file_to_open
```

で計測結果が `startup.log` に書き込まれます。

最初よくわからず `vim --startuptime file_to_open` とやって、開きたいファイルにログを書き込んでしまっていました。

今回は Markdown を開くときに異様に遅く、計測してみると [vim-css-color](https://github.com/skammer/vim-css-color) で何秒もかかっていました。どうも Markdown の見出しの `#` をカラーコードと勘違いしていたみたいです。

[vim-css-color](https://github.com/skammer/vim-css-color) は遅いし関係ないファイルでも動作してしまうので、後発の [vim-coloresque](https://github.com/gorodinskiy/vim-coloresque) に換えたら速くなりました。めでたしめでたし。
忘れっぽい人のための正規表現チートシート


正規表現はテキスト処理に大変便利なわけですが、数字のメタキャラクタなんだったっけ？とかあの量指定子なんだったっけ？とか慣れないうちはよく忘れてしまいます。

そこで自分のための備忘録として、チートシートにまとめてみました。

#1.基本のメタキャラクタ

メタキャラクタにより任意の1文字や任意の半角数字などを指定することができます。

|メタキャラクタ|意味|
|:-:|:-:|
|.|任意の1文字|
|\w|英単語を構成する文字(a~z,A~Z,_,1~9)|
|\W|英単語を構成する文字以外|
|\s|空白文字(半角スペース,タブ,改行,キャリッジリターン)|
|\S|空白文字以外|
|\d|半角数字(0~9)|
|\D|半角数字以外|
|\b|単語の境界に一致|
|[xyz]| 指定された文字のどれかに一致(この場合xyzのいずれかに一致)|
|[a-z]|マッチする文字の範囲を指定する表現(この場合aからzまで他には[1-9][A-Z]など文字コードが連続していれば使える。)|
|(pattern1&#124;pattern2)|指定されたパターンのどれかにマッチする表現|

#2.量指定子

量指定子は、文字の後ろに配置し、前の文字が何回出てくるのかを指定します。例えば、0回以上の繰り返しにマッチする量指定子```*```を

```profile:
ne*ko
```
のように使うと、```nko```, ```neko```, ```neeko```,```neeeko```などに一致します。カッコで囲むことにより繰り返す文字列も指定することができます。

```
(neko)*sakana
```

であると、```sakana```, ```nekosakana```, ```nekonekosakana```という文字列に一致します。

|量指定子|意味|
|:-:|:-:|
|*|0回以上の繰り返しにマッチ|
|+|1回以上の繰り返しにマッチ|
|{n}|n回の繰り返しにマッチする表現|
|{n,}|n回以上の繰り返しにマッチする表現|
|{n,m}|n回以上m回以下の繰り返しにマッチする表現|
|?|0回または1回の出現にマッチする表現|

#3.アンカー

文字列の先頭や末尾に特定の文字がある文字列も表現できます。

|アンカー|意味|
|:-:|:-:|
|^pattern|文字列の先頭にpatternがある文字列に一致|
|pattern$|文字列の末尾にpatternがある文字列に一致|

#4.キャプション

マッチしたい文字列の一部を再利用する場合にはキャプションという機能を使うことで達成出来ます。

たとえば#や$で囲まれた文字をマッチしたいときには

```profile:
([#$]).+\1
```

とすることで、```#neko#```や```$neko$```に一致します。つまりキャプチャは()で囲ったところに出現した文字をキャプチャし\1という変数に入れてマッチを行うという機能になります。

キャプチャは複数使うことができます。例えば

```plain:
(a)(b)c(\2)(\1)
```

であれば```abcba```という文字列に一致します。キャプチャは()で囲った順番で変数```\1,\2,\3,...```と代入されます。

キャプチャされるのを抑制する場合には```(?:pattern)```とします。

#5.まとめと参考文献

正規表現は覚えると非常に応用範囲の広い技術（ログ解析、入出力チェック）なので、体が覚えるレベルまでに達することが今後の目標ですw

以下、おすすめの本へのリンクを貼っておきます。

**反復学習ソフト付き 正規表現書き方ドリル**
http://gihyo.jp/magazine/wdpress/plus/978-4-7741-4509-9

ドリル形式なので手で覚えることができてお勧めです。

**詳説 正規表現 第3版**
http://www.oreilly.co.jp/books/9784873113593/

読んだことないんですけど、正規表現の有名な本です。鈍器や枕としてもお勧めですw

**初めてのPerl 第6版**
http://www.oreilly.co.jp/books/9784873115672/

正規表現の本じゃねーじゃんというツッコミはあるとは思いますが、正規表現に関する章があります。perlで正規表現を使ってどんなことができるのかが書いてあるので、お勧めです。
Express4でBASIC認証をする


Express3時代とは違い、Express4ではいろんな機能が外部モジュールに分割されています。なので、必要な物はrequireしなくてはならない。

## Express3時代のBASIC認証

```
app.use(express.basicAuth('username', 'password'));
```

## Express4時代のBASIC認証

まず、basic-auth-connectをインストール。（実際には、package.jsonに記述して`npm install`だけど）

```
$ npm install basic-auth-connect
```

後は、今までと書き方はほぼ変わらないです。

```
var basicAuth = require('basic-auth-connect');
app.use(basicAuth('username', 'password'));
```
[homebrew] ダウングレードしたい時


homebrewでパッケージをアップグレード => phpライブラリが動かなくなる => ライブラリのアップグレードは依存状態的にムリな状態になり、めんどくさいから元に戻しましたの備忘録です

## やり方

すごく簡単でTapを前の状態に戻して、再度インストールすれば古いものがインストールできます

### Tapを前に戻す

戻したいTapの位置まで行きます。

```bash:
$ pwd
/usr/local/Library/Taps/josegonzalez/homebrew-php
```

Tapは只のgitリポジトリなので

```bash:
$ git remote -v
origin  https://github.com/josegonzalez/homebrew-php (fetch)
origin  https://github.com/josegonzalez/homebrew-php (push)
```

logやらblameやらで戻したいコミットを見つけて過去に戻るだけでした。

### 再インストール

既にインストールされた状態なので一度

```bash:
$ brew uninstall hoge
```

してから

```bash:
$ brew install hoge
```

します。


おしまい
Vimからfcitxを使う

近頃の ibus や uim の使い勝手がイマイチなこともあり、Linux 上での Input Method として fcitx が最近ポピュラーになってきました。

我らが SKK では、その他のInput Methodと違い、SKK内に直接入力モードがあり、SKKのままアルファベット入力が可能なため、一時期のUbuntu で発生したような ibus の不具合をほとんど受けることがなく、実はあまり fcitx に乗り換える必要もありません。

ともあれ、fcitxを使うとなった場合に、Linuxで問題となるのは、Input Mode⇔Normal Mode間で、ひらがなモードの有効/無効が自動的に切り替えられない事です。

日本語で文章を書いていて、SKKを直接入力モードに変更しないまま、`<ESC>`でInsert Modeを抜けて体裁を整えたり、編集をしようとした場合に、Normal Modeでもひらがな入力が有効のままになっていてムキー、というのはよくある光景です。

Vimから fcitx の On/Off を切り替える場合、[FcitxでVimからIM制御する](http://www.kaoriya.net/blog/2014/07/20/)が有名かと思います。

このプラグインでは、Vimのpythonインタフェースを利用してOn/Offを実行していますが、fcitxには`fcitx-remote`というコマンドがあるようなので、それを利用してOn/Off切り替えが実現できます。

<script src="https://gist.github.com/sgur/bf1bcedd0a41870f8159.js"></script>

~~~vim
set iminsert=2
set imsearch=2
set imcmdline
set imactivatefunc=ImActivate
function! ImActivate(active)
  if a:active
    call system('fcitx-remote -o')
  else
    call system('fcitx-remote -c')
  endif
endfunction
set imstatusfunc=ImStatus
function! ImStatus()
  return system('fcitx-remote')[0] is# '2'
endfunction
~~~

このようにすることで、入力開始時には `fcitx-remote -o`により fcitx を有効化し、入力終了時には `fcitx-remote -c`でfcitxを無効にできるようです。

ちなみに、Vimで入力時にIMの制御が必要となる場面というと、以下のようなものがあります。

- Insert Mode … バッファへの文章の挿入
- Cmdline (':') Mode … Ex コマンドの実行
- Cmdline ('/' or '?') Mode … `/` や `?` での検索文字の入力

今回の `imactivatefunc` を利用する方法を使えば、それぞれの場面での設定を、以下のオプションを設定することで制御できるようになるため、便利です。

- `iminsert`
- `imcmdline`
- `imsearch`

紹介した設定例では、それぞれのパターンでIMを有効にするように設定しました。

SKKなどの、IM有効時の初期入力モードを設定できるIMでは、`直接入力`を初期設定としておくと、上記のVimの設定においても、通常は半角英数入力で、必要時のみ`<C-j>`で日本語入力することができ、また、Normal Modeに戻った時にも影響がなく、とても便利です。

ちなみに、Windowsでは、こんなしち面倒くさいことをせず、ただ[SKK日本語入力FEP](http://coexe.web.fc2.com/programs.html)を使うだけでInsert Mode⇔Normal Modeの切り替え時に自動的に直接入力モードへ変更してくれるので、以下の設定だけしておけばよいです。

~~~vim
set iminsert=0
set imsearch=0
~~~