OmniAICreator/Qiita-1.07M huggingface dataset:
AWS CLI --queryオプションでの出力形式の違いについて

以下をおさらいする：[How to Filter the Output with the --query Option - Controlling Command Output from the AWS Command Line Interface - AWS Command Line Interface]
(https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html#controlling-output-filter)

### おさらい

フィルタ前のオリジナル出力は以下であるとする(上記ドキュメントより抜粋)。

```
$ aws ec2 describe-volumes --query 'Volumes[0]'
{
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
        {
            "AttachTime": "2013-09-17T00:55:03.000Z",
            "InstanceId": "i-a071c394",
            "VolumeId": "vol-e11a5288",
            "State": "attached",
            "DeleteOnTermination": true,
            "Device": "/dev/sda1"
        }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
}
```

ドキュメントより、これをフィルタする例の一つ目。これを見て、AvailabilityZoneという変数名がAZになるのはなぜか、そうしなければいけないものなのかという疑問が湧いた。

```
$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}'
[
    {
        "InstanceId": "i-a071c394",
        "AZ": "us-west-2a",
        "ID": "vol-e11a5288",
        "Size": 30
    },
    {
        "InstanceId": "i-4b41a37c",
        "AZ": "us-west-2a",
        "ID": "vol-2e410a47",
        "Size": 8
    }
]
```


この疑問を解消するのにドキュメントの次の例を見ると良かった。

```
$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]'
[
    [
        "vol-e11a5288",
        "i-a071c394",
        "us-west-2a",
        30
    ],
    [
        "vol-2e410a47",
        "i-4b41a37c",
        "us-west-2a",
        8
    ]
]
```

こちらの例は出力jsonに変数名を含まない。これは`--query`に指定したオプションの違いによる。

1つ目の例では出力jsonをディクショナリオブジェクトとして指定している(queryの中の`{ID:VolumeId,...,Size:Size}`の中カッコ)。

2つ目の例では出力jsonをリストオブジェクトとして指定している(queryの中の`[VolumeId,...,Size]`の大カッコ)。

ディクショナリは値だけでなく変数名が必要。よって変数名を指定するのに、`{出力jsonに割り付ける変数名:入力jsonの変数名}`と指定する。リストは変数名が不要であるため、単に`[入力jsonの変数名]`のみ指定する(割り付ける変数名は指定できない)。

これを踏まえた別の例は次のとおり。

#### リスト形式で出力(しかし何がtrue/falseか分からない)

```
$ aws ec2 describe-images --image-ids ami-06cd52961ce9f0d85 --query 'Images[*].[Description,BlockDeviceMappings[0].Ebs.Encrypted]'
[
    [
        "Amazon Linux AMI 2018.03.0.20180811 x86_64 HVM GP2",
        false
    ]
]
```

#### ディクショナリ形式で出力(元の変数名を生かす)

```
$ aws ec2 describe-images --image-ids ami-06cd52961ce9f0d85 --query 'Images[*].{Description:Description,Encrypted:BlockDeviceMappings[0].Ebs.Encrypted}'
[
    {
        "Encrypted": false,
        "Description": "Amazon Linux AMI 2018.03.0.20180811 x86_64 HVM GP2"
    }
]
```
mask-imageで両端に透過グラデーションのマスクをかける

スマホのナビゲーションバーのような水平方向にスクロールできる要素で、それがスクロールできることを表すために、両端に透過グラデーションをのマスクをかけるデザインがよくあります。

両端にその背景色から透過のグラデーションの要素を置いて疑似的に表現する方法がわりと一般的ですが、これをmask-imageを使ってちゃんと両端を透過グラーデーションすることができます。

mask-imageを使った手法は、IE11では使えませんが、両端がちゃんと透過されるため、背景に画像や動画といったケースでもちゃんと表現できます。

[デモ](https://ksk1015.github.io/opacity-gradient-mask/)

```css
.Navbar {
	background: blue;
}
.Navbar__mask {
	-webkit-mask-image: linear-gradient(to right, transparent, black 1.5em, black calc(100% - 1.5em), transparent);
	mask-image: linear-gradient(to right, transparent, black 1.5em, black calc(100% - 1.5em), transparent);
}
.Navbar__scroll {
	overflow-x: scroll;
	white-space: nowrap;
}
.Navbar__scroll a {
	display: inline-block;
	padding: .5em .5em;
	text-decoration: none;
	color: #fff;
}
```

```html
<div class="Navbar">
	<div class="Navbar__mask">
		<div class="Navbar__scroll">
			<a href="#">アイテム1</a>
			<a href="#">アイテム2</a>
			<a href="#">アイテム3</a>
			<a href="#">アイテム4</a>
			<a href="#">アイテム5</a>
			<a href="#">アイテム6</a>
			<a href="#">アイテム8</a>
			<a href="#">アイテム9</a>
		</div>
	</div>
</div>
```
EgretEngineを採用しているタイトルのメモ

Egretの公式サイトhttps://www.egret.com/en/caseにタイトルの採用事例があがっています。

バナー画像が日本語のタイトルが３つありましたので気になって調べてみました


|タイトル|パブリッシャ|配信日|公式サイト|Twitter|
|----|----|----|----|----|
|ナイトメアクロノス| CTW |2018/11|https://g123.jp/nightmk|@nightmarekronos|
|ケモニスタ|CTW|2018/8|https://g123.jp/kemo|@kmnst_online|
|ガールズサバイバー|CTW|2018/6|https://g123.jp/girlssurvivor|@girlssurvivor|


すべてG123を運営されているCTWさんのタイトルですね。
Android端末をChromeでデバッグする方法(Mac)


Android端末をChromeでデバッグする方法メモメモ。

・Android端末 > 設定 > 端末情報 > ビルド番号
ビルド番号を７回タップ
*ビルド番号をタップすると、「デベロッパーまであと4ステップです」とみたいなメッセージが出てくる。
↓

「これでデベロッパーになりました！」
↓
デベロッパーになったら、設定画面に「開発者オプション」が追加される。
↓
・Android端末 > 設定 > 開発者向けオプション
デバッグ > USBデバッグ > USB接続時はデバッグモードにする
デバックモードをチェックして、USBデバッグを許可する
↓
・Chrome上で「chrome://inspect/#devices」を開く
Android端末ブラウザで開いているページが表示される
「inspect」でデバッグ開始！


この「開発者オプション」はAndroid 4.1 以前の端末では初期表示されていて、
Android 4.2 以降の端末から「ビルド番号を７回タップ」して表示する必要があるらしい。


詳しくはこちら：
https://developer.android.com/studio/debug/dev-options?hl=ja


おわり。
かわくだりゲームをプチ改造スピードアップ&ダウンキャラ追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/b09b3404-f8d6-7494-007a-f58ff6016e97.png)

#内容
IchigoJamといえばHelloWorldに匹敵するかわくだりゲーム
そのかわくだりゲームをプチ改造スピードアップ&ダウンキャラ追加してみました

#解説
矢印ブロックを追加し、当たり判定を行っているSCR部分の判定を追加しました

#コード
5 W=15
10 CLS:X=15
20 LC X,5:?"0"
30 LC RND(32),23:?"*"
31 LC RND(32),21:?"上矢印"
32 LC RND(32),22:?"下矢印"
35 WAIT W
36 X=X-BTN(28)+BTN(29)
38 IF SCR(X,5)=ASC("上矢印") W=W+5:LC 1,3:?"SPEED DOWN!":GOTO20
39 IF SCR(X,5)=ASC("下矢印") W=W-5:LC 1,3:?"SPEED UP!":GOTO20
40 IF SCR(X,5)=0 GOTO 20

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/85e923a7-2069-3b38-fb46-4bbe7f652f7b.png)
合成数列の和アドベントカレンダー Java 編

[合成数列の和アドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/composite-number) の 4 日目です。

