OmniAICreator/Qiita-1.07M huggingface dataset:
【Microsoft Azure】AZ-900に合格しました！

## はじめに

"Azure"を今後の業務で使用するというのもあり、理解を深めるためまずはAZ-900の取得に向け学習を進めていきました。
試験には合格したため、試験の概要と私の学習方法/効果などを記録します。
これから受験される方のご参考となれば幸いです。

## 試験の立ち位置

AZ-900はAzure試験としては入門となる試験であり、合格するとFundamentals認定資格を取得できます。(取得できる認定は下記赤枠部分)
![Microsoft Certifications _ Microsoft Docs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005386/42423fe0-5046-26c0-1cf1-79a06089d95a.png)

## 試験概要 

　※受験時[2021/02/08時点]の情報となります。
　問題数：37問
　時間　：60分
　合格点：700点(おそらく1,000点満点)
　費用　：12,500円

出題形式は全問、選択式です。(正誤問題や、文章の空白を選択肢から埋める、などのパターン)

セクションは下記6つに分かれております。

 - クラウドの概念の説明(20-25%)
 - コアAzureサービスの説明(15-20%)
 - Azureのコアソリューションおよび管理ツールの説明(10-15%)
 - 一般的なセキュリティおよびネットワークセキュリティ機能の説明(10-15%)
 - ID、ガバナンス、プライバシー、コンプライアンスの機能の説明(20-25%)
 - Azureの料金とサポートの説明(10-15%)

## 学習方法と効果

主に、下記3つを実施しました。

 - AZ-900　ラーニングパス
   (https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900)
   Microsoftが提供している無料e-Leaningです。
   ひたすらに読み進め、サービスの種類や概要を理解していきました。
   **効果**：サービスの概要を理解できたと思います。「どのサービスでなにができるか」の基本的なことが書いてあります。
試験問題もサービスの概要を理解するだけで回答できる問題も当然あるため、ベースの点数を稼ぐためにもまずこちらは読むべきかと。

 - Azureアカウントの作成/いくつか触れてみる
   (https://azure.microsoft.com/ja-jp/free/)
   読むだけだとイメージしづらい点があるため、自分で触れるためにもAzureアカウントを作成しました。
   **効果：**サービスを利用するために「どのアイコンをクリックすべきか」ということも理解しました。やはり自分で触れたほうがイメージをしやすいですね。
   試験問題にも、どのアイコンをクリックするか？という問題は出てくる可能性はあるようです。ほんの1,2問だと思いますが。
   (「Azure Cloud Shell」を利用するにはどこをクリックしていくか？など)

 - Quizlet
   (https://quizlet.com/ja)
   オンライン学習ツールです。試験問題に慣れることを目的として、利用しました。
   無料アカウントを作成するだけで利用可能であり、AZ-900にかかわる問題を探して実際に解いていきました。
   **効果：**試験問題形式でみれるため、理解が浅いといった部分を認識できます。
   浅い、不明だという点を理解してさらに自分で調べるきっかけになるため、理解すべき点を絞れると思います。
  また、Quizletで出題される問題と類似するものが本番でも出てきたため、確実に点数を伸ばすことにもつながります。
   　　　

   

## 所感/まとめ

試験には800点強で合格となりました。
60分のうち、30分程度で全問題を解き終えました。（ケアレスミスが無いようにじっくり問題文を読んでいきましたが、時間は余りました。）
一度解き終わった問題には後で戻ることもできます。各問題にある”後で見直す”チェックボックスをマークしておくことで、全問題を見終わった後にリスト化され、振り返りやすくすることもできます。

問題に関しては、サービスを利用するにあたっての設定値などの具体的な部分までは問われないと思います。

「クラウド構成(Public,Private,Hybrid)の違い、各サービスの概要、費用がかかるタイミング/ケース、Azureアカウントに紐づく管理方法やサポート内容、セキュリティやコスト管理関連  等々...」をしっかりと抑えておく必要があると感じました。この辺りはラーニングパスを読めば問題ないと思います。

ただ、実際に業務で活用するためにはこの試験範囲の知識だけではなく、具体的な理解まで持つ必要があると感じました。AZ-900合格を皮切りに、上位試験も目指していきます。



**End**
Python Anacondaでの開発環境　【VScode】

皆さん、記事主モノ（[My Twitter](https://twitter.com/El4lQmonosiwnf) へ）です。
今回も学んだことについて、一つ一つアウトプットを兼ねて、Pythonに関する知識や理解を皆さんと共有できたらと思います。

さて、今回やっていくことは、実際にAnacondaを動かして開発環境を整えたり、パッケージの使いかたをアウトプットしていきます。

#１，Anacondaを起動してみよう
##1-1,　開発環境を整えていく
まずは、インストールしたAnaconda　Navigatorを起動していきましょう。
下記の画像のように選択した後、二枚目の画像のように表示されれば起動は完了です。

※一枚目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/a6ae6a13-3bf8-319d-8246-ec63758aaf6f.png)
※二枚目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/6dcd406f-55d5-7810-50a1-a381ff8402b0.png)


この表示された画面からはAnacondaの全ての操作ができるのです。
左側のcolumnのHomeタブは、Anacondaの提供するアプリケーションを起動したり、インストールするための画面になり、Launchボタンがある場合は既にインストール済みであり、すぐ使えます。
基本的にはJupyterlabとVSvode(Visual Studio Code)が使えるとよいです。
###Jupyterlabとは
データサイエンスや機械学習の実験を行うのに便利な開発環境で、今後そっちのほうへ進む方は今のうちにインストールしてもいいかなと思います。自分はインストールしました！
またJupyterlabは今後学ぶつもりなので、その記事もアウトプットがてら書かせていただこうと思います。
###Visual Studio Codeとは
多くのプログラマに愛されている無料のMicrosoft製のテキストエディタで、様々なプログラミング言語を開発するための拡張機能があります。
VScodeのダウンロードこちらから→ [Visual Studio Code](https://visualstudio.microsoft.com/ja/)
また自分も参考にさせていただいたVScodeの拡張機能についてはこちらを参照ください→[VScodeに必ず入れておきたい拡張機能](https://qiita.com/ucan-lab/items/e85931bf8276da43cc97)


##1-2,実際にpythonを動かしてみる
それではさきほどVScodeで、ダウンロードされた方、もうしている方は早速pythonを動かしていきましょう。
①先のAnaconda NavigatorからVScodeのLaunchボタンをクリックしてください。

②最初は、sample.pyとファイルを作ってVScodeを開けば必要なオススメの拡張機能のインストールを紹介してくれるので、それに従い、python向けの環境を整えましょう。
下記のように左に出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/8f9b43d9-8ec6-8e05-a2d9-c5d643446d1d.png)
③それでは実行するコードで定番のものを打ってみましょう。

```
print('Hello World')
```

④コードを書いたら右上の▷ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/9470cf5c-1134-a23b-594d-a15a215e196a.png)

⑤クリックされたら下の部分にターミナルが開かれ、先ほど打ったHello Worldがでると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/2cc7cd09-d15f-88c9-783f-73e55d233bdb.png)


#まとめ
いかがだったでしょうか。
これでVScodeでpythonによるコーディングからスクリプト実行までの作業が行えます。
また拡張機能も様々な方達によって公開されているので、自分の好みに合うカスタマイズをしてみてください。
次回はpythonのIDEであるpycharmについて書いていこうと思います。

読んでいただきありがとうございました
ではまた！

参考サイト
https://www.sejuku.net/blog/55331
参考書籍
Pythonプログラミングパーフェクトマスター
Gitサブモジュールでホスト名が解消できなかった

# はじめに

GitHubにて、サブモジュールを含むリポジトリをクローンしようとしたところ、
サブモジュールのupdateでこけた。
通常のリポジトリはクローンできたのになぜ？

```
Cloning into 'XXX'...
ssh: Could not resolve hostname github: Temporary failure in name resolution
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'github:XXX/xxx.git' into submodule path 'xxx' failed
```

# 状況

- GitHubにパブリックキーは登録済み
- 通常のリポジトリはクローンできた
- `git submodule update`コマンドを打つと、上記エラーが発生

# 解消

「githubというホスト名を解消できませんでした」のようなエラー文。
sshのconfigファイルを作成すれば直るのでは？と思い作成。

```config
Host github
        HostName github.com
        User git
        IdentityFile xxx/.ssh/id_rsa
```

設定すると、ちゃんとクローンできた！

# 見解

SSH経由でサブモジュールまでクローンしようとすると、合わせて2種類のリポジトリをクローンすることになる。
configファイルで設定していないと、ホスト名かSSHキーかわからないが、うまく認識できないものと思われる。

# 終わりに

まだまだGitを使いこなすには時間がかかりそう。
いっぱい使いながら、もっと学んでいかないとなと改めて思った。

---

最後まで読んでいただきありがとうございます。
認識が違っている点などがあれば、ぜひご指摘ください！
Unity RecorderでOBSみたいに、設定を詳細に設定したい

#初めに
![unity-recorder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/430d86f8-4d2b-aa72-cd5b-bd1ad6f141f3.png)
Unity Recorderを使って、gameビューを動画の録画をしているのだけど。

録画のQuality設定がざっくり、[Low][Medium][Hight]と三パターン、しかなく
![q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/67d8d436-c744-8ff1-d8a4-3c0ae8f85a41.png)


OBSのようにビットレートを設定して詳細に設定出来ないかと色々調べてみました。
↓OBS画面
![unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/d811b877-5795-9645-854e-57bda1dcd927.png)


