OmniAICreator/Qiita-1.07M huggingface dataset:
Debian 11 にOpenJDK 17をインストール（Temurin）

 はじめに

Temurinを利用してDebian 11にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2027-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y wget apt-transport-https
# mkdir -p /etc/apt/keyrings
# wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
# echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
# apt update
# apt install temurin-17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.7" 2023-04-18
OpenJDK Runtime Environment Temurin-17.0.7+7 (build 17.0.7+7)
OpenJDK 64-Bit Server VM Temurin-17.0.7+7 (build 17.0.7+7, mixed mode, sharing)
```
Debian 11 にOpenJDK 11をインストール（Temurin）

# はじめに

Temurinを利用してDebian 11にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y wget apt-transport-https
# mkdir -p /etc/apt/keyrings
# wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
# echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
# apt update
# apt install temurin-11-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.19" 2023-04-18
OpenJDK Runtime Environment Temurin-11.0.19+7 (build 11.0.19+7)
OpenJDK 64-Bit Server VM Temurin-11.0.19+7 (build 11.0.19+7, mixed mode)
```
Rook-CephのWebコンソールログイン時に『パスワードが違う』と怒られた時の対策

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

私は以前Rook-Cephのデプロイ手順をQiitaに投稿させて頂きました。
以下がその手順となります。

https://qiita.com/ohtsuka-shota/items/cc45d595f742f3625099

上記手順において、Webコンソールにログインする際のパスワードを求める方法として以下を記述しています。
```
root@rancher:~/rook/deploy/examples# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo 
Wd1CNs#;+\HwRL\E$Gk}
```

基本的には上記で問題ないと思うのですが、Rook-Ceph環境を削除したり再作成したりしていると、出力されたパスワードが違うと怒られることがあり、困ってしまいました。
その時のパスワード変更方法について記載します。

まず以下のコマンドを使用し、Rook-CephをCUIで操作できるPodに接続します。
```
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash 
```

次にディレクトリはどこでもいいので以下のようにコマンドを打ちます。
今回は参考までに/tmp配下に"password"と記載したpassword.txtファイルを用意しました。
```
[rook@rook-ceph-tools-7c497bc7b8-6m6tt /]$ cd tmp
[rook@rook-ceph-tools-7c497bc7b8-6m6tt tmp]$ echo password >> password.txt
[rook@rook-ceph-tools-7c497bc7b8-6m6tt tmp]$ cat password.txt
password
```

このファイルを使ってCephのadminユーザのパスワードを変更していきます。
使うコマンドは以下となります。admin部分がユーザ。そのあとにパスワードが指定しているファイルを-iオプションで指定してあげます。
```
[rook@rook-ceph-tools-7c497bc7b8-6m6tt tmp]$ ceph dashboard set-login-credentials admin -i password.txt
******************************************************************
***          WARNING: this command is deprecated.              ***
*** Please use the ac-user-* related commands to manage users. ***
******************************************************************
Username and password updated
```

ここまで出来ましたら、再度Webコンソールにアクセスしてユーザ名とパスワードを指定してあげてください。
上記の例ではadmin:passwordでログインできるようになっているはずです。
フォロー機能　一覧ページ

### :shamrock: 前提条件
・バージョン　rails 6.1.7
・device導入　・Bootstrap導入
・ユーザー機能実装済（Userモデル）
・投稿機能実装済（Bookモデル）
・フォロー機能実装済（relationhipsモデル)

_____
### :shamrock: 一覧ページ作成
:::note warn
今回は部分テンプレートを使用します。
:::
:star:部分テンプレートを作成
``_index.html.erb``
```diff_html
<table class='table'>
  <thead>
    <tr>
      <th>image</th>
      <th>name</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <% users.each do |user| %>
      <tr>
        <td><%= image_tag user.get_profile_image(50,50) %></td>
        <td><%= user.name %></td>
     <!--フォロー、フォロワー数の表示-->
        <td>フォロー数:<%= user.follower.count %></td>
        <td>フォロワー数:<%= user.followed.count %></td>

        <!--フォローボタン-->
        <td>
       <% if current_user != user %>
        <% if current_user.following?(user) %>
          <%= link_to 'フォロー外す', user_relationships_path(user.id), method: :delete %>
        <% else %>
          <%= link_to 'フォローする', user_relationships_path(user.id), method: :POST %>
        <% end %>
       <% end %>
      </td>
      
        <td><%= link_to 'Show', user %></td>
      </tr>
    <% end %>
  </tbody>
</table>
```

:star:relationhipsディレクトリ内に **follwed.html.erb** と **follwer.html.erb**を作成します。

``follwer.html.erb``
```diff_html
<!--フォロワーの一覧ページ-->
<h1>Follower Users</h1>
<table class='table'>
  <tbody>
   <%= render 'users/index', users: @users %>
  </tbody>
</table>
```
``follwed.html.erb``
```diff_html
<!--フォローしているユーザー一覧-->
<h1>Follow Users</h1>
<table class='table'>
  <tbody>
    <%= render 'users/index', users: @users %>
  </tbody>
</table>
```
:snowflake:**<%= render 'users/index', users: @users %>** で作成した部分プレートを呼び出す。
____

### :shamrock: フォロー、フォロワー一覧ページへのリンク作成
（今回はフォロー、フォロワー数にリンクを設定する。）

:tangerine:　**イメージ画像**
![スクリーンショット 2023-07-08 19.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/cc2ce316-63ac-8e3d-fd3c-d2b055c6402d.png)


リンクを表示したいページに以下を追加する。
今回は、``_info.html.erb``に以下を追加
```diff_html
 <tr>
    <th>follows</th>
    <th>
      <%= link_to user_follows_path(user) do %>
      <%= user.follower.count %>
      <% end %>
    </th>
  </tr>
  
  <tr>
    <th>followers</th>
    <th>
      <%= link_to user_followers_path(user) do %>
        <%= user.followed.count %>
      <% end %>
    </th>
  </tr>
```
___
:tangerine:　**一覧ページ完成イメージ**
![スクリーンショット 2023-07-08 20.13.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/ca75fcce-e34b-e19f-039e-f36fbb040887.png)

### :hatched_chick: ひとこと
今回は、リンクをカウント数に設定しましたが、一覧ページ用のボタンを作成したりしてもいいですね！
まだまだ初心者ですので、間違えている部分があれば、教えて頂けると幸いです。


### :cherry_blossom: 参考

https://qiita.com/oak1331/items/d174befde50a8d2ae112


https://qiita.com/oak1331/items/d174befde50a8d2ae112
KiCad 5 のシンボルライブラリを kicad_sym 形式にコンバートする

KiCad7 で昔のシンボルライブラリを加工しようとしたら、編集ができませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/83245ace-79a5-0b83-1ffe-8af3ba99815f.png)

どうやら KiCad5→6になったときにシンボルライブラリの形式が変わったらしい。


# 変換作業

先に出ていた警告で「シンボルライブラリを管理」を押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0876f3a8-6b46-fb8d-9004-3a2f77d081f7.png)

該当ファイルを選択して、「ライブラリを移行」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a5625eb1-d9b6-0846-1fa7-fede3a546a10.png)

うまくいったみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/914feebb-e427-24f8-3071-cac1b03a7638.png)

警告が消えて編集できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3000c1db-c698-bf42-b796-a65c4bf3b651.png)

ファイルを確認すると、旧 lib ファイルは削除されているみたいでした。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a5e0367d-fdd2-5228-f437-27ae253013eb.png)
Intellij のプロジェクトを開けないときの解決法の一例

# Env
OS: Windows11
IntelliJ ver: 2023.1 (Community)

