OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでの水彩画風ポストエフェクト


### 今回以下のアドベントカレンダーにも投稿しました
・ARKit Advent Calendar 2018：UnityとARkitで電脳コ◯ルなアプリを作った話
https://qiita.com/awesome/items/5b8ee2b62c0076fbc569

# 以前Twitterで話題になっていた、UE4による水彩画風ポストエフェクト
http://3dnchu.com/archives/watercolor-post-process-material-aqu/

を、Unityで作ってみました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/e9901bf0-6ec8-4290-e827-4066e25cebcf.png" width="500">

## 以下ツイッターに投稿した動画
<!-- https://twitter.com/awesome_now/status/1028264773245460480 -->


# ■OnRenderImageを使う。
引数としてレンダリングされた結果をRenderTextureとしてもらえるので、それに対してシェーダーでフィルターをかけることでエフェクトをかけることができる。
OnRenderImage関数内で
```Graphics.Blit(renderTarget1, renderTarget2, uvShiftMaterial);
```
とすることでレンダーターゲットにシェーダーを割り当てることができます。

引数に渡すrenderTargetとマテリアルを何個かあらかじめ作成しておき、
何度も何度も反復してマテリアルとrenderTargetを差し替えていくことで絵を作っていきます。
必要であれば、その間3Dモデルのマテリアルも差し替えます。

版画で色を重ねていくような作業ですね！

# 1.ベースとなるレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/21ef6251-2674-0ad0-6931-cc4a7cbde15a.png" width="500">
UnityのStandardShaderと、アウトライン用のマテリアルでアウトラインをノーマル方向に押し出した状態。

# 2-1.アウトラインのみのレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/2280ad88-18a5-d6c4-dc4c-96e58db9f849.png" width="500">
一部のマテリアルを差し替えてアウトラインのみを抽出した状態。

# 2-2アウトラインにノイズフィルターをかけたレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/adbee6ad-3e00-3312-2338-625e026f6ef2.png" width="500">
先ほどのアウトラインのレンダリング結果に、
・ノイズテクスチャでマスク
・ノーマルマップで歪み
を加えた。

### 以下フラグメントシェーダーの記述です
//ノーマルマップで歪ませる
```float4 n = tex2D(_ShiftNormalTex, i.uv * 4. ); //4は歪みのサイズ
float4 col = tex2D(_MainTex, i.uv + n.xy * 0.03 ); //0.03はstrength
```
<img width="443" alt="スクリーンショット 2018-12-22 19.11.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/59095/497917f1-f390-4a37-6752-1166c9498f1b.png">

# 3.ディフューズのレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/b2929bdc-4b3a-4826-f882-f1d57247eb27.png" width="500">
ディフューズに色をつけただけのもの。

# 4.テクスチャカラーのみのレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/1bf069f2-abca-a109-c4a3-d482ef181cb3.png" width="500">
テクスチャカラーのみをレンダリングしたもの。

# 5.ハイライトのみのレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/f5a757ab-31f8-7b29-e422-0a0a6aebc0ba.png" width="500">
ハイライトのみをレンダリングしたもの。

# 6.影のマスクのみのレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/96333966-2eef-8794-b807-c3f7662d3623.png" width="500">
影をレンダリング後、ノイズを加えたもの。
<img width="139" alt="スクリーンショット 2018-12-22 19.14.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/59095/7423e902-44bf-8f4c-546b-8fa298eb3be8.png">

# 1〜6全てを合成したレンダリング結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/df4b9a4f-e903-7514-d498-75ad62b615be.png" width="500">

アウトライン＋ディフューズ＋カラー＋ハイライト＋シャドウ
を全て合成した結果です。
例えるならば、雰囲気的にはPhotoshopのレイヤーモードを変更したり、フィルターをかけたり・・・というふうに合成していく感じです。

# 最後に
体調悪くて雑な記事になってしまいすみません・・・
Docker よく使うコマンドまとめ

よく使うコマンドだけです。

## ダウンロードして(バックグラウンドで)起動
ついでにオプションで名前も追加

```bash
$ docker run -itd --name [container-name] ubuntu
```

## 起動のコンテナを確認
```bash
$ docker ps
```
起動していないコンテナも確認

```bash
$ docker ps -a
```

## ログイン
```bash
$ docker exec -it [container-name] /bin/bash
```

## 停止
```bash
$ docker stop [container-name]
```

## 起動(2回目以降)
```bash
$ docker start [container-name]
```

## コンテナの削除
```bash
$ docker rm [container-name]
```

## イメージの削除
```bash
$ docker rmi ubuntu
```

## イメージの作成
```bash
$ docker commit [container-name] [test-user/hello]
```
[test-user/hello]の場所がイメージの名前
Rails Girlsに参加した人のnext stepになるような本を書こうと思っています。

