OmniAICreator/Qiita-1.07M huggingface dataset:
超大手から超ベンチャーに転職してよかったことつらいこと

[転職 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/job) 12日目の記事です。
※あくまで個人の主観です。

直近3ヶ月以内で超大手通信会社から
メディアとかに取り上げられたり、ストアランキング上位のアプリを出している超ベンチャーに転職しました。
初めての転職です、自分を変えたくて転職しました。


# よかったこと
## プロジェクトの進行がわかりやすい
大手だと何かやるにつけて会議だの稟議だの通さないといけない。
何かやりたいってなったときに待ちの状態が発生しやすくフラストレーションが溜まる。
ベンチャーだと施策実行までのラインが短い
よくわからないところで進捗が止まりにくい

## 裁量が大きい
自分がこのサービスで世の中を変えるんだってくらいの熱量がなければできない。
（それくらいの熱意と覚悟がないと逆にベンチャーへの転職はおすすめできないです。）
任されているものが大きいだけにやりがいはでかい
一人一人がサービスを支えてる自覚があるため、社員全員のモチベーションも高い

## 人間関係
年齢層も近く、チームが小さく見通しが良いため
コミュニケーションを取りやすいので
職場の人間関係は前よりよいです
（組織が大きくなってきたら考える必要が出てくると思いますが・・・）

# つらいこと
## 倒れたら終わる
自分が倒れたときの代わりの担当者がいない
土日障害とか問題起きても対応しないといけない
開発＆運用を同時に回さないといけないので稼働時間がやばい

## 給与・福利厚生その他もろもろ
給与は大分さがりました、
それ差し引いてもゆとり環境で腐っていくのが嫌だったので転職しました。
福利厚生は詳細は書けませんが
最低限のものはほしいなとも思ったりはしました。
あと寒かったり（物理）、自費負担とかの問題とか・・・

# まとめ
周りが優秀すぎると自分なんかが本当に任せてもらって正しかったのだろうかと思うことはたまにある。
（自分の技術やら人間としての能力が足りてない感じ）
使ってもらっているユーザに対して押し売りになっていないだろうかとか、
前いた環境はそうゆうことすら考えていないようなゆとりな環境だったので
ユーザビリティやらサービスが目指してる先を考えることができるようになったのは前進だと思う。
あと、大手だと今まで会社が源泉徴収やら住民税やら福利厚生でやっててくれたこととかも見直すきっかけになった。
Apache Zeppelinにチームで利用するためのセキュリティ設定

# Zeppelinにセキュリティを導入したい背景

Amazon EMR上　のZeppelinにガチャガチャとダッシュボードを作ったのでいざチームのみんなに見てもらえるようにしようと思ったのが背景。HDPのアドベントカレンダーなのにEMRでやっているのはご愛嬌。EMR久しぶりにさっているけど、コンフィグの管理と反映がやっぱり手間かかる。EMRだと[Configuring Applications](http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-configure-apps.html)みたいな機能を使って起動時にコンフィグをインジェクションしちゃうのがやっぱりよさげ。

いろいろ手元で試行錯誤するにはApache Ambariみたいなものが入っていると便利でいいね。

# やったこと

1. 認証の導入
    - 単一ユーザーでの認証。
    - ユーザーごとの権限管理は今回はやっていない。
2. HTTPS化

# 認証 

## ZeppelinはApache Shiroを認証認可に利用している

