OmniAICreator/Qiita-1.07M huggingface dataset:
credentials.yml master.key関係について

「credentials.yml」と「master.key」はRails5.2から追加された秘密情報を管理する仕組みです。

環境変数を使用せずにRails単体で秘密情報を管理できるため、ローカルの環境に依存しない大変便利な機能。

# 秘密情報の管理
開発をしていく中で、共有ツールを使用するのは当たり前、誰もがアクセスできて、プルリクなどをもらったり、自分にコードを見てもらうことが当たり前なオープンソース時代。

●そこで問題が発生
・自分の個人情報をさらけ出していると外部から攻撃され、個人情報が盗まれる可能性がある。

## 秘密情報とは
・例えば、AWSのアカウントだったり、データベースのパスワードなどです。
・他にも決済機能を入れている場合だったらstrpeやpaypalの秘密鍵や公開鍵がそれに値するでしょう。
・これらをGithubなどのバージョン管理システムでPublic(公共的)にみられないようにしないと大変なことになります。

# Rails5.2でcredentials.ymlが誕生
●作成手順と流れ
①クマさんがcredentials.ymlを作成
②Githubにプッシュ
③クマくんがサメさんにmastre.keyを共有する。
※AWS秘密鍵、AWS公開鍵
④サメさんがGitthubからプルしてcredentials.ymlを同期

※秘密鍵が追加・変更・削除があった場合に、いちいちローカルの環境を更新せずGithubなどのバージョン管理システムからコードを同期するだけで追加・変更・削除が可能になったため、コストが激減した。


# credentials.ymlの仕組み
入力された秘密情報の文字列をmaster.keyの文字列で暗号化し、credentials.ymlという鍵を作成します。

# credentials.yml.encとは？
●公開鍵と呼ばれるものです。
イメージとして、credentials.yml.encは家の施錠前です。
master.keyがないと情報を開示できないため、Githubなどへの公開が可能です。

# master.keyとは？
秘密鍵と呼ばれるものです。
rails newコマンドでRailsアプリを作成した人がmaster.keyを持っています。

イメージとして、master.keyはシンプルに家の鍵のものと考えてください。

家の鍵を道端におこないように、Githubなどへの公開してはいけません。

チームメンバーと共有したい場合は、　LineやSlackメールなどでチームメンバーだけに共有する。

# credentials.ymlの編集
●credentials.yml.encの文字列を直接変更せず、コマンドを使用してテキストエディタで開きます。
●ymlファイルのため、インデントに注意

・コマンドを使用してテキストエディタを開いてから編集するのは、credentials.yml.encは暗号化された文字列であるため、変更されてしまうと鍵そのものが変わってしまうためです。あくまでも変更したいのは、鍵を施錠した中身であるため、注意しましょう。

下記コマンド実行
```
# VScodeで開く場合
$ EDITOR='code --wait' rails credentials:edit

# Vimで開く場合
$ EDITOR='vim' rails credentials:edit
```

表示文字列
```
# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 8be4sevDaga6...............
```

上記構文を下記のように変更

```
aws:
  access_key_id: xxxxxxxxxxxxxxx
  secret_access_key: yyyyyyyyyyyyyyyyyy

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 8be8e637d755f79c799048bed8be0c...
```

※今回は適当にawsの公開鍵を秘密鍵を変更します。



変更後保存したファイルを閉じてください。以下のように表示されたら暗号化はできています。

```
New credentials encrypted and saved.
```

以上。

下記参考サイト参照
https://hirocorpblog.com/rails-credentials-master/
開発と本番で叩くAPIURLを変えたい

# 初めに
今回は、よくある開発と本番で叩くAPIのエンドポイントを変更したいときの備忘録を残しておきたいと思います
### 本文
まず、endpointをどこに置くか問題ですが、これは一般的に`build.gradle`に書かれることが多いので、今回はそれを前提に書いていこうと思います。
```gradle
buildTypes {
        debug {
            buildConfigField(
                    "String",
                    "API_ENDPOINT",
                    "\"https://api_endpoint/\""
            )
        }
        release {
            buildConfigField(
                    "String",
                    "API_ENDPOINT",
                    "\"https://api_endpoint/\""
            )
        }
    }
```
### 最後に
実はすごく単純ですね。
これを使えばエンドポイントだけでなくストアIDなどを個別に設定することもできます。
次回の記事では開発環境の種類によって分ける方法を書いていこうと思います。
Pendo PESレポート：定着率レポートをAPIで取る

自分用メモシリーズ：

Pendoに格納されている各アカウントの[Stickiness](https://support.pendo.io/hc/ja/articles/360031864252-%E7%B2%98%E7%9D%80%E6%80%A7%E6%8C%87%E6%A8%99%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88)の値をAPIで取る方法

Aggregation APIを使用してStickessを取得する。

クエリ実行時間5分を超えるとタイムアウトするため、数が多いと結果取得ができない可能性あり。
アカウント一覧を別途取得してバッチで回す必要ある。

```json
{
    "response": {
        "mimeType": "application/json"
    },
    "request": {
        "name": "Stickiness",
        "pipeline": [
            {
                "stickiness": {
					"account": "",
                    "appId": 6304859583021056,
                    "firstDay": "now()",
                    "dayCount": -90,
									  "groupBy": "account",
                    "identified": "visitorId",
                    "blacklist": "apply",
                    "config": {
                        "userBase": "visitors",
                        "numerator": "daily",
                        "denominator": "monthly",
                        "excludeWeekends": true
                    }
                }
            }
        ]
    }
}
```

Response:
```json
{
	"results": [
		{
			"accountId": "",
			"stickiness": 26.14583333333333
		},
		{
			"accountId": "株式会社石田重工",
			"stickiness": 42.1875
		}
	]
}
```
【クエリビルダ：拡張表現】ワイルドカードを用いた文字列検索を使用してみる

[Sharperlight](https://sharperlight.jp/)クエリビルダの拡張表現では、SQL文のLike演算子のような式が使えるようになっています。

このような結果を返すクエリがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5d2c8b7c-b307-a6d6-f491-c512e22661f2.png)
コードが**A3**で始まる行を見つける拡張表現を定義してみます。
クエリ定義に戻って、拡張表現を追加します。出力領域の右クリックメニューから`拡張表現を追加`を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2aaccfcc-2985-a8b3-d51e-5e4b5d93cd5c.png)
拡張表現タブの検索フィールドに**like**と入力します。関数リストに表示された検索結果から、**Do SQL like wildcard ～**を選択し、ダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a26435b0-2b3f-b1e1-b25a-d818052a1728.png)
すると選択した関数が、拡張式関数の構文フィールドへ転送されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a0970028-f8dc-e7fc-bd38-c57557b240ba.png)
**IsLike**関数の第一引数は、検索パターンを記入します。ここでは`"A3%"`とします。第二引数には、検索対象文字列を指定します。ここでは、`コード`フィールドの文字列を検索したいので、コードフィールドを参照する名前、`{%コード}`を記入します。
`{%コード}`は、検索フィールドの値をクリアし、全ての関数を再表示させ、現在の行フォルダーを展開することで取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/38100bfc-c1ee-698d-7ab5-e9b67d507bc6.png)
今回は、実行結果を表す文字列を表示するだけにするので、真と偽を表現する文字列もこのように設定します。
最後に`データ型`を**Text**にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e83e11da-7aea-04ba-6b9e-d63b97d9eaef.png)
では、`プレビュー`ボタンで実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2c29192a-c0f3-a235-6418-a7596140cc19.png)
コードが**A3**で始まる行には、`見つかった`が表示されました。

以上、**IsLike**関数の紹介でした。他の関数との組み合わせで様々な使い方ができると思います。
Vue.jsをベースでReact.js、Svelte.jsのAPIを比較

あくまでの比較です。場合によって使い方が違うことがあります。

## APIの比較

