OmniAICreator/Qiita-1.07M huggingface dataset:
Python スタックを遡って指定変数名の値を拾ってくる

スタックを遡って指定変数名の値を拾いたかった。inspect使えばできました。

# やりたいこと

```python
def func0():
    _v = "abc"
    func1()


def func1():
    # ここでスタックを遡って、直近の _v という変数名の値をとりたい
```

# やった方法

スタックを遡って指定変数名の値を拾ってくる関数を定義。
実装:フレームをf_backで遡ってローカル変数名を検査。一致するものあればreturn。

```python
import inspect


def get_backframe_localvalue(var_name):
    frame = inspect.currentframe().f_back
    while frame:
        var_locals = inspect.getargvalues(frame).locals
        if var_name in var_locals:
            return var_locals[var_name]
        frame = frame.f_back
    return None
```

上記を使う

```python
def func0():
    _v = "abc"
    func1()


def func1():
    print(get_backframe_localvalue("_v"))  # abc
```

## 他の挙動例

直近のものを拾ってきます。存在しない場合はとりあえずNone返すようにしてみました。

```python
def func0():
    _v = "abc"
    _vv = "def"
    func1()


def func1():
    _vv = "xyz"
    func2()


def func2():
    print(get_backframe_localvalue("_v"))  # abc
    print(get_backframe_localvalue("_vv"))  # xyz
    print(get_backframe_localvalue("_xx"))  # None
```

# なぜこれをやりたかったか
デバッグ用のアレをアレするのに、グローバル変数やスレッド単位ではなく、呼び出しスタックの単位で特定の値を埋め込みアクセスしたかった。
適当に使うと、わけわからなくなること必至だとは思う。

# 参考
https://docs.python.jp/3/library/inspect.html
rspec-parameterizedを使って、RSpecをリファクタリングした話