Zeppelinのドキュメントの[Shiro authentication for Apache Zeppelin](https://zeppelin.apache.org/docs/0.6.2/security/shiroauthentication.html)を参照して設定。手順は以下のとおり

### 1. shiro.ini: 認証有効可のために編集

shiro.iniはEMRだと`/etc/zeppelin/conf/shiro.ini`にある。これをドキュメントどおり

```bash
/** = anon
#/** = authc
```
から

```bash
#/** = anon
/** = authc
```
に変更。

### 2. zeppelin-site.xml: Zeppelin側で匿名ユーザーをアクセス拒否するようにする

`/etc/zeppelin/conf/zeppelin-site.xml.template`というファイルがあるのでこれを`/etc/zeppelin/conf/zeppelin-site.xml`にコピーして`zeppelin.anonymous.allowed`を`false`に変更する。

### 3. Zeppelinを再起動して設定を適用

```bash
$ sudo -u zeppelin /usr/lib/zeppelin/bin/zeppelin-daemon.sh restart
```

### 4. アクセスしてみる

shiro.iniを見ると以下の様なデフォルトユーザーが設定されているので、ZeppelinにアクセスしてLoginボタンからユーザー名とパスワードを入力してやればOK

```
admin = password1
user1 = password2
user2 = password3
```

##　shiro.iniをちょっと覗いてみる

さっと覗いてみると、LDAPやActive Directory関連の設定項目が並んでいる。必要に応じて設定してやればバックエンドにLDAPなどを簡単に利用できそう。いまのところ不要なのでためしていない。

```
activeDirectoryRealm = org.apache.zeppelin.server.ActiveDirectoryGroupRealm
activeDirectoryRealm.systemUsername = userNameA
activeDirectoryRealm.systemPassword = passwordA
activeDirectoryRealm.searchBase = CN=Users,DC=SOME_GROUP,DC=COMPANY,DC=COM
activeDirectoryRealm.url = ldap://ldap.test.com:389
activeDirectoryRealm.groupRolesMap = "CN=aGroupName,OU=groups,DC=SOME_GROUP,DC=COMPANY,DC=COM":"group1"
activeDirectoryRealm.authorizationCachingEnabled = false

ldapRealm = org.apache.zeppelin.server.LdapGroupRealm
# search base for ldap groups (only relevant for LdapGroupRealm):
ldapRealm.contextFactory.environment[ldap.searchBase] = dc=COMPANY,dc=COM
ldapRealm.contextFactory.url = ldap://ldap.test.com:389
ldapRealm.userDnTemplate = uid={0},ou=Users,dc=COMPANY,dc=COM
ldapRealm.contextFactory.authenticationMechanism = SIMPLE
```

今回は小さな利用だしチーム内で権限をわける必要がないのでLDAP等は利用の検討対象外だったけれども、大きな組織の中で利用するような場合や、HDPを使っている場合などはLDAPやActive Directoryを使っていることも多いと思う。そういうときにサクッと設定できそうでよさげ。

# HTTPS化

ユーザー認証ができたので、あとは通信を暗号化してやればまあOKかなということで、nginxでSSL Terminationをする。ZeppelinはWebSocketを利用するので、Reverse Proxyは`Connection: Upgrade`をサポートするように設定する必要があるのに注意。
HDPのチュートリアルを翻訳した

このブログは[Hortonworks Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hortonworks)の11日目のエントリーです。

最初はHortonworks SandboxのDocker版を紹介しようかと思っていたのですが、@cyberblack28 さんが既に[HDP SANDBOX on SoftLayer by Rancher](http://qiita.com/cyberblack28/items/531cb3338581b5076e10)で紹介していたので別のネタでいきます。

タイトル通りなんですが、HDPのチュートリアルを(一部)翻訳したのでそれを紹介します。

翻訳は、今話題のGoogle翻訳をかけて、それを直すというやり方でやっています。世間の評判通り、確かに今のGoogle翻訳はかなり自然な日本語を作ってくれるので比較的時間をかけずに翻訳を作ることができました。それでもたまに誤訳があったりするので、一応直してはいますが、私の英語力は大したことないので修正漏れがあると思います。もし見つけた際にはプルリク等を送ってもらえると嬉しいです。

以下がその翻訳になります。

[LAB 1 - LOADING SENSOR DATA INTO HDFS](https://github.com/brfrn169/hdp-tutorials-ja/blob/master/lab1.md)
[LAB 2 - HIVE AND DATA ETL](https://github.com/brfrn169/hdp-tutorials-ja/blob/master/lab2.md)
[LAB 4 - SPARK RISK FACTOR ANALYSIS](https://github.com/brfrn169/hdp-tutorials-ja/blob/master/lab4.md)

簡単にチュートリアルの内容を説明します。
とある会社でトラックで商品を配送しています。そのトラックにはセンサーが積み込まれており、そのデータは定期的に収集されています。そのデータの中には位置データやイベントデータなどが含まれています。イベントデータには急ブレーキや車間距離が短い、スピード違反しているなどがあります。その会社がHadoopを使ってやりたいことは、事故等のリスクを軽減することです。そのために運転手のリスクファクタ(どれくらい危険なイベント発生させる可能性が高いか)を計算するというのがこのチュートリアルの目的です。

内容としては、トラックのセンサーデータをHDFSにアップロードし([LAB1](https://github.com/brfrn169/hdp-tutorials-ja/blob/master/lab1.md))、Hiveにロードし([LAB2](https://github.com/brfrn169/hdp-tutorials-ja/blob/master/lab2.md))、SparkやZeppelinを用いて運転手のリスクファクタを計算する([LAB4](https://github.com/brfrn169/hdp-tutorials-ja/blob/master/lab4.md))というものになっています。

HDPを始める最初のステップとしては[HDP Sandbox](https://jp.hortonworks.com/downloads/#sandbox)を動かしてみるのが良いと思いますが、さらにチュートリアルをやってみると理解が深まると思います。

興味のある方は是非やってみてください！
ArduinoからFirebase(データベース)にアクセスする

#Arduinoの準備
スイッチサイエンスさんで販売されている[ESPr Develper(ピンソケット実装済み)](https://www.switch-science.com/catalog/2652/)を使いました。
このESPr Developer(に載っているESP-WROOM-02)をArduino IDEで開発できるようにします。
手順はスイッチサイエンスさんにて公開されています。
[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)

#Firebaseの準備
FirebaseのRealtime Databaseを用意します。
手順はネットにたくさん公開されているので、ここでは省略します。
データベースのルールは以下のように誰でも読み書きできるようにしておきます。

```
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```

#FirebaseArduino
ArduinoからFirebaseのAPIを叩くための[FirebaseArduino](https://github.com/firebase/firebase-arduino)というライブラリが公開されています。これをArduinoIDEに取り込みます。
まずzipファイルでダウンロードします。

次にArduinoIDEから「スケッチ-ライブラリをインクルード-.zip形式のライブラリをインストール...」と選択して、さきほどダウンロードしたzipファイルを選択します。

ライブラリに付属するサンプルをベースに作成します。
「ファイル-スケッチの例-FirebaseArduino-FirebaseDEMO_ESP8266」と選択してサンプルを開きます。

WIFI_SSIDとWIFI_PASSWORDは自身の環境ものに書き換えます。
FIREBASE_HOSTはFirebaseのRealtimeDatabaseのところで表示されている

```
https://XXXXX.firebaseio.com/
```
の「XXXX.firebaseio.com」に置き換えます。
FIREBASE_AUTHは今回は使わないのでテキトーでいいです。
以下の部分を書き換えます。

```
//Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.begin(FIREBASE_HOST);
```

Firebase.beginのパラメータからFIREBASE_AUTHを外します。
これで書き込もうとするとFirebaseArduinoのライブラリ内でコンパイルエラーになりました。
とりあえず対処療法としてコンパイルエラーにならないように直接編集しておきます。

```~/Arduino/libraries/firebase-arduino-master/src/thing
Config kDefaultConfig = {
    "",  // firebase host
    "",  // firebase auth
    "/fthing",  // path in firebase
    "",  // wifi ssid
    "",  // wifi key
    0.1,  // analog activation threshold
    0,//D1,  // digital in //←とりあえず0に
    BUILTIN_LED,  // digital out
    A0,  // analog in
    0,//D1, // analog out // ←とりあえず0に
    0,//D0, // config mode button // ←とりあえず0に
  };

```

D1、D0が見つからない、というエラーなので上記ではとりあえず適当な数字で置き換えています。

さて、これでArduinoに書き込んでからFirebaseのRealtimeDatabaseを見ていると、刻々と値が更新されているのが分かると思います。
コンソールで動くエディタを作る(11日目) カーソル位置の編集その２

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の11日目です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

# 文字位置の取得

前日分で行の先頭ポインタまでは取得できているので、行から編集したい文字の位置を取得します。
文字の位置は文字数で保持していますが、取得したいのはバイト数なので注意して実装します。
細切れになった文字を保持する構造体と、その中の何バイト目かを返す関数を作りました。
また、文字数はあらかじめ全ての行に対して計算して保持しておくようにしました。

`#35w [9b,3p]私はそ -> [9b,3p]の人を -> [9b,3p]常に先 -> [9b,3p]生と呼 -> [9b,3p]んでい -> [7b,3p]た。`

デバッグ用レンダラーの出力例です。
読み方としては、この行全体は35文字幅あって、9バイト3文字の「私はそ」を持っていて、->で単方向リストの次の構造体に移動して9バイト3文字の「の人を」があって・・・
という感じです。

表示するたびに毎回全て再計算していますが、必要がないときは前の計算結果を使うようにあとで直したいですね。
今風にいうとvirtual-domみたいに(言ってみただけ)

再計算必要フラグとかを行ごとに用意すればいいのかな。

# コメントアウトすると動かなくなるセミコロンの謎

プログラムの途中にセミコロンだけの行があったとして

```
hoge();
;
fuga();
```

これをコメントアウトすると動かなくなりました

```
hoge();
//;
fuga();
```

なんだってー(AA略

理由はcase文の中だったからです。

```
case INSERT:
  ;
  line* head = getLine();
```

ネットを検索すると、

- そもそもcase文のなかで宣言してはいけない
- defaultだと宣言しても大丈夫、他は宣言してはいけない
- {}でくくると大丈夫

等ありましたが、case先頭がセミコロンだと宣言できるようになる、というのは不思議な挙動です。

セミコロンを置いたらちゃんと動作したのですが、あまりに黒魔術っぽいので{}でくくることにしました。

# 単体テストが欲しい

文字の移動等に悪戦苦闘していると、単体テストが欲しくなってきます。
C言語のテストフレームワークはめぼしいものが見つからず(Visual Studioならできるらしい)
簡単なフレームワークを用意しようと思いました。

# 今日のまとめ

- ゲームマーケットに行ってきました

進捗よくないけど、充実した1日でした。ゲームマーケット楽しかったです！
Angular2の遅延ルーティング Tips

# Angular2の遅延ルーティング Tips

基本的な技術は公式チュートリアルを参照すれば大体把握出来るので、
変則的な技術を書いていきます。
Angular2のバージョンを2.2.0で記載していきます。
※https://angular.io/docs/ts/latest/tutorial/toh-pt5.html

# アジェンダ
1. ルーティングによるModuleの遅延ロード
2. URLの整合性エラールーティング
3. 遅延ルーティングによる気を付ける点

## ルーティングによるModuleの遅延ロード
- 下記コードがキモになってきます。
    loadChildren:'./app/routing/sample_child.routing.js#AppChildRouteModule'
    './app/routing/sample_child.routing.js' ロードするファイル
    'AppChildRouteModule' ロードするファイル内のモジュール
    
```Typescript:sample.routing.ts
    const appRoutes: Routes = [
        { path: '', redirectTo: 'sample', pathMatch: 'full' },
        { path:'sample', loadChildren:'./app/routing/sample_child.routing.js#AppChildRouteModule' }
    ];
```
- https://github.com/MakotoTaniguchi/Sample_Angular2/blob/master/app/routing/sample.routing.ts

## URLの整合性エラールーティング
下記コードでURLの整合性があってないと、ErrorComponentのTemplateが
**<router-outlet></router-outlet>**に適用されます。

```Typescript:sample.routing.ts
const appRoutes: Routes = [
    { path: '', redirectTo: 'sample', pathMatch: 'full' },
    { path:'sample', loadChildren:'./app/routing/sample_child.routing.js#AppChildRouteModule' },
    { path: '**', component: ErrorComponent },
];
```

## 遅延ルーティングによる気を付ける点
下記コードではルーティングエラーが発生します。
Pathの箇所で'**'には遅延ルーティングが設定出来ません。
なのでルーティングエラーが発生した際に適応するComponentは遅延ルーティングではなく
最初のローディングでComponentを読み込ませることにしましょう。

```Typescript:sample.routing.ts
    const appRoutes: Routes = [
        { path: '', redirectTo: 'sample', pathMatch: 'full' },
        { path:'sample', loadChildren:'./app/routing/sample_child.routing.js#AppChildRouteModule' },
        { path:'**', loadChildren:'./app/routing/sample_child.routing.js#ErrorRouteModule' }
    ];
```

### サンプルコードのリポジトリ
https://github.com/MakotoTaniguchi/Sample_Angular2
生協の職員がCode forのキャプテンになっちゃったけど需要ある？

「エンジニアもすなるCode forといふものを、生協職員もしてみむとてするなり。」

どうも、[Code for Kobe](https://www.facebook.com/codeforkobe/)（以下C4K）の代表やってます西谷です。本業は[生活協同組合コープこうべ](http://www.kobe.coop.or.jp/)の職員です。C4Kとしての名刺は作っていないので、名刺交換する時に名刺を見て生協職員であることに驚かれたり何故やってるのか質問されたりすることも多いのですが、この機会に今年１年の振り返りも含めて経緯をまとめたいと思います。

代表になったのは、今年の6月2日のことでした。それまで代表をしていた[大山さん](https://www.facebook.com/yuki.ohyama)が退任され、後任は自薦も他薦もOKで、集まった人の中で話し合って決めれば良いんじゃね？という流れになり、何故か推薦された人の中に私の名が…。しかもその話し合いが、コープこうべのワークショップ（これが後々のアイデアソンになります）に向けた相談をしようと私が設定していた飲み会の中でされることになり…。何となく悪い予感はしていましたが、話し合いの結果、私が代表で、副代表が２名（[川井さん](https://www.facebook.com/hiroaki.kawai.921)、[越智さん](https://www.facebook.com/shuji.ochi.ponpoko1968)、いつもありがとうございます！）という形に決まりました。C4Kに初参加したのは今年の2月25日なので、そこから僅か約3か月で代表…という衝撃でした（githubすら分からない私が…です汗）。

そもそもC4Kに参加したきっかけは、神戸市のコーポレートフェローシップに参加していたコープこうべの執行役員[本木さん](https://www.facebook.com/profile.php?id=100002021244245)からの紹介でした。どうやら前のC4K定例会でコープこうべについて話したところやたら反響が良かったらしく、誰かコープこうべの若手職員に声をかけようということになり、私はシステム（と物流）を管轄する部署にいたので、声をかけられたのでした。まぁそれよりも前に[NPOグリーンズ](http://greenz.jp/)の編集学校に本木さんの案内で参加していて、そこから彼とやり取りするようになった…というのも少なからず影響しているのでは、と思いますが（グリーンズは私も[記事](http://greenz.jp/2016/09/17/coop_kobe/)書いてますのでよろしければお読みください！！）。

少し脱線します。

グリーンズへの参加は別な意味でもコープこうべやC4Kでの活動に影響しています。「予測不能を受容する」というマインドをくれたという意味で、です。グリーンズが記事にしている人は既に実績がありこれからもさらに活躍しそうな「ソーシャルデザイナー」で、そういう方々をWEBで紹介することで読者が共鳴したりインタビューされた人と繋がったりして新たな動きが起きる、というのがグリーンズの狙いですが、それってすごく予測不能なことですよね。記事から先に何が起こるかって、インタビューされる人にも記事を書く人にも読む人にも、記事ができる前には分からないので。でもこれはとても大切なマインドだと思います。

僕がコープこうべで所属している部署はグリーンズと真逆で、「予測不能」を徹底的にと言っても良いほど嫌います。基本的に分からない＝リスクと捉えるので。でも新たなことを起こす場合はいつだって予測不能な要素がつきまとう。これを受け入れてリスクチャレンジできるマインドになれたのはグリーンズのお陰で、コープこうべでもC4Kでもこれからの活動の原動力になると思っています。

閑話休題。

C4Kの代表になってからは、しばらくは正直毎月の定例会を回すだけで手一杯でしたが、お陰様で色々とやらせていただきました。[Civic Tech Forum 東海](https://www.facebook.com/CivicTechForum/)や[Girls in Tech Japan](https://www.facebook.com/Girls-in-Tech-Japan-837669356355666/)にお邪魔させていただいたり、[World Data Viz Challenge 2016](http://kobe-barcelona.net/)の司会や、[Code for Japan Summit 2016](http://summit2016.code4japan.org/)で[セッション](https://www.youtube.com/watch?v=wDkd0cg7FPg)を持たせていただいたり、コープこうべの中でもC4Kメンバーに支援いただいて[コープこうべ史上初のアイデアソン](http://www.kobe.coop.or.jp/news/detail.php?id=92399)を開催したり、あと進行中ですが[「チャレンジ！オープンガバナンス2016」](http://park.itc.u-tokyo.ac.jp/padit/cog2016/)へチャレンジしたり…子供がもうすぐ2歳で2人目も出産間近なので家庭とコープこうべとC4Kの両立が大変ですが、充実した日々を過ごしています。

私はありがたいことにC4Kとコープこうべの二足の草鞋を履いている訳ですが、これからコープこうべとC4Kで神戸界隈を盛り上げていくことができるんじゃないかと思っていて、来年もとても楽しみです。その辺の詳細な考えとかコープこうべの動きとかも書いてみたいなぁと思わなくもないですが、まぁ今日は代表になった経緯をまとめるということが目的なので、この辺で(^^)
WebGLで女子高生がるんるんしてるだけ。

この記事は WebGL Advent Calendar 2016 の１１日目の記事です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/0fd4afa6-dd21-11d7-1a99-c6464fca197a.png)

年の瀬せまる師走の日曜日。皆様はどうお過ごしでしょうか。
筆者はもちろんWebGLでした！

ま、担当日ですから…

それで、結論としては記事タイトルのようなものを作りました。

[ライブデモはこちら](https://warotarokz.sakura.ne.jp/experimental/ptw_tips/tips/complex_toon_drawing/)

#【発端】 PTW Tipsというリポジトリを作りました
個人的に、[「ファンタスティック トリノワールド」](http://www.geocities.jp/warotarock/ptw/)というゲームをもうずっと作っているのですが、ある程度完成が近づいてきて、色々思うところあり、技術的な総まとめを目的としたリポジトリを作りました。

今回の記事はある意味その一環なのです。

[PTW Tips](https://github.com/warotarock/ptw_tips)

コンセプトというかやりたいことは次のようなことです。

- WebGLの技術を自分なりにまとめたい
- ゲームプログラミングの基礎を自分なりにまとめたい
- TypeScriptでクラスを活用したプログラミングを模索したい（ＰＧ的欲求）
- ゲーム開発に関連する作業を統合して自動化するツールを作りたい
- ツールの実行環境はElectron（どこでも動く、ライブラリも豊富）
- コンバート処理と描画処理は分離する（描画処理は最適化されたjsonファイルを読み込むだけ）

まだまだ作成中ですが、今のところTypeScriptでWebGLを扱うための基礎的な部分はだいたい作りました。

WebGLでスキンモデルを扱うためのデータ作成と描画の簡単なサンプルも作ったのですが、モデルが簡単すぎてものたりないので、少しきちんとしたモデルでサンプルを作ろうと思いました。

で、時期が合うのでアドベントカレンダーで出すことにしました。

#スキンモデルでトゥーンレンダリングで髪を揺らしたい
また個人的な話ですが、実は映像作品を作りたいという気持ちから、トゥーンレンダリングで髪を揺らすのをやりたいなと常々思っておりました。それでアドベントカレンダーでやろうと。

しかしなかなかに厳しく遠い道です。必要なものが色々あります。ゲームエンジン？知りまs

- スキンモデルのコンバータ作成（鬼畜難易度）
- アニメーションのコンバータ作成（わりと簡単）
- アニメーションの計算実装（わりと簡単）
- スキンモデルの描画実装（けっこう面倒）
- レンダーバッファ描画（仕組みは簡単だが数が増えるととややこしい）
- トゥーンレンダリングの実装（たいてい微妙にうまくいかない）

#スキンモデルデータ作成、コンバートの流れ
1. Blenderでモデルを作る
2. Collada（.dae）形式でエクスポート
3. Electron 上で THREE.js の Collada ローダで読み込む(THREE.jsを描画には使わない...合掌)
4. TypeScriptで書いたコンバート処理でjsonファイルを作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/d73203e8-c0c4-a3fe-5bed-6ac7857458ef.png)


#アニメーションデータ作成、コンバートの流れ
1. Blenderでアニメーションを作る
3. Electron上で BlendFileReader.js (拙作)で読み込む
4. TypeScriptで書いたコンバート処理でjsonファイルを作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/573decbd-2adb-8bde-1d29-bddd555330ea.png)

#スキンモデルの描画
モデルを分割して描画します。
コンバータの段階でボーン２つを使用するパーツ、ボーン４つを使用するパーツに分けています。
ドローコールはそれなりに多くなりますが、シェーダの処理は比較的単純になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/a0b659ff-fdc4-9964-ac2e-b06af1e48672.png)

シェーダはTypeScriptでクラスで作成し、共通する部分は継承を使ってできるだけ差分だけ書きます。
文字列で埋め込んだりしていて、少し特殊かもしれません。
それでも関数の中でソースコードを組み立てることができるので、工夫しだいで差分プログラミング的な
こともできるはず。

#トゥーンレンダリング
トゥーンレンダリングは色々考えた結果、形状を決めるためのモデルと影を付けるためのモデルをそれぞれ用意する方法をとることにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/e1324a7d-ad4a-9884-15ac-d7f895e6cc61.png)
形状モデル

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/e8c20a62-6771-26de-ae8b-2e985e038098.png)
影用モデルと重ねた状態

下の画像はBlenderからエクスポートするとき選択状態のオブジェクトを出力するため常にこの状態にするのですが、なんというか絵づらがやばい。

描画の流れは次のようになります。

1. 背景を描画
2. バッファに顔の中（目、口など）以外のモデルを描画
3. バッファに深度テストオフで顔の中のモデルを描画
4. バッファを参照しながら影モデルを描画

4ではキャラをすっぽり覆う影用モデルを描画して、HSVで明度を落として影を付けます。
影用モデルのアルファ値は無視してバッファのアルファ値を使うことで、
キャラ部分だけに影を付けたような感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/4bfc1d0a-13db-5e8d-5d49-4567d26fabfb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59191/a907b64f-6c39-8f3c-f42a-6dc383c4a6dd.png)


#最後に
なかなかWebGLらしいネタって難しいですが、
ひたすらjsonをデータとして使ってるのがWebGLらしいと思いました。
glTFも熱いですし。

それではよいお年を！
ESNextで書くAngular^2.0.0

前職でAngular\^2.0.0をTypeScriptで書いていましたが、現職ではReactをESNextで書いています。
Angularはsemverを採用していることもあり、個人でアップデートを追っているのですが、今回は現職がESNextを使用していることもあって、AngularをESNextで書く方法や、少し気をつけた方が良い点を挙げていきます。（基本的には本家ドキュメントの[ts-to-js](https://angular.io/docs/ts/latest/cookbook/ts-to-js.html)を読めばやり方はわかります）

**参考にしたリポジトリ**
- [angular2-babel-esnext-starter](https://github.com/blacksonic/angular2-babel-esnext-starter)
- [angular2-esnext-todomvc](https://github.com/blacksonic/angular2-esnext-todomvc)
- [babel-preset-angular2](https://github.com/shuhei/babel-preset-angular2)

## 前提

webpackとbabelを使用します。templateとstylesはファイルを分けます。

## babelの注意点

`babel-preset-latest`を使えば、基本的にdecorator以外はTypeScriptと同じ書き味で書けます（decoratorは`latest`には入っていません）。
さて、このdecoratorが厄介者です。ecmafutureにおいてdecoratorの存在はまだ流動的で、仕様も定まっておらず、つまり確定的なtranspile方法がない現状ですので、もし使用したいのなら、相応の覚悟を持って使用する必要があります。
使いたい方は、`babel-plugin-transform-decorators-legacy`を使うか、`babel-preset-angular2`を使うと楽です。とくに`babel-preset-angular2`はtransform-decorators-legacyをさらに拡張してあり、よりTypeScriptに近い書き味で書けますが、お仕事で使うのならコードリーディングはしておいた方が良いかもしれません。

## stylesの注意点

`to-string-loader`を使うとわりと何も考えずに実装できます。逆に`raw-loader`だと動かないです（わたしは諦めました）。

## templateとstylesの指定を楽にする

webpackとbabelを使っているので、基本的にはESmodulesの形式でimportしたものを指定しますが、`angular2-template-loader`を使うと、templateUrlとstyleUrlsの形で指定できます。

## ESNextで書く利点
webpackな時点でお察しではありますが、TypeScriptで書くよりはコンパイルが早いです。
ぶっちゃけこれが唯一の利点ですが、lacoさんが[light-ts-loader](https://github.com/laco0416/light-ts-loader)を作ってしまったので、もはやただの興味本位でしか無くなってしまった気配があります...。

## 余談
AngularでFluxをデザインパターンのみ適用できるかなというものを考えるために作っているリポジトリで試してみました（肝心のFlux云々がまだ影も形もありません）。
https://github.com/asukaleido/angular-flux-example
現在のTypeScriptはやろうと思えば型ガン無視で書けるので、頑張った割には使えない内容になってしまった感が否めませんが、逆に言えばほぼTypeScriptの書き味で書けるくらいESNextとTypeScriptは近いものになっているのだなーとしみじみ感じた次第です。
rgの最新バージョンをチェックするシェルスクリプト

　[Shell Script Advent Calendar 2016](http://qiita.com/advent-calendar/2016/shell-script)の今日の枠が埋まってなかったのでコネタを書きます。

## やりたいこと

　[rg（ripgrep）](https://github.com/BurntSushi/ripgrep)はテキスト検索ツールです。ag（The Silver Searcher）と同様に`grep -r`相当の検索を高速に実行します。rgについての詳細はすでにいろいろ解説エントリーが書かれていますし、今回の本題ではないので割愛します。

　rgは、GitHubからダウンロードしてきて、静的リンクされた1バイナリを~/binなどに置くだけで使えるので、インストールも楽です。ただし、開発がえらく速いので、こまめにチェックしていないとバージョンがすぐ古くなってしまいます。

　そこで、現在インストールされているバージョンとGitHubのreleasesに上がっているバージョンを比較する簡単なシェルスクリプトを作りました。

## 作ったシェルスクリプト

　GitHubのreleases APIでとってきたlatest情報のJSONから、jqコマンドでバージョン番号を抜き出して比較します。

```sh:
#!/bin/sh
APIURL=https://api.github.com/repos/BurntSushi/ripgrep/releases/latest
{
    rg --version | tr -d '\n'
    echo -n ' -> '
    curl -s "$APIURL" | jq -r .tag_name
} | sed -e 's/^ripgrep \(.*\) -> \1$/now up to date/'
```

　最新版の場合は「now up to date」と、最新版でない場合は「ripgrep 0.3.1 -> 0.3.2」のような形式で表示されます。

## シェルスクリプトとしての工夫点

　最初に書いたときには、インストールされているバージョンと最新バージョンをそれぞれ変数に入れてから比較していました。しかし、コマンドの結果を変数に入れるのはシェルスクリプトらしくないなあと思っていました。

　そんなときにpiroorさんの[「プログラマーの君！ 騙されるな！ シェルスクリプトはそう書いちゃ駄目だ！！ という話 - Qiita」](http://qiita.com/piroor/items/77233173707a0baa6360)を読んで、やっぱりそうだなあと思い、パイプで処理するよう書き直しました。
eslint-config-airbnbをサーバーサイドで使いたい

eslint-config-airbnbを普通にNode.jsでExpressとかで使おうとすると、
ReactやJSXなどフロントエンド用のも読み込まれてしまってちょっとうざい

そういうときは`eslint-config-airbnb-base`を使う

```bash
$ npm i --save-dev eslint eslint-config-airbnb-base
```

インストールして`"extends": "airbnb-base"`を指定する

```json:.eslintrc.json
{
    "env": {
        "es6": true,
        "node": true
    },
    "extends": "airbnb-base"
}
```

これでNode.js用にlintがかかるようになる

```bash
$ ./node_modules/.bin/eslint ./
```
Djangoの管理サイトに過度な期待をしてはいけない

[Django Advent Calendar 2016](http://qiita.com/advent-calendar/2016/django) 12日目の記事です。

## はじめに

PythonのWebフレームワークであるDjangoは[管理サイト](https://docs.djangoproject.com/ja/1.10/ref/contrib/admin/)が神ってることが特徴の一つです。

![管理サイトの一覧画面](https://docs.djangoproject.com/ja/1.10/_images/admin13t.png)

上のようなフィルターやテキスト検索、ソート、ページングなどを備えた一覧画面と登録・編集画面が以下のような数行の宣言的なコードだけで実現できてしまいます。

```py3:
@admin.register(Question)
class QuestionAdmin(admin.ModelAdmin):

    list_display = ('question_text', 'pub_date', 'was_published_recently')

    list_filter = ['pub_date']

    search_fields = ['question_text']
```

これを使えばWebアプリの構築がすごく簡単にできるように思ってしまいますが、管理サイトには色々と制約があるので、過度に期待してはいけません。

## 管理サイトは用途限定

まず、管理サイトはその名の通り管理者向けのサイトとして設計されています。
ここでいう管理者とは、システム管理者、サービス運用者などのいわゆる中の人のことです。

管理サイトでは各モデルの一覧・登録・編集画面を提供しますが、これは管理者向けの機能であって一般ユーザーに公開するものではありません。

一般ユーザーがデータの閲覧・更新を行う画面が必要な場合は、管理サイトではなく通常の画面(以下、一般サイトと呼びます)で作成する必要があります。

例えば記事を閲覧・登録できるWebアプリを構築する場合を考えてみます。
記事を分類するカテゴリーをサービス運用者が予め登録するのであれば、それは管理サイトで作ってもいいでしょう。
しかし、一般ユーザーが使用する記事の閲覧・登録画面は一般サイトとして作ることになります。

サイト別にユースケースの例を挙げるとこんな感じです。

- 一般サイト
    - 一般ユーザーが、アカウントを登録する
    - 一般ユーザーが、記事を閲覧する
    - 一般ユーザーが、記事を投稿する
- 管理サイト
    - システム管理者、サービス運用者が、管理者アカウントを登録する
    - サービス運用者が、カテゴリーを登録する
    - サービス運用者が、一般ユーザーのアカウントを停止する
    - サービス運用者が、規約違反の記事を削除する

## 基本の画面構成は固定

管理サイトの主要画面は、トップメニューと各モデルの一覧・登録・編集画面から構成されています。

トップメニューはアプリケーション(startappで作るやつ)でグルーピングされてモデルへのリンクで構成されています。

<img width="945" alt="Site_administration___Django_site_admin.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/3114425b-4e58-5829-55ac-67ec6ea3dbbd.png">


モデルの画面にカスタムアクション(画面)を追加することはできますが、元の画面構成を大きく変えるようなことはできません。

## 管理サイトの機能は一般サイトには組み込めない

管理サイトの一覧画面には以下のような便利な機能が予め組み込まれています。

- ページング
- ソート
- フィルター

一般サイトでもこれらの機能はほぼ確実に必要になるでしょう。
しかし残念ながら管理サイトの機能を一般サイトで流用することはできません。自分で作る必要があります。

クラスベースViewでは管理サイトの機能とは別にページング・ソート・フィルターの実装を補助するものは提供されているので実装は容易ですが、それでもテンプレートは全く用意されていないので自分で書く必要があります。

## 想定されたカスタマイズ以上のことは難しい・出来ない可能性がある

管理サイトでは簡単なカスタマイズであればAdminクラスでコードを1行追加だけで実現できます。
Adminクラスで使用できるオプションは[こちら](https://docs.djangoproject.com/ja/1.10/ref/contrib/admin/#modeladmin-options)です。

ここに書かれていること以外のカスタマイズは、Adminクラスのメソッドをオーバーライドすることになります。
しかし一般サイト用のViewクラス群と比較すると、拡張することをあまり意識した作りにはなっていない部分も多いです。
かなりの行数がある一枚岩のメソッドや、モジュール内のプライベート関数を呼び出している部分も存在し、オーバーライドはかなり難しいケースもあったりします。

## 最後に

色々書きましたが、管理サイトは管理者向けのツールとしては非常に強力なツールです。使わない理由はありません。

管理ツールを使うメリットとしては

- 一般サイトがなくてもデータを登録・閲覧できる
- 一般サイトでは表示しない項目を表示できる
- 生データに近い状態でデータを閲覧できる

などもあります。

管理ツールの用途・制限を理解した上で、用法用量を守って正しくお使い下さい。
Zabbix APIの検証はAdvanced REST Clientが便利です！

私の次の記事が埋まってないのが悲しいので社員旅行中ではありますがサクッと書いてみました。A(^_^;


早速ですが、Advanced REST Clientって知ってますか？
[Chrome ウェブストア - Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)

Web API系の検証に便利なツールです。

以前、↓記事書いたんですが、そこでも使ってます。
[jHako APIを動かしてみる](http://qiita.com/KAZ0225/items/774409b1d93f709b59f7)


Zabbix APIの検証ですが以前は↓記事読んでcURLを使ってやってました。
[Zabbix APIを使って値を取ってみる - ike-daiの日記](http://d.hatena.ne.jp/ike-dai/20110418/1303129550)


初めは『おぉ、Zabbix APIがコマンドベースで実行できる！』と喜んでいたのですが、不精な私はそのうち『cURLの形式で打つの面倒臭い！』とZabbix APIの検証嫌いに(笑)


そうこうしているうちにネットでAdvanced REST Clientを見付けました。
で、使ってみて『便利じゃないかこれ！』と…

因みに画面はこんな感じです。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/103473/18ded82f-e887-3847-35e3-335830562828.png)

下記の様にURLをいれ、postを選択し、ヘッダに「Content-Type:application/json-rpc」と記入し、ボディーにuser.loginを記入し…
![02.png](https://qiita-image-store.s3.amazonaws.com/0/103473/566d95a4-9b62-0e85-4889-806647059a73.png)

「SEND」ボタンを押すと、下記の様に実行結果が返ってきます。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/103473/4437c698-c908-b688-b698-d88483877d2e.png)

返ってきた認証情報を設定して、host.getを実行すると…
![04.png](https://qiita-image-store.s3.amazonaws.com/0/103473/46afeecd-5c21-ee41-7c26-950b7716995c.png)

下記の様にhost.getの実行結果が取得できます。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/103473/192c0e6f-6c90-4bda-e566-5a00c5240b74.png)

そして、便利なのは実行した設定を保存できることです。
画面右上のフロッピーアイコンを押すとポップアップウィンドウが表示されます。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/103473/ce8d3b2d-6530-877c-601f-2e66b4108dfd.png)

「Save in project」をクリックし、「Request name」「New project name」に保存する名前を入力して「SAVE」ボタンをクリックします。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/103473/e60a44f8-5045-3320-7dcb-0c5feb5dca62.png)

そうすると次回からはメニューをクリックして…
![08.png](https://qiita-image-store.s3.amazonaws.com/0/103473/b79470ea-7881-5771-01c7-76f9663f58e3.png)

保存したproject nameを選んで…
![09.png](https://qiita-image-store.s3.amazonaws.com/0/103473/c04ecb06-1145-a170-69ba-da87fb96103f.png)

Project endpointsで保存した名前を選択すると保存した内容が表示されます。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/103473/e15c1c3e-edc9-a40d-77b1-899cffee0637.png)

なので、良く使うuser.loginとか保存しておくと一々打ち直さなくて楽できます。A(^_^;

また、接続先でプロジェクトを分けておくのも便利ですね。

以上、さらりとですがAdvanced REST clientの使い方でした。
Web APIのリクエストパラメータのValidationをフィルタ化

# はじめに

ASP.NET Web APIのData Annotationsでリクエストモデルの値チェックをする場合、(万能ではないけれど）アクションフィルタを作ってしまった方が一々同じコードを書かなくて楽かも、という話

# メソッド内に記述する

POSTメソッドのリクエストに対して、URLからIDを取り、ボディをデシリアライズしてモデルにバインドする場合を例にします。
Data Annotations以外にも、nullチェックを含めて、下記のような値チェックが必要になることが多いかと思います。

```csharp
public class PackageController : ApiController
{
    public async Task<HttpResponseMessage> Post([FromUri]string id, [FromBody]PackagingRequestModel request)
    {
        if (!string.IsNullOrWhiteSpace(id))
        {
            // ExceptionHandlerへ飛ばす。（ホントはidの存在チェックもある）
        }
        else if (request == null)
        {
            // Data Annotationsに引っかからないのでnullチェックも必要
            // ExceptionHandlerへ飛ばす
        }
        else if (!ModelState.IsValid)
        {
            // ExceptionHandlerへ飛ばす
        }
        
    }
}
```

これを全てのインターフェイスで毎回書いてるのは面倒ですよね。

# Actionフィルタを使う

前述の内容を次のようにフィルタ化してしまいます。

```csharp
public class ValidationRequiredAttribute : ActionFilterAttribute
{
    // パラメータのnullチェックをするかどうか
    public bool IsNullable { get; set; }

    public ValidationRequiredAttribute()
    {
        IsNullable = false;
    }

    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        if (!IsNullable && actionContext.ActionArguments.Any(x=>x.Value == null))
        {
            // 引数がnull
        }
        else if (!actionContext.ModelState.IsValid)
        {
            // Data Annotationsでひっかかった
        }

        // その他チェックすべきものがあれば実装

        await base.OnActionExecutingAsync(actionContext, cancellationToken);
    }
}
```

IsNullableというプロパティは引数のnullチェックを行うかどうかを表していて、falseの場合は全てのパラメータが非nullである必要があります。

あとはこれをメソッドの上に付けてあげれば、基本的な値チェックはフィルタ内で済ませてからメソッドに入ってきてくれるので、ソースコードが大分すっきりします。

```csharp
public class PackageController : ApiController
{
    [ValidationRequired(IsNullable = false)]
    public async Task<HttpResponseMessage> Post([FromUri]string id, [FromBody]PackagingRequestModel request)
    {
        // 独自の処理ロジックだけ書けばよい
    }
}
```

以上。
New Relic APM で遅い特定のトランザクションを簡単に見つける方法

デジカの宮澤です。アドベントカレンダー12日目です。ひたすら APM の機能ばっかり紹介してきていますが、今回も New Relic APM (アプリケーションパフォーマンス監視) の機能の紹介です。小粒なので、さくっと終わります。

New Relic APM の使い方として多いのは、遅い処理時間のトランザクションを探して、トランザクショントレース（ある時点の単体のトランザクション）を表示し、その処理で呼ばれている SQL などを見て、パフォーマンス改善のとっかかりとする。という流れが多いかと思います。

そして、トランザクショントレースとして記録されるのは、全トランザクションが対象ではありません。（さすがに、全トランザクションの詳細なデータを収集しているとアプリ自体にかかるオーバーヘッドが高くなります）

では記録されるトランザクションの定義はなんでしょうか？ これは設定値で決まっています。デフォルト値は 2秒です。つまり、2秒以上のトランザクションだけがトランザクショントレースとして記録されます。

この閾値の定義や関連する設定項目、変更方法は、[11日目のアドベントカレンダー:New Relic APM: SQL レベルまで見えるトランザクションの定義とその設定](https://newrelic.degica.com/2016-12-11-transaction-trace-threshold-setting)に書いてあるので、気になる方はそちらも併せてご覧ください。

さて、ようやく、今日の本題です。

上記で説明したトランザクショントレースのあるトランザクションに簡単にアクセスする方法です。

１つは Transactions ページで、"Slowest average response time"で並び変えると、トランザクショントレースをもつトランザクションが見つかります。ただ、これだとページ移動して、並び替えて、トランザクションを１つ１つ確認する手間があります。ここではもっと簡単な方法を紹介します。

それは、Overview ページの "Transaction" を見ます。(メインのチャートの直ぐ下、エラー率の左)これは、遅いトランザクショントップ5のリストです。トランザクション名とその横に、掛かった平均処理時間が表示されています。以下がそのリストです。

![apm_transaction_trace_list.png](https://qiita-image-store.s3.amazonaws.com/0/46003/24662a28-607b-9365-d88d-d8640c3d79f3.png)

そのトランザクション名の下に、"Transaction traces" とあり、その横に3つ数字が並んでいます。これは、そのトランザクションで収集したトランザクショントレースの遅い順トップ３です。これは、リンクになっており、数字を押すと、トランザクショントレースページが表示されます。

ちなみに、トランザクショントレースは常に収集される訳ではないので、収集されていない場合は、数字の部分は、"n/a" と表示されます。その場合は、そのトランザクションではトランザクショントレースは収集されていない（つまり、SQL とか確認できない)ということが簡単に判別できます。

以上、どうでしたでしょうか？ この方法を使えば、ワンクリックで、トランザクショントレースにアクセスできるようになります。是非、活用して、効率よいパフォーマンス改善に役立ててください。
ターミナルで Node.js を使った開発をする

Node.js で開発するにあたってのぼくなりの環境を紹介します。

こんな感じ
----------

<img width="1680" alt="Screen Shot 0028-12-09 at 10.40.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/27516/1cffb68c-6aa7-13d3-cca1-8e8248da9674.png">


環境構成
--------

使っているツールは次のとおりです。

- Mac OS X
- Terminal.app
- tmux
    - https://tmux.github.io/
- MacVim Kaoriya
    - https://github.com/splhack/macvim-kaoriya
- n
    - https://github.com/tj/n
- avn-n
    - https://github.com/wbyoung/avn-n

各設定はここに放り込んであります。

https://github.com/januswel/dotfiles

tmux
----

terminal multiplexer というもので ( 略 ) とても便利です。
ローカルで作業するのでセッションとかあんまり恩恵ありません。あ、まちがって `Cmd+q` 押してターミナルを終了しまったときはとても便利です。


左上
----

git 操作や各コマンドの実行をするところです。主にプロジェクト開始時にここで作業することが多いですね。次のような npm scripts を定義して適宜叩いたりしています。

```json:package.json
{
    "scripts": {
        "build": "webpack",
        "build:watch": "webpack --watch",
    }
}
```

左下
----

ESLint による静的解析や flow による型チェック、テストを**常に**流しておく場所です。次のような npm scripts を定義して、大雑把に `npm run test --silent` しながら開発します。

```json:package.json
{
    "scripts": {
        "coverage": "nyc --reporter=lcov npm test",
        "lint": "eslint src test",
        "lint:fix": "eslint src test --fix",
        "test": "npm run lint && npm run type-check && npm run test:spec",
        "test:spec": "mocha test/specs/**/*.js",
        "test:watch": "nodemon --watch src --watch test --exec npm test",
        "type-check": "flow"
    }
}
```

`test:watch` のところに定義してあるように、常にテストを流すために `nodemon` が大活躍です。シンプルで使い勝手よい。何か変えたらその結果がみえる。それで十分です。

あ、 ESLint はルールのメンテナンスコストが高いので、プロジェクト初期は `standard` でざっとはじめて、いざルール変更が必要になったときに ESLint に切り替える、といったことをしています。

右側
----

主にエディターを立ち上げて作業するペインとしています。

エディターに関しては現在は WebStorm 、 Atom 、 VSCode など様々な選択肢がありますが「思考のスピードで編集」するため Vim を好んで使っています。あと軽い。

ハイライトは次を使っています。

https://github.com/isRuslan/vim-es6

jsx にも地味に対応しててステキ。インデントがたまにおかしくなることがありますが、 ESLint の `--fix` オプションがこれまたステキなのでざくっと書いてフォーマッティングしています。細かいこと気にすんなガハハ。 ESLint の `--fix` オプションは gofmt くらいに canonical になればいいなあと思っています。


まとめ
------

たまに左側もしくは右側の最下段にもう一段もうけてログを流したりしますが、基本は上に書いたとおりです。 UI まわりなどブラウザー・シミュレーター・エミュレーターでの確認が必要なときは別モニターにプレビューをうつしたり、それができないときは雑に gVim で編集しながら微調整します。

各ツールの最新バージョンを使おうと思っていたら自然とこうなっていました。 "Do one thing and one thing well" なものを組み合わせていこう。
Java8のStreamを試す

もう散々何処かでやってるかと思いますが、今更ながらにJava8でStream使ったときのパフォーマンスを試してみます。

#環境
■Java

```bash:java
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
```

■Eclisep

Version: Neon.1a Release (4.6.1)

#テストメソッド
引数

- StringのList

やること

- リストをソート
- リストをループさせて、StringBuilderで連結
- リストの文字列が特定の文字で始まる場合は除外

##Streamを使わないコード

```java
	public void sortList(List<String> list) {
		StringBuilder sb = new StringBuilder();
		Collections.sort(list);
		for (String str : list) {
			if (!str.startsWith("ぺ")) {
				sb.append(str);
			}
		}
	}
```

##Streamを使ったコード

```java
	public void sortList(List<String> list) {
		StringBuilder sb = new StringBuilder();
		list.stream()
				.filter(str -> !str.startsWith("ぺ"))
				.sorted()
				.forEach(str -> sb.append(str));
	}
```

##メソッドを実行するコード
テストメソッドを100万回ループする処理を10回実行します。

```java
	public static void main(String[] args) {
		// テストメソッドの引数で使用するリスト
		List<String> list = Arrays.asList(
				"ゆうてい"
				,"みやおう"
				,"きむこう"
				,"1234567"
				,"abcdefg"
				,"ぺぺぺぺ"
				);
		
		// テスト実行のループもStreamで書いてみる
		IntStream.rangeClosed(1, 10).forEach(i -> {
			long start = System.currentTimeMillis();
			StreamTest test = new StreamTest();
			IntStream.rangeClosed(1, 1000000).forEach(j -> {
				test.sortList(list);
			});
			System.out.println("[time]" + (System.currentTimeMillis() - start) + "(msec)");
		});
	}
```

##結果

##Streamを使わないコード
```
[time]174(msec)
[time]144(msec)
[time]161(msec)
[time]117(msec)
[time]136(msec)
[time]204(msec)
[time]132(msec)
[time]133(msec)
[time]126(msec)
[time]127(msec)
```

##Streamを使ったコード
```
[time]526(msec)
[time]442(msec)
[time]684(msec)
[time]373(msec)
[time]378(msec)
[time]335(msec)
[time]363(msec)
[time]364(msec)
[time]390(msec)
[time]353(msec)
```

#結論

今回試したコードでは、Streamを使った場合、倍〜倍以上の時間がかかってました。
が、単純な処理での大量ループなので、この結果になったと思われます。（実用する場合は一概に同様の結果にはならないような気がしてます。）
また、初めてのStreamの実装なので、Streamを活かした実装ができてないかもしれません。
可読性については、今回のテストの場合、今までのコードで慣れている人は明らかに`for`文を使ったほうが見やすいとは思いますが、
なれるとStreamを使った構文も一目瞭然で、わかりやすいのかなと感じました。

ちなみに、以下のコードにするとちょっと早くなりました。

```java
	public void sortListAsStream(List<String> list) {
		StringBuilder sb = new StringBuilder();
		list.stream()
				.sorted()
				.forEach(str -> {
					if (!str.startsWith("ぺ")) {
						sb.append(str);
					}
				});
	}
```
```
[time]456(msec)
[time]409(msec)
[time]328(msec)
[time]552(msec)
[time]316(msec)
[time]257(msec)
[time]272(msec)
[time]289(msec)
[time]305(msec)
[time]306(msec)
```
プロ生ちゃん アプリ開発支援プログラムと作ったやつ

こんにちは。
作ったゲームを公開することをappleのデベロッパープログラムの年会費の高さにビビってあきらめていたところ、先日「プロ生ちゃん アプリ開発支援プログラム」なるものを発見し、利用させていただきました。

#プロ生ちゃん アプリ開発支援プログラム

Apple Developer Program の登録料は年間 11,800円。。。

アプリを公開したくても簡単なアプリを趣味で一つか二つ公開するには僕にとっては高すぎる。

しかし、このアプリ開発支援プログラムで、アプリをタダで公開できます。
なんていいサービスなんだ。。

>[iOS アプリを無料で公開しませんか？ 「プロ生ちゃん アプリ開発支援プログラム」のお知らせ](http://pronama.azurewebsites.net/2016/10/12/pronama-chan-developer-support-program/)

流れとしては、プロ生のAppleDeveloperProgramにメンバーとして参加し、アプリを公開させていただきました。

僕以外にもアプリを開発し公開したいけど金銭的な理由で躊躇している人は、たくさんいると思うので、こういったサービスを積極的に利用していくべきです。
#作ったものを少し紹介
~~完璧に~~わかるのはc言語くらいの者ですがなんとかフルコーディングでゲームを作りました。

作ったのはチャリ走系のゲームだけど難しいかも。
でも意外と楽しいと思うので是非。
>[![Icon-20@2x_投稿用.png](https://qiita-image-store.s3.amazonaws.com/0/30101/d631c1f2-e7cf-b7ee-b935-13af84dce3b4.png)]
(https://appsto.re/jp/qNr-fb.i) [Hella Infinity](https://appsto.re/jp/qNr-fb.i)

こんな感じ
![写真 2016-12-11 18 02 46.jpg](https://qiita-image-store.s3.amazonaws.com/0/30101/85719e7b-c2e0-ecbe-e578-733526ce9a2e.jpeg)

ちなみに自分で言うのも恥ずかしいんですがHella Infinityという名前はめっちゃ無限という意味です。割とふざけてつけたのにかっこつけた名前みたいに思われてそうでなんか嫌だな。
GitHub.comとGitLab.comのリポジトリをミラーリングする

[GitLab Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gitlab)の十二日目です。

GitLab.comにはリポジトリを１時間毎に自動でミラーリングする機能があります。
そこで本日は、GitHub.comとGitLab.comのリポジトリをミラーリングする方法を紹介します。

## 概要

GitLab Enterprise Edition(以下EE)には、gitのリポジトリを1時間毎にミラーリングする機能があります。
ミラーリング方式としてgitのpushとpullをサポートしています。そのため、push方式ではGitLabから他のリポジトリにミラーリング、pull方式では他のリポジトリからGitLabのリポジトリにミラーリングすることが出来ます。
なお、ミラーリングにあたり以下を考慮する必要があります。

- 対象のリポジトリは`http://`、`https://`、または`git://`のいずれかでアクセス出来る必要があります。
- 非公開リポジトリの場合は、以下のようにURLに認証情報を含める必要があります。
  - `https://username:password@gitlab.company.com/group/project.git`。ちなみに、2段階認証を有効にしている場合は、パスワードの代わりにパーソナルアクセストークンを使用してください。
- リポジトリのインポートは15分でタイムアウトします。
- Git LFS/Annextオブジェクトは自動的に同期されません。そのため、手動でpush/pullする必要があります。

無料で利用できるGitLab.comは、GitLab EEで動いています。そのため、GitHub.comのミラーリポジトリを無料でGitLab.comに作成することが出来ます。
また、GitLab.comの利用料金については[八日目の私の記事、「GitHub.com・BitBucket.org・GitLab.comの月額料金比較 + α」](http://qiita.com/hiroponz/items/c1ed4d6c10484233bf88)に詳しく書いてあるので、そちらをご参照ください。

## GitHub.com -> GitLab.comのミラーリング方法

それでは、GitHub.comのリポジトリをGitLab.comにミラーリングする手順を解説します。
まずは、普通にGitLabの新規プロジェクトの作成ページに進んで、"Project Name"を入力します。
そして、"Import project from"の"Repo by URL"を選択し、"Git repository URL"にGitHubのリポジトリのURLを入力し、"Mirror repository"にチェックを入れます。
![repository_mirroring_new_project.png](https://qiita-image-store.s3.amazonaws.com/0/20562/da31fa7e-fb3d-528b-4dc2-fa61cad03c0d.png)
あとは、適当に他の設定をして"Create project"をクリックしてください。

また、既存のプロジェクトにミラーリングの設定をする場合は、プロジェクト画面の右上にある歯車アイコンの中にある"Mirror Repository"から同様にして設定することが出来ます。

なお、GitHub.comのリポジトリをGitLab.comにミラーリングして運用する際は、GitLab.com側には直接コミットしないように注意してください。GitLab.com側に手動でコミットしたブランチは、データのロストを避けるために自動同期されなくなります。
つまり、GitHub.com側のリポジトリにだけpushし、GitLab.com側のリポジトリは非常時のpullのみに使用して下さい。

## GitLab.com -> GitHub.comのミラーリング方法

続いて、GitLab.comのリポジトリをGitHub.comにミラーリングする手順を解説します。

もし、GitHub.comで2段階認証を有効にしている場合は、最初に"personal access token"を作成する必要があります。Tokenの作成は、画面右上の"Setting"にある"Developer settings"の"Personal access token"で出来ます。画面右上の"Generate new token"をクリックすると新規Tokenの作成画面が表示されるので、"Token description"に適当な説明を入力し、"Selecet scopes"の"repo"にチェックを入れて"Generate token"をクリックしてください。

続いて、ミラーリングするGitLabプロジェクト画面の右上にある歯車アイコンの中にある"Mirror Repository"からミラーリングの設定を行います。設定は
"Push to remote repository"の"remote mirror repository"にチェックを入れて、"Git repository URL"にGitHubのリポジトリのURLを入力し、"Save changes"をクリックすれば完了です。この"Git repository URL"には、リポジトリにpush権限のあるユーザーとパスワード(2段階認証時はトークン)の情報を含めてください。
![repository_mirroring_push_settings.png](https://qiita-image-store.s3.amazonaws.com/0/20562/d3720125-8962-8d73-55c4-c751f01b02c5.png)
以降は1時間毎にGitLab.comのリポジトリからGitHub.comへのミラーリングが処理が実行されます。

なお、GitLab.comのリポジトリをGitHub.comにミラーリングして運用する際は、GitHub.com側には直接コミットしないように注意してください。GitHub.com側に手動でコミットしたブランチは、データのロストを避けるために自動同期されなくなります。
つまり、GitLab.com側のリポジトリにだけpushし、GitHub.com側のリポジトリは非常時のpullのみに使用して下さい。

## まとめ

このように、GitHub.comとGitLab.comのリポジトリのミラーリングは簡単に設定することが出来ます。
万が一のバックアップとして、重要なリポジトリはGitHub.comとGitLab.comでミラーリングの設定をしておくと良いと思います。
バッファ管理とWAL

データベース内のデータはページ単位でHDD内に配置され、ページ単位でメモリにバッファ及びキャッシュとして複製される。
HDD内のデータにアクセスする際は一旦メモリにページごと複製してからアクセスするわけだが、メモリ内におけるページの量は一般にHDDに置けるページ量より小さい（そうでない前提での話題はまた後日）。

## LRU

どのページをメモリに写し、どのページをHDDに置くかというのは、基本的にディスクアクセスの量を最小化する方向に最適化をする。
その際には**Least Recently Used(LRU)**という方法でキャッシュを管理する事が常套手段である。

それは「一番最近からみて使われた頻度が一番少ないページを解放して、そのメモリ領域を新たなディスクページの為に使いまわす」という戦略である。
具体的な実装方法としては双方向線形リストを使う。

1. 新たにページをメモリに複製した際、双方向線形リストの左端にそのページ情報を保存する
2. ページを参照する際に、双方向線形リストの中にそのページがあれば、リストの左端にそのページ情報を移動する
3. 新たにメモリ領域を空けたい場合はリストの右端のページを開放する

まさに整理術のようである。そして任意のページにアクセスしたい場合に即座に索引できるようにハッシュテーブルを別で用意する。

さて、このLRUにはいくつか問題がある。

- 双方向線形リストを複数のスレッドから触ると壊れるのでシングルスレッド化せざるを得ない
- データベース全体を舐める操作をすると、LRUの中身がDBの後半のページだけで埋まってしまい他のトランザクションが大いに遅くなる事がある

そのためいくつか改良がある…とまで書こうとしたが [Wikipediaにそれなりにまとまっている](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)のでそれを参照して欲しい。

昔のPostgreSQLではLRUを使っていたようだが、最新の実装ではClock-Sweepというアルゴリズムを使っているようだ。
具体的にはクロックという固定長配列を使う。

1. 新たにページをメモリに複製した際、クロックの中からその要素をポインタで指し、カウンタを1にする。
2. ページを参照する際に、クロックの中のポインタがそのページを指していればそのクロックのカウンタを増やす。
3. 新たにメモリ領域を空けたい場合はクロックの数字を1ずつ減らしながら配列をぐるぐる回っていき、最初に0になった場所を新たにそのページ用のクロックとする

このアルゴリズムはLRUの近似でありながら、配列内の数値の増減とポインタの繋ぎ変えでできているのでLRUよりはマルチスレッド用への対応が楽である。
そして「最近使っていなくても良く使っていたページ」のカウント値が高止まりするので、データベース全体を舐めたぐらいで中身が全部吹き飛ぶような事にはなりにくい。

LRUなりClockなりのアルゴリズムでページのメモリへの存在を管理するが、トランザクションの文脈ではこれはもう少し面倒な話になる。ここ以降では話を簡単にするために、キャッシュ管理アルゴリズムに**LRU**を前提とするが他のアルゴリズムでも大した違いは無いと思う。

## WAL

バッファがLRUで管理されるなら、LRUが「開放しろ」と判断したメモリ領域は常にディスクに書き戻した後に開放して良いかというと、ダメである。

LRUが判断して書き戻したデータは、まだコミットされていないトランザクションの更新を含んでいる可能性があるからだ。そんな更新をうっかり書き戻してしまうとどうなるか、トランザクションが走っている状態でそのトランザクションが更新した一部のページを永続化し、電源を落として再起動すると、未コミットのトランザクションが永続化された状態が観測されてしまう。復旧しようにも古いデータは既に書き換えられているのでログから復旧せざるを得ないが、そのためのUndo情報を含んだログはまだ永俗化されていない、そのため過去のログを先頭から実行するぐらいしないと復旧できない。そのまま走らせたら、完了していないトランザクションの途中経過が他のスレッドから見えているのでAtomicityとIsolationに違反してしまう事になる。
それを解決するのが**Write Ahead Logging**である。それはLRUと組み合わせて使い「ログが永続化されるまでページを永続化してはならない」というルールを組み合わせる。

実装レベルではセマフォを使い、トランザクションがページの値を読み書きする際には必ずセマフォを獲得してから行う事にする。これは単純に複数のトランザクションが同時に読み書きする際にデータ構造レベルでの衝突を防ぐが、**2PL**で使うロックと違いアクセスが終わったら即座にセマフォを手放す事でデッドロックを避ける。そしてページを永続化する際はそのページを最後に更新したログが**先に**永続化されたことを確認してから永続化する。

たまに**WAL**の事をジャーナリングや単にlogの事と混同して話す人が居るが、僕の理解では「どの瞬間でもページとログの情報を合わせれば更新前と後の情報が両方ディスク上に載っている」という状態を続けるためのプロトコルが**WAL**である。「LogのWriteがページのWriteよりAheadとなるようにページのWriteを遅らせるプロトコル」であって「ページをWriteする前にログをWriteする事全般」という表現は重要なエッセンスを欠いている。なのでDBの教科書ではよくWALの対義語としてシャドーページが使われる。こちらはあんまりおもしろくないし現代ではあまり実用例も無いので書かない。NVMの時代になったら注目されるかも知れないが。
簡単！ExcelのHTMLテーブル化

Excel原稿テキストにテーブル化したいデータがあるとき、
空タグに原稿テキストを追加したり、原稿テキストにタグを追加するとコピペミスしたり、手間がかかったりしてしまいます。

そこで、Excel原稿テキストを簡単にHTMLテーブル化にする方法を紹介したいと思います。
（10年近く前に教えていただいた方法なのですが、気に入って使い続けています。）

# 使用ツール
- <font color="green">**Dreamweaver**</font>（バージョンはなんでも可）

# 手順

1.Excelデータからテーブル化したい範囲を**選択＆コピー**します。

![1.e.png](https://qiita-image-store.s3.amazonaws.com/0/54595/936bf4b7-7898-5f0f-7d0a-edb06aaaa352.png)

2.<font color="green">**Dreamweaver**</font>を開き、新規作成　→　ページタイプ HTMLを選択します。

![2.e.png](https://qiita-image-store.s3.amazonaws.com/0/54595/ef385547-23ff-5570-cb24-8f127e5c1f20.png)

3.Excelデータからコピーしたデータを**デザインビュー**に貼り付けます。

![3.e.png](https://qiita-image-store.s3.amazonaws.com/0/54595/5a6bf173-aaf7-99af-a3b0-c1de02517b12.png)

4.不要情報を削除し、データを成形します。

4-1.まず、TABLEを選択しやすいようにするため、**拡張テーブルモード**にします。
テーブルを選択・右クリック　→　テーブル　→　拡張テーブルモード

![4.e.png](https://qiita-image-store.s3.amazonaws.com/0/54595/346da0b9-e6fa-d763-bbd0-cd611ef3843f.png)

4-2.テーブル選択し、右クリック、**すべての高さ・幅をクリア**します。

![41.e.png](https://qiita-image-store.s3.amazonaws.com/0/54595/d539e305-d5bb-3a75-d9d0-44e6af402c61.png)

5.ヘッダー（`<th>`）にしたい場合は、セルを選択　→　ヘッダーにチェックを入れます。

![42.png](https://qiita-image-store.s3.amazonaws.com/0/54595/eccb7a32-0cd6-2b55-9e16-942f371fa6df.png)

6.結合したい場合は、セルを選択　→　選択したセルを結合　をクリックします。

![43.png](https://qiita-image-store.s3.amazonaws.com/0/54595/ba1d5643-7437-fd45-6d29-7634d8ac685a.png)

7.必要なソースを該当箇所に挿入して完了です。

基本のマークアップは**Sublime Text**を使っているのですが、
ExcelのHTMLテーブル化**Dreamweaver**を使って成形しています。



# 便利なツール

本記事を作成するにあたり、
ググってみたら様々なツールもあったのでご紹介いたします。

## 1.TAG index - ExcelのHTMLテーブル化フォーム（簡易版）
![tag.png](https://qiita-image-store.s3.amazonaws.com/0/54595/bb201bf7-53ef-186c-445a-c791c04f5cd0.png)

http://www.tagindex.com/tool/excel_simple.html

![TAG2.png](https://qiita-image-store.s3.amazonaws.com/0/54595/69b6e7e1-7735-251c-325c-b05511471755.png)


> セルの結合などは行えないものの、細かい設定もできます。
> ただし、「暗号化通信は行われませんので、非公開の情報などは入力しないようお願いいたします。」との記載があるように、非公開情報を含むものは使わないようにしましょう。

## 2.Tech-Unlimited - Excel to HTML

![Tech-Unlimited.png](https://qiita-image-store.s3.amazonaws.com/0/54595/04a6a415-692b-4baf-0ac1-9fb7d943fdcb.png)


http://tech-unlimited.com/exceltable.html

> こちらのサイトも簡単にExcelデータをHTML化してくれるサイトです。
> こちらも外部サイトではあるので、使用する際は十分注意してください。
旧PHPシステムをRailsにして得た当たり前のようなTips達

#前書き
アドベントカレンダー、子供の頃は毎日12時まで起きてて翌日の分のチョコレートを食べてから寝るのが日課でした。
というのは置いておいて、16卒で入社して古くなったPHPのシステムを約半年間かけてRails5にリニューアルした際に得たTipsを少しまとめたいと思います。


# 開発編
## 作る前に「Gemを探してみる」
あなたが作ろうとしているものが相当特別な何かでない限りは大抵gemに落ちてる。
今回のシステムを作るに際して利用したgem達

* 検索機能
* ドラックドロップでの画像アップローダー
* 表示件数切り替え
* ページネーション
* enumの日本語化
* 項目の検索が可能なセレクトボックス
* DBの値からグラフ作成
* パンくず
* PDF作成
* ログイン機能
* ファイルのzip化
* 祝日を考慮した営業日計算

#２時間かけて実装したコード、CTOは１分で実装してた
少し大きめの機能（作業時間３時間以上）を作る時にはまず設計レビューを受けるようにしています。

```
Step1: システムに現状と理想の状態を思い浮かべてその間にある問題点を明確にする
　　　　　現状＜ー問題点ー＞理想

Step2: 自分なりに問題点を解決可能な手段を考えて聴いてみる
```
自分の知っているやり方、やりなれた方法に頼らず一旦５分時間をとって聞いてみるのは大切です。



頑張って２時間かけて実装した後に、それはこれでも出来るよと言われてgit hubのプルリクを見た時の衝撃は忘れられない。
2時間で200行  => １分で１行


#心構え編
##チーム開発の効率の高さ＝チームのHRTの精神の高さ
HRT「Team geek」で有名ですが。

1. 謙虚(Humility)
2. 尊敬(Respect)
3. 信頼(Trust)

この３つの言葉を指しています。

友人の仕事場の話などでうまく行っていない話を聞くと、その職場の上司にHRTの精神が足りないことが多いです。

正直そのような環境、働きにくいです、むしろHRTがあるだけで後輩が自由に働けます。

そっとこの本を渡しましょう。
http://amzn.asia/cUsSgsS

そしてまずは自分が気をつけてみると周りが変わるはずです。

# DBで感じたことをいくつか
## 長い変数名、短い変数名とかではなく、わかりやすい変数名をつける
実際のサービスの開発をしていて、短い主キーで開発を進めて行くとこうなる。

Aさん　：工場から商品を配送するサービスだからこんな感じに主キーを設定しておこう！

```tex:My_database
TID : Transfer  配送テーブルの主キー
SID : Supplier  工場テーブルの主キー
PID : Product   商品テーブルの主キー
```

上司　　：Statementテーブル用意したい、作っておいて

Aさん   ：了解！、でもSIDすでに使われているから２番目のTを使ってTIDにしよう！

```tex:My_database
TID : Transfer   配送テーブルの主キー
SID : Supplier   工場テーブルの主キー
TID : sTatement  請求テーブルの主キー
PID : Product    商品テーブルの主キー
```

DB構築は担当人数が１人だったため、TIDが重複していることに気づかず、開発が進み、無事闇の誕生。。。

リニューアル時にそのエンジニアが不在、ドキュメントも何もなし、あるのはDBのみで大混乱

もちろん賛否両論あると思いますが、個人的には変に短くてわかりにくくなるくらいであれば、必要な分だけ長くする。

最終的に開発コスト、保守コストが下がるのはどちから考えて一番コストが引くそうな変数名を選ぼうと思います。

## 自由入力の９割型は悪なので極力避けたい。。。
スマートフォンの名前のマスターデータを自由入力にすると
ユーザーは様々なバリエーションを提供してくれます。

```
iPhone5
iPhone５
iPhone 5
iPhone　5
アイフォン５
アイフォーン５
```
旧システムにはiPhoneだけで60種類取り揃えております！

営業：機種ごとの集計システム作って＾＾

僕　：無理です＾＾；；

となるので自由入力を営業に求められてもHRTの精神を持ってお断りいたしましょうm(_ _)m

# 番外編：最近知った運動瞑想睡眠野菜350gの呪縛
* 「運動」　DDRやろう（提案
* 「睡眠」　SleepMister　というアプリ使うと毎朝快適です（IOS）
* 「瞑想」　1分間瞑想または15分の睡眠が効果的です。　
* 「野菜３５０ｇ」　コンビニの1日分の野菜が効率的だと思いました。

最近運動できていないので運動しようと思いますm(_ _)m
Mac / NetBeans で C/C++ TOPPERS/EV3RT の環境を構築する

今年「雪面のトビウオ」チームとしてプライマリクラスに初参加さていただきました。

初期にチーム内で共通で使うIDEとしてNetBeansを選定し、最後まで実装に使っていました。
開発機は、メインでは会社のWindowsノートを使っていたのですが、自宅のMacにも環境構築していたので、その際の手順を共有します。

基本的には Windows での EV3 + Netbeans の環境を構築手順を公開してくださっている以下のページを踏襲しており、内容もほぼ同じものになっています。
ここで御礼申し上げます。
http://naoblo.net/archives/261

環境の細かな違いとポイントがいくつかありますので、 そこを含めて記述して行きます。

最終的にビルドを確認した環境は以下の通りです。
* macOS 10.12.1
* NetBeans 8.1

# 基本的な環境を整える
http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvMac

上記のページを参考に、gcc / mkimage / GNUツールチェーン / cfg をインストールしてください。
Mac で構築する際のポイントとして、この cfg のインストールを忘れがちなので気をつけましょう。
また、Windows と共通で開発するときは、Windows の cfg.exe と競合してしまうので、 cfg を .gitignore に登録していました。

# NetBeans 環境の構築
## NetBenas のインストール
https://netbeans.org/downloads/index.html
プラットフォームで Mac OS X を選択し、 C/C++ 向けのパッケージをダウンロード / インストールします。
<img width="500" alt="スクリーンショット 2016-12-08 23.18.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/26659/7bb3bfda-266b-f879-f6b8-7eaf5bbea406.png">

## NetBeans ビルド環境の設定
メニューの [NetBeans] → [Preferences] → [C/C++] → [ビルド・ツール] でクロスコンパイラを設定します。
ここが一番ハマったのですが、ビルドを成功させるためにベース・ディレクトリにGNUツールチェーンのディレクトリの指定が必要です。

<img width="500" alt="スクリーンショット 2016-12-08 23.13.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/26659/6aeb4ddd-528f-105b-970a-0d5fc3d9cd16.png">

## プロジェクトの作成
1. メニューの [ファイル] → [新規プロジェクト] → カテゴリ [C/C++]、プロジェクト[既存のソースを使用するC/C++プロジェクト]を選択し、次へ

2. 次の通り設定して次へ
 A. [既存のソースフォルダ]をビルド対象のソースファイルが置いてあるフォルダに設定
（例： /Users/username/Documents/dev/etrobo2016）
 B. ツールコレクションを、前の手順で作成した設定を使用するように設定する（例： GNU_1(GNU_MAC)）
 C. [構成モード]をカスタムに設定する。
<img width="500" alt="スクリーンショット 2016-12-09 0.06.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/26659/1ffec34c-8cc9-cfd9-67e6-68d5ad38f625.png">

3. 「事前ビルド・アクション」はデフォルトのままで次へ
4. [作業ディレクトリ]を Makefile が配置されているディレクトリに
(例: /Users/username/Documents/dev/etrobo2016/hrp2/sdk/workspace)
ビルド・オプションを「${MAKE} -f Makefile mod=(モジュール名) PWD=(workspaceのパス) 」に設定し次へ。
(例: ${MAKE} -f Makefile app=etrobo_tr_ex3 PWD=/Users/username/Documents/dev/etrobo2016/hrp2/sdk/workspace)
<img width="500" alt="スクリーンショット 2016-12-09 0.13.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/26659/48eabdf5-e2b6-f852-b07a-51923a8b9ebf.png">

5. 以降は変更なしで次へを押して行き、最後に終了をクリックします。

## ビルドしてみる
メニュー[実行] → [プロジェクト(<プロジェクト名>)をビルド」で Make が走ります。

ビルドに失敗する場合は、Preferences のビルド・ツールの設定か、作成したプロジェクトを右クリック → プロパティで出てくる設定で、一般の「プロジェクトの場所」、ビルドの「ツール・コレクション」、makeの「作業ディレクトリ」「ビルド・コマンド」が設定した値になっているか確認してみてください。

# 最後に
環境構築はさくっと終わらせたいところですが、意外なところで時間がかかったりします。
今後、 Mac で環境構築する方の一助になれば幸いです。

わかりづらいところあるかと思います。気軽にコメントいただければと思います!
Vim 8.0 Advent Calendar 12 日目 連番の生成

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

Vim で連番と言えば今まででも、マクロを使う方法や Vim script を活用する方法などがありましたが、より手軽な方法が追加されました。

## `g<C-a>` `g<C-x>` コマンド

今まではノーマルモードにて `<C-a>` `<C-x>` を実行することで、カーソル位置の数値を増減できましたが、ビジュアルモード中でも同様の操作が可能になりました。

加えて、連番を作り出すための `g<C-a>` `g<C-x>` がビジュアルモードのコマンドに追加されました。

## 使用例

例えば以下のようなバッファがあった場合:

```
1
1
1
1
1
```

2 行目以降をビジュアルモードで選択して、`g<C-a>` を実行すると、以下のようになります。

```
1
2
3
4
5
```

連番を作ることができました。2 行目以降を選択する点に注意してください。

これは見付かった数値に対して、見付かった順に [見付かった回数×count] 分、数値を足します。
例えば `2g<C-a>` を実行すると、以下のようになります。

```
1
3
5
7
9
```

この操作は行指向で、選択範囲の各行で最初に見付かった数値のみを増減させます。また、数値が見付からなかった行はスキップされます。

```
1. これは 1 つ目の項目です。
1. これは 2 つ目の項目であり、
   折り返しが含まれています。
1. この項目にも折り返しが含まれて
   います。3 つ目の項目です。
1. 4 つ目の項目です。
```

このテキストに対して、`<C-v>` で 2 行目から最終行まで矩形選択を行い、`g<C-a>` を実行すると、以下のようになります。

```
1. これは 1 つ目の項目です。
2. これは 2 つ目の項目であり、
   折り返しが含まれています。
3. この項目にも折り返しが含まれて
   います。3 つ目の項目です。
4. 4 つ目の項目です。
```

数値が存在しない行は飛ばされます。
ここで `V` で行単位で選択をしてしまうと、3 つ目の項目の中身が含まれてしまってうまくいかなくなります。

```
1. これは 1 つ目の項目です。
2. これは 2 つ目の項目であり、
   折り返しが含まれています。
3. この項目にも折り返しが含まれて
   います。6 つ目の項目です。
5. 4 つ目の項目です。
```

`'nrformats'` オプションに `alpha` が含まれていれば、アルファベットの増減も可能です。

```
a. ...
a. ...
a. ...
a. ...
a. ...
```

↓

```
a. ...
b. ...
c. ...
d. ...
e. ...
```

`g<C-x>` は数値を減らす点以外は `g<C-a>` と同様に動作します。