# プロジェクトが立ち上がらない
　コードを書こうと、いつもの通りタスクバーにピン止めした IntelliJ のアイコンを右クリックしてから、プロジェクト名を選択する。
......
普段であれば10秒もすればコードを編集を編集可能な状態になるのだが、なぜか今日は全体がグレーがかった画面のまま。一向に編集可能な画面へ進む気配がない。
ウィンドウを動かすことも、閉じるボタンをクリックすることもかなわない。仕方なくタスクマネージャーから IntelliJ を落とす。
もう一度同じ手順で立ち上げてみるが状況は変わらず。
OS の再起動をかけてみるも変わらず。

# ログから分析（失敗）

https://pleiades.io/help/idea/directories-used-by-the-ide-to-store-settings-caches-plugins-and-logs.html

上記のページを参考にログを読み解決を図ろうとしたが、まあ長い。しかもざっと目を通した感じでは特にエラーも出ず立ち上がっていることになっている模様。

# .lock ファイルを消す（成功）
`C:\Users\[ユーザ名]\AppData\Roaming\JetBrains\IdeaIC2023.1\.lock`
を削除し、再度立ち上げることで起動した。

# 原因
　知らぬ。ソフトを閉じるタイミングが悪かったのかも?
ちなみに、ロックファイルが残ってしまったせいでソフトが開けないというのは割とありがちなことなので、覚えておいて損はないと思う。

　名前からして何かをロックしていて、削除すると壊れてしまうのではないかと思うかもしれない。しかしロックファイルは、ソフトを多重起動してデータの競合を起こさないようにするためのものなので、少なくともソフトを立ち上げていない状態であれば消しても問題はない。

https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF


# おわり
　拙い記事ですが、お役に立てれば幸いです。
Next.jsのapp routerでMUIを使うとエラーが出る件について

# はじめに
Next.jsのapp routerでMUIを使おうとすると「Server Error
TypeError: createContext only works in Client Components. Add the "use client" directive at the top of the file to use it. 」というエラーに直面した場合の対処法を説明します。
以下はTypeScriptを使用する前提で記載します。

# 結論
- ｢styles.tsx｣というような任意の名前のファイルを作成し、当該ファイルにおいてMUIのimportしてexportし、MUI
しようしたいファイルにおいて、styles.tsxをimportする

または
- 素直に"use client"をファイルの先頭に付ける

# フォルダ構成
フォルダ構成は以下のとおりです。
project
 ├app
 │  └page.tsx
 │  │
 │  └styles.tsx

# 解決法１
まず、「styles.tsx」で以下のとおり記載します。
```ts
"use client";
import Box from '@mui/material/Box';
export { Box }
```

次に、「page.tsx」で以下のとおり記載します。

```ts
import { Box } from "./styles";
export default function Example() {
  return (
    <>
      <Box>exapmple</Box>
    </>
  );
}
```

以上のようにすることで「page.tsx」では"use client"とせずにMUIを使用することが可能となります。

# 解決法２
「page.tsx」の先頭に「"use client";」を付けることでもエラーを回避できます。しかし、この方法だとserver componentsをあまり活用できなくなるような気もします。。

```ts
"use client";

import Box from '@mui/material/Box';
export default function Example() {
  return (
    <>
      <Box>exapmple</Box>
    </>
  );
}
```

