OmniAICreator/Qiita-1.07M huggingface dataset:
VeeValidate で Validation Observer と data-vv-as を併用する

# VeeValidate で Validation Observer と data-vv-as を併用する

Validation Provider の `name` に `data-vv-as` に該当する指定をしたらよいようです。

[Validation Provider - Examples - VeeValidate](https://baianat.github.io/vee-validate/examples/validation-providers.html#bootstrapvue) を fork したものが [こちら](https://codesandbox.io/s/validation-observer-with-data-vv-as-bw7b8)

[Vee-validate: Don’t get “data-vv-as” working with “observer/provider”](https://forum.vuejs.org/t/vee-validate-dont-get-data-vv-as-working-with-observer-provider/65144) こちらで同様の対応をしている人がいました。

## Validation Provider への data-vv-as 指定

`BTextInputWithValidation.vue` について `name` への指定に `$attrs['data-vv-as']` を `$attrs['name']` の前に渡します。

```vue:BTextInputWithValidation.vue
<template>
  <ValidationProvider
    :vid="vid"
    :name="$attrs['data-vv-as'] || $attrs.name"
    :rules="rules"
    >
```

## Validation Observer 使用箇所での data-vv-as 指定

`BTextInputWithValidation.vue` を使用している箇所で `password` の片側だけ `data-vv-as` を指定します。

```vue:RefactoredForm.vue
      <BTextInputWithValidation
        rules="required"
        data-vv-as="パッスワード"
        name="Password"
        vid="password"
        type="password"
        label="Password"
        v-model="password"
        description="We'll never share your password with anyone else"
        placeholder="Enter password"
      />
```

これでバリデーションの指定などは変更せずエラーメッセージの単語だけ変更することができました。
【UiPath】Webサイトのデータスクレイピング


# ページ切り替えが非同期の場合
次ページへのリンクを押し、次ページへ切り替わったかどうかはWebページの移動が行われたかで判断しているようなので、非同期通信で一覧の内容だけが変わるような作りになっていると、2ページ目以降のデータが取得できない。

例：楽天証券のスーパースクリーナーの表など
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/36de0f49-67f9-73bc-5b94-a7ea11649213.png)

この場合、「次へ」を押して2ページ目以降もスクレイピングする処理は自分で書かなくてはいけない。
実際のフローは以下のような感じ。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/3fa48bf4-9458-b4fc-ba5c-bcfd40f183a3.png)

# ヘッダー行の認識
どうやら`<th>`タグで無いと、ヘッダー行として認識してくれないらしい。
再びの楽天証券のスーパースクリーナーの場合、ヘッダーに見える部分は`<td>`タグで作られているため、どうしても1行目をヘッダーとしてくれない。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/093b81b1-88ba-2ae3-2792-88182610ecdf.png)

## DataTableの1行目を列名へ置き換える
1行目を列名として認識してくれない場合、コードを駆使して1行目を列名にすると良いかも知れない。
アクティビティを駆使しても良いが、効率が悪いので`コードを呼び出し`アクティビティにコードを書いてしまう方が良い。
以下、サンプル。

引数：

|名前|IN/OUT|型|
|---|---|---|
|in_dt|IN|DataTable|
|out_dt|OUT|DataTable|

```vb:コード
If in_dt.Rows.Count = 0 Then
	Exit Sub
End If

Dim firstRow As DataRow = in_dt.Rows(0)

For colIdx As Integer = 0 To in_dt.Columns.Count - 1
	If IsDBNull(firstrow(colidx)) Then
		Continue For
	End If
	Dim columnName As String = CStr(firstRow(colIdx))
	
	If String.IsNullOrWhiteSpace(columnName) Then
		Continue For
	End If
	
	in_dt.Columns(colidx).ColumnName = columnName
Next

in_dt.Rows.Remove(firstRow)
out_dt = in_dt
```
Numpyでimportエラーを解決した(備忘録的なやつ)

環境
Windows10 May2019update
anaconda 4.75
python 3.6.8


Numpyを使用しようとしてimportをかけたときに以下のエラーに悩まされた
>  Something is wrong with the numpy installation. While importing we detected an older version of numpy in [numpyのpath]. One method of fixing this is to repeatedly uninstall numpy until none is found, then reinstall this version.

翻訳すると、Numpyのバージョン違いのものが複数あるので削除して整理することと書いてあります
そのため、conda uninstall numpyをしてimport numpyをしたのですが同じエラー....

よく見るとNumpyのpathがあるではないかと気づき、そこにアクセスするとNumpyが3つあった(恐怖)
そこですべてを削除して、conda install -c conda-forge numpy　を導入すると....
解決した!!!!

そしてOpenCVも無事インストールできた....
agora.ioがMicrosoft Edgeに対応

#MicrosoftEdgeの対応
2019/6/21にagora WebSDK ver2.7.0がリリースされました。
目玉の機能としてはMicrosoft Edgeの対応になります。

https://docs.agora.io/en/Interactive%20Broadcast/release_web_video?platform=Web
![aa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/a0718373-6423-c1c7-033a-13ea1bc37427.jpeg)
（割と控えめに記載されてますね）


基本的にEdgeに特化した実装をしなくてもSDKを利用すればEdgeでもWebRTCでビデオ通話が可能です。
又、NativeSDK（iOA/Androidアプリ）との相互通話も可能です。

#その他の機能追加
■映像エンコード設定のカスタマイズ機能
画角(解像度)、フレームレート、ビットレートの値を任意に指定できます。

■ストリーム再生ステータス検知機能
以下の検知機能を追加しました。
・ストリーム再生の実行結果
・ストリーム再生ステータスの変更と変更理由
・Stream.playメソッドのコール失敗時に再度ストリームを再生するためのAPI追加

■リモート音声映像フレームのデコード検知機能
・リモートの最初の音声映像フレームをデコードしたことを検知します。

■音声映像デバイスの変更検知機能
・音声映像デバイスがデバイスの取り外しや無効化により、データ取得を停止したことを検知します。



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=52a9f098f081f433bf9a)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=52a9f098f081f433bf9a)
scikit-learnバージョンアップ時の移行メモ(cross_validation)


#はじめに
scikit-learnを0.19.2から0.21にバージョンアップしたところ以下のエラーがでて動かなかったため簡易に対応した時のメモ

```
from sklearn import svm, tree, cross_validation
ImportError: cannot import name 'cross_validation' from 'sklearn' 
```

#対応方法
動かなくなっていたのは、以下のようにcross_valdiationモジュールの関数を呼び出していたところ。
このモジュールに含まれていたcross_val_predict関数は、sklearn.model_selectionモジュールに移動になっているとのこと。

```python
cross_validation.cross_val_predict(pls_result, x, y, cv=fn)
```

そこで以下のように既存のcross_validationモジュールの読み込みをコメントオフにし、
sklearn.model_selectionモジュールを "cross_validation"として別名で読み込んであればよい。

```python
#from sklearn import cross_validation
import sklearn.model_selection as cross_validation
```

わずか1行で移行完了！
rails リンクの設定

#①link_toについて

```
link_to 文字、 リンク先
```

modelのインスタンスをリンク先に指定した場合、自動的にshowアクションのリンクに飛ばされる

#②renderとredirect_toの違い

```
render :show
```
showのviewページのみ表示し、showのアクションは実行しない。

```
redirect_to modelのインスタンス
```
showのアクションを実行し、さらにviewページを呼び出す。
今日学んだ事

#7/2(火)

###●LIKE句
・曖昧な文字列を検索できる
・whereメソッドと一緒に使う

曖昧文字列
% ⇨ 任意の文字列(空白文字列を含む)
_ ⇨ 任意の文字列

例

```controller.rb
where('title LIKE(?)',"%C%")
#cが含まれるタイトル
```

###●resources

 アクション 

index  （一覧）
new    （1つ作成するためのHTMLフォームを返す）
create （1つ作成）
show   （特定の●●●を表示）
edit   （編集用のHTMLフォームを1つ返す）
update （更新）
destroy（削除）

idを持たないアクション
index.new.create

idをもつアクション
edit.show.update.destroy

###●reviewモデルの作成、必要なカラムの追加
1.モデルの作成

```ターミナル.
$ rails g model review
#reviewモデルの作成
```
2.作成されたマイグレーションファイルの作成

```create_reviews.rb
class CreateReviews < ActiveRecord::Migration[5.2]
  def change
    create_table :reviews do |t|
      t. 型　:カラム名

      t.timestamps
    end
  end
end
```

3.マイグレーションの実行

