OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Unityのナビゲーション機能を使用してキャラクターを走らせる


<font color="Magenta">Unityのナビゲーション機能を使用してキャラクターを走らせる</font>

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Xcode10.1

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1074337280469327872
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Unityの✨ナビゲーション✨機能を使用してキャラクターを走らせてみました。<br><br>動いてるキャラクターを撃つのは、難しいなぁ。。。<br>(。＞0＜。)<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://t.co/XEwiduJ2Kh">pic.twitter.com/XEwiduJ2Kh</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1074337280469327872?ref_src=twsrc%5Etfw">2018年12月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



1.「Window」-「AI」ー「Navigation」を選択する
<img width="492" alt="スクリーンショット 2018-12-16 23.23.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/ae125b11-b343-2c44-3873-f48ad813cd4d.png">

2.「Agents」を選択して、名前を「Run」にする
<img width="405" alt="スクリーンショット 2018-12-16 23.24.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/aed0c8de-f7fd-68d5-7822-7739f352565b.png">

3.「Object」を選択して「Mesh Renderes」を選択する。
ヒエラルキーの「Planks」を選択し「Navigation Static」チェックONにする。
<img width="1306" alt="スクリーンショット 2018-12-16 23.25.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/6c4f13ff-094b-ff3a-2355-3d829399d2c3.png">

4.「Bake」を選択し、「Bake」ボタンを押す。
<img width="399" alt="スクリーンショット 2018-12-16 23.26.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/fb0e53e7-8283-0325-5e7c-ee3c5bdc5ba9.png">

5.「Object」を選択して「All」を選択する
<img width="397" alt="スクリーンショット 2018-12-16 23.28.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/f680aafa-eacc-a8fa-d257-86953e8dc19b.png">

6.キャラクターのプレハブに「Nav Mesh Agent」コンポーネントを追加する
「Agent　Type」を「Run」を選択する。
キャラクターの走るスピードも設定する。
動作のスクリプト「Move Agent.cs」を設定する
<img width="603" alt="スクリーンショット 2018-12-16 23.31.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/eb94e2d3-886a-3e32-896e-64ed609f967e.png">

```cs:MoveAgent
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class MoveAgent : MonoBehaviour {
    NavMeshAgent agent; //ナビメッシュエージェント

	// Use this for initialization
	void Start () {
        agent = GetComponent<NavMeshAgent>();
        // 次の地点へ移動
        GotoNextPoint();
	}
	
	// Update is called once per frame
	void Update () {
        // 目的地付近に到着したか？
        if (agent.remainingDistance < 0.5f)
        {
            // 次の地点へ移動
            GotoNextPoint();
        }
	}

    void GotoNextPoint(){
        // 床の移動地点をランダムで作成
        var nextPoint = new Vector3(Random.Range(-15.0f, 15.0f), 0.0f, Random.Range(-15.0f, 15.0f));
        // ナビメッシュエージェントへ目的地を設定
        agent.SetDestination(nextPoint);
    }
}

```
オブジェクト指向って言葉が何を指してるかを気にしてみる

## この記事の内容

この記事は〇〇アドベントカレンダー17日目、とかでもなんでもありません。
(そういう時期だったので。。)


@k-okina さんからこんなツイートを頂いたので、返信をしようかと思ったのですが、返信を考えていたらtwitterで返信するにはちょっと文字数が長くなってしまったので、Qiitaの記事に対するコメントならQiitaの記事にして返信してしまおう。といった発端で書いています。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hirodragon112?ref_src=twsrc%5Etfw">@hirodragon112</a> discordにも貼りましたが、もしよければアドバイスや意見頂けたらと思います＼(^o^)／  (明日のDDDのアドカレは今から書きます</p>&mdash; k-okina (@kahirokunn) <a href="https://twitter.com/kahirokunn/status/1074189334671052801?ref_src=twsrc%5Etfw">2018年12月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