# 参考サイト
[TypeError: createContext only works in Client Components. Add the "use client" directive at the top of the file to use it](https://stackoverflow.com/questions/76181096/typeerror-createcontext-only-works-in-client-components-add-the-use-client-d)
DockerでGo言語の開発環境を作る方法

# はじめに
バックエンドにGoを使いたいと思ったときに作ったものです。
とりあえず動作する開発環境を作りたいという方におすすめです。
私自身、Dockerを用いたGoの開発環境の構築に苦労しましたので、同じく苦労している方の参考になれば幸いです。
# フォルダ構成
フォルダ構成は以下のとおりです。
project
 ├backend
 │  └Dockerfile
 │  └cmd/
 │    　└─api/
 │       　　└─main.go
 └docker-compose.yml

# 具体的な手順
まず、Dockerfileを以下のとおり作成します。

```dockerfile
FROM golang:1.19.1-alpine3.16

WORKDIR /app

# 最初は以下の部分はコメントアウトする
# COPY backend/go.mod .
# COPY backend/go.sum .

# RUN go mod download
# RUN apk add --no-cache gcc
# RUN apk add --no-cache musl-dev

# COPY ./backend .

# CMD ["go", "run", "./cmd/api"]
```
次に、docker-compose.ymlを以下のとおり作成します。

```docker
version: "3.3"

services:
  backend:
    build:
      context: .
      dockerfile: ./backend/Dockerfile
    ports:
      - 8080:8080
    volumes:
      - ./backend:/app
```

以上のファイルを作成したらprojectディレクトリで以下のコマンドを実行しイメージを作成します。
```
docker compose build
```

イメージが作成出来たら、以下のコマンドを実行しコンテナに入ります。

```
docker compose run --rm backend sh
```

コンテナに入ったら、以下のコマンドを実行します。
backendディレクトリ直下に「go.mod」が作成されます。

```go
go mod init backend
```

続いて、何かモジュールをインストールします。ここでは、例えば、uuidをインストールします。すると、backendディレクトリ直下に「go.sum」が作成されます。
```go
go get github.com/google/uuid
```

以上の作業を終えたらexitコマンドを実行しコンテナから抜けます。
```
exit
```

ここで、Dockerfileのコメントアウトを解除します。

```dockerfile
FROM golang:1.19.1-alpine3.16

WORKDIR /app

# コメントアウトを解除
COPY backend/go.mod .
COPY backend/go.sum .

RUN go mod download
RUN apk add --no-cache gcc
RUN apk add --no-cache musl-dev

COPY ./backend .

CMD ["go", "run", "./cmd/api"]
```

解除したらprojectディレクトリで以下のコマンドを実行しイメージを再作成します。
```
docker compose build
```

ここで、main.goの中身を以下のとおり編集します。今回はサンプルなので簡単な内容にします。

```go
package main
import (
	"fmt"
)
func main() {
	fmt.Println("Hello World!")
}
```

そして、以下のコマンドを実行し、ターミナルに「Hello World!」と表示されれば成功です。
```
docker compose up
・
・
・
Hello World!
```

# まとめ
以上、とりあえず動作するDockerを用いたGoの開発環境の作り方を説明しました。
Debian 11 にOpenJDK 8をインストール（Temurin）

# はじめに

Temurinを利用してDebian 11にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2026-11がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y wget apt-transport-https
# mkdir -p /etc/apt/keyrings
# wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
# echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
# apt update
# apt install temurin-8-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (Temurin)(build 25.372-b07, mixed mode)
```
x=sin(t),y=cos(t-pi/6)*sin(t)の面積「2023神戸大学前期理科系【５】」をMathematicaとWolframAlphaとsympyでやってみたい。

・sympyでグラフがでます。
**・関数の増減表作成プログラム(媒介変数版)　勉強中。探しています。**
　以下は、関数の増減表作成プログラム(xy版)です。
　https://qiita.com/mrrclb48z/items/f98d7ea0f664768790ed

オリジナル(youtube)　
みなみ塾　様より

https://youtu.be/X6i4TUExyDM

T氏　様より

https://mathmathmass.exblog.jp/33021758/

上と同じです。大学入試数学問題集成＞【５】テキスト

https://mathexamtest.web.fc2.com/2023/202310601/2023106010100mj.html#top-0104

# Mathematicaで
(2)だけ
```
ParametricPlot[{Sin[t], Cos[t - Pi/6]*Sin[t]}, {t, 0, Pi}]
```

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/9736f913-4ebe-7152-f0b6-41f4984b2106.png)


# WolframAlphaで
勉強中
0<=t<=2πのグラフがでます。

https://ja.wolframalpha.com/input?i=x%3Dsin%28t%29%2Cy%3Dcos%28t-pi%2F6%29*sin%28t%29&lang=en

https://ja.wolframalpha.com/input?i=0%3C%3Dt%3C%3D%CF%80%2Cx%3Dsin%28t%29%2Cy%3Dcos%28t-pi%2F6%29*sin%28t%29&lang=en

# sympyで(みなみ塾様,T氏様のやり方)
勉強中

# sympyで(sympy的?安易なやり方)
```python
from sympy import *
x,y,t=symbols('x,y,t',Real=True)
(st,en)=(0,pi)
x=sin(t)
y=cos(t-pi/6)*sin(t)
dxdt_0=solveset(diff(x),t,Interval(st,en))
dydt_0=solveset(diff(y),t,Interval(st,en))
t_y0  =solveset(y      ,t,Interval(st,en))
print("#(1)",dxdt_0,dydt_0)
print("#(2)",t_y0)
print("#(3)",integrate(y*diff(x),(t,t_y0.args[2],en)))
plot           (x,  (t,st,en))
plot           (y,  (t,st,en))
plot_parametric(x,y,(t,st,en))
#(1) {pi/2} {pi/3, 5*pi/6}
#(2) {0, 2*pi/3, pi}
#(3) sqrt(3)/12
```
・plotは縦横比異なります。
・listplot？の勉強中です。

dx/dt
![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/cc58b410-99be-e90c-1495-cc96946a7ed4.png)
dy/dt
![1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/2d21f416-13d3-d2e1-5c70-539e6eaf5043.png)
x-y
見た目がさびしくて、申し訳ありません。
![3png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/fc1a8522-8583-68da-2d4f-34bc7e1f02fc.png)

# sympyの実行環境
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# 参考
以下、おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03#%E5%8F%82%E8%80%83wolframalpha-%E9%96%8B%E7%99%BA%E7%89%A9%E8%AA%9E
Debian 12 にOpenJDK 8をインストール（Temurin）

# はじめに

Temurinを利用してDebian 12にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2026-11がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y wget apt-transport-https
# mkdir -p /etc/apt/keyrings
# wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
# echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
# apt update
# apt install temurin-8-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (Temurin)(build 25.372-b07, mixed mode)
```
【FastAPI】Jinja2Templatesのデリミタ（マスタッシュ記法）を変更する

FastAPIでHTMLを返したあと、フロントエンドでVueを使用したときのデリミタ`{{ }}`の競合を解決する方法です。
Vue側のデリミタを変える方法はすぐ見つかりますが、Jinja2Templates側のデリミタを変える方法がなかなか見つからないので議事録として残します。

```python
# Jinja2テンプレートの設定
dir_path = os.path.join(os.path.dirname(os.path.abspath(__file__)))
templates = Jinja2Templates(
    directory=os.path.join(dir_path, "templates"),
    # フロントエンドでVueを使用しており変数プレースホルダーが被るため変更する
    variable_start_string="{$", 
    variable_end_string="$}",
)

@router.get(
    "/login",
    summary="ログイン画面",
    description="ログイン画面のHTMLを返します。",
    response_class=HTMLResponse,
    tags=["HTMLResponse"],
)
async def login(request: Request):
    context = {"request": request}
    return templates.TemplateResponse("login.html", context)
```
Debian 12 にOpenJDK 11をインストール（Temurin）

# はじめに

Temurinを利用してDebian 12にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y wget apt-transport-https
# mkdir -p /etc/apt/keyrings
# wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
# echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
# apt update
# apt install temurin-11-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.19" 2023-04-18
OpenJDK Runtime Environment Temurin-11.0.19+7 (build 11.0.19+7)
OpenJDK 64-Bit Server VM Temurin-11.0.19+7 (build 11.0.19+7, mixed mode)
```
Git で push できない clone もできないが、検索しまくってもわからず。Chat-GPTで解決した事例

自分>　git   ssh-add -l  で The agent has no identities. がでる場合　どうすればいいですか

Chat-GPT>
`ssh-add -l` コマンドで "The agent has no identities." というエラーメッセージが表示される場合、SSHエージェントに登録されているSSH鍵が存在しないことを意味しています。以下の手順で問題を解決できます。

1. SSH鍵の存在を確認する: `ls -al ~/.ssh` コマンドを実行して、`id_rsa` や `id_dsa` といったプライベート鍵（`*.pub` 拡張子の公開鍵と対になるもの）が存在することを確認します。もし存在しない場合、新しいSSH鍵を作成する必要があります。

2. SSH鍵を生成する: 鍵が存在しない場合、`ssh-keygen` コマンドを使用して新しいSSH鍵を生成します。以下のコマンドを実行し、鍵の生成手順に従ってください：

   ```
   ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
   ```

   コマンドを実行すると、鍵の保存先やパスフレーズの設定を求められます。適切な設定を行ってください。

3. SSHエージェントに鍵を追加する: 生成したSSH鍵をSSHエージェントに追加します。以下のコマンドを実行します：

   ```
   ssh-add ~/.ssh/id_rsa
   ```

   パスフレーズを求められる場合は入力してください。

4. `ssh-add -l` を再度実行する: 鍵が正常に追加されたか確認するために、`ssh-add -l` コマンドを再度実行します。正常に鍵が追加されていれば、登録されたSSH鍵のリストが表示されます。

これらの手順に従って、SSHエージェントに鍵を追加し、`ssh-add -l` コマンドで鍵が正常に表示されるか確認してください。


自分> id_rsa 　のプライベート鍵が存在しています

Chat-GPT> 
`id_rsa` のプライベート鍵が既に存在している場合、SSHエージェントがそれを認識していない可能性があります。以下の手順を試してみてください。

1. SSHエージェントを起動する: `eval "$(ssh-agent -s)"` コマンドを実行して、SSHエージェントを起動します。

2. プライベート鍵をSSHエージェントに追加する: `ssh-add ~/.ssh/id_rsa` コマンドを実行して、プライベート鍵をSSHエージェントに追加します。パスフレーズが設定されている場合は、入力が求められます。

3. `ssh-add -l` を実行する: `ssh-add -l` コマンドを再度実行して、登録されたSSH鍵のリストが表示されるか確認します。プライベート鍵が正常に追加されていれば、鍵の情報が表示されるはずです。

これらの手順でSSHエージェントにプライベート鍵を追加し、`ssh-add -l` コマンドで鍵が正常に表示されるか確認してください。もし問題が解決しない場合、SSHエージェントの設定や環境に問題がある可能性があります。その場合は、SSHエージェントの再起動やSSHの設定を確認してみてください。
上半期で読んで良かった技術書３選

# はじめに

はじめまして、記事をご覧いただきありがとうございます。
社会人二年目のインフラエンジニアです。
本記事では私がこの半年間で読んでためになった技術書を紹介します。

## 体系的に学ぶ 安全なWebアプリケーションの作り方 第二版　　脆弱性が生まれる原理とその対策の実践
![secureweb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728371/7cfc5853-4aad-6e33-6f79-18a0931bbd79.jpeg)
### 概要
Webアプリケーションに脆弱性が生まれる理由、脆弱性を解消するためのプログラミングの方法などをPHPサンプルへの攻撃を通して具体的に学ぶことができます。


### 感想
脆弱性とその対策が網羅的に記述されており参考になりました。
また、仮想環境上で攻撃者の目線になれる環境を作って実践できるため面白さとわかりやすさが両立されていたように思いました。
・[体系的に学ぶ 安全なWebアプリケーションの作り方 第二版　　脆弱性が生まれる原理とその対策の実践](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%AC%AC2%E7%89%88-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8/dp/4797393165/ref=cm_cr_arp_d_product_top?ie=UTF8)

## 運用設計の教科書~現場で困らないITサービスマネジメントの実践ノウハウ
![opesekkei.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728371/5d48cb7f-9162-ca7b-d04f-ea01da89e951.jpeg)

### 概要
運用とは何かを分類して説明 ・各工程毎に運用設計に必要な作業を提示 ・業務開始時の関係図、運用方法、管理方法の説明 運用設計の仕方をあるプロジェクトを例に上げて説明しています。

### 感想
私が参画している案件では保守業務の中で暫定運用リスト(障害に対する恒久対処までの運用対処などの一覧)への追記や、運用員さんが使用する手順書の作成、現地作業時のコミュニケーションなど運用員さんと関わる機会が多々あります。
参画当初、私はそういった業務の中で運用員さんから具体性の欠如や書きっぷりなどに対してご指摘を受ける機会が多々ありました。
その中で私はこの書籍を読み、運用において何をどの程度詰めておけば良いのか/詰めておかないとまずいのかなどの観点を自身の経験と照らし合わせて学ぶことができました。

・[運用設計の教科書~現場で困らないITサービスマネジメントの実践ノウハウ](https://www.amazon.co.jp/%E9%81%8B%E7%94%A8%E8%A8%AD%E8%A8%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%9B%B0%E3%82%89%E3%81%AA%E3%81%84IT%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6-%E6%97%A5%E6%9C%AC%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%BA%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4297107937/ref=sr_1_1?adgrpid=136258831365&hvadid=658891321328&hvdev=c&hvqmt=e&hvtargid=kwd-905002749597&hydadcr=4073_13329437&jp-ad-ap=0&keywords=%E9%81%8B%E7%94%A8%E8%A8%AD%E8%A8%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&qid=1688804060&sr=8-1)



## 絵で見てわかるITインフラの仕組み
![edemiterikai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728371/1a8f2589-80c7-0c33-44b5-0a86126a8817.jpeg)

### 概要
ITインフラという領域全体を、基本的なインフラ構成から基本技術、それらを実際の冗長化、監視、性能においてどのように使われるのかまでわかりやすく図で説明しています。

### 感想
システムを俯瞰してみた時に自分が慣れ親しんでいる領域とそうでない領域に関して、それらがどのように関わっているのかなど体系的な理解を促進することができる一冊だと感じました。
自分が触れる技術領域が広くなってきた時にもう一度読み返してみたいと思うような書籍です。

こちらの書籍はシリーズ化されており、特定の分野にフォーカスしたものも出版されているのでご興味があるかたはそちらもチェックしてみてください。
・[絵で見てわかるITインフラの仕組み](https://www.amazon.co.jp/%E7%B5%B5%E3%81%A7%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8BIT%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-%E6%96%B0%E8%A3%85%E7%89%88-%E5%B1%B1%E5%B4%8E-%E6%B3%B0%E5%8F%B2/dp/4798158461)

# 終わりに
本記事を読み、気になる書籍がありましたら是非ご購入を検討してみてください。
最後までご覧いただきありがとうございました。
不特定多数のGoogleカレンダーに登録できるURLを生成するアプリを作った

## 初めに
下記のように、自分のGoogleカレンダーに登録するURLを発行してくれる機能があるサイトあるかと思う。
[Connpass](https://increments.connpass.com/event/282931/)とか...。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/3003b482-de1a-d202-1040-b081682f744e.png" width=50%>

最近、参加者が定まってないイベントをあらかじめ共有しておき、そこから各人のカレンダーに登録してもらえたら便利だなと思っていた。

## 実現方法
下記のように指定のパラメータを付与したGETリクエストで実現ができ、現在(2023/07/08時点)でも使用が可能であることがわかった。
[APIを使わずにGoogleカレンダーに予定を作成する](https://qiita.com/s-mori/items/24c128e0b0d841036dd8)
毎回URLを手動で作るのは面倒なので、WEBアプリで作成できるようにした。

## アプリ
[共有イベント登録リンク生成アプリ(Googleカレンダー)](https://event-link-generator.deno.dev/)

## 使い方
1. 入力項目を埋めていく
1. Generate Link! を押下する
1. クリップボードにURLが自動で貼られるのでSlackなどで共有する
1. ブラウザで上記URLを貼るとGoogle Calenderのイベント登録画面が開き入力した内容が自動で反映される
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/6b157f29-e648-0f93-bd88-87e6811fd14d.png" width=50%>
上記の手順を実行すると、下記のURLが生成される。URLへアクセスすると

[生成されたURLの例](https://www.google.com/calendar/render?action=TEMPLATE&text=%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E3%81%97%E3%81%AA%E3%81%84%E4%BC%9A&dates=20230725T191500/20230725T200000&location=internet&details=%E3%81%82%E3%81%88%E3%81%A6%E7%9C%BA%E3%82%81%E3%82%8B%E3%81%A0%E3%81%91&sf=true&output=xml)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/28dab179-be96-c31f-a561-8dfaf45b67f1.png" width=50%>

ソースコードは下記の通りである。
[event-link-generator-for-google-calender](https://github.com/nagauta/event-link-generator-for-google-calender)

## Raycastにも機能追加する
同様の機能を`Googleカレンダーの拡張機能`として実装し、[PR](https://github.com/raycast/extensions/pull/7430)を出している。
![google-calender-1.png]()
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/36a1c10c-e204-598d-763c-d3c0f9f350c7.png" width=50%>

→同じようにURLが生成され登録する画面に遷移される。

## 技術スタック
[Deno(Fresh) | バックエンド](https://fresh.deno.dev/)
[Preactjs | フロントエンド](https://preactjs.com/)
[Tailwind CSS](https://tailwindcss.com/)
[Deno Deploy | デプロイ環境(サーバレス)](https://deno.com/deploy)

## 終わりに
だいぶ楽にイベント登録URLを作成しシェアできるようになった。
Raycastの方の拡張機能が承認・マージされたらそっちをたくさん使いそう。

※なお共有するURLは、(Gooleログインしている状態の)ブラウザで開いてもらう必要がある。
(PCはアプリから開いてもうまくいくかも)

以上。
Debian 12 にOpenJDK 17をインストール（Temurin）

# はじめに

Temurinを利用してDebian 12にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2027-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y wget apt-transport-https
# mkdir -p /etc/apt/keyrings
# wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
# echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
# apt update
# apt install temurin-17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.7" 2023-04-18
OpenJDK Runtime Environment Temurin-17.0.7+7 (build 17.0.7+7)
OpenJDK 64-Bit Server VM Temurin-17.0.7+7 (build 17.0.7+7, mixed mode, sharing)
```
Java SE11 Silver まとめ


# 始めに
Java Silver11の試験に合格したため、試験のための情報を記載したいと思います。
意外とsilver11に対応した記事が少ないため、参考になれば幸いです。
私は、２年目のエンジニアです。
もともと文系でしたのでそこまでプログラミングに詳しくはありません。
JavaSilverを受験する前にIPAの資格のITパスポート～応用情報までを取得しました。

研修でJavaの研修を少し受けてそのあと業務でも少しJavaを触った程度でした。
Java Silverに２年目の5月に受験し、合格しました。

### この記事の対象者
これからJava Silverを受けようと思っている方
Javaの勉強を始めた方

### この記事で伝えること
・JavaSilver11の難易度
・JavaSilver11の勉強方法・勉強時間
・JavaSilver11の試験内容で大事な部分まとめ
・JavaSilver11を受けてみて

# JavaSilver11の難易度
javaSilverの公式（[Oracle公式](https://www.oracle.com/jp/education/certification/jse11-5570635-ja.html#1 "Oracle 公式")）の位置づけとしては
>Oracle Certified Java Programmer, Silver SE 11 認定資格は、Javaアプリケーション開発に必要とされる基本的なプログラミング知識を有し、上級者の指導のもとで開発作業を行うことができる開発初心者向け資格です。日常的なプログラミング・スキルだけでなく、さまざまなプロジェクトで発生する状況への対応能力も評価することを目的としています。

となっています。
IPAのITパスポート～応用情報の試験と比較したJavasilverの難易度の個人的な主観としては、**基本情報と同じか少し下くらい**だと思います。
JavaSilverは、Javaの基本的なルールなどが網羅されている試験です。
プログラミングを全く触ったことがない場合は、基礎的な勉強から行うべきですが、少しでも触ったことがある方であれば、挑戦できると思います。


# JavaSilver11の勉強方法・勉強時間
前段でも述べていますが、JavaSilverの試験は全くのプログラミング初心者向けの資格ではありません。いわゆる変数・条件分岐・配列などのプログラミングの基礎を知っていることが前提かと思います。
その状態であれば、あとはJavaに関してどれくらい慣れているかによりますが個人的な勉強時間の目安は**2か月～3か月**が妥当かと思います。

勉強方法は、よく言われていると思いますが**黒本**のみで大丈夫です。
・[徹底攻略Java SE 11 Silver問題集[1Z0-815]対応 ](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625)
この本の特徴は、JavaSilverの勉強すべき項目が章立てで問題が組まれており、その後詳しい解説がされているというところです。つまり、先に解説や教科書的な説明はありません。
章の最後には、網羅的な総仕上げ問題が2つあります。

最初は正直全くわからないことも多いと思います。自分は
問題をサクッと行う。（1章~11章）
↓
解答・解説を見て重要なところをメモにまとめる。
↓
もう一度問題を行う。(1章~11章)
↓
間違えたところの解説を見てメモにまとめる。
↓
総仕上げ問題①
↓
解答・解説見る。まとめる
↓
総仕上げ問題①２回目
↓
解答・解説見る。まとめる
↓
総仕上げ問題②
↓
解答・解説見る。まとめる
↓
総仕上げ問題②２回目
↓
解答・解説見る。まとめる
で勉強を行いました。１回目は基本的にわからなくてもしょうがないと思います。この参考書は先に解説があるわけではないので、解説で理解してまとめた後、もう一度解いたときに正解できるかが大事かと思います。

# JavaSilver11の試験内容で大事な部分まとめ

それぞれの章の重要な部分を記載します。ここは理解が必須というところです。
①Javaの基礎
・SE11からのソースファイルモードに関して

②基本データ型と操作
・charとshortの互換性
・varの型推論
・charAtメソッド、indexOfメソッド、substringメソッド
・StringBuilderクラス

③演算子と判定構造
・インクリメントのタイミング
・同一性`==`と同値性`equals()`、コンスタントプール、intern()メソッド

④繰り返し処理
・while文、do-while文、for文のルール
・ラベル

⑤配列
・配列の宣言、初期化（エラーが発生する書き方）
・cloneメソッド

⑥インスタンスとメソッド
・static
・ローカル変数
・オーバーロード
・コンストラクタ、**デフォルトコンストラクタ**
・**アクセス修飾子**
・可変長引数

⑦クラスの継承、インターフェース、抽象クラス
・**インターフェーズ**
・**抽象クラス**
・オーバーライド
・**継承の考え方**
・**ポリモーフィズム**

⑧ラムダ式
・ラムダ式の書き方、省略の書き方
・ラムダ式のルール
・4つのパターン(Consumer,Supplier,Predicate,Function)

⑨API
・Mathクラス（pow,sqrt）
・java.lang.Chracterクラス
・LocalDateクラス
・java.util.Mapインターフェース
・**ArrayListクラス**
・**固定長のリスト（asListメソッド、ofメソッド）**
・メソッド参照

⑩例外処理
・trya-catch-finallyの書き方
・try-with-resources
・**検査例外、非検査例外の違い**

⑪モジュール
・モジュールとは
・**モジュールの実行コマンド**
・**モジュールの設定のコマンド**
・**依存関係のコマンド**
・モジュールの一時利用

上記の部分は、まず押さえるが大事です。
ややこしいところ特に重要だと思うのが。**継承。インターフェース、抽象クラス、アクセス修飾子**です。
また、暗記項目として**モジュールの各種コマンド**があります。ここは、覚えるしかないと思います。逆に言うと暗記すれば困りません。

# JavaSilver11を受けてみて
Javasilverは、Javaに少しでも触れたことがある人であれば充分受けることができる難易度だと思います。
また、単純暗記項目というのが少なく、Javaのルールを網羅的に把握していくといった試験かと思います。そのため、取得することで一定Javaのルールを理解できますし、スキルが身についたことの自信もつくと思います。

この記事があなたの役に立てばと思います。
最後までお読みいただき、ありがとうございます！
【AZ-900】Microsoft Power AutomateとAzure Logic Appsの違い

## Microsoft Power AutomateとAzure Logic Appsの共通点
- ビジネスプロセスの自動化を実現できるサービス
- 入力、アクション、条件、出力を定義
- スケジュールやトリガーで実行

## Microsoft Power Automateの特徴
- Azure Logic Appsプラットフォーム上に構築されている
- 対象ユーザーは**ビジネスユーザー**(現場の人)
- 使用に必要なツールは、ブラウザやモバイルアプリ
- セキュリティは、Microsoft 365セキュリティ監視ログ、DLP(Data Loss Prevention)機能、機密データ保存時の暗号化

## Azure Logic Appsの特徴
- 対象ユーザーは**開発者**など技術を有する者
- **複雑なフロー**(セキュリティ対策を必要とするなど)の実現が可能
- 使用に必要なツールは、**コードビューを利用できる**ツール(ブラウザーまたはVSCodeやVisualStudio)
- **Azureによるセキュリティ保証**

## まとめ
#### Microsoft Power Automate
エンドユーザーが　日常的なタスクを自動化するためのツール
#### Azure Logic Apps
開発者が組織全体のプロセスを自動化するためのツール

## 参考サイト
【公式サイト】[Azure における統合と自動化の適切なサービスを選ぶ](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-compare-logic-apps-ms-flow-webjobs)
遅すぎるWindows 10を直してみる

# Windows Defender
## MsMpEng.exeを検疫対象から外す

「設定」
「更新とセキュリティ」
「Windows Defenderのセキュリティセンター」
「ウイルスの脅威の防止」
「ウイルスの脅威の防止の設定」
「除外の追加または削除」
「除外の追加」
C:\Program Files\Windows Defender¥MsMpEng.exe
を指定

## 優先度変更
「Microsoft」
「Windows」
「Windows Defender」
「Windows Defender Scheduled Scan」
「最上位の特権で実行する」を外す

# superfetch
無効化
「サービス」にて「SysMain」を停止、無効化

# superfetch
無効化
「サービス」にて「SysMain」を停止、無効化

https://ygkb.jp/4475
GitHub Pagesで誰でもwebサイトを公開する方法

# GitHubPages について

GitHub Pages は GitHub でホスティングされる静的サイトを作成するための簡単な方法です。 ご自身のリポジトリに [README.md](http://readme.md/) や index.html などのファイルをプッシュするだけで、無料でホストされたサイトが作成されます。

# GitHub Pages を使用するメリット

- 無料ホスティング：GitHub Pagesは、GitHubアカウントと連携して無料で利用できます。これにより、プロジェクトや個人のウェブサイトを簡単に公開できます。
- 簡単なセットアップ：リポジトリにindex.html などの必要なファイルをプッシュするだけで、サイトが自動的に生成されます。特別なサーバーの設定や複雑な設定は必要ありません。リポジトリに静的なウェブページを追加するだけで、すぐに公開できます。
- バージョン管理と一貫性：GitHub Pagesは、Gitのバージョン管理システムと連携しています。これにより、ウェブページの変更履歴を簡単に追跡できます。また、複数の開発者が協力して作業する場合でも、一貫性を保つことができます。
- CI/CDの統合：GitHub Pagesは、GitHub ActionsなどのCI/CDツールと統合することができます。これにより、コードの変更や更新が自動的にデプロイされるため、開発プロセスがスムーズになります。

# GitHubPagesで公開する手順

## GitHubアカウントの作成

GitHubのアカウントを所有していない方は、アカウントを作成するところから始めてください。

https://github.com/

## リポジトリの作成

ファイルをアップロードするために、リポジトリを作成します。
注意点として、**無料で**GitHubPagesに公開するためには、**Public**で公開する必要があります。


https://docs.github.com/ja/get-started/quickstart/create-a-repo

## リポジトリにファイルをアップロード/pushする

作成したリポジトリにHTML/CSS等のファイルをアップロードします。
GitHubを利用したことがある方は、作成したリポジトリにpushを行ってください。



## ページを公開

ページを公開する設定に入ります。
ファイルをアップロードしたリポジトリのsettings
→　Code and automation Pagesタブ
→　【Your site is live at (生成されたURL）】
が表示されていればGitHubPagesでの公開は完了です。

注意点として、もし表示されていない場合は
「Branch」の項目が「**None**」
となっていると思います。
これをデフォルトのブランチ（**master** or **main**）に変更して
「Save」ボタンを押すことでURLが表示されます。



# 最後に

GitHubPagesを用いることにより、静的サイトを無料で簡単に公開できるようになりました。
ぜひご利用ください！
KiCad7 で PCB基板ファイルを元に footprint ライブラリを作る

「KiCad PCB基板ファイルからfootprintライブラリを作る」
https://qiita.com/nanbuwks/items/af10ffc161209d06486c
では、 KiCad5 で作業をしましたが、KiCad7で作業をするとエラーが出ました。


```

import sys
sys.argv = ['','/home/nanbuwks/00storage/KiCad/AKBONE2020LGT8F/github/KiCad']
exec(open("pcb_to_footprint3.py").read())
/home/nanbuwks/Downloads/kicad_pcb_to_footprint3/kicad-footprint-generator-master/KicadModTree/nodes/specialized/PadArray.py:182: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  elif len(self.spacing) is not 2:
Found project /home/nanbuwks/00storage/KiCad/AKBONE2020LGT8F/github/KiCad/AKBONE2020LGT8F
Found pcb: /home/nanbuwks/00storage/KiCad/AKBONE2020LGT8F/github/KiCad/AKBONE2020LGT8F.kicad_pcb
Traceback (most recent call last):
  File "/usr/lib/python3.10/code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "<string>", line 116, in <module>
AttributeError: module 'pcbnew' has no attribute 'DRAWSEGMENT_ClassOf'
```

対応として、 Python の変換プログラムを使用するのではなく DXF でエクスポート・インポートするやりかたを試してみました。

# 環境

2023/07/08

- Ubuntu 22.04
- KiCad 7.0.6


# 作業手順



## 元ファイルを加工する


今回はこれを元に、フットプリントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/52a4086f-bbef-954a-cf37-f65c5a6e9a66.png)

PCBエディターで必要のないパーツなどを消します。配線などはレイヤー指定でエクスポート対象から外すので完全にきれいにする必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9b4bdca6-92af-ccc1-49e9-cbb97eafa18a.png)

「ファイル」-「プロット」でDXFを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8368db3b-a9d0-7d73-d41f-90a16d9ecb26.png)

フットプリントエディターで、「ファイル」-「新規フットプリント」で名前を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/98487d32-aee8-751c-6de2-1f5bc14eb13b.png)
「ファイル」-「インポート」-「グラフィックス」で先程エクスポートしたファイルを指定します。配置を At (0,0) としておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/34a73f51-75a0-1b42-033b-a5ef93bb1e45.png)

