OmniAICreator/Qiita-1.07M huggingface dataset:
たまに見かけるattr_accessor(*Hoge::ATTRIBUTES)の仕組みについて調べてみた

#はじめに
たまに下記のようなコードを見かけることがあります。
`attr_accessor(*Hoge::ATTRIBUTES)`
同僚のSさんと話している時に、この書き方でなぜ動くんだろうという話になり、調べてみたら面白かったのでまとめておこうと思います。

#先に結論から
・メソッド呼び出しをする時に引数に`*`をつけると配列を展開することができる
・`attr_accessor`は複数個のSymbolを受け取ることができる
・`attr_accessor(*Hoge::ATTRIBUTES)`とした時に、配列が展開されて複数個のSymbolが渡される

#よく見る使われ方
よく見るのは、あるクラスで属性の定数配列を定義して複数のクラスで使い回すというものだと思います。

・・。
文章だと何を言ってるか分かりませんね・・

実際に見た方が早いと思うので、早速コードを見てみましょう。

```ruby
class Hoge
  ATTRIBUTES = %i[
    name
    age
  ].freeze

  attr_accessor(*Hoge::ATTRIBUTES)
end

class Huga
  attr_accessor(*Hoge::ATTRIBUTES)
end
```

この例の場合は、Hogeで属性の定数配列を定義してあげて、Hugaでも使いまわしています。
これにより、重複したコードを減らすことができます。便利！！

#仕組みについて
ここまでで、なんとなく使い方は分かっていただけたと思います。
ですが、なぜこれで動くかは謎のままです・・

実際にどのような仕組みになっているかを確かめるためにいろいろ試してみました。
##引数で渡す時に`*`をつけないでみる
```ruby
class Hoge
  ATTRIBUTES = %i[
    name
    age
  ].freeze

  attr_accessor(*Hoge::ATTRIBUTES)
end

class Huga
  # Hogeの前の`*`を消してます
  attr_accessor(Hoge::ATTRIBUTES) # == attr_accessor([:name, :age])
end
```
上記を実行してみると以下のようなエラーが表示されました。
`TypeError: [:name, :age] is not a symbol nor a string`

エラーメッセージを見ると、`symbol`か`string`しか受け付けないよと言われてるみたいです。
[リファレンス](https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html)をみると、
>[PARAM] name: String または Symbol を 1 つ以上指定します。

とあり、配列は渡すことができないためエラーになっていたようです。
ここで、重要なのは**String または Symbol を 1 つ以上指定**の部分です。

