OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】ホームページの背景色に使えそうな色・画像まとめ

#どうも7noteです。背景色につかえそうな色をまとめてみました。

多くのwebサイトが白背景の黒文字になっていますが、webサイトにこだわりを出している会社なんかは実は白以外の背景色を使っていたりもします。
そんなおしゃれなサイトを作るための参考として、ホームページで背景色として使えそうな組み合わせをいくつかまとめてみました。
これだけに限らず、色には様々ないろがあるのでこだわりの一色をさがしてみてください。

## 「文字:黒」で映える背景色

**・ 白**
![FFFFFF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/483f4b27-2237-70df-2d19-df822c99c181.png)
![F2F2F2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/d22726bc-e410-267e-678b-c46d839d74cf.png)
![F4F5F7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/23c8bea7-c5ca-1849-b0fa-e5ff7afcfb3b.png)


**・ ベージュ(赤)**
![ECCBC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/52682e55-e377-35b2-5a8c-ba1eca322815.png)

**・和紙風**
![washi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/29e49ccb-c67e-6986-609b-89ef06832113.png)


## 「文字:白」で映える背景色

**・黒〜グレー**
![000000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/d9e2fd7e-c196-734b-c175-42b0b6bf4974.png)
![6D6D6D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/353f26d7-3bed-6a48-e277-8995029a863f.png)

