OmniAICreator/Qiita-1.07M huggingface dataset:
Haskellでソート済みリストを扱うモジュール：Data.List.Ordered

Haskellで無限リストを扱っていると、ソート済みの無限リスト2つをソート順を保ったままunionしてほしいことがあります。しかし、Data.List.unionはそんな動作ではありません。

```hs
import Data.List
xs = take 6 $ union [3,6..] [5,10..]
-- [3,5,6,9,10,12]を期待
-- 実際に帰ってくるのは[3,6,9,12,15,18]
```

こんなときにはData.List.Orderedモジュールが利用できます。Data.List.Ordered.unionを使うと、当初期待したような結果が得られます。

```hs
import qualified Data.List.Ordered as Ordered
xs = take 6 $ Ordered.union [3,6..] [5,10..]
-- [3,5,6,9,10,12]
```

# インストール

Data.List.Orderedは標準モジュールではないので、個別にインストールする必要があります。

```
$ cabal install data-ordlist
```

といっても、毎度おなじみの手順ですね。

# 使い方

Data.List.Orderedはソート済みのリストを扱うのに便利です。無限リストで取り扱える関数が増えたり、効率がよくなったりします。

たとえば、Data.Listの(\\\\)は無限リストを上手く扱えませんが、Data.List.Ordered.minusは無限リストを与えても期待通りの結果を返します。

```hs
import qualified Data.List.Ordered as Ordered
xs = Ordered.minus [1..20] [2,4..]
-- [1,3,5,7,9,11,13,15,17,19]
```

また、Data.List.Ordered.nubはソート済みリストを仮定しているため、O(n)で結果を返せます。ただし、未ソートのリストを渡すと変な結果になります。ちなみにData.List.nubはO(n^2)です。

```hs
import qualified Data.List.Ordered as Ordered
xs = Ordered.nub [1,1,1,2,2]
-- [1,2]
ys = Ordered.nub [2,0,1,3,3]
-- [2,3]
-- Data.List.nubなら[2,0,1,3]を返す
```

Data.List.Orderedモジュールの関数にはソート済みリストを渡さないと期待通りの結果は得られません。ただし、sort, nubSort, isSorted とその仲間の関数だけは未ソートのリストを渡すことができます。

