OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxにて削除(rm)してしまったファイルを復元する【CentOS】


まぁたまにありますよね。
AWSのEC2にてCentOSなサーバーで実行しました。

#extundeleteをインストールする

```
# cd /tmp
# mkdir extundelete
# curl -L http://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2/download | tar xj
# cd extundelete-0.2.4
# ./configure --prefix=/tmp/a && make && make install
```

#インストール時のエラーあれこれ

###1

```
Configuring extundelete 0.2.4
configure: error: in `/tmp/extundelete/extundelete-0.2.4':
configure: error: C++ compiler cannot create executables
See `config.log' for more details
```

→gcc-c++をインストールする

```
# yum install gcc-c++
```

###2

```
Configuring extundelete 0.2.4
configure: error: Can't find ext2fs library
```

→e2fsprogs-develをインストールする

```
# yum -y install e2fsprogs-devel
```

それぞれを実行してから

```
./configure --prefix=/tmp/a && make && make install
```

をしたらインストールできました

# ファイルを復元する

まずは自分のファイルシステムを確認

```
$ df -hT
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
/dev/xvda1     ext4       9.8G  4.1G  5.6G   43% /
devtmpfs       devtmpfs   491M   56K  491M    1% /dev
tmpfs          tmpfs      499M     0  499M    0% /dev/shm
```

（AWSのEC2でCentOSだとみんな/dev/xvda1だった気がする）

下のコマンドで1時間前までに削除してしまったファイルを全て復元する

```
# /tmp/a/bin/extundelete --restore-all --after $(date +%s -d '1 hour ago') /dev/xvda1
```

（ちゃんと調べてないからわからないけど2時間前だったら'2 hour ago'にすればいいんじゃないかな）

そうすると実行した階層に`RECOVERED_FILES`というディレクトリができているので、その中に削除してしまったファイルが復元されてます。

今度は間違えないようにcpやらmvやらしてあげてくださいねー！
dns.jsonを参照する from Deploy Hook や Custom Chef Recipe

## 概要

Engine Yard Cloudでは、インフラをカスタマイズするCustom Chefと、deployプロセスにフックを入れるDeploy Hookという仕組みがある。
そのなかで、インフラ設定の値を参照したいときに、nodeという変数を使うことができる


## 参照の仕方

### Custom Chef

各レシピの中で、node変数から参照できます。

```
node[:engineyard]
```


#### Deploy Hook

Ruby コードで、config.nodeいかにアクセスできます。

```
config.node[:engineyard]
```


### 例

ElasticSearchのUtility Instanceに対して処理をする

```rb
if node[:name].match(/elasticsearch/i)
  # ... do things here ...
end
```

PHPのWeb Rootを取得する

```rb
repo = "git://github.com/engineyard/howto.git" # plz replace your own

app_info = node[:engineyard][:environment][:apps].select{|app| app.values.include? repo}.first
web_root = app_info[:components].select{|comp| comp.keys.include? "php_webroot"}.first['php_webroot']
```


## 参考

https://blog.engineyard.com/2014/engine-yards-chef-node-object
https://support.cloud.engineyard.com/entries/22329616-デプロイフックの利用?locale=67
https://support.cloud.engineyard.com/entries/30566833-Chef-Recipe%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%AF?locale=67
Mac OS Xにmitmproxyをインストールする

Mac OS Xにmitmproxy（man-in-the-middle proxy）をインストールする方法についてのメモです。

# 環境

対象の環境は以下の通り。今回は、Pythonはシステム標準のものを使います。また、Xcode Command Line Toolsが別途必要です。

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.10.1
BuildVersion:	14B25
$ uname -a
14.0.0 Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64 x86_64
$ python -V
Python 2.7.6
```

# pipをインストールする

Pythonのパッケージ管理システムであるpipをインストールします。今回はユーザのホームディレクトリ以下にインストールします。

```
$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py --user
...
Installing collected packages: pip
```

# mitmproxyをインストールする

続いてmitmproxyをインストールします。pipをホームディレクトリ以下にインストールしたため、PATHを通す必要があります。

```
$ PATH=$PATH:~/Library/Python/2.7/bin
$ pip --version
pip 6.0.6 from /Users/USERNAME/Library/Python/2.7/lib/python/site-packages (python 2.7)
$ pip install --user mitmproxy
```

# mitmproxyのバージョンを確認する

`mitmproxy`コマンドの`--version`オプションでバージョンを確認することができます。

```
$ mitmproxy --version
mitmproxy 0.11.3
```

もし、以下の様に「PyOpenSSLのバージョンが古い」旨エラーメッセージが表示されたら、PyOpenSSLを更新する必要があります。

```
$ mitmproxy --version
You are using an outdated version of pyOpenSSL: mitmproxy requires pyOpenSSL 0.14 or greater.
Your pyOpenSSL 0.13.1 installation is located at /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/OpenSSL
$ sudo easy_install --upgrade PyOpenSSL
$ mitmproxy --version
mitmproxy 0.11.3
```

# 参考

* [mitmproxy 0.11.3 - Installation](http://mitmproxy.org/doc/install.html)（公式ドキュメント）
Backbone.js で View が所有する Model を指定する2パターンの違いについて

JS を触るときには常識として押さえておくべき話だと思うのですが、 Backbone.js で View が所有する Model の指定方法についてハマってしまったので。

```js:パターン1：プロパティでインスタンス化する
var View = Backbone.View.extend({
    model: new Model, // Model は Backbone.Model を extend したオブジェクト
});
var view = new View();
```

```js:パターン2：initializeメソッド（コンストラクタ）でインスタンス化する
var View = Backbone.View.extend({
    initialize: function() {
        this.model = new Model(); // Model は Backbone.Model を extend したオブジェクト
    }
});
var view = new View();
```

一見すると、 **パターン1** と **パターン2** は同じことをやっているように見えますが、全く違うことをやっています。

|パターン|説明|
|:--|:--|
|パターン1|View オブジェクトを宣言したときに Model がインスタンス化される|
|パターン2|View オブジェクトがインスタンス化されるときに Model もインスタンス化される|

>当然ながら、Collection についても同様です。

この違いを頭に入れて、有効に使い分けられると良いですね :blush: 
（僕は失敗しました）

突っ込みどころ、誤った認識をしている箇所がありましたら是非ご指摘ください。
Swiftで再帰的enum片方向リンクリスト

面白いです。こんなアプローチがあったのに驚いたので書いてみます。
一段クラスでラップすることで再帰的な構造は可能です

```swift

class Box<T> {
    let unbox: T
    init(_ value: T) {
        self.unbox = value
    }
}

enum List {
    case Terminator
    case Node(Int, Box<List>)
}

func list_to_string(list: List, text: String = "") -> String{
    switch list {
        case let List.Terminator:
            return text + "terminator"
        case let List.Node(value, next):
            return list_to_string(next.unbox, text: text + "\(value), ")
    }
}

let list = List.Node(1, Box(List.Node(2, Box(List.Node(3, Box(List.Terminator))))))
let text = list_to_string(list, text: "")
print(text)

```


Functional Programming in Swift
http://www.objc.io/books/

を大変参考にしています。
Dock に並んでいる実行中アプリケーションの一覧を取得する

`-[NSWorkSpace runningApplications]` で、現在のユーザーが実行中の Mac アプリケーションの一覧を取得できる。 そのうち、 Dock に表示されるアプリケーションの `activationPolicy` は  `NSApplicationActivationPolicyRegular` になっている。

```swift:ListDockApps.swift
import Cocoa

let runningApps = NSWorkspace.sharedWorkspace().runningApplications as [NSRunningApplication]
let regularApps = runningApps.filter {
    $0.activationPolicy == NSApplicationActivationPolicy.Regular
}
let appNames = regularApps.map { $0.localizedName! }