```ターミナル.
$ rake db:migrate
```
以上
【VR】HMDスペックまとめ(視覚関連)

簡易ですが、日本でよく見かけるHMDの視覚関連スペックまとめました。
間違い等あれば編集リクエストください。

~~表が見づらいので、直し方がわかり次第直します。~~
分割に直しました。

|     |Oculus Go|Oculus Quest|Oculus Rift|Oculus Rift S|MirageSolo|
|:---|---|---|---|---|---|
|チップ性能 |Snapdragon 821|Snapdragon 835|PCVR|PCVR|Snapdragon 835|
|ディスプレイ|液晶|有機EL|有機EL|液晶|液晶|      
|解像度(片目)|1280 × 1440|1440 × 1660|1080 × 1200|1280 × 1440|1280 × 1440|
|視野角|110度|100度|110度|110度|110度|
|RR|72Hz|72Hz|90Hz|80Hz|75Hz|
|IPD調整|×|〇|〇|〇|×|

|     |VIVE|VIVE PRO|VIVE PRO EYE|VIVE FOCUS|VIVE FOCUS PLUS|
|:---|---|---|---|---|---|
|チップ性能 |PCVR|PCVR|PCVR|Snapdragon 835|Snapdragon 835|
|ディスプレイ|有機EL|有機EL|有機EL|有機EL|有機EL|       
|解像度(片目)|1080 × 1200|1440 × 1600|1440 × 1600|1440 × 1600|1440 × 1600|
|視野角|110度|110度|110度|110度 |110度|
|RR|90Hz|90Hz|90Hz|75Hz|75Hz|
|IPD調整|〇|〇|〇|〇|〇|

|     |VIVE Cosmos|
|:---|---|
|チップ性能 |PCVR|
|ディスプレイ|液晶|
|解像度(片目)|1440×1700|
|視野角|110度|
|RR|90Hz|
|IPD調整|〇|

RR=リフレッシュレート
IPD=Interpupillary distance(瞳孔間距離)


2019/10/10　VIVE Cosmos追記

##フレームレートとリフレッシュレート

引用元：[VRInside](https://vrinside.jp/news/vr-terminologie/)

###フレームレート
>フレームレートというのは、わかりやすく言えば、動画やゲームを動かす際のコマ数です。動画やゲームの動きというのは複数枚の画像の連続で動きを表現します。

>パラパラ漫画に例えるとわかりやすいと思います。コマ数が多ければ多いほど、動きはなめらかになり、現実に近い動きになるというわけです。

>フレームレートを示す数字は60fps（frames per second）や120fpsと表記し、一秒間に何枚の画像が表示されるかを示します。つまり、60fpsであれば一秒間の間に60コマで区切られ、120であれば一秒間を120分割して画像表示されるというわけです。

>フレームレートの違いがよくわからない！という人はこのような30fpsと60fpsの比較動画などもありますのでぜひご覧になってみてください。フレームレートが多いモノのほうが動きがなめらかで「ヌルヌル」そして少ない方が動きが飛ばし飛ばしになっていて「カクカク」だということが感覚的にわかってもらえると思います。

###リフレッシュレート

>リフレッシュレートというのは基本的にはフレームレートと同じ意味合いで使われ、一秒間に何枚の画像が表示できるかを意味します。

>リフレッシュレートとフレームレートの大きな違いは使われる「場所」です。フレームレートではPCゲームやVRゲームなどのソフトウェアとPC本体の出力に対し、リフレッシュレートというのはPCモニターやHMDなどの出力される側のディスプレイのスペックを表すときに使用されます。単位もfpsではなくhz（ヘルツ）を使います。

>わかりやすく例えると、PCがたとえ優秀で高解像度のデータを高いフレームレート、例えば100fps以上の数値を出せるとしても、HMDやPCモニターが60hzのリフレッシュレートだとすると、送り込まれるデータは一秒間に100枚以上でも実際に表示される画面は60枚以下ということになります。

>ちなみに通常事務で使われるPC用モニターが平均30～60hzで、ゲーマー向けの非常に高価なゲーミングモニターが100～200hz前後、HTC VIVEとOculus Riftのリフレッシュレートはそれぞれ酔いにくいといわれている90hzで、GearVRが75hz、PSVRがなんと！120hzだといわれています。
Swift：左右反転した画像，白黒画像，ネガポジ反転画像を生成する

`NSImage`にはサイズとピクセルサイズの概念がある（これはRetinaディスプレイ5Kディスプレイへの対応のため）が，`NSImage`に対してそのままアフィン変換を適用したら，画像のピクセルサイズがおかしくなってしまった．これを避ける方法を色々試した結果，一旦`CIFilter`を咬ませる方法が良さそうだとわかった．

```swift:フィルタのソース
extension NSImage {
    public var ciImage: CIImage? {
        guard let imageData = self.tiffRepresentation else { return nil }
        return CIImage(data: imageData)
    }

    public var flipped: NSImage {
        guard let flipFilter = CIFilter(name: "CIAffineTransform") else { return self }
        flipFilter.setValue(self.ciImage, forKey: kCIInputImageKey)
        flipFilter.setValue(CGAffineTransform(a: -1, b: 0, c: 0, d: 1, tx: self.size.width, ty: 0), forKey: kCIInputTransformKey)
        guard let output = flipFilter.outputImage else { return self }
        let rep = NSCIImageRep(ciImage: output)
        let nsImage = NSImage(size: rep.size)
        nsImage.addRepresentation(rep)
        return nsImage
    }

    public var mono: NSImage {
        guard let monoFilter = CIFilter(name: "CIPhotoEffectMono") else { return self }
        monoFilter.setValue(self.ciImage, forKey: kCIInputImageKey)
        guard let output = monoFilter.outputImage else { return self }
        let rep = NSCIImageRep(ciImage: output)
        let nsImage = NSImage(size: rep.size)
        nsImage.addRepresentation(rep)
        return nsImage
    }
    
    public var inverted: NSImage {
        guard let invertFilter = CIFilter(name: "CIColorInvert") else { return self }
        invertFilter.setValue(self.ciImage, forKey: kCIInputImageKey)
        guard let output = invertFilter.outputImage else { return self }
        let rep = NSCIImageRep(ciImage: output)
        let nsImage = NSImage(size: rep.size)
        nsImage.addRepresentation(rep)
        return nsImage
    }
}
```

```swift:使用例
let original = NSImage(imageLiteralResourceName: "Sample")

let flippedImage = original.flipped
let monoImage = original.mono
let invertedImage = original.inverted
```
重複部分がでてきたとき、汎化と委譲どちらの方が良いか

オブジェクト指向で実装中、重複した関数がでてきた場合
どのようにまとめたらよいか迷うとと思います。
方法としては、共通部分を親としてクラスをつくる「汎化」と
共通部分を外部クラスに切り出してそれを参照する「委譲」があります。

###汎化

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/5de72671-19bd-116a-84d9-6de9fe37be4c.png)


###委譲
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/0e25c797-4640-eb42-10ef-2125d3d20abe.png)

一般的には、**委譲** の方が良いとされています。
理由としては、**継承**の関係では、親子でないと再利用できないが、**委譲**であれば、他クラスからでも再利用可能です。
継承・汎化の関係では、スーパークラスを変更すると、子供にも影響を与え、影響範囲が多くなるとされています。
またスーパークラスとサブクラスの結合度は委譲よりも強くやはり委譲の方が独立性を保てます。
AngularのCustomElementで困ってしまった問題点


<h2>CustomElement</h2>
Angular7からWebComponentとAngularのコンポートネントを1対1に対応させる
機能が登場したのですが、厳密には1対1ではなく色々不具合が出ました。

###custom elementの例。AceHighlightComponentをCustomElement化。

<code>createCustomElement(引数：AngularComponent, {injector})</code>でWebComponentのCustomElementにできます。

```typescript:app.component.ts

export class AppComponent implements OnInit {

    constructor(
        private injector: Injector,
    ) {        
        const aceHighLight = createCustomElement(AceHighlightComponent, {injector});
        if (document.createElement('app-ace-highlight').constructor === HTMLElement) {
            customElements.define('app-ace-highlight', aceHighLight);
        }
    }


    ngOnInit(): void {
    }
}

```


```typescript:app.moudule.ts
@NgModule({
    declarations: [
        AppComponent,
    ],    
    bootstrap: [
        AppComponent
    ],
    entryComponents: [
        AceHighlightComponent,
    ],
    schemas: [
        CUSTOM_ELEMENTS_SCHEMA
    ]
})
export class AppModule {
}


```


