OmniAICreator/Qiita-1.07M huggingface dataset:
決定木を学ぶ

# はじめに
決定木は一連の判断に基づいて決定を下すというモデルです。
RPGの選択肢によって分類する感じのあれですね。

# 手法

・情報利得が最大となる特徴量でデータを分割する。
・この分割を条件分岐ごとに繰り返す。
・分割されたデータが純粋になるまで繰り返す

という手法です。
完全に分割されるまでやると過学習に陥りやすいので深さには制限を設ける場合がおおいです。

## 情報利得の定義

情報利得はInformation GainらしいのでIGというように定数化されることが多みたいです。
IGは以下のように定義されます。

```math
IG(D_p, f) = I(D_p) - \sum_{j=1}^{m} \frac{N_j}{N_p}I(D_j) \\

f: 分割を行う特徴量\\
D_p:親のデータセット\\
D_j:j番目のデータセット\\
N_p:親データ数\\
N_j：子データ数\\
I:不純度
```

不純度は何らかの指標なので一旦何らかの数値とすることにします。すると親の不純度から、子の不純度を引いたものが情報利得となります。

ここで一旦理解のために親ノード１に対して子ノードが二つ(子ノード１、子ノード２)に別れた場面を想定します。

```math
IG(D_p, f) = I(D_p) - \sum_{j=1}^{m} \frac{N_j}{N_p}I(D_j) \\
=  I(D_p) - (\frac{N_1}{N_p}I(D_1) + \frac{N_2}{N_p}I(D_2) )\\

D_1:子ノード１のデータセット\\
D_2:子ノード2のデータセット\\
N_p:親データ数\\
N_1：子ノード１のデータ数 \\
N_2：子ノート２のデータ数 \\
```

つまり、情報利得は、子ノードの不純度の合計が最小になるような特徴量を選択することが目的となるような指標なのです。


## 不純度
では不純度とは一体なんのか。

よく使用される不純度の指標は

- ジニ不純度
- エントロピー
- 分類誤差

です。

###　ジニ不純度

```math
I_G(t) = \sum_{i=1}^{c} P(i|t)(1 - p(i|t)) = 1 - \sum_{i=1}^{c} P(i|t)^2 \\

P(i|t): ノードtでクラスiに属する割合\\
```

よってIは　0〜１をとりえます。
このジニ不純度が最小である０になるのはP(i|t)が１になる時です。つまり完全に分類され切った時になります。
逆に最大になるのは、P(i|t)=0.5の時です。２分類となった時、片方のノードに全てのデータが振り切られたのであれば、

```math
I_G(t) = \sum_{i=1}^{c} P(i|t)(1 - p(i|t))　= 1 - ( 1 + 0 ) = 0
```

となります。

### エントロピー

```math
I_H(t) = -\sum_{i=1}^{c} P(i|t)log_2 P(i|t)\\

P(i|t): ノードtでクラスiに属する割合\\
```

こちらもさっきと同様にP(i|t)が１になった時、エントロピーが０になります。

```math
I_H(t) = -\sum_{i=1}^{c} P(i|t)log_2 P(i|t) = -(log_2 1 + 0)= -(0 + 0) = 0 \\
```

になります。

### 分類誤差

```math
I_E(t) = 1 - max\{ P(i|t) \}
```

こちらはすごく単純に、子ノードのラベルの最大値が大きいものの割合を１から引いたものになります。
つまり、

ラベル１：20
ラベル２：３０

あったとするなら

```math
p(1|t) = 20 / 50 =  \frac{2}{5}\\
p(2|t) = 30/50 = \frac{3}{5} \\
```

なので

```math
I_E(t) = 1 - \frac{3}{5}
```

となります。
これも同じようにp(i|t)=1となればI_E(t) = 0 になります。

### 敏感度

３つ不純度を表すための手法があるんですが、それぞれ推定するため不純なものが入っていることを検知するための度合いがことなります。

分類誤差　＜　ジニ不純度 < エントロピー

という順番に検知能力が異なります。


## 決定木の構築
scikitlearnを使った場合DecisionTreeClassifierを使うと行うことができます。

結果としてはこんなものができあがるんですが、じゃあ一体、この閾値ってどう決めてるの？
とか、よくわからないので深追いして行きましょう。

<img width="812" alt="スクリーンショット 2018-10-27 18.22.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/121851/b70bd0b0-b534-d32b-fab8-65b1c938b942.png">


ですが、それ使っちゃうとそれまでになるので、詳細なアルゴリズムをおって行きます。

[決定木アルゴリズムを実装してみる](http://darden.hatenablog.com/entry/2016/12/15/222447)
を参考にさせていただきました。。

## 決定木を具体的に決めるためにはどうやって決めるか。

結局のところ、情報利得が最大になるような分割をすればいいと言ってしまえばそこまでなんですが、実際にはどうやっているのかを僕なりに咀嚼して書きます。
この記事では、情報利得(IG)というものが出てきました。情報利得は親の不純度から、子の不純度を引いたもので、うまく分割できているほど大きくなると言う寸法でした。

### 計算手順

- 1.特徴量をランダムに決定する。
- 2.各特徴量のユニークな値を求め、中間値を求め、閾値とする。
    - [1,2,3,4]　であれば、[1.5, 2.5, 3.5]となる。
- 3.2で求まった閾値を元にそれぞれ分割を行う。
- 4.3で分割されたノードを元にIGを算出。
- 5.全ての閾値ごとに行い、もっともIGの高い閾値を採択（閾値の比較）
- 6.全ての特徴量で同じように計算を行い、もっともIGの高い特徴量を算出（特徴量の比較）
- 7.規定の深さになるまで演算を繰り返す

という


## ランダムフォレスト
よく使われる。取り合えずやっとけという声もよく聞く。
アンサンブル学習という学習法を取り入れた決定木です。

### アンサンブル学習

３人寄れば文殊の知恵とはよくいったものでそれを体現した学習方法です。
複数のモデルを作り、それらを多数決で組み合わせたモデルを作ります。
故に、学習できてない、学習しすぎという問題について緩和することができます。
この詳細はおいおい！。

ランダムフォレストでは、

- 1.データを復元抽出
- 2.抽出した標本から、特徴量を非復元抽出
- 3.抽出した特徴量を使って分割を行う
- 4.一定数1-3を繰り返し、多数決でモデルを作成する

という方法。
一般的にはノイズ混みのデータにも強い。
簡単なGoogle Play Billing Libraryの課金の流れ

# 概要

課金今まで触れてこなかったので、メモです。

基本的にはBillingClientに対して以下をするだけです。

* 接続する。
* 課金アイテムの情報を取得する。
* アイテムの情報を渡して課金するだけ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/bac55d95-8e51-d804-64a6-626091f2a499.png)

このコードラボやりました。
https://codelabs.developers.google.com/codelabs/play-billing-codelab/

(この記事のコードミスっててヤバイことになっても保証はできないです)
何かコメントあればください。

# 接続する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/65488bc0-8fb6-269e-8d31-4615612405ad.png)


```kotlin
val billingClient: BillingClient = BillingClient
            .newBuilder(context)
            .setListener(this)
            .build()

    init {
        billingClient.startConnection(object : BillingClientStateListener {
            override fun onBillingSetupFinished(@BillingResponse billingResponse: Int) {
                if (billingResponse == BillingResponse.OK) {
                    Log.i(TAG, "onBillingSetupFinished() response: $billingResponse")
                } else {
                    Log.w(TAG, "onBillingSetupFinished() error code: $billingResponse")
                }
            }

            override fun onBillingServiceDisconnected() {
                Log.w(TAG, "onBillingServiceDisconnected()")
            }
        })
    }

```

# 課金アイテム(SKU)の情報を取得する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/0b09ca4d-6744-d0b0-4f41-ee496929a246.png)

SKUの名前はGoogle Play上でつけるっぽい。

```kotlin
        val itemType = SkuType.INAPP
        val skuList = listOf("gas", "premium")
        val skuDetailsParams = SkuDetailsParams.newBuilder()
                .setSkusList(skuList).setType(itemType).build()
        billingClient.querySkuDetailsAsync(skuDetailsParams,
                { responseCode, skuDetailsList: MutableList<SkuDetails> -> 
                    // ここで取得完了。(RecyclerViewとかでSkuDetailsの情報を表示できる) 
                })
```