##ググッテみた
google先生でUnity Recorderの画像検索をしてると下記の画面が見つかり
![2021-02-08_160258.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/4745750e-a0ee-3c52-c51e-e93d58953945.jpeg)

こんな設定があるのかと思いいろいろ調べた見たら、Unity Forumの記事を見つけました。
https://forum.unity.com/threads/unity-recorder-custom-bitrate.665239/

記事の内容を抜粋すると
(you need to check the "Show Legacy Recorder" in the Window > General > Recorder menu)
[ウィンドウ]> [一般]> [レコーダー]メニューの[レガシーレコーダーを表示]を確認する必要があります）
で出るようでUnity EditorのWindow以下を見てみるとかなり深い所にありました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/d8dd9ad3-a3d6-f68d-65d9-0e5a33386b1b.png)
設定をすると出てきた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/3c83fefe-3ee2-b640-d600-e18a4e46d181.png)

これでOBSと同じような録画設定ができるようになりました。

## Unity Recorderの設定
Format の設定に下記の項目が設定できるようになっています。
Bitrate mode[VBR] [CBR] 
Autoselect bitrate
Bitrate(bps)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/a71b6ad6-a91f-b5f7-0299-8911597a1dfc.png)

これだよ。設定したかったのは！！

## 音声
Unity Recorderの動画録画設定では、[include Audio]いうチェックボックスがあるので、入れることで
音声がはいるのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/0f9fae7f-fbec-2cc0-61fa-751187a954bb.png)
Legacy Recorderにはその設定がないので、音声は、別のソフトで入れないといけないです。


##終わりに
H.264で録画してみた見たのですが、結構Bitrateを上げてみたのですが、結構ブロックノイズがひどい。。
UnityはH.264の圧縮が弱いのかな？？ここわからないです。。（だれか教えて）
そして、結局使ったのは。もともとあった「Apple ProRes 422 LT」ほぼ無圧縮じゃん～～！！！
と言う堂々巡りしたってはなしでした。


##参考
Unity Recorder の使い方
https://qiita.com/tan-y/items/644760a18484cbe71d43
小さいArduino互換機の種類

# Arduino互換機の種類
　極小Arduinoのように使えるATTiny85について書く前に・・・これまで、いろいろなArduinoを使ってきましたが、それぞれの特徴のまとめ。概して、小さいほど難易度が高くなる。