該当記事はこちらとなります。
[自分用メモ: そもそものオブジェクト指向とは](https://qiita.com/k-okina/items/4c7502a1bddab643aa10)


## 読んでみた感想

きれいにまとまっていて参考リンクも豊富で凄く勉強になりました。
と、それだけだとせっかく声をかけて頂いたのにもったいないので、一読者の感想としてもう少し詳細に感想を記載しつつ、せっかくなので『オブジェクト指向』という言葉にフォーカスをあててみたいと思います。


### コンテキストによるオブジェクト指向が指す対象の違い

該当記事にて使用されている『オブジェクト指向』もしくは『OOP』という言葉が分節によっていくつか意味合いが変化しているように感じました。

『オブジェクト指向』と一言で表しても文脈により指している主眼が違ったりする事があると思います。

- オブジェクト指向パラダイム(object oriented paradigm)
- オブジェクト指向分析設計(object-oriented analysis and design)
	- オブジェクト指向分析(object oriented analysis)
	- オブジェクト指向設計(object-oriented design)
- オブジェクト指向プログラミング(object oriented programming)

[wiki:オブジェクト指向分析設計](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%88%86%E6%9E%90%E8%A8%AD%E8%A8%88)


そういった観点で記事を読むと、

『構造化プログラミング』の章でのOOPとは「オブジェクト指向設計」、『オブジェクト指向では』の章では「オブジェクト指向プログラミング」、『つまり』の章でのオブジェクト指向は「オブジェクト指向パラダイム」を観点に記述されているような気がします。

### パッケージ、モジュール、オブジェクト

> パッケージもモジュールも何もかもがオブジェクトみたいなことを書いていますが、これは言語の実装によりけりです。

記事でも記載されている通り、ここは言語仕様によるのかと思います。
例えば、私がメインで使用しているPHPで『パッケージ』が何を指すか、と言われると、オブジェクトというよりは(パッケージ構造を表現している)ディレクトリの方がイメージが近いかもしれません。

### 感想まとめ
オブジェクト指向を整理用の記事という事で、網羅的にかつ、具体的な手法以外の観点で整理されていたので凄く勉強になりました。

私自信もこういった観点からも自分なりに考えを整理しまとめてみたいと思います！
ありがとうございました。

## 感想以外の事

せっかくQiitaの記事としたので記事の感想だけだともったいないので、これからオブジェクト指向を学ぶ方の参考になればと思い、
ついでに上記のオブジェクト指向○○についての補足的な事を少し書きたいと思います。

上記の感想の中でも書きましたが、ひとえに『オブジェクト指向』と言っても、コンテキストにより対象としている領域が様々です。
特に気をつけたいのが、設計に関する知識とプログラミングに関する知識は別要素として捉えた方が学習時に混乱がなくて良いかと思います。

一般的に『オブジェクト指向設計』が対象とする範囲はいわゆる設計だけにとどまらず、モデリングや補助設計や詳細設計、時には要件定義の工程まで絡んでくる場合があります。
(RDRA, ICONIX手法 等)
これらは概念的な色合いが強い為、ライフサイクルの長い考え方だと捉える事ができるかと思います。
※ 詳細については当記事の対象ではないため割愛します

対象に『オブジェクト指向プログラミング』が対象とする範囲はまさにプログラミング領域です。
オブジェクト指向パラダイムにのっとった、具体的な最善の実装表現方法を考察する意味合いとなるかと思います。
デザインパターン等はここに含まれるかと思います。
こちらはソフトウェアを取り巻く物理的な環境や言語の変遷により流行り廃りがある、 = ライフサイクルは設計よりは長くないかもしれません。
また、『オブジェクト指向言語』を使用しているから = オブジェクト指向プログラミングができている
という訳でもないので注意が必要です。(これはフレームワークについても同様の事が言えると思います)

上記の違いを念頭に入れて、オブジェクト指向を学ぼう！と思った際に、具体的に自分が知りたい領域がどこにあるかを整理してから学ぶと、より効率よく吸収されるかもしれないと思います。

あくまで個人的にな見解としてはオブジェクト指向の本質に近いのは設計だと思っています。
と言うのも、オブジェクト指向とは単なる手段の１つでしかなく、その手段により叶えたい『目的』とは柔軟なソフトウェアを作成する(変更容易性)、という事だと思っています。
ですが、これも本当の目的ではありません。あくまで開発者目線での目的です。

ソフトウェアに変更容易性を確保し、運用や改修等、ソフトウェアと通じてユーザーが叶えたい真の『目的』を実現する事がソフトウェア開発の本当の目的だと思います。
それを達成する為にはやはり『設計』が重要だと思います(プログラミングももちろん重要な要素ですがあえて比較するならです)

オブジェクト指向設計というプロセスをせっかく採用するのであれば、そのような観点からソフトウェア開発と付き合ってみるとまた新たな楽しさが見えてくるような気がします。
【ゆるふわ🔰】Docker ＋ Rails ＋ Heroku  ＝「Yay! You’re on Rails!」【本番環境構築】

## どんな記事か
- DockerでRailsを起動した人が、**herokuで本番環境を構築**できるようになります

## どんな人が読むといいか
- DockerでRailsを起動して、「Yay! You’re on Rails!」を表示させている人
- 本番環境に「Yay! You’re on Rails!」を表示させたい人

## 完成後イメージ
↓これが本番環境に表示されている。
<img width="852" alt="スクリーンショット 2018-12-16 20.46.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/247053/eff3cc71-cce3-d752-8388-269364ec3d7f.png">

## 前提条件
- DokerでRailsを起動「Yay! You’re on Rails!」を表示させている
- Herokuアカウントを持っている（無料）
- GitHubアカウントを持っている（無料）

## やること（２章立て）
 第１章　Railsのファイルたちをいじくる
 第２章　Herokuコマンドでデプロイする

### 第１章　Rails側のファイルたちをいじくる
いじくられるRailsのファイルは３つ

#### Gemfile
 - 以下を追加します
 - 特にpg方はバージョン指定`'~> 0.19.0'`ここがミソっぽいです

```ruby:Gemfile
gem 'sqlite3', groups: %w(test development), require: false
gem 'pg', '~> 0.19.0', group: :production, require: false
```
#### heroku.yml　(なければアプリの直下にこのファイルを作ろう)

```yml:heroku.yml
build:
  docker:
    web: Dockerfile
run:
  web: bundle exec puma -C config/puma.rb
```

#### database.yml
 - configディレクトリの下にあるはず
 - 以下を追加しましょう
 - もし初めから「production」が記載されていたら、コメントアウトしておいてね

```ruby:database.yml
production:
#半角スペース２個分の空白を開ける
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

いじくり完了後、GitHubさんに**push**しておきましょう。
忘れずに！！

### 第２章　Herokuコマンドでデプロイする
ここからは、こちらの記事のほぼパクリです。

- [DockerComposeでコンテナベースのRailsアプリを作成してそのままHerokuにデプロイする](https://qiita.com/akirakudo/items/16a01271b0a39316e439)

#### Herokuにログインする
```ruby:ターミナル
$heroku login
```
ログインできない場合、[ここ](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#heroku%E3%81%B8%E3%81%AE%E7%99%BB%E9%8C%B2)を参考にするとよいですよ。

#### Herokuにアプリケーションを作成する
```ruby:ターミナル
$heroku create
```
Guiからでも作成できますが、なんかうまくいかなかったので、
ターミナルからやろう。

#### Heroku Container Registryにimageをアップロードするためにログインします
```ruby:ターミナル
$heroku container:login
```
ここらへんは丸パクリです。だまってやりましょう。


#### その後コンテナをpushします。
```ruby:ターミナル
$heroku container:push web
```
ここらへんは丸パクリです。だまってやりましょう。

#### DBにPostgreSQLを使用しているので、add-onを追加します。

```ruby:ターミナル
$heroku addons:create heroku-postgresql:hobby-dev
```
ここらへんも丸パクリです。だまってやりましょう。

#### pushしたアプリケーションをリリースします。

```ruby:ターミナル
$heroku container:release web
```
どうやらリリースしないとうまく動かないようです。

#### Herokuにデプロイ

```ruby:ターミナル
$git push heroku master
```

#### これで完成
```ruby:ターミナル
$heroku open
```
このコマンドを打つと自動でアプリが開きます！


#### （必要になったら）本番環境(heroku)でのマイグレーション

```ruby:ターミナル
$heroku run rails db:migrate
```
ただ立ち上げる時は不要です。
ただ、必要になる場合が来るかもしれないので書いときます。

## まとめ
- Rails側のファイルを編集すること
- Herokuのコマンドを正しくつかうこと
- 本当にこれであってるのかな？

次回作にご期待ください。

#### 参考文献
- Railsファイルの設定系
   - [HerokuではSQLite3が使えない？！](https://qiita.com/MosamosaPoodle/items/7149aa66f1c087472777)
   - [rails　Herokuでrails db:migrate時に突然エラー発生！！　postgresqlバージョン問題](https://qiita.com/Hijiri-K/items/51d53c0512a2ef455da6)

- Herokuコマンド系（デプロイ系）
   - [【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39)
   - [DockerComposeでコンテナベースのRailsアプリを作成してそのままHerokuにデプロイする](https://qiita.com/akirakudo/items/16a01271b0a39316e439)
Apache Igniteのインストール

やってみた

# 前提条件
環境はCentOS7

# 手順
1. リポジトリをあらかじめ更新しておく

    ```
    # yum -y update
    ```

2. リポジトリ情報を追加する

    ```
    $ sudo bash -c 'cat <<EOF > /etc/yum.repos.d/ignite.repo
    [ignite]
    name=Apache Ignite
    baseurl=http://apache.org/dist/ignite/rpm/
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=http://apache.org/dist/ignite/KEYS
       http://bintray.com/user/downloadSubjectPublicKey?username=bintray
    EOF'
    ```

3. リポジトリ情報を再度更新する

    ```
    $ sudo yum -y check-update
    ```

4. インストールする

    ```
    $ sudo yum -y install apache-ignite
    ```

# 参考
- [公式ドキュメント - RPM and DEB Setup](https://apacheignite.readme.io/docs/rpm-and-deb-setup)
【Swift4.2】UITableViewをシンプルに管理する

#はじめに
UITableViewで表示パターンが増えてセルの表示設定がカオスになった経験はありませんか？
僕は以前複数パターンのセル表示をしたときに、メソッドの中がぐちゃぐちゃになり絶望していました（笑）
今回はその時に考えたEnumを使ってシンプルに管理する方法を紹介します。

この方法は下図にある入力フォームのような表示項目が動的に変わらないかつ、セル内の要素がある程度似ている場合のUITableView向けです。
![Simulator Screen Shot - iPhone XR - 2018-12-17 at 00.38.25.png](https://qiita-image-store.s3.amazonaws.com/0/326173/c1420a8c-7ce6-7567-0d45-fec93b065a0b.png)


#ストーリーボードでセルを作成する
今回は２パターンのセルを作成しています。
セルのidentifierはそれぞれ"StandardCell"、"PeriodCell"としています。
![スクリーンショット 2018-12-16 23.50.55.png](https://qiita-image-store.s3.amazonaws.com/0/326173/1e72a458-bd78-e210-603d-3b81dda4e4eb.png)

#Enumで表示するセルを定義する
表示するセル毎にEnumを定義します。
例ではユーザー名、パスワード、何かの期間を入力するセルを定義しています。
表示するセルのidentifierとタイトルをEnumから取得できるように定義します。

```Swift:DisplayCellType.swift
enum DisplayCellType: Int, CaseIterable {
    case userID
    case password
    case period
    
    var identifier: String {
        switch self {
        case .userID, .password:
            return "StandardCell"
        case .period:
            return "PeriodCell"
        }
    }
    
    var title: String {
        switch self {
        case .userID:
            return "ユーザーID"
        case .password:
            return "パスワード"
        case .period:
            return "何かの期間"
        }
    }
}
```

#セルのパターン毎にクラスを作成する
ViewControllerから使う時にどのクラスのセルか判定したくないのでインターフェースを定義しておきます。

```Swift:CustomCell.swift
protocol CustomCell {
    func setItem(_ title: String)
}

final class StandardCell: UITableViewCell, CustomCell {
    
    @IBOutlet weak var titleLabel: UILabel!
    
    func setItem(_ title: String) {
        self.titleLabel.text = title
    }
}

final class PeriodCell: UITableViewCell, CustomCell {
    
    @IBOutlet weak var titleLabel: UILabel!
    
    func setItem(_ title: String) {
        self.titleLabel.text = title
    }
}
```

#ViewControllerからセルの設定を行う
あとはViewControllerからセルを利用します。
DisplayCellTypeはCaseIterableを継承しているのでallCasesでEnumの個数を返してやります。
セルのidentifierとタイトルはEnumから引っ張ってきて設定します。

```Swift:ViewController.swift
extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return DisplayCellType.allCases.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellType = DisplayCellType(rawValue: indexPath.row)!
        let cell = tableView.dequeueReusableCell(withIdentifier: cellType.identifier) as! CustomCell & UITableViewCell
        cell.setItem(cellType.title)
        return cell
    }
}
```

#最後に
今回のようにEnumを使いセルの情報をEnumで定義してあげればViewControllerがシンプルになります。
またセルに表示する項目が増えた場合もViewContollerを触る必要なくEnumに項目を追加するだけでいいので改修もしやすくなるのかなーと思います。

ただこのやり方だと動的にセルを追加する場合には対応できないので、それについては別途考えたいと思います。
JavaFX SceneBuilderのコンテナの特徴を紹介する

##はじめに
この記事は [SLP KBIT Advent Calendar 2018](https://qiita.com/advent-calendar/2018/slp_kbit) の17日目の記事です。

この記事では、私がJavaFXとSceneBuilderを使い始めたときによくわからなかった、コンテナを紹介します。
最近サークル内でJavaを触っている人が多いので、GUIアプリケーションを作成する際の手助けになればと思います。

##コンテナとは
この辺に入ってるやつ。
![containers.png](https://qiita-image-store.s3.amazonaws.com/0/314251/08d4a8f5-5ed6-bcd7-e7ac-b8c701c0095a.png)
ボタンなどのオブジェクトを配置する際の土台となります。
コンテナの中にコンテナを配置することも可能で、組み合わせることでより複雑なレイアウトを作ることが可能です。

##各コンテナの概要
###Pane
もっともシンプルなコンテナです。
好きな場所にオブジェクトを配置できます。

###AnchorPane
AnchorPaneの枠から、その中に設置してあるオブジェクトまでの距離を固定できます。

AnchorPaneの右枠にアンカーしたボタンと、どこにもアンカーしていないボタンを用意します。
この状態で、画面サイズを右に拡大すると、
![AnchorBefore.png](https://qiita-image-store.s3.amazonaws.com/0/314251/292b650a-fefa-0a59-8cd5-bbf9bbab2fd7.png)
![AnchorAfter.png](https://qiita-image-store.s3.amazonaws.com/0/314251/5c218186-1824-7264-8097-587ae257d6f5.png)
このように、アンカーしたボタンが、右枠との距離を保って動きます。

###VBox
VBoxは、オブジェクトを上から縦に敷き詰めて並べて配置します。
オブジェクトの幅をVBoxの幅に合わせることが可能で、画面サイズを変更したときの細かい設定もできます。
オブジェクト毎のサイズや余白を設定すると、より見やすいレイアウトとなります。
![VBox.png](https://qiita-image-store.s3.amazonaws.com/0/314251/fd058e90-8d3c-db16-1bbf-9a72207e0eeb.png)

###HBox
HBoxは、VBoxに対し、オブジェクトを左から横に敷き詰めて配置します。
基本的にVBoxと動きは変わりません。
![HBox.png](https://qiita-image-store.s3.amazonaws.com/0/314251/5a8eeb5d-e49b-b96e-9335-cb3f4e1cab3b.png)

###FlowPane
FlowPaneは、HBoxと同じようにオブジェクトを横に敷き詰めますが、一番右にくると折り返すように配置します。
VBoxと同じように、垂直方向に敷き詰めることも可能です。

###BorderPane
BorderPaneは、上、左、右、下、中央の各位置にオブジェクトを配置します。
上下に配置されているオブジェクトは、その優先高に合せてサイズ変更され、BorderPaneの幅が拡張されます。
左右に配置されているオブジェクトは、その優先幅に合せてサイズ変更され、上下の長さが拡張されます。
中央に配置されているオブジェクトは、中央の使用可能なスペース全体に表示されるようにサイズ変更されます。
それぞれの場所には1つしかオブジェクトを配置できません。
複数のオブジェクトを配置する場合は、さらに別のコンテナを配置する必要があります。
![Border.png](https://qiita-image-store.s3.amazonaws.com/0/314251/53e76e73-eb46-69e7-5e32-61d5d06a100f.png)

###GridPane
GridPaneは、行と列からなるマス目にオブジェクトを配置します。
複数のマスにまたがって配置することも可能です。
![Grid.png](https://qiita-image-store.s3.amazonaws.com/0/314251/9c2f1d07-85c9-f0bc-4296-30235b68e604.png)

##おわりに
今回は、オブジェクトの配置に関するコンテナを紹介しました。
しかし、これら以外にもコンテナは存在します。
また機会があれば、具体的な使い方についてより詳しく解説したり、他のコンテナの紹介もしてみたいです。
OpenJDK のインストール

Oracle JDKが有償化されるので、それに伴いOpenJDKのインストールしてみた

# 前提条件
環境はCentOS7
OpenJDKのバージョンは11

# 手順

## RPM からの場合

1. 次の yum コマンドを実行する

    ```sh
    # yum install java-11-openjdk java-11-openjdk-devel
    ```

2. `JAVA_HOME` を設定する

    ```sh
    # echo "JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")" | tee -a /etc/profile \
