OmniAICreator/Qiita-1.07M huggingface dataset:
【合格体験記】LPIC-2(Level2) ver4.5

# 本記事の概要

LPIC-2(Level2)version4.5 を受験し取得したので勉強方法を備忘録として投稿します。
LPICを受けようと思っている方や、現在勉強している方がこの記事を参考の一つにしていただけたら幸いです。

# 使用した教材

参考書
・[Linux教科書 LPICレベル2 Version 4.5対応)](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB2-Version-4-5%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6/dp/4798151254/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=lpic+%E3%81%82%E3%81%9A%E3%81%8D&qid=1638234149&sr=8-4)
・[Linux教科書 LPICレベル2 スピードマスター問題集 Version4.5対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB2-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version4-5%E5%AF%BE%E5%BF%9C-%E6%9C%89%E9%99%90%E4%BC%9A%E7%A4%BE%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/dp/4798151238/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=29WIRZJ1B22OD&keywords=lpic+%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC&qid=1638233176&sprefix=lpic+%E3%81%99%E3%81%B4%2Caps%2C273&sr=8-2)

WEBサイト
・[Ping-t](https://ping-t.com/)

# 勉強の流れ(201試験編)

1. **Ping-tのWEB問題集を分野毎に解いていき、間違えた問題は解答を読んでノートにまとめる**
201の分野は運用に関わる問題・コマンドが多く、業務中に扱うコマンドがいくつかあったので
覚えるのがめちゃくちゃ大変ということではありませんでした。(**後述の202が地獄...**)

1. **全体範囲を終えたら、全問ヒットになるまで繰り返す**
大体2週間ほど時間をかけてPing-tを続けました。

1. **スピードマスター問題集を解く**
LPIC-1の時もですが、スピードマスター問題集はping-t後の知識の総括としてとても便利だと思います。
また、巻末の問題集も試験本番のレベルと合っていて試験対策としては必須だと思います。

1. **Ping-tのWEB問題集で模擬試験モードをやりまくる**
LPIC-1のときと同じでとにかく解く。（今回はコマ門は実施しませんでした。）

# 試験結果(201試験)

受験日：2021年5月30日
スコア：540
合格ライン：500
結果：pass

| テストセクションの情報 | 正解率 |
|:-:|:-:|
|  Capacity Planning |  87% |
|  Linux Kernel |  55% |
| System Startup  |  88% |
|  Filesystem and Devices |  66% |
| Advanced Storage Device Administration  |  87% |
|  Networking Configuration | 72%  |
| System Maintenance  |  50% |

かなりギリギリで合格...
個人的には手応えがあったのですが、
まだまだ精進が足らんと思い知らされる結果に。

# 勉強の流れ(202試験編)

201の結果はあまりよくなかったが、とにかく気持ちを切り替えて勉強開始。
流れは201の時と大体同じ。

1. **Ping-tのWEB問題集を分野毎に解いていき、間違えた問題は解答を読んで自分なりにノートにまとめる**
たくさんの方が合格体験記で語っているように、**とにかく覚える量が半端ない！**
まとめたノートのページ数もこれまでの試験対策の中で最長を記録しました。
途中、confファイルの設定値をこんなに暗記する意味はあるのか...と投げ出しそうになりました。

1. **全体範囲を終えたら、全問ヒットになるまで繰り返す**

1. **全問ヒットになるまでやり込んだら模擬試験モードをたくさんやる**
私の場合は、模擬試験モードで間違えた問題が30～40問くらいになるまでは模擬試験、
間違えた問題が溜まってきたら自由演習で復習。という流れでやってました。

1. **スピードマスター問題集を解く**
やはりスピマスは正義。本番の際に似たような問題が4～5問出題されました。

# 試験結果(202試験)

受験日：2021年11月28日
スコア：570
合格ライン：500
結果：pass

| テストセクションの情報 | 正解率 |
|:-:|:-:|
| Domain Name Server  |75%   |
| Web Services  | 81%  |
|  File Sharing |  75% |
|  Network Client Management |  81%|
| E-Mail Services  |  50%|
|   System Security| 78%|

202試験もギリギリ合格という結果に。
勉強しているときから自覚はありましたが、メールの分野がまだまだですね。
前回の受験日から半年もたった理由は、私生活が忙しくなってしまったという事情もありますが、
**とにかく覚える量が多すぎてモチベーション維持が難しい！**
これから受験を考えている方は短期決戦で挑むことをお勧めします。

# 受験後の感想

LPICは202が一番難しいという情報は仕入れていましたが、まさにその通りでした。
個人的に暗記が苦手なので、得意な人はもう少し楽に取得できるのかなと思います。
各サーバの役割を体系的に学習出来たのは良かったです。今後仕事に活かせるといいな...
資格を取得したことで幾分かの自信には繋がっているので、今後も資格取得は続けていきたいです

この記事を開いていただき、また、
ここまで読んでいただきありがとうございました。
今年中に304取得目指してがんばります。
ffmpegで指定箇所から指定時間の動画を切り取る

### ffmpegで指定箇所から指定時間の動画を切り取る

（例）`src.mp4`の開始240sec時間から、100secぶんを切り取って`dst.mp4`という名前で保存する

```
$ ffmpeg -ss 240 -i src.mp4 -t 100 -c copy dst.mp4
```

尚、インストールは以下を事前に実行しておく

```
$ sudo apt install -y ffmpeg
```


# 参考
[コマンドラインからmp4を倍速に変換する](https://qiita.com/seigot/items/4d89c42a992569fa1890)
[FFMPEG で指定時間でカットするまとめ](https://nico-lab.net/cutting_ffmpeg/)
Workato：for i = 1 to 10 ～ next のようなループをするには

# はじめに

Workatoのループ処理はforeachであり、`for i = 10 to 10 ～ next` のようなループ処理は標準で用意されていません。
ただし、`for i = 1 to 10 ～ next` 相当のループ処理を実現することは可能です。
その方法について、以下で説明します。

# 手順
１．List by Workatoをアクションに追加し、「Create repeat helper list」を選択します。その後、Sizeにループしたい数を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ad528953-0633-d35c-96ae-2b83c2c768b0.png)

２．Repeat actionを追加し、１で追加したアクションの `List` をデータピルから選択し、Input listにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/53824e07-6970-6cda-c83e-a608814a0884.png)

# 実行例
出力結果を見ると、1～10までの値が1行ずつ出力されており、for i = 1 to 10 ～ next のような動作が実現出来ていることが分かります。
※ループ結果確認用にVariable by Workatoコネクターを追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4edb4605-b24c-9037-c05c-1e87a40ccf63.png)
コミュニティのすゝめ

# はじめに

この記事は私の主観に基づく内容となります。一部偏り等ありますからご注意ください。
あと一点これだけは言わせてください。「**人によって向き不向きはあります**」

技術の内容も一言入れておきます。  
Next.jsでSSGするときは NextImageは使えません。気をつけてね。

# コミュニティとは

厳密な言葉の意味はわかりませんが、ある特定の団体や社会のことを指すのではないでしょうか。  
エンジニア界隈においても様々なコミュニティがありますよね。

中にはサロンという形の、所属するために課金が必要な有料コミュニティから、無料で自由に参加するようなコミュニティもあります。  
私は有料コミュニティには参加したことがないのですが、何らかの付加価値があったりするのでしょうか。  
いずれにせよ、様々な形態に分かれます。オンラインやオフライン、年代、クローズドやオープンなどの属性ですね。  

## コミュニティ活動している・していないの判断基準

コミュニティに所属しているからと言って、非アクティブな場合もあります。いわゆる全然活動していない状況ですね、この状態をこの記事上では**活動していない**とします。

運営する人もこまめにイベントや企画に参加する人はこの記事上では**活動している**とします。

# なぜコミュニティ活動を薦めるのか

ようやく本題です。箇条書きにしました。
※コミュニティによって偏る場合があります。

- 人脈のつながり
    - 人によってはコミュニティを通じてお仕事をもらったり、転職したりなどもありますが、**たくさんのつながりができる**というのがポイントでしょうか。
    - 同じ趣味を持つ人や、会話したり相談できる人などつながりができます。
- 情報収集や相談ができる
    - 専門性を持った情報など入手できるかと思います。
    - おすすめ書籍や学習法など。
    - 転職のアドバイスなども該当しますね。優しい人が相談に乗ってくれます。
- 視野が広がる
    - いろいろな人と接する事となるので新しい考え方などが得ることができます。
- モチベーション
    - 一人だとだれてしまう場合でも、もくもく会に参加することで強制的に学習することができるように、モチベーションを保つためにも繋がります。まあ、私の場合なんですが笑


コミュニティは活用してなんぼです。
自分に合ったコミュニティを見つけるのは大変かもしれませんが、なければ作っちゃえばいいのではないでしょうか。

ご自身の目的に合わせて、何らかのコミュニティに所属することはおすすめです。  
上手く活用していきましょう。

# コミュニティに参加をする上で気をつけること

