OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS6.4にPhantomJSとCasperJSをインストール

casperjsのインストール

```
sudo su 
cd /usr/local/src
git clone https://github.com/n1k0/casperjs.git
cd casperjs
ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs
```

phantomjsのインストール

```
cd /usr/local/src
git clone https://github.com/ariya/phantomjs.git
cd phantomjs
./build.sh
```

なんかエラーが出る。

```
TIQUE -O2 -Wall -W -fPIE  -I../../../mkspecs/linux-g++ -I. -o icu.o icu.cpp
icu.cpp:42:28: error: unicode/utypes.h: No such file or directory
icu.cpp:43:26: error: unicode/ucol.h: No such file or directory
icu.cpp:44:29: error: unicode/ustring.h: No such file or directory
icu.cpp: In function ‘int main(int, char**)’:
icu.cpp:48: error: ‘UErrorCode’ was not declared in this scope
icu.cpp:48: error: expected ‘;’ before ‘status’
icu.cpp:49: error: ‘UCollator’ was not declared in this scope
icu.cpp:49: error: ‘collator’ was not declared in this scope
icu.cpp:49: error: ‘status’ was not declared in this scope
icu.cpp:49: error: ‘ucol_open’ was not declared in this scope
icu.cpp:50: error: ‘U_FAILURE’ was not declared in this scope
icu.cpp:52: error: ‘ucol_close’ was not declared in this scope
gmake: *** [icu.o] Error 1
ICU disabled.
The ICU library support cannot be enabled.
 Turn on verbose messaging (-v) to /usr/local/src/phantomjs/src/qt/qtbase/configure to see the final report.
 If you believe this message is in error you may use the continue
 switch (-continue) to /usr/local/src/phantomjs/src/qt/qtbase/configure to continue.
```

軽く調べた感じだと、
```
yum install gcc gcc-c++ make git openssl-devel freetype-devel fontconfig-devel
```
を入れた後に1.9にcheckoutするといいらしい。

```
git checkout 1.9
./build.sh
bin/phantomjs -v
ln -sf `pwd`/bin/phantomjs /usr/local/bin/phantomjs
```

これで、

```
[root@localhost]/usr/local/src/phantomjs# phantomjs -v
1.9.7
[root@localhost]/usr/local/src/phantomjs# casperjs --version
1.1.0-beta3
```

こうなった。casperjsが動くかどうか、サンプルを実行する。

```
var casper = require('casper').create();

casper.start('http://casperjs.org/', function() {
    this.echo(this.getTitle());
});

casper.thenOpen('http://phantomjs.org', function() {
    this.echo(this.getTitle());
});

casper.run();
```

```
$ casperjs sample.js
CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS
PhantomJS | PhantomJS
```

動いているっぽい
charlock_holmesが入らない時の対処

Gitlabをインストールしている時、以下のエラーではまった。

```
Gem files will remain installed in /home/git/.gem/ruby/2.0/gems/charlock_holmes-0.6.9.4 for inspection.
Results logged to /home/git/.gem/ruby/2.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/gem_make.out
An error occurred while installing charlock_holmes (0.6.9.4), and Bundler cannot continue.
Make sure that `gem install charlock_holmes -v '0.6.9.4'` succeeds before bundling.
```

### Answer
以下コマンドでおk.

```
sudo yum install patch
```
画像を長い方を指定してリサイズする


参考URL
http://shinen1.wordpress.com/2012/08/16/objective-c-uiimageのサイズ変更/

上記サイトを参考にさせていただきました。

縦横のアスペクト比を固定のまま，入力画像の幅，高さのうち長い方を指定されたサイズに縮小した画像を得るには次のようなメソッドを作成したら行けました。

```Objective-c
/**
 * 画像リサイズ
 */
- (UIImage *)resizeImage:(UIImage *)sourceImage toSize:(CGFloat)newSize
{
    UIImage *destinationImage = [[UIImage alloc] init];
    CGFloat currentWidth = sourceImage.size.width;
    CGFloat currentHeight = sourceImage.size.height;
    CGFloat newWidth, newHeight;
    
    if (newSize == 0) {
        newWidth = newHeight = 0;
    
    } else if (currentHeight < currentWidth) {
        newHeight = floorf(currentHeight * newSize / currentWidth);
        newWidth = newSize;
    
    } else if (currentWidth <= currentHeight) {
        newWidth = floorf(currentWidth * newSize / currentHeight);
        newHeight = newSize;
    
    }
    
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
    destinationImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return destinationImage;
}
```
MacのChromeでPOODLE脆弱性対策（Automatorを使う）

取り急ぎ書きました。
[MacのChromeでPOODLE脆弱性対策（Automatorを使う） - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20141015/how_not_to_bite_poodle_on_mac_chrome)
要点は Chrome の起動オプションに `--ssl-version-min=tls1` を付けること。
Win や Linux では簡単でしょうが、 Mac では起動オプションを付けづらいのです。そのため、 Automator を使って起動オプション付きランチャーを作成しました。
Ansible Playbookでdebugモジュールの出力を少し見やすく

Ansible Playbookのデバッグ時の小ネタ。stdout_lines は便利だねという話。


# 課題

何か外部コマンドを実行し、結果を正しく受け取れているか表示するのに、debug モジュールを使います。

こんな感じで。

```test.yml
--- # file: test.yml

- hosts: all
  gather_facts: False

  tasks:
    - command: ls -1 /etc/cron.daily/
      register: ls_result
      changed_when: False

    - debug: var=ls_result.stdout
      when: ls_result | success
```

しかし、実行すると、あんまり見やすくない表示になります。

```
$ ansible-playbook -i hosts test.yml

PLAY [all] ********************************************************************

TASK: [command ls -1 /etc/cron.daily/] ****************************************
ok: [localhost]

TASK: [debug var=ls_result.stdout] ********************************************
ok: [localhost] => {
    "ls_result.stdout": "0yum-daily.cron\nlogrotate\nman-db.cron"
}

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0
```

理由は、**改行文字がエスケープされてしまう** から。


# 回避策

debugモジュールは、JSONの1要素を1行で表示するので、受け取った文字列をsplitすると1行毎に表示します。

コマンド出力では、最初から split してくれてる stdout_lines を利用できるので…

```test2.yml
--- # file: test2.yml

- hosts: all
  gather_facts: False

  tasks:
    - command: ls -1 /etc/cron.daily/
      register: ls_result
      changed_when: False

    - debug: var=ls_result.stdout_lines # stdout => stdout_lines
      when: ls_result | success
```

そうすると得られる表示は、こんな感じに。

```
$ ansible-playbook -i hosts test2.yml

PLAY [all] ********************************************************************

TASK: [command ls -1 /etc/cron.daily/] ****************************************
ok: [localhost]

TASK: [debug var=ls_result.stdout_lines] **************************************
ok: [localhost] => {
    "ls_result.stdout_lines": [
        "0yum-daily.cron",
        "logrotate",
        "man-db.cron"
    ]
}

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0
```

ちょっと便利。
Scalaにおけるバリアント型の表現

