OmniAICreator/Qiita-1.07M huggingface dataset:
VMWare Fusion上でWindowsを使う時のキーの対応表

MacにVMWare Fusionをインストールしてその上でWindows 10を使っているのですが、使い始めは対応するキーを探すのに苦労しました。
いろいろ試した結果をメモしておきます。

|  Windows  | VMWare Fusion |                               備考                              |
|-----------|---------------|-----------------------------------------------------------------|
| 全角/半角 | Option + `    | 「Mac OS ホスト キーボード ショートカットを有効化」がオフの場合 |
| 全角/半角 | 英数          | 「Mac OS ホスト キーボード ショートカットを有効化」がオンの場合 |
| 変換      | かな          | 「Mac OS ホスト キーボード ショートカットを有効化」がオンの場合 |
| Alt       | Option        |                                                                 |
| Windows   | Command       |                                                                 |
| Delete    | Fn + Delete   |                                                                 |
| Home      | Fn + ←        |                                                                 |
| End       | Fn + →        |                                                                 |
| PageUp    | Fn + ↑        |                                                                 |
| PageDown  | Fn + ↓        |                                                                 |
| PrintScr  | 対応なし      |                                                                 |

VMWare Fusionの設定によっては違ってくるかもしれないので、気をつけてください。
技術英語 > それってどういう見た目? > What do they look like?

電話越しにある物を探してと言われてもイメージがわかない。そういう時に使ったりして物の特徴を尋ねる。

A「What do they look like?」
B「It looks like a blue post box in old Japanese style, with white color on the front. It has small red ball on the center of the white....」
A「You mean this Doraemon?」

ドラえもんの特徴を電話越しに簡単に言えるようになりたい。
secureCoding > 整数拡張 (integer promotion) | 整数変換の順位 (integer conversion rank) | 通常の算術型変換 (usual arithmetic conversion)

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> C言語規格は、Cコンパイラがどのように変換を行うべきかを定めている。型変換のルールには、整数拡張 (integer promotion)、整数変換の順位 (integer conversion rank)、通常の算術型変換 (usual arithmetic conversion)が含まれる。これらについてそれぞれ見ていこう。

上記の日本訳語が一般に使われるものかどうかには注意が必要。

「整数拡張」は色々なところで使われているのを見てきた。

「通常の算術型変換」はgoogle検索で488件出てきた。これは多いのかどうかよく分からない。

usual arithmetic conversionはconversionsとs付きのほうが検索結果は多い。sあり/the付き/sなし/については冠詞マスター教本を再度勉強しないと。
secureCoding > プラットフォーム依存の整数型 > Windows API 定義 > __int8 | __int16 | ... | ATOM | ...

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

>たとえばMicrosoft Windows APIは多くの整数型を定義している。__int8, __int16, __int32, __int64, ATOM, BOOLEAN, BOOL, BYTE, CHAR, DWORD, DWORDLONG, DWORD32, DWORD64, WORD, INT, INT32, INT64, LONG, LONGLONG, LONG32, LONG64などである。

[こちら](https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx)に一覧がある。
secureCoding > int_fast#_t, uint_fast#_t > 少なくとも#で指定された幅を持つ最速の整数型

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> プラットフォーム非依存の整数型 C言語は<stdint.h>および<inttypes.h>で整数型を定義しているが、これらのヘッダーでtypedefされる型を使えば、より厳密に幅を指定することができる。これらの整数型は処理系依存であり、次のようなものがある。
...
- int_fast#_t, uint_fast#_t: 少なくとも#で指定された幅を持つ最速の整数型 (たとえばuint_fast16_t)

int_fast16_tなどの型は初めて知った。

<hr>
AVRに関してはint16_tとint_fast16_tについて、fastをつけてもcompilerは特別な最適化はしていないと下記のリンク先にある。他の環境では違いが出るのかもしれない。
[avrfreaks](http://www.avrfreaks.net/forum/intfast16t)

追加情報
> The original intent behind the fast integer types was for use in various architectures which incur a serious performance penalty if they actually store integers in memory with fewer bits than one of their "native" integer sizes. Basically, the variable would be stored with at least as many bits as you specified, but possibly with more bits if it would result in better performance.
OGC 07−057r7 WMTS 1.0.0 拾い読み

# Scope について
## 記載事項
p. viii Preface には次のように書いてある。

```text
A WMTS enabled server application can serve map tiles of spatially referenced data using tile images with predefined context, extent, and resolution.
```

tile images with predefined context とある。つまりコンテキスト独立なレンダリング前のベクトルデータは範囲外になってしまう。

p. 1 Scope には次のように書いてある（下線筆者）。

```text
This OGC document is applicable to servers and clients that can serve and consume _rendered_ tile maps.
```

つまり、標高タイルやベクトルタイルのように _rendered_ ではないタイルについても統合的に扱おうとする場合、OGC WMTS のスコープの外になってしまうのである。

ちなみに、Scope 文は次のように進む。

```text
It can be combined with other OGC standards and also integrated with the emerging RESTful applications and "mash-ups".
```

やや、流行り言葉に流されすぎてしまっている感がなくもない。WMTS ふが普及するとすれば、RESTful とか mash-up が熱いタームである時期であるべきであったようにも感じる。

「アーキテクチャスタイルをまたいでも利用できる規格」というものを狙っていらっしゃるように見えるが、アーキテクチャスタイルも決められない規格に、どんな意味があるだろう。その意味は限定的であろう。

# 提出機関について
- Autonomous University of Barcelona
- CREAF
- CubeWerx Inc.

# OSGeo TMS との関係について
p. xi foreword に次のとおり明記されている。

```text
WMTS is inspired by the OSGeo Tile Map Service Specification
```

# ボトムライン
「標高タイルやベクトルタイルのように rendered ではないタイルについても統合的に扱おうとする場合、OGC WMTS のスコープの外になってしまう」といったことを考えている。よって、WMTS は互換性確保のためのサブ施策にはなり得ても、標準化を意識したメイン施策にはなり得ない。現在の時点においては、スコープが問題解決として適切ではないためだ。

# フレーズ化
かつて私は「WMSは小規模な地図配信と地図画像生成に限って有効である」と言った。今は「WMTSは地図画像配信のことしか考えていない。」と言うことにしよう。
UICollisionBehaviorでサイズ勝手に変更される問題

**ここで紹介している問題はバグではなく、UICollisionBehaviorの仕様です。**

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UICollisionBehavior_Class/index.html より

```
IMPORTANT

When setting the initial position for a dynamic item, you must ensure that its bounds do not intersect any collision boundaries. The animation behavior for such a misplaced item is undefined.
```

要するに考えずに重ねて初期配置すると変なことになるよ。
ということです。

##再現コード

```objc:ViewController.m
@interface ViewController (){
    UIDynamicAnimator *animator;
    UICollisionBehavior *collisionBehavior;
    NSMutableArray*vs;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    vs = [NSMutableArray array];
    animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
    collisionBehavior = [UICollisionBehavior new];
    collisionBehavior.translatesReferenceBoundsIntoBoundary  = true;
    [animator addBehavior:collisionBehavior];
    
    UITapGestureRecognizer*t = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
    [self.view addGestureRecognizer:t];
}

- (void)tap{
    UIView*v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    v.backgroundColor = [UIColor redColor];
    [self.view addSubview:v];
    [vs addObject:v];
    for (id o in collisionBehavior.items) {
        [collisionBehavior removeItem:o];
    }
    int index = 0;
    for (UIView*view in vs) {
        view.frame = CGRectMake(0,100*index, 100,100);
        [collisionBehavior addItem:view];
        if (view.bounds.size.height!=view.bounds.size.width) {
            view.backgroundColor = [UIColor blueColor];
            NSLog(@"size w=%f : h=%f",view.bounds.size.width,view.bounds.size.height);
        }
        index++;
    }
}

@end

```

タップするたびに100*100の四角を画面左端に並べていくコードです。
ただし、translatesReferenceBoundsIntoBoundaryが設定してあるので画面をはみ出すと初期位置が画面右下のビューと被った状態でコリジョンビヘイビアに登録されます。
上記のコードでは縦横100*100が崩れると青くなるように書かれています。

![iOS Simulator Screen Shot May 8, 27 Heisei, 3.34.18 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/c8b90d93-4ea4-54fb-7879-afac118001c3.png)

↓

![iOS Simulator Screen Shot May 8, 27 Heisei, 3.34.20 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/1ffae2ed-99a4-6731-c044-8ae914c6c76e.png)

↓

![iOS Simulator Screen Shot May 8, 27 Heisei, 3.34.21 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/7693cbe9-3674-4b3f-5631-524c0aa3eda7.png)

再現出来ました。

frameのsizeを弄っていないのにビューのサイズが変わってしまったのを確認出来たかと思います。

なかなかエグい仕様なので、ごちゃごちゃするUIを作る場合には注意です。
OpsWorksの予期せぬ挙動に備える

```
この記事の問題はopsworks-agentが自動でアップデートされてしまうというのが原因で引き起こされていましたが、現在（2015/07/06）は手動で利用するバージョンを指定してアップデート出来るようになったのでこの記事の問題が置き無さそうです！！ヨカッタですね！！