&& source /etc/profile
    ```

#### おまけ：日本語フォントのインストール

1. 次の yum コマンドを実行する

    ```sh
    # yum install ipa-gothic-fonts-* ipa-pgothic-fonts-* ipa-mincho-fonts-* ipa-pmincho-fonts-* vlgothic-fonts-* vlgothic-p-fonts-*
    ```

2. IPA フォントをダウンロードする

    ```sh
    # curl -LkvfOJ https://ipafont.ipa.go.jp/IPAfont/IPAfont00303.zip && curl -LkvfOJ https://ipafont.ipa.go.jp/IPAexfont/IPAexfont00401.zip
    ```

3. 展開して配置する

    ```sh
    # unzip IPAfont00303.zip \
&& unzip IPAexfont00401.zip \
&& mkdir -p $JAVA_HOME/lib/fonts/fallback \
&& cp -a IPAfont00303/*.ttf $JAVA_HOME/lib/fonts/fallback/ \
&& cp -a IPAexfont00401/*.ttf $JAVA_HOME/lib/fonts/fallback/
    ```

## tar ファイルを使う場合

1. OpenJDKのtarファイルをダウンロードする

    ```sh
    # curl -LkvOf https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz
    ```

2. 破損がないか確認する

    ```sh
    # sha256sum openjdk-11.0.1_linux-x64_bin.tar.gz
7a6bb980b9c91c478421f865087ad2d69086a0583aeeb9e69204785e8e97dcfd  openjdk-11.0.1_linux-x64_bin.tar.gz
    ```
3. tarファイルを展開する

    ```sh
    # tar zxf openjdk-11.0.1_linux-x64_bin.tar.gz
    ```

4. 任意のところに配置してパスを通す

# 参考
- [公式ドキュメント - How to download and install prebuilt OpenJDK packages](http://openjdk.java.net/install/index.html)
褒める組織

こんにちは。 mixi  [AI ロボットチーム](https://www.wantedly.com/projects/92981) の開発マネージャーをしているインコです。
この記事は [Engineering Manager Advent Calendar 2018](https://qiita.com/advent-calendar/2018/em) の18日目の記事です。

この記事では褒める組織を作った話をします。

# 私の環境
環境が違えばマネジメントの方針も変わります。
ここでは私の環境を書きます。

- mixi という Web 企業の、研究開発からハードウェアまで関わる[新規事業](https://www.wantedly.com/projects/92981)
    - まだ製品は出ていないフェーズ
- 私
    - 開発チームのマネージャ
    - 企画やデザインを含む事業全体のスクラムマスター（上記と兼ねている時点で良い SM ではない！）
    - 実装・研究とマネジメントそれぞれ半々
- スクラム開発
- 上司から大きめの裁量をもらっている
- 機械学習の研究寄り人材からハードウェアエンジニアまで多様なメンバー

# 問題：研究からハードまで扱うチームの情報共有
### 多様なメンバー
さて、環境にも書いたとおり私のチームは多様な人材がいます。

- ディープラーニング(もしくは End to End 学習)主義者
- 元ベイジアン今ディープラーニングな転向者
- 自然言語処理er (ディープでない)
- インフラ+サーバーエンジニア
- メーカーからやってきたハードウェアエンジニア
- ニューラルネット大好きエンジニア(インコ)

ざっと眺めるだけでそれぞれ全く違う言語を喋ってそうです。

### 技会
私達のチームには２つの特徴があります。

- 研究開発： 研究では広さより深さが必要です。各人が自分の専門を深く掘っていく必要があります。
- 新規事業： 新規事業ではチーム全員が同じ方向を向いてゴールを共有しながら進む必要があります。そうしないと空中分解します。

上のメンバーの多様性と合わせて、チーム内のコミュニケーションを意図的に増やしていかないと各人が自分の領域に閉じこもってしまいやすい性質の事業です。

そこでチームでは初期の頃から**技術的知見共有会**、略して**技会**という会を毎週開き、そこでは自由に技術系のネタを話せるようにしています。

ネタは業務上の共有（新しく作ったモジュールの説明だとか機械学習の知見）のような真面目なものから、特に業務に関係ないけど面白かった論文のシェアやデモ、俺の好きなアルゴリズムなどなんでも OK です。
毎回開催時に「今日ネタある人〜？」と聞いて適当に話します。

### 褒める・感謝する
技会（やその他いろんな会議）をファシリテーションするにあたって気をつけていることがあります。

発表してくれたことをまず感謝すること。褒めること。盛り上がること。

いちばん大事なのは、相手の話に興味を持つことと、それを素直に口に出すことです。
「めっちゃ面白いですね！」といった直球なものはもちろん、「〜〜はどうなってるんでしょうね」みたいな質問も内容への興味を持ってるんだよという姿勢を明確に出すようにします。言い方の例を出すと繕っているような印象になってしまいますが、思ったことを口にちゃんと出すのはとても大事なことです。

私の哲学ですが、「知らないことを恥じる」よりも「知らないことを知ってる人がいて面白い」という感覚を持つことが重要と考えています。知らないことを恥じて勉強するのは良いことですが、その気持が強いと知らないことを人は隠そうとしてしまします。知らないことを開示して、単純にそれを教えてくれたことに感謝しましょう。より知識が増えたらそれをまたチームに還元していきましょう。

### 褒めることは難しい
褒めるという行為は難しいです。
関係が悪化してしまうと、褒めることは自分を下だと認めることと感じてしまったり、逆に上から目線と感じさせる事になったりしてしまうこともあります。
関係がニュートラルなうちから素直に相手を尊重する文化を作り、育てて行くことが大事だと思っています。


また、上に書いたような事を明示的に伝えて賛同してくれるメンバーを作るのも大事です。
チームで褒める文化の価値を伝えたり、1on1などでそういう行動を取ってくれるメンバーに感謝を伝えたりしています。

### 褒める文化で起こること
Engineering Manager Advent Calendar でも重要なキーワードになっている「心理安全性」の高い組織ができます。

私のチームでは以下のようなことが起こっています。

- **マウンティングしなくなる**
    - 私はマウンティングは防衛本能のようなものだと思っています。他人に否定されないための防衛。
    - 褒める文化の中では、まず最初に自分が受け入れられるところから始まるので防衛の必要性が下がります
    - （ただし、これはもしかしたら元々マウンティングとったりしなさそうな人を採用してるからかもしれません）
- **自分を開示しやすくなる**
    - いろいろな話が共有されやすくなります
        - 自分の好きなもの
        - 今作ってるもので決めかねているところ
        - etc.
- **他人や他分野に興味を持つようになる**
    - 話す方も聞く方も楽しげになってくるので、自然と他分野に興味がわきます
    - よくわからない怖い世界が、専門じゃないけどなんとなく聞いて知ってる世界くらいになります
    - また他人に対する敬意も生まれます
    - これがT型人材を育てやすい環境を作っていきます
- **建設的な議論の土台になる**
    - 浅くはあっても言葉や知識の共通部分ができるため、議論をしやすくなります
    - 肯定的なコミュニケーションを定期的に行っているため心理安全性がたかまり、建設的な対立する意見も言いやすくなります
        - といってもここは個人差があり、真っ向から異論を言いにくい人もいます
        - そういうところは1on1でケアしましょう

スケジュールの都合で開催されないこともありますが、これまで1年以上だいたい毎週技会は開催されていて、話す人がいなくてスキップとなったことはおそらく無い（あっても1,2回？）という高い継続率で運用されています。

## 課題点
課題点というほどではありませんが、人はそれぞれ発信したいタイプの人もいればそうでない人もいるので、発表者が偏る傾向はあります。
発信はしたくないというタイプの人に無理やり話させるのは良くないですが、発信したいけれども自信が無いという人に対してファシリテーションなどでうまく話をふるのをやっていかないとと思っています。

# 最後に
マサカリを投げ合う殺伐とした現場もエンジニアの一つの理想形かとは思いますが、私は肯定と相手への興味がベースになっている文化を広めていきたいと思っています。
ポエミーな感じになってしまい恐縮ですが、褒める組織が増えることを願っています。
Apache CouchDBのインストール

やってみたのでメモ

# 前提条件
CentOS7でやってます

# 手順
1. yumリポジトリを登録する

    ```
    # vi /etc/yum.repos.d/bintray-apache-couchdb-rpm.repo
    ```
    
    ```bintray-apache-couchdb-rpm.repo
    [bintray--apache-couchdb-rpm]
    name=bintray--apache-couchdb-rpm
    baseurl=http://apache.bintray.com/couchdb-rpm/el7/$basearch/
    gpgcheck=0
    repo_gpgcheck=0
    enabled=1
    ```

2. インストールする

    ```
    # yum -y install epel-release && yum install couchdb
    ```

# 参考
- [公式ドキュメント - 2.1. Installation on Unix-like systems](http://docs.couchdb.org/en/stable/install/unix.html)
rbenvで特定のプロジェクトのRubyバージョン変更

# 概要
rbenvによる特定のプロジェクトにおけるRubyのバージョンの変更方法
今回はirbで日本語入力が文字化けしたため、回避するためにバージョンアップを行った。
他のプロジェクトにおいて特定のバージョンで開発を進めていたため、
影響がないよう異なるバージョンにアップデートした。

# やりたいこと
Rubyのバージョンを以下に変更
ruby　2.3.7　→　ruby　2.4.1

# 手順
### 1. [rbenv](https://github.com/rbenv/rbenv#how-rbenv-hooks-into-your-shell)によって特定のRubyのバージョンをインストール

```
$ rbenv install 2.4.1
```
この状態では更新されていない。。。

```
$ ruby --version
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17]
```
rbenvのバージョンを確認してみると、

```
$ rbenv versions
* system (set by /Users/[USERNAME]/.ruby-version)
  2.4.1
  2.5.1
```
インストールはうまくできているが、適切に設定できていないことがわかる。。。


### 2.特定のプロジェクトに対してインストールしたRubyのバージョンを設定

特定のプロジェクトのバージョンを変更する場合は以下のコマンドを実行する。

```
$ rbenv local 2.4.1
```

ちなみにシステム全体のバージョンを変更する場合は以下のコマンドを実行する。

```
$ rbenv global 2.4.1
```

Rubyのバージョンを確認してみると、

```
$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin17]
```
このようにインストールしたバージョンに設定が変更できていることがわかる。


# まとめ
Ruby専用のパッケージ管理ツールのrbenvによって、簡単にRubyのバージョンを変更することができる。


# 参考資料
[rbenvでRubyのバージョンを最新安定版にupdate](https://qiita.com/_kanacan_/items/c1499f6c13b1c41da982)
[rbenvでrubyのバージョンを管理する](https://qiita.com/hujuu/items/3d600f2b2384c145ad12)
Python で FPGA/Lチカ(Lattice iCE40 編)

# 小規模 FPGA でも Lチカ
Zynq は ARM CPU を持った比較的リッチなFPGA を搭載したボードです。より消費電力も小さいFPGA
で高位合成を利用する事は可能でしょうか？Polyphony ではコンパイラとして最適化を意識した設計になっておりリソースの消費量はそう多くありません。

## ターゲットは iCE40(Lattice)
消費電力も少ない小規模なFPGA であるLattice のiCE40 UltraPlus UP5K でPython のコードを走らせてみましょう。iCE40 UltraPlus はチップ内にSPI コントローラのプリミティブとLED ドライブ用のプリミティブを持っています。このチップを搭載した評価ボードiCE40 UltraPlus Breakout board を使ってＬチカとSPI の制御をしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/ab5ac94a-3c7a-543f-43c0-06e126aa4da0.png)

iCE40 Ultra Family Data Sheet より抜粋

## ターゲットボードの RGB LED をLチカ
評価ボードにはRGB のLED が搭載されています。これを今までのPython のコードblink.py を用いてコントロールしてみましょう。システム構成は図のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/fb45c04f-4b32-2e2a-187a-f7375c3895b6.png)

blink.py から 生成されるモジュールのclk, rst, led の信号線を使ったトップモジュールをVerilog-HDL で作成し、ベンダーのツールで合成、実装することで動作可能なバイナリができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/b8d61a5c-f757-276b-bd34-2e675c195395.png)

Polyphony が出力するVerilog-HDL はベンダーに非依存であるためX 社で動いた同じPython のコードをL 社ので動かすということが容易にできます。
iCE40UP の特別な点としてトップモジュールにLED ドライバのプリミティブを使用するという指示を書いておく必要があります。その記述によりツールが自動的にLED のドライバを組み込んでくれます。

```verilog:rgb_primitive.v
//------------------------------
// Instantiate RGB primitives
//------------------------------
SB_RGBA_DRV RGB_DRIVER (
  .RGBLEDEN (1'b1),
  .RGB0PWM  (0),
  .RGB1PWM  (green_wire),
  .RGB2PWM  (0),
  .CURREN   (1'b1),
  .RGB0     (REDn),     //Actual Hardware connection
  .RGB1     (GRNn),
  .RGB2     (BLUn)
);

defparam RGB_DRIVER.RGB0_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB1_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB2_CURRENT = "0b000001";
```
(自分用メモ) CircleCI

# セットアップ
* [Github](https://github.com/)でプロジェクトを作成する
* [CircleCI](https://circleci.com/)で対象のプロジェクトに対してCIを有効化する

# ローカルでcircleciのビルドを実行できるようにする
* [目的] ymlを作成してすぐ試すというサイクルを短くするため
* [手順]
    1. Dockerをインストール ([公式 Docker for mac](https://docs.docker.com/docker-for-mac/))
    2. Circleci-cliをインストール
        * $brew install circleci

# circleci/config.ymlを作成する
* 自分が使用する言語でHello worldするconfig.ymlを書くと吉
* 例
    * https://github.com/ki4070ma/unittest/blob/master/.circleci/config.yml


# GithubにCircle CI statusバッジを貼り付ける
* [githubでREADME.mdにCircleCIのバッジを表示する](https://qiita.com/Hanocha/items/8ad74258eb43d0959590)


# 参考
* [CircleCI 2.0 をlocalで動かす](https://qiita.com/selmertsx/items/45bd672c2c8ddab1981b)
SketchのShadowsの意味とiOS・Xcodeでのシャドー適用方法

#SketchのShadowsプロパティの意味
<img width="239" alt="スクリーンショット 2018-12-16 14.36.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/6d95d013-eaf5-c8e2-317b-5e4f47f3727e.png">
iOS開発者が、上の画像のようなSketchのShadowsを実装する際、それぞれが何を意味するか疑問に思う。
それぞれ実際に値を変えて何を意味するか調べる。
<img width="552" alt="スクリーンショット 2018-12-16 14.35.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/99183a5c-e1f2-c73f-a63c-0ff7a529e476.png">
まずBLurはボカシを意味し値が０の場合、ボカシのない黒塗りとなる。
この時、X = 5なのでX軸方向へ５つ黒塗りとなっている。
<img width="597" alt="スクリーンショット 2018-12-16 14.35.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/2e99d96d-8bea-fb17-b3db-3a43f68bab70.png">
<img width="561" alt="スクリーンショット 2018-12-16 14.36.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/91fde977-c0ad-56ce-a70c-f18ef146739b.png">
Blurを３にした時も５にした時もY軸方向の値（＝５）から２つほど伸びている。５にした時の方が全体的に薄くなる。
<img width="934" alt="スクリーンショット 2018-12-16 14.34.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/63174640-896a-eba7-01f7-96c2d862c82d.png">
Y軸方向は、同様にプロパティYで調整する。

#iOSでSketchのShadowsを実装してみる

```swift:
shadowButton.layer.shadowColor = UIColor.black.cgColor
shadowButton.layer.shadowOpacity = 0.9
shadowButton.layer.shadowOffset = CGSize(width: 5.0, height: 0.0)
shadowButton.layer.shadowRadius = 2.0
```
だいたいshadowOffsetのwidthがSketchのxに、heightがyに相当します。
注意するのがshadowRadiusをSketchのBlurの２分の１にすることです。


#Sketchのシャドーを適用するCALayer+Extension
```swift:CALayer+Extension.swift
extension CALayer {
  func applySketchShadow(
    color: UIColor = .black,
    alpha: Float = 0.5,
    x: CGFloat = 0,
    y: CGFloat = 2,
    blur: CGFloat = 4,
    spread: CGFloat = 0)
  {
    shadowColor = color.cgColor
    shadowOpacity = alpha
    shadowOffset = CGSize(width: x, height: y)
    shadowRadius = blur / 2.0
    if spread == 0 {
      shadowPath = nil
    } else {
      let dx = -spread
      let rect = bounds.insetBy(dx: dx, dy: dx)
      shadowPath = UIBezierPath(rect: rect).cgPath
    }
  }
}
```

https://stackoverflow.com/questions/34269399/how-to-control-shadow-spread-and-blur

間違ってたらごめんなさいね
AtCoder Color Markという円を表示する拡張機能を作った話

# はじめに
これは、[AtCoder関連サービス Advent Calendar 2018](https://adventar.org/calendars/2932)の18日目の記事です。今年作ったAtCoder向けのChrome拡張について書きます。

この拡張への[リンクはこちら](https://chrome.google.com/webstore/detail/atcoder-color-mark/dogcmibkiolcdafifopmnghhlajpbmga)。何かあったらフィードバックをもらえるとありがたいです。
※ 追記: この記事を公開した日にAtCoderのURLに変更が行われ、一時的にこの拡張が動かなくなってました。

# 機能
## 概要
- コンテストの順位表のそれぞれの名前の右にレーティングの円を表示
    - ![こんなかんじ](https://lh3.googleusercontent.com/nAOF8O09rmrOjkArpCF03N2H3vyhAkFBXRlhc227sz44R8nWQV_piaoHEqY21Fsf3d8mz9h2zP8=w640-h400-e365)
- プロフィールの過去の参加コンテストのページにレーティングの円を表示(beta版のみ)
    - ![こんなかんじ](https://qiita-image-store.s3.amazonaws.com/0/152858/55024ee4-12c8-6a52-dbbf-cda5720eeaeb.png)

## どうして作ったのか
- 自分の前後のレーティングを見たい
- 過去のパフォーマンスがどの色のどのレベルなのか分かりやすくしたい

## どうやって実現しているか
### Chrome拡張部分
#### Chrome拡張とは
Chrome拡張は個人で書いて公開[^chromestore]することができ、それをインストールすることでChromeに機能を追加することができます。この拡張機能の様なDOMの操作だけでは無く、クライアントJSではできないようなChromeの用意しているAPIを利用した機能も実装できます。逆に、拡張機能のメニューが必要な場合は自作が必要になります。そして、Chromeで動けば良いため、ES6なども問題なく使用することができます。
公開方法としては、Tampermonkeyという拡張機能のスクリプトとして公開することもできます。こちらはユーザ登録派不要です。

[^chromestore]: Chrome拡張はChromeウェブストアから公開できますが、5ドルが最初に必要になります

#### manifest.json
```            
"https://*.contest.atcoder.jp/*", 
"http://*.contest.atcoder.jp/*",       
"https://beta.atcoder.jp/contests/*",     
"https://beta.atcoder.jp/users/*/history"
```
上記の4つのドメインを対象にしてます。betaの方がドメインが統一されていてloclstorageとか共有できて嬉しいです。
上記のページに対してCSS,JSを一個ずつ挿入してます。

#### 表示部分
レーティングの円の表示はcanvas要素の挿入によって実現してます(canvasなので`innerText`には無影響なはずなので、他の拡張に影響はおそらく無いはず)。表示内容はおそらくTopCoderと同じようになるようにレーティングの色[^rating]とその色の最大値と最小値を100％、0％にしたときにどの位置になるかを円で表しています。
![要素](https://qiita-image-store.s3.amazonaws.com/0/152858/a1839286-3a6f-b9cf-4357-260a96a41213.png)
![完成図](https://qiita-image-store.s3.amazonaws.com/0/152858/8962411e-3e0d-6da9-8d6c-2e70cbdaba96.png)
canvasの円は上の3つの要素を組み合わせて描写しています。上の例は40％の場合の例で、まず左の円と真ん中の長方形の共通部分のみ描写します(source-in)。そうすると円の中身の部分だけ作れるので、それに右の円の輪郭を足し合わせるとTopCoderみたいな円が完成します。

#### 取得部分
順位表にはユーザのレーティングは載っていないため、円を表示するにはそれを取得する必要があります。そのため、localstorageを確認して最新のデータが無かった場合に自前のサーバにレーティングのJSONを取得しに行っています。取得したJSONはlocalstorage[^cookie]に取得時刻とともに記録し、無駄にデータを取ってこないようにしています(**Chromeはサーバ側のキャッシュ用ヘッダを無視して取得しているように見える**)。具体的には15分キャッシュします。
beta版を使用していない場合、コンテストごとにドメインが異なるのでlocalstorageにJSONがそれぞれ溜まってしまうという弊害はあります。
ユーザのコンテスト成績のページについてはレーティング値がページ内にあるのでそれを取得して表示しているだけでデータの取得・保存はしていません。

[^rating]: レーティングの色の分布は[ここ](https://atcoder.jp/post/14)を参考にしました。
[^cookie]: cookieは容量が小さすぎて入らないため

### バックエンド部分
クライアント側でAtCoderのユーザページのJSONをたたくのも可能ですが、AtCoderとクライアント両方の負荷の負荷軽減のため自前のサーバでJSONを配布してます。
JSONは30分に一回[AtCoderのランキングページ](https://atcoder.jp/ranking)をスクレイピングしてJSONを生成しています。ライブラリは`jsdom`を利用してます。
手順は以下のとおり、
1. ランキングページにアクセス
2. ページャの右端からページ数を取得
3. 各ページのテーブルの特定列からユーザとレーティングの関係を取得
4. JSONにして保存

# TODO
- beta版以外での無効化(JSONがかなり溜まるため)
- JSON取得・保存をサーバレス化する
合成数列の和アドベントカレンダー Dart 編

この記事は[合成数列の和 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/composite-number) 17日目の記事です。

## ルール
* 入力として正の整数 N を与えたら 4 から始まる 合成数 の数列の 1 番目から N 番目からの合計を出力してください
* N は最大で 100 とします

## 解答

```dart
bool isPrime(int num) {
  if (num < 2) {
    return false;
  } else if (num == 2) {
    return true;
  } else if (num % 2 == 0) {
    return false;
  } else {
    for (var i = 3; i < num; i++) {
      if (num % i == 0) {
        return false;
      } 
    }
  }
  return true;
}

