OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAppsScriptで自動化しよう。(勤怠メール送信編)

#はじめに
つい最近GoogleAppsScript(以下GAS)というものを知りました。
JavaScriptライクな言語でGoogleのサービス(GmailとかGoogleDriveとかCalendarとか)を連携できる簡単なスクリプト言語です。

触ってすぐに手に馴染んだので、プログラミング未経験の人でもサクッと書けてサクッと効果が出そうで良い言語だなぁ…と思いました。
URLFetchで外部のRESTAPIを叩いたり、あとはExecutionAPIで外部からGASを叩いたり、一瞬でいろんな応用が思いつく素晴らしいサービスですね。
書いたらすぐ馴染みのGoogleのサービスが動くという点でプログラミング初学者にはうってつけなのではないでしょうか！


というわけで今回は習作として、少し自分の役に立つものを作ってみました。

#何を作ったのか
カレンダーに有給を登録したら勝手に然るべき所にメールを送る感じのやつを作りました。
（特に決まってはなかったのですが、3日前に連絡すればいいかなと思い、そうします。）

#GASを書く
GASでやりたいことは
・1日1,2回カレンダーを監視して3日後に有給が登録されているか確認する。
・もし登録されていればメールを送る。そうでなければスルー。
という感じですね。

ソースはこんな感じ。

```VacationNotifier.gs
///3日後に休暇があるかどうかチェックする関数
function checkVacation(day) {
  
  //カレンダーIDからカレンダーを取得
  var myCal = CalendarApp.getCalendarById("hoge.hoge@gmail.com");//※1

  //この文字列がカレンダーに登録されていたらメールを送信する
  var vacationStr = "有給休暇";
  

  //3日後のイベントを全て取得する
  var events = myCal.getEventsForDay(day);  

  //イベントに対して全てチェック
  for(var i = 0; i < events.length; i++){
    var title = events[i].getTitle();
    //1つでも設定した文字列にマッチするものがあればTrueを返すようにする。
    if(title.match(vacationStr)){
      return true;
    }
  }
    
  return false;
}


///通知を司る関数
function NotifyIfVacation(){
  //現在の時間情報を取得
  var today = new Date();
  //3日後の時間情報を取得
  var after3d = new Date(today.getTime() + (3*24)*60*60*1000);
  //checkVacation()関数を使って判別した結果を格納する変数の宣言
  var isVacationNextWeek = checkVacation(after3d);
  
  //もし3日後に有給予定が入っていたら
  if(isVacationNextWeek){
    //3日後の時間情報をMM/dd形式に直す
    var vacationDateStr = after3d.getMonth()+1 + "/" + after3d.getDate();
    
    //有給だった時に連絡する送信先
    var to = "kaisya.yuukyuu@gmail.com";
    //タイトル
    var title = "休暇:" + vacationDateStr + " fuga";
    //メッセージ
    var body = "各位\n" +
"お疲れ様です。○○です。\n" +
vacationDateStr + "ですが、お休みをいただきます。\n" +
"\n" +
"よろしくお願いします。";
    
    //メールを送る。
    MailApp.sendEmail(to,title,body);
  }
}
```