println(appNames)
```

```text:出力
[Finder, OmniFocus, Safari, MacDown, Google Chrome, カレンダー]
```

参考：[NSRunningApplication Class Reference](https://developer.apple.com/library/mac/documentation/AppKit/Reference/NSRunningApplication_Class/index.html#//apple_ref/occ/cl/NSRunningApplication)
(翻訳) Ruby 2.2 のシンボル GC

Ruby 2.2 の新機能にシンボル GC というものがあります。  
正直、「え、シンボルって GC されないから速いんじゃないの？なのにシンボル GC で Rails が速くなるとか話聞くけど、いったいどういうことなの？」という感じでサッパリ理解できてなかったのですが、その辺りの疑問に対してまとめられている記事がありました。  
[Symbol GC in Ruby 2.2](http://www.sitepoint.com/symbol-gc-ruby-2-2/)  
とても分かりやすく素晴らしい記事だと感じたので、許可をもらって日本語訳を公開しました。

[(翻訳) Ruby 2.2 のシンボル GC](http://fiveteesixone.lackland.io/2015/01/21/symbol-gc-ruby-2-2/)

※本当はQiitaにも全文載せようと思ってましたが、著作者にURLを報告してリンクを載せることになったので、ここではブログの日本語訳への誘導のみで失礼します。
YEOMANを触ってみた。

そういえば、年始に[YEOMAN](http://yeoman.io/)の勉強会に参加してきたので、メモ。
”デザイナー向け”　”初心者歓迎”　のハンズオン形式とのことで、
多分...大丈夫！と思って参加してみたものの、参加者のほとんどがプログラマーさんで新年早々不安で押しつぶされそうにもなったけど、私は元気です。

以下、サンプルをいじったりするまでのメモ。

#YEOMAN

YEOMANってなんだろうって場合はこのあたりよめばなんとかなると思う。

Gruntで始めるWeb開発爆速自動化入門（終）：あなたのWeb開発人生を変えるYeoman、Bower、Yoのインストールと使い方 (1/3) - ＠IT
http://www.atmarkit.co.jp/ait/articles/1407/02/news040.html


#インストール

[公式](http://yeoman.io/codelab.html)を見つつ自力でインストールしてみるものの、さっそくエラー...。
今回はnodeのバージョンをあげたら無事解決した。  
ちなみにバージョンをあげる前に一度アンインストールが必要らしい…。
あと、nodebrew使うとnodeのバージョン管理してくれるので便利とのこと。

* 参考：[Mac OS X から Node.js をアンインストールする方法](http://d.sonicjam.co.jp/post/52541343939)
* 参考：[node.jsのversionを管理するためにnodebrewを利用する - Qiita]
(http://qiita.com/sinmetal/items/154e81823f386279b33c)

詳しいインストール方法は公式か下記のブログを参考に

* [Let's Scaffold a Web App with Yeoman | Yeoman](http://yeoman.io/codelab.html)
* [YEOMANをインストールしよう！（だけど解説はMACだけね）](http://albatrosary.hateblo.jp/entry/2014/03/23/105356)


#ローカル立ち上げ

```
grunt serve
```

をうつとlocalhost:9000 (127.0.0.1:9000からでもアクセスできる）がたちあがるので、そこでこんな画面が見えてたらOK

![yeoman.jpg](https://qiita-image-store.s3.amazonaws.com/0/3140/d0d7d8b4-cfcc-f927-5be1-457ccb79d1c8.jpeg)

#テンプレートをいじってみる

`views/main.html`　をいろいろいじるとライブリロードで反映される。

karmeってのはテンプレートらしい。
このあたりについてはまだちゃんと調べてない。

ファイル構造とか設定ファイルの書き方はいろいろ参考になりそうなので、
現状のMy Gruntファイルにも取り入れたいなーと思った。

##todoリストを作ってみる

公式にAngularJSでtodoリストを作成するチュートリアルがあるので、実際作ってみることに。
[Let's Scaffold a Web App with Yeoman | Yeoman](http://yeoman.io/codelab.html)

心やさしいい人が動画を上げてくれているから、英語でつまずいても大丈夫。
[【動画】Yeoman で AngularJS アプリケーションを作ろう！]
(http://angularjsninja.com/blog/2014/09/02/video-angularjs-app-with-yeoman/)

AngularJSについてそんなに知識がない自分でも
なんかそれっぽいのができていくのが楽しかった。


# おすすめのGenerator

Generatorはここから検索できる
[Generators | Yeoman](http://yeoman.io/generators/)

勉強会では[angular-fullstack](https://github.com/DaftMonk/generator-angular-fullstack)がいいみたいなことを言ってた気がする。
（参考:[AngularJSでWebアプリケーションを作ろうと思った時に構成に悩んだら、generator-angular-fullstackからはじめるのが良いのでは]
(http://blog.mah-lab.com/2014/02/01/angular-fullstack/))

自分の場合Angular.jsを案件で使うことはないので、
他にどういうのがあるのか聞いてみたところ
[web app](https://github.com/yeoman/generator-webapp) がいいんじゃないかとのこと。
Sass・Bootstwrap・Modernizrとか入ってるっぽい。

その後自分でも色々みてたら polymer とか気になるのもあったので、
気が向いたらいじってみようかなーと思う。

ちなみに後日Wordpressを触ることがあったので、
YeoPressをインストールしてみるもなぜか玉砕したので、
近日リベンジ予定…。

#おまけ
yo yo を打つとでてくる。
全然役立つ情報でもないけれど、表示されるとなぜかすごくうれしい。

![yoyo.jpg](https://qiita-image-store.s3.amazonaws.com/0/3140/4fe08873-3711-0aaf-926d-7276c5400da7.jpeg)


#他参考サイトなど

[EOMAN Advent Calendar 2014](http://albatrosary.hateblo.jp/entry/2014/03/23/105356)
アプリ独自のURIを簡単にテストする方法

```xml
<activity android:name=".MyActivity">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="myscheme" android:host="example"  />
  </intent-filter>
</activity>
```
のような`<intent-filter>`指定をしたときに簡単に動作を確認する方法。
下記コマンドを実行するだけ！

```bash
adb shell am start -a android.intent.action.VIEW -c android.intent.category.DEFAULT -d "myscheme://example"
```

* `-a`: アクション
* `-d`: データ(URI)
* `-c`: カテゴリ

をそれぞれ指定できます。
CCLabelBMFontで自動改行を有効にする(cocos2d-x v2.x)

よく使われるであろうCCLabelTTFでは、適当に文字列を並べてラベルのwidthさえ指定しておけば、自動的に改行される仕組みになっています。

が、

CCLabelBMFontはラベルのwidthを指定しても自動で改行されません・・・。画面外にぶち抜けて表示されていきます。

（自動改行機能はないのか・・。これは辛いぞ・・。）

と思っているかもしれませんが、実はあります。

早速設定してみましょう。


```cpp:sample
    CCLabelBMFont *hogeLabel = CCLabelBMFont::create("はろーわーるど。Hello World!", "hoge.fnt");
    hogeLabel->setWidth(100);
    hogeLabel->setLineBreakWithoutSpace(true); //defaultがfalseになっている

```

こんな感じです。
CCLabelBMFontにはsetLineBreakWithoutSpaceというメソッドが用意されています。
こちらをtrueにしてあげれば自動で改行されるようになります。

あ、もちろんwidthの設定は忘れないようにしてくださいね。（当たり前ですけど。。）

widthはcreate時に第３引数として渡すことも出来ます。

```cpp
    CCLabelBMFont *hogeLabel = CCLabelBMFont::create("はろーわーるど。Hello World!", "hoge.fnt", 100);
    hogeLabel->setLineBreakWithoutSpace(true);
```

ただ、この自動改行設定すると、文字列の表示がバグることがあるんですよね〜・・自分がサンプルで作ってたものだけだろうか・・。


ちなみに意図的に改行させることはもちろん可能です。
\nを文字列に入れるだけですね。

```cpp
    CCLabelBMFont *hogeLabel = CCLabelBMFont::create("一行目。\n 二行目。", "hoge.fnt", 100);