main(List<String> args) {
  int num = 4;
  int indata = int.parse(args[0]);
  int composites = 0;
  int sum = 0;
  while(composites < indata) {
    if(!isPrime(num)) {
      composites++;
      sum += num;
    }
    num++;
  }
  print(sum);
}
```

## 確認
```bash
$ dart sample.dart 4
27
$ dart sample.dart 10
112
$ dart sample.dart 100
7059
```

## 参考
[Get Started with Server-Side Dart | Dart](https://www.dartlang.org/tutorials/dart-vm/get-started)

macの人は`brew install dart`でインストール可能
PHPでナノ秒を計る

なんとなくマニュアルを見ていたらPHP7.3.0で[hrtime](http://php.net/manual/ja/function.hrtime.php)という関数が増えていました。

むかーし[High resolution timing](https://qiita.com/rana_kualu/items/f02c7f64f6712021c2e8)というPECLが存在したのですが、それと同じようなものがネイティブで実装されたようです。

この実装は作者の[Anatol Belski](https://github.com/weltling)が[さっさと実装して](https://github.com/php/php-src/pull/2976)しまってから[フォーラムに話を持ち込んで](https://externals.io/message/101358)、他に影響を与えるようなものでもないからRFC通さなくてもいいんじゃね、とあっさりマージされました。

マージされたのは[2018年に入ってから](https://github.com/php/php-src/commit/83497327e747703300d35831b4aa94adf1120165)で、確認したところ[PHP7.3.0α1](https://3v4l.org/PBP5r)から既に存在していました。

しかし[α1の新機能](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc)を紹介したときにはこんな関数見た覚えがないんだけどなあ？
と思ったら[α1のNEWS](https://github.com/php/php-src/blob/php-7.3.0alpha1/NEWS)には書かれておらず、[α2のNEWS](https://github.com/php/php-src/blob/php-7.3.0alpha2/NEWS)でα1の変更点に追加されていました。
どういうことだ。

# hrtime

## 使い方

```php
	$a = hrtime(true); // 数値になる
	$b = hrtime(true);
	var_dump($b - $a);
	
	var_dump(hrtime()); // [秒, ナノ秒]