複数のファイルをインポートして、位置を調整します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e791a6ca-b50d-707e-4d6e-83730b48b75c.png)

読み込んだDXFの上に、シルクやパッドを描いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6eab8c5d-6bd5-08b3-1650-a39d574c2145.png)


「ファイル」-「名前を点けて保存」で保存先ライブラリを指定して「保存」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/17551a4f-35fb-588b-eceb-0c235311c579.png)
DDD熱が冷めて思うこと

## はじめに

DDD(Domain Driven Design、ドメイン駆動設計)の学習は、とても難しいと思っています。多くの人が、DDDというのがあるらしい、と勉強を始めては挫折していったと思います。自分もそうでした。ある程度もがいてDDDの本を読んだりTwitterを追ったり自分で設計してみたりして、結局、自分がどのようなところに落ち着いたのか、などを書いてみたいと思います。下記の多くは自身の感想であり、主観を大いに含みます。

## なぜ、難しいか

* 基本的に抽象的なことを扱っている上に、前提や語彙の定義があいまいなこと
* 歴史が浅いこと
* 具体例を表に書きづらいこと

が原因だと思います。

### 基本的に抽象的なことを扱っている上に、前提や語彙の定義があいまい

まず、数学のように厳密な語彙の定義がありません。もちろん数学ではないので当たり前なのですが、そもそも抽象的な話をするならせめて厳密に定義して欲しいものです。