こんにちは。Rails Girlsでは[Tokyoの5回目](http://railsgirls.com/tokyo-2015-09-12.html)のオーガナイザーをしました。よう([@youchan](https://twitter.com/youchan))といいます。この記事は[Rails Girls Japan Advent Calendar 2018](https://qiita.com/advent-calendar/2018/railsgirlsjapan)の22日目の記事として書きました。


Rails Girlsに参加した皆さん、どうでしたでしょうか？楽しかったですか？

こう質問すれば、大抵の参加者からは楽しかったー！という返事が返ってきます。そうなんですよ。Rails Girlsは参加者の満足度の高いイベントとしても知られています。

それでは、Rails Girlsに参加したあとにRailsで何かつくったりしましたか？

これはどうでしょう？
先程の質問に比べたら、大分ポジティブな答えは減るでしょう。
しかし、結構な数のGirlsからやってる！という答えが返ってきます。
中には、[Rails Girlsがきっかけエンジニアになりました。](http://d.hatena.ne.jp/katoriexxxkatorie/20161202/1480663925)なんて人も出てきます。
このアドベントカレンダーでも、[ねこさん](http://neko314.hatenablog.com/entry/2018/12/07/000000)がそのチャレンジをしています。

このようにRails GirlsきっかけでRailsエンジニアになんていう夢溢れる話もありますし、たとえエンジニアにならなくてもプログラミングの楽しさの一端を見ることができたのではないかと思います。
ぜひ、今後も続けてもらえたらうれしいなと思います。

さて、そこでプログラミングの話なのですが、Rails Girlsのチュートリアルをやって、Railsは簡単にWebアプリケーションがつくれるものということが解ったと思いますが、Rubyについてはどうでしょう？

Rubyについてなんとなくでも解っていただけたでしょうか？RailsはRubyで作られているらしい、それくらいの理解でしょうか？

Rails Girlsではおそらく後者くらいの理解でおわるのではないかなと思います。それはRails Girlsの目的からそのような理解でよいということになります。もちろん参加者のレベルによってはコーチからもっといろいろ教わったという方もいらっしゃるでしょう。

プログラミングの経験のない皆さんでも、Rails Girlsのカリキュラムでは拍子抜けするくらい簡単にWebアプリケーションが作れたと思います。カスタマイズも簡単！それはRuby on Railsというフレームワークがとても良く出来ていることの証左でもあります。実はRails Girlsのカリキュラムの中にはほとんどプログラミングという要素が出てこないのです。

Rails Girlsはプログラミング教室ではないのでこれでよいのですが、私は皆さんにもっとプログラミングの面白さを知ってもらえたら嬉しいなと思っています。
そこで、Rails Girlsを終えたくらいの人に向けて楽しくプログラミングを体験してもらえる教材をつくりたいと思いました。

私の最近の趣味は技術書の同人誌を書くことです。
[技術書典](https://techbookfest.org/)という技術書の同人誌即売会があります。この技術書典に出会って同人誌を書くようになりました。
これまでは自分が書きたいことがあってそれを書いてきたのですが、もっと読者について考えて読者に寄り添った本を書きたいなと思うようになりました。
私はRails Girlsに関わってきてRails Girlsの卒業生に向けて、もっとプログラミングの楽しさを伝えられる本が書けたらよいなと思いました。

そんな中、[湊川あい](https://llminatoll.github.io/)さんと知りあい、彼女の書く本(マンガ)が私の望みにとても適っていると思い、一緒に「マンガでわかるRuby」を書きましょうと提案しました。
湊川さんに快諾していただき「マンガでわかるRuby」の企画が始まりました。いま二人で企画を進めているところです。ぜひ次の技術書典で手に取ってもらえたら嬉しいと思います。
Kustomizeでkubernetesテンプレートの管理を一元化する

kubernetesのリソースをtemplateで一元管理する方法を運用し始めたので、その時の備忘録をご紹介します。
トピックは主にkubernetesを利用したことがあり、kustomizeを使っていないくらいの初心の方を対象にしています。

# Kustomizeとは

[公式のリポジトリはこちら](https://github.com/kubernetes-sigs/kustomize)

既存のkubernetesオブジェクトのリソースファイルをdepoyment.yml,service.tmlなどをkustomization.ymlで指定したロケーション通りに配置し、kustomize buildコマンドを実行すると、kustomization.ymlを基にしてkustomizeによるテンプレートの加工と結合を行い、kubernetesオブジェクトの一括デプロイを行うことができます。
例として、

```
sample/
├── configMap.yaml
├── deployment.yaml
├── kustomization.yaml
└── service.yaml
```

と言うようなディレクトリでkubernetesオブジェクトを配置してみます。

```shell
kustomize build ./sample | kubectl apply -f
```

以上の通り、kubernetesのオブジェクトは一括デプロイを前提になるので、デプロイの依存関係や実行順序に依存しない単位で設定をbundleするように使ったほうがよさそうです(いい運用の仕方があれば教えていただけると嬉しいです。)

公式リポジトリをcloneしexamplesのフォルダで出力を簡単に試すことができます。ここまでの使い方だと。

```shell
kubectl apply -f ./sample
```

と何が違うのかという疑問が出てくるかと思いますが、

一つはkustomization.ymlという設定を追加したり上書きできることによって、一度定義済みのテンプレートファイルに変更を加えることなくそのまま使い回せるということです。つまり、一度作ったテンプレートの差分を検証したい場合には変更する必要のない設定を一箇所にまとめて、変更点が生じるファイルはkustomization.ymlの設定でパス設定をすることで、追加分だけkubernetesテンプレートファイルを作成し、マージしたり、deployment,staging,production用にリソースのテンプレートファイルの変更が生じる点だけ定義すればよいという利点が得られます。

この機能をよく表してる表現で公式のリポジトリでも、kustomizeは、kubernetesにおいて宣言を一つのファイルにまとめて行う点でMakefileのようなものであり、file編集したものを出力するものという意味でsedのようなものと述べられています。

ユースケースやAPIについては
https://github.com/kubernetes-sigs/kustomize/blob/master/docs/glossary.md
に詳しくまとめられています。

# Environmentによりパラメータ設定

例として、公式のリポジトリのldapサーバの構成を見てみます。

```
ldap
├── README.md
├── base
│   ├── deployment.yaml
│   ├── env.startup.txt
│   ├── kustomization.yaml
│   └── service.yaml
├── integration_test.sh
└── overlays
    ├── production
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── staging
        ├── config.env
        ├── deployment.yaml
        └── kustomization.yaml
```
base,overlaysというディレクトリ名はkustomizeディレクトリのコンセプトに寄る命名規則ですが、kustomization.ymlの設定次第なので変更することも可能です。
また差分の変更をわかりやすいようにファイル名で設定内容を記述すると可用性があがります。
たとえば、以上の例では、depoyment.ymlという名前をreprica_counts.yamlと変えるなどの工夫によって、変更点を作成者に明示することができます。

#　使った所感など

今回はkustomizeの導入利点を説明しました。使い方は簡単なので、自作でクラスタ作成を行う際に便利だと思います。
類似のツールに[helm](https://github.com/helm/helm)がありますが、こちらは、パッケージマネージャ-として、 すでに使いまわすことができるクラスタのスタック調整まで対応できるため、用途が分かれます。
これらをうまく組み合わせて、個人的にテンプレート作成のベストプラクティスを探っていますが、知っている方がいれば教えてください。

(2019/08/20)追記
kustomizeは現在kubernetesに標準インストールされていて-kオプションでkustomizeファイルに応じたdeployが出来るようになっていました。
FindPropertyRelativeで取得出来ない

# FindPropertyRelativeで取得出来ない

SerializedPropertyから子のメンバを取得しようとして出来なかったので迂回方法を模索した。
スマートではないのでもっと良い方法あったら知りたい。

**参考**
https://answers.unity.com/questions/543010/odd-behavior-of-findpropertyrelative.html

## 実際のコード

```C#:B.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class B : MonoBehaviour {
	public string name;
}
```

```C#:A.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class A : MonoBehaviour {
	public B b;
}
```

```C#:AEditor.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor (typeof(A))]
public class AEditor : Editor {
	private A a;
	private SerializedProperty serializedPropertyB;
	void OnEnable()
	{
		this.a = target as A;
		this.serializedPropertyB = this.serializedObject.FindProperty("b");
	}

	public override void OnInspectorGUI()
	{
		this.serializedObject.Update();

		// 取得できない.なんでなん？
		//var propertyBName = this.propertyB.FindPropertyRelative("name");

		EditorGUILayout.PropertyField(this.serializedPropertyB);
		// Bがある場合のみBのメンバ変数を表示する.
		if(null != this.serializedPropertyB.objectReferenceValue)
		{
			var serializedObjectB = new SerializedObject(this.serializedPropertyB.objectReferenceValue);
			// Bのメンバを更新する為ちゃんと実行しておきます.
			serializedObjectB.Update();

			var SerializedPropertyName = serializedObjectB.FindProperty("name");			
			EditorGUILayout.PropertyField(SerializedPropertyName);

			// Bのメンバを更新する為ちゃんと実行しておきます.
			serializedObjectB.ApplyModifiedProperties();
		}
		this.serializedObject.ApplyModifiedProperties();
	}
}
```
【Mac】Chromeで選択範囲をラクに読み上げる

何もしなくてもMacだと選択範囲を右クリックから
 　`スピーチ` -> `読み上げを開始`
でも読み上げが可能である

しかし、読み上げスピードを変更したり、読み上げのボイスの変更のやり方がわからなかったので、今回試した方法を書く


## 環境

- Mac
- Google Chrome
- BettorTouchTool (以下BTTと略す)
- Auto Copy (Chrome Extension)


## 要約
BTTのTrigger Predefined Actionで`Execute Terminal Command`を選択して
　`/usr/bin/pbpaste | /usr/local/bin/nkf -w | say`
と設定する(BTTのtriggerはお好きなもので)

Auto Copyを使う  

## ツールの説明
- BTT
    - 省略
- Auto Copy
    - 文字を選択すると自動でコピーしてくれるツールである。
もちろん`Command + C`全く問題ないが、更に快適にするために導入した

## スクリプトの解説
`/usr/bin/pbpaste | /usr/local/bin/nkf -w | say -r 300 -v Kyoko`  

- pbpaste  
    - クリップボードの結果を出力 
- nkf 
    - 文字コードや改行コードについて処理してくれる
        - デフォルトではないので、インストールの必要あり(`$ brew install nkf`など)
    - 読み上げる文字が英字の場合はnkfは必要ないが、日本語だと、BTTやAutomator上だとpbpasteの出力がASCIIとなりエラーになる。(sayはUTF-8のみらしい。また、適当なterminal上ではUTF-8になるのでエラーは起きなかった)
        - したがって、今回はnkfでUTF8に変換することにした
- say
    - 読み上げコマンド
    - オプション
        - `-f 300` で、1分間に300文字
        - `-v Kyoko` でKyokoに読ませる(英字の場合は、変更の必要がある)

## コメント
- 今回は違う用途でしたが、英語の学習で役に立つのではと思っています。その場合は`nkf`はいらないので以下のようにすれば問題ありません  
　`/usr/bin/pbpaste | say -r 120 -v Alex`
[go,echo]formからputをリクエスト~methodOverRide~

htmlのformには、action属性にgetとpostしか取れないため、deleteやputなどを指定できない。ではどうすれば、良いかというと、例えば、phpでは

```html
<form>
 <input type="hidden" name="_method" value="PATCH">
</form>
```

を書き入れればphp側でよしなに、処理してくれ、patchメソッドが走るようにしてくれている。
しかし、goでは同じように書いても動くわけがなく、上記の仕組みを自分で作成する必要がある。

では、どのようにすればいいかと言うと、routerのprocessが走る前に、処理されるmiddlewareを用意しなければならない。以下、golangのechoを使用しますが、フレームワークを使わなくてもほぼ同じです。

まず、main関数内で以下のようにMethodOverrideを読み込みます。

```go
e.Pre(controllers.MethodOverride)
```

これで、routerが走る前に最初に動かせます。私は、最初e.Useでも動くと思っていたのですが、うごかず積みました。公式にも、methodOverRideにはe.Preを使えと書いてありました。

![スクリーンショット 2018-12-22 18.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/253414/7911e579-129e-0a0b-279c-1970cb79ab6d.png)


で、読み込むmiddleWareですが、以下のような関数になります。

```go
func MethodOverride(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		if c.Request().Method == "POST" {
			method := c.Request().PostFormValue("_method")
			if method == "PUT" || method == "PATCH" || method == "DELETE" {
				c.Request().Method = method
			}
		}
		fmt.Println(c.Request())
		return next(c)
	}
}
```

つまり、Postメソッドが動いた際に、if以下が処理されます。methodに自分が使いたいhttp method(putやdelete,patchなど)を代入し、requestのmethodを書き換えてやります。そしてチェインさせて、次の関数を呼び出します。

```go
adminGroup.PATCH("/update", controllers.UpdateAdminUser)
```

以上です。

この記事に標準パッケージのみを使った同様の方法が書いてあります。
https://www.alexedwards.net/blog/http-method-spoofing
Unityの無限スクロールUI実装の一案 

# なぜ実装したか
UnityAssetStoreなどにもGitHubなどにも調べるといくつかありますが(**普通の実装**)、今回私がやりたいことの実現が難しいものだったため実装(**私の実装**)を行いました。

# 普通の実装
一般的に公開されているものは以下のように設計で行わていることが多いです。

下記は、GameObjectがF,A,B,C,D,E,F,Aと8つあります。赤文字のものは2つ同じアルファベットのGameObjectがあることを表しています。つまり、**別のGameObject**です。
![after.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/1d08f3f9-7121-034c-56b2-638f79dcf1d1.png)
↓
少しスクロールするとこんな感じ。
![before.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/0beae4bf-61e5-9d96-620f-490194441323.png)

このように画面外の見えていない部分に次のアルファベットがくるように書き換えて実装しているものが多いです。
基本的にこれで問題ないのですが、1つのGameObjectの構成が複雑な場合問題が発生します。
例えば書き換えコストが問題だったり、エフェクトなどの見え方の同期が複雑になりがちです。

# 私の実装
実装したものの都合上、横に置き換えています。
![before.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/99f53517-5597-1441-43da-da4735653672.png)
↓
少しスクロールするとこんな感じ。
0(ゼロ)が画面半分にかかって、右半分が画面左、左半分が画面右に表示されているような感じです。
よくファミコンであった、スーパーマリオブラ〇ーズ、コンボイの謎、アイスクライマー、パルテナの鏡など、ファミコン時代によくキャラクターがこのような表示になりましたね。
![after.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/db0c6294-71f1-24cc-78f1-48b01f5ad6a4.png)

違うところはは、赤文字の同じ数字の表示は、**同じGameObject**です。
GameObjectも0,1,2,3,4と5個しかありません。
同じものを表示しているので、書き換えたりしないし、エフェクトも見え方も同期をとる必要がないということです。

仕組みは単純でカメラを2つ用意して、表示を合わせて描画するだけです。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/220901ce-9bd6-1e80-6deb-404954da7a89.png)
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/d383df31-43e9-9302-92cb-febeb821134f.png)
↓ 表示を合わせる
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/9535a4d5-8d95-3f3c-45fd-2c654115edde.png)

実装プロジェクトです。
https://github.com/o-kuhiiro/MyScrollView
一応、uGUIのCanvasを使っていますが、考え方的には別の実装にも使えるかなと感じています。
3D的な扱いでないと2つのカメラで描画できないのでWorld Spaceを使っています。
Qiitaの下書き一覧で二重スクロールバーを防ぐためのCSS

# 現状
- 現状ではスクール可能な要素が入れ子になっているため，下の画像のようにスクロールバーが二重になっています
- これだとサクッとプレビューを見たいときに，最下端を表示するためのスクロール操作がスムーズにできず，何となくストレスです．
- また，プレビューの最下端が画面下部にくっついてしまっているのも，何となく歯がゆい感じがします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253921/22ea6639-571d-3dee-c9e2-150f9dccdcf0.png)

# 改善案
インスペクタ―を見たところ，要素のサイズが固定になっていることが問題のようです

```css:css
.draftItems{
    height: 850px;
}
.draftsPreviewContent{
    max-height: 785px;
}
```
を次のように書き換えるといい感じになりました．

```css:css
.draftItems{
    height: 100%;
}
.draftsPreviewContent{
    max-height: calc(100vh - 17rem)
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253921/0977ad93-8d68-f6ea-c20f-b0911aff089f.png)

同じように気持ち悪いなあと思っていた人は，これでやり過ごしてください

尚，サイトごとにスタイルシートをあてる方法としては以下が参考になるかもしれません

- [Chrome拡張およびFirefoxアドオン「Stylus」を使ったユーザースタイルシートの設定方法](http://pixadversaria.web.fc2.com/htuao/stylus.htm) | 地雷持ちが快適にpixivを楽しむための備忘録。
- [[Chrome拡張] よく見るサイトのデザインを自由に変えよう! 自作のCSSとJSを読み込ませる方法 [Stylish削除記念]](https://hirata.blog/201809_chrome-stylize/) | WEBA

# 追記

2019/07/21現在，Firefox 68.0.1で確認したところ，スクロールバーが二重になる問題が修正されていそうなことを確認しました
railsのログについて

#はじめに
Railsのログについて調べてみた。

#ログの書き方

ログの書き方は

```ruby 
logger.debug("message")
```

みたいに書く

ログにはレベルがあるらしく

下から

debug=>info=>warn=>error=>fatal=>unknown

という感じらしい

そしてデフォルトではすべてのログが出力されているから

```ruby 
Started GET "/users" for 127.0.0.1 at 2018-12-22 18:24:26 +0900
Processing by UsersController#index as HTML
[0;33;49musers/indexにアクセス[0m
  Rendering users/index.html.slim within layouts/application
  Rendered users/index.html.slim within layouts/application (1.5ms)
Completed 200 OK in 26ms (Views: 23.4ms | ActiveRecord: 0.0ms)


Started GET "/users" for 127.0.0.1 at 2018-12-22 18:24:26 +0900
Processing by UsersController#index as HTML
[0;33;49musers/indexにアクセス[0m
  Rendering users/index.html.slim within layouts/application
  Rendered users/index.html.slim within layouts/application (1.3ms)
Completed 200 OK in 24ms (Views: 22.1ms | ActiveRecord: 0.0ms)


Started GET "/users" for 127.0.0.1 at 2018-12-22 18:24:26 +0900
Processing by UsersController#index as HTML
[0;33;49musers/indexにアクセス[0m
  Rendering users/index.html.slim within layouts/application
  Rendered users/index.html.slim within layouts/application (1.4ms)
Completed 200 OK in 25ms (Views: 22.9ms | ActiveRecord: 0.0ms)
```

こんな感じでいろいろ出力される

ログのレベルを変えると表示も変わる


ログのレベルの変え方は

config/application.rbに

```ruby
config.log_level = :unknown
```

みたいに書く

この例だとunknownしか表示されない

debugにするとすべて表示される感じ。


とりあえず試しに

config.log_level = :unknownとしてdef indexに

```ruby
def index
    logger.unknown("users/indexにアクセス")
    @users = User.all 
  end
```

と書いてindexにアクセスしてみる

そうするとログは

```ruby 
[0;33;49musers/indexにアクセス[0m
[0;33;49musers/indexにアクセス[0m
```

みたいに表示される。


#ログの色を変える

ログの色を変えて表示したい場合はcolorizeというgemを使う

```ruby:gemfile
gem 'colorize'
```

bundle install

としたら準備ok

書き方は

```ruby
logger.unknown("hello?".colorize(:yellow))
```

みたいに文字列のあとにcolorize(:color)で色を付けられる。


#例外処理のログを出力

例外処理を行ってエラーが起きたらそのエラーのログを色付きで表示してみる。

createアクションにこんなコードを書く

```ruby:create
def create 
    begin
      @user = Userrrr.create(user_params)
    rescue => e 
      logger.unknown("ユーザー作成中にエラーが発生したよ～～～\n#{e}".colorize(:red))
    ensure
      redirect_to users_path
    end 
end 
```

Userのスペルが間違っているのでエラーが出る。

rescueでエラーを補足して => e　みたいしてeにエラーの情報を渡せる。

これで

```ruby:
[0;31;49mユーザー作成中にエラーが発生したよ～～～
uninitialized constant UsersController::Userrrr[0m
```

が色付きで表示される。

#おわりに

development.log以外のログファイルを作ってそこにログを出力させるということもできるらしいけどそれに関してはまた調べる。


もうすぐクリスマスだなぁ
おわり:snowman:
デバッグ心得

# はじめに

これは BeProud Advent Calendar 22日目の記事です。
https://adventar.org/calendars/3338

今まで業務でデバッグをやることが比較的多かったのかなと思うので、自分が日頃デバックで心掛けていることを簡単に書いてみます。

# まずは落ち着く
焦ってもいいことないので、落ち着いて調査プランを練るのがいいです。

# 適切な情報をそろえる
バグの発生状況について、まずは確認が必要です。
どの操作でどういった手順で起きたのか？どの環境で起きたのか？別の環境でも起きるのか？発生頻度は？どのデータなのか？などなどです。
この手の情報はあって困ることはそうそうないので、取れるに越したことはないです。
また、調査進めながらでも、必要だとわかったものについてはつどお願いして情報を取るのは大事です。

# 裏取りをする
できることならバグの再現を行ったり、不具合が発生したデータを確認します。
ひょっとすると、報告者の勘違いがあったり不正確な情報であったりするためです。
確認を怠ることで、必要以上に調査に時間ががかかったり、不必要な対応が発生するかもしれません。

# すぐにわかることから調査する
まずは簡単に試せるものや、すぐに結果がわかるものを優先します。
目安としては数分程度でわかる範囲です。
例えば、ログにエラー出力が出てるか、対象データはどうなってるのか、ソースコードで処理をざっと追ってみる、などです。
たとえ容易に結果が予想できることだとしても、調査コストがほぼかからないのなら、やるべきです。
やってみると意外と予想に反した結果がでることもあり、より無駄な労力を使わないためにも大事です。
また、二分探索を行う上でも、こういう確実な情報があると、調査がしやすくなります。

# 仮説を立てる
ある程度情報がそろうと、ここが怪しんじゃないかという予想が立てられるようになります。
仮説を立て、その仮説が正ならどうなるか、逆に誤ならどうなるかを考えましょう。
別データを書き換えたり、逆に書き換えなかったりしないか、ログに出力があるかないか、表示はどうなるか、などです。
そういったことを調査することで、仮説が正しいかどうかを検証していくことになります。
ここで大事なところは、別の仮説も立てられるかどうかです。
ここの考慮をしないと、間違った仮説の素に全く違った方向にいってしまい、遠回りをすることがあるためです。
いくつも仮説が立てられるなら、それを一つずつ潰していく調査をしていきます。
必要なら、これらを何回も繰り返すことで確度を上げていくことになります。

# 思い込みの排除
人間なので、何かしら先入観なり勘違いをしがちです。
バグ調査には邪魔で、大きく遠回りする要因になります。
自分は大丈夫と思うのではなく、自分は思い込みがどこかある、と常に思いましょう。

# チームメイトに相談する
わからなくなったときは、チームメイトと雑談レベルでもいいので、相談するのがいいでしょう。
ラバーダック相手でも同様に、声に出して説明すると整理されてすぐにわかるようになることもあります。
また、岡目八目で、チームメイトが的確な助言をくれるかもしれません。


# 原因究明と対処
バグの原因がわかれば、あとはソースコードの修正や、データ修正などで対応することになります。
ここでバグの再現ができていると、確実な確認ができます。
ただし、タイミング問題などの再現が難しいものもについては、ステージング環境などに修正を適用して様子を見るのが無難でしょう。

# おわりに
これ以外にもテクニック的な部分はありますが、簡単ではなくなるので、次以降の機会にしようと思います。
この記事の内容は当たり前だと思われるだと予想しますが、当たり前を当たり前として実践するのが大事だと思います。
UiPathの利用状況、エラー率をPowerBIで分析

企業内でロボットを本格的に展開すると、効果測定が課題になります。
それを分析するためのDashboardを少しだけ作ってみました。

#使ったツール
・UiPath
・PowerBI

UiPathのExcecutionログをPowerBIに取り込んで分析します。

#Dashboardの目的
・利用状況の確認　…　ロボットがどれだけ使われているか、あるいは使われていないかを把握
・ロボットの品質　…　エラー率を測定

#Dashboard画面
![ExcecutionLog分析_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/326520/eda1a938-9641-91a8-b0c5-e8ed83d421f8.jpeg)

##①ロボット起動数
ロボット全体で、どれだけの利用（＝起動）があったかを月別に見るグラフです。
ロボットの開発と展開を進めているフェーズであれば、基本的には、起動数は月毎に増えていくはずです。

もし前月より起動数が少なければ、何か問題が発生していることが想定されます。
　例：バグが発生した、ロボットが操作するシステムに変更があった、担当者が異動になった等

##②エラー数
ロボット全体で、どれだけエラーが発生したかを月別に見るグラフです。
新しくリリースされたロボがある月は増加する傾向にあります。

##③エラー率
ロボット全体のエラー率です。これが品質指標になります。
今回の例では、エラー率の目標値を35%としています。

（本来もっと低い数値にすべきですが、テストデータなので、ご容赦ください）

##④月別・ロボット別　起動数・エラー数・エラー率
ロボット別のエラー数・エラー率を調べるときのマトリクスです。
月別に、品質を維持しているか、改修したロボットはエラー率が改善されているか等の傾向を見るために使います。

起動数が多く、かつエラー率も高いロボットを優先的に対処すべきです。
そうすれば、全体の品質（＝エラー率）の改善に大きな効果があります。

##⑤ロボット別　起動数・エラー数・エラー率
月別でなく、通しでのロボット別のエラー数・エラー率を調べるときのマトリクスです。

#PowerBIファイルサンプル
https://drive.google.com/open?id=1CQx7vBSBGjlHH5EgAouRBeD77SV2BKLH

###PowerBIの更新手順
・複数のExcecutionログを分析したいときは1つのファイルにマージする必要があります。　
・クエリを編集　＞　データソース設定　から、分析したいExcecutionログファイルを指定し直してください。

#最後に
本当はElasticsearchと繋ぎたかったのですが、それはまた別の機会に…
VSCodeでファイル保存にrubocopのFormatterが動かない

#対応策
VSCodeの設定ファイル`settings.json`に
`editor.formatOnSaveTimeout"：5000`
を追加する。

デフォルトの750msだと短すぎて、タイムアウトしてしまうようです。
1500ms以上にすると良いそうです。

#出典
https://github.com/misogi/vscode-ruby-rubocop/issues/59#issuecomment-426918332
Android アプリでサポートするOSを変更したらリリースビルド失敗するようになった

## 前提
* AndroidStudio: 3.1 
* Gradle version: 4.4
* ReactNative: 0.57.1
* リリースに必要なもろもろ [参考サイト](https://qiita.com/wktq/items/6c83f17ccb68dc7dd666) は実施済み
* 過去にほぼ同じ条件でリリース通ったことあり
* クライアントの要望により minSdkVersion の値を低くした

## エラー内容
```cli
error: invalid file path '/[アプリのディレクトリ]/[アプリ名]/node_modules/react-native-sensitive-info/android/build/intermediates/manifests/aapt/release/AndroidManifest.xml'.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':react-native-sensitive-info:verifyReleaseResources'.
> java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
```

## 解決策
1. AndroidStudio を閉じる
2. 以下のディレクトリやファイルを全部削除する
 * /android/build
 * /android/.gradle
 * /android/.idle
 * /android/[アプリ名].iml
 * /android/app/build
 * /android/app/app.iml
3. AndroidStudio でプロジェクトを開く
4. もろもろの処理が終わるのを待つ
5. 再度ビルド

## 原因
なんでなのかはわからないけど、対象の sdk 変えたからキャッシュが悪さしたんだと思う。
Swift を用いて MacOS のキーボード無効化する方法

## 最初に
この記事は MacOS を Swift を用いてキーボードを無効化する方法について記載します。
記載時の環境は以下の通りです。

|対象|バージョン|
|---|---|
|Swift|4.2.1|
|MacOS|10.13.6|

## Demo
Mac の画面右上にカーソルを持っていくとキーボードの (有効|無効) が切り替わります。
**有効**であれば入力することができ、**無効**であれば入力することが出来ません。

![Dec-22-2018 17-54-56.gif](https://qiita-image-store.s3.amazonaws.com/0/30359/1d0ebdce-3fc9-2f27-9958-aa7dc31aee50.gif)

## ソースコード解説
### アクセシビリティの設定
キーボードやマウスのイベント等、コンピュータの制御に関する処理をトラッキングする場合、
**アクセシビリティの設定**が必要となります。
以下のコードで判定し、もしアクセシビリティの設定を行っていない場合は許可ダイアログを出すようにします。

```swift
let options = NSDictionary(
    object: kCFBooleanTrue,
    forKey: kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString
) as CFDictionary

AXIsProcessTrustedWithOptions(options)
```

**アクセシビリティの許可を促すダイアログ**
<img width="573" alt="スクリーンショット 2018-12-22 15.24.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/30359/dc99628f-e06f-716d-758b-e37bdcb85e05.png">


### キーボードを無効化する処理
次にキーボードを無効化する処理について説明します。

```swift
CGEvent.tapCreate(
    tap: .cgSessionEventTap,
    place: .headInsertEventTap,
    options: .defaultTap,
    eventsOfInterest: CGEventMask((1 << CGEventType.keyDown.rawValue) | (1 << CGEventType.flagsChanged.rawValue)),
    callback: { (proxy: CGEventTapProxy, type: CGEventType, event: CGEvent, refcon: UnsafeMutableRawPointer?) -> Unmanaged<CGEvent>? in
        if [.keyDown, .flagsChanged].contains(type) {
            let keyCode: Int64 = 99999 // this keycode does not exist.
            event.setIntegerValueField(.keyboardEventKeycode, value: keyCode)
        }
        return Unmanaged.passRetained(event)
    },
    userInfo: UnsafeMutableRawPointer(Unmanaged.passRetained(self).toOpaque())
)
```
`eventesOfInterst` にトラッキングする `EventMask` を指定することにより、コールバックでイベントを取得することが出来ます。 

上記のコードでは `keyDown` と `flagsChanged` の `EventMask` を指定し、
コールバックで存在しないキーコードに上書きすることにより、キーボードを無効化しています。
`flagsChanges` は、`⌘キー`や `Shiftキー`を指しています。

その他、キーボードを有効化に戻したり、マウスのトラッキング処理も含めたソースコードを Gist に載せてますので、
ご興味ある方はぜひ見てください。
https://gist.github.com/bpyamasinn/b2b255403d09c55f9e799456565bc616

## 開発経緯
自宅勤務中で集中してる時に、キーボードの上に乗ってくる猫を退かせるのに抵抗感がありました。

申し訳ないな...と思いつつキーボードから退かせた後、
寂しげな後ろ姿を見ると心が痛んだので、キーボードを切り替える技術を検証しました。

## 最後に
これで猫が乗ってきても、何も問題ありません。
猫が甘えてくる時は撫でてあげましょう :relaxed:
きっと、満足した頃には自分からキーボードから退いてくれます。

もちろん、キーボードは入力出来ない状態のため、メールや Slack 等の連絡を確認したり、
仕様書の確認等に時間をあてましょう。

---
**以下、おまけ**

### 我が家の猫がキーボードの上で温まってる時の写真
<img width="602" alt="スクリーンショット 2018-12-22 14.58.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/30359/af7611d2-2aab-58c0-fe1d-bf5bdfda5c2d.png">

この子を退かせることなんて出来ない... :thinking: 

### ボタン式でキーボード切り替え
画面右上にボタンを用意し、そのボタンをクリックするとキーボードの状態を切り替える方法を最初に試しました。
しかし、ボタンを押す頃には猫が乗ってきてしまっていたので、もう少し早くロックできる方法を探りました。

### カメラ式でキーボード切り替え
Mac Book 内蔵カメラを用いて、猫を監視しキーボードの状態を切り替える方法を試しました。
猫の判定はある程度出来たものの、ずっとカメラを起動すると Mac の電池消費スピードが**著しく**上がってしまったためボツに...

結果、カーソルを右上に持っていってロックする方法が最適という結果に至りました。
何か他に良い方法あったらご提案頂けると嬉しいです :pray:
bitbucketから、pipeline経由でAWS s3にアップロードする

bitbucketで差分管理しているリソースを、AWS s3にpipeline経由でアップロードする。
（静的htmlのみ使用するアクセスが少ないwebサイトをs3のhosting機能で運営することにした。）

リポジトリの設定からEnable Pipelinesをonにして、bitbucket-pipelines.ymlを設置する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83911/6b6908b3-33be-28c8-f384-b3278c5f7337.png)

今回は、masterへのcommitのみ、s3にアップロードする。

```json:qiita.rb
# This is a sample build configuration for Other.
# Check our guides at https://confluence.atlassian.com/x/5Q4SMw for more examples.
# Only use spaces to indent your .yml configuration.
# -----
# You can specify a custom docker image from Docker Hub as your build environment.
image: atlassian/default-image:2

pipelines:
  default:
    - step:
        # set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY as environment variables
        name: Deploy to S3
        deployment: test   # set to test, staging or production
        # trigger: manual  # uncomment to have a manual step
        image: atlassian/pipelines-awscli
        script:
          - aws s3 sync --delete . s3://<bucket_name>
```

AWS側に、s3にアクセスできるユーザを作成する。
今回は、ユーザ、bitbucketを作成して、s3accessにフルでアクセスできるグループに所属させた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83911/277fe147-39d3-4dec-edf9-3948c77e05ac.png)

アクセスキーを、リポジトリの設定→Repository variablesに設定する

AWS_ACCESS_KEY_ID アクセスキーID
AWS_DEFAULT_REGION デフォルトリージョン
AWS_SECRET_ACCESS_KEY 対応するキー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83911/ef012e48-0b4e-6790-62e8-5be978c3ed0d.png)

アップロードに成功

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83911/a8348442-5ea3-4e31-aa39-f16ee7600c00.png)

アクセスキーなどを設定しないと、unable to locate credentials

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83911/2641fe46-782c-b68a-23db-ee7b541d1ff7.png)
Androidでバックグラウンドから位置情報を定期的に取得するには結局どうするか

何かとバックグラウンドでできることの制限が多いAndroid。
バックグラウンドで定期的に位置情報を取得するときはどう実装するのが良いか考えました。

### TL;DR

1. Android 6系より前はBackground Service、Android6系以降はJobScheduler
2. AlarmManagerで10分おきに位置情報取得
3. どうしても正確に拾っていきたいときはForegroundServiceを使う

### 1の根拠

`OnStartCommand`で`START_STICKY`か`START_REDELIVER_INTENT`を指定すれば、Android 8より前であれば動くのではと思ったけど、[こちらの記事](https://hashedin.com/blog/save-your-android-service-from-doze-mode/)によると

> By default, if you want to run a service in the background forever, then you can return START_STICKY in the onStartCommand of service. The service will get recreated by the Android OS if this was destroyed for many reasons. But this will not work in devices which are running in Android version 6 and above due to Standby and Doze mode restrictions

とあり、ServiceもDozeモードにやられてしまうようなので、Android 6系以降はJobSchedulerで統一。
（ただこれは記事による伝聞ベースなので、検証端末さえあれば6系7系での挙動を確認したい）

とはいえ、JobSchedulerのほうもDozeモードにはやられてしまうのでこの判断に差異は特にないのですが、Android8以降BackgroundServiceが実行できなくなるので、JobSchedulerのほうを優先した、という感じです。

### 2の根拠

JobSchedulerに統一はしたものの、深いDozeに入ってしまえば、[こちらの記事](https://qiita.com/FumihikoSHIROYAMA/items/b1d6dbda120462d0e209)によれば何時間も位置情報が取得できなくなってしまう。
ということで、AlarmManagerで定期的に位置情報を取得します。
10分おきというところの根拠は、Android 8以降ではAlarmManagerが最大で9分に1回までしか発火できない、という情報を基にしています。

まあこれをしても、Android 8以降では、位置情報を取得できるのは1時間に数回のみのようなので、「10分ごとであれば正確な位置情報がとれます！」とも特には言えませんね。

### 3の根拠

とはいえ、サービスを運用していく上で、どうしてもここは正確に位置を取りたい！という要望があったときは、ForegroundServiceでやるしかないでしょう。
ただ、これもうまくやらないと、こちらから明示的にstopさせずともForegroundServiceが止まってしまうこともあるので、実装時は要注意。

### まとめ

いろいろ調べてみてなんですが、ForegroundServiceを使わないという選択をする限り、正確な位置をベースとしたサービス設計にはしないほうが良いです。
StateMonadをJavaScriptで実装してわかった気になる

この記事は [ACCESS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/access)、22日目の記事です。
どうも、仕事ではECMAScript3をよく書いている @soebosi です。

突然ですが、みなさんはモナド好きですか？

私は、
「モナドを理解するぞ！」
「やっぱりわからん」
「理解するぞ！」
「わからん」
「りｋ」...
と繰り返してきて、今に至るモナド弱者です。

ListモナドとかMaybeモナドとかは、なんとなく理解できるのですが、本質に近づけていないなぁと感じていました。
モナドを理解する運動の一貫として、StateMonadをJavaScriptで実装してみたので、それをまとめてみたいと思います。
厳密さには拘らず、**わかった気になる**を目指すので、ご容赦ください。。

## StateMonadの定義

定義は、haskellのwikibooksを参考にしました。
https://en.wikibooks.org/wiki/Haskell/Understanding_monads/State

これを元に作ったStateMonadクラスがこちら。
（haskellにおけるreturnについては、なくてもある程度理解できそうなので、対応付けていません）

```js
class StateMonad {
  constructor(runState) {
    this.runState = runState;
  }
  flatMap(f) {
    return new StateMonad((s0) => {
      const [a, s1] = this.runState(s0);
      const sm = f(a);
      return sm.runState(s1)
    });
  }
}
```

ただただ、定義通りに実装しました。

## Userクラスっぽいもの

JavaScriptにはclass構文がありますが、それを使わずにStateMonadを使ってクラスっぽいものを作ってみます。
今回は、Userクラスっぽいものを用意しました。

```js
// 毎回 new StateMonadを書くのが面倒だったので、Sという関数を用意しています。
const S = (runState) => new StateMonad(runState);

// Userクラスっぽいもの。getterとsetterを用意してみました。
const User = {
  new_:    (name, age) => ({name, age}),
  getName: S(this_ => [this_.name, this_]),
  setName: (name) => S(this_ => [null, {...this_, name}]),
};

// flatMapでつなげることで、直前のメソッドっぽいものから情報を引数として受け取れます。
const sm = User.getName.flatMap(name =>
           User.setName(name + "2"));

// StateMonadをflatMapするだけでは、関数を連結しているだけで、実行されません。
// runStateを呼び出すことで、結果を受け取ることができます。
console.log(sm.runState(User.new_("Taro", 10))); // => [ null, { name: 'Taro2', age: 10 } ]
```

## do記法

こうなってくるとflatMap地獄をなんとかしたくなってきます。
さきほどの例は、getNameとsetNameしか使っていないので、そこまでじゃないですが、呼び出しが増えるほどflatMap地獄がひどくなっていきます。
haskellであればdo記法がありますが、JavaScriptではどうすればよいでしょうか？
パッと思いついたのが、yieldを使った方法で、それを使ってdo記法っぽいものを書いてみました。

```js
class StateMonad {
  constructor(runState) {
    this.runState = runState;
  }
  flatMap(f) {
    return new StateMonad((s0) => {
      const [a, s1] = this.runState(s0);
      const sm = f(a);
      return sm.runState(s1)
    });
  }
}

const S = (runState) => new StateMonad(runState);

const User = {
  new_:    (name, age) => ({name, age}),
  getName: S(this_ => [this_.name, this_]),
  setName: (name) => S(this_ => [null, {...this_, name}]),
};

const doStateMonad = (m, a) => {
  const n = m.next(a);
  return n.done ? S(s => [a, s]) : n.value.flatMap(a => doStateMonad(m, a));
};

function* main() {
  const name = yield User.getName;
  yield User.setName(name + "2");
};

const sm = doStateMonad(main(), null);

console.log(sm.runState(User.new_("Taro", 10)));
```

これなら、いっぱい関数を呼び出したくなっても大丈夫そうですね！

## まとめ

StateMonadは結局のところ、Stateを隠蔽してくれるところが嬉しいのかなと思いました。
これってオブジェクト指向で言うところのthisの構造を気にせずにプログラミングできるところに通ずる気がします。
（メソッドの中ではthisを気にするけど、メソッドを使う側はthisを考えなくてもよい）

ちょっとずつですが、モナドの理解が深まっている気がするので、この調子で身につけていきたいものです。（今度はモナド変換子あたりに挑戦したい）

明日は、 @naohikowatanabe です！お楽しみに！
書評や記事投稿するときに気になる引用について

# 概要
Web上で記事を書く場合、引用する場合の著作権について気をつけることをについて、調べたことをまとめました。
# 内容

## 「引用」とは
* 自分が言いたいこと(自説)を補強するために自分の文章に中に他人の文章を記載すること

# 引用の条件を簡単にまとめると
* 引用の正当性
 * 引用に必然性があり、自説の文章が主で引用が従という主従関係にあること
* 引用箇所及び引用元がどこか明示されいること
 * 引用した箇所の感想を記載する
* 条件を満たした「引用」は、権利者に無許可で行うことができる（著作権法32条）
 * 著作権侵害にならない

# 文化庁の著作権Q＆Aより
1.主従関係：引用する側とされる側の双方は、質的量的に主従の関係であること
　→ 自分の記載内容が全くなく引用記事だけ掲載はNG　
2.明瞭区分性：両者が明確に区分されていること
　→ 引用箇所を「カッコ」でくくったり「<b>フォントを変えたり</b>」などわかるようにする
3.必然性：なぜ、それを引用しなければならないのか？が明確にわかる

# 所感
* 引用する場合については、自分の意思主張がしっかりあり、その内容を補足するために使用するのであれば、それ程神経質になる必要ない。

### 参考
* [書評ブログを書くと著作権が気になるので注意点をまとめてみた](https://kaihoudebut.jp/blog/writing/3795/)
* [引用が認められる条件について](https://pf.bunka.go.jp/chosaku/chosakuken/naruhodo/answer.asp?Q_ID=0000304)
* [「WELQ」はアウトか？　セーフか？　DeNAの責任は？　著作権法の観点から弁護士が分析してみた (2/5)](http://www.itmedia.co.jp/news/articles/1612/20/news075_2.html)
論文情報をSlack上で確認できるようにする


## はじめに
[前回の記事](https://qiita.com/kurage0807/items/7d1a618f8a758cfa8052)では、IFTTTを使ってbioarxivの気になる分野の論文をつぶやくTwitterbotを作りました。
今回は、~~前回同様IFTTTの仕組みを使ってSlackに通知させるbotを作りました。~~と思ったらIFTTT登録せずに一瞬でSlack に RSS フィードを追加することができた話を書いています。
何はともあれ、これで、個人や研究室、仕事場などのコミュニティのSlackで論文情報が共有・確認できるようになります。



## 方法
### 1. RSSのurlを調べる(前回と同じ)
「bioarxiv RSS」などでググると分野ごとの[分野ごとのrssに飛べるページ](https://www.biorxiv.org/rss)が出てきます。
今回は[bioinfomatics](http://hwmaint.biorxiv.highwire.org/cgi/collection/rss?coll_alias=bioinformatics)を選んでみました。
このURLをコピーしておきます。

### 2. 1.で出てきたurlをslackに登録する
[Slack公式ページ](https://get.slack.help/hc/ja/articles/218688467-Slack-%E3%81%AB-RSS-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)を参考にしながら登録します。

#### RSS アプリをインストール
まず、Slack ワークスペースに RSS アプリを追加する

- Slack の App Directory (App ディレクトリ) の  RSS ページ  にアクセスします。
- Install  をクリックします。
- 次のページの「RSS インテグレーションを追加する」をクリックします。

#### App ディレクトリからフィードを追加する
RSS アプリを追加したら、フィードを追加していきます。
「フィード URL」の横に、上記1でコピーしたURLをペーストします。
フィードの更新情報を表示したいチャンネルを選択します。
「このフィードを購読する」をクリックして終了します。

 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/258705/1f68dd6d-68c7-4a67-0516-064ffe658a83.png)

これで次回論文情報が更新されると、更新情報が Slack に表示されるようになります🎉



### 3. ちゃんと表示されているか確認する

実際にSlackに論文情報が流れているか確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258705/79da408a-048b-7f3c-5bf8-aa8027ffb416.png)


完成です。


## おわりに
今回は、Iftttの登録をせずにSlack に RSS フィードを追加し、論文情報をSlack上で確認できるようにしました。
個人や研究室、仕事場などのコミュニティ内の情報共有などに役立てば幸いです。



## 参考
 - [Slack に RSS フィードを追加する](https://get.slack.help/hc/ja/articles/218688467-Slack-%E3%81%AB-RSS-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B) : Slackの公式ヘルプページです。
SceneKitのSCNTechniqueを使って物体の輪郭を光らせる

SceneKitでできるシェーダー表現の１つ、SCNTechniqueを使って物体の周りを光らせる方法を紹介します。

ただし、僕も完全に理解していないので、**実装の流れ**を説明することにフォーカスし、細かい説明はまたの機会にします。

# 完成イメージ

<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/shader.gif">

https://github.com/kboy-silvergym/ARKit-Emperor

# 作り方概要
- metalファイル作成
- plistファイルでDictionaryを作成
- SCNTechniqueを作ってSceneViewに渡す
- 適応するNodeのcategoryBitMaskを設定

このような流れです。

# metalファイル作成

shaderを実行するmetalファイルを作ります。僕はこれを完全に理解していません。これから頑張って理解します。

https://github.com/laanlabs/SCNTechniqueGlow のコードを参考に、真似して作ってみました。僕のサンプルコードは[ここ](https://github.com/kboy-silvergym/ARKit-Emperor/blob/master/ARKit-Emperor/View/Shader/NodeRender.metal)にあります。

<img width="1280" alt="2018-12-22 18 32 34" src="https://user-images.githubusercontent.com/17683316/50372774-0c7cd480-0618-11e9-836c-5225a4710452.png">

# plistファイルでDictionaryを作成

最終的にSCNTecniqueにはDictionary型を渡すので、plistを作ってDictionaryを定義します。keyとvalueはApple公式の  https://developer.apple.com/documentation/scenekit/scntechnique に書いてますが、覚えるのはきついですねw

僕もこれから[サンプル](https://github.com/kboy-silvergym/ARKit-Emperor/blob/master/ARKit-Emperor/View/Shader/NodeTechnique.plist)をいじって試しながら覚えていきたいと思います。

<img width="1280" alt="2018-12-22 18 32 48" src="https://user-images.githubusercontent.com/17683316/50372775-0d156b00-0618-11e9-9a3c-b39ecb417c28.png">

# SCNTechniqueを作ってSceneViewに渡す
NodeTechnique.plistからdictionaryを取り出し、SCNTechniqueをinitします。つまり、必ずしもplistである必要はなく、元ファイルはJSONなどでも良いです。もちろんコードで作ることもできます。(長いけど）

```swift
if let path = Bundle.main.path(forResource: "NodeTechnique", ofType: "plist"),
    let dict = NSDictionary(contentsOfFile: path) as? [String : Any] {
    
    let technique = SCNTechnique(dictionary: dict)
    sceneView.technique = technique
}
```

# 適応するNodeのcategoryBitMaskを設定

先のplistで、includeCategoryMaskを2としているので、categoryBitMaskが2のnodeにだけ、該当のshaderが適用されます。

[categoryBitMask](https://developer.apple.com/documentation/scenekit/scnnode/1407994-categorybitmask)のデフォルトは1です。

```swift
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.01)
box.firstMaterial?.diffuse.contents = UIColor.darkGray
let node = SCNNode(geometry: box)
node.categoryBitMask = 2
```

# 完成品

光る赤い枠線がBoxNodeに適用されました。ダークサイド感ありますね。

<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/shader.gif">

# 参考

- https://github.com/laanlabs/SCNTechniqueGlow
- http://appleengine.hatenablog.com/entry/2017/09/04/154924
- https://developer.apple.com/documentation/scenekit/scntechnique
ぼくがNES.cssから学んだこと(前編)

こんにちは。ジーズアドベントカレンダー2回目のやぎです。
前回は「[Webにおけるサウンドインタラクションを考えてみた](https://qiita.com/qei/items/52bd3ad7ca2d43ea39dd)」とJS関連だったので、
今回はCSSについて書いてみようと思います。

## 8bitの歴史は繰り返す

突然ですが、最近のWeb含めデジタルコンテンツで8bitライクの見た目のものがしばしばみられるようになっています。ここでいう「8bitライク」というのは、ファミコンやスーパーファミコンの頃のようなドット絵で見た目を表現するものを指します。
なお、8bitというのも当時のゲーム機に搭載された8bit CPUが所以のようですが、今回は「ドット絵」と総称して進めていきます。
  
例えば、最近では以下のようなところで使われています。

### ドット絵を使った事例

１. **[OCTOPATH TRAVELER](https://www.jp.square-enix.com/octopathtraveler/)**
TVCMでもやっているスクエニのゲームソフト。スーパーファミコンのテイストに近い細かめのドット絵でありつつ、それに3DCGの画面効果も加えているようです。

２. **[FINAL FANTASY Record Keeper](https://ffrk.jp/)**
同じくスクエニが提供するスマホアプリ。ファミコンより続くファイナル・ファンタジーシリーズのクロスオーバー的な世界観ということで、これまでのドット絵キャラが使われていのが感慨深いですね。
ちなみに、同時代に人気を博したロマンシング サガの完全新作「[ロマンシング サガ　リ・ユニバース](https://www.jp.square-enix.com/saga_reuniverse/)」も配信されていますが、こちらもキャラクターがドット絵調になっていますね。

３. **[CODE QUEST](https://geek-out.jp/cp/code-quest/)**
パソナキャリアのエンジニア向け求人フィード型転職サイト 「[GeekOut](https://geek-out.jp/)」の特設サイトです。こちらはファミコンのような比較的粗めなドット絵作りで、エンジニア関連のワードをクイズ形式で答えて進めるコンテンツになっています。

４. **[HERMÈS JINGLE GAMES!](https://noel.maisonhermes.jp/)** ※スマホで見てください
[エルメス](http://www.maisonhermes.jp/)の2018年クリスマス施策で、[Bascule](https://www.bascule.co.jp/)さんが制作されたようです。親しい人にメッセージを送れるコンテンツで、トナカイを操作してボックスからメッセージを取り出すシューティングゲームの要素も盛り込まれています。
また、12月25日まで銀座SONY PARKでリアルイベントもされていて、隣の銀座メゾンエルメスにプロジェクターでゲームスクリーンを投影する仕掛けになっています。

また、デジタル以外では同じく格子状の構成として近い刺繍や[クロスステッチ](https://www.handful.jp/curation/4367)にも活用できるようです。

### なぜドット絵を使うのか？
当時マシンスペックの制約等からドットベースによる描画、ユーザの想像力を掻き立てるような設計にせざるを得なかったのが、現在では高精細・3Dグラフィックといった視覚的にリッチな表現ができるまでになっています。

一方で、そうした高精細なグラフィックに慣れてしまったのかレトロゲームの再燃に合わせてなのか、こうした8bitな見た目を用いるケースが出てきているように感じます。
一巡回るだなんて、、、まるでプッチ神父のスタンド「メイド・イン・ヘブン」でも食らったかのようです(←食らってない)。

それだけ秀逸な表現技法だったという以外にも、
以下のような利点があると考えます。

#### ゲーム系コンテンツにおける直感性
当初ファミコン等のコンシューマゲームに用いられた経緯から、パッと見で「このコンテンツはゲーム系だな」と分かる直感性を持っている印象を受けます。

#### 制作コスト
あくまで作るものやそのクオリティにもよりますが、緻密なグラフィックに比べドット絵がパーツ単位でデザイン管理できる点、エフェクト等の演出要素を除ける点よりある程度コストを抑えられるのではと考察しています。対して、ドット絵職人と呼ばれる方のように、高度な描画スキルと時間が要求されるケースもあります。
  
## NES.css

![logo.png](https://qiita-image-store.s3.amazonaws.com/0/219810/c785561a-3dd2-dd8f-8f3e-d3eaf3a14ca2.png)


そんな折、Twitter経由でファミコン風スタイルを提供する「[NES.css](https://github.com/nostalgic-css/NES.css)」というCSSフレームワークのことを知りました。
NESというのは、[Nintendo Entertainment System](https://ja.wikipedia.org/wiki/Nintendo_Entertainment_System)の略称のようで、確かにマリ○やポケ○ン、カー○ィと、往年のキャラクターのドット絵が[Github Page](https://nostalgic-css.github.io/NES.css/)にも載っています。
  
![nes.png](https://qiita-image-store.s3.amazonaws.com/0/219810/71ea8c3a-a07e-bfbb-0344-d653b724e74a.png)  
  
これはこれでキャラクター毎のドット絵も凝っていてそのままゲームに使えそうですが、一つ気になったことがあります。

**これどうやって描画してるんだろ？**

おかしいな～、おかしいな～。DOMをべらぼうに組み合わせてスタイルしたら作れそうですが、それだと相当数必要になるし、そもそもCSSフレームワークでもないし。。

...と思って、Developer Toolで該当エリアを見てみたら、、

<img width="1121" alt="code.png" src="https://qiita-image-store.s3.amazonaws.com/0/219810/08191d15-4de4-bf95-49c6-8ed7e718ddaa.png">

なんと、、マ○オは`color`と`box-shadow`で作られていたのでした。
背筋がゾクーッとした。。

<< 後編に続く >>  
  
## まとめ

というわけで後編(というかおまけ)に続きます。
アップしたらこちらにのせますゆえ　↓  
【後編】
https://qiita.com/qei/items/895954f09efc945ed9d2 

【番外編】
https://qiita.com/qei/items/105319ced192af566f74
Visual Studio CodeでRailsのリモートデバッグ

## はじめに


この記事は[Linkbal Advent Calendar 2018](https://qiita.com/advent-calendar/2018/linkbal)の21日目の記事です。Rails初心者のタンです。
僕はリンクバルという現在の会社に入る前に、PHPエンジニアでした。
Railsの開発環境を立ち上げたあとに、開発の準備のため最初にやったことはデバッグツールを設定することです。
Railsのデバッガーといえば`Pry`は盛んなものかと思いますが、PHPエンジニアだった僕はまだ慣れていないので、PHPの`Xdebug`みたいなツールがほしかったです。
インターネットで調べた上で、`ruby-debug-ide`というツールを見つかって、設定してみたら、Xdebugみたいなリモートデバッグ機能が使えました。
今回はこのツールの設定方法について紹介させていただきます。

## Rubyプラグインをインストールする
まず、VSCodeでRuby言語を開発するための拡張をインストールする
![ruby extension.png](https://qiita-image-store.s3.amazonaws.com/0/117115/ad1174bd-3d82-761b-9ef5-dba41860e870.png)

この拡張の詳細に`ruby-debug-ide`デバッグのツールの設定方法を書いてあります。
![debugger_ruby_ext.png](https://qiita-image-store.s3.amazonaws.com/0/117115/18dc68ac-00aa-aab1-375e-62bc51cc908a.png)

## デバッグGemをインストールする
RubyバージョンによってGemが違います

Ruby 1.8.xの場合

```
gem install ruby-debug-ide
gem install ruby-debug-base
```
Ruby 1.9.xの場合

```
gem install ruby-debug-ide
gem install ruby-debug-base19x
```
Ruby 2.xの場合

```
gem install ruby-debug-ide
gem install debase
```

## VSCodeの設定
VSCodeのデバッグタブを開いて、左側のサイドバーに「Add Configuration」を選択して、もし何もデバッグ設定がなければ選択ポップアップを表示されます。ここにRubyを選択してください。「Ruby」選択肢がなければ、どんな選択肢を選択しても大丈夫です。


`launch.json`を開いたら、configurationsの中に以下の設定を入れてください。

```json
    {
      "name": "Debug Rails",
      "type": "Ruby",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "program": "${workspaceFolder}/bin/rails",
      "pathToRDebugIDE": "/home/trantan/.rbenv/versions/2.5.1/bin/rdebug-ide",
      "args": [

         "server"
      ]
    }
```

- name: デバッガー名
- type: プログラム言語（Ruby）
- request: `launch`というのはVSCodeから実行する
- cwd: 作業のディレクトリ
- program: デバッグを開始する時に実行されるRubyスクリプト（Railsサーバーのデバッグなので、ここにはRailsコマンドです）
- pathToRDebugIDE: オプションの設定です。（`ruby-debug-ide` gemのフルパスです）
- args: 「program」実行するスクリプトの引数です。Railsサーバーをローンチするコマンドは`rails server`なので、`server`は引数です。もしホストや環境などというコマンドのオプションを追加する場合、ここに追加してください。


↑こちらは基本の設定です。
詳しい設定は[こちら](https://github.com/rubyide/vscode-ruby/wiki/2.-Launching-from-VS-Code)に参考してください。


## デバッグしてみる
- まず、デバッグのbreakpointを設定する
![ahii.png](https://qiita-image-store.s3.amazonaws.com/0/117115/2d601f3d-f9f2-5707-bf9b-07c1d94fa025.png)
ファイルの改行数の左側にクリックすると、breakpointを設定できます。


- 次、VSCodeのデバッグタブで左側のサイドバーに上の「Debug Rails」を選択して、「スタート」ボタンを押すと、デバッガーを開始します。
![start debug.png](https://qiita-image-store.s3.amazonaws.com/0/117115/882458a2-e06c-bdfe-372a-ce5d072be8aa.png)


ブラウザーでRailsのWebアプリを開いたら、デバッグできます。
![demo rails.gif](https://qiita-image-store.s3.amazonaws.com/0/117115/1dfe3479-58a5-5af4-cdfa-24ad7d58139b.gif)

デバッガーのリモートパネルです。
![remote.png](https://qiita-image-store.s3.amazonaws.com/0/117115/3d9f1cbd-4fc8-3ee2-1b85-6c82cb49faa9.png)


左側の「Variables」部分に変数の値をチェックできます。
![variables.png](https://qiita-image-store.s3.amazonaws.com/0/117115/66a08b87-5e11-1ba2-4aed-efb144c4c1bb.png)


## おわりに
いかがでしょうか？
こんな簡単設定でVSCodeでRailsのデバッグは便利になりますね。
それではまた！
【TeamSQL】個人的に最強だと思うSQLクライアントの紹介

今回は、Qiita Advent Calendarのスポンサー枠にあります、「[Qiitaユーザー大決戦、ベストレビュアーは誰だ!? Advent Calendar 2018](https://qiita.com/advent-calendar/2018/itreview)」の記事として投稿いたします。

なんと、素晴らしい記事を書いた人には、最優秀賞として「MacBook Air」を、優秀賞として「iPad Pro」がもらえるということで、クリスマスのこの日にはとても持ってこいな話ですね！

## 紹介するきっかけ
自分は最近まで、SequelProを利用していましたが、[とあるQiitaの記事](https://qiita.com/shunichi_com/items/b07ae8c678aa7c0e2ff6)を見て触ってみたところとても使いやすく便利だったので紹介します。

## レビュー（必須項目）

### レビュータイトル
【TeamSQL】個人的に最強だと思うSQLクライアントの紹介

### ツール名
[TeamSQL](https://teamsql.io)

### サービスの良いポイントは何でしょうか？

- **クエリの保存と履歴の検索**
自身が書いたクエリを保存し、一覧でみることができます。
また、過去打った履歴も一覧でみることができ、あのクエリってどうやって書いたっけ・・？ということがなくなります。

- **グループで情報を共有できる**
グループ設定ができるので、情報を共有することができます。
そのため、プロジェクトごとにチームを分けることで、一人ひとりが情報を保持するのではなくチームで管理することができます。

- **クエリの可視化**
自身が作成したクエリを複数種類あるグラフで可視化することができます。
データだけで比較するよりも可視化できたほうが見やすく直感的にわかりやすいです。

- **様々なミドルウェアに接続できる**
これが一番の魅力だと思います。
個人的にMySQLやAmazon Aurora、PostgrSQLの複数ミドルウェア色々なサービスで利用しています。
そのため、それぞれのミドルウェア毎にクライアントツールを変えていましたが、その都度設定を追加したり、UIが変化したりととても不便でした。
TeamSQLを利用すれば、ほぼすべてのミドルウェアを読み込むことができるので、このクライアントツール一つで全部対応できます。
要するに、TeamSQLの設定やUI/UXを覚えておけば開発の効率化につながるということです。

### 改善してほしいポイントは何でしょうか？

- **ほかのクライアントツールより気持ち遅いかも**
これは実際に図ったわけではありませんが、昔使っているツールよりも実行速度が若干遅い気がします。
とはいえ、それ以上に便利な機能がありますので、満足はしてます。

- **(Javaを利用している)**
これはしょうがないことだと思いますが、Javaのインストールをしないといけないので、Javaのアップデート通知が少し・・・

### どのようなビジネス課題を解決できましたか？あるいは、どのようなメリットが得られましたか？

- **複数プロジェクトにまたがっている人**
複数プロジェクトにまたがっていると、どうしても複数のDBミドルウェアがあり、その都度ツールを変えないといけなかったです。
そのため、UI/UXの変化により間違えた操作をしてしまったりしたこともあります。
一つのツールで収まれば、そういった誤操作も減らすことができます。
また、チームで利用することもできるので、情報共有といった点でも大活躍です。

## レビュー（参考項目）

### おすすめ度

- 10（10段階評価）

### あなたはこの製品・サービスをどのような立場で関与していますか？

- ユーザー（利用者）

### 満足度を5段階で評価ください

- 機能への満足度: ★★★★☆
- 使いやすさ: ★★★★☆
- 導入のしやすさ: ★★★★★
- 管理のしやすさ: ★★★★★
- サポート品質: ★★★★☆
- 価格（費用対効果）: ★★★★★

### 利用期間をお選びください

- 半年以上

### 他製品・サービスからの乗り換えですか？

- 乗り換え

### この製品・サービスは適正にバージョンアップを行っていますか？

- はい

### 検討者にお薦めするポイントがあれば記入ください

様々なDBミドルウェアを利用しているのであれば、おすすめします。
また、チームで情報を共有できるので、チームメンバーが多いプロジェクトだと情報共有がしやすいと思います。

## レビュー（実装に関する質問）

### 導入形態は何ですか
- クラウド

### 製品・サービスの購入から稼働開始まで、どのくらいの期間を要しましたか？
- 1日

### 利用を開始した時期はいつですか？
- 2018年

### 誰が主体となり実装しましたか？
- 自身

### その他SIerを選択した場合は実際に導入をサポートした企業をお答えください
- 自身

## レビュー（価格と利用実態に関する質問）

### 導入にかかった初期費用をお選びください
- 0万円

### 年間費用をお選びください（ソフトウェア保守やサポートサービスを含む）
- 0万円

### 想定する投資回収期間をお選びください
- 0ヶ月未満

### 社内の何人が利用していますか？
- 10人~20人

### ユーザーの何％が積極的に利用していますか？
- 50％

## まとめ

様々なDBミドルウェアを利用しているのであれば、ぜひ利用したいツールだと思います。
また、クライアントツールの中でも品質はとても高く、使いやすいと思います。
費用はかからないので、一度試しに使ってみることをおすすめします。
（使いやすくて驚きますよ？ｗ）

最後に、こういったツール選定はとても大事だと思います。
ITreviewさんのようなサービスが成長し、いいものをしっかりとした目的でつかえるようになれればと思います。
その中の一レビューに貢献できれば幸いです。
（クリスマスプレゼントのMBAやiPadProを貰えれば今後もドシドシ書いていきますｗ）
EditorOnlyのBlueprintノードをランタイムで使うとパッケージした時に死ぬので注意


#突然の死

BPのVM実行部でいきなりヌルポで死ぬことはあまりないと経験上感じるのですが
↓こんな感じでパッケージゲーム実行中にブループリントの関数呼び出しで突然ヌルポで死ぬ場合
はWITH_EDITORのブループリントノードを使ってないか疑ってみると解決するかもです。

自分の場合は SetActorLabel を使っていた所があってこのバグに引っかかりました。
UE4Editorの -game や -server を使ったテストだと発生せずにパッケージ環境のみでクラッシュするのが割と熱いです。
Cookもノーエラーで通過してしまいます。

まぁデバッガ刺せばすぐわかるのですが。

```
LogCore: === Critical error: ===
Unhandled Exception: SIGSEGV: invalid attempt to read memory at address 0x0000000000000090

0x00000000067dbd16 GameServer!UObject::CallFunction(FFrame&, void*, UFunction*) [C:/perforce/MyGame/Engine/Source/Runtime/Core/Public/Stats/Stats2.h:765]
0x00000000067e6929 GameServer!UObject::ProcessContextOpcode(FFrame&, void*, bool) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:2327]
0x00000000067dd9e9 GameServer!UObject::ProcessInternal(UObject*, FFrame&, void*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:1058]
0x00000000067dca48 GameServer!UObject::CallFunction(FFrame&, void*, UFunction*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:937]
0x00000000067dd9e9 GameServer!UObject::ProcessInternal(UObject*, FFrame&, void*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:1058]
0x00000000067dca48 GameServer!UObject::CallFunction(FFrame&, void*, UFunction*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:937]
0x00000000067dd9e9 GameServer!UObject::ProcessInternal(UObject*, FFrame&, void*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:1058]
0x0000000006664cac GameServer!UFunction::Invoke(UObject*, FFrame&, void*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/Class.cpp:4861]
0x00000000067e02d0 GameServer!UObject::ProcessEvent(UFunction*, void*) [C:/perforce/MyGame/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:1478]
```

```Actor.h
#if WITH_EDITOR <----------
	// Editor specific
...
	UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Actor Editing")
	void SetActorLabel( const FString& NewActorLabel, bool bMarkDirty = true );
...
	/** Returns a custom brush icon name to use in place of the automatic class icon where actors are represented via 2d icons in the editor (e.g scene outliner and menus) */
	virtual FName GetCustomIconName() const { return NAME_None; }
#endif		// WITH_EDITOR

```
JenkinsとOpenJDK 8とJava 11についての考察

こちらは [#インフラ勉強会 Advent Calendar 2018 ](https://adventar.org/calendars/3022 "#インフラ勉強会 Advent Calendar 2018 - Adventar") 23日目の記事です。

これはJenkinsとOpenJDK 8とJava 11についての考察記事になります。

現在のJenkinsは Oracle JDK 8 / OpenJDK 8 を主軸として開発されています。しかしその Oracle JDK 8のLTSが2019年1月で期限切れとなります。この記事はOpenJDK 8終了以降、Jenkinsがどの方向に進むのかを占う記事です。


##読み始める前に

この記事はJenkinsの公式の発表ではありませんので多分に間違っている可能性もあります。

## 現在のJavaの状況

今まで無償で利用できていたOpenJDK 8が2019年1月以降LTSから外れます。ざっくり言うと今現在の主流の Java 8で動く製品の開発を今後も続ける場合

* JDKのサポート料金を払い使い続ける
* 無料で利用出来るJDKバイナリを使う（IBM、Amazon、MS等が提供予定）

この2択になってくると思われます。

もしも無償のOpenJDKを使いセキュアな製品のリリースを目指す場合、半年ごとのリリースサイクルに追従する必要があります。

##現在のJenkinsの状況

現在Jenkinsの開発はJava 8対応とJava 11対応が同時に行われています。Java 9、Java 10に関しては動作保証対象から外れています。

###JenkinsのJava対応のロードマップ

[2018年12月18日にJenkinsコミュニティーのJava11対応チームによるJenkinsの今後のロードマップが示されました](https://www.youtube.com/watch?v=k_FKvoJvlow "Jenkins Online Meetup: Java 11 support preview - YouTube")。

要約すると以下の通りになります。

- Java 11への移行テストを数ヶ月ほど前から始めた
- 今後2年から3年は **Java 8とJava 11** 両方を主軸に開発する
- **Java 11に移行する環境が整ったらJava 11に完全移行する**
- **コミュニティーとしてはJava 8と直ちに決別するような急激な変化は望んでいない**

つまり少なくとも **向こう2〜3年は現在と同じようにJenkinsが使える** ものと思われます。

##あとがき

Jenkinsはこれからもずっと安心して使えます！


##参考サイト

* [Javaのサポートについてのまとめ - Qiita](https://qiita.com/nowokay/items/edb5c5df4dbfc4a99ffb "Javaのサポートについてのまとめ - Qiita")
* [Java 11正式版がリリース、本バージョンからOracle JDKのサポートは有償に。OpenJDKで無償の長期サポート提供は現時点で期待薄 － Publickey](https://www.publickey1.jp/blog/18/java_11oracle_jdkopenjdk.html "Java 11正式版がリリース、本バージョンからOracle JDKのサポートは有償に。OpenJDKで無償の長期サポート提供は現時点で期待薄 － Publickey")
* [Java 11 Support Preview is available in Jenkins 2.155+](https://jenkins.io/blog/2018/12/14/java11-preview-availability/ "Java 11 Support Preview is available in Jenkins 2.155+")
* [Jenkins Online Meetup: Java 11 support preview - YouTube](https://www.youtube.com/watch?v=k_FKvoJvlow "Jenkins Online Meetup: Java 11 support preview - YouTube")