OmniAICreator/Qiita-1.07M huggingface dataset:
Clarity Designを使ったWebシステムを作ってみる 準備編

# 概要
VMware社の製品のほぼ全てに使われているClarity Designというものを使った簡易的なWebシステムを作ってみようと思います。
必要スキルのAngularが初めてな部分もあり、Clarity Designを使っていてKubernetesのデモとかで使われるyelbというアプリと似たようなものをまずは目指していこうと思います。
https://github.com/mreferre/yelb

## 本記事の対象
- Clarity Designを使ってみたい方
- 簡単に良い感じの見た目のWebシステムを作成してみたい方

## 進め方
今回は以下の4章立てで進めていこうと思います。
※もしかしたら今後増やすかもしれないです
1. 準備編（本記事）
1. [バックエンド編](https://qiita.com/strawberryjam/items/6aad8155205a6c5531e9)
1. フロントエンド編
1. デプロイ編

本記事ではどんな画面構成にするかやDB構成等をまとめていきます。

## Clarity Designについて
今回主たる目的のClarity Designについてですが、基本的にはHTML/CSSのフレームワークのようなものになります。
用意されているクラス等を指定することで簡単に画面の構成を進めていくことができるものになります。
また、Angularと親密に連携しており、ページネーションのような少し実装が大変なものも簡易的に実装できます。
※アイコン等も非常に多く搭載

https://clarity.design/

# 構成思案
## 今回作るWebシステムについて
今回は冒頭で記載したようにyelbモドキの簡易的なアンケートアプリを作ります。
基本的にはアンケートの作成/編集と回答機能を実装していく想定です。

## システム全体像
今回は以下のようなシステム構成での作成を進めていきます。
- フロントエンド：Angular（Clarity Designを使うため基本必然に）
- バックエンド：Go（WebフレームワークのEchoを利用します）
- DB：MySQL（一番使い慣れているので!!）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/37341729-1801-1566-b5c4-b1d4808f28d4.png)

## 画面構成
画面構成は以下のような画面を実装してみます。
基本的には1のアンケート一覧から残りの2~5を呼び出す形を想定してます。
|  #  |  名称  |  種別  |  概要  |
| ---- | ---- | ---- | ---- |
|  1  |  アンケート一覧  |  通常ページ  |  登録されているアンケートの一覧を表示<br>新規アンケートの作成や編集、回答画面の遷移もここから  |
|  2  |  アンケート回答  |  通常ページ  |  選択されたアンケートの回答画面<br>現在の投票状況を円グラフで表示してみる  |
|  3  |  アンケート作成  |  モーダル  |  新規アンケートの作成を行う  |
|  4  |  アンケート編集  |  モーダル  |  登録済みのアンケートの編集を行う  |
|  5  |  アンケート削除確認  |  モーダル  |  アンケートの削除ボタンを押した際の確認用  |

## DB構成
DBのテーブルを以下3つで進めます。
※あらかじめ開発環境用で作成をしておきます。
- surveys
- survey_items
- answers

### surveys テーブル
surveysテーブルはアンケートの管理をする箇所となります。
| カラム      | 型    | 非NULL制約  |
| -------- | ---- | -------- |
| id       | int  | NOT NULL |
| title    | Text | NOT NULL |
| question | Text | NOT NULL |
| 登録日時     | DATE |          |
| 更新日時     | DATE |          |

### survey_items テーブル
survey_itemsテーブルはアンケートの回答項目を管理する箇所となります。
surveysテーブルのidと紐づきます。
| カラム       | 型    | 非NULL制約  |
| --------- | ---- | -------- |
| id        | int  | NOT NULL |
| text      | Text | NOT NULL |
| survey_id | int  |          |
| 登録日時      | DATE |          |
| 更新日時      | DATE |          |

### answers テーブル
answersテーブルはアンケートの回答を管理する箇所となります。
surveysテーブルとsurveys_itemのidと紐づけます。
| カラム            | 型    | 非NULL制約  |
| -------------- | ---- | -------- |
| id             | int  | NOT NULL |
| survey_id      | int  | NOT NULL |
| survey_item_id | int  | NOT NULL |
| 登録日時           | DATE |          |
| 更新日時      | DATE |          |

## バックエンド（REST API）構成
基本的には前述のDB構成に対するCRUDをそれぞれ実装していきます。
詳細は次章のバックエンド編で書いていければと思います。

# まとめ
本記事ではこれから作成していくシステムの準備編というところで、画面構成やDB構成等を考えていきました。
次章から実際の実装を進めていきます。
誰もが知ってる：データベースの機能・デッドロック

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの機能　デッドロックについて更に詳しく調べてみましょう！
![インスタスライド_202302022.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/0850568f-be48-4c09-02b3-0527ee56b697.gif)


# デッドロックとは
複数の処理が並行で実行されて同時に同じデータにアクセスされる場合に、

お互いがロック取得しようとしてデータを取り合い、処理が進まなくなる状態。

# デッドロックイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6f280aec-618d-0557-67dd-81f6e2411ee8.png)
トランザクションＡ，Ｂとも相手のトランザクションのロック解除待ちとなる処理がストップ

# デッドロックに対して
デッドロックが発生するとデータベースのパフォーマンスが著しく低下します

基本、デッドロックは避ける様にプログラミングする必要があります。

# デッドロックを避けるため
１．更新する順序を標準化（ルール化）する

２．ロックするスコープ（範囲）を小さくする。早めにcommitかrollbackを行いロックを解除する

３．なるべくロックを掛けない仕様にする
　update 在庫 = 在庫 -1 from 在庫テーブル
　where id = ‘A0001’
等を使う

# まとめ
ーデッドロックはデータ取得のロック

ーデッドロックは良くない状態

ーデッドロックが発生しない様に工夫する

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
フィクションなどから拾う情報処理用語 その15 鬱病 (秘密戦隊ゴレンジャー)

秘密戦隊ゴレンジャー 第34話「黄色いスパイ戦! 見たかYTCの威力」(脚本：上原正三、監督：北村秀敏、技斗：岡田勝、(C)石森プロ、東映)、秘密戦隊ゴレンジャー 第35話「黒い大怪鳥! コンドラー戦斗爆撃隊」(脚本：上原正三、監督：田口勝彦、技斗：岡田勝、(C)石森プロ、東映)より

季節は1975年の年の暮。私は自宅至近の幼稚園に歩いて通っていた。
そして、またも鉄人仮面テムジン将軍配下の鋼鉄軍団の仮面怪人が倒された。

黒十字総統「またやられたのか。」

このセリフ、何度言われたのだろうか?

鉄人仮面「は。キレンジャーの思わぬ反撃を食らいまして。」

鉄人仮面はそう答えたのだが、黒十字総統のご機嫌はよろしくなかった。

黒十字総統「弁解無用! はやくゴレンジャーを倒せ。倒せ。倒せー。」

相当お怒りのようである。生真面目な鉄人仮面は悩んだ。

こうして次回になった。
度重なる失敗に鉄人仮面は責任を感じ、自らを磔にさせた。
その場所はいつもの造成地である。

ゾルダー「どうぞ。」

ゾルダーは銃を渡した。

スチール仮面（声：大宮悌二）「うん。」

スチール仮面は銃を構えた…のだが、やめてしまった。

鉄人仮面「よーし、遠慮は要らん。私を撃て、スチール仮面。」
スチール仮面「は。」

そしてスチール仮面は銃を構え、引き金に手をや…ろうとしたのだが、やめてしまった。

鉄人仮面「どうした。はやく死刑執行しろ。」
スチール仮面「ダメです。私には撃てません。」

鋼鉄軍団の鉄の規律が伺えるセリフだ。これが日輪仮面だったら虹仮面なんかが喜んで銃殺していたことだろう。だが鉄人仮面は困惑した。

鉄人仮面「私は連戦連敗の将軍だ。総統閣下の御期待に沿えなかった。死んでお詫びをするしかないのだ。はやく撃て。命令だぞ。スチール仮面。」

なんだか鉄人仮面の目から涙が出そうな勢いである。
仕方なく

スチール仮面「は。では。」
鉄人仮面「うーん。」

スチール仮面は覚悟を決めた。

鉄人仮面「黒十字総統、万歳。」

と叫ぶや否や

黒十字総統「待て。」

その声を聞くや否や、スチール仮面もゾルダーも一斉に振り返った。

ゾルダー「ホイ!」

(磔にされている鉄人仮面以外の)皆、敬礼。
黒十字総統は銃殺刑を止めに来たのだ。

鉄人仮面「あ、総統閣下。」
黒十字総統「犬死は許さん。」

これを聞き、安心したのか

スチール仮面「はやく鎖を解け。」

鉄人仮面の磔は解かれた。

黒十字総統「見よ。」

すると飛行物体が何機も飛んできた。

黒十字総統「南米のナスカ高原から呼んだコンドラー戦闘機隊だ。コンドラー戦闘機隊は強力な援軍だぞ。もはやバリブルーンも恐るるに足りぬ。これまでの恨みを一気に爆発させろ。我が黒十字軍、反撃の時は来た。」

鉄人仮面とスチール仮面は深々と頭を下げた。
こうして鉄人仮面の気分は晴れたのであった。
フィクションなどから拾う情報処理用語 その14 電源 (仮面ライダーV3)

仮面ライダーV3 第48話「見た! デストロン首領の顔!!」(脚本：海堂肇、監督：折田至、(C)石森プロ、東映))より