http://blogs.aws.amazon.com/application-management/post/TxLZ972TREEZ4A/Manage-agent-updates-on-AWS-OpsWorks-managed-instances
```

OpsWorksを利用していて意図せず本番環境のRubyのバージョンが上がってエラーが出るという障害に遭遇してしまったので詳細を共有します。

**TL;DR**

OpsWorksは、こちらが意図しないタイミングでサーバー内に保存されているCustom Cookbooksを最新に更新してくるので、Stackに設定するCustom Cookbooksは常に本番反映されても良いものだけを指定しておくと良い。

## opsworks-agent

OpsWorksで管理するEC2インスタンス上にはopsworks-agentが動いているが、たまにこいつがAWS側によって自動で更新される。更新されると、opsworks-agent自身がアップデートされるだけでなく、EC2インスタンス内にキャッシュされているcustom cookbookも最新に更新されてしまう。これが今回遭遇した障害のトリガーとなった。

updateのログは/var/log/aws/opsworks/以下に残っているので生のログが観たい人はこちらをどうぞ。↓ StackのInstancesから個別のインスタンスごとのログを見ると、update_agentコマンドが走っていることがわかる。

![スクリーンショット 2015-05-08 1.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/1743/ac567a8a-1461-6d09-ad39-ae3e256d08b3.png)

## 意図せず障害がおきるシナリオ

### 前提

* Railsアプリの本番環境Stackと開発環境Stackをそれぞれ別々にOpsWorksで構築している
* それぞれ同じCustom Cookbooksを利用していて、どちらもmasterブランチを使用している
* RailsアプリはCustom Layerで実現していて([こちらを参照](http://qiita.com/ainame/items/3672b8fb160d15cd759f))、RubyのバージョンはCustom Cookboosk内のROOT/ruby/attributes/customize.rbの中でベタ書きで指定していた
  * configureライフサイクルには、rails::configureが指定されている
* **Custom Cookbooksは、自分でOpsWorksのUpdate Custom Cookbooksコマンドを実行しないと更新されないものだと思っていた**

### 障害発生までのシナリオ

以下の様な順で実際に障害が発生した

1. 開発環境Stack向けにRuby2.2をインストールして検証するためCustom Cookbooksのruby/attributes/customize.rbに`normal[:opsworks][:ruby_version] = '2.2' `と書いた差分(その他実際にはbundler,rubygemsのバージョンも上げてる)をmasterにマージして開発環境Stack上で反映した
2. 本番環境Stackへの反映は、開発環境Stackで検証が終わってから暇な時にでも、と思ってそのままGWの休みに突入した
3. GWが明けて突然update_agentが実行された
4. なんかの拍子（オートスケールなどでEC2インスタンスが立ち上がるなど）にconfigureライフサイクルイベントが各本番のEC2インスタンス上で発火
5. 2.2を指定したcustomize.rbのせいでRubyのバージョンがアップデートされ、2.1のコードが消える
  * アップデートされてしまった理由は後ほど
6. Ruby2.1の時に起動されたunicornが標準ライブラリのrexml/documentが消えたせいでLoadErrorエラーを発し始める **!!!障害発生!!!**

### なぜ勝手にRubyがアップデートされた？

結論から言うとrails::configureレシピが間接的にRubyのバージョンを上げる処理を呼んでいた。

1. update_agentが実行された時に開発環境Stack向けに作って本番環境Stackへの反映をしていなかったcookbooksが本番環境Stackに続々と配置された
2. configureライフサイクルイベントのタイミングでrails::configureレシピが実行された
3. rails::configure -> deploy::default -> dependencies::default -> ruby::default という順でinclude_recipeが連鎖し、ruby::default内でバージョンチェックが行われた結果、現在インストールされているRubyのバージョンが、chefのnodeオブジェクトで指定されているバージョンより古いため更新処理が走った

rails::configureという名前からは想像もつかない処理だぜ！！！！！！！！

## まとめ

今回の学びとしてはOpsWorksは以下の様な挙動があるので、OpsWorksを利用している人たちは以下の点を気をつけるべき。

* OpsWorksはこちらが意図しないタイミングでcustom cookbooksの更新を行ってくることがある
* OpsWorksのconfigureライフサイクルイベントはこちらが意図しない時にも頻繁に起きうる
* RailsLayer標準のrails::configureはRubyのバージョン更新までも孕んだ割りと壮大なレシピ
 
自分たちの失敗としては、本番環境Stackと開発環境Stackで同じブランチを向いたCustom Cookbooksを利用していた点で、再発防止策としては本番環境Stackで利用するCustom Cookbooksの向き先をmaster以外の本番環境用ブランチに設定し、開発環境は元のままmasterを向いた状態にしたい。
Play Framework 2.xでリクエストのURLがHTTPかHTTPSかを判別する

PlayFramework1ではreruestクラスにis_secureみたいな判別できるメソッドがあったのだが2.x系では削除されている・・・・。
それどころか、urlメソッドも削除されており簡単に判別ができなくなっていた。。

routesのabsoluteURLメソッドでURL絶対パスを取得できるのでそれを使うようになったらしい。

記法は特殊でJavaでコントローラー内で実装する場合は

``routes.アプリケーションクラス名.対象のメソッド(引数[]).absoluteURL(request());``


となる。

```java:Application.java
    public static Result pixcelTracking() {
        String absolutePath = routes.Application.pixcelTracking().absoluteURL(request());
        Logger.debug("absolutePath = " + absolutePath);

        if(absolutePath.startsWith("https")) {
            Logger.debug("Protocol HTTPS");
        } else if (absolutePath.startsWith("http")) {
            Logger.debug("Protocol HTTP");
        }


        return ok("");
    }

```
JavaScript の this をペロる

※ ここで示すいくつかの例は "use strict"; を想定していません！
 

# this の実体は 変数

this の実体は「何かしらのオブジェクトを参照」している「読み込み専用」の「変数」だよ。読み込み専用なので代入できないよ

```js
this = 5;

// ReferenceError: Invalid left-hand side in assignment
```

# どのオブジェクトを参照しているか

「何かしらのオブジェクト」ということは、とりあえず、typeof で "object" になるものを参照するっていう認識でおｋ

そして、何のオブジェクトを参照しているかはコンテキストに応じて変化するよ。参照には一定の規則があって、関数外（トップレベル）か関数内（ローカル）かで大きく変わるよ。
 


## 関数外であるグローバルな空間での this

Webブラウザでの実行を想定した場合、this はグローバルな空間で Window オブジェクトを参照

```js
console.log(this);

// Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
```

# 関数内では 関数の呼び出し方法 で参照先オブジェクトが変わる

関数の呼び出し方法で変わるっていうことは、実行時に this がセットされていくということで、4種類の呼び出しパターンがある。

## 関数内での this

前提：オブジェクトのプロパティである function はメソッド、そうでない場合は関数として呼び分けるよ（グローバルな空間に定義した関数は実は window オブジェクトのプロパティの1つだったりもするけど）

```js
// メソッドを持つオブジェクト
var myObj = {
  value: "Hello World",
  greet: function(){
    console.log(this.value);
  }
};
myObj.greet();

// Hello World
```

```js

// 関数
var hoge = function()
{
  console.log("hoge");
}
window.hoge(); // window は省略可能

// hoge
```

関数内での this は グローバルオブジェクト がセットされるよ。ブラウザを想定すると Window オブジェクト。

```js

(function(){
  console.log(this);
}());

// Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
```

## メソッド内での this

メソッド内では、そのオブジェクトがセットされるよ。この例でいうと myObj

```js
// メソッドを持つオブジェクト
var myObj = {
  myObjFunc: function(){
    console.log(this);
  }
};
myObj.myObjFunc();

// Object {myObjFunc: function}
```


## コンストラクタ内での this

コンストラクタ内での this は new によって生成したオブジェクトを参照するよ。この例でいうと myHoge オブジェクト

```js
var Hoge = function(huga)
{
  this.huga = huga;
}
var myHoge = new Hoge("chrowa3");
console.log(myHoge);
```

## apply( ) や call( ) で 好きなオブジェクトへの参照をセット


call( ) や apply ( ) は 他のオブジェクトが持つメソッドをさぞ自分のメソッドかのように呼び出すメソッドだよ

この例では、Hoge( ) を new することで生成された myHoge オブジェクトを this としてセットしている。

```js
var Hoge = function(){};
Hoge.prototype.hogeFunc = function(){return this;};

var Huga = function(){};
Huga.prototype.hugaFunc = function(){return this;};

var myHoge = new Hoge();
Huga.prototype.hugaFunc.call(myHoge);

// Hoge {hogeFunc: function}
```

myHoge オブジェクトで Huga の hugaFunc() を call() しているよ。

hugaFunc() の処理は this を return で返しているだけなんだけど、this が myHoge でセットされているので 結果的に Hoge オブジェクトが返ってきている。


# (番外編) イベントハンドラ（メソッド）内での this

まず HTML ね

```html

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>this!</title>
	<script src="this.js"></script>