ここからは参加する上で気をつけるポイントをいくつか列挙します。  
記載しましたが、若干運営側の発想になっているかもです。

- 無理はしない
    - 自然体で参加できるコミュニティを探すか作りましょう。
    - 合う合わないがあります。
    - ストレスになってはいけません
- 相手が人だと理解する
    - 接する対象は人です。思想や環境など異なりますから自分の型に当てはめて考えるのは避けたほうがよいのではないでしょうか。
    - 尊重する姿勢も大切です。
- ルールは守り、良識を持とう
    - 最低限ルールなどは守り、迷惑を欠けないようにしましょう。
    - 暴走して、BANされたらそれで良いのですが、運営側もBANするのも苦心したり気を使う場合があります。
- 運営に求めすぎない
    - コミュニティには運営している人がいます。運営側も大変です。


# コミュニティ運営をする上で気をつけること

こちらは運営側です。私もとあるコミュニティを運営していますが、一例として見てみましょう。

- 一人で抱え込まない・**負担にしない**
    - 規模が大きくなったり人数が増えたりすると負荷が増えます。頼りましょう。
- 判断基準の軸はしっかり持つ
    - 一団体として、許可すること、許可されないことなどの判断基準はしっかり持ちましょう。
- トラブルを楽しむ
    - 運営だけに当てはまる内容ではないですが、コミュニティを運営しているとトラブルは必ずと言っていいほど発生します。今後のネタにしちゃいましょう。
- 言い切ることも大事
    - ダメなときはダメと言えるのも重要です。コミュニティを守るためです。
- 失敗は恐れない
    - 人間ですからミスはします。次回に活かしましょう。

なんか人生論みたいになってしまいましたね、すみません。

# 参考「まめコーヒー」

私が運営しているコミュニティの特徴やスタンスなどを参考までに掲載しておきます。  
ちなみに始めた理由は「私がNetflixを観ないため」です。

- 金額
    - 無料
- 活動内容
    - 週一回にオンライン上（GoogleMeet）でもくもく会を開催（10 ~ 30人くらい）
    - メインはSlack
    - 作業スペースにはDiscordを利用
    - アドベントカレンダーなど気分によって企画
    - たまにLT会を企画
- 人数
    - conpassでは400人超えてますが、アクティブ人数は多くないかと思います。
- 管理者
    - よく参加してくれている人などを誘って、6人体制です。

ゆるーくやっていますが、割と判断基準の軸はしっかり持っているつもりです。
たまに転職相談に乗ったり、趣味の話をしたりとたのしーく運営しています。
はじめて一年くらいですが、なんと関西弁をコントロールできるようになりました！  
コミュニティ運営、むずかしいなぁー（心の声）


まだコミュニティ活動を試したことがない人はチャレンジしてみてはどうでしょう。
共有フォルダの開発を振り返りGitのありがたみを再確認する

この記事は[岩手大学 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/iwate-u)の記事です！

https://qiita.com/advent-calendar/2021/iwate-u

## 記事を書こうと思った経緯

僕が大学生のころ、Git を使わずチーム開発を行っていたときがありました。
今となっては Git は当たり前のように使っていますが、当時を振り返って Git のありがたみを再確認しようという記事です。
また、後輩に Git を使って開発したほうが苦労しないよというモチベーションもあります。

## 当時の運用

僕の大学では、ユーザーごとにディレクトリが切られていて、その中に各学生が好きなデータを読み書きできていました。そして、自分の管理下のディレクトリ内でパーミッションを設定することで他の学生も読み書きできるようになります。

これを使ってアプリケーションのファイルをディレクトリに入れておき、各開発メンバーがローカルにコピー、変更後に上書きで保存するようにしていました。

もちろんいろんな事件が起こるのですが、それを以下にまとめました。

## コンフリクトしたらどちらかが消える

複数人で開発しているので、開発している箇所がかぶる場合があります。
それに気がつくことができれば良いのですが、気づくことができないと先に共有ディレクトリに格納しておいた人の変更が上書きされてしまい消えてしまいます。

これはコンフリクトになれてきた中盤でもやってしまいがちで悲しい思いをしたのを覚えています。

## 最新バージョン行方不明

各開発メンバーは、共有ディレクトリからローカルに落としてきてから開発をするので、バージョンが古い可能性があります。
また、Git のようにどのファイルが最新バージョンと差分があるかもわかりません。なので、一度ファイルを触ってしまい、そのファイルを触ったことを忘れてしまうと関係のない差分まで生まれてしまいます。
そして、気がつかずに共有ディレクトリに格納してしまうため、最新バージョンのファイルが行方不明になってしまうことが多々ありました。

## 手動マージ

変更を最新バージョンにマージするときも辛いです。
担当したメンバーから何のファイルのどこを触ったのかを聞き、その情報をもとに最新バージョンに手動でマージを行います。
少し前でも話しましたが、開発メンバーがいつのバージョンのファイルを持っているかもわからないため、マージする箇所やそもそもの処理が全く変わっていたなんてこともあります。
最終的には、開発メンバーがつくってくれた変更を参考にしながら、自分で最新バージョンに対して実装を行うことになりました。

## Git のありがたみ

上記で話した問題はすべて Git を活用することで解決できます。
ローカルでの main ブランチとの差分はわかるし、変更履歴、変更箇所のマージ、コンフリクトもうまくできます。しかも、なんかがあったとしてもレビューをするようにしておけば、そのタイミングで気がつくことができ、main ブランチに影響を及ぼさずに開発できます。

Git ははじめ難しいかもしれませんが、main ブランチにとりあえず push するだけでも変更履歴を追うことができるので、大きく変わると思います。

## さいごに

Git は使ったほうがいい！絶対！
CSSでアニメーション重なってしまう時の対処。

![スクリーンショット 2021-11-30 20.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/9deb1dc1-7f34-1ab4-d9bc-ee04948fee34.png)
アニメーションが他のタグと重なってしまう時の対処法。

![スクリーンショット 2021-11-30 21.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/7ea66c0e-47f2-ec84-9fc5-cfa34ef116c5.png)

position: fixed;しているheaderタグと重なっているので、ここにz-index: 1;を追記する。

![スクリーンショット 2021-11-30 20.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/77493e08-beb5-d7ce-210a-aa22accad6b6.png)
重ならなくなりました。
FirebaseAuthを使った自作APIの認証

現在Flutterアプリを開発中です。自前のサーバーを立ててAPIを作成するということが良くあると思います。その中でAPIに正規のユーザーしか受け付けないように認証を実装します。FirebaseでFlutterアプリの認証を行なっているのでAPIの認証もFirebaseに任せたいと思います。今回の構成図は以下の通りです。

![jwt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/4e459602-d5f2-3ec9-bad9-add7a6d7888f.png)

# JWTとは
Json Web Tokenの略で読み方はジョット。JSONデータ構造で表現したトークンの仕様です。
JWTは長い文字列になっていますが . によって3つに分割することができます。構成は<ヘッダー>.<ペイロード>.<署名>となってます。JWT実際にデコードしていってみます。色々検証してみたい方はこちら↓↓↓

https://jwt.io/


## ヘッダー

ヘッダーはJWTの署名検証を行うために必要な情報を格納しています。"typ"はJWTであることを示し、"alg"は署名アルゴリズムを示しています。公開鍵方式であり署名の作成に秘密鍵を利用。署名の検証に 公開鍵を利用。"kid"は鍵IDとなっています。

```json
{
  "alg": "RS256",
  "kid": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "typ": "JWT"
}
```

## ペイロード

ペイロードはやりとりに必要な属性情報（Claim）です。送信したい情報を格納しています。

```json

{
  "provider_id": "anonymous",
  "iss": "https://securetoken.google.com/xxxxxxxxxxxxx",
  "aud": "xxxxxxxxxxxxxxxxxxx",
  "auth_time": 1234567890,
  "user_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "sub": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "iat": 1234567890,
  "exp": 1234567890,
  "firebase": {
    "identities": {},
    "sign_in_provider": "anonymous"
  }
}

```

## 署名

署名は、<エンコードしたヘッダー>.<エンコードしたペイロード>を連結したものを入力値として"alg"の署名アルゴリズムで署名し、Base64urlエンコードすることにより作成されます。これをJWTで送られてきた署名と比較して一致すれば認証成功になります。

# 実践編

## Firebase Admin SDKを導入する
サーバーサイド側(Node.js)にFirebase Admin SDKを導入します。メリットとしては比較的シンプルなコードでJWTを検証することができます。Firebaseでサポートされていない言語の場合でもサードパーティのJWTライブラリを使用して検証することもできます。


https://firebase.google.com/docs/admin/setup?hl=ja

## JWTを取得する
クライアント側で(Flutter)でJWTを取得します。

公式に以下のような記述があります↓↓↓
Firebase Authentication セッションは長期間有効です。ユーザーがログインするたびに、ユーザー認証情報が Firebase Authentication のバックエンドに送信され、Firebase ID トークン（JWT）および更新トークンと交換されます。Firebase ID トークンの有効期間は短く、1 時間で期限切れとなります。


