OmniAICreator/Qiita-1.07M huggingface dataset:
windowsでiverilog その111

#概要　

windowsでiverilogやってみた。
練習問題やってみた。

#練習問題

1から10までの和を、求めよ。

#サンプルコード

```

module sum #(parameter WIDTH = 8, parameter SIZE = 10)(output reg [WIDTH - 1:0] odata);
	integer i;
	initial
	begin
		odata = {WIDTH{1'b0}};
		for (i = 0; i < SIZE; i = i + 1)
			odata = $signed(odata) + $signed(i + 1);
	end
endmodule

module test();
	wire [7:0] odata;
	sum u(.odata(odata));
	initial
	begin
		$monitor("%d", odata);
	end
endmodule





```

#結果

```
55
```

以上。
IntelliJ IDEA で git remote 操作ができない

# 状態
- github を ssh 経由で使用している。
- IntelliJ IDEA 組み込みの git ui にてリモート関連操作 (push, pull等) を行うと次のようにエラーが出る。

```
	Update Failed
	CreateProcessW failed error:193
	ssh_askpass: posix_spawnp: Unknown error
	git@github.com: Permission denied (publickey).
	Could not read from remote repository.
	Please make sure you have the correct access rights
	and the repository exists.
```

- IntelliJ IDEA 組み込みの git ui にてローカルの範囲の操作 (commit, switch, branch等) はできる。
- ターミナルからのリモート関連操作はできる。

# 原因
OS の SSH-AGENT に SSH 鍵が登録されていない。

# 対応
`ssh-add` コマンドで鍵を SSH-AGENT に登録しましょう。

```powershell
PS C:\Users\hoge> ssh-add.exe   # 引数なしの場合 .ssh/id_rsa をデフォルトで指してくれるようです。
Enter passphrase for C:\Users\hoge/.ssh/id_rsa:
Identity added: C:\Users\hoge/.ssh/id_rsa (hoge@コンピュータ名)
```

# 参考
https://qiita.com/q1701/items/3cdc2d7ef7a3539f351d

https://qiita.com/Yarimizu14/items/6a4bab703d67ea766ddc

https://qiita.com/slotport/items/e1d5a5dbd3aa7c6a2a24
windowsでiverilog その110

#概要　

windowsでiverilogやってみた。
sinを出力するモジュール、書いてみた。
入出力は、浮動小数点(binary32)、範囲は、マイナスPIからPI、テーブルは、400個。


#サンプルコード

```
module test();
	reg clk,
		rst;
	reg [31:0] a;
	wire [31:0] o1,
		o2,
		o3,
		out;
	assign o1[22:0] = a[22:0];
	assign o1[30:23] = a[30:23] + 8'd6;
	assign o1[31] = a[31];
	assign o3 = o2 + 32'd200;
	sin u1(.n(o3), .out(out));
	f2i #(32) u2(.clk(clk), .ce(1'b1), .i(o1), .o(o2));
	initial
	begin
		$monitor("%h %h", a, out);
	end
	initial
	begin
		#0
			rst = 1'b0;
		#0
			clk = 1'b0;
		#10
			rst = 1'b1;
		#40
			rst = 1'b0;
		#4	a = 32'hc0490fdb;
		#4	a = 32'hc0490fdb;
		#4	a = 32'hc03ba866;
		#4	a = 32'hc02e40f1;
		#4	a = 32'hc020d97c;
		#4	a = 32'hc0137207;
		#4	a = 32'hc0060a92;
		#4	a = 32'hbff1463a;
		#4	a = 32'hbfd67750;
		#4	a = 32'hbfbba866;
		#4	a = 32'hbfa0d97c;
		#4	a = 32'hbf860a92;
		#4	a = 32'hbf567750;
		#4	a = 32'hbf20d97c;
		#4	a = 32'hbed67750;
		#4	a = 32'hbe567750;
		#4	a = 32'ha6000000;
		#4	a = 32'h3e567750;
		#4	a = 32'h3ed67750;
		#4	a = 32'h3f20d97c;
		#4	a = 32'h3f567750;
		#4	a = 32'h3f860a92;
		#4	a = 32'h3fa0d97c;
		#4	a = 32'h3fbba866;
		#4	a = 32'h3fd67750;
		#4	a = 32'h3ff1463a;
		#4	a = 32'h40060a92;
		#4	a = 32'h40137207;
		#4	a = 32'h4020d97c;
		#4	a = 32'h402e40f1;
		#4	a = 32'h403ba866;
		#4	a = 32'h40490fdb;
		#10
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule


```

#結果

```
xxxxxxxx xxxxxxxx
c0490fdb xxxxxxxx
c03ba866 xxxxxxxx
c03ba866 be3fe0e3
c02e40f1 be3fe0e3
c02e40f1 becb56f8
c020d97c becb56f8
c020d97c bf13338b
c0137207 bf13338b
c0137207 bf3d5877
c0060a92 bf3d5877
c0060a92 bf5c5997
bff1463a bf5c5997
bff1463a bf7232a6
bfd67750 bf7232a6
bfd67750 bf7e743a
bfbba866 bf7e743a
bfbba866 bf7edd26
bfa0d97c bf7edd26
bfa0d97c bf737871
bf860a92 bf737871
bf860a92 bf5e5ea3
bf567750 bf5e5ea3
bf567750 bf400747
bf20d97c bf400747
bf20d97c bf167918
bed67750 bf167918
bed67750 bed2b203
be567750 bed2b203
be567750 be4fa779
a6000000 be4fa779
a6000000 00000000
3e567750 00000000
3e567750 3e4fa779
3ed67750 3e4fa779
3ed67750 3ed2b203
3f20d97c 3ed2b203
3f20d97c 3f167918
3f567750 3f167918
3f567750 3f400747
3f860a92 3f400747
3f860a92 3f5e5ea3
3fa0d97c 3f5e5ea3
3fa0d97c 3f737871
3fbba866 3f737871
3fbba866 3f7edd26
3fd67750 3f7edd26
3fd67750 3f7e743a
3ff1463a 3f7e743a
3ff1463a 3f7232a6
40060a92 3f7232a6
40060a92 3f5c5997
40137207 3f5c5997
40137207 3f3d5877
4020d97c 3f3d5877
4020d97c 3f13338b
402e40f1 3f13338b
402e40f1 3ecb56f8
403ba866 3ecb56f8
403ba866 3e3fe0e3
40490fdb 3e3fe0e3
40490fdb xxxxxxxx

```

以上。
警告付き飲酒量＆お会計記録Webアプリ！  #Bootstrap #codepen #javascript #html

#もっと酒の種類増やせ。自分じゃ制御できないから警告して
はい。そうです。これは前回作成したWebアプリを使ってみた友人の感想（笑）
酒におぼれた彼女の姿を想像してやってください。

https://qiita.com/chihirokubota/items/a3ad831f59d1467ad1ac


#警告を追加＆デザインをポップに
今回はそんな酒飲み友人の声を受けて以下の改良を行いました。

https://amazing-banach-c7d875.netlify.app

①酒の種類を増やした。

②10杯以上は警告メッセージを入力する度に表示。

③デザインを黄色ベースのポップな感じにしてみた。

https://twitter.com/chihiroxedge/status/1457658208512733196?s=20


#酒の危険さは一律ではない
こだわりポイントとしては、***危険なお酒を赤いボタンで設置***したこと。
押すときにヤバい！となることを狙っている。

そして警告メッセージは何度も表示されることで、鬱陶しい感じ＆各々の「痛い目」を想像させる狙いだ。


#仕様

前回のCodePenのデザインを変更＋機能を追加して制作。

https://codepen.io/chihiroxedge/pen/porVRLV


#ドキドキの友人の感想は・・・

「なかなか派手な見た目になったね。***スマホで開いても映える***。」

「***酒の種類が増えてありがたい***、私はだいたいこれで飲み会突破できる。」

「***警告がうざい。けど根気負けしてそろそろ帰ろうって気持ちになるのかな***、飲み会行ってみないとわからない。」

「激しい飲み会のときに全部入力してると***スクロールだるくて見なくなりそう***。」

とのことでした。気に入ってくれたものの、実際の飲み会で使用してみないことには分からないようです。
ただ、デザインと酒の種類は（彼女の好みを追加したこともあり？）気に入ってもらえたのでよかったです！


#デザイン変えられるの面白い

前回はデザイン部分のHTMLはテンプレート通りに作成しましたが、今回はBootstrapを使用し、デザインをいろいろと試行錯誤してみました。

影を入れられるとは驚きです！

今後も、もっと目につきやすいデザインをBootstrapを使ってチャレンジしてみたいと思います！
メールサーバを構築したけどメール送信が出来ない

