OmniAICreator/Qiita-1.07M huggingface dataset:
flexには.*?のような最短マッチは実装されていない

- [Lexical Analysis With Flex, for Flex 2.6.2](http://westes.github.io/flex/manual/index.html)
- [Why doesn’t flex have non-greedy operators like perl does?](http://westes.github.io/flex/manual/Why-doesn_0027t-flex-have-non_002dgreedy-operators-like-perl-does_003f.html)


### flexの正規表現

flexである文字列のセミコロン「;」開始から改行までの文字列をコメントとして読み飛ばしたかったので以下のような正規表現を書いた。

```c++
";"[^\n]*?\\n /* skip */ ;
```

想定通りに動けば、セミコロン〜最初の改行までが読み飛ばされるはずだが現実にはそうはならず最大マッチ(貪欲マッチ)的な動きをしている。

想定の読み飛ばし

```
Hello, World ; this is comment \n   this is another line \n
             ^^^^^^^^^^^^^^^^^^^^ <-- 読み飛ばし
```

実際の読み飛ばし

```
Hello, World ; this is comment \n   this is another line \n
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ???
```

そこで上記のflexの仕様に気づいた。上記のリンクの翻訳が以下

### なぜflexにはperlのような貪欲でない演算子がないのですか？

>DFAは、それ以上のマッチングが不可能であると判断するまで入力を消費するのではなく、最初に受け入れ状態に入るときに停止することで、貪欲でないマッチングを行うことができます（「ジャム」状態）。これは、実際には、最も長い左端の一致（flexが行う）よりも実装が簡単です。
>
>しかし、それはまた、最も長い左端の一致よりもはるかに有用ではありません。一般に、貪欲でないマッチングを希望している場合、**それは通常、スキャナーに解析を行わせようとしていることを示しています。**それはまともな仕事をする力を欠いているので、それは一般的に間違ったアプローチです。個別のパーサーを導入するか、（排他的な）開始条件を使用してスキャナーを複数のスキャナーに分割することをお勧めします。
>
> 例えば‘BEGIN’という文字列を見つけたらstateを開始し、そのstateの中で‘END’を見つけたらマッチするような正規表現をもつことで、もしくは‘(.|\n)’のように単一の文字をチャンクに読み出すようにすることで…
> このアプローチには、はるかに優れたエラー報告プロパティもあります。 

ほう
> That’s generally the wrong approach, since it lacks the power to do a decent job.

字句解析で構文解析をするなと言いたいらしい。うっせぇうっせぇうっせぇわ、あなたが思うより適当です。

### じゃあどうする？

lexerの中で状態(state)を定義しとく

```cpp
%s COMMENT
もしくは
%START COMMENT
```
上記は「%s(=start)」と「%x」でやることが異なる[^1]、１行コメントについては[10 Start Conditions](http://westes.github.io/flex/manual/Start-Conditions.html#Start-Conditions)のお手本に従った。

[^1]: 前者は包括的開始条件を宣言し、後者は排他的開始条件を宣言します。

上記状態(state)を遷移するようなプログラムを書く

- **INITIAL** : コメントの開始
- -> **COMMENT** : コメント内部
- -> **INITIAL** : 改行を見つけた


```cpp
<INITIAL>";"        	 BEGIN COMMENT;
<COMMENT>.               /* skip */;
<COMMENT>\\n             BEGIN INITIAL;
```

上記のstateをもったコメント文解析は以下のページに解説がある
[10 Start Conditions](http://westes.github.io/flex/manual/Start-Conditions.html#Start-Conditions)

stateなのかconditionなのかどっちだよ
統計検定2級_合格までにやったこと（微分積分忘れているところから、2カ月でなんとか合格）

#はじめに
データ分析業務に興味が湧き、勉強し始めたけど、
・「統計知識がいまいち理解できない」
・「数学に苦手意識がある」
・「大学では、特に数学の勉強はしていない」　の状況であったため、
基礎知識の習得のために「統計検定2級」の勉強を開始しました。（2021/7~）

2021/8月無事合格できたので、記録と誰かの参考になればと思い、
学習したことまとめます。

####（学習開始時の、筆者のレベル）
・高校で数Ⅲ・数Cまで学んだけど、微分積分の公式は思い出せない
・回帰分析　等の用語は、聞いたことがある程度


#学習流れ
####1.　統計web
　　[統計WEB_統計学の時間](https://bellcurve.jp/statistics/course/, "統計WEB_統計学の時間")（最初の1カ月）
####2.　統計検定2級公式問題集(2017~2019)　で過去問学習（次の1カ月）
　　→不明点あれば、統計webで復習
####3.　Kindleで以下の学習。知識の整理・覚えなおし（最後2週間）
　　・[統計検定2級合格のツボ](https://www.amazon.co.jp/dp/B07VTL28HJ/ref=cm_sw_r_tw_dp_Y1BS4GS4SVHC36QP09HX, "amazonリンク先")
　　・[統計検定2級　模擬問題集1~3](https://www.amazon.co.jp/dp/B07DNW5S5J/ref=cm_sw_r_tw_dp_T6J25SEWTWVMC8QGDNQZ, "模擬問題集1amazonリンク")

時間とお金をあまりかけたくなかったので、合格者の勉強方法を調べて参考にしました。
上記3ステップを繰り返せば、過去問解ける・ほぼ理解できるようにはなりました。

#2.各項目の詳細
####1.　統計web  (最初の1カ月)

「2級範囲をほぼ全てカバーする内容」と銘打っている通りで、
範囲網羅されている上に、段階踏んだ説明で、分かりやすかったです。

数学に苦手意識はあったので、STEP0初級編　を学習した後に、
STEP1 基礎編　の学習に入りました。

が、、項目を増すごとに、学習内容も難しくなってくるので
初見では全く理解できない項目も多かったです。

また、高校数学の知識もあいまいだったので、
微分・積分の計算方法を調べたりと、思っていたより時間がかかり、
ひととおり理解するのに、約1カ月間かかりました。

分からない部分も、
繰り返し読むことで、徐々に理解が深まったり
過去問等で実際に問題に触れることで、あとから理解できたことも多かったので、
初期段階で分からなくても、落ち込まず、継続して触れ合っていけばいいのかと思います。

（公式は覚えといたほうがいいと思い、別途ノートにまとめて、暗記するようにはしてました）

####2.　統計検定2級公式問題集(2017~2019) (次の1カ月)
初回は、問題文の意味が分からなかったりで、
半分解けたのか？ぐらいでしたが、
間違えた問題を繰り返し学習して、最終的には全問解けるようにはしました。

また、間違えた問題は「なぜ解けなかったのか」の原因を把握するよう努めました。
・問題文の読み間違え　なのか
・基礎理解が足りてないのか　等

基礎理解が足りてない項目は、統計webで再び学習。

公式問題集の解説は、簡潔すぎて理解できない部分もあったので
後述する「統計検定2級合格のツボ」で理解を補強しました。

####3.　知識の整理・覚えなおし　（随時/2と並行して）
問題集だけだと、理解ができない部分が多かったり
問題自体覚えてしまったりすることもあって不安だったので
直前に、Amazon kindleUnlimited に1カ月(980円/月)のみ入り、以下を学習。

・統計検定2級合格のツボ
・統計検定2級　模擬問題集1~3

結果としては、
理解も深まり、問題対応力も補強できたので、非常に良かったです！！

特にCBT方式で受験を考えられている場合、
過去問と本番の問題では、少し問題の出し方が違ってるように感じたので、
少しでも、多くの問題に触れといたほうがいいと感じます。

#3.まとめ
CBT方式で受験しましたが、
過去問とは少し問われ方が違っていたりで、かなり焦りました。

時間は落ち着いて解いたら、十分足りるはずなので
分からなければ、いったん飛ばして、最後に見直しましょう。
（30人ぐらいで一斉に受け始めたけど、
最後は教室で一人になっているぐらい、時間いっぱいまで見直してました。。）

知識は網羅的に問われるので、
可能な限り苦手分野なくして、少しでも多くの問題に触れて、受験することをお勧めします。
REST APIとは

# なにこれ
REST APIについて調べ直したときの個人用のメモ

# リソースとは
データベースの行など

# ROA（リソース指向アーキテクチャ）とは
参照するものをリソースとして、リソースを中心に考えるアーキテクチャ
リソースはURIを持つ(/products)
リソースに対する操作（GET, POST)
リソースの表現形式(言語, JSON, etc)

## URI
リソースは1つ以上のURIを持つ
URIは記述的にしろ
/products/1 みたいな

/products1.1　と　/products/latest　は同じリソースを返すかもだけど、
概念が違うのでURIが2つでok
（前者はバージョン固定、後者は最新版）

## ステートレス性
全てのHTTPリクエストが完全に分離している性質を**ステートレス性**という
サーバー側でアプリケーション状態の管理をしない
クライアントが送信するHTTPリクエストに、サーバーが処理するための必要な情報が全て含まれてて、以前のリクエスト情報にも依存しない

## リソース状態
サーバーで維持される状態のこと

## 統一インターフェース
GET リソースの取得
PUT リソースの更新
POST リソースの作成
DELETE リソースの削除
HEAD　リソースのメタデータの取得
OPTIONS リソースがサポートするメソッドを調べる

GET /getResource じゃなくて GET /resource の方が一貫（統一）したインターフェースを保証できる

### GET
- GETリクエストを送信してリソースを取得する
- response.bodyでリソースを持つ

### DELETE
- 不要なリソースを削除するために、DELETEリクエストを送信してリソースを削除する
- response.bodyはステータスメッセージ or 空である

### PUT
- 新規リソースの作成
- 既存リソースの更新

### POST
- 親リソースに対して子リソースの作成
/products/1/entries/1　みたいな
- 既存リソースへの状態の追加
- オーバーロードPOST

### HEADとOPTIONS
#### HEAD
リソースのメタデータを取得（サイズ、更新日時など）

#### OPTIONS
リソースがサポートしてるHTTPメソッドなどを調べられる。
「Allow: GET, HEAD」のような形でレスポンスヘッダーにAllowヘッダーが含まれてる

# 分かったこと
## 取得するリソースが分かるようなURI名をつける！
e.g.
POST /users/1/products

POST /users/1/products/validate
みたいなURI名は微妙。
POSTメソッドなのにvalidationをするだけのエンドポイントは無駄ってかリソース取得の考え方と違う

paramsにsave: falseっていうfieldを追加して、
controllerで判別するべき？

## 余談
- resouceに含めてはいけないレスポンスもある（emailなどユーザーの個人情報）
Podmanでnginxを動かす

この記事はWindows10でHyper-Vを起動させ、そのHyper-V上にRHEL8.4をインストールした環境でテストを実施したものです。

podmanをインストールしておく。

```ruby:qiita.rb
$ sudo dnf install podman
$ podman --version
podman version 3.2.3
```
nginxコンテナ起動、イメージの確認。コンテナリストの確認。

```ruby:qiita.rb
$ podman run -d -p 8080:80 --name test_nginx nginx
$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx  latest      dd34e67e3371  11 days ago  137 MB
$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                 NAMES
1baef88e8fba  docker.io/library/nginx:latest  nginx -g daemon o...  26 minutes ago  Up 26 minutes ago  0.0.0.0:8080->80/tcp  test_nginx
```
curlで稼働確認を実施。

```ruby:qiita.rb
$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```
GitHub Codespaces 内に ssh する

## この記事は

GitHub Codepaces 内にローカル環境から ssh する方法です。
特に難しいことはありませんが、2021/8/25 現在、公式ドキュメント https://docs.github.com/en/codespaces に具体的な説明が見当たらないようなのでメモしておきます。

## 手順

### VS Code + Codespaces を起動する

ブラウザ内ではなく VS Code で起動します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114219/3dc1ee44-a147-03ad-f00e-f2dd11377e69.png" width=500 />


#### 2222 を Add Port する

「PORTS」に 2222 が登録されていなければ、Add Port で 2222 を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114219/499a5196-69bc-9d98-9cc4-a06da60d540e.png)

#### パスワード設定 (必要なら)

GitHub に SSH 公開鍵が登録してあれば、その公開鍵が Codespace 内の ~/.ssh/authorized_keys に置かれます。
よって、対応した秘密鍵がローカル環境にあればこの鍵でログインできます。素晴らしい。

もし公開鍵がなければ、 Codespace 上でパスワードを登録してそれを使えば OK です。

```
$ sudo passed $(whoami)
```


#### ssh する

ローカル環境に port forward されているので

```
$ ssh -p 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null codespace@localhost
```

で ssh login できます。　

オプション類は `~/.ssh/config` に書いておくと良いでしょう。

```ssh
Host codespace
  Hostname localhost
  Port 2222
  User codespace
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
```

これで

```
$ ssh codespace
```

だけで ssh できるようになります。

## おまけ: 自前イメージで sshd を有効にする

標準の Codespaces 環境で sshd はこのあたりで設定しているようです。

.devcontainer を使った自前の環境で ssh を使いたい場合には参考にしてみてください。

https://github.com/microsoft/vscode-dev-containers/blob/5814d360dcfa2041ba9e2cbf0d34bba6a3b9a9dd/containers/codespaces-linux/.devcontainer/base.Dockerfile#L57

```
    && bash /tmp/scripts/sshd-debian.sh \
```

https://github.com/microsoft/vscode-dev-containers/blob/5814d360dcfa2041ba9e2cbf0d34bba6a3b9a9dd/containers/codespaces-linux/.devcontainer/base.Dockerfile#L113-L115

```docker
ENTRYPOINT [ "/usr/local/share/docker-init.sh", "/usr/local/share/ssh-init.sh", "benv" ]
CMD [ "sleep", "infinity" ]
```

https://github.com/microsoft/vscode-dev-containers/blob/main/containers/codespaces-linux/.devcontainer/library-scripts/sshd-debian.sh


## まとめ

- GitHub Codespaces 内にローカル環境から ssh する方法を説明しました。
- Codespaces の標準環境で sshd 設定している部分を紹介しました。自前のイメージを作るときの参考にどうぞ。
【TypeScript入門】オブジェクトリテラル記法とインデックスシグネチャ

# TypeScriptのObject型に意味はない
* object型はobject型であることだけを伝える

下記の書き方だとエラーがでてしまう

```typescript:object.ts
export default function objectSample() {
  const a: object = {
    name: 'YSasago',
    age: 30,
  }

  a.name// aというobjectにはnameというプロパティがないとエラーがでてしまう
}
```

## オブジェクトリテラル記法を使おう
* 構造を定義
* 各プロパティに型

下記の書き方であればOK！

```typescript:/src/object/object.ts
let country: {
  language: string
  name: string
} = {
  language: 'Japanese',
  name: 'Japan',
}

console.log('sample 1:', country)
//sample 1: {language: "Japanese", name: "Japan"}

// 同じ構造のオブジェクトであれば再代入できる
country = {
    language: "English",
    name: "USA"
  } 

console.log('sample 2:', country)
//sample 2: {language: "English", name: "USA"}
```

```typescript:src/index.ts
import objectSample from './object/object'

objectSample()
```

## 特別なプロパティ
* オプショナル(?)のついたプロパティはあってもなくてもOK
* readonlyのついたプロパティは上書きできない

```typescript:/src/object/object.ts
// オプショナル(?)なプロパティと読み取り専用(readonly)プロパティ
const ySasago: {
  age: number
  lastName: string
  readonly firstName: string
  gender?: string
} = {
  age: 30,
  lastName: 'Suzuki',
  firstName: 'Tarou',
}
ySasago.lastName = 'Tanaka'
//ySasago.firstName = 'Ichiro' // firstNameプロパティはreadonlyなので再代入不可
ySasago.gender = 'male' // genderプロパティはオプショナルなので後から追加できる

console.log('sample 3:', ySasago)

//sample 3: {age: 30, lastName: "Tanaka", firstName: "Tarou", gender: "male"}
```

## オブジェクトの柔軟な型定義　〜インデックスシグネチャ〜
###インデックスシグネチャとは

*　オブジェクトが複数のプロパティを持つ可能性を示す
*　[key:T]Uのように定義する
*　keyはstringかnumberのみ

```typescript:src/index.ts
// インデックスシグネチャ
const capitals: {
  [countryName: string]: string
} = {
  Japan: 'Tokyo',
  Korea: 'Seoul',
}
capitals.China = 'Beijing'
capitals.Canada = 'Ottawa'

console.log('sample 4:', capitals)
//sample 4: {Canada: "Ottawa",China: "Beijing",Japan: "Tokyo",Korea: "Seoul"}
```
ICSと高速通信するときのコツ

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) これを知らないと「近藤サーボ遅すぎて使えん」ってなる

#やること

数珠繋ぎにした近藤科学製のサーボモーター（ICS通信、メーカー独自規格）をTeensyなどで高速に反応させたいときのTIPSです。

・**２台以上のICS通信サーボを同時に制御**したい
・Teensy4.0など**高速なマイコンを使い1.25Mbps**で制御したい

という条件下において、**公式ライブラリそのままでは制御速度のパフォーマンスが発揮できないばかりか、まともに動かせないという問題**があります。
これを解決します。

サーボとマイコンの半二重通信回路による接続方法、サーボへの給電方法などは別途ご検索ください。メーカーから[専用の変換基板](https://kondo-robot.com/faq/ics_board_-tutorial1)も発売されています。
サーボとマイコンの接続が成立しているという前提で話を進めさせていただきます。

参考）[ICS変換基板の使用方法](https://kondo-robot.com/faq/ics_board_-tutorial1)

#結論
公式ライブラリ[ICS Library for Arduino ver.2](https://kondo-robot.com/faq/ics-library-a2)を使います。
一点だけ注意点として、サーボコマンドとサーボコマンドの間に
**delayMicroseconds(2);**
を入れるようにします。
こうすると解決します。


#仕組み
Teensyなどによる高速なシリアル送受信処理が、ライブラリの想定を超えていることが原因のようです。
ライブラリをそのまま使用すると半二重信号の送信と受信の信号が重なる時間が発生してしまい、通信が成立しません。
なのでここにディレイを入れればうまく動くというカラクリです。
試したところディレイの値はTeensy4.0使用、1.25Mbpsでの通信時に2μsでもっとも安定するようです。
editor.wordSeparatorsの設定をしてますか

## はじめに

BackspaceやDeleteで1文字ずつ文字を削除するのではなく、Ctrl+BackspaceやCtrl+Deleteで単語単位で削除したい場合があります。

設定の`editor.wordSeparators`で日本語を指定していないと日本語編集のときに単語単位で動作しません :joy:

他の動作には、Ctrl+←やCtrl+→の単語境界への移動やダブルクリックによる単語選択があります。

## 解決策

設定(Settings)の`editor.wordSeparators`に日本語の区切り文字を追加しましょう。

`、　。！？「」【】『』（）`を追加したら、日本語の句読点や全角スペースなどの単位で動作するようになります :relaxed:

## さいごに

Ctrl+Backspaceが日本語の単語単位で削除しないのは、`editor.wordSeparators`に日本語の単語境界の文字を設定していないことが原因です。

設定することで日本語を編集しやすくなります :blush:
magentoが動かなかった時に確認すること。

# magentoが動かなかった時に確認すること。

・どこまでは正常に動いていたのか？
全く動いたことは無いのか。

・他ページは表示されるのか？

・管理画面は表示されるのか？

・プロセスは死んでないか？

・ステータスコードの意味を理解しているか？
400エラー　→ページが無い。
500エラー　→何らかの問題があって表示が出来ない。

・エクステンションは問題なく動いているか？

・パーミッションに問題は無いか？

・ログの意味は？
そこから、分かることは？
そこから、どんな状況が想定されるか？



# こんな時は

### There has been an error 

```
There has been an error processing your request
Exception printing is disabled by default for security reasons.
Error log record number:
```

これは、例外が走っている。
プログラムや、エクステンションが、読み込めてなかったり、など。エラーログが出ている。


### Autoload error 

```
Autoload error 
Module 'xxx' 
from '/var/www/html/magento/app/code/My/xxx' 
has been already defined in
 '/var/www/html/magento/app/code/My/xxx'.
```

registration.phpが、上手く読み込めてないかもしれない。
【Unity】materialがリークするけど、sharedMaterialにも問題がある場合

Unityエディタを操作中、次のようなエラーが出ました。
>Instantiating material due to calling renderer.material during edit mode. This will leak materials into the scene. You most likely want to use renderer.sharedMaterial instead.

翻訳すると
>編集モード中にrenderer.materialを呼び出したことが原因で、マテリアルをインスタンス化します。これはシーンにマテリアルをリークすることになります。代わりにrenderer.sharedMaterialを使用することをお勧めします。

materialを使わず、sharedMaterialを使えということなのですが、sharedMaterialを使うと元のアセットのプロパティを書き換えてしまうという問題があります。
そこでsharedMaterialを使うけど、元のアセットも書き換えない方法です。

```c#
var tempMaterial = new Material(renderer.sharedMaterial);
tempMaterial.mainTexture = texture;
renderer.sharedMaterial = tempMaterial;
```

###追記
この方法を使ってもエラーが出ないだけでリークしていて、Hierarchyに勝手にインスタンスを作ってしまうことがあるようです。
なのでmaterialを取得したら自分で破棄した方がいいのかも知れません。

>[【Unity】Renderer.materialで取得したマテリアルは自分で破棄しないとリークする話](https://light11.hatenadiary.com/entry/2019/11/03/223241)

###追記その２
エディタのプレイモード終了時、Hierarchyに勝手にインスタンスを作るのは別の問題が原因っぽいです。
sharedMaterialを使って自分で破棄処理したのと、しないのをプロファイラーで比較しましたが、大きな差は確認できませんでした。
Reactを基本からまとめてみた【5】【Props（プロップス）①】

##Propsとは
親コンポーネントから子コンポーネントへ値を渡す為の仕組み。
『親』⇨『子』の１方向のみ。子コンポーネントでデータの書き換えは不可。

##Propsのメリット

- コードの記述量が減る
- 効率よくフロントエンド開発が行える
- 『Component』+『Props』はUI開発において定番

##Button.jsの修正

```Button.js
import React from "react";

const Button = (props) => {
  return (
    <button className="ui basic button">
      <i className="icon user" />
      {props.title}
    </button>
  );
};
export default Button;
```

```App.js
import React from "react";
import Button from "./Button";

const App = () => {
  return (
    <div>
      <div>App</div>
      <Button title="post" />
      <Button title="edit" />
      <Button title="delete" />
      <Button title="submit" />
    </div>
  );
};
export default App;
```




##参考サイト
[【React入門】#5 Props（プロップス）の理解]
(https://www.youtube.com/watch?v=mT6EKxs-ACA)
ユーザー情報の編集したら強制ログアウトされてしまった

オリジナルアプリを苦戦しながら作成している初心者です😄

教材とはまた違って自分で必要な機能と使うgemやら何やらを考えていたら全然関係ないところでエラーがでるのも多いです。。。

1週間は取り組んでいるのですが、まだまだdeviseを使ったログイン機能を付けて、デザインをある程度みられるように整えるくらいしかできませんでしたw

今回ぶち当たったエラーの状況はuserの情報を編集するためのマイページを作成して、それを反映させる際に何故かログアウトさせられる動作が入っていました。

編集のやり方としてはdeviseのインストールをした時にviewも一緒に作成すると思います。そのregistrations/editといったviewで編集内容の送信をするのが一番簡単だなと思います！
では正直deviseをインストールした時に作成されるregistration.edit.html.erbはユーザーの編集用のファイルなのでこれを使うとスムーズにできると思います。

今回はdeviseとは別のUserコントローラーを作ってそこでマイページ関連を管理しよう！と思って作りました。

```ruby:ターミナル
rails g controller Users mypage edit update
```

```ruby:users_controller
class UsersController < ApplicationController

before_action :authenticate_user!

  def edit
    @user = User.find_by(id: params[:id])

    if @user != current_user #ログインユーザーのidと@userのidが一致しなかったら@userのmypageに遷移させる
      redirect_to mypage_user_path(current_user)
    end

  end

  def mypage
  end

  def update
    if current_user.update(user_params)
      redirect_to mypage_user_path(current_user)
    else
      redirect_to mypage_edit_user_path
    end
  end

  private

    def user_params
      params.require(:user).permit(:nickname, :email, :password, :password_confirmation, :profile, :image)
    end
end
```
こんな感じでアクションを記載していって、updateされたらcurrent_user(deviseで使えるようになったヘルパーで現在ログインしているユーザーのこと)のmypageに移動するといったアクションです。

書いているコードは汚いと思いますが、ちゃんと動作すると思って実際に動かしてみたら更新した際に何故かログアウトした状態になり、ログインまたは新規登録を促すフラッシュメッセージが表示されてました。
そのままログインしてみて、マイページに移動してみたらちゃんと更新されていました。
もう意味がわかりませんでした笑

この強制ログアウトさえなければひとまず編集機能は実装できるんですがねぇ

まあ色々探してみました。
devise強制ログアウトで検索して一番良さそうな記事を参考にしました。
今回は一つ目で解決したんで早くて済みました！
[参考資料](https://www.it-mure.jp.net/ja/ruby-on-rails/%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%A4%89%E6%9B%B4%E5%BE%8C%E3%81%AB%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%99%E3%82%8B/970422718/)

```ruby:users_controller.rb
 def update
    if current_user.update(user_params)
      redirect_to mypage_user_path(current_user)
      sign_in(current_user, :bypass => true) ←この1行を追加しました
    else
      redirect_to mypage_edit_user_path
    end
  end
```

で結局何が原因だったかなんですが、deviseの設定でパスワードやメールアドレスを変更するとログアウトされるみたいです。
後で調べてみましたけど、Userモデルのvalidateを削除するのも一つの手だと思いました。
今回はこれでやりましたけど後々悪さしそうなら考えます。

間違い等ありましたら教えてくださると嬉しいです！
VBA エクセル　差し込み印刷



```vb
Option Explicit

'標準モジュールの先頭に記述します。
#If VBA7 Then 'Excel2010以上の場合
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else 'Excel2007以下の場合
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub Print_Out_1_2() 'セルに値を設定しながら印刷する（待ち時間あり）
    '定数
    Const conStart As Long = 1      'リストシートの開始番号
    Const conEnd As Long = 78       'リストシートの終了番号
    Const conStep As Long = 3       '間隔　一枚で何人印刷するかで任意に設定
    Const conCell As String = "Q1"  'セル番地
    Const conWait As Long = 100     '待機時間
    '変数
    Dim i As Long
    With Application
        .ScreenUpdating = False
        With .ActiveSheet.Range(conCell)
            For i = conStart To conEnd Step conStep
                .Value = i
                Call Sleep(conWait)
               ActiveSheet.PrintOut 'ActiveSheet.PrintPreview 'プレビュー
            Next
        End With
        .ScreenUpdating = True
    End With
End Sub


```
カプセル化

開発をしている上で意図しないところでデータを更新してしまう事がある。（副作用）
これを防ぐのがカプセル化である。

カプセル化とは、クラスの状態と挙動をカプセルに閉じ込めて何を公開するかを設計するということである。

もし、他の開発者が非表示のクラスの情報や関数にアクセスしたら、エラーになる

修飾子を使用することでクラスの状態と挙動を管理できる。
おもに```public```と```private```が存在し、前者は任意のユーザーでもアクセスできるようにし、後者はユーザーに対して非表示にしてくれる。

カプセル化したクラスでは定数のメンバ変数以外は基本的にプライベートになる。
メンバ変数を読み取るにはアクセスメソッドを作るのが一般的（```getter```）。メンバ変数を書き換えるにはミューテータメソッドが必要になる（```setter```)

セッターメソッドとゲッターメソッドを実装することで柔軟にクラスをカプセル化し、設計することができる
加えて、privateを記述＋　　ｐrivateのみのミューテッドプロパティを実装をすることによって不変なオブジェクトを設計できる。（基本は可変オブジェクトにすることが多いが）→データを副作用から守るために実装する。

クラスの抽象化
--
クラス設計の理想はどのようにそのクラスのメソッドや変数が挙動するか知っていれば良い。これをクラスの抽象化という。そのどういう挙動をするのか？というところは公式のドキュメントに書いてあるのでそれを熟読。SwiftでいえばAppleのやつにすべてどういうクラスでどこを継承してどういうプロパティとメソッドをもっているかが書いてある。（クラス契約）
1.1 インターネット基礎

# インターネット

- インターネットとは、全世界でコンピュータ（パソコン、スマホを代表とするさまざまなコンピュータ）同士が相互につながるネットワークのことです
- 契約するインターネット・サービス・プロバイダー事業者や、電話サービスを提供する事業者、ケーブルテレビ事業者などがそれぞれ保有するネットワークに接続されインターネットを利用します。
- 日本の場合、プロバイダーはNTTなどの第1種電気通信事業者から回線を借り、私たちはその回線に対して使用料をISPに払いインターネットを利用しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/de7e4dd7-4d82-f431-52db-1fb9c7100bbe.png" width="65%" />

# URL

インターネット上の住所（アドレス）です。
ブラウザの上部に入力・表示のバーがあります。

人が分かりやすいように英数字を用いたアドレスを使用しますが、インターネット上の通信はIPアドレスと呼ばれる数字の羅列のようなもので行われています。
URLとIPアドレスの対応(変換)はDNSサーバと呼ばれるサーバが行っています。

# Webブラウザ

パソコン、スマートフォンなどを利用してWebサーバに接続するためのソフトウェアです。

ちなみに、ブラウズとは`見る`という意味です。

代表的なブラウザには、以下のようなものがあります。

- Chrome
- Edge
- Safari
- Firefox

# Webサーバ

個人のパソコンで使用しているブラウザからアクセスされ、結果（コンテンツ）を返してくれるコンピュータです。
静的コンテンツ、動的コンテンツを保有しています。

<font color="red">ホームページやLPなどを作成し公開する場合は、レンタルサーバ(ホスティングサービス)などを使用しWebサーバにhtmlなどをアップロードします。</font>

Webサーバを自分で構築することも可能ですが、インフラやネットワークの知識など範囲がWeb制作とは異なるため割愛します。


# WebブラウザがWebサーバからページを表示する仕組み

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/76228134-2f0d-1da9-6d2b-eca7fd41bf39.png" width="50%">

1. Webブラウザ(Webクライアント)から`http://www.abc.co.jp`にアクセスします。<font color="red">リクエスト</font>を送信します。
1. インターネット上で`http://www.abc.co.jp`がに情報が到達します。
1. Webサーバは、受け取った<font color="red">リクエスト</font>を元に返却するHTML等を選別しWebクライアントへレスポンスを返します。

※リクエストは、http://www.abc.co.jpを見たいですというリクエスト以外


# 独自ドメイン

`yahoo.co.jp`とか`google.co.jp`とかがドメインです。

ドメインとは、インターネット上の住所のようなもので、人間に馴染みやすいアルファベット、数字、記号などを組み合わせたものです。その中でも個人や会社などが、独自に登録しているドメイン名のことを独自ドメイン名と呼びます。

※実際は、ドメインからIPアドレスと呼ばれる数値に変換されインターネット上で通信が行われます。

# 独自ドメインを取得するメリット

１．信頼性の証明

　独自ドメイン登録を行うと、登録者や連絡先がドメイン管理会社に登録されます。（インターネットに公開又は非公開にできます。）
　ドメイン管理会社を通じて登録者に連絡が取れるようになっています。

２．意気込みのアピール

　１．の内容と重複しますが、独自ドメインを取得しているページと認識されることでの意気込みや、そのページがずっと存在するであろうということを想像させることができます。

# 独自ドメインの種類

（1）全世界の人々が登録できるドメイン名
.com、.net、.org、.info、.bizなど

（2）国別に割りあてられたドメイン名
.co.jp、.ne.jp、.jp、.tv、.ccなど

# 独自ドメインの取得方法

[お名前.com](https://www.onamae.com/)など、レンタルサーバ会社やドメイン管理会社で登録手続きを行います。
【Next.js】TypeScript, Tailwind CSS, Prettier, ESLint を導入したプロジェクトを開始（Webtorm）

# はじめに
``Next.js``で``TypeScript`` ``Tailwind CSS`` ``Prettier`` ``ESLint``を導入しながらプロジェクトを開始する手順です。
自分はエディタに``JETBRAINS``の``WebStorm``を使っているので``WebStorm``での設定方法も記述してます。

https://www.jetbrains.com/ja-jp/webstorm/

# Typescript が導入された Next.js プロジェクトを開始
```
yarn create next-app プロジェクト名 --typescript
```

プロジェクトのディレクトリに移動

```
cd プロジェクト名
```

# Tailwind CSS を導入

```
yarn add -D tailwindcss@latest postcss@latest autoprefixer@latest
```

```
yarn tailwindcss init -p
```

- ``tailwind.config.js``
- ``postcss.config.js``
 
が作成される。


### tailwind.config.js に JITモード と purge の設定

- ``mode: "jit",``を追加
- ``purge: []``の部分に設定を追加。
自分の場合は``src``配下で``pages``や``components``ディレクトリなどを管理したいため、下記記述を設定している。
プロジェクトのディレクトリ構成に合わせて設定する。

```tailwind.config.js
module.exports = {
  mode: "jit",
  purge: ['./src/**/*.{js,ts,jsx,tsx}'],
  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}
```

### _app.tsx を修正

``_app.tsx``の
``import '../styles/globals.css'``を
``import 'tailwindcss/tailwind.css'``に置き換える

```_app.tsx
import 'tailwindcss/tailwind.css'
import type { AppProps } from 'next/app'

function MyApp({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />
}
export default MyApp
```

# Prettier を導入

```
yarn add --dev --exact prettier
```

### WebStormで設定
![スクリーンショット 2021-08-29 8.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/e4e26074-6486-2892-efec-523a80cfed43.png)

``Apply → OK``

これでファイル``save``時に自動でコードフォーマットをしてくれる。

# Eslint　を導入

```
yarn add eslint eslint-config-prettier --dev
```

### WebStormで設定
![スクリーンショット 2021-08-29 9.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/e0aa1d80-ecc9-42ee-4f3f-24e286366898.png)

``Apply → OK``

これでファイル``save``時にリントが実行される。

# 参考
ありがとうございました！

- https://nextjs.org/docs/basic-features/typescript
- https://tailwindcss.com/docs/guides/nextjs
- https://qiita.com/sena-anny/items/a1ae73dc95e6f8af33ee
- https://qiita.com/shinshin86/items/c8b1f6b22b1bef3074c7
- https://qiita.com/soarflat/items/06377f3b96964964a65d
[02] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ (クライアント側)

|本シリーズのトップページ|
|:--|
|[[シリーズ 全2回] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ](https://qiita.com/robozushi10/items/d0f8a23de127658fc1a9)|

# 概要

Kubernetes (k8s) の動的プロビジョニングの動作確認のために、
下表の通り PC 2台を準備して、オンプレ上に NFS を構築した.

本記事では [「[01]」](https://qiita.com/robozushi10/items/d0ac81161b576104e1ca) で構築した NFSサーバに対する
**クライアント側のセットアップ手順** について記す.


|No|用途|k8sノード名|形態|IP|OS|NIC|備考|
|:--|:--|:--|:--|:--|:--|:--|:--|
|1|k8sマスタ|PC1|物理ホスト|192.168.10.115|Ubuntu18.04|eno1|NFSサーバ にする|
|2|k8sノード|node01|物理ホスト|192.168.10.84|Ubuntu18.04|eno1|<font color="cc0000">NFSクライアントにする</font>|


# 参考にしたサイトおよび書籍

|URL|備考|
|:--|:--|
|https://www.server-world.info/query?os=Ubuntu_20.04&p=nfs&f=1||
|[15Stepで習得 Dockerから入るKubernetes](http://www.ric.co.jp/book/contents/book_1161.html)|K8s だけでなく、Ansible, Vagrant, GlusterFS のことなども学べる.|
|https://github.com/takara9/vagrant-k8s|[『15Stepで習得 Dockerから入るKubernetes』](http://www.ric.co.jp/book/contents/book_1161.html)の著者が公開されている GitHub.<br/>Vagrant や Ansible コードを公開してくださっている.|
|https://github.com/takara9/vagrant-kubernetes|同上|
|https://github.com/takara9/codes_for_lessons|同上|


# 環境

## 物理ホスト

```bash
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

# 手順

## 1. No 1 の 物理PC に 「nfs-common」パッケージをインストールする

|No|用途|k8sノード名|形態|IP|OS|NIC|備考|
|:--|:--|:--|:--|:--|:--|:--|:--|
|2|k8sノード|node01|物理ホスト|192.168.10.84|Ubuntu18.04|eno1|<font color="cc0000">NFSクライアントにする</font>|

```bash
$ sudo apt install nfs-common -y
```

## 2. 上記 1 でインストールした NFSクライアントのセットアップをする

### 2-1. NFSクライアント上にマウントポイント「/mnt/nfs/」を作る

```bash
$ sudo mkdir -p /mnt/nfs
```

### 2-2. NFSサーバが公開するディレクトリをマウントする

NFSサーバ (192.168.10.115) が公開する /export/nfs をマウントする.

```bash
$ sudo mount -v 192.168.10.115:/export/nfs /mnt/nfs
```
　
　

以上.
不正アクセス禁止法とは?(ITパスポート)

# 不正アクセス禁止法
* 不正アクセス禁止法の対象となる行為4つ
 * なりすまし
 * 不正に他人のIDやパスワードの取得
 * 許可なく他人のIDやパスワードを教えること
 * セキュリティホールからの侵入
[01] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ (サーバ側)

|本シリーズのトップページ|
|:--|
|[[シリーズ 全2回] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ](https://qiita.com/robozushi10/items/d0f8a23de127658fc1a9)|

# 概要

Kubernetes (k8s) の動的プロビジョニングの動作確認のために、
下表の通り PC 2台を準備して、オンプレ上に NFS を構築した.

本記事では NFSサーバ側のセットアップ手順を記す.

|No|用途|k8sノード名|形態|IP|OS|NIC|備考|
|:--|:--|:--|:--|:--|:--|:--|:--|
|1|k8sマスタ|PC1|物理ホスト|192.168.10.115|Ubuntu18.04|eno1|<font color="cc0000">NFSサーバ にする</font>|
|2|k8sノード|node01|物理ホスト|192.168.10.84|Ubuntu18.04|eno1|NFSクライアントにする|



# 参考にしたサイトおよび書籍

|URL|備考|
|:--|:--|
|https://www.server-world.info/query?os=Ubuntu_20.04&p=nfs&f=1||
|[15Stepで習得 Dockerから入るKubernetes](http://www.ric.co.jp/book/contents/book_1161.html)|K8s だけでなく、Ansible, Vagrant, GlusterFS のことなども学べる.|
|https://github.com/takara9/vagrant-k8s|[『15Stepで習得 Dockerから入るKubernetes』](http://www.ric.co.jp/book/contents/book_1161.html)の著者が公開されている GitHub.<br/>Vagrant や Ansible コードを公開してくださっている.|
|https://github.com/takara9/vagrant-kubernetes|同上|
|https://github.com/takara9/codes_for_lessons|同上|


# 環境

## 物理ホスト

```bash
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

# 手順

## 1. No 1 の 物理PC に NFS サーバをインストールする

|No|用途|k8sノード名|形態|IP|OS|NIC|備考|
|:--|:--|:--|:--|:--|:--|:--|:--|
|1|k8sマスタ|PC1|物理ホスト|192.168.10.115|Ubuntu18.04|eno1|<font color="cc0000">NFSサーバ にする</font>|

```bash
$ sudo apt install -y nfs-kernel-server
```

## 2. 1 でインストールした NFSサーバのセットアップをする

### 2-1. /etc/exports に公開先を記す

次の設定をする.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/1f8b938b-2e54-27e9-82f5-caa109435e44.png)

```bash
/export   192.168.10.0/16(rw,fsid=0,insecure,no_subtree_check,async) 172.24.20.0/24(rw,fsid=0,insecure,no_subtree_check,async)
```

### 2-2. 公開ディレクトリ「/export/nfs」を作成する

```bash
$ sudo mkdir /export/nfs
```

(検証用なので) クライアント側は誰でも書き込みできるようにしておく

```bash
$ sudo chmod -R 777 /export/nfs
```

### 2-3. NFSサーバを再起動させる

上述の設定を有効にする. 

```bash
$ sudo systemctl restart nfs-server
```

### 2-4. 「/export」が公開されたことを確認する

```bash
$ sudo exportfs
/export           192.168.10.0/16
/export           172.24.20.0/24
```
```bash
$ sudo exportfs -v
/export           192.168.10.0/16(rw,async,wdelay,insecure,root_squash,no_subtree_check,fsid=0,sec=sys,rw,insecure,root_squash,no_all_squash)
/export           172.24.20.0/24(rw,async,wdelay,insecure,root_squash,no_subtree_check,fsid=0,sec=sys,rw,insecure,root_squash,no_all_squash)
```
　 
以上
受験談 AWS Certified Solutions Architect – Associate 認定

# SAA-C02　一発合格へ

スコア780点でしたが・・。よし!

業務での経験はほとんどないレベルの自分が言えるのは、Udemyで手を動かして、知識をインプットして、模擬試験をひたすら繰り返して、Googleスプレッドシートへ。これです。

# 勉強時間

実際に試験を受けたのは8/26。
勉強を開始したのは１ヶ月前の7/28でした。
8月のうちにはダメ元でも1回受験しようと思ってたので、とりあえず勉強開始。

平日は朝1時間、夜1、2時間。
土日祝は休憩を挟みつつ時間がとれるようであれば2時間x2,3回でMAX6時間程度。
個人的に2時間くらいが一度にまとまって勉強できる限界です。そのまとまった単位をどう当て込んでいくか？というように、自分の集中できる状態を知ることも試験勉強においては大切かなと。

平日20日:1、2時間x20=40時間
土日祝9日：4時間ほどとしてx9日=36時間


結果的にですが合計80時間弱となりました。
勉強時間はこれくらいやれば良い！というのはないので、一度この状態ならもしかしていけるかも？と思ったら、早めに受験しちゃうと良いです。特に年に1、2回しかないような試験ではありませんし、いつまでも勉強していてもキリがないので。

とりえあず1回受けて手応えを見てから2回目でとも思っていたので、ラッキーといえばラッキーでした。ただ、本番解きながら確実に正解だと思えたのは半分くらいの手応えでした。どの問題を間違えていたのかを知りたい・・

# 受験前のAWS経験

Dynamo、Lambda、S3　は限定的に何となく触れるくらい。
CloudFront、Route53 も初期設定を以前にしたことがあるが詳しくはわかっていない。
CloudWatch、CloudWatchLogsとかどう違うの？
Lambdaのスペルってmdbあたりの順番をいつも忘れるレベル・・・w
インフラ業務での構築経験も特になし。

# 勉強に使ったもの

参考書は一切使用せず。
色々とネットとかで受験者の方の合格談等を見たり調べている中で、書籍はあまり頼りにならないと判断しました。

特に業務での経験がガッツリあったわけでもないので、まずは頻出のものをとにかく手を動かそうと思いUdemy一本に絞りました。全4講座をセール期間で購入。
試験の合格に照準を絞っていたので、ブラックベルトも特に活用していません。

##### 【AWS初心者向け】手を動かして身につける！ 実戦で役立つAWSサービスの基礎とアーキテクチャ(SAAレベル)

https://www.udemy.com/course/aws-beginner-lecture-and-handson/


これを一番最初に受講しましたが、個人的にはめっちゃよかった。
VPC、EC2、RDS、ELBなどは全くよくわかっていなかったので、全体のアーキテクチャを理解する上でもわかりやすかった。AWSのサービスを全く触ったことがない人は、多分これを最初にやるといきなり挫折してしまうことはないと思う。

基本Udemyは全て2倍速ですね。等倍速だと時間かかるからもったいないのと、2倍速でも十分ついていけます。

##### これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）

https://www.udemy.com/course/aws-associate/

次はこれです。「これだけでOK!」とありますが、きっとこれだけでは足りないです笑
ただ、試験範囲に関しては「これだけで」網羅していると思うので、ここで出てきたキーワードや内容を確実に理解して、色々な問題パターンに回答できれば「これだけでOK!」だと思います。

最後に本番と同じ形式の模擬試験が2つついてます（65問130分）。
レベルとしては本番より簡単だと思います。1回目のチャレンジでは2つとも60％程度の正解率でしたが、2回目で80%近くの状態になってました。ここは実際の合格ラインである72%は超えておきたいところです。

##### AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）

https://www.udemy.com/course/aws-uoyc/

次にこれ。全部で３００問の選りすぐりの問題が集まってます。
ここで一度挫折しました笑
300問を全部やりきるのがしんどいですw
なので毎日少しずつ解いていくスタイルで最初は進めました。ただ、試験1週間前には丸2日かけて一気に300問に再度チャレンジして、そこで間違えたものや怪しいものはとにかくスプレッドシートに書き出しておいて、最後の総復習で見直すことに。


##### 【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）

https://www.udemy.com/course/aws-knan/

最後にこれです。
模擬試験が6回分ついてます。
講座説明にも記載がありましたが、やや難易度的にも高め？に設定されており、この模擬試験で72%の正解率に達していなくても本試験は合格できるともあります。実際、この模擬試験も6回分を2周しましたが、最終的に7割をギリギリ超えるか超えないかくらいでした。


# ここまでやって

上記を通して自分が苦手な部分がようやく整理できた感じでした。
書き出したスプレッドシートをひたすら復習して、理解が浅いところはググったりして知識の定着をはかった感じです。

他にも2つほどUdemyで購入していたのですが、不要でしたね。セールのうちにとりあえず買っておこうと思って買いましたが、ぶっちゃけ上記だけで十分すぎるほどです。自分の場合、他の参考書や教材は特に不要でした。SAA関係の教材やサイトは多いので、とにかく早い段階で絞り込むことが大切かなと思います。個人的なオススメは、上記をひたすら繰り返し繰り返し、深掘りするときや理解ができない時はググってスプレッドシートへまとめる。これです。
AWS公式の模擬試験も2,000円で受けられますが、結果が合格ラインに達してないとショックを受けると思ったので受けませんでした。だったらもうぶっつけ本番で！


# その他・感想

試験の申し込みや実際の当日のフローが何だか心配でした。
いまいちわかりにくいのであらかじめ手続き等はよく確認しておいた方が良いです。
会場で受験しましたが、30分前くらいに着いたら「もういつでもいいですよ」 と言われ、気持ちを落ち着けてからちょっと早めに試験開始することに笑
身分証は運転免許書と保険証（写真付き1つともう1つ）を受付で見せて、受付で写真撮影がありました。15時に受けましたが、朝に最後の弱点をとりあえず暗記・復習しまくってという感じです。自分の頭が一番冴えているであろう時間なども考慮して受験することをオススメします。仕事終わりとか無理・・。

Udemyの模擬問題や画面に見慣れていたためか、本番でのフォントや文字のサイズ等に最初少し違和感を覚えました。すぐに慣れましたがそんなこともあったので、いかに心身ともにベストコンディションを整えられるかも大切ですね。

# デジタルバッジ

https://www.credly.com/users/h2m_kinoko/badges
【Unity】好きな補間関数で追従するカメラ

# はじめに

ネットで調べても意外にもヒットしなかったのでとりあえず作ってみた。
なんかかなり行き当たりばったりで作ったので、色々雑です。
本当は追従対象が動いている時は別で処理をすべきでなんですが、まあなんか面倒なので更新されたベクトルを使って
適当に補間させてます。よくない。

あと例によって私は素人です。

# ソース

```C#

using UnityEngine;

namespace MyTool
{
    public class FollowUpCamera : MonoBehaviour
    {
        [SerializeField] GameObject _mainCamera;
        [SerializeField] GameObject _target;
        [SerializeField] AnimationCurve _animationCurve;
        [SerializeField] float _followUpTime = 3.0f;
        private float _elapsedTime;
        private Vector3 _relativeFollowingPosition;
        private Vector3 _currentTargetPosition;
        private Vector3 _currentCameraPosition;
        void Awake()
        {
            _relativeFollowingPosition = _mainCamera.transform.position - _target.transform.position;
            _currentTargetPosition = _target.transform.position;
            _currentCameraPosition = _mainCamera.transform.position;
        }
        void LateUpdate()
        {
            //動いているときだけ更新する
            if(_currentTargetPosition!=_target.transform.position)
            {
                _currentTargetPosition = _target.transform.position;
                _currentCameraPosition = _mainCamera.transform.position;
                _elapsedTime = 0f;
            }

            _elapsedTime += Time.deltaTime;
            _mainCamera.transform.position 
            = Vector3.Lerp(_currentCameraPosition, _currentTargetPosition + _relativeFollowingPosition, InterpolationFunction(_elapsedTime/_followUpTime));
        }
        private float InterpolationFunction(float rate)
        {
            return _animationCurve.Evaluate(rate);
        }
    }
}

```

_followUpTime秒で補間されます。
別に真新しいことはしていないです。補間関数にAnimationCurveを指定しているというだけです。
ぐにゃぐにゃな関数を指定するとぐにゃぐにゃ動きます。

# 独り言

巷じゃ、カメラが滑らかに追従するテンプレが出回ってるとおもうんですが、あれってどうなんだろう（今更）
なんか、Lerpの引数が毎フレーム変わるのって出力が明示的じゃないからあんまよくない気がする。
でもいい感じに動くのは確か。
SwiftUIのボタンで少し凝ったハイライト表現をするには？

### ButtonStyleによるハイライト表現

SwiftUI においてボタンのタップ中のハイライト表現をしたい場合、`ButtonStyle` を作り、`configuration.isPressed` によってハイライト時の見た目に変更します。以下の例ですと、タップ中はボタンの背景色が変わるようになっています。

![Aug-29-2021 07-52-00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/c45d6d21-738d-1891-20bb-d9fce373a542.gif)

```swift
struct CustomButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .padding()
            .foregroundColor(Color.white)
            // タップ中かどうかで背景色を変更する
            .background(configuration.isPressed ? Color.red : Color.blue)
            .cornerRadius(4)
    }
}

Button(action: {}, label: { Text("Button") })
    // 作ったボタンスタイルを適用する
    .buttonStyle(CustomButtonStyle())
```

### 少し凝ったハイライト表現をするには？

しかし、タップ中かどうかによってボタンの見た目を大胆に変えたい場合、上記のような `ButtonStyle` による方法だと限界があります。そこで、次のような感じでタップ中かどうかによってボタンの `label` を簡単に変更できるボタンコンポーネントを作ってみました。


```swift
HighlightableButton(
    action: {
        // Nothing to do.
    }, label: { configuration in
        CharacterView(character: .wolverine, isPressed: configuration.isPressed)
    })
```

`isPressed` の値によって View の中身を自由自在に変更できるので、こんな凝ったハイライト表示も実現できてしまいます。[MARVEL API](https://developer.marvel.com) を使って SwiftUI の勉強中だったので、こんなこともしてみたくなってしまいました。

![Aug-29-2021 08-02-29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/76760212-e931-6ecd-271c-e4e9b1169800.gif)

今回作った `HighlightableButton` は次のように内部で `ButtonStyle` を使いつつ、`label` については外部から設定できるようにしています。`NavigationLink` 版もありますよ。

```swift
import SwiftUI

struct HighlightableButton<Label>: View where Label: View {
    private let action: () -> Void
    private let label: (ButtonStyleConfiguration) -> Label

    init(action: @escaping () -> Void, @ViewBuilder label: @escaping (ButtonStyleConfiguration) -> Label) {
        self.label = label
        self.action = action
    }

    var body: some View {
        Button(action: action, label: {})
            .buttonStyle(HighlightableButtonStyle { config in
                label(config)
            })
    }
}

struct HighlightableNavigationLink<Label, Destination>: View where Label: View, Destination: View {
    private let destination: () -> Destination
    private let label: (ButtonStyleConfiguration) -> Label

    init(destination: @escaping () -> Destination, @ViewBuilder label: @escaping (ButtonStyleConfiguration) -> Label) {
        self.destination = destination
        self.label = label
    }

    var body: some View {
        NavigationLink(destination: destination, label: {})
            .buttonStyle(HighlightableButtonStyle { config in
                label(config)
            })
    }
}

private struct HighlightableButtonStyle<Label>: ButtonStyle where Label: View {
    private var label: (ButtonStyleConfiguration) -> Label

    init(@ViewBuilder label: @escaping (ButtonStyleConfiguration) -> Label) {
        self.label = label
    }

    func makeBody(configuration: Configuration) -> some View {
        label(configuration)
    }
}
```
【Ruby on Rails】Rate.jsを使ったときに星が増えるバグの解消法（jQuery）


#対象者

* レビュー評価を実装している方
* 星が増える不具合を実装している方

![スクリーンショット 2021-08-29 7.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/c2c3092d-870d-e1b9-087e-2120ef2c21b6.png)


#目的

* 星が増える不具合を解消して、星を5個で収める

#実際の手順と実例
###1.結論（解決策）

**scriptタグに$('').empty();を追加すればOK！**

下記例です
div.rateの部分は人によって違うと思います。

```
    <script>
      $(document).on("turbolinks:load", function() {
      $('div.rate').empty();　#これを追加しました
      $('div.rate').raty({
          size: 14,
          starOff:  '<%= asset_path('star-off.png') %>',
          starOn : '<%= asset_path('star-on.png') %>',
          starHalf: '<%= asset_path('star-half.png') %>',
          half: true,
          readOnly: true,
        });
      });
    </script>
```


###2.原因

1. 星の表示されてるページから
2. 他のページへ遷移
3. その後、再度星が表示されているページへ

この間に星が削除されていない（保存されたまま？？）のが原因みたいです。


###3..emptyメソッドについて

下記記事によると

>jQueryオブジェクトで指定した要素の内容（子孫要素やテキストなど）を削除します。jQueryオブジェクトで指定した要素は削除しません。

とありました。

つまり、
ページ再読み込み時に

1. まず子要素である"div.rate"を.emptyで削除
2. その後、.rateで星を表示

となって星５個の表示が保たれています。



#参照

>[emptyメソッド - 初心者向けのjQuery入門講座](https://www.jquerystudy.info/reference/manipulation/empty.html)


####投稿者コメント

今回は「どのような流れでそうなったか」という点に重きを置いて記事を書いてみました。次回以降の投稿でもどのような手順でそうなったかを曖昧にさせないように理解しながら書いていきたいと思います。

星が増えるとなんか笑っちゃいますよね。笑


####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
G-cluster 殻割り指南

G-cluster.
![IMG_20210829_070619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c83367f5-d89e-5e3d-fcce-91ae5fe5ed85.jpeg)

G-cluster を殻割りして基板にアクセスしよう！
TTLシリアル信号を取り出すとHackがカンタンに！
でも殻割りするのがちょっと難しいかな。

ツメが噛み合っているのですが、この位置からアプローチするのがやりやすいです。
勘合はこのようになっていますので、角のツメを解除します。
![IMG_20210829_070548.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0815c571-54ef-f3dd-c945-5e4811040d9b.jpeg)


まずは、この位置にカッターの刃などを差し込んで隙間をこじ開けます。
![IMG_20210829_070802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c75881a6-e5ab-c099-0775-31a0adb1e7bd.jpeg)


次にコネクタの間にカッターの歯を差し込んで2番目のツメを解除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4f75629b-1dfe-1b97-2af2-7750af556c08.png)


側面を開いていきます
![IMG_20210829_070924.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2c647294-d74d-633c-d164-54aa2c220037.jpeg)

半分ぐらいまで開いたら、手で力をかけると左側面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/79ef697b-279b-3129-2857-0a5c501288ac.png)

手で力をかけると3方が開きます。この状態から全開できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1f241be0-8a03-9fdd-de58-4a5dca703495.png)

殻割り完了。(既にピン立てしています。)
![IMG_20210829_071027.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ed5c0cca-031f-40d6-4bdf-118de5f0b50e.jpeg)
【iOS】Metal Best Practicesの解説（7） 画面スケール

[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS／MacOS／tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。

本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。
読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。
また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。

他の記事の一覧は、初回記事よりご覧下さい。

https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4

### [Native Screen Scale (iOS and tvOS) (画面スケール)](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/NativeScreenScale.html#//apple_ref/doc/uid/TP40016642-CH8-SW1)

ベストプラクティス： ターゲットディスプレイの正確なピクセルサイズでドローアブルをレンダリングします。

不要なレンダリングや、テクスチャーサンプリングによるパフォーマンス低下を避けるために、ドローアブルのピクセルサイズはデバイスの物理的なピクセルサイズと同じにしましょう、という話です。

前提として、iOSにおいては、画面の描画のサイズは基本的にポイント単位で指定しますが、Metalではピクセル単位で指定するということがあります。

そのため、ドローアブルのピクセルサイズを計算するためには、UIScreenのプロパティから、ネイティブの画面サイズをnativeBoundsから、スケールファクター（1ポイントが何ピクセルに対応するか)をnativeScaleから取得する必要があります。

なお、MTKViewを用いた場合、ドロアーブルのサイズはビューのサイズと常に一致することが保証されるので、このあたりの計算を自分でする必要はありません。

### 結論

ドローアブルの領域が広ければ、レンダリングに時間がかかることは自明なので、まぁそうだろうなというところです。自明なことなので、今回は、サンプルコードを作って試していません。

軽く手元で試してみた限りでは、同じ1000x1000の画像を1000x1000のドローアブルに描画するのと、2000x2000のドローアブルに描画する（余った領域は空白になる）のでは、やはり1000x1000の方が高速に描画していました。

### 最後に

iOSを使った3D処理やAR、ML、音声処理などの作品やサンプル、技術情報を発信しています。
作品ができたらTwitterで発信していきますのでフォローをお願いします🙏

Twitterは作品や記事のリンクを貼っています。
https://twitter.com/jugemjugemjugem

Qiitaは、iOS開発、とくにARや機械学習、グラフィックス処理、音声処理について発信しています。
https://qiita.com/TokyoYoshida

Noteでは、連載記事を書いています。
https://note.com/tokyoyoshida

Zennは機械学習が多めです。
https://zenn.dev/tokyoyoshida
raspberryの初期設定とpybluez/bluezによる送受信実装

#はじめに
bluetoothデバイスとデータをやり取りするにあたり、raspberrypiのOSインストールとbluezの設定をまとめました。記事の寄せ集めですが、今からraspberrybluez環境を立ち上げる方の参考になれば幸いです。


#初期設定

* raspberrypiのOSインストール
 
　[本家ページ](https://www.raspberrypi.org/software/)にアクセスし、dmgファイルをダウンロードし誘導通りにインストールする。ただし、自分の環境ではssh設定関連が足りなかった。また、python3環境が必要であるため、3.7環境に切り替えた

 （参考ページ）[Zumi Blog](https://www.zumid.net/entry/raspberrypi-smarthome-os-install/) 
 （参考ページ）[Raspberry Pi Zero(W, WH)のセットアップ](https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573)：sshの設定関連
 （参考ページ）[「SSHホスト鍵が変わってるよ！」と怒られたときの対処](https://qiita.com/hnw/items/0eeee62ce403b8d6a23c)：学生時にも怒られた記憶あり
 （参考ページ）[Pythonバージョンを 2系 から 3系 に切り替える](https://qiita.com/nagase/items/029e8fab5d783bbf2743)：python環境を3.7系に切り替え

* bluetooth関連の作業
 * bluetoothがコマンドで動作することを確認  
 （参考ページ）[Raspberry Pi Zero WでBluetooth経由でシリアル通信（ペアリングまで）](http://blog.robotakao.jp/blog-entry-130.html)
 * 実行に必要なモジュールは既に入っていることが動作確認で分かったため、bluetoothをpythonで操作する開発環境として、pybluezを試すことにした。  
 （参考ページ）[通信規格理解の記事一覧](https://www.musen-connect.co.jp/category/blog/course/trial-production/)：非常にわかりやすかった  
 （参考ページ）[adafruit](https://learn.adafruit.com/install-bluez-on-the-raspberry-pi/installation)：資料は古いがわかりやすい  
 （参考ページ）[Raspberry Pi 3 のbluezを更新 5.23 -> 5.44](https://fishingiot.blogspot.com/2017/05/raspberry-pi-3-bluez-523-544.html)：綺麗にまとまっている  
 （参考ページ）[D-Bus のはなし](http://www.silex.jp/blog/wireless/2017/01/d-bus.html)：D-Busとは何かが記載されているページ  
 （参考ページ）[bluez](http://www.bluez.org)：本家  
 （参考ページ）[BlueZのAPI/サンプルコードのメモ](https://qiita.com/ffmatsu/items/b7ca6a944b5a1ea9c7a6)：pybluezでできないことを階層を下げて実行する場合に必要  
 （参考ページ）[pybluez](https://pybluez.readthedocs.io/en/latest/index.html)：本家  
 （参考ページ）[M5StackでBLE環境センサー端末を作る](https://ambidata.io/samples/m5stack/m5stack_ble_sensor/)：Ambientさんの送信系  
 （参考ページ）[BLE環境センサー・ゲートウェイ(Raspberry Pi編)](https://ambidata.io/samples/temphumid/ble_gw/)：Ambientさんの受信系  
 * bluez及びpybluezのインストールで参考にしたページ  
 （参考ページ）[Check! Raspberry Pi で Bluetooth 経由のセンサーデータを取得する 〜 準備編](https://qiita.com/dz_/items/4e858e4d50db19b57491)：非常に役に立ちました
 * インストール中にアボートした際にdmesgして、OutOfMemoryを確認してswap領域変更  
 （参考ページ）[Raspberry Pi のスワップ領域拡張](https://qiita.com/nyas/items/f4d0675061ee8cdcc3e7)
 * pipのインストール  
 （参考ページ）[RaspberryPi(Raspbian)にpipをインストール](https://turtlechan.hatenablog.com/entry/2019/06/07/191450)

#作業判断 
作業にあたり以下の判断をしている

* 仮想環境は用いない（パス関係がややこしくなるため）   
　特に、raspberrypiでは、apt-getを基本にしており、pipインストールをして欲しくないようである（おそらく、dpkg -l の範囲外でユーザ権限でパッケージをダウンロードさせたくない）。そのため、もし、pipを使う場合には仮想環境を立ち上げることを基本にしているようであるが、パス指定が面倒になるため、敢えて仮想環境は使用しない（目的が限られており、特に影響はないと考える）。
* bluez/pybluezを使用した  
　bluezで作られた実行ファイルがraspberrypiにはプリインストールされており、bluezを使用するpybluezを使用するのが良いと判断した
顧客が本当に必要だったもの (Tree Swing Cartoon)

「顧客が本当に必要だったもの」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/26aad63e-b909-6ec3-1304-09a5db8b41b6.png)

https://dic.nicovideo.jp/a/%E9%A1%A7%E5%AE%A2%E3%81%8C%E6%9C%AC%E5%BD%93%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE

画像はリンクより引用。元ネタはもちろん英語なのだが英語では「顧客が本当に必要だったもの」ではなくて何と呼ばれているのかで迷ったのでその答え。(What customers want とかではない)

## Tree swing cartoon

"Tree swing cartoon" という。

https://www.businessballs.com/amusement-stress-relief/tree-swing-cartoons-new-versions/

は冒頭のリンクにも紹介されているページ。以下はWikipedia。

https://en.wikipedia.org/wiki/Tree_swing_cartoon

(ざっくりとした翻訳)

> Tree Swing Cartoon とは、製品開発における分業のコミュニケーションの落とし穴を説明するためのユーモラスな図解である。 木に取り付けられたタイヤのブランコを各部門がどのように実装・表現しているか、そしてそれが顧客の意図したものとどのように異なっているかを描いている。また、ソフトウェア開発のウォーターフォールモデルの説明にも使われている。

> この漫画の起源は少なくとも60年代後半、あるいはそれ以前と思われるが、オリジナルの日付と作者は現在のところ不明であり、正確なオリジナルの形も不明である。 多くのバリエーションが、後に教育、ソフトウェア工学、マネジメントに関するいくつかの書籍に登場している。

## まとめ

**英語圏の「顧客が本当に必要だったもの」情報をググりたいときは "Tree Swing Cartoon" または "Tree Swing"**。あるいは "How Project Really Work"、という呼ばれ方をすることもある。

https://www.psychoscape.net/linux/2007/20070204.html

https://medium.com/@thx2001r/the-project-cartoon-root-cause-5e82e404ec8a


以上参考情報でした。
完全版）初心者向け Pythonanywhereを使ってみよう

###初心者向け Pythonanywhereを使ってみようで書き忘れてたこと
先に投稿したPythonanywhereの使い方で、「Database」の設定方法について書くのを忘れてたので、追加します。

先にこちらをどうぞ。今回はこいつに対する追加です。
<a href='https://qiita.com/tonytani37/items/60c7185b7cc235f45daf'>初心者向け Pythonanywhereを使ってみよう</a>

###データベースはMySQL
PythonanywhereではMySQLが無料で提供されます。PostgrSQLは別途有料です。HerokuではPostgreSQLイチ推しっぽかったけど、こちらはMySQL推しみたいです。
では設定画面を見てみましょう。
![Screenshot 2021-08-29 at 04-33-51 Database Settings PythonAnywhere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739706/099be06f-b680-f076-bd4f-3412a3b0eefc.png)
「Database」へ飛ぶとこんな画面が表示されます。すでにいくつかのデータベースが設定されていますが、作成は超カンタンです

項目の三つ目にあるCreate a databaseで名前を入力してCreateボタンを押すだけです。
データベース名は入力した名前の頭に'ユーザ名'+$がつけられます。たとえばユーザ名がtestでtestdbという名前を指定したとするとデータベース名は
```
test$testdb
```
になります。Setting.pyの指定はこの名前になります。（間違って自分が指定した名前だけをSetting.pyに指定するとつながりません。Setting.pyには画面表示されているデータベース名をそのままコピペしましょう）

次に一番下のMySQL passwordに好みのパスワード入力します。こちらもSetting.pyのデータベース定義で使いますので忘れないようにしましょう。ちなみに複数のデータベースを設定しても、パスワードはこちらで設定したものが共通で使われます。別々のものにしたいとか言う場合には、MySQLに直接接続（Your databasesにあるデータベース名をクリックすると当該のMySQLに接続できます）して個別に変更できるかもしれませんが、やったことありません。やりたいひとは試してみて、うまく言ったらその情報を広く展開して下さい。

以上　MySQLの設定はおしまいです。次はデータベース接続のためにSetting.pyにその情報を転記しなければならないので、項目の一番上にあるConnectingのデータベースのホストアドレスや名前をメモしときましょう。（実際にはブラウザの別タブで表示しといてコピペするんでしょうけど、メモすることは大切）

###Setting.pyのデータベース定義
![スクリーンショット 2021-08-29 4.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739706/3650a72f-6ba5-df9f-88ae-6a87c1d2202c.png)
(DEBUGモードでデータベースを切り替える仕掛けをしてますが、気にしないで下さい）

データベースに接続するためにSetting.pyで定義します。やり方で特に注意点はありませんが、migrateするとき（だったと思う）にワーニングっぽいメッセージがでるので、オプションに以下の内容を追加するとそいつは収まります。なお接続ポートの指定は不要のようです。なくても繋がります。

```
 'OPTIONS': {
    'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
  },
```

ちなみにMySQLに接続するためにmysqlclientを事前にインストールしておく必要がありますが、そのまえにCコンパイラをインストールしとかないとエラーになるのはご承知の通り。

Linuxについてほとんど知識を持ってないわたしがCコンパイラのインストール方法について色々とググってみた結果、見つけたのが以下のコマンドです。こいつを「Console」から実行したあとにmysqlclientをインストールすればうまくいくはず。

```
apt-get -y install gcc libmariadb-dev
```
（うまくいかなかったら、泣きながらLinux関連の情報をググって探してみて下さい）

あとは気合だ、みんな頑張れ。

現場からは以上です。
[WIP] GIT 基本操作

# 概要
GITの基本操作について纏めます。

# ブランチ元のソースをブランチ先に取り込む
1. git checkout ブランチ元
1. git fetch
1. git pull origin ブランチ元
1. git checkout ブランチ先
1. git merge ブランチ元
1. ※コンフリクトした場合
    1. 修正
    1. git add 対象ファイル
    1. git commit
    1. git push origin ブランチ先

修正ファイルを一旦置き最新コードを取得。再度修正ファイルを取り込む
1. git stash
1. git pull origin ブランチ元
1. git stash pop
[WIP] Java テストコード

# 概要
Javaのテストコードの基本について纏めます。

# テストコード考え方
* 取れない値はモックを用意 (例：API,DBなど）
* Boolを返すファンクションに対して何も値をセットしない場合falseを返す
* モックで値がなんでも良い場合any()を利用
* targetsで実際のファンクションをコール
[WIP] IntelliJ IDEA 便利機能 for Mac

# 概要
IntelliJ IDEA 便利機能について纏めます。

# ショートカットキー
**import**
- option + enter

**複数行コメントアウト**
- コメントアウト該当行を選択 → Command + /

**ファイルに移動**
shift + shift → 開いたウィンドウに移動したいファイルパスを入力　→ Enter

**ファイルのフォーマット**
Command + option + l
Githubへのtokenを使ったアクセス

## はじめに

Githubでホスティングしているリポジトリへのアクセスがhttpsになってusername/passwordでの操作ができなくなっていたので。
Personal access tokensを使ったアクセスの方法を備忘録として残す。

### 環境

* macOS Catalina (10.15.6)
* git version 2.24.3 (Apple Git-128)

## Personal access tokens取得

[個人アクセストークンを使用する](https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)にかかれている通り。

1. Githubにログインして、[Settings / Developer settings](https://github.com/settings/tokens)を開く。  
2. 左にあるツリーから「Personal access tokens」を選択してトークンを生成する。　　
生成されたトークンはこのときしかわからないので、ちゃんとメモしておく。

## 認証情報をキャッシュ

[Git に GitHub の認証情報をキャッシュする](https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/caching-your-github-credentials-in-git)にかかれている通り。

### 1. osxkeychainの確認

```
$ git credential-osxkeychain
usage: git credential-osxkeychain <get|store|erase>
```

usageが表示されていればOK。

### 2. Git (CLI)でosxkeychainを使う

```
$ git config --global credential.helper osxkeychain
```

Gitを使うとき、キーチェーンに保存された資格情報が参照される。

### 3. 認証情報の保存

※自分はキーチェーンに（以前の）資格情報は保存していなかったので、下記コマンドで保存した。　　
　残っていた場合は削除またはエントリを更新する。

```
git credential-osxkeychain store
host=github.com
protocol=https
username=`{githubのアカウント}`
password=`{先に取得したトークン}`

```

最後に空行を入れることで保存される。

もしくは自分のリポジトリをcloneすることで、ユーザ/パスワードを聞かれるので、そこで入力（保存）も可能。