また前回の続きになってしまうが、長くなるので細部は省略しよう。
脚本を書いた海堂肇の正体は平山亨プロデューサーと阿部征司プロデューサーである。

さて舞台は代々木の体育館。最初の東京オリンピックが催された場所である。
そこにデストロン首領がやってくるという情報を首領自身から聞いたライダーマンはV3とともに潜入したのだが、紆余曲折の末、落とし穴に落とされた。罠だったのだ。そしてV3とライダーマンはそのまま別々の部屋に閉じ込められてしまった。

ライダーマン「あ、気圧が下がる。これは。」
ヨロイ元帥「お前達の最大の弱点は空気のない状態だ。
仲間のV3のダブルタイフーンも真空では何の力も出せない。」

頭を抱えて苦しむライダーマン。V3は壁を叩いてこう言った。

V3「結城。ライダーマン。無事か。」

ライダーマンは我に返った。

ライダーマン「V3。無事か。」
V3「ライダーマン。」
ライダーマン「すまん。俺は迂闊だった。罠とは知らなかった。許してくれ。」

ライダーマン、気持ちはわかるが、大事なのはそれではなかろう。

V3「わかっている。大丈夫か?」
ライダーマン「大丈夫だ。携帯酸素ボンベがあるから、しばらくは行ける。君は。」

ライダーマンは携帯酸素ボンベを咥えた。
確かに呼吸はなんとかなるかもしれないが、露出している顔の下半分は大丈夫なのだろうか?
謎である…がそこまで考えて、この脚本を書いてはいないのだろう、多分。

V3「俺はラングの酸素で平気だが、真空ではエネルギーの補充が効かない。」

ライダーマンは携帯酸素ボンベを離して、また繰り言を言い出した。

ライダーマン「君に疑われても仕方がない。すまん。」

また咥えた。
大真面目にこういうやりとりをしているのである。

V3「ライダーマン。気を落とすな。私は君を信じているぞ。」

歴戦の勇士V3はそう言ったのだが、またライダーマンは携帯酸素ボンベを離して話し始めた。

ライダーマン「V3…」

と言うやりとりが行われている、ちょうどその頃、何故か立花藤兵衛は電気工事員に化けて代々木体育館横のマンホールを開けて地下に潜っていた。どうやってその場所を突き止めたのかは謎なのだが、まあ、それは置いといて。これは一応、後の伏線ではある。

ライダーマンの心の声「真空の中では声を出しても聞こえないが、これなら通じるはずだ。」

真空になったらしい。ライダーマンは壁を叩き始めた。

ライダーマンの心の声「酸素がなくなる。俺の右腕はドリルになっている。これを使って脱出しよう。」

そんなものがあったのなら、最初から使えば良かったと思うのだが、気が動転して出てこなかったのだろう。ライダーマンの意図をV3も理解した。モールス信号をお互いに知っていたのだろうが、ライダーマンが叩く音は単調な響きな気がするのは気のせいか? 他にもツッコミどころはあるが、兎に角、V3も壁を叩いた。

V3の心の声「頼むぞ、ライダーマン。」

その音が立花藤兵衛にも聞こえた。立花藤兵衛が壁に近づいた。
ライダーマンは右腕にドリルアームをセットして、ドリルを回そうとしたのだが…

ライダーマンの心の声「回らない! バッテリーがない!」

あっちゃあ。ライダーマンは周りを見回して電線を見つけ、なんと左手で触ったが

ライダーマンの心の声「切れてる…」

絶句した。もっとも今まで喋ってはいないが。再び、ライダーマンは壁を叩き始めた。

ライダーマンの心の声「5000Vの電気が必要だ。ここにはない。」

繰り返し書くが、これは大真面目に作っているのだ!
科学考証が適当なのは明らかだが、その知識がない人が制作したのだから仕方がない。
兎に角、ライダーマンは窮した。
V3は辺りを見回した。

V3の心の声「ここにもない!」

あったとしても役には立たないが…
だが

立花藤兵衛「5000Vか。あ。よーし。」

なーんと藤兵衛のいる所に電源スイッチがあった!
なんという奇跡だろうか。と思ったら

藤兵衛「2500Vか。2500Vじゃダメか?」

それでも藤兵衛はスパナを取り出し、壁を叩き始めた。
ライダーマンはその音に気がついた。

ライダーマンの心の声「試してみよう。」

そう。試す事が大事なのだ(そうか?)。
立花藤兵衛は線の存在に気がついた。

立花藤兵衛の心の声「細い線の片割れがそちらにないか?」

あるのである、一応。

ライダーマンの心の声「ここにもある。」

藤兵衛は頷いた。藤兵衛は線を繋いだ。
V3もライダーマンと藤兵衛のやりとりに気がついた。
ライダーマンの結線が完了した。

ライダーマンの心の声「電気、送れ。」
藤兵衛「よーし。すぐ送ってやるからなあ。」

藤兵衛の方も結線を始めた。

藤兵衛「もうすぐだ…よーし。」

スイッチオン。
ライダーマンのドリルアームのドリルが回り始めた。
5000V必要のはずなのに2500Vでも回ったのである!
名場面なので辻褄が合わないのはこの際無視しよう!

ライダーマン「あ、回った。」

ライダーマンはまずV3と自分の部屋との間に穴をあけた。

ライダーマン「今度は外だ。」

藤兵衛も穴があいたのに気がついた。
ライダーマンは倒れてしまったが

ライダーマン「空気だ。空気だぞ。V3、空気だ。」

V3の両目が点滅した。ダブルタイフーンが回転した。

V3「よし。ライダーマン。これで戦えるぞ。」

V3は壁をパンチ。壁は破れ、V3はライダーマンと合流した。

ライダーマン「パワーアーム。」

V3と一緒に外への壁を破壊。かくしてV3とライダーマンは立花藤兵衛と合流し、脱出に成功したのであった。

めでたし。めでたし。

ふと思ったのだが、最初からパワーアームを使えば良かったのではないだろうか?
フィクションなどから拾う情報処理用語 その13 なりすまし (仮面ライダーV3)

仮面ライダーV3 第47話「待ち伏せ! デストロン首領!!」(脚本：伊上勝、監督：折田至、(C)石森プロ、東映)より

「続きは映像で」と書いてしまったが、その続きである。

この日は1974年1月5日。ライダーマンがアジトに乗り込んだ頃、風見志郎は正月パーティーに参加していた。

黒ずくめの男「風見志郎君。デストロンからのお年玉を差し上げよう。」

芸の細かいことにお年玉まで用意していたのである。
黒ずくめの男が白い布を外すとシーラカンスが現れた。

風見志郎「あ! 3億年前の魚。シーラカンス。」

と言うや否や

シーラカンスキッド「ウワオー。」

シーラカンスはデストロンの怪人シーラカンスキッドになった。

シーラカンスキッド「デストロンパーティーのパートナーはこのシーラカンスキッドだ。」
志郎「デストロンの怪人。物騒なパートナーは、俺の方から願い下げだ!」

で変身するのかと思ったら、

志郎「ト、トー! トイヤー! 」

まるで後のアオレンジャーを思わす掛け声をかけながら黒ずくめの男達と戦った。
そういえば宮内洋は生身で戦うのが好きだった。
脚本家や監督や殺陣師に意見を言って、仮面ライダーV3の出番を極力削って自分の出番を増やしていたのであーる。閑話休題。

志郎「ふん。変身! ヴイスリー!」

宮内洋は「変身! ヴイスリャー!」と言っていたという都市伝説(?)があるが、私は何度聞いても「変身! ヴイスリー!」にしか聞こえない。それは兎に角、風見志郎は変身して仮面ライダーV3になった。

仮面ライダーV3「トー! トー! トー! トー!」

(さっき倒したはずの)黒ずくめの男達を倒したV3はシーラカンスキッドとも格闘を開始した。だがシーラカンスキッドは口から赤い風船を飛ばした。風船はV3の前で(なぜか)爆発。V3は悶絶した。それでもV3はシーラカンスキッドと戦っていたが、突如、シーラカンスキッドが逃げ出した。当然、追いかけるV3。

一方、ライダーマンは屋敷の部屋のドアを開けようとしていたが、鍵が閉まっているのか、開かなかった。で別のドアのノブを回しながら

ライダーマン「どこだ、ヨロイ元帥。卑怯者の姿を見せろ!」

やはり頭に血が昇っている。すると戸が開いた。その先にヨロイ元帥が座っているのが見える。

ヨロイ元帥「ここだ。逃げも隠れもせん!」
ライダーマン「そこか。」

中にはいるライダーマン。ヨロイ元帥は不敵に笑って立ち上がり、こう言った。

ヨロイ元帥「待っていたぞ、ライダーマン。いや、裏切者結城丈二。」

この言葉を聞いてライダーマンは逆ギレもとい怒り狂った。

ライダーマン「ヨロイ元帥、今日こそ恨みを晴らしてやる。」

そう言うのはV3のようなプロの人(よく考えたら職業にしているわけではないが、まあそれは置いといて)に任せるべきだと思うのだが、それはそれ。
ライダーマンは猪突猛進の人なのだ(溜息)。
ライダーマンはヨロイ元帥に駆け寄り

ライダーマン「ヤー! 」

と飛び交ったが、悲しいかな、ヨロイ元帥の敵ではない。跳ね飛ばされてしまった。ライダーマンは反撃しようとしたが、その時、ライダーマンの上に鉄の縄(だと思う)が落ちてきて、ライダーマンは拘束されてしまった。