# ルール
- 入力として正の整数 N を与えたら 4 から始まる [合成数](https://ja.wikipedia.org/wiki/%E5%90%88%E6%88%90%E6%95%B0) の数列の 1 番目から N 番目からの合計を出力してください
- N は最大で 100 とします

# プログラム(Java)

```java:Composite.java
class Composite{
    public static void main(String[] args){
        int in = Integer.parseInt(args[0]);
        int num = 4;
        int sum = 0;
        int composites = 0;
        while(composites < in){
            if(!Composite.isPrime(num)){
                composites++;
                sum += num;
            }
            num++;
        }
        System.out.println(sum);
    }

    public static boolean isPrime(int n){
        if(n < 2)return false;
        if(n == 2)return true;
        if(n % 2 == 0)return false;
        for(int i=3; i*i<=n; i+=2){
            if(n % i == 0)return false;
        }
        return true;
    }
}
```

# コンパイル
```
$ javac Composite.java
```

# 出力例
```
$ java Composite 2
10
$ java Composite 4
27
$ java Composite 10
112
$ java Composite 100
7059
```

# メモ

この問題は [ずんだ問題](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0) の番外編です
合成数列の和アドベントカレンダー JavaScript 編

[合成数列の和アドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/composite-number) の 5 日目です。

# ルール
- 入力として正の整数 N を与えたら 4 から始まる [合成数](https://ja.wikipedia.org/wiki/%E5%90%88%E6%88%90%E6%95%B0) の数列の 1 番目から N 番目からの合計を出力してください
- N は最大で 100 とします

# プログラム(JavaScript)

```javascript:composite.js
function isPrime(n){
    if(n < 2)return false;
    if(n == 2)return true;
    if(n % 2 == 0)return false;
    for(let i=3; i*i<=n; i+=2){
        if(n % i == 0)return false;
    }
    return true;
}

let indata = process.argv[2];
let num = 4;
let composites = 0;
let sum = 0;
while(composites < indata){
    if(!isPrime(num)){
        composites++;
        sum += num;
    }
    num++;
}
console.log(sum);
```

# 出力例
```
$ node composite.js 2
10
$ node composite.js 4
27
$ node composite.js 10
112
$ node composite.js 100
7059
```

# メモ

この問題は [ずんだ問題](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0) の番外編です
合成数列の和アドベントカレンダー Go 編

[合成数列の和アドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/composite-number) の 6 日目です。

# ルール
- 入力として正の整数 N を与えたら 4 から始まる [合成数](https://ja.wikipedia.org/wiki/%E5%90%88%E6%88%90%E6%95%B0) の数列の 1 番目から N 番目からの合計を出力してください
- N は最大で 100 とします

# プログラム(Go)

```golang:composite.go
package main

import (
    "flag"
    "fmt"
)

func isPrime(n int) bool {
    if n < 2 {
        return false
    } else if n == 2 {
        return true
    } else if n % 2 == 0 {
        return false
    } else {
        for i := 3; i * i <= n; i += 2 {
            if n % i == 0 {
                return false
            }
        }
    }
    return true
}

func main() {
    indata := flag.Int("i", 0, "target value")
    flag.Parse()
    num := 4;
    composites := 0;
    sum := 0;
    for (composites < *indata) {
        if (!isPrime(num)) {
            composites++;
            sum += num;
        }
        num++;
    }
    fmt.Println(sum);
}
```

# 出力例
```
$ go run composite.go -i 2
10
$ go run composite.go -i 4
27
$ go run composite.go -i 10
112
$ go run composite.go -i 100
7059
```

# メモ

この問題は [ずんだ問題](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0) の番外編です
合成数列の和アドベントカレンダー なでしこ 編

[合成数列の和アドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/composite-number) の 7 日目です。

# ルール
- 入力として正の整数 N を与えたら 4 から始まる [合成数](https://ja.wikipedia.org/wiki/%E5%90%88%E6%88%90%E6%95%B0) の数列の 1 番目から N 番目からの合計を出力してください
- N は最大で 100 とします

# プログラム(なでしこ)
コマンドライン引数を処理する事が~~すごく面倒だった~~難しかった為、ファイルを介して入力しています。

```composite.nako3
indataはファイルを読む("composite.dat")
numは4
compositesは0
sumは0

●(x)素数判定とは
  もし、x<2ならば
    それは0
    戻る。
  ここまで。
  もし、x=2ならば
    それは1
    戻る。
  ここまで。
  もし、x%2=0ならば
    それは0
    戻る。
  ここまで。
  iは3
  (i*i≦x)の間
    もし、x%i=0ならば
      それは0
      戻る。
    ここまで。
    iはi+2
  ここまで。
  それは1
  戻る。
ここまで。

(composites < indata)の間
  もし、素数判定(num)が1でなければ
    compositesにcomposites+1を代入
    sumにsum+numを代入
  ここまで。
  numにnum+1を代入
ここまで。
sumを表示
```

# 実行環境の準備
今回は[Node.js](https://nodejs.org/ja/)上で動かしてみました。

```
$ npm install -g nadesiko3
```

# 出力例
```
$ echo 2 > composite.dat && cnako3 composite.nako3
10
$ echo 4 > composite.dat && cnako3 composite.nako3
27
$ echo 10 > composite.dat && cnako3 composite.nako3
112
$ echo 100 > composite.dat && cnako3 composite.nako3
7059
```

# メモ

この問題は [ずんだ問題](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0) の番外編です
(USキーボードでも)ホームポジションで移動キー入力したい！

# はじめに

本エントリは[高知工科大 Advent Calendar 2018](https://adventar.org/calendars/2959)の4日目の記事です。

皆さんも普段生活している中で「あー、ホームポジションのままカーソル移動ができたらなー」と思うことは多いと思う。思わない？僕は思う。
このエントリでは、左手のCtrlと、右手の「I」「J」「K」「L」キーの組み合わせで、移動キー(Up, Left, Down, Right)と同じ振る舞いができるようにする。
使用ツールは[AutoHotkey](https://www.sites.google.com/site/autohotkeyjp/)。

「USキーボードでも」というのは、JISキーボードでCtrlではなく無変換キーを利用したものなら既に結構記事があることからきている。USには無変換キーは無いからどうなることか...。

# 環境

+ Windows 10 Home x64
+ USキーボード ([ctrl2cap](https://technet.microsoft.com/ja-jp/sysinternals/bb897578.aspx?f=255&MSPPError=-2147217396)でCapsLockをCtrlにしてある)

# AHKスクリプトを書く

## 試行錯誤1 シンプル

``` ahk
^i::Send,{Up}
^j::Send,{Left}
^k::Send,{Down}
^l::Send,{Right}
```

移動キーは問題なく発行される。
Shiftを組み合わせると、移動キーは無効化され、その環境のショートカットが発行される。

## 試行錯誤2 Shiftに対応したい

``` ahk
^i::Send,{Blind}{Up}
^j::Send,{Blind}{Left}
^k::Send,{Blind}{Down}
^l::Send,{Blind}{Right}
```

Shift同時押しを受け付けさせるために{Blind}を入れたが、CtrlならShift+Ctrl+i+Upになってしまい、期待通りの振る舞いをしない。

## 試行錯誤3 GetKeyState

``` ahk
^i::
	if GetKeyState("shift","P"){
		Send,+{Up}
	}else{
		Send,{Up}
	}
	return

^j::
	if GetKeyState("shift","P"){
		Send,+{Left}
	}else{
		Send,{Left}
	}
	return
	
^k::
	if GetKeyState("shift","P"){
		Send,+{Down}
	}else{
		Send,{Down}
	}
	return
	
^l::
	
	if GetKeyState("shift","P"){
		Send,+{Right}
	}else{
		Send,{Right}
	}
	return
```
[AutoHotKeyで簡単にカーソル移動、範囲選択：カタカタめも](http://blog.livedoor.jp/sourceof/archives/6147520.html)、[Windowsのキー配置を入れ替えて作業効率化 | たまに、更新するかもしれないブログ](http://techblog.wp.xdomain.jp/2018/01/01/ime/#toc5)を~~丸パクリ~~参考に。
**試行錯誤2**とは違い、移動は出来ず、Shift+Ctrl+k(行削除)が発行される。ホットキーを全く乗っ取れていない。

## 試行錯誤4 無職修飾キー

```ahk
LWin::Send, {vk88 Down}

試行錯誤3
```

参考ブログが無変換キー利用でできてるということは、USキーボードに無変換キーをつくればいけるんでは？という発想。無理でした。

### キーを乗っ取ってそれを修飾キーにすることができない理由

[ホットキー - AutoHotKeyJp](https://www.sites.google.com/site/autohotkeyjp/reference/Hotkeys)のコンビネーションキーの説明から。
> **コンビネーションキー**
> &を使うことで、2つの任意のキー(ジョイスティック以外)の組み合わせをホットキーに指定することが可能。
> 一つ目に指定したキーが修飾キーとなり、一つ目のキーを押しながら二つ目のキーを押すと発動する。
> 一つ目のキーを押して、ホットキーを発動させずに離すと、一つ目のキー単独に割り当てられたサブルーチンが実行される。
> 一つ目のキー自体のもともとの機能は無効化される。

# 結論

要件達成ならず。

# おわりに

できたことよりも、できないことを確認したというエントリということでひとつ。

レジストリをいじってUSキーボードに無変換キーなりの無職修飾キーを作って、Ctrlではなくそれを利用すればいけそうだが、それをするならAHK使わず全部レジストリで実現すればいいじょのいこと言う話で…。
現在は**試行錯誤1**にHome、End、Backspace、DeleteをそれぞれU、O、N、Mに割り当てを追加して使っている。範囲選択のときは本物の移動キーを使うことになってしまうが、まあ便利。

レジストリいじってうまくいったら第2話ということでまた投稿する。できたらいいな。
Azure DevOpsで組織(organization)レベルの権限を付与する

Azure DevOpsにおいて、組織(organization)の作成者以外projectの作成ができないので、調べたところ
2018年11月時点では公式ドキュメントがまだ日本語化されていない かつ　
projectレベルの権限についての記述のみで、組織(organization)レベルの権限付与の記載がないため記載しました。

ただ、Azure本体同様ロールに応じた細かいアクセス制御が可能なようなので、実際の運用と照らし合わせ運用設計をしてください。
*組織(organization), projectをどの管理規模を想定して作成するかにもよると思います。

## 公式ページ(参考)
[Set permissions at the project- or collection-level](https://docs.microsoft.com/en-us/azure/devops/organizations/security/set-project-collection-level-permissions?view=vsts&tabs=new-nav#add-a-group-and-change-its-permissions-at-the-organization-or-collection-level-group)
projectレベルの権限について記述がありますが、これはあくまで"projectレベル"

[Look up administrators and organization owner](https://docs.microsoft.com/en-us/azure/devops/organizations/security/lookup-organization-owner-admin?view=vsts&tabs=new-nav)
Project Collection Administratorsグループが、組織(organization)のいわゆるAdmin権限にあたります。

## 組織(organization)レベルのAdmin権限を付与する

以下の設定例は、少人数で運用を想定して、
組織(organization)内に管理者でなくてもProject作成するなどできることを目的としています。

- 画面のメニューからOrganization settingsを選択
![](https://docs.microsoft.com/en-us/azure/devops/_shared/_img/settings/open-admin-settings-vert.png?view=vsts)

- General -> Securityを選択, Project Collection Administratorsを選択してMembersでユーザーを追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206716/da15d66e-cad5-5aa0-bdd9-6c0c2124af7d.png)
Pythonでグローバルなリスト変数を安全に使う

#目的
Pythonでリストをだんだんappendで増やしていき
長さが一定以上になったら一気に読み出して使いたい場合に
リストのメソッドを限定し間違って消したりしないようにしたい。

##想定されるミスの例

```Python
TEST = []

if __name__ == "__main__":
    
    # 入力
    TEST.append(["ff"])
    
    # 誤って挿入してしまったコード
    TEST.pop()

    # 結果表示、自分で消してるので空になる
    print(TEST)

```
コード自体が間違っているというより、そういう風に書いているため、
なんとも言えないですが、長いコードになるとこういうことがよくあります。

## 解決方法

解決方法というほどではないんですが、グローバル変数のリストを
オブジェクトで書き直してメソッドを限ってしまえば、
コードもスッキリしますし、単純なミスが防げる気がします。

```Python
class BufferedList:
    """Buffered list.

    Buffered list is queue-like object.
    Implementation for safe list operation to limit access method.
    Method:
        clear: clear list
        set: set list
        get: get list
        append: append list
        qsize: return len(list)
    """

    def __init__(self):
        """Init."""
        self.__data = []

    def clear(self):
        """Clear list."""
        self.__data = []

    def set(self, newlist):
        """Set."""
        if not isinstance(newlist, list):
            raise ValueError("Buffer only set list.")
        self.__data = newlist
        return self.__data

    def get(self):
        """Get."""
        return self.__data

    def qsize(self):
        """Return list length."""
        return len(self.__data)

    def append(self, item):
        """Append."""
        self.__data.append(item)
        return self.__data
```
**12/4 appendメソッドの中に不要な例外処理がありました。お詫びして訂正します。**

##上のクラスを使用した例

```Python
TEST = BufferedList()

if __name__ == "__main__":
    
    # 入力
    TEST.append(["ff"])
    
    # 誤って挿入してしまったコード、ここでエラーになる
    TEST.pop()

    # 結果表示
    print(TEST)

```

速度の面は検証していませんから、もしかしたら問題があるかも知れないです。
pythonのコードを書いているときに思いついたちょっとした話でした。
Galaxy Training! について


![スクリーンショット (1).png](https://qiita-image-store.s3.amazonaws.com/0/222524/52370816-e11f-e8a3-b45b-5aec33059090.png)
(https://galaxyproject.github.io/training-material/)
#Welcome to Galaxy Advent Calendar #3!
Galaxy Advent Calendar 3日目です！
今回は **Galaxy Training!** について、ちょっとした関係者として、Galaxy を使ったことがない人の立場になるべくたって色々お伝えしたいと思います！
## Galaxy Training! って何？
Galaxy Training! とは、世界中の Galaxy を使っている[ヒトやウサギやラクダさん達](https://galaxyproject.github.io/training-material/hall-of-fame)が**有志で**作成した、Galaxy の操作方法やこれを用いた解析ワークフローといった様々なチュートリアルが掲載されている、それはそれは素晴らしいサイトです。
![スクリーンショット (2).png](https://qiita-image-store.s3.amazonaws.com/0/222524/7c9a17ce-95e3-f7c8-d57c-936f14bee092.png)
（冒頭にもありますが）リンク → https://galaxyproject.github.io/training-material/

このサイトを見れば、Galaxy の使い方がほとんど分かります。


##Galaxy Training! を用いた学習のやり方
まずは、上の画像に表示されているホーム画面にて、知りたい項目をクリックします（ここではIntroduction to Galaxy Analyses を選択）。
すると、次のような画面が表示されるので、赤枠で囲った「Galaxy instances」を見て、使用している Galaxy とチュートリアルで使用する Galaxy が一致しているかを確認してください。
使うGalaxy が一致していない場合、チュートリアル中に出てくるツールが無かったりして最悪やり直しになるので、ここだけはしっかりやっておいて下さい。
![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/222524/2e24fd66-de0b-312e-4e46-f253ea5352cd.png)
確認が済んだら青枠で囲んだ「Hands-on」をクリックしてチュートリアルに進みましょう。
（現在、このハンズオンでは Google 翻訳による日本語のチュートリアルがありますが、用語の訳がおかしいところが多々あるため、英語が分かる人は原文のページで行うのが良いかもしれません。）
チュートリアルに進んだら、次のように Galaxy とページを並べて指示に従って解析をしてみて下さい。
![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/222524/3d32c8b8-ade3-8439-ea90-3aa8cd0c39b2.png)

##Galaxy Training! の問題点
個人的に思っているこのサイトの課題はこれです。

- 割と高い確率で**チュートリアル通りに作業しても上手くいかない。**

これに関しては、ツールの設定部分が書いていないことによるものだったり、Galaxy instance のアップデートによる仕様の変更によるものだったり、チュートリアル通りに作業した気になっているだけだったり、チュートリアルを書いた人がちゃんと書いた気になっているだけだったりと様々な原因がありますが、如何せんこのチュートリアルは**有志**で作成されているため、仕方がないかもしれません。
ただ、そうは言ってもこれから Galaxy を学ぶ方は、ちゃんと最後までチュートリアルを完了したいですよね・・・・
###そんな時は・・・？
幸いなことに日本では Galaxy ユーザーによる meetup が毎月開催されています。
この meetup に参加しましょう！
![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/222524/c9110ed4-a82a-02db-06a0-1f03695d201b.png)
http://wiki.pitagora-galaxy.org/wiki/index.php/Events

Galaxy を学びたい方は誰でも参加できるので、ぜひ気軽に参加していただいて、チュートリアルで詰まったところや、分からないところを質問して下さい。最後までチュートリアルができるようお手伝いさせていただきます。
日によってはセミナーも行っているので、皆さんの参加をお待ちしております。


次回は、私が行っていたこれまでの Galaxy セミナーについてや日本語版チュートリアルについて記事にしようと思います。
プログラミング初心者がSeleniumでUIテスト自動化した話

# はじめに
[aptpod](https://www.aptpod.co.jp/)という会社で、QA（品質保証）チームで各製品のテスト等を行っています。
テスト効率化のために、Seleniumを使用してUIテスト自動化を行った際の話を書いて行きたいと思います。

テスト自動化については、色んな方々が記事を書かれているので、本記事ではプログラミング初心者がどんな事をして
UIテスト自動化を行ったのかを書いて行きたいと思います。


# 参考にしたもの
## 書籍
[Selenium実践入門 ――自動化による継続的なブラウザテスト](https://www.amazon.co.jp/dp/B07JHNFB2F/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

## Webページ
- [【初心者向け】Seleniumをまわしてみよう](https://bitwave.showcase-tv.com/%E3%80%90%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91%E3%80%91selenium%E3%82%92%E3%81%BE%E3%82%8F%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E2%91%A0/)

そもそも、Seleniumとはなんぞや？というレベルから始まったので、この手のページは大変お世話になりました。

- [Selenium API(逆引き)](http://www.seleniumqref.com/api/webdriver_gyaku.html)

何を書いたら動くのかが全然わからなかった私に取っては、大変有り難い存在でした。
使用言語は、Pythonを使用しましたので、Python部分を何度も調べました。
それでもわからなかったものは、諦めました。。


# やってみたこと
## 環境構築
前述したとおり、プログラミングの経験なんてほぼ皆無なので、PythonやSeleniumの実行環境を使用しているWindows環境でまずは挫折しました。Macでの環境構築についての記事が多く出てくるので、ほとんど何を書いてあるのかわからずで、それをWindowsでどうすれば
良いのかが最初の難関でした。

### 解決策
社内で誰も使用していない、MacBookがあったので、そちらを使用して解決。
＊　その時は、まずは動かしてみたい一心だったので安易な解決をしました。


## 簡単な事から始めてみた
環境構築は出来たので、これからはソースコードを書いて動かしていくことにしました。
1. [Google](https://www.google.co.jp/)に接続する
2. 検索みる
3. Google閉じる

たったこれだけでしたけど、動いた時は嬉しかったですね。
なんと便利な！！！という気分です。

もちろん、これだけでは、UIテストなんて出来ないので、ほんの僅かな一歩目でした。


## 実践
いよいよ、弊社製品を用いて、動かしてみることにしました。
動かした製品は、『VISUAL M2M』という製品になります。

https://www.aptpod.co.jp/products/vm2m/

### 自動化で出来るようになった操作
- Basic認証/ログイン実行⇒ログアウトまで自動化する
- ボタンやリンクのクリック操作する
- 各画面でのスクリーンショットを撮影する
- 文字入力で検索する
- ファイルのアップロードやインポートをする


# 結果
## 良かったこと
- 当時のテスト項目書の45%程度は自動化が出来るようになった
- プログラミングをもっと勉強したくなった
    - ProgateでPythonの勉強始めました
- 実際にやってみたことで、新しい経験が積めた
    - 手動でのテストがゼロにならないことを実証出来た

## 悪かったこと
- 現在、自動化については止まってしまっている
    - ソースコードのメンテナンスが容易で無くなってしまった
        - element をXpath指定で作成していたため、実態のソースコードが変化すると毎回メンテナンスが必要になった
            - css指定等では動かなかったので・・・
    - 開発側と連携をしていけば、もっと効率良く出来るかもしれない


# 最後に
今回の経験で、テスト関連の勉強会に参加していると登壇者の方が、仰る「QAもプログラミングが出来たほうが良い」という言葉が凄く納得出来ました。
全てのテストが自動化出来るわけでは無いですが、実践してみることで新しい考え方：パターンが増えたかと思います。
しかも、プログラミングの勉強を始めるといった気持ちも芽生えたほど、良い経験になったと思います。

恥ずかしながら、弊社では、UIテスト自動化は完全に止まってしまいましたが、今後また再開したいと考えています。
WebのUIだけでなく、スマホアプリ等のテスト自動化についても踏み込んで行きたいと思います。
React Native導入しようとして困ったこと

## はじめに

機会があってswiftを使った開発に携わることがあったのですが、開発をしている時に、端末依存の言語を勉強したり、その言語を使って開発しないといけない意味がわからなくなったのでreact-nativeを使ってみることにしました。(そもそもreactはチュートリアルやったくらいでほぼ初心者)
[こちらの記事](https://rara-world.com/react_native-build/)を参考に環境構築をやったのですが、いくつか躓いたことがあったので書き留めます。

## 躓いたこと

### `react-native`　コマンド使えない問題

#### 問題点

`react-native init プロジェクト名` を実行することで雛形の生成ができる、とのことだったので `npm i -g react-native` をしてインストールしたのちに該当コマンドを実行したところ、 

```
-bash: react-native: command not found
```

コマンドないよ、と怒られてしまいました。インストールした時はエラーなくaddedって言ってたのに...と思っていろいろ調べてみると[このページ](https://stackoverflow.com/questions/37189081/react-native-command-not-found)にたどり着きました。どうやらPATHの指定の問題そう...
ただ、私の環境では `anyenv` を使って `nodenv` を管理していて `.bash_profile` でも

```
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
```

anyenvのPATH指定はしているのでそこから先はanyenvが管理してくれているはずなのに...と行き詰まりました
`which node` を確認したのですがanyenvの下を見に行っているしバージョンあってるし...なんじゃこりゃ

#### どうやって解決したか

anyenvが管理してくれているものをこちら側で無理やりPATH書き換えてーってすると他で問題が発生する可能性があったので、 `anyenv install nodenv` を実行して再度nodenvをインストールすることで解決できました。
根本的な原因がなんだったのかはわからなかったです。すみません...

### `react-native run-ios` してもrunしてくれない問題

#### 問題点

無事にinitできたので試しにrunしてみようと思い

```
react-native run-ios
```

を実行すると以下のエラーが...

```
xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
```

またPATHかよ...

#### どうやって解決したか

[こちらのページ](https://stackoverflow.com/questions/39778607/error-running-react-native-app-from-terminal-ios)を参考に

<img width="801" alt="Locations 2018-12-03 13-30-22.png" src="https://qiita-image-store.s3.amazonaws.com/0/192406/69ea9b4a-50b3-bb31-a7f4-93258e321e1c.png">

xCodeのここの設定を変更しました。
もう一度`react-native run-ios` を実行してみると...

<img width="406" alt="スクリーンショット 2018-12-03 14.23.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/192406/1d67c77e-abda-3753-b2bf-f49781d61671.png">

初回起動時は時間がかかる、と書いてあったのですがあまりにも長い時間シミュレータがホーム画面のままだったので不安になったのですが気長に待ち続けたら無事にアプリが起動され、画面が表示されました😊めでたし
Swift 配列内の特定の値がいくつあるか調べる

#配列内の特定の値がいくつあるか数える
```swift

//配列の作成
var array = [9,8,7,6,7]

//カウントするインスタンス
var count = 0

//配列から要素を取り出す
for num in array {
  if num == 7 { //7ならばカウントを1増やす
    count = count + 1
    print("\(num)がありました")
  }
}

//確認し終わったら、何個あったか調べる

if count > 0 {
  print("7は\(count)個ありました")
  
} else {
  print("7がありませんでした")
}
Swift 多次元配列から値を見つける

#多次元配列から値を見つける

```swift

//配列を用意する
var array = [["吉良","吹上","音石"],["西村","東方","空条"],["広瀬","山岸","岸辺"]]

//探したい人を用意する
let kira = "吉良"
let higasikata = "東方"

//配列を順番に確認していく
for floor in array {
  //配列から要素を取り出す
  for personInRoom in floor {
    if personInRoom == kira {
      print("\(kira)が見つかりました")
    } else if personInRoom == higasikata {
      print("\(higasikata)が見つかりました")
    }
  }
}

/*---------------------
 上記のコードだと、探したい人が増えた時、
 else if を書き加える必要が出てくるので
 描き加えなくてもいいように考える
 --------------------------*/

//探したい人
let lookupPersons = ["吉良","東方","広瀬"]

for floor in array {
  for personInRoom in floor {
    //中の人が探したい人か順番に見ていく
    for name in lookupPersons {
      if personInRoom == name {
        print("\(name)が見つかりました")
      }
    }
  }
}
入力した文字列を適当に繋げるだけのアプリを作り始めた

[クソアプリ Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/kuso-app)が今年も大盛況で2つとも満席だったため、非公式参加させていただきます。

# 背景

仕事で、
「あー、PythonでサクッとバックエンドとAPI作ったけど、フロントをAngular & TypeScriptでやるのかあ。面倒くせえ、知らねえ……」
となっていたので、気分転換で午前中2時間でモジュールだけ作り始めました。

*……就業中に（もちろん、この記事も就業中に書いている）（会社員なめてる）*

# 作ったリポジトリ

[manzyun/relational-algorithm: Idea processor for CUI. This repository is my traning of coding.](https://github.com/manzyun/relational-algorithm)

「アイディアプロセッサ」
なんて大層な事を言ってみたが、簡単なアプリです。そもそもアプリでさえ無いのでは？
いや、これからアプリにするんだよ……！

# なんですかこれは？

[物書きが悪魔と契約する前に試すべき７つの魔道具 読書猿Classic: between / beyond readers](https://readingmonkey.blog.fc2.com/blog-entry-148.html) の 「2. 関係アルゴリズム」というやつを、簡単にプログラミングしてみました。

## 使い方（理想）

```shell-session
$ relational-words banana orange apple break
 banana among orange or apple though break
$ relational-words 牛 馬 羊 イノシシ 鶏 産卵 お肉
 牛 at 馬 so 羊 still イノシシ under 鶏 under 産卵 near お肉
```

# なんで作ったの？

自分のコーディング能力維持・向上のための練習です。

ですので、以下のような目標があったりします。

* 他のプログラミング言語で作ってみる。
* 他のプログラミングパラダイム（主に関数型。`map`, `filter`, `redux`とか使ってみる）を取り入れる。
* もっと拡張しやすいようにリファクタリングやモジュール化したりする。
* 設定ファイルを取り込めるようにする。

# まとめ

Webアプリやスマホアプリまでにしなくても、クソCLIツールを洗練しながら作るだけでも、すっごく勉強になると思うので、みんなもやってみてください。

# 余談 -他にも作りたいやつ-

* 適当にタロットカードを引くCLIツール
* [物書きが悪魔と契約する前に試すべき７つの魔道具 読書猿Classic: between / beyond readers](https://readingmonkey.blog.fc2.com/blog-entry-148.html)の時空計算尺ガリバー的なCLIツール。

CLIしか趣味で作る気力はないのよ。
リッチな見た目のWebやスマホのアプリなんて作る気力ないのよ（やはりクズだった）
dnsmasqでCAAレコードを追加する(letsencryptのため)

letsencryptで証明書を取得しようとしたところCAAレコードの設定で失敗する。

エラー内容

```
Failed authorization procedure. [ドメイン] (dns-01): urn:ietf:params:acme:error:caa :: CAA record for [ドメイン] prevents issuance

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: [ドメイン]
   Type:   None
   Detail: CAA record for [ドメイン] prevents issuance
```

dnsmasqの設定はこんな感じでしている

```dnsmasq.conf
dns-rr=[ドメイン],257,0569737375656c657473656e63727970742e6f7267
```

`host -t CAA [ドメイン]`
で確認すると、

```
;; Got bad packet: FORMERR
70 bytes
12 db 85 80 00 01 00 01 00 00 00 00 03 61 70 70          .............~~~
03 64 65 76 08 67 6f 6f 64 66 69 6e 64 02 6a 70          ~~~~~~~~~~~~~~~~
00 01 01 00 01 c0 0c 01 01 00 01 00 00 00 00 00          ................
15 05 69 73 73 75 65 6c 65 74 73 65 6e 63 72 79          ..issueletsencry
70 74 2e 6f 72 67                                        pt.org
```

て感じでダメそう

このエラーは、前に`00`をつけると治るそうなので、さっきの設定に追加

```dnsmasq.conf
dns-rr=[ドメイン],257,000569737375656c657473656e63727970742e6f7267
```
```
$ host -t CAA [ドメイン]
[ドメイン] has CAA record 0 issue "letsencrypt.org"
```

これで証明書取得できました
【波ダッシュ〜の文字化け防止！】UTF-8→Shift_JIS変換で気をつけること

以前、UTF-8で制作したHTMLをShift_JISに変換してサーバーにアップロードした際、波ダッシュ（〜）が文字化けしてしまいました。今後、個人的にしようと思っている再発防止策を共有させていただきます。

*制作環境*
- Mac
- Sublime Text 3
- [gulp-convert-encoding](https://www.npmjs.com/package/gulp-convert-encoding)

## 波ダッシュ〜は使用できない！全角チルダはOK！
まず基本的なことですが、文字化けするのはUTF-8とShift_JISで文字コードが違うからです。
以下のページにわかりやすくまとまっていました。
[UTF-8 → cp932(Shift_JIS)変換表](https://sites.google.com/site/fudist/Home/vim-nihongo-ban/mojibake/utf8-cp932conv)
[Oracleデータベースで、波ダッシュの文字化けはなぜ起きるのか？](https://www.unirita.co.jp/blog/data-utilization/data-linkage/20141021.html)

## 波ダッシュの入力方法
- Macキーボードのかな入力で、Shift + 「へ」キー
- 「から」の変換

## 全角チルダの入力方法
ない。みたいです。とりあえずぼくが使っているMagic Keyboardにはなかったです。

**Macの標準機能文字ビューアを使う**
Control + Command + スペースで文字ビューアを表示。
![スクリーンショット 2018-12-03 16.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/298406/b72eac8c-919f-d7d9-a2b0-0199e93cb762.png)

検索窓で「U+FF5E」を検索すると「FULLWIDTH TILDE」というのがあるので、お気に入りに登録しておけばダブルクリックで入力できる。
![スクリーンショット 2018-12-03 13.37.36.png](https://qiita-image-store.s3.amazonaws.com/0/298406/8afdee9f-6822-575e-392f-1926a24e57f5.png)

ちなみに波ダッシュは「U+301C」で「WAVE DASH」
![スクリーンショット 2018-12-03 13.39.00.png](https://qiita-image-store.s3.amazonaws.com/0/298406/a5d7760f-775c-35b5-cad9-85c95b107e5a.png)

## 【対策１】テキストエディタ上の対応
上記の方法で波ダッシュを検索して全角チルダに置き換えておく。

**補足**
機種依存文字をエディター上でハイライト表示させておくと見た目の検索もしやすいので気づきやすくなる。
[【文字化け防止策】Sublime Text 3 で機種依存文字をハイライト表示する](https://qiita.com/kokushin/items/b1bb95b857a0037bd369)

Visual Studio Codeを使う方は以下の記事が参考になりそう。
[Visual Studio Codeをインストールしたら最初に設定したい箇所](https://web-guided.com/post-567)

## 【対策２】アップロード後の対応
波ダッシュがあれば文字化けして半角?になる（と思う）ので検索して修正する。

## 日本語テキスト内では波ダッシュを用いるのが正しい
今回、UTF-8で作成したHTMLをShift_JISに変換する、という工程で制作しているため、全角チルダに置き換えて対応したのですが、見た目は似ていても波ダッシュとチルダでは意味合いが異なります。
日本語で「から」と読み、範囲を示すために使う場合などは波ダッシュをあてるのが正しい使い方になります。

[波ダッシュ](https://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C)
[チルダ](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%AB%E3%83%80)

尚、JavaScriptやPHPを使って文字を置き換えるということもできると思いますが、それについては詳しく調べてないのでまたの機会に。。

以上です。
IE対応をしつつfloatThead + tablesorterの同時併用中にtablesorterをupdateする

IEだけソート機能がおかしい。
tablesorterの再適応は普通、

```javascript

$('table').trigger('update')
```

でいいんですけどこれIEだと動きません。動作タイミングの差だと思ってsetTimeoutで遅延させます

```javascript

window.setTimeout( function() { jQuery('table').trigger('update') }, 100 );
```

これでもダメ。floatThead()とかはこれで遅延でIE対応できたんですが。
なので、もうテーブルを破壊して再度適応させます。

```javascript

jQuery('table')                                      
  .removeClass('tablesorter')                        
  .find('thead th')                                  
  .unbind('click mousedown')                         
  .removeClass('header headerSortDown headerSortUp');
jQuery('table').floatThead('destroy')                
window.setTimeout( function() {                      
  jQuery('table').tablesorter();                     
  jQuery('table').addClass('tablesorter')            
  jQuery('table').floatThead()                       
}, 100);                                             
```

floatTheadも初期化しないと、テーブルが分割されてしまっているのでエラーになります。
まだまだIE対応の闇は続く。
Alexaスキル申請のフィードバック内容まとめ②


とても丁寧なフィードバックがいただけるalexaのスキル開発ですが、
前回ご紹介した以外にもさらにいただいたフィードバックがあるので、
ぜひご参考になればと思います。
(前回投稿はこちら：https://qiita.com/misamisa/private/e06445069073081d97e4)

## ①スキル画像
スキルの表示画像(アイコン)に文字を含んでいる場合、文字が切れているとなおした方がいいよ！
って言ってくれます。

>コンパニオンアプリ上にあるスキルアイコンは空白、もしくはトリミング（もしくはトリミングされたりして解像度が低く、鮮明ではない状態）されていない状態でなければなりません。

>補足：
>アイコンに記載の"BINGO"の文字が一部切れて表示されているため、修正をご検討ください。

108*108と512*512の正方形で出してしまっていたので、
貼るときは文字が切れていないのですが、
アップロードした後に切れていないか確認した方が良さそうです。

## ②ディスプレイ対応スキル
単純に私の知識不足ですが、スキル終了時にきちんとディスプレイ表示も閉じないと、
怒られちゃいます。。。。

>画面に表示される操作要素は音声による対話が終了すると共に表示されなくなる必要があります。スキルとのインタラクションが終了したあとにインタラクティブ要素が選択されるとナビゲーションの問題が発生する可能があります。

>補足：「キャンセル」または「ストップ」でスキルとの対話が終了した後に、画面が表示されたままの状態になっています。対話が終了すると共に表示されなくなるよう修正してください。


以下に書かれている内容で解決できました。ありがとうございます。
https://qiita.com/MYamate_jp/items/730cc6724648af02f904

## ③スキルの説明
公開申請時に記載するスキルの説明に「アレクサが」などの文言を含むのは良くないようです。
標準のスキルなのかカスタムスキルなのか混在してしまうため、書き直すよう怒られます。

>現在のスキル説明は、ユーザーにAlexa標準機能とスキルの機能の混同を生じさせる可能性があります。スキルから提供される機能に対して「アレクサに/が」などの表現を使用することは推奨されません。誤解や混同が生じないよう、スキル説明の変更をお願いいたします。

##そしてなにより「スキル名」
スキル名は細かく色々指定があるみたいで、結構怒られてしまうことが多いです。
スキル名についてはもう少し良く調べた方がいいかもしれません。。。。
Galaxyの公共サーバ（概要）

Galaxyの公共サーバは、世界中の学術研究者がアクセス可能です。アカウントの作成が必要なサーバもありますが、多くの場合、ウェブサイトにアクセスして、すぐに分析を開始できます。

Galaxyの論文 [Afgan et al. (2018)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6030816/) には、"over 99 publicly accessible servers (https://galaxyproject.org/public-galaxy-servers/)" と記載されていますが、URLが変更されました。

現在のURL (https://galaxyproject.org/use) にアクセスし、[Public Servers]タブをクリックすると以下のような画面が表示されます。

<img width="1134" alt="galaxyproject_Public_Servers.png" src="https://qiita-image-store.s3.amazonaws.com/0/220238/ac701d84-eac9-2f36-0de2-aee8a796852b.png">

画面左側の "Show 20 entries" を "Show All entries" に変更すれば、全ての公共サーバがテーブルに示されます。

テーブルの左から、列"Resource"には詳細情報へのリンク、列"Link"にはウェブサイトへのリンク、列"Summary"には概要、列"Keywords"にはサーバの種類が示されています。
公共サーバは次の３種類（Genomics、Domain、Tool Publishing）があります。

- [Genomics](https://galaxyproject.org/use/#genomics)
これらのサーバは、幅広いツールを実装しており、一部の生物や分析に特化したものではありません。
- [Domain](https://galaxyproject.org/use/#domain)
ドメインリソースは、特定の生物または分析に特化した様々なツールを提供します。
- [Tool Publishing](https://galaxyproject.org/use/#tool-publishing)
ツール公開リソースにより、ツールを簡単に利用できます（コマンドラインバージョンをインストールする必要がなくなります）。ドメインリソースとツール公開リソースの区別は曖昧です。一般に、ツール公開リソースは特定の組織のツールを公開し、ドメインリソースは他の組織のツール/データセットを含みます。

<img width="1268" alt="galaxyproject_Public_Servers_a-game.png" src="https://qiita-image-store.s3.amazonaws.com/0/220238/b9b64668-328e-1e78-3d86-bae81eb9ca33.png">

例えば、テーブルの一番上の A-Game （メタゲノム解析に特化したドメインリソース）にアクセスしてみましょう。

テーブルの列"Resource" [A-Game](https://galaxyproject.org/use/a-game) をクリックすると、以下のように詳細情報のページが開きます。

<img width="1355" alt="a-game_Resource.png" src="https://qiita-image-store.s3.amazonaws.com/0/220238/67d03a0e-fd76-36a8-c5e3-95df608a4c58.png">

テーブルの列"Link" [Server](http://beaconlab.it/agame) をクリックすると、以下のようにサーバにアクセスできます。

<img width="1234" alt="a-game_Link.png" src="https://qiita-image-store.s3.amazonaws.com/0/220238/72a0d654-92af-2c4e-664a-2d01a02ff74a.png">

**参考文献**
- [Afgan et al. (2018) "The Galaxy platform for accessible, reproducible and collaborative biomedical analyses: 2018 update."](https://www.ncbi.nlm.nih.gov/pubmed/29790989)
VagrantでUbuntu仮想環境 はじめに

##まずは
###ホストOSに作業フォルダを作成
```
mkdir %userprofile%\vagrant\ubuntu64_16

```
###作業フォルダに移動
```
cd %userprofile%\vagrant\ubuntu64_16
```
###VirtualBoxにBoxを作成
```
vagrant box add ubuntu/xenial64 https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20170929.0.0/providers/virtualbox.box
```
###仮想環境の設定ファイルを作成
```
vagrant init ubuntu/xenial64
```

###仮想環境起動
```
vagrant up
```

###仮想環境設定確認
起動後に

```
vagrant ssh-config
```

###仮想環境に接続
```
vagrant ssh
```
##Ubuntu日本語化
仮想環境を起動して接続後に
###日本語環境作成
```
sudo locale-gen ja_JP.UTF-8
```
###起動時に日本語設定で起動する
```
echo export LANG=ja_JP.UTF-8 >> ~.profile
```
###設定内容を反映させる
```
source ~/.profile
```
###反映されたか確認
結果が日本語表記ならOK

```
date
```

##Ubuntuを最新にする
```
sudo apt-get update
```

##Ubuntuにゲームをインストール
```
sudo apt-get install bsdgames
```

###Ubuntuでテトリス
```
tetris-bsd
```

#Ubuntuの終了
```
exit
```

##仮想環境の終了
```
vagrant halt
```
ロジカルシンキングとは？のまとめ

自社のグループワークで「論理的思考」について考えることがあったので、自分なりにアウトプットします。

## そもそも論理的思考って？？

以下のサイトから文面を参照しました。
https://ferret-plus.com/5057

> 論理的思考とは、因果関係を整理し順序立てて考えること、あるいはわかりやすく説明することを指します。ロジカルシンキングとも呼ばれます。

うーんなるほど。

このサイトの具体例としては「夏だから風邪を引きやすい」という文章をとって論理的思考の説明をしていますね（わかりやすくてとてもいい）。

## ロジカルシンキングが使えるシーンとは？

ロジカルシンキングのメリットを考えるうえで、それがどのようなシーンで使えるのか考えたほうが現実的でわかりやすいと思います。

自分の考えている大きなメリットとしては以下です。

### 1. 質問力を高めることができる。

かつてホリエモンが「多動力」という本に書いていたのですが、ここで質問力について触れている部分があります。

こんなことは思い当たりませんか？

「論点をまとめていない状態で質問したことがある」
「前提条件がはっきりしていない抽象的な質問をしたことがある」
「不要な情報が混じっている状態で質問したことがある」etc...

これらの事態は、「因果関係を整理し順序立てて考える」という力が付けば解決できるはずです。

### 2. 問題解決が早くなる。

僕はエンジニアです。

エンジニアの一番の仕事は問題解決だと思っています。

そして、同じくエンジニアの方もここはぜひ意識をしておくと、提案のできるさいきょうの社会人になれる！！…と個人的に思います。（私もがんばらねば…）

つまり何が言いたいかというと、<strong>これができると仕事が早くなるよ</strong>ってことです。

理由としては、ロジカルシンキングでは一つの物事に対してなぜそうなったのかを徹底的に解明し、因果関係を明らかにしていきます。

つまり、日常的にロジカルシンキングを行っていれば、問題が発生した場合になぜこうなったのかという原因分析がスムーズにいくはずなんです。

それによって解決までの筋道が立ちますから、結果として仕事が早くなる、と。

## どうやって身に着けるの？

身に着けるために一番手っ取り早いのは人と話すことだと思います。

もちろん話す相手がロジカルシンキングを身に着けている前提ですが。

## 感想

自分もまだまだロジカルシンキングが足りないなと書いていて痛感しました。

もっとできる人と話さないとなぁ…

<br>
あとちょっとこの記事自体「そういうメリットがあるのか！」とか「そんな身に着け方があるのか！」とか思いついたら都度更新してブラッシュアップしていきたいと思います。

気軽にコメントお待ちしております(^▽^)/
markdown-it-katexを使ってみる - 数式エディタ

markdown-it-katexを使って数式を表示する試みです。

#１．環境設定

今回は以下のライブラリを使います。

```
markdown-it
Markdown parserです。pluginで拡張可能です。

markdown-it-katex
Markdown-it用の KaTeX plugin です。
KatexはMathJaxと同様のlatexライブラリですが、軽量高速が特徴です。
```



基本的な環境はcreate-react-appを使います。

```
npx create-react-app katex
cd katex
rm -rf src
npm i markdown-it  markdown-it-katex  --save
```


```react:src/indexjs
import React, { Component } from 'react'
import { render } from 'react-dom'

import 'katex/dist/katex.min.css'   // *** 必須です！
import MarkdownIt from 'markdown-it';
import mk from 'markdown-it-katex';

const md = new MarkdownIt();

md.use(mk)


const result = md.render('# 正規分布です。 \n  $f(x) = \\frac{1}{\\sqrt {2\\pi \\sigma^2}} \\exp\\Biggl(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\Biggr) \\qquad (-\\infty<x<\\infty)$');


class App extends Component {

  render() {
    return (
      <div>
        <div dangerouslySetInnerHTML={{__html: md.render('# markdown-it rulezz!')}}></div>
        <div dangerouslySetInnerHTML={{__html: result }}></div>
      </div>
    )   
  }
}

render(<App />, document.getElementById('root')) 
```


#２．試してみる

問題なく表示できましたが、少しフォントが薄いような気がします。
MathJaxのほうも試してみるかな。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/1484c1bd-d728-34b3-910c-cdeecba13a31.png)


今日はここまでです。


[draft.jsでMathJaxを使ってみる - 数式エディタ - Qiita](https://qiita.com/sand/items/1d0c43cc873d69319176)
[markdown-it-katexを使ってみる - 数式エディタ - Qiita](https://qiita.com/sand/items/8d8b5012104fec927b44)
JSフレームワークのサーバーサイド接続まとめ

昨今話題の3大JavaScriptフレームワーク

- Vue.js
- React
- Angular

について各入門書をそれぞれ読んでみて余りにもサーバーサイド(バックエンド)との接続に関する情報が乏しかったので自分なりに調べたまとめ
(本番環境ではビルドして配置してね程度しか書いてない事が多い(特にAngular)…といいつつwebpack-dev-serverの設定でproxyできるのを知ったのはmio先生の「基礎から学ぶ Vue.js」がきっかけだったり)

以下各バックエンドサイドのポートが9000番と仮定して
/apiにサーバーサイドスクリプトを配置していると想定した場合

### Vue.jsの場合
Vue CLIで

```shell
$ vue init webpack sample-app
```
としてプロジェクトを生成した場合
[プロジェクトルートディレクトリ]/config/index.js
にて

```js:index.js
/* 抜粋 */
proxyTable: {},
↓
proxyTable: {
  "/api":"http://localhost:9000"
},
```

としてやって

```shell
$ npm start
```
するだけでOK

### Angularの場合
Angular CLIにて
$ ng new sample-app
としてプロジェクトを生成した場合
プロジェクトルートディレクトリにproxy.jsonを以下の内容で作り

```json:proxy.json
{
  "/api": {
    "target": "http://localhost:9000"
  }
}
```
package.jsonのスクリプト欄を以下のように書き換える

```json:package.json
/* 抜粋 */
"scripts": {
  "start": "ng serve",
},
↓
"scripts": {
  "start": "ng serve --proxy-config proxy.json",
},
```
あとは同様に以下のコマンドにて起動する

```shell
$ npm start
```

### Reactの場合
これだけは正しい方法ではないと思う
→後で知った事だがgeek duck氏の[知っていると捗るcreate-react-appの設定](https://qiita.com/geek_duck/items/6f99a3da15dd39658fff)によるとhttp-proxy-middlewareというのがある模様(2018/12/15追記)
追記(2018/12/28)
この手の作業をやる場合はyarn ejectしてから行うべきだったようです

[プロジェクトルートディレクトリ]/node_modules/react-scripts/config/webpackDevServer.config.js
を以下のように書き換える

```js:webpackDevServer.config.js
/* 抜粋 */
module.exports = function(proxy, allowedHost) {
  return {
    proxy,
  }
}
↓
module.exports = function(proxy, allowedHost) {
  return {
    proxy {
       '/api': 'http://localhost:9000'
    },
  }
}

```

あとは同様に以下のコマンドにて起動する

```shell
$ npm start
```

後はバックエンド側でphpが動く場合
[バックエンドのドキュメントルート]/api/index.phpに

```php:index.php
<?php print_r($_REQUEST); ?>
```
などを書いて以下のURIで確かにGET値が取得できているかを確認
vue.js→http://localhost:8080/api/?id=1
Angular→http://localhost:4200/api/?id=2
React→http://localhost:3000/api/?id=3

ちなみにVue.jsとReactについてはLaravelを使えば簡単に導入が可能で
デフォルトはVue.js
Reactを使う場合は以下のコマンドで切り替えできる

```shell
$ php artisan preset react
$ npm install && npm run dev
```
また
[Laravelプロジェクトルート]/resources/js (5.7系)
[Laravelプロジェクトルート]/resources/assets/js (5.5系)
にあるスクリプトを書き換え時に自動ビルドして
[Laravelプロジェクトルート]/public/js
に配備したい場合サブのターミナルを一つ立ち上げて

```shell
$ npm install #(vueでこれを行っていない場合は最初に一回)
$ npm run watch
```
としてやれば対象ファイルを保存したトリガで自動ビルドされる

またRailsでもプロジェクト生成時に
$rails new sampleApp --webpack=vue
$rails new sampleApp --webpack=react
の様なオプションを付ける事で導入できるそうな（未検証）

###参考
[[Angular] Angular CLIでプロキシを利用する](https://qiita.com/ksh-fthr/items/a462a96de7080092b73c)
[Webpack はじめの一歩](https://qiita.com/kompiro/items/8337f28271b66957780e)
[Laravel Mixとは](https://qiita.com/nogizaka46/items/1724e13306e5705e0374)
[Rails 5.1 + Vue.js で開発を行う - part1 環境構築](https://qiita.com/cohki0305/items/582c0f5ed0750e60c951)
仕事を楽にしたいから評価してみた色々なツール ①（テストツール編）

システム業界に入って十ン年、どちらかというとレガシーなシステムに携わることが多かったマイクロソフターな自分。そんな自分にもそろそろ疲れが見え始め、最近はこんなことを考えるようになってきました。

- コードが長くて読みにくいな・・・
- 毎日同じことを繰り返しているような気がするな・・・
- いつも、眠たいな・・・（これは個人的な話）

  この状況から脱却すべく、世に出回っている色々なツールを評価してみました。この内容は私独自の検証ですので、参考程度に見てもらえれば幸いです。今回はテストツール編です。

## テストツール

レガシーなシステムでは、デザインパターンに則っとっている、あるいは、機能ごとにクラスを分ける、なんていうクラスベースの実装はまず無くて（独自研究ｗ）、１クラスに巨大なメソッドがドーンと鎮座して、所謂、ゴッドメソッド化していることが多いです。このゴッドメソッドは機能毎にコードが適切に分割されていない為、ユニットテストのコードを書くことはまず出来ません。ここでテストツールを導入するという話は詰んでしまいます。

細かいところに手を入れることが出来ないならば、外側からテストすればいいじゃない（いわゆる E2E テスト）。そう思い立ち、Web UI のテストツールを幾つか評価してみました。

最終的に、

- **WebUI で全ての操作を行って、分岐を網羅するのは工数的にも保守的にも無理**
- **テストに有効な箇所を見極め、部分導入するのが吉**
- **但し、WebAPI はユニットテストと同じ感覚で分岐を網羅できるので、非常に有効、というか、むしろ、やるべき**

という結論に至りました。全ての動作をサポートするのは困難なので、肝心のゴッドメソッド退治には有効な場合とそうでない場合があるでしょう。

今回評価したテストツールと、結果は以下の三種。

### 1. Puppeteer

- テストコード記述言語
  - node.js
- 検証時期
  - 2018 年 5 月頃
- 対応ブラウザ
  - Chrome (Chromium)
- 目的
  - ASP.net の画面追加機能の UI テスト、それに伴い追加した WebAPI のテストの為。
- メモ

検証時点ではテスト実行時に動作が不安定になることもあり、導入は難しいと判断。一方、WebAPI に関しては、問題なく動作しました。但し、WebAPI の Response が Json の場合、予想値との比較をする際にいい感じのメソッドがなく、最終的に文字列に変換するしかなかったのはマイナスポイント。可能な限りリテラルでの実装を避けたいのは、コンパイル時にエラーを検出したいサーバサイド技術者のサガであり、フロント出身の方は気にならないかも。

### 2. cypress

- テストコード記述言語
  - node.js
- 検証時期
  - 2018 年 6 月頃
- 対応ブラウザ
  - Chrome (Chromium)
- 目的
  - ASP.net の画面追加機能の UI テスト、それに伴い追加した WebAPI のテストの為。
- メモ

Puppeteer とほぼ同じ構成に見えるが、実際は多くの部分の異なっています。まず、動作は非常に安定しています。検証した範囲で問題があったのは iframe 内のコンテンツにアクセスできないこと。これは公式の人が現在は対応出来ていないがどこかでしたいと言っているので、いつか実装されるかも（<https://github.com/cypress-io/cypress/issues/136>）。
テスト実行用の GUI の管理画面が存在するのでそこからテストを実行することも出来ますし、コマンドラインからも可能で非常に使いやすいです。テスト記述時は GUI、リグレッション時は CUI と実践的な使い方が想定されていると思います。
WebAPI に関しては、Puppeteer と同様。個人的にはイチオシのツール。

### 3. Selenium

- テストコード記述言語
  - C#（他の言語も対応、今回の検証では C#を使用）
- 検証時期
  - 2018 年 11 月頃
- 対応ブラウザ
  - Chrome, Firefox, Edge, IE, etc
- 目的
  - ASP.net の画面が適切なタイミングでリフレッシュされているか確認する為。同様の検証が複数画面（総計 200 以上！）で必要になった為、実施。
- メモ

個人的に気に入っていた cypress を使わずに Selenium を試した理由は、EDGE のみ発生する問題を検証する必要があったから。
テストコードを記述できる言語も多く、対応ブラウザも多いです。汎用性は高いが、テストコードは設定する箇所も多く、テストコードが長くなってしまう傾向にある。但し、KatalonStudio や KatalonRecorder を使えば動作を記録してテストコードに変換してくれるので、この機能と併用して負担を軽減可能。
この検証は少々目的が特殊だった為、参考にはならないかも。


今回は以上です。
pythonスクリプトをdaemonにする[systemd編]

## 実行環境
- ubuntu 18.04-LTS

## はじめに
[こちらのブログ記事](http://dreamerdream.hateblo.jp/entry/2016/01/08/000000)を参考にpythonスクリプトをdaemon化しようと試みたが、forkしたプロセスがゾンビプロセスになってしまい、正しくdaemon化できなかった。
そこで、[Systemdを使ってさくっと自作コマンドをサービス化してみる](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)を参考に、systemdのserviceを設定してみた。

##手順
- テスト用pythonスクリプト`/opt/hello.py`を用意する。
`#!(shebang)`を忘れずに！

```python3:/opt/hello.py
#!/usr/bin/env python3
import time
def main():
    filepath = "/tmp/hello.log"
    log = open(filepath,'a')
    log.write("hello!\n")

if __name__ == '__main__':
    while True:
        main()
        time.sleep(30)
```
pythonスクリプトに権限を付与する。

```bash
$ sudo chmod 0755 /opt/hello.py
```

- service設定ファイル`/etc/systemd/system/hello.service`を作成する。

```bash:/etc/systemd/system/hello.service
[Unit]
Description = hello daemon

[Service]
ExecStart = /opt/hello.py
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```
- 後は通常のserviceと同じように起動すればよい。

```bash
$ sudo systemctl enable hello.service
$ sudo systemctl start hello.service
# 確認は以下のコマンドで
$ sudo systemctl status hello.service
```
- `hello.py`の動作確認

```bash
$ cat /tmp/hello.log
```
`hello.log`に"hello!"が書き込まれていればよい。
Cognos Analytics 11.1 を無料学習しよう

#はじめに
先週、こちらの記事の方で、Cognos Analyticsの最新バージョンである、11.1のリリースを紹介していました。
今回は、是非皆様に実際に触って体験して頂きたいと思い、とりあえず体験サイトにアクセスする手順をご紹介します。
**Cognos Analytics 11.1のリリースのご連絡**
https://qiita.com/shinyama/items/901eb6b1cdf720726a32

#Cognos Analytics 11.1へのアクセス
こちらのサイトにブラウザでアクセスします。
https://www.ibm.com/products/cognos-analytics

「Start your free trial」を選択します。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/a29ccba8-e547-de2d-d0c6-a0bcc151c045.jpeg)

「ログイン」を選択してください。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/f011e90e-dfcc-7286-a8ec-1a51a73ff2e8.jpeg)

IBM IDを入力して「次へ」を選択してください。
IBM IDをお持ちでない方は、「IBMアカウントの作成」からアカウントを作成して下さい。
※IBM IDを作成しても、特に課金されたり、面倒なことになったりしないので、大丈夫です。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/5387bbdd-96f4-a001-7d8c-f0910e4e14ce.jpeg)

パスワードを入力し「ログイン」。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/c3f6bc85-408f-822d-5af1-9cd9f1a28d98.jpeg)

この様な画面になりますので、下までスクロールして（ちゃんと読んで）、「次に進む」。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/40d7c828-1cdd-fe94-5d46-8102cf54b6f8.jpeg)
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/45db9739-7e75-605f-2545-9b452608377a.jpeg)

次の画面でも国や都道府県等を入力し「次へ」。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/4afe6dca-fdde-0d97-d914-5e5ce5c7b8c4.jpeg)

リダイレクトされ、Cognos Analytics 11.1にアクセスされました。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/4d9474d9-3be1-9686-3009-de00a69a76f2.jpeg)

**2回目以降のアクセス**
次にアクセスする時は、とりあえずこのURLにアクセスしてみると、
https://tryca.ca.analytics.ibm.com/bi/?perspective=home

この画面になるので、IBM IDとパスワードを入力し「ログイン」。
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/f09e9637-8ee9-28b9-4721-a18a6be28d2b.jpeg)

無事に再度アクセスできました。
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/349e86b7-abcc-df0e-3fd8-3986a2fcedae.jpeg)

とりあえずアクセスの手順はここまでです。
次回以降、新機能の使い方を記事にして下にリンク貼っていきますので、ご期待下さい。

#Cognos Analytics 11.1の新機能

**Cognos Analytics 11.1 レポートの機能の基本**
https://qiita.com/shinyama/items/1c08cd2c17112029e5d8

**Cognos Analytics 11.1 レポートでのスタイルの再利用機能**
https://qiita.com/shinyama/items/27d1184c3f98b29e9ddd

**Cognos Analytics 11.1 新機能 - 閲覧ビューの機能の紹介**
https://qiita.com/shinyama/items/d2a86dcfafbc5c483919

＜参考情報＞
**Cognos Analytics 11.1.1 インストール時の注意点2個**
https://qiita.com/shinyama/items/89793c89837afea0f1f4
EC2のEBS縮小化作業記録

# 目的
AWSのEC2のDeeplearningAMIを使ってちょっとした解析をしたりすることがあります。
SageMakerでは起動が遅い事があるのです。
しかし、大きなストレージを作ってしまって、整理したいことでてきました。
この記事はその作業メモです。

## 使用しているサイズを知る
```shell:
df -h
```
で確認します。
hは人間が見ても見やすいバイト表記にしてくれます。

## マルチスレッドでgzipの準備

pigzを使って、大きなデータディレクトリを圧縮します。

```shell:
sudo apt install pigz
```

## 移行するディレクトリを圧縮する
```
tar cv --use-compress-program pigz -f data.tar.gz data/
```
tar そのままでもいいのですが、10GB以上はちょっと遅いですよね。
> tar -czf hoge.tar ./hoge/    

## aws configure

awsの認証設定を行い、S3へアップロードする準備をします。

```
aws configure
```
ID/PASSを入れて、
ap-northeast-1
json
を初期設定としました。

## S3にアップロード
```
aws s3 cp ./hoge.tar.gz s3://fuga/faga1
```

## S3からダウンロード
```
aws s3 cp  s3://fuga/fuga1/hoge.tar.gz ./hoge.tar.gz
```

## ファイルの展開
```
tar -zxvf mc.tar.gz
```

これで解凍できるはず。。。
swift 配列の平均点を求める

#swift 配列の平均点を求める


```swift

//テストの結果配列(タプル型で名前と点数を持つ)
let testResults = [("東方",64),("虹村",33),("広瀬",86)]


//点数を求めるには人数と点数の合計が必要
var total = 0
var person = 0

//合計と人数を求める
for result in testResult { //タプル型を取り出す
total = total + result.1 //タプルの一番目の要素を足す
person = person + 1 //人数に１を足す
}

// 平均　＝ 合計/ 人数
let avg = total/ person

print("平均は\\(avg)点です")
```
言語化のススメ

[「PORT」アドベントカレンダー](https://qiita.com/advent-calendar/2018/port)３日目。
コンテンツクリエイター？の西山です。
非エンジニアですが、エンジニアでも非エンジニアでも役立つ情報を記事にしたいと思います。

##想定読者
こんなことを言われたことがある人

「お前の提案書は何がいいたいのかわからん」
「いただきましたメールの内容ですが、〇〇ということでよろしいでしょうか？」
「プレイヤーでは成功してたのに、マネージャーになった途端、結果が出せない人」

##言語化とは
[言語化とは（はてなキーワード）](http://d.hatena.ne.jp/keyword/%B8%C0%B8%EC%B2%BD)
自身の心のはっきりとしない思いを文章などの形で表現すること。

簡単にいうと、頭に思い浮かんだことを文章や言葉で表現することですね。

ちなみに私のこの記事を理解できない人がめちゃくちゃたくさんいる場合は私の言語化能力が低いものだとご理解ください(ﾉД`)ｼｸｼｸ

##言語化のメリット・デメリット
言語化能力が高まると以下メリットがあります

*メリット*
・メールや電話、あらゆるコミュニケーションにおいて、自分の意図が伝わる
・提案書を書くのがうまくなる
・部下のマネジメントがうまくなる
・スポーツがうまくなる
・ゲームがうまくなる
・説得力が増す
…etc

逆に以下のような弊害もあるかもしれません。

*デメリット*
・女子にモテない

例えば以下のような会話
男「〇〇ちゃんの好きな男性ってどんな人？」
女「大人な人かなぁ？」
男「大人な人ってどういう人？」
女「んー。芸能人でいうと、〇〇さんとかさ△△さんとかさ。ああいう人かな？」
男「その人たちのどういう特徴が大人って感じる？」
女「（こいつめんどくせー）」

何事もTPOということで。

##言語化レベル
言語化にはレベルがあると思っています。以下に私が定義する言語化レベルを記載します。
抽象的すぎてもわからないと思うので、各言語化レベルの人達がどのような言語化表現をするのか、例文を交えて解説します。

例文は「好きな男性ってどういう人？」と聞いた場合

レベル1：頭に思い浮かんだことを文章や言葉で表現することができない
回答文：「」
解説：表現することができないので、何も発することができません。

レベル2：頭に思い浮かんだことを文章や言葉で表現することはできるが、自分自身のみが理解でき、第三者は理解ができない
回答文：「好きな男性はくぁwせdrftgyふじこlpな人です」
解説：なにか発しているようですが、その人にしか理解できない言葉を発しているので、第三者は理解することができません。

レベル3：頭に思い浮かんだことを文章や言葉で表現することはでき、第三者も理解ができるが、抽象論でしか話しができない
回答文：「好きな男性は大人っぽい人です」
解説：大人っぽい人というのは理解できますが、抽象論でしか話しができていない

レベル4：頭に思い浮かんだことを文章や言葉で表現することはでき、第三者も理解ができ、さらに抽象論から具体論まで話しを展開することができる。
回答文：「好きな男性は大人っぽい人で、具体的にいうと、話し方が丁寧で、経済的にも自立している人です」
解説：抽象論から具体論まで話せる状態

ちなみに言語化レベルというのは話し合うテーマによってレベルが異なります。
例えば、好きな男性を言語化できる能力が4の人でも、自分がなぜその企業に勤めているのか？という質問をすると、言語化レベルが2になることもあります。

##言語化と感覚派
言語化には対になる言葉があります。それは感覚で行動する人です。
感覚派の方々は言語化はできないけれども、仕事やスポーツにおいて結果を残しているケースも多々あります。結果を残しているにも関わらず、マネージャーや監督、コーチといった役職についた途端に結果が出せなくなるパターンに陥るのは、感覚でしか物事を捉えていない為、人に何かを教えるということに不向きです。

よく野球選手やサッカー選手でプレイヤーとしては優秀だったけど、監督やコーチとして大成しないケースはこういうケースです。

##言語化は最強のビジネススキル
こうやって考えてみると、言語化って最強のビジネススキルなんじゃないかなと個人的に捉えています。もちろんロジカルシンキングやクリティカルシンキングというスキルも必要ですが、言語化能力が育っていないビジネスパーソンが少ないように思えます。

お客様に何か資料などを納品した時
お客様「資料いただきましてありがとうございます。ただ、何かしっくりこないんですよね。もうちょっとブラッシュアップできます？」

なんてことはよくあります。しっくり来てない部分ってなんだよ！言語化できてないと、こっちも資料の修正できないよ！と思います。

##言語化トレーニング
全ての事象についてその理由は何か？相手に伝わるか？を意識して、物事を捉えることで、磨かれると思います。

例えば、ある日のランチに生姜焼き定食690円とかつ丼定食800円があったとして、生姜焼き定食を選んだ場合、なぜ生姜焼き定食を選んだのかを考察する。
その理由は、「かつ丼定食よりも生姜焼き定食の方が110円安かったから選んだ」とか、「ヘルシー志向で生姜焼き定食を選んだ」とか。そういうことでも日々鍛えられていきます。

##終わりに
冒頭にも書きましたが、言語化はTPOわきまえた行動を。
議事録をGitLab で管理するとこうなった


議事録ってどうやって作成・管理してますか？
だいたい、以下のような感じだと思います。

1. 会議中にメモを取る
2. メモをもとに議事録を作成する
3. 参加者に確認依頼をだす
4. 修正し確定したものをメールに添付して送信する、あるいは共有フォルダとかに保存して通知する。

これに `GitLab` を使ってみると割と便利だったので紹介します。 


## 1. 会議中にメモを取る

ここは、今まで通り頑張ってください。。。
あえて、GitLabに絡めるなら、GitLab のWeb IDEで作成していくとか。。

## 2. 議事録の作成

Markdown、AsciiDocのようなGitLabでプレビューがサポートされている形式で書きましょう。
それを GitLabのレポジトリで、新規ブランチを作成し、作成した議事録を追加します。

議事録のフォーマットがあるなら、それも一緒にレポジトリに入れておきましょう。


## 3. 参加者に確認依頼を出す

ここからが、GitLab で議事録管理するうえでの肝の部分です。

参加者への確認依頼を`Merge Request(MR)`で出します。
そして、この際、以下のルールを決めておきます。


### 指摘がある場合

通常のMRのように該当箇所にコメントをつけてもらいます。
こうすることで、全ての人の指摘が一箇所で確認できます。
メールでの回覧レビューだと各々が返信してくるので複数のメールをみて統合する作業が必要になってきますが、これだとその作業から解消されます。

また、レビュアーはコメントをするときに、他の人のコメントがすぐ目につくので、指摘が食い違う場合は、指摘者同士で議論してくれます。もう、板挟みからおさらばです :smile: 

### 指摘がおわった場合

確認が終わったことがわかるアクションを決めておきましょう。

例えば

* Thumbs up :+1: マークを押してもらう
* コメントに `OK` を残してもらう
* MRの説明に、以下のような見て欲しい人タスクを作成しておきチェックしてもらう

   - [ ] Aさん
   - [ ] Bさん

こうすることで、指摘が完了したことをきちんと把握できます。


ちなみに、GitLab EEなら、MR時に必要な承認者を設定できる機能がある模様 [Merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/merge_request_approvals.html) 

### 宿題が出た場合

GitLab のIssue を作成し、かつこのMRとの関連をつけるようにします
（MRの reference をIssueに記載するだけで、双方向から辿れるようになります）。

これにより、次回の会議時に、宿題の結果や進捗の確認が容易です。
IssueからMRに飛ぶこともできるので、後から見た時に元の議事録を確認でき、宿題がでた経緯がすぐわかるようになります。


## 4. 修正し確定したものを保存する

指摘が完了したことを確認できたら、マージボタンをクリックします。



## おわりに

上記の運用の場合、全てGitLabのUI上で完結できるので、「Gitなにそれ？」の人でも大丈夫です。