OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon MCS(Amazon Keyspaces) とは

## 勉強前イメージ

セキュリティ認証情報でAmazon MCS認証情報のタブで見かけたけどこれは何？

## 調査

### Amazon MCS とは

Amazon Managed Apache Cassandra Service の略でMCSと呼ばれています。
プレビュー期間は Amazon MCSと呼ばれていましたが、正式にはAmazon Keyspacesというサービスになっています。
Apache Cassandra互換の可用性の高いマネージドなデータベースサービスです。

そもそもApache Cassandraとは、
オープンソースの分散型のデータベースで、NoSQLの一つになります。
複数のノードで管理することを前提にされておりハッシュ値によって記録するノードが選択されます。
初期はfacebook社が開発し、Apacheライセンスに基づいてオープンソースとして公開されました。
というもので、NoSQLのDBになります。

このApache CassandraをAWSでフルマネージドで使えるのがAmazon MCS(Amazon Keyspaces)になります。

### Amazon Keyspacesのメリット

- 既存のアプリケーションのコードが引き続き使用できる

Apache Cassandraと互換性があるため、現在Apache Cassandraを使用しているところでは
アプリケーションのコードはそのまま使用できます。

- サーバレス構成のためサーバ管理が不要

サーバレスの構成のためパッチ適応などが不要になります。
また、負荷に応じてオートスケーリングも可能です。

- 3箇所のAZで複製される

Amazon KeyspacesはDynamoを参考に作られているので同様に3箇所のAZに複製されます。

## 勉強後イメージ

初めて聞いた名前だし、Apache Cassandraも初めて聞いた。。。。

## 参考