##CustomElement化した場合の問題点
###1.プロパティーバインディングが機能しなくなる。

```html
<app-ace-hgithlight attr='value'></app-ace-highlight>
```

はアトリビュートに値を設定するのでOK

```html
<app-ace-hgithlight [attr]=''value''></app-ace-highlight>
```

は、Angularのプロパティーバインディングを使っているので利用不可。


###2.イベントがCustomElement型になる
Angularのコンポーネントでは、以下の<code>Output</code>では文字列が返されるが、
CustomElement化した場合にはeventが<code>CustomElement</code>型に変換される。

```typescript:ace-highlight.component.ts

export class AceHighlightComponent implements OnInit {

    @Input() value: string;
    @Output() changeEvent = new EventEmitter<string>()

    constructor() {
    }
    onChange() {
       this.changeEvent.emit('文字列')
    }

}

```


```html
##通常
<app-ace-highlight (changeEvent)="change($event)" ></app-ace-highlight>
=> $event は '文字列'
##CustomElementの場合
<app-ace-highlight (changeEvent)="change($event)" ></app-ace-highlight>
=> $event は 'CustomElement {detail: '文字列', ....}'
```


##困る点
型が変化するので、型のエラーメッセージなどが出てしまいます。

また、CustomElementとAngularElementは完全に1対1で対応する訳ではないのでCustomElement化したコンポーネントは通常のAngularComponentとして同時に利用することは避けなければいけません。

必ずcustome elementとしては別名で登録し、AngularのComponentとバッティングしないようにする必要があります。
Python3で再帰を使ったダイクストラ法

# コード
```python3:dijkstra.py
def Dijkstra(u, w):
    Q = [i for i in range(n)]
    if len(Q) != 0:
        Q.remove(u)
        for next in G[u]:
            v = next[0]
            u_to_v = next[1]
            if distance[v] > u_to_v + w:
                distance[v] = u_to_v + w
            Dijkstra(v, u_to_v + w)


n = int(input())
G = []
for i in range(n):
    G.append([])
    b = list(map(int, input().split()))
    for j in range(0, len(b) - 1, 2):
        G[i].append([b[j], b[j + 1]])

inf = 9999
distance = [inf] * n
start = 0
distance[start] = 0
Dijkstra(start, 0)
for i in distance:
    print(i)

```


#### 変数の説明
- n
ノードの数

- G
有向グラフ

- distance
startと各ノードとの距離

- Q
ノードの集合（ノードを通ったか判定用)


# 入出力

### 入力
```terminal
ノードの数(n)
ノード0から進めるノードx ノード0とノードxとの距離 ・・・
ノード1から進めるノードx ノード1とノードxとの距離 ・・・
ノード2から進めるノードx ノード2とノードxとの距離 ・・・
・
・
・
ノードnから進めるノードx ノードnとノードxとの距離 ・・・
```

### 出力
```terminal
startノードとノード0との最短距離
startノードとノード1との最短距離
startノードとノード2との最短距離
・
・
・
startノードとノードnとの最短距離
```

# 例
### 入力 
```terminal
8
1 5 4 9 7 8
3 15 2 12 7 4
3 3 6 11
6 9
5 4 7 5 6 20
2 1 6 13

2 7 5 6
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267721/daff4f35-08f0-79ac-81da-ac0d28db46f3.png)

## 出力
```terminal
0
5
14
17
9
13
25
8
```
<img width="597" alt="スクリーンショット 2019-07-02 19.19.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267721/8e3ab8c0-fe9d-7953-c6c4-3bc47f2390ea.png">
CSSが効かないのはchromeが勝手にcssを作っている！？

cssが効かなくて悩んでいたのですが、どーもこれらしいです。
http://kazukichi.hatenadiary.com/entry/2016/05/27/012546
なんかchromeが勝手にcssを作っているみたいで、優先度的にそれに負けて反映されているみたいです。
cluster on AWS Lambda

# Lambda の中で cluster を使ってみる

## Lambda は CPU 何個？
CPU = 2個

## メモリを増やすと性能が上がるけど？
CPU = 2個

## やってみる！
node-fetch を非同期で 10個まわす
それをさらに cluster で worker を 2つ立てる

```JavaScript
const os = require('os');
const cluster = require('cluster');
const fetch = require('node-fetch');
const uuidv4 = require('uuidv4');

const logger = console;
const list = {
  a: [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }],
  b: [{ id: 11 }, { id: 12 }, { id: 13 }, { id: 14 }, { id: 15 }],
};
const run = {
  url: 'https://xxx.execute-api.ap-northeast-1.amazonaws.com/sample/resource',
  generateOptions(data) {
    data.subscribeId = uuidv4();
    data.eventTimestampUtc = new Date().toISOString();
    return {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data),
    };
  },
  post(data) {
    return fetch(run.url, run.generateOptions(data))
    .then(res => res.text())
    .then(logger.log);
  },
  all() {
    const promise = [];
    for (const key of Object.keys(list)) {
      for (const event of list[key]) {
        promise.push(run.post(event));
      }
    }
    return Promise.all(promise);
  },
  clustering(disconnect) {
    const numCPUs = os.cpus().length;
    const exit = (code, signal) => {
      if (signal) {
        logger.log(`worker was killed by signal: ${signal}`);
      } else if (code !== 0) {
        logger.log(`worker exited with error code: ${code}`);
      } else {
        logger.log('worker success.');
      }
      const keys = Object.keys(cluster.workers);
      if (keys.length === 0) {
        disconnect();
      }
    };
    for (let i = numCPUs; i; i--) {
      cluster.fork().on('exit', exit);
    }
  },
  worker() {
    logger.info(`${cluster.worker.id} cluster start.`);
    return run.all()
    .then(() => {
      logger.info(`${cluster.worker.id} cluster finish.`);
      cluster.worker.kill();
    });
  },
  master() {
    const promise = {};
    promise.instance = new Promise((...argv) => {
      [promise.resolve, promise.reject] = argv
    });
    const disconnect = () => {
      cluster.disconnect();
      promise.resolve({
        statusCode: 200,
        body: 'succeeded',
      });
    };
    run.clustering(disconnect);
    return promise.instance;
  },
  start() {
    return cluster.isMaster ? run.master() : run.worker();
  },
};
exports.handler = async () => run.start();
```

## 動いたけど
これって意味があるのかは謎です。見識があれば教えてください。

以上
WordPress/sango 1.8.2でヘッダーアイキャッチ内にいろんな物を置く方法（途中）

##業務目標
<img width="1148" alt="スクリーンショット 2019-07-02 17.23.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319381/e41bdbc9-e53e-d4c9-6ca7-e8fa26d02396.png">

↑こういうのを実現したい。
###環境
- [ ] WordPress 4.7.13 / AWS
- [ ] Sangoテーマ 1.8.2
- [ ] FTPの権限なし
- [ ] MySQLの権限なし
- [ ] SSHの権限なし

###制約
テーマのアップデート時にリバートされるので、html/phpには手をつけられない。
子テーマのstyle.cssを編集することしかできない。

##作戦
###疑似要素(::before, ::after）をつかおう。
####まずは理解する
何も理解していないので、[基礎的な学習](https://coliss.com/articles/build-websites/operation/css/css-tutorial-pseudo-element-before-after-by-hongkiat.html)から手をつける。

```気がついたところ
（ⅰ）ブロック要素にする
    /** define it as a block element **/
    display: block;
