OmniAICreator/Qiita-1.07M huggingface dataset:
ワイ「Denoってなんぞや？」

# 🦕「やあ」
ワイ「前回はNode.jsについて知見を得たな」
ワイ「どんどん最強ぷよぐらまに近づいてまうで＾＾」
🦕「やあ」
ワイ「急になんやこの恐竜」
ワイ「某J民か？」
🦕「あんなのと一緒にしないでよ」
🦕「僕は**Deno**だよ」
ワイ「誰だよ（ピネ」
🦕「**Node.js**の親戚みたいなものさ」
ワイ「Node.jsくんにも親戚がおったんか」
ワイ「初耳やわ（ﾊﾅﾎｼﾞ」

# 🦕「Denoについて」
![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379533/2a04d4c0-7418-5070-e5f0-01407108cc08.png)
🦕「Node.jsのついでに知ってもらおうと思って」
🦕「今ここにいるんだ」
ワイ「ほーん　しゃあない聞いたるわ」
🦕「......」
🦕「**Deno(ディーノ)** はRyan Dahlによって作られた比較的新しいJavascript/Typescriptランタイムだよ」
ワイ「誰やその人」
🦕「**Node.js** を作った人だよ」
ワイ「なんやおんなじ人か」
ワイ「だから親戚なんやな」
🦕「ちなみにDenoはNodeのアナグラムだよ」
ワイ「でもNode.jsがすでにあるのにわざわざ新しいのを作ったんや？」
🦕「それはRyan DahlがNode.jsの開発において10個の後悔があって」
🦕「その反省を活かして開発されたのがDenoなんだ」
ワイ「完璧主義やったんやろか」