| Vue.js 3 Composition API |   React.js Hooks API    |      Svelte.js       |
| :----------------------: | :---------------------: | :------------------: |
|   ライフサイクルフック   |        useEffect        | ライフサイクルフック |
|    watch/watchEffect     |        useEffect        |       $: {  }        |
|         computed         |    useMemo/useEffect    |       $: {  }        |
|       ref/reactive       |        useState         |          $:          |
|          v-html          | dangerouslySetInnerHTML |      { @html }       |
|           v-if           |      js三項演算子       |       { #if }        |
|          v-for           |          map()          |      { #each }       |
|         v-model          |    useState+onChange    |      bind:value      |
|          @click          |         onClick         |       on:click       |
|           ref            |         useRef          |         this         |
|          :class          |        className        |        class:        |
|      provide/inject      |       useContext        |     context API      |
|        eventbus*         |   publish/subscribe*    |  publish/subscribe*  |

*：ライブラリの利用が必要です
npmコマンドが何も出力せずに終了する問題を解決した話

Macbook Air M2をセットアップ中の出来事になります。備忘録としてメモを残しておきます。

# 結論

- .npmがシンボリックリンクだった
- 移行アシスタントはシンボリックリンクは解決してくれない（そのまま移行する）ので注意

# 現象

`npm i` を実行すると、何も出力せずに終わる。

```
% npm i yarn -g

%
```

npmはある（ホームディレクトリは ~ に置き換えています）。

```
% which npm
~/.nodenv/shims/npm
```

# 疑ったもの

## nodenv

nodebrewにするも現象は変わらず。

## M2

M1で普通に動いているけど。M2でまた何か特有の問題が起きているのかと思ったけれど、情報はなく。

# 調査

nodenvはコマンド実装が分かりづらかったので、結果的にnodebrewにしたのが解決につながったかも。`nodenv` の npm はこれ（ホームディレクトリは ~ に置き換えています）。

```bash
#!/usr/bin/env bash
set -e
[ -n "$NODENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "node" ]; then
  for arg; do
    case "$arg" in
    -e* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export NODENV_DIR="${arg%/*}"
        break
      fi
      ;;
    esac
  done
fi

export NODENV_ROOT="~/.nodenv"
echo $program
echo $@
exec "/opt/homebrew/Cellar/nodenv/1.4.0/libexec/nodenv" exec "$program" "$@"
```

nodebrewのnpmはこれ。

```
% cat ~/.nodebrew/current/bin/npm
#!/usr/bin/env node
require('../lib/cli.js')(process)
```

ここから探っていって　`~/.nodebrew/node/v18.7.0/lib/node_modules/npm/lib/npm.js` の `load` 関数で処理が終わっているのが分かったので、エラーを出してみる。

```
% npm i yarn -g
[Error: ENOENT: no such file or directory, mkdir '~/.npm'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'mkdir',
  path: '~/.npm'
}
```

ん？ .npm …？

```
 % ls -alt ~/.npm
lrwxr-xr-x  1 nakatsugawa  staff  17  6 14 15:30 ~/.npm -> /Volumes/SSD/.npm
```

このディレクトリは移行前端末はストレージ不足で、外部ストレージを使っていたのでした…orz

ってことでディレクトリを改めて作成して解決。

```
% rm -Rf ~/.npm
% mkdir ~/.npm
% npm i yarn -g 

added 1 package, and audited 2 packages in 1s

found 0 vulnerabilities
```

## まとめ

原因が分かれば大した問題ではないのですが、原因とおぼしき場所が複数あると解決に時間がかかるという典型例でした。結果的にnodenvもM2も全く関係なかったので、誰の役に立つか分かりませんが。
Bunについて

# はじめに
新しいJavaScriptランタイムが注目を集めているので、少し試してみました。
（肉まんかわいい）

![スクリーンショット 2022-08-08 23.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628122/e1ecee87-dc84-624f-70db-307113991a91.png)

# Bunとは

Bunは、2021年9月にリリースしたJavaScriptランタイムです。
2022/8/9時点で、Githubのスター数は、約30,000あり、フロント界隈では注目されているのではないでしょうか？
![スクリーンショット 2022-08-09 9.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628122/85857eaa-a040-d260-093b-b173dd69b588.png)

## Bunについて
公式サイトによると、`Bun is a fast all-in-one JavaScript runtime`だそうです。
Bunだけで、transpiler,bundler,package managerができて、めちゃくちゃ早いらしい。

- `fetch`、`WebSocket` などの Web API が組み込まれた JavaScript ランタイム。 Bun には JavaScriptCore が組み込まれています。JavaScriptCore は、V8 などの一般的なエンジンよりも高速でメモリ効率が高い傾向があります
- JavaScript/TypeScript/JSX transpiler
- JavaScript & CSS bundler
- `package.json`scriptsのTask runner
- `npm`互換のpackage manager

## Web API との互換性
- TypeScript と JSX のサポートが組み込まれており、BunのJavaScript トランスパイラーによって強化されています。
- ESM および CommonJS モジュールがサポートされています (内部的に、bun.js は ESM を使用します)。
- 多くの npm パッケージは bun.js で動作します。 
- tsconfig.json の`"paths"`は、package.json の`"exports`"とともにネイティブにサポートされています
- Nodeからの`fs`、`path`、および`process`は部分的に実装されています
- `fetch`、`Response`、`URL` などの Web API が組み込まれています
- `HTMLRewriterbun.js` で HTML を簡単に変換できます
- .env ファイルは自動的に process.env および Bun.env に読み込まれます

公式Twitterでもnodeよりも4倍早く起動すると紹介してあります。

https://twitter.com/jarredsumner/status/1499225725492076544?s=20&t=z6YQc8g9tQzFWcNUZfArQA


# 使い方
Bunをインストールします。
これで、Bunを使用することができます。
```
curl https://bun.sh/install | bash
exec /bin/zsh
```

## 検証
Bunでcreate react appをしてみました。
どれだけ早いか試してみます！

`$bun create react test`　ポッチ！！

![bun.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628122/c00deba6-079b-3977-728c-5f30cd4a3f2c.gif)

ものの数秒で、アプリを起動することができました！！
爆速。

`npx create-react-app`とは比較にならないくらい早かったです。

# Bunのパフォーマンスについて
Bunのパフォーマンスは、nodeとdenoに比べても恐ろしくパフォーマンスがいいです。

### ReactでのSSR
![スクリーンショット 2022-08-08 23.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628122/68b621e4-48ad-5c40-7b5b-403b161a62dd.png)

### SQLiteでの読み込み
![スクリーンショット 2022-08-08 23.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628122/fd03ff8a-21c9-ff08-7077-3d411eab9e21.png)

### FFi実行
![スクリーンショット 2022-08-08 23.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628122/69b276c1-2f4a-187c-708e-eb0427545141.png)

Bunは、node,denoに置き換わる可能性がありますね！

# 危惧すべきこと
Bun は [Jarred Sumner](https://twitter.com/jarredsumner) さんが一人で開発しているプロダクトなので、今後開発が継続されるのか？は危惧すべきことだと思います。
また独自で開発を進めているので、サードパーティのライブラリで使えないものも多かったという声も聞いています。
今後、どのように開発が進むのか注目です。

# 公式サイト
https://bun.sh/

# 参考
https://qiita.com/shadowTanaka/items/5fb99819629dcaab3e05#comment-e639c7d6131b167358bc

https://zenn.dev/k41531/articles/dbedb88f06898a

# 採用のお知らせ
株式会社Relicでは、フロントエンドエンジニアを積極的に採用中です。
またRelicでは、地方拠点がありますので、U・Iターンも大歓迎です！🙌
少しでもご興味がある方は、Relic採用サイトからエントリーください！

https://relic.co.jp/categories/job_4?utm_source=note&utm_medium=article&utm_campaign=note_article
webpack5 で tsconfig-paths-webpack-plugin の new TsconfigPathsPlugin を宣言するとエラーになるやつの応急処置

tsconfigのpathsを有効にするため tsconfig-paths-webpack-plugin を入れたら型エラーになりました。

## 症状

```webpack.config.ts
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';

...省略

  resolve: {
    plugins: [
      new TsconfigPathsPlugin({
        configFile: "./tsconfig.json",
      }),
    ],
  },
```
とリポジトリ記載にしたがってやっても、
```
Type 'TsconfigPathsPlugin' is not assignable to type '"..." | ResolvePluginInstance'.
```
というエラーが出てしまいます。

"webpack": "^5.74.0",
"tsconfig-paths": "^4.1.0",
"tsconfig-paths-webpack-plugin": "^3.5.1",

を使用。

gitissueやstackoverflowなどでも同様のエラーが出たという質問などがあり、人によってはtsconfig-paths-webpack-pluginのバージョンを変えたら上手くいったという人もいますが自分の場合は変えても上手くいかず。

webpack4に変えればいけたという人もいますがそこまではしたくなく。

## 解決

ということで
```webpack.config.ts
  resolve: {
    plugins: [
      new TsconfigPathsPlugin({
        configFile: "./tsconfig.json",
      }) as any,
    ],
  },
```
みんなの
大嫌いな
anyを使用して
逃げの
解決しました。もっと良い解決法があったらコメ欄で教えてもらえると嬉しいです。
【ノート】Rails

# 環境構築
# windows10
### Rails 7

```terminal
C:\Users\ユーザ名>     
```
### 1. Ruby/rbenv のインストール


### 2. sqlite3 のインストール
https://sqlite.org/download.html
このサイトから２つをインストールして中身をCドライブ直下へコピー
Precompiled Binaries for Windows
- sqlite-dll-win64-x64-3390400.zip　　  sqlite3.dll
- sqlite-tools-win32-x86-3390400.zip　　sqlite3.exe
```
$ sqlite -version
```

### 3. Rails7
##### 特徴
- JavaScriptフロントエンドの大幅な刷新
- CSS BundlingによるTailwind 
- CSSやPostCSSのサポート
etc

##### Ruby対応バージョン
Ruby 2.7.0以上
Ruby 3.1については、Rails 7.0.0では非対応

##### インストール 
```
gem install rails -v 7.0.3
```









# rubyとrailsのバージョンが不一致

```
% rails -v
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  3.1.1
```

rails7はruby2.7.0必須、ruby3.0推奨
$ rbenv versions
のコマンドで確認しよう。
Javaの学習　~javaコマンド~

### javaコマンドとは
javaプログラムを実行するためのコマンド。
javaコマンドで実行できるものは、

①mainメソッドを持つクラスファイル
②jarファイル内のメインクラス
③モジュールに含まれるメインクラス

の３つです。

※jarファイルとは・・・javaファイルを圧縮した、拡張子が「.jar」のファイルのこと。
※モジュールとは・・・クラスを束ねるパッケージをさらに束ねるもの。

### javaコマンドの構文
クラス名の後に続く引数は、「起動パラメータ」や「コマンドライン引数」と呼ばれます。
```
//引数は必要な時のみ指定する
$java 完全修飾クラス名　引数
```
(例)
```
//下記のPracticeクラスを実行
$java Practice

//結果
練習
```

```java
public class Practice {
    public static void main(String[] args) {
        System.out.println("練習");
    }
}
```
### ソースファイルモード
Java 11よりも前までは、
「javacコマンド」でコンパイルをする
```
$javac Hello.java
```
↓
「javaコマンド」で実行をする
```
$java Hello
```
といった２段階の手順が必要でした。

Java 11以降は、
```
//java + ファイル名（拡張子が.java）
$java Hello.java
```
javaコマンドのみで実行することが出来るようになりました。

拡張子が.javaでないファイルをソースファイルモードで実行したい場合は、`--source`オプションを使います。
```
//「Test」というファイル
$java --source 11 Test
```

### まとめ
普段はeclipseを使って学習しているのでjavaコマンドを使ったことがないのですが、また挑戦してみたいと思いました！
最後まで閲覧いただき有難うございました！
SPIRE v1.4.0 変更点調査

## はじめに

SPIRE v1.4.0の変更内容を紹介します。

> :pencil: がついた文章は筆者の補足です。

## Release Note
### Added

- Kubernetes上のWindows workload(container)のattestationをサポートしました ([#3191](https://github.com/spiffe/spire/pull/3191))
  
> :pencil:
> `--feature-gates=WindowsHostProcessContainers=true` が必要なようです。(K8s v1.23以降はbetaに昇格してデフォルト有効)

- Wokloadに対してRSA keyを使ったX509 SVIDsの利用をサポートしました([#3237](https://github.com/spiffe/spire/pull/3237))

> :pencil:
> Agentの設定に`workload_x509_svid_key_type`が追加され、そのAgentが発行するWorkloadのX509 SVIDのkey typeが指定可能になりました
> デフォルトは `ec-p256`

- Kubernetes上でworkload attestationを行う際にKubeletのsecure portに対してAnnonymous authenticationをサポートしました([#3273](https://github.com/spiffe/spire/pull/3273))

> :pencil:
> KubeletのSecure portに対するAnnonymous authenticationのリクエストをサポートしていなかったので対応したようです
> K8s Workload Attestor Pluginの設定値 `use_anonymous_authentication` で有効化できるようです

### Deprecated

- Node Resolverがdeprecatedになりました([#3272](https://github.com/spiffe/spire/pull/3272))

### Fixed

- Agent SVID更新時にattested node情報のcan_reattest flag情報も正しく更新します([#3292](https://github.com/spiffe/spire/pull/3292))

> :pencil:
> SVID更新時にcan_reattestフラグの情報がロストしてしまう問題があったようです

- リグレッションによりEvictされたAgentが再Attestationできなくなって問題を修正しました([#3269](https://github.com/spiffe/spire/pull/3269))

### Changed

- Azure Node Attestorはselectorはオプションでselectorを提供します ([#3272](https://github.com/spiffe/spire/pull/3272))

> :pencil:
> Node ResolverがdeprecatedになったのでNode Attestorに機能がマージされました  

- Docker Workload Attestorは不明なオプションが設定された場合失敗するようになりました ([#3243](https://github.com/spiffe/spire/pull/3243))

- K8s Workload AttestorのCRI-Oサポートの改善([#324](https://github.com/spiffe/spire/pull/3242))

- Disk上に保管されるAgentのデータが1つのJSONファイルに連結されるようになりました ([#3201](https://github.com/spiffe/spire/pull/3201))

> :pencil:
> これまではAgent SVIDやBundleデータがそれぞれ個別のファイルとしてdata_dirに保管されていました。
> 保管対象の情報が増えたりする要件が出てきたこと、それらを同じタイミングで更新できるのが理想なことから、JSONファイルへの連結が検討されたようです。

- Windows上のAgentとServerのdata ディレクトリは、親ディレクトリのパーミッションを引き継がないようになりました ([#3227](https://github.com/spiffe/spire/pull/3227))

- Named pipeを使用して公開されたエンドポイントは、リモートの呼び出し元からのアクセスを明示的に拒否します ([#3236](https://github.com/spiffe/spire/pull/3236))

- ドキュメントの改善([#3264](https://github.com/spiffe/spire/pull/3264))

### Removed

- Deprecatedになっていた k8s-workload-registrarのwebhook modeが削除されました ([#3255](https://github.com/spiffe/spire/pull/3235))

- k8s-workload-registrarのconfigmapを使ったleader electionのサポートが削除されました([#3241](https://github.com/spiffe/spire/pull/3241))
【夏休み企画】#IT用語一問一答【毎朝投稿6日目】REST

# この記事を読むと、、
- 「関連用語」を使って「REST」を説明できるようになる
- 「REST」がもっと好きになる(多分)

# 関連用語
layering / clean url

[**復習用**] 記事の内容を見る前に上記の言葉でRESTを説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/40bb6bf5ab2277ad8253

# RESTとは
REST = Representational State Transfer = Web APIを定義するガイドライン

- RESTful API = RESTの原則に概ね沿ったWeb API

RESTの原則
- Client-Server Modelに則っていること
    - クライアントとサーバーで関心の分離をすることでスケーリングや各コンポーネントの改善が容易になる
- Statelessであること
    - クライアントもサーバーもセッション情報を持たない
- キャッシュ可能であること
- **Layering** = 各コンポーネントが機能的に独立していて、他コンポーネントの具体的な実装に影響を受けない設計
    - 実装がプロキシやロードバランサの有無に影響を受けない
- リソースがURIで一意に識別されること
- Code on demand
    - サーバーはclient-side scriptによって必要に応じてclient側でのサービスの挙動を動的にカスタマイズできる

**clean URL** = RESTful URL = 一般の人に理解されやすい形式で書かれたURL
- サーバー内でリソースがどう保存されているかとは独立
- SEOにも有効
- 可読性を上げるためにslugと呼ばれるキーワードをURLの末尾につけることもある

# 参考資料
- https://www.redhat.com/en/topics/api/what-is-a-rest-api
- https://en.wikipedia.org/wiki/Representational_state_transfer
-  https://en.wikipedia.org/wiki/Clean_URL
Linux 正規表現と拡張表現について（自分用メモ



●2つのファイルを読み込み、共通するフィールドがある行を結合して表示するコマンドはjoin


コンピュータ上でテキストファイルを扱う際には、改行コードという制御符号について意識する必要があります。OSの改行コードと異なる改行コードのテキストファイルを読み込むと、正しく改行されなかったり、不正な制御コードの付いたファイルだと認識されたりします。
多くのシステムではキャリッジリターン（Carriage Return: CR、\r（16進数で0D））とラインフィード（Line feed: LF、\n（16進数で0A））を使って改行を表します。

改行コードと代表的なOSの組み合わせ。
・CRLF（\r\n）：Windows
・LF（\n）：Unix OS（Linux, Mac OS Xなど）
・CR（\r）：古いMacOS（バージョン9まで）

上記の通りWindowsとLinuxでは改行コードが異なるため、テキストファイルの扱いが問題になる場合があります。CRLF（\r\n）からCR（\r）を取り除くことでLinuxの認識できる改行コード：LF（\n）のみにでき、正しく扱うことができるようになります。

●trコマンドは指定した文字を変換・削除するコマンドです。

tr [オプション] [文字列1 [文字列2]]

オプション
・-d 文字列１で指定した文字を削除
・-s 文字列１で指定した文字が連続した場合、１文字に置き換える

オプションを指定しない場合は、文字列1を文字列2に変換します。

なお、trコマンドは変換対象を標準入力からのみ受け付けます。つまり、変換・削除したい文字列が記載されているファイルをコマンドの引数として指定することが出来ません。そのため、パイプ(|)やリダイレクト(<)を使用してファイルを指定します。

cat ファイル名 | tr [オプション] [文字列1 [文字列2]]
または
tr [オプション] [文字列1 [文字列2]] < ファイル名

●trコマンドで使用できる文字クラスまとめ
・[:alpha:]　英字
・[:lower:]　英小文字(a-z）
・[:upper:]　英大文字(A-Z)
・[:digit:]　数字(0−9)
・[:alnum:]　英数字
・[:space:]　スペース

例）「file」ファイルで、連続したスペースをスペース1つに置き換えて表示する場合
$ cat file | tr -s [:space:]


■指定したファイルを行番号をつけて出力するには、nlやcatコマンドを使用。


●nl [オプション] [ファイル名]

オプション
・-b a 空行を含めて全ての行に行番号をつける(catコマンドの-nオプションと同じ)
・-b t 空行を除いた行に行番号をつける(catコマンドの-bオプションを同じ)デフォルト

●cat [オプション] [ファイル名　...]

オプション
・-n 空行を含めて全ての行に行番号をつける(nlコマンドの-b aオプションと同じ)
・-b 空行を除いた行に行番号をつける(nlコマンドの-b tオプションを同じ)



■ファイルや標準入力の内容を編集して表示するにはsedコマンドを利用します。

sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]

オプション
-e 編集コマンドを指定（編集コマンドが１つの場合は省略可）
-f 編集コマンドを記述したファイルを指定

編集コマンド
・s/文字列１/文字列２/　各業の最初に現れる文字列１を文字列２に置換
・s/文字列１/文字列２/g　全ての文字列１を文字列２に置換
・/文字列/d　文字列が含まれる行を削除
・行番号１,行番号２d　行番号１から行番号２までの行を削除
・y/文字１文字２…/文字３文字４…/　文字１を文字３に、文字２を文字４に置換



■正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現（BRE: Basic Regular Expression）と拡張正規表現（ERE: Extended Regular Expression）があります。

記号と説明
・. 任意の１文字
・* 直前の文字の〇回以上の繰り返し
・[] []内のいずれかの１文字（^ 先頭にある場合は後続の文字以外）
・^ 行頭
・$ 行末
・\ 次の文字をエスケープ（通常の文字として処理）

●拡張表記表現
・+ 直前の文字の１回以上の繰り返し
・? 直前の文字の０回もしくは１回の繰り返し
・| 左右いずれかの文字列


※正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」（シングルクォーテーション）や「"」（ダブルクォーテーション）の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。

正規表現を利用する主なコマンドは以下のとおりです。

・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。

・sed
ファイルや標準入力の内容を編集して表示するコマンド

例1）1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合

$ grep '[1-5]' test.txt

例2）「test.txt」ファイルの「#」から始まる行を削除して出力する場合

$ sed '/^#/d' test.txt

基本正規表現と拡張正規表現の違いに注意。grepコマンドは、-Eオプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。

基本正規表現では「?, +」は「\?, \+」とすることで、拡張正規表現と同様の意味を持つようになります。
Flutterで好きな場所にファイルをダウンロードさせる方法

## 概要
`Flutter ファイル ダウンロード`で検索しても、アプリフォルダ内にしか保存する方法を見つけれず諦めかけていたのですが、`flutter ファイル シェア`と検索すると保存先を指定できる方法が見つかったので紹介します。

## 実装方法

[share_plus](https://pub.dev/packages/share_plus)というライブラリを使うことで驚くほど簡単に実装ができます。

### textを保存させたい場合

```dart
Share.share('保存したいテキスト');
```

### ファイル（画像、PDF、CSVなど）を保存させたい場合

```dart
# file.path: 一時的に保存したファイルのパス
Share.shareFiles([file.path], subject: basename(file.path));
```

## 参考文献
- https://pub.dev/packages/share_plus
- https://qiita.com/hmatsu47/items/f0d2e0ca4854862e1357

## 補足

- 後で追記します。。。
プロセッサ用語まとめ（エンベデッドシステムスペシャリスト午前Ⅱ）

# 目的
アウトプットによる自分の理解の促進。
情報共有。

# 内容
## エンベデッドシステムの構成
エンベデッドシステム（組込みシステム）とは、**特定の機能を実現するためのシステムに組み込まれるコンピュータシステム**である。
専用のHWを持つが、構成要素は一般のコンピュータと同様で、五大装置（制御、演算、記憶、入力、出力装置）を持つ。

## プロセッサの種類
### CPU
制御装置と演算装置を集積したプロセッサ。
フェッチ（メモリからプログラムを読み取り）、デコード（解析）、実行、ストア（結果をメモリに書き込む）の**命令サイクル**を繰り返すことで複雑な処理を行う。
### DSP
音声・画像処理やディジタルフィルタ演算を高速に実行できるように設計されたプロセッサ。
固定小数点型と浮動小数点型があり、後者の方が回路規模は大きくなる。
### GPU
動画再生や3Dグラフィックのレンダリングを高速に実行できるように設計されたプロセッサ。
GPUをグラフィック以外の用途で利用することを**GPGPU**(General Purpose -)と呼ぶ。

## CPUアーキテクチャ
| 名称 | 内容 | 実例 |
|:--|:--|:--|
| SISD | 1命令で1データを処理 |  |
| SIMD | 1命令で複数データを処理 | 画像処理など |
| MISD | 複数命令で1データを処理 | 実施例は多くない |
| MIMD | 複数命令で複数データを処理 | 汎用PC |

また、プロセッサ設計上の考え方としてCISCとRISCがある。
| 名称 | 内容 | 命令長 |
|:--|:--|:--|
| CISC | 複雑な命令をたくさん持つ | 可変 |
| RISC | 単純な命令を小数持つ | 固定 |

## マルチプロセッサシステム
1つのシステムで複数のCPUを動作させることで処理能力の向上を図る。
### マルチプロセッサ（複数のプロセッサ）
**密結合**は、複数のプロセッサでメモリを共有し、単一OSで制御される構成。
**疎結合**は、複数のプロセッサがメモリを共有せず、それぞれ独立したOSで制御される構成。各プロセッサ間のデータやりとりは主に通信によって行う。

### マルチコアプロセッサ（プロセッサの中に複数のコア）
コアがすべて同じ種類のプロセッサを**ホモジニアスマルチコア**と呼ぶ。
異なる種類のコアを組み合わせるプロセッサを**ヘテロジニアスマルチコア**と呼ぶ。

## I/Oアクセス方式
### メモリマップドI/O方式
入出力装置とメモリが同じアドレス空間にいる。
I/O空間にアクセスするプログラムをCで記述する場合、コンパイラによる最適化を防止するためにvolatile修飾子をつける。
(参考：https://uquest.tktk.co.jp/embedded/learning/lecture13.html)
### I/OマップドI/O方式
入出力装置をメモリが別のアドレス空間にいる。
アクセス信号線（Read, Write）を分けておく必要がある。

## 割込み
### 割込みの種類
**外部割込み**は、CPU以外から要因が発生した割込み。入出力IFからの割込みなどが代表的。
**内部割込み**は、CPU自体で発生した割込み。0除算、オーバーフロー、書き込み禁止領域への書き込み、割込み命令による割込みなどが代表的。
### 割込みオーバーヘッド
割込み時にはレジスタの退避や復旧などの前後処理が必要となる。
これらにかかる時間を**割込みオーバーヘッド**という。
### NMI (Non-Maskable Interrupt)
ソフトウェアによって割込みの禁止をできない割込み。
システムに致命的な問題が発生した場合の割込みである。
ウォッチドッグタイマのタイムアウトや電源電圧低下によるシステム強制シャットダウン時などで起こりうる。
### 多重割込み
同時に割込みが発生すること。優先順位に基づいて処理が行われる。
多重割込みが許可されていないシステムでは、実行中の割込みの処理を待ってからあとから発生した割込みが実行される。
多重割込みが許可されているシステムでは、実行中の割込み処理Aをいったん中断して後から発生した割込みBが実行される。割込みBの処理が終了した後、処理Aを再開する。

## 高速化技術
### パイプライン制御
プロセッサの処理を、フェッチ、デコード、実行、ストアなど複数の処理に分けて並列に実行することを特徴とする高速化手法。
処理ステージの数をパイプラインの**深さ**、処理時間を**ピッチ**と呼ぶ。
![エンベデッドシステム図形_パイプライン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110901/78c04c26-7394-7658-108b-51dd2626ab24.png)

#### スーパーパイプライン
前述したパイプラインの処理ステージをさらに細分化したもの。

#### スーパースカラ
パイプラインを複数用意し、同時に複数の命令を実行できるようにしたもの。
プログラム中に前後の命令の影響を受けずに実行できる命令があるとき、HWでこれを検出し、複数のパイプラインに処理を割り振って実行させることで高速化を実現する。

### パイプラインハザード
パイプラインの流れを阻害する要因。以下の3つがある。
* **データハザード**は、直前の命令の実行結果を次の命令が使用するため、直前の命令の実行を待つ必要がある場合のハザード。
* **構造ハザード**は、複数の命令がCPU内部資源(算術演算器など)を同時に利用しようとしたために発生するハザード。
* **制御ハザード**は、条件分岐の条件の確定を待つことで次にフェッチすべき命令のアドレスが確定するのが遅くなることによるハザード。

制御ハザードの対策として次のものがある。
* **遅延分岐**は、先に分岐先の命令を実行してから分岐処理を行うこと。
* **アウトオブオーダー実行**は、プログラムに書かれた順番と変えて実行すること。
* **分岐予測と投機的実行**は、過去に実行された分岐の履歴をもとに、分岐確立の高い方を予測して選択する方法。

# 気になったことメモ
* なぜPCはMIMDなのか
* マルチプロセッサとマルチコアプロセッサの位置づけがよく分からなくなってきた。この2つは両立するもの？（マルチコアプロセッサをマルチプロセッサで使うことが可能か）
* 多重割込みで割込みの割込みの割込み…というふうに多重になった場合に、退避しておく領域がなくならないか
C++でマルチスレッド処理(メモ おまけ バッチでもマルチスレッド)

# マルチスレッド処理のメモ
USBカメラやipカメラの映像を取得するプログラムを作成中。いずれ全体を載せたいと思うけど、とりあえずマルチスレッド処理の所だけ。

```C++:サンプル.cpp
#include <thread>
class _USBCAM
{
public:
    //ここらは本稿では使わない
	cv::VideoCapture capture;
	int _show();	//登録してあるハンドルに表示
	int _show2(); //opencvのウィンドウに表示
	int _show(HWND hWnd, int nIDDlgItem);
	int _close();
	int _init(int _cam_num, int _width, int _height, int _fps, HWND hWnd, int nIDDlgItem);//スレッド開始に必要な引数は、念のためキック前にあらかじめ渡しておく。
    //ここからスレッド関連
	int _show_thread();	//登録してあるハンドルに表示
	int _show_thread_sub();	//登録してあるハンドルに表示
	std::thread *_thd;　 //マルチスレッドをしたい関数のアドレスを格納するスレッドクラスのポインタ
};

//スレッドにキックをかける関数。ダイアログボックスのボタン。
void CUSBCamMFC3Dlg::_OnBnClickedButtonU(int _cn, int _id, int _idcw, int _idch, int _idcf)
{
	//描画関係の初期化
	_uc[_cn]._init(_cn, _w, _h, _f, m_hWnd, _id); //_PicContId
    //マルチスレッド処理↓　デバッグモードだと実行時エラーが出るかも。
	_uc[_cn]._show_thread();
}

int _USBCAM::_show_thread()
{
	//スレッドに関数を登録　
	_thd = new std::thread([this]() {this->_show_thread_sub(); });
	return 0;
}

//マルチスレッド化する描画する関数
//whileでひたすらルーチン処理するが、他の処理も進む
int _USBCAM::_show_thread_sub()
{
	int _ret=0;
	while (_cam_on)
	{
		_ret = DrawPicToHDC(_getimg(), _hWnd, _nIDDlgItem, true /* =true*/);
	}
	return _ret;
}
```
何のこたあない、マルチ処理したい部分を関数化してそのアドレスをstd::threadクラスに渡せばよい。型キャストが難しくなったなあ。昔は全部(void*)()でキャストしてた記憶が。ていうか自作していたっけ。
threadクラスにはjoin()とかスレッドを管理する関数とかあるので詳しくは下記のリンク先へ。それにしても完全にスレッドをkillする関数が無いなあ。まあいいけど。変数にアンダーバーを使うのは癖なので気にしないように。

# バッチファイルでマルチスレッド
ちなみにマルチスレッドプログラミングはバッチファイルでも出来る。
↓こんな感じのバッチファイルを作る。
```:sample.bat
@echo off
echo dir>_sub.bat
echo ffmpeg -i %%1.avi %%1.avi>>_sub.bat
rem マルチスレッド処理したいコマンドをechoで_sub.batに書いていく。
rem %と\は二重化して記述すること

start _sub.bat hoge1
start _sub.bat hoge2
start _sub.bat hoge3
```
バッチファイルの中でサブルーチンとなる別のバッチファイルを作ってstartコマンドでキックする。簡単だね。これで動画変換が同時進行していく。もちろんハードの制約はあるがそれはOSが処理してくれる。C++やC#のマルチスレッド処理もバッチと原理は同じ。仕組みが分かっていれば何のこたあない。

参考
https://cpprefjp.github.io/reference/thread/thread.html
resolumeにprocessing4のカメラ映像をSyphonで送る　mac

参考にしたwebサイト
https://office606.org/archives/42/
http://dekapoppo.blogspot.com/2017/06/macsyphonvdmx5.html
https://resolume.com/support/ja/syphonspout


processingも勉強していて、resolumeを使い出したので、送れたらいいなと思ってやってみた。
macbook16 promax


まずprocessing3がmacのOSが新しくなった関係で、webカメラ使ったGettingStartedCaptureが動かなくなっていたので、困っていた。いろんな回避方法が載っていたが、結局processing4でやったら上手く写るようになった。

せっかく色々作ったのでresolumeで写せたらいいなと思って、調べてみた。やってみた。

processingの出力画面をresolumeで取り込むためにはsyphonという仕組みが必要みたい。

syphonというのはソフトの名前ではないらしい。

まずprocessing側でsyphonのライブラリを追加しておく

スケッチ>ライブラリをインポート>syphonする

webカメラを利用するサンプルスケッチをsyphonで出力できるように追加する


/**
 * Getting Started with Capture.
 * 
 * Reading and displaying an image from an attached Capture device. 
 */

import codeanticode.syphon.*;//追加した
SyphonServer server;//追加した

import processing.video.*;

Capture cam;

void setup() {
  size(640, 480, P3D);//P3Dというところを追加しないと動かない
  server = new SyphonServer(this, "Processing Syphon");//追加した
  String[] cameras = Capture.list();

  if (cameras == null) {
    println("Failed to retrieve the list of available cameras, will try the default...");
    cam = new Capture(this, 640, 480);
  } else if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    printArray(cameras);

    // The camera can be initialized directly using an element
    // from the array returned by list():
    cam = new Capture(this, cameras[2]);//ここの配列の番号は自分の利用したいカメラの番号にする。どの番号がどのカメラに対応しているかは、プログラムを実行した時に出力されている。
    // Or, the settings can be defined based on the text in the list
    //cam = new Capture(this, 640, 480, "Built-in iSight", 30);
    
    // Start capturing the images from the camera
    cam.start();
  }
}

void draw() {
  if (cam.available() == true) {
    cam.read();
  }
  image(cam, 0, 0, width, height);
   server.sendScreen();//追加した
  // The following does the same as the above image() line, but 
  // is faster when just drawing the image without any additional 
  // resizing, transformations, or tint.
  //set(0, 0, cam);
}
100日後くらいに個人開発するぞ！day067

## 今日はルーティングを整えて新規ファイルを追加してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/4ee73fef-da7d-5e93-836a-e72c26557dbf.png)



## 今日の学び
### ルーティング
* ルーティングを書き換えることでトップページのURLを変更することができる
* `"home#top"`の部分が変わらない限りhomeコントローラのtopアクションに対応するビューファイルの内容がブラウザに表示される

### コマンド
* コマンドは「コントローラ名」と「アクション名」が含まれる
* `rails generate controller コントローラ名 アクション名`を実行することで対応するファイルが自動で用意される
* 同じ名前のコントローラがある場合はコマンドを使うことができない


### ルーティングとアクションを追加する
* ルーティングとコントローラのファイルにコードを書き足すことでルーティングとアクションを追加できる
Dockerインストールしてみた

## Dockerを使いたいと思った経緯

インフラの知識を付けたかったから
Macを普段使っているが、Windowsも普段使いしたく、
サクッとできるという印象があったから。
AWSにも興味があり、AWSとDockerで環境構築してみたかった。


## Dockerインストール手順

1. インストール先URL
https://docs.docker.com/docker-for-mac/install/
へアクセス(MACのインストール用アドレス）

2. Download Docker Desktop for Macで
どちらかをダウンロード
  Intel Macの人は「Mac with Intel chip」、
 Macの人は、「Mac with Apple chip」をクリックする。
![スクリーンショット 2022-08-09 7.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780401/056a66cb-3af0-676a-089a-87768c1f1c11.png)


3. Finderのダウンロードディレクトリの中に「Docker.dmg」があるので、ダブルクリックして展開。
 



4.「Docker.app」を「Applications」フォルダにドラッグ＆ドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780401/48ff5d50-27b7-93bc-d8e8-1da83c49fa12.png)



## 感想
まだまだわからないことが多いですが、次回は開発環境を作っていきます。
nx angular-nestのnest側のデバッグ方法

# 環境
・VSCode
・Windows10
・"@nrwl/workspace": "14.4.3"

# 手順
サーバー起動して
```
nx run api:serve --inspect=inspect
```

VSCodeのDebug&RunでAttach NestJS WSを選択。
```launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach NestJS WS",
      "restart": true,
    }
  ]
}
```

Angular側はデフォルトのまま
```proxy.conf.json
{
  "/api": {
    "target": "http://localhost:3333",
    "secure": false
  }
}
```


参考
https://stackoverflow.com/a/60987737/13463726

VSCodeのauto attachはうまく動かなかった
https://stackoverflow.com/a/68630866/13463726
https://code.visualstudio.com/blogs/2018/07/12/introducing-logpoints-and-auto-attach

参考にならなかった
https://blog.davidjs.com/2021/05/debugging-nestjs-app-in-nrwl-nx-workspace/
STM32G031を使た、mbed-osでHALの入力


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)

目的
STM32G031でのMbedのテスト
STM32G031とは、STM32G031J6M6の事です。


![o_con641.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9ccad3bb-da32-4726-e014-293c1a076cea.jpeg)



新規

![o_con628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fb2d8d15-ff47-b8ec-f0ec-f941d5c5d17f.jpeg)

機種とプログラム

![o_con629.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/63c29513-38bc-a820-41d7-f0c0adea520b.jpeg)

画面が変わる

![o_con630.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a0c1d31b-5b3b-040d-7aa1-29ed09372394.jpeg)

新規ファイル

![o_con631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b105dafc-b98d-7041-9396-3b35ddd7b446.jpeg)

mbed_app.json

![o_con632.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/73ec76d6-aa15-c47f-7598-26ee65c0b151.jpeg)

ファイル内容

![o_con633.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2c7db01e-0d13-fe37-e80e-4b2b26186b43.jpeg)

メインプログラム

![o_con634.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6702fee7-c58c-fd27-3e60-567b509ce416.jpeg)

mbed-os


![o_con635.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b63ae067-7c13-70df-bfc7-b7e48c8250be.jpeg)

リビジョンの変更

![o_con636.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/abc98562-929d-64ad-297d-81ab245df35d.jpeg)

ボードの変更

![o_con637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0da4a3b9-2f74-46ed-a86b-55b5b75b0baa.jpeg)

G031を選択

![o_con638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9107f239-253f-2a5d-d3e2-c4ff95177ced.jpeg)

コンパイル


![o_con639.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2565892e-5c4f-c358-c397-d630aef191a4.jpeg)


サイズ


![o_con640.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/542c8bc5-5a89-529c-6a9e-42de1b2d2918.jpeg)




```c++

#include "mbed.h"

//DigitalOut myled(PB_0);

int main() {

  __HAL_RCC_GPIOB_CLK_ENABLE();


  GPIO_InitTypeDef GPIO_InitStruct = {0};


  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    while(1) {
        if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)==0) {
            //myled = 0;
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        } else {
            //myled = 1;
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        }//if
    }//while

}//main


```
フラグが立つとオンになりIDが変わるとオフにする(SPSS Modeler データ加工逆引き4-8)

# フラグが立つとオンになりIDが変わるとオフにする（ステート型）

![スクリーンショット 2022-08-01 9.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c2fab34-757a-7567-44c8-2e751c0a6307.png)

## 1.想定される利用目的

・顧客の特定行動から特徴量を作成する
・設備ログから特定イベントの有無を特徴量にする

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/state.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-01 9.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/059138bc-221d-6616-dcf6-fa0bf43ea252.png)

a.対象にするデータは以下の通りです。
![スクリーンショット 2022-08-01 9.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9d8e7ecd-ca59-83f6-4945-a8186ec4cc10.png)


b.[フィールド作成]ノードを編集します。[派生]モードを[ステート型]にします。フラグが立つと[オン]の状態になります。またIDが切り替わる条件を[@&#xFFF0;OFFSET(C1,1)/= C1]で記述して[オフ]を定義しています。@&#xFFF0;OFFSET(列,1)は列の1行上を参照する関数です。
![スクリーンショット 2022-08-01 9.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/64498d47-2ebe-9d6f-1199-a1893c6cb16a.png)

式ビルダーから@&#xFFF0;関数を探すと簡単に入力できます。
![スクリーンショット 2022-08-01 9.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dea40492-4be5-c4bc-7ddf-b04ad13885aa.png)

c.[テーブル]ノードを実行します。
![スクリーンショット 2022-08-01 9.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a5cdd5f8-d324-e509-9255-ae317e9906d7.png)

#### 注意点

[フィールド作成]ノードの[ステート型]は初期値設定があります。今回は[オフ]で開始します。

## 4.参考情報

#### フィールド作成のステート型を解説した記事

https://qiita.com/kawada2017/items/7b3c279963d39043214a#4m-%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E5%9E%8B%E3%82%B8%E3%82%B0%E3%82%B6%E3%82%B0%E3%81%8C%E9%A0%BB%E7%B9%81%E3%81%AB%E8%B5%B7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E8%B5%B7%E3%81%8D%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%8B%E3%81%AE%E7%8A%B6%E6%85%8Bmodeler%E7%89%88

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
勉強と学習の違い～未経験エンジニアのモチベ編～

こんにちは

実務未経験からエンジニアを目指して、日々学習に取り組む22歳社会人です。
自分が常日頃から意識していることをつらつらと書くだけの記事になります（笑）
技術等の記事ではないですが、今後のエンジニアライフに欠かせないようなモチベのお話になれば幸いです。


また、なぜ私がエンジニアを目指しているか、どの系統になりたいか、LPICを取得する際に苦労したこと、などは別の記事で書こうと思います。
# 簡単に自己紹介
- 22歳社会人、2児のパパ
- 情報系の大学中退
- ITパスポート、LPIC-1取得済み
- 大学では主にC、Java、MySQL、アルゴリズムを学習（ほぼ記憶なし）
# 本記事について
学生時代に疑問だった「<b>勉強</b>」と「<b>学習</b>」の違いを、今後のモチベになりそうな感じで説明していきます。
# 対象の読者
- エンジニアを目指して学習しているが、モチベーションが続かない方
- 先の見えない学習量に挫折しそうな方
# 各々の意味
言葉の意味と、それに対する自分なりのイメージ、解釈を交えながら説明していきます
※自分なりの解釈ですので、本来の意味合いとは異なるかもしれません

## 「勉強」とは
>①精を出してつとめること
>②学問や技術を学ぶこと。さまざまな経験を積んで学ぶこと

勉強は「勉め、強いる」と書き、この文字通り、皆さんも親御さんから「勉強しなさい！」と怒鳴られる苦い経験をしたかと思います。
我が国日本では、勉強の意味の一つにある「商品を安く売ること」とあるように、江戸時代の商人が<b>本来は気が進まないが無理にする</b>という意味で、「勉強する＝安価にする」ということになったようです。
しかし、明治以降では知識を得るために努力することは美徳とされ、学習とほぼ同じ意味合いになったそうです。（※諸説あります）
⇒学生に頃に、親から勉強しなさい、とやかましく言われすぎたせいか、「勉強」はネガティブ、マイナスなイメージしかない、、まぁ、自分が悪いんですけどね、、、


## 「学習」とは
>①まなびならうこと
>②経験によって新しい知識・技能・態度・行動傾向・認知様式などを習得すること、およびそのための活動

学習は「学び習う」と書き、なんとも自発的な感じがしますよね
学習についての語源ははっきりしていないようですが、「まねぶ（真似ぶ）」から派生した「学ぶ」と、繰り返し行うという「羽」と自ずからの派生の「白」からなる「習う」をまとめて「<b>学習</b>」となったようです。（※諸説あります）
⇒ほう、、自ずから繰り返し真似ることで、学習する、いい響きですね、、

# 自分の見解
勉強は強制的、受動的なのに対し、学習は自主的、能動的だと感じましたが、あくまで語源の話であって、「学習（言語を習得）するために勉強（自分を奮い立たせて）する」というような表現が、自分の中でしっくりくるのかなと思いました。
# 総括
これから、エンジニアを目指して学習する方（自分）。

あくまで自分の意見ですが、なぜ目指すのか、それを実現するためのプロセス、計画は綿密に練っているか、実際に実行可能なのか、など目標を設定するだけでは夢は夢のままです。
人生は思い通りにはなりません、行動した通りになります。
また、今ITとは無縁な業種で働きながら学習している方、途方もない学習量、かつ残業祭りで時間が取れないという状況で挫折しそうなのも理解できます。自分も子供二人で仕事もしている最中ですが、ほんとに時間の確保が困難です。
　しかし、時間が取れないというのは言い逃れにしかなりません。時間は皆平等に一日24時間与えられているのです、ある人は32時間、もうある人は20時間、そんなことはないです、いかにこの24時間という短い時間を有効活用できるかに懸かっています。また、時間は残酷にも待ってもくれません、淡々と時間を刻み続けます。
　今、時間が取れないと思う方は、一日の過ごし方を見直してみましょう。起床時間、通勤時間、昼休憩、就寝前、土日等々で無駄な時間を過ごしている可能性があります。自分も学習しようとした際に、生活習慣から改めると、学習時間が平日で1時間半→5時間まで増やすことができました。

これら踏まえ、自分が実現したいことを事細かく思い浮かべ、メモに書き出してみるなりしてみてください。おのずと、それらの優先順位というものがはっきりしてくると思います。
物事には段階というものがあります、起承転結、OSI参照モデル、TCP/IPモデルなど、いきなり文章が終わったり、データをそのまま送ったりということはありません。現実世界でも同様に、段階を踏んで、基礎から応用と移行していくものです、いきなり実現するということは滅多にありません。
　この際に、継続して学習することが、実現することへの一番の近道であると思います。一日30分でも継続すれば、１ヶ月後、半年後、一年後には、見たこともない景色まで登っていることでしょう。とにかく、繰り返し学び習うことで、ちょっとではありますが他とは別の階層に移行できます。また、時には学習を疎かになってしまいそうな時が来るかもしれません。その際は、強制的でもいいので、「学習するために勉強」してください。受動的でも構いません、周りは生半可な気持ちで学習している方はいないのですから、どんどん差がついてしまいます。
　また、知識とういうものは、人生を豊かにしてくれるものであり、社会では武器にもなります。しかも、最低限準備するものは、自分の脳のみです。あとは、知識を蓄えるには学習するだけです。

皆さん、再三にはなりますが、自分の達成したいことがあるのであれば、まず自ずから継続して繰り返し学び習い、時には自分を奮い立たせて勉強してみてください。気が付けば、全くわからなかった全容見えてきます。過去の自分とは明らかに成長し、武器も携えていることでしょう。そして、完全未経験からは脱出し、経験者には敵いませんが、ある程度の未経験には勝てるレベル感には来ています。

その日が来るまで、我々は黙々と学習に励みましょう。。。


では、次回はLPIC取得の背景、学習方法を記載します。:hand_splayed:
ガンダムのURDFファイルをUnityにインポートする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png"> V作戦


[gundam global challengeで公開された](https://gundam-challenge.com/special/opensimulator/)ガンダムのURDFファイルをUnityにインポートする手順です。

### 参考
https://github.com/kirurobo/Roid1_Simple

# 手順の動画

Unityを使い慣れていない方は動画がわかりやすいかもしれません。

https://www.youtube.com/watch?v=-OvDCy6cbfU


### 手順のメモ

#### ① Unityを立ち上げる

#### ② URDF インポーターをパッケージマネージャで追加する
[https://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer#v0.5.2](https://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer#v0.5.2
)

#### ③ Gundam Global ChallengeのURDFファイルをDLする
[https://github.com/gundam-global-challenge/gundam_robot](https://github.com/gundam-global-challenge/gundam_robot
)

#### ④ 解凍したファイルをアセットに追加する
URDFは相対パスを含むためDLファイル全体を追加します。

#### ⑤ URDFファイルをインポート
URDFファイルを右クリックし、「Import Robot from selected URDF file」を選択。
ダイアログボックスでパスを聞かれるので「Locate Root Folder」を選び、解凍してインポートしたファイルのトップディレクトリを指定する。

少し待つと画面に棒立ちのガンダムが出現します。

### 謝辞
kiruroboさんありがとうございました！

### つづきの記事

使いかたのコツなどを掲載しています。

https://qiita.com/Ninagawa123/items/b24ceee29755e09b4d73
2022/8/9主にITとかセキュリティの記事

複数自治体が利用する自治体情報セキュリティクラウドで一時障害
https://www.security-next.com/138762

「制御システムセキュリティカンファレンス2023」のCFPが開始に
https://www.security-next.com/138744

厚労省の委託先で「Emotet」感染 - メールなどが端末から流出
https://www.security-next.com/138733

都マンション管理状況届出システムに不正アクセス
https://www.security-next.com/138693

企業へのサイバー攻撃の裏に潜む、従業員の理解不足の実態(8/7)
https://forbesjapan.com/articles/detail/49386

P2Eゲーム、不十分なサイバーセキュリティ対策が懸念事項に＝レポート(8/7)
https://jp.cointelegraph.com/news/major-hacks-in-play-to-earn-crypto-games-a-matter-of-time-report

スクレイピングテクニック - バレないようにする方法を解説(8/3)
https://qiita.com/Octoparse_Japan/items/88b855fac6d9fe7ef346

デジタル通貨　健康に活用…みずほなど　会津若松で第１弾(8/7)
https://www.yomiuri.co.jp/economy/20220806-OYT1T50395/

スポーツ業界にNFTチケットが必要な理由【コラム】(8/7)
https://www.coindeskjapan.com/156554/
剛体(rigidbody)をヒンジで繋いで関節を作り動かす

# 環境
windows11
unity 2020.3.36f1

# 関節を作ろう
今回関節として繋ぐ三つのオブジェクトを出していきます。ヒエラルキーにカプセルを二つ、スフィアを一つ出します。カプセルを一つArmという名前にして下の図と同じ階層に置きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/8c24d73a-28a7-76bd-6ad4-2ccb73cc150e.png)
それぞれのtransformを以下のようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/5fb02ed4-40c9-552b-409e-8630c3adae0a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/4c86e564-a332-fb47-e49b-81674e557118.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/105e60bd-b93d-b20f-1961-dafd155b4e3f.png)
以下完成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/a5d2d98e-29bb-1f48-562b-ada510706b5c.png)
ここまで出来たらCapsule,sphare,Armにリジッドボディを付けます。そしてCapsuleのrigidbodyのis kinematicにチェックを入れ固定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/47d65e85-b28b-12d8-c4a3-46392d200f8b.png)
# ヒンジジョイントを追加して動きを制限しよう
スフィアにヒンジジョイントを追加しconnected bodyにcapsuleを設定し以下のパラメータにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/75f1135d-4825-f251-1812-aea27e57fa49.png)
armにもヒンジジョイントを追加しconnected bodyにsphereを設定し以下のパラメータにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/84d0e09e-e1cd-ddf4-1817-ddae71c0bd7c.png)
スフィアはY軸armはX軸でのみ回転できるようになりました。

# コード
以下のコードを書きCapuleにアタッチしましょう。
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class arm : MonoBehaviour
{
    GameObject sphere;
    GameObject arm1;
    Rigidbody sphereRb;
    Rigidbody armRb;

    // Start is called before the first frame update
    void Start()
    {
        sphere = GameObject.Find("Sphere");
        sphereRb = sphere.GetComponent<Rigidbody>(); 
        arm1 = GameObject.Find("Arm");
        armRb = arm1.GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        float inputX = Input.GetAxis("Horizontal");
        float inputY = Input.GetAxis("Vertical");
        float angleX = inputX * 60.0f;
        float angleY = inputY * 120.0f;
        armRb.rotation = Quaternion.Euler(angleX, 0.0f, 0.0f);
        sphereRb.rotation = Quaternion.Euler(0.0f, angleY, 0.0f);
    }
}
```
wasdキーで関節を回転できるようになりました。
![関節.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/92001ae2-0c35-161c-d22b-3a70136438e0.gif)
GCP Google Associate Cloud Engineer に合格しました

# はじめに
GCPの資格Associate Cloud Engineerを受けてきて、無事合格しました。
試験の情報が少なく苦労したので、参考情報をのせておきます。

# 前提
・AWS ソリューションアーキテクトアソシエイトを所持
・普段の業務ではAWSしか触らない
・GCPの知識はゼロで、まったく触ったことがない

# 試験にむけてやったこと
### Udemyの問題集を解く
https://www.udemy.com/course/gcpgoogle-cloud4200-y/

Udemyの50問x4セットの問題集です。2000円くらい？
とりあえず何も知らない状態からこれを3周して90%正答できるように復習しました。
ちなみに、少し出題が細か過ぎるのと、本番の試験の雰囲気とはちょっと違う問題が多いです。
サービスやコマンド、用語はほぼカバーできているので、わからん概念の洗い出しには良さそう。
コマンドの細かい所までは試験には出ないので、コマンド体系だけ理解しておけば良いと思います。

### サービス名の対応表を見る

https://qiita.com/hayao_k/items/906ac1fba9e239e08ae8

主要サービスのAWS→GCP対応表がありました。感謝です。
問題集を解きながら「で、Bigtableってなに？あ～DynamoDBのことね」となれます。

### 公式の確認問題をとく

https://www.cloudskillsboost.google/course_templates/77?utm_source=gcp_training&utm_medium=website&utm_campaign=cgc-infmod/

分かりにくい所にありますが、公式の確認問題がありました。無料です。
だいたい15問 x 5範囲　各セクションの、Diagnostic Questionsと、Knowedge Checkをやりました。
英語しかないですがChromeに日本語訳させてむりやり解きました。
※正答するまで正答が分からない残念仕様です…
でもこれが一番本番の試験に似ていたので、やっておいて良かったです。

### 公式模擬試験をとく
公式のなんちゃって模擬試験です。20問強しかない。ついででやっておきました。無料です。

https://cloud.google.com/certification/cloud-engineer


# テストについて
実際の仕事風な問題設定で、状況にあったベストプラクティス、正しい設定方法を答える感じです。
知識がぴったりなくても、それをやるのは大変じゃない？と、消去法で絞れる部分があります。
あまり内容に直接触れると規約違反になりそうなので、このくらいで。

# そのほか

・自宅を晒すのは抵抗があったので、ピアソンとかで行ったことのあるテストセンターで受けました。
・他の試験と違い平日しか取れませんでした。試験監視システム？の関係でしょうか。
・日程を予約するとメールで認証コードみたいなのをもらい、そのメールを当日印刷して持っていけと書いてあったので持っていきました。
（コードは試験前の同意書に記入が必要なので、忘れないように）
・身分証は運転免許証とクレカを持っていきました。
・試験後は正答率などが開示されません。感覚的には多分ギリギリだったと思います。

# おわりに
GCPはまだあまり浸透してない感じですが、サービスが増えると覚えることも増えそうなので、今のうちに取っておいてもよいかもしれません。
【CSS】positionとz-indexについて

# positionとz-index
※本記事は学習の備忘録目的です。筆者は初学者ゆえ、誤りなどございましたらご指摘いただけますと幸いです。

---
cssのプロパティのpositionとz-indexについての整理

**position：要素の位置を決めるためのプロパティ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/724fd8bd-a364-77f0-70ec-b4f0e5b65135.png)

・staticのz-indexの値は0で固定されている
・absoluteを使用するときは親要素はrelativeまたはfixedに設定する
・fixedはメニューバーなどのスクロール時に位置を固定したいものに対して使用する

<br>

**z-index：要素の重なり順を指定するためのプロパティ**
→z-index:10 のように指定し、数値が大きいほど上に表示される
Google Analyticsで"ページ階層とクエリ文字列"が使えなくなった場合の対処方法

普段Google Analytics(GA4)にクエリ文字列（URLパラメーター）ごとの表示回数は、[エンゲージメント] - [ページとスクリーン] の`ページパス + クエリ文字列とスクリーン クラス`で確認していました。

しかし突如`ページパス + クエリ文字列とスクリーンクラス`がプルダウンから消え、代わりに`ページ階層とスクリーン クラス`が追加されました。

ただ`ページ階層とスクリーン クラス`では、クエリ文字列（URLパラメーター）ごとの表示回数は確認することは出来ません。
![ga4_setting_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279967/967164c2-7597-aee4-c18d-f464be7967d0.png)
私の管理しているすべてのプロパティで同様の事象が起きているため、Google Analytics(GA4)のアップデートだと思ったのですがリリースノートには記載がありませんでした。

[Google Analytics - リリースノート](https://support.google.com/analytics/answer/9164320 "リリースノート")

# 解決策
トラックソースを追加することで、クエリ文字列（URLパラメーター）ごとの表示回数を出現させます

## 手順１
![ga4_setting_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279967/26096b00-d618-c04d-93a6-6fcb445865fb.png)

## 手順2
![ga4_setting_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279967/70902930-0014-f71a-c9e0-b50382af7c27.png)

## done
これでクエリ文字列（URLパラメーター）ごとの表示回数を確認することが出来ます

以上、お役に立てれば幸いです
【Express.js】リダイレクト時に未保存のセッションデータを確実に保存する

バグなのか仕様なのか分からないですが、`express-session`のデータ保存先（`sessionStore`）として、データベースやファイルなどI/Oに時間のかかるストアを選んだときに、リダイレクト後のリクエストで未保存のセッションデータを参照してしまうことがあったため解決策の備忘録です。


```js
function beforeRedirect(req, res, next) {
  // sessionデータを更新してからにリダイレクトするときにストア保存時の遅延により、
  // リダイレクト後の画面で保存前のセッションデータを参照してしまう場合があるため、
  // 確実にセッションを保存してからリダイレクトする
  const redirect = res.redirect;
  res.redirect = function () {
    if (req.session) {
      req.session.save(() => {
        redirect.apply(this, arguments);
      });
    } else {
      redirect.apply(this, arguments);
    }
  };
  next();
}

app.use(beforeRedirect);
```

## 経緯

https://github.com/expressjs/session/issues/74

この`issue`や他の`stackoverflow`では解決方法として、リダイレクト前に`session.save`しましょうねって結論になっていたのですが、全ての`router`で対応するのはめんどくさいし`save`を忘れそうなので、まとめて設定できるようにしたかったです。
C言語学習 - 九九表

# この記事について
・二重Forループによる九九表の作成


# 今日のソース
掛け算九九表を作成
```c
#include <stdio.h>

int main(void)
{
	for(int i=1; i<=9; i++){
	
		for(int j=1; j<=9; j++){
			
			printf("%d\t",i*j);
		}
		
		printf("\n");
	}
	
	return 0;
}
``` 

# 実行結果
![九九表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/025d70c9-b892-d685-0a65-ff2107053caf.png)

# やってみて思ったこと
調べもの中に掛け算九九表を見た影響から作成してみた。
アルゴリズムの方面か、C言語で不明な点(型や構造体、ポインタ)のどちらから学習するか悩み中
マイコンを中心にしていきたいので、後者の方が良い気がする。
【正規表現】URLの正規表現パターンを作る

# はじめに
業務にて、よくアクセスするページのURL（全角文字含む）をサクラエディタに追加し、ダブルクォーテーションで囲むことでクリッカブルなテキストにしたく試行錯誤したので備忘録を作成。

# 内容
ここでいうURLとは、`http://~.com/.../...`のような形式のものを指す。

```regex:URLの正規表現パターン
(?<=")([a-zA-Z]*:\/\/)\S*(?=")
```
ダブルクォーテーションで囲んだ部分のみをクリッカブルにしたいので、頭と末尾にそれぞれ肯定後読み(`(?<=")`)、肯定先読み(`(?=")`)のマッチングパターンを追加する。
`http://`または`https://`で始まる文字列にマッチさせるよう、`([a-zA-Z]*:\/\/)`を記載。
そのあとの文字列は全角文字でも許容するよう、非空白文字(`\S`)の一回以上の繰り返しを採用した。

# まとめ
おわり。正規表現がもっと使えるようになりたい。特に(肯|否)定(先|後)読み。
MacでRSA形式の秘密鍵をpemに変換する(id_rsa → .pem)

# やりたいこと
RSA形式で秘密鍵を作ったが、FTP Client(ForkLift)が公開鍵認証ではpemファイルしか選択できなかった。
作り直して公開鍵サーバー上げるのだるいな〜、変換しよ！

## 環境
M1 Macbook 

# Puttygen
openssl単体でできそうなきがしたけど、こめんどよくわからなかったのでputtygenなるものを使います。

https://www.puttygen.com/#Download_PuTTYgen_for_Mac

```bash
brew install putty
```

# 変換

```bash
puttygen id_rsa -O private-openssh -o hoge.pem
```

無事つながった。
複数アカウント管理のためAWS Control Towerを使ってみた


# 結論
1つの画面で複数アカウントを管理できるため利用するに越したことはない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2767929/dacc5beb-f8d5-a23c-c120-60d4a4914987.png)

# 構築手順
##### ①AWSマネージメントコンソールにログイン
##### ②AWS Control Towerを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2767929/8421a8ef-dc47-ae67-d1eb-81e2061f6ef3.png)

##### ③ホームリージョンの設定
- アジアパシフィック(東京)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2767929/ddd8ec2d-4580-8b7d-f7fd-9509abd550d2.png)

##### ④組織単位の設定
- 基盤となるOU：Security（デフォルト）→任意に変更
- 追加のOU：Sandbox（デフォルト）→任意に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2767929/a494d1bb-6245-04b4-99dd-1f311693625f.png)

##### ⑤共有アカウントと暗号化を設定する
- 管理アカウント：既存AWSアカウントのメールアドレス(マスターアカウントとなる)
- ログアーカイブアカウント
    - アカウントの作成：
    - アカウント名を変更：(オプション)
- アカウントの監査 
    - アカウントの作成：
    - アカウント名を変更：(オプション)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2767929/5ee08107-274e-5843-2083-d9eb4e55e02b.png)

##### ⑥設定が反映されることを待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2767929/5098dfcf-6716-6c0c-32a7-b7e16dbeee3a.png)

##### ⑦まとめ
組織や用途ごとにアカウントを分ける場合に複数アカウントがあるとアカウント管理が煩雑になりがちだが、ControlTowerを利用することで一元管理できるようになるため利用する価値は高いと感じました。