(ⅱ)内容は
content: 
に入るものしか定義できない（例えば<script>をねじ込んでしまうようなのは無理ではなかろーか）
```

例えば、引用した現代ビジネス社のものを単純になぞるなら、

- "HEADLINE"などの画像
- h1 / h2の見出し
- <b>なキャプション
- 著者の顔写真
- <p>な著者名

が入っていればいいことになる。
つまり、content: に(ⅰ)[画像以外も入る](https://qiita.com/hiranai/items/c5099eeb6b0f3f1be10d)こと、(ⅱ)[改行できる](https://macoblog.com/before_after_content_br/)ことが条件となるが、一応できそうであった。
（これらがくっつくか否かは別問題）

###階層化
コンテンツを前後にくっつけることが可能になったとしても、
htmlを弄っているわけではないので、親要素内に入れ子にできるわけではない。何より、全部インライン要素じゃないか。
かくなる上は、カバー画像をz-indexで後背に沈めるか？それでメニューバーに対する::before指定をすればうまくいくかもしれない。かもしれない。。

####z-index
**原則：数字が大きい方が上**
カバー画像の後ろに::beforeで同じサイズの、background-color: black;なレイヤーを作る。

##実践
```style.css
#header-image::before{
	z-index: 10;
	background-color: #000000;
	opacity: 0.6;
	position: absolute;
	content:' ';
	
	/*以下は #header-image textから流用*/
	max-width: 1080px;
    margin: 0 auto;
    padding: 13% 20px 15%;
    color: #fff;
    text-align: center;
    line-height: 1.5;
}
```

⇒一応動作した。次いで、中身のコンテンツを入れることを考えるが、
sangoテーマの見出し／説明文を使った方がよさそう。ただし初期状態ではセンタリングされててひどい状態なので、こちらも別途レイアウトする。

```style.css
```
GKEでgRPCを使うチュートリアルでconnection refused エラー

GKEでgRPCを使うチュートリアルを進めていたら、GKEにデプロイする部分で変にハマってしまったのでメモ。

チュートリアルはこちら。

Getting started with gRPC on GKE
https://cloud.google.com/endpoints/docs/grpc/get-started-kubernetes-engine

Google Cloud Endpoints Sample for Go using gRPC
https://github.com/GoogleCloudPlatform/golang-samples/tree/master/endpoints/getting-started-grpc

デプロイコマンドはこちら。

```shell
kubectl apply -f deployment.yaml
```

エラー内容は以下

```golang
unable to recognize "deployment.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
```

わかる人は見た瞬間に分かるかもっていうエラーです。

「deployment.yamlが認識できません」的な表現ばかりに気を取られて最後の「接続が拒否されました」あたりをあまりよく読んでなかったせいで、yamlを見直したりして少し悩みました。

> localhost:8080にうんたら部分がよく分からんかったというのもある。

結局、このチュートリアル前に一回GKEのクラスタを作り直したせいで一回通したはずの認証情報が入ってなかったというオチでした。要するに認証エラーで接続拒否されてただけ。

```shell
gcloud container clusters get-credentials [CLUSTER_NAME] --zone [ZONE_NAME]
```

ということで上記のコマンドで解決。
AWS上で利用する「グループ」まとめ

AWSで利用している上で「グループ」と名の付くものがいっぱいでてきたのでまとめてみました。

#一覧表
| 名称 |サービス| 役割 |備考|
|------|------|------|------|
| (IAM)グループ| IAM | 名前の通りIAMをグループ管理する |一部IAM表記ない|
| セキュリティグループ| EC2 | ポートやIPの通信許可設定 | |
| ターゲットグループ | EC2 | ALBと紐付けるIP、インスタンスなどの設定 |
| AutoScalingグループ | EC2 | 名前の通りry | |
| (DB)サブネットグループ　| RDS |RDSとサブネットに割り当て設定| VPCサービスからは遷移できない|
| (DB)パラメータグループ| RDS |DBエンジンの設定| 一部DB表記なし | 
| オプショングループ| RDS |管理を用意にしたり、DBセキュリティ強化で利用する|| 
| (ElastiCache)サブネットグループ | ElastiCache | RDSとは別物 | 一部ElastiCache表記なし |
| (ElastiCache)パラメータグループ| ElastiCache | RDSとは別物 | 一部ElastiCache表記なし|
WindowsにLaravel環境の構築

# 概要
PhpStormでLaravelで何かを作る時の初期設定です。

# Laravelプロジェクトを作成
`laravel new` とかで作成

# Laravelプラグイン
https://plugins.jetbrains.com/plugin/7532-laravel
インストールしておく

# IDE Helper
https://github.com/barryvdh/laravel-ide-helper

## インストール
```bash
composer require --dev barryvdh/laravel-ide-helper
```

## プロバイダー追加
config/app.php の providersに、`Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,`を追加

## ide-helper作成
```bash
php artisan ide-helper:generate
```

## composerのupdateの後にide-helperを実行
composer.jsonのscriptsに以下を追加

```json
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan ide-helper:generate",
            "php artisan ide-helper:meta"
        ]
```

## doctrine/dbalをインストール
```bash
composer require --dev doctrine/dbal
```

## モデルクラスを作成
```bash
php artisan ide-helper:models
```

## メタファイルを作成
```bash
php artisan ide-helper:meta
```
Netlify CMSのインストール

ルート配下に `admin`　ファイルを作成しその中に `index.html`と`config.yml`を作成するだけでインストールすることができる。

```index.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Content Manager</title>
    <style type="text/css">
        .SplitPane.css-gwx01d-StyledSplitPane-dropMain-card-splitPane.e1pxf6c40.vertical  {
            display: flex;
            flex-direction: column !important;
            overflow: auto !important;
        }
        .Pane.vertical.Pane1{
            width: 100% !important;
        }
    </style>
</head>
<body>
<!-- Include the script that builds the page and powers Netlify CMS -->
<script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
<script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
<script>
    if (window.netlifyIdentity) {
        window.netlifyIdentity.on("init", user => {
            if (!user) {
                window.netlifyIdentity.on("login", () => {
                    document.location.href = "/admin/";
                });
            }
        });
    }
</script>
</body>
</html>
```
```config.yml
backend:
  name: git-gateway
  repo: [git-repo]   #githubのリポジトリ
  branch: [ブランチ]  # Branch to update (optional; defaults to master)

publish_mode: editorial_workflow

media_folder: "static/images/uploads" #アップロードされたファイルを保存するフォルダパス
public_folder: "/images/uploads" #アップロードされたファイルがアクセスされるフォルダパス
collections:
  - name: "post"
    label: "Post"
    folder: "content/post"
    create: true
    slug: "{{slug}}"
    fields: # 管理画面に追加したいフォームを追加していく
      - {label: "Title", name: "title", widget: "string"}
      - {label: "Description", name: "description", widget: "text", required: false}
      - {label: "Featured Image", name: "featuredImage", widget: "image", required: false}
      - {label: "Featured Image Description", name: "featuredImageDescription", widget: "text", required: false}
      - {label: "Publish Date", name: "date", widget: "datetime"}
      - {label: "Category", name: "categories", widget: "text", required: false}
      - {label: "Tag", name: "tag", widget: "text", required: false}
      - {label: "Body", name: "body", widget: "markdown"}
