OmniAICreator/Qiita-1.07M huggingface dataset:
apache

#HTTP
## show supported methods

```
➜ nc 192.168.0.12 81
OPTIONS / HTTP/1.1
Host: 192.168.0.12

HTTP/1.1 200 OK
Date: Sun, 02 Apr 2017 12:34:34 GMT
Server: Apache
X-Content-Type-Options: nosniff
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
Allow: GET,HEAD,POST,OPTIONS
Content-Length: 0
Content-Type: httpd/unix-directory
```

#directive
##ProxyVia
Information provided in the Via HTTP response header for proxied requests
http://httpd.apache.org/docs/2.2/en/mod/mod_proxy.html#proxyvia

```
[1:06:15 - 14-09-07] /Users/toripiyo/tmp % grep -i via /usr/local/etc/apache2/2.2/extra/httpd-proxy.conf
ProxyVia On
[1:05:58 - 14-09-07] /Users/toripiyo/tmp % curl -I www.rakuten.co.jp 2>/dev/null| grep -i via
Via: 1.1 localhost:8080
```

```
[1:11:08 - 14-09-07] /Users/toripiyo/tmp % grep -i via /usr/local/etc/apache2/2.2/extra/httpd-proxy.conf
ProxyVia Block
[1:12:09 - 14-09-07] /Users/toripiyo/tmp % curl -I www.rakuten.co.jp 2>/dev/null| grep -i via
[1:12:12 - 14-09-07]
```

```
[1:15:19 - 14-09-07] /Users/toripiyo/tmp % grep -i via /usr/local/etc/apache2/2.2/extra/httpd-proxy.conf
ProxyVia Off
[1:15:37 - 14-09-07] /Users/toripiyo/tmp % curl -I gree.co.jp 2>/dev/null| grep -i via
[1:15:48 - 14-09-07] /Users/toripiyo/tmp
```
[Objective-C] UIImageの画像に色をつける


Tab barなどアイコンに色を塗って表示することがあると思います。
iOS7からは`UIImage#imageWithRendaringMode`を変更して手軽にアイコンに色を塗ることが出来ます。

```objc
// UIImageを作る
UIImage *aImage = [UIImage imageNamed:@"icon.png"];

// ※ `imageWithRenderingMode:`メソッドを使って新しく`UIImage`を生成する
aImage = [aImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *aImageView = [[UIImageView alloc] initWithImage:aImage];

// アイコンに指定したい色を`tintColor`として設定
aImageView.tintColor = UIColor.redColor;
[self.view addSubview:aImageView];
```

以上のようにすることで手軽に色を設定できます。
一点注意点として、`imageWithRenderingMode:`メソッドは新しく`UIImage`を生成しているので、それを`UIImageView`に設定しないと色が変わらないので注意です。