```dart
String idToken = await FirebaseAuth.instance.currentUser!.getIdToken();
```

## JWTを付与してリクエストを行う
クライアントがJWTをHTTPリクエストに含めて送信します。

```
Authorization: Bearer <JWT>
```


## JWTを検証する
サーバーサイド側（Node.js）でJWTの検証はFirebase Admin SDKによって簡単にできます。Firebaseが送信したidTokenか改ざんされていないidTokenかを検証します。

```javascript
admin.auth().verifyIdToken(idToken).then((decodedToken) => {
    // 認証成功
    const uid = decodedToken.uid;
}).catch((error) => {
    // 認証失敗
});
```



## 参考文献

・JWTについて

https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

https://techblog.yahoo.co.jp/advent-calendar-2017/jwt/

https://deecode.net/?p=1544#JWT%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%A4%9C%E8%A8%BC%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF


・Firebase公式

https://firebase.google.com/docs/admin/setup?hl=ja

https://firebase.google.com/docs/auth/admin/create-custom-tokens?hl=ja

https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja#node.js

・その他参考

https://qiita.com/masatomix/items/b446a07a641f97686a97#%E8%87%AA%E5%89%8Drest%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E6%A7%8B%E7%AF%89

https://zenn.dev/awakei/articles/775c030922bf9c6ab56e
アニメの「PV」を10年分以上（2010年から来期まで）まとめて見れる「見たいに出会う」サービスを作った話【個人開発】

### はじめに

Anirecom というアニメの「PV」を10年分以上（2010年から来期まで）まとめて見れる「見たいに出会う」サービスを個人で作りました。今期/来期のアニメや全てのアニメなどの条件指定が可能で人気順に表示します。

https://anirecom.com

### なぜ作ったか

2013年頃からアニメを見始めて、毎シーズン１０作品くらい見るアニメ好きなのですが、アニメを見る時にタイトルやあらすじだけでは面白いのか判断出来ない時がありまして、とりあえず見てみるかと期待してなかったアニメが結構面白かったり、そんな時のために判断材料を増やしたくてこのサービスを作りました。


### 使用技術
```
フロントエンド
  Angular
    AngularMaterial
    AngularFire
  TypeScript

バックエンド
  Firebase
    Firestore
    Function
    Hosting
  TypeScript
```

### UI/UXについて（主にUX）
TikTokの良さを取り込みとアマゾンプライムビデオなどの動画配信サービスの不満点を解消できるように作っています。

<img width="300" alt="anirecom.com_(iPhone 6_7_8 Plus).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1752318/80dfe961-fe3d-3669-4c9a-d0fa56412237.png">

##### アマゾンプライムビデオなどの動画配信サービスの不満点
* あらすじやコンテンツの画像だけじゃ面白い作品か判断しづらい。PVが見たい場合は一覧からコンテンツをクリックしてさらにPVを見るボタンをおさければならないため、導線が長く見たいコンテンツが探しづらい。

その点TikTokはよく出来ており、次々と動画を再生出来るため動画を消費するという意味ではどの動画サービスより優れていると思います。

##### TikTokの良さ
* 勝手に動画が再生されるため、見る見ないの選択を動画の内容を見てから判断できる。動画を一覧で表示する場合は見る見ないを判断するには一般的にサムネイルとタイトルくらいしかなく、見る見ないの選択をする際に一つの動画あたりの情報量がTikTokは多い。

Anirecomでは、アニメのPVとあらすじを見れるようにすることで、見る見ないを判断する際の情報量を多くしています。

* 次の動画を見る導線が短いため視聴本数が多くなる傾向にある。動画が再生された後は次の動画が自動的に再生され、再生中でもスワイプするだけで次の動画が再生される。

ワンタップで次のアニメを見れるようにすることで、導線を短くし沢山のアニメを見ることができるようにしています。
一覧表示してスクロールで次のアニメを見る方法もありますが、ワンタップ方式の方が良いのでは？と思ってます。ユーザー数が増えたらABテストする予定です。


### 開発期間
フロントエンド:1ヶ月（勉強時間含む）
バックエンド:1ヶ月（勉強時間含む）

### AngularMaterialを使うことで見た目にかける工数をほぼ０に
見た目はそこそこ良いと思いますが、私自身ほとんどWebサービス作った経験がない状態で制作してます。今回使用した技術は全て初めて触ったものです。
簡単に筆者の経歴を書きますと、IT系の専門学校で2年学び、SEとして2年半くらい働いており、2年ほどAndroidアプリを趣味で作ってます。

以下サイトを見ていただければわかると思いますが大抵ものは揃っているので組み合わせるだけで見た目の良いサイトが作れてしまいます。
https://material.angular.io/components/categories

### Firebaseを使うことによりインフラ知識がほぼ不要でバックエンドにかける工数を大幅に削減
Webサイトを公開するのもコマンドひとつで公開でき、負荷分散とかインフラの部分をほとんど全てやってくれます。セキュリティに関してもルールを決めるだけで、私がやったこととしてはほとんどアニメデータのバッチ処理の中身を書くくらいで、AWSなどのクラウドサービスと比べてもかなり短縮できていると思います。

### 現在の維持費
**年間：1440円（税抜き）**
今の所Firebaseの無料枠の範囲で運用できていますが、ドメイン代で1440円かかってます。
※独自ドメインを使わなければ無料で運用することも可能ですがその場合はドメイン名が’anirecom-c1234.web.app’または’anirecom-c1234.firebaseapp.com’といった感じになります。

### 今後の書く記事の予定
* Firebaseの無料プランでFunctionを使う方法（ローカルで本番DBに接続）
* Firestoreの複合クエリでWhere句に４つの条件、orderBy句に2つのカラム指定にページングに対応する方法
* Angularで戻るボタンが押した時にURLだけが戻り表示内容が戻らない場合の解決方法

筆者のTwitterアカウント：[＠nirai_chinen](https://twitter.com/nirai_chinen?t=j5XszbLrRAFo6QrzO7ZDYA&s=09)
GitLabのEnvironmentを使いこなせ！(Environmentってなに？編) 

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

本エントリーは、Qiita Adventカレンダー 2021 GitLab の記事です。

# 0. はじめに

GitLab CIに「環境(Environment)」という機能があります。
便利な機能だと思うのですが、あまり使われてない(私も使ってこなかった)ので、解説したいと思います！

# 1. Gitブランチの単位で動作検証の環境を生成？

近年ではGitのブランチ毎でCIのビルドパイプラインを動かし、そのブランチ単位でのDockerイメージを作成することにより、ソースコードのブランチ単位での変更や修正の動作確認が個別に確認できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/15272d8a-5ccf-b02b-0473-6d7594df5310.png)


これは、メインブランチとは別の環境を気軽に立ち上げて動作を確認できたり、見栄えをチェックできるのはDockerならではの手軽さです。

しかし、GitLabでパイプラインがブランチ毎に動いて環境を自動的に立ち上げられたとしても、動いているDockerコンテナへ接続するURLが分からないとテストできないですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/232633d3-1d53-e988-325b-059c396e4780.png)

# 2. GitLab Environment

GitLabではGitLab CI/CDパイプラインの中でデプロイしたアプリケーションのURLを保存する機能を追加しました。
これによりGitLab Environmentを見るだけでブランチ内で実行されたパイプラインによってデプロイされた環境のURLを見つけることができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/f0327fc6-9814-7f18-cece-89220bef7f70.png)

# 3. GitLab Environmentで環境を停止

さらにGitLab Environmentに登録されているデプロイされた環境が必要なくなったら、停止ボタンを押すことによりテストしていた環境をCI/CDパイプラインで削除することができるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/9dfb4039-6764-c715-5cc3-137c66c07bf9.png)

# 4. まとめ

1. GitLab Environmentは、GitLab CI/CDパイプラインでデプロイした環境のURLを保存することができる
2. GitLab Environmentに登録されているデプロイされた環境を「停止」ボタンで削除することもできる

次回は、GitLab CI/CDパイプラインでEnvironmentを使う .gitlab-ci.ymlの書き方について解説します！
Javaアクセス制御について

この記事は、[シアトルコンサルティング株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/seattleconsulting)の5日目の記事です。
こんにちは、シアトルコンサルティングの小泉です。
##はじめに
今回はプログラミングを学び始めた際に苦戦したアクセス制御についてまとめました。
プログラミング初学者の方に向け作成いたしましたので、アクセス制御について知りたい方はぜひ活用してみてください。

##ゴール
アクセス修飾子の役割と使用場面を理解できるようになる。

## フィールドとメソッドに対するアクセス制御
Javaでは、それぞれのフィールド及びメソッドに対してアクセス制御を行うことができます。  
以下の4段階からアクセス制御のレベルを選ぶような仕組みになっています。

