OmniAICreator/Qiita-1.07M huggingface dataset:
DXFをpythonで読む

dxfgrabberを使うとpythonでDXFを読めるらしい
`pip install dxfgrabber`

フリーの2DCAD jw_cadで適当なDXFファイルを作っておいて，読んでみる．

```python:dxf.py
import dxfgrabber

dxf = dxfgrabber.readfile("test.dxf")
# ヘッダ
print(dxf.header)
#{'$ACADVER': 'AC1009', '$DWGCODEPAGE': 'ANSI_1252', '$INSBASE': (0.0, 0.0, 0.0), '$EXTMIN': (0.0, 0.0), '$EXTMAX': (841.0, 594.0), '$LIMMIN': (0.0, 0.0), '$LIMMAX': (841.0, 594.0), '$LTSCALE': 1.0}

# 図形要素
# print(vars(dxf.entities))
cirs = [e for e in dxf.entities if e.dxftype == 'CIRCLE']
lines = [e for e in dxf.entities if e.dxftype == 'LINE']

# 円
print(vars(cirs[0]))
# {'dxftype': 'CIRCLE', 'handle': None, 'owner': None, 'paperspace': None, 'layer': '_0-0_', 'linetype': 'CONTINUOUS', 'thickness': 0.0, 'extrusion': (0.0, 0.0, 1.0), 'ltscale': 1.0, 'line_weight': 0, 'invisible': 0, 'color': 7, 'true_color': None, 'transparency': None, 'shadow_mode': None, 'layout_tab_name': None, 'center': (94.41901840490794, 356.85030674846627), 'radius': 16.151818630112004}
# centerが円中心のx, y
# radiusが円半径
# linetypeが線種

# 直線
print(vars(lines[0]))
#{'dxftype': 'LINE', 'handle': None, 'owner': None, 'paperspace': None, 'layer': '_0-0_', 'linetype': 'CONTINUOUS', 'thickness': 0.0, 'extrusion': None, 'ltscale': 1.0, 'line_weight': 0, 'invisible': 0, 'color': 7, 'true_color': None, 'transparency': None, 'shadow_mode': None, 'layout_tab_name': None, 'start': (386.4472392638037, 316.28711656441715), 'end': (386.4472392638037, 522.9865030674847)}
# startが始点x,y，endが終点x,y
# linetypeが線種

# 線種一覧(jw_cadの)
print(vars(dxf.linetypes))
#{'_table_entries': {'CONTINUOUS': <dxfgrabber.linetypes.Linetype object at 0x000002B43A5796A0>, 'DASHED1': <dxfgrabber.linetypes.Linetype object at 0x000002B43A5796D8>, 'DASHED2': <dxfgrabber.linetypes.Linetype object at 0x000002B43A579710>, 'DASHED3': <dxfgrabber.linetypes.Linetype object at 0x000002B43A579748>, 'CENTER1': <dxfgrabber.linetypes.Linetype object at ...
```

参考
https://qiita.com/ackermanrf128/items/d9275a7d077c1dff3ec7
2Dを３Dに展開する距離関数の作り方

#2Dを３Dに展開する距離関数の作り方
解れば呆れるくらい簡単です。

空間ベクトルをpとします。
まず、p.xy(xy平面)で2Dの距離関数を作ります。
距離を取得します。
その距離をdとして、
`vec2 p2 =vec2(d,p.z);`
というベクトルを作ります。
この`p2`を使って、2Dの距離関数を作り距離を取得します。
以上。

#２Dを押し出す方法
空間ベクトルをpとします。
まず、p.xy(xy平面)で2Dの距離関数を作ります。
距離を取得します。
その距離をd2とし、厚みをtとし、角を丸める半径をrとします。
`length(max(vec2(d2,abs(p.z)-t),0.0))-r;`
これで、押し出しの距離関数になります。
上のやり方に内包出来そうなんですが、煩雑になるので独立させました。