ライダーマン「しまった。」

後の祭りである。

ヨロイ元帥「良いざまだな、ライダーマン。」
ライダーマン「俺を捕まえても無駄だ。まだV3がいるぞ。」

ライダーマンは自分が何故そうされているのかまではわかっていなかった。
科学の知識は一流だ(ったかもしれない)が戦いの方は素人である。
ヨロイ元帥は真の狙いを告げ始めた。

ヨロイ元帥「そうかな。果たしてライダーV3は助けに来るかな。」
ライダーマン「もちろんだ。」
ヨロイ元帥「今、面白いものを見せてやる。」

外ではV3とシーラカンスキッドの戦いが続いていた。

ヨロイ元帥「シーラカンスキッド。」

その声をV3もシーラカンスキッドも聞いた。
V3の動きが止まった隙にシーラカンスキッドは逃走し、また屋敷の中に入った。
追いかけるV3だったが、シーラカンスキッドは何かを跨いで逃げた。
おや。どこかで見たようなもの、というか、人である。
床に寝そべっていた。
この場面がヨロイ元帥のいる部屋にあるテレビ(だろう)に映っていた。
V3がシーラカンスキッドを追いかけてその寝そべっている人に気づかず通り過ぎた、まさにその時、

デストロンライダーマン「V3。」

なーんとライダーマンと同じ声だ。というか、姿も一緒である。
V3は思わず立ち止まり、振り返った。

V3「ライダーマン。」
デストロンライダーマン「V3。」

それをしっかり観た(本物の)ライダーマンは

ライダーマン「あ、あれは…」

絶句した。

ヨロイ元帥「観たか。デーストロンライダーマンだ。」
ライダーマン「デストロンライダーマン!?」

今度はどう観ても全く同じ姿である。

V3「しっかりするんだ。」

V3はライダーマンの仮面を外した。すると現れたのは結城丈二(そっくり)の顔だ。

ライダーマン「あ、俺の顔まで。」

ここまで再現して(というか本人が演じて)いたのだ。

ヨロイ元帥「顔ばかりか、声までも同じだ。」

そうとは知らないV3はデストロンライダーマンを肩に抱えて逃げようとした。

ライダーマン「ライダーV3、それは俺じゃない。偽者だあ。」

だが

ヨロイ元帥「怒鳴っても無駄だ。この部屋は完全防音だ。」

万事休すである。

ライダーマン「俺の偽者に何をさせるつもりだ。」
ヨロイ元帥「ライダーV3は、味方と信じるライダーマン、いや、結城丈二に殺される。そして少年ライダー隊の全滅。最後の仕上げには、東京都民皆殺し。全ては結城丈二のやったことになる。」

少年仮面ライダー隊は川崎市多摩区にあると言う情報をデストロンは掴んでいたはずだが、ヨロイ元帥は勢いもあってかこう言った。東京都だけで良かったらしい(わけではないとは思うが)。

さあ、果たしてどうなるか。今度こそ、続きは映像で確認していただきたい。アッと驚く展開が待っている。デストロンライダーマンの正体はシーラカンスキッドだった…って先程の展開とは矛盾しているような気がするのだが、そういう話だから仕方がない。

それにしてもこのネタ、一年前にもやったばかりだよ、伊上勝さん。
dockerコンテナにgitの最新バージョンを入れる

# コンテナ内にあるgitが少し古い
　今回、pythonを動かそうと公式からイメージを取ってきたところgitのバージョンが少し古くなってました。古くても特に問題はなさそうなんですが、最新バージョンを入れる方法を知っておこうと調べました。初心者の備忘録なので間違いがあればご指摘お願いします。

# Dockerfileへの記述
```dockerfile
FROM python:3

# インストール前に下準備
# updateでインストールできるパッケージリストの更新、upgradeでインストール済みパッケージの更新
RUN apt-get update -y \
    && apt-get upgrade -y

# 必要なライブラリをインストール
RUN apt-get install -y gettext \
    libcurl4-gnutls-dev \
    libexpat1-dev \
    libghc-zlib-dev \
    libssl-dev \
    make \
    wget
    
# Gitをソースからコンパイルしてインストール
RUN wget https://github.com/git/git/archive/v2.30.0.tar.gz \
    && tar -xzf v2.30.0.tar.gz \
    && cd git-* \
    && make prefix=/usr/local all \
    && make prefix=/usr/local install

# 最後に不必要なパッケージの削除
RUN apt-get autoremove -y
```

# ちなみに
　シェルスクリプトにbashを使用しているのですが、gitコマンドのtab補完機能を有効化するために必要なgit-completion.bashは以下にありました。初心者には特にありがたい機能です。
　`/git-2.38.1/contrib/completion/git-completion.bash`


# 参考
https://zenn.dev/koralle/articles/6595594da018dc
PythonAnyWhereでデプロイしようとしたらシークレットキーがないと言われた

# PythonAnyWhereでデプロイしよう
PythonAnyWhereは無料でデプロイできます。（制限はあります）簡単に言うと、自分の作ったアプリを公開できるということです。