| 制限のレベル  |     名称   　|    指定方法   |アクセスを許可する範囲|
|:---:|:---|:---|:---|
| 制限が厳しい |private|private|自分自身のクラスのみ|
|    ⬆︎    |package private|なし(何も書かない)|自分と同じパッケージに属するクラス|
|    ⬇︎    |protected|protected|自分と同じパッケージに属するか、自分を継承した子クラス|  
| 制限が緩い |public|public|全てのクラス|

注意点：クラスのアクセス制御とメソッド及びフィールドのアクセス制御のうち、**制約が厳しい方**を優先させます  
  
    


## 使用例(publicとprivate)
今回はよく使われるpublicとprivateの使用例について説明します。

publicという修飾子は、それを付けた要素 (クラス、フィールド、メソッド、コンストラクタ) の可視性を決定するものです。public は「公開の」という意味を持つように、public を付けた要素はどこからでも (全てのクラスから) 参照することができます。  
それに対して、private という修飾子があります。これはフィールド、メソッド、コンストラクタに付けられるものでありますが、これを付けた要素は他のクラスから参照できなくなります。  
例えば、次のようなクラスを考えます。

```java
public class Rectangle {

    private double width;

    private double height;

    public Rectangle(double w, double h) {
        this.width = w;
        this.height = h;
    }

    public double area() {
        return this.width * this.height;
    }
}
```

上記のようなクラスを作った際には、public のついているコンストラクタ、area メソッドには他のクラスからでもアクセスできます。

```java
// 他のクラス
public class RectangleAction1 {
    public static void main(String[] args) {

        Rectangle r = new Rectangle(1.0, 2.0);
        //                              --OK

        System.out.println("area = " + r.area());
        //                              --OK
    }
}
```

ただし、private のついているフィールド double、height には他のクラスからはアクセスできません。

```java
// 他のクラス
public class RectangleAction2 {
    public static void main(String[] args) {

        Rectangle r = new Rectangle(1.0, 2.0);
        //                             --OK

        // private なのでどちらもコンパイルエラー
        r.width = 3.0;
        r.height = 4.0

        System.out.println("area = " + r.area());
        //                             --OK
    }
}
```

このように private を使用すると、「**書き換えてほしくない情報を書き換えられないで済む**」という利点があります。また、間違えて書き換えようとしてもコンパイルエラーとなるので、わざわざ実行しなくてもプログラムミスであることが分かります。  
privateは同じクラスからならば読み出すことも書き換えることができます。

```java
public class Rectangle {

    private double width;

    private double height;

    public Rectangle(double w, double h) {
        // 自分のクラスからは書き込めます
        this.width = w;
        this.height = h;
    }

    public double area() {
        // 自分のクラスからは読み出せます
        return this.width * this.height;
    }
}
```
##さいごに
アクセス制御について理解することで悪意や間違いによる利用を防止することができます。
開発を行う上では必要な知識になると思うので、この記事が皆様の手助けになれば幸いです。
Scrapyを使ってスクレイピング覚書

PythonのScrapyを使ってQiitaトップページからトレンドTOP30をスクレイピングする方法を雑に残しておきます。

#Scrapyのインストール
※環境によっては他にもいろいろインストールが必要かもしれません。

```
pip install scrapy
```



#プロジェクト作成

```
scrapy startproject qiita
```

#spiderの作成
プロジェクトを作成するとディレクトリが作成されるので、そこに移動してからspiderを作成します。

```
cd qiita
scrapy genspider qiita_trend qiita.com
```
#ソースコードの修正
setting.pyに以下を追加

```setting.py
FEED_EXPORT_ENCODING = 'utf-8'
```

setting.pyに以下を有効化し'Accept-Language': 'en'を'ja'に修正

```setting.py
DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'ja',
}
```

ディレクトリqiita配下のqiita_trend.pyを修正。Xpathの取得はchromeの検証を使って取得。
(※1タイトルだけならコメントアウト行を有効化して下の行をコメントアウト)

```qiita_trend.py
import scrapy

class QiitaTrend1dSpider(scrapy.Spider):
    name = 'qiita_trend'
    allowed_domains = ['qiita.com']
    start_urls = ['https://qiita.com/']

    def parse(self, response):
        # title = response.xpath('//article[1]/h2/a/text()').get()
        titles = response.xpath('//article/h2/a/text()').getall()

        yield{
            'titles': titles,
        }
```

#spiderの実行
spiderを実行しqiita_trend.jsonに出力

```
scrapy crawl qiita_trend -o qiita_trend.json
```

#出力結果

```qiita_trend.json
[
    {
        "titles": [
            "転職活動の面接でいただいた質問集",
            "AWS re:Invent 2021で発表された新サービス/アップデートまとめ",
            "Nikita Popov、PHP開発から離れる & PHP財団設立のお知らせ",
            "エンジニアとして普段よく使うサービスをまとめてみた",
            "【CTF】OSINT問題で個人的に使用するツール・サイト・テクニックまとめ",
            "地味に便利なdisplay: contents;",
            "5行のHTMLで15パズル作ってみた",
            "【しくじり先生】失敗続きの未経験からのエンジニア転職1年間を振り返って最短で満足のいく転職をするにはどうすれば良いかを考えてみた",
            "【React】【Vue】 など流行りのフレームワークを使うもののためのJS基礎",
            "リモートワークの目次 2021.11",
            "個人的「Java Bronze試験つまずいた項目」５選",
            "同人プロジェクトマネジメント入門：目次",
            "Azureの資格取得に向けた勉強法",
            "Pythonで人検知の通知機能プログラムを作成してみる",
            "launchWhen〇〇〇は止めてrepeatOnLifecycleを使おう！",
            "Clean Architecture 輪読会まとめ",
            "【Android】Modifier.requiredXXXについて、モヤモヤしなくなるくらいに理解する【Jetpack Compose】",
            "TypeScript のインターセクション型は２つの型のプロパティを持った型ではない",
            "ffmpeg で low latency DASH server 作ってみた",
            "Denoに今後導入される新機能（2021秋ver）",
            "CircleCIを使ってAutifyのテスト結果をTeamsに通知する",
            "エンジニアコミュニティのやり方&よくある失敗例",
            "ALL Pair生成、手作業 vs PictMaster vs GIHOZ",
            "アドベントカレンダーに参加しようかまだ迷っている人に",
            "転職活動ログ(2021)",
            "Rapberry Pi 初期設定の半自動化",
            "Pythonのオブジェクトへの参照とガベージコレクション",
            "【Jetpack Compose】Composeをオーバーレイ表示する",
            "C# の Json.NET を理解する",
            "AtCoderをRustでやるのにcargo-compete導入してみた"
        ]
    }
]
```
L2TP/IPSecについて調べてみた

# L2TP/IPSecとは
「L2TP」と「IPSec」の2つのプロトコルを併用したVPN接続方式。
モバイル端末から、インターネット経由でプライベートネットワークに安全にリモートアクセスする仕組みを提供する。

# IPSecとは
「IP Security」「Security Architecture for IP」の略。
TCP/IP や OSI参照モデルのネットワーク層で使用するIPパケット単位で安全な暗号通信を行うプロトコル。
2つのIPSec対応機器（ルーターなど）の間にSA（Security Association）という単方向のコネクションを確立することで、安全な通信を行う。

### IPSecの仕組み
AH / ESP / IKEなど複数のプロトコルから構成されている。

#### AH
AH（Authentication Header）はデータの認証を行うためのプロトコル。
元のIPパケットに対して認証情報を追加して送信する。
受信側はAHの情報を確認して、問題なければ元のIPパケットを取り出して利用する。

#### ESP
ESP（Encapsulated Security Payload）はデータの暗号化と認証を行うためのプロトコル。
AHではデータの暗号化はされないため、ESPが使われることがほとんど。
一部暗号化によるデータ通信を規制している国が存在するため、その時はAHが使われる。

#### IKE
IKE（Internet Key Exchange protocol）は安全に鍵交換を行うためのプロトコル。
ISAKMP SA / IPSec SAという2種類のSAを作成して鍵を交換する。

**ISAKMP（アイサキャンプ） SA**： 制御用SA。通信に先立って、データ交換を安全に行うために暗号化プロトコルや認証アルゴリズムなどの情報を交換し、通信に使う共通鍵を作成。端末間の認証も行う。

**IPSec SA**： 通信データ用のSA。上り・下りでそれぞれ別のSAを生成して接続を確立。IPSecで使用する暗号方式と暗号鍵を決定する。

# L2TPとは
「Layer 2 Tunneling Protocol」の略。
OSI参照モデルのデータリンク層で動作するトンネリングプロトコル。ある機器から別の機器まで仮想トンネルを作成して、データを送受信するためのプロトコル。

暗号化についての規定がないため、インターネットなど信用できない経路を経由する可能性のあるネットワーク上で利用する場合は、IPSecによって伝送路を暗号化する必要がある。
一瞬しか表示されない画面のセレクターを取る方法

今回は実業務でも活用したテクニックを紹介します。
5億年振りに記事を書きます。浅利です。

早速、本題に入ります。
今回のターゲットはコチラ。圧縮ファイルの「解凍中画面」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365842/73a7af45-5140-7f2a-4970-ce7c727a93f4.png)

