OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定クラウドプラクティショナー受験で`失格`した話

# 目次

- [始めに](#始めに)
  - [AWS認定クラウドプラクティショナーとは](#aws認定クラウドプラクティショナーとは)
  - [受験した理由](#受験した理由)
  - [試験勉強と試験当日の注意](#試験勉強と試験当日の注意)
- [試験の申込](#試験の申込)
  - [試験方式はオンラインのみ](#試験方式はオンラインのみ)
  - [事前に受験環境の確認](#事前に受験環境の確認)
- [試験勉強](#試験勉強)
  - [受験勉強開始前の知識レベル](#受験勉強開始前の知識レベル)
  - [学習期間](#学習期間)
  - [参考資料](#参考資料)
  - [学習方法](#学習方法)
- [試験当日](#試験当日)
  - [準備](#準備)
  - [試験開始](#試験開始)
    - [チェックイン](#チェックイン)
    - [試験官とのやり取り](#試験官とのやり取り)
    - [試験](#試験)
  - [試験終了、まさかの`失格`](#試験終了まさかの失格)
- [その後](#その後)

# 始めに

## AWS認定クラウドプラクティショナーとは
AWSが実施するクラウドへの理解と基礎的なAWSの知識を有する事を認定する試験です。

## 受験した理由
業務上S3やLambdaといったAWSの提供するサービスを利用するので、AWS基礎知識を習得するために受験しました。普段利用しないサービスが圧倒的に多いので、AWSで出来る事を知るきっかけとなりました。

## 試験勉強と試験当日の注意
AWS認定クラウドプラクティショナー試験に向けた勉強方法と、試験の注意事項をお伝えします。私は1回目試験は`まさかの失格`となってしまいましたので、その原因をお伝えします。

# 試験の申込

## 試験方式はオンラインのみ
試験はオンラインで実施され、AWSが提携しているPSI、ピアソンVUEで受験します。受験した2021年7月時点ではピアソンVUEは試験官が日本語対応可能な場合もあるためピアソンVUEを選びました。PSIは英語のみです。

## 事前に受験環境の確認
受験に使用するPCがシステム要件を満たしているか、必ず事前にシステムテストを行います。試験中はOnVUEという試験配信アプリケーションを除いて起動されていない事という要件があります。私の場合「monitor」というプロセスがチェックに引っ掛かりOnVUEを起動できませんでした。ユーティリティソフトのプロセスなのですが、そこに辿り着くまで30分くらい時間がかかりました。

# 試験勉強

## 受験勉強開始前の知識レベル
S3とLambdaを多少知っている程度で、AWSの広範なカテゴリーにわたる多数のサービスはほとんど知りませんでした。

## 学習期間
1回目の受験は試験を予約してから一か月間集中して学習しました。平日の朝30分、休日の朝3時間、合計34時間の机に向かいました。隙間時間にはアプリで用語の暗記です。


## 参考資料

- テキスト：AWS認定資格試験テキスト AWS認定クラウドプラクティショナー Kindle版
- 動画：AWS Eラーニング: AWS Cloud Practitioner Essentials（日本語字幕版）
- 問題集：Udemy クラウドプラクティショナー演習問題集

## 学習方法
- 前述の参考資料を２周し、理解の浅い部分は繰り返し学習しました。
- AWSは頻繁にサービスがアップデートされますので、AWS Eラーニングの内容は把握すべきです。
- 無料の単語帳アプリ[WordHolic](https://www.langholic.com/wordholic)を使用して用語を覚えました。CSV形式で作成した用語と解説をアプリに取り込め、「暗記テスト」を中心に利用しました。

# 試験当日
## 準備
- 自宅から受験。IDとしてパスポートを用意。
- 受験する部屋を整理します。芸能人の顔が写ったポスターはAIがダメ出しします。机の上はPCとモニター以外置かないように片づけます。
- モニターは一つのみ許可されています。ノートPCに大きなモニターを接続している場合はノートPCを閉じます。

## 試験開始
### チェックイン
AWS認定のページから「ピアソンVUE試験の管理」をクリック、試験を選択、「OnVUE」アプリでチェックインします。
### 試験官とのやり取り
今回は日本語のチャットで試験官とやり取りです。

- 身分証明書（今回はパスポート）の提示
- 作業机を中心に四方を撮影し、作業環境のチェック
- スマートフォン、バッグ等が手の届く範囲にない事
### 試験
- 試験官から「頑張って」のメッセージが送られてきて、試験が開始されました。
- 自信の無い設問は「後で見直す」フラッグを付け、どんどん先に進みます。
- 最後の設問に回答したら、自信の無い問題を中心に見直します。  

## 試験終了、まさかの`失格`
- 試験が終わるとアンケートと合否結果が表示されて試験終了となります。が、しかし！1回目の受験ではここで対応を誤り、強制終了されてしまいました。
- 試験終了後トイレに行って戻ると、試験官から「席を離れたため強制終了します」のメッセージが表示されていました。
- 何で？画面を詳しく見ると「OnVUEを終了」というようなボタンがありました。これをクリックしてOnVUEアプリを終了させる前に席を離れたため、`強制終了により失格`したのです。。。

# その後
一回目の受験失敗で勉強する気になれず、受験勉強を再開したのは一週間が過ぎた頃でした。二回目の受験勉強は、前回と変わりなく、受験二回目にして合格できました。
【永久保存版】BigQuery 実購買データ分析でよく使うSQL CPM編

BigQueryを用いたデータ分析で頻繁に出てくるSQL文をここにまとめます。
各自のデータベースに合わせてお使いください。

##前提

今回用いるテーブルのスキーマとデータ例です。

テーブル名：items

|フィールド名|データ型|説明|
|:-----|:---|:--|
|user_id|STRING|ユーザ ID
|order_id|STRING|受注番号	
|total_price|INTEGER|購入合計金額	
|item_id|STRING|商品 ID
|item_name|STRING|商品名	
|category_name|STRING|カテゴリ名
|purchased_at|DATE|購入日


|行|user_id|order_id|total_price|item_id|item_name|category_name|purchased_at|
|:---:|:---|:--|:--|:--|:--|:--|:--|
|1|62178|272324|2780|702671|ピカチュウのぬいぐるみ|ぬいぐるみ|2021-11-01|
|2|62178|272324|3830|423852|ピカチュウの帽子|帽子|2021-11-01|
|3|43532|272325|3830|940234|コダックのぬいぐるみ|ぬいぐるみ|2021-11-01|
|4|62178|272324|2780|702671|ピカチュウのぬいぐるみ|ぬいぐるみ|2021-11-03|
|5|28564|272327|1200|435666|ミュウのキーホルダー|キーホルダー|2021-11-04|
|・|・・・|・・・|・・・|・・・|・・・|・・・|・・・|・・・|


##CPM分析
手順として、
①サブクエリで「初回購入日」と「最終購入日」を算出する
②「初回購入日」と「最終購入日」の差を「在籍期間」とする

```sql:CPM分析
WITH main AS (
SELECT
    *,
    first_value(raws.purchased_at) OVER (PARTITION BY raws.user_id ORDER BY purchased_at ASC) as first_purchased_at,
    DATE_DIFF(CAST purchased_at AS DATE), CAST (purchased_at AS DATE), DAY) AS Recently,
    DATE_DIFF(CAST purchased_at AS DATE), CAST (first_value(raws.purchased_at) OVER (PARTITION BY raws.user_id ORDER BY purchased_at ASC) AS DATE), DAY) AS enrolled,
    SUM(raws.total_price) OVER(PARTITION BY raws.user_id ORDER BY raws.order_id rows between unbounded preceding and current row) AS ltv,
    ROW_NUMBER() OVER (PARTITION BY raws.user_id ORDER BY raws.purchased_at DESC) AS RowNo
  FROM
    テーブル名 AS raws
  WHERE
    CAST purchased_at AS DATE) > purchased_at
  ORDER BY
    purchased_at DESC
)
SELECT 
*,
CASE
    WHEN ltv >= 100000 AND Recently <= 240 AND enrolled >= 210 THEN '優良現役'
    WHEN ltv >= 100000 AND Recently > 240 AND enrolled >= 210 THEN '優良離脱'
    WHEN ltv >= 100000 AND Recently <= 240 AND enrolled >= 60 AND enrolled < 210 THEN '流行現役'
    WHEN ltv >= 100000 AND Recently > 240 AND enrolled >= 60 AND enrolled < 210 THEN '流行離脱'
    WHEN ltv <= 100000 AND Recently < 50 AND enrolled >= 60 AND enrolled < 240 THEN 'コツコツ現役'
    WHEN ltv <= 100000 AND Recently >= 50 AND enrolled >= 60 AND enrolled < 240 THEN 'コツコツ離脱'
    WHEN frequency = 1 AND Recently <= 240 THEN '初回現役'
    WHEN frequency = 1 AND Recently > 240 THEN '初回離脱'
    WHEN Recently <= 240 THEN 'よちよち現役'
    WHEN Recently > 240 THEN 'よちよち離脱'
END as cpm
FROM 
main
```

結果（本日が2021/11/11と仮定）

|行|user_id|order_id|total_price|item_id|item_name|category_name|purchased_at|Recently|
|:---:|:---|:--|:--|:--|:--|:--|:--|:--|
|1|62178|272324|2780|702671|ピカチュウのぬいぐるみ|ぬいぐるみ|2021-11-01|10|
|2|62178|272324|3830|423852|ピカチュウの帽子|帽子|2021-11-01|10|
|3|43532|272325|3830|940234|コダックのぬいぐるみ|ぬいぐるみ|2021-11-01|10|
|4|62178|272326|2780|702671|ピカチュウのぬいぐるみ|ぬいぐるみ|2021-11-03|7|
|5|28564|272327|1200|435666|ミュウのキーホルダー|キーホルダー|2021-11-04|6|
|・|・・・|・・・|・・・|・・・|・・・|・・・|・・・|・・・|
AWS Storage - S3 vs EBS vs EFS 比較

# はじめに
AWSの中では、S3,EBS,EFSの3つのタイプのストレージがよく使われています。AWS初心者の方は、違いや利用シーンについて疑問を持つかもしれません。

# ストレージタイプについて
先に一般的なストレージタイプを理解しましょう。
Block StorageとObject Storageの二つタイプがあります。例として、サイズ100MBの単一ファイルで説明します。

###### Block Storage
Block Storageは一つ一つのpieceで構成されていますので、ファイルの更新で変わるデータのpieceだけを修正すれば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349950/e2dd8257-208b-73bc-445e-a0a7ec8e3a3e.png)
###### Object Storage
ファイルを更新するには、全部（100MB）を更新する必要があります。つまり、古いファイルを削除して、新規ファイルを作り直すイメージです。もちろん、時間がBlock Storageよりかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349950/e08b4a0d-4006-22e2-85a2-4cb02d76bf46.png)


簡単に言うと、
ファイルに書き込み、読み出しの両方の操作をよくやるケースだと、Block Storageは理想的な選択肢です。
一つのファイルをサーバにおいて、読み出し操作ばかりやるなら、Object Storageはもっと効率的な方法です。

# AWSのストレージ
タイトルの話に戻ると、AWSでは、EBSがBlock Storageです。EFSもBlock Storageだけど、比較的にコストが高いです。
S3はObject Storageです。

###### S3ユースケース
1. WORM(Write Once Read Many times) の場合、S3を利用します。例えば、ログシステムのログファイルではお勧めします。静的なウェブサイトファイルも。
2. 拡張性が必要だったりサイズが未定な場合、S3を利用し、ファイルをダウンロードして使います。
3．OSシステムやデータベースの場合、EBSを利用します。S3はお勧めしません。サーバの場合、EBSが望ましいです。

###### EBSユースケース
1. リードとライト機能から見ると、持続的な、パフォーマンスがいい選択肢です。
2. 同じAZにあるec2からmountできます。レプリケーションも可能です。

###### EFSユースケース
1．同じリージョンのマルチAZ間でレプリケーションを行えます。
2．VPN や Direct Connect で接続された複数のオンプレミスサーバ（premise server）でマウントできます。
3．同じリージョンの複数のEC2にmountできます。例えば、ファイルシステムを利用する時、ケースだっと、マルチサーバを一つファイルサーバを利用する場合、マルチサーバにmountできます。
4．サイズの制限がありません。

# おわりに
当社では、トヨタ車のサブスク「KINTO」等の企画/開発を行っており、エンジニアを募集中です。
[KINTO Technologies コーポレートサイト](https://www.kinto-technologies.com/)
テレワークに必要なツールを解説してみました（１）

#経緯

テレワークのSOHO・中小企業の導入にあたって、参考になりそうな資料が必要となり作成してみました。テレワークを始めるにあたって、最低限以下のツールが必要かなと考えますので、それぞれ章立てで記載しています。（本POSTでは「オフィスのネットワークへの接続ツール」について説明しています。）

+ オフィスのネットワークへの接続ツール
+ チャットやWeb会議サービス等のコミュニケーションツール
+ テレワーク時に業務管理ツール

#オフィスのネットワークへの接続ツール

オフィスのネットワークに入らないと仕事にならないという人は、まずオフィスのネットワークへの安全なアクセス方法を確保する必要があるかと思います。代表的なオフィスへの接続方式について、羅列してみました。

##1. VPN+RDP

Windowsに搭載されているRDPを利用して、オフィスのサーバのもしくはPCへアクセスする方式。たまに誤解されて「RDPは暗号化されていないので、VPNで暗号化通信を行う必要がある」という話がありますが、RDP自体はTLS1.2で暗号化されています。しかしながらRDPだけでアクセスする場合には「固定IPが必要」「RDPポートを外部に公開する必要がある」等ネットワーク的にもセキュリティ的にも問題がありますのでVPNとの併用が必須です。

この方式を実現する場合

+ WindowsはPro（HomeエディションはRDPを利用できません。）
+ VPNルータとVPNクライアントの設定(クライアントソフトがある場合ソフトのインストール）

が必要となります。またVPNルータを購入する場合は、同時接続数の上限が利用想定に合っているか確認が必要です。

##2. 市販のリモートデスクトップ製品を導入する

社内にシステム管理者がいない場合は、こちらの方式の方が比較的簡単に導入できます。大きく２つ方式があるのでそれぞれ説明を記載しています。

#### 1. RDPクライアントをインストールする方式

独自のRDPクライアントを使って、リモートデスクトップを実現するパターンです。Apacheプロジェクトの[Guacamole](https://https://guacamole.apache.org/)はこのパターンで、[XFreeRDP](https://www.freerdp.com/)(VNCも選択可）を利用してRDP接続を実現しつつ、RDP通信の内容をHTML5に変換してブラウザに画面を出力しています。このパターンの多くはリモート側と接続側の間に中継サーバを利用することにより固定IPを不要としています。

#### 2. WebRTCのGetUserMediaを利用する方式

これは[ChromeRemoteDesktop](https://remotedesktop.google.com/)で有名な方式で、要はデスクトップの画面をコマ送りでストリームに乗せてリモートデスクトップを実現する方式です。WebRTC利用ですので固定IPは不要となります。

その他VDIや最近流行りのクラウド上でのDaaS(Desktop as a Service)もありますが、厳密にはオフィスにアクセスするわけでは無いので対象としませんでした。

#オフィスへの接続方式について考慮すべき事項

上記の様な接続方式を採用するにあたって確認すべき事項は以下の事項と考えます。

+ 導入の技術的難易度
+ セキュリティ
+ パフォーマンス

##1. 導入の技術的難易度

ルータ＋RDP方式は、ある程度ネットワーク機器が操作できるシステム管理者がいないと導入・運用のハードルは高いです。特にテレワークで利用において、業務に支障をきたさないようにVPNルータを運用することは、ある程度知識が無いと困難かと思われます。それに対して市販のリモートデスクトップツールの導入は比較的簡単です。（但しGuacamoleのようなOSSの利用はそれなりに知識が必要なので自信が無い限りはお勧めしません。）

##2. セキュリティ

市販のリモートデスクトップツールを利用する場合、利用しているインフラの確認は意外に盲点なのかなと思います。リモートデスクトップツールですが、海外製品も多くありますので、中継サーバは海外に設置されているような場合、自宅→海外サーバ→オフィスのような経路で通信されてしまうと本末転倒だと思いますので、経路情報が明示されているサービスが望ましいです。

リモートデスクトップですが、社内情報が入っているPCへの接続になりますので、セキュアな認証方式実装されている必要があります。最近のVPNクライアントやリモートデスクトップツールの多くは２要素認証を備えているものが多いので、２要素認証付きのものを選択すべきでしょう。

またテレワーク時でマルウェア感染等が発生した場合も備えて、管理者からリモートデスクトップ接続を切断できるような機能が搭載されているものもあり、セキュリティを重視する場合はそのようなものを選択すべきです。


##3. パフォーマンス

VPNの場合、どうしてもルータの同時接続数上限があるので、同時接続が多いリモートデスクトップの場合は上限を超えがちです。余裕を持ったスペック（利用者数イコールか若干多め）を選定する必要があります。

リモートデスクトップツールの場合、ほとんどのツールが30FPS(秒間のフレーム数）を超えてくるので、そのレベルを選べば間違いないかと思います。

##4.　その他

リモートデスクトップは意外に日本語入力が盲点になる場合もあったりしますので、問題なく日本語入力ができることは確認したほうが良いです。
Dagger Hiltでよくハマるミス

Dagger Hiltでよくハマるミス

```
appモジュール -> moduleA -> moduleB
```

という依存関係で、

``` kotlin
// moduleB
interface Hoge
class HogeImpl : Hoge

@Module
@InstallIn(SingletonComponent::class)
abstract class BModule {
  @Binds
  abstract fun provideHoge(impl: HogeImpl): Hoge 
}

// moduleA
class UseCase @Inject constructor(
  private val hoge: Hoge
) {
}

// appモジュール
class HogeViewModel @Inject constructor(
  private useCase: UseCase
) : ViewModel() {
}
```

こんな感じのDIをしていた場合に、appモジュールのbuild.gradleでmoduleBへのimplementationを忘れているとビルドエラーになる。

これはHiltが生成する `Xxx_HiltComponents_SingletonC.java` が `BModule_provideHogeFactory` 経由で `Hoge` へ依存を持っており、結果としてappモジュールもmoduleBに依存している状態なっており、ビルドエラーとなっている。

なので、解決方法としてappモジュールのbuild.gradleでmoduleBへのimplementationの追加が必要となる。
【Salesforce 認定資格の維持】 Platform デベロッパー認定資格の更新 (Winter '22)　Platform デベロッパー向けの新機能の学習

**ハンズオン Challenge の準備**

１．カスタムメタデータ型を作成します。
表示ラベル: Country Code (国コード)
表示ラベル (複数形): Country Codes (国コード)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/9bd0822b-808c-4e56-4d36-dd69977b0f9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/bf8bebd7-5e6c-1c53-3891-a8725e2a067f.png)
２．カスタム項目を追加します。
データ型: テキスト
項目の表示ラベル: Country Code (国コード)
文字数: 3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/cfd116d2-85b3-a4b0-3648-0b69ebc9fe0d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/e0a16419-202c-0b27-017a-ea963b51b6fc.png)
３．国コードを入力します。
表示ラベル: Canada (カナダ)
Country Code (国コード): CAN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/d98b6d3d-dda4-6f68-1b27-5c4eb83e05c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/3de97308-87f6-8fe6-3a23-c707ae06182d.png)

**ハンズオンの Challenge**
Apexクラスを新規作成し、以下のコードブロックで上書きします。

```Apex:CountryCodeHelper.apxc
public class CountryCodeHelper {
  public static string getCountryCode(String country) {
    Country_Code__mdt cc = Country_Code__mdt.getInstance(country);
    return cc.Country_Code__c;
  }
}
```

**おめでとうー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/4e3ce8bd-734a-a9a6-7d88-8f629d0bd408.png)
【Automation Anywhere】無料のCommunity Editionを申し込んでみよう　- はじめてのAA

# はじめに

Automation Anywhereの[Automation360](https://qiita.com/IQ_Bocchi/items/e5c95bd74cae45d1c586)には、無料で使えるCommunity Editionがあります。

このページでは、Community Editionの申込方法を紹介します。

なお、Community Edition を動かすためには、PC環境などにいくつかの条件があります。
Community Editionを動かせる条件については、[こちらの記事](https://qiita.com/IQ_Bocchi/items/33c2b251e32c6f6e0d3a)をご参照ください。

また、規約的な面でCommunity Edition を使っていい条件については、[利用規約](https://www.automationanywhere.com/jp/community-edition-license-agreement-a2019)や[こちらの解説](https://qiita.com/IQ_Bocchi/items/ad409fc6e0b498935a5c)をご参照ください。

# さっそく申し込んでみよう！

### Step1. まずは申込ページにアクセスします.

https://www.automationanywhere.com/jp/products/enterprise/community-edition

### Step2. 必要事項を記入し、「送信」ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f4bee7c8-d1b1-cfc7-4d78-ae4b4372f826.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/9fb58343-cb4f-59ea-5271-3354f196e200.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/37f0d8de-1ad7-3fcd-c2e7-63d4901fdb43.png)


しばらく待っていると、記入したメールアドレスに `communityedition@automationanywhere.com` からメールが届きます。

#### メールが届かない場合は、以下を試してみてください。

- 迷惑メールのフォルダを確認する
- `communityedition@automationanywhere.com`からのメールを受信できるように設定し、再度Step1からやってみる
- もうしばらく待つ
- それでもダメなら、再度Step1からやってみる

### Step3. ログインしてパスワードを変更します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/cb15dbdf-2ba3-e7bc-c700-e399fdf8615c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4e695bf2-a78f-1c90-2e01-5f58922da44e.png)

初回ログイン時のみ、初期パスワードの変更を求められますので、変更します。

パスワードは、以下の条件を**すべて**満たす必要があります。

- 8文字以上15文字以内
- すべて半角の英数字＋特殊文字（@、-、_、!、#、$、%、&、.）で構成されている
- 大文字、数字、特殊文字をそれぞれ最低１文字ずつ含んでいる

パスワードの変更が完了したら、Community Editionの申込は完了です。

### 補足：言語の切替

もし、この段階で画面の言語が日本語になっていなかったら、以下の方法で日本語にすることができます。

https://qiita.com/IQ_Bocchi/items/192cea506bc98f4088e1

# 次のステップ

Community Editionで作ったBotを実際に動かすためには、「デバイスの接続」という作業をする必要があります。

以下のページを参考に、デバイスを接続してみましょう。

https://qiita.com/IQ_Bocchi/items/9162df094182c4c55ada


# 最後に

この記事は、「はじめてのAA」シリーズからリンクされています。

https://qiita.com/IQ_Bocchi/items/8d28f12256037b5f9058

Automation Anywhere を使い始めたばかりの方はもちろん、これから使ってみようと思っている方や、ずっと使っているけど改めて基本を学びたい方も、ぜひ上記のリンクをチェックしてみてください。
[LPIC-101対策]システムアーキテクチャ

用語をさっくり緩めに。まとめる。
# ~ Linux 起動まで ~ 
## ■ 起動順

BIOS
↓
ブートローダ
↓
カーネル
↓
init

## ■ BIOS

- 電源を入れると起動する。
- HDDを最低限認識する。
- 優先順位に従って読み込んでいき、ブートローダが来たら制御を移す。
- 優先順位を変えれる。

> MBRとは
└ マスターブートレコードの略。
└ 一番最初に読み込まれるところ。
[参照](https://wa3.i-3-i.info/word15557.html)


### ▼ UEFI  
- Unified Extensible Firmware Interfaceの略　(統一・拡張可能・回路情報・接点)
- BIOSより高機能。

## ■ ブートローダ
起動すると、記憶装置(HDD)内のカーネルをロードし、制御を移す。

### ▼ ESP
- 物理的なマシンを起動する
- `/boot/efi`にマウントされる

## ■ カーネル

- ハードウェアを認識・制御
- いろんな初期化

`/proc/cmdline`・・・ブートローダから渡されたパラメータが入っている。

### ▼ カーネルモジュール

`/proc/modules`
└ ロードされているカーネルモジュールの情報が入っている

ルートファイルシステムをマウント
↓
initを起動　・・・①

#### ▷ [コマンド] dmesg

リングバッファの内容を出力。
(リングバッファには、カーネルが出すメッセージが入っている。)

> リングバッファとは
└ リング状の一時的なデータ記録場所。（最初と最後が繋がっている。)


## ■ initプログラム

- `/etc/inittab`配下にいる。
- ランレベルのデフォルトを設定できる。

### ▼ SysVinit

- 設定ファイルの`/etc/inittab`：システム起動時に読み込まれる
- initプログラムを採用しているシステム。
- **ランレベル**に応じてサービスを起動・停止してくれる。
- スクリプトを実行する。
- プロセス管理はPID
- `/sbin/init`①を起動してくれる。

### ▼ 「Upstart」と「systemd」

- 並列で起動できる。ため、直列で起動する「SysVinit」より速い！


#### ▷ Upstart

- 単位は「ジョブ」。
- ジョブの実行を「イベント」で管理している。
- SysVinitと互換性がある。
- ランレベルのデフォルトを設定できる。  
　→`/etc/event.d/rc-default`（ここで

#### ▷ systemd

- 単位は「Unit」　  
└ Unitとは設定ファイル  
└ Unitの設定に従って処理を実行する。
- シンボリックリンクを作成し、期待するサービス群を起動できる。
- プロセス管理は「cgroups」
- 起動時に最初に実行されるUnitは`/etc/systemd/system/default.target`
- `systemctl`コマンドで管理されている。

##### ○ systemctl コマンド
各サービスの稼働状況や起動設定を管理する。

##### ○ systemd-journald デーモン
- プロセスの標準出力やsyslogへのログの一元管理ができる。
- バイナリ形式で出力されるので、`journalctl `コマンドで読めるようにする。

### ▼ SCSI

- `/proc/scsi/scsi`で確認可能。

### ▼ DMA

- ダイレクトメモリアクセスの略。
- CPUを介することなくメインメモリと周辺機器の間で直接的に情報転送を行うことができる。
- `/proc/dma`にチャネル情報が入っている。


# ~ その他 ~

### ■ 大容量記憶装置

#### ▷ 何ができるか
OSをインストールすることもできる。
たくさんデータを保管できる。

- HDD  
  └ 容量でっかくてコスパ最強だが、壊れやすい
- USBフラッシュドライブ  
 └ 俗にいうUSBメモリ
- SSD（Solid State Drive）  
└ フラッシュメモリ／長期保存ができないが、物理耐久あり／めっちゃ速い
Webの勉強はじめてみた その17～Git編①～

N予備校「プログラミング入門Webアプリ」を受講しています。
今回は第2章14,15節です。

<h2>git と GitHub</h2>
:::note
git : バージョン管理を行うソフトウェア
github : gitを利用したWebサービス
:::

<h3>gitのインストール</h3>
```
sudo apt update
sudo apt install git
```
apt(パッケージマネージャ)をアップデートしてgitをインストール

<h3>SSHでGitHubと通信</h3>
:::note
パスワード認証 : ユーザー名とパスワードでの認証
公開鍵認証 : ユーザー名と公開鍵で認証
:::

今回は公開鍵認証。

```
秘密鍵と公開鍵の生成
ssh-keygen
```

`.ssh`ディレクトリに秘密鍵`id_rsa`、公開鍵`id_rsa_pub`が作られるので、公開鍵を`cat`してgithubに登録する。

<h4>公開鍵と秘密鍵</h4>
:::note
秘密鍵（自分だけが持っている）
公開鍵（配布用の鍵、南京錠の錠前。秘密鍵でだけ開けられる錠前）
:::

相手と通信する際に、相手は公開鍵を使って情報を暗号化(鍵を閉める)、 
受け取る自分は秘密鍵を使って情報を復号(鍵を開ける)。
⇒秘密鍵がわからなくても公開鍵の鍵を閉めることはできる。


イメージはなんとなくわかった気がしてるだけかもしれない。

<h3>clone</h3>

:::note
clone : GitHubのリポジトリからローカルにデータをもってくる
:::

内部的にはGitHub上の`fork`と同じ動きをしているらしい。

<h4>GitHubからSSH接続用のURLをコピーしてくる</h4>

```
git clone git@github.com:GitHubアカウント名/ファイル名.git
```

<h2>pull</h2>
GitHubから最新データの取得

```
git pull origin gh-pages
```

:::note
origin : cloneを行った際にその元となったリモートリポジトリはデフォルトでoriginという名前になる
:::

`gh-pages`はブランチ。
`pull`で最新のバージョン取得。

<h2>push</h2>
リモートからローカルと違い、ローカルからリモートの場合コミットに段階がある。

<h3>コミットした際のユーザー情報を登録</h3>

```
git config --global user.name "your name"
git config --global user.email xxxx@xx.xx
git config --global core.editor "vim"
```

:::note
--global : どのリポジトリでもこの情報を使う
--local : 特定のリポジトリだけでこの情報を使う
:::

<h4>設定の確認</h4>
`git config -l`
登録したユーザー情報を確認できる。

<h3>ローカルにリポジトリ作成</h3>

```
git init
```
カレントディレクトリに`.git`ディレクトリが作られる。

```
git add filename
```

ワークツリーからインデックスに追加する(ステージング)
`git add .` でカレントディレクトリのすべてのファイルが対象となる。

:::note
ワークツリー : ローカルで作業しているディレクトリ
インデックス : リポジトリにコミットする前の段階
:::

<h4>変更状況の確認</h4>

```
git status
```

<h3>コミット</h3>

```
git commit -m "コミット内容の説明"
```

`-m` オプションがない場合、vimの画面が開く。

:::note
github へのコミットは、githubにも新しくリポジトリを作る必要がある。
:::

GitHub上でリポジトリを作成⇒SSHでの`push`コマンドをコピーしてくる。

```
git remote add origin git@github.com:ユーザー名/ファイル名.git
git branch -M main
git push -u origin main
```

`git remote add origin XXXXXXX`
リモートリポジトリのoriginはこのGitHubのアドレスのリポジトリを指す。

`git branch -M main`
デフォルトのブランチをmainにする。

`git push -u origin main`
ローカルの変更をリモートに適用する。
`-u` は次回以降は省略した場合自動でこの設定でpushするというオプション

<h3>タグの設定</h3>
コミットした内容にタグをつける。
バージョンをつけることが多いらしい。
`git tag タグ名`
タグを`push`
`git push --tags origin main`


<h2>まとめ</h2>
数年前に学習したときはいまいちピンと来てなかった`git`というかバージョン管理の仕組みだったけど、以前の仕事でTFSを使っていたせいかだいぶ感覚的にもわかるようになってた。
`push`の工程が長く感じたけど、多分慣れたらそうでもなくなるんだと思われる。
3点の座標から角の大きさと回転方向を求める

#はじめに

この記事は、3点の座標を元にそれらの点が作り出す角の大きさと、点の順序が決まっている際の角の回転方向を求める方法を紹介します。

#何に使うのか？

以前に4つの点が与えられた際に出来上がる図形についての記事（[リンク](https://qiita.com/tf_okrt/items/f108e8459f860dbfaf96)）を書きましたが、座標空間上で図形を得た後に出来る事柄の一つとして、

・図形を構成する点以外の点が図形の中にあるのか外にあるのかを判定

というものがあります。

この「内外判定」の手法に一つに「Winding Number Algorithm」という手法があり、以下の手順で内外判定を行います。

1. 内外判定を行いたい点 $ P $ と対象となる領域の頂点 $ V_0, V_1, ..., V_n $ をそれぞれ線で結ぶ。
2. 反時計回りを正、時計回りを負として$ ∠V_0PV_1, ∠V_1PV_2, ..., ∠V_{n-1}PV_n, ∠V_nPV_0 $ の合計 $ wn $ を計算する。
3. $ wn \geq 2\pi $ の場合、点 $ P $ の周りを図形が取り囲んでいることになるので内側の判定となる。逆に、外側となる場合は角度が相殺されるので $ wn = 0 $ となる。

例：内側の点と外側の点
![回転角.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553087/7993aa98-3fd0-cf97-5148-bb3949007dc9.png)

※詳しい内容や境界に点が存在する場合などについては話が逸れるため、自身で調べてみてください。

この手順の2.で触れている手順を実行するために点の座標から角の大きさと回転方向の二つを計算する必要があります。

#角の大きさを求める

角の大きさの求め方としては、$ arcsin(x), arccos(x), arctan(x) $ などが存在します。
今回は点の座標が分かっているため、ベクトルから算出できる $ cosθ $ を用いて $ arccos(cosθ) $ で角度を求めます。

例として、点$ P, V_0, V_1 $の座標を$ (1, 1), (3, 1), (2, 2) $とした際の$ ∠V_0PV_1 $について計算してみます。

まずは、$\vec{V_0P}, \vec{V_1P}$ を求めます。

```math
\vec{PV_0}=(3-1, 1-1)=(2, 0) \\
\vec{PV_1}=(2-1, 2-1)=(1, 1)
```

ベクトル $ \vec{a}, \vec{b}$ がなす角$ θ $ の $ cosθ$ は

```math
cosθ=\frac{\vec{a}⋅\vec{b}}{|\vec{a}||\vec{b}|}
```

で求めることができるため、$ cos∠V_0PV_1 $は、

```math
cos∠V_0PV_1=\frac{\vec{PV_0}⋅\vec{PV_1}}{|\vec{PV_0}||\vec{PV_1}|} \\
=\frac{2⋅1+0⋅1}{\sqrt{2^2+0^2}\sqrt{1^2+1^2}} \\
=\frac{2}{2\sqrt{2}} \\
=\frac{1}{\sqrt{2}}
```

となります。

ここから更に $ arccos(cosθ)$ を計算する必要がありますが、実際の $ cosθ $ は角の大きさを綺麗に計算できる値でないことの方が圧倒的なため、お使いのプログラミング言語に存在する $ arccos $ の関数を用いることになります。



#角の回転方向を求める

今度は角の回転方向が反時計回り（+方向）なのか時計回り（-方向）なのかを求めます。

2つの3次元ベクトル $\vec{a}, \vec{b}$ から得られる外積 $\vec{a}×\vec{b}$ もまた3次元ベクトルであり、その特徴として、

・$\vec{a}, \vec{b}$ の双方と直行する
・$\vec{a}, \vec{b}$ からなる平面に対する向きは右ネジの法則で決まる

が挙げられます。

その為、図形を構成する点や内外判定の対象とする点が3次元空間上の $z=0$ の平面に存在するものと考えると、$ ∠V_{n-1}PV_n $ について、上記の特徴を以下の様に読み替えられます。

・$\vec{PV_{n-1}}×\vec{PV_n}$ はZ軸に対して並行なベクトルとなる（＝ x 座標、y 座標がそれぞれ 0 になる）
・角が反時計回りの場合は z の値は正の値になり、角が時計回りの場合は z の値は負の値になる

よって、$\vec{PV_{n-1}}×\vec{PV_n}$ の z 座標の値を計算し、その値の正負をそのまま角の回転方向として扱うことができることが分かります。

先ほどの例の点$ P, V_0, V_1 $を用いると、

```math
\vec{PV_0}×\vec{PV_1}=(0⋅0-0⋅1, 0⋅1-2⋅0, 2⋅1-0⋅1) \\
=(0,0,2)
```

となるので、$ ∠V_0PV_1 $ が反時計回りであることと z 座標の値の正負が一致しています。

#追記（12/28追加）：境界条件の検討
今回の内容でベクトルの内積、絶対値、外積を用いましたが、内外判定の対象となる点がランダムに与えらえる都合上、考慮すべき事項がいくつか存在します。

__1. 点が領域の頂点と重なる場合__

点$ P $が領域のある頂点$ V_k $と重なる場合、$ \vec{PV_k} = (0, 0) $ となるため、$ |\vec{PV_k}| = 0 $ となります。
ベクトルの絶対値が 0 となる場合、$ cosθ $ を解散する過程で分母が 0 となるため、角の大きさを計算することが不可能になります。

よって、点が領域の頂点と重なる場合には内と外のどちらに判定するかを事前に決めておき、アルゴリズム上で対象の点が頂点と同じ座標かどうかを検証して同じ座標と判別できた時点で判定を出す必要があります。

__2. 点が領域の辺上に存在する場合__

点$ P $が領域のある辺$ V_kV_{k+1} $上に存在する場合、外積を導くためのベクトルが逆方向となるため、$ \vec{PV_k}×\vec{PV_{k+1}} = (0, 0, 0) $となります。
外積のz座標の値が 0 となる以上、角の回転方向については反時計回りと時計回りのどちらに捉えることも可能です。

角の回転方向がどちらとも取れる都合上、$ wn $ の値は 0 にも $ 2\pi $ のどちらにもすることができるため、点が領域の辺上に存在する場合にも内と外のどちらに判定するかを事前に決めておき、外積のz座標の値が0となった時点で判定を出す必要があります。
ステータスバーに「位置情報を現在利用中」と表示させる

## はじめに

位置情報をバックグラウンドで取得している間、ホーム画面や他のアプリを使用中でもステータスバーに位置情報を取得中であることをユーザーに伝える方法です。GoogleMapなどで経路案内中に他のアプリに切り替えても画面上部が青くなるあれです。ステータスバーをタップするとアプリに戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777258/cc14ab1f-fbdb-8c51-9b37-4bdba7c09b19.png)

## 方法

CLLocationManagerで以下の指定をするだけです。位置情報を取得するためのコードや設定などは省略します。バックグラウンドになったらステータスバーが青くなってアプリケーション名と共にメッセージが表示されるようになります。

```Swift
let locationManager = CLLocationManager()
locationManager.showsBackgroundLocationIndicator = true
```

## 参考文献

「位置情報を現在利用中」でググってもなかなか目的のものが見つからなかったので以下のサイトからそれっぽいものを見つけて色々試してみました。
https://developer.apple.com/documentation/corelocation/cllocationmanager
【Python】Pythonの基本　～チュートリアル～

# 目的
Pythonの基礎知識をおさえる.

# 目次
Pythonとは
Python基本
コメントアウト
一行をコメントアウト
複数をまとめてコメントアウト
文字列の表示：print
四則演算
論理型（Boolean）
論理演算子：and, or
Boolean値の四則演算
比較演算子
文字列処理
Nullオブジェクト：None
変数定義
リスト型
定義
要素を追加
要素を除外
スライス操作
インデックスの確認
結合
ある要素が含まれているか確認
長さ
タプル型
定義
長さ
結合
スライス操作
ある要素が含まれているか確認
辞書型
定義
アクセス
キーの確認
ある要素が含まれているか確認
要素を追加
要素を削除
set型
定義
要素を追加
重複する要素の確認
四則演算
ある要素が含まれているか確認
条件処理：If文
反復処理：For文
反復処理：While文
例外処理
With文
書き込み
読み込み
イテレータ（Iterator）
関数
基本的な使い方
可変長引数：args, kwargs
無名関数：lambda
関数の繰り返し利用：map
条件抽出
内包表記
モジュール（Module）
クラス（Class）
定義
継承
複数の継承

詳しい解説とコードは、「[Pythonの基本　～チュートリアル～](https://www.nemotos.net/?p=4274)」をご覧ください。
【シェルスクリプト（bash）の基本　～チュートリアル～】

# 目的
UNIX系OS（Linux, Mac）における基礎知識をおさえる。
シェルスクリプトであるbash（バッシュ）の基本的な使い方をおさえる。

# 目次
シェルとは
シェルスクリプトとは
UNIX系OS（Linux, Mac）における基礎知識
パス（絶対パス・相対パス）
プログラミング言語は、英語の命令文に相当
ファイル名に日本語やスペースを用いない
bash基本
文字の表示（コマンド：echo）
Brace Expansionの使い方
変数（コマンド：変数=〇〇）
変数の定義
変数の利用
変数の配列処理
配列
配列の定義
配列の利用
現在いるディレクトリの確認（コマンド：pwd）
端末（ターミナル）の画面をクリア（コマンド：clear）
標準入力から変数を定義
条件分岐：If文（コマンド：if）
条件分岐：Case文（コマンド：case）
四則演算
リダイレクト（コマンド：> or >>）
ファイル内容出力（コマンド：cat）
ファイルのリスト一覧確認（コマンド：ls）
カウント（コマンド：wc -l）
パイプ [ | ]（コマンド：|）と検索（コマンド：grep）
テキストファイルの作成（コマンド：touch）
フォルダの作成（コマンド：mkdir）
ファイル・フォルダのコピー（コマンド：cp）
ファイルをコピー
フォルダをコピー：オプション（-r）必須
ファイル・フォルダの移動（コマンド：mv）
ディレクトリ移動（コマンド：cd）
ファイル・フォルダの削除（コマンド：rm）
ファイルの削除
フォルダの削除：オプション（-r）必須
反復処理：For文（コマンド：for）
反復処理：While文（コマンド：while）
関数（コマンド：function）
先頭の表示（コマンド：head）
末尾の表示（コマンド：tail）
ソート処理（コマンド：sort）
重複削除（コマンド：uniq）
文字列の切り出し・抽出（コマンド：cut）
区切り文字を指定して抽出
-d: 区切り文字指定
-f: フィールドの指定
文字のインデックスを指定して抽出
-c: 先頭からの文字数
文字列の置換（コマンド：sed）
数字の連番（コマンド：seq）
コマンドのレファレンスマニュアルを表示（コマンド：man）
ワイルドカード [ * ] （コマンド：*）

詳しい解説とコードは、「[シェルスクリプト（bash）の基本　～チュートリアル～](https://www.nemotos.net/?p=4261)」をご覧ください。
【脳画像解析のための環境構築】

# 目的
脳画像解析のための環境を構築する。

# 目次
1. 目的
2. はじめに
3. Lin4Neuroに必要なPCのスペック
4. Lin4Neuroを動かすためのソフト（VirtualBox）をインストール
5. Lin4Neuro（ovaファイル）をダウンロード
6. VirtualBoxに、Lin4Neuro（ovaファイル）をインポート
7. Lin4Neuroの設定
7.1. CPUとメモリ（RAM）の設定
7.2. 共有フォルダの設定
8. Lin4NeuroをVirtualBoxから起動
9. ソフトのインストール
9.1. 3D Slicerのインストール
9.2. ITK-SNAPのインストール
9.3. FSLのインストール
9.4. MRtrix3のインストール
9.5. FreeSurferのインストール
9.6. ANTsのインストール
9.7. SPMのインストール
9.8. CONNのインストール
9.9. 機械学習の環境構築
10. トラブルシューティング
10.1. 起動時に、「仮想マシン”L4N-1804-abis”のセッションを開けませんでした。」という警告


詳しい解説とコードは、「[脳画像解析のための環境構築](https://www.nemotos.net/?p=4193)」をご覧ください。
AWS Lambda クォータ

# コンピューティングとストレージ
Lambda では、関数の実行と保存に使用できるコンピューティングおよびストレージリソースの量に対してクォータを設定します。以下のクォータは、AWS リージョンごとに適用されており、引き上げることができます。詳細については、Service Quotas ユーザーガイドの「クォータの引き上げのリクエスト」を参照してください。

リソース|デフォルトのクォータ|引き上げることができる最大
---|---|---
同時実行数|1,000|数万
アップロードされた関数 (.zip ファイルアーカイブ) とレイヤーのストレージ。各関数バージョンとレイヤーバージョンは、ストレージを消費します。コードストレージ管理のベストプラクティスについては、Lambda オペレータガイドの Lambda コードストレージのモニタリングを参照してください。|75 GB|Terabytes
コンテナイメージとして定義された関数のストレージ。これらのイメージは Amazon ECR に保存されます。|「Amazon ECR サービスクォータ」を参照してください。|
Virtual Private Cloud (VPC) ごとの Elastic Network Interfaces|250|数百


# 関数の設定、デプロイ、実行

関数の設定、デプロイ、実行には、次のクォータが適用されます。変更することはできません。
>Lambda のドキュメント、ログメッセージ、およびコンソールでは、1024 KB を示すのに (MiB ではなく) MB 使用します。

リソース|クォータ
---|---
関数のメモリ割り当て|128 MB から 10,240 MB まで、1 MB 単位で増加できます。
関数タイムアウト|900 秒 (15 分)
関数の環境変数|4 KB (関数に関連付けられたすべての環境変数)
関数リソースベースのポリシー|20 KB
関数レイヤー|5 つのレイヤー
関数の同時実行数のバースト|500～3000 (リージョンによって異なります)
呼び出しペイロード (リクエストとレスポンス)|6 MB (同期)256 KB (非同期)
デプロイパッケージ (.zip ファイルアーカイブ) のサイズ|50 MB (zip 圧縮済み、直接アップロード)、250 MB (解凍後)このクォータは、レイヤーやカスタムランタイムなど、アップロードするすべてのファイルに適用されます。3 MB (コンソールエディタ)
コンテナイメージのコードパッケージサイズ|10 GB
テストイベント (コンソールエディタ)|10
/tmp ディレクトリのストレージ|512 MB
ファイルディスクリプタ|1,024
実行プロセス/スレッド|1,024

# Lambda API リクエスト
次のクォータは Lambda API リクエストに関連付けられています。

リソース|クォータ
---|---
リージョンあたりの呼び出しリクエスト頻度 (リクエスト数/秒)|10 x 同時実行クォータ (同期的、すべてのソース)、10 x 同時実行クォータ (非同期的、AWS 以外のソース)
非同期の AWS のサービスソースでの、リージョンあたりの呼び出しリクエスト数 (1 秒あたりのリクエスト数)|無制限のリクエストが可能です。実行レートは、その関数で利用可能な同時実行数に基づきます。「非同期呼び出し」を参照してください。
関数のバージョンまたはエイリアスあたりの呼び出しリクエスト頻度 (リクエスト数/秒)|10 x 割り当て済みのプロビジョニングされた同時実行数
GetFunction API リクエスト数|1 秒あたり 100 リクエスト
GetPolicy API リクエスト数|1 秒あたり 15 リクエスト
残りのコントロールプレーン API リクエスト数 (呼び出し、GetFunction、および GetPolicy リクエストを除く)|1 秒あたり 15 リクエスト

# 参考
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html
Amazon EC2へパスワード認証でSSH接続できるユーザーを追加する

## Goal

無料利用枠に含まれるAmazon Linux 2のAMIを使用して作成したAmazon EC2インスタンスへパスワード認証でSSH接続できるユーザーを追加する際の手順を示します。

## References

本文の手順は、次の文書を参考に作成しました。

* ["RHEL 8のCLOUD-INITの設定および管理"](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_cloud-init_for_rhel_8/index). Red Hat, Inc. Retrieved December 27, 2021.

## Pre-Requisites

本文の手順で使用するAMIの詳細は、次の通りです。

* Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type - ami-0218d08a1f9dac831 (64 ビット x86) / ami-09d4b65ff082c3c6a (64 ビット Arm)

## How To

### cloud-initの設定を変更する

`cloud-init` は、システムの起動時にクラウドインスタンスの初期化を自動化するソフトウェアパッケージです。インスタンスの起動時、EC2インスタンスへ次の変更を適用します。

* ホスト名の設定
* インスタンスへのパッケージのインストール
* スクリプトの実行
* デフォルトの仮想マシン動作の抑制

EC2インスタンスに加えた変更が、インスタンスの起動時に `cloud-init` により書き換えられてしまうことを防ぐため、動作抑制に関する設定を予め変更しておきます。

`/etc/cloud/cloud.cfg` をviエディタで編集します。

* `ssh_pwauth` を `false` から `true` へ変更し、パスワード認証をデフォルトで有効にします。

```text:/etc/cloud/cloud.cfg
ssh_pwauth: true
```

### sshdの設定を変更する

sshdでパスワード認証によるログインを有効にします。

`/etc/ssh/sshd_config` をviエディタで編集します。

* `PasswordAuthentication` を `no` から `yes` へ変更し、パスワード認証を有効にします。

```text:/etc/ssh/sshd_config
PasswordAuthentication yes
```

### ユーザーを追加する

パスワード認証でSSH接続できるユーザーを追加し、ユーザーへパスワードを設定します。

本書の手順では、ec2-userの代わりに、sudoでシステム管理をおこなえるユーザーを作成するため、`useradd` コマンドで `-G wheel` オプションを使用しています。一般ユーザーを追加する場合は、`-G wheel` オプションを使用しないでください。

```bash
> sudo useradd -G wheel manager
> sudo passwd manager
Changing password for user manager.
New password: PASSWORD
Retype new password: PASSWORD
passwd: all authentication tokens updated successfully.
```

追加したユーザーを確認します。

`useradd` コマンドで `-G wheel` オプションを使用していない場合、`wheel` グループへの所属と `su` によるrootユーザーへの切り替えの確認は不要です。

```bash
> grep wheel /etc/group
wheel:x:10:ec2-user,manager
> grep manager /etc/passwd
manager:x:1234:1234::/home/manager:/bin/bash
> sudo su manager
> sudo su

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for manager: PASSWORD
> exit
```

### sshdを再起動する

sshdの設定変更を反映するため、sshdを再起動します。

```bash
sudo systemctl restart sshd.service
```

### 追加したユーザーによるSSH接続を確認する

追加したユーザーを使用して、EC2インスタンスへパスワード認証によるSSH接続ができるかを確認します。
[HTTP] HTTPレスポンス

# HTTPレスポンス
HTTPレスポンスは、クライアントのリクエストを受けて、サーバで作成される。
HTTPレスポンスは以下の3つの要素から構成される。
①**ステータス**
②**HTTPヘッダー**
③**ボディ**
HTTPリクエストと同様に、**HTTPヘッダー**と**ボディ**の間には1行空行が入る。

## ステータス
ステータス行は、クライアントからのリクエストに応じてサーバが行った処理の結果を示す。
ステータス行の構成は、**HTTPのバージョン**・**ステータスコード**・**理由フレーズ**の3つの要素からなる。

```:例
HTTP/1.1 200 OK
```
ここでステータスコードとは、3桁の数字で構成され、リクエストの成功やエラーを示す。
例えば、アクセスしたウェブページが存在しない場合に表示されるメッセージの「```404 Not Found```」の```404```がステータスコードにあたる。
大まかなステータスコードの意味を下表に示す。

|コード |説明|
|---  |---   |    
|100番台|情報レスポンス|
|200番台|成功レスポンス|
|300番台|リダイレクト|
|400番台|クライアント側のエラー
|500番台|サーバ側のエラー|

各ステータスコードの詳細については、下記のMDNのページを参照。
[https://developer.mozilla.org/ja/docs/Web/HTTP/Status](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)

## HTTPヘッダー
HTTPヘッダーは、レスポンスに関する補足情報を指定する。
HTTPヘッダーの書式はリクエストと同じく、以下となる。

```
<フィールド名> : <内容>
```
ヘッダーのフィールドについては、下記のページを参照。
[https://developer.mozilla.org/ja/docs/Web/HTTP/Headers](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers)
ヘッダーフィールドには、リクエストとレスポンスどちらかだけで使用されるものと、両方で使用されるものが存在する。

## ボディ
リクエストに対する応答内容で、HTMLなどが記述される。
Private な Python のパッケージを扱うための GitHub CLI Extension

Private な Python のパッケージの管理に困ったので [`gh-pip-install`](https://github.com/utisam/gh-pip-install) という [GitHub CLI](https://github.com/cli/cli) の Extension を書いてみました。

https://github.com/utisam/gh-pip-install

Python のプライベートなパッケージを配布する方法はいくつかあります。

* [pypiserver](https://github.com/pypiserver/pypiserver) を運用する
    * サーバーの管理しんどい
* `pip install git+https://...` で Git のコードをそのままインストールする
    * `poetry build` とか CI で完成させるスタイルには不向き
    * `pyproject.toml` なら [pip v19 で対応済み](https://pip.pypa.io/en/stable/news/#v19-0)
* wheel (`.whl`) や egg (`.tar.gz`) を Private な場所に置いて配る
    * 一旦ダウンロードする一手間が面倒

今回は GitHub 上で `poetry build` で作ったコマンドラインツールのパッケージを社内に配布したかったので、 GitHub Release の Assets に置いて配布することにしました。インストールやアップデートは以下のような操作になります。

```shell-session
$ # 最新のリリースのファイル名を確認
$ FILENAME=$(gh release view --repo OWNER/REPO --json assets --jq '.assets[].name | select(test("\\.whl$"))')
$ # ダウンロード
$ gh release download --repo OWNER/REPO -p ${FILENAME}
$ # ダウンロードしたパッケージをインストール
$ pip install ./FILENAME
```

アップデートするたびに毎回これやってもらうのしんどいなぁ（GitHub Packages が対応してくれれば良いのだけど…）。というわけで上記 3 つのコマンドを 1 つにした [`gh-pip-install`](https://github.com/utisam/gh-pip-install) という [GitHub CLI](https://github.com/cli/cli) の Extension を作りました。

## 使い方

[GitHub CLI](https://github.com/cli/cli) をインストールした上で、さらに `gh extension install` でインストールします。

```sh
gh extension install utisam/gh-pip-install
gh extension upgrade pip-install # 更新
```

基本的には `gh pip-install --repo OWNER/REPO` で利用します。最新のリリースの Assets から `\.whl$` の正規表現にマッチするファイルを探してインストールします。

```sh
# 最新のリリースからインストール
gh pip-install --repo OWNER/REPO
# 内部の pip install に -U, -I, --force-reinstall を渡せます。
gh pip-install --repo OWNER/REPO -U
# タグを指定してインストール
gh pip-install --repo OWNER/REPO v1.0
# 内部で pip の代わりに pip3 コマンドを使う
gh pip-install --pip pip3
```
技術者のためのアセンブリ言語による乗算、除算

#乗算
```
;***********************************
;* #FFFF * 100 = #63FF9C
;***********************************
MAIN    START
        LAD     GR2,#FFFF
        LAD     GR3,100
        CALL    MUL32
        RET
;***********************************
; 乗算
;* GR1, GR2 <-- GR2 * GR3 
;***********************************
MUL32   START
		LAD     GR7,16
        LAD     GR1,0			; GR1を0に初期化する
;
LOOP    LD      GR6,GR2         ; GR2のLSBが立っていたら、GR1にGR3を加える
        AND     GR6,=#0001
        JNZ     LSBON1
        JUMP    CONT1
;
LSBON1  ADDL    GR1,GR3
;       JUMP    CONT1
;
CONT1   SRL     GR1,1           ; GR1とGR2をひとつのビット列とみなして、右シフトする
        JOV     LSBON2
;
        LAD     GR4,#0000
        JUMP    CONT2
;
LSBON2  LAD     GR4,#8000
;       JUMP    CONT2
;
CONT2   SRL     GR2,1
        OR      GR2,GR4
;
        SUBL    GR7,=1          ; 1ワード(16ビット)分、繰り返したか？
        JNZ     LOOP            ; いいえ（ループを継続する)
;
        RET
        END
```
#除算
```
;***********************************
; 除算
; 6553500(#63FF9C) ÷ 123  =  53280(#D020) ---　60(#3C)
;***********************************
MAIN    START
        LAD     GR1,#0063	; 被除数を格納する
        LAD     GR2,#FF9C
        LAD     GR3,123		; 除数を格納する
        CALL    DIV32
        RET
;***********************************
; GR1:余り,GR2:商 <-- GR1,GR2 ÷ GR3 
;***********************************
DIV32   LAD     GR7,16
;
LOOP    CPL     GR1,GR3		; GR1はGR3未満か？
        JMI     MINUS		; はい
;
        SUBL    GR1,GR3		; GR1がGR3以上ならば、①GR1からGR3を引き、
        LAD     GR5,#0001	; ②GR1とGR2をひとつにして左に1ビットシフトし、
        JUMP    CONT1		; LSBに１をセットする
;
MINUS   LAD     GR5,#0000	; GR1がGR3未満ならば、
;       JUMP    CONTI1		; GR1とGR2をひとつにして左に1ビットシフトし、LSBに0をセットする
;
CONT1   SLL     GR2,1
        JOV     MSBON
;
        LAD     GR6,#0000
        JUMP    CONT2
;
MSBON   LAD     GR6,#0001
;       JUMP    CONT2
;
CONT2   OR      GR2,GR5
;
        SUBL	GR7,=1		; 1ワード(16ビット)分、繰り返したか？
        JMI     FIN			; はい（終了する）
;           
        SLL     GR1,1
        OR      GR1,GR6
;
        JUMP    LOOP
;
FIN		RET
		END
```
[Windows] ffmpegでpng画像を出力するバッチファイルを作成

#前提
ffmpegをダウンロード＆インストールし、パスを通す。

#手順
1. 以下の通りに`output_png.cmd`ファイルを作成

    ```bat:output_png.cmd
    @echo off

    mkdir "%~dpn1"
    ffmpeg -i "%~f1" -vcodec png "%~dpn1/%%08d.png"
```

1. 動画ファイルを`output_png.cmd`にドラッグ＆ドロップ
1. 動画ファイルのディレクトリ内に動画ファイル名と同名のディレクトリが作成され、ディレクトリ内にpngファイルが出力される

#解説
ドラッグしたファイルと同名（拡張子を除く）のディレクトリを作成する。

```bat:3行目
mkdir "%~dpn1"
```

ffmpegを実行。

```bat:4行目
ffmpeg -i "%~f1" -vcodec png "%~dpn1/%%08d.png"
```

`"%~f1"`で引数に指定した動画ファイルのフルパスを指定。
`"%~dpn1/%%08d.png"`で前段で作成したディレクトリに8桁の連番で画像を出力するよう指定。
ffmpegでは`%08d`といった記述をすることで`8桁の数値の連番として出力`といった指定ができる。
バッチファイルから実行するため%記号はエスケープする。
ViSQOLを動かしてみた

##はじめに
MOSの自動算出にViSQOL（Virtual Speech Quality Objective Listene）というものがあるらしい。今回はこのViSQOLをWindows環境で動かしてみたのでその備忘録になります。

##ViSQOLとは何
MOSを基準スコアとテストしたい音声を比較して算出してくれるプログラムです。
MOSは1から5までの範囲があり、最高評価が５、最低評価が１となります。このスコアによって基準の音声にどれだけ近いかを示してくれます。

https://github.com/google/visqol

##環境
64bit windows10 バージョン21H1

##ビルド
bazelとgitをインストールします。
bazelのインストール手順については以下を参考にしてください。バージョンは3.5.0でインストールしました。

https://qiita.com/ma-szk/items/05bfc4d0c731071fdeec

gitのインストールは以下のリンクからインストールしてください。

https://git-scm.com/downloads

インストールが完了したらbazelをC++でWindows様に構築します。
構築にはMicrosoft Build Toolsが必要になります。もし、インストールしていない場合は以下のリンクからインストールしてください。自分はBuild Tools 2015をインストールしました。

https://www.microsoft.com/ja-JP/download/details.aspx?id=48159

インストールが完了したら環境変数を追加します。
システム環境変数を開いて新規をクリックします。
![cange00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/0eca298c-5b5e-f9ea-e16d-0a4e44cd75f8.png)

以下の変数を追加してあげましょう。
![change.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/62838482-9e4f-a2ac-4d9e-e14537f47d8f.png)

これでbazelの構築は完了です。

コマンドプロンプトを立ち上げてgithubからViSQOLをダウンロードしましょう。
自分は```C:\Users\（ユーザーネーム）```にダウンロードしました。
ダウンロードが完了したらViSQOLのファイルまでcdコマンドで移動しましょう。
![CMD02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/3a70a0b6-b5fd-2565-559c-02d46326d15b.png)
移動したら以下のコマンドを入力しましょう。
```bazel build :visqol -c opt```

処理が終了したら自動テストを行います。githubでは
```bazel test all_unit_tests```
で自動テストが行えると記載されていますがWindows環境だと「ファイルが見つかりません」エラーで失敗します。
そのため、以下のコマンドで自動テストを行いましょう。
```bazel test all_unit_tests --enable_runfiles```

無事終了したらVisqolの構築は終了になります。

##実行
コマンドラインでの実行方法を記載します。実行方法についてはGithubと同様のものを記載するため詳しくみたい方はそちらまで。

ViSQOLを実行するためにはオーディオモードとスピーチモードがあります。入力する音声がオーディオの場合、サンプリング周波数を48kHzに、スピーチの場合、サンプリング周波数を16kHzにしましょう。

###オーディオモードのコマンド
2つのファイルを比較し、それらの類似性をコンソールに出力するコマンド。
```bazel-bin\visqol.exe --reference_file "基準.wav" --degraded_file "テスト.wav" --verbose```



###スピーチモードのコマンド
2つのファイルを比較し、それらの類似性をコンソールに出力するコマンド。
```bazel-bin\visqol.exe --reference_file "基準.wav" --degraded_file "テスト.wav" --use_speech_mode --use_unscaled_speech_mos_mapping --verbose```

○追記
自分の環境では
```'bazel-bin\visqol.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。```
と表示される。そのため、コマンドの
```bazel-bin\visqol.exe```
の部分を
```bazel-out\x64_windows-opt\bin\visqol.exe```
と変更してあげると上手く行きました。

##終わりに
初心者であるため間違いが多少あるかもしれません。もし、間違えているところがありましたらこっそり教えてください。
この記事が誰かのお役に立てれば幸いです。
Windos11環境にて、ダブルクリック一発で7-Zipで解凍する（Lhaplus風味）

#####背景：
7-Zipは速くて好きだけど、zipファイルに関連付けしてもダブルクリックだけでは解凍されない。7-ZipのGUIが開くだけだ。
ダブルクリックで解凍してくれるのはLhaplusだが、7-Zipより遅いし、大きなファイルに弱い。
だから何とかして7-Zipによる解凍をダブルクリックで実行させたい。

#####やってみたこと(失敗)：
ググってみた。
ダブルクリックで解凍させるにはレジストリをいじればいいらしい。
レジストリを書き換えてみたが、成果なし。
あいかわらず、7-ZipのGUIが開くだけだ。

#####やってみたこと(成功)：
Rubyで7-Zipを呼び出して解凍させた。
Lhaplusのような快適な解凍ができた。

######以下の.rbファイルを作成した：

```
pasu = ARGV[0]
file = pasu.split("\\")[-1]
name = file.split('.')[0]
system("mkdir \"C:\\Users\\ユーザー名\\Desktop\\opend7z\\#{name}\"")
system("call \"C:\\Program Files\\7-Zip\\7zG.exe\" x #{ARGV[0]} -o\"C:\\Users\\ユーザー名\\Desktop\\opend7z\\#{name}\\")
system("explorer \"C:\\Users\\ユーザー名\\Desktop\\opend7z\\#{name}\"")
```

私は.rbファイルはVSCodeと関連付けさせているので、.batファイルを間に挟んで起動させることにした。

######.batファイルの中身：

```
"C:\Ruby27-x64\bin\ruby.exe" "C:\Program Files\7-Zip\Rubyファイル名.rb" %1
```

何だかひどい遠回りをしている気がするが、快適な解凍環境ができたのでヨシとする。
done is better than perfect.

追伸。ファイルアイコンが寂しくなったので、以下の方法でアイコンを変更した。
https://itojisan.xyz/settings/25324/#i-6
【完】結局のところ「パスを通す」って簡潔にどういうことなの？？

# 目的
本当に様々な参考書や記事で飽きるほどパスを通すということをする、かつその説明も行われてきたことかと思う。
だが、その時は理解した気になっていても忘れたり結局何っだっけ？となることが多い。
これはいわゆる#駆け出しプログラマー, #駆け出しエンジニア にはあるあるだと思う。
そこで結局「パスを通す」ということについて簡潔に説明していこうと思う。

# 「パスを通す」= ...?
**とあるプログラムをそのプログラム名だけで実行させるようにすること**
これに限るらしい。

# もっと詳しく！
例えばMySQLを実行するためには本当は
/usr/local/opt/mysql@5.7/bin/mysql
などの入力が必要である。
(which mysqlコマンドでフルパスの確認は行える)
だが！
パスを通すことで、mysqlと指定することで他の部分を自動的に保管してくれる。

ということです。すばらしいですね。
Mitakaはプログラム可能ってご存知ですか？

物理学アドベントカレンダー2021の遅刻組です。すみません。
アドベントカレンダーにかこつけた半分宣伝です。すみません。

### Mitaka ご存知ですか？
国立天文台4次元宇宙プロジェクトが開発・公開しているフリーソフト「Mitaka」はご存知でしょうか？現在観測されている宇宙をデータを基に再現し、自由に宇宙を旅することが出来るソフトです。

https://4d2u.nao.ac.jp/html/program/mitaka/

日本の天文教育においてデファクトスタンダードともなっているツールですが、求められる操作技能や天文知識にはハードルがあり、広く一般に使われているかというと疑問が残る状態が長年続いていました。

事態が変わったのが2020年2月20日に公開されたバージョン1.6.0に追加されたプログラミング機能です。これにより高度な操作技能がなくとも、用意された拡張プログラム[^1]を実行するだけでMitakaを楽しむ事が出来る様になりました。

筆者は日本天文教育普及研究会Mitaka WGの一員として、また野良のプログラマーとして、Mitakaのデバッグや改造、マニュアルの執筆をしています。以下のMitaka WGのサイトにマニュアル等が置いてあるGoogleドライブへのURLが掲載されています（システム上の問題で平文のみです。コピペでアクセスしてください）。

https://tenkyo.net/category/wg/mitaka/

今回は野良のプログラマーとして、Mitakaのプログラミング機能の紹介を簡単に行いたいと思います。筆者の所属先とは関係のない記事です。ご了承ください。

### ライセンス
Mitaka自体はフリーソフトですが、個人や教育機関の枠外での利用には許可が必要です。個人利用を超えて利用する際にはクレジット表示表示が求められます。詳しくは以下の2か所を確認してください。

* [Mitakaダウンロードページ](https://4d2u.nao.ac.jp/html/program/mitaka/#Download)
* [国立天文台：利用上のご注意](https://4d2u.nao.ac.jp/t/var/download/notice.html)

また、上記ページにも明記されてはいますが、Mitakaの「状態をファイルに保存」する機能を使用して生成されたファイルや、ユーザーが作成した拡張プログラム[^1]などはMitakaの利用規約に縛られず配布することができます。（この記事もその利用規約外の範囲で書いています）

[^1]: 「拡張プログラム」というのは筆者の勝手なネーミングです。 

### 拡張プログラムを実行してみよう
現在のMitakaには拡張プログラムのサンプルが同梱されています。Mitakaを起動し、メニューバーの「ファイル」から「コマンド定義ファイルを開く」を選択し、「sequence_sample_2.mcd」を開いてください。メニューバーのコマンドに「2020年6月21日の部分日食」が追加されていますので、クリックしてください。操作方法のガイダンスと共に部分日食の様子が再現されます。

プログラムは先述のMitaka WGのGoogleドライブ内や[筆者のGitHub](https://github.com/aDAVISk/Mitaka_1.7)にいくつか公開されています。これからも増やしていくつもりです。（今回GitHubに2035年9月2日の皆既日食のプログラムを追加しました。字幕を消すプログラムresetSubtitle.mcdと共にご利用ください）

### 拡張プログラムを作ってみよう
ここでは一番簡単な方法である、Mitakaの保存機能を使います。まずメニューバーの「離陸・着陸」より「離陸・着陸」をクリックし、宇宙に出てください。次に「ターゲット」より好きな天体を選んでください。選んだ天体の近くに移動したら、十字キーで位置を、PageUp/PageDownで距離を調整してください。良い絵が見つかればメニューバーの「ファイル」より「状態をファイルに保存」を選び、適当なファイル名を付けて保存してください。他の天体に行くなどしても、先ほど行った実行の手順で保存したファイルを読み込むと再現できます。

Mitakaは平文のテキストである拡張子.mcdのファイルを読み込み、その記述に従います。Mitakaのコードは命令の定義と呼び出しのみです。条件分岐やループ、変数設定、四則演算は出来ません（命令の再帰的呼び出しでループを行おうとすると無限に読み込みが発生し壊れます。デバッグ作業の時に真っ先に試しました）。各命令の詳しい内容はMitakaに同梱されているマニュアル（mitaka_manual_J.pdfとfeatures_v170a.pdf）やMitaka WGのGoogleドライブ内の各種マニュアル（特にMitaka171_ProgramingManual.pdfは筆者の力作です）をご覧ください。

Mitakaのプログラミング機能はチューリング不完全ですが、長年のユーザーとしてはやりたい事はかなり自動化できると感じています。問題は求められるコンテンツの量と質に対してプログラマーが圧倒的に少ないという現状です。

年に数度、講習会兼ハッカソン的なワークショップをMitaka WGで開催しています。筆者も講師の一人です。Mitakaの開発者である加藤氏も参加されるので、開発者に直に相談するまたとない機会でもあります。次回は一応2022年1月22日（土）の予定です（[Mitaka WGのFB](https://www.facebook.com/mitakaWG/)にて事前告知済みの情報だから問題ないはず）。
.NET6を使ってみた1

# はじめに
2021年11月 Microsoft社より「.NET6」が長期サポート(LTS)としてリリースされました。
「.NET Core」と同じようにWindowsはもとより、LinuxやMAC OSなどマルチプラットフォームで動作可能です。
また、同時に今までLTSであった「.NET Core 3.1」が2022年12月にサポート終了とのことで、これを機会に「.NET6」への移行を検討していきたいと思います。

- 参考：[.NET および .NET Core サポート ポリシー](https://dotnet.microsoft.com/ja-jp/platform/support/policy/dotnet-core)


## コンソールアプリで検証
前提として「.NET6」を利用するにあたり「Visual Studio 2022」もインストールします。

- 参考: [Visual Studio 2022](https://visualstudio.microsoft.com/ja/vs/whatsnew/)

### プロジェクトの作成
まずは、コンソールアプリケーション プロジェクトを作成します。

1. Visual Studioを起動し、「ファイル」->「新規作成」->「プロジェクト」
1. 「コンソールアプリ」を選択し「次へ」
1. プロジェクト名、場所、ソリューション名を入力し「次へ」
1. 「フレームワーク」で「.NET 6.0 (長期的なサポート)」を選択し「作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/421c94a2-a779-6d1f-0721-cf181a3082df.png)

プロジェクトの作成が完了すると、新しいテンプレートでのコードが作成されます。

``` CSharp
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
```

こちらは「最上位レベルのステートメント」、「暗黙的な using ディレクティブ」、「グローバルの using ディレクティブ」がテンプレートに採用されており、その効果によって、コードが簡略化(using、クラス、Mainメソッド等の簡略化)されています。それぞれについて、簡単に紹介していこうと思います。

#### 最上位レベルのステートメント
今まではMainメソッドを明示的に含める必要がありましたが、C# 9以降では、Mainメソッドを記載する必要がなり、コンパイラーが自動で、クラスとMainメソッドエントリーポイントを生成してくれます。
ここで困るのは、非同期(async/await)や起動引数(args)そして、プロセスの終了コード(return値)となるのですが、それぞれ、意識せずに利用可能です。

``` CSharp
// await
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");

// args
if (args.Length > 0)
{
    foreach (var arg in args)
    {
        Console.WriteLine($"Argument={arg}");
    }
}
else
{
    Console.WriteLine("No arguments");
}

// プロセスの終了コード
return 0
```

つまり、こんな関係性でコンパイル時に自動で解析してくれます。

|最上位レベルのステートメント|暗黙的なMainメソッドのシグネチャ |
|-|-|
| await 及び return | static async Task&lt;int&gt; Main(string[] args) |
| await  | static async Task Main(string[] args) |
| return | static int Main(string[] args) |
| await 及び returnなし| static void Main(string[] args) |

但し、この機能を利用したくない場合は、一旦フレームワークを「.NET 5」でプロジェクトを作成し、csporjを以下のように書き換えることで通常通りに「.NET 6」で実装できます。

``` XML
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework> <!-- ここを 下のようにnet6.0に書き換えます-->
  </PropertyGroup>
```

#### 暗黙的な using ディレクティブ
プロジェクトの種類に基づいて「using ディレクティブ」が自動的に追加されます。コンソールアプリの場合は、以下のディレクティブが暗黙的に追加されます。そのため、明示的にusingで指定せずに利用することが可能です。

- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net.Http;
- using System.Threading;
- using System.Threading.Tasks;

この機能を削除する場合は、csprojで「ImplicitUsings」を「disable」に設定します。

``` XML
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
```

#### グローバルの using ディレクティブ
プロジェクト全体に暗黙的なusingを追加したり削除する際に記載します。
具体的にはcsprojに以下を追加します。

``` XML
<ItemGroup>
  <Using Include="System.text" />     <!-- 追加 -->
  <Using Remove="System.Net.Http" />  <!-- 削除 -->
</ItemGroup>
```

## 終わりに
簡単に書けるようになったね。で終わらずに内部の仕組みを簡単に調べてみました。
まだ触れていませんが、NULL許容コンテキストやアプリケーションの設定ファイルの読み込みなども[次回](https://qiita.com/akihiro-nakano/items/c7b0278e1313b080bd64)に試していきます。
[JavaScript] flat関数の自作

タイトルの通り、flatを自作してみました。

Array.prototype.flat() と同じように depth のデフォルト値を1にしていますが、デフォルト値はundefined か 0 にして無限回まわす方がいいんじゃないかと迷うところです。

```js
const flatFull = (array) => flat(array, 0);

const flatOne = (array) => flat(array, 1)
```

可読性を高めるには、こんな関数書いておくのもいいのかもな。と迷いつつ。

## flatのコード

```js
const flat = (array, depth = 1) => {
  const _flat = (array) => {
    let iOffset = 0;
    for (let i = 0, l = array.length; i < l; i += 1) {
      const element = array[i + iOffset];
      if (Array.isArray(element)) {
        array.splice(i + iOffset, 1, ...element);
        iOffset += element.length - 1;
      }
    }
    return array;
  };
  if (depth <= 0) { depth = Infinity }
  for (let i = 1; i <= depth; i += 1) {
    const arrayLength = array.length;
    _flat(array);
    if (array.length === arrayLength) {
      break;
    }
  }
  return array;
};
console.log(flat([0, 1, 2, [3, 4]]));
// [0, 1, 2, 3, 4]

const arr2 = [0, 1, 2, [[[3, 4]]]];
flat(arr2);
console.log(arr2);
// [ 0, 1, 2, [ [ 3, 4 ] ] ]
flat(arr2);
console.log(arr2);
// [0, 1, 2, [3, 4]]

const arr3 = [[[0, 1], 2], [[[3], 4]]];
flat(arr3);
console.log(arr3);
// [ [ 0, 1 ], 2, [ [ 3 ], 4 ] ]
flat(arr3, 2);
console.log(arr3);
// [ 0, 1, 2, 3, 4 ]

const arr4 = [[[0, 1], 2], [[[3], 4]]];
flat(arr4, 2);
console.log(arr4);
// [ 0, 1, 2, [ 3 ], 4 ]

const arr5 = [[[0, 1], 2], [[[3], 4]]];
flat(arr5, 0);
console.log(arr5);
// [ 0, 1, 2, 3, 4 ]
```
【Unity】ラベルつきログ出力をラクに実装にする

# ラベル付きでログ出力するやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124429/4c4691e3-6cb4-e78c-aa6b-5f693134e3d1.png)

こういうやつです。[かっこ]で囲ってログの出どころが一目でわかるようにします。
ついでにConsoleウィンドウでフィルタリングできて非常に便利です。

この実装、`Debug.Log("[Hoge] " + fuga)`みたいなコードを書くのがシンプルですが、毎度これをやるのもかったるいものです。

# 楽にする

こういうインターフェースを作成します。

```csharp
public interface ILoggerSubject
{
    string LoggerName { get; }
}
```


次に、この`ILoggerSubject`に対して拡張メソッドを定義します。

```csharp
using UnityEngine;
using Object = UnityEngine.Object;

public static class LoggerSubjectExtension
{
    public static void Log(this ILoggerSubject sender, string message, Object context = null) =>
        Debug.Log($"[{sender.LoggerName}] {message}", context);
}
```

こうすると、`ILoggerSubject`を実装したクラスの中で `this.Log()`と書くだけでラベル付きでログが出力されます。

```csharp:Hoge.cs
public class Hoge : MonoBehaviour, ILoggerSubject
{
    void Start()
    {
        this.Log("Fuga");
    }

    public string LoggerName => "Hoge";
}
```

LoggerNameいっこ実装するだけで`Debug.Log`と遜色ない書き心地でログ出力できるのがイチオシポイントです。

最後にWarningとErrorにも対応します。ついでに、structから呼んだ時のboxing回避のためにジェネリクス対応をしておきます。

```csharp
using System;
using UnityEngine;
using Object = UnityEngine.Object;

public static class LoggerSubjectExtension
{
    public static void Log<T>(this T sender, string message, Object context = null) where T : ILoggerSubject
    {
        Debug.Log($"[{sender.LoggerName}] {message}", context);
    }
    
    public static void LogWarning<T>(this T sender, string message, Object context = null) where T : ILoggerSubject
    {
        Debug.LogWarning($"[{sender.LoggerName}] {message}", context);
    }
    
    public static void LogError<T>(this T sender, string message, Object context = null) where T : ILoggerSubject
    {
        Debug.LogError($"[{sender.LoggerName}] {message}", context);
    }

    public static void LogException<T>(this T sender, Exception exception, Object context = null) where T : ILoggerSubject
    {
        Debug.LogException(exception, context);
    }
}
```
【brew】「Error: Unknown command: cask」ってでるよね

久しぶりにbrewコマンドを使用したところ、brew caskが以下のエラーで通らなくなってしまいました。
```Error: Unknown command: cask
```

以前は使用できていたはずなのに何故だろうと思い、調べました。

##結論から言うと brew cask install は廃止された
caskの使い方を
```brew install XXXXX --cask
```
と変更すれば良かった。


##まとめると
caskコマンドの使い方が変更になった 

```
旧) $ brew cask install xxx
↓
新) $ brew install xxx --cask
```
Raspberry Piにnode-redを構築する

# 参考ページ
https://nodered.jp/docs/getting-started/raspberrypi

# 手順

```shell:console
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Running Node-RED install for user pi at /home/pi on raspbian


This can take 20-30 minutes on the slower Pi versions - please wait.

  Stop Node-RED                       ✔
  Remove old version of Node-RED      ✔
  Remove old version of Node.js       ✔
  Install Node.js 14 LTS              ✔   v14.18.2   Npm 6.14.15
  Clean npm cache                     ✔
  Install Node-RED core               ✔   2.1.4
  Move global nodes to local          -
  Npm rebuild existing nodes          ✔
  Install extra Pi nodes              ✔
  Add shortcut commands               ✔
  Update systemd script               ✔


Any errors will be logged to   /var/log/nodered-install.log
All done.
You can now start Node-RED with the command  node-red-start
  or using the icon under   Menu / Programming / Node-RED
Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

Started :  2021年 12月 27日 月曜日 14:43:32 JST
Finished:  2021年 12月 27日 月曜日 14:49:56 JST

You may want to run   node-red admin init
to configure your initial options and settings.
```

# サービス登録

```shell:console
$ sudo systemctl enable nodered.service

Created symlink /etc/systemd/system/multi-user.target.wants/nodered.service → /lib/systemd/system/nodered.service.
```


# つながりました

Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236501/188088a8-bc4b-f902-71e4-1fdf90d91986.png)