## はじめに
　久しぶりにハマりました。[docker mailserverでメールサーバを構築する](https://qiita.com/qiiChan/items/a44cfa4af283917a8f6e)で、メールサーバを構築したは良いものの、外部にメールが送信できませんでした。一応、解決したので備忘録として残しておきます。


## 環境と症状
### 環境
- aws上でdocker-composeを使用して、メールサーバを構築
- 独自ドメインは取得済み

### 症状
- 外部からのメール受信はできる
- メールを送信しても、届かない


## 原因
　結論を言うと、**プロバイダーが原因**でした。プロバイダー側が迷惑メール対策として、**指定したメールサーバ以外からのメール送信を禁止している**様でした。なので、送信サーバに**プロバイダーが指定したメールサーバ**を指定すると、送信できる様になりました。この仕組みのことを**Outbound Port25 Blocking**と言うそうです（知りませんでした）。一応、送信サーバを変えたからと言って、送信アドレスが変わるわけではありません。


## 設定方法

例えば、so-netの場合だと下記の様に設定する必要があります。

設定内容
メールアドレス　:　sample_mail@domain.local
パスワード　　　:　mailpass

プロトコル : IMAP

受信メール
　　サーバ名　　：　サーバのIPアドレス、または独自ドメイン名
　　ポート番号　：　143
　　暗号化方法　：　なし
　　認証方式　　：　通常のパスワード認証

送信メール
　　~~サーバ名　　：　サーバのIPアドレス、または独自ドメイン名~~
　　**サーバ名　　：　mail.so-net.ne.jp**
　　ポート番号　：　587
　　暗号化方法　：　なし
　　認証方式　　：　通常のパスワード認証

SMTP 認証
　ユーザー名：メールアドレス
　パスワード：メールアドレスパスワード

### 参照
[他プロバイダのメールの送信ができない（So-net の接続を利用した場合）](https://support.so-net.ne.jp/supportsitedetailpage?id=000012073#b)を参照してください。


## その他のプロバイダ

その他のプロバイダについても同様に設定すればOKです。[自宅からメールの送信ができない場合](http://web.tku.ac.jp/~densan/local/mail-outbound/mail-outbound.html)を参照してください。
jpholidayを用いた祝日の取り扱い

今回のお題
-
今回は`jpholiday`というライブラリを用いてpythonで祝日の情報を扱う方法について取り上げます。

目次
-

- jpholidayでできること
- 導入方法
- 利用例１〜祝日かどうかの判定
- 利用例２〜祝日名の取得
- 利用例３〜祝日の一覧取得

jpholidayでできること
-
jpholidayでできることは以下の通りです。

<dl>
<dt>祝日かどうかの判定</dt>
<dd>引数として与えた日付が祝日かどうかを判定します。</dd>
<dt>祝日名の取得</dt>
<dd>引数として与えた日付の祝日名を返します。</dd>
<dd>振替休日であれば"xxxの日 振替休日"という表記になります。</dd>
<dd>また、祝日でない場合には"None"が返されます。</dd>
<dt>祝日の一覧取得</dt>
<dd>一定期間内の祝日を一覧取得します</dd>
<dd>期間の指定方法に関しては、年単位・月単位・日付指定それぞれのメソッドが用意されています。</dd>
<dt>独自の祝日の追加・削除</dt>
<dd>独自の祝日を追加したり削除したりすることも可能です。</dd></dl>

今回は`独自の祝日の追加・削除`については取り上げません。

他の3つについてみていきます。

導入方法
-

```shell
% pip3 install jpholiday
```

```python
# importが必要
import jpholiday
```

祝日かどうかの判定
-

`is_holiday`メソッドを用いて祝日かどうかを判定します。

```python
import jpholiday
import datetime

print(jpholiday.is_holiday(datetime.date(2021, 1, 1))
# >>true
print(jpholiday.is_holiday(datetime(2021, 4, 2))
# >>false
```

祝日名の取得
-

`is_holiday_name`メソッドを用いて祝日名を取得します。

```python
import jpholiday
import datetime

print(jpholiday.is_holiday_name(datetime.date(2021, 1, 1))
# >>元旦

print(jpholiday.is_holiday_name(datetime.date(2018, 2, 12))
# >>建国記念日　振替休日

print(jpholiday.is_holiday_name(datetime.date(2021, 4, 2))
# >>None
# 祝日でない場合には"None"表記
```

祝日の一覧取得
-

指定した期間の祝日を一覧取得可能。

期間の指定には、`year_holidays`, `month_holidays`, `between`のいずれかを用いる。

```python
# 年間の祝日を取得
print(jpholiday.year_holidays(2018))
>>[(datetime.date(2018, 1, 1), '元日'), (datetime.date(2018, 1, 8), '成人の日'), (datetime.date(2018, 2, 11), '建国記念の日'), (datetime.date(2018, 2, 12), '建国記念の日 振替休日'), (datetime.date(2018, 3, 21), '春分の日'), (datetime.date(2018, 4, 29), '昭和の日'), (datetime.date(2018, 4, 30), '昭和の日 振替休日'), (datetime.date(2018, 5, 3), '憲法記念日'), (datetime.date(2018, 5, 4), 'みどりの日'), (datetime.date(2018, 5, 5), 'こどもの日'), (datetime.date(2018, 7, 16), '海の日'), (datetime.date(2018, 8, 11), '山の日'), (datetime.date(2018, 9, 17), '敬老の日'), (datetime.date(2018, 9, 23), '秋分の日'), (datetime.date(2018, 9, 24), '秋分の日 振替休日'), (datetime.date(2018, 10, 8), '体育の日'), (datetime.date(2018, 11, 3), '文化の日'), (datetime.date(2018, 11, 23), '勤労感謝の日'), (datetime.date(2018, 12, 23), '天皇誕生日'), (datetime.date(2018, 12, 24), '天皇誕生日 振替休日')]

# 月間の祝日を取得
print(jpholiday.month_holidays(2021, 3))

# 期間指定
print(jpholiday.between(datetime.date(2021,1,1), datetime(2021, 3, 19)))
```
戻り値はリスト形式で、さらに一つ一つの要素を見ると`(datetime.date型オブジェクト, 祝日名)`のタプルになっています。

このことを利用してforループで個別出力することも可能。

```python
for holiday in jpholiday.between(datetime.date(2021, 1, 1), datetime.date(2021, 3, 31))):
  print(f'{holiday[0].year}年{holiday[0].month}月{holiday[0].day}日は{holiday[1]}です。')

# >>2021年1月1日は元日です。
# >>2021年1月11日は成人の日です。
# >>2021年2月11日は建国記念の日です。
# >>2021年2月23日は天皇誕生日です。
# >>2021年3月20日は春分の日です。
```

以上です。
Cisco SD-WAN DHCP-PD/NAT66

2021年Cisco Systems 合同会社 社員有志 による Advent Calendar の記事の一つです。
https://qiita.com/advent-calendar/2021/cisco

更新もろもろ更新しましてオリジナルのリンクを↓に貼っておきます。

https://community.cisco.com/t5/tkb-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/sd-wan-ipv6-tloc-extension-ipv6%E7%92%B0%E5%A2%83%E4%B8%8B%E3%81%A7%E3%81%AE%E3%83%AB%E3%83%BC%E3%82%BF%E4%BA%8C%E9%87%8D%E5%8C%96/ta-p/4840624
Visual Studio2022のホットリロード機能で作る快適C#学習環境

# 概要
先日正式リリースされた[Microsoft Visual Studio2022](https://docs.microsoft.com/ja-jp/visualstudio/releases/2022/release-notes-preview)。その目玉機能のひとつ「ホットリロード機能」を活かしたC#の快適な学習環境（サンプルコードをいじりやすい環境）の作り方を紹介します

# ホットリロード機能とは
Visual Studio2022でプログラムを動かすのであれば(多分)言語関係なく使える「プログラムを止めることなくプログラムの変更を反映させる機能」です。
ReactなどのWeb系フレームワークではおなじみの機能ですが、これがC#やC++などの言語で実現できる点がポイントです

# 全体の流れ
- 手順1. **[公式ガイド](https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2022)** を参考にVisual Studio2022をインストールし、Visual Studio Intallerから「.NETデスクトップ開発」をインストールします(C#の一般的なインストールなので本記事では解説しません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/9fd3ce2f-9402-27ad-1f7e-ea085907fa8a.png)
- 手順2. 適当な場所にC#のコンソールプロジェクトを作ります
- 手順3. ホットリロード機能を有効にする
- 手順4. C#のサンプルコードを快適にいじれるようにする

# 手順2. コンソールプロジェクトの作成
メニューの[ファイル]->[新規作成]->[プロジェクト]を選んでプロジェクト作成ウィザードを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/711722e3-cc85-c905-5098-5d945167d9ad.png)
言語をC#にしてコンソールアプリを選択します()
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/1ca535d0-cfd9-e697-2bcf-d8b07cba4e00.png)
以降の設定は任意で作ればいいはずですが、.NETのバージョンに関してはC#9.0以上をサポートする必要があります(とりあえず.NET6を選んでおけばいいでしょう)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/d7f0c45c-3506-b3ef-344f-f5adb45f52c5.png)
プロジェクトが作られるとこんな感じでハローワールドメッセージが表示された `Program.cs` 
 が表示されているはずです

- C#9.0のトップ レベル ステートメントに対応していない場合は `class Program` のコードが記述されていますが、トップ レベル ステートメントに対応している場合は単にクラス関連の宣言が隠蔽されているだけなのでできる事は大きくは変わりません。
    - トップレベルステートメントに関してはハローワールドコードの1行目のコメントの **[リンク先の公式解説ページ](https://docs.microsoft.com/ja-jp/dotnet/core/tutorials/top-level-templates)** が分かりやすいかと思います

# 手順3. ホットリロード機能を有効にする
まずはファイルが保存されるたびにホットリロードが実行されるようにします。
ハローワールド表示をしている行にブレークポイントを付けてプログラムを実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/fe828c4d-4c7e-51ae-088b-8281c9069c63.png)

ブレークポイントで一時停止します。すると、ホットリロードのボタンが出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/5035c8ca-27c0-fc51-f735-00245807d4ce.png)
ホットリロードボタンの右側にある下矢印をクリックし、「ファイルの保存時のホットリロード」を有効にします。これで実行中にファイルを変更すると自動で変更が反映されるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/733b6e2b-5a8e-70a2-9002-7f948ac5a28c.png)

# 手順4 C#のサンプルコードを快適にいじれるようにする
まず `Program.cs` を以下のように変更します。

```csharp
void sampleProgram()
{
    // 好きなコードを書いてください。
    Console.WriteLine("Hello, world!");
}

while (true)
{
    sampleProgram();    // サンプルコードを呼び出し
    Thread.Sleep(1000); // 実行感覚(サンプルコード自体に時間を要するなら不要)
}
```

コードをいじる場所はトップレベルとは別の関数にする必要があります。
トップレベルに書いたコードにはホットリロード機能は機能しません。
多分ホットリロード機能が関数を実行していない時に差し替えを行う機構になっているのだと思われます。

あとは実行して、`sampleProgram()`をいじると実行が止まることなく更新が効いているのが確認できるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/8b02a796-5593-a287-a2eb-9dffc7a9d164.png)