- [Cassandra互換マネージドデータベースサービス「Amazon Keyspaces（Apache Cassandra用）」の一般提供を開始](https://codezine.jp/article/detail/12250)
- [[アップデート] Amazon Keyspaces (for Apache Cassandra) が GA されました](https://dev.classmethod.jp/articles/amazon-keyspaces-for-apache-cassandra-is-now-generally-available/)
- [Apache Cassandra](https://e-words.jp/w/Apache_Cassandra.html)
webarena indigoにsshで接続 Permission denied (publickey).

### webarena indigoのssh接続でハマったのでメモ(※ubuntuの場合)
### まず、はじめから登録されてるユーザ「ubuntu」で接続する
```
ssh -i [webarenaのコントロールパネルで作成したsshkey] ubuntu@サーバのipアドレス
```

### つづけて、普段使いのユーザ登録
```
sudo su -
useradd hoge #追加するユーザを「hoge」とする
usermod -G sudo hoge # sudo使えるように 
su - hoge
ssh-keygen
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
cat id_rsa #手元のpcにコピーする「~/.ssh/hoge.private」とする

# 手元のpcで次で接続
ssh -i ~/.ssh/hoge.private hoge@サーバのipアドレス
```

### 経緯
次のページに最低月額料金**270円**って見て早速試してみたんだけど、コントロールパネルのターミナルが動作しないのね、あるあるみたい。仕方なく初っ端からsshで接続になったんだけどユーザ名をもわからなくてハマったのでメモしときます。sakuraのvpsに比べるとちょっと不親切じゃなからろうかと思ったけどsshで接続できたらストレスフリーだね、なかなか良さそうしばらく楽しめそうだわ。
https://web.arena.ne.jp/indigo/price/
●Azure ADのエディション



■Azure AD Free

■Azure AD office 365アプリ
セルフパスワードリセット

■Azure AD Premium P1
クエリを用いて動的にグループメンバーを構成する動的グループや、場所やデバイスの状態でアクセスを制限する条件付きアクセスなどの機能がある。

■Azure AD Premium P2
Premium P1の機能に加え、不正アクセスを検知するAzure AD Identity Protectionや時間限定で管理者権限を付与するAzure AD Privileged Identity Management などの高度機能がある。
【基本情報技術者試験】最後の一週間でやること【まだ点数は伸びる】

先日、基本情報技術者試験を受けまして、**午前91.25点/午後94点**を取ることができました。
(合格発表はまだですが)
高得点で嬉しかったとともに、ラスト1週間で10点は上がったという確信があるので、これから受験の方向けに**最後の一週間の勉強方法**を共有したいと思います。

※合格保証はできませんので、参考程度にお願いします！

![午前.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1919799/ca6c2f5c-75c5-dbb1-a77f-9f5cde0eda3d.jpeg)
![午後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1919799/f33643e1-f210-8298-3213-c3693f0e9b39.jpeg)

## 午前試験
とにかく過去問やりましょう。でも、ただ解くだけではもったいないです。
**時間をかけずにやりましょう！！！！！**

具体的には、
- 過去問1回分(80問)を
- **最大でも60分まで、目標30~40分で一巡**

という具合です。使用教材は「過去問道場」を想定。
短時間で詰め込めれば、**1日3回分**は解けるので、10点20点上げるのは現実的です！

理解しきれずとも、問題と解答をひたすら覚えれば、午前は突破できます。
**とにかく解くのが近道です！！！**

## 午後試験
### 過去問
午前同様、**とにかく過去問です！！！**
**ただし、効果的に勉強したいなら、時間配分の意識は必須です！！！**

よく「午後試験は時間配分が重要」と言われますが、本当にその通りです。
問題文が長くしんどいので、集中が持続するうちに解ききりたいところ。

私は本試験で40分以上見直しに残すことができ、おかげでアルゴリズム含め3科目満点を取りました。
これだけ早く解けるのは、**早く解く練習をしたから**、ただそれだけです！

私が目安にしていた時間は以下の通りです。(時間計測はStudyplusでしてました！何でも良いです)
- 情報セキュリティ 12分
- 選択問題 各12分
- アルゴリズム 25分
- Python(ソフトウェア開発) 25分
- 計 74分
- **120分の試験で40分以上余る計算！**

目安…とは言え、12分、25分で解く気でいると解けません。人間ってそういうものです。
**もっと早く、10分、20分で絶対解く、と血眼になってやりました。**

気合って本当に大事で、こうやって解いていると**本当に早く解けるようになります**。
実際の試験ではPythonに30分かかるなど、思い通りにいかない部分もありました。でも、必死に訓練したからこそ心の余裕がありましたし、結果的に見直す時間も取れました！

**1日1回分で、1週間あれば7回も訓練できます。** 十分です。残り3日でも3回訓練できれば、確実に伸びると思います！！！

※時間が取れない日、いまいち取り組めない日は、通しでやらず大問ごとにやっても大丈夫です。そのときも、**制限時間は必ず測る**ことをおすすめします！

☆おすすめの問題集☆
4回分の予想問題(PDF含む)がついてくるので、一通りやれば演習量はバッチリです！
**※過去問道場でひたすら遡るでも十分だと思いますので、お好みで！**
↓

https://www.amazon.co.jp/dp/4297128721

### 個別対策
必要であれば、過去問と並行して個別対策もしましょう。
**基礎が固まっていないうちは、過去問よりも知識を取り込んだほうが伸びると思います！！！**

具体的には、
- **情報セキュリティ、選択問題で毎回点数を落としてしまう**
- **擬似言語の読み方がわからない**

といった場合ですね。
基礎が固まっていない…**解き方がわかっていない**うちは、演習量を増やしても点数を落としがちです。

直前対策で伸びやすい科目は、
**情報セキュリテイ = 選択問題** >>> アルゴリズム、ソフトウェア開発
体感このようになるかなと思いますので、優先順位の参考にどうぞ！
(※個人の偏見です、選択問題にもよります)

参考までに、私が行った個別対策を載せておきます！
各大問対策に、情報セキュリティ・選択問題は1~2時間、アルゴリズム・ソフトウェア開発は5時間以上かかりました。
早めに過去問取り組めるよう、優先度高いのだけorサラッと流す感じでやるのが良いかもしれません！

**情報セキュリティ・選択問題**
- [出るとこだけ! 基本情報技術者[午後]第2版](https://www.amazon.co.jp/dp/4798162175 "情報処理教科書 出るとこだけ! 基本情報技術者[午後]第2版")やる
情報セキュリティ…3位、7位、9位、11位
データベース…1位、2位、8位
※こちらの参考書、ソフトウェアやネットワークはなかったと記憶しています。購入前に目次確認は必須です！！！
- 過去問道場で3回分やる

**アルゴリズム・ソフトウェア開発(Python)**
- 疑似言語を読む、トレースする、が自然にできるように演習
**※本の対策は相当時間がかかるので、直前はおすすめできません。擬似言語・Pythonなど選択言語の基礎をサラッとやって、早めに演習に入りましょう！！！**
[基本情報技術者試験のアルゴリズム問題がちゃんと解ける本 第2版](https://www.amazon.co.jp/dp/4798150460 "情報処理教科書 基本情報技術者試験のアルゴリズム問題がちゃんと解ける本 第2版") のCHAPTER1~5
[基本情報技術者の午後対策 Python編 第2版 徹底攻略シリーズ](https://www.amazon.co.jp/dp/4295011398 "徹底攻略 基本情報技術者の午後対策 Python編 第2版 徹底攻略シリーズ") の基本文法さらっと+最後の演習問題
- 過去問道場で3回分やる

## おわりに
**過去問**推し強めですが、直前はこれが本当に重要です。
幸い、今年度までは過去と傾向が似ているので、問題慣れで点数がぐっと伸びると思います！

**基本情報に立ち向かう同志の皆さん、ご健闘をお祈りします！！！**
Javaで何か作ってみる(2022/10/27 Day7)

## 今日やった事
- Udemyの動画教材を少し見た。（**J1-10_繰り返し～for～** まで見た。）
## 参考にしたもの
- [【超絶丁寧解説】Javaプログラミングをゼロから学ぶ！絶対挫折させない「基礎入門」講座【講師評価4.3】](https://www.udemy.com/course/uz-java-kiso/)
    &rarr; Javaの勉強に使用しているUdemyの動画教材。
## 所感
- 今日は日中に勉強する事が出来た。
- JavaにおけるString型は、参照型であり、本来なら、　　  
    ```　　
    String moji = new String("hoge");
    ```
    とやらなきゃいけないところを、Javaの開発者によって特別なプログラムが組まれている為、  
    ```
    String moji = "hoge";
    ```
    といった具合で、プリミティブっぽく（これを疑似プリミティブ型と呼ぶらしい）使う事が出来ると理解した。
- 直近はPHPやJavaScriptをやっていて、メモリの管理について考える機会がなく  
忘れかけている気がするから、Javaを勉強するのを機に、復習したい。
## 明日の予定
- 引き続き、動画教材を進めていく。
- やった練習問題は、GitHubに上げてもいいかもしれない。
fixture_file_uploadメソッドを使用してテストコードを書く

# Formオブジェクトを導入してテストコードにエラーが出た

テストコードを打ち込む際にエラーで悩まされていたのですが、Formオブジェクトを導入すると以下のように
fixture_file_uploadメソッドを使用しないと行けないという事が分からずに時間をかけてしまいました。
以前はafterメソッドを使用してダミー画像をFactoryBotで用意していたのですが
```ruby:FactoryBot
after(:build) do |item|
  item.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
end
```
Formオブジェクトを導入すると上記の方法ではダミー画像を使用できませんでした。

# fixture_file_uploadメソッド

調べてみると下記のようにRSpecにfixture_file_upload（該当ディレクトリの画像ファイル）を使用して
インスタンス変数に代入すると良いと言うことで試してみた所無事解決しました。
```ruby:RSpec
RSpec.describe ItemForm, type: :model do
  before do
    user = FactoryBot.create(:user)
    @item = FactoryBot.build(:item_form, user_id: user.id)
    @item.image = fixture_file_upload('app/assets/images/abc.png')
    sleep(0.1)
  end
end
```

# 学んだこと
RSpecとFactoryBotについての関係性について改めて理解度を深める事が出来ました。

# 参考にさせて頂いたサイト
[ActiveStorageとFakerを利用した際に、画像を含めたテストをする方法](https://qiita.com/taka_no_okapi/items/0aa1be3624b337fa5db9)
【JavaScript】多次元配列の並び替えをする（複数キーも想定）

# JavaScriptで多次元配列をソートする方法

以下の配列を想定

```js
const lists = [ 
  [ 1, 3 ], 
  [ 1, 2 ], 
  [ 2, 1 ], 
  [ 1, 1 ] 
]
```


## 昇順

### 1つ目を第一優先

```js
function sortArray(arr){
  arr.sort((a,b) => {
    return a[0] - b[0]
  })
}
sortArray(lists);

// 出力    
// [
//  [ 1, 3 ], 
//  [ 1, 2 ], 
//  [ 1, 1 ], 
//  [ 2, 1 ] 
// ]
```

### 2つ目を第一優先

```js
function sortArray(arr){
  arr.sort((a,b) => {
    return a[1] - b[1]
  })
}
sortArray(lists);

// 出力    
// [
//  [ 2, 1 ], 
//  [ 1, 1 ], 
//  [ 1, 2 ], 
//  [ 1, 3 ] 
// ]
```

## 降順

### 1つ目を第一優先

```js
function sortArray(arr){
  arr.sort((a,b) => {
    return b[0] - a[0]
  })
}
sortArray(lists);

// 出力    
// [
//  [ 2, 1 ], 
//  [ 1, 3 ], 
//  [ 1, 2 ], 
//  [ 1, 1 ] 
// ]
```

### 2つ目を第一優先

```js
function sortArray(arr){
  arr.sort((a,b) => {
    return b[0] - a[0]
  })
}
sortArray(lists);

// 出力    
// [
//  [ 1, 3 ], 
//  [ 1, 2 ], 
//  [ 2, 1 ], 
//  [ 1, 1 ] 
// ]
```

## 複数キーの並び替え

### 1つ目を第一優先、2つ目を第二優先（いずれも昇順）

この場合、以下で出来た！！

```js
function sortArray(arr){
  arr.sort((a,b) => {
    if (a[0] < b[0]) return -1
	if (a[0] > b[0]) return 1
	if (a[1] < b[1]) return -1
	if (a[1] > b[1]) return 1
    return 0
  })
}
    
// 出力    
// [
//  [ 1, 1 ], 
//  [ 1, 2 ], 
//  [ 1, 3 ], 
//  [ 2, 1 ] 
// ]
```

もっとスマートな書き方ありましたら教えてください。

## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
pythonで一つのバイナリにsigned unsigned型を混ぜて入れたい


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png" align="top" /> どうすりゃいいのさ…



# こまった
pythonで値をバイナリにまとめて外部に送信する時に、符号付きの整数(unsigned short)と符号なし整数(signed short)をまぜる必要が出てきました。
前提として、pythonの値は型を持たないという特徴があり、そこが悩みどころです。

C+であれば型の情報を持っているので共用体unionを使えば簡単に解決しますし、またpythonでもデータを取り出す分には、struct.unpackで型の指定を分けて配列を作れば大丈夫です。
pythonで型やバイナリを扱う際にも、numpyを使えばなんとかなります。
ただデータをバイナリに入れる際に、pythonは補数がどこにあるのかよくわからず、変換で少し悩みます。
何か方法がありそうですが、調べ方がわかりません。

# 方法

スマートな方法が浮かばないので、ゴリ押しでやってしまいます。

python環境での値A → バイナリ配列 → C+環境のunsignedで取り出した時に値Aとなる

としたいわけです。
変換せずに実行すると、1~32767までの整数は問題ないのですが、32768以降はunsignedで取り出した時に負の数値と解釈されてしまいます。

改めて、sined short と unsigned shortの対応を見てみます。

|unsigned short|signed short|
|---|---|
|0|0|
|1|1|
|2|2|
|...|...|
|32766|32766|
|32767|32767|
|32768|-32768| 
|32769|-32767|
|32770|-32766|
|...|...|
|65533|-3|
|65534|-2|
|65535|-1|

これを綺麗に変換できる方法がよくわからないので、
unsigned shortとして取り出した時に目的の値Aに見えるように、バイナリに入れる時に値を変換しておくようにします。

Aが元の値(0~65535)、yがsigned short(-32768~32767)として

```
if A > 32767:
    y = -(65536 - A)
else:
    y =A
```

と変換してyをsigned short送信すれば、先方でそのバイナリをunsined shortとして取り出した時に、元の値Aを復元できるようなります。のはずです。

これでうごくけど、なんとなく本当にこれでいいのかというモヤモヤは残ります。
【Python】pytestでfaulthandlerを無効化する

# はじめに

`pytest`を触っていると、下記のような `Windows fatal exception`が大量に表示されたことはありませんか?

```sh
Windows fatal exception: code 0x80010108

Thread 0x0000625c (most recent call first):
  File "C:\Users\Hoge\AppData\Roaming\Python\Python38\site-packages\comtypes\__init__.py", line 185 in shutdown
Windows fatal exception: code 0x80010108

Thread 0x0000625c (most recent call first):
  File "C:\Users\Hoge\AppData\Roaming\Python\Python38\site-packages\comtypes\__init__.py", line 185 in shutdown
```

この例外はOSSライブラリに依存するものもあり、こちら側からはどうしようもない場合があります。  
本稿では、このような例外が大量に表示される場合の対処法を紹介します。

## 環境

- python: 3.10.6
- pytest: 7.1.3

## 結論

下記のオプションを`pytest`に追記することで無効化されます。

```sh
pytest -p no:faulthandler
```

## faulthandlerとは？

Pythonの標準ライブラリに含まれるモジュールです。  

> このモジュールは、例外発生時、タイムアウト時、ユーザシグナルの発生時などのタイミングでpython tracebackを明示的にダンプするための関数を含んでいます。これらのシグナル、SIGSEGV、SIGFPE、SIGABRT、SIGBUS、SIGILL に対するフォールトハンドラをインストールするには faulthandler.enable() を実行してください。python起動時に有効にするには環境変数 PYTHONFAULTHANDLER を設定するか、コマンドライン引数に -X faulthandler を指定してください。  
(<https://docs.python.org/ja/3/library/faulthandler.html> より抜粋)

何のことだかといった感じですが、簡潔に言うと「セグフォをスタックトレースに出力するもの」になります。

## セグフォとは？

「セグメンテーション違反」というものです。

> ソフトウェアがアクセス禁止とされているメモリ上のエリアにアクセスしようとしたり、メモリ上の位置ごとに設定されているルールに違反してメモリにアクセスしようとするときに起こるものである。  
([wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%81%95%E5%8F%8D)より抜粋)

大量に出力される`Windows fatal exception`は、基本的にメモリへのアクセス違反が原因で起こるわけなんですね。

## pytest-faulthandlerというプラグインがあったけど…？

`pytest`のプラグインとして、`pytest-faulthandler`というものがありますが、`pytest 5.0` から `pytest core` に統合されました。  
(詳細は[こちら](https://pypi.org/project/pytest-faulthandler/))

下記のオプションはレガシーなため、最初に紹介した方法で無効化してください。

```sh
pytest --no-faulthandler
```

## おわりに

筆者がこのエラーに遭遇したのは`pywinauto`や`comtypes`で、windowsアプリケーションの自動操作スクリプトをテストしていた時にでした。  
似たような境遇で困っている方の一助になると嬉しいです。
【Python】気象庁の降水量データを整形して、地図上にバーグラフを表示してみた【Streamlit】

## はじめに
バーグラフを描画したい、折れ線グラフを描画したい、、etc と思ったときに、それぞれのグラフを描画しやすい形に生データを整形したデータ（ファイル）が必要になります。
そんなときに、自分で自由にデータ整形ができるとデータ解析の幅が広がりますし、自分が表現したいようにグラフを描画することができるようになります。

今回は、マップ上にバーグラフを表示するために必要なデータファイルの整形の方法と、Streamlitを使って整形したデータを地図上にプロットする方法をご紹介します！

動作検証済み環境
```
macOS Monterey(12.4), python3.7.10
```

本記事の続きはZennに移動しました :bow:

https://zenn.dev/labcode/articles/97a7410a0698f9
二値化画像の白の部分を任意の色にしたい

# はじめに
二値化画像は、符号なしバイト(unsigned char)で１チャンネルのグレイスケールのMatで、黒(値0)と白(値255)組み合わせの白黒画像になります。
良く有効な部分は白で表す場合が多いですが、今回は白の部分をBGR(RGBでは無い)で埋めます。

# 考え方

入力の二値化画像お同じ大きさの符号なしバイト(unsigned char)で３チャンネルのMatを作り、それをcv::Scalarで任意の色の画像とします。
作成した色画像から二値化画像をマスクにして、コピーします。

・二値化画像
![bin_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/5a142e9e-29e6-b665-4841-7570b22f4876.png)

この二値化画像の白の部分を緑にします。

# ソースコード

```C++:main.cpp
#include <opencv2/opencv.hpp>
#include <stdio.h>

int main(int argc, char* argv[])
{
	//二値画像表示
	cv::Mat src = cv::imread("bin_img.png",CV_LOAD_IMAGE_GRAYSCALE);
	//任意の色をつけたsrcと同じ3チャンネルMatを作成
	cv::Mat color_mat = cv::Mat(src.size(),CV_8UC3);
	//緑色にする(cv::ScalarはB,G,R)の順
	color_mat = cv::Scalar(0,255,0);
	//二値画像の白の部分だけ緑にする
	cv::Mat complate_mat;

	color_mat.copyTo(complate_mat,src);

	//結果表示
	cv::imshow("src",src);
	cv::imshow("color_mat",color_mat);
	cv::imshow("complate_mat",complate_mat);
	cv::waitKey(0);

	return 0;
}
```

# 結果

・緑色の画像
![green.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/8fcec3a9-bee9-76fd-e418-29e5f1fd1d85.png)

・最終結果画像

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/f60e2615-f2c0-bb61-4dcd-29504478d304.png)


# 結果

処理としてはマスクを使用した簡単なものですが、
例えば、任意の画像をコピーさせれば、
マスクされた画像を表示出来たりと、
応用の余地はあるかと思います。
子供向けアプリ案として iOS_おやつの合計金額算出アプリ

# はじめに
1枚もののアプリなら作れそうな気がする（←画面遷移時のあらゆる考慮に自身がない）


# 1枚もののアプリを作ろう
なんなら一晩でできるやつ（15~45分）
一晩と言っても、アニメ鑑賞の時間も確保せねばならんしな。


# アプリ画面

![Simulator Screen Shot - iPhone 14 Pro - 2022-10-27 at 22.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551624/433cb645-ce58-c284-593e-9280565ec068.png)


# コード

```swift:ContentView.swift

import SwiftUI

extension UIApplication {
    func endEditing() {
        sendAction(
            #selector(UIResponder.resignFirstResponder),
            to: nil, from: nil, for: nil
        )
    }
}

struct ContentView: View {
    @State private var price = "0"
    @State private var commitPrice = 0
    @State private var num1 = 0
    @State private var num2 = 0
    @State private var num3 = 0
    @State private var sum = 0
    @State private var inputNum = "0"
    var body: some View {
        VStack {
            Text("いくら買う？")
            HStack{
                TextField("RoundedBorderTextFieldStyle", value: $commitPrice,formatter: NumberFormatter())
                    .keyboardType(.numberPad)
                    .font(.title)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                Text("円")
            }
            
            Button(action: {
                sum = num1 + num2 + num3
                price = String(sum)
                UIApplication.shared.endEditing()
            }, label: {
                Text("おやつのごうけいのおかねをきめる")
            }).padding()
            
            
            HStack{
                TextField("RoundedBorderTextFieldStyle", value: $num1,formatter: NumberFormatter())
                    .keyboardType(.numberPad)
                    .font(.title)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                Text("円")
            }
            HStack{
                TextField("RoundedBorderTextFieldStyle", value: $num2,formatter: NumberFormatter())
                    .keyboardType(.numberPad)
                    .font(.title)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                Text("円")
            }
            HStack{
                TextField("RoundedBorderTextFieldStyle", value: $num3,formatter: NumberFormatter())
                    .keyboardType(.numberPad)
                                .font(.title)
                                .textFieldStyle(RoundedBorderTextFieldStyle())
                Text("円")
            }

            Button(action: {
                sum = num1 + num2 + num3
                price = String(sum)
                UIApplication.shared.endEditing()
            }, label: {
                Text("えらんだおやつのきんがくをけいさんする")
            }).padding()
            
            Text("おやつは\(price)円でいいですか？")
            
            
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


```


# 感想と反省点
* いくらなんでも簡素すぎた
* これ実際に子供には使いにくいだろう？
* かわいくないし、かっこよくもない。とはいえ、レイアウトはまぁおいおい直すとしよう。
* 文字入力より、カメラ起動させてお菓子の値札から数値を認識させるように作り変えたいな
GASでWebGLあげるためのテンプレート作った

# ソース
テンプレート自体はGitHubにあげましたので、それをご参照ください。
これ自体は自分のいつも使う環境から、Unity2020・2021に対応できていると思いますが、今後のUnityのアップデートで使用できなくなる可能性はわりとあります。
これを導入して、エラーがあったらこの記事の続きを読み進められることをおすすめします。

https://github.com/kochounoyume/EmbedWebGLTemplate

# 使い方
いちおう、このテンプレートの使い方を書いておきます。

## 1. WebGLビルドする
当たり前ですね。記事のタイトルを見てくれと。
ただ、ビルドの圧縮形式によって少し細かな設定が必要です。
ビルドの圧縮形式は、Project SettingのPlayer項目から参照することができます。
下の画像のうち、`Compression Format` が圧縮形式の設定項目で、この部分の設定次第で `Decompression Fallback` を設定する必要があります。

![スクリーンショット (285).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/cc4fd8a6-73c9-4546-45c3-985558abcff3.png)

1. `Disabled` の場合
   圧縮を無効にする設定なので、`Decompression Fallback` はチェックをつける必要がありません。てか、そもそも設定できんのじゃなかったっけ（できたかも）。
   
2. `Gzip`・`Brotli` の場合
   圧縮を有効にする設定なので、当然ですがそれを解凍なり何なり処理する設定をする必要があります。
   いくつか方法はあるようなのですが、GASのHTMLに埋め込むわけなので、サーバー側で何か設定できる可能性は薄いです。
   なので、`Decompression Fallback` にチェックをつけて設定することで対処します。
   しかし `Decompression Fallback` を設定する方法には、読み込み速度が遅くなるというデメリットがあることも一応、確認しておきましょう。

このへんの圧縮形式でより詳しい情報がほしい人は、公式リファレンスにいきましょう。

https://docs.unity3d.com/ja/2021.3/Manual/webgl-deploying.html

## 2. 該当ファイルをクラウド上にあげる
さて、ビルドが無事成功したと仮定して、GASのHTML上で読み込むためにいくつかのファイルをクラウド上にあげる必要があります。
要件として、<INS>直リンクを取得する</INS>必要があります。

今までUnityのクライアント開発一筋だった人間からみると、これが結構きつい条件だったりします。
例えば、Googleドライブはだめです。
Googleドライブは共有リンク以外に、若干頑張れば直リンクも出せるのですが（やり方は詳しくはググるのだ）、圧縮ファイルはともかく、jsファイルは直リンクで読み込めないGoogleドライブの仕様ゆえに、Googleドライブ上から読み込むことができません...。

一つだけ、直リンクを吐き出せるストレージサービスを紹介しておきます。
まあ、ググれば先頭に出てくるものなので、あんまり紹介する意味がない気はしますが...

https://hstorage.io/

日本の企業が運営しているものっぽいので、適当な海外の共有サービスより安心かもしれません。
ただフリープランの場合、アップロードできるファイルが一つあたり20MB制限で、先述の `Disabled` の設定ではwasmファイルあたりがアップロードできない事態に陥ります。
そういうときはおとなしく圧縮して臨みましょう。

## 3. GASのテンプレートをつっこむ
いよいよGASの時間です。
GASを新規作成、件のテンプレートをコピペするなり何なりして、`index.html` , `style.css.html` , `コード.gas` を配置してください。

## 4. gasの該当部分にURL等を入力する
gas部分に空の文字列の定数がいくつか書かれていると思いますので、該当するURLや設定を入力します。

# gasからunity内の処理に干渉する
本テンプレートには、完全蛇足な感じですが、gasからunityの処理に干渉できるように細工してあります。
詳しくは公式リファレンスと、`index.html` 内のjavascript部分を参照。
HTMLファイルにgasから干渉する方法は、「**強制出力スクリプトレットタグ**」という手法が最初からあるので、「gas→javascript→unity」といった感じで干渉することができるんだな、これが。
問題点として、このうち「javascript→unity」の干渉部分がバージョンによって変わる可能性高そう、と個人的には思ってる。
なんせ直近で変わっている部分でもあるので。

https://docs.unity3d.com/ja/2021.3/Manual/webgl-interactingwithbrowserscripting.html

こちらにも、`index.html` 内の記述の一部を抜粋しておくと、こんな感じ。

```js:index.hmtl
	var script = document.createElement("script");
	script.src = loaderUrl;
	script.onload = () => {
	createUnityInstance(canvas, config, (progress) => {
			progressBarFull.style.width = 100 * progress + "%";
		}).then((unityInstance) => {
			loadingBar.style.display = "none";
			fullscreenButton.onclick = () => {
				unityInstance.SetFullscreen(1);
			};	
			// 起動時に指定のunity内の関数を呼ぶ
			if('<?!=gameObject?>'!==''){
				unityInstance.SendMessage('<?!=gameObject?>', '<?!=method?>', '<?!=param?>');
			}
		}).catch((message) => {
			alert(message);
		});
	};
	document.body.appendChild(script);
```

要は `unityInstance.SendMessage` が大事で、第一引数にゲームオブジェクト名、第二引数にメソッド名（クラス名ではない）、第三引数以降そのメソッドの引数を指定していく、という感じ。

# おわりに
まあ、何かに使えるかもしれない。気軽にWebGLを自分のウェブページで公開できるのは、それだけでメリットだろうか...？
使ってもらえると嬉しいけど、よくわからないエラー出たって言われても、答えられないかもしれない...（GAS初心者）。
【Javaの案件を振り返ってみる】

こんにちは。
新卒入社3年目文系出身のエンジニアです。
今年の1月からJavaの案件に携わり、今日で案件が終了しました！
お疲れさまの意味も込めて、振り返りをしていこうと思います。


#### そもそも何をやっていたのか
大手宅配業者向け配送業務管理システムのセキュリティ対応を行っていました。
主に、クロスサイトスクリプティング※の対応や、ログイン画面の修正、また、管理者権限で利用者のログイン情報を一括管理できる画面を作成したりしていました。
※クロスサイトスクリプティング・・・Webアプリケーションに問題がある場合、悪意を持った命令を埋め込まれてしまい、偽のページを表示させること


#### 印象的に感じたこと
印象的に感じたことを使用したツールを用いて話していきたいと思います。
以下が使用したツールです。
1.Eclipse
2.SVN
まず1.について印象的だったことを説明します。
初めてEclipseというツールを使用して、Javaで実装していました。
修正したときにクリーンをしないといけないのが厄介でした。
ただメリットもあります。
思わぬ不具合が発生したときにクリーン＆ビルドすると解決することもよくあるので、クリーン＆ビルドを欠かさず行うようにしていました。
もう癖づいてしまったかもしれません笑
なぜこのクリーン＆ビルドを行わないといけないのかというと、プログラムが記述したコードを機械語に翻訳しないとコンピュータは読み取ることができないからです。
こんな泥臭いことを最初はやっていたのかと思うと、今はかなり扱いやすいツールが出来上がっているのだなとつくづく実感しました。

次に2.について説明します。

バージョン管理はSVNというツールを使用していました。
ローカルリポジトリにチェックアウトすることで、自分のローカルファイルで更新したファイルをエクスプローラー上で実行していました。
SVNはgitと違って、ローカルリポジトリとリモートリポジトリが目に見えてわかるのがSVNの良いところだなと思いました。
私が初めてgitを学んだときはローカルリポジトリとリモートリポジトリの区別がはっきりとわからず、ローカルリポジトリはどうやって見たらいいんだ？とはてなで頭がいっぱいになったことを覚えています。(今はgit branch もしくはgit branch -vvというコマンドを実行したらローカルリポジトリを見ることができます。)


#### 苦労したこと
設計→製造の工程が一番苦労しました。
比較的簡単な所を任されたのですが、SQLで取得する値が足りていなかったり、メソッドから呼ぶ過程が具体的にイメージできなかったりしました。
次の案件ではもっと技術書を読み込んで、実装するときに少しずつですが、この仕様だったら、この実装がいるといったみたいにあらかじめイメージする訓練をつけないといけないと思いました。なかなかすぐにできることではないので、日々鍛錬していこうと思います。


#### 最後に
ざっくりですが、案件の振り返りをしました。
私自身、無事に終わった案件がこの案件で初めてだったので、達成感を得たと同時に反省点がたくさん見えました。
反省点を次の案件で達成感として受け止められるようにしていきたいなと思います。
ここまで読んでくださり、ありがとうございました。。
Google UXデザイン：Crazy Eights

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c3d622bb-c1ed-447b-c15e-c1bccff32a4a.png" width="800">
    
# クレージーエイトとは？

***<font color="MediumVioletRed">『解決しなければならないデザインの問題に対して、アイデアを出すのに最適な方法』</font>***　

クレージーエイトでは、ユーザーの問題を解決するための新しいアイデアで、8つの異なるデザインをスケッチします。


#### (1)1枚の大きな紙を用意する
その紙を半分に折り、さらに半分に折って、もう1度半分に折ります。紙を広げると、8つの正方形ができ、そこにスケッチをします。

#### (2)絵を描くための道具を用意する
デザイナーはシャーペンで描くことを好む人が多いですが、鉛筆やペンでもかまいません。

#### (3)タイマーを8分にセットする
1つのデザインアイデアを1分間でスケッチします。

#### (4)アイデアをどんどん出す
あなたの頭に浮かんだ解決策をすべて描いてください。8つ以上のアイデアがある場合は、このエクササイズを繰り返してもかまいません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/99e27b2a-7a33-13e5-b571-42aa1b9d7965.png" width="600">


これは、グループで行われることが多いことを覚えておいてください。
- 各自が8枚のスケッチを描いた後、グループで集まってお気に入りのアイデアを決めます。
- 各自が上位2～3案をグループ全体で共有するか、チーム全体から好きなスケッチに投票することもできます。
- 選ばれたベストなアイデアは、通常、より詳細なスケッチによって精緻化されます。

# ベストプラクティス

#### 創造的なウォーミングアップのエクササイズをする
自分の紙を見ずに隣の人を描く、あるいはある言葉やフレーズを自分なりに解釈してみんなで描く、といったアクティビティをこなしてみましょう。このように紙にペンを置くことから始めると、スケッチをする心構えができるようになります。

#### 問題を明確にする
一度に1つのHow might we questionまたは1つのプロブレムステートメントに対して クレージーエイトのセットを開発する。

#### 他の人のアイデアを批判しない
他の人がスケッチを発表しているときも、オープンマインドでいましょう。

#### 多様なグループを参加させる
クレイジーエイトはグループで行われることが多いので、グループにはさまざまな仕事の役割、経験、能力、性別、経歴を持つ人を含めるとよいでしょう。そうすることで、チームは幅広いアイデアの中から選択することができます。

#### 快適な環境でアイデアを出す
このエクササイズは、リラックスできて、創造的な思考を促すような場所で行いましょう。いつもの仕事場から飛び出して、クリエイティブな練習をするのはとてもいいことです。

#### スケッチを怖がらない
UXデザイナーになるためにアーティストである必要はありませんし、クレイジーエイトで描くスケッチは完璧である必要はありません。

# メリット

クレイジーエイトは、短時間で多くのアイデアを生み出す、エキサイティングなデザイン発想法です。5人が同時にこのエクササイズを行った場合、わずか8分後には40のソリューション候補を手に入れることができるのです。膨大な数のアイデアです。

また、クレイジーエイトは、短い時間枠の中で、判断することなく多くのアイデアを出さなければならないので、既成概念にとらわれない思考が要求されます。つまり、ユニークで従来とは異なる解決策をたくさん考えることになるのです。
Azure 認証と認可の違い、AD DSとAzureADの違いについて

・認証
本人確認のプロセス

・認可　承認
そのIDがサービスやアプリケーション位アクセス可能であるかを確認するプロセス

●AD DS（Azure Directory Domain Services）
従来のオンプレミスに対して、認証と認可を実現するため、AD DSをインストールしたドメインコントローラーを構築し、運用してきた。
AD DSでは、ドメインを１つの管理単位としてKerberosという仕組みを用いて認証と認可を行う。

AD DSのように、ユーザー名やパスワードなどの認証情報を管理するサービスは、一般的にディレクトリサービスという。

●Azure Active Directory
クラウドで認証と認可を行う。遺パン的なシステムと同じ様に、Microsoft Azureを利用するために認証認可を行う必要がある。クラウドベースのディレクトリサービス。
クラウドベースだが、ディレクトリサービスの１つであるため、認証認可のプロセスはAD DSと同じ。
オンプレミスと異なり、クラウドの場合の認証後のアクセス先は各SaaSアプリになる。SaaSアプリをAzure IDに登録すると、それらのSaaSアプリに隠せすする際の認証基盤としてAzure ADと利用できる。


●AD DSとAzureADの違い

・使用目的の範囲の違い
AD DS オンプレミス向け、Azure ADはクラウド向け。

・使用されるプロトコルの違い
AD DSは社内ネットワークで使用され、Kerberosというプロトコルで認証認可を行う。
Azure ADはインターネット環境で使用されるパブリッククラウドサービスなので、SAML、WS-Federationなどのプロトコルで認証認可をおこなう。

・組織構成の違い
AD DSはドメインコントローラーと呼ばれるサーバー￥を展開し、フォレスト・ドメインを構築し管理する。また、必要に応じ同じフォレスト内に子ドメインを作成することもできる。
Azure ADはクラウドサービスのため、サーバーの展開は不要。組織はテナント（ディレクトリ）という単位で管理され、Azureやmicrosoft 365をサインアップすうるとテナントが１つ作成される。

・オブジェクトの管理構造やポリシー管理機能の違い
AD DSはドメイン内にOU（組織単位）を構成してユーザーやグループなどのオブジェクトを階層構造を管理する。
Azure ADはユーザーやグループなどのオブジェクトはフラット構造で管理されるためOUじゃない。
[Windows 版] CodeCommit を ローカルに SourceTree でクローンする

# はじめに
Windowsで CodeCommit のリポジトリを SourceTree でローカルにクローンする方法についてまとめました。
Windowsは、CodeCommitのリポジトリをHTTPSでクローンできないようなので、SSHでのクローン方法を採用します。

# 事前準備
- codecommitのリポジトリ作成済み

# CodeCommit の SSH キーの作成とIDの取得
SSHキーの取得方法は、下記の記事通りにするだけです。

https://oreout.hatenablog.com/entry/aws/codecommit/1


1点補足しますと、ssh-keygenコマンドは、下記のコマンドでもSSHキーを作成できます。
```
$ ssh-keygen
```
コマンド実行後、全てEnterを押すと、デフォルトで作成され、以下の２つのキーが作成されます。（passphraseは、空でよいです。）
- 秘密鍵の`/.ssh/id_rsa`
- 公開鍵の`/.ssh/id_rsa.pub`

秘密鍵は、あとで使用します。


`SSH キー ID`も後に使用しますので、コピーしておきます。

![スクリーンショット 2022-10-27 22.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/dbd5d6ba-8072-b2d7-90e7-5105b894f281.png)


# SourceTreeをインストール
下記サイトからSourceTreeをダウンロードします

https://www.sourcetreeapp.com/download-archives

![スクリーンショット 2022-10-27 22.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/505a8878-1b16-7d9b-170a-25117a571498.png)

「Bitbucket」は、今回は使用しないので「スキップ」を選択します。

![スクリーンショット 2022-10-27 22.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/fdca2ef9-0123-aa30-bc03-ec353e624420.png)

`Git`はチェックし、`Mercurial`はチェックしません。

![スクリーンショット 2022-10-27 22.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/4eaf7f48-187e-ce13-0a23-0633de85f8b6.png)

Gitで使用するアカウント設定を設定します。
名前とメールアドレスを入力しましょう。
![スクリーンショット 2022-10-27 22.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/4aa1f2c3-3117-8b0f-7a8e-e33653e01a56.png)


SSHキーは、ここでは読み込みませんので、「いいえ」をクリックします。
![スクリーンショット 2022-10-27 22.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/321a1562-b0b2-736e-ac6e-f6c1fd6fdedd.png)

これでSourceTreeのインストール完了です。

# CodeCommit のリポジトリを SourceTree でクローン
SSHキーをSourcetreeに設定するため、Sourcetreeを起動し、上部タブの`ツール`>`オプション`>`全般`をクリックします。
「SSHクライアントの設定」に以下の設定をします。
- SSHクライアントは「OpenSSH」を指定します。
- SSHキーは、先程作成した秘密鍵の`id_rsa`を選択します。
![スクリーンショット 2022-10-27 22.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/c992cd7d-826f-73be-9180-768ac7c6f989.png)

`Clone`タブから、`元パス/URL`に以下のURLをペーストします。
`ssh://<アクセスキーID>@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<リポジトリ名>`
- アクセスIDは、先程コピーしたIDになります。
- リポジトリ名も記載しましょう。

![スクリーンショット 2022-10-27 22.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/da539767-1d85-5ebc-0d25-7d108adeeebb.png)


ちなみに、codecommitのURLクローンからでも取得できますが、`アクセスキーID`が入っていませんので、入れて入力しましょう。

![スクリーンショット 2022-10-27 22.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/7250b4d9-e8e2-7713-d56a-ac513c1bce92.png)


SourceTreeのクローンをクリックするとソースがクローンされます！

# 参照

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-windows.html

https://qiita.com/mounntainn/items/0f47722dc9bed7c4173e
【ServiceNow】更新セットをバッチ機能で一括適用する

# 目的
「Update set batching」機能(更新セットのグルーピング)の使い方を簡単にメモする。

# 概要
更新セットに親子関係を設定し、一括で操作できる機能。

複数の更新セットをコミットする場合に、誤った順序でコミットしたり、コミットすべき更新セットを飛ばしてしまう可能性を回避できるのがメリット。

# 参考
ServiceNow Docsを参考とした。
[Update set batching](https://docs.servicenow.com/ja-JP/bundle/tokyo-application-development/page/build/system-update-sets/hier-update-sets/concept/us-hier-overview.html)

# 手順
1. All > System Update Sets > Local Update Sets　を開く

2. 親と子にする予定の更新セットの[Status]はCompleteの状態にしておく

3. 子のレコードの[Parent]に、親のレコードを設定し、親子関係を作る
    ![スクリーンショット 2022-10-27 19.42.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/89b307ed-e3fd-9b09-d441-70473b740d97.png)
    ![スクリーンショット 2022-10-27 19.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/75a85355-ea4d-37d3-fef9-99720831902a.png)
    ※今回の例では子は1つだが、複数の子を持つことも可能。

4. 更新セットを別インスタンスへ移動させる
    今回の例ではPDIでの検証なので、インスタンスを接続しての移行ができない。
    そのため、xml出力して移行させてみる。
    
    [Export Update Set Batch to XML]でバッチ化された更新セットXMLをエクスポートする
    ![スクリーンショット 2022-10-27 19.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/4e277f0e-2400-5267-bf12-64e9fcd20670.png)

5. 別PDIへ移動し、権限昇格させる
![スクリーンショット 2022-10-27 19.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/d5070f87-057a-cf8e-b9dc-7456d1485992.png)

6. System Update Sets > Retrieved Update Sets を開く

7. [Import Update Set from XML]からバッチ化された更新セットXMLをインポートする
    ![スクリーンショット 2022-10-27 19.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/03f908be-eb96-54a7-f57d-a9e11e52c83a.png)
    ![スクリーンショット 2022-10-27 19.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/e9024596-7f7a-35ec-97ef-bd2683fc7c95.png)
    
    インポートに成功すると、更新セットが表示される
    ※[Remote Batch Base]には、親レコードが表示されるようだ
    ![スクリーンショット 2022-10-27 19.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/82e51226-3439-5363-061d-4b1903f7dad0.png)

8. 後は親レコードをプレビューし、最終的なコミットへ進む
    ![スクリーンショット 2022-10-27 19.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/b752b0cf-d2ac-69ba-86fe-61e1c1d39ba4.png)
    ![スクリーンショット 2022-10-27 19.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/3675754f-14a5-094a-9675-5743c77178a7.png)
    
    エラーなしのため、コミットへ
    ![スクリーンショット 2022-10-27 19.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/f520967b-423e-d637-87a6-6acdb08d7398.png)
    ![スクリーンショット 2022-10-27 19.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/ac62ee54-d249-5b43-0536-77407d4b2f62.png)

9. 無事にバッチ化された更新セットが一括で適用できた
    ![スクリーンショット 2022-10-27 19.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251204/9baf3c8e-f9b0-4e3a-58c2-6e0a5afb9646.png)

# まとめ
単純に更新セットの数が多い場合、適用作業の手間を削減できて便利。
マージとどちらが良いかについては別途検討していきたい。
"Could not find [gem name] in any of the sources"のエラーが出たときの対応

# サービス環境
ruby 2.6.8
Rails 6.1.5
docker

# "Could not find [gem name] in any of the sources"　

Railsでツイッターのクローンの課題でOmniauthを使ってgit hubのアカウントでログインできる機能を作ろうとしましたが、Railsコマンド実行時に`"Could not find [gem name] in any of the sources"`のエラーが出ました。
**お前が使おうとしているgemどこにもないやねん！** と怒られましたね。w
# 原因
`gemfile`の周りが怪しいと思って、`Omniauth gem`の各依存を調べたりして色々試してみましたが、解決できませんでした。
それで、疑惑の領域を広げて、Railsのコマンドの周り、`docker-compose`のコマンド等について調べた結果、やっと原因がわかりました。

原因は`Docker-compose.yml`ファイルでした。
課題を始める時に、Dockerの学習が終わった段階だったので、
`Dockerfile`と`Docker-compose.yml`も自作をしたんですが、、不備があったみたいですね。

もっと正確にいうと **"docker-compose.ymlでgemの永続化をしてなかった。"** になりますね。

gemの永続化をしていないと、コンテナ上で`bundle install`を実行してもDocker Imageにはgemが保存がされないので、上記のようなエラーが発生しますね。

永続化をしないとgemをインストールするために`docker-compose build` → `コンテナ起動`という手間が発生します。
おそらく`Omniauth gem`をインストールする前には色々設定をするために頻繁にImageを新しく`build`したので、
gemが問題なくインストールされたかなと思います。
# 対応

すみません、余談が長かったです。
gemを永続化するためにはやるべきことはdocker-compose.ymlに下記の1行を追加するだけです。
`- gem_data:/usr/local/bundle`
下記のような感じですね。
```docker-compose.yml

  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3000:3000"
    container_name: "web"
    volumes:
      - ".:/gassiper_rails"
      - gem_data:/usr/local/bundle
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db: ・　・　・
    
```

# 最後に
Railsのgemに関してのエラーだったので、gem周りを何日もかけて調べましたが、原因はdocker-compose.ymlにあったということから、
**複数のプログラミング言語やライブラリ、ソフトウェアプラットフォームを使うときはエラー調査は言語間の関連性等を考える広い視野を持たないといけない！**　ことが学べた非常にいい経験でしたね。

余談が長くなって、記事自体が長くなってしまいましたが、
以上で`"Could not find [gem name] in any of the sources"`のエラーの対応についてでした。
読んでいただき、ありがとうございます。
【初学者】Rails、Next.js、Auth0のアプリケーションで、Access Tokenを利用して、バックエンド側(Rails)でメールアドレス(email),ユーザ名(name),アイコン(picture)を取得する方法

[こちら](https://qiita.com/KNR109/items/ca48c2578cc891674575)の記事を参照して、アプリを作成しておりましたが、
バックエンド側で認証したユーザのユーザ名とアイコンを取得しようとした際に、
ちょうど良い記事が見つからず手間取ったので、メモも兼ねて投稿いたします。
初学者のため、誤り等があればご指摘ください。

### やりたい事
Access Tokenに、ユーザ名、アイコンのデータを付与することで、Rails側でデコードした際に、ペイロードからその情報を取得できるようにする。
下記のチュートリアルでいうとverify_tokenのところで取得できるはず。

https://auth0.com/blog/building-secure-apis-with-rails-6-and-auth0/

### 手順①　Auth0のRulesを開いて、Createを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710784/53768ec8-ab9d-4130-0001-5f706d770f5f.png)

### 手順② テンプレートとして、Add email to access tokenを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710784/4e6b1d9f-b704-8976-4090-a345d3752f23.png)

### 手順③ Rulesを編集
必要なものをcontextに追加していく。
※ここの書き方について、もともと「context.accessToken[namespace + 'email'] = user.email;」となっていましたが、使いづらかったので['email']に直したところ、ドットをつけた方がよいというメッセージが出たため、とりあえず['.email']にしていますが、正しいのかはわからないです。。

```
function addEmailToAccessToken(user, context, callback) {
  // This rule adds the authenticated user's email address to the access token.

  var namespace = 'https://example.com/';

  context.accessToken['.email'] = user.email;
  context.accessToken['.name'] = user.name;
  context.accessToken['.picture'] = user.picture;

  return callback(null, user, context);
}
```

### 手順④「Save Changes」を押下
以上。
かなり苦労して色々な方法を試したのですが、やり方がわかればあっさりできました。英語ができればもっと早く辿り着けたかも知れぬ。。英語も勉強します。。。


【参考にした記事】

https://auth0.com/docs/customize/rules/examples#add-claims-to-access-token

https://dev.classmethod.jp/articles/shuntaka9576-auth0-rules/

https://dev.classmethod.jp/articles/auth0-access-token-id-token-difference/

https://qiita.com/KNR109/items/ca48c2578cc891674575

https://qiita.com/knaot0/items/8427918564400968bd2b
【docker-compose.yml】All mapping items must start at the same columnと出たとき

`docker-compose.yml`を編集していたら、以下のエラーが表示されました。

```
All mapping items must start at the same column
```

解決策：
同じアイテムのインデントを揃える。

以下は例ですが、例えば`services`である`php:`と`mysql:`のインデントは半角2つで揃えています。
これがズレていると上記のエラーが出ました。

```
version: "3.9"

services:
  php:
    build: .
    volumes:
      - ./src:/var/www/html
    ports:
      - "8000:8000"
  mysql:
    platform: linux/x86_64
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - ./db:/var/lib/mysql7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: laravel
```
ファイルの内容をSQLのin句に当て込むシェル

IDかなにかのリストを、下記のようなファイルで持っているとき、これを使ってDBに検索をかけたいときがあります。

```bash
$ cat sample.txt
8888-202207010000-3456
7777-202207010000-1234
6666-202207010000-7890
```

* 改行コードを`','`に変換
* 前後に`'`をつける
* select文のin句にあてこむ

とすることで、 `select * from table where id in (${ids})` というselect文を作成できます。

```bash
$ cat sample.txt | tr  "\n" , | sed -e "s/,/','/g;s/^/'/;s/','$/'/" | awk '{print "select * from user where id in (" $0 ")"}'
select * from user where id in ('8888-202207010000-3456','7777-202207010000-1234','6666-202207010000-7890')
```


```bash
$ ids=$(cat sample.txt | tr  "\n" , | sed -e "s/,/','/g;s/^/'/;s/','$/'/")
$ echo "select * from table where id in ($ids)" 
select * from table where id in ('8888-202207010000-3456','7777-202207010000-1234','6666-202207010000-7890')
```

ファイルの改行コードがCRLFの場合、trコマンドがCRLFをまとめて変換できないので、CRの削除を先にいれます。

```bash
$ ids=$(cat sample.txt | tr -d "\r" | tr  "\n" , | sed -e "s/,/','/g;s/^/'/;s/','$/'/")
```
.ruby形式のビューを活用する

RailsのビューをRubyで書く、`.ruby`というものの存在を知ったので、少しまとめてみます。

## ビューの二重拡張子

Rails で使うビューには、`index.html.erb`とか`show.json.jbuilder`のように、二重の拡張子が付与されています。このうち、前半の`.html`や`.json`は、レスポンスの形式を表すものであり、後半の`.erb`や`.jbuilder`は、テンプレートを処理するハンドラーの指定です。

ここで言及する`.ruby`も、そんなハンドラーとして使えるものです。

## 使い方

他のビューと同じように、`app/views/controller_name/action_name.response_extension.ruby`のようなビューファイルを作成して、その中には好きにRubyコードを書けます。

そして、出力は、メソッドを書く時と同様な感じで、ビューファイルの最後の行で実行した内容となります。

## メリット

Railsの出力を構築する方法としては、「他のハンドラー形式を使用する」「`render`や`send_data`など、コントローラー内から結果を直接送信する」という方法が考えられますが、この2つと比較したRubyビューのメリットを挙げていきます。

### 他のハンドラーと比較してのメリット

* どんな形式でも出力できる…ERBでPNG画像を構築するのは非現実的ですし、 JBuilderはJSON専用ですが、Ruby形式であれば何に使うことも可能です。
* 自由度が高い…ハンドラーによっては特殊なDSLが作り込んであったりしますが、Ruby形式の場合はコードを書けば何でも可能です。

### コントローラーからの出力と比較してのメリット

* ビューとしての枠組みに載せられる…レスポンスの形式による分岐やビューヘルパーの活用など、Railsのビュー標準で用意されている機能をそのまま利用可能です。
* コードの分離…描画専用のコードをビューに追い出すことが可能です。

## デメリット

もちろん世の中に銀の弾丸などないので、Rubyでビューを作ることによるデメリットもあります。

### 他のハンドラーと比較してのデメリット

* 専用のハンドラーで書くより煩雑になる場合がありうる…テンプレートエンジンを使わずに、長大な文字列を組み立てるのは苦行でしょうし、特定の形式で出力するために特定のライブラリを使うような場合でも、Rubyビューでは決まりきった動作まで書かないといけません。

## （余談）ハンドラーの登録について

Railsにビューハンドラーを追加するには、`ActionView::Template::Handlers.register_template_handler`というメソッドを使います。ハンドラーは、`.call(template)`というメソッドを持っていて、与えられた`template`からRubyの**ソースコード文字列**を生成する、という処理を行います（その後、`ActionView::CompiledTemplates`に当該の文字列からメソッドを作って登録されることとなります）。

で、Railsのリポジトリを見てみたところ、ERBやRawといったハンドラーが`ActionView::Template::Handlers`内に存在しているのですが、Ruby用のが見つからない状況です。さらに調べてみると、このハンドラーは驚くべきものでした。

```ruby
base.register_template_handler :ruby, :source.to_proc
```

ハンドラーに渡される`template`には、ソースコードを取得する`source`メソッドがあるので、それを呼べば用は片付いてしまう、ということでした。

## 参考資料

* [Railsのテンプレートレンダリングを分解調査する#2 ActionView編（翻訳）](https://techracho.bpsinc.jp/hachi8833/2019_01_18/68009)
* [ActionView 単体で slim を使ってみる](https://blog.eiel.info/blog/2014/07/28/action-view-with-slim/)
N+1問題をincludesメソッドで解決

N+1問題とは、アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題のこと。
```ruby
モデル名.all
```
としてしまうと、N+1問題にひっかかる。
それを解消するためにincludesメソッドがある。
```ruby
モデル名.includes(:紐付くモデル名)
```
と書けばよい。

例：フリマアプリ
```ruby
class ItemsController < ApplicationController

def index
    @items = Item.includes(:user)
  end
```
で、ビューでeachメソッドを使ってインスタンスを取り出す。
```ruby
app/views/items/index.html.erb

 <% @items.each do |item| %>
      <%= item.text %>
      <%= item.name %>
  <% end %>
```
2軸を持つグラフ描画

## 目的
pythonで2軸を持つグラフの表示方法について確かめる

## 行う事
X軸を共有して2つのY軸を持つ図を作成するとき片方は、x軸が同じ連続値でなくても、
期待通り表示されるかどうか確認する。

##input file
```
test1.csv
   ID  value
0   1      1
1   2      2
2   3      3
3   4      4
4   5      5
5   6      6
6   7      7
7   8      8
8   9      9
9  10     10
test2.csv
   ID  value
0   1     10
1   5      5
2  10      1
```
## コード
```Python
import matplotlib.pyplot as plt
import pandas as pd

test1 = pd.read_csv('test1.csv')
test2 = pd.read_csv('test2.csv')
print(test1)
print(test2)

fig = plt.figure()
ax1  = fig.add_subplot()
ax1.plot(test1['ID'], test1['value'], color='b')
ax2 = ax1.twinx()
ax2.plot(test2['ID'], test2['value'], color='r')

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156536/dd20c211-919b-e603-bb43-fc012b976d92.png)
結果、期待通り表示された。
テレビをパソコンのモニター代わりにすると目にいい

# 概要
今日からパソコンのモニターはテレビにした。すると今までに感じたことがない快感になった。それは、目が楽になったこと。
ついさっきまで、パソコンのモニターは机上に置いていたたが、それでは目が疲れ、しょっちゅう眼鏡をはずし目を休めていた。
テレビは机の前に約1.6m離れたところに置いた。それでも、テキストエディタの文字は見れるため、コーディングも苦にならない。
もっと早くやればよかったと思う。![テレビモニター.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/ff77d2ba-9390-dd17-54fd-b384dccfab99.jpeg)
![拡大.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/aa1a377d-cf6f-2c0c-3605-f19dae7cfbe5.jpeg)



実際は、写真でみるよりも鮮明に見えていますので、プログラミングはできます。



# ミラーリング
先に、テレビ側の設定を行うため、hdmiケーブルを用意する。テレビのhdmiコネクターにケーブルの片方をつなぎ、もう一方をパソコンのhdmiコネクターへ接続する。
パソコンのモニターをテレビの画面に映すのはパソコンのWINDOW+pボタンで行う。画面の右サイドに複写ボタンが表示されるので、それを選択するとテレビにパソコンの画面が表示される。これだけで、キーボード入力もマウスのカーソルもテレビの画面に表示される。全く、パソコンのモニターと違和感なく操作できる。画面が今までの机上から1.6m先のテレビになるため、むしろ目が疲れなくなった。また、机上からモニターがなくなったため、机の上がすっきりした。いいことづくめである。
机は、キーボードとマウスのみで、広々して気持ちがよい。
この方法は会社ではできないと思う。家だからこそできる。
# 拡大縮小
画面の文字の拡大・縮小はパソコンのモニター同様に、ctrl+マウスのホィールを上下すればできます。
# YouTubeを見るのもテレビがいい
YouTubeの動画もテレビの方がパソコンのモニターで見るよりは目にいいと思う。1.6m離れたテレビの方が、机のモニターの30cmよりも目にはやさしい。
# テレビの不要な表示を消す
これは、テレビの機能で、画面の右上と右下にそれぞれ、入力切り換えのモードと現在時刻が表示されているため、パソコンの画面がその下に隠れてしまいます。それを消すには、AQUOSのテレビでは、リモコンの下にあるカバーを開けると画面表示ボタンがあり、そのボタンを数回押してゆくとそれぞれの表示を消すことができます。
# Qiitaの記事を書くときは拡大率を200%にしています
Qiitaで記事を書くときは、200%にして大きめの文字にしています。100%ではやはり、つらいです。せいぜい175%以上が疲れません。目のいい人はもう少し小さい縮小率でもいいかもしれません。
# 開発ツールのエディター
普段の開発ツールはNetBeans IDE 8.2を使用しています。このツールをテレビで表示したときの文字サイズは特に困ることはありません。ツールで文字サイスは変更できます。この場合はctrl+マウスホィールボタンは効きません。
今のところ、パソコンで作業する点で、困ることはありません。全く、モニターの時と違和感なく、テレビでも入力作業はできます。
# 目は大事(五感も)
最近、五感の中でも、視覚、聴覚の衰えを感じます。あとの臭覚、触覚、味覚の方はまだ健在かもしれません。先日、低音性難聴になりました。病院へ行って何とか薬で治療して何とか改善はしてきた感じがしています。しかし、元の状態まではまだ、回復していません。目の衰えも感じます。ルティンがいいと言われているので、飲んでいます。ただ、25mg/日のサプリは高価なため、もう少し少なめのサプリにしています。
# あとがき
ミラーリングのメリットはいろいろあると思う。よくあるのは、プロジェクターに映すこと。今回はパソコンの作業を一切モニターを使わず、テレビのみにしたことでいままで感じえなかったいいことがいくつかあった。一度、経験してしまうともう机上のモニターには戻れないと思う。一時期、大型のモニターを机上に置こうと思ったが、それでも近すぎて目が疲れると思う。机上からモニターがなくなったことで、キーボードを自由に置ける。これまではモニターに邪魔されて窮屈だった。
マウスとマウスパッドも同じ。メモ書きもらくになり、とにかくいいことづくめである。
# 追記
しばらくして、なんか、物足りないというか、やはり、モニターもほしくなった。テレビは画面も大きく解像度も昔よりはよくなっているのでみやすいのだが、手元にもあった方が安心感がある。それは、きめの細かさではモニターが勝っている。もう一つの大きな理由は、実は、近視のため、眼鏡を外すと遠くの文字が見えない。しかし、近くのモニターの文字なら見える。眼鏡を掛ければ、テレビの文字も見えるのだが、度が合っていないのか、長い時間掛けていると目が疲れ、外している。そのため、眼鏡が無くてもみれるモニターは置いておいた方がよくなった。本題のテーマは目がいい人向けかもしれない。
![monitor.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/bdc0146c-7714-6899-64ac-a25b616c834d.jpeg)
【Vue】TypeScript intellisense is disabled on template. To enable, configure ～～



#### vueの環境構築をしている際に templete タグで以下のエラーが出てきたので備忘録として残しておく。

```
TypeScript intellisense is disabled on template. To enable, configure `"jsx": "preserve"` in the `"compilerOptions"` property of tsconfig or jsconfig. To disable this prompt instead, configure `"experimentalDisableTemplateSupport": true` in `"vueCompilerOptions"` property.volar
```

エラーメッセージを見る限り、tsConfig もしくは jsconfig ファイル内の「"compilerOptions"」に「"jsx": "preserve"」を設定してあげれば治りそう。

筆者はの環境には　jsconfig.json　があり、中身は以下のようになっていた。

```json:jsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "baseUrl": "./",
    "moduleResolution": "node",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  }
}
```
## 解決策
jsconfig.json　に　「"jsx": "preserve",」　を追加して以下のように修正
```json:jsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "baseUrl": "./",
    "moduleResolution": "node",
    "jsx": "preserve",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  }
}
PrivateIPしか持たない GCEインスタンスにVPC内の別インスタンスからSSH接続する

## 概要
Private IPしか持たない GCEインスタンスに対し、Global IPによる外部 sshアクセスが出来ないので、Global IPを持つ別のGCEインスタンスから ssh接続する手順を示す。

## TL; DR
- 鍵ペアを生成して公開鍵をアクセス先に登録する（後者は稼働中にGUI上から設定可能）
- 内部通信を許可する Firewall Ruleを追加する
- SSH公開鍵認証（`ssh -i ${秘密鍵}`）を利用してログインする

## 背景
### VPC内に GIP（Global IP）を持たないインスタンスが必要

- 例として VPC内から NAT経由での外部APIコールができるか確認したい場合、この様なインスタンスが必要となる
- GCEインスタンスはデフォルトで エフェメラルなGIPを持つ。その状態でVPC外のAPIをコールしようとすると NATではなく自身のGIP経由で外部通信してしまう
    - アクセス経路を確認するには例えば以下の様なコマンドで確認可能。（GIPが出てくるか、NATに紐付いたIPが出てくるか）
        - `$ curl https://httpbin.org/get | grep origin`
        - `$ curl https://ifconfig.io`

### VPC内の GIP（Global IP)を持たないインスタンスには 外からssh接続できない

- アクセス先の GIPがないのでもう仕方ない


## 解決策
幾つか解決策はあるが、ここではVPC内の別GCEインスタンスから ssh接続するという手法をとる。単純に ssh接続を行おうとしても繋がらないので、その方法をメモしておく。

### 準備①: 踏み台となる別のGCEインスタンスを用意する
以下の条件を満たすインスタンスを用意する。条件を満たす既存のインスタンスを利用しても良い。
- アクセス先インスタンスと同一のVPCネットワーク上に存在する
- Global IPと Private IPの両方を持つ（前者はローカルからのssh接続に、後者はアクセス先へのssh接続に利用）
- Firewall Ruleでローカルの作業環境から VPC環境へのssh（TCP:22）アクセスを許可している (*1)

```
# *1) アクセス元の ローカル環境の Global IPレンジを仮に `100.100.100.2/32`とした際のイメージ
gcloud compute --project=(your-project) firewall-rules create (your-rule-name-0) \
  --direction=INGRESS \
  --priority=1000 \
  --network=(your-vpc-network) \ 
  --action=ALLOW \
  --rules=tcp:22 \
  --source-ranges="100.100.100.2/32" 
``` 

### 準備②： Firewallルールを追加し内部通信を許可する
内部通信にも明示的なルールの存在が必要なので、以下の様なルールを追加する

#### GUI上の入力項目
| # | 項目名 | 指定内容 |
| --- | --- | --- |
| 1 | ネットワーク | （対象のVPC） |
| 2 | ターゲット | "ネットワーク上の全てのインスタンス" |
| 3 | ソースフィルタ | "IPv4 範囲" |
| 4 | **送信元 IPv4範囲** | （共有するVPCの Private IP範囲を CIDR表記で - 例： 192.0.2.0/24） |
| 5 | 2番目のソースフィルタ | なし (任意で指定しても良い） |
| 6 | プロトコルとポート | "指定したプロトコルとポート" : TCP : 22 |

##### 同等のCLI出力
GUI上からCLIを出力すると以下になります（情報の表現が大きく異なるので要素同士のマッピングができない）
```
# 共有の PrivateIPレンジを仮に `192.0.2.0/24`とした際のイメージ
$ gcloud compute --project=(your-project) firewall-rules create (your-rule-name-1) \
  --direction=INGRESS \
  --priority=2000 \
  --network=(your-vpc-network) \
  --action=ALLOW \
  --rules=tcp:22 \
  --source-ranges="192.0.2.0/24"
```

### 準備③ アクセス元の GCEインスタンスで鍵ペアを生成する

#### 鍵ペア生成
アクセス元の GCEインスタンスに sshで入り、以下のコマンドを実行し鍵ペアを生成する。
```
# ssh-keygen -t ecdsa -b 256 -f ~/.ssh/google_compute_engine
```
#### 公開鍵コピー
秘密鍵 `google_compute_engine`と 公開鍵 `google_compute_engine.pub`が `${HOME}/.ssh/`配下に生成されているので、後者をコピーする。
```
$ cat ~/.ssh/google_compute_engine.pub

（公開鍵が表示されるのでコピー）
```

### 準備④ アクセス元の公開鍵をアクセス先に登録する
先の手順でコピーしておいた公開鍵を、アクセス先の GCEに登録する。

- クラウドコンソール上の GCEから対象のインスタンスを選択する
- 詳細画面上部の 「編集」 リンクを押下する
- "**セキュリティとアクセス**”の "**SSH認証鍵**" 欄に先程コピーしておいた アクセス元の公開鍵をペーストする
- 「保存」 ボタンを押下する


### 接続
接続元となる GIP付きのインスタンスから下記形式のSSHコマンド（公開鍵認証）で接続可能

```
$ ssh -i ~/.ssh/google_compute_engine ${公開鍵を生成したユーザ}@${接続先の内部IP}
```
* 公開鍵を生成した際のユーザが不明なら、アクセス元インスタンスで `cat ~/.ssh/google_compute_engine.pub` すれば末尾に以下の記載がある。


> (公開鍵を生成したユーザ)@(接続元VM)

## 参考
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/deploying_red_hat_enterprise_linux_7_on_public_cloud_platforms/creating-ssh-keys-for-google-compute-engine_uploading-the-rhel-image-to-gcp
Exhaust-gas treatment, ボッシュ自動車handbook 11版(77) p.962

Management for diesel engines, Exhaust-gas treatment , ボッシュ自動車handbook 11版(77)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906

# Exhaust-gas treatment 
p.962
## Catalytic oxidation 
## Filtration of particulates 
## Catalytic reduction of nitrous fumes 
## On-Board Diagnostics (OBD) 

# Reference
[1] Commission Regulation (EU) No 582/2011 of 25 May 2011 implementing and amending Regulation (EC) No 595/2009 of the European Parliament and of the Council with respect to emissions from heavy duty vehicles (Euro VI) and amending Annexes I and III to Directive 2007/46/EC of the European Parliament and of the Council

https://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2011:167:0001:0168:EN:PDF
[2] ISO 22241-1:2019
Diesel engines — NOx reduction agent AUS 32 — Part 1: Quality requirements

https://www.iso.org/standard/66408.html

2   Normative references
ISO 22241-2:2019, Diesel engines — NOx reduction agent AUS 32 — Part 2: Test methods

Bibliography

[2]-[1]	ISO 3675, Crude petroleum and liquid petroleum products — Laboratory determination of density — Hydrometer method
[2]-[2]	ISO 3696, Water for analytical laboratory use — Specification and test methods
[2]-[3]	ISO 4259 (all parts), Petroleum and related products — Precision of measurement methods and results
[2]-[4]	ISO 12185, Crude petroleum and petroleum products — Determination of density — Oscillating U-tube method
[2]-[5]	ISO 22241-3, Diesel engines — NOx reduction agent AUS 32 — Part 3: Handling, transportation, and storage
[2]-[6]	IATF 16949:2016, Quality management system requirements for automotive production and relevant service parts organisations

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221027
ver. 0.02 表題追記　20221029

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
[備忘録]FastAPIのDetaにデプロイがうまくいかなかった

# 背景
作りたいものがあって、FastAPIを使ってみようと思ったときにドキュメント通りやってもうまくいかなかったので、同じつまずき方をした人のために備忘録を残そうと思いました。

# 実際に起きた問題
参考にしていたのは[こちら](https://fastapi.tiangolo.com/ja/deployment/deta/?h=deta)のドキュメントです。
CLIを入れて、detaが入っていることの確認、deta loginまではうまくいったのですが、deta newを実行すると、
![記事写真.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350111/f11befab-9057-8888-45d8-9e60c458a9df.png)
明らかにドキュメントとは違う表記が出てきました。リンクにアクセスしても表示がされません。

# 問題の原因
ドキュメントに一番下のdependenciesに関する質問の回答があったので、それを試しましたが治らず一時保留し、再度エラーを見たときにここで出ている **\ufeff** ってなんだ？？？？？となり調べました。すると、以下のような記事が出てきました。

https://qiita.com/msk02/items/c3a1c4a1e1ef94c37228

見てみるとUTF-8のテキストの頭にはこれ（BOMというらしい）がついていて、requirements.txtがこれ込みで読み込まれていたみたいでした。

# 解決
requirements.txtをメモ帳に張り付けて、BOMなしで新規ファイルとして保存しました。今は、defaultでBOM無しになっているみたいです。

# 最後に
なかなか調べても同じエラーにあたっているような人が見つけられず、日をまたいでようやく解決することができました。同じエラーに遭遇した際に読んで試していただけたら幸いです。pip freezeでrequirements.txtを出力したのですがダメだったのかな？詳しい方がいたら教えてほしいです。