OmniAICreator/Qiita-1.07M huggingface dataset:
webアプリケーションの脆弱性-XSS(クロスサイトスクリプティング)とは

Webアプリケーションの脆弱性の中で最も問題視されているのが、クロスサイトスクリプティング（以下、XSS）です。
XSSとは、html中に特殊記号を含むスクリプトタグをユーザーが入力できるフォーム等に書き込むことで、任意のスクリプトが実行され、ユーザーのなりすましやセッションハイジャックを行う攻撃のことです。

例えば、、、、

下記のような入力フォーマットに書き込むと書き込み欄の下部にその書き込み内容が表示される掲示板サイトがあったとします。

![xss.png](https://qiita-image-store.s3.amazonaws.com/0/103390/a92a0ab0-c67a-3237-00cf-d87bb4d64e50.png)



この掲示板にXSSの脆弱性を発見した攻撃者が以下のようなスクリプトタグを書き込みます。



```lang:filename
<script>
window.onload=function(){
	location.href="http://otomeshinto.com/?aid=282";
};
</script>
```


このスクリプトはこのページがロードされた時に、スクリプトで指定されたサイトへ飛びます。
書き込み後は、、、、


![xss1.png](https://qiita-image-store.s3.amazonaws.com/0/103390/cac2f3c7-67c5-3ef1-c698-5e140e3d9913.png)

となり、スクリプトタグがhtml中に埋め込まれてしまったため、
実際に書き込んだ内容が表示されておりません。
この書き込み後、当該ページをリロードすると、スクリプトで指定した
http://otomeshinto.com/?aid=282
のページに強制的に飛ばされてしまいます。

これがXSSの原理です。

書き込んだスクリプトタグはエスケープ処理をしないと、
ただの文字列として認識されず、
JavaScriptとしてhtml上に埋め込まれてしまって、
JavaScriptが実行され指定された別ページに飛んでしまうのです。

これぐらいであれば可愛いものですが、
個人情報を扱うサイトでこのような脆弱性が発見された時、
このxssの脆弱性によって、情報漏えいの問題があり、甚大な被害となります。


具体例-フィッシング・情報漏えい

あるXSSの脆弱性を孕む「ネットショッピングサイト」があったとします。攻撃者が事前に商品を決済する際に当該ネットショッピングサイトに似た偽サイトの決済ページに誘導するようなスクリプトタグを埋め込みます。
例えば以下のようなスクリプトタグです。

```lang:filename
<script>
window.onload=function(){
	location.href="偽サイトの決済ページ";
};
</script>
```
偽サイトの決済ページでは名前、送り先住所、メールアドレス、電話番号、クレジットカード番号等の個人情報の入力欄があり、ユーザーは偽ページであると気づかずにそのまま個人情報を入力すると攻撃者に個人情報を抜き取られてしまします。このように個人情報やクレジットカード番号が抜き取られると、見覚えのない膨大な請求がくる等の問題になります。


では、どのような対策があるか。
さっと記述します。

・危険文字（<,>,",',&等）をエスケープする
上記の危険文字を文字列として認識させる処理をします。
スクリプトタグの埋込みをさせないようにします。

・入力値チェックを行う（サーバー側で）
そもそも危険文字が入力されようとした際には弾くようにします。
サーバー側でと明記したのは、クライアント側の入力値チェックだと、
例えば、javascriptはwebブラウザの設定で無効にできるためです。

・フレームワークを活用する
全てのパラメータで入力値チェックを行うのは大変で漏れる可能性がある。
そのため、フレームワーク等の活用で低コストで対策を行うことができる。


上記、ざっくりと対策を記述しましたが、
XSSは対策上限界があるのも事実です。
それはエスケープしてはならない場面があることや制限をかなり課した入力値チェックはユーザービリティーを損ねてしまい、ユーザーの業務効率の低下を招く恐れがあるためです。ビジネスルールを明確にし、的確な対策を行うことが大切です。
Hour of Code 2015

# はじめに

今年(2015年)も12/7～12/13の一週間にわたってHour of Codeが開催されます。
私自身はイベントの関係者ではありませんが、子供たちがコンピュータサイエンスについて学ぶよい機会だと思いますので紹介したいと思います。

この記事を見て下さっている方の多くはすでにプログラミングに慣れている方かと思いますが、チュートリアルを試してみると、『こうやってプログラミングを教えることができるのか！』という発見もあるかと思います。

また、お子さんがいてプログラミングを学んでほしいと考えている方にとっては、Hour of Codeは良いきっかけになると思います。子供と過ごす時間のうちの1時間を、Hour of Codeで一緒に遊んでみるのはいかがでしょうか。

# Hour of Codeとは
2013年からはじまった毎年12月に開催されているコンピュータサイエンス教育週間のことで、これまでに世界中の子供から大人まで数千万人もの生徒が参加しています。1時間で学ぶチュートリアルが多数用意されていて、幼児から大人まで誰もが楽しみながらプログラミングについて学ぶことができます。
https://hourofcode.com/jp

[![Hour of Code 2015 - WORLDWIDE](http://img.youtube.com/vi/2DxWIxec6yo/0.jpg)](http://www.youtube.com/watch?v=2DxWIxec6yo "Hour of Code 2015 - WORLDWIDE")


# チュートリアル

今年、新たに追加されたチュートリアルをいくつか紹介します。

## Star Wars: Building a Galaxy with Code
[![Star Wars - Hour of Code: Introduction](http://img.youtube.com/vi/vNjiHkQQl6A/0.jpg)](http://www.youtube.com/watch?v=vNjiHkQQl6A "Star Wars - Hour of Code: Introduction")

https://code.org/starwars
12/18から映画「スター・ウォーズ　フォースの覚醒」が公開されますね。
『BB-8』と呼ばれるドロイドをプログラミングで動かして、銀河をつくっていきます。

## Minecraft Hour of Code
[![Minecraft - Hour of Code: Intro](http://img.youtube.com/vi/55jADN4Y7Pg/0.jpg)](http://www.youtube.com/watch?v=55jADN4Y7Pg "Minecraft - Hour of Code: Intro")

https://code.org/mc

まだMinecraftを楽しんだことがない方でも、このチュートリアルを通じてMinecraftの世界を体験できるかと思います。『Steve』か『Alex』を選んで、掘ったり建てたりするプログラミングを組んでいきます。
.net MVC とAdminLTE-2.3.0を使ってスマートでリッチな画面を作る [ 前準備 ]

[★若葉組のつぶやき★ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/adv_young_leaves) の3日目を担当します！

BootstrapのAdminLTE-2.3.0を.netMVCへ組み込みます。
<img width="600px" alt="P001.png" src="https://qiita-image-store.s3.amazonaws.com/0/91552/1d5d99f3-55df-41d6-1c7e-a89193067c1a.png">
AdminLTE-2.3.0 の入手は[こちら](http://almsaeedstudio.com/)
AdminLTE-2.3.0 を触ってみるなら[こちら](http://almsaeedstudio.com/preview)
##構築環境
・AdminLTE-2.3.0
・Visual Studio 2015
・.NET Framework4.6
・.NET MVC5

##前準備その１　Visual Studioで新しいプロジェクトの作成
・「C#」で「ASP.NET Webアプリケーション」を選択
・テンプレートは「Enpty」を選択
・フォルダおよびコア参照は「MVC」「Web API」にチェックを入れる
<img width="600px" alt="1202_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/91552/4698f6e6-76d0-f891-e3a4-38f8c14e73ba.png">

##前準備その２　コントローラーとビューの準備
・コントローラー→ビューの順でファイルを作成
・コントローラーを作成→「MVC5コントローラー空」を選択
・コントローラー名は「Home」
・自動生成された「Home」フォルダにビューを作成
・ビュー名は「Index」で、「レイアウトページの使用」のチェックはそのまま。
※ビューを作るとスタイルシートやスクリプトファイルが自動生成されますが、今は無視します。
そのまま実行するとこんな感じになります。
![1202_04.PNG](https://qiita-image-store.s3.amazonaws.com/0/91552/909a1e7c-0eee-f84c-4bd6-8beab0b16da1.png)


##前準備その３　bootstrap サンプルの準備
AdminLTE-2.3.0をローカルにダウンロード/解凍しておきます。


次回は[組み込み編](http://qiita.com/Chitama/items/551fca249ee08ebd66fe)
Realmでプライマリキーをauto incrementっぽく作る

[アプリ道場 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/app-dojo)の4日目は、こたら[@kotala_b](https://twitter.com/kotala_b)です。
Realmのプライマリキーの作り方について書いていきます。
## プライマリキーって？
プライマリキーというのはOracleやMySqlといった[リレーショナルデータベース](https://ja.m.wikipedia.org/wiki/関係データベース)(RDBMS)で使われている、一意性を保証するためのものです。
Realmでももちろんこのプライマリキーを設定できます。
Realmでプライマリキーを設定するにはこのようにします。

```
class Person: Object {
    dynamic var id: Int = 0
    dynamic var name: String = ""
    
    override static func primaryKey() -> String? {
        return "id"
    } 
}
```

RDBMSにはauto incrementと言って、プライマリキーに入れる一意性のある値を自動的に作ってくれる機能があるのですが、Realmにはありません。(v0.96.2時点)
なので、Realmではプライマリキーに入れる値を作る仕組みを自分で用意しなければなりません。
## Realmのプライマリキーを作る
プライマリキーの作り方の1つとして「0から順に数値を採番し、保存されているプライマリキーの最大値に+1した値を新しいプライマリキーとして設定する」というような作り方が考えられます。


```
class MyRealm {
    
    var maxId: Int { return try! Realm().objects(Person).sorted("id").last?.id ?? 0 }
    
    func createNewPerson(name: String) {
        
        let person = Person()
        person.id = maxId + 1
        person.name = name
        
        let realm = try! Realm()
        try! realm.write{ realm.add(person) }
    }
}
```
上のコードでは、複数のスレッドで実行したときに正しく採番されない可能性があります。
それにmaxIdがふられてるデータを削除したら次に作ったデータにまた同じidがふられたりもするので、プライマリキーの採番を別のところで管理しないといけません。
ちょっと面倒くさそうです。
## スレッドセーフなプライマリキーを作る
じゃあどうするの？ってことなんですけど、UUIDを使います。
UUIDというのは、
>先人たちはUUIDという便利なものを用意してくれてCocoaにもしっかりと用意されているので、iOS、Objective-C、Swiftで識別子を作りたいときはこれを使いましょう
>http://qiita.com/mo_to_44/items/9e41b6aba0c6898d373d

UUIDを都度生成すれば、複数スレッドで実行していても問題ありません。
プライマリキーにUUIDを使うとなると、連番ではなくなり、型もIntではなくなるのでそこだけは注意が必要です。
はじめのコードをUUIDを使ったカタチに書き直すとこうなります。

```
class Person: Object {
    dynamic var id: String = ""
    dynamic var name: String = ""
    
    override static func primaryKey() -> String? {
        return "id"
    }   
}

class MyRealm {    

    func createNewPerson(name: String) {
        
        let person = Person()
        person.id = NSUUID().UUIDString
        person.name = name
        
        let realm = try! Realm()
        try! realm.write{ realm.add(person) }
    }
}
```
`var maxId`はもういらなくなりました。

## auto incrementっぽくする
もう少しauto incrementっぽくするために、プロパティのデフォルト値に`NSUUID().UUIDString`を設定するようにします。

```
class Person: Object {
    dynamic var id: String = NSUUID().UUIDString
    dynamic var name: String = ""
    
    override static func primaryKey() -> String? {
        return "id"
    }
    
}

class MyRealm {
    
    func createNewPerson(name: String) {
        
        let person = Person()
        person.name = name
        
        let realm = try! Realm()
        try! realm.write{ realm.add(person) }
    }
}
```
これでだいぶauto incrementっぽくプライマリキーを作ってる感じがしてきました。

## まとめ
今個人で作っているアプリの中でRealmを使っているんですが、プライマリキーはただ単にユニークな値であればよかったのでUUIDを使った方法を採用しました。

プライマリキーを連番で作るにはいろいろと心配事があって、少し面倒くさそうに感じました。
UUIDであれば特に細かいことを気にする必要はないかなと感じています。

今回試したみたコードはこちらにあります。
https://github.com/kotalab/RealmAutoIncrement

## 参考
* https://realm.io/jp/docs/swift/latest/
* http://stackoverflow.com/questions/26252432/how-do-i-set-a-auto-increment-key-in-realm
技術英語 > a weatherization [makeover] > To weather a storm is to get through it as best you can, and make it through to the other side.

@ LOE > July 6, 2012

http://loe.org/shows/shows.html?programID=12-P13-00027
>  Also, financially weathering a weatherization makeover.


make overは「譲渡」という意味もあるが、上記の例文では以下の「作り変え」の意味のようだ。

http://ejje.weblio.jp/content/makeover
> 1. 作り変え、改造

<hr>

上記の例文の訳は難しい。

- weatherization : 防寒対策 ( http://ejje.weblio.jp/content/weatherization )

a weatherization makeover : 防寒対策の大改造
 financially weathering : 財政的に風化させる

直訳すると「防寒対策の大改造を財政的に風化させる」という意味だが、あまりしっくりしない。Something does not sit right with it.

とりあえず質問しておいた。
http://english.stackexchange.com/questions/291594/financially-weathering

<hr>

上記の質問への回答で色々分かってきた。
特に印象に残ったのを抜粋する。

> To weather a storm is to get though it as best you can, and make it through to the other side.
> This metaphor can then get extended into "to weather the financial storm".
...
> To the sentence means:
Surviving the cost-pressures of upgrading your home's energy-conservation measures.
プログラミングにおけるエラー解決のための考え方（入門編）


みなさんがプログラミングをしていて何らかの問題（エラー）にぶつかることはよくあることと思います。
そんな時はどういうプロセスで問題解決に勤めれば良いのかを紹介していきます。


## 考え方

問題（エラー）を解決するうえではロジカルシンキングで定番の「空・雨・傘」という考え方を使うと便利です。

###空・雨・傘とは
ここでの空・雨・傘の意味は以下になります
空　→　Fact（事実）に基づく状況把握
雨　→　その状況に対する自分なりの解釈
傘　→　その状況から導き出される行動

例

```
あなたが外出する日の朝に空模様を見たとしましょう。
すると、

	「西の空が暗く、雲行きも怪しかった。」

これがFact（事実）に基づく状況の把握です。
そこで、あなたはこう考えると思います。

	「ひと雨来そうだ」
	
これは、空模様という状況からあなたが導き出した解釈です。
そして、あなたは次にこう考えるでしょう。

	「傘を持って出かけたほうが良さそうだ」
	
これは解釈に基いてあなたが選択した行動です。
```

私たちはいろいろなシチュエーションで無意識にこの状況把握（空）・解釈（雨）・行動（傘）という考え方をしているはずです。

##プログラミングにおける「空・雨・傘」

次にエンジニアが直面する「空・雨・傘」について考えます。

```
空　→　自分で書いたプログラムを実行したがエラーが出力されて上手く動かない。。。

雨　→　このエラーが出力されたってことはこの部分が間違ってそうだ！

傘　→　間違っていそうな部分の文法をもう一度確認しよう。
```

これがエラーに直面した時の正しいエラー解決のプロセスです。
しかし、初心者のエンジニアがエラーに直面した時には以下のパターンの様に考えることがほとんどです。


| 症状 | 　　空　　 | 　　雨　　 |　　傘　　 |
|:-----------|:-----------:|:------------:|:------------:|
| 症状1：「空」のみ       |◯|     ×     |     ×| 
| 症状2：「空・雨」止まり     |◯|    ◯    |×|
| 症状3：「空・傘」短絡       |◯|     ×     |◯|

```
症状1

空　→　「E_ERROR / Fatal」というエラーが出ています！！

雨　→　×

傘　→　×

A君「こんなエラーが出てますが何も分からないので誰か解決してください！」

```
プログラミングを始めたばかりの頃はほとんどの人が症状1に当てはまりますが、始めたばかりで本当に何も分からいので多めに見て上司などがが正解を教えてくれるでしょう。
しかし、いつまでもこの考え方では全く成長しません。



```
症状2

空　→　「Missing Database Table」ってエラーが出ました。

雨　→　データベースへの接続を行っている記述が間違ってるんじゃないかな？

傘　→　×

A君「データベースへの接続を行っている記述が間違ってると思うのですがどうしたいいですか？」

```
エラーの意味を読み取って何が原因でどうすれば解決できそうなのかまでは分かっているものの、具体的な解決方法が分からない。
初心者から抜け出すには自分でコードを修正してみる（傘）という行動を積み重ねるしかありません。


```
症状3

空　→　「500　InternalServerError」ってエラーが出ました。

雨　→　×

傘　→　とりあえず怪しそうな箇所を書き直す。

A君「エラーが出たので原因っぽいところを書き直しておきましたー」

```
何も考えずにとりあえずやってみるタイプです。
やってみるということは必要なのですが、この場合具体的にどこをどう修正するかは自分の直感と経験により決定されます。
プログラミング歴10年ですみたいな熟練者はこの方法でも上手くいくと思うのですが、経験の少ない初心者には向かない考え方です。

###正しい考え方
```

空　→　「500　InternalServerError」ってエラーが出ました。

雨　→　このエラーはどうやら「.htaccess」の設定を間違えてる時に出てくるみたいだ。

傘　→　「.htaccess」の設定のし方を調べなおしてから修正しよう。

```
正しい考え方は原因に対して自分なりの仮設を立ててその実行方法を考えます。
ここまでやって分からなかったらしょうがないです。
分かる人に聞いてみましょう。

##まとめ
今回紹介した「空・雨・傘」の考え方は繰り返し使うことによって自分の中に経験・ノウハウが溜まっていきます。
初めのうちはこの考え方を使っても解決出来ないことが多いと思いますが使い続けることがあなたの成長スピードを早めるので、諦めずにまずは「空・雨・傘」の考え方で問題（エラー）解決にあたってみてください。
WPAとWPA2の違い



Wi-Fiの暗号化設定は結構複雑。
最近は、よきに計らってくれることが多くなったとはいえ、手動で設定しようとすると選択肢が多い。

理由はいくつかある。ベンダーによって用語が異なるというのもその一つ。
暗号方法の選択肢と、認証方式の選択肢が多いというのも一つ。

####暗号化方式の選択

| 暗号方法 | 暗号化方式  | 暗号化アルゴリズム |
|:-------:|:---------:|:---------------:|
| WEP     | WEP64bit  | RC4             |
| WEP     | WEP128bit | RC4             |
| WPA     | TKIP      | RC4             |
| WPA     | (CCMP)    | (AES)           |
| WPA2    | (TKIP)    | (RC4)           |
| WPA2    | CCMP      | AES             |

ベンダーによっては"Mixied"や"自動"という選択肢もある。RC4やCCMPという用語はあまり見かけず、TKIP or AESのような選択肢がなぜか多かったりする。
いろいろあっても今や選択すべきは最下段の WPA2(AES) 一択である。

####認証方式の選択

| 認証方法             | 認証方式        |
|:-------------------:|:-------------:|
| WPA/WPA2 PSK        | 手入力共有鍵    |
| WPA/WPA2 Enterprise | 802.1x(EAPoL) |

ベンダーによってはプリシェアードキーとか、RADIUSとかいう用語だったりする。
802.1xを選択するとEAPで使用する認証方式をさらに選択する必要が有る。
ここはカオス。MD5, LEAP, PEAP, TTLS, TLS, ... など定義だけ言えば数十種類ある。

##WPAとWPA2の違い
これらの中で、WPAとWPA2の違いを取り上げる。といっても技術的な話ではなく、歴史的経緯の話。

WPAの進化版がWPA2か？というと、半分当たっていて半分ちがう。WPAとWPA2は用語も中身も似てはいるが非なるもの。

・WEPの脆弱性が指摘される（パスワードが解読可能）
・IEEE[^1]が新しくセキュリティ規格の検討を始める
・WEP解読がどんどん進化してきていることから、Wi-Fi Alliance[^2]はIEEEの策定を待ちきれず独自に認証プログラムを開始
・IEEE 802.11i規格化完了
・Wi-Fi Allianceは改めて正式な802.11iをWPA2として認証プログラムを開始

[^1]: IEEEは規格を決める団体（学会）のこと。

[^2]: Wi-Fi Allianceとは、主としてIEEEの規格を元に各ベンダー間の相互接続性を担保してWi-Fiという名称（ロゴ）を与える団体のこと。)

![IEEE](http://cl.ly/dzGa/Image%202015-12-04%20at%2004%3A34%3A11.png)
(社内向けWi-Fi講座資料から)


というわけで、WPAは急ごしらえのものであって今や不要。

おわり。
【FileMaker】削除日付を自動でセットする

さて、FileMaker Advent Calendar 2015 4日目、シリーズものは準備中ですので今日も小ネタのお付き合いをよろしくお願いします。

今日は、「削除日付を自動的にセットする」やり方です。

データは残しておきたいけれど、もう参照しない、というケースないですか？
検索した時にいちいち参照しないデータが出てくるのも嫌ですよね。

作成日付と修正日付はフィールドの指定でセットできますよね。
![スクリーンショット 2015-12-03 8.19.16.png](https://qiita-image-store.s3.amazonaws.com/0/60538/9c9daa59-ccaf-9f0f-2453-fd7cab47a0b0.png)

しかし、削除日付の自動設定はFileMaker側用意されていません。

なので、やり方の一つとして、削除フラグを作成し、削除フラグがONになったら削除日付を自動的にセットする仕掛けを紹介します。

![スクリーンショット 2015-12-03 8.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8caea9db-dfd3-95e9-8aa4-f97443eb4272.png)
deleteDT（削除日付）とdeleteFlg（削除フラグ）のフィールドを作ります。

削除フラグは何か値が入っていればいいのですが、ここでは値一覧を利用してチェックを入れる形にしてみます。
![スクリーンショット 2015-12-03 8.22.10.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b3b8b273-181b-4c8e-701a-18855f4958d0.png)
ON/OFFということで、OFFも値一覧に入れたくなりますが、スクリプトなどでON以外の判断をしなければならないのでONのみで活用します。

レイアウトに削除フラグフィールドを置いて、チェックボックスに先ほど作った値一覧をあてます。
![スクリーンショット 2015-12-03 8.22.24.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d48b8575-6c13-a300-c8f7-93e4f0bcdbb5.png)

では、自動で削除日付が入る仕掛けをしていきます。
deleteFlgにスクリプトトリガを設定します。
![スクリーンショット 2015-12-03 8.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8310d4ac-fc4f-37f5-b96f-06afefd6d551.png)

削除フラグになにかしらデータが入り、変更されたら動くスクリプトを設定します。
イベントは、"OnObjectModify"になります。
![スクリーンショット 2015-12-03 8.23.12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/790204d6-7608-a51f-cda3-a808d7f43d2e.png)

削除フラグにONが入っていたら、削除日付に日時（タイムスタンプ）を入れます。
もし、チェックが外れたら、削除日付を空にします。
![スクリーンショット 2015-12-03 8.25.13.png](https://qiita-image-store.s3.amazonaws.com/0/60538/eb462636-0790-e8be-6073-7597b08c16e6.png)

セットすると、こんな感じです。
![スクリーンショット 2015-12-03 8.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8d1a2d93-42b8-ed4d-b4c4-f9f5196907ab.png)

スクリプトトリガが設定されているフィールドは、オレンジ色の設定マークがつきます。
![スクリーンショット 2015-12-03 8.25.41.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b2413e9e-3c06-11ba-ca8c-2c64a9393afb.png)

レイアウトモードからブラウズモードに戻り、早速やってみましょう。
![スクリーンショット 2015-12-03 8.25.57.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c060e18a-f33e-05af-f892-5e5f31fb9d5f.png)

2つ目のデータの削除フラグにチェックを入れてみた所です。
![スクリーンショット 2015-12-03 8.26.10.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5aaf125a-f239-250f-1400-9e2828a009db.png)
削除日付が自動で入りましたね！

さて、ここで削除フラグなしのデータを検索してみましょう。
つまり、有効なデータのみを検索する、ということになります。

検索モードで、削除日付に"="を入れます。
![スクリーンショット 2015-12-03 8.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/60538/59d09e99-4e60-2b79-5d12-390354d0fa27.png)

はい！
削除日付が入っていないデータのみ検索できました。
![スクリーンショット 2015-12-03 8.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0eb5a901-52af-da8b-dccf-673161930ff6.png)

削除日付など運用的なデータを表に出さない場合は、スクリプトなどで「削除フラグが空("")のデータを検索する」など実装すると同じように削除フラグを設定していないデータが検索できます。

いかがでしょうか？
ちょっとしたスクリプトとスクリプトトリガの設定で、データの状態管理ができますので、ぜひ実装してみてください。
フィールド内改行問題について考える


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の4日目

# フィールド内改行問題について考える
FileMakerを始めた頃、うっかりハマることが多い**フィールド内改行問題**について考えてみる

## フィールド内改行問題とは？
こういうフィールドがあったとして
![151204-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/2c7b4637-364f-4b4f-89a5-6942b801aa54.png)

フィールドにカーソルを入れたときに
![151204-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/acde98f9-8b54-e0af-2cdc-66089387c045.png)
こうなるのが正しいのに
![151204-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7163bd8d-e758-5f5c-605f-f60fa4c5c87d.png)
こうなってしまう

それフィールド内改行問題が起きてますよ

## フィールド内改行問題で一番困るのは？
データを書き出した時に困ります
![151204-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/35a7b19c-97d9-4143-2c30-78cb3dc03a49.png)
1行目が**フィールド内改行問題**が起きているレコード
見た目は同じに見えても、まったく違うデータになってしまっています
赤枠に囲われた0Bは文字であって文字ではない(ASCII制御文字)なので、通常は表示されないので気づきません

## どうすればいい？
フィールド内改行問題を起こさないためには

- フィールド内で改行キーを受け付けなければいい
- もしフィールド内に改行が入ったら影響が無いように置換してあげればいい

## 対策：フィールド内で改行キーを受け付けなければいい
インスペクタで改行を許可しないフィールドで
![151204-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/8a099d0c-71b7-6cf2-4f62-b4d7a79d60c1.png)
こうなっているのを
![151204-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/0a9ee013-102f-97bc-6d31-8d59c366e360.png)
こうすれば、フィールド内で改行されずに次のタブ順に設定されているレイアウトオブジェクトに遷移するので、改行は入りません
気を付けないといけないのはフィールドの値をコピペした場合、コピペした値に改行コードが入っていた場合は**フィールド内改行問題**が残ります
あくまでもユーザーの**キー入力を抑止**する機能でしかありません

## 対策：もしフィールド内に改行が入ったら影響が無いように置換してあげればいい
Substitute関数を使って改行コードを置換します
> Substitute関数
目的 
テキスト内にあるすべての検索テキストの文字列を、テキスト内で置換テキストに置換したテキスト文字列を返します。
構文 
Substitute ( テキスト ; 検索テキスト ; 置換テキスト )

フィールドのオプションの「入力値の自動化」の「計算値」に
> Substitute ( フィールド名 ; "¶" ; "" )

を設定してあげればいいでしょう
都度フィールド名を指定するのが面倒ならSelf関数を使えばコピペ対応できます
> Self関数
目的 
計算式が定義されているオブジェクトの内容を返します。
構文 
Self

これを使って

```
Substitute ( フィールド名 ; "¶" ; "" )
```

の代わりに

```
Substitute ( Self ; "¶" ; "" )
```

とすると、どのフィールドでも同じ式で対応できます
古い/bin/shをインタラクティブにしたい

本日のFreeBSD Advent Calendarが空いていたので小ネタ投下します。

# 旧バージョンのFreeBSDもまだ現役だい！

というあなた。ですよねー。公式サポートが切れたからといって、はいそうですかといって簡単にバージョンアップできるホストばかりじゃありません。世の中、キレイ事では済まないものです。

それに、インターネットに繋がっておらず、自分で管理しているローカルネットワーク内でのみ自己責任で運用しているのなら、旧バージョンを使っていようが責められる言われは全くありません。

そんな旧バージョンFreeBSDを愛顧するあなたへ捧げるTipsです。

# /bin/shでもヒストリー&カーソル移動ができるんです

FreeBSDのシェル、何をお使いですか？デフォルトはtcshだと思いますが、Bourne Shell系のシェルをちょっといじりたいと思ったら、後からbashやzshなどインストールしない限りは/bin/shしか選択肢がありません。

でも、FreeBSD 8までの/bin/shだとヒストリー機能が無いし、コマンド入力している途中で最初の方の打ち間違いに気づいたとしても左カーソルキーや[ctrl]+[a]で戻してやることができません。あぁ不便。

……とお思いかもしれませんが、実はできるんです！

# `set -E`って打ち込んでおくだけ

しかもやり方はあっけにとられるほど簡単。/bin/shに切り替えた後

```shell-session
$ set -E
```

って打ち込むだけです。打ち込んだら早速、[↑]キーを押してみてください。ホラね、ヒストリーに入っている`set -E`が現れたましたよね？

さらに、[←]キーなんかも押してみてください。"`^[[D`"というウザい表示がされず、カーソルが素直に左に移動しましたよね？

これができるようになるだけでどんなに便利なことか……。

ただし、タブキーでコマンドやパスが補完される機能はありません。

# 少なくとも2.0の頃からこの機能はあった？

これ、一体いつからあったんでしょう？確認できた限りでは[2.0-RELEASEの頃既にあった](https://www.freebsd.org/cgi/man.cgi?query=sh&manpath=FreeBSD+2.0-RELEASE)ようです。

>-E    emacs
>      Enable the builtin emacs(1) command line editor (disables	-V if
>      it has been set).

こんな便利な機能を持っているなら、デフォルト有効にしておいてくれればいいのに水臭いですよねぇ。

# オマケ

逆に、始めからインタラクティブになっているFreeBSD 9以降の/bin/shでその機能を無効にして、(´・ω・`)ｼｮﾎﾞｰﾝすることもできます。

```shell-session
$ set +E
```

ああなんて素晴らしきムダ知識。
LambdaとES6とWebStormと

WebStormを使ってES6でLambda開発しようとするとbabelの設定やらデプロイの方法やらWebStormの癖やら面倒くさいこといろいろあるのでテンプレにまとめてみました。

https://github.com/hoshina85/lambda_template


## 出来ること
* ES6のコードをbabelで変換
* mochaでテスト
* gulpでデプロイ

## コード

メインのコードはsrc/*.es6に書きます。WebStormはデフォルトで.jsと.es6を区別してそれぞれES5,ES6のコードとして扱います。filetype設定で.jsをES6として扱うことも出来ますが、ES5のファイルが混ざってもES6として評価するのであまりおすすめしません。

`.babelrc`でES2015と`stage-3`のプリセットを呼んでいるのでasync/awaitも使えるようにしてあります。babel6以降presetsやpluginはここに書くのがお作法っぽいです。

`gulp build`　`gulp watch`で `lib/*.js` に変換されますがここは変換が通ったか確認するために吐き出しているだけなので実際には使われません。gulpを利用せずにWebStormのWatchでES6を変換するようにするとコンパイルエラーがIDEで見れます。

##テスト

`npm test`で`test/`以下全てのテストが実行されます

テストはmochaです。WebStormでテストハーネスと認識してくれるライブラリ(mocha,karma,nodeunit)を使うと特定のテストケースの実行とかが容易になります。迂闊にAVAとか対応していないものを使うとただのスクリプト実行になってしまうのが辛いところです。

またみんな大好き`power-assert`に対応しています。`.babelrc`で`babel-plugin-espower`を設定し`test/mocha.opts`でデフォルトパラメータに`--require babel-register`を指定することで自動でassertが変換されます。

##デプロイ

デプロイは`node-aws-lambda`を使ってgulpから行います。`lambda-config.js`でクレデンシャル情報とlambda関数の設定を入力してgulpコマンドを実行するとビルドからアップロード、設定まで一気通貫で行ってくれます。アクセスキーを記述せずに`.aws/credentials`に設定したプロファイル名を環境変数で渡すのがおすすめです。

```
AWS_PROFILE=hogehoge gulp deploy
```

ちなみにここでアップロードするユーザとlambdaの実行ロールは別物です。実行ロールにはCloudWatchLogsの書込権限が必要ですが、アップロードするユーザにはlambdaの設定権限と実行ロールへ移譲する権限(iam:PassRole)が必要になります。


##まとめ
ふんわりと紹介してみましたがLambdaめっちゃ便利だけど開発フロー固まってないとウロウロしがちなのでとりあえずテンプレから始めてみると良いと思いますのでコレ以外にもみんなのベストプラクティスもおしえてください
pythonのrequestsでmultipart/form-data送信

よく忘れるのでメモ。

```py
import requests

def send():
	image = open('/path/to/file', 'rb')
	files = {'param_name': ('filename.jpg', image, 'image/jpeg')}
	data = {'another_key': 'another_value'}
	r = requests.post(URL, files=files, data=data)
	print r.text
```

filesの中身の値をtupleにすることで、ファイル名とcontent-typeを指定できる。

参考: https://github.com/kennethreitz/requests/issues/1495#issuecomment-21581939
メルカリのライブラリ見てみた。(iOSアプリ)

メルカリのアプリにライセンス載ってるからそこからライブラリどんなの使ってるか見てみた。
1.AFNetworking
　いつものあれ
2.AGi18n
  xibの多言語対応らしい。現状多言語はやってないから詳細調査は又の機会
3.ELCImagePickerController
　UIImagepickerの複数画像選べる版的なもの。ただ画像が荒い。
　[サンプル作ってみました。](https://github.com/kameware/ELCSample)
4.FacebookSDK
　FacebookのSDKですね。
5.GMGridView
 CollectionView的なやつ、並び替えできるみたい。
　[公式git](https://github.com/gmoledina/GMGridView)
6.HMSegmentedControl
　スクロールと連動タブ
　[公式git](https://github.com/HeshamMegid/HMSegmentedControl)
 [作ってみたサンプル](https://github.com/kameware/HMSegmentedSample)
7.ODRefreshControl
　引っ張って更新
8.PSTColectionView
　CollectionView的なやつ。git見たら作者がもう使ってないってあった。
9.SVProgressHUD
　ローディングのやつ。HUDはどっかでちゃんとやらないとなー
10.UICKeyChainStore
　KeyChain管理用らしい
11.WEPopover
　もうiPhoneでもポップオーパーは使えるので
12.OHAttributedLabel
　ラベルの文字の一部の色とか変えれるらしい。
13.Google Cloud messageing for Android
  通知。どこかでちゃんと勉強します。
14.Eventbus
 Android用？見つからなかった。
15.mockito
　テスト用みたい。未だにテストコード実は書いたことがない。。。
16.hamcrest
　これもテスト用みたい。

ザクっと調べただけだからこんな感じでした。
他のアプリも見てライブラリ勉強しよう。
JupyterのCommon Lisp kernelをインストールする


## 概要
sbclのシェルでCLのお勉強がつらいので[JupyterのCommon Lisp kernel](https://github.com/fredokun/cl-jupyter)をインストールしたところ少しだけつまった.

sbclとQuicklispをインストール後上記gitリポジトリをcloneして`python install-cl-jupyter.py`せよと書いてある.

こいつが曲者でpython3向けに書かれている上IPythonの古いAPIを使っていたりして(後者は要検証)デフォルトがpython2系かつAnacondaで完結させているうちの環境ではなかなか動かない.

## 解決策
install-cl-jupyter.pyを読んでみたところkernel.jsonを生成してるだけぽい. 5,6行しかいらないので手動で打ち込む.

~/.ipython/your_kernel_name/kernel.json に以下の通り書き込んで`jupyter notebook`し, CL kernelを選ぶと勝手に依存モジュールのインスールが始まる.

```json
{
    "argv": [
        "sbcl","--non-interactive", "--load",
        "/path/to/cl-jupyter/cl-jupyter.lisp",
        "/path/to/cl-jupyter/src",
        "/path/to/cl-jupyter",
        "{connection_file}"
    ],
    "display_name": "SBCL Lisp",
    "language": "lisp"
}
```

Python3系で完結させているとこんな問題はおこらないかもしれない.

## まとめ
そろそろPython2を捨てたい.
Raspberry Pi 2 設定メモ 02 （Wi-Fi と CameraModule の利用）（更新中）

#Raspberry Pi 2 設定メモ 02
##（Wi-Fiとカメラモジュールの利用）
##最終更新日：2015.12.04
##※近日中に追記予定

### (00) 前提条件
+ Raspberry Pi 2 Model B
+ Raspbian jessie (2015-11-21版)
+ Raspberry Pi 2 設定メモ 01 （導入編） を実行済
+ Raspberry Pi 対応 Wi-Fi子機
+ Raspberry Pi Camera Module

### (01) vim のインストール
様々な設定にテキストエディタを利用するが，その際，viよりもvimの方が使いやすいので，それをインストールしておく．必要なければ，インストールは不要．あるいは，別のテキストエディタでもよい．

+ $ sudo apt-get install vim

### (02) Wi-Fiの設定
#### (02-A) Wi-Fi子機の確認
Wi-Fi子機がRaspberryPiに対応済の商品であれば，認識されているはずである．以下のコマンドで状況を確認する．

+ $ sudo lsusb （USB接続で認識している機器）
+ $ sudo ifconfig （認識しているネットワーク機器）

#### (02-B) Wi-Fiの自動接続設定
Wi-Fi子機が認識されていれば，Wi-Fi接続は Raspbian のGUI画面で簡単に設定可能である.しかし，その場合，設定ファイル中にパスワード等が平文で閲覧可能である．下記の操作を実行すれば，パスワードが暗号化されて保存されるので，より安全である．

1. $ sudo bash （管理者権限でbashの起動）
2. \# pa_passphrase \<NetSSID> \<NetPassWord> >> /etc/wpa_supplicant/wpa_supplicant.conf （Wi-FiのSSIDとパスワードを登録する）
3. \# exit (bashの終了)
4. sudo vim /etc/wpa_supplicant/wpa_supplicant.conf => セキュリティ強化のため，平文パスワード(\#psk="...")の削除を推奨

### (03) Raspberry Pi 用のカメラでストリーミング
#### (03-A) mjpg-streamer の利用準備(RaspberryPi側)
RaspberryPiの専用カメラを利用したストリーミングを行いたい場合，いくつか方法があるようだが，mjpg_streamer を使うのが簡単そうだ．以下の手順でソフトをインストールして，動作確認を行う．

1. $ sudo apt-get install libv4l-dev libjpeg8-dev imagemagick
2. $ sudo apt-get install make
3. $ sudo apt-get install make
4. $ git clone https://github.com/jacksonliam/mjpg-streamer.git
5. $ cd mjjpg-streamer/mjpg-streamer-experimental
6. $ make
7. $ vim www/camera.html => 下記の camera.html の作成

```
<html>
  <body>  
    <img src="/?action=stream">  
  </body>
</html>
```

その後，以下のコマンドでストリーミングを開始する．
1. $ export LD_LIBRARY_PATH=.
2. $ ./mjpg_streamer -o "./output_http.so -w ./www" -i "./input_raspicam.so -x 1280 -y 720 -fps 15"
（ポート番号は無指定の場合は8080, 上記は画面サイズ1280x720, フレームレート10）

#### (03-B) ストリーミングの受信（閲覧したいブラウザ側）
上記の (03-A) で mjpg_streamer が動作している状態で，ネットワーク上の別のPCのブラウザで以下のURLを参照すれば，RaspberryPiからのストリーミング映像が確認できる．

+ http://[RaspberryPiのIPアドレス]:8080/
Snackbarを導入するだけならCoordinatorLayoutは必要ない

常識だったらすみません、、
自分は知らなくてびっくりしたので共有します。

OSSのコードを読んでいて気づいたのですが、以下のように指定して表示するだけでSnackbarが利用できるようです。

```java
        View view = activity.findViewById(android.R.id.content);
        if (view == null) return;
        Snackbar.make(view, resource, Snackbar.LENGTH_SHORT).show();
```
https://github.com/takahirom/Lightning-Browser/blob/master/app/src/main/java/acr/browser/lightning/utils/Utils.java#L82

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/32aad791-b825-00a0-4c1c-550e08f75873.png)


ドキュメントにも
http://developer.android.com/reference/android/support/design/widget/Snackbar.html#make(android.view.View, int, int)

Snackbar will walk up the view tree trying to find a suitable parent, which is defined as a CoordinatorLayout or **the window decor's content view**, whichever comes first.

と書いてあって使えるようです。
ただ、SnackBarを出すと同時にFloatingActionButtonを同時に上に上げるなどの対応を行いたい場合はCoordinatorLayoutが必要になると思われます。

特になにもしていませんがコード置いておきます。
https://github.com/takahirom/snackbar-in-content-view/blob/master/app/src/main/java/com/github/takahirom/snackbartest/MainActivity.java#L17
CMake ExternalProject 事始め

CMake の ExternalProject モジュールの使い方についての日本語記事が少ないように感じたので、忘備録も兼ねて。

## ExternalProjectとはなんぞや?
ソースツリーの外部から別のプロジェクトを持ってきてビルド、インストールまでやってしまえるという機能です。

## どういう時に便利か?
*unix 系 OS だと大抵のライブラリは `apt` や `yum`, `pacman` などで簡単にインストール出来ますが Windows じゃなかなか大変です。`ExternalProject` が提供する `ExternalProject_Add`を使うことで外部依存ライブラリのセットアップを自動化出来ます。

## サンプル
OpenGL 系のライブラリ `glfw` に依存するプログラムを例にします。まず `CMakeLists.txt`から
幾つかポイントを列挙していきます。

```cmake
cmake_minimum_required(VERSION 3.0)

project(Test)

### Configure Dependency install path, include path and library path
set(DEPEND_LIB_ROOT ${PROJECT_BINARY_DIR}/Depends)
set(CMAKE_PREFIX_PATH ${DEPEND_LIB_ROOT})
include_directories(${DEPEND_LIB_ROOT}/include)
link_directories(${DEPEND_LIB_ROOT}/lib)

### Create Target "Test"
add_executable(Test main.cpp)
target_link_libraries(Test glfw3)

### Load External Project
include(ExternalProject)
ExternalProject_Add(
  ### Target name
  GLFW3
  ### Path to Git repository
  GIT_REPOSITORY https://github.com/glfw/glfw
  ### Specify TAG
  GIT_TAG 3.1.2
  ### Path to source tree
  SOURCE_DIR ${DEPEND_LIB_ROOT}/src/glfw
  ### Specify Generator
  CMAKE_GENERATOR "NMake Makefiles"
  ### Add cmake args CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEPEND_LIB_ROOT} -DCMAKE_BUILD_TYPE=Release
  ### Path to build tree
  BINARY_DIR ${DEPEND_LIB_ROOT}/build/glfw
  BUILD_COMMAND nmake INSTALL_COMMAND nmake install
)

### Test depends
add_dependencies(Test GLFW3)
```

### `ExternalProject` の読み込み
```cmake
include(ExternalProject)
```
で `ExternalProject_Add` が利用出来るようになります。

### 外部プロジェクトの設定
`ExternalProject_Add`で外部ライブラリの設定を行いますが、引数によってどのステージで
用いられるのかというのが決まっています。良く用いられるのは次のステップかと思います。

1. Download step
2. Update/Patch step
3. Configure step
4. Install step
5. Test step

今回の例を元に各ステップで何をやっているか説明します。
### Download step
ダウンロードステップでは外部プロジェクトの場所などについて設定できます。
今回の例では、`GIT_REPOSITORY` で指定した URL から clone して `GIT_TAG` で指定した
タグを checkout するよう指示しています。

```cmake
ExternalProject_Add(
  GLFW3
  GIT_REPOSITORY https://github.com/glfw/glfw
  GIT_TAG 3.1.2
)
```

### Update step
今回は使っていません。プラットフォーム固有の patch などはこのステップで適用します。

### Configure Step
```cmake
ExternalProject_Add(
  SOURCE_DIR path/to/source
  CMAKE_GENERATOR "NMake Makefiles"
  CMAKE_ARGS -DCMAKE_INSTALL_REFIX="..."
)
```
ソースファイルの配置場所、及び CMake のジェネレータ、インストール先の指定などを行っています。

### Build step
```cmake
ExternalProject_Add(
  ##...
  BINARY_DIR ${DEPEND_LIB_ROOT}/build/glfw
  BUILD_COMMAND nmake
)
```
ビルド関連の設定です。`BINARY_DIR` はこの例だと Configure step で指定した設定で cmake を実行する
ディレクトリとなっています。
`BUILD_COMMAND` は Configure stepで指定したジェネレータと合わせましょう。

### Install step
```cmake
ExternalProject_Add(
  ##...
  INSTALL_COMMAND nmake install
)
```
インストールのコマンド指定です。Linux系なら `make install` になるかと思います。
この辺り別途環境ごとにチェックする機構が必要かと思います。

## 依存関係の追加
`ExternalProject_Add` で追加された新しいターゲットと既存のターゲットとの依存関係を
記述してやります。これにより最初に GLFW3 のビルド -> Test のビルドになります。

```cmake
add_dependencies(Test GLFW3)
```

## まとめ
![公式ドキュメント](https://cmake.org/cmake/help/v3.0/module/ExternalProject.html)を参照していただけるとわかりますが、今回使った Git 以外にも
 bzr や Mercurial などかなり色々ツールでソースの取得が可能です。
ただ autotools で書かれたプロジェクトだと Windows 環境では MSYS2 に頼ったりなどが必要
かもしれません。
現場で使ったLinuxコマンド、Shellテクニックまとめ


プログラマー歴は1年未満ですが、業務でLinuxを触ったり、
ShellScriptを実装することが多かったので、
そこで使ったコマンドやテクニック等をメモ代わりにまとめておきます。

■コマンド

・nkf -w test.txt
text.txtをエンコードをUTF-8で開くというコマンドになります。

test.txtがShift_jisで書かれていた場合、普通にcat test.txtをすると、
Linux上では通常文字化けしてしまいます。
そこで、nkfコマンドです。
オプションでエンコードを指定して開くことができます。
-wの場合はUTF-8です。

—overwriteを付けて、実行するとUTF-8で上書きされます。

・locate text.txt
text.txtをLinux上の全てのディレクトリの中から探してくれます。
基本的にfind / | grep text.txtよりも早いです。

詳細は分かっていませんが、
Linux上にデータベースを作り、そこから探すため早いらしいです。

テーブルにインデックスを貼ることで、検索スピードがあがるみたいなものだと考えています。

ただ、DBに登録されていないものは、検索することができませんし、
どのような基準や日程で登録されているのかが分かっていません。

現場のLinuxサーバーでは、割と早く登録されていたので、不自由なく使えていたのですが、
自宅のMacでは、検索されないファイルが多くあまり使えない印象を持っています。

■パイプ系

コマンド | grep
コマンド | xargs

左記のコマンドを標準入力で受け取り、何らかの処理を加えるやつ達です。
割と定番かもしれまれないですね。

ワンライナーの間で、良く使われるコマンドですね。

ex1)
find /home/hoge -mtime +3 \( -name "*.tsv" \) | xargs rm -f
上記はhogeディレクトリ配下で尚且つ、ファイル作成日時が3日前のtsvファイルを探しだし、
それを削除するという処理になります。

ex2)
history | grep find
上記は、historyコマンドで過去に使ったコマンドの一覧結果から「find」が書かれたもの標準出力で表示します。

■DB接続系(私が実装していたのはOracleなので、Oracleを例に出します)
sqlplus -s スキーマ名/パスワード@接続先のIPアドレス

ex1)
sqlplus -s スキーマ名/パスワード@接続先のIPアドレス << EOS
UPDATE
     hoge
SET
     nantoka_flg = 1
WHERE
     id = $1
;
EOS

上記は、hogeテーブルのnantoka_flgを更新を引数で受けっとった値を条件に、
hogeテーブルを更新しています。
UPDATE文を読みこませるために、ヒアドキュメント(<<)を利用しています。

以上、よく使用していたのを思い出しながら、書いてみました。
ざっくりとしていますので、
次回は、一つのことを詳しく書くという感じで書いてみます。

という訳で、解釈や結果など恐らく間違いなどあると思います。
有識者の方には、指摘して頂けますと幸いです。
WebブラウザでArduinoをLチカする

[HTML5 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/html5) 12月4日のエントリーです。同時に [takoratta](http://qiita.com/takoratta) さんがIncrementsさんにJoinされた記念に Qiita に初投稿することにしました。 
内容は 「Node.js は使わずに JavaScript で簡単に Arduino を動かす」というものです

#Arduinoって何？
「ハードウェアの回路作るのって難しいじゃん。だからプログラムでいろいろ制御しちゃっおうよ」ってノリのワンボード・マイコンです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/61221/ffd5a507-c197-9891-fcf9-2ea5b6f9dc31.png">
最近話題になった[Raspberry Piの小さいの](http://www.gizmodo.jp/2015/11/1000raspberry_pi_zero.html)と同じようなやつです。

#「Lチカ」という儀式をする
まずこういうワンボード・マイコン買ったらしますよね「Lチカ（LEDを光らせる）」。そして~~満足して~~初期不良でないことを確認して箱に戻す、みたいな、、、。僕がまさにこのパターンで、初期不良がないことを確認してから1年以上~~放置して~~大事に保管していました。ここでWebディベロッパの僕が感じたのは「専用言語覚える必要があるし、しかもCみたいなやつか・・・。僕、知らないよ・・・」というところでした。

#JavaScriptで何とかならないの？
ググると例えば [Jonny-Five](http://johnny-five.io/) とかあるんです。でも、大抵は [Node.js](https://nodejs.org/) 必須で、準備が必要なんですよ。そこでもっと簡単にしたく思って以下のことを目指しました。
##目指した所
 1) 誰でも簡単に使えるようにしたい
 2) 学習コストの低くしたい
 3) 公開も簡単にしたい
#どういうのができたか
こんなのができました。動画です▼クリックすると飛びます。
[<img width="407" alt="Screen Shot 2015-12-04 at 1.04.36 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/7ea056e6-2bfc-803e-9fe3-15730a2f9043.png">
](https://photos.google.com/share/AF1QipPAheDyPGoaLL1OivSGm5FMnVq4ymgTM0OCzVdudKco-0bZhdAJOkZilFE_0ASwgw/photo/AF1QipPrsy8s9hpn14S3mlikvqIpUrTzzXbAbkf5mquw?key=WDR6bExVbVZ0VWNPdk5Hd1JQTVJjTEltQ0R0emxn)
ブラウザの画面には3x4の光るボタンが設置されていて、手前のビュレッドボードには2x4のLEDが並んでいます（LED不足の為、ブラウザ上の上から2段をビュレッドボードに再現しています）。ブラウザ側で任意のLEDを「On」にして「Lチカ」ボタンを押すとビュレッドボード上の同じ場所のLEDが光っています。

##仕組み
Arduino側は [Moco for LUFA](http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/) というファームウェアでMIDI機器になっていて、Arduino側には汎用のプログラムが転送してあります。ArduinoとブラウザとはWeb MIDI APIを使ったMIDIのプロトコルで通信しています。 
Web MIDI API を使っていますが、ユーザーがMIDIを勉強する必要がないよう、この辺りは Polymer(Web Components) のエレメントにしてしまっているので実際はタグです。この Polymerのエレメントを **Web-Arduino** とい名付けました。 
さて、この Web-Arduino 何がいいのでしょう？これのよいところは、ロジックも設定もすべてがJavaScriptで記述できて、Arduinoを接続してURLからアプリケーションをロードするだけですぐに動かせるところです。  
ちなみに、動画のアプリケーションは[こちら](http://ryoyakawai.github.io/web-arduino/web/blinkwithblink.html)です。（Web MIDI API が実装されているのが現在は Google Chrome だけなのでそれにちなんで **Blink with Blink** という名前にしました。）

#技術詳細
長くなるので[チュートリアルにリンク](https://webmusicdevelopers.appspot.com/codelabs/arduino-mocolufa/index.html)しますね。期待させておいて最後は超雑ですみません＞＜ 
そして、今週の日曜日（12月6日）に[Google HackFair Tokyo](http://googledevjp.blogspot.jp/2015/11/google-hackfair-tokyo_20.html) というイベントがります。そこで展示もしますので、気になる方はぜひどうぞ〜。

#おわりに
技術的にはPolymerとか使ってるんですけど、でもやっぱり「Lチカ」なのか、、、というオチでしたw
Apache CloudStackをDocker上で簡単に試す方法

この記事は、[CloudStack Advent Calendar 2015](http://www.adventar.org/calendars/970) 12月3日用のエントリです。
別のネタを考えていましたが、ちょうどApache CloudStack 4.6が出てきたので変更します。
## Apache CloudStack 4.6が出ました
巷ではOpenStackの話題でにぎわっている昨今ですが、ひっそりとApache CloudStack 4.6がリリースされました。
- [リリースノート](http://docs.cloudstack.apache.org/projects/cloudstack-release-notes/en/4.6.0/) 
- [PublicKey - オープンソースのクラウド基盤「Apache CloudStack 4.6」リリース。DockerイメージでのCloudStack提供も開始](http://www.publickey1.jp/blog/15/apache_cloudstack_46dockercloudstack.html)

いくつか機能改善が行われているのですが、このエントリではDocker Hubでのイメージ提供について触れたいと思います。

Apache CloudStack 4.6は、従来からのソースやバイナリでの提供以外に、Dockerイメージとしての提供が行われています。今までも有志によるCloudStackイメージがありましたが、こちらは[公式のリポジトリ](https://hub.docker.com/u/cloudstack/)です。ここから簡単に管理サーバーやシミュレーターのイメージをpullしたり、イメージの使い方を確認したりできます。

CloudStack目指すところは「All-in-one」あるいは「Turn-key」（ターンキー＝鍵を回せばすぐ使える）なPrivate IaaSなので、Dockerで管理サーバーをサクッと建てられてしまうというのは良い方向性ですね。

## やってみた
しばらく使ってなかったCentOSがVMware Workstation上にあったので、とりあえずdocker pullしてみます。今回はシミュレータ用のイメージを使っています。
![devel-2015-12-03-11-09-47.png](https://qiita-image-store.s3.amazonaws.com/0/76398/ebd29a63-af69-b39a-d614-16f090376d5a.png)

しばらく待つとイメージのダウンロードが終わります。
![devel-2015-12-03-14-51-38.png](https://qiita-image-store.s3.amazonaws.com/0/76398/f9abb4e1-d420-f622-c5c7-e5f81523c117.png)

終わったら実行してみます。![devel-2015-12-03-14-52-34.png](https://qiita-image-store.s3.amazonaws.com/0/76398/d5b3f7ca-d9f6-e532-b2d4-939155008912.png)
ちなみにイメージ名を指定する際に、cloudstack/simulator:4.6.0 のようにイメージ名の後にタグを指定すると、そのバージョンの環境を使用できます。使用可能なタグの一覧は Docker Hubで確認できます。

プロンプトが返ってきても、CloudStackのサービスが上がるまでしばらく掛かるので待ちます。少し経ったら、ブラウザでアクセスしてみましょう…はい動きましたー。
拍子抜けするぐらい簡単です。
![devel-2015-12-03-14-55-07.png](https://qiita-image-store.s3.amazonaws.com/0/76398/f7ac90b2-3512-beb8-15d5-66ae83b97e73.png)

## ちょっとだけ、つまづきながら
Simulatorの場合、あたかもBasic ZoneやAdvanced Zoneがあるかのように見せるためのスクリプトがイメージ内に用意されているので、それを流します。
起動したdockerに入ってコマンドをたたく時は
`docker exec -ti cloudstack /bin/bash`
でコンテナのbashを使えます。

下記はAdvanced Zoneの展開をしています。
![advancedzone.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/44526a48-0d20-50f7-7212-536def035684.png)
ちなみに、これを実行しようとした際に、3つほどエラーに遭遇しました。
`ImportError: No module named marvin`に対しては
`python /root/tools/marvin/setup.py install`

`ImportError: No module named Crypto.PublicKey`に対しては
`pip install pycrypto`

`ImportError: No module named ecdsa`に対しては
`pip install ecdsa`
でエラー解消しました。

## できた！
完了すると、Simulator用のダミーインフラが出来上がります。
![infrastructure.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/c118fadf-0eb8-53fe-7f18-c4d7ce7702c0.png)

このお手軽さ、そして壊しても困らない環境というのはいいですね。
「こんな感じのインフラいいなぁ」と思った方はシミュレーターではなく、次は本物にぜひチャレンジを！
RubyでBTCボックスのAPIを叩いてみる

ヘルプにあるAPIを一通り叩けるようなやつ作ってみました。

[GitHub blue1st/btcbox](https://github.com/blue1st/btcbox)


## 導入
rubygemsに登録するのは何か忍びなかったのでspecific_install使う感じで。

```
$ gem install specific_install
$ gem specific_install -l "https://github.com/blue1st/btcbox.git"
```

## API

やりたいことに応じて予めAPIキーを取得しときましょう。

[Btcbox > APIキーの取得](https://www.btcbox.co.jp/api/secret/keys/)

|API|概要|APIキー|
|:---|:---|:---|
|Ticker|売り気配・買い気配・24時間での出来高など|不要|
|Depth|注文量|不要|
|Orders|オーダーブック|不要|
|Blance|アカウントの情報|読み出しのみ|
|Wallet|口座のアドレス|読み出しのみ|
|Trade List|注文一覧|読み出しのみ|
|Trade View|注文の詳細|読み出しのみ|
|Trade Cancel|注文のキャンセル|読み書き|
|Trade Add|注文の追加|読み書き|

## 使い方

```Ruby
require 'btcbox'

btc = Btcbox::Client.new(PUBLIC_KEY,  SECRET_KEY)

btc.ticker(["btc"|"ltc"|"doge"])

btc.depth(["btc"|"ltc"|"doge"])

btc.orders(["btc"|"ltc"|"doge"])

btc.balance()

btc.wallet(["btc"|"ltc"|"doge"])

btc.trade_list(["btc"|"ltc"|"doge"], [since], ["open"|"all"] )
#第二引数としてunixtimeを入れると、その時点以降の一覧となる
#第三引数は"open"を指定すると未完了の注文のみ、"all"だと完了したものやキャンセルしたものを含めた一覧が返る

btc.trade_view(["btc"|"ltc"|"doge"], id)
#第二引数にtrade_listなどで取得したidを指定する

btc.trade_cancel(["btc"|"ltc"|"doge"], id)
#第二引数にtrade_listなどで取得したidを指定する

btc.trade_add(["btc"|"ltc"|"doge"], amount, price, ["buy"|"sell"])
#第二引数に個数、第三引数価格、第四引数に売買のいずれかを指定する
```

戻り値の子細はヘルプの方で。jsonをパースしたものが返ってきます。

[Btcbox > API](https://www.btcbox.co.jp/help/api.html)

<br>

ワンライナーだとこんな感じ。

```
$ ruby -rbtcbox -e'b=Btcbox::Client.new("DUMMY","DUMMY");cnt=0;b.orders.each{|o|cnt+=1;puts "#{cnt},#{Time.at(o["date"].to_i)},#{o["price"]},#{o["amount"]}"}'
1,2015-12-13 14:49:33 +0900,52973,0.808
2,2015-12-13 14:50:43 +0900,52926,0.4235
3,2015-12-13 14:51:39 +0900,52952,2.7395
…
97,2015-12-13 15:54:25 +0900,52813,0.52
98,2015-12-13 15:54:57 +0900,52832,0.254
99,2015-12-13 15:55:53 +0900,52815,0.2655
100,2015-12-13 15:56:23 +0900,52802,0.34
```

<br>

いちおうブログもよろしく => [ビットコイン取引所BTCボックスのAPIを叩くgem作った](http://blue1st.hateblo.jp/entry/2015/11/29/023850)

## 免責事項

いかなる損害やトラブルの責任は一切負いかねますので予めご了承ください
uGUIのButton、Selectable

#概要
Unityのバージョンは5.2.3f1

uGUIのButtonについてのメモです。
Buttonのコンポーネントの内容は以下の通りです。

- Image　Imageについての説明は[こちら](http://qiita.com/seka/items/3cdc47b0d47d85953c39)
- Button
- Text　Textについての説明は[こちら](http://qiita.com/seka/items/a3e478a9525cd36ea0ec)

内容はマニュアルを見ると詳しく載っています。
http://docs.unity3d.com/ja/current/Manual/script-Button.html
http://docs.unity3d.com/ja/current/Manual/script-SelectableNavigation.html

#Buttonの表現
Buttonの表現はTransitionで変わります。

- Noe　変化なし
- Color Tint　色の変化
- Sprite Swap　テクスチャの変化
- Animation　アニメーションで変化
といった感じです。

ボタンの状態は４つに分けられます。

- Normal　通常の状態（Sprite Swapの場合はImageの画像が）
- Highlighted　選択中の状態（フォーカス中）
- Pressed　ボタンを押している状態
- Disabled　ボタンが反応しない状態(Interactableのチェックをはずした状態)

##ButtoのColor Tint
- 各状態の色を設定するとその状態になったときに色が変化する
- Color Multiplierで色の乗算。Fade Durationで色が変化する時間を秒単位で指定

##ButtonのSprite Swap
- 各状態にSpriteを設定するとその状態になったときに画像が変化する
- Normalの画像はImageコンポーネントで設定する

##ButtonのAnimation
- Auto Generate Animationを押してButtonのcontrollerを作成する
- Animationを設定したボタンをHierarchyで選択してAnimationウィンドでScaleやColorを変化させる
http://www.metalbrage.com/UnityTutorials/uGUI/ButtonElement.html

##ButtonのNavigation（Selectable）
- Navigationはキーボードでのフォーカス順を設定できますが、特に使用しない場合はNoneにしておく
 - そうしないとボタンを押したあとフォーカスが残ってHighlightedの状態がつづく
- Explicitに変更すると上下左右の移動先を指定できる（これでボタン選択をループさせることもできる）
 - Select Onに移動先のオブジェクトを選択する
- Button(Script)はAdd ComponentでButton以外にも追加することができる（名称はSelectable）
 - UI > Selectable で追加   
- EventSystemのFirst Selectedに最初に選択しておくオブジェクトを指定できる 

参考ページ
https://yumineko.com/unity-ugui-gamepad/
http://westhillapps.blog.jp/archives/43683528.html
https://gametukurikata.com/program/uifocus

#Buttonのイベント
ボタンのクリックイベントはOn Click()で制御します。
ボタンは押してから離したときにイベントが発生します。
（ボタンを押してから範囲外にドラッグして離してもイベントは発生しない、同様に別の所でクリックしてからドラッグしてボタンの場所でリリースしてもイベントは発生しない）
イベントの追加方法は
1.右下の＋をクリック
2.None(Object)に制御するオブジェクトを選択
3.No Functionで制御するメソッドもしくは変数を指定する

#ButtonのSprict制御
```lang:ButtonTest
  using UnityEngine.UI;

  private Button button1;
  button1 = GetComponent<Button>();  // コンポーネントを取得

  // フォーカスを指定（nullを指定すると何も選択していない状態になる）
  EventSystem.current.SetSelectedGameObject(gameObject);

  // フォーカスされてるオブジェクトを取得
  selectedObj = EventSystem.current.currentSelectedGameObject;

  // このメソッドをOn Click()に指定するとボタンを押したときにメソッドを呼び出す
  public void OnClick()
  {
      button1.enabled = false;
  }
```

#その他のメモ
Buttonには様々な使い道がある

- 横に並べてナビゲーションボタンを作る
- スクロールするようにしてリストボタンを作る
- メッセージボックスのYes Noボタンを作る
- シーンが切り替えられるボタンを作る
- ボタンを押したらアニメーションやサウンドが再生されるボタンを作る
- Scriptでドラック&ドロップの処理を追加する
- Scriptでボタンを押しているときに反応して離したときに解除するような処理を追加する

#参考になりそうなサイトやAsset
スマホの場合、ボタンをつくる上で注意することはボタンのサイズ(小さすぎると押しづらい)
http://www.dotproof.jp/2013/08/06/minimum-tap-size/

ボタン表現の参考サイト
http://baigie.me/sogitani/2014/08/navigation-design-type/
http://lab.sonicmoov.com/smartphone/appli-ui-ux/

ボタンアニメーションの参考サイト
http://tsubakit1.hateblo.jp/entry/2015/02/11/223849
http://www.nxworld.net/tips/css-only-button-design-and-hover-effects.html
http://11neko.com/menu-style-inspiration/
http://nelog.jp/how-to-transformicons
http://elmt.jp/web/2930/#

NGUI（uGUIが出るまでゲームなどでよく使われていたアセット）
https://www.assetstore.unity3d.com/jp/#!/content/2413

#今後の課題
Buttonを使ったリスト、ドロップボックス、ナビゲーションボタンなどの作り方は別の記事で書く予定。
ドラック&ドロップ、ボタンの長押し処理は別の記事で書く予定。
Fluentd 経由で BigQuery に Schema-less なログを入れる


# 背景

gumi で提供しているソーシャルゲームは, サーバ/クライアント共に様々なログを [Fluentd](http://www.fluentd.org) 経由で各種データストアに入れており, 適宜, 解析を行っている.

ログの種別により, Schema-full or Schema-less を選択しているが, 本記事では Schema-less なログの取り扱いを話題とする.

## Schema-less なログの必要性

サーバ/クライアントの開発時から運用時まで, 常に次のような要望がある.

**「気軽に適当なフォーマットでログを出力したい」**

Schema-full なデータストアを採用する場合, 開発者に次のルールを強いる必要がある.

* ログ出力前にテーブルのスキーマを定義せよ
* ログ出力中にテーブルのスキーマを変更するなら, 別テーブルにせよ

これらのルールを開発者が守らない場合, Fluentd 側でエラーが発生するため, 開発者はインフラ担当のヘイトを稼ぐことになる. そして, インフラ担当に怒られた開発者は, 別の手段を模索し始め, 各プロジェクトごとに別々の仕組みが構築される.

よって, Schema-less なデータストアを使用し, Schema-less なログを出力する必要がある.

## データストアの選定

Schema-less なデータストアを選定する場合, 筆者は, まず始めに [MongoDB](https://www.mongodb.org) や [Elasticsearch](https://www.elastic.co/jp/) を候補にあげる. その後, Schema-full だが, データ取得時にフィールドに格納されている JSON フォーマット文字列から必要な情報を部分的に抜き取れる [Redshift](https://aws.amazon.com/jp/redshift/) や [BigQuery](http://cloud.google.com/bigquery/) を連想する.

それぞれのデータストアに得手不得手があるため, gumi では, 適宜, 用途により使い分けている(一つのログを複数の用途で使用するため, ログの複製を複数のデータストアに保存することが多い).

今回の要件は, **「気軽に適当なフォーマットのログを出力したい」** であるため, 次の観点から BigQuery を採用した.

* SQL なら書ける人が多い
* ディスクスペースを考慮する必要がない
* [JSON 関連の関数](https://cloud.google.com/bigquery/query-reference#jsonfunctions)の応答速度が速い
* [ModeAnalytics](https://modeanalytics.com) などで楽にグラフを作成できる

蛇足だが, 前述した他のデータストアを, gumi では次の用途で使用している.

* MongoDB - 行動ログを入れ, カスタマーサポート時に使用
* ElasticSearch - 自由入力文字列を入れ, 伏字処理や特定単語の検索に使用
* Redshift - 検索頻度は高いが, 年単位で遡る事がない場合, BigQuery の代わりに使用
* S3 & Glacier - 蛇足の蛇足. あらゆる全てのログのバックアップに使用

## その他の前提条件

サーバ/クライアントから何らかの経路を辿り Fluentd へログが渡されていることを前提条件とする.

# ログの取り扱い

## ログを JSON フォーマット文字列にシリアライズする

前述した通り, BigQuery は Schema-full なデータストアであるため, ログを JSON フォーマット文字列に変換し, 一つのフィールドに入れる必要がある.

gumi では, ログを JSON フォーマット文字列にシリアライズする Fluentd Plugin [fluent-plugin-record-serializer](https://rubygems.org/gems/fluent-plugin-record-serializer) を作成し, 運用している.

Plugin をインストール後, Fleuntd に次のような設定を追加し,

```fluent.conf
<filter pattern>
  type record_serializer
</filter>
```

次の様なログを送ると,

```json
{
  "spam": "ham",
  "egg": "cheese"
}
```

次の様にシリアライズされる.

```json
{
  "tag": "pattern",
  "payload": "{\"spam\": \"ham\", \"egg\": \"cheese\"}"
}
```

ちなみに, fluent-plugin-record-serializer は [Oj](https://rubygems.org/gems/oj) をインストールすると CPU 負荷が減る.

## BigQuery への保存

Fleuntd から BigQuery にログを入れるため, [fluent-plugin-bigquery](https://rubygems.org/gems/fluent-plugin-bigquery) を使用する.

次の様な本末転倒な Schema ファイルを設置し,

```schemaless_schema.json
[
  {
    "name": "tag",
    "type": "STRING"
  },
  {
    "name": "time",
    "type": "INTEGER"
  },
  {
    "name": "payload",
    "type": "STRING"
  }
]
```

Fleuntd に次のような設定を追加すると,

```fluent.conf
<match pattern>
  type bigquery

  method insert
  auto_create_table true
  schema_path /path/to/schemaless_schema.json
      
  # ..snip..  
</match>
```

指定したプロジェクトのテーブルに, Schema-less なログが入る.

## ログの確認

[JSON_EXTRACT 関数](https://cloud.google.com/bigquery/query-reference#jsonfunctions)を使用し, 必要なログを取得する.

```sql
SELECT JSON_EXTRACT(payload, '$.spam') as spam
  FROM [pattern_20151204] 
 WHERE JSON_EXTRACT(payload, '$.egg') = 'cheese' 
```

# まとめ

SELECT や WHERE 句に payload を指定すると, 非常にサイズの大きいフィールドを扱うため, BigQuery 破産の可能性が上昇する. **ご利用は計画的に**.
PythonでArduinoが刺さってるポートを自動取得

PythonからArduinoにシリアルで文字列を送る場合、pyserialを使って、こんな感じで書くと思います。

```py
import serial

ser = serial.Serial()
ser.baudrate = 9600
ser.port = 2 # COM3->2,COM5->4
ser.open()
ser.write("Hello")
```

ser.portはUSBを抜き差しするたびに変わるので、Arduino IDEでポートを確認し、Macの場合は`ser.port = "/dev/tty.usbmodem1451"`、WindowsだとCOM3に刺さってる場合、`ser.port = 2`と書くわけですが、抜き差しするたびに変わって面倒ということで、こういう書き方も用意されてます。

```py
import serial
import serial.tools.list_ports

ser = serial.Serial()
ser.baudrate = 9600
ser.port = list(serial.tools.list_ports.comports())[0][0]
ser.open()
ser.write("Hello")
```

この書き方、環境によっては失敗するみたいで、Macなら/dev配下を適当に探せば見つかるだろうと、こういう書き方を試してみたら、ちゃんと動きました。

```py
ser = serial.Serial()
ser.baudrate = 9600
for file in os.listdir('/dev'):
    if "tty.usbmodem" in file:
        ser.port = '/dev/'+file
        ser.open()
```

Windowsの場合、数字で指定されるので、こんな書き方でもいいですね。

```py
ser = serial.Serial()
ser.baudrate = 9600
for i in range(100):
  try:
    ser.port = i
    ser.open()
    break
  except:
    i = i
```
AWS Lambda Python で AMI の取得を自動化する


ありそうでなかったので書いてみます。

これまで AMI を取る専用の EC2 を常時起動していたのですが、今回それを Lambda に移行してみました。
もともとの取得スクリプトは旧バージョンの Boto で書いていたので、Lambda 化することより Boto3 化する方が大変でした。

## Lambda ファンクションの作成

新しい Lambda ファンクションを作成してください。
各画面の操作方法は[こちらの投稿](http://qiita.com/ketancho/items/6d5137b48d94eced401e)に詳しく載せていますので、よければ参考にしてください。
注意したいのは、AMI の登録（削除）を行うので、EC2 の操作ポリシーをロールにつけてあげる必要がある点です。

今回は EC2 関連の全ての権限をつけてしまったのですが、本当は使う Action に絞って権限付与すべきです。
[ポリシジェネレータ](https://awspolicygen.s3.amazonaws.com/policygen.html)で作成しましょう。

```lambda_ec2_all
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1448895482556",
      "Action": "ec2:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

## Code

client で対象のインスタンス情報を取ってから、resource で Image 作成しています。
使い方があってるかいまいち自信がないのですが、、特に client の部分もっと簡単に書けるのであれば教えていただきたいです。

今回は Instance ID ではなく、Name で対象インスタンスを決めるようにしています。
`TARGET_INSTANCE_NAME` の部分だけご自分のインスタンス名に変更すれば、動くと思います。


```python:create_ami.py
# -*- coding: utf-8 -*-

import commands, boto3

TARGET_INSTANCE_NAME = '***' # Enter your target Instance Name

def _(cmd):
    return commands.getoutput(cmd)

def create_image(instance_name):
    
    instance_id = ""
    for reservation in boto3.client('ec2').describe_instances()["Reservations"]:
        for instance in reservation["Instances"]:
            for tag in instance["Tags"]:
                if(tag["Key"] == "Name" and tag["Value"] == instance_name):
                    instance_id = instance["InstanceId"]
    
    if instance_id != "":
        instance = boto3.resource('ec2').Instance(instance_id)
        image_name = _('TZ=JST-9 date +"%Y%m%d"') + "_" + instance_name 
        instance.create_image(Name=image_name)

def handler(event, context):
    create_image(TARGET_INSTANCE_NAME)
```

## Configuration

Handler は create_ami.handler としてください。
Timeout は 3秒では心許ないので、5秒〜10秒くらいにしましょう。

## Event sources

私は朝4時に取得したいので、cron(0 4 ? * * *) としています。

ちなみに、上のコードでは AMI の名前が YYYYMMDD_(インスタンス名) となります。
そのため、同じ日に複数回実行すると（同じ名前の AMI は作れないので）エラーになります。

もし、1日複数回 AMI を取得する必要があるのであれば、
`image_name = _('TZ=JST-9 date +"%Y%m%d"') + "_" + instance_name` を
`image_name = _('TZ=JST-9 date +"%Y%m%d%H"') + "_" + instance_name` とすれば大丈夫だと思います。

## まとめ

ここまでで完了です。
試しにテスト実行してみてください。AMI が取れましたでしょうか。

感想としては、冒頭にも書きました通り、Lambda 周りでは全くつまらず、Boto3 を使う部分で少し苦戦しました。
そういう意味では「ビジネスロジックに集中」できているのかもしれません。

次回は、AMI の世代管理を自動化します。
LibreOffice BASE は使えるか？ (1)

結論からいうと当たり前だが用途しだい。

実際につかってみて、いけるかなと思ったのを書いています。
具体的な設定などは、次回以降書いていきます。

**限定的なデータ閲覧、編集（一時的なデータ操作のユーザ・インタフェース）**

フォームをつかって、データの閲覧や、一覧表示などが簡単にできるので、
とりあえず、すぐにデータを閲覧する機能のデスクトップアプリ的なものが
必要な場合には使えるという気がしました。DB接続も簡単です。

どうでしょうか？

ダメなところ
- よく落ちる（きちんとしたビジネス運用には向きません）
- CSVのインポートが直接はできない
- 機能追加したいときは、マクロが必要（既存のアクションは、次へぐらい）
- 情報が少ない（ドキュメントほとんどなし）


**実際にどうするのがいいか？**

Base から外部データベース（sqlite mysql など）を参照して、データの保存編集をする。
その外部データベースのデータの加工は、Base とは関係なく、直接触る。

つまり、

* Base は、データ編集のみ
* 外部データベースを使う
* データの加工（web つくったりなど）は、別のスクリプトで行う

**外部データベースは何を使うといいか？**

* 接続は、JDBC (OS依存が少ないから)
* ローカルなら sqlite （windows は、JDBCだめみたいです。）
* リモート（サーバー経由）ならお好きもの

次は、具体的な設定をかいていきます。
git pushできないときの対処法


## はじめに
最近、Gitをよく使うようになってきた気がします（まだ初心者は脱却できてないと思います）。
そうなると、GithubなりGitLabなりBitbucketなりでの管理も重要になってきて、そうなると当然

```
git push
```

このコマンドを使う必要があるわけですよ。

しかし、このコマンドを打つと失敗することがあります。
エラーメッセージを読めばそれで済む話ですが、読むの面倒だしとりあえずpushしたいんだよ！！
ってなることはないこともないと思います。

そんな時のための対処法（？）です。
あ、今回はsshとかhttpsといった話はしません。それは出来ているという前提で進めます（そっち方面の内容も今度話したいですね。）。


## ステップ1

いきなりステップとか言っちゃいましたけど、ステップ1から順番にやってみ？　という話です。
一応言っておきますが、どんどん強引な手段になっていきますので、本来はちゃんとエラーメッセージを読むべきだと思います。これちゃんと言ったからな！

というわけでステップ1です。

```
git push origin dev
```

devブランチじゃないならdevのところを今のブランチ名にしてください。
masterにいるならdevのところをmasterに変更ですね。
originは簡単に言うとリモートリポジトリにって意味です。

案外これでいけちゃうパターンが多いのではないかと思います。
ちなみにこれでいけましたって人は

```
git push -u origin dev
```

というように、最初のpushで-uをつけていないパターンが多い気がしなくもないです。


## ステップ2

```
git pull
git push
```

pushする前にちゃんとpullできてんのか？　という話です。
ちょっと趣旨と違う気もしますが、意外と忘れている人いたりするんで。
pullのところはfetch+mergeでもいいと思いますが、その辺はどちらでも。

## ステップ3

```
git push origin :dev
git push -u origin dev
```

はい。めっちゃ強引な手です。
最初にリモートのdevブランチを消し飛ばし、そのあとで新たにdevブランチをpushしています。あんまオススメはしません

## ステップ4

```
push -f origin dev
```

はい、こっちも強引ですね。
-fすることで強制的にpushをします。リモートのdevがどこにいようともお構いなしです。
仮にリモートのdevが別のよくわかんないところにいたとしても、そいつは消し飛んでpushされます。
同じくあまりオススメはしません。
権限とか公開鍵秘密鍵の設定によってはエラーがでますし（その場合は鍵を作りなおせばいい話ですが）。
オススメはしませんが、私が一度も使ったことがないといったら完全に嘘になります。
困ったらこれっしょ！　ってやつです。


## まとめ
ステップ1、2については強引じゃないですが、3、4についてはかなり強引ですので自己責任でどうぞ。
まぁ強引っちゃ強引ですが、こういうコマンドがある以上使えはするってことですから、使ってもいいんじゃないですかね。
push -f は、マジ安定感パネェっす。

以上です。