OmniAICreator/Qiita-1.07M huggingface dataset:
sourceからbuildして最新のJuliaをMacで使う話


Juliaは高い頻度で更新が行われており、User GroupやIssuesでも「Updateしたら速くなった」的な話もされていることがあります。

ここでは、"Nightly builds"じゃダメだ！もっと新しいものをくれ！って人のために
Juliaをsourceからbuildしてdmgを作成する方法を紹介します。

## 方法
作業ディレクトリは各々の環境に合わせて変更して頂ければ幸いです。

### 各種必要なもののダウンロード/インストール

#### gccのインストール

```sh
brew install gcc
```

#### Platypus command line toolsのインストール

ダウンロードは[こちら](http://www.sveinbjorn.org/platypus)から

```sh
cd ~/Downloads
unzip platypus.zip
./Platypus-4.8/Platypus.app/Contents/Resources/InstallCommandLineTool.sh
rm -rf Platypus-4.8 platypus.zip
```


#### リポジトリをclone



```sh
cd ~
git clone https://github.com/JuliaLang/julia.git
```

#### Winstonのインストール

```sh
julia
julia> Pkg.add("Winston")
cp -r ~/.julia/v0.3/Cairo ~/.julia/v0.3/Tk ~/julia/contrib/mac/app
```

### make

```sh
cd ~/julia/contrib/mac/app/
sudo make
```

#### SuiteSparseのダウンロードが失敗する場合
非常にダウンロード速度が遅く、`404 Not Found`になる場合があります。

```
curl: (22) The requested URL returned error: 404 Not Found
make[5]: *** [SuiteSparse-4.4.1.tar.gz] Error 22
make[4]: *** [julia-release] Error 2
make[3]: *** [release] Error 2
make[2]: *** [install] Error 2
make[1]: *** [dist] Error 2
make: *** [dmg] Error 2
```

リポジトリをcloneして回避します。

```sh
cd ~
git clone https://github.com/jluttine/suitesparse.git
tar czvf SuiteSparse-4.4.1.tar.gz ~/suitesparse
sudo rm ~/julia/deps/SuiteSparse-4.4.1.tar.gz
mv SuiteSparse-4.4.1.tar.gz ~/julia/deps
```

このままだとCheck Sumを通過しないので書き換えます。

```sh
cd ~/julia/deps
mv checksums/SuiteSparse-4.4.1.tar.gz/sha512 checksums/SuiteSparse-4.4.1.tar.gz/sha512_OLD
shasum -a 512 SuiteSparse-4.4.1.tar.gz | cut -f 1 -d ' ' > checksums/SuiteSparse-4.4.1.tar.gz/sha512
```

成功すると`~/julia/contrib/mac/app/`に`Julia-0.4.0-dev-310986771a.dmg`のようなdmgが作成されます。

## で、肝心の速さは？

```python:Julia-0.3.4-Current_Release
% time ./julia -e 'println("hello")'
hello
./julia -e 'println("hello")'  0.50s user 0.11s system 130% cpu 0.468 total
```

```python:Julia-0.4.0-dev-b4fc1867d0-Nightly_builds
% time ./julia -e 'println("hello")'
hello
./julia -e 'println("hello")'  0.18s user 0.10s system 59% cpu 0.480 total
```

```python:Julia-0.4.0-dev-310986771a
% time ./julia -e 'println("hello")'
hello
./julia -e 'println("hello")'  4.26s user 0.14s system 103% cpu 4.252 total
```

まぁこんなこともあるよねってことで。
VineLinux6.2で、NetBeansでデバッグ実行するためにやったことメモ

### 1.XDebugのインストール

PeclでXDebugをインストールします
`#pecl install xdebug`
ここでmakeコマンドがありません、とエラーが出た場合、以下でmakeをインストールします。
`#apt-get install build-essential`

### 2.php.iniの編集
XDebugをインストールした際、以下のようなメッセージが出るのでそれに従い、php.iniを編集する。
`You should add "zend_extension=/usr/lib64/php5/xdebug.so" to php.ini`

上記のパスにしたがって、zend_extensionのパラメータに与える。

```
[XDebug]
zend_extension = ***
xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_mode=req
xdebug.idekey=”netbeans-xdebug”
```

### 参考
Xampp + NetBeans8でX-Debugを使う方法 | はろさんはろさん、聞いてください。 http://blog.kcmservice.biz/?p=2388
勉強会を継続するために気をつけていること



Gunosyではデータマイニングやその関連技術に関する勉強会を開催しています．

http://gunosy-dm.connpass.com/

創業メンバーが大学院の修論が終わった辺からはじめて，これまで91回開催してきました．
当初毎週だったものを隔週へ頻度は減りましたがまもなくはじめてから3年になろうとしています．

このエントリでは3年間運営を続けるにあたって学んだこと・今気をつけていることをまとめたいと思います．
社内勉強会を運営している，もしくはこれから開催したいと思っている方の参考に慣れば幸いです．


## 自分の好きなことをやる

一番大事なことですね．
みんなが興味あるかとかを考えてテーマを選ぶより，主催する自分が好きなテーマを選びましょう．
勉強会を継続することは大変なので，モチベーションはなるべく自分の中にもって置かないとどこかで挫折するきっかけになるなぁと思います．
発表者が見つからない時や，都合がつかなくなってしまった時に代打でリカバリーしたり
質問がなかなかでないで議論が盛り上がらない時に口火を切ったりするのも主催の役目ですので
自分が好きであることは重要だと思います．

## 仲間を見つける

自分が好きなことをやるとはいえ，やっぱり１人で頑張るのは大変です．
社内勉強会なんて必須ではないですから，最初のうちはみんな予定を明けてくれるものの，
徐々にMTG入れたり飲み会入れたりして人がどんどん減っていきます．
こういう時でもちゃんと来てくれる仲間が社内外に1,2人でもいれば心強いです．
2人でも勉強会になります．1人は辛いです．

## 人を集めるために頑張らない

くるもの拒まず．さるもの追わず，
人を増やすためにどうするかとか考えていると運営するのはさらに大変になります．
一時期人を増やそうと頑張っていた時期もありましたが今はやめました．
自分の好きなことで，それを好きな仲間を何人か見つけたらあとは頑張らずにゆるゆると進めましょう．
興味のある人はそれでも見つけて来てくれるはずです．


## たまに外部の人に来てもらう

毎回いろんな人をブッキングしたりするのは辛いですが，
数ヶ月に一度ぐらいは外部の人に来てもらってまとまった発表をしてもらったりしています．
視点の違う発表は刺激になりますし，議論も盛り上がりますし
その次の回以降の勉強会のネタにもなります．


## 無理はしない

好きなことをやるのと同じぐらい大事なことです．
無理して頑張ることが続けることに対して一番よくないことです．
きつくなったなと思ったら時間をずらしてみたり，間隔を開けてみたり，一回の分量を減らしてみたりと無理をしないで出来る方法を考えてみましょう


## 最後に

まとめると，自分の好きなことをムリしないでやりましょうっていうただそれだけなのですが
勉強会をやろうって始めた当初はかなり肩肘張っていて
気合をいれて毎回かなりの量の輪読範囲や，気合の入った資料作りをしてしまって
結果疲れてしまった上、参加者も徐々に減っていって悩んだりもしました．
それでも続けて来られたのは、やっぱり自分が好きだったことといい意味で適当にやるようになったからだと思います．
今後もだらだらと続けていくと思いますので，興味のある方は是非ご参加ください
Chef-Zeroを使ってみる。


オレオレプロジェクトでChef-Zeroを使ってみる。knife-zero経由が楽そうなのでその方針で。
Mac(Yosemite)でやる。gemでインストールした古いChef/Knife環境があったのでアンインストール。

対象のサーバはVagrantで立ててある。


# 下準備
## 1. ChefDKを入れる

https://downloads.chef.io/chef-dk/ からインストール

chef使うときはChefDKのruby環境を使うようにする。

```bash
eval "$(chef shell-init zsh)"
```


## 2. knife-zeroを入れる

```bash
chef gem install knife-zero
mkdir .chef
echo 'local_mode true' > .chef/knife.rb
```

## 3. vagrant up

適当にVagrantfile作って`vagrant up`しておく。
Vagrantでprovisionはしない。本番環境作るときはどうせchef/knife使うのと、環境固まったら`vagrant package`するので。

```bash
vagrant ssh-config >> ~/.ssh/config
```
してssh楽に


# zeroる
## 4. knife zero bootstrap

```bash
knife environment create development
knife zero bootstrap default -x vagrant --sudo -E development
```


## 5. knife zero chef_client

chef_clientで管理下のnode(1個だけど...)を更新

```bash
knife zero chef_client 'chef_environment:development' -a hostname -x vagrant
```

`chef_client`する時のattributes(-a)がhostnameで良いのか不安。あとattributesを省略する方法は無いのかしら？


# 参考
http://qiita.com/sawanoboly/items/4f363909615d8a76e9e5
TwitterAPI のURL補完 snippetファイル作った


statuses/update とか users/show とか毎回打ち込んだりコピペは面倒なので


こちら補完用 snippet ファイル
https://gist.github.com/elzzup/9d5e2725356f94419513

ちなみにこちら snippet フィイル生成したPHPスクリプト

```php:generate_snippets.php
<?php
/*
 * TwitterAPI1.1 url snippets 生成
 */
require_once('./simple_html_dom.php');

/*【保存版】TwitterAPI1.1 REST API 全項目解説 | DX.univ */
$url = 'http://dx.24-7.co.jp/twitterapi1-1-rest-api/';

$html = file_get_html($url);
foreach ($html->find('tr') as $tr) {
    if (!$tr->find('td', 0) || !($tr->find('td', 0)->find('a'))) {
        continue;
    }
    list($td1, $td_disc) = $tr->find('td');
    list($method, $query_base) = explode(' ', $td1->find('a', 0)->innertext);
    $query = $query_base;
    $discription = $td_disc->innertext;
echo <<<EOF
snippet     $query
abbr        $discription
options     word
    $query_base\n\n
EOF;
}
```

VIMで使いたいならば
twitter.snip を ~/.vim/snippets に入れて
補完したいfiletype のフォルダからリンクを貼るなりすれば

```shell-session
<<< hiro@arch~/.vim/snippets
>>> cd php
php.snip*  php_functions.snip*
<<< hiro@arch~/.vim/snippets/php
>>> ln ../twitter.snip ./ 
`./twitter.snip' => `../twitter.snip'
```

![blog.png](https://qiita-image-store.s3.amazonaws.com/0/40717/07e8f982-ba69-18a5-e54f-8d852282c683.png)

こんな感じで使える
tableView delegate/dataSourceを別ファイルにする場合のコツ


#目的:
　ViewControllerの肥大化抑制するため、tableViewのdelegate/dataSourceを別ファイルにします。そこで結構はまったので簡単にまとめておきます。

#環境:
　Xcode 6.1.1
#実装概要:
　StoryboardでtableViewを設置しておきます。delegate/dataSourceは別ファイルで実装します。ViewController内では実装しません。選択されたCellの中身はNotificationCenterで必要なところで拾うようにしておきます。
#ソースコードと詳細説明:
　単純にdelegate/dataSourceを別ファイルで実装する場合は以下のようにして置き場問題ないです。

>self.tableView.delegate = self.tableSource
>self.tableView.dataSource = self.tableSource

　tableSourceはdelegateとdataSourceを実装している別インスタンスで、別ファイルとなります。ここで重要なのは、そのばでインスタンスを作ってはいけないということです。optional関連のErrorがでます。
つまりどういうことかというと、

>let tableSource = TableSource()　--- Optional関連のErrorが発生する
>self.tableView.delegate = self.tableSource
>self.tableView.dataSource = self.tableSource

とすることです。
　回避策は以下のようにすると大丈夫でした。

```sample.swift

import UIKit

class ViewController: UIViewController,
                    UITextFieldDelegate{

    // --- Outlets ---
    // MARK: Outlets
    @IBOutlet weak var tableView: UITableView!
    
    
    // --- Properties ---
    // MARK: Properties
    private var tableSource:tableSource!

	//　いろいろな処理

	self.tableSource = tableSource() // initialize
	self.tableView.delegate = self.tableSource
	self.tableView.dataSource = self.tableSource

```

色々ためした結果このスタイルに落ち着きました。
何か他によい方法があったら教えてください。
pythonの正規表現、strとunicodeで地味にハマるやつ

```python
    """
    日本語文字列に対して正規表現であてるときは
    日本語文字列の文字列クラス(strかunicode)と、正規表現の文字列クラスを合わせる必要がある
    例) re.match([ここがunicodeなら], [ここもunicode])
    """

    str_japanese = '3マナのクリーチャー'
    unicode_japanese = u'３マナのクリーチャー'

    match = re.search('マナ', str_japanese)
    if match:
        print "strに対して正規表現にuフラグなしであてる"

    match = re.search(u'マナ', str_japanese)
    if match:
        print "strに対して正規表現にuフラグつけてあてる"

    match = re.search('マナ', unicode_japanese)
    if match:
        print "unicodeに対して正規表現にuフラグなしであてる"

    match = re.search(u'マナ', unicode_japanese)
    if match:
        print "unicodeに対して正規表現にuフラグつけてあてる"


    # ちなみにrフラグはstr扱い

    match = re.search(r'マナ', str_japanese)
    if match:
        print "strに対して正規表現にrフラグであてる"

    match = re.search(r'マナ', unicode_japanese)
    if match:
        print "unicodeに対して正規表現にrフラグであてる"


    """
    出力 (ちゃんとマッチしたところだけprintされる)

    >>> strに対して正規表現にuフラグなしであてる
    >>> unicodeに対して正規表現にuフラグつけてあてる
    >>> strに対して正規表現にrフラグであてる
    """
DartのMixin

Mixinについて大分混乱したのでメモ。

Dartのクラス
--
Dartのクラスには２種類ある。
1. 普通のクラス（`class`）
2. 抽象クラス（`abstract class`）
抽象クラスは全てのメソッドに実装を与える必要がないが、newによるインスタンス生成ができない。

Dartの継承
--
Dartの継承には２種類ある。
1. `extends`による継承
2. `implements`による継承
`extends`は継承元のインターフェースと実装を全て継承先に引き継ぐ。普通継承といえばこれ。あるクラスが`extends`できるのは一つのクラスだけ。
`implements`は継承元のインターフェースを全て継承先に引き継ぐ。継承先からは継承元の実装を使うことができない。あるクラスから複数のクラスを`implements`できる。
どちらも継承元の型を継承先の型で置き換えることができる。つまり、継承先の型は継承元の型のサブクラスになっている。

Mixin
--
DartにはMixin（クラスの合成）という機構がある。
Mixinは指定したクラスからインターフェースと実装を引き継ぐ（`extends`による継承と同じ）。
`extends`と異なるのは、あるクラスから複数のクラスをMixinできるということ。
しかし、Mixinされる（インターフェースと実装を提供する）側のクラスはObject以外から**実装**を継承することができない。
ここがミソで、Mixinされるクラスでもインターフェースはいくらでも継承できる。
したがって、Mixinされることを目的としたクラスで（型の観点から）親クラスを持ちたい場合は`implements`による継承をすれば良い。

```dart
class A {
  void hoge() => print('A');
}

// BはAのインターフェースのみを継承する
abstract class B implements A {
  void foo() => print('foo');
}

// CはBの実装とインターフェースを継承するが、
// BではA.hogeの実装が与えられていないので
// Cでhogeの実装を与える必要がある。
class C extends Object with B {
  void hoge() => print('C');
}

main() {
  C c = new C();
  c.hoge(); // => 'C'  Aの実装は使えない
  c.foo(); // => 'foo'  Bの実装は使える

  A a = c; // CはAのサブクラスとして扱われる
  B b = c; // CはBのサブクラスとして扱われる
}
```

参考：[Dartのクラス継承、Implicit Interface、Mix-inについて](http://qiita.com/t_hara/items/11555bd3720912bb0ccc)
angularJS で使う翻訳フィルターモジュール

作りました。
https://github.com/amo12937/angular.amo.module.translator

以下 README のコピペ

# angular.amo.module.translator

多言語対応のための翻訳フィルターを提供する

# インストール方法
```
bower install -S angular.amo.module.translator
```

# 使い方

## translatorCollectionProvider
翻訳フィルターは複数登録することが出来る。
これは、通常の翻訳とは別に、例えば font awesome などのアイコンに対してキーを割り当てるのに使うためである。
翻訳フィルターは config の段階で登録しておく必要がある。

## フィルターの登録
```coffee
angular.module "yourApp", ["amo.module.translator"]
.config ["amo.module.translator.translatorCollectionProvider", (provider) ->
  provider.registerTranslator "trans"
  provider.registerTranslator "icon"
]
```

## 翻訳情報の登録
フィルターを使用する前に、翻訳情報を登録する必要がある。

```coffee
angular.module "yourApp"
.run ["amo.module.translator.translatorCollection", (tc) ->
  transRule =
    "Hello %name% !": "こんにちは、%name% さん！" 
    "This is sample text.": "これはサンプルテキストです。" 
  translator = tc.getTranslator "trans"
  translator.setRule transRule

  iconRule =
    Home: '<i class="fa fa-home"></i>'
    Profile: '<i class="fa fa-star-o"></i>'
    Help: '<i class="fa fa-question"></i>'
  iconTranslator = tc.getTranslator "icon"
  iconTranslator.setRule iconRule
]
```

外部ファイルを使う場合は routeProvider の resolve を使うと良い。

## フィルターの使用
フィルターは以下のようにしてテンプレート上で使用できる。

```haml
.menu
  .button {{ "Home"|icon }}
  .button {{ "Profile"|icon }}
  .button {{ "Help"|icon }}
%ul
  %li {{ "Hello %name% !"|trans: {"name": "hoge" }}
  %li {{ "This is sample text."|trans }}
```

## controller 内などでの使用
getTranslator で取得した translator はそれ自身が関数となっており、
フィルターと同じように使うことが出来る。

```coffee
angular.module "yourApp"
.controller "someController", ["amo.module.translator.translatorCollection", (tc) ->
  translator = tc.getTranslator "trans"
  translatedText = translator "This is sample text"
]
```
decltypeとtype traits

みなさんあけましておめでとうございます。

あけましておめでとうございますって言われた時にありがとうって返すのはやめてあげてくださいw

前回はスフィネとかSTLについて書いていったわけですが、今日も深淵なC++のトピックを書いていきたいと思います。

#decltype
http://qiita.com/rinse_/items/3c9030f4af33b6bbc53a
ここにすでに書かれていますが、**式を引数にして型が返却されます**C++11以降の機能ですが、要はこういう風に使います。

```decltype1.cpp
#include <iostream>
using namespace std;
int main() {
    auto a = 10;
    //aの型によって違うベクトルを作りたい...
    vector<decltype(a)> v;
}
```

```decltype2.cpp
#include <iostream>
using namespace std;

struct B {
    int b;
};

struct D {
   int d;
};

//返り値型がaに合わせて変化してほしい...
//Bも受け取れるし、Dの場合もある...
auto test(const B& a) -> decltype(a) {
    return a;
}
int main() {
    B b_instance;
    D d_instance;
    test(b_instance);
    test(d_instance);
}
```

この例だと普通に型引数入れれば良さそうなもんですが、動的に型が変わる場合を想定すると、このdecltypeは大変強力です。
autoの補助みたいな使い方をすることが大部分な気がしますが、型を返却するっていうのは結構面白いです。

#type traits (型特性メタ関数)

type traitsとは型特性の事を言いますが、型特性メタ関数とは、**型の特徴を調べたり、その特徴を操作する関数**です。具体例を見てみると

``` has_iterator.cpp
#include <iostream>
#include <vector>
#include <type_traits>

using namespace std;

struct Has_iterator_impl {

    //型引数がイテレータを持っていればTrue型
    template <class T>
    static true_type check(typename T::iterator*);
    
    //それ以外ならFalse型
    template <class T>
    static false_type check(...);
};

template <class T>
class Has_iterator : public decltype(Has_iterator_impl::check<T>(nullptr)){};

int main() {
    static_assert(has_iterator<vector<int>>::value,
    "イテレータ持っています");
    
    static_assert(!has_iterator<int>::value,
    "イテレータ持っていません");
}
```

コードがめちゃめちゃ複雑な気がしますが、SFINAEとdecltypeを理解していればさほど難しい動作はしていません。ここで実はtype_traitsヘッダを使っていますが、ここには型特性における関数をいろいろ入っています。true_type, false_typeなどはその典型で、**true_type::valueがtrue false_type::valueがfalse**となるメタクラスです。
次に、decltypeを見ると、ここにはvectorまたはintが渡されています。継承元のcheck関数には何も引数に渡しませんが、代わりに型引数を渡します。
そして、ここでSFINAEが起き、**渡された型でtypename T::iterator*が宣言できる場合は宣言し、そうでなければそれ以外の宣言を行います**それぞれの場合でtrue_typeを継承するのか、false_typeを継承するのかが決定されます。

これでできることはiteratorを持っていた場合はiteratorも用いてループ処理を行い、そうでない場合は通常のfor_eachで行う、繰り返し不能の場合はstaticにアサーションを出す

といったことができます。
さらに応用させると、特定の演算子がオーバーロードされているか、特定の機能が実装済みか否かなどを判定するメタ関数を作成することができます。

ここでのミソは以下の3点だと思います。

+ decltypeは型を返す関数で、継承宣言にも使える
+ SFINAEで置き換え失敗の処理は可変長引数...を用いる
+ type_traitsにはtrue_type, false_typeなど、メタ関数作成ツールがる

#STLメタ関数

実は、ここまで書いたことはすでにSTLに実装済みです。ここではSTLに初めから組み込まれている特性メタ関数を紹介します。

```type_traits.cpp
is_void       //型がvoidか否か判定する
is_empty      //要素が空かどうか判定する
is_class      //型がクラスか組み込みか判定する
is_abstract   //型が抽象クラスか否か判定する
is_assignable //+演算子が定義されているか判定する
enable_if     //可能なら...何かする
```
特にこの中のenable_ifは技巧的で、SFINAEの集大成と言えそうです。可能なら特定の処理を行い、不可能なら別の処理をする。というのが一発で実装できます。

他にもいろんなtype_traitsがあるのでメタプログラマは一通り目を通すといいかもしれません。

http://www.cplusplus.com/reference/type_traits/enable_if/
4. Ionicでアイコン、スプラッシュスクリーン編 - 新年だし、ハイブリッドスマートフォンアプリ開発

Mac OSX環境で、スマートフォンアプリ開発初心者が、Cordova(PhoneGap)と、AngularJSベースのIonic Frameworkを使い、JavaScriptでiPhone/ Android両対応のネイティブ+HTML5 ハイブリッドモバイルアプリを開発し、iTunes App StoreおよびGoogle Playで公開するまでを何稿かに分けてカバーします。


1. [Cordova(PhoneGap)準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/b51c2cb30f0eaac7af38)
1. [Ionic Framework準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/9da383359eef860a3704)
1. [Ionic Creator Beta入門](http://qiita.com/tomo_makes/items/9ab474f4240ca9cda8db)
1. [Ionicでアイコン、スプラッシュスクリーン](http://qiita.com/tomo_makes/items/045180a4b14e37650b9e)
1. [IonicでAndroid開発準備](http://qiita.com/tomo_makes/items/e3990ea1e369935f1b8f)
1. -随時追加予定-


## アイコンとスプラッシュスクリーンを設定する

下記のポストに沿って進めます。最新(14年12月時点)のCordovaでの、アイコンとスプラッシュスクリーンの変更方法が解説されています。icon, splashタグの新設で手軽になったようです。

New Icons and Splash Screen Help for Cordova/PhoneGap Apps : Devgirl's Weblog : http://devgirl.org/2014/09/29/new-icons-and-splash-screen-help-for-cordovaphonegap/

####アイコンを設定する

`img/`フォルダ直下に`icon.png`を準備します。

`<preference>`タグ直前に下記タグを挿入します。

```xml:config.xml
<icon src="img/icon.png" platform="ios”/>
```

####スプラッシュスクリーンを設定する

`img/`フォルダ直下に`splash.png`を準備します。

`<preference>`タグ直前に下記タグを挿入します。

```xml:config.xml
<platform name="ios">
  <splash src="img/splash.png" width="320" height="480"/>
</platform>
```

####ビルドし、動作を確認
下記コマンドでiPhone Emulatorを起動し、アイコンが差し替わったことを確認できます。

```shell-session
$ ionic build ios
$ ionic emulate ios
```

ただし、このタグでは`platform/ios/<app name>/Resources/icons` および `/splash`にファイルが生成される。しかし、splashはDefault-iphoneのみ生成され他は差し替わっていませんでした。


####様々な解像度の画像が必要

下記にある通り、画像はそれぞれ必要なサイズを準備する必要があります。
アプリ開発に必要な画像サイズ【iPhone6対応】 | Sawalog : http://www.sawadaru.com/blog/?p=1086


####楽に画像を準備する
AlexDisler氏が、アイコン、スプラッシュスクリーンそれぞれを、十分な解像度の画像から自動生成するnode.jsプラグインを提供しています。

- AlexDisler/cordova-icon : https://github.com/AlexDisler/cordova-icon
- AlexDisler/cordova-splash : https://github.com/AlexDisler/cordova-splash

#####インストール

```shell-session
$ sudo npm install cordova-icon -g
$ sudo npm install cordova-splash -g
```

#####実行

rootにicon.png, splash.png(2208 x 2208)を格納した上で下記を実行します。

```shell-session
$ cordova-icon
$ cordova-splash
```

実行結果イメージ
![BB61EA82-5652-4654-8CDF-F61E8B504D75.png](https://qiita-image-store.s3.amazonaws.com/0/64608/c3a76411-dfca-1ff0-c168-e3a94b4a4fe8.png)

設定により、ビルド時の自動実行化も可能です。詳細は著者Githubを参照。


### その他
Ionic公式ブログで下記記事が出ました。(1/6/2015)
Automating Icons and Splash Screens : http://ionicframework.com/blog/automating-icons-and-splash-screens/
Apache Spark - GC overhead limit exceeded の対処方法

Sparkで大きなファイルを処理する際などに「java.lang.OutOfMemoryError: GC overhead limit exceeded」が発生する場合があります。
この際の対処方法をいかに記述します

# GC overhead limit exceededとは

簡単にいうと

* GCが処理時間全体の98%以上を占める
* GCによって確保されたHeapが2%以下

の場合に発生します
潜在的なメモリリークに対応するため追加されたもののようですね

# 対応策1: 該当機能をOFFにする

一番簡単な方法は該当機能をOFFにすることです
/spark/conf配下にspark-defaults.conf.templateというファイルがあるので、これをspark-defaults.confにリネームします
（macユーザの方はFinder上でリネームするだけではなく、エディタで別名保存してくださいね）

そしてconf内に以下の文字列を加えてください

```text:spark-defaults.conf
spark.executor.extraJavaOptions  -XX:-UseGCOverheadLimit
```

これによりJVMに該当オプションがわたり機能が無効化されます

# 対応策2: Heapを増やす

対応策1で該当機能をOFFにしましたが、これでは根本解決にはなっていません
そのためHeapを増やしたいと思います

JVMのHeapを増やしたいのであればオプションで渡すだけだから、上記Keyでいいのでは？と思いますがManualにはこんな記述があります

```text:
Note that it is illegal to set Spark properties or heap size settings with this option.（中略） Heap size settings can be set with spark.executor.memory.
```

というわけでここに指摘のあるspark.executor.memoryを増やしてあげましょう

```text:spark-defaults.conf
spark.executor.memory  2g
```

これで解決です

ちなみにtemplate内にあるspark.driver.memoryですが、これはdriverプロセスに割り当てるものです
どちらもdefaultは512mなので合わせてあげると良いかと思います
3. Ionic Creator Beta入門編 - 新年だし、ハイブリッドスマートフォンアプリ開発環境を準備する

Mac OSX環境で、スマートフォンアプリ開発初心者が、Cordova(PhoneGap)と、AngularJSベースのIonic Frameworkを使い、JavaScriptでiPhone/ Android両対応のネイティブ+HTML5 ハイブリッドモバイルアプリを開発し、iTunes App StoreおよびGoogle Playで公開するまでを何稿かに分けてカバーします。


1. [Cordova(PhoneGap)準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/b51c2cb30f0eaac7af38)
1. [Ionic Framework準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/9da383359eef860a3704)
1. [Ionic Creator Beta入門](http://qiita.com/tomo_makes/items/9ab474f4240ca9cda8db)
1. [Ionicでアイコン、スプラッシュスクリーン](http://qiita.com/tomo_makes/items/045180a4b14e37650b9e)
1. [IonicでAndroid開発準備](http://qiita.com/tomo_makes/items/e3990ea1e369935f1b8f)
1. -随時追加予定-


# Ionic Creator BetaでUIを作る

Ionic Creatorは、ブラウザ上で、ドラッグ・アンド・ドロップでスマートフォンUIを組み立てるツールです。ベータ版が14年12月、つい先日公開されました。UIの枠を簡単に作り、View部分のコードを得ることができます。簡易な紙芝居系アプリなら、ほぼIonic Creatorだけで作りきれるかもしれません。以下使い方を解説します。

## Ionic Creator Betaを試用する
下記URLからアカウントを作成します。
https://creator.ionic.io/app/login?didUserLogOut=true

サインアップ、ログイン画面
![9C3099A7-76FF-494C-8D4F-F853A7BF7376.png](https://qiita-image-store.s3.amazonaws.com/0/64608/79c573ca-0a1f-c420-01fa-2ee84029fee1.png)


## 利用の流れ（例）
サインアップが完了、ログインすると、下記のような流れで開発を進めます。

1. アプリの名称などを決め、デザイン開始
1. 左上で新規画面を作成する
1. 左下パレットからUIコンポーネントを選ぶ
1. Drag+Dropで中央の画面に配置する
1. 右ペインでUI部品の属性を変える
1. 右上のToggleスイッチをTESTに切替え、テストモードに移行する
1. 上メニューバー左のボタンから、Save、Exportする

![839D0697-D55D-4A18-B672-11C7FF767A55.png](https://qiita-image-store.s3.amazonaws.com/0/64608/14e6715c-694e-efbe-8ec6-bc15c2500894.png)


## 使えるUI部品の一覧

2015年1月1日時点、下記が使えます。
![0E2E8A71-F526-410A-9FDB-B0E16B28C138.png](https://qiita-image-store.s3.amazonaws.com/0/64608/b620a7f1-152e-7649-48b2-f88541c41630.png)


## プロジェクトをローカルに複製する
現状はWeb上でできることには限りがあります。作り終わった構成を、ローカルの開発環境に複製し、継続開発します。
メニューバーExportから、Ionic CLIを選択すると下記画面になります。
表示されるコマンドをそのまま打つと、同じ画面構成を持つプロジェクトをローカルに複製できます。
ただし、1回目からこのポストをフォローしている方は、既にCordova, Ionicをインストール済みですから、npm install以下の一行目は飛ばして下さい。
![7640AFD0-98F4-432D-85D4-CE879BDA1AC7.png](https://qiita-image-store.s3.amazonaws.com/0/64608/6907b83e-2c08-6ab1-86c3-5d0725df1274.png)


ガイダンスにある通り、cdコマンドでカレントディレクトリをプロジェクトをフォルダに移します。下記コマンドで、ブラウザを使って簡易動作確認をします。

```shell-session
$ ionic serve
```

シミュレータを使って確認したい場合のコマンドは前回と同じです。

```shell-session
$ ionic platform add ios
$ ionic build ios
$ ionic emulate ios
```

##留意点
現バージョンのIonic Creator(14年12月時点)は、controllerや、複数のtemplateがindex.html1ファイルにまとめて格納されています。そのまま開発を進めることはできますが、見通しを良くするためファイルを分ける等を考えても良いでしょう。

こちらの投稿が参考になります。
[Qiita : AngularJS - Angular.jsのディレクトリ構成のベストプラクティスを探る](http://qiita.com/n0bisuke/items/6a79d3ee63020f771260)
2. Ionic Framework準備、iOSエミュレータまで - 新年だし、Mac OSXでハイブリッドアプリ開発環境を準備する

Mac OSX環境で、スマートフォンアプリ開発初心者が、Cordova(PhoneGap)と、AngularJSベースのIonic Frameworkを使い、JavaScriptでiPhone/ Android両対応のネイティブ+HTML5 ハイブリッドモバイルアプリを開発し、iTunes App StoreおよびGoogle Playで公開するまでを何稿かに分けてカバーします。


1. [Cordova(PhoneGap)準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/b51c2cb30f0eaac7af38)
1. [Ionic Framework準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/9da383359eef860a3704)
1. [Ionic Creator Beta入門](http://qiita.com/tomo_makes/items/9ab474f4240ca9cda8db)
1. [Ionicでアイコン、スプラッシュスクリーン](http://qiita.com/tomo_makes/items/045180a4b14e37650b9e)
1. [IonicでAndroid開発準備](http://qiita.com/tomo_makes/items/e3990ea1e369935f1b8f)
1. -随時追加予定-


##事前準備

下記を事前にインストールしておきます。

- XCode6
- node.js
- Cordova

前ポストをご参照下さい。
Mac OSX環境でCordova(PhoneGap)開発環境を準備する - Qiita : http://qiita.com/tomo_makes/items/b51c2cb30f0eaac7af38　

##Ionic概要

Cordovaだけでもアプリ開発をはじめることができますが、ここではもうワンステップ環境構築を進めます。ここではJavaScriptのMVC FrameworkであるAngularJSをベースに、スマートフォンアプリ開発用のCSS/ JavaScriptライブラリを提供する、Ionic開発環境を準備します。

Ionic Framework概要としては、英語ですがこの動画([Building Mobile Applications with Ionic - YouTube](https://www.youtube.com/watch?v=bzmujVzTXXk))がよくまとまっています。または下記記事を参照下さい。余談ながら、先ごろ(14年11月のThe Ionic Show@YouTube)設立者はIonicをFrameworkからSDKへ位置付けてゆくと宣言しています。

- Oiita: Ionic Frameworkの導入(http://qiita.com/daikon_buu/items/a3bfe4c9334fac0e745a)
- Qiita: Ionic frameworkでiOSとAndroidアプリを両方エミュレーターで立ち上げるまで(http://qiita.com/imaimiami/items/94fee7397bb026968a8e)
- Qiita: The Ionic Bookで覚えるIonicの使い方(http://qiita.com/tyoshikawa1106/items/cec9e893cb7449ba9ce7)
- キミはionicを知っているか？AngularJS+PhoneGap+美麗コンポーネント群！(http://html5experts.jp/canidoweb/7359/)
- Yoemanを使う事例　http://qiita.com/pugiemonn/items/744032601c728dbbe7b4

## 環境のセットアップ

ionicをnode.jsのパッケージとして追加します。（install -g cordova ionicとしてCordovaと一括インストールすることもできます。）

```shell-session
$ npm install -g ionic
```

実行ディレクトリ直下にmyFirstIonicフォルダが作成され、その下にtabsテンプレートでアプリを作成します。

```shell-session
$ ionic start myFirstIonic tabs
``` 

すぐにブラウザで簡易的に動作を確認できます。index.html等を書き換えると、内容がリアルタイムで反映され便利です。

```shell-session
$ ionic serve
```

開発プラットフォームとして、iosを指定します。このあたりのコマンドはCordovaと同様です。androidも指定できます。

```shell-session
$ ionic platform add ios
```

アプリをios用にビルドし、実行します。

```shell-session
$ ionic build ios
$ ionic emulate ios
```

Cordovaの前回と同じく、iOSエミュレータが立ち上がり、サンプルアプリ画面が立ち上がれば成功です。
これでIonicを使った開発環境が整いました。

##余談
開発者自らがIonicの現状やこれからについて語るThe Ionic Showは、これからの方向性を知る上で面白いです。Episode 4では彼らはWeb上でUI構築ができるIonic Creatorおよびハイブリッドアプリ用MBaaSであるIonic.ioを次の開発のプライオリティに据えています。(14年12月現在) 表情の硬い初回エピソードと比べると、4回目で喋りもこなれてきています。(笑)

The Ionic Show // Episode 1 // July 2014 - YouTube : https://www.youtube.com/watch?v=uJAWaE11Jf4
The Ionic Show // Episode 4 // Oct-Nov 2014 - YouTube : https://www.youtube.com/watch?v=wyVM1evRxNw
konsoleでのSKK入力

KDEのkonsoleでSKKを使って入力していると、▽や▼が曖昧幅文字なので、表示が欠けたりします。

ソースからコンパイルできるなら、

```diff
diff --git a/src/konsole_wcwidth.cpp b/src/konsole_wcwidth.cpp
index c946d16..a59586b 100644
--- a/src/konsole_wcwidth.cpp
+++ b/src/konsole_wcwidth.cpp
@@ -201,7 +201,7 @@ int KONSOLEPRIVATE_EXPORT konsole_wcwidth(quint16 oucs)
     return 1 +
            (ucs >= 0x1100 &&
             (ucs <= 0x115f ||                    /* Hangul Jamo init. consonants */
-             ucs == 0x2329 || ucs == 0x232a ||
+             ucs == 0x2329 || ucs == 0x232a || ucs == 0x25bd || ucs == 0x25bc ||
              (ucs >= 0x2e80 && ucs <= 0xa4cf &&
               ucs != 0x303f) ||                  /* CJK ... Yi */
              (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
```

というふうに強引に▽と▼だけ幅を2とするように対応させてみました。

また気になる曖昧幅文字が出てきたら、追加して対応すればよいかなと思っています。
日本語版のmanページをMacで開く(groffアップデート)

#groff Fatal error
先日「[vimをアップデートすると同時にHomebrew管理に移行する](http://qiita.com/yu-ichiro/items/c9db44671701e7f485af)」という投稿をしたんですが、その後vimのmanページを開こうとすると、

```zsh:Terminal
$ man vim
/usr/bin/groff: can't find `DESC' file
/usr/bin/groff:fatal error: invalid device `nippon'
```

何やら出てきて怒られてしまいました。
突然manが見られなくなったと思ったらgroffとか言う謎のコマンドがエラーを吐く。

#原因
参考： [jmanを使わずにMacのmanを日本語化する方法](http://tukaikta.blog135.fc2.com/blog-entry-224.html)

どうやらvimをインストールした時、ありがたいことに日本語版のmanをインストールしていただいたようで、賢いman君は$LANGから最適な言語を探し、`man vim`を実行すると自動的に日本語版を見つけてくれるようになりました。

ただし、ここで問題が。manが最適なページを探し、それを整形して表示するために、groffを使うのですが、標準にインストールされているものは日本語に対応していません。

その証拠に、`env LANG=C man vim`を実行すれば英語版が普通に表示されました。
なのでmanを実行するとき強制的に英語版を表示するようにすれば一応表示問題は解決です。

日本語版manとかダサい。英語の勉強も兼ねてるんで。翻訳は信用出来ない。っていう方々は、お使いのshellのrcファイルに
`alias man='env LANG=C man'`
の一行を足せば万事解決です。

#日本語版manをMacで読めるようにする
でも、せっかく日本語manをインストールしていただけたのですし、ないことにするのは少しもったいない気がします。
そこで新しいgroffをインストールし、日本語版のmanを読めるようにします。

#brew install groff

~~Homebrewのdupesリポジトリには標準でインストールされているコマンドの"dupes"、同じもののHomebrew版が用意されています。
その中に目的のgroffも含まれているので、`brew tap homebrew/dupes`を実行し、リポジトリを追加します。~~
追記：いつしかのHomebrewメジャーアップデートでHomebrew公式が運営しているtapは基本的にhomebrew-coreに吸収されたらしいです。幸いgroffは吸収も生き残ってそのままインストールできました。

そして、`brew install groff`！
インストールが終わった後、`where groff`をして`/usr/local/bin/groff`が表示されていることを確認しましょう。

#man.conf

あとはmanに新しい方のgroffを使うように設定すればOKです！
manの設定は/etc/man.confにあるので、
`$ sudo vim /etc/man.conf`
で編集します。

95行目付近に`JNROFF`から始まる行があるので、

```diff:/etc/man.conf
- JNROFF /usr/bin/groff -Tnippon -mandocj -c
+ JNROFF /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E
```

上のものから下のものに置き換えましょう。

次に105~106行目付近の`PAGER`、`BROWSER`それぞれを

```diff:/etc/man.conf
- PAGER           /usr/bin/less -is
+ PAGER           /usr/bin/less -isr
- BROWSER         /usr/bin/less -is
+ BROWSER         /usr/bin/less -isr
```
このように末尾に`r`を付け足し完了です！

### 追記：
コメントでいただきましたが、
アップデートの度に/etc/man.confが上書きされるらしく？毎回これをすることになるらしいので簡単なpatchを、、

```zsh:patch.zsh
PROFILE=~/.zprofile  # 自分が使うシェルのprofileに変更

cp /etc/man.conf ~/.man.conf
sed -i -e 's/^JNROFF\(.*\)\/.*$/JNROFF\1\/usr\/local\/bin\/groff -Dutf8 -Tutf8 -mandoc -mja -E/' ~/.man.conf
sed -i -e 's/^\(PAGER.*\)/\1r/' ~/.man.conf
sed -i -e 's/^\(BROWSER.*\)/\1r/' ~/.man.conf
echo 'alias man="man -C ~/.man.conf"' >> $PROFILE
```

#確認

さて用意が出来たので、`man vim`など、日本語版のmanが用意されているコマンドを見てみましょう。

```zsh:Terminal
VIM(1)               General Commands Manual                VIM(1)

名前
       vim - Vi IMproved, プログラマのテキストエディタ

書式
       vim [options] [file ..]
       vim [options] -
       vim [options] -t tag
       vim [options] -q [errorfile]

       ex
       view
       gvim gview evim eview
       rvim rview rgvim rgview

```

バッチリですね！


#あとがき

特定のmanファイルだけ見れないことが今までもあったのですが、深く考えてなかったです。。

#追記(2020/02/02)

こんな古い記事でもいまだに需要があるようで、、ありがたいです。
古い情報になっている部分を変更しました。
いまだにmac標準インストールのman, groffではこの問題が解決されていないみたいですね、、
1. Cordova(PhoneGap)準備、iOSエミュレータ起動まで - 新年だし、ハイブリッドアプリ開発環境を準備する

Mac OSX環境で、スマートフォンアプリ開発初心者が、Cordova(PhoneGap)と、AngularJSベースのIonic Frameworkを使い、JavaScriptでiPhone/ Android両対応のネイティブ+HTML5 ハイブリッドモバイルアプリを開発し、iTunes App StoreおよびGoogle Playで公開するまでを何稿かに分けてカバーします。

1. [Cordova(PhoneGap)準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/b51c2cb30f0eaac7af38)
1. [Ionic Framework準備、iOSエミュレータ起動まで](http://qiita.com/tomo_makes/items/9da383359eef860a3704)
1. [Ionic Creator Beta入門](http://qiita.com/tomo_makes/items/9ab474f4240ca9cda8db)
1. [Ionicでアイコン、スプラッシュスクリーン](http://qiita.com/tomo_makes/items/045180a4b14e37650b9e)
1. [IonicでAndroid開発準備](http://qiita.com/tomo_makes/items/e3990ea1e369935f1b8f)
1. -随時追加予定-

ではまず、Cordova(PhoneGap)から。

# Cordova開発環境を整える

##事前準備

####XCode最新版

予め、Mac用のIDE（統合開発環境）であるXcode最新版をインストールします。iOSシミュレータを使う、配布パッケージを作る時に必要になります。App Storeもしくは、Webからの.dmgダウンロードでインストールできます。
Xcodeをインストールする方法【iOSアプリの統合開発環境】 | TechAcademyマガジン : http://techacademy.jp/magazine/1409

####Android Studio (Optional)

Androidでの開発を希望する場合は、Android Studioを導入します。
Download Android Studio and SDK Tools | Android Developers : http://developer.android.com/sdk/index.html

こちらのポストでMacでの詳細設定方法を説明します。
[IonicでAndroid開発準備](http://qiita.com/tomo_makes/items/e3990ea1e369935f1b8f)


####node.js

nodeをインストールします。homebrewなどのパッケージ管理ソフトを使う、Webから直接ダウンロードする、お好きな方法で良いでしょう。
node.js : http://nodejs.jp/nodejs.org_ja/docs/v0.10/

node.jsはサーバサイドでJavaScriptを使うプラットフォームです。転じて、ブラウザ上だとセキュリティ上の制約上できないことがnode.jsでは実現できることから、Webサーバとしての用途のみならず、ハードウェアI/Oとの連携他、さまざまなことができます。

##Cordovaのインストール

npmでcordovaをインストールします。npmはnode.js用のライブラリ管理ソフトです。Cordovaはnode.jsのライブラリとして提供されます。

```shell-session
$ npm install -g cordova
```

早速、Cordovaでサンプルプロジェクトを生成してみます。

```shell-session
$ cordova create test-project 
$ cd test-project
```

iOSプラットフォーム追加し、iOSエミュレータ連携ツールを入れます。

```shell-session
$ cordova platforms add ios
$ npm install -g ios-sim
```

アプリをビルドし、実行します。

```shell-session
$ cordova build ios
$ cordova emulate ios
```

iOSエミュレータが立ち上がり、サンプルアプリ画面が立ち上がれば成功です。

##参考

私は初回導入時、自環境がXcode5だったためエラーとなりました。
App StoreからXCode6へバージョンアップするも、それもエラーで途中停止。
iOS Dev Center - Apple Developer : https://developer.apple.com/devcenter/ios/index.action
から.dmg版をダウンロード、インストールすることで、やっと正常起動しました。
k-mer countingに関するメモ

### 次世代シーケンサー（NGS）のデータ解析に欠く事ができない基盤技術である、k-mer counting法のまとめ

k-merとは、NGSが出力したリードの塩基配列を決まった文字数切り出したもの http://en.wikipedia.org/wiki/K-mer

- ゲノム・トランスクリプトームアセンブル時のエラー補正
- ゲノムサイズの推定
- マルチプルアライメント（MUSCLE）
- 実験のQuality Control
- RNAの定量化（Sailfish、RNA-Skim）

...等々、様々な箇所で利用されている。

データ内にどのk-merがどの程度あるのか数える事をk-mer countingという。k-mer countingを行うソフトウェアは以下のようなものがある。
ざっと見て、DSKやStream Algorithmのように省メモリタイプのものと、Jellyfishのような高速なタイプがある。

#### khmer : Bloom-filterベース、比較論文になっているから必読
Count-min Hashを利用している
http://en.wikipedia.org/wiki/Count–min_sketch
http://en.wikipedia.org/wiki/MinHash
http://www.slideshare.net/iwiwi/minhash?related=2
[These Are Not the K-mers You Are Looking For: Efficient Online K-mer Counting Using a Probabilistic Data Structure, PLOS ONE, 2014](http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0101271)

#### MSPKmerCounter : 論文が無いがDSKに似ているらしい
http://www.cs.ucsb.edu/~yangli/MSPKmerCounter/index.html

#### KmerStream : Stream Algorithmベース
[KmerStream: Streaming algorithms for k-mer abundance estimation, Bioinformatics, 2014](http://bioinformatics.oxfordjournals.org/content/30/24/3541)

#### KAnalyze : アルゴリズムは不明、Javaで実装されている、Jellyfishよりも速いらしい
[KAnalyze: a fast versatile pipelined K-mer toolkit, Bioinformatics, 2014](http://bioinformatics.oxfordjournals.org/content/early/2014/04/09/bioinformatics.btu152.full)

#### KMC 2 : DSKと似たような感じらしい
[KMC 2: Fast and resource-frugal k-mer counting, Bioinformatics, 2014](http://arxiv.org/abs/1407.1507)

#### KMC : DSKと似たような感じらしい
[Disk-based k-mer counting on a PC, BMC Bioinformatics, 2013](http://www.biomedcentral.com/1471-2105/14/160)

#### DSK : Disk-Streaming Algorithmベース、省メモリ
[DSK: k-mer counting with very low memory usage, Bioinformatics, 2013](http://bioinformatics.oxfordjournals.org/content/29/5/652.long)

#### Turtle : Pattern-blocked Bloom filterベース
[Turtle: Identifying frequent k-mers with cache-efficient algorithms, Bioinformatics, 2013](http://bioinformatics.oxfordjournals.org/content/30/14/1950.abstract)

#### BF Couter : Bloom-filterベース
[Efficient counting of k-mers in DNA sequences using a bloom filter, BMC Bioinformatics, 2011](http://www.biomedcentral.com/1471-2105/12/333)

#### Jellyfish :  Hashベース、Lock-free、マルチスレッド対応、速い
[A fast, lock-free approach for efficient parallel counting of occurrences of k-mers, Bioinformatics, 2011](http://bioinformatics.oxfordjournals.org/content/27/6/764)

#### GkArray : Generalized Suffix Arrayベース
[Querying large read collections in main memory: a versatile data structure, BMC Bioinformatics, 2011](http://www.biomedcentral.com/1471-2105/12/242)

#### Tallymer : Suffix Arrayベース、トウモロコシゲノムを読むために作られた
[A new method to compute K-mer frequencies and its application to annotate large repetitive plant genomes, BMC Genomics ,2008](http://www.biomedcentral.com/1471-2164/9/517)

#### Meryl : Celeraアセンブラの内部で利用されている
[Aggressive assembly of pyrosequencing reads with mates, Bioinformatics, 2008](http://bioinformatics.oxfordjournals.org/content/24/24/2818.abstract)

#### 参考
[OMIC tools](http://omictools.com/k-mer-counters-c494-p1.html)
[Homolog.us – Bioinformatics](http://www.homolog.us/blogs/blog/2014/04/07/kmer-counting-a-2014-recap/)
S3 事始め

## 前提条件
AWS CLIの設定が完了していること


## Bucket作成
`aws s3 mb s3://hogefuga1226`

## Objectのアップロード
`aws s3 cp hello_s3.html s3://hogefuga1226/index.html`

## ObjectACLの変更
`aws s3 cp --acl public-read hello_s3.html s3://hogefuga1226/`
VimfilerでQuick Lookを使ってファイルをプレビューする


Mac OS X上で動作しているVim + Vimfiler環境で、カーソルで選択しているファイルをQuick Lookをつかってプレビューする方法をメモします。

# 方法

※ 2015/01/01追記: vimprocをあらかじめインストールしておく必要があります。

方法は簡単で、以下の設定を`.vimrc`に記述するだけです。この設定により、Vimfiler起動中に`Shift + v`を入力することで、カーソルで選択しているファイルをQuick Lookでプレビューできるようになります。

```vim
let g:vimfiler_quick_look_command = 'qlmanage -p'
autocmd FileType vimfiler nmap <buffer> V <Plug>(vimfiler_quick_look)
```

# カンタン説明

もう少し説明すると、`Shift + v`が入力された際に、`g:vimfiler_quick_look_command`に設定された`qlmanage -p`というコマンドが実行されています。

`qlmanage`コマンドは、Mac OS Xに標準搭載されているコマンドで、`p`オプションをつけてファイルパスを渡すことで、そのファイルをQuick Lookでプレビューできる機能を備えています。

Quick Look以外のプレビューツールを使いたい場合は、`g:vimfiler_quick_look_command`に設定するコマンド名を適宜変更すればよいみたいです。

Quick LookがないMac OS X以外のOSでも使えますね！
Dockerライフサイクルをハンズオンで学ぶ



年末はいかがお過ごしでしょうか。
アイアンマン大好き　千葉です。

今日は、Dockerのライフサイクルをハンズオンで学びたいと思います。

## Dockerのライフサイクル
![dockerライフサイクル.png](https://qiita-image-store.s3.amazonaws.com/0/33834/69d4cd53-2d30-58ee-27ea-8cf1844f8b79.png "dockerライフサイクル.png")

* pullでDockerHubからCentOSやUbuntuのイメージをローカルにダウンロード
* ダウンロードしたイメージからrunで、コンテナを起動
* コンテナはstop、start、restartができる
* コンテナを停止後にcommitすることで、イメージを作成できる
* pushでDockerHubにイメージを保存できる
* コンテナの削除はrm
* イメージの削除はrmi

## ハンズオン環境
* AWSのEC2上で実施
* OSはCentOS6.5


## いざ、ハンズオン開始
※名前となっている箇所は、あなたの名前を入力してください（タグで誰のコンテナか見分けるために）

### EC２インスタンス作成(CentOS)
CentOSでEC2インスタンスを作成し、sshでの接続を済ませてください。

### Dockerインストールと起動

```
# yum -y update
# yum -y install wget


# sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
# sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# sudo yum -y install docker-io

# chkconfig docker on
# service docker start
```

### イメージダウンロード

```
# docker pull centos:centos6
# docker images
```

### コンテナ起動

```
# docker run -dti --name [コンテナ名] centos:centos6 /bin/bash
# docker ps
# docker attach [コンテナ名]

# yum install httpd
# touch test-file
# exit
```

### イメージ作成

```
# docker ps -a
# docker commit [コンテナ名] [名前]/httpd-server
# docker images
```

### 作成したイメージからコンテナ起動

```
# docker run -idt --name [名前]-new [名前]/httpd-server /bin/bash
# docker attach [名前]-new
# rpm -qa | grep httpd
# ls -l test-file
```

※因みに途中でターミナルから抜けたい場合（exitするとコンテナが停止します）

```
control + p　→ control + q
```

### コンテナの停止

```
# docker stop [名前]-new
# docker ps
```

### 掃除：コンテナの削除

```
# docker ps -a
# docker rm [名前] [名前]-new
# docker ps -a
```

### 掃除：イメージの削除
```
# docker images
# docker rmi [名前]/httpd-server
# docker images
```

## コマンドまとめ

### 操作系

* DockerHubからイメージダウンロード
	* docker pull
* コンテナの起動
	* docker run -dti --name [コンテナ名] centos:centos6 /bin/bash
* 起動中のコンテナに接続
	* docker attach [コンテナ名]
* 接続中のコンテナから一時的に切断する
	* control + p　→ control + q
* コンテナの起動
	* docker start [コンテナ名]
* コンテナの停止
	* docker stop [コンテナ名]
* コンテナ再起動
	* docker restart [コンテナ名]
* コンテナの削除
	* docker rm [コンテナ名]
* イメージの削除
	* docker rmi [イメージ名]

### 参照系
* ダウンロード済みのイメージの一覧
	* docker images
* 現在起動しているコンテナの表示
	* docker ps -l
* dockerのログを表示
	* docker logs [コンテナ名]
* 停止しているコンテナも表示する
	* docker ps -al

## 補足

```
# docker push
```

で、DockerHubにアップロードできるがまた今度。


## 追記
### Dockerコンテナに接続
```
docker exec -it [コンテナ名] /bin/bash
```

execを使うと、起動中のコンテナに対してコマンドを発行できる。
/bin/bashを指定することで、コンテナに接続することが可能。

因みにexecは、本来は起動中のコンテナに対していプロセスを実行する場合に利用する。
Free Pascal であけましておめでとうございます！

あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は、FreePascalにしてみました。やっぱinnosetup scriptはちょいと違うもんですね。

# 環境

* CentOS6.6 x86_64
* Free Pascal 2.6.4
* Synapse (TCP/IPライブラリ)

# Free Pascalのインストール

http://www.freepascal.org/
RPMをダウンロードしてインストール。

# Synapseのインストール
SynapseはPascalの TCP/IPライブラリです。メールの送受信だけでなくFTPやSSHなど様々なプロトコルを対応しています。
Synapseのインストールは http://www.ararat.cz/synapse/doku.php/download ここからダウンロードしてどこかに展開して終わり。
unitのサーチパスは、/etc/fpc.cfg に追加 もしくは、コンパイルの際に-Fuでパスを指定してください。

## コンパイル & 実行

適当に本文のテキストをbody.txtに書いてSJISで保存してください。
あとは実行するだけ。

```shell-session
$ make -f Makefile all
$ ./newyear_mail
```

## Makefile
```mf:Makefile
LDM  = newyear_mail

UNITDIR = ./synapse
FPCFLAGS =  -Px86_64 -Fu$(UNITDIR)

all : $(LDM)

$(LDM) : $(LDM).pas
        @rm -f $(LDM).o
        fpc $(FPCFLAGS)  $(LDM).pas

clean :
        rm -f $(LDM) $(LDM).o

```
## コード

TLSなgmail経由で送ったほうが良いでしょうけど、今回はsmtp認証でloginメソッド版です。

```pascal:newyear_mail.pas
program NewYearMail;
  {$mode objfpc}

uses
  Classes, Sysutils, blcksock, smtpsend;

procedure SendMail(
  User, Password, SMTPHost, SMTPPort: string;
  mailfrom, mailto, mailsubject: string;
  mailbody: TStringList
);
var
  SMTP: TSMTPSend;
  ret: Boolean;
  i: integer;
  maildata: TStringList;
begin
  SMTP := TSMTPSend.Create;
  maildata := TStringList.Create;

  maildata.Add('Mime-Version: 1.0');
  maildata.Add('Content-Transfer-Encoding: 7bit');
  maildata.Add('Content-Type: Text/Plain; charset=iso-2022-jp');
  maildata.Add('From: ' + mailfrom);
  maildata.Add('To: ' + mailto);
  maildata.Add('Subject: ' + mailsubject);
  maildata.Add('');

  for i := 0 to mailbody.Count -1 do begin
    maildata.Add(mailbody[i]);
  end;

  try
    SMTP.UserName := User;
    SMTP.Password := Password;
    SMTP.TargetHost := SMTPHost;
    SMTP.TargetPort := SMTPPort;
    if SMTP.Login then
    begin
      ret := SMTP.MailFrom(mailfrom, Length(mailfrom)) and SMTP.MailTo(mailto) and SMTP.Maildata(maildata);
      SMTP.Logout;
    end;
  finally
    SMTP.Free;
  end;
end;


var
  list: TStringList;
  i: Integer;
  FileName: TextFile;
  buff: String;
  body: TStringList;
begin
  list := TStringList.Create;
  body := TStringList.Create;

  list.Add('foo@example.com');
  list.Add('hoge@example.com');
  list.Add('bar@example.com');

  AssignFile(FileName, 'body.txt');

  try
    Reset(FileName);
    repeat
       Readln(FileName, buff);
       body.Add(buff);
    until(EOF(FileName));
    CloseFile(FileName);
  except
    on E: EinOutError do
    begin
       Writeln('File handling error occurred. Details: '+E.ClassName+'/'+E.Message);
    end;
  end;

  for i := 0 to list.Count -1 do begin
    SendMail(
      'dharry',
      'mypassword',
      'example.jp',
      '587',
      'dharry@example.jp',
       list[i],
       'I wish you a Happy new year 2015!',
       body
    );
    WriteLn(list[i]);
  end;
end.
```
今からTypeScriptを始めるための素敵テンプレート

さあ、今すぐTypeScriptを始めましょう！

```shell-session
$ git clone https://github.com/progre/template-typescript.git
$ git submodule update --init
$ npm install -g gulp
$ npm install
$ gulp
```

以上、これだけで勝手にブラウザが立ち上がってHello worldが実行されます。
![rapture_20141231185405.png](https://qiita-image-store.s3.amazonaws.com/0/3790/e41e31d4-f0b9-0b82-5f40-0323ab583f91.png)

詳しいことは実際にソースをいじいじすると良いと思います。

![rapture_20141231185841.png](https://qiita-image-store.s3.amazonaws.com/0/3790/bf4cd838-eaed-ddba-2373-d85af545a246.png)

main.tsがエントリーポイントで、service.tsを読み込んでconsole.log叩いてます。

あとは、お好きなように。

[progre/template-typescript](https://github.com/progre/template-typescript "progre/template-typescript")
年末なので web アプリ作った

minmax
http://amo12937.github.io/minmax_web/

# 遊び方
- パネルを交互に取っていき、合計得点を競うゲームである。
- 先手は好きな位置から始められる。
- 後手は、先手が選んだ位置を含む縦一列の中からパネルを選ぶ。
- 再び先手は、後手が選んだパネルを含む横一列の中からパネルを選ぶ。
- 一度選んだパネルは選べない。
- パスはできない。
- パネルを選ぶことが出来なかった時点で、合計得点の高い方の勝ちである。

# ゲーム進行例
## スタート
ゲーム開始。最初はやっぱり 10 でしょ
![スクリーンショット 2014-12-31 23.24.53.png](https://qiita-image-store.s3.amazonaws.com/0/38864/b98a7fce-91ab-49ec-c4b4-1ee592997d7b.png)

## 序盤
10 を 2 つ取れて出だしは順調
![スクリーンショット 2014-12-31 23.26.12.png](https://qiita-image-store.s3.amazonaws.com/0/38864/e2404b1e-abdb-11c5-629e-70a26ea11536.png)

## 中盤
ちょっと負けてきた中盤。
一番右の 9 を取ると次に右上の 10 を取られる。
左の 5 を取れば次に相手はマイナスしか取れない。というわけで 5 を選択。
![スクリーンショット 2014-12-31 23.29.42.png](https://qiita-image-store.s3.amazonaws.com/0/38864/ea799ca6-9ada-1820-0dd6-46ebaaa6efe9.png)

## ラスト
盛り返して引き分け。
レベル 5 で引き分けならいい方です。
![スクリーンショット 2014-12-31 23.31.53.png](https://qiita-image-store.s3.amazonaws.com/0/38864/03afcb46-939d-cacb-18c3-76d89248832a.png)

# 開発環境
## 言語
- CoffeeScript
- Haml
- CSS (どーん）

## フレームワーク
- angularJS
- Bootstrap

## プロジェクト管理
- git
- grunt

## テスト
- Karma
- Jasmine

## その他
- 無駄に多言語対応
    - http://amo12937.github.io/minmax_web/#/?lang=en
- minmax とか言っておいてコンピュータのアルゴリズムは アルファ・ベータ法
    - http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%BB%E3%83%99%E3%83%BC%E3%82%BF%E6%B3%95 ）

モジュール化や自動テスト、ステートマシン、多言語対応など、今年学んだことをいろいろと盛り込んでみました。年明けにテストの追加とリファクタリングをやります。あと、内部的なことも年明けに Qiita に投稿する予定です。

それではみなさん良いお年を。
Rust で返り値を使わない旨を記述する

このエラーと戦う:

```
warning: unused result which must be used, #[warn(unused_must_use)] on by default
```

例えば
-----------

こんなコード書くと出てくる:

```print_foo.rs
use std::io::stdio::stdout;

fn main() {
    stdout().write_line("foo");
}
```

```bash
$ rustc print_foo.rs
print_foo.rs:4:5: 4:31 warning: unused result which must be used, #[warn(unused_must_use)] on by default
print_foo.rs:4     stdout().write_str("foo");
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~
```

このコード含めて大体のケースにおいては返り値を使ってきちんとエラー処理したほうが良いと思うんですが、今回は簡単のためこれを例にします。

* 私が結果を無視したいと感じたケース: https://gist.github.com/kui/64d9357e9b91f8f149e4#file-invoke_external_process-rs-L35
    * kill の成否はあまり関係ない
    * 元の timeout による Error のほうを返したい

このエラーは `must_use` がついた構造体が返り値を `let x` でバインドするわけでもなく、メソッドチェーンするわけでもない時に出ます。今回のケースだと返り値は Result なのでソースコードを見るとそう書いてあるのがわかります。

* [result.rs.html -- source](http://doc.rust-lang.org/src/core/result.rs.html#247-249)


書き方 1. `_` にしまう
---------------------

他のいくつかの言語同様に Rust でも `_` にしまうような記述をすると「その値は使わないよ」という意図になります。具体的にはこう書く:

```print_foo.rs
use std::io::stdio::stdout;

fn main() {
    let _ = stdout().write_line("foo");
}
```

* ソース: [Implement an unused result lint by alexcrichton · Pull Request #11754 · rust-lang/rust](https://github.com/rust-lang/rust/pull/11754#issuecomment-33202664)

この書き方の起源って誰なんだろう。


書き方 2. attribute を指定する
---------------------------------

結果を無視する記述をがある関数の attribute として `allow(unused_must_use)` を指定する。具体的にはこう書く: 

```print_foo.rs
use std::io::stdio::stdout;

#[allow(unused_must_use)]
fn main() {
    stdout().write_line("foo");
}
```

ただ、これだと、この関数（この例だと `main`）内すべてが無視されてしまい勿体無いので、`_` にしまうのを推奨します。

* ソース: [Implement an unused result lint by alexcrichton · Pull Request #11754 · rust-lang/rust](https://github.com/rust-lang/rust/pull/11754/files#diff-95f519dc33555d68086c3219c95fc910R28)

ソースがドキュメント的なきちんとまとまったところのものを知ってる人は教えて下さい。
[C#]設定ファイルの読み込みと書き込み　その１

一応職業としてはプログラマを自称しているはずなのに、最近RubyはおろかメインのC#すら触ってない子がこちらになります。
SE仕事も楽しいけど、一応本業はプログラマ(2回目)だし、黙々と作業してて「うああああああこんなもんツール作ろうぜめんどくせえ！(ちゃぶ台投げ」という至って個人的な事件もあったので、肩慣らしも兼ねてWindowsの設定ファイルについてまとめ。

#設定ファイルの種類
* iniファイル
* XMLファイル
* バイナリファイル

さっくり思いつく範囲だとこんなもんですかね。
レジストリは設定「ファイル」ではないので今回除外します。
親玉(Microsoft)がどう意図してるかは別として、現実に使われてる設定ってこの辺りかなーと思います。
**思い込みましょう。**
なぜかと言えば、今回はその3つについてまとめたいからです。

##iniファイル
昔ながらの馴染み深い設定ファイル。

* **メリット**
システムの知識が比較的浅い人でもわかりやすい。
例えば業務システムで現地の常駐スタッフや営業に「このファイルをこう直して！」という指示が通りやすい。
テキストエディタさえ使えればなんとかできるハードルの低さ。

* **デメリット**
ハードルが低すぎるが故に好き放題変更できてしまう。
結果、動作しなくなるレベルの好き放題をされたり、不整合の元を作ったりする。
セクションの考え方は「メモ帳なら使えるよ！」レベルの人には通じないと思われる。
読み込みだけならともかく書き込みを行う場合、ちょっとプログラムからの編集が面倒。

つまり、「比較的頻繁に人手で変更する可能性がある」とか「プログラムは読み込む一方」の設定はiniファイルに書くのが便利そう。
実際自分の周りでも、DBの接続先設定とか、動作モード設定の情報でよく使います。

##XMLファイル
最近iniファイルに代わってよく見られるようになった気がする。

* **メリット**
ある程度以上知識のある人なら人手で変更することができる。
ダブルクリックしてデフォルトのIEとかで開いちゃって「編集できない！」という人を排除できる。
iniファイルに比べて複雑な設定が可能。
圧倒的にプログラムで扱いやすい。

* **デメリット**
あんまりないが、XMLのルールが厳密なので、手で編集時にうっかり消しちゃった事件などが発生すると泣きを見る。
iniファイルに比べると目視で追うのはちょっと辛い。

読むにしても書くにしてもとにかくプログラムで扱いやすいのでラク。
設定画面で変更するのがメインだけど、手で変更する可能性もあるもの向き。
それこそHTMLが元祖ではあるけど、画面イメージ設定とかデータ構造の定義によく使う。

##バイナリファイル
これを使うのは限られた状況な気がする。

* **メリット**
ユーザーから見えない。
勝手に変更されたり、どんな設定になっているのかを覗き見られたりする心配がない。
プログラムからの変更はXMLと同じく容易。

* **デメリット**
バイナリなので、人手の読解は困難というかやる気がしない。

普通はゲームとかの設定で使うのかな？
実は自分では使ったことがない。
でも、勝手に設定いじってしまうユーザーにはかなり有効だなってたまに思う。

***
御託にもなってない御託はこの辺で終わりにして、次回から実装です。
IntelliJ IDEAでRubyプロジェクトをセットアップするときの注意


動作させるRubyスクリプトはプロジェクトのルートディレクトリにおく
そうでない場合はbundle execが動作しない場合がある。（RunのSettingでNo Gemfile found）のエラーが出る。

IntelliJ IDEAで作成したプロジェクトのルートに、さらにRubyプロジェクトのルートを作成するとbundleを認識しないらしい。


動作させるスクリプトは環境変数RUBYLIBに動作に必要なLibraryのパスを通すこと。これをやらないとrequireの時に怒られる。
RabbitMQのインストールと接続


# インストールと起動

```
$ sudo rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
$ sudo yum install http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.1/rabbitmq-server-3.4.1-1.noarch.rpm
$ sudo service rabbitmq-server start
```

# リモートのRabbitMQに対して接続する
デフォルトで登録されている *guest* ユーザーはリモート接続できないため新しくユーザーを作成する。
ここでは`rabbitmqctl`コマンドを使って *remote* ユーザーを作成した。

参考:[rabbitmqctl](http://www.rabbitmq.com/man/rabbitmqctl.1.man.html)


```
# create remote user
$ rabbitmqctl add_user remote remote

# give the remote permissions
$ rabbitmqctl set_permissions -p / "remote" ".*" ".*"
```

Virtual hostは`/`(デフォルトは`/`)
SEIL/x86(ソフトウェアルータ)でシリアルコンソールを使いたい

[SEIL/x86](http://www.seil.jp/product/lineup/seilx86/)はIIJが提供しているソフトウェアルータです。
標準ではシリアルポート経由で運用を行うことができないので、設定を変更します。

#構成
![SEIL_x86.png](https://qiita-image-store.s3.amazonaws.com/0/63424/33519269-41c5-2df8-b548-d759487b0697.png)

* ディスプレイ/キーボードで行う設定を、シリアルポート経由で実施するようにする

#メリット

* ディスプレイが無い環境でも不便なく利用できる
* 仮想環境で使用するときでも都合が良い（VNC等のグラフィック環境を経由せずに直に設定できる。CUI環境のKVMホスト上で使うときにも便利）
* シリアル経由で設定できるとネットワーク機器ぽくて嬉しい

#設定方法の概要
ルータ上で直接に設定変更できれば良いのですが、できません。
ですのでSEIL/x86のディスクイメージをマウントし、直接設定を追加します。

1. 設定変更のための環境を用意する
1. サイトからディスクイメージをダウンロード
1. ダウンロードしたイメージをマウントし設定追加
1. カスタマイズしたディスクイメージを元にインストール

# 設定手順

## 1.設定変更のための環境を用意する
SEIL/x86のディスクイメージはUFSでフォーマットされています。
編集し設定する為にNetBSDの環境を用意します。(ちなみにSEIL/x86もNetBSDベースです)
インストール先は物理環境でも構いませんが、仮想環境（VMwareとかVirtualBoxとか）の方が手軽でしょう。

(備考)

* Linux環境からだとUFSの読書きが厳しい
* FreeBSDだと上手くマウントできなかった（多分、私の知識不足）

インストール時の要点としては

* 基本的はインストールウィザードに通りでOK
* SSHを有効にする

ぐらいでしょうか

インストールが完了したらrootでログインしてネットワークの設定を行います

```lang:DHCPでIPアドレス設定する場合
netbsd# echo "dhclient=YES" >> /etc/rc.conf
netbsd# sh /etc/rc.d/dhclient start
netbsd# ifconfig
wm0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	capabilities=2bf80<TSO4,IP4CSUM_Rx,IP4CSUM_Tx,TCP4CSUM_Rx,TCP4CSUM_Tx,UDP4CSUM_Rx,UDP4CSUM_Tx,TCP6CSUM_Tx,UDP6CSUM_Tx>
	enabled=0
	address: 00:1c:42:99:ec:02
	media: Ethernet autoselect (none)
	status: active
	inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255
	inet6 fe80::21c:42ff:fe99:ec02%wm0 prefixlen 64 scopeid 0x1
```

必要に応じてSSHログイン用のユーザを作成します

```lang:ユーザを追加
netbsd# useradd -m -g wheel sshuser
```

## 2.サイトからディスクイメージをダウンロード
[ダウンロードページ](https://www.seil.jp/seilx86_download/)からSEIL/x86本体をダウンロードします
いくつかの形式で提供されていますが、ここでは**diskimage形式**を使用します
ダウンロードが完了したらファイルを展開し、中身(bootdisk.img)を先ほどのNetBSD環境に転送します。

転送方法は何でも良いですが、SCP(scpコマンドやWinSCP等)を使用するのが簡単です。

## 3.ダウンロードしたイメージをマウントし設定追加
NetBSD環境にディスクイメージを転送したら設定を行います

まずイメージをマウントし編集できるようにします

```lang:マウント
netbsd# mkdir /mnt/diskimg
netbsd# vnconfig vnd0 bootdisk.img
netbsd# mount /dev/vnd0a /mnt/diskimg/
```

マウントしたイメージに設定(設定ファイル)を追加します

```lang:シリアルコンソールの設定を追加
netbsd# echo "console=com0" >> /mnt/diskimg/boot.cfg
netbsd# echo "speed=38400" >> /mnt/diskimg/boot.cfg
```

*(注意) SEIL/x86を導入する機器に複数のシリアルポートがある場合、ポート名が"com0"で無いかもしれません*

追加したらイメージのマウントを解除します

```lang:マウント解除
netbsd# umount /dev/vnd0a
netbsd# vnconfig -u vnd0
```

これでbootdisk.imgへの設定追加は完了です。
完成したbootdisk.imgを分かりやすい名前で保存しておきましょう。

## 4.カスタマイズしたディスクイメージを元にインストール
完成したディスクイメージを通常の方法でディスクに書き込みます。

```lang:一例
# dd if=./bootdisk-serial.img of=/dev/USBメモリやCF等
```
```lang:一例
# dd if=./bootdisk-serial.img of=KVMの仮想ディスク等
```

書き込んだディスクから起動し、シリアルポート経由でアクセスできれば成功！