▼[Arduino UNO](https://www.switch-science.com/catalog/789/)・・・ネット上に情報が数多くあり、まずこれで動作を確認して、余計な失敗を防ぐ。互換機は1200円ぐらいのものを使うと、ドライバいらずで心配も少ない。はんだ付けも必要なく、USBケーブルも付属するので安心。

▼[Arduino nano](https://www.switch-science.com/catalog/2554/)・・・UNOよりかなり小さくできるが、UNOより情報が減るので、ピンの確認とかがやや不安になる。互換機が400円ぐらいで買える。USBがminiになるので、入手性の点で難。ピンがはんだ付けされてないものがほとんどなので、自分でつける必要がある。（ついているものは、上側の6ピンまでついているので、それも不便）

▼[Arduino pro mini](https://www.switch-science.com/catalog/946/)・・・5Vと3.3Vがある。nanoからUSB端子を取ったような大きさ。nanoより小さくできるが、USB端子がないのぶん、使いにくい。

▼[ATTiny85](https://akizukidenshi.com/catalog/g/gI-09573/)・・・Arduinoとして使えて、とても小さくでき、なんと130円。プログラムを書き込む準備が大変で、もうひとつarduino UNOが必要。書き込んだ後、利用したい回路上に物理的に乗せ換える必要があるから、開発はめんどくさい上に、デバッグどうしたらいいのか、よくわからなくて困る。プログラムを書き込んだ後に、PC使わず単体で使う用途ならアリ。

▼[8pino](https://www.switch-science.com/catalog/2108/)・・・ATTiny85を使っていて、そういえば、グッドデザインの8ピンの製品があったなと思いだした。中身はATTiny85で、USBでの書き込みが簡単にできるようなっている。買おうと思ったけど、もう生産していないようだ。残念。

# ～～～～ESP32系～～～～
▼ESP-WROOM-32・・・WiFi使えて、便利そうと思ったが、結局使ってない。

▼[M5Stack](https://www.switch-science.com/catalog/3647/)・・・高価だが、液晶付き、バッテリー付き、3個ボタン付き、スピーカ付き、microSDカードスロット付きで3500円。[GRAYモデル](https://www.switch-science.com/catalog/3648/)だと、ジャイロセンサ、加速度センサ、方位センサまでついて4300円。高いけどおススメ。

▼[M5Stick](https://www.switch-science.com/catalog/5517/)・・・使ってない。

▼[Atom Matrix](https://www.switch-science.com/catalog/6260/)・・・M5Stackの端子を削って、すごく小さくしたもの。1400円。25個のフルカラーLEDと、1個のボタン、ジャイロセンサ、加速度センサがついてる。バッテリーがないのが残念。

▼[Atom Lite](https://www.switch-science.com/catalog/6262/)・・・さらに、LEDを1個にして、センサ類も削って、小さくしたもの。1000円。端子はMatrixと同じ。

▼[Seeed Studio XIAO ESP32C3](https://www.switch-science.com/products/8348)・・・十分に小さく、かつ、バッテリー充電回路が搭載されていることがとても便利。900円。
Google Colaboratoryのファイル扱いが少し気持ち悪い

# 結論
同名のファイルをアップロードした際に、Google Colaboratoryランタイム内のストレージでファイル名が変更されます。変更後のファイル名の取得がめんどうくさくて困った。

# ファイル読み書き101
こちらを参照のこと
https://colab.research.google.com/notebooks/io.ipynb?hl=ja

参照先では以下について扱われています。（本記事執筆時点2021/2月確認）

* ファイルのアップロード・ダウンロード
* Googleドライブ連携
* Googleスプレッドシート（pandas dataframeへの変換付き）
* Google Cloud Storage (GCS)

# ファイルのアップロードの動作が少し気持ち悪い
以下のコードでファイルをアップロードすることを考えます。

```py
from google.colab import files
uploaded = files.upload()
filename = list(uploaded.keys())[0] # only single file should be uploaded
```

ファイル名は以下で確認できるはずです。

```py
filename
```

実際に実行すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/39f4faf5-2440-8b1e-fced-9c0216121d40.png)

しかしアップロードを繰り返したり以前同名のファイルをアップロードしていたりするとファイル名が変更されます。しかし変更後のファイル名は副作用として表示されるだけで値として返ってきません。（files.upload()の返り値はディクショナリです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/b9204eab-7db9-5341-d9b9-a22646d7a2ee.png)

# アップロードされたファイルの確認方法
左側のペインのファイルアイコンをクリックすると確認することができます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/e8a54ca3-9f91-6dcf-1969-56d4307e747c.png">

# 困った
困った
Amazon ECSとは

## 勉強前イメージ

Elastic なんちゃら Service
そういうの多くてなかなか覚えれない

## 調査

### Amazon ECS とは

`Elastic Container Service` の略で、
Dockerコンテナを簡単に実行・停止出来る管理サービスです。
ECSを利用することによってDockerのインフラをまるっとAWSにおまかせできます。

### Amazon ECS の特徴

- Dockerのサポートがされる

ECSではDockerがサポートされているので、
ローカルでコンテナとしてパッケージしたものをECSでデプロイすることができます

- 開発しやすい

ECSでCLIを使用すると開発を簡素化出来るラメ、
コンテナを簡単に設定・実行できます。

- リポジトリをサポート

ECSはサードパーティーのリポジトリも使用することができます。

### 用語確認

- クラスター

サーバの集合体のようなもので、
ECSでは以下のようなテンプレートを選択することができます

![クラスタAmazon ECS - Google Chrome 2021-02-08 20.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9f4c040a-8bf0-6b07-3ff0-fabbf26269fc.png)

また、スケジューラーによってタスクが異常な状態であれば再度作成してくれます

- タスク定義

タスク定義はDockerコンテナを実行するために必要なもので、
「各コンテナで使用する Docker イメージ」 や 「タスクで使用する CPU とメモリの量」 などを設定します
以下はタスク定義で設定できる起動タイプの選択画面になります

![起動タイプAmazon ECS - Google Chrome 2021-02-08 20.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1f32ed8d-b3e3-181c-3b4b-b9860bc15a75.png)

- タスク

タスク定義の情報から起動させたコンテナの実行の単位です。

## 勉強後イメージ

そもそもちゃんとDockerがわかってないので、調査したところで怪しいんだけど
立ち上げたいDockerをぱぱっと作れてしまう。
メモリとかCPUとか、GUIで楽に出来るのはわかりやすい

## 参考

- [Amazon ECS](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/task_definitions.html)
- [【AWS】Amazon Elastic Container Service(ECS)について解説します](https://www.acrovision.jp/service/aws/?p=2830)
- [[初心者向け]コンテナのメリットをおさらいしながら、Amazon ECSでお手軽サービス作成してみた](https://dev.classmethod.jp/articles/ecs-beginner-tutorial/)
- [スケーラブルで高速なコンテナ管理サービス「Amazon ECS」の主な機能と使い方](https://business.ntt-east.co.jp/content/cloudsolution/column-25.html)
SourceTree Git マージやり方


メインのブランチををチェックアウト

メインのブランチをを最新にする

マージしたいブランチを右クリック

メインのブランチにマージを押す

pushする

この時最新のソースじゃない時にリジェクトされることがあるので、最新になっているか確認は必要
PDFのアルファチャンネルをグレースケールで見る方法

もらったアイコンの色が、なーんか薄いんだけど、みたいな時に、比較的簡単にアイコンのalphaチャンネルの値を確認できます。

# PDFのアルファチャンネルを確認する方法

imagemagickを入れておく。

```bash
brew install imagemagick
```

PDFのアルファチャンネルを、グレースケールPNGに変換して、プレビュー。

```bash
convert -colorspace RGB -alpha extract icon.pdf icon_alpha.png
open icon_alpha.png
```

開いてみて、黒い部分はAlpha 0.0、白い部分(0xFFFFFF)はAlpha 1.0です。
Git / Githubの各用語についてまとめ

##概要

未経験からWebエンジニアに転職して早くもぶつかったのがチーム開発でのGit/GitHubの使い方。
改めて、あやふやになっていた各用語をまとめてみる。

##基本

**git init**
initつまり初期化。
このコマンドを実行したディレクトリをgitによる管理対象とする
正確にはリポジトリを作成する

**git add**
対象のファイルをステージングエリアへ格納する
この段階ではまだファイルは管理されていない。

**git commit**
対象のファイルをローカル（自分のPC）のリポジトリに
コミットする。これにより１つの作業単位として保存され、
後に〇〇の作業前まで戻したいといった時などに活用することができる。

**git push**
ネットワーク上のリポジトリ（リモートリポジトリへ）
ローカルリポジトリの内容を反映させる。
これを行うことで、初めて自分の作業内容を他人と共有することができる。

**git pull**
リモートリポジトリからローカルリポジトリへ
内容を反映させるgit pushの逆バージョン
これを行うことで他人の編集したファイルなどを取り込むことができる

**git clone**
ネットワーク上に公開されているリモートリポジトリを自分のマシンへ
クローンする

**git branch**
ブランチを作成したり削除したりする。
ブランチとは一つの作業区画で、
別々のブランチで行った作業は互いに影響しない。
使い方はチームによって様々だが
例えばデフォルトのブランチはmasterブランチで
機能追加する（masterブランチへ影響を与えたくない）時にdevelopブランチとしてmasterブランチから切り離すなど
といった使い方。

**git merge**
他のブランチやコミットを現在のブランチに上書きする。

**git checkout**
他のブランチへ変更する。

**git remote**
リモートリポジトリのリンクを設定する

##その他
Railsチュートリアルでポートフォリオを作成するために学習した身としてつまづいたわかりづらい単語

###origin
これ混乱する。
originとはリモートリポジトリのリンクの別名みたいなものでGitがデフォルトでoriginとしている
Railsチュートリアルでは

```
git remote add origin https://github.com/hogehogerails.git
```

みたいな感じで設定していたと思う。
この上のコマンドの意味は
リンクhttps://github.com/hogehogerails.git（リモートリポジトリ　Githubなど）を「origin」として関連づけるということ

つまり **origin = リモートリポジトリ**という考えでだいたい間違いない。
このことから
origin/master はリモートリポジトリのmasterブランチのこと
```git push origin master``` はorigin（リモートリポジトリ)のmasterブランチにプッシュするということ



###HEAD
HEADは今いるリポジトリの最新の変更点を表す。
記事はこれが詳しすぎたので載せておきます。

https://qiita.com/ymzk-jp/items/00ff664da60c37458aaa

##最後に
GitはRailsチュートリアルで使っているようにコンソール上（黒画面）で叩くよりも
GUIツールを使った方が１００倍使いやすいです。
実際私も実務でSourceTreeというGUIツールを使っています。

いまだにGitの理解していない部分は多いですが、
こんな機能があるよ！、ここはこうだよ！というご意見、御助言がありましたら教えていただければ幸いです。
ROSの勉強　第7弾：基礎的なアクションの利用

# #プログラミング ROS< アクションの利用 >

##はじめに
1つの参考書に沿って，ROS(Robot Operating System)を難なく扱えるようになることが目的である．その第7弾として，基礎的なアクションの利用を扱う．


##環境
#####仮想環境
|||
|:-:|:--|
|ソフト|VMware Workstation 15|
|実装RAM|2 GB|
|OS|Ubuntu 64 ビット|
|isoファイル|ubuntu-mate-20.04.1-desktop-amd64.iso|

#####コンピュータ
|||
|:-:|:--|
|デバイス|MSI|
|プロセッサ|Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz|
|実装RAM|8.00 GB (7.89 GB 使用可能)|
|OS|Windows (Windows 10 Home, バージョン：1909)|

#####ROS
|||
|:-:|:--|
|Distribution|noetic|
|プログラミング言語|Python 3.8.5|

##実装
前回(https://qiita.com/Yuya-Shimizu/items/fb5cb4bb40e145426e5a) に実装したアクションサーバーを利用するため，クライアントの実装を行い，基本的なアクションの利用についての学習を進める．以下にソースコードを示す．なお，ソースコード内で，プログラムの説明は詳細に記述されている．

#####ソースコード
```python:action_simple_client.py
#! /usr/bin/env python3

import rospy

import actionlib #SimpleActionClientを使うためのパッケージ

from action_lesson.msg import TimerAction, TimerGoal, TimerResult	#アクションにアクセスするためのクラス

rospy.init_node('timer_action_client') #ノードの初期化

#actionlibパッケージにあるSimpleActionClientクラスを使う（アクション利用の最も簡単な方法）
client = actionlib.SimpleActionClient('timer', TimerAction)	#サーバー名，型ともに利用するサーバーっと一致させる必要がある

client.wait_for_server()	#サーバーの応答を待つ

goal = TimerGoal()	#goalという変数にTimerGoalのインスタンスを生成（TimerGoalの値にアクセス可能となる）
goal.time_to_wait = rospy.Duration.from_sec(5.0)	#5.0秒をタイマーにセットrospy.Duration.from_secでrosでの期間単位Durationに変換

client.send_goal(goal)	#clientとしてgoalをサーバーに送る
client.wait_for_result()	#サーバーからの結果を待つ

result = client.get_result().time_elapsed.to_sec()	#取得した結果の経過時間を秒単位に変換してresultに格納
print(f"Time elapsed: {result:.1f}")	#小数点以下1桁で結果の表示
```

これは，前回(https://qiita.com/Yuya-Shimizu/items/fb5cb4bb40e145426e5a) のサーバーを実行しているときにそのサーバーを利用するというものである．ここでは，5.0秒のタイマーを要求しており，5.0秒後にサーバーからの結果が得られることとしている．そのときの様子を次に示す．
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/ba5b60ee-a9a6-d81e-b1d9-1822fb4eb908.png)
上図において，上側のターミナル(端末)はアクションサーバーの実行で，下側がクライアントの実行である．結果が``Time elapsed: 5.0``となっている．小数点以下1桁のみを表示させているため5.0ちょうどに見えるが，下図に示すとおり本当は約5秒である．
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/8fa2f45c-b8d1-f138-869f-7056fe08578d.png)

##感想
今回はクライアントにより，アクションの利用を実装した．これを見ると改めて，トピックと似ていることが理解できる．また，アクションファイルなどはクラスのインスタンス生成により，アクセスするというのは慣れてきた．おかげで，ROSでのプログラムも具体的に何をしようとしているのか見やすくなった気がする．次回は，もう少し複雑なアクションサーバーの実装を学ぶ．ROSを活用するためには必要な部分であり，また楽しみである．

##参考文献
プログラミングROS Pythonによるロボットアプリケーション開発
　　　　　　　　Morgan Quigley, Brian Gerkey, William D.Smart 著
　　　　　　　　　　　　　　　　　　　　　　　河田　卓志　監訳
　　　　　　　　　　  　松田　晃一，福地　正樹，由谷　哲夫　訳
　　　　　　　　　　　　　　　　　　オイラリー・ジャパン　発行
【おっちゃんがエンジニアになるまで】(完)

# はじめに

自分で勝手にシリーズ化してたのに気づいたら更新止まってた。
無事エンジニアとして転職したので総まとめ的なのざっと書きます。

最初から見たいという奇特な方は[コチラ](https://qiita.com/baan_nasebanaru/items/7da95e0811cb54a49e44)からどうぞ

## 実際に行った内容

| 月数 | 内容 | 言語 | 時間(h) | その月以降継続しているモノ |
|:-:|:-:|:-:|:-:|:-: |
|   1| progate/自作サイト制作  |  HTML/CSS |  76 | 毎月1冊は読書 |
|   2| 模写/自作サイトその2/自己分析  |  HTML/CSS |  91 | |
|   3| Git/GitHub/Design/Atcoder  |  HTML/CSS/JS | 102  |毎月1回は記事を書く |
|   4|  開業届/初めてのお仕事 |  HTML/CSS/JS |  83 | |
|   5|  ITパスポ/LP制作 |  HTML/CSS/JS |  98 | |
|   6|  CS学習/LP制作 |  HTML/CSS/JS |  113 | |
|   7|  CS学習/システム開発 |  Node.js |  110 | |
|   8|  基本情報免除試験/システム開発 |  Node.js |  117 | |
|   9|  システム開発/ディレクション |  Node.js/SQL | 113  | |
|   10|  システム開発/ロードマップ見直し |  Node.js/C |  132 | C言語のコンパイラについて学習。週2h |
|   11|  ReactとCの学習開始/転職活動2社 |  React/C |  136 | |
|   12|  Reactのお仕事/転職活動20社ぐらい |  React/C |  144 |英語の学習。1日1ブロックで良いので翻訳 |
|   13|  Jamstackでのサイト制作/業務効率化ツール納品 |  React/Express/C |  106 | |
|   14|  Jamstackでのサイト制作 |  React |  121 | |

Total 1,541h

## 転職で考えたこと

- 仕事をもらいにいきたくない(営業活動しない)
- 仕事をお願いされるぐらいにならないといけない

これぐらいのマインドでやらないと30代で0から始めるならきついんちゃうかなって思ってました。

現実問題として最初から常に仕事が来続けたわけではないです。
ただ、転職活動始めてすぐに内定は出たし、仕事の依頼も継続的にいただけるようになりました。

## 実際に転職活動してみて

素直にいうと、めっちゃ嫌いでした。転職活動。
これコロナ禍だったのオンラインだけでしたが、オフライン中心やったらもっと心折れてた。
嘘つく感じなのがほんときつかった。特に志望してない会社を受けて「志望動機は？」って聞かれてる時はほんと申し訳なかった。

あと、転職活動にかける時間が本当に無駄だと感じた。1行でもコード書きたかった。

ちなみにどの会社もCTOとの面接は盛り上がりました。
ただ、CEOから「学生時代なにやってました？」って聞かれると無事死んでました^o^

パチンコとゲームしかしてないって素直に言って素直に落ちました^^

一応20社書類出して、4社ぐらい面接まで内定数社って感じやったはず。

## 未経験だから風当たりが厳しい？

過去との比較だと厳しくなってるみたいですね。僕は過去の比較ができないので知らないですが。
実際にやった感想はそんなに難しくない。むしろ自分が苦労してきたことをさせないようにしている人が多く、サポートは手厚いなと感じました。
求められてるものは明確やし、サポートも手厚い。

脱落してる印象が多いのはそもそも専門職なんだから、そら向き不向きはありますよって話な気はします。
一部の誇大広告のせいで「簡単、楽しい、儲かる」みたいな印象が先走りしてるだけであって。

## これから転職を目指す方へ

なにやっていい？がよくわからないと思うのでざっと書きます。

ロードマップはここがおすすめです。
https://roadmap.sh/

英語きついって方は**「Frontend」「Backend」**だけでも見てもらいたいです。

**「HTML」「CSS」「JS」**あたりは汎用的な知識なので共通化されてます。図から読み取ってもらえると。
この辺はとりあえずさわりとしてやるのはいいかと。というか実際に相談された際にはおすすめしてます。

試してみたいぐらいの感じであればprogateでWebサイト制作やってみるのがいいかと。サポートなしで

個人的にはそのまま学習して本業の合間で仕事受けて、いけそうだなと思えばスライドすればいいかと。
熱意とか勢いも大切ですが、気軽に試せるんだから軽い気持ちで触ってみていいと思ってます。

### 最初はWebサイト制作から入りました

自分自身のロードマップですが。
入口としておすすめしてます。実案件を受けやすいのがとてもメリットだなと感じます。
Git / GitHub などは共通化されてるスキルなのでそのままfrontに行かなくても役に立ちます。

## 反省点

大きく2つあります。

### 1. もっと実務に絡んでいくべきだった

正直仕事いっぱい受けすぎて、いっぱいいっぱいになるのが嫌だったし、学習は誰がみても良い反応ものらえるので逃げてました。
来た仕事を断るのはいかんすね。実務は経験値の宝庫なのでもっと受けるべきでした。

### 2. メタ的な視点が不足していた

仕事ができるプログラマーも駆け出しエンジニアも使ってるツールは大体同じ。
Chromeで検索してVSCodeで表現する。

物が同じなのだから、あとは使い方の問題である。
誰かだ描いた地図を進むのではなく、自分で地図を描けるようになる必要がある。

染み付いた会社員根性が抜け出せんすな〜

## さいごに

### いわゆる転職に成功してる人はたちは、適切なサポートを得られていると思う

もちろんその方達の努力もあるのですが。
自分たちでそこまで辿り着く力も、大事な一つの力やなと思います。

メンターの見つけ方はちょっと前までMENTAでもいいかなと思っていたのですが、
詐欺まがいなものもあるようなので、ブログなりTwitterなりみて個人に声かけるのがいいと思います。

個人的にはきらきらしてない人がおすすめ。

### 大体半年ぐらいは準備期間だと思ったほうがいいかと

もちろん数ヶ月で転職までいけるひともいるのですが。ただ転職がゴールではないので。
あと繰り返しになりますが、背水の陣は絶対やめましょ。コロナ禍が開けてもおすすめしません。

### とりあえずやってみればいいと思います

向いてないわー！と思えば違うことやればいいんやし。
未経験が〜とか駆け出しが〜って言及してる人いますけど、自分の人生なんだから好きにしたらいいと思います。

僕の場合はゲームやるより楽しかったので単純に向いてた。

在職中の人は、GASとかマクロ(VBA)使って業務効率化からやるといいと思います。
Firebaseコンソールに「dSYMが不足しています」のメッセージが出たときの対処法

## 対処法
Firebaseコンソールの案内通りdSYMファイルを上げればOK。
`path/to/`ってなに？ってなって若干詰まったので記事に残しておきます。

## dSYMファイルの場所

Xcodeの`window` → `organizer`
→ 該当のアーカイブを右クリック → show in Finderを選択
→ Finder上で`xcarchive`を右クリック → パッケージの内容を表示を選択
→ dSYMsディレクトリがあるので右クリックからパスをコピーしておく

## アップロード方法

公式の記載だと`path/to/`となってますが〜までのパスを指定してくださいの意味。
つまり↓みたいなこと
`絶対パス/FirebaseCrashlytics/upload-symbols -gsp 絶対パス/GoogleService-Info.plist -p ios 絶対パス/dSYMs`

例えばホームディレクトリの`iOS`配下にある`Sample-iOS`のdSYMをアップロードする場合以下のようになる。

```
// アプリの`Pods/FirebaseCrashlytics`内に移動してコマンドを実行
$ ~/iOS/Sample-iOS/FirebaseCrashlytics/upload-symbols -gsp ~/iOS/Sample-iOS/GoogleService-Info.plist -p ios dSYMファイルの場所でわかったパス/Sample-iOS.app.dSYMs

// 実行結果
Fetching upload-symbols settings...
Successfully submitted symbols for architecture arm64 with UUID 指定のUUID in dSYM: /指定パス/dSYMs/Sample-iOS.app.dSYM
Successfully uploaded Crashlytics symbols
```

## アップロード成功後

ターミナルに`Successfully uploaded Crashlytics symbols`が表示されてもしばらく待たないとコンソールに反映されないケースもあるそうです。
参考: [【Crashlytics upload dSYM successfully, But firebase console of Crashlytics still show dSYM required #5327 | Github firebase/firebase-ios-sdk】](https://github.com/firebase/firebase-ios-sdk/issues/5327)
その場合はしばらく待って、それでもだめならサポートに連絡しましょう。
Data Explorer の埋め込みURLから元のクエリを取り出す

# 概要

Azure Data Explorer (Kusto とも呼びます) は超高速に検索できる強力なデータストアです。お客様と、あるいはチーム内でクエリをシェアするのは、ちょうど数式と解答を一緒に見るのに似ていてとても有用です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32767/962658eb-f2ce-d70c-e9f3-09135f18d804.png)

Data Explorer でリンクをシェアすると以下のようなURLがクリップボードに送られます。

`https://dataexplorer.azure.com/clusters/クラスタ名.リージョン/databases/データストア名?query=エンコードされた Kusto クエリ`

このURLを開くと、ポータルで Kusto クエリが実行されて結果が表示されます。便利。

# クエリ文字列をデコードするコード
URLのクエリ文字列中に埋め込まれた Kusto クエリ（ややこしい）は、元の Kusto クエリを ZIP 圧縮したビット列を BASE64 にエンコードしたものです。この部分を取り出して、元の Kusto クエリを取り出すコードを書いてみます。あまり使うことはないとは思いますが。

簡単なので LINQPad でさっくりと。

```csharp
var s = "<EMBEDDED QUERY GOES HERE>";

var base64 = HttpUtility.UrlDecode(s);
var buffer = new byte[1024];
string queryString = string.Empty;
var e = Convert.FromBase64String(base64);
using (var gz = new GZipStream(new MemoryStream(e), CompressionMode.Decompress))
{
	while (true)
	{
		var len = gz.Read(buffer, 0, buffer.Length);
		queryString += Encoding.UTF8.GetString(buffer, 0, len);
		
		if (len < buffer.Length)
		{
			break;
		}
	}
}

queryString.Dump();
```

# おわりに

誰得な TIPS を書いてしまった。
GitHub 設定手順 ( macOS Big Sur )

##目的

Electronで作ったアプリをGitHubを使ってアップロードする手順のメモ

##環境

macOS Big Sur
git 2.24.3

##1. Git初期設定

```:terminal
$ git config --global user.name "【ユーザー名】"
$ git config --global user.email 【メールアドレス】
```
```:git情報の確認
$ git config --list
```

##２． 鍵の作成・設定

```:terminal
$ ssh-keygen -t rsa -b 4096 -C "【メールアドレス】"
$ Enter file in which to save the key (/Users/hoge/.ssh/id_rsa):/Users/YUI/.ssh/id_rsa_github
$ Enter passphrase (empty for no passphrase): 【パスフレーズを入力】
$ chmod 600 ~/.ssh/id_rsa_github
```

```:ssh-agentに秘密鍵を登録
$ ssh-add ~/.ssh/id_rsa
```

```:terminal
$ vim ~/.ssh/config
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_github
```

##3. リポジトリを作成する
```:GitHub
$ 省略
```
##4. GitHubに公開鍵を登録する

[「SSH and GPG keys」][link-1]にアクセス
[link-1]:https://github.com/settings/keys

```:terminal
$ vim /Users/YUI/.ssh/id_rsa_github.pub
```

##5. GitHubへのssh接続確認
```:terminal
$ ssh -T git@github.com
```

##6. GitHubに新規でプッシュする
```:terminal
$ cd my-app
```
```:my-app 
$ echo "# Test" >> README.md
$ git init
$ git add "作業フォルダ名"
```

#####コミットする
```:my-app
$ git commit -m "【コミット名】"
```

#####プッシュする
```:my-app
$ git branch -M main
$ git remote add origin git@github.com:yui0718/【リポジトリ名】.git //originを作成
$ git push -u origin main 
```

##7. GitHubに追加でプッシュする

```:my-app
$ git add "作業フォルダ名"
$ git commit -m "【コミット名】"
$ git push -u origin main 
```
##その他

```:originを一旦削除
$ git remote rm origin
```

参考サイト：
https://eh-career.com/engineerhub/entry/2017/01/31/110000
https://qiita.com/shizuma/items/2b2f873a0034839e47ce
SSH接続先の情報をssh configに記載する

## 目的

- SSH接続先の情報をssh configに記載してssh接続する方法をメモ的にまとめる

## 情報

- `$ ssh`コマンドが実行できるようになっていること。
- ssh鍵が作成されていること。

## 方法

1. 下記コマンドを実行してsshのconfigファイルを作成する。

    ```terminal
    $ vi ~/.ssh/config
    ```

1. 開いたsshのconfigファイルに下記の情報を記載する。

    ```~/.ssh/config
    Host 任意の接続先設定名
	HostName ssh接続先のIPアドレス
	User ssh接続先ユーザー名
        IdentityFile 接続用ssh秘密鍵のフルパス
    ```

1. 例えばssh接続先のIPアドレスが「000.000.000.000」でssh接続先のユーザー名が「test_user」でssh接続に使用する秘密鍵のパスが`~/.ssh/id_rsa`であり、設定名が「ssh-test」だったときは下記のように記載する。

    ```~/.ssh/config
    Host ssh-test
	HostName 000.000.000.000
	User test_user
        IdentityFile ~/.ssh/id_rsa
    ```

1. 下記コマンドを実行してssh接続を行う。

    ```terminal
    $ ssh 任意の接続先設定名
    ```

1. 先に例に上げた「ssh-test」にssh接続したい場合は下記を実行する。

    ```terminal
    $ ssh ssh-test
    ```
Drones

https://youtu.be/xmaTq4JgTXI https://betaflight.com/
"Betaflight is flight controller software (firmware) used to fly multi-rotor craft and fixed wing craft. This fork differs from Baseflight and Cleanflight in that it focuses on flight performance, leading-edge feature additions, and wide target support."

using the software with the hardware:
https://www.librepilot.org/site/index.html
"It focuses on research and development of software and hardware to be used in a variety of applications including vehicle control and stabilization, unmanned autonomous vehicles and robotics. One of the project’s primary goals is to provide an open and collaborative environment making it the ideal home for development of innovative ideas."
https://create.arduino.cc/projecthub/edocit/arduino-drone-042191
This would be a drone where a smart phone could be connected and it should have a no filing zone, and clear with the GOV. The cell should be on a protective case and another phone can controll it. 

![phone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/950107/3babe988-269d-d0a8-ebb9-1bd8360eaed1.png)
Red the following article: Criminal intent: FBI details how drones are being used for crime.

Providing 90 percent to help buy bibles sticks to help persecuted church by MT is licensed under CC BY-SA 4.0
Facebookページ埋め込み時のレスポンシブ設定（JS）

**「Facebookページの埋め込み、デバイス幅に合わせてリサイズしたいな〜〜」**となった時に、こういう記述をしました。

「[Facebook for Developers](https://developers.facebook.com/docs/plugins/page-plugin/?locale=ja_JP)」で自動生成されたカスタムデータ属性の値を、JSで操作します。
※「こうしたほうが楽だよ〜〜」「ここちがうよ〜〜」など、ご教示いただけますと幸いです。やさしめにお願いします。

# 手順
1. 自動出力された.fb-pageをJSで定義
1. .fb-page内のdata-width・data-heightに、JSから値を指定<br>(JSではdataset.widthとdataset.height)
1. デバイス幅で条件分岐しつつ、JSで数値を調整（幅は最大500）

# html
▼[Facebook for Developers](https://developers.facebook.com/docs/plugins/page-plugin/?locale=ja_JP)から出力したHTML

```
<div class="fb-page" data-href="<!--自動出力されたURL-->" data-tabs="timeline" data-width="" data-height="" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true">
  <blockquote cite="<!--自動出力されたURL-->" class="fb-xfbml-parse-ignore">
    <a href="<!--自動出力されたURL-->">
    代替テキスト
    </a>
  </blockquote>
</div>
```

# JavaScript
```
{ // Facebook埋め込みレスポンシブ対応
  const fb_page = document.querySelector('.fb-page');

  if (matchMedia('(max-width: 320px)').matches) { // ~iPhone5
    fb_page.dataset.width = '260';
    fb_page.dataset.height = '400';
  } else if (matchMedia('(max-width: 768px)').matches) { // ~iPhone6/7/8
    fb_page.dataset.width = '300';
    fb_page.dataset.height = '480';
  } else { // largeDevice
    fb_page.dataset.width = '500';
    fb_page.dataset.height = '500';
  }

  // 出力チェック用
  // console.log(fb_page.dataset.width);
  // console.log(fb_page.dataset.height);
}
```
【Godot】セーブデータの保存方法

# 概要
このページでは、Godot Engineでゲームデータをセーブ、ロードする方法について説明をします

:::note warn
この記事はGodot3.x版のものとなります。
Godot4.xでの実装方法は以下のページにまとめました。
* [【Godot4.x】セーブデータの保存方法](https://2dgames.jp/godot4-savedata/)
:::



# ファイルの読み込みと書き込み

ファイル書き込みは以下の記述で行います

```gd:ファイルを書き込む
# Fileオブジェクト生成
var f = File.new()

# ファイルを書き込みモードで開く
f.open("user://savedata.txt", File.WRITE)

# "test save" という文字を書き込む
f.store_string("test save")

# ファイルを閉じる
f.close()
```

このファイルを読み込む場合は以下のように記述します

```gd:ファイルを読み込む
# Fileオブジェクト生成
var f = File.new()

if f.file_exists("user://savedata.txt"):
  # ファイルが存在していたら読み込みモードで開く
  f.open("user://savedata.txt", File.READ)

  # テキストを取得
  print(f.get_as_text())

  # ファイルを閉じる
  f.close()
```

## 保存場所

Godot では「ユーザーパス (`user://`)」でファイル書き込みを行った場合以下の場所に保存されます

* **Windows**: %APPDATA%\Godot\ [プロジェクト名]
* **macOS**: ~/Library/Application Support/Godot/[プロジェクト名]

セーブデータが正しく書き込まれたかどうか確認する場合には、このパスにあるファイルをテキストエディタで開いて確認します。

この情報に関する公式ドキュメントは以下のページです
* [GODOT DOCS >> I/O >> データパス](https://docs.godotengine.org/ja/stable/tutorials/io/data_paths.html)

# JSON形式で保存する
JSONへの変換処理を使用すると、辞書型のデータがそのままテキストとして保存できて便利です。
例えば書き込み処理は以下のように記述します。

```gd:JSON書き込み
# セーブデータ
var data = {
  "name": "hero", # プレイヤー名
  "hp": 10 # HP
}

# JSONテキストに変換
var s = JSON.print(data, "\t")


var f = File.new()
f.open("user://savedata.txt", File.WRITE)
f.store_string(s)
f.close()
```

保存された savedata.txt を開くと以下のようなテキストファイルが作成されています。

```json:savedata.txt
{
	"name": "hero",
	"hp": 10
}
```


読み込み処理は以下のようになります

```gd:JSON読み込み
var f = File.new()
if f.file_exists("user://savedata.txt"):
	# セーブデータが存在するので読み込める
	f.open("user://savedata.txt", File.READ)
	var s = f.get_as_text()
	# JSONテキストを変換
	var err = JSON.parse(s)
	if err.error == OK:
		# 正常に変換できた
		print("name: %s"%err.result["name"])
		print("hp: %d"%err.result["hp"])
	else:
		# 失敗したら新規にセーブデータを作成する
		pass
else:
	# 存在しない場合は新規にセーブデータを作成する
	pass
```

ゲーム開始時にこの処理を呼び出し、セーブデータを読み込むようにします。
もしファイルが存在しない場合はセーブデータを新規作成し、JSONからの変換が失敗する場合も新規作成するようにします

# 参考

* [GODOT DOCS >> I/O >> ゲームの保存](https://docs.godotengine.org/ja/stable/tutorials/io/saving_games.html)
* [GODOT DOCS >> I/O >> データパス](https://docs.godotengine.org/ja/stable/tutorials/io/data_paths.html)
【React】Windowsでcreate-react-app環境構築【初心者向け】

## はじめに
Windowsでcreate-react-app環境構築をします。
Macであればサクッとできそうだったのですが、
Windowsの場合はHomebrewをWSLで動作させる必要がありました。

途中何度か躓いた点がありましたので、
各段階で参考記事&補足部分を纏め、記事にしました。

この記事では、Ubuntuをインストールし、シェルで作業していく流れになります。
※他にも方法ありそうです。

## 参考にさせていただいた記事
[WSL (Windows Subsystem for Linux) のセットアップ方法](https://www.techgaku.com/archives/615)
[Homebrewインストール](https://www.techgaku.com/archives/622)
[MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
[WSL上のUbuntuからWindows側のファイルにアクセスする方法](http://www.aise.ics.saitama-u.ac.jp/~gotoh/Lectures/TUS_IP/HowToAccessToFilesOnWindowsFromUbuntuOnWSL.html#toc5)
[日本一わかりやすいReact入門#3...create-react-appで環境構築しよう](https://www.youtube.com/watch?v=P5lDbRxp9sI&t=146s)

## WSLインストール～Ubuntuセットアップ

ここに関しては下記記事通りで、スムーズに進むかと思います。
参考：[WSL (Windows Subsystem for Linux) のセットアップ方法](https://www.techgaku.com/archives/615)

WSL上でUbuntuを使えるようになれば完了です。

### Homebrewインストール

参考：[Homebrewインストール](https://www.techgaku.com/archives/622)
コチラの記事の、【Homebrewをインストールする】の部分を参考にしています。

```command
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
```command
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
brew install hello
```

brew install helloコマンドを入力後、
下記コマンドでHomebrewのバージョンが表示されればOKです。

```command
brew -v
```

## nodebrewインストール
[MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
こちらの記事の【nodebrewのインストール】~【環境パスを通す】まで進めます。
※引き続きUbuntuのシェル上でのコマンド入力です。

Homebrewを使用してインストール

```command
brew install nodebrew
```

以下コマンドでnodebrewのバージョンが確認

```command
nodebrew -v
```

## Node.jsインストール
create-react-appにはバージョン8.10以上が必要です。
安定版で8.10以上になっていましたのでstableで実行。


```command
nodebrew install-binary stable
```

念のため、インストール後に-vコマンドで確認してみてください。

次にインストールされたnodeを有効化します。
以下のコマンドでインストールされたバージョンを確認します。

```command
nodebrew ls
```

```:結果
バージョンの記載があります

current: none
```
インストール直後はcurrent: noneとなっているため、必要なバージョンを有効化する。

```command
nodebrew use ○○(バージョンを記載)
```

再度nodebrew lsを実行して反映されているか確認して下さい。


次に、参考記事内の【環境パスを通す】
のところですが、下記コマンドで実行してください。

```command
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.profile
```
参考：[Ubuntuでnodebrewをインストールする方法](https://jsstudy.hatenablog.com/entry/How-to-install-nodebrew-on-Ubuntu)

一度、Ubuntuのシェルを閉じて、
再起動後、-vコマンドでnodeのバージョンが表示されれば完了です。

```command
node -v
```

## WSL上のUbuntuからローカル環境へアクセス
Ubuntuシェル上では下記パスでデスクトップまでいけます。

```command
/mnt/c/Users/ユーザー名/OneDrive/デスクトップ
```
参考：[WSL上のUbuntuからWindows側のファイルにアクセスする方法](http://www.aise.ics.saitama-u.ac.jp/~gotoh/Lectures/TUS_IP/HowToAccessToFilesOnWindowsFromUbuntuOnWSL.html#toc5)

開発ディレクトリを好きなところに置いて、cdコマンドで移動し、
そのままnpx create-react-appコマンドの実行、開発ができるはずです。


これで環境構築は完了です。
【Ruby on Rails】rails newのときにrailsバージョンとデータベースを指定したい

# rails new railsのバージョン指定、DB指定
railsの新規プロジェクトを作成するときに、rails new [プロジェクト名]でアプリを作成すると思いますが、そのときにrailsのバージョンを指定したい時。

```
$rails _6.0.3.2_ new todo-app
```
このようにrails newの間に、railsの使いたいバージョンを追加するとできる。

### databaseをなにを使うか指定したいとき

```
$rails _6.0.3.2_ new todo-app --database=postgresql
```
プロジェクト名のあとに```--database=postgresql```このようにしてdatabase名を追加する。
[未経験エンジニア]のオリジナルアプリ制作の反省5. local: trueはなぜ書くのか

# 今回書くこと
form_withに記述するlocal: trueはなぜ記述するのか

## 環境
Ruby 2.6.5
Ruby on Rails 6.0.4.3

## 結論
local: trueを記述する理由は、form_withにデフォルトで搭載されているremote: trueを打ち消し、同期通信にするため。

## form_withとは、と少し解説
form_withは、Railsのビューの拡張子としてerbを選択した時に用いる事ができる、フォームを作成するヘルパーメソッドです。ちなみに、ERB（Embedded Ruby）は、htmlやjsといった拡張子の後ろにくっつく事で、rubyのコードを実行できるファイルを生成できます。

Railsガイドによると、
> Action Viewのテンプレートはさまざまな方法で記述することができます。テンプレートの拡張子が.erbであれば、ERB (ここにRubyのコードが含まれます) とHTMLが含まれます。

とのことなので、例えば

```index.html.erb
<h1>このファイルには、rubyのコードを実行できる土台があります。</h1>
<%= form_with model: @example, local: true do |f|%>
  <%= f.text_area :title>
<% end %>
<h2>このように、htmlの要素の中にrubyのコード（ヘルパーメソッド）を組み込む事ができます。</h2>
```
の、ように記述する事ができます。

# 本題
さて、本題です。
先ほどのコードをもう一度見てみましょう。

```index.html.erb
<h1>このファイルには、rubyのコードを実行できる土台があります。</h1>
<%= form_with model: @example, local: true do |f|%>
  <%= f.text_area :title>
<% end %>
<h2>このように、htmlの要素の中にrubyのコード（ヘルパーメソッド）を組み込む事ができます。</h2>
```
2行目に、何気なく、**local: true**と書いてあります。これはなんでしょうか？

結論で述べましたが、これはremote: trueを打ち消すものです。
では、remote: trueとはなんでしょうか？

## remote: true
これは、「非同期通信を可能にする」ためのオプションです。非同期通信というのは、簡単にいうとブラウザをリロードしなくてもデータの更新だったりなんなりができる仕組みのことです。

実は、このremote: trueは、form_withにデフォルトで備わっています。つまり、form_withを用いて入力されたデータは、local: trueを書かない限り、勝手に非同期通信になるということです。なぜこうなるかはわかりません。

逆に、remote: trueをオプションとして付与することで、非同期通信が可能になります。例えば

```link.html/erb
<%= link_to "記事を削除", @article, remote: true, method: delete %>
```

とすれば、削除を非同期通信で行うことができます。

####（余談ですが）

form_withがrialsに導入されたのは、ver　5.1からみたいですね。それ以前は、form_forとform_tagというのを状況に応じて使い分けていたようです。

[こちら](https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2)の記事によると、

>これまで、フォームを作りたいときで、関連するモデルがなかったときは form_tag を使ってきました。
>そして、モデルがあったときは form_for を使ってきました。

とあります。この両方の機能が一つになったのが、form_withです。

##最後に
最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ！」というご意見、「そこどうなっているの？」というご質問など、お待ちしております。


## 参考文献
- [Action View の概要 3.1 テンプレート](https://railsguides.jp/action_view_overview.html#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88)
- [Railsガイド 3 組み込みヘルパー](https://railsguides.jp/working_with_javascript_in_rails.html#%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)
【Swift】とりあえず簡単に、起動時の画面を作成したSwiftUIファイルにしたい

2020/2/10 追記
**※この記事の方法はやや乱暴な方法なので、きちんと実装する場合はこちらを参考にしてください**
<https://qiita.com/antk/items/45e6e0d8c4619f3472f8>

# どういうことか

プロジェクトをStoryboardベースで作成したが、起動時の画面はあとから作成したSwiftUIにしたい。
いろいろ方法は探してみたけどうまく理解できなかった。
とりあえずこの方法で実装する。

## SwiftUIファイルをViewControllerから読み込む

方法としてはこうだ。

1. アプリが起動し、ViewControllerが読み込まれる
2. 読み込み時にSwiftUIで作成した画面に遷移する

この記事では **FirstView.swift** というSwiftUIファイルを表示させることを想定する。

```swift:ViewController.swift
import UIKit
import SwiftUI

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.   
    }
    
    // viewDidAppearはviewDidLoadより前に読み込まれる
    override func viewDidAppear(_ animated: Bool) {

        // 引数でSwiftUIのファイル名を指定する
        let view = UIHostingController(rootView: FirstView())
        // 遷移後にフルスクリーンで表示する
        view.modalPresentationStyle = .fullScree
        // 遷移する。アニメーションは無しにしておく
        self.present(view, animated: false, completion: nil)
    }   
}
```

以上(；´Д｀)
入力インターフェースによる受付がおかしい？と思ったときとった行動と、わかったこと

# ことのはじまり

いつものように、安いけれど使い勝手もいい ELECOM さんのキーボードでカタカタ、 powershell 起動したいなと思って、win マークを押下して `power` と入力、あったあった、powershell。さてさて、入力...、あれ？なんか入力受け付けてくれない。

しょうがないからコマンドプロンプト起動すればいいか。cmd.exe を起動、履歴をさかぼるか～～～と思って「↑」を押したら、あれれ選択モードになっているんだけれど...。

というか、Caps Lock 解除できないし、日本語入力に設定しているのに、「aaa」は「あああ」に変換されないんだけれど。なんだこれ...。


# こんなときにはサポートセンターへ

なんとなく、いろんなセキュリティソフト入れたし、あれが悪さしてそう、これが悪さしてそう、という罪悪感にかられながらも、サポートセンターに電話しました。

親切な対応をいただき、無事解決しました。

ハードウェア関連については、ググっても出てこないことが多いと思います。
素直にサポートセンターに連絡することは大事ですね。


# という話なら知恵袋に書けという内容なので

案内していただいた手順、実行手順をインターネットの海に放流します。
※なお、実行に際しては自己責任でお願いします。

1. 接続中のUSBデバイス、bluetooth などはすべて外してください
2. windows マーク（スタートアイコン）を右クリックし、デバイスマネージャーを選択します
3. キーボードを選択し、デバイスのアンインストールを行います。このとき、再起動が促されますので、実行中のタスクは完了してから再起動するようにします[^1]
4. 完了後、入力が受け付けない等の不具合があった箇所が修復されているか確認します

[^1]: 以下のような箇所となります。ほかのデバイスも接続しているので、実際には接続デバイスをすべて取り外してから実施されること。![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315145/a3ced5e7-d12a-b0ba-fa60-df1c651ef3d0.png)
PHPの数値計算メソッドが物足りなかったため自作

#本記事の環境
ホストOS：Windows 10
ゲストOS：CentOS 7
VirtualBox + Vagrant
Tera Term
remiリポジトリ
php7.3

#前段：PHPの数値計算系メソッドとは？
PHPには四捨五入、切り上げ、切り下げのメソッドが存在します。
※四捨五入：round、切り上げ：ceil、切り下げ：floor

#要件1：数値の丸め方について
* 「四捨五入」「切り上げ」「切り下げ」と「切り捨て」がしたい。
* 有効桁数を指定したい。  

###問題
* 他言語にある「切り捨て」がPHPにはなかった。
* roundは、有効桁数を指定できるが、ceilとfloorはできない。   
  ※round([対象値], [有効桁数]);  
　  有効桁数：小数第一位が0、小数部はそこからインクリメント、  
　　　　　　   整数部はデクリメント。  
  ※ceil([対象値]);  
  ※floor([対象値]);

###対処方法
* 「切り捨て」メソッドを作る。
* 有効桁数を指定できる「切り上げ：ceil」「切り下げ：floor」メソッドを作る。  
  ※実装方法はネット上に複数パターン存在します。  
　  ※例１：補正値を加算してから処理を実施し、後で補正値を取り除く。  
　  ※例２：桁数を落として小数部を取り除いてから桁数を戻す。

#要件2：計算結果について
* 正しい計算結果を出したい。  

###問題
* 2進数で表せない値を与えると結果に丸め誤差が生じる。(他言語も同様)
<pre>
floor((0.1 + 0.7) * 10);　      // 結果：7 (7.999999999999…に対して切り下げ処理を実施。)
floor((0.1 + 0.7 + 0.5) * 10);　// 結果：12 (12.999999999999…に対して切り下げ処理を実施。)
</pre>

###対処方法
* BCMathライブラリ(任意精度数学関数)を使うことにした。
<pre>
yum install --enablerepo=remi-php73 php-bcmath
systemctl restart httpd
</pre>

#その他注意点
* -0.5よりも大きく、0未満の負の数についてroundを使用すると「-0」へ変換される。
<pre>
round(-0.49999999999999, 0);　// 結果：-0 (絶対値の0.49999999999999を四捨五入して、その結果にマイナスをつけるため。)
</pre>
* 丸め誤差が生じるため、float(浮動小数点数値)同士の比較はやめた方がいい。文字列型にキャストして比較するか、bccomp()を使用するか、gmp()を使用するか。

#まとめ
PHPで数値計算を行う場合は、十分な仕様理解と(自作する場合は)作業工数が必要。

#参考
https://gotohayato.com/content/491
https://www.sejuku.net/blog/25405
https://www.sejuku.net/blog/48961
https://teratail.com/questions/11119
http://shiru-web.com/2018/04/14/01-81/
https://web-dev.xyz/php-round/
TrafficSentinelによるBGPピアリング分析

#TrafficSentinelによるBGPピアリング分析
ルーティングテーブル、ASパス、およびコミュニティを把握するために、ルートリフレクタを使用してTrafficSentinelからBGPピアを獲得する方法

##機能概要
ルーターがsFlow「ExtendedGateway」拡張機能を完全に実装している場合（[sFlow仕様](https://sflow.org/sflow_version_5.txt)を参照）、このピアリング接続は必要ありません。sFlowデータグラム内にピアリング情報を含めてルーターがエクスポートするからです（一部、NetFlowでも同様）。
それ以外の場合は、この機能を使用してルーティングテーブルを獲得し、それらを使用してCIDR、ASPath、およびCommunitiesフィールドで集約して、パケットヘッダーまたはフローレコードから表示される情報のようにトラフィックデータベースから利用分析できるようになります。


##データベースフィールド
この機能で入力できる[トラフィック・データベース・フィールド](https://inmon.com/sentinel_help/8.1/help/en/report/api_view_traffic.shtml)は次のとおりです。：

```
bgpdestinationaspath
bgpsourceas
bgpdestinationas
bgpsourcepeeras
bgpdestinationpeeras
bgpas
bgpcommunities
bgplocalpref
bgpnexthop
bgpnexthop6
ipsourcesubnet
ip6sourcesubnet
ipdestinationsubnet
ip6destinationsubnet
ipclientsubnet
ip6clientsubnet
ipserversubnet
ip6serversubnet
ipnexthoprouter
ip6nexthoprouter
```

##設定手順
global.prefs（[ファイル]> [設定]> [編集]> [ファイルの編集]> [global.prefs]）で、ピアリング接続を識別する行を追加します。:

```
BGPDefault=10.0.0.30
BGPLocalAS=65550
BGPPeerAS=12345
```
このサーバーからのBGPクライアント接続が出来るように、route-reflector（この例では10.0.0.30）を設定します。一般的な [bird routing daemon](https://bird.network.cz/) への設定例を次に示します。：

```
protocol bgp peer_SENTINEL {
  table peers;
  local as 12345;
  neighbor 10.0.0.114 as 65500;
  passive;
  import none;
  export all; 
  error wait time 1,10;
  error forget time 10;
}
```
次に、Traffic Sentinelにログインし、/usr/local/inmsf/scripts/runBgpmonを実行して、ピアリング接続をテストします。 ASCIIラインとして発行されたルーティングアップデートが表示されます。

例：

```
+,74.114.160.0/24,,,IGP,35908 1299 3356 3549,,
+,64.214.58.0/24,,,IGP,35908 1299 3356 3549,,
+,204.57.11.0/24,,,IGP,35908 1299 3356 3549,,
+,75.98.224.0/20,,,IGP,35908 1299 3356 3549,,
+,189.125.106.0/24,,,IGP,35908 1299 3356 3549,,
+,198.153.129.0/24,,,IGP,35908 1299 3356 3549,,
+,200.41.72.0/22,,,IGP,35908 1299 3356 3549,,
+,204.48.40.0/24,,,IGP,35908 1299 3356 3549,,
+,200.55.48.0/24,,,IGP,35908 1299 3356 3549,,
```

ルーティングテーブル全体がスクロールするのに1〜2分かかる場合があります（600,000ルートになる可能性があります）が、その後は、アナウンスと取り消し、着実に徐々に表示されます。 control-cを押してテストを終了します。

最後に、[ファイル]>[コントロール]でデータ・コレクションのストップ＆スタートを行います。これで、プロセス「inxsazd」にbgpmon.plスクリプトを実行する子プロセスがあることがわかります。

```
./inmsfd
  \_ inxtomcat -t 1580432484
  |   \_ java -Djava.awt.headless=true -Xmx2G -javaagent:sflowagent.jar -Dsflow.hostname=jvm-inmsf -Ds
  \_ inxtskd -t 1580432484
      \_ inxsazd -t 1580432484 -u inmsf -R
      |   \_ /usr/bin/perl /usr/local/inmsf/inx/bin/../../scripts/bgpmon.pl -l 10.0.0.114 10.0.0.30 65
      \_ inxpoll -t 1580432484 -H 1
      \_ inxADSweep -t 1580432484
```
##Exabgpの使用
exabgpパッケージをインストールする場合、global.prefs設定を調整することにより、それを使用出来るようにTrafficSentinelを設定できます。
例：

```
BGPDefault=10.0.0.30
BGPLocalAS=65550
BGPPeerAS=12345
exabgp=/sbin/exabgp
```
ここで、[ファイル]>[コントロール]でデータ・コレクションをストップ＆スタートすると、runBgpmonスクリプトが代わりにexabgpを実行します。設定ファイルはexabgp_conf.m4から生成されたexabgp.confであり、JSONからの変換はbgp_announce.py（すべて /usr/local/inmsf/scripts/ ディレクトリ）で実行されます。

##トラブルシューティング
前提条件としてパッケージ m4 をインストールする必要がある場合があります。
次のコマンドを使用して、bgp_announce.pyスクリプトを実行可能にする必要がある場合があります。:

```
sudo chmod 755 bgp_announce.py
```
runBgpmonスクリプトを手動で実行することは、ピアリング接続を使用する前にテストするための最良の方法です。エラーメッセージは/usr/local/inmsf/log/bgpmon.logに記録されます。
[Rails]Devise で保存されたパスワードを自前で認証したい

#課題
Deviseで保存された暗号化パスワードを自前システム用に認証したい

```irb:console
irb(main):010:0> user.encrypted_password
=> "$2a$12$vYelOHSlV8xtIfFShoZMIeWoOKVueTDeVQJtyl9JbLQilyLs5h4c."
```

#結論
valid_password?('string') を使うと出来た。

```irb:console
irb(main):011:0> user.valid_password?('password')
=> true
```

#参考情報
Github devise
https://github.com/heartcombo/devise/blob/master/lib/devise/models/database_authenticatable.rb
さくらのクラウドでWindowsサーバーを作ってデスクトップにMacからリモート接続する

# Macからさくらのクラウドに作ったWindowsServerにリモート接続する
便利だったので、自分用にメモ。

## Windows Server を作成

![ss 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/3734d288-ebce-5e53-3331-9d85a5a5c41a.png)

いろいろ設定。

## コンソール画面

URLを開くを選択

![ss 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/b6e5785a-2682-9cfa-c5f7-8f374ac4692b.png)


リンクを開くを選択
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/91ffab58-250a-d542-0454-052042591200.png)


Macでリモートコントロール画面が開く。すごい。
Macは最初からリモートコントロールアプリが入っていて、なにもしないでも使える。

![ss 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/2e1e2ff0-37b0-0791-7760-f6c75aa07615.png)

HHKBでログインするには
ctrl CMD FN+Del
を押す。
AdobeXDでWebカンプを作ってみる

#デイトラWeb制作コース初級編DA15Yの学び

# 【この記事に書いてあること】
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プログラミング学習20,21,23日目⏩<br><br>Web制作コース初級編DAY15💻<br><br>学習時間:2時間45分⏳<br><br>学習内容:AdobeXDでWebカンプを作ってみる✏<br><br>学び📚<br>・便利なショートカットがたくさんある<br><br>・XDのピクセル数と実際のコードで反映するピクセル数に誤差がある<br><br>詳細はQiitaで<a href="https://twitter.com/hashtag/%E3%83%87%E3%82%A4%E3%83%88%E3%83%A9?src=hash&amp;ref_src=twsrc%5Etfw">#デイトラ</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング学習</a> <a href="https://t.co/MW8bRdcFUn">pic.twitter.com/MW8bRdcFUn</a></p>&mdash; ふりっく💻トリプルゼロの（これから）フリーランス (@FuRiC_twi) <a href="https://twitter.com/FuRiC_twi/status/1358934330131816448?ref_src=twsrc%5Etfw">February 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#　【制作物】

![スクリーンショット 2021-02-09 9.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/299eb888-10a7-83d3-8104-14f00db76e16.png)


#　【学び】

1　＜Adobe XD便利なショートカット＞

・つかむ→V

・四角形→R

・アートボード→A　
（アードボード内に要素はある場合は名前をリックすると全体を動かすことができる）

・テキスト→T
（テキストを動かしたいときは、一度外側をクリックし、Vを押す）

・もどる→⌘＋Z

・進む→⌘＋shift＋Z

・太字にする→⌘＋B

２　＜アートボードと四角形の違い＞
アートボードはキャンパスのイメージ、その中に要素（四角形）を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/4e240bae-a6d4-5d32-8e07-c7643fbdcc1a.png)

3 ＜画像サイズの変更＞
画像の比率を変えないでサイズだけ変更したいときはshiftを押しながら画像を動かす

4　＜トラキイングの値について＞
　　文字の間に余白を付けたいときは、AVで変更する
　　この変更の値をコードで記入するときは
###                ↓

![スクリーンショット 2021-02-08 19.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/83a91c00-3e28-a4ff-9788-c826d7d0c467.png)


５　＜要素間の距離（ピクセル数）を測る方法＞
測りたい要素をクリック＋opitionを押しながらカーソルを動かす

６　＜要素の微調整＞
矢印キーでも移動できる
さらに、shift＋矢印キーで１０ピクセルずつ動かすことができる

７　＜複数選択＞
shift＋クリック
複数の要素のサイプや位置を同時に変更できる

８　＜グループ化してコンポーテントにする＞
　グループ化→⌘＋G
　コンポーネント→ライブラリからコンポーネントの＋を押す
【Web技術】Webの仕組みが今すぐわかる最初の一歩【用語の解説あり】

Web技術のもっとも基本的な部分を解説していきます。
この記事でわかることは２つです。

* クライアントサーバモデルの仕組み
* Web上に存在するリソースを指定するURIの構成要素

まずはこの2つを理解し、より深い内容を書籍で理解してみてください。
今回の記事で興味をもってもらえると嬉しいです。

# Webってなに？
調べてみると、Webの定義はさまざまですが、ここではこれからの話がわかりやすくなる定義を引用します。
> Webは、世界中に配置されたサーバに世界中のブラウザがアクセスする分散システムです。
> *書籍：Webを支える技術より引用*

わかったような、わからないような…という感じですかね。
事項で基本的なWebの仕組みを解説します。

# クライアントサーバモデル

![web_image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642155/88f18555-4a97-e4b6-623e-cb4af80ac7fa.jpeg)

もっともわかりやすい、基本の形です。
ブラウザからサーバに対して表示したいファイルを伝えます（**リクエスト**）。
サーバはブラウザから送られてきたリクエストに従い、ファイルを返します（**レスポンス**）。

上の図を見ればほとんど解説不要ですね。
わかりやすい例えだと、ウォーターサーバーとかも同じです。
水を備えたサーバーに、水を出してください。とボタンを押す感じですね。

この図のイメージを理解しておきましょう。
次はよく聞く用語の解説をしていきます。

# URI
URIは、Webページなど、ネット上のリソースを指定します。
例えば、Webサーバに対して「このファイルを探してー」とリクエストするのがこのURIです。
普段使うURLもこのURIの一種です。
事項ではURIの構成要素を個別に解説していきます。

# http
httpは、 「Hyper Text Transfer Protocol」の略称です。
データ通信をあらわします。
上の図でいうリクエストとレスポンスの部分です。
ちなみにhttpsとの違いは、データ通信の安全性です。
httpsは、データ通信が暗号化されるので、悪意をもった第三者に情報を抜き取られることを防ぎます。
# ポート番号
ポート番号とは、Webサーバのリソースにアクセスする出入り口です。
httpでは`:80`httpsでは`:443`をそれぞれデフォルトで使用しています。
そのため通常は省略されています。

# パス
パスは、Webサーバ内のリソースの位置を階層的に記述します。
例）https://.......**static_pages/home**
強調された部分がパスです。

# フラグメント
リソース自体の特定の位置をあらわします。
ページ内リンクでよく使われていますね。
![スクリーンショット 2021-02-09 8.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642155/e5e7e902-2e1c-1e4b-879e-8f858a215171.png)
`#なぜn1問題を回避すべきか`の部分がフラグメントです。

# まとめ
本記事では以下の解説をしました。

* クライアントサーバモデルの仕組み
* Web上に存在するリソースを指定するURIの構成要素

今回紹介した内容はWebの大枠であり、入り口の部分です。
Web系エンジニアになるためには、もっと詳しく理解しておく必要があるでしょう。
Web技術に関する書籍はたくさんあるので、ぜひ探して一読しておくことをおすすめします。
GitLabのrootパスワード変更方法

# 概要

GitLabのrootパスワードを忘れてしまった場合に、パスワードを変更する方法

# 手順

Gitlabサーバにログインし、RilsConsoleを起動する。

```
$ sudo gitlab-rails console -e production
--------------------------------------------------------------------------------
 GitLab:       12.4.0 (1425a56c75b)
 GitLab Shell: 10.2.0
 PostgreSQL:   10.9
--------------------------------------------------------------------------------
Loading production environment (Rails 5.2.3)
```

ユーザID(rootは1)からユーザを取得する。

```
irb(main):001:0> user = User.find(1)
=> #<User id:1 @root>
```

パスワードを設定する。

```
irb(main):007:0> user.password = 'password'
=> "password"
irb(main):008:0> user.password_confirmation='password'
=> "password"

```

保存する。

```
irb(main):011:0> user.save!
Enqueued ActionMailer::DeliveryJob (Job ID: d21626c7-04f4-4068-80c0-e9fa1d1ffdfd) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", #<GlobalID:0x00007fbc78357c58 @uri=#<URI::GID gid://gitlab/User/1>>
=> true
```

GitLabにアクセスすると、上記で設定したパスワードでログインできるようになっている。

### 参考
https://docs.gitlab.com/ce/security/reset_user_password.html#reset-your-root-password
Macでhomebrewをインストールするときに /usr/local/bin/brew update --force --quietとエラーが出る場合

Macでhomebrewをインストールするときに /usr/local/bin/brew update --force --quietとエラーが出る場合の対処法です。

下記の用にインストール中にエラーが出る場合

````bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
.
.
.

Failed during: /usr/local/bin/brew update --force --quiet
````

homebrew がおかしいので根こそぎ削除します。

````bash
sudo rm -rf /usr/local/Homebrew ;
````

再度インストール

````bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
````