```

それでは。
[Swift] 関数内関数を返す関数と関数リテラルを返す関数の違いを調べた

（誤字修正）

結論：違いなし。

# a.swift 関数内関数を返す
```swift:a.swift
func KONISHIKI(ASASHORYU: Int) -> (() -> Int) {
    func TAKAMISAKARI() -> Int {
        return ASASHORYU
    }
    return TAKAMISAKARI
}
```

# b.swift 関数リテラルを返す
```swift:b.swift
func KONISHIKI(ASASHORYU: Int) -> (() -> Int) {
    let TAKAMISAKARI = { ASASHORYU }
    return TAKAMISAKARI
}
```

# コンパイル
xcrun というのを使うと LLVM が書き出されるらしい。

```bash
xcrun swiftc -emit-ir a.swift > a.txt
xcrun swiftc -emit-ir b.swift > b.txt
```

# diff
```
diff a.txt b.txt
```

すると、次のようになる（Markdown でわかりやすいように色をつけている）

```diff
11c11
- @llvm.used = appending global [1 x i8*] [i8* bitcast ({ i8*, %swift.refcounted* } (i64)* @_TF1a9KONISHIKIFSiFT_Si to i8*)], section "llvm.metadata", align 8
+ @llvm.used = appending global [1 x i8*] [i8* bitcast ({ i8*, %swift.refcounted* } (i64)* @_TF1b9KONISHIKIFSiFT_Si to i8*)], section "llvm.metadata", align 8
18c18
- define { i8*, %swift.refcounted* } @_TF1a9KONISHIKIFSiFT_Si(i64) {
+ define { i8*, %swift.refcounted* } @_TF1b9KONISHIKIFSiFT_Si(i64) {
25c25
-   %4 = insertvalue { i8*, %swift.refcounted* } { i8* bitcast (i64 (%swift.refcounted*)* @_TPA__TFF1a9KONISHIKIFSiFT_SiL_12TAKAMISAKARIfT_Si to i8*), %swift.refcounted* undef }, %swift.refcounted* %1, 1
+   %4 = insertvalue { i8*, %swift.refcounted* } { i8* bitcast (i64 (%swift.refcounted*)* @_TPA__TFF1b9KONISHIKIFSiFT_SiU_FT_Si to i8*), %swift.refcounted* undef }, %swift.refcounted* %1, 1
29c29
- define linkonce_odr hidden i64 @_TFF1a9KONISHIKIFSiFT_SiL_12TAKAMISAKARIfT_Si(i64) {
+ define linkonce_odr hidden i64 @_TFF1b9KONISHIKIFSiFT_SiU_FT_Si(i64) {
45c45
- define internal i64 @_TPA__TFF1a9KONISHIKIFSiFT_SiL_12TAKAMISAKARIfT_Si(%swift.refcounted*) {
+ define internal i64 @_TPA__TFF1b9KONISHIKIFSiFT_SiU_FT_Si(%swift.refcounted*) {
52c52
-   %4 = tail call i64 @_TFF1a9KONISHIKIFSiFT_SiL_12TAKAMISAKARIfT_Si(i64 %3)
+   %4 = tail call i64 @_TFF1b9KONISHIKIFSiFT_SiU_FT_Si(i64 %3)
```

というわけで、関数名が若干変わるだけで、意味的には全く同じものが生成されるもよう。
ユーザーモデリングを使った機能実装について(画面編)

# 論旨
機能ベースの開発要求からユーザーストーリーベースの開発要求へ
という実践編

# 本文
「同人小説家が自分は絵を描けないが、絵がうまい人に依頼して絵を描いてもらいたい。」
「pixivにいるような同人系の絵描きを探すクラウドワークスみたいなところないか」

## 課題
というときに使える新サービスを作るとして機能ベースの開発だとExcelに
「絵が描ける人間の検索サービスを作る」
と書かれる
でも実際には「検索に引っかかるデータをどう入力させるか？」という問題が発生する
機能要求上は１つだが、巨大機能であり、分解不能になって見積もれなくなる

## アプローチ
これを見積もるにはどうすればよいか

まずユーザーモデリングをおこない、絵描きの周囲をモデリングする
(どうモデリングするかは別項でやる)
以降の分類はモデリング結果に基づいている

発注主は同人作家などの「絵が描けない同人作家」に加え、「漫画編集部など漫画家を探している人間」「ソシャゲ開発会社などのイラストレーターを探している人間」に大別する
(発注側ユーザー分類)

仕事を請ける絵描きの観点でいうと、個人と個人の取引に限ると仕事はCG、イラスト、漫画に大別できる
さらにこの三種類の依頼内容は小分類ができる
(仕事分類A)

またpixivにいる絵描きの描く内容を証言ごとに分類すると3つの軸で分類できる
(仕事分類B)

さらに依頼主側が求めているものは成果物の絵そのものであり、それが既存の絵の利用許諾でも書き下ろしでも依頼主的には変わらないが、絵を描いた人間としては制作コストが新規で発生するかで異なるため別のものとして扱う
(仕事分類C)


上の仕事分類A~Cをもとに「絵を描く人間」が「検索の元ネタになるメタデータ」を
入力する画面を作ると以下の通りになる
[メタデータ入力画面サンプル](https://drive.google.com/file/d/0BxMCoSg1yxJFZXJzV3U2N1NpdWM/view?usp=sharing)

さらに入力項目を発注側ユーザー分類に基づいてコメントをいれるとこうなる
[メタデータ入力画面サンプル（分類コメントつき）](https://drive.google.com/file/d/0BxMCoSg1yxJFanVVb3gtUzBueEk/view?usp=sharing)
テンプレートエンジンECTのfor文メモ


CoffeeScriptライクな書き方で爆速という噂のテンプレートエンジンエンジンです。

for文の書き方を毎回忘れるのでメモしておきます。

オブジェクトをforで取得するときはこっち([ejsやectテンプレートでのfor文メモ](http://qiita.com/n0bisuke/items/ad5bac66dec3ddc6fdd3))

## for文

```
<% for i in [a..z] : %>
  <!--ここがa〜zまでループされる-->
<% end %>
```

## ノーマルな使い方

```index.ect
<% for i in [1..5] : %>
  <div class="box"></div>
<% end %>
```

↓コンパイル↓

```index.html
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
```

## インデックス取得


```index.ect
<% for i in [3..5] : %>
  <div class="box<%- i %>"></div>
<% end %>
```

↓コンパイル↓

```index.html
  <div class="box3"></div>
  <div class="box4"></div>
  <div class="box5"></div>
```
phpにおける、|| と or の違い


## テストコード

```php
// "||"の戻り値チェック(true編)
$a_true_l =  true  || 'a_true_l';
echo 'a_true_l: '.var_export($a_true_l, TRUE)."\n";

$a_true_r = 'a_true_r' || true;
echo 'a_true_r: '.var_export($a_true_r, TRUE)."\n";

// "||"の戻り値チェック(false編)
$a_false_l = false || 'a_false_l';
echo 'a_false_l: '.var_export($a_false_l, TRUE)."\n";

$a_false_r = 'a_false_r' || false;
echo 'a_false_r: '.var_export($a_false_r, TRUE)."\n";

echo "\n";

// "||"の実行チェック(true編)
true || $a_true_l_void = 'a_true_l_void';
echo 'a_true_l_void: '.var_export($a_true_l_void, TRUE)."\n";

$a_true_r_void = 'a_true_r_void' || true;
echo 'a_true_r_void: '.var_export($a_true_r_void, TRUE)."\n";

// "||"の実行チェック(false編)
false || $a_false_l_void = 'a_false_l_void';
echo 'a_false_l_void: '.var_export($a_false_l_void, TRUE)."\n";

$a_false_r_void = 'a_false_r_void' || false;
echo 'a_false_r_void: '.var_export($a_false_r_void, TRUE)."\n";

echo "\n";

// "or"の戻り値チェック(true編)
$b_true_l =  true or 'b_true_l';
echo 'b_true_l: '.var_export($b_true_l, TRUE)."\n";

$b_true_r = 'b_true_r' or true;
echo 'b_true_r: '.var_export($b_true_r, TRUE)."\n";

// "or"の戻り値チェック(false編)
$b_false_l = false or 'b_false_l';
echo 'b_false_l: '.var_export($b_false_l, TRUE)."\n";

$b_false_r = 'b_false_r' or false;
echo 'b_false_r: '.var_export($b_false_r, TRUE)."\n";

echo "\n";

// "or"の実行チェック(true編)
true or $b_true_l_void = 'b_true';
echo 'b_true_l_void: '.var_export($b_true_l_void, TRUE)."\n";

$b_true_r_void = 'b_true_r_void' or true ;
echo 'b_true_r_void: '.var_export($b_true_r_void, TRUE)."\n";

// "or"の実行チェック(false編)
false or $b_false_l_void = 'b_false_l_void';
echo 'b_false_l_void: '.var_export($b_false_l_void, TRUE)."\n";

$b_false_r_void = 'b_false_r_void' or false;
echo 'b_false_r_void: '.var_export($b_false_r_void, TRUE)."\n";
```

## 実行結果

```
a_true_l: true
a_true_r: true
a_false_l: true
a_false_r: true

a_true_l_void: NULL
a_true_r_void: true
a_false_l_void: 'a_false_l_void'
a_false_r_void: true

b_true_l: true
b_true_r: 'b_true_r'
b_false_l: false
b_false_r: 'b_false_r'

b_true_l_void: NULL
b_true_r_void: 'b_true_r_void'
b_false_l_void: 'b_false_l_void'
b_false_r_void: 'b_false_r_void'
```

## 結論
* `||`は、
  * 両辺にて何かしらのtrueに該当するものがある場合、trueを返す
  * `=`よりも優先される

* `or`は、trueに該当するものが見つかった場合、それを返す
  * 左辺を返す
  * `=`が優先される

（※なお、下記はいずれの場合も同じ挙動。

    * 左辺がtrueだった場合、右辺を実行しない。
    * 左辺がfalseだった場合、右辺を実行する
）

## 補足
* 間違えていたら指摘してください。
SendGridでメール到達までが異常に遅い場合

# はじめに
Azureからメール送信するためにSendGridを使いました。
が！
メール送信処理から実際にメールが届くまで15分も掛かっていました。

この現象に対しSendGirdのサポートにメールを送り返答を貰ったので共有します。

# 結論: 数日間、待ちましょう。

サポートのSteven氏からのメールを引用します。

## メール本文
Hi there,

Thank you for reaching out to our support team.

I’d like to assure you that SendGrid is accepting mail from you and has been queuing it for a short time - from reviewing the account, it appears all mail has delivered.

On occasion, we purposely slow sending for our new customer sign-ups to analyze and evaluate sending traffic. This temporary delay is designed to ensure that as you scale with SendGrid, you can have confidence that you’ll be able to reliably send email.

Let me know if you have any questions or concerns.

Best,
Steven E.
SendGrid Support

## つまり意図的に配信を遅らせている
新規登録ユーザは**意図的に**送信までの時間を遅らせているようです。
アカウント使用状況の分析のため、とのこと。

# おわりに
この期間が数時間なのか10日なのか分かりません。
私の場合、10日ほど経った後に処理すると一瞬でメールが配信されました。

登録後のお知らせメールでその事を伝えておくれよー！
あと遅延期間の日数見込も教えてくれよー！

と強く思いました。

原因切り分けと調査の時間を返してくれ！(笑)
To convert between XML and DOM in Java

DOM3 にては Load & Save 機能 有りて package org.w3c.dom.ls に これら 有り。

```java
import org.w3c.dom.ls.*;

DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS ls = (DOMImplementationLS) registry.getDOMImplementation("LS 3.0");
```

やゝ 詳しく 書くに

```java
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementation dom = registry.getDOMImplementation("+LS 3.0 +XPath 3.0");
DOMImplementationLS ls = (DOMImplementationLS) dom.getFeature("+LS", "3.0");
```

して
load すなはち XML → DOM は

```java
LSInput lsInput = ls.createLSInput();
FileInputStream fis = new FileInputStream(path);
lsInput.setByteStream(fis);
lsInput.setEncoding("UTF-8");

LSParser lsParser = ls.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
Document document = lsParser.parse(lsInput);
```

save すなはち DOM → XML は

```java
LSOutput lsOutput = ls.createLSOutput();
FileOutputStream fos = new FileOutputStream(path);
lsOutput.setByteStream(fos);
lsOutput.setEncoding("UTF-8");

LSSerializer lsSerializer = ls.createLSSerializer();
serializer.write(document, lsOutput);
```

LSSerializer は 次の 如く 飾り 得:

```java
serializer.getDomConfig().setParameter("comments", false);
serializer.getDomConfig().setParameter("format-pretty-print", true);
serializer.getDomConfig().setParameter("xml-declaration", false);
...
```

---

ちなみに それ以前にては 次の ごとく しき。

```java
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setnamespaceAware(false);
factory.setValidating(false);
factory.setExpandEntityRefereces(true);
factory.setIgnoringElementContentWhitespace(true);
factory.setIgnoringComments(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(file);
```

```java
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOUtputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(outputStream);
transformer.transform(source, result);
```
OSXでCakePHP3のインストール補足

普通にコンポーザーを使って以下のようにCakePHP3のインストールを試みると、

```bash
php composer.phar create-project --prefer-dist -s dev cakephp/app myapp
```

以下のように途中でパーミッションのエラーになる。


```bash
  - Installing psr/log (1.0.0)


                                            
  [ErrorException]                          
  touch(): Utime failed: Permission denied  
```

そこでsudo使ってやると、

```bash
sudo php composer.phar create-project --prefer-dist -s dev cakephp/app myapp
```

インストールは成功するが、所有者がrootになってしまう。

```
ls -al 
total 2592
drwxr-xr-x  25 mymac  staff      850  1 21 11:33 .
drwxr-xr-x   6 mymac  staff      204  1  9  2014 ..
-rw-r--r--@  1 mymac  staff    15364 12  6 10:41 .DS_Store
drwxr-xr-x  21 root         staff      714  1 21 11:33 myapp
```

なので以下のコマンドで元に戻す。

```bash
sudo chown -R mymac:staff myapp
```

あとついでだけど、インストールしたままだとタイムゾーンがUTCなので変更しておく。

```php:config/bootstrap.php
/**
 * Set server timezone to UTC. You can change it to another timezone of your
 * choice but using UTC makes time calculations / conversions easier.
 */
date_default_timezone_set('Asia/Tokyo');
```
vi > ファイル(LF改行)をwindowsの改行(CRLF改行)に変換する > :set ff=dos

動作確認

    CentOS 6.5 (32bit)
    vim version 7.2

linux上で作成したファイルをWindows上へ持っていきたい時、改行をCR,LFにしないと改行がうまく機能しない。`nkf`などのツールを使えば変換できるが、インストールをする必要があり、標準的なツールでできないか試してみた。

手順としては以下でよさそう。
1. vi linux.txt
2. :set ff=dos
3. :wq

これで

    $file linux.txt
    linux.txt: ASCII text

だったのが

    $file linux.txt
    linux.txt: ASCII text, with CRLF line terminators
となりCR,LFの行終端となっている。

ただし、ファイルを一つずつ手処理するので、大量のファイルがある時には向かない。

<hr>
(追記)

noc06140728さんに教えていただいた方法を試してみました。
`f1.txt`,`f2.txt`,`f3.txt`がLF改行のファイルの場合で、他にf*.txtというファイルがない場合以下のようにすると一括で変換できるようです。

    vi
    :set hidden
    :args f*.txt
    :argdo set ff=dos|update
    :q
To serialize DOM object to string in JavaScript


DOM の object を serialize するには

~~~JavaScript
funciton serializeToString(node) {
    try {
        // for Firefox, Chrome, Safari, Opera
        return (new XMLSerializer()).serializeToString(node);
    } catch (e) {
        try {
            // for IE
            return node.xml;
        } catch (e2) {
            alert("I can not serialize DOM node!");
        }
    }
    return false;
}
~~~
Python にて C/C++ の printf の 如き 書式 つき 出力を おこなふ

たとへば

~~~python
print "year:%d, month:%d, day:%d" % (year, month, day)
~~~

すなはち 演算子 '%' ぞ その肝 なる。
演算子 '%' は 數値にては modulo 演算の 意なれども Unicode 文字列にては 書式化として overload さる。
"format % values" にて format の中の % 變換 指定は values の中の 0 個 或いは それ以上の 要素にて 置き換へらる。

ちなみに C++ の boost::format() にては

~~~c++
std::out << boost::format("year:%d, month:%d, day:%d") % year % month % day;
~~~
CakePHP3 でDebugKitが表示されない時

CakePHP3からはComposerでインストールすることになって、DebugKitも自動で入れてくれるようになったんだけど、
なぜか動かない。っていうか表示されない。
そういう時は logs/error.log を確認すべし。

```text:logs/error.log
Warning: DebugKit not enabled. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
```

これはphpでsqliteが使える状態になってないということです。

```bash
sudo port install php55-sqlite
```
date コマンドでタイムスタンプを日付文字列に変換

知らなかった…

```
$ date -d '@1411103544'
2014年  9月 19日 金曜日 14:12:24 JST
```

これまではちょいちょい http://url-c.com/tc/ などを利用していました。なんということだ。
storyboard利用時に、カスタムUIWindowを使いたい場合

アプリケーションが一定時間操作されていないことを検知したい場合などに、UIWindowのsendEventをフックしたいことがあると思います。

その場合、UIWindowを継承したクラスを作成すればよいのですが、storyboardを用いたテンプレートを利用していると、AppDelegateがUIWindowを見えないところで作っているので、カスタムUIWindowに置き換える方法がよくわかりません。

調査したところ、下記コードをAppDelegateに埋め込むと、UIWindowを作成時に自動で呼び出されるので、カスタムUIWindowに置き換わりました。

```objc++
- (UIWindowCustom *)window
{
    static UIWindowCustom *customWindow = nil;
    if (!customWindow) customWindow = [[UIWindowCustom alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    return customWindow;
}
```
Unity で作ったアプリの画像が一部の Android 端末で表示されない件について

今やってるお仕事で **特定の Android 端末 ([ASUS MeMO Pad 8](http://www.asus.com/jp/Tablets/ASUS_MeMO_Pad_8_ME181C/) とか) で画像が出ない** という問題が発生した。

色々調べて解決策を見つけたので、それを書き殴る。

## 原因

結論から言うと、テクスチャの圧縮形式に問題があった。

全体最適するなら **RGB Compressed ETC 4bits** か **RGBA Compressed DXT5** にしましょうね、ってお話です。

## 解説

元々ウチでは Android 用の圧縮形式として **RGBA Compressed ATC 8bits** とか **RGB Compressed ATC 4bits** とかをメインに使っていたが、一部の Android 端末は、この形式で圧縮された画像を処理できないコトが判明。

大半の Android 端末は [Adreno という Qualcomm 社の GPU](https://developer.qualcomm.com/mobile-development/maximize-hardware/mobile-gaming-graphics-adreno/adreno-gpu) を積んでおり、ATC を正しく展開できるので問題ない。

が、上述の ASUS MeMO Pad 8 は調べたところ [PowerVR G6430](http://www.imgtec.com/jp/powervr/powervr-graphics.asp) という GPU を積んでおり、漏れなく ATC を展開できない。

※余談ではあるが、PowerVR は iOS な端末に搭載されている GPU のようで、PVRTC で圧縮してあげれば動くんだろうけど、他の Android で動かないから却下な方向ですよねー。

## おまけ

毎回手動でこの辺設定するのが面倒な場合は、AssetPostprocessor で自動設定してあげるとオシャレ。

```csharp:CustomAssetPostprocessor.cs
using UnityEngine;
using UnityEditor;

public class CustomAssetPostprocessor : AssetPostprocessor {

    public void OnPreprocessTexture() {
            TextureImporter importer = (assetImporter as TextureImporter);

            // この辺の設定は、お好みで。
            importer.textureType = TextureImporterType.Advanced;
            importer.npotScale = TextureImporterNPOTScale.ToLarger;
            importer.spriteImportMode = SpriteImportMode.None;
            importer.mipmapEnabled = false;
            importer.generateCubemap = TextureImporterGenerateCubemap.None;
            importer.wrapMode = TextureWrapMode.Repeat;
            importer.filterMode = FilterMode.Bilinear;
            importer.anisoLevel = 0;
            importer.alphaIsTransparency = false;
            importer.linearTexture = false;
            importer.compressionQuality = (int)TextureCompressionQuality.Best;
            importer.maxTextureSize = 2048;
            importer.textureFormat = TextureImporterFormat.RGBA32;

            // ココで Platform 毎の個別設定を行う。
            importer.SetPlatformTextureSettings("iPhone", 2048, TextureImporterFormat.PVRTC_RGB4, (int)TextureCompressionQuality.Normal);
            importer.SetPlatformTextureSettings("Android", 2048, TextureImporterFormat.ETC_RGB4, (int)TextureCompressionQuality.Normal);
        }
    }

}
```

なお、アルファチャンネルを含む画像の場合は、Line: 25, 26 を以下のようにすると良い。

```
importer.SetPlatformTextureSettings("iPhone", 2048, TextureImporterFormat.PVRTC_RGBA4, (int)TextureCompressionQuality.Normal);
importer.SetPlatformTextureSettings("Android", 2048, TextureImporterFormat.DXT5, (int)TextureCompressionQuality.Normal);
```

## 参考

* [AssetPostprocessor 公式ドキュメント](http://docs.unity3d.com/ScriptReference/AssetPostprocessor.html)
* [TextureImporterFormat の一覧](http://docs.unity3d.com/ScriptReference/TextureImporterFormat.html)
* [ASUS MeMO Pad 8 の GPU 情報](http://pc.watch.impress.co.jp/docs/column/nishikawa/20140829_664253.html)
なぜ要件定義書と仕様が乖離してしまうのか？

要求工学を学び始めたので雑記

なぜ要件定義書と仕様が乖離してしまうのか？
→正しいかどうか分からない要件定義書を生み出してしまうのか？
解答
明快に要求と仕様とが説明できる状態でないのに、要件定義書の作成を初めてしまうから。
だそうです。

そもそも「要求」と「仕様」ってなんなのでしょうか？
要求：利用環境から見たソフトウェアが実現すべき目標である。
仕様：ソフトウェアが利用環境に対して必要とされる機能を提供するための境界条件である。

要件(要求)に視点を当てて、要件定義書の難しさを紐解いてみます。

要件定義を行う上で、関門は以下2つです。
・要件が曖昧で全てを確定できないため、進められない。進めても曖昧な定義書になってしまう。
・要件を早期に確定してしまい、要望の変化に応える事ができない。定義書の作成を優先するあまり、実装が制限されてしまう。

上記を解決するためには、
「要求とその優先順位を明確に定めること」
を念頭に置かなければいけません。
理由は下記です。
・優先順位の低いタスクの実装により、優先順位の高いタスクに制約が加わる恐れがある。
・最低限達成しなければならない目標があった方が、筋の通った設計となる。
→1番やりたい事が複数あってはならない。1番やりたい事が複数ある場合、仕様を複雑化させ矛盾を発生させる恐れがある。

プロトタイプを作成する手法が効率的ではないか？と考える方は下記を読んでください。
確かに、相手の要望を引き出したり、イメージを確定させるためにはプロトタイプを作成する事は有用です。
しかし、下記のような欠点があります。
・複雑なシステムである場合プロトタイプ作成そのものに時間がかかる。
・曖昧な要求では曖昧なプロトタイプしか作成出来ないため、多くの場合作成の努力が徒労に終わる。
しっかりとしたプロトタイプが作れるくらい要求が明確であれば、仕様の具体化を優先すべきだそうです。
_.findLastIndex

[lastIndexOf](http://underscorejs.org/#lastIndexOf) の柔軟なやつ

```coffeescript
coffee> nums = _.shuffle [0...100]

coffee> _.findLastIndex nums, (x) -> x < 50 and x > 40
92
coffee> nums[92]
43
```

* [Add _.findLastIndex and handle NaN in *IndexOf by megawac · Pull Request #1981 · jashkenas/underscore](https://github.com/jashkenas/underscore/pull/1981)
Objective-Cのお勉強：リファレンスカウンタ


Objective-Cを勉強中に出た疑問の自分用メモ。
メモリ管理に使っているリファレンスカウンタについて。
お勉強のため、ARCはオフ。

勉強資料は以下のサイト。
[今さら聞けないObjective-Cのメモリ管理　弱い参照と強い参照って何？ ｜ Developers.IO](http://dev.classmethod.jp/client-side/language-client-side/object-c-memory/ "今さら聞けないObjective-Cのメモリ管理　弱い参照と強い参照って何？ ｜ Developers.IO")


```Car.m
#import "Car.h"

@implementation Car

/* setter を使う場合 */
- (void)setEngine:(Engine *)newEngine {
  [newEngine retain];
  [engine release];
  engine = newEngine;
}

/* property を使う場合
@synthesize engine;
*/

- (void)dealloc {
  NSLog(@"dealloc Car");  
  [engine release];
  [super dealloc];
}

@end
```

何がわからなかったかっていうと、setEngine:のあたり。

```
- (void)setEngine:(Engine *)newEngine {
  [newEngine retain];    // newEngineのリファレンスカウンタは2
  [engine release];    // engineのリファレンスカウンタは0
  engine = newEngine;    // engineのリファレンスカウンタは2 ←！？！？！？！？！？
}
```

なんで急にengineのリファレンスカウンタが2になんのよ！
retainしてないぞ！ってのが今回の疑問。

newEngineインスタンスをengineに代入した時点で、engineのリファレンスカウンタもnewEngineのものがコピー？されてしまっているってことかな？

[newEngine retain]をもう一つ挟んで、リファレンスカウンタを確認すると、newEngineもengineもカウンタは3になるので、多分合ってる気がする。

```
- (void)setEngine:(Engine *)newEngine {
  [newEngine retain];    // newEngineのリファレンスカウンタは2
  [newEngine retain];    // newEngineのリファレンスカウンタは3
  [engine release];    // engineのリファレンスカウンタは0
  engine = newEngine;    // engineのリファレンスカウンタは3、newEngineもリファレンスカウンタは3
}
```

ちなみにリファレンスカウンタを確認するには、retainCountを使う。
使用例はこんな感じ↓

```
printf("engine retainCount:%d\n", (int)[engine retainCount]);
```

```実行結果
engine retainCount:3
```


#（追記）いただいたコメントを受けて、もう一回カウンタの挙動を確認してみました。

```
- (void)setEngine:(Engine *)newEngine {
  [newEngine retain];
  [engine release];
  engine = newEngine;
  
  printf("engine retainCount:%d\n", (int)[engine retainCount]);  // engineのカウンタは2
  printf("newEngine retainCount:%d\n", (int)[newEngine retainCount]);  // newEngineのカウンタは2
  
  [engine retain];
  printf("engine retainCount:%d\n", (int)[engine retainCount]);  // engineのカウンタは3
  printf("newEngine retainCount:%d\n", (int)[newEngine retainCount]);  // newEngineのカウンタは3
  
  [newEngine retain];
  printf("engine retainCount:%d\n", (int)[engine retainCount]);  // engineのカウンタは4
  printf("newEngine retainCount:%d\n", (int)[newEngine retainCount]);  // newEngineのカウンタは4
  
```

engineをretainしたりnewEngineをretainするたびにそれぞれのリファレンスカウンタを確認してみたら、おー、同じ値が出てきました。
engine=newEngine の代入式で、両変数が同じリファレンスカウンタ（正確には、同じオブジェクト）を参照していることがわかりました！
tomohisaotaさん、ありがとうございました！
iPhone内の動画や画像を簡単にMacへ転送する

いろいろ方法はあるがこれが一番はやい。


##イメージキャプチャをつかう
`アプリケーション > イメージキャプチャ.app`
Spotlightで`image`と入力する方がはやい。

端末内の画像と動画の一覧が出てくるので選択して読み込むだけ。
複数デバイスを同時に接続もできる。

意外と知られていない。
_.chunk

配列の任意の長さで分割する関数

```coffeescript
coffee> require('./underscore').chunk [0...10], 1
[ [ 0 ],
  [ 1 ],
  [ 2 ],
  [ 3 ],
  [ 4 ],
  [ 5 ],
  [ 6 ],
  [ 7 ],
  [ 8 ],
  [ 9 ] ]
coffee> require('./underscore').chunk [0...10], 2
[ [ 0, 1 ],
  [ 2, 3 ],
  [ 4, 5 ],
  [ 6, 7 ],
  [ 8, 9 ] ]
coffee> require('./underscore').chunk [0...10], 3
[ [ 0, 1, 2 ],
  [ 3, 4, 5 ],
  [ 6, 7, 8 ],
  [ 9 ] ]
```

* [_.chunk or _.stride function · Issue #1891 · jashkenas/underscore](https://github.com/jashkenas/underscore/issues/1891)
* [Add _.chunk to Array functions. by keinkonzept · Pull Request #1919 · jashkenas/underscore](https://github.com/jashkenas/underscore/pull/1919)
ScalaでReactive Programmingできそうなライブラリメモ

scala.rx
https://github.com/lihaoyi/scala.rx

Reactive
https://github.com/nafg/reactive

RxScala
https://github.com/ReactiveX/RxScala

scala.rxが筋が良さげ？
他にも有ったらコメントお願いします。
scalaz - OptionT

## 定義

早速定義をみてみよう。

```scala
final case class OptionT[F[_], A](run: F[Option[A]])
```

OptionTはモナド変換子だ。なのでモナドをliftして合成できる。

```scala
val optList = List(1,2,3).liftM[OptionT]
// OptionT(List(Some(1), Some(2), Some(3)))
```

## インスタンスの関数

**map**: A => B にする。

```scala
optList.map(_ + 1)
// OptionT(List(Some(2), Some(3), Some(4)))
```

**flatMap**: A => OptionT[F, B] にする。

```scala
optList.flatMap(x => List(x,x).liftM[OptionT])
// OptionT(List(Some(1), Some(1), Some(2), Some(2), Some(3), Some(3)))
```

forも。

```scala
for { a <- optList if a > 1 } yield a + 1
// OptionT(List(None, Some(3), Some(4)))
```

**flatMapF**: A => F[B] にする。

これはF(ここではList)を書き換える関数だ。

```scala
optList.flatMapF { case 1 => Nil case x => List(x) }
// OptionT(List(Some(2), Some(3)))
```

**foldRight**: 畳み込み。(Z)((A, Z) => Z): Z

```scala
optList.foldRight("a"){(x, a) => s"$x:$a"}
// 1:2:3:a
```

なぜfoldLeftがないんだろうか..?

**traverse**: OptionTをGでwrapする関数。

```scala
optList.traverse(x => Maybe.just(x + 1))
// Just(OptionT(List(Some(2), Some(3), Some(4))))
```

**ap**: F内の関数を適用する関数。

```scala
optList.ap(List((_:Int)+1).liftM[OptionT])
// OptionT(List(Some(2), Some(3), Some(4)))
```

以下Optionの関数と同じ感じ..

**isDefined**: Someならtrue

```scala
optList.isDefined
// List(true, true, true)
```

**isEmpty**: Noneならtrue

```scala
optList.isEmpty
// List(false, false, false)
```

**filter**: trueを返したらtrue

```scala
optList.filter(_ > 1)
// OptionT(List(None, Some(2), Some(3)))
```

**fold**: someの場合とnoneの場合を指定

```scala
optList.filter(_ > 1).fold(x=>x, -1)
// List(-1, 2, 3)
```

**getOrElse**: get or else

```scala
optList.filter(_ > 1).getOrElse(-1)
// List(-1, 2, 3)
```

**exists**: 存在するか

```scala
optList.exists(_ > 1)
// List(false, true, true)
```

**forall**: 全部あるか

```scala
optList.filter(_ > 1).forall(_ > 1)
// List(true, true, true)
```

**orElse**: Noneの場合

```scala
optList.filter(_ > 1).orElse(List(0).liftM[OptionT])
// OptionT(List(Some(0), Some(2), Some(3)))
```

**toRight**: EitherT(Right)に変換

```scala
optList.filter(_ > 1).toRight("err")
// EitherT(List(-\/(err), \/-(2), \/-(3)))
```

**toLeft**: EitherT(Left)に変換

```scala
optList.filter(_ > 1).toLeft("err")
// EitherT(List(\/-(err), -\/(2), -\/(3)))
```

## オブジェクトの関数

optionT: OptionTを作成

```scala
OptionT.optionT[List](List(1.some))
// OptionT(List(Some(1)))
```

some: OptionTを作成(必ずSome)

```scala
OptionT.some[List, Int](1)
// OptionT(List(Some(1)))
```

none: OptionTを作成(必ずnone)

```scala
OptionT.none[List, Int]
// OptionT(List(None))
```

monadTell: Writer用

```scala
OptionT.monadTell[Writer, String, Int].writer("foo", 1)
// OptionT(WriterT((foo,Some(1))))
```

scalaでおなじみの関数ばかりだったので、目新しいものは少なかった。しかしモナドを合成できるのは面白い。次は別のモナド変換子を見てみるとしよう。
24章 Magic Beans(魔法の豆)

## 目的
MVCのMを単純化する

* モデルを単純化する為、モデルは単なるデータアクセスオブジェクトとしてしまう。

**⇒ Modelの過度の単純化により、逆に複雑に。。。**

## アンチパターン
モデルがアクティブレコードそのもの

* モデル ＝ テーブル(ビュー)の1レコード
* CRUD操作
* DAO

```pl:MagicBeans/anti/model
$bug = new Bug();
$bug->summary = '保存時にクラッシュが発生';
$bug->save();
```

アクティブレコードは単一テーブルの各行に対するSimpleなInterfaceを提供してくれる優れたパターンです！
まるで魔法の豆のようだ・・・
しかし、魔法の豆はありません。

以下、魔法の豆アンチパターンがもたらす弊害の紹介。
####1.モデルをデータベーススキーマに強く依存させてしまう
ex) テーブルの数 = Modelの数が必要。
ex) データベーススキーマを変更する場合、Modelの変更だけではなく、そのModelを使うコードも変更する必要がある。


####2.CRUD機能を公開してしまう
ex) 意図した用法を無視してCRUD操作が行われてしまう。
Bugテーブルのassigned_toが登録されたら電子メールを送る。
というビジネスロジックを無視して、
assined_toを登録するロジックが書かれてしまう。(可能性が高くなる)


####3.ドメインモデル貧血症をもたらす
ex) CRUD以外の振る舞いがモデルの外部に書かれてしまい、振舞いの凝集度が低下する。


####4.ユニットテストが困難
ex) MVCの各レイヤのUTが難しい。負荷が高い。

モデル：
　データベースアクセスから分離して行うことができない。

ビュー：
　モデルが関連する動的なHTML要素のレンダリングと解析のために、フレームワークは複雑で時間のかかるコードを実行する必要がある。

コントローラ：
　ビジネスロジックがコントローラに書かれていると、ビジネスロジックのテストの為にHTTPリクエストを用意したりと無駄な準備が必要になる。
　また、同じビジネスロジックが分散しているとテストの重複も発生。

**⇒ データベースアクセスからビジネスロジックを、プレゼンテーションからビジネスロジックをそれぞれ分離させること！**


## アンチパターンの見つけ方
* テーブルをJOINした処理をどこに書こう？
　→　テーブル = Modelになっている可能性あり。


* 同じビジネスロジックが複数個所にある。
  →　データベースアクセス以外のビジネスロジックがModelの外に書かれている可能性あり。


* UTが大変なんですよ。
　→　このパターン含め、何かしらのアンチパターンの可能性あり。


## アンチパターンを用いてもよい場合
* アクティブレコード自体はアンチパターンではない！
* 単純なCRUD操作を行うだけのアプリケーションや、スピード重視のプロトタイプ作成時など。

魔法の豆のメリットが得られる場合もある。


## 解決策
Modelがアクティブレコードを[持つ]ようにする。

####1.モデルを理解する
* アクティブレコードのようなDAOとModelの関係は、**継承**ではなく**集約**。
* DBのデータを扱うCRUD操作は外部に公開しない。
* コントローラやビューはドメインモデルのインタフェースを使用すべき。
* 疎結合性
* 高凝集性


####2.ドメインモデルの使用
* Modelはビジネスロジックを実装する場所。
* DBとのやりとりは、内部的な実装の詳細。カプセル化。
* クラス図描いてみよう。複雑化・密結合化してないか。


####3.プレーンなオブジェクトのテスト
* 理想は、DBに接続することなくモデルをテストできること。
* モデルとコントローラの切り離し。
* モデルとデータアクセス機能の分離。


####4.現実的に考える
* フレームワークによっては[魔法の豆]アンチパターンを招きやすいが、DAOは効果的に使用できる。
* この章のドメインモデリングの基本は、DBが関わるアプリケーション開発の生産性・保守性を高めることができる。



***
最後に、
モデルはテーブルから分離させましょう。
OmniAuth関連のURLを変更する


githubとdeveloperのproviderを使った場合の例で、デフォルトは`/auth`なのを`/login`に変更する。

```config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  configure do |config|
    config.path_prefix = '/login'
  end
  provider :developer unless Rails.env.production?
  provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
end
```

OmniAuth::Configure#path_prefix を指定する。

https://github.com/intridea/omniauth/blob/v1.2.2/lib/omniauth.rb#L35

関連URLが`/auth/github`や`/auth/github/callback`から`/login/github`や`/login/github/callback`に変更できる。

# もっと詳しく

builder内で利用できるDSLはここに定義されている。

https://github.com/intridea/omniauth/blob/v1.2.2/lib/omniauth/builder.rb

その他のpathは`OmniAuth::Strategy`で生成されている。request_pathはここ。

https://github.com/intridea/omniauth/blob/v1.2.2/lib/omniauth/strategy.rb#L380

https://github.com/intridea/omniauth/blob/v1.2.2/lib/omniauth/strategy.rb#L366

他で上書きされていなければ`OmniAuth.config.path_prefix`が使用される。


# 参考

* [OmniAuthで認証やコールバックのURLを変える方法 - ぶろぐ。@はてな](http://d.hatena.ne.jp/tkawa/20111014/p1)
* [OmniAuth](https://github.com/intridea/omniauth)
500 OOPS: vsftpd: refusing to run with writable root inside chroot()

と、怒られたら

```
allow_writeable_chroot=YES
```

を`/etc/vsftpd/vsftpd.conf`に書けばとりあえず利用可能にはなる。非推奨らしいので注意。

あとは

```
sudo systemctl restart vsftpd.service
```

する。
コンピュータ将棋製作記 その1

# この記事について

ふとした思いつきでコンピュータ将棋を作ることになったので、そのメモを書いていきます。

## 制作開始時の目標

制作開始決定は2015年1月16日、コードを書き始めたのは1月20日

- 羽生さんに勝てるくらい強いソフトにする（ネタソフトにしない）
- 2015年5月のコンピュータ将棋選手権に出す

友人と一緒に開発をする。途中で方針をがらっと変えることも十分あり得る。相談の結果、しばらくはバラバラに作ってお互いに様子を見てみることにする。

## 前提知識

何も知らないので調べながら。

https://chessprogramming.wikispaces.com :素晴らしいサイト。コンピュータチェスの話だけれど、将棋に応用が効く内容もたくさんある

### 心構え

Getting Start: https://chessprogramming.wikispaces.com/Getting+Started

> When writing an engine, it is **extremely** important to write bug free code. The best strategy when starting a new engine is to create a debugging framework under it so that every single piece of code gets tested, no matter how simple it looks. Many experienced engine authors have ended up rewriting their engines because they have become unmanageable due to bugs.

バグのないコードを書くのがとてつもなく重要である、とのこと。どんなに簡単そうな部分に見えても、全てのコードのテストを書くのがベスト、と言っている。テストあまり好きではないが、検討したほうがいいだろう。

また、デバッグのしやすさには気をつけたほうが良さそうだ。今のところC言語で書くことを想定しているけれど、debug系の関数はたくさん作るようにしよう。

## 方針

とりあえずC言語で作り始める。作ってから思ったけど、最初は適当なLLを使ったほうが良かったかも。

### 盤の表現方法

Board Representation: https://chessprogramming.wikispaces.com/Board+Representation

チェスエンジンと同じように、ピース中心かマス中心かの選択をする必要がある。はやりのbitboardはピース中心。演算がとにかく速いが、効きの計算がちょっと大変そう。

とりあえず最初ということで、実装が楽そうなマス中心の選択をしてみる。速度が出なくなったら作りなおす（数回作りなおすつもり）。

https://chessprogramming.wikispaces.com/10x12+Board

採用した盤の表現は10*12形式にした（将棋の場合は11x13）。番兵を周囲に配置してオーバーフローの計算を省く。構造体はこんな感じ。

```
typedef struct _Board {
	int board[BOARD_WIDTH * BOARD_HEIGHT];
	int mochigoma[2][8]; // [sente/gote][type < OU]
	int turn;
	int moves;
	int check_repeatition;
} Board;
```

### 最初のコード

とりあえず以下のコードを作った
・盤面の初期化
・SFENの入出力
・人が見られる盤面表示機能

SFENは大変便利なのでサポートすべき。下のページで解説がある。
USIプロトコルとは: http://www.geocities.jp/shogidokoro/usi.html

初期状態はこれ```
lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1
```

人が見られる盤面は、KI2と互換性を持たせた。

```lr6l/4k1g2/2+B2S1pp/ppp2Sp2/9/P1PpNPP2/1PGG4P/7R1/L1K5L w S4Pbgs3np 1
```この入力に対し、出力はこう
<pre>
後手の持駒：　角　金　銀　桂三　歩
  ９ ８ ７ ６ ５ ４ ３ ２ １
+---------------------------+
|v香v飛 ・ ・ ・ ・ ・ ・v香|一
| ・ ・ ・ ・v玉 ・v金 ・ ・|二
| ・ ・ 馬 ・ ・ 銀 ・v歩v歩|三
|v歩v歩v歩 ・ ・ 銀v歩 ・ ・|四
| ・ ・ ・ ・ ・ ・ ・ ・ ・|五
| 歩 ・ 歩v歩 桂 歩 歩 ・ ・|六
| ・ 歩 金 金 ・ ・ ・ ・ 歩|七
| ・ ・ ・ ・ ・ ・ ・ 飛 ・|八
| 香 ・ 玉 ・ ・ ・ ・ ・ 香|九
+---------------------------+
先手の持駒：　銀　歩四
</pre>&lt;pre&gt;使っているのにズレるのは納得行かないな

これを用意していたおかげで、何かおかしい時に盤面を見ながらチェック出来るようになった。

### TODO

- 結局テストを書いていない

テストは、stdinでテスト指示を受け取りstdoutに出力し、その結果をPythonで見る方法でやろうと思っている。

- 全ての可能な手を出力するコードを書く

最多合法手局面: http://ameblo.jp/professionalhearts/entry-10001031814.html

とりあえず、この局面から593通りの出力が得られるようにする。このSFENはこちら
```"R8/2K1S1SSk/4B4/9/9/9/9/9/1L1L1L3 b RBGSNLP3g3n17p 1"```

さっき書き終わったけど、上の局面だと王手無視とか打ち歩詰めとか二歩とかがチェック出来ないので、そういったテストも書かないと。

次回はテストを書いて、可能な手全出力の実装を完了するようにしよう。

### 短期目標

金曜夜（23日夜）までに、floodgateでランダムを走らせる。

floodgate: http://wdoor.c.u-tokyo.ac.jp/shogi/floodgate.html
パスワードなしでSSHログインする簡単な手順

###ログイン元サーバで秘密鍵と公開鍵の作成

```
# cd ~
# mkdir .ssh
# chmod 700 .ssh
# ssh-keygen -t dsa
```
これにより、id_dsa（秘密鍵）とid_dsa.pub(公開鍵）が作成される

###公開鍵をログイン先サーバに転送
```
# scp id_dsa.pub 192.168.137.127:/home/user/
# ssh 192.168.137.127
```

###公開鍵をログイン先サーバに登録
```
cd ~
mkdir .ssh
chmod 700 .ssh
cd .ssh
cat ~/id_dsa.pub >> authorized_keys
chmod 600 authorized_keys
```

###公開鍵認証を許可する
```
sed -i -e "s/#PubkeyAuthentication/PubkeyAuthentication/g" /etc/ssh/sshd_config
```

```
PubkeyAuthentication yes
```
に変更する

###sshデーモンの再起動
```
service sshd restart
```
ネストされたオブジェクト内のキー名を スネークケース → キャメルケース に変換


phpフレームワークなどからjsonでデータを取得したりすると、オブジェクトのキー名がスネークケースであることがよくあると思います。これをすべてキャメルケースに変換したいです。

関数が自分自身を呼び出すarguments.calleeを使って高階関数というのをつくればいけそうだと分かりました。


+ ライブラリにUnderscore.jsを使用しています。
+ スネークケース → キャメルケースの箇所は[ANTON072](http://qiita.com/)さんの[キャメルケースに変換する](http://qiita.com/ANTON072/items/e91b445a71bbd4a6ef74)を参考にさせて頂きました。
+ [jsfiddle](http://jsfiddle.net/tomohidex/111u4suh/)にあげました
+ **追記** arguments.callee が strict modeでは使えないという重大な問題に気づきました。名前付き関数を呼び出すやり方に変更しました。


```javascript

//スネークケースの文字列をキャメルケースの文字列に変換
function snakeToCamel(str) {
    if (!_.isString(str)) {
        return str;
    }
    return str.replace(/_([a-z])/ig, function (all, letter) {
        return letter.toUpperCase();
    });
};


//オブジェクトのkeyにfuncを適用し
//それぞれのvalueがオブジェクトだった場合にも再帰的に自分自身を適用する関数
function objKeysMap(obj, func) {
    var values = _.values(obj).map(function (a) {
        return _.isObject(a) && objKeysMap(a, func) || a;
    });
    return _.object(_.keys(obj).map(func), values);
};

//以下サンプル

//スネークケースのデータ
var snake = {
    key_name:{
        child_key_name:{
            grand_child_key_name:'value'
        }
    }
};

var camel = objKeysMap(snake, snakeToCamel);


console.log(camel);
/*
{
    keyName:{
        childKeyName:{
            grandChildKeyName:'value'
        }
    }
}
*/

//もとのデータはそのままです
console.log(snake);
/*
{
    key_name:{
        child_key_name:{
            grand_child_key_name:'value'
        }
    }
}
*/


```

もうちょっとスマートな書き方があるかもしれません。
Webメルカトルで傾いて表示されるUTMグリッドの例

UTMグリッドはUTM投影された地形図で利用することを前提としており、UTMは場所によってはWebメルカトルに対して傾く。

新しい地理院地図では、小縮尺でもUTMグリッドが表示できるようになり、Webメルカトルで傾きが激しいUTMグリッドの位置を特定しやすくなった。

具体的に例示してみると、次の通り。
http://maps.gsi.go.jp/?ll=36.049446,137.969613&z=15&base=std&vs=c1j0l0u1

※新しい地理院地図では、UTMグリッドや磁北線等の表示有無もURLで指定することができる。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（９）タイトル画面を作る

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# タイトル画面を作る
ゲームが始まるまで、特定のキー入力を待つタイトル画面を作成します。

ゲーム全体の制御を行う「**gameControl.coffee**」を生成します。
ゲームのトップディレクトリ（game01）で下記コマンドを実行し、「**src**」ディレクトリに「**gameControl.coffee**」が生成されているのを確認してください。
監視コマンドが実行されている場合は、自動的にコンパイルされます。

$ **enforce derive gameControl**

そして、生成された「**gameControl.coffee**」の「**constructor**」を下記のように修正してください。

```coffeescript
    constructor:(initparam)->
        super(initparam)
        @title = addObject
            type: LABEL
            x: SCREEN_WIDTH / 2 
            y: SCREEN_HEIGHT / 2 
            width: SCREEN_WIDTH
            height: 48
            fontsize: 48
            textalign: 'center'
            labeltext: "PUSH 'z' KEY"
```
「**constructor**」でタイトル画面となる「**Label**」スプライトを生成しています。
これは、enchant.jsのスプライトの一種である「**Label**」を使い、テキストを画面に表示しています。
次に、「**behavior**」を下記のように修正してください。
「**when 1**」の内容の前半は、「**enforceMain.coffee**」の「**constructor**」をそのまま持ってきています。
最後の「**@nextjob()**」を忘れると延々とオブジェクト生成が行われて、ブラウザがハングします。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                button = PADBUTTONS[0]
                if (button[0])
                    @title.visible = false
                    @nextjob()
            when 1
                bearobj = addObject
                    motionObj: bearChara
                    type: SPRITE
                    x: SCREEN_WIDTH / 2 
                    y: SCREEN_HEIGHT / 2 
                    image: 'bear'
                    width: 32
                    height: 32
                    gravity: 1
                    animlist: [
                        [50, [0, 0, 1, 1, 2, 2, 1, 1]] 
                        [50, [5, 5, 6, 6, 5, 5, 7, 7]] 
                    ]   
                GLOBAL['bearchara'] = bearobj

                bearobj.animnum = 1 

                enemyObj = addObject
                    motionObj: enemy01
                    type: SPRITE
                    x: rand(SCREEN_WIDTH)
                    y: rand(SCREEN_HEIGHT / 2)
                    image: 'bear'
                    width: 32
                    height: 32
                    animlist: [
                        [50, [0, 1, 0, 2]] 
                    ]   
                GLOBAL['enemy'] = enemyObj

                @nextjob()
```
次に「**enforceMain.coffee**」の「**constructor**」を下記のように修正し、新規に作成した「**gameControl.coffee**」からオブジェクトを生成してください。

```coffeescript
    constructor:->
        gameControlObj = addObject
            type: CONTROL
            motionObj: gameControl
```
すべての修正が終わり、保存／コンパイルが正常に終了しましたらブラウザをリロードしてください。
画面に「**PUSH 'z' KEY**」と出て、「z」キーを押すとゲームが開始するようになるはずです。

**注意：enchant.jsのLabelは、XPERIA Aの標準ブラウザで使用すると、標準ブラウザが落ちます。**


[チュートリアル（８）](http://qiita.com/digitarhythm/items/aff4f6c8e1d353381e17) <--- ⬛︎ ---> [チュートリアル（１０）](http://qiita.com/digitarhythm/items/ec2ddf65496b0d536d0d)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
ウェブ地図がツールとしてある時代に等高線のある地図を読図するとはどういうことになるのか。

ウェブ地図がツールとしてある時代に等高線のある地図を読図するとはどういうことになるのか、よくわからない。等高線のある地図の読図は、通常、起伏のある地形で、地形に逆らわずに、あるいは地形を利用しながら行動するときに使われるが、現代日本において地形を利用して行動する、一般的なユースケースが思いつかない。

思いつかないままに、非現実なユースケースながら、まずはツールとしてウェブ地図を使って読図結果を共有するにはどういうことが可能なのか、作業しながら考えてみる。

表筑波スカイラインを北上する相手を待ちぶせするのに適する地形はどこか
==
まったく現実味のないユースケースであるが、とにかくウェブ地図で等高線のある地図を読図した結果を共有する作業をしてみたいので、やってみる。

1. http://maps.gsi.go.jp/#16/36.209628/140.123448 の位置
自分に対して道路が横に走るので、相手の動きを見やすい。相手に対して適当に高い位置となり、しかも崖の上に立てる。自陣側の北への尾根は緩やかであり、東側には逃げ込める谷があるように見える。他方、相手側の逃げ口である南南西方向は地形が開けており、自陣側から非常に見えやすいとともに、傾斜が急になる方向に転換するので、相手側が多人数の場合、そこに停滞する効果が見込める。

2. http://maps.gsi.go.jp/#16/36.200088/140.128019 の位置
1 番とほぼ同様。撤退となれば西に走る尾根を急いで通るか、相手の接近が速い場合には北に走る谷に飛び込んで遮蔽してもらうのではないだろうか。南のコルに差し掛かる辺りで接触を開始して、目の前の道路あたりで止めるような動きになるのではないか。

※ http://maps.gsi.go.jp/#16/36.189456/140.128062 は、かえって囲まれてしまうので良くないように思った。

感想
==
1. 地形を使うユースケースとして、もうすこしまともなもの、例えば登山行動や宿営、を考えたほうがよい。
2. 地形図を使った囲碁、みたいなウェブゲームを作ることができれば面白いかもしれない。計算機用には標高タイルデータがあるので、評価は可能であろう。ただ、現代日本において、趣味以上の価値を出せない気がする。
とりあえず実施せずにキープしておくべき調査・開発作業

すぐには動けないが、余力があるときに調べておきたいことのメモ

Tangram
==
- Tangram が対応する GeoJSON タイルは、Mapzen/OSM.US-style のタイルである。TileLayer.GeoJSON が対応するようなプレインな GeoJSON タイルからの変換が必要である。アプローチは3つあるだろう。クラシックなやり方はHTTPサーバサイドでフィルタを作ること。簡単なsinatraアプリケーションを作って、要すれば heroku にもホストさせてもらうといい。もうひとつはTangramにモンキーパッチする形でプレインGeoJSONタイル対応をすること。読み込ませるべきデータに合わせたその場限りのモンキーパッチでよいだろう。3つめはService Workerを使うこと。ただ、Service Workerはまだブラウザ実装が少なく、いろいろと当たる問題がありそうであり、何よりスキルが手元にないので、難しいだろう。

Cesium
==
- 1月5日にバージョン1.5がリリースされ、GeoJSON対応が改善されたように書かれている http://cesiumjs.org/2015/01/05/Cesium-version-1.5-released/ が、試していない。余力があれば試しておくべき。

Leaflet 1.0
==
- Leaflet 1.0 が出るタイミングも、いまのところ読めないので、時々チェックしておくべきである。

binary vector tiles
==
- 現在、やや geobuf が出てきているところであるが、まだフォーマットが揃うのか、フラグメントされた形になるのか、読みづらい。

geojson-vt
==
- GeoJSON データのタイル化をブラウザ上で行うという手法であり、データ公開者の負担を劇的に減少させる可能性がある。ただし、初回転送のペナルティが大きいので、バイナリフォーマットとの併用や、オフラインキャッシュの普及が前提になる可能性が高い。ブラウザにおけるオフラインキャッシュは、Service Workerとともに新規まき直しになるので、実用化までにしばらく時間がかかるおそれがある。それまでは、サーバに入っている時点でタイル化されているほうが保守的である。

gsimaps の非公式英語版
==
gsimaps の非公式英語版を作成してみる。ジャパニーズがソフトウェア開発における「翻訳・I18Nトラップ」から遁れられないのはよくわかった。でも、英語から日本語への翻訳と、日本語から英語への翻訳のバランスが悪すぎる。日本語から英語への翻訳もあるのだ、という事例を示す。
RxJavaで時間軸にまつわる実験をするのに便利なコード

RxJavaで時間軸にまつわる実験をするのに便利なコードを書いてみた。初期値としてミリ秒単位で数字を並べると、その数字の後にそのミリ秒分の delay が入るという物。

```java
Observable
	.just(100, 200, 100, 300, 100)
	.concatMap(ms -> Observable.just(ms).delay(ms, TimeUnit.MILLISECONDS))
	.timeInterval()
	.toBlocking()
	.forEach(n -> System.out.println(n));
```

ちなみにtoBlocking()を入れているのは、RxJavaではObservable.interval() や Observable#delay を入れると、ストリームが途中の状態でもメインスレッドが終了してしまうため。

なので、toBlocking()を入れなくても Thread.sleep() を入れるなどの手段でも適切に実行することはできる。