# ワイ「とりあえず使ってみるか」
ワイ「とりあえず使ってみるで」
🦕「インストールは[ここ](https://deno.land/#installation)に書いてるよ」
ワイ「ワイはWindowsを使ってるからPowerShellからインスコすればええんやな」
ワイ「楽な時代になったもんやで＾＾」
```powershell:PowerShell
iwr https://deno.land/install.ps1 -useb | iex
```
ワイ「これやな」
ワイ「インスコ完了や」
🦕「まずはサンプルを実行してみよう！」
```powershell:PowerShell
deno run https://deno.land/std/examples/welcome.ts
```
🦕「コマンドはこれだよ」
ワイ「オンライン上のファイルをそのまま実行できるんか便利やな」
ワイ「実行してみたで」
```powershell:PowerShell
Download https://deno.land/std/examples/welcome.ts
Warning Implicitly using latest version (0.126.0) for https://deno.land/std/examples/welcome.ts
Download https://deno.land/std@0.126.0/examples/welcome.ts
Check https://deno.land/std/examples/welcome.ts
Welcome to Deno!
```
🦕「無事成功だね」

# 🦕「僕の特徴について」
🦕「ここまでで早速Denoの特徴があったんだけどなにかわかる？」
ワイ「わからん（即答」
🦕「......」
🦕「正解は**デフォルトでTypescriptに対応してる**点だよ」
ワイ「確かに実行したファイルの拡張子は **.ts**になってるな」
ワイ「Node.jsでのTypescript開発やったらパッケージ必須やったもんな」
🦕「まだまだあるよ」
🦕「このコードを実行してみて」
```ts:test.ts
import { serve } from "https://deno.land/std@0.126.0/http/server.ts";

console.log("http://localhost:8000/");
serve((req) => new Response("Hello World\n"), { port: 8000 });
```
```powershell:PowerShell
deno run .\test.ts
```
```powershell:PowerShell 結果
Download https://deno.land/std@0.126.0/http/server.ts
Download https://deno.land/std@0.126.0/async/mod.ts
Download https://deno.land/std@0.126.0/async/deadline.ts
Download https://deno.land/std@0.126.0/async/debounce.ts
Download https://deno.land/std@0.126.0/async/deferred.ts
Download https://deno.land/std@0.126.0/async/delay.ts
Download https://deno.land/std@0.126.0/async/mux_async_iterator.ts
Download https://deno.land/std@0.126.0/async/pool.ts
Download https://deno.land/std@0.126.0/async/tee.ts
Check file:///C:/Users/kazum/Desktop/programings/typescript/dist.ts
http://localhost:8000/
⚠️  ️Deno requests net access to "0.0.0.0:8000". Run again with --allow-net to bypass this prompt.
   Allow? [y/n (y = yes allow, n = no deny)]  y
```
ワイ「なんか途中で許可を求めてきたな」
🦕「それが特徴**デフォルトでファイルやネットワークにアクセス出来ない**だよ」
ワイ「まあセキュリティが高なってるって訳やな」
ワイ「ていうか`import`もurlからになってるんやな」
🦕「それも大きな特徴の一つ**npm・requireの廃止**だよ」
🦕「わざわざ`npm install`をする必要がないんだ」
ワイ「それは便利な気がするなぁ」
![実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379533/1b427bb0-b554-22b0-5190-91ca2bab56ac.png)
ワイ「無事Hello Worldしてくれたな」

# ワイ「まとめやで」
ワイ「また一つ賢くなってしまったわ＾＾」
ワイ「今後はDenoがNode.jsを追い越したりするんかいな」
🦕「どうだろうね」
ワイ「いつか開発する機会があればDenoで開発しよかな」
🦕「......(絶対やらないじゃん」
Ruby の rescue の注意点

今更ながら Ruby技術者認定試験のGOLD を受けようと思い
模擬試験問題を解いていたところ...奇妙なコードに出くわした。
忘れると痛い目を見そうなので、ここに記述する

```ruby
begin
  'aaa'.bbbb
rescue
  puts "レスキュー出来たね"
end

#=> レスキュー出来たね
```

何も問題はない

```ruby
begin
  'aaa'.bbbb
rescue NoMethodError
  puts "レスキュー出来たね"
end

#=> レスキュー出来たね
```

これも問題ない
期待通りの動きである

```ruby
begin
  'aaa'.bbbb
rescue NameError
  puts "レスキュー出来たね"
end

#=> レスキュー出来たね
```

-  むむ？
    - エラーの種類が違うのでは？

```ruby
begin
  'aaa'.bbbb
rescue StandardError
  puts "ここには来ないよね？"
rescue NoMethodError
  puts "レスキュー出来たね"
end

#=> ここには来ないよね？
```

来てしまったのである
原因を追うと...

```
NoMethodError の親クラス = NameError
NameError の親クラス = StandardError
```

という事みたい。
トラップだな。気をつけないとね。
個人開発で初めてiOSアプリをリリースした話

# 目次
- [はじめに](#はじめに)
- [私のスキル](#私のスキル)
- [難しかった点](#難しかった点)
- [良かった点](#良かった点)
- [さいごに](#さいごに)

# はじめに
先日、初めて個人としてiOSアプリをリリースしました。
リリースまでの期間は約3ヶ月でした。まだまだ知らないことも多く、大変学びのある経験でした。
そこで今回は、リリースまでの過程で感じたことや気づいた点について書きました。
これから個人開発をしてみたい方、現在個人開発をしている方の役に立つかもしれません。

# 私のスキル
まずは簡単に私のスキルについて紹介します。
個人開発は前提知識がどれくらいあるかで難易度が変わるので、参考になれば幸いです。

- 現役のiOSエンジニア。iOSアプリの開発やリリース経験あり。
- 基礎的なSwiftの記法、Xcodeの使い方、リリース方法について理解している。
- エラーや分からない事があっても、検索等を駆使して多くの場合は解決できる。

# 難しかった点
①スケジュール管理が難しい
私の場合、基本的には平日仕事をしながら隙間時間で個人開発を進めていました。
基本的には仕事の状況を見ながら、ちょこちょこ進めていくのですが、時間の使い方が難しかったです。

個人開発はリリースするタイミングが完全に自分次第なので、
時間を割けず開発が長期間になってモチベーションが続かなくなったり、
反対に「早く出したい」という気持ちが先行してつい睡眠時間を削ってしまうこともありました。

実際にリリースして感じましたが、**開発ペースに波があることはあまり気にしなくて良いと思います。**良いものをしっかり考えて十分に時間をかけた方がユーザーに喜ばれるサービスになるはずです。

②デザインの難しさ
アプリをリリースする為には、App Storeに提出するスクリーンショットやアプリアイコン等の準備が必要になります。思っていたよりもこれらの準備に時間がかかりました。そして**デザインを自力で全てやろうとすると結構難しいです。**

私はデザインの知識がほとんどなく、ツールの使い方もあまり詳しくありませんでした。
私の場合は、デザイナーさんに依頼したり、便利なツールを駆使することでこれらを解決しました。
ココナラなどデザイナーさんに依頼できるサービスもあるので、上手に活用したいですね。

画面のデザインについても素人なので、どういう風にすべきかかなり悩みましたが、こちらはAppleの[Human Interface Guidlines](https://developer.apple.com/design/human-interface-guidelines/)や様々なアプリのUIを参考にしました。

アプリのUIについては、[Play](https://www.createwithplay.com/)というアプリで様々なUIをお試し作成しましたが、とても良いサービスなのでぜひ使ってみてください。

③細かい部分が気になる
開発を進めていると、既にできている箇所に対して「ボタンの配置を変えたい」「この機能も追加したい」という様な思いが出てくることがあります。こうなるといつまでもリリースまで辿り着けません。

もしアプリをリリースしたいと考えている方は以下の2点を意識すると良いです。

- 設計やデザイン、提供したい機能を明確にしてから実装する。最初にしっかり時間をかけた方が良いです。結果的に手戻りが減って早くリリースできます。
- 最低限の機能だけを実装する。まずはリリースして改善していく方がユーザーの反応も分かります。


④サービス名を考えるのが難しい
[サービス名考えてくれるサイト](https://namelix.com/)もあるので、必要に応じて活用すると良いです。

# 良かったこと
①自分が作ったアプリがApp Storeに並ぶ達成感を味わえる。自信になる
自分の作ったアプリがApp Storeに並ぶまでは数多くの壁があります。
アプリの企画・設計から開発、リリース審査に向けた対応など。個人開発ではこれらを一人で解決しながら進めていく必要があります。その為、無事に審査が通った時にはうれしくて感動します。そして**これらを成し遂げたということが自信になります。**

②とにかく楽しい
自分のペースで開発を進めたい。新しい技術を試したい。自分で考えたサービスを出してみたい。このような思いを持ったエンジニアにとって個人開発は最高です。
好きなだけコードを書けますし、どんな書き方も出来ます。**コードを書くのが好きな人だったら個人開発は楽しくて仕方ないです。**

③技術力がアップする
新しい技術を試したりリリースまでの準備をしていると必ず壁にぶつかります。
これらを自力で解決したり自分の頭で考えることで、**課題解決能力や開発の技術力が向上します。**
一人で全てやることでリリースまでの一連の流れをしっかり理解できますし、チーム開発のありがたさも感じます。

# さいごに
アプリの開発をひとりでやるのは大変な点もありますが、学びが多くエンジニアとしての自信にもなるのでかなりオススメです！
最後に私がリリースしたアプリのリンクを記載するので、もし興味をもってくださった方がいたら、覗いてみてください！

[DIG IT(ディグ イット)](https://apps.apple.com/jp/app/dig-it-%E3%83%87%E3%82%A3%E3%82%B0-%E3%82%A4%E3%83%83%E3%83%88/id1577661221)
M1のMacにMysqlをインストールしようとしたらエラーが出た件

HomebrewでMysqlをインストールしようとしたら以下のエラーが出た。

```
brew install mysql

curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)

Error: mysql: Failed to download resource "mysql"
Download failed: https://ghcr.io/v2/homebrew/core/mysql/blobs/sha256:5f6efe3a8985554faf3c5a2f74e1029971d7fbebb13922aae117cffd7bdeba58
```


## 解決策

```
brew install openssl
```

以上。
【AndroidStudio】xmlにあるandroidとかtoolsとかappの違いって何？

# xmlにあるandroidとかtoolsとかappの違い
xmlには以下の画像のようにandroidとかappとかtoolsという名前空間？が存在します。
これらは何を表していて、お互いどのように違うのでしょうか。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/3b317fd4-158e-0c8e-d51a-7fe90b5b0c87.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/8b085e35-442c-2f16-46d0-0e1936112a5b.png" width=50%>

# 調べる
調べてみるとtoolsに関しては公式ドキュメントで以下の通りに説明されていました。
>Android Studio では tools 名前空間でさまざまな XML 属性がサポートされており、これを使用して設計時の機能（フラグメントに表示するレイアウトの選択など）やコンパイル時の動作（XML リソースに適用する圧縮モードの選択など）を有効にできます。これらの XML 属性はアプリのビルド時にビルドツールによって削除されるため、APK のサイズと実行時の動作には影響しません。
これらの XML 属性を使用するには、次のように、それらを使用する各 XML ファイルのルート要素に tools 名前空間を追加します。

参考：[ツール属性のリファレンス](https://developer.android.com/studio/write/tool-attributes?hl=ja)


# 先輩に聞く
しかし他については分からなかったので先輩に聞くと次のような
大変わかりやすい回答が得られました。

> 
- android : View毎の属性（オプション？）を設定するときに指定する
- app : 上記に加えて、カスタムViewを作った際にattr.xmlで定義した属性を設定するときに指定する
- tools : 主にプレビューウィンドウで確認したい属性を設定するときに指定する

わかりやすっ！！
40 代おっさん GASのGmailThreadクラスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## GmailThreadクラス

GmailThreadクラスとは
スレッドを扱う機能を提供するクラス

＊GmailThreadクラスの図は、参考資料の本を見ていただくか、ネットで調べください。

ちなみにこちらで書いてありました。
<https://for-dummies.net/gas-noobs/gas-japanese-reference-for-gmail/>

### スレッドを操作する

GmailThreadクラスを使って、重要マークを付与、ゴミ箱に移動するなど操作することができる。

お試し

```javascript
function tosiki() {
  const query = 'subject:スレッドとメッセージを確認する';
  const threads = GmailApp.search(query, 0, 1);

  threads[0].markImportant();
  threads[0].markUnread();
  threads[0].moveToInbox();
}
```

検索などで配列として収得したスレッドの集合に対して操作する場合

```javascript
function tosiki() {
  const query = 'subject:スレッドとメッセージを確認する';
  const threads = GmailApp.search(query, 0, 1);

  GmailApp.markThreadsImportant(threads);
  GmailApp.markThreadsUnimportant(threads);
  GmailApp.moveThreadsToInbox(threads);
}
```

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
バックマージとは。具体的に理解する。

「バックマージって分かる？」と言われ、
混乱したので、具体的に理解するためのメモ。

## バックマージの理解
![F58D2091-0350-465B-8AA0-AE393467C7A9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1394199/76d00944-ad5d-ac94-fbb4-80ed4729695a.jpeg)

developからmasterへの方向がフォワードで、
masterからdevelopへの方向がバックということで、
hotfixが発生した場合、
masterが前の方向でmasterより後ろの方向にあるのがhotfix、
hotfixより後ろの方向にあるのがdevelopとなる。

developからmasterにマージすること（通常のマージ）を単にマージと言っていて、（フォワードマージと言う時もあるらしい）
hotfixからdevelopにマージすることをバックマージと言っている。

hotfixは、緊急対応用のブランチなので、
masterからブランチを切ってくるので、緊急対応後、masterに反映するだけでなく、
developにも反映する必要が発生する、ということで、
このhotfixの文脈でバックマージという言葉がよく出てくる。

フォワードかバックかは、単に方向についての言い方というだけなので、
developからfeatureのブランチにマージする時も、バックマージという。

### さいごに
自分はバックマージという言い方を使ったことがなかったので、なにそれ？となったが、
hotfix -> develop や develop -> feature/XXXX　のことを丁寧に名前つけただけだと分かれば、何も怖くない。

## 参考

 * [What is a back-merge](https://stackoverflow.com/questions/47555448/what-is-a-back-merge)
 * [【Git】git-flowを知ろう！　利用時のルールについて](https://cloudsmith.co.jp/blog/efficient/2020/08/1534208.html)
SVG イメージを JavaScript から保存する方法

[GitHub に Mermaid がサポートされるようになった](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/
)ので、マークダウン中にいい感じのグラフを描画できるようになりましたね。
しかし、 Mermaid で作成される画像は SVG 形式なので、ブラウザからだと「名前をつけて画像を保存」ができません。

この記事は、いい感じの図ができたから Slack で共有しようと思ったのに、保存できなくて焦った人など向けに作ったものです。
最後の方でブラウザの開発者ツールの話が出ますが、そこから HTML 文書をコピペするだけでいいのでは? と思いつく方は対象にしておりません。

# TL;DR

サンプルが以下です。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="qBVKoNP" data-user="aster-mnch" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/aster-mnch/pen/qBVKoNP">
  Download SVG</a> by Kitagawa (<a href="https://codepen.io/aster-mnch">@aster-mnch</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

保存処理だけを抜き出したのが以下です。

```javascript
function downloadSvg(svgNode, filename) {
  const svgText = new XMLSerializer().serializeToString(svgNode);
  const svgBlob = new Blob([svgText], { type: 'image/svg+xml' });
  const svgUrl = URL.createObjectURL(svgBlob);

  const a = document.createElement('a');
  a.href = svgUrl;
  a.download = filename;

  document.body.appendChild(a);
  a.click();

  document.body.removeChild(a);
  URL.revokeObjectURL(svgUrl);
}
```

# 説明

## 対象の SVG テキストを取得

```javascript
const svgText = new XMLSerializer().serializeToString(svgNode);
```

ファイル保存するために SVG テキストデータを取得する必要がありますが、単純に `.toString()` としても `'[object SVGSVGElement]'` しか返ってきません。
そのため [XMLSerializer.serializeToString()](https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer/serializeToString) を使って文字列として取得します。

## 保存用の Blob オブジェクトを作成

```javascript
const svgBlob = new Blob([svgText], { type: 'image/svg+xml' });
const svgUrl = URL.createObjectURL(svgBlob);

// ...

URL.revokeObjectURL(svgUrl);
```

先で取得した SVG テキストをファイル形式で保存するために Blob オブジェクトを作成します。
作成した Blob から [URL.createObjectURL()](https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL) でダウンロード用の URL を作成することができます。
この URL はスコープを抜けても解放されないので、不要になったら [URL.revokeObjectURL()](https://developer.mozilla.org/ja/docs/Web/API/URL/revokeObjectURL) で解放しましょう。

## a 要素を使ったダウンロード処理

```javascript
const a = document.createElement('a');
a.href = svgUrl;
a.download = filename;

document.body.appendChild(a);
a.click();

document.body.removeChild(a);
```

最後に、作成した Blob URL からファイルをダウンロードできるように `a` 要素を使います。
`download` 属性を使うことで、 `href` に指定した URL からファイルをダウンロードすることができます。
また、 Blob URL と同様に、 `document.body.appendChild` で追加したノードはドキュメントに紐づいているため、スコープを抜ける前に `document.body.removeChild` で削除しましょう。

# おまけ

保存したい対象の SVG 要素を選択する場合は、一から作るか [document.getElementById()](https://developer.mozilla.org/ja/docs/Web/API/Document/getElementById) や [document.querySelector()](https://developer.mozilla.org/ja/docs/Web/API/Document/querySelector) を使う必要がありますが、ブラウザのコンソールから `$0` を使うと要素で直前に選択したノードを使用することができます。

![ブラウザコンソール_$0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158991/6a8cf7a2-8108-2230-455e-c483c53aa076.png)
MacBookPro初期設定（2022.02）


PC初期設定、2022年版。
前回記事は[こちら](https://qiita.com/mazeltov7/items/6fb9b4a8d96400dae67f)。
前回とそんなに変わらないが、後半が差分。


- キーボード
  - CapsLockをCtrに。（キーボード→修飾キー）
  - cmd + spaceで言語切替、ctr + spaceでspotlight
  - ショートカットの入力ソースの「前の入力ソースを選択」をcmd + space
  - 切り替えると、かぶってアラート出るので、それをctr + spaceに。
  - option + tabで同じアプリ内ウィンドウ切り替えを可能にする（[参考](https://qiita.com/Yinaura/items/10fe5fe0cb0a795a0f58)）
- トラックパッド
  - タップクリックはしない
  - 軌跡の速さは早めに
- Dock
  - 画面上の位置を左に変更
  - Dockを自動的に隠す/表示にチェック
- Finder
  - サイドバーで、マイファイル消して、その他適宜入れる
  - 詳細で、「すべてのファイル名拡張子を表示」にチェック
- 日付と時刻
  - 「日付を表示」にチェック
- .sshなどのドットファイル系を入れる
    - dropboxに入れてるのでそこから引っ張る。


ここからコマンドで。ターミナルで、brew入れる。

```
# brewのインストール
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

# brew file インストール
$ brew install rcmdnk/file/brew-file
```
brew fileについてはこちらのdocument参照。
https://homebrew-file.readthedocs.io/en/latest/getting_started.html

githubと連携させてよしなに対応。
ぼくのBrewfileはこちら。
https://github.com/mazeltov7/Brewfile

前回はfishにしたけど、今回はzshで。

メモ
https://ohmyz.sh/ 入れる

メモ用にnotionのmac appを入れる。

node入れておく。

```
// zshインストール
// デフォで入ってるが、brewで入れとく
$ brew install zsh zsh-completions 

// oh-my-zshインストール
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 
// 確認
$ echo $SHELL
$ less /etc/shells
$ vim /etc/shells // 一番下に/usr/local/bin/zshを入れる
// ターミナル再起動して、下記実行
$ chsh -s $(which zsh)
// 設定入れる
$ vim ~/.zshrc 
```

あとは適宜、ruby, node, etc、エディタ入れていく。
今回はnodeを入れた。

```
$ brew install nvm
$  mkdir .nvm
$ vim .zshrc # 以下を追加
  export NVM_DIR="$HOME/.nvm"
  . "$(brew --prefix nvm)/nvm.sh"
  
$ nvm ls # ローカルに入ってるnodeを一応確認
$ nvm ls-remote # リモートのnodeバージョン確認
$ nvm install OOO # 希望のバージョンをインストール
$ node -v
```
【Appium】自動テストがしたいのにAndroid Chromeのようこそ画面が邪魔

## 事の発端

業務でウェブアプリの自動テストの需要が高まってきたので、Appiumの環境構築をして動作確認をしていた時の話です。

なんとかPC版Chromeで動作するようになったので、じゃあAndroid実機でも！と思い実行。

<img width="400" alt="Welcome" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2536422/cec754de-5c27-f3f5-ca7d-5c10c7cc1091.png">

**これじゃテスト動かんやん！なんでや！！**

でも新品の端末買ってきた、みたいな新鮮さだけはある。

【環境】
- Mac OS 12.2.1
- Android 12(実機Pixel 3a)
- Appium 1.22.2（CUI）
- Python3.6

## 解決法

capabilitiesに`appPackage`と`appActivity`ではなく、`browserName`を使用する。

```python
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4723/wd/hub',
    desired_capabilities={
        'platformName': 'Android',
        'platformVersion': '12',
        'deviceName': 'Pixel 3a',
        'browserName': 'Chrome', # 必須
        # 'appPackage': 'com.android.chrome', # NG
        # 'appActivity': 'com.google.android.apps.chrome.Main', # NG
        'chromeOptions': {
            'w3c': False,
        },
    })
```

## 原因

[GitHubのIssue](https://github.com/appium/appium/issues/6618#issuecomment-274491707)が参考になりました。

> When browser name is not strictly equals one from CHROME_BROWSERS array Appium 1.5+ is using ADB instead of Chromedriver and this is why we get such strange screenshots. Appium 1.4 contrarily was matching Chrome by app package name and this is why it worker with any browser name capability. So to solve this issue you just need to change browser name to one from the list above.

Appium 1.4まではパッケージ名を指定してましたが、1.5以降はブラウザ名を指定するようになっていると。パッケージ名が指定されているとchromedriverでなくADB経由でchromeを起動するので、welcomeページが表示される…みたいです（解釈合ってます？）。

調べたら`'chromeOptions': {'args': ['--disable-fre']}`をつけるとか、色々見つかったんですが、私の場合効果はなかったです。

ネイティブアプリでの構築記事を参考にしたのがまずかったか。。appActivityの設定が悪いのかと思い、随分遠回りしましたが、なんとかなりました。**ようこそページの操作も自動化する…なんて力技をしなくてよかったです。**
Ubuntu Server 20.04.3 LTS 構築#18 アカウント設定

実施日:2022/02/22～23

<<今回の内容>>
･アカウント追加とsudo権限付与

#アカウント追加
先日、作成したアカウントでterminalが起動しなくなったため、アカウントを作成後、terminalが起動したときの話です。

```
#下記のコマンドを実行するとアカウントが作成できます。
sudo adduser 作成するユーザー名
新しいパスワードを入力
```
しかし、これだけだとログインは出来ますが、terminal上でsudo権限で何かしようにもsudoグループに入っていないため
必要な作業が出来ません。

#sudo権限付与

```
#sudo権限付与には下記のコマンドを実施する必要があります。
usermod -aG sudo ユーザー名
※他に追加したいグループがあればsudoの箇所を追加したいグループ名を入力して実行。

#追加されたかの確認は下記のコマンドで確認が出来ます。
sudo whoami

#再起動して、ログインすればsudoコマンドが使用可能になります。
```

以上です。
AWS SAP(ソリューションアーキテクト プロフェッショナル）受験記

# この記事について
AWS認定のSAP（ソリューションアーキテクト-プロフェッショナル）に合格したので、そこに至るまでの対策等を紹介していきます。

# 前提
AWS認定で、既に所持している資格

- CLF
- SAA
- SOA
- DAV

SOAとSAAは取得後、2年経過してるので、記憶が薄いです。
実務では、CFを使った環境構築、サーバーレスのWebアプリの環境構築を主としています。

# 受験までの流れ
2021/09: CLF, DAV取得。流れでSAPも勉強開始
2021/11 ~ 2021/12: 問題集を解いていると眠くなる病にかかり、勉強やめる
2022/01: SAPの試験予約 & 勉強再開
2022/02: 受験
実質的な勉強してた期間は1.5ヶ月ほどです。

# 試験対策
## 1. SAP試験対策本
唯一の対策本で、問題も良いと感じました。
特に模擬問題は本番と同じく７５問あるので、どれくらい時間がかかるのかといった所の把握にも繋がりました。

https://www.amazon.co.jp/gp/product/B08F9CQ6LT/

模擬問題より前の章は2021/10中に一周しました。その後、サボってたので若干頭から抜けてました…
模擬問題は2回行いました。周回で２時間はかかるので集中できる環境をきちんと作った方が良いです。
1周目: 受験2週間前くらいに環境を整えて実施。正答率が6割程度。
2周目: 受験4日前に実施。正答率が8割程度。

## ２． AWS問題集
ちょっとお値段は張りますが、回答の説明についても丁寧に記述されており、かなり有用でした。

[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com)

金銭的に厳しいといったことがあれば、Udemy等にある英語版の問題集を翻訳するのも良いと思います。
こちらは、１日５本ペースで解いてました。

## 3. 認定公式ページのサンプル問題
下のほうにある「試験の復習」にサンプル問題があります。試験ガイド等もあるのでぜひ読んでおきましょう。

[AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)

## 4. 模擬試験
昔は有料でしたが、今は無料で受けられるので敷居が下がりました。
１回受けてみて、8割程度の正当でした。

[スキルビルダー](https://explore.skillbuilder.aws/learn/course/external/view/elearning/9159/aws-certification-official-practice-question-sets-japanese)

## 5. Blackbelt
問題集等を解いていて、わからないなというサービスを中心に読んでいくことで理解が深められます。

[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

私の場合はネットワーク周りのサービスへの理解が不足していたので、そのあたりを重点的に読み漁りました。

# 試験当日
模擬問題で2時間程度かかったので、本番は丸々時間を使い切るだろうと予測をしています。
直近の模擬試験が8割だったので、受かる自信はあまりなかったです。
### 試験を迎える直前
- しっかりと睡眠・食事を取っておく
    - 体が資本の試験なので…
- 飲み物は試験数時間前から控える
    - 試験が始まると、トイレにいけないので集中力を維持するためにも重要
- 栄養ドリンクを直前に飲んでおく
    - 試験のときはいつも飲んでますが、今回はお高いのにしました
    
### 試験中
- 用意されている耳栓を使う
    - できるだけ集中したい
- 見直しフラグはどんどんつける
    - わからない所・ちょっと不安なところは後で見直せるように
- 1時間に1回程度は、足を動かしたり伸びをしたりする
    - 長丁場なので集中力が落ちてくる
    - 体も痛くなる

問題１周に２時間半ほど使ったので、見直しに使える時間は３０分ほど。
見直しのペース配分を間違えて、終盤の問題は時間が足りずに見直しできませんでした…

わからない問題が５問程度、ふんわりとした問題が１０問程度という感覚だったのですが、どうにか受かっててよかったです。

# さいごに

### 勉強期間について
長文が並んでいるせいか勉強中は眠気との戦いで、ペースよく勉強できているのかわからず焦りました。
blackbeltを読んでサービスの仕様を理解するのは大事だと思いました。

### 試験について
試験中は座ったまま3時間というのは、体的にしんどかったです…
環境の違いか、栄養ドリンクのおかげかわからないですが、集中は出来たかなと思います。
集中しないと時間内に解ききれないなんて事もありそうなので、テストセンターで受るほうが良いと思います。
それでも、ペース配分はしっかり考えておくほうが焦らなくて良いかなと思いました。

AWS認定の中ではしんどいと思われる試験に受かったので、かなりスッキリです。
Linux 最低限覚えておくべきの基本コマンド

<h1>Linuxの最低限覚えておいたほうがいい基本コマンド</h1>
<p>WEBサービスを開発する際に最低限覚えておいた方がいいLinuxコマンドや知識についてご紹介します。</p>

<h1>Linuxを触る前の前提知識</h1>

<h2>絶対パス・相対パスの違い</h2>

<b>・絶対パスとは</b>
<p>　　絶対パスとは、今いるカレントディレクトリまでのパスを全て表示するものです</p>
<p>（例）</p>
<p>Users/ホームディレクトリ/フォルダ/今作業をしているフォルダ</p>
　　
<b>・相対パスとは</b>
<p>相対パスとは、今作業をしているフォルダを起点に対象のディレクトリを考えるのが相対パスになる</p>


https://techacademy.jp/magazine/5801#sec1

<h2>Linuxの仕組みと流れ</h2>
<p>Linuxはユーザーがコマンド入力をし → シェルでコマンドの解釈をし → LinuxOSに行き → シェルで命令を実行し → 実行結果がユーザーに届きます</p>




<h1>Linuxの基本コマンド</h1>
<p>Linuxの基本コマンド①〜⑩</p>

<h2>①今いるフォルダのファイルやフォルダを表示してくれるコマンド</h2>
```
$ ls
```


<h2>②今 自分がいるディレクトリを絶対パスで表示してくれるコマンド</h2>
```
$ pwd
```

<h2>③ディレクトリ移動するためのコマンド</h2>
```
$ cd ファイル名
```

<h2>④フォルダの作成するコマンド</h2>
```
$ mkdir フォルダ名
```
<p>「フォルダ名」のところには自分が作成したいフォルダの名前を入力する事。</p>

<h2>⑤ファイルを作れる（タッチコマンド）</h2>
```
$ touch ファイル名
```
<p>「ファイル名」のところには自分が作成したいフォルダの名前を入力する事。</p>

<h2>⑥ファイルに文字を書き込む</h2>
```
$ echo 'Hollo' > ファイル名
```
<p>echoは文字を書き込む際に使用する。' 'の中に書き込みたい文字列を書き込む。ファイル名は書き込みたいファイル名を指定する。</p>

<h2>⑦指定したファイルの中身を見たい（書き込んである文言を見たい）</h2>
```
$ cat ファイル名
```

<h2>⑧ファイルの中身をみたい場合</h2>
```
$ lees ファイル名
```
<p>⑦のcatと似ているがleesコマンドはフォルダの中身のみを全画面で表示してくれる。なので、ファイルの中の文章が多いときに使うと便利である。</p>

<p>※qを押すと全画面から抜けれる</p>

<h2>⑨Moveコマンド（ファイルの名前変更ときなどに使用）</h2>
```
$ mv 現在のファイル名 変更したいファイル名
```
<p>（例）file → file1 に変更するときの例</p>
<p>mv file file1</p>

<h2>⑩指定したファイルを削除</h2>
```
$ rm ファイル名
```

<p>「ファイル名」のところには自分が削除したいフォルダの名前を入力する事。</p>
【rails】機能削除等で不要なテーブルが出てきた時の対応

はじめに
-
不要な機能削除が発生した際に、その機能でしか使ってなかったようなテーブルがあった場合は原則削除したほうがよいと思う。不要なソースコードやテーブルが残っていると混乱を招くだけなので。(ただし、なにかしらの理由で残しておいたほうがいい場合を除く）

ただし、いきなり削除すると問題があった時に面倒なので、いったんrenameしてアクセスできなくして、しばらく運用して問題なければdumpをとって削除する。万が一問題があったら元のテーブル名に戻す。

注意
-
プロジェクトごとにやり方があると思うので、あくまで参考程度にしてください。

手順
- 
### 不要な機能の削除方法

- 不要な機能のソースコードを削除する
    - 別の場所で共通で使っている部分がある場合があるので注意する
- 不要な機能の削除に関わるspecを削除する

### テーブルのrename

- codeを全検索して model が使われていないことを確認する
- テーブルをrenameするmigrationファイルを作成する
    - no_more_use_<元のテーブル名>のような名前にすると、もう使わないテーブルってことがわかるのでよさそう。
    - [https://engineering.mercari.com/blog/entry/2017-05-26-104104/](https://engineering.mercari.com/blog/entry/2017-05-26-104104/)
- ローカルでrails db:migrateして、ローカルDBにrenameを反映する
- ローカルで動作確認する
- テストが通ることを確認する
- stagingデプロイして動作確認する
- 本番デプロイし問題がないか監視する

### 本番DB反映後、問題なかった場合

- １ヶ月くらい運用してみて、問題がなさそうであれば念の為dumpをとってテーブルを削除する


### 本番DB反映後、renameによる問題が発生した場合

- railsのmigration機能を使っている場合、本番DBでは`rails db:rollback`しないこと （migrationのstatusとの整合性など、色々ややこしいことになる）
- まず発生している問題が本当にrenameによるものかしっかり調査する。
- 問題の原因がrenameによるものであると決まった場合、developからfeatureブランチをきって、元のテーブル名に戻すmigrationファイルを作成する
- 問題が解決しているか確認する
Java: WebSphereでデータベースとのコネクションリークを検出する

# 概要

データベースとのコネクションリーク(接続の解放漏れ)が疑われる場合、問題の処理を特定するにはどうすればよいでしょうか。WebSphere上にデプロイしているアプリケーションの場合、管理コンソールからログレベルを上げることで、問題の処理を特定できる可能性があります。

# 手順

1. WebSphereの管理コンソールにて、 トラブルシューティング > ログおよびトレース > (サーバー名称) > ログ詳細レベルの変更 を選択する
1. 初期状態では `*=info` が指定されているはず。末尾に `:ConnLeakLogic=finest` を追加する
1. `*=info: ConnLeakLogic=finest` と入力したことを確認する
1. 設定の反映のために、サーバーを再起動する

# 結果

`$WAS_HOME/Profiles/node/logs/%Server_Name%/trace.log` を確認します。

たとえば、コネクションリークによるコネクションプールの枯渇が発生している場合、下記のようなStackTraceが出力されます。既定では、10秒以上使用されているデータベース接続を出力するようです。

```
000000xx FreePool      E   J2CA0045E: リソース jdbc/xxx に対してメソッド createOrWaitForConnection を呼び出しているとき、接続が利用不能でした。
000000xx ConnLeakLogic 3   Dumping initial request stack traces
000000xx ConnLeakLogic 3   MCWrapper id xxxxxxxx  Managed connection WSRdbManagedConnectionImpl@57055705  State:STATE_ACTIVE_INUSE Thread Id: 000000xx Thread Name: Thread-xx Handle count 1
in-use for 720000ms
java.lang.Throwable
at com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:899)
at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:668)
at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:635)
at (以下略)
```

# 参考URL

- [How to Locate Connection Leak in Websphere](http://www.oracledbasupport.co.uk/how-to-locate-connection-leak-in-websphere/)
- [ログ・レベル設定 - IBM Documentation](https://www.ibm.com/docs/ja/was/9.0.5?topic=console-log-level-settings)
- [How to troubleshoot J2CA0045E connection pooling problems - IBM Support](https://www.ibm.com/support/pages/how-troubleshoot-j2ca0045e-connection-pooling-problems)
Vivliostyle-CLIでリストをファイルツリーとして描画する


Markdownのリストとして記述された要素を、ファイルツリーとして描画するCSSのサンプルです。
カスタムデータ属性をキャプションとして使用する方法は、テーブル要素にも応用できるかもしれません。

[CSSのみで作る見やすいファイルツリー](https://www.conifer.jp/csstest/file-tree/index.html)を参考にアイコンの削除、px指定をem指定に変更しました。

# 描画結果

![スクリーンショット 2022-02-23 20.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57548/4b0ada9d-a297-7c2a-5203-e57901317a82.png)

# ソースコード

```markdown
<div class="tree" data-caption="図1 ファイル構成">

* root
  * sub1
    * file1.txt
    * file2.txt
  * sub2
    * file3.txt
  * sub3
    * sub3a
      * sub3b

</div>
```

```css
 .tree {
   position: relative;
   background: white;
   margin:0 0 0 2em;
   font-family: 'Roboto Mono', monospace;
   font-size: .85em;
   font-weight: 400;
   line-height: 1.5;
   color: #212529;
   border: solid 1px #666;
   padding: 1em;
 }

 .tree::after {
   content: attr(data-caption);
   text-align: center;
   bottom: -1.5em;
   width: 100%;
   position: absolute;
 }

 .tree ul {
   padding-left: 1em;
   list-style: none;
 }
 .tree ul li {
   position: relative;
   padding-top: 0.25em;
   padding-bottom: 0.25em;
   padding-left: 1em;
   box-sizing: border-box;
 }
 .tree ul li:before {
   position: absolute;
   top: 1.1em;
   left: 0;
   width: 0.7em;
   height: 1px;
   margin: auto;
   content: '';
   background-color: #666;
 }
 .tree ul li:after {
   position: absolute;
   top: 0;
   bottom: 0;
   left: 0;
   width: 1px;
   height: 100%;
   content: '';
   background-color: #666;
 }
 .tree ul li:last-child:after {
   height: 1.1em;
 }
```
.ps1を非表示で常駐(service化)する方法

ローカル環境：windows 10
リモート環境：Centos 7

この記事はpowershellを非表示でバックグラウンド実行させっぱなしにする方法です。

#何ができるか
.ps1スクリプトを走らせっぱなしにしておくと、最小化してもタスクバーに残るので邪魔です。PC起動時に画面を開かずserviceとしてpowershell実行します。

筆者はsshポートフォワーディングをこれで行うことで、リモート環境のjupyterを開いたりします。なお、画面を開かないのでこれで起動したpowershellに対話的な入力はできません。

#やり方
.ps1をpowershellの引数と与えサービスとして登録します。
(sshポートフォワーディングを例にしていますが、ほかのことにも使えそうです)

■GUIのあるソフトウェアをサービス化する
・https://nssm.cc/download からLatest release 2014年のもの(古くても大丈夫)をダウンロード。
・解凍してnssm-2.24\nssm-2.24\win64\nssm.exe を
・環境変数Pathに設定されているフォルダに入れる
・管理者でpowershell起動 (以下、説明画像あり)
・「nssm install 任意のサービス名」と叩く。
・「任意のサービス名」はこの後使うので覚えておく。
・立ち上がったUIで
　　「Path」：Powershellの.exeファイル
　　「Startup directory」：任意の作業ディレクトリ
　　「Arguments」：任意の.ps1ファイル
　　「install service」を押す(説明画像ここまで)
![sshポートフォワーディングするps1スクリプトをサービス化-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/e6cbcdaf-7553-851b-9293-5d6d6c20e62a.jpeg)


■サービスを実行するアカウントに対し「サービスとしてログイン」を許可する。
※理由はポートフォワーディングがLocal Systemの権限ではできないため。ユーザーアカウントでサービスを動かす。
・グループポリシーエディタを開くWin+R「gpedit.msc」
※グループポリシーエディタがない場合
　(https://itojisan.xyz/trouble/17155/ で配っている「gpedit.bat」でグループポリシーエディタをインストールできる。
・グループポリシーエディタで以下を編集(以下、説明画像あり)
　コンピューターの構成 > Windows 設定 > セキュリティ 設定 > Local Policies > User Rights Assignment
　　サービスとしてログオン のプロパティ
　　　　「ユーザーまたはグループの追加」：ボタンを押す
　　　　　　「選択するオブジェクト名を入れてください」：アカウント名を入力
　　　　　　「名前の解決」：ボタンを押す
　　「OK」「OK」、全てのウィンドウを閉じる。
・これで「サービスとしてログイン」の許可は完了。(説明画像ここまで)
![sshポートフォワーディングするps1スクリプトをサービス化-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/da13154f-9d50-8f67-2cad-eceed3c25190.jpeg)



■サービスを実行するアカウントを設定する
・「サービス」を開く(以下、説明画像あり)
・登録した「任意のサービス名」のプロパティを開く
・ログオン(タブ) > アカウント > 参照
　　「選択するオブジェクト名を入れてください」：アカウント名を入力
　　　　　　「名前の解決」：ボタンを押す
　　　　　　「OK」
　　「パスワード」：ログインに使っているもの入力
　　「パスワードの確認入力」：  〃
　　「OK」(説明画像ここまで)
・登録した「任意のサービス名」を右クリック > 「開始」
・.ps1が実行されている状態となる。

![sshポートフォワーディングするps1スクリプトをサービス化-03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/4c7ea417-a297-4289-e5a6-63d5772507ca.jpeg)

■powershellでps1を呼び出せるにしておく
サービス内部の処理で、サービスが停止してしまう場合は、
管理者権限のpowershellで
```powershell:管理者powershell
Set-ExecutionPolicy RemoteSigned
```
と叩いてps1の実行許可を恒久的に与えておく。

##.ps1のサービス化の作業はここまでで完了しています。あとは関連情報です。

■sshポートフォワーディングの確認方法
・powershellを開き
　「Test-NetConnection -ComputerName localhost -Port 8888」と叩くと
　成功：True 失敗: failed でポートフォワーディングできているか確認できる。


■個人的な味付けをする。
・サービスの再起動設定
　　「サービス」を開く
　　登録した「任意のサービス名」のプロパティを開く
　　・回復(タブ) でエラー時の挙動を設定できる

この記事は以上です。
Lightsailを使って立ち上げたWordPressをSSL化する

# はじめに
Lightsailを使ってWordPressを立ち上げ、静的IP、DNSの設定をしました。
……が、SSL化をしていなかった。。。
ということで、今回の記事ではLightsailを使って立ち上げたWordPressをSSL化していきます。


# Bitnami HTTPS Configuration Tool
このツールでできることは以下になります。

- Let’s Encrypt での証明書の取得
- HttpからHttpsへのリダイレクト
- non-wwwからwwwドメインへのリダイレクト
- cron での自動更新の設定

とっても便利そうですね…！今回はこのツールを使っていきます。


# Lightsail の WordPress をSSL化

インスタンスに入ります。

以下コマンドを実行します。
アップデートするか聞かれる場合があります。
聞かれた場合は、 "Y" を入力、実行し、再度以下のコマンドを実行します。

``` sh
sudo /opt/bitnami/bncert-tool
```

あとは確認項目に従って、内容を入力実行 or Y/nを入力実行していくだけです。
確認項目は以下です。

1. Domain listにドメインを入力
2. www.付きのドメインが含まれていないので対象に含めるかどうか
3. HTTPからHTTPSへのリダイレクトを有効にするかどうか
4. wwwなしのドメインからwwwありのドメインにリダイレクトするかどうか
5. wwwありのドメインからwwwなしのドメインにリダイレクトするかどうか
6. 設定内容が正しいかどうか
7. 証明書に関連付けるメールアドレスを入力
8. 契約内容に問題ないがないか
9. Enter押して完了

これでリンクにアクセスすると、さっきまではSSL化されていなかったページがSSL化されました🎉


# おわりに
これでようやく記事執筆に取り掛かれそうです。
Reactで覚えておきたいもの

## 環境まわり系

### yarnで実行

- yarn start サーバを起動する

### npmで実行

- PORT=3001 npm start ポートを指定しながら実行できる

## propsについて

渡し方は文字列、数字、配列、真偽値、コンポーネント、childrenがある
以下が例となる
page="about" number={1111} array={[1,2,3]} obj={{foo:"foo",bar:"bar"}} boolean={true} code={<code className={styles.code}>pages/about.js</code>}
apt-fileを実行してみる


#はじめに
apt-fileを実行してみるとどうなるのか確認してみる。

# 最終更新日
2022年2月23日

# 環境の情報
OS
Ubuntu2004

# 注意
最新の状態を確認して下さい。

#　公式はこちら

https://wiki.debian.org/apt-file


# 参考さま
https://atmarkit.itmedia.co.jp/ait/articles/1709/08/news020.html

# 実行

無い。

```
$ apt-file
コマンド 'apt-file' が見つかりません。次の方法でインストールできます:
sudo apt install apt-file
```

入れてみる。

```
$ sudo apt install apt-file
[sudo] user のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
The system-wide cache is empty. You may want to run 'apt-file update'
as root to update the cache.
man-db (2.9.1-1) のトリガを処理しています ...
```

入ったようだ。

```
$ apt-file -V
Unknown option: V

apt-file [options] action [pattern]
apt-file [options] -f action <file>
apt-file [options] -D action <debfile>

Pattern options:
================

    --fixed-string     -F               Do not expand pattern
    --from-deb         -D               Use file list of .deb package(s) as
                                        patterns; implies -F
    --from-file        -f               Read patterns from file(s), one per line
                                        (use '-' for stdin)
    --ignore-case      -i               Ignore case distinctions
    --regexp           -x               pattern is a regular expression
    --substring-match                   pattern is a substring (no glob/regex)


Search filter options:
======================

    --architecture     -a  <arch>       Use specific architecture [L]
    --index-names      -I  <names>      Only search indices listed in <names> [L]
    --filter-suites        <suites>     Only search indices for the listed <suites> [L]
                                        (E.g. "unstable")
    --filter-origins       <origins>    Only search indices from <origins> [L]
                                        (E.g. "Debian")

Other options:
==============

    --config           -c <file>        Parse the given APT config file [R]
    --option           -o <A::B>=<V>    Set the APT config option A::B to "V" [R]
    --package-only     -l               Only display packages name
    --verbose          -v               run in verbose mode [R]
    --help             -h               Show this help.
                       --               End of options (necessary if pattern
                                        starts with a '-')

[L]: Takes a comma-separated list of values.
[R]: The option can be used repeatedly

Action:
    list|show          <pattern>        List files in packages
    list-indices                        List indices configured in APT.
    search|find        <pattern>        Search files in packages
    update                              Fetch Contents files from apt-sources.


```

ファイル名を指定してパッケージを検索するというのをやってみる。
libmp3lame.so.0が収録されている、パッケージを探しているらしい。

```
$ apt-file search libmp3lame.so.0
Finding relevant cache files to search ...W: 
ターゲット Packages (stable/binary-amd64/Packages) は /etc/apt/sources.list:58 と /etc/apt/sources.list.d/docker.list:1 で複数回設定されています....
libmp3lame0: /usr/lib/x86_64-linux-gnu/libmp3lame.so.0
libmp3lame0: /usr/lib/x86_64-linux-gnu/libmp3lame.so.0.0.0

```

上手く見つかった！
AWS SAPを2回受験した感想

# 概要
AWS　SAP認定試験を受験し、2回目で合格しました。
どういう勉強をしたか、実際の試験の感触などを書いていこうと思います。

# 1回目

## 勉強で使用したもの

* 書籍の「AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説」
* 公式の試験復習というカテゴリで出来るサンプル問題と練習を実施
    * https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/

## 勉強方法

* とにかく書籍メインで勉強してました。わからないサービスはブラックベルト見て理解を深めるようにしたり
* 書籍やったあとにサンプル問題を実施。（点数が良くなく凹む）
* 受験最終週は問題をとにかく繰り返しやってました

## 結果

不合格でした。点数は731点。（合格点750点）
問題文が長くて読むのが苦痛で今回合格しなかったら諦めようと思ってたんですが、あと数問で受かったと思うと悔しくて堪らなかったのでもう一度受験を決意

## 感触

合格か不合格か自分の感覚ではわかりませんでした。
聞いたことないサービス名や、勉強してた時とは違う形でサービスについて問われたりで自信が持てない問題が結構あった気がします。

# 2回目

## 勉強で使用したもの

* 書籍の「AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説」
* AWSのサンプル問題がいっぱいある[koiwaのサイト](https://aws.koiwaclub.com)を使用
    * SAA受験の時にお世話になったサイトですが、個人的にはUIがいけてないと思ってたのと、SAPは問題文が長いのでそれを何百問もやってたら何ヶ月後に受験出来るかわかったもんじゃないという気持ちで使ってませんでした。ですが、あと少しの点数を埋める有力な手をこれしか思いつかなかったので再度有料会委員に。

## 勉強方法

* 書籍は忘れないように軽く目を通すくらいで使ってました。問題も答え見ながら知識を確認する感じで使ってました
* koiwaの方は上で述べた通り、現在登録されてる問題全てをやってたら時間が足りないので1セット7問の問題集25セット、計175問に絞って、それを2周解いて、最終週はすぐ答えモードにして問題集としてではなく、読み物として使ってました。

## 結果

1回目受けてから2週間後に再受験。そして無事合格しました！
ただスコアは768でだいぶギリギリ。。

## 感触

合格か不合格か自分の感覚ではわかりませんでした。
聞いたことないサービス名や、勉強してた時とは違う形でサービスについて問われたりで自信が持てない問題が結構あった気が。。と、1回目と同じ感触でした！

koiwaを新たにやったおかげで「これkoiwaでやったやつだ！」って何問か思うものはありましたが、自信ない問題の方が多かったです。なんか1回目より難しかった気がします。

# 最後に

全く知らないサービス名が出てくると辛いので、もしkoiwaやる人がいるなら答え見るだけでも良いから全部やった方が良いかもしれません。そして知らないサービスは調べると合格率は上がると思います。

一応私の1回目の勉強方法でも合格は可能だと思いますが、やはり出てくる問題に大きく影響されると思います。

なので、合格率を上げる為に色々な書籍や問題をやるのが良さそうです。
30,000円の受験費用と一度の試験で3時間の拘束時間を考えれば安い。。はず
[Oracle Integration] 統合におけるメタデータ

## 統合におけるメタデータ

OIC(Oracle Integration Cloud)の全ての統合に使用できるメタデータの一覧表をまとめた。

|名称|内容|サンプルデータ|
|---|---|---|
|integration.name|統合名称|Test Metadata|
|integration.identifier|統合ID（一意）|TEST_METADATA|
|integration.version|統合バージョン|01.00.0000|
|runtime.instanceId|インスタンスID（一意）|63200198|
|runtime.invokedBy|インスタンスの実行アカウント|aaaa@bbbb.com|
|environment.serviceInstanceName|OICインスタンス名称|xxxxxxx|
|environment.baseURL|OICインスタンスのベースURL|https://xxxxxxx.integration.ocp.oraclecloud.com:443/ic|

## 参考情報

* [Use Metadata in Integrations](https://docs.oracle.com/en/cloud/paas/integration-cloud/integrations-user/accessing-integration-metadata.html)
署名付き URL で Amazon S3 からダウンロードしてみた

# はじめに

[前回の記事](https://qiita.com/sugimount-a/items/247517c2ee39f0b15bf0)では、署名付きURL で S3 にファイルをアップロードする方法を確認しました。今回の記事では、ダウンロードする方法を確認しましょう。



# AWS マネージメントコンソール

前回アップロードしたファイルを選択して、Share with a presigned URL を選択します。

![image-20220223195050803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ae88731f-158f-974f-ff97-1b7a61a91e44.png)



有効期限を指定して、Create presigned URL を押します。

![image-20220223195151918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3cbcd9e1-5f0d-68c0-ec5f-ad9291439257.png)



マネージメントコンソールの画面上部に、通知が表示されます。Copy presigned URL を押します。

![image-20220223195213142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b286b242-bd29-2fb4-d643-b9412311ad0b.png)



こんな感じの 署名付き URL が生成されました。(この URL は既に有効期限切れでアクセスできません)

```
https://s3-presigned-test01.s3.ap-northeast-1.amazonaws.com/this-is-filename.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=xxxxxx%2F20220223%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220223T105747Z&X-Amz-Expires=1&X-Amz-SignedHeaders=host&X-Amz-Signature=0813f0e5753f557a121acc3184533545cdc12fce2f7007865d8c9dbe1bfbc6a5
```



ブラウザからアクセスしてみると、通常通りダウンロードできました

![image-20220223195356254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/92b40125-276e-76b8-b776-bbe8280a238c.png)



ファイルも見ています

![image-20220223195410765.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/35aa225f-6bed-269a-2e16-4a03e5d2efe8.png)





# AWS CLI

AWS CLI で `aws s3 presign` コマンドで、ダウンロード用署名付き URL を生成できます。

```
aws s3 presign s3://s3-presigned-test01/this-is-filename.txt --expires-in 60
```



実行例 (既に有効期限切れでアクセスできません)

```
https://s3-presigned-test01.s3.ap-northeast-1.amazonaws.com/this-is-filename.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=xxxxxx%2F20220223%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20220223T105747Z&X-Amz-Expires=1&X-Amz-SignedHeaders=host&X-Amz-Signature=0813f0e5753f557a121acc3184533545cdc12fce2f7007865d8c9dbe1bfbc6a5
```



こちらも同様に、ブラウザからアクセスしてみると、通常通りダウンロードできました

![image-20220223195356254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/692b8041-5020-85fe-9eb6-ad1a67af8835.png)



ファイルも見ています

![image-20220223195410765.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3e6d224a-3428-5e13-ab1b-e8f4bf386471.png)



# 有効期限切れの場合

このようにエラーになります

![image-20220223200022097.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dfe7fc48-c223-25e7-7d9e-402328a8468a.png)
Lightsailを使って立ち上げたWordPressに静的IPとDNSを設定する

# はじめに
Lightsail を使ってWordPressを立ち上げる方法についてはこちらの記事でまとめています。

https://qiita.com/cido1209/items/c04b0848a84d305e4325

今回は、上の記事で立ち上げたインスタンスに静的IPとDNSの設定をしていきます。


# インスタンスに静的IPを設定

Lightsailのコンソールから "Manage" を選択します。
![スクリーンショット 2022-02-23 18.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/15277315-987f-ee32-8c5e-abeaeb310a9a.png)

ネットワークタブを開き、赤枠の "Create Static IP" を選択します。

![スクリーンショット 2022-02-23 18.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/53bedf2b-7b60-1509-8a4e-c04ea7259b11.png)

静的IPをアタッチするインスタンスを選択し、静的IPのリソース名を設定します。

![スクリーンショット 2022-02-23 18.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/365945d9-33fd-d4c8-bb73-72b786d87e8e.png)

Createを押下すると、設定された静的IPと、そのIPが設定されたインスタンスが表示されます。
これで、インスタンスに静的IPを設定することができました！
インスタンスを再起動しても、IPが変わることはありません。

![スクリーンショット 2022-02-23 18.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/27ffdad7-dc3d-fb9e-2107-1c649c518d49.png)


# DNSを設定

## ドメインの取得
今回は [お名前.com](https://www.onamae.com/) でドメイン取得を行います。

取得したいドメインを入力し、検索します。
![スクリーンショット 2022-02-23 18.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/63d67f08-d5e6-2a8c-2694-8c3124911df7.png)

取得するドメインにチェックを入れます。
今回はLightsailを使って構築するので、 "サーバーは利用しない" を選択します。
内容に問題がなければ、右上の "料金選択へ進む" を押下します。
<sub>取得しようとしたドメインがすでに存在していました。。。1時間ほど悩みました</sub>

![スクリーンショット 2022-02-23 18.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/b37c3a8a-62c8-6dc7-f890-7f77ed021046.png)

登録情報を入力し、ドメインを購入します。
（何度もレンタルサーバーを勧められますが、今回はLightsailを使って構築するので、利用しない、を選びます）

ドメインが発行されると、ドメインの詳細情報が見れるようになります。

## DNSの設定
Lightsailのコンソールに戻り、 "Networking" タブを開きます。
"Create DNS Zone" を選択します。

![スクリーンショット 2022-02-23 19.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/425a8ea8-7944-e669-ba3f-ea99cb36821e.png)

お名前.comで取得したドメインを入力したら、 "Create DNS Zone" を押下します。

![スクリーンショット 2022-02-23 19.43.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/7cb39e1c-2278-d405-6620-cc39dc39e8f2.png)

DNS recordsにある "Add record" を押下します。

![スクリーンショット 2022-02-23 19.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/1a5eb169-4ed2-28c4-f74d-63971191ce69.png)

"A record" を選択し、ドメインの前に "@" を入力します。
"Resolves to" の下には、先ほど作成した静的IPのリソース名を選択します。
そうしたら、右上の緑のチェックをクリックします。

その下に "Name servers" としてネームサーバーが表示されます。
（私の場合は4つ表示されました）
これをこの後使うので、メモしておきましょう。

![スクリーンショット 2022-02-23 19.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/70756ed6-e3fa-7bb6-2347-8c115e885597.png)

今度はお名前.comに戻ります。
ドメイン詳細のネームサーバー設定を開きます。
ドメインを選択し、ネームサーバーの選択でその他のサービスを押下します。
そこで、先ほどメモしたネームサーバーを入力します。

![スクリーンショット 2022-02-23 19.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/52897bcb-b75e-b584-c836-7b9be0a066c9.png)

これでDNSの設定は終わりです。

設定したドメインからWordPressのブログページが表示されることが確認できるかと思います🎉


# おわりに
これでLightsailからWordPressの立ち上げ〜静的IPの設定〜DNSの設定までが終わりました。
あとはWordPressからの管理画面から記事を投稿するだけですね！
……と思ったのですが、SSL化されてなかったです。
次の記事では、SSL化していこうと思います。
Unity2021でPrefabを解除する方法

Unity2021でPrefabを解除する方法です。
バージョンによってこのメニューが違っていて中々思い出せずに見つけられない事が何度かあったので、自分の記憶に定着させるための備忘録です。

ヒエラルキー上でPrefabを解除したいオブジェクトを右クリックします。
右クリックメニューから、「Prefab」→「Unpack」を選択します。

![プレハブの解除Unity2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126821/5c677ed0-0867-db0f-7692-755bfbc9e1e6.png)
imagemin-mozjpegのバージョンを最新にしたらrequire()のエラーが出てはまった

## 事の発端は軽い気持ちでバージョンを上げただけ

1年ぶりぐらいに手元の開発環境をアップグレードしようと思い何も考えずにバージョンをアップデートしたことが始まりでした。


## imageminのビルド時だけエラーが出始める

エラーの内容を適当にコピペして海外サイトとかを徘徊したが、原因が掴めず・・・。

```lang="bash"
const imageminMozjpeg = require('imagemin-mozjpeg')
                        ^

Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/techthree/projects/tech-three/pug_sass_webpack/node_modules/imagemin-mozjpeg/index.js from /Users/techthree/projects/tech-three/pug_sass_webpack/imagemin.js not supported.
Instead change the require of index.js in /Users/techthree/projects/tech-three/pug_sass_webpack/imagemin.js to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/Users/techthree/projects/tech-three/pug_sass_webpack/imagemin.js:2:25) {
  code: 'ERR_REQUIRE_ESM'
}
```

## imageminは今から2ヶ月前にアップデートされていた

npmimagemin-mozjpegのバージョンによってimportかrequireか異なっていました。
最新の10系はimport、9系はrequireとなっていました。
ひとまず最新を使用したいのでimportに置換します。

```lang="javascript"

import imagemin from 'imagemin';
import imageminMozjpeg from 'imagemin-mozjpeg';

(async () => {
	await imagemin(['src/assets/img/**/*.jpg'], {
		destination: 'build/images',
		plugins: [
			imageminMozjpeg()
		]
	});

	console.log('Images optimized');
})();
```

## importにしたら違うエラーが出た！！！

```lang="bash"
(node:21109) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/techthree/projects/tech-three/pug_sass_webpack/imagemin.js:1
import imagemin from 'imagemin';
^^^^^^
```

## エラーの内容を注視する！！！

ビルド時のエラーメッセージに対処法が記載されていたのでその通りに対処してみます。
この場合はpackage.jsonに　`"type": "module"` を追加します。
私はscriptsの直前に指定しました。

```
{
  "name": "npmscripts",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "watch:imagemin": "onchange src/img/**/*.{jpg,png} -- node imagemin.js {{changed}}",
    "build:imagemin": "node imagemin.js"
  },
  "author": "Tech Three",
  "license": "ISC",
  "devDependencies": {}
}
```

追加後に再度ビルドを実行するとエラーが出ずに正常に完了することができました！

```lang="bash"
yarn run v1.22.17
$ node imagemin.js
Images optimized
✨  Done in 0.42s.
```
Linux操作 カーソル移動やカット・ヤンク

# Linux操作

Linuxの操作について学んだので復習がてらまとめていきます。

## カーソル移動

| コマンド  | 内容   |  
| :------| :------ |
| Ctrl + a| 文頭に移動 |
| Ctrl + e | 文末に移動 |
| Ctrl + b | 1文字後ろに移動 |
| Ctrl + f | 1文字前に移動 |
| Esc + b ※同時押しではない | 単語単位で後方に1つ移動 |
| Esc + f ※同時押しではない| 単語単位で前方に1つ移動 |
| Ctrl + h | カーソルの位置の後方に1文字削除 |
| Ctrl + d | カーソルの位置の1文字を削除 |
| Ctrl + w | 後方にスペース区切りで１単語削除 |

上記ショートカットを使用しなくても`← →`や`Backspace`などで操作可能。
ただ、ショートカットに慣れた方がホームポジションを守ってタイピングできるため生産性は上がる。

## カットとヤンク

#### そもそもヤンクって?
ペーストのことです！
下記`Ctrl + y`がヤンクに当たります。

| コマンド  | 内容   |  
| :------| :------ |
| Ctrl + k | カーソル位置から行末まで削除 |
| Ctrl + u | カーソル位置から行頭まで削除 |
| Ctrl + y | 最後に削除した内容を挿入 |

## まとめ
慣れるまでは時間がかかりますが、
一旦慣れた後の効率化を考えると慣れるべきかなと。
地道に頑張ります😆
多要素認証と二段階認証、何が違う？

# はじめに

筆者、今年の4月で3年目になるWeb系エンジニアです。
過去にいくつかのWebアプリの開発に携わってきましたが、直近1年では顧客との要件定義に参加する機会も増えてきました。

Webアプリの開発で避けては通れないのが認証機能です。

業務システムであればまだしも（若干語弊があるが）、一般に公開されるサービスではMFA（多要素認証）の導入は基本的に必須であると考えています。
<br>
さて、一つ前の文章に「多要素認証」という言葉が出てきましたが、
これとは別に「二段階認証」という言葉もよく耳にしますよね。

なんとなーく頭ではわかっているつもりでも、正直他人に説明できるほど理解はできていませんでした。

要件定義の時も、顧客とエンジニアとで認識のズレがあると後で大変なことになります。

そこで周りのエンジニアから聞いたことや他の記事を読んで学んだことを、
知識の整理も兼ねてこちらに書き残したいと思います。

<br>

あくまでも筆者の認識ですので、もし間違いがあればコメントで教えていただけると幸いです。

# 多要素認証？二段階認証？

〇要素、〇段階、ということなので、

認証に使用する要素の数が違う？
認証情報を入力する回数が違う？

色々なことが考えられます。

大まかな理解ではこのくらいでも問題ないかと思いますが、今回はもう少し細かく見ていきます。

## 多要素認証

筆者なりの解釈では以下の通りです。

**ID＋パスワード＋本人が持ち合わせている情報（指紋、秘密の回答、など）**

IDとパスワードの時点で二要素、それに加えて本人のみが持つ情報を認証に使用することで、多要素認証になると考えています。

「多要素」は「**3つ以上の要素**」といった感じでしょうか。

## 二段階認証

**ID＋パスワード＋本人が持つ認証情報でしか知り得ない情報（登録済みのメールアドレスに送信した認証コード、Google Authenticatorなど）**

と認識しています。

例えば、登録済みのメールアドレスのドメインがGmailだとします。
この場合、Gmailアカウントの認証情報（本人が持つ認証情報）を知らなければ、送信された認証コードを確認することができません。

本命のログイン情報（IDとパスワード）とは別に、**もう一組の認証情報を使用する**イメージです。

# 終わりに

これら2つはどちらが良いといったように比較するものではなく、それぞれ状況に応じて使い分けるものだと考えています。
筆者自身、この2つについて完全に理解しているわけではないですし、人によって捉え方も様々になるかと思います。

この記事を読んで「こういう解釈もあるんだな～」くらいに感じていただけると嬉しいです。

最後まで読んでいただきありがとうございました。
【Go】gormでテーブル名と構造体の名前が違う時のtips

Go難しいです。gormは「なんでやねん」と思うことが多いです。  
元Railsエンジニアには早すぎた技術なのかもしれません🥺

[Many To Many](https://gorm.io/ja_JP/docs/many_to_many.html)周りの公式の記事が少しわかりにくくて、tipsを書いておきます

# Many To Many （many2many）
gormでは`Preload()`する際に、構造体のフィールドのタグ(`reflect.StructTag`)を仕込むことで、中間テーブルを簡単にORM側に理解させることができます。

## 普通の書き方
gorm内部的には、`Field`という構造体で`TagSettings map[string]string`で値を持っていて、全部大文字に変換してるので`map[MANY2MANY:many2many:user_languages]`という感じで保存してあります

```go
// usersテーブル
type User struct {
  ID        uint
  Languages []*Language `gorm:"many2many:user_languages;"`
}

// languagesテーブル
type Language struct {
  ID   uint
  Name string
}

// 中間テーブルの構造体を定義せずに、Eager Loadingが実行できる
DB.Model(&User{}).Preload("Languages")
```

## テーブル名と構造体名が違う書き方
~~こういう書き方がGo的に良いか悪いかどうかは置いといて😅~~
`Language`の構造体にフィールドを追加したくなくて、`Language`と同じフィールドを持つ`LanguageWithOwn`を作成した時の、`many2many`の書き方で
`foreignKey, joinForeignKey, References, joinReferences`の4つを設定する必要があります
前述の通り、大文字小文字は内部で吸収されているので関係ないです。

```go
// usersテーブル
type User struct {
  ID        uint
  Languages []*OwnLanguage `gorm:"many2many:user_languages;foreignKey:id;joinForeignKey:user_id;References:id;joinReferences:language_id;"`
}
// foreignKey:id
// joinForeignKey:user_id
// References:id
// joinReferences:language_id

// languagesテーブル
type LanguageWithOwn struct {
  ID   uint
  Name string
  Own  bool // 母国語かどうか
}

// 構造体とテーブル名を一致させる
func (l *LanguageWithOwn) TableName() string {
	return "languages"
}

// Eager Loadingが実行され、User.Languagesに値が入る
DB.Model(&User{}).Preload("Languages")
```

あんまGoのライブラリのソース読まないけど、jsのライブラリとテイストは似てるなと思った（所感）
privateとprotectedとpublic用途の違い

##private
最も可視性が低く継承先でも見えない
そのファイル内だけで利用する
##protected
継承先から見える、継承していないファイルからは見えない
継承先でも利用したい専門性がある機能などで利用する
##public
どこからでも見える（勝手に改造されないように注意）
見られたくないならuserから外して紐つけない、もしくはprotectedにする
照会やコントロースマスタなど汎用性がある機能などで利用する
![protectedイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/02c42cdd-4da3-b502-b827-a12221563024.png)
##同じ変数名、関数名を使い分けできる
**public**　LogicCheck関数　（いろいろ使う汎用的な部分）
ユーザID、商品CD、担当者CDをチェック
**protected**　LogicCheck関数　（狭い範囲で利用する部分）
ログインID、パスワードをチェック
##参考
[02_継承クラスと protected 部のプロパティやメソッドの使用](http://mrxray.on.coocan.jp/Delphi/Others/InheritedClass_SubClass.htm#02)
[クラスとオブジェクト（Delphi）](https://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%EF%BC%88Delphi%EF%BC%89#.E3.82.AF.E3.83.A9.E3.82.B9_.E3.83.A1.E3.83.B3.E3.83.90.E3.81.AE.E5.8F.AF.E8.A6.96.E6.80.A7)
HDRPでシーンが暗くなったり，光りすぎたりする際の対処法 Unity 2021.2.10f1


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/9aff2c20-3e52-2c5a-28ba-6037971fb5b2.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/0289a455-e35c-405b-b201-004469bd10d0.png)

Unity 2021.1系から 2021.2系に移った時に，HDRPでシーンが暗くなったり，光りすぎたりする現象があり，調べてみたら，2021.2系ではグローバル設定が`Edit -> Project Settings　→ Graphics -> HDRP Global Settings` で設定されてしまっていたので，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/38a3ed96-4035-5112-3225-d9dede68dd7b.png)

これらの設定を一旦すべてオフにして使用すれば，シーンが暗くなったり，光りすぎたりする現象が解決しました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/e532e05d-5311-04f8-9969-9090168d4f41.png)

個別のシーンにグローバル設定をいれるのが2021.1までのやり方だったので，手間取ってしまいました．個人的には個別のシーンにグローバル設定をいれるのが混乱しにくいので良いと思います．以上！
bundle exec rspec実行時にSelenium::WebDriver::Chrome#driver_path= is deprecated.〜 エラーが発生した

# bundle exec rspec実行時のエラー解決備忘録

## エラー内容

- RSpecでテストを実行した際に、下記エラーが発生した。

```
$ bundle exec rspec2022-02-23 18:27:19 WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrome#driver_path= is deprecated. Use Selenium::WebDriver::Chrome::Service#driver_path= instead.
```

## 解決方法
- Gemfileの記載内容を修正
 - gem 'chromedriver-helper' を削除
 - gem 'webdrivers'　を追加し、bundle installを実行
 - 再度bundle rspec test を実行し、無事テストが走った

```
group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  gem 'webdrivers'
end
```

## 所感
そもそも、WebDriverとは何かを知らなかったため、今回のエラーで新たな知識を得られる良い機会だったなと実感した。。。

### 参考
https://ccbaxy.xyz/blog/2019/08/17/ruby6/

https://osusublog.net/?p=1432

https://osamudaira.com/312/

https://qiita.com/seri1234/items/7be4053fff94c7a120cc

https://note.com/somekichi/n/n2e360c823beb

https://www.selenium.dev/ja/documentation/webdriver/getting_started/

https://www.selenium.dev/ja/documentation/webdriver/