OmniAICreator/Qiita-1.07M huggingface dataset:
ティラノビルダーのLive2D機能を触ったお話

# gloops AdventCalender 6日目

はじめまして。@Ak_Suzukiです。
gloops AdventCalender 6日目を努めさせていただきます！よろしくお願いします！

前々から気になっていたティラノビルダーのLive2D機能を触ってみました。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/126094/d1948683-5102-299b-776c-c0e3155d77d1.png)


# ティラノビルダーとは
フリーのノベルゲームエンジン「ティラノスクリプト」のGUIエディタです。
ティラノスクリプト単体だとスクリプトを記述しノベルゲームを開発していくのですが、
ティラノビルダーを導入することでノンプログラミングでノベルゲームを開発できます。

[ティラノビルダー公式](http://b.tyrano.jp/)

シーンの上に必要なコンポーネントをドラッグ&ドロップしていくだけでノベルゲーム開発ができます。
![rika_tyrano6.png](https://gloops.qiita.com/files/b3f634a9-e634-e289-768c-6d3ae7413196.png)

ティラノビルダーはLive2Dを正式サポートしており、動くキャラクターを登場させることでゲームの質を上げることができます。

# Live2Dモデルを召喚させてみる

まずティラノビルダーでLive2Dの設定をします。
「プロジェクト」-「拡張コンポーネント」から「Live2Dコンポーネント」にチェックを入れます。
右上にLive2Dのアイコンが追加されます。
![rika_tyrano4.jpg](https://gloops.qiita.com/files/f0943cff-54bb-b45c-e3dd-658b3bdf08f8.jpeg)

Live2Dアイコンをクリックし、「Live2D追加」をクリック
ロードしたいLive2Dモデルファイル（XX.model.json）を選択すると、Live2Dモデルが表示されます。
これでティラノビルダー内でロードしたモデルが利用できるようになりました。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/126094/6a9fc1e9-2eea-37a7-1eeb-ab8976846bc4.png)


ゲームシーンに表示させるには「Live2D」コンポーネントから「Live2D表示」を、シーンの表示させたいタイミングの場所に配置します。
プロパティからLive2Dモデルの選択、表示位置、表示速度を指定します。
![rika_tyrano11.png](https://gloops.qiita.com/files/3e6cd483-135c-c92d-0210-e1453aa11547.png)

シーンを実行したらLive2Dモデル召喚完了です！
![3.png](https://qiita-image-store.s3.amazonaws.com/0/126094/800ace78-3773-404b-2c06-f4d789b46fbd.png)


モーションの再生、モデルの移動も表示と同じくコンポーネントをシーンに配置するだけでできてしまいます。

# とりあえず色々いじってみた

ティラノビルダーにはLive2Dモデル表示/消去、モーション再生、移動しかコンポーネントがないため、公式にあるデモのような動きを行うにはティラノスクリプトコンポーネントを追加し、スクリプトを記述する必要があります。

![rika_tyrano9.png](https://qiita-image-store.s3.amazonaws.com/0/126094/bdab4877-5273-7770-08e3-88332e85b6e2.png)

##### 回転させる
```
[live2d_rotate name="haru" rotate=360]
```

##### 拡大・縮小させる
```
[live2d_scale name="haru" scaleX=0.5 scaleY=0.5]
```

##### 透明度を変える
```
[live2d_opacity name="haru" opacity="0.5" time="100"]
```

##### 振動させる
```
[live2d_opacity name="haru" opacity="0.5" time="100"]
```

##### 色を変える
```
[live2d_color name="haru" red=0.3 green=0.3 blue=0.3]
```

# 終わりに
ティラノビルダーとても楽でいいですね。
まだ実装されていないコンポーネントはスクリプトを書く必要がありますが、スクリプトを覚える手間が省けるのはありがたいです。
そしてLive2Dモデルの扱い方もすごく簡単。モデルデータにも手を加えることなくデータがあればすぐに動かすことができます。
シーンがすぐコンポーネントで溢れてしまうのとその１つ１つに設定を加えていかにゃならんのは今後の課題かもしれませんね。

明日はgloops AdventCalender 7日目。期待の若手@t_imagawaさんです！
Fess タームサイズを変更する

Fess 10.3
クロール時のタームサイズを変更してみます。

#### タームサイズ変更
1. fess_config.propertiesの値を変更
2. Fess を再起動

app/WEB-INF/classes/fess_config.properties

```properties:fess_config.properties
# common
crawler.document.max.alphanum.term.size=20
crawler.document.max.symbol.term.size=10
```

##### デフォルトのタームサイズ
`alphanum.term` 連続する英数字20文字以上の単語を切り捨て
`symbol.term` 連続する記号文字10文字以上の単語を切り捨て

大きな値に設定すると不要なインデックスの増加やクロールパフォーマンスの劣化
を招くので
なるべく小さな値となるように設定しましょう。
デブサミに参加した感想

#デブサミ関西初めて参加しました！

何やらこの業界の今を知れるということで行ってきました。
講演を聞いての率直な感想を書きたいと思います。
聞いた話は講演は以下。

##正しいものを正しくつくる
###市谷 聡啓さん [ギルドワークス]
前日にデブラブ関西に参加して、市谷さんの話を聞きました。
その時は飄々とした感じで話されていたのに、デブサミでは緊張してました。
あ、やっぱり緊張するんだwと思いました。

##日本で世界最先端のDevOpsチームに追いつき、追い越す方法
###牛尾 剛さん [マイクロソフト]
この日、一番印象に残っている講演でした。
いきなり始まったdevopsコール。なんかやばい人が来たと思ったのが、最初の印象でした。でも話を聞いていくとこの人のことすごい！！と思いました。
まず、熱い思いが伝わってきました。あと、この人がどれだけ自分の仕事と向き合っているかということ。話もすごくわかりやすくすごいな〜と思ったんですが、
何より気持ちが熱かった。
自分もこれだけの情熱を持って仕事していこ！って思いました。

##エンジニアの教育と成長についての課題と、組織で行っていること
###大西 康裕 [はてな]/江草 陽太 [さくらインターネット]
二人とも社内教育について、話されていました。

##お堅い企業との請負アジャイル開発【成功と失敗事例】～少しだけLycheeRedmineデモ～
###川端 光義 [アジャイルウェア]
アジャイル開発をやってみてどんな問題があったかと、自社で開発したパッケージのお話でした。

##カイゼンの基本 ～組織・プロダクト・プロセスをどう改善するか～
###吉羽 龍太郎 [Ryuzee.com]
このあたりになると疲労がピークであまり頭に入っていません。。。
ただ、ものすごくいい講演だったというのは覚えてます！！！

#まとめ
参加してみてめっちゃ刺激受けました。もっと自分の力をつけなければと思ったし、
いつかこの人たちみたいに人に影響を与えれる人になりたいと思いました。
ただ、振り返ってみて公演の内容を全然覚えていないことに驚愕し、
今の自分はこんな程度なんだということを痛感しました。
来年の自分ならこんなことにはならないはずと信じて、
まだまだ足りないものだらけだけど、自分の成長を楽しみながら挑戦していこうと思います。
GitLab Notifier for Google Chrome™ (a.k.a Chrome GitLab Notifier)

# GitLab Notifier for Google Chrome™ って何?
GitLabの通知を受け取るためのChrome拡張です。

* https://chrome.google.com/webstore/detail/gitlab-notifier-for-googl/eageapgbnjicdjjihgclpclilenjbobi 
* https://github.com/sue445/chrome-gitlab-notifier

# 見た目
## 通知
![notification1.png](https://qiita-image-store.s3.amazonaws.com/0/8059/64bfde72-3bc3-d028-5cf2-a2bd713363e4.png)

![notification2.png](https://qiita-image-store.s3.amazonaws.com/0/8059/0db892e4-11de-eb83-b6a8-6798a6c6c07a.png)

## ポップアップ
![popup.png](https://qiita-image-store.s3.amazonaws.com/0/8059/d1d0a70a-ebd5-554e-f425-5fadc9811df1.png)

## 設定できるもの
![option2.png](https://qiita-image-store.s3.amazonaws.com/0/8059/021b80bd-31b7-746a-972f-e2f8923536a7.png)

Commit, Issue, MergeRequest, Milestone辺りを個別に通知設定できます

# 思い出
## 自分では特に何もしてないのにプルリクがきまくった
僕が作ってるOSSの中では2番目にcontributorが多いです。[^contributors]

[^contributors]: 1番多いのは https://github.com/sue445/jenkins-backup-script

https://github.com/sue445/chrome-gitlab-notifier/graphs/contributors

宣伝活動全くしていないのですが「Chrome GitLab」でググるとこいつが上にくるからだろうと予想。ググラビリティ大事

## 公式に名前が載った
https://about.gitlab.com/applications/

![GitLab Native Apps](https://qiita-image-store.s3.amazonaws.com/0/8059/916e64c1-f2f7-c6fe-438a-ce1ae35ae85e.png)

宣伝活動全くしてないけど気づいたら認知されてた。

## 途中で名前を変えた
「Chrome Chatter Share」というChrome拡張を作った時にPolicy [^policy] に違反しているということで一度BANされたため、保険でBANされる前に名前を変えました

[^policy]: 名前にChromeとかGoogleを入れる時は「for Google Chrome™」みたいにしないとダメとのこと https://developer.chrome.com/webstore/branding#description

* Before: Chrome GitLab Notifier
* After: GitLab Notifier for Google Chrome™

GitLab公式含めて「Chrome GitLab Notifier」が残っているところも結構ありますが、そこは面倒くさいので放置です。。。 （どっちでググっても出てくるので）

# 改善点
* jqueryでDOMをゴリゴリ操作していてつらみがあるのでそのうちリファクタリングしたいと思い続けて1年が経ちました。
Xamarinを採用するメリット・デメリット

# はじめに

[mediba advent calendar 2016](http://qiita.com/advent-calendar/2016/mediba)の6日目担当の@f-matsushimaです。主にネイティブアプリの開発やっております。

アプリの開発といったら、iOSでは、Objective-CやSwift、Androidでは、Javaが一般的だと思いますが、私が担当するプロジェクトでは、これからXamarinでの開発を行うことになりました。
そこで、今回はXamarinを採用するにあたっての、私が感じたXamarinのメリット・デメリットを書いていこうと思います。Xamarinに少し興味があった方、Xamarinを採用したいけど、上司を説得しなければいけない方の参考になれればなと思います。

# Xamarin採用の経緯
まずは、Xamarinを採用するに至った経緯をざっと説明します。

1. アプリの大幅なUI改修、機能追加の話が上がる
2. 修正範囲も広く、もともとバグも多かったので、いっそのこと作りなおした方が早くね？
3. どうせ作りなおすなら、クロスプラットフォームで開発した方が楽だよね
4. Xamarinで開発開始　←今ココ

といった感じで、なんかすんなりとXamarin採用が決まりました。これはmedibaの[CREDO](http://www.mediba.jp/company/objectives.html)のValueに「挑戦を応援して失敗を責めない」というのがあるのですが、割りと新しいことにもチャレンジできる風土があるというのもあったかもしれません。

# Xamarinのメリット・デメリット

## メリット
### クロスプラットフォーム
まずなんといっても、クロスプラットフォームであることです。iOSやAndroidで別々で開発を行わなくていいのは、それだけで大変魅力的です。今回開発するにあたって、通信処理やデータ管理処理など、いわゆるビジネスロジックの部分にも手を加えたかったので、その部分をiOSとAndroidそれぞれで作らないといけないのは、工数的にも非常にネックでした。しかし、Xamarinであれば、ひとつさえ作ってしまえばいいのです。更に、Xamarin.Formsを使えば、画面も共通化できちゃいます。もうXamarinを使わない手はないです。

### C#で開発
言語がC#であることもポイント高いです。クロスプラットフォームであれば、Cordovaなども選択肢にあがるのですが、私自身JavaScriptには慣れていないせいもあり、ちょっと躊躇してしまうところがありました。その点C#であれば、Unityを使ってC#で開発を行ったこともありましたし、取っ付き易いだろうと考えました。それに、C#であれば、ラムダ式やLINQ、async/awaitを活用することで、コードがすっきり書けちゃうのはすごくいいです。ネイティブなので、Cordovaと比べて、パフォーマンス面でも有利です。

### iOS、Android開発の経験を活かせる
C#で開発するからといって、これまでiOS、Androidで開発してきた経験が全く活かせなくなるかというと、そんなことはありません。むしろ逆にバンバン必要になると思います。クロスプラットフォームで処理が共通化されているとは言っても、どうしてもUI部品やプッシュ通知などで、デバイス特有の処理を書く場面は出てきちゃいます。この場合、言語こそC#ですけど、処理のやり方は、それぞれにあったものになるため、ここでiOS、Android開発の知識が必要になるというわけです。
私のチームでは、私の他にiOSエンジニアが1名、Androidエンジニアが1名いるのですが、今までの経験を活かせない全く新しいことを０からやると言ったら、無理を強いてしまうことになってしまうのですが、Xamarinであれば、そこまで大変なことにはならないのではないかと思っています。

## デメリット

### 学習コスト
どうしても新しいことを始める以上学習コストはかかります。Xamarinの[公式ガイダンス](https://developer.xamarin.com/guides/)を読めばほとんどのことがわかるのですが、英語なのでちょっときついですし、日本語の書籍が今のところほぼ皆無なのも痛いです。私のチームでは、学習期間として2週間時間を確保しました。

### 完全に共通化できない
先ほど、iOS、Android開発の経験を活かせると書きましたが、裏を返せば、うまく共通化できていないところも多いので、各デバイスごとに処理を書かなければいけないということです。それがあまりにも多いと、クロスプラットフォームのメリットは薄まりますし、それなら慣れている、Objective-CやSwift、Javaで書いたほうが、逆に早く作れてしまうということもありうると思います。とは言いましても、今のところ、そこまで多くなることはないと考えています。

# おわりに
Xamarinを採用するにあたってのメリット・デメリットを挙げてきましたが、私はメリットの方が大きいのではないかと思っております。確かに最初は大変かも知れませんが、今後追加機能の開発を行う際でも、ひとつ作っちゃうだけで済むようになりますし、将来的に見ても、採用する価値はあると思います。会社の方針として今後どのような開発を行っていくのか分からないところもありますが、私個人としては、今後もXamarinでの開発を推進していけたらなと思っております。
Windows が Linux である世界

これはいわゆるポエムです。まともな技術情報をお探しの方は引き返されたほうが身のためかもしれません。

# プロローグ

Windows XP のサポートが完全終了した 2014 年 4 月の少し前に、PC を買い換えました。買い換えたというか、新しい PC は自作で OS には Xubuntu を選択しました。当時は、既に職場でもホストの Windows より VM 上の Linux で作業している時間のほうがはるかに長いような状態だったので、自宅の PC が Linux になったところで何ら問題はありませんでした。

ある一点を除いては・・・。

# 足りないもの

私がそれまで Window でやっていたことのほとんど全ては、Linux でもすることができました。ただひとつだけ、どうしようもないことがありました。（ていうか今もあります。）
それは、Microsoft Office が動かないということです。ただその一点なのですが、それが致命傷なのです。
LibreOffice は使っていますよ？でも、そういうことじゃないんです。仕事の関係で、VBA 入りの Excel を最低月一回は触らないといけないんです。そのために冒頭で触れた買い替え前の PC は部屋の片隅にネットからも切り離され放置されつつも、月一回だけ Excel を起動するためだけに起動されるのです。悲しいです。あまりにも悲しすぎます。

（いや、Linux 上でも動かそうと思えばいろんな手段で動くんだけども、何らかのルール的にだめとかいろいろあるんです。とりあえずそういうことにしておいてください。ていうか、ぶっちゃけ言いたいことはこれじゃないんです。）

# 想い

ところで、Mac が Unix になったときからずっと思っていることがあります。それは

**「Mac の中の人が Unix になるくらいなんだから、Windows の中の人は Linux になっちゃえばよくね？」**

ということです。
最近、BoW とかいうものが話題になっているようですが（残念ながら Windows 10 が身近に一切ないので実物を見たことはない）、そういうことじゃないと思うんです。もうそんなけち臭いことを言わないで、中の人を Linux にしちゃえばいいと思うんです。

そうすれば・・・。

# 夢の世界

ちょっとしたことをするのにも Windows の上に何かを置いてごまかす必要がなくなります。だって Windows は Linux だから。
Microsoft Office が Ubuntu とかでも動きますよ。だって Linux な Windows で動くんだから、きっと他の Linux でもすぐ動くはず。（むりやり前段と話をつなげてみただけ。）
もう Mac が Unix だろうが目じゃないね。だってこっちは Linux だぜ。（壊れてきた。）

# エピローグ？

なんだかんだ言って、クライアントとしての Windows ってやっぱりとても使いやすいと思うんですよね。それが Linux になったらとても素敵なんじゃないかなって。そう思います。
PLAYCANVASでWeb Audio APIを使用して音を鳴らしてみた

この記事は [WebAudio Web MIDI API Advent Calendar 2016](http://qiita.com/advent-calendar/2016/webaudio) の6日目です。

# PLAYCANVASについて
Unityっぽく3DのWebアプリを作成するツールです。ネイティブアプリではなくWebブラウザで動くところがポイントです。
VRだって出来ます。
WebGLでちまちまプログラミングするのがめんどくさい人におすすめです。
クラウド上に保存されていて、必要であればダウンロードできます。
（注：upgradeしないとダウンロード出来ないです）

詳しくは[ここら辺](http://developer.playcanvas.com/ja/)を見ていただくということで。

# Web Audio APIについて
Webブラウザで音を鳴らすAPIです。
ブラウザで音を鳴らす方法は他にも色々あるのですが、DirectShowっぽく使えるのがいい感じです。
「曲」ではなく「音」を鳴らすイメージです。

詳しくは[ここら辺](http://www.g200kg.com/jp/docs/webaudio/)を見ていただくということで。

# PLAYCANVASの準備
登録したり、サンプルを作成してみたり。

詳しくは[ここら辺](http://qiita.com/mine820/items/47c497be9edd575c384e)を見ていただくということで。

# Web Audio APIの準備
まず、アセットにスクリプトを一つ追加します。
とりあえずここでは「InitWebAudio.js」としておきます。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/cfd7f476-bbc7-a248-d73a-9a836def1c54.png)

ここにWeb Audio APIではお決まりの、以下の一文を記述します。

```
if(typeof(webkitAudioContext)!=="undefined")
    var audioctx = new webkitAudioContext();
else if(typeof(AudioContext)!=="undefined")
    var audioctx = new AudioContext();
```

次に、作成したスクリプトをRootに追加します。
手順は以下の通りです。

1. 「HIERARCHY」タブの「Root」を選択
2. 「INSPECTOR（Rootを選ぶとENTITYに変わる）」タブの「ADD COMPONENT」から「SCRIPT」を選択
3. 「ADD SCRIPT」から追加したスクリプト（InitWebAudio）を選択

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/c6e5b0cb-79b3-4ec4-4b04-47410f7547a1.png)

# 音を鳴らす
すでに「PLAYCANVASの準備」で作成済みのスクリプト（左キーでボールが動く）であるPlayerController.jsを変更して音を付けてみます。

- KeyDownで音を鳴らす
- KeyUpで音を止める

```
var osc = null;

var PlayerController = pc.createScript('playerController');

// initialize code called once per entity
PlayerController.prototype.initialize = function() {
    this.app.keyboard.on(pc.EVENT_KEYDOWN, this.onKeyDown, this);
    this.app.keyboard.on(pc.EVENT_KEYUP, this.onKeyUp, this);
};

// update code called every frame
PlayerController.prototype.update = function(dt) {
    if (this.app.keyboard.wasPressed(pc.KEY_LEFT)) {
        // 押下されたのが左キーだった場合
        // X軸方向に大きさ-1の衝撃をエンティティに与えることでエンティティを動かす
        this.entity.rigidbody.applyImpulse(-1, 0, 0);
        
        osc = audioctx.createOscillator();
        osc.connect(audioctx.destination);
        osc.start(0);
    }
    if (this.app.keyboard.wasReleased(pc.KEY_LEFT)) {
        // 離されたのが左キーだった場合
        osc.stop(0);
    }
};

PlayerController.prototype.onKeyDown = function(event) {
    // デフォルトのキーイベントをキャンセルする
    event.event.preventDefault();
};

PlayerController.prototype.onKeyUp = function(event) {
    // デフォルトのキーイベントをキャンセルする
    event.event.preventDefault();
};
```

初期化時にコールバックを設定します。
左矢印が押されたら、オシレータを作成し音を鳴らします。
離されたら音を止めます。（※オシレータも使えなくなります）

# 試してみよう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/ccafd005-11ea-260c-f4c7-e575411d8a18.png)
[ここ](https://playcanv.as/b/zOYhB35v/)から試せます。
ボールが落ちたらやり直してください。

# ポイント
特にはないです。
stop()したらオシレータを作りなおさなくちゃいけないとかは、Web Audio APIなら当たり前のことなので。

# もっと重要なポイント
こんなことをしなくても、PLAYCANVASでは簡単に、オブジェクトに音をつけることが出来ます。
（「どうしてもWeb Audio APIを使いたい」という人向けです）

# 今後
ちゃんとオブジェクトに追従するようにしたいなと思っています。（これはPLAYCANVASの方のお勉強が必要かな）
マルチウィンドウが有効/警告/無効になるAndroidアプリの条件を調べてみた。

[ディップ Advent Calendar](http://qiita.com/advent-calendar/2016/dip-dev)の6日目です。

本当はAndroid NからJava 8のラムダ式記法が使えるようになったので、勉強したことを投稿しようとしたが、minSdkVersionを24(つまりAndroid N)にしないと使えないことがわかり(冷静に考えれば気づく話だが)、しばらく未来の技術だなぁと意気消沈してしまったので、以前から気になっていたAndroid Nから導入されたマルチウィンドウ機能について、調べたことを投稿しようと思います。

# マルチウィンドウとは

[マルチ ウィンドウのサポート](https://developer.android.com/guide/topics/ui/multi-window.html?hl=ja)

Android Nから複数のアプリを同時に表示するためのマルチウィンドウサポートが追加されています。
Overview キーを長押しすることでマルチウィンドウモードに切り替えたりすることが可能です。

ただ、Android Nから搭載された機能なので、対応していないアプリではマルチウィンドウに対応していないアプリでは動かなかったり、マルチウィンドウが動いても【アプリは分割画面では動作しないことがあります。】というtoastが出てしまう場合があります。

前からどういう条件下でそうなるのかが興味があったので、調査してみました。

# マルチウィンドウモードが無効になる条件
色々調べた結果、targetSdkVersionが23以下で、以下のパラメータのいずれかの指定があるとマルチウィンドウモードは無効になります。

- android:screenOrientationをportrait、landscape、lockedにしている場合
- android:immersive="true"にしている場合

だいたい、screenOrientation=portraitにして縦固定画面にしている場合が多いと思いますが、その場合【アプリは分割画面をサポートしていません。】というtoastが出てマルチウィンドウが動作しません。
なんでだろうと思いますが、マルチウィンドウを起動するとフォーカスをチェンジするたびにonResume、onParseが走るので、縦画面に固定して最適化しているようなアプリではマルチウィンドウではうまく動かないという判断が出されたのだと思います。

# マルチウィンドウ実行時に【アプリは分割画面では動作しないことがあります。】警告メッセージが出る条件
targetSdkVersionが23以下でscreenOrientationやimmersiveの指定がない場合は基本的にマルチウィンドウモードは有効になるようです。
ただ、targetSdkVersionは23以下なので、【アプリは分割画面では動作しないことがあります。】の警告文を出して、「動くと思うけど、動作は保証しないよ」という意思表示をしているようです。

# マルチウィンドウが有効になる条件
当たり前といえば当たり前ですが、基本的にtargetSdkVersionが24以降ならば、マルチウィンドウは有効になります。
screenOrientationやimmersiveが設定されていても問題なく動作します。
targetSdkVersionが24ならば、マルチウィンドウ対応は当たり前だよね。と言われている気がしますね。。

# マルチウィンドウを有効にしたくない場合は
targetSdkVersionが24にするならばマルチウィンドウ対応をすべきだと思いますが、やりたくない場合もあると思います。
その場合、AndroidManifest.xmlの\<activity\> ノードまたは \<application\> ノードに`android:resizeableActivity="false"`を設定すればマルチウィンドウモードは無効化されます。

ただ、このandroid:resizeableActivity、targetSdkVersionが24で追加された属性なので、targetSdkVersionが23以下では使えません。
かといってマルチウィンドウモードを無効化するためにscreenOrientationやimmersiveをわざわざ付けるのも色々まずい場合もあると思います。

結論ですが、screenOrientationもimmersiveも利用していない場合は、マルチウィンドウモードに対応するか、targetSdkVersionを24に上げてandroid:resizeableActivityでマルチウィンドウモードを無効化するのが早いと思います。
Linux watchコマンドで楽チンにwebサーバ監視する

# 【こんな貴方の助けになれば】
・「psコマンドとかでプロセス監視したいけど、**何回もコマンド実行するの面倒だなぁ**」と思っている貴方。

・「linuxで、繰り返し同じコマンドを実行させたいけど、**whileとか文法覚えてないし**、ググるのも面倒だし」と思っている貴方。

# 【ポイント】
watchコマンドが便利。
使い方のアイデア次第で、もっと便利に！（だいたいの事柄に当てはまることを書いております）

# 使用例1）LVSを使ってるときに、該当LVS配下のwebのVMたちを監視する
`watch -n 1 ipvsadm -Ln`

ポート指定もできるよ。
`watch -n 1 ipvsadm -Ln 10.xxx.x.xxx:80`

アクティブのコネクト数などが、リアルタイムで監視できます。
Apacheやnginxなどをgracefulに停止する様を監視するのに最適です。

# 使用例2）メモリの使用状況を定期的に見ていたい
`watch -n 1 free -mt`

同じようなコマンドで、
`vmstat 1`
とかでもメモリ監視できますが、こちらだと1秒ごとに行が連続で表示されていきます。（あとでログを収集する際に、便利そうですね）

一方、watchコマンドは画面が常に更新（clear）されて、最新のコマンド結果だけが表示されます。
「いまのサーバだけを見ていたい！」という貴方におすすめです。

# 使用例3）lsとかもできちゃう
`watch -n 5 ls /tmp`
5秒ごとに、/tmpに対してlsを実行。
何に使うかわかりませんが、こんなかんじでlsも繰り返し実行可能です。
※素直にクーロンを使いましょう。

# 【こんなときに使って便利でした】
zabbixやmackerel.ioを利用してグラフ監視等をしていたのですが、
「やっぱりサーバの状況気になるわ」と不安になって、
つい、コマンドで見たくなった時に便利でした。
普通のWebサイトをServerlessで作ってみた話

Serverless(2)アドベントカレンダーの6日目の記事です。

なにげにQiita上には初投稿なのでお手柔らかにお願いします。
普段はQiita team使っているので、そっちと記事との共有ができれば良いのになーと**小言**を言ってみたり。。。

今回は、表題の通り、サーバーレスでWebサイト作った話です。

# Webサイトの要件

* ブログのようなサイト
* 静的URLで配信したいが、動きとしては動的な部分もあり

# 実現してみた方法

API Gatewayでhtmlを返しただけ
※当初はコンテンツをAjaxで取ってくる形式にしてたのですが、クローラーさんの結果がうまく行かず、サーバーサイドレンダリングにしちゃいました

# 実装環境

* Serverless Framework 0系
* node.js 4.3
* Typescript 1系

# アーキテクチャ

![スクリーンショット 2016-12-05 18.55.17.png](https://qiita-image-store.s3.amazonaws.com/0/35779/691b3928-2b57-6f37-c544-2e2a10959d6f.png)

* cloudfrontでパスを振り分け
    * 静的なコンテンツのみS3へ振り分け
    * 動的ページはAPI Gatewayに振り分けて、LambdaがRDSからデータ取得して、HTML形式に変換して返却

# レスポンスの定義

下記のような設定でレスポンスでもってコントロール
※まだServerlessFramework 0系で実装しています。

```s-function.json
"responses": {
        "400": {
          "statusCode": "400"
        },
        "503": {
          "selectionPattern": ".*Task timed out after .+ seconds",
          "statusCode": "503"
        },
        "404": {
          "selectionPattern": "(.|\\n)*\\\"status\\\"\\:\\s*\\n*\\s*\\\"notfound\\\"(.|\\n)*",
          "statusCode": "404"
        },
        "default": {
          "statusCode": "200",
          "responseParameters": {},
          "responseModels": {
            "text/html": "Empty"
          },
          "responseTemplates": {
            "text/html": "#set($inputRoot = $input.path('$'))$inputRoot.variableHTML"
          }
        }
      }
```

# lambdaのコードの一部

lambdaのコードはtypescriptで実装しています。
vue-serverでレンダリングしてhtmlを返却しています。

```handler.ts
var root = new Vue({
		template: htmlPage
	});

	root.$on('vueServer.htmlReady', function(html: string) {
		var htmlPretty = require('html');
		html = htmlPretty.prettyPrint(html, { indent_size: 2 , indent_caractor: '\t\t'});

		const $ = cheerio.load(html);

		$('title').text("ほげほげ");
		$('h1').text("ほげほげについて");

        var result = {
            variableHTML: $.html({decodeEntities: false})
        }   
        cb(null, <any>result);
	});
```

# ハマりポイント

<strong>ENI作成処理によるタイムアウト</strong>
西谷さんが下記の記事で書いている通り、Lambda→RDSの通信で同じVPC内でもENI作成処理に数十秒かかる場合があるようで、
結構タイムアウトが頻発してました。
記事にもある通り、完全な解決策はないようですが、
５分ごとにポーリングする設定を入れたらほぼタイムアウトは出なくなりました。
http://qiita.com/Keisuke69/items/1d84684f0511a062e968

<strong>パフォーマンスが出ない</strong>
これはアーキテクチャに少し依存するのですが、cloudfrontとAPIGatewayを置いているので、デフォルトで数百ms × 2のレイテンシが発生しています。
※APIGatewayも内部的にCloudfront使っているため
ここの解決策は、今後キャッシュ戦略をどうとるのかにかかっているので課題です。

# まとめ

突貫で記事書いたのでまとまりなくて申し訳ないです。
SEO条件なんだよーとか、前提条件をあまり書けてないですが、Serverlessを検討している方の参考になれば幸いです。
CakePHP3のMiddleware導入

使ってますか？Middleware

これですね。CakePHP3.3から導入されている機能ですね。
http://book.cakephp.org/3.0/ja/controllers/middleware.html

## Middlewareって何？

アクセスに対するリクエスト、レスポンスに対して処理を挟むことができます。
処理を挟むといわれると、Controllerには `initialize` とかありますけどもっと前に処理を挟むことが可能になります。なります。

また、 `PSR-7` に互換しているため、 `Packagist` などで公開されている `PSR-7` 互換のライブラリを利用することが可能となります。  

例えば、 Laravelで利用されているMiddlewareをCakePHPで利用するということも可能になります。(Laravelに依存していなければ)

## どのタイミングで動くの？

初期だと以下の順番で動作します。

1. ErrorHandlerMiddleware(リクエスト処理)
2. AssetMiddleware(リクエスト処理)
3. RoutingMiddleware(リクエスト処理)
4. CakePHP
5. RoutingMiddleware(レスポンス処理)
6. AssetMiddleware(レスポンス処理)
7. ErrorHandlerMiddleware(レスポンス処理)

この図のようにMiddlewareを複数重ねていくイメージで動作します。

![Untitled (3).png](https://qiita-image-store.s3.amazonaws.com/0/49429/b84a5118-b870-04a0-e2d1-ffa56f3a7d6d.png)


## どんなところで使えるの？

認証やリクエストオブジェクトやレスポンスオブジェクトの加工、IPアドレス制限などアプリケーションが起動する前の処理などは適した処理だと言えると思います。
レスポンス側だと、ログ出力や実行時間の計測などがいいのでしょうか。

上記の図でもそうですが、 initializeはアプリケーションが起動した後になります。
認証などは起動前の処理でいいものはいろいろとあると思われます。

## Middlewareサンプル

1メソッドの中で、リクエスト処理、レスポンス処理を行います。
癖はありますね。

```
<?php

// src/Middleware/TrackingCookieMiddleware.php の中で
namespace App\Middleware;

class TrackingCookieMiddleware
{
    public function __invoke($request, $response, $next)
    {
        // ここでリクエスト処理

        $response = $next($request, $response);

        // ここでレスポンス処理

        return $response;
    }
}
```

## Middlewareの使い方

Middlewareの起動などの設定は `src/Application.php` に記述します。
必要なMiddlewareを追記してきます。

注意点としては、作成したMiddlewareの `__invoke` にrequest, responseオブジェクトが渡ってきますが、
それぞれ、 `Zend\Diactoros\ServerRequest`, `Zend\Diactoros\Response` になっており、 `Cake\Network\Request`, `Cake\Network\Response` とは違うことに注意が必要です。

`webroot/index.php` の `$server->run()` の引数に利用したいオブジェクトを渡すと、`Cake\Network\Request`, `Cake\Network\Response` など使いたいオブジェクトに切り替えることが可能です。

## メンテナンス画面表示用プラグイン作ってみた

Middlewareの勉強がてら、 Maintenanceプラグインを作ってみました。
簡単にメンテナンス画面に切り替えるためのプラグインになります。

https://github.com/fusic/maintenance/
,
30を節目に転職した話

## 自己紹介
[@asukaleido](https://twitter.com/asukaleido)
Web Developer for [@AbemaTV](https://abema.tv)

- 2010: 小規模Sier
- 2011: アニメ脚本家・作家
- 2012: toBサービス（rakumo）
- 2016: 9月にCyberAgent入社、AbemaTV出向

## はじめに
タイトルの通り、30歳を節目に転職しました。
転職は（間で夢を追ったりもしましたが）2回目で、CyberAgentが3社目になります。

## 疲弊しない転職活動
今回の転職活動では、疲弊しないことに重点を置きました。
前職時代はそれなりに楽しく仕事をしており、今回の転職についても新しいことにチャレンジしたいという気持ちが強まったことが直接の要因でした。つまるところ正の感情に動かされた結果であり、ならばそのまま状態を負に向かわせることなく次職を迎えられればと思った次第です。

## 明確な目標を
さて、無駄な疲弊を避けるため、さしあたって明確な目標を定めることにしました。
確固たる信念なしに転職活動に臨むと、各企業担当の方のお話に流され迷いが生じることになり、活動の長期化を招くことに繋がりかねません。

## エージェントを使い倒す
スケジュールや条件の調整など面倒なことは、やはりエージェントに任せてしまうことが得策です。スタートアップ企業などは難しいかもしまいませんが、企業にとってエージェントの活用はコスト削減につながるため、使って不利になることは基本的にはないはずです。

## それでも疲れる
残念ながら、それでも疲れます。普段の業務プラスαで転職活動をしているわけで、さすがにこれはどうしようもないことかもしれません。ただ、今までの中で一番辛かった「新卒の就職活動」と「夢を追うこと」と比べれば、比べることも憚れるほど、今回の転職は「楽」でした。

## 妥協はしない
これは当たり前かもしれませんが、疲弊により妥協するくらいなら転職自体を諦めるべきだと思います。強力な負の感情に動かされた上での活動でないのなら、やはり最良（と思える）の道を選び取るのが肝要です。

## 私のお話
私はまず「いろいろなことに挑戦できる環境のある会社にいく」ことを目標に据えました。
これを元に、「複数サービスを提供している比較的規模の大きな会社」を具体的な会社選択の基準に定めました。この時点ですでに片方の手で数えられるくらいしか残っていません。あとはエージェントにすべて任せた上で、少しでも自分と合わないなと思った部分のあった会社は即選択肢から外すという作業を繰り返していっただけです。

## まとめ
最近、やらずに済むのなら回避したいことを如何にしてやらずに済ませるかに力を注ぐことが多くなってきました。これが良いことなのか悪いことなのかはわかりませんが、少なくとも私は今回、気持ちよく転職できたと思っています。
人それぞれの転職活動があると思いますが、私個人の感想としては**転職活動はアジャイルよりウォーターフォールの方が成功するかな**と感じました。
circle ci がめっちゃ混むので [ci skip] を勝手につけたい

書く！と勢いこんだものの、書く時間を何か得体の知れないモノに奪われてしまいましたので、
テクニックといいますか、みなさまの開発現場でも使えそうなものを投下しておきます。

## circle ci が混んでるやと・・

人数もそれなりに増え、Go言語のコンパイルが日々日々遅くなるばかり。
毎日熾烈なコミットが繰り広げられる現場で、ついにCIが大渋滞してきました。

終わらない・・終わらないんです・・・Circle CIがっ・・・。
一個回るのにxxx分かかるんです。待ってられないのです・・。

![image](https://qiita-image-store.s3.amazonaws.com/0/4239/3b4ab31e-8264-a70d-e90c-1afa664da22f.png)

WIPやと・・・！
レイアウト修正やと・・・！ HTMLの修正にテストをがっちり動かす必要あるのか・・！

```
　　　　　　　　 　＿＿＿_
　　　　　　　　／　　 　 　＼
　　　　　 　／　　─　 　 ─＼
　　　　　／　　　　⌒　　 ⌒　 ＼ 　　　　ハハッ　ワロス
　　　　　|　 　　 　 ,ﾉ(､_, )ヽ　 　 |
　　 　　 ＼　　 　　 ﾄｪｪｪｲ　 　／
　　 　 　 ／　　　_　ヽニｿ,　 く
```

てなことでCIを回す必要ないんじゃない？ ってコミットを少しでも抑制できればと思っていたところ、
CircleCIの公式ページに、[Skip a build \- CircleCI](https://circleci.com/docs/skip-a-build/) という記事にあるとおり、 `[ci skip]` とコミットメッセージをつけると、CIが回らない・・！

ということで拡張子を判定し、このコミットメッセージを付け足すgithookを書きましたとさ。

```/path/to/directory/.git/hooks
$ cat commit-msg
#!/bin/sh

git diff --staged --name-only | grep -e .go -e .ts > /dev/null;

if [ "$?" -ne 0 ]; then
    echo " [ci skip]" >> $PAIRS_ROOT/.git/COMMIT_EDITMSG;
fi
```

`-e .go -e .ts` の部分に色んな拡張子を混ぜて、コミットに該当する拡張子がなかったら、コミットメッセージに `[ci skip]` と勝手につけてくれちゃいます。
この例だと、 `.go` , `.ts` がなければ `[ci skip]` つけちゃいます。

ぜひhookをつくって、快適なCircleCIをお楽しみください♪
（こんな記事で本当にすまん）
AWS LambdaのLinux環境はどのくらい使いまわされているのか

# はじめに

自分用Slackにいろいろ通知するBOTを作ろうと思って、Lambdaのことを調べていたら下記のような記述を見つけた。

> AWS Lambdaは実行のたびに違うLinux空間を使う、とは限らないようで、同じLinux環境を使い回すときもあるようだ。

[AWS Lambda を利用する上で知っておいたほうがよいこと - ボクココ](http://www.bokukoko.info/entry/2015/09/17/AWS_Lambda_%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E4%B8%8A%E3%81%A7%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%84%E3%81%9F%E3%81%BB%E3%81%86%E3%81%8C%E3%82%88%E3%81%84%E3%81%93%E3%81%A8)

毎回ひとつのFunctionを実行するために新しい環境を用意していたら効率が悪いのでこうなっているのだろう。

じゃあ一体どのくらい使いまわされているのか？
気になったので遊んでみた。

# 検証

- Serverless(Ver 1.2.1)使ってます。
- 以下コード。雑ですみません。

```handler.js
'use strict';

const fs = require('fs');
const request = require('request');

module.exports.hello = (event, context, callback) => {
  fs.writeFileSync('/tmp/sample_' + new Date().getTime() + '.txt', 'hoge');
  var files = fs.readdirSync('/tmp');
  request.post(process.env.WEBHOOK_URL, {
      headers: { 'Content-Type' : 'application/json' },
      json: {
        channel: "#general",
        username: "tmp",
        text: "files: " + files,
        icon_emoji: ":open_file_folder:"
      }
    }, (err, response, body) => {});
};
```

- /tmpにsample_xxxxxxx.txtというファイルを作った後に/tmpの中身を見てるだけ。
- /tmpの中身が直前に作ったファイルだけなら新しい環境。ファイルが複数入っていれば環境を使いまわしてるだろうという判断。
- ふつうにhost名とか見ればいいんじゃないかとも思うが、/tmp使えることを最近知ったので使ってみたかっただけ。
- 結果をSlackに通知してます。
- これを3分おきに実行するように設定。
- 3分くらいでもわりと環境変わるんじゃないか？　と予測。
- 夜寝る前に仕掛けた。


# 結果

![slack_01.png](https://qiita-image-store.s3.amazonaws.com/0/9059/ad070e64-c81d-0950-6d57-fea777bf5ada.png)

朝起きて見たら、なんかすごいことになってた。

23:30〜の様子。徐々にファイル数が増えている。つまり同じ環境で実行されている。
![スクリーンショット 2016-12-05 12.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/9059/dc90b561-8c46-b448-0e34-8b9d9464fb23.png)

03:30くらいの様子

![slack_01.png](https://qiita-image-store.s3.amazonaws.com/0/9059/ad070e64-c81d-0950-6d57-fea777bf5ada.png)

しかし03:32のタイミングで別の環境になったぽい。

![スクリーンショット 2016-12-05 12.54.11.png](https://qiita-image-store.s3.amazonaws.com/0/9059/0678e9b4-1465-b0dd-f05c-e1ef4212effa.png)

06:50のタイミングでも変わってる。

![スクリーンショット 2016-12-05 12.55.46.png](https://qiita-image-store.s3.amazonaws.com/0/9059/9965dbb8-d1ee-173f-8d65-ef3554e7d3c2.png)

## 10分間隔

10分でもファイルが残っているので同じ環境。
![スクリーンショット 2016-12-05 12.57.16.png](https://qiita-image-store.s3.amazonaws.com/0/9059/ad5ffd71-013c-7b11-d716-ee8798386417.png)

## 60分間隔

60分だとさすがに残っていないので別環境っぽい。
![スクリーンショット 2016-12-05 13.00.17.png](https://qiita-image-store.s3.amazonaws.com/0/9059/2a4c005f-54ac-90c5-dad6-4e7279d6635c.png)

## 30分間隔

同じ環境。
![Screen Shot 2016-12-05 at 23.13.02.png](https://qiita-image-store.s3.amazonaws.com/0/9059/bd7743f9-b3c6-ec40-aca3-3d42ffedf2db.png)

気が向いたらもうちょっと試してみる。

# まとめ

- Lambdaの実行環境は思っていたより息が長い。

- 実行環境が変わるタイミングは不明。というかそんなこと気にしてはいけない。

- /tmpを使うときはちゃんとファイルを消したほうがいい。

# 参考情報

[AWS Lambdaをいろいろ暴く - Qiita](http://qiita.com/Keisuke69/items/9951a93fd711360a61c5)
[AWS Lambda を利用する上で知っておいたほうがよいこと - ボクココ](http://www.bokukoko.info/entry/2015/09/17/AWS_Lambda_%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E4%B8%8A%E3%81%A7%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%84%E3%81%9F%E3%81%BB%E3%81%86%E3%81%8C%E3%82%88%E3%81%84%E3%81%93%E3%81%A8)
[よくある質問 - AWS Lambda | AWS](https://aws.amazon.com/jp/lambda/faqs/)
OpenTypeの仕様入門 (前編)

# OpenType
OpenTypeというのは世界中で最も使われているフォントファイル形式の仕様です。
仕様は[ここ](https://www.microsoft.com/en-us/Typography/OpenTypeSpecification.aspx)とかにあります。
これを理解すればだいたいOKです。

***THE END***
   ---

さて、仕様を読むのが面倒な方は下の続きもどうぞ。

## OpenTypeフォントの構造
簡単にまとめると以下のような構造です。

1. ヘッダ
2. データ

簡単ですね。
そして、このヘッダの中には

- それがどういう情報であるのか
- 見るべきデータがどこにあるのか

が書かれています。

データの中にもまたヘッダがあることがあります。
そこにもやはり、それがどういう情報であるか、次に見るデータがファイル中のどこにあるか、ということが記されています。

冒頭に提示した仕様は、ヘッダがどのような構造体なのか、データがどういう意味を持つかということをまとめたものになります。

### OpenTypeテーブル
フォントはヘッダとデータで構成されているというお話をしました。
フォントの先頭のヘッダには**テーブル**と呼ばれるデータ構造が

- いくつあるのか
- どこにあるのか

ということが書かれています。
いくつあるのか、というのは実にわかりやすいですね。
10個あるのなら`10`という数値を指定された位置に書いておけばいいだけです。
しかし、どこにあるのかという情報はどのように保存されるのでしょうか。
正解は、何バイト先にデータあるのかという表現になります。
基準（0バイト先）はその文脈によって違い、これは仕様に明記されています。

さて、ここで先ほど登場した**テーブル**について、代表的なものをリストにしてみました。

- `cmap`: 文字コードのコードポイントからグリフIDへのマップ
    - これについては明日、もう少し詳しく説明します
- `head`: フォントについての雑多な情報
- `hmtx`: 各グリフの水平方向の送り幅などの情報
- `hhea`: `hmtx`テーブルのデータ数などの情報
- `OS/2`: フォントについての雑多な情報
- `maxp`: フォント内の様々な最大値の定義（フォント描画エンジン向けの情報ですね）
- `name`: フォント名などの情報
- `post`: PostScript向けの情報
    - ここまでの8つのテーブルがフォントに必須の情報になります
- `vmtx`: `hmtx`の縦書き用の情報
- `vhea`: `hhea`の縦書き用の情報
    - これらは縦書きで非常に重要な情報なのですが必須ではなく、FreeTypeはこれが存在しない場合にはこのフィールドを自動で埋めてしまうので気をつけましょう
- `glyf`: TrueType系のグリフデータ
- `loca`: `glyf`テーブルのグリフデータとグリフIDの対応情報
- `CFF␣`: PostScript系のグリフデータ
    - これらのグリフデータについては下でもう少しだけ説明します
- `GSUB`: グリフIDを文字列の描画条件に従って違うグリフIDに変換する情報
- `GPOS`: グリフの位置を、描画条件やグリフの並びに従って移動する情報
    - この2つについても明日の(後半)の記事でもう少し詳しく書きます

各テーブルは役割は様々ですが、全てを統合すると「指定された文字をどこにどういう風に描画するべきか」ということがコンピュータで解釈しやすい形で記されています。
ここに挙げた代表的なものの他にも多くのテーブルがあります。
特に最近、OpenType 1.8で追加されたバリアブルフォントに関連して非常に多くのテーブルが追加されました。

※`␣`は半角スペース（U＋0020）を表現しています。`cmap`などをタグと呼び、タグは4字で構成されるためこのようになっています。
（`glyf`とかいいですよね。これはglyphが入っているテーブルのタグです）

### OpenTypeコレクション
余談ですが、フォントの先頭のヘッダが上の形式以外の場合があります。
これはフォントの拡張子が`.ttc`や`.otc`の場合に見られるもので、ヘッダには内部に含まれるフォントの数と、そのフォントがファイル中のどこにあるのかが書かれます。

つまり、一つのフォントファイルに複数のフォントを含めることができるものです。
Windowsで「ＭＳ ゴシック」「ＭＳ Ｐゴシック」がまとめられていたりします。
また、最近のmacOSで多くのフォントがこの形式に変わったことでTeX界隈で少し話題になったりもしました。

## グリフ
グリフというのは、フォントの中で一つの描画要素として扱う単位です。
基本的には文字コードのコードポイント一つが、グリフ一つに対応付けられます。
これを行なってくれるのが先に出てきた`cmap`テーブルです。
`cmap`テーブルについては明日の後編にまわして、ここではグリフについて説明します。

グリフは描画要素です。
そしてご存知のように画像には大きく2つ

- ベクター画像
- ラスター画像

があります。
フォントにもこの2つのグリフデータの形式があります。
ここではそれぞれ、アウトライングリフ、ビットマップグリフと呼ぶことにします。

### アウトライングリフ
アウトライングリフにも2種類があります。

- TrueType系（代表的な拡張子は`.ttf`）
    - アウトラインデータは2次のベジェ曲線で表現される
    - グリフデータは`glyf`と`loca`にある
- PostScript系（代表的な拡張子は`.otf`）
    - アウトラインデータは3次のベジェ曲線で表現される
    - グリフデータは`CFF␣`にある
    - CFFの仕様はOpenTypeとはまた別に存在する

つまり、PostScript系のフォントの方がグリフの表現自由度は1次高いことになります。
一方で、**ヒンティング**の機構はTrueType系の方が強いらしいのですが、私にはちょっと難しいですね。
ヒンティングというのは描画サイズに応じてアウトラインの制御点の位置を調整する機構のことです。
残念ながら仕様を把握していないので説明はスキップいたします。すみません。

### ビットマップグリフ
グレースケールのビットマップグリフは`EBDT`と`EBLC`というテーブルにあります。
`EBLC`には`EBDT`のどこにどういうサイズの何階調のビットマップがあるかということが記されています。
`EBLC`で指定された`EBDT`のアドレスには2,4,16,256いずれかの階調のグレースケール画像が直列化されて収っています。
ちなみに私は2階調（白黒）のビットマップグリフ以外に出会ったことがありません。

# おわりに
明日は後編をお届けします（1日では書き終わらなかった）。
明日の内容は

1. グリフIDの取得
2. グリフIDの変換
3. グリフの移動

です。
なお、カラー絵文字についてはどこかで1枠使います。
常にそこにいろ

## はじめに

この記事は、[コミュニケーション Advent Calendar 2016](http://qiita.com/advent-calendar/2016/communication) 5日目の記事です。

## 常にそこにいろ

この言葉は [WEB+DB PRESS Vol.95](http://gihyo.jp/magazine/wdpress/archive/2016/vol95) の [@higeponさん](https://twitter.com/higepon)のコラム [継続は力なり ── 大器晩成エンジニアを目指して](http://gihyo.jp/dev/serial/01/continue-power) 第3回のタイトルです。

詳しくは書籍またはもう少ししたら閲覧できるwebページで読んでもらいたいですが、自分なりの「常にそこにいろ」の解釈は**『当事者意識を持って素早いレスポンスを』** です。

higeponさんのこのコラムがとても刺さったので、自分が取り組んでいることを各場面ごとにまとめておきます。

### チャット

ある程度人数がいるチャンネルで発信があった時に、周りから反応がないと「ちゃんと読んでくれたかな？」「会話のテンポが早くて流されちゃったかな？」と送った人が不安になります。

「常にそこにいる」ために、必ずすぐレスポンスしましょう。

ただ人間なので文章を打つのが面倒な時や、忙しくてきちんとした返事ができない場合もあるでしょう。
自分はそういう時には、読んだよという意味を込めて :eyes: `:eyes:`のリアクションをします。

絵文字でもリアクションがあるだけで、送った人の心理的な不安を解消できるはずです。

### コードレビュー

これも同じく「常にそこにいる」ために、すぐレビューしましょう。
レビュイーがレビューを待っている間が短ければ短いほど、スピード感がある開発が可能になります。

この素早いコードレビューのためには、PRの粒度が大きくなりすぎないことが大事になります。
またこの逆で素早いコードレビューを怠ると、せっかくPR出しても先に進めないと思われてしまいPRの粒度がどんどん大きくなっていきがちです。

レビュアー・レビュイーお互いが「常にそこにいる」意識を持つことが大事になってきます。

### チケット管理

JIRAなどのチケット管理において「常にそこにいる」ためには、チケットの状態を常に最新に保つようにしましょう。

同僚やPMがカンバンを見ただけで、自分の進捗を把握できるようになっているのがベストです。

アンチパターンとしては、以下のようなものがあります。

+ [Todo], [Progress], [Done]の状態を更新しない
+ チケットの粒度が大きすぎて、[Progress]だけど進捗が測れない

こまめな更新と適切なチケット分割を心がけましょう。

### エラー検知

Sentryなどのエラートラッキングにおいて「常にそこにいる」ためには、一次対応を率先してやりましょう。

一次対応で「原因の切り分け」や「優先度」を判断した後は、事情が詳しい人にバグフィックスをお願いしたり、バックログに積むでもOKです。
エラー発生という緊急事態の際に、「常にそこにいる」ことが大事です。

## おわりに

「常にそこにいろ」の実践はここで書いたようなオンラインコミュニケーションだけではなくて、オフラインでも当てはまります。

+ 開発の途中でも話しかけられたら、後回しにせず返事をする
+ そもそも話かけづらい雰囲気を作らない
+ etc.

ただ僕はオフラインコミュニケーションが得意ではないので、ここでは割愛します...
この後の[コミュニケーション Advent Calendar 2016](http://qiita.com/advent-calendar/2016/communication)でオフラインTipsが紹介されることを期待して待ってます！
FritzingでGR-CITRUSの配線図を描く


ちょっとした部品の配置を描くのにFritzingは便利だけど、ご当地ローカル(?)のがじぇるね系パーツが用意されていない。
そこでArduino microベースでお絵かきしてみた。

PCBは未完成(Arduino Micro v3のまま)とか回路図がやたらデカいとか問題点も多いので、自己責任でご使用ください。

ジャンパ等は非対応。

fritzingへはパーツリストで右クリックしてインポートしたってください。

[ダウンロード](https://dl.dropboxusercontent.com/u/56201650/GR-CITRUS.fzpz)



![描画イメージ](https://pbs.twimg.com/media/Cy6QlIcVIAAVys3.jpg:large)
TWE-Lite 書式モード(ASCII)

**この記事は[高知工科大 Advent Calendar 2016](http://www.adventar.org/calendars/1872)の6日目の記事です。**  

------
# TWE-Lite 書式モード

6日目のtakamasavvvです。
[KUTの去年のカレンダー](http://www.adventar.org/calendars/965)では、TWE-Liteにちょろっっと触れました。 

使い方は本とかwebとかにたくさんあるので、今回は、TWE-Liteの気になるところとその解決(?)策としての書式モードを紹介します。

## 電波だしね、切れるときもある
　TWE-Lite は他の小電力無線と比べて長距離通信出来るという特長を持っていますが、無線である以上、外乱ノイズは存在します。 
　下に透過モード(何の対策もされてないシリアル通信)の実験の様子と受信時の様子を貼っておきます。  
![IMG_20161205_214407.jpg](https://qiita-image-store.s3.amazonaws.com/0/106278/f7bfaa2a-fd2b-5cf8-071d-52e8ac0c33b4.jpeg)

![2016-12-05 (3).png](https://qiita-image-store.s3.amazonaws.com/0/106278/4f4b3fbe-e71f-c979-15c9-b15bb1fd6fb7.png)



机の上で15cmくらいの距離を連続して通信していますが、数分に一回程度データが壊れる時(赤矢印)があります。 
この頻度は周りの環境に左右され、2.4GHzであるTWE-Liteは地面付近だとほとんど通信できないような状態になります。 
その辺の話はフレネルゾーンとか減衰とかの話になるのですが、本筋ではないので今回は割愛します。 
「別に気にしないよ」と言う方には話はここまでですが、これを防ぎたい方は何かしらの対策が必要でしょう。

## 書式モード
　対策の手段はTWE-Liteの機能に幾つか実装されていますが、今回はその一つである「書式モード」を使用します。
簡単に言うと、データをパケットにしてチェックサムを付けます。(それだけですね) 
その中でも、簡易版送信コマンドのASCII形式を使用します。

 - データの形式
![新規 Microsoft PowerPoint プレゼンテーション.png](https://qiita-image-store.s3.amazonaws.com/0/106278/fe9ceb46-2769-ae7f-3567-a82d47d54d4f.png)



送信コマンドは、対象データの頭に送信先の論理IDとデータ種類の値が入ります。
データ種類は任意なので、送信データが何のデータなのかを自分で定義することが出来ます。
その送信コマンドの頭にASCII文字の ; (コロン)を付け、後ろにチェックサムと改行文字のASCII文字でもあるフッター\[CR]\[LF]を付けます。

**チェックサムは送信コマンドの各バイトの和を8bit幅で計算し2の補数をとります。**  
つまり送信コマンドの各バイトの総和 + チェックサムバイトを8bit幅で計算すると0にります。

例. 送信コマンド:00A01301FF123456 
　コマンドの各バイトの和を8bit取る
`0x00 + 0xA0 + ... + 0x56 = 0x4F ` 
　2の補数を取って
`0x4F + 0xB1 = 0`　　

よりチェックサムは`0xB1`となります。
送信時に限っては、チェックサムとフッターを省略して`"X"`で表現することも可能です。簡単だね!!!  

受信時は、送信先論理ID → 送信元論理IDと変換された状態で出力されます。 
受信時はチェックサムは自分で解くことになります。  ファイトだよ!!! 


## 注意
　まあASCII形式では当たり前っちゃ当たり前なんですが、ASCII文字以外は割り当てられないので、`0x80`以降のデータは死にます。
なんだったら`0x00~0x1f`も制御文字として読まれて当たり所が悪ければ死にます。 
ということは数値をそのままぶっこむと死亡率がぐんと高くなってしまいます。  
　ということで自分が考えたファッ○ンな発想としては、「数値も文字で表す」というものでした。 
こんな感じ

```c
//宛先:0x00 コマンド:33 Xはチェックサム  

foo = 200   //0xC8なのでこのままデータ入れるとアウト
sprintf(uartbuf, ":0033%dX",foo); //sprintfで文字列そのままぶっこめばいいのよ!!
```

ASCII形式なんていうものを使ってる時点で間違っている(でもデバックは文字だから見やすい)のですが、なんやかんやでその方法を使って9軸センサ+気圧データを5Hzでダウンリンク出来てるんで許してください(\*ﾉω・\*)ﾃﾍ 
(良い子の皆はこういう時はbinary形式に移行しような)  

## 最後に
　来年くらいには他の形式をやってSDKまで手を出して見たいけど、TWE-LiteのSDKちょっと人類が手を出す感じになっていないので時間かかりそう。 
　21日は進捗が出れば~~進捗ダメです~~RaspberryPiZeroをいじめ抜く記事書きたい。
　TWE-Lite 皆やろう!!
angular-cli でダッシュボード型アプリのモック その1

これは [日本情報クリエイト Engineers Advent Calendar 2016](http://qiita.com/advent-calendar/2016/njc) による4日目の記事になります。
(進捗遅れて申し訳ございません。。)

新ネタが無いので、個人的に進めている angular-cli ネタの続きです。

[前回](http://qiita.com/kkeisuke/items/d90324ab5614c2a2d80c)で、angular-cli で作成したアプリに bootstrap をインストールしたので、今回はヘッダーとサイドバーを付けてダッシュボードぽくするところまで

## 成果物

https://github.com/kkeisuke/angular-cli-sample

## component 作成

ヘッダーやサイドバーを component として作成してみます。コンポーネント名を、`navbar` や `sidebar` とした場合、

```
ng g component navbar
ng g component sidebar
```

これで、`src/app` 以下に component 毎にフォルダが切られ、各ファイルが作成されます。

```
.
├── src
│   ├── app
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   ├── app.module.ts
│   │   ├── index.ts
│   │   ├── navbar
│   │   │   ├── navbar.component.css
│   │   │   ├── navbar.component.html
│   │   │   ├── navbar.component.spec.ts
│   │   │   └── navbar.component.ts
│   │   └── sidebar
│   │       ├── sidebar.component.css
│   │       ├── sidebar.component.html
│   │       ├── sidebar.component.spec.ts
│   │       └── sidebar.component.ts
│   ├── index.html
```

app.component は `ng new` した時にすでに作られている component になります。
`app-root`というセレクタが定義されており、`index.html` で `<app-root>` として使用されています。
ココが起点になりそうです。

## component 配置

作成した component は、`app.component.html` 内に配置しました。
`<app-navbar></app-navbar>` とか `<app-sidebar></app-sidebar>`

```app.component.html
<div class="container-fluid app">
  <div class="row">
    <div class="col-md-12">
      <app-navbar></app-navbar>
    </div>
  </div>
  <div class="row">
    <div class="hidden-md-down col-lg-2 bg-faded col-sidebar">
      <app-sidebar></app-sidebar>
    </div>
    <div class="col-md-12 col-lg-10 offset-lg-2">
      <!-- この中がルーティングで切り替わっていくイメージ -->
    </div>
  </div>
</div>
```

あとは CSS を少し書くだけで、こんな感じになります。

![Kobito.4OBGOF.png](https://qiita-image-store.s3.amazonaws.com/0/61513/50dfc6d6-c3f3-ced4-e3cd-f4824ee83a44.png "Kobito.4OBGOF.png")

## 今後

まだまだ触り始めたばかりで設計のベストプラクティスとかアンチパターンとかがわからないので、その辺もキャッチアップしていきます。
(`src/app` 以下に全コンポーネント並べるのはきつそうなので、数が増えそうな場合どのような階層を準備しておくのが良いか etc)

以下、やることリストです。

- [Angular Augury](https://augury.angular.io/)
- [公式チュートリアル](https://angular.io/docs/ts/latest/tutorial/)
- ルーティング
- http
- ng g 他のコマンド ( directive、pipe、service etc )
- [ng-bootstrap](https://ng-bootstrap.github.io/#/home)
- C3(D3) 系のグラフライブラリ準備

etc
docker内のansibleからホストマシンをセットアップする

# 前提
```shell-session
uraura@rosemary$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.1
BuildVersion:	16B2555
```

```shell-session
uraura@rosemary$ docker version
Client:
 Version:      1.13.0-rc2
 API version:  1.25
 Go version:   go1.7.3
 Git commit:   1f9b3ef
 Built:        Wed Nov 23 17:40:58 2016
 OS/Arch:      darwin/amd64

Server:
 Version:             1.13.0-rc2
 API version:         1.25
 Minimum API version: 1.12
 Go version:          go1.7.3
 Git commit:          1f9b3ef
 Built:               Wed Nov 23 17:40:58 2016
 OS/Arch:             linux/amd64
 Experimental:        true
```
# 概要
- Ansibleを使ってMacのセットアップをしたかった
- Ansibleをどうやって入れるのよ?
- pythonの依存モジュールがいくつか必要だけどシステムのPythonにインストールするのはちょっと．．．
- pythonセットアップ．．．?

と，なんか堂々巡りになってしまったのでdockerコンテナからできればいいなと思いました．

# やったこと
## dockerイメージの作成
```Dockerfile:Dockerfile
FROM python:alpine

RUN set -x \
    && apk add --no-cache gcc libffi-dev musl-dev openssl-dev openssh \
    && pip install ansible

ENTRYPOINT [ "ansible" ]
CMD [ "--version" ]
```

```shell-session
uraura@rosemary$ docker build -t ansible .
:
中略
:
Successfully built 690d16250387
```

## セットアップ
- System Preferences > Sharing > Remote Login をONにすると勝手にMacOSのsshdが起動します
- `ssh-keygen`とかで適当な鍵を作り，public keyをauthorized_keysに書きこんでおく

```shell-session
uraura@rosemary$ docker run --rm -it -v $HOME/.ssh:/ssh ansible all -i $(ipconfig getifaddr en0), -u $USER --private-key /ssh/id_ed25519 --ssh-extra-args='-o StrictHostKeyChecking=no' -m ping
10.0.1.105 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

# まとめ
- dockerべんり
- dockerコンテナからホストへsshする
- ホストディレクトリをマウントして鍵を使わせればいいのでイメージにうめこんだりしなくていい

これでホストのpythonを汚さずにansibleでごにょることが可能になりました．
Atom で LaTeX を使うための準備

修論執筆のため Mac の Atom で LaTeX を使えるようにしたときのメモ。

# 環境
Mac OS X El Capitan (10.11.6)

# MacTeX のインストール
https://tug.org/mactex/mactex-download.html からパッケージファイルをダウンロード（時間かかる）してインストール。

PATH を通す

```rc:.bash_profile
export PATH=$PATH:/Library/TeX/texbin
```

上記をシェルに反映させる

```bash
$ source ~/.bash_profile
```

TeX Live のアップデート（時間かかる）

```bash
$ sudo tlmgr update --self --all
```


# Atom の設定
## インストールするパッケージ
- latex (LaTeX コンパイラを呼び出すやつ）
- language-latex （シンタックスハイライト）
- pdf-view

## テスト
```tex:test.tex
\documentclass{article}
\begin{document}
Hello \LaTeX
\end{document}
```
Packages -> LaTeX -> build (Ctrl-Option-b)

## その他の設定
### 保存時に自動コンパイル
latex パッケージの Settings で "Build on Save" を設定すると、ファイルを保存したときに自動でビルドしてくれる。便利。


### スペルチェック
プリインストールされている spell-check パッケージの設定で "Grammars" に "text.tex.latex" を追加する。
英語のスペルチェックをする場合は "Locales" に "en-US" を追加する。

残念なことに LaTeX のキーワード（documentclass, usepacakge などもろもろ）がミススペリングと認識されてしまう。設定の "Known Words" に入れておけばとりあえず逃れられる。LaTeX のキーワードの辞書をどっかから拾ってきて入れるといいかも。







# 参考
http://ayihis.hatenablog.com/entry/2016/09/24/143641
http://qiita.com/NariseT/items/4b80c80f8e39ea35f597
https://snap.textfile.org/20151006085255/
init関数のふしぎ #golang

## はじめに

知られているようで、案外知られてないことをQiitaに投稿していくのも良いと思い、軽いネタですが`init`関数についてまとめたいと思います。

## init関数とは

`init`関数は特殊な関数で、パッケージの初期化に使われます。
以下のように`main`パッケージに書くと`main`関数より先に実行されます。
`main`パッケージでない場合は、`import`するだけで呼び出されます。

```go
package main

import (
	"fmt"
)

func init() {
	fmt.Println("hello, init")
}

func main() {
	fmt.Println("Hello, main")
}
```
[Playgroundで動かす](https://play.golang.org/p/Nsbs7YIbWp)

## init関数は何に使うのか？

上記では、初期化に使うと書きました。名前からしてそれは想像できますよね。
`init`関数は基本的にはパッケージ変数の初期化に用いられます。なぜならば、何かしらの副作用をパッケージに変数に与えなければ、呼んでも意味がないからです。もちろん、外部のリソースに何かしらの副作用を与える場合（サーバに何かリクエストしたり、ファイルに書き込んだり）もありますが、基本的にはパッケージ変数の初期化に使われます。

パッケージ変数は、代入文でも初期化を行うことがありますが、以下のような場合に`init`関数を使います。

* 代入文で表現できない初期化(forを使うなど)
    * もちろん、`init`関数でやらず、別の関数を呼び出してそれを代入してもよい
* 初期化処理が複雑
* 他のパッケージのパッケージ変数を初期化してやる
    * `image/png`や`image/jpeg`などでやっている
* main関数が使えない場合にエントリーポイントして使う
    * GAE/Goはmain関数を作らず、`init`関数をエントリーポイントとして使用する

## init関数はいつ呼ばれるのか

以下のコードを実行すると、出力はどうなるでしょうか？
`Hello, playground`と出るのはなんとなく空気を読めばわかりますが、よく見るとパッケージ変数の初期化の方が先に実行されていることが分かります。
また、もちろん`main`関数より先に実行されています。

```go
package main

import (
	"fmt"
)

var msg = message()

func message() string {
	return "Hello"
}

func init() {
	fmt.Print(msg)
}

func main() {
	fmt.Println(", playground")
}
```
[Playgroundで動かす](https://play.golang.org/p/_2pIMF9C9i)

[言語仕様](https://golang.org/ref/spec#Package_initialization)を読む限り、依存するパッケージがある場合（import文がある場合）には、それらのパッケージの初期化が終わった後に自身のパッケージの`init`関数が実行されるようです。

## init関数はいくつ書けるのか？

よくよく考えると、複数ファイルにまたがって、1つのパッケージに複数の`init`関数を書いていることがあるのに気づくことがあります。他の関数の場合は、複数定義すると、もちろんコンパイルエラーになります。

ちなみに、ファイルに1つという決まりもなく、複数書けるようになっています。

```go
package main

import (
	"fmt"
)

func init() {
	fmt.Print("hello")
}

func init() {
	fmt.Println(", init")
}

func main() {
}
```
[Playgroundで動かす](https://play.golang.org/p/ZaBbdTcHLY)

不思議ですね。`runtime`パッケージを使って関数名がどうなっているのか調べてみましょう。

```go
package main

import (
	"fmt"
	"runtime"
)

func init() {
	var pcs [1]uintptr
	runtime.Callers(1, pcs[:])
	fn := runtime.FuncForPC(pcs[0])
	fmt.Println(fn.Name())
}

func init() {
	var pcs [1]uintptr
	runtime.Callers(1, pcs[:])
	fn := runtime.FuncForPC(pcs[0])
	fmt.Println(fn.Name())
}

func main() {
	var pcs [1]uintptr
	runtime.Callers(1, pcs[:])
	fn := runtime.FuncForPC(pcs[0])
	fmt.Println(fn.Name())
}
```
[Playgroundで動かす](https://play.golang.org/p/4r1-rD0yE9)

実行すると、以下のように出力されます。

```
main.init.1
main.init.2
main.main
```

どうやら、各`init`関数には番号が付けられており、区別されているようです。

## init関数は呼び出せるのか

`init`関数は他の関数内から呼び出せるんでしょうか？
`main`関数から呼び出してみます。

```go
package main

import "fmt"

func init() {
	fmt.Println("hoge")
}

func main() {
	init()
}
```
[Playgroundで動かす](https://play.golang.org/p/9agxBo8o4Q)

実行すると、以下のようにエラーがでます。

```
tmp/sandbox671239315/main.go:10: undefined: init
```

定義されていないことになるようです。なるほど！

## おわりに

`init`関数についてまとめてみました。
ちなみに、この記事を書こうと思った元ネタは[こちら](https://talks.godoc.org/github.com/davecheney/presentations/gopher-puzzlers.slide)です。これも面白いので、ぜひ読んでみて下さい！
Git学習メモ

#git(ギット)
バージョン管理システム

- 公式サイト：<a href="https://git-scm.com/"target="_blank">git</a>
- 必要な知識
　- Linux
　- vim
　


#gitの大まかな流れ
![キャプチャ19.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/60983e64-51d4-af19-ecdf-84bceb3ae970.jpeg)

リポジトリにはローカル、リモートと2種類ある。
　ローカル：個人作業時に使う
　リモート：webやネットワーク上で複数人とソースコードを共有する時に使う<br>

今からvim上で作業していきます。

##名前の設定

```git:name

$ git config --global user.name"名前"
```

##メールアドレスの設定

```git:email
$ git config --global user.email"メールアドレス"
```

##メッセージの色分け

```git
$ git config --global color.ui true
```


##設定の確認（一覧表示）
※表示されない場合は設定が出来ていません。
　記述に間違いがないか探してみましょう。（スペースが無いなど）

```git
$ git config -l
```

実行結果
![キャプチャ22_Ink_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/142313/86b76613-02b2-00ae-68fe-67c0a3ca324d.jpeg)

##ヘルプの見方

```git:help
$ git コマンド名 --help 
           or
$ git help コマンド名
```

#コミット
コミットとは
ファイルやディレクトリの追加・変更を、リポジトリに記録すること
<br>
1.Unixコマンドでプロジェクトフォルダ作成。
フォルダ作成コマンド：mkdir
ディレクトリを移動：cd

2.プロジェクトへ移動し、下記を打ち込みgitで管理するよと宣言する

```git 
[sample@localhost プロジェクト名]$ git init
```
実行結果
![キャプチャ23.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/bfe33979-9819-f8bc-50bc-d105da408ac0.jpeg)

3.ファイルを作成や修正・変更する。（作業ディレクトリ）
4.ファイルをステージングエリアに上げる

```git
[sample@localhost プロジェクト名]$ git add ファイル名
```

リターンを押すと、特に何も表示されませんが、ステージングエリアへ上がっています。

5.リポジトリへ上げる

```git
[sample@localhost プロジェクト名]$ git commit
```

リターンを押すと、エディタが立ち上がり、メッセージの入力を求められます。
そこへは変更点など覚えやすい文言を入力します。
ここまで出来たら無事にコミットが出来ました。

コミットした履歴を見たい場合のコマンド

```git
[sample@localhost プロジェクト名]$ git log
```

全体的な流れはこんな感じ。
ESP8266で複数のSSIDを利用する

ESP8266さん、すんごい便利なんですが、サンプルコードを見ると一つのSSIDを使うコードばっかりで、環境に合わせてソースいじって書き込みし直ししなきゃいけないの面倒なんですよね。

普通のパソコンやスマホのように、複数のアクセスポイントを登録しておいて、使える電波を使って欲しい！

その実現方法を紹介します。

# #include \<ESP8266WiFiMulti.h\>

複数のSSIDを利用するライブラリが存在し、そのサンプルコードが下記URLにあります。

https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino

これをそのまま利用すればOKですね。

# もうちょい実用的に

サンプルの紹介だけだと芸がないので、もうちょっと実用的な感じにしたコードに書き直しました。

```cpp:MyWiFiMulti.ino
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti wifiMulti;

wl_status_t prevWifiStatus = WL_IDLE_STATUS;   

void setup() {
  Serial.begin(74880);  // 起動時に合わせて74880bpsにする
  delay(10);

  wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");

  Serial.println("");
  Serial.println("boot");

  // ここではまだ繋ぎに行かない
}

void loop() {
  wl_status_t wifiStatus = wifiMulti.run();
  if ( prevWifiStatus != wifiStatus ) {
    prevWifiStatus = wifiStatus;
    if( wifiStatus == WL_CONNECTED) {
      Serial.println("WiFi connected");
      Serial.println("SSID: ");
      Serial.println(WiFi.SSID());
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    else {
      // ステータス毎にメッセージ変えたほうがいいかも（各自宿題）
      Serial.println("WiFi error?");
      Serial.println(wifiStatus);
    }
  }

  // do something
}
```
再接続したときの他、接続が切れたときなどにもシリアルに出力するようにしてみました。

各自宿題のところは
https://www.arduino.cc/en/Reference/WiFiStatus
を参考に、なんとかしてみてください:sweat_smile:
GitlabからGitHubにリポジトリを移行する時にやったこと


会社の開発メンバーやリポジトリ数、コミット数が増えてきたおかげもあって、インストールして使っていたGitlabが重くなりやすくなってきて効率を落としていたので、今年に入ってGitHubへ移行を実施しました。その時に実施した作業を簡単にまとめます。（既出かもしれませんが...）

## mirrorオプションでブランチも含めて一括で移行

よく紹介されている方法としては以下のようなものです。

```
git clone ssh://git@gitlab.xxx.com/hoge/repo.git
cd repo
git remote set-url origin ssh://git@github.com/hoge/repo.git
git push origin --all
```

この方法でも大体の移行はできますが、ローカルに落としていないbranchやtagなどを移行することはできなかったので、以下の手段に切り替えました。

```
git clone --mirror ssh://git@gitlab.xxx.com/hoge/repo.git
cd repo.git
git remote add --mirror=push github ssh://git@github.com/hoge/repo.git
git push github
```

こうすることで、ローカルにブランチを落とすことなく移動することができます。


## データ容量エラーへの対応

ここからは特定のプラットフォームへの移行に限定される話かもしれませんが、GitHubに対して移行をする場合、100MB以上のファイルのコミット歴があるリポジトリ/ブランチをpushしようとすると以下のようなエラーとなります。

```
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
```

エラーメッセージにちゃっかり宣伝入ってますw

現存するものには、この大きさのファイルがなかったので、[Manually reviewing large files in your repository](https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html) にある git_find_big.sh を使って、大きいファイルを調査します。（1. の「Download the script」リンクから落とすことができます）

git_find_big.sh を調べる対象のリポジトリ直下に置いたら、実行します。（本当はSHAなどもう少し長いです）

```
$ sh git_find_big.sh
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
-e      size   pack      SHA         location
769396  86216
1018364 15570  abcdefgh  dump.sql
996     344
780     158    bcdefghi  hoge/fuga.php
........

```

実際、100MB以上のファイルのコミット履歴が残っている場合、大抵そのファイルは使ってなくて、誤ってcommitされていることが多いかと思います。（私の場合も、上記の例のようにマスキングDBのdumpファイルがコミットされたために、pushが通りませんでした）

その場合は、履歴をなかったことにして対応することができます。（歴史を書き換える危険な作業なので、バックアップを取ってから実行されることをお勧めします）

```
git clone ssh://git@gitlab.xxx.com/hoge/repo.git
cd repo

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch dump.sql" -- --all

git push origin --all --force
```

例として、dump.sqlのコミット履歴を抹消しています。この操作を、大容量ファイル全てに対して実行したら、pushすることができます。