</head>
<body>
	<p><a id="lnk" href="#">click</a></p>
</body>
</html>
```

続いて js

```js

window.onload = function()
{
	var printThis = function()
	{
		console.log(this);
	};
	document.getElementById("lnk").onclick = printThis;
};

// <a id="lnk" href="#">click</a>
```

イベントハンドラ（メソッド）内での this は イベントが発生した元の要素を参照するよ


以上、this のざっペロでした
取得兩個 NSArray 的 Diff

前幾天被問到如何取得兩個 array 的差集合，

舉例來說，有 array A, B 各為下

    a = [1, 3, 4]
    b = [2, 3, 4]

就會取得一個 diff array

    diff = [1, 2]


在 `NSArray` 也沒有直接就可以取得差集的 API ，只有 `NSMutableArray` 的 [`removeObjectsInArray`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/index.html#//apple_ref/occ/instm/NSMutableArray/removeObjectsInArray:) ，但是這又只能對一個 array 移除和另外一個 array 有重複的物件。

這時候的解法就會是

1. 先取得各自的差集
2. 再把差集合併起來

```objc
NSArray *numbersA = @[@1, @3, @4];
NSArray *numbersB = @[@2, @3, @4];

NSMutableArray *diff = [NSMutableArray array];
NSMutableArray *diffA = [numbersA mutableCopy];
[diffA removeObjectsInArray:numbersB];
NSMutableArray *diffB = [numbersB mutableCopy];
[diffB removeObjectsInArray:numbersA];

[diff addObjectsFromArray:diffA];
[diff addObjectsFromArray:diffB];
```

這時候的 `diff` 就會是兩者個別差集後合併起來的陣列

# 用 NSMutableSet 做集合運算

接著找了找，找到一篇[文章](http://qiita.com/ar_tama/items/b69d6ab5c505be89c414)，用 NSMutableSet 的 intersect 和 minus 兩個 methods 可以來做交集合和集合相減。

# 運算邏輯

於是這個運算會分成三個步驟

1. 將兩個 arrays 合併成一個 NSMutableSet
2. 找出兩個 arrays 中有重複的元素
3. 將合併的 set 移除重複的元素
4. 轉換回 NSArray

# 解法

一樣先創建兩個 arrays

```objc
NSArray *numbersA = @[@1, @3, @4];
NSArray *numbersB = @[@2, @3, @4];
```

接著把邏輯實作出來：

```objc
// 合併兩個 arrays
NSMutableSet *numbersSet = [NSMutableSet setWithArray:numbersA];
[numbersSet addObjectsFromArray:numbersB];

// 找出兩者皆有的元素
NSMutableSet *duplicatedSet = [NSMutableSet setWithArray:numbersA];
[duplicatedSet intersectSet:[NSSet setWithArray:numbersB]];

// 減掉重複的元素
[numbersSet minusSet:duplicatedSet];

// 轉換回 array
NSArray *diff = [numbersSet allObjects];
```

# 排序

`NSSet` 本身並沒有將元素排序，將 array 轉換成 set 之後，原本的順序就會亂掉。
因此，上一節所得的結果，可能會是 [1,2] ，也有可能是 [2,1] 。

如果想要排序，就可以改用 `NSMutableOrderedSet` 和相關的 methods ：

```objc
NSMutableOrderedSet *numbersSet = [NSMutableOrderedSet orderedSetWithArray:numbersA];
[numbersSet addObjectsFromArray:numbersB];

NSMutableOrderedSet *duplicatedSet = [NSMutableOrderedSet orderedSetWithArray:numbersA];
[duplicatedSet intersectOrderedSet:[NSOrderedSet orderedSetWithArray:numbersB]];

[numbersSet minusOrderedSet:duplicatedSet];
```

# 感想

現在雖然知道解法，不過還不太清楚，單純使用 array 運算和使用 NSSet 做集合運算的優缺點在哪裡。
目前看 NSSet 的方式雖然要先轉換型態，但是覺得這個邏輯寫起來還比前者漂亮、容易理解。

【更新】
單純使用 array 的方法沒有繞一圈跑去用 NSSet 處理後再轉回來成 array ，看起來也比較直接，說不定我會比較喜歡這個 :flushed:
USIのgo ponderの落とし穴

# 要点

- USIのponderを使う場合、goコマンド受信時点ではなく、**stop受信時点で時間の計測を開始**しないと、自分が使った時間を正確に測れない。

# 解説

USIエンジンは、一般的な実装ではgoコマンド受信後bestmove送信前までの時間を自分の使った時間とみなしている(と思われる)が、**USIのponderを使用していて、ponderhitしなかった場合**に限り、その実装では正しく時間を測定できていない。

理由は図にすると一目瞭然。

![USI.png](https://qiita-image-store.s3.amazonaws.com/0/24930/9ff4fd6a-ecba-3d6b-f970-c88e4a1a3c04.png)

CSAサーバから見て、(7)～(8)ではなく、(4)～(8)が自分の使った時間になるため。

## どういう時に問題になるのか？

特に問題になりやすいのは、相手が瞬時に指し手を返してきた場合。((1)～(4)が極端に短い場合)

一般的に、go ponderしてすぐstopを受け取っても、すぐにはbestmoveが返せない実装が多いはず。
(初期化に時間が掛かる・最初のiterationが回るまで指し手が確定してないので止まれない・探索中にあまり頻繁に停止チェックをしていない・ネットワークが絡むなどなど)

すると、(4)～(7)が無視できない時間になり、「CSAサーバとの通信遅延がほとんど無いはずの状態で、秒読み - 0.5秒くらいしか考えていないつもりなのに時間切れする」などといった現象が発生しうる。

# まとめ(私見)

- 安易にgo受信時点から時間を計測しては問題があるかもしれない。
- しかしそもそもそんなことを考慮しなきゃいけないプロトコルが欠陥品。
- このプロトコルはUCIの頃からの伝統のはずなので、USIを作った人とかGUIを作ってる人とかは別に悪くないけど、やっぱりそもそもponderはGUIがやることではない。
PHP7調査(29)Closure::call()の新設

無名関数に対応する`Closure`クラスに`call()`メソッドが増えました。これはJavaScriptの`Function.prototype.call`に対応するようなメソッドで、次のように使えます。

```php
<?php
class Foo { private $bar = 'baz'; }
(function () { var_dump($this->bar); })->call(new Foo()); // string(3) "baz"
```

なんと、クラス外の関数をあたかもインスタンスメソッドのように呼び出すことができています。

といっても、これはPHP 5.4で導入された`Closure::bindTo()`でも実現できることです。


```php
<?php
class Foo { private $bar = 'baz'; }
(function () { var_dump($this->bar); })->bindTo(new Foo(), 'Foo')(); // string(3) "baz"
```

とはいえ`Closure::call()`の方が断然読みやすいので良いと思います。

# 参照

* [PHP RFC: Closure::call](https://wiki.php.net/rfc/closure_apply)
Realmを使ってToDoアプリを作った

Realmの基礎の発表をする機会がありましたので、勉強も兼ねて何番煎じかわかりませんが、ToDoアプリを作ってみました。といっても、[Tutorial: Building a To-Do App with Realm](https://realm.io/news/tutorial-building-a-todo-app-with-realm/) をほとんど参考にして作り、RealmをCocoaPodsで導入したぐらいしか違いがありませんがｗ

コードは[RealmTodo](https://github.com/nakazy/RealmTodo)にありますので、参考にしてください。以下、コードの抜粋をしてRealmの使い方の解説をします。

##ToDoItemモデルクラスの作成

```ToDoItem.swift
class ToDoItem: RLMObject {
    dynamic var name = ""
    dynamic var finished = false
}
```
RLMObjectを継承したクラスを作り、カラムは「dynamic var 変数名 = 初期値」で定義をします。

##ToDoItemモデルのオブジェクトを取得
todosは未完了のタスクで、finishedは完了済みのタスクです。
NSPredicateで条件を定義し、条件にマッチするオブジェクトがtodos, finishedに格納されています。型はRLMResultsでデータベースが更新されたら自動的に最新に反映されるので便利です。

```ViewController.swift
    var todos: RLMResults {
        get {
            let predicate = NSPredicate(format: "finished == false", argumentArray: nil)
            return ToDoItem.objectsWithPredicate(predicate)
        }
    }
    
    var finished: RLMResults {
        get {
            let predicate = NSPredicate(format: "finished == true", argumentArray: nil)
            return ToDoItem.objectsWithPredicate(predicate)
        }
    }
    
```

##オブジェクトの新規追加
トランザクション内で新規追加処理を行います。typedTextはtextFieldの入力値です。TodoItem()でモデルをインスタンス化し、nameカラムに値を入れ、保存をするという流れです。最後にtableViewを更新することで、追加したオブジェクトが反映されます。

```ViewController.swift
   func didFinishTypingText(typedText: String?) {
       if typedText != "" {
          let newTodoItem = ToDoItem()
          newTodoItem.name = typedText!
            
          let realm = RLMRealm.defaultRealm()
          realm.transactionWithBlock() {
              realm.addObject(newTodoItem)
          }   
          // テーブルの更新処理
          tableView.reloadData()
       }
   }