詳しくは「[Data.List.Ordered](http://hackage.haskell.org/package/data-ordlist-0.4.6/docs/Data-List-Ordered.html)」を確認してみてください。

# おわりに

ちなみに、僕はほぼ同じものを自作しており、エラトステネスの篩で素数の倍数を除外したりするのに利用していました。自分なら他のものを使うなー、という方は是非教えてください。
メニューを作る基本（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語で、メニューを作る基本です。

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

## サンプルコード

プロジェクトを新規作成で作成します。（FileメニューのNew->Cocos Lua Project...から作成できます。）
プロジェクト名は適当につけてください。画面は縦画面(portrait)を指定します。

main.luaファイルを修正します。

```lua:main.lua/26行目
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(320, 480, 0) -- 縦画面用に(480, 320, 0)から(320, 480, 0)に変更
```

```lua:main.lua/31行目
--gameScene:playBgMusic() --使わないのでコメントアウト
```

GameScene.luaを書き換えます。

```lua:GameScene.lua

require "Cocos2d"
require "Cocos2dConstants"

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()
    local visibleSize = cc.Director:getInstance():getVisibleSize()
    
    -- メニュー選択時に呼ばれるコールバック関数
    local function menuCallback(tag)
        print(string.format("メニュー%dが押されました", tag))
    end

    -- 1つ目のメニュー項目
    local menuItem1 = cc.MenuItemImage:create("menu1.png", "menu1_on.png")
    menuItem1:setPosition(0, 30)
    menuItem1:setTag(1)
    menuItem1:registerScriptTapHandler(menuCallback)

    -- 2つ目のメニュー項目
    local menuItem2 = cc.MenuItemImage:create("menu2.png", "menu2_on.png")
    menuItem2:setPosition(0, -30)
    menuItem2:setTag(2)
    menuItem2:registerScriptTapHandler(menuCallback)

    -- メニュー項目からメニューを作成してシーンへ追加
    local menu = cc.Menu:create(menuItem1, menuItem2)
    menu:setPosition(visibleSize.width/2, visibleSize.height/2)
    scene:addChild(menu)
    
    return scene
end

return GameScene
```

メニュー用の画像に、menu1.png、menu1_on.png、menu2.png、menu2_on.pngを用意してresディレクトリに追加します。
![menu1.png](https://qiita-image-store.s3.amazonaws.com/0/45447/05471d2e-9d7a-78af-79c0-5892e44737ae.png "menu1.png")menu1.png ![menu1_on.png](https://qiita-image-store.s3.amazonaws.com/0/45447/e84a300a-148b-870e-bb75-362c97465cc8.png "menu1_on.png")menu1_on.png
![menu2.png](https://qiita-image-store.s3.amazonaws.com/0/45447/8305be0c-97f2-ba4d-81af-f45246a1cff9.png "menu2.png")menu2.png ![menu2_on.png](https://qiita-image-store.s3.amazonaws.com/0/45447/65961000-398b-7770-65c5-6d2d1ece2a12.png "menu2_on.png")menu2_on.png




実行すると画面にメニューが表示されます。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/45447/b7f97a40-7d44-93ae-a53e-76448babfe31.png "ss.png")


## 解説

### メニュー選択時に呼ばれるコールバック関数を準備する

関数名は何でもかまいません。tagには選択されたメニューのタグ番号が入って呼ばれます。
この関数の中にメニューが呼ばれた時の処理を実装します。

```lua
-- メニュー選択時に呼ばれるコールバック関数
local function menuCallback(tag)
    print(string.format("メニュー%dが押されました", tag))
end
```

（修正：functionの前にlocalが抜けていました。）

### メニュー項目を作成する

画像からメニュー項目を作成しています。createの1番目の引数に通常時の画像、2番めに押された時の画像を設定します。
次に、メニュー項目の位置とタグを設定しています。
registerScriptTapHandlerメソッドでコールバック関数を指定しています。

```lua
local menuItem1 = cc.MenuItemImage:create("menu1.png", "menu1_on.png")
menuItem1:setPosition(0, 30)
menuItem1:setTag(1)
menuItem1:registerScriptTapHandler(menuCallback)
```
### メニュー項目からメニューを作成する

Menuクラスのcreateメソッドでメニュー項目(menuItem1, menuItem2)を指定してメニューを作成しています。
その後、メニューの表示位置を指定して、シーンへ追加しています。

```lua
local menu = cc.Menu:create(menuItem1, menuItem2)
menu:setPosition(visibleSize.width/2, visibleSize.height/2)
scene:addChild(menu)
```
Backbone.jsでjQueryのSortableを使用する際の小ネタ

#ViewでのSortableイベントの管理

Backbone.jsで、jQueryのSortableを使おうとした際にちょっと困ったことがあったのでメモ。

とあるTableにSortableを仕込もうと思って、Tableの初期化の際に

```view.js
var Table = Backbone.View.extend({
  className: "ui-sortable",
  initialize: function(){
    this.$el.sortable({
       start: function(e, ui){
         this.idx = ui.item.index();
       },
       update: function(e, ui){
         alert(this.idx);
       }
    });
  }
});
```

みたいな感じでinitialize内で設定していたが、この場合だと、thisがTableクラスを参照してくれないので、this.idxがエラーになってしまう。もしかしたらbindとかで上手く解決する事ができるかもしれないけど、自分はこれで解決した。

```view.js
var Table = Backbone.View.extend({
  initialize: function(){
    this.$el.sortable({});  
  },
  className: "ui-sortable",
  events: {
    "sortstart": "start",
    "sortupdate": "update"
  },
  start: function(e, ui){
    this.idx = ui.item.index();
  },
  update: function(e, ui){
    alert(this.idx);
  }
});
```
って感じです。
Mysqlのrootユーザのpasswordを初期化(変更)する

Mysqlのrootユーザのpasswordを変更する

1. mysqld_safeの場所を探し、skip-grant-tablesで起動します。普通のmysqldプロセスはstopかkillしておいてください。

```bash
$ mysql.server stop
$ /usr/local/bin/mysqld_safe --skip-grant-tables

140915 11:19:49 mysqld_safe Logging to '/usr/local/var/mysql/SPICE.local.err'.
140915 11:19:49 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
```

2. パスワード不要でrootログインができるようになります。

```bash
$ mysql -u root
```

3. 新しいパスワードに変更し、FLUSHします。

```bash
UPDATE mysql.user SET Password=PASSWORD('new password') WHERE User='root';
FLUSH PRIVILEGES;
```

4. mysqldを再起動します。

```bash
$ mysql.server restart
```
"diw"は "d + i + w" に分けて考える

「vimtutor」で基本操作を勉強したのち、最初につまづいたのが<br>

 <b>「"diw" = 単語ごとに削除」</b><br>

でした。コマンドから意味が推測出来ない。。<br>

色々調べてみたので、勉強したついでに整理してみました。

##オペレータの入力ルール
<b>"回数" + ["操作"](#sc1)  + ["範囲"](#sc2) + ["単位"](#sc3)</b> の組み合わせで決定する。

* "回数"は省略可能。(省略した場合は"1"回)
* "範囲"は"操作"によっては省略可能。(省略した場合は"a"選択と同様)

上記ルールに則って、操作、範囲、単位の引き出しを増やしていけばOKのようです。


詳しくは以下を参照。
##<a name="sc1">操作(代表例)</a>

| コマンド | 説明 |
|:-------:|:----------|
| d | 削除 (delete) |
| y | コピー (yank)   |
| p | 貼付け (paste)  |
| c | 削除+挿入(change) |


##<a name="sc2">範囲</a>
| コマンド | 説明      |詳細|
|:-------:|:-------|:-----|
| a | 単一 (冠詞の'a')  |区切り文字を含める。
| i | 内側 (inner)       |区切り文字を含めない。

おそらく一番分かりにくいのがココです。<br>
区切り文字とは、["単位"](#sc3)を区切る文字のことです。<br>
"w"なら空白文字、"t"ならHTMLタグなど。<br>

例１：「this is a pan.」に対する適用範囲(カーソルが先頭"t"に当たった状態)

* "aw" は「this 」 (空白文字(半角スペース)を含める)
* "iw" は「this」 (空白文字(半角スペース)を含めない)

例2：「`<p>this is a pan.</p>`」に対する適用範囲(カーソルが先頭"<"に当たった状態)

* "at" は「`<p>this is a pan.</p>`」 (HTMLタグを含める)
* "it" は「this is a pan.」 (HTMLタグを含めない)

##<a name="sc3">単位</a>
####文字
| コマンド | 説明 |詳細
|:-------:|:----------|:---------|
| w | 単語 (word) | アルファベット、数字、アンダースコアの連続した文字<br>※詳細は「:help word」参照 |
| W | 単語 (WORD)| word + 非空白文字(括弧や引用符など)で連続した文字<br>※詳細は「:help WORD」参照 |
| s | 文 (sentence) |'.', '!', '?' で終わり、その後に行末かスペースもしくはタブが続く文字列<br>※詳細は「:help sentence」参照
| p | 段落 (paragraph) |空行で囲われた文節の塊り<br>※詳細は「:help paragraph」参照
| t | HTML,XMLタグ (tag) |

####ブロック
| コマンド | 説明 |
|:-------:|:----------|
| b または ( または ) | ( )ブロック(block) |
| B または { または } | { }ブロック(Block) |
| [ または ] | [ ]ブロック |
| < または > | < >ブロック |

####引用符
| コマンド | 説明 |
|:-------:|:----------|
| ' | シングルクォーテーション |
| " | ダブルクォーテーション |
| ` | バッククォート |

##具体例
あとは上記内容を組み合わせればOKです。<br>
タイトルにも挙げた"diw"は

<b>"diw" = (delete inner word) =単語ごとに削除</b>

と分かります。

「this is a pan.」(カーソルが先頭"t"に当たった状態)で"diw"を実行すると、


"iw"(inner word) で指定した適用範囲「this」を"d"(削除)するので

「 is a pen.」

という結果になります。

##参考
勉強するにあたり、以下のサイトが分かり易かったです。

* [ドットインストール > vim入門 > #17 テキストオブジェクトを扱う](http://dotinstall.com/lessons/basic_vim/4617 )
RubyGem「Orenono」を使って簡単に「オリジナル言語」を作った



### RubyGem「Orenono」をインストールする

RubyGem「Orenono」リンク
 RubyGems.org: https://rubygems.org/gems/orenono
 GitHub: https://github.com/tbpgr/orenono


###「Orenono」をインストールする

```
$ gem install orenono
```

### 以下のコマンドを実行すると「Orenonofile」が生成される

```
$ orenono i
```

### 「Orenonofile」を編集する。
（コメント部分は省いてあります）

```Orenonofile
# encoding: utf-8

increment "集中しよう。"
decrement "疲れてきた。"
start_loop "コーディングに没頭する・・・・・・・・・・・・・・・・・。"
end_loop "ポモドーロタイマーが鳴った。"
next_cursol "いい調子！！"
previous_cursol "バグかな。"
display "できたっ！！！"
read "インターネットで情報収集。"
```

### ジェネレーターでオリジナル言語のソースコードを作成する

出力結果が「coding」と出力されるようにする

```
$ orenono g 'coding' > coding.my_lang
```

そうすると以下のようにソースコードが生成される

```coding.my_lang
集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。コーディングに没頭する・・・・・・・・・・・・・・・・・。いい調子！！集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。バグかな。疲れてきた。ポモドーロタイマーが鳴った。いい調子！！集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。できたっ！！！集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。できたっ！！！疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。できたっ！！！集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。できたっ！！！集中しよう。集中しよう。集中しよう。集中しよう。集中しよう。できたっ！！！疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。疲れてきた。できたっ！！！
```

### 実行してみる

```
$ orenono e coding.my_lang
coding
```
Linux コマンド #03

### export/unset
```bash
$ export 変数名[=値]
$ unset 変数名
```
環境変数の登録(export)と削除(unset)。
環境変数の参照は対象の変数名の先頭に$を付与し、**echo**コマンドで表示する。

```bash
$ echo $xxx

環境変数の一覧表示
$ env
$ printenv

環境変数とシェル変数の両方を表示
$ set
```

### man
```bash
$ man [オプション] [セクション] コマンド名あるいはキーワード
```
オンラインマニュアルを表示する。

|オプション|説明|
|:--|:--|
|-a|全てのセクションのマニュアルを表示する|
|-f|指定されたキーワード(完全一致)を含むドキュメントを表示する|
|-k|指定されたキーワード(部分一致)を含むドキュメントを表示する|
|-w|マニュアルの置かれているディレクトリを表示する|

### less
```bash
$ 
```
|オプション|説明|
|:--|:--|
|||
|サブコマンド|説明|
|:--|:--|
|||


Template
### 
```bash
$ 
```
|オプション|説明|
|:--|:--|
|||
|サブコマンド|説明|
|:--|:--|
|||
LPI Level1 Exam 101 Chap03


# 第三章 GNU & UNIX コマンド
## 3.1 コマンドライン操作

**シェル(shell)**
ユーザーからの個尾万度を受け付け、必要なプログラムを実行するプログラム

**シェルの種類**

|シェル名|説明|
|:--|:--|
|Bourneシェル(sh)|UNIXの標準的なシェル|
|bash(Bourne Again Shell)|shを改良したもの。多くのディストリビューションで標準シェルとなっている|
|Cシェル(csh)|C言語に似たスクリプトが利用できるシェル|
|tcsh|cshを拡張したシェル。LinuxでCシェルとして使われているのはtcsh。|
|Korn(ksh)シェル|Bourneシェルを拡張したシェル|
|zsh|kshにbash、tcshの機能を取り入れたシェル|


```bash:利用可能なシェルの確認
$ cat /etc/shells
```

**ログインシェル**
システムにログインした直後に起動されるシェル
/etc/passwd に各ユーザのログインシェルの設定をする。

```bash:シェルのプロンプトによりユーザが分かれる
$ スーパーユーザ(root)
# 一般ユーザ
```

**カレントディレクトリ(カレントワーキングディレクトリ)**
ユーザーが現在作業中のディレクトリ

**カーソル移動**

|コマンド|説明|
|:--|:--|
|Tab|文字列の補完|
|Ctrl+A|カーソルを行頭に移動|
|Ctrl+E|カーソルを行末に移動|
|Ctrl+D|カーソル部分の一文字を削除|
|Ctrl+H|カーソル左側の一文字を削除|
|Ctrl+L|画面をクリアしてからカレント行を再表示|
|Ctrl+C|処理の中断|
|Ctrl+S|画面への出力を停止|
|Ctrl+Q|画面への出力を再開|
|Ctrl+Z|処理を一時停止(サスペンド) ※1|
※1：サスペンドしたコマンドは「**fg**」で再開

**ディレクトリ指定**

|メタキャラクタ<br>(特殊記号)|説明|
|:--|:--|
|~|ホームディレクトリ|
|.|カレントディレクトリ|
|..|1つ上のディレクトリ|

**シェル変数**
有効範囲はその変数を定義したシェル・プロセスのみ
当該シェル・プロセスを終了すると変数の値も失われる

**環境変数**
その変数を定義したシェル上、及びそのシェルで実行されるプログラムにも引き継がれる。
シェル変数を**export**コマンドで設定する。

**主な環境変数**

|環境変数|説明|
|:--|:--|
|PATH|コマンドやプログラムを検索するディレクトリリスト|
|PWD|カレントディレクトリ|
|HOSTNAME|ホスト名|
|USER|現在のユーザー名|
|LANG|ロケール(言語処理方式)|
|HOME|カレントユーザーのホームディレクトリ|
|LOGNAME|ログインシェルのユーザー名|
|PS1|プロンプトの表示文字列|
|PS2|複数行にわたる入力時のプロンプト|
|HISTSIZE|コマンド履歴の最大値|
|HISTFILE|コマンド履歴を格納するファイル|
|HISTFILESIZE|HISTFILEに保存する履歴数|
|TERM|端末の種類|

定義された変数は「**echo**」コマンドを使って参照ができる。

```bash
$ echo $PATH
```

**パスの設定**

```bash
$ PATH=$PATH:/xxx/bin
```

**表記法**

* 絶対パス・・・最上位のディレクトリ(/)から表記する方法
* 相対パス・・・カレントディレクトリ(.)を基点とした方法

**内部コマンド/外部コマンド**

* 内部コマンド・・・シェル自体に組み込まれているもの
* 外部コマンド・・・独立したプログラムとして存在するもの

**コマンドの実行**

```bash
$ コマンド オプション 引数

$ AAA;BBB
※AAAに続いてBBBを実行する

$ AAA && BBB
※AAAが正常に終了した時のみBBBを実行する

$ AAA || BBB
※AAAが正常に終了しなかった場合のみBBBを実行する

$(AAA;BBB)
※ひとまとまりのコマンドグループとして実行する

${AAA;BBB}
※現在のシェル内でコマンドを実行する
```

### 引用符

* 「'」単一引用符(シングルクォーテーション)<br>⇒ 囲った中の文字列は、全て文字列として解釈される
* 「"」二重引用符(ダブルクォーテーション)<br>⇒ 文字列二重引用符内に変数がある場合は内容が展開される(※バックスラッシュ(\\)でエスケープが可能)
* 「`」バッククォーテーション<br>⇒ バッククォーテーション内にコマンドがあれば実行した結果が展開される


### コマンド履歴

|コマンド|説明|
|:--|:--|
|history|コマンド履歴の表示|
|↑(Ctrl+P)|一つ前のコマンドを表示する|
|↓(Ctro+N)|一つ次のコマンドを表示する|
|!文字列|実行したコマンドの中で、指定した文字列から始まるコマンドを実行する|
|!?文字列|実行したコマンドの中で、指定した文字列を含むコマンドを実行する|
|!!文字列|直前に実行したコマンドを再実行する|
|!履歴番号|履歴番号のコマンドを実行する|

※全ユーザーの環境変数は「**/etc/profile**」内の該当箇所を編集する。

|コマンド|説明|
|:--|:--|
|||

## 3.2 パイプとリダイレクト

## 3.3 テキスト処理フィルタ

## 3.4 正規表現を使ったテキスト検索

## 3.5 vi エディタ
RoadWorkerで管理するAWS Route53

#RoadWorker


AWSのRoute53の設定をRubyのDSLで管理できるCLIツール。

作成者サイト
http://so-wh.at/

Github
https://github.com/winebarrel/roadworker

##手順

###インストール

インストール

```
gem install roadworker --no-ri --no-rdoc
```

確認

```
➜   roadwork -v
roadwork 0.4.10

➜ roadwork
Usage: roadwork [options]
    -p, --profile PROFILE_NAME
    -k, --access-key ACCESS_KEY
    -s, --secret-key SECRET_KEY
    -a, --apply
    -f, --file FILE
        --dry-run
        --force
        --no-health-check-gc
    -e, --export
    -o, --output FILE
        --split
        --with-soa-ns
    -t, --test
        --nameservers SERVERS
        --port PORT
        --no-color
        --debug
```


security credentialsを記載

```
➜  vim ~/.aws/credentials
[default]
aws_access_key_id=AKIxxxxxxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxx
```


###Route53の情報を取得

```
roadwork -e -o Routefile 
```

```
cat Routefile
==========
osted_zone "domain.info." do
  rrset "domain.info.", "A" do
    ttl 60
    resource_records(
      "xxx.xxx.xxx.xxx"
    )
  end

  rrset "sub.domain.info.", "A" do
    ttl 300
    resource_records(
      "xxx.xxx.xxx.xxx"
    )
  end
==========
```

###テスト、設定適用

差分比較

```
➜ roadwork -t -f Routefile
```

dry-run

```
➜   roadwork -a -f Routefile --dry-run
Apply `Routefile` to Route53 (dry-run)
```

適用

```
➜   roadwork -a -f Routefile
```






###etc

コードはgitで管理するといい感じ。
Hello Vagrant


OSX 10.9.3を使用。

### インストールする

Install VirtauBox
https://www.virtualbox.org/

Install Vagrant
https://www.vagrantup.com/


それぞれ公式サイトからインストーラーをダウンロードする。vagrantはgemでの使用が非推奨になっているらしい。


### boxファイル用意する

boxファイルはvagrantが使用するイメージファイル的なもの。
https://vagrantcloud.com/ から探す
`$ vagrant box add https://vagrantcloud.com/hansode/boxes/centos-6.5-x86_64`
`$ vagrant box add https://vagrantcloud.com/ubuntu/boxes/trusty64`
を先にやっておけば、予めDLしておいたBoxファイルを使ってくれるのでvagrant upが早くなる。

### 環境を操作する  

`$ vagrant init trusty64` カレントディレクトリにVgrantfileを作成
`$ vagrant up` 起動(イメージがなければこの時点で落としてくる
`$ vagrant halt` 終了
`$ vagrant ssh` 
`$ vagrant ssh-config`
`$ vagrant destroy` 破棄

upしたときにsshのポート名やユーザ名を教えてくれるたぶんデフォルトがvagrant@vgrant
なので、`vgrant ssh` せずとも`ssh vagrant@vagrant 127.0.0.1 -p port`みたいな感じでも接続できる
MacからUbuntuにSSH接続し，tmux上でマウスによるコピーアンドペーストを行う


* 追記: 9/28

現在，Webアプリを作成する際に，MacからLinuxサーバへログインして作業しています．
tmuxには，デフォルトでコピーモードが用意されているようですが，どうにも使いづらかったので，マウスを使ってコピーアンドペーストする方法を探していました．
リモートログインせずに同様のことを行う記事は数多くあったのですが，今回の状況はWeb検索でもなかなか解決しなかったので，ログを載せておきます．

# やりたかったこと

Mac PC (OS X Marvericks)から，Linuxサーバ(Ubuntu 13.10)にSSHを用いたリモートログインを行い，接続先のLinuxサーバでtmuxを立ち上げた状況を仮定します．

SSH接続には公開鍵認証を使っているとします．

このtmux上でマウスによるコピーアンドペーストを行いたいです．

以下，Mac PCを「クライアント」，Linuxサーバを「サーバ」と呼ぶことにします．

# 手順

## クライアントの設定

[tmux上のコピペをうまく設定する方法](http://qiita.com/catatsuy/items/71b0f4932f00c6711ef5)

こちらの，"Macの場合"の設定を参考にする．
.zshrcは上記の記事の，「追記(2013-07-08)」の設定を参照した．

```bash:
lethe2211@client$ brew install reattach-to-user-namespace
```

```.tmux.conf
set-window-option -g mode-mouse on
```

```bash:.zshrc
alias tmux-copy='tmux save-buffer - | pbcopy'

if [ -n "$TMUX" ]; then
  alias pbcopy="reattach-to-user-namespace pbcopy"
fi
```

こちらの記事では，OSによって.zshrcを使い分けているが，今回はあまり気にしない方向で．
設定ができたら，クライアント上のtmuxでコピペができているか確認する．

```bash:
lethe2211@client$ tmux
# マウスで適当に領域を指定する
lethe2211@client$ tmux-copy
lethe2211@client$ tmux save-buffer - # またはC-vを押下
```
これでコピーした領域の文字が標準出力に出てくればOK．

#### .ssh/configの設定

クライアント・サーバ間でクリップボードを共有するためには，X11プロトコルの転送が必要らしい(よくわからない)．

[ubuntu - Using clipboard through SSH in vim - Super User](http://superuser.com/questions/326871/using-clipboard-through-ssh-in-vim)

こちらを参考に，クライアントの~/.ssh/configを設定する．

```conf:~/.ssh/config
Host {myserver}
	HostName {myserver}
	User {myusername}
	IdentityFile {/path/to/your/private/key}
	ForwardX11 yes
	ForwardX11Trusted yes
```
重要なのは，"ForwardX11"と，"ForwardX11Trusted"を"yes"にしておくこと．
{}内は各自読み替えて下さい．

## サーバの設定

まず，サーバ側がX11転送を許可しているかを確認する．

[X11 Forwarding - なんなんなん行く？](https://sites.google.com/site/teyasn001/ubuntu-12-10/sshniyorux11zhuan-song)

こちらを参考にする．

```bash:
lethe2211@server$ cat /etc/ssh/sshd_config | grep X11
```

これで，

```
X11Forwarding yes
```

みたいな記述が見つかればOK．

あとは，

[端末からクリップボードへのコピペする](http://qiita.com/catatsuy/items/0fd67f706366b2355e8f)

と，

[tmux上のコピペをうまく設定する方法](http://qiita.com/catatsuy/items/71b0f4932f00c6711ef5)
の"Ubuntuの場合"

を参考に，xselのダウンロードとaliasの設定を行う．

```bash:
lethe2211@server$ sudo apt-get install xsel
```

```.tmux.conf
set-window-option -g mode-mouse on
```

```bash:.zshrc
alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'
alias tmux-copy='tmux save-buffer - | pbcopy'
```

これでできたはず．

Mac上での確認と同じようにして，問題がなければOK．
"tmux-copy"の初回実行の際に，XQuartzのインストールを求められるかもしれない．
その際は，素直にインストールする．

---
領域の選択後に，いちいち"tmux-copy"を入力するのが少し面倒ですが，かなりマシになったかと思います．

## 追記: 9/28

指摘をいただき，「option + 範囲選択」で，ここでやりたかったことはできることがわかりました…

今までの苦労は何だったのか…
Stream APIをちょっと試しに使ってみただけ

流行ってるので便乗してちょっと実用性のないコード書いてみただけ。

~~~java
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

public class Test{
	public static void main(String[] args){
		String[] arr = new String[]{"1", "2", "3", "4"};
		List<String> list = new ArrayList<String>(
			Arrays.asList(
				Arrays.stream(arr)
					.map(x->Integer.parseInt(x)+10)
					.map(x->String.valueOf(x))
					.toArray(n->new String[n])));
		for(String s : list){
			System.out.println(s);
		}
	}
}
~~~

書いてみた感想:

~~~java
List<String> list = new ArrayList<String>(
	Arrays.asList(
		Arrays.stream(arr)
			.toArray(n->new String[n])));
~~~

のあたりがすごく不格好に見えるのですがこんなもんでしょうかね。toArrayからasListってもっとシンプルに書けそうな。Streamから直接`java.util.ArrayList<T>`が取れればいいのになと思うのですが。

`new ArrayList(Arrays.asList())`は[Stream APIに文句いっても仕方ない](http://qiita.com/donsan_24/items/f2be9b6828b73d3fc49e)ので我慢します。

## 追記 ##
コメントのアドバイスを受けて、時間を測ってみました。

```java
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Stream;
import java.util.stream.Collectors;


public class TS{
    public static final long loop=10000000;
    public static void main(String[] args){
        long laptime;

        laptime = System.currentTimeMillis();
        for(int i=0; i<loop; i++) first_post();
        laptime = System.currentTimeMillis() - laptime;
        System.out.println(laptime+" ms");

        laptime = System.currentTimeMillis();
        for(int i=0; i<loop; i++) users_idea();
        laptime = System.currentTimeMillis() - laptime;
        System.out.println(laptime+" ms");
    }

    public static void first_post(){
        String[] arr = new String[]{"1", "2", "3", "4"};
        List<String> list = new ArrayList<String>(
            Arrays.asList(
                Arrays.stream(arr)
                    .map(x->Integer.parseInt(x)+10)
                    .map(x->String.valueOf(x))
                    .toArray(n->new String[n])));
/*
        for(String s : list){
            System.out.println(s);
        }
*/
    }

    public static void users_idea(){
        String[] arr = new String[]{"1", "2", "3", "4"};
        List<String> list = Stream.of(arr)
                                  .map(x->String.valueOf(Integer.parseInt(x)+10))
                                  .collect(Collectors.toList());
//        list.forEach(System.out::println);
    }
}
```

```shell-session
user@ubuntu:~$ java8 TS
4877 ms
4441 ms
```
mapまとめたり、Collectors.toList()に変えたりして結構早くなりました。toArrayからasListする無駄な操作がなくなってコードもスッキリ。ありがとうございます。
CentOS 6.5 にphp5.5とMySQL5.6をyumでインストールする

php5.5とmysql5.6をインストールにちょこちょこひっかかったので
備忘録兼ねてまとめ
chefのレシピを作りながら試行錯誤した結果なので、この順番で実行すれば
引っかかる部分はないはずです、多分。。
ec2のCentOS公式イメージで動作確認


# yumリポジトリは以下が必要

- epel
- remi
- remi-php55 #php55用のリポジトリ
- mysql56-community #mysqlの公式リポジトリ

# yumのアップデート

sudo yum -y update

# epelリポジトリから必要なライブラリをインストール

以下、MySQLインストールで必要(phpに必要な物も入っているかも)

```
sudo yum install -y --enablerepo=epel openssl-devel perl-DBI libmcrypt-devel libaio libaio-devel
```

# MySQLのインストール

enablerepoオプションにepelを含めれば上に書いたやつは自動で入れてくれるかもしれないけど念のため分ける

```
sudo yum install -y --disablerepo=* --enablerepo=mysql56-community mysql-community-server mysql-community-devel
```

# phpのインストール

```
sudo yum install -y enablerepo=remi,remi-php55 php php-pear php-mbstring php-xml php-devel php-mysqlnd php-opcache php-pecl-apcu php-pecl-xdebug php-gd php-mcrypt phpMyAdmin
```

#### 補足

- php-mysqlnd #php-mysqlが置き換わった
- php-opcache,php-pecl-apcu #APCが廃止になったため
- php-mcrypt #laravelとかで無いと困る

# timezone設定

mysqlの一部関数はシステムのtimezoneを参照しているので
以下で設定ファイルを上書き

```
cp -p /usr/share/zoneinfo/Japan /etc/localtime
```

phpのtimezone設定
date.timezoneの値を修正

```
$ sudo vi /etc/php.ini

date.timezone = "Asia/Tokyo"
```
Goでコピーされたくない値がコピーされたことを検出する方法

値の同一性が重要なときは、値を（うっかり）コピーすることができないようにしたいことがある。C++プログラマならデフォルトのコピーコンストラクタをprivateにして（あるいはC++11の=deleteを使って）、値をコピーしようとするコードをコンパイルできないようにするところだが、Goでは言語レベルである型の値のコピーを禁止する方法はない。従ってコンパイル時にそのようなコードを検出する方法はない。

代わりにと言ってはなんだが、実行時に検出することはできる。

たまに見かけるやり方は、構造体のメンバにポインタを用意しておいて、そこにその値自身のポインタを入れるという方法だ。あとはメソッドが呼ばれるたびにその値をチェックして、レシーバのアドレスとポインタの値が異なっていたらpanicなどでバグを通知すればよい。

コードで書くと次のような感じだ。

```go
type nonCopyable struct {
	mu sync.Mutex
	p  *nonCopyable
}

func (n *nonCopyable) check() {
	// n.pのアクセスを排他制御
	n.mu.Lock()
	defer n.mu.Unlock()
	if n.p == nil {
		// checkが初回に呼ばれたときは初期化
		n.p = n
	} else if n != n.p {
		panic("nonCopyable is copied")
	}
}
```

排他制御のコストが気になる場合はsync.atomicのアトミック変数を使って効率よく同じことを行うこともできる。
Gvizでマインドマップを作成してみた


### Gviz Gemのインストール

```
$ gem install gviz 
```

### Graphvizのインストール（MacOSXの場合)

```
$ brew update
$ brew install graphviz
```



### 参考記事：
tbpgr様
「Ruby | Gvizでインデント構造のテキストをグラフに変換する」
  http://qiita.com/tbpgr/items/770d56834103efe2b723
「Ruby | Gvizでインデント構造のテキストをマインドマップに変換する」
  http://qiita.com/tbpgr/items/7ba662f77b110e9ad0be

ありがとうございます。


### マインドマップの生成

```mindmap.rb
# coding: utf-8

require 'familyable'   # https://github.com/tbpgr/tbpgr_utils
require 'gottani_core' # https://github.com/tbpgr/gottani
require "gviz"

text =<<-EOS
Rails
  レール
    DRY
      同じことを繰り返さない
    CoC
      設定より規約
  テスト
    TDD
      RSpec
        2.99
          factoryGirl
        3.00
          gemの依存に困っている
        spec_helper
      Cucumber
        RailsテストCucumber+Capybara+Poltergeist
          http://qiita.com/ryosy383/items/d4c10ffed3dd22e3153a
        カピバラ
          カピバラ属唯一の種
    CI/CA
      Jenkins
        青くなる・赤くなる
        カバレッジ
        豊富なプラグインを入れる
        デプロイ
  その他
    Rubocop
      リファクタリング
      コーディング規約調整係
      名前が気になる（ルボコップ？）
EOS

# 以下、ソースコードは、
# Author: tbpgr様
# Qiita記事: http://qiita.com/tbpgr/items/7ba662f77b110e9ad0be

sp2 = Gottani::Space2.new
indent_text = sp2.space2_to_common(text)

indexed_indent_text = indent_text.reverse.map.with_index { |e, i|e.merge({id: i}) }

module Familyable
  class Person
    attr_accessor :value, :level
  end
end

i = 0
persons = indexed_indent_text.reduce([]) do |persons, person|
  parent = indexed_indent_text[(i + 1)..-1]
  .find { |e|e[:level] == person[:level] - 1 }
  parent_ids = parent.nil? ? [] : [parent[:id]]
  person = Familyable::Person.new(id: i, parent_ids: parent_ids).tap do |e|
    e.value = person[:value]
    e.level = person[:level]
  end
  persons << person
  i += 1
  persons
end

sorted_persons = persons.reverse
family = Familyable::Family.new(family: persons)

Graph do
  global layout:'twopi', overlap:false, splines: :curved
  nodes fontname:'MS GOTHIC', shape: :none, style:'filled'
  edges dir: :none
  # ノードの定義
  sorted_persons.each { |person|node :"person#{person.id}",  { label: person.value } }

  # エッジの定義
  sorted_persons.each do |person|
    parents =  family.get_parents(person)
    next if parents.empty?
    parent = parents.first
    options  = {}
    options[:penwidth] = 6 if parent.level == 0
    edge :"person#{parent.id}_person#{person.id}", options

  end

  # *** 根のランク, スタイル定義 ***
  min_id = persons.find { |e|e.level == 0 }.id
  min_person_key = :"person#{min_id}"
  rank :min, [min_person_key]
  node min_person_key, { shape: 'pentagon', fontsize: 80, fillcolor: :red }

  # *** 根以外のノードのランク定義 ***
  ranked_persons = sorted_persons.group_by { |e|e.level }.select { |key, value|key.nonzero? }
  ranked_persons.each do |rank, each_rank_persons|
    each_rank_persons.map { |e|node :"person#{e.id}", { fontsize: 40 } } if rank == 1
    persons = each_rank_persons.map { |e|"person#{e.id}".to_sym }
    rank(:same, persons)
  end

  save :"givz_mindmap", :png
end
```

### 生成したマインドマップ
![givz_mindmap.png](https://qiita-image-store.s3.amazonaws.com/0/34365/a96e03d3-f20f-3468-4e8d-d2586f908c39.png "givz_mindmap.png")
gemを作ってgithubに上げてrailsから使ってみる

#概説
自分でgemを作って、railsから使いたくなったので調べながらやってみました。

流れとしては

- gemを作る

- gitに上げる

- railsから使う


#gemを作る

> 参考:[君がOpsでもRubyで書いたライブラリはGemで配ろう](http://qiita.com/sawanoboly/items/ede7715c605e5822ad22)

シェルからbundle gemを実行してgemの雛形を作ります

```shell
$bundle gem my_gem
      create  my_gem/Gemfile
      create  my_gem/Rakefile
      create  my_gem/LICENSE.txt
      create  my_gem/README.md
      create  my_gem/.gitignore
      create  my_gem/my_gem.gemspec
      create  my_gem/lib/my_gem.rb
      create  my_gem/lib/my_gem/version.rb
```

次にmy_gem.gemspecを編集

今回は[lambda_driver](https://github.com/yuroyoro/lambda_driver)を使うということにします

```my_gem.gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'my_gem/version'

Gem::Specification.new do |spec|
  spec.name          = "my_gem"
  spec.version       = MyGem::VERSION
  spec.authors       = ["techno-tanoC"]
  spec.email         = ["techno.tanoc@gmail.com"]
  spec.summary       = %q{my gem for sample} #summaryを編集
  spec.description   = %q{my gem for sample} #descriptionを編集
  spec.homepage      = ""
  spec.license       = "MIT"

  spec.files         = `git ls-files -z`.split("\x0")
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.6"
  spec.add_development_dependency "rake"
  spec.add_dependency "lambda_driver" #依存するライブラリを追加
end
```

spec.add_development_dependencyは開発用のgemで、railsでbundle installする時にはインストールされません。
spec.add_dependencyに書くと、railsでbundle installする時にインストールされるので、実行時に必要なものはこちらへ。

#githubに上げる

普通にpushするだけ

```shell
$git init
$git add .
$git commit -m "version 0.0.1"
$git remote add origin [githubのリポジトリ]
$git push origin master
```

#railsから使う

> 参考:[Gems from git repositories](http://bundler.io/git.html)

gemの指定で、githubのリポジトリをハッシュで指定します

```Gemfile
gem 'my_gem', :git => [githubのリポジトリ]
```

あとはbundle install

```shell
$bundle install
~
Installing lambda_driver 1.2.4 #spec.add_dependencyで書いたgemも依存解決してくれる
~
```

終わり
レイヤー背景の指定

Layer クラスの派生クラスで、背景を指定する場合、

1. 背景スプライトを生成し、addChild() する。
2. draw() メソッドをオーバライドし、DrawPrimitives::drawSolidRect() で描画する。

などの方法があるが、それらより LayerColor オブジェクトを生成し、addChild() する方法の方が画面サイズを気にしなくていいので、楽で、お薦めだぞ。

> bool GameLayer::init()
> {
> 　　：
> 　　//	背景レイヤー設定
> 　　auto layerColorBG = LayerColor::create(Color4B(128, 128, 128, 255));
> 　　this->addChild(layerColorBG);
> 　　：
> }
Angular の Service, Factory, Value, Constant, Provider の違いって？


Angular 勉強中なのですが、[公式ドキュメントの Provider のところ](https://docs.angularjs.org/guide/providers)を読んでやっとわかったのでメモしておきます。

- Service には二つの意味がある。一つは、DI 対象のうち、書く人が API を決められるもの。もう一つは、DI 対象の Object の作り方（Provider Recipe）のうちの一つ `service()`。
- `factory()` でできる Object も Service。
- Service（二つ目の意味）, Factory, Value, Constant, Provider は DI 対象 Object の作り方の名前。
- よくわからなければ `factory()` を使う。`service()` の中で `return` しているなら、`factory()` を使うべき。

## だいたいみんな Service

Angular には Service や Factory というものが存在して、それぞれ `service()` や `factory()` で作られ、微妙に役割が違うものなのだと思っていました。ところが、公式ドキュメントによれば、これらで **できるものは全て Service** で **Service や Factory というのは作り方の問題** だったのです。

DI 対象の Object は以下の二つに分けられるそうです。

- Specialized Object: Controller, Directive, Filter, Animation のように、API がフレームワークによって決まっているもの。
- Service: Specialized Object でないもの。つまり、書く人が API を自由に決められるもの。

そう、つまり **Controller/Directive/Filter/Animation 以外はみんな Service** だったのです。数値や文字列などのプリミティブも登録できるので、これらも Service と呼べるかは疑問ですが・・・。

なので、ある程度以上の規模の開発になると、Service の中でもグループ分けをする必要がありそうです。

## Provider Recipe

では、`service()`, `factory()`, `value()`, `constant()`, `provider()` の違いって何なの？というと、これらは Service や Specialized Object の作り方（Provider Recipe と呼ばれています）の名前です。（Service という言葉に二つの意味があることになり、紛らわしいですね。公式ドキュメントにも「子供に Child という名前をつけたようなもので、この命名には後悔している」と書いてあります。）

この 5 つは、渡した値がそのまま使われるものと、渡した関数を実行した結果が使われるものに分けることができます。

### 渡した値がそのまま使われるやつ

- Value Recipe: 一番単純なやつで、渡した Object またはプリミティブがそのまま使われます。
- Constant Recipe: 大体 Value Recipe と一緒ですが、アプリの Config フェーズで利用することができます。

普通は Value Recipe を使っておけばいいんじゃないでしょうか。

### 渡した関数の実行結果が使われるやつ

- Factory Recipe: 渡した関数のを普通に実行した結果が使われます。関数の引数を使って DI ができます。
- Service Recipe: 渡した関数をコンストラクタとして new した結果が使われます（実装はちょっと違うそうですが、振る舞いはだいたいそんな感じのようです）。コンストラクタの引数を使って DI ができます。
- Provider Recipe: 一番ローレベルなやつです。Factory Recipe + アプリ毎の設定が可能です。

普通は Factory Recipe を使っておけばいいんじゃないでしょうか。

Service を作りたいので `.service()` を使う、というのは多くの場合間違いです。特に `.service()` に渡す関数の中で return している場合は、コンストラクタの意味がないので `.factory()` を使うべきでしょう。

どうせ DI 対象のほとんど（Controller 以外）は Singleton なので、コンストラクタを使う意味は特にないと思っています。

## Specialized Object で使われる Recipe

自分で書く Service には好きな Recipe を選ぶことができます。では、Specialized Object にはどの Recipe が使われるでしょうか？

- Controller 以外: Factory Recipe です。
- Controller: ほぼ Service Recipe ですが、必要に応じて複数回インスタンス化されるところが違います。
【Haxe】【OpenFL】ツイート文言URLの作り方


## ツイート文言URLの作り方
Haxe+OpenFLで作ったFlashアプリのゲームプレイをTwitterで共有する方法を紹介します。これによりゲームプレイの結果を見て`（・∀・）ﾆﾔﾆﾔ`したり、ゲームへの誘導が可能となり、アクセス数の増加を見込めます。
なお、この方法はアプリ認証なしでできるので、簡単に実装できます。

### 実装コード

```hx
import flash.net.URLRequest;
import flash.Lib;

    // ボタンを押した時の挙動
    private function _cbButton():Void {
        
        var urlString = "https://twitter.com/intent/tweet";
        // 本文
        var text = StringTools.urlEncode("【ゲーム名】 ノーマルモードで65535点獲得！");
        // ゲームのURL(誘導用)
        var url  = "http://mygameurl.jp";
        // ハッシュタグ
        var tags = "mygametag";

        // URL文字列連結
        urlString += "?text="     + text;
        urlString += "&hashtags=" + tags;
        urlString += "&url="      + url;

        var request = new URLRequest(urlString);
        // "_blank"で開く
        flash.Lib.getURL(request, "_blank");
    }
```

やり方は、特定のURLを`flash.Lib.getURL()`で"_blank"指定で開くだけです。なお"_blank"で開かないとChromeなどではポップアップとなりブロックされてしまうようです。テキストは`StringTools.urlEncode()`でURLエンコードしています。

上記関数を実行すると、ブラウザの別ウィンドウが開き、共有メッセージのツイート確認画面が表示されます。
![Twitter_でリンクを共有する.png](https://qiita-image-store.s3.amazonaws.com/0/43772/4428b48a-38e8-d094-4f42-693b8923a580.png)

そしてツイートボタンを押すとツイートに反映されます。
![Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/43772/c5aceb7a-2d77-f7ac-161b-c31e9ae184e9.png)

ちなみにツイートのテストをする場合は、当然ながらテスト用のTwitterアカウントを作ったほうが良いです。

### 注意点
ローカルでFlashを実行してもセキュリティ上のルールのためツイート画面を開くことができません。動作テストをする場合は、Flashをサーバーにアップロードして確認する必要があります。ただしNekoでビルドするとローカルでも動作するようです

### ゲームURLについて
ゲームのURLは長いものを指定すると140文字制限に引っかかるので、「bit.ly」などの短縮URLサービスを使うと良いです。

* https://bitly.com

### ハッシュタグについて
Twitterハッシュタグ検索で、使いたいタグ名が他にも存在しないかチェックしておいたほうが良いです。

## 参考

* ツイートボタンのURLの作り方
  * http://kiteretsuworld.blog.fc2.com/blog-entry-66.html

今回の記事はこちらのページを参考にさせていただきました。より詳細なパラメータ指定方法も記載されています。
LPI Level1 Exam 101 Chap02

# 第二章 Linuxのインストールとパッケージ管理
## 2.1 ハードディスクのレイアウト設計
###パーティション
ハードディスクをパーティションという区画に分割して利用することが出来る。
Linuxインストールでは少なくとも2つのパーティションが必要になる。

* /(ルート)
* Swap(スワップ)


**分割利用の用途**

* 柔軟なシステム管理を行うことができる。
* ディスクに障害が発生した時の被害を抑えることができる。
* 障害発生時にスムーズな復旧作業ができる

**レイアウト設計の考慮点**

* システムの用途
* ディスクの容量
* バックアップの方法

### 主なパーティション
|パーティション名|説明|
|:--|:--|
|/(ルート)||
|Swap(スワップ領域)|仮想メモリ領域。物理メモリが不足した場合に、ディスクの一部を一時的にメモリの延長として利用する。※1|
|/home|一般ユーザ用個別ファイルを格納する。|
|/var ※2|各種ログファイルやメールスプールなどの更新頻度の高いファイルを格納する。|
|/usr ※3|プログラムやライブラリ、ドキュメントを格納する。|
|/boot|システムによって、ディスクの先頭パーティションとして数100MB程度を用意された領域。RAIDを利用する場合に内蔵ハードディスクに必要とされる場合もある。|
※1：目安のサイズは物理メモリサイズの1～2倍
※2：VARiable
※3：User Services and Routines

## 2.2 ブートローダのインストール

### ブートローダ
ハードディスクなどのストレージからOSを読み込んで起動するプログラム。
代表的なLinuxのブートローダはGRUB(GRand Unified Bootloader)です。

### GRUBの特徴

* 多数のファイルシステムを認識可能
* シェル機能を搭載し、コマンドによる高度な管理が可能

GRUBの設定

### GRUB Legacy の設定(/boot/grub/menu.lst)
RH 系？
#### menu.lst の設定パラメータ

|パラメータ|説明|
|:--|:--|
|timeout|メニューを表示している時間(秒)|
|default|デフォルトで起動するエントリの番号|
|title|メニューに表示されるエントリ名|
|root|ルートデバイスの指定|
|kernel|起動するカーネルイメージファイルと起動オプションの指定|
|hiddenmenu|起動時に選択メニューを表示しない|
|initrd|初期RAMディスクファイルの指定|

### GRUB 2 の設定
GRUB2 の設定は/boot/grub/grub.cfg で管理する。
設定ファイルは直接編集するのではなく /etc/default/grub で設定し、update-grub コマンドで設定ファイルを生成する。

### ブートオプションの指定
#### ブートローダ起動時のメニューでのオプション

|パラメータ|説明|
|:--|:--|
|root=デバイス|ルートパーティションとしてマウントするデバイス|
|noscsi|SCSI デバイスを使用しない|
|nousb|USB デバイスを使用しない|
|single|シングルユーザーモードで起動する|
|1 ～ 5|指定したランレベルで起動する|

## 2.3 共有ライブラリ管理
### スタティックリンクとダイナミックリンク

**リンク**

* プラグラム本体からライブラリの機能(関数)を利用する

**スタティックリンク**

* コンパイルする時点で、コンパイラがライブラリを実行ファイル内に埋め込む
* 実行ファイル内にライブラリ機能が埋め込まれる為、よく使うライブラリが様々な実行ファイルに重複して入ってしまう。

**ダイナミックリンク**

* 実行ファイルへライブラリを埋め込むことはせず、実行時にライブラリの機能を呼び出す。

**共有ライブラリ**

* ダイナミックリンクによって呼び出されるライブラリを**共有ライブラリ**と呼ぶ
* 共有ライブラリは「/lib」、「/usr/lib」に配置され、「lib～.so～」という名前が付けられる。
* 「/lib」、「/usr/lib」以外のディレクトリ以外のライブラリも検索対象にする場合は、「/etc/ld.so.conf」ファイルに記述する。
* 効率的な検索の為、バイナリのキャッシュファイルとして**/etc/ld.so.cache**を参照する。
* 「/etc/ld.so.conf」を変更した場合、共有ライブラリを変更した場合は**ldconfig**を実行し、キャッシュファイルを更新する必要がある。

## 2.4 Debianパッケージの管理

**パッケージ**

* 実行プログラム、設定ファイル、ドキュメントなどを一つのファイルにまとめたもの

**パッケージ管理システム**

* パッケージががどこにインストールされているかを管理したり、パッケージ間の競合を回避したりする仕組みを提供する。
* インストールやアンインストール、アップデート作業が容易になる。

**リポジトリ**

* ファイルやデータを集積している場所や、それらの情報を管理するデータベースを意味する。
* ファイルシステム上のディレクトリであったり、ネットワーク上のサーバであったりする。

**dpkgパッケージファイル名**
例：tree_1.5.3-1_i386.deb

|例|説明|
|:--|:--|
|tree|パッケージの名称|
|1.5.3|バージョン番号|
|1|リリース番号|
|i386|アーキテクチャ|
|deb|拡張子|

## 2.5 RPMパッケージの管理

**RPM**
RedHat 系パッケージ管理システム。

**RPMパッケージファイル名**
例：bash-3.2-21.i386.rpm

|例|説明|
|:--|:--|
|bash|パッケージの名称|
|3.2|バージョン番号|
|21|リリース番号|
|i386|アーキテクチャ|
|rpm|拡張子|

**YUM** の設定ファイル

* /etc/yum.conf
* /etc/yum.repos.d ディレクトリ配下(レポジトリ情報の設定)
Spring Bootで設定のプロファイル分けをする

Spring Bootは、設定をapplication.propertiesやapplication.ymlで書ける。
Webの情報だと、propertiesでの設定例が多くて、YAMLの設定例が少ない印象。
基本一緒なんだけど、YAMLでの設定例を書いておく。

```yaml
# spring.profiles.activeにデフォルトでアクティブなプロファイルを指定
spring:
  profiles:
    active: dev

# "---"でプロファイルを区切る
# プロファイル名はspring.profilesに書く
---
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://localhost/devdb
    username: db_user
    password: db_password
    driverClassName: com.mysql.jdbc.Driver
---
spring:
  profiles: production
  datasource:
    url: jdbc:mysql://production.com:3306/productdb
    username: db_user
    password: db_password
    driverClassName: com.mysql.jdbc.Driver
```

こうすると、devプロファイルで動作するようにjarが作られる。
実行時にproduction環境で動作させるには、以下のコマンドで実行する。

```bash
java -jar -Dspring.profiles.active=production hoge.jar
```
JavaScript で配列を判定する正しいやり方

JavaScript で配列を判定する方法として、ECMA Script 5では **Array.isArray()** が用意されています。

```js
alert(Array.isArray([1, 2, 3])); //配列なので true
alert(Array.isArray([])); //空の配列でも true
alert(Array.isArray({})); //オブジェクトは false
```

しかし、IE8は ECMA Script 5 にほぼ対応していないので、このメソッドは使えません（cf. [ECMAScript 5 compatibility table](http://kangax.github.io/compat-table/es5/)）。

では、IE8含めて対応するにはどうするか。

まず、**typeof** でいけないか？　と考えますが、"object" が返ってきてしまうので、使い物になりません。

そこで、**instanceof** を使ってみます。

```js
var foo = [];
var bar = {};

alert(foo instanceof Array); // true
alert(bar instanceof Array); // false
```

このように、**hoge instanceof Array** と書くと hoge が Array のインスタンスかどうかを真偽値で返してくれるわけです。

似たような名前の **typeof** が **typeof hoge** で型を表す文字列を返してくれるのに対して、こちらは真偽判定なので、使い方でちょっと混乱しそうですね。ちなみに **instanceof** はプロトタイプチェーンを遡って判定するため、多重継承っぽいことをしている場合、真となるオブジェクトはひとつではありません。たとえば Array は Object でもあるので、上の例で続いて **foo instanceof Object** とすれば true が返ってきます。

それはともかく、この方法は厳密には正解ではありません。たとえばフレームを使っているページ（window.open() などで新しいウィンドウを生成した場合も同様）では、ページ（ウィンドウ）ごとに Array という別オブジェクトが存在することになるので、たとえば親フレームにある hoge という変数が配列かどうかを判定したいとき **parent.hoge instanceof Array** としても false になるわけです。

**hoge.constructor === Array** で判定するというやり方もありますが、やはり上記と同じ理由により、正確ではありません。

このような別フレームの変数を参照して配列かどうか判定することはそうあることではないと思うので、場合によってはそれを理解した上で使っても構わないと思います。しかし、もしこれも踏まえて正確に判定するようにしたいのであれば、以下の方法が良いようです。

```js
isArray([]); // true
isArray({}); // false
isArray(parent.hoge); // 親フレームにhogeという配列がある前提で、 true

function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
}
```

いったん文字列に変換してしまうわけです。うーん、なんか気持ち悪い……。しかしこれは仕様上保証されている動作なので、ブラウザの実装に依存せず判定をすることができるようです。

なお、jQuery には [jQuery.isArray()](http://api.jquery.com/jquery.isarray/) というメソッドクロスブラウザ対応のメソッドが用意されているので、 jQuery 使用時にはこれを使うのが無難かもしれません。[jQuery のソース](https://github.com/jquery/jquery/blob/10399ddcf8a239acc27bdec9231b996b178224d3/external/requirejs/require.js)を確認すると、やはりこちらも文字列に変換して判定する実装になっているようですね。


参考：
http://stackoverflow.com/questions/218798/in-javascript-how-can-we-identify-whether-an-object-is-a-hash-or-an-array
http://stackoverflow.com/questions/4775722/check-if-object-is-array
http://stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript
http://stackoverflow.com/questions/1058427/how-to-detect-if-a-variable-is-an-array
RVMからrbenvに移行時、pg_extが読めないエラーの対処法

RVMからrbenvに移行後、rails server等しようとすると下記の様なエラーが出る場合の対処法。

> path/to/project/vendor/bundle/ruby/2.0.0/gems/pg-0.17.1/lib/pg.rb:4:in `require': libruby.so.2.0: cannot open shared object file: No such file or directory - path/to/project/vendor/bundle/ruby/2.0.0/gems/pg-0.17.1/lib/pg_ext.so (LoadError)

vender/bundle以下を全削除してbundle installし直すとなおる。

２回ほどハマったし今後まだまだRVM→rbenv移行する人はいると思うのでメモ。
PHP5.6にアップデートしたら偉いことになった件(含途中経過)

普段使ってるサーバーのPHPに *php-develが入っていない* という割と致命的なことに気づいたので魔が差してそれならPHPもアップデートしちゃえと**思った結果がコレだよ!!**

1. IRC で導入しているBot がDB に接続できなくなった。
2. Zend_Date にフォーマットが'Y-m-d H:i:s' のデータを突っ込んだら? Fatal error: Call to undefined function simplexml_load_file() が発生した。
3. PHPとZendframework1(以下ZF1) の相互製の問題ならZF1 の最新版入れたらいいんじゃね→テーブルのカラムにない計算結果をエイリアス化してるところがどうやってもエラーになる

土日しか殆ど作業する時間とれないので暫定対応残しておきます。

#BOTのPDO対策
PDO なにか変わったのかなー(特にプリペアードステートメントに関して) と思ってBot の発言でトレースしようと思ったらあ、配列は喋ってくれないのね
ということでver_dump で生成されたSQLとバインドするパラメータをターミナルから確認する。
うぅ…ノイズ(Botの流すログ) が多くて見づらい…
PHP5.6 になって配列に変更あったらしいので
http://qiita.com/rana_kualu/items/206d786a2be7942c6dc3
を確認。
うん、別に今のコーディングに影響あるのものはないことを確認。
SQLServer みたいにバインドする時は 「?と整数」じゃないとダメってことにもなってない。
というわけでver_dump で生成されたSQL とバインドしたい値を手でくっつけてターミナルからMySQL にログインして実行→正常終了
んじゃ自分で書いたPDO 接続プログラムの問題じゃないなあ。
と思いながらログを追っていたらエラー出力発見、やったぜ。
> Warning: PDO::__construct(): The server requested authentication method unknown to the client [mysql_old_password] in

全然気にしたことなかったけど、確かにBot で使わせているMySQL のアカウント、古い形式(16バイト) でした。
root とかWeb アプリケーションで使ってるのは41バイトだから確かに違う。
というわけで
http://www.natzworks.com/digital/2010/423.html
この通りに処置したらBot がちゃんとDB読みに行くようになってくれました。

ハッピーなのはここまで。

#Zend_Date対応(追加調査中)

2の原因がいまいち把握しきれてない。
Fatal エラーなのでログぶった切られてしまってるので
var_dump とexit(); で行単位でトレースした結果Zend_Date に'Y-m-d H:i:s' のデータを突っ込んでいるところがヒットしました。
はて…PHP5.4 使ってた時は問題なかったのになーっていうか、Zend_Date ロケール見に行ってたのか。
私のスキルが足りなくて未だにZend_Date 使いこなせてない感。
PHP5 以降ならsimplexml 標準で読んでくれるって質問掲示板にあって特に有効にさせる方法見当たりませんでした。

#最新版ZF1のPDOコーディング
というわけで安直にアップデートという選択肢をとってみたわけですが
今サーバーで動かしているのがZF1.11.11 最新版は1.12.8 らしい。
ZF2は構成が違いすぎて現時点では移行できないのでなしになりました。
さて、ZF1.11.11 だと

```php:
$command = "round(win / (win + lose)*100, 3) AS percent";

$select->from ( array($table ), array( '*', "$command" ) );
```

(部分抜粋)
これ動くんですが、1.12.8だとシンタックスが
> SELECT \`rate\`.*, \`rate\`.\`round(win / (win + lose)*100, 3)\` AS \`percent\` FROM \`rate\` WHERE (rate_id = 1);

こうなって

> ERROR 1054 (42S22): Unknown column 'rate.round(win / (win + lose)*100, 3)' in 'field list'

こうなった。
うーん、ご丁寧に演算にもグラーブアクセントつけてくれるのでエラーになっちゃいました、と。

#応急処置
取り敢えず時間も時間なんで取り敢えずエラーだけ取り除くのであれば、影響範囲の狭いZend_Dateを何とかする(取り除く) ことにしました。
ZF1 の関数を使わずに、PHP 標準のdate() と strtotime() で頑張るやつですね。
まあこれでなんかクレームでなかったらもうこれでいいような気もしますが
結局解決できなかったって後味の悪さは残ってるので時間があるときに何とかしたいなぁと思いながら。
以下Diff
before

```php:
// for graph data
if($value == $params['player_id']){
    // set data only before 3 month from today
    $today->sub( 3, Zend_Date::MONTH );    //ちなみにこれはちゃんと動く
    $date = new Zend_Date( $list['created_on'] );    // アウトだったコーディング。

    if ( $date->isLater($today)){
        $target_rate[] = array('created_on' =>  $list['created_on'], 'rate' => intval($list['player'.$k.'_rate']));
    }
}
```

after

```php:
// for graph data
if ( $value == $params['player_id'] ){
    // set data only before 3 month from today
    $before_3month = date( 'Y-m-d H:i:s', strtotime( '- 3 months' ) );
    $date = date( $list['created_on'] );

    if ( strtotime( $date ) > strtotime( $before_3month ) ) {
        $target_rate[] = array( 'created_on' => $list['created_on'], 'rate' => intval( $list['player'.$k.'_rate'] ) );
    }
}
```
W3C Markup Validator の User-Agent

[W3C Markup Validator](http://validator.w3.org/) についての説明はいいとして、

```
W3C_Validator/1.3 http://validator.w3.org/services
```

だそうです。2014-09-15 1:23 JST 現在。

## 調べた方法
[diagunokun](https://github.com/polamjag/diagunokun) という、いわゆる診断君っぽいやつを作って、それを Validate させた

あと [W3C Markup Validator は OSS](http://validator.w3.org/source/#getting) なのでソース見てもいいと思います
Commitメッセージにブランチ名からissue番号を取得して追加するスクリプト


学生のおかげでgithubのprivateリポジトリを２年無料で使えるので
こそこそissue作ってコミットにIDを振ったりして開発をしているんですが

よくIDを振り忘れるのでhookを書きました。

https://gist.github.com/k2wanko/2217a7615b776a29d544

# インストール

動作確認: OS X

```shell-session
$ curl https://gist.githubusercontent.com/k2wanko/2217a7615b776a29d544/raw/prepare-commit-msg > .git/hooks/prepare-commit-msg && chmod +x .git/hooks/prepare-commit-msg

```

# できること

```shell-session
$ git branch
* add-notify#123
  master
$ git commit # -m オプションなし
refs #123 <- が先頭にに追加された状態でエディタが開く

$ git commit -m "Add README"
[add-notify#123 a123] Add README #123 <- 追加される
...

$ git commit -m "Add README #321" <- コミットメッセージに自分でIDを入れとく場合
[add-notify#123 a123] Add README #321 <- 追加されない
```

# 使えるブランチ名

`issue id`は123と仮定
`branchname`は "add-(´・ω・｀)" や "fix-( ･`ω･´)" などの任意の文字列

- branchname#123
- branchname-123
- branchname_123
- issue123
- issues123
- issue/123
- issues/123
- branchname/issue/123
- branchname/issues/123
- 123_branchname
- 123-branchname
- #123branchname

# 参考
http://qiita.com/PallCreaker/items/c91bc201fb8562c8fbd3
SwiftでCATransform3Dを使う場合


ちょっと試してみようと思ったらすぐには分からなかったのでメモ代わりに。


![スクリーンショット 2014-09-15 01.04.35.png](https://qiita-image-store.s3.amazonaws.com/0/40693/50fe150b-a9fa-b91d-1d97-442da8f9ea1e.png "スクリーンショット 2014-09-15 01.04.35.png")

灰色の箇所をタップすると灰色の部分がくるりと回ります。それだけ。

```ViewController.swift

import UIKit


class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let view : UIView = UIView(frame: CGRectMake(100, 100, 100, 100))
        
        view.backgroundColor = UIColor.grayColor()
        view.userInteractionEnabled = true
        view.tag = 1
        
        self.view.addSubview(view)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        
        let touche : UITouch = touches.anyObject() as UITouch
        
        switch (touche.view.tag as Int) {
        case 1:
            let animation : CABasicAnimation = CABasicAnimation(keyPath: "transform")
            animation.duration = 0.5
            animation.repeatCount = 1
            animation.autoreverses = true
            
            let transform : CATransform3D = CATransform3DMakeRotation(CGFloat(M_PI),  1.0, 0.5, 0.0)
            animation.toValue = NSValue(CATransform3D : transform)
            
            touche.view.layer.addAnimation(animation, forKey: "transform")
        default:
            break
        }
    }
}

```
Cygwinのインストールとapt-cygのインストール


# Cygwinのインストール

ここからダウンロード
https://cygwin.com/install.html

64bitOSの場合は、setup-x86_64.exe
32bitOSの場合は、setup-x86.exe

基本的には次へを連打すればよいけれど、ダウンロードサイトの選択ではURLの最後がJPになっている物を選ぶ

次に、SelectPackageでserchのテキストボックスにtarと入力して、Baseの左のプラスマークをクリックしてNew列をクリックしてバージョン番号が表示されるようにする。
同様にwgetのWEBで同様にバージョン番号が表示されるようにする

後は次へ次へと連打してコーヒーでも飲んでいれば完了します。

# apt-cygのインストール

apt-cygはパッケージ管理用のツールです。
アプリケーションが簡単にインストールできるようになります。

Cygwinを立ち上げて、以下のコマンドでGitHubからスクリプトをダウンロードできます。

```bash

wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg

```

実行権限をつけてPATHの通っている場所に置きます

```bash
chmod 755 apt-cyg
mv apt-cyg /usr/local/bin/
```

これでapt-cygが利用できるようになります。
例えばvimをインストールしたい場合は以下のコマンドでできます

```bash
apt-cyg install vim
```

国内のリポジトリから更新するようにするには

```bash
apt-cyg -m ftp://ftp.iij.ad.jp/pub/cygwin/ update
```
S3 から ファイルをAWSCLIでディレクトリごとダウンロード


これでOK

```bash
aws s3 cp --region ap-northeast-1 s3://バケット名/ . --recursive
```

アップロードする場合はディレクトリの指定を逆にすればOK


```bash
aws s3 cp --region ap-northeast-1 hoge s3://バケット名/  --recursive
```

リージョンは東京リージョンを指定しています。
社内ツールとしてmilkcocoaで付箋アプリを作ったらリモート可能な組織になった話(前編)

![9/12会議](https://qiita-image-store.s3.amazonaws.com/0/54243/d7015994-c2b3-b4a3-c01e-097b40ca8f81.jpeg)

## この記事のモチベーション
- デジタル付箋を作ったら生産性が向上したので共有したい
- [milkcocoa](https://mlkcca.com)が実用的だということをアピールしたい

## 何者？
- technical rockstarsのエンジニアの落合渉悟([@_sgtn](http://twitter.com/_sgtn))です。

## 何を書くの？
　社内コミュニケーションと付箋のデジタル化について書きます

### 前編
- 組織の情報共有の難しさについて
- 「付箋のデジタル化」の背景について
- どのように使用していて、どのような成果を上げたか

### 後編
- [milkcocoa](https://mlkcca.com)でどのようにアプリケーションを作っているか
- 例えばどのような用途があるか
- 10年後の話

## 組織の情報共有の難しさについて
　僕が働いている[株式会社 technical rockstars](technicalrockstars.co.jp)は、僕が入った時点では4人のフルタイムと3人のハーフタイムのメンバーで構成されたチームでした。

　口頭での議論をするのは議論が発散して結局何を話していたのか確認するのが大変だという悩みがあったので、あるUXデザインの師匠にならって付箋を使ったコミュニケーションを試みました。

　付箋は、人間の思考を表現する上でかなり高い表現力を持った媒体です。まず属人性がありません。壁に貼られた付箋は筆跡以外に発言者を特定する情報を持たないので、人的バイアスのかからない議論が可能になります。そして情報が視覚的に残るので、過去の発言との関連に気付いたり、思考をゆっくり整理しながら議論を進められます。議論が一旦出尽くしたらカードソーティングを行い、下地になる模造紙に線を引くことでグループ化したり、小さいシールを張って投票したり、様々な状態とデータ構造を実現することが可能でした。

　つい口頭での議論になってしまいがちでしたが、「口頭での議論は何もしてないのと一緒」という共通認識を持って、積極的に付箋で議論を進めたり、個人の開発ロードマップを付箋で管理したり、組織の効率化に付箋は大きく貢献しました。

![fusen](https://qiita-image-store.s3.amazonaws.com/0/54243/df25aeb2-27db-1a61-68ce-6c88ceb51b69.jpeg)
実物の付箋で議論をしていた時期の様子。壁が足りなかったです。

## 「付箋のデジタル化」の背景について
　しかし、問題が発生しました。弊社が福岡から東京に進出するに際して、Lisp美少女のが福岡と東京を飛び回る必要があるため、どうしても全員が一同に会することが減ってきたのです。今まで行っていた「実物の付箋による会議」が行えなくなるという問題に直面しました。「付箋」というツールは思考や会話を一覧できる形で可視化し、後でカテゴライズしたり投票したり柔軟な表現ができる強みがある反面、場に束縛されるという弱みも持っていました。

　我々は「リモートワークの可能な組織」という課題を前に、代替物を探し始めました。slackやhipchatやtypetalkのようなコミュニケーションツールはリモートでの会話や通知には良い反面で、情報が流れていくので決定を共有したり議論をするには最適と言えない面もありました。

　torelloなどのtodo管理ツールは、todoは管理できますが、会議をするには向かず、リモートかつ一覧性が良く議論もしやすいツールとなると「リモートで使用可能な付箋」が必要だという結論だけが残りました。

　したがって、液晶で付箋の表現力を実現し、リモートでも生産的な議論と結果の共有が可能なようにしようということで、現在社内ツールとしてドッグフーディングをする傍ら、将来的にはリリースを考慮している「付箋チャット」とでも呼ぶべきプロダクトが生まれました。


## どのように使用していて、どのような成果を上げたか
　まず、毎日のミーティングを付箋チャットで行っています。付箋で出欠をとって、おもむろに議題となる付箋を張ります。あとは、ハングアウトや[1meeting](1meeting.net)などで通話（思考発話）しながら5分間で思いつくことを張っていきます。時間が来たらカードソーティングをして、議題の結論をまとめて終わりです。

![growth会議](https://qiita-image-store.s3.amazonaws.com/0/54243/7b4eb87e-7270-94d4-e19c-06d7ba9ccc91.jpeg)
（growth hackと技術開発のリソース配分に関する板です。MVPとして最小限の機能しかありませんが、付箋の性質上、気合いでいろいろな表現ができます）

　メリットとして、ほんの15分程度で会議が終わり、それがそのまま議事録になります。リモートだろうがブラウザさえあれば会議に参加でき、スクリーンショットにskitchで注釈を入れて共有すればさらに認識の共有が捗ります。また、URLのハッシュ値が板名となっているので、CSSのBEMのように命名規則を定義して、ある程度namespaceを用いて板を管理しています。

　このサービスはmilkcocoaとmilkcooca hostingという社内ツールで1日でプロトタイプを作り、もう1日でUIを改善して実用しています。今までにないスピードでプロトタイピングから改善サイクルまで持っていけるので、milkcocoaは価値検証や顧客開発を行い、その後保守するのに申し分ないプロダクトだと思います。我々がmilkcocoaで生産性を上げることが何よりの価値検証だと考えているので、日夜新しいプロダクトのプロトタイプが開発されています。

## まとめ
　前半では、「これまでの情報共有」「これからの情報共有」「得られた価値」を簡単に紹介しましたが、後半ではmilkcocoaを使って実際にサービスを作る過程がどのようなもので、いくつかのサービスを作った後に分かった設計や開発手法などのノウハウを紹介できればと思っています。付箋チャットやホスティングなどのサービスのリリースと併せて乞うご期待ください。