OmniAICreator/Qiita-1.07M huggingface dataset:
配列のインデックスを取る時に…

かなり基本的なことを書いてしまうようで恐縮ですが

今まで、swiftの配列には、`indices`というプロパティがあるのを
全然気づいていなかったので、

例えば配列の最後のインデックスを取るときは

```swift
let arr = ["A", "B", "C", "D", "E", "F"]

let lastIndex = arr.count - 1
```

みたいにやってました
(配列が空の時にバグるじゃん、というのは今は置いておいて・・・)

実はswift的にはあまりイケていないようで、

```swift
let arr = ["A", "B", "C", "D", "E", "F"]

let lastIndex  = arr.indices.last
```

この書き方のほうが良いようです

これで返ってくる値はオプショナルなので
配列が空かどうかも楽々取れます


で、for文のときは
昔ながらのCライクな書き方で

```swift
let arr = ["A", "B", "C", "D", "E", "F"]

var str = ""
for var i = 0; i < arr.count; i++ {
    str += arr[i]
}
```

という書き方ができますが、
swift2.2からは、なんと非推奨になってしまいます

同じことをするときには
色々と方法がありますが、シンプルにはこのようにするらしいです


```swift
let arr = ["A", "B", "C", "D", "E", "F"]

var str = ""
for i in arr.indices {
    str += arr[i]
}
```

`++`演算子、`--`演算子が非推奨になるとか、びっくらぽん
Swift Package Manager (SPM) の除外設定

__Swift Package Manager__ (SPM) でハマったことを共有します。🍂

なおドキュメントにはバッチリ記載されている内容です。😅

# ハマったこと

パッケージに `*.swift` を含まないフォルダを持たせる場合は __Manifest File で除外設定__ が必要です。

https://github.com/apple/swift-package-manager/blob/swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a/Documentation/SourceLayouts.md

> `Tests` or any subdirectory can be excluded via Manifest file.

## __`Package.swift` — The Manifest File__

具体例を挙げます。

- `exclude: ["Documentation"]`