```

##参考サイト
基礎的なことは下記のサイトに載っていますのでこちらを参考にしてください。というか、まとめ完全版のやつを見ればほとんど大丈夫です。公式ドキュメントもわかりやすいです。

- [Realm for Swift まとめ完全版](http://qiita.com/okitsutakatomo/items/9134c5fa8bd4384a2acf)

- [Tutorial: Building a To-Do App with Realm](https://realm.io/news/tutorial-building-a-todo-app-with-realm/)

- [公式](https://realm.io/)
Handoffを利用してSafariでウェブページを開く

はじめに
-------------

Hnadoffとは、iOS 8を搭載したデバイスとOS X YosemiteをインストールしたMacが近くにあれば、一方のデバイスで作業した内容をもう一方のデバイスに引き継ぐ機能です。
例えば、iPhoneで書き始めたメールの続きをMacで書き上げることができます。

[Apple - iOS 8 - 連携](https://www.apple.com/jp/ios/whats-new/continuity/)

この機能を自分のアプリに組み込むことができます。

HandoffにはアプリからSafari、アプリからアプリ、Safariからアプリの3種類があります。
今回は一番簡単なHandoffを利用してアプリからSafariでウェブページを開いてみます。

Handoffに対応したiOSデバイスとMacが必要です。
iOSデバイスとMacで同じApple IDを使ってサインします。
iOSデバイスとMacのWi-FiとBluetoothをオンにします。


iPhoneから
------------

iOSアプリにHandoffを実装してみます。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    var activity:NSUserActivity = NSUserActivity(activityType: "com.example")
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.activity.webpageURL = NSURL(string: "http://www.google.com/")
        self.activity.title = "Google"
        self.activity.becomeCurrent()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

```

実行するとOS XのDockにiPhoneマークがついたSafariが表示されます。
クリックするとSafariが起動してウェブページ（今回は http://www.google.com/ ）が開きます。

