OmniAICreator/Qiita-1.07M huggingface dataset:
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１４（閉領域からのポリゴン化アルゴリズム）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　サポート，ラフト，スカート／ブリムモデル等を生成する場面で、閉領域（スライス面）からポリゴン化する必要がありました。
　閉領域は、頂点座標の配列で、順番に稜線を示し、最後に最初の頂点にたどり着く構成です。
　閉領域は、多角形形状であるため、このままでは面（三角ポリゴン）としては扱えない（多のアルゴリズム的に）ので、三角ポリゴン化します。

# ２．アルゴリズム（考え方）
**スライスした閉領域の特性上法線は上向きとなっているため、生成平面がモデル下面とする場合は、面登録時に頂点の順番を入替えます。**

* ３点の場合
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/edbf34f6-9f5d-4104-dd60-d0297c46c63e.jpeg)
　この場合、何もする必要はなく、そのまま三角ポリゴンとして登録する。


* ４点の場合
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/21dd1830-cfd5-1a50-9274-70cd97e04c15.jpeg)
　この場合、P1-P3を結ぶ稜線を追加する。
　これにより、三角ポリゴン２面（P1-P2-P3/P3-P4-P1)として、ポリゴン登録する。


* ５点の場合
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/74342584-5e65-3537-c7d7-4c9852d911a4.jpeg)
　この場合、P1-P3/P1-P4を結ぶ稜線を追加する。
　これにより、三角ポリゴン３面（P1-P2-P3/P3-P4-P1/P4-P5-P1)として、ポリゴン登録する。


　上記法則から基本アルゴリズムを考える。
1. 閉領域の始点(P1)から+2した点(P3)との間に稜線を追加する。
2. P1-P2-P3の三角面を登録し、閉領域からP2を取り除く。
3. 新たな閉領域が頂点３点になるまで、前記を繰り返す。

　ここで注意するのは、下図の様な場合、三角ポリゴンとしては生成できません。
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/91b4886a-5f40-dce2-392f-c2e56622a859.jpeg)

![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/457e0a73-d503-0d7a-3c02-f005c2e7a61b.jpeg)

　生成不可能となるのは、「追加する稜線が、他の稜線とクロスする。」／「生成面の法線が反転する。」場合が考えられます。
　生成不可能となる場合、当該稜線は追加できないので、始点となる点を次へ移します（例：P1→P2)
![キャプチャ6.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/b43a71eb-6e92-cbe7-614c-e243d19e847f.jpeg)
　※この場合、P1/P2がダメでP3から開始。P3-P8が引けなくなり、次はP7が始点となり終了する。
 
# ３．２つの閉領域から生成するには
　下図のような外側と内側の２つの閉領域があり、この間を埋めたポリゴンとする場合、
![キャプチャa.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/3342855d-3ede-58fd-7515-27102dadf488.jpeg)

　下図のように、生成できるポリゴンを見つけ切り離す感じにします。すると残りの部分が閉領域１つとなるので、前記アルゴリズムでポリゴン化していきます。
![キャプチャb.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/f54a9b43-2d8b-9126-196f-ab8928d68985.jpeg)

![キャプチャc.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/5d622c11-771d-515d-f446-de7978a54a55.jpeg)