#### 歴史が浅いこと

DDDという名前を作った、ドメイン駆動設計というエリックエバンスの書いた本自体が出版されたのは2003年のことなので20年も昔ですが、日本でここまで最近よく聞くようになったのはここ5,6年程度だと思います。歴史が浅いと、事例や注意点、言い換えや具体例などのあらゆる理解の糧となるリソースが減るため、理解しづらいです。

#### 具体例を公に書きづらいこと

複雑なプログラムをわかりやすく書くための手法であり、そもそも何かしらの複雑な文脈をもった上で機能しているプログラムに対して効果的に綺麗にかけるというのがDDDです。となると、何かしら説明するにはその「何かしらの複雑な文脈を持った上で機能しているプログラム」を用意してそれを綺麗に設計する、という手法をとることになるわけですが、だいたいそういったものは会社の中にあるものであり、インターネットに公開して書けるものではありません。具体例を公に書きづらいため、前提が異なるまま議論せざるを得ず、非常に理解しづらくなっていると感じます。

## DDDの落ち着き方

### 1. 技術や用語、概念などから、一部だけ盗む

ValueObject、Repository、Dependency Injection、テスタビリティ、ユビキタス言語、などの概念や用語だけを盗みます。

例えば、永続化するわけではなく各テーブルにamountと単位および単位に関する計算ロジックがあるなら、それを1つのドメインモデルとしてValueObjectの形でAmountモデルを作って、そこに集約させたら扱いやすいかも知れません。どうもamountに関するロジックが散らばっているが、直し方がいまいち分からないし、大勢が参加するPJだといちいち語彙の統制が取れないという時に、ValueObjectとしてAmountモデル¥を利用したらいいなと気づくことができます。

