OmniAICreator/Qiita-1.07M huggingface dataset:
[CakePHP 2.3.9]Configureを使う

## Configureには配列を登録しておける。

```php
Configure::write('config', array(
    'default' => array(
        'home' => '/',
        'ssl' => true,
    ),
));
```

または

```php
Configure::write(array(
    'config' => array(
        'default' => array(
            'home' => '/',
            'ssl' => true,
        ),
    ),
));
```

## Configureからはキーを指定して取り出せる。

```php
print_r(Configure::read('config'));
```

出力結果

```
Array
(
    [default] => Array
        (
            [home] => /
            [ssl] => 1
        )

)
```

* 個別でも取り出せる。

```php
print_r(Configure::read('config.default.home')); // "/"
```

* 未定義のキーなら「null」が返ってくる。

```php
print_r(Configure::read('config.default.url')); // ""
print_r(gettype(Configure::read('config.default.url'))); // "NULL"
print_r(Configure::read('config.default.url') === null); // "1"
```

## keyが「0」だとConfigure::check()が動作しない点は注意。

```php
Configure::write(1, 'value');
print_r(Configure::read(1)); // "value"
print_r(Configure::check(1)); // "1"
```

```php
Configure::write(0, 'value');
print_r(Configure::read(0)); // "value"
print_r(Configure::check(0)); // "" <- valueは取り出せるものの存在しない扱いになる
```
使っている環境のグローバルIPアドレスを調べるコマンド


確認くんなどが有名だが、コマンド一発で知りたい場合に便利。

ifconfig.meというサイトで使っている環境のグローバルIPがわかる。

```:使っている環境のグローバルIPアドレスを調べる
$ curl -s ifconfig.me
```

```sh:シェルスクリプトに組み込む
#!/bin/sh

MYIP=`curl -s ifconfig.me`

echo $MYIP
```

AWSのインスタンスに割り当てられているグローバルIPを取得する場合、メタ情報にアクセスすれば取得できる。

```:AWSのインスタンスに割り当てられているグローバルIPを取得
$ curl -s http://169.254.169.254/latest/meta-data/public-ipv4
```
サイドバーを固定サイズにしてメインカラムを可変にする方法



サイドバーを固定化してメインカラムを可変にしようと思い、cssでのやり方がわからなかったのでjavascriptで実装していました。
画面幅を取得して、そこから固定divの幅と間に取りたいマージンを引いて、メインカラムの幅にする。みたいな処理をしていたのですが、
cssで実装できるようなのでまとめてみました。


javascriptでも数行で実装できますが、ブラウザ上で画面幅を変えたときにリロードしないとカラムが落ちてしまうということと、
cssでの実装が思ったよりも簡単だったのでcssで実装する事をお勧めします。



## 文章でまとめると


- 固定する方のdivはwidthをpxで指定する (```width: 300px```)
- 可変する方のdivはwidthを100%にして固定するdivの幅のネガティブマージンを指定（```margin-right: -300px```）
- 可変する方のdivの内側にdivを作り、固定するdivの方に固定するdivの大きさ分marginをとる（```margin-right: 300px```）  
※（）の中は固定する幅を300pxにした場合。


## コードの例

文章だとわかりにくいところもあると思うので、コードも書いておきます。

例）左側にサイドカラムを作りwidthを280pxにして、メインカラムを可変にする場合

HTML

```html

<div class="wrap">
	<div class="main">
		<div class="main_inner">
			<!-- メインカラムの内容 -->
		</div>
	</div>
	<div class="side">
		<!-- サイドカラムの内容 -->
	</div>
</div>

```


CSS

```css

.main {
	margin-right: -280px;
	width: 100%;
	float: left;
}

.main .main_inner {
	margin-right: 280px;
}

.side {
	width: 280px;
	float: right; /* leftでも可 */
}

```

メインカラムとサイドカラムの間の幅とか、画面端とカラムの間とかを調整しながら実装してください。
基本的に``` .main ```の```margin-right```と```.main .main_inner```の値を大きくするとメインとサイドの間が空きます。



## まとめ

みそはネガティブマージンを取ってそこに固定divを入れるところと、可変divの中にもう一つdivを作るところかなーって思います。
意外と簡単に実装できたので今後も使っていこうと思います。
AmazonLinuxでrubyからdocker apiを使う