OCamlには、いわゆる代数的データ型の一種として、バリアント型（A型の値かもしれないし、B型の値かもしれないし……、を表現する型）と呼ばれるものがあるそうです。
[ocaml.org](https://ocaml.org/)に載っている、シンプルな二分木を引用します。

```ocaml
(* Binary tree with leaves car­rying an integer. *)
type tree = Leaf of int | Node of tree * tree

let rec exists_leaf test tree =
  match tree with
  | Leaf v -> test v
  | Node (left, right) ->
      exists_leaf test left
      || exists_leaf test right

let has_even_leaf tree =
  exists_leaf (fun n -> n mod 2 = 0) tree
```

OCamlを読むのは初めてなのですが、文法知らなくても分かりやすいですね。
これをScalaで書いてみたいと思います。Scala標準にバリアント型そのものはないので、どうしたものかというところなのですが……、[Effective Scala](http://twitter.github.io/effectivescala/)の"Case classes as algebraic data types"に答えが載っていて、継承とcase classを使って表現するのが一般的なようです。
OCamlのコードと比較しやすいように書くと、こんな感じ。

```scala
sealed trait Tree[T]
case class Leaf[T](v: T) extends Tree[T]
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T]

def exists_leaf[T](test: T => Boolean, tree: Tree[T]): Boolean = {
  tree match {
    case Leaf(v) => test(v)
    case Node(left, right) =>
      exists_leaf(test, left) ||
        exists_leaf(test, right)
  }
}

def has_even_leaf(tree: Tree[Int]): Boolean =
  exists_leaf[Int](_ % 2 == 0, tree)
```
【Java】Basic認証付きproxy経由のHTTPリクエスト方法

#Java8でproxy経由

```java:HttpReq.java
HttpHost proxy = new HttpHost(Host, port);
RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy).build();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(host, port), new UsernamePasswordCredentials(userID,passwd));
HttpClient httpClient = HttpClientBuilder.create()
		         .setDefaultRequestConfig(requestConfig)
		         .setDefaultCredentialsProvider(credsProvider)
		         .build();
String urlString = URL;
HttpPost post = new HttpPost(urlString);
post.setHeader("Content-Type", "text/html; charset=Shift_JIS");
final HttpResponse res = httpClient.execute(post);
HttpEntity httpEntity = res.getEntity();
log.debug("HTTP_REQ=>" + EntityUtils.toString(httpEntity));
```

こんな感じで長すぎワロタ
もっと短くできそうだと思うんだけどね…

Diff10/21
直したら綺麗になった！キータちゃんすごす
iOSアプリ開発時によく使うCocoaPods対応ライブラリ


#AFNetworking
https://github.com/AFNetworking/AFNetworking
pod "AFNetworking"

WebAPIを使うときにはほぼ使っています。
キャッシュポリシーやタイムアウトの設定には注意が必要ですが
使っている開発者も多いため、情報も多いのでオススメです。

関連リンク
[SwiftでAFNetworkingを使う](http://qiita.com/kuniorock/items/c4fdba0d6fca56c8c975)
[AFNetworkingのAFHTTPRequestOperationManagerにタイムアウトとキャッシュポリシーを設定する](http://qiita.com/kuniorock/items/f2bb7c4c5d7c08182d30)
[AFNetworkingのリクエストにCookieとUserAgentを設定する](http://qiita.com/kuniorock/items/ab9bb2bca7846e9c59db)

#SDWebImage
https://github.com/rs/SDWebImage
pod "SDWebImage"

サーバーから画像をダウンロードするときに使います。
ディスクキャッシュ、メモリキャッシュもしてくれるので非常に使い勝手がよいです。
Gifにも対応していますが、かなりメモリを消費するので注意が必要です。
Gifを再生するときにはSDWebImageではなくFLAnimatedImageがオススメです。

関連リンク
[SDWebImageを使って画像をダウンロードする](http://qiita.com/kuniorock/items/4f2a7adefaac8784a125)
[SDWebImageでGifを再生するとメモリ使用量がヤバかったのでFLAnimatedImageを使った](http://qiita.com/kuniorock/items/3c017bfd0dceeca49e3c)

#TTTAttributedLabel
https://github.com/mattt/TTTAttributedLabel
pod "TTTAttributedLabel"

UILabelを装飾したいときに使うライブラリです。
Label内のリンクも検出してくれたり、テキスト内の一部の文字を装飾したいときに使います。

関連リンク
[iOS8でTTTAttributedLabelを使ったときにlinkAttributesが反映されない場合の対処法](http://qiita.com/kuniorock/items/f4513eb916a88566550f)
[TTTAttributedLabelを使ってリンクが設定されているところをタップするとリンク部分の背景色が変わるようにする](http://qiita.com/kuniorock/items/e5cadfa4f6931a42c035)

#Colours
https://github.com/bennyguitar/Colours
pod "Colours"

UIColorを拡張したライブラリです。
RGBA、HSBAをArrayやDictionaryで扱うとこが出来たり、補色の取得やカラースキームの取得も可能で
イマイチ扱いづらいUIColorをかなり便利に使うことが出来るのでオススメです。

#Masonry
https://github.com/Masonry/Masonry
pod "Masonry"

iOSのAutoLayoutをコードで書くと、コード量がかなり多くなってしまいますが
Masonryを使うとコード量が圧倒的に少なくなります。

```objectivec
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
    make.left.equalTo(superview.mas_left).with.offset(padding.left);
    make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
    make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
```

#NYXImagesKit
https://github.com/Nyx0uf/NYXImagesKit
pod "NYXImagesKit"

UIImageのカテゴリライブラリです。
NYXImagesKitには、スケール、クロップ、回転など便利なメソッドが用意されています。
SDWebImageでGifを再生するとメモリ使用量がヤバかったのでFLAnimatedImageを使った


SDWebImageは非常に扱いやすいライブラリで重宝していますが、重いGifを再生するとメモリ使用量がヤバいことになります。
UIWebViewにGifを読ませるという方法もありますが、ロードするときにチラついたりするのでイマイチです。

Gifを再生するときには **FLAnimatedImage** がオススメです。
[FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage)

FLAnimatedImageはFlipboardが公開しているライブラリで実際にFlipboardでも使われているようです。
[HOW FLIPBOARD PLAYS ANIMATED](http://engineering.flipboard.com/2014/05/animated-gif/)

ただ、FLAnimatedImage自体はサーバーからのダウンロードには対応していない(?)ようなので
私の場合、GifファイルのダウンロードはSDWebImageを使っています。

```CocoaPods
pod "FLAnimatedImage"
```

```objectivec:FLAnimatedImageを使ったGifの再生
#import "FLAnimatedImage.h"
#import "FLAnimatedImageView.h"

FLAnimatedImageView* animatedImageView = [[FLAnimatedImageView alloc] initWithFrame:self.view.bounds];
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:gifURL
                                                      options:0
                                                     progress:^(NSInteger receivedSize, NSInteger expectedSize) {

                                                     } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                                                         if( finished ){
                                                             dispatch_async(dispatch_get_main_queue(), ^{
                                                                 FLAnimatedImage* gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:data];
                                                                 animatedImageView.animatedImage = gifImage;
                                                             });
                                                         }
                                                     }];
```
SDWebImageと比べてメモリ使用量もかなり軽くすることができました。
WebRTCとかする時に、色々情報が出るやつ

WebRTCとかする時に、
chromeを開いて

chrome://webrtc-internals/

を開くと、
色々情報が出るって
ハイパフォーマンスブラウザネットワーキングに書いてた。

![141021-0003.png](https://qiita-image-store.s3.amazonaws.com/0/26030/1903ddf7-f3c9-489c-7f91-a6217d70160a.png)

出た。
位相空間論入門 - その１

今日はいつも以上にラクガキです. ストックなんぞする必要はないです(マジで）

# 位相（トボロジー）とは何か

実数の集合と無限個のリンゴの違いとはなんだろうと考えます.

....

### それが位相です.


（いや実際には可算個なのか非加算個とかリンゴ美味いとかあるけど許して）


実数には **最大値** とか **連続** などの概念がありますが、リンゴにはありません.

その概念をもたらしている源が実数には備わっているはずで、それこそが位相（トポロジー）なのです.


ここで留意されたい事は、ペレリマン博士が解決した例のポアンカレ予想もトポロジーという概念が出てきますが、

位相幾何学で用いられるトポロジーとここで述べるトポロジーは微妙に文脈が違うので混同しないよう.


さて話しを戻し、なぜ実数に対して最大値や連続という概念を用いる事が出来るのだろうと考えます.

そもそも集合というのはただのモノの集まりでしかなくて、その間のつながり方を考える事はありません.

その点ではリンゴの集合は至って集合です.

実数も紛う事なき集合ですが、さてどうでしょう実数の元の間には**つながり**が存在します.

怪しいです. そうです、

### それが位相です.

（一般）位相空間論とはこの実数を実数たるべくしている位相を取り出して、

ほかの集合に入れて遊ぼうという学問なのです.


## その１終わり

疲れましたし、区切りが良いので終了です.


## 今後のロードマップ

### 開集合と閉集合


### 連続とは「任意の逆像が位相」である事

### 最大値があるとは「コンパクト」である事

### 連結性

### ハウスドルフ

### 連続、コンパクト、連結性、ハウスドルフ

### 距離空間
Fragment は本当に多様なデバイスへ対応する唯一の方法なのか

参考：[Advocating Against Android Fragments](http://corner.squareup.com/2014/10/advocating-against-android-fragments.html)

----

## Fragment の基本

　Fragment といえば、Honeycomb から導入された、多様なデバイスへ対応するための仕組みで、Activity のライフサイクルに合わせて動作するモジュールのようなものです。

　Fragment として細かく分けたモジュールを組み合わせることで、多様なデバイスへ対応しやすくする、という寸法です。

### ライフサイクル

　Activity に付随して動くので、Fragment も勿論ライフサイクルを持つのですが、Activity よりもはるかに複雑なものとなっています。

　Square のエンジニアブログに曰く、`WTFs/min = 2^fragment count`であると。

### トランザクションとインスタンスの管理

　Fragment Transactions によって、Fragment の操作をまとめ、DB のトランザクション処理のように扱うことができます。
　最終的に一連の操作は MainThread 上で実行されるため、`commit()`操作は Handler のキューに操作のまとまりを積むことになります。
　ということは、Handler のキューの状態次第で、操作が完了するまでにラグが生じる可能性が出てきます。そのラグの間、Fragment の状態は不定です。不定であるということは、そこにデバッグを困難にする要素があるということです。

　レイアウトに直接組み込む以外に、普通にコンストラクタを使ってインスタンスが生成できます。この時、デフォルトコンストラクタがリフレクションによってアクセス可能でなければ、インスタンスの状態の復帰に失敗します。つまり、匿名インナークラスや、引数のあるコンストラクタを Fragment に持たせる事はできませんし、setter によって依存の注入をする方法も良い方法ではないといえます。

　いよいよ、Fragment のテストがしづらいことが見えてきたことでしょう。

　最後に、Fragment は Honeycomb からの仕組みですので、2.x 系で使いたい場合は support library が必要であることを付け加えておきます。

## View

　一方で、自分で好きな View を作ることもできます。これは初期の Android Framework から標準でそのように作られている仕組みです。
　Fragment をレイアウトに組み込んで使うという考え方で見ると、独自 View でもほぼ同じことができます。Fragment 内で受け取ったデータを TextView に流しこむのと、View 内で受け取ったデータを TextView に流しこむのとに、差異はそれほどないはずです。むしろ、プレゼンテーションの管理をするだけであれば、View がその役割を一手に担うほうが見通しがよいでしょう。

### ライフサイクル

　View もライフサイクルを持ちます。少し独特な面もありますが、状態の保存と復帰など、Fragment にあるものは View にもあります。

### リソースの Qualifier

　Fragment を使うにしても View を使うにしても、レイアウトリソースを画面ごとに作り分けることは必要です。つまり、リソースさえ綺麗に分離できれば、Fragment だろうと View だろうと、ほぼ変わらない事ができるということです。

　もはや Fragment だけが多様なデバイスへ対応するための方法ではないということが見えてきたと思います。

## 実は最初から十分に対応可能だった

　Fragment だけでなく、Custom View でも多様なデバイスへ対応するための設計は十分に可能です。むしろ、複雑な Fragment の仕組みを使うより、既存の View の仕組みを使うほうが、いくらか幸せになれそうな気さえします。新しい API は必要ありませんし。

## 待った！

　それでも Fragment が役に立つ場面があります。Dialog がその代表でしょう。

### AlertDialogs

　プロンプトを表示して判断を促す場合に AlertDialog を使うならば、DialogFragment は必須でしょう。FragmentManager がよくその面倒を見てくれるはずです。ただし、どの選択肢を選んだかをコールバックで対応する場合はよくよく注意して実装する必要があります。

### ProgressDialogs

　プログレスはどうでしょう。今や、ProgressDialog はその存在自体を黒歴史のように扱われています。ProgressBar を表示して、UI の状態を変更するだけでも十分に意味を持ち、わざわざダイアログとして見せる必要性は薄れています（そしてこれらのことをするためのライブラリもいくつか公開されています）。

### 非同期処理

　Loader を使っていい感じに非同期処理をしたいのならば、Fragment が役に立つでしょう。しかし、Activity でも同じことができます。最終的に非同期処理の結果を View にバインドする仕事をどこに持たせるかが重要になり、それは多くの場合 View のしごとになるはずですから、あえて Fragment を挟む必要はないかもしれません。

## さいごに

　Fragment にせよ、View にせよ、いずれにしてもビジネスロジックを分離したり、View のロジックを分離したりと言ったことは必要不可欠です。Dagger や Mortar など、これを支援する仕組みは沢山あるので、是非活用していきたいところです。
POODLE対応(CVE-2014-3566)の確認方法


```:SSLプロトコルが見つからなければOK
$ curl -L --sslv3 https://example.com
curl: (35) Unknown SSL protocol error in connection to example.com:-9824
```

```:オレオレ証明書使ってる人はこちら
$ curl -L -k --sslv3 https://example.com
curl: (35) Unknown SSL protocol error in connection to example.com:-9824
```
C#で多次元配列を1次元配列のように扱う

コード

```csharp

using System;
using System.Linq;
using System.Collections.Generic;

public class IEnumerableTest
{
    public static void Main()
    {
        int [,] ary = new int[3, 3] {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}                    
        };
        foreach(var x in ary.Cast<int>())
        {
            Console.WriteLine(x);
        }
    }       
}       
```


出力結果
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 9


ちなみに
> var xs = new int[3, 3]{ ... };
とかした後に
> xs[1]
とかすると
> IEnumerable.cs(14,30): error CS0022: Wrong number of indexes `1' inside [], expected `2'
と怒られます。
SSLv3が無効になっているかを確認する簡単な方法


```
% curl -3 https://<MY.SUPER.SERVICE.COM>/
```

とやってみて、下記のようなエラーになれば無効になっています。

```
% curl -3 https://www.example.com/                                 
curl: (35) Unknown SSL protocol error in connection to www.example.com:-9824
```
Rails4.0から4.1に移行する。Rubyも2.0から2.1に上げる


Rails4.1で追加された”Action Pack Variants"が使いたかったのでやってみました。

[Ruby on Rails 4.1 Release Notes #2(Rails4.1の主な機能)](http://rochefort.hatenablog.com/entry/2014/01/14/070830)



## 事前準備

**rbenvでRubyをインストールしている前提です。**


#### Railsアプリケーションの現行のバージョンを確認

```shell
$rake about

About your application's environment
Ruby version              2.0.0 (x86_64-darwin13.3.0)
RubyGems version          2.4.1
Rack version              1.5
Rails version             4.0.4
JavaScript Runtime        therubyracer (V8)
~(省略)~ 
```

#### Rubyのバージョン

```shell
$ruby -v

ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-darwin13.3.0]
```


## Ruby2.1をインストールする

rbenvで管理されているRubyのバージョンを確認します。

```shell
$ rbenv versions
  system
* 2.0.0-p481 (set by /Users/yuto-ogi/.rbenv/version)
  2.1.2
```

上記例では、2.0.0、2.1.2の２バージョンがrbenvによってインストールされており、
2.0がデフォルトで使用されるバージョンとして選択されている状態です。
(systemはMacOSにデフォルトでインストールされているバージョンですが、rbenvインストール後はほとんど使わないのでシカトでいいと思います）

2.1がインストールされていない場合はインストールします。
インストール可能なバージョンを一覧表示します。

```
rbenv install -list

Available versions:
	~
  2.0.0-rc1
  2.0.0-rc2
  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.1.1
  2.1.2
	~
```

2.1.2をインストールします。

```
rbenv install 2.1.2
```


## RailsアプリケーションのディレクトリのRubyバージョンを変更する

Railsアプリケーションのディレクトリに居る場合は、2.1.2を使用するように設定してみます。
まずはRailsアプリケーションのルートディレクトリに移動します。

```shell
cd {Railsアプリケーションの場所}
```

移動後下記のコマンドを実行します。

```shell
rbenv local 2.1.2
```

実行すると、.ruby-versionというファイルが作成されます。
中身を見ると、

```shell
cat .ruby-version
2.1.2
```

このファイルのあるディレクトリでは、ファイルに書かれたRubyのバージョンが使用されます。

```shell
# local in ~/Work/rails_app on git:rails4.1 x [16:02:56]
$ cd ../

# local in ~/Work [16:02:58]
$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-darwin13.3.0]

# local in ~/Work [16:03:01]
$ cd rails_app

# local in ~/Work/rails_app on git:rails4.1 x [16:03:09]
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
```

#### システム全体のRubyバージョンを変更する場合は、

```shell
rbenv glocal {Rubyバージョン}
```


## Railsのバージョンを変更する

いよいよRailsアプリケーションのバージョンを変更するときがきました・・・！

```ruby:Gemfile
ruby "2.0.0"
gem 'rails', '4.0.4'
```
↓

```ruby:Gemfile
ruby "2.1.2"
gem 'rails', '4.1'
```

上記のように書き換えて、

```shell
bundle update
```

インストールが終わったらRailsのバージョンを確認してみます。

```shell
$rails -v

Rails 4.1.0
```

```shell
$ rake about
About your application's environment
Ruby version              2.1.2-p95 (x86_64-darwin13.0)
RubyGems version          2.2.2
Rack version              1.5
Rails version             4.1.0
JavaScript Runtime        therubyracer (V8)
Active Record version     4.1.0
Action Pack version       4.1.0
Action View version       4.1.0
Action Mailer version     4.1.0
Active Support version    4.1.0
~(省略)~
```

**OK!**


![](http://www.lgtm.in/p/Ai0jwcU3q)
awk

date
======

# 14:25 - 15:37
````awk '{if($2 ~ /^14:2[5-9]/ || $2 ~ /^14:[3-5][0-9]/ || $2 ~ /^15:[0-2][0-9]/ || $2 ~ /^15:3[0-7]/) print} '````



カラム出力
=========

# 12カラム目以降
awk 'BEGING{a=""}{for(i = 12; i <= NF; i++){ a = a OFS $i}; a = a ORS;}END{print a}'
Spark MLlibで相関係数を算出してみる。


## 環境
* Mac OS X Version 10.9.5
* Scala 2.10.4
* Spark 1.1.0
* Spark MLlib 1.1.0
* sbt 0.13.1

## 準備

```tree
/root/to/project/path
   |-- build.sbt
   |-- src
   |    |-- main
   |    |    |-- scala
   |    |    |    |-- Stoppable.scala
   |    |-- test
   |    |    |-- scala
   |    |    |    |-- SparkMLlibCorrelationSpec.scala
```

```build.sbt
name := "Spark MLlib examples"                                                                                                                                                    

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.10.4"

scalacOptions ++= Seq("-Xlint", "-deprecation", "-unchecked", "-feature", "-Xelide-below", "ALL")

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.1.0",
  "org.apache.spark" %% "spark-mllib" % "1.1.0",
  "org.specs2" %% "specs2" % "2.4.1"
)
```

## 実装
```src/test/scala/SparkMLlibCorrelationSpec.scala
import commons._                                                                                                                                                                  

import org.apache.spark._
import org.apache.spark.mllib.stat._
import org.apache.spark.mllib.stat.correlation._
import org.apache.spark.SparkContext._

import org.specs2._

class SparkMLlibCorrelationSpec extends Specification with Stoppable { def is = s2"""

  Spark MLlib

  Correlation
    correlation1                               $correlation1
  """

  // 気温とビールの出荷数
  val xData = Array(12.1, 15.3, 18.6, 21.7, 26.1, 32.1)
  val yData = Array(45.0, 520.0, 2864.0, 6874.0, 25487.0, 102870.0)

  var retCorrelation1: Double = _ 
  using(new SparkContext("local[1]", "SparkMLlibCorrelationSpec", System.getenv("SPARK_HOME"))) { sc =>
    val x = sc.parallelize(xData)
    val y = sc.parallelize(yData)
    retCorrelation1 = Statistics.corr(x, y, "pearson")
  }
  // この相関係数を算出しているページ:http://dekiru.net/article/4576/
  def correlation1 = retCorrelation1 must_== 0.8633475827899126
}
```

```src/main/scala/Stoppable.scala
package commons                                                                                                                                                                   

import scala.language.reflectiveCalls

trait Stoppable {
  type T = { def stop(): Unit }
  def using[A <: T, B](resource: A)(f: A => B) = try {
    f(resource)
  } finally {
    resource.stop()
  }
}
```

## 実行

```shell
$ sbt '~test-only SparkMLlibCorrelationSpec'
```

## 参考

http://spark.apache.org/docs/1.1.0/mllib-statistics.html#correlations
AFNetworkingのAFHTTPRequestOperationManagerにタイムアウトとキャッシュポリシーを設定する


AFHTTPRequestOperationManagerにはタイムアウトとキャッシュポリシーを設定するプロパティが無いので
カテゴリクラスを作っておくと便利です。

```objectivec:AFHTTPRequestOperationManagerのカテゴリメソッド
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
                     parameters:(NSDictionary *)parameters
                timeoutInterval:(NSTimeInterval)timeoutInterval
					  cachePolicy:(NSURLRequestCachePolicy)cachePolicy
                        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    NSError* error = nil;
    
    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET"
                                                                   URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString]
                                                                  parameters:parameters
                                                                       error:&error];
    
    
    [request setTimeoutInterval:timeoutInterval];
    [request setCachePolicy:cachePolicy];
    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
    [self.operationQueue addOperation:operation];
    
    return operation;
}

```
Android Drag and Drop ライブラリ集

# GridView
## CoolDragAndDrop
https://github.com/theredsunrise/AndroidCoolDragAndDropGridView
![alt](https://camo.githubusercontent.com/7ed286aaca8747b5349b6ec59e1988a3227aea0b/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f6578706f72743d646f776e6c6f61642669643d3042346a5050514f5a384e2d4d556c6c475a6d563358325a704d6a67)

## DynamicGrid
https://github.com/askerov/DynamicGrid
Demo: http://www.youtube.com/watch?feature=player_embedded&v=zlzNvxksIfY%0A

随時追加します。
TTTAttributedLabelを使ってリンクが設定されているところをタップするとリンク部分の背景色が変わるようにする


Twitterアプリではリンクが設定されている箇所をタップすると背景色が変わります。
同じようなことをTTTAttributedLabelを使って実現します。

```objectivec:リンク部分の背景色を変える

//リンクを抽出するようにする
self.commentLabel.enabledTextCheckingTypes = NSTextCheckingTypeLink;

//タップしたときのリンク部分の背景色
UIColor* linkBackgroundColor = [UIColor blueColor];
//リンク部分のフォント
UIFont* linkFont = [UIFont fontWithName:@"KohinoorDevanagari-Medium" size:15];

//リンク部分の装飾
self.commentLabel.linkAttributes = @{
										NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone),
										(NSString *)kCTFontAttributeName : linkFont
									};

//リンク部分ハイライト時の装飾
self.commentLabel.activeLinkAttributes = @{
											(NSString*)kTTTBackgroundFillColorAttributeName : (__bridge id)[linkBackgroundColor CGColor],
											(NSString *)kCTFontAttributeName : linkFont
											};
```
これでリンク部分をタップしたときに背景色を変えることができます。
2つのUITableViewのスクロールを同期させる


かなりイレギュラーなUIですが、iPad対応をしているときに2つのUITableViewのスクロールを同期させるということをやったのでメモ。

親となるViewControllerにコンテナを2つ用意して
それぞれに同じクラスのUIViewControllerを設定しました。

UIViewControllerの継承クラスであるHogeViewControllerにUITableViewを持たせていたので
それぞれのUIViewControllerにもう片方のUITableViewの **contentSize** と **contentOffset** を監視させて同期する。

```objectivec:親ViewControllerでUITableViewを監視する設定をする
	HogeViewController* vc1 = self.childViewControllers[0];
    HogeViewController* vc2 = self.childViewControllers[1];
    
    [vc1.tableView addObserver:vc2
                       forKeyPath:@"contentSize"
                          options:NSKeyValueObservingOptionNew
                          context:NULL];
    
    [vc2.tableView addObserver:vc1
                       forKeyPath:@"contentSize"
                          options:NSKeyValueObservingOptionNew
                          context:NULL];
    
    [vc1.tableView addObserver:vc2
                       forKeyPath:@"contentOffset"
                          options:NSKeyValueObservingOptionNew
                          context:NULL];
    
    [vc2.tableView addObserver:vc1
                       forKeyPath:@"contentOffset"
                          options:NSKeyValueObservingOptionNew
                          context:NULL];
```

そして、HogeViewControllerで変更を検知したら同期するようにします。

```objectivec:HogeViewControllerで同期処理をする
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{
    if ([keyPath isEqualToString:@"contentSize"]) {
		UITableView* changedTableView = (UITableView*)object;
		if(!CGSizeEqualToSize(self.tableView.contentSize,changedTableView.contentSize)){
			self.tableView.contentSize = changedTableView.contentSize;
		}
	}
	else if ([keyPath isEqualToString:@"contentOffset"]) {
		UITableView* changedTableView = (UITableView*)object;
		if(!CGPointEqualToPoint(self.tableView.contentOffset,changedTableView.contentOffset)){
			self.tableView.contentOffset = changedTableView.contentOffset;
		}
	}
}
```

この方法だとユーザーが操作していない方のUITableViewにスクロールバーが表示されないのが難点ですが
とりあえず2つのUITableViewのスクロールを同期させる。ということは実現出来ました。
PlayerPrefsをGenericにする試み


```AppConfig.cs

	public class AppConfig<T> where T: IConvertible {
		string key;
		T defaultValue;
		
		public AppConfig(string key, T defaultValue) {
			this.key = key;
			this.defaultValue = defaultValue;
			
			if (!typeof(T).Equals (typeof(Int32)) &&
			    !typeof(T).Equals (typeof(String)) &&
			    !typeof(T).Equals (typeof(Single)) &&
			    !typeof(T).Equals (typeof(Boolean))) {
				throw new NotSupportedException("specified type of T (" + typeof(T) + ") is not supported.");
			}
		}
		
		
		public string Key {
			get {
				return key;
			}
		}
		
		
		public T Value {
			set {
				if (value.GetType ().Equals (typeof(string))) {
					Debug.Log ("set string : " + value);
					PlayerPrefs.SetString (key, value.ToString ());
					
				} else if (value.GetType ().Equals (typeof(int))) {
					Debug.Log ("set int : " + value);
					PlayerPrefs.SetInt (key, value.ToInt32 (CultureInfo.CurrentCulture));
					
				} else if (value.GetType().Equals(typeof(float))) {
					PlayerPrefs.SetFloat(key, value.ToSingle(CultureInfo.CurrentCulture));
				
				} else if (value.GetType().Equals(typeof(bool))) {
					// true なら 1 、false なら 0 に置き換える
					PlayerPrefs.SetInt(key, value.ToBoolean(CultureInfo.CurrentCulture) ? 1 : 0);
				}
			}
			
			get {
				object value = default(T);
				Debug.Log (typeof(T));
				if (typeof(T).Equals (typeof(String))) {
					value = PlayerPrefs.GetString (key, defaultValue.ToString ());
					Debug.Log ("string : " + value);
					
				} else if (typeof(T).Equals (typeof(Int32))) {
					value = PlayerPrefs.GetInt (key, defaultValue.ToInt32 (CultureInfo.CurrentCulture));
					Debug.Log ("int : " + value);
					
				} else if (value.GetType ().Equals (typeof(T))) {
					value = PlayerPrefs.GetFloat(key, defaultValue.ToSingle(CultureInfo.CurrentCulture));
				
				} else if (value.GetType().Equals(typeof(T))) {
					// true なら 1 、false なら 0 に置き換える
					var def = defaultValue.ToBoolean(CultureInfo.CurrentCulture) ? 1 : 0;
					value = (PlayerPrefs.GetInt(key, def) == 1);
				}
				
				return (T)Convert.ChangeType(value, typeof(T));
			}
		}
		
		
		public void Delete() {
			PlayerPrefs.DeleteKey(key);
		}
	}

```


使い方

```
		AppConfig<string> m_configStr = new AppConfig<string>("Test.Config", "hoge");
		AppConfig<int> m_configInt = new AppConfig<int>("Test.Config.Int", -1);
		AppConfig<float> m_configFloat = new AppConfig<float>("Test.Config.Float", -1.11f);
		AppConfig<bool> m_configBool = new AppConfig<bool>("Test.Config.BoolTrue", false);


        m_configStr.Value = "test";
        m_configInt.Value = 100;
        m_configFloat.Value = 9.99f;
        m_configBool.Value = true;
```
UIWindowの背景色を変更する



UIWindowの背景色を変更するにはUIWindowのLayerの色を変更すれば実現できます。

```objectivec:UIWindowの背景色を変更
UIWindow* window=[UIApplication sharedApplication].keyWindow;
    if(!window)window=[[UIApplication sharedApplication].windows objectAtIndex:0];
    window.layer.backgroundColor = [UIColor whiteColor].CGColor;
```
UIToolBar、UINavigationBarの影を消す


UIToolBarのView構造を見ると、以下のようになっています。

```objectivec:UIToolBarの構造
po [self.toolBar recursiveDescription]
<UIToolbar: 0x12ce52e20; frame = (0 524; 320 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x1706207e0>>
   | <_UIToolbarBackground: 0x12ce53de0; frame = (0 0; 320 44); userInteractionEnabled = NO; layer = <CALayer: 0x170621440>>
   | <UIImageView: 0x1701ffa00; frame = (0 -0.5; 320 0.5); autoresize = W+BM; userInteractionEnabled = NO; layer = <CALayer: 0x170621220>>
   | <UIToolbarButton: 0x12cd79b90; frame = (16 0; 11 44); opaque = NO; layer = <CALayer: 0x17843d380>>
   |    | <_UIToolbarNavigationButton: 0x12cd7bd70; frame = (0 0; 33 30); opaque = NO; layer = <CALayer: 0x17843e180>>
   | <UIToolbarButton: 0x12cd7c200; frame = (191 0; 23 44); opaque = NO; layer = <CALayer: 0x17843e440>>
   |    | <_UIToolbarNavigationButton: 0x12cd7c3f0; frame = (0 0; 45 30); opaque = NO; layer = <CALayer: 0x17843be60>>
   | <UIToolbarButton: 0x12cd7c680; frame = (285 0; 19 44); opaque = NO; layer = <CALayer: 0x17843c460>>
   |    | <_UIToolbarNavigationButton: 0x12cd7c870; frame = (0 0; 41 30); opaque = NO; layer = <CALayer: 0x17843c6e0>>
   | <UIToolbarButton: 0x12cd7cb00; frame = (98 0; 23 44); opaque = NO; layer = <CALayer: 0x17843cca0>>
   |    | <_UIToolbarNavigationButton: 0x12cd7ccf0; frame = (0 0; 45 30); opaque = NO; layer = <CALayer: 0x17843c8c0>>
```

上記の構造を見てみると、影は高さが0.5のUImageViewで表示されていることが分かります。

なので

```objectivec:影を消す
	for (UIView* subView in self.toolBar.subviews) {
        if( subView.frame.size.height == 0.5f ){
            [subView removeFromSuperview];
        }
    }
```
これで影を消すことができます。
UIImageViewのクラスである。というチェックもあった方がいいかもしれません。

UINavigationBarの影も同様の方法で消すことができます。
アクセストークン更新時の例外

現在、YahooID連携サンプルコードを参考にしてアクセストークン更新を実装しましたが、
YConnectExplicit#refreshToken()にてNullPointerExceptionが発生しております。
原因の絞込みを行った所、RefreshTokenClientの実装と実際のレスポンスパラメータが食い違っておりました。
(refresh_token⇔token_type)

YConnectライブラリ使用方法の間違いなど御座いましたら教えて頂けないでしょうか。

■RefreshTokenClient#fetch()の抜粋
　String accessTokenString = jsonObject.getString("access_token");
　long expiresIn = Long.parseLong(jsonObject.getString("expires_in"));
　String refreshToken = jsonObject.getString("refresh_token");

■Tokenエンドポイント 『アクセストークン更新時のレスポンスパラメーター』の説明
　access_token　　アクセストークン。APIへアクセスするのに使用します。最大1024Byte の可変長トークンです。
　token_type　　　アクセストークンタイプ。ウェブAPIへアクセスする際にアクセストークンを適切に用いるために必要な情報を提供します。
　expires_in　　　アクセストークンの有効期限を表す秒数。通常は3600(1時間)です。

■ログ抜粋
2014/10/15 14:01:04.162 [DEBUG]861:{"access_token":"<アクセストークンの文字列>","token_type":"bearer","expires_in":"3600"} (java.lang.String)

■ライブラリ
jp.co.yahoo.yconnect-2.0.0.jar
javax.json-1.0.4.jar
mailto の代わりに、ActiveX で Outlook の件名と本文を設定

Internet Explorer と Outlook を使用している環境のみが対象です。
Internet Explorer では URL に最大 2,083 文字が使用可能(http://support.microsoft.com/kb/208427/
)で、mailto もそれに従いますが、日本語のメールだと UTF-8 で約 700 文字、古い Internet Explorer では約 200 文字くらいしか設定できず、Outlook の設定によっては文字化けが発生することもあるので、こちらの方式を採用しています。
いまさら、mailto でしかも環境固定ですので、使われる方も少ないでしょうが参考になれば幸いです。

```js:mailtoOutlook.html
<script LANGUAGE="JavaScript">
    var objOutlook = new ActiveXObject('Outlook.Application');
    var objNameSpace = objOutlook.GetNameSpace('MAPI');
    var Item = objOutlook.CreateItem(0);
    Item.Display();
    Item.To = "xxx@xxx.co.jp";
    Item.Subject = "タイトル";
    var Msg = "";
    for (var i = 1; i <= 30; i++) {
        Msg = Msg + i +
            "いろはにほへと ちりぬるを\nわかよたれそ つねならむ\nうゐのおくやま けふこえて\nあさきゆめみし\nゑひもせすん\n" +
            "色は匂へど 散りぬるを\n我が世誰そ 常ならむ\n有為の奥山 今日越えて\n浅き夢見じ 酔ひもせず\n\n";
    }
    Item.Body = Msg;
    Item.GetInspector.WindowState = 2;
</script>
```
UICollectionViewCellのAutoLayoutが効かない(未解決?)


UICollectionViewCellのItemSizeを動的に変えた場合(デバイスを回転させたときにItemSizeを変更した)にUICollectionViewCellのAutoLayoutが効かなくなる。という現象に遭遇しました。(そもそもItemSizeを途中で変えるというアプローチがダメな気がしますが・・・。)

とりあえず、解決策としては **- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath**でUICollectionViewCellが持っているcontentViewに対してAutoLayoutの設定を書いてやれば解決しました。

```objectivec:contentViewにAutoLayout設定

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
	UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

	//Masonryを使っているのでAutoLayoutは以下のような記述
	[cell.contentView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(cell);
    }];

	//do something

	return cell;
}

```
openFrameworks on Android の環境構築メモ for Mac OS X 10.9.5

##【openFrameworks on Android の環境構築メモ for Mac OS X 10.9.5】

####①用意するもの
- Java SE Development Kit 7
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
- ADT v22.3.0
http://developer.android.com/sdk/index.html
- Android NDK, Revision 10b (September 2014)
https://developer.android.com/tools/sdk/ndk/index.html
- of_v0.8.4_android_release (openFrameworks for Eclipse)
http://openframeworks.cc/download/
- Apache Ant(TM) version 1.9.4
(homebrewがインストールされてればターミナルで brew install ant 
そうでなければhomebrewのインストールから
http://tomokop.hatenablog.com/entry/2014/05/07/095249
上記を参考に)

####②参考サイト
準備後は、以下のサイトがよくまとまっているので、PATHを通したり設定を変更したりごちゃごちゃする。
- http://tips.hecomi.com/entry/20130106/1357469913
- http://openframeworks.jp/setup/android-eclipse/
設定アプリでTwitterアカウントが設定されていない場合にUIActivityViewControllerにTwitterを表示する


アカウントが設定されているかは「SLComposeViewController」を使用します。

```objectivec:Twitterアカウント確認
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] == NO) {
	//アカウントが設定されていないとき
}
```

UIActivityViewControllerにTwitterアイコンを表示するにはUIActivityを継承したクラスを自前で作成する必要があります。
ここでは仮に、 **TWActivity** とします。


```objectivec:UIActivityViewControllerに自前UIActivityを追加
NSArray *activityItems = @[tweetString,url];
NSMutableArray* activities = [NSMutableArray new];
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] == NO) {
	//アカウントが設定されていないとき
	TWActivity *twitterActivity  = [[TWActivity alloc] init];
    [activities addObject:twitterActivity];
}

self.activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                                applicationActivities:activities];
```

```objectivec:TWActivity
#import "TWActivity.h"

@interface TWActivity ()
@end
@implementation TWActivity

+ (UIActivityCategory)activityCategory
{
    return UIActivityCategoryShare;
}

- (NSString *)activityType
{
    return NSStringFromClass([self class]);
}

- (NSString *)activityTitle
{
    return @"Twitter";
}

- (UIImage *)activityImage
{
    return [UIImage imageNamed:@"twitter_icon"];
}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
{
    for (id activityItem in activityItems) {
        if ([activityItem isKindOfClass:[NSURL class]] && [[UIApplication sharedApplication] canOpenURL:activityItem]) {
            return YES;
        }
    }
    
    return NO;
}

- (void)prepareWithActivityItems:(NSArray *)activityItems
{
}

- (void)performActivity
{    

}

```

同様の方法でFacebook等も可能です。
deploy:rollbackするときの単位

自分用のメモ。
体感したことだけなので、ちょっと違うかも。

capistranoでロールバックするときの単位はデプロイ単位。
 

***
###デプロイの単位について

```lang:1回目のデプロイ
commit A
commit B
```
```lang:2回目のデプロイ
commit C
```

　
という状態だったとき、
commit Aでバグが発生したのでデプロイを全てなかったことにしたい。
　

```lang:1回目のrollback
bundle exec cap [環境] deploy:rollback
⇒1回目のデプロイの状態になる。
```
```lang:2回目のrollback
bundle exec cap [環境] deploy:rollback
⇒全てのデプロイがなくなった状態になる。
```
　
***

　
###シンボリックの変更について

シンボリックリンクが変更になるのは、
そのシンボリックリンクに関連するデプロイがなくなったら。
　　

```lang:前提(昨日デプロイした)
commit X
```
```lang:1回目のデプロイ(昨日)※追加でデプロイ
commit A
commit B
```
```lang:2回目のデプロイ(今日)
commit C
```
```lang:3回目のデプロイ(今日)
commit D
```
　
という状態だったとき、
やっぱり全部のデプロイをなかったことにしたい。
　

```lang:1回目のrollback
bundle exec cap [環境] deploy:rollback
⇒2回目のデプロイの状態になる。シンボリックリンクは今日生成されたディレクトリ。
```
```lang:2回目のrollback
bundle exec cap [環境] deploy:rollback
⇒1回目のデプロイの状態になる。シンボリックリンクは今日生成されたディレクトリ。
```
```lang:3回目のrollback
bundle exec cap [環境] deploy:rollback
⇒全てのデプロイがなかったことに。シンボリックリンクは昨日生成されたディレクトリ。
　内容はcommit Xの状態になる。
```
LaTeXで丸1などを出力する


基本的には，Ref.1にある通り，

```
\textcircled{\scriptsize 1}
```
とすれば良いらしい．`scriptsize`にしないと，ダサイ．

## Enumerate環境で使うには
```
\begin{enumerate}
  \renewcommand{\labelenumi}{¥textcircled{\scriptsize \theenumi}}
  \item ....
  \item ...
\end{enumerate}
```
のようにすれば良いらしい．

## 参照ウェブサイト
1. [LaTeX/マル数字を入れる](http://wsp.csse.muroran-it.ac.jp/index.php?LaTeX%2F%A5%DE%A5%EB%BF%F4%BB%FA%A4%F2%C6%FE%A4%EC%A4%EB%A1%A3)
2. [数字を丸(○)できれいに囲むには？](http://www.geocities.co.jp/SiliconValley/7231/maru.htm)
コマンドラインで C++ コードをビルド(コンパイルとか)して実行してみよう


どうも, ゆとりエンジニアの [phi](http://twitter.com/phi_jp) です.

『C++ 書きたい!! けど mac だから VisualStudio 入れラレナイヨー
実行できないよー』

っという日本に３人(自分含む)ぐらいしかいないんじゃないかという人のための
エントリーです.

作ったやつはこちら -> https://github.com/phi-jp/helloworld.cpp

![logo-sun.jpg](https://qiita-image-store.s3.amazonaws.com/0/7756/2544dd61-f0a4-0d4a-66fa-3665b39b740c.jpeg)


## g++ をインストールしよう

### mac

Xcode 経由で入れるのが簡単かなって思います.

Tool bar の Xcode -> Preferences -> Download -> Command Line Tools
の Install をクリック

完了すればターミナルとかで

```bin
$gcc --help
```

とか実行してインストールされてるか
確認してみてください.


### win

...


## C++ のコードを書こう

まず作業フォルダを作りましょう. ここでは `helloworld` とします.
次に `helloworld` フォルダの中に `main.cpp` とかいうファイルを作ります.

下記のコードを入力.

```cpp
#include <iostream>

using namespace std;

int main() {
    cout << "Hello, world!" << endl;
    return 0;
}
```

## g++ で C++ をコンパイルしよう

ターミナルで下記のコマンドを実行.

```bin
$g++ -o helloworld main.cpp
```

成功すると同じディレクトリに helloworld という実行ファイルが生成されています.

## 実行してみよう

```
$./helloworld
```

`Hello, world!` と表示されれば成功です.
`./` を忘れないように!!

以上です.


会社の同僚と, テンプレートの話とかしてたら久々に
C++ 書きたい欲求がでてきちゃいまして...w
SSL 3.0 を無効に設定する方法(POODLE対応) apache+mod_ssl, nginx

SSL 3.0の脆弱性 CVE-2014-3566 aka POODLE の対応でSSL v3を無効にする必要あり

* http://www.itmedia.co.jp/news/articles/1410/15/news054.html
* http://googleonlinesecurity.blogspot.jp/2014/10/this-poodle-bites-exploiting-ssl-30.html
* https://blog.mozilla.org/security/2014/10/14/the-poodle-attack-and-the-end-of-ssl-3-0/
* https://www.openssl.org/~bodo/ssl-poodle.pdf



Apache httpd + mod_sslなら
http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslprotocol
```SSLProtocol All -SSLv2 -SSLv3 ```
httpd2.4からは SSLv2は元から無効なので ```All -SSLv3```でOK http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslprotocol

nginxなら
```ssl_protocols TLSv1 TLSv1.1 TLSv1.2;```
http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
Xamarin.Mac: AVPlayerのビデオ表示位置のトップマージンを０にする



# Interface Builder でAVPlayerViewのAutoresizingを設定する

![image](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/xmac/AVPlayer/1.autoresizing.png)



# AVPlayerViewの実装クラス作成


~~~csharp:AVPlayerView.cs

[MonoMac.Foundation.Register("AVPlayerView")]
public class AVPlayerView : MonoMac.AppKit.NSView
{
    //...
}
~~~

# AVPlayerViewのリサイズハンドラを実装

- Macの座標は Bottom-Leftがオリジンみたい
- AVPlayerLayerのなかのVideoは自動的にセンタリングされるようです
- Videoの高さとAVPlayerLayerの高さの差だけSetBoundsOrigin()で持ち上げてやると良さそうです

~~~ csharp:AVPlayerView.cs

		public override void ResizeSubviewsWithOldSize (System.Drawing.SizeF oldSize)
		{
			// AVPlayerLayerのBounds == this.Bounds

			base.ResizeSubviewsWithOldSize (oldSize);

			var margin = this.Bounds.Height - _playerlayer.VideoRect.Height;
		
			this.SetBoundsOrigin(
				new System.Drawing.PointF(0.0f, margin));
				
		}
~~~		

![image](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/xmac/AVPlayer/2.top_margin_0.png)
Gitで使われていないリモートブランチの整理


使われていなさそうな名前のリモートブランチがいろいろあったので、何か一覧するコマンドがないか探してみた。

## マージ済みリモートブランチ一覧

既に``master``にマージしたリモートブランチなら何時でもコミットから分岐できるから削除できる。マージ済みブランチは以下のコマンドで列挙できた。

```
git branch -r --list --merged
```

デフォルトではカレントブランチのHEADと比較されるのでローカルで``master``ブランチに切り替えて実行するか
``git branch -r --list --merged <commit>`` でコミットを指定する。

逆に``git branch -r --list --no-merged``だとマージされていない(進捗中 or 放置)ブランチが検索できる。

削除を依頼するためブランチの最後のコミッタとコメント、日付を表示したい。``--pretty=format``を使うことにした。書式のオプションは[git-log](https://www.kernel.org/pub/software/scm/git/docs/git-log.html#_pretty_formats)のPRETTY FORMATSのところに書いてある。

```
git log -1 --pretty=format:"%an %ad %s" --date=short
```

最終的に以下のようなコマンドを使った。リストしたブランチに対して``git log``を実行する。

```
git branch -r --list --merged | grep -v '*' | xargs -Ibranch git log -1 --pretty=format:"|branch|%an|%ad|%s|" --date=short branch
```

フォーマットを``|branch|%an|%ad|%s|``にしているのはWiki/Markdownでテーブルにするため。

あとはこれを送ってラストコミッタさん、要らないブランチなら削除してとお願いする。Jenkinsとかで定期的にメールするようにしてもいいかもしれない。

``--no-merged``でも日付が古い不明なブランチは企画倒れで使われていない恐れがあるので確認してもらったほうが良い。

```
git branch -r --list --no-merged | grep -v '*' | xargs -Ibranch git log -1 --pretty=format:"|branch|%an|%ad|%s|" --date=short branch
```


## リモートブランチの削除

ちなみにリモートブランチの削除はローカルで削除して空をpushすればよい。

```
git branch -d <branchname>
git push origin :<branchname>
```

ローカルブランチとリモートブランチが同名の場合、
``git push origin <branchname>``は
``git push origin <branchname>:<branchname>``の省略であり、
空のブランチのpushは
``git push origin :<branchname>``になる。
タグを削除するときも際も同じ方法が使える。

## 削除されたリモートブランチの同期

誰かがリモートブランチが削除しても、自分のローカルブランチには残っている。以下のコマンドで整理ができる。

```
git remote prune origin
```
SSLDumpでサーバに来ているコネクションをSSLv3かTLS1.xか判断する


サーバに来ているSSL/TLSコネクションのクライアントバージョンを確認したい時、`ssldump`コマンドが使える。

Debian系ならaptで`apt-get install ssldump`、結構古い。


## クライアントバージョンをClientHelloでチェック

ヘッダ表示と逆引きしないオプションあたりを付けて、`ssldump`を実行してみた。
ClientHelloのバージョンから判断できる。

```
# ssldump -v
ssldump 0.9b3


# ssldump -n -H -i eth0 


## SSLV3の時はVersion 3.０
New TCP connection #1: xxx.xxx.xxx.xxx(64235) <-> xxx.xxx.xxx.xxx(443)
1 1  0.0651 (0.0651)  C>S  Handshake
      ClientHello
        Version 3.0 
        cipher suites

-- snip --

### TLS1の時はVersion 3.1
New TCP connection #3: xxx.xxx.xxx.xxx(64288) <-> xxx.xxx.xxx.xxx(443)
3 1  0.0651 (0.0651)  C>S  Handshake
      ClientHello
        Version 3.1 
        cipher suites
```

あと、`SSLv2 compatible client hello`を送ってくるのもいるので、そういう手合はその後のVersionで判断。



## opensslコマンドでクライアント役

挙動確認のクライアント役にはopensslコマンドをつかってもOK。

```
openssl s_client -connect xxx.example.com:443 -ssl3  ## ClientHello 3.0
openssl s_client -connect xxx.example.com:443 -tls1  ## ClientHello 3.1
openssl s_client -connect xxx.example.com:443        ## SSLv2 compatible Hello
```
GASでファイルの新規作成

まだまだ勉強不足ですが、自身のステップアップのためにも投稿！（初）
//---------------------------------------------------------------------------
// ファイル作成
// 引数: スプレッドシート名, フォルダ名
// 戻値: スプレッドシート
// 説明: カレントフォルダにSpreadseetを指定名で作成
//     : 指定フォルダにファイルをコピーする
//     : カレントフォルダのSpreadsheetを削除
//---------------------------------------------------------------------------
function createSpreadsheet(ssName, folderId) {
  var folder = DriveApp.getFolderById(folderId);
  var ss = 0;
  if (folder.getFilesByName(ssName).hasNext()) {    
    Logger.log(ssName+"があります");
  } else {
    Logger.log(ssName+"を作成");
    var ssId = SpreadsheetApp.create(ssName).getId();
    var file = DriveApp.getFileById(ssId);
    folder.addFile(file);
    DriveApp.getRootFolder().removeFile(file);
    var ss = SpreadsheetApp.openById(ssId);
  }
  return ss;
}

１）．指定フォルダに作成したいファイルが存在していないかをチェック
２）．Spreadsheetを指定ファイル名で作成
３）．作成したファイルを指定フォルダに複製
４）．２）で作成したファイルを削除
StrongParameters で配列の中身のパラメータチェック

Rails4 の StrongParameters で配列の中身までのパラメータチェックしたかったのですが、

```ruby
params.permit(:users => [])
```

上記の様に、permit 内で、配列かのチェック方法しか見つけられず、
自分でコンソールを使って色々試した結果を、備忘録として残します。

# やりたいこと
下記のような、JSON リクエストで、StrongParameters の require を使用して、配列の中身のパラメータまでチェックしたい

```json
{
  "users": [
    { "role": "admin", "name": "taro" },
    { "role": "user", "name": "hanako" },
    { "role": "user", "name": "jiro" },
    { "role": "user", "name": "saburo" },
  ]
}
```
# Rails コンソールで実行
コンソールで、パラメータを作成し、チェック

    console » users = {
            »   users: [
            »     { role: 'admin', name: 'taro' },
            »     { role: 'user', name: 'hanako' },
            »     { role: 'user', name: 'jiro' },
            »     { role: 'user', name: 'saburo' },
            »   ]
            » }
    
    console » parameters = ActionController::Parameters.new(users)
    console » parameters.require(:users).map { |u| u.permit(:role, :name) }
    => [
      [0] {
        "role" => "admin",
        "name" => "taro"
      },
      [1] {
        "role" => "user",
        "name" => "hanako"
      },
      [2] {
        "role" => "user",
        "name" => "jiro"
      },
      [3] {
        "role" => "user",
        "name" => "saburo"
      }
    ]

role が必要ない場合は、下記のようにする


    console » parameters.require(:users).map { |u| u.permit(:role) }
    => [
      [0] {
        "role" => "admin"
      },
      [1] {
        "role" => "user"
      },
      [2] {
        "role" => "user"
      },
      [3] {
        "role" => "user"
      }


# Controller での記載
Controller には下記のように記載すれば、各アクションで使用できる

```ruby
private
def users_params
  params.require(:users).map { |u| u.permit(:role, :name) }
end
```

使用方法

```ruby
User.create(users_params)
```
SSL3.0の脆弱性'POODLE'とELBとわたし


# ピンチ！

また脆弱性です。
いろいろ対応方法あるっぽいですが、
https://www.openssl.org/~bodo/ssl-poodle.pdf
ここによればサーバ側も無効にしておけば？みたいなことが書いてありそうなので、
とりあえずサーバサイド対策として、AWSのELBのSSL3.0を無効にしておきたいと思います。

# やり方

ELBの画面から、一台選んで、
Actions -> Edit listeners -> Cipher -> Change
で下の画面が出るので、

![ELBCipher.png](https://qiita-image-store.s3.amazonaws.com/0/49971/e6052721-12e8-b4d3-3450-e5e67c5ed8ec.png "ELBCipher.png")

Custom Security Policyを選んで、
Protocol-SSLv3をはずす。

# いっぱいある人

同様のことをCLIなどで一気にやりましょう。

# 追記１
コメントいただきましたように、AWSの公式アナウンスが出ているようです。
https://aws.amazon.com/jp/security/security-bulletins/CVE-2014-3566-advisory/
特に現状のポリシーにこだわりが無い方は、
"ELBSecurityPolicy-2014-10"
を選ぶのが良いようです。
もちろん既存ポリシーに意味がある方は、SSLv3をはずす方向が良いと思います！