```

普通の関数なので普通に使うだけです。

## その他

プラットフォームによって時刻の取得方法が異なります。
Windowsであれば[QueryPerformanceCounter](https://msdn.microsoft.com/ja-jp/library/cc410966.aspx)。
Linux等であれば[clock_gettime](https://qiita.com/katoken-0215/items/3acb8b674c5e5bbbf9a4)。
iOSであれば[mach_absolute_time](https://qiita.com/yamoridon/items/087e1018565218209eef)
HP-UXであれば[gethrtime](https://docstore.mik.ua/manuals/hp-ux/en/B2355-60130/gethrtime.3C.html)
AIXであれば[read_wall_time](https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.basetrf2/read_real_time.htm)。

各プラットフォームにおける最も高精度な時刻取得方法を採用しているようです。
正直知らないプラットフォームもあるんだけど、PHPって色々対応してるんですね。

# 感想

非常に高精度な時計や時間計測を必要とする分野には役立つかもしれません。
しかしQueryPerformanceCounterの分解能は[100ナノ秒以上](https://qiita.com/lambda-classic/items/17f786856de22c0e5bd1#windows)なので、ナノ秒単位の超高精細カウントはあまり意味がなかった。
Webフォント全景

#はじめに
日本語のWebフォントを使う機会も増えてきたので、
Webフォント全般の情報をまとめました。
Webフォントの使い方はざっくり分けて２つあります。

 - セルフホスティング（自前のサーバーにフォントデータを置く）
 - クラウド（フォントサービスのwebサーバーから取得する）





#セルフホスティングについて
- フォントのデータを持っていることが前提。
- フォントのライセンスに注意が必要。
- 欧文フォントならば文字数が少ないので容量的に問題ないが、日本語フォントは文字数が多いので減らす（サブセット化）必要がある。
- あらかじめサブセット化してからアップするため、動的な内容には対応できない。
- 本文ではなく、見出しだけといった限定的な使用が妥当。（それならSVGにした方が良さそう…）
- 自作したwebフォントはこの方法で使用する。
- モリサワのwebフォントサービスTypesquareではセルフホスティングが可能。

```scss
// 設定例
@font-face {
  font-family: 'FontName';
  src:
    local('Local Font Name'),
    url('/assets/font/FontName.woff2') format('woff2'),
    url('/assets/font/FontName.woff') format('woff');
  font-weight: normal;
}