FileやIO、外部API、DBやRedis、別プロセスといった外部への通信は、だいたいレポジトリ層にまとめておくと、依存性の注入によりテスタビリティを上げられるでしょう。一旦それでいいと考えます。

気づいたら、エンジニア、営業、PM、ユーザ、社内のadminユーザ、などがそれぞれ同じことを別のワードで話したり、同じワードで違うことを指したりして話していたら、ユビキタス言語がないんだなとすぐ気づけます。こういう時は、DDDの本を読んで得たユビキタス言語で会話することを徹底する、だけでまずとても日々のコミュニケーションが楽になり、システムに対する理解がエンジニア同士でも深まったりしてよいです。この、プログラムとビズの使う用語を一致させた方が良いということは、DDDを勉強していなければ確信を持って主張することはできなかったはずです。

他も同様です。

### 2. 深入りしすぎない

これはエンジニアとしてあるまじきかもしれませんが、あえて主語を大きく抽象的に書きます。なお、前提としてスタートアップを主に念頭にして書きます。
最低限のクオリティの機能があれば、そのプログラムが金を産むかの8割くらいはビジネス領域で決まる印象です。理由は、金を産むプログラムになるかは概ね、事業の時期と何を作るか？などプログラム外の要素で決まるからです。ビズサイドが、基本的にwhatを決め、プログラムは概ねhowの領域担当になります。なので会社員エンジニアとしては、まずはDDDより優先すべきもの、すなわち機能のリリースがあるはずです。