（最初、たんなる設定項目かと思って色が変わらずに焦った( ;´Д`)）
【自分用メモ】TimesTenのPERM_ALLOCATED_SIZE


PERM_ALLOCATED_SIZEは、`sys.odbc.iniファイル`内のPermSizeで指定されている。
別環境のTTbkupをリストアしたからといっても変わらない。
変えたければ、`sys.odbc.iniファイル`内のPermSizeの設定値を変える必要がある。


```
#####################################################################
# Instance-Specific System Database
#
# A predefined instance-specific database reserved for system use.
# It provides a well-known database for use when a connection
# is required to execute commands.
#
#####################################################################

[TT_1122]
Driver=/home/timesten/TimesTen/tt1122/lib/libtten.so
DataStore=/home/timesten/TimesTen/tt1122/info/TT_1122
DatabaseCharacterSet=US7ASCII
PermSize=80

```

```
Command> 
Command> dssize

  PERM_ALLOCATED_SIZE:      81920
  PERM_IN_USE_SIZE:         3766
  PERM_IN_USE_HIGH_WATER:   3766
  TEMP_ALLOCATED_SIZE:      40960
  TEMP_IN_USE_SIZE:         9442
  TEMP_IN_USE_HIGH_WATER:   9505

Command> 
Command> 
```Tim
Goのバージョンアップをした際のライブラリのリビルド

Goを１．３から１．３．１に上げた後、ビルド時にこんなエラーが出るようになった。

```
import /home/sudix/pkg/linux_amd64/github.com/codegangsta/cli.a: object is [linux amd64 go1.3 X:precisestack]
 expected [linux amd64 go1.3.1 X:precisestack]
```

ググってこの通りにしたら、とりあえず解決。

[compilation - How to compile go program in 1.1.2 with dependencies compiled in 1.1.1? - Stack Overflow](http://stackoverflow.com/questions/18204545/how-to-compile-go-program-in-1-1-2-with-dependencies-compiled-in-1-1-1)

```shell-session
cd my_application_src_path
go clean -r -i
go install -a
```

my_application_src_pathは、自分のビルドしたいアプリのソースディレクトリ。

もっといい解決策があるような気がするんだけど、とりあえずメモ。
WinJS.Promiseでのエラーハンドル

JavaScriptのPromiseのエラー
-------------------------------------
ブラウザのJavaScriptでのグローバルエラーハンドルといえば、window.onerrorです。

```js
window.onerror = function(){
    console.log("onerror");
}
```

で、基本的にはこれだけ設定しといて通常の処理中には特別な時以外にエラー処理はしたくないのですよ。でも、Promiseで発生しているエラーはPromiseで処理しないと吸い込まれてしまうのです。たとえば、以下のような感じ。

```js
new Promise(function(resolve, reject){
    throw new Error("raise error");
};
```

まぁ、onerrorのほうはウンともスンとも言わんのですね。もう一つ。

```js
Promise.reject();
```

もういっちょ。

```js
var p = Promise.resolve();
p.then(function(){
    throw new Error("raise error");
});
```

WinJSのPromise
--------------
さて、Microsoft謹製の[WinJS](http://buildwinjs.com/)にも[WinJS.Promise](http://msdn.microsoft.com/en-us/library/windows/apps/br211867.aspx)が付いていて、こいつにはPromise内で発生したエラーを取得する仕組みが入ってます。それが[WinJS.Promise.onerror](http://msdn.microsoft.com/en-us/library/windows/apps/br211868.aspx)ってイベントですね。以下のような感じ。

```js
WinJS.Promise.onerror = function(ev){
}
//or
WinJS.Promise.addEventListener("error", function(ev){
}
```
とりあえず、コンストラクタで例外を投げてみるとちゃんとイベントが発生してくれます。

```js
WinJS.Promise.onerror = function(ev){
    console.log("promise error");
}
new WinJS.Promise(function(resolve, reject){
    console.log("start");
    throw new Error("error");
});

//start
//promise error
```
rejectもちゃんと受け取れます。

```js
WinJS.Promise.onerror = function(ev){
    console.log("promise error");
}
new WinJS.Promise(function(resolve, reject){
    console.log("start");
    reject("error");
});

//start
//promise error
```
thenでエラー処理している場合はどうなるのか？
-------------------------------------
試してみます。

```js
WinJS.Promise.onerror = function(ev){
    console.log("promise error");
}
new WinJS.Promise(function(resolve, reject){
    console.log("start");
    reject("error");
}).then(undefined, function(result){
    console.log("catch");
});

//start
//promise error
//promise error
//catch
```

onerrorイベントが2回発生しています。いったいどのタイミングでイベントが発生しているのか確認してみます。予想はコンストラクタ内のrejectが呼ばれたタイミングと、thenでonrejectedが実行されるタイミングです。

```js
WinJS.Promise.onerror = function (ev) {
    console.log("promise error");
}

var p = new WinJS.Promise(function (resolve, reject) {
    console.log("start");
    reject("error");
    console.log("rejected");
})

p.then(undefined, function (result) {
    console.log("catch");
});

//start
//promise error
//rejected
//promise error
//catch
```
"rejected"ってログが"promsise error"の後に出てるので、やっぱりコンストラクタのrejectが呼ばれたときにonerrorイベントが発生しているようです。で、こちらもやっぱり"catch"の前に"promise error"がきてるので"onrejected"が実行される前のようですね。
もうちょい見てみます。

```js
WinJS.Promise.onerror = function (ev) {
    console.log("promise error");
}
var p = new WinJS.Promise(function (resolve, reject) {
    console.log("start");
    reject("error");
    console.log("rejected");
})
p.then(undefined, function (result) {
    console.log("catch");
});
p.then(undefined, function (result) {
    console.log("catch2");
});

//start
//promise error
//rejected
//promise error
//catch1
//promise error
//catch2
```
と、いうことでthenでエラー処理しててもあんまり関係がなくって、エラーが発生した時と、エラー処理が実行されたときにイベントが発生するようです。何回もエラーが発生するってちょっと使いにくいかもですね。
storyboardだけ:iOS6/7、3.5インチ/4インチ対応 + 画面遷移

#はじめに
タブバーとナビゲーション
4インチのデザインのみで3.5インチのiPhoneとiPadに対応、
デバイスの表示領域の高さが足りなければスクロールさせる方法で実装する前提です。

探すと見つかる内容ながら、コーディング抜きはあまりなかったので
まとめました。

#構成

![スクリーンショット 2014-09-06 21.17.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/cc79ccd0-d27e-c2f5-bcec-47e2ade45056.png)

#手順
##rootViewControllerの設定
(1) TabBarControllerへNavigationController

![スクリーンショット 2014-09-06 20.55.00.png](https://qiita-image-store.s3.amazonaws.com/0/12362/5a5bad57-2284-c5a5-4de3-595b6ecf8916.png)

(2) (1)で指定したNavigationControllerへ設定するViewController
![スクリーンショット 2014-09-06 20.57.28.png](https://qiita-image-store.s3.amazonaws.com/0/12362/2ff553f4-bb30-1179-8a4f-c59473ad943f.png)

##ViewControllerへの配置
いろいろ問題はおきるのですが、最終的な設定は最後に行います。

(3) ScrollViewを配置
![スクリーンショット 2014-09-06 20.59.50.png](https://qiita-image-store.s3.amazonaws.com/0/12362/696b00ff-03ba-3738-b56d-09f9ee7b29a7.png)

(4)Viewを配置
分かりやすくするためにbackgroudColorに赤色を指定しました。
![スクリーンショット 2014-09-06 21.14.53.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e0981cb7-63ac-57a8-cdf4-cd1ad4842495.png)

##実行結果
storyboard上は3.5インチと4インチの切り替えで伸縮してるように見えていますが・・・

(a) 4インチの表示で保存し実行
![スクリーンショット 2014-09-06 21.09.01.png](https://qiita-image-store.s3.amazonaws.com/0/12362/43228615-639b-3716-55e0-2d8828119e1c.png)


(b) 3.5インチの表示で保存し実行
![スクリーンショット 2014-09-06 21.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ca94253d-cfd1-4858-584c-87ab5c8e60f5.png)

##設定の影響を考察

|結果| 原因 |
|-----------|------------|
| iOS7はNavigationBarやTabBarの高さの影響|Under Top/Bottom BarsのON|
| スクロールしない|Viewのheightがリサイズしたため？|

##ViewControllerの設定を変更

画像中のチェックボックスを外します
Ajust Scroll View Insetsを外すのが現時点でベストなもよう。
![スクリーンショット 2014-09-06 22.21.17.png](https://qiita-image-store.s3.amazonaws.com/0/12362/3243308e-0d6e-fee5-18c7-c7b8106dd746.png)

###参考
http://quesera2.hatenablog.jp/entry/2014/01/19/223234
http://qiita.com/yimajo/items/254c7cebab7864678246

##Constrainを追加する
ScrollViewのTop Space、Bottom Spaceが
NavigationBarの下限（Top Layout Guide）とTabBarの上限(Bottom Layout Guide)の所に設定されていれば
あとは下記を参考に設定が可能です。
http://qiita.com/nofrmm/items/ab7848305b019e4aaf96

View
![スクリーンショット 2014-09-07 11.46.12.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e758c793-75d8-95ea-69a9-f1a70ba77dbf.png)

ScrollView
![スクリーンショット 2014-09-07 11.46.44.png](https://qiita-image-store.s3.amazonaws.com/0/12362/7020c131-159a-c661-3b3d-6ac8c41132be.png)

View(ScrollViewに含まれる方)
![スクリーンショット 2014-09-07 11.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/12362/228d30ca-42a5-9565-b410-aa11be3fb4d4.png)

#さいごに
storyboardを3.5インチモードで表示してようが、4インチで表示して保存しようが
結果が同じになるということじゃないと危なくてしょうがありません。
iOS7でのstoryboard利用は、constrains抜きでは難しい印象です。

##storyboardだけで画面が組める利点
ここに書く内容だけであればプログラマはいりません。
デザイナーに全部任せられます。

##スクロールビューでデザインを組む利点
ひとまず4インチ用のデザインしか用意できない場合に有効です。
ただ、ユーザの使い勝手や他にもスクロールビューを多用する画面設計に寄っては向かないことがありますので
3.5インチのデザインを一緒に用意するのがベストです。

##3.5インチ用のデザインにこだわること
iPhone4系でおわり、のデザインだと思っている開発者が多いのですが
iPadで表示させたときには3.5インチのデザインになります。
現時点でiPhone6での対処法は不明瞭なところが多いものの、AutoLayoutは今後の主流になることを改めて認識しました。
第25回オフラインリアルタイムどう書くの問題をRUbyで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord25rotcell/
会場で解けなかったので、会場でのアドバイスなどを参考にして解きました。

```rb
def solve(q)
  last_change = ""
  board = [*"a".."y"].join.scan(/.{5}/).to_a
  q.split(',').each{|e|
    min_y,max_y,min_x,max_x = e.split("").map{|c| board.join.index(c).divmod(5)}.transpose.map(&:minmax).flatten
    locs = []
    cs = []
    if min_y > 0
      x0 = min_x - 1 < 0 ? min_x : min_x - 1
      x0.upto(max_x).each{|x|
        locs << [min_y - 1, x]
        cs << board[min_y - 1][x]
      }
    end
    if max_x + 1 < 5
      y0 = min_y - 1 < 0 ? min_y : min_y - 1
      y0.upto(max_y).each{|y|
        locs << [y, max_x + 1]
        cs << board[y][max_x + 1]
      }
    end
    if max_y + 1 < 5
      x1 = max_x + 1 > 4 ? max_x : max_x + 1
      x1.downto(min_x).each{|x|
        locs << [max_y + 1, x]
        cs << board[max_y + 1][x]
      }
    end
    if min_x > 0
      y1 = max_y + 1 > 4 ? max_y : max_y + 1
      y1.downto(min_y).each{|y|
        locs << [y, min_x - 1]
        cs << board[y][min_x - 1]
      }
    end
    if cs.size == 0
      last_change = "none"
      next
    end
    cs = cs.rotate(-1)
    locs.each_with_index{|loc, i|
      board[loc[0]][loc[1]] = cs[i]
    }
    last_change = cs.sort.join
  }
  last_change
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	ab,gg,uj,pt,an,ir,rr	hpqsvwxy
1	gs,ok	abcdftvwxy
2	gs,sg,ok	none
3	aa,bb,hh,nn	hiostwxy
4	ae,ko,uy,cw	bdgilnqsvx
5	am,gs,am,gs,am,gs,am,gs	cfhkmqrvwx
6	ay	none
7	gs,ay	defjkoptuv
8	bx,ay	none
9	ft,ay	defjkoptuv
10	ab,cd,ef,gh,ij,kl,mn,op,qr,st,uv,wx	cdjmnry
```
Berksfile はchef-repo のトップじゃなくてそれぞれのcookbook内に入れましょう。

```
chef-repo
  |  Berksfile
  |_ site-cookbooks
    |_ my-wordpress
    |_ my-rails
    |_ my-sinatra
```

じゃなくて

```
chef-repo
  |_ site-cookbooks
    |_ my-wordpress
    |    metadata.rb
    |    Berksfile
    |_ my-rails
    |    metadata.rb
    |    Berksfile
    |_ my-sinatra
         metadata.rb
         Berksfile
```

らしい。

何でChefのドキュメントこんなにわかりにくいの？(火垂るの墓のトーンで)


https://coderwall.com/p/j72egw
synthのチュートリアルやった

ここのチュートリアルを終えるまでにつまったところを書いてく。
http://www.synthjs.com/tutorial/

### angular is not defined

```bash
$ synth install -b 
$ synth install -f 
```

で依存モジュールをインストールしたはずなのに、```localhost:3000```に接続したら```angular is not defined```と言われてしまった。

##### 解決策

bower_components のディレクトリ置き場所が違うことによるものだった。

>Note:
>Back-end packages will be installed into my_app/back/node_modules.
>Front-end packages will be installed into my_app/front/bower_components.

コマンド叩いたときは何故か```my_app/front/app/bower_components```に生成されていたので起こられていたみたい。

### tweets じゃないアプリにしたい

チュートリアルでは tweet アプリが提供されていたけど、他のアプリも作ろうと思ってソースコードとファイル名を片っ端から tweets を hoges に変えていった。でも hogesController が undefined のエラーが出てしまう…。

```Error: [ng:areq] Argument 'hogesController' is not a function, got undefined```

##### 解決策
front/js/jsFiles に読み込んでるファイル一覧みたいなのがあった。これの controllers/tweets.js を hoges.js に変えたらうまくいきました。

ちなみに .coffee で書きたいときはソースコードの拡張子と jsFiles のファイル名を変えるだけでいいらしい！
http://qiita.com/dll7/items/1237539efdc650f8ea5e
Events in React.addons.TestUtils.Simulate (as of React v0.11.1)


I hadn't seen this written down in documentation anywhere, so I decided to do the obvious and log it out (after looking through source code naively for a bit).

```js
for (var key in TestUtils.Simulate) {
  console.log('key', key);
}
```

```js
LOG: 'key', 'blur'
LOG: 'key', 'click'
LOG: 'key', 'contextMenu'
LOG: 'key', 'copy'
LOG: 'key', 'cut'
LOG: 'key', 'doubleClick'
LOG: 'key', 'drag'
LOG: 'key', 'dragEnd'
LOG: 'key', 'dragEnter'
LOG: 'key', 'dragExit'
LOG: 'key', 'dragLeave'
LOG: 'key', 'dragOver'
LOG: 'key', 'dragStart'
LOG: 'key', 'drop'
LOG: 'key', 'focus'
LOG: 'key', 'input'
LOG: 'key', 'keyDown'
LOG: 'key', 'keyPress'
LOG: 'key', 'keyUp'
LOG: 'key', 'load'
LOG: 'key', 'error'
LOG: 'key', 'mouseDown'
LOG: 'key', 'mouseMove'
LOG: 'key', 'mouseOut'
LOG: 'key', 'mouseOver'
LOG: 'key', 'mouseUp'
LOG: 'key', 'paste'
LOG: 'key', 'reset'
LOG: 'key', 'scroll'
LOG: 'key', 'submit'
LOG: 'key', 'touchCancel'
LOG: 'key', 'touchEnd'
LOG: 'key', 'touchMove'
LOG: 'key', 'touchStart'
LOG: 'key', 'wheel'
LOG: 'key', 'mouseEnter'
LOG: 'key', 'mouseLeave'
LOG: 'key', 'change'
LOG: 'key', 'compositionEnd'
LOG: 'key', 'compositionStart'
LOG: 'key', 'compositionUpdate'
LOG: 'key', 'select'
```
Haskellにおける型クラスとC++のインターフェイス、コンセプトとの関係



今日は関西関数型道場の道場開きに参加した。
直接関係はないのだけど、記念にHaskellとC++の対応について雑感を述べる。
もう少し綺麗にまとめられるといいのだが。

Haskell歴数ヶ月の初心者なので間違いを指摘いただけるとありがたい。
C++のコンセプトについてはBoost Concept Check Libraryに基づいて考える。

- 型の族(class)を定義する、
  つまりある性質を持つ型全体を考えるという点で
  Haskellの型クラスとC++のコンセプトは同等のアイデア
- とはいえ、`CopyAssignable`, `Moveassignable`といった基本的なコンセプトは
  C++の特徴で、Haskellの型クラスに対応するものがある訳ではない。
  これはプログラミングモデル(オブジェクト指向 or 関数型)の違いに起因する。
- これはC++のコンセプトの実装の問題で未解決だが、
  Boostの実装では基本的に`static_assert`をによってコンセプトを満している事を要請する。
  つまり関数やクラスの定義時において制約を要請する。
  他方Haskellでは型演算時の制約として導入する。
  C++11の時の提案ではHaskellにだいぶ近かった。
- C++がSFINAE等を駆使してライブラリとしてコンセプトを実装している一方、
  Haskellは言語仕様として持っている。
- 型のsignatureを制約する(特定の関数を適用できなければならない)という点で、
  Haskellの型クラスとC++やJavaのインターフェイスは同じ目的を持っていると言える。
  上述したようなC++特有のメモリの扱いに関するコンセプトがHaskellには必要ないので、
  型に対する制約とはほとんど、その型がある関数の引数となれるかとなる。
- 型クラス、あるいはコンセプトによる型のシグネチャの制約は、
  実際の型の情報を保持したままである点でインターフェイスと異なる。
  インターフェイスを一度通した場合、元の型を回復するには実行時情報(RTTI)が必要となるが、
  型クラスでは情報を保持しているのでその必要がない。

C++がマルチパラダイムなせいで、
コンセプトとインターフェイスという別個の同じ目的を持つ機能が言語に含まれている。
さらにC++ではメモリを直接扱う必要があり(copy/move)、
また関数の型が統一されていないせいで、Haskellでは不必要な制約が多数ある。
Haskellでは型に対する制約は型クラスのみで扱えていて、
言語に組込まれているので色々な不都合があらかじめ回避されている。
GoF Visitorパターンのサンプル

# はじめに

http://qiita.com/ms2sato/items/416dd5c2db88997deb0c
これの続きみたいなもの。調子に乗って次はVisitorパターンとCompositeパターン。大体一緒に出るだろうから。

# せいか

構造化エディタ的なものを書きました。コンテンツと背景色が変えられるようなものです（新規追加は怠けてしまってできません）。

jsdo.it http://jsdo.it/ms2sato/uOR0
github https://github.com/ms2sato/gof/blob/master/visitor/main.coffee

# おもっていること

型のない言語だとわかりにくいですが、本来は

* 抽象化し過ぎて実体にアクセスしにくい場合にその方法を提供する為（これがないと型を調べてキャストするような操作が発生して、抽象化を破壊してしまう）。
* 操作できるオブジェクトの種類と、操作の種類そのものについて開いた設計にする為

に作るのがVisitorだと思います。Compositeするとよくこの状況に陥るので殆どセットで出てくるというのが自分の経験上の感覚です。でも、最近の緩い言語触っていると型を調べて分岐するのを当たり前に書いたりするから、そういう作り方でも良いのかもしれませんね。いらない子扱いされてしまいそうなのもわかる気がします。私のコードでもオーバーロードで解決するところをconstructorの名前を調べて分岐していますしね。

ifが出てこないのはStateパターンと同様。
Brainf*ck の派生言語作成ツール orenono gem で「CodeIQ言語」を作ってみる

# Brainf*ck の派生言語作成ツール orenono gem で「CodeIQ言語」を作ってみる

## 概要
Brainf*ck の派生言語作成ツール orenono gem で「CodeIQ言語」を作ってみます。

orenono gem については下記記事参照。
[Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)

## 前提

orenono gem をインストール済み

## 文法定義

orenono init で Orenonofile を生成し、中身を編集して文法を定義します。

* Orenonofile を生成する

~~~bash
$ orenono i
$ ls Orenonofile
Orenonofile
~~~

* Orenonofile を編集する

~~~
# encoding: utf-8

increment "新問題公開"
decrement "受付終了"
start_loop "ゴルフ問題開始"
end_loop "ゴルフ問題終了"
next_cursol "次の問題を解く"
previous_cursol "前の問題を解く"
display "提出する"
read "問題文をダウンロードする"
~~~

## CodeIQ言語 プログラム

~~~text:hello_world.bf
新問題公開新問題公開新問題公開新問題公開新問題公開
新問題公開新問題公開新問題公開新問題公開
ゴルフ問題開始
	次の問題を解く
		新問題公開新問題公開新問題公開新問題公開新問題公開
		新問題公開新問題公開新問題公開
	次の問題を解く
		新問題公開新問題公開新問題公開新問題公開新問題公開
		新問題公開新問題公開新問題公開新問題公開新問題公開
		新問題公開
	次の問題を解く
		新問題公開新問題公開新問題公開新問題公開新問題公開
	前の問題を解く
	前の問題を解く
	前の問題を解く
		受付終了
ゴルフ問題終了
次の問題を解く
	提出する
次の問題を解く
	新問題公開新問題公開
	提出する
	新問題公開新問題公開新問題公開新問題公開新問題公開
	新問題公開新問題公開
	提出する
	提出する
	新問題公開新問題公開新問題公開
	提出する
次の問題を解く
	受付終了
	提出する
	受付終了受付終了受付終了受付終了受付終了
	受付終了受付終了受付終了受付終了受付終了
	受付終了受付終了
	提出する
前の問題を解く
	新問題公開新問題公開新問題公開新問題公開新問題公開
	新問題公開新問題公開新問題公開
	提出する
	受付終了受付終了受付終了受付終了受付終了
	受付終了受付終了受付終了
	提出する
	新問題公開新問題公開新問題公開
	提出する
	受付終了受付終了受付終了受付終了受付終了
	受付終了
	提出する
	受付終了受付終了受付終了受付終了受付終了
	受付終了受付終了受付終了
	提出する
次の問題を解く
	新問題公開
	提出する
~~~

* インデントは読みやすさのために追加しているだけで、処理には不要です。

## 実行結果

~~~bash
$ orenono e hello_world.bf
Hello, world!
~~~

## 参考
サンプルと等価な Brainf*ck のソースコード

~~~
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.
~~~

### orenonoスライドショー
http://tbpgr.github.io/orenono_slide/#/

## 参照
* [Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)
* [Brainf*ck の派生言語作成ツール orenono gem で「デスマーチ言語」を作ってみる](http://qiita.com/tbpgr/items/20cb5e08b298d7cb1dcd)
* [orenono gem GitHub](https://github.com/tbpgr/orenono)
* [orenono gem RubyGems](http://rubygems.org/gems/orenono)
AWSで無料枠を超えた時にアラートを飛ばす

AWSでは新規にアカウントを取得してから1年間、サービスごとに無料枠が用意されています。
私のような貧乏エンジニアはその枠を大いに利用させてもらって勉強したいと思うのですが、
AWSは従量課金のサービスなので、気づかぬ間に無料枠を超えてしまわないか心配です。

そんな人のためにAWSでは**請求金額が一定金額に達した際にメールで通知される仕組み**が用意されています。

AWSのアカウントをとった人はまず最初にこの設定をしておくことをオススメします。


# 設定手順


まずAWSにログインし、メニューバーの右の方にある自分のアカウント名をクリックし、
『Billing & Cost Management』を選択します。

> ![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/41da8df0-27e8-5d18-fb37-aec8c19bb0f8.jpeg)

---



画像の赤丸で囲った『Enable Now』をクリックします。
左メニューの『Preferences』でも大丈夫です。
> ![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/3ce99629-15ed-a8fc-8709-8c3213b067e5.jpeg)


---

画像にあるように下記順に実行
1. 『Receive Billing Alerts』にチェックを入れる
2. 『Save preferences』をクリック
3. 『Manage Billing Alerts』をクリック
> ![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/c05fb631-56a7-0d44-f5bc-ecf23fde37a5.jpeg)

---

左メニューにある『Billing』をクリック
> ![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/e984091c-688f-71ea-b0f5-535d89005b8c.jpeg)

---

『Create Alarm』ボタンをクリック
> ![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/5bab1754-d094-4b78-7c25-7dc92e58b2c3.jpeg)

---

真ん中にある2つのテキストボックスに値を入力後、右下の『Create Alarm』をクリック
(もっと詳細に設定したい場合は下の方の『show advanced』をクリックすると詳細設定ができる)

- 入力欄上：アラートを出したい金額(今回は10ドルでアラートが飛ぶように設定)
- 入力欄下：アラートを飛ばしたいメールアドレス

> ![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/b8de2f8a-f3e6-4e44-cc0f-3a64a9605b80.jpeg)

---

ポップアップが現れて、先ほど入力したメールアドレス宛に認証メールが届くので、メール内のリンクをクリックする
> ![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/0cefea05-0ca4-6113-84b8-957078b2615e.jpeg)

---

メールのリンクをクリックし、認証が完了したらステータスが『OK』になり、設定完了
> ![008.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/7afa5379-07c4-0501-2b41-2fb0e48f457d.jpeg)


# 最後に

これで突然数万円請求されて社会的な死を迎えるリスクを軽減することができました。
ちなみにリアルタイムの監視ではなく、一定間隔ごとのチェック(デフォは6時間)になっているはずなので気をつけましょう。
チェック間隔も設定できるのかな……？

これでお金の心配をしなくても、AWSがガンガン使えますね！
WebView に表示した Video タグをオートプレイ設定する方法


WebView上でVideoタグを使って自動で映像を流すようなアプリを Titanium (iPhone) で作っていました．
が，WebView が表示されても自動で映像が流れませんでした．

HTML5 の仕様としては Videoタグには autoplay 属性を指定することで自動再生できるのですが，iPhone だとAppleの制約なのか自動再生はできないようです．

が，擬似的に次のようなコードで実現できるようです．（Apple の審査が通るかは不明です）

```html:app/assets/video.html
<!DOCTYPE html>
<html>
  <head>
    <script src="http://www.google.com/jsapi"></script>
    <script>google.load("jquery", "1.3");</script>
    <script type="text/javascript"> 
    jQuery.noConflict(); var j$ = jQuery;
    function fakeClick(fn) {
        var $a = j$('<a href="#" id="fakeClick"></a>');
            $a.bind("click", function(e) {
                e.preventDefault();
                fn();
            });
        j$("body").append($a);
        var evt, 
            el = j$("#fakeClick").get(0);
        if (document.createEvent) {
            evt = document.createEvent("MouseEvents");
            if (evt.initMouseEvent) {
                evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                el.dispatchEvent(evt);
            }
        }
        j$(el).remove();
    }
    j$(function() {
        var video = j$("#my-video").get(0);
        document.getElementById("my-video").playbackRate = 1;
        fakeClick(function() {
            video.play();
        });
    });
    </script>
    
  </head>
  <body>
    <video id="my-video" width="340" height="273" src="filename.mp4" />
  </body>
</html>
```

```javascript:app/controller/index.js
   $.webview.url = "video.html"
```

```xml:app/view/index.xml
<Alloy>
	<Window class="container">
      <WebView id="webview" />
	</Window>
</Alloy>
```

# 参考
http://logic.moo.jp/data/archives/736.html
angular.module の落とし穴

angular.module関数を呼び出すとき、第２引数に配列を指定する場合と、指定しない場合で、意味が異なる。

* 第２引数に配列を指定する場合

```
// myModuleを新規に作成し、既存のmyModuleが存在した場合には、上書きする。
angular.module('myModule', []);
```

* 第２引数を指定しない場合

```
// 既存のmyModuleを取得する。
angular.module('myModule');
```

* 「第２引数を指定しない場合」のパターンでは、myModuleが存在していない場合に、次のようなエラーになる。
    
> Uncaught Error: [$injector:nomod] Module 'myModule' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

### 落とし穴
例えばモジュールにコントローラを設定する際に、「第２引数に配列を指定する場合」のパターンでモジュールを取得した場合、既存のモジュールを上書きしてしまう。

```
// myModuleモジュールを作成し、AControllerを設定する。
angular.module("myModule", []) .controller("AController", AController);

// myModuleモジュールを作成し、BControllerを設定する。既存のmyModuleは上書きされる。
angular.module("myModule", []) .controller("BController", BController);
```

このとき、AControllerの設定は上書きされてなくなってしまうので、AControllerを使用する箇所で、次のようなエラーになる。

> Error: [ng:areq] Argument 'AController' is not a function, got undefined

モジュールを複数回呼び出す場合には、初回のみ「第２引数に配列を指定する場合」のパターンでモジュールを新規作成し、２回目以降は「第２引数を指定しない場合」のパターンでモジュールを取得するようにする。

```
// myModuleの新規作成
angular.module("myModule", []);

// 既存のmyModuleにコントローラを設定
angular.module("myModule") .controller("AController", AController);

// 既存のmyModuleにコントローラを設定
angular.module("myModule") .controller("BController", BController);

// AController と BController を使用可能
```

参照：[https://docs.angularjs.org/guide/module](https://docs.angularjs.org/guide/module)の「Creation versus Retrieval」の項目に仕様の記述
pythonでコレクション中のオブジェクトのメンバーのインデックス(メンバーをキーにした辞書)を作ってくれるラムダ式(修正)

pythonでコレクション中のオブジェクトのメンバーのインデックス(メンバーをキーにした辞書)を作ってくれるラムダ式

```py3
import functools as f
makeindexes = lambda objects:{attr:{str(getattr(x,attr)):x for x in objects if attr in dir(x)} for attr in f.reduce(set.union,(set(y.__dict__.keys()) for y in objects if hasattr(y,"__dict__")),set())}

class A:
	def __init__(self,name):
		self.name = name
		self.id = id(self)

objs = [A(x) for x in ["tama","poti","mii"]]

indexes = makeindexes(objs)

print(indexes.keys())
#dict_keys(['id', 'name'])

print(indexes["name"]["poti"].name)
#poti

```

このままでは値がユニークでないとインデックス出来ないのでリストに包むことに。

``` py3
mMakeindexes = lambda objects:{outer:f.reduce(lambda d,o:d[getattr(o,outer)].append(o) or d,objects,{getattr(obj,outer):[] for obj in objects if outer in dir(obj)}) for outer in f.reduce(set.union,(set(y.__dict__.keys()) for y in objects if hasattr(y,"__dict__")),set())}

objs = [A("poti") for x in range(5)]

indexes = mMakeindexes(objs)

print(indexes["name"]["poti"])
#[<__main__.A object at 0x7f0b4f2d7710>, <__main__.A object at 0x7f0b4f2d7790>] [<__main__.A object at 0x7f0b4f2d77d0>, <__main__.A object at 0x7f0b4f2d7850>]

```

うーむ、もっと綺麗に書けないものか
RSA公開鍵認証によるssh接続設定について（Macbook -> VPS）


以下の環境での設定となります。
**接続元：Macbook Air (LinuxOSでも応用可能です）**
**接続先：VPS上に立てているCentOS6.5**

前提として
事前にVPSにはコンソールでの操作・またはsshログインが可能であること

どのような設定をすれば公開鍵認証でのssh接続ができるか

ざっくり言うと、
**Macbook側で鍵を作成し、その鍵をVPSサーバに登録する**
だけです。


Macbook とかVPSとかCentOSとか手順に書くとちょっとややこしいので、
接続元であるMacbookはクライアント
接続先であるVPSはサーバ

と表現します。

##1.クライアント側で認証用の鍵を作成
クライアントで以下を実行


####公開鍵と秘密鍵の作成
**$ pwd**
/Users/hogehoge/.ssh

公開鍵と秘密鍵を作成します、鍵の種類はRSAに設定
**$ ssh-keygen -t rsa**
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_rsa): **[鍵の出力先の名前]**　
*自分はエンター押してデフォルトを利用しました*

Enter passphrase (empty for no passphrase): **[パスフレーズ]**
Enter same passphrase again: **[パスフレーズ]**
*パスワードではなく、パスフレーズ。暗号化に使う文言です。*

Your identification has been saved in /Users/hogehoge/.ssh/id_rsa.
Your public key has been saved in /Users/hogehoge/.ssh/id_rsa.pub.
The key fingerprint is:
The key's randomart image is:
+--[ RSA 2048]----+


####公開鍵と秘密鍵がセットになっているか確認
別に確認する必要性はないけど、テクニックとして記載。
出力されたファイルがリンクしてるか確認。

**# cat id_rsa.pub**(公開鍵)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCZ/3pKQoe8s6PNfzVskfvC

**# ssh-keygen -y -f id_rsa**(秘密鍵)
Enter passphrase: **[パスフレーズ]**
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCZ/3pKQoe8s6PNfzVskfvC


##2.　公開鍵をサーバに設置

####公開鍵をサーバに設置

**$ scp id_rsa.pub user@xx.xx.xx.xx:~/.**
*※公開鍵のみ！秘密鍵は送らないこと*

####サーバにログイン
**$ ssh user@xx.xx.xx.xx**


####公開鍵ファイルの設定 
**$ cd ~/.ssh**

~/.ssh/authorized_keysが存在しない場合は作る
**$ touch authorized_keys**

公開鍵の中身を追記
**$ cat ~/id_rsa.pub >> authorized_keys**

.sshフォルダとauthorized_keysファイルの権限を設定（権限に問題なければ操作不要
**$ chmod 700 ~/.ssh**
**$ chmod 600 ~/.ssh/authorized_keys**


##3.サーバ側で/etc/ssh/sshd_configを編集し、rsa公開鍵認証を有効にする

*root権限での作業です*

####sshd_configの編集
**# cd /etc/ssh**
**# cp -p sshd_config sshd_config.org**
**# vi sshd_config**


*以下のコメントアウト解除*
RSAAuthentication yes # RSA認証の許可
PubkeyAuthentication yes # 公開鍵認証の許可
AuthorizedKeysFile	.ssh/authorized_keys #公開鍵ファイルのパス

*パスワード認証の禁止もする場合はこれをnoにする*
PasswordAuthentication no

sshd再起動
**# service sshd restart**

##4.クライアントからsshログイン

あとはクライアントから接続できることを確認するだけ
**$ ssh -i ~/.ssh/id_rsa user@xx.xx.xx.xx**


##5.おまけ

####クライアントのconfigファイルに全部書いちゃうとsshログインは楽です。

**$ cd ~/.ssh/**
**$ vi config**

```bash:config

Host vps-server
    HostName xx.xx.xx.xx
    Port 22
    User hogehoge
    IdentityFile ~/.ssh/id_rsa
```

これだけでssh接続ができます
**$ssh vps-server**
Google Analytics の計測を開発中にデバッグする with google-analytics-rails

## [google-analytics-rails](https://github.com/bgarret/google-analytics-rails) は ga.js を使っています

`analytics.js` の方には __対応していない__ ようですので、今回紹介する方法も `ga.js` の方のみの話です。

### README に書いてある

[Different accounts for development and production - bgarret/google-analytics-rails](https://github.com/bgarret/google-analytics-rails#different-accounts-for-development-and-production)

```md:README
app/views/layout/application.html.erb, in the <head> tag :

    <%= analytics_init :local => Rails.env.development? %>
```

### local を渡すとどうなるか

以下のようにオプションが追加されます。

```js
var _gaq = _gaq || [];
_gaq._getTracker('UA-xxxxxx');
_gaq._setDomainName('none'); // <- これが増える
```

つまり localhost で実行される development 時にもトラッキングを行うための設定がこれという事のようです。

- [local オプションが渡った場合に通るコード - bgarret/google-analytics-rails](https://github.com/bgarret/google-analytics-rails/blob/master/lib/google-analytics/rails/view_helpers.rb#L92)
- [_setDomainName オプションの部分のコード - bgarret/google-analytics-rails](https://github.com/bgarret/google-analytics-rails/blob/master/lib/google-analytics/events/events.rb#L11)
- [GA Event Tracking from localhost - stackoverflow](http://stackoverflow.com/questions/17215745/ga-event-tracking-from-localhost)

### _setDomainName オプションは

本来はクロスドメインでのトラッキング等に利用されるオプションのようです。なるほど、Google Analytics に指定したドメイン以外からのアクセスができるようにしてる訳ですかね。

ちなみに `analytics.js` の方の方法も以下で紹介されていました。

[Can you test google analytics on a localhost address? - stackoverflow](http://stackoverflow.com/questions/4375447/can-you-test-google-analytics-on-a-localhost-address)
PDFを1ページごと、PNGに変換する方法


いつも、やり方を忘れるのでメモ。

## 前提とする環境

- Mac OS X
- Automator


## Automatorのワークフロー

- Get Specified Finder Items
- PDF to Images
- Change Type of Images

以上!

![Untitled.workflow.png](https://qiita-image-store.s3.amazonaws.com/0/1858/eb55e8b8-ae41-c357-ad57-02d898cdceba.png "Untitled.workflow.png")
RubyMotionでUITextViewの状態監視


UITextViewでのテキスト編集開始や変更を検知するためのサンプルコードとその実行結果。

### 1. ディレクトリ構成
```
$ tree app
app
├── app_delegate.rb
└── controllers
    └── sample_controller.rb

1 directory, 2 files
```

### 2. app_delegate.rbを編集する
SampleControllerをルートビューとして配置しているだけ

```ruby
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.makeKeyAndVisible

    sample_ctrl = SampleController.alloc.initWithNibName(nil, bundle: nil)
    @window.rootViewController = UINavigationController.alloc.initWithRootViewController(sample_ctrl)
    true
  end
end
```

### 3. sample_controller.rbを編集する
テキストの編集開始、変更を扱う4つのメソッドを実装している。
他にもテキストの完了を監視するメソッドなどもある。

```ruby
class SampleController < UIViewController

  def viewDidLoad
    super
    self.title = 'Sample'

    text_view = UITextView.new
    text_view.delegate = self
    text_view.backgroundColor = UIColor.grayColor
    text_view.frame = CGRectMake(
      0,
      0,
      self.view.bounds.size.width,
      self.view.bounds.size.height
    )

    self.view.addSubview(text_view)
  end

  #
  # テキストの編集が開始される直前に呼ばれる
  #
  def textViewShouldBeginEditing(textView)
    puts 'Before begin'
    true # ここでfalseを返すと編集が開始されない
  end

  #
  # テキストの編集を開始したタイミングで呼ばれる
  #
  def textViewDidBeginEditing(textView)
    puts 'Begin'
  end

  #
  # テキストの状態が変更されるタイミングで呼ばれる
  #
  def textViewDidChange(textView)
    puts 'Change'
  end

  #
  # カーソルの動き、選択範囲の変更が行われるタイミングで呼ばれる
  #
  def textViewDidChangeSelection(textView)
    puts 'Change Selection'
  end

end
```

### 4. 実行する
まずrakeでエミュレータを起動

```
$ rake
================================================================================
A new version of RubyMotion is available. Run `sudo motion update' to upgrade.
================================================================================

     Build ./build/iPhoneSimulator-7.1-Development
    Create ./build/iPhoneSimulator-7.1-Development/event.app/Info.plist
  Simulate ./build/iPhoneSimulator-7.1-Development/event.app
(main)>
```

画面はこうなる。
![スクリーンショット 2014-09-06 18.11.38.png](https://qiita-image-store.s3.amazonaws.com/0/2813/eb68797c-73d6-6b47-be65-636fa671ff58.png "スクリーンショット 2014-09-06 18.11.38.png")

この状態で画面をタップして「abc」と入力してEnterを押す。
![スクリーンショット 2014-09-06 18.13.14.png](https://qiita-image-store.s3.amazonaws.com/0/2813/018700b9-e742-6d82-627b-883fec24f6c8.png "スクリーンショット 2014-09-06 18.13.14.png")

ターミナルには以下のように出力されている。
それぞれのイベントタイミングに応じてメソッドが呼び出されていることがわかる。

```
$ rake
================================================================================
A new version of RubyMotion is available. Run `sudo motion update' to upgrade.
================================================================================

     Build ./build/iPhoneSimulator-7.1-Development
    Create ./build/iPhoneSimulator-7.1-Development/event.app/Info.plist
  Simulate ./build/iPhoneSimulator-7.1-Development/event.app
(main)> Before begin
Begin
Change Selection
Change
Change Selection
Change
Change Selection
Change
Change Selection
Change Selection
Change
Change Selection
Change
```
めぐるセル

一瞬びびってしまったが、鍋谷さんの仰る通り確かに楽でした。
(backports gemが必要ですが)Ruby 1.8でも動作します。

それなりにDRYにしたつもり。

```rb:hena25.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/636fce060e1ebbc95f9b
#http://nabetani.sakura.ne.jp/hena/ord25rotcell/
if RUBY_VERSION<'1.9'
	require 'rubygems'
	require 'backports' # (Math.cbrtと異なり)1.8のArray#rotateはbackportsに存在するので、ありがたく使わせて頂きます
end
if $0==__FILE__
	STDOUT.sync=true
	while gets
		str=''
		area=[*'a'..'y'].each_slice(5).to_a
		$_.chomp.split(',').each{|s|
			x,y=2.times.map{|i|[*0...area[0].size].product([*0...area.size]).find{|x,y|area[y][x]==s[i,1]}}.transpose
			minx,maxx=x.minmax.zip([-1,1]).map{|e|e.reduce(:+)}
			miny,maxy=y.minmax.zip([-1,1]).map{|e|e.reduce(:+)}
			x=minx
			y=miny
			rotaters=[]
			rotaters<<[x+=1,y] while x<maxx
			rotaters<<[x,y+=1] while y<maxy
			rotaters<<[x-=1,y] while x>minx
			rotaters<<[x,y-=1] while y>miny
			rotaters=rotaters.select{|x,y|0<=y&&y<area.size && 0<=x&&x<area[y].size}
			str=rotaters.map{|x,y|area[y][x]}.rotate(-1)
			rotaters.each_with_index{|(x,y),i|area[y][x]=str[i]}
		}
		puts str.empty? ? :none : str.sort*''
	end
end
```
git commitで自動的にチケット番号を追加する

[git commitでコミットメッセージにチケット番号を追加する記事](http://blog.enogineer.com/2014/09/06/git-hook-commit-ticket/)の通りにprepare-commit-msgをhookするだけ。
ブランチ名を見て

    (branch-345)$ git add readme.txt
    (branch-345)$ git commit -m "Add readme.txt"
    (branch-345)$ git log --oneline -n 1
    6550158 #345 Add readme.txt

という感じになります。

チケットのプレフィックスを変更するなら.bash_profileに

```.bash_profile
export TICKET_PREFIX="TICKET-"
```

という感じで設定します。
TypeScriptでAngularJS

## 参照したスライド
http://www.slideshare.net/armorik83/gdgkobe-angularjs-2


## 開発環境など
残念。うぃんどうずでした。

- OS: Windows8.1
- 開発ツール: VisualStudio Express 2013 for Web Update3


## 手順
コントローラーのTypeScript化についてだけ以下に記載します。バインドの話やService/Factoryについては参照元スライドをご参照ください。


## 1.型定義ファイルのインポート
https://github.com/borisyankov/DefinitelyTyped から必要なライブラリについてダウンロードするのは "手仕事感" が強くThe職人芸ですよね。。私はNugetを使います。
http://www.nuget.org/profiles/DefinitelyTyped で登録されているパッケージ一覧を見ることができます。今回はAngularJSのパッケージをインストールします。VisualStudioのパッケージマネージャーコンソールで、

```
install-package angularjs.TypeScript.DefinitelyTyped
```

と入力するとAngularJS型定義ファイル一式が /Scripts/typings/angularjs 以下にインストール・プロジェクト追加されます。

## 2.TypeScriptファイルの作成
(参照したスライドのコードほぼパクらせていただきました。) **TypeScriptで記述するのはコントローラークラスだけです。** Angularモジュールへのコントローラー割り付けは従来通りJavaScriptで記述します。

``` /Scripts/myts/file1.ts
/// <reference path="../typings/angularjs/angular.d.ts" />

module File1 {

    export class SampleCtrl {

        public firstName: string;
        public lastName: string;

        constructor() {
            this.init();
        }

        private init(): void {
            this.firstName = "John";
            this.lastName = "Doe";
        }

        public getFullName(): string {
            return this.firstName + " " + this.lastName;
        }
    }
}

angular.module("MyAngularJs", []).controller("SampleCtrl", [File1.SampleCtrl]);
```


## 3.HTMLファイルの作成
これも参照したスライドのをほぼまるパクリです。(ところでng-controllerのas指定なんていう素敵機能以前からありましたっけ？)

```/index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script src="https://code.angularjs.org/1.3.0-rc.0/angular.min.js"></script>
    <script src="Scripts/myts/file1.js"></script>
</head>
<body ng-app="MyAngularJs">
    <div ng-controller="SampleCtrl as c">
        <p>FirstName: {{c.firstName}}</p>
        <p>LastName: {{c.lastName}}</p>
        <p>FullName: {{c.getFullName()}}</p>
    </div>
</body>
</html>
```
各言語におけるヒアドキュメント記述方法

# ヒアドキュメント

複数行に渡る文字列を一度で定義できる記法 。

# なにがいいのか？

例えばphpで改行付きの文字列を書くとき↓のように書く人をみたことないですか？

```
$str = "aaa" + PHP_EOL + "bbb" + PHP_EOL + PHP_EOL  + "ccc"
（PHP_EOLは\nのこと）
```

とか

```
$str = "{$piyo}\n\n{$hoge}\n{$fuga}"
```

とか

よみずらいし、改行つけ忘れそう、結局どんな文字列になるのかわからん・・。
それが多分解消される記述方法じゃないだろうか!

# 何が良くないのか

インデントが汚く？なります。
※インデントをいれようとすると、それは空白（スペース）になるので。

# HowTo
## PHP

EOSの部分は任意（下記は一例　EndOfStringの略）

```
$str = <<<EOS
AAA
BBB
CCC
EOS;
```


## Ruby

EOSの部分は任意

```
str=<<"EOS"
AAA
BBB
CCC
EOS
```
## Bash

EOSの部分は任意

```
str << EOS
AAA
BBB
CCC
EOS
```
## Perl

EOSの部分は任意

```
my $str = <<'EOS';
AAA
BBB
CCC
EOS
```

## Python

pythonは若干他と違うようでダブルクオートx3で囲むようです。
こちらの記法はコメントを書くときにもよくみますね。

```
str = """
AAA
BBB
CCC
"""
```

## Java
ないので、文字連結はStringBuilderとかつかうのですかね。

# まとめ
* 言語によって若干の差はあるものの基本似たような記述ですね。
* スクリプト系には基本あるみたいですね。C++とかScalarとかあるのかな？機会があれば調べます。
* 個人的にはすごく見やすくて好きです。よく使います。そしてこれからも。
第25回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://yhpg.doorkeeper.jp/events/13947 )を行っています。

問題は「めぐるセル」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord25rotcell/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間ぐらいあれば足りるかな、と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
SkinnyFrameworkのバリデーション機能の独自実装例

SkinnyFrameworkのバリデーション機能はskinny.validator.ValidationRuleを派生させて作成することができます。
このバリデーション機能は基本的に対象フィールドの値のフォーマットを検証するようになっていますが、ちょっと強引に複雑なバリデーションを行う方法をあげてみます。


２つのフィールドの値を比較して検証する
----

２つのフィールド間の大小関係などを検証するバリデータを作ってみました。


```scala
/**
 * 日時データ比較
 *
 * @param targetKey 比較対象のフィールドキー
 * @param targetValue 比較対象の値
 * @param compareName 比較方法の名称
 * @param comparator 比較処理
 */
class compareDateTime(targetKey: String, targetValue: Any, compareName: String,
    comparator: (DateTime, DateTime) => Boolean) extends ValidationRule {

  def name = "compareDateTime"

  override def messageParams = Seq(I18nKeyParam(targetKey), I18nKeyParam(compareName))

  def isValid(v: Any): Boolean = {
    val value = targetValue match {
      case Some(v) => v
      case None => null
      case v => v
    }

    (v, value) match {
      case (lhsStr: String, rhsStr: String) =>
        (for (
          lhs <- Try(DateTimeUtil.parseDateTime(lhsStr)).toOption;
          rhs <- Try(DateTimeUtil.parseDateTime(rhsStr)).toOption
        ) yield {
          comparator(lhs, rhs)
        }).getOrElse(false)

      case _ =>
        // パラメータが存在しないことは許容する
        true
    }
  }
}

case class greaterThanDateTime(targetKey: String, targetValue: Any) extends
  compareDateTime(targetKey, targetValue, "greaterThan", (l, r) => l.compareTo(r) > 0)

case class greaterEqualDateTime(targetKey: String, targetValue: Any) extends
  compareDateTime(targetKey, targetValue, "greaterEqual", (l, r) => l.compareTo(r) >= 0)

case class lessThanDateTime(targetKey: String, targetValue: Any) extends
  compareDateTime(targetKey, targetValue, "lessThan", (l, r) => l.compareTo(r) < 0)

case class lessEqualDateTime(targetKey: String, targetValue: Any) extends
  compareDateTime(targetKey, targetValue, "lessEqual", (l, r) => l.compareTo(r) <= 0)
```

```messages.conf
error {
  compareDateTime="{0} は {1} {2}の日時にしてください"
}

greaterThan="超"
greaterEqual="以上"
lessThan="未満"
lessEqual="以下"
```


使い方は以下のように比較対象のフィールドのメッセージキーと値を渡します。

```scala
override def createForm = validation(createParams,
  paramKey("begin_date") is required & dateFormat,
  paramKey("end_date") is required & dateFormat &
    greaterEqualDateTime("model.beginDate", createParams.getAs("begin_date"))
)
```



DBにアクセスして検証する
----

フィールドの値ががDB中でユニークかどうかを検証するバリデーションは以下の感じです。

```scala
/**
 * ユニークであること
 *
 * @param fieldName フィールド名
 * @param paramType パラメータの型
 * @param id 対象モデルの主キー値
 * @param model モデル
 */
case class unique[Entity](fieldName: String, paramType: ParamType, id: Option[Long],
    model: SkinnyCRUDMapper[Entity]) extends ValidationRule {

  def name = "unique"

  def isValid(v: Any): Boolean = isEmpty(v) ||
    (model.countBy(sqls.ne(model.primaryKeyField, id.getOrElse(-1)).
      and.eq(model.defaultAlias.field(fieldName), paramType.unapply(v))) == 0)
}
```

```messages.conf
error {
  unique="指定の{0}は既に存在しています"
}
```


使用例です。

```scala
override def updateForm = validation(updateParams,
  paramKey("name") is required &
    unique("name", ParamType.String, params.getAs("id"), model)
)
```
Vim(CUI) で Solarized を使う時の設定

ターミナルのカラー設定も Solarized にしているのですが、
色設定がターミナルと Vim で重なってしまい、
ターミナルで見づらい色を変更すると、Vim の色が大変なことになってしまっていました。

なんとなく GVim 使って回避してたりもしたのですが。

**ちゃんと設定しないといけなかった！**

`g:solarized_termtrans=1`


**よく読みましょう...**
https://github.com/altercation/vim-colors-solarized/blob/master/README.mkd
Bundler+rspec+binstubでgemを新しく作る

gem作成&その他もろもろ

    $ bundle gem my_gem
    $ cd my_gem
    $ mkdir spec
    $ bundle install --binstubs=bundle_bin

gemspecに追加

```my_gem.gemspec
...
  spec.add_development_dependency "rspec"
  spec.add_development_dependency "rspec-collection_matchers"
  spec.add_development_dependency "rspec-its"
...
```

Rakefileに追加

```Rakefile
...
begin
  require 'rspec/core/rake_task'
  RSpec::Core::RakeTask.new(:spec)
rescue LoadError
end
```

spec_helper.rbを作成

```spec/spec_helper.rb
require "rspec/collection_matchers"
require "rspec/its"
```

.gitignoreに追加

```.gitignore
...
bundle_bin
```
Macbookでsftpコマンド実行

Macbookからsftpを実行しようとしたら若干引っかかったので覚え書きです。

#usage

$ sftp
usage: sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
          [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
          [-o ssh_option] [-P port] [-R num_requests] [-S program]
          [-s subsystem | sftp_server] host
       sftp [user@]host[:file ...]
       sftp [user@]host[:dir[/]]
       sftp -b batchfile [user@]host

# 実行例

### ログイン

$ sftp -P [※ポート番号] [ユーザ名]@[接続対象のIPアドレス]
user@xx.xx.xx.xx's password: 
Connected to xx.xx.xx.xx.
sftp> 
※port番号はssh接続ポート、変更してなければ指定する必要なし
その場合は、
$ sftp [ユーザ名]@[接続対象のIPアドレス]

### ファイルをmacbookからput
sftp> put ./test.txt
Uploading ./test.txt to /home/user/test.txt
./test.txt                                                            100%  415     0.4KB/s   00:00    
dirでputされたことを確認
sftp> dir
test.txt
     
### カレントディレクトリの確認もできる
sftp> pwd
Remote working directory: /home/user

### macbookへget
sftp> get test.txt
Fetching /home/user/test.txt to test.txt
sftp> 

!lsでmacbookでgetされていることを確認
sftp> !ls
test.txt
sftp> bye


## 引っかかったところ

ポートの指定は後ろに書いちゃダメ、それだけ。
usageちゃんと見ろという感じです。。

$ sftp [ユーザ名]@[接続対象のIPアドレス] -P [ポート番号] 
usage: sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
          [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
          [-o ssh_option] [-P port] [-R num_requests] [-S program]
          [-s subsystem | sftp_server] host
       sftp [user@]host[:file ...]
       sftp [user@]host[:dir[/]]
       sftp -b batchfile [user@]host

# おまけ

### 接続先（linux)でsftpの許可設定について

#### sshd_configファイルを編集する
`# vi /etc/ssh/sshd_config`

```lang:/etc/ssh/sshd_config
# override default of no subsystems
# Subsystem       sftp    /usr/libexec/openssh/sftp-server
```
Subsystem sftp... の行のコメントインを行う

```lang:/etc/ssh/sshd_config
# override default of no subsystems
 Subsystem       sftp    /usr/libexec/openssh/sftp-server
```

#### sshd再起動

sshd再起動にて反映
`# /etc/init.d/sshd restart`
Java WebアプリでSentryでログを記録する方法

2016/07/15 追記

raven-javaのバージョンが上がって、導入方法がもっと簡単になっています。(確認時点でv7.0.0)
以下の章の実装は不要になっています。

* Httpリクエストの内容を記録する
  * Servlet3.0のServletContainerInitializerの機能により、明示しなくてもlistenerが自動登録されるようになっています
* 検索したい項目をタグとして記録する
  * logback.xmlの定義で、`<extraTag>`でタグ化したいキー名を列挙するだけでよくなっています

-----

JavaのWebアプリで[Sentry](https://getsentry.com/welcome/)でログを記録するときのメモを残しておきます。
ベースとして、[raven-java](https://github.com/getsentry/raven-java)を使います


Httpリクエストの内容を記録する
----

raven-javaに含まれるRavenServletRequestListenerをweb.xmlにてlisternerに追加すれば、うまい具合にHttpリクエストの内容がログに付与されます。

```web.xml
  <!-- Sentryログ出力内容設定機能を登録 -->
  <listener>
      <listener-class>net.kencochrane.raven.servlet.RavenServletRequestListener</listener-class>
  </listener>
```


細々とした内容をログに付与する
----

logbackなどのMDCを使うことでログに任意のkey,valueの値を記録できます。

```
  MDC.put("erroNo", exception.hashCode());
  logger.error("Error Log");
```


検索したい項目をタグとして記録する
----

SentryのWeb画面上にはログの検索機能があるのですが、メッセージなどの一部の内容でしか検索できません。
前述したMDC.put()で追加した内容は検索対象にならないので、困る場合があります。
そこで、検索したい項目をタグとして記録すれば、タグ検索を利用することができるようになります。

タグに値を記録するためには、以下のようにSentryAppenderを拡張します。
拡張したAppenderにてログエントリの生成処理にヘルパーを追加し、
その中でMDCの項目の一部をタグとして追加し直しています。


```AppSentryAppender.scala
package lib

import net.kencochrane.raven.event.EventBuilder
import net.kencochrane.raven.event.helper.EventBuilderHelper
import net.kencochrane.raven.logback.SentryAppender
import net.kencochrane.raven.servlet.RavenServletRequestListener

/**
 * Sentryのログ出力を拡張するためのAppender
 */
class AppSentryAppender extends SentryAppender {

  override protected def initRaven() {
    super.initRaven()

    if (raven != null) {
      raven.addBuilderHelper(new AppSentryHelper)
    }
  }
}

/**
 * アカウント情報をタグで出力させる
 */
class AppSentryHelper extends EventBuilderHelper {

  override def helpBuildingEvent(eventBuilder: EventBuilder) {
    // MDCの一部をタグに登録
    Seq(
      "errorNo",
      "userId"
    ).foreach { key =>
        val v = MDC.get(key)
        if (v != null) {
          eventBuilder.addTag(key, v)
        }
      }


    // httpリクエストから情報を取得したい場合
    val request = RavenServletRequestListener.getServletRequest
    if (request != null) {

      request.foreach { account =>
        eventBuilder.addTag("account", account.id)
      }

    }

  }

}
```


その他
----

Sentryのログには、いくつかの専用のデータ構造を記録する機能があります。
Httpリクエストのログはその一部です。

ドキュメント以下のページなどで専用形式の項目の説明があるのでこれを利用してもよいかもしれません。

http://sentry.readthedocs.org/en/latest/developer/client/index.html#building-the-json-packet
http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html
自分用　Apache+passenger+sinatraの設定方法まとめ

なんかまた後で調べるはめになるかもなのでまとめた。

###1.passengerをインストール

```text:console
gem install passenger
```

gemが使えれば普通にインストールされるはず


###2.Apache用モジュールのビルド

```text:console
passenger-install-apache2-module
```

Apacheをソースビルドした場合はなんかPATHの設定が必要らしいがそんな事をする予定はないので省略
色々表示されるが大体無視してEnterを押してOK

最後のほうで、設定用のテキストが表示されるのでコピーする

```text:console
LoadModule passenger_module /usr/local/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/passenger-4.0.50/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/passenger-4.0.50
  PassengerDefaultRuby /usr/local/rbenv/versions/2.0.0-p247/bin/ruby
</IfModule>
```

あとで上記のテキストだけ見たい場合は

```text:console
passenger-install-apache2-module --snippet
```

で見れる

###3.passenger.confの設定
Apacheの設定ファイルpassenger.confを作成する（ない場合は新規で）

```text:console
vim /etc/httpd/conf.d/passenger.conf
```

```text:passenger.conf
# Passenger base config
LoadModule passenger_module /usr/local/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/passenger-4.0.50/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/passenger-4.0.50
  PassengerDefaultRuby /usr/local/rbenv/versions/2.0.0-p247/bin/ruby
</IfModule>

# Delete Passenger's HTTP Header
Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"

# Passenger tuning config
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
RailsSpawnMethod smart
RailsAppSpawnerIdleTime 86400
PassengerMaxPreloaderIdleTime 0

RailsEnv development  # production か development を設定
RackBaseURI /app1     # DocumentRootからのアプリケーションフォルダ相対位置
RackBaseURI /app2     # 複数設定可能
```

###4.アプリケーションフォルダの配置
sinatraアプリケーションフォルダをどっかに置く（仮にapp1, app2とする）
app1/public へのSymLinkをDocumentRoot（ここでは/var/www/html）に作成する

```text:console
cd /var/www/html
ln -s app1/public app1
ln -s app2/public app2
```

あと必要に応じてバーチャルホストの設定とかする。

###5.Apache再起動

```text:console
service httpd restart
```

権限周りで動かない時は、PassengerUserSwitching PassengerDefaultUser あたりのオプションを設定するか、ファイルのオーナーを書き換える。


おわり