##そもそも`*`をつけたときの挙動って？
なんとなく、**引数に\*をつけるかつけないかで挙動が変わる**というところまでは分かってきました。具体的にどう変わるのかを調べていると、[こちらの記事](https://qiita.com/u-akihiro/items/e796aedf17016fe943b8)を見つけ、\*をつけることで配列を展開して渡すことができるということが分かりました。


実際に試してみます。

```pry
pry(main)> p([1,2])
[1, 2]
pry(main)> p(*[1,2])
1
2
```
確かに`*`をつけることで、配列が展開されて渡されてるようです。

##attr_accessor(*Hoge::ATTRIBUTES)の正体
ここまでで、既にお気づきの方もいるかもしれませんが、
`attr_accessor(*Hoge::ATTRIBUTES)`の部分は以下のようになります。

```ruby
class Hoge
  ATTRIBUTES = %i[
    name
    age
  ].freeze

  attr_accessor(*Hoge::ATTRIBUTES) # == attr_accessor(:name, :age)
end

class Huga
  attr_accessor(*Hoge::ATTRIBUTES) # == attr_accessor(:name, :age)
end
```
つまり、`*`をつけることで配列が展開され、`attr_accessor`には複数個のSymbolが渡されていました。
先ほども触れましたが、[リファレンス](https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html)には
>String または Symbol を 1 つ以上指定

とあり、複数個のSymbolを指定することが可能なので、問題なく設定できていたようです。

#終わりに
Rubyは知れば知るほど新しい発見があって、面白い言語だなーと改めて思いました！

#参考記事
- [リファレンス](https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html)
- [配列の展開](https://qiita.com/u-akihiro/items/e796aedf17016fe943b8)
DockerでMosquittoを動かしてMQTTとWebSocket通信してみる

DockerfileとMosquittoの設定ファイルを作ります。

```dockerfile:Dockerfile
FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y mosquitto mosquitto-clients

COPY ./mosquitto.conf /etc/mosquitto/mosquitto.conf

# MQTT Port
EXPOSE 1883

# WebSocket Port
EXPOSE 8080

CMD ["mosquitto", "-c", "/etc/mosquitto/mosquitto.conf"]
```

```conf:mosquitto.conf
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

listener 1883

listener 8080
protocol websockets
```

イメージをビルド、コンテナを起動します。

```bash
$ docker build -t mosquitto_image .
$ docker run -d -p 1883:1883 -p 8080:8080 --name mosquitto_container mosquitto_image
```

MQTTクライアントからpub/subしてみます。

```bash
$ mosquitto_pub -h localhost -p 1883 -d -t hello_topic -m "hello"
Client mosq-8zgvruDJ1gCOBNFchP sending CONNECT
Client mosq-8zgvruDJ1gCOBNFchP received CONNACK (0)
Client mosq-8zgvruDJ1gCOBNFchP sending PUBLISH (d0, q0, r0, m1, 'hello_topic', ... (5 bytes))
Client mosq-8zgvruDJ1gCOBNFchP sending DISCONNECT

$ mosquitto_sub -h localhost -p 1883 -d -t hello_topic
Client mosq-GP0NmJL6vHdSMuuhF7 sending CONNECT
Client mosq-GP0NmJL6vHdSMuuhF7 received CONNACK (0)
Client mosq-GP0NmJL6vHdSMuuhF7 sending SUBSCRIBE (Mid: 1, Topic: hello_topic, QoS: 0, Options: 0x00)
Client mosq-GP0NmJL6vHdSMuuhF7 received SUBACK
Subscribed (mid: 1): 0
Client mosq-GP0NmJL6vHdSMuuhF7 received PUBLISH (d0, q0, r0, m0, 'hello_topic', ... (5 bytes))
hello
```

MQTT over WebSocketからもpub/subしてみます。

https://mitsuruog.github.io/what-mqtt/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/0a5ea4fc-d8ad-1d45-df58-012fbdab75e1.png)

以上。
Vuetifyでタイトルを中心に持ってきたい

Vuetifyを使ってヘッダーを作成している時に困ったこと。

メニューバーなどが無く、ただタイトルがあるだけであれば以下のような記述でタイトルを中心に持ってくることができると思いますが、

```Top.vue
<template>
  <v-app>
    <v-app-bar>
      <v-spacer />
      <Title />
      <v-spacer />
    </v-app-bar>
  </v-app>
</template>
```

一番右側などにメニューバーやアイコンがある場合、
その分横にずれてしまい、タイトルが中心にこなくなってしまいます。

なのでclassでmarginを指定することで中心にくるよう調整しました。

```Top.vue
<template>
  <v-app>
    <v-app-bar>
      <Title class="mx-auto"/>
      <Menu class="ml-n15"/>  //数字(15)の部分は各自調整してください
    </v-app-bar>
  </v-app>
</template>
```

まずTitleにつけた
class="mx-auto"は
横方向のマージンを自動で調整してくれるものです。

そしてMenuにつけた
class="ml-n15"で
左側のマージンを15削りました。
n15の「n」というのはネガティブの意味で、
今あるマージンからその後につけた数字分だけ削ることができるものです。

n15の「15」の部分を各自調整すると以下のように上手くタイトルを中心に持ってくることができます。

![スクリーンショット 2020-08-31 23.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/13dc5817-e0f0-12f2-c15e-ce317cf9b101.png)
データ同化の有名アルゴリズムの比較


## 初めに
ちょっと調べる機会があったので簡単にまとめてみます。
間違いがあったらコメントください。

アルゴリズムで代表的なものは、
- カルマンフィルタ
- アンサンブルカルマンフィルタ
- パーティクルフィルタ
- 四次元変分法
のようです。

比較する観点は以下になります。
　
## 比較項目
### 略称
それぞれ一般的に使われる略称があるようです。

### 背景にある理論
ベイズ統計に基づくもの、変分法に依る最適化に基づくものある。

### 逐次の情報入力
オンライン処理が可能かについてです。

### 状態空間の制約
シミュレーションシステム、観測システムに関する制約です。

### 確率分布の制約
シミュレーションノイズ、観測ノイズに関する制約です。

### 計算コスト
こちらはあくまで一般論ですが、計算コストの大きさの比較です。

### 実装コスト
こちらも定量的な比較ではないですが、定式化の必要性などの手続きを考慮して
自分なりに見積もっています。


## 比較表
それぞれ比較した表を下にまとめます。

| 手法 | 略称 | 背景にある理論 | 逐次の情報入力 | 状態空間の制約 | 確率分布の制約 | 計算コスト| 実装コスト |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| カルマンフィルタ | KF | ベイズ統計 | 可能 | 線形システムに限る | 正規分布に限る | 比較的小さい | 大きい <br> (非線形システムの場合線形化が必要) |
| アンサンブル<br> カルマンフィルタ | EnKF | ベイズ統計 | 可能 | なし | 正規分布に限る | やや大きい | 低い |
| パーティクル<br> フィルタ | PF | ベイズ統計 | 可能 | なし | なし | 大きい | 低い |
| 四次元変分法 | 4DVar | 最適化 | 不可 | なし | なし | 少ない | 大きい <br> (ヤコビアンの計算など具体的にする必要があるらしい) |

やはり、フィルタ系のアルゴリズムに対して変分法系のアルゴリズムは根本の理論と用途に違いがあるようです。
フィルタ系アルゴリズム間での比較は主に適用できる問題に違いがあることが分かります。


## 参考
データ同化　-次世代のシミュレーション技術-
https://www.asakura.co.jp/G_12.php?isbn=ISBN978-4-254-12786-7
Gnu-COBOL PERFORMでループ

##  TIMES

`PERFORM ... TIMES ... END-PERFORM.`

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 COUNTER PIC 9(3) VALUE 1.
PROCEDURE DIVISION.
  MAIN SECTION.
    PERFORM 10 TIMES
      DISPLAY "COUNTER = " COUNTER
      ADD 1 TO COUNTER
    END-PERFORM.
  STOP RUN.

```

## UNTIL

`PERFORM ... UNTIL ... END-PERFORM.`

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 COUNTER PIC 9(3) VALUE 1.
PROCEDURE DIVISION.
  MAIN SECTION.
    PERFORM UNTIL COUNTER > 10
      DISPLAY "COUNTER = " COUNTER
      ADD 1 TO COUNTER
    END-PERFORM.
  STOP RUN.

```

## VARYING

`PERFORM VARYING ... UNTIL ... END-PERFORM.`

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 COUNTER PIC 9(3) VALUE 1.
PROCEDURE DIVISION.
  MAIN SECTION.
    PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > 10 *> 「FROM A BY B UTILE」 -> AからBづつ
      DISPLAY "COUNTER = " COUNTER
    END-PERFORM.
  STOP RUN.

```

**コンパイル**

```
USER-no-MacBook-Air:COBOL user$ cobc -x --free hello.cob
```

**実行**

```
USER-no-MacBook-Air:COBOL user$ ./hello
COUNTER = 001
COUNTER = 002
COUNTER = 003
COUNTER = 004
COUNTER = 005
COUNTER = 006
COUNTER = 007
COUNTER = 008
COUNTER = 009
COUNTER = 010
```
VSCodeで.vue拡張子でもemmet機能を有効にする

# 概要
VSCodeにはデフォルトで`.html`に対して`emmet`がついています。
これを`Vue.js`の`.vue`拡張子のコンポーネントファイルなどでも使いたいなと思って調べたときの備忘録です。

- Emmetとは？
    - HTMLやCSSを省略記法で完結に記述するためのツールのことです。
    - VSCodeでは`.html`のファイルに対してデフォルトで有効になっています。

```html:こういった記述で...
<!-- (1) -->
div#Header.header
<!-- (2) -->
ul>li*2
<!-- (3) -->
dl>dt+dd
```

```html:こういった形に自動的に変換されます
<!-- (1) -->
<div id="Header" class="header"></div>
<!-- (2) -->
<ul>
  <li></li>
  <li></li>
</ul>
<!-- (3) -->
<dl>
  <dt></dt>
  <dd></dd>
</dl>
```

# VSCodeの設定
普段、VSCodeの補完機能などの設定をワークスペース毎の設定にしているのでその前提で記述します。

## `.vscode`ディレクトリ
- プロジェクト内に`.vscode`ディレクトリを作成します
- `.vscode`ディレクトリ内に`setting.json`ファイルを作成します

## `setting.json`emmetの設定を記述
`setting.json`の中に以下の記述を追加します。

```json:setting.json
{
  "emmet.includeLanguages": {
    "vue": "html"
  }
}
```

## 他の拡張子でも...
|拡張子|emmetの補完|
| --- | --- |
| "vue" | "html" |
| "erb" | "html" | 
| "php" | "html" |
Ansibleでシンボリックリンク自体の所有者を変えたい

環境整備の一環で、Ansibleで現状存在するシンボリックリンクを管理しよう、という話があり、対応のために検証してたらちょっと困ったことがあったけど、色々調べてみたら解決した。で、日本語では見つからなかったので、一応書いて残しておこう、という目論見。

## 結論

`follow`に`no`や`false`を指定しよう。

## 前提

既にあるけどドキュメントがなく実機を見るしかないのでリプレース作業の時に死ぬ(というか死んだ)ので、形式は問わないからやっていける範囲で実機の資産を確認する以外で見れる情報を作らないと、となった時のこと。

であるので、今ある設定がどういう前提の元行われたとか抜け落ちてるので、脳死で丸コピーしなくてはならなく(実際に必要かどうかはともかく変えるために顧客を説き伏せる労力がもったいないのでそうせざるを得ない)、実機の状態からそのままplaybookに書き記すことになった。

実機のシンボリックリンクの情報(リンク元・リンクファイル・オーナー・グループ)を一気に取る。半角スペースがあるパスが含まれる場合はこのコマンドでは無理です、ご愁傷さまです。

```shell
TARGETDIR="/XXX" ## 情報取得したいディレクトリのルート
find ${TARGETDIR} -type l -ls | awk '{ print $13,$11,$5,$6 }' | tee ~/symlink.txt
```

一覧から不要なものとかを目視で泥臭く取り除いたら、YAMLに変換。

```shell
awk 'BEGIN { print "symlink:" }; { print "  - src: "$1; print "    dest: "$2; print "    owner: "$3; print "    group: "$4 }' ~/symlink.txt | tee ~/vars.yml
```

以下のようなplaybookを作って実行。

```playbook.yml
tasks:
  - name: Create symbolic link
    file:
      src: '{{ item.src }}'
      dest: '{{ item.dest }}'
      owner: '{{ item.owner }}'
      group: '{{ item.group }}'
      state: link
    with_items: '{{ symlink }}'
```

シンボリックリンクはできたけど、オーナーとグループが変わってない。変わってないのみならず、リンク元のオーナーとグループが変わっている。

## 解決

Ansibleに関係なく、シンボリックリンク自体に対して`chown`しようという時には`-h`オプションが必要になる。それと同じような物が必要なのかもしれない。でも[公式のドキュメント](https://docs.ansible.com/ansible/latest/modules/file_module.html)のリンク作成の例文にそんなの付いてないんだけど……。

となってたけど、GitHubのissuesで[この件についてのissue](https://github.com/ansible/ansible/issues/39553)があった。

> これは2.5.0以降の挙動のはずでした。
> しかし、バグのため、2.5.2でバグが修正されるまで挙動が適切に設定されませんでした。
> リンクのターゲットではなく、リンク自体に適用したい場合は、follow=Falseを設定できるようにする必要があります。

ということで、fileモジュールの設定に`follow: no`を指定して、解決。

## 参考

- [file – Manage files and file properties — Ansible Documentation](https://docs.ansible.com/ansible/latest/modules/file_module.html)
- [file applying owner/group/mode to symlink destination, not the link itself in Ansible 2.5.2 · Issue #39553 · ansible/ansible · GitHub](https://github.com/ansible/ansible/issues/39553)

## 余談

そもそもの話、シンボリックリンク自体のパーミッションとかオーナーとかの設定が必要な場面ってあるのか……？

Ansibleのバージョンが2.5以前は、`follow`のデフォルトは`no`だったらしく、この変更からして、シンボリックリンク自体の権限変更はデフォルトにするほどではない、という判断によるんじゃないのかな、と思うが、実際はどうなのだろう。
Webアプリケーションを表示する際の通信方法を学ぶ

インターネットを切断したら、Webアプリケーションは利用できません。
つまり、Webアプリケーションを表示するまでには、インターネットを介した情報やデータの送受信があります。
情報やデータの送受信には、HTTP通信と呼ばれる通信方法を用います。

HTTP通信とは
Webアプリケーションを表示する際の、情報やデータなどを送受信するための通信方法です。
この通信は情報を持っており、HTMLなどが含まれます。
通信後にそれらを画面に表示することで、私達はWebアプリケーションを使うことができます。

また、HTTP通信でやり取りをする場所を、URLが示しています。
ログインユーザーが、URLを入力しても特定のページに遷移できないようにする



【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どういう時に起きるか</b>

<b>3.どのように使うのか</b>

<b>4.ここから学んだこと</b>



1.結論
----------------------------------------
<b>”redirect_to” と ”unless”</b>を使う！
<br>


2.どういう時に起きるか
----------------------------------------


```ruby:buy_item_controller.rb
  def edit
    @buy_item = BuyItem.find(params[:id])
  end
```
例えば、
マイページやマイアカウント、自分の投稿したページを編集する時に"edit"アクションをプログラミングすると思います。

この時に上記のプログラムだけでは、URLに〜〜/〜〜/editと打ち込んでしまえば、ログアウトしているユーザーや、同じアプリケーションにログインしているユーザーでも異なるアカウントを操作できてしまいます。


<br>
3.どのように使うのか
----------------------------------------

```ruby:buy_item_controller.rb
def edit
    @buy_item = BuyItem.find(params[:id])
   redirect_to root_path unless current_user.id == @buy_item.user_id
end
```
gem"devise"を使用しているので”current_user.id”が入っています。


”redirect_to root_path”で”トップページに戻る”ようにしています。

”unless current_user.id == @buy_item.user_id”では、”もし現在ログインしているユーザーが該当の商品の出品者ユーザーではなかったら”とプログラムしています。

なので、出品者とログインしているユーザーが違う場合は商品を編集できません。


<br>
4.ここから学んだこと
----------------------------------------
ログアウトしている場合も"edit"で設定しようと思いました。しかし、ログアウトしている場合は範囲がすぎて全てのアクションに設定しないといけません。そのときにbefore_actionを思い出しました。before_actionとexceptを使用して無限ループが起こらないアクション以外（index,show以外）はunlessでプログラミングしてしまえばいいと思いました。

```ruby:buy_item_controller.rb
 before_action :move_to_index, except: [:index, :show]

  def move_to_index
    redirect_to new_user_session_path unless user_signed_in?
  end

```
<br>
Gnu-COBOL EVALUATEで条件分岐

- `EVALUATE 条件`...`END-EVALUATE.`


```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 SIGNAL PIC X(5).
PROCEDURE DIVISION.
  MAIN SECTION.
  MOVE "YELLOW" TO SIGNAL.

  EVALUATE SIGNAL             *> 「EVALUATE」
    WHEN "RED"                *> 処理部分は「.」不要
      DISPLAY "STOP!"
    WHEN "BLUE"
    WHEN "GREEN"
      DISPLAY "GO!"
    WHEN "YELLOW"
      DISPLAY "CAUTION!"
    WHEN OTHER                *> 「OTHRE」 どの「WHEN」にも当てはまらない場合
      DISPLAY "WRONG SIGNAL!"
    END-EVALUATE.             *> 「END-EVALUATE.」
  STOP RUN.

```
[Vuex]ヘルパー関数createNamespacedHelpersを複数のstoreから使う

createNamespacedHelpersの使い方に関してはこちらの記事をご参照ください。
[[Vuex]ヘルパー関数createNamespacedHelpersの使い方](https://qiita.com/kazukinaruse/items/4dc0909220b2a43ffd3a)

createNamespacedHelpersを複数のstoreから使用するには以下のように記述します。

```Top.vue
<script>
import { createNamespacedHelpers } from 'vuex'

const { mapState, mapActions } = createNamespacedHelpers('hoge/Hoge')  // Hoge.jsのStateとActionsを使う
const {
  mapState: mapStateOfFuga,
  mapActions: mapActionsOfFuga
} = createNamespacedHelpers('fuga/Fuga')  // Fuga.jsのStateとActionsを使う

export default {
  computed: {
    ...mapState([
      'aaa',
      'bbb'
    ]),
    ...mapStateOfFuga(['xxx'])
  },
  methods: {
    ...mapActions([
      'ccc',
      'ddd'
    ]),
    ...mapActionsOfFuga(['yyy'])
  }
}
</script>
```

このようにFugaのstoreを参照する時には、
mapState: mapStateOfFuga
のように名前をつけて定義しました。
これをせず、Hogeと同じようにmapStateだけで使ってしまうと、
Hogeのstoreを参照するのかFugaのstoreを参照するのか分からずエラーとなります。

また、今回はHogeのstoreは名前をつけずに使いましたが、
Fugaと同じように名前をつけて使用しても全く問題ないです。
チーム開発において「ふりかえり」は必要か

# 前書き

ふりかえりのメリットをまとめているサイトはよく見かけますが、
実際に行って得たものを体系的に語っているものはあまり見かけないので、今回記してみました。

ふりかえりを行うか否かは、現場や案件、チームによってまちまちだと思います。
では、いざ初めて行うことを検討した時に、
`定期的に行わなければ成果は得られなそう`、`工数を取ってまで行う必要があるのかな`、など、コストとリターンのバランスを考える方は多いと思うので、私が実際に行って感じたことをまとめてみます。

※`ふりかえり`：過去の経験から得た気づきや知識を元に、より良い未来を作り
だしていくこと
引用元：http://objectclub.jp/download/files/pf/RetrospectiveMeetingScenario.pdf


# 実施背景

執筆時点で、私はある案件中の１チームのリーダーを務めていた。
リーダーという立場になってから約４ヶ月経った時に、チームとしての作業に１段落が着いたので、
チームとしての成果率の上昇を期待したのと、個人的な好奇心から開催してみた。


# 結論

ふりかえりは絶対に行った方が良い！
但し、必ずしも定期的に開催する必要はないと感じた。

# 実施詳細

## 概要

### チーム編成

１２人（リーダー（私）＋メンバー１１人）

### 実施方式

調べてみるとふりかえりのフレームワークが幾つか見つかり、
その中で１番シンプルそうな`KPT`を採用した。
※KPT参考：http://objectclub.jp/download/files/pf/KPT_TIPS.pdf

### 実施環境

* 声のみでのオンライン会議（コロナでリモートワークとなったため・・・）
* リーダーが司会進行をし、１人ずつ意見を聞いていく（但し、事前にアイスブレイクを行い、いつでも気楽に声を発せられる空気を整えておく）
* スプレッドシートを共有使用、画面共有をして意見を記載していく（オンラインでなければ付箋&ホワイトボードが望ましい）
* ちなみにシートのレイアウトはこんな感じ↓
![スクリーンショット 2020-09-03 22.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609990/80aec406-93a4-3900-973b-89eac1c8d8cb.png)

### 実施時間

2時間

## ふりかえりに対するイメージ

開催前は、ふりかえり（会）と聞いて以下を想像した。

* 開催すれば（漠然と）チームの良い点や悪い点が分かりそう
* 工数がかかる（しかもメンバー全員分）
* 定期的に開催しないと意味ないのかなー（面倒）
* ゆーて想定可能な意見や、全員似たり寄ったりな意見しか出なそうでありきたりな反省会となりそう

前書きの通り、工数を取ってまで行うメリットがあるとは思えなかったのが正直な感想。

## 実際に行って

### 想定通りの成果

* チームの良い点、悪い点を把握できた
* 今後の作業の方針を、効率化に向けて修正できた

### 想定外の成果

* 可視化することにより、頭で考えるよりも遥かに実態を把握できた
* 可視化＋共有することにより、メンバー全員が実態を認識することができた
* 通常業務では知り得ないであろうメンバーが感じていた改善点を掘り出せた
* チームメンバー間の互いの話しやすさが増した（気がする）

## 所感

2時間もかけて行ったが、その工数を捧げてもあまり得る程のリターンを得られた。
まず、誰もが想定するような成果を十分に得ることができた。
そして重要なのは、想定していなかった結果を多く得られたこと。
特に、意見の`可視化`＋`共有`は、想像では絶対に得られない成果を得ることができることを実感した。（この気付きは他の分野でも活きると感じた）

## 実施における注意点

* メンバー全員から均等に意見を掬い上げること
    * 特に普段意見を言わない人から掘り出すことが重要
* 会議感を出さないこと
    * 緊張感のある場では形式的な意見しか出ない、真面目な場では出ないような意見こそ重要だったりする

# まとめると

* ふりかえりには工数をかけるほどの価値がある
* 行ってみないと価値は絶対にわからない（ぜひ１度行って欲しい！！）
* 行うことで、チームはもちろん、個人の成長にも繋がる
* ブラッシュアップという意味では定期的な開催の方が良いが、1回行うのみでも十分にリターンは得られる

# 後書き

今回、ふりかえりについての私の体験談と意見をまとめてみました。
チーム力の向上を重じている現場はあまり見ませんが、
私は個人よりチーム力の向上こそ、開発の質の向上により結びつくと思っています。

よろしければご意見お待ちしております。
Python基本文法を学んでみた

# Python基本文法
Python初心者が覚えるべき基本文法は４つあります。
・出力（print）
・コメント（#）
・変数代入（a = value）
・四則演算（+, -, *, /, %）
# 出力（print）
まず必ず最初に覚えるのが、出力（print）。
画面上に出力したい場合、下記を入力します。

```Python:
print("Hello World")
```

すると、Hello Worldが画面に表示されます。

「こんにちは」と出力させたい場合は

```Python:
print("こんにちは")
```

""で囲むことで文字を出力することができます。
また、「数値」も扱うことができます。
数値は文字列と違って、クォーテーションで囲む必要がありません。
数値は左図のように、数学と同じ記号「+」「-」を用いて、足し算と引き算が可能です。数値や記号はすべて半角で記述します。また記号の前後の半角スペースはなくても構いませんが、入れた方がコードが見やすくなります。

# コメント（#）
 #をつけると、コメントアウトになります。
プログラム文として実行されません。

```Python:
print("Hello World")#画面に出力したい場合はprintを使います。
```

コメントを入力する事で、後からコメントを見返した時にすぐ理解できるようになりますね。

また、他人と共有する際に役に立ちます。
# 変数代入（変数名 = 値）
次は、変数代入です。

変数とは、データ（値）を入れておく箱のようなものです。
この箱（変数）に名前（変数名）をつけることで、その名前を用いて変数に値を入れることや、変数から値を取り出すことができます。

```Python:
name = 'キータ太郎'
```

変数はこのように「変数名 = 値」で定義します。変数名はクォーテーションで囲む必要はありません。

プログラミングの「=」は「等しい」という意味ではなく、「右辺を左辺に代入する」という意味になるので覚えておきましょう。

# 四則演算（+, -, *, /, %）
四則演算は下記です。

| 演算 | 記号 |
|:-----------|------------:|
| 足し算  | + | 
| 引き算 | – | 
| 掛け算 | * | 
| 割り算 | / | 
| 余り計算 | % | 

```Python:
print(1 + 1) 
print(8 - 4)
print(5 * 5)
print(5 / 2)
print(5 % 2)
#クォーテーションで囲ってみる
print('9 + 3')
```

```Python:>_出力結果
2
4
25
2.5
1
#⬇️クォーテーションで囲うとこうなる
9 + 3
```

こののように、「1 + 1」は計算結果である「２」を出力してくれます。
一方、「'9 + 3'」のようにクォーテーションで囲むと、文字列として解釈されて、そのまま「9 + 3」が出力されます。
このようにプログラミングの世界では、文字列と数値は全く異なるものとして扱われます。
プログラミングでは、足し算・引き算以外の計算をすることもできます。
掛け算は「*」、割り算は「/」で表します。また、「%」で割り算の余りを計算することができます。
この3つの記号は数学で用いる記号と少し違いますので、しっかり覚えましょう。

[Python記事まとめ](https://qiita.com/kamata1729/items/eaf1d7b945b3a61a4fdd#_reference-3bde6d5768eb1e09fd98)
インフラからソフトウェア開発に転向した話

アプリケーション周りに転向してから約半年経ったので、これまでの振り返りを含めて書いていきたいと思います

#自己紹介から…
あんた誰？って感じだと思うので簡単に…

高校卒業してから飲食店でマネージャーをやった後に未経験でIT業界に転職し、ネットワーク、サーバー周りを合計3年程経験したのちソフトウェア開発へ転向

最近では[DBに関する記事](https://qiita.com/bouitengineer12/items/e63e5f7d6f628da11362)を書いてみたり、ソフトウェアの設計について勉強したりしてます

#具体的に何をしてたの？
いくつかの職種を渡り歩いているので、4つにまとめてみました

①ネットワークの設計・構築・運用
主にCisco製品やFujitsu製品を使い、設計、構築を行っていました。
所属している部署が運用も行う部署だったため、リソースが足りないときは運用のサポートも行っていました。
基本的にはリプレースの対応だったのですが、新規構築の時には顧客への説明から設計、構築、運用まで一貫して行いました。
他にもLBやFWの運用や、障害対応等も行っていました。

②サーバーの設計・構築
主にHP製品、VMware製品を使い、設計、構築を行っていました。
物理的なサーバーの組み立てから、ADサーバーの設計、構築、移行等も行っていました。
主に扱っていたのはvCSAをはじめとするVMware製品でしたが、Hyper-Vを用いた構築作業も行ったこともあります。
NetApp製品やHP製品のストレージの設計、構築も行うことがあり、FCを用いてサーバーとの接続まで行っていました。
バックアップの設計やログローテーションの設計、ソフトウェアの導入等も行っていました。
また、後輩の教育等も行っていました。

③データベース設計・構築
Oracle DBやPostgreSQLを用いてデータベースの設計、構築を行っていました。
小規模なものではER図をはじめとする設計書の作成から構築用クエリーの作成、テストまで行いました。
大規模なものでは途中参画となることが多く、現行の設計で考慮不足となっている箇所の指摘、修正から修正用クエリーの作成、現行DBの調査等を行っていました。

④アプリケーション設計・構築
Java、Spring Frameworkを用いてアプリケーションの設計、構築を行っています。
まだ日は浅いのですが、小規模なものではDDDを用いた設計、モデルと紐づくようなコーディング、ユニットテストの作成等を行っています。
大規模なものでは途中参画となることが多く、現行の設計で考慮不足となっている箇所の指摘、デバックから現行環境の調査や、システム更改に向けたリプレース方法の考案等を行っていました。

(転職サイト用に作っていたものをコピペしてきましたｗ)

#インフラ周りをやめた理由
割と上流工程に携わることが多くお客さんとのやり取りも結構おもしろかったりしたのですが、構築作業がめっちゃつまんなく感じたのでやめましたｗ
最近の製品はGUIポチポチで設定できてしまうものがかなり多く「これって僕である意味ある？」って思うことが結構ありました
勿論、設計書書いたりもしてたのですが、どの案件も似たようなものになるので飽きてきてしまったんですよね…ｗ

#ソフトウェア開発に転向して思ったこと
一番最初に、みんなめっちゃ雑！！！って思いましたｗ
[「本当にあったやらかしDB設計シリーズ一覧」](https://qiita.com/bouitengineer12/items/e63e5f7d6f628da11362)や、[「勧めたいプロジェクトの進め方」](https://qiita.com/bouitengineer12/items/9bb17660d7a1bfffbdbf)でも触れているのですが、あまりにも酷くてびっくりしましたｗ

この半年ちょいでいくつかのプロジェクトに参加してみたのですが、動いているだけのものばっかりでした…

ソフトウェア開発はほとんどなんでもできる代わりに、定石のようなものが欠けていると思いました
勉強してみると決してそんなことはない、というのがわかったのですが、このような手法を現場で取り入れているのは本当に一部なんだなと…
というか、そもそも知らん！みたいなのが非常に多くてびっくりしました

ここ最近未経験向けのスクールが流行っている様ですが、企業向けに30代～50代をターゲットにしたスクールしたほうが良いんじゃね？って思い始めてますｗ
儲からないのかな？誰か人助けだと思ってやってくれ

#これからは
次の職場では案件を受託して消化していく、というスタイルらしいのでもう少しまともに仕事できる気がしますｗ
実践してみたい手法がいくつもあるので、どんどんやっていこうと思ってます

まだ圧倒的に手を動かしている回数が少ないので、頭でっかちにならないようにコードばんばん書いていこうと思ってます(好きになれそうなOSSプロジェクトを探してるとこです)

#まとめ
大学もいかずに高校もめっちゃ偏差値終わってたのですが何故かなんとかなってますｗ
しかも転職する度に給料上がるというおまけつき
褒められたルートではないですがｗ

潰しのきく職業って良いですね！
Gnu-COBOL IFで条件分岐

### 比較演算子で書く

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 SCORE PIC 9(3).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 80 TO SCORE.
    IF SCORE > 60 THEN  *> 「IF 条件 THEN」
      DISPLAY "OK!"
    ELSE                *> 処理部分は「.」不要
      DISPLAY "NG!"
    END-IF.             *> 「END-IF.」
    STOP RUN.

```

### 英語っぽく書く

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 SCORE PIC 9(3).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 60 TO SCORE.
    IF SCORE IS GREATER THAN 60 THEN
      DISPLAY "OK!"
    ELSE
      DISPLAY "NG!"
    END-IF.
    STOP RUN.

```

|英語っぽく|比較演算子|意味|
|---|---|---|
| > | IS GREATER THAN | ~より大きい |
| IS NOT >| IS NOT GREATER THAN | ~より大きくない |
| >= | IS GREATER THAN OR EQUAL TO | ~以上 |
| < | IS LESS THAN | ~より小さい |
| IS NOT < | IS NOT LESS THAN | ~より小さくない |
| <= |IS LESS THAN OR EQUAL TO | ~以下 |
| = | IS EQUAL TO | 等しい |
| IS NOT = |IS NOT EQUAL TO | に等しくない |
Vuexのヘルパー関数createNamespacedHelpersの使い方

createNamespacedHelpersを使用することで名前空間付けされたヘルパーを作成できる。

```Top.vue

<script>
import { createNamespacedHelpers } from 'vuex'

const { mapState, mapActions } = createNamespacedHelpers('hoge/Hoge')  // Hoge.jsのStateとActionsを使う

export default {
  computed: {
    ...mapState([
      'aaa',
      'bbb'
    ])
  },
  methods: {
    ...mapActions([
      'ccc',
      'ddd'
    ])
  }
}
</script>
```

`import { createNamespacedHelpers } from 'vuex'`
でVuexをインポートし、createNamespacedHelpersで使うように設定しています。

`const { mapState, mapActions } = createNamespacedHelpers('hoge/Hoge') `
では、createNamespacedHelpersを使ってstoreのHoge.jsにある
StateとActionsを使用することを宣言しています。

そしてStateを参照したいなら**computed**内でmapStateを使ってプロパティを参照します。
Actionsを発火させたいなら**methods**内でmapActionsを使って実行します。

※createNamespacedHelpersを複数のstoreから使う方法に関しては、
以下の記事で紹介しています。
[[Vuex]ヘルパー関数createNamespacedHelpersを複数のstoreから使う](https://qiita.com/kazukinaruse/items/3787d452e665115f9bad)
sprit ( )メソッドの使いかた　【JavaScript】

##split( )メソッドのポイント:point_up:

- 　splitを直訳すると、 ```「裂く」 「分ける」。```　ボウリングのスプリットをイメージすれば、しっくりくる。

-  　```String(文字列）``` を指定した区切り文字列で分割するメソッド

- 　```文字列の空白```もカウント。

- 　<font color="red">**「```''```と```' '```」**</font>半角スペースの有無で、意味が異なる。




##【JavaScript】


```javascript


  const str = 'あいうえお かきくけこ さしすせそ';
  
  const words = str.split(''); 
  console.log(words[10]); // => ”こ”       空白文字カウント
  
  const chars = str.split(' ');
  console.log(chars[2]); //=> 【さしすせそ】   '' と ' ' で文字列を区切るポイントが異なる

  
  const strCopy = str.split();
  console.log(strCopy); //=>Allay["あいうえお かきくけこ さしすせそ"]

```
windows：bat：フォルダごとコピーするbat

フォルダまるごとコピー　上書きの確認なし

xcopy コピーもと コピー先
/e　フォルダごとコピー
/y　上書きの確認をしない

```bat:copy.bat
xcopy /e /y [コピー元ファイルパス] [コピー先ファイルパス]

```

コピー前に古いフォルダを削除しておきたい場合は下記。
rd 削除
/s 空じゃなくても削除
/q 確認メッセージなし

```bat:delete.bat
rd /s /q [削除したいフォルダパス]

```
Firebase(Angularfire2)のTwitter認証でスクリーンネームがほしい時

```typescript
 this.fireauth.auth.signInWithPopup(new auth.TwitterAuthProvider())
      .then((result) => {
        console.log(result.additionalUserInfo.username)
      }).catch(async (error) => {})
```
 userじゃなくてadditionalUserInfoに入ってることに気づかなくて3時間くらい悩んだのでメモ..
gitのメールアドレスを手軽に変えたい

## やりたいこと。
**gitのメールアドレスを手軽に変えたい。**
毎回`git config --local user.name aaa`とかめんどい（そして、user.name=aaaって打って、できなくてイライラする)。
仕事用と私用で変えたいのです。

## .bashrc
GIT_USERSの中を適宜変えて、$HOME/.bashrcに追加。

```bash:.bashrc
declare -A GIT_USERS=(
    ["aaa"]="aaa@users.noreply.github.com"
    ["bbb"]="bbb@exmaple.com"
)

## git config complete
_set_git_config.sh() {
  if [ ${COMP_CWORD} == 1 ]; then
    COMPREPLY=( $(compgen -W '${!GIT_USERS[@]}' -- ${COMP_WORDS[${COMP_CWORD}]}) )
  fi
}

function set_git_config(){
    if [ -n "${1}" ] && [ -n "${GIT_USERS[${1}]}" ]; then
        git config --local user.name ${1}
        git config --local user.email ${GIT_USERS[${1}]}
    fi
    git config --show-scope --list | grep user
}

complete -F _set_git_config.sh set_git_config
```

## 使い方
`set_git_config aaa`
補完が利くので`set_git_config [TAB]`とかで使えます。
Cordaの「FlowLogic.await API」をやってみました

# やったこと
- TISさんの[**この記事**](https://medium.com/@TIS_BC_Prom/corda4-4-%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E3%81%9D%E3%81%AE%EF%BC%91-b906c0a828f8)通りの事をやりました。
- 大変申し訳ないことに何の相違工夫もありません。
- じゃあなぜ記事にするかと言えば、理由はいくつかありますが、「Cordaが好きなので盛り上げたい、応援したい」「公式よりやってみた記事が参考になる場合がある」から書いています。

# Crodaとは何か
- 色々と主張が分かれるのかもしれませんが、私はブロックチェーンベースのアプリケーションフレームワークだと思っています。
- 業務を実装するための工夫が色々とされており、非常に使いやすいし、パブリックチェーン以外の領域でブロックチェーンベースのアプリケーションを実装するなら、私は迷わずCordaを選択すると思います。
- 公式な説明は[**こちら**](https://docs.corda.net/docs/corda-os/4.5/key-concepts.html)をご参照下さい。
- 日本語説明記事としては私は[**こちらの記事**](https://crypto.watch.impress.co.jp/docs/event/1189468.html)が端的で理解が進むかと思います。
- ※以前CordaのMeetupでSBIの方が説明されていたものが凄くわかりやすかったので、探したのですが、ネット上では探せませんでした。

# Cordaを実行するための環境
- 一言でいえばJAVA VMになります。
- ★★注意が必要なのは現時点ではORACLE JDKが必要だということです。
- 環境のセットアップは[**こちらの記事**](https://training.corda.net/prepare-and-discover/prepare-computer/)を参考にして下さい。
- 随分前に環境は作ったので若干うろ覚えですが、「ORACLE JDK」「Intellij」「git」の３つで良かったはずです。

# Cordaの基本
- Cordaは非常に大まかにいうと「State」「Flow」「Contract」で構成されています。
- まずは[**この公式ページのサンプル**](https://docs.corda.net/docs/corda-os/4.5/tutorial-cordapp.html)を動かして、上記３つがどのように動作するかを確認すると良いと思います。

# 環境
- 自分の実行環境は以下です。
- 但し、他のブロックチェーンプロジェクトと大きく異なるのはjava vm上で動作するので、その下のOSは余り関係ないという点です。
- OS：Windows10 ※普段はwsl上のUbuntuでやりますが、Cordaは私がやっている限りwslで動作しません。

# やっていきます
- TISさん記事がとても親切にわかりやすく記述頂いているので、若干の補足だけさせて頂きます。
- テンプレートソースをgit cloneします。

```
git clone https://github.com/corda/cordapp-template-kotlin.git
```

- cloneしたプロジェクトをIntellijで開きます。
- 以下の修正は全てIntellij上で行いました。
- そして説明されている通り、以下にflowのソースがあるので、それを修正します。

```
cd cordapp-template-kotlin\workflows\src\main\kotlin\com\template\flows
ls 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/09/02     20:46           1928 Flows.kt
```

- 次に、説明にしたがってFlows2.kt、Flows3.ktを作成して、実装（コピー）します。

```
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/09/02     20:46           1928 Flows.kt
-a----       2020/09/02     20:48           1486 Flows2.kt
-a----       2020/09/02     20:48            814 Flows3.kt
```

- ビルドします。

```
cd cordapp-template-kotlin
gradlew.bat deployNodes
```

- あとは記事通りで上手くいくと思います。
- なじみのない方は少し分かりづらいかもしれませんが、画面キャプチャでもわかる通り、CordaノードはCliを装備しているので、記事にある通り、打てば動作します。

# これからもCordaを応援していきます。
- 色々触ってみましたが、コンソーシアムチェーンとしては一番好きな製品なので、これからもキャッチアップしつつ応援していきたいです。
- 仕事でコンソーシアムチェーンを使う際には、Cordaを社内に提案したいと思っています。
laradockでdocker+laravel環境を構築

今更かもしれませんがLaradockで環境構築を行ったので備忘録として書いていきます。
PCのOSはLinux Ubuntu18.0.4を使用しています。

##環境構築
作業ディレクトリにリポジトリをクローンします。

```
$ mkdir myworkspace
$ cd myworkspace
$ git clone https://github.com/LaraDock/laradock.git
```
環境変数を設定していきます。.env.exampleがあるのでコレをコピーして自分の環境に合わせて変更していきます。

```
$ cp env-example .env
```
自分が設定を初めて行ったときはこのdocker-composeの.envとlaravelの.envのMySqlDBの接続情報を
別に書いてしまいちょっとだけハマったので設定するときは気をつけてましょう。

デフォルトだとMySqlのバージョン設定はlatestになっていると思いますが必要に応じて変更しましょう。

```
MYSQL_VERSION=5.7
```
他にも沢山記事があるのでそちらも参考にして下さい。

##Laradockを起動する

/laradock内(docker-compose.yml)があるディレクトリで

```
$ docker-compose up -d nginx mysql workspace phpmyadmin
```
を実行します。

##Laravelプロジェクトを作成する。

```
$ docker-compose exec --user=laradock workspace bash
laradock@5cf89da63592:/var/www$
laradock@5cf89da63592:/var/www$ composer create-project laravel/laravel develop --prefer-dist "バージョン"
```
でOKです。
Laravelの.envのDB設定はlaradockの.envと合わせましょう。

#ちょっとハマったところ
phpmyadminのログイン画面でサーバーという入力欄があらわれました。いままで見たこと無かったですが接続するサーバーのホスト入れればよいみたいです。（間違ってたらコメントで教えていただけますと幸いです。）

larvelの設定でDB_HOSTはmysqlに設定しているのでそれ(mysql)を入力すればOKです。
React入門


こちらの記事は以下の書籍を参考にアウトプットとして執筆しました
[React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで](https://www.amazon.co.jp/React%E5%85%A5%E9%96%80-React%E3%83%BBRedux%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%8B%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8BUX%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%BE%E3%81%A7-%E7%A9%B4%E4%BA%95%E5%AE%8F%E5%B9%B8-ebook/dp/B078XDLL2J/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)

#Reactコンポーネント

- Functional Component(関数のような定義)
- Class Component(クラスのような定義)


違いはClass Componentでは以下が使える。

- state
- ライフサイクルメソッド

##コンポーネント再利用とReactエレメント

```javascript
ReactDOM.render(
    <div>
        <Hello />//いくつでも書ける
        <Hello />//これが再利用するということ
        <Hello />//また、ここまでのやつはReactエレメント
    </div>,
    document.getElementById('root')
)
```
Reactエレメントは変数へ格納可能

```javascript
let g=<Hello />

ReactDOM.render(
    <div>
      {g}
    </div>,
    document.getElementById('root')
)
```

##children
特殊なprops
Reactコンポーネントノコ要素がchildrenとして渡される

```javascript
import React from 'react';
import ReactDOM from 'react-dom';



const Hello = (props) => {
  return (
    <div>こんちわ、{props.children}さん</div>
  )
}

ReactDOM.render(
  <div>
    <Hello>
        A
    </Hello>
  </div>,
  document.getElementById("root")
)
```
参考：[React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで](https://www.amazon.co.jp/React%E5%85%A5%E9%96%80-React%E3%83%BBRedux%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%8B%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8BUX%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%BE%E3%81%A7-%E7%A9%B4%E4%BA%95%E5%AE%8F%E5%B9%B8-ebook/dp/B078XDLL2J/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)

```javascript
import React from 'react';
import ReactDOM from 'react-dom';



const Hello = (props) => {
  return (
    <div>こんちわ、{props.children}さん</div>
  )
}

const Greeting = (props) => {
  return (
    <div>
      <div>ご挨拶</div>
      {props.children}
    </div>
  )
}

ReactDOM.render(
  <div>
    <Greeting>
      <Hello>A</Hello>
      <Hello>B</Hello>
    </Greeting>
  </div>,
  document.getElementById("root")
)
```

上記は複雑なケース
Greetingのprops.childrenにはHelloエレメントが渡される。
Vue.jsのスロット(slot)の使い方

スロット(slot)は以下の状況のような時に使われることがある。


```Top.vue
<template>
  <div>
    <Hoge>
      <Fuga />　 // Hugaの中にFugaを入れたりPiyoを入れたり、時と場合によって違うコンポーネントを入れたい
    </Hoge>
    <Hoge>
      <Piyo />
    </Hoge>
  </div>
</template>

<script>
import Hoge from '@/~~~'
import Fuga from '@/~~~'
import Piyo from '@/~~~'

export default {
  components: {
    Hoge,
    Fuga,
    Piyo
  }
</script>
```

スロット(slot)はHogeコンポーネントに記述する。

```Hoge.vue
<template>
  <div>
    <slot />  // ここにFugaやPiyoが自動的に挿入されるようになる
  </div>
</template>
```
apex いなくなっちゃったのね…

AWS Lambda で開発し始めた頃よくお世話になった [apex](https://github.com/apex/apex), いつの間にか公開中止になってたんですね。CircleCI で古いブランチのワークフローを回そうとして 404 と言われて、初めて気づきました。

確かに近頃は serverless だの SAM だの CDK だのと より便利なツールが増えてきて私もそっちばかり使ってましたが(Layer に対応してくれなかったのは痛かった)、CloudFormation 使わずに手軽にデプロイできるツールとしては存在意義はあったと今でも思ってます。

今までありがとう、apex。君のことは忘れないよ。
SSL証明書　CSR作成エラー

CSR作成時のエラー

```
Read Error in node_modules
140278553315216:error:0200B015:system library:fread:Is a directory:bss_file.c:255:
140278553315216:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:256:
Read Error in scss
140278553315216:error:0200B015:system library:fread:Is a directory:bss_file.c:255:
140278553315216:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:256:
```

#解決法

[OpenSSLの擬似乱数情報の生成について](https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26492&forum=10)
API Platformでプロパティがレスポンスに含まれない時の対処法

# 更新情報
2020/09/09 `getter`と`setter`の両方に型情報が無い場合にPOSTパラメータに表示されない現象を確認。


# はじめに
API Platformを使っていて若干ハマった部分の備忘録

# 問題
以下のような設定を行っている時に、Bookリソースを取得した時のレスポンスに`isPublished`が含まれない。

```php
/**
 * @ApiResource(
 *     normalizationContext={"groups"={"book:read"}},
 *     denormalizationContext={"groups"={"book:write"}},
 *     collectionOperations={
 *          "get"={},
 *          "post"={},
 *     },
 *     itemOperations={
 *          "get"={},
 *          "delete"={},
 *     },
 * )
 *
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class Book
{
...
    /**
     * @Groups({"book:read"})
     */
    private $isPublished = false;
...
}

```

# 原因
Getterの名前がプロパティ名とズレていた。どうやらAPI Platformでは`isPublished`に対するGetterは`getIsPublished`でなければいけない模様。下記のように修正する事で無事レスポンスに`isPublished`が含まれました。(どちらかと言うとSymfonyのシリアライザの仕様?)

Phpstormを使っていて、`cmd + n`からGetterを生やすと、`is〇〇`系はデフォルトでgetが省略されるのでハマってしまいました...。
Phpstormを使っている方はご注意を。


```php

class Book
{
...
    public function isPublished()
    {
        return $this->isPublished;
    }
...
}
```

↓

```php

class Book
{
...
    public function getIsPublished()
    {
        return $this->isPublished;
    }
...
}
```

# getter/setterに型が無い場合

getterかsetterのどちらかに型情報があればいい模様。

### 型情報なし

```php:User.php

...
    /**
     * @Groups({"user:write"})
     */
    private $plainPassword;


    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    public function setPlainPassword($plainPassword): self
    {
        $this->plainPassword = $plainPassword;

        return $this;
    }
...

```
↓
![スクリーンショット 2020-09-09 1.59.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614264/650937c4-b5cf-465f-f229-53a697e0fa67.png)




### 型情報あり

```php:User.php

...
    /**
     * @Groups({"user:write"})
     */
    private $plainPassword;

    public function getPlainPassword(): ?string
    {
        return $this->plainPassword;
    }

    public function setPlainPassword(?string $plainPassword): self
    {
        $this->plainPassword = $plainPassword;

        return $this;
    }
...
```
↓
![スクリーンショット 2020-09-09 2.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614264/6764159c-bca4-2c1f-62a2-47abcd42c740.png)
【JS】spliceメソッドで、配列の要素を変えて行こう


spliceメソッドは、配列の要素を削除しながら、追加もできるメソッド。
パターン別に、配列の中身がどう変化していくか見ていき、最後にメソッドの種明かしをしようと思う。


#要素を一つ削除する

```javascript:
banks: [
  { id: 1, name: "東京中央銀行" },
  { id: 2, name: "開発投資銀行" },
  { id: 3, name: "白水銀行" },
]

banks.splice(banks[2], 1)
```

```javascript:banksの中身
[
  { id: 1, name: "東京中央銀行" },
  { id: 2, name: "開発投資銀行" },
]
```

#要素を一つ追加する

```javascript:
banks: [
  { id: 1, name: "東京中央銀行" },
  { id: 2, name: "開発投資銀行" },
  { id: 3, name: "白水銀行" },
]

const newBank = { id: 4, name: "大東京銀行" }

banks.splice(banks[2], 0, newBank)
```

```javascript:banksの中身
[
  { id: 1, name: "東京中央銀行" },
  { id: 2, name: "開発投資銀行" },
  { id: 3, name: "白水銀行" },
  { id: 4, name: "大東京銀行" }
]
```


#要素を二つ削除して、変わりに新たな要素を三つ追加する

```javascript:
banks: [
  { id: 1, name: "東京中央銀行" },
  { id: 2, name: "開発投資銀行" },
  { id: 3, name: "白水銀行" },
]

const newBank1 = { id: 4, name: "大東京銀行" }
const newBank2 = { id: 5, name: "関西シティ銀行" }
const newBank3 = { id: 6, name: "東京首都銀行" }

banks.splice(banks[2], 2, newBank1, newBank2, newBank3)
```

```javascript:banksの中身
banksの中身
[
  { id: 1, name: "東京中央銀行" },
  { id: 4, name: "大東京銀行" },
  { id: 5, name: "関西シティ銀行" },
  { id: 6, name: "東京首都銀行" },
]
```

#spliceメソッドの種明かし

spliceメソッドは、位置を指定し、その位置から要素をいくつ変化させるか指定できるメソッド。

```javascript:基本形
配列.splice(変化スタート位置, 削除する数, 追加する要素1, 追加する要素2)
```
splunkサービスが停止してたら自動復旧させるshellスクリプト例

はじめに
---
- SplunkプロセスがダウンしていたらSplunkサービスを再起動する簡単なスクリプトを用意
- そもそもSplunkサービスがちゃんと動いていることって何をもって確認すればいいか？マニュアルをチェック
    - [Check if Splunk Enterprise is running
](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/005441f6-f6ce-9e20-b326-d8a1925d9a42.png)
https://docs.splunk.com/Documentation/Splunk/8.0.5/Admin/StartSplunk)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/b9f251be-6735-87ba-2339-95220923536b.png)


スクリプトのポイント
---
- [Good unix way check if splunkd and splunkweb are running](https://community.splunk.com/t5/Archive/Good-unix-way-check-if-splunkd-and-splunkweb-are-running/td-p/17935)
    - こちらのAnswerのscriptをもとに**ちょっとだけ**改良しました。
- ①statusのチェック、②プロセスのチェック、③curlによるチェックの3本柱
- スクリプト実行した結果をsendmailコマンドでメール通知する


実際のスクリプト例
---
```check.sh
#!/bin/sh

# ## Splunk Health Checking Script to run hourly ##
# This will run some basic checks to ensure      ##
# splunk is running and restart those services   ##
# if it fails a check.                           ##
## ############################################# ##

service=splunk
path=/opt/splunk/bin/
to=(your mail address)
mailbody=(your mail body text file)

# Error handling function
function errorCheck {
        if [ $? -ne 0 ] ; then
                echo "Error occurred connecting on port 8089 for $service"
                $path$service start
				sendmail $to < $mailbody 
        fi
}


# check for the processes to be running
if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 )); then
       echo "$service is running!!!"
else
       $path$service start
	   sendmail $to < $mailbody 
fi

# check for the service itself to be running
# sometimes the service can crash leaving stale PID's running
if (( $($path$service status | grep "splunkd is running" | wc -l) > 0 )) ; then
       echo "$service is running!!!"
else
       $path$service start
	   sendmail $to < $mailbody 
fi

# check if we can connect locally on port 8089
/usr/bin/curl -s -k -o "/dev/null" https://127.0.0.1:8089
errorCheck
```

email.txtの用意
---
```:
# cat email.txt 
From: splunk-check
Subject: Splunk service was restarted.
Splunk service was restarted by script.
```

crontabで設定(毎0時に実行！)
---
```:crontab
* 0 * * * /home/splunk/check.sh
```

メール届く（試しにsplunk stopして確認）
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/b0166a64-8670-3682-7168-dce6a962d3b1.png)


ハマったポイント
----
`ps -ef | grep -v grep | grep $service | wc -l > 0 `

- これだと環境によっては、grep -vのフィルタ条件が甘いです。たとえば以下の例のようにsplunkプロセスとは関係ないものもひっかけるので。
![スクリーンショット 2020-09-03 21.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/9c390651-aa80-fa74-f4d2-56407964636f.png)
- そういうときは、 `|grep -v bash`などでつないでフィルタします。
VMware Workstation Player上のゲストOSをホストOS(Windows10)起動時に自動起動

#batファイルを作る

下のようなコマンドを打てば、起動してくるので、それを.bat拡張子で保存してあげればOK。パスはよしなに。
ちなみに、`UTF-8`の文字コードでは.batは文字化けするため`Shift-JIS`で保存してね。メモ帳だと`Shift-JIS`形式で保存できなかったのでサクラエディタを使いました。

```
C:\Users\ユーザー名>"C:\Program Files (x86)\VMware\VMware Player\vmplayer.exe" "D:\VMwareWorkstaion\仮想マシン名.vmx"
```

#windowsが起動してきたときに実行するフォルダがあるのでそこにぶちこむ。
```
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191249/2bbca9fd-6000-ca4f-5893-ee6e4239661c.png)