# まとめ
今回の環境を作ると任意のサンプルコードをコピペし、色々いじって動作を確認するのがとても楽になるかと思います。
よいコーディングライフを！
【JavaScript】反復処理③　for...ofと反復可能性


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/b28d5f9e58a3b065dad3

#目的

* 反復処理についての理解を深める

#本題
###1.for...ofと反復可能性

**for...of**とはイテレーターを持つオブジェクトの反復操作を行う

**イテレーター**とは反復操作を行うときに使うオブジェクトのこと
→反復可能オブジェクト

```ex.
String,Array,Map,Set,arguments  etc....
`````

####例1

基本的な使い方

````js
// 配列を定義
const array = ['a', 'b', 'c'];
// for...ofを定義
// vの値に配列で格納されている値が渡ってくる
for(let v of array){
  // a b cと出力
  console.log(v);
}
`````

####例2

設定されていない値でも返す
arrayに4番目の値を取る

`````js
const array = ['a', 'b', 'c'];

// 4番目を定義する
array[4] = "e"

for(let v of array){
  // cの後にundefined　e と出力される
  // ３番目の値が定義されていないため
  console.log(v);
}
````

````js
const array = ['a', 'b', 'c'];

array[4] = "e"

// プロトタイプの値でも返却することはない
// methodメソッドがループで出現しない
Object.prototype.method = function(){}

// 配列のイテレーターではenumerableを参照していない
Object.defineProperty(array, 0, {
  // 配列の0番目（a）がループで返ってくる
  enumerable: false
})

const d = Object.getOwnPropertyDescriptor(array, 0);
// この結果もenumerableはfalseとなっている
console.log(d);

for(let v of array){
  console.log(v);
}
`````

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
【図解】クライアントのリクエストがサーバーに届くまで

#概要
クライアントが送ったリクエストが「どのような形」で「どのような経路」を通ってサーバーに届くのかを図を用いてまとめました。詳細を理解するというよりは、図をもとにイメージを理解できることの役に立てればと思います。

[「ネットワークはなぜつながるのか」](https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84TCP-IP%E3%80%81LAN%E3%80%81%E5%85%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%88%B8%E6%A0%B9/dp/4822283119)を要約した内容になります。

#目次
- どのような形で送られるのか
    - データはパケットという単位に分割されて送られる
    - パケットはヘッダーとデータ本体で構成される
- どのような経路で送られるのか

##どのような形で送られるのか
####データはパケットという単位に分割されて送られる

インターネットを流れるデータはパケットという単位に分割されます。　　
１つのパケットのバイト数は決まっているので、総データ量/1つのパケットのデータ量分のパケットに分割される。
複数のパケットに分割する理由は、大きなデータを分割せずにインターネットに流すと、長時間１つの通信で回線を専有してしまって、他の通信ができなくなってしまうから。

####パケットはヘッダーとデータ本体で構成される
![スクリーンショット 2021-11-09 7.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495868/8f916adc-39d2-7cdc-2e3a-5272c2b36a71.png)


送りたいデータだけでは、インターネットを通して目的の相手に届かない。
なぜなら、__どこにそのデータを届けるのか、どのような方法で届けるのか等の情報がないから__。

そこで、そのような、送りたい本来のデータ（図で言うアプリケーションデータ）以外の情報をヘッダとして追加する。

ヘッダは段階的に追加される。
どのような段階を踏むかというと、TCP/IPモデルという階層モデルで、各階層でそれぞれヘッダが追加される。

TCP/IPモデルはよく郵便が届く過程に例えられるので以下の2つの例を対比させて表にしてみました。（あくまでイメージです）

- hoge.comというサーバにあるfoo.htmlというファイルを送ってもらうリクエストをする
- hogeさんに書類fooを送ってほしいと依頼する書留郵便を送る

![スクリーンショット 2021-11-09 8.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495868/001b4950-27f8-5c7d-3db8-a176a42a9a26.png)

上位の階層でヘッダがつけられ、下位の階層に渡される。このとき __下位の階層は上位の階層で追加されたヘッダもデータとして扱う__。
例えば、
トランスポート層でアプリケーションデータにTCPヘッダを追加してインターネット層に渡した場合、インターネット層はアプリケーションデータ＋TCPヘッダをデータとして扱う。
そこにIPヘッダなど自身の階層のヘッダを追加する。そしてまた下位の階層にデータを渡す。

__それぞれの階層は他の階層の情報は見ないので独立して処理を行っている__。
こうすることで、__通信の方法に柔軟性が生まれるメリット__が有る。

例えば、あるときはアプリケーション層はHTTPを使って、トランスポート層でTCPを使い、またあるときはトランスポート層はUDPにするなど。
郵便の例で考えると、本文や宛先は同じだけど、書留でなく普通の郵便を使うなど、必要に応じてその階層の部分だけを変えられる。


すみません、ごちゃごちゃと書いてしまいましたが、まとめると__インターネットに送るデータは相手に伝えたいデータ本体だけでなく、それを適切に届けるための付加情報（ヘッダ）がついた状態__でインターネットに送り出される。

# どのような経路で送られるのか
![スクリーンショット 2021-11-10 8.32.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495868/9684b166-401d-c89e-9d45-5c8b8de4c952.png)

###バケツリレーでパケットを宛先まで届ける
直接LANケーブルなどでつながっている場合は、直に通信ができるが、多くの場合そうではない。
そこで、パケットはヘッダについたIPアドレスを目指してルーターやハブを経由して届けられる。

例えば、上の図でローカルネットワークAにあるPC1（以下PC1）がローカルネットワークCのPC3（PC3）にパケットを届けたい場合を考える。
先程のhoge.comにリクエストをする例と対比させると、PC1がクライアントでPC3がhoge.comのサーバーと言うことになる。

順序としては
1.
PC1が宛先IPアドレスにPC3を、MACアドレスにルーターAを設定したパケットを作成する。
__IPアドレスには最終的な宛先、MACアドレスアドレスにはバケツリレーしてもらうための最寄りの中継先（ルーター）を設定する__。

2.
パケットを受け取ったルーターAが次の中継先であるルーターDにMACアドレスを書き換える。
__書き換えるのはMACアドレスのみ__

3.
ルーターDがパケットを受け取りルーターCにMACアドレスを書き換える。
ルーターには宛先IPアドレスに応じてどの次の中継先はどこかわかるように、__宛先IPアドレスと次の中継先のMACアドレスの対応表のようなものがある__ので、ルーターBではなく、ルーターDに中継できる。

また、上の図ではインターネット部分にルーターが簡略化のため１つしかがないが、__実際には多数のルーターがある__。
原理的には同じ要領でパケットを中継している。

4.
最終的にルーターDからPC3にパケットが届けられる。


#余談
ハブ（スイッチングハブ）は届いたパケットを中継する。
ルーターと違い自身にIPアドレスやMACアドレスアドレスはなく、パケットの宛先MACアドレスを元にパケットを振り分ける。
Djangoで最初にすることメモ

ディレクトリを作って、VScodeに反映させる
ターミナルを開いて、

```
conda activate djnagovenv
django-admin startproject ---project
cd ---project
python3 manage.py startapp ---app
```

---appディレクトリ内にurls.pyを作成

---appと同じ階層にtemplatesディレクトリを作成

setting.pyを編集

```
ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    '---app', # アプリケーションの登録
]