そして定時実行するためのトリガー(Cron的なもの)を設定します。
![CropperCapture[212].png](https://qiita-image-store.s3.amazonaws.com/0/88657/f0d9ad4c-1ec6-714f-78ae-00dae0fb3245.png)

トリガーはこんなもんでいいでしょう。
(実行関数をNotify~にするのを忘れずに！)


##実装について
基本的にコメント通り。難しくない実装なので…。
checkVacationの※1のIDについて、ちょっとわかりにくかったのでメモ。

カレンダーを開きます。
![CropperCapture[214].png](https://qiita-image-store.s3.amazonaws.com/0/88657/d81011cf-8eff-81cb-5219-84ecc69f1ad9.png)
↓
歯車ボタンを押して、「設定」を開きます。
↓
![CropperCapture[215].png](https://qiita-image-store.s3.amazonaws.com/0/88657/a522bf36-1f65-ccf5-1ce5-daea22f58d10.png)
↓
「カレンダー」タブをクリック。
↓
自分のカレンダーを開きます。

![CropperCapture[216].png](https://qiita-image-store.s3.amazonaws.com/0/88657/73dcbdea-c6c9-e50a-490e-5a804e7dbd6a.png)

このIDを使ってgetCalendarByIdしましょう。

#その他
**他人のカレンダーももちろん使えます。**
![CropperCapture[217].png](https://qiita-image-store.s3.amazonaws.com/0/88657/d7bcd25e-42e3-0055-19e6-31cc39d5daf0.png)

これを使えば鹿島アントラーズの試合がある時は自動で休むことができます。(大体休日に試合があるので使いませんが…)
ウォータフォールとアジャイルと４つの相関関係(スコープ、コスト、品質、スケジュール)

システムを作る時は限られたリソースがあります。
その中で出来ることを定義するにはこの４つの相関関係をしっかり意識しながら判断をしなければなりません。

- スコープ(機能数)
- コスト (リソース)
- 品質
- スケジュール


この４つについては[アジャイルサムライ](http://amzn.to/2i3337S)の本でも荒ぶる四天王として紹介されています。

どれか一つを固定すれば、どれかが犠牲になります。
どこかを重視すれば、全てをこなすことは出来ません。
沢山の機能、高い品質、早いスケジュールで作ろうと思えば、沢山のエンジニアを集め一気に作るしかなくなります。
その場合はコストが掛かるのは明らかです。
コストを抑えて、スケジュールを早くしたいと考えれば品質が悪くなるか、沢山の機能は作ることはできず、本当に必要な機能を作ることしか出来ません。

品質が犠牲になる場合は、正常に動くことだけでなく、変更に弱かったり、無駄にシステムサーバ費が掛かったり、レスポンスが悪いなど、中長期的な技術的な負債を残すことも含まれます。

## SI系の中での開発

今回のSIの開発というものの想定は実際の実装を行う中小のチームや請け負った会社を想定しています。

多くのSIシステムは大規模の中で開発されています。
スケジュールの遅れは他の見えないチームの工程に大きく影響を与えることがあります。
もっと言ってしまえば、影響を与えるかどうかは分からず、開発チームの中で判断できないことが大きいため、アジャイルの中でも柔軟にこなすなかでも、スケジュールを固定されるというのは大きな制限を受けることが多いです。

そして、品質は最低限必要です。
ただ、残念ながら開発会社と運用会社が別なことも多く、高い品質は望めないケースも多いです。
最低限、機能が正常に動くというレベルの最低限の品質になるケースが多そうです。

コストは開発を受注した時に決められてしまいます。金銭的な制限は

スコープはわずかに可能性があります。機能開発を契約した時点では詳細まで決まっていることは少ないです。
難易度の高い仕様や仕様変更、本当に必要な機能を定義していくことが必要です。

その中で、追加というものがあるときには初めてスケジュールとコストに対して交渉出来る余地があるでしょう。

本格的にアジャイルを運用するのはなかなか難しそうです。

それでも、アジャイルのエッセンスは価値があるものであり、小さなプラクティスは取り入れていきましょう。
また、交渉の際はこの４つのバランスを考えながら行動していくべきです。

もし、単純にスケジュールのみを守るように行動すれば、交渉が必要なスケジュール、コスト、スコープを変更することなく、実装したエンジニアだけが知る、品質が犠牲になることが明らかです。

どのようなシステムを作りたいのか？本当に考えてみましょう。


## Web系の中での開発


開発チームが開発し、リリース後は運用やメンテナンス、機能追加も同じ開発チームが行われることを想定しています。

#### スコープ
沢山の機能の要望はビジネスサイドから来ます。
ただ、思いつきも多く、本当に実現したいことより大きな形になっています。
システム側はより簡単で価値のあまり変わらない方法をどんどん提案する必要があります。

#### スケジュール
また、早く出すというスケジュールは市場次第で価値を数倍違うものにします。
BtoCのサービスでは正月のイベントなどに合わせた開発などもあります。
これを遅らせて２月に完成しても、価値が非常に下がってしまうのは明らかです。
ただ、運用を便利にするためにいつか出来ればよいと言う機能などもあります。
これらを考慮しながら開発をする必要があります。


#### 品質
品質は開発チーム自身が運用するため、ここを手を抜きすぎてしまっては、運用で問題の解消ばかりに時間をとられて、中長期的に新しい機能の開発のスピードを下げてしまうことは明らかです。
技術的負債を生んでもスケジュールを絶対守ったほうが良いのか、これから様々な機能追加のベースとなるような実装で、品質を重視するべき機能なのか、判断しながら開発しましょう。

技術的負債についてはこちらにも私の考えを書いているので、読んでみて下さい。
[技術的負債と戦わずにマネジメントする](http://qiita.com/newta/items/b446f7dc52cc50397aca)


#### コスト

開発メンバーの人間的なコストの他に実はサーバ維持費などもコストです。
運用していくと積み上がっていくばかりのことが多いですが、最近はクラウドで開発することも多く、コスト感覚が甘くなっているケースもあります。
数百万円無駄にサーバを構築していると言うケースもあるかもしれません。

コストメンテナンスも定期的に技術的負債の解消と合わせて行うべきでしょう。
月に１回程度、見直したり、技術的負債を解消する活動をすると良いかもしれません。
(私達のチームでは負債解消Dayを設けています)

## アジャイルの相性

アジャイルの相性と荒ぶる四天王の関係は深いです。
SI系でもアジャイルの色々な考えやプラクティスは活用できるものがあります。
しかし、契約そのものをアジャイルにカスタマイズ出来るようにならなければ固定要素が多く、本当に柔軟な開発は難しそうです。

この荒ぶる四天王を考慮した、新しい契約の形態を生み出すことがSIの開発を生まれ変わらせることが出来る答えなのかなと最近考えています。

これらの４つを考えながら何を優先するべきかを考えてマネジメントするべきです。
スクラムでいえば、この判断は開発チームが行うべきかプロダクトオーナーが行うべきか微妙なところです。
ただ、アジャイルという概念でいえば、誰かが行うべきです。

型にはまるのではなく、答えに合う形で自分たちのアジャイル開発を探して下さい。
Unityを触ってみた

##はじめに
「3Dモデルに興味があるならUnityやったら？」と友達が言ってくれたので、とりあえず試しに触ってみました。本当に初級なので気軽に読んでください。

##Unityをダウンロードする
Unityは、おそらくほとんどの人が見たことや聞いたことあると思います。
スマホのアプリとかでもよく見ますね。
![Official_unity_logo.png](https://qiita-image-store.s3.amazonaws.com/0/151990/54f68d46-3ebe-6d33-66ce-89e4d2169ba8.png)

こんな感じのやつですね。早速ダウンロードしましょう。
今回は、Unity 5.4.3f1 (32-bit)を使用します。

##Unityを起動する


Unityを起動すると、こういった画面が出てきます。・・・何をどうしたらいいんですかね？（笑）
![無.png](https://qiita-image-store.s3.amazonaws.com/0/151990/c9febe51-c9d5-7e54-3b25-0c6acc2dbe75.png)


##オブジェクトの作成・移動

いろいろ試してオブジェクトの作成が出来ました。
3D ObjectからQubeを選択すると立方体のオブジェクトが出現します。初心者の僕はこれだけで感動してしまいました（笑）
![Unity.jpg](https://qiita-image-store.s3.amazonaws.com/0/151990/2e890cc3-b55d-3193-45f9-cef8b8dd8dfe.jpeg)
オブジェクトの位置はマウスでも動かせますが、XYZの座標を入力することで、細かく指定できます。

#C#スクリプトを使ってオブジェクトを動かす
C言語すらマスターしていないのにC#はもっと無理!!
なので、見本をもとに入力していきます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/151990/eac05fb6-4812-9a31-70df-d3932351d826.png)

出来ました。
これで、オブジェクトが動かせます。スペースキーを押すとぴょんぴょん跳ねます。

壁をスライドさせたり、衝突すると配置をリセットしたりなどのC#スクリプトも作成しました。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/151990/2e9b5322-6662-4d88-fdb2-14592989c363.png)




##他にやったこと
![13i.jpg](https://qiita-image-store.s3.amazonaws.com/0/151990/25a144f2-e4c7-95b9-c18a-2af55fa0e461.jpeg)



![index.gif](https://qiita-image-store.s3.amazonaws.com/0/151990/b9ae56ec-7dd6-83bc-b3e6-035a78ee2fae.gif)
MMDの3DモデルをUnityの中で歩かせてみました。モデルのキャラは天子ちゃんです。モデルとモーションはネットから落としてきました。


##おわりに
今回は簡単な動作しかしませんでしたが、次はゲームを作ってみたいですね。MMDのキャラをUnityで踊らせたりとかもしたいです（笑）
自主製作ゲームに使ったサービスとか資材とか

この記事は、[東ゲ部 Advent Calendar 2016](http://www.adventar.org/calendars/1585)　19日目の記事になります。

作ってるゲームの個人的な資料です。
https://www.youtube.com/watch?v=VjWuZBH8yNc

コミックマーケット91に出展しますので、それに関してになります。


# ボイス収録
こえせん♪さんにボイス収録お願いしました。
http://voice-koesen.com/

- 複数人に依頼する時でも、担当者一人とやりとりするだけでいいので楽
    - 一人ひとり集めたり依頼したりすればもっと安いかもしれないけど、知らない人にメール書くの苦手だったり、一人で作ってて手が回らない自分には良かった
    - 手間もほとんど掛からない
- 11月1日発注、全データ着が11月8日。3人*200文字前後。



# DLカード
concaさんで注文しました。
https://conca.cc/

- 夏のC90の時は「コードオンリー」オプションで注文して、[プリンター用の名刺用紙](http://www.a-one.co.jp/product/card/?_ga=1.152910713.1754968833.1479321368)に印刷して頒布しました。
    - 0（ゼロ）とO（オー）の違いが分かりやすいフォントにしましょう。
    - 紙だし、ぺっらぺら。体験版とはいえ何か考えた方がいい気がする。

![CplfwjHVMAIwikY.jpg](https://qiita-image-store.s3.amazonaws.com/0/58518/fe1c9e27-c955-1e20-3478-fb05ed0d94f1.jpeg)

- 今回はカードの印刷も依頼しました。0.5mmプラン。
    - 11月15日注文。11月25日発送。
    - 台紙無し100枚で22,000円前後。いい金額するので体験版頒布にはキツイですね。
![c91_dlc_00.png](https://qiita-image-store.s3.amazonaws.com/0/58518/16459e62-7f46-63c8-8ef8-56208bc52e1f.png)

    - 質感比較。
        - amazon券はツヤ有り、concaさんのカードは半ツヤみたいな感じ。
        - 0.5mmプランだと、amazon券よりは薄い。
![c91_dlc.png](https://qiita-image-store.s3.amazonaws.com/0/58518/9f3cfa1d-a293-9030-10d4-021cd2eb55d8.png)





# パッケージ
- DVDメディア
- 外紙

あっれ、この記事上がるまでには出来上がってるハズだったのに……
外紙だけは発注出すつもりでしたが、まだデザインも着手出来てないので全部自前のプリンターで作ります。
買ってて良かった[レーベル印刷できるプリンター](http://cweb.canon.jp/pixus/lineup/allinone/mg6930/)。

# HP
Wixさんを使って作ってます。
http://ja.wix.com/

作成中。
http://tender05.wixsite.com/tender-machinery

今までは作る力出なくて手元にあるpukiwikiに画像貼るくらいだったので……
無料で色々プリセットも有るので良いですね。

と言っても簡素な状態で凝った作りをする予定は無いです。


# 締め
という事であと10日切りました。頑張ります。
モナドTipsについて

今年の1月頃、Twitterでこのようなツイートをしました。
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">favの数だけモナドについての豆知識をツイートします</p>&mdash; こば(競プロのプロを目指す) (@kobae964) <a href="https://twitter.com/kobae964/status/685820977784033281">January 9, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

このツイートは界隈で広まり、(2016/12/18現在)133favをいただきました。しかしまだ56個しかツイートできていません。終わりが見えないのじゃ…(トホホ)
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">モナドtips1個消化するたびにノルマが2,3個増えるんだけど(歓喜)</p>&mdash; こば(競プロのプロを目指す) (@kobae964) <a href="https://twitter.com/kobae964/status/795294376909934592">2016年11月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

この記事では、このモナドtipsツイートに書いた知見をまとめていきたいと思います。

# 1月(卒論)
卒論でStone dualityについて調べていた。当然モナドについての知見が得られることとなった。((7)から(20)まで)
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">(7) モナドは随伴からできるし、モナドがあったら随伴を作る事ができる。複数の随伴から同じモナドができることがあるので、感覚的にはモナドの数は随伴の数より少ない。</p>&mdash; こば(競プロのプロを目指す) (@kobae964) <a href="https://twitter.com/kobae964/status/685853872867246081">2016年1月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">(20) 圏C,Dの間の随伴F-|GとD,Eの間の随伴J-|Kがある時、それらの合成の間にも随伴J.F -| G.Kが存在する。J,KがD上のモナドTを与えるとき、合成された随伴はC上のモナドG.T.Fを与える。</p>&mdash; こば(競プロのプロを目指す) (@kobae964) <a href="https://twitter.com/kobae964/status/686201693453729792">2016年1月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 11月
ラボでcall-by-push-valueについての発表をすることとなり、それについての知識を得ることになった。
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">(55) 副作用を持つ計算の表示的意味論を考えるときはモナドを使うと嬉しいことが知られている。評価戦略が値呼びの場合はクライスリ圏Kl(T), 名前呼びの場合はアイレンベルク・ムーア圏EM(T)を使うと良いことが知られている。</p>&mdash; こば(競プロのプロを目指す) (@kobae964) <a href="https://twitter.com/kobae964/status/794866198206771204">2016年11月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">(56) 値呼びと名前呼びの両方の評価戦略を埋め込める計算体系として、Call by push value calculusというものが知られている。詳しくは<a href="https://t.co/eUqnKnynQh">https://t.co/eUqnKnynQh</a> を参照されたい。</p>&mdash; こば(競プロのプロを目指す) (@kobae964) <a href="https://twitter.com/kobae964/status/795293767875969025">2016年11月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## これから
まだ取り扱っていないテーマ(bialgebra, free monadの具体的な構成方法)などはやっていないはずなので、これから勉強してツイートしていきたい。
セスペH28秋で答えが割れた問題：memcpy()とstrncpy()

なんでもセキュリティ Advent Calendar 2016 19日目の記事です。
セスペH28秋で一悶着あった問題を共有したいと思います。

## 問題と解答

午後１問2（セキュアプログラミング）は、以下に示すヒープベースBOF脆弱性のあるプログラムYに関する内容でした。
※全文は[IPAの過去問ページ](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2016h28.html)を参照してください。

```cpp:ヒープベースBOF脆弱性のあるプログラムY
#include <iostream>
#include <cstring>
//（省略）
#define UID_SIZE 8      // 利用者IDの文字列の上限値
#define PASS_SIZE 8     // パスワードの文字列の上限値
//（省略）
using namespace std;

void getPass(char *pass, char *uid)
{
//（省略，uidで指定された利用者IDを基に登録済パスワードを取得しpassに格納，利用者IDが存在しない場合は長さ0の文字列をpassに格納）
}
//（省略）

int main(int argc, char **argv)
{
    static char *uid;
    static char *pass;
    //（省略，引数の個数をチェック）
    uid = new char[UID_SIZE+1];
    pass = new char[PASS_SIZE+1];
    getPass(pass, argv[1]);
    strcpy(uid, argv[1]);       // 23行目
    
    if (strlen(pass) == 0 || strcmp(argv[2], pass) != 0) {
        cout << "認証失敗" << endl;
        //（省略，uidを出力，認証失敗時の処理）
    } else {
        cout << "認証成功" << endl;
        //（省略，uidを出力）
    }
}
```

このプログラムYに関して、設問3の(2),(3)で以下のようなことが問われました。

```
(2)　利用者認証を回避される原因となるヒープベースBOF脆弱性の存在箇所を，実際にバッファがオーバーフローするコードの行番号で答えよ。
```
これは23行目の strcpy(uid, argv[1]); でBOFの可能性があります。
strcpy()はコピー元に終端記号が現れるまでひたすらコピーを続けようとするからです。

```
(3)　(2)で示した行番号の行を差し替えて行う改修案として適切なものを解答群の中から全て選び，記号で答えよ。
解答群
　ア　memcpy(uid, argv[1], strlen(argv[1]+1);
　イ　memcpy(uid, argv[1], UID_SIZE+1);
　ウ　pass = new char[PASS_SIZE+8];
　エ　strncpy(uid, argv[1], strlen(argv[1])+1);
　オ　strncpy(uid, argv[1], UID_SIZE+1);
```
これについて私は、23行目での問題点はコピーする長さを指定していないことなのだから、長さを正しく指定しているイとオが適切だと判断しました。
実際、**IPAの解答はイとオ**だったのですが、一部の人はmemcpy()とstrncpy()の違いに着目して、イは適切ではないと判断したようです。
資格学校の解答速報も答えが割れました。[アイテック(PDFファイル)](https://www.itec.co.jp/wp-content/uploads/support/shiken/h28a/2016aSCpm1.pdf)はイとオ。[TAC(PDFファイル)](http://www.tac-school.co.jp/kaitousokuhou/downloads/16_28F_SC%E8%A7%A3%E7%AD%94%E4%BE%8B.pdf)はオのみ。

お恥ずかしながら、この2つの関数の違いをよく認識していなかったので調べてみました。

## memcpy()とstrncpy()の違い
memcpy()とstrncpy()はどちらも指定したサイズだけコピーする関数ですが、以下のような違いがあります。

* [memcpy()](http://www.cplusplus.com/reference/cstring/memcpy/)
    * 終端記号の有無にかかわらず指定したサイズをすべてコピーする
    * 終端記号のチェックをしない分だけ高速
* [strncpy()]([strncpy - C++ Reference](http://www.cplusplus.com/reference/cstring/strncpy/))
    * 指定したサイズに到達する前に終端記号が現れればそこでコピーをやめる
    * コピー先の終端記号以降は指定したサイズになるまでゼロで埋める

極端な例を考えると、コピー元の文字列はギリギリでメモリ領域に収まっていても、memcpy()はその先を読み込もうとしてAccess Violationとなる可能性があります。

今回の問いに関して言えば、memcpy()を使っていてもヒープ領域のオーバーフローにはならない、外部から意図的に攻撃できる脆弱性ではない等の理由でイも正答になるということでしょうが、文字列のコピーにはstrncpy()を使う方が適切でしょう。

## 参考
* [IPA：問題冊子・配点割合・解答例・採点講評（2016、平成28年）](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2016h28.html)
* [strncpy - C++ Reference](http://www.cplusplus.com/reference/cstring/strncpy/)
* [memcpy - C++ Reference](http://www.cplusplus.com/reference/cstring/memcpy/)
* [Memcpy() works on out of bounds memory?](http://stackoverflow.com/questions/23000839/memcpy-works-on-out-of-bounds-memory)
etherswitchモジュールの作り方

先週の[gpiospi](http://qiita.com/yamori813/items/30e7b078b98777895ab6)を使ってKSZ8995MAのetherswitchのチップ対応をやってみました。だいたいの手順を書いてみたいと思います。

ターゲットのボードは@SRCHACK.ORGさんより分けてもらったものです。

![IMGP0132.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/aa8f958e-4338-1d6a-4771-54f3791504e2.jpeg)


## データーシートを入手する

ターゲットのチップのデーターシートを入手します。これがないとはじまりません。チップの型番などでgoogleのですが、私は画像検索でデータシートらしきものを探す事が多いです。文字の検索だとサプライヤーなどが引っかかってなかななデーターシートが出てこない時もあります。

データシートを公開していない会社でもたまにもれているものが検索に引っかかったりすることもあります。

データーシートがないチップでもGPLなソースでレジスタ構成などを確認できるケースもあります。この場合レジスタの構成などを確認するのみにとどめ、GPLなコードは忘れる事が大切です。

## 似た構成のソースを探してコピーする

etherswitchの既存ソースでシンプルなもので、コントロールが同じものが良いです。

## チップ名を一括置換

viだと%s/foo/bar/gみたいにして、一括置換でファイル内のチップ名を変換します。小文字のパターンと大文字のパターンで置換します。

## レジスタアクセス部分削除

レジスタアクセス部分はチップ毎に違うので、とりあえず思い切って消してしまいます。どのような動作が必要か確認したい時はコピー元のソースを見てみるのが良いです。ただしifmediaなどの部分は、そのまま使えるので残しておくのが良いです。

## コンパイルが通るようにする

ターゲットSOCのfilesにつっこんで、とりあえずカーネルのコンパイルが通るようにします。

## 素のレジスタ読み書き部分実装

機能的にはmustではないのですが、etherswitch_readregとetherswitch_writeregを作っておくと動きが変なときなどのデバッグに重宝します。etherswitchcfgでregで読めるのですが、この値は16ビットなので注意が必要です。

## probe/attach/mii部分実装

probe/attach部分を実装してカーネルを起動すると、書いたコードが実行されるか確認できます。proble/attachの起動メッセージが問題なければmii部分を作ります。これで起動ログはデバイスが表示され、miiによりSwitchのphyがukphyとしてprobeされます。

## setconfを実装

setconfを実装すると、PORT/DOT1Qな設定がetherswitchcfgコマンドでできるようになります。

## getport/getvgroupを実装してetherswitchcfgで動作確認

getportやgetvgroupはチップのレジスタの値を参照して表示します。これが正しく表示できるように調整します。

返す値はチップのレジスタを参照します。

## setport/setvgroupを実装してセットした値が読み出せるかを確認

etherswitchcfgコマンドで設定した値が正しく表示されるるかを確認します。表示が正しければ動作を確認します。.1qでタグ付きのパケットを送り出す設定はポートに設定するタイプのチップ(KSZ8995MAなど)とVLANグループに設定するタイプのチップ(RTL8366RBなど)があります。前者はsetportで設定して、後者はsetvgroupで設定します。

setportにはいくつかのフラグがあるので、チップが対応している場合は実装します。

## コードのクリーンアップ＆テスト

直値を使っているところはマクロにしたり[styleにあわせて](http://qiita.com/yamori813/items/f01f5d7e105f6f159503)コードを奇麗にします。動作はvlan(4)の組み合わせで確認する事になります。etherswitchcfg,ifconfigでコマンドで設定をおこない、pingやtcpdump -eなどのコマンドで確認をおこないます。基本レジスタが正しく設定できていれば、その通りに動いてくれるはずなので、設定内容の確認をおこなうと良いです。


## レビューを出す

せっかく作ったものなので、headに入れてもらうために[レビューを出します](http://qiita.com/yamori813/items/009a7c1dac6fe35c84eb)。

https://reviews.freebsd.org/D8790

## 最後に

etherswitchをいじりはじめたのは、たまたまハードオフから転がり込んだRT8366SRを動くようにしたのがきっかけでした。ジャンクをあさっているうちにいろいろなswitchチップが手に入り、使えるようにしてみたくなりました。100の頃のスイッチは比較的データーシートが入手しやすいというのも後押ししてくれました。もう蟹には手を出さないつもりで、Marvell,Micrel,Infineonをいじったので、これで一段落としたいと思っています。

Micrel,Infineonのチップは100の最後の頃のチップでいろいろ使われていな機能があります。実際使って効果があるのか試してみるのも面白いのではないかと思っています。
Swiftについての覚書６

#UIWindowについての続き
こんな感じのwindowのボタンの作成からです。
<img width="432" alt="スクリーンショット 2016-12-09 23.46.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/150621/d899c9b1-345e-6d1a-be93-b52fdc96a73f.png">

##OKボタンを作成

        okButton.frame = CGRectMake(0, 0, 90, 50)
        okButton.backgroundColor = UIColor.orangeColor()
        okButton.setTitle("OK", forState: .Normal)
        okButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        okButton.titleLabel?.font = UIFont.systemFontOfSize(15)
        okButton.layer.masksToBounds = true
        okButton.layer.cornerRadius = 8.0
        okButton.layer.position = CGPointMake(testWindow.frame.width/4, testWindow.frame.height-50)
        okButton.addTarget(self, action: #selector(touchOkButton(_:)), forControlEvents: .TouchUpInside)
        testWindow.addSubview(okButton)

##キャンセルボタンを作成

        cancelButton.frame = CGRectMake(0, 0, 90, 50)
        cancelButton.backgroundColor = UIColor.orangeColor()
        cancelButton.setTitle("キャンセル", forState: .Normal)
        cancelButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        cancelButton.titleLabel?.font = UIFont.systemFontOfSize(15)
        cancelButton.layer.masksToBounds = true
        cancelButton.layer.cornerRadius = 8.0
        cancelButton.layer.position = CGPointMake(150, testWindow.frame.height-50)
        cancelButton.addTarget(self, action: #selector(touchCancelButton(_:)), forControlEvents: .TouchUpInside)
        testWindow.addSubview(cancelButton)

##テキストを設定
        message = UITextView(frame: CGRectMake(10, 10, testWindow.frame.width - 20, 150))
        message.backgroundColor = UIColor.clearColor()
        message.text = "ずず〜ん！！"
        message.font = UIFont.systemFontOfSize(CGFloat(27))
        message.textColor = UIColor.redColor()
        message.textAlignment = NSTextAlignment.Left
        message.editable = false
        self.view.bringSubviewToFront(message)
        testWindow.addSubview(message)

##windowが表示されている間はタッチイベントを無効に設定
        self.view.userInteractionEnabled = false

##OKボタンをタップされた時に呼び出されるメソッド

    func touchOkButton(sender: UIButton) {
        print("OKが押されました")
    }

##キャンセルボタンをタップされた時に呼び出されるメソッド
    func touchCancelButton(sender: UIButton) {
        testWindow.hidden = true
        // viewのタッチイベントを有効化
        self.view.userInteractionEnabled = true
    }

これで完成！！！
![Untitled3.png](https://qiita-image-store.s3.amazonaws.com/0/150621/5be5bae8-1283-c49c-c065-73a22d112506.png)
いまさらだけど、Amazon QuickSightをさわってみる

当記事はアカウンティング・サース・ジャパン Advent Calendarの19日目です。

開発グループでマネージャーをしています。
エンジニアではありませんが、出しゃばって今回もAWSネタでいこうと思います。

Amazon QuickSightは先月一般提供が開始されましたので、いまさらですが試してみようと思います。
https://aws.amazon.com/jp/blogs/news/amazon-quicksight-now-generally-available-fast-easy-to-use-business-analytics-for-big-data/

まだ東京には来ていませんので、US West(Oregon)で試してみます。

# 構成概要

郵便局の郵便番号データをRDSに突っ込んで、QuickSightで見てみます。

# RDSでの作業

1.郵便番号データをutf8で突っ込みたいので、まずはDBパラメータグループを新たに作成する。
2. reoyさんの[ここ](http://qiita.com/reoy/items/e355debf1e2b2abd703b)を参考に値を変更し、保存する。
3. RDSを作成
4. パラメータグループは、2で作成したものを選択する。
5. QuickSightからのアクセス用SecurityGroupに↓を追加する。

| 項目 | 値 |
|:--|:--|
|タイプ   |MYSQL/Aurora   |
|プロトコル   |TCP   |
|ポート範囲   |3306   |
|送信元   |54.70.204.128/27（Oregon用。[ここ](http://docs.aws.amazon.com/quicksight/latest/user/enabling-access-rds.html)を参照）   |


5を忘れると以下のように怒られます。
![New Data Set(1).png](https://qiita-image-store.s3.amazonaws.com/0/52548/ffe21d8e-8f0d-e282-1ccb-d8fa4df8a360.png)

# EC2での作業

郵便局のサイトから郵便番号データをダウンロードして、RDSに突っ込みます。
kesuzukiさんの[ここ](http://qiita.com/kesuzuki/items/6d6c89a876d7b8ea820c)を参考にほぼそのままでOK


# QuickSightでの作業

1. RDSを選択
![New Data Set.png](https://qiita-image-store.s3.amazonaws.com/0/52548/fc2d96c6-5030-5c5a-32cc-666f9e3aec81.png)

2. 接続情報を設定
![New Data Set(2).png](https://qiita-image-store.s3.amazonaws.com/0/52548/2eb50926-ea19-1c6c-798f-f89e659e1f46.png)

3. 作成したテーブルを選択
![New Data Set(3).png](https://qiita-image-store.s3.amazonaws.com/0/52548/6d25052b-342a-294b-6510-5ad7b1067412.png)


4. データの呼び出し方法を選択（ここではSPICEを選択）
![New Data Set(4).png](https://qiita-image-store.s3.amazonaws.com/0/52548/7a8f7a6f-1742-15f5-903e-283bc9d8cf0c.png)

5. こんな感じの画面が表示されます。

 ![Analysis.png](https://qiita-image-store.s3.amazonaws.com/0/52548/049cdce6-4cfc-6e2f-1a95-68cb49149a76.png)


 ![Analysis(1).png](https://qiita-image-store.s3.amazonaws.com/0/52548/1f67d2d1-40bb-8b84-fbdf-a4c0af410052.png)


# Storyについて

1. Visualizeの各画面において、右上の「Capture」ボタンを押すと、Storyにその画面が追加されていきます。
![Analysis(4).png](https://qiita-image-store.s3.amazonaws.com/0/52548/d60feeba-e640-e831-e509-1dd30f0d7b78.png)


2. 左のサムネイルの所で「▶」を押すと、Storyが開始されます。
![Analysis(3).png](https://qiita-image-store.s3.amazonaws.com/0/52548/2894b449-cd09-1a79-f552-1a83beaaf939.png)

各ページごとに表示範囲を操作しながら説明ができるのが面白いと思います。


# 最後に

一時はPreview誰も当たってないんじゃないか？、本当に完成しているのか？的な心配をされていたような気がしますが、
無事一般公開されて何よりです。
Storyはまだまだこれからぽいですが、今あるDBから手軽にグラフが作成できるのは便利だと思います！
Alamofire 4系と3系でJSONデータを取得する方法

# はじめに
19日目は、[スマートテック・ベンチャーズ](https://www.wantedly.com/projects/72590?ql=gaJpZM4AKYPb)の本山(@k_moto)が担当します

今回はとても有名なAlamofireについて。
4系と3系でrequestメソッドの使い方がちょっと変わったので、
そのあたりを記載しておこうと思います。


## 3系と4系の比較
例)こんな感じのurlから取得する場合
https://○○/△△/?text=test&sort=asc


3系

```

let urlString = https://○○/△△/
let params = ["text":"test","sort":"asc"]

Alamofire.request(.GET, urlString, parameters: params )
    .responseJSON{ response in
        if let dict = response.result.value as? NSDictionary {
            print(dict)
        }
    }

```

4系

```
let urlString = https://○○/△△/
let params = ["text":"test","sort":"asc"]

Alamofire.request(urlString, parameters:params)
    .responseJSON{ response in
        if let dict = response.result.value as? NSDictionary {
            print(dict)
        }
    }
```

4系はデフォルトでGETメソッドでのリクエストになったようです。
明示的に変更する場合、method: .get　のような感じで引数に追加します。

公式のREADMEには詳しく記述されています。
Migration Guideには4系になって何が変わったか比較して記述されているので、
検索して出てきた通り実装しても動かない場合は、
違うバージョンの実装方法の可能性があるので、
一度目を通してみましょう。

https://github.com/Alamofire/Alamofire

## 最後に
スマートテック・ベンチャーズでは、未経験だけどiOSの開発をやりたい！という人を募集しています。
Advent Calendarのスマートテック・ベンチャーズページに会社およびWantedlyのURLをのせていますので、興味のある方は是非ご覧ください。
http://qiita.com/advent-calendar/2016/stv

明日は@eKushidaさんです。
お楽しみに！
音声認識OSS kaldiのCSJレシピに必要なモノと設定

<ご注意>
本サイト及び本サイトの情報を利用することによって生じるいかなる損害についても，責任を負うものではありません．
また，発言は個人の見解であり，所属する組織の見解ではありません．

# はじめに
音声認識システムを構築するソフトと言えばHTKがメジャーであるが，近年kaldiが有名になってきている．kaldi自体はOSSだが，有料のデータやツールに依存している部分がある．そこで，日本語レシピであるCSJレシピの動作に対して，用意が必要なものと設定方法を記述する．

# 準備するもの
### kaldi本体
無料のOSSであり，以下のコマンドでgithubからcloneすることが出来る，
> git clone https://github.com/kaldi-asr/kaldi.git

インストール手順は~/kaldi/INSTALLに記述されている．
[CSJレシピの製作者によるページ](http://www.ts.ip.titech.ac.jp/demos/csjkaldi/index.html
)に詳しい手順が日本語で記述されており参考になる．

## CSJ
日本語話し言葉コーパス( Corpus of Spontaneous Japanese : CSJ )
今回動作させるCSJレシピではこのコーパス内の音声や書き起こしテキスト等を用いる

入手・使用は国立国語研究所へ利用申請，審査が必要で，使用料は利用形態により異なる．
2016/12/18現在バージョンは第５刷でUSBメモリ１本で提供される．

* アカデミック利用 学術研究のみに利用する場合 : 学生２万５千円, 研究機関５万円
* 一般利用 企業による商品化を前提としない研究利用 : ２５万円
* 商業利用 上記以外の営利を目的とした利用 : ５０万円

以下から一部引用
http://pj.ninjal.ac.jp/corpus_center/csj/subscription.html

## SRILM
言語モデルを作成するツールであり，CSJレシピ内でも使用されている．
政府機関，学校機関，NPOであれば[SRILM Research Community License](http://www.speech.sri.com/projects/srilm/docs/License)の元で[無償使用](http://www.speech.sri.com/projects/srilm/download.html)が可能．※外部資金を受けていないプロジェクト(政府による研究助成金・契約は除く)に限る
商用利用の場合には直接[問い合わせ](http://www.speechatsri.com/utils/contact.php)が必要となっている．

# CSJレシピを動かす
kaldi本体のセットアップは前述の[詳しいサイト](http://www.ts.ip.titech.ac.jp/demos/csjkaldi/index.html
)を参照願いたい．
### SRILMのインストール
1. kaldi/toolsにsrilm.tgzを配置
ここで，入手したsrilmがsrilm.tgzでない場合install_srilm.sh内部を書き換え
> srilm.tarのとき
> 16行目 f [ ! -f srilm.tgz ]; then 
> → f [ ! -f srilm.tar ]; then
> 30行目 tar -xvzf ../srilm.tgz
> → tar -xvf ../srilm.tar

2. kaldi/tools/install_srilm.shを実行

### CSJパスの設定，レシピ実行
1. kaldi/egs/csj/s5に移動
ここでrun.sh内にCSJのパスの設定があるので書き換え(CSJは第５刷USBメモリ版とする)
> 25行目 CSJDATATOP=/db/laputa1/data/processed/public/CSJ
> → CSJDATATOP="CSJを配置したパス"
> 26行目 CSJVER=dvd
> →　CSJVER=usb

2. GridEngineを用いた分散処理を行わないならばcmd.shを書き換え
> 13行目 export train_cmd="queue.pl --mem 2G"
> → コメントアウト
> 18行目 #export train_cmd=run.pl
> → コメントアウト解除

3. run.shを実行することでレシピを実行

# おわりに
以上の手順で一通り動作するはずである．

間違い等がございましたら指摘，訂正をお願い致します．
今回の出展でのAndroidビルドのはまりどころ

この記事は、[数学カフェ_4次元コンテンツ出展の記録 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mathcafe4d) の、19日目の記事です。

[４次元を見てみよう ～情報技術で描く数学の未来～](http://www.jst.go.jp/csc/scienceagora/program/booth/aa_046/)

今回は、副コンテンツであるハコスコアプリの概要を書こうと思います。

## どんなコンテンツか?
八胞体をハコスコアプリでみるコンテンツです!

### 八胞体ってなに？
簡単に言うと、4次元の立方体を3次元に投影したもの
[八胞体wiki](https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%85%AB%E8%83%9E%E4%BD%93)

### 使ったUnityのAsset
[Mesh 4D Engine & Morpher](https://www.assetstore.unity3d.com/jp/#!/content/34475)

## ビルドまでの流れ

### ビルドの環境設定について、
[Unityで作成したゲームをAndroidアプリ向けにビルドする方法【初心者向け】](https://techacademy.jp/magazine/2229)

#### Androidのビルド環境を整える。
* JDKのインストール
* Android SDK（面倒なので、AndroidStudio入れる方がいい。）

### Unityの設定
### Androidのビルド環境
#### Unityでのビルドツールを入れておく
Unityで「File→Build Setting→Android」を選択して、Androidのbuild環境を入れておく。
#### JDKとSDKのパスを通す
Unityのメニュービュー「Edit→Prefrenceｓ→ExternalTools→Android」でSDKとJDKのパスを通す。（パスの例、SDK:「C:/Users/【ユーザー名】/AppData/Local/Android/sdk」、「C:\Program Files (x86)\Java\jdk1.8.0_66\」）
#### ビルドの詳細設定
メニュービューから、「File→BuildSettings→Android」を表示
`Identification` の `Build Identifier` で「com.Company.ProductName」のデフォルトの設定を書き換える（「com.」から先を書き換えたら大丈夫）
`Minimum API Level` の設定を最低に落としておくと通りやすい（Android2.3.1 API Level 9）

で準備完了です。

### ビルド時の注意点
* 今回のアセットの場合、GPUにかなり処理を不可を書けるためハイスペックのスマホが必要です。
* 「Galaxy S7 edge」でなぜかビルドが通らなかった（展示の時はNexus5Xを使用）

### アプリの写真
![Screenshot_20161218-223451.png](https://qiita-image-store.s3.amazonaws.com/0/102634/584ea022-e949-786e-edb4-f8a8a9bc2a5a.png)

こんな感じです。

よき、VRライフを～
スーパーマリオランの権利表記から使ってるライブラリを調べてみた

2016年12月16日現在

## UniRx
時間が絡んだ「非同期処理」や「イベント処理」等を、Unityで簡単に実装できるライブラリ。
詳しい説明は以下SlideShareが非常にわかりやすく説明しているます。

http://www.slideshare.net/torisoup/unity-unirx

ライセンス　MIT License
開発元　Yoshifumi Kawai（https://github.com/neuecc/UniRx）



## FlatBuffers
ゲーム開発向けの高速なシリアライズライブラリ。
ユーザーデータやゲームのセーブデータで使っているんでしょうね。

ライセンス　Apache License V2
開発元　Google（https://github.com/google/flatbuffers）


## OpenSSL
SSL及びTLSプロトコルライブラリ。
脆弱性発見＞バージョンアップせな…でしょっちゅう話題になっていますね。

ライセンス　OpenSSL License
開発元　OpenSSL Project（https://github.com/openssl/openssl）


## iOS Native Code Samples
Unityで色んな機能が使えるサンプルアセットセットライブラリ。
Xcodeプロジェクトを直接編集したりするのにXcodeProjectUpdaterを使っているんでしょう。

ライセンス　MIT License
開発元　Unity Technologies（https://bitbucket.org/Unity-Technologies/iosnativecodesamples）


## MiniJson in C#
JSONをパースするライブラリ。

ライセンス　MIT License
開発元　Calvin Rien（https://gist.github.com/darktable/1411710）


## Facebook SDK for Unity
FacebookSDK、どこで使ってるんでしょうか…？

ライセンス　 License
開発元　Facebook（https://developers.facebook.com/docs/unity/downloads）


## adjust SDK for Unity
adjustという効果測定サービスを使う際に使用するSDKライブラリ。
管理画面がちょっとわかりにくい気がします。

ライセンス　MIT License
開発元　adjust GmbH（https://www.adjust.com/mobile-app-tracking-sdk/）


## Firebase-Unity
FirebaseというmBaasをUnityで使う際に使用するライブラリ。
Cloud Messaging、Crash Reporting、Notificationとか使ってるんでしょうか.

ライセンス　Apache License V2
開発元　Google（https://github.com/firebase/Firebase-Unity）




以上
Qiita はウェブ魚拓に対応してほしい

どうも Qiita の記事は [ウェブ魚拓](https://megalodon.jp/) に非対応のようでして、これが意図的なのか否かよくわからないのですが、意図ぜず非対応になっているのであれば、ご対応をお願い致したく。

http://qiita.com/robots.txt において、以下の行を削除するだけでウェブ魚拓には対応できます。

```
# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
# User-Agent: *
# Disallow: / ← ★ここの行を消せばウェブ魚拓に対応されます

User-agent: *
....
```

コメント部分の削除で対応できてしまうというのはなんだかウェブ魚拓側の動作の問題のような気もしますが一応 Qiita 側の対応方法もお伝えしておきます。


## 補足：ウェブ魚拓側に送ったメッセージ
ウェブ魚拓側にも以下のようなメッセージを送ってあります。

> Qiita (http://qiita.com/) の記事の魚拓をとることができません。
> http://qiita.com/robots.txt を参考に、どの行が魚拓不可に影響しているのか検証してみたところ、
> 「# Disallow: /」という行の有無で魚拓の可否が分かれるようでした。
> 「#」で始まる行はコメントなので挙動に影響があるのは不本意に思うのですがいかがでしょうか。
> お手数ですがご確認いただければ幸いです。
タブページ数に応じて幅が変わる tabline プラグインを作成しました

[Vim (その2) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vim2) の 19日目の記事です。

## vim-responsive-tabline

タブページ数に応じて幅が変わる tabline を実現する [vim-responsive-tabline](https://github.com/yami-beta/vim-responsive-tabline) を作りました。

![vim-responsive-tabline.gif](https://qiita-image-store.s3.amazonaws.com/0/31403/a9c1d222-1538-0cba-7dd6-8a2717b0a4e1.gif)

### 動機

自分はウィンドウの分割等はせず、1バッファを1タブページに割り当てる使い方をしているため、タブページが増えやすく tabline に表示しきれなくなることが度々あります。
そこで、chrome のようにタブが増えたらタブ1つあたりの幅を小さくしてくれると嬉しいなと思い vim-responsive-tabline を作成しました。

### 仕組み

1つのタブページあたりの幅を `&columns` をタブページ数で割って算出するという単純な仕組みです。

表示するファイル名が `tab_width` (タブ1つあたりの幅)を超えていた場合は切り詰め、`tab_width`以下の場合はスペースで埋めることで、幅を固定しています。

```vim
  let label_margin = 2
  let filename_length = strwidth(filename) + label_margin
  if filename_length > a:tab_width
    " Truncate filename
    let ellipsis = '...'
    let filename = filename[0:(a:tab_width - strwidth(ellipsis) - label_margin - 1)].ellipsis
  else
    " Append spacer
    let filename = filename . repeat(' ', a:tab_width - filename_length)
  endif
```

### 課題

- オプションの追加
- help の作成

### 参考
vim-responsive-tabline を作成するにあたって、以下のサイトを参考にさせていただきました。

- ['tabline' を活用しよう - 永遠に未完成](http://thinca.hatenablog.com/entry/20111204/1322932585)

## 感想

小さいプラグインではありますが、Vim を自分好みにちょっと近づけられたような気がして満足度は高めです。
高速起動用ミニマム*scratch*バッファ

Emacsを高速起動するための \*scratch\* バッファと専用メジャーモードの紹介です．

### A. 起動時に \*scratch\* バッファ表示する

通常は\*GNU Emacs\*バッファが起動時に表示されます．Fundamentalモードが適用されている通常の起動画面ですが，これを\*scratch\*バッファに切り替えます．

```el
(setq initial-buffer-choice t)
```


### B. \*scratch\* バッファに高速起動用のミニマムメジャーモードを適用

\*scratch\* バッファに紐付いている Lisp Interactionモードで起動しても十分高速ですが，少々味気ないです．

![Screen Shot 2016-12-02 at 11.58.39 AM.png](https://qiita-image-store.s3.amazonaws.com/0/12232/87f58e71-6ee4-6b3a-79d3-01439a7317b8.png)

また「Emacs起動=Lisp書く」が成り立つのは一部のユーザだけで，一般的には通常のテキストをメモ的に編集できれば十分なはずです．そこで，最小限の情報表示とテキスト編集が可能な高速起動用のミニマムメジャーモードを紐付けます．

https://gist.github.com/takaxp/6199e206afa6f79f6afbd3a1e7efd9b6 にある buffer.el を使います．何もしないメジャーモードです．

```el:buffer.el
;;; buffer.el --- Temporal buffer for fast boot

(defun buffer-mode ()
  "Buffer Mode"
  (interactive)
  (setq mode-name "Buffer")
  (setq major-mode 'buffer-mode)
;;  (setq buffer-mode-map (make-keymap))
;;  (use-local-map buffer-mode-map)
  (run-hooks 'buffer-mode-hook))

(provide 'buffer)

;;; buffer.el ends here
```

その他のメジャーモードを紐付けても良いですが，多くの場合はそのメジャーモードに紐付けられたマイナーモードがあり，起動時にそれらと関連設定も読み込まれてしまうため，起動時間に影響を与えます．

### C. 設定

何もしないメジャーモードを起動時に使い，最小限の情報を表示してちょっとだけ修飾させます．

```el
(when (require 'buffer nil t)
  (setq initial-scratch-message nil) ;; This buffer〜で始まる文章を表示しない
  (setq initial-major-mode 'buffer-mode) ;; buffer-modeで起動する
  (set-face-foreground 'header-line "#333333") ;; 装飾
  (set-face-background 'header-line "#ffb08c") ;; 装飾
  (set-face-attribute 'header-line nil
                      :inherit nil
                      :overline nil
                      :underline nil)
  (setq header-line-format ;; ヘッダーラインに「週番号」と「日付」を表示
        (concat
         "  Buffers                                                    "
         (format-time-string "W%U: %Y-%m-%d %a."))))
```

これで起動すると，\*scratch\*バッファが次のような見た目になります．

![Screen Shot 2016-12-02 at 11.51.21 AM.png](https://qiita-image-store.s3.amazonaws.com/0/12232/4fef1a62-168a-0bf8-51f7-78a059746004.png)

`header-line-format`の内容を変えれば，好みの情報を表示させることが可能です．もちろん配色も変えられます．

### D. おまけ

\*scratch\*バッファの通常運用法は好みの問題になりますが，私の場合は主に「揮発性のあるメモ」として利用しています．とりあえずどこかにペーストしておきたい場合に都合の良いコピペ場所になります．キーバインドを設定して，瞬時に\*scratch\*バッファへ移動できるようにしてあります．

```el
(global-set-key (kbd "C-M-s")
                #'(lambda () (interactive)
                    (switch-to-buffer "*scratch*")))
```

メモと言えば Org Mode ですから，マイナーモードの `orgstruct-mode` もしくは `orgstruct++-mode`を紐付けてもよいです．ただし，Emacs 起動時にはそれなりのオーバーヘッド（数十[ms]）があるので要注意です．

```el
(add-hook 'buffer-mode-hook #'(lambda () (orgstruct-mode)))
```

なおフレームの見た目はもっとシンプルにできます．

```el
(tool-bar-mode -1) ;; ツールバーを非表示に
(set-scroll-bar-mode nil) ;; スクロールバーを非表示に
```

![Screen Shot 2016-12-02 at 12.34.19 PM.png](https://qiita-image-store.s3.amazonaws.com/0/12232/17456bc7-6c27-1bc9-22c0-5b82015f485f.png)

↑こんな感じ（カーソルの色と形は別途変更しています）
Vim 8.0 Advent Calendar 19 日目 新しい関数 ～特殊操作編～

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 19 日目の記事です。

関数紹介編の最後です。特殊な操作をするものや、その他雑多な関数を紹介します。

## `uniq({list} [, {func} [, {dict}]])`

配列内の連続する同じ要素を削除します。
全体から重複を削除したい場合は事前に `sort()` 関数を使う必要があります。

```vim
let new_uniq_list = uniq(sort(copy(list)))
```

比較にはデフォルトで文字列表現を使います。`{func}` や `{dict}` を与えることで、`sort()` 関数と同様に比較方法を指定することが可能です。

## `execute({command} [, {silent}])`

Ex コマンド `{command}` を実行し、コマンドラインへの出力を結果として返します。
`{command}` は文字列か、文字列の配列です。

`{silent}` は `""` `"silent"` `"silent!"` のいずれかで、コマンドのプレフィックスのように使われます。デフォルトは `"silent"` です。

```vim
echo filter(split(execute('scriptnames'), "\n"), { i, line -> line =~# '^\s*1:' })
" =>   1: ~/.vim/vimrc
```

Ex コマンドの実行中に `:redir` Ex コマンドを使うことはできません。

## `matchaddpos({group}, {pos}[, {priority}[, {id}[, {dict}]]])`

`matchadd()` 関数のようにウィンドウ内にハイライトを追加しますが、`matchadd()` 関数はパターンを指定するのに対し、`matchaddpos()` 関数は位置を指定します。
`{pos}` には位置のリストを指定します。位置は以下のうちのいずれかです。

| 型 | 説明 |
|:---|:-----|
| 数値 | 行番号です。行全体を強調表示します。 |
| 数値を 1 つ持ったリスト | 行番号です。行全体を強調表示します。 |
| 数値を 2 つ持ったリスト | 行番号と、その行の桁です。単位はバイトで、指定した文字を強調表示します。 |
| 数値を 3 つ持ったリスト | 行番号、桁、文字列長(バイト単位)です。 |

一度に指定できる位置は 8 個までです。

## `setfperm({fname}, {mode})`

ファイルのパーミッションを設定します。`{mode}` は `getfperm()` 関数の戻り値と同様のフォーマットである、`"rwxrwxrwx"` 形式で指定します。

## `systemlist({expr} [, {input}])`

`system()` 関数と同様ですが、戻り値は行単位のリストになります。戻り値内の NULL 文字(`\0`)は改行文字に変換されます。
これにより、結果に NULL 文字が含まれてるコマンドの結果も取得できます。

## `perleval({expr})`

if_perl を使って Perl の式を評価し、結果を Vim のデータ形式に変換して返します。
これは `pyeval()` 関数や `luaeval()` 関数の Perl 版です。

```vim
echo perleval('{"foo" => "bar"}')
" => {'foo': 'bar'}
```

## `exepath({expr})`

実行コマンドのフルパスを取得します。絶対パス、相対パス、`$PATH` の中に存在するファイルが実行ファイルだった場合、そのフルパスを返します。

```vim
echo exepath('git')
" => /usr/bin/git
```

## `isnan({expr})`

`{expr}` が `NaN` 値であるかを判定します。

```vim
echo isnan(0.0 / 0.0)
" => 1
```

## `reltimefloat({time})`

`reltime()` 関数の経過時間の戻り値を秒数の Float 値に変換します。

```vim
let start = reltime()
sleep 1
echo reltimefloat(reltime(start))
" => 1.000287
```

以前から経過時間を文字列に変換する `reltimestr()` 関数がありましたが、こちらは文字列であり、かつ先頭に空白が含まれているため、表示以外の目的で使うには少々扱いづらいという問題がありました。`reltimefloat()` 関数を使うことで直接 Float 値が得られるため、平均の計算などがやりやすくなります。
Fess 検索にAD連携のロールを利用

Fess 10.3 (Mac OS)
WindowsServer2012 (VirtualBox)

WindowsServer2012のActiveDirectoryのグループでクロール結果の出し分けを行います。

#### Windows AD

| ユーザー         |  グループ |
|:-------------|:------------------|
| testuser1     | Group1 |
| testuser2      | Group2 |

#### ウェブクロールとデータストア(CsvDataStore)の設定

パーミッションにADのグループを追加
`{group}Group1` や`{group}Group2`のように記述します。

#### ファイルシステムクロールの設定

WindowsのADで管理されたファイルシステムをクロールする場合は
ファイルに設定された権限に基づいて検索されます。
Python初心者が引っかかったところのメモ

Python2.7勉強中。

#処理とか
## インクリメント、デクリメント演算子はない
インクリメントは `i = i+1`で

## forはリストの中身で繰り返し処理するもの
他言語のような`for (i=0 ; i<10 ; i++)`のようなループはない

```py:whileを使うとか
cnt = 0
while cnt<10:
    print cnt
    cnt += 1
```

```py:range関数で指定範囲のリストを作ってforで回す
for i in range(10):
        print i
```

#文字列関係
## 文字列+数値の連結はエラーになる
変数は最初に定義した型で規定される。

```py:数値はいったん文字列に変換してから連結する
print 'abc'+str(123)
```

```py:またはformatを使うとか
print 'abc{0}'.format(123)
```


##文字列は基本的にバイト文字列。unicode文字列を扱う時は、明示的に'unicode文字列だよ'と宣言しないといけない

```py
print len('あいうえお')
# 15
```

```py
print len(u'あいうえお')
print len('あいうえお'.decode('utf-8'))
print len(unicode('あいうえお', 'utf-8'))
# 上記の結果は全部5
```

##フォーマット出力

```py:sprintfっぽいもの
'%s %d %f' % ('あいうえお', 10, 1.2345)
```

```py:format関数
print '{0} {1} {2}'.format('あいうえお', 10, 1.2345)
```

%を使ったsprintfっぽいやつは、sprintfと同様のフラグが使える

```py
print '%s %04d %.2f' % ('あいうえお', 10, 1.2345)
#あいうえお 0010 1.23
```

##unicode文字列のフォーマット出力
以下のコードはエラーになる

```py
print '{0} {1} {2}'.format(u'文字列', 10, 1.5)
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
```

正解はフォーマット文字列もunicode文字列にする

```py
print u'{0} {1} {2}'.format(u'文字列', 10, 1.5)
#文字列 10 1.5
```
1つのmigrationファイルでRails 4.2系と5.0系両対応する「activerecord-compatible_legacy_migration」

# どんなgemか
同一のmigrationファイルでRails 4.2系とRails 5.0系の両方でいい感じに動くようにするためのgemです

* https://github.com/sue445/activerecord-compatible_legacy_migration
* https://rubygems.org/gems/activerecord-compatible_legacy_migration

これだけだと分かりづらいので具体例を出します

#　前提
## Rails 4.2系から5.0系へのmigrationファイルの移行について
Rails 4.2系から5.0系に移行する時に、Rails 4.2で作られた既存のmigrationのスーパークラスを下記のように `ActiveRecord::Migration` から `ActiveRecord::Migration[4.2]` にします

## Rails 4時代のmigration
```ruby
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.timestamps null: false
    end
  end
end
```

## Rails 5移行後のmigration
```ruby
class CreateUsers < ActiveRecord::Migration[4.2]
  def change
    create_table :users do |t|
      t.timestamps null: false
    end
  end
end
```

`ActiveRecord::Migration` のままでもエラーにはなりませんがログファイルに下記のようなDEPRECATION WARNINGが出ます。（コンソールには出ないので注意）

```
DEPRECATION WARNING: Directly inheriting from ActiveRecord::Migration is deprecated. Please specify the Rails release the migration was written for:

class CreateUsers < ActiveRecord::Migration[4.2]
```

# ユースケース
アプリであればmigrationファイルを上記のように修正すればいいのですが、moutable engineのようにgemの中に内包されてるmigrationファイルをアプリの db/migrate/ にコピーするgemだとそうはいきません。

* gem内のmigrationファイルが `ActiveRecord::Migration` の場合
    * アプリでRails 4.2系を使ってる時は問題なし
    * アプリでRails 5.0系を使ってる時にDEPRECATION WARNINGが出る
        * 動きはするけど、5.1辺りで使えなくなる可能性もあるのでできれば放置はしたくない
        * とはいえgem開発者的にはなるべく多くのバージョンに対応しておきたい
        * アプリでmigrationファイルを修正後にgemのmigration installコマンドをたたいた時にgem側のmigratonファイルとアプリ側のmigratonファイルで差分があると「変更されてるけど上書きしますか？」的な確認が大量にでそう（自信ない）
* gem内のmigrationファイルが `ActiveRecord::Migration[4.2]` の場合
    * アプリでRails 5.0系を使ってる時は問題なし
    * アプリでRails 4.2系を使ってる時にはエラーになる

migrationファイルを内包したgemをいくつかメンテしているのですが、Rails 5対応をするために既存のRails 4系のアプリともmigrationファイルの互換性を保つのが割とつらかったのでそれを解決するために作りました

# 使い方
migrationクラスのスーパークラスを `ActiveRecord::CompatibleLegacyMigration.migration_class` にするだけです

```ruby
class CreateUsers < ActiveRecord::CompatibleLegacyMigration.migration_class
  def change
    create_table :users do |t|
      t.timestamps null: false
    end
  end
end
```

`ActiveRecord::CompatibleLegacyMigration.migration_class` はRails 5.0以降だと `ActiveRecord::Migration[4.2]` を、Rails 5未満だと `ActiveRecord::Migration` を返します

https://github.com/sue445/activerecord-compatible_legacy_migration/blob/v0.1.1/lib/active_record/compatible_legacy_migration.rb

Rails 5.0以降でしか使えないmigrationファイルはgemとして配布する時に最初から  `ActiveRecord::Migration[5.0]` つければいいと思います

# 設定
```ruby
ActiveRecord::CompatibleLegacyMigration.config.default_version = 4.2
```

or

```ruby
ActiveRecord::CompatibleLegacyMigration.configure do |config|
  config.default_version = 4.2
end
```

* `default_version` : Rails 5系の時に `ActiveRecord::Migration` で返したいバージョン（デフォルト：`4.2`）
プログラマ 35 歳定年説を超えて

35 どころか 40 も軽く超えてしまったエンジニアが、エンジニアであり続けるために努力していることや意識していることなど。

# 勉強会

今年になって初めて、勉強会とかカンファレンスとか言われるたぐいのものに参加するようになりました。
同じ会社、同じ現場の空気や文化ばかりに馴染んでいるとどうしても了見が狭くなってしまうので、外の空気は積極的に吸いに行ったほうがいいと思います。

# 英語

必要な知識を得るための早さも得られる知識の量も、英語ができるとできないではやはり全く違う。
あと、大きな声ではいえないが、今自分の立てている中期的目標を達成するために英語のスキルが絶対必要なので、やらざるをえない。

# 情報発信

なんでもいいから積極的に情報発信すべきということに今年になって気が付きました。
間違っていてもいいので発信しさえすれば、出す場所とタイミングさえ間違ってなければ何らかのフィードバックがもらえるはずです。これを避けていてはたぶん人間成長しないのです。

# そろそろマネジメントも覚えたほうが・・・

って、この歳になれば当然言われるわけで（ていうか 10 年以上前から言われてますが）、エンジニアでいたい自分と自らの今後のことや今の周囲のことを考えればどうしてもそうなっていくのかなと思う自分が常に戦っているわけです。しかし、エンジニアとしてこれからも伸びる実感が今になってどんどん湧いてきているので、もうちょっとエンジニアでいたいと思っています。
この年でも伸びると思えるようになったのは、やはり勉強会などでできる人を今までより多く見て、まだまだ自分にも足りないところがいっぱいあって、全部は到底無理だけどある程度は埋められそうだと思ったことが一番大きいです。
問題は、年を取る毎に、そんなおっさんエンジニアでも必要としてくれる場所が少なくなっていくことですね。こればかりは仕方がない。[^1]

# でも

まあ、結局のところ、この年までのほほんとエンジニアしてたから 40 過ぎてもエンジニアしかできないわけで、仕事ができる人はたぶん 35 歳までにそんな小さな枠は軽く越えて行くということなんじゃないかと、35 歳定年説とはそういう意味もあるんじゃないかと、今ふと思いました。
だから、私は恐らく、大したことないのにまだまだエンジニアでいたいと思う自分をちょっとは恥じるべきなのかもしれません。


[^1]: このことについては、12/24 に書く予定の[転職 Advent Calendar](http://www.adventar.org/calendars/2067)の[記事](http://qiita.com/mdstoy/items/708335a7a627ddabc094) で詳しく触れる、かも
親の状態維持について

親になる、のではなくて、親であり続ける。
子育てについて考えると、いつもこのキーワードが前に出てくる。

現在、8歳の長男と1歳の次男の親である。

親という定義もそれぞれだと思うが、自分としては子どもを育てることが親であると自覚した。子どもを育てることとは、生存率を高める、という目標に集約されるだろうか。そのために、日々の手助けや、より良いと思う価値観や判断基準を示し、親への依存を薄くしていき、独立して生きていければ完遂したと考えて良いだろう。

長男が生まれてからしばらく親の自覚という感覚がなかった。当時はリモートワークだったのも幸いして、育児をする中でいつしか親である感覚を持ったような気がする。一年くらいはかかったように思う。何となく意思の疎通ができたように感じる場面が増えて、この子に価値観や判断基準を与えている、そういった影響力を観測して、親としての責任というものが芽生えたのだと後になってから思う。当時はそういうことを分析する余裕はなかった。

これを続けるためには意識した活動が必要だと感じている。
なので、親の状態維持というキーワードが出てくるのだと思う。

次男が生まれてからリモートワークではなくなってしまい、育児できているとは言えない状況になり、危機感を感じている。長男の頃と比べて、当たり前だが接している時間が極端に短くなり、時間的な制約も増えて、特に日々の手助けの部分ができていない。一度リモートワークでの育児を経験していて、わかっていたつもりではあったが、自分にとっては本当に価値の高い組み合わせであったのだと深く身に沁みている。
IoTで彼女へ即レスできる環境づくり

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です👍 (2016.12.19現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

今回は、IoTLTで発表したものを記事にしたいと思います。

# IoTとは

タイトルが怪しすぎるのでまずIoTの定義を書いておきたいと思います。

> Internet of Things（モノのインターネット）とは、従来は主にパソコンやサーバー、プリンタ等のIT関連機器が接続されていたインターネットにそれ以外の様々な"モノ"を接続することを意味します。

Google先生の回答はこうでした。

では、これにのっとって`インターネットにモノを接続すること`をしていきたいとおもいます。

まず今回のタイトルは実は、副タイトルで主タイトルとしては**IoGF**です。

# IoGFとは

IoGFとはなんなんでしょうか。

もう一度Googleにきいてみましょう。

> Internet of GirlFriendの略で、IoTの力で彼女を監視することである。

~~と書いています~~（書いていません）

では僕のIoGFを発表していきたいと思います。

# 挨拶って大事だよね。

発表の前に、僕は挨拶がとても大切なものだと思っています。

疲れて帰ってきて、**「おかえり！」**と返事があるだけで心が安らぐと思いませんか？

この挨拶は、別に関係ない話をしているわけではありません。

「挨拶」が大事なのはわかってるけど、相手からの連絡がないと**「お帰り！」**といってあげられないエンジニア彼氏ぜひ作ってください。

# 制作物

## 材料

材料は3つあります。

1. ラズパイ
2. 人感センサー
3. 彼女

です。

## 作ったものの説明

僕が何をしていても、リアルタイムに彼女のお見送りとお出迎えをするIoTです。

こんな感じ。

![スクリーンショット 2016-12-18 4.24.54.png](https://qiita-image-store.s3.amazonaws.com/0/90347/29ac70a0-fabc-e27d-a2ce-ed5ac461cbab.png)

流れは以下を参考にしてください

![スクリーンショット 2016-12-18 4.25.35.png](https://qiita-image-store.s3.amazonaws.com/0/90347/ec558a43-48db-04ae-2f0b-cd06cb447cba.png)

今回、ミソとなるのはセンサーの値をどう取得するかです。

このセンサーは`GPIO`と言われるもので制御ができて、ブレッドボードの刺しているピンのportを開いてあげて、そのピンを監視して`1`か`0`かで、前を通ったか判断しました。

# GPIO

[npm/GPIO](https://www.npmjs.com/package/gpio)

今回はこのモジュールを使いました。

## What is GPIO

> GPIOはGeneral Purpose Input/Output（汎用入出力）の略語である。 入力として動作した場合は電気回路のほかの部分からのデジタル信号を読み取り、出力として動作した場合は他デバイスの制御や信号の通知を行う。

あとはTwitter APIですね。今回も[twit](https://github.com/ttezel/twit)を使いました。

# あとがき

来年もIoTLTをよろしくおねがいします！！！！！

Twitter -> [@konojunya](http://twitter.com/konojunya)
ハンドメイド Alexa Festival! Serverless、IoT +  Voice への誘い。ラズパイ ＋ Alexa Voice Servce(Python)

# はじめに
この資料は、Serverless Advent Callender 2016 の 19日目の投稿です。

[CheapなEcho](https://www.youtube.com/watch?v=vizNdRTXK90)でAlexa祭りをします。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Ghn1NpbUPJQ/0.jpg)](https://www.youtube.com/watch?v=Ghn1NpbUPJQ)

#用語
[Alexa](https://developer.amazon.com/alexa-voice-service)
[Amazon](https://www.amazon.com/) が提供する音声認識プラットフォームです。

[AVS(Alexa Voice Service)](https://developer.amazon.com/alexa-voice-service)
Alexa の音声認識エンジンです。[Amazon Echo](https://www.amazon.com/Amazon-Echo-Bluetooth-Speaker-with-WiFi-Alexa/dp/B00X4WHP5E)に入っています。

Alexa の構成要素はふたつ。

* [AVS(Alexa Voice Service)](https://developer.amazon.com/alexa-voice-service)
Alexaの音声認識エンジンです。デバイス上で録音した音声をHTTPベースでやりとりします。

* [ASK(Alexa Skills Kit)](https://developer.amazon.com/alexa-skills-kit)
独自の会話パターンを開発できるキットです。AWS Lambda が推奨されており、Serverless に開発ができます。
昨日の記事はASKの記事でしたので参考に。
[Advent Callender 18日目](http://qiita.com/sparkgene/items/a7ae9dca006b3e4e0a8f)

#背景
この記事を書く背景には、未だに [Amazon Echo](https://www.amazon.com/Amazon-Echo-Bluetooth-Speaker-with-WiFi-Alexa/dp/B00X4WHP5E) の技適が通っておらず、**日本では購入できない、という悲しい現実**があります。[Echosim.io](https://echosim.io/welcome?next=%2F) のようにWebベースのテストツールなんてのもありますが、Echoが来ていないなら自作して、Serveless な スキル開発を楽しもうじゃないですか？

# 概要
* デバイスはラズパイ3を使います。
* AVSのインプリメントに使う言語はPython(ライズパイにプリイン)です。
* Alexa のWake word("Alexa")に反応させます。

# 材料(ハードウェア)
* [RaspberryPI 3](https://www.raspberrypi.org/)
* USB Microphone(https://www.amazon.com/dp/B00IR8R7WQ/ref=cm_sw_su_dp)
* 32pin mini micro jack speaker(https://www.amazon.com/dp/B007OYAVLI/ref=cm_sw_su_dp)

# 材料（ライブラリ)
* [Hyper](https://github.com/Lukasa/hyper)
* [snowboy](https://github.com/Kitt-AI/snowboy)
* [AlexaPi](https://github.com/jaws-ug-kobe/AlexaPi/tree/v2)

# 下準備
Amazon の公式リポジトリにRaspberryPI用のサンプルがあります。[Let's get started](
https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Pi#lets-get-started)のSTEP3まで完了させます。

デバイスとAVSを接続するプロファイル(ProductID、ClientID、ClientSecret)が得られます。

# ハードウェアのセットアップ
Raspberry PI 3 をセットアップします。
[Installing operating system image](https://www.raspberrypi.org/documentation/installation/installing-images/)

#ソフトウェアのセットアップ
##hyper

```bash
$ pip install hyper
```

##snowboy

```bash
$ sudo apt-get install swig3.0 python-pyaudio python3-pyaudio sox pip install pyaudio
$ sudo apt-get install libatlas-base-dev
$ cd/swig
$ make
```

上のように自分でインストールしてもよいですが、プリコンパイルしたモジュールがあるので、そちらをラズパイにコピーするのが楽です。
[Precompiled module](https://s3-us-west-2.amazonaws.com/snowboy/snowboy-releases/rpi-arm-raspbian-8.0-1.1.0.tar.bz2)


# AVSの導入

* [AlexaPI](https://github.com/jaws-ug-kobe/AlexaPi/tree/v2)
[初期設定動画(英語)](https://www.youtube.com/watch?v=frH9HaQTFL8)
ラズパイとAlexaPIを認証させる動画です。

セットアップが完了すると、Developper.amazon.com で取得したセキュリティプロファイルの記載されたcreds.pyが生成されます。

![スクリーンショット 2016-12-18 11.07.53.png](https://qiita-image-store.s3.amazonaws.com/0/49986/7648557e-bc45-7437-c30f-3b7d8bfb7c88.png)


# 起動
```bash
$ python wakeword_detector.py
```

デーモンとして登録すれば、起動時にwakeword待ち状態にすることも可能です。

#デモ
https://www.youtube.com/watch?v=Ghn1NpbUPJQ

#さいごに
発音の悪さと中のマイクの位置で認識率悪すぎるのは、本当にすみませんm(_ _)m
データ並列ライブラリRayonを使ってみた

この記事はRustアドベントカレンダーその２の12/18の記事です

[nikomatsakis/rayon](https://github.com/nikomatsakis/rayon)はRustでデータ並列なコードをiterator形式で簡単に実装するためのライブラリです。
C/C++/FortranでOpenMPで並列化していたような部分の代替と考えられます。
バックエンドの実装方式としては[Intel Clik](https://www.cilkplus.org/)と同様のwork stealingによります。
イテレータを分割してスレッドプールを用いてそれぞれに対して処理を実行します。

簡単な使い方
------------
READMEに詳しく書いてあるので、簡単な紹介だけ：
Rustのコードではイテレータで処理を記述することが多いと思いますが、Rayonは`Iterator`の代わりに`ParallelIterator`を導入します：

- `iter()` → `par_iter()`
- `iter_mut()` → `par_iter_mut()`
- `into_iter()` → `into_par_iter()`

に変更するだけで普通のIteratorと同じように使えるようになっています。

```rust
use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32 {
    input.par_iter()
         .map(|&i| i * i)
         .sum()
}
```

のように記述するだけで並列に`map`を計算し合計値を計算します。
使える関数は[rayon::par_iter::ParallelIterator](https://docs.rs/rayon/0.5.0/rayon/par_iter/trait.ParallelIterator.html)にまとまっています。

初期化
-------
上記のようなコードは自動的にスレッドプールの初期化を実施します。
スレッドプールの数を変更したい場合は明示的に初期化する必要があります。

```rust
let cfg = rayon::Configuration::new();
rayon::initialize(cfg.set_num_threads(4)).unwrap();
```

詰まったところ
--------------
次のようなコードはコンパイルできません：

```rust
let a = vec![1.0; size];
a.par_iter()
    .map(|x| 2.0 * x)
    .collect();
```

このコードは`collect()`が存在していないためコンパイルできないです。本来`collect()`は[std::iter::FromIterator](https://doc.rust-lang.org/std/iter/trait.FromIterator.html)を通して定義されますが、`par_iter()`が[ParallelIterator](https://docs.rs/rayon/0.5.0/rayon/par_iter/trait.ParallelIterator.html)を返しているのでそのままでは定義されない(´・ω・｀)。
代わりにRayonには`collect_into()`が定義されているようだ。

```rust
let a = vec![1.0; size];
let result = vec![0.0; size];
a.par_iter()
    .map(|x| 2.0 * x)
    .collect_into(&mut result);
```

事前にvectorを用意しておく必要があるらしい。
[collect_into()](https://docs.rs/rayon/0.5.0/rayon/par_iter/trait.ExactParallelIterator.html#method.collect_into)は事前に長さがわかっているイテレータ(ExactParallelIterator)にのみ定義されているので注意です。