以上。
if ... else... 文 【JavaScript】

##今回のポイント:point_up:

- HTMLのチェックボックスに```clickEvent```を設定

- チェックがトグルと ```console.log```にメッセージを表示

- 加えて、body に対し```classList.toggle```で背景色を付与

##【HTML】

 ```HTML

    <body>
      <input type="checkbox" id="check">
      <script src ="main.js"></script>
    </body>
```

##【CSS】


```css

.black {
  background: #333;
}
```


##【JavaScript】


```javascript


   const checkBox = document.getElementById('check');
    
   checkBox.addEventListener('click', () => {
    document.body.classList.toggle('black');  // body に背景色を追加
    if (checkBox.checked) {
      console.log('チェックされたよ');
    } else {
      console.log('外れたよ');
    }
    });

```
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4

#環境
ruby 2.5.1
rails 5.2.4

#背景
rubyのバージョンを変え、dockerとmysqlを導入した際に、いつの間にかera

#問題

rails sを実行すると以下のログが出力される

```
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4
```

railsアプリは立ち上がるが、上記のログ出力を無くしたい

#試したこと【１】

[Ignoring gems because its extensions are not built [duplicate]
](https://stackoverflow.com/questions/48339706/ignoring-gems-because-its-extensions-are-not-built #)

```
$ gem pristine --all
```

####gem pristine --all　とは
[https://helen.hatenablog.com/entry/2016/04/24/140820](https://helen.hatenablog.com/entry/2016/04/24/140820 #)
>pristineをすると、インストールされたgemとgemのキャッシュを比較し、もし一致しなければキャッシュされたものを復元する
インストールしたgemに変更を加えていた場合、pristineコマンドは戻してしまう
すべての再構築と変更を確認した後のgemの再構築する
キャッシュされたgemが見つからなかった場合はダウンロードされる
--no-extensionsをつけるとgemの拡張を復元しない

###解決しました
rubyのバージョンを変えた際にnokogiriと依存関係にあるgemとの間に問題が起きたのかもしれない。
[Nuxt.js/AuthModule]ユーザー取得直後に処理をしたい

# 背景
ログインしてるんなら、こっちのAPIから情報取ってきておきたいんだよね〜〜
という要件を満たす

# 試して無理だったこと
## 普通にpluginsで処理を差し込む

nuxt.config.jsにpluginsとして定義して処理を入れた場合、AuthModuleより先に処理が動いてしまうのでダメ

`app.$auth` としても `store.state.auth` としても取得前の状態だった

# 解決策

https://auth.nuxtjs.org/recipes/extend.html

> If you have plugins that need to access $auth, you can use auth.plugins option.

pluginから$authにアクセスするなら、ってピンポイントなものがありました！

`nuxt.config.js` の `auth` 配下に `plugins` を作り、そこにファイル名を列挙します
このように記載することで、pluginで指定した関数の引数に `$auth` が含まれる `context` が渡されて来ます！

# 最後に
自分がやりたいと考える程度のことは大体ドキュメントに乗ってる
Lightningフローのレコードトリガを検証してみた

#Lightningフローのレコードトリガの性能
SalesforceのSpring20からLightningフローにレコードトリガ更新ができるようになりました。
レコードの保存前後で起動できるLightningフローになります。
簡単に言うと、コーディングをしないApexトリガですね。

Spring20のLightningフローに関するリリースノートを見てみるとこのような記述がありました。

>フロー内の保存前更新は、プロセスビルダーで作成されたレコード変更プロセスでの更新よりも 10 倍高速です。

おおっ、プロセスビルダーの10倍とはなかなかの好スペック！
そこで、実際の更新速度がいかほどか検証してみました。

#検証方法
項目更新について、以下の方法で4つの方法で実施し、それぞれの処理速度を調べます。

オブジェクトは以下のカスタムオブジェクトを使用します。
名前と日時項目だけのシンプルな項目で、レコードを作成時に日時項目にシステム時刻を自動セットするようそれぞれ①〜④の方法で作成します。

##①ワークフロールール＋項目自動更新による更新
作成時に無条件で実行日時を更新する処理を実施。
![スクリーンショット 2020-08-28 23.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699607/fb03b76b-36d5-9613-2575-4636e29c2fb7.png)

##②プロセスビルダーによる項目更新
プロセスビルダーでも同じように、実行日時を更新するプロセスを作成します。
![スクリーンショット 2020-09-01 22.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699607/2c6edff3-825c-7a4e-5e60-0380ec9e09fc.png)

##③Lightningフローによる項目更新
以下レコード変更フローを作成し、割り当て処理で実行日時を更新します。
このように定義することで、beforeトリガと同じように項目反映前に値を書き換えることが可能になります。
![スクリーンショット 2020-08-28 23.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699607/2470b3ca-4d1a-0005-ee8c-42ccd8e07006.png)

![スクリーンショット 2020-09-01 23.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699607/63aab33b-283c-b455-1200-71d866f1c2a2.png)


##④Apexトリガによる更新
以下のBefore、Insertトリガで実行日時を書き換えする処理を入れます。

```java

trigger HogeInsertTrigger on Hoge__c (before insert) {
    List<Hoge__c> hogeList = Trigger.new;
    for(Hoge__c hoge : hogeList){
        hoge.datetime__c = Datetime.now();
    }
}
```

①〜④はやり方が違うだけで、やっている処理は全て同じです。

##測定方法
それぞれの方法に対し、開発コンソールのOpen Execute Anonymous Windowから1000レコード分まとめてInsertして、その処理時間を測定します。

```java
List<Hoge__c> insertList = new List<Hoge__c>();
for(Integer i = 0; i < 1000; i++){
    insertList.add(new Hoge__c(Name = String.valueOf(i)));
}
// 開始時間
Datetime startTime = Datetime.now();
insert insertList;
// 終了時間時間
Datetime endTime = Datetime.now();
// Insertにかかった時間（ミリ秒）を測定
System.debug(endTime.getTime() - startTime.getTime());
delete insertList;
```

検証はレコードを空にした状態で行い、実施のたびにレコードは削除します。
処理時間は開発コンソールのInsert前後で日時をとり、その差分から処理時間を算出します。
データ仕込みの時間や削除の時間は考慮しません。

①〜④それぞれを3回ずつ実施して平均をとります。
検証するもの以外は無効化にしておきます（①を有効化した場合は②〜④を無効化といった感じ）。

#検証結果
①〜④それぞれに対しInsertにかかる時間を測定したところ、結果は以下のようになりました。

|単位：ミリ秒|①|②|③|④|(参考)全て無効|
|:--|--:|--:|--:|--:|--:|
|1回目|3,547|8,072|1,965|2,615|1,109|
|2回目|3,216|9,564|2,226|2,223|1,344|
|3回目|3,220|8,366|1,892|2,191|1,149|
|平均|3,327|8,667|2,027|2,343|1,200|

このように、**Lightningフローを使った項目自動更新が一番速い**ことがわかりました。
プロセスに比べ、10倍とまでは言いませんが、それでも4倍以上もスピードが上がっています！
今回は単純な代入処理だけでの検証ですが、フローが複雑化するともっと数字に開きが出るかもしれません。

#今後はLightningフローが主流となる!?
以上の結果から、性能面でもLightningフローが優れており、使わない理由がなくなりました。

今後は削除に対するフローも実装されるとのことなので、よりLightningフローが発展していくことが予想されるため、フローを触ったことがない方も是非活用できるようにしておきましょう。
VSCodeのHaskell拡張を使って最速開発環境構築

2020/7/28に新しいHaskell拡張がリリースされました。
https://marketplace.visualstudio.com/items?itemName=haskell.haskell

さっそく、こいつを使って最速開発環境構築していくぜ！！！

# 前提条件
## Dockerをインストール
https://www.docker.com/products/docker-desktop

## VSCodeをインストール
https://code.visualstudio.com/

### `Remote - Containers`拡張のインストール
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

# コンテナ上でHaskell拡張を動作させる
https://code.visualstudio.com/docs/remote/create-dev-container#_create-a-devcontainerjson-file

任意のフォルダに`.devcontainer.json`ファイルを作成して以下を記載

```json-doc:.devcontainer.json
{
	"name": "HaskellDevContainer",
	// DockerhubのHaskell公式イメージ
	"image": "haskell:8.8",
	"extensions": [
		// HaskellのVSCode拡張をインストール
		// https://marketplace.visualstudio.com/items?itemName=haskell.haskell
		"haskell.haskell"
	]
}
```

VSCodeで`.devcontainer.json`があるフォルダをひらいて、左下の緑の部分から`Reopen in Container`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168736/03b5efdf-0629-35fd-1531-b65529455988.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168736/893795fb-3deb-62ff-ca4d-016cedcfdef6.png)

コンテナ内でVSCodeが起動したら、あとはHaskellファイルを作成してコードを書くだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168736/fc39233d-7112-b7d9-1890-833a44c7cead.png)

