OmniAICreator/Qiita-1.07M huggingface dataset:
ExoPlayerでアンビソニック+2ch音声の動画を再生する

ふとResonance Audio SDKのリファレンスを見ていたら、[GvrAudioSurround.SurroundFormat](https://developers.google.com/vr/reference/android/com/google/vr/sdk/audio/GvrAudioSurround.SurroundFormat)の中に`FIRST_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO`, `SECOND_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO`, `THIRD_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO`という定数があることを発見しました。これを使えばヘッドトラッキングに対応した空間音響とヘッドトラッキングに対応しないステレオ音声を同時に再生するような気がします。

ExoPlayerをResonance Audio SDKと一緒に使うための[GvrAudioProcessorのソース](https://github.com/google/ExoPlayer/blob/release-v2/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java)を見てみると、94行目あたりに音声のチャンネル数に応じて`GvrAudioSurround.SurroundFormat`の定数値を切り替える記述が見つかりました。
しかしここでは`FIRST_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO`などの定数値は使われていないようです。じゃあ、この定数値を使うようにこのソースをカスタマイズしたらいいんじゃない？ってことで、以下のようにしてみました。

```java
switch (channelCount) {
  case 1:
    surroundFormat = GvrAudioSurround.SurroundFormat.SURROUND_MONO;
    break;
  case 2:
    surroundFormat = GvrAudioSurround.SurroundFormat.SURROUND_STEREO;
    break;
  case 4:
    surroundFormat = GvrAudioSurround.SurroundFormat.FIRST_ORDER_AMBISONICS;
    break;
  case 6:
    surroundFormat = GvrAudioSurround.SurroundFormat.FIRST_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO; // FIRST_ORDER_AMBISONICSから変更
    break;
  case 9:
    surroundFormat = GvrAudioSurround.SurroundFormat.SECOND_ORDER_AMBISONICS;
    break;
  // 11chサポートを追加
  case 11:
    surroundFormat = GvrAudioSurround.SurroundFormat.SECOND_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO;
    break;
  case 16:
    surroundFormat = GvrAudioSurround.SurroundFormat.THIRD_ORDER_AMBISONICS;
    break;
  // 18chサポートを追加
  case 18:
    surroundFormat = GvrAudioSurround.SurroundFormat.THIRD_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO;
    break;
  default:
    throw new UnhandledFormatException(sampleRateHz, channelCount, encoding);
}
```

他の部分は一切手を付けていません。

このようにして修正した`GvrAudioProcessor`をExoPlayerに組み込めば、ExoPlayerでアンビソニック+2chの動画（音声）を再生することができるようになります！ExoPlayerへの組み込み方はざっくり言うとこんな感じです。

```kotlin
// フィールドに保持
val gvrAudioProcessor = GvrAudioProcessor() // 先程カスタマイズしたGvrAudioProcessorを使う

// ExoPlayerのインスタンスを作成する。メインスレッドで呼ばなければいけない。
fun createExoPlayer() : SimpleExoPlayer {
  val trackSelector = DefaultTrackSelector()
  val renderersFactory = object : DefaultRenderersFactory(context) {
    override fun buildAudioProcessors(): Array<AudioProcessor> = arrayOf(gvrAudioProcessor)
  }

  return ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)
}

// 毎フレームこの処理を行う
fun update() {
  // w,x,y,z にユーザーのヘッドトラッキングのQuaternionの値を入れる
  gvrAudioProcessor.updateOrientation(w, x, y, z)
}
```

この方式で再生できるアンビソニック+2chの音声というのは、例えば1次アンビソニックなら先頭4chにアンビソニック音声をWYZXで入れて5chにL、6chにRを入れた合計6chの音声です。2次、3次も同様に、先頭9chにWYZX...を入れて10chにL、11chにRを入れた合計11chの音声、先頭16chにWYZX...を入れて17chにL、18chにRを入れた合計18chの音声になります。

ただし、3次アンビソニック+2chの音声はGalaxy S8で試したところCPU負荷が高すぎるのかブチブチ音が切れてまともに再生されませんでした。
deviceorientationAPIを使う時にalpha,gammaがbeta90を超えた時に値が乱れるのをなおすやつ

メモ

- deviceorientation使って、デバイスの傾きで中のワールドを回転させたいときなどに、スマホを垂直にした時に表示が崩れてしまう時
- logなどで見てるとalphaやgammaの値が突然飛ぶ時

```js
function getQuaternion(alpha, beta, gamma) {
    var _x = beta ? beta * degtorad : 0; // beta value
    var _y = gamma ? gamma * degtorad : 0; // gamma value
    var _z = alpha ? alpha * degtorad : 0; // alpha value

    var cX = Math.cos(_x / 2);
    var cY = Math.cos(_y / 2);
    var cZ = Math.cos(_z / 2);
    var sX = Math.sin(_x / 2);
    var sY = Math.sin(_y / 2);
    var sZ = Math.sin(_z / 2);

    var w = cX * cY * cZ - sX * sY * sZ;
    var x = sX * cY * cZ - cX * sY * sZ;
    var y = cX * sY * cZ + sX * cY * sZ;
    var z = cX * cY * sZ + sX * sY * cZ;

    return [x, y, z, w];
}
```

#参考文献
まんまこれ
[A.2 Alternate device orientation representations](http://w3c.github.io/deviceorientation/spec-source-orientation.html#worked-example-2)
IBM CloudライトプランのDb2 on Cloud　性能抜群のカラムナー表で遊んでみよう

## ライトプランで遊べるDb2
入門編はこちら https://qiita.com/azzeten/items/5d06afc6b5df352410a2

それで、もっと色々遊んでみたのがこの記事です。
通常このDb2は行表（いわゆる普通のRDBMS）ですが、ちょっといじってみることで分析に特化した列表を作ってみてどんだけ早いんじゃというのを試してみます。

## （ご参考）最初からデータウェアハウス系のを試したかったらこちら
https://qiita.com/azzeten/items/e993bb3954c2c9a98dab
https://qiita.com/azzeten/items/c1d5eb7774f9d14953e8
https://qiita.com/azzeten/items/2e38472994ba77ef1aff

## 表を作ってみる

もともと、CUSTOMERという表を作ってあります。データも入ってます。
まずはその定義そのままに、ただし最後に「organize by column」を足して、列表にします。
その後データをロードします。参考にしたのはこの記事。
https://qiita.com/steel_mikan/items/6edb6d8a8cb9ef72efb0

```sql
---表作成
CREATE TABLE BLU_HYO LIKE JLN84695.CUSTOMER ORGANIZE BY COLUMN;

---データロード
CALL SYSPROC.ADMIN_CMD 
  ('LOAD FROM
    (SELECT * FROM JLN84695.CUSTOMER)
    OF CURSOR
    REPLACE INTO JLN84695.BLU_HYO');
```

確認ー。
BLU_HYOは列表でC、CUSTOMERは行表でRと出てます。よしよし。

```sql
select tabname,tableorg from syscat.tables where tabschema='JLN84695'
```

![スクリーンショット 2018-03-25 16.29.55.png](https://qiita-image-store.s3.amazonaws.com/0/119378/a084d0e3-aa1d-d18c-7ba4-a3b7e47b0ac5.png)



## 性能はかってみる

とりあえず試したのは下記のSQL

```SQL
SELECT AVG("AGE") FROM JLN84695.CUSTOMER;
```

###ふつうの表（行表）
0.195秒

![スクリーンショット 2018-03-25 16.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/119378/4da0d175-169d-e488-3fca-80bd79f5439a.png)

###分析特化の表（列表）

0.035秒

![スクリーンショット 2018-03-25 16.28.58.png](https://qiita-image-store.s3.amazonaws.com/0/119378/c65b6885-40a0-6d71-52ff-206b27a09fd4.png)

### まとめ
**5倍以上はやいー!!!**
Db2 Warehouse on Cloud（dashDB）に付属してたRStudioが消えちゃうかわりにWatson Studioを使ってみる

残念なお知らせが乗っています..

##Db2 Warehouse on CloudにあったRStudioが消えるんだそうです。
https://ibm.com/blogs/bluemix/2018/02/upcoming-changes-rstudio-db2-warehouse-cloud/

＜以下まとめ＞
**2018年4月上旬**
Db2 Warehouse on CloudのWEBコンソール画面からRstudioへのリンクが削除
（注）リンクが削除されるのみで、URLに直接アクセスすればRStudio自体は継続して利用可能
**2018年4月24日**
RStudio環境の削除（利用不可）
RStudio上で作成したデータ・セットや分析モデル、ファイル等もすべて削除されます

じゃあ、どうすりゃいいのさ、と途方にくれるわけですが、、
##**Watson Studioに乗っかっているRStudioで対応**なんだそうです。
このWatson Studioも無償で使えるもので、かつもっともっといろんなことができるプラットフォームになっているので、Rに限らずPythonや他のWatson系のサービスも、他の機械学習もこの際楽しんでみよう！とポジティブに考えてみました。

##ご参考：Watson Studioについて
https://qiita.com/dicekm-i/items/5ae674a278bfdf230226
https://qiita.com/ishida330/items/cd851bb2c461f64b02dd

##RStudioの移行は試してみたので、下記ご参考まで。
一応メモ程度ですが。

・Db2 Warehouse on Cloud (以後Db2WoC)環境のRstudioを開きます
・右下ウィンドウのFilesタブで、移行対象のフォルダおよびファイルを全て選択し 「More」から「Export」を選択します。
・zipファイルとして、お使いのPCのローカルディスクへダウンロードができます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/e1be2091-9ead-fd00-a29f-7845b994267d.png)

・移行先のRStudio環境を作成します。Watson Studioを利用する方は以下リンクよりインスタンス作成が可能です https://datascience.ibm.com/

・移行先のRstudioで以下コマンドを実行し、Db2 WoCのR In-DB Analyticsパッケージ「ibmdbR」とODBCパッケージ「RODBC」をインストールをします。

```R
install.packages('ibmdbR');
install.packages('RODBC');
```


・Filesから「Upload」をクリックし、先ほどダウンロードしたzipを選択します。Zipが解凍されてRstudioの環境にアップロードされたことを確認します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/036d260f-831d-96e4-69ee-2a84f52b8123.png)

・Db2 WoCのユーザID/パスワードでRstudioから接続をします。Db2 WoCのユーザID/パスワード/ホスト名はIBM Cloudコンソールから確認可能です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/d8ad87f3-3378-1977-6d9f-41deb98c9960.png)

・確認後、Rstudioで以下のコマンドを実行し、接続を確認します

```R:パターン1
library(RODBC);
library(ibmdbR);
"dsn" <- "DATABASE=BLUDB;HOSTNAME=先ほど確認した「ホスト名」;PORT=50000; PROTOCOL=TCPIP;UID=先ほど確認した「UID」;PWD=「先ほど確認したパスワード」;"
con <- idaConnect(paste('BLUDB;', dsn, ''));
```
```R:パターン2
library(RODBC);
library(ibmdbR);
"dsn" <- "DATABASE=BLUDB;HOSTNAME=先ほど確認した「ホスト名」;PORT=50000; PROTOCOL=TCPIP;UID=先ほど確認した「UID」;PWD=「先ほど確認したパスワード」;"
con <- odbcConnect(paste('BLUDB;', dsn, ''));
```
Parityでコンソールを使う

Parityにはgethのような親切なJavascript consoleはありません。ターミナルで作業したい場合はweb3.jsを使えます。
gethをアタッチすることもできますが、安定して動作しない場合もあります。

# web3.jsを使う

```bash
$ npm i web3
$ node
> Web3 = require("web3")
> web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
> web3.version
'1.0.0-beta.33'
```

# gethをアタッチする
:warning: 安定して動作しない場合あり。

```bash
geth attach --rpc http://xxx.xxx.xxx.xxx:8545
```
自分のUnityで使う命名規則とかファイル構成とかのメモ

# CamelCase
`UpperCamelCase`は単語の先頭文字が大文字。他は小文字
例：`PlayerController`,`HyperTextTransfarProtocol`,`HelloWorld`

`LowerCamelCase`は最初の単語の先頭文字が小文字。以降の単語の先頭の文字は大文字。他は小文字。
例：`mousePointer`,`gameObject`,`eyeTracker`

`Camel`はラクダでフタコブラクダをイメージすると分かりやすいかも。
`UpperCamel`は前のコブが大きくて後ろのコブは小さい。
`LowerCamel`は前のコブが小さくて後ろのコブは大きい。

# ファイル構成
ここが決まってないとごちゃごちゃしてしまうので、
`Scene`は`Assets/Scenes/`フォルダ内に保存。
`Script`は`Assets/Scripts/`フォルダ内に保存。
`Prefab`は`Assets/Prefabs/`フォルダ内に保存。
`Material`は`Assets/Materials/`フォルダ内に保存。
みたいな形で保存する。

# ユーティリティー
HTTP通信とか`PlayerPrefs`のラッパー（ユーティリティースクリプト）とかをよく作るので、
`Assets/Utils/`フォルダ内にユーティリティースクリプトファイルを作成する。
名前空間を`Utils`にしてその中に静的クラスなり関数なり定義する。
例

```Palette.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Utils{
    class Palette{
        static const Color primary = new Color(0f, 0.5f, 1.0f);
        static const Color primary = new Color(0f, 0.1f, 0.5f);
        static const Color accent = new Color(1.0f, 0f, 1.0f);
    }
}
```

# 命名規則
ここも色々とわけないと後から困るので...

## メンバ変数
`lowerCamelCase`で命名する。
例：

```C#
float playerSpeed;
```

## メンバ定数
`UpperCamelCase`で命名する。
例：

```C#
const string RoomKey = "xxx-xxx-xxx";
```

## メソッド
`UpperCamelCase`で命名する。
例：

```C#
void SetPlayerSpeed(float value) { this.playerSpeed = value; }
```

## セッター/ゲッター
`UpperCamelCase`で命名する。
例：

```C#
float PlayerSpeed {
   get { return this.playerSpeed; }
}
```

# Scene
`UpperCamelCase`で命名する。
例：`Game`,`Result`

# シーンに1つコントローラー
シーンに1つシーンの全体的な処理を管理するコントローラースクリプトとオブジェクトを作成します。
コントローラースクリプトとコントローラーオブジェクトは同じ名前にする。
命名規則は`Scene名+Controller`
コントローラーオブジェクトにはコントローラースクリプトをアタッチする。

# 共通部品
プレイヤー名入力フィールドなどのいろいろなところで使うUIなどは共通部品とする。
共通部品は`Prefab`化する。
共通部品は`専用Script`を持たせる。
例：プレイヤー名を保存するスクリプトなど

# オブジェクト名
`UpperCamelCase`で命名。
【eclipse】同じファイルを２つ開きたい【エディタの分割】

# 例えば大量の変数が定義されたプログラム
「こういうのは別クラスに分けるべき！」とかあるとは思いますが。
実際に実務の中でプログラムを書いていると、こういうソースにお目にかかることも少なくないかと・・・。

```java
public class CloneWindow {

  private static String STR_VAR_1 = "var1";
  private static String STR_VAR_2 = "var2";
  private static String STR_VAR_3 = "var3";
  private static String STR_VAR_4 = "var4";
  private static String STR_VAR_5 = "var5";
  private static String STR_VAR_6 = "var6";
  private static String STR_VAR_7 = "var7";
  private static String STR_VAR_8 = "var8";
  private static String STR_VAR_9 = "var9";
  private static String STR_VAR_10 = "var10";
  private static String STR_VAR_11 = "var11";
  private static String STR_VAR_12 = "var12";
  private static String STR_VAR_13 = "var13";
  private static String STR_VAR_14 = "var14";
  private static String STR_VAR_15 = "var15";
  private static String STR_VAR_16 = "var16";
  private static String STR_VAR_17 = "var17";
  private static String STR_VAR_18 = "var18";
  private static String STR_VAR_19 = "var19";
  private static String STR_VAR_20 = "var20";
  
  public static void main(String[] args) {
    /*
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     * ここにずらーっと処理が並ぶとして・・・。
     */
    System.out.println(STR_VAR_1);
  }

}
```

ちなみに、私のノートPCではこんな感じになります:arrow_down:
![eclipse_070.png](https://qiita-image-store.s3.amazonaws.com/0/188980/cc7ec132-befb-89ec-0e68-42150a230276.png)
はい、処理の部分が全く見えてませんね:sweat:
「ノートPCの画面が小さい」ってのはちょっと無視します（笑

# 画面分割して上と下を同時に見ながら編集したい
そんな時、```メニューバー→ウィンドウ→新規エディタ```を選んでください:exclamation:
バージョンによっては```メニューバー→ウィンドウ→エディター→クローン```かもしれません。
そうすると・・・
![002_080.png](https://qiita-image-store.s3.amazonaws.com/0/188980/726c5183-09d3-c523-f440-df5ab3ba3eec.png)
同じファイルが２つ表示されました:open_mouth:

あとは、配置を調整すると、こんなふうに左右に並べながら編集が出来ちゃいます:pencil2:
ちなみに、右側のオレンジの矢印で示した個所に１行追記してみました。
![003_070.png](https://qiita-image-store.s3.amazonaws.com/0/188980/f32007c5-506c-58f6-999d-6a8fc2234c19.png)

# ぜひお試しあれ！
知ってるとちょっとラクに実装が進むかと思います。
あと、一瞬だけ周りの人から「すごーい！」って言われます（笑
Windowsの拡大率指定を無視する（Chrome, Visual Studio Code）

WIndows の拡大率設定がされていると、タイトルバーやメニューバーが拡大して表示される。
アプリケーションごとに無効化したい場合は、以下のオプションをつけて起動する。
（起動ショートカットのプロパティで、"～exe" の後ろにスペースを入れて追加する）

* Google Chrome `-high-dpi-support=1 -force-device-scale-factor=1`
* Visual Studio Code `--force-device-scale-factor=1.0`
yarn run dev が中断されるエラー


### 症状

yarn run dev
```
jsTypeError: dep.getResourceIdentifieris not a function
```


### 環境
node -v 
v9.10.0

npm -v
5.6.0


### 原因
調査中。。。
package.jsonが怪しい
Dependenciesのwebpack、webpack-cli　がダメ？

### 応急処置
同じプロジェクトを別名クローンし
npm install　をやり直したら解消。

OKなpackage.json
```
{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    "devDependencies": {
        "axios": "^0.17",
        "bootstrap-sass": "^3.3.7",
        "cross-env": "^5.1",
        "jquery": "^3.2",
        "laravel-mix": "^1.0",
        "lodash": "^4.17.4",
        "vue": "^2.5.7"
    },
    "dependencies": {
        "vue-router": "^3.0.1"
    }
}
```

NGなpackage.json
```
{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    "devDependencies": {
        "axios": "^0.17",
        "bootstrap-sass": "^3.3.7",
        "cross-env": "^5.1.4",
        "jquery": "^3.2",
        "laravel-mix": "^1.7.2",
        "lodash": "^4.17.4",
        "node-sass": "^4.8.3",
        "vue": "^2.5.7"
    },
    "dependencies": {
        "vue-router": "^3.0.1"
    }
}
```

教えてエライ人！
電気系プログラミングガチ素人が、Xamarinでアプリ開発する話　初日　~Xamarinの概要をまとめてみよう~

#まえがき
この記事は「Skype工学勉強会」の「アプリ作成部屋　Xamarin」での活動をまとめて記録したものです。参考書が、マイクロソフトさんから布教されておりますので、そちらを和訳しつつ、まとめて記事にしていく流れになっております。
しかし、当方、タグの通り、「電気系」の学生で「ガチ素人」であるため、先輩にまさかりを投げてもらいながら、覚えていく所存でございます。また、もし他に指摘点などございましたらぜひともよろしくおねがいします。

↓Xamarinの布教用PDF、Kindle版もございますので、英語読める方、ぜひとも。
https://blogs.msdn.microsoft.com/microsoft_press/2016/03/31/free-ebook-creating-mobile-apps-with-xamarin-forms/


#チャプター１に書かれていることまとめ
* プログラミングは楽しいぞ！！
* 問題解決は楽しいぞ！！
* でも、あるプラットフォームから別のプラットフォームに移植するのはまじでハゲるぞ！！
* 複数プラットフォームだと管理が難しいぞ

それらを解決したい！

* アンドロイド、iOS、WindowsPhoneで使えるフレームワークあるぞ

## それには４つの問題がある！

* インターフェースパラダイムが違う！
アプリケーションとページをナビゲーションする、方法が違っている。
データの表示方法に関する慣習が違う。

* IDEが違う！
iOS：Xcode
Android:AndroidStudio
WindowsPhone:VisualStudio

* インターフェースが違う！
スイッチひとつでも呼び方が全く違う→内容も仕様も全く違う
iOS：UIswitchと呼ばれるview
Android:Switchと呼ばれる、wiget
WindowsPhone:ToggleSwitchと呼ばれるcontrol

* プログラミング言語が違う
iOS：Swift　&　Objective-C
Android:java
WindowsPhone:C#

#C#はいいぞ
* C++や、javaより歴史的な負の財産を背負っていない（この本ではこう書いてあるっぽいですが、私にはちょっとわからないので、なにかご教授いただければ・・・Microsoft布教用なので・・・）
* C#は強く、型付けされた言語である（ココ重要）
* C#は.NETフレームワークの上に構築されている。

#Xamarinの仕様
Mac用のMonoMacと、iOS用のMonoTouch、そして、Android用のMonoDroidの、3つの.NETライブラリを統合して作った環境である。iOSにビルドする場合は、ローカルでMacにつながる必要がある。Androidはできる。WindowsPhoneの場合はWindows。
XamarinStudioの場合はWindowsPhoneの開発が出来ない？（Not　Allowと記載。）

# あとがき
ホントは初日で、ちょっとでもXamarin触れて行きたかったですが・・・ココらへんも概略を知ることというのは全体像を把握することに有用なんで、ちょっと時間かかっても続けていきたいものです。
【Sequelize】foreignKeyとtargetKey

### Sequelize
- Node.jsで動く、MySQLやPostgreSQLのトランザクションやリレーションなどをサポートするORMです
- 参考：http://docs.sequelizejs.com

### このページで書くこと
- 主にリレーションの際のforeignKeyとtargetKeyについて

### リレーションの基本の書き方
    MODEL1.RELATION(MODEL2)
- MODEL1のことを"source"、MODEL2のことを"target"という

### belongsTo
    User.belongsTo(WorkingGroup)
- sourceに外部キー(WorkingGroupId)が追加される

### hasOne
    User.hasOne(UserInfo)
- targetに外部キー(UserId)が追加される

### hasMany
    Project.hasMany(User)
- targetに外部キー(ProjectId)が追加される

### belongsToMany
    Project.belongsToMany(User, {through: 'UserProjects'});

    User.belongsToMany(Project, {through: 'UserProjects'});
- throughで指定した名前のテーブルに双方のキーが追加される

## foreignKey
- foreignKeyの名前を任意に変更する
- 上記のようにリレーションを書くことによってできるforeignKeyは大文字始まりのキャメルケースになる
- 自動的にできるforeignKeyの名前は以下のような書き方で変更できる（Userテーブルに"work_group"というforeignKeyが追加されることになる）

        User.belongsTo(WorkingGroup, {foreignKey: 'work_group'})

## targetKey
- foreignKeyをprimaryKeyから任意のカラムに変更する
- デフォルトのforeignKeyはtarget(もしくはsource)のprimaryKeyになる
- 以下の書き方でforeignKeyを変更できる（WorkingGroupテーブルの"name"カラムをUserテーブルのforeignKeyの"workGroup"に指定できる）

        User.belongsTo(WorkingGroup, {foreignKey: 'work_group', targetKey: 'name'})
certbot+certbot-dns-cloudflare でワイルドカード証明書を取得&自動更新する

# 1. `certbot` をインストール

CentOS 7 なら epel にワイルドカード証明書対応版 (v0.22) があるので、それをインストールする。

```sh
yum install --enablerepo=epel certbot
```

# 2. `certbot-dns-cloudflare` プラグインをインストール

ワイルドカード証明書の発行、更新には DNS の TXT レコードを編集する必要がある。
DNS 操作を自動化するため、 `certbot-dns-cloudflare` プラグインを導入する。

```sh
yum install --enablerepo=epel python2-certbot-dns-cloudflare
```

`Global API Key` を https://www.cloudflare.com/a/profile から取得し、それを記した credentials ファイルを作成する。
ここでは `/root/.cloudflare/credentials` に作成するものとする。

```sh
mkdir /root/.cloudflare
chmod 700 /root/.cloudflare
echo "dns_cloudflare_email = {ログインメールアドレス}" > /root/.cloudflare/credentials
echo "dns_cloudflare_api_key = {取得した API キー}" >> /root/.cloudflare/credentials
chmod 600 /root/.cloudflare/credentials
```

# 3. 証明書を取得する

`example.com` と `*.example.com` の証明書を取得する場合、以下のようなコマンドになる。

```sh
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.cloudflare/credentials \
  --dns-cloudflare-propagation-seconds 60 \
  --server https://acme-v02.api.letsencrypt.org/directory \
  -d example.com \
  -d *.example.com
```

DNS の変更が反映されるのを待つため、 60 秒 (`--dns-cloudflare-propagation-seconds`) ほど掛かる。

取得が完了すると、 `/etc/letsencrypt/live/example.com` 以下に秘密鍵と証明書が出力されている。

# 4. 証明書を更新する

```sh
certbot renew
```

`/etc/letsencrypt/renewal/{ドメイン名}.conf` に取得時の設定が残されているため、更新時にオプションを指定する必要はない。

# 付記. cron 設定例

```sh
echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew" > /etc/cron.d/certbot
```
Go を書くなら GoLand を使おう(≧∇≦)/

Go を書けるエディタ・IDEはたくさんありますが、その中で [JetBrains GoLand](https://www.jetbrains.com/go/) は Go の開発ツールに悩んでいる方にはぜひおすすめしたいソフトウェアです。

**有料のソフトウェアですが、お金を払う価値はあるとおもいます**

では具体的にどんなとこが良いのか、個人的にすごいとおもったPointを書きます。

![rapture_20180331172547.png](https://qiita-image-store.s3.amazonaws.com/0/10713/731ea2b6-4f8a-1bfb-e69f-978574f116ff.png)


## 環境構築が楽ですごい
IDE（統合開発環境）なので、初期状態から Go 開発に役立つたくさんの便利機能が入っています。

また、Go の環境設定である GOPATH 等を GoLand 側の設定画面から GUI でできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/7210dddf-2ec6-7536-7801-70ad67148927.png)

## URLをコピーするだけで go get できてすごい
Go ではライブラリを入れるとき次のようなコマンドを実行します。

```
go get https://github.com/golang/dep
```

しかし、GoLand を起動していると、 https://github... をコピーするだけで右下に「これ go get する？」って表示してくれます。これすごい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/b553cae7-8d32-8f06-374b-c6f0ebeb2842.png)

## Live Template がすごい
たとえば、`main` と入力して Tab を押すと、main 関数をぱっと作ってくれます。

![live-template.gif](https://qiita-image-store.s3.amazonaws.com/0/10713/5bd01f6e-b9c0-313d-26a2-01d9a95f3d9a.gif)

Go でよくある「エラーの nil チェック」も **err > Tab > Enter** ですぐに入力できます。

![err-template.gif](https://qiita-image-store.s3.amazonaws.com/0/10713/0bc6bf7a-eb90-cc40-d504-6aeb82bbcd87.gif)
 

## import の自動整理がすごい
GoLand 2018.1 で入った新しい機能です。 Go は不要な import があるとビルドが通らないのですが、GoLand では自動的に未使用の import は削除してくれます。すごい。

![optimizeimports.gif](https://qiita-image-store.s3.amazonaws.com/0/10713/237b7163-d21f-577a-85a1-561ec065dadd.gif)

## テスト環境も整備されていてすごい
ファイル名が `*_test.go` だと自動的にテストコードとして解釈してくれます。エディタ上からすぐに実行できて、結果も見やすいです。

ここはさすが他の言語のIDEも作っている JetBrains さんという感じですね。すごい。

![go-test.gif](https://qiita-image-store.s3.amazonaws.com/0/10713/9e4399bd-0916-506a-84d8-c393a1e9c568.gif)
JavaScript:map,filterはreduceで書ける


とよくいろんな文章に出てくる。[ここ](https://qiita.com/41semicolon/items/666a3ff1c226828ecdb2#map-filter-はreduceで書ける)とか。
勉強のため自分で書いてみた。実用性は多分、ない。

## map

+ 関数fと配列xsを引数にして
+ accの初期値を[]、配列の要素をeとして
+ f(e)を順次accに足していく


```js:
const rMap = f => xs => xs.reduce( (acc, e) => [...acc, f(e)], [])
```
## filter

+ 関数fと配列xsを引数にして
+ accの初期値を[]、配列の要素をeとして
+ f(e)が真なら、eをaccの後に足す


```js:
const rFilter = f => xs => xs.reduce( (acc, e) => f(e) ? [...acc, e] : acc, [])
```

なるほど納得。reduce最強。
enumをUserDefaultsに保存したい！

# 背景
タイトルにもある通り、UserDefaultsにenumを保存したいシーンに遭遇しました。
enumを保存する際によくやる方法は次のようなコードではないでしょうか？

```swift
enum State: String {
    case hoge, fuga, piyo
}

extension UserDefaults {

    func setState(_ value: State?, forKey key: String) {
        if let value = value {
            set(value.rawValue, forKey: key)
        } else {
            removeSuite(named: key)
        }
    }

    func getState(forKey key: String) -> State? {
        if let string = string(forKey: key) {
            return State(rawValue: string)
        }
        return nil
    }
}
```
呼び出しは次のような感じです。

```swift
let key = "key"
var state: State? = UserDefaults.standard.getState(forKey: key) // nil
UserDefaults.standard.setState(State.hoge, forKey: key)
state = UserDefaults.standard.getState(forKey: key) // hoge
```
保存したいenumを値型enumにして、そのrawValueをUserDefaultsで読み書きする方法です。
これで正しくenumをUserDefaultsに保存できました。動かすだけならこれで十分です。

ですが、別の型のenumを保存する場合を考えましょう。そうなると、また上のコードのようにUserDefaultsにメソッドを追加する必要があります。保存したいenumの種類が増えるたびメソッドを追加するのは面倒です。

# 解決方法
複数種類のenumを愚直に保存する場合、基本的には上のコードの型が違うだけのコードが増えます。
ということでジェネリクスを利用していきます。

値型enumの正体はRawRepresentableというプロトコルです。

```swift

public protocol RawRepresentable {

    associatedtype RawValue

    public init?(rawValue: Self.RawValue)
    public var rawValue: Self.RawValue { get }
}
```
このプロトコルを元にUserDefaultsにメソッドを追加します。

```swift
extension UserDefaults {

    func setEnum<T: RawRepresentable>(_ value: T?, forKey key: String) where T.RawValue == String {
        if let value = value {
            set(value.rawValue, forKey: key)
        } else {
            removeObject(forKey: key)
        }
    }

    func getEnum<T: RawRepresentable>(forKey key: String) -> T? where T.RawValue == String {
        if let string = string(forKey: key) {
            return T(rawValue: string)
        }
        return nil
    }
}
```
今回はRawValueがStringの場合のメソッドのみを追加していますが、基本的にはこれで十分だと思います。
呼び出し側のコードは次の通りです。

```swift
let key = "key"
var state: State? = UserDefaults.standard.getEnum(forKey: key) // nil
UserDefaults.standard.setEnum(State.hoge, forKey: key)
state = UserDefaults.standard.getEnum(forKey: key) // hoge
```

もちろんState以外のenumでもRawValueがStringであれば、UserDefaultsにメソッドを追加することなく読み書きすることができます。

以上、ちょっとした小ネタでした。
「もっとこうした方がいい」などありましたらコメントお願いします。
iOSアプリのUX解析ツールFlurry

# iOSアプリのUX解析
ユーザビリティの向上のためにFlurryを導入したので備忘録として

# Flurry導入の手順
1. Flurryのアカウントを取得
2. Flurryの中でアプリケーションを作る(解析場のような感じ)
3. 自分のiOSアプリにFlurry-iOS-SDKをcocoapodsを使ってインストール
4. AppDelegateに解析に必要なコードを記述
5. 各イベントに合わせてLogをとるコードを追加

## 1. Flurryのアカウントを取得
次のサイトからアカウントを取得してくる
https://login.flurry.com

## 2. Flurryの中でアプリケーションを作る(解析場のような感じ)
ガイドが出るのでその通りにアプリケーションを作る

## 3. 自分のiOSアプリにFlurry-iOS-SDKをcocoapodsを使ってインストール
PodFileに以下を追加して

```:PodFile
pod 'Flurry-iOS-SDK/FlurrySDK'
```
terminalでインストール

```terminal:自分のアプリのディレクトリ
pod install
```

## 4. AppDelegateに解析に必要なコードを記述
AppDelegateにimport Flurry_iOS_SDKを書き、
AppDelegateのなかの次の関数に以下のコードをを書く

```swift:AppDelegate.swift
    import Flurry_iOS_SDK

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        Flurry.startSession("YOUR_API_KEY", with: FlurrySessionBuilder
            .init()
            .withCrashReporting(true)
            .withLogLevel(FlurryLogLevelAll))
        // Your code
        return true
    }
```

## 5. 各イベントに合わせてLogをとるコードを追加

```swift
import Flurry_iOS_SDK
//このコードをEventが起こるタイミングで呼ばれるところに書く
Flurry.logEvent("EventName")
```

# 参考
Eventのレポートされかた
https://developer.yahoo.com/flurry/docs/analytics/lexicon/eventreporting/
Eventのレポート仕方
https://developer.yahoo.com/flurry/docs/analytics/gettingstarted/events/ios/#tab=1
CollectionKitというライブラリを使ってみました！！からちょっと追加でこうなる！

[CollectionKitというライブラリを使ってみました！！](https://qiita.com/sachiko-kame/items/0cf01235846d51f2ac6b)

※はじめに上記を読んでもらったあと見るものとしてください。

で基礎的なものを書きましたが、githubのREADMEのようなUIでないかと思われたかと思います。

では、上記のコードに何を追加すればいいか？

```.swift
provider1.presenter = CollectionPresenter()
```
っと行ってもこれはデフォルトなので変わりませんが…

![sample1.gif](https://qiita-image-store.s3.amazonaws.com/0/133940/8280ac05-3c90-6893-17bc-a2dcaeadd519.gif)


---

又は

```.swift
provider1.presenter = ZoomPresenter()
```

![sample2.gif](https://qiita-image-store.s3.amazonaws.com/0/133940/694849d0-0bb7-d34a-30c3-f3854e45c5ac.gif)



sampleでは他のもありますが、それを行うためには別のライブラリが必要なので今回はこの2点だけです

が！自分でこのようなUIを作成するように

**CollectionPresenter**を継承して、変えたいものをovverrideしてカスタマイズしたものを当てはめる。まだそこまでは行っていませんが、それでうまくいけば…凝ったUIも実現できそうです。

これを使いこなせれば、スクロールするたび、全てのcellの更新などができる！とかとか、希望に溢れています。
普通に用意されているCollectionViewにはそのようなものがない気がして、実装うんちゃらでできるかもしれませんが、このライブラリのようにovveraideした関数の中ごにょごにょで終わらない気がきが…ブツブツ(補足:ライブラリを褒め称えています。)

理想のUI作成できるように頑張ります！！:hatched_chick:
そして、この記事が少しでも理想のUIを諦めたくないと思っている方々の役にたてば嬉しい限りです！:star:
Pythonでの再接続可能なServer, Clientの雛形

Pythonで簡単なsocketのserver/clientプログラムを書くことが多いのですが、
いつも片方が死んだ時のリコネクト（再接続）の書き方をどうやるんだっけ、となるので、
雛形としてまとめました。

もっとスマートな書き方があればご教示ください。

# Server

```python:server.py
#!/usr/bin/python
# coding: utf-8

import socket
import time

host = '127.0.0.1'
port = 65000
buff = 1024

if __name__ == '__main__':

  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  s.bind((host, port))

  while True:
    s.listen(1)
    print('Waiting for connection')
    cl, addr = s.accept()
    print('Established connection')
  
    while True:
      try:
        msg = cl.recv(buff)
        print('Received msg: %s' % msg)
        cl.send('c')  # check if connection is alive
        time.sleep(1)
      except socket.error:
        cl.close()
        break
```

# Client

```python:client.py
#!/usr/bin/python
# coding: utf-8

import socket
import time

host = '127.0.0.1'
port = 65000
buff = 1024

def make_connection(host_, port_):
  while True:
    try:
      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      sock.connect((host_, port_))
      print('connected')
      return sock
    except socket.error as e:
      print('failed to connect, try reconnect')
      time.sleep(1)

if __name__ == '__main__':
  s = make_connection(host, port)
  while True:
    try:
      s.send('hello')
      # msg = s.recv(buff)
      # print('Client received: %s' % msg)
      time.sleep(1)
    except socket.error as e:
      print('connection lost, try reconnect')
      s = make_connection(host, port)
```

おしまい
Unity で DLL を使う (Windows)

少しはまったのでメモ。(するまでもないことかもしれない)

---
`*.dll` を Unity Script で使いたいとき

(18/03/31 追記)
`参照` の `アナライザー` を選択した状態で
(追記終わり)

Visual Studio で `プロジェクト(P)` >> `参照の追加(R)` >> `参照(B)...`
から `.dll` ファイルを選択する。
ブラウザキャッシュ(Cache Bustingとbfcache)について

# Cache Bustingについて
ブラウザは、画像などの静的素材のキャッシュを行っているため、サーバー側の画像が更新されてもキャッシュのために画像が変わらないことがあります。
これを避けるために素材のパスに「?version=20180331」のようなクエリ文字列を付ける手法があります。これをCache Bustingといいます。

## phpによる実現方法
1. デプロイの際にCache Bustingに使う定数を定義したファイルを生成（デプロイごとにユニークになるようにする）
 
```php
define("CACHE_BUSTING", "version=20180331");
```
2. そのファイルをサーバー側で読み込む
3. ビュー側で素材のパスにくっつける

```php
<img src="a.png?<?php echo CACHE_BUSTING; ?>">
```

これでデプロイのたびにキャッシュの見る先が変わるため、昔のキャッシュを参照することがなくなります。

# bfcache(back-forward cache)について
発端はiOSのsafariとAndroidのChromeでWebviewの動作確認をしていた時のことでした。
「あれ？なんかブラバした時の挙動が違うんだけど？」
見てみると、SafariではJavaScriptの状態が保存されており、chromeでは保存されていませんでした。
これはSafariのbfcache(back-forward cache)という仕組みによるものだそうです。

どんなものか調べてみたところ、ブラウザ側が親切でページを完全にキャッシュしておき、違うページからブラバしたときにキャッシュから読むことで高速化をしているらしいです。
結局自分のプロジェクトではiOS、Android間のこの挙動の違いは容認されましたが、挙動を揃えるのは一手間かかりそうです。
詳しくは参考文献を参照してください。


## 参考
* [CSS内に記述したパスにCache Busting対応する](https://mkasumi.com/cache-busting-css-path.html)
* [iOS safari の戻る/進むボタンと bfcache について](https://qiita.com/kyaido/items/5cf9482146b945a4bf67)
* [bfcache について覚えて帰ってもらいます。（転載）](http://oogatta.hatenadiary.jp/entry/20121228/1356696182)
* [Prevent safari loading from cache when back button is clicked](https://stackoverflow.com/questions/8788802/prevent-safari-loading-from-cache-when-back-button-is-clicked)
Google Apps ScriptでつくったWebアプリケーションが急に動作しなくなったときの解決法

これまで正常に動作していたGoogle Apps ScriptでつくったWebアプリケーションが、なぜか急に動作しなくなったときの解決メモです。

# 解決手順
まずは、[Googleドライブ](https://drive.google.com/drive)に行き、対象のGoogle Apps Scriptファイルを開きます。
<br>

![スクリーンショット 2018-03-31 19.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/55366/f670cae6-86f9-07e9-c7bc-cc9f1a0774d5.png)
`メニュー` -> `公開` -> `ウェブ アプリケーションとして導入`を選択します。

![スクリーンショット 2018-03-31 19.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/55366/22de7e58-f011-0760-f55c-d6197ab0168d.png)
`プロジェクト バージョン:新規作成`を選択し、`更新`を選択します。

これで解決しました。

# まとめ
**要は、Google Apps ScriptでつくったWebアプリケーションを公開し直すとうまくいきました。**その理由はよくわかりません。。詳しい人教えてほしいです。
コンテンツをJSONで吐き出すWordpressテーマを作ってみた

# ここまでのあらすじ

コンテンツ管理部分と表示部分を分けて制作したいと思い、

Headless CMSという考え方があるのを知りました。

[Contentful](https://www.contentful.com/)などはその考え方に則ったサービスを展開しているようですし、

Wordpressにも[WP REST API](https://ja.wp-api.org/)という機能があります。

しかしもっとこう手軽にカスタマイズしたかったので、

WordpressのテーマとしてコンテンツをJSONで吐き出す仕組みを作ってみました。

# 仕組み

非常に単純で、通常のテーマで文字列やタグを吐き出すような場面で、

代わりにデータを配列にpushします。

そして最後にその配列を

~~~

echo json_encode( $array );

~~~

のようにjson_encodeを噛ませてから吐き出せば自分流のAPIを作ることができます。

例えばこんな感じ。

~~~
<?php
  // 外部からの呼び出しを許可
  header( "Access-Control-Allow-Origin: *" );
  
  // コンテンツを格納する配列
  $contents = array();

  // Wordpressでよく使うループ
  if ( have_posts() ) :
    while ( have_posts() ) : the_post();

      // 配列$contentsに記事タイトルと記事内容を追加
      array_push($contents, array(
        "title" => get_the_title(),
        "content" => get_the_content()
      ));

    endwhile;
  endif;

  // JSONにして吐き出し
  echo json_encode($contents);

~~~

アクセスするとJSONで表示されるはずです。

# 雑感

Wordpressのテーマなので、Wordpressと同様のリクエストの仕方で絞り込み(日付、タグなど)ができます。

公式のAPI(HTTP REST API)に比べて手軽さで勝るかと思います。

なんか重大なセキュリティの危険とかが無ければこのまま利用するつもりです。
VSCode拡張機能をオフライン環境でインストールする方法

# はじめに

**VSCode拡張機能** をインストールしたい！  
けれど **開発ＰＣがインターネットとつながっていない** 方々はそこそこいるかと思います。

そんな方々に簡単に **オフラインインストール** する方法をご紹介致します。
※別途インターネットに繋がるPCが必要

# オフラインインストール方法

## 1. 拡張機能ファイル(vsix)のダウンロード
**インターネット接続しているＰＣ** で、 [マーケットプレイスのＷｅｂサイト](https://marketplace.visualstudio.com/) にアクセスします。
その後、利用したい拡張機能ページに移動してダウンロードを行ないます。

+ 図右下の [ **Download Extension** ] をクリックして、**拡張機能ファイル** のダウンロード
+ ダウンロード完了後、オフラインＰＣにダウンロードファイルを移動

**e.g. [bracket-pair-colorizer] (https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)**
![BracketPair.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246506/5c5374fd-0ce5-f244-b248-6b16ba77970f.png)

## 2. インストール開始
+ **VsCode** を起動
+ 以下の手順でクリックしていき、ダウンロードした**VSIX拡張機能ファイル** を選択
  + a. 拡張機能アイコン
  + b. その他アイコン
  + c. VSIX からのインストール...

+ **[インストール]** をクリック

![VSIXinstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246506/f8b70354-d66b-6a2d-d76d-e77355d25705.png)
![VscodeExtInstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246506/ea48d928-eac0-c532-6242-a2a2ab1850e8.png)

## 3. インストール完了

画面右下に図のようなメッセージが表示されることがあります。
その場合 [ **今すぐ再度読み込む** ] をクリックしインストールを完了させます。
**再読み込み** が必要ない拡張機能もあります。
![CompleteInstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246506/ca68f14d-ab27-7728-c388-95db4e724d5b.png)

## 複数拡張機能のインストールについて 
**VSIXファイル** は複数同時にインストールが行えません。(複数のファイル選択が不可) 
複数の拡張機能をインストールする場合には、**１つ１つインストール** してください。
※2020/06/27現在

## おまけ
**[Ruby Gem]** インストールも **VsCode** と同様手法で行なえます。
ただし**GEM依存関係**にご注意ください(依存関係のある複数GEMの **インストール沼** にハマるかもしれません)。

+ [Ruby Gems](https://rubygems.org/gems/) のインストールしたいページに移動
+ 右端の [ **Download** ] から `GEMファイル` をダウンロード
+ ダウンロードした **Gemファイル** をインストール対象環境に移動
+ Gemローカルインストールコマンド `gem install --local path/to/gemfile.gem`
twitter api source検索はできない

twitterapiで soruce 検索できますよーと書いてあるが、あれは嘘。
できません。

ということで、アプリからツイートしたツイートを取得したい場合は、
ツイートした後にTweetIDを取得。
それをDBにツッコミ、あとからTweetId で lookup して検索しよう。
某日系SIer会社から大手外資系企業に転職して1年経って思ったこと。

新卒入社して5年、転職を考え出してから、転職活動、そして実際に転職して1年が経ったので思ったことをまとめてみる。
# きっかけ
まず前職についてだが、学生時代特にやりたかったことがなかったので、就職活動はあまり真剣にやらなかった。
5,6社くらい受けて運良く3社内定もらったので、早く解放されたいのもあって、何となく安定してそうな前職を選んで就職活動を終えた。
選んだのは、大手SIerの子会社。
配属先のプロジェクトは、なかなか忙しく大変だったけど、それなりに楽しくやっていた。
入社して数年が経ち、それなりに仕事もこなせるようになって、いつの間にかエンジニアという職種もすっかりハマっていた。
その時こんな状態だったこともあり、転職活動を始めた。

- 仕事に対する価値観や考え方が周りの人と全く違っていた
- エンジニアとしてもっと成長できる環境を求めいてた

#転職活動
まだ完全に転職する決心は固まっていなかったが、何か行動しなくては始まらないと思い、仕事がひと段落ついたタイミングで転職エージェントに登録して面談に行った。
（今思えばこの最初の一歩が大きかったと思う。同じように悩みだした人はとりあえず、行ってみる事をオススメする）

その後、「これまでのキャリア」と「今後のキャリアマップ」を毎日帰宅後寝ずに考え、整理した。実際に転職活動をして思ったのが、この２点をいかに追求して自分の頭の中で整理しておくかが大事だ。
当たり前のことかもしれないけど、面接がうまくいかない原因はこれが整理できていないことが多い。
これを整理して自分の考えをうまく話せるようになって、それでもうまくいかなかった場合は本当に「ご縁がなかった」のだと諦めて切り替えるのがいいと思う。

そんなこんなでご縁があり、大手外資系企業に内定をいただいた私は、思い描くキャリアマップに合致していたこともありすぐ入社を決めた。

#入社後
希望に胸を踊らせ入社したが、そんなすぐにうまくはいかなかった。
前職とはかけ離れた雰囲気やレベルの高さに圧倒されてしまい、全く自分の思ったとおりにはいかず、しばらくはキツイ日々が続いた。
正直最初の半年くらいは転職しなければよかったと思ったことも何回もあった。。
しかし、自分が求めていた環境はそこにはあったし、自分で決めた事から決して逃げたくない気持ちだけで毎日がむしゃらに努力した。
そして１年がたった今。。
**仕事が楽しい・・楽しすぎる。**
なんとかツライ時期を乗り越え、やりたいことができている今の環境に対してかなりのやりがいを感じている。
結局自分が求めていた環境だ、楽しいはずに決まっていたのだ。
そうなってくると目に見えて自分が成長しているのがわかる。

#最後に
今は転職して本当によかったと思っている。
別に転職をオススメしているのではなく、自分にあった環境を見つけることはとても大事だと思う。
本当は今の職場が嫌だけど「転職はリスクが・・」、「安定しているし・・」なんて話をよく聞くが、そんなことを考えていること自体かなりのリスクだし、今の時代安定した企業なんてものは存在しない。（むしろ今安定しているとか言われている企業ほど、将来が危ないと思っている）
一度きりの人生、大部分を占める仕事なのだから、後悔はしないようにしましょう！！
Rider(追記:Visual Studio for Mac も) では C# で書かれた Unity 標準のクラスを直接見れる話

# 導入
みなさんは、Unity のコードを何のエディタを使って書いていますか?

- Monodevelop
- Visual Studio (for Mac 含む)
- Visual Studio Code
- Rider

選択肢はいろいろあると思いますが、私は Rider を使っています。

最近、Unity の C# 部分が公開されるようになりましたね。
http://tsubakit1.hateblo.jp/entry/2018/03/24/140146

ただ、このとき思ったのが、「あれ?いままで見れなかったっけ?」と疑問に思いました。(同僚にも言われて気付いた)

# 様々なエディタで UnityEngine.UI.Button を開いてみる
大体のエディタは、(Mac だと)⌘を押しながらクラス名をクリックすると、そのクラスの定義に飛ぶことができます。実際にその機能を使って、Button クラスに飛んでみましょう。

## Visual Studio for Mac

 virtual な関数の中身が見れない。 

4/1 追記 : 一手間掛ければ見れます。ほんのちょっとだけ設定が必要。
<img width="944" alt="スクリーンショット 2018-04-01 0.44.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/b9a68aa5-06a6-4d2c-e0e8-6a039efe397b.png">

設定は簡単です。一度 ⌘ + Click で Button 定義に飛んで、左上の可視性を「パブリックメンバー」から「すべてのメンバー」に変更、右上の言語を「概要」から「C#」

<img width="941" alt="スクリーンショット 2018-04-01 0.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/cfb7c755-aa2e-1f3a-8b63-9089449ea596.png">

中身がみれた!


## Visual Studio Code
virtual な関数の中身が見れない
<img width="942" alt="vsc.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/1a66917b-9b7e-0c29-2d3a-380752190a46.png">

## Rider
クリックすると、デコンパイルが走る。その後、virtual な関数の内部実装もちゃんと読める。

<img width="719" alt="rider.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/6c930f83-2f83-7db6-d9de-7b301ab33cb6.png">


monodevelop は・・・ごめんなさいインストールするのがﾒﾝﾄﾞｸｻｶｯﾀ。けど、たしか　Monodevelop も見れなかったはず。

4/1追記 : MonoDelevep でも Visual Studio for Mac と同様の手順を踏めば見れるはず。(やっぱインストールするのがめんどくさかった)

# まとめ
uGUI をいろいろ触っていると、「なんでこの挙動になってるの?どうやってか、内部の関数を override したり、変数書き換えたりできない?」と思うことが多々増えてきます。
そのときに、⌘+クリック一発で内部実装を見に行けるのは、調べ物の時間的に短くなるでしょう。
(ただし、デコンパイルできるのは C# で書かれた範囲だけなのであしからず)
iOSエンジニアが個人で利用するCI環境の選択肢

最近個人的にアプリを開発をしているんですが会社ではBitriseを利用しているので個人的にも何かしらCI環境を利用したいなと思っています。
個人だし今後売れるか分からないアプリを開発するのにいきなりお金を払うのも辛いのでなるべく無料で利用出来る物を選択したいですよね。
というわけでいくつか調べてみました。

前提条件としてビルド->アーカイブファイルがiPhoneでインストール出来る様にする所までを試した内容となります。

## [Bitrise](https://www.bitrise.io)

会社でも利用しておりだいたいの仕組みは把握しているので個人的に大本命でしたが、無料枠だとビルド時間10分までという制限に悩まされる事になります。
特にCocoaPodsで利用するライブラリを導入するとコードをビルドする必要が出てくるので導入した瞬間にビルド時間がグンと伸びます。
なるべくライブラリはCarthageを利用する、対応してないものは `.framework` を直接ダウンロードしてプロジェクトでインポートして利用する等の工夫をしてビルド時間が伸びない様に頑張りました。
何度か調子が良い時はビルドが完了するんですが、結局アーカイブ中や `.ipa` をアップロードする間にタイムアウトが発生して上手くいかない事が増えてしまい利用するのを断念してしまいました。

## [CircleCI](https://circleci.com)

macOS上でのビルドが有料のみなので一旦無視。
とはいえ最小構成の値段が$39〜という所は有料枠の中では安いので今後利用の可能性はあるかと思います。

## [TravisCI](https://travis-ci.org)

Publicなリポジトリは無制限でビルド出来るらしいですが今はPrivateで行なっているので試せず...ライブラリのビルドには良さそう。
後でライブラリのビルドに試してみようと思います。

## [Visual Studio App Center](https://azure.microsoft.com/ja-jp/pricing/details/app-center/)

先日のiOS Test Nightで発表されていたので利用してみました。
1回のビルド時間が30分まで無料というのがかなり魅力的でしたが、Xcodeの追従が少し遅いのが気になりますね。
正直Xcode 9.3が出るまで **ずっとこれでいいじゃん** と思える程気に入っていたんですが今日(2018/03/31)時点でXcode 9.3に追従してくれてなくて悲しみを覚えています...w
また、`Distribute` 機能を利用しようとすると `Adhoc` のプロビジョニングファイルを利用する必要がある等少し癖がある印象です。

## 表にしてみた

|   | Bitrise | CircleCI | TravisCI | App Center |
|:-:|:--------|:---------|:---------|:-----------|
| 無期限無料枠 | 有 | 2週間のみ | Publicなリポジトリのみ | 有 |
| 値段 | $50〜 | $39〜 | $69〜 | ¥4,480〜 |
| 無料枠での1回のビルド時間 | 〜10分 | - | - | 〜30分 |
| 月のビルド時間 | 200回まで | - | - | 〜240分 |
| Xcodeの追従 | 早い(Betaが出たらすぐ対応される。Xcode 9.3正式版対応済み。) | - | まぁまぁ早い(Xcode 9.3 betaに対応済み) | 遅い(Xcode 9.3が正式リリースされても未対応) |
| カスタマイズ性 | かなり柔軟 | - | YAMLファイルを編集するのでやろうと思えば何でも出来そう | 一応カスタムスクリプトは実行出来るのでなんでも出来そうだけど元々用意されているのは少ない |

※あくまで期間の制限無く無料で利用出来るものしか調べていないのでCircleCIとTravisCIは調べきれず
※最新のXcodeへの追従を更新(22:00)

## まとめ

Bitriseのビルド時間がもう少し伸びてくれたら最高なんですがなかなか無料で快適に利用出来るCIは見つからないですね。
アプリの規模が小さくビルドが10分以内で収まるならBitrise、ビルド時間が10分を超えてしまうが新しいXcodeが出ても暫くアップデートしないなら今の所App Centerが本命かと思います。
個人的には今年Appleが買収したBuddybuildが開発者に無料で解放されたりすれば最高だなーという未来を期待しています。

ではでは。

※誤った情報やおすすめのCI環境などあればコメントや編集リクエストを頂ければと思います。
settings.gradle 日本語訳

settings.gradle に記載されているコメントの日本語訳。

#settings.gradle

本設定ファイルは ``gradle init`` タスクによって生成されたファイルである。

本設定ファイルはビルド時にどのプロジェクトを含めるかを指定する為に使用する。
シングルプロジェクトをビルドする場合は本設定ファイルは空のまま、
または削除しても良い。

Gradle によるマルチプロジェクトのビルド設定についての詳細は
[user guide](https://docs.gradle.org/4.4.1/userguide/multi_project_builds.html) を参照。

マルチプロジェクトの一部としてプロジェクトを宣言するには ``include`` メソッドを使用する。

```gradle
include 'shared'
include 'api'
include 'services:webservice'

rootProject.name = 'test'
```
Laravel DebugbarにPHPのmemory-limitを食いつぶされた話

Laravel5.5だよ。

リリース前のテスト中、`Error: Allowed memory size of 134217728 bytes`が出た。
適当に「Laravel　メモリ」で調べてみると、Eloquentを脳死で`get()`してると結構起こるとのこと。
というわけで`cursor()`だなんだで処理を置き換えて、さあこれで大丈夫だろうと思ったらどうにも直らない。

しかし`memory_get_usage`してみても10485760としか出ず。


# 結論

タイトルの通りだこの野郎。
Laravel Debugbar（の、おそらくクエリログ機能）が全部持ってってた。
`memory_get_usage`で拾ってたのは処理本来のメモリ消費量だけだったってことだろうか。

.envに`DEBUGBAR_ENABLED=false`オプションを書いてやると機能をまるっと停止できる。
手っ取り早く止めたいならこれでおｋ。


# 余談：↑に至るまでの経緯

「Laravel　メモリ」で調べてた時に、デフォルトでメモリにクエリログ記録するから無効にしたほうがいいよーみたいな記事も見たのでとりあえず以下のコードを試してみた……のだが、効果がなかった。

```php
\DB::connection()->disableQueryLog();
```

とりあえず`Illuminate\Database\Connection.php`まで追っかけて、`disableQueryLog()`の処理を見てみる。

```php
    public function disableQueryLog()
    {
        $this->loggingQueries = false;
    }
```

`loggingQueries`にfalseをセットしてる。しかしその`loggingQueries`は追ってみたらデフォルトでfalse。つまり`\DB::connection()->disableQueryLog();`はやっぱり無意味。
バージョンアップで変わったのですかね？ともかく冤罪だった。

ふと思い出す。**「Debugbarにクエリログ出てるやんけ！」**
試しに止めたらさっくり動いたと。こんなんで丸一日潰したの結構悲しかった。
vsftpd3.0.3の設定（Ubuntu 16.04）

Ubuntu 16.04にvsftpdをインストールする時の設定方法
>apt install vsftpd

vsftpd.chroot_listとvsftpd.user_listの作成
>touch /etc/vsftpd.chroot_list
cp /etc/ftpusers /etc/vsftpd.user_list

vi /etc/vsftpd.confを編集 
>listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftp **（→※1ここに注意）**
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
seccomp_sandbox=NO
force_dot_files=YES
pasv_enable=YES
pasv_promiscuous=YES
pasv_min_port=10000
pasv_max_port=10030
tcp_wrappers=YES
userlist_enable=YES
userlist_deny=YES
allow_writeable_chroot=YES

※1
普通にapt vsftpdでインストールすると何故か
`pam_service_name=vsftpd`
になっているので、変更する必要がある
変更を忘れると、ログイン時に
`530 Login incorrect.`
のエラーでログインできない！！

~~pam_service_name=vsftpdのせいでドハマリしたのは内緒~~
「Amazon Web Services 定番業務システム12パターン設計ガイド」を読みながら実際に構築する③ 〜ssh公開鍵認証〜

# 概要
自分は普段Webやアプリのバックエンドエンジニアとして従事しており、ここ1年はずっとアプリのバックエンドとして、開発、保守を担当している。
インフラは当然のようにAWSが使われているが、構築と保守自体はアウトソーシングされているため、設定変更などは依頼ベースとなっている。
そんな事で知見はある程度貯まっていくが、自分で触らない以上最低限のレベルには到達出来ないという想いから本を買って実際に手を動かす事にした。

まず、以下の本が評判良かったのでAmazonで即購入。
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B01IB6Q1CA/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B01IB6Q1CA&linkCode=as2&tag=amazooooooooo-22&linkId=2c5db08621964edf2076fdd39e0022b3">Amazon Web Services　定番業務システム12パターン設計ガイド</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=amazooooooooo-22&l=am2&o=9&a=B01IB6Q1CA" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

本に書いてある事はなるべく書かないで、それ以外にやった事や、本当にど素人だとつまづきそうなところ、自分もハマったところを中心に書いていこうと思う。

過去記事
[「Amazon Web Services 定番業務システム12パターン設計ガイド」を読みながら実際に構築する① 〜VPCとサブネットとEC2とセキュリティーグループ〜](https://qiita.com/tera78/items/ff3b521ff87a65d98b18)
[「Amazon Web Services 定番業務システム12パターン設計ガイド」を読みながら実際に構築する② 〜Route53〜](https://qiita.com/tera78/items/9f95301e8b2ecb200e78)

# OS環境をWebサーバーとして設定する
まず、ssh接続する際の、以前ダウンロードした秘密鍵は通常 *$(ホームディレクトリ）/.ssh/* の下に配置する。 *.ssh* 無ければ作ってください。
SSHクライアントはコマンドベース前提で話をするが、SSHクライアントが何であるかに関わらず以下は決まりなのでやっておくこと。
・ 秘密鍵を配置する *.ssh* ディレクトリのパーミッションは *700* にする
・ 秘密鍵のパーミッションは *600* にする

以下のコマンドでssh接続する。（例では鍵の名前が「key_1-1.pem」。別に何でもいいけど、拡張子はエンコード方式が分かる.pemが良いと思う）

```
ssh -i .ssh/key_1-1.pem -l ec2-user <EC2のパブリックIP>
```

初めて接続する際は以下のようなメッセージが表示されるが、これはsshで初めて接続するIPの場合に、「本当に大丈夫か？」とセキュリティを心配して促してくれる~~お節介な~~親切な機能なので気にせずyesとしておけば良い。一度接続すれば *.ssh/known_hosts* に記録され、次回以降は聞かれなくなる。

```
The authenticity of host '<EC2のパブリックIP> (<EC2のパブリックIP>)' can't be established.
ECDSA key fingerprint is SHA256:XinTfFzEDv3dQU8g+lq5FQD0wfwR+5pH0tZHT14YDU9.
Are you sure you want to continue connecting (yes/no)?
```

sshログイン後、言われるがままコマンドを叩き、インターネットでアクセス出来る準備は完了。
そしてブラウザからFQDNでアクセスしようとすると、「このドメインはお名前.comで登録されています」ていう画面に飛ばされてしまう。
どうやらお名前.comにDNSサーバを登録しないとダメらしい。その手順は
[「Amazon Web Services 定番業務システム12パターン設計ガイド」を読みながら実際に構築する② 〜Route53〜](https://qiita.com/tera78/items/9f95301e8b2ecb200e78)
に書いてあるのでそちらを参照して欲しい。

・・・

その後1時間くらい待ったらちゃんとFQDNで接続された！

---
1-1はこれで終わり。次回は1-2。
[「Amazon Web Services 定番業務システム12パターン設計ガイド」を読みながら実際に構築する④ 〜AMI、ELB〜](https://qiita.com/tera78/items/5b728979eab911c775b5)
cakephp3にbootstrap適用

### composerを使い、bootstrap-uiをインストール
[bootstrap-ui](https://github.com/friendsofcake/bootstrap-ui)

```
composer require friendsofcake/bootstrap-ui
```

### プログラム修正
```php:config/bootstrap.php
// bootstrapUIを使用
Plugin::load('BootstrapUI');
```

UIViewを継承する
初期化で親のメソッドを呼び出す

```php:src\View\AppView.php
use BootstrapUI\View\UIView;

class AppView extends UIView
{
    public function initialize()
    {
        parent::initialize();
    }
}
```

### bootstrapとjqueryをインストールする
bootstrapは最新の4では動かないので、3をインストールする。

```
bower install bootstrap#3.3.7 --save
bower install jquery --save

cp bower_components/bootstrap/dist/css/* webroot/css/bootstrap/
cp bower_components/bootstrap/dist/js/* webroot/js/bootstrap/
cp bower_components/bootstrap/dist/fonts/* webroot/font/bootstrap/
```

ここまでだと表示がきれいではないので、用意されているレイアウト調整用ctpを読み込む

### レイアウト調整用ビューを読み込む

```
cp vendor/friendsofcake/bootstrap-ui/src/Template/Layout/examples/* src/Template/Layout/TwitterBootstrap
```

ctpに下記を追加する。

```
<?php
$this->extend('/Layout/TwitterBootstrap/dashboard');
?>
```
住宅ローン計算に使う Google Spreadsheet (Excel) 関数

住宅ローン計算に使える Google Spreadsheet 関数の使い方を毎回忘れてしまうのでメモ。

```:前提
利率:   利息の年率。     例) 0.65%    (0.65% という意味)
年数:　 完済まで年数。   例) 35       (35年ローン という意味)
借入額: 開始時の借入額。 例) 50000000 (5000万円 という意味)
何年目: 知りたい時点。   例) 10       (10年目時点 という意味)
```

元利均等
=========

【元利均等】で一定期間に支払う【合計利息額】
-------------------------

```
=CUMIPMT(年利/12, 年数*12, 借入額, 1, 何年目*12, 0)

関数名の意味: Cumulative Interest Payment (累積利息の支払い)

例の場合
=CUMIPMT(0.65%/12, 35*12, 50000000, 1, 10*12, 0)
-2830968.769
10年目では合計で約283万円の利息を支払うことになる。
```


【元利均等】で一定期間に支払う元金の【合計返済額】
-------------------------

```
=CUMPRINC(年利/12, 年数*12, 借入額, 1, 何年目*12, 0)

関数名の意味: Cumulative Principal (累積元金)

例の場合
=CUMPRINC(0.65%/12, 35*12, 50000000, 1, 10*12, 0)
-13145159.08
10年目では合計で約1315万円の元金を返済することになる。
```

【元利均等】で【毎月の支払額】
-------------------------

```
=PMT(年利/12, 年数*12, 借入額)

関数名の意味: Payment (支払い)

例の場合
=PMT(0.65%/12, 35*12, 50000000)
-133134.40
毎月約13万3000円の支払いをすることになる。
```


元金均等
=========

【元金均等】で一定期間に支払う【合計利息額】
-------------------------

```
※元金均等の場合、総額を求める関数がないので数式で対応する必要がある。

=借入額 * 年利 * 何年目 * ((何年目*12 - 1) / 2 / (年数*12) - 1)

例の場合
=50000000 * 0.65% * 10 * ((10*12 - 1) / 2 / (35*12) - 1)
-2789583.333
10年目では合計で約279万円の利息を支払うことになる。
```

【元金均等】で一定期間に支払う元金の【合計返済額】
-------------------------

```
=-借入額 / (年数*12) * (何年目*12)

例の場合
=-50000000 / (35*12) * (10*12)
-14285714.29
10年目では合計で約1429万円の元金を返済することになる。
```

【元金均等】で【毎月の支払額】
-------------------------

```
※元金均等では毎月の支払額が一定ではない。

=-借入額 / (年数*12) + ISPMT(年利/12, 何か月目 - 1, 年数*12, 借入額)

ISPMT関数の関数名の意味: 謎。Lotus 1-2-3 互換で存在しているらしい。

例の場合
1か月目:
  =-50000000 / (35*12) + ISPMT(0.65%/12, 1 - 1, 35*12, 50000000)
  -146130.9524
2か月目:
  =-50000000 / (35*12) + ISPMT(0.65%/12, 2 - 1, 35*12, 50000000)
  -146066.4683
10年目の最後の月の支払い:
  =-50000000 / (35*12) + ISPMT(0.65%/12, 10*12 - 1, 35*12, 50000000)
  -138457.3413
35年目の最後の月の支払い:
  =-50000000 / (35*12) + ISPMT(0.65%/12, 35*12 - 1, 35*12, 50000000)
  -119112.1032
毎月約14万6000～11万9000円の支払いをすることになる。
```
[ue4] 意外と忘れてるアクタ（アセット）のグループ化とグループのマージアクタ（アセット）化

#【前提】
__・Unreal Engine 4 (UE4)に関する記事です__
__・久し振りなので、簡単な記事を書いてみるテスト__
__・私の環境がWindowsなのでキーなどはWindowsで説明しています__

モジュラーアセット（Modular Assets）等を買ってみたのは良いけど。
レベル上に配置するときに結構面倒だったりします
そんなとき、便利なアセットのグループ化とアクタのマージによるマージアセット化ですが。
結構、私が忘れることが多いので備忘録的な記事です。

#【アクタ（アセット）のグループ化】
アセットのグループ化はアセットを複数選択後
CTRL+Gを押下することで可能です。

１）アクタをCTRLキー（SHIFTでもOK）を押下しながら複数選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/59114/ae46c61a-1e90-c293-04bd-085e1833b702.png)

２）アクタがグループ化
以下のようにグループ化されます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/59114/51b0a43c-bcaf-72a0-f415-55de7643f4be.png)

逆にグループ化の解除はCTRL+G+SHIFTで可能です。
![0.png](https://qiita-image-store.s3.amazonaws.com/0/59114/797ea99a-6bbc-43fe-b2e7-b99e8c589d34.png)


ちなみに複数選択するにはCTLキー（SHIFTでもOK）を押しながらアセットを選択します。


#【アクタ（アセット）のマージアクタ（アセット）化】
アクタを複数選択してアクターをマージし、アセット化する方法は以下です

１）アクタをCTRLキー（SHIFTでもOK）を押下しながら複数選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/59114/ae46c61a-1e90-c293-04bd-085e1833b702.png)

２）マウスの右クリックし以下画面のアクタのマージを選択
![3.png](https://qiita-image-store.s3.amazonaws.com/0/59114/0018ceed-4b4a-8008-5c12-88142158405d.png)

３）以下のマージ確認画面が出力されます
![4.png](https://qiita-image-store.s3.amazonaws.com/0/59114/cb0bbdc0-df67-4429-58bb-ccad66118527.png)

４）名前を付けてアクタ化（アセット化）
![5.png](https://qiita-image-store.s3.amazonaws.com/0/59114/35ae549f-24ee-5b2f-8890-d0356a9ba441.png)

５）マージアセットを使用する
以下のアクター（アセット）が作成されるのでレベルに配置していきます
![6.png](https://qiita-image-store.s3.amazonaws.com/0/59114/f000bd41-0cdf-a445-ef5a-a1c737627aa5.png)

レベルにドラッグアンドドロップで配置
![7.png](https://qiita-image-store.s3.amazonaws.com/0/59114/5be9c2d3-bb64-0afd-1c23-f12c3c935181.png)

この機能を使用すれば、建築物やモジュラー化されたアセットの配置がとても楽になります。
一度、建物などをモジュラーアセットで構築してマージしてしまえば、あとはマージアセットをぽんぽん配置していけるからです。

アセットを購入すると大体、使用例的なマップ（レベル）があると思います。
そこからぱく。。。真似するのもありありです。

【最後に】
今回は、久し振りに記事を書いたので私のリハビリと備忘録的な記事でした。
最後まで読んでいただいてありがとうございます。
CUDA9.1込みのビルドできた？ for Windows

メモ

あいまいにかいておきます。
みんな知っていると思いますが。
前にも似たようなこと書いてます。

現時点で　Cuda9.1とインテグレーションするなら　VisualStudio2017(15.4)を用意します。

そして、コンフィグが終了したら開発者用コマンドプロンプトからコードページを変更して、MSBUILDで該当のソリューションをビルドしましょう。アカウントのコードページ変更すればIDEからでもできます。

以上、よろしくお願いします。