## デプロイ方法
　デプロイ方法は先駆者がいるのでそれを参考にしてください。
- [先駆者様リンク](https://qiita.com/t-shirayama/items/a8dc8c7946fdea00d8fa)

　ちなみに、私は先駆者通りにやったら
> $ pa_autoconfigure_django.py --python=3.9 https://github.com/<your-github-username>/<repositoryname>.git

この部分でエラーが出ました。
　そんな「コマンド無いよ」ってエラーだったので、[この方](https://qiita.com/taungyeon/items/9398b4740842dcef821c)を参考にしたら通りました。


## エラー確認
### 確認方法
　先駆者を参考にしてもエラーが出る人もいると思います。私もそうでした。
　その際は、`web`タブに移動し下にスクロールするとある、`log files`の`ERROR log`を参照してください。

### 実際のエラー
　私が実際に遭遇したエラーは以下の通りでした。
>raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")

　これは「シークレットキーが無いよ」というエラーですね。シークレットキーを外部ファイルの`.env`で管理してたのが原因です。

### 解決方法
　`web`タブの`code`の`WSGI configuration file:`の`/var/www/[ユーザ名]_pythonanywhere_com_wsgi.py`で設定を変えたら直りました。
　具体的には、
```python:
os.environ["SECRET_KEY"] ="シークレットキー"
```
と書きました。このとき、末尾の`application = get_wsgi_application()`より上に書くことに気を付けてください。

## まとめ
　PythonAnyWhereでデプロイする方法と、エラーの確認方法を見ていきました。皆さんもデプロイする際にエラーが出ると思いますが、いろんなサイトを参考にして頑張ってください。
　私は[このサイト](https://www.kageori.com/2020/09/pythonanywhereweb.html)を参考にさせていただきました。ありがとうございました。
Lolipopサーバ に Drupal を入れるときの注意点

残念ながら、Drupal 10.0 をうまく扱えず、断念しました。

色々試行錯誤した末の感想を書きます。（半分以上、愚痴になります。）


## 目的(前回と同じ)
オンラインプログラミングスクールのサイト構築を行う上で、
会員別に購入コースに応じて、コンテンツの参照設定が必要なため、Drupalを検証しました。

## やったこと（1）- 拡張機能 webformの追加（1） -
e-ラーニング等では必要な、学習の理解度のチェック・フィードバックを必要としております。
なので、webform　という拡張機能入れる必要があると。

前回簡単に説明したように、tar.gzのリンクを拡張機能に突っ込んで、インストールをします。
その後、機能の有効化をします。

■ webform
■ webform UI

これも有効化しますーみたいなダイアログをOKしながら進むと、、、

:::note alert
サイトに予期せぬエラーが起こりました。しばらくたってから再度お試しください。
:::

と管理画面に表示され、何も出来ない・・・。
どうすりゃいいんだ・・・。

色んなサイトも調べましたが、いい感じの直し方がないみたい。
キャッシュのクリアをするとかしか、具体的なサイトがない。
ということで、再インストールしかないと。

一応、DBのDumpを拡張機能のインストール前後でDiff取ろうかと思ったけど、面倒なので止めました。
それをやれば、DBから拡張機能の無効化が出来たりしないかなと。


## やったこと（2）- 再インストール -

①webフォルダを全削除。
ただし、セットアップ後は、Durpal側で書き込み権限を剥奪しているようで、フォルダごと全削除。という感じで、一括削除は出来なかった。
FTPから書き込み権限を付与してから、削除する必要がありました。

WinSCPと、ssh（putty）と、lolipop FTPから操作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/23b282c4-6b9f-d88f-2327-c01d7a5c35c3.png)

②次に、データベースのテーブルを全部削除。
管理画面の、[php My Admin]でテーブル一覧を出して、全部削除！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/cf77c4e8-4986-8510-c3da-177c6d255481.png)

③webフォルダを、再アップロード
WinSCPで、2時間ほど・・・。

## やったこと（3）- 拡張機能 webformの調査 -
よくよくみると、Durpal 10 に対応してないじゃないか・・・。

では、対応している Durpal 9.5.3 を入れようじゃないか！！
ということで、「やったこと（2）」を再度やります。


## やったこと（4）- 拡張機能 webformの追加（2） -
ということで、再度インストールして、有効化。

・・・また、エラーが出ました。

:::note alert
サイトに予期せぬエラーが起こりました。しばらくたってから再度お試しください。
:::

マジで、なんなのこれ？
ということで、もうちょっと調査を。

よくよく見ると、tar.gzでのインストールじゃなくて、composer コマンドを使用してインストールが推奨されているよう。。。
残念ながら、lolipopサーバにインストールされてないようなので、 composer コマンドを使用できるようにする必要がありそう。

恐らく誰かと共用しているレンタルサーバにコマンドインストールしていいものなの？

ちょっとリスクが高すぎるので、ちょっと辞めときます。
どうしてもやるなら、別のサーバ借りてちゃんと構築すべきかな。。。


## やったこと（5） 別のモジュールを探す・・・。
ということで、諦めていろいろ調べたところ、Quiz という拡張機能がいい感じっぽい！！

モジュールの推奨バージョン Durpal 9.3 にして、再インストール！(計 5回位やってる)

【今ここ】

いい感じになったら、また記事書きます。

## 感想というか愚痴（2023/02/15 時点）
・Durpal は、安定しておらず、拡張機能のアップグレード等を行うことによって、予期せぬエラー（）が発生し、システム障害になる可能性が常々ある。
・拡張機能も海外の人が作っており、オープンソースのためサポート体制が不明。
 → 専門的にやっている会社、ベンダーのサポートが必要だと思う。
・ちゃんと作り込むには、ちゃんとした知識が必要であり、簡単に出来ると思ったら、想定していない部分で時間が取られる可能性が高い。
・エラーが発生した際の、解決方法等の情報がとても少なく、キツイ。
　→ これが一番開発者泣かせかも。有識者の方、もっと情報公開して欲しい！です。



## Durpalとの付き合い方
・愚痴はあれど、決して悪いわけではない。知識がない方が悪いのだ。文句があるなら、一から自分で作れと。
・以下の流れで選定すればいんじゃないかな？

1.Drupalが使用できるサーバ環境の確認
2.Drupalを使用して、必須で入れるモジュールのリスト化
3.モジュールの推奨バージョンから、Drupalのバージョンを決定
4.サーバーセットアップ（私は lolipop サーバですので、他のサーバはわからない）
5.拡張機能のインストール、有効化
6.拡張機能の検証（やりたいことが出来そうか）
　OKな場合：そのままサイト構築へ
　NGな場合：それぞれのバージョンを見直し+再セットアップ（2-5を繰り返す）

という感じです。

・懸念としては、古いバージョンを使い続けなければならないので、セキュリティの担保がしにくいという点だ。
　個人情報をわかりやすい方法で置くようなことは止めたほうがいいでしょう。
・海外からのIPを防いだり、ファイアーウォールを使用するとか、セキュリティを重要視すべきところはしたほうが良いです。



~~とりあえず、もうしばらく遊んでみます。~~

（2023/02/16 更新）

すみません、心が折れました。
composer コマンドを使用しないと有効化出来ない拡張機能が多く、Lolipopサーバでの構築は、本体のみはいいのですが、色々拡張するには、厳しいものだと思われます。
（これまで 大体、20時間くらいかかってます）

これから、ConoHa VPSでも借りて、試してみます。
URP版のユニティちゃんを導入して、踊らせる

# はじめに
YouTubeにアップロードした内容の記事にまとめたものになります。
<iframe width="560" height="315" src="https://www.youtube.com/embed/ln-u_3i8T0Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 環境
<dl>
<dt>Unity<dt>
<dd>2021.3.17f1</dd>
<dt>テンプレート<dt>
<dd>3D Sample Scene (URP)　<dd>
</dl>

# 必要なアセット
[UnityChan Sunny Side Up(URP版)](https://unity-chan.com/download/releaseNote.php?id=ssu_urp)
[UnityChanSpringBone](https://github.com/unity3d-jp/UnityChanSpringBone)
[UnityChanToonShaderVer2_Project](https://github.com/unity3d-jp/UnityChanToonShaderVer2_Project)

# 本編
**アセットのインポート** 
モデルデータはUnityChanSSUファイルの中にあるので、
UnityChanSSU-URP-release-バージョン > Assets > UnityChanSSUフォルダをインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/e12623b9-c14e-9923-d8fd-0c09619a005c.png)
UnityChanSpringBoneとUnityChanToonShaderVer2_Projectはそのまま追加すれば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/5ae973f1-7c21-6a4f-bdb7-ddfa310830f7.png)

:::note info
動画では、Assetsの中身すべてをインポートしましたが、モデルだけが必要ならAssetsの『Models』,『Prefabs』,『Shader』の3つがあれば十分です。なので、一度、UnityChanSSUプロジェクトを開いて、[ExportiPackage]からunitypackageを作成したほうが使いまわしがしやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/b0763576-08ab-77a4-d803-12db8f11d401.png)
:::

**シェーダーの変更**
1.Assets>UnityChanSSU> Models>UnityChanSSU>Materialsを開いて、ピンク色になっているマテリアルを選択
2.マテリアルのShaderを[Universal Render Pipeline/Toon]に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/837e1e1f-f383-7ed8-06ea-9b00764d1d28.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/fb6c34a8-c525-87a1-d634-d8dca61f96ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/4e405f99-851b-8677-7477-dabd6e845e17.png)
**できた!!**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116386/b5315e53-32a7-9793-a1f7-081764d0835b.png)
絶対やっておきたい Well-Architected レビュー

# クラウド活用のアプローチ

- クラウド活用のアプローチは二通り。いずれもクラウドの"最適化"がポイント。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/b0a58067-0015-7265-9d62-5c236034ac88.png)

# クラウド最適化への課題と不安

- クラウド最適化を行うにあたって、設計・運用のノウハウがないという課題や不安がつきまとうケースもある。
 
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/9256aa73-22a1-9eb0-b79c-bcbc1fcf9537.png)

# Well-Architected Framework

- こうした課題や不安を解消するためのツールが、Well-Architected Framework。
- Well-Architected Frameworkは、AWSの提案する「システム設計・運用の"大局的な"考え方とベストプラクティス集」。
- 設計原則と柱から構成される。

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/3df2df86-7c1b-bed8-f22a-17f55c6573f0.png)

# 設計原則

- 設計原則は、一般的な設計原則と柱それぞれに固有の設計原則から構成される。

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/26fb2966-cb35-5c27-8ccc-dc43f703ab9d.png)

# 柱
- 柱は、運用、セキュリティ、信頼性、パフォーマンス、コスト観点に加え、2021年に新たに追加された持続可能性(サステナビリティ)の6つの柱から構成される。
- 持続可能性は、地球規模のコスト観点であったり、他の柱で代替可能であったりするため、優先度は低め。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/d00db60e-17d7-b58e-99be-1d8f3cc1e84f.png)

- これらの質問とベストプラクティスを使ってアーキテクチャーのリスクや改善点を点検するのが、"Well-Architected レビュー"

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/3695f52a-c4a3-fac9-2c1e-e636fc429a5b.png)

# Well-Architected レビューの必要性
- リスクや課題を事前に検出　→　炎上などのトラブル防止(品質担保)
- 最適化や改善ポイントの明確化 → 次の提案につながる
- アーキテクチャーや考え方があっているか　→　不安の解消
- 人の育成　→ W-Aレビュを通したスキルアップ

# W-Aレビューのプロセス
- 公式には、複数回の実施を推奨。
- 運用フェーズにおいても実施は有効性あり。
 
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/3709cd9e-06e6-68e0-5d4d-a0d20c7e1026.png)

- 設計時にW-Aの考え方をインプットすること
- 複数回の実施を行うようなプロセスの定義がおすすめ

# W-A レビューを実施する際のポイント
- システムとして重要な順番を決めておくこと
    -  何を守りたいか、何が重要かを、チームで定義して共有しておくこと。
- 銀の弾丸でも監査でもない
    - あくまでも気づきを得る場、健康診断くらいのイメージで。
- すべての柱を点検していくと約10時間くらいかかる
    - やり方にも依存するが、工数を見積もりに入れておく。
- 関係者は全員集めたほうが効率的
    - 範囲を絞って実施してもよいが、ビジネス面も含めたワークロード全体が対象となるため。
- 事前準備が必要
    - 事前に素振りはしておいたほうが安心。
- W-Aの質問がよくわからない
    - 翻訳精度、そもそも意味不明なものもあったい、、、。
- 継続的に実施するとより効果的
    - 単発でも効果はあるがクラウドサービスの進化にあわせて実施が望ましい。
- トレードオフの関係性を理解しておく
    - すべての項目をOKにするのは無理、リスクを鑑みて取捨選択すること。

# まとめ
- Well-Architected Frameworkは理想の考え方。理想と現実を照らし合わせて、リスクを顕在化・共有していきましょう。
- 早いタイミングでW-Aレビューを実施すれば手戻り防止、スキルアップにも効果大！
- W-Aレビューを組織に浸透させるためには、地道な啓蒙活動とプロセス化が必要。
php artisan serveしたのに、エラー出てしまいました。composer installもエラーだった。


