OmniAICreator/Qiita-1.07M huggingface dataset:
津山市のオープンデータを使って一般会計予算・決算を棒グラフで可視化する

# About

2016年12月1日から公開された [津山市オープンデータ](https://www.city.tsuyama.lg.jp/life/index2.php?id=5530) を用いて何か作って欲しいという依頼を受け，ひとまず財政状況を可視化するという単純なウェブサイトを作成しました。

[津山市財政見守り隊](http://mimamori.sysken.org/)

そこで詰まったことをメモ的に書き留めています。

# 津山市のオープンデータ

もともと冊子で公開しているExcelデータをそのまま公開していたり，ものによってはCSVで公開されていたりと，多種多様です。（位置のオープンデータは衝撃を受けました。)

そのうち今回は `津山市_一般会計・決算_2015分_20161201` を使用します。

# ファイルを見る

中身を見ると，色々と突っ込みたいところがあります。見た目を整えるための改行や，「平成」が付いているもの，ついていないものの表記ゆれ，また値が存在しないものに関しては0ではなく `ー` で埋められているなど…。

「とりあえず公開して，使ってもらいたい」というデータだと思いますので，これからの改善に期待です（私からも要望を幾つかお伝えしました）。

## 追記

津山市役所にて，「見守り隊」の作成およびオープンデータの改善点についてのプレゼンテーションを行いました。
http://www.slideshare.net/Raryosu/ss-71078777

# 具体的な作業

## CSVファイルにする

ひとまず，このままではどうしようもないので，歳入と歳出のファイルをわけて，CSVに変換，そして無駄な改行を省きます。
なるべく元データを改変せずに，クライアントサイドでひたすら処理するようにします。

## D3.jsで読み込む
```js
d3.csv("/tsuyama/revenue.csv", function(csvdata) {
  // 具体的な処理内容
});
```

これだけでCSVファイルを読み込んでよしなにしてくれるなんて素敵な時代ですね…。

## データを加工する

Javascriptで先程のCSVを読み込んで，適切な形に変更します。

```js
d3.csv("/tsuyama/revenue.csv", function(csvdata) {
  // データセット(数値)を保存する配列
  var dataset = [];
  // グラフに表示するラベルを保存する配列
  var labelset = [];
  // グラフの最大長(ここでは最大のデータ)
  var max_width = 0;
  for(var count=0; count<csvdata.length; count++) {
    // ここでは26年度の決済データを読み込む
    // 正規表現でいらない文字列を消したり，置換
    var money = parseInt(csvdata[count]["26年度決算"]
        .replace(/,/g, "")
        .replace(/－/g, "0"));
    // ラベルデータを引っ張る
    var label = csvdata[count]["款"] + " " + money.toLocaleString() + "千円";
    // 最大値を見つける
    if(max_width < money) {
      max_width = money;
    }
    // データセットをpush
    dataset.push(money);
    labelset.push(label);
  }
  // グラフを描画する要素を指定
  var canvas = d3.select("#h26gen-in");
  // グラフを描画
  make(dataset, labelset, max_width, canvas);
});
```

## グラフを描画

グラフを描画する `make` 関数は以下のようにします。

```js
/**
 * make - グラフを描画する
 *
 * @param dataset [] データセット
 * @param labelset [] ラベル
 * @param max_width int 最大長
 * @param canvas object グラフを描画するエリア
 */
function make(dataset, labelset, max_width, canvas) {
  // キャンバスサイズ(マジックナンバーが多いから直さないといけない)
  var svg = canvas.append("svg")
    .attr({
      width: parseInt(max_width) / 8000 + 50,
      height: dataset.length * 30,
    });
  // 棒グラフを描画
  svg.selectAll('rect')
    .data(dataset)
    .enter()
    .append('rect')
    .attr({
      x : 0,
      y : function(d, i) { return 30 * i; },
      width : function(d) { return d/8000; },
      height : 25,
      fill : '#6fbadd'
    });
  // ラベルを表示
  svg.selectAll('text')
    .data(labelset)
    .enter()
    .append('text')
    .attr({
      x: 2,
      y: function(d, i) { return 20 + 30*i; },
    })
    .text(function(d) {
      return d;
    });
}
```

## グラフを表示してみる

d3.js本体と，先程のスクリプトを読み込み，HTMLに以下を書くといとも簡単にグラフを表示することができます。

```html
<div id="h26gen-in"></div>
```

# まとめ

かなり荒削りなコードですが，思いの外簡単にd3.jsでグラフを描画することができました。（コードが汚すぎますが…）

津山市のオープンデータについては，現状では面白いデータがなく，また使いにくい形式ですが，ぜひ何か作ってそういったフィードバックなどをしてみるのも良いかと思います。
Xcode　Tips

#目的

最近Xcodeを使いはじめました。そこで、気になって調べた機能をメモ代わりに投稿していこうと思います。随時更新していく予定なので時々見に来てもらえるといいかもしれません。開発はc++を使っています。

#ショートカット編

- 複数行コメント

```
command + /
```

- 複数行タブ

```
command + [ or command + ]
```

- ビルド

```
command + b
```

- 定義に飛ぶ

```
option を押しながら対象をクリック
```

- .cpp .h の切り替え

```
command + control + ↑
```

- ファイル名を指定して移動

```
command + shift + o
```
YOLOv2を独自データセットで訓練する

# YOLOv2を自分で用意したデータで訓練する

~~YOLOv2はまだ論文も発表されていないが~~ ソースコードが[ホームページ](http://pjreddie.com/darknet/yolo/)で公開されているので自分のデータで訓練し試してみた
[YOLO9000: Better, Faster, Stronger](https://arxiv.org/abs/1612.08242)というタイトルで論文が発表されている

## データセットの用意

画像と対応するアノテーションデータは用意済と仮定する
YOLOでは画像の座標ではなく割合で表現するのでデータを変換する必要がある
いままでのYOLO(Old YOLO)と同じデータフォーマットなので[こういったサイト](https://www.linkedin.com/pulse/start-training-yolo-our-own-data-guanghan-ning)を参考に用意する

## cfgファイルの変更

出力クラス数に合わせて設定ファイルを変更する
今回はTiny YOLOを用いることとする

* ラベルの設定ファイル

 `data/voc.names`を参考に作成
 ペンと消しゴムの2クラスの場合は以下のようになる

```text:my-dataset.names
pen
eraser
```

* 使用するデータを指定するファイル

 `cfg/voc.data`を参考に作成
 例を下に示す

```text:my-dataset.data
classes = 2
train = data/my-dataset/train.txt
valid = data/my-dataset/test.txt
names = data/my-dataset.names
backup = ./backup
```

* ネットワーク定義のファイル

 `cfg/tiny-yolo-voc.cfg`を参考に作成
 `classes`をデータセットに合わせて変更
 その上の`convolutional`レイヤーの`filters`を以下の式から算出して変更
 `lerning_rate`は`0.0001`くらいがおすすめ
 経験と勘で丁度良く設定
 `max_batches`も自由に設定(初期値でも問題なし)

```math
filters = num * (classes + coords + 1)
```

 例を以下に示す

```text:my-dataset.cfg
[convolutional]
size=1
stride=1
pad=1
filters=35
activation=linear

[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
bias_match=1
classes=2
coords=4
num=5
softmax=1
jitter=.2
rescore=1

object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1

absolute=1
thresh = .6
random=1
```

## 訓練する

darknetにtrainを引数で与えて訓練する
重みの初期値を`darknet.conv.weights`とするなら以下のように指定する
指定のbatch数ごとの重みのスナップショットがbackupに指定したディレクトリ以下に作成される

```shell-session
darknet detector train cfg/my-dataset.data cfg/my-dataset.cfg darknet.conv.weights
```

## ウェブカメラを用いてリアルタイム検出する

YOLOのサイトにあるように以下のコマンドで実行

```shell-session
darknet detector demo cfg/my-dataset.data cfg/my-dataset.cfg my-dataset.weights
```
Visual Studioでcpplintする

この記事は[C++ Advent Calendar 2016](http://www.adventar.org/calendars/1527)の14日目の記事です。  

Visual Studio 2015 Communityでcpplintを使えるようになるまでを書いていきます。

# lintとは
lintとはソースコードの静的解析ツールのことです。
Wikipediaには次のように書いていました。
https://ja.wikipedia.org/wiki/Lint
> lintとは、主にC言語のソースコードに対し、コンパイラより詳細かつ厳密なチェックを行うプログラムである。
転じて、C言語に限らず、各種言語で書かれた文書に対して文法チェックを行うプログラムも、lintと呼ばれるようになった。この意味でのlintの代表例としては、HTMLの文法チェックを行うAnother HTML-lintがある。

lintはソースコードをどう書くかなどのルールをある意味人間に強制することで、チーム内でコードの書き方のお作法などをどうするかの悩みを解決してくれます。またそれによって人間はコードを書くということに集中できるようになるため、個人的にすごい気に入っているツールです。

# cpplintとは
cpplintとはpythonで書かれたC++のソースコードが[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)に従っているかを検査するツールです。
実行する時に`--filter`オプションを使うことで検査される内容を細かく設定できます。どのような内容が検査対象になるかは、`--filter`オプションの移り変わりに対応するためにもcpplintの[ソースコード](https://github.com/google/styleguide/blob/gh-pages/cpplint/cpplint.py#L193)を直接見るのがいいと思います。

# Visual Studioの外部ツールとしてcpplintを登録する
Windowsに`python`がインストールされており、`cpplint`も`pip`で`C:\Python27\Scripts\cpplint.exe`インストールされている前提とします。  
`ツール(T)`→`外部ツール(E)...`で外部ツールの設定画面を開きます。`追加(A)`を選んで以下のように入力します。

```
タイトル: cpplint
コマンド: C:\Python27\Scripts\cpplint.exe
引数: --output=vs7 --extensions=h,hpp,c,cpp $(ItemPath)
初期ディレクトリ: $(ItemDir)
```

![cpplint_config.PNG](https://qiita-image-store.s3.amazonaws.com/0/119143/2ea63dcb-da9c-dffc-9ad3-f56b63b5042f.png)


引数のところに`--filter`オプションを書いてやると検証の内容を設定できます。また``--extensions``はlintの対象となるファイルを指定するオプションで、デフォルトでは、`.cc`、`.cpp`、`.cu`、`.cuh` `.h`が対象なので、`hpp`を対象にするには明示的に指定しなければなりません。
ここで、登録した`cpplint`が上から何番目なのか覚えておいてください。上の画像だと6番目です。

# cpplintをキーボードショートカットに登録する
`ツール(T)`→`オプション(O)...`でオプション画面を開きます。検索バーに`外部コマンド`と入力します。番号が振られたコマンドが出てくると思うので、対応する数字にキーボードショートカットを割り当てます。この場合だと`6`に`Ctrl+R,Ctrl+L`を割り当てました。
![cpplint_keyboard.PNG](https://qiita-image-store.s3.amazonaws.com/0/119143/46891e5d-1dd8-7505-c1d6-d1b3bb131382.png)


# cpplintの実行
コードを編集するエリアで先程登録したショートカットを実行すると次のようにエラーを表示してくれます。
![cpplint_test.PNG](https://qiita-image-store.s3.amazonaws.com/0/119143/2ccaa7f0-2929-1642-9152-905258a43779.png)

# 参考
以下のページを参考にしました
- http://sww-it.ru/2015-01-14/1199
- https://www.chromium.org/developers/how-tos/visualstudio-tricks
Excelの行列の積の関数を使ってみた

Excelの行列の積の関数を使ってみた
AxL1=L1'
AxL2=L2'省略
[表示画面]
1 0
0 1
2 3 2 3
(以下続く)

[入力]
R1C1が1,R1C2が0
R2C1が0,R2C2が1
R4C1が2,R4C2が3,R4C4が{TRANSPOSE(MMULT($A$1:$B$2,TRANSPOSE(A4:B4)))},R4C5が{TRANSPOSE(MMULT($A$1:$B$2,TRANSPOSE(A4:B4)))} 
[計算結果]
R4C4が2,R4C5が3
(1*2+0*3)(0*2+1*3)
[参考]
MMULT関数

https://support.office.com/ja-JP/article/MMULT-%E9%96%A2%E6%95%B0-40593ed7-a3cd-4b6b-b9a3-e4ad3c7245eb
Shift_JISなサイトをgulp, BrowserSyncで文字化けさせずに表示する

なぜかいまだにShift_JISなサイトたくさんありますね。
見る分にはShift_JISでも問題ありませんが、運用にかかわってしまうとちょっと面倒なことになります。なぜか。
BrowsersyncだとShift_JISなサイトは文字化けするから。

そこでBrowsersyncでもshift-jisが文字化けしない方法を考えてみました。

※検索するとShift_JISなhtmlをUTF-8に変換して書き出すと言うものは見つかりますが、そんな対応はしたくない、ということで以下になります。

Browsersyncのmiddlewareを使用して、Shift_JISなhtmlをUTF-8に変換してブラウザに表示させてしまいます。


```json:package.json
"devDependencies": {
    "browser-sync": "^2.8.0",
    "gulp": "^3.9.0",
    "iconv-lite": "^0.4.15",
    "jschardet": "^1.4.1"
  }
```

```js:gulpfile.js
var gulp = require('gulp'),
    browser = require('browser-sync'),
    fs = require('fs'),
    path = require('path'),
    iconvLite = require('iconv-lite'),
    util = require('util'),
    jschardet = require('jschardet'),
    url = require('url');

gulp.task('server', function() {
    browser({
	port: ****,
        server: {
            baseDir: '****',
            middleware: [
              function (req, res, next) {
                // pathnameを取得
                var urlParse = url.parse(req.url);

                // .htmlなら
                if (/\.html$/.test(urlParse.pathname)) {

                  // データ取得
                  var data = fs.readFileSync(path.join(__dirname, 'htmlデータ格納先', urlParse.pathname));

                  // 文字コード判定
                  var charset = jschardet.detect(data)

                  if (charset.encoding == 'SHIFT_JIS') {
                    // shift-jisなら文字コード変換
                    var source = iconvLite.decode(new Buffer(data, 'binary'), "Shift_JIS");
                    res.setHeader("Content-Type", "text/html; charset=UTF-8");
                    res.end(source);
                  } else {
                    // shift-jis以外
                    next();
                  }
                  
                } else {
                  next();
                }
              }
            ]

        }
    });
});

gulp.task("default", ['server']);
```

これで読み込むファイルがhtmlかつShift_JISの場合に、UTF-8へ変換されBrowsersync上でも文字化けしなくなります。

単純に変換しているだけなのでjsファイルなどは諦めたほうがいい場合もあると思いますが、
cssなどは強制的に変換させても大丈夫そう。
SparkのDataFrameReaderに渡すパスから存在しないものを予め除外する

SparkのDataFrameReaderの `json` メソッドには、HDFSやS3に対するglobパターンを複数指定できます。

```scala
sqlContext.read.json(
  "s3://mybucket/data/year=2016/month=11/day=*/",
  "s3://mybucket/data/year=2016/month=12/day=*/",
  "s3://mybucket/data/year=2017/month=01/day=*/"
)
```

ただし、マッチするオブジェクトが一つも存在しないようなパスが含まれているとエラーになります。

```
org.apache.spark.sql.AnalysisException: Path does not exist: s3://mybucket/data/year=2017/month=01/day=*/;
```

今のところエラーを無視して存在するパスだけ読み出すようなオプションは用意されていないようです。
このため、予めglobパターンに対してマッチするオブジェクトが存在するかを確認する必要があります。
これは `org.apache.hadoop.fs` パッケージを利用すると実現できます。

```scala
import java.net.URI
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.SparkContext
import org.apache.spark.deploy.SparkHadoopUtil

def checkPathExists(path: String): Boolean = {
  val fs = FileSystem.get(new URI(path), sc.hadoopConfiguration)
  val p = new Path(path)
  val qualified = p.makeQualified(fs.getUri, fs.getWorkingDirectory)
  val glob = SparkHadoopUtil.get.globPathIfNecessary(qualified)
  glob.nonEmpty && fs.exists(glob.head)
}
```

```scala
checkPathExists("s3://mybucket/data/year=2017/month=01/day=*/")
// => false
```

### 参考

* https://github.com/apache/spark/blob/v2.0.2/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/DataSource.scala#L380-L391
Qiitaでいいねした投稿一覧を表示する

いつの間にという感じですが、自分がいいねした投稿の一覧が見られるようになってました。というか、別のユーザーのいいねした投稿一覧も見られるようですね。

導線は以下 (URLは http://qiita.com/akira-hamada/like)

1. [プロフィールページ](http://qiita.com/akira-hamada)の [[n items](http://qiita.com/akira-hamada/items)]タブ をクリック (contributionグラフの下にある)
2. [[いいねした投稿](http://qiita.com/akira-hamada/like)] タブをクリック
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 6日目(バトル画面ロジック実装　その2)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 13日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

前回に引き続きバトルのロジックを組みたいと思います。
攻撃を押したら、敵を選択する項目を表示するところまでやります。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#構造体作成

各キャラで共通で使用するステータスの構造体を作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/154d59e6-c4a8-d72d-3d40-5c423e9d589f.png)

現段階では、ひとまずこれだけあれば大丈夫だと思います。

#敵を動的生産

敵を選択する項目を作成します。

とりあえずGameStateに仮のステータス値を作成します。
ステータスを格納するEnemyList、敵の画像を格納するEnemyTextuerListという変数を追加して、変数に格納します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/20e7c2bf-9f11-0b9c-4307-84b92abb19f6.png)

ステータスは後でCSVとかでまとめて表で管理するようにしますが、ロジック実装最優先なので、一旦これで行きます。

レベルブループリントに敵を動的生成するロジックを入れます。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/7924847a-681e-e0d2-8a05-1a1932cd75b8.png)

色々と突っ込みどころがありますが、やりたいことは敵のアクターブループリントを生成して、画像とステータス構造体を変数としてセットし、画面に表示させているだけです。

たぶん、これだけだと画面にカスが残りそうなのですが、一旦後回しにしたいと思います。

#敵選択エレメントの動的生産

攻撃のコマンドを選択した時に、攻撃対象を選択するロジックを組みたいと思います。

まず、エレメントのUIを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/4b115ef2-9be3-6e57-d64b-af373d5bcbe7.png)

デザイン調整はあとでやります。
変数も新規に作成します。ここからコマンド選択した値をListに格納する予定です。
ついでに名前を表示するようにしました。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/ddf75b52-685b-252b-35f6-873413bb8c2c.png)

続いて、エレメントを表示するロジックを作成します。
まず、マクロを二つ作成します。

一つ目、選択項目を全て削除するマクロを作成しました
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/7d730ce7-5883-82ef-b24b-169cc3a34774.png)
単純にGetChildrenCountで子の数をForLoopでまわして、RemoveChildAtで削除しているだけです。

二つ目、敵選択項目を表示するマクロです。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/b8ac6afa-dd0e-0232-7e0c-f0be5aff6264.png)

この二つのマクロを攻撃ボタンを押した時に実行するようにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/42443d10-062a-a058-763c-9ab25e513416.png)

#敵選択のエレメント表示

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/799a2a74-35bc-0ea1-b93e-e3514de1d0e9.png)

無事エレメントを表示することが出来ました。
３体の攻撃コマンドを格納して、次はいよいよ敵のHPを減らすロジックを組みたいと思います。

残り１１日なのに、まだまだ実装項目があって絶望していますが、それでも出来る限り２５日完成を目指して頑張ります。
ciscoスイッチ・ルーターの基本設定2(IPv6)

メモなので適当なところはあしからず

ipv6を有効化を忘れないように
`(config)# ipv6 unicast-routing`

##ルーティング
###IPv6スタティックルート
・アドレスを指定する方法
`(config)# ip route [宛先NW]/[プリフィックス長] [ネクストホップアドレス]`
・ifを指定する方法
`(config)# ip route [宛先NW]/[プリフィックス長] [IF名]`

###IPv6デフォルトルート
・アドレスを指定する方法
`(config)# ip route ::/0 [ネクストホップアドレス]`
・ifを指定する方法
`(config)# ip route ::/0 [FI名]`


##RIP
###RIPの設定
・タグ名は関係するすべてのルーターで統一する
`(config)# ipv6 router rip [タグ名]`

###アドバタイズ
・インターフェースごとに指定
`(config-if)# ipv6 rip [タグ名] enable`

###デフォルトルートの伝搬
`(config-if)# ipv6 rip [タグ名] default-information originate`


###RIPの確認
`# show ipv6 rip`


##OSPFv3
###OSPFの設定
OSPFプロセスの起動
`(config)# ipv6 router ospf [プロセス番号]`

ルーターIDの設定
`(config-rtr)# router-id [ID]`

プロセスへの参加
インターフェースモードへ移行し、OSPFプロセスへ参加させる
`(config-if)# ipv6 ospf [プロセス番号] area [エリア番号]`

###passive-interface
Helloメッセージの送信の停止
`(config-rtr)# passive-interface [IF名]`

###デフォルトルートの伝搬
`(config-rtr)# default-information originate [always] [metric-type {1|2}]`



##IPv6 ACL

名前付き拡張ACLのみ

###リスト設定
`(config)# ipv6 access-list [名前]`
`(config-ipv6-acl)# deny tcp [送信元アドレス] [送信先アドレス] [eq プロトコル]`

例:
`(config-ipv6-acl)# deny tcp 2001:db8:acad:1::/64 2001:db8:acad:a::/64 eq telnet`
`(config-ipv6-acl)# deny tcp 2001:db8:acad:1::/64 2001:db8:acad:a::/64 eq 22`

###IFへ適応
`(config-if)# ipv6 traffic-filter [名前]`

###VTYへ適応
`(config-line)# ipv6 access-class [名前]`

###リスト確認
`# show ipv6 access-list [名前]`
`# show access-lists`

##DHCPv6
###基本設定
`(config)# ipv6 dhcp pool [プール名]`
`(config-dhcpv6)#address prefix [割り当てるv6NWアドレス]/[プリフィクス長] lifetime　[有効リース時間] [推奨リース時間]`
`(config-dhcpv6)#dns-server [DNSサーバアドレス]`
その他v4と同様な項目が設定可能

###IFへの適応
`(config-if)# ipv6 dhcp server [プール名] `
`(config-if)# ipv6 nd managed-config-flag `
`(config-if)# ipv6 nd other-config-flag`

managed-config-flagにnoをつけるとステートレス
`(config-if)# no ipv6 nd managed-config-flag `

###設定の確認
`# show ipv6 dhcp pool`
`# show ipv6 dhcp binding`
`# show ipv6 dhcp interface`
`# debug ipv6 dhcp`

###DHCPリレー
インターフェースモードで
(config-if)# ipv6 dhcp relay destination [DHCPサーバアドレス]
ユーザー認証はクライアント側のパスワード保存に(100%ほど)依存すると潜める危険

_この記事は個人の見解であり、所属する組織の公式見解ではありません。_

辛い思い出ありますので言えますが、ユーザー認証はクライアント側のパスワード保存に依存してはいけません ^^; 通常認証に使わなくても、IDFVとかのバックアップ用端末->アカウント紐付き情報を取ってね。

数千人、数万人のクライアント側パスワード情報がバグによって同時に消えることありますので^^

ゲーム滅亡を避けましょう^^

# 実際にあった話

うちのチームのローンチ時に起きました。

数千人のクライアント側パスワード情報が同時に消されました。

IDFV情報を持っていたおかげでユーザーログインに影響なかったですが、その情報がなかったら数千人がCSに連絡するor二度とプレイできません。ゲームの規模がより大きくて数万人、数十万人の被害者が出た場合、地獄を想像します ^^;

##滅亡の作り方

### 名前/PWがないとユーザー認証できない仕組み
クライアント端末とサーバーアカウントを紐づけるのは、クライアント側のキーチェインに保存するユーザー名とパスワード。のみ。IDFVとははサーバーが保存しません。

```
//サーバー側のユーザー情報でPWを保存しますが、IDFVとかを保存しません
CREATE TABLE `USER_INFO` (
  `USER_ID` varchar(32) NOT NULL COMMENT 'ユーザーID',
  `PASSWORD` varchar(32) NOT NULL COMMENT 'パスワード',
  //...
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザー情報';
```

###クライアント側名前/PWリセットロジック
クライアント側に「ユーザー情報がサーバーにない場合、クライアント側ユーザー名とパスワード情報をリセット（==削除）する」ロジックを置きます。

こんなロジックは珍しくないです - 開発環境等でたまたまDBがリセットされていますので、デザイナーとテスターから「簡単にクライアントをリセットさせて」の要望がよく来ます。

```
//ログインAPIを叩いてみる
error_message = login_to_server();
//サーバーにユーザーが存在しない場合...
if(error_message == USER_NOT_FOUND) {
     delete_password_from_keychain(); //...認証用名前/PWを削除
}
```

### サーバー側バグ（一つ）
負荷とかによってサーバーがDBに繋がれない時、例外とかじゃなくてUSER_NOT_FOUNDレスポンスを返します。

```
//ユーザーIDからユーザー情報を取得
try {
     $user = get_user_info($user_id);
} catch (Exception $e) { //<-- バグはここ - 例外種類を確認ぜす、どんな例外でもUSER_NOT_FOUNDを返す
     return new Response(USER_NOT_FOUND);
}
```

##滅亡への流れ

1. 本番が公開されて、最初の日から人気

2. 人気なので、負荷でDBが落ちてしまう

3. DBが落ちたせいで、ログインAPIはUSER_NOT_FOUNDレスポンスを返す

5. クライアント側がユーザーの名前とパスワードを削除する

6. 数分に数千、数万人がログインAPIを叩いてパスワードをなくす

7. 滅亡

# 「実際の話」は他のゲームでも意外と起きられる理由

「実際の話」系現象は、うちと関係ないチームでもまた起きたらしいです - 間違いなくバグですが、初心者チームで負荷時レスポンスは確認されない時が多いです（別な話ですが、負荷テストが大事！）

なお、「実際の話」より恐ろしいなのは、上記以外のバグもpw削除を呼び起こせます。クライアント側ロジックミス、pw上書きなど。特定なシチュエーションで潜んだバグが動き始める場合、同時に数万人のpwが消える結果は同じです。

#対策

こちらの対策として、端末に保存するもの以外の緊急紐付きを用意する - IDFVとか、Facebookアカウントとか。

IDFVも100%信頼できません。どんなIDでも、事情によって問題が起きるかもしれません（数年前の例ですがいきなりAppleがAdvertising IDの利用を禁止にしました - 間違って認証内でAdvertising IDを使っていたゲームはいきなり申請通らなくなりました）。ですが、重要なのは、IDFVとキーチェインデータの両方が同時に使えなくなる可能性はかなり低いです。（と信じたい ^^; ） 問題があったら、どれかから復活でるはずです。（と信じたい ^^; ）

あと、まあ負荷テストは大事ですね^^
Function Calling Convention (x86-64)

最近アセンブラを勉強しているため、そのメモ用です。
基本的に64bit環境でOSはLinuxを前提としており、アセンブラの文法はAT&Tです。
#関数の引数に利用されるレジスタ
引数の型により使用されるレジスタが異なる。
##整数型 / ポインタ型
###rdi
第1引数を保持するレジスタ
###rsi
第2引数を保持するレジスタ
###rdx
第3引数を保持するレジスタ
###rcx
第4引数を保持するレジスタ
###r8
第5引数を保持するレジスタ
###r9
第6引数を保持するレジスタ
***
上記は整数型、ポインタ型の引数に利用され、最大6個の汎用レジスタを利用することができる。
ただし、引数の型に応じてレジスタのプレフィックスは変化する。
int32型なら、r → e になる。
##浮動小数点型
###xmm[0-7]
最大8個のxmmレジスタを利用することができる。
***
レジスタが足りないときはスタックを利用する。
##SIMDデータ型
##xmm[0-7]
SIMDデータ型が64 or 128bit
##ymm[0-7]
SIMDデータ型が256bit
##zmm[0-7]
SIMDデータ型が512bit
#関数の戻り値に利用されるレジスタ
%eax、%rax、%rdx、%xmm0、%ymm0、%zmm0
上記以外にも使われるレジスタがあるみたいだが、基本的に上記だと思えば良さそう。
#自由に使用可能(Callee Saveでない)なレジスタ
##rax、rcx、rsi、rdi、r[8-11]、xmm[0-15]、ymm[0-15]
#Callee Saveなレジスタ
##rbx, rbp, r[12-15]
***
まだまだ勉強中なので、適宜更新する予定です。
#参考
http://www.agner.org/optimize/calling_conventions.pdf
エフェクト制作ツール「Effekseer」について + 他色々

![customLogo.png](https://qiita-image-store.s3.amazonaws.com/0/11172/a918abac-a5d5-c44c-2320-37132f103acc.png)

# Effekseerとは

Effekseerとは主にゲームのエフェクトをデザインするためのツールと、
それでデザインしたエフェクトを再生するためのライブラリがセットになったものです。
ゲーム全体の面倒を見るゲームエンジンとは異なり、"エフェクト"というゲームの一部分を担当します。

詳細は公式サイトを見てください。

公式サイト
http://effekseer.github.io/jp/index.html

## オープンソース
オープンソースで開発しており、ソースコードはGithubから見ることができます。
https://github.com/effekseer/Effekseer

有志の力により、色々な環境向けインテグレーションも行われています。
https://github.com/search?utf8=✓&q=Effekseer

# エフェクトとは

エフェクトはプレイヤーに情報を伝える手段でもあります。

![01.gif](https://qiita-image-store.s3.amazonaws.com/0/11172/1ade52e8-5e6f-d3c7-30de-28589a8672f4.gif)![03.gif](https://qiita-image-store.s3.amazonaws.com/0/11172/45909f2a-9395-99ce-3779-e33a9f0c750e.gif)

- 攻撃がヒット → 打撃、斬撃のエフェクト
- パワーをためる → パーティクルが集まるエフェクト
- ビームを撃つ → 当たっちゃマズそうなビームのエフェクト

などなど、とても分かりやすい。
なんか気づかないうちに撃たれて死んでた。ということはゲームでは有ってはならないのです。
危なそうなモノが飛んでくるけど、避けられずに当たって死んだ。ならOKです。

![01 (1).gif](https://qiita-image-store.s3.amazonaws.com/0/11172/6405bd87-3a43-69a9-64be-ceebba042a0c.gif)![02.gif](https://qiita-image-store.s3.amazonaws.com/0/11172/3a525163-2500-5cb5-6772-2d01b932a5c7.gif)![04.gif](https://qiita-image-store.s3.amazonaws.com/0/11172/de8abe8e-0c10-cee3-2708-11a93f9ebb10.gif)

他にも迫力を出すことにもエフェクトは使えます。
キラキラ、ピカピカさせるとゲームが煌びやかになります。
それだけでゲームは面白く見えるものなのです。第一印象は大事ですね。

# 謝辞
ここからエフェクトをお借りしました。
各エフェクトの作者様ありがとうございます。

Effekseer - 投稿エフェクト
http://effekseer.github.io/jp/contribute.html

# 他のエフェクト制作ツール

世の中にはエフェクト制作ツールが意外とたくさんあります。
うえしたが知っている限りですが、ざっくり紹介します。

### BISHAMON
http://www.matchlock.co.jp/products/
国産で老舗のツールです。
沢山の商用ゲームで使われており一番ノウハウを持っていると思います。

毎年[ゲームエフェクトコンテスト](http://www.gameeffectcontest.com)を開催していて、
ゲーム業界のVFXを盛り上げようと精力的に活動されています。

### SPARK GEAR
http://sparkgear.net
最近登場した国産ツールです。気になります！
ただ、初期費用100万円＋月額20万円なので個人にはちょっと手が出ないです…

### Prominence3D
http://game-hikidashi.com/category/prominence3d/
お値段が2600円(税抜)とかなりお安いツールです。
連番画像書き出しがメインで、RPGツクールで使う人が多いとか。
最近、DirectX9向けのランタイムライブラリをリリースしたみたいです。

### PopcornFX
http://www.popcornfx.com
海外製で一番有名なツールです。とにかく機能が多いです。
ツール自体は無料で、エンジンの各ターゲット向けのプラグインが$250だそうです。

### Unity - ParticleSystem (Shuriken)
https://docs.unity3d.com/ja/current/Manual/class-ParticleSystem.html
Unity標準のエフェクトシステムですね。
Unity 5.5でかなり[パワーアップ](https://blogs.unity3d.com/jp/2016/08/30/get-the-unity-5-5-beta-now/)したとか。

### Unreal Engine - Cascade
https://docs.unrealengine.com/latest/JPN/Resources/Showcases/Effects/index.html
Unreal Engine 4標準のエフェクトシステムですね。
Niagaraという新しいエフェクトシステムも開発中だそうです。

# 終わりに

ゲームにとってエフェクトは超大事です。
しかしいまどきエフェクトをハードコーディングなんて辛いだけなので、
上記に挙げた便利なものを使って楽をしましょう。
Kobitoでタグを編集した時にそれが保存されないことがある


Kobitoでタグを編集した後に、タグ入力部分にカーソルを置いたままで⌘Wでウィンドウを閉じると、タグが保存されません。
記事本文は⌘Wで保存も同時にされるので、この挙動は不便です。
perl のオブジェクトと python の class その1.


`perl` と対比させてく。

## 基本1

```perl:perl
package Foo;
sub new  { bless { a => pop }, shift }
sub echo { print shift->{a}, "\n" }
1;

Foo->new("foo")->echo ;
```

```python:python
class Foo(object):
    def __init__(self,a):
        self.a = a
    def echo(self):
        print(self.a)

Foo("foo").echo()
```

## 基本2

```perl:perl
package Foo;
sub new { bless {}, shift }
sub add { ++ shift->{c} }
1;

my $c = Foo->new ;
print $c->add . "\n" for 0 .. 9 ;
```

```python:python
class Foo(object):
    def __init__(self):
        self.a = 0
    def add(self):
        self.a = self.a + 1
        return self.a

o = Foo()
for i in range(10):
    print (o.add())
```

## 引数をハッシュ(辞書)で

```perl:perl
package Foo;
sub new   { bless { c => 10, @_[1..$#_]}, shift }
1;

use Data::Dumper ;
my $obj = Foo->new( d => 10) ;
print Dumper $obj ;
```

```python:python
class Foo(object):
    def __init__(self, **args):
        self.__dict__ = { 'c':10 }
        self.__dict__.update( args )

o = Foo(d=10)
print (vars(o))
```


## シングルトン

```perl:perl
package Foo;

my $s ;
sub new { $s ||= bless {}, shift ; }
sub add { ++ shift->{c} }

1;

my $o = Foo->new ;
my $p = Foo->new ;
print  $o . "\n";
print  $p . "\n";
print $o->add . "\n";
print $p->add . "\n";
```


```python:python
class Foo(object):
    _instance = None
    def  __new__(cls):
        if cls._instance is None:
            cls._instance = object.__new__(cls)
        return cls._instance
    def __init__(self):
        self._x = 0
    def add(self):
        self._x = self._x + 1
        return self._x

o = Foo()
p = Foo()
print (id(o))
print (id(p))
print (o.add())
print (p.add())
```

## コールバック

もちょっと真面な例に差し替え予定

```perl:perl
package Foo;
sub new     { bless pop, shift ; } ;
sub execute { shift->(pop); }
1;

my $obj = Foo->new( sub { print $_[0] ; } ) ;
$obj->execute( 'foo' ) ;
```


```python:python
#from __future__ import print_function
class Foo(object):
    def __init__(self, f):
        self._f = f
    def execute(self):
        self._f()

o = Foo(lambda : print ('foo'))
o.execute()
```

- 2系で使いたければコメントをアンコメント
honcho の Procfile に書く process type は - が使えなくて1時間以上ハマったので見せしめに書いておく。

タイトルで全部言い切ってしまったシリーズ

python の honcho の Procfile に書く process type は `-` が使えないので注意しましょう(´・ω・`)

起動時にこんなエラーでます。

```
2016-12-14 12:08:16 [42] [ERROR] Process type 'process-type' does not exist in Procfile
```

小一時間ぐぐっても誰もこんなミスしていなかったので、メモ代わりにどうぞ。
OpenSiv3D の機能紹介[1]

Window と macOS に対応する次世代 Siv3D **「OpenSiv3D」** の開発がオープンソースで進行中です。
OpenSiv3D は Siv3D の公開から 4 年間で積み上げてきた知見と技術をもとにゼロベースから設計を見直し、これまで以上に短いコードと便利な機能を実現する計画です。

現在の最新バージョンは 2016 年 12 月 14 日にリリースされた [OpenSiv3D 0.0.5](https://github.com/Siv3D/OpenSiv3D) です。
現時点では低レイヤ部分の実装がメインで、まだ画面への描画や音楽の再生はできませんが、リンク先の SDK をインストールすれば、通常の Siv3D Package のように簡単にインストールし、実装されている機能を試せます。

今回の記事ではその中からいくつかの面白い機能を紹介します。
これだけではゲームやアプリ開発にどう便利なのかイメージがつきにくいかもしれませんが、のちのち開発が進めばその威力が発揮されます。楽しみにしていてください。

#### 0 から 100 までの合計を求める
```cpp
Log << Range(0, 100).sum(); // 5050
```

#### 0 から 100 のうち 20 未満の個数を調べる
```cpp
Log << Range(0, 100).count_if(LessThan(20)); // 20
```

#### 100 の階乗 (100!)
```cpp
Log << Range(1, 100).reduce1(Multiplies<BigInt>());
// 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
```

#### 111122223333 以上の素数を小さい順に 5 つ探す
```cpp
Log << InfiniteList(111122223333).filter(IsPrime).take(5);
// {111122223337,111122223347,111122223353,111122223361,111122223367}
```

#### 0 から 9 の数をシャッフル
```cpp:従来
Array<int32> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Shuffle(v);

Log(v); // {8,4,3,7,0,5,6,2,9,1}
```

```cpp:OpenSiv3D
const Array<int32> v = Range(0, 9).asArray().shuffle();

Log << v; // {8,4,3,7,0,5,6,2,9,1}
```

#### 文字列フォーマット
```cpp:従来
int32 time = 20;
Log(L"残り時間 {} 秒"_fmt, time); // 残り時間 20 秒
```

```cpp:OpenSiv3D
int32 time = 20;
Log << L"残り時間 {} 秒"_fmt(time); // 残り時間 20 秒
```

#### 中心が (30, 30), 大きさが (40, 50) の長方形を作る
```cpp:従来
const Rect r = Rect(40, 50).setCenter(30, 30);
```
```cpp:OpenSiv3D
const Rect r(Arg::center(30, 30), 40, 50);
```

#### 10 秒経過するまで実行
```cpp:従来
for (Stopwatch s(true); s.elapsed() < 10s; )
{
	// DoWork();
}
```

```cpp:OpenSiv3D
for (Stopwatch s(true); s < 10s; )
{
	// DoWork();
}
```

#### コンソールウィンドウから数を入力し、その 2 倍の数をログに出力する
```cpp:従来
Console::Open();

int32 n;

std::wcin >> n;

Log(n * 2);
```

```cpp:OpenSiv3D
Log << Console.read<int32>() * 2;
```

#### さいころの結果を 10 個生成
```cpp:従来
Array<int32> v;

for (int32 i = 0; i < 10; ++i)
{
	v.push_back(Random(1, 6));
}
```

```cpp:OpenSiv3D
const Array<int32> v(10, Arg::generator = RNG(1, 6));
```

このほかに現時点での特筆すべき機能として

* 実行時のクラッシュの回避 (Windows 構造化例外処理)
* 新しいファイル圧縮方式 (Zstandard)
* constexpr 対応の強化
* マルチスレッド処理の強化

が挙げられます。

OpenSiv3D の今後のアップデートにご期待ください。
開発への参加は [Siv3D Slack #open-siv3d チャンネル](https://siv3d.slack.com/messages/open-siv3d/details/) にてお待ちしています。
Python での外部コマンド実行


@共用サーバ / `pyenv` or `anaconda` が無い環境

`IPC::Open3` に該当するものは何かググる。
↓

`subprocess` 推奨してる。

だけど、、、

↓

`Python` 2系では標準のは使わず、`subprocess32` 使えと明記してある。

なんじゃそれ?
普通に、差し替えといてくれりゃいいのに。

ルート権限持ってないから `pip` でローカルに入れる。

## subprocess32 のインストール

もちろん、`Python` のバージョンは 2系にしてから。

```shell-session:
$ pip install --install-option="--prefix=$HOME/share" subprocess32
#$ export PYTHONPATH=$HOME/share/lib64/python2.6/site-packages:
```

## んで2系と3系でライブラリの呼び出しを変える

```python:
import sys
import platform
py_version = platform.python_version_tuple()[0]

if  py_version == 2:
    sys.path.append('/home/bunzaemon/share/lib64/python2.6/site-packages')
    from subprocess32 import Popen, PIPE
else:
    from subprocess   import Popen, PIPE
```

`try` 使う方が `Python` っぽい気もするけど、、、

## Popen 

Popen は

- 2系では string 型
- 3系では byte 型

を返す。string に変更しないとまともに扱えない[^2]。

[^2]: `utf-8` の出力をしていないのに `decode("utf-8")` しないとスクリプトが通らない @`Python2.6.6`

```python:
cmd  = 'ls -al'
p = Popen(cmd.split(), stdout=PIPE, stderr=PIPE)
out = ( p.communicate()[0].split("\n")            if py_version == 2 else
        p.communicate()[0].decode("utf-8").split("\n") )

for line in out:
    print (line)
```

`comunicate()[1]` にエラー。

普通に `IPC::Open3` っぽく使う方法もあるが、とりあえずは、推薦されてる `comunicate` に慣れよう。

#### 全ソース

```python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ライブラリ群のインポート
import sys
import platform

py_version = platform.python_version_tuple()[0]
if  py_version == 2:
    sys.path.append('/home/bunzaemon/share/lib64/python2.6/site-packages')
    from subprocess32 import Popen, PIPE
else:
    from subprocess   import Popen, PIPE

cmd  = 'ls -al'
p = Popen(cmd.split(), stdout=PIPE, stderr=PIPE)
out = ( p.communicate()[0].split("\n")            if py_version == 2 else
        p.communicate()[0].decode("utf-8").split("\n") )

for line in out:
    print (line)
```
新スタイルの基底クラスについてのメモ


class Foo(object):

行き着くサイト。どこもかしこも、さらっと

```python:
class Foo(object):
    pass
```

とは書いてあっても、その `object` とは何ぞやの説明してくれない、、、
`object` でググっても、オブジェクトに変換して検索してくれやがるし、、、

適切な検索語を手にしてないと、どろ沼に嵌ると言う、良い経験をした[^1]。

[^1]: 検索語を手にした後は、色々なサイトで言及を確認出来た訳で、、、

## class object

>ユーザ定義の属性やメソッドを持たない、新しいオブジェクトを返します。 object() は新スタイルのクラスの、基底クラスです。これは、新スタイルのクラスのインスタンスに共通のメソッド群を持ちます。

[引用元](http://docs.python.jp/2/library/functions.html#object)


## 旧と新クラス(原文)
>まず、 Python 2.2 は本当に 2 種類のクラスを持っているのだ、ということを知る必要があります: クラシック、あるいは旧スタイルクラス、と、新スタイルクラスです。旧スタイルクラスのモデルは、以前のバージョンのクラスモデルと完全に同じものです。このセクションに記述する全ての新機能は、全て新スタイルクラスだけに適用されるものです。この逸脱が未来永劫続くことは望まれていません; 最終的には旧スタイルクラスは撤廃されます。たぶん Python 3.0 で。

[引用元](http://docs.python.jp/2/whatsnew/2.2.html#old-and-new-classes)


## メモ

- 「新スタイルクラス」といえども、Python 2.2 の時代の新スタイルだから、相当古い[^2]。
- 旧スタイルクラスは使わない様にしよう。

[^2]: 2001 年だと。
LaTeXで目次に「参考文献」が表示されない.

LaTeXで文章を作成するとき, ujbook などを利用していると目次に「参考文献」が表示されないことに気づきました. [こちらの記事](http://qiita.com/0x60df/items/dea185af9a3832430afd)を参考に簡単に修正することができました. 

# 原因
`ujbook.cls`中では `thebibliography` 環境について

```latex:ujbook.cls
\newenvironment{thebibliography}[1]
{\chapter*{\bibname\@mkboth{\bibname}{\bibname}}%
   \list{\@biblabel{\@arabic\c@enumiv}}%
        {\settowidth\labelwidth{\@biblabel{#1}}%
         \leftmargin\labelwidth
         \advance\leftmargin\labelsep
         \@openbib@code
         \usecounter{enumiv}%
         \let\p@enumiv\@empty
         \renewcommand\theenumiv{\@arabic\c@enumiv}}%
   \sloppy
   \clubpenalty4000
   \@clubpenalty\clubpenalty
   \widowpenalty4000%
   \sfcode`\.\@m}
  {\def\@noitemerr
    {\@latex@warning{Empty `thebibliography' environment}}%
   \endlist}
```
と記述されており, 生成される.tocファイルに参考文献のリストが追加されません. したがって, これに

```latex
\addcontentsline{toc}{chapter}{\bibname}
```
を追記すればよいとのことでした. 

# 解決法1
プリアンブルや.styの中に, 

```latex
\makeatletter
\renewenvironment{thebibliography}[1]
{\chapter*{\bibname\@mkboth{\bibname}{\bibname}}
   \addcontentsline{toc}{chapter}{\bibname}%
   \list{\@biblabel{\@arabic\c@enumiv}}%
        {\settowidth\labelwidth{\@biblabel{#1}}%
         \leftmargin\labelwidth
         \advance\leftmargin\labelsep
         \@openbib@code
         \usecounter{enumiv}%
         \let\p@enumiv\@empty
         \renewcommand\theenumiv{\@arabic\c@enumiv}}%
   \sloppy
   \clubpenalty4000
   \@clubpenalty\clubpenalty
   \widowpenalty4000%
   \sfcode`\.\@m}
  {\def\@noitemerr
    {\@latex@warning{Empty `thebibliography' environment}}%
   \endlist}
\makeatother
```
を書く. 


# 解決法2
本文中 (`\begin{document}`から`\end{document}`の間) で参考文献について記述する部分 (`\bibliography{bib_file}`など) の直前に

```latex
\addcontentsline{toc}{chapter}{\bibname}
``` 

を書くことでも解決できました.
ARM評価ボードの改修

#はじめに
STM32に外部からクロックを入力するためにはARM評価ボードを改修する必要があります。
ARM評価ボードを改修してみたのでそれについてまとめました。

#使用機器
[水晶発振子](http://akizukidenshi.com/catalog/g/gP-08667/)
8MHzの水晶発振子を使用しました。

セラミックコンデンサー
手持ちの部品の関係により10pFのセラミックコンデンサーをハンダ付けしました。
（容量は20pFの方がよい？）

チップ抵抗
ARM評価ボードに実装されている0[Ω]の抵抗を使用しました。

#改修内容
改修内容は以下となります。

手順1)セラミックコンデンサーをハンダ付けする
表面のC33,C34にセラミックコンデンサーをハンダ付けします。

手順2)チップ抵抗を外す
裏面のSB16,SB50,SB54,SB55からチップ抵抗を外します。
このチップ抵抗は手順3で使用するので取っておきます。

手順3)チップ抵抗をハンダ付けする
手順2で外したチップ抵抗を表面のR35,R37にハンダ付けします。

手順4)水晶発振子をハンダ付けする
水晶発振子は最後にハンダ付けした方が邪魔にならなくていいと思います。

![board.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/c4bc6dee-9445-21e8-c972-ed1f235b4d72.jpeg)

#まとめ
一応動作しているようです。
本当に期待する周波数で動作しているかは確認できていません。

あまり英語が得意ではありませんので、
改修内容が間違っている可能性があります。
ARM評価ボードを改修する場合は自己の責任で改修をお願いします。
Magento2のCSVを楽に作る　ビッグデータ用ツール「Talend」を便利に使おう 

# 楽しよう！

とあるプロジェクトで、某ECからMagento2へ移行することになりました。
同じECの異なるバージョンでもめんど……もとい大変なデータ移行。CSVでインポートするのは常套手段かと思いますが、けっして面白くない、しかも厳密な行列データを、何度も作り直すのは厭ですよね。私は厭なのです、めんどくさいし。間違えるし。


そんなとき、便利なのが「[Talend](http://jp.talend.com/)」というソフトウェアです。これで楽しましょう、らくちん素敵。
※画像にぼかしが入っているのが感じ悪くてすいません、SSDがエラーを吐くという災難に見舞われまして、急きょ用意しました。

# Talendってなに？
[Talend](http://jp.talend.com/)ウェブサイトには、「リアルタイムオープンソースデータインテグレーションソフトウェア」とあって、すごいんですけど……今回注目するのは「オープンソース」と「データインテグレーション」。[Talend](http://jp.talend.com/)ウェブサイトをみると、たくさんある製品のうち、今回使うのは商用版では「データ統合」、オープンソース版は「Talend for Data Integration」。
ビッグデータ用に作られたアプリケーションなので、扱えるデータ量は大きいです。処理内容やマシン性能も依存しますが、経験では2万件くらいのデータ作成も10秒未満で終わりました。
ちなみに上記のデータはビッグじゃないですし、私は本当のビッグデータなんて扱ったことがありません。Web開発でデータ量が問題になるケースは、あるのか、な。あったら……お察し申し上げます。


Eclipseで作られているので、動かすにはJAVAが必要で、ときに文字列変換などにJAVAを使うハメにはなりますが、JAVA素人の私もできるので大丈夫でしょう。JAVAになじんだ方なら、ライブラリを読み込んで込み入ったこともできます。

# 何ができるの？
様々なデータベースやCSV、エクセルなどからデータを引っ張って、任意のスキーマをもつデータを生成することができます。つまり「旧ECデータから、Magento2用CSVが作れる」ということです。
[Talend](http://jp.talend.com/)は、データベースに直接データを流し込むこともできますが、Magentoシリーズはデータの挿入先が多岐にわたるので、CSVにすることでMagento用データたることを担保しました。

# GUIでサクッ（？）と
ちょっと羊頭狗肉な小見出しでして、それほどサクッとはいきません。
Magentoは商品に属性（attribute）を追加するとCSVの項目が増えますし、プロジェクトに応じたカスタマイズや、モジュールがあるはず。CSVのスキーマはケースバイケースなので。それでも、使ったほうが楽ちんだと申し上げます。
画面を見てみると、

![alt](http://warpjapan.com/img/talend.png)

こんな感じ。画像では左がスタート、右がCSVエクスポートです。最適化してないので長くて申し訳ない。
さわりを説明すると、緑の枠でカテゴリーデータベースを読み、赤い枠がカテゴリ名を参照。それらがくっついた矢印マーク（tJoin）で、「category_id, category_name」のデータを作成しました。
次の青い枠（tMap）では、プロダクトデータベースを読み、上記を参照してプロダクトとカテゴリ名がセットになったデータを生成しています。
tMapは、SQLでいうJOINや、行の入れ替えが簡単にできるので、よく使う機能です。中をちょっと見てみますと、

![alt](http://warpjapan.com/img/talend_tmap.png)

左（元のデータベース）を、右（希望のやつ）にマッピングしています。
ほかに、「データベース上で”消去済み”カラムがTrueなら、その行はフィルタする」とか、「日本語の生産国を国名コードとアルファベットに置換する」（参照でJOINしてもOK)など、作業を希望のスキーマに当てはまるよう繰り返すとMagento用のCSVができあがります。
できあがりは、こんな感じ。

![alt](http://warpjapan.com/img/talend_out.png)

エクセルだっと間違えそうなデータが、ボタンをポチっとするだけで生成されます。素敵じゃないですか？　今回のプロジェクトでは、400件程度の商品CSVが、5秒でできあがりました。

# ちょとしたコツ
もちろん一発で完璧なことはないので、トライ＆エラーの繰り返しは必要です。コツがあるとすれば、

1. 一度にたくさんの行をインポートするのは、とくに最初はやめましょう。まずエラーが出るので、へこみます
2. 取っておくとお得そうな項目は消さないでおきましょう。開発を進めるとCSVの項目は増加することが多いので、最終段階でtMapをつかって求めるCSVにしましょう
3. 2に関連して、ちょっとしたパズルみたいに、置換や参照を使うとJAVA初心者にもDBノービスにも楽ちんです。ビッグじゃないデータなら処理がちょっと増えてもOKです、たぶん
4. お客様のデータが入っているデータベースなどは、安全な場所にインポートしてからやりましょう。苦手な人は、インフラ系の人に相談しましょう
5. ヒマなときに触って慣れておき「あ、こういうケースに使えるのかー」という感触を味わっておくと、気が滅入りません

# おわりに

駆け足で紹介して、さわりだけ説明になりましたが、「こりゃ、楽そうだな」と思っていただければ幸いです。親しみやすいソフトウェア……とは言いがたいところもありますが、いろんなケースに応用可能。実際、私はないと不便でしょうがないです。
ちなみに、つくったJobをエクスポートすると、JAVAが動く環境なら単体で動くアプリケーションとしても使えます。素敵ー！


ということで、使ってみませんか？　[Talend](http://jp.talend.com/)。そしてMagento2に移行してみましょう。
[C++] 異なる型を一つの配列で管理するクラス

> 追記:
> Ryooooooga様にBoostやC++17以降を使う方法を教えていただきました。詳しくはコメントで

void*を使ってるので実際に使うときは十分注意。

```C++:test.h
#pragma once
#include <memory>
#include <functional>
#include <vector>
#include <typeindex>

/**
* void*型に変換された実体のデストラクタを正しく読み出すため構造体
* http://faithandbrave.hateblo.jp/entry/2014/06/04/172754
* から参照
*/
struct void_deleter {
	std::function<void(void*)> deleter;

	template <typename F>
	void_deleter(F f)
	{
		deleter = f;
	}

	void operator()(void* p) const noexcept
	{
		deleter(p);
	}

	void_deleter() {};
};

/**
* 型の異なるデータを一つに登録するクラス。
*/
class ObjectClass
{

protected:
	/**
	* 配列.
	*/
	std::vector< std::pair < std::unique_ptr<void, void_deleter>, char* > >value_;

public:
	/**
	* コンストラクタ.デストラクタ.
	*/
	ObjectClass();
	~ObjectClass();

	/**
	* 配列の後ろに追加
	* @param val 色々な型データ.
	*/
	template <typename T>
	void  push_back(const T &val) {
		// 通常のnewと、void_deleter構造体(unique_ptr用)をセットにして追加。
		value_.push_back( make_pair( std::unique_ptr<void, void_deleter>(static_cast<void*>(new T(val)), [](void* p) { delete static_cast<T*>(p); }),const_cast<char*>( typeid(T).name() ) ));
	};
	/**
	* 登録したものをargsに参照渡し。
	* @param &args 色々な型データ.
	* @param int i 要素番号.
	*/
	template <typename T>
	void get(T &args, int i = 0) {
		T* pdata = static_cast<T*>(value_[i].first.get());
		args = *pdata;
	}
	/**
	* 登録したデータの型名をchar*で返す。
	* @param int i 要素番号.
	* @return char* 要素名.
	*/
	char* get_type(int i) {
		return  value_[i].second;
	}
};
```

使用例

```C++:MFC
//日本語を指定
setlocale(LC_ALL, "japanese");
std::unique_ptr<ObjectClass>data(new ObjectClass());
// input
int int_input(1);
char* char_input("hoge");
CString cstring_input("データ");
// 配列に追加
data->push_back(int_input);
data->push_back(char_input);
data->push_back(cstring_input);
// 比較用に別の内容に差し替え
int_input = 11;
char_input = "hogehoge";
cstring_input = "データデータ";
// 出力先
int int_output(-1);
char* char_output("char not found");
CString cstring_output("cstring not found");
// 出力
data->get(int_output);
data->get(char_output, 1);
data->get(cstring_output, 2);
// data->get(cstring_output, 0); //intデータをCStringへ移動しようとするのでエラー
// 表示
cout << "-----input-----" << endl;
cout << int_input << endl;
cout << char_input << endl;
cout << cstring_input << endl;
cout << "--CString--" << endl;
printf("%S\n", cstring_input);
cout << "-----output-----" << endl;
cout << int_output << endl;
cout << char_output << endl;
cout << cstring_output << endl;
cout << "--CString--" << endl;
printf("%S\n", cstring_output);
cout << "-----type-----" << endl;
cout << data->get_type(0) << endl;
cout << data->get_type(1) << endl;
cout << data->get_type(2) << endl;
// キー入力待ち
getchar();
```
![スクリーンショット 2016-12-15 11.53.59.png](https://qiita-image-store.s3.amazonaws.com/0/76058/d1201d68-1a0b-cb8e-360d-3f803e42b72c.png)
アイデアソンのながれ(体験会１)

こんにちは。

前回の[アイデアソンのながれ（ざっくり）](http://qiita.com/houren/items/53f52c76d9e5754731ea)つづきで、もう少し詳細にふれてみます。


## マンダラート


<img src="https://qiita-image-store.s3.amazonaws.com/0/150624/9ed9d089-9c89-7a38-55b7-7002bd848047.png" width="70%" alt="マンダラート.png">

最初の個人ワークで、「マンダラート」をおこないました。

### マンダラートって？

発想法の１つです。
アイデアを出して出してだしまくる感じ。

体験会でおこなったテーマは「テレビ」でした。

３✕３の９マスを書き、その中心のマスに「テレビ」と書き込みます。（・・①）
その後、周囲８マスにテレビに関するイメージ、ワードを埋めていきます。（・・②〜⑨）

こんなかんじ。
<img width="70%" alt="マンダラート２.png" src="https://qiita-image-store.s3.amazonaws.com/0/150624/b477c257-1c63-3f09-c808-48e89a8f1dc3.png">


次に②〜⑨を最初の画像にある、オレンジの矢印のように、飛散させていく。
そしてそれらの周りを埋めていき、アイデアを研ぎすませます！

この時は、９マスを１分、合計９分で作成するようにいわれたので、かなり頭がヒートアップしました。

次回は、マンダラート以降にやったことにふれていきます〜。

アウトプットして、ちしき固めていくぞ〜。
アイデアソンのながれ(ざっくり)

　　
こんにちは。
アイデアソンについて、体験会の参加を含めてかいてみる。
　　
## アイデアソンとは
　アイデア ＋ マラソンの造語
　(idea + marathon)


## 概要
 - ある特定のテーマについて自由に話し合い、アイデアを出し合うイベント
 - アイデアソン単独の場合と、ハッカソンの前準備として行われることがある

## 主催
 - 企業
 - 農業
 - 自治体　など

## 対象者
 - そのテーマに興味がある人なら誰でも

## アイデアソンの流れ ざっくり
・個人ワーク（マンダラート）
・ペアブレスト
・アイデアスケッチ
・ハイライト法
・アイデアレビュー
・チームビルディング　⇒　ハッカソンへ

   
## アイデアソン体験会にいってみた

行ったのは去年。


![Idea](https://connpass-tokyo.s3.amazonaws.com/thumbs/f0/cd/f0cd1dcbcea5ec0d9a5c04db115c346e.png "Idea")

[アイデアソン体験&ハッカソンLT](https://hack-kansai.connpass.com/event/20216/)

大阪にあるMBS本社1F ちゃやまちプラザが会場で、
はじめましての方たちと、アイデアソンを体験してみよう！といったものでした。

だいたい２時間くらいかけて行いました。
内容は凝縮され、ものすごいスピードで進んでいった気がします。
終わったころは、すこしぼーっとしていました。

さすがマラソン。。

つぎはもうすこし詳細にふれてみます。


アウトプットして、ちしき固めていくぞ〜。
C++ Builder XE4, 10.2 Tokyo > Indy > 自分のIPアドレスを取得する実装

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

自分のIPアドレスを取得する方法を調べた。

Delphi実装は見つかった。
http://embarcadero.newsgroups.archived.at/public.delphi.vcl.components.using/200905/0905052027.html

C++ Builder実装にしてみた。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <IdComponent.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TIdStack::IncUsage();

	String res = GStack->LocalAddress;
	OutputDebugString(res.c_str());

	TIdStack::DecUsage();
}
//---------------------------------------------------------------------------
```

```txt:デバッグ出力(Button1押下後)
デバッグ出力: 192.168.79.31 プロセス Project1.exe (1128)
```

TIdStackのIncUsage()を実行しているのは、上記のリンクで以下の記載があるため。

> Call the TIdStack.IncUsage() class
method to ensure GStack is intialized before accessing it, ie:


このあたりの処理はまだまだ自分の知らないことばかり。

<hr>
(追記 2016/12/15)
「静的メンバ関数」では`TIdStack::IncUsage()`などを処理できない (ビルド時にエラーとなる)。
そのためインスタンスありでのメンバ関数として実装することになる。
Gebの名前の由来を中の人に聞いてみた

# はじめに

これは[Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)の14日目の記事です。
前日は[Gebでtextやtitleでのエレメント取得は遅くなる！？](http://qiita.com/PoohSunny/items/c5beac800c2aaab73e6b)でした。
今日は箸休め的な話にしました。

# Gebの由来は？？
突如気になった、GebってなんでGebって名前なんだろう、という疑問。
安直に考えると<b>GroovyでWebの自動化するからGebなんじゃね！？</b>と思ったのですがどうなんでしょう。

# 中の人に聞いてみた
というわけで、ミーハーなので聞いてみちゃいました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">I suddenly realized. Geb = Groovy + Web !? Am I right? <a href="https://twitter.com/GebFramework">@GebFramework</a></p>&mdash; Yotaro TAKAHASHI (@PoohSunny) <a href="https://twitter.com/PoohSunny/status/808346499373379584">2016年12月12日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 中の人からの回答

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/PoohSunny">@PoohSunny</a> hep, that&#39;s what it is according to <a href="https://twitter.com/ldaley">@ldaley</a> :)</p>&mdash; Geb (@GebFramework) <a href="https://twitter.com/GebFramework/status/808731855407218688">2016年12月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

意訳すると
<b>そうだね（おそらくhepはyepのタイポ）、その通りだよ。@Idealeyによると :)</b>
ちなみにIdaleyさんというのはGebの初代コミッターの人です。
というわけでやっぱり当たってました。

# まとめ
I have a Groovy, I have a Web. ah, Geb![^1]
次はなぜ「げぶ」じゃなくて「じぇぶ」なのかって話を聞こうと思います。機会があれば。

[^1]: ごめんなさいごめんなさいでもこれはやらなきゃと思ったんだ！
iOS 途中からUINavagationControllerを適用する。(Objective-C)

タイトル画面→遷移→UINavigationControllerのように途中からナビゲーションバーを出す。(ヘッダーファイルはいじってないので省略)

###ViewController.m

```
#import "ViewController.h"
#import "NextViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor grayColor];
    UILabel *label= [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMidX(self.view.bounds)-130, CGRectGetMidY(self.view.bounds)-20, 260, 40)];
    label.text = @"最初のビューコントローラーさん";
    label.textColor = [UIColor whiteColor];
    [self.view addSubview:label];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    NextViewController *next = [[NextViewController alloc]init];
    [self presentViewController:next animated:YES completion:nil];
}
@end
```
![スクリーンショット 2016-12-14 20.07.10.png](https://qiita-image-store.s3.amazonaws.com/0/150031/7656e698-ce0f-cfa8-a59d-b314b7e6557e.png)

###NextViewController.m

```
#import "NextViewController.h"
#import "ThirdViewController.h"

@interface NextViewController ()

@end

@implementation NextViewController

- (void)viewDidLoad {
    self.view.backgroundColor = [UIColor yellowColor];
    UILabel *label= [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMidX(self.view.bounds)-140, CGRectGetMidY(self.view.bounds)-20, 280, 40)];
    label.text = @"ネクストビューコントローラーさん";
    label.textColor = [UIColor blackColor];
    [self.view addSubview:label];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    ThirdViewController *third = [[ThirdViewController alloc]init];
    UINavigationController *nv = [[UINavigationController alloc]initWithRootViewController:third];
    [self presentViewController:nv animated:YES completion:nil];
}

@end
```
![スクリーンショット 2016-12-14 20.12.39.png](https://qiita-image-store.s3.amazonaws.com/0/150031/87a023e8-462e-3dbb-44f7-7f79d99846b4.png)

###ThirdViewController.m

```
#import "ThirdViewController.h"

@interface ThirdViewController ()

@end

@implementation ThirdViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    self.title = @"サードビューコントローラーさん";
    // Do any additional setup after loading the view.
}

@end
```
![スクリーンショット 2016-12-14 20.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/150031/b98e896d-e39d-6022-1639-cbbb290684ce.png)
Railsにpresenter層を導入する


あるオブジェクトに関連するhtmlコードを生成するクラスです。
htmlの中でrubyを実行するのではなくrubyでhtmlを生成するという逆転の発想です。
雑然としたhtmlテンプレートを整理することができます。

## presenterのメリット
* 雑然としたhtmlテンプレートを整理する
* 重複したhtmlコードをメソッドとして抽出することで機能追加やデバッグやリファクタリングがしやすくなる
* 色々なところでフォームの塊等を使い回すことができる

## decoratorとの違い

* decoratorは値を返す、ドメイン層寄り
* presenterはhtmlを返す、ユーザーインターフェース層寄り

## 参考コード

### presenterの大元のクラス
```ruby:presenter.rb
class Presenter
  attr_reader :view_context
  delegate :link_to, :fa_icon, :params, :sort_link, :number_to_currency,
    :time_ago_in_words, to: :view_context

  def initialize(view_context)
    @view_context = view_context
  end

  private

  def markup(tag_name = nil, options = {})
    root = Nokogiri::HTML::DocumentFragment.parse('')
    Nokogiri::HTML::Builder.with(root) do |doc|
      if tag_name
        doc.send(tag_name, options) do
          yield(doc)
        end
      else
        yield(doc)
      end
    end
    root.to_html.html_safe
  end
end

```

### presenterクラスを継承してrooms_presenterを作る
```ruby:rooms_presenter.rb
class RoomsPresenter < Presenter
  delegate :receive_call_logs_path, :room_path, to: :view_context

  def initialize(rooms, view_context)
    @rooms           = rooms
    super(view_context)
  end

  def render
    markup(:table, id: 'table-id' class: 'table-class') do |m|
      m.thead do
        header_components(m)
      end
      m.tbody do
        @rooms.each do
          body_components(m, room)
        end
      end
    end
  end

  private

  def header_components(m)
    "よしなに"
  end

  def body_components(m, room)
    "よしなに"
  end
end

```

### rooms_presenterをview側でnewする
``` rooms/index.haml
= RoomsPresenter.new(@rooms, self).render
```

## まとめ

Rubyでhtmlを生成するというプロセスなので、テンプレートエンジンよりRubyの良さを活かしやすい(例えば継承してコードを使いまわすとか)ですが、presenter最大のメリットはhtmlの塊に名前をつけて管理できるところだと思います。それだけで`このviewはどういう意図があるのか？`がより理解しやすくなるので。


## 参考文献・参考図書
* [中規模Web開発のためのMVC分割とレイヤアーキテクチャ](http://qiita.com/yuku_t/items/961194a5443b618a4cac)
* [RailsのPresenter パターンについて調べてみた](https://corp.mansion-market.com/blog/engineer/5324/)
* [実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Ruby-Rails-4-%E7%8F%BE%E5%A0%B4%E3%81%AE%E3%83%97%E3%83%AD%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E6%9C%AC%E6%A0%BCWeb%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%BB%92%E7%94%B0/dp/4844335928)
* [kuroda/baukis-on-rails-4-2](https://github.com/kuroda/baukis-on-rails-4-2)
Installing ag 1.0.2 on CentOS 6.8

`rpm` とかでインストールできるのはバージョンが古いので、ビルドしました

仮想 PC 上でやってるので、Guest Additions をインストールした段階で gcc とかはインストールされるんで、そういう前提で書いてます。

# 依存するライブラリのインストール

```bash
% sudo yum install -y pcre-devel
% sudo yum install -y xz-devel
```

# aclocal のインストール
ビルドに必要なコマンド `aclocal` は `automake` 内にある

```bash
% sudo yum install -y automake
```

# github からソースを取ってきて展開

```bash
% sudo yum install unzip
% wget https://github.com/ggreer/the_silver_searcher/archive/master.zip
% unzip master.zip
```

`git clone` とかでも可

# ビルドとインストール

```bash
% cd the_silver_searcher-master
% sudo sh build.sh
% sudo make install
```

# バージョン確認

```bash
% ag --version
ag version 1.0.2

Features:
  -jit +lzma -zlib
```

参考にしたサイト。つかそのまんま。

- [Installing ag: the silver searcher on CentOS.](https://gist.github.com/rkaneko/988c3964a3177eb69b75)