OmniAICreator/Qiita-1.07M huggingface dataset:
Sublime TextのCtrl+D選択で大文字小文字を区別したい

検索ダイアログ (⌘+F | Ctrl+F)で大文字小文字を区別するようにしておくと、⌘+D | Ctrl+D の時も同じように動きます。
![fftue.png](https://qiita-image-store.s3.amazonaws.com/0/56668/02c2143c-8f71-7eb9-914b-63d593c245fd.png)

参考：[Case sensitive Cmd+D in Sublime Text 2](http://stackoverflow.com/questions/14829336/case-sensitive-cmdd-in-sublime-text-2)
複数のIPv4を設定する方法


```bash:追加
ifconfig en0 down
ifconfig en0 alias 192.168.0.1 netmask 0xffffff00
ifconfig en0 up
```
```bash:削除
ifconfig en0 down
ifconfig en0 -alias 192.168.0.1 netmask 0xffffff00
ifconfig en0 up
```
phpstormにcakephpのcodesnifferをインストール

$ which pear
/opt/local/bin/pear
$ sudo pear install PHP_CodeSniffer
$ sudo pear channel-discover pear.cakephp.org
$ sudo pear install cakephp/CakePHP_CodeSniffer
$which phpcs
/opt/local/bin/phpcs

でさっきのページでphpstormの設定
http://blog.jandorsman.com/blog/using-cakephp-code-sniffer-with-phpstorm
OS X でシリアルポートアクセス

###OS Xでシリアルポートアクセス
Mac OS Xで Arduinoなどをコントロールする場合、USB経由での Serial通信を行う事が多々あります。
あくまでも実験段階であれば `/dev/tty.cu.usbmodem*`など、デバイスファイル名を直接指定して `open()`すれば良いのですが、この手のデバイス名は仮想的なものなので接続する度に名前が変わったりとかして、実に面倒臭いです。

やっぱり、自動的にシリアルデバイス名を見つけて自動的にオープンする。こんな流れに持っていきたいですよね。
そこで、OS X流のデバイスファイルの見つけ方。
IOKit Frameworkを使いましょう。

```objc
#import <IOKit/IOKitLib.h>
#import <IOKit/serial/IOSerialKeys.h>
#import <IOKit/IOBSD.h>
#import <sys/ioctl.h>

static io_iterator_t findServiceDevices(void) {
  kern_return_t result;
  mach_port_t mach_port;
  if ((result = IOMasterPort(MACH_PORT_NULL, &mach_port)) != KERN_SUCCESS)
    return 0;
  CFMutableDictionaryRef classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
  if (classesToMatch == NULL)
    return 0;
  CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDAllTypes));
  if ((result = IOServiceMatchingServices(mach_port, classesToMatch, &matchingServices)) != KERN_SUCCESS)
    return 0;
  return matchingServices;
}

static NSString * resolveServiceDeviceName(io_iterator_t iterator) {
  io_object_t modemDevice;
  CFTypeRef deviceFilePathAsCFString = NULL;
  NSString *deviceFilePath = nil;
  if (iterator == 0)
    return nil;
  while ((modemDevice = IOIteratorNext(iterator)) != 0) {
    deviceFilePathAsCFString = IORegistryEntryCreateCFProperty(modemDevice, CFSTR(kIOCalloutDeviceKey), kCFAllocatorDefault, 0);
    IOObjectRelease(modemDevice);
    deviceFilePath = CFBridgingRelease(deviceFilePathAsCFString);
    if ([deviceFilePath isGreaterThanOrEqualTo:@"/dev/cu.usbmodem"])
      break;
    deviceFilePath = nil;
  }
  return deviceFilePath;
}

io_iterator_t iterator = findSerialDevices();
NSString *devName = resolveSerialDeviceName(iterator);
int devFD = open(devName.UTF8String, O_RDWR|O_NOTTY|O_NONBLOCK);
iotcl(devFD, TIOCEXCL);
   :
```
amazonアサマシリンク作成bookmarklet

昔に拾ったのが動かなくなってたのに気づいたので修正。

Selector APIを使ってるのでChrome以外で動くかは不明。

```js
javascript:(function(){var%20assoc='ASAMASHI';var%20t=document.title;var%20linkString=t.substring(t.indexOf('jp')+4,t.indexOf(':'));var%20asin=document.querySelector('#ASIN').value;var%20amazonUrl='http://www.amazon.co.jp/dp/'+asin+'/'+assoc+'/ref=nosim';var%20link=amazonUrl;var%20x=prompt('',link)})();
```

こんなリンクが作れる。

http://www.amazon.co.jp/dp/4592145208/ASAMASHI/ref=nosim
Facebook の IE対応まとめ

最近、質問されたので Facebook の IE 対応まとめ。
（2014.11.6.現在）
※公式には「各ブラウザの最新バージョンのみ」と記載されています。

* IE11 は対応。
* IE10 は、ふつうには閲覧できません。※色々設定すれば可能らしい
* IE9 では、閲覧できています。
* IE8 は、つい最近、急に閲覧できなくなりました。
* IE7、6 は完全非対応。
ctypesを使う際の(個人的な)ポイント


[ctypes](http://docs.python.jp/2/library/ctypes.html)はPythonから動的ライブラリを呼ぶための標準ライブラリ。最近初めて使った際に得た教訓/ハマったポイントをメモしておく。

## restypeとargtypesは必ず指定する

動的ライブラリの関数を呼び出す時には、Cと互換性のある型を指定する必要がある。
(ref.) http://docs.python.jp/2/library/ctypes.html#ctypes-fundamental-data-types

この型の指定は、関数呼び出し時に指定するか、`restype`/`argtypes`により戻り値/引数の型を呼び出し前にあらかじめ指定しておくか、のどちらかにより行う。

```python:型の指定
from ctypes import *

# 実行時に指定
ret = test.func2(c_char_p("test"), c_char_p("test2"), c_char_p("test3"))

# restype/argtypesにより指定
test.func2.restype = c_char_p
test.func2.argtypes = (c_char_p, c_char_p, c_char_p)
ret = test.func2("test", "test2", "test3")
```

実行時に指定するのは呼び出しが多くなると面倒になってくるため、ライブラリのインターフェースを定義したモジュールを作るのが良いと考えている。Cのヘッダファイルと同じ感じか。

```python:interface.py
from ctypes import *

test.func1.restype = c_int
test.func2.argtypes = (None)

test.func2.restype = c_char_p
test.func2.argtypes = (c_char_p, c_char_p, c_char_p)
```

## 構造体のポインタ型の指定

構造体はPythonの世界では`ctypes.Structure`を継承したクラスで表す。
構造体のメンバは、`__fields__`フィールドにタプルの配列で指定する。タプルは`(<フィールド名>, <型>)`という形式でなければならない。

```python:構造体と対応するクラス
from ctypes import *

class JSON_T(Structure):
    __fields__ = [('type', c_int), ('refcount', c_size_t)]
```

この構造体のポインタ型を指定したい場合は`ctypes.POINTER`関数を使う。
(ref.)http://docs.python.jp/2/library/ctypes.html#ctypes.POINTER

```python:構造体のポインタ型
from ctypes import *

class JSON_T(Structure):
    __fields__ = [('type', c_int), ('refcount', c_size_t)]

test.func3.restype = c_char_p
test.func3.argtypes = (c_void_p, c_char_p, c_char_p, c_char_p, POINTER(JSON_T))
```

## ポインタのポインタ型の指定

`ctypes.c_char_p`や`ctypes.c_void_p`など元々ポインタを表している型については、`ctypes.POINTER`関数を使えばよい。

```python:ポインタのポインタ型(元々ポインタを表す型)
from ctypes import *

test.func4.restype = c_char_p
test.func4.argtypes = (c_void_p, c_char_p, c_char_p, c_char_p, POINTER(c_void_p), POINTER(c_char_p))
```

これらを使用する際には、`ctypes.c_char_p`/`ctypes.c_void_p`で指定した変数を、`ctypes.byref`関数に与えて参照を取得する必要がある。

```python:ポインタのポインタ型の引数を扱う
from ctypes import *

test.func4.restype = c_char_p
test.func4.argtypes = (c_void_p, c_char_p, c_char_p, c_char_p, POINTER(c_void_p), POINTER(c_char_p))

# arg1は既に定義済みとする
arg2 = 'str2'
arg3 = 'str3'
arg4 = 'str4'
void_p_p = c_void_p(None)
char_p_p = c_char_p(None)
# 以下だとポインタのポインタにNULLが代入されるためダメ
# void_p_p = None
# char_p_p = None

test.func4(arg1, arg2, arg3, arg4, byref(void_p_p), byref(char_p_p))
```

(注) `ctypes.c_int`などプリミティブ型を表している型については今回使用していないので分からない。`ctypes.POINTER`関数を二重に使うのか?
Javaとか.Net で使えるプロファイラ YourKit

Java のプロファイラツール *Yourkit* について紹介。
　※ ちなみに触った事は無いですが、.Net 版もあるみたいです。

[オフィシャルサイト](https://www.yourkit.com)

プロファイラまで使うプロジェクトってどれくあるか分かりませんが、
プログラムの性能測定、ボトルネックやメモリリークの発見と、
特定用途のプログラムに依存せずに、様々な所で役立つので、
知っておいて損はないはず！！

今回使ってみた *YourKit* ですが、
何が良いかって、とにかく簡単に使えて、分かりやすいです。
全部英語なので最初躊躇しましたが、やりたかった大体の事は直感的に分かりました。

シェアウェアですが、メールを登録してライセンスキーを発行してもらえば１か月のお試し期間があります。


## プロセスにアタッチ

何はともあれ、プログラムにアタッチしないと始まらないので、、、
*Yourkit* を起動して、

> *[Welcome] - [Monitor Local Applications]*

ここから起動中の Java アプリが選択できるので、ダブルクリックすると、
プロセスにアタッチしてくれます。簡単 :smile:

[Monitor Remote Applications] なる項目もあるので、ローカル以外のアプリにもアタッチは可能っぽいです。


# Start CPU Profiling

CPUのプロファイルです。
どのメソッドが全体のうち、どの程度の処理時間を要していたかなどが分かります。

さらに、
> This live view providers only basic infomations. to perfom comprehensive analysis, capture snapshot

とすると、スナップショットを作ってくれて、より詳細な解析が行えます。
そこにある *[Hot spots]* を見ると、どこで時間が掛かる処理が行われているかなど一目で分かります。


# Capture Memory Snapshot

ボタン１つでメモリダンプを取ってくれます。簡単 :smile:

# 後書

紹介というほど大した内容にならなかったですが、、、
他にも色々機能があるので、困ったときに選択肢の１つに入れておくとよいかと。
ブックマーク(お気に入り登録)ボタンの設置

ブックマーク(お気に入り登録)ボタンの実装でちょっと躓いたのでメモ。
各ブラウザの挙動が違うので、jsを使ってブラウザごとの設定をします。


```js:js

$(function() {
    $('#bookmarkme,#bookmarkme2').click(function() {
        if (window.sidebar && window.sidebar.addPanel) { // Mozilla Firefox Bookmark
            window.sidebar.addPanel(document.title,window.location.href,'');
        } else if(window.external && ('AddFavorite' in window.external)) { // IE Favorite
            window.external.AddFavorite(location.href,document.title); 
        } else if(window.opera && window.print) { // Opera Hotlist
            this.title=document.title;
            return true;
        } else { // webkit - safari/chrome
            alert('ブラウザ付属のブックマーク機能をご利用ください。' + (navigator.userAgent.toLowerCase().indexOf('mac') != - 1 ? '【 Command 】' : '【 Ctrl 】') + ' + 【 D 】ボタンを押すとブックマークできます。');
        }
    });
});


```

safariとchoromeはブックマークをさせることができないので、アラートで「ブラウザ付属のブックマーク機能をご利用ください。【 Command 】 + 【 D 】ボタンを押すとブックマークできます。」と表示させます。

`(navigator.userAgent.toLowerCase().indexOf('mac') != - 1 ? '【 Command 】' : '【 Ctrl 】') `
この記述でWindoes時とmac時のショートカットキーを切り替えて表示させています。


```html:html

<a id="bookmarkme" href="" rel="sidebar" title="bookmark this page"><img src="/img/btn.png" alt=""></a>

```

スマホではsafariとchromeが大半でしょうから、ブクマボタンを付けない方がベターですね。
PCでもブラウザ間の挙動が違いすぎるので、基本的にはブクマ機能自体を付けない方が良さそうですｗ


引用：[javascript - Add to favorites button - Stack Overflow](http://stackoverflow.com/questions/10033215/add-to-favorites-button "javascript - Add to favorites button - Stack Overflow")
UICollectionViewでSDWebImageを表示するときにindexPathがzombieになる

### 概要

SDWebImageで画像ロードを行ってCollectionViewで表示。タップしたらpushViewControllerする。というありがちな実装を行った時にindexPathがzombieになる現象が発生。その時の対応メモ。

ロードする画像が縦横1000px以上のiPad用大きめサイズのものを読み込む際に現象は頻発。xib使用。 

### 修正前

```
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:_cellIdentifier forIndexPath:indexPath];
    
    // item取得
    HogeClass item = self.items[indexPath.row];
    
    // item.urlを使用して画像読み込み
    [self.thumbnail sd_setImageWithURL:[NSURL URLWithString:item.url] placeholderImage:nil options:0 progress:nil needIndicatorColor:NO completed:nil];
        
    return cell;
}


- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    // タップしたらpushViewContollerする処理
}

※cellのregistNib等は行っているものとする

```

実機(iPad)を起動させて大量に画像を読み込んでスクロールをつづけると
zombieが発生する。

![](https://dl.dropboxusercontent.com/u/2853804/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202014-11-06%2012.32.04.png)

### 対応

その1 shouldHighlightItemAtIndexPathを追加

```
- (BOOL) collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath{
    
    return NO;
}
```

その2 

* didSelectItemAtIndexPathの廃止
* CollectionViewCellのカスタムクラスにタップ時ジェスチャーを実装

### 参考

[UICollectionView mysterious crash](http://stackoverflow.com/questions/20426353/uicollectionview-mysterious-crash)
ffmpeg の filter 使っているとき、 No such filter: '' っていわれたときの解消方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

ときどきミスしてやってしまうのでメモ。

# 現象

No such filter: ''

ってエラーメッセージが出る

# 原因

-filter_complex の記述をみすってます。

```bash
ffmpeg -i input.mp4 -i input.mp4 -filter_complex "[0:v]scale=640:640[out1];[out1][1:v]overlay=0:0[out2];" sample_out.mp4
```

とか、こんな感じで、うっかりセミコロンつけて、そのあとを空にしてしまうと、件名のエラーメッセージが出て怒られます。
git 1.8.5をソースからビルドする時に足りなかった依存性


## 入れた環境

CentOS 5.X, 6.X

makeでエラーが出たときに入れたもの。

```shell:yum
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
```
C# WPF 関係のライブラリ集

# MVVM 系 #
* [Livet](https://visualstudiogallery.msdn.microsoft.com/ee198b62-fa45-496c-9c1c-e8f63b43f677)
* [MVVM Light Toolkit](https://mvvmlight.codeplex.com/)
* [patterns & practices: Prism](http://compositewpf.codeplex.com/)


# Modern UI 系 #
* [Modern UI for WPF](https://mui.codeplex.com/)
* [MahApps.Metro](http://mahapps.com/)


# グラフ・チャート系 #
* [Modern UI (Metro) Charts for Windows 8, WPF, Silverlight](http://modernuicharts.codeplex.com/)
* [WPF Toolkit](http://wpf.codeplex.com/)
* [Extended WPF Toolkit™ Community Edition](http://wpftoolkit.codeplex.com/)


# どう分けたらいいのかまだわからないもの
* [ReactiveProperty - MVVM Extensions for Rx](https://reactiveproperty.codeplex.com/)


# WPF 関係無いもの
* [Rx (Reactive Extensions)](http://rx.codeplex.com/)
* [Json.NET](http://www.newtonsoft.com/json)


## 参考資料 ##
* [Free ModernUI Charts for WPF, Windows Store Apps und Silverlight published](http://blogs.msdn.com/b/torstenmandelkow/archive/2013/05/06/free-modernui-charts-for-wpf-windows-store-apps-und-silverlight-published.aspx)
* [WPF Chart: はじめてのチャート (縦棒グラフ)](http://gushwell.ldblog.jp/archives/52336849.html)
pagerdutyの話

=====

pagerdutyを導入する時、調べたログとおまけ

機能
----

* email,notificationは送り放題
* 電話,SMSは1userあたり100コールまで
  * 追加料金で受けることは可能
  * 制限は全ユーザ数合算で行われるので5userいたら500コールまで料金内
* サービスという概念で通知元を登録
  * nagios,cloudwatch,emailとかいくつかの入信方法から一つをサービスごとに選べる
    * emailを選ぶと[好きな文字列]@[アカウント名].pagerduty.com 的なアドレスが払い出される
  * サービスごとにwebhookを複数ぶらさげれれて、hipchatやslackなんかに通知を投げれる
  * サービスごとに発生したアラートを閲覧できる
    * 解決されてないインシデントがぶらさがってるとサービス自体のstatusがcriticalになって赤くなる
  * サービスは必ず一つのエスカレーションポリシーを持つ
  * 誰かが取得したインシデントに対して一定時間経過で再度全員に通知する機能と、インシデントを一定時間で解決にするお掃除機能がある
    * どっちも時間を結構チューニングしないと使えなさそう
  * メンテナンスの時用に通知を止める機能もある
* エスカレーションポリシー
  * alert入信後のアサインの仕組みの定義
  * 一次受け、二次受け、....、n次受けが定義できる
  * 定義のフローは
    * まず最初に一次受けに通知がはいり、全員がアサインされる
    * 通知を受け取った人たちがインシデント(alert)に対してステータスを認知に変更する
    * もし誰もステータスを認知にせずに定義されたn分が経過した場合には自動でエスカレーションされる
    * 仮に認知した場合でも自分では判断できない場合はマニュアルでエスカレーションを選択することも可能
    * 最終エスカレーション先に達した場合は認知になるまで通知を繰り返す定義が可能
* ユーザ
  * アカウントに紐づいて、ユーザを複数追加できる
    * 追加するにはadmin権限のユーザアカウントである必要あり
  * 1ユーザに4種類の通知方法を設定できる
    * email (複数可能)
    * notification (iphoneとandroidアプリインストール必要、インストールした端末ごとに設定可能)
    * SMS番号
    * 電話番号
  * 通知手段はユーザが設定する(ユーザ紐付き)
    * どの通知手段を使うか(複数設定可能)
    * 発生からn分後認知していなかった場合に再通知する通知手段(複数可能)
      * 例) 0分後にemail,notification, 5分後にemail, 10分後に電話
  * 自分がアサインされているインシデントのstatusが変更になった場合の通知方法の設定
  * スケジュール通知の際の通知方法の設定
* インシデント
  * あるサービスからの入信(alert)をincidentという単位でとり扱う
  * statusとassignで管理
    * statusは一つの値を持ち、assignは複数人が設定可能
    * インシデントの入信があるとそのサービスのエスカレーションポリシーに基づいて一次受けにassignされ、status:triggeredが設定される
    * ackボタンが存在し、誰かがクリックするとその人にassignされ、status:Acknowledgedに変更される
    * 解決ボタンを押すとstatus:resolvedになりassignは全員解除される
    * マニュアルで同じエスカレーションポリシーの別のエスカレーションレベルの人にassignし直すことが出来る
      * assignに自分が入っているか、statusは何かで再通知の設定がユーザ設定で出来るので、効率良い再通知はできそう
  * 解決していないインシデントがあるとエスカレーションポリシーを変更できないという地味に嫌な仕様がある
  * 自分がassignにはいって、解決していないインシデントが一覧で見える
  * マニュアルでインシデントを作成することができ、監視に現在はいっていない問題で通知したい際などに便利
    * もちろんどれかのサービスにぶら下がる必要はあり。
    * ある程度前もってサービスを分離しておくことで必要な人に通知できそう
  * インシデントを追加してブラウザに反映されてから最大30秒くらいnotificationが来るまでに遅延があった(数回のテスト)
  * インシデントごとにassinや通知をした記録のlogがあり、noteでlogとしてコメントも残せる
* nagios-plugin
  * http://www.pagerduty.com/docs/guides/nagios-integration-guide/
    * ここみれば設定は簡単。
  * recoveryになったらstatus:resolveに変更してくれる
* android(iphone)アプリ
  * 自分に関連するインシデント一覧を操作するだけの非常にシンプルなUI
  * ack、解決、再アサイン(エスカレーション)全てできるので、通常時はこれだけで必要な操作は全てできそう
    * 携帯にnotificationがきて、アプリ開いて、ackボタンを押す。他の人は誰がアサインされてるか見て安心できる
* 電話
  * 国際電話でかかってくる +81
  * descriptionとどのserviceかを読み上げてくれる
  * button pushで再読み上げ、ステータス変更等を実行してくれる
* レポート
  * インシデントの解決や処理時間など、いろいろ統計を出してくれる機能
  * 各通知の総数はここで確認できるので、料金内かどうかは確認できそう
    * 20ユーザがいたらそれぞれユーザごとに制限じゃなく、アカウント全体で20*100まで料金内みたいな計算の模様。 
* API操作
  * APIkeyを発行していろいろ操作が可能


お値段
----

* 一人あたり月額$49, 年払いだと39$
* 電話とSMSによる通知は1ユーザ月100通まで料金内。
  * 超えた分は1通、$0.35
* クレジットカード決済
* 電話による通知に制限があり追加料金がかかるけど、通知手段の選択はユーザ紐付きなので、場合に寄っては超過料金は結構行きそう

おまけ
----

使いだしてからエスカレーションポリシーの各レイヤーに
それぞれ10ユーザしか登録できないことが判明。
(max 10 ってグレーの文字で書いてあるの見逃してた)

できればもう増やせない？って聞いてみた結果

+ アラートを10人以上が受けるのって混乱を生むのでやめたほうがいい
+ どうしてもやりたいなら
  + メーリングリストを追加しろ
  + 複数レイヤーを10人未満にして、最初のレイヤーが通知を受け取ってから(最短)5分で次のレイヤーに通知が飛ぶように設定しろ

とのことでした。
【ご相談】Qiitaのトップページと記事ページの"News"の色が異なる

# トップ

![Screen Shot 2014-11-06 at 11.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/3985/5fde0e1f-62a4-96ea-b3db-45464122c6e3.png)

# 記事個別

![Screen Shot 2014-11-06 at 11.22.59.png](https://qiita-image-store.s3.amazonaws.com/0/3985/3eb9b137-91bd-5266-7208-51557d780fde.png)
CentOS 5.11 で SPDYを使いたい(その2 - GCCバージョンアップからの目的達成編)

#前回の続き・・・
前回無事にApacheのバージョンアップができたので喜び勇んでmod_spdyをインストールした。
でも、ここでもつまずいたのでログを残しておきます。

#mod_spdyのインストール
rpm持ってきてインストールするだけ簡単簡単！

```bash:
$ wget https://dl-ssl.google.com/dl/linux/direct/mod-spdy-beta_current_x86_64.rpm
$ sudo rpm -U mod-spdy-beta_current_x86_64.rpm
$ sudo service httpd restart
```

と思って速攻導入してみたら・・・Apacheが起動しない・・・
以下がエラーの内容

```bash:
Starting httpd: httpd: Syntax error on line 214 of /etc/httpd/conf/httpd.conf: Syntax error on line 1 of /etc/httpd/conf.d/spdy.conf: Cannot load /usr/lib64/httpd/modules/mod_spdy.so into server: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib64/httpd/modules/mod_spdy.so)
[FAILED]
```

どうやら、/usr/lib64/libstdc++.so.6が古いためGLIBCXX_3.4.11が無いというエラーのようだ・・・困った。
確認したら確かにない・・・

```bash:
$ strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_FORCE_NEW
```

調査の結果GCCを新しくすれば良いようだが、ここはCentOS 5。yumで簡単にとはいかない・・・
渋々ソースからコンパイルした
手順は、以下のページをそのままそっくり実行した。唯一の違いはバージョンが4.6.3って事くらい。

https://gcc.gnu.org/wiki/InstallingGCC

あと、makeに2時間くらい掛かりました・・・

GCCのビルド&インストールが完了したところで、インストールディレクトリをみると新しいlibstdc++.so.6.0.16ができてた。
念のため、中身も確認

```bash:
$ strings $HOME/gcc-4.6.3/lib64/libstdc++.so.6.0.16 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
```

できてる！
あとは、/usr/lib64にコピーしてシンボリックリンク作れば！

```bash:
$ cp $HOME/gcc-4.6.3/lib64/libstdc++.so.6.0.16 /usr/lib64
$ ln -s libstdc++.so.6.0.16 libstdc++.so.6
```

ここまでやって、Apacheを再起動したら無事にSPDYが利用可能となりました！

CentOS 6を使えば本当に簡単に導入できるSPDYですがCentOS 5だとちょっと面倒でした。
FuelPHPクエリビルダのまとめ


~~何回やるんだっていう~~

 - [FuelPHP開発入門_07](http://qiita.com/yumura_shiho/items/9fe0c09334a2870c107c)
 - [FuelPHPのクエリビルダのメモまとめ](http://qiita.com/yumura_shiho/items/b9174ec422f89f9bc498)

このへんでやったことに加え、ちょっと複雑なクエリを書いていきます。

## as句(カラムの別名での取得)

### 方法1
selectの引数に配列を使います。→[公式ドキュメント](http://fuelphp.jp/docs/1.7/classes/database/db.html#/method_expr)

```php
DB->select(array(DB::expr('count(*)'),'count')->from('hoge')->execute();
```

### 方法2
DB::expr()を使います。→[公式ドキュメント](http://fuelphp.jp/docs/1.7/classes/database/db.html#/method_expr)

```php
DB->select(DB::expr('count(*) as count'))->from('hoge')->execute();
```

これらはどちらも同じ意味を持ちます。
```DB::expr()```はその中身がエスケープされないようになっているもので、
本来FuelPHPとして正しい構文は```select(array())```の方だと思われます。
expr見やすくて好きですけどね(´@ω@｀)

## SQLクロージャ

### where句
 - DB::and_where_open()
 - DB::and_where_close()
 - DB::or_where_open()
 - DB::or_where_close()

を用います。→[公式ドキュメント](http://fuelphp.jp/docs/1.7/classes/database/qb_where.html#/method_and_where_open)

```php
DB::select()->from('paid')
->where('status','<>',DELETE)
->and_where_open()
	->or_where('type',TYPE_FOOD)
	->or_where('type',TYPE_DRINK)
->and_where_close()
->execute();

// select * from paid where status <> DELETE and (type = TYPE_FOOD or type = TYPE_DRINK);
// DELETE,TYPE_FOOD,TYPE_DRINKの3つは定数だと思ってください
```

### having句
 - DB::and_having_open()
 - DB::and_having_close()
 - DB::or_having_open()
 - DB::or_having_close()

→[公式ドキュメント](http://fuelphp.jp/docs/1.7/classes/database/qb_select.html#/method_and_having_open)

## DB::expr()

expr()の使い方としてはたぶんこちらが正しい。

 - date_format()
 - lpad()

など、Fuelの関数としてフォローされていない部分を利用するためにDB::expr()でラップしてやります。

```php
DB::select(DB::expr("lpad(id,5,'0')"),DB::expr("date_format(registed,'%Y/%m/%d')"))->from('users')->execute()->as_array();
```

クエリ周りはどうしたってソースがごちゃごちゃしがちになるのが嫌です。
Riak2のallow_multのデフォルト値がtrueでなくfalseっぽい


riakdocsにはいくつだかのバージョンからデフォルト値はtrueって書いてた気がしたが・・・。
気のせいか？

Riak 2.0からは、app.configではなくriak.confファイルに変わった。
だが、実態は生成されたapp.configである。
そのパスを確認する。

```app.configのパスを確認
# ps -aef | grep riak | grep beam
riak     17535 17532  3 10:42 pts/1    00:00:19 /usr/lib64/riak/erts-5.10.3/bin/beam.smp -P 256000 -e 256000 -Q 65536 -A 64 -K true -W w -zdbbl 32768 -- -root /usr/lib64/riak -progname riak -- -home /var/lib/riak -- -boot /usr/lib64/riak/releases/2.0.1/riak -config /var/lib/riak/generated.configs/app.2014.11.05.18.01.51.config -setcookie riak -name riak@192.168.1.101 -smp enable -vm_args /var/lib/riak/generated.configs/vm.2014.11.05.18.01.51.args -pa /usr/lib64/riak/lib/basho-patches -- console
```

パラメータ -config の引数である下記パスがapp.configである。

/var/lib/riak/generated.configs/app.2014.11.05.18.01.51.config

このファイル内のallow_multを確認する。

```allow_mult確認
# grep allow_mult /var/lib/riak/generated.configs/app.2014.11.05.18.01.51.config
           {allow_mult,false},
```

エェー！
falseじゃん・・・


riak.confにallow_mult=trueを設定する。

```
# vi /etc/riak/riak.conf
```

```diff:/etc/riak/riak.conf
+buckets.default.allow_mult = true
```

そしてRiak再起動

```riak再起動
# systemctl restart riak
```

再度app.configの実態を調べ、allow_multの値を確認

```app.configのパスを確認
# ps -aef | grep riak | grep beam
riak     17535 17532  3 10:42 pts/1    00:00:19 /usr/lib64/riak/erts-5.10.3/bin/beam.smp -P 256000 -e 256000 -Q 65536 -A 64 -K true -W w -zdbbl 32768 -- -root /usr/lib64/riak -progname riak -- -home /var/lib/riak -- -boot /usr/lib64/riak/releases/2.0.1/riak -config /var/lib/riak/generated.configs/app.2014.11.06.10.42.35.config -setcookie riak -name riak@192.168.1.101 -smp enable -vm_args /var/lib/riak/generated.configs/vm.2014.11.06.10.42.35.args -pa /usr/lib64/riak/lib/basho-patches -- console
```

```allow_mult確認
# grep allow_mult /var/lib/riak/generated.configs/app.2014.11.06.10.42.35.config
           {allow_mult,true},
```

よし、OK!
Rubymotion で p メソッドと NSLog メソッドの出力先を Console.app から任意のファイルに変更する


`p` メソッドは stdout に
`NSLog` メソッドは stderr に吐き出しているだけらしい。

+ [p メソッドが stdout に吐いてるのソース](http://www.rubymotion.com/developer-center/api/NSObject.html#p-class_method)
+ [NSLog メソッドが stderr に吐いてるのソース](https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/miscellaneous/foundation_functions/index.html#//apple_ref/doc/uid/20000055-BCIGDBJC)

そして Rubymotion には stdout と stderr の出力先を指定するための環境変数が用意されています。

+ `SIM_STDOUT_PATH`
+ `SIM_STDERR_PATH `

なのでこんな感じの `rake` コマンドを叩くもよし

```
[bundle exec] rake SIM_STDOUT_PATH=/tmp/motion_stdout.log SIM_STDERR_PATH=/tmp/motion_stderr.log
```

`Rakefile` に

```
Motion::Project::App.setup do |app|
    ・
    ・
  ENV["SIM_STDOUT_PATH"] = "/tmp/motion_stdout.log"
  ENV["SIM_STDERR_PATH"] = "/tmp/motion_stderr.log"
    ・
    ・
end
```
と記述するもよし。


活用例
----------------------------

例えばこんな感じに Jenkins の出力をいい感じにするのに使えるようです。おういえー。

+ [RubyMotion アプリを Jenkins でテスト実行してみよう - Watson's Blog](http://watson1978.github.io/blog/2012/12/07/jenkins/)
XCode6(iOS8)で作成したAutolayoutが、iOS7で動かすと落ちる場合

iOS8(XCode6)のAutolayoutで作成した画面を、iOS7で表示すると下記debugメッセージが出て、落ちる場合があります。

**Unable to simultaneously satisfy constraints.・・・・**

AutolayoutのAdd New Constrains時に、Constrain to marginsにチェックをつけていると、iOS7では落ちる場合があるようです。デフォルトでチェックがオンになっているので、注意が必要です。
findで最新ファイルを除外する

いまひとつスマートな書き方が思いつかなかったが、やや無理矢理ながらタイトル通りの振る舞いが出来そうなのでメモ。
「-print0 | xargs -0r ls -l」を「-delete」に置き換えて「最新ファイル以外削除」として使用する目的。

```bash
# ファイル名が不定の場合
find <path> -type f ! -path $(find <path> -type f -print0 | xargs -0r ls -tr | head -1) -print0 | xargs -0r ls -l

# ファイル名に日付が付与される場合
find <path> -type f ! -path $(find <path> -type f -print0 | xargs -0r ls -1 | sort -r | head -1) -print0 | xargs -0r ls -l
```

###実行例
```bash
[test@test tmp]$ ls -l /var/tmp/test*
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060000
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060100
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060200
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060300
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060400
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060500

[test@test tmp]$ find /var/tmp/ -maxdepth 1 -type f -name "test*" ! -path $(find /var/tmp/ -type f -name "test*" -print0 | xargs -0r ls -1 | sort -r | head -1) -print0 | xargs -0r ls -l
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060000
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060100
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060200
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060300
-rw-r--r--. 1 test test 0 11月  6 09:08 2014 /var/tmp/test.201411060400
```

###懸念
ファイル名不定の場合の例について、xargsの後のlsに-trオプションを付与することで日付順に並んでいるはずだが、結果ファイルが大量（xargsの結果復数のlsが起動される）の場合は綺麗に並ばない可能性がある
実運用上はファイル名パターンが決まっていてYYYYMMDDhhmmss順に並べたい…というような状況でのみ使うべきか。
使っている Alfred Workflow 一覧

# Alfred Workflow

とにかく Workflow は便利。
Macを使っていてランチャーに困っているなら試すとたのしい **Alfred** ライフが！

## alfred-encode-decode-workflow

これが、

`encode ひささん`

こうなる。

`%E3%81%B2%E3%81%95%E3%81%95%E3%82%93`

もちろんデコードもできる。

[alfred-encode-decode-workflow](https://github.com/willfarrell/alfred-encode-decode-workflow)

## alfred-github-workflow

githubのサイトに見に行ってもいいんですが、 gh から行くのもいい！

`gh hisasann/dotfile`

[alfred-github-workflow](https://github.com/gharlan/alfred-github-workflow)

## alfred-pkgman-workflow

プログラマーだとありがたくてありがたくて。

対応しているパッケージマネージャがいっぱいあるので、とにかく検索するときに便利。
> bower, grunt, npm, composer, pear, gems, pypi, alcatraz, cocoa, brew, rpm, maven, docker

`bower vue`

[alfred-pkgman-workflow](https://github.com/willfarrell/alfred-pkgman-workflow)

## Alfred-Extras - Colors

CSSのあの数値は何色だっけ？

`#888`

[Alfred-Extras - Colors](https://github.com/TylerEich/Alfred-Extras)


## alfred-dash-workflow

dash にすばやくアクセスできる。
とにかく使う頻度が高い。

`lodash forEach`

[alfred-dash-workflow](https://github.com/willfarrell/alfred-dash-workflow)

## alfred-caniuse-workflow

あれ？HTML5のあの機能IEいくつからだっけ？用

`caniuse svg`

[alfred-caniuse-workflow](https://github.com/willfarrell/alfred-caniuse-workflow)

## AlfredGoogleTranslateWorkflow

デフォルトで入っているTranslateをさらに使いやすくする。

keywordを t にして、

`t en>ja run into`

で翻訳できる。

[AlfredGoogleTranslateWorkflow](https://github.com/thomashempel/AlfredGoogleTranslateWorkflow)

via
[http://blog.mah-lab.com/2014/05/31/realtime-translation-alfred-workflow/](http://blog.mah-lab.com/2014/05/31/realtime-translation-alfred-workflow/)

## ip-address-workflow

グローバルIPとプライベートIPをサクッと見れる。
地味に使う。

`ip`

[ip-address-workflow](http://dferg.us/ip-address-workflow/)

## 491-timezones-a-world-clock-script-filter-updated-to-v17

現地時間すぐ知れる便利。

`tz newyork`

[491-timezones-a-world-clock-script-filter-updated-to-v17](http://www.alfredforum.com/topic/491-timezones-a-world-clock-script-filter-updated-to-v17/)

## alfred2-font-awesome-workflow

font-awesome使いたくなるじゃない！

`fonta`

[alfred2-font-awesome-workflow](https://github.com/ruedap/alfred2-font-awesome-workflow)

## alfred-process-killer

gulp watch してて、やめたいときとかに使ってる。
iTermに移動するのも面倒。

`kill gulp`

[alfred-process-killer](https://github.com/ngreenstein/alfred-process-killer)

## shutdown

シャットダウン、再起動もAlfredからやる。

`shutdown`

## alfred-youtube-workflow

alfredで検索して、そのままダイレクトに動画に。

`youtube みうらじゅん`

[alfred-youtube-workflow](https://github.com/simonbs/alfred-youtube-workflow)

## MissionControlMoveSpace

**拙作**ですが、
画面間の移動をalfred workflow化したもの。

←に移動

`eh`

→に移動

`el`

[MissionControlMoveSpace](https://github.com/hisasann/MissionControlMoveSpace)

# Alfred 便利機能

もはや今更書くまでもないが。

## クリップボード履歴

こうゆう機能がついてくるのもAlfredのにくいところ。

`option + command + C`

## iTunes操作

音楽聴きながらプログラミングしてて、話し掛けられたときにiTunesに行って停止するのではなく、Alfredからやる。

`ctrl + command + enter`

# Alfred の起動ホットキーを何にしているか

`command + ;`

commandキー2回も使っていた時期があるんですが、普段Vimで**:**を**;**で動くようにしているので、**;**にいる率が高いから今はこれがしっくりきてます。
__thread で指定した変数の領域はスレッド終了時に開放されるのか? -> できるだけ使いまわすようです


# __thread キーワード
C++11 以前に処理系が実装していたスレッドローカルストレージ (以下 TLS) のためのキーワード. 動的初期化は行えないため, 静的変数に付与して使用する. MSVC なら __declspec(thread).

# 疑問
スレッドが終了した時に __thread を使用して確保された領域はどうなるのか? 開放されずにメモリリークになったりするのか?

# 検証
```tls_sample.cpp
#include <iostream>
#include <set>
#include <thread>

static std::set<int*> tls_set__;
static __thread int tls__[(1 << 20) / sizeof(int)];

struct Worker {
  int i;
  Worker(int i) : i(i) {}
  void operator()() {
    tls_set__.insert(tls__);
    *tls__ = i;
    std::this_thread::sleep_for(std::chrono::nanoseconds(1));
  }
};

void TLSTest() {
  int i_max = 1 << 10, j_max = 256;
  std::vector<std::thread> threads(i_max);
  for (int i = 0; i < i_max; i += j_max) {
    // スレッドを j_max 個作成
    for (int j = 0; j < j_max; ++j) {
      threads[i + j] = std::thread(Worker(i));
    }
    for (int j = 0; j < j_max; ++j) {
      threads[i + j].join();
    }
  }
  std::cout << tls_set__.size() << std::endl;
}

int main() {
  TLSTest();
  return 0;
}
/*実行結果
142
*/
```

作成したスレッド総数より TLS の数が少ないので, 使われなくなった TLS は回収されて使いまわされるように見える.
スレッド関数内の sleep 時間を伸ばすなどして同時に生きているスレッド数を上げると, TLS 数も増加した.
あまりにも大きなサイズの TLS をたくさんのスレッドで確保すれば静的領域を使い切るかもしれない.

静的領域の大きさは固定なはずだが、TLS に使われる領域はどのように用意している?

# 追検証(VC++で)
```tls_sample2.cpp
#include <iostream>

int main() {
#define PRINTP(x) std::cout << #x << " : " << x << "(" << &x << ")" << std::endl;
  static int static__[1 << 10] = { 1 };
  static __declspec(thread) int tls__[1 << 10] = { 10 };
  static int stack[1 << 10] = { 100 };
  int* heap = new int[1 << 10]; heap[0] = 1000;

  PRINTP(static__[0]);
  PRINTP(tls__[0]);
  PRINTP(stack[0]);
  PRINTP(heap[0]);

  return 0;
}
/* 実行結果
static__[0] : 1(00007FF78FF59000)
tls__[0] : 10(0000004D144640E0)
stack[0] : 100(00007FF78FF5A200)
heap[0] : 1000(0000004D1446EA00)
*/
```

変数のアドレスを見るに, TLS は実はヒープ領域に確保されているようだ. OSX 上で Clang を使って実行しても同様の結果が得られた.

# 参考
http://docs.oracle.com/cd/E19205-01/820-1209/bjabr/index.html
JavaでデプロイしてGo言語でRemote APIを使うには

# 背景

データストアに大量のデータを貯めこみ、そろそろ、取り出して
容量を空ける必要に迫られている。
Remote APIで外部のアプリから吸い出せそうなことは分かっていたので、
GoでもGoogle App EngineのSDKがあるの試そうとした。


# Javaだけパスが違う

GAE/Javaのドキュメントに従い、デプロイするWebアプリのRemote APIを
設定するとGoでは使えない。

PythonやGoだと

```
/_ah/remote_api
```

なのに、Javaのそれでは

```
/remote_api
```

となっている。


## GoのRemote APIに合わせる

JavaのRemote APIはなぜかRemote APIへのパスを設定できたりするが、
GoのAPIはそういうものは無かったので、web.xmlを以下のように編集

```
<servlet-mapping>
    <servlet-name>RemoteApiServlet</servlet-name>
    <url-pattern>/_ah/remote_api</url-pattern>
</servlet-mapping>
```

これで、少なくともGo版のSDKに付属のサンプルからアクセス出来るようになった。
LxrをデプロイするAnsible Playbookを書いてみた

Ansibleの勉強と趣味のため、Lxr (Linux Source Code Indexer and Cross-referencer) をデプロイする Playbook を書いてみました。

いまどきLxrなんて使ってる人おるん？という気もするけれど、9月26日から glimpse （Lxrが対応しているフリーテキストサーチエンジン）の商用利用も可能になり、なにげに利用しやすい状況になってます。


# Lxrを運用しているサイトの例

言わずと知れた有名サイト？

 - Linux Kernel - http://lxr.free-electrons.com/source/
 - Mozilla - http://lxr.mozilla.org/


# PlaybookのGitHubレポジトリ

拙作ですが、こちらに。

 - https://github.com/h2suzuki/ansible-lxr-nupic.core

Readme の通り、今のところ CentOS 6.5 と CentOS7 で動作を確認済み。
さくらクラウド上にも、デプロイできることを確認しています。


# 設定方法

こんな感じ。

```shell-session
$ git clone https://github.com/h2suzuki/ansible-lxr-nupic.core
$ cd ansible-lxr-nupic.core
$ vi hosts
$ vi group_vars/lxr-servers
```

hosts はインベントリファイルのサンプルです。実際にLxrをデプロイする先のマシン名に書きかえます。

また、デプロイ先は事前に ssh を導通させておく必要もあります。すなわち、`ansible -i hosts all -m ping` が成功すること。

group_vars/lxr-servers は設定ファイルの本体です。

例として、[Nupic.core](https://github.com/numenta/nupic.core) をインデックスする設定にしていますが、git clone 可能なレポジトリであれば、任意のレポジトリで OK。

 - `source_tree_url` は Lxr で表示したいソースのレポジトリURL
 - `lxr_tag_vcs` は、表示したいバージョンのタグ
 - `lxr_tree_name` は、このソースツリーの名前（ID）

設定の全デフォルト値は [roles/lxr/defaults/main.yml](https://github.com/h2suzuki/ansible-lxr-nupic.core/blob/master/roles/lxr/defaults/main.yml)にまとめています。


# デプロイ方法

管理サーバにAnsibleをインストールした後、以下のコマンドを実行。

        $ ansible-playbook -i hosts site.yml

ターゲットマシンに lxr と glimpse をインストールし、所望の git レポジトリからソースを cloneしてインデックス生成、最後に Apache の構成もでしてくれます。

全部成功したら、以下のURLにアクセスすると、ソースが表示されるはず。

        http://{{ httpd_server_name }}:{{ httpd_port }}/lxr/{{ lxr_tree_name }}/source

デフォルト設定なら、こちら。

        http://{{ inventory_hostname }}/lxr/nupic.core/source

設定ファイル group_vars/lxr-servers の `lxr_tag_vcs` だけ書き換えて（もしくはコマンドラインから -e オプションで渡して）、以下のコマンドを実行すると、指定のバージョンのツリーを、Lxrに追加してくれます。

        $ ansible-playbook -i hosts site.yml \
          --tags retrieve_source,indexing


# 今後の課題

気が向いたら、取り組む予定。

 - Amazon EC2 で動かせるようにする（途中までやった）
 - Ubuntu で動かせるようにする
 - glimpseやhttpdの部分を、別ロールに分離
 - マルチツリーへの対応
 - Galaxy へ登録
 - SQLite以外のDBへの対応（しないかも）
.gitignoreの注意点


以下を参考に。
http://d.hatena.ne.jp/maeharin/20130206/gitignore

しっかり把握していなかったのでメモ。
`/`で始まっていないものは.gitignoreファイルが置いてある階層以下の全てのファイルに適用されてしまう。

なのでJavaでAntやMavenのプロジェクトを想定して以下のように書いてある場合、

```shell:.gitignore
dist/
target/
```

ソース内(`src/main/java`等)にtargetパッケージがあった場合に無視されてしまう。（targetはJavaの予約語ではないため普通に作成出来る。）

なので、基本的に`/`始まりで書いて、同階層のみに適用されるようにする使い方が良いと思う。勿論、サムネイルファイルなどほぼ使わないと保証が取れているようなファイルは同階層以下全てで適用して良いが。

```shell:.gitignore（同階層のみ指定）
/dist/
/target/
```

マルチモジュールプロジェクトの場合は、Mavenを例に取ると、ルートpomがある場所で全ての定義をするのではなく、上記のような方針で厳密に指定された.gitignoreファイルを、ルートpomがある場所とそのサブプロジェクトのpomがある場所にそれぞれ配置するのが良い。

```shell:Mavenによるマルチモジュールプロジェクト
.
├── .gitignore
├── module1
│   ├── .gitignore
│   └── pom.xml
├── module2
│   ├── .gitignore
│   └── pom.xml
└── pom.xml
```

# 余談

gitignore.io を結構好きで使っていたのだが、かなりカジュアルに全階層適用の.gitignoreを吐いてくる。よく使っている人は上記のような問題があることに留意して使う必要がある。
https://www.gitignore.io/
PHP から Python に浮気しました

PHP の pear で色々コードを書いてきたのですが、composer に移ってからよく分からなくなったので Python に浮気しました。
折角なので新鮮な気持ちが残っている間に、感じた事を徒然なるままに書き綴ります。

# 習作

MIDI(SMF)ファイルをダンプするクラス。
細かい修正を抜きにして基本部分は4時間くらいで移植出来ました。Python 凄い。

- http://d.hatena.ne.jp/yoya/20141105/io_midi

# 移植ツール

- http://sourceforge.net/projects/php2py/
    - 結構間違えるけど、機械的な変換をそこそこやってくれて便利。
    - でも多分、このレベルのなら自分で自作して改善してける気がする。
- http://taichino.com/programming/947
    - phc で PHP をパース出来るらしい。
    - phpの構文木から Python のコードを自動生成するのが良さそう。

# 学習した事

- unpack が色々違う
    - フォーマット文字列が PHP と違う。(流派とかある？)
    - 戻り値の1つ目から使う。(PHP では2つ目から)
- new は使わない。a = Klass() で OK
- print がデフォルトで改行を付けて、第二引数で end="" を付けるのが面倒。
    - sys.stdout.write なら改行付かないし fp で sys.stdout 部分を切り替えられて便利。
    - print_ = partial(print, end="") でカリー化できる
- クラスメソッドの第一引数で self を受け取るのが手間かかって面倒
- クラスメソッドを _ で始めるとプライベートになるらしい。
- 例外は raise Exception("エラー文言") で OK。Exception を継承してもよし。
    - http://docs.python.jp/2/library/exceptions.html#module-exceptions
- PHP の list($a, $b) = $arrayVal が便利だけど、Python は a, b = arrayVal でもっと簡単
- is_null ないけど == None で比較すれば良いし、isset の代わりに has_key がある(但し当然 null の扱いに注意)。
    - (追記 2014/11/6) == None じゃなく is None を使うべき。
    - (追記 2014/11/6) has_key でなく in を使おう
- 日本語変換でパイプやリダイレクトを使うとエラーになる
   - Python2系のstdoutは None(=ascii)なので PYTHONIOENCODING 環境変数で明示的に指定する。
<pre>
 UnicodeEncodeError: 'ascii' codec can't encode character u'\u3048' in position 0: ordinal not in range(128)
</pre>
- 文字列フォーマットは % でなく str.format を使う。
    - str % (a,b) でなく str.format(a,b)
- 通常の連想配列は PHP と違って順序を持たないけど、collections.OrderedDict を使うと順序を持たせられる。
    - 初期化の時の順序だけ維持しない事に注意。後から a[key] = value と追記したものは大丈夫。

# 感じた事

- while(n--) がかけなくて勿体ないお化けが出そう。そもそも n-- が駄目。
- for (.. ;.. ; ..) が出来ないので、ループ条件が分かりにくくなる気がする
- 配列や連想配列を for で回すのに enumerate や items を呼ぶのは、シンタックスシュガーが欲しい気もする。
- 行末に ; が要らないけど、手が勝手に入力するので抑えるのが大変。$ を付けないのは慣れた。
- インデントはあまり気にならない。が、emacs の php-mode は else を1文字上に上げるっぽく、移植時にいちいち修正するの面倒。
- switch 文が使えないけど、break 忘れで酷い目に合うより elif 使った方がいいと思う。ただ、break をわざと書かずに制御するテクを使ってる場所の移植がちょっと面倒。

ちなみに、もう全部違和感なくなりましたw
archiso で Arch Linux ベースのライブイメージを作成するときにハマったこと

需要がなさそうですが archiso を試しまくっててハマったことを羅列します。個人的な備忘録代わりかつめっちゃアドホックな解決法なので、あまり参考にならないような感じ && 偏りがあります。ちなみに archiso が何かを簡単に解説すると、Arch Linux ベースのライブ起動イメージをスクラッチで生成するスクリプト群のことです。カスタマイズする際には、実際に [archlinux.org](https://www.archlinux.org) でインストーラとして配布されているもののスクリプト (`releng`) をベースにいじっていくことになるでしょう。詳しいことや入門っぽい内容は[公式 Wiki](https://wiki.archlinuxjp.org/index.php/Archiso) に全部書いてあるのでそっちを読んでください。

## SLiM や GDM などのグラフィカルログインマネージャを使う
SLiM とか GDM とかを使うときは、`/etc/systemd/system/display-manager.service` に `/usr/lib/systemd/system/slim.service` などのシンボリックリンクを張るわけですが、それに加えて systemd でターゲット (ランレベルみたいなもの) を `graphical.target` に変更する必要があります (`releng` のデフォルトは `airootfs/root/customize-airootfs.sh` で `multi-user.target` に設定されています)。

## 自動起動するユーザを変更する
`airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf` を書き換える

## AUR のパッケージを追加する
`*.pkg.tar.xz` を用意してもいいですが、面倒なので `/pacman.conf` に `archlinuxfr` レポジトリを、`/packages.both` に `yaourt` を追加したうえで `airootfs/root/customize-airootfs.sh` に

```
yaourt -S --noconfirm mikutter softethervpn-git
```

というような感じで記述することでインストールをしてしまいましょう。手っ取り早くやるにはおそらくこれが一番楽です。

## 罠とバッドノウハウ

### core/linux 以外のカーネルをブートするのは極めて面倒
様々なファイルを書き換える必要があります。シェルスクリプトを読みまくることに自信があるのであれば不可能ではないと思いますが、あまり現実的ではないと思います。

### ビルドの途中でコケるとき

work/ をすべて消して、何度かリビルドするとたいていうまくいきます() Key Integrity 周りとかの場合は特にそんな感じでした。mount/umount まわりでエラーが出るときは、マシンからリムーバブルメディアなどをすべてはずしたりリブートしたりすると大抵動くようになります。

## その他

- Antergos という Arch Linux ベースの Linux ディストリビューションのライブイメージは archiso を改造しまくったやつで生成されているので、そのレポジトリを参考にすることが出来ます (が、あまりに魔改造されているのでよくわからないところのほうが多いです、、):  https://github.com/Antergos/antergos-iso
ネット界の萌えキャラ対決！ ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

![](https://admin.appiaries.com/imgs/melissa_hint.png)

この娘の名前はメリッサでいいのかな？あってます？

↑はmBaasの appiaries http://www.appiaries.com/jp/ のキャラです。

MSのクラウディアもいいよ

![](http://i.msdn.microsoft.com/hh184191.Cloud_ep0_c01(ja-jp,MSDN.10).jpg)

MashupAward でクラウディア素材利用も許されていたし、ふところ深いな。

http://msdn.microsoft.com/ja-jp/claudia00_01.aspx
ruby から appiaries へのファイル保存と取り出しをやってみたよ。Googleから提供されたマテリアルデザインアイコンを入れてみた。ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

**appiariesってタイプしにくいよね**

↓の萌え子ちゃんはappiariesの公式キャラクターで、管理画面（ダッシュボード）で利用の際のヒントをくれます。海外のサービスにはまずありえないと思うので、この点、parse.com なんかよりはるかに優れていると思います :+1:
![appiaries](https://admin.appiaries.com/imgs/melissa_hint.png)

ちなみにappiariesの無料プランはディスク容量100MBですが、parse.comは20GB以上使えます。**たった200倍の違いです。** :smile:

今回もruby使ってappiariesへのファイル保存と取り出しをやってみたいと思います。Googleから提供されたマテリアルデザインアイコンを入れてみました。

# Google提供のマテリアルデザインアイコンについて

↓こういうのです

![Material Design Icons](https://cloud.githubusercontent.com/assets/110953/4679627/91f05e76-5603-11e4-9d59-27aa01e1c669.png)

マテリアルデザイン化された750個のアイコンをGoogleが配布 | オクトバ - http://goo.gl/nF0BkN

# ruby の rest-client 使います

```rb
require 'rest_client'
```

https://github.com/rest-client/rest-client

# appiaries は国産のmBaasです

http://www.appiaries.com/

# 早速書いていきますね

## ファイルのアップロード

前回 http://qiita.com/scleen_x_x/items/eef3a663e3a74b0c1675 で書いたのと同じです。


```rb
      ret = JSON.parse RestClient::Request.execute(
        :method => :post,
        :url => uri,
        :payload => {
          :multipart  => true,
          :_file      => File.read(filename),
          :_id        => fileid,
          :_type      => "image/jpeg",
          :_tags      => "thumbnail",
          :_filename  => filename
          },
        :headers => {'X-APPIARIES-TOKEN' => @appiaries_app_token, 'Content-Type' => 'multipart/form-data'}
      );
```

こんな感じでファイルをアップロードできます。簡単ですね。@appiaries_app_token にはappiariesから提供されたTOKENを指定してください。

### appiaries 側のパーミッション設定

appiaries 側にファイルを保存するコレクションのパーミッション（権限）設定で「登録と参照を全員」に指定します。これは認証を回避するためです。きちんとした会員制システムとかにするなら、それにあった権限の設定にしてね :smiley: 

### オブジェクトIDの文字数制限20文字は本当にダメ

20文字は短すぎると思うんですけど・・・ :-1: 

Google は諸々のオブジェクトのIDの長さ32文字ぐらいとっているし・・・ファイル名をベースにしたIDも20文字だと作れない。これは困るなー。

## ファイルのダウンロード

ダウンロード用のURLは最後に _bin をつけた形式になる。こんな感じです。

https://api-datastore.appiaries.com/v1/bin/_sandbox/material_icons/png/alarm_on/_bin
![](https://api-datastore.appiaries.com/v1/bin/_sandbox/material_icons/png/alarm_on/_bin)

https://api-datastore.appiaries.com/v1/bin/_sandbox/material_icons/png/shopping_basket/_bin
![](https://api-datastore.appiaries.com/v1/bin/_sandbox/material_icons/png/shopping_basket/_bin)

### https のみで http は使えない

こんな感じでパブリックに公開できる場合でもhttpsオンリーで、httpではアクセスできないようです。404戻ります。

ちなみに、 parse.com では保存したファイルは http ベースで公開されます。

おしまい

ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい
Sublime Text 3 Default Install Plugin

## Sublimeのプラグインまとめ
Sublimeの設定ファイルが吹きとんで、何故かBackupも取れてなかったのでなくなく入れ直した。
大体、最低限利用するためのプラグイン。(忘れているくらいなら多分利用してない)
今後も増えそう。

* Abacus
* AutoPrefixer
* AdvancedNewFile
* Alignment
* All autocomlate
* AndyPHP
* AngularJS
* AngularJS Snipets
* AutoFileName
* Better CoffeeScript
* Better TypeScript
* Bless CSS
* Bootstrap 3 Jade Snipets
* Bootstrap 3 Snipets
* Bower
* BracketHighLighter
* Can I Use
* cdnjs
* Codecs33
* color Highlighter
* colorcoder
* colorpicker
* CSS Media Query Snippets
* CTags
* Compass
* ConvertUTF8
* CSS Comb
* DocBlocker
* Dotfiles Syntax Highlighting
* Emmet
* Evernote
* FileDiffs
* FindKeyConflicts
* GitGutter
* Goto-CSS-Declaration
* Grunt
* Gulp
* Hayaku - tools for writing CSS faster
* HTML Mustache
* HTML5
* HTMLAttributes
* Image2Base64
* Inc-Dec-Value
* Jade Snippets
* Jade
* JavaScript Console
* JavaScript Snippets
* jQuery Mobile Snippets
* keymaps
* LESS
* List LESS Variables
* List stylesheet variables
* Local History
* Markdown Extended
* Markdown Preview
* MarTerminal
* More Layouts
* Pandoc
* Phpcs
* Pretty JSON
* Python 3
* Python Auto-Complete
* Quick File Open
* RecentActiveFiles
* Ruby Slim
* RubyTest
* SCSS
* SCSS snipets
* SFTP
* Search StackOverflow
* SideBarEnhancements
* SidebarGit
* Smart Delete
* stylus
* stylus snipets
* Sublime Files
* SublimeERB
* sublime-linter-coffee
* SublimeLinter-contrib-scss-lint
* SublimeLinter
* SublimeLinter-jshint
* SublimeCodeIntel
* TabsExtra
* Terminal
* Tag
* TrailingSpaces
* WordCount
* WordHighlight
Redmineのチケット更新の競合時の動作

1.4.0 から入っていたのに、今まで知りませんでした。

http://www.redmine.org/projects/redmine/repository/entry/branches/1.4-stable/doc/CHANGELOG#L157

```
* Feature #8691: Better handling of issue update conflict
```

"Better handling of issue update conflict"
http://www.redmine.org/issues/8691

以下の画像は、同じチケットを同時に更新しようとして、編集内容の送信を後から実行した側に表示された内容です。

「このチケットを編集中に他のユーザーが更新しました。」のところに更新内容が 2 つ表示されていて、自身が編集を開始する時点から送信する時点までの、他のユーザーの更新内容が個別に表示されると分かりました。

![redmine_issue_update_conflict.png](https://qiita-image-store.s3.amazonaws.com/0/38075/26bd0726-68c7-8c98-6744-ea8d90ed0928.png)

競合時には以下の 3 つから選択できるようです。

* 自分の編集内容の保存を強行 (他のユーザーの更新内容は注記を除き上書きされます)
* 自分の編集内容を破棄し注記のみ追加
* 自分の編集内容を破棄し バグ #13 を再表示
PI の中にRaspberryはいくつ？を Elixir で解く #elixir #codeiq

# PI の中にRaspberryはいくつ？を Elixir で解く #elixir #codeiq
## 概要
私が CodeIQ で出題した「[PI の中にRaspberryはいくつ？](https://codeiq.jp/ace/tbpgr/q1056)」
を Elixir で解きます。

## 問題
問題文の引用はできないので、プログラムから察してください。

## コード

~~~
pi = '1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989'

IO.puts pi |> Enum.chunk(2)
           |> Enum.map(&(to_string(&1)))
           |> Enum.map(&(String.to_integer(&1)))
           |> Enum.count(&(&1 + 97 in 'raspberry'))
# => 31
~~~

※まだ簡略化できそう？
sonar-web-pluginにJSPをチェックさせる方法

sonar-web-pluginはJSPのチェックをできますと書いてありますが、
デフォルトだとできません。
sonar-web-pluginに独自のチェックを入れる必要があったため（ http://qiita.com/sh-ogawa/items/dc101f97ce49161d5ab2 ）、ソースを直接触ってJSPをチェックできるようにする方法を紹介します。
※そんなやり方しなくてもできますよ！という方おりましたら、教えてください。。

以下のクラスを編集します。
org.sonar.plugins.web.api.WebConstants

この中に、「FILE_EXTENSIONS_DEF_VALUE」という定数があるので、書き換えします。
デフォルトでは、「".html,.xhtml,.rhtml,.shtml";」となっています。
これを「".html,.xhtml,.rhtml,.shtml,.jsp";」とすれば良さそうなのですが、
これだとなぜか動きません。どう頑張ってもjspファイルを見てくれないので、
私は以下としました。
「".html,.jsp";」

この状態でjarを作って、{SONAR_HOME}/extension/pluginに配置し、再起動すると無事にjspファイルのチェックも走るようになりました。
RailsでIDをURLに露出させないようにする

例えば以下のようなメソッドでRailsのroutingを使ったURLを出力する場合を考えます。

以下のようなクラスを想定

```rb
class Post < ActiveRecord::Base
end
```

```rb
$ post_path(@post)
http://127.0.0.1/post/1
```

これだとPostが連番なことがバレて攻撃をされやすいです。

そこで、ID難読化のgemが`obfuscate_id`があります。
これを使うと、

```rb
class Post < ActiveRecord::Base
  obfuscate_id
end
```

のように宣言したクラスでURLを生成。

```rb
$ post_path(@post)
http://127.0.0.1/post/428374365
```

このように難読化されるので連番の攻撃などはできなくなります。
仕組み的には`id`はそのままで`to_param`に難読化後の値が出ます。

でも、このgemは困ったことに既存の`find`メソッドを上書きするため、`posts.foo_ids=`のようなAssociation用のidの`find`にも適用され、formからのデータ更新で`to_param`ではなく`id`を使っていた場合（ほとんどがそうだと思いますが。。。）エラーになってしまいます。
また、Associationに対する`offer.posts.find`の時は難読化のidは使えないなど挙動が一定でないです。

なので、forkして新しく[obfuscatable](https://github.com/dtaniwaki/obfuscatable)という難読化がoptionalなgemを作りました。

これを使う場合は

```rb
class Post < ActiveRecord::Base
  obfuscatable
end
```

のように宣言し、

今まで`find`で難読化されたidを受けていたところを`find_obfuscated`にします。
Associationに対する`find`も`find_obfuscated`のように一貫した使い方ができます。

元ネタのgemには感謝ですが、こっちの方がかなり使いやすいです。
皆さんも是非。
sonar-web-pluginに独自のチェックをさせる方法

題名にsonar-web-pluginに独自のチェックをさせる方法と書きましたが、
現状存在しないと、Stack Overflowに書いてありました。。。

なので、今回はsonar-web-pluginをgitから落としてきて改造する方法になります。

前提：独自チェックするコードは既にあるものとし、今回はそれをsonarのプラグイン上で動くようにします。

準備：githubからソースを落とす。以下から取れます。
https://github.com/SonarCommunity/sonar-web.git

落としたら、Eclipseか何かに取り込んで早速編集開始。
１．既にあるチェックモジュールを必要なパッケージごと、
　　「src/main/java」にコピーして引越ししましょう。

２．チェックモジュールを登録します。
　　以下のソースに独自のチェックを行うクラス(MyCheck)を書き足しします。
　　クラス名：org.sonar.plugins.web.rules.CheckClasses
<pre>
　　private static final Class[] CLASSES = new Class[] {
          ・・・
      MyCheck.class
   };
</pre>

３．SonarQubeのプロファイルに表示されるルール名を登録します。
　　以下のテキストファイルにキーバリューで登録します。
　　ファイル：src/main/resources/org/sonar/l10n/web.properties
　　設定値：rule.Web.MyCheck.name=My Checker

４．独自チェックで引っ掛かった場合のソリューションをhtmlで提供します。
　　以下に、３で書いた設定値のキー（MyCheck）.htmlというファイルを追加し、
　　そこに記載します。
    htmlを置く場所：src/main/resources/org/sonar/l10n/web/rules/Web

５．独自チェックを行うソースをsonarプラグインとして動くようにします。
①classにアノテーションを付けて、「AbstractPageCheck」を継承する。
以下のような感じになります。
<pre>
@Rule(key = "MyCheck", priority = Priority.MAJOR)
@WebRule(activeByDefault = true)
@RuleTags( {RuleTags.CONVENTION, RuleTags.JSP_JSF, RuleTags.HTML5} )
public class MyCheck extends AbstractPageCheck{
　　・・・
}
</pre>
@Ruleのkeyに指定しているのは、３，４で書いた設定値のキーです。
@RuleTagsは、SOnarQubeの品質プロファイルにみたときに、何のチェックがされるかというのをGUIで可視化してくれます。（自己申告ですが。）

②デフォルトのコンストラクタは暗黙で呼ばれるので、行いたい初期処理があれば、入れておきます。

③public void startDocument(List<Node> nodes) をオーバーライド実装します。
これは、1ファイルの読み込みが開始したときに呼ばれるメソッドです。
このメソッドの上で実際のチェックを走らせます。
ファイル自体は以下のメソッドで取れるので、元のチェックがFileが渡される作りであるならば、以下メソッドで取って渡せば、全て同じに動きます。
メソッド：super.getWebSourceCode().getFile();

④チェックに引っ掛かったら、以下のメソッドを呼んで、違反を知らせます。
 チェックが終わると、まとめて書かれます。

　createViolation("違反が発生した行番号", "違反メッセージ");

書くのはこれだけです。
これをビルドしてjarファイルを作成しなおし、
{SONAR_HOME}/extension/pluginの下に置いて、SonarQubeを再起動すれば、独自チェックが走るようになります。
Travis CI で API キーなどの秘密情報を使ったテストを行う方法

問題
----

API キーなどの秘密キーを Travis CI のテストに使いたいが、
github のリポジトリには残したくない。
ここでは、環境変数 API_KEY を実行時に使いたいとする。

解決方法
-------
travis コマンドを使う

1 . インストール

```bash
sudo gem install travis
```

2 . 暗号化 する

```bash
travis encrypt "API_KEY=xxxxxxxxxx"
```

すると、こんな感じの出力がされる。

```bash
secure: "someEncryptedKey"
```

3 . `.travis.yml` に次の2行を追加。secure は、さっき実行したもの。

```yaml
env:
 - secure: "someEncryptedKey"
```

これで、 Travis CI での実行時に env に API_KEY=xxxxxxx が
設定された状態で実行される。

参考
----
http://noboru.hatenablog.jp/entry/2014/07/22/225914
連番のホストに続けてsshアクセスする

以下のようにするとhost-1, host-2, ... host-9, host-10に対してhost-1からsshアクセスを行い、
ログアウトすると次のホストにsshアクセスするという挙動になります。

```bash
for host in host-{1..10}
do
    ssh ${host}
done
```

今使っている環境ではホスト名を連番で定義して管理していて、
たまに複数のホストで同じコマンドを打ちたいことがあるので、
↑のような内容をワンライナーでたたいて作業しています。
(そもそもAnsibleとか使えばいい話ですが...)
SonarQubeで複数プログラム言語の品質を測定する方法

SonarQube4.2から複数プログラム言語の品質を１つのプロジェクトで集められるようになりました。
ちょっとはまったので、その備忘録を残しておきます。
（mavenでの解説です。）

複数プログラム言語の品質を収集できるようになったとはいえ、
デフォルトの設定では動きません。

SonarQube4.2から「sonar.sources」のプロパティが追加されています。
このプロパティ、デフォルト値が「src/main/java」です。。。
なのでデフォルトだと結局Javaの品質しか集めません。。。

pomのプロパティに以下を追加だけで、複数プログラム言語の品質を収集するようになります。
※sonar-web-pluginやsonar-javascript-pluginは先に入れておく必要があります。

\<properties\>
　　\<sonar.sources>src/main\</sonar.sources>
\</properties\>

これで、src/main以下のソースを全て読み込むようになりますが、
jqueryなどのライブラリが入っていると、これも読み込む対象とされてしまうので、
こういうものは、「sonar.exclusions」で除外しておきます。
以下のようにします。

\<properties\>
　　\<sonar.sources>src/main\</sonar.sources>
　　\<sonar.exclusions>src/test/\*\*/*.java,*\*\*/*\*jquery*.js\</sonar.exclusions>
\</properties\>

上記はテストコードとjqueryを抜く、と宣言しています。

この状態で「mvn sonar:sonar」を実行すれば複数プログラム言語の品質プロジェクトが作られます。

また、上記プロパティをmavenの引数に与えた場合は、上手く値が適応されず「src/main/java」になってしまうので、SonarQube4.2ではpomに書いておく必要がありました。
テキスト言語には記号が足りない

Cに限った話ではないが、演算子には記号が使われている。
そして1文字の演算子と複数文字の演算子がある。
バグは複数文字の演算子を使うときに発生しやすいと思う。

```cpp
//例
if( x == 1 ) {} //比較演算子
if( x = 1 ) {}  //代入演算子
```

前者は普通だが後者は大抵バグである。
イコールが悪いわけではないが、文字の過不足で解釈可能な演算子になると不都合が多い。
<=、>=、-=、+=などイコールになりえるものが多い。
一文字でこれらを意味する演算子を用意できればいいが、ASCIIの範囲では無理であろう。
UNICODEでも何でも良いので結合記号を作って、IDEで複数文字で構成される演算子を自動で置換してくれるようにしてくれないかな。
置換後にBackspaceを押しても分解されないようになっていれば、ミスは減るだろう。
ただし、=、==、===などは結合しても見間違えそうなので別な記号を割り当てるべきだ。

結局は記号が無いから複数の記号を並べているわけで、あればそっちを使うだろう。
Elixir Pipe Operator #elixir

# Elixir Pipe Operator

## 概要
Elixir の Pipe Operator について。

Unix のパイプのような Pipe Operator があることで、
プログラムの記述をシンプルにできます。

例えば、以下のような処理があったとします。

~~~
nums = (1..100)
first_10_nums = Enum.take(nums, 10)
add_one_nums = Enum.map(first_10_nums, &(&1+1))
total = Enum.sum(add_one_nums)
# => 65
~~~

一時変数を利用せずに呼び出した場合、

~~~
Enum.sum(Enum.map(Enum.take((1..100), 10), &(&1+1)))
# => 65
~~~

括弧だらけになった上に、真ん中から読み解く必要があり
非常に読みにくいです。

これを pipe operator を利用した記述に変更すると

~~~
(1..100)
  |> Enum.take(10)
  |> Enum.map(&(&1+1))
  |> Enum.sum
# => 65
~~~

とてもわかりやすくなります。
pipe operator は pipe の前の処理結果を次の処理の第一引数に自動的に渡します。