```
Kubernetesの用語カンペ

## Kuernetesとは

コンテナ化されたアプリケーションの展開/スケーリング/管理を自動化するためのオープンソース

Goggleが開発を進めている

kubernetesが自動スケールや死活監視も行う

## メリット

* 複数のDockerホストの管理
* コンテナのスケジューリング
* ローリングアップデート
* スケーリング / オートスケーリング
* コンテナの死活監視
* 障害時のセルフヒーリング
* サービスディスカバリ
* ロードバランシング
* データの管理
* ワークロードの管理
* ログの管理
* Infrastructure as Code
* その他エコシステムとの連携や拡張

## アーキテクチャ

#### 概要

- Master (親機)
  - Kube apiserver
  - etcd
  - Kube Scheduler
  - Kube controller maneger
- Node
  - Pod

#### Cluster

リソースを管理する集合体
1つのMasterとNodeで構成される最大の構成単位

#### Podとは

Kubernetesの最も小さい基本的な構成単位
1つ以上のコンテナから構成されている
pod内のコンテナは同一のクラスタ内の同一マシンに配置される
ネットワーク空間は共有される

* ReplicaSet

Podを複数生成する仕組み

* Service

Podへアクセスするための経路を定義する
Serviceにはいくつが種類がある

(ClusterIP, NodePort, LoadBalancer, ExternalName, Headless)

* Deployment

ReplicaSetの上位リソースでReplicaSetを管理する
ReplicaSetがPodを管理・操作するのと同様に、ReplicaSetはDeploymentに管理・操作されます。

* 主従関係

Deployment => ReplicaSe => Pod

#### Controllerとは

レプリケーションとロールアウトを処理し、クラスタスコープで自己修復機能を提供する

#### Ingressとは

Podへのアクセスをhttpプロキシする。
Serviceに紐付き、通信内容をServiceにプロキシする。

#### Volumeとは

データの格納領域を指す。外部ストレージをVolumeとしてコンテナにマウントできる。
Nodeに領域を確保する場合はemptyDir Volumeを使う。
Podのコンテナは同じNode上に展開される。Volumeに書いたデータはPod間で共有できる。
ただし、Podを削除するとemptyDirは削除される。
これを回避するためにNFSやcloud storage(PersistentVolume)を使うことも可能。
[Uipath]Retry Scopeの（自分なりの）実装方法

### remark
[自身のblog](https://rpa.adgj.pw/items/uipath-retry-scope%E3%81%AE-%E8%87%AA%E5%88%86%E3%81%AA%E3%82%8A%E3%81%AE-%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95)にも同じ内容をポストしています。

---
## アクティビティの意味
- 下記のいずれかを満たす間、内部に含めたアクティビティ群を所定の回数実行する
  - a) `Condition`に設定したアクティビティが`False`である
  - b) 内部に含めたアクティビティ群が例外をスローする

## ポイント
b)のほうが事例としては多いかもしれない。ただこれには罠があって、**スローされた例外に対する処理が**（このままでは）**記述できない**。したがって自ら設定した回数の例外が発生するまでは、その例外が何であるかはおろか、そもそも**例外が発生したのかを（ログとして）把握できない**のである。地味だけど、ビジネスユースとしてはちょっと厳しい。

## じゃあどうやって実装するのか
二重`Try-Catch`構造で行きます。重ね方は下記の通り

- `Try-Catch` (リトライ全体も失敗したときの処理）
  - `Retry Scope` (リトライ自体の処理)
    - `Try-Catch` (実行/リトライ1回が失敗したときの処理)

UiPathだと正直可読性がガクンと落ちるんだけど、こうせざるを得ない。

2回目の`Try-Catch`では、キャッチ処理に対して**必ず`Rethrow`を入れて上げる必要がある**。入れないとどうなるかというと、`Retry Scope`が例外を直接キャッチしないので、**`Retry Scope`的には成功とみなされ、リトライが実行されなくなる**。

1回目の`Try-Catch`は、`Retry Scope`が所定の回数リトライをしても例外をキャッチしてしまう（＝リトライが所定の回数以上失敗している）場合の処理を行う。

## デモ
暇ができたら作ります。
シェバンにはオプションを設定せずsetを使う方が良さそう

githubに置いてあるスクリプトをcloneせずにcurlで取得するのはインストール手法としてよく見かけます。

```sh:dein.vim
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
# For example, we just use `~/.cache/dein` as installation directory
sh ./installer.sh ~/.cache/dein
```

```bash:rbenv
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
```

rbenvの例のようにパイプで繋げる等して１行で実行まで行えば、実行後のスクリプトの削除なども行わなくていいので便利です。

自分のリポジトリのファイルを使う場合、以前はdein.vimの例のようにダウンロードと実行を分けていたのですが、１行で実行まで行おうとして問題が発生しました。

## シェバンで設定したオプションが効かない
実行するスクリプトファイルのシェバンには-eオプションを設定してありファイルを直接実行する際には問題がありませんでした。

```bash:shebang.sh
#!/bin/bash -e

function error()
{
  return 1
}

error

echo "success"
```
```bash
bash-3.2$ ./shebang.sh 
bash-3.2$ 
```

これをファイルの中身をbash本体に与えて実行するとerrorの箇所をすり抜けてしまいます。

```bash
bash-3.2$ bash <(cat ./shebang.sh)
success
bash-3.2$ bash -c "$(cat ./shebang.sh)"
success
bash-3.2$ bash ./shebang.sh 
success
```

これを-eオプションをシェバンではなく、setで与えるように変更するとerrorの箇所で止まります。

```bash:set.sh
#!/bin/bash
set -e
function error()
{
  return 1
}

error

echo "success"
```

```
bash-3.2$ ./set.sh 
bash-3.2$ bash -c "$(cat ./set.sh)"
bash-3.2$ bash <(cat ./set.sh)
bash-3.2$ bash ./set.sh
bash-3.2$ 
```

## 実行の仕組み
シェバンの解釈はexecveシステムコールによって行われるようです。
スクリプトが実行される際の動作はmanによると以下のようになっています。

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html#lbAE
>インタープリタースクリプト
インタープリタースクリプトとは、実行許可が有効になっていて、 最初の行が以下の形になっているテキストファイルのことである。
 #! interpreter [optional-arg]
interpreter は有効な実行ファイルのパス名でなければならず、 それ自身がスクリプトであってはならない。 execve() の filename 引き数がインタープリタースクリプトを指定している場合、 interpreter は以下の引き数で起動される。

>interpreter [optional-arg] filename arg...

つまり

```bash
./shebang.sh
```
を実行した場合

```bash
/bin/bash -e ./seban.sh
```
に置き換えられます。


```bash
bash <(cat ./shebang.sh)
```
このように実行した場合はexecveによるシェバンの解釈が行われないため、先頭行は単なるコメントとして処理されてしまうわけです。

- ターミナル上でコピペしてみた

```bash:シェバンは単なるコメント扱い
bash-3.2$ #!/bin/bash -e
bash-3.2$ 
bash-3.2$ function error()
> {
>   return 1
> }
bash-3.2$ 
bash-3.2$ error
bash-3.2$ 
bash-3.2$ echo "success"
success
bash-3.2$ 
```

```bash:setはOK
bash-3.2$ #!/bin/bash
bash-3.2$ set -e
bash-3.2$ function error()
> {
>   return 1
> }
bash-3.2$ 
bash-3.2$ error

[プロセスが完了しました]

```


## シェバンの制限
シェバンの引数は環境によっては一つしか設定できません。

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html#lbAK
>インタープリタースクリプトの optional-arg 引き数の解釈方法は実装により異なる。 Linux では、インタープリター名 interpreter に続く文字列全体がインタープリターに 1個の引き数として渡される。 しかし、動作が異なるシステムもある。 あるシステムでは、 optional-arg のうち最初のホワイトスペースまでが 引き数として渡される。 また、別のシステムでは インタープリタースクリプトは複数の引き数を持つことができ、 optional-arg 内のホワイトスペースが引き数の区切りとなる。

そのような環境では-と+やロングオプションを同時に設定したい場合などには結局setを使うことになるので、それならばシェバンの引数は指定せず、常にsetを使用するようにしておけばファイルを実行する場合もシェルに読ませる場合も問題がなくなります。
Unity　Secondary MapsにNomal mapが何故か適用されないとき

Main mapsのNomal mapと、Secondary MapsのAlbedoはいけてたので、
なんでSecondary MapsのNomal mapだけ反映されないんだろう、ってしばらく悩んでました。（エラーもでない）



ビルドするプラットフォームをAndroidにしてたらこの問題に直面
⇓
スマホ向けビルドにしてるから、
グラフィック周りの設定が自動的に低品質に変えられてる気がした
⇓
プラットフォームをWindowsにしてみる
⇓
ノーマルマップもどった！

##最終的な解決方法
Project Settings > Graphics　で
Low,Mediam High それぞれの　**Use Defaults**のチェックを外し、
**Detail Normal Map**　に３つともチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/87a02301-c7d4-dc2b-057f-3722ff891a84.png)
クリーンアーキテクチャを読んだ所感

#はじめに
クリーンアーキテクチャ 達人に学ぶソフトウェアの構造と設計
難易度★★☆
優先度★★☆

読む価値のある本だったと思います。
アーキテクチャ（設計）という言葉の意味に深みができました。
今まで設計とは、上流であるというざっくりとしたイメージしかありませんでした。

内容を知るためには、書籍を読むこと。
[参考](#参考)のリンク先で簡潔にまとめられているので、振り返りによし。

#ソフトウェアのアーキテクチャ（設計）とはなにか
**なるべく長期間、選択肢をより多く残し続けること。**
仕様要求は時間とともに変わっていく。
そのためにはモジュールを変更コスト・リスクが小さくなるように
モジュールを分割をしていかなければならない。

>分野によってはこの志向をアーキテクチャと呼ぶには適しないかもしれないが、
この発想はいろんなところで応用できる気がします。

#アーキテクト（設計士）の仕事は何か
アーキテクトはより有効なアーキテクチャを維持することに責任を持たなければならない。
DBをOracleかMySqlに決定することは、本筋ではない。
あとから使用するDBが変わっても、あるいはCsv読み取りに変わったとしても、
変更コストとリスクが小さくなるような設計が理想。
~~人月商売を売る側にとってはメリットが少ない。~~

>管理を肥大化させない、未来の選択肢を残し続ける。
両方しないといけないのが、アーキテクトのつらいところだな。
覚悟はいいか？俺はできてる。

#モジュール間の依存方向を意識し続けること
より固いもの（変わりにくいもの）が、より依存されるべきである。
一例としては、ViewがModelに依存するべきであって、逆は正しくない。

>以前から似たような設計はできていたが、読んだら明確に判別ができるようになった。
血管の逆流防止弁とか、S字トラップとかのイメージ。

#ファームウェア
ファームウェアはソフトウェアとハードウェアの中間に存在する。
ファームウェアも変わるため、ファームウェアに依存しないソフトウェア設計が理想。

#参考
[達人に学ぶソフトウェアの構造と設計](https://scrapbox.io/tasuwo/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88)

[ソフトウェアアーキテクチャについての個人的なまとめ](https://scrapbox.io/tasuwo/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%80%8B%E4%BA%BA%E7%9A%84%E3%81%AA%E3%81%BE%E3%81%A8%E3%82%81)
深層学習（前編 2）：「Section5 : 最新のCNN」

AlexNetとは2012年に開かれた画像認識コンペティションにて2位に大差をつけて優勝したCNNモデルである。モデルの構造として、5層の畳み込み層及びプーリング層と、それに続く3層の全結合層から構成されている。活性化関数は非線形のReLUを使用し、最後の全結合層の出力は、1,000クラスのラベルにわたって分布を生成する1,000方向のソフトマックス関数を使用している。。過学習に対する対応として、最初の二つの全結合層にドロップアウトを使用している特徴がある。
UnrealC++のマクロ多重定義の回避方法

#はじめに
現在、卒業研究でKinect V2とUE4を連携させるシステムを作成しています。その過程で発生したビルドエラーの解決方法についての日本語の記事を見かけなかったので、備忘録も兼ねて記事を書いてみます。

#エラーの内容
Kinect V2との連携システムを作るにあたって、KinectのライブラリをUE4のプロジェクトに追加する必要があります。
ライブラリの追加については問題なかったのですが、ビルドする時にエラーが発生しました。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/5d465a08-d1c1-98de-8f21-c90e3313bf29.png)

内容は「TEXT」というマクロが多重定義されているとのこと。
おそらくKinectが使用しているWindowsのライブラリ(winnt.h / winioctl.h)とUE4のエンジンの中で「TEXT」というマクロが定義されているという状態かと思います。

#解決方法
`bEnableUndefinedIdentifierWarnings = false;`

このコードを<プロジェクト名>.Build.csの中に加えるだけです。

----- 追記 -----
上記の方法だと、全体に対して効果がありますが以下の方法を使うと一部のヘッダーのみに作用させることができます。

```C++:別の手法
#include "AllowWindowsPlatformTypes.h"

 //対象のヘッダーまたはそれを含むヘッダーをインクルード

