OmniAICreator/Qiita-1.07M huggingface dataset:
Thunderbirdの日本語化(version 31.6.0)

Lubuntu(15.04)にいれているThunderbird(31.6.0)のメニューが英語で使いにくかったので、日本語化しました。

##バージョン確認
```lang:OSのバージョン確認
cat /etc/lsb-release 
```
>DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.04
DISTRIB_CODENAME=vivid
DISTRIB_DESCRIPTION="Ubuntu 15.04"

```lang:Thunderbirdのバージョン確認
thunderbird -v
```
>Thunderbird 31.6.0

##手順
```lang:日本語化パッケージの確認
aptitude search thunderbird-locale-ja
```
>p   thunderbird-locale-ja                                                   - Japanese language pack for Thunderbird      

```lang:日本語化パッケージのインストール
sudo aptitude install thunderbird-locale-ja
```
![install.png](https://qiita-image-store.s3.amazonaws.com/0/79062/7f227317-a155-2e07-ce75-b5465e05c355.png)

##比較

###Before
![en.png](https://qiita-image-store.s3.amazonaws.com/0/79062/5d9393c6-c105-a3fe-4af1-8659490b0d18.png)

###After
![ja.png](https://qiita-image-store.s3.amazonaws.com/0/79062/f9ae91d0-ef0e-9845-9a87-1389c51cb668.png)




以上です。

##参考
[Thunderbirdをインストールして日本語化](http://bats.cocolog-nifty.com/blog/2010/11/thunderbird-079.html)
MacとUSB/TTLシリアル変換ケーブルでRaspberry Pi 2にコンソール接続する

Raspberry Piで使うために秋葉原の千石通商で次のようなケーブルを買ってきました。税込880円でした。

* [PL2303HX内蔵USBシリアル変換ケーブル](https://web.archive.org/web/20160412124513/https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4HJ7) （web.archive）

これは下記の製品を輸入したもののようです。eBayなどで買えばもっと安く買えそうです。

* [USB to TTL Serial Cable - Debugger for Dev Board](https://web.archive.org/web/20161231192848/https://www.seeedstudio.com/USB-to-TTL-Serial-Cable-Debugger-for-Dev-Board-p-1642.html) （web.archive）

本稿はこれを使ってMacBookとRaspberry Pi 2をシリアル経由でコンソール接続したときのメモです。

# 購入検討

このケーブルはProlific社のPL2303HXというチップを内蔵しています。評判を調べたところFTDI社のFT232Rなどに比べるとやや性能が劣るようですが、コンソール接続する分には十分だと判断しました。また、ピンがメスなのでRaspberry Piにそのまま接続できるのは便利です。

# ドライバのインストール

チップメーカーのサイトからドライバをダウンロード、インストールしてMacBookを再起動します。

* [PL2303 Mac OS X Driver Download](http://www.prolific.com.tw/us/showproduct.aspx?p_id=229&pcid=41)

# minicomのインストール

`screen`でもシリアル接続できるみたいですが、無意味な反抗心から`minicom`を使うことにしました。

```
$ brew install minicom
```

# 接続

ケーブルのピンのうち、白（RxD）をGPIOの14番ポート、緑（TxD）を15番ポートに接続します。黒（GND）は14番の隣のGNDに接続します。赤はどこにも繋ぎません。

接続したらMacBookから次のようにタイプします。

```
$ minicom -b 115200 -o -D /dev/tty.usbserial
```

これで繋がりました。シリアル経由でログインもできますし、起動時のログも全部見えます。やったね。

![minicom.png](https://qiita-image-store.s3.amazonaws.com/0/46856/156648eb-50b4-ae4a-f38d-8a0e4613493f.png)

デバイスのパスは人によって変わるのかもしれませんが、筆者の場合は上記のパスで動きました。

# 参考にしたサイト

* [MacとRaspberry PIをシリアル通信で接続する - foldrr's weblog](http://foldrr.hatenablog.com/entry/2013/10/13/202044)
* [Raspberry PiとMac間のシリアル接続 | 火付盗賊改方](https://onihei.wordpress.com/2014/10/05/raspberry-pi%E3%81%A8mac%E9%96%93%E3%81%AE%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E6%8E%A5%E7%B6%9A/)
* [ねこのしっぽ: Mac OS X Mountain Lion で RaspberryPi とシリアル接続する](http://cat-s-tail.blogspot.jp/2013/10/Mac-OS-X-Mountain-Lion-RaspberryPi-serial.html)
PHPを扱うようになったのでemacsにphp modeを入れてみた。

普段はRubyを主に使ってますが、phpも最近読んだり書いたりしてるのでemacsに設定いれてみました。

#php-mode
まずはphp-modeをいれますー

[ここ](https://github.com/ejmr/php-mode)を読みました。
melpa上からinstallです。

emacs上で

```el
M-x package-list-packages
```
php-modeを選択。

init.elに

```el
;; php-mode
(require 'php-mode)
```
を追加です。

#php-completion
PHPの補完をやってくれるものもあったのでそれもいれます。

```el
M-x auto-install-batch
```
php-completion を選択です。

```el
;; php-mode-hook
(add-hook 'php-mode-hook
          (lambda ()
            (require 'php-completion)
            (php-completion-mode t)
            (define-key php-mode-map (kbd "C-o") 'phpcmp-complete)
            (make-local-variable 'ac-sources)
            (setq ac-sources '(
                               ac-source-words-in-same-mode-buffers
                               ac-source-php-completion
                               ac-source-filename
                               ))))
```

これでphpの補完もしてくれる。
Sinatraメモ

# Sinatraとは
* Rubyで計量Webアプリケーション
* DSL(Domain Specific Language)

## Sinatraをさっさと使ってみよう

### インストール

~~~console
$ gem install sinatra
...
installed
~~~

### ディレクトリ構成
※railsのように勝手にファイル生成はされないので、自分でディレクトリ切ってファイルを作成する

~~~console
/sinatra_app
 ├─ /controller
 ├─ /lib
 ├─ /public
 ├─ /views
 ├─ app.rb
...
~~~

|ファイル|説明|
|:--|:--|
|/controller|アプリケーションを配置する|
|/lib|汎用的なプログラムを配置する|
|/public|静的ファイル(html, css, 画像)を配置する|
|/views|動的ファイル(erb)を配置する|
|app.rb|メインアプリケーション|

### 実装する

~~~ruby:app.rb
require "sinatra"

get "/hello/:name" do |n|
  "hello #{n}"
end
~~~

### 表示する
#### sinatraの起動

~~~console
$ ruby app.rb
~~~

#### 実行結果
ブラウザで```http://localhost:4567/hello/bob```にアクセス

~~~:/hello/bob
hello bob
~~~

これで最低限のWebアプリが完成！

# もうちょっと高度に使ってみる

## オートリロード

### インストール

~~~console
$ gem install sinatra-contrib
...
installed
~~~

### 有効にする

~~~ruby:app.rb
require "sinatra/reloader" # 追加
...
~~~

## Rubyの書き方あれこれ

### パスの書き方あれこれ
主に３つの書き方があるのかな？

~~~ruby:app.rb
get "/hello/:name" do |n|
  "hello #{n}"
end
~~~

~~~ruby:app.rb
get "/hello/*" do |n|
  "hello #{n}"
end
~~~

~~~ruby:app.rb
get "/hello/:name" do
  "hello #{params[:name]}"
end
~~~

#### 実行結果
すべて同じ実行結果になる

~~~:/hello/tom
hello tom
~~~

### URLのパスをオプショナルにする
オプショナルにしたいパスの単語の前後に`?`をつける

~~~ruby:app.rb
get "/konitiwa/:first_name/?:last_name?" do |fn, ln|
  "konitiwa #{fn} #{ln}"
end
~~~

#### 実行結果

~~~:/konitiwa/maruyama
konitiwa maruyama
~~~

~~~:/konitiwa/maruyama/hikaru
konitiwa maruyama hikaru
~~~
同一ファイルの異なるコミットの差分を確認する3つの方法


## Git

```bash
$ git diff commit1 commit2 -- path/to/file
```

gitのコマンドではこれで行ける。

- [Git - git-diff Documentation](http://git-scm.com/docs/git-diff)

## Github

```text
http://github.com/<USER>/<REPO>/compare/[<START>...]<END>
```

古いコミットを先に書く。

<img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.morizotter.com/wp-content/uploads/2015/05/morizotter_blogcompare.png" alt="Compare" title="compare.png" border="0" width="516" height="280" />

こんな感じになります。

- [Introducing GitHub Compare View](https://github.com/blog/612-introducing-github-compare-view)

## SourceTree

`Cmd`押しながら比較したいコミットを２つ選択するだけで差分が出る。便利！

## その他の参考記事

- [Git: how to diff the same file between two different commits on the same branch? - Stack Overflow](http://stackoverflow.com/questions/3338126/git-how-to-diff-the-same-file-between-two-different-commits-on-the-same-branch)
- [transitive.info - git diff 使い方](http://transitive.info/article/git/command/diff/)
- [Githubでコミットやブランチやタグ間のdiffを見る、Compare viewを使う - kanonjiの日記](http://d.hatena.ne.jp/kanonji/20110201/1296527163)
[超初心者]サーバのHost名変更について

小生、まだまだ新米エンジニアで、毎回、Host名の変更を忘れるので備忘録として残します。

*hoge*というHost名に変更する場合

一時的にホスト名を変更する場合

~~~~~~~~~~~~~
hostname hoge
~~~~~~~~~~~~~

しかし、再起動するとこの変更は無効になる。
再起動しても、Host名が変更されないように

~~~~~~~~~~~~~
vi /etc/sysconfig/network
HOSTNAME=hoge
~~~~~~~~~~~~~

変更が終わった後は、ネットワークの再起動を行います。

~~~~~~~~~~~~~
/etc/rc.d/init.d/network restart
~~~~~~~~~~~~~
Bootstrapのmodalを呼び出すjsライブラリ


を作りました。正確に言えば以前に作ったものを思いつきでCoffeescriptに書き直したのでついでにgithubに公開してみました。
bootstrapのモーダルは見栄えも良くて各ブラウザでの確認ウインドウの差異を吸収するのに愛用するんですが、
素直にhtmlを書こうとするとdivが何重にもネストしたりして面倒なので。

#BootstrapModal
[https://github.com/fisherman08/BootstrapModal](https://github.com/ky0314/BootstrapModal "")


* モーダルのタイトル、本文を指定できます。本文はjQueryオブジェクトも受け取ります
* 任意の数のボタンをそれぞれコールバック付きで作成できます。bootstrapのボタンのクラス(info,success,warning,danger)を指定できます。標準ではdefaultになります。
* モーダルのロックなどのオプションもあります

## 使用方法:
.jsファイルを読み込むだけです

```html:example.html
<script src="bs_modal.js"></script>

```

## simple example :
window.alert()を置き換えるだけなら以下の1行でできます

```javascriipt:example.js
   BootStrapModal.call({"title":"success", "body":"Data successfully updated"});
```

## another example with full-options :
色々オプションをつけてボタンをたくさん載せると以下の感じになります。
各オプションの詳細はコメントを見てください。すいません。。。

```javascript:example.js

   // "body" option can receive a String or a jQuery object
   var $p = $('<p/>').text('Are you sure to delete the data?');
   
   
   BootStrapModal.call(
        {
            "title"  : "delete the data", // the title put at the header(String)
            "body"   : $p, // the main message of the modal window(String or jQuery object)
            "fade"   : true, // if true, the modal window appears by fading(Boolean)
            "static" : true, // if true, the modal window WILL NOT BE DISAPPEARED when background is clicked or ESC is pressed.(Boolean)
            "id"     : "", //
            "actions" :[ // Array of objects to create buttons
                        {
                            "label": "Cancel",
                            "type": "default",
                            "class_str": "",
                            "close": true,
                            "callback": function(modal){
                                     // the function to be executed when the button is clicked
                                     // this function will receive the instance of modal class, which has "close()" method to close the modal.
                                     // when you set the "close:false", do not forget to call "modal.close()" at the last of the function
                            }
                        },
                        {
                            "label": "Delete",
                            "type": "danger",
                            "class_str": "",
                            "close": false,
                            "callback": function(modal){
                                    alert("delete!");
                                    modal.close();
                            }
                        }
                        ]
        }
    );
```

ただこれだけです。非常に簡単なライブラリですが、あると便利。
バグやツッコミどころはかなりあると思うので、もしお気付きの方がいらっしゃいましたらここかgithubでご指摘ください。。
もちろんpull-requestも大歓迎です。
[https://github.com/fisherman08/BootstrapModal](https://github.com/ky0314/BootstrapModal "")
【Bootstrap3】モーダルに「data-*」属性でデータを渡す


##__概要__
![Bootstrapのモーダル起動ボタン.png](https://qiita-image-store.s3.amazonaws.com/0/43456/eb633cb4-9f78-7422-8d26-11ece8cfb469.png "Bootstrapのモーダル起動ボタン.png")

![矢印.png](https://qiita-image-store.s3.amazonaws.com/0/43456/0df47063-c2ff-5e20-435a-6f76bd0fef9d.png "矢印.png")


![JavaScript_·_Bootstrap.png](https://qiita-image-store.s3.amazonaws.com/0/43456/f7e8d95b-c9fb-3cd1-30cf-8336b619cdfc.png "JavaScript_·_Bootstrap.png")

同じモーダルに、そのモーダル起動ボタンによって異なる情報を表示させることが出来ます。

##__方法__
###ボタン部分
```html
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@mdo">Open modal for @mdo</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@fat">Open modal for @fat</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@getbootstrap">Open modal for @getbootstrap</button>
...more buttons...
```
`<button>`の `data-toggle`は`modal`、`data-target`は、起動させたいモーダルのIDを指定することは変わりません。

ここで、 **モーダルに渡したい情報も `data-*` 属性で渡すことが出来ます** 。

###モーダル部分
先ほどの、`<button>`の`data-target`の#idと、モーダルの`<div>`の`id`は、同じものにしてください。

もっと言うと、`labelledby`の値がどうこう、と、いろいろ設定する値がありますが、それがこの記事の本題では無いので割愛します。

```html
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="exampleModalLabel">New message</h4>
      </div>
      <div class="modal-body">
        <form>
          <div class="form-group">
            <label for="recipient-name" class="control-label">Recipient:</label>
            <input type="text" class="form-control" id="recipient-name">
          </div>
          <div class="form-group">
            <label for="message-text" class="control-label">Message:</label>
            <textarea class="form-control" id="message-text"></textarea>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Send message</button>
      </div>
    </div>
  </div>
</div>
```

今回、モーダルのタイトルと、 `recipient-name` 部分に、ボタン側の `data-whatever` の値を表示させます。

###スクリプト
```javascript
$('#exampleModal').on('show.bs.modal', function (event) {
  var button = $(event.relatedTarget) //モーダルを呼び出すときに使われたボタンを取得
  var recipient = button.data('whatever') //data-whatever の値を取得

  //Ajaxの処理はここに

  var modal = $(this)  //モーダルを取得
  modal.find('.modal-title').text('New message to ' + recipient) //モーダルのタイトルに値を表示
  modal.find('.modal-body input#recipient-name').val(recipient) //inputタグにも表示
})
```

##__参考__
http://getbootstrap.com/javascript/#modals-related-target
Java8のStreamで順列を生成

与えられたリストからn個の要素を取り出す順列をストリームとして生成します。

```java
    static <T> List<T> cons(T head, List<T> tail) {
        List<T> list = new ArrayList<>();
        list.add(head);
        list.addAll(tail);
        return list;
    }

    static <T> List<T> remove(T e, List<T> list) {
        List<T> newList = new ArrayList<>(list);
        newList.remove(e);
        return newList;
    }

    public static <E> Stream<List<E>> permutations(int n, List<E> list) {
        if (n <= 0) return Stream.of(new ArrayList<>());
        return list.stream()
            .flatMap(h -> permutations(n - 1, remove(h, list))
                .map(t -> cons(h, t)));
    }
```

リストの中から要素をひとつ取り出します（`h`）。残りの要素（`remove(h, list)`）の順列をすべて求めて、得られたそれぞれのリストの先頭に取り出した要素（`h`）を追加（`cons(h, t)`）します。これで取り出した要素を先頭とするすべての順列が求まります。すべての要素についてこれを行うとすべての順列が得られます。

`cons()`はLisp系の言語や関数型言語をやっている人から見ると笑いものですね。

リスト[1, 2, 3]の中から2つ取る順列を生成してみます。

```java
    @Test
    public void testPermutationsN() {
        permutations(2, Arrays.asList(1, 2, 3))
            .forEach(System.out::println);
    }
```

結果は以下のようになります。

```java
[1, 2]
[1, 3]
[2, 1]
[2, 3]
[3, 1]
[3, 2]
```

これを使って覆面算「SEND + MORE = MONEY」を解いてみます。
問題に表れる英字はS, E, N, D, M, O, R, Yの8種類なので、リスト[0, 1, ... , 9]から8個を取り出す順列を得て、フィルターで式を満たすかどうかをチェックします。SとMは先頭に現れるので0にはなりません。

```java
    int number(int... args) {
        return IntStream.of(args).reduce(0, (a, b) -> 10 * a + b);
    }

    boolean check(int s, int e, int n, int d, int m, int o, int r, int y) {
        if (s == 0 || m == 0) return false;
        int send = number(s, e, n, d);
        int more = number(m, o, r, e);
        int money = number(m, o, n, e, y);
        if (send + more != money) return false;
        System.out.printf("%s + %s = %s%n", send, more, money);
        return true;
    }

    @Test
    public void testSendMoreMoney() {
        permutations(8, Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
            .filter(l -> check(
            	l.get(0), l.get(1), l.get(2), l.get(3),
                l.get(4), l.get(5), l.get(6), l.get(7)))
            .forEach(System.out::println);
    }
```

結果は以下のようになります。

```java
9567 + 1085 = 10652
[9, 5, 6, 7, 1, 0, 8, 2]
```

私の環境では`permutations(8, Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))`の後に`.parallel()`をつけると少しだけ速くなりました。

リストのストリームではなくリストのリストを返す場合は以下のようになります。

```java
    public static <E> List<List<E>> permutationsList(int n, List<E> list) {
        if (n <= 0) return Arrays.asList(Arrays.asList());
        List<List<E>> result = new ArrayList<>();
        for (E head : list)
            for (List<E> tail : permutationsList(n - 1, remove(head, list)))
                result.add(cons(head, tail));
        return result;
    }
```

こっちの方が分かりやすいように思えるのは古い人間だからなのでしょうか？
GoogleスプレッドシートでAmazon特定商品の価格を定期的に取得

Google Apps Scriptを用いて、Googleスプレッドシート上に、定期的にAmazonの特定商品の価格を取得・追加していきます。下記の記事内容をまとめなおしたものです。

- http://shirayuca.github.io/blog/2015/05/16/amazon-price.html

## スクリプト

```js:getAmazonPrice.gs
function getAmazonPrice() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var date = new Date();
  var row = sheet.getLastRow()+1;
  
  sheet.getRange('A'+ row).setValue(date);
  
  sheet.getRange('B'+ row)
    .setFormula('=IMPORTXML(E1,"//td[@class=\'a-span12\']/span[@class=\'a-size-medium a-color-price\']")');
}
```

## 使い方

<img src="http://i.gyazo.com/4d9e5dca1e3bfb1d06d979716be3d6bf.png", width="600">

1. 上図のようなスプレッドシートを作成
2. E2セルに任意のAmazonページURLを入力
3. スクリプトエディタに上記「getAmazonPrice.gs」を貼り付け
4. 任意のスパンでトリガーを設定
StrinkinglyのDNSをValue Domainで設定するメモ



Strinkinglyで独自ドメインで使う時のDNSの設定方法のメモ


## 設定項目

以下をDNS設定で、ネームサーバーに設定する。

注意点) dns.strikingly.comの後にドットを入れること!

```
a @ 54.183.102.22
cname www dns.strikingly.com.
```


## 参考

公式ドキュメント: 簡易設定の方法しか書いてない。

* [Value-Domainのドメインを接続する – Strikingly ヘルプセンター](https://support.strikingly.com/hc/ja/articles/206106442-Value-Domain%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B) 

一般的な接続方法

* [カスタムドメインを接続する – Strikingly ヘルプセンター](https://support.strikingly.com/hc/en-us/article_attachments/202433461/Desctop_screenshot.png)
WordPressプラグインのユニットテストにおける依存関係の問題を解決する

WordPressプラグインのユニットテストをしていてしばしハマってしまうのが、プラグイン同士が依存関係をもってしまっている場合のテストです。

例えば、作っているプラグインでAdvanced Custom Fieldsの提供している関数が必要としましょう。すると通常の`wp scafolled plugin`で作られるユニットテストのコードを実行すると関数未定義のエラーとなってしまいます。

それを解決するユニットテストのパターンを作って[Github](https://github.com/horike37/wp-plugin-unittest-dependency-patten)に上げました。

```lang:tests/dependencies-array.php
<?php
return array(
	'advanced-custom-fields' => array(
		'include' => 'advanced-custom-fields/acf.php',
		'repo' => 'https://downloads.wordpress.org/plugin/advanced-custom-fields.zip',
	)
);
```
こんな感じで依存関係のあるプラグインを配列で指定してあげるだけで、インストールしてユニットテストを実行してくれます。

それでは良いユニットテストライフを！
ソフトウェアRAID の初期設定と運用 - mdadm

最近利用することがなくなった ソフトウェアRAID だが 初期構築と運用方法をまとめる。（CentOS/Redhat) 
###初期設定

2台のHDDにパーティションテーブルを作成する。

#####HDD１台目 パーティションテーブルの作成　(/dev/sdb)

```
# fdisk /dev/sdb
 コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-1044, 初期値 1):1
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-1044, 初期値 1044): 1044
```

#####作成したパーティションのタイプを Linux raidに設定

```
コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました
```
#####パーティションテーブルの保存

```
コマンド (m でヘルプ): w
パーティションテーブルは変更されました！
```

#####パーティションテーブルの確認

```
# fdisk /dev/sdb -l
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1        1044     8385898+  fd  Linux raid 自動検出
```

#####HDD2台目 パーティションテーブルの作成 (/dev/sdc)

```
# fdisk /dev/sdc
```
手順はHDD1台目と同様のため省略

#####ソフトウェアRAID設定
2台のHDD(/dev/sdb, /dev/sdc) をソフトウェアRAIDとして /dev/md0 に割り当て

```
# mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sdb1 /dev/sdc1
```
#####ファイルシステムの構築
作成したRAIDデバイス(/dev/md0)にファイルシステム（ext3）を構築します。

```
mke2fs -j /dev/md0
```

##### ファイルシステムのマウント

```
# mkdir /mirror
# mount /dev/md0 /mirror/
```
##### RAID 情報の保存

```
# mdadm --detail --scan > /etc/mdadm.conf
```

起動時にマウントされるように /etc/fstab へ追加

```
# vi /etc/fstab
/dev/md0            /mirror          ext3      defaults    0 0
```

初期構築は以上です。/mirror にソフトウェアRAIDがマウントされています。

###運用方法

#####RAID状況の確認（同期やリビルド）

```
# cat /proc/mdstat
```

#####詳細確認

```
# mdadm --detail /dev/md0
```

#####1台目のハードディスク　/dev/sdb　に障害を発生させる

```
# mdadm --fail /dev/md0 /dev/sdb
```

#####障害が発生したHDD /dev/sdb を/dev/md0 から切り離す

```
# mdadm --remove /dev/md0 /dev/sdb
```

#####RAIDデバイスにハードディスク /dev/sdb を追加する

```
# mdadm --add /dev/md0 /dev/sdb
```
#####HDDの詳細

```
# mdadm --detail --scan 
ARRAY /dev/md0 metadata=1.2 spares=1 name=centos:0 UUID=7aef3364:f7d73931:8c05ce32:dcd9ae39
```
#####HDDを交換した場合は　RAID情報を保存

```
# mdadm --detail --scan > /etc/mdadm.conf
```

###その他
##### ブートディスクをソフトウェアRAIDにする場合
上記の例では不必要だが、MBRを書き込むディスクをRAIDとするときは、２本目のハードディスクにもMBRを書き込む必要がある。

rootとしてログインし、GRUB コマンドを実行します。

``` 
  [root@linux ~]# grub  　
  grub> root (hd0,0)  　
  grub> setup (hd0)
  grub> root (hd1,0) 　
  grub> setup (hd1)  　
  grub> quit
```

##### mdadm コマンドが利用できない場合

```
# yum install mdadm
```
XAMPPの導入！

<h1>XAMPPの導入！</h1>

　ローカルにPHP等のサーバスクリプトの環境が作れたらと思い、XAMPPの導入をしました。XAMPPは本来WINDOWS向けのシステムなんですが、今回はOSXにインストールしてみました。（OSXの対応に関してはベータ版とのことです。）


<h2>インストール編</h2>

１．<STRONG>公式サイトよりXAMPPをダウンロード</STRONG>
<A HREF="https://www.apachefriends.org/jp/download.html">こちら</A>よりOSを選択しダウンロードします。

２．<STRONG>インストールする</STRONG>
OSX：xampp-osx-ver-0-installer.dmgを実行</P>WINDOWS：xampp-win32-ver-0-VC11-installer.exeを実行

３．<STRONG>動作を確認する</STRONG>
インストール完了後XAMPPを起動し、その中のapacheをスタートさせます。(PHP等もスタートさせて問題ありませんが、今のところはWEBSVの動作確認なのでapacheのみスタートしていれば可です。)

下の画像でAPACHEが緑点灯すれば起動完了です。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/78033/76755453-2224-4c79-6449-006d23ffe24f.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/78033/c400fbf4-6e0a-b49b-0513-9d50d4ff3e16.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/78033/2ba4f8ed-758e-b905-3bc6-f09fb47c521b.png)
４．<STRONG>XAMPPの管理画面へ入る</STRONG>
ブラウザ、URLのところに「localhost」と入力しアクセスする。以下のページが表示されれば成功です。ここで表示されなければapacheが起動していません。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/78033/d6265f74-a093-5b59-4f24-1ff29ba748ad.png)
以上でインストールは終わりです。
WEBサーバがローカルに構築されました！

ここにWORDPRESSをインストールしたり、PHP,SQLを実行したりします。
いちいちレンタルサーバ等の環境を準備する必要はなさそうですね。
GeoJSONファイルを可視化（地図上表示）

こんにちは。
GeoJSON ローカルファイルを地図上でデータ表示させる簡便方法はいくつかあるようです。

#### web サイト

- https://maps.gsi.go.jp/#5/36/140/&base=blank  （国土地理院）
- https://kepler.gl/demo  （kepler.gl GET STARTED）
- http://geojson.io  （[simplestyle](http://qiita.com/kkdd/items/46906cb1110488828d9e) 対応）
- [Leaflet Filelayer plugin](http://makinacorpus.github.io/Leaflet.FileLayer/index.html) （下記図例）
- [Simple GeoJSON Editor](https://google-developers.appspot.com/maps/documentation/utils/geojson/) (Google Developers)
 - https://google-developers.appspot.com/maps/documentation/javascript/examples/full/layer-data-dragndrop
 - https://tomscholz.github.io/geojson-editor/

![b7b85634-c5ab-f011-e2d6-b248db97a80e.jpg](https://qiita-image-store.s3.amazonaws.com/0/54617/1c428ec8-a480-9124-9c72-f9f03ee0832d.jpeg)

##### kml ファイルなどの可視化サイト
kml ファイルなどの可視化サイトもあるようです。
 - [GPS Visualizer](http://www.gpsvisualizer.com)
 - [Google Maps](https://maps.google.com)（Google アカウントのサービス）


#### ローカル html を動かしてデータ表示

ローカル html を用意しブラウザ上で動かせば、その地図上でデータ表示可能です（下記例）。そのソースの自作も容易です[^1] [^2]。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/b3abc177-dc8f-9d42-b7f8-8c9ac6888b82.gif)

[^1]: 例えば、「[GeoJSON ローカルファイルを地図上に可視化表示](https://qiita.com/kkdd/items/607a8d04bc9feca83c5c)」
[^2]: もしくは上記のサイトのソースをダウンロードして使っても良いかもしれません。
Vagrantで複数環境のSynced FolderにNFSを利用する方法


VagrantのSynced FolderにNFSを利用したが、 **複数のVagrantfileで別々の環境を立ち上げる場合** に設定が上手くいかずハマったのでメモ。

# 環境

* Mac OSX Yosemite 10.10.3
* Vagrant 1.7.2
* VirtualBox 4.3.26
* 仮想環境1と仮想環境2を別々のVagrantfileで定義
	* どちらの環境もSynced FolderをNFSを使ってマウントするように

# 不具合の発生

1. 仮想環境1で `vagrant up`。
1. 起動後、仮想環境1にSSH接続してマウントされたディレクトリを確認。
1. 仮想環境2で `vagrant up`。
1. 起動後、仮想環境2のマウントされたディレクトリは問題ないが、仮想環境1でマウントしたディレクトリにアクセスできず

# 原因の調査

VM起動時に以下のような流れでディレクトリをマウントしていることを確認。

1. 現在の `/etc/exports` のバックアップファイルを作成
2. Synced Folderの共有設定を `/etc/exports` に書き込み
3. VMが指定したディレクトリをNFSマウント
4. `/etc/exports` を1.で作成したバックアップファイルに復元

どうやら2つめのVMを起動した際に **1つめのVMに対するNFSサーバーの設定が無効化** されてしまったことが原因のよう。

これはVagrantのバグ報告でも上がっているのだけど、まだ対応もコメントもされていない。（バージョン1.7.2時点）
参考：[NFS problem on multiple machines #4990](https://github.com/mitchellh/vagrant/issues/4990)

# 解決策

だったら手動で `/etc/exports` を書いておいて、Vagrantには触らせなければ良いじゃん！ということで。

## /etc/exportsの手動設定

```/etc/exports
/srv -network 192.168.33.0 -mask 255.255.255.0 -alldirs -mapall=501:20
```

* `/srv` 以下のディレクトリを 192.168.33.x のIPアドレスからマウントできるように設定。
* サブディレクトリのマウントを許可

## NFSサーバーの再起動

`/etc/exports` は更新しただけではNFSサーバーに設定が反映されないので、Macを再起動するか、NFSサーバーを再起動する。

```コマンド
sudo kill -s HUP `cat /var/run/mountd.pid`
```
参考：[Mac OS X で NFS を使う](http://www.maruko2.com/mw/Mac_OS_X_%E3%81%A7_NFS_%E3%82%92%E4%BD%BF%E3%81%86)

## Vagrantfileの設定

VagrantでSynced FolderにNFSを指定すると、通常では毎回 `/etc/exports` を書き換えてしまう。
そのため、Synced Folderのオプションで `nfs_export: false` を指定し、書き換えを行わないように設定する必要がある。

```参考例
config.vm.synced_folder ".", "/vagrant", type: "nfs", nfs_export: false, mount_options: ["nolock", "vers=3", "udp"]
```
拡張子htmlのファイルをPHPで動かす

#拡張子htmlのファイルをPHPで動かす
htmlのファイルでPHPが動くんです。
Apacheの設定を変える事で動くんです。

##やり方
１.　php.confを編集する
#vi /etc/httpd/conf.d/php.conf
　AddHandler php5-script .php
→ AddHandler php5-script .php .html
AddHandlerに.htmlを追加する

２. Apache再起動
# service httpd restart
WKWebViewとUIWebViewのメモリ消費の違い

**WKWebViewはXcodeのバグでメモリ使用量が正しく表示されない問題があるのが原因らしいです**
>[WKWebViewで躓いた10つのまとめ - Qiita](https://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9)



UIWebViewとWKWebView、皆さんどちらを使ってますか？
UIWebViewの方が色々弄れたり、情報も多いですよね。
今回はメモリ消費の違いを見てみました。



```objc:UIWebViewの方
    for (int i=0; i<5; i++) {
        UIWebView*v = [[UIWebView alloc] initWithFrame:CGRectMake(0, (1136/2)/5*i, 320, (1136/2)/5)];
        [v loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://blog.esuteru.com/archives/8176460.html"]]];
        [self.view addSubview:v];
    }
```

```objc:WKWebViewの方
    for (int i=0; i<5; i++) {
        WKWebView*v = [[WKWebView alloc] initWithFrame:CGRectMake(0, (1136/2)/5*i, 320, (1136/2)/5)];
        [v loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://blog.esuteru.com/archives/8176460.html"]]];
        [self.view addSubview:v];
    }
```


上記のコードで比較しました。
WebViewのインスタンスを５つ生成し、縦に並べます。
はちま起稿のサイト（ある程度メモリ消費が見込めそうなサイト）を読み込み、Xcodeでメモリ消費を見てみます。


![Screen Shot 0027-05-16 at 7.03.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/befa3cbc-7798-2aee-ac28-1cf4043f0e21.png)

UIWebViewの方。
大体500MBくらいでした。

![Screen Shot 0027-05-16 at 7.03.29 PM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/b872fbaa-dd51-7dc4-a476-e4c8c847f041.png)



**！？**
WKWebViewの方。
30MBくらいでした。





検証の方法がちょっとアレですが、なんか露骨な結果が出ました。





WKWebViewの方は裏でキャッシュとかを共通化してるのかな…？
因みに、最初の表示まではWKWebViewの方が遅かったです。
UIWebViewは表示された後じわじわ増えていく感じでした。
スクロールしたり別のページ読ませたりしてないのでちょっと眉唾な結果ですが、少なくともこの条件下では最適化されたパフォーマンスになってるみたいです。
vimコマンド備忘録

先人さまのVim講座たちから、自分が知らなかったものだけを抜粋しています。ありがとうございます。「覚えた？」は個人的なチェックフラグです。

##カーソル移動（ページ内）
|機能|コマンド|覚えた？|
|---|---|---|
|先頭行へジャンプ|gg|覚えたよ|
|画面の先頭行へジャンプ|H|覚えたよ|
|画面の中央行へジャンプ|M|覚えたよ|
|画面の最終行へジャンプ|L|覚えたよ|
|現在行の先頭文字へジャンプ|^|覚えたよ|
|現在行の先頭へジャンプ|0|覚えたよ|

##カーソル移動（行内）
|機能|コマンド|覚えた？|
|---|---|---|
|単語の先頭へジャンプ<BR>（進む/戻る）|W / B||
|行の先頭文字へジャンプ+挿入|I|覚えたよ|
|行末へジャンプ＋挿入|A|覚えたよ|

##編集
|機能|コマンド|覚えた？|
|---|---|---|
|現在行のインデント自動調整|==||
|リドゥ|\<Ctrl>+r|覚えたよ|
|カーソル行を削除+挿入|S||
|カーソル位置～行末を削除 + 挿入|C||
|"xxx"のxxxを削除|di"||
|"xxx"のxxxを削除 → 挿入モード|ci"||
|カーソル位置の単語を削除（後続スペース含めて）|daw||
|カーソル位置の単語を削除|diw||
|カーソル位置の単語を削除（後続スペース含めて） + 挿入|caw||
|カーソル位置の単語を削除 + 挿入|ciw||
|空行で区切られたカーソル位置のパラグラフを下の空行も含めて削除|dap||
|カーソル行より以下を全削除|dG|覚えたよ|
|全行削除|ggdG|覚えたよ|

##カーソル移動キーとの組合せ
|機能|コマンド|覚えた？|
|---|---|---|
|現在行と直下の行を削除|dj||
|現在行と直上の行を削除|dk||

##検索
|機能|コマンド|覚えた？|
|---|---|---|
|一括置換|:%s/old/new/g|覚えたよ|
|カーソル下の単語のハイライト|\*|覚えたよ|
|検索文字列のハイライト|:set hlsearch||
|ハイライトの解除|:noh(l)||

##終了
|機能|コマンド|覚えた？|
|---|---|---|
|保存終了|ZZ|覚えたよ|

##ウィンドウ分割
|機能|コマンド|覚えた？|
|---|---|---|
|左右に分割|\<c-w\>v||
|ウィンドウを移動|\<c-w\>w||
|現在のウィンドウを閉じる|\<c-w\>c||
|ウィンドウを入替える|\<c-w\>x||
|現在のウィンドウ以外をすべて閉じる|:only||

##その他
|機能|コマンド|覚えた？|
|---|---|---|
|カレントファイル名を<br>ステータスラインに表示|\<Ctrl>+g|覚えた|
gitでシンプルなデプロイ環境を作る

gitで最低限のデプロイ環境を作る際のメモ。
いろいろなCIツールを使うまでもない、小規模なコンパイルいらずのWebアプリのデプロイ環境を作る。
CIツールを使う場合でも基礎となる知識なので整理しておく。

###やりたいこと

* ローカルで開発。
* リモートにpush
* pushを拾って、公開ディレクトリにpull

###イメージ
図で書くとこんな感じ。
![git01](http://www.bluecode.jp/qiita/git01.png)
今回は、独自のリモートリポジトリを使うが、ここがGitHubとかでもいい。

###前提条件

* ローカル、リモートにgitがインストールされていること（Mac想定）
* リモート（サーバ）にはsshで透過ログインできること

###手順

まずは、push,pullの流れを手動でやってみる。

####リモートリポジトリの用意（リモート）
とりあえず、外からは非公開かつ、チームがアクセスできるディレクトリを用意し、リモートリポジトリにする。

```bash
cd /var/www
sudo mkdir test.git
cd test.git
git init --bare
```
必要に応じて、適切なグループ権限等を設定する。通常はチームメンバーに対する書き込み権限が必要でしょう。みんなに共有する場合は、

```bash
git init --bare --shared
```

とかのほうが早い。

####ローカルの作業場の作成とリモートの登録

まずは、作業フォルダとpushするテストファイルを作っておきます。

```bash
mkdir test
cd test
git init
echo "hello" > index.html
git add .
git commit -m "1st commit"
```
commitしたものが無いとエラーになるのでコミットしておきます。

リモートリポジトリを登録するには、

```bash
git remote add origin ssh://servername/var/www/test.git
```
とする。前提でも書きましたがが、sshログインができることが前提です。

####とりえずpushしてみる
とりあえず、pushできるかやってみます。

```bash
git push origin master
```
エラーが出たなら対処します。

####とりあえずpull(clone)してみる。
最初は、リモートリポジトリも何も登録されていないのでcloneしてみます。

```bash
cd /var/www/html
git clone /var/www/test.git test
```
ブラウザでアクセスしてみると、

hello

と表示されている。
あとは、pushをhookして、自動的にpullするようにすれば良い。

####リモートサーバからのclone
上記の例では、ローカル経由でcloneしたが、通常は、リモートリポジトリと最終デプロイ先であるサーバは分離されていることが普通である。その場合、

```bash
git clone ssh://username@servername/var/www/test.git
```
という書式でcloneすればいい。このとき、もちろんサーバ間でsshログインできるよう鍵の設定が必要である。

###自動化してみる

自動化は、pushを検知して、それをトリガーにして、pullを実行する。

>パスフレーズ有りのssh鍵を使う場合は、自動化の中にpassphrase入力自動化のロジックが必要になり面倒です。ssh-agent,sshpass等を使うか、passphrase無しの鍵を使うのが無難です。

####パスフレーズを要求しないようにする

鍵をいじれる環境なら、

```bash
cd ~/.ssh
mv id_rsa id_rsa.old
openssl rsa -in id_rsa.old id_rsa
chmod 600 id_rsa
```
とする。

####リモートリポジトリのpost-receiveを設定する

リモートリポジトリには、各種イベントをhookして、スクリプトを実行する仕組みがあります。pushを検知して何かをやるには、post-receiveというのを定義します。

```bash
cd /var/www/test.git/hooks
vi post-receive
```
で、post-receiveファイルを定義します。

```bash:post-receive
#!/bin/sh

cd /var/www/html/test
git --git-dir=.git pull
```

としします。デプロイ先のディレクトリに移動し、そこでgit pullをします。ただ、書き方は上記の用に少し特殊。
CIツールは、このシェルスクリプトが巨大化したものだと思っていていいだろう。

post-receiveファイルは実行形式でる必要があるので、

```bash
chmod a+x post-receive
```

として実行権限を与える。ちゃんと動くか、

```bash
./post-receive
```
などとして単独で実行してみる。動くようなら、あとは一連の動きを試す。

###一連の動きを試してみる

最初にローカルで作ったindex.htmlを編集し、add, commit, pushをしています。

```bash
#編集
git add .
git commit -m "hoge"
git push origin master
```

リモートサーバ上のファイルが更新されていればOKです。

本番サーバがある場合にも、本番サーバのDocument rootでpull(clone)すればいいでしょう。
以上。

###パーミッションについて

チームで開発する場合、メンバーに適切なパーミッションを付与する必要がある。気をつけるのは、

1.リモートリポジトリに対する権限
2.デプロイ先対する権限

の２つ。

1.の場合、

> error: insufficient permission for adding an object to repository database ./objects

とか言われる。これは、--sharedにしておけば解決できる。

2.の場合、

>error: cannot open /var/www/html/test/.git/FETCH_HEAD: Permission denied

などと言われる。

どちらも、メンバーが所属するグループを作成し、該当のフォルダ、ファイルに対して、

```bash
chgrp -R groupname dir
chmod -R g+w dir
```

などとすればいい。


###メモ

####リモートリポジトリの確認

```bash
git remote
```

リポジトリ等の内容の確認

```bash
git config -l
```

リモートリポジトリの削除

```bash
git remote rm origin
```
などとする。
golangで日付(Month)

golangで日付を作る際のMonthのメモ。

整数直書きはOK.

~~~ go
package main

import (
	"fmt"
	"time"
)

func main() {
	d := time.Date(2015, 7, 1, 0, 0, 0, 0, time.UTC)
	fmt.Println(d) // 2015-07-01 00:00:00 +0000 UTC
}
~~~

int型の変数に入れて渡すとtime.Month型で渡せと言われる。

~~~ go
	m := 7
	d := time.Date(2015, m, 1, 0, 0, 0, 0, time.UTC)
	fmt.Println(d) // エラー cannot use m (type int) as type time.Month in argument to time.Date
~~~

time.Month型にCastして渡す。

~~~ go
	m := 7
	d := time.Date(2015, time.Month(m), 1, 0, 0, 0, 0, time.UTC)
	fmt.Println(d) // 2015-07-01 00:00:00 +0000 UTC
~~~

time.Month型を直接書くとこんなん。

~~~ go
	d := time.Date(2015, time.July, 1, 0, 0, 0, 0, time.UTC)
	fmt.Println(d) // 2015-07-01 00:00:00 +0000 UTC
~~~

ソース見たらこんな感じで定義されてる。

~~~ go
// A Month specifies a month of the year (January = 1, ...).
    77	type Month int
    78	
    79	const (
    80		January Month = 1 + iota
    81		February
    82		March
    83		April
    84		May
    85		June
    86		July
    87		August
    88		September
    89		October
    90		November
    91		December
    92	)
~~~

https://golang.org/src/time/time.go
Erlangでの一様正規分布リストの生成

# 概要
モンテカルロシミュレーションを行う際に必要となる平均0,標準偏差1の一様正規分布乱数をN個並べたリストをErlangで生成する関数のメモ。

# Source
```erlang:ndist.erl
-module(ndist).
-export([gen/1]).

%% Box-Muller変換関数
%% とりあえず簡易的にcosのみ。cosをsinに変えたものを使って2系統の生成が可能。
bm(X,Y) when is_number(X),is_number(Y) ->
  math:sqrt(-2.0 * math:log(X)) * math:cos(2 * math:pi() * Y).

%% 必要な数の要素を作成
seq(N) when is_integer(N) ->
  [A * random:uniform() || A <- lists:duplicate(N,1)].

%% 乱数生成
gen(N) when is_integer(N) ->
  random:seed(now()),
  [bm(X,Y) || {X,Y} <- lists:zip(seq(N),seq(N))];
gen(_N) ->
  false.

```

# 使い方
```shell-session
$ erl
> c(ndist).                 # => {ok,ndist}
> ndist:gen(100).           # => [0.12345,0.3214,-2.134...]
> s * (ndist:gen(100) + m)  # => 平均値m、標準偏差sの一様正規分布乱数を生成する場合
```
Rubyで手軽にサブコマンド + オプションを実装

##概要

Rubyで手軽に
　`<script> <sub-command> [options...]`
というような書式のLinux/Unixコマンドラインプログラムを作る方法を覚え書きします。

ちなみに、NWテスト用ツールの作成の過程で検討・採用した方法です。
同ツール群もご覧いただければ幸いです。
　https://github.com/YohKmb/nwutils


##流れ

当記事では、以下の処理について記載します。

    1. ARGVの冒頭引数の摘出
    2. optparseモジュールの略式オプション解釈を利用
    3. サブコマンド毎の必須オプションに不足がないかの検証

----

<br>

####1. ARGVの冒頭引数の摘出

これ以降は、下記のURLのプログラムを例にとって、上で列挙した「流れ」について、順に説明します。
　https://github.com/YohKmb/nwutils/blob/master/multiping/multping

まず、プログラムで採用するサブコマンドと、それぞれの必須オプションをHash定数として定義します。

`SUBCMDS = {"add" => "va", "del" => "", "ping" => "tl", "help" => ""}`

次に、プログラム引数配列ARGVから冒頭の要素を取り出してサブコマンドとして扱います。

```ruby:
cmd = ARGV.shift
```
<br>

####2. optparseモジュールの略式オプション解釈を利用

次いで、残りの引数をオプション引数として解釈します。

```ruby:
require "optparse"

# （・・・中略・・・）

params = ARGV.getopts("v:b:a:t:x:g:s:l:Th", "l3", "no-log", "help")
```

サブコマンドと引数が得られたこの時点で、helpの表示の必要有無を判断しても良いでしょう。

```rb
def _help(exit_status)

  print USAGE
  exit(exit_status)
  
end

# （・・・中略・・・）

_help(0) if cmd == "help" or cmd == "-h" or params["h"] or params["help"]
```

####3. サブコマンド毎の必須オプションに不足がないかの検証

最初に定義した`{<サブコマンド> : <必須オプション>}`のマッピングのHash定数を利用して、オプション検証を行います。

なお、デフォルト値によるパラメータ初期化は、これに先んじて実施すると良いと思います。

```ruby
def _validate_opts(params, subcmd)

  musts = SUBCMDS[subcmd]

  res = musts != "" ?
    musts.each_char.map do |must| not params[must].nil? end :
    [true]
    
  if not res.all?
    puts "Error : Some needed parameter are ignored"
    puts
    _help(1)
  end

end

# （・・・中略・・・）

if !SUBCMDS.keys.include?(cmd)
  puts "Error : Invalid subcommand"
  puts
  _help(1)
end

_validate_opts(params, cmd)
```

----



###余談

普段、RubyよりもPythonに慣れているため、当方のソースコードにはRubyistの方から見れば至らないコーディングもあるかと存じます。

ただ、誰かしらお困りの方の参考になれば幸いです。
Mercurial でコミットメッセージを編集せずに amend する

# Mercurial でコミットメッセージを編集せずに amend する

Mercurial では ```hg commit --amend``` で直前のコミットのやり直し（上書き）をすることができます。
わりと頻繁に使っていますが、通常の commit と同様にコミットメッセージを書くようにエディタが起動します。
amend するということは、コミットメッセージを変えるようなコミットではないはずなので、コミットメッセージを変更しないことが大半です。
しばらく自分で悩んでいましたが、解決策を教えていただいたので共有します。

## 解決策 1: 拡張の evolve を有効にして amend を使えるようにする
evolve の説明は [ChangesetEvolution - Mercurial](http://mercurial.selenic.com/wiki/ChangesetEvolution) , [Changeset Evolution with Mercurial — evolve extension for Mercurial](http://www.gerg.ca/evolve/index.html) などで。
まだ正式版ではないのでご注意ください。
私は、これを機に使い始めました。

hgrc に設定を書いて

```
[extensions]
evolve =
```

```
hg amend
```
と使えるようになります。

## 解決策 2: リターンコードを常に 0 で返すコマンドをエディタとして一時的に使用する

コマンドラインオプションでエディタの変更ができるので、リターンコードを常に 0 で返すコマンドを指定してやると、コミットメッセージの変更が完了したと認識してくれます。
Windows の場合は type などはいかがでしょう？　コミットメッセージを表示して amend が完了します。

```
hg --config ui.editor=type commit --amend
```

楽に実行できるように、hgrc の alias に登録しておきます。

```
[alias]
amend = ! %HG% --config ui.editor=type commit --amend
```

以上。
Xperia SO-03E のAndroidバージョンをあげてみた（Android4.1.2→4.4）

親から不要になったAndroidタブレットを貰ったのだが、Android4.1.2以上アップデートできなかったので色々調べてやってみた。

#はじめに
◆パソコン
Windows 7 64bit

◆タブレット
Sony Xperia SO-03E
事前にDOCOMO行ってSIMロック解除しました。

#PCの準備
##PC Companionのインストール
事前にしっかりバックアップを取っておきましょう。
http://www.sonymobile.co.jp/support/software/pcc/2.3/

##Flashtoolのインストール
こやつを使ってAndroidのUpdateをします。
http://www.flashtool.net/index.php

インストールして起動するとエラーが出ます。
表示されたメッセージに従い、ファイルのコピーを行います。
以下のフォルダの中身をコピーしてください。

C:\Flashtool\firmwares
↓
C:\Users\［ログインユーザ名］\.flashTool\firmwares

コピーが完了したら、「C:\Flashtool\firmwares」を名前変更します。

##ドコモROMの作成
Flashtoolを起動します。

「Devices」→「Check Updates」→「SGP3XX Sony Xperia Tablet Z」→「SO-03E」
と選択していきます。「SO-03E」をダブルクリックするとダウンロードが始まります。

しばらく放置すると画面が表示されるので、全て選択して「Create」を実行します。

私がやってみたときはすでにドコモROMが出来ていたので、本手順は不要でした。

#Android4.4を導入する
##グローバル版のROM作成
「Devices」→「Check Updates」→「SGP3XX Sony Xperia Tablet Z」→「SGP321」と選択します。「Customized CE1」をダブルクリックし、ダウンロードの完了を待ちます。

ドコモROMと同様にダウンロードが完了すると画面が表示されるので、リストの中全てを選択して「Create」を実行します。

##グローバル版ROMの書き込み
雷マークのボタンをクリックし、ポップアップ画面が表示されたら「Flashmode」を選択します。

「GSP321」を選択します。ここでWipeの「APPSLOG」「CACHE」「DATA」にチェックを入れます。Excludeで「Partition」「TA」「BASEBAND」にチェックを入れます。
「Flash」をクリックします。

しばらくすると、携帯の絵の画面が出てきます。

電源ボタン＋ヴォリューム上を何回か押して電源を切ります。

電源が切れたことを確認し、ヴォリュームの下ボタンを押しながらUSBケーブルをつなぎます。

エラーが出ずにバーーーっと流れれば大丈夫です。

#参考したサイト
http://scrapbook.mintgreen.biz/archives/2230/comment-page-1
http://win-droid.blogspot.jp/2013/04/xperia-tablet-z-so-03e-root.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14139142954
http://b00111.blogspot.jp/2013/01/rootsimxperia-usb.html
[Parse.com] 簡単にRoleにUserを追加する


![_Role___Parse.png](https://qiita-image-store.s3.amazonaws.com/0/40758/17214f7c-a014-f6c1-10f3-a7632d40a5c1.png)

2015/05/16時点、Parse.comのDataBrowser（管理画面）ではRoleにユーザを追加できないようです。

Parse.comのREST APIドキュメントを利用することで簡単に追加する方法を紹介します。

↓[Parse.comのドキュメントページ](https://parse.com/docs/rest/guide/#roles-updating-roles)
![REST_API_Developers_Guide___Parse.png](https://qiita-image-store.s3.amazonaws.com/0/40758/52877d9c-0832-0ba6-1b24-40bb19473698.png)

1. 下記URL（Parseのドキュメント）にアクセスする。
<br/>https://parse.com/docs/rest/guide/#roles-updating-roles
2. 対象のアプリケーションを選び、表示されたコマンドをテキストエディタなどにコピペする。
3. Roleに追加したいユーザのobjectIdを入力。
4. 対象RoleのobjectIdを入力。
5. ターミナルにコピペ（curlコマンドが実行される）。

ユーザでなくロールを追加する（ロールにロールを追加する）場合は、`className` を `_Role` にするとできると思います。

※Windowsでcurlコマンドがインストールされていない場合は↓から。
http://curl.haxx.se/download.html
Canvasアニメーションの要点

#はじめに
いまさらですがHTML5 Canvasの勉強をはじめました。
Canvas APIを使ったアニメーションの実装は、`jQuery animate()`や`css3 keyframes`といったものとは考え方が異なります。はじめて調べた時には結構戸惑ったので、同じような方のためにメモしたいと思います。

#アニメーション = 再描画
Canvasでは便利なアニメーションメソッドはなく、単純に**描画自体を繰り返す**ことでアニメーションを実現させます。イメージとしては、パラパラまんがのように画面自体が次々と差し替わっていくようなものでしょうか。

#アニメーションサンプル
![canvas-anim.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/1f8dce84-23b0-abb0-f19c-c65b7731225e.gif)

> なお↓ページで実際の動きを確認できます
> http://nekoneko-wanwan.github.io/demo/canvas/animation/


#Canvasアニメーションの手順
ざっくりと以下のような流れになります

1. 要素を削除
1. 要素を描画
1. 要素を動かす（動かす位置座標を再定義）
1. 終了フラグが無ければ1.へ戻る

## サンプルコード
```index.html
<canvas id="myCanvas" width="100" height="100"></canvas>
```
```script.js
function drawLoopSquare() {
    /* Canvas要素の定義など */
    var cs  = document.getElementById('myCanvas');
    var ctx = cs.getContext('2d');
    var w = cs.width;
    var h = cs.height;
    var x = 0;

    /* 描画フロー */
    function render() {
        // Canvas全体をクリア
        ctx.clearRect(0, 0, w, h);

        // 要素を描画する
        ctx.beginPath();
        ctx.strokeRect(x, 0, 10, 10);

        // 要素を動かす
        // 四角形のx座標がCanvasの横幅を超えたら初期位置(x座標を0)へ
        // そうでなければ、x座標を1増やす
        if (x > cs.width) {
            x = 0;
        } else {
            x += 1;
        }

        // このrender関数を繰り返す
        // 下記どちらかを使った場合は、外側でrender()を実行する※1（もしくは即時実行）
        // setTimeout(render, 100);
        // requestAnimationFrame(render);
    }
    /* ※1 */
    // render();

    /* render()関数を繰り返す */
    /* setTimeout、requestAnimationFrameではなく、setIntervalを使う場合 */
    setInterval(render, 100);
}
drawLoopSquare();
```

再描画を行うためのループメソッドとして、

- setInterval()
- setTimeout()
- requestAnimationFrame()

がよく使用されます。それぞれ以下のように使い分けることができます。

- 決まった時間でループを行ないたい: `setInterval(), setTimeout()`
- 描画負荷を抑えたい・なるべくヌルヌルさせたい: `requestAnimationFrame()`

## requestAnimationFrame()について
requestAnimationFrame()は高速でCPUにやさしいですが、未対応ブラウザも存在します。
対応するためのpolyfillは以下になります。

```javascript
window.requestAnimFrame = (function() {
  return (
      window.requestAnimationFrame       || 
      window.webkitRequestAnimationFrame || 
      window.mozRequestAnimationFrame    || 
      window.oRequestAnimationFrame      || 
      window.msRequestAnimationFrame     || 
      function(callback, time) {
        var time = time ? time: 1000 / 60;
        window.setTimeout(callback, time);
    }
  );
})();
```

またrequestAnimationFrameはグローバルなため、場合によってはbindでthisを束縛してやる必要があります。

```javascript
{
    update: function() {
        // 座標を変更する処理など
    },
    draw: function() {
        // 要素を描画する処理など
    },
    render: function() {
        this.update();
        this.draw();
        requestAnimationFrame(this.render.bind(this));  // 引数にthisを使うためにbind
    }
}
```

#おわりに
まだまだ分かっていないことばかりなので、不正確なところがあればコメントや編集リクエストをお願いします

#追記: 2015年5月19日
Canvasイベントについて別途記事を書きました。
http://qiita.com/nekoneko-wanwan/items/9af7fb34d0fb7f9fc870)
Ninety-Nine Scala Problems奮闘記3

# P3 Find the Kth element of a list.
再帰処理の練習が続く。
今度は指定された番号の要素を取り出す。
以下は模範解答のソースコード。

```scala:suggestedAnswer.scala
  def nthRecursive[A](n: Int, ls: List[A]): A = (n, ls) match {
    case (0, h :: _   ) => h
    case (n, _ :: tail) => nthRecursive(n - 1, tail)
    case (_, Nil      ) => throw new NoSuchElementException
  }
```

# P04 Find the number of elements of a list.
これも再帰処理。
自分で書いたコードは以下。

```scala:myAnswer.scala
  def myAnswer[A] (ls: List[A]) : Int = ls match {
    case h::Nil => {
      len += 1
      return len
    }
    case _::tail => {
      len += 1
      myAnswer(tail)
    }
    case _ => throw new NoSuchElementException
  }

  def suggestedAnswer1[A] (ls: List[A]): Int = ls match {
    case Nil => 0
    case _::tail => 1 + suggestedAnswer1(tail)
  }
```
途中インクリメントを書こうとしたらコンパイルエラーが出てびっくりした。ら、Scalaではインクリメントができないらしい。
なぜなら、Scalaではすべてのものをオブジェクトとするから。
詳しいことは『[scalaでは、なぜインクリメントやデクリメントができないのか？ - scalaとか・・・](http://d.hatena.ne.jp/xuwei/20110130/1296360331)』を読ませていただいた。

あと、コードが美しくなかった。

###参考
- [P03 Find the Kth element of a list.](http://aperiodic.net/phil/scala/s-99/p03.scala)
- [P04 Find the number of elements of a list.](http://aperiodic.net/phil/scala/s-99/p04.scala)
- [scalaでは、なぜインクリメントやデクリメントができないのか？ - scalaとか・・・](http://d.hatena.ne.jp/xuwei/20110130/1296360331)
javascriptメモ

## 関数についてメモ

### 無名関数とは
関数はデータ型なので、直接代入することができる
関数名がいらない

~~~javasctipt
var hello = function(name) {
}
~~~

### 即時関数とは
定義した後にすぐ実行させたいときとかに使用する
関数名がいらない
変数をローカル変数として使用したいときに便利

~~~javascript
function hello() {
  ...
}
hello();
~~~

~~~javascript
(function() {
  ...
})();
~~~

## タイマー処理についてメモ

|関数名|説明|
|:--|:--|
|setInterval|一定時間ごとにある処理を繰り返し実行|
|setTimeout|一定時間ごとにある処理を実行|

### setInterval
前の処理が終わったかを確認せずに実行する
処理が重いとクラッシュする

~~~javascript
var i = 0;
function show() {
  console.log(i++);
}
setInterval(function() {
  show();
}, 1000);
~~~

### setTimeout
前の処理が終わったかを確認してから実行する
繰り返し処理にはこちらが最適

~~~javascript
setTimeout(function() {
  show();
}, 1000);
~~~

setTimeoutを繰り返し処理にするには、show()を再帰的に呼び出す必要がある

~~~javascript
var i = 0;
function show() {
  console.log(i++);
  setTimeout(function() {
    show();
  },1000);
}
show(); //最初の一回だけ呼び出す
~~~

setTimeoutを止めるには？

~~~javascript
var tid = setTimeout(function() {
  show();
},1000);
if(i > 3) {
  clearTimeout(tid);
}
~~~

## オブジェクトについてメモ

|用語|説明|
|:--|:--|
|オブジェクト|ハッシュのこと|
|プロパティ|keyとvalueのセット|

### 表記法
ふたつの書き方がある

~~~javascript
user["email"] == user.email
~~~

### 関数をうめこんでみる
プロパティに関数が使える

~~~javascript
{
  "user": {
    "greet": function() {
      ...
    }
  }
}

user.greet("Tom");
~~~

### thisの使い方
thisは、オブジェクトを指す

~~~javascript
user.email == this.email
~~~

## 組み込みオブジェクトについてメモ

* String
* Array
* Math
* Date

### String

~~~javascript
var s = new String("Tom"); // var s = "Tom";

s.length // 文字数を返す
s.replace("T", "r") // Tをrに置き換える
~~~

### Array

~~~javascript
var a = new Array(100, 200, 300); // var a = [100, 200, 300]

a.length // 配列の数を返す
a.push(500) // 末尾に追加
~~~

### Math

~~~javascript
Math.PI // 円周率
Math.ceil(5.3) // 切り上げ
Math.floor(5.3) // 切り捨て
Math.round(5.3) // 四捨五入
~~~

### Date

~~~javascript
var d = new Date(); // 現在時刻
var d = new Date(2014, 1, 1, 10, 20, 30); // 2014年1月1日10時20分30秒

d.getFullYear(); // 年を返す
d.getMonth(); // 月を返す
d.getTime(); // 1970年1月1日からの経過ミリ秒を返す
~~~

## DOM操作についてメモ

HTMLやXMLを操作するためのAPIをDOM(Document Object Model)と言う
windowオブジェクトのdocumentプロパティに対して処理を行う

### windowオブジェクト

#### windowオブジェクトとは
javascriptに標準で用意されているオブジェクトのこと
例えば`console.log()`や`alert()`は、windowオブジェクトのプロパティである
（windowは省略できる）

#### windowオブジェクトの中身を見てみる

~~~javascript
console.dir(window); // windowオブジェクトの中身が表示される
~~~

#### windowsオブジェクトのプロパティ
たくさんある
その中にdocumentプロパティが存在する

### DOM操作をしてみる
#### 要素の書き換え

~~~javascript
var e = document.getElementByID("msg");

e.textContent = "hello"; // 文字の置き換え
e.style.color = "red"; // 文字色の変更
e.className = "myStyle"; // クラスを適用する
~~~

#### 要素の生成

~~~javascript
var greet = document.createElement("p");
text = document.createTextNode("hello world");

document.body.appendChild(greet).appendChild(text);
~~~
Ninety-Nine Scala Problems奮闘記2

# P02 Find the last but one element of a list.
P01とほぼ同じ問題。パターンマッチの方法が少し変わっただけ。
でもおかげでP01でよく分かっていなかった以下のことが腹落ちした。
## Listの再帰処理とcons。
コロンが2つついてるのはcons。
consはリスト分解を行っていて、『[+:と:+でSeqに対してパターンマッチ](http://d.hatena.ne.jp/Kazuhira/20140218/1392735277)』で書いてあったコードによると

```scala:sample.scala
case one :: rest => println(s"matched!! one[$one], rest[$rest]")
```

で、リストを戦闘要素oneとその残りの要素のListであるrestに分解できる。
## パターンマッチでのアンダースコア

```scala:sample.scala
case _ :: tail => lastRecursive(tail)
```

は、何らかの1文字の先頭要素と、その後ろに1つ以上要素のあるListがある場合にマッチする。
## 型パラメータ
Javaでいう総称型。任意の名前のジェネリクスを作成し、インスタンス化する時に中身を指定することができる。

これにはJavaよりもはるかに柔軟な設定を行うことができて、その詳細はf81氏の『[第21章：Scalaの型パラメータ - Qiita](http://qiita.com/f81@github/items/7a664df8f4b87d86e5d8)』にあるとおり。

## 参考
- [Scalaのコレクション入門 - seratch's weblog in Japanese](http://seratch.hatenablog.jp/entry/20110429/1304072372)
- [+:と:+でSeqに対してパターンマッチ](http://d.hatena.ne.jp/Kazuhira/20140218/1392735277)
- [第21章：Scalaの型パラメータ - Qiita](http://qiita.com/f81@github/items/7a664df8f4b87d86e5d8)
[*その他*] プログラミング学習Webサービスまとめ


# はじめに
プログラミング関連が勉強できるサイトを調べていたらたくさんあったのでまとめました。
特に好みのサービスについては表にまとめました。

# 学べる技術対応表
まとめている内にジャンル分けがよくわからなくなりましたが大体以下のようなことが学べます。

|               |[CodeSchool](https://www.codeschool.com/)|[Progate](http://prog-8.com/)|[Schoo](https://schoo.jp/)  |[ドットインストール](http://dotinstall.com/)|[Codecademy](http://www.codecademy.com/learn)|
|:---|:--:|:--:|:--:|:--:|:--:|:--:| 
|HTML|●|●|●|●|●|
|CSS|●|●|●|●|●|
|デザイン|●||●|||
|JavaScript|●||●|●|●|
|jQuery|●|●|●|●|●|
|Angular.js|●|||●|●|
|Ember.js|●|||||
|Backbone.js|●|||●||
|Node.js|●|||●||
|Express.js|●|||●||
|enchant.js||||●||
|CoffeeScript|●|||●||
|Bootstrap|●||●|●||
|WordPress|||●|●||
|Sass|●||●|●||
|Ruby|●|●|●|●|●|
|Ruby on Rails|●||●|●|●|
|RSpec|●|||●||
|Objective-C|●|||●||
|Swift|||●|●||
|iOS|●||●|●||
|Android|||●|●||
|アプリ開発|||●|●||
|PHP||●|●|●|●|
|R|●|||●||
|Java||||●||
|Python||||●|●|
|Google Apps Script||||●||
|Scratch||||●||
|Git|●||●|●||
|Vagrant||||●||
|Chef||||●||
|データベース|●||●|●||
|API|●||●|●|●|
|Linux|||●|●||
|Amazon Web Service|||●|●||
|Unity|||●|●||
|Heroku||||●||
|Sinatra||||●||
|Excel VBA||||●||

# 対応表のサービス詳細

|サービス名|説明|
|:--|:--|
|[CodeSchool](https://www.codeschool.com/)|基本的にはWebサイト上で指示にしたがってポチポチとプログラミングできる形式です。動画などを見ながら問題と解いたりします。基礎的な部分は無料版でいけると思いますが面白そうなのは大体有料です。月額3000円強くらいかかるのでなかなか高いですが使わない期間はサブスクリプションを停止したりはできます。海外のサービスなので英語が全くわからないときついかもしれません。|
|[Progate](http://prog-8.com/)|日本語&無料なので安心です。ただ初心者向けな感じなので入門的にはよいですが、ある程度基礎が分かっている方には物足りないと思います。Ruby on Railsのコースが将来的にできるみたいです。|
|[Schoo](https://schoo.jp/)|生放送と録画の動画で学べる日本のWebサービスです。ここは表でまとめられないくらい色んな分野の動画があるのでおすすめです。月額は前は525円でしたが現在は980円となっています。無料版でも生放送は見放題ですが、録画授業が月に1つしか見れません。|
|[ドットインストール](http://dotinstall.com/)|大体主な言語とかはここにあるってくらいにいろんなものが学べるWebサービスです。これも対応表にまとめきれませんでした。無料版でも十分学べますが、有料にするともっとレベルの高いものを学べるようです。|
|[Codecademy](http://www.codecademy.com/learn)|こちらもWeb上でポチポチプログラミングができます。これも全部英語です。お金を払わなくても勉強できます。|

# その他の勉強できるサイト一覧

* [Dash](https://dash.generalassemb.ly/)･･･HTML/CSS/JavaScriptなどが学べる。
* [CODEPREP](https://codeprep.jp/)･･･HTML/CSS/JavaScriptなどが学べる。
* [Shere Wis](http://share-wis.com/)･･･プログラミング、英語、簿記、仕事スキルなど色々ある。
* [Code 9leap](http://code.9leap.net/)･･･enchant.jsでHTML5/JavaScriptプログラミングができる。
* [lynda.com](http://www.lynda.com/default.aspx)･･･Web、デザイン、3Dアニメーションなど色々ある。
* [CodeStudy](http://jeek.jp/study/exp)･･･JavaScriptが学べる。今後その他の言語に対応予定らしい。
* [ミニツク](http://www.minituku.net/)･･･Ruby、Ruby on Railが学べる。Ruby技術者認定試験対策もある。
* [プログラミン](http://www.mext.go.jp/programin/)･･･子供向け。
* [Google Blockly](https://developers.google.com/blockly/)･･･Googleが提供しているプログラミングをビジュアル的に学べるもの。子供向け？
* [Khan Academy](https://www.khanacademy.org/)･･･数学系のことが中心っぽいけどプログラミングコースみたいなのもある。
* [Code Avengers](http://www.codeavengers.com/) ･･･Webページ作ったり、Webアプリ作ったり、ゲーム作ったりが学べるみたい。
* [TheCodePlayer](http://thecodeplayer.com/) ･･･HTML/CSS/JavaScriptなどが学べる。
* [udemy](https://www.udemy.com/jp/)･･･英語とかプログラミングとか色々あるみたいです。
* [typing.io](https://typing.io/)･･･Objective-C、Railsなどなど色々コースがあるみたいです。

# 最後に
調べていたらもっとたくさん色々学習系サイトは多いみたいで、びっくりです。
全部まとめきれなかったのでこのへんで終わり。