OmniAICreator/Qiita-1.07M huggingface dataset:
でえたべえすのおべんきょうをするときのしりょう（前座）

## これはなんですか
データストアとしてデータベースを(DB)採用するよ　って決断したり言われたりしたときの考えることや所作についてざっくり記載、勉強会の資料。
まずは前座として概要から。

言語やフレームワーク固有の事情はよくわからないので詳しく書かないが、どう振る舞うべきかは書こうと思います。

本文章の対象としては開発やっててDBを使ったことがある/これから使おうとしている人向けです。

## データベースとはなにか
https://www.weblio.jp/content/DBMS
（ちゃんと開いて読み合わせる）

**有り体に言えば箱。**

一定の機能と規則を備えたデータの収容の方法で、かなり昔からあり、２０２２年現在でもっとも枯れたデータの収容方法だと思います。
また、豊富なサンプルや情報があり、なんとなく使っている開発者、過去プロジェクトが多いため惰性で採用されることが最も多いデータストアでもあります。

その他のものだとNoSQL系やKvSといった仕組みがあります。それぞれに利点があるので、興味があったら調べてください。
それぞれにメリット・デメリットがあります。

## どんなときに使うのか
正しくはどのような要件が出たときに使うものかを下記に整理する。

1. 保存するデータについて強い関連性（リレーション）がほしい
1. 一度に複数のデータモデルを確実に更新したい
1. データの一意性を担保したい
1. 使うフレームワークの事情がある

上記のうちいくつかあてはまるものがあれば採用すればよろしいと思います。

なお、下記の用語をめんどくさいので一括して`データベース`と呼称しているか、混同していることがあります。
下記の通り使い分けるのが正しいと思います。

RDB: リレーショナル・データベース。概念、規格としてのデータベース。
RDBMS: リレーショナルデータベースマネジメントシステム。RDBを管理する仕組みをまるっと一式を製品？としてまとめたもの。MySQLやPostgreSQLといった製品名を言った場合はこちらをさします。

しかしながら稀にリレーショナルじゃないけどRDBMS上に構築された不思議なテーブルの群れがあるので、そういうのはだいたい何かしら業界の闇みたいなものがあると思いましょう。（勉強会ではしゃべるけどここには書けない内容ですのでコレ書いた人がしゃべることを話半分で聞いてください）

## プロジェクト黎明期

### DBとフレームワークの選定

私の独断と偏見に基づく所感としてそれぞれのRDBMSについて述べる。

1. MySQL もっとも無難な選択でおそらく一番使われているRDBMS。機能はベーシックなものが多く、凝ったクエリを書くときは注意が必要。
1. PostgreSQL 何も考えずに楽したいとき向けDB。機能としてはかなり変態なところまで至っており、MySQLで速度改善のためにSQLを書き換えなければならないときでも何事もなかったかのように最適なプランを使用しクエリを処理する。プランナーが変態で超優秀。ところでストアドにshが使えるって何なんでしょうか・・
1. Oracle かつての王者　２０１０年くらいまではブイブイ言ってた頃の銀河帝国（スター・ウォーズ）や、ヤン・ウェンリーが生きてた頃のイゼルローン革命政府軍、７万光年ふっ飛ばされても戻ってくる悪魔のような艦長（後に提督に昇進し３１世紀でもその乗艦だった船の名前は継がれている）、キョンと遭遇してからのハルヒ、八九寺真宵見つけたときの阿良々木先輩くらい勢いがあったと思う。今もフレームワークの制約で使うことが多かったりする。上記２つがタダなのに対して有料のライセンスが必要であり高い。さすがに今どきOracleじゃなきゃ駄目って言ってる偉い人は居ない・・と信じたいけど信じられないことなんかたくさんあって、やんどころなき事情や政治的な都合により以下省略。
1. SQLServer オフィスの中でWindowsしか勝たんと思っているところでは選択肢にあがる。Accessと連携したりもできるんだっけか。なんらかの事情でマイクロソフト社に魂を売り渡した場合に利用することが多く、MacやLinux上でなにかするときに使うことはあまりない。

最近ではAWSのRDS(Aurora)や、GCP Cloud SQLやAzureなどの managed なサービスを利用することがほとんどで、その中の選択肢からチョイスする形になる。

クラウドではなくオンプレミス（以下オンプレ）な環境で物理マシンにOracleやMySQLのクラスター組んだりしているものもあるが、最近は稀である。

これらの箱としての構築や設定については今は触れないけれど、だいたいインフラ屋さんなどが正しく設定してくれるものとする、ここに踏み込みたい人はインフラ道を歩いてください。

具体的に候補として上がりそうな例としては MySQL, PostgreSQL あたりでしょうか。

さて、次回はプロジェクトがスタートして開発していく上でのお話になります。

続く。
CTF関連のリンク集

## はじめに
CTFに関連して、初心者の自分が個人的に役立つなとか面白いなと思った記事や本、ツールを雑多にまとめていきます。

## Crypto

- 暗号技術入門: 秘密の国のアリス　結城浩
易しく書かれているので最初に読むのにおすすめな本。