上記の画面は大抵の場合は「一瞬だけ」しか表示されず、
通常の方法ではセレクターを取得できません。

しかし、ちょっとした工夫で取得可能です。
それはコチラ…。

一度解凍した状態でもう一度解凍する
というものです。

既に解凍後のファイルが展開されているので
解凍ツールは「上書き確認画面」を表示したうえで止まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365842/ffc07935-0750-5369-4097-67485aeaefa5.png)

こうなればコッチのもの。
上書き確認画面をドラッグしてどかせば
目的の「解凍中画面」のセレクターが取得できます。

機会があれば、お試しください。
ユーザー登録

![E64BD721-0916-4D57-BDBB-8F377632F749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/6112a1fd-e3fd-3bb7-a00a-03ec52e4235b.png)
![9A9F0BBC-8CDA-4443-8634-F0B7703DA6FE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/f5ea4a08-6700-45dc-b8e4-567257e0f528.png)
![4F21A9C7-6671-4381-9AC1-7A4F980036D1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/d61285b2-a002-69a4-dfd2-240edeec6560.png)



![B5D8853C-0ADB-4970-9FA3-DBDD8F9CF50D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/a21a2fbe-c71d-4bdb-b461-c6b05f77bb2e.png)
![E89FB2C1-3D79-4390-86D4-4A0E12CBD11F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/5a4d16fb-a2dc-6f94-0527-e6ed4623eed6.png)
![E55E655F-37E8-4D5D-AC14-D533CDE3C1C1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/119090e8-63a8-199d-edca-a511ba10c26c.png)
![BA7568AC-84E8-4B14-AD9B-D6BCCE0C1194.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/8c482cd2-47f0-d161-70d8-8b6fb3f219cd.png)
![BFDB9CE0-ED18-4A7A-9D61-8859A66AEDFE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/35208a6e-b847-27f1-16f9-bfdc5957fc91.png)
![EA25668A-D53C-43F2-ACB9-91122275CFC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/87ce26e3-8956-1660-dcab-f3671ff37a71.png)
![5E06A6B4-EDE5-4A42-95E2-331B6FE23EAD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/34de35e7-24e2-94c7-b92b-60a1b2252871.png)
Chatworkでチームにメンション(To)できるChrome拡張

# この記事 is 何？
Chatworkって[チーム機能](https://help.chatwork.com/hc/ja/articles/115000182342-%E3%83%81%E3%83%BC%E3%83%A0%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)があるじゃないですか？

チームをグループチャットと紐付けて、メンバーが追加されたときに
自動的にルームのメンバーにできる便利機能なんですよ。

でもチームに To する機能はないんですよね。
関係するチームに連絡するときにそのチームのマネージャーを窓口に相談するんだけど
これもなんか違うと思うんですよね。
マネージャーがお休みだったらどうなる？　
部署異動があるたびに、それを意識しないといけない？

チームにTOしたいんだ。
ないなら、作る。作ったから話を聞いて欲しいんだ。


# チームにToできるChrome拡張作った

完全にベータ扱いですが作りました。
デザインとか操作感とか作り込めていません😭
https://chrome.google.com/webstore/detail/chatwork-mention-to-team/gbofncipdgnliehdohjimpdelcmpdeap

チームを選ぶと、チームメンバーかつそのルームに所属しているメンバーのToに展開してくれます。


# 個人の感想

自分が抱えていた問題は解決できました。
チームに To できるってやっぱイイ！

* 多数にToするのは心理的ハードルが…
  * → 所属しているチームに機械的に送っているから恣意的な配慮をしてないから負担軽減
* マネージャーにToしたけど反応してくれないな…
  * 応答ないな、お休み？　ミーティング中？　たまたま離席してるだけ？
    * マネージャーのカレンダー、勤怠報告、休暇予定などをあさる、という切ない作業をしていた過去
  * メンバー全員にToすると誰かが反応してくれる
    * 担当者がいないのでちょっと待って / チームで分かっている人いない / あとでチーム内で確認して回答する　　などなど 

# 技術情報

Chatworkの非公式内部APIを叩きたい人向けの情報です。

## リポジトリ
https://github.com/yamatomo73/chatwork-mention-to-team

## Chatworkの非公式内部API

[Chatwork公式API](https://developer.chatwork.com/ja/)にはチームに関する操作APIがありません。
なので非公式APIを探します。

### 内部APIを探る

* ブラウザのデベロッパーツールを開く
* グループチャットにチームを追加する画面を開いたり、設定してみたり、チームを削除してみたり…
* コールされているAPIとレスポンス参考に必要なAPIを探す

### Chatworkの内部非公式APIを呼び出すために必要なこと

#### ログインセッション
  * 設定により Chrome 拡張機能ではログインしているセッション情報をそのまま使えます
  * https://github.com/yamatomo73/chatwork-mention-to-team/blob/main/manifest.json#L13

#### アクセストークン

Chatwork のチャット画面のソースをみると javascript にアクセストークンがあります。
このトークンが必要です。

### Chrome拡張でサイトコンテンツのjavascrip変数にアクセスするハック

セキュリティにより、Chrome拡張側からそのままサイトコンテンツのjavascrip変数にアクセスできません。
ソースがあるので詳しく説明しませんがギミックをつかって取得します。

### チーム機能に関するChatwork内部API(2021/11/30現在)

コールしているAPIをトレースしてなんとなくコールしてします。
非公式でインターフェースが変わることもあるとおもうので、参考程度に。

* 組織の全チーム
  * https://github.com/yamatomo73/chatwork-mention-to-team/blob/main/scripts/background.js#L47
* 特定のグループチャットに所属しているチーム一覧 
  * https://github.com/yamatomo73/chatwork-mention-to-team/blob/main/scripts/background.js#L79
* 特定のチームを指定して所属しているメンバー一覧取得 
  * https://github.com/yamatomo73/chatwork-mention-to-team/blob/main/scripts/background.js#L113

# さいごに

Chatwork公式APIになくても内部APIを使いChrome拡張で実現してみました。
Chrome拡張をつくったのは初めてでしたが、おもったよりもサクッとつくれました。
公式APIがもっと増えたらいいのになあと思います。

## 参考にした記事

https://creators-note.chatwork.com/entry/2020/11/25/165957
Elixir女子部のオーガナイザーをやってみた話

こんにちは、nakoと名乗って活動しています。
2021年に入ってから、Elixir女子部とpiyopiyo.exの共同開催者（オーガナイザー）をやっています。

普段は会社員で主にRuby on Railsなどを書いています。

## Elixir女子部とは

プログラミング言語Elixirに興味があるけど、どこから始めたらいいか分からないよーという女性向けのコミュニティです。
福岡でのオフライン開催から始まり、コロナ渦に入りオンライン化しました。

https://elijo.connpass.com/

## Elixir女子部のオーガナイザーを始めた経緯

最初は勉強会の参加者側だったのですが、
1代目オーガナイザーが多忙になり、Elixir女子部が活動休止状態になったため、
Elixirに興味を持ち始めたタイミングだったこともあり、無くなるのはもったいないなと思い、
elixir.jpのslackで自分がオーガナイザーに挙手しました。

1代目オーガナイザーのkumiさんは引き継ぎ資料まで作ってくれて、とてもスムーズに移行できたのでは、と思っています。

## オーガナイザーとしてやったこと

### 勉強会の開催

月1回、「プログラミングElixir」の輪読会（オーム社）を開催しました。
オーガナイザーがElixir入門者のため、教える枠を募りました。

https://www.ohmsha.co.jp/book/9784274226373/

第2章〜5章までは輪読をして、コードブロックを画面共有しつつ実行したりとか。

https://elijo.connpass.com/event/212378/
https://elijo.connpass.com/event/212378/
https://elijo.connpass.com/event/218301/

順番に読んでいくといつまでたっても読み終わらないぞ？と気づき、
飛ばして第13章をやってみたところ時間が足りず、2回に分けて開催することになりました。
第13章はプログラミングElixirの前半のまとめのような位置づけでボリューミーな章です。

https://elijo.connpass.com/event/221551/
https://elijo.connpass.com/event/224148/

一緒にプログラミングElixirを勉強してくれた参加者の方や、サポートしてくれた
elixir.jpの先輩方には感謝しかありません。

### Elixir女子部を女性参加者のみに限定する試み

オンライン化にともない、男性参加者も募っていたのですが
私が仕事で優秀な女性プログラマーと関わる機会が増え、
女性参加者のみでイベントを作ってみたいなと思いました。

とはいえ、自分も女性限定の会を開催したことが無いので
お茶会という形で今後の方針をお話しする会を開いてみました。
https://elijo.connpass.com/event/229237/

Elixir女子部を女性参加者限定にするにあたり、性別問わずで初心者を受け入れる会が無くなるので
piyopiyo.exというコミュニティを作りましたが、それは別の記事でお話しできたらと思います。

## オーガナイザーをやってみて思ったこと

Elixir女子部のオーガナイザーをするということで、プログラミングコミュニティの端っこにお邪魔することになりました。

1. コミュニティのslackでのレスポンスが早い＆丁寧！
これは他コミュニティと比べたことが無いので比較ができないのですが、興味がある言語のコミュニティは参加したほうが絶対に良いなと思いました。

2. イベントを組み立てるにあたり考えることが色々ある
Elixir女子部は教えてくれる枠の方をお呼びするので日程調整をしたり、
参加者と自分（入門者）のニーズ、興味がある範囲が大きく乖離しないようにしてみたり（勉強会本編後の雑談とかでアンケートとってみたりしました）、
参加者が少ないと会が成立しないので気を揉んだり、気を揉んだり…

## 今後のElixir女子部の方針について

しばらく女性参加者限定で進めていこうと思います。
次回はアイデアソンをたぶんやります〜！
Workato：ローコード系コネクターでHTTPリクエストしてみる

前回はローコード系コネクターでHello Worldしてみましたが、今回はローコード系コネクターでHTTPリクエストをしてみました。

https://qiita.com/tabimoba/private/35abf19b4f9c8d2d5e8c



# レシピ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a3aa77e7-981c-be67-2774-24f1866ba7f0.png)

## リクエスト先URL
気象庁WebサイトのJSONサイト（東京地方の天気予報）を利用してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/57e14e67-69f4-6506-938e-c63327e99f27.png)

※参考

https://qiita.com/michan06/items/48503631dd30275288f7


## Ruby
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/34944ce4-2dd7-46d0-b96f-ed0bc0c6742a.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/313f91c8-e756-903c-c525-a75e9c12c290.png)