2Dの距離関数はiq氏のページに色々あります。
[2Dの距離関数](https://iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm)

以下サンプルを載せます。上にの説明以外の別のスキルを使ったのもありますが、それも載せておきます。
https://twitter.com/gaziya5/status/1168449688711749632
https://twitter.com/gaziya5/status/1168453335180922881
https://twitter.com/gaziya5/status/1168454596181688320
https://twitter.com/gaziya5/status/1168456292496592899
https://twitter.com/gaziya5/status/1168828157169815553
https://twitter.com/gaziya5/status/1168865611033661441
https://twitter.com/gaziya5/status/1168873175783837696
https://twitter.com/gaziya5/status/1168880615455780866
https://twitter.com/gaziya5/status/1168884760145534977
https://twitter.com/gaziya5/status/1173557650534977538

#後書き
シェーダーアドベントカレンダーが、今日空いていたので、特急で書きました。
２Dから３Dの距離関数をつくるのは、簡単すぎるのでtwitterに載せてすましちゃったんだけど、シェーダーアドベントカレンダーが空いてたので記事にしました。なので、twitterに載せれるくらいしか、記事のボリュームがありません。
２Dから３Dに展開する方法は、この2つくらいしか思いつきませんでした。でも、バリエーションは、かなり増えると思います。
回転体という方法もありますが最初の方法で出来るのでカウントしてません。
ちなみに回転体というのは、

```glsl
float d=length(p.xy);
vec2 p2 =vec2(d,p.z);
```
として２Dの距離関数を使う方法です。

以前に書いた押し出しのスキルを使ったshader
https://www.shadertoy.com/view/lslBDS
Notionで記事をスクラップする

[アルプ株式会社](https://thealp.co.jp/)でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) 11日目のエントリです。
10日目は[Notionでヘッダー画像を設定する](https://qiita.com/pictiny/items/51a2a25964d00622cc14)でした。

# ブックマーク
Notionでは外部ページのリンクでブックマークを作ることができます。
URLを貼り付ければメニューが表示されます。

<img width="777" alt="ブックマーク1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/adde7969-5620-3f64-6d84-1e1a268badca.png">

`Create Bookmark`を押すと、ブックマークが展開されます。

<img width="735" alt="ブックマーク2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/58dc0082-b801-9ce6-d372-1acaba212a54.png">

また、スラッシュコマンドでもブックマークを作ることができます。

<img width="387" alt="ブックマーク3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/de35163b-c16a-f6de-7a12-d4b28a94119c.png">

# まとめ
たまにブックマークに画像が読み込まれないことがあるのですが、ブックマークを作り直すと読み込まれることがあります。

公式ドキュメントは[Web bookmarks](https://www.notion.so/Web-bookmarks-00b4add1fc96477d8aa70e65e02ec4da)になります。
Google拡張を使ってMarkdown用のリンクを作成する

# はじめに
自分用リンク集をMarkdownを使っていて、URLとタイトルを取得して、`[]()`で囲むのめんどくさくないですか？
そう思った方には、Google拡張の[Create Link](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm?hl=ja)を使うことで、この面倒な作業を自動化することが出来ます。

（自分で作ろうかと思ったけど、やっぱり誰かが作っていたのでそのまま利用しました。てへっ）

# Formats

ForamtとFilterを指定することで、タイトルに対して文字列のリプレイスを出来ます。
自分は、タイトルの最後の例:`- qiita.com`が不要のため、これを削除するFilterを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432/cf2a23b3-3fbe-93c7-5305-1b1d5c420c88.png)

+と-で追加できます。デフォルトは、text,htmllink,markdown,mediawikiが選べるのですが、markdownしか普段使わないので、`-`で削除しました。

[Format]
`[%text%](%url%)`

[Filter]

`s/(-.*)]/]/i`

## 置き換え例
Filterなし
`[「Markdown用のリンクを簡単に作成する」 - Qiita](https://qiita.com/drafts/fdb4d2a3b5f673badc0b/edit)`

Filterあり
`[Markdown用のリンクを簡単に作成する ](https://qiita.com/saicologic/private/fdb4d2a3b5f673badc0b)`
macOS CatalinaでSwiftLintが"zsh: illegal hardware instruction"というエラーで利用できない場合の対処法

macOS CatalinaでSwiftLintを利用しようとした際にエラーが出て、対処しようとしたもののエラーメッセージが分かりにくくて時間がかかってしまったので、メモしておく

# 環境
- macOS 10.15.1
  - シェル: zsh (デフォルト)
- Xcode 11.3

# 結論
`xcode-select`でXcodeアプリに含まれるデベロッパーツールを選択していなかったことが原因であった

# 詳細
XcodeとSwiftLintをインストールした後でLintコマンドを実行すると、以下のようなエラーが吐かれていた

```zsh
% swiftlint
Fatal error: Loading sourcekitd.framework/Versions/A/sourcekitd failed: file /private/tmp/swiftlint-20191203-72607-1br7cj0/.build/checkouts/SourceKitten/Source/SourceKittenFramework/library_wrapper.swift, line 39
zsh: illegal hardware instruction  swiftlint
```

`xcode-select`で利用するデベロッパーツールのディレクトリを確認すると、以下のようになっていた

```zsh
% xcode-select -p
/Library/Developer/CommandLineTools
```

上記にはSwiftの解析ツール等が含まれていないため、SwiftLintがエラーを吐いて停止していた模様
以下のように`Xcode.app`の中のデベロッパーツールを選択することで、SwiftLintが正常に実行されるようになった

```zsh
% sudo xcode-select -s /Applications/Xcode_11.3.app/Contents/Developer
```

# 参考
- https://github.com/realm/SwiftLint/issues/1466#issuecomment-297265863
React.useRef()を使って無駄なレンダリングを減らそう

## はじめに
本記事は、Reactの[useRef](https://ja.reactjs.org/docs/hooks-reference.html#useref)について紹介する入門的記事です。公式に書いてある内容の焼き直しみたいな物なので、ちょっとrefについて理解が怪しいかな？と思う方が読者対象になります。

## React refの基本的な使い方・登場シーン
さて、refの主な登場シーンとしてはDOMに紐付けて使う場合が多いのではないでしょうか。

### inputとref([CodeSandbox](https://codesandbox.io/s/userefwithvideo-h7b4s))
`Focus Input`ボタンを押すとinputエリアにフォーカスします。

```react
const App = () => {
  const textInputRef = useRef();
  return (
    <div className="App">
      <h1>useRef with Text Input</h1>
      <button onClick={() => textInputRef.current.focus()}>Focus Input</button>
      <input ref={textInputRef} type="text" />
    </div>
  );
};
```

### videoとref([CodeSandbox](https://codesandbox.io/s/userefwithvideo-h7b4s))
初回レンダリング時にvideo srcが設定され、videoはmp4ファイルを再生できる状態でレンダリングされます。

```react
const App = () => {
  const videoRef = useRef();
  useEffect(() => {
    videoRef.current.src =
      'https://sample-videos.com/video123/mp4/240/big_buck_bunny_240p_10mb.mp4';
  }, []);
  return (
    <div className="App">
      <h1>useRef with Video</h1>
      <video ref={videoRef} controls width={360} height={240} />
    </div>
  );
};
```

## DOMと組み合わせるだけがrefの全てではない(おおげさ)
ここからが、記事タイトルについての中身になります。
`useState()`はlocal stateを管理できるHooksですが、`useState()`で用意したstate変数の更新用関数を呼ぶと、その時点で再レンダリングが走ります。以下で言うところのsetState関数が更新用関数ですね。

```javascript
const [state, setState] = useState();
```

そのため、`再レンダリングが必要ない値の管理`にuseState()を使うと無駄なレンダリングが走ることになってしまいます。（シンプルな処理だと実害は少ないかと思います）

そこで`useRef()`です。
[APIドキュメント](https://ja.reactjs.org/docs/hooks-reference.html#useref)や[FAQ](https://ja.reactjs.org/docs/hooks-faq.html#is-there-something-like-instance-variables)にもあるように、useRef()で生成したref変数は`値を保持し続けるオブジェクト`として利用できます。

```javascript
const ref = useRef();
```

生成されたref変数は`{ current: ... }`というオブジェクトを与えられ、この`ref.current`を自由に書き換えることが許されているのですが、これを書き換えた際には`再レンダリングが走らない`という特性を持ちます。（特性というか単なるJSのオブジェクト変数の書き換えなのですが）
なので、先に述べたように`再レンダリングは必要なく値のみを変更して保持するため`に使えたり、`コンポーネントの前後のレンダリング間で値を保持し続けたい`場合に、useRef()が使えます。
ということが本記事の伝えたいことになります。なんと。まぁ、公式にも書いてあるんですが。

### useState()とuseRef()の比較
最後に、似たような記述内容を書いてuseState()とuseRef()を見比べてみます。
まずは`useState()`の場合です。
以下のコードは無限にレンダリングが起こります。
1回目のレンダリング処理で`setText('hoge');`が呼ばれると、`空文字`から`hoge`へtext変数が更新されて再レンダリングが走ります。そして、それ以降もレンダリングの度に`setText('hoge');`が呼ばれるので無限レンダリングとなります。

```react
const Text = () => {
  const [text, setText] = useState('');
  setText('hoge');
  return <div>{text}</div>;
}
```

次に、`useRef()`を同じような記述構成で書いてみます。
結果は、1回のレンダリングのみで`hoge`が表示されます。

```react
const Text = () => {
  const textRef = useRef('');
  textRef.current = 'hoge';
  return <div>{textRef.current}</div>;
}
```

特に意味のないコードですが、理解のための例でした。

## おわりに
公式ドキュメントのおさらいでしたが、APIの用途を知っておくと今後の開発でも役に立つと思います。
是非、無駄なレンダリングが走ってる場面に遭遇したり、レンダリング間で値を保持しい場面に遭遇したらuseRef()のことを思い出してみてください。
Raspberry Pi 4 に OpenCV を楽に入れる

# 参考
https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/

# 概要
OpenCVが依存してるライブラリだけapt-getで入れちゃえば、ラズパイ用にビルドされたバイナリをpipでインストールするだけで済むよ。（自分でビルドする必要がないよ）

ただ、ラズパイ4用に最適化されてるかに関してはぶっちゃけわからないです...。

# 依存関係を入れる
```bash
# ビルドツール関係(もしかしたらいらないかも)
sudo apt-get install build-essential cmake pkg-config
# 画像関係
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
# 動画関係
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
# 最適化関係
sudo apt-get install libatlas-base-dev gfortran
# HDF5関係
sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
# Qtライブラリ
sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5

sudo apt-get install python3-dev
```

# pipでopencvを入れる
https://www.piwheels.org/simple/opencv-contrib-python/ にラズパイ用にビルドされたwhlが置かれている。
おかげさまで自分でビルドせずに済む。
`pip3 install opencv-contrib-python`とすればそこから勝手に最新を取ってきてインストールされるのだが、この記事執筆時点での最新バージョン`4.1.1.26`にはバグがあり、正常に読み込むことができない。(参考：https://github.com/piwheels/packages/issues/59)

よって、少し前のバージョンのopencvを入れる。

```bash
pip3 install opencv-contrib-python==4.1.0.25
```

# テスト
```python
import cv2
print(cv2.__version__) # 4.1.0
```
が動いたら成功。
もしimportに失敗する場合、依存関係が足りていないと思われるので各自ググって足りないものを入れてください。
Windowsでファイル一覧を簡単に取得する

#すまん完全に小ネタ
qiitaに10個記事をアップロードするという今年の目標を満たすためだけのものすごい簡単なネタです
こんなんでも出来ない人いっぱいいるのでやってみました。
#前準備
新規テキストファイルを作成。
中身に
dir /b > list.txt
と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/ba1da523-1ed9-c4d0-43f1-e40eefd4761d.png)
で、保存。超適当な名前でオッケー。
そしたら、拡張子をbatに変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/dcfa1b00-c21a-4728-6ef1-19ba3a7ba302.png)
構わずOK。
そしたら、そのファイルを、ファイル一覧を取得したいフォルダに持っていって、ダブルクリックするだけです。
#やってみよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/eb9ab14f-6ea2-d0e5-cc7c-d36d7f56f43a.png)
自分は絵かきもやってるので、ネットに落ちてる「ほにゃららの描き方」みたいなのをローカルに取っておく癖があります。
これの一覧を一気に取得します。
a.batをダブルクリック！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/5236080b-bd94-ad95-c215-0b548dc8fe65.png)
先程は無かった、list.txtが出来ています。それを見てみると……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/9eb2c505-82b5-bbae-9375-1a0b191ea272.png)
どうです、ファイルの一覧が表示されている！エクセレント！
#なんの使い道があるんですか
例えば、こんなことが出来ます。
全てのファイルの先頭にm_と付けたい場合とか。
とりあえず、今のlist.txtの中身を、エクセルのB列にコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/70808654-4cb4-e62c-2177-f9d1d06a0876.png)
次に、list.txtにて、全てのファイル名の先頭にm_を付けます。これはマクロを使うと楽ですね。
秀丸なのでマクロ→キー操作の記録開始/終了を選択します。
m_←←↓
して、マクロ→キー操作の記録開始/終了を選択します。
あとは、Shift+F2を押しっぱ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/cf350e88-284a-5d05-98cc-e230eb906c57.png)
最後の行はお愛嬌。消しちゃって下さい。
そしたら、これをコピーして、エクセルのC列にペースト。
あと、A列全てにmoveと書いて埋めます。これもザクッとコピペすれば数秒で出来ますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/a2ab395f-b720-d6f5-9ddd-6a0a86fd2a25.png)
で、Ctrl+a、Ctrl+cでコピー。list.txtに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/5b227145-cadd-1e97-c21f-fee6ffdcf004.png)
なんと、
move (タブ文字) 変更前ファイル名 (タブ文字) 変更後ファイル名
の一覧があっという間に完成です。
あとは、list.txtを一旦保存終了させて、list.batに改名し、ダブルクリックするだけで、全ファイルのリネームが完了します。
#使い方は無限大
この技、意外と使います。
ファイル名の一覧が必要になる事は、仕事で結構多いので、かなり役に立つノウハウです。
また、エクセルにコピペする事で、copyだのdelだのmoveだのに渡す事で、かなり簡単に大量のファイルを操作する事が出来ます。
一度はやってみて損はない裏技です。
Scalaで日付の範囲を指定してリストを作る