#include "HideWindowsPlatformTypes.h"

```
コメント欄にて strv13570 様に教えていただきました！ありがとうございます!

こちらの方法で解決できない場合は以下の記事の方法をお試しください。
[UE4のTEXTマクロ多重定義回避 @Kanashibari](https://qiita.com/Kanashibari/items/6fac293507354a0717d6)
 
#おわりに
こう書いてみるとたった1行のコードを書くだけですが、ここにたどり着くまで一週間悩んでましたw
英語のフォーラムも見ることの重要性を感じましたが、やはり日本語の検索でヒットした方が便利ですよね！

私自身、UnrealC++を触り始めたばかりなのでこの記事で間違っているところがあれば教えていただけると幸いです。
【日記】pythonでタブ文字を「print」しようとしたけどできなかった

エクセルやスプレッドシートにラクにコピペするため、タブ文字を出力したくなりました。
しかし、コード上でタブ文字を記述しても上手く出力されません。

```tab.py
print('hoge' + '	' + 'foo') #タブ文字
# hoge    foo 自分の環境ではいくつかの半角スペースになった
```

エスケープシーケンスを使っても、printしてしまうと半角スペースになってしまいます。

```tab.py
print('hoge' + '\t' + 'foo') #タブ文字
# hoge    foo
```

たぶんファイル出力とかしたらいい感じになるんだろうな～って思ったんですけど、ファイルには出力したくない。
結局のところ、半角スペースx4固定で出力⇒別途テキストエディタでタブ文字に置換。という手順で我慢しました。
![c94b4e7d54032619c5bd640963d7caa1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/a64a5584-c447-0b49-308c-345a17675532.png)
TypeScript(JavaScript)でArrayの分割をする

```typescript
const array = ['www.apple.com', 'www.apple.com', 'www.apple.com', 'www.apple.com', 'www.apple.com'];
```

みたいなarrayを規定の上限数で分割したい時ってありますよね。

```typescript
chunking = <T>(array: T[], size: number): T[][] => {
  return (array.length <= size) ?
    [array] :
    [array.slice(0, size), ...chunking(array.slice(size), size)];
}
```

![スクリーンショット 2019-07-02 17.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47823/2047e31a-2175-aeb4-626a-94f7b6f86b4c.png)

パフォーマンスが重要ならsliceを使ったやり方の方が良い。

via https://scotch.io/courses/the-ultimate-guide-to-javascript-algorithms/array-chunking
Smart Trade インターン記事まとめ（4/23 - 7/2)

#初めに
Smart Trade社では、インターン生が日々学んだことをQiitaにまとめています。その内容は多岐にわたるため、[インターンまとめ記事](https://qiita.com/KKkbt/items/58e76c6a1465fe1eb14c)に続き、2019/4/23 - 2019/7/2までに書かれた記事をまとめたいと思います。
#記事一覧
###1. 知識
####1.1 投資
・[中国クオンツプラットフォーム調査](https://qiita.com/riyang/items/fca8f7e968f348d4f743)
・[Quantopianで使えるデータまとめ（2019年6月現在）](https://qiita.com/murr83/items/9dca88f444de16ccd017)

####1.2 pyhton
・[Mac OSでTA-Libをpipで入れられなかった時の対処法](https://qiita.com/katakyo/items/f0f51f208f9d3ad0da43)
####1.3 QuantX
・[QuantXでNaNをカウント](https://qiita.com/katakyo/items/129e26b2f43194627f1e)
・[QuantX SDK チョットワカル になりたい](https://qiita.com/17zuma_241/items/1f4488ab6db8b418db28)
####1.4 0.0.5系エンジン
・[QuantX maron0.0.5 に移行する](https://qiita.com/katakyo/items/12b41fec940a3bac1142)
・[QuantXで指値注文](https://qiita.com/katakyo/items/3a18f026a10bdd7e182a)
####1.5 ローソク足
・[Talibで使えるローソク足ドキュメントまとめ](https://qiita.com/Mea/items/52be071da240440eca66)
・[Talibで使えるローソク足に関する関数のまとめ （１）完成版](https://qiita.com/Mea/items/e0f091367e2ce32144c0)
・[Talibで使えるローソク足に関する関数のまとめ （2）完成版](https://qiita.com/Miku_F/items/66f754e8cf285c9e3702)
・[Talibで使えるローソク足についての関数まとめ(3)](https://qiita.com/17zuma_241/items/df71df9a5c5888aceb5d)
・[Talibで使えるローソク足についての関数まとめ(4)](https://qiita.com/17zuma_241/items/0516c254769e97b04b5e)
・[Talibで使えるローソク足についての関数のまとめ（５）](https://qiita.com/merry1221/items/84156872c30d19a51920)
・[Talibで使えるローソク足に関する関数のまとめ （6）完成版](https://qiita.com/k0miya/items/0153d238ed8ec3e710b5)
・[Talibで使えるローソク足に関する関数のまとめ （7）完成版](https://qiita.com/Mea/items/a6c9aee82ffb6feaf3f4)
・[Talibで使えるローソク足に関する関数のまとめ　（番外編）](https://qiita.com/Miku_F/items/7ca38f495f907159dfdf)
####1.6 その他
・[良いグラフを作るために気をつけたい10個のこと](https://qiita.com/murr83/items/7ddf8bdb9e83fae6e5a8)

###2. 様々な指標の実装
・[Pythonで単純な移動平均(SMA, IMA)による株取引を実装してみる](https://qiita.com/huyfififi/items/2370a047492dbf8ddc77)
・[Quantxで二種類のシグナルを操る](https://qiita.com/murr83/items/9b361e8392f00b87f7d9)

###3. ファイナンス
####3.1 「フィナンシャルモデリング」実装
・[『フィナンシャルモデリング』をPythonで実装してみた（１）株価データをインポート](https://qiita.com/murr83/items/bddd49025fd95c07dbbf)
・[『フィナンシャルモデリング』をPythonで実装してみた（２）ポートフォリオ入門]( https://qiita.com/murr83/items/fe093eae5dd3c9d7576f)


####3.2 pythonで金融工学
・[pythonでValue at Risk (VaR) を計算してみた](https://qiita.com/merry1221/items/eb9eb68dae7f5b7d937d)
・[QuantX上でturnoverを算出する](https://qiita.com/merry1221/items/9f0289d97100dce74f9a)
・[ケリー基準をQuantX上で実装](https://qiita.com/merry1221/items/77a260cc1e88deb50f3f)
・[QuantXでBlack-Litterman Modelを実装してみた](https://qiita.com/ropomopo/items/0e250697d91b3b74cbf9)
・[QuantXでBlack-Litterman ModelとBollinger Bandsを組み合わせてみた](https://qiita.com/ropomopo/items/420e14ef2f89a31da695)


###4. 機械学習
・[QuantXで機械学習使って株価予測してみたpart1](https://qiita.com/sarubobo29/items/e8219c2c30d500de2bf9)
・[QuantXで機械学習使って株価予測してみたpart2](https://qiita.com/sarubobo29/items/b94ccb6c1305c157fafb)
Raspberry pi Model 3B+にblenoをインストールしてみる

# 概要
自分が作ったiosアプリケーションからデータをRaspberryPIに送信したかったので、bluetooth通信を実装しようと思いました。raspberry pi model 3B+には、bluetooth用通信モジュールが搭載されていたのもあり、Bluutooth通信を選定しました。今回は、node.jsのbluetooth通信モジュールの1つであるblenoを使用しました。blenoは、raspberry piでbluetooth通信する場合に広く一般的に使われているそうです。以下の手順では、raspberry piにnode.jsをインストールしてから、blenoのサンプルを動かすところまで、示します！

# 実行環境
次に実行環境を示します。

| Soft and Hard       |       バージョン | 
|:-----------------:|:------------------:|
| raspberry pi         |              model 3B + |  
| Raspbian Stretch (raspberry piのOS)         |              2019-04-08 |  
| node.js         |              8.11.1 | 
| npm         |              1.4.21 |

# インストール手順
#####1. パッケージのアップデート 

```bash
pi@raspberrypi:~ $sudo apt-get update && sudo apt-get -y upgrade
```

#####2. Bluetoothモジュールの確認 

```bash
pi@raspberrypi:~ $hciconfig
```

blenoはデフォルトの状態だと、hci0を使用します。なので、blenoで他のbluetoothアダプターを使用する場合には、以下のように明示しておく必要があります。

```bash
pi@raspberrypi:~ $export NOBLE_HCI_DEVICE_ID=1
```

#####3. ライブラリのインストール

```bash
pi@raspberrypi:~ $sudo apt install bluetooth bluez libbluetooth-dev libudev-dev
```

#####4. bluetoothシステムサービスの停止

blenoを動かすためには、bluetoothシステムサービスを停止させる必要があるので、停止させます。

```bash
pi@raspberrypi:~ $sudo service bluetooth stop
```

その後、使用するアダプタを有効にします。

```bash
pi@raspberrypi:~ $sudo hciconfig hci0 up
```

#####5. node.jsとnpmのインストール

```bash
pi@raspberrypi:~ $sudo apt-get install -y nodejs npm
```

#####6. blenoのインストール

```bash
pi@raspberrypi:~ $npm install bleno --save
```
 
以上がインストール手順となります。

# サンプル実行

サンプルは次のURLのapp.jsを実行してみました。raspberry pi側で実行し、android側で同一のUUIDを持つペリフェラルを確認します。

https://www.skyrise.tech/blog/tech/bluetooth-raspberry-pi-bleno-part-1-ibeacon/

実行は次のコマンドで実行します。

```bash
pi@raspberrypi:~ $sudo node app.js
```

実行とUUIDの確認画面を次に示します。確認には、androidの端末を使用しました。使用したandroidアプリケーションはBLE Scannerです。

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169342/0413633c-d335-ba74-3ef6-86fd2a0176b1.png)

上記の図より、raspberry piを認識していることが確認できます。

## まとめ

今回はblenoのインストールおよび確認を行いました。次は、IOSアプリケーションとの実装を行いたいと思います。また、上記の内容で、間違っている点もしくは改善点など有りましたら教えていただけると嬉しいです！
OpenFileDialog でフォルダを指定する [ WinForms ]

# なぜそんなことを
WinForms アプリでフォルダを選択させる際は FolderBrowseDialog を使用するのが一般的だと思いますが、FolderBrowserDialogはいろいろ使いにくい点があります。

- パスをキーボード入力で指定できない
- それ故に選択画面開いてからUNCパスを指定できない
- ~~ツリーのため単純に使いにくい~~

# OpenFileDialogを使ったフォルダ指定方法
```C#:OpenFileDialogでのフォルダ指定例
//using System.IO;