```
SkuDetailsの例
{"productId":"gas","type":"inapp","price":"￥113","price_amount_micros":113088351,"price_currency_code":"JPY","title":"Gas (Play Billing Codelab)","description":"Buy gasoline to ride!"}
```

# 課金する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/129787d6-33ab-82c9-086c-6a18727cb5b9.png)


取得した情報にあるSkuDetailsのインスタンスを渡すだけで課金できる

```kotlin
        val billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails).build()
        billingClient.launchBillingFlow(activity, billingFlowParams)
```

接続の時に渡したリスナーで課金が検知できる。

```kotlin
    override fun onPurchasesUpdated(responseCode: Int, purchases: MutableList<Purchase>?) {
        Log.d(TAG, "onPurchasesUpdated() response: $responseCode");
    }
```

queryPurchases(SkuType.INAPP)などを呼ぶと、今の課金の状態とか取得できるみたい。
https://developer.android.com/google/play/billing/billing_library_overview へ


# 接続のリトライのベストプラクティス
ここに載っているので見てみると良さそう
https://codelabs.developers.google.com/codelabs/play-billing-codelab/#7

# Next Step
https://developer.android.com/google/play/billing/billing_library_overview
ここに載っていたものそのままですが、Next Stepとして以下が良さそう

アイテム課金などの都度課金
https://developer.android.com/google/play/billing/billing_onetime
月額課金などのサブスクリプション
https://developer.android.com/google/play/billing/billing_subscriptions
Nextcoud のテーミング機能

#はじめに
Nextcloudは、自前のサーバーにオンラインストレージを構築できるパッケージですが、せっかく構築したNextcloudでもロゴがそのままだと、社外の方からは、どっかのサービスを利用してるんじゃないかなって思われたりもします。今回は、Nextcloudのテーミング機能を紹介したいと思います。