// 使用例
p {
  font-family: 'FontName';
}
```
[> MDN/@font-face ](https://developer.mozilla.org/ja/docs/Web/CSS/@font-face)




#クラウドについて
- 費用が発生するサービスが多い。
- クライアントワークの場合はデザイン時から相談する必要がある。
- 使用している文字を判別し、自動でサブセット化してくれる。
- apiが用意されており、JavaScriptで動的に表示する文字にも対応できる。
- 使用できるフォントの種類が多い。


# 代表的なサービス

日本語のウェブサイトをつくる時、よく使用する4つのサービスを紹介します。

- Google fonts
- Adobe Fonts
- FONTPLUS
- Typesquare



## Google Fonts
https://fonts.google.com/
フリー。2018年に日本語が正式に追加されました。https://fonts.google.com/?subset=japanese
使用方法は、フォント名の横にある ＋ ボタンをクリックし、生成されたlinkコードをhtmlにコピペするだけです。
フォントデータを分割してロードする（unicode-rangeサブセット）します。
使用する文字だけロードするダイナミックサブセットは非対応です。

```html
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP" rel="stylesheet">
```
```css
p {
  font-family: 'Noto Sans JP', sans-serif;
}
```

## Adobe Fonts
https://fonts.adobe.com/
Adobe CC契約していたらWebフォントをドメイン数やアクセス数を気にせず使い放題です。
いちばん安いAdobeCCフォトプランなら月に980円。
Adobeのアプリで使用したフォントは全てWebフォントにすることができるので、デザインと実装でフォントを揃えることができます。
[> 設定方法 + JavaScript API](https://helpx.adobe.com/jp/fonts/using/add-fonts-website.html)



## FONTPLUS
https://webfont.fontplus.jp/
Fontworksのサービス。
料金はPVに合わせて発生します。大規模なサービスや特殊な使い方の場合は別途相談。
[> プラン](https://webfont.fontplus.jp/service/pricing)
[> 設定方法](https://webfont.fontplus.jp/service#how-to-use-2)
[> JavaScript API](https://webfont.fontplus.jp/service/guide/javascript-api)


## Typesquare
https://typesquare.com/ja/
モリサワのサービス。
料金はPVに合わせて発生します。大規模なサービスや特殊な使い方の場合は別途相談。
セルフホスティング（自前のサーバーにフォントデータをアップして使う方法）でも使用可能です。
MORISAWA PASSPORTを契約している場合、1,000万PV/年まで使用できます。
[> プラン](https://typesquare.com/ja/service/plan)
[> 設定方法](https://support.typesquare.com/hc/ja/articles/360012732071-Web%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E9%85%8D%E4%BF%A1-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B-)
[> JavaScript API](https://typesquare.com/service/api_reference)




#まとめ
全体全般をざっくりまとめました。
今後の課題としては、

- まだ使用したことない欧文フォントのサービスについて知りたい。
- ロード関係について詳しくまとめたい。ちらつき（FOUT）問題とか、最近使えるようになった`font-display`とか。
- バリアブルフォントやカラーフォントについて、情報をまとめたり作ったりしたい。

などがあります。次の機会に！



#参考資料
[> Webフォントを120% 活用するための基礎知識＆最新動向（Adobe Max Japan 2018）](https://speakerdeck.com/readymadegogo/webhuontowo120-percent-huo-yong-surutamefalseji-chu-zhi-shi-and-zui-xin-dong-xiang)
合成数列の和アドベントカレンダー Perl編

合成数列の和アドベントカレンダー Advent Calendar 2018 の 16日目です。
# ルール
* 入力として正の整数 N を与えたら 4 から始まる 合成数 の数列の 1 番目から N 番目からの合計を出力してください
* N は最大で 100 とします

```perl:test.pl
#!/usr/local/bin/perl
use strict;
use warnings;

use Math::Big::Factors qw(factors_wheel);

my $sum = 0;
my $sum_count = 0;
my $num = 4;
while ( 1 ) {
    my @factors = factors_wheel($num);
    if (defined($factors[1])) {
        $sum += $num;
        $sum_count++;
        last if $sum_count == $ARGV[0];
    }
    $num++;
}
print "$sum\n";
```
※Math::Big::Factorsを使用

# 出力例
```bash
$ perl test.pl 2
10
$ perl test.pl 4
27
$ perl test.pl 10
112
$ perl test.pl 100
7059
```
1行でSpring BootのAppを立ち上げる

```shell