![Handoff1](https://qiita-image-store.s3.amazonaws.com/0/3862/b34cd9fb-b2bd-01cc-4e25-625ad9a1567e.jpeg)


Apple Watchから
----------------

次にApple Watchのアプリに実装してみます。

```swift:InterfaceController.swift
import WatchKit
import Foundation


class InterfaceController: WKInterfaceController {

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)

        
    }

    override func willActivate() {
        super.willActivate()
        
        self.updateUserActivity("com.example", userInfo: nil, webpageURL: NSURL(string: "http://www.google.com/"))
    }

    override func didDeactivate() {
        super.didDeactivate()
    }

}
```

`NSUserActivity`ではなく`func updateUserActivity(_ type: String, userInfo userInfo: [NSObject : AnyObject]?, webpageURL webpageURL: NSURL?)` を利用します。

Apple Watch（実機）で実行します。iPhoneのロック画面の左下にSafariのアイコンが表示されます。
Safariのアイコンを上にスワイプするとSafariが起動してウェブページが開きます。

![Handoff2](https://qiita-image-store.s3.amazonaws.com/0/3862/18165302-e6ee-86c0-6779-2852b5fe8e82.jpeg)

このとき、OS XのDockにはApple WatchマークがついたSafariが表示されます。

![Handoff3](https://qiita-image-store.s3.amazonaws.com/0/3862/433218b1-3a59-6ac5-e35c-75aa388e59fb.jpeg)
Visual Studio Code使ってみた＠mac

#使ってみました
https://code.visualstudio.com/
2015年5月7日現在

#自分の使用言語とか
NodeJSをちょくちょく勉強してます。
趣味でHaskell
作業効率化でPython


#比較
普段（と言ってもここ二ヶ月ぐらい)はAtom使ってたので、それとの比較です。

##早い
Atomが遅いのでコレは助かります。
書きたいなと思った時から開くまでの時間でストレスをあまり感じないぐらいに。

##日本語入力で少しアレなところがある
ひらがな打って、スペースキーで変換するじゃないですか、
そのあと、エンター（リターン）キーで確定せずに次の文字を打ち始めると、エンター（リターン）キーで打った文字がなかったことにされます。少し使いにくい。

##NodeJS以外はどうよ
ただ色ついてるだけですね。
ぶっちゃけある程度カスタマイズしたvimの方が使い勝手いいです。

##プラグインとか
プレビュー版なので仕方ないですけど、色々痒いところに手が届かない。あそこがもう少しあーして欲しーなーとかが。本家VSはあまり使ったことないのでアレですけどMSってプラグインとか自社オリジナル以外のものもどんどん入れれるようにしてくれるメーカーでしたっけ？そうしないと、sublimeとかatomとかとユーザー層がもろかぶりなので、生き残れる気がしなく……。

#結局どうよ
プログラミングのエディタとしては最低限は満たし、かつNodeJS用のデバッガがあるので、普段NodeJS書く人で、sublimeはお金ないし買ってね♡メッセージ邪魔だし嫌だ！！Atomは遅いから嫌だ！！って人ならわりかしありだと思います。
それ以外の人には薦めにくいのが主観です。
以上ですー
[デザインパターン学習] Template Methodパターン

# はじめに
『Rubyによるデザインパターン』という本を買った。
読みながらメモメモ。

# 変わらないものと変わるものが混ざりに混ざって

もし以下の様なクラスがあったとする。
HTMLでレポートを出力してくれるプログラム。

```rb
class Report
	def initialize
		@title = '月次報告'
		@text = ['順調', '最高の調子']
	end

	def output_report
		puts('<html>')
		puts('<head>')
		puts("<title>#{ @title }</title>")
		puts('</head>')
		puts('<body>')
		@text.each do |line|
			puts("<p>#{ line }</p>")
		end
		puts('</body>')
		puts('</html>')
	end
end

report = Report.new
report.output_report
```

ある日、フォーマットによって出力されるものを変えたいとなった時、
以下のようにフォーマットが`html`と`plain`の2つに増えただけで分かりにくいプログラムとなる。
もっと他のフォーマットも追加したいなとなった時に更に複雑化する。
間違って正しく動く部分までおかしくしてしまいかねない。

```rb
class Report
	def initialize
		@title = '月次報告'
		@text = ['順調', '最高の調子']
	end

	def output_report(format)
		if format == :plain
			puts("*** #{ @title } ***")
		elsif format == :html
			puts('<html>')
			puts('<head>')
			puts("<title>#{ @title }</title>")
			puts('</head>')
			puts('<body>')
		else
			raise "Unknown format #{ format }"
		end
		@text.each do |line|
			if format == :plain
				puts(line)
			else
				puts("<p>#{ line }</p>")
			end
		end
		if format == :html
			puts('</body>')
			puts('</html>')
		end
	end
end

plain = Report.new
plain.output_report(:plain)

html = Report.new
html.output_report(:html)
```

# 変わらないものと変わるものを分離

**Template Method**パターンは、抽象基底クラスを定義し、テンプレートとなるメソッドを持たせ、基本的な処理の流れを定義する。そして詳細な処理についてはサブクラスに持たせるという方式。

スーパークラスである`Report`は処理の流れを持っている。
時にはオーバーライドされない時用の標準実装を持つこともある。

```rb
class Report
	def initialize
		@title = '月次報告'
		@text = ['順調', '最高の調子']
	end

	def output_report
		output_start
		output_head
		output_body_start
		output_body
		output_body_end
		output_end
	end

	def output_body
		@text.each do |line|
			output_line(line)
		end
	end

	def output_start
	end

	def output_head
	end

	def output_body_start
	end

	def output_line(line)
	end

	def output_body_end
	end

	def output_end
	end
end
```

サブクラスでスーパークラスの各メソッドをオーバーライドして、具体的な処理を書く。

```rb
class HTMLReport < Report
	def output_start
		puts('<html>')
	end

	def output_head
		puts('<head>')
		puts("<title>#{ @title }</title>")
		puts('</head>')
	end

	def output_body_start
		puts('<body>')
	end

	def output_line(line)
		puts("<p>#{ line }</p>")
	end

	def output_body_end
		puts('</body>')
	end

	def output_end
		puts('</html>')
	end
end
```

```rb
class PlainTextReport < Report
	def output_head
		puts("*** #{ @title } ***")
		puts
	end

	def output_line(line)
		puts(line)
	end
end
```

```rb
html = HTMLReport.new
html.output_report

plain = PlainTextReport.new
plain.output_report
```

Template Methodの具象クラスによってオーバーライドできる非抽象メソッドを**フックメソッド**と呼ぶ。

フックメソッドの使用によって、以下を選択することができる。

1. 基底クラスの実装をオーバーライドして別の処理を実行
2. 基底クラスの標準実装をそのまま使う

# 最後に
ひな形をスーパークラスが持っていて、サブクラスでそのひな形を使ったものを作る。
一番最初の一番わかり易いパターンなのだろなと思った。
頭がこんがらがることもなく読み進められた。
本は中古で割りと高かったけどとても役に立ちそうな本だと思った。
デザインパターンはいくつかパラっと見たことはあるものの、よくは知らないのでしっかり勉強しようと思う。

# 参考

* Rubyによるデザインパターン
* Java言語で学ぶデザインパターン入門
doCheckXxxx と doFillXxxxItems

# Jenkins 使ってますか？
便利ですよねー。私が始めて触ったのは前のプロジェクトで、その頃はまだ Hudson おじさんでした。
今ではJenkins を使っていなかったら、そのプロジェクトは大丈夫かしら？と心配になります。


# Jenkinsプラグイン作ってますか？
このJenkinsの良いところとして、さまざまなプラグインがあり、それらを組み合わせて使う事で、より Jenkins は賢くなり、Jenkins で出来る事が増えます。
そして、Jenkins が Java で実装されているということで、そのプラグインも Java で(簡単に)作る事が出来ます。

とゆーことで、Jenkins プラグインを作成する際に、私が得た(躓いた)知識を幾つかに分けて紹介します。
(もし間違っていましたら、ご指摘頂けると助かります)


# doCheckXxxx と doFillXxxxItems について
Jenkins プラグインでは、設定画面などの入力項目に対して、特定の命名規則に沿ったメソッドを用意してあげると、Jenkins がそのメソッドを勝手に呼び出してくれるものがあります。
それが doCheckXxxx と doFillXxxxItems です（他にもあるのかしら(・3・)？）。
それぞれ具体的に見ていきます。


# doCheckXxxx
Jenkins のプラグインを作成する中で、設定画面等に独自の入力項目を用意したくなる場合があります。

テキストボックス
プルダウン
チェックボックス
etc...

これらの中でテキストボックスに対して入力チェックを行いたい場合、その対象のテキストボックスのプロパティ名に対応するチェックメソッドを用意してあげると、そのテキストボックスに対する入力があった場合に、用意したチェックメソッドを Jenkins が呼び出してくれます。

こんな感じ。

## jelly のサンプル
```jsp:src/main/resources/com/sample/jenkins/plugin/SampleBuilder/config.jelly
<f:entry title="Free word" field="word">
  <f:textbox />
</f:entry>
```

## Java のサンプル
```java:src/main/java/com/sample/jenkins/plugin/SampleBuilder$DescriptorImpl
public FormValidation doCheckWord(@QueryParameter String value) {
    if (value.length() == 0) {
        return FormValidation.error("条件は必須です。");
    }
    return FormValidation.ok();
}
```

大事なのは、<f:entry> で指定した field 属性と同じ名前（キャメルケース）で、チェックメソッドを用意するということ。
今回の例でいえば、<f:entry> の field 属性は「word」なので、チェックメソッドは、「doCheckWord」となります。

もっと詳しい解説はこちらのサイトとかを見てみて下さい（丸投げ）より詳しく解説されてます(￣▽￣)。


# doFillXxxxItems
同じく入力項目としてプルダウンを用意して、今度はその選択候補を設定してくれるのがこのメソッド（命名規則）。

こんな感じ。

## jelly のサンプル
```jsp
<f:entry title="Pulldown" field="person">
  <f:select />
</f:entry>
```

## Java のサンプル
```java
public ListBoxModel doFillPersonItems() {
    ListBoxModel items = new ListBoxModel();
    for (Person person : persons) {
        items.add(person.getName(), person.getId());
    }
    return items;
}
```

これも大事なのは、<f:entry> で指定した field 属性と同じ名前（キャメルケース）で、チェックメソッドを定義するということ。
今回の例でいえば、<f:entry> の field 属性は「person」なので、チェックメソッドは、「doFillPersonItems」となります。

Java で何かしら処理した値を出したいような場合には、これを使えば良いと思います。

逆に、「はい」「いいえ」みたいなものをプルダウンにしたいのなら、別にこの方法でなくても良いと思います。jelly ファイルにベタに書いたのでも個人的には問題無いんちゃうかな～（そもそも「はい」「いいえ」はプルダウンじゃなくて、ラジオとかチェックボックスだろ、という声が聞こえてきますが～(･ω･｀)）。
（備忘録）Raspberry Pi への PHPExcel のインストール


# 始めに
phpexcel と Raspberry で検索したのですが全然情報がなかったので、未来（いろいろと忘れている）の私への備忘録として、またどなたか同じように検索される方の便宜ために僭越ながらメモを残させていただきます

# Nginx と php のインストール
[official blog](https://www.raspberrypi.org/documentation/remote-access/web-server/nginx.md)

# PHPExcdl のインストール
[ここから](http://phpexcel.codeplex.com/releases/view/119187) RECOMMENDED DOWNLOADD を download し、フォルダ Classes を /usr/share/nginx/www にコピー
ファイルの読み取り権限と実行権限を付与
詳細は install.txt 参照

# テスト
ダウンロードした phpexcel のフォルダ Examples を /usr/share/nginx/www にコピーし、http://RPiのアドレス/Examples/01simple.php

テスト結果として excel ファイルをつくるので Examples に書き込み権限必要

# 感想
情報が全然なかった理由は必要なかったから、というか Raspberry Pi だからといって特別なことは実はなにもないからだったのかもしれません...
Burp ProxyでiOSのhttps通信を横取りする

[[改訂版] iPhoneアプリのSSL接続をパケットキャプチャする方法 | [ bROOM.LOG ! ]](http://blog.rocaz.net/2011/02/1167.html)とか[Burp Proxy で iPhone の通信をパケットキャプチャ - Please Sleep](http://please-sleep.cou929.nu/capture-packet-of-iphone-app-with-burp-proxy.html)とかさんざん記事は出回っているのだけれど，もうちょっと簡単にやる方法があるのでシェアーさせて頂きます．

といっても [Burp Proxy Help - Installing Burp's CA Certificate](http://portswigger.net/burp/help/proxy_options_installingCAcert.html) のiPhoneの項目に書いてあるやつに画像を付けてだらだらやっているだけなので時間が無い人はこちらをどうぞ

Burp Proxyを立ち上げる
---

Burpっていうのは便利な奴で，ここからダウンロード出来る．
http://portswigger.net/burp/


プロキシの設定をかえる
---
デフォルトではローカルからのリクエストだけを受け付けているので，プロキシサーバとして振る舞って頂けるように設定を致します．具体的にはProxyタブのOptionsを開き
![Screen Shot 2015-05-07 at 22.01.30.png](https://qiita-image-store.s3.amazonaws.com/0/30016/66074237-b88f-caf5-ef2d-739e43fc5a9b.png)

Addボタンからそれっぽいやつを追加致しまして
![Screen Shot 2015-05-07 at 21.49.37.png](https://qiita-image-store.s3.amazonaws.com/0/30016/ec9531a2-e03e-e116-97d9-6c5678c040ab.png)

どーんという具合です．
![Screen Shot 2015-05-07 at 21.49.15.png](https://qiita-image-store.s3.amazonaws.com/0/30016/33597141-0cba-14d4-6d18-483394b55769.png)

これで外部からのリクエストを受け付けるようになりました．

iOSにルート証明書をインストールする
---

さて，SSL/TLSによる通信は暗号化されているため簡単には見えないわけです．Burpのデフォルトの動作としてはBurp自身が正しい証明書で通信をすることでBurpとしては復号結果を保持し，本来のクライアントに転送する際に，Burp自身が持っているルート証明書によって証明される証明書をホスト毎に自動生成する，という形をとります．

どういうことかというと，このBurpのルート証明書を対象端末に入れれば万事OKということです．

方法としてはBurpを立ち上げたマシンのIPを調べまして，先ほど指定したポートにアクセスします．するとこういう画面がでてきますので，迷わず右上の'CA Certificate'と言うリンクをぽちっとやります．
![IMG_3174.PNG](https://qiita-image-store.s3.amazonaws.com/0/30016/35b17058-d9ad-1abd-3972-19f91a1d26ef.png)

あとは画面指示に従いルート証明書をインストールしましょう．

Proxyの設定をする
---
設定画面のWiFiから接続中のアクセスポイントを選択し，一番下のHTTPプロキシの項目をそれらしい感じに設定します．

192.168.1.7の8080でBurpが待ち受けている場合は以下のような設定になります．
![IMG_3176.PNG](https://qiita-image-store.s3.amazonaws.com/0/30016/832c19f6-95fb-85ad-3822-4f2fdf8b63f8.png)

実際にHTTPSなサイトにアクセスしてみる
---
左がBurpが動作しているMacの画面，右がiOS上の画面です．HTMLがちゃんと展開されているのがわかります．
![Screen Shot 2015-05-07 at 21.54.56.png](https://qiita-image-store.s3.amazonaws.com/0/30016/5a0c502b-0ab2-8983-4807-fa72e015890d.png)

便利ですね．Burpの機能を使えばリクエストやレスポンスの中身を書き換えれますので，手軽にいろいろ試せて良いですよ．
C#：特定の文字を特定の文字数分増やして置換する

## 特定の文字を特定の文字数分増やして置換する


（例）
「¶あいうえお」という文字列があって、特定の文字数分「¶」を増やしたい
※特定の文字例＝「増えろ」

（結果）
「¶¶¶あいうえお」

***

```csharp:Program.cs
using System;
using System.Linq;

public class Program{
    public static void Main(){

        string str = "¶あいうえお";
        string ward = "増えろ";

        // ¶¶¶に変換して置換
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        for (int i = 0; i < ward.Length; i++) sb.Append("¶");
        str = str.Replace("¶", sb.ToString());

        // ¶¶¶あいうえお
        System.Console.WriteLine(str);
    }
}
```

**２回以上の文字列結合**を行う場合はstring結合よりも**StringBuilder**を使ったほうが速いしメモリ使用量も抑えることができる
rsyncの結果の見方

rsyncを実行すると、以下のようなファイル一覧が出ます。

> .d..t...... ファイル名
> <f.st...... ファイル名

表示された内容の「.d..t.」や「<f.st.」が意味している内容が以下です。

* f = ファイル
* d = ディレクトリー
* s = size違い
* t = timestamp違い
* p = permittion違い

**例：**

* 「.d..t......」：ディレクトリのタイムスタンプが、sync元、先で違う
* 「f.st......」：ファイルのサイズ、タイムスタンプが、sync元、先で違う

**その他**

* 「<f+++++++++」：sync元のファイルを新規にsyncする場合。
* 「cd+++++++++」：sync元ディレクトリを新規にsync、追加作成場合。
rubyからociでつないだoracleのフェッチが異様に遅かった話


リモートのoracleからデータを抜いてローカルのoraceにコピーしようとしたら、抜いてくる段階で異様に時間がかかってしまいはまりました。。

##環境
* MacOS X Yosemite
* Ruby 2.1.5
* ruby-oci8 
* oracle11.2.0.4

##やりたかったこと
* リモートのマスターDBからデータをCSVで抜いて、ローカルの開発用DBにコピーしたい


##問題
* テスト環境では問題ないのに、本番DBにつなぐとSELECTした後のfetchが異様に遅い



##本題

とあるシステムの開発のために、リモートのDBから定期的にローカルにデータをコピーしてくる必要がありました。

rubyからoracleにつなぐのは初めてだったんですが、とりあえず調べながらさくっと作ったコードが以下

```ruby:get_data.rb
@conn = OCI8.new('scott','tiger','hogehogetns')

sql = 'select * from hoge_mst'
result = @conn.exec(sql)

while row = result.fetch()
	#csvに書き込む処理
end
```

これでローカルでテストした際は何も問題なく動いてガッツポーズ
したのもつかの間、いざ本番のDBにつないでみたら

お、、、おそい。。。びっくりするくらいおそい。。。

調べてみたところ、このwhileの部分で140秒もかかっています。
データは1万行程度で、ローカルでやった時は3秒程度で終わっていました。

確かにDBサーバーは貧弱で回線も激遅ではあるんですが、それにしてもSQLDeveloperなどで同じクエリを投げた時に比べて遅すぎます。

というわけで色々調べたところ、ociのprefetch_rowsのデフォルト値が1になっていることを発見。

極端にはしょっていえば、selectの結果をフェッチする時に、一度のリクエストで1行ずつしか取得してこない、ということのようです。
つまり、1万行をフェッチするのに1万回リクエストを飛ばす、ということ（でいいんだと思う。。。ここらへんはもっとよく勉強します。）

今回繋ぎたいDBは回線が非常に遅いので、1万回もやりとりしてたらそりゃ遅くなりますよね、ということです。

なのでクエリを飛ばす前にこのprefetch_rowsの値を大きくしてあげます。

```ruby:get_data.rb
@conn = OCI8.new('scott','tiger','hogehogetns')
@conn.prefetch_rows = 1000
```

とりあえず今回のシステムで扱うデータは1万行〜1万5千行程度の範囲でほぼ固定なので、prefetch_rowsを1000にしてみます。

結果

**大成功！**

先ほど140秒程度かかっていた1万行のfetchが3秒で終わるようになりました。
ここまで見事に効果が現れると気持ち良いですね。

というわけで実はrubyからoracleを扱うのは初めてだったので、おそらく割と初歩的なところでハマってしまったようです。
何はともあれ解決して一安心でした。


余談ですが、ociの仕様を調べようとしてもPHPの情報ばっかり出てきますね。
RubyからOracleを扱う人ってそんなにいないんでしょうか？

###追記(2015/05/08)
プリフェッチ行数を調整することでパフォーマンスが向上する原理についてはこちらの記事がとてもわかりやすかったのでご紹介しておきます。
ちなみに一般的にプリフェッチ行数は100〜200行程度が最適なことが多いそうです。

[RDBMSでも大規模データをあきらめないためには：第6回　ネットワークボトルネックの原因と解決策](http://gihyo.jp/admin/serial/01/rdbms/0006)
Windows PowerShell のプロファイルを作ってみました！

PowerShellにはコンソールを開いたとき自動的に実行される「プロファイル」というものがあります。
プロファイルの場所は$PROFILEを表示するとわかりますが、初期状態では実際にそのファイルは存在しないはずです。したがって、PowerShellのコンソールを開いたときには何もしない（既定の動作だけ）です。
試しにこのプロファイルを作ってみました。これを$PROFILEの内容のファイルにコピーして使います。そのとき、ディレクトリ自体もないのでディレクトリも一緒に作ります。

```PowerShell
# Microsoft.PowerShell.profile.ps1

# ワーク用フォルダ (To be modified)
$WorkFolder = "C:\workspace\misc\PowerShell"
if ($(test-path $WorkFolder) -eq $false) {
  echo "ワーク用フォルダ $WorkFolder が存在しません。"
}

# プロファイルフォルダ (== PSScriptRoot)
$ProfileFolder = split-path $profile
if ($(test-path $ProfileFolder) -eq $false) {
  echo "プロファイルフォルダ $ProfileFolder が存在しません。"
}

# モジュール用フォルダ
$ModuleFolder = join-path $profilefolder "Modules"
if ($(test-path $ModuleFolder) -eq $false) {
  echo "モジュール用フォルダ $ModuleFolder が存在しません。"
}

# get-history コマンドレットのエイリアス gh
set-alias -name "gh" -value "get-history"

# 履歴番号 id のコマンドを実行する。
function ih($id) {
  invoke-history -id $id
}

# 3項演算子のような関数
function iff($e, $tv, $fv) {
  if ($e -eq $true) {
    $tv
  }
  else {
    $fv
  }
}

# ワーク用フォルダに戻る。
function cdh {
  set-location $workFolder
}


# ワーク用フォルダに移動
cdh

# PowerShell バージョンを表示する。
"PowerShell Version " + $PSVersionTable.PSVersion
```
PHP7調査(28)関数適用やメソッド呼び出しなどのネストをサポート・整理

PHP5までは、関数適用などを組み合わせた文を書くとエラーになることがありました。例えば次のような文はPHP5では不正ですが、PHP7から正しい文になります。

```php
<?php
function foo() {
    return function () {
        var_dump(123);
    };
}
foo()(); // PHP7で動く、PHP5ではエラー
```

また、カッコで囲った任意の式に対して関数適用やメソッド呼び出し・配列アクセスなどができるようになりました。難しい式を書いたときなど、読みやすくできるのは良いですね。

```php
<?php
Class Foo
{
    static public function bar() {
        new Foo();
    }
    public function baz() {
        var_dump(123);
    }
}
(Foo::bar())->baz(); // PHP7で動く、PHP5ではエラー
```

特に、無名関数をその場で呼び出せるようになったのは進歩かなと思います。ようやく他の言語に追いついた感がありますね。

```php
<?php
// PHP7で動く、実用的かどうかは疑問
foreach ((function ($x) { while (1) { yield $x++; } })(100) as $v) {
    var_dump($v);
    if ($v == 105) break;
}
/*
int(100)
int(101)
int(102)
int(103)
int(104)
int(105)
*/
```

ちなみに、この手の改善は今までのPHPでも行われています。次のようにPHP5.4やPHP5.5で書けるようになった表現もあります。念のため。

```php
<?php
Class Foo
{
    public function bar() {
        var_dump(123);
    }
}
(new Foo())->bar(); // PHP5.4以降で動く：int(123)
var_dump(range(0,5)[4]); // PHP5.4以降で動く：int(5)
var_dump(['foo','bar'][1]); // PHP5.5以降で動く：string(3) "bar"
```

# 参照

* [PHP RFC: Uniform Variable Syntax](https://wiki.php.net/rfc/uniform_variable_syntax)
Go言語でSubStringするときの注意点

## Bad

```go
package main

import "fmt"

func main() {
	s := "あいうえおかきくけこさしすせそたちつてと"
	fmt.Println(s[:15])
}
```

```
> あいうえお
```

## Good

```go
package main

import "fmt"

func main() {
	s := "あいうえおかきくけこさしすせそたちつてと"
	fmt.Println(string([]rune(s)[:15]))
}

```

```
> あいうえおかきくけこさしすせそ
```
Cloud Foundry v2上でminecraftを動かしてアクセスする方法を調査

# Cloud Foundry v2上でminecraftを動かしてアクセスする方法を調査

今回は[Cloud Foundry 情報発信強化週間](http://connpass.com/event/14364/)のネタに何か面白いのがないかと思っていた所

そういえば以前buildpack調査している際にheroku向けのbuildpackでminecraftを対象にしたものがあったな？
という記憶を頼りに、PaaSでminecraftを動かす方法としてどんな手法が取られているかを確認してみることにしました。

## Cloud Foundry 向けの様々なアプローチ

Cloud Foundryでminecraftを動かそうという人類の夢は
既に他の方がv1の頃に以下の記事で挑戦されているのですが

[【小ネタ】Cloud FoundryでMinecraft Serverを動かす！？](http://blog.udcp.net/2012/05/03/minecraft-on-cloudfoundry/)

Cloud Foundry v2になって
herokuと同じbuildpackの仕組みが用意されているので
heroku向けに作られているminecraftのbuildpackであれば可能性が高いと推測し調査を行い、今回短い時間で調べた限りでは2つのアプローチが存在していました。

### タイプ1
Cloud Foundryのbuildpackとして準備

### タイプ2
Cloud Foundryのアプリケーションとしてpushしbuildpackはjavaのものを使う


今回はそれぞれのタイプと手法についてどのようなものかを記載し
実際に動かすことが可能かについても後日可能な限り加筆していきたいと思います

# アプローチ例
### [jkutner/heroku-buildpack-minecraft](https://github.com/jkutner/heroku-buildpack-minecraft)
#### タイプ1
[紹介記事](http://jkutner.github.io/2015/02/23/minecraft-on-heroku.html)

#### 特長
* 作成者はherokuの人らしい
* eula.txtだけを最初に準備『eula=true』という内容を書いておく
* [NGROK](http://qiita.com/kaiinui/items/9e01d976066b1b5898a4)というサービスを使ってコンテナの内部のminecraftサーバへの接続を実現
* データの永続化はS3を利用
 * 永続化について調べてみるとs3cmdをbuildpackのコンパイルフェーズでaptで入れ、アプリ起動時に60秒間隔でwhileを使ってs3とsyncさせている様子

### [jacobwgillespie/heroku-minecraft](https://github.com/jacobwgillespie/heroku-minecraft)
#### タイプ1
#### 特長
* herokuのmulti-buildpack（複数のbuildpack利用する用）を使っている
* データの永続化はS3を利用
* websocketを通す為にnodeアプリの[hmwtc](https://github.com/leonardosantos/hmwtc)というアプリを利用

## タイプ2
### [JamesClonk/cf-minecraft-app](https://github.com/JamesClonk/cf-minecraft-app)

#### 特長
* データの永続化を対応させる為にS3に対応させている
* eula.txtは内包済み
* cfと名前の最初に入っているので期待大でしたがTODO/Problemsにweb socket通らないので解決が必要というような内容が書かれていた
* 以前Qiitaに投稿した『[Cloudn PaaS v2(CloudFoundry)の Service(PostgreSQL & MySQL）に接続](http://qiita.com/morikat/items/5c777708de4f4b272435)』のchiselを応用すれば動く可能性あり？

# まとめ

今回の調査結果からも特長として現れたように
Cloud Foundryやheroku上でminecraftを動かすには以下の部分がポイントとなります

* Cloud Foundryやherokuではアプリのコンテナがアプリ停止などで消える為,永続化についてはS3等の手法を使う必要がある為、minecraftでも同様に対処が必要
* Cloud Foundryおよびheroku上のアプリに通常アクセスする際はhttpやhttpsおよびwebsocket経由になるため何らかのproxy手段が必要
Vue.jsのselectでinitial valueをセットする

__通常のselected__

```html
<select>
   <option value="item1">item1</option>
   <option value="item2" selected>item2</option>
   <option value="item3">item3</option>
</select>
```

__vue.jsのoptionsを使う場合__

```html
<select v-model="selected_item" options="items">
```

```js
items = [
   {text: 'item1', value: 'item1'}
   {text: 'item2', value: 'item2'}
   {text: 'item3', value: 'item3'}
]
```

と指定されていた場合、

```coffeescript
 @vue = new Vue
      el: 'body'
      data:
        selected_item: 'item2'
```

と初期値を設定すると、selectedで指定したときと同じように初期値が選択される。
items objectにselectedオプションを直接書き込んで渡すことはできなそう。

__参考__

> When there are inline values on input elements bound with v-model, e.g. ```<input value="hi" v-model="msg">```, the inline value will be used as the inital value. If the vm comes with default data, it will be overwritten by the inline value. Same for selected attribute on <option> elements.

https://github.com/yyx990803/vue/blob/master/changes.md
Swiftを使う際のiOS7とiOS8のUIViewアニメーションの挙動の違い

#始めに
Objective-Cでviewのwidthを変えたいときなどは`self.view.frame = CGRectMake(0, 0, 100, 100);`のようにframeごと書いていたのですが、Swiftを使うようになってからは`view.frame.size.width = 100`と書くことが多くなってきました。
しかし、その記述方法を使用している際にハマった部分があったので、書き残しておきたいと思います。

#iOS7とiOS8での違い
下記のコードは画面の中央に100x100の大きさの赤いUIViewが、ボタンをタップされることによって画面幅の正方形に拡大し、元のサイズに戻るアニメーションをするものです。 

```swift
class ViewController: UIViewController {

    let sampleView = UIView()
    var defaultFrame = CGRectZero
    
    override func viewDidLoad() {
        super.viewDidLoad()
        sampleView.backgroundColor = .redColor()
        sampleView.frame.size = CGSize(width: 100, height: 100)
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        sampleView.center = view.center
        defaultFrame = sampleView.frame
        view.addSubview(sampleView)
    }

    @IBAction func insertFrameButton(sender: AnyObject) {
        let width = UIScreen.mainScreen().bounds.size.width
        var newFrame = CGRect(x: 0, y: 0, width: width, height: width)
        newFrame.origin.y = view.center.y - width / 2
        UIView.animateWithDuration(0.5, animations: {
            self.sampleView.frame = newFrame
        }) { finished in
            UIView.animateWithDuration(0.5, animations: {
                self.sampleView.frame = self.defaultFrame
            }, completion: nil)
        }
    }
    
    @IBAction func insertEachButton(sender: AnyObject) {
        let width = UIScreen.mainScreen().bounds.size.width
        UIView.animateWithDuration(0.5, animations: {
            self.sampleView.frame.size.width = width
            self.sampleView.frame.size.height = width
            self.sampleView.center = self.view.center
        }) { finished in
            UIView.animateWithDuration(0.5, animations: {
                self.sampleView.frame = self.defaultFrame
            }, completion: nil)
        }
    }
}
```

`@IBAction func insertFrameButton(sender: AnyObject)`の方では、従来通りframeに対してCGRectを代入してUIViewアニメーションさせるものです。

`@IBAction func insertEachButton(sender: AnyObject)`では、width、height、centerにそれぞれ目的の値を代入してUIViewアニメーションをさせるものです。

それではそれぞれの挙動の違いを見てみましょう。

##iOS8での挙動
※下の画像がYoutubeへのリンクになっています。
[![iOS8Animation](http://img.youtube.com/vi/jIbodSkle-s/0.jpg)](http://www.youtube.com/watch?v=jIbodSkle-s)

どちらのメソッドを使っても同じアニメーションをします。
しかしiOS7ではどうでしょうか。

##iOS7での挙動
※下の画像がYoutubeへのリンクになっています。
[![iOS7Animation](http://img.youtube.com/vi/LMbtCNDLQC8/0.jpg)](http://www.youtube.com/watch?v=LMbtCNDLQC8)

`@IBAction func insertEachButton(sender: AnyObject)`の場合に、想定しているアニメーションとは違う動きをしてしまいました。

#最後に
UIViewのanimationのクロージャー内では、frameにCGRectを代入した方がOS間の動きの違いがないので、そちらを使ったほうが良さそうです。
Reactで継承をせずに類似のCompnentを作りたいときの解法


わりかし似たようなコンポーネントを作るとき、クラス継承みたいなことがやりたくなったりする。

例えば今回はactiveフラグの状態によって切り替わるiconなんかを作りたくなった。

# 何も考えずに抽象クラスくさいことをやってみる
うっかりclass構文が作れるので、これを利用してabstractっぽい抽象クラスを書いてみる。

```bad.jsx
class Icon extends React.Component{
  activeClass(){
    throw new Error("Not implemented error")
  }
  inactiveClass(){
    throw new Error("Not implemented error")
  }
  render(){
    var {key, active} = this.props;
    const classes = active ? this.activeClass() : this.inactiveClass()
    const cls = classNames("fa", classes);
    return (<i
      key={key}
      className={cls}
    />);
  }
}

class StarIcon extends Icon{
  activeClass(){
    return "fa-star"
  }
  inactiveClass(){
    return "fa-star-o"
  }
}
```

うむ。throwとかやってて大変よろしくなさそう。
なんとかならんものか

# spread attributesを使う
[transferring props](https://facebook.github.io/react/docs/transferring-props.html)のページと[spread attributes](https://facebook.github.io/react/docs/jsx-spread.html#spread-attributes)を見てみる

```jsx
  var props = {};
  props.foo = x;
  props.bar = y;
  var component = <Component {...props} />;
```
ふむ。なるほど。propsを一気に渡せるとな。

## やってみる
考え方としてはいわゆる「継承より移譲」というやつ。
StarIconは単にIconにpropsを渡しているだけ。

```good.jsx

class Icon extends React.Component{
  render(){
    var {key, classNames} = this.props;
    const classes = cx("fa", classNames);
    return (<i
      key={key}
      className={classes}
    />);
  }
}

class StarIcon extends React.Component{
  render(){
    var classNames = this.props.active ? "fa-star" : "fa-star-o"
    return (<LevelIcon { ...this.props } 
    	classNames={classNames} />)
  }
}
```

あとは制約をちゃんと掛けたければPropTypesをつけると。

```jsx
Icon.PropTypes = {
  clssName: React.PropTypes.string,
  key: React.PropTypes.string,
}
StarIcon.PropTypes = {
  active: React.PropTypes.boolean
}

```

いいんじゃないでしょうか。
Chrome,Webstorm,Macのメモリ節約

フロントエンドの開発を行っているとメモリ不足に悩まされます。

私の場合の主な原因はChrome と　WebStorm(IDE)です。

プロジェクトの規模が大きくなるほどファイル数や履歴が増えるため、
簡単なコードを書いているうちはさくさくだった環境もかなり重い環境になってしまいます。

## Chrome Developer Tools

Editor機能まで備えとても便利なのですが、
Chromeは青天井でメモリを使うのでやたら重くなります。

不要な拡張をいれない、タブは閉じるなど地道な努力をすればいいのかもしれませんが、
面倒なので拡張に頼ります。

### tab-memory-purge

https://chrome.google.com/webstore/detail/tab-memory-purge/aclmceilickagfkaddbiedcnccdkfafa?hl=ja

バックグラウンドにまわったtabのメモリを定期的に開放してくれます。
hostsを指定することで対象外にすることも可能です。

対象外したtabも定期的に閉じて開放するといいと思います。

### Chromeの設定をリセット

なんの知恵でもないのですが、
とりあえずこれをやると拡張がすべて外れるので、
メモリ節約につながります。


## OSのメモリの使用率をよくする

Windows使いではないのでMac限定の話です。

Dr.Cleanerというメモリを開放してくれるアプリをいれます。
似たようなアプリは他にもあるのですが、手動で開放することもできますし、
アプリを終了させると即座に空きメモリをつくってくれるのでなかなかいいです。

![スクリーンショット 2015-05-07 19.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/5565/fbac7bc3-5aa9-6f57-9b03-c80dc7d87376.png)

https://itunes.apple.com/jp/app/dr.-cleaner-torendomaikuro/id921458519?mt=12

Windowsでも似たようなアプリがあると思うので導入してみてもよいと思います。
Chromeのtabなどを閉じるすぐ確保したメモリ開放してくれるので、
短時間でメモリ不足状態から復活できます。

## WebStromを見直す。

refactringや検索機能が優秀なのでなんだかんだで使ってしまうのですが、
こちらもやたらメモリを食います。

特にcacheがたまりはじめるとやばいです。
メモリを食うだけでなく重くなります。
他のエディタなどでも同じですが、履歴が増えるとエディタは重くなります。
なので定期的にクリアすると軽くなります。

特にブランチ切り替えの時に履歴が増える傾向になるので、
一旦クリアすることをおすすめします。

### WebStormのcacheをクリアする方法

Fie->Invalidate Caches/Restart..

重くなり始めたら上記を実行します。
しばらくはかなり快適だと思います。

![スクリーンショット 2015-05-07 19.07.43.png](https://qiita-image-store.s3.amazonaws.com/0/5565/272bfdeb-e9b8-95f2-7b6f-f4781aa209f1.png)

### VCS History Cache Setting の調整

### Changelists to cache initially を減らす

初期値が400なので100ぐらいにします。

![スクリーンショット 2015-05-07 19.16.34.png](https://qiita-image-store.s3.amazonaws.com/0/5565/50497f53-dab9-4a20-8956-20f20a550365.png)

さらに定期的にrefreshさせることもできます。
30分毎にリフレッシュするように設定しました。

### 不要なファイルは対象外にする。

ファイル数が多いと重くなるので触らないコードはプロジェクトから外します。
ガンガン外しましょう。

![スクリーンショット 2016-03-02 11.15.31.png](https://qiita-image-store.s3.amazonaws.com/0/5565/3e5c70cc-85b9-11f4-6a14-82569a7a6a18.png)


## JVMの設定見直し

これはみなさんやっていることで、
メモリがある環境じゃないと効果が薄いかもしれませんが、
メモリを増やします。


Macの場合は以下に

```
~/Library/Preferences/IntelliJIdea15
```

idea.vmoptionsを追加します。

とりあえずファイルが大量に存在するプロジェクトの場合、
2G以上にしておけば快適だと思います。
この設定なんでGUIを常に表示してくれてないんですかね・・

```
-Xms2560m
-Xmx7500m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m
-XX:+UseCompressedOops
```

そこそこ軽くなったのではないかと思います。
みなさんのおすすめがあれば教えていただけると嬉しいです。
このごろのDart。メモ。2015/05

ここ１ヶ月ほどDartのアナウンスを見ておらず、ひさしぶりにDart情報を集めてみて「っお」ってなったところのメモ。

###Sky
http://9to5google.com/2015/05/04/dart-android-sky/

Experimentalではありますが、Dart on Androidを可能にするプロジェクトが立ち上がりました。
プロジェクト名は「Sky」だそうです。
以前からChrome Packaged Applicationという形でDartで開発したものをAndroid上で動かすこと自体はできましたが、
「Sky」はそれとは違いネイティブアプリに近いパフォーマンスを発揮できるようです。
Play Storeに[デモ]((https://play.google.com/store/apps/details?id=org.domokit.sky.demo))があるので、実行してみるとすごくスムーズに動作するのがわかります。

####関連URL
- [Git Hub](https://github.com/domokit/sky_sdk)
- [Sky Demo](https://play.google.com/store/apps/details?id=org.domokit.sky.demo)


###DartEditorの開発中止
http://news.dartlang.org/2015/04/the-present-and-future-of-editors-and.html

WebStorm、IntelliJ 、Eclipse plugin for Dartなど、もう色々なIDEがあるから我々は開発しないよってことみたいです。
Dart1.11のリリースからということで、現在Dart1.10なので、もう新しいDartEditorはでないようです。

###DartPad
http://news.dartlang.org/2015/05/announcing-dartpad-friction-free-way-to.html

DartEditorの開発中止に伴い、Dartを簡単に試すためのサービスDartPadがリリースされました。
ブラウザ上のエディタからDart、HTML、CSSを編集して動かすことができます。
jsdoitみたいなやつです。

https://dartpad.dartlang.org/
[Apache] bot 避けのおまじない

公開サーバーを管理していると、行儀の悪いボットやらワームやらクローラーに
サイト全体を舐め回される事があるので、そのおまじない。

Apache 以外の実装は確認していません。

Apache の仕様で、NameVirtualHost が複数定義してあって、
どの ServerName にもマッチしなかった場合、最初に定義されている
NameVirtual で処理されるのを利用します。

行儀の悪いボットは IP でアクセスしてくる事が多いので、例え１サイトしか
ホスティングして無くても NameVirtual で下記の様に設定する事で、隔離できます。

```
<VirtualHost *:80>
  ServerName dev.null.hoge.fuga
</VirtualHost>

<VirtualHost *:80>
  ServerName example.com
</VirtualHost>
```

尚、リクエストヘッダーに Host: をちゃんと付けて来るボットには効果が有りませんが
アクセスログはだいぶスッキリします。

wordpress や phpMyAdmin が無いか探しに来ているのは結構引っかかっていく模様ｗ
How to resolve pull request's conflicts at GitHub

I sent a PR to a repo, but after some days, it became conflicts,
can't automatically merged.

To resolve this problem, you should rebase the offical repo.

Step 1, add offical repo as a upstream.

```
git remote add upstream https://github.com/someone/somerepo.git
```

Step 2, fetch the new content.

```
git fetch upstream
```

Step 3, check out your branch(if not on it).

```
git co my-branch
```

Step 4, do rebase.

```
git rebase upstream/master
```

In this step, there should be some rebase error for the conflicts reason.
Reslve the conflicts in your editor.

Step 5, add edited files to index.

```
git add a/b/c.java
```

Step 6, continue rebase.

```
git rebase --continue
```

Step 7, force push to update the PR.

```
git push -f origin my-branch
```

For more detail and internal, please checkout this Wiki page: https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request