OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.componentを使用したグローバルコンポーネントにて、propsを設定する方法

# はじめに
Vue.componentを使用したグローバルコンポーネントにて、propsを設定したいと思って調べた結果の備忘録です

# vueのバージョン
```
$ yarn list vue
yarn list v1.19.1
warning Filtering by arguments is deprecated. Please use the pattern option instead.
├─ vue-ctk-date-time-picker@2.4.0
│  └─ vue@2.6.11
└─ vue@2.6.10
✨  Done in 0.91s.
```

# コード
vue-ctk-date-time-pickerをグローバルコンポーネントで定義した例です

```
import Vue from 'vue'
import DateTimePicker from 'vue-ctk-date-time-picker'
import 'vue-ctk-date-time-picker/dist/vue-ctk-date-time-picker.css'

Vue.component('date-time-picker', {
  extends: DateTimePicker,
  props: {
    label: {
      default: ''
    },
    minuteInterval: {
      default: 30
    },
    format: {
      default: 'YYYY-MM-DD HH:mm:00'
    },
    overlay: {
      default: true
    },
    noButtonNow: {
      default: true
    }
  }
})

```

# 参考
[vue-ctk-date-time-picker](https://github.com/chronotruck/vue-ctk-date-time-picker)
[Passing Props in Global Components in Vue Ask](https://stackoverflow.com/questions/49165775/passing-props-in-global-components-in-vue)
JUnit 5がgradle testするとlombokのアノテーションでエラーになる

# 現象
以下のように、```gradle test```するとJUnit 5がlombokが云々で実行に失敗する。

```gradle
> gradle test
Hoge.java:3: error: package lombok does not exist
import lombok.Data;
             ^
Hoge.java:5: error: cannot find symbol
@Data
 ^
  symbol: class Data
2 errors

FAILURE: Build failed with an exception.
```

# 原因と解決策
https://medium.com/@tsuyoshiushio/gradle-5-0-with-lombok-and-spring-boot-e8ca564fc552 にあるように、```testCompileOnly```と```testAnnotationProcessor```でlombokを入れる。詳細は良く理解してないが、lombokのアノテーション処理がtest時も有効になるよう設定しないといけないのだろう。

```gradle
dependencies {
    compileOnly("org.projectlombok:lombok:${lombokVersion}")
    testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
    annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")
}
```
JUnit 5がjava.lang.NoSuchMethodError: org.junit.platform.launcher.Launcher.executeでエラーになる

# 現象

EclipseでJUit 5を実行しようとしたところ、下記のような例外が発生して実行できなかった。No tests found with test runner 'JUnit 5'. というポップアップが出てテストが実行できなかった。

```java
java.lang.NoSuchMethodError: org.junit.platform.launcher.Launcher.execute(Lorg/junit/platform/launcher/TestPlan;[Lorg/junit/platform/launcher/TestExecutionListener;)V
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

```

dependenciesはこんな感じ。

```gradle
		testCompile 'org.junit.jupiter:junit-jupiter-api:5.3.2'
		testCompile 'org.junit.jupiter:junit-jupiter-params:5.3.2'
		testCompile 'org.junit.jupiter:junit-jupiter-engine:5.3.2'
		testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.3.2'
```

# 原因と解決策
<code>junit-jupiter-xxx</code>と<code>junit-platform-launcher</code>のバージョンが合ってない、らしい。参照  https://stackoverflow.com/questions/57040675/java-lang-noclassdeffounderror-org-junit-platform-commons-preconditionviolation よって、BOMを使うよう変更する。

```gradle
dependencyManagement {
    imports {
        mavenBom "org.junit:junit-bom:5.5.2"
    }
}
dependencies {
...
    testCompile('org.junit.jupiter:junit-jupiter-api')
    testRuntime('org.junit.jupiter:junit-jupiter-engine')
    testCompile('org.junit.jupiter:junit-jupiter-params')
    testCompile('org.junit.platform:junit-platform-launcher')
}
```


ただし、先のURLによると、場合によっては```junit-platform-commons```が無いから出る、とかも書いてある。必ずしもバージョン不整合だけが原因とは限らないかもしれない。
WordPressで特定カテゴリー以外の自動整形(wpautop)を無効にする

特定カテゴリー以外全部ひっくるめてwpautopさせない。
させたい時はカテゴリー「my-autop-cat-slug」付けとくというような方法を取る時のスクリプト。

```php:functions.php
add_filter( 'the_content', 'remove_autop', 1 );
function remove_autop( $content ) {
  if( !in_category( 'my-autop-cat-slug' ) ) {
    remove_filter( 'the_content', 'wpautop' );
  }
  return $content;
}
```
基本情報技術者試験の勉強計画　第9週（12/16週）

## 目標と結果
### 目標
・苦手克服
・基礎理論を感で解いてしまうので理解して解く
・早起きを確実にする
### 結果
・だんだんとできるようになってきた。
・基礎理論を繰り返し説くようにしている。
・早起きができるようになった。
## 振り返り
### keep
・書いて覚えるようにした
### problem
・熱を出してしまったので体調管理を徹底する。
・薄着しない
### try
・年末年始で完璧に近い状態にしたい
WSL2 + AWS Toolkit for Visual Studio Code + SAM local + DynamoDB local

> 100件以上Viewされて恥ずかしくなったので別記事にもう少し詳しく書きました。
[新しい記事はこちら](https://qiita.com/taky/items/b4930cf56bf22e732155)

私は、WSL以外、環境にあるものを殆ど使ったことがなく基本的にjava屋さんです。
個々の要素については、先人が書かれている記事がありますので、ここでは記事が見つからなかったハマりポイントを備忘録として。

## 概要：
### ＜テーマ＞
「WSL2 + vscodeでlambda + dynamodbのローカル開発環境を作る」

### ＜環境＞
Windows 10 Insider Preview 20H1(19035)
WSL2(Ubuntu)
 + Python 3.7.5
 + pip 19.3.1
 + aws-cli 1.16.299
 + aws-sam-cli 0.37.0
docker desktop community 2.1.7.0(41536) edge
DynamoDB local (docker image : amazon/dynamodb-local)
Visual Studio Code 1.41.0
 + AWS Toolkit for Visual Studio Code 1.4.0
 + Remote - WSL 0.41.5

### ＜前提など＞
VSCode以外はWSL2のUbuntu上で完結する開発環境を作る。
クローズドネットワークでの開発を想定して、awsアカウント無しでやる。


## ハマりポイント①：

vscode上で「AWS:Create new SAM Application」したのにlambda関数の上部にCodeLensの「Run Locally」が表示されない。

- vscodeウインドウ左部のAWSアイコンクリックして暫く待ってたらいつのまにか表示されるようになってた。

CodeLendsが有効になるタイミングが良くわかってなかったため、Extentionインストールしたら直ぐに表示されるもんだと思い込んでいて表示されずに暫くジタバタした。


## ハマりポイント②：

AWS Toolkitから「Run Locally」した「SAM local」からdocker-compose upしたdynamodb localにアクセスできない。

- endpoint指定は「localhost」ではダメ。マシン名でもダメなのでPCに割り当てられたIPアドレス（コンテナ外で見える）を指定する。

```python:sample.py
# dockerコンテナなSAM localからだとlocalhostでつながらない。「イーサネット アダプター vEthernet (WSL):」のIPを指定。
dynamodb = boto3.resource('dynamodb', endpoint_url="http://your_ip_addr:8000")
```

SAM localとdynamodb localのコンテナを同じdocker networkに乗せるようにSAM_DOCKER_NETWORKを環境変数に設定して見たりしたが上手くいかず。
色々調べていたら、「dockerコンテナから別のコンテナにはlocalhostではアクセス出来ないよん」的な記事を見つけた。
少し考えてみれば、当該コンテナから見ればlocalhostは自分のコンテナなわけだから当たり前の話。。。
WSL2上で起動したdynamodb localのコンテナにWindows上からlocalhostでアクセス出来ていたから麻痺してた。。。

ただ、これだとネットワーク環境変わるたびにソース弄らないといけないので余り実用的ではないかも。
要改善。
~~SAMのコンテナからdynamodbのコンテナにリクエスト飛ばせるようにすれば良いとは思うのですが、現状ではdockerの勉強が足りません。
そのうち改善したらまた記事書きます。~~

[改善しました。](https://qiita.com/taky/items/b4930cf56bf22e732155)
> 私がdocker networkの仕様を全く勉強してなかったためという恥ずかしい話。

WSL2思ってたよりいいですね。
ディストリビューションのスナップショット作って切り替えられるようになれば、複数の開発環境を楽に作れてもっと良いのですが。。。
調べてませんが、ひょっとしたら出来るのかな？
まぁ、普通にHyper-V使えって話かもしれませんが。
CableComponentを使ってグレーマンを動かす

### はじめに
この記事は[Unreal Engine 4(UE4) #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ue4_deux)の最終日の投稿記事です。

某アニメのあの動きを簡単にですが再現してみようと思い、調べながらですがThirdPersonで実装してみました。
UEのバージョンは4.21.2で実装しました。

- 出来上がった物…分かりづらいですが、グレーマンがワイヤーに引っ張られて動いています。
![SolidProject - Unreal Editor 2019-12-08 18-35-22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/50352d43-3444-976d-3827-b14da0052f29.gif)

実装したプロジェクトは[こちら](https://drive.google.com/open?id=14qTcywGVlxqVGmVujw-gn6X3RKCxAI0s)にアップロードしてあります。
[Space]キー：ワイヤーを発射
[D]キー：ワイヤーを切断
[G]キー：ワイヤーの引っ張り状態を変更する

### 調査
ワイヤーの表現で良さそうなのがないかと調べてみたところケーブルコンポーネントがあったのでこちらを使用しました。

- 公式ドキュメント：[Cable Component](https://docs.unrealengine.com/ja/Engine/Components/Rendering/CableComponent/index.html)

### CableComponentとは
文字通りですが、ケーブル用のコンポーネントとなっており、パラメータ次第で様々なケーブルになってくれます。
画像はケーブルの長さや幅、重力等を変えています。
![WireAction - Unreal Editor 2019-12-15 22-04-07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/ac1f2cd0-d30f-6466-e68f-12cbbfa08cfa.gif)


今回のワイヤーで使用したパラメータの解説をします。

|プロパティ名|パラメータ解説|備考|
|:-------|:--------|:---------|
|Attach Start|ケーブルの始端のアタッチするかのフラグ||
|Attach End|ケーブルの終端をアタッチするかのフラグ|今回はAttach End To関数でグレーマンにアタッチしています。|
|Cable Length|ケーブルの長さ||
|Num Segments|ケーブルのセグメント数|1だと曲がらないワイヤーになり、2だと1回曲がるワイヤーになります。数字が大きいほど滑らかに曲がってくれます。|

他にもパラメータがあり、ゲーム中動的に変更ができるので様々な使い方ができそうです。


### 実装の前準備
ドキュメントにも記載されていますが、CableComponentを使うには[編集]→[Plugins]→[Rendering]→CableComponentを有効にする必要があります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/41158b2a-7bb1-39cc-69aa-6c7013a2db0d.png)

### 実装
ワイヤーが壁に当たったらグレーマンが引っ張られるような制御をしたいので、BP_Wireというアクターを追加しています。

ワイヤーの移動処理にはProjectileMovementを使用しており、壁に当たったかを判定するためのSphereを追加し、ワイヤーとして扱うCableComponentも追加しています。
![コメント 2019-12-08 194032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/61c992ec-2e16-ec9f-7c22-60604d4f9f6f.png)

**BP_Wire**
BeginPlayでSet Attach End Toで終点をキャラクターにアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/0ff44a27-ce67-9beb-c92d-35415b227767.png)

始点に置いているスフィアが壁に当たったら壁ヒットフラグを立てています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/ebc753e2-3540-e780-de67-22f706d4f018.png)

壁に当たるまではワイヤーを伸ばし続けて、壁に当たったらPull関数内でグレーマンを引っ張っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/4836b2fb-1a8c-5bac-819f-a9e0fc35d18f.png)

Pull Update関数の下記の部分でグレーマンを動かしています。
AddForceのみで移動をすると移動が速くなってしまうので、Velocityをある程度の速度でクランプをして制御しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/b51a1ff0-953e-7190-f552-f7581867b22a.png)

### ワイヤーの伸ばす位置
こちらに関してはいい方法が思いつかなかったので、グレーマンの中央から外に向かって壁に当たるまで総当たりしています･･･。
そのため、地形が限定的でないと使えない状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/d4f04dc2-e572-ec9f-cd72-cbddc7171288.png)


### おわりに
カプセルか円柱、DrawDebugLine等でワイヤーを表現しようと思ってましたが、CableComponentがあったので今回使ってみましたが別の使い方としても色々できそうでした。

実際にプレイしてもらうと分かりますが、操作性に難があるのでワイヤーの伸ばす位置と合わせて良い方法が閃けばどこかのタイミングで試してみたいと思います。
Azure Kinect × Looking Glass × VFX Graph

3D Sensor Advent Calendar 2019 の16日目の記事です。

##はじめに
手元に Azure Kinect と Looking Glass があったので、組み合わせて何かカッコいいことがしたい！！
と思いました。

## 出来たこと
分かりにくいけど、こんなかんじ。
LWRP未対応のLookingGlassでLWRP
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Azure Kinect × Looking Glass × VFX Graph <a href="https://t.co/8SMcsxPkqA">pic.twitter.com/8SMcsxPkqA</a></p>&mdash; そいちろ@LookingGlass&amp;AzureKinect (@asidys230) <a href="https://twitter.com/asidys230/status/1206510426818695168?ref_src=twsrc%5Etfw">December 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 手順(ざっくり)

###1．Asure Kinect × VFX Graph
keijiroさんのAkvfxを使わせていただきました。
Azure Kinect で取得したポイントクラウドを VFX Graph で描画する形になります。
[GitHub - keijiro/Akvfx: Azure Kinect plugin for Unity VFX Graph](https://github.com/keijiro/Akvfx)


###2．Looking Glass × VFX Graph
上記のものを Looking Glass に表示しようとしてみると、2Dで出力されてしまいました。
色々調べていると Looking Glass はHDRP、LWRPに対応していないとのこと。
[Unity HDRP and Visual Effects Graph - Support &amp; Troubleshooting - Looking Glass Factory Forum](https://forum.lookingglassfactory.com/t/unity-hdrp-and-visual-effects-graph/1425/10)

さらに調べを進めると、実験的なLWRP対応版SDK(HoloPlaySDK-LWRP)を発見。
プロジェクト丸ごと公開されているので設定を弄らなくてよいので楽。
これで Looking Glass で VFX Graph が動作するようになりました。
[GitHub - Looking-Glass/HoloPlaySDK-LWRP: Experimental LWRP implementation of the HoloPlay SDK](https://github.com/Looking-Glass/HoloPlaySDK-LWRP)

###3．Azure Kinect × Looking Glass × VFX Graph
HoloPlaySDK-LWRP をベースに Akvfx を組み込めば Azure Kinect × Looking Glass × VFX Graph が実現できます。
ここまで辿り着くのにそれなりに時間がかかりました……。

##作ったもの
[第2回 Looking Glass ハッカソン](https://lookingglass.connpass.com/event/150321/) でこの知見を活かしたコンテンツを制作しました。
チームメンバーに恵まれ、有り難いことに優勝させて頂きました…！！
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://twitter.com/segur_vita?ref_src=twsrc%5Etfw">@segur_vita</a><a href="https://twitter.com/asidys230?ref_src=twsrc%5Etfw">@asidys230</a><a href="https://twitter.com/sunafukin_vrc?ref_src=twsrc%5Etfw">@sunafukin_vrc</a><a href="https://twitter.com/tatmos?ref_src=twsrc%5Etfw">@tatmos</a><a href="https://twitter.com/sirohood_exp?ref_src=twsrc%5Etfw">@sirohood_exp</a><a href="https://twitter.com/hashtag/LookingGlass?src=hash&amp;ref_src=twsrc%5Etfw">#LookingGlass</a><a href="https://twitter.com/hashtag/%E3%82%8B%E3%81%8D%E3%81%AF%E3%81%8F?src=hash&amp;ref_src=twsrc%5Etfw">#るきはく</a> <a href="https://t.co/98VWWfvmKs">pic.twitter.com/98VWWfvmKs</a></p>&mdash; シロフード (@sirohood_exp) <a href="https://twitter.com/sirohood_exp/status/1193447219623387136?ref_src=twsrc%5Etfw">November 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##さいごに
Azure Kinect と Looking Glass の相性はとても良いと思うので、ぜひ皆さんも組み合わせて面白いコンテンツを作りましょう！！

明日は eduidl さんの「RealSense D435を使ってElasticFusion」です。
LaravelでSCSSを導入する方法

Node.jsがインストールされている必要があるため確認

```
node -v

v10.16.3
```

```
npm install
```
npm installは、npmリポジトリからライブラリをダウンロードしてくるコマンドです。

```
npm run dev
```

```
npm run watch
```
このコマンドを実行することでscssファイルの記述が増える度にその記述がapp.cssに追記される。

```helloapp.blade.php
<link rel="stylesheet" href="/css/app.css"> 
```

ここで読み込む必要があるのは/sass/app.scss
scssの記述をapp.cssでコンパイルしているため。

自分用のメモとして残しました。
他の方の参考になるよう後日編集します。
Go 配列の重複を取り除く

# コード

配列のまま要素ごとに重複を探索すると計算量が増えるので一旦mapにする。
mapは重複したキーの存在ができないので、再度配列に変換すると重複が取り除かれた状態で取得できる。

```Go
func distinct(arr []int) []int {
	m := make(map[int]struct{})
	for _, v := range arr {
		m[v] = struct{}{}
	}
	var newArr []int
	for k, _ := range m {
		newArr = append(newArr, k)
	}
	return newArr
}
```

# 使い方

```go
func main() {
	fmt.Println(distinct([]int{1, 2, 3, 1})) // => [1 2 3]
}
```
fishで任意のPATHを設定・削除する方法

# 設定する時

## 他のshellの場合
`bash`,`zsh`,`tcsh`のような~~旧来~~のshellの場合， インタラクティブshellが開始する際に必ず実行されるshell scriptである`.*shrc`に追記することでPATHが追加できる．

```zsh:~/.zshrc
export PATH="$PATH:/Users/yas-nyan/.nodebrew/current/bin"
```

## fishの場合
[fish](https://fishshell.com/)では以下の様に各セッション共通のPATHをCLIから設定する．
参考：[fish shellのPATH設定](https://qiita.com/ledsun/items/8ca1a450b21c8ebc9670)


```fish:~/
set -U fish_user_paths  /Users/yas-nyan/.nodebrew/current/bin $fish_user_paths
```

結果的に以下のようなファイルにfishが生成した変数が追加される．以下は一例．

```fish:~/.config/fish/fishd.*****
SET fish_user_paths:/usr/local/opt/openssl/bin\x1e/Users/yas\x2dnyan/\x2enodebrew/current/bin\x1e/usr/local/Cellar/mtr/0\x2e92/sbin
```

# 削除する時

## 他のshellの場合
他のshellであれば`~/.*shrc`に宣言的に記述されるので，不要になった場合は当該行を消せば良い．

```diff:~/.zshrc
- export PATH="$PATH:/Users/yas-nyan/.nodebrew/current/bin"
```

## fishの場合
fishでは設定する時と同じ様に，以下の様にCLIから削除する．

まず， 現在設定されているPATHを表示する．

```fish:~/
echo $fish_user_paths
/Users/yas-nyan/.nodebrew/current/bin /usr/local/Cellar/mtr/0.92/sbin /usr/local/opt/openssl/bin
```

例えば`/usr/local/Cellar/mtr/0.92/sbin`を削除するとする．
当該PATHは`$fish_user_paths`の2番目なので，以下の様なコマンドを実行する．
この時， indexは1から始まるので注意する．

```fish:~/
set -e $fish_user_paths[2]
```

## おまけ

`$fish_user_paths`が沢山ある場合何番目に登録されているかを確認するのは大変．

pathが何番目か表示するワンライナーは以下の通り．

```fish:~/
echo $fish_user_paths | tr  ' ' '\n' | nl
```

以下のようにわかりやすく出力される．適当にgrepして使って下さい．

```fish:~/
 1  /Users/yas-nyan/.nodebrew/current/bin
 2  /usr/local/Cellar/mtr/0.93_1/sbin
 3  /usr/local/opt/openssl/bin
```
SonarQube Developer版とCommunity版を導入しての比較

## はじめに
こんにちは。
ナビタイムジャパンで社内JiraやBitbucketの運用をしている TAKE です.
弊社では[SonarQube](https://www.sonarqube.org/)のCommunity版とDeveloper版の２つを使い分けています.
そこでわかったそれぞれの利点についてお伝えいたします.

## 結論
どちらか片方だけに絞るよりプロダクトや内部ツールなどリポジトリの重要度によって使い分けることが大切だと思います.

## 比較
### 料金

一番大きいところはこれですね.
下記の表のようになっています.
<img width="553" alt="price.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/3f7b56d7-178c-38fe-6e08-c45f43cc00f4.png">


行数毎の課金は
* 100,000行 14,470円
* 250,000行 108,526円
* 500,000行 217,086円
* 1000,000行 361,810円

※ 2019/12/11時点の為替です

すべてのリポジトリにいれるとなると,しっかり検討したくなるお値段設定ですね.

### 環境構築
Community版が圧倒的に楽でDockerとdocker-composeで環境構築が可能です.
公式のGithubにdocker-compose.yamlの[レシピ](https://github.com/SonarSource/docker-sonarqube/blob/master/recipes/docker-compose-postgres-example.yml)もおいてあるのでコピーして起動するだけですね.

Developer版については公式ページからDLしたあとに,環境構築をして起動のためのshellを叩く形になります.
DBはデフォルトだとH2 Databaseを利用するのでPostgresなどを利用したい場合は */conf/sonar.properties* の設定が必要になります

### 機能

#### 対応言語
Community版に比べてDeveloper版が6言語多いです.
中にはC++やSwiftなどの利用者の多い言語も含まれるためこの段階でDeveloper版となる方もいるかもしれません.
Python,JS,TS,Go,KotlinなどはCommunity版でも解析してくれるので差分をみて確認してください
https://www.sonarqube.org/downloads/

Sonarには拡張機能があり,公式でなくとも言語を導入できる場合もあるのでCommunity版を選択することもできるかもしれません！
（参考にC++のフリープラグインを共有します)
https://github.com/SonarOpenCommunity/sonar-cxx

#### 解析ブランチ
Developer版はブランチ名を渡してあげることによってブランチ解析が可能です.
しかしCommunity版はmasterブランチしか解析できません.
他のブランチを解析したい場合はmasterブランチだと偽装してsonarqubeにソースコードを解析してもらう必要があります.

ブランチ毎に解析することによってmasterにバグや複雑なコードがマージされる前に防ぐことができます.
バグを起こしたくない重要なプロダクトで利用すると良さそうですね.

※ Developer版の課金は解析した各ブランチの一番多かったソースコードで発生します.


#### プルリクエスト
圧倒的にDeveloper版が便利です.
プルリクだした段階でたくさんメッセージを出してくれます.
レビュアーにいっぱい指摘されて申し訳なさでいっぱいになる私でも機械だったら安心です.
<img width="1420" alt="bitbucket.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/2bdc7771-c910-0753-3bc7-fb28d34952e7.png">


## まとめ

<img width="629" alt="comparison.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/77416937-45c3-b54f-751f-a51336619833.png">


表のようにそれぞれに利点があるのでリポジトリ毎に使い分けるとよいです！
ソースコード可視化ツールSourcetrail 使ってみる

#Sourcetrail使ってみる
ここからDL
https://github.com/CoatiSoftware/Sourcetrail/releases/tag/2019.4.61

インストールで特に迷うことは無いと思うので割愛

#動かしてみる
スタート画面
![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/b9635eba-a877-25b6-fe28-716992772298.png)
・**New Project**をポチ
![スクショ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/c60dec67-20e7-1cb2-febf-cca20ef16c6f.png)
・Project Nameにsourcetrailファイルの保存名を入力
・Project Locationで保存先フォルダを指定
・Add Source Groupをポチ
基本的には１つのプログラムにつき１つのsourcetrailファイルを作るぽい
![スクショ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/17fe6d10-fb9b-c69f-2278-b8a9f55c6adc.png)
・言語選択(今回はPython)
![スクショ5_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/8b00b9dc-72ee-7781-ca01-2adb7841bac7.jpeg)
・いろいろ入力項目があるけどとりあえず赤丸のとこにmainファイルを指定するだけで良い
・他は無視してNext
![スクショ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/0f1f21fb-ff35-f87d-2ddf-c9561daa7a35.png)
ここではyolo_tkinter.pyを指定している
import先とかも勝手に参照してくれる
・ファイルが選択されてることを確認したらCreate!
![スクショ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533911/05be579b-e072-42bb-793b-922fa36b4535.png)
startをクリックして少し待つと処理が完了する


プログラムを説明したり、自分のコードがスパゲッティ～になってないか確認したりするのに使えそう‥？
ただしオブジェクト指向が怪しい人にはわかりにくいかも（私がそうでしたっ

後々便利機能について追記していくかも
webpacker ページ単位でJavascriptを管理する

## ページ(または任意の)単位でJavascriptファイルをまとめる

config/webpacker.ymlのsource_entry_pathで設定したパス配下に、
javascriptファイルを作ると、そいつもエントリーポイント扱いしてくれるらしい。

>[Rails 5: Webpacker公式README — Webpack v4対応版（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_05_24/56977#11)
> デフォルトのwebpackコンパイル設定は、従来のapp/javascript/packs/*（デフォルト）にあるすべてのファイルや、webpacker.ymlのsource_entry_pathで設定した任意のパスを対象とし、それぞれ独自の出力ファイル（webpackが呼び出す場合はエントリポイントも）に変換されます。

デフォルトではsource_entry_pathで設定したパス配下には、application.jsしかない。
今回はページ単位でやりたいので、ここにエントリーポイントになるjsファイルを作る。

##というわけで自分の環境で実装

アプリケーションの設定は以下のような感じです。

```rb:config/webpacker.yml
default: &default
  ...
  source_path: app/javascript
  source_entry_path: packs
  ...
```

で、以下の流れで個別ページに実装しました。

1. `app/javascript/packs/`配下にファイル作る
2. `app/helpers/hogehoge_helper.rb`にメソッド追加
3. `app/views/layouts/application.html.erb`で呼び出す
4. `config/application.rb`に処理追加

### 1.`app/javascript/packs/`配下にファイル作る

```javascript:app/javascript/packs/fuga.js
// yarnでインストールしたやつ
require('fugafuga')

// 自作(app/javascript/src/js/fugahoge.js)
require("../src/js/fugahoge")
```

### 2.`app/helpers/hogehoge_helper.rb`にメソッド追加

```rb:hogehoge_helper.rb
module HogehogesHelper
  def js_path
    %w[datetimepicker hoge]
  end
end
```
### 3.`app/views/layouts/application.html.erb`で呼び出す

```rb:app/views/layouts/application.html.erb
  <%# -----以下を追加----- %>
  <% if defined? js_path %>
    <% js_path.each do |path| %>
      <%= javascript_pack_tag "entry-#{path}", 'data-turbolinks-track': 'reload' %>
    <% end %>
  <% end %>
```

## 4. `config/application.rb`に処理追加

```rb:config/application.rb
    # コントローラーに対応するhelperファイルだけ読み込ませる。
    config.action_controller.include_all_helpers = false
```

## 余談 webpackerの導入と設定

以下を参考にしました。

- [webpackerの導入・設定メモ](https://qiita.com/tatsuyankmura/items/728e190b92e0370eefbb)
- [Rails & Webpackerでフロントエンド開発環境を整える](https://qiita.com/hiyamamoto/items/e0a30b4799314174b80f)
ゴールからの逆算　〜新人エンジニアとして意識して良かったこと〜

# はじめに

この記事はモチベーションクラウドシリーズ Advent Calendar 16日目の記事です。
こんにちは、リンクアンドモチベーションにてインフラチームのメンバーとして日々奮闘している根岸です。
インフラエンジニア歴が半年にも満たない戦闘力0.1人前の自分ですが、この半年間モチベーション高く、多くのことを学び続けることが出来ました。その際に意識して取り組むことで、勉強のモチベーション向上や学びのスピード向上に繋がったことをいくつか紹介したいと思います。

# この記事の狙い

インフラという領域は比較的学ぶ範囲も多く、仕事としては中長期的なものも多いため、新人エンジニアにとっては「短期的に成果を出しづらい」や「成長が目に見えづらい」という悩みを抱えることがあるかと思います。実際に自分自身も「成長はしているような気がするけど、目立った成果も少ないし、、、本当に成長しているのか、成長していても早いスピード出来ているのか」という思いを何度か経験しました。

今回の記事ではそのような悩みを解決する一助になるように、自分自身が実際に取り組んでよかったことを紹介し、読者に下記変化を起こすようなきっかけになったらと思っています。
※下記変化を必ず生み出せる！とまではいきませんが、ある一定効果はあると思います！

## Before
* エンジニアとして成長しているかわからない状態
* 成果が見えにくく、成長していても意欲（モチベーション）が低下している状態

## After
* エンジニアとして成長している実感が生まれる状態
* 成果も出すことができ、成長への意欲（モチベーション）が高まっている状態

# 取り組みの背景となる考え方

心理学のラダー効果をもとにリンクアンドモチベーションでは**「意義」「成果」「行動」**という3つの要素で目標を上手く設定し、仕事への関わり方をコントロールすることで、モチベーションのコントロールも出来るように取り組んでいます。

## ラダー効果

ラダー効果とは視点の抽象度を引き上げて日々の業務の意義や成果を捉えることで、自身のモチベーションを高め、行動のクオリティをも向上させていくという手法です。
具体的に「レンガ積みの話」がよく例に出されますが、石を積み教会を造る仕事を意義、成果、行動それぞれの観点で考えると下記図のようになります。

<img width="300" alt="スクリーンショット 2019-12-16 20.35.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539802/ad2498f6-af96-4d87-6ed4-1e2fbcb32c24.png">

このラダー効果を意識すると、日々の業務に注力してしまいモチベーションが下がってしまわないように、その業務がどういった「意義」があるのかを明確にしたり、意義は感じるものの日々の業務で不明確な部分が多くモチベーションが下がってしまわないように、日々どういった「行動」をすべきなのかを明確にしたりと、抽象的な意義から具体的な行動を上手く設定して、仕事へのモチベーションをコントロールすることが出来ます。

# モチベーションが上がる進捗表の作成

上記のような考え方をもとに、エンジニアとしての成長の可視化と成果の明確化をできるような進捗表を作成しました。
※下記参考用の進捗表です

<img width="1449" alt="スクリーンショット 2019-12-16 16.51.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539802/b08b1310-b4df-76a9-3232-736486be5f20.png">


作成にあたり意識したことをいくつか紹介します

## コツ１ 〜目標を達成するための方法や手段を示せているか？〜

意義、成果、行動を設定することが重要であるといっても、即座に新人が設定するのは難しく感じてしまうので、自分自身は「誰に」「何を」「どのように」というフレームをもとに各種目標を設定しました。

* 意義：「誰に」「何を」「どのように」のうち「誰に」を明確にする<br>自分の仕事の影響範囲を明確にする
* 成果：「誰に」「何を」「どのように」のうち「何を」を明確にする<br>「誰に」紐付いた具体的な成果を明確にする
* 行動：「誰に」「何を」「どのように」のうち「どのように」を明確にする<br>成果と効率を同時実現する行動を明確にする

設定の流れの詳細は下記のようになります。

<img width="1307" alt="スクリーンショット 2019-12-16 13.31.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539802/da320afe-7455-9540-45e1-cd866134a269.png">

## コツ２ 〜目標に納期やスケジュールを示せているか？〜

やるべきことの明確化には必ず、時間軸を盛り込むことで、積み上げ式ではなく、ゴールからの逆算で業務を計画出来ている状態にしました。新人はチームに対して明確な成果を出すことが一定時間がかかることから、時間軸をしっかりと明確にすることで、行動を時間通りに行うこと（時間よりも早く終わらせること）をしっかりと自分自身も周囲も評価できるようにしています。
※作成した帳票の中では下記画像の部分にあたります。

<img width="168" alt="スクリーンショット 2019-12-16 13.38.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539802/99ca6443-87c1-79be-1035-b60ed6c094ef.png">

* 見積と実績<br>開発を行うには当たり前ですが見積と実績を明記することで、積み上げ式ではなくゴールからの逆算で業務が出来ているかを明確にします。
* 〇〇さんだったら<br>新人のよくある勘違いとして、行動を時間通りに行えたことは一定評価に値すべきことではありますが、同時に自分自身が目指すべき未来とのギャップも認識することでどこまで成長しなければならないのかを明確にする必要があります。その際に自分が行なっていたのは自分の上司（あるいは同じ業務をしている上位者）であれば自分が行う業務はどのくらいの時間がかかるのかを明確にすることです。

# まとめ

記事の冒頭でも触れましたが、エンジニアという職種は学ぶことが多い領域でもあり、新人の時代は成長が一定見えにくい傾向にあると思います。そのような課題を解決する上で、リンクアンドモチベーションが日々意識していることを適用してみました。実際に上記取り組みを行なってからは、自身の成長の度合いも自分自身で把握することができ、日々の業務に対してもモチベーション高く望むことが出来ました。
新人にとって目標設定や計画立ては非常に重要な業務になると感じていますので、是非、新人エンジニアの皆さまも実践いただければと思います。
【Jest】VeeValidateのSyntaxError: Unexpected token 'export'を回避する

# 【Jest】VeeValidateのSyntaxError: Unexpected token 'export'を回避する




```console:error
    export { alpha$1 as alpha, alpha_dash, alpha_num, alpha_spaces, between, confirmed, digits, dimensions, email, excluded, ext, image, integer, is, is_not, length, max, max_value, mimes, min, min_value, numeric, oneOf, regex, required, required_if, size };
    ^^^^^^

    SyntaxError: Unexpected token 'export'

      4 | } from 'vee-validate'
      5 | import ja from 'vee-validate/dist/locale/ja'
    > 6 | import * as rules from 'vee-validate/dist/rules'
        | ^
```

以下のignore pattern を追加することで解決します。

```js:jest.config.js
module.exports = {
  transformIgnorePatterns: ['/node_modules/(?!vee-validate/dist/rules)'],
}
```
Xcodeの最近使ったプロジェクトが出なくなった(No Recent Projects)

# 事象
Welcome to Xcodeに表示されるはずの最近使ったプロジェクトが出なくなった。
<img width="792" alt="スクリーンショット 2019-12-16 13.15.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208579/1755ee67-3f7d-f4d4-e27b-9d7715ec95e9.png">
不便すぎる、、、3秒前に使ってたのに。

# 解決方法
Xcodeのせいだと思って再起動したり、色々したんですが、XcodeのせいではなくMacの設定のせいでした。
1. システム環境設定
2. 一般
3. 最近使った項目（これが0だと出なくなる）
<img width="660" alt="スクリーンショット 2019-12-16 13.20.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208579/d07c84b1-376a-4ef8-8ca3-6868bbe25eee.png">

# 自分でわざと消す方法
1. Xcode起動
2. Fileタブ
3. Open Recent
4. Clear Menu
<img width="581" alt="スクリーンショット 2019-12-16 13.17.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208579/eadc7442-5f91-b6cc-fb20-4f77056ca4d1.png">

# 参考
- [Xcode doesn't show recent projects in recent projects list](https://stackoverflow.com/questions/5180100/xcode-doesnt-show-recent-projects-in-recent-projects-list)
Serviceとtimerを止める

定期的にスクリーンショットを取得するサービスが中々終了しなかったので記載。
タイマー処理付きのサービスはタイマー停止後にサービスを止める
（サービスだけ止めてもタイマーは裏で動き続け、プロセスが残る）。
ここではServiceで定義したtask(timer)をcancelし、stopServiceで止めている。

サービスの起動確認をする場合、タイマーを止めなければtrueが通り続ける。

サービス名：SService

```Activity.java
        //タイマー処理確認
        SService ssservice= new SService();
        if(ssservice.task != null) {
            ssservice.task.cancel();
            ssservice.task = null;
        }

        //サービス停止
        android.content.Intent _intent;
        _intent = new android.content.Intent(getApplicationContext(), ssservice.class);
        getApplicationContext().stopService(_intent);

```

以下のソースでサービスの起動確認が可能。参考にどうぞ

```Activity.java
private boolean isMyServiceRunning(Class<?> serviceClass) {
        //サービス起動確認
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                //サービス起動済み
                return true;
            }
        }
        //サービスが起動していない
        return false;
}
```
AWS CLI の最新版のインストールおよび初期設定


## １．目的

aws cliがすでにインストール済の環境に対して、aws cliを最新版へとアップロードして、初期設定(aws configure)を実施する。



## ２．設定方法

pythonがインストールされていることの確認。

```
python --version
Python 2.7.16
```

pip（Pythonのパッケージを管理ツール）をインストール。

```
curl -O https://bootstrap.pypa.io/get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1734k  100 1734k    0     0  21.7M      0 --:--:-- --:--:-- --:--:-- 21.7M

```

pipコマンドの準備を行う。

```
python get-pip.py --user 
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting pip
  Downloading https://files.pythonhosted.org/packages/00/b6/9cfa56b4081ad13874b0c6f96af8ce16cfbc1cb06bedf8e9164ce5551ec1/pip-19.3.1-py2.py3-none-any.whl (1.4MB)
     |████████████████████████████████| 1.4MB 4.3MB/s 
Collecting wheel
  Downloading https://files.pythonhosted.org/packages/00/83/b4a77d044e78ad1a45610eb88f745be2fd2c6d658f9798a15e384b7d57c9/wheel-0.33.6-py2.py3-none-any.whl
Installing collected packages: pip, wheel
  WARNING: The scripts pip, pip2 and pip2.7 are installed in '/root/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script wheel is installed in '/root/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
```


諸々、pipコマンドの事前準備を行う。

```
echo export PATH='~/.local/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
pip --version
```

pipコマンドを用いて、awscliをアップグレード。

```
pip install awscli --upgrade --user
```

aws configureコマンドを用いて、初期設定を行う。
＃AWS Access Key IDとAWS Secret Access Keyは仮値です。
　利用するアプリケーションの環境に合わせて設定する必要があります。

```
aws configure 
AWS Access Key ID [None]: AKIAS3RLIIKFLYZ67XNT
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

以上
iOSにRouterという概念があるらしい。

## 初めに
この記事はこちらの本を参考にしています。
https://peaks.cc/books/iOS_architecture
詳しく知りたい方はこちらを読みましょう。
MVVMやMVP,クリーンアーキテクチャ,Reduxなど様々なアーキテクチャについて書いてあるので本当にためになります。
全ての内容を事細かに書くと本のネタバレになってしまうので、自分なりに**ざっくり**まとめて書きたいと思います。
## Routerとは
viewControllerから画面遷移の処理を切り離すことで画面遷移の部分を見やすくし、viewControllerに記述する量を減らすことができる。
TransitionerとRouterに分けます。
Transitionerでは下のようにprotocolextensionを使って画面遷移の共通部分を初期化します。

```swift:Transitioner
protocol Transitioner: AnyObject where Self: UIViewController {
  func pushViewController(_ viewController: UIViewController,animated: Bool)
  ...
}
extension Transitioner {
  func pushViewController(_ viewController: UIViewController,animated: Bool) {
    guard let nc = navigationController = else { return }
    nc.pushViewController(viewController,animated: animated)
  }
  ...
}
```
こいつをviewControllerに準拠させます。
あとはRouterでModelなりControllerなりを初期化し、Transitionerの処理を呼び出して画面遷移する処理を書きます。
このRouterをPresenterなりviewControllerなりで呼び出せば完成です。
何回も書きますが詳しいコードが見たい方は上の本を読んでみてください。
流れとしては
1. PresenterやviewContollerなどでRouterの画面遷移の処理を呼び出す。
2. RouterはModelやPresenterを初期化しTransitionerの処理を呼び出し、画面遷移する。
3. 結果として画面遷移の処理はPresenterとTransitionerが担うのでviewControllerから画面遷移の処理を切り出せる
ということになります。
## 最後に
本の内容が割とほとんどなので詳しいコードなどはあまり書きませんでしたが、考えた方だけ分かってもらえると幸いです。詳しく勉強したい方は3度目ですが本買いましょう。
画面遷移の処理をまとめて切り出しておけるのは便利だし見やすくていいですね。
bundleができない時の対処法

## 環境
* rails 5.2.3
* ruby 2.6.3
* rbenv 1.1.2


## エラー内容

railsで、bundleをしようとしたところ

```
Users/user/.rbenv/versions/2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Users/user/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin18/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (LoadError)
  Referenced from: /Users/user/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin18/openssl.bundle
  Reason: image not found - /Users/user/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin18/openssl.bundle
```

このようなエラーがでました。

## 対応

探したところ、[この記事](https://qiita.com/kota-es/items/98ae6ee84fc59aaae2ea)に似たエラーが表示されていたので、記載通りおこなったところ改善なし😇
openssl系のエラーみたいなので、再インストールをしても反応なし。
rbenvでバージョン管理しているため、一度ruby2.6.3を削除し、インストールすると**無事改善**しました。
Dataiku DSSをVirtual Boxを使って利用する方法


# Dataiku Data Science Studioとは

Dataiku Data Science Studio（DSS）とは、[Dataiku社](https://www.dataiku.com/)が提供するデータ分析ツールです。[kinugaさん](https://qiita.com/kinuga/items/a6be89eb564630dd6f98)のページのご紹介の通り、データ分析に必要な手続きをある程度自動的に実施してくれて、これからデータ分析を始めたいと考えている方にとって、扱いやすいツールになっています。

# Virtual Boxを利用したWindowsでのDataikuの利用方法

Dataikuから、Virtual Box用のアプライアンスが提供されています。
[Install Using Virtualbox Or VMWare](https://www.dataiku.com/product/get-started/virtualbox/)

これを利用して、Windows上でDataikuを利用することができます。

## 必要な要件
インストールするPCに必要な要件は次になります。
- 64ビットのWindows OS
- 8GBメモリ
- ブラウザ（Chrome または Firefox）

## インストール方法
#### 大まかな流れは次のようになります。
1. Virtual Boxをインストールします
2. Dataiku DSSのイメージをダウンロードします
3. Virtual BoxにDataiku DSSの仮想イメージをインポートします
4. Dataiku DSSを起動します
5. Dataiku DSSにブラウザでアクセスします

#### 1. Virtual Boxをインストールします
[Virtual Box](https://www.virtualbox.org/)からVirtual Boxのインストーラーをダウンロードします。
ダウンロード後、Virtual Boxをインストールします。
![virtual_box.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/8713afe6-b6c7-b9c6-7462-bbfa16200e3a.png)

#### 2. Dataiku DSSのイメージをダウンロードします
[DSS virtual machine](https://cdn.downloads.dataiku.com/public/dss/8.0.0/dataiku-dss-8.0.0.ova)から、Dataiku DSSイメージをダウンロードします。※サイズが1.7GBと大きいです。

#### 3. Virtual BoxにDataiku DSSの仮想イメージをインポートします
メニュー［ファイル］-［仮想アプライアンスのインポート］から、ダウンロードしたDataiku DSSイメージをインポートします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/089198b7-9320-71ba-0fc9-ba2ea22a30f2.png" width=70%>

#### 4. Dataiku DSSを起動します

Virtual BoxでDataikuアプライアンスを選択し、［起動］ボタンをクリックしてDataikuを起動します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/c9807234-ae94-3398-d07c-8a94624760ba.png" width=70%>

#### 5. Dataiku DSSにブラウザでアクセスします

ブラウザでコンソール画面に表示されているURL（http://127.0.0.1:10000 ）にアクセスします。
下記画面が表示されます。最初に簡単なユーザ登録をするとDataiku DSSを利用することができます。

1. ライセンスは「No」にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/b65b28fc-618c-b2ea-3a97-a0270682b2c3.png" width=70%>

2. 次の画面で「Free Edition」を選択して、ユーザ情報を登録します。
登録が完了すると、ログインアカウントの情報が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/3a8608c6-2d75-fc16-3c3a-648927fd7f87.png" width=70%>

3. Dataiku DSSのログイン画面が表示されるので、先ほどのアカウント情報を入力してログインします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/cd778b20-00ef-885d-608a-cc888c9e6385.png" width=70%>

## データ分析の学習への活用
［New Project］ボタンを押下して、顧客解約予測などのサンプルプロジェクトを参照することができます。
これらのサンプルから、分析の進め方の一例を見ることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/8fc928e5-b3ef-b969-5f93-ba905ae0497e.png" width=70%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/6d6d8b94-f19c-2860-2012-17bc67784c72.png" width=70%>

また、[Dataiku Academy](https://academy.dataiku.com/latest/)のコンテンツを利用して、データ分析のユースケースや要素技術を学習することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/76ff3dcc-256b-61c8-699a-b31618c53b36.png" width=70%>

## 参考資料
[Dataiku Install Using Virtualbox Or VMWare](https://www.dataiku.com/product/get-started/virtualbox/)
cssうんちに魂宿してみた

# 💩おさらい💩
前回cssでうんちを書いたぞ！
[cssだけでうんち書いてみた](https://qiita.com/petapetapeta/items/b8b8675ef6880bed65a3)
今日はこれをよりうんちらしくするべく、魂を宿してみたい！

# 💩cssでぷる〜んていうアニメーション💩
キーフレームを頑張って打て、scale()を変えればできる！

```css
@keyframes jelly {
  0% {
    transform: scale(1, 1);
  }
  8% {
    transform: scale(1, 1);
  }
  10% {
    transform: scale(1.1, 0.9);
  }
  13% {
    transform: scale(0.9, 1.1);
  }
  17.5% {
    transform: scale(1, 1);
  }
  19% {
    transform: scale(1, 1);
  }
  58% {
    transform: scale(1, 1);
  }
  60% {
    transform: scale(1.1, 0.9);
  }
  63% {
    transform: scale(0.9, 1.1);
  }
  67.5% {
    transform: scale(1, 1);
  }
  69% {
    transform: scale(1, 1);
  }
  100% {
    transform: scale(1, 1);
  }
}
```

# 💩宿した💩
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="petapetapeta" data-slug-hash="abzmjoq" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="unchi-soul">
  <span>See the Pen <a href="https://codepen.io/petapetapeta/pen/abzmjoq">
  unchi-soul</a> by petapetapeta (<a href="https://codepen.io/petapetapeta">@petapetapeta</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

マウスを乗せるとぷる〜んってなるようになりました！
可愛いですね💩
PHPのチェックリスト

#OOPを少なめ

覚えて！ OOPは常に遅い。 オブジェクトは作成、保存、破棄する必要があるから不適切にオブジェクトを使用しないことだ。 たとえば、ここに：

```
$post = new Post();
$post->set_title($_GET['title']);
$post->set_description($_GET['description']);
$post->save();
```

ただデーターをDBに保存するためにオブジェクトを使うのが勿体無い。そういう時は配列を使った方が良い。

```
mysql::insert(['title' => $_GET['title'], 'description' => $_GET['description']]);
```
ここでオブジェクトを使わずにDBに直接データーを保存できる。

#絶対パス
ファイルの操作をする時は絶対パスを使うこと。

```
/*
include 'file.php';
file_get_contents('dir/data.txt');
*/
include '/var/www/file.php';
file_get_contents('/var/www/dir/data.txt');
```
絶対パスを使わないとファイル検索の操作にリソースが無駄に使われてしまう。

#クラスのコンスタント
defineよりクラスのconstの方が効率が良いからconstをなるべく使おう。

```
// define('MAX_POSTS_PER_PAGE', 10);
class posts {
	const PER_PAGE = 10;
	...
}
```

#関数のないfor

```
// for ($i = 0; $i < count($list); $i++) ...

$count = count($list);
for ($i = 0; $i < $count; $i++) ...
```

forの中に関数を入れてしまうとループの各反復でその関数が実行される。

#正規表現が遅い

```
preg_match('/example/ui', $post['title']);
strpos($post['title'], 'example');
```

可能であれば正規表現の代わりに文字列を操れる標準の関数を使用した方が良い。

#一重引用符

PHPでは文字列に二重引用符を付けてしまうと変数の変換処理が発生してしまう。なので変数のない文字列の場合は必ず一重引用符を使おう。

```
// $post["title"] = "なぜ?";
$post['title'] = '変数の変換処理が発生しないから'
```
チームビルディング（という名の忘年会）で場所借りて鍋パしてみた

# TL;DR

会社の忘年会を場所借りて料理を用意した話。

# 背景

「チームビルディングの予算余ってんだよなあ」
「会社の６周年記念パーティでそういえば肉手に入れましたね。」
「せっかくだから肉処理するためにもどっか場所借りるのどすか？」
「イイネ！」

と勢い余っていい肉も手に入れたしそうしようってお話になりました。

# 予算
会社の福利厚生により、一人4000円×人数で定義されているので、10人前後くらい参加者を募って予算４万になりました。４万で果たして都内でできるかなー。。。とか思いつつ。

# とある発言

「どうせなら遠方で作業してから晩飯準備的な感じでどうですか」
「移動が面倒だし、作業もしたいから近場でサクッとでもいいよね」
「いやー、飯さえ食えればなんでもいいっすよね」

とりあえず聞いてみるところから入ってさて企画です。

# 企画

今回は色々達成したい要件はあるがグッとこらえて「もらった美味しい肉を食べる」「忘年会をする」にフォーカスすることにしました。（それ以外は盛り込まない）案外場所借りるのにはお金がかかるようですし、要件追加すると、遠隔地で相場的に安くても予算に収まらないってことがままありました。

# 場所

色々アイディアはありましたが、AirbnbかSpaceMarketなどなどで探すには色々制約が出てきます。

* 都内にオフィスを構えている弊社から外で場所を借りる　→遠方なので移動時間かかる
* 近場　→　借りる代金がまあ高い

遠方でやるとなんだかいろんなものを盛り込みたくなる（作業場要素や、温泉要素だとか）ので、それだと流石に予算オーバーが見込めそうなので近場でなんとか探してみました。
キッチンと食べる場所だけにフォーカスすれば都内で２.５ー３万でありそうです。

# 準備
メニューを決めましたが、厚切肉ではステーキを切って割り振るとなると味気ないので、
鍋系にしてステーキ肉を使ったすき焼きにしました。

一人じゃパーティの仕切りは全部は賄えないので、メンバーに分担です。
料理、配膳、食材の買い出し、会社からの持ち出し、酒の調達くらいで４、5人程度で割り振りました。
料理できるメンバーが自分だけだったのは意外でしたが、まあ多分できなかったとしても

# 寄付
会社でたまたま取引先でもらったワイン（しかも8000円くらいのいいやつ）があったらしく、ちょうど肉にあうとのことでもらえました。ありがとうございます。
あと肉が足りないとのことで、とあるメンバーが肉を提供してくれました。これはありがたい。

ワインも２本（１本は2000円）手に入ったところで飲み比べ会もやることにしました。

# やってみた

## 準備
一人がメインで動けばだいたい終わります。鍋は切るだけですからね。

![20191212_182005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35126/4fc67a20-1a0f-4726-56ae-af7be4412891.jpeg)


## 飲み比べ
ワインの飲み比べを行いました。
「一流なら何度飲み比べても同じ結果になるだろうw」という冗談でボトルが空くまで飲み比べを実施したものの、全員負け越しました。（俗にいうバカ舌企画になりました。ちなみに私は全敗して「写す価値なし」になりさがりました。）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35126/b7cb7c88-74a8-2e4f-05bc-6352e938b951.jpeg" width=300>


## 片付け
みんな仲良く片付けすれば30分くらいで撤収できました。チェック項目用意しておくとよりスムーズ。

![20191212_205304.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35126/2813b132-e970-5e77-e331-e0087be6ad7e.jpeg)


# 結果

場所代：32,000円
食材：3,000円程度(10人でもちょっと余る程度)
追加ワイン：2,000円程度
缶系の酒：会社より無料提供（在庫処分）
ワイン：会社より無料提供
割り箸等々の道具：1,000程度

しっかり40,000円に収まりました。

# 作ることはめんどうだけど
確かに準備的にはちょっと大変ですが、鍋にしてしまえば切って焼くだけだったのでそこまで手がかかるかというと、ものの30分程度で準備はできてしまいます。（切るだけですしね）
レシピもクックパッドなり探せばいくらでもあります。
それに準備だったりとあれこれしないといけないことが増えますが、ちょっとした協力作業が発生するので、これはこれでいいんじゃないかと思っています。きっかけがなければ人と関わることもないので、メンバー間で話すいいきっかけ作りになったかなと思います。

# まとめ・展望

* 鍋パは大人になってもいい。
* ステーキ肉でもすき焼きはうまい。
* 「協力して何かやる」はとてもいい。
* ワイン飲み比べは誰も彼も負け越した（つまり味が正確にわかる人はチーム内にいない）
* みんなありがとう。

ありがとうございました。
iOS13のメインスレッドチェック厳格化とNotificationCenterの組合せでつまづいた

### メインスレッドチェックの厳格化

元々、「UIの更新はメインスレッドで行うべし」というお約束はありましたが、Xcode11より、

- iOS13ではサブスレッドからUIコンポーネントを変更するとクラッシュするようになりました。
- サブスレッドからUIコンポーネントに「アクセスしただけ」で警告されるようになりました。
    - ビルド時の静的チェックではなく、ランタイムで該当コードを通ると紫にハイライトされます

### NotificationCenterのスレッド

- Notificationのpost元がメインスレッドであれば、addObserverで設定した関数（以下observer関数）はメインスレッドで処理されます。
- Notificationのpost元がサブスレッドであれば、observer関数はサブスレッドで処理されます。

### 私のつまづき経緯

- 既存のNotificationをpostするコードをサブスレッド処理の中に新たに追加
    - その既存Notificationは今までメインスレッドからしかpostしていなかった
    - 複数のobserver関数のうち一つが、サブスレッドでの動作を想定していないコードになっておりクラッシュが発生

### サンプルコード

```swift
import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(notify(_:)),
                                               name: Notification.Name("Notification"),
                                               object: nil)
    }

    @IBAction func tappedButton(_ sender: Any) {
        // (A)
        NotificationCenter.default.post(name: Notification.Name("Notification"),
                                        object: nil,
                                        userInfo: ["result": "This is Main Thread"])
        request()
    }

    func request() {
        guard let url = URL(string: "https://www.ibm.com/jp-ja") else { return }
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            // (B)
            NotificationCenter.default.post(name: Notification.Name("Notification"),
                                            object: nil,
                                            userInfo: ["result": "This is Sub Thread"])
        }
        task.resume()
    }

    @objc func notify(_ notification: Notification) {
        // (A)のpostを受け取った場合は問題ないが、(B)のpostを受け取ると警告が出る
        print("text: \(label.text ?? "")")
        if let userInfo = notification.userInfo, let str = userInfo["result"] as? String {
            // (A)のpostを受け取った場合は問題ないが、(B)のpostを受け取るとクラッシュする
            self.label.text = str
        }
    }
}
```

### 横展開調査が面倒…
   
- NotificationCenterによって通知する設計は処理の流れが追いづらく、影響範囲や発生条件を特定するのが大変
- （UITestを書かない限り）手作業で動かしてみないと検証できない

### 再発防止策

observer関数内でUIコンポーネントにアクセスする時は、とにかく `DispatchQueue.main.async` で囲むことを徹底！
（精神論…:sweat_smile:）
お金を稼げるの？Webスクレイピングの活用例3つ

元記事：https://www.octoparse.jp/blog/3-web-scraping-applications-to-make-money/

Web上のトラフィック（流入数またはアクセス数とも言える）の70％が[Webクローラー](https://www.octoparse.jp/blog/what-is-web-crawler/)によって作成されたことを信じられますか？衝撃的ですね！Web上にはたくさんのWebクローラーがあり、色々な仕事をしています。彼らは、人間の行動をシミュレートし、ホームページ上を歩き回り、ボタンをクリックし、データをチェックし、情報を持ち帰ります。

Webクローラーのおかげで、Web情報収集の仕事はかなり楽になりました。今ではeコマースビジネスでの価格監視、ソーシャルメディアの監視と分析、または学術研究のための研究データの取得など、広く使われています。この記事では、驚くほどの収益性の高い[Webスクレイピング](https://www.octoparse.jp/blog/web-scraping-introduction/)活用事例を3つ紹介したいと思います。


#1. 交通機関

海外旅行に行った時、皆さんは格安航空券を買ったことがありますか？普通にはスカイチケットなどの格安航空券予約サイトで買ったのでしょう。自分で買ったのは難しいですね、いつ割引があるのか分からないからです。格安航空券予約サイトを経営する会社ではWebクローラーは非常に人気があります。

航空会社の本来の意図は、観光客を引き付けるために安いチケットをランダムに提供することでしたが、ダフ屋はその中から利益を生み出す方法を見つけました。ダフ屋は、Webクローラーを使用して、航空会社のWebサイトを継続的に更新します。安いチケットが出ると、Webクローラーは自動的にチケットを予約します。

たとえば、AirAsiaは1時間だけ予約を保留し、それまでに支払いが行われない場合、チケットはチケットプールに返送され、販売の準備が整います。ダフ屋は、チケットがプールに戻った後、ミリ秒でチケットを再度予約します。新しいチケット注文が来るまでは、Webクローラーはその仕事をずっと繰り返します。注文が来たら、ダフ屋はお客さんの名前で予約し、購入します。

難しいですね、この仕事。こう見ると、たぶん、仲介手数料はかなり公平です。

 
#2. Eコマース 

賢い消費者の「お気に入り」には、価格比較サイトとか、キャッシュバックサイトとかクーポンサイトとか、お金を節約できるサイトがたくさんあるのでしょう。これらのサイトはどのように動かすのでしょうか？

彼らはECサイトから商品の価格と画像をスクレイピングし、自分のWebサイトに表示します。

AmazonのようなEコマース巨頭は、オープンソースの傾向を逆転させることは難しいことを知っています。そこで、Amazonは商品価格表の取得できるAPIの販売ビジネスを始めます。価格比較サイトは、すべての仕事を行い、スクレイピングのコードを書い、販売チャネルを提供し、支払う必要があるようです！

それでは、これらの集約Eコマースプラットフォームがどのように利益を生み出すのでしょうか？

例えば、岡本を販売する複数の店舗を集約するプラットフォームがあるとします。ユーザーが商品を検索するとき、プラットフォームはどの店舗が最初に置くか、どの店舗が最後に置くかを決定します。要するに、より多くを支払う人は誰でもトップにランクされます。
![screenshot_20190902162308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/e3c8507c-a019-cf44-b31f-d152bf3cdf2b.png)


ランキングの入札がきつい場合、Webページで広告を購入することもできます。訪問者がクリックするたびに、Webサイトはお金を得られます。

Webサイトは、委託手数料を獲得する代理店としても機能します。店舗が商品を販売するのに役立つため、理解するのは非常に簡単です。「多ければ多いほど楽しい」という信念に基づいて、キャッシュバックサイトが生まれています。
 

要約すると、このパターンは非常にうまくいっていて、市場が成熟しています。

 

#3. 社会保障

APIを介してデータベースを共有する2つの企業では、Webページのデータをレポートに変換するためにWebスクレイピングが必要になる場合があります。

例をあげましょう。Equifax、Experian、およびTransUnionは、1億7000万人のアメリカ成人のクレジットファイルを保持し、毎年6億件以上のクレジットレポートを販売し、100億ドル以上の収益を生み出しています。

 「これは実に単純なビジネスモデルです。彼らは、貸主からあなたに関する多くの情報を収集し、それを集約して、売り戻します」と、モーニングスターの業界アナリスト、ブレットホーンは述べています。

銀行、雇用主、地方裁判所、ショッピングセンター、ガソリンスタンドなどから個人的な行動データを収集します。数多くのレポートを分析するため、Webスクレイピングはデータを整理するための大きな助けになります。Webページを構造データレポートに変換できます。

 

 

#まとめ

いかがでしたか？まさかこれらの仕事にはすべてWebスクレイピングを使っているのを思いつきませんね。実には活用事例はまだたくさんあります。もしこれからチャレンジしてみる場合、[Webスクレイピングツール](https://www.octoparse.jp/blog/top-30-free-web-scraping-software/)がオススメです。専門知識が必要ないし、操作やすいです。[Webスクレイピングツールの10選](https://www.octoparse.jp/blog/the-10-best-web-scraping-tools/)をご覧ください。
[UE4] 良く使うノードをもっと簡単に

![2019-12-16_12h55_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/2e9c6b81-06c5-58e8-84e9-b0165383f9c3.png)

左クリック + Bを押してBranchノード、
左クリック + Sを押してSequenceノード、
左クリック + Fを押してFor Each Loopノードを作れます。
【windows CMD】シャットダウン、再起動をコマンドで。

メモとして残します。


#■やり方

##シャットダウン
```shell
shutdown -s -t 1
```
##再起動
```shell
shutdown -r -t 1
```
`-t [sec]` オプションがない場合はWin10の場合は1分後に実行されます。

#■余談
プログラムのインストールやアンインストールするとエクスプローラがダウンして、スタートボタンすらなくなるので、コマンドで再起動する機会があったので、、、、
マンガでわかる Iterator

![7A8A6432-C8F0-49E6-A66F-DF1FF375B0B2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/9cdd9b51-a7f3-c14c-bcd5-cb2431bbdc97.png)

もうこの絵見て。全部入れたったわ。

Iterator はただ回りくどいだけの、制限付き配列走査 for ループってことじゃないですよ。単方向読み取り専用配列で扱うほうが安全だからそうしてるんだよねと思ってたら、大きく誤解しちゃいますよ。

反復可能 = Iterable は、さまざまなデータ構造 (型) に共通する、かなり上位の抽象概念 (型クラスとかかも) です。その概念の、人が触れることができる操作部分が Iterator なのです。

単純な固定長配列以外にも、データ構造にはさまざまなものがあります。データ構造を直接扱うと、それぞれ固有のアルゴリズムで繰り返しを作らないといけません。また、計算で要素が生成されるもの、走査開始時点でまだ終端がわからないもの、そもそも終わりのない無限反復、といった、`for (i = 0; i < 要素数; i++)` では表せないものも、反復可能であるのは確かです。

データ構造に対してハードコードする繰り返しでビジネスロジックを書いてしまうと、後で対象データの構造を変更したいときが大変です。せっかくオブジェクト指向の醍醐味=ポリモーフィズムがあるのに、データ構造の実装をシュッと差し替えできないのは、残念ですね。

たとえば、単体テストでは固定数の素朴な配列を使っておき、本番ではストリーミングIOで非同期にデータが来る、みたいなの、やりたいじゃないですか。

そこで出ました「関心の分離」です。「反復可能」という概念に着目して、繰り返しの実体にまつわる複雑さと、繰り返されるビジネスロジックとを分離するのです。そして、繰り返しなんてのは Iterator と呼ばれるなにか (抽象) がやってくれるはず、こっちの仕事はその中身どうするかだけに集中、と自己完結しちゃいましょう。

モダンなプログラミング言語やフレームワークを使っていると、標準機能の中に Iterator が折り込み済みで、いつの間にか無意識にできていたりします。標準の組み込み機能にしてしまうぐらい、これ有用なパターンなんですよね。

だったらわざわざ自分でやらなくたって... まったくそのとおりです。くどいかもしれませんが、デザインパターンは、プログラムを書くためのスキルではない、という話です。名前を持っている概念、その意味を共有して理解するのが、いちばん大事なとこですよ。だからこそ、みんな大好き Iterator の理解はぜったいに外せませんよね。
DartのExtensionでStatic methodを使う方法


[株式会社Tenxia](https://tenxia.jp/)のCEOの岡部（[Twitter](https://twitter.com/_masaokb)）です。 

ついにFlutterのStableがDart2.7になり、待望のExtensionが使えるようになりました。

ExtensionでStatic methodを使う方法で若干詰まったので、メモがてら記事にしておきます。

## 直感的な方法だと参照出来ない

```dart
enum Sex {
  male,
  female,
  others,
}

extension SexExtension on Sex {
  static Sex fromString(String text) {
    switch(text) {
      case 'male':
        return Sex.male;
      case 'female':
        return Sex.female;
      default:
        return Sex.others;
    }
  }
}


main() {
  print(Sex.fromString('male'));
  /// Error compiling to JavaScript:
  /// main.dart:22:13:
  /// Error: Enums can't be instantiated.
  /// print(Sex.fromString('male'));
  ///            ^^^^^^^^^^
  /// Error: Compilation failed.
}


```

## こっちに生えてる

```dart
main() {
  print(SexExtension.fromString('male'));
  /// => Sex.male
}
```

良かったですね。

参考： https://github.com/dart-lang/language/issues/723#issuecomment-562582406