- [クラウドを支えるこれからの暗号技術](https://herumi.github.io/ango/)　光成滋生
より発展的な内容を扱っている。リンクからpdfで読める。

- [RSA暗号運用でやってはいけない n のこと](https://www.slideshare.net/sonickun/rsa-n-ssmjp)　sonickun
RSAが脆弱にならないようにするためには使われる数値に様々な制約があるという話。

- [暗号文のままで計算しよう -準同型暗号入門-](https://www.slideshare.net/herumi/ss-59758244)　光成滋生
暗号化したまま和や積の計算ができる準同型暗号というえらい暗号の話。特に和と積の両方の演算が可能な完全準同型暗号のお気持ちが書かれている。

- [CTF Crypto - A painter and a black cat](https://raintrees.net/projects/a-painter-and-a-black-cat/wiki/CTF_Crypto)
CTF Cryptoを解くのに使えそうな情報がまとまっている。

- [CyberChef](https://gchq.github.io/CyberChef/)
様々なデータフォーマット変換や暗号化/復号化ができる便利ツール。

- [CyberChef 超入門 (例題付き)](https://am7cinnamon.hatenablog.com/entry/introduction-to-cyberchef)
CyberChefを使って簡単な例題が解けて楽しい。

## Forensics
- binwalk
埋め込まれたファイルを調べるのに使うコマンド

- [hexed.it](https://hexed.it/)
オンラインのバイナリエディタ

- [png画像のバイナリを確認 - わくわくBank](https://www.wakuwakubank.com/posts/741-it-png-image-binary/)
pngのチャンク構造の確認。IFFから派生したファイルフォーマットは結構多い。

- [Forensics入門（CTF）](https://qiita.com/knqyf263/items/6ebf06e27be7c48aab2e)
CTF Forensicsを解くのに使えそうな情報がまとまっている。

- [CTFにおけるステガノグラフィ入門とまとめ](https://blog.hamayanhamayan.com/entry/2022/12/14/234257)
ステガノグラフィ問題の解き方がまとまっている。

- [Aperi'Solve](https://www.aperisolve.com/)
strings, exiftool, binwalk, steghide等々、画像のステガノグラフィ問題で調べるべきことを一通り調べてくれる。画像のステガノグラフィ問題がでたらとりあえず投げる。

## pwn
- pwntools
pwnに使われるPythonのライブラリで、接続先への入力などに用いる。

- [Pwntoolsの機能と使い方まとめ【日本語】#CTF #Pwn](https://qiita.com/8ayac/items/12a3523394080e56ad5a)
上記のpwntoolsの使い方がまとまっている。

- gdb + peda + pwngdb
アセンブリ言語を行ごとに実行したり、メモリやスタックの状態を観察するために用いる。gdbのみだと見にくいので、pedaやpwngdbといった拡張を入れるとよい。[pwngdb](https://github.com/scwuaptx/Pwngdb)は.gdbinitを用意する必要がある。

- セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方- 
/ 詳解セキュリティコンテスト CTFで学ぶ脆弱性攻略の技術
界隈で有名な本らしいが読んでないのでわからず。

## Reversing
- Ghidra
リバースエンジニアリングツール

## Web
- 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版　徳丸浩
徳丸本。Webセキュリティについて網羅的にまとまっている。

- Real World HTTP 第2版 ―歴史とコードに学ぶインターネットとウェブ技術　渋川 よしき
Web関連のことは大学で教わらなかったので、知識を補完するために読んでいる。

## ペネトレーション
- [Hack The Box](https://www.hackthebox.com/) , [Try Hack Me](https://tryhackme.com/)
ペネトレーションに必要な知識やスキルを、実際に手を動かして学習できる。TryHackMeの方が初心者向け。
- [ペネトレーションテスト入門](https://qiita.com/melonattacker/items/caf5de3071db1ae10367)
ペネトレーションを行う際のポートスキャンから権限昇格までの一連の流れを把握できる。
- [GTFOBins](https://gtfobins.github.io/)
権限昇格の手法がまとまったサイト
SAP on Oracleの統計情報更新

しばらくOracleやっていませんが、久しぶりに質問を受けたので。
SAP on Oracleの場合、brtoolが提供されているので、それを使う。

R3loadでのExport前や、クライアントコピーするときは統計を取ってあげる。
>brconnect -u / -c -f stats -t system_stats
>brconnect -u / -c -f stats -t oradict_stats
>brconnect -c -u / -f stats -t all -f collect -p 4
いつでも現実逃避できる！自分で撮影した思い出の360度VR空間に逃げる方法の作り方。

# Unityで撮影した360度画像のVR環境を自作する
自分で撮影した360度画像でVR空間を作るためのナレッジをまとめました。
これでいつでも自分が撮影した思い出の360度空間に現実逃避することが可能です！
ぜひ思い出のシーンを360度カメラで撮影し、いつでもその空間に逃げられる準備を整えてください。

## 全体像
今回実装する全体像は以下の通り
[![Image from Gyazo](https://i.gyazo.com/0e43aa951c8133736df78673d503f9bd.png)](https://gyazo.com/0e43aa951c8133736df78673d503f9bd)
① 動画を流すためのVideoPlayerObject
このObject内に、流す動画データ（360Movie）とその動画を映すスクリーン（360 Render Texture）を設定
② 360度空間を実装するためのSkyBox Material Object
このSkyBox内に先ほどの動画が描出されるスクリーン（360RenderTexture）を貼り付けることで、360Movieが流れる360空間（360SkyBox）が作成される。
③ Main Camera Objectに360度空間を貼り付ける
360空間（360SkyBox）を見るために、360SkyBoxをアタッチする。

## 環境
Unityのvaesionは、2020.3.26f1を使用

## VideoPlayerObjectの作成
まずは映し出すスクリーンであるRender Textureを作成する。
[![Image from Gyazo](https://i.gyazo.com/a9c443669c42c69455c1b68dbdfadab8.png)](https://gyazo.com/a9c443669c42c69455c1b68dbdfadab8)
Assets内にTexturesフォルダを作成し、その中にRender Texture(360RenderTexture)をCreateする。

[![Image from Gyazo](https://i.gyazo.com/d10919200f4f9560eadf0decb3efc4bf.png)](https://gyazo.com/d10919200f4f9560eadf0decb3efc4bf)
作成したRender Textureは上記の様に設定。

[![Image from Gyazo](https://i.gyazo.com/4f96d13101e03336e69bf6e20d8e16a4.png)](https://gyazo.com/4f96d13101e03336e69bf6e20d8e16a4)
次にヒエラルキー上にVideo Player　Objectを作成し、360VideoPlayerと命名。

[![Image from Gyazo](https://i.gyazo.com/62ed0080cef66f016c868ee81872c265.png)](https://gyazo.com/62ed0080cef66f016c868ee81872c265)
作成した360VideoPlayerにオリジナルの360度動画と先ほど作成した360RenderTextureをアタッチ。

## SkyBox Material Objectの作成
[![Image from Gyazo](https://i.gyazo.com/800a3147062de20f74763386b5ed83c1.png)](https://gyazo.com/800a3147062de20f74763386b5ed83c1)
Aseetes内にMaterialsフォルダを作成し、その中にMaterial(360Material)をCreateする。

[![Image from Gyazo](https://i.gyazo.com/cbf28602c1525f92deff8e1645f5c023.png)](https://gyazo.com/cbf28602c1525f92deff8e1645f5c023)
ShaderをSkybox/Panoramicに変更し、Sphericalの360RenderTextureをアタッチする。

##　　Main Camera Objectの作成
[![Image from Gyazo](https://i.gyazo.com/ab0a90b0825bab34dcc53d4d47099cb4.png)](https://gyazo.com/ab0a90b0825bab34dcc53d4d47099cb4)
ヒエラルキー上のMain CameraにSkybox ComponentをAddする。

## 実装
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自分で撮影した360度画像でVR空間をUnityで自作する実装の復習。まとめを作りながらも、1年前より10分の1ぐらいの時間で実装できた。<br>成長を実感！<a href="https://twitter.com/hashtag/Protoout?src=hash&amp;ref_src=twsrc%5Etfw">#Protoout</a><a href="https://twitter.com/hashtag/%E3%82%B8%E3%83%BC%E3%82%BA%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#ジーズアカデミー</a><a href="https://twitter.com/hashtag/%E3%82%B9%E3%82%BF%E3%82%B8%E3%82%AA%E3%81%97%E3%81%BE%E3%81%A5?src=hash&amp;ref_src=twsrc%5Etfw">#スタジオしまづ</a> <a href="https://t.co/OiZF5OgSFX">https://t.co/OiZF5OgSFX</a> <a href="https://t.co/HrfOgVNII5">pic.twitter.com/HrfOgVNII5</a></p>&mdash; Dr.Teru:プログラミングとサーフィンが好きな整形外科医 (@teru3_kitashiro) <a href="https://twitter.com/teru3_kitashiro/status/1524401975886065665?ref_src=twsrc%5Etfw">May 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

上記のような感じで、自分で撮影した360度画像でVR空間を実装できます。
SAPGUIのエントリを配信する方法

SAPGuiを配布するときに、エントリを配布するにはどうするか。
昔はsaplogon.iniを配布していたが、Gui7.40からXML形式のSAPUILandscapeGlobal.xmlになった。
このXMLファイルはデフォルトで%APPDATA%\SAP\Common以下に配置される。
つまり、C:¥Users¥<ユーザ名>以下にあるので、PCによってパスが変わるし、1つのPCでも複数ユーザがいる場合、ユーザ毎に更新しないといけない。

良い方法はないか調べたところ、
[Configuration File Provision](https://help.sap.com/docs/sap_gui_for_windows/1ebe3120fd734f67afc57b979c3e2d46/f591365de1d24fcda6165b29ce0b834a.html?locale=en-US)なるものがあった。

PullとPushがあったが、Pullのほうが簡単そう。
Webサーバorファイルサーバ上に定義ファイルを置いておけば、GUI起動時に同期をとってくれる。
エントリの変更は、サーバ上のファイル1つだけで済むので簡単。

設定方法は、下記にレジストリ:LandscapeFileOnServerとしてサーバ上のファイルパスを定義する。
>HKEY_LOCAL_MACHINE\SOFTWARE\SAP\SAPLogon\Options (32 bits)
>HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\SAP\SAPLogon\Options (64 bits)
>(REG_EXPAND_SZ)

もしくはSAPGuiのインストールサーバでパッケージ化する際にPackage Parameter:SapGui.LandscapeFileOnServerを定義する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2587098/18b42d94-2652-d100-69a1-f8b666a4b71e.png)
Chart.jsについて情報収集

Chart.jsを使うにあたって、参考になりそうな記事のリンクを貼ります。

https://www.tohoho-web.com/ex/chartjs-params.html#options

https://qiita.com/saka212/items/5714fa68deb44a185ec3#%E3%82%B0%E3%83%A9%E3%83%95%E6%9B%B4%E6%96%B0-%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7%E5%86%8D%E6%8F%8F%E7%94%BB

https://kurage.ready.jp/jhp_g/html5/chartjs.html

https://misc.0o0o.org/chartjs-doc-ja/axes/labelling.html

https://elsammit-beginnerblg.hatenablog.com/entry/2021/08/20/230209

https://se-log.blogspot.com/2019/12/javascrip-chartjs.html
NSX-T 3.2 ライブトラフィック分析 

<font color="blue">**VMware NSX-T Data Center**</font> の <font color="red">**ライブトラフィック分析**</font> の動作検証を実施しましたので、簡単にまとめます。

* 検証環境
* vCenter Server ：7.0 U3a
* NSX-T：3.2.0.1

# NSX-T 3.2 ライブトラフィック分析とは
NSX-T 3.2で追加された [ライブトラフィック分析](https://docs.vmware.com/jp/VMware-NSX-T-Data-Center/3.2/administration/GUID-6C76D8E5-0DC4-4365-B7E1-C1A5D276139F.html) 機能は、NSX-T Manager 自体が持つパケットキャプチャ機能になっています。従来まではパケットキャプチャ用の仮想マシンが別途必要でしたが、この機能を利用する事で、簡易にパケットキャプチャの取得が可能となっています。


# NSX-T 3.2 ライブトラフィック分析の実施
[プランとトラブルシューティング] より、[ライブトラフィックの分析] を選択します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/aa67e699-fd7d-dae8-e88f-40a0a1693ff3.png)
新しいセッションの作成より、下記を指定して [セッションの開始] を選択します。
* 詳細設定： パケットキャプチャを取得する時間
* トレースのサンプリング値： トレースの描画用のサンプリング値
* パケットキャプチャのサンプリング値： キャプチャ用のサンプリング値
* 送信元、宛先： キャプチャ対象を指定

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/93557e4d-d32e-0323-cdbf-30ab5a258038.png)

取得結果は、トレースフローのような画面で確認が出来、また [PCAPファイルのダウンロード] より、パケットキャプチャ結果を取得出来ます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/946f6da6-f7de-a9de-19fa-42037f26e306.png)

Wireshark にて取得データ (PCAPファイル) を確認します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/59b41e2d-3284-9ba0-82bd-e0527d638b6f.png)

指定時間内に取得したパケットと、パケットキャプチャデータを突き合わせて見る事が可能です。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/fbc62cc0-7993-d86b-0caf-11b3af3541fa.png)
FirebaseのGoogleアカウントでのログイン機能の実装とユーザー情報をSet

# 概要


今回はFirebaseのAuthenticationの中の一つのGoogleによる認証機能を設定します。認証だけ設定するというパターンはあまりないと思うので、加えてFirebaseのDatabaseにユーザー情報をセットするとこまで行きます。

Firebaseのセットアップは済んでいるものとします。

# プロバイダにGoogleを追加
まずはFirebaseのコンソールに移動して、対象のプロジェクトのAuthenticationを開きましょう。

するとログインプロバイダが設定できますので次の２ステップでFirebaseがの処理はとりあえず終了です。

①プロバイダでGoogleを選択

②プロジェクトのサポートメールに任意のgoogleアカウントを設定して保存し、有効にする


![スクリーンショット 2022-05-11 23.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2041194/5f35bca9-ed8c-f4bb-d467-3643fbfb2684.png)


#Reactでログイン時の処理を設定
　```
```
100日後くらいに個人開発するぞ！day022

## 今日もHTML＆CSS初級編を復習してみた！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/0bf8e996-dd6d-b8cc-f268-a851bddfd8f5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/165d1d94-d5e7-2282-9662-d26bc3db4f65.png)

## 今日のアウトプット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/94e1343a-ae87-0766-cab5-802b1e34c09a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/082b2bd9-dfda-8147-c1d1-4ed97d15a39b.png)
【Pega】大量Propertyの一括生成

## １　はじめに
システム開発中に大量Propertyを作成する作業がよく発生し、手動で作成するとかなり時間がかかると思う。
本記事では、PegaのWizardを経由し、Propertyを一括生成する方法を紹介する。

## ２　Property一括生成のXSDファイルを用意する
Wizardを利用する前に、XSDファイルで作成したいPropertyを定義する
※Single Page、Page Group、Page Listなど、構造が複雑なPropertyは作成できない
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/f0a65718-f483-6768-745a-470cbaf4b316.png">

## ３　WizardでPropertyを一括生成する
#### ３．１　Connector and Metadata Wizardを開く
<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/512b1200-e1df-5777-c99f-fbcc7e148884.png">

#### ３．２　Purposeを設定する
Purpose：Generate Data Mapping Rules
Metadata Type：XSD
Ruleset情報は状況におじて設定する
Base Class：Propertyの作成Class階層を設定する
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/af589fb0-cdb9-bb9c-e1d3-de45836d8695.png">

#### ３．３　Local File Nameを選択し、事前に用意したXSDファイルをアップロードする
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/0f418d71-578c-1558-487b-4d3f8ba6c05e.png">

#### ３．４　Propertyの所属Class（BulkCreateProperty）をチェックする
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/421782ed-c827-c2ce-5fd2-0d06b7c18659.png">

#### ３．５　作成するRule Typeを選択する（ClassとProperty）
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/0305b644-9d03-10fd-bbd6-8620ebc72667.png">

#### ３．６　作成するRule一覧が表示される
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/d8b159ca-c7a8-b4ad-81b4-9f3450177ac6.png">

#### ３．７　Ruleの作成結果が表示される
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/944bf36b-8882-cd1a-fbbf-9dea75ab0d0a.png">

## ５　結果確認
XSDファイルで定義したPropertyがすべて作成されたことを確認できる
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/13f7814e-8ea5-3449-8697-ac96922700f6.png">

##
#### ・Pega環境
　Pega 8.6.1


#### ・キーワード
　How create properties in bulk in Pega
Windows11でWSL2上のVivadoからUSBポートを使ってボードと通信する

**※ Vivado2022.2からWindows11がサポートされたので、現在ではわざわざwslを使う必要はあまりないと思います。**

windows11にVivadoが対応していなくて、ちょうどよいことにwslgがあるからwsl2にVivadoをインストールしたということがあった([ここに書いてます](https://qiita.com/yggnoki/items/f82064d8d9743e27221d))。ただこれだとUSBポート等の設定が一切されていなくて、合成まではできても実際のFPGAボードが使えないという悲しいことになるので、ここを何とかする方法をまとめる。

# 環境
+ Ubuntu 20.04.4 LTS 
+ Vivado 2021.2 (64-bit)
    + standard edition

Vivado本体のインストールまではすんだものとする。

# 概略
+ wsl2でホストPCのUSBポートを使えるようにするものをインストールする
+ vivadoのcable driverをインストールする
+ 実際に通信するときに（root権限で）Vivadoをおこし、Windows側でUSBポートをWSLに渡す操作をする

これをすることになる。まず準備として上2つを済ませる。

## wslからUSBポートを使う準備

Windows11で、wslにUSBデバイスをつなぐ方法を作っている人がいる。

https://devblogs.microsoft.com/commandline/connecting-usb-devices-to-wsl/

ここに開発者の方の書かれた記事としてあって、[こっち](https://docs.microsoft.com/ja-jp/windows/wsl/connect-usb)には公式からも同じ内容ででている（がんばればWindows10でもできないことはないらしい、10なら素直にWindows版Vivadoでいいやとなりそうだけど）。

#### 手順の抜粋
##### 1. Windows側で`usbipd-win`をインストールする
最新版をインストールしなさいとのこと(.msiのインストーラ)。

https://github.com/dorssel/usbipd-win/releases

##### 2. WSL側でusbipクライアントをインストールする

Ubuntuなら
```bash
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
```
だそう。

## vivadoのケーブルドライバーをインストールする

windowsでもともとVivadoを使っていると初見となるはず。

https://digilent.com/reference/programmable-logic/guides/install-cable-drivers

ここにある通り、
```shell
<Vivado Install>/data/xicom/cable_drivers/lin64/install_script/install_drivers/
```
の中にある`install_drivers`を実行する。`<Vivado Install>`にはVivadoをインストールしてある場所が入るが、インストーラのデフォルトだとおそらく`/tools/Xilinx/Vivado/2021.2/`になっている。

準備はおしまい。（一度インストール後にWSLの再起動がいる？）

# いざ通信
udevをいじればrootでなくてもよくできるらしいが、そのままだとWSLのusbipクライアントの都合でrootしかUSBポートが使えない場合がある、とのこと。実際Vivadoはそうだった模様。ということで、もしそれでもよければ、
1. PC本体のUSBポートにFPGAボードをつなぐ
1. Windows側（Powershell）で`usbipd wsl attach --busid <busid>`
1. root権限でVivadoを起こし、Hardware Managerを開いてAuto Connectする

で、無事使えるようになるはず。
2.の`<busid>`は、上の準備が全部終わってボードもUSBケーブルでつないだ後にWindows側で`usbipd wsl list`をすると表示されるUSBポートのうち、FPGAと通信するものの`BUSID`。デバイスの一覧がそのIDといっしょに表示されて、その中に`USB Serial Converter`みたいな名前があるのでおそらくすぐにわかる。

以上です。
ラズパイセットアップ2022年（新人向け）

# 内容
セットアップ方法がよくわからなくなったので2022年版としてまとめる事にした。
セットアップからSSH,リモートデスクトップ接続ができるようになるまでをまとめた。
使ったラズパイはラズパイ4。
# SSH接続するまでのセットアップ
### Raspberry Pi imagerでセットアップ
- Raspberry Pi imagerのインストール。
今回は初めてラズパイimagerを使用した。簡単にできるでのおススメ。(以下のリンクからDL)
https://www.raspberrypi.com/software/
- Raspberry Pi imager起動
起動すると以下の画面が表示される。
最初に任意のストレージを選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172184/e3604d20-de82-e093-3418-e0fdd6c46d96.png)
次にOSの選択をクリック。
- OSの選択
OSの選択をクリックすると以下のような画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172184/7e10d431-ffdc-1041-87fe-7b88d2dfd6bc.png)
    - 各OSについて
今回記事を起こそうと思った部分でもあるOSの選択肢についてざっくり解説。
https://raspida.com/debian11-release-info
上記記事などにも記載があるが2021年8月頃に新しいOSがリリースされた。
これまでのOSはBuster,新しいOSがBullseye。
しかし、imagerのOS選択にはBusterやBullseyeなんて表記はどこにもない。。。
いろいろ調べると(Legacy)と表記がある場合はBuster,そうでない場合はBullseyeとのこと。
Buster愛用者がBullseyeに移行する際はいろいろと問題があるようだ。
（raspistillコマンドで撮影できないとか、、、）
今回初めて使用する場合はBullseyeでよいと思うが、過去の記事を参照する際は、内容がBullseyeにそのまま使えるか注意した方がよい。
- 設定
SSH接続やWifi設定などなど、これらは事前にSDカード内にファイルを作成する必要があった。
（もしくはラズパイ起動後に画面を用意して設定。）
しかし、Raspberry Pi imagerでは簡単に設定が可能。
以下を参考にすれば設定できる。
http://independence-sys.net/main/?p=6530
- 書き込む
書き込むをクリックしたらお茶を飲むなり会社であれば先輩と戯れて待ちましょう。（10分ほどで完了。）
書き込んだらSDカードをラズパイに差し込み電源をぶち込んで1分ほど待ちましょう。（ラズパイ起動待ちです。）
# SSH接続の確認
Windows側で以下のコマンドを打つ。
```cmd:cmd
ssh "ユーザー名"@"ホスト名"
```
ラズパイ初期ユーザー名はpi、設定でホスト名をhogepiにしていれば、以下のように打てばよい。
```cmd:exp
ssh pi@hogepi
```
接続するとパスワードを求められるのでパスワードを入力。
これでSSH接続完了。
# リモートデスクトップ接続
### xrdpのインストール
以下記事を参考にインストール。（SSH接続で全部できる。）
https://raspi.taneyats.com/entry/install-xrdp
- 補足
今回xrdpをインストールしたのにリモートデスクトップが上手く行かなかった。
リモートデスクトップで接続すると青い画面にログイン画面が表示される。
ユーザー名とパスワードを入力すると永遠に青い画面のままだった。。。
（過去のBusterを使用していた時にはこんな事はなかったのに。。。）
対処できたので記載しておく。
以下を参考にすることで解決できた。
https://asukiaaa.blogspot.com/2022/02/raspi4b-black-screen-on-rdp.html
```cmd:cmd
sudo gpasswd -d pi video
sudo gpasswd -d pi render
sudo raspi-conofig
#System options -> Boot / Auto Login -> Desktop GUI, requiring user to login
```
raspi-config設定後は再起動を求められるので再起動。
これでリモートデスクトップ接続ができるようになった。
PHPのHeader関数とdie関数

# Header関数とは
***HTTPヘッダを送信する関数***です。
HTTPヘッダーとはリクエストとレスポンスの処理のことでこれらの要求を送信するものです。
HTTPヘッダを送信する役割があり、リダイレクト処理を行うことができます。

# header関数のLocationで別ページにリダイレクト
header関数では、「Location」というもの使ってURLを指定し、画面を遷移させます。

基本的な書き方は下の通りです。
```php
header(‘Location: 遷移先のURL’)
```

実際に使ったコードです。
```php
if (empty($_SESSION['contact-form'])) {
  header('Location: ../index.php#contact'); // Redirect back to input page if user directly access confirmation page.
  die();
}
```
Locationの後に***index.php#contactのページに遷移***するように指定してあります。


# die関数
die関数はスクリプト終了の関数です。
exit関数と同じかなと思いました。exit関数は処理を止める関数です。

# die関数とexit関数の違い
両者とも関数というより言語構造という方が正しいみたいです。
プログラムを強制終了させるという点は同じです。

両者の明確な違いは下のようになります。

⚫︎```exit　```　 
呼び出し元に指定したステータス番号(1～255)を返せる、
またはメッセージを表示することができるみたいです。

⚫︎```die```
exitとの違いは返せるのはメッセージを表示することしかできない点です。

表を貼っておきます。

![スクリーンショット 2022-05-11 22.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/eb58647d-ba34-53e9-f9ef-2f7899a029f5.png)



![スクリーンショット 2022-05-11 22.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/2c596903-1f36-b6f6-ec66-b7625b5b6def.png)

> 引用　 https://trios.pro/php-die-exit/

# 資料
https://webukatu.com/wordpress/blog/33021/#header

https://webukatu.com/wordpress/blog/25025/

https://trios.pro/php-die-exit/
【AWS】CloudWatchアラームが設定されたEC2インスタンスIDを取得する

# はじめに
この記事ではCloudWatchアラームが設定されたインスタンスIDとアラーム名をセットで出力するスクリプトを紹介します。
以前の記事ではEC2のAutoRecovery(自動復旧)を無効化するスクリプトを使用してインスタンスIDのリストを取得しましたが、CloudWatchアラームによるAutoRecoveryが設定されていないインスタンスIDも含まれてしまっています。
本当に無効化しても問題ないのか各インスタンスに対してCloudWatchアラームが設定されているか確認する必要があるのですが、膨大な数のインスタンスが存在する環境の場合、手作業での確認は非効率です。
そんな感じでリスト出力できると確認が楽になるだろうなぁと思って作成しました。

前回の記事はこちらになります。
* [【AWS】EC2のAutoRecovery(自動復旧)を無効化するスクリプトを作ってみた](https://qiita.com/itkz1016/items/0003d67791f2693f3602)
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [実行環境](#実行環境)
1. [稼働確認](#稼働確認)
1. [おわりに](#おわりに)


# 実行環境
検証用に3つのCloudWatchアラームを作成しました。
今回はCloudWatchアラーム名と、アラームに紐づいたインスタンスIDを出力するだけなのでアラームを設定するメトリクスはEC2に関するものでしたら何でも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/47f6e279-9f1d-3d86-b674-702657d15420.png)
用意した3つのアラームの詳細を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/25416b47-8c6d-8718-d5ca-12f7c46bb433.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/fa11a4e3-0ba4-0acf-fe7f-d86d2d7a0767.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/17f0102a-536f-68ec-d3eb-ad3e45f5109c.png)

# 稼働確認
以下のスクリプトをCloudShell内で実行し、リストを作成します。
リストには先ほど確認したCloudWatchアラーム名とアラームが設定されたインスタンスIDがcsv形式で出力されます。
(CloudShellに限らず、EC2内やシェルスクリプトが実行可能な環境でしたら問題ありません。)

``` Create-CloudwatchAlarm-List.sh
#!bin/bash
CloudWatchAlarmList="Alarm-List.tmp"
Output="Alarm-InstanceList.csv"

echo "AlarmName,InstanceName" > $Output
 aws cloudwatch describe-alarms --query "MetricAlarms[*].[AlarmName]" --output text >> $CloudWatchAlarmList
 cat $CloudWatchAlarmList | while read AlarmName
do
	#アラームが設定されたインスタンスIDを取得
	read InstanceName < <(aws cloudwatch describe-alarms --alarm-names $AlarmName --query "MetricAlarms[*].Dimensions[?Name=='InstanceId'].Value" --output text )
	echo "$AlarmName,$InstanceName" >> $Output 
done	

rm $CloudWatchAlarmList 

```
早速スクリプトを実行してみます。
「Alarm-InstanceList.csv」というファイルが出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/277eb48e-1fdf-1544-4eef-aa14c809887d.png)

中身を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/1bb68d11-00c7-6f91-c7f1-0ddf2103cb92.png)

作成したCloudWatchアラーム名とインスタンスIDがセットで取得できました！！


# おわりに
CloudShell内でスクリプトを実行することが多いのですが、動きがもっさりしてて重いなぁって思ってます
インスタンス数が非常に多く、リスト作成に時間がかかりそうな場合はスペックが少し高めのEC2内で実行したほうがいいかもしれません。※未検証なので間違ってたらすみません。スクリプトを修正してループを減らすとか内部の実行回数減らすとかしたほうが早いと思いますが。。。

CLIを使ったJsonの取得記事ばっか書いてますが、まだまだqueryをうまく使いこなせていないので頑張って上達します。。。
【新卒SE】Java入門　～Singleton(シングルトン)とはなんぞや～

　今日、研修でJavaの問題演習に取り組んでいた際に初めて知った概念？で、正直まだ理解が曖昧ですが、後学のために間違っていても良いので現状の考えを残そうと思い、アウトプットします（間違ってたら教えてくださいm(__)m）。

## シングルトンとは
一言でいうと、
**「１つのクラスからは1つのオブジェクト（インスタンス）しか作れないよ～」**
ってことです。
通常、クラスから複数のオブジェクトを生成できると思います。例えば、以下の図のように
「Car クラス→TESLA・TOYOTA・BMW」と言ったように、複数のオブジェクトを通常は生成できます。
しかし、シングルトンの場合は、オブジェクトの生成の処理が一度しか行われないため、下図のようの1つのオブジェクトしか生成されません。なので、「このクラスからはオブジェクトを一つしか作りたくない！」というような時にシングルトンを使用します。
![スクリーンショット 2022-05-11 21.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658045/0664afc5-ec71-d97d-fa7f-160e9c66bc17.png)

## 実際に見てみる
obj1とobj2のメソッドの呼び出しで得られたオブジェクト（インスタンス）が同一のものである事を確かめます。
```Singleton.java

public class Singleton {
  
    public static Singleton singleton; // singleton = null
    private int num;
    
    // ①メンバ変数numにアクセスするためのセッター
    public void setNum(int num) {
        this.num = num;
    }

    public static Singleton getSingleton(){
        if (singleton == null){
　　　　　　　　// singletonがnullであればオブジェクト生成
            singleton = new Singleton();　
            return singleton;
        }
        return singleton;
    }
    // ②メンバ変数numにアクセスするためのゲッター
    public int getNum(){
        return num;
    }
}
```
以下、実行ファイル。
```StartUp.java

public class StartUp {

	public static void main(String[] args) {
		// メンバ変数の値を確認する。
        // ③Singleton型の変数obj1にsingletonオブジェクトでgetSingletonメソッドを呼び出す
		Singleton obj1 = Singleton.getSingleton(); 
		System.out.println("getSingleton()メソッド呼び出し（1回目）");
		System.out.println("numの値："+obj1.getNum()); 

		// メンバ変数の値を確認する（変更後）。
		int num = 10;
		obj1.setNum(num); // ①に移動
		System.out.println("numの値："+obj1.getNum()); // ②で実行された結果を返す

		// メンバ変数の値を確認する（オブジェクトの共有）
		System.out.println("getSingleton()メソッド呼び出し（2回目）");

        // Singleton型のsingletonTest変数に同じく③で使用したsingletonオブジェクトでgetSingletonメソッドを呼び出す
		Singleton obj2 = Singleton.getSingleton();
		System.out.println("numの値："+obj2.getNum()); 
	}

}
```
実行結果
```
getSingleton()メソッド呼び出し（1回目）
numの値：0
numの値:10 // obj1
getSingleton()メソッド呼び出し（2回目）
numの値:10 // obj2
```
このように、obj1とobj2で得たオブジェクトが同じ結果（10）を表しているので同一のものであると分かります。

## 疑問点
Singletonに関して、調べているとどうやら、
・privateなコンストラクタを定義する必要がある
・生成したオブジェクト（インスタンス）はprivateのstatic変数に保存される
のようなルールがあるようですが、上記のコードではそれを守れていません。でもこれでもSingletonとして機能している気がするのですが、まだまだ勉強が必要です。。。またちゃんと分かり次第修正を加えていこうと思います。
マウントポイントを検出する方法

inode 番号が 1になることを利用して下記のコマンドを実行すればマウントポイントとなっているディレクトリを検出できる。
（このディレクトリの下には別のファイルシステムがマウントされていることになる）
```
find / -inum 1 -type d
```
Linuxコマンドで使う記号

Linuxのコマンドを使う際によく大なり記号（`>`）や小なり記号（`<`）、パイプ（`|`）が出てくるけどこれってなんだ？

# コマンドを連結するパイプ（`|`）

役割：**`|`の前にあるコマンドの出力を、`|`の後にあるコマンドの入力とする**

```
$ echo "hello world"
hello world
```

（`echo`は入力したものをそのまま出力してくれるコマンド）

ここでは"hello world"と打って画面に標準出力しました（`$`マークはコマンドプロンプトです）。

その結果を`rev`コマンドの標準入力として実行したのが次です：

```
$ echo "hello world" | rev
dlrow olleh
```

（`rev`は入力した文字列を逆さまにして返すコマンド）

つまり上の例では **`echo`コマンドの出力を直接`rev`コマンドに入力したということ**です。

ちなみに、パイプは複数個繋げることが出来ます。

# `>`を使ってファイルに出力する

役割：コマンドの実行結果を指定のファイルへ直接出力してくれる

```
$ echo "hello world" > result.txt
```

このように実行すると、result.txtに「hello world」が書き込まれます。

続けて、

```
$ echo "holy shit" > result.txt
```

と実行すると、result.txtに「holy shit」が**上書き**されます。すなわち先に書き込んだ「hello world」は消えてしまいます。

**追記**をするには`>`の代わりに`>>`を使います。

```
$ echo "hello world" > result.txt
$ echo "holy shit" >> result.txt
```

このように実行すれば、result.txtには「hello world」と「holy shit」の両方が書き込まれます。

# `>`と`|`の合わせ技

```
command1 < file.txt | command2
```

これは、file.txtの内容を`command1`への入力とし、そして`command1`の出力を`command2`の入力とするという意味。

# 大なり記号と数字

（ここからは応用です）

「標準入力」・「標準出力」・「標準エラー出力」にはそれぞれ次のように番号が割り振られています。

|意味|番号|
|:-:|:-:|
|標準入力|0|
|標準出力|1|
|標準エラー出力|2|


そして、大なり記号`>`は、実は`1>`のように数字の"1"が省略されています。

同様にして`2>`も使えるんです。

つまり

```
$ command 2> error.txt
```

とすると、`command`を実行した際に表示されたエラーの内容が、error.txtに出力されます。

以下は、存在しないコマンド`kjfklsajf`を実行した例です：

```
$ kjfklsajf
zsh: command not found: kjfklsajf

$ kjfklsajf 2> error.txt

$
```

一回目の実行では「zsh: command not found: kjfklsajf」とエラーである旨が表示されました。しかし、二回目ではそのエラーを`2>`を使ってerror.txtに出力したため、結果的にerror.txtに「zsh: command not found: kjfklsajf」が書き込まれました。

また、エラー出力を追記するなら`2>>`を使えばよいということです。

# 標準出力と標準エラー出力を同じファイルへ

```
command > file.txt 2>&1
```

これは「file.txtに標準出力と標準エラー出力を書き込む」という意味です。

末尾にある`2>&1`より、**標準エラー出力先は、現在の標準出力先、つまりfile.txt**ということです。

標準出力と標準エラー出力を同じファイルに書き込みたい場合は特別な記法があり

```
command &> file.txt
```

と実行すれば実現できます。


# （追記）引数を表す変数

|変数名|説明|
|:-:|:-:|
|$0|0番目の引数（ファイル名）|
|$1|1番目の引数|
|$2|2番目の引数（2番目以降も同様）|
|$#|引数の個数(ファイル名はカウントされない)|
|$@|すべての引数(スペース区切り)|
|$*|すべての引数(区切りは環境変数`IFS`で指定されてるもの)|
|$?|直前のコマンドの終了ステータス|
[python]関数


# 関数の定義と呼び出し方

関数を定義するためには最初の行にdef文
def文につづくコードブロックが関数の内容
定義しただけでは実行されない、定義した関数を実行する必要がある
```
def 関数名():
    コードブロック
```
関数を呼び出す際に()内にパラメータを定義でき、変数を設定できる。
これを利用して関数に引数を渡すことができる

```Python
def hoge(num):
    print((num)) 
hoge(2)
```


# return文について
関数呼び出しによって得られる値を指定できる
これによって処理によって出力が変わる場合などを制御できる

# None値について
値がないことを示す
returnで値を指定しない場合などNoneが返る
[atom] Prettier-atom failed: Couldn't resolve parser 'postcss' は prettier-stylelint が原因だった

# はじめに

`prettier-atom` を `0.60.1` にしたら `Prettier-atom failed: Couldn't resolve parser 'postcss'` というエラーが表示されるようになりました。

# 原因は`prettier-stylelint`

`prettier@2.0.4` 以降でパーサーの名前が変わったのですが、 `prettier-stylelint` の開発がほぼストップしていて対応出来ないのが原因です。

# 対処法

下記のサイトによるとパッチを当てることで解決できるそうですが、単純に１行書き換えるだけで対応できます。

https://shimu.dev/blog/post/prettier-stylelint-error-couldnt-resolve-parser-postcss/

`~/.atom/packages/prettier-atom/node_modules/prettier-stylelint/src/index.js` を書き換えます。
失敗しても戻せるようにオリジナルを複製しておいてください。

```diff:index.js
-    prettierOptions.parser = 'postcss';
+    prettierOptions.parser = 'css';
    debug('prettier %O', prettierOptions);
    debug('linter %O', stylelintConfig);
```

63行目に `postcss` を指定した場所があります。ここを `css` に書き換えるだけです。
【初心者向け】Tera Termのおすすめショートカット

**はじめに**
---
前回のおすすめ設定以外にもショートカットなどを教える機会があったため
Tera Termを初めて触る方向けに、おすすめのショートカットを紹介したいと思います。


***おすすめショートカット***
---
・ログ取得の開始＆終了
・コピー
・貼り付け(ペースト)
・新規セッションの開始
・セッションの複製

|  目的 |  ショートカットキー  |
| ---- | ---- |
|ログ取得の開始  |Alt + F →　L  |
| ログ取得の終了  | Alt + F →　Q  |
|コピー  |  Alt + C  |
|  貼り付け(ペースト)  |  Alt + V  |
|新規セッションの開始|  Alt + N  |
| セッションの複製 |  Alt + D  |


***ログ取得の開始＆終了***
---
自動ログ取得とは違い、手動でログ取得を開始、終了するショートカットについて説明します。

ログ取得の開始は `Alt + F` の後に`L`を続けて入力します
また、ログの終了は`Alt + F` の後に`Q`を続けて入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/03759dce-5e4e-3dc3-f0c0-840531f7e076.png)

これは`Alt + F`でファイルタブを選択し、その後に「ログ」や「ログを終了」を選択しています。

また、「ログを終了」がファイルタブの中にない場合は、下記手順でショートカットを実現できます。
`Alt + F`の後に`W`そして、`Enter`で「閉じる」を選択することでログを終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/46251ffd-2f84-eb31-75c4-7aa9f19ffc91.png)

ログ取得の開始＆終了のショートカットの説明は以上です。

***コピー***
---
文字列を選択後に`Alt + C`でコピーが可能です。
また、コピーはTeraTermの「その他設定」の「コピー＆貼り付け」でカスタマイズが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/66b5474d-0680-1c6f-37b3-0076261dc2fb.png)

上記の「継続行コピーを有効にする」を有効にすることで、マウスで文字列を選択することでクリップボードへのコピーが可能になります。
これはデフォルトで有効になっています。

コピーについての説明は以上です。

***貼り付け(ペースト)***
---
クリップボードにコピーがある状態で`Alt + V`を押すことで貼り付けが可能です。
また、貼り付けもTeraTermの「その他設定」の「コピー＆貼り付け」にてカスタマイズが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/66b5474d-0680-1c6f-37b3-0076261dc2fb.png)

上記の「右クリックでの貼り付けを無効にする」を無効にすることで、右クリックを1回することでも貼り付けが可能です。
これはデフォルトで無効になっています。

貼り付け(ペースト)についての説明は以上です。

***新規セッションの開始***
`Alt + N`で新規接続の開始画面を表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/3a84678b-9a4d-ef00-a9d1-36d4b3bdaa04.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/117c1542-a3c9-68f0-8de6-16d5874db489.png)

ショートカットの存在を知るまで、ファイルタブからマウスで選択していましたが、これでワンクリックで新規接続を開始することができ、
かなり作業の効率化や小さなストレスから解放されました。

次のセッションの複製も含めて、使いこなすことで作業のスピードは一気に上がるかと思います。

新規セッションの開始についての説明は以上です。

***セッションの複製***
---
セッションの複製は`Alt + D`で可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/16cc51aa-6c6b-ff68-3359-7929049dcdfc.png)
セッションの複製のため現在接続している環境に別窓で接続します。

セッションの複製は環境に接続するところまでは自動で進みますので、新規接続のように「ホスト」や「サービス」を選択する必要がありません。
また、Telnetの場合は接続後に「ユーザーID」と「パスワード」を求められますが、SSHでは接続前に「ユーザーID」と「パスワード」を入力します。
そのためSSHで接続している場合、「ユーザーID」と「パスワード」を入力せずに環境に接続が可能です。

セッションの複製についての説明は以上です。


***最後に***
---
TeraTermにも多くのショートカットが存在しています。
私自身それら全てを使いこなせているわけではないですが、よく使うものだけでも覚えておくと格段に作業の効率が上がるかと思います。
また、ほかのショートカットを知りたいという方は「ヘルプ」タブの「目次」をクリックし、「使い方」→「ショートカット」の順でTeraTermのショートカット一覧を確認できますので是非見てください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/f181b586-f4b4-f0de-94c3-50594cef29f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/9d6df3f9-8cf8-dfca-be5b-0a2cbecfc667.png)

今後、TeraTermにたくさん触れる方の参考になれば幸いです。
Learn createContext with TypeScript in 10 minutes で React Context の復習

memo.

```React
import React, {createContext, useContext, useState} from "react";

const UserContext = createContext<string | null>(null);

const UserPage: React.FC = () => {
    const context = useContext(UserContext);
    return (
        <div>{context}</div>
    )
}

const NewComponent: React.FC = () => {
    const context = useContext(UserContext);
    return (
        <div style={{background: 'red'}}>
            This is new component.<br/>
            {context}
        </div>
    )
}

export default function App() {
    const [user, setUser] = useState('Initial value')
    const handleClick = () => {
        setUser('Hello from button, ' + new Date().toDateString());
    }

    return (
        <UserContext.Provider value={user}>
            <div className="App">
                <h1>Hello from homepage.</h1>
                <button onClick={handleClick}>Change value</button>
                <UserPage/>
                <hr/>
                <NewComponent/>
            </div>
        </UserContext.Provider>
    );
}
```



## 参考資料

https://www.youtube.com/watch?v=pgZXqS-r9gE
初めてAppStoreにアプリを出した話（ほぼ日記）

2022年5月2日に初めてアプリをリリースしました。

今回は提出からリリースに至るまでの審査の過程やリジェクト内容などをサクッと共有できればと思います。

## 2021年12月15日：アプリ提出

App Store Connectの審査に自作アプリを提出しました。
私としてはこれが初めての経験となります。

## 2021年12月20日：In Review状態になる

休日を除けば提出してから２〜３日経過してレビューが開始されたようでした。

思ったよりレビュー開始までに時間かかったなと思いましたが、個人開発で特に切羽詰まっているものでもなかったので気長に待つつもりでいました。

## 2021年12月20日：謎のリジェクトを受ける

> Hello,
> 
> The review of your app is taking longer than expected. Once we > have completed our review, we will notify you via Resolution Center.
>
> If you would like to inquire about the status of this review, you may file a request via the Apple Developer Contact Us page.
>
> Best regards,
>
> App Store Review
>
> 却下の理由：Other

意訳：予想より時間かかっています。レビュー終わったらお知らせします。

ということで、ステータスはリジェクトでしたが、こちらから何かアクションを起こさなくても良さそうだったのでそのまま放置していました。

## 2022年3月29日：再びIn Review状態になる

忘れた頃、実に約３ヶ月ぶりに唐突にレビューが再開されました

## 2022年3月29日：リジェクト

却下の理由は`Guideline 2.3 - Performance - Accurate Metadata`

前回の、`却下の理由：Other`と違ってこの時はアプリに問題があってのリジェクトだったので対応する必要があります。

## 2022年5月2日：再審査

上記の却下の理由は、"ライトモードとダークモードのスクリーンショットを提出しているがアプリ本体にテーマ切り替えの機能はない"ことのようです。

システムのテーマに合わせてアプリのテーマも切り替わるようにはなっていたのですが、どうやらそれだけでは足りないみたいです（ここの確証が得られる情報をまだ見つけられていません）。

今回はテーマにこだわりはなかったのでライトモードのスクリーンショットのみに差し替えたところ即日審査通過となりました。

対応自体は1日で終わりましたが、プライベートがバタバタしていたのでリジェクトから約１ヶ月後の再提出となりました。

---

そのアプリ（iPhoneのみ）

https://apps.apple.com/jp/app/routinetree/id1600469504
iOS アプリのアイコン用の様々なサイズの画像を作成する方法

Mac では、 `sips` コマンドを利用することで、画像のサイズを簡単に変更することができます。

```sh
#!/bin/sh
################################################################################
# This script creates app icons in many sizes for iOS app.
################################################################################

ORIGINAL_IMAGE=~/Desktop/1024.png

for i in 29 58 80 87 120 152
do
  sips -z $i $i ${ORIGINAL_IMAGE} -o ~/Desktop/${i}.png
done
```
IT作業で転倒＆緊急搬送

意識がまだおかしい状態でこの記事を書いていたので、修正しておきます。

### 事故概要

徒歩１分のところにあるスーパーで買い物中、意識がふらふらして、転倒

### 原因

phpすら無勉強状態で Wordpressのテーマを作成していたため、死ぬほど頭を回転させていたため

なお、確かに締め切りは近かったものの、上司から締め切りとか押されたとかはありません。

:::note info
どちらかといえば phpコードよりJavaScript (jquery) コードのほうのが多い気がします

functions.php は完璧にスパゲティーコードになってます。
:::

### 労働環境

完全に寝ながら（寝転びながら）、死ぬほど長時間勤務

### 対処方法

甘いものを多くとるようにした（低血糖の可能性があり）

qiita に愚痴というか、大したことない記事を書き始めた


なお、これは昨日の事故ですが、まだ足がふらふらします
ド・モルガンの法則に関して

会社の方から「ド・モルガンは通常の業務でも使うはずだから覚えておいた方が良いよ〜」とアドバイスもらったのでまとめてみようと思います。
昔、勉強した気もするのですが、説明してくださいと言われたら出来る気がしないのでアウトプットします。

## ド・モルガンについて
まず、ド・モルガンって誰やって感じなのでwikipediaから引用させてもらいます。
>ド・モルガンの法則（ド・モルガンのほうそく、De Morgan's laws）は、ブール論理や集合の代数学において、論理和と論理積と否定（集合のことばでは、合併と共通部分と補集合）の間に成り立つ規則性である。名前は数学者オーガスタス・ド・モルガン（Augustus de Morgan, 1806–1871）にちなむ。

ド☆モルガンでもなくドモルガンでもなく吃るガンでもなく、ド・モルガンさんですね。
インド生まれのイギリスの数学者のようです。へえ。

## プログラミングでの規則性

```
!(P || Q)は!P && !Qに等しい　 
!(P && Q)は!P || !Qに等しい
```

日本語にすると
「PまたはQ」でないは「Pでない」かつ「Qでない」に等しい
「PかつQ」でないは「Pでない」または「Qでない」に等しい

ややこしいのでベン図でみてみる
## ド・モルガンのベン図
今回はフリー素材のド・モルガンのベン図見つからなかったので
>!(P || Q)は!P && !Qに等しい

上記だけ書きます。
![Venn-Diagram-NOR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/3ca4d48b-3ca6-9ac8-3113-5aa6a52c1061.png)
!(P || Q)
PまたはQではないので緑が上記の部分
![Venn-Diagram-NOT-P.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/15d7e188-8121-080d-7668-958de86f944c.png)
!P
Pではないのが上記の図
![Venn-Diagram-NOT-Q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/457a803d-8d4a-d4aa-c514-a272d8cae542.png)
!Q
Qではないのが上記の図
![Venn-Diagram-NOR (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/6a6f1170-e15d-f8a4-4fd6-200fd52a5afd.png)
!P && !Q
「Pでない」かつ「Qでない」箇所が緑の図

図で見るとわかりやすくなりました。

## プログラミングで書いてみる
```javascript
const a = 0;
const b = 0;

!(a || b) ? 1 : 0;
// １が返却される
!a && !b ? 1 : 0;
// １が返却される
```
## まとめ
業務では意識して使っていこうと思うのと、こちらの記事は良い例題が思いつかなかったので、記事自体もブラッシュアップしていこうと思います。

## 参考
[ド・モルガンの法則](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87)
DevRel Meetup in Tokyo #74 で学んだ事

# はじめに

DevRel Meetup in Tokyo #74 に参加して学んだ事を書きます。
詳細は以下です。

https://devrel.connpass.com/event/245173/

# 学んだ事

## アイスブレイク

参加者全員が、自己紹介をした事が驚きでした。
発表しない参加者も自己紹介をすることで、全員が主体的に参加する意識を高めるような取り組みをしていました。
また、自己紹介のお題として「GW終わったけど、今楽しみなこと」というちょっとしたエピソードをみんなに話してもらうことで、各自に興味をもってもらって交流するきっかけを作っているようでした。
この辺りのアイスブレイクの取り組みは、私もコミュニティ運営をしているので、とても参考になりました。

## 楽しく成長するために発信活動を始めよう

私の発表なので、ここでは詳細は割愛します。
もし興味があれば、より詳細な発表を Microsoft Build のセッションで話しますので、よろしければそちらを視聴してもらえると嬉しいです。
日時は 5/26 13:30-14:15 です。
[Microsoft Build の私のセッションはこちら](https://mybuild.microsoft.com/ja-JP/sessions/d0b8ccfb-ee13-4130-a93e-ac67e0fb8054?source=%2Fspeakers%2F4a4a513b-ff4e-4ad4-8e1e-f0f7c9d56559&fbclid=IwAR0iAJprjj2PQ_l0-02buLhRvoa-SyND6fiMuA4_aVLPxmmJt42ny4hStoQ)

## 「普通のWeb系事業会社」のテックブログ運営 
こまさん ([@koma_koma_d](https://twitter.com/koma_koma_d))の発表でした。

・チームでブログ運営に取り組むこと
チーム(6人)でブログの執筆をする上で難しいことは、本業がエンジニアリングなので、そっちにリソースをさきたいと考える傾向があるため、ブログ運営が片手間になりやすい。
余裕があるといいが、忙しくなってくるとこなすだけで、改善が滞りやすい。
目的意識もずれていきやすい。
だからこそ「むきなおり」を実施するといい。
この活動をどこに向かってやっているかを繰り返し共有することが大切。

時とともにモチベーションが低下しやすい。
だからこそ、ブログを執筆することで、執筆者にどんなメリットがあるかを提示する。その際に、その人の関心事を把握した上で、その関心事にリンクするメリットを提示するといい。

・コンテンツをどう作っていくか
ネタがないという悩みがつきまとう。
ネタがないのでなく、ハードルの上げすぎ。
発信の内容は「すごいこと」でなくてもいい。
採用につなげたいとしても、会社を理解してもらえばよいという考え方が重要。

最初に、いい記事を出して頑張りすぎるとハードルが上がり過ぎて、執筆が頼みにくくなる。
ライトな記事でも、ブログ投稿を継続していることが評価されることもある。

・ブログから組織へ
当事者は自分のしていることを当然とおもいがちだけど、他のチームにとっては知見の宝庫だったりする。
だから、ブログを通して知見を社内で共有することは意義がある。
そういうネタを探しに行くのも、ブログ編集チームの役割。

ブログになるような魅力的な面白い取り組みを生み出すという考え方も重要。
社内勉強会、社内講演をやってみるなど。

## 技術広報の仕事を定義してみた2022年春 メルカリの技術広報のお仕事 
木下 雄策さん([@afroscript10](https://twitter.com/afroscript10))の発表でした。

技術広報とは、技術ブランディングをする人。
会社のミッション・ビジョンから、そのビジョンを実現するための取り組みや成果を発信する。
自社が継続的な発信できるようにあれこれして、会社のイメージを形成するのが、技術広報。

技術ブランディングのためだけに発信するのは少し違う。
技術発信には様々な効果がある。

- 発信した人のスキルアップやブランディング
- 組織の技術ブランディング
- エンジニアリングコミュニティへの還元
- 採用効率の向上

技術発信から技術ブランディングを作る事は、効果はあるが長期的な活動が必要。
だから、技術工法の大事な取り組みは、技術発信を「継続的」に行うこと。

上層部からアウトプット推奨と名言すると、みんなが安心してアウトプットできる。
それが続けば文化になる。

発信しやすい環境作りとして、ブログ作成などのガイドラインを作って公開すると良い。
ブログ執筆のレビューは、執筆者と同じチームメンバー＋技術広報＋有志メンバーで行っている。
レビュー時に、細かく修正しすぎない方がいい。書き手の文調を大事にしている。←これ重要と思いました

ブログイベントとしてアドベントカレンダーなどのイベントを開催すると、みんなしっかり記事を書いてくれる。

技術発信のKPIはもっていない。
上記のように文化や仕組みを作る事が大事。

とにかくやることを全部やって「継続的にアウトプットすること」を会社の文化にすることが重要。

# まとめ

イベントの運営方法からは、参加する人の意識をどのように主体的な方向にするかという考えが学べましたし、発表内容からは、会社としてアウトプットをしていく上で、どのように社内の人たちと関わっていくと良いのかという事を学べました。

今回のDevRel Meetup in Tokyoでの私の発表について、より詳細な内容を
5/26(木) 13:30-14:15 に、Microsoft Build のセッションで以下のテーマで発表します。
「発信活動を継続しながら楽しく成長する方法」
[Microsoft Build の私のセッションはこちら](https://mybuild.microsoft.com/ja-JP/sessions/d0b8ccfb-ee13-4130-a93e-ac67e0fb8054?source=%2Fspeakers%2F4a4a513b-ff4e-4ad4-8e1e-f0f7c9d56559&fbclid=IwAR0iAJprjj2PQ_l0-02buLhRvoa-SyND6fiMuA4_aVLPxmmJt42ny4hStoQ)
Youtubeの生放送のコメントを自動で翻訳

# 前置き
## この記事を投稿した経緯
皆さんはVTuberって知ってますか？
詳細な説明はgoogleを検索すればいくらでも出てくるので割愛しますが、最近は生放送が主流になっており、放送中のコメント（ライブチャット）に非常に丁寧に対応されている方も多く見受けられます。

そんな中、ある作業配信を見ていた時のこと。
コメント欄に海外の方が外国語でコメントをしました。
配信者さんは外国語に強くないので、普段はコメント欄に出てきた外国語は片っ端から翻訳ツールにかけているそうなのですが、作業中だと手が離せないのでそれも難しいとのこと。

そこで思いつきました。
それ、自動化できるんじゃないか、と。

そこから先はエンジニアによくある好奇心です。
その人でも別の人でも、使ってくれる人がいれば嬉しいことこの上ないですが、別に誰かのために作るわけじゃなくて、実現方法を考えるのを楽しみたかったという。

## 要件
配信したことがないので分かりませんが、配信者さんは主に下記の方法で画面にコメントを表示しているとのこと。
https://vip-jikkyo.net/youtube-live-chat-on-screen

外部ツールが絡むと一気に難易度が上がるため、今回は上記記事の中で一番分かりやすい「4 通常どおりキャプチャーする方法」を想定します。

OS：windows10
ブラウザ：google chrome

# 作り方
## 翻訳API
google翻訳のAPIも用意されてはいるのですが、使い勝手がよくなさそうだったので、こちらの記事を参考にGASでAPIを作成。
https://qiita.com/satto_sann/items/be4177360a0bc3691fdf

## ページへの組み込み
独自ページやラッピングページを作るとURLが怪しくなったりと面倒なので、ユーザースクリプトを使ってコメントページ（https://www.youtube.com/live_chat?is_popout=1&v=xxx）にJavaScriptを追加することで実現することにしました。
要素の追加の検出にはMutationObserverを使用しています。

``` comment_convert.js
(function() {
  let mutationObserver = new MutationObserver(function() {
    if (document.querySelector("#item-scroller #items").childNodes.length) {
      // コメントが追加された時に動作
      var element = document.querySelector("#item-scroller #items").childNodes[document.querySelector("#item-scroller #items").childNodes.length-1].querySelector("#message");

      // スタンプのみのコメントを除外
      if(element.innerText){
        // 翻訳APIへリクエスト
        var param = encodeURI(element.innerText);
        fetch("https://script.google.com/macros/s/AKfycbzU8mU59MnDvhgnOyCVQITJiLgDztcaElh7zxBXgzOAMUfNx0JZ5xbbXzMIDXFd_cQL/exec?text=" + param, {
          method: "GET",
          redirect: 'follow'
        }).then(response => response.text())
        .then(text => {
          var honyaku = JSON.parse(text).text;
          console.log(honyaku);
          if(element.innerText != honyaku){
            // 翻訳結果を追加
            element.innerHTML += "<br>訳：" + honyaku;
          }
        });
      }
    }
  });

  // 要素の追加を監視
  mutationObserver.observe(
    document.querySelector("#item-scroller #items"),
    {
      childList: true
    }
  );
})();
```
# 使い方
恐らくこれでいけると思います。

1.chrome拡張機能のtampermonkeyをインストール
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja

2.下記URLからユーザースクリプトをインストール
https://github.com/coh-rogi/custom_script/raw/main/comment_convert.user.js

3.Youtubeの視聴画面から「チャットをポップアウト」→そのまま使うか、URLを別タブにコピー

※翻訳のためにサーバーへの通信をしています。
翻訳APIの内容は本記事に記載してある通りで、送っているのもコメントの本文だけですが、よく分からないところと通信をしたくないという場合は自分で翻訳APIを作り、スクリプトの22行目のURLを変更してご使用下さい。

# 参考
翻訳API
https://qiita.com/satto_sann/items/be4177360a0bc3691fdf
MutationObserver
https://gomafrontier.com/technical/javascript/3108
ユーザースクリプトの配布
https://hepokon365.hatenablog.com/entry/2020/06/07/235856
ROSPY2っていうやつがあるらしい

# はじめに
そろそろROSからROS2に移行する必要があるかと思っているのだが、コードの書き方が違うから移行するにも移行できないという方が多いかと思いますので、ROS->ROS2の移行を１行でできる素晴らしいパッケージを紹介します。

# ROSPY2
詳しくは、下記の動画を確認してもらえばいいかと思いますが、
https://vimeo.com/649655340

~~~
import rospy
~~~

のところを

~~~
import rospy2 as rospy
~~~

に変えるだけみたいです。
rosboardがrosとros2を併用できるのもこれのおかげみたいですね。
これなら移行が簡単になりそうです、
【凡ミス】LINE botからユーザーへpostしようとした際の401エラー

# 目次

* 初めに
* エラー内容
* エラーの対処



# 1. 初めに
* こちらの記事はLINE botからユーザへメッセージを送信しようとした際に、401エラーで弾かれた際のエラー対処記録になります。GAS環境で作成し、実行を押したらエラーが出ました。


# 2. エラー内容
エラーの内容は以下の通りです。
```
Exception: Request failed for https://api.line.me returned code 401. Truncated server response: {"message":"Authentication failed. Confirm that the access token in the authorization header is valid."} (use muteHttpExceptions option to examine full response)
```
要するに
### アクセストークンが有効であることを確認しろ

だそうです。

もちろんこの手のエラー対処はたくさんネットに転がっていました。

* ↓こちらの記事ではGASのアプリ公開範囲を[自分のみ]にしていたという結論で、[全員に公開]で解決していました。

https://teratail.com/questions/227966

* 他にも、長期のアクセストークンではなく、短期のアクセストークン(?)を使うといけたとか・・？
短期のアクセストークンなんて私のLINE Developerにはありませんでした。

* あとはwebhook をon/offに何回かするといけたとかいう記事もありました。

# 3. エラーの対処
* 結論から言うとめちゃくちゃ凡ミスでした。(てか普通に気づけるはずない)
私は[LINE Developers](https://developers.line.biz/en/)のサイトはデフォルトで英語でした。
なので、safariの機能で日本語翻訳をしていると、Channel access tokenがなんと翻訳を挟んで変わってしまっていました。
変わったChannel access tokenをコピペし、コードに貼り付けても応答がないのは当たり前ですよね。
#### 極力翻訳機能は使わないようにしよう

と思った今日この頃でした^^
Let’s Encrypt を更新したときCould not bind TCP port 80 because it is already in use by another process on this system (such as a web server) とでた場合の対処法


# エラー内容

Let’s Encryptを更新しようとすると下記のエラーが出ます。

```sh
sudo certbot renew --dry-run
```

```sh
Attempting to renew cert (kakuuchi.cyou) from /etc/letsencrypt/renewal/kakuuchi.cyou.conf produced an unexpected error: Could not bind TCP port 80 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/kakuuchi.cyou/fullchain.pem (failure)
```

# 対処法
「80のポートが既に使われている、、、」、といったメッセージだったので、一旦Port:80のサービスを落とした後にrenewし、nginxを再起動して解決しました。

```sh

# port:80で使っているサービスを確認
sudo lsof -i tcp:80

# port:80で使っているサービスを停止
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill

# Let’s Encrypt を更新(練習)
sudo certbot renew --dry-run

# Let’s Encrypt を更新(本番)
sudo certbot renew

# 停止していたサービスを再起動
sudo systemctl restart nginx
sudo systemctl restart gunicorn

```

# PostScript

webサーバはnginxを使っているのですが、
- [[Let’s Encrypt] certbot renew でエラー Could not bind TCP port 443 because it is already in use by another process on this system の解決方法](https://codenote.net/ssl/3920.html)
- [[Solved] Let’s Encrypt Could not bind TCP port 80 because it is already in use by another process on this system (such as a web server)](https://www.yuulinux.tokyo/21237/)

を見ると `sudo certbot renew --dry-run --nginx` で更新できるとのことでしたが、なぜがうまくいかず:unamused:

次の更新時で確認するしかない。


# Reference
- [Kill process running on port 80](https://unix.stackexchange.com/questions/244531/kill-process-running-on-port-80)
- [【Djangoの本番環境構築】Ubuntu20.04,Python3.8,Nginx,Gunicorn,PostgreSQL](https://tomato-develop.com/django-ubuntu-python-nginx-gunicorn-postgresql/)
ワーク・ルールズ！を読んで

## Googleは世界でもっとも働きやすい職場
・手厚い保護（大学の奨学金付与）
・自由度の高さ
・評価の平等（上司ではなく、同僚が評価する）

## 検索ツール
当時のサーチエンジンは最も関係性が強いワードを検索上位においていた。
しかし、これでは「ペットフード」と白い文字で白い背景に100回単語を埋め込めば検索順位が上がってしまう。
→Googleはリンクに注目し、他のサイトでも紹介されているページ＝有益と評価した。

## 創業者になれ
一社員でも、創業者のように働くべきだ。



## 採用
・ほとんどの場合、面接の最初の３分から５分で大半の評価が決まってしまう。
・残りの時間はその辺圏の裏付けに費やされる。
・面接担当者は意識せずとも、自分に似た人に好意的になる。

平均的な社員を費用をかけてトレーニングするのと、スパースターを雇う場合、コストに関しては
トレーニング　> 採用コスト
となる。

そのため、Googleは他社の二倍採用コストをかけている。

最も重要なのは、謙虚さと誠実さ。

## トップテールとボトムテール
ボトムテール、つまり業績が下位5%の人をグーグルではサポートする。
トップテールの社員は、高い生産性、すばらしいFB、さらに高い生産性、さらに素晴らしいFBという好循環を享受している。

## 学習
一流のアスリートは動作を細かく分割して何度も繰り返す。常に状況を確認しながら、小さな修正を重ねていく。
同じ課題を2,3回繰り返すと効果的な学習につながる。

変化とフィードバックこそが成長。

## 満足度
金より経験の方が満足度が高い。
感謝を伝える環境づくり、習慣づけを行う。

Googleでは社員から社員へ臨時ボーナスを支給することができる。

1.仕事に意味を持たせる
2.人を信用する
3.自分より優秀な人だけを採用する（周りに優秀な人がいる環境に身を置く）
4.発展的な対話とパフォーマンスのマネジメントを混同しない
5.トップテールとボトムテールに注目する
6.金を使うべき時は惜しみなく使う
7.報酬は不公平に払う
8.きっかけ作り（無駄遣いしない）
9.高まる期待をマネジメントする
10.楽しむ！

## 評価
権力は腐敗する。
マネージャーには評価させず、データに基づいて意思決定する。



## 感想

採用の話が結構なボリューム
MetaMaskのテストネットワークを追加する方法

# はじめに
スマートコントラクトを試す際に、テストネットワークを作ると思います。
MetaMaskにテストネットワークを追加する方法をすぐに思い出せなかったので、備忘録的に記録します。

# 流れ
下記の流れでネットワークを追加していきます。
1. MetaMaskにログイン
2. イーサリアムメインネットを押下
3. ネットワークを追加を押下
4. 高度な設定を押下
5. テストネットワークを表示をオンにする

# 画面キャプチャ
MetaMaskにログインしたら「イーサリアムメインネット」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/a0bc52b5-073f-f863-556a-353035724660.png)

ネットワークを追加を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/4b568d82-1034-bee6-311f-18326975182a.png)

高度な設定を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/a8424534-90af-b721-dfa4-ee87fc9265ac.png)

テストネットワークを表示をオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/6cd204a5-8486-799d-0067-626176eceb9c.png)

テストネットワークが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/1e5dbd85-3cef-dfd2-b077-5154349c8fbb.png)

ちょっと追加方法どうだったか忘れてしまってたので復習もかねての記録でした。
Fakerでダミーの漢字氏名・カナ氏名を生成する

Pythonでテスト用データなどのダミーデータを作りたい場合は[Faker](https://pypi.org/project/Faker)を利用することができる。その際のノウハウを記載する。

# 氏名の取得
ダミーの氏名を生成する場合に、漢字名とカナ名をそれぞれ取得すると、それぞれでランダムに取得されてしまう。

``` py
from faker import Factory
fake = Factory.create('ja_JP')

print(fake.last_name())
# "田中"
print(fake.last_kana_name())
# "サトウ"
```

以下のように`pair`を取得すると、`(漢字表記, カナ表記, ローマ字表記)`のタプルが返ってくるので、こちらを利用したほうがいい。
``` py
print(fake.last_name_pair())
# ("田中", "タナカ", "tanaka")
print(fake.first_name_pair())
# ("太郎", "タロウ", "tarou")
```

# 名前のデータセット追加
Fakerに登録されている氏名のデータセットは少ないため、データセットを増やす場合、以下の方法が考えられる。
1. Fakerのソースに追加してプルリクエストを送る
    - プルリクエストを作成するまで頑張って採用まで時間がかかる可能性あり
2. FakerをForkして改変して使用する
    - 本体側の修正に合わせてマージしていくなど、Forkしたリポジトリの管理が必要になる
3. 自分の環境でだけ無理やりデータセットを追加する

今回は3番目の方法を記載する

``` py
from faker import Factory
from faker.providers.person.ja_JP import Provider as PersonProviderJP


fake = Factory.create('ja_JP')
person_provider: PersonProviderJP = list(filter(lambda provider: isinstance(provider, PersonProviderJP), fake.providers))[0]

# 追加する分の名前を作る（ここでは男性名）
# 実際にはCSVとか読み込むようにするとよさそう
my_first_name_male_pairs = (
    ("蓮", "レン", "ren"),
    ("陽翔", "ハルト", "haruto"),
    ("蒼", "アオイ", "aoi"),
)

# データセットに追加
person_provider.first_name_male_pairs += my_first_name_male_pairs

# 確認
for _ in range(1000):
    result = fake.first_name_male_pair()
    if result in my_first_name_male_pairs:
        print("★：" + str(result))
    else:
        print(str(result))
```

参考：https://github.com/joke2k/faker/blob/master/faker/providers/person/ja_JP/__init__.py