パッケージ [`APIHimotoKit`](https://github.com/JPMartha/APIHimotoKit)[^1] の `Documentation` フォルダは `*.swift` を含まないため次のとおり設定します。

[^1]: 無断で作成した非公式ツールです。🙏

```swift:Package.swift
import PackageDescription

let package = Package(
    name: "APIHimotoKit",
    dependencies: [
        .Package(url: "https://github.com/JPMartha/APIKit.git",
            Version(2, 0, 0)),
        .Package(url: "https://github.com/JPMartha/Himotoki.git",
            Version(2, 0, 0))
    ],
    exclude: ["Documentation"]
)
```

### もし除外しなかったら…

ビルド時に怒られます🙇

```bash
error: NoSources("/.../Documentation")
```

## 補足

### __EARLY DAYS__

Swift Package Manager はまだ初期の設計・開発段階です。🚧
下記の Swift.org コミュニティにて議論中で今後仕様が変わる可能性があります。👷🏻

- メーリングリスト
  - https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20160321/000363.html

- GitHub
  - https://github.com/apple/swift-package-manager/pull/179
  - https://github.com/apple/swift-package-manager/pull/220
  - https://github.com/apple/swift-package-manager/pull/223

など

### 今回のテスト環境

- OS X 10.11.4
- swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a

### 今回の依存ライブラリ

- JPMartha / APIKit _forked from_ ___[ishkawa/APIKit](https://github.com/ishkawa/APIKit)___ （諸事情で 2.0.0 を作るため Fork）
- JPMartha / Himotoki _forked from_ ___[ikesyo/Himotoki](https://github.com/ikesyo/Himotoki)___ （同上）

# おまけ

2016-03-26 追記: 🚨__この方法はなくなりそうな展開になっています。__
https://github.com/apple/swift-package-manager/pull/223

__本物の [APIKit](https://github.com/ishkawa/APIKit) と [Himotoki](https://github.com/ikesyo/Himotoki)__ はいずれも投稿時点で __2.0.0-beta.2__ がプレリリースとして公開されており、すでに __Manifest File__ を配置されています。

もしこれらを指定する場合は次のとおり設定します。（あくまで現状）

```swift:Package.swift
dependencies: [
    .Package(url: "https://github.com/ishkawa/APIKit.git",
        Version(2, 0, 0, prereleaseIdentifiers: ["beta", "2"])),
    .Package(url: "https://github.com/ikesyo/Himotoki.git",
        Version(2, 0, 0, prereleaseIdentifiers: ["beta", "2"]))
]
```

ほかにもありますが長くなるのでこのへんで締めます。💁
AWS　教訓　AmazonLinuxのデフォルトのlocaltaime

#教訓

AmazonLinuｘを使用するとデフォルトで世界標準時が使用され、日本時間と８時間のズレが生じてしまう。
AmazonLinuｘのでろフォルトが世界標準時であることは以下ドキュメントの”時間帯の変更”を確認
[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html)

---
変更方法
http://qiita.com/azusanakano/items/b39bd22504313884a7c3
http://qiita.com/azusanakano/items/b39bd22504313884a7c3

を参考にする。


####作業前にファイルのバックアップをちゃんと取る

```bash:作業
$ date
XXXX年  XX月 XX日 XXXXXXXXX UTC
$ cat /etc/localtime
XXXXXXXXXXXX
UTCXXX
$ cp /etc/localtime /etc/localtime.org
$ sudo ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
XXXX年  XX月 XX日 XXXXXXXXX JST

$ sudo cp /etc/sysconfig/clock /etc/sysconfig/clock.org
$ sudo vi  /etc/sysconfig/clock
$ cat /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
```

---

####インスタンスを立てた際は日本時間に直す
####もしくは起動時にユーザーデータで日本時間を指定するようにスクリプトを走らせる
Google Apps Script でシートごとのjsonを出力した時の話

言語ファイルが５ヶ国語まで増えてきてテキスト運用では厳しくなってきたのでGASを使って各言語ごとに担当を割振り管理することにしました。

スプレッドシートの構成はこんな感じ

```lang:スプレッドシート
----------------------------------------------------
ID  |日本語 |英語  |中国語(簡体) |中国語(繁体) |韓国語|
---------------------------------------------------
key1|XXXXXX|XXXXXX|XXXXXXXXXXXX|XXXXXXXXXXXX|XXXXXX|
key2|XXXXXX|XXXXXX|XXXXXXXXXXXX|XXXXXXXXXXXX|XXXXXX|
---------------------------------------------------
```

最近のスプレッドシートはすごい！履歴まで管理できるんだね～(*´∀｀*)

で、これに書いてGASを実行するとマイドライブにディレクトリと必要な形式に整形されたjsonが出力されるという仕組みです

そのスクリプトを書いて、その時に使った関数などを抜粋してメモしておきます

同じようなことやろうとしてる人には役に立つかもです

```lang:gs
// シートにメニューを追加
function onOpen() {
  var Ui = SpreadsheetApp.getUi();
  Ui.createMenu('Scripts')
      .addItem('Output JSON', 'myFunction')
      .addToUi();
};

function myFunction(){
	// フォルダ名
	var dir_name = 'language_folder';

	// フォルダ一覧取得
	var destfolder_childs = DriveApp.getFolders();

	// 対象フォルダを削除（中身も全て削除される）
	while (destfolder_childs.hasNext()){
		var folder = destfolder_childs.next();
		if (folder.getName() == dir_name){
			DriveApp.removeFolder(folder);
		}
	}

	// フォルダを作成
	var output_folder = DriveApp.createFolder(dir_name);

	// フォルダに追加
	var output_folder_child =  output_folder.createFolder('child1');

	// 全シートを取得
	var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

	// 全シートをループ
	for(var i in sheets){
		
		// シートのobjectを取得
		var obj_sheet = sheets[i];
		
		// シートIDを取得
		var sheet_id = obj_sheet.getSheetId();
		
		// シート名を取得
		var sheet_name = obj_sheet.getName();
		
		// ログ出力
		Logger.log([sheet_id, sheet_name]);
		
		// 値を配列で取得 [0: 開始行の位置, 1: 開始列の位置, 2: 取得する行数, 3: start_columnから取得する列数]
		var values = obj_sheet.getSheetValues(start_row, start_column, obj_sheet.getLastRow(), num_columns);
		
		// valuesとかをゴソゴソしてjson配列を作成
		var json_object = {};
		
		// 子フォルダにjsonを保存
		output_folder_child.createFile(sheet_id + '.json', JSON.stringify(json_object));
	}
}
```
JavaのDBアクセスライブラリ比較


　目に付いたJavaのDBアクセス周りのライブラリを調査してみました。自分のメモ程度の内容を共有します。
　基本的にちゃんとしたORMならJPAでいいじゃんという感じなのかな？
　それじゃあ冗長だという場面で、使うって印象受けた。
　僕だったら小さく始める系ではMirage-SQLとかIciqlで初めて、他のものに場面に応じて変更していくのが良いのではないかと。

sql2o [Not ORM]
-
- Sparkにサンプルあり。おそらく単純だからだと思われる。
- 基本的にSQLからPojoにマップするだけ。
- Modelをそのまま保存するsave()とかinsert(),update()みたいなメソッドはない。ただし、bind()でパラメータをオブジェクトのフィールド名で保存はできる。
- トランザクションの制御のサポート機能あり。ブロックやアノテーションの機能はない。


DbOom [Jodd]
-
- Joddライブラリ集の一つ。Joddは機能ごとに切出せて何かと使いやすそう。
- 実行されるSQLをパラメタ埋め込み状態で取得でき、デバッグに有利。
- Modelをそのまま保存できるinsert()あり。updateにも補助スクリプトあり。
- セッションとかの機能もついてるのはいいかも。
- トランザクションは一通りのサポートあり。
- Camel <-> snake 変換機能あり。
- キャッシュもあるらしい。
- 初期設定は自分で細々積み上げる必要があるが、必要な道具は一通り揃ってる感じ。
- 余計なことしないのはいいけど、面倒かも。
- JoddのJTXは他のライブラリ使うときも切り出して使えそう。

Doma 
-
- S2Daoの後継として作成されている。
- 2Way-SQLで実行できる。
- SELECTのSQLは自動生成されない。
- 更新系は自動生成サポートあり。もちろん自分でも記述できる。Modelをそのまま保存できる機能あり。
- トランザクション、Camel <-> snake 変換などの機能は一通りあり。
- 自動生成のクラスが大量に生成される。コンパイル時に暗黙生成なので動作を理解してないと何事かと思う。
- コンパイルされたモジュールは巨大になる。
- 自動生成とかあるので初期設定とか簡単なのか気になる。
- ちと仕組みが煩雑なので学習コストが気になる。また、柔軟ではあるけど、柔軟に使いこなすには知らなければならないことが多くなりそう。


Mirage-SQL
-
- S2Daoに使用感にている。
- 2Way-SQLで実行する。
- トランザクションサポートあり。
- カラム名はアノテーションで対応を記述するタイプ。
- 更新系は自動生成サポートあり。もちろん自分でも記述できる。Modelをそのまま保存できる機能あり。
- 無理に自動化宣言化してなくて難しくなっていない。
- 更新が活発ではないのが気になるが、最近も少し更新されているので変に難しくならなそうで却っていいかも。


Iciql
-
- 単一のjarで提供される
- 設定ファイルなしで使える
- DBからモデル生成できるツール付き
- iciqlはトランザクション機能はないので、自分でやる。getConnection()を使えば　java.sql.Connection が取得できるので、コミットやロールバックは適宜行う。
- 登録 db.insert(b) 更新 db.update(b) 削除 db.delete(b) マージ db.merge(b)（idの有無で update or insert) も可能。


MyBatis [Not ORM] 
-
- SQL文とオブジェクトのマッピングを行う。このため、レガシーな環境や非正規化されたテーブル、SQL文を自前で制御したい場合によい。
- Struts2 標準
- XMLいっぱい書いて定義する。
- ちょっと重厚長大。

　やはり、このライブラリは既存システムとかに何らかの理由でDBアクセス層を導入しなければならなくなった時とか、プロジェクトの人数が多い時に利用するのに向いているのかもと思う。
　XMLでの定義とかは、気軽に小規模開発とかだと冗長な気がする。
　その代わりにXMLの定義さえ書いてしまえば開発メンバー間などで定義や使用方法などを共有できるし、変更箇所の影響範囲なども検出しやすいのかもしれない。

# まとめ
　やっぱいろいろ特色あって、調べてて面白かった幾つかは実際に使用した、使用感をまとめて記事にしますね。
　そしてやはり場面に応じて特性を考えて使い分けるのが良いのは間違いないとこではあるなと。


# 参考
- [MyBatis 使い方メモ]
(http://qiita.com/opengl-8080/items/a9b5d4038f19d4813ee6)
- [美しき青きDoma！～SQLとIDEが奏でる美しきORマッピング～]
(http://masatoshitada.hatenadiary.jp/entry/2014/12/10/183155)
- [Doma SQLテンプレートのしくみ]
(http://www.slideshare.net/taedium/doma-sql)
- [Db & DbOom (Jodd)]
(http://jodd.org/doc/db/index.html)
- [Iciql]
(http://iciql.com/)
Vim で特定ファイルの filetype を自動認識させる

## TL;DR

```sh
mkdir -p ~/.vim/ftdetect

cat <<EOF > ~/.vim/ftdetect/ruby.vim
au BufRead,BufNewFile Gemfile  set filetype=ruby
au BufRead,BufNewFile Rakefile set filetype=ruby
au BufRead,BufNewFile *.ru     set filetype=ruby
EOF

cat <<EOF > ~/.vim/ftdetect/perl.vim
au BufRead,BufNewFile cpanfile set filetype=perl
EOF
```

こんな感じで行けます。

Perl だと `cpanfile` ぐらいかなと思いますが、Ruby だと DSL ファイルなど、自動認識してくれないものが色々あるかもしれませんね。
modeline [^1] を記すという手もありますが、書きたくないという場合は、上のように所定のパスに設定を配置しておくと、filetype を適用してくれます [^2] 。

[^1]: [options - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/options.html#auto-setting)

GitHub に置いている自分の [dotfiles](https://github.com/key-amb/dotfiles) にも反映していますので、ご参考まで。

## 脚注

[^2]: [filetype - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/filetype.html#ftdetect)
ExcelでN-gramってみる


Bigramしかないけど。

## コード

出典：
https://www.reddit.com/r/excel/comments/377vxb/matching_slightly_different_string_variables/

```vb

Function CreateNGram(strInput, intN)
    Dim arrNGram, intBound, i, j, strGram, didInc, arrTemp

    If Len(strInput) = 0 Then Exit Function

    ReDim arrNGram(Len(strInput) + 1, 1)
    strInput = Chr(0) & UCase(Trim(strInput)) & Chr(0)
    intBound = -1

    For i = 1 To Len(strInput) - intN + 1
        strGram = Mid(strInput, i, intN)
        didInc = False

        For j = 0 To intBound
            If strGram = arrNGram(j, 0) Then
                arrNGram(j, 1) = arrNGram(j, 1) + 1
                didInc = True
                Exit For
            End If
        Next

        If Not didInc Then
            intBound = intBound + 1
            arrNGram(intBound, 0) = strGram
            arrNGram(intBound, 1) = 1
        End If
    Next

    ReDim arrTemp(intBound, 1)
    For i = 0 To intBound
        arrTemp(i, 0) = arrNGram(i, 0)
        arrTemp(i, 1) = arrNGram(i, 1)
    Next

    CreateNGram = arrTemp
End Function

Function CompareNGram(arr1(), arr2())
    Dim i, j, intMatches, intCount1, intCount2

    intMatches = 0
    intCount1 = 0

    For i = 0 To UBound(arr1)
        intCount1 = intCount1 + arr1(i, 1)
        intCount2 = 0

        For j = 0 To UBound(arr2)
            intCount2 = intCount2 + arr2(j, 1)

            If arr1(i, 0) = arr2(j, 0) Then
                If arr1(i, 1) >= arr2(j, 1) Then
                    intMatches = intMatches + arr2(j, 1)
                Else
                    intMatches = intMatches + arr1(i, 1)
                End If
            End If
        Next
    Next

    CompareNGram = 2 * intMatches / (intCount1 + intCount2)
End Function

Function Bigram(ByVal str1 As String, ByVal str2 As String) As Double
    Dim x(), y()
    x = CreateNGram(str1, 2)
    y = CreateNGram(str2, 2)
    Bigram = CompareNGram(x, y)
End Function
```

https://gist.github.com/acknpop/8a98755c6d320a72d77a

渡した文字列が壊されないようByValを追加しました。:wink:

## 感想

文字列に空白が含まれていて且つ空白の前後が入れ替わることが発生する場合（"姓 名"と"名 姓"みたいな）はレーベンシュタイン距離よりいい塩梅に判定できているようです。
どう標本するかは一考の余地があるかも。
Groongaで学ぶ全文検索2016-03-11


# 実運用を想定した全文検索

ショッピングサイトを例にする
以下のような構成のサイトに全文検索を導入する場合
全文検索用にMySQLのスレーブを増やしMroongaを利用する形にすると、
データの登録について考える必要が無くなり手軽に全文検索を開始できる
※MroongaはMySQLのプラグインとして動的にロードして利用することができる
GroongaをベースとしたMySQLのストレージエンジン

```
管理画面商品登録
↓
MySQLにデータ格納
↓
API
↓
サイトに商品表示
```

goodsテーブル

|id|name|kana|explain|
|---|---|---|---|
|1|ひこ孫 純米吟醸7号酵母版|ひこまごじゅんまいぎんじょうななごうこうぼ|このひこ孫純米吟醸には２つのバージョンがあり、これは７号酵母版です。華やかさはなくても、しっとりと落ち着いた味わいが７号酵母の特徴。そして、お燗にして味わいが広がるのも、７号酵母の特徴です。神亀の個性はありながらも、しっとりと落ち着いた味わいは、幅広い料理を受け止めてくれます。一般的には9号酵母版が出回っていますが、これは蔵元さんが「俺の晩酌用に造るんだ」とのことで、お気に入りの7号酵母で造られています。|
|2|ひこ孫 純米吟醸9号酵母版|ひこまごじゅんまいぎんじょうきゅうごうこうぼ|このひこ孫純米吟醸には２つのバージョンがあり、これは９号酵母版です。最近の神亀には驚かされますが、これもその一つ。以前の神亀からは想像も出来ないような、品のある味わいです。とはいえ、神亀らしい旨味とコクはそのまま残っていますが、開けたてよりも一週間ほど放置すると、米の旨味はそのままでシャープな味わいが出てきます。冷やはもちろん、お燗もお勧めです。|
|3|天遊琳 秘蔵純米古酒 2003|てんゆうりんひぞうじゅんまいこしゅにせんさん|時を超えた優しい古酒の米の旨みに癒されます|


## ユーザーが探したいものをわかっている場合


例)
日本酒の特定銘柄(今回の例では神亀酒造のひこ孫)が欲しいユーザー
→入力フォームに欲しいキーワードを入力させる
 その際には下記のようにBOOLEAN MODEを利用する(*D+でand検索)

```
SELECT * FROM goods WHERE MATCH(name) AGAINST("*D+ ひこ孫 酒造" IN BOOLEAN MODE);
```

SELECT * FROM goods WHERE MATCH(name) AGAINST("*D+ {ユーザーの入力}" IN BOOLEAN MODE);

* 入力フォームに「ひこ」と入力したら「ひこ孫」と入力補完する機能もMroongaでできる<BR>


## ユーザーが探したいものをわかっていない場合
例)
日本酒が欲しいけれど何が欲しいかわからないユーザー向け
→商品説明を類似文書検索し似ている商品を出す
その際は下記のようにNATURAL LANGUAGE MODEを利用する。

```
SELECT * FROM goods WHERE MATCH(explain) AGAINST("{見ている商品の商品説明}" IN NATURAL LANGUAGE MODE);
```
* NATURAL LANGUAGE MODEを利用すると<BR>
1)重要そうなトークンの上位N件を抽出<BR>
2)ORで検索<BR>
3)重要なものが多く含まれる文書を似た文書と判断して上位に表示<BR>
というような処理で類似文書を検索できる
* 重要そうなトークンの判断には含まれている文書が少ないものが重要と判断している
* 転置インデックスからトークンが含まれる文書数を取得している
* 類似文書検索をする場合にはトークナイザーにMecabを利用すること<BR>
→自然な日本語で区切らないと大事なキーワードがわからなくなるため<BR>
例)<BR>
「日本酒万歳」をバイグラムでトークナイズすると<BR>「酒万」と意味が通じない単語もでてきてしまうが「酒万」が存在する文書が少ないと<BR>重要なトークンとして判断されてしまう<BR>
日本<BR>
本酒<BR>
酒万<BR>
万歳<BR>
手っ取り早くマテリアルデザインアイコンをアプリで使う方法

Navigation Drawerなどにアクションアイコンを表示するとき、いちいちサイズごとにアイコン用意するの面倒ですよね。android.R.drawableのアイコンを手っ取り早く使えたらいいのに、、、そんな時、こんな方法があるそうです。他に良い方法あればコメントください。

- android-sdk/platforms/android-xx/data/res/drawable-yyyy からプロジェクトフォルダにコピーする。

- もしくは上記フォルダのアイコンを "@android:drawable/ic_xxxx" prefix で参照する（おそらく一番手っ取り早い）
例：`android:icon="@android:drawable/ic_menu_preferences"`

- Android Studioの"res > drawable"フォルダを右クリック -> "New > Vector Asset"画面を開き、「Icon」の横の「Choose」から生成したいアイコンを選択する

- [Android Asset Studio](http://android-ui-utils.googlecode.com/hg/asset-studio/dist/icons-actionbar.html)で生成する。ただしダウンロードが必要

###参考
- [マテリアルアイコン](https://design.google.com/icons/index.html)
- http://androiddrawables.com/ Lollipopまでのシステムアイコンが参照できるみたいです。
Google Apps Script で Spreadsheet にアクセスする方法まとめ

# スクリプトファイルの作り方
Spreadsheet にアクセスするスクリプトを作る方法は二つあります。

## 方法その1. Spreadsheet に紐付いたスクリプトを作る方法
Container Bound Script と呼ばれる Script を作る方法です。
Spreadsheet のファイルから、メニューの [ツール] -> [スクリプト エディタ] を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/117087/915c87b7-d12f-41f5-db75-f6b5f2e82dc3.png)

すると、雛形が置かれたファイルが作られます。
![image](https://qiita-image-store.s3.amazonaws.com/0/117087/b3caed91-3c7b-b5fc-e273-a2b3d6f4d06c.png)

## 方法その2. 独立したファイル（Spreadsheet に紐付いていないファイル）を作る方法
Google Drive のホーム画面から、[新規]ボタン -> [その他] -> [Google Apps Script] を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/117087/3de27304-7f0a-b495-98e8-f2357c8de073.png)

## 二つの違い
Spreadsheet に紐付けた場合は、共有範囲も Spreadsheet のファイルと同じになります。
独立したファイルを作った場合は、それぞれ個別に共有範囲を設定することができます。

「Spreadsheet には他人に書き込み権限を与えたいけど、スクリプトに書き込めるのは自分だけにしたい」という場合には、独立したファイルを作る必要があります。

その他の違いなど: 
http://qiita.com/soundTricker/items/4d04c97c499b22886dfd#2-3

# Spreadsheet ファイルへのアクセス

## 独立したファイル（Spreadsheet に紐付いていないファイル）の場合
```js
var spreadsheet = SpreadsheetApp.openById('<キー>');
```
キーは、URL https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxx/edit の xxxxxxxxxxxxxxxx の部分です。

## Container Bound Script の場合
```js
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
```
`getActiveSpreadsheet` は `getActive` でも同じです。

# sheet にアクセスする
（ `spreadsheet` は上記で取得した Spreadsheet です）

## 今開いているシートを取得

```js
var sheet = spreadsheet.getActiveSheet();
```

Container Bound Script の場合、Spreadsheet オブジェクト (例では `spreadsheet`) の取得をせずに

```js
var sheet = SpreadsheetApp.getActiveSheet();
```

も可


## シートを名前で指定して取得

```js
var sheet = spreadsheet.getSheetByName('<シート名>');
```

## 何番目のシートかを数字で指定して取得

```js
var sheet = spreadsheet.getSheets()[0];
```

参考: https://developers.google.com/apps-script/reference/spreadsheet/
NMeCabをExcelから召喚してみる


NMeCabComを使わない方法。
こんな具合に使えるよという例示にすぎません。

# 準備

* .NET Framework 4.0環境

* [Excel-DNA](http://excel-dna.net/)一式
   ExcelDna.xllは作成するdnaファイル名に合わせてNMeCabTest.xllに変更。

* [MeCab](http://taku910.github.io/mecab/)のインストール

* [libnmecab.dll](https://osdn.jp/projects/nmecab/)

# 呪文

以下をテキストエディタで作成して、上記のxllと同じフォルダに置いておくこと。

```csharp:NMeCabTest.dna
<DnaLibrary RuntimeVersion="v4.0" Name="NMeCabTest" Description="Using NMeCab" Language="CS">
<Reference Path="LibNMeCab.dll" />
<![CDATA[

using System;
using System.Text;
using NMeCab;

public class NMeCabTest
{

	public static string NMeCabParseTest()
	{
		try
		{
			string sentence = "行く川のながれは絶えずして、しかも本の水にあらず。";

			MeCabParam param = new MeCabParam();
			param.DicDir = @"C:\Program Files\MeCab\dic\ipadic";

			// NMeCab はクラス名が変更されている
			MeCabTagger t = MeCabTagger.Create(param);
			
			// 一気に結果をもらう
			string result = t.Parse( sentence );
			return result;
		}
		catch (Exception ex)
		{
			return ex.Message;
		}
	}
}
]]>
</DnaLibrary>
```

# 詠唱

ワークブックにNMeCabTest.xllをドラッグ＆ドロップして、「このアドインをこのセッションに限り有効にする」を選択しておく。

セルに数式として下記を入力。

```vbnet
=NMeCabParseTest()
```

パースした結果が取得できればOK。

# 追記

少し遊びやすくしてみました。

ExcelDna.xllはUsingNMeCab.xllにファイル名変更。

下記をテキストファイル(UTF-8推奨)で作成。

```csharp:UsingNMeCab.dna
<DnaLibrary RuntimeVersion="v4.0" Name="UsingNMeCab" Description="Using NMeCab" Language="CS">
<Reference Path="LibNMeCab.dll" />
<![CDATA[

using System;
using System.Text;
using NMeCab;

public class UsingNMeCab
{
    public static string NMeCabParse(string sentence)
    {
        try
        {
            MeCabParam param = new MeCabParam();
	        // 辞書のパスは環境に合わせること
            param.DicDir = @"C:\Program Files\MeCab\dic\ipadic";

            // NMeCab はクラス名が変更されている
            MeCabTagger t = MeCabTagger.Create(param);

            string result = "";
            MeCabNode node = t.ParseToNode(sentence);
            while (node != null) {
            	if (node.CharType > 0) result += node.Surface + "," + node.Feature + "\n";
            	node = node.Next;
            }
            
            return result;
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
}
]]>
</DnaLibrary>
```

セルに

```vbnet
=NMeCabParse("行く川のながれは絶えずして、しかも本の水にあらず。")
```

のように数式を入れると解析結果が文字列として返ってくるので、

```vbnet
Sub SplitResult(s As String)

    Dim i As Long, j As Long
    Dim tmp1 As Variant, tmp2 As Variant
    
    tmp1 = Split(s, Chr(10))
    For i = LBound(tmp1) To UBound(tmp1)
        tmp2 = Split(tmp1(i), ",")
        For j = LBound(tmp2) To UBound(tmp2)
            Cells(2 + i, 1 + j).Value = tmp2(j) ' 位置調整は好みで
        Next j
    Next i
    
End Sub
```

のようなマクロで分割表示できます。

解析結果を多元配列で返すようにすると、意外に後処理が面倒
http://qiita.com/acknpop/items/844b7e8d026fc08ccc7b
なので今回は合わせ技で。
Nutanix Acropolis HypervisorへのP2V

サーバー仮想化が出始めた頃ほどではありませんが、物理の仮想化環境への移行（P2V）についてのお問い合わせを頂くことがあります。

Nutanix Acropolis HypervisorへのP2Vに関して、Nutanix自身はツールの開発を行ってはいませんが、3rd partyのツールを使用することで比較的簡単にP2Vを行うことができます。

仮想化環境に慣れている人であれば、誰もが一度は使ったことがありそうな、あのツールを使って、実際にやってみました。

# 注意事項
以下の方法はNutanix公式のものではありません。お試しの際にはくれぐれも自己責任で…。

メモ書き程度ですが、ラボ環境でWindowsマシンを実際にP2Vした際の流れを書いておきます。

# 下準備
仮想環境へ移行したいマシンに、あらかじめAHV用のVirtIOドライバをインストールします。
移行作業を行う前にドライバを入れておくことで、移行先となるAHV上で、ゲストOSが正しいドライバを読み込めます。
なお、AHV用のVirtIOドライバはNutanixのポータルからダウンロードできます。
![download.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/7b003d89-a387-bb4f-7efd-724564b56e75.png)

ちなみに、 上の画像にはNutanix VirtIO 1.0.1 for Windows と
Nutanix VM Mobility 1.0.1 for Windows というものがありますが、前者が今回のP2Vで使用したVirtIOドライバ、後者はV2V用のパッケージです。
後者にも前者と同じVirtIOドライバが入っていますが、それに加えて他の仮想環境向けに入っている最適化ツール（＝VMware Tools）のサービスを自動的に止めたりするための機能が含まれています。

# P2Vツール
[VMware vCenter Converter Standalone](https://www.vmware.com/jp/products/converter)を使用します。
言わずと知れた、VMware社が無償で提供しているP2V/V2Vツールです。

VMware vCenter Converter Standaloneは、吸い出したマシンイメージに対して行う処理として、以下の2つを選択できます。

- VMware環境にVMとして直接デプロイする
- ファイルとして保存する(仮想マシン構成ファイル(.vmx)と仮想ディスクイメージ(.vmdk)が生成される)

Nutanixにインポートする場合はもちろん、後者の方法を使います。
直感的に使えるツールなので使い方の説明は省略しますが、かなり久しぶりに使った私でも特別な設定は一切不要でした。

↓こんな感じでファイルが出力されます。
![vmdk.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/819ae24e-23bd-4e92-5045-ad7ad6024587.png)


# インポートと起動
NutanixのImage Service機能を使います。操作はPrism UIやCLIから行えます。
AVHはvmdkファイルやvhdファイルをインポートすることができるので、VMware vCenter Converter Standaloneが出力したvmdkファイルも、もちろん簡単に取り込めます。

インポートが完了したら、VMを作成して取り込んだvmdkファイルをアタッチし、起動します。
初回ログオン時にVirtIOドライバが初めて読み込まれたことで再起動を求められます。
再起動が済めば、P2Vは完了です。

もうこの辺りは[V2Vする場合](http://qiita.com/shmza/items/8c19dff870b16495d095)と全く同じなので、ぜひそちらも参考にしてください。


以上です。
GAEがRuby対応したのでRubyチュートリアルをやってみた〜Hello World app〜

[Google App EngineがRubyとNode.jsのサポートを発表し](http://www.publickey1.jp/blog/16/google_app_enginerubynodejsgcp_next_2016.html)、Ruby版のチュートリアルが公開されました。
早速実践してみたので、実施内容を公開します。

## 最初に
[Rubyチュートリアルトップページ](https://cloud.google.com/ruby/)にある、[Make a Hello World app](https://cloud.google.com/ruby/getting-started/hello-world)と[Creating a Bookshelf App](https://cloud.google.com/ruby/getting-started/tutorial-app)を実施します。
Hello World appとは、DBを使用せずHello Worldとブラウザに表示する機能のアプリのことで、本記事ではこの作成に関する情報を記載します。
DBインスタンスを設定しDBを使用したwebアプリを使いたい方は、[GAEがRuby対応したのでRubyチュートリアルをやってみた〜BOOKSHELF APP〜](http://qiita.com/ebihara99999/items/e3b8ef059c3bc068cc9a)もご覧下さい。
実施したMacのOS、バージョンは以下の通りです。

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.10.5
BuildVersion:	14F1605
```

## Make a Hello World app
本アプリのチュートリアルに関しては、注意点のみ記載します。
### Before you begin
* プロジェクトのロケーションをアメリカにするよう書いてあるが、デフォルトで「us-central」なのでそのまま進めてOK。設定する場合、「us-central」「us-east1」「europe-west」があるので「europe-west」以外のロケーションを選択すれば良い。
* 課金を有効にする際、無料トライアルがあるので使った方が良い

### Run the app on your local computer 
* hellow-worldはruby:2.2.3が必要なので、インストールしておく。

### Deploy the app to Google Cloud Platform
* 認証情報の再設定  
gcloud preview app deploy時、gcloudコマンドを以前に使用したことがあり、認証情報を別に登録している人は以下のように認証情報の再設定を行う

```
# ブラウザが開くのでログイン処理を行う
$ gcloud auth login
Your browser has been opened to visit:
〜略〜
Saved Application Default Credentials.

You are now logged in as [YOUR-EMAIL@gmail.com].
Your current project is [<your-project-id>].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

$ gcloud config set project <your-project-id>
```

* デプロイ先URLの確認  
必ず、以下のようにデプロイ先のURLを聞かれるのできちんと確認すること

```
$ gcloud preview app deploy
You are about to deploy the following modules:
 - <your-project-id>/default (from [/PATH/TO/1-hello-world/app.yaml])
     Deployed URL: [https://<your-project-id>.appspot.com]

Do you want to continue (Y/n)?
```

* URLへのアクセス  
URLの規則は、「https://」 + 「your-project-id」 + 「appspot.com」となります。

# 参考
* https://cloud.google.com/ruby/getting-started/hello-world

追記：細かい表記を修正しました（3/26）。
Heroku×PHPでHello world!表示手順

herokuを使うとGitのレポジトリを手軽にWebサーバで公開しちゃうことができます。
レンタルサーバー使うよりお手軽ですね。

#事前準備
- <?php echo "Hello World!"; なindex.phpが入ったGitレポジトリ

Githubのレポジトリで試してみます。

#Heroku手順
##Herokuアカウント作成
[Heroku公式サイト](https://www.heroku.com/)からまずは会員登録します。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/110510/b655a07a-4e55-1884-db18-af00c847a83c.jpeg)

##Heroku Toolbelt導入
会員登録したらログインしてPHP GetStartedをクリック

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/110510/824c8122-4dd4-50ef-8e16-426705c008d7.jpeg)


Heroku Toolbeltのが出てくるのでをダウンロードしインストールします。

Heroku Toolbeltとはコマンドラインからheroku操作できるやつです。
インストールし終わりましたら、ターミナルで

```
＞ heroku login
Enter your Heroku credentials.
Email: Herokuアカウントのメアド
Password (typing will be hidden): Herokuのパスワード
Authentication successful.
```

でログインしましょう。

##Gitのレポジトリをダウンロード
こんな感じのただのHello worldを用意してリポジトリ作ってみます。
https://github.com/aoioooii/PHP_helloworld

使いたいレポジトリがローカルになかったらgit cloneしちゃいます。今回は私のレポジトリで試してみます。

```:ローカルにリポジトリない場合
git clone git@github.com:aoioooii/PHP_helloworld.git
cd PHP_helloworld
```

##アプリデプロイして公開
以下の手順ですすめます。

```
heroku create //herokuアプリ作成
git push heroku master　//herokuにプッシュ
heroku ps:scale web=1　//heroku起動
heroku open　//ブラウザで確認
```
composerない怒られるけどとりあえずおいておきます。
デフォルトだとnginxで動くようです。
Hello world!が表示されました。


こんな感じに手軽に公開できます。
Swift2.2になって非推奨になった文法と推奨コードまとめ

# この記事の目的
先日新しくiOS9.3とXcode7.3がリリースされSwiftはver.2.2となりました。この過程で非推奨になったコードがあり、既存のプロジェクトに関しては警告から自動で置換できますが、これから書くコードでいちいち書き直すのは面倒だと思うので備忘録的な感じで非推奨文法と推奨される書き方をまとめてみます。

といっても既存のコードで書いたことのあるものしかわからないのでまた新しいものがあれば随時更新します。

# インクリメント・デクリメント
Swiftにはこれまで基礎となっているC系言語の潮流にのって```number++```などのインクリメント・デクリメントがありました。しかしこれがSwift3で廃止されることが決定されたためSwift2.2から非推奨コードになっています。かわりに```number+=1```などを使いましょう。
またこれに伴ってC/C++やJavaなどに慣れている人には馴染み深いfor文の```for var i = 0; i < n; i++```という文法ももちろん非推奨となっています。```i++```を```i+=1```とすればもちろんいいのですがSwift2.2ではこの書き方が良くないということでSwiftならではの```for i in 0 ..< n```という書き方を採用することが推奨されています。

# selectorなど
Swift2.2で新文法として#selectorなどが導入されています。これにともなって```"function:"```のようなObjective-Cから継承された文法が非推奨となり代わりに```#selector(function(_:))```という書き方が推奨になりました。
ようはちゃんと普通のメソッドの形で書けるようになったということですね、これはわかりやすい気がする。

# AnyObjectについて
非推奨ではなくこちらはエラーが出るものですが```var array = [AnyObject]()```などのように宣言した配列に配列をaddしていったものの一番の子要素にアクセスする時今までは```array[0][0]```でよかったのですがSwift2.2から```(array[0] as! NSArray)[0]```などのように明示的にキャストしなければいけなくなったようです。おそらくAnyObjectが配列以外の場合も明示的にキャストする必要があると思われます。
flowtypeでのReact.Componentの型パラメータ

2017年9月23日時点で、最新版の型定義を持ってくれば、次のような定義になります。

```js
React.Component<Props, State = void>
```

DefinitelyTypedにある定義と同様の形式になっています。もはや迷うことはなくなったでしょう。

## 出典
`DefaultProps` を除去しているコミット
https://github.com/facebook/flow/commit/20a5d7dbf484699b47008656583b57e6016cfa0b#diff-5ca8a047db3f6ee8d65a46bba4471236R29

該当行
https://github.com/facebook/flow/blob/20a5d7dbf484699b47008656583b57e6016cfa0b/lib/react.js#L29



----

_以下の内容は古くなっています_

```js
React.Component<DefaultProps, Props, State> {}
```

[flowのDocsのReactのページ](http://flowtype.org/docs/react.html)には今のところ明記されていない。
(`<void, Props<...>, State<...>>`となっていて最初が不明)


TypeScript(DefinitelyTypedにあるd.ts)の場合は`<Props, State>`になっているので、移行の際は注意が必要。


## 出典
https://github.com/facebook/flow/blob/master/lib/react.js

http://sitr.us/2015/05/31/type-checking-react-with-flow.html


## 例

```js
// @flow
import React from 'react';

type State = {count: number};
type Props = {count: ?number};
type DefaultProps = Props;

class Counter extends React.Component<DefaultProps, Props, State> {
  state: State; // WTF

  constructor(props: Props, context: any) {
    super(props, context);
    this.state = {count: 0};
  }
  static defaultProps = {count: 0};
}
```
display: inline-blockで横並びにしたときにできるへんな隙間をなくす

親要素の `font-size` を　`0` にして、`inline-block` で並べる要素に `font-size` を指定します。

```html
<ul>
  <li>横に並べます</li>
  <li>横に並べます</li>
  <li>横に並べます</li>
</ul>
```



```css
ul {
  font-size: 0;
}

li {
  display: inline-block;
  font-size: 16px;
}
```
iOS, Android ではクリップボードへコピーするボタンの設置はできない…と言った方が良い

以下のような、ページ上にコピーするボタンを設置して動作させることができるかどうかを調査。

<img width="257" alt="Screen Shot 2016-03-25 at 18.48.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/26206/885f7421-1023-d756-e6b5-d7facab9aae2.png">

[clipboard.js](https://clipboardjs.com/) というライブラリがあるのでこちらの検証を行う。

検証用のページには既に clipbaord.js で作成されている方がいたのでお借りして調査。
http://qiita.com/inouet/items/26b93c5f5f4b65c05e00
http://inouet.github.io/sample_html/002.copy_clipboard.html

[Clipboard API](https://www.w3.org/TR/clipboard-apis/) はユーザーがコピーを実行する際のイベントを処理する為の API なので、確認対象にはしていません。

# 動作確認端末
- iOS 8.1.2: iPhone 6
- iOS 7.1.2: iPhone 4s
- Android 5.0.2: Xperia Z3
- Android 5.0: GALAXY S5 (SCL23)
- Android 4.4.4: Xperia Z3 Compact
- Android 4.1.2: Xperia A (SO-04E)
- Android 4.0.4: GALAXY S III (SC-06C)


# 検証結果
| 端末名 | ブラウザ | 結果 |
| --- | --- | --- |
| iOS 8.1.2 | Safari | ✕ |
| iOS 7.1.2 | Safari | ✕ |
| Android 5.0.2 | Chrome | ◯ |
| Android 5.0.2 | ブラウザ(更新適用済) | ✕ |
| Android 5.0 | Chrome | ◯ |
| Android 5.0 | S Browser | ✕ |
| Android 4.4.4 | Chrome | ◯ |
| Android 4.4.4 | ブラウザ | ✕ |
| Android 4.1.2 | AOSP ブラウザ | ✕ |
| Android 4.0.4 | AOSP ブラウザ | ✕ |
| Android 4.0.4 | Chrome(初期) | ✕ |
| Android 4.0.4 | Chrome (4.0 の最新版) | ◯ |

# 結論
iOS に関してはコピーできず(iOS版 Chrome も Webview なので同様に不可)、Android に関しては Chrome では動作確認できるが、
"ブラウザ" 名を冠したブラウザだと動作不可。

どうやらクリップボードをウェブページで書き換えることができるとセキュリティ的な問題で無効にされているようです。

# その他参考
http://www.terabo.net/blog/javascript-cannot-access-clipboard/
ElectronでGLSL用テキストエディタを作ってみた。その１

#イメージ（今後改良予定）
![スクリーンショット 2016-03-25 18.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/106081/c77605fc-9820-38be-0042-5780da4aa43a.png)


#動機
・Electronを勉強してみたい。
・Electronで入館システムを作りたい。そのための勉強
・シェーダーを勉強するのにいいエディタがあんまりない。
・ついでにReactも勉強したい。

#使用している環境、ライブラリ
####ライブラリ
・Electron([公式サイト](http://electron.atom.io/))
・Ace([公式サイト](https://ace.c9.io/#nav=about))
・React([公式サイト](https://facebook.github.io/react/))

####環境
・Atom
・Node.js
・（一部デバック）Chrome

#参考になったサイト
-[ソースコードのベースはここから](https://ics.media/entry/8401)
※editor.jsのonLoad()...を、onload = function(){}にしないと動かなかった。
なぜかこれから調べる。

-[Electron自体のことはここが分かりやすかった。](http://qiita.com/Quramy/items/a4be32769366cfe55778)
-[Dialogについては公式サイトのドキュメントが一番分かりやすい](http://electron.atom.io/docs/v0.30.0/api/dialog/)
-[Aceが神ライブラリだと分かった。](https://ace.c9.io/#nav=about)
-[配布の際はこれが一番分かりやすそう](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29)
-[Aceの解説、わかりやすい。](http://qiita.com/naga3/items/1bc268243f2e8a6514e5)

#今後
[React](https://facebook.github.io/react/)を使って、リッチなアプリケーションに仕上げる。

[ソースはこちら](https://github.com/Kajiyu/glsl_editor)
[C#] カーブフィッティング

# 目的
Levenberg-Marquardt法を使用して非線形最小二乗問題を解き、近似曲線を求める。

# 使用ライブラリ
フリーで使用できるLevenberg-Marquardt法のC#ライブラリは、

- [csmpfit](https://csmpfit.codeplex.com/) →[移転した](https://github.com/cureos/csmpfit)
- [Levenberg-Marquardt.NET](http://kniaz.net/software/LMA.aspx)

のふたつがみつかった。

csmpfitはC言語で記述されたライブラリを文法だけC#に変更したもののようで、オブジェクト指向的なコーディングにはなっていないようだったが、ライセンスがMITライセンスであることが明確になっている点がありがたい。そのため、こちらを採用した。
Levenberg-Marquardt.NETはドキュメントが整備されている点が優れている。しかし、フリーであると謳われているものの、ライセンスが明記されておらず、また、VisualStudio2013で記述されているため、使用するVisualStudioのバージョンの問題で採用できなかった。

# csmpfitの使用方法
## テスト関数の流用
csmpfitを使うにあたり、困ったのは、ドキュメントがどこにあるかわからないことだ。
しかし、幸運にも、テストが同梱されている。
MPFitLib.TestプロジェクトのTestMPFit.csがそれだ。

ここには、

- 一次関数へのフィッティングをおこなうTestLinFit
- 二次関数へのフィッティングをおこなうTestQuadFit
- ガウス関数へのフィッティングをおこなうTestGaussFit

が記述されている。
また、

- 二次関数へのフィッティング時にパラメータを修正するTestQuadFix
- ガウス関数へのフィッティング時にパラメータを修正するTestGaussFix

というテストも用意されている。
これらを参考にすれば、ドキュメントなしでもどうにかできそうだ。

## テスト関数以外に流用するコード
それから、このテスト関数を動かすため、テストプロジェクトにある、

- CustomUserVariable
- フィッティング対象となる関数

が必要になる。

前者は、CustomeUserVariable.csに記述されている。
後者は、ForwardModels.csに記述されているいくつかの関数から選ぶか、または、これらを参考に自分で記述することになる。
一次関数、二次関数については、そのまま流用できるだろう。
少し変更すれば、三次関数や一変数多項式が簡単に実現できる。
ただ、ガウス関数については、

```
y = N * exp(-0.5 * ((x - μ) ^ 2) / (σ ^ 2))  - a
```

のように、パラメータを4つ使用しているので、使用目的によってはこのままでは使えないかもしれない。


## フィッティングの実行
テストコードを流用して、だいたい以下のようになった。

```lang=CSharp
var v = new CustomUserVariable()
{
    X = ..., // double[]型、測定値のXの値を格納
    Y = ..., // double[]型、測定値のYの値を格納
    Ey = ... // double[]型、値はすべて0.5,要素数は測定値の数だけ
};

var p = new double[] {
    パラメータ0の初期値, 
    パラメータ1の初期値, 
    パラメータ2の初期値,
    ...};

var pars = new mp_par[p.Length];
for (int i = 0; i < pars.Length; i++)
    pars[i] = new mp_par();
var result = new mp_result(p.Length);

int state = MPFit.Solve(
    xxxxFunc, // 使用する関数
    v.X.Length,
    pars.Length,
    p,
    pars,
    null,
    v,
    ref result);
if (state >= 1 && state <= 4)
    // succeeded
    return p;
else
    return null;
```

# まとめ
csmpfitを使用することで、C#によってカーブフィッティングをおこなうことができた。
テスト環境では、数百のデータを1ミリ秒かかるかどうか程度でフィッティングが終了した。

Levenberg-Marquardt法は、必ずしも毎回収束するわけではないが、それでも最小二乗法を解く優れたアルゴリズムであり、実験結果をまとめたい方には使用場面が多いように思う。
自分でガウス・ニュートン法などをプログラミングするよりは、こうしたライブラリを活用して楽をしたい。
zabbix map用に自分でアイコンを追加する

zabbixで多數のホストを追加していくと作りたくなるのがNW MAP

日頃収集しているアイテムのデータをNW MAP上にアサインして一括で確認したり、
障害の発生箇所をzabbixのweb上から視覚的に見やすくしたり、
別途スクリプトを登録などしておけば、お目当ての機器上をクリックし簡単なコマンドが打てたり便利です

MAPの例
>![maps.png](https://qiita-image-store.s3.amazonaws.com/0/90309/01b28a4b-6bcc-21ee-575f-e519d846e117.png)
>引用元：https://www.zabbix.com/documentation/2.0/jp/manual/web_interface/frontend_sections/monitoring/maps
>

ただし、アイコンが標準で用意されているものは数もすくないし、
実機と同じ画像を使いたい方や、会社のマーク（そんな人いるか知りませんが）もいるのではないでしょうか。
頻繁に触る事も無く、忘れがちなのでインポートの手順をメモ。

###・zabbix特権管理者でログイン
![1.png](https://qiita-image-store.s3.amazonaws.com/0/90309/46594770-ea45-2feb-22f3-a7a212295119.png)

###・管理 -> 一般設定の順でたどる
![2.png](https://qiita-image-store.s3.amazonaws.com/0/90309/96ba779a-7443-8897-8851-edb8562485a4.png)

###・右端のプルダウンから、イメージを選択
![3.png](https://qiita-image-store.s3.amazonaws.com/0/90309/759a7504-5f77-d399-7b4a-c2087cedb2a3.png)

###・イメージを選択すると、現在登録されているイメージが全て表示されます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/90309/19f94472-da2c-5e35-3745-24580e23131f.png)

###・名前欄に名前をつけ、アップロードボタンを押しローカルからファイルを選択し追加ボタンを押す
　（JPEG,PNG）
![5.png](https://qiita-image-store.s3.amazonaws.com/0/90309/38ff8cb8-10a2-9620-c097-9d28d681a2bb.png)
なお、ファイルサイズは以下の設定により、MAXサイズが異なるのでアップロードできない場合は要設定

>アップロードファイルの最大値は、
>ZBX_MAX_IMAGE_SIZEの値（1024×1024バイト,または1MB）に制限されます。
>
>イメージのサイズが1MBに近く、MySQLの設定パラメータ max_allowed_packetが
>デフォルトの1MBである場合、イメージのアップロードは失敗する可能性があります。
>この場合、max_allowed_packet パラメータを増やしてください。 
>
>zabbix公式ドキュメントより

以上でNW MAP作成時に、初期から付属されているアイコン以外に追加ができる
なお、MAPでの背景用画像もアップロードできるらしい
ElixirのexrmライブラリのRPC機能

Elixirの[exrmライブラリ](https://hexdocs.pm/exrm/extra-getting-started.html)はプロジェクトのリリースを作成してくれるライブラリで、その中にRPCリモート呼び出し機能があります。この機能は動いているプログラム中の定義されている関数を呼び出すことができます。これはとても役に立つ機能で、例えば、一つの`gen_fsm`プロセス`A`があって、このプロセスは三つの状態`idle`, `calculating`, `paused`があるとして， 普段プロセス`A`は`idle`の状態で、イベントが送られてきたら、`calculating`に変わって，何かを計算し始めわけです。ある時に、手動でコマンドラインからイベントを送りたいです． この場合はもう一個の`Batch`モジュールを定義して、この`Batch`モジュールの中に`start/1`という関数を作成します． `start/1`関数に`gen_fsm:sync_send_event`を呼びだしてAプロセスにメッセージを送ります．`start/1`関数にKeyword listを渡したい場合，例えば、

`start([recalc: true, buckets: [{"key1", "value1"}, {"key2", "value2"}])`

上の引数は一つのKeyword Listで,問題は`OptionParser`使わずに， どうやってコマンドラインでこの複雑のkeyword listを渡すのでしょう。結論からいうと、こんな感じです。

`$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[[{'recalc', 'true'}, {'buckets', [{<<\"key1\">>, <<\"value1\">>},{<<\"key2\">>, <<\"value2\">>}]}]]."
options is  [recalc: true, buckets: [{"key1", "value1"}, {"key2", "value2"}]]
options is list true, length is 2`

以下は自分の少しずつ試した結果で、説明はなかかな難しいです。Elixirのモジュールを呼び出すときに`Elixir.`をつける必要があります。　参照できるリンク[ここに](https://github.com/bitwalker/exrm/issues/25)しかないようです。

```bash
$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "['1']."
options is  :"1"
options is atom true

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[\"1\"]."
options is  '1'
options is list true

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "\"1\"."
options is  49
options is integer true

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[\"1, 2\"]."
options is  '1, 2'
options is list true

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[\"{recalc: 2}\"]."
options is  '{recalc: 2}'
options is list true

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[\"[recalc: 2, only_buckets: [{key1, value1}, {key1, value2}]}\"]."
options is '[recalc: 2, only_buckets: [{key1, value1}, {key1, value2}]}'
options is list true, length is 59 <----このは59文字だけ

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[{'aaa'}]."
options is  {:aaa}
options is tuple true

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[[{'aaa', \"bbb\"}, {'ccc', \"ddd\"}]]."
options is  [aaa: 'bbb', ccc: 'ddd']
options is list true

$ rel/riakcscalc/bin/riakcscalc rpc Elixir.MyApp.Batch start "[[{<<\"aaa\">>, \"bbb\"}, {'ccc', \"ddd\"}]]."
options is  [{"aaa", 'bbb'}, {:ccc, 'ddd'}]
options is list true, length is 2  <-- 長さみて，ちゃんとリストとして渡している

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[[{<<\"aaa\">>, <<\"bbb\">>}, {<<\"ccc\">>, <<\"ddd\">>}]]."
options is  [{"aaa", "bbb"}, {"ccc", "ddd"}]
options is list true, length is 2

$ rel/my_app/bin/my_app rpc Elixir.MyApp.Batch start "[[{'recalc', 'true'}, {'buckets', [{<<\"key1\">>, <<\"value1\">>},{<<\"key2\">>, <<\"value2\">>}]}]]."
options is  [recalc: true, buckets: [{"key1", "value1"}, {"key2", "value2"}]]
options is list true, length is 2
```
CentOS 6.x系へのJenkins インストール

CentOS 6.x系にJenkinsをインストールした時に忘れそうだったのでメモ
Apatch(Nginx)とかはインストールされている前提。

## 事前準備

Jenkinsを動かすためにJDKをインストール

```
[root@jenkins ~]#yum install -y java-1.8.0-openjdk
```

```
[root@jenkins ~]#yum install -y java-1.8.0-openjdk-devel
```

```
[root@jenkins ~]#java -version
openjdk version "1.8.0_71"
OpenJDK Runtime Environment (build 1.8.0_71-b15)
OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode)
```

参考:[WEB ARCH LABO](http://weblabo.oscasierra.net/installing-openjdk7-on-redhat/ )

Gitと連携するのでGitも入れとこう。
ひとまず、yumで入れよう。

```
[root@jenkins ~]#yum install -y git
```

## Jenkins投入

jenkinsのリポジトリ追加してyumでjenkinsをインストール

```
[root@jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
```

```
[root@jenkins ~]# rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
```

```
[root@jenkins ~]# yum install -y jenkins
```

参考:[文系プログラマによるTIPSブログ](http://www.bunkei-programmer.net/entry/2014/06/11/233027)

## Jenkinsユーザでもbashを使えるようにする

変更前

```/etc/passwd
jenkins:x:495:496:Jenkins Continuous Build server:/var/lib/jenkins:/bin/false
```

変更後

```/etc/passwd
jenkins:x:496:497:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
```

## Jenkinsユーザでgitへアクセス

gitアクセス用にsshのキーを生成しgitに登録

```
bash4.1$ ssh-keygen -t rsa
```


Jenkinsとgitを連携させる際にknown_hostsに追加させていないとエラーに苦しみ辛いことになるので一旦cloneしてknown_hostsに追加する。
目的としてはknown_hostsに追加することなのでclone後に即座に消してもよい。

```
bash4.1$ git clone git@gitlab.com:{$user_name}/apps.git
```

## Jenkins起動

```
[root@jenkins ~]# service jenkins start
```
Realm - Cannot allocate memory size: xxx offset: 0'

### 遭遇したエラー

Realmを使っていて、以下のエラーに遭遇した。

```
*** Terminating app due to uncaught exception 'RLMException', reason: 'mmap() failed: Cannot allocate memory size: 603979776 offset: 0'
*** First throw call stack:
(0x181f5ee38 0x1815c3f80 0x1003fa84c 0x1003dbdd4 0x1003dc334 0x1003dce60 0x1003db150 0x100113520 0x100e01a7c 0x100e01a3c 0x100e10c9c 0x100e10364 0x181bc1470 0x181bc1020)
libc++abi.dylib: terminating with uncaught exception of type NSException
```

原因は、Realmのファイルサイズっぽい。公式にもちゃんと書いてある。

> 各Realmファイルのサイズは、アプリケーションごとにに割り当てられるメモリサイズを超えてはいけません。割り当てられるメモリサイズは、デバイスごとに異なり、実行時のメモリの断片化にも依存します。（詳しくは、rdar://17119975 をご覧ください）それ以上のデータを保存される場合は、Realmファイルを複数に分割してください。

抜粋 : [現バージョンにおける制限事項](https://realm.io/jp/docs/objc/latest/#section-47)

### ファイルのサイズを調べる

ファイルの情報は、 NSFileManagerの `
- attributesOfItemAtPath:error:` メソッドを使えばファイルの情報を調べることができる。

```objc
NSString path = [RLMRealm defaultRealm].path;
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];

NSLog(@"attributes : %@", attributes);
```

出力結果がこちら

```
{
    NSFileCreationDate = "2016-03-25 00:04:17 +0000";
    NSFileExtensionHidden = 0;
    NSFileGroupOwnerAccountID = xxx;
    NSFileGroupOwnerAccountName = xxx;
    NSFileModificationDate = "2016-03-25 05:18:13 +0000";
    NSFileOwnerAccountID = xxx;
    NSFileOwnerAccountName = xxx;
    NSFilePosixPermissions = xxx;
    NSFileProtectionKey = NSFileProtectionCompleteUntilFirstUserAuthentication;
    NSFileReferenceCount = 1;
    NSFileSize = 603979776;
    NSFileSystemFileNumber = xxx;
    NSFileSystemNumber = xxx;
    NSFileType = NSFileTypeRegular;
}
```

NSFileSizeが、ファイルのサイズをbyteで表している。

`[attributes valueForKey:NSFileSize];`

* [NSFileManager Class Reference - attributesOfItemAtPath:error:](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/doc/uid/20000305-SW2)
* [NSFileManager Class Reference - File Attribute Keys](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/doc/uid/20000305-SW2)

しかし、 603979776 は bytesなので 576MB。そんなにデータ入れたかなぁ...。
卒業シーズンなのでやらかしたなって出来事を思い出してみよう

レミオロメンが活躍するシーズンですね。もう結構立ってるけど。
社会人になると3月とか4月にあんまり特別な意味がなくなる気がします。

なので、これまでに失敗したな〜とインパクト強めに残っていることを、なんとなく思い出しながらまとめてみようと、ふと思いついたので、まとめてみます。
思いついたままに書くので粒度とか揃ってないのはご了承ください。

# 開発

### ルールを明文化しなかった

よくあるコーディングルールだとか、開発中に見つけた都度リファクタリングすべきなのか、とか、そういうことを明文化せずに進めてしまって、コードレビューの工数が肥大化。
インデントのずれとか微妙なところを直す人と直さない人が混在して、直したがゆえに、どこが本質的にレビューすべき箇所かわからなくなる。
また、宗教論争が多発。正直スネークケースでもキャメルケースでもどっちでもいいです、統一されてれば、みたいに思って決めてないと、なんでこっちじゃいけないんだみたいな話になったり色々面倒。
明文化されていないからフィードバックの正当性があまりなくて納得感が低い感じになる。

### 役割を明確化しなかった

誰がどの範囲をカバーして、どこまでについて決定権を持っているのか曖昧にしてしまったために、指揮系統がぐちゃぐちゃになって、同じ人に対して4人ぐらいが仕事の依頼してるみたいなことが発生。
誰の言うこと聞けばいいかわからない状態が蔓延。
船頭多くして船が山登ったみたいです。

# リリース

### 本番作業手順の改行位置がずれてて事故

これは完全に具体的に起きた事故の話。
たまたま作業手順の改行位置が

```bash
$ rm -r /
tmp/hogehoge.dump
```

みたいになってしまっていて、作業員が盲目的に手順書をコピペしてエンターしてたもんだから、本番が破壊されて大事件に。

### リリースバッチトランザクション貼り忘れ事故

1回だけ使うリリースバッチの途中で、特定テーブルをtruncateする処理が入っていて、運悪く、その直後にメモリ枯渇して死亡。
綺麗に1テーブルのデータが消える事故に。
ちゃんとトランザクション貼る＋ダンプとってからtruncateするとか対応が漏れていた。

# テスト

### カバレッジ崇拝による工数肥大化

djUnitが登場した頃に採用してみたものの、「カバレッジ100%を担保する」という謎の一文をSLAに入れてしまったために、テストを通すためのテストコードが横行。
100%にしなきゃいけないんで無駄に工数がかかる上に、すごいどうでもいいテストコードが大量に生まれた。

# 運用

### 古いwebサーバーを追加して事故

高負荷対策のために追加したwebサーバーが1台あって、負荷が落ち着いたので一旦ロードバランサーから切り離していて、次の負荷対策の時に再び追加。
切り離した間、切り離したwebサーバーへはモジュールのリリースを行っていなかったことを忘れてそのまま運用。
しかも急にたまに404したり、500したりするんで、原因特定までにやたら時間がかかる。

### 追加したwebサーバーのメモリの型が違って事故

数年運用していて、久々にwebサーバー増強したら、急にそのwebサーバーにつながったときだけちょこちょこ落ちる事件が発生。
結果、追加したサーバーのメモリが最新のもので、それが原因で死んでいた。
これも、原因特定にえらく時間がかかった。

### エラーハンドリングしてなくて大事故

DB１０台ぐらいの構成になってるとこで、そのうち3台が落ちる事故が発生。
ところが反応なくてもアプリが落ちない状態になってしまっていて、
落ちていないDBからデータ取得して、落ちてるDBにINSERT（落ちてるからINSERTされない）。アプリはDBが落ちていることに気づかず、落ちていないDBの取得済みデータをDELETEというカオスな状態に。
復旧までに三日三晩コース。
ScalaのDispatchで日本語文字列をPOSTすると文字化けしたのを解決したときのメモ

すごくはまったのでメモ

ScalaのDispatchを使って日本語文字列をPOSTすると、送信する時点で```????????```となってしまい大いに悩みました。

たくさんぐぐって以下のサイトで解決することができました。

[dispatch使ったbotで日本語文字化けしていた件](http://totem3.hatenablog.jp/entry/2014/01/22/075351)

結論2つの文字コード指定が必須みたいです。

* ``Content-Type``に文字コードを指定すること
* urlから生成されたオブジェクトに``subject.underlying { _.setBodyEncoding("UTF-8")}``を指定すること

```scala
def getGeonlp(kw: String): String = {
    val svc = url("http://example.com/hoge.php").POST
        .setBody("""{"method":"parse", "params":["""" + kw + """",{"geojson":true}], "id":0}""")
        .setHeader("Accept", "application/json")
        .setHeader("Content-Type", "application/json; charset=utf-8") // このcharsetが必須
    svc.subject.underlying { _.setBodyEncoding("UTF-8") } // この行が必須
    val future = Http(svc OK as.String)

    val f = future()
    println(f)
    println(f.length)
    f
}
```
CloudWatchのAlermをLambda通じてchatworkにPOSTする


インフラの監視、してますか？

僕が管理しているサービスは、Zabbix使っているので基本そちらでコントロールすればいいんですが、そこまでじゃない＆カジュアルにやりたいときにはCloudWatchを使いたくなります。CloudWatchは設定が非常に簡単で、Alermの通知先もメールやSNSが設定できてとても便利です。

というわけで今回はELBを監視して、問題があればchatworkにPOSTするようにしてみました。

注意点として、chatworkのAPIはリクエストヘッダに`X-ChatWorkToken`というAPIキーを埋め込む必要があるため、SNSから直接HTTPSポストはできません。そこでAWS Lambdaの登場です。SNSからの通知をいったんLambdaで受け取って、chatworkAPIへPOSTする流れです。

![Untitled Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/2152/e91ec32b-a827-3c25-2494-d88943e8e320.png "Untitled Diagram.png")


### AWS Lambdaスクリプト

requestモジュールはzipで上げないといけないので、httpsモジュールを使用しています。

```
var https = require('https');
var querystring = require('querystring');

exports.handler = function(event, context) {
  var message = JSON.parse(event.Records[0].Sns.Message);
  var state = (message.NewStateValue == 'ALARM') ? 'error' : 'ok';
  
  var post_message = "(" + state + ")\n"
   + "[code]\n"
   + message.NewStateValue + "\n"
   + "\n"
   + message.AlarmName + "\n"
   + message.AlarmDescription + "\n"
   + message.NewStateReason + "\n"
   + "[/code]\n";
  
  var postData = querystring.stringify({
    body: post_message
  });
  
  var options = {
    host: 'api.chatwork.com',
    port: 443,
    method: 'POST',
    path: '/v2/rooms/【部屋ID】/messages',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': postData.length,
      'X-ChatWorkToken': '【APIキー】'
    }
  };
  
  var req = https.request(options, function (res) {
    res.on('data', function (d) {
      process.stdout.write(d);
    });
    res.on('end', function () {
      context.done();
    });
  });
  
  req.on('error', function (err) {
    console.log(err);
  });
   
  req.write(postData);
  req.end();
  
};
```

【部屋ID】と【APIキー】を適宜変更してください。

また、SNSからの通知メッセージを1件しか取得していなかったり、エラーハンドリングしてなかったりのザルなスクリプトですが、最小限これで動くようになると思います。

### CloudWatchの設定イメージ

![cloudwatch_config.png](https://qiita-image-store.s3.amazonaws.com/0/2152/67bbde90-5f78-ef03-a393-ebbf36f56008.png "cloudwatch_config.png")

### AWS SNSの設定イメージ

![sns_config.png](https://qiita-image-store.s3.amazonaws.com/0/2152/37583e57-7aa2-3e91-832e-937b65117d01.png "sns_config.png")

### chatworkイメージ

こんな感じでPOSTされます。

![chatwork_sample.png](https://qiita-image-store.s3.amazonaws.com/0/2152/751810d0-9296-0fff-a879-8b290ebd6319.png "chatwork_sample.png")

これで安心して夜も眠れますね。
hubotでcron風に特定の時間に処理を実行させる方法


## はじめに

今回の例では、特定のチャットの部屋(slackだとchannel)へメッセージを送信しリマインダとしての役割を実装する。

※注意　ここでは、hubotとslackの連携方法やサーバで実行する方法等は記載していない。


## 動作確認環境

普通にhubotが動いていて、各アダプタでチャットツールと接続していればhipchatでも動くと思われる

* node.js version v5.9.1
* hubot version v2.12.0
* hubotのホスティング先はheroku
* slack アダプタを利用し、hubotとslackが連携している

## 実装コード及び解説

package.jsonにcronを追加する

```package.json
{
  "name": "xxxxx",
  "version": "0.0.0",
  "private": true,
  "author": "xxxxx",
  "description": "A simple helpful robot for your Company",
  "dependencies": {
    "hubot": "^2.12.0",
    "hubot-diagnostics": "0.0.1",
    "hubot-google-images": "^0.1.4",
    "hubot-google-translate": "^0.1.0",
    "hubot-help": "^0.1.1",
    "hubot-heroku-keepalive": "0.0.4",
    "hubot-maps": "0.0.2",
    "hubot-pugme": "^0.1.0",
    "hubot-redis-brain": "0.0.2",
    "hubot-rules": "^0.1.0",
    "hubot-scripts": "^2.5.16",
    "hubot-shipit": "^0.2.0",
    "hubot-slack": "^3.3.0",
    "hubot-youtube": "^0.1.2",
    "cron": "^1.1.0" //追加
  },
  "engines": {
    "node": "x.x.x"
  }
}
```


scripts/cron.coffeeと言うファイルを作り、以下のようなコードを書く

```coffee
# 定期処理をするオブジェクトを宣言
cronJob = require('cron').CronJob


module.exports = (robot) ->

  # 特定のチャンネルへ送信するメソッド(定期実行時に呼ばれる)　
  send = (channel, msg) ->
    robot.send {room: channel}, msg

  # Crontabの設定方法と基本一緒 *(sec) *(min) *(hour) *(day) *(month) *(day of the week)
  # #your_channelと言う部屋に、平日の18:30時に実行
  new cronJob('0 30 18 * * 1-5', () ->
    # ↑のほうで宣言しているsendメソッドを実行する
    send '#your_channel', "@here そろそろ帰る準備をしよう"
  ).start()

  # #your_channelと言う部屋に、平日の13:00時に実行
  new cronJob('0 00 13 * * 1-5', () ->
    send '#your_channel', "@here ランチの時間だよ！！"
  ).start()
```

これで、平日18:30と13:00にslackのyour_roomと言うchannelへ、その部屋を見ている人へメンション付きのメッセージが飛ぶようになる
Azure Mobile Apps を利用して Androidアプリ開発　その１



Azure Mobile Apps とは俗にいうmBaaSです
これを利用すると、自動でToDoアプリを作ってくれます。
それらはネットで調べるとたくさん出てくるのですが、応用方法の記事が少ないです。
これじゃあ仕組みがわからない…！というわけで、Azure Movbile Appsを利用したアプリケーションを手探りしながら１から書いてみることにしました。
間違っているところもあるかと思いますので、ご指摘いただけたらと思います。

その１ではAzure Mobile Appsを作成します。
まずはAzureに登録する必要がありますが、それに関してはたくさん良い記事がありますので割愛します。

[その２](http://qiita.com/maehara08/items/dce229b431d6e498cf92)では、掲示板風アプリを作っていきます。

## Azureポータルでインスタンスを作る
まずはAzureポータルに行きましょう。
### リソースグループの作成
で、リソースグループを作成しましょう。
![リソースグループ](https://qiita-image-store.s3.amazonaws.com/0/93802/28468ead-3a6b-23a5-0f4a-9b243b4513fd.png )

リソースグループを作成することで、SQLやアプリ本体が一つにまとまり、管理しやすくなります。

### Mobile App 作成
新規 -> Web+Mobile -> Mobile Apps の順に進んで
![Mobile App2016-03-25 16.26.27.png](https://qiita-image-store.s3.amazonaws.com/0/93802/1f53994a-1d37-c9ae-69bb-7d982607064a.png)

アプリを作成しましょう。
AppNameは、自由に。これがアドレスになります。
リソースグループは先ほど作成したものにしましょう。

デプロイが完了するまで少し待ちましょう。

### SQL データベースの作成

次にアプリで使用するSQLデータベースの作成をします。
![aa](https://qiita-image-store.s3.amazonaws.com/0/93802/2f4819eb-ca50-e9f1-5825-858b375b0f80.png )

追加をしましょう。
![ab](https://qiita-image-store.s3.amazonaws.com/0/93802/14662a0f-7704-811b-05a9-5444543d2c4f.png)

名前は好きな様に。サーバーは新規で作成しましょう。リソースグループも忘れずに追加しましょう。

### クイックスタート
App Serviceから先ほど作成したアプリの設定を行います。
![ac](https://qiita-image-store.s3.amazonaws.com/0/93802/2f77efd6-fb35-8ca1-30a6-37b976c01a6f.png)




作成したアプリの tools -> Mobile Apps -> Android
で進むと、このような画面になるはずです。


![ad](https://qiita-image-store.s3.amazonaws.com/0/93802/1f6c88b5-0d67-5634-7563-003119ea60d3.png )



1は、Addで先ほど作成したデータベースを使用しましょう。先ほど決めたUsername　とパスワードを使います。
2は任意で、自動でToDoアプリのためのテーブルを作ってくれます。
3はConnect an exsisting app で、Azure Mobile Appと通信する用のライブラリ(Mobile Apps 向け Android クライアント SDK)がダウンロードできます。

![as](https://qiita-image-store.s3.amazonaws.com/0/93802/35ec06e9-a939-bb5c-39e8-6230389631d9.png )


解凍してプロジェクトのlibsに突っ込めばいい感じですね。

### 準備完了
これでAzure Mobile Appを使う準備ができました。
先ほどダウンロードしたMobile Apps 向け Android クライアント SDK を使用して、通信周りを実装することになります。
[その２](http://qiita.com/maehara08/items/dce229b431d6e498cf92)に続く！