TEMPLATES = [
    {
        'DIRS': [BASE_DIR, 'templates'], # テンプレートの位置の設定

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'


```

project内urls.py

```
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mlapp.urls')),
]
```
【PHP】晩御飯ルーレットWebアプリケーション開発



PHPを独学で勉強しだして4ヶ月。。
そろそろポートフォリオがてらWebアプリケーションを作成してみようと動き出しました。

作っていくのは【**晩御飯ルーレット**】です。
今日の晩御飯を決めてくれるありがちなやつです笑（発想力が欲しいです。。）


# アプリ開発の流れ

今回は**初めてのアプリ開発**なのでしっかり流れに沿ってやっていきたいと思います。

1. 要件定義
1. 設計
1. 制作
1. テスト
1. 公開


◇環境

-  Mac
-  VS Code（エディタ）
-  MAMP（ローカル環境）
-  Xサーバー

## 要件定義

まずはアプリの**要件定義（要望と実現方法を定義）**から始めます。

◇アプリの概要

- 今日の夜ご飯の献立を決めてくれる
- カテゴリごとに絞り込める
- 食材でも絞り込める

◇アプリの目的

:::note info
今晩の夜ご飯に悩まないように
ポートフォリオ制作として
:::


## 設計
次にアプリを作る上での**フローチャートやアプリの設計、データベース設計**をまとめます。

◇アプリの流れ

1. （前準備）データベースにメニューデータを蓄積
1. ボタンをクリックされたらランダムにデータベースから取得
1. 絞り込みがあったら該当するものからランダムに取得

◇データベース設計

- メニューID
- メニュー名
- カテゴリ1（メインor副菜or作り置き）
- カテゴリ2（肉料理/魚料理/一品料理/デザート）
- 食材
- レシピ（作り方）

◇必要なページ

- トップページのみ

◇構成

- ルーレットスタートボタン
- カテゴリ絞り込みボタン
- 食材絞り込み用入力ボックス
- 晩御飯表示場所
- データベースから条件に合うものを取得

## 制作

◇実際のコーディング作業

1. HTMLで構造を作成（1.5時間）
1. CSSでデザイン/レスポンシブ対応（1.5時間）
1. PHPで機能を実現（1時間）
1. SQLでデータベースと連携取得（1時間）
1. データベースにデータ蓄積（ここが一番大変…）（∞時間）

本当ならPhotoshopとかfigmaでデザインカンプ作ってからのが早いんだろうけどスキルがまだないのでコーディングしながらレイアウトを考えるためHTML/CSSにやけに時間がかかってしまいました。

苦戦したところ

- SQLで複数の条件（入力で変化する）の指定
- 複数の条件に合致＋ランダムで抜き出す


## テスト
とりあえず最初に必要な機能を実装し、ローカル環境でテスト稼働してみました。
色々と予期せぬ挙動や不具合が出てきたので潰していきます。

- 複数条件を全て指定されなかった場合の処理
- ルーレット後の2回目の条件の保持
- UX（ユーザーエクスペリエンス）の向上


ついでにエスケープ処理をもろもろ施していきます。

- 入力値に悪意あるコードが埋め込まれた時
- 空白を入力された時

これらはhtmlspecialcher関数やPDOなどで実装しました。

## 公開

そして実際にできた**Webアプリケーション**をレンタルサーバーにアップロードして公開してみました。

![7DCE08EE-8B4F-4E12-A158-A1C388710288.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2264957/6385f03a-a848-2845-4027-895f7d6e65b9.png)

[晩御飯ルーレット](https://appdev-room.com/app-recipe)

まだ機能的には全て実装できていませんがゆくゆく追加していきたいと思います。

◇ゆくゆく実装したい機能

- レシピ（作り方）の表示
- 1週間分の献立も表示
- ルーレットのエフェクト
- セキュリティ面の向上？
- メニューをユーザーが登録できるように
- ユーザーが登録したメニューからルーレット開始

まだまだ勉強中ですのでおかしなところがあったら教えてもらえると嬉しいです！

ご覧いただきありがとうございました。
ng new my-appでのエラーを解決する方法

Angular公式の基礎講座のようなものをやろうとしたときに、``ng new my-app``というコマンドを叩いたらエラーが出た。

## ng new my-appを叩いた時のエラー
```
$ ng new my-app
^[[ANode.js version v16.2.0 detected.
The Angular CLI requires a minimum Node.js version of either v12.20, v14.15, or v16.10.

Please update your Node.js version or visit https://nodejs.org/ for additional instructions.
```
このようなエラー。翻訳してみるとこのような内容だった。

```
Angular CLIには、Node.jsのバージョンが最低でもv12.20、v14.15、またはv16.10のいずれかが必要です。

Node.jsのバージョンを更新するか、https://nodejs.org/ で詳しい説明をご覧ください。
```

## 解決手順
```
$ nodebrew ls-remote
インストール可能なバージョンを確認する。

$ nodebrew install-binary v16.10.0
希望のバージョンをインストールする。　v16.10.0をインストールした。

$node -v
v16.10.0

これでv.16.10.0というバージョンをインストールすることができた。
```
これでngコマンドというものが使えるようになったっぽい。

## ngコマンドを実行してみる
```
$ ng new my-app
? Would you like to add Angular routing? Yes
```
おー。動くようになった。
Lubuntu18.04にxrdpで接続

# はじめに
SoftEther VPNで接続し、xrdpでWindowsマシンからDell OptiPlex 5060 SFFのUbuntu 18.04にアクセスしていました。Lubuntu 18.04のインストールにあわせて再設定しました。xrdpの前はX11vncを使ってUltraVNCで接続していましたが、うっかりエンターキーを押すとチャタリングが起きるのと、通信量が多めでしたのでモバイルで使用するのは怖かったです。VPN接続→Optiplex 5060に接続しつづけても操作しなければ（画面遷移がなければ）通信量がほぼ発生しないのがxrdpのいいところです。

# 環境
- Dell Optiplex 5060 SFF (2019), core i5 8400, M.2 256GB SSD, 32GB RAM
- Lubuntu 18.04

# Lubuntu向けのxrdpの設定

Lubuntuにはlxdeの関連パッケージがインストールされていません。これらがインストールされていないと、RDPで接続しても、画面が真っ暗で映りません。またxrdpをインストールすることで、ローカルのキーボードとマウスの入力を受け付けなくなりますので、順番に解決する必要があります。

-  lxde関連パッケージのインストール

```shell-session
# sudo apt install openbox-lxde-session
```

- xrdpのインストール（xserver-xorg-input-allでローカルの入力可とする）

```shell-session
# sudo apt install xserver-xorg-core xorgxrdp xrdp
# sudo apt install xserver-xorg-input-all
```

# おわりに

Lubuntu側のIPを固定して、Windowsのリモートデスクトップ接続から無事接続できました。セッションはXorgを選択です。

# 参考
- [Lubuntuでlxde関連パッケージが必要](https://ararabo.com/2018-08-02/?p=7507)
- [xrdpでローカルの入力可](https://qiita.com/underwell111/items/c0069a4d39d3694e1d4a)
Droppedパケットの増加

# はじめに
業務でとある試験中、`Linux`サーバの受信側でDropカウンタが徐々に増加している問題があったので紹介します。

# 構成
各サーバ機器と繋がっている`Cisco`の`Catalyst`スイッチと、作業用に持ち込んだ**PC接続用HUB**が繋がっているだけの単純な構成です。

# 発生した事象
`ip -s link show`や`ifconfig`コマンドの実行結果には、パケット破棄した数を示す`dropped`の項目があり、通常は0となりますが、上記の構成で試験を行った際、HUBとPCを繋いだだけで特に何もしていないのに`dropped`カウンタが徐々に上がっていく事象が発生しました。

```shell:コマンド実行例
# ip -s link show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:28:aa:22 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    11104      130      0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    33559      111      0       0       0       0
                                ^^^^^^^
                                dropしたパケット数
```

# パケットドロップの原因
`dropped`カウンタは以下のような場合に上昇します。

- 処理しきれない量のパケットを受け付けたとき
- LANコントローラの故障
- 未サポートのプロトコルを受け付けたとき
    - 予期せぬVLANタグのフレームを受け付けた
    - IPv6を無効化したインタフェースでIPv6のパケットを受け付けた
    - EthernetヘッダのTypeに、サポートしていないプロトコルが含まれていた

# 原因調査
今回の場合、HUBとPCを`Catalyst`スイッチに繋いだだけで何も処理は行われていないので処理オーバーの可能性は無し。

また、複数ある`Linux`サーバ全てで`dropped`パケットが確認できたため、コントローラの故障も考えにくい。

ということで何か未サポートのプロトコルを受信しただろうと仮説を立て、サーバ側で`tcpdump`を仕掛けてみると`Realtek Layer 2 Protocols`という妙なパケットが表示されました。

![capture_01112021_074853.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/8da3bb3a-f821-c9fd-710d-fc096eae2d2d.jpeg)

# 問題解決
作業用PCを繋ぐために使っていたHUBはバッファロー製の**ループ防止機能**が付いたHUBとなり、HUBから定期的に流れる**ループ防止機能**のヘルスチェックパケットがサポートしていないプロトコルとして検知されていたようです。

使用したHUBの**ループ防止機能**は停止する機能が無かったため、別の**ループ防止機能**が付いていないHUBに繋ぎ変えて対処しました。

# おわりに
最近は数千円のHUBにもついている**ループ防止機能**ですが、各社独自実装だったりするようなので、サポートしていないプロトコルとして検知される場合があるようです。

今回の事象であればサーバ側で破棄されても特に影響がなく、`dropped`カウンタが上昇するだけですが、気になる方は**ループ防止機能**が動いている機器が無いか確認してみると良いと思います。
[Flutter]flutter_dotenvで環境変数を設定


プロジェクトのルートに.envフォイルを作成します。この中に環境変数を定義します。

```:.env
FOO=foo
BAR=bar
FOOBAR=$FOO$BAR
ESCAPED_DOLLAR_SIGN='$1000'
```

それでは環境変数を使えるようにするライブラリをインストールします。

以下、元のpubspec.yamlのassets部分です。

```yaml:pubspec.yaml
  # To add assets to your application, add an assets section, like this:
  # assets:
  #   - images/a_dot_burr.jpeg
  #   - images/a_dot_ham.jpeg
```

以下のように変更します。

```yaml:pubspec.yaml
  # To add assets to your application, add an assets section, like this:
  assets:
    - .env
```

gitでコードを管理されているかたは、コードがgitにpushされないように、.gitignoreファイルに.env*を追加します。.gitignoreがプロジェクトのルートに無いかたは、新しく.gitignoreファイルを作ってください。

```:.gitignore
.env*
```

それではmain.dartにライブラリをimportしていきます。

```dart:main.dart
import 'package:flutter/material.dart';

import 'package:flutter_dotenv/flutter_dotenv.dart' as DotEnv; // 追加
```

環境変数をloadしようとしたのですが、
うまくいかないです:disappointed_relieved:

```dart:main.dart
Future main() async {
  await DotEnv.load();
  runApp(MyApp());
}
```

これだとうまくいきました:joy:

```dart:main.dart
Future main() async {
  await DotEnv.DotEnv().load(".env");  
  runApp(MyApp());
}
```

main.dartで環境変数が使えるようになったかprint文で確認してみます。

```dart:main.dart
print('${DotEnv.DotEnv().env}');
```

無事コンソールに出力されました。

```
I/flutter (28320): {FOO: foo, BAR: bar, FOOBAR: $FOO$BAR, ESCAPED_DOLLAR_SIGN: $1000}
 ```

以下のように、取得したい環境変数を指定して、値が取得できることを確認します。

```dart:main.dar
print('${DotEnv.DotEnv().env['ESCAPED_DOLLAR_SIGN']}');
```

無事取得できました。

```
I/flutter (28320): $1000
```

今後は、APIのキーを環境変数にして、安全に値を取得できるようにしていきます。
Firebase Hosting等でドメイン所有権確認後にTXTレコードを消した場合の確認先

メモ代わりの記事です
2021/11時点

#やりたかったこと
- Firebase hostingからCloud App Engineにdeploy先を変えたらApp Engine側のURLに変わったのでドメインの向き先を変更したかった

#要約
- Google Cloud上に所有DNSの確認する場所はないはず、Cloud DNSも一応確認したが関係はない
- [ウェブマスターセントラル](https://www.google.com/webmasters/verification/home?hl=ja)で確認できる
    - `ドメイン` `DNS TXTレコード` `所有権の確認した日付、メール、結果、確認方法` `所有者` が見れる

#前提
- DNS等の知識はあまりない
- Firebase Hostingのカスタムドメイン接続に従って一度ドメイン所有権確認をした
- App Engineにdeployし、URLが変わったからドメイン認証もう1回が必要だろう、という
憶測でTXTレコードを消した　（TXTレコードは「所有権」の確認に使われてるから基本的に恐らく変える必要はない）

#ドメイン所有権確認後にTXTレコードを維持する必要はあるのか
- TXTレコードはドメイン所有権確認後も、確認状態を維持するためにDNSレコードは削除しないことが推奨されている（Google search consoleの所有権自動確認のモーダルより）
![スクリーンショット 2021-11-10 5.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296746/eeb5e3dd-a3de-ac58-1cc9-b5b0ca3c6c65.png)

消してTXTレコード再設定した後に気づいた
Webサイト運営している人なら常識なのかもしれない

Google Cloud上でカスタムドメイン接続を行う場合、一度所有権確認済みだとドメインがプルダウンの一覧に出るため
Google Cloud上で操作できると思ったが見当たらないしよくわからなかった
bootstrap5 ドロップダウンが機能するまで

#はじめに
railsチュートリアルをローカル環境で、2021年11月現在で最新のgemを使って進めています。
ヘッダーのドロップダウン機能を同じように実装してもうまくいかなかったので色々調べて機能するまでを備忘録としてまとめました。

#筆者の環境
Macbook Air(M1, 2020)
macOS Big Sur バージョン11.4

`ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]`
`Rails 6.1.4.1`
`bootstrap 5.1.0`

#ドロップダウンリンクをクリックしても表示されなかった
railsチュートリアルで使用されているbootstrap３と2021年11月現在で最新のbootstrap5では変更になったクラスが多いので[Bootstrap5公式](https://getbootstrap.jp/docs/5.0/getting-started/introduction/)と[チートシート](https://bootstrap-cheatsheet.themeselection.com/index.html)を参考にしながら似たような見た目になるように実装しています。

8.2.3 レイアウトリンクを変更する　にてドロップダウンを実装するところで、チートシートをコピーして貼り付けて、リンクなどを変えてうまくいったかみたときに、ドロップダウンのリンク（ここではAccount）をクリックしても表示されてほしい、Settings, Profile, Logoutのリンクが表示されませんでした。

#原因
ドロップダウンはCSSだけでなくJavaScriptも使用されているため、JavaScriptも読み込まなければいけないそうです。

>ドロップダウンは、トグル可能で、リンクのリストなどを表示するためのコンテキストオーバーレイです。これらは、含まれているBootstrapのドロップダウンJavaScriptプラグインでインタラクティブになります。

引用：　[Bootstrap5 dropdown](https://getbootstrap.jp/docs/5.0/components/dropdowns/#overview)

#解決法
>多くのコンポーネントでは、機能するためにJavaScriptの使用を必要がある。具体的には、独自のJavaScriptプラグインとPopperが必要。次のいずれかの \<script> をページの最後の方にある \</body> 終了タグの直前に配置して、ページを有効にする。

引用：　[Bootstrap5設置ガイド](https://bootstrap-guide.com/getting-started/introduction)

```application.html.erb
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
```

上記をapplication.html.erbに記述したらドロップダウンが機能しました！

#参考

https://pisuke-code.com/bootstrap-why-not-work-dropdown/

https://teratail.com/questions/167110
UnityHubをbetaにアップデートする方法

最新版Unityを使用する際，UnityHubをbeta版にアップデートする必要があります。
今回はその位置が分かりにくかったので場所の説明について行います。

## アップデートのやり方について

### 手順１
だいたいアカウントの近くにある歯車マークをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/a0690944-529f-fbaa-8ea2-9658fd76e11e.png)


### 手順２
環境設定が出てくるので，それの一番下にある詳細を押し，チャンネルを正式からベータに変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/1ae3ce46-2064-b129-8101-3031f81d7e87.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/b24d7fe3-d514-0583-928f-fddbab28d435.png)


### 手順３
UnityHubを再起動する。
再起動が終わると，今までのよりダークでカッコイイ感じのUnityHubが完成します。


## 欲しいバージョンのインストール
これもちょっと時間取られるところなので説明します。


### 手順１
インストール項目にある「エディターをインストール」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/6fd79ecf-993a-4a2d-7062-344396e9732f.png)


### 手順２
インストール画面のアーカイブを開き，ダウンロードアーカイブをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/e24bb852-926a-aac6-ba8e-ad26c0f0a54f.png)


### 手順３
いろいろあるので，欲しいものをUnity Hubでインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/b0b10202-b20a-8ec0-6468-3334f3b90e7f.png)


### 手順４
後はいつも通りの設定をしてインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/b69987fb-f452-fa4c-1266-d1c4be49859f.png)


## おわり
とまぁやり方さえわかれば一瞬なんですけど，こんな単純なことに気付かずちょっと無駄に時間を過ごしたので情報を共有します。
多くの人にとってこの記事は役に立たない産業廃棄物かと思いますが，それを必要とする人達がいるかもしれないのでご了承ください。
Windows10でPINコード＆Windows Helloが設定できない場合の対処法

#追記・完全解決しました
この記事の内容はところどころあってたり間違ってたりします。あんまりうのみにしないほうがいいかも。
近々記事を作り直そうと思います。

https://qiita.com/Laniakea/items/2415fc7fdb9da50784fa

作り直しました。

#「問題が発生しました」の表示
![スクリーンショット 2021-11-10 033511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694538/d8608bdf-7287-294d-21fd-36494660526d.png)
画像を見ていただいたほうが早いですが、「追加」のボタンがグレーアウトして押せなくなっており、エラーメッセージが表示されています。PIN、指紋認証、顔認証の三か所すべてが同じ状況です。「このオプションは現在使用できません」の後に詳細うんぬん言われていますが何の役にも立たない記事が出てきました。後でやり直してください、と言われていますが一年半待っても無駄でした（マジ）。ついでにサインイン時にマイクロソフトアカウントに設定された名前が表示されません（本来は表示されるらしい、まあそこは興味ないけど）。どうすんのこれ。

あ、補足しておきますと、私はPINが使いたいのではなく、PINを設定したアカウントのみが使用できる生体認証が使いたいだけです。なのでパスワードを短く打ちやすいものに変えて万事解決！というわけにはいきません（デバイス内から一切外部に送られないというPINだけのセキュリティ特性の恩恵にもそれではあずかれませんし）。まあQiitaを見るような方々なら百も承知な話だと思いますが、一応補足させていただきます。
#よく似た症状＆対処法を発見。しかし…
それがこちらです：Windows10でPINコードが設定できません

https://answers.microsoft.com/ja-jp/windows/forum/all/windows10%e3%81%a7pin%e3%82%b3%e3%83%bc%e3%83%89/7472b175-06a6-48ea-86e0-4df7c2837d77

対処法あるじゃんやったね！と言いたいところですが、致命的な問題があります。そうです、問題が発生したユーザープロファイルが消えてしまうことです（なんかこのフォーラムではさらっと消してますがやばくないですか。それとも、ここに明記されてないだけで消したプロファイルの内容を引き継ぐ方法とかあるんですかね、僕が知らないだけで）。
あ、途中に出てくるグループポリシー設定（gpedit）だのレジストリ編集だのCNG Key isolationだのsfc /scannowだのクリーンブートだのはもちろん一通り全部試しましたがダメでした（アップグレードインストールで治らなかったときはマジで絶望しました）。これで治ってくれれば何も問題なかったんですがね、はぁ（なんの成果も得られなかった手法について書くのはしんどすぎるので詳細は割愛させていただきます。興味がある方はフォーラムを熟読したりググったりお願いします）
#というわけでお待ちかね、何も犠牲にしない対処法
1.ローカルアカウントに切り替える（設定→アカウントより可能）
2.新たに適当なマイクロソフトアカウントを作成
3.そのマイクロソフトアカウントを紐づける

3.の際に生体認証＆PIN設定の案内が出るので、そこで設定できます。色々試していたら偶然ひらめきました。これなら多分何も犠牲になりません。
ただし、この方法にもいくつか欠点が存在します。まず最大の欠点として、無理やりPINを設定しているというだけなので「問題が発生しました」の表示は全く消えていません。そのせいで顔認証の精度アップはもちろん、PINの変更＆削除すらできません。PINが外部に漏れてしまったなどの理由で使用をやめたい場合は…さっきのkey isolationとやらでPINを使用不能にすればよいのでしょうか？結構厄介な欠点なのでご自身の責任で十分お気を付けください。
次に、PIN設定の案内が必ず出るとは限らないようです。あくまで推測になりますが、2020年ごろ(?)から新品のWindowsPCのセットアップ時にPIN設定の案内が出るようになりました。もしこの時に案内を見ていると、二回目の案内はないようです。当然、これでは全くお話になりません。何とかしてPINの案内を再表示できれば良いのですが…誰かたすけて
#考察：で、結局なんでこんなバグ起こるの？
フォーラムでも色々考察されていますが、はっきりとしたことはわかりません。が、どうもマイクロソフトアカウントが何らかの悪さをしているようです。僕の二台のマシンも同じマイクロソフトアカウントを使用していました。そういえばこのアカウントを作成したのは、フォーラムの作成日に近い2016年だったと思います。このころに作ったマイクロソフトアカウントには何かあるんでしょうかね。
ちなみに、原因と思われるマイクロソフトアカウントを切り離してローカルアカウントに切り変えるだけでは問題は解決しませんでした。一度設定したらたとえ切り離してもその影響からは逃れられないとか、もはや呪いのMSアカウントじゃん。
#環境
Windows10 Home 21H1（富士通Lifebook UH90-C3、2019年3月購入）2021年11月10日、上記の対処法で（一応）解決
Windows10 Pro 21H2（自作PC、2020年5月購入）同日に上記の対処法を実践するも、PIN設定の案内が出ず失敗
#おしまい
こんな駄文にお付き合い下しましてありがとうございました。どうやったら僕があこがれる方々のようないい記事がかけるんですかね…
「この方法を使えば一発ですべてが解決するのに、そんなことも知らんのか。常識だろ！」みたいなのがありましたら是非コメント欄でビシバシ指摘しちゃってください。よろしくお願いします。
初心者の自分から、右も左もわからない超初心者の方へ。


#目次
[1.プログラミング超初心者の方へ](#1-プログラミング超初心者の方へ)
[2.そもそもプログラミング言語って何なの…？](#2-そもそもプログラミング言語って何なの)
[3.僕らが普段見ているWEBサイトはどうやってできているの…？](#3-僕らが普段見ているwebサイトはどうやってできているの)
[4.MVCという考え方](#4-mvcという考え方)
[5.最後に](#5-最後に)



#1. プログラミング超初心者の方へ
この記事は自分の知識のアウトプット＆もし自分がプログラミングを始めたときこんな記事があったら良かったなと思ったことを、これから始める初心者の方のために書いています(僕もまだまだ初心者ですが・・・)
僕が最初に勉強を始めたときは本当に何もわからず、プログラミングに関する知識だけでいえば幼稚園児と何も変わらないレベルでした。
そんな右も左もわからないような初心者の方のために少しでもプログラミングの概念やらを理解してもらえればいいなと思って書いています。
なので内容としてはかなり初歩的で拙いものになってしまいますがその辺は悪しからず。。。

#2. そもそもプログラミング言語って何なの…？

まず、自分が初めに思ったことは言語ってなんなの…？ということです。
JavaScript やら Python やら PHP やら Ruby やら、、、調べるとキリがないほど出てきます。
派生言語などを含めたら1000語以上あるらしいです。僕はまずその時点で頭がパンクしました。

そんな僕が数か月勉強して思ったことは、プログラミング言語も結局は日本語や英語と同じ「言語」なんだなということです。
どの言語も最終的にできることはほぼ同じで、その過程や表現方法が違うのです。
例えば、挨拶でいうと「こんにちは」「Hello」「ナマステ」など同じ意味でいろんな表現方法があるように、プログラミング言語も同じことを出力するために様々な表現方法があるのです。
日本語だけでも方言などを入れたらたくさんの言語があるので、プログラミング言語が1000語以上あるのも納得です。
じゃあその中で特定の言語を選ぶ理由って何なの？ということなのですが、それは表現方法のシンプルさや、エラーやバグの少なさなど過程の中で自分の作りたいものや好みに合ったものを選ぶという感じなのかなと思っています。(あくまで個人的感想です。)

#3. 僕らが普段見ているWEBサイトはどうやってできているの…？

これも疑問でした。
始めは、HTML的なコードがひたすらズラーっと長文で一つのファイルに全てまとまっているものだと思っていました。
プログラミングってコードが何百行もビッシリ書かれているものなんでしょって。
多分同じように思っていた方も少なからずいるはず、、
ただやってみると全然違いました。

#4. MVCという考え方
実際には MVC という考え方があり、ユーザーに見える部分のコードを書くファイル、見えない部分を書くファイル、色々な指示を出すファイルなどそれぞれの役割をそれぞれのファイルに分けて書き、コードを書く僕らにも分かりやすく作られていました。
Twitterで例えると、ログイン画面を表示するページのコード、タイムラインを表示するページのコード、データベース(ツイートやユーザー情報を保存する場所)に関するコード、このURLにアクセスされたらこのページが表示されるように指示を出すというコードなど、それぞれのファイルをジャンル分けすることで、一つ一つがシンプルで見やすいコードになるのです。

複数人での分担作業なんかをする時にすごく便利です！

どれだけ分かりやすく綺麗なコードを書けるかというのもエンジニアの評価されるポイントの一つなので、MVCはとても重要です！！

#5. 最後に

とりあえず僕が最初に感じた疑問をいくつかまとめてみました。
あくまでもプログラミング歴数ヵ月のあまちゃんがアウトプット用に書いたものなので、100％記事の内容を鵜吞みにはしないでください…(^^;
ただ、これを最初に知っていればもう少しスムーズに色々理解できたのにな～と思ったことを書いたので、この記事によって少しでもプログラミングの敷居が低くなってくれれば幸いです…。

余談ですが、「敷居が高い」って、不義理・不面目なことなどがあってその人の家に行きにくいという意味らしいですね。
高級すぎたり、上品すぎたりして入りにくいみたいな意味で使われていること多いですよね～(今もこっちの意味で使いました…)

それでは失礼します！
Ubuntu 20.04 でLSD-SLAM

# きっかけ
卒論でvSLAMをFPGA使って高速化する研究をするために、LSD-SLAM のプロファイリングをしようと思ったのですが、LSD-SLAM が古いこともありビルド方法があまり見当たらなかったので自分用のメモ程度にビルドの手順を残してます。

# 環境
PC：ThinkPad-x13
OS: Ubuntu 20.04 focal
Kernel: x86_64 Linux 5.11.0-051100-generic
CPU: 11th Gen Intel Core i5-1135G7
ROS_DISTRO: noetic

# LSDーSLAM
LSD-SLAMについては[こちら](https://vision.in.tum.de/research/vslam/lsdslam?redirect=1)を確認してください。

# ビルド
https://github.com/mstampa/lsd_slam

上のREADMEに書かれているとおりに進めると問題なく進むと思います。ただ、ROSを理解していること前提での案内なので、[ここ](http://wiki.ros.org/ROS/Tutorials/CreatingPackage)のROSパッケージのビルドのチュートリアルを確認することをおすすめします。特にビルド後のパスを通すコマンドはgithubでは紹介がないので確認が必要です。

```shell-session
$ cd
$ mkdir catkin_ws
$ cd catkin_ws
$ mkdir src
$ git clone https://github.com/mstampa/lsd_slam.git ./src
$ cd ..
$ catkin_make
$ catkin_make install
$ source devel/setup.zsh #zsh 使っているshellに合わせてください
```

[オリジナル](https://github.com/tum-vision/lsd_slam)はROSのバージョンも、Ubuntuのバージョンも古くビルドが通りませんでした。QtのライブラリのバージョンやROSの仕様なんかも変わっていたり、OpenCV周りでもエラーを吐いていました。このときにQtのライブラリのリンクをいじった可能性があり１度目はビルドが通りませんでした。

```shell-session
$ sudo unlink /usr/lib/x86_64-linux-gnu/libQGLViewer.so
$ sudo ln -s  /usr/lib/x86_64-linux-gnu/libQGLViewer-qt5.so /usr/lib/x86_64-linux-gnu/libQGLViewer.so
```
を実行しQGLをqt5へのリンクに変更すると無事ビルドが通りました。

# 実行例
ビルドが通ったので https://vision.in.tum.de/research/vslam/lsdslam?redirect=1 で公開されているdatesetで実行を行いました。

ターミナルを３つ開き、１つ目で

```shell-session
$ roscore
```
を実行し２つ目で

```
rosbag record /lsd_slam/graph /lsd_slam/keyframes /lsd_slam/liveframes -o file_pc.bag
```

を実行し３つ目で

```shell-session
$ rosrun lsd_slam_core dataset _files:=<files> _hz:=<hz> _calib:=<calibration_file>
```
を実行します。`<files>`, `<hz>`, `<calibration_file>`は適宜置き換えてください。

|項目|説明|
|-----|------|
| `<files>` | 画像ファイルのリストか、フォルダ（アルファベット順になっている必要がある）|
| `<hz>` | フレームレート|
|`<calibration_file>` |キャリブレーションファイル|

# 結果
`rosbag`コマンドで出力されているファイルを対象に下記を実行してください。

```
$ rosrun lsd_slam_viewer viewer <rosbagコマンドで出力されたファイル>
```
![rosbagで出力したpointcloud](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269981/0e70d2b9-0662-5faf-e863-67f6316a6035.png)
twitcasting.tv の録画分をバックアップする

#ffmpeg でバックアップが取れん
執筆時点で大凡半年前位から、普通に index.m3u8 を抜くだけでバックアップが出来んくなりよった。
独自調査の結果ブラウザで index.m3u8 アドレスを発給しよる時間とユーザーエージェント及びリファラーで紐づけされ、アドレス発給から8時間以内に無効となる改変が有ったようじゃ。

#work shop
用意する物
ブラウザ：Firefox -> なんでもエエのじゃが「開発ツール」的なプラグインで m3u8 がスニッフィング出来よる事

```txt:例えば...
https://twitcasting.tv/*/movie/708959996
```
この場合、ブラウザを起動しよったら、f12 キーを押してパケット解析出来よる状況にさせてから、url をぶち込む。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152444/993b5cd1-f357-6e32-8572-94618b3aafba.png)
*.m3u8 の url が表示されよるトコにマウス持っていきよって、右クリック→コピー→fetchとしてコピーをクリック。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152444/cc4d78d0-5d03-bffa-ced4-c6e4b50f9a9c.png)

```text:クリップボードに伝送されよったデータはこんな感じ
await fetch("https://dl01.twitcasting.tv/tc.vod/v/708959996.0.2-1636474115-1636502915-a59e5041-2a48848310a33fe3/fmp4/index.m3u8", {
    "credentials": "omit",
    "headers": {
        "User-Agent": "Mozilla/5.0 (X11; FreeBSD amd64; rv:87.0) Gecko/20100101 Firefox/87.0",
        "Accept": "*/*",
        "Accept-Language": "ja,en-US;q=0.7,en;q=0.3",
        "Sec-Fetch-Dest": "empty",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "same-site"
    },
    "referrer": "https://twitcasting.tv/",
    "method": "GET",
    "mode": "cors"
});
```

必要な情報は揃ったけ、あとは ffmpeg にぶち込むのじゃが、仕様で header が複数行書けんけ、ユーザーエージェントとリファラーが同時に指定出来んけ、バッチファイルをでっち上げよる事で複数行の header が渡せられるんじゃ。

```bat:backup.bat
@echo off
setlocal EnableDelayedExpansion
set LF=^


ffmpeg -headers "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0"!LF!"Referer: https://twitcasting.tv/" -i "https://dl01.twitcasting.tv/tc.vod/v/708959996.0.2-1636471783-1636500583-a59e5041-b30b18da6965929a/fmp4/index.m3u8" -c copy 708959996.mp4
exit
```
ちなみに、set LF=^ から改行が2行有るのじゃが、これは御呪いじゃけ端折らんコト！
これで、バックアップが出来る筈じゃ👏

#index.m3u8 の url 法則(みたいなん)
```text
/tc.vod/v/708959996.0.2-1636471783-1636500583-a59e5041-b30b18da6965929a/fmp4/index.m3u8
```

セパレータが「-」で
/tc.vod/v/ の次に始まる .0.2 までの数字が、再生ページの url /*/movie/708959996 の数字(IDと思われる)と同一じゃ。
その次の二つがタイムスタンプで unixtime 表記で記述されちょって index.m3u8 取得しよった時間と、その8時間後が記述されよる。

```text:unix上で確認
% env TZ=JST-9 date -jr1636474115
2021年 11月10日 水曜日 01時08分35秒 JST
% env TZ=JST-9 date -jr1636502915
2021年 11月10日 水曜日 09時08分35秒 JST
```

残りの16進数は内部管理用のハッシュ値と思われる。
【Unity】AnimationClip.SampleAnimation には Animator コンポーネントが必要

本記事で述べたいことは**題記ですべて**なのですが、やや混乱する挙動があったので記事に残します。

# はじめに

AnimationClip には [SampleAnimation](https://docs.unity3d.com/ja/current/ScriptReference/AnimationClip.SampleAnimation.html) という API があります。
これは **AnimationClip 側からゲームオブジェクトにアニメーションを適用できる**という少し変わった機能の関数です。

ドキュメントではパフォーマンスの点から代わりに [Animation.Play](https://docs.unity3d.com/ja/current/ScriptReference/Animation.Play.html) を使うのが推奨と書いてありますが、それでもやむを得ず使いたい場面がありました。
エディタで実装して動作確認ヨシ！と思って**ビルドしたところなぜか動かなくなり**、ちょっとつまづくことになったわけです。

# エディタでは Animator がなくても動く

これが引っかかってしまった最大の原因なのですが、Unity エディタ上では Animator がなくても目的のアニメーションが動きます。
そのため、特に何もつけないまま開発が進みます…。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/52fbff6e-ba28-a370-55af-9e2e13a00beb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/e05e47e4-584f-7a31-9c9a-d427a5b9b587.png)

# ビルドでは Animator がないと動かない

そしてビルドした結果は動きません😭[^1]

[^1]: Windows Standalone しか見てないので他プラットフォームではもしかしたら動くかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/a9811a73-d7d5-a95b-9c38-d219efaf358e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/38275393-c900-0b28-e364-ffb7eb78f45e.png)

# 補足

この件について不具合っぽく見えたのでバグレポートしたところ、仕様とのことでした。ドキュメント作成の方々に伝えてくれたそうなので、いずれドキュメントに追記されるんじゃないかなーと思いますが、現状使用する場合は**必ず Animator を一緒に付ける**ようにしましょう。
.DS_Storeを再作成後にgitでcommitしたら、過去のcommit履歴変更ができなくなった話

# なにが起こったのか(端的に)
- .DS_Storeファイルを消して、再度作成されたものをGithub上にpushしたら、過去のcommitメッセージを変えることができなくなってしまった話。

## なにが起こったのか(全貌)
1. とあるフォルダをGithub上のリモートリポジトリに上げる際に間違えて **.DS_Storeもいっしょに上げてしまった。** 
1. あとで修正できると思い、しらばく放置していた。(ここまでは間違ってない)
1. さぁひと段落ついたから、Github上の.DS_Storeも消そうと思い、**ローカルリポジトリの.DS_Storeを消し、それをGithubにpushした**(これがすべての元凶)
1. 「あ、そういえば過去のcommitメッセージも誤字ってたからいま変えとこう」と思い、`git rebase`しようと思ったら、異変に気づく。
1. **「あれ、、.DS_Storeファイルがある。。？」**
1. よくよく調べてみたら、.DS_Storeファイルは何度消してもよみがえるアンデットらしい。
1. なので手段を変えて、.gitignoreファイルを作り、.DS_Storeファイルをgithub上に上げないようにした。
1. しかし、**すでにGithubに上がっている.DS_Storeファイルとローカルのファイルが異なると、conflictが永遠に出る始末**。
1. pull, merge, stash, rm cacheなどを組み合わせて、リモートの.DS_Storeファイルを消し、conflict突破
1. 「さぁ、過去のcommitメッセージの誤字を変えよう」とrebaseを用いて修正開始。
1. **過去のDS_Storeファイルと現在のDS_Storeファイルが違うと、conflictの嵐**　(<- いま)

# 解決方法の提案 (変えたいコミットメッセージは3つ前のものとする)
### ①通常の変え方(.DS_Storeはadd)

https://www.granfairs.com/blog/staff/git-commit-fix

```
$ git rebase -i HEAD~5
```
vimが起動し、以下のようなファイルが開くので変えたい箇所の`pick`を`edit`に変更

```
pick ea09821 コミットメッセージ1
pick ab9736c コミットメッセージ2
pick d74a8b1 コミットメッセージ3 // ここの先頭のpickをeditに変更
・
・
```
ファイルを保存したら、

```
$ git add .DS_Store
$ git commit --amend -m "新しいコミットメッセージ"
$ git rebase --continue
```

### ②通常の変え方(.DS_Storeは削除)
①のやり方の最後のrebase直前で

```
$ rm .DS_Store
```
にして、ファイルを削除

### ③rebaseでeditせずに、ほんとにコミットメッセージだけ変える方法

https://ucwork.hatenablog.com/entry/2019/01/01/121526

```
$ git rebase -i HEAD~5
```
vimが起動し、以下のようなファイルが開くので変えたい箇所の`pick`を`r`に変更

```
pick ea09821 コミットメッセージ1
pick ab9736c コミットメッセージ2
r d74a8b1 コミットメッセージ3 // ここの先頭のpickをeditに変更
・
・
```
ファイルを保存したら、コメントを変更するためのvimが開くので、修正

```
コミットメッセージ3 // これを新しいメッセージに変更

# Please enter the commit message for your changes. Lines starting
```

これを保存したら、コミットメッセージの変更が完了し、rebaseも統合される

### ④上の3つやったあとに以下の文章が出てくる場合

https://stackoverflow.com/questions/8523776/git-rebase-continue-complains-even-when-all-merge-conflicts-have-been-resolved/56942951

```
// $ git rebase --continue後
You must edit all merge conflicts and then
mark them as resolved using git add
```
。。。。いやいやいやいやconflict解消したわ！てきな。
そのときはこれをしましょう。

```
$ git rebase --skip
```
[git rebase --skip とは](https://qiita.com/KTakata/items/d33185fc0457c08654a5#git-rebase---skip)
### ⑤上でも無駄な場合、、

https://qiita.com/takashimelon/items/def769aaaa1d41cc44d4

じゃあもう前のcommitのときに.gitignoreファイル作って「その時から.DS_Storeは無視してましたよ感」を出そう。

```
$ git rebase -i HEAD~5
```
vimが起動し、以下のようなファイルが開くので変えたい箇所の`pick`を`edit`に変更

```
pick ea09821 コミットメッセージ1
pick ab9736c コミットメッセージ2
pick d74a8b1 コミットメッセージ3 // ここの先頭のpickをeditに変更
・
・
```
ファイルを保存したら、

```
$ vim .gitignore
```
以下の記述をして、保存して閉じる

```
.DS_Store
```
あとはコマンド操作

```
$ git rm -r --cached .
$ git commit --amend -m "新しいコミットメッセージ"
$ git rebase --continue
```

、、、これでもできなかったら、、、わからん。。
Windows Terminalをタスクバーから管理者権限で開きたい

Windows Terminalをタスクバーから管理者権限で開きたいと思いますよね


# 設定方法
## ショートカットの作成
ショートカットを作成して管理者権限で開くように設定する

Windows Terminalのpathをコピー

```
C:\Users\<user名>\AppData\Local\Microsoft\WindowsApps\wt.exe
```
デスクトップ上で右クリックをして
新規作成→ショートカット
を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146295/57099ea5-8b84-81f4-21cb-e5435eb1add6.png)
先ほどコピーしたpathを貼り付け
適当な名前を決める(Windows Terminalにした)

ショートカットが作成される

## 管理者として実行する設定
1. 作成したショートカット右クリックしてプロパティを開く
1. ショートカットタブを選択し，詳細設定をクリック
1. 管理者として実行にチェックをいれてOKしてさらにOK
1. 再びショートカットを右クリックして，タスクバーにピン留めをクリックすれば完了！


# わからないこと
なぜかスタートからデスクトップにドラッグ&ドロップしたショートカットだと管理者として実行がチェックできない．．．


# 参考
https://b.0218.jp/20160120115933.html
AtCoder226をやった(Java)

AtCoder226をやった。

##[A](https://atcoder.jp/contests/abc226/tasks/abc226_a)
四捨五入の問題、
JavaのRound関数で一発だった。
Roundを使って、もし"まるめ"などの事象に遭遇した場合、整数部と小数部で受け取り方を変えるのが良策な気がします。

```
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        System.out.println(Math.round(Double.parseDouble(str)));
    }
}
```

##[B](https://atcoder.jp/contests/abc226/tasks/abc226_b)
何通りのパターンが含まれているかを確認する問題。重複を一つとしてカウントする。
最後に-1しているが、リストに入れ込むときに最初の値を省いても多分大丈夫。

```
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        Set set = new HashSet();
        
        while (scan.hasNextLine()) {
            String str = scan.nextLine();
            set.add(str);
        }
        
        System.out.println(set.size() - 1);
    }
}
```

いつかC問題もJavaで解きたいな。
Jetpack Composeで左右に揃えた複数行のレイアウトを組む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53293/d7545a6c-2f9b-453d-7387-b922ce5b486e.png)
こういうやつ。全体の幅を固定値ではなく、もっとも幅の大きい行に揃えて、かつ他の行も左右に揃える。簡単そうに見えて地味に難しいやつ。

# 答え
IntrinsicSizeを使用することで簡潔に記述することができます。

```kotlin
@Composable
fun AlignedColumn() {
  Column(modifier = Modifier.width(IntrinsicSize.Max)) {
    Row {
      Text(text = "中華そば", modifier = Modifier.weight(1f))
      Spacer(modifier = Modifier.width(16.dp))
      Text(text = "800円")
    }
    Row {
      Text(text = "チャーシュー中華そば", modifier = Modifier.weight(1f))
      Spacer(modifier = Modifier.width(16.dp))
      Text(text = "1000円")
    }
    Row {
      Text(text = "味玉中華そば", modifier = Modifier.weight(1f))
      Spacer(modifier = Modifier.width(16.dp))
      Text(text = "900円")
    }
  }
}
```

# 解説
Intrinsicの使い方は公式ドキュメントがあるので、基本的にはこちらを参照しましょう。
https://developer.android.com/jetpack/compose/layouts/intrinsic-measurements

冒頭に挙げたコードの例では、Columnの中に3つのRowがあります。これを素朴に配置すると、次のようになると思います。
![Slice 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53293/9c2d4c60-ef95-895f-be75-4892e30f49f8.png)

ここで、`IntrinsicSize.Max`を適用すると、子の幅は最大の幅と同じになるように強制されます。したがって次のようになります。
![Slice 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53293/115a852b-074f-125d-3089-c7a9b3a17a75.png)

あとはRowの中身の問題に帰着するので、適切な余白を取るよう、`Modifier.weight(1f)`を指定してあげるだけです。
【Flutter】プラグインでiOSのrootViewControllerを取得する方法

#概要
FlutterプラグインでiOSネイティブ画面を利用するために、rootViewControllerを取得する方法を整理します。
[こちら](https://qiita.com/mkosuke/items/b384035e507ad0208c10)の記事を参考にさせていただきました(ただただ感謝✨✨)。プラグイン作成時にはself経由でrootViewControllerを取得できず、代替手段が必要になるため、その補足記事となります。

#環境

```shell-session
$ flutter --version
Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 18116933e7 (3 weeks ago) • 2021-10-15 10:46:35 -0700
Engine • revision d3ea636dc5
Tools • Dart 2.14.4
```

#実装
UIApplication経由でrootViewControllerを取得します。
これにより、プラグイン側で独自に画面を扱うことができます。
※念のため、nil時でも問題にならないようにguard let構文を採用しています。

```swift
guard let rootViewController = UIApplication.shared.windows.filter({ (w) -> Bool in
    return w.isHidden == false
}).first?.rootViewController else {
    result(failMap(errorMessage: "rootViewController is nil."))
    return
}
```
httpsの更新が出来なくなってる!!

# httpsが更新されない
certbot-auto を使ってたんだけど、色々変わりいつの間にか、snap 経由でやればいいよーに変わってたっていうお話。

更新アラートが来ており、あと数日でhttpsが使えなくなる!!
早くやっつけないと、このタスク！

違うことに時間を割きたいのよ。

# certbot を削除
```
# yum remove certbot
```
*管理者権限がない場合は、`sudo`を適宜つけてください

私は特定場所にcertbot-auto がいたので、これも削除
`rm certbot-auto`

# インストール・設定
アップデートかけると自動で入っていたのだけど、snapが必要になるので入ってない人は入れてね。
参考サイト：https://www.server-world.info/query?os=CentOS_8&p=snappy

```
# snap install certbot --classic
```

snapは自動で入ってたけど、リンクはついてなかったのでエラーを吐かれた

```code:エラー
# snap install certbot --classic
error: cannot install "certbot":
classic confinement requires snaps under 
/snap or symlink from     /snap to /var/lib/snapd/snap
```

なので、まずシンボリックリンクをつけます。
#####★`snap install certbot --classic` のコードが通るならこの作業はいらないよ！！

```
# ln -s /var/lib/snapd/snap ~/snap
```

####インストール
```
# snap install certbot --classic
# ln -s /snap/bin/certbot /usr/bin/certbot