**・青**
![#571DF0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/45a73c66-100e-5780-805d-3294ee082ab7.png)


**・茶色**
![7B593A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/6cb89293-54f0-d47a-3dbe-db52ed77ab1e.png)


※あまり濃い色が多く見えてしまうとサイトがキツイ印象なってしまうので注意！

## まとめ

文字も真っ黒の#000ではなく#333くらいにする方が少し柔らかい印象になりますし、
白文字も真っ白でない方が綺麗に見える場合もあります。

ただ、オシャレな色を選ぶ際は視認性もしっかり意識して選ばなければなりません。

以下のサイトでコントラストチェックをして視認性が良いか判断することができます。

https://lab.syncer.jp/Tool/Color-Contrast-Checker/

ブログなんかは特に文字も多く読むテキストばかりなので、視認性はとても重要になってきます。



参考：
https://lab.syncer.jp/Tool/Color-Contrast-Checker/
http://degitekunote.com/blog/2015/06/29/background-color/
https://www.heyblend.com/
http://talking-ultrasuede.jp/


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【YOLOv5 ②】Google ColabでYOLOv5とtorch hubを使って物体検出の検出座標を出力する

#はじめに

前回に引き続き、物体検出に関する方法について忘備録としてまとめました。
Google Colaboratory上でYOLOv5とtorch hubを使用して、物体検出の推論結果の中身を見ていきます。



#前回のおさらい
物体検出やYOLOv5の説明は以下の記事をご覧ください。

https://qiita.com/hkwsdgea_ttt2/items/902b014aafbadfbc51d6

#torch Hub
YOLOv5のtorch Hubについて興味がある方は以下のリンクを参照してください。

https://pytorch.org/hub/ultralytics_yolov5/

#YOLOv5の準備

まずはGoogle ColaboratoryでYOLOv5の準備をします。

```
!git clone https://github.com/ultralytics/yolov5
%cd yolov5/
!pip install -qr requirements.txt
```

以上で準備は完了です。

#torch hubで物体検出してみる

まずはモデルをダウンロードします。

```
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5x', pretrained=True)
```


次に物体検出する画像を指定します。
ローカルの画像を使用する場合はパスを指定します。

```
imgs = ['https://ultralytics.com/images/zidane.jpg'] 
results = model(imgs)
```

結果を保存します。


```
results.print()
results.save()
```
![zidane (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/87efe7fe-6358-256a-b42e-45e3201d5537.jpeg)

前回と同様に物体検出ができました。
画像は`/content/yolov5/runs/hub/exp/` に `zidane.jpg`として保存されます。


#torch Hubで結果を確認する

推論結果の内容を確認していきます。

```
results.pandas().xyxy[0]  
```
実行すると以下の出力を得ます。

![qqq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/c0bf57c6-7070-5f89-d9ba-6769cb12bc4a.png)

物体検出の結果が一覧で表示されました。

各物体に対して、左から物体検出位置の座標、confidence（確信度）、番号、物体名となります。
なお、検出位置の座標は左上が原点(0,0)となることに注意してください。
画像と表を見比べてみると内容がわかりやすいかと思います。

#モデルの中身を確認する

今回使用したモデルの物体名と番号は以下のように確認ができます。


```
print(model.names)
```

`
['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']`

personは０番目、tieは27番目であることがわかります。
YOLOv5のモデルを使えば、上記リストにある物体の検出が可能となります。

#結果をcsvに出力する
先ほどで出力した表をcsvファイルとして出力します。

```
results.pandas().xyxy[0].to_csv('/content/yolov5/result.csv')
```

#終わりに
最後までご覧いただきましてありがとうございました。

https://tt-tsukumochi.com/archives/tag/yolov5
FlutterのWidgetTestでボタンのタップが反応しなくてドハマリした

# はじめに
FlutterでWidgetTestを書いていて、特定の場所でのみtester.tapが反応しなかった。
1週間くらいハマっていたがようやく解決できたので備忘録として残しておく。
なお、基本的なテストの書き方の説明は行わないので、ご了承いただきたく。

# オチ
先にオチを書いてしまうと、テスト環境の画面サイズが800x600と小さかったために
Expanded内のボタン表示エリアがまるっと潰れてタップが反応しなかった。
実機やエミュレータで確認する際は1080x1920の端末で見ていたので全く気づかなかった。

#　対策
テスト環境の画面サイズを大きくする。

```
WidgetsBinding.instance.renderView.configuration = TestViewConfiguration(size: const Size(1080, 1920));
```

これをsetupにいれてやれば画面サイズが1080x1920となる。

# まとめ
マジでこれに気づくまで1週間位かかってすごいつらかったので、同じ罠にハマる人が一人でも減れば幸いである。
あとデフォルトでこんな微妙なサイズを設定するのやめてくれ…
プロキシ環境でMSYS2の環境構築をする方法(Windows10)

# プロキシ環境でMSYS2の環境構築をする方法(Windows10)

## はじめに

プロキシ環境でMSYS2をインストールしようとするとエラーが出ます。

どういう訳か、環境変数を設定しただけではプロキシに弾かれます。

というわけでｷｨｨｨｨｨｨとなっていたのですが、ようやく解決に至ったので方法をご紹介します。

なお、このドキュメントではRuby Installerを使っていますが、たぶん普通にMSYS2単品でも何とかなると思います。知らんけど。

## とりあえずRuby Installerを走らせる

とりあえずRuby Installerを走らせます。ダウンロードなんかはググれば済みますし、インストーラの実行も言うまでもないので割愛します。

推奨設定どおりに事を進めていくと、普通ならMSYS2もインストールされて何の問題もなく終わるのですが、プロキシ環境だとMSYS2のインストールの途中で死にます。「13本の鍵をhktp://～から取得」で一生進まなくなります。要するにここをプロキシが邪魔しているわけですね。

というわけで、ここでRuby Installerは終了させてしまいます。

## 対処していく

というわけで、以下続きの対処について説明してきます。

### 環境変数を弄る

これはひょっとするとしなくても何とかなるのかも知れませんが、プロキシ環境だとどうせgem installのコマンドで詰まるので、今のうちに設定しておきます。

というわけでスタートメニューを開き、「環境変数」と打ち込んで「システム環境変数の編集」を呼び出します。あとは画面に従って環境変数を弄っていくだけです。

設定するのはhttp_proxyとhttps_proxy、ftp_proxyの3つの環境変数です。それぞれ新規に作り、変数名は「～～_proxy」、値は「(プロキシサーバのアドレス):(port番号)」で設定すればOKです。ここの値は管理者に問い合わせてください。

### MSYS2のprofileファイルを弄る

とりあえず、「C:\Ruby27-x64\msys64\etc\profile」を開きます。パスは各々の環境に合わせて読み替えてください。

profileは拡張子がないですが、適当なテキストエディタで開けば編集できます。

そして、末尾に次のような文を加えてください。

````
# proxy settings
export HTTP_PROXY="(プロキシサーバのアドレス):(port番号)"
export HTTPS_PROXY=$HTTP_PROXY
export http_proxy=$HTTP_PROXY
export https_proxy=$HTTP_PROXY
````

### なんかよくわからんけどファイルを消しておく

「C:\Ruby27-x64\msys64\var\lib\pacman\sync」(パスは各々ry)に入っているファイルをすべて消します。

よくわかりませんが、そうするといいそうです。

### msys2を走らせる

ここまででプロキシの設定は完了です。

というわけで次に、mingw64.exeを実行します。

コマンド入力の受付画面になったら、````$ pacman -Syy````を入力して走らせます。

これでちゃんとアップデートが完了出来たら設定が正しくできています。

### 再びRuby Installerに戻る

ここまでの作業を書いたとおりにしておけば、一応PCにRubyがインストールされている状態になっています。ということで、スタートメニューから「Start Command Prompt with Ruby」をクリックし、コマンドプロンプトを実行します。

ここで````$ ridk install````を打ち込んでエンターキーを押せば、再びRuby InstallerのMSYS2絡みの画面に戻ります。

というわけで、````$ 1````、````$ 2````、````$ 3````と順を追って実行していきます。

mingw64で````pacman -Syy````がちゃんと動いていればここでも問題なく動いてくれるはずです。

ここまで問題なく終われば、プロキシ環境でもMSYS2とRubyの環境構築が完了しています。お疲れ様でした。

## おまけ

### pacman -Syyでcould not resolve...(プロキシサーバのアドレス)的なエラーが出る。

エラーメッセージをよく読んでみてください。プロキシサーバのアドレスが間違っていませんか？

間違っていた場合はprofileファイルを確認してください。ここを修正すれば問題なく動くはずです。

私はこれでかなり時間を無駄にしました。

### プロキシサーバのアドレスについて

プロキシサーバのアドレスは「http://」を省略し、「proxy.hoge.co.jp」のように指定すれば大丈夫です。「http://」を指定した場合どうなるかはテストしていません。気になるなら試してみてください（他力本願）

## 参考文献

「MinGWインストーラーがプロキシーで機能しない」

https://www.it-swarm-ja.com/ja/windows-7/mingw%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8C%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BC%E3%81%A7%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84/958940158/

基本的にこれを見て作業しました。単なるまとめなおしです。

知っとるわーいという方は流していただけると幸いです。それでは。
Index out of rangeをこの世から無くす方法

# はじめに
こんにちは@kaneko77です。
大それた記事のタイトルに今回はなりましたが、
配列の数よりも大きい数を指定すると出るあいつをもう駆除しちゃおうぜって話になります。
今回は`Index out of range`のエラーをもう見なくて良い方法を共有していきたいと思います。
# マエフリ
## Index out of range　ってなに？
念の為の説明になります。
なんの工夫も無いただの配列があります。

```swift
let test = ["マチュピチュ", "モンサンミッシェル", "サグラダファミリア", "アンコールワット"]
```

配列の中身は見ての通りですが4つになります。

```swift
print(test.count)  // 4
```

以下をやってしまうと当然...エラーになります。
要素数以上に指定してしまってるからですね。
これが`Index out of range`が起きる原因です。
配列はこの場合だと要素は`0番目から3番目まで`です。

```swift
print(test[4])
```

<以下エラー画面>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/78bfa216-70e0-2f84-6fb2-2bb0e7ed2bb1.png" width="800px">

## 原因について
先ほど説明したように
いうまでもなく配列の要素数より上の数を指定するから「そんな要素ないわ」って
怒られますよね。
これがシンプルな原因ですが、しかし頭でわかっていてもやっぱりミスってあるし
プログラム的に要素の指定するってなると
余計気を配らなければいけないですよね。

# 解決策
ということでやっと紹介できます。
定義した要素を超えた数をどうにかしなければいけないです。
方法として何点かありますが、手っ取り早いのが**要素より超えた数を指定した場合`nil`を
返す方法**が一番楽だと思います。

## コード
### nilを吐き出してくれるチェック用のextension作成
まず以下のコードが必要になります。
以下のコードは[こちら](https://qiita.com/shtnkgm/items/f02553cb6bb16a59d8fe)を参考にしました。

```swift
extension Array {
    subscript (element index: Index) -> Element? {
        //　MARK: 配列の要素以上を指定していたらnilを返すようにする
        indices.contains(index) ? self[index] : nil
    }
}
```

### 呼び出し側
以下でnilが返すようになりました。

```swift
let test = ["マチュピチュ", "モンサンミッシェル", "サグラダファミリア", "アンコールワット"]
print(test[element: 4]) // nil
```

上記だとnilの制御しなければいけないので以下のようにしました。
こんな感じです。
これでnilチェックが入ったコードになりました。

```swift
let test = ["マチュピチュ", "モンサンミッシェル", "サグラダファミリア", "アンコールワット"]
guard let list = test[element: 4] else {
    print("nilだったみたいですよ。")
    return
} // 現状はここに入ります
print("受け取れたみたいです。", list)
```

# 終わりに
今回は大それたタイトルでご紹介しましたが,
エラー潰しのストレスを少しは消せる技術ではないかと思います。
ここ前で見ていただきありがとうございます。
SATySFIで括弧の形状が動的に決まる仕組み

SATySFiでは数式中の括弧の形状が中身によって動的に変化します。この仕組みをメモしておきます。

SATySFiにおける数式中の括弧を表すコマンド[`\brace`](https://github.com/gfngfn/SATySFi/blob/master/lib-satysfi/dist/packages/math.satyh#L1350)は例えば以下のように定義されています

```lib-satysfi/dist/packages/math.satyh
  let-math \brace =
    math-paren brace-left brace-right
```

ここで`math-paren`はSATySFiの組み込みコマンドで、

```text
math-paren: paren -> paren -> math -> math
```

と定義されています。さて、`paren`型の[`brace-left`](https://github.com/gfngfn/SATySFi/blob/master/lib-satysfi/dist/packages/math.satyh#L1303)も同様に以下のように定義されています。

```lib-satysfi/dist/packages/math.satyh
   let brace-left hgt dpt hgtaxis fontsize color =
      ...
      (inline-graphics (x4 +' w-extra) (hgtaxis +' halflen) (halflen -' hgtaxis) graphics, kerninfo)
```

すなわち、型`paren`は

```text
length -> length -> length -> length -> color -> inline-boxes * (length -> length)
```

のシノニムである。ここで、`kerninfo`はこの括弧に添字をつける際に、添字の高さ`y`を与え、左方向にセットバックする深さを返す関数である。これによって括弧と添字が離れて見えるのを防いでいる。`paren`型が任意の`graphic`を返すことで、自由な形状の括弧を描画できるのである。

以下、`paren`型の対象に渡される4つの`length`型値について説明する。

- `hgt`, `dpt` ... 括弧の中身の高さおよび深さ
- `hgtaxis` ... ベースラインから見たフォントの中心軸までの高さ。[ここで計算されている](https://github.com/gfngfn/SATySFi/blob/9dbd61df0ab05943b3394830c371e927df45251a/src/frontend/math.ml#L647)
- `fontsize` ... 言うまでもなくフォントサイズ。大抵のフォントは`hgt + dpt <= fontsize`となるように設計されている

# 括弧の大きさの計算

丸括弧や波括弧、角括弧など、上下対象な形状の括弧の場合、中身に対して相対的にどのような大きさで括弧を描画するか、というのは文書の見た目を作用する重要な点である。SATySFiでは[ここの`half-length`](https://github.com/gfngfn/SATySFi/blob/master/lib-satysfi/dist/packages/math.satyh#L1013)という関数で括弧の大きさ(の半分)を計算している。

```lib-satysfi/dist/math.satyh
  let half-length hgt dpt hgtaxis fontsize =
    let minhalflen = fontsize *' 0.5 in
    let lenappend = fontsize *' 0.1 in
      length-max minhalflen ((length-max (hgt -' hgtaxis) (hgtaxis +' dpt)) +' lenappend)
```

基本的には、中身のベースラインから`hgtaxis`だけ高い位置に括弧の中心が来るようになっており、括弧の高さは少なくともフォントサイズ以上となる。ただし、中身が上または下にはみ出る場合はその分だけ括弧が大きくなる。

ちなみに、括弧の外側から見たときのhgh, dptはどうなるかと言うと、これはparenに含まれるinline-graphicsに渡される変数h, d及び括弧の中身のそれから自然と決定されているようである。多くの場合、括弧そのものの描画を完全に包含するサイズに設定されているはずである。
JavaScript 関数をキャッシュする(Reactとかで使えるかも)

React でJSX内に、アロー関数式を書いたりしていると、毎度呼び出すときにレンダリングが走っちゃうんじゃないのかな、

ということを回避するための仕組みの試作です。

```js
const _cashFuncMap = new Map();
const cashFunc = (func) => {
  const strFunc = func.toString();
  let result = _cashFuncMap.get(strFunc);
  if (result === undefined) {
    result = func;
    _cashFuncMap.set(strFunc, func)
  }
  return result;
};

const f1 = () => 'test';
console.log(f1());  // "test"
const f2 = cashFunc(f1);
console.log(f2());  // "test"
console.log(f1 === f2);  // true

const cf = cashFunc;
const f3 = cf( (a) => a + a )
console.log(f3('ABC'));  // "ABCABC"
const f4 = cf( (a) => a + a )
console.log(f4('DEF'));  // "DEFDEF"
console.log(f3 === f4);   // true

```
https://jsbin.com/cohepuleli/1/edit?html,js,console

これで、文字列として変換した形が同じ関数なら、アロー関数式を動的に書いたとしても`cf(関数)`の形式で書いておけば、キャッシュされた値によって同値が返るので再レンダリングされない、みたいな。

でも、Reactの再レンダリングの仕組みよりも、functionのtoStringしてMapで値を持ってくるほうが遅いんじゃないだろうか、みたいな。検証してないからしらんけど。

動的に関数式を生成しないけど、即時でかけるような専用の構文がほしい。あるいは、React側が再レンダリングしないように対応してくれるようにならないかと思ったり。

以上です。
Django REST framework(DRF)をこれから学習する方へ



##目次
- APIとWeb API
- MVCとMTV
- Model
- Tamplate
- View
- まとめ

##APIとWeb API
###API
Application Programming Interfaceの頭文字を取った略称。
サービスの提供者がそのサービスを利用するために提供するインタフェースの事です。
開発者がAPIを利用すれば、同じ機能をもったサービスを開発する必要がないため
開発効率が向上し、開発費用を抑えることができる。

###Web API
API提供者とAPI利用者をHTTP／HTTPSベースでやりとりするAPI
APIは提供者と利用者のプログラミング言語が同じであることが多いが、
WebAPIは、異なるプログラミング言語でアプリケーションを連携させることが可能であり、
汎用性が高い。
Web APIではREST,SOAPという代表的な実装方式が存在します。

####REST
REST: Representational State Transferの略称。
RESTの考え方に沿ってできたWeb APIをRESTful API,又は、REST APIと呼びます。
１、以下のHTTPメソッドでデータ操作を表します。
GET:取得
POST:作成
PUT,Patch:更新
Delete:削除

２、ステートレス
前回のAPIの結果と2回目の結果で同じ値を返す。

３、URIで操作対象のリソースを判別可能にする
ユーザーというリソースを取得するため、usersというリソース名を付与したとする。
ユーザーIDで下記のようなURIフォーマットでURIを生成し、操作可能とする

>URI: http://example.com/api/users/userId/
>生成されたURI：　http://example.com/api/users/1/

４、レスポンスとしてXML形式かJSON形式で操作結果を戻す
データ操作できた場合、XMLもしくはJSONでデータ操作結果を記述し、HTTPのレスポンスボディーに含め、データを返す。

####SOAP
SOAPはSimpleObject Access Protocolの略称。
リクエスト、レスポンスをXML形式でやり取りする。


##MVCとMTV
以下の表ような違いがあります。

|MTV  |説明  |MVC  |
|------|------|------|
|Model  |データ、ロジック  |Model  |
|Template  |データの見せ方  |View |
|View  |どのようなデータを見せるか  |View |
|URLディスパッチャ  |URLの振り分け、リクエスト制御  |Controller |

##Model
アプリケーションに必要なデータ、そのデータに付随する処理を記述する場所
Djangoでアプリケーションを作成する際には保存するデータとそのデータに関連する処理を全てModelにまとめる

##Template
Viewから渡ってきたデータを表示するhtmlファイルのこと

##View
Django REST frameworkにおけるViewにおける役割はユーザーからのリクエストを元に、どのAPIを提供するか決定する処理をしている

Viewには以下のようなクラスを継承することで簡単に開発することも可能。

- FunctionView: Responseを返却する関数型View
- ClassBasedView: Httpメソッドごとにインスタンスメソッドを定義できる
- GenericView: クエリセットに紐づくため簡略化した書き方ができる


- ViewSet
取得、一覧、登録、更新、削除をまとめて管理するビュー
簡潔に素早くAPIロジックを作成したい場合
特別なカスタムロジックを実装しない場合

- APIView
複雑なAPIロジックを作成したい場合
外部のAPIを呼び出す場合
localのファイルを扱う場合

##最後に
これからDRFを学習する方へ向けての投稿でしたが、次回以降、コード例を載せてより詳しく説明しようと思います。
私がDRFを学習する際、RESTって何？、そもそもAPIとWebAPIの違いがわからないと言った事がありましたので、そういった方のお役に立てれば幸いです。
Ansibleでhostsに設定した変数をtemplateで使用する

ansibleのtemplateでホスト毎に設定した変数が使用したかったので、その方法をメモ


# hostsの記載

`1.2.3.4`というホストに`test_var`という変数を設定

```:hosts
[test]
1.2.3.4 test_var=test
```

# templateの記載

`test_var`という変数を表示


```:test.j4
{{ hostvars[inventory_hostname].test_var }}
```
Elmer で 両もちはりの変形 をやってみる

# はじめに
[オープンCAE勉強会＠関東（構造など）](https://openfem-kanto.connpass.com/) で教えていただいた事を復習しようと思います。
# OpenSCAD
![20210619a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/3810c76c-5ede-ff74-d6e1-d698ad7772e1.png)

```openscad.js
cube([0.5, 0.038, 0.019]);
```
はり：長さ500mm、高さ：38mm、幅：19mm
# Elmer
![20210619b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/43ed3fce-bc9d-2bc1-6431-be4cc1f19bd2.png)
`stl`ファイルを開きます。
![20210619c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/3825ae66-c6ad-5c3b-cd6b-69bc0d2deb30.png)
メッシュを切り直して、ヤング率：205.0e9、ポアソン比0.3 を設定します。
![20210619d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/94c38653-37d3-a153-7ad0-f260d699725f.png)
固定条件と荷重条件を設定しますが、荷重条件の単位は`N/m2`なのでややこしいです。
# paraview
![20210619b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/c9467e84-b0f7-bbc1-b429-7e49efb552fb.png)
あれれ、変位が0.18mmと小さいようです。
集中荷重ではなく、分布荷重になっているような感じです。
# やり直しopenscad
![20210621a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/fb3569d6-fa94-d938-3e0b-17d0da8a0ca6.png)
はりの上に凸をつけます。
# Elmer
![20210621b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/5b93c94a-ff5e-c570-7a61-6aa0e88c405f.png)
Elmerで開きますと凸部分のメッシュが細かくなっています。
![20210621c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/b035d075-bb2f-82ad-846d-84c2f17c1348.png)
# paraview
![20210621d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/d201e1df-25af-abaf-75c5-d05083c6ea63.png)
変位が0.14mmと小さいようです。
# Elmerでメッシュ切り直し
![20210621e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/f0777244-ed28-3234-4285-49e7a4d1779a.png)
# paraview
![20210621f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/2ef7c4be-f51f-2ef7-8ec1-37698ac205fd.png)
変位が0.37mmでいい感じになりました。
# おまけ Fusion360
![20210621g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/413f49ee-3f9e-4c88-5443-0bbf1a358a8e.png)
変位が0.3644mmといい感じになりました。
# 課題
集中荷重の設定方法を調査する。
# まとめ
+ Elmer さんありがとう
+ OpenSCAD さんありがとう
+ paraview さんありがとう
+ Fusion360 さんありがとう
+ オープンCAE勉強会＠関東（構造など） さんありがとう
新卒2年目が1年目を振り返ってみた ～トレーナーに1番感謝してる&役立った教育～

ちょうど今日、1年目のOJT報告書を書く機会があった。
良い機会なので1年目を振り返ってみる。

今回のテーマは、ドゥルドゥルドゥル・・・ダンッ！！！
先輩にしてもらったたくさんの教育の中で、1番感謝&役立ったと思うことについて:tada:

#はじめに
＜私＞
・社会人2年目
・文系（文学部、ゴリゴリの文系）
・プログラミング経験なんて一切なし（プログラミング言語すら1つも知らなかった）

#先輩からの教育
プログラミングについての知識を一切持ち合わせていないだけでなく、
パソコンについての知識すら危うかったポンコツ新人(仮)だったので、
先輩は様々な工夫をして、どうにかこうにかSE(仮)に育つよう頑張ってくださった。。

その中でも、私が1番感謝＆役に立ったと思っているのが、毎日課題である。

##毎日課題
「毎日課題」とは、文字通り「毎日課題が出ること」である。
詳しく説明すると、毎月、パソコン・プログラミングに関する（SEとして最低限知っておくべき）単語が書かれているExcelを、先輩が作成してくれる。

その単語を、毎日1つずつ調べて理解する。

そして毎週末、1週間分の単語について、先輩に発表するテストがある。

さらに月末には、1か月分の単語について、先輩に発表するテストがある。

－・－・－・－・－・－・－・－・－・－・－・－・－・－・－・－・－・－・－・－

毎日知らない単語を学習し、毎週末・月末のテスト前には学習した単語をもう一度振り返ることで、頭の中に単語が定着してくれるという仕組み。すごい:eight::eight:

#さいごに
社会人2年目になり、現場が変わってしまったが、毎日何か1つでも新しい単語や知識を身に着け、日々成長していこうというマインドは忘れずに生きている（はず）:hourglass:

次回の更新は、いつになることやら:skull:
テスト39

```vb

Sub PDF変換()

'書式
'object.ExportAsFixedFormat(Type, FileName, Quality, _
'    IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExClassPtr)

'ブックの全てのシートをPDF変換
Dim FName As String '保存先フォルダパス＆ファイル名

FName = ThisWorkbook.Path & "\test.pdf"
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, fileName:=FName

'----------------------------------------------------------------
'シートごとPDF変換
Dim sh As Worksheet

For Each sh In ThisWorkbook.Worksheets

    FName = ThisWorkbook.Path & "\" & sh.Name & ".pdf"
    sh.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        fileName:=FName
        
Next

'----------------------------------------------------------------

End Sub
herokuでアプリの作り方

（リポジトリの作成は割愛）
###1. Herokuにログインする

```$heroku login``` 

###2. アプリケーションを作成する
```$heroku create <アプリケーション名>```
HerokuのサイトからGUIでも作成できる。

###3. 設定からdb情報を設定する
https://dashboard.heroku.com/apps/<アプリケーション名>/settings

[Reveal Config Var]ボタンから、MongoDBの情報を設定する。
![スクリーンショット 2021-06-21 午後7.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75159/b4ac871f-654f-7c65-391e-2b011e8250b6.png)

###4. Package.JSONを書き換える
トップに下記(自分の環境)を追記する。
```"engine" : {
    "node":"14.17.0"
  },```
![スクリーンショット 2021-06-21 午後7.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75159/b638af51-d350-6ca3-1868-0a992ac56b6b.png)

```node --version```で念の為、自分の環境を確認しよう。

###5. PORTを書き換える
``` const PORT = process.env.PORT || 3000; ```

###6. プッシュする
```git add -A
git commit -m "Ready for Heroku"
git push origin main && git push heroku main```


https://git.heroku.com/<アプリケーション名>.git

エラー['heroku' does not appear to be a git repository]になったら、

```git remote add heroku https://git.heroku.com/アプリケーション名.gitとする```
VSCodeでショートカットキーの確認方法

## はじめに
VSCodeでショートカットキーの確認方法について学んだので備忘録として残しておきます。

## 環境
Visual Studio Code Version: 1.57.0
OS: macOS Catalina ver 10.15.7

##ショートカットの設定
`shift`+`cmd`+`p`でパレットを開きます。
`keyboard`と入力すると`Preferences: Open Keyboard Shortcuts`が表示されるのでクリック、するとコマンドの一覧が表示されます。

![スクリーンショット 2021-06-19 20.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/b06a8cc6-4fd4-81b1-697e-1cc9ba5d4cf1.png)

`Command`がコマンドの説明で`Keybinding`がどういうコマンドで実行するかになります。

左の鉛筆マークをクリックするとポップアップが表示されるので使いたいコマンドを入力してEnterを押します

![スクリーンショット 2021-06-19 20.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/d84577a6-9396-85d1-38ef-26418e4f3e74.png)

以上を実行すると`keybindings.json`に変更が追加されます。

##ショートカットの確認

VSCodeのコマンドにどういう機能が実装されているかを確認する方法として、
検索パレットの右にある以下のようなボタンをクリックします

![スクリーンショット 2021-06-19 20.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/116fd000-1d22-40b0-7f4d-37f0220d3c0b.png)

`Recoding Keys`という文字が表示されたらコマンドを入力します。

![スクリーンショット 2021-06-19 20.15.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/57fddb1d-8423-f36f-1495-a1dd37766917.png)

するとそのコマンドに対応した機能が表示されます。
PandasのMultiIndexからスライスして行を取得する

## はじめに

[この記事][note.nkmk.me]を見て、タイトルの動作ををしようとした時にハマったので、メモしておきます。
解決はしましたが、根本的なメカニズムを理解できていないので、詳しい方がいたらご教授ください。


## やりたいこと

MultiIndexのDataFrame`df`から、`Index2 == 'abc'`のものだけ取得する。

| Index1 | Index2 | Content |
|:------:|:------:|:-------:|
| A      | abc    | A_abc   |
| B      | de     | B_de    |
| C      | abc    | C_abc   |
| D      | de     | D_de    |
| E      | abc    | E_abc   |
| F      | de     | F_de    |


## 解決方法

```
df.loc[(slice(None), 'abc' ), :]
```

または

```
df.loc[pd.IndexSlice[:, 'abc'], :]
```

詳細は[こちらの記事][note.nkmk.me]を参考にしてください。


## できなかった方法

Pandasの`loc[]`では後ろの`:`を省略できるため、通常この2つは同じ動作をします。

```
df.loc['C']
df.loc['C', :]
```

ところが、今回`:`を省略したところエラーが発生。

```
df.loc[(slice(None), 'abc' )]  # KeyError: 'abc'
df.loc[pd.IndexSlice[:, 'abc']]  # KeyError: 'abc'
```

ちなみに、これは問題なく実行できました。

```
df.loc[(slice(None), 'abc' ), ]
df.loc[pd.IndexSlice[:, 'abc'], ]
```

エラーの理由がイマイチよく分かっていないので、知っている方がいれば教えていただけると助かります。


### 参考

[note.nkmk.me]:https://note.nkmk.me/python-pandas-multiindex-indexing/
 - pandasのMultiIndexから任意の行・列を選択、抽出(note.nkmk.me)
    - https://note.nkmk.me/python-pandas-multiindex-indexing/
InDesign スクリプト 変数名と一致するテキストを変数に

変数名と一致するテキストを変数にするスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
更新 2021/6/22
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "変数名と一致するテキストを変数に";

//スクリプト動作指定（一つのアンドゥ履歴にする、及び、アンドゥ名の指定）
app.doScript(function () {

    // ダイアログ
    var dialogueFlg = confirm("カスタムテキスト変数の名前と一致するテキストを変数に置換します。"
    + "\r\r" + "選択がない場合はアクティブドキュメント全体で置換、選択がある場合は選択内で置換します。 ", "", scriptName);

    // Ｎｏの場合
    if (dialogueFlg == false) {

        // スクリプトを終了
        exit();
    }

    // 置換数
    var replaceNumber = 0;

    // 検索の初期化
    app.findTextPreferences = NothingEnum.nothing;

    // テキスト変数の数だけ繰り返す
    for(var i = 0; i < app.activeDocument.textVariables.count(); i++){

        // カスタムテキスト変数の場合
        if(app.activeDocument.textVariables.item(i).variableType == VariableTypes.CUSTOM_TEXT_TYPE){

            // 検索テキストに変数名を入れる
            app.findTextPreferences.findWhat = app.activeDocument.textVariables.item(i).name;

            // 選択がない場合
            if(app.activeDocument.selection.length == 0){

                // テキスト変数挿入
                replaceNumber += insertTextVariableInstanceByName(app.activeDocument,app.activeDocument.textVariables.item(i));

            // 以外の場合
            }else{

                // 選択の数だけ繰り返す
                for (var ii = 0; ii < app.activeDocument.selection.length; ii++){

                    // オブジェクトのメソッドにfindTextがある場合
                    if (typeof(app.activeDocument.selection[ii].findText) == "function"){

                        // テキスト変数挿入
                        replaceNumber += insertTextVariableInstanceByName(app.activeDocument.selection[ii],app.activeDocument.textVariables.item(i));
                    }
                }
            }
        }
    }

    // 検索の初期化
    app.findTextPreferences = NothingEnum.nothing;
    
    // 結果の文
    var resultText;
    
    // 選択がない場合
    if(app.activeDocument.selection.length == 0){
        
        resultText = "アクティブドキュメント全体で置換をおこないました。";
    
    // 以外の場合
    }else{
        
        resultText = "選択内で置換をおこないました。";
    }

    // 結果を表示
    alert(resultText + "\r\r" + "置換数 " + replaceNumber, scriptName);

//スクリプト動作指定（一つのアンドゥ履歴にする及びアンドゥ名の指定）の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);

/* テキスト変数挿入関数、引数（検索対象、テキスト変数）の宣言 */
function insertTextVariableInstanceByName(searchTarget,targetTextVariable){

    // 検索結果の配列
    var searchResultArray = searchTarget.findText();
    
    // 検索結果の範囲
    var searchResultRange;
    
    // 置換数
    var replaceNumber = 0;

    // 逆順に検索結果の数だけ繰り返す
    for(i = searchResultArray.length - 1; i >= 0; i--){
        
        // 検索結果の範囲を入れる
        searchResultRange = searchResultArray[i].characters.itemByRange(0,-1);

        // テキスト変数を挿入
        searchResultArray[i].insertionPoints.lastItem().textVariableInstances.add().associatedTextVariable = targetTextVariable;
        
        // 検索結果を削除
        searchResultRange.remove();
     
        replaceNumber++;
    }

    // 置換数を戻す
    return replaceNumber;
}
~~~
Active Storageを使ってプロフィールに画像をつける

#はじめに

オリジナルアプリの新規登録の際に、画像を入力するフォームを追加して、プロフィールに画像が入れ込もうと思いました。

今回は**Active Storage**を使っていきたいと思います。

#Active Storageとは

ファイルアップロード機能を簡単に実装できるGemです。
Active Storageを使うと、画像などのファイルのアップロードを簡単にするメソッドが使用できたり、画像を保存するテーブルを簡単に作成できます。

#使用するツールたち


* **ImageMagick**

画像に処理を加えることができるツールです。
画像の作成やサイズ変更、保存形式の変更などがあります。

Railsでは単体で使用する事はできず、MiniMagickというgemが必要です。

* **MiniMagick**

ImageMagickの機能をRubyで扱えるようにしてくれるGemです。
RailsでImageMagickを扱うために必要となります。

* **ImageProcessing**

MiniMagickでは提供できない、画像サイズを調整する機能を提供するGemです。

#実施に導入

まずはmageMagickをインストールします。

```
brew install imagemagick
```

**注意**
VSCode内のターミナル内でインストールをしたらエラーが発生する可能性があるみたいなのでターミナルアプリから実行して下さい。

実際のエラー
↓↓↓↓↓

```
Error: No available formula or cask with the name "imagemagic".
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching taps on GitHub...
Error: No formulae found in taps.
```

続いて、MiniMagickとImageProcessingをインストールします。

```ruby:Gemfile
gem 'mini_magick'

gem 'image_processing', '~> 1.2'
```

しっかりターミナルでインストール！

```
bundle install
```

最後にActive Storageをインストール

ターミナルで実行します。

```
rails active_storage:install
```

コマンドを実行すると、Active Storageに関連したマイグレーションが作成されます。続けてマイグレートします。

```
rails db:migrate
```

ここまではポチポチして頂ければできると思います。

![スクリーンショット 2021-06-21 18.26.49（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/7cd7a61b-99c5-4093-609a-f562db28e3ae.png)

DBにはこのようなテーブルが追加されます。

簡単に説明すると
active_storage_blobsは実施に写真などが保存されるテーブルで、active_storage_attachmentsは中間テーブルになります。

#画像を保存する

準備が整ったので実施に保存していきます。

画像を保存する際の手順は2つです。



* Active StorageのテーブルとUserテーブルのアソシエーションを定義

* application.rbにて、画像カラムの保存を許可

まずはUserテーブルに紐づけるために**has_one_attached**というメソッドを利用します。

**has_one_attached**とは各レコードとファイルを1対1の関係で紐づけるメソッドです。
has_one_attachedメソッドを記述したモデルの各レコードは、それぞれ1つのファイルを添付できます。

```user.rb
class User < ApplicationRecord
  has_one_attached :avatar #ファイル名はなんでも大丈夫です
end
```

次にストロングパラメーターで保存の許可をします。

```application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

 
  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :company_name, :profession_id, :avatar])
  end
end

```

新規登録フォームに記述します。

```ruby:new.html.erb
<div class="form-group">
    <label>プロフィール写真</label>
     <%= f.file_field :avatar, class:"input-default" %>
  </div>
```

![スクリーンショット 2021-06-21 18.46.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/5440f6ac-9afd-6dc0-a68e-2c2a06f3cd9b.png)


このような形でファイルを開く事ができます。
AWS Online Summit Japan(2021/5/11~12)参加レポ ②

##はじめに
こんにちは[yuuun](https://qiita.com/yuuun)です。
先月開催していた[AWS Online Summit Japanの参加レポート](https://qiita.com/Yuu_N/items/6cd42edf2b5a671a4066)の第二弾となります。
第一弾を読んでいただけている方は以下参加した目的、参加したセッションは第一弾と重複する内容となっているので飛ばして読んでいただけると幸いです。

##参加した目的
4月に開催したAWSome Daysでは体系的にAWSの良さや主要のサービスについて学ぶことができたのでそこから更に基本的なサービスについて深堀して学びたいと思ったためです。

##参加したセッション
参加したセッションは以下になります。
本イベントではセッション数が150を超えていたのでどうやって自分が学びたい内容のセッションを探せるか不安だったのですが、セッションの種類やタグで探すことができるようになっていました。
そのため今回は初学者向けのタグのついていたセッションの中からいくつか選択して参加してみました。

####参加したセッション一覧
・**初学者向け AWS 学習パス ~まずはクラウドプラクティショナー認定資格から~**
・**【基本の AWS サービス】今日からはじめる！ AWS のデータベースと最適なサービスの選び方**
・**【基本の AWS サービス】Amazon EC2 ことはじめ　〜あらゆるワークロードに対応する豊富な選択肢とコスト最適化オプション〜**
・**【基本の AWS サービス】入門！ AWS アイデンティティサービス**
・**【基本の AWS サービス】進化した Amazon S3 を最大限に活用する**
・**【基本の AWS サービス】AWS アカウントを守るためにおさえておきたいセキュリティ対策**
・**【基本の AWS サービス】初心者向け Amazon VPC を中心としたネットワークの構成解説！**
※公式サイトは[こちら](https://aws.amazon.com/jp/events/summits/online/japan/)

その中で特に印象に残った何点かのセッションについて記事を分けて記述します。
第二弾は以下セッションです。

##【基本の AWS サービス】入門！ AWS アイデンティティサービス
こちらは初心者向けのタグが付いていたセッションだったので参加しました。
そもそもアイデンティティサービスとは何なのかという点から以下箇条書きと自分の感想を交えて記載します。

アジェンダ
**・AWSのアイデンティティ**
**・マルチアカウント環境でのアイデンティティ管理**
**・最小権限を実現するためのテクニック**

####・AWSのアイデンティティ
AWSのアイデンティティは以下３つの基本要素があり、それぞれの管理対象を管理するために様々な管理方法がある。
・**Who(誰が)**
・**can access(アクセスできる)**
・**What(何に)**

**それぞれの管理の対象**
Who(誰が)　　　　　　　
→管理の対象：名前やメタデータ(所属や役職)など　　

can access(アクセスできる)
→管理の対象：ポリシーやコンプライアンス

What(何に)
→管理の対象：単一やグループ、共有されたリソース

**それぞれの管理方法**
Who(誰が)　　　　　　　
→アイデンティティ管理　　
標準的な管理方法　Active DirectoryやSAML/OIDCなど
　　
can access(アクセスできる)
→アクセス管理
環境に応じた管理方法

What(何に)
→リソース管理
環境に応じた管理方法

####・AWSのアクセス管理　
**IAMでできること**
IAMとはAWS Identity and Access Management の略。
IAMではアクセス許可をポリシーで定義でき、数種類のアクセス定義方法を用意しているので
IAMを使用することでアイデンティティ、アクセス、リソースの管理を行うことができる。


####・マルチアカウント環境でのアイデンティティ管理　
**AWSアカウントとは**
・**課金の分離単位**
・**AWS環境の分割単位、リソース管理の枠組み**
・**サービスクォータ(サービス制限)の単位**
・**セキュリティの境界**
AWSアカウントは一つのコンテナと考えることができる(アカウントというコンテナに複数のリソースがあるイメージ)。
そのため、単一のアカウントではこの境界や単位のメリットを活用できないが、AWS利用が進み、より多くのアプリケーションやサービスを管理する際にこの境界や単位が活用できる。

**AWSアカウント利用のメリット**
・**ガバナンス**
セキュリティ、及びガバナンス上の理由から開発環境、テスト環境、本番環境などでアカウントを分割することができる。
・**課金**
課金に関する可視性、責任、及びアカウントごとのコントロールができる。
・**組織**
リソースの操作権限を特定の事業部に委譲し、その中でより自由にAWSプラットフォームを活用しやすくすることができる。
・**運用**
構成変更時の影響範囲を小さくし、他の組織を気にすることなく自身固有の環境を利用することができる。

上記アカウント利用のメリットは便利な反面管理が難しくなってしまうというデメリットがあるが、
以下提供されているサービスを利用することによってアカウント管理が容易になる。

**AWS Single Sign-On(SSO)**
AWS アカウントとビジネスアプリケーションへのSSOを提供している
**AWS Control Tower**
ベストプラクティスにそったAWSマルチアカウント環境を簡単にセットアップできる

####・最小権限実現のためのテクニック
・業務内容に応じた適切なアクセス権を必要なリソースに対して最小限にする
・継続的な確認：必要のないアクセス権を取り除く
　　ステップ１：IAMのアクセスアドバイザーで各AWSサービスの最終利用時間をチェックして**使われていない権限を見つける**
　　ステップ2：必要無いことを確認後、**アクセス権限を削除する**

##まとめ
・AWSのアイデンティティの基本要素とは「Who(誰が)」、「can access(アクセスする)」、「What(何に)」で構成されている。
・上記アイデンティティをマルチアカウント環境とIAMを使用して管理することができる。
・マルチアカウント実現のために必要の無い権限を取り除いて最小権限にするのがベストプラクティスである。
yarn installでrefs/heads/xxxブランチがないって言われた時の対処法


なぜか急に`yarn install`や`yarn add`ができなくなった。
→ `yarn cache clear`でcacheクリアしたらできるようになった。


# yarn install/addができない
```
$ yarn install
yarn install v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error Command failed.
Exit code: 1
Command: git
Arguments: pull
Directory: /Users/xxx/Library/Caches/Yarn/v6/.tmp/e435b7ca0cb96f2553222bc619c5b701
Output:
Your configuration specifies to merge with the ref 'refs/heads/ng-new'
from the remote, but no such ref was fetched.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

```
$ yarn add bootstrap-icons
yarn add v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error Command failed.
Exit code: 1
Command: git
Arguments: pull
Directory: /Users/xxx/Library/Caches/Yarn/v6/.tmp/e435b7ca0cb96f2553222bc619c5b701
Output:
Your configuration specifies to merge with the ref 'refs/heads/ng-new'
from the remote, but no such ref was fetched.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

```

# remoteブランチを確認してみると確かにない
```
$ git ls-remote origin | grep ng-new
# なし
```


# cacheクリアしてみる
```
$ yarn cache clean
yarn cache v1.22.10
success Cleared cache.
✨  Done in 30.85s.
```

# yarn installできたー:tada:！！！

```
$ yarn install
yarn install v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
✨  Done in 35.10s.
```
一方通行（グラフ上の移動） Java編

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_graph_step5

　題意が上手くくみ取れずいったん放置。しかる後お手本を参考に。
　お手本では「幅優先探索の一種」ということでC++のQueueを使っていたが、どう見ても可変長な二重配列。

　Javaで再現するには……と悶々考えた結果、
「前の問題を活かそうぜ。そういう仕組みだろ」
　となり、隣接リストを利用する形になった。

「あ、グラフ理論ってそういうこと……」と漠然とした実用法が見えた気がする。するだけ。

###コード

```java
import java.util.Scanner;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();   //頂点の数
        
        ArrayList<Integer> visit = new ArrayList<Integer>();     //訪れた順番
        int[] done = new int[n];    //訪れたかどうかのチェック（boolでもいいかも）
        
        //ArrayListを二次元で作る（隣接リスト）
        ArrayList<ArrayList<Integer>> g = new ArrayList<ArrayList<Integer>>();
        for(int i=0; i<n; i++){
            ArrayList<Integer> gin = new ArrayList<Integer>();
            g.add(gin);
        }
        
        for(int i=0; i<n-1; i++){     //辺を取り込んでgに入れる
            int a = sc.nextInt();
            int b = sc.nextInt();
            a--;
            b--;
            g.get(a).add(b);
            g.get(b).add(a);
        }
        
        visit.add(0);    //最初は1（0）からスタートなので埋め込んでおく
        done[0] = 1;    //引数0（頂点1）は訪れた扱い
        
        while(visit.size() != n){     //処理していけばいずれvisitはNに辿り着く
            int now = visit.get(visit.size()-1);    //現在地はvisitの最後尾から取得
            for(int j=0; j<g.get(now).size(); j++){    //頂点によって辺は1つか2つ
                if(done[g.get(now).get(j)] == 0){     //頂点をdoneしていないなら
                    visit.add(g.get(now).get(j));     //visitの末尾に挿入して
                    done[g.get(now).get(j)] = 1;     //doneを1にする
                }
            }
        }
        
        for(int i=0; i<n; i++){
            System.out.println(visit.get(i)+1);
        }
    }
}

```
【Anaconda】Macでcondaコマンドが使えなかった話【備忘録】

#背景
Macでcondaコマンドを使おうとしたら使えませんでした．
ググってもドンピシャな解決策がなかったので執筆します．
#環境
OS：MacOS BigSur
ターミナル：zsh
Anacondaのインストール場所：Users/username/opt/anaconda3 ←←

#アプローチ
##とりあえずconda

~~~
zsh: command not found: conda
~~~
おっと

##pathをターミナルに通す

~~~
% /opt/anaconda3/bin/conda init zsh
zsh: no such file or directory: /opt/anaconda3/bin/conda
~~~
おやおや？？

##ここで何かに気づく
インストールされたディレクトリパスをよく見てみた．
Anacondaのインストール場所：Users/username/opt/anaconda3 ←←
これコマンドにもUsers/username必要じゃない？

##ついに開通
「Users~」の部分を追加してコマンド実行．

~~~
% Users/username/opt/anaconda3/bin/conda init zsh
no change     /opt/anaconda3/condabin/conda
no change     /opt/anaconda3/bin/conda
no change     /opt/anaconda3/bin/conda-env
no change     /opt/anaconda3/bin/activate
no change     /opt/anaconda3/bin/deactivate
no change     /opt/anaconda3/etc/profile.d/conda.sh
no change     /opt/anaconda3/etc/fish/conf.d/conda.fish
no change     /opt/anaconda3/shell/condabin/Conda.psm1
no change     /opt/anaconda3/shell/condabin/conda-hook.ps1
no change     /opt/anaconda3/lib/python3.8/site-packages/xontrib/conda.xsh
no change     /opt/anaconda3/etc/profile.d/conda.csh
modified      /Users/username/.zshrc
==> For changes to take effect, close and re-open your current shell. <==
~~~
無事init完了！

~~~
% conda --version
conda 4.10.1
~~~
バージョンも教えてくれました．

#今回のオチ
Macが私のディレクトリにAnacondaをインストールしてくれていたことが原因でした．

違いますね．
私が自身のMacのディレクトリ構成を理解していなかったことが原因です．

コマンドの実行は時に取り返しのつかない事件のトリガーになります．
やらかすことが無いようにしっかりとディレクトリ構成について理解を深めようと思うきっかけになりました．
ありがとうMac．

#参考記事
[Anaconda3インストール後に、コマンドライン環境設定で「zsh: no such file or directory: /opt/anaconda3/bin/conda」のエラー](https://qiita.com/y_mayumi/items/c48f16ac8caf51ba8cc8)
[MacOS版Anacondaのインストール](https://www.python.jp/install/anaconda/macos/install.html)
【WordPress】All-in-One WP Migration のアップロード上限を上げる方法【ロリポップ】

# 【STEP1】 ロリポップ管理画面の php.ini の設定を変更

最初にロリポップの管理画面の「PHP設定」でモジュール版からCGI版に変更します。
php.ini の設定画面にある「php_value, php_flagを利用可能にする」の項目を `On` にします。
「php.iniを設定する」のボタンをクリックします。

![スクリーンショット 2021-06-21 18.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42231/6925ce62-4ace-93c0-185a-a4fdc64e15eb.png)

※モジュール版のままだと「php_value, php_flagを利用可能にする」の項目を変更できません。
※「php_value, php_flagを利用可能にする」の項目を `On` にすることで、 `.htaccess` に記述したアップロード上限の設定が有効になります。

# 【STEP2】 .htaccess に追記

既に WordPress がインストール済みなら `.htacccess` ファイルが作成されています。
その `.htaccess` ファイルに下記の 2 行を追記すれば完了です。

```
php_value upload_max_filesize 900M
php_value post_max_size 900M
```

※この場合なら、上限が 900 MB になります。

![スクリーンショット 2021-06-21 18.11.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42231/5a08345b-975a-529d-2660-95dc583d20bd.png)
MacのメニューバーにTogglのタスクと経過時間を表示する

# できること
Togglで実行中のタスク名、経過時間をメニューバーに表示する。
![スクリーンショット 2021-06-21 17.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/8539d15d-039d-a025-fe20-011bf70b9c93.png)
こんな感じ。
![スクリーンショット 2021-06-21 17.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/5d12fd69-92ac-d0ab-ecf3-b519476ff4d3.png)
# Togglにハマっている
Togglはいわゆる時間管理ツールで、
資格試験（AWS認定SysOpsアドミニストレーター）の勉強時間を記録するために利用している。
これまで勉強時間の管理は色々と試行錯誤していたのだが、Togglを使ってみて半月ほど経ち、なかなか心地よい。

スッキリとしたUIがお気に入り。
![スクリーンショット 2021-06-21 17.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/991acb6e-bc9c-0e2c-51ab-edb9c0ee1fb2.png)

プロジェクトごとにダッシュボードも作成してくれる。
![スクリーンショット 2021-06-21 17.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/1a5ca512-640e-8b99-fdfc-18be68e4c3db.png)
![スクリーンショット 2021-06-21 17.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/3cb4d0ee-db1c-cd0a-8593-53bdc2177b27.png)

- 記録を開始するまでのステップが少ない
- ブラウザベースのためPCから、スマホを気にせず手軽に記録できる（スマホアプリも存在）
- 最低限の労力でモチベーションの上がる視覚化をしてくれる

気に入っているポイントはたくさんあるのだが、1点運用上の課題が。
それは、「タスクを開始してから何分経ったか」が気になることが多々あるのだ。

# Togglに気を取られないために

時間を確認するためにTogglを開いているブラウザに移動すると、そこからネットサーフィンが始まってしまうことがあり、これでは本末転倒。どこかに常時表示できないかと思い立つ。
適当にググっていたところ、全く同じことを考えている方を発見。

参考にさせていただいたのは下記のサイト。

https://suin.io/573

詳細な手順はサイトをご覧いただくとして、利用したのは「xbar」というMacOS用メニューバーのカスタマイズソフト。

https://github.com/matryer/xbar/releases

今回のようにプラグインを自分で追加できるので、拡張性はかなり高そう。

# おまけ：メニューバーのお掃除

Togglのタスクを表示したことで、既存のアイコンが邪魔に思えたので「Hidden Bar」を使ってスッキリさせてみた。
インストールするのみ。簡単。

https://apps.apple.com/jp/app/hidden-bar/id1452453066?mt=12

整理前
![スクリーンショット 2021-06-21 17.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/a26e0f18-1518-b484-b8af-7b832fd9636a.png)
整理後
｜＞より左側に表示されているアイコンは、＞をクリックすることで表示/非表示が可能。
もちろん、｜＞の位置は自由自在に動かすことができる。
![スクリーンショット 2021-06-21 17.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344264/ad97df10-4f49-54e7-aeda-77621aff4b42.png)

大分好みのメニューバーに仕上がって、満足。
それと同時に、MacOSメニューバーカスタマイズという領域の魅力に気づいてしまいました・・・。
【日台友好】ありがとうございます！

#はじめに
世界中に新型コロナウィルスの蔓延で生活様式が急速変化してる一方で、
台湾は初期頃に国境を封鎖し、国内の蔓延を防止しましたが、
今年の5月に、航空関連の人員感染を始め、域内感染が急速に爆発しました。

#3級警戒の台湾
5/15日より、台湾全国が3級警戒となりました、
強制で外出禁止ではないですけど、
政府からは不要不急の外出は自粛するように要請されております。
飲食店の店内利用は不可となりました。
この日を境い目に毎日域内の感染者数は平均400人ほど増えています。
多くの企業はテレワークや時差出社の運用を始まりました。

#ワクチンの不足
唯一このパンデミックからの救いは、コロナが蔓延して以来1年半ほど経ちました。
ワクチン開発は進んでおり、接種も可能になりましたが、
台湾の立場ではワクチンの入手が困難になり、国は予算がありつつも、
なかなか入手できない状態に陥ています。

#日本からのワクチン支援
感染者数の増加スピードに対し、病床の数が追い付かない状態になり、
医療ひっ迫状態から、最初に手を差し伸べたのが日本でした、
とても速いスピードですぐに124万分のワクチンを調達してくれました。
政府も国民たちもすごく感謝しております。
先週(6/14の週)の時点で124万分のワクチンを接種開始となっています！
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/3138ec93-3a99-50e5-6b58-e091fcece483.png)


#終わりに
今回の援助に関して、感謝を伝えたいため、
台湾の圓山ホテル及び101がライティングされ、とても感動でした。
まだまだ自粛は続きますが、
ワクチン援助のおかげで医療人員の接種率はだいぶ上がりました！
本当にありがたい話です。
国内や国境の解除まであと少しだと信じています。楽しみにしてお待ちします！
![擷取01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/28cb004e-9d7c-d763-7f37-41ece391811c.png)
Go:テスト実行で環境変数を渡す方法など

# はじめに
Go開発していく上でテストはプログラム（成果物）の品質を保証するという観点でとても重要です。
しかし、最初のうちは色々と疑問とか慣れないことでストレスが溜まったりします。
筆者がGoテストで躓いてしまった時に調べたことやそれを通して得たチョットした知見などを共有したいと思います。

# 環境変数の渡し方
テスト実行の際に、環境変数が必要な場合に↓のように環境変数として渡すことができる。

## 1つの環境変数を渡す

```terminal
ENV_VAR=develop go test -v -run Test_xxxxx
```

`ENV_VAR`は環境変数名。`develop`はその値。

## 複数の環境変数を渡す

スペース区切り渡すだけ。

```terminal
ENV_VAR1=develop API_URL=http://example.mock.com go test -v -run Test_xxxxx
```
環境変数が多いときはシェルスクリプトなどに記述したほうがいいと思います。

# Testで前のテストのキャッシュを利用しない
あまり利用する場面はないのかもしれませんが、こんな事もできるというメモ程度。

```terminal
go clean -testcache && go test 
```

> use non-cacheable flags on your test run. The idiomatic way is to use -count=1
> (キャッシュさせないフラグとして、 `-count=1`をつけてテストを実行することもできる)

```terminal
go test -count=1 -v -run Testxxxxxx_Method
```
# テスト関数だけをテストしたい

1. testしたいメソッドが記述されているディレクトリに移動する
1. `go test -v -run Test_xxxxxxxFunc` と実行する


# # command-line-arguments とエラーになる
複数のテストが記述されたxxxx_test.goを実行。

```terminal
$ go test -v xxxx_test.go
# command-line-arguments  [command-line-arguments.test]
.\xxxx_test.go:10:7: undefined: xxxxx
FAIL    command-line-arguments [build failed]
```
失敗します。

## 原因
`go run `、`go test`、`go build`などを実行するときには、依存している全てのファイルが必要になります。
[ドキュメント](https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies) に説明があります。

## 解決するには
以下のように依存する全てのファイルを指定します。

```terminal
go test -v xxxx_test.go abc_service.go xxx_util.go xxx_errors.go
```

## go run でも同じエラーが発生

下のようなファイル構成では、

```bash:ディレクトリ構成
.
├── main.go
├── service.go ← このファイルに関数が定義されています。
└── service_test.go
```

```terminal
$ go run main.go
```
とすると、同じ様にエラーになります。

```terminal
$ go run main.go
# command-line-arguments
main.go:xx:10: undefined: ExecuteNiceMethod
```

[公式ドキュメント：Compile and run Go program](https://golang.org/cmd/go/#hdr-Compile_and_run_Go_program) で解説があります。

> Run compiles and runs the named main Go package. Typically the package is specified as a list of .go source files from a single directory, ...

> 通常、パッケージは単一のディレクトリからの.goソースファイルのリストとして指定されます。

ということですね。

全ての`go`ファイルをリストとして指定しろ、とういうことです。
同ディレクトリに main.go 以外にも`.go`ファイルが存在するときには注意が必要です。

## 解決方法
つまり、`service.go`もコンパイルには必要なので、

```bash
$ go run main.go service.go
```
とすることで解決します。
ただし同ディレクトリに他にもgoファイルがあると大変なので、シェルスクリプトなどでまとめて実行できるように用意しておくのもいいかもしれません。筆者は↓のシェルスクリプトを用意してます。

```sh:execute_all_go_file.sh
# ディレクトリのテストファイル`*_test.go`を除く全ての`.go`ファイルを実行するようにしています。
go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)
```

# 最後に
テストはスクリプト動作の最低限の動作保証です。スムーズにテストを進めることで無駄なストレスなく、シンプルに質の高いプログラムの完成を目指せます。
気が向いたら随時更新していくかもしれません。:smile: 
同じ様に悩んでいらっしゃる方の参考になるといいなと思い共有しました。
PHP 多次元配列の差分を取る方法

* LaravelのCollectionに多次元配列を比較する万能な機能を求め調べてみたのですが、特になかったので、
phpの配列の多次元配列の差分を見る方法を探しました。
下記のfunctionを用いて、差分を出してみてください。

```php
public static function array_diff_assoc_recursive($array1, $array2)
    {
        $difference=array();
        foreach ($array1 as $key => $value) {
            if (is_array($value)) {
                if (!isset($array2[$key]) || !is_array($array2[$key])) {
                    $difference[$key] = $value;
                } else {
                    $new_diff = self::array_diff_assoc_recursive($value, $array2[$key]);
                    if (!empty($new_diff)) {
                        $difference[$key] = $new_diff;
                    }
                }
            } elseif (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
                $difference[$key] = $value;
            }
        }
        return $difference;
    }

```

```php
<?php
$a1=array( 'a' => 0, 'b' => null, 'c' => array( 'd' => null ) );
$a2=array( 'a' => 0, 'b' => null );

var_dump( array_diff_assoc_recursive( $a1, $a2 ) );
var_dump( chinello_array_diff_assoc_recursive( $a1, $a2 ) );
?>
array(1) {
  ["c"]=>
  array(1) {
    ["d"]=>
    NULL
  }
}

array(2) {
  ["b"]=>
  NULL
  ["c"]=>
  array(1) {
    ["d"]=>
    NULL
  }
}
エクセル100本ノック 21 ~ 30

# 21問目 : バックアップファイルを作成する

## 問題
> 1か月以上経過したバックアップファイルを削除する。


## 解答
```vb
  Dim backupDirectory As String
  Const BACKUP_FOLDER_NAME As String = "BACKUP"
  
  Dim fso As New FileSystemObject
  Dim f As file

  ' バックアップフォルダが存在しない場合, 終了
  backupDirectory = ThisWorkbook.Path & "\\" & BACKUP_FOLDER_NAME
  If Not fso.FolderExists(backupDirectory) Then
    Exit Sub
  End If
    
  For Each f In fso.GetFolder(backupDirectory).Files
    ' 日付の差が1か月以上ある場合
    If DateDiff("m", f.DateCreated, Now) >= 1 Then
      f.Delete True
    End If
  Next  
  
  Set fso = Nothing

```

## 別解
```vb
 'f.DateCreatedを用いず、バックアップファイル名から日付を抽出する場合。
 ' バックアップの年月日を取得
 Dim yyyymmdd As String
 yyyymmdd = f.Name
 yyyymmdd = Mid(yyyymmdd, Len(fso.GetBaseName(ThisWorkbook.Name)) + 2)
 yyyymmdd = Left(yyyymmdd, 8)

 Dim d As Date
 d = DateSerial(Mid(yyyymmdd, 1, 4), Mid(yyyymmdd, 5, 2), Mid(yyyymmdd, 7, 8))
 If DateDiff("m", d, Now) >= 1 Then
 
```

## ポイント
【Rails】リアルタイムチャット機能実装（Action Cable）2/3

# 目的
Railsで作成したアプリに、`Action Cable`を用いてリアルタイムチャット機能を導入する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提

- アプリの下準備としてチャット機能実装が実装されている。
[【Rails】リアルタイムチャット機能実装（Action Cable）1/3](https://qiita.com/oak1331/items/1c938ce389f5ea9cbf9a)

# 手順

1. [はじめに](#はじめに)
1. [channelの作成](#channelの作成)
1. [message_channel.rbの編集](#message_channelrbの編集)
1. [コントローラーの編集](#コントローラーの編集)
1. [message_channel.jsの編集](#message_channeljsの編集)

# はじめに

前回に引き続き、`Action Cable`を用いての実装を行っていきます。
そもそも`Action Cable`とは、Railsのアプリと同じ記述で、即時更新機能を実装できるフレームワークのことを指します。
実装内容としては、メッセージの保存や送信に必要なRubyのコーディングと、保存したメッセージを即時に表示させるJavaScriptのコーディングです。

また、即時更新機能を実現するサーバー側の仕組みとして、`channel`があります。
`channel`はメッセージを即座に表示させるために、データの経路を設定したり、送られてきたデータを表示させるJavaScriptを記述したりします。

# channelの作成

それでは早速始めていきます!
まず、下記コマンドを実行しチャネルに関するファイルを作成します。

```:ターミナル
% rails g channel message
```

生成された、`app/channels/message_channel.rb`と`app/javascript/channels/message_channel.js`が重要なファイルとなっています。

`message_channel.rb`は、クライアントとサーバーを結びつけるためのファイルで、
`message_channel.js`が、サーバーから送られてきたデータをクライアントの画面に描画するためのファイルです。

# message_channel.rbの編集

次は`message_channel.rb`の編集を行っていきます!
このファイルは、MVCでいうところのルーティングの機能を果たしています。

`stream_fromメソッド`を用いることで、サーバーとクライアントの関連付けを設定します。

```ruby:app/channels/message_channel.rb
class MessageChannel < ApplicationCable::Channel
  def subscribed
    stream_from "message_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end
```

これでサーバーとクライアントを関連付けるための設定ができました!

`stream_fromメソッド`で関連付けられるデータの経路のことを`broadcast`と呼び、`broadcast`を介してサーバーから送られるデータをクライアントに送信します。

# コントローラーの編集

次にメッセージの保存が成功したときに、`broadcast`を介してメッセージが送信されるように記述します。

```ruby:app/controller/messages_controller.rb
class MessagesController < ApplicationController
  def new
    @messages = Message.all
    @message = Message.new
  end

  def create
    @message = Message.new(text: params[:message][:text])
    if @message.save
      ActionCable.server.broadcast 'message_channel', content: @message
    end
  end
end
```

`ActionCable.server.broadcast 'message_channel', content: @message`は、`broadcast`を通して、`message_channel`に向けて`@message`を送信するという意味です。

# message_channel.jsの編集

上記で送信され、`message_channel.js`が受け取った情報は、receivedの引数dataに入ります。
このデータをテンプレートリテラルにして、`new.html.erb`に挿入します。

```js:app/javascript/channels/message_channel.js
import consumer from "./consumer"

consumer.subscriptions.create("MessageChannel", {
  connected() {
    // Called when the subscription is ready for use on the server
  },

  disconnected() {
    // Called when the subscription has been terminated by the server
  },

  received(data) {
    const html = `<p>${data.content.text}</p>`;
    const messages = document.getElementById('messages');
    const newMessage = document.getElementById('message_text');
    messages.insertAdjacentHTML('afterbegin', html);
    newMessage.value='';
  }
});
```

`{data.content.text}`このcontentはコントローラーのcreateアクション内で指定したcontentからきています。

ここまで実装出来たら、実際にメッセージを送信して確かめてみます!

# 最後に

以上で、`Action Cable`を用いての実装は完了です。
次回は本番環境で実装するための設定を行っていきます.[【Rails】リアルタイムチャット機能実装（Action Cable）3/3](https://qiita.com/oak1331/items/aeeb6ccf474c7365f888)
では。
Github SSH key設定ランキング

Github SSH key設定を調べたときに参考にした記事

#第1位
https://qiita.com/shin6142/items/eced79ab23b364ce6f0c

#第2位
https://qiita.com/niihara_megumu/items/6e72ca09f1c0b5e05147

#第3位
https://qiita.com/sheepcat20/items/b091d600b62882398f1a

#その他
https://qiita.com/kz800/items/497ec70bff3e555dacd0
https://qiita.com/ekzemplaro/items/4f8832bd5fe5fcec2023
kotlinxを使えるようにする

#はじめに
「作ればわかる！androidプラグラミング」という本を参考に勉強をしていて、エラーが出たところの解決方法をまとめておく。
#発生したエラー内容
ボタンクリック時の処理を以下のように記述

```kotlin:MainActivity
morningBtn.setOnClickListener{
            greetingText.text=getString(R.string.good_morning_text)
        }
```
すると"Unresolved reference"のエラーが出た。

調べてみるとボタンがインポートされていないとのことだったが、本にはkotlin Android拡張プラグインがすでにプロジェクトに組み込まれているため、以下をインポートすれば良いと書いてある。

```kotlin:MainActivity
import kotlinx.android.synthetic.main.activity_main.*
```
しかしここにもエラーが発生していているため、どうやらkotlinxが読み込みできないようである。

#解決方法
Android Studioでkotlinxパッケージを利用出来るようにするには以下の記述が必要。（私の場合は３行目を追加した）

```kotlin:build.gradle
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}
```

記述を追加すると上にバーが表示されるのでSyncをクリック。その後FileのタブからSync Project with Gradle Filesをクリック。
これで無事エラーが解決しました。

#参考サイト
・Android Studioでkotlin,kotlinxパッケージを利用出来るようにする
https://qiita.com/hein946/items/5e30b1a502d62e848ba0
・kotlinxが未解決の参照になってしまう
https://teratail.com/questions/309655
Git 利用しているときの注意

###★Featureブランチ
- Developの最新から作成
- マージする時（pull request作成)はDevelopの最新（pull）にして、競合解決（あり場合）、マージする
- Push

###★リリース
- MasterブランチにDevelopをマージする
- タグを作成（release_2020xxx）
- push