## JavaScript
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a8b57c9d-9ef3-a756-ad1a-88716ce1f6b1.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/64f21e64-4386-f198-9564-d267f060bce9.png)

## Python
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e8ad145f-117f-bce0-e531-932d61ae1326.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/646e71ae-0339-dd88-e624-e4c51fe7da91.png)

# まとめ

シンプルにHTTPリクエストを処理したいのであればRubyコネクターが良さそうです。

Rubyコネクターは、コネクター追加時にコードに書かれている例の通りにリクエストを行おうとすると正しく動かないという罠はありますが、ドキュメントを参照のうえ正しく理解して使えば他のコネクターよりも簡単かつシンプルに結果を取得することができますのでお勧めできます。

JavaScriptコネクターやPythonコネクターはRubyコネクターと比較するとコードが冗長になります。しかし、Rubyコネクターよりも高機能ですので、取得した結果をローコードで処理したいという場合にお勧めできます。
从信息论解构桥牌叫牌②

书接上回。
本回先厘清一些总体基础概念，为今后的进一步说明打下基础

# 叫牌过程的本质
从信息论角度看，叫牌过程的本质其实就是对两手牌的编码过程。
上一回我们引用香农信息量公式如下

``` math
I(x)= -\log_2 p(x)
```
为什么会是以2为底的对数表达?

**其本质在于叫牌过程就是一个二进制编码过程。**

我们先考虑无竞叫的叫牌过程（有竞叫的过程将在以后仔细展开）：
由pass，1♣～7NT组成，上回我们的1💗-4💗-的叫牌序列就可如下图表示：
1♣ 1🔸 1💗 1♠ 1NT.............4💗................7♠ 7NT
&nbsp;0,&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;1,　&nbsp;0,　0，　　　1,　　0,　　0,　0 
即此叫牌序列可以编码为0010000000000000100000000000000000

- 因为1♣～7NT一共有35位，所以很容易可以得知任意的无竞叫的叫牌过程都可以在信息论中被编码成码长为35的定长码。

# 无竞叫叫牌过程所需要的码长
信息论中，信源编码的概念如下：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311521/02c0a348-3e6e-c3ed-9272-9fc28b195956.png)
对定长编码码长的计算公式如下：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311521/b5c18424-574d-639b-4257-50183bbb81a8.png)

对应到无竞叫叫牌过程时（叫牌方为南北）：
信源符号集=南北两家持牌所有的可能组合
q=南北两家持牌所有的可能组合数
r=2(二进制编码)
则我们不考虑任何信源压缩，所需的码字长度为：

``` math
\begin{align}
l&=log_2q \\
 &=log_2C_{52}^{13}*C_{39}^{13} \\
 &=log_25.15*10^{21} \\
 &≈73bit
\end{align}
```
也就是说，当我们对南北两手牌不做任何压缩处理，需要73位码长才能表达信源，即南北两手牌。
而我们总共可以利用的码长位35位。

- 结论：对两家牌不做任何处理，在1♣～7NT的空间中，叫牌进程无法涵盖两手牌所有组合

# 信源符号空间压缩后的定长码码长
由结论1可知，若我们想要在有限码长（最大35位）中表达南北两手牌，则只有减少信源符号空间，即减小q（南北两家持牌所有的可能组合数）
自然而然，对应到约定俗称的点力计算法，我们想到了，把4种花色中的A,K,Q,J16张牌保留，各种花色中T以下的牌都计算成同一种小牌x,则南北两手牌的组合数可以得到降低。

``` math
\begin{align}
l&=log_2q \\
 &=log_28.357*10^{11}  注* \\
 &≈40bit
\end{align}
```
注* 由计算机编程得到结果，Java代码片段如下：

```Java
        BigDecimal s = new BigDecimal(0);

        for (int m = 0; m <= 0; m++) {
            for (int x = 0; x <= min(13 - m, 13); x++) {
                for (int y = 0; y <= min(13, 13 - m - x); y++) {
                    for (int z = max(0, 0 - x - y - m); z <= min(13, 13 - m - x - y); z++) {
                        for (int n = 0; n <= min(0, 0 - m); n++) {
                            for (int a = 0; a <= min(13 - n, 13 - x); a++) {
                                for (int b = 0; b <= min(13 - n - a, 13 - y); b++) {
                                    for (int c = max(0, 0 - a - b - n); c <= min(13 - z, 13 - n - a - b); c++) {
                                        if ((13 - (13 - m - x - y - z)) < 13 - n - a - b - c) {
                                            continue;
                                        }
                                        BigDecimal num = new BigDecimal(1);
                                        s = s.add(num);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println(s);
```
40bit > 35bit,可知即使只保留A,K,Q,J，其他都算作小牌，信源空间也无法在35bit达到完全编码。

以此类推，计算下列信源空间压缩结果需要的bit数如下：
①只保留各花色AKQ
&nbsp;&nbsp;&nbsp;需要35bit
②只保留各花色AK
&nbsp;&nbsp;&nbsp;需要29bit
③只保留各花色A
&nbsp;&nbsp;&nbsp;需要24bit
④不保留各花色大牌，即各花色都只算做13张小牌
&nbsp;&nbsp;&nbsp;需要18bit
虽然每种结果都达到了定长码码长35bit以内，但是由于成局定约只能用到15bit(3NT),18bit(4💗),19bit(4♠),21bit(5♣),22bit(5🔸),并且还有码长更小的非成局定约。
所以最现实的叫牌体系应是在④的基础上（18bit）进行编码。
那在考虑非成局，成局，满贯的各种情况下，利用信息论如何做到合理的编码呢？
敬请期待下回
教員からエンジニアになってみて

## 前職について
前職は小学校教員をしていました。
1日の流れとしては、朝7時半には学校に着き、朝からせわしなく過ごすことも多かったです。
朝の７時５０分には教室で、子どもたちがやってきた宿題を丸付けしたり子どもの対応など。
そこから子供たちが帰る3時、4時まで働き、そこから会議や保護者対応や明日の授業準備など。
普段帰る時間は１９時ごろでした。縛られている時間は多かったかなと思います。
## エンジニアになろうと思ったきっかけ
このまま教員を続けるか迷っていたことや昔からパソコンが好きなのもあり、働きながら初めは独学でHTMLやCSSのプログラミングの勉強を始めました。
やっているうちにとても楽しくなり、毎日勉強をしていました。転職を考えはじめたのですがどのレベルまでいけば転職ができる、実務ができるのかわからなくて不安だったので、オンラインスクールにも通いました。そのスクールでrailsを学ぶことができ、課題もこなし、実際エンジニアとして働いている人からのコードレビューももらい、自信もついたのでエンジニアに転職しようと決めました。
## エンジニアとして働いてみた感想
エンジニアになってみて、会社によって違いますが、私の会社は、フレキシブルタイム制なので大体毎日１０時ごろ出勤してます。本当に自分なりのペースで仕事をできるのが、教員時代と違ったなと思います。
働き方もとても自由で、リモートでされている方も多くいてまだ会ったことない人もいます。
場所にしばられすぎないこともいいところですが、私の場合、会社の方が集中しやすいと思いできるだけ出勤するようにしています。しかし、体調が少しすぐれず、家で仕事をしたいというときには、それでも大丈夫なので、そのあたりはフレキシブルでありがたい限りです。
そして、働き方はというと、会社の中のチームで開発をしているので想像していたよりコミュニケーションもあり、休憩をとる時間も自由ですので毎日のお昼ご飯は同じ会社の人といろんなところに食べに出かけています。
仕事は初めはついていけるのかという不安もありましたが、先輩エンジニアの方に教えてもらえたり、会社からも自分にあったものから任されていくので、ついていけないということはありませんでした。毎日成長を感じれているのでモチベーションにもつながっています。
## 今後はどんなエンジニアを目指したいか
教員を今までしてきていたので、もっと技術力を高めて今度は自分がチームの中でリーダーになり、自分のように経験の少ないエンジニアをマネジメントしていけるようなポジションにつきたいと思っています。
Workato：ローコード系コネクターでHello Worldしてみる