Stackもデフォルトでインストール済みだ！
CSSが適用されないとき

 先日、WEBページ作成中にCSSを編集してもchrome上に反映されないという事件が起こりました。解決したので解決法を投稿します。

<h1>キャッシュ(shift＋command(alt)+r)を実行</h1>
キャッシュ(shift＋command(alt)+r)を実行したところ。
無事、CSSが反映されました。
調べてみるとキャッシュが削除されていないからでした。

CSSが反映されない原因は他にもありますので、下記もご確認していただくと良いかなと思います。

<h1>キャッシュする前に確認すること</h1>
①cssに記述されているクラス名が間違っていないか
②css文脈のミスがないか(存在しないプロパティなど）
③ブラウザの検証機能を確認してもエディタに書いたCSSが反映されていないとき

検証機能の使い方はこちら↓
https://qiita.com/len_crow/items/12d4864c8da9805d2b22

④検証機能には反映されているけど打ち消し線があった場合
![スクリーンショット 2020-09-03 20.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702131/37e8b66d-ca58-6aa6-3fe6-c7676d752452.png)
その場合はcss適用の優先順位を見直せばOKです。



cssの優先順位はこちら↓
https://qiita.com/codeship_tech/items/58368f25b31799fa0d02

以上になります。参考になれば幸いです。
自分も初心者ですので、内容に誤りがあればご教示ください。
SwiftUIでAppStoreのTodayのカードみたいなやつ


## 実装したいこと

AppStoreのTodayタブのカードのように、押したら少し小さくなり、はなすと元に戻るようなやつ。

## どうやったか

`DrugGesture`とか使ってやろうと思ったけど、`ScroolView`と合わせて使うとスクロールしなくなる問題があった。
`ButtonStyle`を使えば、簡単にできた。

`.scaleEffect(configuration.isPressed ? 0.95 : 1.0)`がみそ。

```swift
struct SprintButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            
            .scaleEffect(configuration.isPressed ? 0.95 : 1.0)
            .animation(.default)
    }
}

struct TodayCardView: View {
    var body: some View {
        Button(action: {
            print("Button action")
        }) {
            Text("テキスト")
                .font(.title)
                .padding()
                .frame(width: 250, height: 300)
                .background(Color.green)
        }
        .buttonStyle(SprintButtonStyle()
        )
    }
}
```
PhpStormでターミナルとエディタを行き来するショートカット

ショートカットがあります！

Mac だと `Opt + F12`

Mac で HHKB など ファンクションキーがないキーボードを使っている場合には Fn を追加して

`Opt + Fn + F12`


いままでマウスカーソルをターミナルの上へ持っていってクリックして移動していたのが、一瞬で移動できるようになりました。