別にMVCレイヤになっておらず、Cに全て詰まっていても、レガシーな言語、フレームワーク、見るに耐えない汚い設計でも、そのプログラムで多くのお金を稼ぐ会社を見てきました。一方で、非常に綺麗なコードだけど、汚いコードの1%も稼げない会社も見てきました。確かにエンジニアリングとビズの働きは両輪ではありますが、よほどテックドリブンな会社でない限り、丁寧なエンジニアリングでない稚拙な技術であっても事業成長の方が大事で、そのために汚いコードの方がむしろ短期的に出力が出るなら、全体最適を見たらそちらの方が良いこともあります。なんなら、最初から綺麗なコードを書く会社ほど（初速が出にくいため）潰れやすいのではないか？という個人的仮説まであります。

ただし、一方で稚拙なエンジニアリングにより急成長したものの、成長が急に鈍化する企業も見たことがあります。なので、常に汚いコードを書いているが、あくまで [worse is better](http://www.kt.rim.or.jp/~hisashim/gabriel/WorseIsBetter.ja.html) のフェーズだからそういうコードを書いているのであって、隙あらば本来リファクタリングしないといけないのだという意識を忘れてはいけないのだと思います。そうでないと、状況が変わったのにも関わらず方向転換できずに汚いコードに汚いコードを上塗りして、どこにコードを足したり引いたりしても、バグを起こして壊れてしまう、そのようなものが出来上がり、ゆるやかに死を迎えるのだと思います。
[swagger] swagger-nodeの起動でCannot find module swagger_routerになる場合

## 概要
swagger-nodeの公式手順で `swagger project start` 時に `Cannot find module swagger_router` になったのでその対応方法になります

## 構成
node：v18.16.0

## 内容
- 公式のステップ
https://github.com/swagger-api/swagger-node

- エラー時の対応
下記にissueが上がっている。その中で下記の方法で対応が出来ました。
https://github.com/swagger-api/swagger-node/issues/586

1. ルートファイルの`package.json`の `swagger-express-mw`のバージョンを書き換える
```
Update your swagger-express-mw:
"swagger-express-mw": "^0.7.0"
```
2. `config/default.yaml`の `swagger_controllers`項目に `- swagger_params_parser` を追加する
```
Add swagger_params_parser to swagger_controllers at config/default.yaml
...
pipe for all swagger-node controllers
swagger_controllers:
  - onError: json_error_handler
  - cors
  - swagger_params_parser
  ...
```
3. プロジェクトルートで`npm install`を実行
```
Run npm install
```
4. `swagger project start` で起動する
```
Run swagger project start
```

以上で正常に起動出来ました。
標準機能でリストビューでチェックしたレコードIDの渡し方

# はじめに
Salesforceはノーコードでできることがたくさんあります。
今回は標準機能のFlowBuilderを使用してリストビューでチェックのついたレコードのIDを取得してみようと思います。

## そもそもFlowBuilderとは
FlowBuilder、通称フローはSalesforceの標準機能です。
詳しくは下記Trailheadを学んでください。
[Flow Builder の概要](https://trailhead.salesforce.com/ja/content/learn/modules/flow-basics/meet-flow-builder)

## 本題に
標準機能のフローを使用してリストビューでチェックのついたレコードのIDを取得していきます。
ここで注意すべきポイントは2つだけです。
* フロー変数でAPI参照名が`ids`の作成
* リストボタンでフローの呼び出し

### 1.フローを作成してみよう
フローの左側にあるツールボックスから**新規リソース**ボタンから
下記画像のように値を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/a6fc50e6-2933-d973-fced-19cc1b20ef54.png)
ここで注意すべきことはAPI参照名を必ず小文字で`ids`にしてください。
チェックしたレコードのIDが取得できているか確認のために下記画像のような画面を作成しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/37c84db6-215a-4781-d0a3-d13bae8f7c6f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/6fe57289-67e4-3819-73d9-f0f74ca75719.png)

フローは`Flow_Call_At_Listview`という名前で保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/5257b7b0-e4eb-a510-f94a-c84cbe8da7ec.png)

忘れないようにフローの有効化もお願いします。

### 2.リストビューボタンを作成してみよう
リストビューからフローを呼び出したいオブジェクトでカスタムボタンの作成を行います。

今回は取引先オブジェクトに作成します。
左側のボタン、リンク、およびアクションをクリックし黄色マーカーの**新規ボタンまたはリンク**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/b2e17d4e-82ec-a4b6-b56b-d0193227be75.png)

URLは`/flow/ + 先ほど作成したフローのAPI参照名`とします。
今回は`/flow/Flow_Call_At_Listview`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/63ab6235-0636-d0ca-2d54-764f9686f2c5.png)
※チェックボックスの表示 (複数レコード選択用)に必ずチェックを入れて保存してください。チェックが外れていた場合レコードIDが取得できません。

リストビューボタンは配置しなければ表示されないので**リストビューボタンレイアウト**から配置していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/5a1718ad-bca8-5ecc-0460-e6e5d7dbf5ef.png)
先ほど作成したフロー呼び出しボタンを選択したボタンに移動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/cc9ac8f0-208e-0167-ac31-71ef7f57e2a5.png)

取引先のリストビューでIDを取得したいレコードにチェックを付け、作成した**フロー呼び出し**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/56942d56-2533-aebf-31b1-8d91aecea8a3.png)
するとリストビューで選択した取引先3レコード分のIDがフローに渡せていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/d41b05cc-da3f-fe0f-d56c-a80beae342f8.png)
リストビューからフローを呼び出して取得できるのはIDだけのため実際に取引先のレコード自体を取得するにはこのIDを使用してレコードを取得する必要があります。

## 最後に
今回は標準機能のFlowBuilderを使用してリストビューでチェックのついたレコードのIDを取得してみました。
これを使用すれば標準機能だけで削除機能が実装できたり、また少しapexを使用すれば選択したレコードに対して何らかの処理を実装することもできそうなのでできることが膨らみますね！
今回の方法はSalesforceで公式でドキュメント化されているものではないみたいです。昨年ぐらいからちらほら見るようになったものになります。
今更感はありますが、使い方によってはまだまだ使用できそうなのでぜひ使用してみてください！
【Rails】記事の一覧を取得するAPIの作成

Rails APIについて学習しています。
今回は、アクセスしたときに記事の一覧を取得するAPIを作成していきます。

1. `http://localhost:3000/api/v1/articles`にアクセス
2. 記事の一覧をJSON形式で取得する

# 出力イメージ（Postman）
![スクリーンショット 2023-07-08 18.22.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486945/54775e68-4f8b-9a33-5639-a6a84599c450.jpeg)

# 事前準備
以下、モデル・テーブルを事前に準備していることを前提にしています。
- Userテーブル
- Profileテーブル
- Articleテーブル
- Commentテーブル




# fast_jsonapiを使用して実装していく

- jsonのserializer は fast_jsonapi を使用していきます。
- fast_jsonapiとは、Netflixが提供しているgemのこと。
- Ruby on RailsのAPI開発でよく使われるJSONシリアライズライブラリ。
- シリアライズの速さを重視して作られているのが特徴。
- このライブラリを使うと、RubyオブジェクトをJSON形式に変換する処理を高速化できる
- jsonのserializerとは、json を生成する仕組みのこと。
- 現在このパッケージは、保守がなされていないようなので、今後は使用する機会は少ないかも？

https://github.com/Netflix/fast_jsonapi

# fast_jsonapiをインストール

```ruby

gem 'fast_jsonapi'

```

# バンドルインストールを実行
```ruby

$ bundle install

```

# コマンドで新しいシリアライザーを作成