[アルプ株式会社](https://thealp.co.jp/)でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Scala Advent Calendar 2019](https://qiita.com/advent-calendar/2019/scala) 11日目のエントリです。
10日目は@yt8492さんの[GradleのプロジェクトでScalaを動かしてKotlinのコードを呼び出す](https://qiita.com/yt8492/items/8371f157e80a6a70d1f7)でした。

# はじめに
ある任意の日付からある任意の日付までの区間に存在する全ての日付をリストで欲しいときがあります。

```scala
import java.time.LocalDate

def range(from: LocalDate, to: LocalDate): Seq[LocalDate] = ???
```

これを実装していきましょう。

# 用意するもの
- 日付を扱うのに便利な`java.time.LocalDate`
- 期間の単位を扱うための`java.time.temporal.ChronoUnit`

```scala
scala> import java.time.LocalDate
import java.time.LocalDate

scala> import java.time.temporal.ChronoUnit
import java.time.temporal.ChronoUnit
```

# 実装
`LocalDate.until`で`from`から`to`までの日数を取得します。

```scala
scala> val from = LocalDate.of(2019, 12, 1);
from: java.time.LocalDate = 2019-12-01

scala> val to = LocalDate.of(2019, 12, 31);
to: java.time.LocalDate = 2019-12-31

scala> from.until(to, ChronoUnit.DAYS)
res1: Long = 30
```

1日分少ないので足します。

```scala
scala> from.until(to, ChronoUnit.DAYS).toInt + 1
res2: Int = 31
```

日数分の範囲コレクションを作ります。

```scala
scala> Range(0, from.until(to, ChronoUnit.DAYS).toInt + 1, 1)
res3: scala.collection.immutable.Range = Range 0 until 31
```

`map`で`from`の日数に範囲コレクションの整数を順に加算していけば、日付のリストが得られます。

```scala
scala> Range(0, from.until(to, ChronoUnit.DAYS).toInt + 1, 1).map(from.plusDays(_))
res4: scala.collection.immutable.IndexedSeq[java.time.LocalDate] = Vector(2019-12-01, 2019-12-02, 2019-12-03, 2019-12-04, 2019-12-05, 2019-12-06, 2019-12-07, 2019-12-08, 2019-12-09, 2019-12-10, 2019-12-11, 2019-12-12, 2019-12-13, 2019-12-14, 2019-12-15, 2019-12-16, 2019-12-17, 2019-12-18, 2019-12-19, 2019-12-20, 2019-12-21, 2019-12-22, 2019-12-23, 2019-12-24, 2019-12-25, 2019-12-26, 2019-12-27, 2019-12-28, 2019-12-29, 2019-12-30, 2019-12-31)
```

# まとめ

以下のようなコードで実現できました。

```scala
import java.time.LocalDate
import java.time.temporal.ChronoUnit

def range(from: LocalDate, to: LocalDate): Seq[LocalDate] = 
  Range(0, from.until(to, ChronoUnit.DAYS).toInt + 1, 1).map(from.plusDays(_))
```
KPTのススメ

# はじめに

さあやってまいりましたalcoderの学習方法第二弾ということで今回はKPT（けぷと）についてやっていきたいと思います！

# KPTってなあに

KPTというのはふりかえりによって仕事やプロジェクトの改善を加速するフレームワーク？のようなものです。
「Reflection Workshop」の中でAlistair Cockburn氏が提唱した「The Keep/Try Reflection」がもとになっており、日本独自の形で進化することでこれから説明するKPTになったといわれています。IT業界ではアジャイル開発における振り返りの手法として広まっています。
ふりかえりは下記の３要素に分けて行うことが望ましいと、「The Keep/Try Reflection」の中では言われています。

```
・What we should keep.(続けるべきこと)
・Where we are having ongoing problems.(抱えている問題)
・What we want to try in the next time period.(次にトライしたいこと)
```

この３要素に基づきKPTでは

- Keep →よかったこと(今後も継続すること)
- Problem → 悪かったこと(今後はやめること)
- Try → 次に挑戦すること

この３つの観点で自分やチームで考えを出し、プロジェクトが終わるごとに振り返りを進めていきます。

# これをプログラミング学習にどう生かすか

今回はあくまで学習法ということで記事を書いているので、KPTを学習向けに少し改造してみます。
下に手順を書きますが、どの項目でもいえることはできる限り客観的に達成できているかできていないかを判断するために、できる限り具体的に書くことが大事です。

1. 自分が達成したい目標を決める。このとき、中長期的な目標であることが好ましい。
2. 自分が決めた目標を達成するにあたって不足していることを「Problem」として書き出す。
3. 「Problem」として書き出したことを改善するためにやる挑戦を「Try」に書き出す。
4. 「Try」を意識しながら1週間ほど過ごしてみる。
5. 「Try」をした結果「Problem」が解決しているかをジャッジする。このとき「Problem」に対して効果があり、今後も継続して実行したいことは「Try」から「Keep」へ移動させる。「Problem」が解決されなかった場合は今後も継続して様子見をする場合は「Try」に書いておき、ほかのアプローチを試したほうが良いと思えばさらに「Try」を追加する。
6. 5の振り返りを行った結果新たに「Problem」が見つかれば追記し、それに対しての「Try」を書いていく。
7. 4～6を週次で繰り返していく。

これをきちんと実行して、「Problem」がなくなった時には自分がたてた目標がクリアできているはずです。

# もしまわりに巻き込める人がいたら…

このKPTを一緒にやれる人が身近にいる場合は、自分で振り返った後に振り返り内容の発表とフィードバックを行ってもらうようにするとさらに効果が上がります。

自分一人では解決方法が見つからなくても、もしかしたら周りにいる人はすでにその問題に先にぶち当たっていて、解決方法を知っているかもしれません。
私たちがプログラムでわからないことや壁にぶち当たった時にググるのと同じですね。借りれる力はできる限り借りておきましょう。

フィードバックをするときに注意するのは

- 否定しないこと
- 言い方をいつもよりソフトにすること
- 他人と自分を比較しないこと

この３点です。
どうしても目標に対して自分ができていないことを洗い出し、他者にさらすことになるのでいつも以上に気をつかいながらお互いフィードバックをするべきです。
ただ、「Try」があいまい(頑張る、意識するなどの気持ちだけになっているなど)なときはしっかり指摘してあげてください。

# まとめ

まとめがおもいつかないのでこれでおしまい。
次回は発表のしかたについて書きたいと思います。(LTとかでもつかえるやつね！)
PHP7.4の新機能を'もっと'追う【Web x PHP TechCafe 2杯目】

# PHP × Web Tech Cafe
『Web×PHP TechCafe』は、WebやPHPに関わるITエンジニアがスキルアップのために開発や勉強、LTをするコミュニティです。オフィスをスキルアップの場としてご提供します。

connpassのページは[こちら](https://rakus.connpass.com/event/156313/)

今回は PHP × Web Tech Cafe 12月の内容をまとめてお伝えします！！

## 今回のテーマ
PHP7.4の新機能をRFCを見ながら「何が嬉しいのか、どういう時に使うのか」などを参加者同士でお話しする。（パート２）

### RFC
https://wiki.php.net/rfc#php_74

### Migration
https://www.php.net/manual/en/migration74.php

### 前回の模様
https://qiita.com/Y-Kanoh/items/c6a5b2cd8ff18753c3f7

---
## 今日のディスカッション対象

## Arrow functions
- アロー関数
- https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.arrow-functions
- https://wiki.php.net/rfc/arrow_functions_v2

### 場内意見
- 利用シーンとしては見た目がきれいになるという利点しかなさそう
- JavaScriptでは2016年から利用されている書き方なので見た目としてよく見かけるコード体系になった
- シンプルになったように思う反面、明示的にUSEを書いた方がわかりやすいんじゃないか
- 外側のスコープの値を使いたい場合はわかりずらいような気がする
- アロー関数はユーザ一覧の配列から別の属性の値を持つユーザだけを突き合わせていく処理では使えると思う
- JavaScriptではコールバックを使うことが多いので、他の言語の当たり前を取り入れていくのはいいかなと思う

## Preload
- プリロード
- https://wiki.php.net/rfc/preload
- https://qiita.com/niisan-tokyo/items/ec4c918715d5ec754721
- 参考： [PHP: OPcache \- Manual](https://www.php.net/manual/ja/book.opcache.php)

### 場内意見
- サーバを起動したときにopcodeをキャッシュする
- 修正していたと思ったらキャッシュされていなかった等ありそう
- 再起動してたらうまくいくと思っていたらうまくいかなかったなど、慣れるまでは原因の切り分けが難しい
    - 考慮ポイントが増えてしまうんじゃ？
- DBのキャッシュなどでも問題になりやすいのでトラブルの原因を増やしてしまいそう
- 変化に対応しづらそう
- JavaエンジニアとしてはPHPはファイルを差し替えるだけで動くから楽にできていいと思ってたがキャッシュ前提になるとPHPである意味とは・・・？
- 手軽さも残しつつケースバイケースで使えるようになれればいいかも
- 立ち上げに時間がかかりそう
    - そこの影響を知りたい
- 必要な時だけ作っていらなくなったら捨てる、というシステムだと足を引っ張りそう
- 賛成多数の機能なのでこの機能を待っていた人は多いのではないか
- PHP8でJITが実装されたらもっと早くなりそう


## Limited return type covariance and argument type contravariance
- 共変戻り値と反変パラメータ
- https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.type-variance
- https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters

### 場内意見
- 継承しているクラスのオーバーライドしているメソッドで戻り値の型を変えることができる
- 反対する人がいないから可決されたんじゃないか
- 他の言語でできることをPHPでもできるようにするというモチベーションで追加された機能なんじゃないか

## mb_str_split
- str_splitのマルチバイト対応版
- https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.mbstring
- https://wiki.php.net/rfc/mb_str_split

### 場内意見
- マルチバイト文字を特定の文字数で区切って配列に出力できる
- ファイル操作などで使えそうか
- そもそも分割したいというシーンに出くわさないような仕様的にしているケースが多いと思うので正直いらないかも


## Allow exceptions from __toString
- __toStringが例外を投げられるようになった
- https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.tostring-exceptions
- https://wiki.php.net/rfc/tostring_exceptions

### 場内意見
- __toString内でExceptionを発生させることができる
- これまでできなかった理由はかなり複雑な背景があったそうな
- __toStringはログを出力する際によく使う


## Unpacking inside arrays 
- 配列内で別の配列をアンパックできるようになる
- https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.unpack-inside-array
- https://wiki.php.net/rfc/spread_operator_for_array

### 場内意見
- 配列の途中に配列を連結させることができる
- 人間にやさしい書き方になる
- CSVなど最初にヘッダ情報を書き、データを連結させるなどの方法で使えそう
Railsでのhaml実装

#書いてあること

1.haml-railsを用いた実装

- gem導入
- hamlに変換

2.参考ページ
3.終わりに

##1.haml-railsを用いた実装

**・gem導入**

```ruby:Gemfile
gem "haml-rails", ">= 1.0", '<= 2.0.1'
# 最下部に記載
```
```ruby:ターミナル
$ bundle
```
`導入完了`

**・hamlに変換**

```rails:ターミナル
$ rails haml:erb2haml
```

```rails:途中でターミナルに出てきたら
Would you like to delete the original .erb files? (This is not recommended unless you are under version control.) (y/n)
#yを入力してエンター
```
`hamlへ変換完了`

##2.参考ページ

- [haml-rails 公式ドキュメント](https://github.com/haml/haml-rails)

##3.終わりに
hamlはhtmlよりもコードの記述が少し減るので、かきやすいですがAWSにアップロードする際は脆弱性の問題もあるので対策をしないと怖いですね（私まだしてないけど。）
対策についてもまとめたらUPします。
記述等に誤りがございましたらご指摘いただければ幸いです。
Hyper-Vで古いCentOSを作った時にハマった時を振り返る

#CentOS5.x系をHyper-Vで動かした時のメモ
色々なハマりポイントがあったのでメモります
##だからさーCentOS5.x系なんてもう廃棄しようぜ
お客さんがオンプレのWindows2016で動いてるCentOS5.x系のサーバをAzureに移行したいとか言うんですよ。
まずはCentOS5.xをCentOS7にアップして、それから移行しようよ、ねぇ？
とは言ってもそういう現場の声は上には届かないのです。
なのでそのプレとして、ブレードサーバを引っ張り出して、Windows2016をインストールしたときのお話です。
##まずはCentOSのイメージをダウンロードしよう
ここでも何段階かあります。
###Free Download Manager
まず、Free Download Managerをダウンロードします。色々使いましたがコレが鉄壁。
https://www.freedownloadmanager.org/
何かというと、単なるダウンローダーです。CentOSのisoファイルは何GiBもある、大きなファイルで、普通のブラウザを使ってダウンロードするとどこかデータが欠損してしまい、上手く動かない事が多いので。
インストールしたら、起動しっぱなしにしておいて、と…tね
###CentOSのisoを見つけよう
https://www.centos.org/download/
まずここ飛んでー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/b6688f14-b56e-b530-a40f-28b111dfc1b7.png)
左下。CentOSのisoの入ってるパスがここで判ります。
コピペして、ファイル名を抜いて、と。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/e8ee6f4e-7ddc-9c7b-4404-a59b1d190512.png)
ふむふむ。
URLから、CentOS5.x系がある場所は容易に想像できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/bbb97f08-f8cc-cdc3-7b91-09d28e9cb434.png)
んっ、無い。
mirror listというのがあるので、そっちにあるかなということで、そっちをクリック。
https://www.centos.org/download/mirrors/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/4085b691-a111-322d-c7dd-0e4b7d6ff8dd.png)
日本の理研を選びました。
http://ftp.riken.jp/Linux/centos/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/8e1d8b8d-0941-bf8f-bf0c-27d5c81a3cae.png)
ふがっ。楽しい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/b22b9c67-e461-0331-2fdb-9e889ad9e046.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179231/f707f85b-d663-018a-3778-20118246a9ae.png)
ということで、やっとありましたよー。とりあえずCentOS-5.5-x86_64-netinstall.isoで充分です。
###最後のハマりポイント
それをWindows2016のサーバ上に持っていき、Hyper-V上で新規仮想マシンを作成し、Dドライブにそのisoファイルを指定してあげます。
ここで、またしても壁が。
なんと、ネットワークを認識してくれません。これはインターフェースを普通に足してしまった事が原因です。
インタフェースではなく「レガシーネットワークインタフェース」を、ネットワークとして足しましょう。
###やっと……やっと動いたよ
で、インストーラが動くので、後は普通にCentOSをインストールすればいいはずです。
お疲れ様でした。実際自分が詰まったのは最後だけですが、その前のやつも、詰まる人は詰まります。isoファイルが最後の最後でエラー起こしたりとか。
地道な作業ですが、どれも外す事が出来ない手順です。頑張って下さいね。
Python3でrot13

Python3系でROT13する関数

```python

import codecs
def rot13(str):
    print(codecs.encode(str, "rot-13"))
```

[ksnctf](http://ksnctf.sweetduet.info/)のEasy Cipherの↓をいれてみる
>EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg >na haqrefpber vzzrqvngryl nsgre SYNT.

```python

rot13("EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.")
```


>ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet. ROT XIII is an example of the Caesar cipher, developed in ancient Rome. Flag is ～(略)～

参考
*How to ROT13 encode in Python3?*
https://stackoverflow.com/questions/10576347/how-to-rot13-encode-in-python3
javascriptでパズルゲームを作ってみた

#javascriptでものを作るvol.2
phina.jsというライブラリを使い、パズルゲームの制作をしました。
作っている中で
this.〜
を何回も出会いthisについて気になったので調べて見ました。

javascriptでのthisの使い方は4種類あることがわかりました。

メソッド呼び出し
関数呼び出し
コンストラクタ呼び出し
apply,call呼び出し

javascriptを勉強すればするほど奥が深いと感じました。

パズルゲーム制作に参考にしたサイト
https://phiary.me/phina-js-sliding-puzzle-game/

thisの使い方で参考にした記事
https://qiita.com/takeharu/items/9935ce476a17d6258e27
あぁTravis、貴方はどうしてTravis(自動テスト・結果メール通知・自動デプロイ)なの？

>*光るものすべて金ならず
>親指がぴくぴく動く、何か悪いものがこっちに近づいて来るな、
>抜けろ、かんぬき、誰でもいいぞ
>神々の手にある人間は腕白どもの手にある虫だ、気まぐれゆえに殺されるのだ
>　　　　　ーウィリアム・シェイクスピア*

<br />
#Travisとは？
>Travis CIが持つ主要な機能としては、以下が挙げられる。
>・設定したGitHubリポジトリから自動でソースコードをチェックアウトしてあらかじめ指定しておいたビルドやテスト処理を実行する
>・テスト結果をTravis CIのサイト上や各種API、メールなどで開発者に通知する
>・テストが正常に完了して問題がなかった場合、あらかじめ指定しておいたホスティングサービスにソフトウェアをデプロイする
>[GitHubと連携できる継続的インテグレーションツール「Travis CI」入門](https://knowledge.sakura.ad.jp/3754/)
>

#CIとは？
>継続的インテグレーション、CI（英: continuous integration）とは、主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。エクストリーム・プログラミング (XP) のプラクティスの一つで、狭義にはビルドやテスト、インスペクションなどを継続的に実行していくことを意味する。
>[wikipedia](https://ja.wikipedia.org/wiki/継続的インテグレーション)




#合わせて読みたい
[Travis CIのビルド環境はコンテナベースと仮想マシンベースのものがあったが、現在は仮想マシンベースに統一された -｀sudo: false｀ はもういらないよ-](https://qiita.com/Sekky0905/items/c8ab425734304d9c30ea)

ちょっと待った！Travisしようとしたけど「僕はそもそも複雑なワークフローを組むので（クイ）」っていう人は↓
>Travis CIだと複雑なワークフローを組むのが大変なので CircleCI や Wercker を使うのがいいと思っています。
>[CIマニアから見た各種CIツールの使い所](https://sue445.hatenablog.com/entry/2018/12/07/114638)

本当はTravisして色々書きたかったけど下書きにしとくのもあれなんでほぼ下書きのまま公開
ASP.NET Core RazorPagesの偽造防止トークン




これまで、「ASP.NET Core 3.0 RazorPages事始め」ってタイトルを使ってたけど、今回から「事始め」は取ることにします。


# formタグヘルパーの偽造防止トークン

Razor Pages では、FormTagHelperが form要素に偽造防止トークンを挿入してくれます。

```html
<form method="post">
    ...
</form>
```

これで、以下のような非表示のinputタグ（偽造防止トークン）が自動挿入されます。

```html
 <input name="__RequestVerificationToken" type="hidden" value="CfDJ8Kws0PPAm1NChsmiTNfRcsX0TTepdsJf6F51WcaEnzEJH9W0IvKaCaoa7btzRNswqHlUXgzrHgA6rfcka5Jqt3u_93IMOSpOLtDRapBkHEPPhl7sGZ1lwyYlgzEcYpAcGKNeK-zL_8IaHnwMa0-viyY" />
```

これは、クロスサイトリクエストフォージェリ（Cross site request forgeries、CSRF）と呼ばれる脆弱性対策を行うためのものです。

試しに、ブラウザの開発者ツールを使ってトークンを書き替えてsubmitしてみます。

![スクリーンショット 2019-11-23 20.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29415/df01ec8c-a83a-73f8-fee5-444205341e1f.png "スクリーンショット 2019-11-23 20.26.00.png")


HTTP ERROR 400 のエラーになりました。


## AutoValidateAntiforgeryToken 属性

調べてみたら、`AutoValidateAntiforgeryToken` とか `ValidateAntiForgeryToken` という属性があるんですが、自動生成されたソースにはこれらの属性を使っている個所はどこにもありません。

デフォルトで、`AutoValidateAntiforgeryToken` が適用されてるようです。

## 偽造防止トークンを生成しない

### asp-antiforgery="false"

次のように書くと偽造防止トークンは生成されません。


```html
<form method="post"  asp-antiforgery="false">
    ...
</form>
```

まあ、あえてそうする理由は普通はないと思いますが...


### IgnoreAntiforgeryToken 属性

`IgnoreAntiforgeryToken`属性を使うと、特定のページ あるいは、特定のページハンドラ（どうもこの名前が覚えられない...）だけ、偽造防止トークンの必要性を無くすことができます。

試しに、チュートリアルで作成したプログラムの `EditModel` クラスに`IgnoreAntiforgeryToken` 属性を適用してみます。


```c#

    [IgnoreAntiforgeryToken]
    public class EditModel : PageModel
    {

```

今度は、ブラウザの開発ツールで、トークンを書き替えてもエラーにならずに、データを更新することができました。

この属性も前述の`asp-antiforgery`と同様に、通常の RazorPages アプリケーションでは、これを使うことはほとんど無いように思います。
axiosとasync/awaitの関係性

axiosはhttpライブラリですが、正直よくわからずなんとなくasync/awaitと合わせて使うといい感じでデータが取得できると思い、使っていました。
事実それで取得できていました。
しかし、エラーハンドリングやその他処理を考える時に理解が足りないと感じたので、
改めてどういった挙動をするのか理解したかった為、示します。

#試してみる

```axios.js

//1.async・awaitなしのaxios
const response = axios.get('https://●●●※webapiを想定');
console.log(response);

⬇︎コンソールで確認(戻り値はPromiseオブジェクト)

/*
Promise {<pending>}
__proto__: Promis
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Object
*/


//2.asyncのみ定義したaxios
async function test(){
  const response = axios.get('https://●●●※webapiを想定');
  console.log(response);
}
test();

⬇︎コンソールで確認(戻り値はPromiseオブジェクト)

/*
Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Object
*/


//3.async・awaitを定義したaxios
async function test(){
  const response = await axios.get('https://●●●※webapiを想定');
  console.log(response);
}
test();

⬇︎コンソールで確認(戻り値は実データ)

/*
{data: {…}, status: 200, statusText: "", headers: {…}, config: {…}, …}
*/


//async・awaitを定義したaxiosを違う関数から呼び出すパターン
async function asyncFunction(){
  const response = await axios.get('https://●●●※webapiを想定');
  return respnonse;
}
function test(){
  const response = asyncFunction();
  console.log(response);
}
test();

⬇︎コンソールで確認(戻り値はPromiseオブジェクト)

/*３番で実データになっていたはずがPrimiseオブジェクトにもどっている！！
Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Object
*/


```

まとめ　
・axiosはPromiseを返します。
・asyncはPromiseを返します。
・asyncとaxiosではPromiseを返します。
・axiosをasync/awaitすると実データを返します。(ただし関数内部のみです)
・別関数からaxiosのasync/awaitを呼び出すとPromiseを返します。
　これはasync/awaitが常にPromiseを返すことを意味します。

以上です。
Anaconda on Windows Terminal

# Anaconda on Windows Terminal
前回の**「[ROS on Windows Terminal](https://qiita.com/hook125/items/62daa32d56b0052b878d)」**に続いて、今回は「Anaconda on Windows Terminal」です。

# setting.json
Windows Terminalを管理者として実行し、＋からsettingを選びます。
そうすると、setting.jsonが開くので、

```json
        {
            "acrylicOpacity": 1.0,
            "closeOnExit": true,
            "colorScheme": "Campbell",
            "commandline": "cmd.exe /k C:\\Users\\username\\Anaconda3\\Scripts\\activate.bat",
            "cursorColor": "#FFFFFF",
            "cursorShape": "bar",
            "fontFace": "consolas",
            "fontSize": 14,
            "guid": "{xxx}",
            "historySize": 9001,
            "name": "Anaconda",
            "padding": "0, 0, 0, 0",
            "snapOnInput": true,
            "startingDirectory": "%HOME%",
            "tabTitle": "Anaconda",
            "useAcrylic": true,
        }
```

## あとは少々変更

- ユーザ名(username)を自分の物に
- Anacondaのディレクトリの場所が正しいのか確認
- "startingDirectory"の変更

## より詳しい説明
画像が多くわかりやすいので、英語ですがもしわからなければ[こちら](https://dev.to/azure/easily-add-anaconda-prompt-in-windows-terminal-to-make-life-better-3p6j)を参照してください。

# 結果
たくさんできた
![Windows Terminal](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178972/da40db90-3bd2-46d5-082e-ff98b283a473.png)


# ちなみに

```terminal
conda activate env1
```

これで仮想環境を変えられます
MRTKv2 BoundingBox.cs 平面オブジェクトへの適用方法

# Overview : BoundingBox.cs
MRTKv2 の BoundingBox.cs の使い方についてまとめていきたいと思います。

BoundingBox とは、Mixed Reality で GameObject をコントロールする際に必須となる UI/UX です。
Bounds ≒ Boundary ( 境界線、限界 ) という意味を持ち、GameObject の 境界線 ( Collider ベース  ) を可視化し、
ユーザーに対象の GameObject が触れられることを視覚的に伝えることで、スムーズな操作を実現します。
# How to use BoundingBox.cs
GameObject に BoundingBox.cs を追加すると、デフォルトで HoloLens 1st get style ( 写真 : 左 ) が適用されます。
HoloLens 2 Style を適用するためには、Inspector から Material 等追加する必要があるので注意。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/12/11/10862/b79c95d6-2e42-4a94-a5dd-2ddde5da5735.png" width="700">

MRTKv2 内に Example が用意されており、デザイン、操作性の異なる8種類のバウンディングボックスを試すことが可能です。

- Assets > MixedRealityToolkit.Example  > Demos > UX > BoundingBox > Scenes > BoundingBoxExample

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/12/11/10862/a7aa462b-014a-46c8-be2a-40474bf408ff.png" width="700">

- [公式ドキュメント ー Bounding Box](https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/README_BoundingBox.html)

# How to apply BoundingBox.cs to 2D objects
MRTKv2 のサンプルでは、3Dオブジェクトへアタッチされたデモが体験できますが、
平面(2D)のオブジェクトにもアタッチすることが可能です。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/12/11/10862/857d4a1f-50c8-45a9-8365-094de4dc477d.png" width="700">

※ ただし、デフォルトで3Dオブジェクトへアタッチされることが想定されているため、
2Dオブジェクトへのアタッチは少し設定を変更する必要があります。

BoundingBox.cs を アタッチ するだけだと、3軸 (xyz) 方向へ Bounding Box Handler が表示されてしまいます。( 動画 : 下 )

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/12/11/10862/0f5fd983-1787-446f-a86c-232f19e3f38b.gif" width="700">

上記問題を解消するためには、Unity Inspector > Box Display > Flatten Axis から、
[ Flatten Z ] を選択する必要があります。( Bounding Box の Z軸を 平らにする )

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/12/11/10862/76957896-d0f0-40ba-8af9-5ffb105d7649.png" width="500">

__設定後の動作イメージ__

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/12/11/10862/1ad0bbab-3535-4847-88f4-e265081ef83f.gif" width="700">

# See Also
- [Bounding Box (公式ドキュメント)](https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/README_BoundingBox.html)
初心者によるプログラミング学習ログ 181日目

#100日チャレンジの181日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

181日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>181日目<br><br>webサイトコーディング課題<br>更新履歴のページ作成<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1204489394188513280?ref_src=twsrc%5Etfw">December 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Vue.js Vuexで描画状態を管理するウエイト画面を作ってみた

# 概要
リクエストなどの長い処理で、処理待ちをする際に表示するウエイト画面をコンポーネント化し、
Vuexで状態管理をするように実装したときのメモ。

# 環境
* Vue.js 2.6.10
* Vuex 3.1.2

# ウエイト画面
まずはウエイト画面のコンポーネントを実装。

```vuejs:waitingLoader.vue
<template>
  <div class="loader-backdrop">
    <span class="loading">Loading...</span>
  </div>
</template>
<script>
export default {};
</script>
<style>
.loader-backdrop {
  width: 100vw;
  height: 100vh;
  line-height: 100vh;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 2000;
  text-align: center !important;
  position: fixed;
  top: 0;
  left: 0;
}
.loading {
  color: white;
  animation: flash 1.5s linear infinite;
}
@keyframes flash {
  0%,
  100% {
    opacity: 1;
  }

  50% {
    opacity: 0;
  }
}
</style>

```

# Vuexでの描画状態管理
Vuexの定義部分
* ```isWaitingShow```で描画状態を管理する
* ```waitingShow```、```waitingHide```で描画状態を切り替える

```javascript:main.js
import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'

Vue.config.productionTip = false

Vue.use(Vuex);
const store = new Vuex.Store({
  modules: {
    common: {
      state: {
        isWaitingShow: false
      },
      mutations: {
        waitingShow(state) {
          state.isWaitingShow = true;
        },
        waitingHide(state) {
          state.isWaitingShow = false;
        }
      },
      actions: {},
      getters: {}
    }
  }
});

new Vue({
  render: h => h(App),
  store
}).$mount('#app')
```

画面部分の実装

* ```this.$store.commit("waitingShow")``` でウエイト画面を表示
* ```this.$store.commit("waitingHide")``` でウエイト画面を非表示
* 今回はサンプルのため、ボタンクリック時に表示し、1秒後に非表示になるような実装

```vuejs:App.vue
<template>
  <div id="app">
    <waitingLoader v-if="$store.state.common.isWaitingShow" />
    <button @click="onShow">ウエイト画面表示</button>
  </div>
</template>

<script>
import waitingLoader from "./components/waitingLoader/waitingLoader.vue";

export default {
  name: "app",
  components: {
    waitingLoader
  },
  methods: {
    onShow() {
      this.$store.commit("waitingShow");
      const self = this;
      setTimeout(function() {
        self.$store.commit("waitingHide");
      }, 1000);
    }
  }
};
</script>

<style>
</style>
```

# まとめ
こういった画面を実装するときは大体共通化すると思う。

共通化しやすい部分に処理や状態をまとめられると何かとアクセスしやすくなると思い、
Vuexで管理するようにしてみたのが今回の実装。
【個人メモ】VScodeのエラー、Expected commajsonc(514)の意味

Visual Studio Codeのsettings.jsonをいじっていると
`Expected commajsonc(514)`
というエラーが出てきた。

予想されたコンマjson-c??
と思っていると
,（コンマ）をつけ忘れていた行があるのを発見。

このエラーが出た場合、どこかで構文エラーを起こしている可能性が高い。
SQLの内容を変数に代入する

SQLで抽出したレコードのあるフィールドの値だけが欲しい場合に

mySQL = "SELECT TOP 1 * FROM tbl1"

set rs = currentdb.openrecordset(mySQL)

L1 = rs("フィールド名")

または

L1 = rs!F4 ' HDR=NOの場合

debug.print L1

set rs = nothing
Processingを使ってグラフを動かしてみた

## 自己紹介
皆様、始めまして！
V高専生の霜暮黒夢（しもくれくろむ）と申します。普段は主に「Processing」という言語を使って動画やゲームを作っています。
これからよろしくお願い致します。<(_ _)>

## 初めに
突然ですが皆様、グラフって描いたことはありますか？
いえ、統計学とかそういう話をしているわけではないです。「y = x」みたいな数学でやるグラフの話です。
中学生以上の方なら、絶対描いているはずです。
描いたことありますよね？
描いたことがあるという前提で話を進めましょう。
あのグラフ、どう動いたらあんな形になるか、知りたいとは思いませんか？
思いますよね？（念押し
というわけで、Processingというプログラミング言語を用いてグラフを動かしてみました！

##Processingとは？
今回使用するProcessingについて軽い説明を…。
Processingとは、Javaをベースに作られた電子アートとビジュアルデザインのためのプログラミング言語とその開発環境の総称のことです。
導入がしやすく、シンプルなコードでデザインが描けるため、プログラミングの学習素材として優れています。
また、draw関数を用いることで、動的なプログラムを描くことができるので、ゲームを制作するための手段としても非常に優れています。
今回は、このdraw関数を用いてグラフを動かしてみました。

## コード
今回作成したコードはこちら！

```processing:sketch_graph.pde
float x, y;     //現在の座標
float bx, by;   //前回の座標

float t = 0;    //媒介変数t
float add = 1;  //媒介変数tの増加数

float mag = 25; //画面の倍率  

void setup()
{
  //初期設定
  size(800, 450);
  stroke(255);
  strokeWeight(3);
  background(0);
  translate(400, 225);

  //x軸，y軸の描画
  line(0, -height, 0, height);
  line(-width, 0, width, 0);

  //1から10までの軸を描画
  for (int i = 0; i < 10; i++)
  {
    line(mag * i, -5, mag * i, 5);
    line(-mag * i, -5, -mag * i, 5);
    line(-5, mag * i, 5, mag * i);
    line(-5, -mag * i, 5, -mag * i);
  }

  //媒介変数tの初期位置
  t = 0;

  bx = dx(t) * mag;
  by = -dy(t) * mag;
}

void draw()
{
  translate(400, 225);

  //媒介変数tに加算
  t += add;

  //媒介変数tに対応するx，y座標を計算
  x = dx(t) * mag;
  y = -dy(t) * mag;

  bx = x;
  by = y;
}

float dx(float t)
{
  //x座標の計算式を入れる
  return t;
}

float dy(float t) 
{
  //y座標の計算式を入れる
  return t;
}
```

実行結果はこのようになります。
![2019-12-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539075/7883f7fd-b3d3-f2a6-09f9-1e7307d42a5a.png)

##解説
このプログラムでは、$(0,0)$を始点とした「$y=x$」のグラフを描いています。

初めに、以下の二つの関数についてです。

```
float dx(float t)
{
  //x座標の計算式を入れる
  return t;
}

float dy(float t)
{
  //y座標の計算式を入れる
  return t;
}
```

この二つの関数はそれぞれ、媒介変数tの値に対するx座標、y座標の値を計算する役割を持っています。
「$y=x$」を「$x=t$」と仮定したときに、それぞれ「$x=t$」、「$y=t$」という等式が成り立つため、計算式を求めることができます。

例えば、「$y=2x$」を描きたい場合は以下のようになります。

```
float dx(float t)
{
  //x座標の計算式を入れる
  return t;
}

float dy(float t)
{
  //y座標の計算式を入れる
  return t * 2;
}
```

これは、「$x=t$」と仮定したとき、「$x=t$」、「$y=t×2$」という等式が成り立つためです。

では、「$y=sin(x)$」のグラフを描いてみるとします。
関数の中身はこうなります。

```
float dx(float t)
{
  //x座標の計算式を入れる
  return t;
}

float dy(float t)
{
  //y座標の計算式を入れる
  return sin(t);
}
```

結果は、以下の通りです。
![2019-12-11 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539075/429097c9-6f5c-321e-7eed-38b8848db819.png)
y軸方向の大きさがわかりにくい上にカクカクしているのがわかると思います。

今回のプログラムでは、その二点を解決するためにパラメータとして、画面の倍率`mag`、媒介変数tの増加数`add`を与えています。この二つの値を以下のように変えることにより、ある程度見やすくなります。

```
float add = 0.01;  //媒介変数tの増加数

float mag = 50; //画面の倍率  
```
結果は、以下の通りです。
![2019-12-11 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539075/d8b16741-7faa-65fe-7f4e-dbb5d906b856.png)
かなり見やすくなったと思います。

このように、二つのパラメータを与えることによって、様々なグラフを見やすく描くことができるようになっています。

##まとめ
今回はProcessingを用いてグラフを動かしてみましたが、いかがでしたか？
このように、日々の~~めんどくさい~~勉強もプログラムを絡ませることで楽しくなることが少しでも伝われば幸いです！

最後に、投稿が遅れたことをお詫び申し上げます。
本当に申し訳ございませんでした<(_ _)>

追記：当記事に間違い等ありましたら、お手数ですがコメント欄よりご指摘頂けますと幸いです。
AWS WAF v2 が出たので触ってみた

こんにちは、馬場です。

2019年11月末にAWS WAF v2が出たので軽く触ってみました。
丁寧な説明は他の方々におまかせして、個人的に気になった点を書きます。


### WAF Capacity Unit (WCU)

旧WAFでは、ルールの設定数で制限があったのですが、v2では考え方が変わりました。
個々のルールに対してポイント(Capacity)が設定され、１つのWeb ACLにつき、標準で 1500 WCU までのルールが設定できるというルールになりました。
WCU上限値は緩和申請可能です。

こんな↓感じでルール毎にCapacityが設定されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/b5b14e91-03f0-3976-8a10-7aa5e37f31b8.png)


### 3rd party製のマネージドルールの提供が少ない

旧WAFでは多くの会社がマネージドルールを提供しており、Marketplaceから購入できました。
v2では、2019年12月時点では、サイバーセキュリティクラウド(CSC)さんの２ルールと、Fortinetさん１ルールのみの提供です。
これからですかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/e61a8076-94ba-6d66-7384-2ef41b00ca9e.png)


### AWS公式のマネージドルール

AWS公式のマネージドルールが出ました。
こちらはMarketplace経由ではないので、ルール個別で費用はかかりません。
割と一般的に設定されるものが揃っているイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/74dc9b62-040e-c47c-3d45-54f2e2033f23.png)


### 手動でのルール設定も可能、設定の柔軟性が上がった

引き続き手動によるルール設定も可能です。
設定方法は旧WAFを踏襲しているようですが、コンディション複数のand/or条件記載が書きやすくなったり、ルール評価時の変換処理（URLデコードとか小文字化とか）が一度に指定出来るようになったので、設定の柔軟性が上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/97f707a2-d8c2-b7b7-7f1c-1b09c7889d7a.png)


### クエリパラメータ名指定の文字制限

ちょいと前のアップデートで、リクエストに含まれるクエリパラメータのチェック機能が実装されています。
とある案件で、これを利用した条件設定を試みたのですが、チェックするパラメータ名の指定で、指定可能な文字列は30文字が上限でした。
案件では、たまたまチェックすべきパラメータ名が30文字を超えており、、、しかも、パラメータ名部分は部分一致や正規表現も使えず（valueは使えるのに・・）、実装を断念した苦い思い出が。。。

v2でここの仕様がどうなったのか確認しました。

旧WAFでは、パラメータ名入力時点で30文字を超えるとエラー表示が出てたのですが、v2では出ない・・・っ！

もしかしていけるんじゃね？？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/52a5169e-9785-6820-7545-3e2f5b0f3389.png)

ってことで validateボタンをポチっとな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/92a34ba3-6db4-fd5e-d046-d414e17f64c7.png)

おぉーー！これは期待出来ます。
続けて確定ボタンをポチっとな。

・・・
・・・
・・・

・・・あれ？
・・・反応がない・・・。

どうやっても確定ボタンが反応しないので、画面上の色んなボタンをポチポチ。
デフォルトのvisual editorではなく、JSON editorに切り替えられたので validateボタンをポチっ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87961/9de4f4df-2d62-f1da-050d-38bea75dd0f7.png)
・・・やっぱダメじゃん。


### さいごに

パラメータ名指定部分の仕様が変わっていないのは残念ですが、旧WAFと比べるとメリットが多いので、新規でAWS WAFを構築する場合はv2で良いのではと思います。
なお、引き続き旧WAFは継続されるようなので、慌てて移行する必要もなさそうです。
ただ、旧WAFの名称が「AWS WAF Classic」なので、いつか終わるんじゃね感が漂います。。。
[初歩的ミス]データベース作成でつまづいた時の話ー原因から解決まで

個人アプリを作成にあたり、DBを作成していたときにつまづいた話を以下に記載します。
カリキュラムなど指示通りにしかやっていなかったりすると、中々気づけないポイントだったと思います。

#何につまづいたのか＋試してみたこと。
そもそも何につまづいたのか、以下に記載します。
個人アプリでDBを準備しようといつも通り下記コマンドを実行して、DB作成をしました。

```:terminal
$ rails db:create

$ rails db:migrate
```
その後、DBが作成できているか「Sequel Pro」を確認したところ、できていないことが判明。。。
念のため、ターミナルでもmysqlを確認しましたが、見つかりませんでした。

そこで、何かコマンドミスがあったことを疑い、改めてDB作成コマンドを実行しました。

```:terminal
$ rails db:create
Database 'db/development.sqlite3' already exists
Database 'db/test.sqlite3' already exists
```
既にDBがあるよ！とのこと。でもやっぱり見つかりません。。。
ここで気づかないのが、初学者な私。まだまだでした。
その後、いろいろ調べた結果、原因が判明します。

#原因
まずは結論から、今回の問題の原因は、**Database.ymlの記述とSequel proの設定が違うこと**でした！

以下、細かく記載していきます。
そもそもですが、$rails db:createは[Database.yml]の記述をベースにDBを作成します。
そこで、今まで私が作成していた記述と今回の記述を確認しました。

```rb:database.yml
#今までのファイル
default: &default
  adapter: mysql2

＃今回のファイル
default: &default
  adapter: sqlite3
```
上記は一部抜粋ですが、adapterが違ってます！
Sequel proはmysqlのデータを引っ張ってきているので、いくらDBを作成しても出てくるわけないですね。。。
これで原因はわかりました！早速修正していきます。

#解決方法
まずはdatabase.ymlを今までのものをベースに書き換えます。

```rb:database.yml
default: &default
  adapter: mysql2
```
まだこのままでは終わりません！
adapterを変更するにはgemも変更する必要があります。

```rb:Gemfile
gem 'sqlite3'
 #以下に変更
gem 'mysql2', '>= ver記載
```
bundle installも忘れずに行いましょう。

```:terminal
$bundle install
```

以上で変更は完了です！
改めてDB作成コマンド実行し確認したところ、Sequel proでも確認できました！

やはり自分で作成してみると、新たな気づきがありますね！
引き続き色々試しながらアプリ作成をがんばっていきたいと思います！

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

#参照
[初学者]既存アプリのDBをMySQLに変更する方法
https://qiita.com/shi-ma-da/items/caac6a0b40bbaddd9a6f
Riot.js v4 CLI

[Riot.js Advent Calendar 2019](https://qiita.com/advent-calendar/2019/riotjs) の11日目が空いていたので埋めます。

## Riot command line tool
[@riotjs/cli](https://github.com/riot/cli)
普段使うことはないですが、プロジェクトでのCI/CDを考えたら必要になる時が来る。ハズ。
今は複数人で各ページを開発して、特定の人がビルド＆デプロイという流れになっている。
引き出し確保のためにも一度勉強しておきます。（でもその時がきたらWebpack使うんだろうな）
`@riotjs/cli Version 4.0.3`の内容で記載します。


## コマンド説明

### 書式
`riot [オプション] [対象ファイル|対象ディレクトリ]...`
オプションは省略可能
ファイルは複数指定可能
ディレクトリを指定することも可能

### 説明
Riot.js のファイルをこの`riot`コマンドでプリコンパイルすることが出来ます。
先に`npm i @riotjs/cli -g`でインストールしておきます。


### オプション
#### -o, --output
> Output directory where your javascript files will be generated

`riot -o [出力先ディレクト] [対象ファイル|対象ディレクトリ]...`
JavaScriptファイルを生成する出力先ディレクトを指定します。
このオプションを指定しない場合はカレントディレクトリに出力されます。

```:例
> riot -o dist hello.riot
hello.riot -> dist\hello.js
```

#### -f, --format
> Specify output format - either: amd, cjs, esm, iife, or umd - default: esm

`riot -f [出力形式] [対象ファイル|対象ディレクトリ]...`
JavaScriptの出力形式を指定します。
指定できる出力形式は`amd`, `cjs`, `esm`, `iife`, `umd`。
このオプションを指定しない場合は`esm`で出力されます。

```:例
> riot -f umd hello.riot
hello.riot -> c:\hello.js
```

#### 補足
1. amd : (`Asynchronous Module Definition`)
  define, return
  非同期, フロントエンド向け

2. cjs : (`CommonJS`)
   require, module.exports
   同期, バックエンド向け

3. esm : (`ES Modules`)
   import, export
   標準モジュール, 多くの最新ブラウザで動作, シンプルに記述できる

4. iife: (`Immediately Invoked Function Expression`)
   (function () {  }());
   即時実行関数式

5. umd: (`Universal Module Definition`)
   module.exports, define
   フロントエンドとバックエンド向け(amd+cjs), ESMのフォールバックとして使われる傾向

#### -e, --extension
> Change riot components file extension - default: riot

`riot -e [拡張子] [対象ファイル|対象ディレクトリ]...`
Riotコンポーネントファイルの拡張子を指定します。
このオプションを指定しない場合は`riot`が使われます。

```:例
> riot -e tag hello.tag
hello.tag -> c:\hello.js
```

#### -s, --sourcemap
> Add inline or a file sourcemaps to the generated files - either: inline or file

`riot -s "[inline|file]" [対象ファイル|対象ディレクトリ]...`
`"inline"`を指定すると、生成したJavaScriptファイルの中にソースマップを追加します。
`"file"`を指定すると、`[対象ファイル].js.map`を生成します。

```:例
> riot -s "inline" hello.riot
hello.riot -> c:\hello.js

> riot -s "file" hello.riot
hello.riot -> c:\hello.js
* hello.js.mapも生成される
```

#### -c, --config
> Specify the path to a configuration file to compile your tags

`riot -c [設定ファイル] [対象ファイル|対象ディレクトリ]...`
タグをコンパイルするための設定ファイルを指定します。

```javascript:hello.config.js
export default {
  sourcemap: 'file',
  output: 'dist'
}
```
```:例1
> riot -c hello.config.js hello.riot
hello.riot -> dist\hello.js
```

設定ファイルに記述したオプションは引数で指定しても無視されます。
一方設定ファイルに無いオプションは有効になります。

```:例2
> riot -c hello.config.js -o out -f umd hello.riot
hello.riot -> dist\hello.js
* -o outは無視されるが、umdフォーマットで出力される
```

#### -w, --watch
> Watch for changes

`riot -w [対象ファイル|対象ディレクトリ]...`
変更を監視します。対象ファイルが変更されるたびにコンパイルが実施されます。

```:例
> riot -w hello.riot
Watching... hello.riot
```

#### -v, --version
> Print the cli version

`riot -v`
Riot CLIのバージョンを出力します。

```:例
> riot -v
4.0.3
```

#### -h, --help
> You're reading it

`riot -h`
Riot CLIのヘルプを出力します。
（雑記）bundle install時のmysqlのエラー対応とか参考にしたコマンドとか

bundle install時のmysqlのエラーに始まり、深い沼にはまりました。というか現在も沼の中にいます。
並行してosアップデートしたせいでなんかえらいことになっています。
いろいろとコマンドいじりすぎて訳がわからなくなったので確認が取れる範囲で覚え書きをば。

書いていて落とし処がわからなくなってきたので、また整理するか、要点だけ改めてまとめるかもしれません。

##エラー内容

```terminal:ターミナル
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

（中略）

Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

```

### やったこと
まず指摘されたコマンド打ってみた　→　解決せず

``` 
gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'
```

バージョン変更で解決するよ！（バージョンが違うよ！）って記事をいくつかみたので実行（下記のバージョン記述変えたり）　→　解決せず

```ruby:Gemfile
gem 'mysql2', '>= 0.4.4'
```

このへんで最初のターミナルの中に

```terminal:ターミナル
You have to install development tools first.
```
って書いているのに気づいた。なんだ、これで調べれば解決じゃん！　→ 解決せず。

ちなみに　「　xcode-select --install　」ってコマンドが調べれば出てきます。
これで解決してる人いっぱいいるのに...。
そもそもxcodeって触り始めたくらいの時に入れてるっぽいので入ってるよ！って思いましたが、os更新した後とか、このコマンド入れると解決したりするみたいです。OS更新した時とかに出番ありそうなのでメモ。

##　とっても役にたったコマンド
こちらも自分の覚え書きですが。

```
brew doctor
```

brew doctorすると、brewの設定とかで不具合がある場合とかに忠告が出るようです。

```
Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  pkg-config
  libtool
  ilmbase
  little-cms2
  libpng
  heroku
  openjpeg
  libde265
  webp
  ruby-build
  yarn
  xz
  openexr
  nodebrew
  heroku-node
  pcre
  jpeg
  telnet
```

上の場合だと、brew linkしろっていってるのでそのまま実行したら解決しました。(この問題については)

```
Ken@MacBook-Pro ~ % brew link pkg-config
Linking /usr/local/Cellar/pkg-config/0.29.2... 4 symlinks created
Ken@MacBook-Pro ~ % brew link libtool
Linking /usr/local/Cellar/libtool/2.4.6_1... 20 symlinks created
Ken@MacBook-Pro ~ % brew link ilmbase
Linking /usr/local/Cellar/ilmbase/2.3.0... 18 symlinks created
```

##ひとまず
まだ道半ばですが、ひとまず備忘録として重要そうな部分を書いておきます。
今のところ、mysqlのバージョンの差異によるもの、パスの設定ミス、もしくは少し前に設定をいじってしまったと思われる権限関係のミスと思われます。
（AWSデプロイの際にbundle installができなくなり、その時はrbenvあたりの権限が変わってしまっていたことが原因でした。）
バージョン違いの解決策で解決せず、合間に何をトチ狂ったのかOSアップデートしてしまい他のエラーがわんさか出ているので、ひとまずbrewをきれいにするところからかなぁと。




##　参考にさせていただいた先人たち
（他にもいらっしゃいましたが数が多すぎるので特に参照した方々を）
https://qiita.com/tktcorporation/items/0ef8c930fc18ce72c301
https://qiita.com/Yuki-k-lion/items/82a4e0490e9ed38ce545
https://qiita.com/motofumi/items/0f2e7ae1b852f118fe95
https://qiita.com/kota-es/items/98ae6ee84fc59aaae2ea
Pythonで定義元や定義先を参照できるjedi-vimのショートカットコマンド

jedi-vimは、VimにおけるPythonの入力補完ツール。
入力補完だけでなく、定義先や定義元へのジャンプもできたりする。
JavaのEclipseなどのIDEツールで使える機能みたいなやつ。
  
コマンド忘れがちなので、備忘録として書いておきます。

|項目|	キー|	説明|
|---|---|---|
|g:jedi#completions_command|	`<Ctrl-Space>`|	補完開始|
|g:jedi#goto_command|	`<leader>`d|	Definition（またはAssignment）に移動|
|g:jedi#goto_assignments_command|	`<leader>`g|	Assignmentに移動|
|g:jedi#documentation_command|	`<K>`|	pydoc表示|
|g:jedi#rename_command|	`<leader>`r|	変数リネーム|
|g:jedi#usages_command|	`<leader>`n|	使用箇所表示|
|:Pyimport|	:Pyimport|	モジュールのオープン|