ある日、PHPのLaravel入門の本(通称青本)をもとに環境構築しているときのことでした。
`php artisan serve`を叩いたところ、こんなエラーメッセージが、、
※DeskTopに`laravelapp`という名前でプロジェクト作成しています。
```
PHP Warning:  require(C:\Users\ユーザー名\Desktop\laravelapp/vendor/autoload.php): Failed to open stream: No such file or directory in C:\Users\ユーザー名\Desktop\laravelapp\artisan on line 18
PHP Fatal error:  Uncaught Error: Failed opening required 'C:\Users\ユーザー名\Desktop\laravelapp/vendor/autoload.php' (include_path='.;C:\php\pear') in C:\Users\ユーザー名\Desktop\laravelapp\artisan:18
Stack trace:
#0 {main}
  thrown in C:\Users\ユーザー名\Desktop\laravelapp\artisan on line 18
```

調べたところ、 `composer install`や、 `composer update`を叩くとautoload.phpが落とせるらしい。。

`composer install`をたたてみた。
ムムム。。。。

```
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - league/mime-type-detection[1.0.0, ..., 1.3.0] require php ^7.2 -> your php version (8.2.3) does not satisfy that requirement.
    - league/mime-type-detection[1.4.0, ..., 1.11.0] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - laravel/framework v10.0.0 requires league/flysystem ^3.8.0 -> satisfiable by league/flysystem[3.8.0, ..., 3.12.2].
    - league/flysystem[3.8.0, ..., 3.12.2] require league/mime-type-detection ^1.0.0 -> satisfiable by league/mime-type-detection[1.0.0, ..., 1.11.0].
    - Root composer.json requires laravel/framework ^10.0 -> satisfiable by laravel/framework[v10.0.0].

To enable extensions, verify that they are enabled in your .ini files:
    - C:\Program Files\php-8.2\php.ini
You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with `--ignore-platform-req=ext-fileinfo` to temporarily ignore these required extensions.
```

```composer update```も同じメッセージだった。。　見てみると、
```you can run Composer with `--ignore-platform-req=ext-fileinfo` to temporarily ignore these required extensions.```

とかいてありますね。
```
composer update --ignore-platform-req=ext-fileinfo
```
これをたたいてみます。
おおお動いた
```
Loading composer repositories with package information
Updating dependencies
Lock file operations: 106 installs, 0 updates, 0 removals
  - Locking brick/math (0.10.2)
  - Locking dflydev/dot-access-data (v3.0.2)
  - Locking doctrine/inflector (2.0.6)
  - Locking doctrine/lexer (3.0.0)
  - Locking dragonmantank/cron-expression (v3.3.2)
  - Locking egulias/email-validator (4.0.1)
  - Locking fakerphp/faker (v1.21.0)
  - Locking filp/whoops (2.14.6)
  - Locking fruitcake/php-cors (v1.2.0)
  - Locking graham-campbell/result-type (v1.1.0)
  - Locking guzzlehttp/guzzle (7.5.0)
  - Locking guzzlehttp/promises (1.5.2)
  - Locking guzzlehttp/psr7 (2.4.3)
====================以下略=================
```
結構長かったです。5分くらいかな。
`php artisan serve`をしたら無事起動できました。
メディアクエリの(hover: hover)は(hover)って省略できるらしい

Media Queries Level 4の仕様です。

https://w3c.github.io/csswg-drafts/mediaqueries/#mq-boolean-context

Media Queries Level 4のドキュメントによると以下のようにあります。

> While media features normally have a syntax similar to CSS properties, they can also be written more simply as just the feature name, like (color).
> 
> When written like this, the media feature is evaluated in a boolean context. If the feature would be true for any value other than the number 0, a <dimension> with the value 0, or the keyword none, the media feature evaluates to true. Otherwise, it evaluates to false.