WorkatoではRuby, JavaScript(NodeJS), Pythonのコードを実行可能なローコード系コネクターが用意されています。
それぞれで、Hello Worldをしてみました。

# レシピ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/952d7a02-031a-f883-39d2-0d50bb72e3e6.png)

## Ruby
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/777577a4-b69c-a03e-666a-e615a17113f2.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/111e4503-42e1-a1ff-2c6c-bdbea3797ebe.png)


## JavaScript
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/323da4c8-c22b-6cfc-bb50-bd9181d203b9.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b390788f-ab87-4f71-9891-452b8811629f.png)


## Python
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8dbb89a1-46d6-6604-b1fc-b26c1e6a9ddd.png)

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8353bb25-6e44-cac0-ebda-6d6ca5317f74.png)

# まとめ
どのコネクターを選ぶかは用途や好みによりますが、個人的にはPythonが癖が少なく、書きやすいと感じました。
Boolean だって ORDER BY できるもん

NULL を含むデータをソートするときに NULL を先頭に持ってきたり、末尾に持ってきたりしたいときがあると思います。そんなときは、真偽値でもソートできるということを知っておくと、NULL のソート順を自在に扱うことができます。

# NULLのソート順

PostgreSQL において、以下のようなテーブルのデータがあったとき、

| id  | val01 | 
| --: | :---- | 
| 1   | b     | 
| 2   | a     | 
| 3   | NULL  | 
| 4   | c     | 

単純に val01 で ORDER BY をかけると

```sql
SELECT * FROM test_data ORDER BY val01;
```
以下のように NULL の行が最後に来ます。NULLは常に最大値という扱いなんですね。

| id  | val01 | 
| --: | :---- | 
| 2   | a     | 
| 1   | b     | 
| 4   | c     | 
| 3   | NULL  | 

NULL でない val01のソート順はそのままで、NULL の行を先頭に持っていくには、以下のようにします。

```sql
SELECT * FROM test_data ORDER BY val01 IS NULL DESC, val01;
```

| id  | val01 | 
| --: | :---- | 
| 3   | NULL  | 
| 2   | a     | 
| 1   | b     | 
| 4   | c     | 

まず val01 が NULL かどうかの真偽値でソートしてから val01 でソートするという順序になっています。
真偽値の昇順は false -> true の順なので、NULL を最初に持ってくるには val01 IS NULL の降順(DESC) を指定するわけです。

このように Boolean を利用したソートを入れることで、並び替えの幅が広がりますので、ぜひご活用ください。

## おまけ (NULL の順番)

実は、NULL を最大値とするか最小値とするかは、DBMS の実装によって異なります。
MySQL の場合は、NULL を最小値として扱うため、以下の SQL で NULL の行が先頭に来ます。

```sql
SELECT * FROM test_data ORDER BY val01;
```

MySQL の場合：

| id  | val01 | 
| --: | :---- | 
| 3   | NULL  | 
| 2   | a     | 
| 1   | b     | 
| 4   | c     |
色(10)を選ぶ基準と試行錯誤

色を選ぶ基準と試行錯誤について説明させてください。

# 油絵
製品の色、映像の色を選ぶときに、参考にしてきた考え方です。

小学校４年生の時に、油絵を習っていて、静物画を書いた時のこと。

りんごと瓶を書いた時に、先生に見せたところ、筆をとって説明しながら言われたこと。

「部屋の中にある物の色を、置いて見る。」

といいながら、ある色を、りんごの表面に置いた。

突然、そのりんごが、部屋の中にある現実味が湧いてきた。

魔法のようだと思った。

あるものの色を描く時に、実際に見たままを表現するとよいのだろうとぼんやりと思っていただけだった。

そうだ、自分が見えていると思う色を置くのではなく、自分が見えている範囲内にあると思っているものの色を、他の物に置いて見て、現実味が増えてきたら、きっとその色の反射光があるのだろうと。

見ている視点によって、反射する光は全く違う。

どの色を置いたときには、どの角度から見ている。

どの色を置いたときには、違う角度から見ている。

視点によって見えているものの色が違うことが分かったような気がした。

先生にはたくさん絵を見るように言われた。

どんな絵を、自分がいいと思うか、たくさん見て決めればよい。

ある日、夕焼けの絵を見た。綺麗な色の取り合わせだと思った。

その日以降、夕焼けを見るたびに、絵に描かれた色の取り合わせがないか探すようになった。

現実から、絵を描くのではなく、描かれた絵から現実を探すという行動をとるようになった。

現実を見つめて、絵を描く方法もあることは前提として、その逆をやってみると新たな発見があるかもしれないことを知った。

# 静止画・動画
静止画の色を決める時と、動画の色を決める時の作業は同じとは限らない。

静止画の色は、決めた通りに再現する。

動画の色は、その色を表示している時間を変えたり、その前、その後にどういう色を表示するかでも、見え方は違う。

わかっている人には当たり前のことでも、色について、何かの考えを持っていないと、
いろいろな意見に振り回されるかもしれない。

振り回された結果として、自分が思うところにたどり着けばいい。

ゲームプログラマの色使いについて整理した記事はこちら。

プログラマが知っているとよい色使い(JIS安全色)
https://qiita.com/kaizen_nagoya/items/cb7eb3199b0b98904a35

「色　いろいろ」 Calendar 2021 を始めるにあたって参考にさせていただいた記事群はこちら。

「色　いろいろ」　Calendar 2021 を満席にする5つの方法
https://qiita.com/kaizen_nagoya/items/8294b80c5fb8499298a9

# 参考資料
ぼくの先生「人がやらないことをやれ」プログラマになるまで。仮説・検証（37）
https://qiita.com/kaizen_nagoya/items/53e4bded9fe5f724b3c4

プログラマが知っているとよい色使い(白黒で確認)
https://qiita.com/kaizen_nagoya/items/b4564d409115b68acd01

プログラマが知っているとよい色使い(関連自己資料・法令等)
https://qiita.com/kaizen_nagoya/items/56c9430066de5399e7b5

MS Wordで色調整
https://qiita.com/kaizen_nagoya/items/fc0ca5cde8a59a97d472

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 　 20211221
ver. 0.02 ありがとう追記 　 20230527
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
「Vite」を使用してVueプロジェクトを立ち上げる

## Viteとは
Vue CLIと同様、プロジェクトの生成、試験サーバーによる実行、ビルドなどが行え、Vue CLIに比べて動作が早く快適に作業ができる。

## プロジェクトを作成する

```bash
npm init vite-app プロジェクト名
cd プロジェクト名
npm install
```

## プロジェクトを実行する
```bash
npm run dev
```
これで内蔵サーバーを使ってプロジェクトが実行される。
起動したら `http://localhost:3000/` にアクセスすると、立ち上げたプロジェクトが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/32e8a6b3-7a9a-0f98-6e3f-8f19c0202e67.png)


## プロジェクトをビルドする
```bash
npm run build
```
これで「dist」フォルダに公開されるファイル類が書き出される。
日記：docker run --gpus all でエラーになった

### 環境
- ubuntu 20.04
- GPU GeForce GTX 1060

### ローカルのGPU設定
- NVIDIA-SMI 460.39
- Driver Version: 460.39
- CUDA Version: 11.2

# ことの経緯
1. tensorflow公式からGPUサポートのtensorflowイメージをpull
2. run --gpus all
3. ERRO[0000] error waiting for container: context canceled
4. 確認