```ruby

$ rails g serializer Article title contents status

```

上記コマンドを実行すると、`app/serializers/article_serializer.rb`が生成されます。


# 生成されたシリアライザーに設定を追記

```ruby

class ArticleSerializer
  include FastJsonapi::ObjectSerializer
  attributes :title, :contents, :status
  belongs_to :user # ←　ここを追記
end

```
- このコードは、RubyのSerializerクラスを定義している。
- 具体的には、ArticleモデルのデータをJSON形式に変換するための設定が書かれている。
- まず、`class ArticleSerializer`という行で、`ArticleSerializer`という新しいクラスを定義している。
- `include FastJsonapi::ObjectSerializer`というモジュールを取り込んでいる。
- `FastJsonapi`はNetflixが開発した高速なJSON APIのシリアライズライブラリ。この行により、`ArticleSerializer`クラスは`FastJsonapi::ObjectSerializer`の機能を使えるようになる。
- `attributes :title, :contents, :status`では、Articleモデルの`:title, :contents, :status`の3つの属性を取り出し、JSONに変換することを指定している。
- `belongs_to :user`は、ArticleモデルがUserモデルに属していることを示す関連付けを定義している。これにより、ArticleのデータをJSONに変換する際に、関連するUserのデータも一緒に取得できるようになる。



# コントローラで一覧記事を呼び出す実装

```ruby
# app/controllers/api/v1/articles_controller.rb

module Api
  module V1
    class ArticlesController < BaseController
      def index
        articles = Article.all
        json_string = ArticleSerializer.new(articles).serialized_json
        render json: json_string
      end
    end
  end
end

```

- このコードは、Ruby on RailsのAPIコントローラーを定義している。
- 具体的には、`Api::V1::ArticlesController`という名前のクラスが定義されていて、その中にindexという名前のアクションがある。
- このindexアクションは、全てのArticleレコードを取得し、それらをJSON形式に変換してクライアントに返す役割を持っている。
- まず、`articles = Article.all`では、全てのArticleレコードを取得して、それらをarticlesという変数に代入している。
- 次に`json_string = ArticleSerializer.new(articles).serialized_json`という行では、取得したArticleレコードをJSON形式に変換している。
- 具体的には、`ArticleSerializer`のインスタンスを作り、その`serialized_json`メソッドを呼び出している。
- そして、最後に`render json: json_string`という行で、変換したJSONをクライアントに返している。


# 最後にPostmanでリクエストを送ってみる



```ruby

GET  http://localhost:3000/api/v1/articles

```

![スクリーンショット 2023-07-08 18.22.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486945/54775e68-4f8b-9a33-5639-a6a84599c450.jpeg)

無事、記事一覧のレスポンスをJSON形式で取得する事ができました。
また、ブラウザでアクセスしてみると、以下のような表示で確認できます。

![スクリーンショット 2023-07-08 18.53.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486945/6dc73ad1-4d18-ae3b-0c29-b46b2c1a2b0c.jpeg)
Firebaseで電子帳簿管理システムを作ってみてるはなし①デモ作成中

# 背景
今年２月から訳あってゴミクズフリーランスとして独立し、会社に務めるのがどうも向いてないことを自覚して１人会社を設立しました。もともと怠惰な性格なので事務仕事が面倒ですが会社にごっそり上前はねられるよりはマシだと思ってゲロ吐きながら記帳しています。ただ、やっぱり才能がありません。仕訳とかは簿記３級があるのでソフトさえあればできるのですが、レシートとか領収書とかを管理するのが面倒です。
それで電子帳簿保存法というのを調べてみたら、ちょっと前に改正が入っていて最悪個人でもちゃんと保存ルールやドキュメントさえあれば、帳簿を電子保存できることを知りました。
（なんかExcelと電子データでもちゃんとルールがあればたぶん大丈夫）

ちょうどその頃、Firebase+Angularで機能検証みたいなコードを書き始めたところ、Firebaseでも実現可能ということがわかり始めました。
ポートフォリオ拡充と自社用ツール作成して利用する目的でシステムを作ることにしました。

# この記事のゴール
最終的に電子帳簿管理システムには来年度会計期間まで(来年２月)に法令に違反しない状態で使用開始することが目標ですが、まだ先になりそうです。
この記事では
1. ログイン/ログアウト
2. 取引情報が作成一覧詳細更新削除ができる
3. 取引と関連するファイルを作成一覧詳細削除ができる
3. 上記が可能なソフトをデモソフトとして公開すること

にします。
# 成果
業務後にポチポチ作り続けてまだ作成途中でちょっと飽きちゃってます。
今でたぶん50時間は割いたとおもいますが、パソコンの電源入れたときに赴くままに書いている感じなので正確な工数は不明です。
githubユーザであれば一応ログインしてファイル追加とかできるようにはなると思ういます。
とはいっても実際に動かしてくれる人はあまりいなそうなので、今できてる状態の動画上げました。
https://youtu.be/1nq363XcaR8
https://gottago-be633.web.app

# 特徴と仕組
## 技術基盤
### Firebase
1. Authentication
　認証した人しか帳簿にアクセスできません。権限がない人もアクセスできません。
1. Hosting
 今回はウェブアプリにしました。レシートを保存するのにスマホにしか無いセンサ等を使う必要もないし、どこからでもアクセスしたかったからです。
1. Firestore
 法定で保存してないといけないことがありますのでそういった情報を保存するのにNoSQLであるFirestoreを使用しています。例えば更新時間やスキャン原稿のサイズは保持しないといけない情報だったりします。
1. Google Cloud Sotrage for Firebase
 レシートイメージや契約書PDFなどファイルを保存するのに使用しています。最近セキュリティルールでFirestoreのドキュメント有無を設定できるようになっているので、外部公開したくないソフト作成にも使いやすくなった。

### Angular
 今行ってる糊口凌ぎの現場がAngular使ってるので、文句言われない程度に勉強する目的もかねてAngular使ってます。良いといえば大概標準の機能があって選択であまり悩まないところはいいなと思ってます。ただたぶんReactのほうが好きになれそうな気がします。

## 仕組
### サーバレス
 Firebaseでサーバレスなので、運用・監視コストは小さいです。仕組み的にはスケーラブルなはずです。今はgitHubユーザならだれでもアクセスでき、クラウド破産が怖いのでSparkプランのみで作成してます。おそらく数人の会社であればSparkプランでなんとかなるんじゃないかなと思います。

### セキュリティは大丈夫なのか
 Firestoreにはドキュメントがあるときのみアクセス可という設定ができるので、特定のユーザが特定のテナントのみにアクセス（読み込み、書き出し、削除）できるように設定できます。また、最近 Google Cloud Storage for Firebaseにも同様の機能が入っているので、権限のないテナントに対して、ファイルをダウンロードしたり、取引内容を見たりということはできないようにはできます。

# 課題
とりあえず、機能だけでいうとできそうな気がしている。でもこのままじゃまだ使えない。不正ができない仕組みが重視されるため、ログ機能も充実させないといけない。
このアプリだけではまだコンプラを満たしてないと思うので、来年度開始までになんとかする。
監査対応、ReadOnlyユーザとかテナントの追加とかはFirebaseのコンソールから直でいじってもらマニュアルでどうにかすると思う。

# 免責事項
デモソフトは、利用可能リソースを超えると使用できなくなります。
保存したデータは一杯になり次第勝手に削除します。
このソフトを使用して発生したいかなる責任も負いません。

# ちょっとだけ営業
クソソフトの類ではありますがこのあたりの基盤を使って何かを作りたいという方やそれくらいできたら雇ってやってもいいよって方いらっしゃいましたら声かけてください。
(冷やかしではありません)
BaaSと法令変更に対応するソフト作成に注力していこうと思ってます。
別にサーバ側ができないというわけではないです。
10月の案件は未定ですのでぜひお願いします。