void BrowseFolder()
{
    using (var ofd = new OpenFileDialog() { FileName = "SelectFolder", Filter = "Folder|.", CheckFileExists = false })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            Console.WriteLine(Path.GetDirectoryName(ofd.FileName));
        }
    }
}
```

# 補足説明

- OpenFileDialog の **Filter** プロパティのフィルター文字列に **. を指定する**とファイル表示されずフォルダだけ選べるようになります。
- **FileName** プロパティに適当な文字列を入れておくことで、ファイルを選択していなくてもその名前のファイルが選ばれている状態になります。
- **CheckFileExists** プロパティを **false** にすることでファイルがなくても指定できます。
- **System.IO.Path.GetDirectoryName()** で適当ファイル名部分を消すことでフォルダのパスが得られます。

不都合があることもありますが、実用上これで大体役割を果たします。
クエリ文字列をobjectで返す

aaa.com/?hoge=appare&foo=great
のクエリ文字列を

``` javascript
const fuga = {
  hoge: appare,
  foo: great,
}
```
みたいにしたかったのでその書き方になります。
「[javascriptでクエリ文字列を取得する](https://qiita.com/ma_me/items/03aaebb5dc440b380244)」の書き方を参考にClass化しました。

``` javascript
class GetQueryString {
  constructor() {
    this.queryString = window.location.search;
  }

  setUp() {
    let queryStringObj = {};
    const getQueryString = this.queryString.slice(1).split('&');
    getQueryString.forEach((queryString) => {
      const splitQueryString = queryString.split('=');
      queryStringObj = Object.assign(
        {},
        queryStringObj,
        { [splitQueryString[0]]: splitQueryString[1] },
      );
    });
    return queryStringObj;
  }
}

const getQueryString = new GetQueryString();
if (getQueryString.queryString) {
  getQueryString.setUp(); 
}
```

hitsginさんからのご指摘がありましたワンライナーで書く方法はこちら
こちらのほうがいいですね。

```javascript
[...new URLSearchParams(location.search)].reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {})
```
Arduinoの環境から何から何まで全てを消去したい for macOS

# とにかく全部消したい
```bash
rm -rf /Applications/Arduino.app
rm -rf /Users/${USER}/Documents/Arduino
rm -rf /Users/${USER}/Library/Saved\ Application\ State/cc.arduino.Arduino.savedState
rm /Users/${USER}/Library/Preferences/cc.arduino.Arduino.plist
find /private/var/folders/ -maxdepth 4 -type d 2>/dev/null | grep cc.arduino.Arduin | rm -rf

