OmniAICreator/Qiita-1.07M huggingface dataset:
Xplenty : Google BigQueryコネクタに関する疑問点まとめ



#Xplentyのコネクターでプレビュー時のGoogle BigQueryへの課金について
- **アクセスモード Table**: Xplenty側のコネクタでSource tableを指定し、プレビューした場合、課金されません。課金されないようにデータをプレビューするためにtabledata.list関数を使用しています。([ベストプラクティスはこちら](https://cloud.google.com/bigquery/docs/best-practices-costs))
- **アクセスモード クエリ**: これはカスタムクエリなので、課金されます。

#BigQueryおよびCloud Storageの認証について
Xplentyでは、現在のところBigQueryおよびCloud StorageについてはOAuthをサポートしてません。（OAuthの場合、コネクションが個人アカウントに紐づく可能性があるため、退職/異動等によって運用中のジョブが動作しなくなってしまう懸念があるため。）
そのため、Xplentyでは指定のサービスアカウントを利用いただく形となっております。（[詳細はこちら](https://www.xplenty.com/docs/allowing-xplenty-access-to-my-google-bigquery-dataset/)）

#BigQueryからデータを抽出する際にユーザー側で発生する費用は？
- BigQueryへのクエリ実行（プレビュー除く）:ユーザー側のGCP環境へ**課金**
- クエリ結果をXplenty側のGCSへエクスポート(BigQuery→GCS): **無料**
- Xplenty側のGCSからXplenty AWSへ転送: **無料（Xplenty負担）**
OpenFoamインストール

#OpenFOAMのインストール手順
公式HPの手順で行う。
https://openfoam.org/download/8-ubuntu/

```
sudo sh -c "wget -O - https://dl.openfoam.org/gpg.key | apt-key add -"
sudo add-apt-repository http://dl.openfoam.org/ubuntu
sudo apt-get -y install openfoam8
```
これで`OpenFOAM8`と`paraviewopenfoam56としてParaView 5.6.0`がインストールされる。

#ユーザー設定
`.bashrc`ファイルを編集
`gedit ~/.bashrc`で`source /opt/openfoam8/etc/bashrc`を最下部に追記

#チュートリアル(pitzDaily)を実行

```
cd $FOAM_RUN
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
cd pitzDaily
blockMesh
simpleFoam
paraFoam
```

#Paraviewの再インストール
GPUのセッティングをする前にインストールをしたので、ParaviewがGPUを認識していなかった。(OpenGL vendorがVMwareになっていた。非常に動きが遅い)
なので`paraviewopenfoam56`をアンインストールして`paraview`をインストールし直した

```
sudo apt-get remove paraviewopenfoam56 
sudo apt install paraview
```

Paraviewを再インストールすることで、GPUが認識された。
![Paraview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210147/fbdc3077-72c7-42d9-bc10-a36efcc969aa.png)
前のバージョンでは非常にカクカクするような結果ファイルもヌルヌルと動くようになった。

##プチ問題
結果ファイルを開くとき毎回下記のダイアログが出てくる。
![Paraview start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210147/5bab4575-0418-5769-4024-5a2d461596cf.png)
`OpenFOAMReader`を選んで進めば問題ないが、いつかどうにかしたほうがいい気がする。
【Git】git push origin HEADについて

gitを使って変更をリモートリポジトリにpushするときに使えるコマンド。

```
git push origin HEAD
```
HEADとすることで、今いるブランチのorigin ＝　リモートにpushしてくれる。

わざわざ、ブランチ名を打たずに済みます。
React入門（import, export）

#import, export
Hello Reactを表示するようまでをまとめています。
下の表示がディレクトリの構成です。

```
├── src
│   ├── App.js
│   ├── contexts
│   │   └── hello.js
```

```js:App.js
import { Hello } from './contexts/hello.js';

function App() {
  return (
    <Hello />
  );
}
```

`import { Hello } from './contexts/hello.js';`
App.jsでHello関数を呼び出してretunでHello関数を表示しています。


```js:hello.js
export const Hello = () => {
  return (
    <div>Hello React</div>
  )
}
```

`hello.js`は`export `でHello関数を他のファイルでも使えるように設定しています。
dotnet script でのプログラミングメモ

# System.Net.HttpClientで同期メソッドが動かない（Linux）

Windows/Macでは特に問題なく、Linuxだと、メソッドが定義されていないとなりました

```c#
using System.Net.Http;

readonly HttpClient Client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Get, "https://qiita.com/toryuneko");
var response = Client.Send(request);
var source = response.Content.ReadAsStream();
```

このメソッドをLinux（Centos7）で実行すると

```console
error CS1061: 'HttpClient' に 'Send' の定義が含まれておらず、型 'HttpClient' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Send' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。
```

と、同期メソッドが見つからないとなる。

仕方が無いので、

```c#
using System.Net.Http;

readonly HttpClient Client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Get, "https://qiita.com/toryuneko");
var response = await Client.SendAsync(request);
var source = await response.Content.ReadAsStreamAsync();
```

とするか、`.GetAwaiter().GetResult()` を使って、待機させることにしました。
dotnet core 3.1 の環境でこうなっているのだが、WindowsとMacではVS2019/VS for Macが入ってるから、.NET5.0やらそのほかの影響で必要なライブラリでも入っちゃってるのでしょうか？

# Cronで dotnet script を動かす場合

考えないで設定してたら動かなかった。-g オプションつけたので、勝手にpath通ってると思っていた...
しかし、cronのエラーログに dotnet-scripts が入っていないと言われていたので、とりあえずインストール場所を探してみた。


特にパス指定オプションをつけず、-g オプション付きでdotnet scriptをrootでインストールした場合は、`/root/.dotnet/tools` の中にインストールされる。
そのほかの場合は、`$HOME/.dotnet/tools` になるのでPATHを追加しておくことが必要

参考: https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-tool-install
fatal: not in a git directory を解決する方法

##動作環境
* Mac M1チップ
* iterm2

##「fatal: not in a git directory」が発生
```
git config user.name 'xxx'
```
人生はじめてのGitHubとGitを使ってみようと思い、チュートリアル的な記事を読んでいました。

ユーザをセットしようとのことで、上記のコードを打ったところエラーに。

##globalを入れたら解決
```
git config --global user.name "xxx"
```
`--global`を追加したことで無事解決しました。

###ひとこと
ブログ記事にするのに短すぎるときは、Qiitaを使っていこうと思います。
キータっていうんですね、クイッタだと思ってましたすみません笑

最近はpythonを勉強しています。
[pythonのwebスクレイピングで得た値をLINEに通知する方法](https://sushiringblog.com/python-webscraping-to-line)

https://sushiringblog.com/python-webscraping-to-line

　　
以上、参考になればうれしいです。
ありがとうございました。
ggplotのfacet_wrapの個別のエリアに描画

ggplotでfacet_wrap使ってふく数枚のグラフを並べて表示させた後、それぞれのファセットに個別にgeom_***で何かを書き込みたいときのやり方。

まず、ggplotでfacet_wrapを使って描画する。
ちなみに、countdataは、ある3つ問からなる質問紙を企業に実施して得られた回答（5段階尺度）を、企業の人数規模（5段階）ごとに平均と標準偏差を求めたものを格納してる。

|変数名| 内容|
:--|:--
q|c(rep("Q1-1",5),rep("Q1-2",5),rep("Q1-3",5))として、質問番号を指定してる。
no| 人数規模（本当は1:1000人以上、2:500～999人、3:300～499人、4：100～299人、5：～99人という区分だが、長ったらしく書きたくなかったので、とりあえずc(1:5)と数字ベクトルを当てはめてる。）
Mean|平均
SD|標準偏差

まあ、要するに、こんなデータ。

q|no| Mean|SD
:--|:--|:--|:--
"Q1-1"|1|3.285714|1.1126973
"Q1-1"|2|3.400000|1.0749677
"Q1-1"|3|3.111111|0.9633818
"Q1-1"|4|3.479592 |1.0476246
"Q1-1"|5|3.245614 |1.0476246
"Q1-2"|1|2.714286 |0.4879500
"Q1-2"|2|3.200000 |0.9189366
:|:|:|:

で、まずは描画。

```r
g<-ggplot(countdata,aes(x=factor(no),y=Mean))+
  geom_bar(stat="identity",aes(fill=factor(no)))+
  geom_errorbar(aes(ymax=Mean+SD,ymin=Mean-SD),width=0.2)+
  facet_wrap(.~q)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/e79973c6-7a05-ce9c-43a5-cb670328d73e.png)


このQ1-3のエリアにだけgeom_textやgeom_segmentを使って書き込みしたい。
その準備として、以下のようなデータフレームsigを作る。

```r
sig<-data.frame(
  x=c(2,2,4),
  xend=c(2,4,4),
  y=c(4.75,6,6),
  yend=c(6,6,5.5),
  q=c("Q1-3","Q1-3","Q1-3")
)
 ```
これは、3つのセグメントを描画したいので、各変数は3つの要素で構成されているが、別に一個一個別々にgeom_segmentで描画するのでも構わない。その場合には、各変数の要素は1個でよい。
ポイントは`q`という変数。これはfacet_wrapを使うときにグループ分け用に渡す変数。これを持っておくのがポイント。

```r
g<-g+geom_segment(data=sig,aes(x=x,xend=xend,y=y,yend=yend))
```
するとこうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/173760e0-3bc5-90bc-58c3-3663a8e1ec41.png)


さらにテキストも付け加える。

```r
sig.text <- data.frame(
  x=3,
  y=6.2,
  label="P=0.078, †",
  q="Q1-3"
)
g<g+geom_text(data=sig.text,aes(x=x,y=y,label=label))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/d03b0b78-c4fc-59e6-bb4e-f116f57ed803.png)

ということで完成！

参考：
[ggplot2の個々のファセットのテキストに注釈を付ける](https://www.it-swarm.jp.net/ja/r/ggplot2%E3%81%AE%E5%80%8B%E3%80%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E6%B3%A8%E9%87%88%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B/1068113621/)

# 補筆：うっかり嵌まりそうなとこ（2021/3/19追記）
以下のようにやると、ファセット分けまではうまくいきますが、そのあとに描画を付け加える段階でエラーになります。
ポイントは`fill=factor(no)`を入れる位置。
これをggplotの最初の設定の段階でやってしまうと、
「is.factor(x)でエラー: オブジェクト 'no' がありません」
というエラーが出ます。

```r
g<-ggplot(countdata,aes(x=factor(no),y=Mean,aes(fill=factor(no))))+
  geom_bar(stat="identity")+
  geom_errorbar(aes(ymax=Mean+SD,ymin=Mean-SD),width=0.2)+
  facet_wrap(.~q)
plot(g)

g<g+geom_text(data=sig.text,aes(x=x,y=y,label=label))
plot(g)
```
あくまで、fillの設定はgeom_barの中で行う必要があります。
【Laravel】S3にファイルUP後、ファイルURLが取得できなくなった事象

ハマる人はハマるかもしれないのでメモ。

## 事象
LaravelからS3にファイルアップロード後、保存したファイルのURLが正常に取得できない事象が発生。
通常、LaravelからS3にファイルをUPする際は、以下のような形式で行うが、

```php
//ファイルアップロード(putメソッドでアップロード実行し、返り値にS3アップ後のファイル名が取得できる)
$s3_file_name = Storage::disk('s3')->put('/', $file, 'public');

//ファイルURL取得(urlメソッドの引数にS3でのファイル名を指定)
$url = Storage::disk('s3')->url($s3_file_name);
```

今回はアップロード先をルートではなく配下のuserディレクトリにしたかったので、こう書いた。


```php
// putメソッドの第一引数を'/user/'に指定
$file_name = Storage::disk('s3')->put('/user/', $file, 'public');
```
その結果、無事にアップロードはできたが、なぜかurlメソッドで取得するファイルのURLに不具合が起きてしまった。

## 原因
putメソッドの引数の最後に"/"は不要だった。
"/"をつけると、返却されるファイル名の先頭に"/"がついてしまう事象が起きる。

```php
//正常例
$s3_file_name == "9WJnNeebi.jpg"
//おかしい例
$s3_file_name == "/9WJnNeebi.jpg"
```

この存在しない"/9WJnNeebi.jpg"というファイル名を引数としてurlメソッドに渡していたため、urlメソッドの挙動もおかしくなってしまっていた。

## 対処方法
putメソッドの引数を'/user'に修正しました。

```php
// putメソッドの第一引数を'/user'に指定
$file_name = Storage::disk('s3')->put('/user', $file, 'public');
```
これにより正確なファイル名が取得でき、同時に正確なURLも取得できた。


## 補足
ファイルのURLを取得するurlメソッドの挙動が変だった。

```
正常なURL => "https://sample-bucket.s3-ap-northeast-1.amazonaws.com/user/DMQKRLJTuDenPXMLB7i0CCkbaHtWjgNN6D6ZPYDA.jpg"

引数ミスった時の返却値 => "https://sample-bucket.s3.ap-northeast-1.amazonaws.com/user//DMQKRLJTuDenPXMLB7i0CCkbaHtWjgNN6D6ZPYDA.jpg"
```

putメソッドの挙動から、最後のファイル名の先頭に"/"がつくのは当然として、
ドメイン名が「s3-ap-northeast-1」から「s3.ap-northeast-1」に書き換わってしまっている。どうやら引数に「S3内に存在しないファイル名」を渡すと発生する模様。
試しにドメイン名を同じように書き換えてアクセスしてみたらなんと普通にアクセスできてしまった。なんでやねん。
「iPhone・iPad・Macのみ」リンゴマーク・アップルマーク（）の入力方法

#  アップルマーク  を入力する方法

もうかなり古いネタかもしれないですが、昔の自分のメモが掘り起こされてきて懐かしくなったのでネタ投稿としてまだ知らない人、そういやそんなのあったなと思い出した人向けに記事にしてみます。


## （りんごマーク）の入力方法

### <font color="#f00" >「Shift」+「option」+「K」</font>　　=　　 

（りんごマーク）の入力方法は「Shift」+「option」+「K」で入力できます。
もうお気づきの人もいるかもしれませんが、**入力できるのはMacのみ**です。

ではiPhoneやiPadの人は？？？↓↓↓↓↓

### ~かんたん3ステップ~ iPhone・iPadの場合は辞書登録をする♪ 
**手順①** 以下のりんごマーク（）をコピー

```

```

**手順②** 「設定(アプリ)」→「一般」→「キーボード」→「ユーザー辞書」を開く

**手順③** 右上のプラスボタン（+）を押して、単語のところにコピーしたりんごマーク（）を貼り付けて、よみを「りんご」など好きな読み方を設定して完了！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/9204754f-0033-bb39-86fd-5573f39c4367.jpeg" width="320" >

無事設定できていれば、「りんご」と打つと候補にりんごマーク（）が出てきます。

## アップルマークの実体参照

実態参照まで存在します。いつ使うのやら。。。。

`&#63743;` = &#63743;

## おまけ

「」でgoogle検索したら、ちゃんとAppleのサイトが一番上に表示されているあたり、好き。

![スクリーンショット 2021-03-16 1.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/f2bad81c-aa11-3667-9ed0-962e7309caea.png)


参考：https://iphone-mania.jp/news-61830/
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-enter-apple-logo-mark-with-mac-keyboard-shortcut.html

#### おそまつ！

普段はもう少しまともな役に立つ（ような立たないような）記事を書いてます。

~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Classiをdiscordから操作できるようにする。

#自己紹介
名前:Hyugo
年齢:15歳(中学3年）

#classiとは(概要)
https://classi.jp/

classiは学校からの連絡事項や、先生とのやりとりをオンラインで行うプラットフォームである。

コロナ禍で急激にアクセス数が増え、サーバーが不安定になっていて、通知が来ないことも多く、困ることが多いのでdiscordと連携させようと思った。

なお、classiは動的サイトなので、requestsではなくseleniumを使った実装を行う。

データの格納にはjsonを使い、discord.pyモジュールを使い、discord上と連携させる。

#バージョン情報
Python 3.9
selenium 3.141.0
discord.py1.6.0

#開発に至った経緯

##不便に感じた部分
LINEや、discordなどはメッセージのやりとりを目的に作られているため、開いてすぐにメッセージUIが出てくるが、classiの場合
`アプリを開く` > `“その他”` > `“メッセージ”`
とメイン部分から大分離れた場所にある。(スマートフォン端末アプリのみ)

よって、メッセージUIにたどり着くまでの手間がかかり、不便に感じていた。

また、通知の遅延が最大で10分弱ほどあり、メッセージを送ってもすぐに相手に通知がいかず、やり取りを円滑に進める上で妨げになっていると感じた。

##開発した機能の概要
①通知のラグを削減
> 1分ごとのスクレイピングを繰り返し、メッセージの確認をすることで、通知の遅延を削減した。

②メッセージ送信の手間を削減
> discordのサーバーのチャンネルと、Classiで繋がってる人の情報を結びつけておき、チャンネルにメッセージを送信すると、discordに送信したメッセージ内容をClassiのメッセージに投稿することで、手間を削減した。


#実装(コード)

https://github.com/Float-Hyugo/Classi-connector

#簡単な構造の解説
**`scp.py`**
> スクレイピングの関数を定義している。
内部にはメッセージの送信,受信の確認,classiにログインする関数を定義した。

**`msgceck.py`**
> discordのCogファイル

>> **定期スクレイピング**
discord.tasks.loopを使用して1分に一回確認作業を行なっている。

>>**データの格納**
jsonにチャンネルIDと連絡先を括り付けたファイルを保存している。

###スクレイピング方法について
Chrome Driverを用いて、Chormeを1分ごとにバックプロセスで実行させて、処理が終わるたびにキルしている。

#詰まった点
最初はrequestを用いてログインしようとしたが、ログインできず、aiohttpを用いて、statusを確認したところ404が返ってきていることに気づき、
UIを直接操作できるseleniumを使おうと思った。



#今後
添付画像の取得や、校内グループへの投稿をスクレイピングするものを実装したい。

###Classiに対するコメント

**ソースコードに関して**
JavaScriptのソースコードを拝見させていただきましたが、処理などがコメントアウトで記されていてとても読みやすかったです。

**※切実な希望、願望**
Classi APIをclassi社にて作っていただけたらめちゃくちゃ嬉しいです。
Cause: cannot assign instance of java.util.Collections$EmptyList to field java.lang.StackTraceElement.moduleVersion of type java.lang.String in instance of java.lang.StackTraceElement

昨日まで動いていたサービスが急に動かなくなり、ググっても良い感じの情報がでなかったので備忘録兼ねて記事作成しました。

# 発生した事象
IntelliJでGralde実行したところ以下のエラーが発生

```
Cause: cannot assign instance of java.util.Collections$EmptyList to field java.lang.StackTraceElement.moduleVersion of type java.lang.String in instance of java.lang.StackTraceElement
```

# 原因
裏で別のサービスが動いており、それとポートがかぶっていたため発生

# 解決方法
* 裏で動いてるサービスを停止する
* 動かすサービスで使うポートを変更する


# 参考元
[IntelliJ has stopped printing stack traces when my app fails
](https://stackoverflow.com/questions/64530844/intellij-has-stopped-printing-stack-traces-when-my-app-fails)
【Mobile】静的セキュリティ解析ツール「MobSF」Mobile-Security-Framework-MobSFの使い方

## MobSF(Mobile-Security-Framework-MobSF)とは
[MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)は、Android/iOSのペンテスト、マルウェア解析、セキュリティ評価を自動化したオールインワンのフレームワークです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/dc8ddabc-4096-c5f7-1931-c2bc8dcd0a58.png)


静的解析と動的解析を行うことができます。MobSFは、モバイルアプリのバイナリ（APK、XAPK、IPA、APPX）とzip形式のソースコードをサポートしています。

## MobSFの導入方法
### STEP1 Dockerをインストール
[Mac に Docker Desktop をインストール](https://docs.docker.jp/docker-for-mac/install.html)

### STEP2 ミラーをダウンロードする
```
$ docker pull opensecurity/mobile-security-framework-mobsf
```

### STEP3 コンテナを実行
```
$ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```

### STEP4 サービスにアクセスする

```
http://127.0.0.1:8000
```

### STEP5 解析実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/ae932cfb-df77-f2f2-cbc7-753596824ed1.png)

上記にipaファイルかapkファイルをアップロードする。

flutterの場合は、リリースビルドを以下のように作成。

```
flutter build apk --release
```

## 実行結果

実行結果が以下のような感じで見れます。
PDF形式のレポートでも出力可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/c7bf269e-627d-a6ab-4c32-07a89eb11dc0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/2bc3d553-eb6f-6bb3-f5e8-a14df6520442.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/a2c200ef-61b6-f052-caba-592ceaddc5e6.png)
【Project Euler】 Problem3 【解いてみた】

# はじめに
【Project Euler】とは、プログラミングで解く数学の問題集です。

本投稿では初学者なりに、Problem3 を解くにあたっての考え方を解説しています。
ちなみに言語はRubyを用いています。


※本投稿は、Project Eulerのガイドラインに従い、解答例としてのコードは載せておりません。
　また、問題に関しては私が翻訳しています。ミスがあればご指摘ください。
　　
【Project Euler】について知りたい方はこちらから↓

 https://projecteuler.net/

# 問題(original ver.)
The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

# 問題(翻訳ver.)
13195の素因数は5,7,13,29である。
600851475143の素因数で最大のものを求めよ。

## 問題を解く上でのヒント
①まず600851475143の素因数を求めることを考えます。
素因数に関してrubyではPrimeクラスという便利なものがあります。
はじめにrequireでモジュールをインポートするだけで使えます。

②primeをインポートしたら実際に素因数をもとめます。
素因数分解には、prime_divisionメソッドを用いると良いです。
使い方は割愛します。

③正しく実行すると、[[素因数,n乗],[素因数,n乗]...]
といった形で値が出力されます。あとは、それぞれの素因数同士で大きさを比べるだけで解けます。

# おわりに
今回は【Project Euler】の問題3を解く上での考え方、流れを解説してきました。
Primeクラスが便利すぎて、知ってさえいれば一瞬で解けてしまいます。
この問題を通してまた一つ知識・技術を学べました。

このほかにも多くの問題が存在しているので、気になる方は最下部のリンクから挑戦して見てください。
また今後、私自身その他の問題にも挑戦し、同じような備忘録を投稿していきます。
私の備忘録が少しでも皆さんの参考になれば幸いです。ありがとうございました❗


https://projecteuler.net/about

P.S. 問題を閲覧するにはアカウント登録が必要です。↑
react-reduxのconnectで設定したpropsの型をコンポーネントに渡す

# 概要
業務でReact、Reduxを使っています。
最近TypeScriptに移行したのですが、Redux側で設定した型をコンポーネント側でも再定義しており、重複コードが気になっていました。
Reduxの公式ガイドに解決方法があったので、備忘録も兼ねて投稿します。

https://redux.js.org/recipes/usage-with-typescript

# これまでの書き方
以下のように、connectのみ行うコンテナコンポーネントとプレゼンテーショナルコンポーネントにファイルを分けています。
プレゼンテーショナルコンポーネントに渡されるpropsは、Redux側ですでに型定義されているにも関わらず、毎回型を再定義していました。

**containers/Auth.ts**

```ts
import { bindActionCreators } from 'redux';
import { connect, ConnectedProps } from 'react-redux';
import { login } from '../../../modules/Authentication';
import Auth from '../components/Auth';

type State = {
  Authentication: any;
};

const mapState = (state: State) => ({
  isLogin: state.Authentication.isLogin,
});

const mapDispatch = (dispatch: Dispatch<Action>) => ({
  login: bindActionCreators(login, dispatch),
});

// containerではconnectのみ行い、propsをコンポーネントに渡している
const default connect(mapState, mapDispatch)(Hogehoge);
```

**components/Auth.ts**

```tsx
import React from 'react';

// ここでpropsのtypeをもう一度定義していた
type Props = {
  isLogin: boolean;
  login: () => void;
};

const Auth = (props: Props) => {
  if (props.isLogin) {
    return <p>ログイン中</p>;
  }
  return (
    <>
      <button onClick={() => props.login()}>ログインする</button>
    </>
  );
};

export default Auth;
```

## ConnectedProps を使う
Reduxのガイドにもありますが、ConnectedProps関数を使うことで、コードの重複を避けることができます。

**containers/Auth.ts**

```ts
...省略...
// connectの部分を以下のように書き換え
const connector = connect(mapState, mapDispatch);
export type PropsFromRedux = ConnectedProps<typeof connector>;
export default connector(Hogehoge);
```

**components/Auth.ts**

```tsx
import React from 'react';
// react-reduxで設定したpropsの型をインポート
import { PropsFromRedux } from '../containers/Hogehoge';

// propsを定義し直さなくて良い
type Props = PropsFromRedux;

const Auth = (props: Props) => {
  ...省略...
};

export default Auth;
```

## 独自のpropsがある場合
Reduxから渡されるprops以外に独自のpropsを渡す場合は、以下のように `&` を使って交差型を定義すればOKです。

```ts
// ex) <Auth title="ほげほげ" />
type Props = PropsFromRedux & {
  title: string;
}
```

## withRouter(react-router)から渡されるpropsがある場合
react-routerを使ってルーティングを設定している場合は、コンポーネントの中で `props.history.push()` などを利用することがあると思います。
その場合は、`RouteComponentProps` 型をインポートして交差型に設定することで型を再定義しなくて済みます。

```ts
// ex) export default withRouter(Auth);
// location や history.push なんかを使っている場合
type Props = PropsFromRedux & RouteComponentProps;
```

これで、コードの重複が解消しただけでなく、Redux側で型を変更した場合の影響を、TypeScriptが検知してくれるようになります。
まだまだTypeScript勉強中ですが、せっかくの型システムなので上手く使って不具合を未然検知できるようになりたいと思います。
Railsで画像アップロードのテスト

carrierwaveを使った画像投稿のテストをする方法を学んだので、アウトプットします。
なお、テストを行うにあたり、RSpecというRailsのテストコードを書くために用いられるGemを導入しています。

## 動作環境
・Mac OS　Big Sur 11.2
・Ruby 2.6.5
・Rails 6.0.0

## carrierwaveとは
carrierwaveとは、ファイルのアップロード機能を簡単に追加する事が出来るRubyのgemです。
アップロードしたファイルの保存先はデフォルトでpublic/uploadsに設定されており、Amazon S3など外部のストレージにも設定することができるそうです。
carrierwaveのインストールとその使い方については以下の記事を参考にしました。
https://qiita.com/ttaka66/items/264dcb85e41f9135685c


## FactoryBotの記述
デストで使用するインスタンスの情報を予め設定することができる、FactoryBotというgemを使い、事前に用意した画像をセットする形でテストの実施をします。
FactoryBotの詳しい内容については、以下の記事が分かりやすいです。
https://qiita.com/morrr/items/f1d3ac46b029ccddd017

```spec/factories/user.rb
FactoryBot.define do
  factory :user do
    email                 {Faker::Internet.free_email}
    password              {'1a' + Faker::Internet.password(min_length: 6)}
    password_confirmation {password}
    last_name             {'sato'}
    first_name            {'taro'}
    self_introduction     {'Hello. How are you?'}
    image                {Rack::Test::UploadedFile.new(File.join(Rails.root, 'public/images/human6.jpeg'), 'public/images/human6.jpeg')}　← ここで画像をセットしている
  end                    
end
```
今回は、public配下にあるimagesフォルダの中にhuman6.jpegという画像ファイルを用意しています。
画像の情報として、Rack::Test::UploadedFileを指定すると、railsでは画像として認識してくれます。
それに続くFile.join(Rails.root〜~)　の部分で画像のパスを指定しています。
後から知ったことですが、File.join(Rails.root〜の部分は、Rails.root.joinという形で簡略化して書いても問題ないようです。

## まとめ
今回はローカル環境でのテストを学びましたが、Amazon S3などの外部ストレージサービスを利用する場合は他の設定も必要になるようなので、近々学びたいと思っています。
また、2018年から出てきたActive Storageというgemも画像アップロード機能を手軽にできるものなので、両方使えるようにしておくと今後便利かなと感じました。
DBのストレージ性能に関するごくごく基本的な知識

業務で DB 関連処理の性能試験を（ほぼ）初めて行った。

その際に調べたDBストレージに関するものすごく基本的な性能知識についての備忘録。

# DB ストレージの性能指標

## IOPS : Input Output Per Second
- ストレージに対するデータの読み書き回数
- 単位はページ
    - DB エンジン毎に実際のサイズは異なる
    - MySQL の場合は 16k Byte
- データサイズが小さくても、読み出しサイズは固定なので、DBアクセスが高頻度になるような場合は、この指標の影響度が高くなる。

## Throughput
- ストレージに対するデータの読み書き量
- 単位は byte
- データサイズが大きい場合にはこの指標の影響が大きくなる。

# AWS RDS の Volume Strage Type

AWSのストレージタイプは以下の３つ。主にIOPS性能を基準にして選ぶようになっている。

## 汎用 SSD (gp2, gp3)

- 標準のSSD
- コスト効率の高いストレージ
- レイテンシーは 1 桁台のミリ秒
- 長時間 3,000 IOPS にバーストできる

## プロビジョンド IOPS (io1)

- 汎用SSDよりも低レイテンシーでアクセスすることが可能
    - I/Oキャパシティの事前予約と表現される
    - ボリュームサイズによってIOの上限値が変わる

## マグネティック

- 標準のマグネティックストレージ
- 下位互換性のためのもの

---
参考

- https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html
- https://dev-labo.com/aws/difference-iops-throughput/#:~:text=%E5%8B%95%E7%94%BB%E9%96%B2%E8%A6%A7%E3%83%BBWEB%E3%82%B5%E3%82%A4%E3%83%88%E9%96%B2%E8%A6%A7,%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%8C%E5%BA%83%E3%81%84%E6%A7%98%E3%81%A7%E3%81%99%E3%80%82
- http://harish11g.blogspot.com/2013/04/Understanding-Amazon-Elastic-block-store-Performance-Tuning-IO-Block-Size.html
after_commitでDBの保存前後を比較判定する

# 何を書いているか？
DBの保存前と保存後の判定の仕方に1日詰まってしまい、せっかくなので備忘録として書いてます。

# どういう状況で詰まったか
after_commitスコープ内で、DBの保存前と保存後で比較し、保存・更新・削除されていれば、trueを返す処理をしたかったのですが、この「after_commit後の判定」というところでひっかかりました。しかも子モデルのテーブルだったのでなおさら…💧

# 親モデルと子モデルの関係

```ruby

# User.rb（親モデル）
class User < ApplicationRecord
  has_many :posts
end

# Post.rb（子モデル）
class Post < ApplicationRecord
  belongs_to :user
end
```


# DBにガッツリ保存された後に判定する
もうどうしようもないと挫けそうでしたが（笑）なんとか方法があったので書きます。
保存する前であれば、さまざまメソッドはあります。


attr_was（現在は非推奨のようですが…）したり、changesやprevious_changes、attr_previously_changedなどなど。

しかし、after_commitスコープ内ではこれらは通用しません。
何せ、もうDBに入ってしまっているのですから…

しかし、このafter_commit内で,「DB保存前とDB保存後のレコードの数を比較して条件分岐」
という状況が訪れました。
データの変更（update）・追加(create)については

```ruby
# User.rb（親モデル）
def posts_changes?
    posts.any? {|c| c.content_previously_changed? }
end
# postsテーブルにはcontentというカラムがある前提です
```

のようなメソッドをUser.rb（親モデル）に定義することでクリアすることができました。

それがこちらです。

```ruby
# User.rb（親モデル）
around_save :around_save_posts_comparison

def around_save_posts_comparison
    @posts_before_save_count = posts.count
    yield
    @posts_after_save_count = posts.count
  end
```

# around_save
これは、「saveの途中の処理」ということらしく、yield前にsave前、後にsave後のものが入ります。
これを使い、インスタンスメソッドを定義しました。
それを使い、

```ruby

# User.rb（親モデル）
after_commit do
  if @posts_before_save_count != @posts_after_save_count
   puts "レコードの数が変わったよ！新しく追加されたか削除されているよ！"
  end
end
```

このようして、なんとか処理を書くことができました。。

さっきのprevious_changed?とまとめると…

```ruby
def posts_changes?
    posts.any? {|c| c.content_previously_changed? } ||
    (@posts_before_save_count != @posts_after_save_count)
end

after_commit do
  if posts_changes?
   puts "レコードの数が変わったか、新しく追加されたか削除されているか、変更されているよ！"
  end
end

```


ただ、先輩からは「ちょっと見た目やばい。…ただ、他に処理が思いつかないから一旦これでいいか」

という感じなので、他に答え知っている方は教えていただけるとありがたいです。。

# 参考記事
https://qiita.com/rtoya/items/29cef3e328299781a328#around_xxx%E3%81%AE%E4%BD%BF%E3%81%84%E3%83%89%E3%82%B3%E3%83%AD
Virtual Private Endpoint経由でICOSを使ってみた

#Virtual Private Endpoint（VPE）とは

VPEは、自分のVPCのサブネット内のIPを指定してIBM Cloudのサービスにアクセスできる機能です。あたかも自分のVPCのサブネットにIBM Cloudのサービスがあるかのように使えます。
まずはこちらのDocsと記事を読むと理解が早いと思います。
https://cloud.ibm.com/docs/vpc?topic=vpc-about-vpe
https://qiita.com/testnin2/items/4663169274975bdb7a9e

VPEは、対応サービスが徐々に増えてきており、ICOSも使えるようになったので試してみました。
対応サービスのリストは下記にあります。
https://cloud.ibm.com/docs/vpc?topic=vpc-vpe-supported-services

#VPCを作成
VPCはあらかじめ定義しておきます。今回は、東京リージョンの3つのAvailability Zoneで構成し、各ゾーンに1つずつサブネットを作成しておきます。10.244.0.0/24, 10.244.64.0/24, 10.244.128.0/24のサブネットを作りました。


#VPE画面にアクセス
左上のメニューボタンから、VPCインフラストラクチャ > エンドポイント・ゲートウェイを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c16b433a-4127-c498-424f-42a283e537dd.png)

作成ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/60a8fe05-e7d9-1fc4-e158-4dd9fada33c4.png)

今回は、東京リージョンのVPCに、東京リージョンのICOSへのエンドポイント・ゲートウェイを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/4c1a9761-c330-7aa9-d47c-1c3e6fe990b1.png)


エンドポイント・ゲートウェイが作られたら、東京リージョンの各ゾーンに1つずつVPE用のIPを予約します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/e07b5be0-a5b8-88c5-62f6-4de5fb91476a.png)

#VPC内の仮想サーバーから動作確認

それぞれのサブネットに1台ずつ仮想サーバーを作成しました。

通常、s3.direct.tok.ap.cloud-object-storage.appdomain.cloudは、161.26.x.xに名前解決されます。今回、VPEを使って、10.244.x.xがICOSのエンドポイントとして動作するよう設定した事により、ゾーン1内からの名前解決要求については、自動的にIBM Cloud内のDNSで、s3.direct.tok.ap.cloud-object-storage.appdomain.cloudが10.244.0.6に名前解決されるようになっていました。
（10.244.0.6を使うために、IPアドレスの直指定やhostsファイルでの解決は不要です。）

```
# nslookup s3.direct.tok.ap.cloud-object-storage.appdomain.cloud
Server:		161.26.0.7
Address:	161.26.0.7#53

Non-authoritative answer:
Name:	s3.direct.tok.ap.cloud-object-storage.appdomain.cloud
Address: 10.244.0.6
# 
```

上記の名前解決を使い、awscliで、bucket一覧を取得できました。
（credentialにはICOSのHMAC形式のaccess_key_idとsecret_access_keyを指定しています）

```
# cat ~/.aws/config
[default]
region = jp-tok-smart
output = json
#
# aws --endpoint-url https://s3.direct.tok.ap.cloud-object-storage.appdomain.cloud s3 ls
2020-10-21 09:56:51 bucket1021
2020-10-28 01:31:47 bucket1028
# 
```

zone2のサーバー（10.244.64.0/24）では、s3.direct.tok.ap.cloud-object-storage.appdomain.cloudはゾーン2のVPEのIPに名前解決されます。

```
# nslookup s3.direct.tok.ap.cloud-object-storage.appdomain.cloud
Server:		161.26.0.7
Address:	161.26.0.7#53

Non-authoritative answer:
Name:	s3.direct.tok.ap.cloud-object-storage.appdomain.cloud
Address: 10.244.64.4
#
```

zone3のサーバー（10.244.128.0/24）では、s3.direct.tok.ap.cloud-object-storage.appdomain.cloudはゾーン3のVPEのIPに名前解決されます。

```
# nslookup s3.direct.tok.ap.cloud-object-storage.appdomain.cloud
Server:		161.26.0.7
Address:	161.26.0.7#53

Non-authoritative answer:
Name:	s3.direct.tok.ap.cloud-object-storage.appdomain.cloud
Address: 10.244.128.5

# 
```

以上で、VPEを使って、自分のサブネット内のIPを指定し、ICOSが使えるようになりました。
RealSense・Lidarを実機検証する

RealsenseやLidarを同じ環境で実証した資料が見つからないため、今回実機検証をしてみました。
#検証機材
今回使用した機材は以下です。
##Realsense
D415
D435
D455
___Intel Realsense D455とD435を実機比較～実機テストするよ～レビュー編___
https://qiita.com/usashirou/items/9c10506cd98a8f9a08b8
##Lidar
RPLIDAR A1
YDLIDAR X2
YDLIDAR X4
___格安Lidarを使おう　RPLidar A1・YDLidar X2L／X4を比較___
https://qiita.com/usashirou/items/6680b44ef502eadbf386
#検証環境
15mの廊下がある品川区西大井創業支援センターをお借りして実験しました。
![撮影環境―m入.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/113e2331-9f03-ceec-2f39-c913ed41e385.jpeg)
#検証機材
Realsense:Windows10 RealsenseViewer
Lidar:Ubuntu 18.04 ROS1 Rviz
##設定
Realsenseはデフォルト設定で、デプスを実行しました。
Lidarは、Githubよりプログラムをインポートし、Launchファイルを実行し、Rvizの情報を録画しました。
ただし、標準の升目ですと飛び抜けてしまうために、升目を大きくするとともに、ポイントを変更して再撮影しています。
(この為、Youtubeの参考動画とは微妙に時間がズレています）
#検証結果
##Realsense
![Realsense-比較.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c45169ac-c0ed-2dd8-8d48-b9d53eff7d1b.jpeg)
D415,D435,D455と5m離れた状態における映像を比較してみました。
RealSenseのデプスについては、５mを超えると検知できないと言えます。
通常使用では５m以下と考えるべきでしょう
https://youtu.be/fmnh8o1OaNU
##Lidar
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a5e729c6-ad7e-52af-ac37-423aa98b22df.png)
RPLIDAR A1,YDLIDAR X2L,YDLIDAR X4と5m離れた状態における映像を比較してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2dbe0bbc-8a12-e766-1b28-5a0cf6cb15cf.png)
RPLIDAR A1,YDLIDAR X2L,YDLIDAR X4と10m離れた状態における映像を比較してみました。
５mでの検出は問題なく行えますがRPLIDAR A1は5mを超えると検出できなくなっています。
YDLiDARはどちらも10mにおいて検出できていますが、X2Lの方が精度が高そうです。
https://youtu.be/QHtIMFtiQm4
##総評
##Realsense
思ったよりも奥行きの検出が行えなかったのが残念です。
特にD455は、残念すぎる結果です。
##Lidar
回転速度などがあるため、一概には言い切れませんがX2Lは想定以上の性能を有していると感じられました。
ただし、回転音を含めてRPLIDARの方がしっかりしていると感じられました。
##失敗
今回検証を行うにあたりダイソーのRCカーを走行させようと考えていました。
しかし、電波が届かない為、検証で使用できませんでした。
![DSC_0947 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/522bf084-a085-5be8-5473-dd6d002680b8.jpeg)
##撮影協力
品川区西大井創業支援センター、メディアソリューション
HTMLについて

HTMLはウェブページの見た目を構成する言語。
CSSとセットで使われるが、HTMLは骨組みで
CSSは肉付けのようなもの。
今回はHTMLの基礎の部分の記事を書いてみたいと思います。

## HTML
HTMLは、一言で表すとウェブサイトに表示される情報を記載する言語。

```html
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>テストサイト</title>
  </head>
  <body>
    <h1>
      見出し
    </h1>
    <p>
      段落①
    </p>
    <p>
      段落②<b>この部分は太字になります。</b>
    </p>
     <a href="https://www.google.com/">クリックすると、Googleへ移動します。</a>
  </body>
</html>
```

< >と</ >で囲まれた箇所はをHTMLの要素と呼び、それぞれ役割をもっている。

■タグ
HTMLにおける要素のかたまりを示す記述。
タグには、要素の始まりを示す開始タグと、終わりを示す終了タグがある。終了タグが無い要素も存在する。

```html
<h1> この部分が要素 </h1>
開始タグ           終了タグ

```
開始タグと終了タグに囲まれている部分だけが、その要素として扱われる。

### htmlの構成
ここから、上記に書かれたコードの要素について解説していきます。

HTMLは大きく分けると、head要素とbody要素という2つの要素で構成されている。

■head要素
ウェブサイトの情報や、装飾用のCSSファイルの情報を記載する部分。ここに記述した情報は画面上に表示さない。

■body要素
画面上に表示したい情報を記載する部分。ブラウザ上に表示されている情報は、body要素の中に記述されたもの。

■DOCTYPE HTML
この文章がHTML文章であることを宣言する要素。閉じタグはなし。この要素を記述しないと、レイアウトが崩れ、正しく表示がされない場合がある。

■html要素
HTML文章の始まりと終わりを示す要素。

ここまでが、HTMLを記述する際に必要な大枠となる要素。

### head要素部分
head要素には、ブラウザ上には表示されない、Webページの情報を記載する。例えば、以下のような情報。

・Webページのタイトル
・装飾のためのCSSファイルの指定
・外部のファイルの読み込み
・SNSなどでシェアされたときの表示の仕方

■meta要素
HTML文章に関する情報を指定する時に使用する。閉じタグはなし。charset=はmeta要素の属性。
指定するのは、「UTF-8」という文字コードです。

■属性
属性は、要素に情報を付け加える。属性のあとには属性値が続く。

■属性値
どのような属性なのかを示す値を属性値と呼ぶ。

■charset属性
メタ要素にて、どのような文字コードを用いるか示すことができる属性。
今回は、属性値をUTF-8とした。

```html

<meta charset="UTF-8">
      属性      属性値
```
■title要素
ウェブサイトのタイトルを指定する要素。title要素内にタイトルを記述してもウェブサイトの画面上には表示されない。

### body要素部分

■h1〜h6要素（見出し要素）
hから始まるh1/h2/h3/h4/h5/h6の要素は文章の見出しを作るための要素。
見出し要素はh1からh6まで存在する。
囲まれたテキストは見出しとして強調され、h1から順に文字の太さと大きさが小さくなる。

■p要素
文章の段落を表すも。p要素で囲むとひとかたまりの段落として認識される。

■b要素
文字を太くする要素。b要素で囲まれている部分だけ太字になる。

■a要素
a要素で囲ったテキストをリンクにすることができる。a要素をクリックすると特定のページに移動できる。aタグのhref属性に、移動させたいページのURLを指定する。

■href属性
href属性はリンクの移動先を指定する。

```html
<a href="リンク先のURL">リンクとなるテキスト</a>
```

以上がHTMLの基礎部分です。
CSSと組み合わせることによりwebページが作成できます。
Laravel 8 のプロジェクトを適当に作る

## 背景

Tipsの記事を書くのにいちいち前提条件を書かなくていいようにまとめる。

## プロジェクトの作成

```sh
laravel new example-app
cd example-app
```

## データベースの設定

楽したいので SQLite を使う。

```sh
touch database/database.sqlite
```

`.env` を書き換えて、DB 周りの環境設定を SQLite に合わせる。

```diff
- DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
- DB_PORT=3306
- DB_DATABASE=example_app
- DB_USERNAME=root
- DB_PASSWORD=
+ DB_CONNECTION=sqlite
```
【React】moduleを使ってCSSのクラスを複数指定する方法

Reactビギナーの備忘録。

# 問題
React × moduleを使って「CSSスタイリングを同時に複数したい」がどうやってやればいいの？と思ったのでまとめておきます。

# 解決策

①App.jsファイル内のClassの書き方


```react
//App.js
import styles from "./style.module.css";

<td className={`${styles.td} ${styles.thid}`}>{id}</td>
```

②CSSファイル
こちらはおなじみの書き方です。

```
//style.module.css

.td{
    background: #fff;
}
.thid{
    color: #000;
}
```



以上。
GitHubの操作ミスとその対処法

## ブランチを作成せずに、マスターブランチ上でコードを書いてしまった
万が一、ブランチの作成を忘れても解決する手段はふたつあります。

- 書いているコードを作成したブランチに引き継ぐか
- 0からコードを書き直すか

以下の状況は、トピックブランチの作り忘れによりmasterブランチで作業を進めている例です。

![gitt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/6e288972-878b-b87e-8889-168fddbdd4d5.png)

こんな時は、ひとまずこの状態からブランチ(例ではブランチ作成忘れ)を作成します。すると以下のような選択肢が出てきます。

![gittt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/1870dfef-22f2-24d2-3b24-1c3609d695b9.png)

|表記|意味|
|--|--|
|Leave my changes on master|元のブランチで書いていたコードを保留にして、新しいブランチで0からコードを書く|
|Bring my changes to (ブランチ名)|元のブランチで書いていたコードを新しいブランチに引き継ぐ|

上記の例で言うと、「元々別のブランチで作成したかったので**Bring my changes to ブランチ作成忘れ**」を選択することになります。そうすると、さきほどの変更修正は新しいブランチへ移動します。

では、**Leave my changes on master**を選んだら、今まで書いていたコードは消えるのか？というと
これは保留になっています。
一度masterブランチに戻ってみると**Stashed Changes**と書かれた記述が増えています。
ここをクリックし、**Restro**というボタンを押すと、コードの復旧ができます。

![gitttt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/05faffdf-cd8a-29b3-c95d-b938f2617ae5.png)

## ファイルの同時編集をした場合
複数人で作業していたり、複数のブランチにまたがって作業をすると出てくるファイルの同時修正というものがあります。
これを**コンフリクト**と言います。
コンフリクト発生時のポイントを把握しましょう。

- なぜ、コンフリクトが発生したのかを明確にすること。
- 同じ原因のコンフリクトを発生させないこと。
- 複数人での開発でコンフリクトが発生した場合は、独断で解消しようとせず他のファイル編集者と相談して解消すること。

ではここからはコンフリクトの発生状況を見て行きます。

### 同じファイルを別の人がすでに修正していてマージできない
2つブランチで同じファイルを作業してしまったため、マスターファイルの辻褄が合わず、コンフリクトが発生することがあります。
すると、ブラウザエディタ上でマージしようとすると、このような画面が出ます。
![git2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/c303568c-103d-3e96-41f0-3fea537fb68c.png)
**解決法**
上記に出ている「Resolve conflicts」をクリックします。
すると以下のような画面が出るので、ここで修正をしていきます。

![git3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/ed9fecf6-bdd5-ee69-30e3-d569b12289cd.png)

コンフリクトの対象ファイルが複数ある場合は、左側に表示されます。
解消したいファイル名をクリックすると、そのファイルの内容が表示されます。
また、対象が複数の場合は、ファイルごとに「Mark as resolved」をクリックする必要があります。

この画面では通常通り修正ができますので、ここで本来の表記になおします。
できたら「Mark as resolved」をクリックします。

画面が切り替わり、「Commit merge」と表示されるのでクリックします。
![git4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/9aacfaaa-a654-f350-998d-5e2654e2ec96.png)

これで通常のmerge画面に戻れます。
最後にマスターブランチでのpullを忘れずに。

## 誤った情報をプッシュしてしまった
gitではpushした情報をローカルリポジトリに戻すことはできないです。
「pushする前の作業中のブランチは正しいか」必ず確認することが大切です。

それでも間違った時、ローカルにその情報は戻せませんが、リモートになる誤ったcommit情報の取り消しはできます。

**解決法**
commitを消すには**revert**を使います。
revertは、commitを削除するのではなく、「指定するcommitを取り消すためのcommit」を追加で行います。
commitされた変更と逆になる変更を追加することで、commitを取り消します。

例えば以下のAファイルが間違えてpushしたファイルだとします。

```ruby:A.index.html.erb
<button>
 <%= link_to 'button', '#' %>
</button>
```

こっちが正しい形のBファイルだとします。

```ruby:B.index.html.erb
<header>TopPage</header>

<button>
 <%= link_to 'button', '#' %>
</button>
```

**<header>TopPage</header>**を追加したかったけど忘れてしまった、みたいなパターンです。


すでにAファイルがpushされた状態です。これを取り消したい場合、現時点でBファイルの形に編集します。
編集後、commit + pushします。
ブラウザを確認すると"<header>TopPage</header>"の削除が反映されてますが、これでは追加した意味が、、、
となってしまいます。

そこで必要になる作業がまだあります。

GitHubDesktopの「History」をクリックし、一つ前にcommitしたファイルを右クリックします。
選択肢が出てきますが、その中で一番上の「Revert this Commit」をクリックし、「Push origin」を押します。

これでリモートリポジトリを確認すると、Bファイルの形で戻っているはずなので確認しましょう。

## まとめ
操作にミスが会ったときに、パニックになってさまざまなコマンドを打ちまくらないこと。
場合によっては貴重なコードが消えてしまう可能性もあり！
runGadget オプションを使ってShinyアプリの表示方法変更（①ダイアログ②ペイン③別タブ）

# はじめに

RStudioサーバー にて Shiny アプリを作成している。`shinyApp(ui, server)` 実行時にアプリが別ウィンドウで立ち上がる状態を変えたいと思い調査したところ、__runGadget オプション__にて①ダイアログでの表示、②ペイン（Rstudioサーバー内の領域）での表示、③別タブでの表示ができた。[Shiny - runGadget](https://shiny.rstudio.com/reference/shiny/0.13.1/runGadget.html) を参考にした。

以下でコードと実行結果を示す。実行するのは [bs4Dash](https://rinterface.github.io/bs4Dash/index.html) のサンプルアプリ。

```r:bs4Dash.R
library(bs4Dash)
ui <- dashboardPage(
  dashboardHeader(title = "Basic dashboard"),
  dashboardSidebar(),
  dashboardBody(
    # Boxes need to be put in a row (or column)
    fluidRow(
      box(plotOutput("plot1", height = 250)),

      box(
        title = "Controls",
        sliderInput("slider", "Number of observations:", 1, 100, 50)
      )
    )
  )
)

server <- function(input, output) {
  set.seed(122)
  histdata <- rnorm(500)

  output$plot1 <- renderPlot({
    data <- histdata[seq_len(input$slider)]
    hist(data)
  })
}

shinyApp(ui, server)
```


# ①ダイアログ

サンプルアプリの実行コマンドを以下のように変更。

```r:dialog.R
# shinyApp(ui, server)
runGadget(ui, server, viewer = dialogViewer("Dialog Title", width = 1200, height = 600))
```

実行結果は以下 GIF のようになる。

![dialog.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/50a8e682-1fcc-b253-fb15-a5ef0872926a.gif)

# ②ペイン

サンプルアプリの実行コマンドを以下のように変更。

```r:pane.R
# shinyApp(ui, server)
runGadget(ui, server, viewer = paneViewer(minHeight = 500))
```

実行結果は以下 GIF のようになる。

![pane.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/7ee4037b-22cc-5907-2377-5ae6834baddd.gif)

# ③別タブ

サンプルアプリの実行コマンドを以下のように変更。

```r:tab.R
# shinyApp(ui, server)
runGadget(ui, server, viewer = browserViewer(browser = getOption("browser")))
```

実行結果は以下 GIF のようになる。

![tab.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/761f2209-1971-1125-afa4-72a0d95a55ea.gif)
GitHubDesktopの使い方

## 初めに
よく忘れてしまうので簡単にですが記事に残しておきます。
簡略化しているのでご了承ください。
前提としてリポジトリと、その種類について触れていきます。
#### リポジトリ
リポジトリとは、Gitの管理下にあるファイルやディレクトリの変更履歴を保管するもの。管理したいアプリケーションのディレクトリを、バージョン管理の範囲として指定します。
#### ローカルリポジトリ
ローカルリポジトリとは、自分のPC上に置くリポジトリのことです。
作成したリポジトリは自分のパソコンの中にあるため、好きなタイミングで修正や変更を記録できます。
#### リモートリポジトリ
リモートリポジトリとは、外部サーバー上に置くリポジトリのことです。リモートリポジトリを直接変更修正することはなく、ローカルリポジトリの変更修正を同期して、反映させることで更新します。
## GitHubDesktopの使い方
まずはローカルリポジトリを作成します。
以下の画像のAddをクリックします。そして、Add Existing Repositoryをクリック。
![](https://gyazo.com/a77ed5fa204dcfed156bda0578f11477.p)
その後、アプリを選択してADD Repositoryをクリックします。
![]
(https://gyazo.com/88d029e08aed582a44b2a89a499ae2b5.p)
以上でリモートリポジトリは完成です。
## commitする
#### commitとは
ファイルやディレクトリの変更修正を、リポジトリに記録することです。
以下の画像の上部にコミット名を記入します。コミットメッセージは変更内容などをわかりやすくするために記入します。記入したら、青色のボタンをクリックします。
![]
(https://gyazo.com/96217187acc3cd9926114b1b435f2412.p)
以下の画面になるので、青色のボタンをクリックします。
![](https://gyazo.com/e575e20387477fb667fbba3b60ea257f.p)
以下の画像の画面になります。内容を公開する場合はKeep this code privateにチェックが入っているんでチェックを外しましょう。
青色のボタンをクリックします。
![](https://gyazo.com/3246a03d023ba23824750dc09db1a18a.p)
## ブラウザの確認
内容をブラウザにて確認してください。ブラウザ上に先ほど保存したアプリ名があれば成功です。
また追加で変更する場合は、commitをすると今度はpush originという青いボタンが出るのでそれをクリックするとリモートリポジトリに反映できます。
【Swift】カスタムセル上のボタンを押して画面遷移をしたい

# なにがしたいのか

タイトルの通りではあるが、カスタムセル（collectionView）のボタンの `IBAction` に画面遷移の処理を書けばいいんだなと考えていたが、 `prepare()` がサジェストされない。どうも**VieｗControllerじゃないと画面遷移の処理は書けない**らしい。
なので**Delegate**を使うことになる。

## Delegateとは

**【Swift】ぼんやりとDelegateの流れをつかむ**
<https://qiita.com/antk/items/4934aa634d679e1dc099>

この記事でいうと

- **委任側（『メソッドを使わせてくれ』とお願いする側）** -> カスタムセル
- **受託側（『メソッドを使わせてくれ』とお願いされる側）** -> ViewController

になる。
それにしても変数名がややこしい記事で書いてる自分も混乱してしまった。

## selfをどこに書くか

基本的には記事通りにDelegateメソッドを書いていけばなんとかなる。
問題は最後の `self` を書くところだが、以下の記事を参考に書く。

**【Swift】レイアウトやサイズが異なる複数のカスタムセルを並べる**
<https://qiita.com/antk/items/dd9ad7b591834fdc837f>

カスタムセルの表示設定をする部分の `case 1:` の部分を書き換えよう。

```swift:ViewController.swift
        case 1:
            // こちらのカスタムセルは単純に表示するだけ
            // return collectionView.dequeueReusableCell(withReuseIdentifier: "buttonsCell", for: indexPath) as! CollectionViewCell2

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "buttonsCell", for: indexPath) as! CollectionViewCell2

            // ここに書く
            cell.deledele = self
```

これで `buttonsCell` に置かれたボタンのIBActionから遷移ができるはず。

おわり(´・ω・｀)
vSphereのアップグレードに失敗する

# 課題：
VCenterアップデータマネージャからvSphere6.7をアップデータすると次のようなエラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/4be7da38-ebf6-2e77-c4dd-a6a1151ee863.png)

# 原因：
vCenter6.5以降から2台構成クラスタをアップデートする場合はHAクラスタを解除するとアップデートするサーバを保守モードに切り替えないとエラーになる。

# 対策：
- vCenterのアップデートログを見る
 - sshサービスを有効にする
     - vCenter Appliance Managmentにログインする
     - 左メニューから「Access」を選択<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/21770b73-0656-fcc4-2608-9f28f8cf7226.png)
     - 右上の「Edit」を選択<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/7ed226bc-a09e-cec3-3cb4-04286341ee26.png)
     - Enable BASH Shellを有効にしてタイムアウトを入力した後に「OK」ボタンを押下<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/47e53b29-b3f4-aca1-e948-eed37d79a967.png)
- エラーメッセージを確認する
    - teratermなどでvCenterにsshログインする
    - shellを入る<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/72175b0a-70f7-7e16-535a-ecb9c83fa190.png)
    - /var/log/vmware/vmware-updatemgr/vum-serverディレクトリに移動<br/>cd /var/log/vmware/vmware-updatemgr/vum-server
    - アップデートログを見る<br/>tail -n 500 vmware-vum-server-log4cpp.log
    - ERROR文を探す<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d5f52a3f-c1f1-cf6b-0a36-909e2a460d71.png)
    - 「DRS API returned faults」エラーが発生している場合はvCenter6.5以降からのHAクラスタ制限である。
    - sshセッションを取りる<br/>exit<br/>exit
- vCenterにログインしてサーバを保守モードに切り替える
    - サーバを右クリックして「Maintenance Mode」ー「Enter Maintenance Mode」を選択<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/c3489eac-7bb5-c059-a226-4dce1db2903d.png)
    - サーバが保守モードに切り替わりましたらアップデートする

# 参照資料
https://kb.vmware.com/s/article/60359

以上
【RSpec】let にパラメータを渡したい

## はじめに

letにパラメータ(引数)を渡す方法です。
通常であればヘルパーメソッドで定義したり変数の部分をletで置いたりするなどと思いますが、選択肢の一つになれば幸いです。

## やりかた

lambdaで渡す(Procでも可)。

```
# 定義の仕方
let(メソッド名) do
  ->(引数) { 処理 }
end

# 呼び出しかた
メソッド名.call(引数)
```

例題

```
# 定義
let(:say_something) do
  ->(sth) { p sth }
end

# 呼び出し
before do
  say_something.call('hogehoge')
  say_something.call('piyo')
end
```

## おわりに

意外と知らなかったところだったので共有でした。
【Ruby】整数を16進数化するメソッドの作成でリファクタリングに触れる

# やりたいこと

自分のコードのリファクタリングがしたい⋯
でもなにから手をつけていいかわからない⋯

そんな気持ちを抱えるなか、現在勉強中の「プロを目指す人のためのRuby入門」にて、メソッドを作成する過程でのリファクタリング手順について触れられていたのでその流れについて自分用のメモ、アウトプットです。

# 整数を16進数化するために使用するメソッドの作り方

## 作成イメージ
3つの整数を受け取り、16進数に変換するto_hexメソッドを作成します。

```ruby
to_hex(0, 0, 0)
# => '#000000'
```

## 16進数化メソッドで使用するメソッド
リファクタリングの前に、このメソッドを作成するために使用するメソッドについて学習 ✎

### メソッド① to_sメソッド：整数を16進数に変換する
整数を16進数にするためにはto_sメソッドが使える。

```ruby
0.to_s(16)
# =>'0'
255.to_s(16) 
# => 'ff'
```

to_sメソッドは、文字列以外のオブジェクトを文字列に変換するメソッドと認識していたけれど、引数を指定することで、指定された文字列表現に変換することもできると初めて知りました。

今回は引数として「16」と指定することで、16進数の文字列に変換しています。

### メソッド② rjustメソッド：整数→16進数メソッドの戻り値を2桁の文字列にする

to_s(16)メソッドでは0.to_s(16)としたときの戻り値が1桁なので、期待している'00'といったような2桁の値に変換するためにrjustメソッドを使います。

``` ruby
rjust(width, padding = ' ') 
# => String

# width：返り値の文字列の桁数
# padding：長さが width になるまで self の左側に詰める文字
```
> 長さ width の文字列に self を右詰めした文字列を返します。 self の長さが width より長い時には元の文字列の複製を返します。また、第 2 引数 padding を指定したときは空白文字の代わりに padding を詰めます。

```ruby
# 例
'0'.rjust(5)
# => '     0' 　　#デフォルトで半角スペースで文字列を埋める。
```
rjustの"r"は右の"r"か！！！

## to_hexメソッドを作る
### STEP① to_hexメソッドを作成する
16進数化に使うメソッド①と②を使用して16進数化メソッドを定義するとこんなかんじ。

```ruby
def to_hex(r, g, b)
  '#' +
  r.to_s(16).rjust(2, '0') +
  g.to_s(16).rjust(2, '0') + 
  b.to_s(16).rjust(2, '0')
end
```
これまでのわたしはここで終わっていた⋯！

### STEP② to_hexメソッドのリファクタリング(繰り返しをなくす)

STEP①で作成したコードは、
to_s(16).rjust(2, '0')で続く3列がRubyのDRYの原則に反しています。
DRY原則に従い重複を取り除くと、こう。

```ruby
def to_hex(r, g, b)
  hex = '#'
  [r, g, b].each do |n|
    hex += n.to_s(16).rjust(2, '0')
  end
  hex
end
```

繰り返しがなくなった！
こんな風にeach文を使ってリファクタリングするだなんて、自分の引き出しにはなかったのでとても勉強になります。
こうすることの利点は、コードに変更を加える際などに、何箇所も修正する必要がなくなること！

### STEP③ さらにリファクタリング

本の中では、STEP②から更にリファクタリングしています。

```ruby
def to_hex(r, g, b)
  [r, g, b].inject('#') do |hex, n|
    hex + n.to_s(16).rjust(2, '0')
  end
end
```
injectメソッドを使ってたたみ込み演算することで、もっとコンパクトになりました。

injectメソッドはすでに本の中で紹介されていますのが、使い方が少しむずかしい。。。
ただ今回のように、「配列の中身を足し合わせたい！！」という状況はこれまでにも何度かあり、そのときにこのメソッドが使えていれば、もっとコードを短くかけていたと思います。これからは積極的に使っていこう！

### ・ injectメソッドメモ
たたみ込み演算を行うメソッド

```ruby:例
numbers = [1, 2, 3, 4]   
sum = numbers.inject(0) {|result, n| result + n}  
```

・ブロックの第1引数resultへは最初のみ0が入り、2回目以降は前回のブロックの戻り値が入る。
・ブロックの第2引数nは配列の各要素(1, 2, 3, 4)が入る。
・繰り返し処理が最後まで終わるとブロックの戻り値がinjectメソッドの戻り値となる。

# 終わり
PFを制作するうちにどんどん長くなるコードに罪悪感を感じ、「リファクタリングせねば⋯！」という心の声は聞こえていました。

しかし、具体的にどこから手をつけていいんだろう⋯と、とても腰が重かったのです。
本書では、メソッドを作成する過程でリファクタリングの方法、進め方を解説しており大変勉強になりました。

あくまで、1メソッドのリファクタリングですので、
こういった一つ一つの技を学んで実践で使いながらものにし、息をするようにリファクタリングができるというところを目指したいと思った次第であります。

# 参考
・ 書籍：「プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで」
・ [Ruby 3.0.0リファレンスマニュアル instance method Integer#inspect](https://docs.ruby-lang.org/ja/latest/method/Integer/i/inspect.html)
・ [Ruby でマルチバイト文字に対して ljust しても綺麗に揃わない場合](https://www.techscore.com/blog/2012/12/25/ruby-%E3%81%A7%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E6%96%87%E5%AD%97%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6-ljust-%E3%81%97%E3%81%A6%E3%82%82%E7%B6%BA%E9%BA%97%E3%81%AB%E6%8F%83/#:~:text=ljust%20%E3%81%AF%E5%B7%A6%E6%8F%83%E3%81%88%E3%80%81rjust,center%20%E3%81%AF%E4%B8%AD%E5%A4%AE%E6%8F%83%E3%81%88%E3%81%A7%E3%81%99%E3%80%82)
Docker+ECS(fargate)+Railsで環境構築をした際tmp/pids/server.pidのエラーが消えない時の対処

## やりたかったこと
以下の手順でDocker環境で開発を行なっているRailsプロジェクトの本番環境を構築

```sh
# Dockerイメージを作成
$ docker build -t リポジトリ名 . -f Dockerfile-prod --build-arg RAILS_MASTER_KEY=xxxxxxxxxxxxxxx
# リポジトリにイメージをプッシュできるようにタグ付け
$ docker tag リポジトリ名:latest アカウント番号.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:latest
# リポジトリにプッシュ
$ docker push アカウント番号.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:latest
```

## エラー発生
しかし、ECSのタスクのログを見ると以下のエラーが発生し上手く立ち上がらない。

```
=> Booting Puma
=> Rails 5.2.4.2 application starting in development 
=> Run `rails server -h` for more startup options
A server is already running. Check /tmp/pids/server.pid
Exiting
```
まだ立ち上げておらず`db:migrate`もしていないのに上記のエラーが出るのは不自然なので、
Dockerファイルなど設定を色々見直し。
##原因
ローカル環境のdockerが立ち上がっていたままプッシュしていた。
そのため、ローカルのserver.pidもプッシュしておりエラーが発生していた。

##対処内容
``docker-compose down``でローカルのDockerを落としたあと、念の為下記のディレクトリのファイルが消えているか確認。

``/Users/ユーザー名/プロジェクト名/tmp/pids/server.pid``

消えていたら再プッシュして、エラーを吐かずに動いていれば完了。
Qiita Daily Survey memo 2021.03.17

# Qiita Daily Survey memo 2021.03.17
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [【Rails×LIFF】でデートサポートサービス『Date me』を作りました！【個人開発】](https://qiita.com/terakura-aina/items/c613a7078b460b6189ff)
terakura ainaさんの記事。
学生さん向けかなと思って記事を開きましたが、ペルソナはだいぶ時が経ったカップル・夫婦の方にフォーカスして、デートのサポートをしてくれるアプリを開発された、という記事です。
UIがとにかく綺麗…。
使用した技術が細かく列挙されていたり、実際に使ってもらってフィードバックをもらいアップデートをするなど、とっても丁寧に作られています。
「「自分が作れるもの」ではなく、より良いものを作りたい」は、刺さりました…。
学生時代は、できるできない関係なく、とにかく体当たりでいろいろなものを作っていたなーと…。


## [JavaScript: いつものAlertを簡単に、少しだけおしゃれにするSweet Alert](https://qiita.com/e99h2121/items/d3c5937c474d1c23cc9d)
Nobuko YAMADA(e99h2121)さんの記事。
今回ご紹介いただいた記事は、WebページのAlertをおしゃれにする…という記事になります。
Alertが「ﾎﾞﾝｯ」って出てくるといらっとしますが、Sweet Alert の通り、優しくアラートを挙げてくれるとほっこりした気持ちになれます。
昨日のエヴァとどちらがいいかというと…、致命的な場合はエヴァのAlertが良いですが、そうでないものはYAMADAさんのAlertだと落ち着いて対処できそうです。
One Point にこんな実装ができるとかっこいいなと思いました…。


## [開発期間一ヶ月。文系未経験が大学課題管理アプリを作った話。](https://qiita.com/shouhi/items/a052c2704d2b8352e47a)
井手 翔陽(shouhi)さんの記事。
かなり期待して開いた記事ですが、期待に応えてくれる内容でした！
スクレイピングで大学の課題を取得し、スケジュールで閲覧可能というアプリだそうです。
UIもわかりやすく、自分の大学にあるとうれしいですね！
私が学生の時代にも欲しかった…。（私の大学は２階の掲示板に紙の形で張り出されていて、毎日確認していることが前提、という運用でした…）
特に開発の流れの部分を楽しく読ませていただきました。
機能毎に Trello でカードを作って追加していくのですが、分け方がなるほどなーと思いました。
ちょうど昨日、「このままじゃアカン」と思ってミニ要件定義を作ってみたので、開発はこちらを参考に進めていきたいと思います。

## [エンジニアはどこまで勉強すればよいのか - スキルマップと生存戦略を考えた](https://qiita.com/e99h2121/items/a41339815d9aea87bdb4)
Nobuko YAMADA(e99h2121)さんの記事。
エンジニアのスキルの可視化と、それをもとにしたスキル習得の記事です。
何回か挑戦したことがありますが失敗していたので、なるほどー…と納得させられました。
技術の可視化には、軸が何個も何個も必要で（フロントエンド - バックエンド、アプリ - インフラ、アセンブラ - 高級言語、etc...）それぞれを人が入力するのは無理なのでは…と挫折してしまいました。
いったんシンプルに領域と帰還だけの2次元マップを作ることで、確かにバランスよく、かつ得意分野を持って、という形がいいというのに納得だなーと思いました。
この図でいうと、私はフロントエンドの経験が少ないので、そちら側を勉強したいは正しいのかも！と少し自信になりました。
皆様はいかがでしょうか…？
macOSでGoogle Chromeのプロファイル名を指定してターミナルから立ち上げる

## はじめに
Google Chromeでは複数のプロファイルを作成することができます。それぞれのプロファイルにGoogleアカウントを紐付けることができるため、仕事用、個人用などをスムーズに切り替えることができます。

## 事前準備
Chromeのプロファイルはディレクトリです。
`~/Library/Application Support/Google/Chrome/` に `Default` といった名前で保存されています。

まずはChromeのプロファイルの実体がどこにあるかを調べます。

Chromeであれば次のようなURLを開き、`Profile Path`を見ることで確認できます。

```
chrome://version/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/a4bf509c-9f57-c6ab-6f75-a1cb42fa4f24.png)

## 開く
プロファイル指定をして開くには次のコマンドをターミナルで入れます。

```bash
$ open -a "Google Chrome" --args --profile-directory="Profile 2"
```

`open`コマンドに`-n`オプションをつけると実行ごとに新しいウィンドウで開きます。

```bash
$ open -n -a "Google Chrome" --args --profile-directory="Profile 2"
```

長いのでエイリアスを掛けておくと良さそうです。

```bash
$ alias oc='open -a "Google Chrome" --args --profile-directory="Profile 2"'
```

## （未検証）プロファイルディレクトリの変更
プロファイル名は最初がDefault、ついでProfile 1, 2, ...といった意味のない連番となっています。
これを変更するには下記の手順で行えるそうです。（未検証）

危険なため出典を確認の上、自己責任で行ってください。

1. Chromeを完全に終了する
2. ディレクトリをバックアップを取っておく
3. リネームする

参考: https://superuser.com/questions/796000/how-do-i-specify-a-different-profile-directory-in-chrome
TransGANでCIFAR10の画像が生成できるか　⇒　できません。

#はじめに

以前、以下の記事を書いた。
[DCGANでCIFAR10の画像が生成できるか　⇒　できません。](https://qiita.com/enoughspacefor/items/29e6c3377d844d515bca)

最近、以下の論文が出ているようで、、、
『Transgan: Two transformers can make one strong gan』
https://arxiv.org/abs/2102.07074

Jiang, Yifan, Shiyu Chang, and Zhangyang Wang. "Transgan: Two transformers can make one strong gan." arXiv preprint arXiv:2102.07074 (2021).

内容を確認した。

#確認の結果:no_good::no_good::no_good::no_good::no_good::no_good::no_good:

↓論文の図抜粋。
全然ダメ。0点。:no_good::no_good::no_good::no_good::no_good::no_good::no_good:　⇒　**できません。**
なぜ、すべての画像が破綻しているのか、、、ちょっと、がっかり。**今後に期待！！！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/47e8506f-47d2-69fc-c15a-9349fc13d486.png)

#まとめ
特にありません。


# 補足(20220829)
Stable Diffusion というのが、最近流行っており、Google.colabとかだと誰でも直ぐに試せますか、
そこで生成される写真（画像）の
特に、生き物（人や動物）の様子を見て頂けるとGANの現在の状況がわかると思います。
全然、いい感じで生成できていません。