この記事は、[Business Bank Group Developers Advent Calendar](https://qiita.com/advent-calendar/2018/bbg_developers) 12日目の記事です。

### 前書き
ビジネスロジックのspecを書いている時に、specファイルが肥大化してしまい、メンテナンスが辛くなってきたので、rspec-parameterizedを使ってリファクタリングをしたよ。という話です。

### 元のspec

このようなspecを書いていました。(本当は、もう少し複雑です)

```ruby:before
describe "#validate" do
  subject { importer.validate(column_type, condition) }

  let(:column_type) { ColumnType.find_by_code(code) }
  let(:condition) { setting: setting, amount: amount }

  %w(a b c e).each do |code|
    context "when column_type is '#{code}'" do
      context "when setting is true" do
        let(:setting) { true }

        context "when amount blank" do
          let(:amount) { nil }
          it { expect(subject).to eq nil }
        end

        context "when amount present" do
          let(:amount) { 2 }
          it { expect(subject).to eq nil }
        end

        context "when amount is invalid format" do
          let(:amount) { "ABC" }
          it { expect(subject).to eq "invalid_format" }
        end
      end

      context "when setting is false" do
        let(:setting) { false }

        context "when amount nil" do
          let(:amount) { nil }
          it { expect(subject).to eq nil }
        end

        context "when amount present" do
          let(:amount) { 2 }
          it { expect(subject).to eq "invalid_setting" }
        end
      end
    end
  end

  %w(d f).each do |code|
    # contexts(長くなるので割愛)
  end
end
```

...条件が増えるごとにcontextを増やさないといけないのでしょうか。書いてて嫌になりそうです(笑)
更に、MECEを考える時にパターンの漏れが発生しやすそうです...

### rspec-parameterizedを使ってみた

rspec-parameterizedの`Nested Array Style`を用いて、このようにリファクタリングできました。

```ruby:after
describe "#validate" do
  subject { importer.validate(column_type, condition) }

  let(:condition) { setting: setting, amount: amount }
  let(:column_type) { ColumnType.find_by_code(code) }

  %w(a b c e).each do |code|
    context "when column_type is '#{code}'" do
      where(:setting, :amount, :result) do
        [
          [true ,nil, nil],
          [true ,2, nil],
          [true ,"ABC", "invalid_format"],
          [false ,nil, nil],
          [false ,2, "invalid_setting"],
          [false ,"ABC", "invalid_setting"]
        ]
      end

      with_them { it { expect(subject).to eq result } }
    end
  end

  %w(d f).each do |code|
    # contexts(割愛)
  end
end
```

rspec-parameterizedの書き方については、下記記事でまとめています。
[rspec-parameterized ことはじめ](https://qiita.com/shota_yamashita/items/c6b25f57669888b1e217)

### どうなったか
- コードの行数が約1/3に減った
- 行数が減ったことによりコードが見やすくなった
- コードが見やすくなったことにより、specで仕様を表せていることがより可視化できた

### まとめ
FizzBuzzなど、簡単なテストであればまだ可愛いですが、実際のビジネスロジックでは、各ステータス(条件)毎の〇〇を求めるメソッドなど、複雑な条件を網羅するテストを書く必要があり、rspec-parameterizedは、それを書きやすく、より分かりやすくさせるものでした！


明日は @Kirika さんが担当です。よろしくお願いします！
Ada言語 3日目 構造体

# はじめに
まず、今回から コンパイル ~ 実行 の過程を、1日目と同様なので省略します。

そして、今回やったことですが、構造体を使ってみました。
(今回の構造体にはInteger型のメンバしか入っていませんが。)

それではソースをご覧ください。

# ソースと実行結果
```main.adb

with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

procedure main is

	type kouzoutai1 is
		record
			mennba1 : Integer;
			menbba2 : Integer;
		end record

	obuzyekuto1 : kouzoutai1;

begin

	obuzyekuto1.mennba1 := 10;
	obuzyekuto1.mennba2 := 20;

	Ada.Integer_Text_IO.Put(obuzyekuto1.mennba1, 1);
	Ada.Integer_Text_IO.Put(obuzyekuto1.mennba2, 1);

end main;

```

` 実行結果 : 1020 `
改行を挟んでいないので見ずらいかもしれませんが、できるだけソースを短くしたかったのでこうなってしまいました。

#今後の予定
相変わらず変数。Integer型で配列をやろうと思います。

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
goでprotobufやgrpc-ecosystemを最新にしたらエラーが出るようになった件の対処

#概要
表題の件の対処、ライブラリのダウングレード方法をまとめます。
このエラーは2018/12/10時点のもので、おそらく近く修正されるかと思うのですが直近同じエラーにはまった人や、ライブラリのダウンロード方法の参考になればと思い記事を残します。すぐエラーを直したい方は[全ての実行コマンド](#全ての実行コマンド)を確認してください。

#経緯
以下のようにproto系のライブラリをアップデートすると、

```
brew upgrade protobuf
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get -u go.pedge.io/protoeasy/cmd/protoeasy
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
```

以下のエラーメッセージが出て今まで通っていたbuildが通らなくなりました。

```
xxxxx.pb.go:xx:xx: undefined: proto.ProtoPackageIsVersion3
xxxxx.pb.gw.go:xx:xx: undefined: utilities.IOReaderFactory
```

以下、同じエラーが出ている人がいたので、同様の対処方法を試みます

Rev of proto-gen-go to ProtoPackageIsVersion3 causing breakage
https://github.com/golang/protobuf/issues/763


```
cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go
git checkout v1.2.0
go install
git checkout master
```
再度、make protoしてmakeすると```undefined: proto.ProtoPackageIsVersion3```の方のエラーは消えたのですが、```undefined: utilities.IOReaderFactory```の方は消えません。

こちらはpb.gw.goでgateway用のファイルのなので、gatewayの方もダウングレードします。

```
cd $GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
git checkout v1.5.1
go install
git checkout master
```

これでmake protoしてmakeするとエラーが出なくなりました。

# バージョンの下げ方
対象フォルダに入って、旧バージョンをチェックアウトしgo installするだけですが、ブランチをmasterに戻しておかないと再度go get -u した時にエラーになるので戻しています。

```
cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go
git checkout v1.2.0
go install
git checkout master
```

# 全ての実行コマンド

```
brew upgrade protobuf
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get -u go.pedge.io/protoeasy/cmd/protoeasy
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go
git checkout v1.2.0
go install
git checkout master

cd $GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
git checkout v1.5.1
go install
git checkout master
```
ストロングパラメーターについて


###【ストロングパラメーターについて】

既存のフォームに、新たに「所属」入力フォームを追加し、値を送信しようとしたがバリデーションがかかって値を渡せず詰まったのでメモ。

質問をすると、

***「ストロングパラメータってオチじゃないですか？***

***rails tutorial 第7章 7.3.2を見ると何か発見があるかもしれません。」とのこと。***

https://railstutorial.jp/chapters/sign_up?version=5.1#sec-signup_form

‘‘‘
以下抜粋
paramsハッシュでは:user属性を必須とし、
名前、メールアドレス、パスワード、パスワードの確認の属性をそれぞれ許可し、
それ以外を許可しないようにしたいと考えています。
これを行うには、次のように記述します。
params.require(:user).permit(:name, :email, :password, :password_confirmation)
‘‘‘

試してみると、そのオチでした。。

ストロングパラメーターとは簡単に言うと、
###ビューからコントローラーに、安全に値を渡すための仕組み。
###丸々フォームの値を渡すとセキュリティ上良くないので、許可(permit)したものだけ渡すように設定している。

user_controllerのpermit内で
送信したい属性を追加するとブラウザから値を送信出来ました。
802.1X認証で認証サーバが検証されない？

MaCOS sierra（10.12.3）での話です。

EAP-PEAPによる無線LAN認証の検証を行なっていたところ、以下の問題に遭遇。

認証サーバ（Radius）のサーバ証明書に正規のSSL証明書をセットアップし、無線LANに接続したところ、ID/PWD入力後、認証サーバの検証なしで接続ができてしまった。

ん・・これだと、サーバ認証してない・・よね。

適当なドメインの正規のSSL証明書で認証サーバを立てられたら、認証サーバが正しくなくても、勝手に接続してしまい、中間者攻撃されかねない。これはまずい！！

（ちなみにオレオレ証明書の場合は、信頼されたルート証明書の認証局で発行していないためか、認証サーバの検証はされていました）


　
・・・調べてみたところ、これはMacOSの不具合であったようだ。

macOS Sierra 10.12.5、セキュリティアップデート 2017-002 El Capitan、セキュリティアップデート 2017-002 Yosemite
https://support.apple.com/ja-jp/HT207797

（以下引用）
*802.1X
対象 OS：macOS Sierra 10.12.4
影響：802.1X 認証を採用した悪意のあるネットワークが、ユーザのネットワーク資格情報を傍受できる可能性がある。
説明：証明書の変更時の EAP-TLS における証明書の検証に問題がありました。この問題は、証明書の検証を強化することで解決されました。*


MacOSのセキュリティアップデートしたところ、問題解消。

ID/PWD入力後、認証サーバが検証されるようになった。
GroovyのワンライナーでISO 8601拡張形式出力

```bash
$ groovy -e 'println new Date().time' | groovy -npe 'new Date(line.toLong()).format("yyyy-MM-dd'\'T\''HH:mm:ssZ")'
2018-12-11T19:01:57+0900
```

`'\'T\''`がキモ
Bashで2つのディレクトリ間の同名ファイルを抽出する

tl;dr
--------

重複取得/排除にはuniqが便利です。

### 確認用の準備

動作確認用に、2つのディレクトリaとbを用意し、お試し用のファイル(ディレクトリ)を作る

``` bash
mkdir -p a/{1,2,3,4,5,6,7,8,9,10}
mkdir -p b/{1,3,5,7,9,11,13,15,17}
```

### 同名のモノを抽出

```
 (ls a; ls b) | sort | uniq -d
```

> 1
> 3
> 5
> 7
> 9

### 同名のモノを除外

```
 (ls a; ls b) | sort | uniq -u
```

> 10
> 11
> 13
> 15
> 17
> 2
> 4
> 6
> 8

こっちはもう少しいい感じにしたい。もう一回同じような処理を書けば完全に除外はできるけど。


背景
-----

元の問題としては、同じ日付フォーマットを持つディレクトリ名が異なるディレクトリ間に大量にできており、この中から不要なディレクトリを除去してほしいとのことだった。
調べてみると、片方は不要なディレクトリの判別が簡単だが、もう片方は判別が難しいというものだった。でも削除するべき日付をメモして手で削除なんてやりたくないし、**そもそも片方は残すべきものが分かっているので、そこと重複するやつだけ残せば良いよね**、という事で。

最初は一致するものを抽出・除外といったらgrepだろうけど、複数行同士だとうまくいかないなーめんどいなー、という感じでパッと思いつかなかった。でもperlでちょっと書くのはしのびない作業。

うーんと考えていたら、2つのディレクトリ内で考えれば、同名のファイルは2つしか存在しえないので、`sort | uniq- c`でカウントが2なら表示すれば出来ると考えた。(1なら同名のモノを除外)

```
# a,bから同名のモノを抽出
 (ls a; ls b) | sort | uniq -c | awk '$1 == 2 {print $2}'
# a,bから同名のモノを除外
 (ls a; ls b) | sort | uniq -c | awk '$1 == 1 {print $2}'
```

これなら、3つのディレクトリ間で同名のモノが3つあるものだけ取り出す、というのも簡単に出来る。（そんな用途あるかは知らんけど。）

でもawkめんどいな、もっといい方法ないかな、とmanを眺めてたらuniqのオプションで出来そうということで、最初の方法にたどり着いた。多分もう少し良い方法があるはず。

後は、この結果を使って`xargs -n1 -I{} mv a/{} temp`で移動させた後、`rm -rf temp`といった感じに使う。存在しないものはmvで失敗するだけなのでこれで良い。

ワンライナー力が足りない。
Textの領域に収まりきらなかったら動的に文末を任意の文字列に置き換えてくれるやつ

# Textの領域に収まりきらなかったら動的に文末を任意の文字列に置き換えてくれるやつ
備忘録です。
タイトルが長い
どう表現して良いのか分からなかった・・

## コード
```csharp:TextClipping.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TextClipping : MonoBehaviour {

	// Use this for initialization
	void Start () {
		m_Text.text = ClipString(m_Text, "New Textaaaaaaaaaaaaaaaaaa", "...");
	}

	public static string ClipString(Text text, string str, string m_TailString)
		{
			var generationSettings = text.GetGenerationSettings(text.rectTransform.sizeDelta);
			var generator = new TextGenerator ();

			var tail = m_TailString;

			var areaWidth = text.rectTransform.sizeDelta.x;
			var subString = str;
			for (int i = str.Length - 2; i > 1 + m_TailString.Length; i--) {
				var temp = str.Substring(0, i) + tail;
				var textWidth = generator.GetPreferredWidth(temp, generationSettings) / generationSettings.scaleFactor;
				if (areaWidth > textWidth) {
					subString = temp;
					break;
				}
			}

			return subString;
		}

	[SerializeField]
	private Text m_Text;
}
```

# これが
![スクリーンショット 2018-12-11 19.16.47.png](https://qiita-image-store.s3.amazonaws.com/0/141994/0e428cf1-e459-3060-03eb-4cf7e49d60ef.png)

#　こうなる
![スクリーンショット 2018-12-11 19.16.58.png](https://qiita-image-store.s3.amazonaws.com/0/141994/917b4bbf-b04d-1078-d074-4d9e1d082dea.png)

# TODO
収まりきらなかったら、文字列をスクロールとかさせたい
社内 QA meetupで登壇してきました　要件定義の分析をテーマに

社内の第４回目 QA meetupが2018/12/11にありました。
そこで登壇しましたの、その自分の発表内容を共有します

<A HREF="https://www.slideshare.net/SadaakiEmura/20181211-qa-meetup-in-office">
<IMG SRC="//image.slidesharecdn.com/20181211qameetup-slot3m-181211032100/95/slide-1-1024.jpg" WIDTH=80%></A>

# コンテンツのサマリ

- 情報には４つのレベルがある
- プロデューサーが作成するPRD（要求仕様書）は、情報が十分でないことが多い
- CPMはPRDの機能リストをそのままコピペして、書かれている内容をテストする手法
- CPMでテストするのは多くのバグを含み、かつエンジニア、プロデューサーもその書かれた内容はテストするためQAの存在価値がない
- この問題を解決するに、２つの簡単な品質を上げる取り組みがある
- 一つ目はUSDMの考え方、これのキーとなるのは、機能には必ず目的がある。その目的をクリアにすれば、全員の仕様のずれが少なくなる
- 二つ目はNever/Must/Wantを書き出す、要求仕様書にはMust（known explicit）は記述されるが、Neverは記述されないことが多い。これをやる癖をつけると、仕様の漏れが少なくなる
【Kotlin】Error: Cannot create an instance of class ViewModelの解消方法

調べても出てこなくてわりと苦労したのでシェアしておきます。

# エラー内容
> java.lang.RuntimeException: Cannot create an instance of class 〜ViewModel
…
> Caused by: java.lang.InstantiationException: java.lang.Class<〜ViewModel> has no zero argument constructor

viewModelの生成ができないと言われている。

# 原因と解決策
DIライブラリの **Koin** を導入したことで、 **viewModelの生成方法が変わった** ことが原因でした。

`ViewModelProviders`を使用している書き方↓から

```kotlin

val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
```

`by viewModel()`を使用する書き方↓に変更するとエラーが消えました。

```kotlin
val viewModel: MyViewModel by viewModel()
```

# 参考
[koin-android · insert-koin.io](https://beta.insert-koin.io/docs/1.0/quick-references/koin-android/#android-architecture-viewmodel)
[AACのViewModelをKoinでInjectする - Qiita](https://qiita.com/kazkn/items/5351ff96da6fb672ee93)
Postfix各種制限設定

Postfixのセキュリティ周りの設定を弄っていろいろ調べたのでメモ


# 前知識

SMTPクライアントは、下記の手順でSMTPサーバに対し `SMTPコマンド` を送ることでメール送信している。

1. TCPコネクション接続要求
* EHLOコマンド（通信元のホスト名を名乗り、通信開始を通知）
* MAILコマンド（メール送信元（FROM）を通知）
* RCPTコマンド（メール送信先（TO）を通知）
* DATAコマンド（メッセージ送信開始を通知）
* メールメッセージを送信
* QUITコマンド（メッセージ送信完了を通知し、TCPコネクションを切断）



# 制限設定

## smtpd_sender_restrictions

MAILコマンド（FROM通知）の場面で適用される制限

## smtpd_helo_restrictions

EHLOコマンドの場面で適用される制限

## smtpd_recipient_restrictions

RCPTコマンド（TO通知）の場面で適用される制限

## smtpd_data_restrictions

DATAコマンドの場面で適用される制限（Postfix 2.0 以降で使えます）

## smtpd_client_restrictions

SMTP接続の要求を受けた際に適用される制限
SMTP コマンドのどの場面でも使える一般的な 制限は smtpd_client_restrictions に記述されています。



`smtpd_client_restrictions` だけ設定しておけば大体OKやん、って思いました。
TypeScript で Google Cloud Functions やりたい人向けのテンプレートをつくった

TypeScriptでCloud Functionsをやるときに毎回同じようなことを書いていたので、テンプレートを作りました。※Firebaseコマンドで　Firebase Functions をやるときは JavaScriptかTypeScriptか選択することができます。

## リポジトリ
https://github.com/flatfisher/cloud-functions-typescript-template

オススメの設定や何か問題などあればIssueやプルリクエストをいただけると嬉しいです:smile:

## 下準備
configを変更します。 runtimeの違いによって動作しない機能もございますので　、詳しくは[ドキュメント](https://cloud.google.com/functions/docs/?hl=ja)をご参照ください。

```json:package.json
"config": {
    "function_name": "helloWorld",
    "region": "リージョンをいれる 例:asia-northeast1",
    "gcp_project": "GCPのプロジェクトIDをいれる",
    "runtime": "ランタイムを指定 例:nodejs8"
  },
```

## Lint

```
$ npm run lint
```

## Build
`functions/src/` に Node.js のプロジェクトがビルドされます

```
$ npm run build
```

## Test

```
$ npm install -g mocha　//　mochaがインストールされていればスキップ

$ npm run test

  Hello function
    ✓ Get 200 response

  1 passing (31ms)
```

## Deploy
Cloud Functionsにデプロイします

```
$ npm run deploy --prefix functions/src/
```

## リクエスト
デプロイ後に表示されるhttpsTriggerURLにリクエストし`Hello World`が表示されればデプロイに成功しています。

```
$ curl https://asia-northeast1-foo.cloudfunctions.net/helloWorld
$ Hello World
```
cwlのUser Guideの変更をローカルで確認する


まずは、以下のように、レポジトリをクローンし、そのディレクトリへ移動する。

```
git clone https://github.com/common-workflow-language/user_guide.git
cd user_guide
```

なにか変更をする。

jekyllがすでにはいっていれば、

```
make serve
```

と実行する。このコマンドを実行すると、http://localhost:4000 でアクセスすると、自分の変更を確認できる。

もし、jekyllをインストールしていない場合には、dockerを使うと同じようにサーバーをたてて確認することができる。

```
docker run -p 4000:4000 --rm --volume="$PWD:/srv/jekyll" -it jekyll/jekyll:3.8.5 jekyll serve
```
IntelliJ のファイルテンプレート機能でコードを自動生成して開発を楽にする

　ファイルを作った後に必ず書かないといけないコードがあれば、自動生成されるようにしたいですよね。`Lombok` みたいなプラグインもありますが、そうはいってもプロジェクト個別なデフォルトなコードがあったりします。
　デフォルトなコードを自動生成する方法はいくつかあるかもですが、私は IntelliJ のファイルテンプレート機能を使っています。

# 環境
IntelliJ IDEA 2018.1.7 (Ultimate Edition)
（昔、もっと古いバージョンでも利用できたので、今使ってる人ならまず使えるかと思います）

# ファイルテンプレート機能
　ファイルテンプレート機能といっているのは、以下の項目における設定のことです（コードテンプレート機能というのも含まれていますがこの記事では触れません）。
`Preference -> Editor -> File and Code Templates`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/218706/f7d90519-a875-7bfa-f6b8-e502892bf1f2.png)

# 使い方
構文は [Apache Velocity](http://velocity.apache.org/) テンプレート言語に沿って書きます。
例えば、`Java`（`Spring Boot`）でリポジトリを実装するときに、必ず `implements` するものや、オーバライドしないといけないものを自動で用意したいとすれば、以下のようにします。

```
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")

#set ($name = ${NAME})
#if ($name.contains("RepositoryImpl"))
import web.app.repo.BaseRepository;

@Repository
public class $name implements BaseRepository {

  @Override
  public void findOne() {
  }
}
#else
public class $name {
}
#end
```

実際には `findOne()` の戻り値が `void` や、仮引数が無いということはないと思います。
なのでこのままだとエラーになるでしょうが、補うのは簡単なので例としては気にしないことにします。

以下は、説明をつけたものです（//している文が説明）。

```
// パッケージ名
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
// 外部テンプレート（File Header.java）のインポート
#parse("File Header.java")

// クラス名を変数に退避（${NAME}のままだと.contains()などチェインできなかったので）
#set ($name = ${NAME})
// クラス名に RepositoryImpl が含まれているなら自動で生成される部分
#if ($name.contains("RepositoryImpl"))
import web.app.repo.BaseRepository;

@Repository
public class $name implements BaseRepository {

  @Override
  public void findOne() {
  }
}
// 条件に該当しない場合に生成される部分（デフォルト）
#else
public class $name {
}
#end
```

# おわりに
他にもいくつかテンプレート化したコードがあり、個人的には、大いに楽をできています。
人によっては、エディタを使いこなせば、これぐらいのコードは秒で書けるじゃんと思うでしょうし、実際に言われたこともありますが、最初からあったほうが楽だし、結構なにを書くか忘れちゃうもので……。
いったんこれで満足してますが、機能をもっと使いこなせば、もっといろいろできるかもですね。
「あなたは好きですか？」と聞いてくるクソアプリをつくった

## 「あなたは 好きですか？」

<img width="640" alt="スクリーンショット 2018-12-11 3.07.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/16065/02228542-9b1d-865c-47e7-cb14f8afce59.png">

ホームページを開いた瞬間、
本来のブラウザ以外に表示される小さな広告。

---- ポップアップ広告。

普段は誰も見向きもしないまま消す広告。

その中に

「絶対に消してはいけない と言われる 広告 がある」

そんな噂を聞いたことがありますか？

元ネタ: http://www.geocities.co.jp/SiliconValley/4358/red_room1.html

-----

## ほんへん

[クソアプリ2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app2) の 11日目です。
@merotan です！ ([twitter](https://twitter.com/renyamizuno_))

めっちゃしょうもないChrome拡張をつくりました。

が

残念ながらまだリリースされていない！！！！

ので触ってみたかったり入れてみたい人は GitHub にあるのでそこからいい感じにいれてけろけろ。

[renyamizuno/do-you-like](https://github.com/renyamizuno/do-you-like)

## なにをつくったか

「[赤い部屋](http://www.geocities.co.jp/SiliconValley/4358/red_room1.html)」を知っていますか？
flashがうわ〜ってなってたときに流行ったコンテンツの一つですね。
今じゃポップアップがブロックされるので何も出ないとか、そもそもflashが…とかであれなんですが、そういうのがあったんですよ。

でそれをChrome拡張にしました。以上です。

という感じです。

使っている技術は

- Chrome拡張
- WebComponents
    - Custom Element
    - Shadow DOM

という感じですね。
Chrome拡張だからWebComponentsガンガンいけるやん〜〜〜〜つってやってたら `window.customElements` がなんか `null` になって悲しかった。
ので [webcomponents/custom-elements](https://github.com/webcomponents/custom-elements) をつかったりした。
なぜなのか。

特に困ったのはそのへんかな？
あとは単純にやった。という感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16065/06796d97-b4e9-6489-8714-888632955421.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16065/576cfb32-4cfb-a555-ed5b-af941fb19108.png)

たまに出てきて鬱陶しい。

ウザいなぁと思って消すと、

![do-you-like.gif](https://qiita-image-store.s3.amazonaws.com/0/16065/20c71f33-8d66-9ab8-73c1-a85a2da82327.gif)

あ〜〜〜〜〜〜〜⤴

となります。

みなさんも〇〇好きですよね？

良い〇〇ライフを。
ブックマークレットメモ

# 設定内容
自分用メモ。
※随時更新中

## 画像の表示/非表示
```画像の表示/非表示.js
javascript:void(
   (function() {
      var d = document;
      if (!d.getElementById('css-add-on')) {
         var s = d.createElement('style');
         s.id = 'css-add-on';
         s.innerHTML = 
            '*{
                 color:#333333 !important;
                 background:#FFFFFF !important;
              }
             img, embed, iframe, object {
                 display:none !important;
              };'
         d.body.appendChild(s);
      } else {
         var s = d.getElementById('css-add-on');
         d.body.removeChild(s);
      }
   })()
);
```

```ブックマークレット形式.js
javascript:void((function(){var d=document;if(!d.getElementById('css-add-on')){var s=d.createElement('style');s.id='css-add-on';s.innerHTML='*%7bcolor%3a#333333 !important%3bbackground%3a#FFFFFF !important%3b%7dimg,embed,iframe,object%7bdisplay%3anone !important%3b%7d';d.body.appendChild(s);}else{var s=d.getElementById('css-add-on');d.body.removeChild(s);}})());
```

## 背景白
```背景白.js
javascript:void(
   document.bgColor = '#FFFFFF'
)
```

```ブックマークレット形式.js
javascript:void(document.bgColor='#FFFFFF')
```

## 背景画像を削除
```背景画像を削除.js
javascript:void(
   document.body.background=''
)
```

```ブックマークレット形式.js
javascript:void(document.body.background='')
```

## パスワード表示
```パスワード表示.js
javascript:(
   function() {
      var s, F, j, f, i;
      s = '';
      F = document.forms;
      for (j = 0; j < F.length; ++j) {
         f = F[j];
         for (i = 0; i < f.length; ++i) {
            if (f[i].type.toLowerCase() == 'password') {
               s += f[i].value + '\n';
            }
         }
      }
      if (s) {
         alert('このページ上のパスワード:\n\n' + s);
      } else {
         alert('このページにはパスワードはありません');
      }
   }
)();
```

```ブックマークレット形式.js
javascript:(function(){var s,F,j,f,i;s='';F=document.forms;for(j=0;j<F.length;++j){f=F[j];for(i=0;i<f.length;++i){if(f[i].type.toLowerCase()=='password') s+=f[i].value+'%EF%BC%BCn';}}if(s)alert('%E3%81%93%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E4%B8%8A%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89:%EF%BC%BCn%EF%BC%BCn'+s);else alert('%E3%81%93%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%AF%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93');})();
```

## PlainText表示
```PlainText表示.js
javascript:(
   function() {
      var  w = window.open();
      w.document.open();
      w.document.write(
         '<html><body>' +
             document.body.innerText 
         '</body></html>'
      );
      w.document.close();
   }
)()
```

```ブックマークレット形式.js
javascript:(function(){var w=window.open();w.document.open();w.document.write('<html><body>'+document.body.innerText+'</body></html>');w.document.close();})()
```
[CentOS7]さくらVPSのセットアップ

# はじめに

自分用のSandboxとして[さくらVPS](https://vps.sakura.ad.jp/?_ga=2.135786358.614442850.1544427319-1222746466.1522724326&_gac=1.94913006.1540879354.CjwKCAjw39reBRBJEiwAO1m0OQRAzG00sqZUjX1WXJ4raCTFkil5dXr_bW-Zd_cJrVBgdQnmjR3XNRoCv3YQAvD_BwE)に契約した。
ここにLAMP環境を構築したい。

いつの間にかさくらVPSに**スタートアップスクリプト**という機能が追加されていた。
今回はこれを使ってみる。

- [スタートアップスクリプトについて](https://vps-news.sakura.ad.jp/startupscripts/)

スタートアップスクリプトを**「CentOS_LAMP」**を使用する。
とりあえずインストールからセキュリティのための初期設定までをやってみる。

ちなみにローカルの環境はWindows10
SSH接続はPuTTYを使用する。

# スタートアップスクリプト「CentOS_LAMP」について

VPSのコントロールパネルに[ログイン](https://secure.sakura.ad.jp/vps/?_ga=2.31007608.614442850.1544427319-1222746466.1522724326&_gac=1.85157611.1540879354.CjwKCAjw39reBRBJEiwAO1m0OQRAzG00sqZUjX1WXJ4raCTFkil5dXr_bW-Zd_cJrVBgdQnmjR3XNRoCv3YQAvD_BwE&_bdld=W29e.ma9skAt)する。

- OSは**CentOS7 x86_64**を選択
- パスワードを入力
- スタートアップスクリプトで**[public] CentOS_LAMP**を選択

![setup.JPG](https://qiita-image-store.s3.amazonaws.com/0/322587/6e40e1e7-95d4-ddb7-20af-a95b481f1b6f.jpeg)

ステータスが稼働中になればインストール完了

## バージョン確認

SSH接続して確認する

### CentOSのバージョン確認

```
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
```
### Apacheのバージョン確認

```
# httpd -v
Server version: Apache/2.4.6 (CentOS)
```
### MySQLのバージョン確認

```
# mysql --version
mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
```

### PHPのバージョン確認

```
# php -v
PHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

# アップデート

```
# yum -y update
 ：
省略
 ：
Complete!
```
バージョンを確認する

```
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```

# まとめ

スタートアップスクリプト「CentOS_LAMP」で楽にインストールできました。
「CentOS_LAMP」を使用してインストールするとCentOS 7.4.1708がインストールされるようです。
yumアップデートで最新にすることができます。

次回は[セキュリティの初期設定](https://qiita.com/caique/items/3d63c50f9b4e92d37649)をする予定です。
LaravelでAngularを使うには？

Vue.jsやReactと違ってphp artisan presetなど公式的な共存がサポートされていないLaravelとAngularの組み合わせに関して試行錯誤したまとめ

Composer及びAngular CLIの導入は済んでるという前提にて

Laravelプロジェクトの作成

```terminal
$ composer create-project laravel/laravel laravel_angular "5.7.*"
$ laravel_angular
```
今回デフォルトで入っているVue.jsは不要なので間引く（干渉はしないと思うけど念のため）

```diff:resources/js/app.js
-window.Vue = require('vue');

-Vue.component('example-component', require('./components/ExampleComponent.vue'));

-const app = new Vue({
-    el: '#app'
-});
```

以下の手順で間引いた場合bootstrapの正常動作が壊れたので却下(bootstrap.jsにjqueryの再追記が必要)
~~$ php artisan preset none~~
~~$ php artisan preset bootstrap~~

resourcesディレクトリにangulerプロジェクトを配備

```terminal
$ cd resources
$ ng new anguler
$ cd angular
```
Angularビルド時の出力先変更
Laravel-mixとAngular CLIの統一は難しそうなので
今回は/public/js/と/public/ng/は分ける事にする

```diff:angular.json
-"outputPath": "dist/angular",
+"outputPath": "../../public/ng",
```
簡単のためLaravelのAuth機能を利用.env設定は省略

```terminal
cd ../..
php artisan migrate
php artisan make:auth
```

resources/views/layouts/app.blade.phpとresources/views/home.blade.phpの書き換え

```diff:resources/views/layouts/app.blade.php
+    <script src="{{ asset('ng/runtime.js') }}" defer></script>
+    <script src="{{ asset('ng/polyfills.js') }}" defer></script>
+    <script src="{{ asset('ng/styles.js') }}" defer></script>
+    <script src="{{ asset('ng/vendor.js') }}" defer></script>
+    <script src="{{ asset('ng/main.js') }}" defer></script>
</body>
```


```diff:resources/views/home.blade.php
You are logged in!
+<br />
+<app-root></app-root>
```

ログイン後のホーム画面にて以下の表示により動作確認とした
![lara-ng.png](https://qiita-image-store.s3.amazonaws.com/0/314532/13b895a1-8780-1971-55bd-fccebbb920a2.png)

またAngularソースtsを自動にビルドする場合はangularのディレクトリにて以下のコマンドを実行する

```terminal
ng build --watch
```

###本格的にやってそうなところのリンク
本記事とやり方は違いますが本格的にやってそうな所が何件かあったのでリンク集
[laravel-angular](https://laravel-angular.io/)
[Angularを使えるLaravel環境を作る。あとcralityも使う。](http://tech.innovation.co.jp/2018/01/14/building-environments-laravel-54-with-angular-4-and-crality.html)
[【Laravel】【Angular】Laravel+AngularでTodoアプリを作りながら勉強した](https://www.rinsymbol.net/entry/2018/03/26/121500)
ReactNative + Firebase + RealtimeDatabase で componentDidMount内でデータの読み取りをしsetStateをする方法


###とりあえず正常に動くソースコード
```javascript
    componentDidMount() {
        firebase.database().ref("images/").on("value",this.handlePostUpdate);
        //firebaseの部分は各々違います
    }

    handlePostUpdate = (snapshot) => {
        this.setState({
            data:Object.values(snapshot.toJSON()),
        });
    }
```
このように記述することで、エラーが起こることなく望んだ処理を行うことができました。


一応、ついでにつまずいていた時のコードを下に書いておきます。

###エラーがでてしまっていたコード
```javascript
    componentDidMount() {
        firebase.database().ref("images/").on("value",function(snapshot) {
            this.setState({
                data:Object.values(snapshot.toJSON()),
            });
        })
    }
```
このようにするとなぜか、

```
this.setState is not a function
<unknown>
    C:\Users\kim-sangwoo\expoapp\sns-sample\scenes\TimelineScreen.js:57:13
<unknown>
    
exceptionGuard
    C:\Users\kim-sangwoo\expoapp\sns-sample\node_modules\@firebase\database\dist\index.cjs.js:700:12
EventList.raise
    
EventQueue.raiseQueuedEventsMatchingPredicate_
    C:\Users\kim-sangwoo\expoapp\sns-sample\node_modules\@firebase\database\dist\index.cjs.js:9685:17
EventQueue.raiseEventsForChangedPath
    
Repo.onDataUpdate_
    C:\Users\kim-sangwoo\expoapp\sns-sample\node_modules\@firebase\database\dist\index.cjs.js:12774:13
PersistentConnection.onDataPush_
    C:\Users\kim-sangwoo\expoapp\sns-sample\node_modules\@firebase\database\dist\index.cjs.js:12083:18
PersistentConnection.onDataMessage_
    C:\Users\kim-sangwoo\expoapp\sns-sample\node_modules\@firebase\database\dist\index.cjs.js:12063:4
Connection.onDataMessage_
    C:\Users\kim-sangwoo\expoapp\sns-sample\node_modules\@firebase\database\dist\index.cjs.js:11340:13
```
**this.setState is not a function**というエラーが出てしまいました。
blobfuseつかってみた①～blobfuseとは？～

blobってストレージだよね？fuseってなんかきいたことあるような・・という感じからblobfuseをつかってみました:wink:
ひとまず①はblobfuseってなんじゃらふぉいというせつめいデス。


#Blobfuseとは
##ざっくりいうと…AzureBlob用のドライバ
さすがにAzureBlob用のドライバはざっくりしすぎですが、
BlobfuseとはAzureBlobStorage向けの仮想ファイルシステムを提供するためのLinux用のドライバです。オープンソースプロジェクトで開発されています。

(公式サイト) https://github.com/Azure/azure-storage-fuse(英語)

## でも、なぜ仮想ファイルシステム用のドライバが必要なの？
Azure Blob Storage はオブジェクト ストレージ サービスであるため、Rest API経由でファイルを操作し、 "/"で区切った階層的な名前空間を持っていません。(＝ファイルシステムがありません。)

ファイルシステムがないということはLinuxから利用しようと思ってもマウントできず、ファイルシステムがないのでmkdirしたりrenameなどでファイル名変更したりもできないんです:persevere:

## そこで登場するのが Blobfuse デス。
大容量でお得なBlobStorage。RestAPI経由で操作するだけでなく、マウントしてファイル操作したいこともありますよね。そんな要望を実現するのが**Blobfuse** デス。

#Blobfuse 仕組み

BlobfuseはLinux FUSE カーネルモジュールと通信するためのオープンソースライブラリ **libfuse** とAzure Storage Blob REST APIとを利用して、Blobストレージにフォワードスラッシュ '/' を区切り記号とした仮想ディレクトリ スキームによってこの名前空間を提供します。

# Blobfuse 用法
公式ドキュメントからの抜粋になりますが、仮想ファイルシステムとしてマウントする以外にも下記のような用法があります。
Blob読み書きのキャッシュとして利用できるのは便利ですね:relaxed:

**機能(公式ドキュメント翻訳)**
- Linux上でのBlobストレージコンテナーのマウント
- Linuxのよくあるファイルシステムオペレーションの実現
　(mkdir, opendir, readdir, rmdir, open, read, create, write, close, unlink, truncate, stat, renameなど)
- アクセス時間を改善するためのローカルキャッシュ
- 大きなBlobへ高速にアクセスのための並列ダウンロードおよびアップロード
- 読み取り専用で複数のノードが同じコンテナをマウント



# 制約事項
Blobfuseはあくまで仮想的にファイルシステムを実現するドライバのため、標準仕様のposixに準拠していないことがあります。OSのファイルシステムの仕様=Blobfuseの仕様ではありません。
公式ページに使用が記載されていますのでご利用の際は検証の上ご利用ください><

# 次回は・・
お待ちかねのBlobfuseのインストール作業に入っていきます。

#参考ドキュメント
・[blobfuseソースコードリポジトリ](https://github.com/Azure/azure-storage-fuse)
・[blobfuse を使用して Blob Storage をファイル システムとしてマウントする方法](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-how-to-mount-container-linux)(MS公式)
分かりやすい心理的安全性ガイドラインの絵本を作りたい ( 年齢差とインナーサークル )

[心理的安全性ガイドライン（あるいは権威勾配に関する一考察） - Qiita](https://qiita.com/hirokidaichi/items/5d8c4294083d85654a04#%E5%B9%B4%E9%BD%A2%E5%B7%AE)

# 引用

>しばしば、誤解されがちなのですが、「敬意を持って接する」ことと「インナーサークルから排除する」ことは異なります。気を遣って、年齢差のあるメンバーを何かの同僚間のイベントに誘わなかったり、コミュニケーションに壁を設けたりするのは、それは単なる排除であって気を遣っているのとは違います。

# インナーサークルとは？

「仲間内の集まり」「無形のグループ」というような意味で使われている気がした。


# やってみよう

- 年齢差があっても、敬意を持って接する
- 年齢差があっても、仲間の輪に入れる、あるいは入る (そのことを遠慮しない)
- 年齢を理由にコミュニケーションに壁を作らず、人間同士として分ける隔てなく接する

# イメージ

上下関係ではなく、対等な関係。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d57373b8-7daa-a435-dc8a-a9ad956666cd.png)




[心理的安全性yumainaura - Google Search](https://www.google.co.jp/search?q=%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7yumainaura&oq=%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7yumainaura&aqs=chrome..69i57.3580j1j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[VB.NET] くくってから Join()


## はじめに

Join() 関数は文字列配列を結合してくれますが、引用符でくくってから結合したいときがあります。

たとえば CSV 文字列を作る際にダブルクォーテーションでくくってからカンマで結合したい場合などです。

Join() 関数に似た使い方ができるような新しい関数を作ってみます。

## スニペット

```vb
Public Shared Function JoinWithQuotation(ByVal SourceArray As String(),
                                         Optional ByVal Delimiter As String = " ",
                                         Optional ByVal Quotation As String = """") As String
    Dim quotedStrings As String() = SourceArray.Select(Function(s As String) Quotation & s & Quotation).ToArray()
    Return Join(quotedStrings, Delimiter)
End Function
```

または

```vb
Public Shared Function JoinWithQuotation(ByVal SourceArray As String(),
                                         Optional ByVal Delimiter As String = " ",
                                         Optional ByVal Quotation As String = """") As String
    Dim quotedStrings As String() = Array.ConvertAll(SourceArray, Function(s As String) Quotation & s & Quotation)
    Return Join(quotedStrings, Delimiter)
End Function
```

## さいごに

※ .NET 3.5 以降なら動くと思います。

参考：[c# - Join list of string to comma separated and enclosed in single quotes - Stack Overflow](https://stackoverflow.com/questions/6934629/join-list-of-string-to-comma-separated-and-enclosed-in-single-quotes)

キーワード：Join array with single or double quote quotes quotation
GCRからimage pullできない

絶対に忘れるのでメモ


### GCRからimage pullできる状態
- GCRに目的のimage:tagがある
- image pullしようとしているIAMユーザーで認証済みである
- image pullしようとしているIAMユーザーに `Storage Object Viewer` のRoleが付与されている

### GCRからローカルへimage pullできない

https://cloud.google.com/container-registry/docs/pushing-and-pulling#before_you_begin

IAMの権限が足りていないかアカウントが間違っていると思われるのでIAMの権限を確認して再認証する。

```console
$ gcloud auth configure-docker

The following settings will be added to your Docker config file
located at [/Users/ota/.docker/config.json]:
 {
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}

Do you want to continue (Y/n)?  Y

Docker configuration file updated.
```

docker pull

```console
$ docker pull gcr.io/repository/image:tag
a5a6f2f73cd8: Pull complete
6fd77ab8da06: Pull complete
38f41ceffa9f: Pull complete
0780bb3d4637: Pull complete
3fc5d8beb4e0: Pull complete
0b99174e07e3: Pull complete
3e4d69c9cf58: Pull complete
63a70b7812b2: Pull complete
0186376c89a6: Pull complete
Digest: sha256:ca61918b0f9f20a062c55e68219a811bca09dd052046eba929933411bcc97060
Status: Downloaded newer image for gcr.io/repository/image:tag
```

### GKEへデプロイしたpodsがImagePullBackOffになる

これはGKEのノード(GCE)に設定されているサービスアカウントの権限が足りていないためIAMにてGCR(もといGCS)のViewer権限を追加することで解消する。

https://cloud.google.com/container-registry/docs/access-control

>
the Compute Engine default service account of another project. This account is used by the Google Kubernetes Engine to pull container images clusters by default. It is in the form [PROJECT_NUMBER]-compute@developer.gserviceaccount.com, where [PROJECT-NUMBER] is the GCP project number of the project that is running the Google Kubernetes Engine cluster.

とあるのでIAMの設定で
`[PROJECT_NUMBER]-compute@developer.gserviceaccount.com` に `Storage Object Viewer` の権限を付与すればOK。

<img width="1543" alt="iam.png" src="https://qiita-image-store.s3.amazonaws.com/0/97541/f7a0d170-38ac-f9fe-16db-856db1d102b0.png">


### Cloud Buildでもimage pullに失敗する
GKEと同様
Cloud Buildのサービスアカウント `[PROJECT_NUMBER]-cloudbuild.gserviceaccount.com` に`Storage Object Viewer` の権限を付与すればOK。
Chart.jsのグラフをvue.jsを使って書いてみた1

##Chart.jsを使った経緯
サイトのページにグラフを入れたいと依頼を受けて、
wpの管理画面でカスタムフィールドに値を入れてもらってそれをjsで拾って描画すればいいやーって実装しました。

それはお仕事でコード紹介できないから最近触り始めたvueで記事を書きます。

##HTML

まずはCDNでchart.jsとvue.jsをサクッと読み込ませる

```html:index.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```


そしてhtmlに描画するcanvasを追加

```html:index.html
<div id="app">
	<canvas id="chart"></canvas>
</div>
```

##js

jsを書いていきます。
グラフに使用するデータを定義

```js
	new Vue({
		el: '#app',
		data: {
			chartLists: [
				{ name: 'たんぱく質', color: '#2ecc71', data: 10 },
				{ name: '炭水化物', color: '#3498db', data: 30 },
				{ name: 'ビタミンA', color: '#95a5a6', data: 3 },
				{ name: 'ビタミンB', color: '#9b59b6', data: 17 }
			]
		}
	});
```

そしてmethodsを書いていきます。

```js

		methods: {
			listCategoryCreat: function (target) {
				//グラフを描画するために連想配列を普通の配列に変換
				var targetList = this.chartLists.map(function (arr) {
					return [arr[target]]
				}).reduce(function (a, b) {
					return a.concat(b);
				});

				return targetList;
			},
			creatChart: function () {
				var labelList = this.listCategoryCreat('name');
				var colorList = this.listCategoryCreat('color');
				var dataList = this.listCategoryCreat('data');

				//グラフ描画
				config = {
					type: 'pie',
					data: {
						labels: labelList,
						datasets: [{
							backgroundColor: colorList,
							data: dataList
						}]
					}
				};
				chart = new Chart(document.getElementById('chart').getContext('2d'), config);
			}
		}
```

まず

```js
	listCategoryCreat: function (target) {
                //グラフを描画するために連想配列を普通の配列に変換
                var targetList = this.chartLists.map(function (arr) {
                    return [arr[target]]
                }).reduce(function (a, b) {
                    return a.concat(b);
                });
                return targetList;
            }
```

vueのdataにある「chartLists」が連想配列なので配列に変換してあげます。

配列にした要素をグラフの設定として「config」に入れてあげる。
そして描画をおこなう。

```js
			creatChart: function () {
				var labelList = this.listCategoryCreat('name');
				var colorList = this.listCategoryCreat('color');
				var dataList = this.listCategoryCreat('data');

				//グラフ描画
				config = {
					type: 'pie',
					data: {
						labels: labelList,
						datasets: [{
							backgroundColor: colorList,
							data: dataList
						}]
					}
				};
				chart = new Chart(document.getElementById('chart').getContext('2d'), config);
			}

```

ページ読み込み時にmethodsを実行させてあげなきゃいけないのでmountedをします。

```js
mounted: function () {
	//画面読み込み時に実行
	this.creatChart();
}
```

出来たものがこちらです
https://jsfiddle.net/dqnsan/5zrf6whv/

次はボタンを押下してグラフに要素を追加するを書きますー
分かりやすい「心理的安全性ガイドライン」の絵本を作りたい ( 下から上への情報の透明性 )

[心理的安全性ガイドライン（あるいは権威勾配に関する一考察） - Qiita](https://qiita.com/hirokidaichi/items/5d8c4294083d85654a04)

# 心理的安全性が低い時の弊害

>心理的安全性が低いチームにおいては、現場で発生した問題や課題はしばしば隠蔽され、意思決定者の耳目に入らなくなります。

>小さな嘘のようなものが組織中に蔓延するようになります。

## 例えるなら？ 怯えたギャングの反乱

お互い疑い合っているから、ボスも裏切ろうとする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fab926ed-8a4e-bb6e-1f42-da71becb0d24.png)



# エンジニアに必要なことは

>「些細な問題」でも報告し合い、「本質的な課題に向き合う」



#link

[心理的安全性yumainaura - Google Search](https://www.google.co.jp/search?q=%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7yumainaura&oq=%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7yumainaura&aqs=chrome..69i57.3580j1j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Raspberry Pi 3B+]wlan0がifconfigで見えない時の対処法

# 出会った症状
raspberrpi3B+でwifiがつながらない問題が発生しました。
ifconfigで見てもwlan0が存在せず、今までのラズパイとは違った現象が発生していました。
# 開発環境
Raspberry Pi 3B+
Linux raspberrypi 4.14.62-v7+
# 解決方法
raspbianのOS側でwifiの機能を止めてしまっていることがあるようです。
以下のコマンドで調べることができます。

```bash:command
sudo rfkill list all
```


```実行結果
0: phy0: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
1: hci0: Bluetooth
        Soft blocked: yes
        Hard blocked: no
```
遭遇したものでは上記のような出力結果になっていました。

この場合は、

```bash:command
sudo rfkill unblock all
```

上記のコマンドを実行するとifconfigでwlan0が出現するようになります。

コマンド実行後は

```bash:command
sudo dhclient wlan0
```

こちらのコマンドも実行してください。
JavaScriptで端末の画面回転角度を取得する

仕事中に詰まったのでメモ

# 画面の回転を取る方法

```javascript
const angle = window.screen.orientation.angle;
```

## ベンダー対応版
- mozOrientation
- msOrientation

```javascript
const _screen = window.screen;
const _orientation = _screen.orientation || _screen.mozOrientation || _screen.msOrientation;
const angle = _orientation.angle;
```

## iOSのSafariも対応版
- iOS/Safariは、Screen Orientation APIに非対応
    - `window.orientation` を使う

```javascript
const _screen = window.screen;
const _orientation = (_screen 
	&& (_screen.orientation || _screen.mozOrientation || _screen.msOrientation))
	|| ('orientation' in window && {angle: window.orientation})
	|| null;
if (!_orientation || typeof _orientation.angle !== 'number') {
	// 取得失敗
}
const angle = _orientation.angle;
```

一応これで全端末対応できるはず

## 2019-06-19追記
window.orientationをそのまま評価すると、 `0`(回転していない)の時にfalse扱いとなりiOSで正しく取得できない問題があったので修正しました
【WEBエンジニアとASVS 参（V2）】

[前回](https://qiita.com/scn7188/items/6e456e34a7cdba90cc0b)の続きからです。

今回の記事を書くにあたっての経緯などです。
[ASVSとは](https://qiita.com/scn7188/items/e108b812efb869a2747d)
本記事で紹介している内容（各No）は自分で作った資料のNoをもとにしています。

#V2：認証に関する検証要件

##No.18 知識に基づく質問("秘密の質問")を実装する必要がある場合，アプリケーションを保護できる十分強固な質問である
”秘密の質問”について調べてみると、そもそもそんなに強固ではないみたいですね。
[参考](http://www.itmedia.co.jp/enterprise/articles/1803/09/news007.html)
実装する場合は以下の点に気を付けて設問するようにすれば大丈夫かと
・SNSなどで収集できない（出身学校、ペットの名前）
・ありきたりな回答にならない（好きな食べ物）

##No.21 よくあるパスワードや弱いパスフレーズの使用を禁止する対策がとられている
[こういった](https://www.formget.com/password-strength-checker-in-jquery/)jqueryライブラリを使用する。
また、「強固なパスワード例（P@ssw0rd）」「IDと似たようなパスワード」など簡単に推測できるような物を禁止する処理も同時に行う。

##No.22 成功，失敗にかかわらず，認証要求に対する応答が同じ平均応答時間で返される
レベル3の事項です。（気になったので）
ログインIDの一致、不一致でレスポンスに大きな差異があるだけで、そのIDが存在するのかが判明してしまいます。
ここは大きな誤差が生まれない範囲で作りましょう。
（難しければsleepなどで調整）

```php:sleep.php
<?php
sleep(5); // 5秒間待つ
usleep(5000000); // 5秒間待つ
?>
```



###No.24 ユーザが認証を行うことをアプリケーションが許可する場合，安全性が実証されている認証メカニズムを使用する
パスワード認証はもちろんですが、それに加えて「Google+」「Facebook」「YahooID」などのアカウント連携を使用する方法があります。
また、パスワード認証と共に「reCAPTCHA」を使えばさらに強度が高まる。

###No.26 信頼できない第三者が管理インターフェイスにアクセスできない
管理画面へはIP制限やログイン中の権限などの認証も掛けること。
また、その際にエラー画面として表示するメッセージは「404 Not Found」とすること。
「ドメインが違うから大丈夫」「URLを公開していないから大丈夫」ではいずれ破られます。

これでV2のレベル１（例外あり）は終了です。
次回は「V3：セッション管理に関する検証要件」に入ります。

  ▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽
  [ASVS 3.0.1まとめ - Google スプレッドシート](https://docs.google.com/spreadsheets/d/1wGC9sF2gZoHnGKJt2mIJrb_Cr0bqETl9r07s_YQFWK8/edit?usp=sharing)
  ▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△
CSVデータをselectする

# CSVデータをselectする
先日 [Rainbow CSV](https://github.com/mechatroner/rainbow_csv) を試しました
SQL **風** なRBQLでデータをselectできるのですが、あくまで「風」なので知っているSQLとは違うのが難点です

突然、話は変わりまして[Carlo](https://github.com/GoogleChromeLabs/carlo) を試してみたい気持ちがありました

「CSVをselectしたい」 + 「Carloをためしたい」 = 簡易的なUIのあるCSVをselectできるツールを作成しました

# ツール
とりあえずできたという状態でコードは整理中です
https://github.com/abetomo/csv-select

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/3800/cccc021c-6bdb-8127-3cff-fb354247104a.gif)

# まとめ
内容がなくて恐縮ですが、タグ付けしたライブラリたちを利用して、CSVをselectできるものを作成して満足したので記事を書きました

# 参考
* [carlo + parcelでお手軽デスクトップアプリケーション](https://qiita.com/erukiti/items/30a6b2fff378fc67e98a)
* [Vue.js + TypeScript + Parcel のボイラープレート作ってみた](https://qiita.com/teinen_qiita/items/19e63bed144c7b8a680f)
ShinoBOTファミリーの紹介

本ブログは[セキュリティツール系Advent Calendar](https://adventar.org/calendars/2968)の3日目です。
本記事では筆者の開発プロジェクトであるShinoBOTファミリーのご紹介をします。各コンポーネントの詳細は別記事に記載予定です。

#ShinoBOTファミリーとは
ShinoBOTファミリーはテスト用の疑似マルウェア群の総称です。

###メインのコンポーネント

|ツール名|概要|公開年|
|-----------|------------|------------|
|ShinoBOT|バックドアシミュレーター|2013年|
|ShinoBOT Suite|APTシミュレーター|2014年|
|ShinoLocker|ランサムウェアシミュレーター|2015年|
|ShinoBOT.ps1|バックドアシミュレーター|2017年|
※以下のサイトから各疑似マルウェアのページを参照することができますが、組織によってはURLフィルターなどで検知される可能性があります。観閲の際はご注意ください。
https://shinosec.com/

#開発の動機
仕事で未知のマルウェアを検知するセキュリティ製品を評価する必要があり、Metasploit/metapreterやインターネットで入手した検体を利用していたが、「未知のマルウェア」としてのテストはできなかったため、開発しました。

#公開の動機
Black Hat USA 2013に参加者登録しようとした際、Call For Toolsというバナーが見えて、ダメ元で応募したところ、当選したのがきっかけです。現在は以下の問題点の解決を試みたく、公開を継続しています。

### 解決したい課題（ポエム）
マルウェアを起点とする攻撃を検知・対処するセキュリティ製品は溢れかえっています。各製品の検知ロジックは異なっており、検知率、過検知率は当然異なります。さらに運用での観点でもあるアウトプット（ログ、アラートなど）も異なります。つまりユーザの要件、成熟度、導入済み製品によって選択すべき製品は変わり、評価の過程で製品ごとの違いを見つけなければなりません。高度なスキルを持ったユーザであればそれは可能ですが、そうではないユーザは残念ながらベンダーが「自称」しているスペックを鵜呑みにした上で、謝った選択をする可能性があります。

誰でも簡単に「それなりに」高度な攻撃をシミュレーションできれば、必要な製品を適切に選択できるのではないかと考えています。

そのため、ShinoBOTファミリーは簡単で誰でも安全に扱えるような設計を意識しています。例えば、マルウェアのC&Cサーバ（司令塔サーバ）はクラウドで提供されており、わざわざ自分で建てる必要はございません。攻撃者側のアクティビティはすべてWebブラウザで完結します。

#用途
1.セキュリティ製品の評価
2.インシデントレスポンスチームの訓練
3.教育
4.サイバー攻撃のデモ
5.研究用マルウェア

#おわりに
なんとなくShinoBOTファミリーの概要をわかっていただけましたでしょうか？次回はそれぞれのコンポーネントの詳細を見ていきたいと思います。
Firebase Authenticationを使用して出来るだけソースを書かずにログインを実装する

# 初めに
既にありそうな記事ですが、忘れない様に記事にしておきます。
Swift4・Firebase Authenticationでメールアドレス/パスワードによるログインを実装します。
多分、これが一番楽だと思います()

## プロジェクト作成
プロジェクト作成します。
今回は、Single View Appで作成(今回はFirebaseLoginSampleというプロダクト名)


## Firebase側のプロジェクト作成
https://console.firebase.google.com/
プロジェクトを追加
プロジェクト名は、さっきのプロダクトネームを今回は入力しました。
チェックボックスは全部外していいと思います。
(必要あれば入れてください)
その後、左メニューからAuthenticationを選択。
ログイン方法をクリック
今回はメール/パスワードにするので、それを有効にする。


##  Firebaseのライブラリを導入する
プロジェクトオーバービューを選択すると、開始するにはアプリを追加してくださいと表示しているところがあるので
そのラベル上にあるiOSを選択
Bundle IndentifierをiOS バンドルIDに入力
その後は手順通りで進めてください。
以下、注意点。
plistファイルの位置はinfo.plistと同じ位置に
PodfileはAuthenticationに使うライブラリも一緒に記載しておく。

```text
pod 'Firebase/Core'
pod 'FirebaseUI/Auth'
```

疎通確認がうまく行かない時は、何回かビルドして放置していると動きます。
または、アナリティクス収集を無効にしているとうまく動かないかもしれません。

##  ログイン部分をソースで
ViewController.swiftを以下の様に修正

```swift
import FirebaseUI
import UIKit
class ViewController: UIViewController,FUIAuthDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        DispatchQueue.main.async {
            let authUI = FUIAuth.defaultAuthUI()
            authUI?.delegate = self
            let authViewController = authUI?.authViewController()
            self.present(authViewController!,animated: true, completion: nil)
        }
    }

    func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
        if(error == nil) {
            //成功時の処理記述
        }
    }
}
```

これで初期登録・ログインが行えます。

### 最後に
文字ばっかで分かりづらくてすみません・・・。
今度からスクショを適時追加しようと思います。

また、今時メールアドレスとパスワードでログインっていうのもあれですし
あったとしても端末の生体認証使えばログイン出来るっていうのがデファクトスタンダードだと思います。
なので、実際使うときはこの画面は使わないのかなと思いつつ
実はこういう画面を用意されているよというメモでした。


### 参考
https://firebase.google.com/docs/auth/ios/firebaseui?hl=ja
僕が思うとても便利なVSCodeプラグインたち

この記事はMicroAd Advent Calendar 2018の14日目の記事です。

# はじめに
ほんとうはSublimeTextを使いたいのですが、~~そろそろライセンスも気になり~~ 非常に高機能な同等のエディタが登場したので、半年くらい前に乗り換えてみました。（でも十分お世話になったのでSublimeTextのライセンスは買いますよ）
浅い歴ではありますが、個人的に便利だと思うプラグインをご紹介いたします。

# 僕が思うとても便利なVSCodeプラグインたち
## Sublime Text Keymap and Settings Importer
https://marketplace.visualstudio.com/items?itemName=ms-vscode.sublime-keybindings
これがあるからサクッと乗り換えたようなものです。
正直動作はVScodeよりもSublimeTextの方がサクサク動くんじゃないかと思えますが、使い慣れたショートカット類（"Command+D", "Command+U", "Command+K"）が他のエディタでも使えるというのは感動。

心まではまだVSCodeに支配されていないようです。

## Local History
https://marketplace.visualstudio.com/items?itemName=xyz.local-history
Eclipseを使ってる人はピンとすぐ来ると思いますが、
変更履歴がgit管理などしなくても自動で行ってくれます。
むやみにファイルがたくさん作られるので、好き嫌いが分かれるプラグインですが
個人的には重宝しています。（過去の変更履歴と差分比較できるのもありがたい）
ちなみに`.history`というディレクトリが作られてしまうので、VSCode上の設定`Files: Watcher Exclude`で非表示にしたり、gitの`excludesfile`で管理対象外とするような手間が、Install直後にちょっとだけあります。手間のかかる子ですが初回だけなので許してやってください。

## Code Spell Checker
https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker
みなさんはコーディング中にTypoすることはありますか？
私は変数名でTypoしまくりまくってレビュー指摘がTypoの指摘だらけになったりします。
反省はしていますよ。。。えぇ。。。
ですが、これを入れてからのコーディングはTypoが減り気持ちよく仕事ができています。
（心なしか腰痛も減った気がします）
明らかな社内用語や略語もバシバシ指摘してくれますが、そこは自分で精査できるので（私は）苦になりません。

## indent-rainbow
https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow
コーディングしているとインデントって、やっぱり大事じゃないですか。
とくにPythonとか書いてるとインデント間違いが命取りに。。。
（他の言語だってインデント間違ってたら即レビュー指摘ですけどね）
でも、このプラグインを使うとキレイにインデントを色分け表示してくれるので自身で誤りに気付きやすくなります。
しかも、いい感じの主張しすぎない色分けが好感触。
他人のコードを読むときも、非常に読みやすくなります。

## TODO Highlight
https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight
みなさん、コードに`TODO:`や`Fixme:`って入れたらハイライトされてくれないと落ち着かないですよね？
すべての人の同意は得られないと思いますが、私はハイライトされて欲しいです。
そんな悩みをこちらのプラグインが解決してくれます。
Eclipseになれた世代は必需品とも思えるようなプラグインですね。

## Bracket Pair Colorizer
https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer
超能力でもあるんじゃないかと思えるくらい括弧での間違いを起こさない人たちって居ますよね？
私はそんな能力をもっていないので括弧での失敗例はたくさんあります。ネストなんてされた日には10戦9敗くらいです。
こんな私のために作られたんじゃないかと思えるくらい便利なプラグイン。
これで、括弧に負けることが減りました。

## VS Color Picker
https://marketplace.visualstudio.com/items?itemName=lihui.vs-color-picker
20年間エンジニアをやってますが、さすがにRGB Color Codeを何も見ずに答えた人には出会ったことがありません。
当然私もわかりません。
そんな私はHTMLやCSSでの色指定はこのColor Pickerでなんとかします。

# 終わりに
いかがでしたでしょうか？
個人的には言語サポート系のプラグインをあえて外すことで、
「きほんの"き"」よりはもう一つ踏み込んだ紹介をしたつもりです。

１つでも皆様のお役に立てたなら幸いです。
Galaxy Serverを手元のコンピューターで動かしてみよう

# Galaxy Serverを手元のコンピューターで動作させてみよう

前回はGalaxyの公共サーバーで動作させる方法について触れたので、今回は手元のコンピューターで手軽にGalaxyを動作させる方法について紹介する

一からGalaxyをインストールして手元で動作させる方法に比べて、DockerやVirtual Machineを利用する方がずっと容易なので、ここではDockerを利用する方法に基づいて紹介する

# DockerでGalaxyを利用しよう
## Dockerを手元のコンピューターにインストール
まずはDockerを手元のコンピューターにインストールする

Docker Inc.　で OS X用やWindows用のDockerを入手できる
ユーザー登録してインストールしよう
https://www.docker.com/products/docker-desktop

Dockerそのもののインストール手順については多くの人が書いているので、詳細はその記事を参照して欲しい

##Galaxyの環境構築

OS XやLinux上で動作させるなら
@youyuh48 さんの記事[バイオインフォマティクス解析環境のGalaxyをMacのDockerで動かしてみる]
(https://qiita.com/youyuh48/items/0745d8dad978bd819f94)を参照しよう

Windowsで動作させる場合も基本的には同じだがディレクトリの指定方法等が異なるので、Windows 上で Dockerを利用する解説に従って欲しい

##Galaxyが動作したら必ずすること
### admin のパスワードを変更する
まずはadminのパスワードを変更しよう

Docker imageを最初に起動した際には管理権限を持っているユーザーが

ID: admin@galaxy.org
password: admin

で利用できる

手元のPC以外からアクセスしたユーザーに上記の管理権限を利用されないために、adminユーザーのパスワードを変更しておこう

まずは上記のIDとpasswordでgalaxyにログイン

ログイン後上部メニューの
User => Preferenceをクリックし
表示されるウィンドウの"Change password"をクリックしてパスワードを変更しておく

これでとりあえず手元のコンピューターでGalaxyが動作するようになった

今回はここまで:smile:
Shist_JISのPHPファイルが文字化けした際に解決したPHP関数


php.iniの状態
default_charset = "Shift_JIS"

-

```php:test.php
<?php
    mb_language("ja");
    mb_internal_encoding("SJIS");
    mb_http_input("SJIS");
    mb_http_output("SJIS");

?>
```
Firefoxのブラウザ内検索で部分一致ができなくなった対応

できなくなって不便！と思ってたら画像の赤枠内を知らないうちに押下して完全一致にしていた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60220/573f4fcb-984c-e861-63bf-700e4724aa21.png)
aws-sdk-jsでAWS StepFunctions(に限らない)を非同期実行する

## StepFunctionsを結果不要で呼び出したい
AWS Lambda（Node.js）からAWS Step Functionsを起動する際に結果が不要でハンドリングも不要なシーンがありました。

LambdaのInvokeであれば `InvocationType` に `Event` を指定すれば非同期実行となりますが、StepFunctionsのstartExecutionにはそのようなオプションはありません。

### AWS.Requestを使う

StepFunctionsに限らず、第2引数のcallbackを省略して戻り値の `AWS.Request` の `send` メソッドを利用するとイベントループに残さずに非同期実行できます。
イベントループに残らないので、結果が出るまで無駄にLambdaの処理が課金されることがありません。（`callbackWaitsForEmptyEventLoop`はあまり変更したくない）

```
const params = {...};
stepFunctions.startExecution(params).send();
```