# ４．おわりに
　本アルゴリズムで生成されるポリゴンは分割がきれいではないです。
　ですがスライスには影響しないため採用しています。
　時間があれば改良したいと考えています。
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１３（スカート／ブリムモデル）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　ターゲットモデル（出力対象となるモデル）以外にも、スライサに必要な要素として、サポート／ラフト／スカート（ブリム）があります。
　ここでは、スカート／ブリムについての説明です。
　スカート／ブリムについては、[其の５](http://qiita.com/isTwt/items/695f7a932d687b711ff1)の３項を参照下さい。

# ２．スカート／ブリムの構造
　スカート／ブリムは、インフィルのない、ループのみで構成されています。

# ３．スカート／ブリムモデルの生成
1. ターゲットモデルの第１層をスライスし、閉領域を求める。
2. 閉領域をパラメータに従い拡大する。（内側の外壁）
3. 閉領域複製し、複製した閉領域をパラメータに従い拡大する。（外側の外壁）
4. 2/3で求めた２つの閉領域をポリゴン化する。
5. 平面ポリゴンからパラメータに従い、垂直方向（下）へ掃引した形状になるように立体化（モデル）する。

* スカート／ブリムはこの後、上へ移動させます。


* 任意のスカート／ブリムモデルは4に相当するSTLファイルとする。
指定されたスカート／ブリムモデルの面の法線を整列（上向きへ）する。
上記の1～4は実施しない。
上記の5は同様に実施。

* 上記１でサポートがある場合、サポートモデルも同様にスライスし、２つの閉領域から全てを含む閉領域を求めます。
* 上記1でラフトを利用する場合、ラフトモデルをスライスします。
* 上記4については[其の１４　閉領域からのポリゴン化アルゴリズム](http://qiita.com/isTwt/items/92874c74fcfcda1e6268)を参照下さい。
* 上記5については[其の１５　平面ポリゴンの立体化アルゴリズム](http://qiita.com/isTwt/items/3d2ee881f92681acda74)を参照下さい。


# ４．スカート／ブリムモデルのスライス
　構成で示したようにインフィル無しのループ形状のみとなります。
　モデルをスライスし、内側の外壁となる閉領域を順次拡大し、経路を取得していき、外側まで繰り返します。

# ５．おまけ
　ユーザ指定形状のスカート／ブリム。
 ![org_sb.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/4669fce3-3ea9-ab1c-7f70-4099a6a7f302.jpeg)
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１２（ラフトモデル）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　ターゲットモデル（出力対象となるモデル）以外にも、スライサに必要な要素として、サポート／ラフト／スカート（ブリム）があります。
　ここでは、ラフトについての説明です。
　ラフトについては、[其の５](http://qiita.com/isTwt/items/695f7a932d687b711ff1)の２項を参照下さい。

　私は、普段利用しているSimplify3Dの生成するラフトが好きです。（あまり利用はしてませんが）
　ラフトの構造はSimplify3Dの生成するラフトを参考にしてます。

# ２．ラフトの構造
　Simplify3Dのラフトを調べたところ下図のような構造になっています。

![キャプチャ0.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/a544a770-d862-48f0-6f38-73f29fd1f224.jpeg)

|層|高さ|幅|間隔|角度|速度|補足|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|１,2| NW*1.250 (0.500) | NW*2.0 (0.80) | NW/0.175 (2.286) | 90度 (X軸並行) | DS*0.25 (6.25) | base/外周有り |
|３| NW*0.940 (0.376) | NW*1.6 (0.64) | NW/0.512 (1.280) | 0度 (Y軸並行) | DS*0.50 (12.5) | base |
|4～| NW*0.555 (0.222) | NW*1.0 (0.40) | NW/0.850 (0.470) | -75度 | DS*0.50 (12.5) |  |
* NW:ノズル径。()内数値はNW=0.4[mm]時の値
* DS:基本速度。()内数値はDS=25[mm/s]時の値
* 補足にbaseとあるものは、この部分だけ無しにすることがパラメータによりできる部分です。

　１，２層は、ゆっくりと間隔の広い太い線で出力し、３層で少し細くなり角度を９０度変えています。
　４層以降は細い線でさらに角度を変えて密集させています。

　第１，２層についてはSimplify3Dでは輪郭となるループが存在しますが、本ソフトでは省略しました。（スカート／ブリムで代用できるので）

![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/eec89cdc-4fa4-fa08-17ad-0e975c41ffbe.jpeg)

第１／２層
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/8351a02b-6f5e-cbbd-97f5-a6272cc98cb4.jpeg)
第３層
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/353841e9-c653-feca-28f9-22e33e67dfd1.jpeg)
第４層
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/3a36327e-535b-f14d-6649-9994ef917619.jpeg)
 
# ３．ラフトモデルの生成
1. ターゲットモデルの第１層をスライスし、閉領域を求める。
2. 閉領域をパラメータに従い拡大する。
3. 閉領域をポリゴン化する。
4. 平面ポリゴンからパラメータに従い、垂直方向（下）へ掃引した形状になるように立体化（モデル）する。
* ラフトはこの後、上へ移動させます。
* ラフトを生成する場合、ターケットモデルはラフトの高さ＋オフセット（パラメータ）分、上方へ移動させます。


* 任意のラフトモデルは3に相当するSTLファイルとする。
指定されたラフトモデルの面の法線を整列（上向きへ）する。
上記の1～3は実施しない。
上記の4は同様に実施。

* 1で求めた閉領域は、ターゲットモデルの接地面形状（平面）となる。
* 2の閉領域の拡大は、そのXのアルゴリズムでパラメータを負数にしたもので行う。
* 3については[其の１４　閉領域からのポリゴン化アルゴリズム](http://qiita.com/isTwt/items/92874c74fcfcda1e6268)を参照下さい。
* 4については[其の１５　平面ポリゴンの立体化アルゴリズム](http://qiita.com/isTwt/items/3d2ee881f92681acda74)を参照下さい。

# ４．ラフトモデルのスライス
　本ソフトでは、全層について、[其の９　インフィルアルゴリズム](http://qiita.com/isTwt/items/55488a133b9f92a4b96b)のみで生成します。
 
# ５．おまけ
　ユーザ指定形状のラフト。
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/6a3ef143-aba2-a595-f478-19ab130e84d3.jpeg)
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１１（サポートモデル）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　ターゲットモデル（出力対象となるモデル）以外にも、スライサに必要な要素として、サポート／ラフト／スカート（ブリム）があります。
　ここでは、サポートについての説明です。
　サポートについては、[其の５](http://qiita.com/isTwt/items/695f7a932d687b711ff1)の４項を参照下さい。

**
本ソフトでのサポートについては、まだ実装途中となります。
このため、現状実装している考えと、今後実装予定の考えを示します。
**

# ２．サポートの構造
　Simplify3Dは「サポートが剥がしやすい」で有名であり、同様のサポート構造として実装しているます。
　サポートは次のような２種の構造であり、１層当たりはインフィルのみで構成されています。

![キャプチャ2.png](https://qiita-image-store.s3.amazonaws.com/0/157557/e7832e06-8ada-d5ce-d927-b4e2b305404c.png)
![キャプチャ1.png](https://qiita-image-store.s3.amazonaws.com/0/157557/051abaf8-753d-250e-9a2e-eaec9e2932e7.png)

# ３．サポートモデルの生成
　自動生成するための準備として、ターゲットモデルを読み込む段階で全ての面に対しサポート対象か否かを判断しておきます。

* 通常スライサーは、ユーザがサポートの出来具合を見ながら、任意に対象面となる角度を指定できる対話形式ですが、本ソフトはコマンドライン型であるため、上記のように最初から対象面を判断しています。

　対象となる面をX/Y平面(Z=0)へ平行投影し、対象面と投影面からモデルを生成します。（密集サポートを行う場合、ここでサポートモデルから上面モデルも生成します。）

![キャプチャ3.png](https://qiita-image-store.s3.amazonaws.com/0/157557/174d53d5-c9dd-2b5a-1ce4-1b1293bb7a3f.png)

* 上記のようにベッド面(Z=0)へ垂直なサポートを生成するため、その間にモデルの別部分が存在すると正常な生成になりません。（投影時、モデルの別の部分へあたる場合はその面までとして、生成したいところです。）
* ただし、部分的に投影出来ない場所も考えられるため、現状良いアルゴリズムが浮かんでいない状況です。

* 現状サポートモデルをファイル指定可能であることから、サポートの自動生成機能は現状のまま保留としています。

* 対象面からのモデルの生成については、[其の１５](http://qiita.com/isTwt/items/3d2ee881f92681acda74)を参照下さい。

# ４．サポートモデルのスライス
　構成で示したように、サポートはインフィルのみで構成されています。
　このため、アルゴリズムは[其の９　インフィルアルゴリズム](http://qiita.com/isTwt/items/55488a133b9f92a4b96b)で、以下のようなパラメータで行っています。

|種類|充填率|角度|
|:--:|:--:|:--:|
|通常|専用パラメータ(30%など)|0度(Y軸並行)|
|密集|専用パラメータ(70%など)|90度(X軸並行)|

# ５．おわりに
　サポートモデルのスライス自体は大丈夫だと思いますが、自動生成にはまだまだ課題があります。
 　対話型のGUIを作成するときにも、使いやすいインタフェースで良質なサポート生成ができることを考えなくてはと思います。
　スライサーソフトを選ぶ基準にもなる部分でもあり、今後改良を行っていきたいです。
courseraについて

外人が大好きなcoursera。オンラインで大学～大学院レベルの授業を学べるサイト(MOOC)の草分けです。
# なぜcourseraか
意外とタダで受講できるコースが多いのです。修了証明は$80ほどのお金がかかります。英語は確かに高いハードルだけど、字幕もあるのでなんとかなるし、英語の勉強にもなる。
### 日本のMOOCとの比較
日本にもJMOOCがあります。技術系ならドットインストールなども有名です。どうせならよく分からない英語より母国語の日本語で受けたい。そうです。その通りです。

ですが、日本語MOOCには以下の問題点があるのです。

１）数が少ない
２）内容が浅い
３）定番物（Javaなど）や有名人教授など集金に繋がりそうな講座が多い → ビジネスだから仕方ないけど

これでは本当の学び舎と言えないのではないでしょうか。唯一よさそうなのは技術系基礎科目シリーズでしょうか。

一方courseraでは本当の学問を学べるのです。
# どんな科目が揃っているのか。
技術系、理工系、人文系、芸術系、社会人系、自己成長系などの科目が揃っています。
### 技術系
初めてのPythonといったライトなものからビッグデータ分析・人工知能といった流行り物、はてはGPUを使った分散プログラミングのようなコアなものまで一番豊富です。RubyはあるのにPHPは無いのは、あまりに実務寄りだから？ 関数型言語では残念ながらHaskellはないけどScalaとMLの講座があります。
### 理学系
数学（解析、代数、幾何など）、物理（力学、電磁気、量子論など）といった基礎理学系からゲーム理論、グラフ理論などの応用、Arudino工作・３Dプリンターの使い方といったものも。
### 人文系
文学、歴史、心理学、哲学、倫理学、法律政治経済など。ノルウェーの先生が「エッダを紐解く」という講座を教えていたりします。人間としての幅が広がりそうです。
### 芸術系
美術、音楽など。それぞれの歴史、理論から自分で描作画・作曲するためのカリキュラムまで取り揃えている。聖書や宗教との関連について学べる講座もあり奥の深い世界です。絵をかけるようになりたい。
### 社会人系
MBAで学べるようなマーケティングや会計、プロマネの技術や金融工学や株トレードなどなど。英語圏のビジネスマンを対象としているだけ合って、グループディスカッションや小論の提出が必要となる。なので相当英語が読み書きできないときつい。
### 自己成長系
英語スキル向上といった定番から、対人コミュニケーション、栄養学にダイエット、親御さん向けには子供との向き合い方などといったものもあります。頑張りやさん向け。
# 結論
学問は役に立つことを前提に開始してはいけません。そのスタンスだと多分長続きしません。学びたいから学ぶのです。やりたいからやるのです。やりたいことをやる時本当の集中力と持続力が発揮され、多少の苦労は乗り越えられる、と僕は信じてます。

というわけで、英語辛いけど頑張ろう。

# 追記
１．日本のMOOCの一つ[manavee](https://manavee.com/)は良さそうですね。高校生の学科ならここかも。と思ったら2017/3/31で運営終了とは……残念です。
Vue.jsをTypescriptベースで使うテンプレ作った

vue.jsをTypescriptで使う（自分用）のテンプレを作ったので紹介.

vue.jsをTypescriptで使ってる人居るのか分からないけど、IDEの補完がごりごり効いて便利なのでvue.jsでSPA作るなら私は使っていきたいです.
vue.jsをゴリゴリ使う人がいたら使い物になるかも？

vue-cliで引いてこれるようにしようかとも思ったんですが、自分向けのカスタマイズがたくさん入ってるのでやめて別に作りました.

# Github
[レポジトリ](https://github.com/namazu510/vue-vuex-typescript-skeleton)

# 入ってる物
* vue.js(2系)
* vuex
* vue-router
* vuex-router-sync
* Typescript + tslint
* vue-class-component
* pug
* postcss(auto-prefixer)
* karma + jasmine

# 機能
* vuejs+vuex+routerでSPA作る時のテンプレ
* pugとかpostcssとか
* auto-reload , hotswap
* unittest
* circle ci(lint + unittest)
* Dockerでささっと起動できる


# 今後足せたらなって機能
* github-pagesへのdeploy機能
* nightwatchでe2eテスト+ circleciで自動e2eテスト
* preRender or SSR
OS X > 同じ大きさのTerminalを複製する手順

```txt:動作環境
OS X El Capitan
```

関連 http://qiita.com/7of9/items/deb6c29224ad08c17a0a

同じ大きさのTerminalを用意したくなった。
デフォルトのWidth設定などできるが、一時的にだけ使いたいWidthなので、却下。

Terminalを弄りながら、以下の手順とした。

1. 表示 > タブバーを表示
  - タブバーが表示される
2. Terminalのサイズを調整する
3. タブバーにて「+」を押して、タブを複製する
4. 複製したタブをドラッグして、ウィンドウ外に置いてタブから切り離す
5. ３,4の手順を繰り返す

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a4283531-128c-81b3-19fd-46c83f6a43cd.png)
banner command > サイズを指定する > banner -w 48 7of9 | Ubuntu 16.04 LTS用のコマンドには対応するオプションはない

```txt:動作環境
OS X El Capitan
```

7of9（か他の文字列)を大きく表示して、画像キャプチャしようとしていた。

Markdownで大きな文字を出そうとしたが、失敗。
htmlで大きな文字を出そうとしたが、失敗。

bannerコマンドを思い出した。

`banner 7of9`では画面に入り切らない大きさになった。

man bannerで確認した所、以下のコマンドで適度な大きさの文字がキャプチャできた。

```
$banner -w 48 7of9
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/217a5a7a-f0f3-bbc5-d080-d45633d590bd.png)

上記の画像を貼り付けて、Sketchup Make 2017で作成中のもの。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/32328f8c-e74d-723e-cd5e-97ed252631a6.png)

### Ubuntu 16.04 LTS
(追記 2018/01/17)

Ubunt 16.04 LTSのBannerでは上記のオプションが用意されていないようだ。

```txt:run
$ banner -w 30 OK

         #    #
         #    #
 #####   #    #
         # ## #
         ##  ##
         #    #

 #####    ###
#     #  #   #
      # # #   #
 #####  #  #  #
      # #   # #
#     #  #   #
 #####    ###

####### #    #
#     # #   #
#     # #  #
#     # ###
#     # #  #
#     # #   #
####### #    #
```
Pentaho Data Integration メモ

[Webページのスクレイピングと分析・可視化](http://qiita.com/shiumachi/items/82a13f29933539c69e32)で使用したJava製ETLツール[Pentaho Data Integration](http://community.pentaho.com/projects/data-integration/)(以下PDI)について覚えたことについて記載する。
本記事はメモ程度の内容であり、情報の正確性については保証しない。必ず公式ドキュメントを参照すること。

![PDIのデータ変換フローの一例.png](https://qiita-image-store.s3.amazonaws.com/0/17749/ba6cc836-446c-643d-b03a-db8db558276b.png)


# データ変換の流れ

**新規** → **データ変換** を選択。ジョブは今回は使っていない。
PDIのデザインメニューの項目は種類が多いが、実際に使うものは**入力**、**変換**、**出力**、**結合**くらいで、あとはたまに**フロー**や**スクリプト**を使う程度である。

![PDIのデザインメニュー.png](https://qiita-image-store.s3.amazonaws.com/0/17749/275374c6-10e4-346f-516a-cc50c4ddee31.png)


# 基本的な使い方


## 処理の追加

デザインメニューから追加したい処理をダブルクリックするだけで追加できる。
もし既に設置したアイコンを選択した状態でダブルクリックすると、選択状態のアイコンと自動的に接続した状態で追加してくれる。

![PDI アイコン追加.png](https://qiita-image-store.s3.amazonaws.com/0/17749/b95ef6a0-eab7-be87-de0d-14aa31452dd6.png)


## データフローの接続

アイコンを中クリックすると、接続の矢印を伸ばすことができる。この矢印を伸ばした状態で別のアイコンをクリックすると、新しいデータフローを作成することができる。
接続した線を左クリックするとそのフローを一時的に無効化することが可能。右クリックで*削除*を選択すれば、接続を削除できる。


## プレビュー

アイコンを右クリックしてプレビューを選択すると、そのアイコンまでの処理時点での結果をプレビューすることができる。デフォルトは最初の100件のみ読み込むが、特定の条件に合致するレコードが出力されるまでデータを読み続けることができる。


# 個別のアイコンの説明


## 入力


### CSV入力

CSVファイルを読み込む。**フィールドを取得**を選択すると、自動的にフィールド名や型情報を取得してくれる。


### JSON 入力

PDI7 時点では**入力**ではなく**Input**に含まれている。
自動でフィールド情報を読み込んでくれず、[JsonPath](http://goessner.net/articles/JsonPath/)形式でスキーマ定義を与えてあげる必要があるため非常に面倒な上、一定の形式のJSONしか読み込むことができない。たとえば、 [はてなブックマークAPI](http://b.hatena.ne.jp/help/entry/api)のはてなブックマーク件数取得APIは`<個別url>: <個別カウント>`というJSON形式で返すが、JsonPathでは任意のキーの一覧を取得することができない。このような場合は、PDIの外で別途パースしてCSVに変換するか、PDIが読めるようなJSON形式に変換する必要がある。


## 変換

### シーケンス追加

シーケンス番号を追加する。ユニークIDの付加に使える。**シーケンスカウンタ名**が実際に追加されるカラム名だが、それとは別に内部カウンタの**カウンタ名**という項目がある。このカウンタ名はデータ変換処理内で共通の変数として扱われるため、異なる2箇所で同じカウンタ名を使った場合、それらが生成する値は互いに異なるものとなる。通常ユニークIDの生成は独立して行うものであるので、カウンタ名はユニークなものを使う方がいいと思う。


### 定数追加

新しいカラムを作成し、それら全てに同じ値を追加する。今回はサービスIDの追加に使った(Qiitaは1、Adventarは2と決めて設計していたため)。


### 文字列オペレーション

トリムやパディングなどを行う。正規表現による処理は文字列オペレーションではなく、**スクリプト**→**正規表現**なので注意すること。


### 行整列

日本語訳が少し変だが、要するにソートのことである。


### 計算

アイコンが電卓なので単なる四則計算程度に思うかもしれないが、日付計算から改行コード削除、果てはレーベンシュタイン距離の計算までやってくれる超多機能アイコン。

![Pentahoの計算ステップ.png](https://qiita-image-store.s3.amazonaws.com/0/17749/4d390847-6ed1-49b3-cf79-fc34f08ffdd2.png)


### 選択/名前変更

必要なカラムを選択したり、名前を変更したりする。JOINを行うなどのときに不要なカラムが大量に増えるため、随時整理した方が見通しがよくなる。


### 重複行削除

名前の通り、重複行を削除する。前段でソートを実施することを忘れずに。


## フロー


### フィルター

特定条件でデータをフィルタする。条件のTRUE/FALSEで分岐可能。


## 結合


### マージ結合

2つのフローをJOINする。INNER / LEFT OUTER / RIGHT OUTER / FULL OUTER を選択することが可能。


## 出力


### テキストファイル出力

CSV形式で出力にはこの処理を選択する。
この処理内で出力するカラムを選択することができるが、出力直前の、すなわち完成されたデータは別の処理に流用する場合が多いので、直前に **選択/名前変更**処理を行って、そこでカラムの調整を行い、出力時には単に**フィールドを取得する**で取得した内容をそのまま出力するだけの方がいい。


# その他

## ステップ間のレコード数

上部メニューの**編集** → **設定** でデータ変換プロパティを表示し、**その他** タブをクリックすると、**ステップ間のレコード数** というプロパティがある。これが1ステップで取り扱う行数の上限となる。デフォルトは10000。
これは、10000行以上同時に読み込むことが必要な処理は実行できないことを意味する。特にJOINを行う場合は致命的となる。利用可能なメモリ量を見つつ、必要な分だけ増加させること。
マインドマップエディタ coggle のはじめかた

# tl;dr

* coggleはいいぞ
    * google driveに保存すれば、
        * リアルタイム共同編集
        * privateファイル数は無制限
    * PDF、PNG、テキストダンプ、mm形式、でエクスポートできる
    * というのが無料でできる
* この記事は
    * coggleにサインアップして、googleドライブで新規作成できるようにする

# coggleにサインアップ

https://coggle.it

![b4f0ec93-ba39-c7ea-04d4-699dd561fc62.png](https://qiita-image-store.s3.amazonaws.com/0/22947/98c54d6f-6e84-55a7-ca6a-c6f6ba644c0c.png)

Googleアカウントで認証。

![範囲を選択_014.png](https://qiita-image-store.s3.amazonaws.com/0/22947/a564d3df-45c1-d016-f153-3dff980ba934.png)

coggleに戻ると、プラン選択を迫られます。Freeで始めるので、右上の「x」。

![範囲を選択_015.png](https://qiita-image-store.s3.amazonaws.com/0/22947/b9ed9707-8ddf-0638-c6fe-941e4fcb998c.png)

# google driveに保存できるようにする

左上の、自分の名前をクリックして、「Link Google Drive」

![範囲を選択_017.png](https://qiita-image-store.s3.amazonaws.com/0/22947/5850ef37-fa39-ab51-1d95-2c7d35c5e4f7.png)

![範囲を選択_018.png](https://qiita-image-store.s3.amazonaws.com/0/22947/8b064e2c-a64e-9765-f364-a4f55c534d2c.png)

# google driveで、coggleファイルを新規作成できるようにする

https://drive.google.com

新規 -> その他 -> アプリを追加
![範囲を選択_019.png](https://qiita-image-store.s3.amazonaws.com/0/22947/1613f041-5d2c-4191-4d4d-e6567dd6e222.png)

検索ワードは「coggle」。でてきたcoggleを新規追加。
![範囲を選択_020.png](https://qiita-image-store.s3.amazonaws.com/0/22947/279582c7-87c7-3198-ebe6-f5087f02e2fc.png)

新規 -> その他 -> coggle で、coggleファイルを作成できるようになります。

![範囲を選択_022.png](https://qiita-image-store.s3.amazonaws.com/0/22947/99e3ba48-7c03-3e57-b24a-706ee98220bb.png)

# coggleファイルを共有して、共同編集

Googleドライブで、ファイルを右クリック -> 共有

![範囲を選択_023.png](https://qiita-image-store.s3.amazonaws.com/0/22947/e321d722-e74e-15dc-69f1-aeff272be1de.png)

# 注意点

* googleドライブに保存するなら、googleドライブのファイルの共有設定で、アクセス制限できる
    * 自分だけ見える、保存したフォルダの設定に準拠する、などなど
* googleドライブに保存しないと、課金プランの設定に応じて、知らない間に世界公開される

# つかいかた

* https://www.youtube.com/watch?v=YC4O4vb7IXo
* https://www.youtube.com/watch?v=99VswRkMyW4
UbuntuでNICを認識しない場合の対処法

自宅のデスクトップPCをWindows10とUbuntu14.04のデュアルブートにしています
時々Ubuntu側でNICを認識しなくなってしまうことがあります
原因ははっきりとわかっていませんが，ソフトウェアアップデートをかけた時になることが多い気がします
そんな時に自分は以下の対処法をとっています


#症状
ifconfigを打ち込んでもloのみが表示されてしまう
/etc/network/interfacesの内容も特に問題無し

#原因
NICドライバがない（最初から入っていないor消えてしまっている）

#対処
どこのNICを使っているかチェック

```
$ lspci | grep 'Ethernet\|Network'
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V (rev 31)
```

自分の場合はIntelだったので、以下のURLからドライバを入手しました
有線：https://downloadcenter.intel.com/download/15817
無線：http://www.intel.com/content/www/us/en/support/network-and-i-o/wireless-networking/000005511.html
今回は有線の3.3.4を選択

そして、解凍したら
e1000e-3.3.4/src/ に移動し、

```
$ sudo make install
$ sudo modprobe -r e1000e
$ sudo modprobe e1000e
```

を実行

すると、NICが認識されます。

ネットワークに繋がっていないとそもそもサイトからダウンロードできないので、別のマシンから入手してUSBメモリとかで移してあげればいいでしょう。
ドライバの最新版を常にローカルに置いておいてあげると安心できます。

#参考
UbuntuでNICを認識しない場合の対応
http://rainbowdevil.jp/?p=1164

ほぼ、このブログのままです
Windows仮想ディスクをバッチで一発作成／削除

#概説
Windows仮想ディスクファイル(VHD)をコマンドラインなどからバッチ作成する方法です。
VHDの利用目的はHyper-Vなど色々ありますが、一時的な作業領域を確保するのに有効と思われます。
特にdismコマンドのような怪しいフォルダ構造を作るツールを扱う場合、VHD上で作業することで作業に失敗してもファイルシステムの汚染を避けられ便利です。
（※たとえ階層構造やACLがおかしくなっても、VHDファイル毎処分してしまえばなかった事に。）

#構文
##VHD作成
```bat:mak_vhd.bat
REM VHDに割り当てるドライブレター(任意)
SET VDRIVE=K
REM VHDファイルのパス(基本変更不要ですが%TEMP%の空きが危ない場合は別のパスを明示指定したほうが良いです)
SET VFILE=%TEMP%\VF_%VDRIVE%.VHD

REM VHD作成--------------
(
echo create vdisk file="%VFILE%" maximum=65536 type=expandable
echo select vdisk file="%VFILE%"
echo attach vdisk
echo clean
echo create partition primary
echo format fs=ntfs quick
echo assign letter=%VDRIVE%
)|diskpart
```
##VHD削除
```bat:del_vhd.bat
REM VHDに割り当てるドライブレター(任意)
SET VDRIVE=K
REM VHDファイルのパス(基本変更不要ですが%TEMP%の空きが危ない場合は別のパスを明示指定したほうが良いです)
SET VFILE=%TEMP%\VF_%VDRIVE%.VHD

REM VHD削除--------------
(
echo select vdisk file="%VFILE%"
echo detach vdisk
)|diskpart
rem VHDを再利用するなら↓構文を無効化してください。
del /q "%VFILE%"
```
上記の作成用構文を組み合わせて使うのであれば、削除側のSETコマンドは不要です。

#補足
###diskpartについて
vhdの制御はdiskpartコマンドを利用します。
diskpartのリファレンス https://technet.microsoft.com/ja-jp/library/cc766465(v=ws.10).aspx
（しかし…肝心の仮想ディスクの説明がない…help等を見るのが無難かも）

###カッコを使った構文について
括弧を使うとbash等のヒアドキュメント風にコマンドをスクリプトに埋め込めます。
詳細は拙作記事「[Windowsコマンドラインにおける括弧の活用](http://qiita.com/DEV-DEBU/items/686cfa0e6564fb7ce69d)」を参照ください。
MATLABで音声信号の簡単なフィルター処理

# はじめに
先日、授業でMATLABを使って簡単な信号処理を行う演習があったのですが、公式以外で参考になる記事があまり見当たらなかったので備忘録がてらまとめておこうと思います。この記事では、ローパスフィルタのMATLAB実装のコードを載せています。

# 開発環境
- Windows 10（64bit）
- MATLAB R2015b（64bit）

# ローパスフィルタ
ローパスフィルタとは、特定の周波数以上の信号の成分を低減させるためのフィルタです。詳細は[Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%91%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF)を見てください。
このフィルタは一定以上の周波数成分をカットすることができるのです。逆に言うと、どの周波数以上をカットするのかこちら側で決める必要があります。
どうやって決めるかですが、私の知る方法では（他にも良い方法があるかもしれません）信号をフーリエ変換してパワースペクトルのプロットから決定することが多いように思います。他には、信号の特徴（この信号はある周波数帯域に存在するとか）が分かっているときはその情報を使ったりします。以下、パワースペクトルをプロットする自作関数のコードです。

```matlab:power_spectrum.m
%% フーリエ変換　→　パワースペクトル表示
% signal: 入力信号
% Fs    : サンプリング周波数
% TITLE : プロットに表示するタイトル
function powerSpectrum(signal, Fs, TITLE)
% 信号の長さを取得
L = length(signal);
% L点の離散フーリエ変換（目的次第で第2引数の入力を変更）
Y = fft(signal,L);
% パワーの計算
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;

% パワースペクトルをプロット
figure('Name',TITLE,'NumberTitle','off')
plot(f,P1)
T = ['Signal-Sided Amplitude Spectrum of audio ' TITLE];
title(T)
xlabel('f (Hz)')
ylabel('|P1(f)|')
end
```

この関数を用いて、適当な音声信号をプロットすると次の左の図のようになります。

| 処理前 | 処理後 |
|:-:|:-:|
|![power_spectrum.png](https://qiita-image-store.s3.amazonaws.com/0/146858/00cab9b3-fe00-c737-85db-4dc551df61af.png "Power Spectrum")|![filtered_power_spectrum.png](https://qiita-image-store.s3.amazonaws.com/0/146858/03e887ed-a486-93aa-cc5a-85eed797cdba.png "Filtered Power Spectrum")|

これを見ると明らかに5000Hzにノイズが入力されているのが分かります。これは作為的に作ったデータなので綺麗に5000Hzにだけノイズが入ってますが、普通はこんなプロットになることはないです。
さて、これでカットする必要のある周波数が分かったので、さっそくフィルタをかけていきます。以下、カットオフ周波数を指定してフィルタをかけ、処理後のデータを返してくれる自作関数のコードです。フィルタの性能も表示されます。ここでは、MATLABの標準関数で実装したので、[butter](http://jp.mathworks.com/help/signal/ref/butter.html)関数を使用していますが、DSP System Toolboxが入っている場合は[fdesign.lowpass](http://jp.mathworks.com/help/dsp/ref/fdesign.lowpass.html)という関数が既にあるので、こちらを使った方が次数でフィルタ設計するよりも狙ったフィルタ設計ができると思います。

```matlab:lowpass.m
%% ローパスフィルタ
% 出力
% ret   : フィルタ処理後の信号データ
% 入力
% dataIn: 入力信号
% Fs    : サンプリング周期
% Fc    : カットオフ周波数
% order : フィルタの次数（大きいほど理想のフィルタに近づく）
function ret = lowpass(dataIn,Fs,Fc,order)
% フィルタ設計
% 
[b,a] = butter(order,Fc/Fs*2,'low');
freqz(b,a)
ret = filtfilt(b,a,dataIn);
end
```

フィルタをかけると処理後の結果が得られ、5000Hzの成分がちゃんとカットされていることが確認できます。音声信号の場合は、[sound](http://jp.mathworks.com/help/matlab/ref/sound.html)関数で音を聴いて確認もできますね。ちゃんとキーンとする高周波の音は除去されてました。
今回作成した自作の関数を用いたサンプルコードも載せておきます。適当に4000Hzをカットオフ周波数としています。

```matlab:audio_filter.m
%% 音声信号処理
% filename : 音声ファイルの名前
function audio_filter(filename)
close all;

[audio_data,Fs] = audioread(filename);

% パワースペクトル表示
powerSpectrum(audio_data,Fs,filename);

% ローパスフィルタ
filtered_audio_data = lowpass(audio_data,Fs,4000,100);
sound(filtered_audio_data,Fs)

powerSpectrum(filtered_audio_data,Fs_sine,['filtered' filename]);

end
```

butter関数を用いたハイパスフィルタとバターワースフィルタの設計もlowpass.mの引数パラメータを少し変えるだけでできるので、参考にしてください。
「新年抱負会」参加メモ 関西フロントエンドUG 2017/01/14

https://kfug.connpass.com/event/47301/

2017年最初のKFUG勉強会。
振り返ったり、これからを考えたり、色んな話がありました。

## 2017 年 絶ちたい悪癖(バッドノウハウ)
後藤知宏 さん
> いい加減2017年なので、いろんなところでそろそろ卒業したいなぁ…という所の技術周りを 棚卸ししつつ、みなさんが今どんな技術を使っているのか聞いてみたいと思います。

### POINT
- 2016年は変化が少なかった
- webpack2系の登場（beta）
- パッケージマネージャー「Yarn」の登場
- 一方でいくつか聞かなくなったものもありました……
- XHRライブラリどうなるか
- jadeがpugになったのは大変だった
- Node 6 リリースしたのに、AWS Lambda が Node 4 対応

## そろそろテスト書いて仕事を楽にしたい
岡本秀高 さん
> BehatとかCucumber.jsとかESlintとか、動作確認を楽するためにテストとリントをはじめてみた話を。

https://speakerdeck.com/hideokamoto/tesutotokarintowojin-nian-hawan-zhang-rimasutoiuhua

### POINT
- ミスやコードの癖、バグで予想外の時間がかかる
- テストを書くことは効率化につながる
- テスト対象を考える（E2Eテスト、lint、ユニットテスト）
- E2Eテストはいちばんやりたい、ユニットテストは導入に躓いた経験。。
- BDD、振る舞いをテストとして定義し、それに沿って開発する考え方もある。
- lintはTypoをつぶし、コードの癖を抑制し、プルリクマージしやすくなるので良い。

## そろそろ真面目にWebフロントエンド開発をやる
おのうえ ( @_likr ) さん
> 真面目なWebフロントエンド開発の話をします。

https://speakerdeck.com/likr/sorosorozhen-mian-mu-ni-webhurontoendokai-fa-woyaru

### POINT
- SPA (Single Page App) は必要に応じて使う。
- [Progressive Web App Checklist](https://developers.google.com/web/progressive-web-apps/checklist) は非SPA含め良いWebサイトの指針になる
- 2017はPWAを目指そう（ただし、目的では無く手段として）
- PWAの近道はSPA化
- PWAでできること（オフライン、プッシュ通知、段階的なアプリ化）
- Service Worker（Webページとは独立してスクリプトを動作）
- HTTPSは標準に。Service Worker でも必須。
- パフォーマンスの指針 [Rail Performance Model](https://developers.google.com/web/fundamentals/performance/rail)
- SPAが苦手なSEOやOGPはプリレンダリングで対応 ([Prerender.io](https://prerender.io/))

## まちづくりしてる人のWEB論
榊原昌彦 さん

- これまでの経験を多く語っていただきました
- IT(Web)は目的として扱われることがある
- あくまで何かをするための「手段」である事を間違えてはいけない

## 今年やること
ショウノシオリ さん
> 「抱負」を掲げて正直達成した試しがないので、毎日少しずつやることを宣言する。

- ITパスポート合格（ITに縁の無い生活から仕事を始めたので基本を押さえたい）
- ジャズセッション（初心者向けセッションに参加、ジャズバーにいってみる）
- スペイン語（スペイン人の友達と喋りたい、英語以外の言語を学ぶことで英語に対する理解が深まる）
- 良いエンジニアになりたい

良いエンジニアとは

- コミュニケーション能力のある人
- タスクを上手にこなせる
- 基本的なプログラミング周りの概念、知識がしっかり身についている
- 新しい技術に対して積極的にキャッチアップ

## LT

### 2017年の抱負 - もりてつ さん

- flexboxをつかっていきたい

### デバイスとインターフェース - uki_mito さん

- OculusとかHololensの登場、webはどうなるのか。
- 数学がよく出てくるので勉強したい。

### 選択と集中と運動 - 小渕周 さん

https://speakerdeck.com/shukob/guan-xi-hurontoendoug2017nian-xin-nian-bao-fu-hui-xuan-ze-toji-zhong-toyun-dong

- ノウハウコレクターではなく戦略的マネタイズを実践
- 積ん読をやめて良書一冊を深く究める
- 「元気があれば何でも出来る」→ 元気な状態を維持するの大変
- 運動、筋トレ、運動すれば意欲もわいてくる

### 努力のやり方の話 - Yasui Risa さん

- とりあえずやってみて冷静になった
- 考える、分析する
- 目的を考えてみる←どんな自分になりたいか←素敵だと想う人分析
- 行動を決める 何が足りないのか 行動の選択肢をたくさん出す。本当に必要なことは何か
- とりあえずやってみる　←サイクルになった！

↑ PDCAサイクルになっていた。

- やってみる勢いも大事 まずは始めるところから。
- 行動だけじゃなく、考える事も努力
- より良い改善のため、PDCAのサイクルを取り入れる

### デザイナーとのコミニケーション - 中谷和貴 さん

コミュニケーションで心がけるとこ

- 具体化細分化（多角的視点でデザイナの言いたいことを聞く）
- 配慮（相手のステータスを気にかける、いま話しかけて大丈夫か）
- 意識（お互い見えていることが違うという前提）

デザイナさんもエンジニアも良い物を作る気持ちは同じ。

### そろそろ真面目に体調のことを考える - シマキョウスケ さん

- Standard.js
- TravisCI
Rails 画像保存 -carrierwave導入方法 with form_tag-

##導入
[参考](http://morizyun.github.io/blog/carrierwave-image-uploader-rails/)

前提として、画像保存用のカラムを用意してあること
カラムの型は`String`または`text`

```Gemfile
gem 'carrierwave'
gem 'rmagick'
```
`rmagick`でエラーが出たら

```terminal.app
brew install imagemagick
```
次にuploaderを作成する

```terminal.app
rails g uploader Image #Imageのところは任意の名前,大文字で
```
先ほどのImageというように命名したとおりのuploader,ここでは,image_uploader.rbというようなuploaderが作られてるはず
次に画像のリサイズなどを記述する

```image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  storage :file

  process convert: 'jpg'

  # 保存するディレクトリ名
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # thumb バージョン(width 400px x height 200px)
  version :thumb do
    process :resize_to_fit => [400, 200]
  end

  # 許可する画像の拡張子
  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # 変換したファイルのファイル名の規則
  def filename
    "#{Time.now.strftime('%Y%m%d%H%M%S')}.jpg" if original_filename.present?
  end
end
```
画像保存用のカラムと関連付けする

```任意のモデル.rb
mount_uploader :image, ImageUploader#ここではImageuploader
```
form_forだと:multipart => true が必要ないそう



```form.html.erb
      <%= form_tag words_path, method: :create,:multipart => true do %>
        <%= fields_for "words[]", @words ,index:nil do |f| %>
            <%= f.label :image,"ホーム画像" %>
            <%= f.file_field :image,class: 'form_control'%>
        <%= submit_tag '完了',class: "btn btn-primary"  %>
        <%end%>
      <% end %>
```
表示する

```show.html.erb
<%= image_tag @word.image_url(:thumb).to_s %>
```

**注意**
link_to image_tagで画像にリンクをつけたい時に`image_tag()`にしないといけない、それだけでなく(画像の処理の間にスペースを入れてもいけない

```index.html.erb
 <%= link_to image_tag(word.image_url(:thumb).to_s),word %>
```
##最後に
form_tagを使って書く方法が圧倒的にform_forを使う情報に比べ少ないので書いた
質問あればよろしくお願いします。
Elixir で FizzBuzz やってみた

私の周りで Elixir が何かと話題だったので、FizzBuzz を書いてみた。

コマンドライン引数を受け取るとかは一旦やらない。

なんとなく if に頼らずに書いてみました。

Elixir 的に好ましい書き方なのかはわかりませんが。

## ソース

```elixir:fizz_buzz.ex
defmodule FizzBuzz do
  def fizzbuzz(max) do
    exec(Enum.to_list 1..max)
  end

  defp exec(nums) when nums == [] do
    nil
  end

  defp exec(nums) do
    [head | tail] = nums
    print(head)
    exec(tail)
  end

  defp print(n) do
    cond do
      rem(n, 15) == 0 -> IO.puts "FizzBuzz"
      rem(n, 3) == 0 -> IO.puts "Fizz"
      rem(n, 5) == 0 -> IO.puts "Buzz"
      true -> IO.puts n
    end
  end
end

FizzBuzz.fizzbuzz(20)
```

```:実行結果
% elixir fizz_buzz.ex
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
```

よさそう。

## 詰まったところ

### Range から List への変換
Range (`1..max`で作られる） から List の変換は `Enum.to_list 1..max` のようにしてできます。


参考： http://stackoverflow.com/questions/25876629/in-elixir-how-can-a-range-be-converted-to-a-list

## 参考資料
* [Elixirだ 第1回 - 基礎だ -](http://slidehot.com/resources/elixirda-1-da.433513/)
* [『Programming Elixir』より "Think Different(ly)"](http://qiita.com/naoya@github/items/df267d3b951b47767b22)
NativeExpressAdViewでアプリに自然な広告を

## はじめに

スマートフォンが普及し、数年たちいかにもなフッタ（ヘッダ）バナー広告のクリック率は中々厳しい現状です。
NativeExpressAdViewを使用するとアプリに自然に溶け込ませた広告が配信でき効果的です。
詳しくはリファレンスをご覧ください。

[Google APIs for Android]
(https://developers.google.com/android/reference/com/google/android/gms/ads/NativeExpressAdView)
[googleads-mobile-android-examples NativeExpressExample]
(https://github.com/googleads/googleads-mobile-android-examples/tree/master/admob/NativeExpressExample)
[iOSの実装はこちら]
(http://qiita.com/pelican/items/460fbf2f7232989cff67)

## アプリ側の実装

実装は以下のようになります。
AdSizeには適切な値を入力してください

``` AdmobActivity.java

    private static final String MY_EXPRESS_AD_UNIT_ID = "ca-app-pub-xxxxxxxx";
    private RelativeLayout adExpressLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        adExpressLayout = (RelativeLayout) findViewById(R.id.ad_express_layout);

        NativeExpressAdView nativeExpressAdView = new NativeExpressAdView(context);
        nativeExpressAdView.setAdSize(new AdSize(320, 300));
        nativeExpressAdView.setAdUnitId(MY_EXPRESS_AD_UNIT_ID);
        adExpressLayout.addView(nativeExpressAdView);
        AdRequest adRequest = new AdRequest.Builder()
        .addTestDevice("test device")
        .build();
        nativeExpressAdView.loadAd(adRequest);
    }
```
レイアウトは以下のようになります。

``` admob_activity.xml
<RelativeLayout
        android:id="@+id/ad_express_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"/>

```

レイアウトに埋め込む場合はこのような形

``` admob_activity.xml
<com.google.android.gms.ads.NativeExpressAdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="320x300"
        ads:adUnitId="@string/ad_unit_id"/>

```

## AdMobの広告ユニット作成手順

AdMobログイン後に
収益化 > 対象のアプリ > 新しい広告ユニット > ネイティブ　を選択
まず表示する広告のサイズを選択します。

使いたいアプリの利用用途に応じて選択します。

<img width="1241" alt="スクリーンショット 2017-01-16 12.47.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/82045/e08fcbec-8866-5559-eb59-b8c595e54e1b.png">

続いて広告の表示フォーマットを選択します。
アプリの説明があるものやボタンの配置など微妙に異なります。

<img width="1237" alt="スクリーンショット 2017-01-16 12.48.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/82045/48c08bc4-e5ae-df4f-361c-daa782341f3d.png">

最終的にCSSをカスタマイズ可能です。
私はbody部のbackground-colorの変更などを行いました。

最後にCSSの下部にある「スタイルチェック」でOKになれば配信可能です
saveして終了しましょう。

<img width="1243" alt="スクリーンショット 2017-01-16 12.48.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/82045/03c9536d-cb94-11ed-3272-a9b02c3df79f.png">



## 表示のサンプル
動画の広告は以下のようになります。
![ad_video.png](https://qiita-image-store.s3.amazonaws.com/0/82045/dcb00e04-e300-8329-b496-473d4ceeb237.png)

アプリのインストール広告
![ad_app.png](https://qiita-image-store.s3.amazonaws.com/0/82045/811513f2-af46-589e-c820-fe7138953e87.png)

## 最後に

広告の基本サイズも様々あり、広告配信の幅が広がります。
アプリのリリースを行わずに広告をカスタマイズでき便利そうです。
いろいろな理由でGitHubを使えない人に試してほしい3つの方法

# いろいろな理由でGitHubを使えない人に試してほしい3つの方法

バージョン管理ツール勉強会　バージョン管理（GitHub）でゲームジャム（ハッカソン）攻略！！
https://nagogebu.connpass.com/event/47735/

で話した内容に＋αしたものになります。

---

GitHubを使えない理由は色々ありそうです。

- 無料で非公開で使いたいから
- インターネットにつながらないから
- 外に置けないデータだから
- 容量的にGitHubだとつらいから


そんな人におすすめな方法を紹介しようと思います。

# オススメな方法3つを紹介

## 1. ローカル環境でGitリポジトリを作って使う

GitHubがなくてもGitを使うことができます。

### メリット

- ネットワークは必要ない
- GitHubがなくても簡単に始められる

### デメリット

- 共有はできない


### こんな人にオススメ
- インターネットには繋がらない
- １人でGitをつかいたい
- 特に共有とかいらない

### 方法
Gitのクライアントで、リポジトリを作成して使用します。

#### コマンド(Git Bashなど)での例
リポジトリを作って、READMEを作成する

```bash
$ # リポジトリを作成する
$ cd path/to/target_dir
$ git init

$ # README.mdを作成してコミット
$ echo "# README" > README.md
$ git add README.md
$ git commit -m "first commit"
```


## 2. HDD（外付けなどの外部装置）にリモートリポジトリを作る（サーバー未使用）

案外知らない人が多い方法です。
サーバーなしでできるため、気軽にできます。

１ではローカルリポジトリのため、共有が難しい状態になっていました。
外部装置にリモートリポジトリを作ることで限定的な共有ができるようになります。

また、限定的ですが共有できるのでゲームジャムなどでネット環境が不安定なときに使えます。

### メリット

- 外付けHDDだけで限定的な共有が可能なリポジトリを作れる
- インターネットに繋がらなくてもリモートリポジトリを使える
- 容量は自分で用意した分だけ使える
- ローカルなので、非公開リポジトリになる
- sshなどの設定しだいでは、公開リポジトリにすることも可能

### デメリット

- 媒体の持ち運びが必要
- リモートリポジトリの作成に、コマンド操作が必要


### こんな人にオススメ

- ネットに繋がらない
- 非公開で使いたい
- ネットなしで少人数で使いたい
- 容量制限無しで使いたい
- 外に置けないデータを扱いたい
- 認証機能は特にいらない


### 方法

1. リモートリポジトリを作りたいフォルダに、「--bare --shared=true」なリポジトリを作成する。
2. クローン時に作成したリポジトリをリモートに設定する

#### コマンド(Git Bashなど)での例
リモートリポジトリを作成して、ローカルリポジトリからREADME.mdをプッシュする

```bash
$ # リモートリポジトリを作成
$ cd /path/to/remote_repo
$ git init --bare --shared=true

$ # ローカルにクローン
$ cd /path/to/local_repo_base_dir
$ git clone file:///path/to/remote_repo local_repo

$ # README.mdを作成してコミット
$ echo "# README" > README.md
$ git add README.md
$ git commit -m "first commit"

$ # リモートリポジトリにプッシュ
$ git push origin master
```

※例ではfileプロトコルを使用しましたが、sshプロトコルなどでも可能です


## 3. LAN内にGitHubライクなソフトフェアのサーバーを立てる

### メリット
- LAN上なので、外に置けないファイルもおける
- LAN上にWEB上から管理できるGitサーバーを立てられる
- 容量は自分で用意した分だけ使える
- リポジトリの管理ができる
- 認証がつかえる

### デメリット
- 自分でサーバーを立てる必要がある（ある程度の専門知識が必要）
- 家にサーバーを置くとなると電気代がかかる
- ソフトフェアのバージョンアップは手動で行う必要がある

### こんな人にオススメ
- インターネットには繋がらないけど、ローカルネットワークはある
- 外に置けないデータを扱いたい
- 非公開で使いたい
- 容量制限無しで使いたい
- 認証がほしい

### GitHubライクなソフトフェア紹介

- GitLab
  + オープンソース
  + Ruby on Rails 製
  + 公式サイト: https://about.gitlab.com/
  + GitHub: https://github.com/gitlabhq/gitlabhq

- GitBucket
  + オープンソース
  + Scala 製
  + 公式サイト: https://github.com/gitbucket/gitbucket
  + GitHub: https://github.com/gitbucket/gitbucket

### Dockerを使ってサーバーを立てる

Dockerのインストール方法や詳しい使い方などは説明しません。
また各サーバーの設定方法や使い方などは、各自でお調べください。

#### GitLab

- 使うDockerイメージ: https://hub.docker.com/r/gitlab/gitlab-ce/
- ドキュメント: https://docs.gitlab.com/omnibus/docker/

```bash
$ cd path/to/gitlab_home
$ docker run -d -p 8080:8080 -p 29418:29418 -v ${PWD}/gitbucket-data:/gitbucket f99aq8ove/gitbucket
```

#### GitBucket

- 使うDockerイメージ: https://hub.docker.com/r/cloudaku/docker-gitbucket/
- GitHub: https://github.com/f99aq8ove/docker-gitbucket

```bash
$ cd path/to/gitbucket_home
$ docker run -d -p 8080:8080 -p 29418:29418 -v ${PWD}/gitbucket-data:/gitbucket f99aq8ove/gitbucket
```


# まとめ

普段当たり前のようにつかっているものから、使わないものまでまとめてみました。

簡単な説明しかしていませんが、参考になれば良いかなと思います。
PostgreSQL 俺のチートシート [テーブル作成編]

## テーブル作成
CREATE TABLEなどのSQL文が記載されたテキストファイルを作成し、
psqlからそのファイルを指定／実行する手法。

- テキストファイルの作成

```shell-session
$ cd /var/lib/postgresql
$ vi users.sql
```
```sql:users.sql
DROP TABLE IF EXISTS users;

DROP SEQUENCE IF EXISTS users_id_seq;

CREATE SEQUENCE users_id_seq;

CREATE TABLE users (
 id INTEGER DEFAULT nextval('users_id_seq') PRIMARY KEY,
 name VARCHAR(255) NOT NULL,
 created TIMESTAMP,
 modified TIMESTAMP
)
```

- psqlからデータベースfooに接続

```shell-session
[psql]# \c foo
```

- ファイルの指定／実行

```shell-session
[psql]# \cd /var/lib/postgresql
[psql]# \i users.sql
```

- テーブル定義の確認

```shell-session
[psql]# \d users
```
## テーブル削除
作成したけれど要らないやぁ～という時は削除する。

- テーブルの削除

```shell-session
[psql]# DROP TABLE users;
```

## スキーマ定義
1つのデータベースに、複数のスキーマを定義可能。
1つのスキーマに、複数のテーブルが所属する。
スキーマは、データベースにおける名前空間。

```shell-session
[psql]# CREATE SCHEMA bar
```



以上
プログラミングPHP 2章PHP言語の基本


# 字句構造
## 大文字・小文字の区別
変数名：　区別される
関数、クラス名、組み込みキーワード名(echo,while等）：　区別されない

## コメント
### シェル形式(#)コメント
ex)

```php:
################
##コメント
################
```

### C++形式(//)コメント

```php:
////////////////
//コメント
////////////////
```

### C形式(/* */)コメント

```php:
/*
コメント
/*
```

★C形式のコメントはPHPの終了タグを超えても有効となる

## 変数名のルール
```$```で始まる。大文字小文字が区別される。$の次は文字または_から始まる。(数字から始まるのはNG)

## 関数名のルール
文字または_から始まる。(数字から始まるのはNG)大文字、小文字は区別されない。

## 定数
定数として指定できるのは、スカラー値（理論値、整数、浮動小数点、文字列）のみ。
配列はNG。定数値の変更は不可。値の設定にはdefine()関数を利用する。

```php:
define('PUBLISHER',"O'Reilly & Associates");
echo PUBLISHER;
```

# データ型
## 整数
+ 先頭が0ではない　・・・　10進数
+ 0755 等 0+1-7から始まる　・・・　8進数
+ 0xから始まる　・・・　16進数
+ 0bから始まる　・・・　2進数

is_int() or is_integerで整数かどうかを調べられる

## 浮動小数点
浮動小数点はあくまで近似値なので、比較方法は以下のような形とする

```php:
if intval($a*1000) == intval($b*1000){
// $aと$bは浮動小数で、小数点以下3桁までが等しい
}
```

## 文字列
'と"の違い・・・　”の場合は内部の変数が展開される。エスケープ文字が使用できる。

## 理論値
以下はfalse。それ以外はtrue

+ false
+ 0 (int)
+ 0.0 (float)
+ "" (空文字列) 文字列"0"
+ 空配列
+ NULL

is_bool関数で論理値がどうかを調べられる

## 変数のスコープ
### ローカルスコープ
関数内で宣言した変数はその関数内のみで有効となる。
ローカルスコープは関数レベルのもののみが定義でき、他の言語のように、ループ内だけで有効な変数や条件分岐の中だけで有効な変数は作る事ができない
### グローバルスコープ
関数の外側で宣言した変数はグローバル変数となる。関数の内部からグローバル変数へのアクセスは、デフォルトではできない
globalキーワードまたは$GLOBALS配列を使う

例

```php:
function updateCounter(){
	global $counter;
	$counter++;
}

$counter = 10;
updateCounter();
echo $counter(); → 11
```

```php:
function updateCounter(){
	$GLOBALS[counter]++;
}

$counter = 10;
updateCounter();
echo $counter(); → 11
```

### スタティック変数
スタティック変数の値は関数が終了しても破棄されないが、その関数内でしか利用できない。

ex)

```php:
function updateCounter(){
	static $counter = 0;
	$counter ++;
	
	echo "$counter\n";
}

$counter = 10;
updateCounter(); → 1
updateCounter(); → 2
```

#式と演算子
## 暗黙のキャスト
暗黙のキャストの事を、PHPでは、「型のジャグリング」という。

ex)

+ 整数 + 浮動小数点　→　整数が浮動小数点にキャストされる
+ 整数 + 文字列　→　文字列が整数にキャストされる
	+ "9 Lives" - 1 ; → int 8
	+ "1E3Points og Light" + 1; → // float 1001
	+ "aaa" * 1 ; → 0 // int 0

## インクリメント演算子とデクリメント演算子
インクリメント演算子は「変数のみ」に利用可能
文字のインクリメント　まるで26進数を扱っているような動きとなる
ex)

"a"++; → b
"z"++; → aa
"spaz"++; → spba

## 比較演算子
+ == 値が等しい　（暗黙のキャストあり）
+ === 値も型も等しい　（暗黙のキャストなし）
+ != または <> 値が等しくない　（暗黙のキャストあり）
+ !== 値と型　が同一でない　（暗黙のキャストなし）
+ >, >=, <, <= より大きい,以上,より小さい,以下

## ビット演算子
+ ~ ビット否定演算子　~1→0 ~0→1　ビットを反転
+ & ビットAND演算子 1&1→1 1&0,0&1,0&0→0
+ | ビットOR演算子 1|1, 1|0, 0|0 → 1 0|0 → 0
+ ^ ビットXOR演算子　　1^0, 0^1 → 1 1^1,
+ << 左シフト演算子　→ 指定したビット数分左にシフト (2のx乗)
+ >> 右シフト演算子　→ 指定したビット数分右にシフト

## 論理演算子
+ && または and 論理積
+ || または or 論理和
+ xor 排他的論理和　（どちらか一方のみtrueの場合にtrue)
+ ! 論理否定

## その他の演算子
+ @ エラー抑制演算子 エラーメッセージを発生させないようにする
+ \`…\` 実行演算子　シェルコマンドとして実行

``` php:
$listing = `ls -ls /tmp`;
echo $listing;
```

+ ?: 条件演算子 または　参考演算子
`条件式? trueの場合の処理 : falseの場合の処理; `
+ instanceof 型演算子　特定のクラスのインスタンスであるか？

# 外部コードの読み込み
外部コードの読み込みはrequireかincludeを使う
+ require →　読み込み対象のファイルが存在しない場合はエラー、処理終了
+ include →　読み込み対象のファイルが存在しない場合は警告、処理続行
TypeScript target指定による挙動の違い

# 何
- tscのときのtarget指定の意味を整理する。

## targetとは
- ES3,ES5,ES6　から指定する。指定した仕様に従ったjsが生成される。
- 参考）https://www.typescriptlang.org/docs/handbook/compiler-options.html 
- jsの実行環境の要件に合わせて指定する。

## TypeScriptの記述について
- 上位の仕様で記述して、下位の仕様をtarget指定した際に、その仕様に変換してくれる場合と、エラーになる場合がある。
- 例）tsで、ES6の記述をして、target=es3やtarget=es5でコンパイルした際に、その仕様に変換してくれる場合と、エラーになる場合がある。

### 変換してくれる例）

``` es6.ts
const NUM = 1;

var str = `あ
い
う`;

var [name2, age] = ['a', 3];

```

↓ tsc --target es3 es6.ts

``` es3.js
var NUM = 1;
var str = "\u3042\n\u3044\n\u3046";
var _a = ['a', 3], name2 = _a[0], age = _a[1];

```


↓ tsc --target es6 es6.ts

``` es6.js
//こっちはtsの記述から変化なし
const NUM = 1;
var str = `あ
い
う`;
var [name2, age] = ['a', 3];
```

### エラーになる例）  

```es6-2.ts
//generator
function* gfn(n){
    n++;
    yield n;
    n++;
    yield n;
}

//map
let map = new Map();
map.set('key1', 'value1');
```

↓ tsc --target es3

```
error TS1220: Generators are only available when targeting ECMAScript 2015 or higher.
error TS2304: Cannot find name 'Map'.
```

- RoadMapによって、今後のサポートの予定が公開されている　https://github.com/Microsoft/TypeScript/wiki/Roadmap
- "Generator support for ES3/ES5"がFeb 2017に予定されている、など。
Securing OpenAM 実践Ⅲ

とりあえず記録。

> Create specific administrator users to track better who makes configuration changes.

# 設定変更内容や設定変更したユーザをトレースできるようにする

つまり、以下の２点がポイント？ということかなと考えてます。設定を変更するユーザがamadminみたいなトップレベル管理者だけなら、1.自体は作成するシーンがないと思います。
1.設定変更用の特定のユーザを作成する=管理者権限を委譲したユーザの作成？
2.設定変更情報をトレースできるようにしておく(監査ログ)

## 1.権限委譲用のユーザの作成

以下にレルム管理者の権限委譲が記載されています。

> https://backstage.forgerock.com/docs/openam/13/admin-guide#delegating-realm-administration-privileges

### 1-1.権限委譲用のグループの作成
[レルム名]-[Subjects]-[グループ]から権限移譲用のグループを作成します。
![create_delegated_group.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/a1336f03-30d0-378c-9941-329a0ef2091b.jpeg)

[権限]タブから権限委譲の設定を行います。
※権限の内容については以下に記載されているようです。ちゃんと読めてないですが。。。
https://backstage.forgerock.com/docs/openam/13/admin-guide#realm-privileges
![privileges.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/06c3ec08-5a7a-a22e-2f16-328dd8e7db32.jpeg)

[レルム名]-[Subjects]-[グループ]-[グループ名]-[ユーザ]で作成した権限委譲用グループのメンバーにユーザを登録します。

![add_user.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/4c8a5411-0cf3-e9a8-643f-cdb6ae7be67a.jpeg)

登録したユーザでログインすると、ADMINISTRATION画面を操作できるようになっています。
![delegated_user_login.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/e930bccd-f762-533b-acf2-7c0fb5094a74.jpeg)

## 2.監査ログの確認
監査ログは以下に記載があります。

> https://backstage.forgerock.com/docs/openam/13/admin-guide#audit-log-topics

設定変更のログはデフォルトだと/%BASE_DIR%/%SERVER_URI%/log/配下のconfig.csvに出力されています。OpenAM13.0だと設定の場所は「CONFIGURATION]-[グローバル]-[Audit Logging]-[Global CSV Handler]になります。
ログローテーションの設定をしておく、もしくはDBにも出力できるようになっているらしいので、その設定をするなど何かあったときに検索しやすいような設定をしておくのが良さげみたいです。

監査ログについては既にいろいろ試されている方がいて、とてもわかりやすい!
http://qiita.com/nanazero/items/bb6d431436316138e246
https://t246osslab.wordpress.com/2016/08/11/openam/openamの新しい監査ログについて-1/
https://t246osslab.wordpress.com/2016/10/19/openamの新しい監査ログについて-2/


今回は少し書き方が雑だったかも。。。
Python3 逆引き Tips

Python3 の逆引きTips （随時追加）。PHPとの比較を盛り込みつつ、Python3 によるWeb関連の基礎事項まとめてみます。

# データベース
## MySQL
[Python3でMySQLを使う – 基本操作からエラー処理までサンプルコード付](https://www.craneto.co.jp/archives/1219/)
Python3でMySQLを使うには？インストール、CRUD等の基本操作からエラー処理までサンプルコード付で解説

## SQLite3
[Python3でSQLite3を使う – 基本操作からエラー処理までサンプルコード付](https://www.craneto.co.jp/archives/1248/)
Python3でSQLite3を使うには？インストール、CRUD等の基本操作からエラー処理までサンプルコード付で解説

# Python3 の基礎知識
[文字列の基礎知識 – Python3 入門 マニュアル](https://it-engineer-lab.com/python3-manual-strings)
[リストの基礎知識 – Python3 入門 マニュアル](https://it-engineer-lab.com/python3-manual-list)
[タプルの基礎知識 – Python3 入門 マニュアル](https://it-engineer-lab.com/python3-manual-tuple)
[辞書（dict）の基礎知識 – Python3 入門 マニュアル](https://it-engineer-lab.com/python3-manual-dict)


まったりと随時追加してきます。
Forgeの鉱石辞書の使い方

#鉱石辞書とは

鉱石辞書はMinecraft Forgeが提供している機能の一つで、Mod間のアイテムの互換性を追加することが出来ます。

基本的には名前の通り、鉱石の互換性を追加するための機能でしたが、最近では色々なアイテムの互換性に使われています。

#バニラやModでの使用例

Modで追加された○○インゴット(銅や鉛)が複数のModのレシピで使用できるのは、鉱石辞書の機能です。

#実際に使う

鉱石辞書にアイテムを登録する方法と、登録されたアイテムを取得する方法の説明をします。

##登録

net.minecraftforge.oredictパッケージのOreDictionaryクラスを使います。

```
OreDictionary.registerOre("鉱石辞書名", ItemやBlockのInstance);
```

で登録が出来ます。

###鉱石辞書名のルール

登録する時に設定する鉱石辞書名は"プレフィックス" + "マテリアル" です。

例えば、鉄インゴットなら ``` ingotIron ```に、木の棒なら```stickWood```になります。

##取得

登録されたアイテムの取得はgetOresで出来ます。

```
OreDictionary.getOres("鉱石辞書名")
```

戻り値は```List<ItemStack>```です。

あとはforなどで回して一致するか調べます。

また、少し面倒ですがアイテムに追加された鉱石辞書名の取得も出来ます。

```
ArrayList<String> oreNames = Lists.newArrayList();
for(int id : OreDictionary.getOreIDs("ここに調べたいアイテムのItemStackを入れる")){
    oreNames.add(OreDictionary.getOreName(id));
}
```

oreNamesにアイテムの鉱石辞書名がListで入っています。
LINEボットでアドベンチャーゲームツクール"rizm"を作った

# LINEのチャットボット開発いたしましたー。
メッセージ＆ストーリーボット
"rizm"です。
![logo_rizm_title.png](https://qiita-image-store.s3.amazonaws.com/0/123556/d2b48591-c3f5-a8c4-72bb-329659628c6b.png)

## LINEだけでアドベンチャーゲームが作れます。
LINEで架空の誰かと対話しながら進めるゲームが開発できます。
いわゆるbot開発ツールではなく、LINEとスマホだけで作れるツールです。
こんなのが作れます

”本能寺の変”
<img width="375" alt="Rizm_scr1.png" src="https://qiita-image-store.s3.amazonaws.com/0/123556/f9d57e2e-3429-58ae-d654-635aa6271f4e.png">


## 自分でストーリーも作れます。LINE上ですべて作成できます。
↓本能寺の変のセリフ編集画面
<img width="375" alt="qiita_0200.png" src="https://qiita-image-store.s3.amazonaws.com/0/123556/6eacf6a3-23dc-bc02-b378-307c2b241334.png">



## ストーリーは（今のところ）すべて選択式で進められます。
あたかも誰かとチャットしているような感覚でお話が進められます。
とりあえず試してみたい方は以下のリンク、もしくはQRコードからLINEアプリを呼び出して
https://line.me/R/ti/p/%40shi9833m
![rizm_qr.png](https://qiita-image-store.s3.amazonaws.com/0/123556/9d3a8c6a-0885-18d7-8757-1ac947a79aef.png)

すると下図のようにボットを追加するか聞かれるので追加をタップします
<img width="375" alt="qiita_0100.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/55407e07-cc1e-b65b-8379-32911aabdca9.png">


するとすぐに"rizm"というボットがフレンドに追加され、同時に以下のような
welcomeメッセージが飛びます
（タップしたらすぐにメッセージ来るので驚かないでくださいね）
rizmのチャット画面を開くとこんな感じになります。
<img width="375" alt="qiita_0101.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/a535ae38-12de-bda1-1107-b62ab99c0227.png">

ここで選択肢が出てくるので「ボット選択」をタップしてください。
するとこのような、現在公開されているボットの一覧がでます。
（まだ私が作ったやつ一個しかないです）
<img width="375" alt="qiita_0102.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/c85b5044-d85d-ca3a-7a76-342b016b28b6.png">

ここでボットのタイトル「本能寺の変」をタップすると自動的にrizmのチャット画面に
移動して、このストーリーのバナーが表示されます（画面一番下に「本能寺の変」という
のがあるのがわかります。
<img width="375" alt="qiita_0103.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/3a5b5a45-e575-a68d-4e9d-0a7e4e02b352.png">

このバナーをタップするとこのボットストーリーが始まります！
信長とチャットしている感覚で楽しめます。
<img width="375" alt="qiita_0104.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/df72231b-8946-8219-f902-236f6effebfc.png">

途中でグレーのセリフが現れます。以下の例では3択となっています。
あなたの回答（選択）次第でストーリーはどんどん変わっていきます。
<img width="375" alt="qiita_0105.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/1d83f3f3-6851-dceb-e750-610b076ff5f3.png">

ここでは「ノブちゃんひさしぶり！」をタップしました。信長様、意外にフレンドリーで
優しいナイスガイです。
<img width="375" alt="qiita_0106.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123556/de27e0de-35ea-b88d-c4c4-5861abba4958.png">

## 果たしてあなたは信長を救えるか、、ここから先は皆さんの目で確かめてください！

LINEチャットボット"rizm"
![logo_rizm_title.png](https://qiita-image-store.s3.amazonaws.com/0/123556/d2b48591-c3f5-a8c4-72bb-329659628c6b.png)
https://line.me/R/ti/p/%40shi9833m
![rizm_qr.png](https://qiita-image-store.s3.amazonaws.com/0/123556/9d3a8c6a-0885-18d7-8757-1ac947a79aef.png)


さて、ここまではプレイヤーとして遊ぶ方法の説明でした。
rizmのメイン機能はこのようなストーリーを自分で作れるところです。
## LINEボットアカウントは必要なく、LINEアカウントがあれば誰でも作れるのです。
作り方について書きました。
LINEボット"rizm"で簡単なストーリーを作って他の人に遊んでもらう（１）
http://qiita.com/firenavi/items/a4721d7e527d96c9422e
Ubuntu14.04LTSからUbuntu16.04LTSへアップグレードする

下記のサイトを参考に。

[Ubuntu 14.04LTSから16.04LTSにアップデートする手順@四畳半robono](https://robonostone.blogspot.jp/2016/05/ubuntu1604lts.html)

2017/01/14時点では手順4は不要でした。
また、途中下記の項目についての確認がありました。

* キー配置について(ナショナルか標準ラテンかその他か)
* システムを上書きするか
* 再起動の実行可否

再起動が完了したら、16.04LTSが入っている状態になっていました。
簡単楽ちん。
あとはきちんと動いてくれるかどうかかな。

ちなみに。
14.04を入れていたときにgnomeをインストールしたところ、16.04にも引き継がれていました。
使い心地が変わらないのは安心。
Twitterのリストを新規作成してユーザを追加するコードをGoで書いてみた

## 使い方

- 1. 依存ライブラリを取得

```
go get -v github.com/ChimeraCoder/anaconda
```

- 2. ユーザの一覧を記載したテキストファイルを作成

```
cat USERS_FILE.txt
userA
userB
userC
```

- 3. 実行

第1引数は作成するリストの名前、第2引数は作成するリストが公開か非公開か、第3引数はユーザの一覧を記載したテキストファイル

```
go run main.go NEWLIST_NAME NEWLIST_MODE(puclic or private) USERS_FILE.txt
```


TwitterのAPI Keyは各自取得して書き換えてください。

## 

```go
package main

import (
	"bufio"
	"fmt"
	"net/url"
	"os"
	"time"

	"github.com/ChimeraCoder/anaconda"
)

// Usage
// go get -v github.com/ChimeraCoder/anaconda
//
// cat USERS_FILE.txt
// userA
// userB
// ...
//
// go run main.go NEWLIST_NAME NEWLIST_MODE(puclic or private) USERS_FILE.txt

var (
	consumerKey       = ""
	consumerSecret    = ""
	accessToken       = ""
	accessTokenSecret = ""
)

func main() {
	anaconda.SetConsumerKey(consumerKey)
	anaconda.SetConsumerSecret(consumerSecret)
	api := anaconda.NewTwitterApi(accessToken, accessTokenSecret)

	if len(os.Args) != 4 {
		fmt.Println("usage: go run main.go NEWLIST_NAME NEWLIST_MODE(puclic or private) USERS_FILE.txt")
		os.Exit(1)
	}

	listName := os.Args[1]
	fp, err := os.Open(os.Args[3])
	if err != nil {
		panic(err)
	}
	defer fp.Close()

	v := url.Values{}
	v.Set("mode", os.Args[2])
	list, err := api.CreateList(listName, "", v)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Create success %v\n", list.Name)

	scanner := bufio.NewScanner(fp)
	if err := scanner.Err(); err != nil {
		panic(err)
	}

	fmt.Println("Wait 5 sec...")
	time.Sleep(time.Second * 5)

	for scanner.Scan() {
		user := scanner.Text()
		fmt.Printf("add %v to %v\n", user, listName)

		_, err = api.AddUserToList(user, list.Id, nil)
		if err != nil {
			panic(err)
		}
	}
}
```
[Unity]Shaderでかっこよさげな(?)シーン遷移 ~その2~

#できるもの
![1月-15-2017 16-20-06.gif](https://qiita-image-store.s3.amazonaws.com/0/113509/c7c2e5ab-ce77-422b-b3cc-e532e299f897.gif)
バトルシーンへの遷移に使えそう。
少なくとも一瞬でパッと変わるよりはマシかなぁ?
ちなみに雑ですがアンチエイリアスはかけました。
(スクリプトから進行度合いの値を入れる必要があります。詳しくは[ここ](http://qiita.com/torumu106/items/20fcb7590f653695f26f))
(それが嫌なら_Time.yに演算を少し施して使うといいかもです。)
#コード
```
Shader "Original/NewImageEffectShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		percent ("percent", Range(0, 1)) = 0.5
		cycletime ("cycletime", int) = 3
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always
		// 追加
        CGINCLUDE

        #define PI 3.14159

        float mod(float  a, float  b) { return a-b*floor(a/b); } 
        ENDCG

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;
			uniform float percent;
			uniform int cycletime;

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);

				float2 r = 2.0 * (i.uv - 0.5);
                float aspectRatio = _ScreenParams.x / _ScreenParams.y;
                r.x *= aspectRatio;

                fixed4 bgCol = float4(0.0, 0.0, 0.0, 0.0); // black

				float4 cola,colb,colc,cold;
				cola = lerp(col, bgCol, 1.0 - step(PI * percent / cycletime, mod(atan((r.y + 0.001) / (r.x + 0.001)), PI / cycletime)));
				colb = lerp(col, bgCol, 1.0 - step(PI * percent / cycletime, mod(atan((r.y + 0.001) / (r.x - 0.001)), PI / cycletime)));
				colc = lerp(col, bgCol, 1.0 - step(PI * percent / cycletime, mod(atan((r.y - 0.001) / (r.x + 0.001)), PI / cycletime)));
				cold = lerp(col, bgCol, 1.0 - step(PI * percent / cycletime, mod(atan((r.y - 0.001) / (r.x - 0.001)), PI / cycletime)));
				col = (cola + colb + colc + cold) / 4;

				return col;
			}
			ENDCG
		}
	}
}

```
cycletimeの値を変えれば細分化の度合いを変えることができます。
#仕組み
atanでX正方向との角度を取得しその角度に応じて塗り分けます。
4回少しずらして処理をしているのはアンチエイリアスです。
#おまけ
Percentを0.5付近、cycletimeを3桁とかにすると不思議な模様が出てきます。(少なくとも私の環境では)
(意図はしてませんがこれはこれでかっこいいかもです)