`(hover)`のように書いた場合、hoverが「数値0」、「値が0の[\<dimension>](https://developer.mozilla.org/en-US/docs/Web/CSS/dimension)」、「`'none'`」以外の値のメディア特性を指定するようです。

```css
@media (hover: hover) { ... }
```
は
```css
@media (hover) { ... }
```
と書けますし、
```css
@media (pointer: fine) or (pointer: coarse) { ... }

@media not (pointer: none) { ... }
```
は
```css
@media (pointer) { ... }
```
と書けます。

## 数値

使う頻度は高くないかもしれないですが、例えば[color](https://developer.mozilla.org/ja/docs/Web/CSS/@media/color)は以下のMDNの例にあるように、白黒機器以外のメディアクエリを書けます。
これは`(color > 0)`を意味します。

```css
/* すべてのカラー機器 */
@media (color) {
  p {
    color: red;
  }
}
```

https://developer.mozilla.org/ja/docs/Web/CSS/@media/color#css

## おまけ

Boolean Contextは関係ないですが、Media Queries Level 4でrangeが定義され、

https://www.w3.org/TR/mediaqueries-4/#mq-range-context

```css
@media (max-width: 700px) { ... }
```
が以下のように書けるようです。
```css
@media (width <= 700px) { ... }
```
また、このような指定もできるそうです。
```css
@media (400px <= width <= 700px) { ... }
```

## Ref

- [Media Queries Level 4](https://w3c.github.io/csswg-drafts/mediaqueries/#mq-boolean-context)
- [@media - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/@media#%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E7%89%B9%E6%80%A7)
Routing Error(uninitialized constant HomesController Object.const_get...)の解決について

# 概要
railsのタグ機能の練習がしたくて、railsの環境を構築しましたが、routingのエラーが起きたので解決の方法を記述します。

# 環境
rails 7.0.4.2
ruby 3.1.2
AWS
cloud9
mac

# エラーの意味
エラー文を[deepl](https://www.deepl.com/ja/translator#en/ja/uninitialized%20constant%20HomesController%20Object.const_get(camel_cased_word)%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%20Did%20you%20mean%3F%20HomeController%20raise%20MissingController.new(error.message%2C%20error.name)%20%5E%5E%5E%5E%5E)で検索します。

uninitialized constant HomesController Object.const_get(camel_cased_word) ^^^^^^^^^^ Did you mean? HomeController raise MissingController.new(error.message, error.name) ^^^^^
↓
uninitialized constant HomesController Object.const_get(camel_cased_word) ^^^^ ってこと？HomeController raise MissingController.new(error.message, error.name) ^^^。

このやろう...

整理します。

uninitialized constant HomesController
↓
未初期化の定数HomesController

HomeController raise Missing
↓
HomeControllerが見つからない
HomeControllerが存在しない
HomeControllerがない場合

ん？Homecontrollerがない？
どういうことだ？と思って状況をもう一度整理します。

# routing、controller、view

```route.rb
Rails.application.routes.draw do
  root to: "homes#top"
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end
```

```home_controller.rb
class HomeController < ApplicationController
  def top
  end
end
```

```top.html.erb
<h1>test</h1>
```

# あ！

```route.rb
Rails.application.routes.draw do
  root to: "homes#top"
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end
```

root to: "homes#top"

この書き方だと、homesコントローラーのtopアクションを呼び出すよ！ってことなので、今回のhome_controllerとは合わない。
HomeController raise Missing
↓
HomeControllerが見つからない
HomeControllerが存在しない
HomeControllerがない場合
や、そもそもの
uninitialized constant HomesController Object.const_get(camel_cased_word) ^^^^ ってこと？HomeController raise MissingController.new(error.message, error.name) ^^^。
は正しかったんだ・・・ごめんよ・・・

# 結論

そもそもエラー文をよく読めって話ですね。気をつけます。
UICollectionViewDiffableDataSourceを使ってコレクションビューを実装する

`UICollectionView`について新しいAPIを使ってコレクションビューを実装するメモです。
`UICollectionViewDiffableDataSource`はiOS 13で導入されたAPIであり、簡単な実装と高速なパフォーマンスを提供するデータソースです。
従来の`UICollectionViewDataSource`と比較して、自動的にアニメーションを行い、アイテムを自動的に移動することができます。

## 使用例
以下の手順で`UICollectionViewDiffableDataSource`を使用して、`UICollectionView`を実装します。

### データソース
`UICollectionViewDiffableDataSource`のインスタンスを作成します。

```swift
let dataSource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView) { collectionView, indexPath, item in
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCell
    cell.textLabel.text = item.title
    return cell
}
```

### スナップショット
`UICollectionViewDiffableDataSource`のSnapshotを作成します。Snapshotには、セクションとアイテムの配列が含まれます。

```swift
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
snapshot.appendSections([.main])
snapshot.appendItems(items)
dataSource.apply(snapshot, animatingDifferences: true)
```

### 更新処理
データが変更された場合は、applyメソッドを使用してSnapshotを更新します。

```swift
var snapshot = dataSource.snapshot()
snapshot.deleteItems(deletedItems)
snapshot.appendItems(addedItems)
dataSource.apply(snapshot, animatingDifferences: true)
````

以上です。

## 参考
https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views
Raspberry Pi でUSBメモリ挿抜をトリガーにサービスを起動したり、スクリプトを動かしたり 


# 要件
* USBメモリを挿抜したタイミングでスクリプトを動かしたい
* USBメモリを挿抜したタイミングでサービスを動かしたい

Raspberry Pi Zero 2で試してみました。


# まずは・・・
USB検出したときのルールを追加するためにファイル作成

    nano /etc/udev/rules.d/10-usbdevice.rules 

# スクリプトを動かしたい
USBメモリを刺したら、そのデバイスをマウントして色々処理したい。

    ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*[0-9]", RUN+="/home/pi/script_on.sh $kernel"
    ACTION=="remove", SUBSYSTEMS=="usb", KERNEL=="sd*[0-9]", RUN+="/home/pi/script_off.sh $kernel"

$kernelにはsda1とかsdb1がはいるので、スクリプト内でマウントなどできますね。

# サービスを動かしたい
スクリプトだと59秒以上動かすと強制退場くらいますので、サービスにしたい場合は以下です。

    ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*[0-9]", ENV{SYSTEMD_WANTS}="usbdevice@$kernel\.service"

スクリプト内で$Iでsda1などが取得できます。
Downgrade GMT(The Generic Mapping Tools) version and install GMT with Windbarb

# TL;DR
* uninstall current GMT
* patch GMT with windbarb
* install GMT

## env
* OS: Ubuntu 20.04LTS(native x86_64)
* GMT 5.4.5 -> 5.4.3 with windbarb

なお、既存の他アプリとの整合のためGMT5系が必要だった。今回は6系は試していない。

# uninstall current GMT
```shell
sudo /usr/local/share/tools/gmt_uninstall.sh
```

# patch GMT with windbarb
## download GMT

tagを使って5.4.3を入手した。

https://github.com/GenericMappingTools/gmt/tags?after=6.0.0rc4

## download windbarb

https://sites.google.com/site/masahigaki/gmt/gmt-windbarb

## patch

```shell
tar zxfv gmt-5.4.3.tar.gz
cd gmt-5.4.3
patch -p1 -f < ../gmt-5.4.3-windbarb.patch
cd ../
```

# install GMT
```shell
cd gmt-5.4.3
cp cmake/ConfigUserTemplate.cmake cmake/ConfigUser.cmak
mkdir build
cd build

cmake ..
make

sudo make install
```
Vagrant VMにSSHできないときの対処法

Vagrant VMに `vagrant ssh` コマンドではログインできるけれど、 `ssh` コマンドではログインできないときの対応について、少しハマったので原因を記載してみます。
`vagrant up`後にAnsible等で追加セットアップするときなどに使っていますが、うまくいかないと結構面倒です。

※`config.vm.network :private_network, ip: "192.168.56.100"` のようにHost Only NICにIPを定義している前提とします。

## 1. pingでの疎通確認

ホストからVMのIP自体に `ping 192.168.56.100` を打って、レスポンスがあるかを確認します。
レスポンスがあればOKですが、レスポンスがない場合は、利用しているHost Onlyのネットワークセグメントに当該IPが間違いなく含まれているのかを確認します。

## 2. sshでの疎通確認

pingのレスポンスがある場合には、 `ssh -vv vagrant@192.168.56.100` のようにDebugログを出力しながらSSHを試行します。
鍵認証の失敗なのか、そもそもPort 22でのコネクションが張れないのか、それとも違った原因なのか材料を得ます。

## 3. MACアドレスの確認

今回、pingはOKだけれどSSHは `Protocol not available` のエラーでログイン不可という状況でした。
`arp 192.168.56.100` でどのMACアドレスだと思っているのかを確認します。
続いて、 `vagrant ssh` でVMにログインし、 ifconfig などで該当NICのMACアドレスを表示し、arpの結果と比較します。
今回はVMのMACアドレスがarpの結果と異なっており、SSHに失敗したとわかりました。

ping応答ありということはそのIPが存在しているはずですので、Vagrantプロバイダとして利用しているアプリケーション(VirtualBoxなど)を起動して、起動中のVM一覧から怪しいホストのIPを確認していきます。

## 4. DHCPサーバの確認

起動中のVMが他に存在しない場合、DHCPサーバとして同IPを利用していないか確認します。
結論としては今回は、VirtualBoxのホストオンリーネットワークアダプタのDHCPサーバのIPが、VMのIPと重複していることが原因とわかりました。
DHCPサーバのIPを変更するか、DHCP自体を無効化すると問題も解消されました。

## 5. その他確認事項

上記のいずれも関係しない場合は、ログからIPやMACアドレスで検索して原因箇所を推定するのが良さそうです。
また、ホストとVMの双方でtcpdumpを取りながら、どこまでパケットが届いていてどこからNGなのか、を確認するのも役に立ちます。
それでもよくわからなければIPを変える、新しくホストオンリーネットワークを作成するなどで回避する他なさそうです。
BlenderからUnityへエクスポートする時の回転軸について


# 概要
Blenderで作ったオブジェクトをUnityに持っていくと、パッと見正しく表示されたように見えますが、Rotationがいい感じに調整されているだけなのでゼロにリセットするとオブジェクトは横倒しになっていることに気づきます。（気にしなければこのままでも使うことはできますがVector3.forwardなどで正しい方向が取得できないかもしれません）
これをRotation X=0 Y=0 Z=0でも正しい表示にする方法を共有します。


# 本文
## まず
BlenderのObjectモードで設定した値はUnityのTansformに反映されてしまいます。
UnityのTransform値をデフォルト状態にしたい場合はObjectモードをむやみにいじらないのが良さそうです(編集作業はEditモードで)
![スクリーンショット 2023-02-15 23.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5b523c09-34a0-ce38-e725-22ebc7f1221e.png)

## 次に
こちらがUnityの座標軸です。Z方向がオブジェクトの正面でY方向が上方向です。
![スクリーンショット 2023-02-15 23.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/93bed940-bcc8-fa15-8cbb-1433dc55e5c1.png)

対してBlenderでは**テンキー1を押した時正面に向く**のが-Y方向でZ方向が上方向です
![スクリーンショット 2023-02-15 23.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1e024ea4-dc2e-c512-18c3-bacf55149d59.png)

この違いからBlenderで頭の方向(Z軸方向)がUnityに移すと横倒しになる現象が起きてしまいます。

## どうすればいいのか？
BlenderでObjectモードのRotationのXだけ90°回転にします。そうすればあとは、テンキー1を押した時こちら側の向きを正面としてモデリングするとうまくいきます。
(以下のスクショでは赤色を正面と見立てて作成しました)
![スクリーンショット 2023-02-15 23.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f49a5161-a63f-df2c-e00f-a2c55650bea9.png)

Unityに持っていくとTransformがデフォルト状態で正しく表示されました。(正面Z軸 / 上方向Y軸)
![スクリーンショット 2023-02-15 23.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9a6bb727-ffa6-9ee4-8691-18099314ed54.png)

## おまけ
エクスポート時の設定例です。（ボーンがある時はArmatureもON）
状況によって設定は変わってきますが、今回の場合Apply ScalingsはFBX Allがいいと思います:raised_hands:
![スクリーンショット 2023-02-16 0.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/748605a1-15eb-1895-d3b1-0f2f691dfa3f.png)

## おまけ２
既に作成済みのモデルの場合は上の手順を応用します。
ObjectモードでRotationのXだけ90°回転させます。
**「R」「X」「90」で90°回転**
モデルが横倒しになりますがEditモードに移って
**「A」で全選択**
**「R」「X」「-90」で90°回転**
このようにして起こします。
(ピボットポイントが変な位置にあったりオブジェクトが分かれている時などはそれぞれ対応が必要になります)
【RSpec】RSpecの導入

# はじめに

Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。

# RSpecのGitHub

https://github.com/rspec/rspec-rails#rspec-rails--

# rspecのインストール

### Gemfileへの記載

`Gemfile`に下記の通り追記する。

Railsのバージョンに合わせてどのバージョンの`rspec`をインストールするかは、`GitHub`上で確認することができる。

テストデータを作成するための`Factory_Bot`という`Gem`も、テストを実行する際によく使用するため一緒にインストールすることが多い。

```ruby
group :development, :test do
  gem 'rspec-rails', '~> 4.0.0' #Rails 5.xでRspecを使用する場合、このようにバージョン指定する。
  gem 'factory_bot_rails'
end
```

### Gemのインストール

`bundle install`を実行して`Gem`をインストールする。

```bash
bundle install
```

# rspecの設定ファイルを作成する

下記のコマンドを実行することで、`rspec`の設定ファイルが生成される。

### 実行コマンド

```bash
bundle exec rails g rspec:install
```

### 実行結果

```bash
$ bundle exec rails g rspec:install
DEPRECATION WARNING: Spree::Order state machine defined in Spree::Order::Checkout is deprecated. Future versions of Solidus will use Spree::Core::StateMachines::Order} (called from <main> at /testec/config/environment.rb:5)
DEPRECATION WARNING: Spree::Config.raise_with_invalid_currency set to true is deprecated. Please note that by switching this value, Spree::LineItem::CurrencyMismatch will not be raised anymore. (called from <main> at /testec/config/environment.rb:5)
DEPRECATION WARNING: Spree::Config.consider_actionless_promotion_active set to true is deprecated. Please note that by switching this value, promotions with no actions will be considered active. (called from <main> at /testec/config/environment.rb:5)
DEPRECATION WARNING: Spree::Config.run_order_validations_on_order_updater set to false is deprecated and will not be possibile in Solidus 3.0. Please switch this value to true and check that everything works as expected. (called from <main> at /testec/config/environment.rb:5)
DEPRECATION WARNING: Spree::Config.use_legacy_address_state_validator set to true has been deprecated and will be removed in Solidus 3.0. The Spree::Address state validation has been extracted into a configurable external class. Switch Spree::Config.use_legacy_address_state_validator to false to start using the external validation class. (called from <main> at /testec/config/environment.rb:5)
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

### 生成されるファイル

- `.rspec`
    - 基本設定ファイル
- `spec`
    - `spec`ディレクトリ配下にあるテストファイルがテストとして実行される
- `spec/spec_helper.rb`
    - `rspec`の全体的な設定を記述するファイル
- `spec/rails_helper.rb`
    - Rails特有の設定を記述するファイル

# 動作確認

テストを実行して動作を確認する。なお、テストコードはまだないため、なんのテストも実行されない。

### 実行コマンド

```bash
bundle exec rspec
```

### 実行結果

```bash
bundle exec rspec
No examples found.

Finished in 0.00022 seconds (files took 0.05756 seconds to load)
0 examples, 0 failures
```

# 参考

https://zenn.dev/yukihaga/articles/816758ff6f0bdf

https://qiita.com/taki_21/items/4f8d56571e2d51ed2a0e

https://sakaishun.com/2021/04/15/rspec-introduction/

# 最後に

いかがでしたでしょうか。
今回はMacにRSpecの導入方法についてまとめてみました。
ここ違うよ！でしたり、こうした方がいいよ！などがあればコメントいただけると幸いです。

他にも下記のような記事を投稿しております。
興味がありましたら、ぜひご覧ください。

https://qiita.com/sekkey_777/items/b40135995de01ae95dc2

https://qiita.com/sekkey_777/items/8a8b3ee2af3c46df50f0
【Nginx】DockerfileのCMDの先頭は/usr/sbin/nginxではなくnginx

## はじめに
[Nginxの公式イメージ](https://hub.docker.com/_/nginx)を使用する場合に`CMD`の記述の仕方によって正常に動作しない場合があるのでその理由と対処について以下に記述します。

## `CMD`の先頭は`/usr/sbin/nginx`ではなく`nginx`

`CMD`の先頭を`/usr/sbin/nginx`とするとDockerコンテナ内の`/docker-entrypoint.sh`が正常に機能しないことがあります。
そのため`CMD`の先頭は`/usr/sbin/nginx`ではなく`nginx`とする必要があります。

[公式イメージの`/docker-entrypoint.sh`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian/docker-entrypoint.sh)内に次のような記述があります。

```sh:docker-entrypoint.sh

...

if [ "$1" = "nginx" -o "$1" = "nginx-debug" ]; then

...

```
シェルスクリプトの`$1`は1つ目の引数を表します。
[`Dockerfile`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian/Dockerfile)内で`ENTRYPOINT [ "/docker-entrypoint.sh" ]`と記述されているので、`CMD`の記述は`/docker-entrypoint.sh`の引数となります。
よって上記条件式の`$1`は`CMD`の先頭を表します。
`CMD`の先頭が`nginx`または`nginx-debug`でないとこの条件式の中の処理は実行されません。
この条件式の中で`/docker-entrypoint.d/`配下のファイルが実行されるため`CMD ["/usr/sbin/nginx", "-g", "daemon off;"]`などとするとこれらのファイルが実行されません。

`/docker-entrypoint.d/`に配置されるファイルは次の3つです。

- [`10-listen-on-ipv6-by-default.sh`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian/10-listen-on-ipv6-by-default.sh)
- [`20-envsubst-on-templates.sh`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian/20-envsubst-on-templates.sh)
- [`30-tune-worker-processes.sh`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian/30-tune-worker-processes.sh)

`20-envsubst-on-templates.sh`は[設定ファイル内で環境変数を使用する](https://hub.docker.com/_/nginx#:~:text=Using%20environment%20variables%20in%20nginx%20configuration%20(new%20in%201.19))ための処理が記述されています。
`CMD`を`/usr/sbin/nginx`で始めてしまうとこのファイルが実行されず、環境変数が展開された設定ファイルが作成されません。


上記のことから`CMD`は`/usr/sbin/nginx`ではなく`nginx`で始める必要があります。

また以上のことは`compose.yml`の`command`やコンテナ起動時にコマンドを指定する場合も同様です。
TypeScript+twitter-textでTwitterの文字数カウンターを実装する

# ツイートの文字数の数え方めんどくさい問題

Twitterといえば140文字のテキストをツイートできるサービスという認識が強いですが、
現在280文字のツイートが可能です。(最近は[Twitter Blueだと4000文字投稿できる](https://k-tai.watch.impress.co.jp/docs/news/1477554.html)らしいですが...)

ただ、
- アルファベットは1文字カウント
- 日本語の場合2文字カウント
- 絵文字は2文字カウント
- 改行は1文字カウント
- URLはURLの長さに関係なく23文字カウント

…等Twitter独自の文字数カウントの仕様がたくさんあります。

今回、仕事でTwitterAPI経由でツイートするフォームを作成することになり、
文字数カウントのGUIも実装しなければならず、ツイート文の文字数を厳密に数える必要が生じたのですが、
先程挙げた仕様の事を諸々考えると1から実装するのがあまりにもめんどくせえな…になってしまいました。

# そこでtwitter-textを使う

[twitter-text](https://github.com/twitter/twitter-text/tree/master/js)はTwitter公式が提供しているツイートテキストの解析用ライブラリです。
前述した面倒なTwitterの文字数カウントはtwitter-text使用すれば概ね解決できます。(リンク周りで少し不具合があるみたいです。[参考](https://gist.github.com/unachang113/7bdbc5f0821f556eb23ecc39c14dc21c))

ありがとうTwitter…🙏

# サンプル
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="jOvOBgL" data-user="mermaid1112" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mermaid1112/pen/jOvOBgL">
  TypeScript + twitter-textでTwitterの文字数カウントを行うサンプル</a> by una* (<a href="https://codepen.io/mermaid1112">@mermaid1112</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

gist: https://gist.github.com/unachang113/7bdbc5f0821f556eb23ecc39c14dc21c

こんな感じで動作します
![サンプル.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20575/99155382-5d59-bba6-5536-d1d1cdda7199.gif)

# 1. 準備

yarn(もしくはnpm)でpackageをインストールします
```
yarn add twitter-text
```

# 2. 実装してみる
```typescript
import twitterText from 'twitter-text';

/**
 * tweetの文字数をカウントする
 * @param {string} text 文字数を確認したいテキスト
 * @return number 140文字換算でのツイートの文字数
 */
const tweetCount = (text: string):number => {
	const parsedTweet = twitterText.parseTweet(text);
	
	// 280文字換算で文字数が返却されるので140文字換算にする場合2で割る
	return parsedTweet.weightedLength / 2;
};
```

Twitterのテキストのパースには `parseTweet` を使用します。
`parseTweet`で取得できる要素は以下です。

> weightedLength: Twitterのテキスト数の解析アルゴリズムで計算した重み付けされた文字数を示す整数
permillage: ツイート可能な最大の重み付けされたテキスト文字数に対しての現在の重み付けされた文字数をの比率を整数値で表したもの
valid: テキストがツイート可能か否か
dispayRangeStart: ツイート文字列の開始インデックスを表す整数値
displayRangeEnd: ツイート文字列の終了位置を示す整数(範囲に含まれる)
validDisplayRangeStart: ツイート文字列の有効な開始位置を示す整数値
validDisplayRangeEnd: 有効なツイート文字列の終了インデックスを示す整数。displayRangeEnd よりも小さい値を指定することができる。
> 

今回はテキストの文字数が知りたいので`weightedLength` の値を取得します。
また、`weightedLength`は280文字換算で重み付けした文字数を返却するため、
日本語でのツイート可能な文字数(140文字換算)として表現したい場合、
`weightedLength`の値を2で割ればOKです。

```tsx
return parsedTweet.weightedLength / 2;
```

# 参考
[https://www.memory-lovers.blog/entry/2019/12/26/070000](https://www.memory-lovers.blog/entry/2019/12/26/070000)
[https://qiita.com/PND/items/17e87b8839c9099d2e70](https://qiita.com/PND/items/17e87b8839c9099d2e70#twitter-text-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)
GCP PCS合格記(2023/2/15投稿)

# はじめに
この度GCP認定のGoogle Cloud Certified - Professional Cloud Securityを受験してきましたので、勉強した内容と受験した感想を書いておきます。

# 前提
* Google Cloudはほぼ触ったことなし
* AWSの実務経験あり
* Azureの認定もいくつか取っています
* AWS認定は全て取っています(詳細は[こちら](https://qiita.com/handy-dd18/items/d21d914bf1c475d777f2))
    * [SAP on AWS認定](https://qiita.com/handy-dd18/items/18e8a856906f97bbb964)も取ってます

# 参考URL
この方の記事が非常に参考になりました。ありがとうございます。
https://zenn.dev/cloud_ace/articles/howtoget-certified-se-202211

# 学習内容
今回は以下の順番で勉強を進めました。
[前々回](https://qiita.com/handy-dd18/items/46c21bed41405fdfe5ec)や[前回](https://qiita.com/handy-dd18/items/4e2d60db1f68a1f5c5d7)とほぼ同じでした。

* ①書籍([GCPの教科書](https://www.amazon.co.jp/dp/B07S1LG1Y1/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1))
* ②[公式模擬問題](https://cloud.google.com/certification/cloud-security-engineer?hl=ja)
* ③練習問題([Udemy](https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/?utm_source=aff-campaign&LSNPUBID=M*j*hKkY1io&utm_medium=udemyads&ranMID=47984&ranSiteID=M.j.hKkY1io-Xk1J5VyOBEf_kAWcGVokbQ))

## 書籍
今回は最初に[前回](https://qiita.com/handy-dd18/items/4e2d60db1f68a1f5c5d7)からあまり期間が空いていなかったということもあり、[GCPの教科書](https://www.amazon.co.jp/dp/B07S1LG1Y1/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)の中でもセキュリティやネットワークに関係するサービスについて学習することに注力しました。
ただ、この本は内容的に特定サービスをそこまで詳細に書いてはいなかったのもあって、次の模擬問題と解説の公式ドキュメントのほうが役に立ちました。

## 公式模擬問題
次はPCA試験の時と同じように公式の[模擬問題](https://cloud.google.com/certification/cloud-security-engineer?hl=ja)を解いてどのような問題が出題されるのかを把握しました。
この時点では正解する問題はあまり多くはなかったのですが、解答後の解説を読むのに加えて解説に貼っている参考の公式ドキュメントのページも一通り読んで、問題の正答とその理由が答えられるようになるまで繰り返し問題を解くとサービスや機能特徴がわかってきて良かったです。

## 練習問題
模擬問題の内容がわかるようになったあとはUdemyで公開されている[練習問題](https://www.udemy.com/share/107Kkq3@l6wL9Bj6xnw4u59BYATa-Vc2TZhYKLEBnX6uLfI8qmlkJz9MJrB971Tew5kezRsE/)を購入して勉強しました。

50問×3セットあったので、試験前日と当日で4時間かけて2セット解いて解説を読み込むところまで実施しましたが、この練習問題を解いた限りだとIAMやネットワークに関連するセキュリティの知識や脆弱性に対処するサービス・機能への理解、認証情報や鍵の管理方法について多く問われている印象でした。

尚、PCAもそうですがUdemyの問題は基本英語で出されるので、DeepLのChrome拡張を使用してページ翻訳をかけて解くようにしています。
日本語のコースがほとんどないということもありますが、DeepLの翻訳でも十分に意味はわかるので特段困りませんでした。
(わかりづらい日本語という意味では本番試験の良い予行練習になりました笑)

# 受験した感想
今回もまずは全問回答することを優先して、回答が不安な問題にはフラグつけて、残り時間が10分前になるまで時間をかけて解きました。
個人的には想定したよりも難しかったですが、じっくり問題文を読み直すと解けた問題もあったので、最後まであきらめないほうが良いと思います。

# 受験結果
無事に合格することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/266a747b-faf0-ce1f-948c-e4f2dc269ee6.png)

# おわりに
今回の試験は出題範囲がセキュリティ関連ということもあって、セキュリティ的にどの選択肢を選んだほうが良いかという観点で問題を読むと解けた問題もいくつかありました。(当然Google Cloudのサービスや機能の概要がわかること前提ですが)
その際にはAWS認定SCSで学んだ観点も役に立っていたので、そちらの試験を持ってる方でGoogle Cloud認定に興味ある方は受験してみてもよいかもしれません。

次も同じくGoogle Cloud認定のProfessional Data Engineer試験を受験予定です。
流石に機械学習系のサービスあるとキツイかなぁと思ってたり。

この記事がどなたかの参考になれば幸いです。
【Java基礎】if構文-3

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、値が正であればpositiveと表示するプログラムを作成しなさい。ただし0は正に含まないものとする。


# コード
```Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        if(t > 0){
            System.out.println("positive");
        }
    }
}

```

↓「８」と入力

# 結果
```
positive
```
Lappinna技術部始動！

# 初めに！
皆さん始めまして！Lapinna技術部のしゃちょ～（仮）です！
このアカウントについての説明をさせていただきます！
（やるとは言っていない）

![1_hokkaidou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163792/9380c14f-17fd-3110-bf6c-46e3f7d62c65.png)

※上記イラストに深い意味はありません。よろしくお願いいたします。

## 記事概要
このアカウントは、初心者向けの記事を投稿するアカウントとなっております。
現職でIT企業に勤めているプロのエンジニアが中心となって記事を上げていく予定となっております！（頑張ってね！

# 投稿予定
## AI関係（機械学習・深層学習/ニューラルネットワーク）
・[AI技術をを使ってキャラの画像をラフ画に戻してみた。](https://qiita.com/Lapinna/items/b86dca385c734ce489c6)
・[最近話題のAI(人工知能)についての根本的な基礎知識についてまとめたかった。](https://qiita.com/Lapinna/items/f0e477f2babebe271cba)
・[各データ分析手法の特徴を備忘録的にまとめる。](https://qiita.com/Lapinna/items/8f6fc01267319317a726)
・[ニューラルネットワークとは](https://qiita.com/Lapinna/items/f530ba90a9431598ac87)
・[AI・機械学習でよく使うアルゴリズムメモ。-- 回帰分析 --](https://qiita.com/Lapinna/items/b3227990dc2d7acb8255)
・[実際にニューラルネットワークを組んでみた](https://qiita.com/Lapinna/items/d93620fd71dd5f95c7e9)
・[AI・機械学習でよく使うアルゴリズムメモ。-- 決定木分析 --](https://qiita.com/Lapinna/items/6fbea3d43d55bd7f9a33)
・[損失関数ってなぁに?](https://qiita.com/Lapinna/items/152c75f43682e72ae225)
・[AIを調べるとよく出てくる最適化関数とは何ぞ？](https://qiita.com/Lapinna/items/d5c331b74c99767ca04a)
・[k近傍法（k-NN）メモ](https://qiita.com/Lapinna/items/64853ed1e31ba8ca9cc7)
・[活性化関数って何？](https://qiita.com/Lapinna/items/de0fb85121186a83e1f3)

## WEB開発（PHP/Laravel・HTML・CSS・JS）
・プロのエンジニアが初心者のためのWEBページ作成指導書作ってみた（仮）


## ゲーム関係（Unity）
・Unityでインベーダーゲーム作れるようになるまで頑張ってみた（仮）

# さいごに
ご要望等ありましたら気軽に連絡ください！
プロのエンジニアが暇を見つけて更新しますのでよろしくお願いいたします。
AWS IAM関連リソースをCLIでつくってみた。

AWSともっと仲良くなるためにAWSリソースをCLIで作成できるように練習してみる。
何かやだなーってところは適当にマスクする。

参考：[AWS CLI Command Reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html)

今回はIAM周りの設定から。

## とりあえずヘルプ
必要なコマンドを探すためヘルプを表示
```bash
$ aws iam help
```
無駄に名前だけいっぱい出てきた。。リファレンス見た方がよい。

## IAMユーザの作成
それっぽいコマンドがあったのでたたいてみる。
```bash
$ aws iam create-user test-user

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws.exe: error: the following arguments are required: --user-name
```
怒られた…もう一度再挑戦
```bash
$ aws iam create-user --user-name test-user
```
無事作成完了

## access-keyの発行
それっぽくアクセスキーも発行してみる。
```bash
$ aws iam create-access-key --user-name test-user
```
おー！作成できた。

## IAMポリシーの作成
ポリシーの作成にも挑戦

え、ちょっと待って。
引数どーすんの？って時はリファレンスを確認。

読み込ませるjsonファイルはこちら(IAMReadOnlyAccessをコピー)
```bash
vi policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:GenerateCredentialReport",
                "iam:GenerateServiceLastAccessedDetails",
                "iam:Get*",
                "iam:List*",
                "iam:SimulateCustomPolicy",
                "iam:SimulatePrincipalPolicy"
            ],
            "Resource": "*"
        }
    ]
}
```

ポリシーを作成
```bash
$ aws iam create-policy --policy-name test-user --policy-document file://policy.json
```

作成したポリシーをアタッチする。
```bash
$ aws iam attach-user-policy --user-name test-user --policy-arn arn:aws:iam::************:policy/test-user
```
アタッチされたポリシーの確認
```bash
$ aws iam list-attached-user-policies --user-name test-user
```
あんがい出来るやん。

## 後始末
アクセスキーID確認
```bash
$ aws iam list-access-keys --user-name test-user
```

アクセスキー削除
⇒ 違うユーザから削除する場合は`--user-name`が必要みたい。
```bash
$ aws iam delete-access-key --user-name test-user --access-key-id *************
```

ポリシーのデタッチ
```bash
$ aws iam detach-user-policy --user-name test-user --policy-arn arn:aws:iam::************:policy/test-user
```

ユーザ削除
```bash
$ aws iam delete-user --user-name test-user
```

ポリシーの検索
```bash
$ aws iam list-policies --query 'Policies[?PolicyName==`test-user`]'
```

ポリシーの削除
```bash
aws iam delete-policy --policy-arn arn:aws:iam::************:policy/test-user
```

## 感想
* 思ったより簡単だった
* 情報出力の際は`--query`がだいぶ役に立つっポイ
* shellscript活用すればだいぶ業務圧縮できるんでないの？
* Jenkinsとかと組み合わせるとすっごい活躍してくれそう

めちゃめちゃ便利だったので、今後もっと極めていきたいと思います。
無料で使えるPlanioが使いやすくて良かった話

・無料で使えるPlanioが使いやすくて良かった話


https://plan.io/ja/

使い始めたばかりだけど
無料版では1プロジェクトしか使えないため
おすすめのチケット設定を載せておく。
この設定にしておけばカテゴリごとにドロップダウンリスト？
が作成されるため便利

![チケット - Sirona Planio - Google Chrome 2023_02_15 20_05_14 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236029/b8978ab5-af3c-504f-053c-5b37105ebea5.png)

無料で使うためにはブロンズ会員に変更しておく必要があるので、
やり方を紹介してくれているurlも載せておきます。

https://planio.farend.jp/contents/free/