```
ツナ缶が書くハードウェア（主にCPUとメモリ）についてメモ

サーバー管理者、通称「鯖缶」になりきれない初級者（ツナ缶）が書くCPUとメモリの話です。ちょっとだけ勉強した内容をまとめました。個人メモの領域ですし、Qiitaを続けている人に取ってはおそらくとっくに知っている知識でしょうし、誤りなどあるかもしれませんがお手柔らかにお願いします

### 大前提：ハードウェアの限界を超えて動かすことはできない
いくらコード書くのを頑張ってもハードウェアの限界を超えることは不可能。サーバー開発する側だってハードウェアの限界は知っておいた方が良いと思う。理論値限界は超えられないし、伝送距離やTCPコネクション数なども考慮する必要がある。  
ハードウェアのことを知っていればどうしてAPやDBをこの構成にしたのかも理解できるので、そのあたりを知っておくべき。

---

### メモリ とは
もう書く必要もないしググった方が早そうだけれど復習として。

メモリ＝コンピュータの構成要素の一つで「記憶装置」。データやプログラムの保存・記憶を行う。プロセッサが直接アクセスできる主記憶装置と、それ以外の補助記憶装置に分かれる。主記憶装置には大きく分けて、RAMとROMがある。単純に「メモリ」と呼ぶ場合、多くは「RAM」のことを指す。

- 揮発性メモリ：外部からの給電が途絶えると記憶内容が失われる
    - DRAM
        - 一定時間経つとデータ消失
        - eDRAM（Embedded DRAM）
            - メインのASICやプロセッサと同じダイまたはパッケージに統合された、キャパシタベースのDRAM
    - SRAM（Static RAM / CPU内のキャッシュメモリ）
        - 電源を切らない限り内容を保持
- 不揮発性メモリ：揮発性メモリの対義
  - ROM（基本的に読み出し専用。マスクROM、PROM、EPROM、EEPROMなど）
  - MRAM（Magnetoresistive Random Access Memory）
  - FeRAM（Ferroelectric Random Access Memory）

### ストレージはHDD？SSD？
SSDは高価/高速/堅牢/電力効率が高い。HDDは低価格。こうやって書くと価格以外の点でSSD優位に思えるけれど、ニーズに合わせて使い分けたい。  
参考：https://www.techradar.com/news/ssd-vs-hdd-which-is-best-for-your-needs
##### 価格
SSDは通常、HDDよりも容量あたりのコストが高い。安くて大容量のHDDに重要なデータを保存するなら、信頼性は要チェック。ユーザーレビューなども確認した方が良さそう。
##### 容量
SSDの速度を活かせるOSなどのプログラムを保存に160〜256GBくらいの容量が小さいSSDを利用し、速度がそれほど重要ではないファイルを保存するのにはHDDがおすすめ。とされている。
##### 速度
スピードとパフォーマンスを考慮するならSSD。
##### 消費電力
消費電力はSSD＜HDD。SSDを使用するとラップトップのバッテリ寿命が長くなる（使用するSSDの種類や用途によって異なる）。

---

### CPUのキャッシュメモリについて
プロセッサとメモリの間の性能差を埋めるために、高速なSRAMを利用してキャッシュを格納している。
CPUキャッシュにはCPUにより近いものから順番にL1、L2と数字が上がる。現在CPUによってL2までのものや、L4までのキャッシュを搭載しているものがある。
#### 距離感の例えとして
- L1 : 自分の机
- L2 : 部屋の棚
- L3 : 書庫や資料室
- メモリ : 別の支店

離れれば離れるほど伝送に時間がかかるし、キャッシュは容量が大きいほどデータ転送速度が遅く、記憶密度が高く、省電力と言う性質を持つ。そのため、必要に応じて異なる種類を分けるのが有利、とされている。

#### L1〜L3のキャッシュメモリ容量一例
メモリに比べるとCPUキャッシュメモリは非常に容量が小さい。前述の要素から、L1, L2を大容量化するとアクセスレイテンシーが増えるので、アクセスが高速で小容量のL1と、L1と比較してアクセスが低速で容量が大きいL2の組み合わせが合理的な解だったと考えられている。

| L1 | L2 | L3 |
|:--:|:--:|:--:|
| 32KB | 256KB | 2MB |
| 32KB | 256KB | 8MB |

---

### 測定ベンチマークソフトウェア
メモリ性能の測定を行うソフトウェアについてメモ。

- memtest86+（ http://www.memtest.org/ ）
    - メモリ動作をチェック。無印と+があるが、~~こだわりがなければ+を使うのが良さそう。~~ ほぼ同じだそうなので、更新されている方を使うのが良いと思われます。
- CrystakDiskMark（ https://crystalmark.info/ja/ ）
     - ドライブとして認識されているストレージのデータ転送速度を測定。
SpringBoot+WebSocketで特定のユーザーに情報を送る

# SpringBoot+WebSocketで特定のユーザーに情報を送る
SpringBootでWebSocketを使ってWebRTCのシグナリングサーバーを作ろうとしたらSpringのWebSocketに関する情報が今一つなくて苦労したので備忘も兼ねて。

ちなみに、STOMPの利用が前提。

## やりたかったこと
* WebSocketを使って、特定のユーザーにのみ情報を送る
* ユーザーはSpringSecurityで管理されているものとする
* 基本1対1通信

## SpringBootでWebSocketを使うための準備

### 依存ライブラリの追加
#### EclipseのSTSを利用する場合
利用するものにメッセージング>WebSocketを追加

#### maven

```xml
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>
```

#### gradle

````gradle

compile("org.springframework.boot:spring-boot-starter-websocket")
```

## Configの追加
以下のようなクラスをComponentScanのかかるところに置いておく

``` java
@Configuration
@EnableWebSocketMessageBroker //STOMPを用いたブローカーベースのWebSocketを有効化する　
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer //古い資料だとAbstractWebSocketMessageBrokerConfigurerを使えと書いてあるが、今はこちら。
{
	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		config.enableSimpleBroker("/queue", "/user");//サーバーサイドから送り返す先のprefix
		config.setApplicationDestinationPrefixes("/app");//MessageMappingのprefix
	}

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.addEndpoint("/ws").withSockJS();//ブローカーに管理させるエンドポイント。クライアントサイドでSockJsを利用する場合。
	}
}


```

## Controllerの実装

``` java
@Controller
public class WebSocketController {

	@Autowired//SpringBttoがよろしく作ってくれるので自分でConfigを書く必要はない
	private SimpMessagingTemplate simpMessagingTemplate;

	@MessageMapping("/test")//setApplicationDestinationPrefixesで指定した値を付け加えた、app/testに送信した値がここに来る
	public void sendMessage(Principal principal,//PrincipalはSpringSecurityと同様。ユーザー情報の取得に用いる
                            @Payload String message//クライアントサイドから送られたメッセージ
        ) {
           //何らかのロジックで送り先のユーザーID=toUserId(Principal.getUserName()で取れるもの)を取得する
           simpMessagingTemplate.convertAndSendToUser(toUserId, "/queue/test", sendMessage);//toUserIdが/user/queue/testをsubscribeしているところにsendMessageを送る
           //convertAndSendToUserは内部でよろしく特定のユーザー向けに宛先を調整してくれるので、
           //ここの開発者が細かい制御をする必要はない
	}
}
```

## Clientサイドの実装
前提として、

* stomp.js,sock.jsは読み込まれている
* SpringSecurityでのログインは済んでいる

ものとします。

```js
const socket = new SockJS('/ws'); //WebSocketConfig.registerStompEndpointsで指定したもの
const stompClient = Stomp.over(socket);
stompClient.connect({},function(frame){
    //接続成功時のコールバック関数
    stompClient.subscribe('/user/queue/test',function(result){//subscribe対象の指定
    //convertAndSendToUserの引数とsubscribeの引数が異なるので注意。userによる変換がかかるのでこちらはuserを指定。
        const sendMessage = result.body;//送信されたものはbodyで取り出す
    });
});

//何か送るとき
stompClient.send('/app/test',{},message);//WebSocketConfigで指定したapp + Controllerで指定したtest
//今回空で渡している第二引数はheaderを入れる部分

```

## その他注意点

### nginxを挟む時は注意
proxy内に以下を追記しないと400エラーが発生して接続できない

```conf
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
```
JFreeChart-レーダーチャート(SpiderWebChart)の作成


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

/**
JFreeChart-レーダーチャート(SpiderWebChart)の作成

 */
public class Chart06_00 {
  // 目次-レーダーチャート(SpiderWebChart)
  A_Chart06 a_Chart06;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;


  /** 成績のレーダーチャートを作成する */
  public static void main(String[] args) {
    // レーダーチャート(SpiderWebChart)にはCategoryDatasetを使用する
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    // Aの成績⇒理系が得意
    dataset.addValue(70,"A","英語");
    dataset.addValue(90,"A","数学");
    dataset.addValue(55,"A","国語");
    dataset.addValue(95,"A","理科");
    dataset.addValue(45,"A","社会");
    // Bの成績⇒文系が得意
    dataset.addValue(100,"B","英語");
    dataset.addValue(60,"B","数学");
    dataset.addValue(80,"B","国語");
    dataset.addValue(55,"B","理科");
    dataset.addValue(70,"B","社会");
    // Cの成績
    dataset.addValue(70,"C","英語");
    dataset.addValue(70,"C","数学");
    dataset.addValue(70,"C","国語");
    dataset.addValue(70,"C","理科");
    dataset.addValue(70,"C","社会");
    //
    // レーダーチャート用のPlotがある
    SpiderWebPlot spiderWebPlot = new SpiderWebPlot((CategoryDataset)dataset);
    //
    JFreeChart jfreeChart = new JFreeChart("成績レーダーチャート",(Plot)spiderWebPlot);
    ChartFrame cFrame = new ChartFrame("成績レーダーチャート",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/2ee4b2e4-7b81-be3d-105a-37e0107dc778.png)