OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel ForgeでさくらのVPSに環境を用意する


## Laravel Forge とは？

[Laravel Forge](https://forge.laravel.com/)は、DigitalOcean, Linode, カスタムVPS に対して、**Laravelが動く**環境をわずかな作業で構築し管理できるサービス($10/月)です。
環境構築以外にも、gitプロジェクトのデプロイやcronスケジュール管理などもできるみたいです。
(おそらくですが...) Laravelが用意しているVagrant環境である[Homestead](http://laravel.com/docs/homestead)と同じ構成になります。


## サーバーを作成する
今回はForgeを使って、さくらのVPS (2Gプラン)に環境を作ります。
ForgeはUbuntuが対象なので、先に、さくらのVPSを`Ubuntu 14.04 x64`にOS再インストールしてください。
http://support.sakura.ad.jp/manual/vps/cpanel/custom_ubuntu1204.html
今回はさくらのVPSですが、Ubuntuが動くVPS / サーバーであればなんでもいけると思います。

### Laravel Forge管理画面
Forge管理画面からサーバーを作成します。

`サーバー名`と`メモリサイズ`は管理のための表示情報なので、適当でも大丈夫なはず...。
`サーバーIPアドレス`はさくらのVPSのものを入力します。
![forge-create-server.png](https://qiita-image-store.s3.amazonaws.com/0/7955/e2363671-8f09-b490-68e0-003fa93c8573.png)

入力して「Create Server」を押すと、さくらのVPSで実行するコマンドがポップアップされます。
![forge-provision-custom-vps.png](https://qiita-image-store.s3.amazonaws.com/0/7955/1710de69-868e-b140-8373-d9db676cb8ed.png)

コマンドをコピーしてテキストエディタに貼り付けます。
このコマンドは`root`での実行が前提になっているので`bash`の前に`sudo`をつけます。

```
wget -O forge.sh https://forge.laravel.com/servers/****/vps?forge_token=***************; bash forge.sh
# 上のコピペしたコマンドに、sudoを付加
wget -O forge.sh https://forge.laravel.com/servers/****/vps?forge_token=***************; sudo bash forge.sh
```

### さくらのVPS管理画面
リモートコンソールから、コマンドを実行します。

sudoを付加したコマンドをコピーし、リモートコンソールのPasteボタンで貼り付け、実行します。
一度パスワードを聞かれるので入力が必要です。
![sakura-remote-console-paste.png](https://qiita-image-store.s3.amazonaws.com/0/7955/771f2c3b-c02d-a865-a17d-29c257b22bce.png)

コマンドを実行すると、Forgeの管理画面で状態が見られるようになります。
![forge-active-servers.png](https://qiita-image-store.s3.amazonaws.com/0/7955/e08ea4a0-0d1d-fa4f-8385-ec6946347035.png)


## まとめ
Laravel Forgeを使うと、サーバー作成の作業はこれだけです。
nginx, mysql, redis...をいれて、それぞれ設定して、あとiptablesの設定もしなきゃ、がこれだけで済むのでとても楽です。
なによりLaravelの全機能が動かせる環境であるという安心感があります。

最終的にこんな感じでした。
![forge-provisioned.png](https://qiita-image-store.s3.amazonaws.com/0/7955/09a4b230-1fb9-d793-e049-154bd3ce04bb.png)

さくらのVPS 2Gプランだと、OS再インストールを含めると10分くらいで用意できる感じです。

---

- Laravel Forge [https://forge.laravel.com/](https://forge.laravel.com/)
- Server Management With Forge - Laracasts [https://laracasts.com/series/server-management-with-forge](https://laracasts.com/series/server-management-with-forge)
heroku のログを見る方法

herokuにpushしてopenしてブラウザから確認したところエラー／(^o^)＼みたいな場合にログを見る方法です。

# ログを表示

```bash:ログを表示
heroku logs -t 
```

ヘルプを見るとわかりますが、-t オプションをつけるとストリーミング状態のログを見ることが出来ます。

```
Usage: heroku logs

 display recent log output

 -n, --num NUM        # the number of lines to display
 -p, --ps PS          # only display logs from the given process
 -s, --source SOURCE  # only display logs from the given source
 -t, --tail           # continually stream logs
```

logを流せば、エラー箇所がわかるので便利ですねー。

# アカウントを指定してログを見る
herokuのアカウントを複数利用している場合は、アカウントを指定することもできます。

```bash:アカウントのログを表示
heroku logs -t --account user_name
```

# おまけ
Railsでherokuのログを増やす方法など
http://qiita.com/pugiemonn/items/0e69b7a29a384b356e65
スプライトのマスク処理（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語で、画像の一部を別の画像の形でくり抜くマスク処理についてまとめました。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC1|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を書き換えます。

```lua:GameScene.lua/GameScene.create
function GameScene.create()
    local scene = GameScene.new()

    -- 画面サイズを取得    
    visibleSize = cc.Director:getInstance():getVisibleSize()
    
    -- クリッピングノードの作成とレイヤへ追加
    local clippingNode = cc.ClippingNode:create()
    clippingNode:setAlphaThreshold(0)
    clippingNode:setPosition(0, 0)
    clippingNode:setAnchorPoint(0, 0)
    scene:addChild(clippingNode)

    -- マスク画像の作成とステンシルに設定
    local mask = cc.Sprite:create("mask.png")
    mask:setPosition(visibleSize.width/2, visibleSize.height/2)
    clippingNode:setStencil(mask)

    -- 画像をクリッピングノードに追加
    local image = cc.Sprite:create("image.png")
    image:setPosition(visibleSize.width/2, visibleSize.height/2)
    clippingNode:addChild(image)
    
    return scene
end
```

mask.pngとimage.pngを用意してプロジェクトのresディレクトリに追加します。

![mask.png](https://qiita-image-store.s3.amazonaws.com/0/45447/ea513500-2e7e-099d-ef10-09ad5c04f1fb.png "mask.png")mask.png

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45447/faf873db-124d-d347-9aa6-5569e87686ac.png "image.png")image.png

実行するとimage.pngがmask.pngで繰り抜かれて表示されます。

![ssマスク.png](https://qiita-image-store.s3.amazonaws.com/0/45447/b8c0e3bf-d9b2-cd4e-57f3-7d8747938d56.png "ssマスク.png")

## 解説

clippingNode:setAlphaThreshold(0)を忘れるとマスクされません。
clippingNode:setStencilでマスク用の画像を設定しています。

表示したい画像（ここではimage.png）はクリッピングノード上に追加して表示します。
クリッピングノードが、一部だけが表示されるレイヤーだと考えればわかりやすいかと思います。

### マスク用の画像について

マスク用の画像は背景を透明色、表示したい部分を何色でも良いので塗りつぶして作成します。
画像ファイルはプロジェクトのresディレクトリに追加しておきます。

### マスクする部分を逆にしたい時

マスクして隠す部分と表示する部分を逆にしたいときは`clippingNode:setInverted(true)`を使います。

### うまく表示されない時

うまく表示されない時は、clippingNode:setAlphaThresholdの設定がされているか、clippingNode:setStencilでマスク画像が指定されているか、クリッピングノードや画像の位置、アンカーポイントがおかしいため表示範囲外にはみ出ていないか、などをチェックしてみてください。
【プログラミング48(/2 -1)手】Flyweight


## ポイント
Flyweight（軽量級）パターン。
等価なインスタンスはいくつも作らないで、再利用して、リソース消費を抑えましょうということ。


## サンプルコード
以下は、Wikipediaのコードと同じ。
http://en.wikipedia.org/wiki/Flyweight_pattern

```ruby:Flyweight.rb
class Lamp
  attr_accessor :color

  def initialize(color)
    @color = color
  end
end

class TreeBranch
  def initialize(branch_number)
    @branch_number = branch_number
  end

  def hang(lamp)
    puts "Hang #{lamp.color} lamp on branch #{@branch_number}"
  end
end

# Flyweight Factory
class LampFactory
  def initialize
    @lamps = {}
  end

  def find_lamp(color)
    if @lamps.has_key?(color)
      lamp = @lamps[color]
    else
      lamp = Lamp.new(color)
      @lamps[color] = lamp
    end
    return lamp
  end

  def total_number_of_lamps_made
    @lamps.size
  end
end

class ChristmasTree
  def initialize
    @lamp_factory = LampFactory.new
    @lamps_hung = 0
    dress_up_the_tree
  end

  def hang_lamp(color, branch_number)
    TreeBranch.new(branch_number).hang(@lamp_factory.find_lamp(color))
    @lamps_hung += 1
  end

  def dress_up_the_tree
    hang_lamp('red', 1)
    hang_lamp('blue', 1)
    hang_lamp('yellow', 1)
    hang_lamp('red', 2)
    hang_lamp('blue', 2)
    hang_lamp('yellow', 2)
    hang_lamp('red', 3)
    hang_lamp('blue', 3)
    hang_lamp('yellow', 3)
    hang_lamp('red', 4)
    hang_lamp('blue', 4)
    hang_lamp('yellow', 4)
    hang_lamp('red', 5)
    hang_lamp('blue', 5)
    hang_lamp('yellow', 5)
    hang_lamp('red', 6)
    hang_lamp('blue', 6)
    hang_lamp('yellow', 6)
    hang_lamp('red', 7)
    hang_lamp('blue', 7)
    hang_lamp('yellow', 7)
    puts "Made #{@lamp_factory.total_number_of_lamps_made} total lamps"
  end
end

ChristmasTree.new

```

## 所感
* サンプルのコードがあまり良くないので、いつか自分で書いてみたい。

## 参考
http://blog.rubybestpractices.com/posts/gregory/060-issue-26-structural-design-patterns.html
https://github.com/darkslategrey/design-pattern-ruby/tree/master/flyweight
http://en.wikipedia.org/wiki/Flyweight_pattern
cocos2d-x 3.2のセットアップ

久々に触ったらいろいろ変わってたのでメモ

## 環境

* Mac OS X Mavericks
* cocos2d-x 3.2
* Xcode, Android NDK, Android SDK, Antなど必要なものはすべてインストール済み

## 公式サイトからダウンロード

http://www.cocos2d-x.org/download から最新のzipをダウンロードする

## zipを展開して、適当な場所に置く

zipを展開する。
次のステップでcocos2d-xの配置場所に対してパスが通るように環境変数が書き変わるので、ちゃんとした場所に置くこと

## setup.py

最初に提供されているsetup.pyを叩く。

```bash
cd path/to/cocos2d-x-3.2
python setup.py
source ~/.bash_profile
```

現在のcocos2d-xはcocosというコマンドでプロジェクトを作ったりするので、cocos2d-xのディレクトリにパスを通してくれる。
また、Android関連のSDK, NDK, Antのパスが通ってるかもチェックしてくれる。

## プロジェクトの作成

こんな感じのコマンドでプロジェクトを作成する

```bash
cocos new -p <パッケージ名> -l cpp -d <プロジェクトを作成するパス> <プロジェクト名>
```

その他のオプションについては、

```bash
cocos new
```

とだけ叩けば色々表示される。

## iOSでビルド

<プロジェクトパス>/pro.ios_mac/<プロジェクト名>.xcodeproj をダブルクリックしXcodeを起動
以下省略
CentOSでJenkinsを最新版にアップデートする手順


## 1. 概要

CentOSにインストールしたJenkinsをコマンドラインから最新版にアップデートする手順を示す。

## 2. 動作環境

- CentOS 6.5
- Jenkins 1.579

## 3. 手順

考え方としては、`/usr/lib/jenkins/jenkins.war`に最新版の`war`ファイルを配置して再起動するだけでよい。

```
$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
$ sudo service jenkins stop
$ sudo rm /usr/lib/jenkins/jenkins.war
$ sudo mv jenkins.war /usr/lib/jenkins/jenkins.war
$ sudo service jenkins start
```

## 4. 備考

もし最新版で不具合が出た場合、以下より過去のバージョンを取得できる。

- http://mirrors.jenkins-ci.org/war/

## 参考記事

- http://please-sleep.cou929.nu/update-jenkins.html
- http://arimo.hatenablog.com/entry/2013/01/08/140639
- http://toshitanian.hatenablog.com/entry/2013/09/07/220531
TextFieldTableCell\<〇〇, Double\> 等のメモ


## 環境
- JavaFX 8

## callbackの発火タイミング
### commitEdit(Double newValue)
- 入力中にEnterなどを押して「確定」した時

### startEdit()
- ダブルクリックなどで、入力モードに入った時
- isEditting()はtrue

### cancelEdit()
- startEdit()をしたあと、「確定」しないで違うところをクリックするなどをして、キャンセルした時


### updateItem(Double item, boolean empty)
- viewに追加したように見えるとき
 - rowを追加した時
 - rowがいっぱいあって、スクロールした時
- Editし、Enterなどを押して「確定」した時(入力の時は、少しRowが大きくなるからそれの見た目のupdateかと考える)
- startEdit()の後(入力の時は、少しRowが大きくなるからそれの見た目のupdateかと考える)
- 入力モードから確定し、commitEdit()の前
- isEditting()はfalse

## 入力 -> 確定
ダブルクリック -> updateItem -> startEdit -> 入力 -> Enterを押す -> updateItem -> commitEdit

## 入力 -> キャンセル
ダブルクリック -> updateItem -> startEdit -> 入力 -> キャンセル -> cancelEdit

## 注意点
Doubleなので、setConverterをして上げる必要がある

## 方法
- (方法1) `this.setConverter(new DoubleStringConverter());`
- (方法2) DoubleStringConverterを継承した「MyDoubleConverter」を作成し、突っ込む

#### 方法1だと、数値以外の文字を打つと、エンターが押せなくなる(正確にはDouble.valueOf(string)ができないやつのみ->NaNはいけてしまう)
#### 方法2だと、fromString(String value)をOverrideすることで「ユーザが文字を入力し、Enterを押す」と強制的に「0.0」にするとかも可能

「全角の数字にも対応したい」「NaNを入力させたくない」なら、方法2で頑張る

## commitEditをOverrideしてどっかのオブジェクトに値を代入している時に気をつけるべきこと
以下のようなコードの時、

~~~Hoge.java
...
	@Override
	public void commitEdit(Double newValue) {
		super.commitEdit(newValue);
		this.foo = newValue;
	}
...
~~~

デフォルトだとstartEditが走った時、入力していたvalueが全て消えてそのままcancelすると、消えたままでcommitEditは走らない。
すぐ思いつくのはprevValueなどでとっておく。
startEdit()とcancelEdit()もOverrideする

~~~Hoge.java
...
	@Override
	public void startEdit() {
		if (this.getText() != "") {
			this.prevValue = Double.valueOf(this.getText());
		}
		super.startEdit();
	}

	@Override
	public void cancelEdit() {
		super.cancelEdit();
		if (this.prevValue == null) {
			return;
		}
		this.setText(this.prevValue.toString());
	}
...
~~~
GemfileでOSの判別をする

「Macで開発してる時はgrowlのGem欲しいけど、本番環境はLinuxだしgrowlいらねぇ！」とかそういう時に役立つTips。

```Gemfile
gem 'growl' if `uname` =~ /Darwin/
```

これで良し。

Macな人限定は試しにシェルで

```
uname
```

ってやってみると、```Darwin```って出るよ。

Linuxだと```Linux```って出るよ。


# 追記
コメント欄より、

```uname```だとWindowsで使えないし、```RUBY_PLATFORM``` を使おうとのこと。

```Gemfile
gem 'growl' if RUBY_PLATFORM.match(/darwin/)
```

こんな感じ？

@Nabetani さんありがとうございました！
ArchLinux サウンド設定 (ALSA)

ArchLinuxのサウンド設定の際のメモ
簡単だったけど、いつか再インストールするときのための、めも。
<br>

#####ALSAをインストール
***
サウンドドライバはデフォルトで入っているので、ボリュームを設定するためのツール、 Advanced Linux Sound Architecture を公式リポジトリからインストール。

```
$ sudo pacman -S  alsa-utils
```
<br>

#####ミュートの解除
***
下記コマンドで設定のUIを起動して、ミュートを解除。ボリュームの設定も行う。

```
$ alsamixer
```

以上で設定は完了！
適当な動画を再生して、音が出てることを確認。
https://www.youtube.com/watch?v=p4i3Zgt2TGw
<br>

#####そしてもうひとつ(KDE用)
***
F10〜F12に割り当てられているボリュームコントロールを使えるようにする。KDE用の下記パッケージを公式リポジトリからインストール。

```
sudo pacman -S kdemultimedia-kmix
```
ボリュームキーだけでなく、画面の明るさ調整など、F1〜F12に割り当てられているすべてのショートカットキーが使えるようになる。
<br>

#####参考リンク
***
[ArchLinux wiki Macbook](https://wiki.archlinux.org/index.php/MacBook_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#.E3.82.B5.E3.82.A6.E3.83.B3.E3.83.89)

[ArchLinux wiki ALSA](https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture_(%E6%97%A5%E6%9C%AC%E8%AA%9E))
PHPの次のメジャーバージョンは7に決まりました

次のPHPのメジャーバージョンは6をスキップして7にしようぜという件、無事7に決まりました。

参考：[PHP: rfc:php6](https://wiki.php.net/rfc/php6)

「[本の虫: PHPの次のバージョンはPHP 7かもしれない](http://cpplover.blogspot.jp/2014/07/phpphp-7.html)」で紹介された時点では未確定でしたが、投票が終了して本当になったよってことです。

この内容を取り上げているブログ記事「[PHP 7 Features and Release Date - PHP Classes blog - PHP Classes](http://www.phpclasses.org/blog/post/242-PHP-7-Features-and-Release-Date.html)」では表向きの理由とは別に「The Curse of Language Version 6（言語のバージョン6の呪い）」なんて話題も紹介されてます。PerlとPHPしか事例が無いので呪いと言えるほどの話ではないと思いますが、海外でも縁起を担ぐような人って結構いるんでしょうか。ちょっと面白いですね。

以上、小ネタでした。
[Firefox] ダウンロードを高速化する

# はじめに

proxyに阻まれてダウンロード処理にいろいろ問題を抱えているときに、これを使うともしかしたら解決するかもしれません。

# 方法

## FireFoxのDownThemAll!アドオンを入れる

refs: https://addons.mozilla.org/ja/firefox/addon/downthemall/

## DownThemAll!でダウンロードする

リンク先を右クリックして、「DownThemAll!でリンクを保存」を選択します。
Vue.js で多重に v-repeat を使う

例えばこんな感じのオブジェクトがあったとする

```js
var list = {
  hoge: {
    a: "alpha",
    b: "bravo",
    c: "charlie"
  },
  fuga: {
    d: "delta",
    e: "echo"
  },
  piyo: {
    f: "foxtrot",
    g: "golf",
    h: "hotel"
  }
}
```

HTML はこんな感じにする

```html:index.html
<ul id="multiple-list">
  <li v-repeat="sub: list">
    {{sub.$key}}
    <ul>
      <li v-repeat="sub">{{$key}} = {{$value}}</li>
    </ul>
  </li>
</ul>
```

ここが重要

```html:index.html:2
  <li v-repeat="sub: list">
```



ViewModel を作る

```js:main.js
var vm = new Vue({
  el: "#multiple-list",
  data: {
    list: {
      hoge: {
        a: "alpha",
        b: "bravo",
        c: "charlie"
      },
      fuga: {
        d: "delta",
        e: "echo"
      },
      piyo: {
        f: "foxtrot",
        g: "golf",
        h: "hotel"
      }
    }
  }
});

```

実行するとこうなる
![2014-09-13-132938_217x248_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/31573/8fea5505-8324-2c7e-3274-2186d2410a00.png)
余計なもの( \$key = hoge) がついてるので、 $key を取り除くフィルターを作る

```js:main.js
var utils = Vue.require("utils");
Vue.filter("multiple", function(a){
  return utils.objectToArray(a).filter(function(v){
    return v.$key !== "$key"
  });
});
```
 

HTMLにフィルターを適応させる

```html:index.html
<ul id="multiple-list">
  <li v-repeat="sub: list">
    {{sub.$key}}
    <ul>
      <li v-repeat="sub | multiple">{{$key}} = {{$value}}</li>
    </ul>
  </li>
</ul>
```

完成、やったぜ。

![2014-09-13-133303_179x201_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/31573/67fbcf3a-8e92-58d0-e60e-2c0c8d446712.png)
slを走らせよう on Rasberry Pi B+

## きっかけ：可愛いかったので

わたしはハードウェアをいじるのは全くの苦手です。
でも、会社でお話が上がって、とても可愛かったので、お買い上げしました。(ささやかなお買い物です)
しかし、セットアップは自分ではせず...。
OSインストール、無線LANでの接続までは他力本願でした。


## SLを走らせたい

可愛さだけで、何をさせよう...という考えは持っていなかったのですが、たまたま"SL"コマンドの話が出て、Rasberry Piで走らせたらどれくらいのスピードで走るのかな、と興味が出て、まずはslコマンドを入れることにしました。

### slコマンドとは?

貴方がついやってしまいがちな、うっかりタイプミスを矯正してくれるコマンドです。（日本語だと：『キータイプを矯正します。』）
※注意: **効果には個人差があります**

* Source: https://github.com/mtoyoda/sl

## やってみます

apt-getで入れます。勝手にソースを取って来てくれました。

```
pi@raspi ~ $ sudo apt-get install sl
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  sl
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 13 個。
26.2 kB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 117 kB のディスク容量が消費されます。
以前に未選択のパッケージ sl を選択しています。
(データベースを読み込んでいます ... 現在 74884 個のファイルとディレクトリがインストールされています。)
(.../archives/sl_3.03-17_armhf.deb から) sl を展開しています...
man-db のトリガを処理しています ...
sl (3.03-17) を設定しています ...
pi@raspi ~ $ 
```
man slの結果。

```
名称
       sl - キータイプを矯正します。

形式
       sl [ -alFe ]

解説
       sl は、高度に発展した、キータイプ矯正を目的とするアニメーションプログラムです。SLは蒸気機関車のことです。

       次のようなオプションがあります。

       -a     なにかアクシデントがあったようですね。助けを求める人々が悲痛です。

       -l     小さくなります。

       -F     飛びます。

       -e     Ctrl+C で途中で止めることを許します。

関連事項
       ls(1)
```
## スクリーンショット

動かしてみます。
が、コピペは出来ないので、画像で。

下記は引数無しです。

![sl.png](https://qiita-image-store.s3.amazonaws.com/0/27976/9e22847f-d4a5-2dfd-fdfc-fa29ea183331.png "sl.png")

Rasberry piだったら、のんびり動くかな〜と思ったんですが、そんなことはございません。ささっと通り過ぎて行きました。


実は、仕事で使っていた共用サーバにインストールされていたので、十数年前（！）からこのコマンドは知っていたんですが、ソースコードがGitHubに公開されているおかげで、このたび初めてソースを眺めました...。（全く分かりません）

動かしているRasberry Piはこちら。

![10620662_699648986782223_6810273116579921286_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/7839d717-ae75-25b7-9242-1cfa9c185faa.jpeg "10620662_699648986782223_6810273116579921286_n.jpg")

## SL友の会

由緒あるコマンドですが、rubyやJavaScriptで置き換えている方もいらっしゃる、ということを聞いて、探すとなるほどありました..。

そして、『SL友の会』というサイトがあることも知りました(^^;

* http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/sl/links.html
VagrantでOpenCMISを試す

# はじめに

VagrantでApache Chemistry OpenCMIS Server Frameworkを使ったCMISサーバーを動かします。
CMISサーバーはサンプルプロジェクトを使います。
サンプルプロジェクトは、サーバーのディレクトリをCMISのリポジトリとしてアクセスできるようにするものです。

# 用意するもの

 - Apache Maven (http://maven.apache.org/download.cgi)
 - svn (TortoiseSVNをインストールすればよいでしょう: http://tortoisesvn.net/downloads.html)
 - JDK & Jetty (http://qiita.com/yhiranoo/items/1166a67e8b1ff40b2df4)
 - Eclipse IDE for Java EE Developers (https://www.eclipse.org/downloads/)

# サンプルプロジェクトをビルドする

GitHubから以下のプロジェクトを取得します。
https://github.com/cmisdocs/ServerDevelopmentGuide

## ビルドする

いずれもtargetディレクトリにwarファイルができます。

### mvnでビルドする

プロジェクトのcmisFileBridge-masterディレクトリでmvnを実行します。

```
mvn clean install -Dmaven.test.skip=true
```

proxy設定が必要な場合は、~/.m2/settings.xmlに以下を書いておきます。

```
<settings>
  <proxies>
    <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxyホスト</host>
      <port>proxyポート</port>
      <username>ユーザー名</username>
      <password>パスワード</password>
      <nonProxyHosts></nonProxyHosts>
    </proxy>
  </proxies>
</settings>
```

### eclipseでビルドする

プロジェクトのcmisFileBridge-masterディレクトリをMaven -> Existing Maven Projectsでimportします。
勝手にbuildされます。

# Webコンテナに配置して動かす

セットアップしておいたJettyのwebappsディレクトリに、作成したwarファイルを置きます。
ブラウザから、以下にアクセスし、FileBridgeServerページが表示されたらOKです。
最後の'/'を付け忘れるとアクセスできません。

http://Vagrantfileのprivate_network:8080/server-1.0-SNAPSHOT/

# OpenCMIS Workbenchでアクセスする

## Workbenchをダウンロードする

refs: http://chemistry.apache.org/java/download.html

## Workbenchを実行する

workbench.batを実行します。
Loginダイアログが表示されたら、Expertタブを開き、以下を入力し、Load Repositoriesを押します。

```
org.apache.chemistry.opencmis.binding.spi.type=browser
org.apache.chemistry.opencmis.binding.browser.url=http://Vagrantfileのprivate_network:8080/server-1.0-SNAPSHOT/browser
org.apache.chemistry.opencmis.user=test
org.apache.chemistry.opencmis.password=test
org.apache.chemistry.opencmis.binding.compression=true
org.apache.chemistry.opencmis.binding.cookies=true
```

Loginが有効になるので、押します。
Vagrantで起動したOSのディレクトリが表示されます。

CMISで操作ができますので、Create Objectでファイルをアップロードしたり、ファイルをダブルクリックでダウンロード実行したりできます。
【プログラミング48(/2 -1)手】Decorator


## ポイント
Decorator（装飾）パターン。
もとのクラスの実装を変えずに、ラッパークラスをつくってそこで装飾していくパターン。


## サンプルコード
以下サイトと同じコード。
http://morizyun.github.io/blog/ruby-design-pattern-09-decorator/

```ruby:Decorator.rb
class SimpleWriter
  def initialize(path)
    @file = File.open(path, "w")
  end

  def write_line(line)
    @file.print(line)
    @file.print("\n")
  end

  def pos
    @file.pos
  end

  def rewind
    @file.rewind
  end

  def close
    @file.close
  end
end


class WriterDecorator
  def initialize(real_writer)
    @real_writer = real_writer
  end

  def write_line(line)
    @real_writer.write_line(line)
  end

  def pos
    @real_writer.pos
  end

  def rewind
    @real_writer.rewind
  end

  def close
    @real_writer.close
  end
end


class NumberingWriter < WriterDecorator
  def initialize(real_writer)
    super(real_writer)
    @line_number = 1
  end

  def write_line(line)
    @real_writer.write_line("#{@line_number} : #{line}")
  end
end


class TimestampingWriter < WriterDecorator
  def write_line(line)
    @real_writer.write_line("#{Time.new} : #{line}")
  end
end


f = NumberingWriter.new(SimpleWriter.new("file1.txt"))
f.write_line("Hello out there1")
f.close

f = TimestampingWriter.new(SimpleWriter.new("file2.txt"))
f.write_line("Hello out there2")
f.close

f = TimestampingWriter.new(NumberingWriter.new(SimpleWriter.new("file3.txt")))
f.write_line("Hello out there3")
f.close

```

## 所感
* 最初作るときに使うパターンというは、後から既存の実装をかえずにやるのに有用なパターン。
* Adapter、Proxy、Decoratorは基本やってることは同じで、どういう時に使うかの違いだけのような気はしている。

## 参考
http://morizyun.github.io/blog/ruby-design-pattern-09-decorator/
[Jetty] VagrantでJettyを動かす

# はじめに

VagrantでJettyを動かして、Webアプリケーションを動作できるようにします。

refs: http://qiita.com/supertaihei02/items/a53ce41d82c4b5ab0efa

# Vagrantを動かす

refs: http://qiita.com/yhiranoo/items/43b4d3f712b79e29e1b0

# JDKをインストールする

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html などからjdk-*-linux-x64.rpmをダウンロードし、Vagrantで起動したOSにコピーします。

```
scp -F .vagrant.ssh.config jdk-7u51-linux-x64.rpm default:
```

http://download.eclipse.org/jetty/ から最新のstableリリースをダウンロードし、Vagrantで起動したOSにコピーします。

```
scp -F .vagrant.ssh.config jetty-distribution-9.2.3.v20140905.tar.gz  default:
```

/usr/shareに展開します。

```
tar cvfz jetty-distribution-9.2.3.v20140905.tar.gz
```

# Jettyを起動する

```
cd jetty
java -jar start.jar
```

ブラウザから、Vagrantfileのprivate_networkで指定したアドレスの8080ポートにアクセスします。
Jettyの404ページが表示されたらOKです。

> あとは以下を参照するなどして、サービス化しておきます。
> refs: http://d.hatena.ne.jp/q-yoshida/20131031/1383216948
Rails date_selectをBootstrapを使っていい感じにする


## デフォルト設定
dete_selectは、デフォルトでは次のように表示されます。

```erb:sample.html.erb
  <div class="row">
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      デフォルト：
    </div>
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      <%= date_select 'date-normal', '', {use_month_numbers: true} %>
    </div>
  </div>
```
結果：
![default.png](https://qiita-image-store.s3.amazonaws.com/0/38173/04edae66-0daa-464b-b6a2-f24f4bd66cd0.png "default.png")

## class="form-control"適用
class="form-control"を適用するとbootstrap的なコントロールに変わります。
が、意図した形になっていません。

```erb:sample.html.erb
  <div class="row">
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      class="form-control"設定のみ：
    </div>
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      <%= date_select 'date-class-only', '', {use_month_numbers: true}, {class: "form-control"} %>
    </div>
  </div>
```

結果：
![form-control.png](https://qiita-image-store.s3.amazonaws.com/0/38173/3218c9bb-bf10-08ab-464b-577d79e13680.png "form-control.png")

これはform-controlはデフォルトでwidth=100%になるためと思われます。（[公式サイト](http://getbootstrap.com/css/#forms)に書かれていました）

## width: auto適用

ではコントロールのwidthを変更すればいいだろうということで変更したところ、幅はいい感じになりましたが、まだ縦に並んでしまっています。

```erb:sample.html.erb
  <div class="row">
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      stylesheet width設定を追加：
    </div>
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      <%= date_select 'date-with-stylesheet', '', {use_month_numbers: true}, {class: "form-control bootstrap-date-only-width"} %>
    </div>
  </div>
```

```scss:application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";

.bootstrap-date-only-width {
  width: auto;
}
```

結果：
![width.png](https://qiita-image-store.s3.amazonaws.com/0/38173/580ebfe7-c7df-e01e-9f40-40164e165399.png "width.png")

## display: inline-block適用

行き詰まってきたので、ちょうど参加してた神戸.rbで質問してみると一緒に調べてもらえました。
そして、display: blockの影響を受けているということがわかりました。

ならinline-blockにしたらうまくいくのでは？ということでやってみたのがこれです。

```erb:sample.html.erb
  <div class="row">
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      stylesheet display設定を追加：
    </div>
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
      <%= date_select 'date-with-stylesheet-inline', '', {use_month_numbers: true}, {class: "form-control bootstrap-date"} %>
    </div>
  </div>
```

```scss:application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";

.bootstrap-date {
  display: inline-block;
  width: auto;
}
```

結果：
![display.png](https://qiita-image-store.s3.amazonaws.com/0/38173/475af0eb-f2b6-3ce6-15c0-0a19c549ad9d.png "display.png")

いい感じになりました！

## まとめ

class="form-control"をつける
stylesheetで該当コントロールに次の設定をつける

  display: inline-block;
  width: auto;

まとめたサンプルをGitHubにアップしてます。
https://github.com/t-oginogin/sample_date_select_bootstrap.git

まとめた結果：

![all.png](https://qiita-image-store.s3.amazonaws.com/0/38173/1b6c179a-f747-c408-77ee-4e29435fbbb8.png "all.png")
ElasticBeanstalkで、死活監視に応じてインスタンスを終了させる

## 背景

AWS Elastic Beanstalkにおける標準の死活監視では、「停止したインスタンス」の除去は行いますが、「動作しているが、ELB死活監視に失敗した」インスタンスはそのままになります。
これは、停止したインスタンスのログ回収等に便利な面もあるのですが、ELB上に有効なインスタンスがなくなるケースがあります。（というか、昨夜そうなってしまいました。。。）

## 問題点

Auto Scaleのヘルスチェックには二種類あります。
-
* EC2 : EC2の死活監視を使用する（インスタンスがRunningかどうか）
* ELB : ELBの死活監視を使用する（ヘルスチェックURLの応答）

そして、Elastic Beanstalkで設定したAuto ScaleはEC2モードになっています。

## 解決法
Management Consoleから簡単に変更できるようになっています。
「EC2」->「Auto Scaling Group」->「Detail」->「Edit」から設定しましょう。
CentOS5に最新版vim(7.4)をビルド

neobundleの動作にはpython2.6が必要っぽい

```bash:
yum install -y epel-release
yum install -y python-devel lua-devel
```

```bash:ソースからインストール
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
tar xjf vim-7.4.tar.bz2
cd vim74

./configure \
 --enable-multibyte \
 --with-features=huge \
 --enable-luainterp \
 --enable-perlinterp \
 --enable-pythoninterp \
 --with-python-config-dir=/usr/lib64/python2.6/config \
 --enable-rubyinterp \
 --with-ruby-command=/usr/bin/ruby \
 --prefix=$HOME/local

make
make install
```

```bash:$HOME/.bashrcに追加
export PATH=$HOME/local/bin:$PATH
```

```bash:neobundleのインストール
mkdir -p ~/.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

```vim:~/.neobundle
" Note: Skip initialization for vim-tiny or vim-small.
if !1 | finish | endif

if has('vim_starting')
  set nocompatible               " Be iMproved

  " Required:
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" My Bundles here:
" Refer to |:NeoBundle-examples|.
" Note: You don't set neobundle setting in .gvimrc!

call neobundle#end()

" Required:
filetype plugin indent on

"$HOME If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
```

```vim:~/.vimrc
source ~/.neobundle
```
Docker Memo


色々忘れるしオプション多いので。思い出し程度に継ぎ足して言う形。

## ホスト側のディレクトリとDockerのディレクトリを共有

1. DockerファイルにVOLUME を書く？
2. `docker run `に`-v <LocalPath>:<docker path>:<rw?>` オプションを追加

3. ファイルの共有もできる `-v ~/.bashrc:/root/.bashrc`



## Shell を使う

sshd をいちいち立てたくない時に使う方法で、nsenterを使う。

### インストール

```shell
> docker run -v /usr/local/bin:/target jpetazzo/nsenter
```

### 使い方

インストールしたらコンテナに入る

```shell
> nsenter --target $PID --mount --uts --ipc --net --pid /bin/sh
```

PID は DockerコンテナのPID。


### コンテナのPID確認方法

例えば、プロセスツリーを見て確認する。

```shell
> ps -awwux --forest
root     30712  0.5  4.2 1021992 43864 ?       Sl   Sep11  12:04 /usr/bin/docker -d
root     31201  0.0  0.0   4392   320 ?        Ss   16:07   0:00  \_ /bin/sh -c php5-fpm /bin/bash
root     31246  0.0  1.6 409752 16852 ?        Ss   16:07   0:00  |   \_ php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
33       31267  0.0  1.3 412016 13924 ?        S    16:07   0:00  |       \_ php-fpm: pool www
33       31268  0.0  1.3 412460 13944 ?        S    16:07   0:00  |       \_ php-fpm: pool www
999       1182  0.1 10.8 482708 110356 ?       Ssl  16:29   0:01  \_ mysqld --datadir=/var/lib/mysql --user=mysql --init-file=/tmp/mysql-first-time.sql
```

この場合、php-fpm のコンテナに入る場合、PIDは31201になる。

## Network

Docker 内は 172.14.*.* 的なネットワークでつながっている。Port Foward したくないアプリケーションを使う場合は、IPアドレスを調べて設定する方法がある。

### Docker コンテナのIPアドレスの調べ方

```shell
> $ sudo docker inspect <Container Name or ID> | grep IPAddres | awk -F'"' '{print $4}'
```

2014/09/14 追記: 公式ドキュメントにちゃんと書いてた

```shell
> $ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' <Container Name or ID>
```

## MySQLを使う

こんな感じでさくっと使える。MySQLの細かいオプションなどを指定したい場合は、Dockerfile を https://registry.hub.docker.com/_/mysql/ あたりから落としてきて頑張って。

```shell
> sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=<password> -d mysql
```

接続には、IPを調べてこんな感じ

```shell
> mysql -uroot -p --host 172.14... --port 3306
```

# 参考

- https://docs.docker.com/reference/builder/
- https://registry.hub.docker.com/_/mysql/
- http://postd.cc/docker-ssh-considered-evil/
- http://hidemium.hatenablog.com/entry/2014/05/12/012245
- https://docs.docker.com/userguide/usingdocker/
[RSpec3]異常系テストの場合expectの引数はブロック構文だった


RSpecで異常系テストを書くとき
正常系テストと同じに何も考えず



```language:ruby 

context 'when input is nil' do
  it 'raise error' do
      expect ( fetch(id) ).to raise_error(ArgumentError)
  end
end

```

てやるとうまくいかず、
よくよくネット上のサンプルみたらブロックを引数に渡していました

```language:ruby

context 'when input is nil' do
  it 'raise error' do
      expect { fetch(id) }.to raise_error(ArgumentError)
  end
end

```

ブロックなので do~endでもうまくいきます

```language:ruby

context 'when input is nil' do
  it 'raise error' do
      expect do fetch(id) end.to raise_error(ArgumentError)
  end
end

```

可読性低いですけど。
ただ

do ~ end と{} は結合の強さというものが違うため、
その違いはあとで調べることにする。
【プログラミング48(/2 -1)手】Composite


## ポイント
Composite（合成）パターン。
例えば、ディレクトリとファイルなどのような、木構造を伴う再帰的なデータ構造を表すときに用いられるようなパターン。


## サンプルコード
以下サイトと同じコード。
http://morizyun.github.io/blog/ruby-design-pattern-04-composite/

```ruby:Composite.rb
class Entry
    def get_name
    end
    def ls_entry(prefix)
    end
    def remove
    end
end

class FileEntry < Entry
    def initialize(name)
        @name = name
    end
    def get_name
        @name
    end
    def ls_entry(prefix)
        puts(prefix + "/" + get_name)
    end
    def remove
        puts @name + "を削除しました。"
    end
end

class DirEntry < Entry
    def initialize(name)
        @name = name
        @directory = Array.new
    end
    def get_name
        @name
    end
    def add(entry)
        @directory.push(entry)
    end
    def ls_entry(prefix)
        puts(prefix + "/" + get_name)
        @directory.each do |e|
            e.ls_entry(prefix + "/" + @name)
        end
    end
    def remove
        @directory.each do |i|
            i.remove
        end
        puts @name + "を削除しました。"
    end
end

tmp = DirEntry.new("tmp")
tmp.add(FileEntry.new("conf.html"))
tmp.add(FileEntry.new("data.html"))
root = DirEntry.new("root")
root.add(tmp)
root.ls_entry("")
root.remove
```
* 枝：DirEntryクラス
* 葉：FileEntryクラス

## 所感
* 再帰処理などをシンプルに書けそう。

## 参考
http://morizyun.github.io/blog/ruby-design-pattern-04-composite/
http://www.nulab.co.jp/designPatterns/designPatterns2/designPatterns2-4.html
Goを勉強しはじめた時にたどり着いたリンク集

1ヶ月くらいGoの勉強をしたときにたどり着いたリンク集。
(適時追加中)

# ページ

* [A Tour of Go](http://tour.golang.org/) - 最初にここ。ただし、量と途中のエクササイズの問題の分かりにくさで、最初から全てを理解するのは大変。
* [go-wiki](https://code.google.com/p/go-wiki/w/list) tips的な
* [Golang JP](https://plus.google.com/communities/107075098212007233819) - Google+のコミュニティ
* [build web application with golang](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/ebook/preface.md) - Goでウェブサービスを開発する場合の説明。
* [Go言語での構造体実装パターン](http://blog.monochromegane.com/blog/2014/03/23/struct-implementaion-patterns-in-golang/) - 構造体の使い方
* [Go Language Patterns](http://www.golangpatterns.info/) - 『You should have already read the [Go Tutorial](http://golang.org/doc/go_tutorial.html) and [Effective Go](http://golang.org/doc/effective_go.html).  This site is the next step.』

# スライド

* [Go For Perl Mongers](http://yapcasia.org/2014/talk/show/2276d7b2-eba7-11e3-bd6d-c7a06aeab6a4) - YAPC::Asia TOKYO 2014のプレゼン。Goをさわりはじめた頃に読みたかった。動画あり。
  * [42: When in Golang, Do as the Gophers Do (lestrrat - Rebuild.fm)](http://rebuild.fm/42/) - Rebuild.fmのGo言語についての回。上のプレゼンの元の話が。
* [Goのテストの基本と開発フロー ](https://speakerdeck.com/ymatsuwitter/gofalsetesutofalseji-ben-tokai-fa-huro) - Goでのテストについて。

* [Twelve Go Best Practices](http://talks.golang.org/2013/bestpractices.slide#1) - 12のプラクティス。Goがどういうものかをなんとなく知るのに。
* [Go Concurrency Patterns](http://talks.golang.org/2012/concurrency.slide#1) - GoのConcurrencyパターン集。A Tour of Goでgoroutineがちょっとでもわかったらこっち。
* [マスター・オブ・Reflectパッケージ](http://www.slideshare.net/takuyaueda967/reflect-27186813) - interface{}と上手につき合うために必要になってくるreflectのスライド。

# The Go Blog

* [JSON and Go](http://blog.golang.org/json-and-go) - JSONよく取り扱ってたので。
* [Go Concurrency Patterns: Context](http://blog.golang.org/context)
* [Go Concurrency Patterns: Timing out, moving on](http://blog.golang.org/go-concurrency-patterns-timing-out-and)
* [Go Concurrency Patterns: Pipelines and cancellation](http://blog.golang.org/pipelines) - 3つとも平行処理のパターン。スライドのGo Concurrency Patternsに同様の話が。

# ライブラリ

* [godepを利用して依存ライブラリの管理を行う](http://qiita.com/futoase/items/c778ee432e691a744742) - パッケージ管理をしたいときに。
* [gom - Go Manager](https://github.com/mattn/gom) - Bundlerっぽくパッケージ管理をしたいときに。

# ツール

* [vim-go](https://github.com/fatih/vim-go) - vimを使うなら絶対使う。むしろ、vim-goを使うためにvimを使うくらい便利。
* [Dash](http://kapeli.com/dash) - Go直接関係無いけど、godocで調べるよりなんだかんだで使ってしまう。

# あとで読む

* [お気楽 Go 言語プログラミング入門](http://www.geocities.jp/m_hiroi/golang/index.html) - 入門。まだ目を通していない。
* [質実Go研](https://github.com/goken/goken) - http://goken.connpass.com/event/6114/ の議事録?
* [Advanced Go Concurrency Patterns](http://blog.golang.org/advanced-go-concurrency-patterns) - Go Currency Patternsの続編。
* https://github.com/facebookgo/ - 読むといろいろ面白そう
ArchLinux キーボードバックライトの設定

[Arch Wiki Macbook](https://wiki.archlinux.org/index.php/MacBook_(%E6%97%A5%E6%9C%AC%E8%AA%9E)) を参考に標準設定諸々めも。

下記環境で設定
PC: MacBook Pro 
OS: ArchLinux
Desktop: KDE
<br>

#####バックライトの設定方法色々
* * *
・標準設定ファイルを編集。(/sys/class/leds/smc::kbd_backlight)
・AURから[kbdlight](https://aur.archlinux.org/packages/kbdlight/)をインストール。
・ARUから[sxhkd](https://wiki.archlinux.org/index.php/Sxhkd)をインストール。


設定が簡単そうだったので、今回はkbdlight を入れてみた。
<br>

#####pacaur でインストール
* * *
AURからインストール

```
$ pacaur -S kbdlight
```  
<br>

#####バックライトの設定
* * *
下記コマンドで、バックライト光度の調整ができる。

```
# バックライトの光度1段階up
$ kbdlight up

# バックライトの光度1段階down
$ kbdlight down

# バックライトの光度MAX
$ kbdlight max

# バックライトOFF
$ kbdlight off

```

コマンド名そのままなので、説明書く必要ないね。
これで、きらりと光るキーボードライフの始まり。
テンション上がるね！
iPhoneがオワコンだ！今すぐアプリ開発を乗り換えよう！…どこに？

9月10日にAppleからiPhone6やApple Watchの発表がされましたが、その評価は賛否両論あります。中には今回の発表に失望したという方もいらっしゃるようです。
開発者としては（クロスプラットフォームでなければ）流行りそうなプラットフォームに乗っかってアプリを開発したいものです。そんな中で、今回のAppleの発表は中々衝撃的ではなかったでしょうか。

じゃあいざ他のプラットフォームに乗り換えよう、というときの移行先の開発環境を作るのに参考になるページを集めてみました。

----

Android
====
いわずと知れたiOSのライバルにして現在スマートフォンシェアトップのOSです。
Androidの開発環境は主に、昔からある **Eclipse + Android SDK** と、ベータ版の **Android Studio** があります。

Eclipse + Android SDK
----
[Android SDK | Android Developers](http://developer.android.com/sdk/index.html "Android SDK | Android Developers")
[» Android Tech Fun.cc](http://techfun.cc/android "» Android Tech Fun.cc")

Android Studio
----
[Android Studio | Android Developers](http://developer.android.com/sdk/installing/studio.html "Android Studio | Android Developers")
[僕がEclipseをやめてAndroid Studioを使っている10の理由 - ナカザンドットネット](http://blog.nkzn.info/entry/2014/03/21/015914 "僕がEclipseをやめてAndroid Studioを使っている10の理由 - ナカザンドットネット")
[Windows で Android Studio のダウンロードとインストールとテスト実行](http://www.kkaneko.com/rinkou/js/aswin.html "Windows で Android Studio のダウンロードとインストールとテスト実行")

Windows Phone
====
世界でシェア伸ばしていますし、開発側からすればXAMLでの画面構築とかiOSやAndroidよりずっと扱いやすくて面白いと思うんですが、いつ日本で端末扱うの？

[Windows Phone - Windows Phone 開発について学び、初めてのアプリケーションを作成する - MSDN](http://msdn.microsoft.com/ja-jp/ff380145.aspx "Windows Phone - Windows Phone 開発について学び、初めてのアプリケーションを作成する - MSDN")


Firefox OS
====
何よりも魅力はWebアプリケーションの技術だけでアプリが作れること！
HTMLで標準化されていないような技術はMozilla独自のAPIを使って実装します。
ただ、まだ発展途上という感じ。

[Firefox OS Simulator - 開発ツール | MDN](https://developer.mozilla.org/ja/docs/Tools/Firefox_OS_Simulator "Firefox OS Simulator - 開発ツール | MDN")
[アプリ開発者向け ドキュメント | Firefox OS コミュニティ！](http://fxos.org/apps/ "アプリ開発者向け ドキュメント | Firefox OS コミュニティ！")

----

Windows PhoneのアプリはWindows8アプリとのクロスプラットフォームで開発できるし、Firefox OSのアプリは普通のWebアプリとのクロスプラットフォームで開発できるしで、面白いですよ！

シェア？ちょっとよくわかんないですね。
都道府県名に多く使われている漢字

小学生向け教材によると、都道府県名に使われている漢字のランキングは次の通り。

- 山（6）
- 島（5）
- 岡、川、福（3）

福岡、岡山、福島の響きの共通性の要因は、ここにあるかもしれない。
Go言語に触れてみる


最近ちょいちょいGo言語の話を聞くし，
python以外にも触れる言語増やしていきたいからやってみる．


# インストール

自分はmacだから`homebrew`でインストールできるのありがたい．

```shell
> brew install go
# version確認
> go version
go version go1.3.1 darwin/amd64
```

# .zshrcに追加
```.zshrc
export GOPATH=$HOME/Documents/programming/go
export PATH=$PATH:$GOPATH/bin
```


# 開発環境

普段Sublime Textを使っているので，プラグイン`Gosublime`をインストール
`Ctrl+Command+p` -> `Package Control Install` -> `Gosublime`
よしなに補完してくれるのありがたい，

でっも今のところ`package "fmt"`が補完してもらえない理由分からない．


# お決まりのHelloWorld

## ソースコード

```hello.go
packge main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}
```

## ビルド，実行

```shell
> go build hello.go
> ./hello
Hello World!
```

結構面白そうだし，ちょっとずつ勉強してみようかな！




参考：
[http://sessan.hatenablog.com/entry/2013/06/23/160916](http://sessan.hatenablog.com/entry/2013/06/23/160916)
[http://d.hatena.ne.jp/hiro_nemu/20140113/1389620004](http://d.hatena.ne.jp/hiro_nemu/20140113/1389620004)
LPI Level1 Exam 101 Chap01

# 第一章 システムアーキテクチャ
## 1.1 ハードウェアの基本知識と設定

> UEFI(Unified Extensible Firmware Inteface)：BIOSの後継となるファームウエアの規格

※/proc以下のファイル

|ファイル名|説明|
|:--|:--|
|/proc/bus/usb/*|USBデバイス情報|
|/proc/cpuinfo|CPU情報|
|/proc/interrupts|IRQ情報|
|/proc/pci|PCIデバイス情報|
|/pcor/scsi/scsi|SCSIデバイス情報|

> udev(Userspace DEVice managemnet)：必要なデバイスファイルを必要となった時点で動的に生成される。
> /devディレクトリ配下にデバイスファイルを作成する。

## 1.2 システムの起動とランレベル

### システムが起動するまでの流れ
BIOS
⇒ ブートローダ
⇒ カーネル
⇒ init

### 起動時のイベント確認
```bash
$ dmesg
# cat /var/log/messages
# cat /var/log/boot.log
```

### /sbin/init
init処理順
init が /etc/inittab を読み込む。
⇒ init が /etc/rc.sysinit スクリプトを実行する。
⇒ init が /etc/rc スクリプトを実行する。
⇒ /etc/rc スクリプトが /etc/rc<ランレベル>.d ディレクトリ以下のスクリプトを実行する。

## 1.3 ランレベルとシャットダウン

### ランレベル
RH 系

|ランレベル|説明|
|:--|:--|
|0|停止|
|1|シングルユーザモード|
|2|マルチユーザーモード(テキストログイン、NFSサーバーは停止)|
|3|マルチユーザーモード(テキストログイン)|
|4|未使用|
|5|マルチユーザーモード(グラフィカルログイン)|
|6|再起動|
|S または s|シングルユーザーモード|

Debian 系

|ランレベル|説明|
|:--|:--|
|0|停止|
|1|シングルユーザーモード|
|2|マルチユーザーモード|
|3|マルチユーザーモード|
|4|マルチユーザーモード|
|5|マルチユーザーモード|
|6|再起動|
|S または s||

#### シングルユーザーモード
* rootユーザだけが利用できるモード
* メンテナンス時に有効
* ログインなしでシステムが利用できる(パスワード再設定時に有効)

#### 起動スクリプト
各種サービスのスクリプトは /etc/init.d ディレクトリ配下に配置されている。
RSpec3.1の変更点の一覧

詳しくは[RSpec3.1の主な変更点のブログ記事](http://blog.enogineer.com/2014/09/12/rspec-3.1-release/)にまとめましたが、要約をまとめておきます。

## Backtraceフィルタの変更

gemの中のbacktraceをデフォルトで表示する。

## –exclude-patternオプションの追加

```
$ rspec --pattern "spec/**/*_spec.rb" --exclude-pattern "spec/acceptance/**/*_spec.rb"
```

```Ruby:Rakefile
require ‘rspec/core/rake_task’

desc "Run all but the acceptance specs"
RSpec::Core::RakeTask.new(:all_but_acceptance) do |t|
  t.exclude_pattern = "spec/acceptance/**/*_spec.rb"
end
```

## スタンドアロンでも設定なしで動く

rspec-expectationやrspec-mocksがなくても動く

## .rspecを–warningsフラグtrueで生成しない

Railsで.rspecを自動生成した時の--warningsのデフォルト値をtrueにしないように。

## have_attributesマッチャの追加

```rb
Person = Struct.new(:name, :age)
person = Person.new("Alice", 20)
expect(person).to have_attributes(name: "Alice", age: 20)

## an_object_having_attributes
people = [Person.new("Alice", 20), Person.new("Bob", 30)]
expect(people).to match([
  an_object_having_attributes(name: "Alice", age: 20),
  an_object_having_attributes(name: "Bob",   age: 30)
])

## receive with
expect(article).to receive(:author=).with(
  an_object_having_attributes(name: "Alice")
)
```

## Compoundマッチャをブロックでも利用可能

```rb
x = y = 0
expect {
  x += 1
  y += 2
}.to change { x }.to(1).and change { y }.to(2)
```

## define_negated_matcherの追加

```rb
RSpec::Matchers.define_negated_matcher :exclude, :include

## example
expect(odd_numbers).to exclude(14)

## compound matcher example
adults = Town.find("Springfield").adults
marge  = Character.find("Marge")
bart   = Character.find("Bart")

expect(adults).to include(marge).and exclude(bart)
```

## カスタムマッチャチェインをdescriptionにも出力

```rb
Spec::Matchers.define :be_smaller_than do |max|
  chain :and_bigger_than do |min|
    @min = min
  end

  match do |actual|
    actual < max && actual > @min
  end
end
```

```
Failure/Error: expect(5).to be_smaller_than(10).and_bigger_than(7)
  expected 5 to be smaller than 10 and bigger than 7
```

```rb:spec_helper.rb
# デフォルトoffなので設定が必要
RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end
end
```

## *_spyメソッドの追加

```rb
spy = double.as_null_object
expect(spy).to have_received(:foo)
```

```rb
spy(...)          # double(...).as_null_object と同じ
instance_spy(...) # instance_double(...).as_null_object  と同じ
class_spy(...)    # class_double(...).as_null_object と同じ
object_spy(...)   # object_double(...).as_null_object と同じ
```

## and_wrap_originalの追加

```
allow(api_client).to receive(:fetch_users).and_wrap_original do |original_method, *args|
  original_method.call(*args).first(10) # テスト時は10ユーザだけ取得する
end
```

## Rails4.2の公式サポート

RSpec3.1からRails4.2を公式サポート。

## rails_helper.rbではspec/supportを自動ロードしない

rails_helper.rbではspec/supportを自動ロードしないように。
ソフトウェア原則[1] - OCP(Open-Close Principle)

この記事は、2003年にメルマガ[「週間オブジェクト倶楽部」](http://objectclub.jp/ml-arch/magazine/2.html)に書いていた記事を若干編集・修正してQiitaに転載するものです。

* 元記事：[ソフトウェア原則[1] - OCP(Open-Close Principle)](http://objectclub.jp/technicaldoc/object-orientation/principle/principle01)

# ソフトウェア原則[1] - OCP(Open-Close Principle)

[週刊オブジェクト倶楽部 2003-01号の書評『オブジェクト指向入門』](http://objectclub.jp/ml-arch/magazine/2.html)の中で、

OCP"Open-Close Principle"として、

>「ソフトウェアモジュールは、変更に対して閉じており、拡張に対して開いているべき」

を紹介しました。第1回目は、このOCP からです。次のC言語コードを見てどう思いますか？

```shape.h
typedef struct { int x, y; } Point;
typedef struct { Point p1, p2; } Line;
typedef enum { LINE, POINT } Kind;
typedef union { Point* point; Line* line; } ShapeUnion;

typedef struct {
  Kind kind;
  ShapeUnion of;
} Shape;
```
```draw.c
#include "shape.h"
void draw(Shape* shape) {
  switch(shape->kind) {
  case LINE:
  /* draw line (shape->of->line.p1  ---- shape->of->line.p2) */
  break;
  case POINT:
  /*  draw point (shape->of->point)*/
  break;
  }
}
```

これは、私が15年前に書いたコードです。なかなかイケてるでしょ？

(編集注: 現在から26年前になってしまった。。。特に、union を of で参照しているのが気に入っていました) 

でも、Kindとして新たにCIRCLEを追加したとき、このdraw関数を修正し、 case CIRCLEを追加しなければならいのです。

では、どうするの？C++では、

```shape.h
class Shape {
  public:
    virtual void draw() = 0;
};
```
```point.cc
#include "shape.h"
class Point : public Shape {
    int x, y;
public:
    void draw() { /* draw point (x,y) */   }
};
```
```line.cc
#include "shape.h"
class Line : public Shape {
    Point p1, p2;
public:
    void draw() { /* draw line p1-p2 */ }
};
``` 

と書くことができます。このようにすると、Circleの追加は、「既存のプログラムを全く変更せずに」(再コンパイルさえも！)できるのです。これが、 CloseしているプログラムをOpenにするというオブジェクト指向プログラミング の1つの真骨頂なのです。

* **修正の論理を、追加の論理に変換している**

といえます。

ちなみに、オブジェクト指向プログラミングでは、構造化プログラミングで gotoが悪だったように、switch分岐は悪と言われています。 (2箇所以上同じ分岐がある場合)。

後日談（編集注：11年前の後日談です）。

現在では、『リファクタリング』という再設計技術が注目されるようになり、 コード1をコード2に再設計することを、Replace Conditional With Polymorphism (多態による条件分岐の置き換え)と呼んでいます。また、switch文が必ずしも 悪という訳ではなく、同じパターンのswitchが繰り返されることが悪だ、と いう解釈になっています。(Once and Only Onceの原則)


（編集時追加）参考：

* [「Bertrand Meyer「オブジェクト指向入門」めも」](http://qiita.com/satton_maroyaka/items/b791ee17409aeec4c4e3)(@satton_maroyakaさん)
* [「オブジェクト指向の法則集」](http://qiita.com/kenjihiranabe/items/9eddc70e279861992274)(石井勝さん)
* [「開放閉鎖原則と expression problem」](http://qiita.com/magicant/items/be6129aa601e87e089d3)(@magicant さん)
Herokuでプロセスが暴走しちゃった時の再起動方法

「Delayed Jobsが暴走しているっｔっっっｔ(；ω；）再起動しなければっっｔ」なんて時のためのメモです。

普通に「heroku restart」 すると楽なのですが、rails側も再起動されてしまうので、ちょっと避けたいですよね。

今回の方法は、任意のプロセスのみ再起動させる方法です。

まず、起動しているプロセスを確認します。

```bash
$ heroku ps

=== web: `bundle exec rails server -p $PORT`
web.1: up for 15h
web.2: up for 15h

=== worker: `bundle exec rake jobs:work`
worker.1: up for 15h
```

このうち、worker.1 のみを再起動します。

```bash
$ heroku restart worker.1
Restarting worker.1 process... done
```

これでおｋです。


ちなみにherokuでは、下記のタイミングで自動的に再起動してくれます。さすが。

* コードがデプロイされたとき
* configを変更したとき
* add-onを変更したとき
* メモリをたくさん使ったとき(512MBを3回だそうです)

なので、普段は再起動を意識する必要はないかと思いますが、ここぞという時に。

参考URL：

https://devcenter.heroku.com/articles/ps#process-restarts

https://devcenter.heroku.com/articles/dynos#automatic-restarts
二段階認証（Two-Factor Auth)の実装


ふと思い立って、GmailにTwo-Facotr Auth（二段階認証/二要素認証）をかけてみました。次にEvernoteにも設定した時に、[Google謹製のアプリ](https://support.google.com/accounts/answer/1066447?rd=1)でEvernote用のワンタイムパスワードを発行できることに疑問を感じました。

ログイン時に「一定時間有効なIDを発行する」のはサーバー上で逐次生成してExpireを設定すれば可能ですが、他社でも共通になる仕組みはどのようになっているのかと思って調べてみたらなかなか面白かったでメモしておきます。

## 仕組み

実はRFCで規定されているアルゴリズムを使ったオープン実装でした。
http://ja.wikipedia.org/wiki/Google_Authenticator

* サーバー上で秘密鍵を生成し、ローカルとサーバーに保存する
* この秘密鍵と時間を元にして30秒間有効なワンタイムパスワードを生成する
* サーバー上でも同じアルゴリズムを使って照合する

ここで生成する秘密鍵はユニークに生成するのは当然。秘密鍵をサーバー所に保存せずユーザー情報のHash等にすると、漏洩した時に他の人のキーも推測されてしまいますし、リセットもできなくなります。

アプリ（ローカル）にはこの秘密鍵をBase64した16文字のキーを渡しておきます。アプリ側ではユーザーには秘密鍵は参照できないようにしておきます（再登録等の場合は再生成でセキュリティを確保）

## 実装

詳しい解説はここにありました
http://yamatamemo.blogspot.jp/2011/06/oath-3.html

と思ったらちゃんと実装してGem化してくれていました。すばらしい。

[Ruby One Time Password library](http://rubydoc.info/github/mdp/rotp/master/frames)というものがあるようなので使ってみます。

###インストール

>~ gem intall rotp

### 使い方

下記のように秘密鍵を与えてnewしてからnowを呼ぶとワンタイムパスワードが返ってきます。

```
totp = ROTP::TOTP.new("base32secret3232")
totp.now # 例：=> 492039

# 上のコードでチェックを行う(30秒有効)
totp.verify(492039) # => true
sleep 30
totp.verify(492039) # => false
```

もちろん、この時の秘密鍵が同じであれば同じワンタイムパスワードになるので２段階認証をONにするタイミングで下記のようにしてユニークなキーを作成して保存しておきます。

```
ROTP::Base32.random_base32 # 例：=> "5lrymooffwxl4ltq"
```

後は、ログイン時に秘密鍵があれば、ワンタイムパスワードを生成して[Twillio](http://twilio.kddi-web.com)等を利用してSMSに送信してコード入力を促す部分を作ってVerifyすればOKです。

## ぶつぶつ

モバイルデバイス必須ですが、難しい事を考えずにRubyや他の言語でも簡単に実装できます。

有効期限30秒以下ってSMSの通知速度や時刻ズレを考えるとかなり厳しいような気がしますが、サーバーとスマホは時刻同期されているし、ログインしようとしてページを開いている時の通知なのでそれでも十分なのですね。

ワンタイムパスワードってキーホルダー型トークンとかトークン発生サーバーとか必要なイメージがあったのですが、これならうちの業務サイトでも実装できそうだな...と思いました。
Swiftで自分のクラス名を表示する方法

## Swiftで自分のクラス名を表示する方法

NSOdjectのサブクラスのdiscriptionメソッドとかで自分のクラス名を表示したいと思ったのだけど、
Swiftではself.classが使えない。

discriptionメソッドで使うだけなので別にクラス名直書きでもいいのだけれど、
なんだかすっきりしないので調べてみた。

コンソール出力や、Unit testなどでクラスを比較するときに使える。

## サンプルプロジェクト

https://github.com/satomikko94/PrintProjectName

## 実行結果

(コンソール出力)

```
Class name : PrintProjectName.PrintClassName or 
Class name : PrintProjectName.PrintClassName

```

## 解説

PrintClassName内のdescriptionメソッドで、
{Project Name}.{Class Name}
の形式でクラス名(及びプロジェクト名)を返している。


```swift

func description() -> String {
    return "Class name : \(NSStringFromClass(self.dynamicType)) or \nClass name : \(reflect(self).summary)"
}

```

### NSStringFromClass(self.dynamicType)

dynamicTypeを使うと、インスタンスのクラス自身（サブクラス化されていればサブクラス）が参照される。 
(参考 : [インスタンスメソッド内でクラスメソッドを呼ぶ #Swift](http://qiita.com/ikesyo/items/f95a75851dadf417f0d1))

Objective-Cの`self.class`とだいたいおなじように`self.dynamicType`が使えると思われる。

ただ、`self.dynamicType`はそのままコンソール出力すると`(MetaType)`と出力されるだけなので、
`NSStringFromClass`を利用してStringに変換すればOK！


### reflect(self).summary

`reflect()`メソッドはオブジェクトの情報を取得するメソッド。
そこに`.summary`をつけることで、String形式に変換している。


### これじゃだめだった

```swift
println("\(self.dynamicType)")
// Prints "(Metatype)"

println("\(object_getClassName(self))");
// Prints "0x7b680910 (Pointer)"

println("\(self.className)")
// Compile error!

println(PrintClassName.self)
// Prints "(Metatype)"
```
お財布を大事にする人のherokuプロセスコマンドまとめ

herokuはgit pushコマンドでアプリが立ち上がり、
コマンド一発でサーバー増強させることができ大変便利です。

このとき増強に使われるワーカープロセスは時間課金・有料ですので、
けちんぼ(´・ω・｀)なわたしはこまめに操作してますです。

よく使うコマンドは以下のとおり。

```bash
$ heroku ps # 起動しているプロセスを確認する
```

```bash
$ heroku ps:scale worker=1 # ワーカープロセスを1つにします。
```

```bash
$ heroku restart worker.1  # 1番目のワーカープロセスを再起動します。
```

```bash
$ heroku ps:scale worker=0 # ワーカープロセスを0にします。お財布のために大事！
```

```bash
$ heroku logs -p worker -t #ワーカープロセスのコンソールログを見る
```

以上、クレカを見て青ざめたのでまとめてみました。