OmniAICreator/Qiita-1.07M huggingface dataset:
写経で使うツール

他人のコード理解のために写経をやってみています。うまく行かなかった時には、オリジナルのコードと比較する必要がありますが、その時に以下のツールを使っています。

# Reindent

Pythonのインデントを整えなおすツールです。参照元のコード、あるいは自分で書いたコードのインデント基準が異なっていると非常に比較しづらいので、これを使って統一しています。
pip install Rindent で"rindent"コマンドが導入されます。実行は引数に整形対象のファイルを指定するだけです。デフォルトでオリジナルファイルのバックアップを作成します。
インデントの整形はPEP8のスペース4文字に統一されます。インデント以外も含めてPEP8に修正するautopep8というツールもあるようです。

* [Reindent 0.1.0 : Python Package Index](https://pypi.python.org/pypi/Reindent/0.1.0)
* [Python のコーディング規約 PEP8 に準拠する - Qiita](http://qiita.com/ynakayama/items/8616f4c0c6e372de9a42)

## Python3未対応

Reindentはpython3では動きませんでした。

```shell-session
$ reindent
Traceback (most recent call last):
  File "/opt/3gpu/bin/reindent", line 2, in <module>
    from reindent import main
  File "/opt/3gpu/lib/python3.4/site-packages/reindent.py", line 71
    except getopt.error, msg:
```

全体的に例外の記法がPython2となっています。これに関してはカンマをasに置き換えればよさそうですが、他にprintがすべて括弧なしでの呼び出しになっています。

# gvimdiff

比較にはgvimdiffを使っています。他にもmeld等いくつかツールがあるのですが、いくつか試した結果こちらを使っています。ここは個人の好みもあるでしょう。
gvimdiffのデフォルトはnowrapなので、長い行の折り返しがなされません。単純に.vimrcにset nowrapと書いても有効になってくれませんでした。
StackOverflowに(g)vimdiff起動時のみwrapを有効化する方法が掲載されていたので、それを採用しています。

```vim
autocmd FilterWritePre * if &diff | setlocal wrap< | endif
```

* [vim - Forcing vimdiff to wrap lines? - Stack Overflow](http://stackoverflow.com/questions/16840433/forcing-vimdiff-to-wrap-lines)

# jedi (+ emacs, auto-complete)

コード補完にjediを使っています。emacsのauto-completeと組み合わせると、先に読み込んだ写経元のソース内にある長い変数、関数名なども補完が容易になります。

* [emacsにjedi(pythonの自動補完パッケージ)を導入した話 - Qiita](http://qiita.com/yuizho/items/4c121bdecc103109e4fd)

これ以外にも便利なツールがあったら追記してゆきます。
三菱重工から学ぶ大規模プロジェクトの反省点

三菱重工､豪華客船で払った高すぎる授業料という記事を読んでから撤退の流れを見ると、あまり身にならなかった授業だなと感じます。
http://toyokeizai.net/articles/-/113297

記事を抜粋しつつ、ソフトウェア開発でも学ぶべき反省を並べます。

三菱重工は「飛鳥」など大型客船の建造実績はあったが、欧米向け豪華客船を基本設計から手掛けた経験はなかった。2011年の受注時には「過去の建造実績から何とかできると判断した」（宮永俊一社長）。
-----------------------------------------------------------------------

受注窓口の営業が製品の完成を約束する事が諸悪の根源という、まさにあるあるネタです。

設計段階からアイーダの承認がなかなか得られず、客室や空調などの仕様の確定作業は難航。大型客船を手掛けるのは約10年ぶりであり、全室Wi－Fi完備に戸惑うなど、最新の客船技術への認識もまた甘かった。
-----------------------------------------------------------------------
涙なしには読めません。製品の完成を約束した敏腕営業マンは新しい案件を取りに、任された現場が認識合わせに四苦八苦。要件の8割決まったんですけれども、残り2割(全室Wi-fiのくだり)が決まりません。というやり取りが想像出来ます。

(個人の予想ベースですが)学ぶ事としては、以下二点かと思います。
・お客様は神様という認識のもと、承認のフェーズのみ密にやり取りする方式だと失敗する。
→神様との対話は短期的に見るとコストがかかりますが長期的に見てリスク軽減となる。
・要求リストを並べるだけでなくToDoリストも合わせて作成する。
→何を持ってして最新の客船技術の基準を達成出来るのかを明確にする。

遅れたなら、人を集めれば良いじゃないの発想で招いた失敗として下記。

外国人技能者や協力会社など、さまざまな雇用形態の作業員が入り乱れる現場は管理監督が行き届かず、今年に入りぼや騒ぎも3回発生した。
-----------------------------------------------------------------------
またもやあるあるネタ。管理側の人間を増やさずエンジニアを増やしたパターン。
管理者が出来る人間は絶対数が少ないという悩みが出がちですが、ここが日本の働き方の最大の問題点だと思います。

(個人の予想略)学ぶ事としては、以下だと思います。
・やってほしい事が明確になっていないのに人を追加しても混乱する
→管理コストが出来るだけ抑えられる依頼が出来る体制を作るべき
・管理者の仕事は人を増やす事ではなく、調整する事だと意識する。

こじれすぎると、会議・打ち合わせが多いとかコミュニケーションツールを導入しようとか本質的ではないけれどカイゼンした気になる施策が打たれ始めます。

大事なのは、一つ一つ契約レベルで決めきる事であり、
契約レベルで納得してもらうにはお客様に当事者意識を持って要件を詰めるしかないのかなと思います。
Rustのprintln!マクロ

出力機能はstd::fmtで定義されるマクロによって扱われます。

- format!: フォーマットされたテキストを文字列(String)型に書き込む
- print!: format!に加え、コンソールにそのテキストを出力
- println!: print!に加え、改行をつけてコンソールに出力


### 基本

```
println!("{} days", 31);
```

### 引数の位置を指定

```
println!("{1} is {0}.", "Bob", "He");
```

### 引数の名前で指定

```
println!("{a} {b} {c}",
             a=123,
             b=456,
             c=789);
```

### フォーマット型の指定
:のあとにフォーマットの型を指定(bは二進数)

```
println!("{:b}", 2);
```

### 幅を指定して右寄せで出力

```
println!("{number:>width$}", number=1, width=6);
```

- 0埋めも可能
- 出力は"000001"

```
println!("{number:>0width$}", number=1, width=6);
```

### 中括弧{}をそのまま出力
- {{}}と書く

```
println!("This is {}, {{}}", "Brace");
```
メソッド名のつけ方 - 強調のdo[does,did]

よく、プログラムのメソッド名で `didSelected~` というのを見つけるが、これは英文法的に間違いです。

この場合の`did`は`強調のdo`と呼ばれるもので、後には動詞の原形が続くのが正しい。

- 誤: didSelected~
- 正: didSelect~


# 参考

- [【特殊な構文】強調のdoについて。](http://kou.benesse.co.jp/nigate/english/a13e2401.html)
- iOSのUITableViewDelegateのメソッド

```swift
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
```
Railsの画面にサブミットボタンが複数あるときの挙動

Railsで画面にサブミットボタンが複数あるときに、クリックしたボタン以外にも`disable_with`にあてたメッセージが表示されてしまう。`ほげほげ中...`みたいなメッセージにしていた場合、クリックしてないボタンも全部`ほげほげ中...`とか`ふがふが中...`となる。

関係するイシューとしては、
* [Should data-disable-with only disable clicked button? · Issue #257 · rails/jquery-ujs](https://github.com/rails/jquery-ujs/issues/257)
* [Multiple submit buttons · Issue #434 · rails/jquery-ujs](https://github.com/rails/jquery-ujs/issues/434)
このあたりと考える。
[小技](テスト時などに)Playストアからアプリをインストールしようとすると、「このアイテムは端末に既にインストールされています」となってインストールできない場合

#現象
タイトルが長いですが・・
(テスト時などに)Playストアからアプリをインストールしようとすると、
「端末をお選び下さい」のドロップダウンリストに、

(端末名の下に)
「このアイテムは端末に既にインストールされています」

と表示されてアプリがインストールできない場合。
※表示はPCから操作(「インストールボタン」をクリック)した場合のもの。
(デバイスからPlayストアを開いた場合は、「開く」ボタンになっていると思います。)

#対処法
##1.バージョン(※)を下げて、AndroidStudioからインストールする。
※Project Structureの設定または、build.gradle(Module:app)で指定する、versionCode

注1：アプリのソースコードを持っている事が前提です。
(パッケージ名と署名が合っていれば、問題ないとは思いますが。)

注2：変更を加える前に、必要なバックアップを取っておきましょう。
(Proguard使用時用に出力された、マッピングデータなど。)

##2.Playストアから、再度、インストールしたいバージョンをインストールする。
※インストール後に、必ず、デバイスにインストールされたアプリのバージョンを確認しましょう。

注：作業が終わったら、忘れないうちに、設定(バージョン)を元に戻しておきましょう。

#なぜ、この方法か？
アプリのアンインストールが不要になるから。
アプリのデータを維持したまま、欲しいバージョンのインストールしなおしが出来ます。
(欲しいバージョンのapkを直接、デバイスに送った方が早い・・というのは置いておいて。)

---
蛇足：apkを直接(adb経由で)、デバイスに送る場合は、「Generate Signed APK」と「Build APK」の出力は別物なのを忘れずに。

通常は、
Generate Signed APK：デベロッパーコンソールから登録する方のapk
Build APK：Run/Debugで使う方のapk
です。

Build APKの方は、署名が必要な場合は、(Build Typesの)signingConfigの設定を入れる必要があります。
overflowのhiddenの「はみ出た部分を表示しないの？」


下記に記述されているcssの場合は、「.profile .imageクラス」のフローティングボックスから、「.profile .textクラス」の文字列が「左に」はみ出ずに表示されます。

それは「.profile .textクラス」にoverflow: hidden;が作用しているからです。


その時に疑問をもった点として、「overflow: hidden;クラス」ははみ出た要素を表示しないだけなのに、どうして本来はフローティングボックスからはみ出てそのまま左に表示されるはずの文字列が「一列」に表示されるのか？

という点です。

cssに関しては学習がたりていないため、「Clear fix」するための方法の詳細を知りたく、今回質問致しました。


以上何かしらご指摘頂ければ幸いです。

```problem.html
.profile .text {
    overflow: hidden;
}
にcssを指定しないと、フローティングボックスから文字列が左にはみ出る。
```

```index.htnl
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <div class="profile">
        <div class="image">
          <img src="img/images.jpeg">    		
        </div> 
        <div class="text">
           	<p class="greeting">asdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
            <br>
            <p>asdfasdfasdfasdfasdfasdfasdfasdf</p>
        </div>   	
    </div>
	
</body>
</html>

```


```style.css

.profile {
	overflow: hidden; /* clearfix*/
	padding: 15px;
	background-color: #fff;
}

.profile .image {
	float : left;
	margin-right: 15px;
	border-radius: 80px;
}

.profile .text {
	overflow: hidden;
}


/*overflow プロパティ hiddenしたり何したり

参照URL http://www.tagindex.com/stylesheet/box/overflow.html

例 .profile .textクラスに対して、overflow: hidden;を使用しないと

フローティングボックス - -
------- text          -
img   - text          -
img   - text          -
------- text          -
---------------------
text
text
text
text

という感じで、フローティングボックス(.profile .image)が左に回り込んでいる。

写真の要素が左側に回り込むと、後続の要素がすべて画像の右側に来る。

けど、フローティングボックスのボックスの影響を受けない出た文字列が
そのまま左側に表示されている。

URL http://css-happylife.com/archives/2009/1102_0115.php

になんでoverflow hiddenを使うのかの具体例がわかる。


*/

```

参照｜http://inaka-gurashi.hatenablog.com/entry/TECHBOOST%E8%A9%95%E5%88%A4%E5%8F%A3%E3%82%B3%E3%83%9F%E3%81%8A%E3%81%99%E3%81%99%E3%82%81AI%E6%8A%80%E8%A1%93
Androidで動くBASICでHTMLを動的に更新する（ BASIC プログラミング ）

BASIC!は、Androidで動くBASIC インタープリタです。詳しくは以下をどうぞ。どマイナー言語です。

* [AndroidでBASICを使う](http://qiita.com/basictomonokai/items/25bcb21ec69c00e9ad23)
* [Androidで動くBASICでHTMLをUIやWEBAPIで利用する](http://qiita.com/basictomonokai/items/14c9d3044294253a33a4)

BASIC!は昔ながらのBASICらしいUIであるコンソール／グラフィックの２つのモードとHTMLモードの３つのモードがあります。

##1.この記事の内容

この記事はHTMLモードについて記載しています。
HTMLモードは、AndroidのアプリらしいHTMLを利用したUIが作れるモードです。

[Androidで動くBASICでHTMLをUIやWEBAPIで利用する](http://qiita.com/basictomonokai/items/14c9d3044294253a33a4)の記事ではHTMLモードのまとめを以下のように書いています。

* BASIC!にはBASICとしては珍しいHTMLモードというモードがある。
* HTMLモードは、HTML,CSS,javascrptの知識があれば画面UIを簡単に作れる。
* **HTML⇒BASIC!プログラムへのデータ連携ができる。**
* 外部のCSS,javascrptのCDN、ライブラリーを利用できる。
* メモリーが逼迫している端末だとHTMLモードは課題がある。
* HTMLモードを使ってWebAPIとの連携ができる。
* HTMLモードを使わなくてもWebAPIとの連携ができる。

この３番目の「**HTML⇒BASIC!プログラムへのデータ連携ができる。**」に誤解があったので補足する内容になります。

正しくは、「**HTML⇔BASIC!プログラムへのデータ連携ができる。**」となります。矢印（⇔）が双方向となっています。

つまり**BASIC!プログラムからHTML画面へデータを送り、動的な更新が可能**ということになります。

##2.実際のテスト例

このテスト例はBASIC!のHTMLモードで表示中のHTML画面のtextareaの内容を動的に更新する内容です。

テスト結果は以下の画像の通り。テストボタンを押すとtextareaの内容が更新されています。

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/35574/599dd985-eea8-27dd-1fe9-75b005d019f1.png)


テスト用で作ったBASIC!のプログラムとHTML画面のソースは以下です。

* [BASIC!のプログラム](http://pastebin.com/UgwGrEaL)
* [HTML画面のソース](http://pastebin.com/wHCrjFbx)

私はHTMLやjavascriptは初心者なので不十分な部分があると思いますがご容赦ください。

##3.HTML側にデータ送る方法

**javascript擬似プロトコル**を利用して既にHTMLモードで表示済のHTML画面に対してDOMで動的な変更を行います。

具体的には以下の通りです。

a.BASIC!側でhtml.load.urlでHTML画面表示

　html.get.datalinkのループでHTML側の応答待ち

b.HTML画面でテストボタンを押す

　Android.datalinkで文字列'//a//'がBASIC!側へ送信

c.BASIC!側で**javascript擬似プロトコル**を送る

　Html.Load.Url "**javascript:document.getElementById('aaa').value='BASIC!からの送信'**"

d.HTML画面のtextareaが更新される

　リロードされずに動的に変更されます。

これ以外にもgetElementById('aaa').srcやinnerHTMLもできる事は確認しています。 


##4.まとめ

まとめると以下の通りとなります。BASIC!以外のAndroidで動くプログラム言語だと当たり前の事なのかもしれません。

* **BASIC!プログラムからHTML画面へデータを送り、動的な更新が可能**
* **javascript擬似プロトコルを使う**


BASICを利用される方ならそこそこ便利ではないかと思っています。
多分いないと思いますが…
【解決】Eclipse Pleiades Neon のダークとColor themeの組み合わせで今度こそうまくいった件

[メモ：Eclipse Pleiades Neon のダークとColor themeの組み合わせでうまくいった件]
(http://qiita.com/nekomanma/items/c0845235fa184dac1791)

↑この方法だと結局うまくいかなかったので、もうちょっと調べてみました。
うまくいったと思っていたんですけど、他の設定をわちゃわちゃしてたらいつのまにかリセットされるようになってた。（何が原因なんだろ……）



私を悩ませてきた、Eclipse Color Themeで選択された状態が反映されない問題。

で、ようやく！
ホントに！
本気で！
リセットされない方法を見つけました。


#以下、今度こそ私がやった方法です。


1.設定したいColor theme の**epfファイル**を、[Eclipse Color Theme](http://www.eclipsecolorthemes.org/)からダウンロード。
この時、xmlファイルではなく、epfファイルをダウンロードしてください。

2.Eclipseのファイル＞インポート＞一般＞設定 を選択しソース設定ファイルで1でダウンロードしたファイルを参照。

3.完了


これで多分リセットされない、はずです。
今までは、Color Themeから単純に選択するか、xmlファイルをインポートするかしてましたが、どうもこれだとうまくいかないみたいです。

**上手くいったと思ったあれは何だったのか。**

これで一安心。
ちなみに私は、Space Gray の色合いラブです。
Google画像検索でファイル形式を指定

忘れてたのでメモついでに。

#Google画像検索で、PNGだけ探したい！

っていうときにつけるオプション。

## filetypeを指定

`filetype:png`

これだけ。


![検索](https://i.gyazo.com/43c3cae3876eb70908f5257c6864c0da.png)

こうやって検索するとぉぉぉ

↓


![結果](https://i.gyazo.com/524440423139355b72fdcdaced388310.png)

こんな感じでオプションが勝手につきます。
vim で手軽にフォントを調整する

vim 8 の :version 表示をよく読んだら、unix 側でも ~/.vim/vimrc をデフォルトで読むようになっていたので、 \$HOME/.vimrc へのシンボリックリンクにしていた$HOME/.vim/.vimrc を改名していろいろと手直しした。

手直ししたものを Windows 環境にもってきて、フォントの微調整がメニューからではうまく行かないのが気になりだす。ツールを探してもピンとくるものがなく自作にも着手したが、汎用にするとなかなか面倒くさい。

はっと気が付いて、こんな数行を書いてみた。
プラグインとしてきちんと独立させるのも面倒なので、 vimrc のなかの一部として g:loader.ToyTools なんて (perl のクラスのように使っている変態的）辞書のなかに組み込んだが、そこは気にしないでほしい。

高さ(h) と幅(w)、気分によっては Antialias 適用の有無などを画面下部で編集して反映させる簡単な関数を呼び出せるようにした。それだけだ。


```vim
command!  FontChange :call g:loader.ToyTools.GuiFontChange()

function! g:loader.ToyTools.GuiFontChange()
    let font = input("NewFont: ", &guifont)
    let &guifont=font
endfunction
```
g:loader についてのあれや、これやはまたいつか稿をまとめて

追記）vim Windows / GUI フォントの見た目が気に入らないときには set guifont より先に set ambiwidth を auto/single/double それぞれ試してみたほうが幸せになれる、かも。　（書いた時は ambiwith を自分の好みに調整済だったので、忘れていました）
クラス内テンプレートクラスと継承を利用してmake_sharedでprivateコンストラクタを呼ぶ

enabled_shared_from_thisを用いる場合、コンストラクタをprivateにしてshared_ptrを返すcreate関数を用意する方法が有効です。
だけど、create関数内でmake_sharedを使いたいけどprivateなコンストラクタが呼べないという問題があります。
その問題を回避するため、関数内クラスと継承を用いた手法があります。
[std::make_shared から private コンストラクタを呼び出す](http://d.hatena.ne.jp/gintenlabo/20131211/1386771626)

```cpp
#include <memory>

struct X : std::enable_shared_from_this<X>
{
    std::shared_ptr<X> create();
private:
    X(){}
};

std::shared_ptr<X>
X::create()
{
    struct Helper:X { Helper():X(){} };
    return std::make_shared<Helper>();
//  return std::make_shared<X>();    Error! : ホントはこう書きたい
}
```

しかし、この手法だとprivateコンストラクタで引数を多くとるときに不便です。

```cpp
#include <memory>

struct X : std::enable_shared_from_this<X>
{
    std::shared_ptr<X> create(int a,int b,int c);
private:
    X(int a_,int b_,int c_):a(a_),b(b_),c(c_){}
    int a,b,c;
};

std::shared_ptr<X>
X::create(int a,int b,int c)
{
    struct Helper:X { Helper(int a,int b,int c):X(a,b,c){} }; // ヘルパークラスに引数をたくさん書かないといけない!
    return std::make_shared<Helper>(a,b,c);
}
```

そこで、クラス内テンプレートクラスとして汎用のCreateHelperクラスを用意して、
ヘルパークラスの引数記載を省略するようにします。

```cpp
#include <memory>

struct X : std::enable_shared_from_this<X>
{
    std::shared_ptr<X> create(int a,int b,int c);
private:
    X(int a_,int b_,int c_):a(a_),b(b_),c(c_){}
    int a,b,c;
 
   // クラス内テンプレートクラスを用いたヘルパークラス
    template<typename Base>
    struct CreateHelper:Base
    {
        template<typename... Args>
        explicit CreateHelper(Args&&... args):Base(std::forward<Args>(args)...){}
    };

};

std::shared_ptr<X>
X::create(int a,int b,int c)
{
    return std::make_shared<CreateHelper<X> >(a,b,c);
}
```

今回のCreateHelperはマクロにしてあげれば使いまわせるのでオススメです。

```cpp
#include <memory>

#define CREATE_HELPER \
    template<typename Base> \
    struct CreateHelper:Base \
    { \
        template<typename... Args> \
        explicit CreateHelper(Args&&... args):Base(std::forward<Args>(args)...){} \
    }

struct X : std::enable_shared_from_this<X>
{
    std::shared_ptr<X> create(int a,int b,int c);
private:
    X(int a_,int b_,int c_):a(a_),b(b_),c(c_){}
    int a,b,c;
    
    CREATE_HELPER;
};

std::shared_ptr<X>
X::create(int a,int b,int c)
{
    return std::make_shared<CreateHelper<X> >(a,b,c);
}
```
アンダースコア　Javaの問題をTypeScriptにしてみる　2-3

この中でコンパイルエラーとなる宣言はどれか

A. int a = 123_456_789;
B.int b = 5__________2;
C. int c = _123_456_789;
D. int d = 123_456_789_;
E. int e = 3_,1415F;
F. int f = 999_99_9999_L;
G. int g = 0b0_1;
H.int h= 0_52;
I.int I  = 0x_52;

答えは、C,D,E,F,I

Javaでは数値を見やすくするために数値と数値の間に「_(アンダーバー)」を入れることができます。
この機能はJSの仕様にはないためエラーです。
もちろんTypeScriptにも準備はされていません。
RailsのMigrationでstringからtextに変更する


普通にこんなかんじでいけた。

```ruby:db/migrate/20161019222407_change_events_memo_to_text.rb
class ChangeEventsMemoToText < ActiveRecord::Migration
  def up
    change_column :events, :memo, :text, default: nil
  end

  def down
    change_column :events, :memo, :string
  end
end
```

最初 `default: nil` をつけていなかったが、下記のようなエラーが出たので `default: nil` をつけてみたら普通に通った。

```
Mysql2::Error: BLOB, TEXT, GEOMETRY or JSON column 'memo' can't have a default value: ALTER TABLE `events` CHANGE `memo` `memo` text DEFAULT '' NOT NULL
```
技術英語 > you have to put up with a more complicated test [in return for] the reduced level of nesting.

@ Code Complete (No. 14675 / 36077)

> you have to put up with a more complicated test <font color=red>in return for</font> the reduced level of nesting.

http://eow.alc.co.jp/search?q=in+return&ref=sa
> in return for
～に対する返礼［返報・お礼・お返し・見返り］として、～の代償［報い・交換条件］として、～と引き換えに

上記の意訳（間違っている可能性あり)
「ネストレベルを減らす代償として、より複雑なテストを我慢しなければならない」
ridgepoleの仕組み

※2016-10-20時点の情報です（ridgepole/master `021728f9ff31d35eb5b7f3ee113a7938f429e864`）

ridgepoleは内部でActiveRecordを使っている。
現状のスキーマとSchemafileの差分を取る部分のコード（delta.rb 464行、diff.rb 405行）がやや長いが、それ以外はけっこうシンプルなようだ。

## 現状のスキーマの取得方法

`ActiveRecord::SchemaDumper.dump`を使っている。このメソッドによりRailsの`db/schema.rb`の内容と同じ文字列が得られる。

```lib/ridgepole/dumper.rb
class Ridgepole::Dumper
  def initialize(options = {})
    @options = options
  end

  def dump
    stream = StringIO.new
    conn = ActiveRecord::Base.connection

    （中略）
                                                                                                          
    ActiveRecord::SchemaDumper.dump(conn, stream) 
```


## DSL（Schemafile）で使えるキーワード

`lib/ridgepole/dsl_parser.rb`に書いてある。

```lib/ridgepole/dsl_parser.rb
      TYPES = [
        # https://github.com/rails/rails/blob/v4.2.1/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L274        :string,
        :text,
        :integer,
        :bigint,
        :float,
        :decimal,
        :datetime,
        :timestamp,
        :time,
        :date,
        :binary,
        :boolean,
（略）
```

DSLのパースには`instance_eval`している。
`create_table`、`add_index`などのメソッドは独自に定義している。

```dsl_parser.rb
    def self.eval(dsl, opts = {}) 
      ctx = self.new(opts)

      if opts[:path]
        ctx.instance_eval(dsl, opts[:path])
      else
        ctx.instance_eval(dsl)
      end 

      [ctx.__definition, ctx.__execute]
    end 

    def create_table(table_name, options = {}) 
      table_name = table_name.to_s
      table_definition = TableDefinition.new(table_name, self)

      [:primary_key].each do |key|
        options[key] = options[key].to_s if options[key]
      end 

      yield(table_definition)
      @__definition[table_name] ||= {}

      if @__definition[table_name][:definition]
        raise "Table `#{table_name}` already defined"
      end 

      @__definition[table_name][:definition] = table_definition.__definition
      options.delete(:force)
      @__definition[table_name][:options] = options
    end
```
Pry実行時のエラー「Sorry, you can't use Pry without Readline or a compatible library.･･･」を解決する

`pry`を使おうとして使えなかったので、解決するまでの知見を残しておきます。
よくある感じの対処法でQiita等にも解決法は上がっていますが、微妙にやったことが違ったので。

## 環境
- ruby 2.3.1
- OS X El Capitan

## 対処法

まず、pryを入れた後に実行するとこのようなエラーが出力されました。

```shell
$ pry
Sorry, you can't use Pry without Readline or a compatible library.
Possible solutions:
 * Rebuild Ruby with Readline support using `--with-readline`
 * Use the rb-readline gem, which is a pure-Ruby port of Readline
 * Use the pry-coolline gem, a pure-ruby alternative to Readline
...
```

とりあえず`rb-readline`を入れます。

```
$ gem install rb-readline
Fetching: rb-readline-0.5.3.gem (100%)
Successfully installed rb-readline-0.5.3
Parsing documentation for rb-readline-0.5.3
Installing ri documentation for rb-readline-0.5.3
Done installing documentation for rb-readline after 3 seconds
1 gem installed
```

自分はこれだけで動かなかったため、rubyを入れ直しました。

```
$ rbenv install -f 2.3.1
```

これでpryが使えるようになりました。

```
$ pry
[1] pry(main)>
```

## 参考
- [pry起動時にエラーが出た場合の対処法 - Qiita](http://qiita.com/KanakoKobayashi/items/32bf91437bc1de1a779a)
- [Ruby Gems suddenly stopped working on ubuntu 12.04 - Stack Overflow](http://stackoverflow.com/questions/22923526/ruby-gems-suddenly-stopped-working-on-ubuntu-12-04)
Vue.js で Hot Module Replacement をやってみた

## はじめに

最近Vue.jsの2.0がリリースされました。2.0になることによりいろいろなことが変わりましたが、自分が一番気になったのはHMRが出来るようになったことです。

今回はVue.jsでHMRを行うサンプルを作ってみました。

## package.json

必要なパッケージをpackage.jsonから抜粋しました。

```json
"devDependencies": {
  "babel-cli": "^6.16.0",
  "babel-core": "^6.17.0",
  "babel-loader": "^6.2.5",
  "babel-preset-es2015": "^6.16.0",
  "css-loader": "^0.25.0",
  "node-sass": "^3.10.1",
  "sass-loader": "^4.0.2",
  "vue-hot-reload-api": "^2.0.6",
  "vue-loader": "^9.5.1",
  "webpack": "^1.13.2",
  "webpack-dev-server": "^1.16.2"
},
"dependencies": {
  "vue": "^2.0.1"
}
```

大事なのは`vue-hot-reload-api`と`webpack-dev-server`です。この二つのパッケージを入れることでHMRが出来るようになります。

## webpack.config.js

続いてWebpackの設定です。

```js
var webpack = require('webpack')

module.exports = {
  entry: './js/app.js',
  output: {
    path: "dist",
    publicPath: 'dist',
    filename: 'bundle.js',
  },
  devtool: 'inline-source-map',
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
          presets: ['es2015']
        }
      },
      {
        test: /\.vue$/,
        loader: 'vue'
      }
    ]
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
};

```

大事なのは`output`の項目に`publicPath`を足すことと、pluginsの項目に`HotModuleReplacementPlugin`を追加していることです。

## JSコード

コンポーネントとエントリポイントのコードです。

```html:my_component.vue
<template>
  <div>
    <h2>{{ message }}</h2>
  </div>
</template>

<script>
  module.exports = {
    data() {
      return {
        message: 'hot reload hoge  aa'
      }
    }
  }
</script>

<style lang="sass">
</style>
```

```js:app.js
var Vue = require('vue/dist/vue.js')
var myComponent = require('./components/my_components.vue')

var vm = new Vue({
  el: ".app",
  components: {
    'my-component': myComponent
  }
})
```

ここで気をつけないといけないのが、`Vue.js`をrequireしている所で、

```
require('vue')
```

としないことです。依存関係の都合らしく、HMRをしたい場合は上記のコードのようにしないといけないようです。

## 動かしてみる

実際に動かしてみます。下記のコマンドで実行してみます。

```zsh
% webpack-dev-server --inline --hot
```

![vue-hot-reload.gif](https://qiita-image-store.s3.amazonaws.com/0/11510/99734737-972a-806c-440b-594df59d7ca7.gif)

リロードしないで更新されていることがわかります。

## おわりに

簡単ですがVue.jsでHMRをやるサンプルを作成しました。これで`Vue.js`での開発が楽しくなりそうです。

サンプルはGitHubで公開しています。もっとこうしたほうが良いというようなことがあればプルリクをお願いします。

[nasum/vue-hot-reload](https://github.com/nasum/vue-hot-reload)

## 参考記事

[Hot Module Replacementの設定と仕組みを理解する](http://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb)
[webpack-dev-server を使う](http://mgi.hatenablog.com/entry/2016/04/16/232831)
java.utilまとめ1（HashMap、Map.Entry）

## HashMapクラス
連想配列と呼ばれるもの。連想配列はキーと値の組み合わせ（この組み合わせを*エントリ*という）を利用して要素を格納し登録する。

では、HashMapクラスを使ってキーと値を入れたりいろいろやってみる。

```java:HashMapSample.java
import java.util.HashMap;

public class HashMapSample{

	public static void main(String[] args){
		HashMap<String,String> hashmap = new HashMap<String,String>();
		
		hashmap.put("Hadoop","Java");  //キー、値をhashmapに格納
		hashmap.put("Spark","Scala");
		hashmap.put("Kafka","Java");
		
		System.out.println(hashmap);
		
		if(hashmap.containsKey("Hadoop")){
			System.out.println("Hadoop!!");
			System.out.println(hashmap.get("Hadoop"));
		}
	}
}
```

実行結果は

```
{Hadoop=Java, Kafka=Java, Spark=Scala}
Hadoop!!
Java
```

となり、キー=値として格納されていることが確認。

### putメソッド
キーと値をHashMapに格納する。

### containsKeyメソッド
指定したキーがHashMap内にあればその値を返す。

## Map.Entryインタフェース
マップのエントリをもつもの。マップのエントリへの参照を取得するにはイテレータを使って取得する。

```java:MapEntrySample.java
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.WeakHashMap;

public class EntrySample{

	public static void main(String[] args){
		HashMap<String,String> hashmap = new HashMap<String,String>();
		WeakHashMap<String,String> weakhashmap = new WeakHashMap<String,String>();
		
		weakhashmap.put("Hadoop","Java");
		weakhashmap.put("Spark","Scala");
		weakhashmap.put("Kafka","Java");
		
		System.out.println("WeakHashMap:");
		System.out.println(weakhashmap);
		System.out.println("");
		
		for(Entry<String,String> entry : weakhashmap.entrySet()){
			hashmap.put(entry.getKey(), entry.getValue());
		}
		
		System.out.println("HashMap:");
		System.out.println(hashmap);
		System.out.println("");
	}
}
```

で実行結果

```
WeakHashMap:
{Kafka=Java, Hadoop=Java, Spark=Scala}

HashMap:
{Hadoop=Java, Kafka=Java, Spark=Scala}
```

WeakHashMapからHashMapに移す処理をした。

### entrySetメソッド
Mapクラスのメソッドで、マップのコレクションを返す。

### getKeyメソッド
エントリに対するキーを返す。

### getValueメソッド
エントリに対する値を返す。

## おわり
なにか意見や訂正、指摘があれば気軽にください。
Query Builderが返すEntityのクラスをStdClass以外にする方法


複雑なクエリーを行う際に、Query Builderが返すEntity(StdClass)にも振る舞いをもたせたいなとソースを調べた所、以下のようなコードでPDOのFetchモードの切り替えが可能だった。

```

$query = DB::table('test');
// TODO ここに複雑な条件や連結を書く
$connection = $query->getConnection();
$connection->setFetchMode(PDO::FETCH_CLASS, "Test");
$query->get(); // => Testクラスの配列が返ってくる
$connection->setFetchMode(PDO::FETCH_OBJ); // 設定を元に戻さないと以後のクエリーが全てTestクラスで返ってくる

```

[参考](https://laravel.com/api/5.2/Illuminate/Database/Connection.html#method_setFetchMode)


ただ、コード量が多いのでDBにVIEWを作ってそれに対応するModelを作ったほうが良いかもしれません。
mac×Eclipse×GoClipse構築備忘録

#### 環境
mac os x 10.12
Eclipse neon
go 1.7.1

基本的にはここに従った

#### Goインストール
http://qiita.com/megu_ma/items/7208be8de52b712955a0

#### Eclipse
http://qiita.com/takanorig/items/13607eca4d13c00f084f

##### gotoolのパスだけ変更
gopathにgotoolのパッケージを混在させてしまうとめんどくさい事になるらしいので。
一度Downloadしてからgotoolディレクトリに移動し、 rm -fr gopath/* とした上で、GoClipseの設定も変更した。
![スクリーンショット 2016-10-20 1.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/12060/3b978e11-969f-bebd-61cc-dc434022fccb.png)

なぜかguruだけビルドされなかったので直接コマンドを叩いた。
`/usr/local/opt/go/libexec/bin/go get -u golang.org/x/tools/cmd/guru`
Linux の BCM43430 ドライバを読む その1

Linuxの Broadcom BCM43430 デバイスドライバのソースコード読んでみました。

# 準備
* https://wireless.wiki.kernel.org/en/users/drivers/brcm80211 にある内容を読んでみました。
* BroadcomのWi-FIドライバはsoftmac用のbrcmsmac と fullmac用のbrcmfmacの２種類があります。
* BCM43430はbrcmfmacなのでFullMACなドライバです。
* BCM43430は Linux 4.1 以降でサポートされています。
* SDIOの場合NVRAMファイルと呼ばれるファイルをロードする必要があります。
* fullmacドライバの機能

```
Integrated with cfg80211
Most of Mac functionality is performed on chip
support for SDIO, USB and PCIe
SoftAP
P2P
TDLS
```

* BCM43430を追加した時のcommitを見ると、以前のチップと同じ様に動くので、BCM4343特有の変更はあまりないようです。
 * https://github.com/Broadcom/brcm80211/commit/25911556283e5093fca235d7ba03faae7ed5dbf2

# ソースコード
* https://github.com/torvalds/linux/tree/master/drivers/net/wireless/broadcom/brcm80211/brcmfmac

# SDIOの初期化からファームウェアダウンロードまで
* probeからファームウェアのダウンロードまでを追ってみた。

* 下記のSDIOの情報を登録する、

```c:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
/* devices we support, null terminated */
static const struct sdio_device_id brcmf_sdmmc_ids[] = {
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43143),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43241),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4329),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4330),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4334),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
	{ /* end: all zeroes */ }
};
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
```

```c:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
static struct sdio_driver brcmf_sdmmc_driver = {
	.probe = brcmf_ops_sdio_probe,
	.remove = brcmf_ops_sdio_remove,
	.name = KBUILD_MODNAME,
	.id_table = brcmf_sdmmc_ids,
	.drv = {
		.owner = THIS_MODULE,
#ifdef CONFIG_PM_SLEEP
		.pm = &brcmf_sdio_pm_ops,
#endif	/* CONFIG_PM_SLEEP */
	},
};
```

* kernelのSDホストドライバで、SDIOと判断し、brcmf_sdmmc_idsのIDと一致するIDを持つSDIOでバイスであるなら、brcmf_ops_sdio_probe()を実行する。
* brcmf_ops_sdio_probe（）からbrcmf_sdiod_probe（）を呼ぶ。
* brcmf_sdiod_probe（）でSDIOブロックサイズの設定、SDIOファンクション0の設定をして、brcmf_sdio_probe（）を呼ぶ
* brcmf_sdio_probe（）から、brcmf_fw_get_firmwares()を呼び、そのコールバックbrcmf_sdio_firmware_callback（）の中でファームウェアをダウンロードする。
JRuby環境のrubyソースファイルをvimで開くと遅い

## 概要
- JRuby環境下のrubyソースコードをvimで開くのが遅い。
- vimrcで`let g:ruby_path = ""`または`let b:ruby_version = "2.3.1"`などと記述することで解消する。
- しかし、バッドノウハウの類なのでより良い解決方法求む。

## 現象
rbenvでJRuby環境にあるソースコードをvimで開くと2,3秒かかった(グローバルにJRubyを導入して使っている場合も同様)。
導入した何らかのプラグインが影響しているのではないかと考え、まずvimrcやpluginを取り払って起動してみたが、やはり遅い。
もう一歩踏み込んで、`--noplugin`オプションを付けて起動したところ、瞬時に起動した。


## 原因
ということで、原因は標準に付属しているpluginにあると目星が付いた。

/vim74/ftplugin/ruby.vimを調べたところ、rubyコードを読み込むときに有効になっているrubyを起動していることが分かった。
(ver.7.4で調べたが、コードを見た感じver.8.0でもほぼ同様だと思われる)
JRubyはJVMを起動するのに時間がかかるので、とにかく起動が遅い。
さらっと読み流したところ、rubyの標準ライブラリのパスを調べて、そのパスにあるタグファイルをtagsに追加することを目的としているようだ。


## 対策
次のいずれかで、ひとまず問題は解消される。

1. /usr/share/vim/vim74/ftplugin/ruby.vimを撤去
    - ただし、標準のプラグインなので、いろいろな影響が出ると思われる。
    - また、便利な機能も一緒に無効になってしまう。
    - もちろん、ruby標準ライブラリへのタグジャンプはできなくなる。
2. vimrcに`let g:ruby_path = ""`と記述
    - ruby標準ライブラリへのタグジャンプはできなくなる。
    - (このパスで指定した)rubyに依存した機能が効かなくなるはず。
    - 標準以外のプラグインでも、このグローバル変数に依存したものが
      影響を受ける可能性あり。
3. vimrcにCRubyのバージョン、例えば`let b:ruby_version = "2.3.1"`と記述
    - "2.3.1"と書いた部分には、自身の環境に導入されているJRuby以外の適当なバージョンを指定する。
    - ruby標準ライブラリへのタグジャンプは指定したバージョンのコードへのジャンプとなるはずである。
    - 邪悪な感じの対処なので、いろいろ危ういかも。

1はやり過ぎなので、基本的には2か3の対応となる。

## 課題
ひとまず、起動が遅い問題自体は解決したが、あまり正当な方法とは言えない。
良い解決方法をお持ちの方は、教えていただけると助かります。
デフォルト担当者を報告者(reporter)に自動設定する

プロジェクトリードをデフォルトAssigneeにするのはプロジェクト設定でできるけど、起票者をデフォルトにするにはそこではできない。
単純な設定ではできないが、大して難しくない。
ワークフローのcreate transitionのpost functionでassign to reporterを選択する。  

### 設定方法
1. プロジェクト -> 対象のプロジェクトをクリック -> ワークフローセクションのペンマークをクリック
2. ワークフロー図内のcreateの矢印をクリック
3. post functionをクリックして、Add post functionをクリック
4. assign to reporterを選択してAll
5. Publish Draftで設定を反映させる

参考：[how to make default assignee equal the reporter](https://answers.atlassian.com/questions/27473/how-to-make-default-assignee-equal-the-reporter)
JIRAでカレンダーを使う

JIRAに登録された課題(issue)をJIRAのカレンダーに表示する。
プロジェクトのカレンダーページを表示するか、ダッシュボードにカレンダーガジェットを組み込むことでカレンダーを表示できる。
ガジェットでは、表示する課題を任意のフィルターで設定でき、表示する日付と関連付ける項目も選べる。

↓は異なるフィルタのカレンダーガジェットを表示しているダッシュボード。
![calendar.png](https://qiita-image-store.s3.amazonaws.com/0/138322/810e6683-b7ed-87a8-5987-f8acc084650f.png)

## 設定手順
### プロジェクトのカレンダーページ
プロジェクトのカレンダーページは下記の様なURLでアクセスできる。

```
JIRA-base-url/projects/<project-code>?selectedItem=com.atlassian.jira.ext.calendar%3Aissuecalendar-panel
```
なぜか、JIRA v7からリンクが削除されている。

### ダッシュボードガジェット
ダッシュボードを作成し、"ガジェットの追加"ボタンを押してダイアログを開く。
「すべてのガジェットを読み込む」というリンクが表示されていればクリックする。
左側の検索バーに"calendar"と入れると下記が出てくるはずなので、これを「ガジェットを追加」する。
<img width="316" alt="Screen Shot 2016-10-20 at 01.00.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/b515a28d-c617-1019-bd15-c21455ca91c2.png">
Rubyで特定のディレクトリ内の画像のサイズ（幅・高さ）を一括で取得する

# 目的
ディレクトリ内の全ての画像の幅・高さをファイルに書き出さないといけない場面に遭遇してしまった（つらい…）ので、簡単に処理できるスクリプトを書いてみました。

## 環境
Ruby 2.3.1

## 使ったもの
FastImage (https://github.com/sdsykes/fastimage)

* 画像ファイルのサイズやタイプを簡単に特定できる便利なgem
* `FastImage.size(画像パス)`で、簡単に画像サイズが取得出来る

## 作ったもの
ディレクトリのパスを渡したら、そのディレクトリ内の画像サイズ一覧をJSONで吐き出すスクリプト

## 手順
1 . `gem install fastimage`
2 . 下記のスクリプトに適当な名前を付けて保存(今回は`img_size_detector.rb`とします)

```ruby
require 'fastimage'
require 'json'

path = File.expand_path(ARGV[0], __FILE__)

result = Dir.open(path){|dir|
  dir.select{|f| /\.(jpg|png|bmp|gif)$/i =~ f}.map{|name| 
    width, height = FastImage.size("#{path}/#{name}")
    {
      name: name,
      width: width,
      height: height
    }
  }
}

puts JSON.pretty_generate(result)
```
3 . `ruby img_size_detector.rb ディレクトリのパス` を実行
(例. `ruby img_size_detector.rb ~/Pictures`)

## 出力

```json
[
  {
    "name": "01.png",
    "width": 225,
    "height": 225
  },
  {
    "name": "02.jpg",
    "width": 320,
    "height": 320
  },
  {
    "name": "03.png",
    "width": 1363,
    "height": 853
  }
]
```

もちろんJSON以外のフォーマットにも出来るので、吐き出し方を変えれば色々と使えそうです。
JIRAノウハウ インデックス

* [JIRAの良いとこ悪いとこ](http://qiita.com/pikanji/items/8cce0e0c2ca42fe66c62)
* [コメントでマークアップを使う](http://qiita.com/pikanji/items/45acf79341927681cf6f)
* [JIRAでカレンダーを使う](http://qiita.com/pikanji/items/c8c3fc2cea355943b070)
* [デフォルト担当者を報告者(reporter)に自動設定する](http://qiita.com/pikanji/items/f29869d515cf748f952d)
* [課題タイプを追加する](http://qiita.com/pikanji/items/25cde474d7ab8b88d247)
* [JIRAのすべての課題タイプでストーリーポイントを設定できるようにする](http://qiita.com/pikanji/items/fd160965772ee082736c)
* [JIRAのストーリーポイントの適用課題タイプをプロジェクトごとに設定する](http://qiita.com/pikanji/items/737b488f3aba85511696)
JIRAのコメントでマークアップを使う

右上の歯車 -> 課題(Issues) -> フィールド構成(Field Configurations)
おそらくはじめは"Default Field Configuration"しか無いと思いますが、これを変更すると他のプロジェクトにも影響するので、これをコピーして適当な名前に変更します。

作成したフィールド構成の"構成(Configure)"を開いて、"コメント(comment)"を探す。
コメント欄の右側にあるRenderersをクリックして"Wiki style Renderers"を選択。

次に、フィールド構成スキーム(Field Configurations Scheme)を開き、フィールド構成スキーム追加ボタンで追加します。
フィールド構成スキームの画面でアクションから編集をクリックして、先程作成したフィールド構成を選択します。

プロジェクト設定のページ -> フィールド を開きます。
右上のアクションドロップダウンから"異なるスキームを使う"を選択して、先ほど作成したフィールド構成スキームを選択します。

以上

参考：[Formatted comments in Jira?](https://answers.atlassian.com/questions/16851/formatted-comments-in-jira)
SPA(Single Page Application)の基本

#SPA(Single Page Application)って何？

* 単一ページで構成されるWebアプリケーション
* JavaScriptでDOMを操作しページを切り替える
* AjaxやWebSocketを使用する


---

#SPAまでの変遷

* 2010年にスティーブ・ジョブズが[Thoughts on Flash](http://www.apple.com/hotnews/thoughts-on-flash/)を発表。
* それがきっかけとなりFlashなどのProprietary Software（ソフトウェアの配布者が独占的に提供しているソフトウェア）が衰退
* 2014年にHTML5正式勧告がされたこともあり、Flashなどに代わる技術としてHTML5が推進されてきた。
* そのHTML５でFlashと同等のUI/UXを実装するためSPAが開発された。

---

#SPAで使われている技術

* JavaScriptフレームワーク、ライブラリ（Angular、Vue.js、Reactなど）
* CSS Preprocessor（sass、stylusなど）
* 通信技術（Ajax,WebSocketなど）
* バックエンド技術（Ruby on Railsなど）
* HTML5/CSS3

---

#SPAのメリット

* 豊かな表現力
* クロスブラウザ
* 応答がはやい
* 開発のスピードがはやい

プッシュ通知などもAPIとして提供されている

---

#仕組みの違い

---

##従来のWebアプリケーション
<img width="881" alt="スクリーンショット 2016-10-20 12.59.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/69864/44d82afe-93bf-7986-7f19-830a01965bc3.png">

---

##SPA

<img width="917" alt="スクリーンショット 2016-10-20 12.59.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/69864/0456270d-3eb0-baf3-81fa-466d58640e1d.png">

---

## 主なライブラリ、Framework

* React
    * Facebook製のViewライブラリ
* Vue.js
    * オープンソースなフレームワーク
* Angular
    * Google製のフレームワーク
脱react-routerしたい人の0.5歩目くらいのもの

脱react-routerしたい人の0.5歩目くらいのもの

https://medium.freecodecamp.com/you-might-not-need-react-router-38673620f3d#.5pzh5miki
の記事を見たり、
https://github.com/kriasoft/react-static-boilerplate
なんかを見たものの、
webpack, reduxが前提だったりhistoryパッケージのバージョンが古かったりして、うがーとなったのでもう少し簡素にうごくもの作ってみた。
脱react-routerしたい理由は特に触れない。

packages.json, .babelrcはだいたいこんな感じ。
https://github.com/mjackson/history
を使う。

```packages.json
{
  "private": true,
  "scripts": {
    "build": "browserify -t babelify ./path/to/src/root.js -o ./path/to/public/js/bundle.js"
 },
  "dependencies": {
    "babel-plugin-transform-object-rest-spread": "^6.8.0",
    "babel-preset-es2015": "^6.13.2",
    "babel-preset-react": "^6.11.1",
    "babelify": "^7.3.0",
    "history": "^4.2.0",
    "react": "^15.3.0",
    "react-dom": "^15.3.0"
  }
}

```

```.babelrc
{
  "presets": ["react", "es2015"],
  "plugins": ["transform-object-rest-spread"]
}
```

最上位の親コンポーネントをRootとして定義。
ページの内容はIndex, Subとして定義。
pathが'/index'ならIndexを表示・
'/subならSubを表示する。
Rootコンポーネント上に各ページへのリンクを配置。

```root.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import createBrowserHistory from 'history/createBrowserHistory';

// historyオブジェクトを作成。
let history = createBrowserHistory();

class Root extends Component {
  constructor() {
    super();
    this.state = {
      key1: 'foo',
      key2: 'bar',
    }
  }
  // ページ遷移を行う
  transition(e) {
    e.preventDefault();
    history.push(e.currentTarget.pathname);
  }
  render() {
    // React.cloneElement()を使って子コンポーネントにstateをpropsとして渡す。
    return (
      <div>
      <ul>
        <li>
          <a href="/" onClick={(e) => this.transition(e)}>Index</a>
        </li>
        <li>
          <a href="/sub" onClick={(e) => this.transition(e)}>Sub</a>
        </li>
      </ul>
      {React.cloneElement(this.props.children, { ...this.state })}
      </div>
    );
  }
}

// 各ページ用子コンポーネントの定義
const Index = (props) => {
  return (
    <div>
      {props.key1}<br />
      これはIndexページ
    </div>
  );
}

const Sub = (props) => {
  return (
    <div>
      {props.key2}<br />
      これはSubページ
    </div>
  );
}

// パスとコンポーネントの紐付け定義
const routes = [
  { path: '/', action: () => <Index />},
  { path: '/sub', action: () => <Sub />}
]

const root = document.getElementById('root');

// パスに応じた子コンポーネントとともにrenderする。
// 実際は正規表現を使用してもっといい感じにするところ。

function render(location) {
  for (let route of routes) {
    if(location.pathname === route.path) {
      const content = route.action();
      ReactDOM.render(
        <Root>{content}</Root>,
        root
      );
      return;
    }
  }
}

// historyを監視、パスが変化したときに引数のコールバックを実行して、contentを更新する。
// 第二引数の使い方は後で調べる
history.listen((location, action) => {
  render(location);
});
// ページ読み込み時に最初に実行される
render(history.location);

```

subページのパスに直接アクセスされた場合など、何もしなければnot foundになってしまうので、サーバーサイドが例えばLaraval5.3であれば以下のようにしてアクセスをrootパスのハンドラーに集約する必要がある。

```routes/web.php
Route::get('/{action?}', function () {
    return view('root');
});
```
備忘録: docker run で `--restart=always` を付け忘れたコンテナに後から `--restart=always` をつけるには

`docker update` をつかう

```console
$ docker update --restart=always コンテナのID
```

## 他にも

```
Usage:  docker update [OPTIONS] CONTAINER [CONTAINER...]

Update configuration of one or more containers

Options:
      --blkio-weight value          Block IO (relative weight), between 10 and 1000
      --cpu-period int              Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int               Limit CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int              CPU shares (relative weight)
      --cpuset-cpus string          CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string          MEMs in which to allow execution (0-3, 0,1)
      --help                        Print usage
      --kernel-memory string        Kernel memory limit
  -m, --memory string               Memory limit
      --memory-reservation string   Memory soft limit
      --memory-swap string          Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --restart string              Restart policy to apply when a container exits
```

https://docs.docker.com/engine/reference/commandline/update/

メモリや CPU の soft limit など設定できる模様。
JIRAの良いとこ悪いとこ

JIRA Cloudについて。Server版は若干異なることがあります。

良いとこ
------
### スクラム開発と非常に相性がいい
現在のJIRA Softwareはスクラム開発のために作られた様なもの。
スクラム中のフェーズに合わせたUIやワークフローが整っています。

### 非常に柔軟でいろいろカスタマイズできる
PivotalやPhabricatorなど他のスクラム向けタスク管理システムと比較しても、圧倒的に柔軟性が高いです。ワークフローの定義やワークフロー中のイベントなどにもフックしてアクションを起こすことができます。

### 検索機能が強力
強力といっても、超高機能なわけではないが、GUIで簡単に条件を組合せて検索することもできるし、JQLというシンプルな条件式高度な検索もできます。


悪いとこ
------
### 設定が難しい
柔軟性が高いがゆえに、設定が複雑で難しい。法則的ではあるので慣れればだいたい分かるようにはなります。

### Markdownが使えない
なぜか、Markdown等の一般的なライトウェイトな記法が使えません(Bitbucketでは対応してるのに！)。JIRAでは独自(?)のライトウェイト記法を使用します。難しくはないですが、わざわざJIRAだけのために覚えるのは非効率です。是非、下記のMarkdown熱望チケットで１票を投じてください！
https://jira.atlassian.com/browse/JRA-44898
https://jira.atlassian.com/browse/JRA-39919
https://answers.atlassian.com/questions/15271147/is-there-any-markdown-support-for-jira-ondemand
create-react-appでyarnしたいけど対応してないのでreact-scriptsだけ使う


create-react-appが素振りに最適なのだけど、電車の中などyarnで行いたい。
けど今のところ[対応前なので](https://github.com/facebookincubator/create-react-app/issues/896)で、「`create-react-app`時にinstallはしない」、みたいなことも出来なそうなので、react-scriptsだけ美味しく使うことをやってみる。

今回は「start使えればいいや」ぐらいな気持ちなので、testなどは試していない。

---

## 1. 普段通りのプロジェクト作成
```
$ mkdir example-yarn-react
$ cd example-yarn-react
$ git init
```

npm init -yでもいいんだけど、せっかくなのでyarn使う

```
$ yarn init -y
```

## 2. 必要パッケージのinstall
`react-scripts`を入れる。`react-script`という類似のパッケージがあるが、全く別物なので注意

```
$ yarn add --dev react-scripts --prefer-offline
```

reactとreact-domも入れる

```
$ yarn add react react-dom --prefer-offline 
```

yarnさんも初回は時間がかかるのでじっくり待つ。。。

## 3. scripts部分を追加

`package.json`のscripts部分の追加。手打ちだけどしょうがない。
個人的には素振り目的なのでstartだけ入れる。

```js
  "scripts": {
    "start": "react-scripts start"
  }
```

フルならこんな感じ。[詳細はこのへん](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#available-scripts)

```js
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
```

## 4. 起動のためのpublic/index.htmlファイル準備

```
$ mkdir public
$ touch public/index.html
```

index.htmlの最低限はこのぐらいな感じ。

```html
<html>
  <body>
    <div id="root"></div>
  </body>
</html>
```

## 5. srcファイル準備

```
$ mkdir src
$ touch src/index.js
```

中身はこんな感じ

```js
import React from 'react'
import ReactDOM from 'react-dom'

ReactDOM.render(
  <div>Hello</div>,
  document.getElementById('root')
)
```

## 6. 起動!!!
ここもせっかくなのでyarn使う

```
$ yarn start
```

起動した！

# 結論
* めんどくさい！！旨味半減
* 旨味半減だけど、半分ぐらいは旨い。のでそんなに悪くはない
    * webpack書かなくていいとかbabel設定しなくていいとかの部分で結構楽。
    * budoセットアップするのより気持ち楽？ぐらい。
* shell化するとかscript化するとかで改善できそうだけど、そこまでやる前に本体側が対応されそう
クラウド統合開発環境Cloud9でTensorFlowを使う〜使い方の基本〜

# はじめに
Cloud9でTensorFlowの[Basic Usage](https://www.tensorflow.org/versions/r0.11/get_started/basic_usage.html#basic-usage)を確認しました。TensorFlowを使う上での基本的な考え方と使い方をまとめます。
GPUとかInteractiveUsageとかは入ってません。まずは基本的なコードができることを目的として、その他は必要に応じて勉強していこうと思っています。

# 環境
[Cloud9](https://c9.io)
Python 2.7.6
Sample Codes : [GitHub](https://github.com/takus69/learn_tf)
環境構築は「[クラウド統合開発環境Cloud9でTensorFlowを使う](http://qiita.com/takus69/items/428d500a835ca2f514e4)」を参照

# TensorFlowの考え方
重要な考え方は以下の2点です。
- Graphs
- Sessions

Graphsは、値や計算を設定するクラスです。値は定数や変数、テンソル（2次元だと行列。多次元配列で定義します）などを持てます。その値の計算（例えば足し算や掛け算）を設定するのもGraphsになります。

Sessionsは、Graphsの値や計算を実行するクラスになります。TensorFlowはGPUを使えるようですが、Sessionsを介して自動的に使用してくれるようです。

そのためGraphsで値や計算を設定 => Sessionsで計算の実行
という流れになります。
以下で具体的な例を見ていきます。
[GitHub](https://github.com/takus69/learn_tf)のbasic_usage.py
の実行結果を順に解説していきます。

# 具体例
## constant(定数)とSessions

```
import tensorflow as tf

# Graphs
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.], [2.]])
product = tf.matmul(matrix1, matrix2)

# Sessions
sess = tf.Session()
result = sess.run(product)
print(result)
# Output: [[12.]]
sess.close()
```

1. tf.constantは、定数を設定
2. matrix1に1×2の行列、matrix2に2×1の行列を設定
3. tf.matmulで行列の掛け算（ここまでがGraphsの値や計算を設定しているところ）
4. tf.Session()でセッションを作成
5. runで計算を実行
6. close()でセッションをクローズ
7. printで行列の計算結果を出力

Graphsを設定してから、Sessionsで計算を実行している流れが重要です。

## Variable(変数)

```
# Graphs
state = tf.Variable(0)
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

init_op = tf.initialize_all_variables()

# Sessions
with tf.Session() as sess:
  sess.run(init_op)
  print(sess.run(state))
  for _ in range(3):
    sess.run(update)
    print(sess.run(state))
# Output: 0 1 2 3
```

1. tf.Variableで変数を設定
2. tf.addで足し算
3. tf.assignで足し算の結果をstateに入れ直し
4. tf.initialize_all_variables()で初期化（変数は初期化が必要！）
5. Session()でセッションを作成
6. run(init_op)で変数の初期化
7. ループでrun(update)して、結果のstateを出力

変数が順に更新されています。

## 複数同時にrun

```
# Graphs
input1 = tf.constant([3.0])
input2 = tf.constant([2.0])
input3 = tf.constant([5.0])
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

# Sessions
with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print(result)
# Output: [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
```

コードの内容は今までと変わらないので理解できると思います。
重要なのは、run([mul, intermed])で複数の計算を同時に実行し、結果の出力も同時に出力されているところです。

## placeholder（代入）

```
# Graphs
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)

# Sessions
with tf.Session() as sess:
  print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))
# Output: [array([ 14.], dtype=float32)]
```

tf.placeholder(tf.float32)で値を代入できるようにしています。
run([output], feed_dict={input1:[7.], input2:[2.]})で、代入して計算しています。

# おわりに
Graphsを設定してから、Sessionsで計算を実行している流れが重要だと思います。簡単なコードだと特に問題ないのですが、複雑な計算になってくるとどうなるかが未知数です。
サンプルコードを変更して色々と試してみるとさらに理解が深まると思います。

まだ勉強中なので間違いがあったらコメントにご指摘ください。
今後もTensorFlowの使い方を勉強していって、加筆・修正していきたいと思います。
色々なインフラ環境でMySQL 5.5+mysqlslapを使ってベンチマークを取ってみた結果

ここ数か月間、様々な仮想基盤インフラの上で、

- CentOS 7.2（ファイルシステムはxfs）
- MySQL 5.5.50（⇒MySQL 5.6以降とは違い、sync_binlog=1指定時に性能が大幅低下する）
- mysqlslapコマンド

を使ってベンチマークを取る機会がありました。
予想以上に結果のばらつきがありましたので、記録として残しておきます。

※一部の環境ではベンチマーク結果を公表するとまずい可能性があるため、ぼかした表現にしてあります。ご了承ください。

# 試した環境

- 3-Tier構成、A社製サーバ＋A社製iSCSIストレージ、仮想基盤X
- 3-Tier構成、B社製サーバ＋C社製FCストレージ、仮想基盤X、IOPSを3000に制限（プライベートクラウド）
- 3-Tier構成、D社製サーバ＋D社製FCストレージ、仮想基盤X、IOPSを5000に制限（性能志向のパブリッククラウド）
- ハイパーコンバージド環境、E社製サーバ、仮想基盤X
- ハイパーコンバージド環境、E社製サーバ、仮想基盤Y
- ハイパーコンバージド環境、F社製サーバ、仮想基盤X
- ハイパーコンバージド環境、G社製サーバ、仮想基盤X
- ハイパーコンバージド環境、H社製サーバ、仮想基盤X（パブリッククラウドのベアメタルサーバ）

なお、

- 各サーバのCPUは、Xeon E5-2630v3（2.4GHz×8コア）が中心（多少の違いはあり）
- フルSSDまたはハイブリッド構成（但し、記録されるデータは全てSSDドライブ内に収まる）
- 仮想マシンのCPUは8コア、メモリは14GB
- MySQL 5.5で、バッファプールを10GBとし、sync_binlog=1でバイナリログを記録
- mysqlslapでは、書き込み中心に2000クエリ×150スレッドを発行
- CentOS 7.2でxfs上にデータを保存

という条件で比較しています。

# 結果

- 最も高速な環境で130秒、最も遅い環境で410秒程度。**3倍以上**の差が出た（速いほうから順に、130秒・180秒・200秒・230秒・260秒・330秒・360秒・410秒）。
- 必ずしもCPUの速度に比例した結果にはならず。
- IOPSの制限値や、fioコマンドでベンチマークを取ったときのIOPS値の大小にも比例した結果にならず。
- 同じハイパーコンバージド環境でも、サーバの機種（メーカー）の違いや仮想基盤の違いで、結果に大きな差が出た。
 
なお、MySQL 5.6から、sync_binlog=1での性能が大幅に向上しています。MySQL 5.7で同じテストをしたところ、最速10秒程度から、最も遅くて30秒ぐらいの範囲で差が出ました。

また、mysqlslapではこれだけの差がでましたが、同じ環境上でWebアプリケーション経由の負荷試験をJMeterを使って行ったところ、それほど大きな差は出ませんでした。

# 差が出た理由（推測を含む）

- 各ストレージ（あるいはRAIDカード）のキャッシュ性能や容量の差、有効／無効の違いがあった。
- ベンチマークを取ったときの見かけ上のIOPSに差はなくても、レイテンシに大きな差があった。
- システム全体のIOPSは高くても、1本のI/Oスレッドで出せるIOPSの上限が低いシステムがあった。
- サーバのBIOSのパフォーマンス／省電力モードの設定に違いがあった（クラウドの場合手を出せない／出しづらい部分なので要注意）。

今回はxfsで試しましたが、ext3・ext4の場合、「1つのファイルに同時に書き込めるI/Oスレッドは1つのみ」という制限もありますので、I/OスレッドあたりのIOPSが低いシステムでは、思った以上に遅くなってしまう可能性があります。

# 結論

ある意味、当たり前の話ですが…。

- システムの移行をする場合、サーバのCPU性能やストレージのIOPSなど、表面的なカタログスペックだけで性能要件を満たしているかを判断するのは危険。見かけは同等でも、思った以上に差が出る。
- ワークロードによる向き／不向きがあるので、必ず実際に動かす（のと同等の）アプリケーションとデータを使って性能テストを行うべき。
Aruba gem - Environment

Aruba の Environment 周りについてまとめます。  

## <i class='fa fa-flask'></i> サンプル
### <i class='fa fa-check'></i> append_environment_variable
```ruby
require 'spec_helper'

RSpec.describe 'Environment', :type => :aruba do
  context 'append_environment_variable' do
    before(:each) { append_environment_variable 'HOGE_VARIABLE', 'a' }
    before(:each) { run('env') }
    before(:each) { stop_all_commands }

    it { expect(last_command_started.output).to include 'HOGE_VARIABLE=a' }
  end
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/environment/append_environment_variable_spec.rb

Environment
  append_environment_variable
    should include "HOGE_VARIABLE=a"

Finished in 0.11345 seconds (files took 0.22137 seconds to load)
1 example, 0 failures
```

### <i class='fa fa-check'></i> with_environment
```ruby
require 'spec_helper'

RSpec.describe 'Environment', :type => :aruba do
  context 'with_environment' do
    it do
      with_environment 'HOGE_VARIABLE' => 'd' do
        expect(ENV['HOGE_VARIABLE']).to eq 'd'
      end
    end
  end
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/environment/with_environment_spec.rb

Environment
  with_environment
    should eq "d"

Finished in 0.00567 seconds (files took 0.23039 seconds to load)
1 example, 0 failures
```

### <i class='fa fa-check'></i> prepend_environment_variable
```ruby
require 'spec_helper'

RSpec.describe 'Environment', :type => :aruba do
  context 'prepend_environment_variable' do
    before(:each) { prepend_environment_variable 'HOGE_VARIABLE', 'a' }

    before(:each) { run('env') }
    before(:each) { stop_all_commands }

    it { expect(last_command_started.output).to include 'HOGE_VARIABLE=a' }
  end
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/environment/prepend_environment_variable_spec.rb

Environment
  prepend_environment_variable
    should include "HOGE_VARIABLE=a"

Finished in 0.11504 seconds (files took 0.21995 seconds to load)
1 example, 0 failures
```

### <i class='fa fa-check'></i> delete_environment_variable
```ruby
require 'spec_helper'

ENV['HOGE_VARIABLE'] = 'a'
RSpec.describe 'Environment', :type => :aruba do
  context 'delete_environment_variable' do
    before(:each) { delete_environment_variable 'HOGE_VARIABLE' }
    before(:each) { run('env') }
    before(:each) { stop_all_commands }

    it { expect(last_command_started.output).not_to include 'HOGE_VARIABLE=a' }
  end
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/environment/delete_environment_variable_spec.rb

Environment
  delete_environment_variable
    should not include "HOGE_VARIABLE=a"

Finished in 0.11695 seconds (files took 0.22419 seconds to load)
1 example, 0 failures
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Environment - Aruba - docs](http://www.relishapp.com/cucumber/aruba/v/0-11-0/docs/environment)
Aruba gem - Hooks

Aruba の Hooks 周りについてまとめます。
Aruba は Before / After の Hook を持っています。

## <i class='fa fa-flask'></i> サンプル
```ruby
require 'spec_helper'

Aruba.configure do |config|
  config.before :command do |cmd|
    puts "before the run of '#{cmd.commandline}'"
  end

  config.after :command do |cmd|
    puts "after the run of '#{cmd.commandline}'"
  end
end

RSpec.describe 'Hooks', :type => :aruba do
  before(:each) { run_simple 'echo hoge' }

  it { expect(last_command_started.stdout.chomp).to eq 'hoge' }
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/configuration//home_directory_spec.rb

before the run of 'echo hoge'
after the run of 'echo hoge'
.

Finished in 0.02064 seconds (files took 0.32232 seconds to load)
1 example, 0 failures
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Before_cmd hooks - Aruba - docs](http://www.relishapp.com/cucumber/aruba/v/0-11-0/docs/before/before-cmd-hooks)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Aftre_cmd hooks - Aruba - docs](http://www.relishapp.com/cucumber/aruba/v/0-11-0/docs/after/after-command-hooks)