# 1. tensorflow公式からGPUサポートのtensorflowイメージをpull
[公式](https://www.tensorflow.org/install/docker?hl=ja)に従ってタグlatest-gpuのイメージをプル

```
docker pull tensorflow/tensorflow:latest-gpu
```
# 2. run

```
sudo docker run --gpus all -it -v マウントしたいローカルのディレクトリ:コンテナ内のマウント先 --shm-size 8G --name コンテナの名前 tensorflow/tensorflow:latest-gpu
```

# 3. ERRO[0000] error waiting for container: context canceled

```
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
ERRO[0000] error waiting for container: context canceled
```
うーーん、この

### 対策
nvidia-container-runtimeなどを入れる。

```
sudo apt-get install nvidia-container-runtime
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list

sudo apt-get update
sudo apt-get install nvidia-container-runtime
service docker restart
```

気を取り直して
```
sudo docker run --gpus all -it -v マウントしたいローカルのディレクトリ:コンテナ内のマウント先 --shm-size 8G --name コンテナの名前 tensorflow/tensorflow:latest-gpu
```

# 4. 確認
```
(コンテナ内で) nvidia-smi
```

よし


```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.39       Driver Version: 460.39       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:1D:00.0  On |                  N/A |
| 27%   34C    P8     9W / 120W |    242MiB /  6077MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```
zsh: command not found: 〇〇

## 問題
ある日、m1でターミナルを開くと、どのコマンドも見つからなくなった

```:ターミナル
$ homebrew -v
zsh: command not found: homebrew

$ ls -l
zsh: command not found: ls

$ git --version
zsh: command not found: git
```

？！！

## 解決法
ターミナルを開いたら

```:ターミナル
$ export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
$ echo export PATH='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH' >> ~/.zshrc
```
を実行後に

```:ターミナル
$ vim ~/.zshrc
```

で.zshrcファイルを編集する

そしたら一番上の行に

```:.zshrc
export PATH=/bin:/usr/bin:/usr/local/bin:${PATH}
```

を追加する

`esc` ボタンを押して `:wq` で保存した後、
ターミナルを再起動したら復活です！

おつかれさまでした！
【オブジェクト指向】カプセル化

##カプセル化
オブジェクト同士の紐付き（関係性）を薄くし、独立性を高め、再利用や交換といった保守性を高める効率の考え方。

```ruby
class Foo
  def initialize(foo='foo', bar='bar')
     @foo = foo
     @bar = bar
  end  
end  

f = Foo.new
f.foo
#=> NoMethodError: undefined method `foo' for #<Foo:0x0000562351fbab60 @foo="foo", @bar="bar">
```


- ```attr_accessor :foo, :bar```と書くだけでインスタンス変数```@foo```と```@bar```にアクセスできるように

```ruby
class Foo
  attr_accessor :foo, :bar
  def initialize(foo='foo', bar='bar')
     @foo = foo
     @bar = bar
  end  
end

f = Foo.new
f.foo
#=> "foo"
f.bar
#=> "bar"
```


####attr_accessorメソッドを使って書くと
メソッドの呼び出し時に毎回変数を書かなくてよい。

```ruby
class Square
  attr_accessor :height, :width
  def initialize(height, width)
    @height = height
    @width = width
  end

  # 面積計算
  def calc_area
    height * width
  end

  # 正方形の時trueになる
  def square?
    height == width
  end
end

sq = Square.new(20, 30)
sq.square?
#=> false
sq.height = 30
#=> 30
sq.calc_area
#=> 900
sq.square?
#=> true
```

####```attr_accessor```メソッドを使わずに書くと
メソッドを呼び出すときに毎回変数が必要になる。
メソッドに新たな変数を加える変更をしたいときに全メソッドに変数を付け加えなければならない。
→**カプセル化でオブジェクト同士の独立性を高めてコードを管理しやすくする。**

```ruby
class Square
  # 面積計算
  def calc_area(height, width)
    height * width
  end

  # 正方形の時trueになる
  def square?(height, width)
    height == width
  end
end

sq = Square.new
sq.square?(20, 30)
#=> false
sq.calc_area(30, 30)
#=> 900
sq.square?(30, 30)
#=> true
```

##おまけ

heightとwidthを更新することを考えたらこういう実装がより使えるらしい。
（弊社CTOありがとうございます！）

```ruby
class Square
  attr_reader :height, :width

  def initialize(opts = {})
    update(opts)
  end

  def update(opts = {})
    @height = opts[:height] if opts.key?(:height)
    @width = opts[:width] if opts.key?(:width)
  end

  def calc_area
    height * width
  end
  
  def square?
    height == width
  end
end

sq = Square.new(height: 30, width: 20)
=> #<Square:0x000055557fb27198 @height=30, @width=20>
sq.calc_area
#=> 600
sq.square?
#=> false
sq.update(height: 70, width: 70)
#=> 70
sq.calc_area
#=> 4900
sq.square?
#=> true
```

####ちなみに

上のおまけ実装でheightをupdateしたときは```nil```が返り、widthをupdateしたときは```sq.width```の結果が返る。

```ruby
sq.update(height: 40)
#=> nil
sq.update(width: 40)
#=> 40
```

heightをupdateしたとき、widthの条件文```if opts.key?(:width)```に当てはまらず返り値がnilになっている。

```ruby
def update(opts = {})
  @height = opts[:height] if opts.key?(:height)
  @width = opts[:width] if opts.key?(:width)
end
```

最後に```self```を返すようにしたらオブジェクトが返る。

```ruby
def update(opts = {})
  @height = opts[:height] if opts.key?(:height)
  @width = opts[:width] if opts.key?(:width)
  self
end

sq.update(height:30)
=> #<Square:0x000055ff79c97178 @height=30, @width=30>
sq.update(width:40)
=> #<Square:0x000055ff79c97178 @height=30, @width=40>
```


##参考

https://note.com/taka027/n/nbc4ff8856ef8
【AWS】ザックリ解説！世界トップシェアの理由に迫る！



# はじめに
2021年6月よりSESでのエンジニアデビューを果たし、これからスキルアップに向けてIT全般の知識を学んでいく所存。
今回はそのアウトプットの一環として、クラウド事業において世界トップシェアを誇るAWSに関する記事を書いてみる事にした。



# そもそもクラウドとは？聞いたことはあるけど。。。
　　
クラウドという言葉自体は聞いたことがあるかもしれませんが、具体的に何？と聞かれると困ります。
そこでざっくりですが、言語化していきたいと思います。


一言で言うと、
<font color="#1e90ff">「ユーザーがインフラ※やソフトウェアを持たなくても、インターネットを通じて、サービスを必要な時に必要な分だけ利用する考え方」になります。</font>

　　

もっと具体的に掘り下げてみると、利用にあたって、コンピューター（サーバー）の所在地（どこ？）が意識されない点が特徴として挙げられます。
　　
従来のコンピューターの利用形態では、利用者は手元のパソコンの中にあるソフトウェアやデータを利用していました。しかしクラウドサービスでは、ネットワークを経由して、雲（クラウド）の中にあるソフトウェアやデータをサービスの形で使います。
　　

![クラウド.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326745/2429d2f9-ce1b-9b46-0480-911768fc7625.png)

# では、本題のAWSについて

###AWSとは？

2006年に、Amazon 社内のビジネス課題を解決するために生まれた IT インフラストラクチャのノウハウをもとに、アマゾン ウェブ サービス（AWS）という名称でサービスがスタートしました。世界で最も利用されているクラウドインフラサービス（※）です。




これらのサービスはIaaS(Infrastructure as a Service)と呼ばれており、Googleが提供するGCP(Google Cloud Platform)やMicrosoftが提供するMicrosoft AzureもIaaSの１つです。




###AWSで実現できること


- 豊富なサービス
- 世界最上級の運用専門知識
- 最もセキュアなセキュリティ基準
- 安心できる情報網（コミュニティやパートナーの存在）
- まったく新しいテクノロジーを最速で提供し続けるサービスコンセプト


コスト削減や俊敏性を高めビジネスの効率化、ビジネススピードの加速化しイノベーションの加速を実現します。

AWSの大きな魅力のひとつが、初期費用がかからないことです。機材やソフトウェアライセンスなどの初期費用なしで、必要なときに、必要なだけ、低価格で多くの選択肢のなかから最適なITリソースをすぐに利用することができます！


###AWS学ぶべき理由


#### ・2020年代はビッグデータ活用が進められるため

ビッグデータの活用が進むことでAWSの需要が上がると考えられるのも、インフラエンジニアがAWSを勉強するべき理由の一つです。

AWSでもさまざまなデータを蓄積するためのサービスがあり、集めた大量のデータを分析することでマーケティングの分野に活かすことができます。

また大量のデータ運用を行う際にも必要に合わせてデータ量の増減を行い、運用費用を最小限に押さえることができるのもAWSのメリットです。

　　
####ビッグデータやプログラミングの知識を得られる
AWSではサーバーやストレージの他にも、ビッグデータを活用したアプリケーションを構築することができます。

ビッグデータを活用するメリットは、ビックデータを用いて解析したデータをマーケティングの分野に活かすことができるという点です。

またAWSのLambdaというサービスを活用することで、サーバーレスアプリケーションの構築やその他AWSサービスとの連携を行い、インフラ周りの構築・管理を楽にすることができます。

AWS Lambdaでは実際にコードを書く必要があるため、Lambdaを使うことでプログラミングの知識を身に着けることもできるでしょう。


#まとめ
  
AWSについての説明は以上になります。

AWSのこれからの需要であったり、エンジニアとして学ぶべき理由を何となく理解出来ましたでしょうか。

次はよりサービスに踏み込んだ記事を投稿していきますのでよろしくお願いします！

※今回参考にさせて頂いた記事
(https://aws.amazon.com/jp/what-is-aws/)
[インフラエンジニアにAWSのスキルは必要なのか？習得メリットを解説](https://www.sejuku.net/blog/125275)