OmniAICreator/Qiita-1.07M huggingface dataset:
tigで別ブランチからcherry-pickする

メモです。
ヘルプ見るとtigでcherry-pick出来るようなんですが、
別ブランチのコミット持ってくるのどうするんだろ？ということで調べた。

# 結論だけ先に述べると
これでOK。

```
tig <別ブランチ名>
```

以上。

# 実際に試す

## 元のmaster履歴はこんな感じ
![スクリーンショット 2014-05-17 2.59.19.png](https://qiita-image-store.s3.amazonaws.com/0/9099/e0b72ff3-ea8c-9eba-4e24-fa0760e9359a.png)



## 別ブランチ「cherry-pick-test」を作る。
「README_Bファイル追加」「README_Cファイル追加」の２個コミットした。
cherry-pick-testブランチの履歴はこんな感じ。
![スクリーンショット 2014-05-17 3.00.17.png](https://qiita-image-store.s3.amazonaws.com/0/9099/259174af-fbc5-91eb-084f-fae362738d21.png)



## masterに戻って、別ブランチを指定してtig起動
最終的に **README_C追加コミット** のみmasterブランチに反映してみる。

まずは

```
git checkout master
tig cherry-pick-test
```

でmasterブランチに移動した後tigメイン画面を呼び出す。

tigメイン画面でcherry-pickしたいコミットの上で「C」をタイプ。
すると下部に確認コンソールが出るので「y」押下する。
![スクリーンショット 2014-05-17 2.37.54.png](https://qiita-image-store.s3.amazonaws.com/0/9099/e986392a-a9fa-225e-e4be-23a29d2fa2ab.png)



## master履歴を確認してみる
README_Cだけ追加されてる。
![スクリーンショット 2014-05-17 3.01.11.png](https://qiita-image-store.s3.amazonaws.com/0/9099/37e1e7fa-892c-c214-72a2-f9b3589a5597.png)



# まとめ

リストから選んで「C」をタイプするだけで
ポコポコcherry-pickが出来るので、対象が複数ある場合はだいぶ便利だと思います。
Twitterの文字列を正確にカウントする方法

### val().lengthでは正確にはカウントできない

Twitterの投稿には140文字までの制限があります。

よくTwitterのAPIを利用した投稿アプリで文字数のカウント機能を
実装することがあると思いますが、単純に

```js
$('#twt').val().length()
```

のようにカウントすると、おかしくなるときがあります

### Twitterでは、URLは必ず短縮される

まず、Twitterでは投稿中のURLは全てTwitter独自の短縮URLの仕組みであるt.coで短縮されるため
URLの長さに限らず文字数は、

http:  23文字
https: 22文字

と決まっている。

以下のような文章は、

```text
ヤフー http://yahoo.co.jp
```

普通にカウントすれば、22文字だがTwitterだと29文字になる。

### 一部文字のカウント数も異なる

これは検証したのが、かなり前なので詳しくは覚えていないのですが、

一部の特殊な文字(サロゲートペア)に対する扱いも、

`val().length` と Twitterの文字数カウントの方法は違うらしい
(詳しい人いたら教えていただけるとありがたいです)

### 公式のライブラリを探す

そこで、Twitterの文字数カウントと同じ方法で計算するためのライブラリがあるか探したらありました。

PHP,Java,Ruby,Python,JS用のライブラリが用意されているようです。

https://dev.twitter.com/docs/tco-url-wrapper/how-twitter-wrap-urls

ただ自分が普段利用しているPHPのためのライブラリは、

短縮URLを展開するものであったり投稿からハッシュタグのみ抽出するものであったりして、

直接文字数をカウントする関数というものが無いです。

### フォーク先のライブラリを使う

そこで根気よく探したら、

日本人の方がフォークして使いやすい関数を実装してくれていました

それがこのライブラリ

ライセンスはApache License v2.0

https://github.com/nojimage/twitter-text-php

## 使い方

Twitter_Validation.phpをインポートする

```php
include_once('Twitter_Validation.php');
```

インスタンスを作成

```php
$validator = Twitter_Validation::create('', array(
    'short_url_length' => 22,
    'short_url_length_https' => 23,
));
```

getTweetLengthを呼び出す

```php
$twitter_count = $validator->getTweetLength($message);
```

これだけ。

TwitterのAPIを使ったアプリを作ってみようという方は、
一度ぜひ使ってみてください。
Ratchetを試す。(Bootstrapチーム謹製モバイル用フロントエンドフレームワーク)


#はじめに
個人で使うiphone用webアプリみたいの作るときに使えるCSSテンプレートみたいのないかなーと思ったら、bootstrapの亜流でそれっぽいのがあったので使ってみた。

公式サイト
http://goratchet.com/

こういうのが作れる（exampleより）
アイコンはRatchiconsというアイコンフォントがいくつか用意されている。

※Ratchetは本来はHTML・CSS・JSのみでモバイルアプリを作成するためのものですが、今回私はRailsアプリのUI作成用のひな形として利用しました。

![スクリーンショット 2014-07-24 14.38.55.png](https://qiita-image-store.s3.amazonaws.com/0/7046/896c88e3-232f-2a35-42bb-ff67284743c0.png)     ![スクリーンショット 2014-07-24 14.39.43.png](https://qiita-image-store.s3.amazonaws.com/0/7046/afd9d167-ab5e-2ed2-c8a5-7dd7ac0e766f.png)            




#ダウンロード

上記リンクにとんだ先ででっかく表示されている"Download Ratchet"ボタンをクリックすると、なぜか公式サイトのコードのzipがまるごとダウンロードされるという意味不明なことになっている。

![スクリーンショット 2014-07-24 14.31.53.png](https://qiita-image-store.s3.amazonaws.com/0/7046/4ac78a0d-389c-69db-f899-d0e728569a2b.png)


本物のRatchetは下記から手に入る。
https://github.com/twbs/ratchet/releases/download/v2.0.2/ratchet-2.0.2-dist.zip

ちなみに`http://goratchet.com/getting-started/`の "Download Ratchet" ボタンのリンク先はこっちである。



#中身
下記にあるように単なるcss,js,fontのセットなんで、普通にアプリのそれっぽい場所に配置してそれっぽくパス指定すると使える。

```
ratchet/
├── css/
│   ├── ratchet.css
│   ├── ratchet.min.css
│   ├── ratchet-theme-android.css
│   ├── ratchet-theme-android.min.css
│   ├── ratchet-theme-ios.css
│   ├── ratchet-theme-ios.min.css
├── js/
│   ├── ratchet.js
│   └── ratchet.min.js
└── fonts/
    ├── ratchicons.eot
    ├── ratchicons.svg
    ├── ratchicons.ttf
    └── ratchicons.woff
```

#使い方
下記の3つのルールさえ守れば、簡単にそれっぽい見た目のモバイル用webページが作成できる。

1. barクラスを持つ要素をbodyの中に必ず書くこと。
2. 画面スクロールを許可したい範囲はcontentクラスのdivで囲むこと。
3. metaタグは必ず書くこと。下記みたいなやつね。

```html
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
```

#感想

- 構造が単純でカスタマイズしやすい
- モバイル以外を切り捨てて、ソッコーなんかのサイトを作りたいときには強力だと思った。

#注記
- 基本的なデザインの思想が「インライン」。テーブルや画像むけのコンポーネントは用意されていない、それらが必要な場合は、自作するか他をあたる方が良い。
- 画面下部固定のタブバーを使用するとき、.contentの中身がタブバーに隠れてしまって表示されなくなるので、微調整が必要。
SimpleExpandableListAdapterを簡単に作成するライブラリ作った


久しぶりに `SimpleExpandableListAdapter` を使って `ExpandableListView` 作ろうとしたら思った以上に面倒臭かったので、簡単に作成するためのライブラリを作ってみました。
[ソースコード(GitHub)](https://github.com/droibit/ExpandableListViewBuilder)

##ライブラリの使い方
そもそもですが、`SimpleExpandaleListAdapter` を作成するためには2つのコレクション `GroupData` と `ChildData` を用意しなければいけません。
しかし、これらはネストされたジェネリック方になっており扱うの面倒でした。

* GroupData … `List<? extends Map<String, ?>>`
* ChildData … `List<? extends List<? extends Map<String, ?>>>`


アダプタに渡す際には上記のような型のコレクションにしなければいけませんが、元々のデータは次のようなシンプルな構造になっていると思います。

```
・Group1
    |__ Child1
    |__ Child2
    |__ Child3
    |
・Group2
    |__ Child1
    |__ Child2
    .
    . 
```

処理を書く際もこのような構造をもつコレクションでデータを管理しつつ、 このデータからアダプタを作れるようにしています。

### クラス

* GroupedStringList … グループ化された文字列データを格納する。
* SimpleExpandableListAdapter … リストを元にアダプタを作成する。

### 使い方
親子関係のあるグループを作成する際、子項目は `simple_expandable_list_item_1` 、 `simple_expandable_list_item_2` に対応する個数の文字列を持つことができます。

``` java
// 子項目が1つの場合
GroupedStringList groupedList1 = new GroupedStringList();
List<String> languages = new ArrayList<String>();
languages.add("Java");
languages.add("C#");
languages.add("Python");
// 新しいグループを作成する
groupedList1.newGroupeOne("Programming", languages);

SimpleExpandableListAdapter adapter1 = GroupedAdapterBuilder.fromOne(groupedList1);

// 子項目が2つの場合
GroupedStringList groupedList2 = new GroupedStringList();
List<StringPair> companies = new ArrayList<StringPair>();
companies.add(new StringPair("Google", "1998/9/4"));
companies.add(new StringPair("Microsoft", "1975/4/4"));
companies.add(new StringPair("Apple", "1976/4/1"));
// 新しいグループを作成する
groupedList2.newGroupeTwo("Company", companies);

SimpleExpandableListAdapter adapter2 = GroupedAdapterBuilder.fromTwo(groupedList2);
```

このようにライブラリを使用することで、使うのが面倒な `ExpandableListView` がより簡単に使えるようになるのではないでしょうか。
テーブルのデータをスクレイピングする


jQueryのテーブル関係の練習
以下coffee、表現はEmmet


テーブルヘッダーを取ってスキーマを作る
-----------

tables = $(「目的のテーブル、もしくは目的のテーブルを含む配列」)[0]
#### 初期状態：table>thead(>th>td)+tbody(>tr*100)
process01 = tables.rows
↓
#### (tr>td*5)*100
> tableの中の配列を得るのがrows
> theadもtr>tdに変換されたようになって、すべてrowsとして扱えるようになる

process02 = tables.rows[0]
↓
#### tr>td*5

process03 = tables.rows[0].cells
↓
#### [td*5]
> trの中のtd配列を取るのがcells

_.each process03, (cell, index) -> console.log $(cell).html()
↓
#### ヘッダーが順番に出てくる

うむ、取れそう

データ取得
----------


これでスキーマに定義したものでデータをとっていく

~~~coffee
_.each tables.rows, (row, rIndex) ->
	if rIndex is 0 then return
	_.each row.cells, (cell, cIndex) ->
		console.log "(" + cIndex + ", " + rIndex + ") = " + $(cell).html()
~~~



インデックスをスキーマに対応させれば保存できますね。
foldexprの評価のみを実行する方法


短い日本語でタイトルをうまく表現できなかったのですが、以下の理由で、`foldexpr`を評価するだけの関数（もしくはコマンド）を作り、手動で`foldexpr`を評価させたかったのです。

* ずっと`foldmethod`が`expr`のままだと、行数の多いファイルを編集時にものすごく重い！
* `autocmd`で動的にうまく`foldmethod`を切り替えられたらよいのですが、ちょうど良い設定が実現できない。
* `:setlocal foldmethod=expr`を一々タイプするのもめんどい。

で、以下が実現できるコードです。わかってしまえば簡単だったのですが、`redraw`を行うと`foldexpr`が評価され、`redraw`を行わないと`foldexpr`が評価されませんでした。

```vim:
function! s:eval_foldexpr()
  let saved_foldmethod = &foldmethod
  let saved_foldexpr = &foldexpr
  try
    setlocal foldmethod=expr
    setlocal foldexpr=getline(v:lnum)[0]==\"\\t\"
    redraw
  finally
    let &l:foldmethod = saved_foldmethod
    let &l:foldexpr = saved_foldexpr
  endtry
endfunction

" 適当にキーマッピングする。
nnoremap    <leader>f    :<C-u>call <sid>eval_foldexpr()<cr>
```
キー値監視（KVO）を理解する

キー値監視(KVO)とは、あるオブジェクトのプロパティの値が変更されたことを別のオブジェクトに
伝える仕組みのこと。

説明のため、監視されるオブジェクトfoo（Fooクラスのインスタンスfooとする）
と監視するオブジェクトbar(Barクラスのインスタンスをbarとする)を想定する。

fooオブジェクトはhogeというプロパティを持っておりこの値が変更されると
barオブジェクトに通知される。という状態をKVOを用いて実現する。

やることは２つ
1.監視オブジェクトの登録と監視キー（プロパティ）の登録
　->具体的にはaddObserver:forKeyPath:options:を用いて以下のように登録する。
`[foo addObserver:bar forKeyPath:@"hoge" options:NSKeyValueObservingOptionNew context:NULL];`
2.監視してる側で変更通知を受けれるようにする。
　->具体的にはbarクラスでobserveValueForKeyPath:ofObject:change:context:をオーバーライド
`- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"hoge property changed!");
}`
やることは以上。監視プロパティを編集すると通知を受けることができる。

参考までに検証に用いたコードを以下に置きます。

```objc:main.m

#import <Foundation/Foundation.h>

@interface Foo:NSObject
@property NSNumber* hoge;
@end

@implementation Foo
@end

@interface Bar:NSObject
@end

@implementation Bar
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"hoge property changed!");
}
@end

int main()
{
    Foo* foo = [[Foo alloc] init];
    Bar* bar = [[Bar alloc] init];
    
    [foo addObserver:bar forKeyPath:@"hoge" options:NSKeyValueObservingOptionNew context:NULL];
    
    foo.hoge = @1;
    [foo removeObserver:bar forKeyPath:@"hoge"];
    
    return 0;
}

```
#mozaicfm ep4 セキュリティ(プロトコル編)

# Security(protocol編)

[CCS Injection Vulnerability](http://ccsinjection.lepidum.co.jp/ja.html) を発見・報告した lepidum の @lef さん、菊池さんのお二人をゲストにお招きし、自分がやっている[次世代 Web Podcast Mozaic.fm](http://mozaic.fm) にて「セキュリティ(プロトコル編)」を明日(6/6 21:00 ~)録音します。

本当は、もう少し先で録音する予定だったのですが、今回の件をうけ急遽録音させていただくことになりました。(お二人とも本当にありがとうございます。)
そして、今回はお二人の許可のもと質問を募集してみます。


# 質問募集

このエントリは、普段 mozaic.fm を録音する前に、出演者の方と事前に限定共有しているラフノートです。(あくまで参考で、この通り進める台本というわけではありません。)

今回は先にこれを一般公開し、内容についてゲストのお二人への質問を募集してみたいと思います。
センシティブな分野であり、時間や内容の都合もあるので、回答は保証しません。試しに集めてみるという実験的な試みです。(質問募集自体はゲスト承諾済み)


質問がある方は、このエントリのコメント欄に投稿して下さい。
以下のラフノートで扱いそうなトピックに合っていれば、CCS Injection でなくても構いません。


録音は、

 _6/6(金) 21:00_ 

を予定していますので、それまでが期限です。
ちなみにライブ放送はありません。録音して、頑張って土曜日の午後公開を目指します。
(全てはベストエフォートです)

以下、お二人に送った mozaic.fm のラフノート。
---

# security(protocol)

## Guest

- @lef
- 菊池さん

## Theme

Security (protocol 編)
セキュリティの世界で何がおこっているのか、どこにむかっているのか？

## Rough Note

- CCS Injection
    - どのような脆弱性か？
    - 影響範囲・対策
    - 発見経緯

- 最近の脆弱性報告
    - [HeartBleed](http://heartbleed.com/)
    - [Covert Redirect](http://tetraph.com/covert_redirect/)
    - [DNS Cache Poisoning](http://jprs.jp/tech/security/2014-04-15-portrandomization.html)
    - [偽証明書発行](http://www.itmedia.co.jp/enterprise/articles/1312/10/news036.html)
    - etc

- SSL はどうなるのか？
    - OpenSSL の現状
    - PRISM
    - 日和見暗号
    - etc

- 今後
    - インターネット、、丈夫ですか？
    - 気にすべきこと、知っておくべきこと。
    - 何ができるのか、何をすべきか
    - 今後どうなっていくのか？

- 質問タイム

- 以下自由ゾーン


## Show Note

- [CCS Injection Vulnerability](http://ccsinjection.lepidum.co.jp/ja.html)
- [CCS Injection脆弱性(CVE-2014-0224)発見の経緯についての紹介](http://ccsinjection.lepidum.co.jp/blog/2014-06-05/CCS-Injection/index.html)
- [imperialviolet](https://www.imperialviolet.org/2014/06/05/earlyccs.html)
- [OpenSSL の Man-in-the-middle 攻撃可能な脆弱性の影響](https://sect.iij.ad.jp/d/2014/06/069806.html)
- [IPA - 「OpenSSL」における Change Cipher Spec メッセージ処理の脆弱性対策について(JVN#61247051)](http://www.ipa.go.jp/security/ciadr/vul/20140606-jvn.html)
- [Mark J Cox の G+ 投稿](https://plus.google.com/app/basic/stream/z12xhp3hbzbhhjgfm22ncvtbeua1dpaa004)
Mr. James CoplienのCertified ScrumMasterを受けてきた。(1日目)

Certified ScrumMaster(CSM)を受講してきましたので、自分の備忘録の意味も含めて、記録。
コースはこちら。
http://www.scrumalliance.org/certifications
私が受講したCSMは2日間の日程です。
本日は1日目の報告

# 内容
時系列で内容と私の主観を報告していきます。

## 講師自己紹介とスクラムに対する心構え
James Coplienさんの自己紹介と、Scrumへの熱い想いを語っていただきました。ちなみにJamesさんの話は全部英語でした。ゆっくりと簡単な英語で話していただけたので、英語が得意ではない私でも、大体理解することが出来ました。
自己紹介で印象的だったのが、
・Kaizen（改善） Mindを忘れるな！
・ScrumにはいわゆるManagerはいらない。解雇すべきだ！
でした。明快にScrumのあり方を示して頂いている感じです。

## 映像でのScrumプロセスの紹介
Scrumプロセスのプラクティスについて、映像で紹介いただきました。計画があり、デイリースクラムをして、レビューして、振り返る、というWebで調べれば出てくる内容です。古めかしい映像がGoodでした。

## アイスブレイク
本格的な講義に入る前にアイスブレイクを行いました。
アイスブレイクはある決まりの順番で並ぶというものでした。
決まりは以下の3つで、それぞれで並べ替えを行いました。
・スクラムの習熟度順
・直近でプログラミングした時からの短い順
・直近でエンドユーザと会った時からの短い順
このアイスブレイクはプロダクトバックログを並べるときの理解を易くする目的もあったと思います。

## Scrumについての座学
テキストを使って、Scrumについて教わりました。
以下、印象的だったお話。
・開発チームは長期安定すべきだ。
・開発は予想通りになるように管理する。
・開発チームは自己組織化（Self Organizeする）
・鶏は話してはいけないのメタファ（わかりやすい解説は[こちら](http://www.ryuzee.com/contents/blog/4215)の内容。リンク先は講義とは無関係）。
　・身を切るものだけが決定する権利がある。
・スクラムマスターはServant Leaderである。スクラムマスターがチームの為に働く。逆じゃない。
・スクラムマスターはScrumをうまく進めるために、チーム外に働きかける。impediments(障害)の排除を行う。
・スプリント計画は2週間のスプリントでは2時間ぐらい
・ミーティングは無駄だ！もちろん必要なムダはあるが！（Jamesさんの熱いトーク）
・合気道の守破離が大事。まずは守、いきなり破をすると、死んじゃう。
・Type A,B,Cのスクラムがある。（わかりやすい解説は[こちら](http://blog.xebia.com/2007/04/25/type-c-scrum-explained/)リンク先と講義は無関係）
・改善とは無駄・むら・無理をなくしていくことだ。
・無駄にも種類がある。不必要な無駄、付加価値を生む無駄、全く不要な無駄。
・生産性の追求は無駄の一つ。（在庫を生むだけだから。）価値が必要。
・改善とは、価値を上げることだ。改善を続けていくのがAgileだ。
・スプリントバックログの1つのチケットは、一人で一週間くらいでできるものがいい。

## エクササイズ
「茶室を作る」プロジェクトのプロダクトバックログを作成しました。
5,6人のチームを作り、ブレーンストーミングを行い要件を出したあと、全員（30人位）で、ひとつのプロダクトバックログを作成しました。
その後、上位の10個程度の要件について、各チームでプランニングポーカーを用いた見積りを行いました。
全てにおいて、スピードを要求しました。Jamesさんは無駄が嫌い。プロダクトを生み出していない時間は全て無駄。だから、いかに早くプロダクトバックログや見積りをするかを重要視していらっしゃいました。
実際、チームに分かれてプランニングポーカーを行った時は、時間のかかったチームや終わるのが早かったチームはありましたが、出たEstimateはどのチームも似通ったものでした。

これで一日目の内容は終了。

# 一日目結論
とても考えさせられました。
開発の価値とはなにか？開発者の価値とはなにか？その価値を上げていくために何をしていけばいいか。価値を上げるというマインドをチームが持つために、メンバーは何をしていかなければならないか。

悩みつつ、2日目に向かいます。
2日目は、また明日、記載します。
vagrant get / vagrant put作った


[この前のやつ](http://qiita.com/k12u/items/0f6ed08f7efb7f86af71)(すっごい早い`vagrant ssh`)もおまけでついてきます。

使い方は

 * `vagrant put /etc/profile` で VMのホームディレクトリにファイルをコピーする。
 * `vagrant get /etc/profile` でVMのファイルをカレントディレクトリにコピーする

(`vagrant ssh` などの `vagrant` のサブコマンドの互換性は完全には保たれていないかもしれない。こまったら`/usr/bin/vagrant`でなんとかなるのであまり十分にデバグしておりません)。

```bash:.bashrc
vagrant() {
    require_vagrantfile() {
        if [ ! -r Vagrantfile ]
        then
            $VAGRANT $@
            return 1
        fi
        return 0
    }

    VAGRANT=`which vagrant`
    CONFIG=".vagrant/vagrant_ssh_config"
    ORIGINAL_DIR=`pwd`

    pushd . > /dev/null
    until [ -f Vagrantfile -o $PWD = '/' ]
    do
        cd ..
    done

    case "x$1" in
        'xup' )
            if require_vagrantfile $@ && $VAGRANT $@
            then
                $VAGRANT ssh-config > $CONFIG &
            fi
            ;;
        'xget' )
            if require_vagrantfile $@
            then
                scp -F $CONFIG default:$2 $ORIGINAL_DIR/
            fi
            ;;
        'xput' )
            if require_vagrantfile $@
            then
                if [[ $2 == /* ]]
                then
                    SRC=$2
                else
                    SRC=$ORIGINAL_DIR/$2
                fi
                scp -F $CONFIG $SRC default:
            fi
            ;;

        'xssh' )
            if require_vagrantfile $@
            then
                if [ -f $CONFIG ]
                then
                    ssh -F $CONFIG default
                else
                    $VAGRANT ssh
                fi
            fi
            ;;
        * )
            popd > /dev/null
            $VAGRANT $@
            return
            ;;
    esac
    popd > /dev/null
}
[ruby] rubyinstallerのrbreadlineが失敗する件はパッチがありました

予習のためにWindows8タブレットでCRubyのwindows版を動かそうとしたところ、msys gitのgit bashで新しいruby2.1が使えなかった。ビルドしてみる。

ruby installer
http://rubyinstaller.org/
https://github.com/oneclick/rubyinstaller

まず既存のruby2.0をインストーラで入れる。

適当に作ったフォルダにソースをcloneしてrake。

以下を参考に手パッチ。
https://groups.google.com/forum/#!topic/rubyinstaller/8Fd3nxYrlek

```diff
--- rake/contrib/save-uri_ext.rb        Mon Apr 21 18:12:56 2014
+++ rake/contrib/uri_ext.rb     Mon Apr 21 19:59:13 2014
@@ -250,8 +250,8 @@
             return (self + URI.parse(response['location'])).read(options, &block)
           when Net::HTTPOK
             puts "Downloading #{self}" if Rake.application.options.verbose
-            result = nil
-            with_progress_bar options[:progress], path.split('/').last, response.content_length do |progress|
+            result = nil; cl = response.content_length; cl = 0 if cl == nil
+            with_progress_bar options[:progress], path.split('/').last, cl do |progress|
               if block
                 response.read_body do |chunk|
                   block.call chunk
```

```shell-session
$ cd /c/ruby
$ git clone https://github.com/oneclick/rubyinstaller.git
$ rake -T
$ rake ruby21 dkver=mingwbuilds-32-4.7.3
$ cp -ar sandbox/ruby21_mingw/ /c/ruby/212
$ cp -ar sandbox/ruby21_mingw/ /c/ruby/212
```

コピー先にパスを通して終了。

僕の環境だとこのパッチがないとrbreadlineのダウンロードの状況表示ができなくてタスクが中断する。パッチを当てずにビルドしてしてまってから３日調べて、パッチを当てて rakr rbreadline したら上手くいった。

* Windows8.1
* ビルドに使ったrubyは 2.0
* msys git のbashから。

パッチが投稿されたMLからたどった先に、ruby2.1.2のテスト総数と警告数が書かれていてエラーは特にないとの情報あり。違いが分かりだすまでは鵜呑みにするつもり。これから「初めてのruby」を読み下す。
作業中ブランチのプルリクエストをブラウザで開く

WIPとかプルリクエスト出した後にゴチャゴチャ作業してる状態の時にちょくちょくgithubの画面開きたいのでコマンドにした。

```propen:bash
propen() {
    local current_branch_name=$(git symbolic-ref --short HEAD | xargs perl -MURI::Escape -e 'print uri_escape($ARGV[0]);')
    git config --get remote.origin.url | sed -e "s/^.*[:\/]\(.*\/.*\).git$/https:\/\/github.com\/\1\//" | sed -e "s/$/pull\/${current_branch_name}/" | xargs open
}
```

```propen:bash
propen() {
    local current_branch_name=$(git symbolic-ref --short HEAD | xargs perl -MURI::Escape -e 'print uri_escape($ARGV[0]);')
    hub browse -- pull/${current_branch_name}
}
```

zshとbashで動いた。

最初hubコマンド必要だったけどgitとperlだけ入ってればできるようにした（`sed`コマンド入って読み辛くなったけど）がGitHub:Eなどでうまく動かな時はhubコマンドの方に置き換えてみて。

URLエンコードにperlを介する必要があったがgit入ってればperlあるしいい気がする。

https://github.com/hatena/Hatena-Textbook/pull/6

このプルリクエスト出した時は`patch-1`ブランチで作業してた。

```
propen
```

とコマンドを打つとブラウザで勝手に https://github.com/hatena/Hatena-Textbook/pull/patch-1 を開き、https://github.com/hatena/Hatena-Textbook/pull/6 へリダイレクトされる。
リダイレクトされるのは単にGitHubの便利機能らしい。

同名ブランチあったらどうなるんだろう。
リストだけじゃない内包表記

勉強資料でリスト内包表記が出てくることで内包表記はリストにしかつかえないと思い込んでいたのですが 色んな所につかえるとわかったのでまとめた
英語だと `list comprehension` なので他にもつかえる感じする

```pycon
~ %python3
Python 3.4.0 (v3.4.0:04f714765c13, Mar 15 2014, 23:02:41) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from itertools import tee
>>> Generator = (i for i in range(10))  #ジェネレーター内包表記
>>> g = tee(Generator, 5)  #ジェネレーターを5つに
>>> Str = "comprehension"
>>> List = [g[0]]  #リスト内包表記
>>> Tuple = tuple(g[1])  #タプル内包表記
>>> Dict = {k:v for (k,v) in zip(Str, g[2])}  #辞書内包表記 dict(zip(Str, g[2])) でも同じ
>>> Set = set(s for s in Str)  #セット内包表記 set(Str) でも同じ
>>> g
(<itertools._tee object at 0x102a6ab08>, <itertools._tee object at 0x102a6aac8>, <itertools._tee object at 0x102a6ab48>, <itertools._tee object at 0x102a6ab88>, <itertools._tee object at 0x102a6af08>)
>>> List
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> Tuple
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> Dict
{'c': 0, 'p': 3, 'm': 2, 'h': 6, 'r': 4, 'e': 7, 'o': 1, 'n': 8, 's': 9}
>>> Set
{'p', 's', 'e', 'c', 'h', 'm', 'r', 'o', 'n', 'i'}
>>> sum(g[3])  #総和
45
>>> g[4]
<itertools._tee object at 0x102a6ab88>
>>> while g[4]:
...     next(g[4])
... 
0
1
2
3
4
5
6
7
8
9
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration
```
DocSet がダウンロード済みになってダウンロードし直せない場合の対処方法


新しい Xcode をインストールするなどして古い DocSet がなくなってしまったのに、その DocSet がダウンロード済みとされてしまい、再ダウンロードできない場合があります。

DocSet がダウンロード済みかどうかの情報は 

    ~/Library/Developer/Shared/Documentation/DocSets/Library/Receipts

にあります。

ですので、このフォルダの中身を空にすれば、もう一度ダウンロードできるようになります。
新しくアプリをインストールしてもAlfredに追加されないときは…


Xcode6-Betaをインストールし，起動しようと思っても **なぜかAlfredに出てこない**（Launchpadには出てきてる），という事件があった．

最近MBAに加えた変更のなかで思い当たったのが， **Spotlightを無効化した**こと．

「AlfredがあればSpotlightいらねーじゃんヽ(´ー｀)ノ」 ← **まちがい**

AlfredはSpotlightと同じインデックスを利用するので，Spotlightのインデックス作成を止めてしまうとAlfredも更新されなくなる．

> Alfred relies on the same OS X metadata index as Spotlight. As such, it's important for you to let Spotlight run on your Mac to maintain an index of the files on it.
>
>Turning off Spotlight indexing will still allow you to use Alfred as a web launcher but you'll no longer be able to find files on your Mac.
>
> <cite>[Can Alfred work without Spotlight enabled? - Alfred v2 Support](http://support.alfredapp.com/kb:spotlight)</cite>


ということで，Spotlightを再度有効化しましょう（無効化するときに参照したページに書いてあったりするので頑張って調べよう(∩´∀｀)∩）．

Alfredがないと不便だなーと再認識したのでした．
rails4 + bootstrap + Nod (jQuery frontend validation)で作るウェブフォーム

jquery validation pluginを使うのがメジャーな気がしますが
シンプルで分かり易いnodを使いました。

Nod(A frontend validation jQuery plugin)
http://casperin.github.io/nod/

form-builderにはrails-bootstrap-formsを使いました。

rails-bootstrap-forms
https://github.com/bootstrap-ruby/rails-bootstrap-forms

それぞれ必須項目だったりemailのフォーマットをチェックして欲しいですよね。
あとfieldの指定と同時にlabel書きたいですよね。

```erb
<%= f.text_field :name, label: "お名前", placeholder: "例)山田花子" %>
<%= f.text_field :name_kana, label: "お名前(カナ)", placeholder: "例)ヤマダハナコ" %>
<%= f.telephone_field :phone_number, label: "電話番号", placeholder: "例)012-3456-7890" %>
<%= f.email_field :email, label: "e-mail", placeholder: "sample@webcreation.co.jp" %>
```

お名前のfieldは以下のようなhtmlになります。自動でform-groupで囲まれてcol-xの指定、labelが生成されています。inputのclassにはform-controlも入ります。

```html
<div class="form-group">
 <label for="form_my_form_name" class="control-label col-sm-4">
 お名前
 </label>
 <div class="col-sm-8">
  <input type="text" placeholder="例)山田花子" name="form_my_form[name]" id="form_my_form_name" class="form-control">
 </div>
</div>
```

javascriptでこんな感じです。validationのルールとclassの指定がrails + bootstrapに沿って書けるので分かりやすいですよね。

```js
  /* ここちょっと苦しい */
  <% domPrefixId = "#form_my_form" %>
  $("#form").nod([
    ['<%= domPrefixId %>_name', 'presence', '入力が必須な項目です。'],
    ['<%= domPrefixId %>_name_kana', 'presence', '入力が必須な項目です。'],
    ['<%= domPrefixId %>_phone_number', 'presence', '入力が必須な項目です。'],
    ['<%= domPrefixId %>_email', 'presence', '入力が必須な項目です。'],
    ['<%= domPrefixId %>_email', 'email', 'メールアドレスの形式が正しくありませんでした。入力したメールアドレスをご確認下さい。'], 
  ], {
    submitBtnSelector: '.submit-button',
    disableSubmitBtn: false,
    errorClass: 'text-danger',
    groupSelector: '.form-group',
    groupClass: 'has-error has-feedback',
  });
```

フォームがフロントエンドでのバリデーション込みですっきりです。
PyenvをCentOS6.3でセットアップする（超かんたんリファレンス付き）

#ゴール
CentOS 6.3でpyenv+pyenv-virtualenvをセットアップする。
よく用いるpyenvのコマンドについてもメモしておきます。

#目的
自動セットアップの前にやるのですが、よく忘れるので。。。
＃テンプレートにしておけばいいんですけどね

#手順
##準備

依存しているものをインストールしておく。
結構ここでハマります。。。
(なお依存しているパッケージはビルドするPythonバージョンによりことなる場合があります)

```bash
yum install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel bzip2 sqlite
 zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
```

##インストール

なにはともあれclone

```bash
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```

<以下を.bashrcに追加>

```bash
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```

読み込んどく。

```bash
source ~/.bashrc
```

##確認

インストール可能なバージョンが表示されるか確認

```
pyenv install --list
```

##Add-on(pyenv-virtualenv)

Pyenv-virtualenvを使うとバージョンも環境も簡単にスイッチできるので入れておく。

```bash
cd ~/.pyenv/plugins
git clone git://github.com/yyuu/pyenv-virtualenv.git
```




#pyenv+pyenv-virtualenvリファレンス
よく使うものをメモしておきます。
全体的にrbenvチック。

##インストール可能なバージョンを確認する

```bash
pyenv install --list
```


##バージョン指定してインストール

"pyenv install [version]"でインストール可能。

```bash
pyenv install 3.3.0
```


##インストールしたバージョンの一覧を確認

インストールしたバージョン、およびシステムデフォルトのものが表示されます。

```bash
pyenv versions
```


##グローバルのバージョン指定

"pyenv global [version]"の書式です。
基本、rbenvと同じ。

```bash
pyenv global 2.6.6
```

##ローカルのバージョン指定
今いるディレクトリで用いるバージョンを指定します。
"pyenv local [version]"

```bash
pyenv local 3.3.3
```


##バージョンを指定しての仮想環境

バージョンを指定して仮想環境を作ります。
これを作っただけではカレントディレクトリに環境が適用されないので注意。

"pyenv virtualenv [version] [virtualenv名]"

```bash
pyenv virtualenv 2.7.6 testvirtualenv
```

これで作成すると、"pyenv versions"でその仮想環境が表示されるようになります。

##仮想環境をカレントディレクトリに適用

"pyenv local [virtualenv名]"

```bash
pyenv local testvirtualenv
```
階乗の素因数分解を求める

# 動機

大きな数の階乗を直接計算機上で扱おうとすると、例えば32bitなら12の階乗までしか表現できないので、ちょっとした数字でいきなり多倍長演算が必要になってきます。

しかし、例えば $12!=1\times2\times3\times4\times5\times6\times7\times8\times9\times10\times11\times12$ は、素因数分解して $=2^{10}\times3^5\times5^2\times7^1\times11^1$ とも表現できます。

# アルゴリズム

階乗を素因数分解したときに各素数が何個出現するかは、次のように容易に求められます。

$12!=1\times2\times3\times4\times5\times6\times7\times8\times9\times10\times11\times12$ には $2$ の倍数が $\lfloor12/2\rfloor=6$ 回出現し、 $2^2$ の倍数が $\lfloor12/2^2\rfloor=3$ 回出現し、 $2^3$ の倍数が $\lfloor12/2^3\rfloor=1$ 回出現します。この $6+3+1$ が、 $12!$ を素因数分解したときの $2$ の個数というわけです。

$3$ についても同様で、$\lfloor12/3\rfloor+\lfloor12/3^2\rfloor=5$ となります。

追記 2014/8/28
これを一般化したものを、「[ルジャンドルの定理](http://mathtrain.jp/legendre)」ということもあるようです。

[Factorial](http://en.wikipedia.org/wiki/Factorial) (Wikipedia)

>Adrien-Marie Legendre found that the multiplicity of the prime $p$ occurring in the prime factorization of $n!$ can be expressed exactly as
>    $$\sum_{i=1}^{\infty} \left \lfloor \frac{n}{p^i} \right \rfloor$$

追記終わり

これらから次のような手順で求められそうです。 $n!$ の素因数分解を求めるには、まず $n$ までの素数のリストが必要になりますので、これをエラトステネスのふるいで作っておきます。そして、それらの素数の1乗での商、2乗での商、……を順に求めれば、それらの和が、素数の必要個数となるわけです。

ふるいのために $n$ 要素の配列を用意したので、メモリ容量による制約が発生してしまいますが、遅延評価のできる言語であれば無駄にメモリを消費しない記述ができるので、有利と思われます。

# コード

```c:factfact.c
#include <stdio.h>

void
factfact(int n) {
  int prime[n+1];
  int i, j;

  for (i = 2; i <= n; i++) {
    prime[i] = 1;
  }
  for (i = 2; i <= n; i++) {
    if (prime[i]) {
      for (j = i*2; j <= n; j += i) {
        prime[j] = 0;
      }
    }
  }
  for (i = 2; i <= n; i++) {
    if (prime[i]) {
      prime[i] = 0;
      for (j = i; j <= n; j *= i) {
        prime[i] += n/j;
      }
      printf("%d^%d\n", i, prime[i]);
    }
  }
  printf("\n");
}

int
main(void) {
  factfact(12);
  factfact(1000000);
  return 0;
}
```
識別子の命名規則（記法）の種類について

#**はじめに**

識別子（変数や定数、関数などに付けられた名前の総称）の命名規則は幾つか種類があります。
識別子の命名規則と言われると仰々しい感じがしますが、単純に変数や関数などの名前をどのように記述するかのルールです。
ネットや書籍などで様々な命名規則の名称が使われており、最初は覚えるのも大変そうだなと思いましたが、まとめたら主に4種類しかありませんでした。

#**キャメルケース記法**

キャメルケース記法には「アッパーキャメルケース（パスカルケース）」と「ローワーキャメルケース（キャメルケース）」の2種類があります。

##**アッパーキャメルケース（別名：パスカルケース）**

単語の先頭文字を大文字で表記する記法。

```記述例
DeathMarch
```

##**ローワーキャメルケース（別名：キャメルケース）**

最初の単語のみ小文字で表記し、以降の先頭文字を大文字で表記する記法。

```
deathMarch
```

#**アンダースコア記法（別名：スネークケース）**

単語の間にアンダースコアを入れる記法。

```
death_march
```

#**ハンガリアン記法**

ハンガリアン記法には「システムハンガリアン」と「アプリケーションハンガリアン」の2種類があります。
単に「ハンガリアン記法」と言及された場合は、「システムハンガリアン」の意味で用いられることが多いそうです。

##**システムハンガリアン**

先頭に型の接続語を入れる記法。
例えば、文字列（string）の場合だと先頭に```s```を入れる。

```
sDethMarch
```

##**アプリケーションハンガリアン**

よくわからないのでウィキペディアの説明を引用します。
あまり使用されないそうです。

>アプリケーション ハンガリアンは、間違えたコードを間違えて見えるようにする記法である。
たとえば、相対座標にRelative Positionのrp、絶対座標にAbsolute Positionのapというプレフィックスとした場合、ウィンドウの位置を設定する window.SetPosition(rpX, apY); のような記述は明確に誤りであることがわかる。
また、ドルにプレフィックスdol、円にプレフィックスyenとした場合、dolIncome + yenDeposit のような計算は間違いであることが明確である。
このように、間違えているコードを間違えているように見えるように記述するのが元々のハンガリアン記法である。

［引用元］[ウィキペディア（ハンガリアン記法）](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95)
インスタンスメソッド内でクラスメソッドを呼ぶ #Swift

Objective-Cでいうところの `[[self class] classMethod]` を Swift では以下のように書くことが出来るようです。

```swift
class Hoge {
    class func classMethod() {
        println("classMethod")
    }

    func method() {
        self.dynamicType.classMethod()
    }
}

let hoge = Hoge()
hoge.method() // "classMethod"
hoge.dynamicType.classMethod() // "classMethod"
```

`dynamicType`を使うと、インスタンスのクラス自身（サブクラス化されていればサブクラス）が参照され、クラスメソッドを呼び出すことが出来るようになります。
Swiftで簡単なアプリ実装してみた

![swift1.png](https://qiita-image-store.s3.amazonaws.com/0/4615/f741b670-656a-956b-99ea-0087592be3eb.png)

1. XcodeでSwiftのプロジェクトを新規作成
2. xibファイルを編集
3. NSTextFieldをIBOutletとして接続
4. NSButtonのsent actionを接続して実装

簡単ですね。
WebWorkerのデバッグで覚えておかないと面倒なこと

##はじめに
HTML5から並列処理を行えるようになりました。
まだ使い始めなのですが、ハマって面倒だったことが合ったので、
備忘も兼ねて書いておきます。
自分で書けば・・・　　　　恥を晒して・・・　

##何が面倒か
「デバッグ」。気づくまではconsole.logとかでやんないといけないの？
とアホなことを考えてみました。でもGoogle Expert SeriesのHTML5の本にも
載っていないし、痒いところに手が届いていない感じでした。
方法は簡単、というか気づけば何の問題もありません。

##WebWorkerの並列処理をデバッグする
ちょっと見づらいですが、開発者ツールからいけます。
Sourceタブを開いて、下記の画像の赤い枠を見て下さい。
１，Pause on start にチェックを入れておくと、WebWorkerの初期化時に
　　WebWorker用の開発者ツールがもう一つ出てきます。
２，Dedicated worker inspectors　に現れるリンクを押すと、
　　初期化済みのWorkerの開発者ツールが開きます。
![devtool.png](https://qiita-image-store.s3.amazonaws.com/0/44982/73372b94-1e47-5455-efde-0452f8166c15.png)


##SharedWorker
共有ワーカーです。ここにも書いたhttp://azumaxlife.smile-systems.com/archives/995
んですが、いまいち簡単でイケてる用途が出てきていません。そのうち実例を書きます。
デバッグ方法は以下です。
１，<a href="chrome://inspect/#workers">chrome://inspect/#workers</a>　にアクセス
２，下記の写真みたいなのが出るので、inspectをクリック
![worker.png](https://qiita-image-store.s3.amazonaws.com/0/44982/78bbe999-9dc8-c644-33ea-52a6e05e2792.png)

より良いWebWorker生活をお過ごしくださいｗ
【Java初心者】演算子での注意～インクリメント、デクリメント～

Java歴約１年です。
今更ながら「そういうことだったのね!」ということがたくさんです。
本日は演算子で注意する部分についてまとめます。

##インクリメント、デクリメント

``` 
a++ 
```
で a に1プラスできます。
しかし、a++ と ++a では意味が違ってきます。

###a++
このときは、ほかの処理が終わってからaに1プラスされます。
たとえば

```
int a = 0;
if (a++>0) {
    System.out.println("if文の中");
    System.out.println("a = " + a);
} else {
    System.out.println("if文の外");
    System.out.println("a = " + a);
}

```
とすると、if文の判定には引っ掛かからず、「ifの外」と出力されますが、「a = 1」が出力されます。
a = 0 で判定が行われた後に1プラスされるからです。

###++a
このときはaに1プラスされたあとにほかの処理が行われます。
たとえば

```
int a = 0;
if (++a>0) {
    System.out.println("if文の中");
    System.out.println("a = " + a);
} else {
    System.out.println("if文の外");
    System.out.println("a = " + a);
}


```
とすると、今度は「if文の中」と出力され、「a = 1」とも出力されます。
aにプラス1された後でif文の判定が行われるためです。

私は「先にプラスが書いてあるから先に足す」という普通のおばえ方をしています。
リアルタイムのvalidationにはParsley.jsが便利

サーバー側のチェックだけでなく、javascriptにてリアルタイムで値のチェックを行いときは多々あります。

いろんなツールがありますが、小生はParsleyを使ってます。他のツールは少なからずjavascriptを書かなくてはいけないのですが、Parsleyは基本的な使い方であれば特に書く必要はありません。

別にjavascriptを書くことが悪！というわけでは無いですが、シンプルになるのはいいことです。

http://parsleyjs.org/

ちなみにrailsではこんな風に書くようです。

https://github.com/bonzoSPb/sample_app/blob/1b68646869e8109fd55d4d38a2c38b55af35a762/app/views/users/new.html.erb

勿論サーバー側のチェックも忘れずに。

下記のサイトを構築するさいに少しだけ使っています。

http://av-girls.me/blog_feeds/5
ランダムな英数字の文字列を作成

最近、助かりましたってコメントをいただいたので、
前のブログから転載。

桁数が指定できて、これすごい便利！
ここで載ってました。
http://ameblo.jp/linking/entry-10289895826.html

```php
/**
 * ランダム文字列生成 (英数字)
 * $length: 生成する文字数
 */
function makeRandStr($length) {
	$str = array_merge(range('a', 'z'), range('0', '9'), range('A', 'Z'));
	$r_str = null;
	for ($i = 0; $i < $length; $i++) {
		$r_str .= $str[rand(0, count($str) - 1)];
	}
	return $r_str;
}
```
SwiftでCocoaPodsを使う

SwiftからCocoaPodsを使う方法をメモ

# Swiftのプロジェクトを作る
新規作成→Swiftを選んでプロジェクトを作る。
Githubから適当なサンプルプログラムを持ってきてもいい

# Podfileの作成
プロジェクトのトップにPodfileを作成
ライブラリはAFNetworkingで

- プロジェクト

```bash
.
├── Podfile
├── SwiftExample
├── SwiftExample.xcodeproj
├── SwiftExample.xcworkspace
└── SwiftExampleTests
```

- Podfile

```bash
platform :ios, "8.0"
pod 'AFNetworking', '~> 2.0'
```

- ライブラリインストール

```bash
pod install
```

インストール後は```xcworkspace```を開く

# Bridging-Headerを作る
Swiftで使いたいコードのヘッダーをインポートしておくためにBridging-Headerというインターフェイスとなるヘッダーを追加する必要がある。

xcodeから作成すると設定を自動でしてくれるので、New Fileメニューから```Cocoa Class```を選び、言語をObjective-Cにしてクラスを生成する。
途中でbridging header作る？って聞かれるからYES。
名前はSwiftExample-Bridging-Header.hにしておく。

![screen-shot.png](https://qiita-image-store.s3.amazonaws.com/0/42035/9a53ff2f-a876-5fbc-caa9-8d2ab9fe3bc2.png)

このファイルに次の一行を追加する。

```objc
#import <AFNetworking/AFNetworking.h>
```

# Bridging-Headerの設定

最後に BuildSettings -> All -> 検索 "Objective-C B" まで打てば　Objective-C Bridging Header という設定があるので、そこに　Bridging Header までのパスを指定する。

![スクリーンショット 2015-06-19 10.18.41.png](https://qiita-image-store.s3.amazonaws.com/0/42035/ba6e9cf0-6716-bba0-7dfd-97e68d10f077.png)


# ビルド
するとSwift側からライブラリのコードを利用できるようになる。
特にSwift側にはimport文など書かなくてもいいようだ。
あとはビルドしてエラーがないことを確認すればよい
PhalconのModelで空白文字をムリヤリ許容する方法

## Phalconでイライラするところ！

以前から利用していたレガシーのDBをベースにPhalconでシステムを構築する場合、以下のイライラに直面する場合があります。

**NOT NULLのカラムに空白文字を挿入しようとするとvalidationエラーで更新されない！**

これで私は半日ほど潰しました。。。そのときはカラムのNULLを設定することで回避したのですが、そうも行かないケースもあり。。

## 解決策

該当のModelクラスで以下の実装をすればOKです。<code>allowEmptyColumns</code> に空白文字を許容したいカラムを一覧で設定し、<code>beforeValidation</code>メソッドをオーバーライドします。

~~~php
<?php
class MyModel extends \Phalcon\Mvc\Model
{
    ...
    
    private function allowEmptyColumns()
    {
        return array(
            'address',
            'tel',
            '...'
        );
    }
    
    public function beforeValidation()
    {
        foreach ($this->allowEmptyColumns() as $col) {
            if ($this->$col === '') {
                $this->$col = new \Phalcon\Db\RawValue('""');
            }
        }
    }
}
~~~

## 参考URL

なお元ネタは以下のスレッドですので、他の解決策など探したい方はご参照ください。
https://github.com/phalcon/cphalcon/issues/440
SwiftとObjective-Cの相互利用する際の注意


とりあえずObjCとswiftを相互利用する時にいくつかハマったので書きたいと思います。

ちゃんとここ読んでいればわかることなんですが
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/

Swiftの中でObjective-Cのクラスを使う
---

SwiftのプロジェクトでObjCのファイルを追加しようとするとXcodeがダイアログを出し、
プロジェクトの設定を変更してSwiftとObjC間の連携ができるようにしてくれます。

具体的に以下の様な設定変更をします。

+ プロジェクトに <# ProductName #>-Bridging-Header.h という名前のファイルを追加
+ Build SettingsのObjective-C Bridging Header に上記ファイル名を設定

そしてSwiftで作成したObjCのプロジェクトを利用しようとするとObjCのクラスが見つからずコンパイルエラーになります。

```swift:Swift
let objcObj = MyObjCObject() // コンパイルエラー
```

早速ここでハマったのですが、Swift内でクラスを解決するためには上記で追加されたファイルに
import文を書く必要があります。

```objc:#ProductName#-Bridging-Header.h
#import "MyObjCObject.h"
```

こうすることでSwift内でObjCのクラスを呼び出すことができるようになります。

```swift:Swift
let objcObj = MyObjCObject() // 今度は通る
```


逆に言うとSwift内で利用したいObjCのクラスはすべて上記ヘッダーファイルにimport文を書かなければなりません。

ダイアログで設定変更するとこのヘッダーファイルが追加されていることに気づかなくてハマりました・・・・

Objctive-Cの中でSwiftのクラスを利用する
---
今度は逆にObjCのなかでSwiftのクラスを使います。
こちらは簡単で<# ProductName #>-Swift.hというファイルが自動生成されるのでそれをimportするだけです。

```objc:Objective-C
#import "ProductName-Swift.h"
```

が、使おうとするとまたしてもコンパイルエラーになりました。。。

```objc:Objective-C
MySwiftObject *swiftObj = [MySwiftObject new]; // コンパイルエラー
```

今度はなんでだ！とここでまたハマったのですが、
ObjCで利用したいSwiftクラスはNSObjectのサブクラスである必要が有ることがわかりました。
NSObjectのサブクラスでないと上記自動生成のヘッダーファイルに宣言が現れません。

```swift:Swift
class MySwiftObject: NSObject {
// implementation
}
```

こうすることでObjC内でSwiftのクラスが利用可能になりました。

```objc:Objective-C
MySwiftObject *swiftObj = [MySwiftObject new]; // 今度は通る
```

まとめ
---
自分だけかもしれませんが下記の２つを忘れないように注意しましょう！

+ **<# ProductName #>-Bridging-Header.hにimport文を書く！**
+ **SwiftのクラスはNSObjectのサブクラスにする！**
カスタムリポジトリが作成されない時の対処法

EntityからCustomReopsitoryを作成しようとEntityにアノテーションを追加。

```
// src/Blogger/BlogBundle/Entity/Blog.php
/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 */
class Blog
{
    // ..
}
```

そして`$ php app/console doctrine:generate:entities Blogger\BlogBundle`を実行。
エラーはでないがカスタムRepositoryが作成されない。

ぐぐったところ、
>推測ですが、バンドル内に複数の形式のマッピング情報ができてしまっていることが原因ではないかと思います。 

>・エンティティクラスに定義したアノテーション 
・データベースからインポートした時のXML 
（http://docs.symfony.gr.jp/symfony2/cookbook/doctrine/reverse_engineering.html 
の通りのコマンドであれば） 

>この状態で doctrine:generate:entities 
を実行しても、アノテーションではなくXMLの方からメタデータを読み込んでしまうため、カスタム>リポジトリの記述が有効になりません。 



>ですので、もしバンドルの Resources/config/doctrine/ 
>ディレクトリあたりに生成されたXMLファイルが残っているようでしたら、これを削除してから、再度 
>doctrine:generate:entities を実行してみてください。 

ということで、EntityをDBから作成したときのxmlファイルを削除して再度コマンドを実行したらできました。
2 つの変量の関係を調べる (2)

今日はキッチンに立って炒めたキャベツの中華スープを作ろうと思います。よくかき混ぜてから、ほんのひとくち味見をして、料理の出来を判断します。

あるいは、会社の採用面談において、ほんの数十分の顔合わせでその人が社員にふさわしいかどうかを判断したりします。

もしくは、ほんの数カ月あるいは一年程度の交際で、その後ずっと一生連れ添う相手として結婚を決意したりします。

このように、一部の標本から母集団を推測することこそ、推測統計の極意なのです。

## 標本抽出

2 つの変量を選択するにあたり、標本を母集団から抽出することになります。以前も説明した通り[標本抽出法](http://qiita.com/ynakayama/items/d7f6989a4e17ed8a05ec)にはさまざまな種類があります。

[前回の例](http://qiita.com/ynakayama/items/3f9f8bf0283ff5ae57c6)では、ある高校生のクラスの 10 名に注目してスポーツの成績を抽出しました。

これで高校生全体の成績が立ちどころにわかるというわけではありません。しかし、このような標本の統計的な情報から全体をある程度の正確性で推測することが可能になるわけです。つまり標本の抽出はそれ自体が目的なのではなく、全体を把握するための手段というわけなのです。

## 相関関係

[前回の例](http://qiita.com/ynakayama/items/3f9f8bf0283ff5ae57c6)で、握力と珠投げの関係はいくぶんか右上がりに分布しているように見えました。

そしてその相関係数は 0.53 でした。多少の正の相関があることになります。

相関係数 r(x,y) の値は -1 から 1 の範囲となり絶対値 1 に近いほど相関の程度が強くなります。

## 回帰直線

ここであらためて 2 つの変量 x,y について考えてみます。

|項目|値|
|:--|:--|
|変量 x| x_1, x_2, ..., x_n|
|変量 y| y_1, y_2, ..., y_n|

変量 x,y の相関図で、中心 O'(x,y) を通る直線

```math
y=a(x-\overline{x})+\overline{y}
```

のうち N 個の点

```math
P_1(x_1,y_1), P_2(x_2,y_2), ... P_N(x_N,y_N)
```

に一番近い直線を考えてみましょう。

y の x への回帰直線は次のとおりになります。

```math
\frac {y-\overline{y}} {\sigma(y)} = r(x,y) \frac {x-\overline{x}} {\sigma(x)}
```

[線形回帰については以前も説明](http://qiita.com/ynakayama/items/d6e8513791b43f18d28b)しました。最小二乗法についてもう一度思い出してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e23b4e34-ed40-b16e-74ea-0a963c304fa6.png)

相関係数が 1 に近くなると (r(x,y) → 1), 上の S_0 → 0 となりますから、散布図のすべての点はしだいに直線に近い形で分布していくことになるわけです。

## 参考

ゼロから学ぶ統計解析
http://www.amazon.co.jp/dp/4061546562
[PlantUML] rawdeflate.js の参照方法がおかしい件

# 問題
> rawdeflate.js is implicity used by jquery_plantuml.js

らしいんですが、UMLを埋め込む対象のHTMLファイルと同じディレクトリに rawdeflate.js がないと、動きませんでした。
[2013年1月には既に本家で報告されている](http://plantuml.sourceforge.net/qa/?qa=141/better-jquery-integration)んですが、いまだに修正が取り込まれていないようです。

# 対応方法

jquery_plantuml.js の該当箇所（たぶん55行目以降？）を下記のように書き換えます。
[github にあげました。](https://github.com/toshi0383/jquery_plantuml)

```js
var rawdeflate_url = $('script[src*="jquery_plantuml.js"]').attr('src');
rawdeflate_url = rawdeflate_url.replace("jquery_plantuml", "rawdeflate");

var deflater = window.SharedWorker && new SharedWorker(rawdeflate_url);
if (deflater) {
 deflater.port.addEventListener('message', done_deflating, false);
 deflater.port.start();
} else if (window.Worker) {
 deflater = new Worker(rawdeflate_url);
 deflater.onmessage = done_deflating;
}
```

これで、jquery_plantuml.js と rawdeflate.js を同じディレクトリに配置すれば動くようになります。
上の本家の投稿だとsubstringでやっているんだけど、なんでreplace を使わないんだろう。

# 参考
 - [PlantUMLを使ってシーケンス図を描く](http://qiita.com/nanki@github/items/2d4da7ccb2d74732c737)
CentOSでSymfony2をインストールする際、ICUライブラリのバージョンでつまづく

Symfony 2.3 をダウンロードし `php composer.phar install` すると以下のようなエラーが出ることがある。

```
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for symfony/icu v1.2.0 -> satisfiable by symfony/icu[v1.2.0].
    - symfony/icu v1.2.0 requires lib-icu >=4.4 -> the requested linked library icu has the wrong version installed or is missing from your system, make sure to have the extension providing it.
  Problem 2
    - symfony/icu v1.2.0 requires lib-icu >=4.4 -> the requested linked library icu has the wrong version installed or is missing from your system, make sure to have the extension providing it.
    - symfony/symfony v2.3.3 requires symfony/icu ~1.0 -> satisfiable by symfony/icu[v1.2.0].
    - Installation request for symfony/symfony v2.3.3 -> satisfiable by symfony/symfony[v2.3.3].
```

対処法は下記。
composer.jsonのrequireに`"symfony/icu": "1.0.1",`を追加。
composer.lockのversionを1.0.1に変更。
`            "name": "symfony/icu",
            "version": "v1.0.1",
`
リモートサーバのデータベースの再設定


間違えてFuelPHPのconfig内のDBの設定ファイルをlocalhostのものに書き換えてしまい、リモート上のDBにフレームワークからアクセスできなくなってしまい、再設定が必要になったのでこの際にやり方を。

#1.ユーザーの再設定
①mysqlにアクセス

②ユーザ、パスワードの再設定

```
mysql> SET PASSWORD FOR 'ユーザ名'@'ホスト名' = PASSWORD('パスワード');
```

これで

```
Query OK, 0 rows affected (0.00 sec)
```
が表示されれば更新完了。

#2.FuelPHPの設定
```
% vim /プロジェクト名/fuel/app/config/producion/db.php
```
で

```db.php
/**
 * The production database settings. These get merged with the global settings.
 */

return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=DB名',
            'username'   => 'ユーザ名',
            'password'   => 'パスワード',
        ),
    ),
);

```

これで正常にDBにアクセスできるようになります。

そもそもローカルで環境構築を構築して作業をする際には、
config等の設定ファイルの取り扱いには細心の注意を払わないといけないですね。
文頭に記号を入れたリストなどで改行されても字面を合わせるCSS

よくわすれるのでメモ

```css:字面を合わせるCSS
li {
  text-indent:-1em;
  padding-left:1em;
}
```
びふぉー
![be.gif](https://qiita-image-store.s3.amazonaws.com/0/37850/736a2404-4ab2-7191-437d-3aa9bf9ef7f3.gif)

あふたー
![af.gif](https://qiita-image-store.s3.amazonaws.com/0/37850/9f12166a-e6be-0caa-3071-14504de4a713.gif)
SwiftでNSURLSession

NSURLSessionでWebページから情報を取ってくるのをSwiftで。
Objective-Cの時と比べて、completionHandlerがスッキリしてる。

```swift
import Foundation

let url  = NSURL.URLWithString("http://qiita.com/")
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let task    = session.dataTaskWithURL(url, completionHandler: {
    (data, resp, err) in
        println(NSString(data: data, encoding:NSUTF8StringEncoding))
    })

task.resume()
```

### Objective-Cだとこうでした

```objc++
NSURL            *url     = [NSURL URLWithString:@"http://qiita.com/"];
NSURLSession     *session = [NSURLSession defaultSessionConfiguration];
NSURLSessionTask *task = [session dataTaskWithURL:url
  completionHandler:^(NSData *data, NSURLResponse *resp, NEError *err) {
    NSString *res = [[NSString alloc]initWithData:data encoding: NSUTF8StringEncoding];
    NSLog(@"%@", res);
}];

[task resume];
swiftはかわいい

アップルさんのswiftはかわいいよ

こんなことも簡単にできちゃうね

```lang:swift
protocol FakeRuby {
    func times(block:()->())
}

extension Int:FakeRuby {
    func times(block:()->()) {
        for i in 0..self {
            block()
        }
    }
}

10.times {
    println("ルビーじゃないよ")
}
```
追記：それでも自分は甘かったよ、もっと簡潔にできるｗ

```lang:swift
extension Int {
    var hours:Int {
        return self * 3600
    }
    var ago:Int {
        return -self
    }
    func times(block:()->()) {
        for i in 0..self {
            block()
        }
    }
}

7.hours
7.hours.ago
7.times {
    println("hello")
}
```
クレジットカード不正番号チェックを作ってみた


[ここ](http://cards.hateblo.jp/entry/card-number-kakunin/) を参考にクレジットカード不正番号チェックを作ってみました。[動作ページ](http://playispeace.com/creditcard_number_check/)

ソースは以下。

```html+php
<?php

function checkCreditNumber($input){
	$sum=0;
	for($i=1;$i<=4;$i++){
		if(strlen($input["no".$i])!=4 || !is_numeric($input["no".$i])){
			return "数字4桁入力してください。";
		}
	}
	for($i=1;$i<=4;$i++){
		$val= $input["no".$i];

		$sum += $val{0};
		$v = $val{1}*2;
		if($v>=10){
			$v -= 9;
		}
		$sum += $v;

		$sum += $val{2};
		$v = $val{3}*2;
		if($v>=10){
			$v -= 9;
		}
		$sum += $v;
	}


	if($sum !== 0 && $sum%10 === 0){
		return "カード番号 ". $input["no1"]."-".$input["no2"]."-".$input["no3"]."-".$input["no4"]." は不正ではありません。";
	}else{
		return "カード番号 ". $input["no1"]."-".$input["no2"]."-".$input["no3"]."-".$input["no4"]." は不正です。";
	}
}

$input = $_POST;
$result = "";

if(count($input)>0){
	$result = checkCreditNumber($input);
}


?>
<html>
<body>
<h1>クレジットカード不正番号チェック</h1>
<p>カード番号を入力すると、不正がどうか判定します。</p>
<form action="./" method="post">
<input type="text" maxlength=4 size=4 name="no1" value="<?php if(isset($input["no1"])) echo $input["no1"]; ?>" /> -
<input type="text" maxlength=4 size=4 name="no2" value="<?php if(isset($input["no2"])) echo $input["no2"]; ?>" /> -
<input type="text" maxlength=4 size=4 name="no3" value="<?php if(isset($input["no3"])) echo $input["no3"]; ?>" /> -
<input type="text" maxlength=4 size=4 name="no4" value="<?php if(isset($input["no4"])) echo $input["no4"]; ?>" />
<input type="submit" value="check" />
</form>

<?php
if($result){
?>
	<p><?php echo $result;?></p>
<?php
}
?>
</body>
</html>

```
phpの$変数{インデント}は文字列一文字ずつ扱うのに簡単で便利です。
Swift Doge App

Doge犬のアプリを作ってみました。
Objective Cとの違い点はUIImageのinitializationは簡単にりました!

```
        var image: UIImage = UIImage(named: "dog.png")
        dogImageView.image = image

```

![Screen Shot 2014-06-05 at 18.26.18.jpg](https://qiita-image-store.s3.amazonaws.com/0/15969/686569d2-f140-7b53-06fc-db3e84b84bc6.jpeg)

```
import UIKit

class ViewController: UIViewController {
                            
    @IBOutlet var dogImageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let label = UILabel()
        label.frame = CGRect(x: 30.0, y: 30.0, width:200.0, height:200.0)
        label.text = "Much Swift"
        
        self.view.addSubview(label)
        
        var image: UIImage = UIImage(named: "dog.png")
        
        dogImageView.image = image
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```
tmuxで新しいペインを開いた時に同じディレクトリで開くようにする

## 問題: tmux 1.9からは毎回ホームディレクトリが開くようになった

バージョン1.8までは`C-b c`で新しいペインを開いた時に、コマンドを送信したペインと同じディレクトリでペインが開いていました。

しかし、v1.9からは仕様が変わり、ホームディレクトリが開くようになりました。

[tmux 更新履歴](http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/CHANGES)

## 解決策: 設定を変えて同一のディレクトリを開くようにする
バージョン1.8以前の挙動に戻したい場合は、`.tmux.conf`に以下のような設定を追加します。

``` .tmux.conf
bind c new-window -c '#{pane_current_path}'
```

## さらに: ペイン分割時も同一ディレクトリで開くようにする

ペインを分割して開いた時も同一ディレクトリで開くようにする場合は、以下のように設定します。

``` .tmux.conf
bind '"' split-window -c '#{pane_current_path}'
bind % split-window -h -c '#{pane_current_path}'
```
ajax読み込み後のhtml表示ブックレット


検索すれば
見つかる方法ですが

ただ表示しただけだと
見づらいので

*ハイライト*表示しました。

- googleからjquery
- githubからhighligher

---

```js
javascript:w=window.open();w.document.write('<title>ViewSource:'+document.title+'</title><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><script type="text/javascript" src="http://balupton.github.com/jquery-syntaxhighlighter/scripts/jquery.syntaxhighlighter.min.js"></script><script type="text/javascript">$.SyntaxHighlighter.init();</script><pre class="language-html">'+document.getElementsByTagName('html')[0].outerHTML.replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/'/g,'&#39;').replace(/</g,'&lt;').replace(/>/g,'&gt;')+'</pre>');
```
bash、vimの操作の見直し

「[nanapi勉強会 vol2 - Shellの活用でこれだけ毎日が便利になる](http://nanapi.doorkeeper.jp/events/11514)」に参加して、自分が非効率にLinuxを使っていることを自覚しました。
なので、改めて`bash`と`vim`について足りていなかった部分を備忘録的に書き連ねていきたいと思います。
あくまで自分用なので、既に使っているコマンド等は割愛。

`zsh`と`zaw`もそのうち追記していきたいと思います。

# bash

## インクリメンタルサーチ（Ctrl + r）

過去のコマンド履歴を検索して実行。他の候補を見たい場合はさらに`Ctrl + r`。
コマンドの一部を変更して実行したい場合は、カーソルの左右を押して編集。

## 単語毎に移動（Esc → f、Esc → b）

単語の削除（`Ctrl + w`）は使っていたけど、単語毎に移動は知らなかった。
ただ、押しにくいですね。

# vim
勉強会では熱い`emacs`推しでしたが、私は`vim`を使っています。
ただ、改めて見直すと全然使えていないですね。
少しずつ改善していきたいと思います。

## 設定

* 検索時に大文字と小文字を区別しない（:set ignorecase）

* 検索時に大文字を入力した場合のみ大文字／小文字を区別する（:set smartcase）

* インクリメンタルサーチ（:set incsearch）

* タブの入力を空白文字に置き換える（:set expandtab）

* 括弧の入力時にカーソルを対応する括弧の上に一定時間表示（:set showmatch）

* コマンドライン補完する時に補完候補を表示（:set wildmenu）

* インデントの文字数を設定（:set shiftwidth=値）

## カーソル移動

* 空白を除く行頭に移動（^）
`0`を押した後に移動してました。

* 次の特定の文字に移動（f + 特定の文字、Fで前方向）
`;`で繰り返し、`,`で逆方向に繰り返し。

* 次の特定の文字の直前に移動（t + 特定の文字、Tで前方向）
`;`で繰り返し、`,`で逆方向に繰り返し。

## スクロール

* 現在のカーソル位置が1番上に来るようにスクロール（zt）

* 現在のカーソル位置が中心に来るようにスクロール（zz）

* 現在のカーソル位置が1番下に来るようにスクロール（zb）

## マーク機能
マーク機能はテキストの任意の場所に印をつけ、後でその場所に移動することのできる機能。
別のファイルを開くことも可能。
`Chef`のレシピを編集したりする時には複数のテキストを編集するので、マーク機能を使えばもう少し書きやすくなりそう。

* マークの登録（m + アルファベット）

* マークの行頭に移動（' + 登録済みのマークのアルファベット）

* 直前のマークに移動（''）

* マークの一覧を表示（:marks）

## インデント、複数行のコメントアウト・カンマ

* 行のインデントを増やす（>>）

* 行のインデントを減らす（<<）

* 選択範囲を自動インデント（選択して=）

* 複数行のコメントアウト（Ctrl + v → 行選択 → I → # → ESC）

* 複数行のコメントアウト解除（Ctrl + v → 行選択 → x）

* 複数行の行末にカンマ（Ctrl + v → 行選択 → A → , → ESC）

* インデントの文字数を設定（:set shiftwidth=値）

## 入力補完

* 単語の補完（Ctrl + p、Ctrl + n）
`Ctrl + p`でファイルの上の方を、`Ctrl + n`で下の方を検索してマッチするワードで補完する。

## マルチウィンドウ

* ウィンドウを分割（:split）

* ウィンドウの切り替え（Ctrl + w → k、Ctrl + w → j）

* ファイルを別ウィンドウで開く（:split ファイル名）

## カレントディレクトリの変更（:lcd ディレクトリ）

## その他

* 大文字小文字を切り替え（~）

* 数値の加減（Ctrl + a、Ctrl + x）
企業におけるチャットツールの比較

# 最初に
自社にチャットサービスの導入を検討していて、以下の３つのサービスの比較を行いました。

* Hipchat
* Chatworks
* slack

# 比較
|サービス名|クライアントApp|価格|
|:-----------|:------------|------------:|
| [Hipchat](https://www.atlassian.com/ja/software/hipchat "Hipchat") |Win/Mac/iOS/Android| $2/User|
| [Chatwork](https://www.chatwork.com/ "Chatwork")                   |iOS/Android        |100円/User|
| [Slack](https://slack.com/ "Slack")                                |Mac/iOS/Android    | $8/User|

# 連携しているアプリケーション

このアプリケーション達は私の環境で必須なものです。

|アプリケーション|Hipchat|Slack|Chatwork|
|:--------------:|:-----:|:---:|:------:|
|JIRA            |○|○|?|
|Confluence      |○|?|?|
|Github          |○|○|?|
|Stash           |○|?|?|
|Zendesk         |○|○|?|
|Jenkins         |○|○|?|
|NewRelic        |○|○|?|

* Hipchat,Slackに関してはwebhook対応しているツールなら基本対応していると思われる。
* ChatworkはAPI連携が可能ぽいが、Pluginを開発する必要がありそう


# 機能とか他社差分とか

## Hipchat

### 価格について

* BasicとPlusのプランが用意されている。
* 人数による制限が設けられていない。何百人で使ってもBasicだと無料
* 詳細は[Hipchat Pricing](https://www.hipchat.com/pricing)で確認できる。

### 機能について

* 管理者のUIは英語
* やりとりするチャットの内容は日本語OK。日本語での検索できます。
* １対１のビデオチャット機能、スクリーン共有機能がある。
* Webhookに対応しているアプリケーションとの連携は簡単にできそう。
* WindowsのNative Applicationが提供されている。
* Guest機能が便利

## Chatwork

### 価格について

* 100円/Userと割と高価
* ストレージは追加で足せるようだが、オプション料金

### 機能について

* すべて日本語で対応している。
* タスク管理機能が他のチャットツールにない魅力
* チャット内容をそのまま引用して、タスク追加できるのは便利そう
* 日本の会社で要求されるであろうセキュリティ要件がKDDI版ならば実装されている。（[詳細](https://www.chatwork.com/service/packages/chatwork/price.php)）
* PC用のNative Appが提供されていないのは残念だ


## Slack

### 価格について

* 以下の条件なら無料
* 10,000 message searchable archive
* 5GB total storage
* 5 external service integrations (like Twitter, Google Docs, Dropbox, GitHub and many more)

### 機能について

* 調査中