$ mkdir sample && cd sample && curl https://start.spring.io/starter.zip -d dependencies=web,actuator -o sample.zip && unzip sample.zip && mvn package && java -jar target/demo-0.0.1-SNAPSHOT.jar
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 51130  100 51105  100    25  42718     20  0:00:01  0:00:01 --:--:-- 42729
Archive:  sample.zip
~~(省略)~~
2018-12-17 00:11:53.897  INFO 55673 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 5.692 seconds (JVM running for 6.474)
```

- 動作確認

```
$ curl localhost:8080/actuator/health
{"status":"UP"}
```
AR何も分からん人がARKitを仕事で利用する時に調べた技術資料

#概要
ARKitアドベントカレンダー2018 17日目です。
ARの知識が0の状態で仕事でARKitを使う事になった際に調べた事をまとめます。

#はじめに
ARKitでどんな技術が利用されているかを知りたかった。
取り敢えずApple公式の資料を探っていくと、AppleのWWDC2018のARKitの技術解説動画が参考になる感じでした。
https://developer.apple.com/videos/play/wwdc2018/610/

この資料を見たところARKitで重要になるキーワードは

* 「画像の特徴点」
* 「ポジショントラッキング」
* 「3D空間の把握」

になるかなと感じました。

#画像の特徴点とは

ARKitは、カメラの画像から計算される特徴点を利用する事で「ポジショントラッキング」を行ったり「平面検知」を行ったり、画像マーカーを検知しているようです。
特徴点について非常にわかりやすい記事が下記にあります
https://qiita.com/icoxfog417/items/adbbf445d357c924b8fc
要するに特徴点とは画像に対してどんな操作を行っても（回転、拡大）変化しない点で、例としてこれを利用するとある画像の中からとある画像に一致するものを探したりできます。

![matcher_result1.jpg](https://qiita-image-store.s3.amazonaws.com/0/116884/316407da-8ed3-6252-0f55-9cc66d867c89.jpeg)


#ポジショントラッキング
ARkitはVIO(Visual Inertial Odometry)を用いてiPhoneのカメラの位置、角度を計算しています。

* 一般的なVIO全体の処理の流れは下記資料が分かりやすい。
 * http://web.mit.edu/sze/www/navion/2017_rss_navion_slides.pdf

* 特徴点ベースのポジショントラッキングについてはこちらの資料が参考になります
 * https://www.slideshare.net/MasayaKaneko/slamptam

* また、[6D.ai](https://www.6d.ai/)のCEOが書いたVIOに関するブログも凄く参考になりました。
 * https://medium.com/6d-ai/why-is-arkit-better-than-the-alternatives-af8871889d6a

VIOはカメラ画像の特徴点の前後フレームの差分を用いた計算値(STEM)と、iPhoneの中にあるIMU(慣性計測装置)で得られる加速度、角速度の値を利用して特徴点に対するカメラの位置を計算しています。

STEMとIMUを組み合わせるとお互いにできない事を補完しあって堅牢なポジショントラッキングが可能になります。
1. 白い壁のような特徴点の少ない場所であってもIMUの計算結果を用いることが出来る
2. iPhoneが静止に近い状態(完全に静止じゃなくて若干の手ブレがある状態)でも画像の特徴点を利用することが出来る


#３D空間の把握
iOS12に標準搭載されてるメジャーアプリが結構正確に距離を測れるのを見てわかるように、ARKitではカメラに対する特徴点の位置を結構正確に測定してくれます。

* ARメジャー
![IMG_2409.jpg](https://qiita-image-store.s3.amazonaws.com/0/116884/3752cbb7-580e-06df-64ff-3a2b7c6d3dbf.jpeg)

特徴点の位置の計算のイメージとしてはステレオカメラによる三角測量が近くて、前後フレームを利用する事によってiPhoneのカメラをステレオに配置した事と同じ意味を持って、その前後フレームでのカメラの位置をIMUで計算してます。

* ステレオマッチングの理解については以下の記事を参考にしました。
 * https://qiita.com/ykoga/items/14300e8cdf5aa7bd8d31

この特徴点の位置が最低３点あればARKitの平面検知ができるという事になります。
GCEで無料のインスタンスを作成する

GCP は無料で使えるインスタンスがあるみたいなので、使ってみる。

# 無料で使用できる条件

以下の条件で、WEB コンソールから、VM インスタンスを作成  する。OS はどれを選んでも問題ないが、ubuntu にする。

- US リージョンであること
- f1-micro インスタンスであること
- HDD 30GB までであること




# SSH 接続
## 鍵作成
インスタンスの作成から、SSH まで gcloud で  できるみたいだが、 とりあえずふつうに鍵を作成し、ログインする。

作成した鍵をメタデータ > SSH 認証鍵  に追加
 鍵作成時、ユーザー名をつけると、GCE でもユーザーを追加してくれている。 追加されたユーザーは管理者権限を持っているので注意が必要。

```
# ローカルで鍵作成
ssh-keygen -t rsa -f ~/.ssh/gce-auth-key -C ユーザー名

# 権限設定
chmod 400 ~/.ssh/gce-auth-key

# 鍵コピー
cat ~/.ssh/gce-auth-key.pub

# 接続
ssh ユーザー名@外部IPアドレス -i ~/.ssh/gce-auth-key

```
## ポート変更
sshのポートを変更する

```
# 設定ファイル編集
sudo vi /etc/ssh/sshd_config
PORT 22を任意のポートに変更

# 設定再読み込み
systemctl restart sshd
```
設定を再読み込みし、変更後のポートで接続確認をするまで、作業しているコンソールは閉じないほうがよい。
# 初期設定
タイムゾーン、言語設定等

# 必要そうなものを入れる

## git インストール

```
sudo apt-get update

# git インストール
sudo apt-get install git

# docker ce インストール
# 公式で用意されている手順に従って、インストール

```

## Docker インストール

```

# 事前インストールしておくべきものを入れておく
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update

sudo apt-get install docker-ce

# dockerは管理者権限が必要。dockerグループにユーザを追加してやることで、sudoを回避できる。
# dockerグループは、dockerインストール時に追加されている。
sudo adduser ユーザー名 docker
# 設定を反映させるために、再ログインする。

#docker composeインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 実行権限を与える
sudo chmod +x /usr/local/bin/docker-compose
```

ubuntu 18.04 からは、snap から Docker をインストールできるみたい。
docker-compose  も一緒にインストールされるので、こちらの方が楽。
ただし、snap では、docker グループが作成されないので、snap インストールする前に、docker グループを作成してやる必要がある。

```
sudo addgroup --system docker
sudo adduser $USER
newgrp docker

sudo snap install docker
```
しかし、セキュリティの観点から、docker グループにユーザを追加して、実行するのは良くない  みたい。
AtomでHydrogenを動かす手順メモ

# AtomでHydrogenを動かす手順メモ

記事を書く練習+今後同じ条件で困らないように、Atom上でHydrogenを動かすための手順を記す。

環境
- Windows 10
- Anaconda 5.3.1
- python 3.7
- Atom 1.33.0
- Hydrogen 2.7.0
上記は一通りインストール済みとする。


1.Hydrogenに必要なpackageのインストール

```
(base)>conda install ipykernel
```

2.HydrogenのSettingsでkernelを記述

まずAnaconda Promptからjupyterのkernelをjson形式で出力。

```
(base)>jupyter kernelspec list --json
```

出力したkernel(以下みたいなやつ)を丸々コピーして、HydrogenのSettingsの___Kernel Gateways___に貼り付け。

```
{
  "kernelspecs"：{・・・
  }
}
```

3.Anacondaのディレクトリのpathを通す

忘れがち。Anacondaはインストールするだけではpathを通してくれないっぽい。
環境変数を開いて下記のpathを追加。
* ~~\Anaconda3
* ~~\Anaconda3\Scripts
* ~~\Anaconda3\Library\bin


以上でHydrogenを動かせる…はず
gRPCのMock戦略

# はじめに
API開発において、サーバとクライアントが別れて開発することは多いと思います。
しかし、そのような場合にクライアントが平行、あるいは先行して開発をすることになると、必要となるサーバが存在しないため開発がしにくくなります。
そこで出てくるのがAPIのモックサーバです。

![Dev Mock](https://qiita-image-store.s3.amazonaws.com/0/28298/cf0e8324-d53e-388e-8e0b-360c26018c60.png "Dev Mock")


クライアント開発時、本物のサーバの代わりにモックサーバを利用し開発を行い、サーバの開発が完了した時点で結合を行うようにします。

ここではよくあるREST APIと比較したgRPCのMockについて記載します。

## REST APIのモックサーバ

RESTのモックサーバはホスティングサービスから、単体のツールまで沢山あるので、ここではシンプルな[json-server](https://github.com/typicode/json-server)を例にしたいと思います。

### json-serverによるモック
json-serverを利用した開発は簡単で、レスポンスとなるjsonを定義し、json-serverに読み込ませるだけです。

```bash:Terminal
> npm install -g json-server
```


```json:db.json
{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}
```

```bash:Terminal
> json-server --watch db.json
```

また、CRUD処理やソート、ページングなどもjson-serverの仕組みに乗ることで利用が可能です。

クライアント開発では、事前にjsonの定義でサーバ相当の機能を実現、開発し、サーバ開発が完了した時点で本物のサーバを利用するようにします。


## gRPCのモックサーバ
### gRPCの開発スタイル

![Kobito.XIS1od.png](https://qiita-image-store.s3.amazonaws.com/0/28298/53845fd9-8aa0-2229-af17-fea497c3c718.png "Kobito.XIS1od.png")

gRPCにおける開発では概ね以下のフローで行います。

1. クライアント/サーバ間のインターフェイス定義
2. protocにより、クライアント/サーバの自動生成
3. サーバ側の実装
4. クライアントからサーバの利用

ここで重要なのが、`2.クライアント/サーバの自動生成`です。

言語依存はありますが、ここで生成されるサーバのコードはほぼそのままサーバとして実行が可能なコードが生成されます。
つまり、RESTでいう`json-server`のような仕組みが公式でサポートされています。

また、生成するサーバのコードも任意の言語で自動生成可能なので、クライアントを実装する開発者が扱いやすい言語のモックサーバで開発が可能です。

ということで、gRPCだと多くの場合、外部のMockツールがなくてもクライアントだけの開発が可能になります。

### より簡単にgRPCのモックサーバを
gRPCの開発フローに乗ると、サーバ生成は簡単に行えるようになりますが、RESTのときと比べるとサーバ生成がちょっと手間に感じるかもしれません。
そんなときに便利なのが、Protobuf.jsのdynamic codegenです。


Protobuf.jsを使うとprotoファイルを直接読み込み、モック化したい処理の実装することで、1つのjsファイルだけでモックサーバが用意できます。
後は通常のnodeアプリケーションと同様起動するだけです。

```javascript:server.js
// proto定義の読み込み
const PROTO_PATH = __dirname + '/../../protos/helloworld.proto'
const grpc = require('grpc')
const protoLoader = require('@grpc/proto-loader')
const packageDefinition = protoLoader.loadSync(/* ... */)
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld

// モック
function sayHello(call, callback) {
  callback(null, {message: 'Hello ' + call.request.name})
}

// サーバの設定
function main() {
  const server = new grpc.Server()
  // モックの組み込み
  server.addService(hello_proto.Greeter.service, {sayHello: sayHello})
  server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure())
  server.start()
}

main()
```

```bash:Terminal
> node server.js
```

単純なnodeのスクリプトになっているので、固定値を返すモックだけでなく、動的な処理を埋め込むのにも便利です。


## RESTとのgRPCのMock比較
簡単に比較すると以下の特徴があります。

||REST|gRPC|
|:--|:--|:--|
|機能|シンプルなものから高機能なものまで様々<br>用途に合わせて選択可能|本物のサーバと同様の機能を実現可能<br>使い慣れた言語でコントロール|
|拡張性|DSLや拡張機能、各種設定|使い慣れた言語で拡張できる|
|学習コスト|学習コストが低いものは機能や拡張性が低く、高機能だと学習コストが上がりやすい|gRPCサーバの基礎知識があればよい|
|保守性|APIの定義を保証する仕組みがないため、別ツールと組み合わせるか、テストなどを行う必要がある|スキーマ定義の仕組みが公式サポートのため、インターフェイスが保証されている|

※ RESTのモックサーバはツールに依存します

## まとめ
gRPCは提供されている仕組みそのものが、Mock機能も兼ねているのでその仕組みに乗るのが便利です！


## 参考
- [Protobuf.js server](https://github.com/grpc/grpc/blob/master/examples/node/README.md)
このデバッグコマンドだけはお願いします！

##はじめに
ゲームのQAがテスト業務で必要とするツールといえば、

- テスト対象のゲーム
- テスト項目書（Excel、スプレッドシートなど）
- バグトラッキングシステム（Redmine,JIRAなど）
- チャット/メール

などあるかと思いますが、QAにとって大事なツールがもう一つあります。
それが**デバッグコマンド**です。
(デバッグモード、チート機能とも呼ばれるかもしれません）

今回はゲームのデバッグコマンドについて書きたいと思います。
QAがどんな風に、どんなテストで使用しているのか、イメージを掴んでもらえればと思います。

##基本のデバッグコマンド

```
キャラクターを付与する
アイテムを付与する
通貨を付与する
ユーザーのステータス（ランク、実績など）を調整する
イベントフラグ（進行度）を変更する
ゲーム内の時間を変更する
```
どんなジャンルのゲームでも、大抵これらのデバッグコマンドは実装されています。
デバッグコマンドではなく、ユーザー管理ツールから受け取りボックスを通じて付与する、といった場合もあります。

ゲーム内で獲得できる要素が自由に付与できれば、
各要素の単体テストは容易になります。
ステータスやフラグを変更できれば、
一度きりしか発生しないイベントのチェックも容易に行えます。
ゲーム内の時間が変更できれば、
実際の時間が関わるイベントのチェックができます。

様々な”状態”を作ることができますので、
まさに基本のデバッグコマンドと言えるでしょう。

##ダミーデータのデバッグコマンド
```
フレンドを作る（または申請をもらう）
ギルドデータを作る
ランキングデータを作る
```

例えばそのゲームにマーケット機能があった場合、
セーブデータを新規作成し、ゲームを進め、アイテムを出品登録する・・・　
といったことを１個１個手作業でやっていたらキリがありません。
リズムゲームのランキング機能でも同様ですよね。毎回１曲プレイするのは大変です。

ダミーデータとして大量かつ多種多様なデータを投入できれば
テストの準備に時間を取られることが無くなります。

##UIのデバッグコマンド
```
ゲーム画面を拡大する・縮小する・移動させる
一部のUIだけを消す
当たり判定（コリジョン）を可視化する
タッチ判定領域を可視化する
テキストのIDを表示する
```
拡大したり余計なものが消せれば、
ゲーム画面の特定の箇所や見にくい箇所をチェックすることが容易になります。

当たり判定やタッチ判定を可視化できれば、
想定外の判定箇所を見つけることもできます。

テキストについては、
例えば　「はい」　というテキストはあらゆる画面で使用されるため、
識別するためにIDの表示は有用です。


##演出再生のデバッグコマンド
```
指定のイベントシーンを再生する
指定のサウンドを再生する
指定のガチャ演出を再生する
指定のTIPSを再生する
```
進行度を自由に変えられても、ゲームを操作し特定の場所まで進めないと再生されない演出もあります。
フラグ達成によるイベントの発生をチェックするのではなく、
イベントの内容自体をチェックしたい場合は上記のデバッグコマンドが有用です。


##インゲームのデバッグコマンド
```
味方または敵が無敵になる
味方または敵が一発で死ぬ
味方または敵のステータスを変更する
スキルが常時発動できる
キャラクターの場所を任意に移動できる
敵の動きを変える・止める
ゲームの速度を上げる・下げる・止める
確率を操作する
行動順（タイムライン）を可視化する
ダメージの計算式を可視化する（属性やスキル効果などの倍率の計算式が見れる）
```
キャラクターやステージのテストはもちろん、
スキルの単体テストなどでこれらのデバッグコマンドを駆使します。
見えない情報を可視化することもできれば、
ゲームがロジック通りに動作しているか確認することができます。

インゲームのデバッグコマンドは多種多様ですが、あればあるだけ便利です。

（余談ですがインゲームのデバッグコマンドが無い現場に配属されたことがありますが、
　とにかく時間がかかって地獄でした。）

##ハードウェアのデバッグコマンド
```
パケットロスを再現する
ストレージ空き容量不足を再現する
電池切れを再現する
位置情報を偽装する
```
これらを新規に実装する、ということはあまり無いかもしれませんが、
ソフトウェア側でも実装されていれば、割り込み処理の確認やダイアログのテキストチェックに使えるでしょう。
位置情報偽装は位置ゲーでは必須ですね。

##【番外編】特に良かったデバッグコマンド
以下は番外編として、「これ便利だったな～」と思うデバッグコマンドを紹介します。

```
ワンボタンで、いい感じの進行状態・ステータスにしてくれる
自動でプレイしてくれる
ユーザーごとにゲーム内の時間を変更できる
```
１つ目ですが、ソーシャルゲームのQAでは、ユーザーを新規作成することが多いです。
その為、いちいち色々付与したり、進行度を変えたりするのが面倒になってきます。
ワンボタンで処理してくれるのは大変便利でした。

２つ目は、エージングテスト（放置テスト）やモンキーテスト（適当操作）としても利用できたりと、
多用な使い道が好みでした。

３つ目については、全てのオンラインゲームに必須で実装して欲しいくらいです。
他のメンバーの都合を考えたり、時間変更の順番待ちから解放されました。

##【重要】デバッグコマンドが予め用意されているとは思わないこと
デバッグコマンドをいくつか紹介致しましたが、
そもそもQAがどんなテストをするのか、開発者は何も知りません。

QA：「エンディングのチェックをするぞ！」
QA：「でも毎回ボス戦クリアするの面倒だ！」
QA：「エンディングを再生する機能は・・・しまった！無かった！」
QA：「開発さん！この機能が欲しいのですが！」
開発：「・・・え、QA用に今から実装ですか？工数的に厳しいですね・・・」

と、言われてしまうことが、あるかもしれません。

大切なのは、QAが各機能の企画段階（開発着手前）で
**“このテストが必要で、だけど自力でやるのは大変なので、このデバッグコマンドの実装をしてほしい”**
という要望を出すことです。

QA以外の人間がテスト内容を把握していない、ということは結構あると思います。
QAが実施したいことを伝え、開発に協力を仰ぐことで、結果開発の効率を上げることができるのです。
ただ単に実装してくれ、ではなく理解が得られるまでコミュニケーションすることが大事です。

##おわりに
ウチではこんなデバッグコマンドあるよ！便利だよ！
というものがあればコメント頂けると幸いです。
（デバッグコマンドでは無いですが、常にゲーム画面を録画できる環境もあると大変便利だなぁと思い出しました。）

今回記載したデバッグコマンドが当たり前の世の中になり、
QAから要望を出す前に考慮されていると　お互いにとって　とても幸せだと思います。