手動更新
# certbot renew

新規追加
# certbot certonly --webroot -w /var/www/html -d ドメイン
```

新規追加は、メールアドレスなどの追加が必要。
参考サイト：https://www.server-world.info/query?os=CentOS_8&p=ssl

# 超便利！
今まで手動でやっていた(やってないけど) renew はしなくてOK
自動で更新タイマーが入ってるのです。

以上、思った以上に早く終わった。
メモの方が時間かかりましたーおやすみなさいましー
「法人番号システム Web-API」を利用するための覚書

#はじめに
法人番号のAPIを利用するための覚書です。

https://www.houjin-bangou.nta.go.jp/webapi/

#環境準備
1. 上記のサイトから利用規約を読んでアプリケーションIDの申し込みを行います。

1. 数日で英数字13桁のアプリケーションIDが、いかつい封筒で送られてきました。
![DSC_0238.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/445683fa-addd-c9a7-36d4-4aef07ba8d1e.jpeg)

1. Python環境を準備します。今回はAmazon lambdaを利用しました。

#実装
作成したコードです。法人番号を元にAPIから取得した会社名や県名を表示します。

```python:get_houjin_info.py
import json
import requests
import xml.etree.ElementTree as ET

def lambda_handler(event, context):
    url='https://api.houjin-bangou.nta.go.jp' + '/4/num'
    payload = {
        'id': 'AAAAAAAAAAAAA', #Application key
        'number': [
            '1180301018771', #Houjin Number
            '9020001031109',
            '8013401000626',
        ],
        'type': 12, #22:CSV(UTF8) 12:XML(UTF8)
    }
    # Request to API    
    r = requests.get(url, params = payload)
    # Parse XML to ET
    root = ET.fromstring(r.text)
    # Read ET
    for corporation in root.findall('corporation'):
        sequenceNumber = corporation.find('sequenceNumber').text
        corporateNumber = corporation.find('corporateNumber').text
        name = corporation.find('name').text
        prefectureName = corporation.find('prefectureName').text
        print(sequenceNumber,corporateNumber,name,prefectureName)

    return {
    'statusCode': 200,
    'body': json.dumps(r.text)
    }
```

実行結果です

```
1 1180301018771 トヨタ自動車株式会社 愛知県
2 8030001046841 株式会社本田技術研究所 埼玉県
3 9020001031109 日産自動車株式会社 神奈川県
```

#おわりに
同じアプリケーションIDで適格請求書のAPIも利用できるようです。

https://www.invoice-kohyo.nta.go.jp/web-api/index.html