![画像47.png](https://qiita-image-store.s3.amazonaws.com/0/308127/a480ba76-92d2-a895-1c03-1f1688822d7a.png)

#プラグイン
Nextcloud社の公式アプリです。
![画像46.png](https://qiita-image-store.s3.amazonaws.com/0/308127/67adf271-b7a0-e8bd-c210-441be933d04b.png)

#設定画面
プラグインを有効にすると、管理者画面に「テーマ」という項目が追加されます。
![画像48.png](https://qiita-image-store.s3.amazonaws.com/0/308127/a0655ac8-39b6-ff66-cfad-9a9996621176.png)
ここに、差し替えたいロゴや、背景カラーなどを設定できます。
![画像49.png](https://qiita-image-store.s3.amazonaws.com/0/308127/cf18edc8-ab24-c399-4ec3-d0aa3326b9be.png)
このようになりました。（ログイン画面）
![画像50.png](https://qiita-image-store.s3.amazonaws.com/0/308127/63050fac-b6f8-d447-bf7c-79efb0dfa2c6.png)
ログイン後はこんな感じです。
![画像51.png](https://qiita-image-store.s3.amazonaws.com/0/308127/9f5ab6dc-82d4-32e3-5b08-68158bf9f7ba.png)
ちなみに、背景カラーをまっ白にすると、自動的にアイコンの色が変更されます。
![画像52.png](https://qiita-image-store.s3.amazonaws.com/0/308127/8b4e9478-64e7-f7ee-2973-95163b4b6172.png)

#まとめ
会社でNextcloudを利用する場合は、ブランディングは必要ですよね。私のお客様も、大体は自社のロゴに変更したり、なんとかBoxやなんとかStorageみたいなサービスロゴに変更したりしています。ownCloudでは、実機にログインして、svgファイルを転送し、configファイルの書き換えを行ってましたので、バージョンアップの度に再度変更するのが面倒でしたけど、Nextcloudは楽ちんです。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
Javaのlombokのように.NETでToStringを自動生成するライブラリ

#やりたいこと#
デバッグやログ出力でクラスの内容（プロパティ）を出力したい場合に
いちいち自分で内容を出力するメソッドを実装するのは面倒だし
プロパティが増えた時にメンテナンスが面倒です。
リフレクションで出力する方法もスマートさに欠けます。

JavaではlombokというライブラリがtoStringの自動生成をしてくれるのは有名ですよね。
https://blog.y-yuki.net/entry/2016/09/30/003000

lombokを知った後でC#でも同じようなことがしたいと思い
.NET（C#,VB.NET）に同じようなものがないか探してみました。
意外に見つかりずらかったのですが（なのでこの記事を書いた）、
ありました。


#ToString.Fody#
見つけたライブラリはこれ。
**ToString.Fody**
github:https://github.com/Fody/ToString
nuget:https://www.nuget.org/packages/ToString.Fody/

nugetでは4万越え(2018/11時点)ぐらいのダウンロードがあるので
知ってる人は知ってるようです。

#使い方#
githubのページ参照ですが、簡単に書きます。
https://github.com/Fody/ToString

***1.インストール***
nugetからコマンドラインでもGUIでもお好きな方法でプロジェクトに追加してください

***2.設定ファイルの追加***
プロジェクト直下にFodyWeavers.xmlというファイルを追加。

```xml:FodyWeavers.xml
<Weavers>
  <ToString/>
</Weavers>
```

Fodyのライブラリをすでに使っていて同ファイルがある場合は
```<ToString/>```の行を追加。

***3.アトリビュート（属性）を付与***
ToStringを自動生成したいクラスに```[ToString]```アトリビュートを付与します。
ToStringに含めないプロパティは```[IgnoreDuringToString]```を付与します。

```cs
[ToString]
class TestClass
{
    public int Foo { get; set; }

    public double Bar { get; set; }
    
    [IgnoreDuringToString]
    public string Baz { get; set; }
}
```

***4.出力例***

```
{T: TestClass, Foo: Fooの内容, Bar: Barの内容}
```
ずんだの菱形アルファベット問題 Ruby編

## ルール
* 入力は整数の1-25まで
* 入力が偶数だった場合は "invalid" と出力する
* 入力の数値が2増えるごとに、出力の行と列が1行増え、1行進むごとに使用する文字は a, b, c と変化していく
* 出力は以下のような菱形になり、菱形を形作るのは a-y の文字で、それ以外の箇所は半角のアンダースコアとする

## 出力例
### 入力 1
```
$ test.rb 1
a
```

### 入力 5
```
$ test.rb 5
__a__
_b_b_
c___c
_d_d_
__e__
```

### 入力 25
```
$ test.rb 25
____________a____________
___________b_b___________
__________c___c__________
_________d_____d_________
________e_______e________
_______f_________f_______
______g___________g______
_____h_____________h_____
____i_______________i____
___j_________________j___
__k___________________k__
_l_____________________l_
m_______________________m
_n_____________________n_
__o___________________o__
___p_________________p___
____q_______________q____
_____r_____________r_____
______s___________s______
_______t_________t_______
________u_______u________
_________v_____v_________
__________w___w__________
___________x_x___________
____________y____________
```

### 入力 2
```
$ test.rb 2
invalid
```

## プログラム（Ruby）
```ruby
on_char = 'a'
count = ARGV.first.to_i
row_base = Array.new(count, '_')
rows = Array.new(count)
if count.even?
  puts "invalid"
  exit(0)
end

count.times do |i|
  j = i < (count / 2) ? i : count - i - 1
  row = row_base.dup
  center = count / 2
  row[center + j] = on_char
  row[center - j] = on_char
  rows[i] = row
  on_char = on_char.succ
end

puts rows.map(&:join).join("\n")
```

* [ずんだ問題まとめ - Qiita](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0)
C++ Builder XE4 > プロセス > 指定名のプロセスを起動している数だけTMemoに表示

```txt:動作環境
C++ Builder XE4
動作環境1: Windows 7 Pro (32bit)
動作環境2: Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

### 処理概要

- タスクマネージャのプロセスタブに表示されているプロセス
- 指定の名前がある場合にTMemoに表示
    - 例: notepad.exe

### 参考ページ

- [04_起動中のアプリケーションのリスト  ( 2 )　プロセスのリスト](http://mrxray.on.coocan.jp/Delphi/plSamples/320_AppList.htm#04) by Mr. XRAY様
- [Win32API プロセスのスナップショットを取得する ](http://d.hatena.ne.jp/s-kita/20100210/1265809921) by s-kita様

情報感謝です。


### 実装

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *Button1;
	TMemo *Memo1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
	void __fastcall TForm1::ListUpProcess_NameOf(String exename);
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <Tlhelp32.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListUpProcess_NameOf(String exename)
{
	HANDLE ListHandle;	// タスクマネージャ > プロセスリスト 用ハンドル
	TProcessEntry32 Pentry; // 個々のプロセス閲覧用

	ListHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if (ListHandle == INVALID_HANDLE_VALUE) {
		return;
	}

	Memo1->Clear(); // UI: 表示用

	Pentry.dwSize = sizeof(TProcessEntry32);
	Process32First(ListHandle, &Pentry);
	while(1) {
		String pnam = Pentry.szExeFile;
		if (pnam.Pos(exename) > 0) {
			Memo1->Lines->Add(pnam); // UI: 表示用
		}

		if (Process32Next(ListHandle, &Pentry) == false) {
			break;
		}
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	ListUpProcess_NameOf(L"notepad.exe");
}
//---------------------------------------------------------------------------
```

### 動作例

1. メモ帳(notepad.exe)を２つ起動する
2. ボタンを押す

![2018-11-05_18h24_34.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9d3d3e92-873b-b28f-5b3b-14be11b06ef1.png)


### 用途

- 同じソフトを開ける数を４つに制限したい、など
    - プロセスタブ上のプロセス数に基づく制限
Vue.jsでTwitter, Facebookのウィジェットを表示する

日本語の解説が全然ないので残しておきます。
下記のコードは別のとこで動いてたものをQiitaようにいじってます。
なので下記のコード自体は動作確認してません。

### Facebook
```javascript:facebook.vue
<template>
  <div>
    <div class="fb-page" data-href="https://www.facebook.com/facebook" data-tabs="timeline" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"><blockquote cite="https://www.facebook.com/facebook" class="fb-xfbml-parse-ignore"><a href="https://www.facebook.com/facebook">Facebook</a></blockquote></div>
  </div>
</template>

<script>
export default{
  mounted() {
    if (!document.getElementById('facebook-jssdk')) {
      (function (d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s);
        js.id = id;
        js.src = 'https://connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v3.2';
        fjs.parentNode.insertBefore(js, fjs);
      }(document, 'script', 'facebook-jssdk'));
    }
  },
}
</script>
```

`<template>`内のコードは[Facebook](https://developers.facebook.com/docs/plugins/page-plugin/?locale=ja_JP)から[コードを取得]。

参考：[vue.js - Error on creating a facebook like box component on vue - Stack Overflow](https://stackoverflow.com/questions/49638812/error-on-creating-a-facebook-like-box-component-on-vue)



### Twitter

まず[vue-tweet-embed](https://www.npmjs.com/package/vue-tweet-embed)をインストール
`$ npm install vue-tweet-embed --save-dev`

```javascript:twitter.vue
<template>
  <div class="twitter-widget"
    style="width:400px;">
    <v-timeline
      :id="twitterId"
      :source-type="'profile'"
      :options="{ 'height': twitterHeight }" />
  </div>
</template>

<script>
import Timeline from 'vue-tweet-embed/timeline'

export default{
  components: {
    'v-timeline': Timeline,
  },
  data() {
    return {
      twitterId: 'tsuka_rinorino',
      twitterHeight: '400',
    }
  },
}
</script>
```

以上
PMDとVisual Studio CodeによってSalesforceのソースコードのセキュリティスキャンの自動化

「ApexとVisualForceにセキュリティ問題がないか？」と一度悩んだ方が少なくありません。この記事でオープンソースの脆弱性検知ツールを紹介したいと思います。

以下のマニュアルはmacOSとHomebrew用

## pmd、 java8とVisual Studio Codeのインストール

```bash
$ brew install pmd
$ brew tap caskroom/versions
$ brew cask install java8 
$ brew cask install visual-studio-code
```

## Visual Studio CodeのSalesforce拡張のインストール

```
$ code --install-extension salesforce.salesforcedx-vscode
```

## Salesforce拡張の設定
Salesforceの拡張はjava8に依存するから、java8のパスを設定する。
`⌘ ,`を押すか`Code→Preferences→Settings`からアクセスし、ユーザー設定を開く。
![Screen Shot 2018-10-31 at 16.58.18.png](https://qiita-image-store.s3.amazonaws.com/0/128001/c11c12c0-23e6-173b-2fb9-2ce4ab4066bf.png)

検索フィールドに`salesforcedx-vscode-apex.java.home`を入力する。`Edit in settings.json`を押す。
![Screen Shot 2018-10-31 at 17.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/128001/a9bb06ae-f34d-ca93-5824-0f4a963b0158.png)

`$ /usr/libexec/java_home -v 1.8`を実行し、java8のパスを調べる。`settings.json`にjava8のパスを以下のように設定する。

```json
{
    "salesforcedx-vscode-apex.java.home": "/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home"
}
```
![Screen Shot 2018-10-31 at 17.12.59.png](https://qiita-image-store.s3.amazonaws.com/0/128001/9f60c7c1-da21-2eeb-1df2-00da4df62f33.png)

## PMD taskの設定
`Terminal→Configure Tasks...`を選択し、`Create tasks.json from template`を選んで`Others`を押す。
![Configure task](https://qiita-image-store.s3.amazonaws.com/0/128001/cf553238-9cf4-e28c-83cb-4685aa98cb63.gif)

以下のコンテンツをコピーペーする。

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "PMD",
            "type": "shell",
            "command": "pmd",
            "args": ["pmd", "-d", "${workspaceFolder}", "-f", "text", "-rulesets", "apex-security,vf-security", "-failOnViolation", "false"],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": {
                "owner": "apex",
                "fileLocation": ["absolute"],
                "pattern": {
                    "regexp": "^([^:]+):([0-9]+):\\s+(.+)$",
                    "file": 1,
                    "line": 2,
                    "message": 3
                }
            }
        }
    ]
}
```

## PMDの実行
Visual Studio Codeで`⇧⌘B`のショートカットを利用し、問題を検知する。すべての問題を表示するために`⇧⌘M`のショートカットを使う。

![Run pmd](https://qiita-image-store.s3.amazonaws.com/0/128001/2a6157b6-1e31-8171-10c0-4cf069e54d47.gif)
proxy環境下でROSをインストールする

# はじめに
大学や会社等、proxy環境下でどうしてもROSが入れたい人のメモ書き
Ubuntu16.04LTSとRaspberryPi 2 Model Bにインストールしました。

# 参考
基本的に以下を参考に

- [Ubuntu install of ROS Kinetic](http://wiki.ros.org/kinetic/Installation/Ubuntu)
- [Installing ROS Kinetic on the Raspberry Pi](http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi)

# 変更箇所
## apt-keyが通らない
`apt-key`コマンドを打つときは

```bash
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --keyserver-option http-proxy=http://proxy:port --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
```

とする

## rosdep initが通らない
`sudo rosdep init` は通らないので

```bash
export http_proxy="http://proxy:port"
export https_proxy="http://proxy:port"
```

を追記してから-Eオプションつけて実行する

```bash
sudo -E rosdep init
```

# 終わりに
公式の手順通りにやれば問題なくインストールされ`catkin_make`も通ると思います。
私は**RaspbianがStretchなのにJessieだと勘違いしてた**ために1晩ぐらい悩んでました。
他にもpyenvとぶつかってたりとかいろいろあったけど無事インストールすることができました。
Linuxコマンド・GCPコマンドファイルコピー、比較

# 外部サーバーからファイルをコピーしてローカルに保存

```terminal
//サーバーからファイルをコピーして保存したい場合
$ scp サーバー名:ファイルパス /ローカルのコピーしたい場所/コピー後のファイル名

//例
$ scp testsite.jp:etc/php.ini ~/Desktop/php.ini_copy

//gcpの場合
$ gcloud compute --project プロジェクト名　scp --zone ゾーン名　サーバー名:ファイルパス /ローカルのコピーしたい場所/コピー後のファイル名

//例
$ gcloud compute --project project-test-000000　scp --zone asia-northeast1-b　testsite.jp:etc/php.ini ~/Desktop/php.ini_copy_gcp

```

# 落としてきたファイルの差分をvimで確認

```terminal

$ vimdiff 比較するファイルのパス１　比較するファイルのパス2

//例
$ vimdiff ~/Desktop/php.ini_copy ~/Desktop/php.ini_copy_gcp

//これで差分があるところにハイライトがされます。
//vimエディタが二つ並ぶ形になるので隣に移動するには　ctrl + w

```

# 最後に
環境構築周りやLinuxコマンド周りは初心者中の初心者なので何か間違いや誤った認識があった場合はご指摘ください！
Angular CLIで作成したPWAをHerokuにデプロイする

#初めに
前回投稿した記事のPWAアプリをデプロイするので、まだ見てない方は
(https://qiita.com/KashikomaSweet/items/a156e2c2468017359df0)
を良ければご覧ください。

#Herokuにデプロイする
https://qiita.com/DotaKobayashi/items/0d9712c7ab31a29ebb5c
こちらの記事を参考にしながら、Herokuにデプロイします。

#手順
##ファイルを追加

①server.jsを追加

```js
const express = require('express');
const app = express();
app.use(express.static(__dirname + '/dist/pwa-sample'));
app.listen(process.env.PORT || 8080);
const path = require('path');
app.get('/*', function(req, res){
  res.sendFile(path.join(__dirname + '/dist/pwa-sample/index.html'));
});
```

##ファイルを編集
①package.jsonを編集

```json
{
  "name": "pwa-sample",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "node server.js",
    "postinstall": "ng build --prod && node generate-sw.js",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~7.0.0",
    "@angular/common": "~7.0.0",
    "@angular/compiler": "~7.0.0",
    "@angular/core": "~7.0.0",
    "@angular/forms": "~7.0.0",
    "@angular/http": "~7.0.0",
    "@angular/platform-browser": "~7.0.0",
    "@angular/platform-browser-dynamic": "~7.0.0",
    "@angular/router": "~7.0.0",
    "core-js": "^2.5.4",
    "rxjs": "~6.3.3",
    "workbox-build": "^3.6.3",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.10.0",
    "@angular/cli": "~7.0.2",
    "@angular/compiler-cli": "~7.0.0",
    "@angular/language-service": "~7.0.0",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.1"
  },
  "engines": {
    "node": "8.9.4",
    "npm": "5.6.x"
  }
}

```
startとpostinstallとenginesをいじっています。
enginesのバージョンは、herokuが対応しているバージョンを入力しましょう。
https://devcenter.heroku.com/articles/nodejs-support

##herokuでアプリを作成
①まずはherokuCLIをインストール
https://devcenter.heroku.com/articles/heroku-cli

②herokuのダッシュボードからアプリを作成
右上のnewを押すと、Create new appがあります。
作成すると自動で、Deployページに飛ぶと思います。
後は、そこに書いているコマンドを入れるだけ
(cd my-project/の部分は、前回作成したプロジェクトのディレクトリに)

③ﾃﾞﾌﾟﾛｰｲ
(PCで、アクセス後オフラインでアクセスしても表示され
iPhoneでもアクセス後ホーム画面追加するとPWA化されているはず・・・)

#今後の目標
今後はAngular自体を勉強して、このPWASAMPLEを拡張できればと思ってます。
(努力目標)
複数バージョンのYarnを共存 & 自動で切り替える (yvm)

# 結論 (TL;DR)

[yvm](https://github.com/tophat/yvm) を入れましょう。

```bash
curl -fsSL https://raw.githubusercontent.com/tophat/yvm/master/scripts/install.sh | bash
```

# モチベーション

Yarn はバージョンによって生成される `yarn.lock` の形式が微妙に違います。

例えば、Yarn 1.10 からは `integrity` という項目が追加されました。

```yarn.lock.diff
"@babel/code-frame@^7.0.0-beta.35":
  version "7.0.0-beta.48"
  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.48.tgz#ff1c11060a7c1206e0b81e95286cfc2ca3ac405f"
+  integrity sha512-zwyam2DrinaJfhmCaajZT2yRCoN3cE8dwW7uVWaHay9z2Dwn9Pidnekkz9g7kXbg2qfVqmgDKeUTVZ4+bMlfZA==
  dependencies:
    "@babel/highlight" "7.0.0-beta.48"

"@babel/helper-annotate-as-pure@^7.0.0":
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
+  integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==
  dependencies:
    "@babel/types" "^7.0.0"
...
```

こんな感じで大量の diff が出てしまいます。そのため、複数人で開発している時にはバージョンを合わせる必要があります。

よくある方法として、 npm 経由でバージョンを指定する、というものがあります。

```bash
npm i -g yarn@1.9.2
```

しかし、npm経由でバージョンを指定して入れる方法は**非推奨(Deprecated)**となっており、現在はサポートされていないため他の方法を使うべきです。

Docker経由で叩くなどいくつか方法がありますが、仮想環境を立てるほどでもない、という場合の方法を紹介します。

# yvmの出番

Yarn公式ではありませんが、 [yvm](https://github.com/tophat/yvm) というnvmのYarn版があるのでこれを使います。

```bash
curl -fsSL https://raw.githubusercontent.com/tophat/yvm/master/scripts/install.sh | bash
```

でインストールできます。

|よく使うコマンド|説明|
|:--|:--|
|`yvm install <version>`|&lt;version&gt; の Yarn をインストール|
|`yvm exec <version> <command>`|&lt;version&gt; の Yarn で <command> を実行|
|`yvm use <version>`|&lt;version&gt; の Yarn に切り替え|
|`yvm list`|バージョン一覧を表示|
|`yvm which`|現在のバージョンを表示|
|`yvm help`|ヘルプを表示|

## .yvmrc を使う
プロジェクトルートに `.yvmrc` ファイルを置いて、中にバージョンを書いておきます。

```sample.yvmrc
1.9.2
```

`.yvmrc` を置いた場所とそのサブディレクトリでは、バージョンを指定せずに `yvm use` や `yvm install`, `yvm exec` を使うと `.yvmrc` に記載してあるバージョンに合わせられます。これは便利ですね。

```sample.bashrc
alias yn='yvm exec'
```

などのエイリアスを作っておけば、 `yn` コマンドを `yarn` の代わりに使えば全自動でバージョン切り替えてコマンド叩けます。

## まとめ

* yvm を使うと Yarn のバージョン管理ができる
* `.yvmrc` を使うとプロジェクトごとにバージョンを自動で切り替えられる

みなさんも yvm 使っていきましょう。Yarn はいいぞ。
Laravel5でTextileを使う

日本語記事を全く見かけなかったので備忘録として。

多分、普通はMarkdown使うんだろうけど、今回の要件は
Textileのほうが適しているかなと思ったのでこっちにしてみた次第。

### 要件

* 以下の3つの文字装飾が出来るようにすること。ただし、HTML直打ちは禁止。
 * 太字
 * 小文字
 * 赤字

### インストール

このサイトのドキュメントを参考にした
https://github.com/textile/php-textile

```bash:bash
composer require netcarver/textile
```

インストールが出来たら、config/app.php にエイリアス登録

```php:config/app.php
    'aliases' => [

        'Textile' => Netcarver\Textile\Parser::class,

    ],
```

### 使い方

小文字(smallタグ)はなさげなので、classでやることにした

```php:resources/views/example.blade.php
@php
$textile = new Textile;
$textile = $textile -> setBlockTags(false);
@endphp

<p>{!! $textile -> parse("これは *太字*です") !!}</p>
<p>{!! $textile -> parse("これは %(small)小文字%です") !!}</p>
<p>{!! $textile -> parse("これは %{color:red}赤字%です") !!}</p>
```

### 出力

```html
<p>これは <strong>太字</strong>です</p>
<p>これは <span class="small">小文字</span>です</p>
<p>これは <span style="color:red;">赤字</span>です</p>
```
Gradle Wrapper の定義・設定方法が変更されたようだ

## Gradle Wrapper の定義方法の変更

Gradle 4.8 から Gradle Wrapper を使う場合には、カスタムタスクを作成するのではなく既存のタスクを設定する方式に変わったようだ。

[Overwriting Gradle's built-in tasks - Gradle 4.8 Release Notes](https://docs.gradle.org/4.8/release-notes.html#overwriting-gradle's-built-in-tasks)

> Defining a custom wrapper or init task is deprecated. Please configure the existing tasks instead.

```build.gradle
// before
task wrapper(type: Wrapper) {
  gradleVersion '4.10'
}
```

```build.gradle
// after
wrapper {
  gradleVersion = '4.10'
}
```

before の記述をしていると実行時に警告が出るようになっている。

> Creating a custom task named 'wrapper' has been deprecated. This is scheduled to be removed in Gradle 5.0. You can configure the existing task using the 'wrapper { }' syntax or create your custom task under a different name.

Gradle 5.0 では before の書き方はできなくなるようだ。

## そもそも build.gradle に Gradle Wrapper に関する記述は必須ではない

そもそも build.gradle に Gradle のバージョンを指定しなくても、コマンドラインで Gradle Wrapper のバージョンを指定することができるようになっている。

```bash
gradle wrapper --gradle-version 4.10
```

このコマンドで作成される gradle/wrapper/gradele-wrapper.properties には Gradle のバージョンに関する情報も含まれるので、ここを見ればバージョンはわかる。

```properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
```

build.gradle のバージョンを変更したが wrapper タスクを実行し忘れていたなんてことがあると、build.gradle 内のバージョンと実際に使用しているバージョンとが食い違うということが起こりうるので、build.gradle でわざわざバージョンを指定する必要はないのかもしれない。

## 参考
* [Gradle Wrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html)
TerraformでLet'sEncryptの証明書を取得する

実はTerraformでもACMEがサポートされています。（知っている人は知っている）
というわけで、terraformでLet'sEncryptの証明書を取得してみます。
認証についてはRoute53(DNS)で行います。


## 前提

terraformではDNS01 challengeが推奨されています。
ですので、ここでもDNSでの認証を行います。
様々なDNSがサポートされていますが今回はawsのRoute53を利用します。

なお、

- ワイルドカードはやりません
- SANの利用も同様にしません
- なので、対象はFQDN（サブドメイン付き）1つのみ


### 補足
ワイルドカードの証明書は便利ですが、万が一の場合利用する全サービスに影響が及ぶことを考えれば利用すべきではないと思っています。
特に、Let'sEncryptのようにマネージドで自動的に更新するのにワイルドカード証明書を使う必要はないと思います。

セキュリティのために証明書を利用するのに、セキュリティを損ねる運用を採用するのは本末転倒だと思っています。

## 解説
ま、大して設定するところもないのでソース見るだけでもわかると思いますが………

#### acme

ACMEのエンドポイントurlです。今回の例ではLet's Encryptです。[^1]

```json
provider "acme" {
  server_url = "https://acme-v02.api.letsencrypt.org/directory"
  # server_url = "https://acme-staging-v02.api.letsencrypt.org/directory"
}
```

#### tls_private_key

アカウント用の秘密鍵を生成します。
アルゴリズムはRSAにしてます。[^2]

```json-doc
resource "tls_private_key" "private_key" {
  algorithm = "RSA"
}
```

#### acme_registration
ACMEのアカウント登録

```json-doc
resource "acme_registration" "reg" {
  account_key_pem = "${tls_private_key.private_key.private_key_pem}"
  email_address   = "yourname@example.com"
}
```

#### acme_certificate
お待ちかねの取得。
AccessKeyとSecretIDでもOKですが、今回のソースではProfile指定をしています。

```json-doc
resource "acme_certificate" "certificate" {
  account_key_pem           = "${acme_registration.reg.account_key_pem}"
  common_name               = "sub.example.com"
  # min_days_remaining　　　　　　　　　　　　= "7"

  dns_challenge {
    provider = "route53"
    config {
      AWS_PROFILE = "PROFILE_NAME"
      # AWS_ACCESS_KEY_ID     = "${var.aws_access_key}"
      # AWS_SECRET_ACCESS_KEY = "${var.aws_secret_key}"
      AWS_DEFAULT_REGION    = "ap-northeast-1"
    }
  }
}
```

##### 注意点
- profileにはRole Arnは使えません。[^3]
- regionを指定しないとエラーになります。[^3]
- 権限は適切に

#### 取得できる値
今回のソースで取得できる値のうち特に必要そうなもの。

|変数|内容|
|------|------|
|acme_certificate.certificate.certificate_pem|証明書（pem形式）|
|acme_certificate.certificate.issuer_pem|中間証明書（pem形式）|
|acme_certificate.certificate.private_key_pem|秘密鍵（pem形式）|

#### 更新

証明書の更新が必要な場合は`terraform apply`を行った際に必要に応じて自動的に行われます。
必要性は`min_days_remaining`の値で判断されます。[^4]
証明書の期限がこの値を下回った場合に更新されます。（0を設定すると更新はされません）

#### 2018.11.06
修正：server_urlがステージングになっておりました。

[^1]: つか、他のとこあるんだべか
[^2]: ECDSAも作成できます
[^3]: でした。使用できたという人がいたら教えてください
[^4]: Defaultは7
Duplicityの簡易メモ

# インストール

https://qiita.com/kihoair/items/910b660e292e4d63e210

#おまけ

(ssh用)gpgの乱数生成効率化
http://toriniku.hatenablog.com/entry/20120726/1343289102

# 本家
http://duplicity.nongnu.org/

# manページ
http://duplicity.nongnu.org/duplicity.1.html

##restore時間の指定

```:バックアップファイルのタイムスタンプ指定(datetimeのフォーマット)
2002-01-25T07:00:00
```

```:現在時刻から遡り
s, m, h, D, W, M, or Y
例) 1時間78分前 → 1h78m
```

# Duplicity Scripts

* https://github.com/thornomad/dt-s3-backup
restoreは時間(世代)指定できない

* http://ddevnet.net/posts/backup-amazon-s3.html#amazon-s3-and-gpg-keys

* https://easyengine.io/tutorials/backups/duplicity-amazon-s3/
restoreはこちらを参考にするといいかも

* https://blyx.com/2013/05/10/playing-with-duplicity-backup-and-restore-tool-and-amazon-s3/
Rubyのprivateメソッドについて

Rubyのprivateメソッドがやや難しいので、まだメモ段階だが記録していく。

#1. privateメソッドはレシーバを表記しない
privateメソッドはレシーバが`self`です。ただ、基本的にはレシーバが省略されることは多いです。
また、private下に書いても、`self.hoge`のように書いてしまうとクラスメソッドとして定義されてしまうので気をつけましょう。

例

```ruby
class Test
  def test
    puts 'public instance_method'
  end

  def self.test  #クラスメソッド
    work
    puts 'public class_method'
  end

  private

  def self.work2
    puts 'class method'

  end
end
```

これは残念ながら、他のクラスからも呼び出せてしまいます。`Test.work2`で。

ちなみに下記はprivateメソッドとして定義されます。

```ruby
  def self.fuga()
  end
  private_class_method :fuga
```

#2.privateのselfの定義

privateメソッドにもレシーバが二つのパターンがあります。
1. class
2. classのオブジェクト
です。


```ruby
class Test
  def test
    work_instance
    puts 'public instance_method'
  end

  def self.test  #クラスメソッド
    work_class
    puts 'public class_method'
  end

  class << self

    private

    def work_class
      puts 'private class_method'
    end
  end

  private

  def work_instance
    puts 'private instance_method'
  end
end
```

このようになっていますね。
privateメソッドはselfをレシーバとしますが、クラスメソッドのなかで使う時はselfがクラス自身であるprivateメソッドを使いましょう。


まだ完全な理解とは言えない部分もあるので、updateしていきます。
ご指摘あればお願いします。
CloudMapper使ってみた(Mac)

## 概要
AWSの構成図が必要になったもののどうやって書けばいいかわからず,
自動で生成できないかなぁと色々ググったけど有料のものしか見つからず,
やっとCloudMapperという無料で使えるツール(めちゃ導入簡単)に辿り着いたのでメモ

## 導入手順
#### CloudMapper clone
※適当なディレクトリで実行して下さい。

リポジトリー: [CloudMapper](https://github.com/duo-labs/cloudmapper)

```bash
$ git clone git@github.com:duo-labs/cloudmapper.git
```

#### その他必要なものインストール

```bash
$ brew install autoconf automake libtool jq awscli python3
```

#### pipenvインストール

```
$ brew install pipenv
```

##### pipenvとは
Python公式が正式に推薦するPythonパッケージングツールで、簡単に**作業環境**を作れる方法を提供するためのツール

#### プロジェクトディレクトリに移動

```bash
$ cd cloudmapper/
```

#### Pipfileインストール


```bash
$ pipenv install --skip-lock
```

#### シェル起動(仮想環境)

```bash
$ pipenv shell
```

#### 設定値変更
##### 設定ファイルコピー

```bash
$ cp config.json.demo config.json
```

とりあえず,簡単に導入するために↓のように修正(CIDRSは特にかえなくても大丈夫)

```diff:config.json
{   
    "accounts" : [
        {
            "id" : "123456789012", 
-            "name" : "demo", 
+            "name" : "default", 
            "default" : true
        }
    ],
    "cidrs" : {
        "1.1.1.1/32" : {
            "name" : "SF Office"
        },
        "2.2.2.2/28" : {
            "name" : "NY Office"
        }
    }
}
```

#### アクセスキー設定 

AWSのIAMユーザのアクセスキーとシークレットキーを設定する
IAMの作成方法は↓で
[IAMの作り方](https://joppot.info/2014/06/14/1621)
**※admin権限ではなく参照権限にした方が良いと思います。**

##### 設定ファイルを開く

```bash
$ vi ~/.aws/credentials
```

```env:credentials
[default]
aws_access_key_id = ******************
aws_secret_access_key = **********************************
```

#### AWSから情報を取得する

```bash
$ ./collect_data.sh --account default --profile default
```

#### 解析処理実行

```bash
$ python cloudmapper.py prepare --account default
```

#### 構成図描画の為に,CloudMapperのサーバを起動する

```bash
$ python cloudmapper.py webserver
CloudMapper serving on 127.0.0.1:8000
```

#### `127.0.0.1:8000`にアクセスする

↓こんな感じにインフラの構成図が作成されます(人それぞれ)

![infra_structure.png](https://qiita-image-store.s3.amazonaws.com/0/133737/d07c27cf-4f47-711c-4b55-258fe2d423dd.png)

とりあえず簡単に導入方法メモりましたけどもっと色々できるみたいなのでそういうかたは↓の記事見るといいかも

[AWS ネットワーク構成図生成ツール「CloudMapper」を試してみた](https://qiita.com/bukaz/items/4a769065cd14b192319f)
ipadのSafariで動かなかったのメモ



javascriptの関数のデフォルト値

```javascript
function resetCanvas(canvas,jsonData=null) {
```

```javascript
function resetCanvas(canvas,jsonData) {
	var j = (j !== undefined) ? j : null;
```



アロー関数

```javascript
resetCanvas = (canvas) => {
```

```javascript
resetCanvas =function(canvas) {
```

["つかえないやん、コレ(´；ω；｀)](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9#%E3%82%A2%E3%83%AD%E3%83%BC%E9%96%A2%E6%95%B0%E3%81%AE%E3%81%BF%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%8F)
セレクトボックス(プルダウン)を外部ファイルから作成＋リストのデータを取得(JavaScript)

# 選択肢を別ファイルで管理したい

ユーザに数値を入力させる場合、セレクトボックス（プルダウン）があると楽。
だが、選択肢とそれに付随する数値が固定なら直接タグに書き込めばよいが、選択肢や数値が可変で外部ファイルとして管理したい場合がある。
その場合は、リストを格納している配列を別ファイルで作成し、読みだしてあげればい良い。
jQueryなどを使えばもう少しスマートに書けると思うが、自分の環境で導入ができなかったから素のJavaScriptでやる。


## HTMLを開いた時だけ別ファイルから読みだす
クリック時など細かく設定することもできるが、よほどのことがない限り一回読み出せば用済みになる。
一回だけ読みたい場合は、bodyタグなどにonload要素で実行させるればよい。


```選択肢表示.html
<body onload="readFirst()">
 <select id="PullDownList"></select>
</body>
```

```一度だけ実行(セレクトボックスが1つだけの場合).js
function readFirst(){
    //プルダウンリストをループ処理で値を取り出してセレクトボックスにセットする
    for(var i=0;i<list.length;i++){
      let opt = document.createElement("option");
      opt.value = list[i].val;  //value値
      opt.text = list[i].txt;   //テキスト値
      document.getElementById("PullDownList").appendChild(opt);
    }
  };
```

```一度だけ実行(セレクトボックスが複数の場合).js
function readFirst(){
    //プルダウンリストをループ処理で値を取り出してセレクトボックスにセットする
	let opt = document.createElement("option");
	let tmp = document.getElementsByClassName("PullDownList");
	for(var i=0;i<list.length;i++){
		for(var j=0;j<tmp.length;j++){
			opt = document.createElement("option");
			opt.value = list[i].val;  //value値
			opt.text = list[i].txt;   //テキスト値
			tmp[j].appendChild(opt);
		}
	}
  };
```

```プルダウンリスト.js
 //プルダウンメニューの配列(動的に指定するためのリスト)
 var list = [
    {val:"1", txt:"P1"},
    {val:"2", txt:"P2"},
    {val:"3", txt:"P3"},
    {val:"4", txt:"P4"},
    {val:"5", txt:"P5"},
 ];

```

## 作ったプルダウンの選択肢の情報を取得する
いろいろ選択⇒実行という流れにしたいなら、ボタンを使うと良い。


```情報取得ボタン.html
<input type="button" value="情報取得ボタン" onClick="get('PullDownList')">

```

```情報取得.js
function get(idName) {
    var chiceColor = document.getElementById(idName);
    console.log(chiceColor.value);
}
```
LaraDoc + Laravel-admin カスタマイズメモ

## Buildとかしすぎて No space left on device が出ちゃった時
以下で全部ポイッしちゃいましょう。

```
docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)
```

```
docker image prune  # タグのついていないイメージを削除
docker image prune -a   # それでも消えないゴミイメージを削除
```


## 共通でやっておくこと

### ローカル環境じゃない場合
```
/var/www $ vi 
```

```
APP_URL=http://13.23x.6x.17x/
```
EC2のPublicIPを設定する

## Terminal サイズに対応したログイン
```
$ docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` --user=laradock -it laradock_workspace_1 /bin/bash
```

```
$ docker exec -it laradock_mysql_1 mysql mysql -udefault -psecret
```

## エラー別
### Disk [admin] not configured, please add a disk config in \`config/filesystems.php\`.

```config/filesystems.php
'disks' => [
    :
    :
    'admin' => [
        'driver' => 'local',
        'root' => public_path('uploads'),
        'visibility' => 'public',
        'url' => env('APP_URL').'/uploads/',
    ],
```

## ログイン認証を差し替える
複数のテーブルとか、組み合わせでユーザ認証を行うように修正した時の備忘録

```config/admin.php
    'auth' => [
        :
        'providers' => [
            'admin' => [
                // 以下追加
                'driver' => 'custom',

                // 以下コメントアウト
                //'driver' => 'eloquent',
                //'model'  => Encore\Admin\Auth\Database\Administrator::class,
            ],
        ],
    ],
```

```app/Providers/AuthServiceProvider.php
<?php

namespace App\Providers;

// 以下コメントアウト
//use Illuminate\Support\Facades\Gate;
// 以下追加
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
// 以下コメントアウト
//    protected $policies = [
//        'App\Model' => 'App\Policies\ModelPolicy',
//    ];

    public function boot()
    {
        $this->registerPolicies();

        // 以下追加
        Auth::provider('custom', function ($app, array $config) {
            return new CustomUserProvider();
        });
    }
}

```
シェルスクリプトで文字列を分割しても普通の配列にはならない（でもforは使える）

# 先に結論
- bashシェルスクリプト中の文字列は、半角スペースを区切りとして配列ライクに扱える。
- 文字列中の任意の区切り文字を、trなどで半角スペースに置換すれば配列ライクに扱える。
- ただし、通常配列で使えるような機能には使えるものと使えないものがある。
	- 文字列を分割した配列でもできること（※elはelementのel）
		- `for el in $ary;do; ... done;`で各要素を参照 
		- `ary = ($ary[@] $newEl)`や`ary+=(newEl)`で新しい要素を追加
	- できないこと 
		- `echo ${ary[0]}`のようにインデックスを指定しての参照
		- `${#ary[@]}`での要素数の参照
	- その他、通常の配列との動作の違い
		- 関数の引数に渡した場合の挙動（末尾の[特記事項](https://qiita.com/simarei/items/f4809314399562309e4b#%E7%89%B9%E8%A8%98%E4%BA%8B%E9%A0%85%E9%96%A2%E6%95%B0%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%AB%E6%B8%A1%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88)参照）
- そもそもbashでは通常の配列も使いにくいよ！
（参考：[プログラマーの君！ 騙されるな！ シェルスクリプトはそう書いちゃ駄目だ！！ という話](https://qiita.com/piroor/items/77233173707a0baa6360)）

# ふつうの配列の場合
### スクリプト

```bash

# 宣言・定義
declare -a normalAry
normalAry=(a b c d)      

# 配列の全要素を表示
echo ${normalAry[@]}

# 特定の要素を参照
echo ${normalAry[0]}
echo ${normalAry[2]}     

# 配列の要素数を参照
echo ${#normalAry[@]}
```

### 実行結果

```bash

a b c d
a
c
4
```

計画通り。

# 文字列を分割した配列の場合
### スクリプト

```bash

# 宣言・定義
str="what:a:wonderful:world"
declare -a splitedAry
splitedAry=$(echo `echo "$str" | tr ':' ' '`)

# 配列の全要素を表示
echo ${splitedAry[@]}

# 特定の要素を参照
echo ${splitedAry[0]}
echo ${splitedAry[2]}

# 配列の要素数を参照
echo ${#splitedAry[@]}
```

### 実行結果

```bash

what a wonderful world
what a wonderful world

1
```

要素数は1、インデックス0に全文が入っており、インデックス2の要素はない（NULL）、という結果。
"what a wonderful world"というひとつの要素が入っているだけ。

# それって配列なの？
上記を見ると配列とは言いがたいのだが、不思議なことにfor文で回すことはできる。

### スクリプト

```bash

for el in $splitedAry; do
        echo $el
done
```

### 実行結果

```bash
what
a
wonderful
world
```

# あれ、じゃあ元から半角スペース区切りの文字列は…？
### スクリプト

```bash

str2="what a wonderful world"
for el in $str2; do
        echo $el
done
```

### 実行結果

```bash

what
a
wonderful
world
```

同じである。

# どういうこと？
IFSが半角スペースなので、配列とは違うんだけど「複数要素の集まり」とは見做される模様。勿論""で囲めばまともに文字列として扱われる。

# 特記事項：関数の引数に渡した場合
### 使う関数

```bash
sub(){
    echo $#              # 渡された引数の数
    for el in $@; do     # 全引数を一行ずつに区切って表示
        echo $el
    done
}
```

### 普通の配列の場合の実行結果
`ary=(a b c d)` を渡した場合。ご存知の人は多いと思いますが、配列は普通に渡しただけでは関数内で配列として振舞ってくれません。

```bash

1
a
```


引数の数としては1で（感覚的に）合っているのですが、配列内の全要素を取ることはできません。
※軽く調べたところ、引数に配列を使う方法としてはこんなのがあるようです（未検証）：
[bashで引数に配列を設定する方法](http://www.koikikukan.com/archives/2013/09/13-025555.php) - [小粋空間](http://www.koikikukan.com/)

### 文字列を分割した配列の場合の実行結果（スペース区切り文字列も同じ）
上記と同じ"what a wonderful world"の結果です。

```bash

4
what
a
wonderful
world
```

配列が展開されて、4つの引数が渡されたことになっています。

なお、渡す際にダブルクォートで`sub "$splitedAry"`とか`sub "$str2"`とすると、いずれも引数の数（`$#`）は1になります。
しかしながら上記関数と同様に`for el in $@`で回すと全要素取れます。不思議！

```bash
1
what
a
wonderful
world
```

関数に配列を渡そうとするのは、可読性の観点からも止めた方がいいというのが私の見解です。サブルーチンらしく、呼び出し元でforを回して、forの中から呼びましょう。
KibanaのダッシュボードをAPI経由でインポート/エクスポートする

# 概要

ansible等でKibanaの設定を一気に済ませたく、API経由でダッシュボードをインポートする方法を調べました。

ローカルとかで検証用に構築したKibanaからダッシュボードの設定ファイルをエクスポートし、そのファイルをansibleで管理してインポートすることで同じ設定のKibanaを自動で構築することができました。

# 環境

Elasticsearch 6.4.2
Kibana 6.4.2

# エクスポート

```
$ curl -H 'Content-type:application/json' -H 'kbn-xsrf:anything' http://127.0.0.1:5601/api/kibana/dashboards/export?dashboard=xxxx-xxxx-xxxx-xxxx-xxxxxxxxx
```

クエリパラメータに設定するdashboadのUUIDはKibanaのUIから取得します。

# インポート

```
curl -X POST -H 'Content-type:application/json' -H 'kbn-xsrf:anything'  http://127.0.0.1:5601/api/kibana/dashboards/import -d '{エクスポートしたJSON}'
```
AWSのCodePipeline/CodeBuildでRESTAPIテスト自動化

ついこの執筆の１週間前にCodePipelineをやっと触り始めて（AWS自体は１年前くらいから触り始めた）、CodePipeline完全に理解したので備忘のために記載します。

#0.前提
こんな感じのパイプラインを組みたかった

+ CodeCommitに資源が反映される
+ 上記資源とは別のリポジトリにあるテスト用のプロジェクトをCodeBuildでテスト
+ テストOKの場合、反映された資源をビルド&デプロイ
+ テストは単体テストではなく、RESTAPIのテストを想定しており、プロジェクトのリポジトリとは独立して存在している

#1.悩んだ点

+ RESTAPIのテストフレームワーク何にしようか
+ テスト資源のビルドスペック記載方法
+ 参照したいプロジェクトが複数あるときどうすればいいのか（既存のパイプラインにどう組み込むか）


#2.↑の解決策

この辺り多分知っている人にとっては当たり前なのですが、私は入力アーティファクト＆出力アーティファクトすらよく分からなかったので、同じレベル感で詰まっている人の助けになることを祈って書きます。

##・RESTAPIのテストフレームワーク何にしようか
今回必須の条件として、codeBuildで動かせる(テスト結果をハンドリングできる)ことだったので、
これに対応するフレームワークを探したところ、[frisby.js](http://ttr-hamasaki.hatenablog.com/entry/2015/09/27/070557)が良さそうでした。（他にいいフレームワーク知っている方いたらご教示ください。）

####構築手順
1.リンクの通り、npmコマンドをぽちぽちやって環境構築

```console:Console.log
$ cd testFolder
$ npm install -g jasmine-node
$ npm install frisby@0.8.5
$ mkdir testspec
```
*※frisby最新版ではテストの実行環境がjestに変更となるとのことでしたので、本記事ではfrisbyのバージョンを指定することにします。ご指摘いただいたH1Gdevさんありがとうございましたm(_ _)m*

2.作成したtestspecフォルダ内に、RESTAPIのテスト資源(***test_spec.js)を作成(詳しい記載方法は[リンク](http://ttr-hamasaki.hatenablog.com/entry/2015/09/27/070557)参照)
3.テスト実行時は下記のコマンドを実行

```console:Console.log
$ cd testFolder/testspec
$ jasmine-node .
```

テストに成功すると下記のようなログが出力されるはず

```console:Console.log
...............

Finished in 21.753 seconds
15 tests, 28 assertions, 0 failures, 0 skipped
```

※テスト数などは適宜読み替えてください
##・テスト資源のビルドスペック記載方法
下記buildspec.ymlをtestFolder直下に格納でOKです

```yml:buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - echo Installing Jasmine...
      - npm install -g jasmine-node
  pre_build:
    commands:
      - echo Installing source NPM dependencies...
      - npm install frisby
  build:
    commands:
      - echo Build started on `date`
      - echo Compiling the Node.js code
      - jasmine-node .
  post_build:
    commands:
      - echo Build completed on `date`

```

##・既存のパイプラインにどう組み込むか
コードパイプライン、今回は
Sourceステージ、Testステージ、Buildステージ、Deployステージの４つとします。
CodeCommitに資源push→資源をビルド→サーバーにデプロイのパイプラインにテストステージを加えるものとします。

####1.Sourceステージ
Sourceステージにアクションを追加で本来配備したい資源のCodeCommitとテスト資源が格納されている資源のCodeCommitの２つを並べる。
テスト資源CodeCommitの出力アーティファクト名は、今回は「TestSourceArtifact」とします。

####2.Testステージ
ない場合はTestステージの追加から実施

1. アクションの追加
2. アクション名：任意（TestなどでOK）
3. アクションプロパイダ：CodeBuild
4. CodeBuild：CreateProject 
<br>--ここからCodebuild--
5. プロジェクト名：任意
6. 環境イメージ：マネージド
7. OS:Ubntsu
8. ランタイム：node.js
9. サービスロール：適切な権限があるもの
10. ビルド仕様：buildspec.ymlをチェック
<br>--ここまでCodeBuild--
11. 入力アーティファクト：TestSourceArtifact
12. 出力アーティファクト：なし（本テスト資源で後続に渡す必要があるものはないため）

で完了

Build、Deployステージは既存のままでOK

#所感など
CodeBuildは裏でコンテナが起動して、buildspecのスクリプトを読み込んでいるんだ！という腹落ち感があってから理解がよく進んだ
入力アーティファクト、出力アーティファクトはパイプライン内で複数持てることを今回調査して知った


AWS楽しいですね！
GAEでデプロイ時にINVALID_ARGUMENT: Filename cannot contain '.', '..', '\r', start with '-', '_ah/', or '\n'

## 概要
デプロイ時に以下のエラー

```
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: Filename cannot contain '.', '..', '\r', start with '-', '_ah/', or '\n': file..png
```

## 原因
エラー出力の説明通り、

```
Filename cannot contain '.', '..', '\r', start with '-', '_ah/', or '\n'
```
'.', '..', '\r'を含んじゃ駄目、かつ、
'-', '_ah/','\n'で始まるのも駄目

## 解決策
```
mv file..png file.png
```
## コメント
誰かがファイル名ミスったらしい


以上
絶対に失敗しないシステム開発プロジェクトの進め方

# 前書き

こんにちは、あの記事の人です！

あの記事: [オブジェクト指向が5000%理解できる記事](https://qiita.com/gorillab/items/b2f8e39d7cc23ad505f9)

システム開発プロジェクトは8割が失敗すると言われていますが、これって業界としてヤバイですよね。私はこういった点に危機感を持っており、IT業界を改革するヒーローとなるべく株式会社ITヒーローを創業しました。

今回はシステム開発を発注・受注するときに失敗しないための手順を紹介します。

# 本題
ちなみにステークホルダーは「発注者」「受注者」「コンサルタント」です。括弧内に書かれているのは作業を担当する人です。

### 1. 企画
社内で業務改革プロジェクトが立ち上がってからがスタートです。このフェーズで成功するかどうかの50%くらいが決定するといっても過言ではありません。場合によっては経営コンサルタントにサポートしてもらうのがいいかと思います。

#### 業務分析(発注者)
あたりまえなのですが、意外と行われていないのがこれ。ITシステムは業務を効率化・自動化するために存在します。ですから、現状どの業務にどんな課題があって、理想としてどうしたいのかと言った点を分析する必要があります。

現状業務フローを作成し、課題を分析しましょう。

#### 改善策検討(発注者・ITコンサルタント)
現状業務フローを見ながらどんな解決策があるかを考えましょう。マジで注意してもらいたいのは、システム開発ありきで考えないでほしいということ。現状の課題は従業員を増員すれば解決するかもしれませんし、組織体制を変更すれば解決するかも知れません。とにかく様々な観点から検討してください。ITがベストな解決策とは限りません。正直、IT知識のないひとがベストな解決策を立案するのは不可能ですので、大人しくITコンサルタントを頼ってください。ここをケチると絶対に失敗します。絶対にです。

新業務フローを作成し、改善後の運用を確認しましょう。

#### 投資効果検討(発注者)
新業務フローに移行するための費用と、新業務フローに移行したことによる費用効果を比較し、業務改革を実施するか否かを決定します。

投資効果レポートを作成し、判断しましょう。

### 2. 提案依頼
#### RFP作成(発注者・ITコンサルタント)
提案依頼書(Request For Proposal, RFP)を作成します。受注者(ITベンダー)に対して「こんなことがしたい」と言った相談をするものです。目的はベンダーの選定です。

ここにも必ずITコンサルタントを入れてください。

#### RFP回答(受注者)
RFPに回答します。自社の技術で対応が可能かどうか、大まかな費用・期間などを回答しましょう。目的は発注者にベンダー選定の判断材料を与えることです。

正直に誠実に回答しながらアピールして受注獲得を目指しましょう。

### 3. 要求定義
#### 要求定義書作成(発注者・ITコンサルタント)
具体的にこんなものを作って欲しいというもの、つまり委託業務の内容と範囲を明記した書類を作成します。機能レベルで具体的に記述する必要があります。

ここにも必ずITコンサルタントを入れてください。

#### 見積もり等回答(受注者)
要求定義書をもとに見積もりなどを回答します。

#### 個別契約(発注者・受注者)
双方が合意したら個別契約を交わします。要求定義書に基づいて期間や費用、成果物などについて書面で合意を交わしましょう。

契約はトラブルを防ぐために必ず結んでください。法務部がない場合は、弁護士などに依頼しリーガルチェックを受けることも大切です。

#### 着手金・費用事前自払い(発注者)
先払いの場合はこのタイミングとなります。

### 4. 要件定義
#### 要件定義書の作成(受注者)
要求定義書に基づいてシステムの仕様を定めます。

#### 要件定義書の確認(受注者・発注者)
受注者は、要件定義書が要求定義書の要求を満たしていることを説明します。発注者が要件定義書の内容に合意したら、互いに署名を交わして記録として残しておきましょう。

### 5. 開発
割愛

### 6. 導入
#### 検収(発注者)
発注者は、受注者から納品された成果物が要件定義書の内容を満たしているか確認します。要件を満たしていることが確認できたら開発プロジェクトは完了です。

#### 費用事後払い(発注者)
後払いの場合はこのタイミングとなります。

### 7. 保証
#### 瑕疵対応(受注者)
成果物に不備があった場合、受注者は契約書で定められた期間・条件に応じて対応する義務があります。ここがトラブルの種ですので、これをなくすためにも、要求定義・要件定義・契約をしっかり行いましょう。

# 後書き
いかがでしたか？当たり前のように思えるかも知れませんが、会社が大きくなればなるほど、各フェーズを別の人・部署が担当することになり、歪や摩擦が生じやすくなります。

また、素人知識や思い込みで無理を通して失敗するケースも多々あります。迷わず優秀なコンサルタントを巻き込みましょう。

この手順にシッカリと準拠し、システム開発プロジェクトを成功させてくださいね！

弊社でもコンサルしています♥

リンク: [株式会社ITヒーロー](https://it-hero.jp)
scpでフォルダをget/post


##サーバにローカルのフォルダをコピー
下記の日本語部分を自分の環境に合わせて入力してください。

```
scp -i /公開鍵 -r /ローカルのコピー元のディレクトリ ホスト名@サーバIP:/ローカルの保存する場所
```

実際のコマンドはこんな感じ

```
scp -i /.ssh/test.pem -r /local/test hostname@32.345.123.11:/myServer
```
ローカルのtestディレクトリをmyServerの配下にコピーできました。



##ローカルにサーバのフォルダをコピー
下記の日本語部分を自分の環境に合わせて入力してください。

```
scp -i /公開鍵 -r ホスト名@サーバIP:/サーバのコピー元のディレクトリ /ローカルの保存する場所
```

実際のコマンドはこんな感じ

```
scp -i /.ssh/test.pem -r hostname@32.345.123.11:/myServer /local/test
```
サーバのmyServerディレクトリをローカルのtestディレクトの配下にコピーできました。

※公開鍵が必要ない場合は　`-i /公開鍵`を省いてください。