* 以前書いた [AWSで初めてのDocker: AmazonLinux上でAmazonLinuxのコンテナを動かす](http://qiita.com/kmats@github/items/224e997672fd0d865d8b) の続き
* AmazonLinuxのDockerホスト上でrubygemsの[docker-api](https://github.com/swipely/docker-api)(1.19.0)を使おうとしたところハマったのでその解決法を書きます

```
$ ruby -r docker -e 'p Docker.version'
/usr/local/share/ruby/gems/2.0/gems/docker-api-1.19.0/lib/docker/connection.rb:50:in `rescue in request': Expected([200, 201, 202, 203, 204, 304]) <=> Actual(404 Not Found) (Docker::Error::NotFoundError)
	from /usr/local/share/ruby/gems/2.0/gems/docker-api-1.19.0/lib/docker/connection.rb:38:in `request'
	from /usr/local/share/ruby/gems/2.0/gems/docker-api-1.19.0/lib/docker/connection.rb:61:in `block (2 levels) in <class:Connection>'
	from /usr/local/share/ruby/gems/2.0/gems/docker-api-1.19.0/lib/docker.rb:94:in `version'
	from -e:1:in `<main>'
```
----

### 結論
* docker-apiの要求するのとDockerが提供するAPIのバージョンが違った

```
$ ruby -r docker -e 'Docker.validate_version!'
/usr/local/share/ruby/gems/2.0/gems/docker-api-1.19.0/lib/docker.rb:118:in `rescue in validate_version!': Expected API Version: 1.16 (Docker::Error::VersionError)
	from /usr/local/share/ruby/gems/2.0/gems/docker-api-1.19.0/lib/docker.rb:115:in `validate_version!'
	from -e:1:in `<main>'
```

```
$ curl http://localhost:4243/version
{"ApiVersion":"1.15","Arch":"amd64","GitCommit":"c78088f/1.3.3","GoVersion":"go1.3.3","KernelVersion":"3.14.27-25.47.amzn1.x86_64","Os":"linux","Version":"1.3.3"}
```

### 解決方法
* 現在のAmazonLinuxの最新でもAPI1.15なのでgemのバージョンを下げるしかない

```
$ gem install docker-api -v 1.18.0
```

```
$ ruby -r docker -e 'Docker.validate_version!; p Docker.version'
{"ApiVersion"=>"1.15", "Arch"=>"amd64", "GitCommit"=>"c78088f/1.3.3", "GoVersion"=>"go1.3.3", "KernelVersion"=>"3.14.27-25.47.amzn1.x86_64", "Os"=>"linux", "Version"=>"1.3.3"}
```
JavaScriptで即時関数を使う理由


# 即時関数とは

即時関数は、<b>関数を定義すると同時に実行するための構文</b>。


## 基本的な使い方

### 書き方

```javascript:
(function () {
    //処理
}());
```


### 引数
引数をもたせられる

```javascript:
(function (param1, param2) {
    //処理
}('hoge', 'fuga'));
```


### 返り値

通常の関数同様返り値を持つことができる

```javascript:
var result = (function (param1, param2) {
    return param1 + param2;
}(1, 2));
 
console.log(result); //3が出力される。
```

# 即時関数を使う理由

ズバリ、<b>スコープの汚染を防ぐため。</b>

## JavaScriptのスコープ

JavaScriptのスコープは、「グローバルスコープ」と「関数スコープ」のみ。すなわち関数は任意にスコープを作るための唯一の手段である。

関数スコープの中でvarを使って定義された変数は関数の中でローカルな変数になるので、関数の外側の変数を上書きしたりすることはない。

## なるべく変数の有効範囲をせばめる

一時変数を使用する一連の処理があった時に、それらの変数をすべてグローバル変数にしてしまうのはアンチパターン。なぜなら、コードが大きくなるにつれグローバルスコープが不要な変数名であっという間に埋め尽くされてしまい、コーディングがしづらくなるだけではなく、予期せぬトラブルの元にもなるから。そのため変数の有効範囲は可能な限りせばめるべき。

一連の処理を即時関数で包み一時的なスコープの中で実行することは、プログラムをスコープ上のサンドボックス内で実行することになるため、スコープの外側へ影響を与えてしまうことを防ぐ。そのため即時関数が必要とされる。


# 名前付き関数との主な用途の違い

処理が再利用されないのであれば、即時関数を使うべき。

- 名前付き関数：再利用を前提とした一連の処理を定義する
- 即時関数：再利用されない一連の処理を新たなスコープで包み込む


# 即時関数の使いどころ

## 1. ページの初期化

ページ読み込み時に時刻を表示する処理。一時変数は初期化完了後にはもはや不要なので、グローバル変数として定義するのは好ましくない。そこで、初期化コード全体を即時関数で包むことで初期化完了後に一時変数などの不要な副産物を残さないようにしている。

```javascript:init.js
//初期化処理
(function () {
    var label = document.getElementById('date_label'),
        now = new Date();
        label.innerText = now;
}());
```

## 2. 機能判定

デバイス判定など。以下の例では処理の中で使用している一時変数はデバイス判定後は不要なので、グローバル変数として定義したくない。そのため即時関数で包み、実行結果をdeviceという変数に格納するようにしている。

```javascript:
var device = (function() {
	var ua = navigator.userAgent;
	if ((ua.indexOf('iPhone') > 0 && ua.indexOf('iPad') == -1)
		|| ua.indexOf('iPod') > 0
		|| ua.indexOf('Android') > 0) {
		return 'sp';
	} else {
		return 'pc';
	}
}());
```


## 3. プライベートプロパティ／メソッドの定義
JavaScriptにはアクセス修飾子はない。そのためオブジェクト内に定義されたプロパティ/メソッドはすべてパブリックなものとして扱われる。しかし、即時関数やクロージャを利用すればプライベートなプロパティ／メソッドを定義することが可能。

以下は、即時関数とオブジェクトリテラルで作成したもの。これならcountをローカル変数として扱い、オブジェクトの外からのアクセスを防ぐ事ができる。

```javascript:
var counter = (function () {
        //プライベートにしたいプロパティ
        var count = 0;
 
        return {
            //加算メソッド
            increment: function () {
                count += 1;
                console.log(count);
            }
        };
    }());
 
counter.increment(); //1が出力される
counter.increment(); //2が出力される
 
console.log(counter.count); //※undefined
```
Railsでキャッシュにあったら返す、なかったらセットするやつ

if文書いてあったらreadなかったらwriteする、とか書く必要がありません。
fetch一発でいけます、楽ちん過ぎてゆとり化が捗ります。

```rb

Rails.cache.fetch(
  "today_average_reponse_time_#{Time.now.to_date.to_s}", 
  expires_in: 1.hour, compress:true) do
  Report.today_average_reponse_time
end

```

消したりして動作チェックしたいときはこれ。

```rb

Rails.cache.delete("today_average_reponse_time_2015-02-20")

```
文字色をグラデーションでアニメーション

# はじめに
24オープニングをプログラミングのみで再現したくなり
Xcodeを立ち上げ、ぽちぽちと作りました。

参考:
[24 Opening Theme Song](https://www.youtube.com/watch?v=nDoTPTP5pnA)

まずはデジタルな文字の背景がアニメしている箇所のみを。

やっている内容は「アニメーションするグラデーション背景を文字型に切り抜き」とも言えます。

![hvnv5.gif](https://qiita-image-store.s3.amazonaws.com/0/63205/a8874890-b213-5fe7-efda-fe4bb2798af4.gif)



# アニメーションするグラデーション背景

```objc

- (void)insertGradientLayer:(UIView *)view
{
    UIColor *beginColor = [UIColor redColor];
    UIColor *endColor = [UIColor blueColor];

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"colors"];
    animation.duration = 2.0;
    animation.repeatCount = HUGE_VALF;
    animation.autoreverses = YES;
    animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
    animation.fromValue = @[(id)beginColor.CGColor, (id)endColor.CGColor];
    animation.toValue = @[(id)endColor.CGColor, (id)beginColor.CGColor];
    
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = view.bounds;
    gradient.colors = @[(id)beginColor.CGColor, (id)endColor.CGColor];
    [gradient addAnimation:animation forKey:@"colors"];

    [view.layer insertSublayer:gradient atIndex:0];
}

```

# 文字マスクを作成し重ねる

UILabelをUIImage化し、マスク画像としています。
文字は黒色、背景は透明色です。

UIViewのUIImage変換は「関連」を参考にしてください。
有用な情報の共有ありがとうございます！

```objc

    UIView *gradientView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, 320, 300)];
    [self insertGradientLayer:gradientView];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 160)];
    label.font = [UIFont fontWithName:@"DBLCDTempBlack" size:144];
    label.textColor = [UIColor blackColor];
    label.text = @"24";
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    [self.view addSubview:label];

    UIImage *maskImage = [self imageFromView:label];
    CALayer *mask = [CALayer layer];
    mask.contents = (id)[maskImage CGImage];
    mask.frame = CGRectMake(0, 0, maskImage.size.width, maskImage.size.height);

    gradientView.layer.mask = label.layer;
    
    [self.view addSubview:gradientView];

```

# おわりに
このプログラムはいつ完成するのか！
のんびりとした気持ちでお待ちください。

ちなみに24ではシーズン２が一番好きです。

# 参考
[UIViewをUIImageに変換する](http://qiita.com/y_matsuwitter/items/029933bea283b16ecc89)
数当てゲームの練習

#問題
>
これは答えの数を探すゲームです。
適当な数を入れると正解よりも大きいか小さいか,または正解であるか出力されます。
それを繰り返すことで答えを探すことができます。
このゲームを作成しなさい。
答えの数は乱数を使って毎回別の答えを用意しましょう。


※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答
```ruby:number_guessing_game.rb
# 正解の数
# 乱数を使って毎回違う数を生成
# 今回は0〜10
ANSWER_NUMBER = rand(0..10)

# 開始
puts "数当てゲームを開始します"

# 正解するまで無限ループ
while true
  print "正解だと思う数を入力してください : "
  
  # 数を入力
  anticipated_number = gets.to_i
  
  # 正解したらループから抜ける
  break if anticipated_number == ANSWER_NUMBER
  
  # 正解よりも小さい数が入力された
  if anticipated_number < ANSWER_NUMBER
    puts "#{anticipated_number}は正解の数よりも小さい数です"
    
  # 正解よりも大きい数が入力された
  else
    puts "#{anticipated_number}は正解の数よりも大きい数です"
  end
end

puts "正解です！"
```

#結果
```
数当てゲームを開始します
正解だと思う数を入力してください : 5
5は正解の数よりも小さい数です
正解だと思う数を入力してください : 7
7は正解の数よりも小さい数です
正解だと思う数を入力してください : 9
正解です！

```
線形合同法を用いた乱数生成の練習

#問題
>
線形合同法を用いて0<=x<1の範囲の乱数を発生させるプログラムを作成せよ。
M＝65536(=2^16),A=997,B=1,Xの初期値を12345として100個の乱数を発生させ,その値と平均を出力しなさい。

※[こちらのサイト](http://vipprog.net/wiki/exercise.html#q9f27a17)から引用

#解答
```ruby:lcgs.rb
# 線形合同法に用いる定数の宣言
M = 65536.0
A = 997
B = 1
x = [12345]

# 乱数の生成数
RAND_NUMBER = 100

# 合計数を格納する変数
sum = 0

# 線形合同法を用いて乱数を生成して表示
(RAND_NUMBER).times do |n|
  x.push(((A * x[n] + B) % M))
  print format('%1.4f ', x[n + 1] / M)
  
  # 後で平均を求めるため合計数に追加
  sum += x[n + 1]
  
  # 10個表示したら改行
  if (n % 10) == 9
    print "\n"
  end
end

# 平均値を計算して表示
ave = sum / RAND_NUMBER
puts format('平均 = %1.4f', ave / M)
```

#結果
```
0.8047 0.2430 0.2977 0.7755 0.1405 0.1119 0.5266 0.0315 0.4149 0.6418 
0.9050 0.2534 0.6121 0.2548 0.0421 0.9879 0.9665 0.6227 0.7974 0.0321 
0.9626 0.6673 0.2803 0.4326 0.3346 0.5605 0.8500 0.4865 0.0669 0.7243 
0.1161 0.7406 0.3940 0.8304 0.9378 0.9918 0.8002 0.8008 0.4246 0.2869 
0.0199 0.8074 0.9357 0.9228 0.0374 0.2719 0.0807 0.4464 0.0871 0.8663 
0.7188 0.6546 0.6535 0.5125 0.9595 0.5943 0.4708 0.3823 0.1620 0.5622 
0.5235 0.8976 0.9359 0.1054 0.0459 0.7303 0.1404 0.0206 0.5224 0.8023 
0.8850 0.3548 0.6873 0.2854 0.5290 0.4047 0.5252 0.6015 0.6818 0.7174 
0.2702 0.4225 0.2027 0.0897 0.4069 0.6702 0.2012 0.5684 0.6695 0.5166 
0.0366 0.4504 0.0425 0.3835 0.3182 0.2826 0.7602 0.9427 0.9056 0.8619 
平均 = 0.5070
```

#参考

* [線形合同法-wikipedia](http://ja.wikipedia.org/wiki/線形合同法)
メールフォームを作成できるmailformproの実装方法

#メールフォームを作成する事の出来るmailformproの実装方法

以下のサイトからダウンロードできます。
[メールフォームプロCGI - SYNCK GRAPHICA](http://www.synck.com/contents/download/cgi-perl/mailformpro.html)

## head内の記述（cssの読み込み）

```html

<link rel="stylesheet" href="mfp.statics/mailformpro.css" type="text/css" /> 

```


## フォーム実装部分の記述

```html

<form id="mailformpro" action="mailformpro/mailformpro.cgi" method="POST"> 
     
     <!-- フォームの内容 -->
     
     <button type="submit">確認画面へ進む</button>
     
</form>
<script src="mailformpro/mailformpro.cgi" id="mfpjs"></script>

```



## その他の実装方法

- 必須項目  
　→FORM系タグ（input / textarea / select など）に
　　required="required"を付与
　
- 自動返信先となるメールアドレス
　→メールアドレスを入力するinputタグのname属性を"email"に設定

- メールアドレス（確認用）
　→確認用のメールアドレスを入力するinputタグのname属性を"confirm_email"に設定

- 確認画面カスタマイズ（CSSで出来る範囲）
　formタグのすぐ上あたりに下記の記述を入れる

```html

<div id="mfp_phase_confirm">
     <div id="mfp_phase_confirm_inner">
     </div>
</div>

```


``` mfp_phase_confirm_inner ```内に動的に生成される要素に対してスタイルを設定していけばカスタマイズできます。





## Perlのパス

mailformpro.cgi の１行目の
```#!/usr/bin/perl```

サーバ業者によって違う為、変更が必要な場合があります。
ロリポップの場合はデフォルトのままで大丈夫。



## パーミッションの設定  
![mfpパーミッション.png](https://qiita-image-store.s3.amazonaws.com/0/63056/7246f857-d6af-7447-d906-754c705534c6.png)


以上
fig.yml でも Yaml anchors/references ですっきり書ける

## 経緯

例えば

- PHP 5.4、5.5、5.6 のコンテナをこうばばっと [Fig](http://www.fig.sh/) で起動したい
- アプリケーションコードは各コンテナが同じディレクトリを `volume` でマウント

ということをしたい時、`fig.yml` をこうするでしょうか。

```yaml
php54:
  image: example/php54
  ports:
    - "80"
  volumes:
    - /opt/app:/opt/app

php55:
  image: example/php55
  ports:
    - "80"
  volumes:
    - /opt/app:/opt/app

php56:
  image: example/php56
  ports:
    - "80"
  volumes:
    - /opt/app:/opt/app

```

かなりタルい。`image` だけ違ってあとは共通、となるとこうなってしまいがちです。

共通項目であるところの `ports` や `volumes` は
Dockerfile に `VOLUME` とか `EXPOSE` とか書けば良い、というのは
確かにその通りなんですが、せっかく fig で呼び出すのだから
fig.yml にある程度まとめておきたい。


## そんな時

Yaml の Anchor(`&`) と Reference(`*`) を思い出しました。

```yaml
php54: &php
  image: example/php54
  ports:
    - "80"
  volumes:
    - /opt/app:/opt/app

php55:
  <<: *php
  image: example/php55

php56:
  <<: *php
  image: example/php56
```

すっきりした :pizza: 

## 参考

- [Global env variables · Issue #210 · docker/fig](https://github.com/docker/fig/issues/210)
- [Image inheritance · Issue #610 · docker/fig](https://github.com/docker/fig/issues/610#issuecomment-61932482)

```irc
「各サービスで使えるグローバルなパラメータ設定したいわ」
「お前それ Yaml の anchor でがんばれよ」
```

というやりとりが多かった。
Selenium WebDriverのPythonバインディングでFireFox(via Homebrew-cask)を使用する


Selenium WebDriver(Pythonバインディング)でFireFoxを使おうとした際に、以下のエラーが出た。

```python:
>>> from selenium import webdriver
>>> driver = webdriver.Firefox()
...
FileNotFoundError: [Errno 2] No such file or directory: '/Applications/Firefox.app/Contents/MacOS/firefox-bin'
```

引数なしで`webdriver.Firefox`を呼んだ場合、各環境毎のデフォルトのパスが使用される。(Macの場合は`/Applications/Firefox.app/Contents/MacOS/firefox-bin`)

(ref) https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/firefox/firefox_binary.py#L143

自身の環境ではHomebrew-Cask経由でFireFoxをインストールしており、その場合のパスは`~/Applications/Firefox.app/Contents/MacOS/firefox-bin`になる。このパスをWebDriverに伝えるためには、以下のように`FireFoxBinary`インスタンスを与える必要がある。

```python:
>>> bin = webdriver.firefox.webdriver.FirefoxBinary('/Users/FGtatsuro/Applications/Firefox.app/Contents/MacOS/firefox')
>>> driver = webdriver.Firefox(firefox_binary=bin)
```
転置行列を求める練習

#問題
>
入力された行列の転置行列を求めよ

※[こちらのサイト](http://vipprog.net/wiki/exercise.html#q9f27a17)から引用

#解答
```ruby:transposed_matrix.rb
# 受け取った行列を表示するメソッド
def show_matrix(matrix)
  matrix.length.times do |col|
    matrix[0].length.times do |row|
      print format('%2d ', matrix[col][row])
    end
    print "\n"
  end  
end

# 入力行列の列数
MATRIX_COL = 3
# 入力行列の行数
MATRIX_ROW = 3

# 入力となる行列の宣言
t_matrix = Array.new(MATRIX_ROW).map{ Array.new(MATRIX_COL) }

# 値のセット
# 練習も兼ねてランダムにセット
# 値は1〜20までの整数値
t_matrix.length.times do |col|
  t_matrix[0].length.times do |row|
    # rand(1..20)で1〜20の範囲で乱数を生成っていう意味
    t_matrix[col][row] = rand(1..20)
  end
end  
  
# 入力した行列の表示
puts "入力した行列を表示します"
show_matrix(t_matrix)

# 転置行列を求める
puts "転置行列を求めます"

# 列は0番目から始めて（列の長さ - 2）回繰り返す
(0..(t_matrix.length-2)).each do |col|
  # 行は（currentの列 + 1）番目から始めて（行の長さ-1）まで繰り返す
  (1..(t_matrix.length-1)).each do |row|
    # 配列の中身を入れ替え
    t_matrix[col][row], t_matrix[row][col] = t_matrix[row][col], t_matrix[col][row]
  end
end

#転置行列を表示
puts "転置行列を表示します"
show_matrix(t_matrix)
```

#結果

```
入力した行列を表示します
 3  9  5 
16 10  2 
15  7 15 
転置行列を求めます
転置行列を表示します
 3 16 15 
 9 10  7 
 5  2 15 
```

#追記
`Array#transpose`を使うと
楽に転置行列を求められることを教えていただきました。（コメント参照）
今回は練習を兼ねて自力で解いてみました。
[Swift]Computed Propertyでもswap関数が使えた


今まで出来ないと思い込んでいたのですが、出来たんですね。

* Swift 1.2 + Playground

```swift:
import UIKit

class Person {
    private var _age = 10
    var age: Int {
        get { return _age }
        set { _age = newValue }
    }
}

var hoge = 20
let p = Person()
swap(&p.age, &hoge)

println(hoge) // "10"
println(p.age) // "20"
```

ちなみにgetしかないComputed Propertyだとコンパイルエラーになる模様。
【Angular】 $location.path not working



##### ▼ 概要

`$location.path`が効かない。

```
ngDialog.open(
  plain: true
  scope: innerScope
  template: '<kz-temp></kz-temp>'
  preCloseCallback: ->
    $scope.config.cardId = ''
    $location.path("#{$scope.config.listTypePath}/#{card.board_slug}")
)
```

けれども下記のようにすれば治る。

```
ngDialog.open(
  plain: true
  scope: innerScope
  template: '<kz-temp></kz-temp>'
  preCloseCallback: ->
    $scope.$apply( ->
      $scope.config.cardId = ''
      $location.path("#{$scope.config.listTypePath}/#{card.board_slug}")
    )
)
```

##### ▼ ちなみに

`ngDialog`の`preCloseCallback`は`false`を返すとダイアログが閉まらない。

- [ngDialog](https://github.com/likeastore/ngDialog)

> Provide either the name of a function or a function to be called before the dialog is closed. If the callback function specified in the option returns `false` then the dialog will not be closed. 


##### ▼ 参考URL

- [Angular $location.path not working](http://stackoverflow.com/questions/19359553/angular-location-path-not-working)
Core Animationのレイヤ


[Core Animationプログラミングガイド（PDF）](https://developer.apple.com/jp/documentation/CoreAnimation_guide.pdf)

「CALayerって角丸以外に使ったこと無いけどなんか他に機能あるんじゃね？」という疑問を解決するためにを読んだ。
今回は前半のレイヤについてのところをかなりざっくりまとめる。

### Core Animation

- グラフィックス描画やアニメーションの基盤機能
  - Viewに置き換わるものではなく、視覚要素に動きを加えるための汎用システム
  - 低レイヤから、グラフィックスハードウェア→OpenGL, Core Graphics→Core Animation→UIKit, AppKit
  - アプリケーションのコンテンツを画像の形に合成してハードウェア上で操作する
- iOS, OS Xで利用可能（使える機能に違いはあるけども）
- その心臓部がレイヤオブジェクトとのこと


### レイヤオブジェクト

- 3次元空間内に置かれた2次元の平面
- コンテンツはビットマップでキャッシュしてる
  - バッキングストア
- 階層化して管理できる
  - addSublayer, removeFromSuperLayer...etc


### レイヤオブジェクトの描画モデル

- レイヤオブジェクトのプロパティを変更すると、ビットマップが更新されるわけではなく、
- レイヤオブジェクトが持っている状態情報が更新される
- ビットマップと状態情報をハードウェアに渡して、ハードウェアが描画するという感じ

### レイヤのコンテンツを設定する方法

３つの方法がある

- contentsプロパティに設定
- CALayerDelegateを実装
- CALayerのサブクラスでメソッドをoverride


#### contentsプロパティに設定

contentsプロパティにはCGImageRef型が渡せる

```swift
let aImage = UIImage(named: "image.jpg")
let aLayer = CALayer()
aLayer.contents = aImage.CGImage
```

#### CALayerDelegateを実装

- `func displayLayer(_ layer: CALayer!))`でcontentsプロパティに代入か
- `func drawLayer(_ layer: CALayer!, inContext ctx: CGContext!)`で、ビットマップを設定するか

ビットマップ設定はCore Graphicsの話になると思うのでまた今度調べる。

[CALayerのドキュメント](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/index.html#//apple_ref/doc/uid/TP40004500-CH1-SW125)に

> In iOS, if the layer is associated with a UIView object, this property must be set to the view that owns the layer.

と書いており、UIViewとそのサブクラスのlayer.contetnsにはdelegateからは渡せないっぽい。

そもそも`import QuartzCore`しても、`CALayerDelegate`を補完してくれず、
いろいろ試してみたが結局できなかった。。だれかやり方教えてください。

#### CALayerのサブクラスでメソッドをoverride

- `func display()`でcontentsプロパティに設定する
- `func drawInContext(_ ctx: CGContext!)`でビットマップ設定

### 設定できるプロパティ

```swift
// 透過度
aLayer.opacity = 0.0

// 角丸
aLayer.masksToBounds = true
aLayer.cornerRadius = 5.0

// Z軸180度回転
aLayer.transform = CATransform3DRotate(aLayer.transform, CGFloat(M_PI), 0, 0, 1)

// 拡大・縮小
// XY2倍拡大
aLayer.transform = CATransform3DScale(aLayer.transform, 2.0, 2.0, 0.0)

// 移動
// X方向に100, Y方向に100移動
aLayer.transform = CATransform3DTranslate(aLayer.transform, 2.0, 2.0, 0.0)
```

### 暗黙のアニメーション

CALayerは何も設定しなくてもアニメーションが適用される

```swift
var hidden = false

// 勝手にフェードイン・アウトする
@IBAction func toggleOpacity (sender: AnyObject) {
  aLayer.opacity = hidden ? 1.0 : 0.0
  hidden = !hidden
}
```
Pythonでお手軽フォルダ同期

何らかの自動化の手順の一つに、フォルダを同期したい時があります。
そんな時、Pythonのdirsyncを利用すると便利です。
Pythonスクリプト内で使っても良いですし、コマンドとして使っても良いです。

インストールは簡単

```
$ pip install dirsync
```

コマンドも簡単

```
dirsync [from dir] [to dir]
```

ぜひ活用してみてはいかがでしょうか

https://pypi.python.org/pypi/dirsync/2.2
[Android] Gmailアカウントでメールを送信する

1. Google Codeのサイトから[javamail-android](https://code.google.com/p/javamail-android/downloads/list)から`additionnal.jar`と`mail.jar`と`activation.jar`をダウンロードする。

2. ダウンロードしたライブラリをインポートする。

3. AndroidManifest.xmlでインターネット許可する。

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
```

4. 以下のコードを実装する

```java:メール送信コード
// UIスレッド以外で実行
try {

    final Properties property = new Properties();
    property.put("mail.smtp.host",                "smtp.gmail.com");
    property.put("mail.host",                     "smtp.gmail.com");
    property.put("mail.smtp.port",                "465");
    property.put("mail.smtp.socketFactory.port",  "465");
    property.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

    // セッション
    final Session session = Session.getInstance(property, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("[送信元アカウント]", "[パスワード]");
        }
    });

    MimeMessage mimeMsg = new MimeMessage(session);

    mimeMsg.setSubject("[メール件名]", "utf-8");
    mimeMsg.setFrom(new InternetAddress("[送信元アカウント]@gmail.com"));
    mimeMsg.setRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress("[送信先メールアドレス]"));

    // 添付ファイル
    final MimeBodyPart txtPart = new MimeBodyPart();
    txtPart.setText("[メール本文]", "utf-8");

    final MimeBodyPart filePart = new MimeBodyPart();
    File file = new File("[添付ファイルパス]");
    FileDataSource fds = new FileDataSource(file);
    DataHandler data = new DataHandler(fds);
    filePart.setDataHandler(data);
    filePart.setFileName(MimeUtility.encodeWord("[メール本文の添付ファイル名]"));

    final Multipart mp = new MimeMultipart();
    mp.addBodyPart(txtPart);
    mp.addBodyPart(filePart);
    mimeMsg.setContent(mp);

    // メール送信する。
    final Transport transport = session.getTransport("smtp");
    transport.connect("[送信元アカウント]", "[パスワード]");
    transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
    transport.close();

} catch (MessagingException e) {

} catch (UnsupportedEncodingException e) {

} finally {

}
```
今すぐ使えるJavaScriptを実行する環境まとめ

# 今すぐJavaScriptを動かしたい！
JavaScriptはシンプルな規格で、いろんな場所に実行環境があることをなんとなくご存知でしょう。
この投稿では、JavaScriptの実行に使えるランタイムをまとめます。

この投稿を覚えておくと、

* ツールをぱっと作って動かしたい。
* 別の環境を使っているあの人にツールを書けることを教えてあげたい。
* プログラミングのさわりを気軽に教えてあげたい。

こんな時に何を使えばよいか見えて、教えてあげることができて、ニンマリできます。

# Mac用
Macは標準でJavaScriptを動かすことができます。

```bash
osascript -l JavaScript sample.js
```
また、標準アプリである「スクリプトエディタ」を使ってもJavaScriptを書くことができます。
このランタイムは、アプリの自動化のために用意されているようで、自動操作機能が強力です
仕様書は[こちら](https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/)です。

# Windows用
Windowsも標準でJavaScriptを動かすことができます。


```bash
wscript sample.js
```
もしくは

```bash
cscript sample.js
```

で実行できます。cscriptの方がコマンドライン用です。
この実行だと、WSHという様々なスクリプト言語を実行するランタイムで実行するため、VBScriptと同等のいろいろな機能が用意されていて、たとえばZipの圧縮/解凍などもできます。
WSHの仕様は[こちら](https://msdn.microsoft.com/ja-jp/library/cc392526.aspx)で見ることができます。

# ブラウザ上で
最も簡単で誰もが持っているJavaScript実行環境は、ブラウザかも知れません。
上部のURLエリアに

```bash
javascript:alert("Hello");
```
のようにJavaScriptを入力すると、実行されます。
ブックマークにスクリプトを保存することで、ブックマークレットを作ることもあります。
PCのブラウザだけではなく、大抵のスマフォ用ブラウザでも実行することができます。
また、大抵のブラウザは開発者モードを持っていて、開発者モードで表示されるコンソールにJavaScriptを入力すると実行することができます。
Chromeですと、「表示」→「開発/管理」→「JavaScriptコンソール」でコンソールを表示することができます。

# node.js
待っていました。我らがnode.jsです。LinuxでJavaScriptを動かしたい場合は第一候補に上がるでしょう。
WindowsにもMacにもLinuxにもインストールすることができます。きちんとしたJavaScriptのアプリケーションを作る場合にはnode.jsで作ることをおすすめします。

nodeは、インストール後、

```bash
node sample.js
```
で実行できます。
npmというパッケージマネージャにより、様々な機能を追加することができます。
実行エンジンにはChromeでも使われている、V8というものを使っています。V8を利用している実行環境は他にもたくさんありますので、興味がある方は調べてみるとオモシロイですね。

# Javaと共に
Javaは8から標準でJavaScriptが実行できるようになりました。
いろんないろんないろんな環境で動かすことができます。
Javaを利用したJavaScript実行環境として[Pacifista](http://pacifista.ukiuni.org/)等がありますね(問答無用)。
Javaの豊富な機能を利用することができるため、GUIの作成でも、サーバの作成でも、環境構築でもお手のものです。
[Pacifista](http://pacifista.ukiuni.org/)はJavaおよび[Pacifista](http://pacifista.ukiuni.org/)をインストール後、

```bash
pacifista sample.js
```

で、実行できます。

# iPhone/Android
もはや「今すぐ使える」ではないですが、JavaScriptフリークのために。
iPhone(iOS)、Android上でもJavaScriptを動作させることが可能です。
iPhone、Androidとも、「組み込みブラウザ」という仕組みを持っていて、そのブラウザにJavaScriptを実行させることができます。

```objc:iPhone
[webView stringByEvaluatingJavaScriptFromString:@"alert(\"Hello\");"];
```

```java:Android
webView.evaluateJavascript("alert(\"Hello\");", null);
```

JavaScriptを利用するフレームワークなどを作成する時や、JavaScriptとやりとりする時に使えそうですね。（苦しい）

-----

各環境で使える関数に差異はありますが、簡単にツールを作るにはとても使えます。
頭の片隅に残していただけると良いと思います。

また、ここではJavaScriptや、同じような構文で書ける類似の言語をまとめてJavaScriptと言い切ってしまいます。細かいことは、気にしないでください。

草々不一
Lombokでgetterなしのimmutableなクラスをつくる

scalaでいうと、valのフィールドだけをもってるクラスをつくりたいというもの。javaでも副作用をおこす余計なものをなるべく減らしたくて、lombokで手軽にできる範囲でやる小技。

下記のアノテーションの組み合わせでさっとできます。
staticNameでstaticコンストラクターの名前を決められます。

```lang:Hoge.java
@RequiredArgsConstructor(staticName="of") //@NonNullかfinalがついたフィールドを全て引数にする
@FieldDefaults(makeFinal = true)
public class Hoge {

  public Long id;
}
```

@Valueだとgetterがついてしまうので、publicフィールドにアクセスさせたいときはこの形の方が楽です。

setterがついてると、関係なところで変な値をいれて、そのせいでバグが発生、ということをやらかしてしまったこともあり・・・　値を確定させるにはこういうのもいいかなと。
OSのオンラインバックアップ

Clonezillaやddが遅すぎたので調べた。

前提:

* 更新の激しいサーバには向いていない。SMTPサーバやDNSサーバ、WEBサーバ程度なら良い。
* DBサーバはDBの更新出来ないようにしてから実施すること。

## 今のDISK構成

* バックアップ対象(sda,sdbの構成)
  * /boot/efi ・・・ /dev/sda1, fat ?
  * /boot ・・・ /dev/sda2, ext3
  * / ・・・ /dev/sdb1, xfs

* バックアップ格納先
  * /media ・・・ sshfs:192.168.100.6:/mnt/3tb/sshfs/

## パッケージインストール

```bash:
yum install -y sshfs dump xfsdump
```

## sshfsマウント

```bash:
sshfs 192.168.100.6:/mnt/3tb/sshfs/ /media
```

## /boot/efi/

```bash:efi
# cd /boot/efi
# tar czf /media/efi.tar.gz *
```

## /boot/

```bash:
# dump -0f - /boot | gzip > /media/boot.gz 
```

## /

```bash:
# xfsdump -l0 - /dev/sdb1 | gzip > /media/slash.gz
```


## dumpしてみた

```bash:dumpしてみた
# /sbin/dump -0f - / | gzip --fast > $WORKDIR/slash.gz
  DUMP: Date of this level 0 dump: Sat Mar  7 06:18:57 2015
  DUMP: Dumping /dev/sda3 (/) to standard output
  DUMP: Label: /
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 5474392 blocks.
  DUMP: Volume 1 started with block 1 at: Sat Mar  7 06:28:48 2015
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: 93.02% done at 16973 kB/s, finished in 0:00
  DUMP: Volume 1 completed at: Sat Mar  7 06:34:11 2015
  DUMP: Volume 1 5615080 blocks (5483.48MB)
  DUMP: Volume 1 took 0:05:23
  DUMP: Volume 1 transfer rate: 17384 kB/s
  DUMP: 5615080 blocks (5483.48MB)
  DUMP: finished in 323 seconds, throughput 17384 kBytes/sec
  DUMP: Date of this level 0 dump: Sat Mar  7 06:18:57 2015
  DUMP: Date this dump completed:  Sat Mar  7 06:34:11 2015
  DUMP: Average transfer rate: 17384 kB/s
  DUMP: DUMP IS DONE
```

# リストア

## 参考

* [正統派なバックアップを行う - いますぐ実践! Linuxシステム管理 / Vol.122](http://www.usupi.org/sysad/122.html)
* [LinuxのブートCDを使ってGRUBを修復する - Turenar’s Diary](http://d.hatena.ne.jp/snsw/20101211/1292036382)

CentOSのISOでレスキューモードで起動。
パーティションを分けてrestoreを実施

```bash:
# fdisk /dev/vda
# mkfs.ext3 /dev/vda1
# mkfs.ext3 /dev/vda2
```

```bash:
# mount /dev/vda2 /mnt/slash
# cd /mnt/slash
```

## /

```bash:カレントディレクトリにリストア
# zcat /mnt/nfs/slash.gz | restore -r -f -
```

## /boot


```bash:カレントディレクトリにリストア
# mount /dev/vda2 /mnt/slash/boot
# cd /dev/vda2 /mnt/slash/boot
# zcat /mnt/nfs/boot.gz | restore -r -f -
```

## etc/fstab修正

* Diskのパス(/dev/vda1等)とマウントポイントを要確認。
  * swapを無効化にした場合、swapの行を削除

## grub

```bash:
# mount --bind /proc proc
# mount --bind /dev dev
# mount --bind /sys sys
# chroot .
```

## grub-install "/dev/hdx does not have any corresponding BIOS drive" error

以下のDiskのパスを修正

* /boot/grub/device.map
* 初めてパーティショニングした場合は、一度再起動するとよい。

```bash:ラベルを付ける場合
# e2label /dev/vda2 /
# e2label /dev/vda1 /boot
```
[ Feedback 募集] vim-transform つくり中

[vim-transform](https://github.com/t9md/vim-transform)

vim-transform というプラグインを作っています。

~~**※ window 環境では動きません**~~ 動かない訳でもないらしいです。作者が動作確認してないだけ。

2日前に作り始めたので、まだ日が浅く、仕様が変わる可能性はありますが、ある程度形になって来たので、他のユーザーに使用感をフィードバックして欲しくて、この記事書いてます。

そもそもは、golang の const のセットに String() メソッドを定義するのを自動でやれないか、というのがキッカケ。

vim はそもそも `:!` によるフィルタコマンドの出力で置き換える機能を持っているから、発想自体は新しくもない。
vim-transform  は、フィルタコマンドの呼び出し方とか、置き換え方とかのフレームワークを提供しているようなイメージ。

![Movie](https://raw.githubusercontent.com/t9md/t9md/019b944b5b1152dbb97b92471b7ec596769c8319/img/transform.gif)

# 処理の流れ

バッファの内容 > STDIN > transformer > STDOUT > 新しいバッファの内容

transformer は標準入力から読んで、標準出力に書く、単なるフィルタプログラムです。言語は問いません。
※ default の transformer ははっきり言って、全然やっつけです。良い transformer も募集中

どの transformer を使うかは後述する transform のルール( web framework の routing みたいなもん? )で決めます。

# 何が強みか？

そもそも、同様のことは、[UltiSnips](https://github.com/sirver/ultisnips) の様なスニペットプラグインでも出来るとは思ってます(試してませんが)。
ただ、この transformer の仕組みは以下の２つの強みがあります。

* 開発が簡単(STDIN > STDOUTの単なるフィルタプログラムを書けば良い)
* transformer(フィルタプログラム)自体はエディタ非依存(Emacs, Atom, Sublime からも使える)

# 設定

```vim
" mac の場合、Command-Shift-r で、transform を invoke
nmap <D-R> <Plug>(transform)
xmap <D-R> <Plug>(transform)
```

# 操作

範囲選択、or transform したい場所にカーソルおいて、keymap を発動!

## transform のルール

これはユーザーが設定可能です。以下の様に。
内容が transform したいものだったら、対応する transformer を `call a:e.run(TRANSFORMER_NAME)` で invoke します。
この `a:e.run()` は中で `throw` つかって、ジャンプして終了してるので、一度呼ぶと return してきません。
戻ることを期待した処理を書かないように注意です。

詳細は github のREADME.md を見て下さい。

```vim
let g:transform = {}

function! g:transform._(e)
  call a:e.run("_/stringfy_word.rb")
endfunction

function! s:route.go(e) "{{{1
  let e = a:e
  let c = e.content
  if c.line_s =~# '\v^const\s*\(' && c.line_e =~# '\v\)\s*'
    call e.run("go/const_stringfy.rb")
  elseif c['line_s-1'] =~# '\v^import\s*\('
    call e.run("go/import.rb")
  endif
endfunction
```
AdMobのレクタングル広告が表示されたりされなかったりで詰んだ


Admobだとリクエストを投げる場合に様々なサイズの広告の設定ができるのですがレクタングル広告を設定したあの日、少し様子が変なのでした。

```java:Activity.java

/** AdView */
private static AdView rectangle = null;

// 表示するメソッド
public static void show() {
	if(rectangle == null) {
		// 初期化
		rectangle = new AdView(activity);

		// ユニットIDを設定
		rectangle.setAdUnitId(ADMOB_RECTANGLE_UNIT_ID);
	
		// 広告のサイズを指定
		rectangle.setAdSize(AdSize.MEDIUM_RECTANGLE);

		// Activityにビューを追加
		this.addContentView(rectangle,new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, Gravity.CENTER);

		// リクエスト送信	
		AdRequest adRequest = new AdRequest.Builder().build();
		rectangle.loadAd(adRequest);

	}　else {
		// 表示
		rectangle.setVisibility(View.VISIBLE);
	}
}


public static void hide() {

	// 初期化されていなければリターン
	if(rectangle == null) return;

	// 隠す
	rectangle.setVisibility(View.INVISIBLE);
}

// アクティビティがバックグラウンドから復帰した時
public void onResume() {
	super.onResume();
	if(rectangle != null) rectangle.resume();
}

// アクティビティがバックグラウンドに行く時
public void onPause() {
	super.onPause();
	if(rectangle != null) rectangle.pause();
}

```

と大体こんな感じで実装していたのですが、フルHD端末だとうまくいくのですが、他の端末*GalaxyS3,Xperia SP*などだとバックグラウンドが復帰時や
他のスレッドで他の広告を表示した後などは表示されない。いや、厳密にはビューは存在していてタッチするとリンクに飛ぶ（広告の機能はある）けど
表示されていないという謎の現象が発生していました。

というわけで、いろいろ調べたところ。

```java:Activity.java
// 表示するメソッド
public static void show() {
	if(rectangle == null) {
		// 初期化
		rectangle = new AdView(activity);

		// ユニットIDを設定
		rectangle.setAdUnitId(ADMOB_RECTANGLE_UNIT_ID);
	
		// 広告のサイズを指定
		rectangle.setAdSize(AdSize.MEDIUM_RECTANGLE);

		// Activityにビューを追加
		this.addContentView(rectangle,new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, Gravity.CENTER);

		// リクエスト送信	
		AdRequest adRequest = new AdRequest.Builder().build();
		rectangle.loadAd(adRequest);

	}　else {
		// コレヲヨブトウマクイク
		rectangle.requestLayout();

		// 表示
		rectangle.setVisibility(View.VISIBLE);
	}
}
```

ということになりました。そして、requestLayoutは
「Call this when something has changed which has invalidated the layout of this view. This will schedule a layout pass of the view tree. This should not be called while the view hierarchy is currently in a layout pass (isInLayout(). If layout is happening, the request may be honored at the end of the current layout pass (and then layout will run again) or after the current frame is drawn and the next layout occurs.」

とのこと。えと、要するにViewのレイアウトが効かなくなったたときにコレを呼ぶとよいらしい。ちゃんとレイアウト組んでるのに表示されないなどの現象があればとりあえず

// レイアウトを再要求する
		rectangle.requestLayout();

ですよみなさま。
ember.jsでscrollイベントを発するComponentの実装

## はじめに

ember.jsでDOMイベントをハンドリングするには```{{action}}```を使います。

```html:item-list.hbs
<ul class="item-list">
  {{#each item in items}}
    <li class="item" {{action "selectItem" item}}>{{item.name}}</li>
  {{/each}}
</ul>
```

```items_controller.js
window.App.ItemsController = Ember.ArrayController.extend({
  actions: {
    selectItem: function(item) {
      alert('Select: ' + item.name);
    }
  }
})
```

こうすると```li.item```をクリックした時に```item```がcontrollerに渡されて```item.name```がアラートされます。

## clickイベント以外も

しかし```click```イベント以外でもactionを発生させたい場合もあるので```{{action}}```には```on```というオプションが備わっています。

```html:item-list.hbs
<ul class="item-list">
  {{#each item in items}}
    <li class="item" {{action "selectItem" item on="mouseEnter"}}>{{item.name}}</li>
  {{/each}}
</ul>
```

このように```on="mouseEnter"```とすると```li.item```にマウスが乗っただけで反応するようになります。

[ハンドリングできるイベント一覧 http://emberjs.com/guides/understanding-ember/the-view-layer/#toc_adding-new-events](http://emberjs.com/guides/understanding-ember/the-view-layer/#toc_adding-new-events)

上記のリンク先にイベント一覧があるのですが、```scroll```イベントって無いんですよね。
なのでcomponentで実装してみました。

## ScrollViewComponentの実装

```scroll_view_component.js
window.App.ScrollViewComponent = Ember.Component.extend({
  classNameBindings: ['className'],
  className: '',

  didInsertElement: function() {
    var $el = this.$();
    $el.on('scroll', function(e) {
      var top = $el.scrollTop();
      var visibleHeight = $el.height();
      var scrollHeight = $el[0].scrollHeight;
      var position = (top + visibleHeight) / scrollHeight;

      var params = {
        top: top,
        visibleHeight: visibleHeight,
        scrollHeight: scrollHeight,
        position: position
      };

      this.sendAction('scroll', params);
    });
  }
});
```

```components/scroll-view.hbs
{{yield}}
```

## 使い方

ブロックを受け付けるだけのcomponentなのでスクロールさせたいボックスの代わりに使用します

```item-list.hbs
{{#scroll-view className="item-list-wrapper" scroll="scrollList"}}
  <ul class="item-list">
    {{#each item in items}}
      <li class="item" {{action "selectItem" item}}>{{item.name}}</li>
    {{/each}}
  </ul>
{{/scroll-view}}
```

controllerではparamsというオブジェクトにボックスの高さとか、位置とかいろいろ受け取れるようになってます。
何割くらいスクロールしてるのかも計算するようにしたので9割り超えたら何かするとかもできます。

```items_controller.js
window.App.ItemsController = Ember.ArrayController.extend({
  actions: {
    selectItem: function(item) {
      alert('Select: ' + item.name);
    },

    scrollList: function(params) {
      if (params.position > 0.9) {
        alert('最後の方までスクロールしましたね？')
      }
    }
  }
})
```

大した実装じゃないですけど結構役立ちそうな気がします。
CentOS6.6からリモートのwindows情報を取得

VirtualBox上のCentOSからWMIを利用して、リモートのWindows端末のディスク使用率、イベントログなどの情報を取得する。

参考ページ：
http://www.iggyt.org/doku.php?id=wiki:infrastructure_tools:wmi:wmi-linux_client-wmic

# 0. 環境
Host OS: Windows7 32bit
Guest OS: CentOS 6.5 64bit
VirtualBox: 4.3.20

# 1. WMIクライアントインストール

```shell-session
#リポジトリ登録
sudo rpm -Uvh http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/atomic-release-1.0-19.el6.art.noarch.rpm
# wmiクライアントインストール
sudo yum -y install wmi
```

ホストPCの情報取得例
```
wmic -U localhost/ユーザ名%パスワード //192.168.56.1 "select * from Win32_OperatingSystem"
```

認証をドメインことローラにする際は、localhostをドメイン名に変更する。

取得できる情報は下記のリンクを参照。
https://msdn.microsoft.com/en-us/library/aa394585(v=vs.85).aspx


# NAT
NATでは簡単にいかない模様。
https://supportforums.cisco.com/discussion/12025631/wmi-not-working-through-natd-address
RSpec3でテスト対象のクラスがuninitialized constantになる場合の対策

RSpec3でテスト環境を再セットアップしていざ実行しようとしたら、対象のControllerやModelが`uninitialized constant`になって、「いや〜、規約どおりにやってるんだよな」と困っていた所、例によって、ちゃんとWiki読めやっていう話でした。。。

[rspec/rspec-rails](https://github.com/rspec/rspec-rails#upgrade-note)

上記にもある通り、Rspec3時代は、基本的にnot `require "spec_helper"` but `require "rails_helper"`とするようです。このような意図として、

- Railsが必要がないテストに対しては、Railsをロードしなくてよい方法を提供する

があるようです。

```
/Users/yuichi/work/xxx/spec/controllers/hoge_controller_spec.rb:3:in `<top (required)>': uninitialized constant HogeController (NameError)
```

対象のClassのspecファイルの先頭を上記の`require "spec_helper"`にしたらうまくいきました。

# 参考URL

- [ruby on rails - Testing with RSpec in RoR application - uninitialized constant - Stack Overflow](http://stackoverflow.com/questions/11879107/testing-with-rspec-in-ror-application-uninitialized-constant)
- [RSpec 3 時代の設定ファイル rails_helper.rb について - willnet.in](http://willnet.in/126)
- [rspec/rspec-rails](https://github.com/rspec/rspec-rails)
- [Upgrade - RSpec Rails - RSpec - Relish](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#default-helper-files)
Railsの規約に沿ってない複合キーのテーブルと関連付ける



### DBレイアウト

#### Item
| cd | cd_type |
|:--:|:-------:|
| 001| foo     |

#### Hoge
|foo_cd|
|:----:|
| 001  |


```rb

class Hoge < ActiveRecord::Base

  belongs_to :foo, -> { where(cd_type:"foo") }, class_name:"Item",  primary_key: :cd, foreign_key: :foo_cd

end
```
AndroidManifest.xmlのPermissionをテストしよう

# Permissionのテストをなぜやる？

開発をしていて次の問題があったのがテストしようというモチベーション。

- 一瞬で必要なpermissionがあるのかどうかわからない
- 不要なpermissionが残り続ける

出来る限りアプリに必要最小限のpermissionだけを定義する＆権限が明示的であるべきだなと思うので書いた。

# やり方

次のような感じで書いている。

```java:
public class PermissionTest extends AndroidTestCase {
    private final Map<String, List> EXPECT_PERMISSION_MAP = Maps.of(
            "WebView", Arrays.asList(Manifest.permission.INTERNET),
            "Payment", Arrays.asList(Manifest.permission.INTERNET, "com.android.vending.BILLING"),
            "Test", Arrays.asList(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
    );

    public void test_necessaryPermission() throws PackageManager.NameNotFoundException {
        List<String> manifestPermissionList = getManifestPermissionList(BuildConfig.APPLICATION_ID);

        for (Map.Entry<String, List> entry : EXPECT_PERMISSION_MAP.entrySet()) {
            List<String> expectPermissionList = entry.getValue();

            for (String expectPermission : expectPermissionList) {
                assertTrue(String.format("Manifest should contain permission %s", expectPermission),
                        manifestPermissionList.contains(expectPermission));
            }
        }
    }

    public void test_unNecessaryPermission() throws PackageManager.NameNotFoundException {
        List<String> manifestPermissionList = getManifestPermissionList(BuildConfig.APPLICATION_ID);
        Set expectPermissionSet = getExpectPermissionSet(EXPECT_PERMISSION_MAP);

        for (String manifestPermission : manifestPermissionList) {
            assertTrue(String.format("Permission %s is not necessary", manifestPermission),
                    expectPermissionSet.contains(manifestPermission));
        }
    }

    private List<String> getManifestPermissionList(String packageName) throws PackageManager.NameNotFoundException {
        PackageManager packageManager = getContext().getPackageManager();
        PackageInfo packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
        String[] requestedPermissions = packageInfo.requestedPermissions;
        List list = Arrays.asList(requestedPermissions);
        Collections.sort(list);
        return list;
    }

    private Set<String> getExpectPermissionSet(Map<String, List> permissionMap) {
        Set expectPermissionSet = new HashSet();

        for (List<String> list : permissionMap.values()) {
            for (String permission : list) {
                expectPermissionSet.add(permission);
            }
        }

        return expectPermissionSet;
    }
}
```

こうして、機能単位でpermission一覧をまとめてあげるとあとからメンテする人が分かりやすくていいかなと思う。
testの書き方がモダンじゃない感じですが、目をつぶってください。

## 余談

guavaのImmutableMapを使いたいけどわりと大きかったので、 [Maps.java](https://gist.github.com/mattak/88c9a2b9b2498f0ed45a) をこんな感じで記述して使ってる。
サーバー名一覧から特定サーバーを消す方法:SQL Server Management Studio

SQL Server Management StudioでSQL Serverに接続する際に使用する「サーバーへの接続ダイアログ」
接続ダイアログのサーバー名には、過去に接続したサーバー一覧が表示されます。

![2015-02-20 12-13-13.png](https://qiita-image-store.s3.amazonaws.com/0/65435/145edeaa-e905-57f6-47d2-6ccd485921ca.png)

このサーバー一覧から不要なサーバーを消したい場合は、消したいサーバーを選択し、キーボードの「Del」キーを押すと削除することができます。これは、SQL Server Management Studio 2008 R2ぐらいからできるようになっています。
Railsで!!（エクスクラメーションマーク・びっくりマーク２つ）の書式について

「パーフェクトRuby on Rails」の書籍を見て気になったコードです。

```rb
def logged_in?
  !!session[:user_id]
end
```

「!!session」の部分です。

わかりやすい記述がありましたので以下を参照します。

★Murayama blog - double exclamation
　http://murayama.hatenablog.com/entry/20090713/1247455007

>コードを要約すると、変数の値がnilだった場合、
「そのままnilを返却するのではなく、falseに置き換えてから返却したい」ときに!!を利用するようです。

メソッドの「logged_in?」で真偽値という述語記述をしていますので、「!!」でfalseで返したほうがより良いということのようです。
Railsのタスクで100万レコードぐらいInsertした時のメモ



とある案件でSQL Serverからデータを100万件ぐらい引っ張ってきて別のDBにそれをINSERTする必要があった。
普通にActive Recordを使ったら重すぎたのでその時のメモ。


## 複数のDBに繋ぐ

Azure上で動いているSQL Serverからデータを取ってきて、別のVMで動作しているMySQLにデータを投入する必要があったので複数のDBに接続するよ必要がありました。

これは

	          ActiveRecord::Base.establish_connection(:local_database)

とか

          ActiveRecord::Base.establish_connection(:azure_database)

をSQL発行前に実行すれば解決。
引数はconfig/database.ymlの設定名

## データを取ってきてINSERTする

普通にINSERTしていったら重いだろうなぁと思い、railsでBulk Insertする方法を探してみた。

結果、[activerecord-import](https://github.com/zdennis/activerecord-import)といgemがあったので使ってみた。

配列にActive Recordのオブジェクトを突っ込みまくって、

	Model.import array

みたいに実行すればBulk Insertを実行できるよって感じだったのだが、扱うレコードが多いだけにやたらと重い。
数千件ごとに分けてみたり、色々やってみたのだがやっぱり重い。
htopやらsarやらでCPUやディスクの状況など調べてみるとiowaitはほぼ発生していないがCPUが常に100%稼働している。
（ちなみに環境はAzureのA1。CPUはコア数１つ）

100万件のデータをINSERTしようとすると11時間ほどかかりそうだということがわかり、どこがボトルネックか調べることにした。

activerecord-importの中身までは見ていないが、5000件のデータを処理した時に、importメソッドだけで70秒ほどかかっていた。

その間iowaitなどは発生しておらず、CPUの負荷は常に100%で、MySQL側に特にslow logも出ていない。

調べてみるとActive Recordはオブジェクトの生成処理が重いので、大量のselectの時はpluckを使えば早くなるよとかいう記事を見つけた。
selectの部分は確かにpluckにすると早くなったので、おそらくimportメソッドが重いのもActive Recordのオブジェクト生成処理のせいだろうなぁと思い生のINSERT文を生成し、実行するようにした。

	          affected_rows = ActiveRecord::Base.connection.update(insert_sql)

生のINSERTはこんな感じで実行できる。
結果、5000件あたりの処理速度は140秒から10秒になり、35分ほどで100万件を処理することができるようになりました。


## 所感

1. 大量レコードを処理する時はActive Record使わないほうが良さそう
2. 今回書いてないけど、RailsからSQL Serverに接続するのが結構めんどくさかった。
主にfreetdsとかunixobdc周り。
console.logをラップしたい

可変長引数の関数をラップするような関数を作るときにapplyってのを使って次のようなことしたりするらしい。（なんだかJavaScriptって可変長引数扱いやすいんだか扱いにくいんだか良くわからんです。。。）

```js
function wrapperfunc() {
	// something to do before calling func
	;

	// call func
	func.apply(this, arguments);

	// something to do after calling func
	;
}
````

でも、funcがconsole.logだとIllegal Invocationとか言われちゃうんだよね。

ということでグーグル先生に教えてもらいました。
http://stackoverflow.com/questions/8159233/typeerror-illegal-invocation-on-console-log-apply

console.ほにゃらら のthisはconsoleじゃないといけないらしいです。

なので、

```js
	console.log.apply(console, arguments);
```

としなければならないということだそうです。
Google Sheetsの履歴を削除する方法

Google Sheetsはとても便利ですが、履歴が削除できません。
過去のバージョンを見せたくない場合もあります。

# Google Sheetsの履歴を削除する方法
コピーして、削除する。
現状これしか方法がないみたいです。

1. Google Driveを開く
2. 該当のドキュメントを右クリックして、「コピーを作成」を選択する
3. 共有していた場合、再度共有の設定をする
6. コピー元のドキュメントを削除する
7. 適宜リネームする

以上
* * *
Node.jsでCloudinaryを用いた際のエラーの原因

以下の書き方ではエラーが出るので

```
var fs = require('fs');
var stream = cloudinary.uploader.upload_stream(function(result) { console.log(result); });
var file_reader = fs.createReadStream('my_picture.jpg', {encoding: 'binary'}).on('data', stream.write).on('end', stream.end);
```

以下のように書き換える
```
var fs = require('fs');
var stream = cloudinary.uploader.upload_stream(function(result) { console.log(result); });
var file_reader = fs.createReadStream('my_picture.jpg').pipe(stream);
```

参考元
[https://github.com/cloudinary/cloudinary_npm/commit/bd590a19601d0d938a5083064f98536f1a0d0cf0](https://github.com/cloudinary/cloudinary_npm/commit/bd590a19601d0d938a5083064f98536f1a0d0cf0)
Capybara+Poltergeist でHTTPS通信(SSL認証) が上手くいかない対処法

CapybaraでE2Eテストを作ろうとして、https://~ のアドレスへvisit 出来なかった。
おそらく開発用のオレオレ証明書のせいだと思われる。

対処法として、Poltergeist へSSL通信を可能とする設定を導入した事により、問題なく処理が通った！

```rb:capybara

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app,
    :phantomjs_options => ['--debug=no', '--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1'], :debug => false)
  end
end

```

参考になった神の一言: 
https://github.com/teampoltergeist/poltergeist/issues/121#issuecomment-49891097
Dockerでコンテナ作成/起動/停止/自分用Image作成

---
# 公式リポジトリ(大体ここに書いてある)
https://registry.hub.docker.com/_/centos/

※参考サイト
http://kasshy.hatenablog.com/entry/2015/01/21/142120
http://qiita.com/deeeet/items/ed2246497cd6fcfe4104
http://qiita.com/bungoume/items/b8911fd243d9c084bd63

---

# CentOS6のDockerイメージのダウンロード
`$ docker pull centos:centos6`

`$ docker images`

	REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
	centos              6.6                 77e369743e24        12 days ago         202.6 MB

---

# Dockerコンテナを作成してバックグラウンドで起動する

`docker run [オプション] [--name ｛コンテナー名｝] ｛イメージ名｝[:｛タグ名｝] [コンテナーで実行するコマンド] [引数]`

例)ホスト名を指定して作成する場合
`docker run -d -it -p 50080:80 --hostname tomi-local01 --name tomi-local01 centos:6.6 /bin/bash --login`

	d: バックグランドで実行
	i: コンテナの標準入力を開く
	t: ttyを確保する
	p: ポートフォワード

---

# 起動しているコンテナを確認
`docker ps -a`

	a: 停止しているコンテナも表示

---

# 起動しているコンテナに接続(attach)
`docker attach <コンテナID or NAME>`

→ログアウトはctrl+p → ctrl+q の順に押す。
**注意**: exitするとコンテナが終了する。。こわい。

---

# ポートフォワードしているポートへの接続方法

例）-p 50080:80 で起動してあるコンテナ内のnginxにつなぐ場合

まずboot2docker-vmのipを調べる
`$ boot2docker ip`
`192.168.59.103`

boot2dockerのipに対して以下のように接続する
`http://192.168.59.103:50080`
　→ -p 50080:80 で起動しているコンテナ内のport80にフォワードされる。
　　
---

# コンテナの停止
`docker stop <コンテナID or NAME>`

---

# コンテナの起動
`docker start <コンテナID or NAME>`

---

# 自作のDocker Imageを作る
コンテナの状態を確認
`$ docker ps -a`

Docker Imageを作成
`$ docker commit -m "Development Tools追加" <コンテナID> tomi-centos-templage:6.6`
　※docker commit -m "コメント" <コンテナID> <名前:タグ>

Docker Imageが追加されたことを確認
`$ docker images`

		REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
	tomi-centos-template   6.6                 fbb6f8fa1abf        8 seconds ago       692.7 MB
	centos                 6.6                 77e369743e24        12 days ago         202.6 MB

---

# 自作のDocker Imageからコンテナ作成
例）
`$ docker run -d -it --hostname tomi-local02 --name tomi-local02 tomi-centos-template:6.6`
MacOSX LionでDocker環境構築

--

# Boot2Docker for Mac OS X をインストール
公式ドキュメント(https://docs.docker.com/installation/mac/) 参照。

# VirtualBoxをインストールしておく
次の手順でVirtualBox内にboot2docker-vmが作られる。

# Boot2Dockerの初期化
`$ boot2docker init`

 	Latest release for boot2docker/boot2docker is v1.5.0
	Downloading boot2docker ISO image...
	Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.5.0/boot2docker.iso
		to /Users/a12047/.boot2docker/boot2docker.iso

# Boot2Dockerを起動
`$ boot2docker start`

	Waiting for VM and Docker daemon to start………ooooooooooooooooo
	Started.
	Writing /Users/a12047/.boot2docker/certs/	boot2docker-vm/ca.pem
	Writing /Users/a12047/.boot2docker/certs/	boot2docker-vm/cert.pem
	Writing /Users/a12047/.boot2docker/certs/boot2docker-vm/key.pem
	
	To connect the Docker client to the Docker daemon, please set:
	    export DOCKER_HOST=tcp://192.168.59.103:2376
	    export DOCKER_CERT_PATH=/Users/a12047/.boot2docker/certs/boot2docker-vm
	    export DOCKER_TLS_VERIFY=1

# (自分の場合のみ)
`$ docker version`

	Client version: 1.5.0
	Client API version: 1.17
	Go version (client): go1.4.1
	Git commit (client): a8a31ef
	OS/Arch (client): darwin/amd64
	FATA[0032] An error occurred trying to connect: Get https://192.168.59.103:2376/v1.17/version: dial tcp 192.168.59.103:2376: i/o timeout

のようにFATA[0032] 〜 i/o timeout が出る。
自Macのルーティング問題と思われ。
(参考：http://stackoverflow.com/questions/26686358/docker-cant-connect-to-boot2docker-because-of-tcp-timeout)

`$ ifconfig -a`

「192.168.59.3」のinterface名を確認（自分はvboxnet3だった)

ルーティング追加
`$ sudo route -nv add -net 192.168.59 -interface vboxnet3`

再度チェック
`$ docker version`

	Client version: 1.5.0
	Client API version: 1.17
	Go version (client): go1.4.1
	Git commit (client): a8a31ef
	OS/Arch (client): darwin/amd64
	Server version: 1.5.0
	Server API version: 1.17
	Go version (server): go1.4.1
	Git commit (server): a8a31ef

エラーなくなった♪

---

# Boot2Dockerを停止
`$ boot2docker stop`

# boot2dockerコマンドオプションを見てみる
`$ boot2docker help`