OmniAICreator/Qiita-1.07M huggingface dataset:
OWASP Top 10のメモ

# OWASPとは
OWASP（Open Web Application Security Project）は、ウェブアプリケーションのセキュリティ向上を目的とした非営利の国際的な組織です。主に、ウェブアプリケーションに関するセキュリティ上の脅威やリスク、ベストプラクティスを提供するためのリソースを開発し、公開しています。

OWASPは、セキュリティのガイドラインやツールを提供し、開発者やセキュリティ専門家が安全なソフトウェアを構築するためのサポートを行っています。その中でも特に有名なのが「OWASP Top 10」という、ウェブアプリケーションの最も重大なセキュリティリスクのリストです。これにより、開発者や企業はどのようなリスクに注意すべきかを理解しやすくなります。

# OWASP Top 10（2021版）
もうすぐ2025年版が発表されるそうですが、いったん2021年のものを調べました。

### A01:2021 - Broken Access Control
アクセス制御の不備。ユーザーが本来アクセスできない情報や機能にアクセスできる脆弱性。

### A02:2021 - Cryptographic Failures
暗号化の失敗。機密データの不適切な保護や、暗号化プロトコルの誤用。

### A03:2021 - Injection
SQLインジェクションやクロスサイトスクリプティング（XSS）など、悪意のあるコードやデータがシステムに入力される脆弱性。

### A04:2021 - Insecure Design
セキュリティを考慮しない設計により、潜在的な脅威や攻撃に対して脆弱になるリスク。

### A05:2021 - Security Misconfiguration
セキュリティ設定の不備や誤設定。デフォルト設定のまま使用されることなどが問題となる。

### A06:2021 - Vulnerable and Outdated Components
既知の脆弱性がある古いライブラリやコンポーネントを使用することによるリスク。

→特に古い長いPJだとありがちですね。。。すでに非推奨となった昔のライブラリをずっと使ってたりとか

### A07:2021 - Identification and Authentication Failures
不適切な認証やセッション管理により、ユーザーのなりすましやセッションハイジャックが発生する可能性。

### A08:2021 - Software and Data Integrity Failures
信頼できないソフトウェア更新やライブラリが含まれることによる、データやシステムの整合性が破られるリスク。

### A09:2021 - Security Logging and Monitoring Failures
セキュリティログや監視の欠如により、攻撃が検出されず、問題の早期対応ができないリスク。

### A10:2021 - Server-Side Request Forgery (SSRF)
サーバーが外部リソースにリクエストを送る際に、不正なリクエストが送信され、攻撃者が内部システムにアクセスできるリスク。

# 参考サイト
https://owasp.org/www-project-top-ten/
3Dスキャナーを選ぶ基準は何ですか？

現在、3D スキャン技術が急速に発展しているため、適切な 3D スキャナーを選択することが特に重要です。産業、医療、芸術デザインのいずれで使用される場合でも、ニーズを満たす機器を見つけることで、作業効率が大幅に向上し、スキャン結果の正確性を確保できます。この記事では、3D スキャナーを選択する際に考慮すべき重要な基準をいくつか紹介します。

1. スキャン精度
3D スキャナーの中心的な指標の 1 つはスキャンの精度です。高精度スキャナーは、特に精度がモデルの使いやすさに直接影響を与える工業デザインや医療分野で、より詳細な情報をキャプチャできます。通常、スキャン精度はサブミリメートルレベルとミリメートルレベルに分類でき、アプリケーションシナリオが異なれば精度要件も異なります。たとえば、工業用部品のスキャンにはサブミリメートルの高い精度が必要ですが、彫刻などの芸術作品のスキャンにはミリメートルレベルの精度で十分な場合があります。

![9458363a3f11debc387dce0884162c7d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/f5c17200-927b-8dcf-9438-2c770e5093d5.png)
2. スキャン速度
スキャン速度も、大容量または複雑な構造を扱う場合に考慮すべき重要な要素です。スキャン速度が高速化すると、品質を犠牲にすることなく生産性が向上します。これは、大規模な生産や複雑なエンジニアリング プロジェクトにとって特に重要です。ほとんどのハンドヘルド 3D スキャナは比較的高速なスキャン速度を提供しますが、特定のニーズに基づいて選択する必要があります。

3  スキャンできる物の材質とサイズ
3D スキャナーが異なれば、さまざまな素材を処理する際のパフォーマンスも異なります。金属、プラスチック、セラミックなどの反射物体を簡単に扱えるデバイスもあれば、スプレー塗装が必要なデバイスもあります。さらに、スキャナの視野とスキャン量も、大容量オブジェクトに適応する能力に直接影響します。必要な作業領域をカバーできるように、スキャナの最大スキャン範囲を事前に把握しておく必要があります。
![1c0fad1742115b8273ed9edd78b02875.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/e2959e83-ea0b-f421-0527-c81298f2dfcf.png)

Reovpoint MIRACO 3Dスキャナー - オールインワンスキャン 
https://www.revopoint3d.jp/products/standalone-3d-scanner-miraco

4.操作の利便性
3Dスキャナーを選ぶ際には、操作性も無視できません。多くのユーザーは、短い学習曲線でデバイスの基本機能をマスターしたいと考えているため、使いやすいインターフェイス設計と使いやすいオペレーティング システムが特に重要です。最新の 3D スキャナーの中には、ワイヤレス接続やポータブル操作もサポートしているものもあります。これは、屋外でのスキャンや機動性が必要なプロジェクトに非常に役立ちます。

5  価格とコストパフォーマンス
最後に、価格も 3D スキャナーを選択する際に無視できない要素です。予算に応じて、さまざまなグレードの製品をお選びいただけます。 3D スキャンを初めて使用するユーザーにとって、エントリーレベルのスキャナは非常にコスト効率の高い選択肢となる可能性があります。精度と速度に対するより高い要件を持つプロフェッショナル ユーザーの場合は、より高価な工業用グレードの機器を検討する必要があるかもしれません。
【フォントワークス/モリサワ】【学割】この世のすべての日本語フォントは990円/年で利用できる（高校生でもできるよ〜！！）

## フォントワークスとモリサワ
この島国において、フォント制作会社はほぼ2つしかない。
**フォントワークス**と**モリサワ**だ。あとはイワタとかダイナ（UDゴシックが有名かな）が頑張ってて、印刷系会社（凸版や大日本印刷）が少し出しているくらい。（個人の神様のような方がすっごい良質なフリーフォントをたくさん出してくれていることも忘れずに！）

以下は私の個人的な印象ではあるが、
モリサワはMacOSに搭載されていることで本当に有名なヒラギノ角ゴのような本文に使われるような書体ではとても強い。JR西日本の駅名標には新ゴが用いられているし、ゲーム・コンソールの王者Nintendo Switchのフォントではそれを改良したUD新ゴが用いられている。また、写研のフォントがモリサワと協力してOpenTypeフォントとして公開されることも[公表されている](https://note.morisawa.co.jp/n/nd8256ef655d5)。

https://www.morisawa.co.jp/fonts/customers/

フォントワークスはいわゆるデザイン系のフォントにめっぽう強い。一時期話題になった[LINE Seed JP](https://fontworks.co.jp/case/13862/)もフォントワークス。あつまれどうぶつの森やペルソナなどのゲームや、その着せ替え人形は恋をする、ヒロアカ、新世紀エヴァンゲリオンなどのアニメもフォントワークスのフォントが使われている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556058/b20a8ebd-ee81-6184-b57c-418211d30da5.png)
この使用事例、あまりにも強すぎないか...（小声）

https://fontworks.co.jp/case/

## 両方ともサブスクを990円/年で提供している
2024/9/30より、モリサワが[Morisawa Fonts](https://www.morisawafonts.com)というサブスクサービスにおいて学割プランを提供し話題になっている。**脅威の64,240円→990円/年。実に98％オフである。**

ただ、これに対しフォントワークスは[LETS](https://lets.fontworks.co.jp/fonts)というサブスクサービスを提供していて、こちらも通常**49,500円→990円/年**。フォント業界、ありがたすぎる。

### 自分に必要かはよく考えて
もし、Adobe CCを契約しているならば**Adobe Fontsで事足りることも多い**。実際ヒラギノ角ゴもファミリーが小さくはなっているがAdobe Fontsで使える。
実務においては互換性という面も忘れてはいけない。Adobe Fontsに収録されているフォントなら、「フォントがなくて文章を表示できない...」のようなトラブルに悩まされる可能性は低いだろう（チームで作業を行うシチュエーションを考えると）。

また、**フリーフォントの選択肢もとても多い**。本文系なら[Google Fonts](https://fonts.google.com/?script=Jpan)のNoto Sansでも事足りることは多い。M+が自分は大好きである！！また日本には素晴らしいフォントデザイナー様がたくさんいらっしゃって、ありがたいことに多くをフリーフォントとして公開してくださいっている。[フロップデザイン](https://www.flopdesign.com)さんのフォントがとても大好きでオススメ。

もちろん、圧倒的に2社のサブスクのほうが日本語書体の幅は広がることは言うまでもないが、本当に必要かの検討は慎重に。本当に有償フォントが必要な場合は、多くは**あまりにネット上で溢れているフリーフォントとの差別化**、あるいは**既存のゲームなどのデザインのオマージュ**が主になると思います。

## 契約しよう
### Morisawa Fonts

https://cep.morisawafonts.com/academic/

> 日本国内の高校、大学、専門学校の学生

が申込資格。認証方法はSheerIDによるもので、メールアドレスがない場合でも学生証などによる認証が可能。

:::note warn
ライセンスについて、学割特有の特記事項はなく、**通常版と共通のEULAになっている。** 商業利用、商標登録も可能と明記されており、Webフォントとしての利用も可能。
https://policies.morisawafonts.com/eula/fonts/desktop/
:::


### LETS（フォントワークス）

https://lets.fontworks.co.jp/services/students

申込資格は、
> 小学校・中学校・特別支援学校・高等学校・高等専門学校・大学・短期大学・大学校・専門学校に在籍し、在学証明（学生証や在学証明書の提示）ができる学生
各教育機関の教職員でそれを証明できる方

学校発行のメールアドレスでの認証、学生証/身分証での認証にも対応。こちらもSheerIDによる認証のよう。
なお、LETSはフォントワークス、Monotype（欧文系）、昭和書体、イワタ、モトヤ...など、フォント制作会社ごとにプランが別れていて、それごとに990円/年がかかるので要注意。おそらく普通の人ならフォントワークスLETS、欧文系が使いたければMonotype LETSがあれば十分なはず。

:::note alert
学生用ライセンスは**商用利用禁止**、またWebフォントとしての利用やアプリへの埋め込みなどの組込利用も禁止になっています。（商用でも追加オプションになってる）
賞金の発生するようなコンテストでの利用は商用利用に含めないとのこと。
https://lets.fontworks.co.jp/services/license
:::

## 良きフォントライフを！
1980円/年で良質な日本語フォントが使い放題という話です。良きフォントライフを〜〜〜！！
【超初心者】クラス-メソッドと疑似変数$this

# はじめに
SLスタジオでPHP・WEB開発を独学中のアラフィフ主婦の忘備録です。

https://sls.ideal-growth.jp/12/lesson/310/exercise/991

## クラス-メソッドと疑似変数$this-
### 処理内容
MathOperationクラスに定義されているaddメソッドを呼び出す。addメソッドの引数には、それぞれプロパティの値とprocessメソッドに渡された引数の値を使用する。

### 解答・解説 のサンプルソース
変数名など一部変更しています。

```PHP
class MathOperation
{
    public $value = 10;

    function add($value1, $value2)
    {
        echo $value1 . ' + ' . $value2 . ' = ' . ($value1 + $value2) . "\n";
    }

    // process メソッドを追加
    function process($value)
    {
        $this->add($this->value, $value);
    }
}

$operation = new MathOperation();
$operation->process(5);
```

## 出力結果
```
10 + 5 = 15
```

## 疑問点
`$value`の種類が多すぎて訳が分からない

```
public $value = 10;
```
```
function process($value)
```
```
$this->add($this->value, $value);
```

## 順番に見ていきましょう
* クラスの中で一番初めに定義されていますが、
```
public $value = 10;
```
これはそのまんま`$value`の値は`10`。

* 次の`$value`の値は
```
function process($value)
```
`$operation->process(5);`で引き渡された`5`が入ります。

* 一番ややこしいのが↓の`$this->value`と`$value`という２つの引数。
```
$this->add($this->value, $value);
```
`$this->value`の`value`はこのクラスの中で定義された`$value`が入るので`10`。
`$value`の方には`$operation->process(5);`で引き渡された`5`が入ります。

なので、引数にはこのような値↓が入っていることになります。
```
$this->add(10, 5);
```


## 引数を代入する
計算式のadd関数（メソッド）に先ほどの引数を入れます。
`$value1`　に`10`
`$value2`　に`5`

```
    function add(10, 5)
    {
        echo 10. ' + ' . 5 . ' = ' . (10 + 5) . "\n";
    }
```
### 出力結果
```
10 + 5 = 15
```

:::note info
function process(`$num`)←ここの変数と
    {
        $this->add($this->value, `$num`);←２つ目の引数は同じ
    }
    変数名を変えると分かりやすい
:::

## まとめ
同じ変数名を使った問題が多くてややこしいから、どれとどれが同じものか分けて考えて、変数名を変更するのも手。
paizaラーニング問題集「【マップの扱い 2】マップの書き換え・縦横」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__get_upsidedown

▼考え方

ポイントになる考え方1.～4.を以下に示します。

1.与えられた座標のマス(y,x)の1つ上の行(縦:y-1)、同じ行(縦:y)、1つ下の行(縦:y+1)、の順に処理します。

2.1つの行につき、与えられた座標のマス(y,x)の左隣(横:x-1)、同じ(横:x)、1つ右隣(横:x+1)、の順に処理します。

3.縦方向の添え字jや横方向の添え字iがマップの範囲を超える場合は、処理せず次のループに入ります。

4.与えられた座標のマス(y,x)の1つ上の行および1つ下の行において、(y,x)の上下左右に含まれないマスは処理しません。

▼コード
```py

# 横方向 x,W,i
# 縦方向 y,H,j

########## 処理0(準備) インプット,リスト定義など ###########

H,W = map(int,input().split())

S = [[0 for i in range(W)] for j in range(H)]

for j in range(H):
    S[j] = list(input())
    
y,x = map(int,input().split())

########## 処理1 マップの書き換え、マップの出力 ##########

# 考え方1.
for j in range(y-1,y+2,1):

    # 考え方2.
    for i in range(x-1,x+2,1):

        # 考え方3.
        if (j < 0 or j > H-1) or (i < 0 or i > W-1):
            continue

        # 考え方4.
        if (j == y-1 or j == y+1) and (i != x):
            continue
        
        else:
            if S[j][i] == ".":
                S[j][i] = "#"
            else:
                S[j][i] = "."

for j in range(H):
    print(*S[j],sep='')
```
【rails】ルーティングのパスの書き方。

初学者です。
本っっっ当に初学者です。

railsで学んだことをノート代わりに簡単にまとめていこうと思うので、間違いなどあればコメントでご指摘いただけますと幸いです。

link_toでは、絶対パスを使うようです。
```post.html
<%= link_to '投稿', '/posts/index' %>
```

ルーティングでのパスの書き方
```ruby:qiita.rb
get "posts/index" => "posts#index"
```
これも絶対パスらしい。

はて？
絶対パスは先頭に必ず「/」が入るのでは？？？

調べたところ、Railsは常にアプリケーションルート（トップページ等）を軸としてパスを解釈しているから、ルーティングでは先頭の/は書かなくてもいい、
link_toはrailsではなく、HTMLに書くから先頭の/がいるとのことらしいです。

同じ絶対パスでも書き方が変わってくる、なかなか難しいですね。
macOS Sequoiaで署名されていないアプリがインストールできない

# 何が起きた？
Sequoiaにアップデートしてから署名されていないアプリをインストールできなくなってしまった。
![CleanShot 2024-10-08 at 15.06.20@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/ad030d77-322c-a53f-731a-74789bfbe275.png)
> "xxx.pkg"は開いていません
> Appleは、"xxx.pkg"にMacに損害を与えたり、プライバシーを侵害する可能性のあるマルウェアが含まれていないことを検証できませんでした。

# 原因
Sequoia以前のバージョンまでは、
- アプリケーションディレクトリに移動して開く
- Controlキーを押しながら右クリックで開く
- 右クリック>「このアプリケーションで開く」>インストーラ.appで開く

などでGatekeeperを無効にして簡単に開くことができていたようだが、今回のアップデートでGatekeeperを無効化することができなくなったらしい。

# 対処法
1. 一度 インストールできないアプリを開き、[このポップアップ](#何が起きた)を出現させる
2. `設定`>`プライバシーとセキュリティ`のセキュリティに、ブロックされたアプリを開く項目が出現しているので「このまま開く」をクリックすることでインストールできるようになる。
![CleanShot 2024-10-08 at 15.09.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/49659cca-b432-7f00-973c-756622406680.png)
![CleanShot 2024-10-08 at 15.09.31@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/c8aec297-f4df-5f78-01a8-601206725f8a.png)

---

ちなみにセキュリティの`アプリケーションの実行許可`という項目があり、「App Store」「App Storeと既知のデベロッパ」の二つの選択肢がある。
前者なら、「署名されているアプリであったとしてもApp Store以外からダウンロードされたアプリは許可しないよ。」
後者なら、「署名されていればApp Store以外でダウンロードしたアプリも自動で許可するよ。」
といった感じの設定のようです。
[参考記事 [macOS Sequoia removes the Control-click method to bypass Gatekeeper... | iDownloadBlog]](https://www.idownloadblog.com/2024/08/07/apple-macos-sequoia-gatekeeper-change-install-unsigned-apps-mac/)
paizaラーニング問題集「【マップの扱い 1】マップの書き換え・1 マス」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__get_one

▼感想

横方向(x,W,i)を示す記号と、縦方向(y,H,j)を示す記号が混ざってしまわないように意識する必要があると感じました。コメントとしてコードに書いておくのがよいと思います。

▼コード
```py

# 横方向 x,W,i
# 縦方向 y,H,j

########## 処理0(準備) インプット,リスト定義など ###########

H,W = map(int,input().split())

S = [[0 for i in range(W)] for j in range(H)]

for j in range(H):
    S[j] = list(input())
    
y,x = map(int,input().split())

########## 処理1 マップの書き換え、マップの出力 ##########

if S[y][x] == ".":
    S[y][x] = "#"
else:
    S[y][x] = "."

for j in range(H):
    print(*S[j],sep='')
```
[CLI]オプションを取得するシンプルな関数 [python]

オプションを取得するシンプルな関数を作りました。

pythonモジュールのargparseは複雑なので。

名前：option
引数：(argv,optionname)
返り値：(argv,parameter)

 `(argv,parameter)=option.option(argv,'-o')`

として呼び出してください。argvは、sys.argvで、parameterは'-o'で指定された直後の引数が返ります。
`-o`と引数の間にはスペースが必要です。呼び出したあと、argvは、一つのオプションと引数が削除されたものになります。

同じオプションが指定されると最初が有効です。

引数がなくなるとparameterにヌルストリングを返すので、複数の同じオプションを指定する場合は、ループ処理で繰り返し呼び出してください。

実行例

```
$ python test.py test1 -o test2 test3
(['test.py', 'test1', 'test3'], 'test2')
```

違うオプションを指定した場合の実行例

```
$ python test.py test1 -a test2 test3
(['test.py', 'test1', '-a', 'test2', 'test3'], '')
```

# 本体

```option.py
def option(l,o):
    if o in l:
        idx=l.index(o)
        if idx+1<len(l):
            if idx+2<len(l):
                return l[0:idx]+l[idx+2:],l[idx+1]
            else:
                return l[0:idx],l[idx+1]
        else:
            return l[0:idx],''
    return l,''
```

テスト

```test.py
import option
import sys
print(option.option(sys.argv,'-o'))
```

### ライセンス

誰が書いてもこうなるだろうから、Public Domain Softwareです。
MyBatis generatorでまとめて更新する

# 背景
新たにDBにカラムを追加した際に、そのMapperやEntityを手動で更新するのは面倒です。そこで、MyBatis Generatorを使用して自動的にコードを生成し、効率的に変更を反映させる方法を紹介します。

# Mybatis generatorの導入方法
## MyBatis Generatorを追加
pom.xmlファイルに以下の依存関係を追加します。
```xml
<dependencies>
    <!-- MyBatis Generatorの依存関係 -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <!-- その他の依存関係 -->
    
</dependencies>

<build>
    <plugins>
        <!-- MyBatis Generatorプラグインの追加 -->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <executions>
                <execution>
                    <id>Generate MyBatis Artifacts</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- その他のプラグイン -->
    </plugins>
</build>
```

## MyBatis Generatorの設定ファイルを作成
次に、MyBatis Generatorの設定ファイルを作成します。プロジェクトの直下にgeneratorConfig.xmlを配置します。もしこのXMLファイルが既に存在している場合は、消すか別の場所に移動させておきましょう。新しいカラムを追加した際に、最新の状態でコードを生成するためです。

```xml:generatorConfig.xml
<!DOCTYPE generatorConfiguration PUBLIC
    "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="simple" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/your_database"
                        userId="your_username"
                        password="your_password"/>
        <javaModelGenerator targetPackage="com.example.project.dao.entity"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.project.dao.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.example.project.dao.mapper"
                             targetProject="src/main/java"/>
        <table tableName="transfer_setting"/>
    </context>
</generatorConfiguration>
```
generatorConfig.xmlファイルの中で、データベース接続に関する情報を設定する必要があります。以下の情報を入力します：

**driverClass**: 使用するデータベースのJDBCドライバクラス名。
**connectionURL**: データベースの接続URL。
**userId**: データベースに接続するためのユーザー名。
**password**: データベースに接続するためのパスワード。

以下に、一般的なデータベースの接続情報の例を示します：

#### MySQL
```xml
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/your_database"
                userId="your_username"
                password="your_password"/>

```

#### PostgreSQL
```xml
<jdbcConnection driverClass="org.postgresql.Driver"
                connectionURL="jdbc:postgresql://localhost:5432/your_database"
                userId="your_username"
                password="your_password"/>

```

## コードの自動生成

```terminal
mvn mybatis-generator:generate
```

生成されたMapper.javaとMapper.xmlを確認し、必要に応じて手動で修正します。特に、新しく追加されたカラムが正しく反映されているかを確認してください。
LinuxでWiFiの電波環境確認(Wi-Spy)

# WiFiの電波環境を確認
WiFiは広く普及していますが，広いエリアをカバーしようとすると，APの設置場所や調整は難しいものがあります．ユーザーからは使えないなどの報告がありますが，実際に電波が届いてないかは調べてみるのが一番です．
## Linux
Ubuntu Weekly Report 第371回[「無線LANの電波環境を視覚化・改善しよう」](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0371)で以下のツールが紹介されています．
+ iw
+ nmcli
+ wevemon
+ horst
+ kismet
+ iperf3

それぞれの使い方はリンク先の記事を確認してください．

## Wi-Spy
ノートパソコンなどに内蔵されているWiFiチップを使った調査では，WiFiの電波のみ観測可能ですが，実際はWiFi以外の電波も飛んでいて，その影響も受けます．例えば2.4GHz帯のWiFiは近くで電子レンジを利用していると，その影響を受けて品質が悪くなります．
このようなWiFi以外の電波についても確認しようとすると，特殊な装置が必用になります．そのような装置の一つに[Wi-Spy](https://gigazine.net/news/20120420-wi-spy/)があります．Wi-Spyはもう古い製品で入手は難しいかもしれません．Wi-SpyはChanalyzerというWindowsのソフトが付属?していたようですがもうダウンロードできません．
Wi-Spyは手元にあったので，なんとかLinuxでも使えないかと探してみると，spectoolsというソフトで利用できました．
### spectools
LinuxでWi-Spyを使うには，[spectools](https://www.kismetwireless.net/static/spectools/)(Utilities for using the Wi-Spy USB spectrum analyzer hardware)が利用できます．
Debianパッケージにもなっているので，`apt install spectools`でインストールできます．
#### 起動
`spectool_gtk`で起動します．コンソール版なら`spectool_curses`もありますが，gtk版が使い易いです．

起動すると，ウィンドウが開くので，デバイスが認識されるのをしばらく待ってから，"Open Device"をクリックします．
![Screenshot from 2024-10-08 15-18-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/3d24188a-44d0-70fa-d034-d85488bbe614.png)

デバイスを選択して"Enable"をクリックすると，電波環境の表示が始まります．
![Screenshot from 2024-10-08 15-20-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/8bbadcd8-e2b6-7de1-60fe-bf7b4914b7df.png)

このように表示されるので，利用しているチャンネル付近で他のAPや電波源の影響を受けてないか確認できます．
Ubuntu VirtualBox NS_ERROR_FAILURE (0x80004005)   Kernel driver not installed (rc=-1908) のエラー対処方法

結構頻繁に遭遇するのでメモ。  

## VirtualBox のバージョン確認
カーネルモジュールのバージョンがあってないといわれるので指示通りコマンドを実行する  
```
uchi@ub18041:/usr/bin$ VBoxManage -V
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (6.8.0-45-generic) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/vboxconfig

         You will not be able to start VMs until this problem is fixed.
7.0.18r162988
```

>警告: vboxdrv カーネル モジュールがロードされていません。現在のカーネル (6.8.0-45-generic) に使用できるモジュールがないか、ロードに失敗しました。カーネル モジュールを再コンパイルし、sudo /sbin/vboxconfig でインストールしてください。この問題が解決されるまで、VM を起動することはできません。
7.0.18r162988

## カーネルモジュールを再コンパイル

一応カーネルのバージョンを確認  
```
cd /usr/bin
uname -r
6.8.0-45-generic
```

カーネルのヘッダーをインストールする（再コンパイル）
```
sudo apt update

sudo apt upgrade

sudo apt install linux-headers-$(uname -r)

```

vboxdrv カーネル モジュールのインストール（再コンパイル）

```
$ sudo /sbin/vboxconfig
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: Signing VirtualBox kernel modules.

```

## VirtualBox のバージョン確認

```
$ VBoxManage -V
7.0.18r162988
```

無事アップされて WARNING がなくなり起動できた。  

以上
メールセキュリティを強化！DMARCの設定方法とその効果

# はじめに
メールのセキュリティを強化するために、SPFやDKIMと連携して使用される**DMARC**（Domain-based Message Authentication, Reporting & Conformance）の設定が非常に重要です。DMARCは、なりすましメールを防止し、ドメインの信頼性を高めるための仕組みです。本記事では、DMARCの基本的な概念と、Cloudflareでの設定方法について解説します。

# DMARCとは？
**DMARC**は、SPFやDKIMでの検証結果をもとに、受信サーバーがメールをどのように処理すべきかを指示するポリシーを提供します。これにより、なりすましやスパムメールのリスクを大幅に減少させることができます。

## DMARCの主な役割
1. **メール認証の一貫性**: SPFやDKIMの結果に基づいて正しいメールを識別します。
2. **ポリシーの適用**: 認証に失敗したメールをどのように処理するか（拒否、隔離、許可）を決定します。
3. **レポートの送信**: ドメイン管理者にメール認証結果のレポートを提供します。

# DMARCポリシーの種類
DMARCには、次の3つのポリシーがあります：
- **none**: 認証失敗時に何もアクションを取らず、レポートのみを送信します（監視目的）。
- **quarantine**: 認証に失敗したメールを迷惑メールフォルダに移動します。
- **reject**: 認証に失敗したメールを受信拒否します。

# DMARCの設定方法

## 1. DMARCレコードの作成
DMARCレコードは、DNSのTXTレコードとして追加します。以下は、一般的なDMARCレコードの例です。

```txt
v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-failure@example.com; sp=none; adkim=r; aspf=r
```

- **v=DMARC1**: DMARCのバージョン
- **p=quarantine**: 認証に失敗したメールを迷惑メールフォルダに移動
- **rua**: 集約レポートを送信するメールアドレス
- **ruf**: 失敗したメールの詳細レポートを受け取るメールアドレス

## 2. CloudflareでのDMARC設定手順
1. Cloudflareにログインし、対象のドメインを選択します。
2. 「**DNS**」タブをクリックし、「**Add Record（レコードを追加）**」を選択します。
3. 以下の情報を入力します：
   - **Type**: `TXT`
   - **Name**: `_dmarc.yourdomain.com`
   - **Content**: DMARCポリシー（例：上記のレコード）

4. 保存して完了です。

## 3. DMARCレポートの確認
DMARC設定が完了したら、メールの認証結果をレポートとして受け取ることができます。これにより、どのメールがSPFやDKIMの認証に失敗したかを追跡できます。レポートはXML形式で送られるため、DMARCレポート解析ツールを使用すると便利です。

おすすめのツール：
- **[DMARC Analyzer](https://dmarcian.com/dmarc-inspector/)**: DMARCレポートの解析ができるツール。
- **[MXToolbox DMARC Lookup](https://mxtoolbox.com/DMARC.aspx)**: DMARC設定の確認ができるオンラインツール。
- **[Google Admin Toolbox Messageheader](https://toolbox.googleapps.com/apps/messageheader/analyzeheader)**: メールヘッダーを解析してSPFやDKIM、DMARCの確認ができ、正しくメール送信できたかを確認できます。




# まとめ
DMARCの設定は、メールのセキュリティを大幅に強化し、ドメインをなりすましから守るために欠かせない手段です。まずは**none**のポリシーで監視を行い、状況を確認しながら**quarantine**や**reject**へと移行していくことをお勧めします。DMARCとSPF、DKIMの設定をしっかりと行い、信頼性の高いメール環境を構築しましょう。

# その他
https://qiita.com/blue_islands/items/348b71f0aaeadb00eecd
Redmine ログイン時の「ログインを維持する」チェックボックスをデフォルトでONにする

## Redmine ログイン画面の [ログインを維持] のチェックボックスをデフォルトで ON にしておきたい

チェックボックスにチェックしてログインすると設定期間ログイン不要になる（最大 365 まで可能）

ソースコードの修正が必要です

## 修正するソースコード

場所：D:\Bitnami\redmine-4.2.3-1\apps\redmine\htdocs\app\views\account
ファイル：login.html.erb

修正箇所 22 行目付近

### 修正前
```login.html.erb
<% if Setting.autologin? %>
    <label for="autologin"><%= check_box_tag 'autologin', 1, false, :tabindex => 4 %> <%= l(:label_stay_logged_in) %></label>
  <% end %>
```
:::note info
false を true に変えます
:::
### 修正後

```login.html.erb
 <% if Setting.autologin? %>
    <label for="autologin"><%= check_box_tag 'autologin', 1, true, :tabindex => 4 %> <%= l(:label_stay_logged_in) %></label>
  <% end %>
```

この図のように最初からチェックボックスにチェックが入った状態になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/149c6744-b505-eade-8e88-f217c9a95b5d.png)
PythonでCURSESライブラリを使う

# PythonからCursesライブラリを使ってみた
CURSESライブラリ（多分今はlibncurses）というライブラリでテキスト画面を制御付きであつかうもので、端末設定のTERM変数に依存します。
TERM変数は、古いシステムでは/etc/termcapまたはterminfoディレクトリ以下に、新たしいシステムでは/usr/shear/terminfo に置かれた定義に従って制御エスケープシーケンスを読み取って動作します。
一般的なテキストベースのフルスクリーンエディタ等で利用されています。
これを、Pythonで使うには
import curses
で使用できます。

# Windows Pythonでは・・・
pip install windows-curses
で使用できるようになるようです。

# 使用目的
ちょろっと、UIを作るのに有効です。


# テストプログラム
```curses_test.py
#!/usr/bin/python3

import curses as cs

stdscr=''

def init():
    global stdscr
    stdscr=cs.initscr()
    cs.noecho()
    cs.cbreak()
    stdscr.keypad(True)

def main():
    global stdscr
    init()
    stdscr.addstr(10, 20, '-')
    stdscr.refresh()
    c = stdscr.getkey()
    while c != 'e':
        stdscr.addstr(10, 20, c)
        stdscr.refresh()
        c = stdscr.getkey()
    cs.endwin()

try:
    main()
except:
    cs.endwin()
```
このファイルに chmod +x curses_test.py で実行権を与えて 
./curses_test.py
で実行します。
終わりたいときは小文字のeで終了するようになっています。

# 注意！
何らかの原因で、プログラムがendwin()関数を呼ばずに終了してしまった場合は、端末を一旦強制終了して再度開かないといけなくなります。
組込機器に無線インタフェースをつけるのって案外面倒？その3

## ～ ITRON環境で動作する無線デバイスが見つかった！　SDIO接続タイプ～

前回は「組込CPUにWiFiの無線デバイスを接続する」という具体的なテーマとして考えること・決めることを解説し、無線ドライバというソフトウエアが解決すべき大きな課題の一つであることをお話しました。解決する方向としては「<b>ITRON環境で動作する無線ドライバがある</b>」、または「<b>無線ドライバ自体が不要</b>」ということになります。今回は前者「ITRON環境で動作する無線ドライバがある」パターンについて、実現した内容を解説します。

無線デバイスとしては2.4/5GHzデュアルバンド WiFi6に対応した[NXP社 IW61x](https://www.nxp.jp/products/wireless-connectivity/wi-fi-plus-bluetooth-plus-802-15-4/2-4-5ghz-dual-band-1x1-wi-fi-6-802-11ax-plus-bluetooth-5-4-solution:IW611)です。この無線デバイスはSDIOとUARTインタフェースを持っています。無線ドライバソースコードはMCUXpresso SDKという形でNXPのユーザ向けWebサイトでダウンロードできます。

そして、今回はIW612が搭載された無線モジュール[u-blox社 MAYA-W2](https://www.u-blox.com/en/product/maya-w2-series)の評価ボード[EVK-MAYA-W2](https://www.u-blox.com/en/product/evk-maya-w2)を使いました。EVK-MAYA-W2には一端がmicroSDカードの形をしたコネクタ部を持つケーブルが同梱されており、それで組込機器と接続します。
 
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/335af53b-1fc1-6547-b1dd-6f2ec2782791.png)

u-blox MAYA-W276 
（出典: https://www.u-blox.com/en/product/maya-w2-series ）

ホストCPU側はITRONが動き、SDカードスロットを持っているもので入手しやすい価格帯であるものを探して、今回はSTMicro社 [STM32H747I-DISCO](https://www.st.com/ja/evaluation-tools/stm32h747i-disco.html) を選択しました。STM32H747I-DISCOとEVK-MAYA-W2の組み合わせであれば、特に工作することなくSDカードスロットを介して接続することができます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/946741f7-5b8e-233b-baa8-b4722c08f84c.png)
EVK-MAYA-W2(左)とSTM32H747I-DISCO(右)の接続

さて、肝心のホストCPU上のソフトウエアについてです。「無線ドライバソースコード」はNXPとNDAを結んだ上で、ユーザWebサイトからMCUXpresso SDKとしてダウンロードすることができます。FreeRTOS用のものをダウンロードしてください。OS依存、ハードウエア（CPU、SDIO、メモリなど）依存、TCP/IPプロトコルスタック依存する部分はSDKにもともと実装されているものから別のものに書き換えられるようになっているので、ITRON、ハードウエア、プロトコルスタックに合わせて書き換えます。結果、ホストCPU上のソフトウエア構成は以下のようになります。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/10c7f278-4f8e-5af4-d536-3b49029d9ee8.png)

CenteではネットワークミドルウエアパッケージのCente TCP/IPv4、Cente IPv6内のBSP（ボードサポートパッケージ）にて、STM32H747I-DISCOとEVK-MAYA-W2の組み合わせですぐWiFi上のTCP/IP通信が動作するソースコードをご用意しています。ただし、現在は上図青色部分のMCUXpresso SDKについてはライセンスの関係でお客様にて入手、開発環境に組み込んでいただく形になっています。これも将来的には我々から一緒に提供して、よりラピッドに開発できるようになる予定です。

次回は、無線ドライバが不要なUSB接続タイプを実際に使ってみた、という記事です。こちらもお楽しみに！

Cente：
https://www.cente.jp/
お問合せはこちら：
https://www.cente.jp/otoiawase/

## ■今日の閑話
今回使用したu-bloxのEVK-MAYA-W2ですが、この作業を開始した2024年春の時点ではFCCは取得済みでも技術基準適合認定が取得できていないES品しか入手できませんでした。実際に国内で電波を飛ばしたい旨代理店に相談したところ、電波法を監督している総務省に届け出を出すと、ある一定条件をクリアしていれば期間限定で実験目的での運用ができる特例があるとのこと。早速届け出て無事本開発を進めることができました。6月に取得できたという連絡を受けて、無事実験局の廃止手続きをした次第です。
最近のFreeBSDでコンパイルするとき

# make.conf の修正をしよう

小ネタすぎるので、賞味期限は2024年内のものがあります（LDFLAGS系）

<pre>
DEFAULT_VERSIONS+= bdb=18
WITH_BDB6_PERMITTED=yes


.if $(.CURDIR:M*/multimedia/ffmpeg*) || $(.CURDIR:M*/devel/protobuf*)
LDFLAGS=        -Wl,-allow-shlib-undefined
.endif



</pre>

# 解説
上の2行は　古い berkleydb(sleepycat)で、db5が未だにインストールを強要されるシステムを見かけるため、入れ替えるための設定。
下の3行は、「ニワトリ・タマゴ問題」的な shared-libraryあるなしに係るものかと思うのですが、定義なしでもコンパイルが出来るようにするものだと思われます。設定されてない時代にコンパイルできていたので、何か漏れたのでしょう。
SpringBootとNext.jsでwebアプリを作成しました

# はじめに
家計簿Webアプリケーションを作成しました。普通の家計簿と違うところは、細かく出費・収入を記録するのではなく、クレカの支出や給料の収入などの大きなお金の移動のみを記録して所持金を管理するところです。
私自身細かく家計簿に記録することが苦手で、何度も挫折したため自分にあった家計簿を作ろうと思いました。
また私は銀行口座を複数所持しているため、それらをまとめて管理するものが欲しいと考えていたため、その機能も追加しました。
私と同じように細かくお金を管理することが苦手で、銀行口座を複数持っている方には便利なものになると思います。
まだインターネット上に公開できていないため、なるべく早く公開できるようにしたいと思っています。

# GitHub
バックエンド：https://github.com/HagisawaYuki/BBTB_Backend_Repo.git
フロントエンド：https://github.com/HagisawaYuki/BBTB_App.git


# 概要
![スクリーンショット 2024-10-08 10.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/90db4658-dab3-1d50-3bb5-322348f692ef.png)
ログインするとこのホーム画面で自身のお金の情報を見ることができます。
自身の銀行やクレカをクリックすると
![スクリーンショット 2024-10-08 11.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/f3e2e343-c8a1-7f8d-5cc3-aa4afe8ee4d2.png)
図１　銀行ページ
![スクリーンショット 2024-10-08 11.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/c7eb116e-b776-64b0-cda3-4f7e072fe593.png)
図２　クレカページ
このようにそれぞれごとの情報を見ることができます。

ここでクレカや給料をクリックするとそれぞれの情報を編集することができます。
下のフッターからだと全てのエンティティを新規作成・編集することができます。
例えば給料だと下記のフォームから新規作成・編集します。
・編集
![スクリーンショット 2024-10-08 11.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/80bbfa24-1952-8c30-0994-8e36d6dbd022.png)

・新規作成
![スクリーンショット 2024-10-08 11.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/de622aa0-f827-038f-18a3-969d412d32f5.png)


# 使用技術
#### バックエンド
　Java（フレームワーク：SpringBoot）
　SQL
#### フロントエンド
　Next.js
#### ツール
　MySQL
　draw.io(ER図)
　VSCode
　eclipse

# ER図
![BBTB_ER_ver2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/3505b259-c306-3df2-bcbd-aae27ec70c11.png)

# 開発のきっかけ
今までSpringBootとNext.jsを別々で使っていたが、組み合わせて一つのWebアプリを作れるのではという思いつきがきっかけです。また作るなら自分が使いたいWebアプリを作りたいと考えたので今回のような家計簿を作成してみました。

# こだわった点
・月ごとの表示形式にして、先月や翌月のお金の情報も見ることができるようにした。
・編集フォームにて編集前の情報をデフォルト値として入力してある状態にした。
・銀行情報を見やすくして、複数の銀行を一括管理できるようにした。
・Next.jsでchakura.uiを用いることでデザインを均一にして統一感のあるようにデザインした。
・保守性を高めた。

# 反省点
・今回SpringSecurityを用いたかったが、Next.jsとの組み合わせで用いようとしたら、どうやってもエラーが出てしまって諦めてしまったこと。
・ページを増やしすぎて、それごとにfetch処理をしてしまっているせいで処理が遅くなってしまっていること。

# これから追加したい機能
・カレンダー表示
・現金エンティティの追加（編集できるようにする）
・エンティティの削除機能
・パスワード変更機能
・年ごとのお金の表示
・銀行名を入力ではなく選択できるようにする
・インターネット上に載せる
・SpringSecurityを使う
(SSD1306)M5NanoC6、時計で遊ぶ。


x 過去ログを見よ!!
x 時間合わせは、別
x 業務連絡　マルチメディア飲み会あるよ(絶滅メディア博物館)　なんのこと?

結果

![o_coq497.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9b39480a-cbad-fde6-cdae-a5db7f9cfedb.jpeg)


プログラム


```c++


//SSD1306_DS1307_M5NanoC6_1


//ヘッダーファイル
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// デバイスアドレス(スレーブ) DS1307
#define ADDR    0x68    // 2進数 1101000


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(2);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  //時計の処理 ↓ここから
  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(1);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  char data_read[16] = {0x88, 0x88, 0x88}; //データバッファー
  int ii = 0;
  while (Wire.available())  {   // 要求より短いデータが来る可能性あり
    data_read[ii++] = Wire.read();       // 1バイトを受信
  }//while
  delay(1);

  //表示変換する パック二進化十進を文字列にする
  char cn1[16];  //桁
  cn1[0] = '0' + (data_read[2] >> 4);  //0 時 上位
  cn1[1] = '0' + (data_read[2] & 0xf); //1 時 下位
  cn1[2] = ':';
  cn1[3] = '0' + (data_read[1] >> 4);  //2 分 上位
  cn1[4] = '0' + (data_read[1] & 0xf); //3 分 下位
  cn1[5] = ':';
  cn1[6] = '0' + (data_read[0] >> 4);  //4 秒 上位
  cn1[7] = '0' + (data_read[0] & 0xf); //5 秒 下位
  cn1[8] = 0;
  //時計の処理　↑ここまで
  
  display.println(cn1); //時刻を表示する

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop


```
Power Pagesの新規フォームで添付ファイルをアップロードできるようにする方法

デフォルトだと、Power Pagesの新規フォームに添付ファイルを上げるコントロールが表示されません。
設定が必要なので、こちらで設定方法をご紹介します。

まず、Power Pagesでデータのやり取りに使うDataverseのテーブルを設定します。
Dataverseのテーブルの「プロパティ」画面にて、「添付ファイルを有効にする」をオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/13930dd3-9f46-2819-c17f-ea829939edc5.png)

（チェックすると、このテーブルとannotationテーブルにリレーションが作成され、ファイルはannotationテーブルに保存されます。）

このテーブルのフォームを設定します。
今回はPower Pagesのスタジオで編集していきます。Power Appsのスタジオの設定でもできるのでどちらでも大丈夫です。
Power Pagesでサイトの編集画面を開いて左のメニュー[データ]を選択して、
使うテーブルを選択します。
[フォーム]タブ>サイトに挿入するフォームを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/369cbfb5-cbbb-8d52-4779-0dd312449d81.png)


フォームの編集はこれで完了です。

サイトのページにフォームを追加します。
[＋]をクリック>[フォーム]を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/27501df9-082c-2325-f669-3bff8c9d41ed.png)

[フォームの新規作成]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/3dd55695-755e-55e3-61ee-284ab5fffeff.png)

テーブルとフォームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cfc40bd0-2258-7a2f-4eee-936cf2d9fb60.png)


フォームの編集画面で[コンポーネントの追加]を選択して、[タイムライン]を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/abbebec2-8a4e-c0e2-7de5-2f274d878c17.png)



Power Pagesのスタジオでフォームを挿入した後、「編集フォーム」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/69a35dc5-06b4-bc7d-9f6e-8791807b5583.png)


[添付ファイル]＞[添付ファイルを有効にする]を選択>[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/18fdd46a-4aff-cfd7-5d58-cd4e0302c114.png)

添付ファイルを選択できるコントロールが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1499b7f3-b452-82ea-36f5-19418f771c96.png)

これで完了です！


# 補足
ファイル列や画像列は新規フォームで添付コントロールを表示することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f4cf2161-5e27-0bae-b3e9-cbf42a8a56c9.png)

Power Pagesでの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/490cee68-5e9c-a9ed-aea8-350f916ffe97.png)
LinuxのIntel x86のIntrinsic関数をRISC-VやARM用にポートする（１０）

この章では、ｘ８６−６４で生成し、IBM PowerやRISC-Vなどに送られテストを実行するための、Intel Intrinsic関数のInputとOutputを記述したテストファイル群の仕様を記述する。

まずは、以下にファイルに含まれるべき要素を記述していく。

* Intrinsic関数に入力されるInputデータ
* Intrinsic関数から出力されたOutputデータ
* Intrinsic関数の関数名
* 

ここで、「C言語の型」から「テキスト」に変換する機構と、「テキスト」から「C言語の型」に変換する機構が必要となる。

続く
[tips][cpp][problemSolver] Cppのセグフォ特集

## Cppのセグフォ特集

ついやってしまうエラー例を押さえてセグフォ出た時にチェックリストとして使用する用です。

### 関数内で大きい配列を宣言

stackオーバーフローの例です。
関数内で変数を宣言する場合は、スタック領域にメモリを確保するんでした。そしたそのスタック領域は、プログラムが使用可能なメモリ量よりも少なく制限されています。

#### ローカル変数

tmp.cpp
```cpp
#include <iostream>
int main() {
  long long dp[110][100100] = {0};
  cout << "hello" << endl;

  return 0;
}
```


```cpp
g++ -std=c++20 tmp.cpp -o a.out
```

output
```cpp
zsh: segmentation fault  ./a.out
```

#### グローバル変数に修正


```cpp
#include <iostream>
long long dp[110][100100] = {0};
int main() {
  cout << "hello" << endl;

  return 0;
}
```

output
```cpp
hello
```

めでたし。

## 参考

スタックメモリ調査
https://qiita.com/LemniscaterN/items/a3abfa143612cb928bde
https://wikiwiki.jp/kyopro/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF/%E5%A4%A7%E3%81%8D%E3%81%AA%E9%85%8D%E5%88%97%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E6%B3%A8%E6%84%8F
https://qiita.com/kynea0b/items/86a66912e13987bc352f
gce,cloud runなどの料金落とし穴（ネットワーク料金）

## 前置き
以下内容にも間違った情報があるかもなのできちんと調べよう

## 状況
- cloud run でWEBサービスを提供
- ページ上に画像を表示したい
- 画像は特定のコンテンツ配信サーバーから取得
- ただし元URLはフロントに持たせたくない

## 誤った対応
- 一度ウェブサーバーで元URLにアクセス
- 画像の存在チェックを行なった後、変換したURLとオリジナルURLの辞書をキャッシュ、変換したURLをフロントに返却
- フロントから変換したURLにアクセス、オリジナルURLから画像取得、画像を返却

## 何が起きるか
- 画像のサイズがでかかったため、大量のネットワークトラフィック、そこで料金発生（しかもcloud runなのにCompute Engine側の料金としてカウントされる模様、謎）

## 学び
- 素直にCloud Storage使いましょう
- Cloud Storageに保存してそこから参照させましょう
- CDNも使いましょう


要望に対して変な横着をした結果がこれ
・テンプレート側で画像が404の時に要素を表示したくない
　→じゃあリアクティブにDOM生成するvueとか使えばいいじゃーん
 　→SEO対策とか構造化データの問題で、サーバーサイドでレンダリングする必要ありまーす
  　→nuxtとかでビルド済みのテンプレート返せばよくない？
   　→プロジェクトはそもそもそういう仕組みじゃないしそこからやるにはあまりにも大掛かりな変更すぎて時間的猶予がないから無理
    →JSとかで自分でかけばよくない？
    　→それが正解だった、

そもそもvueとかフロントサイドで描画するやつってSEO的に云々って本当なんですかね、、普通にクローラー的に認識できてそうな気がするんですけど。
別にサーバーサイドでレンダリングしないとクローラーが認識できないとか嘘じゃないの誰か教えて
MVCモデル理解できなくて途方にくれてたけど解決した方法

プログラミングを学び始めて約１カ月がたちました。
わからないなりに順調に勉強を進めてきたのですが、
railsの学習に入ってから、進めても進めても進歩がない感じがしました。

学習していきながら理解すればいい！
そう思っていましたが、そもそも今自分が何やってるのか理解できず混乱する日々・・・。

主な原因はrailsの仕組みが全然わかっていないこと。
MVCモデルってのがあるのはわかったけど、それはつまり何？？

ググってもピンとこず、本屋で参考になる本を探しても解決せず。
あーーほんとに困ったよー！
先に進むためにはもっと理解したいのに、私の理解力では太刀打ちできないよー！！

ってときに、気づきました。
ChatGPTに質問すれば解決するかも・・・？

実は毎日ChatGPTと音声で話をしてる私。
音声でのやりとりをしすぎてて、テキストでやり取りできることをすっかり忘れていました笑

そこで、「railsのMVCモデルってどういうこと？MとVとCがあることはわかったけど、
それらがどのように作用しあってるの？」のようなことを聞いてみました。
そこから一瞬で出てくるChatGPTの回答！すごい！

しかしChatGPTの回答は長く難しく、私には理解できず。
いっぱい回答してくれたChatGPTには申し訳なかったけど、
「今の「まとめ」をもっと単純に言い換えてくれる？」
と聞くと、さっきよりももっと単純に説明してくれた！

そこから派生していくつか疑問が浮かんだので質問を重ねる。
と、段々ＭＶＣの構造が理解できてきて、
ChatGPTを使う前の理解度が5%だとすると60%位は理解できるようになりました！

超初心者過ぎて、人間相手には聞くのも憚られる質問も、
根気強く何度も説明してくれるChatGPT大先生・・・。本当にありがとう！！

これからも学ぶ上でなかなか理解が進まないことは自分で調べるだけでなく、
ChatGPTも活用していこうと思いました。

いつかMVCをこんな風に理解したよーっていうのも書きたいと思います！

(投稿初心者でタグが正しいのかもわかりませんがご容赦ください:bow_tone1:)
SlackとGitHubを連携させたのにSlackに通知が流れてこない時



# 前提：そもそもSlackとGitHubの連携とは
下記記事が最高です。

https://zenn.dev/easy_easy/articles/298c9728e01819db9f50

私は複数のrepoで設定を行ったことがあり、今回は数ヶ月ぶりに新しいrepoにも連携設定を行うことになりました。
（つまり、Slack側にGitHubのSlack Appはインストール済み、権限設定も完了済みとします。）


# いきなりフィルターを設定すると通知がこない
「PRの通知だけ配信されれば十分だ」と思い、Slackのチャンネル上で以下のコマンドを実行しました。
```
# 新たにowner-hoge管理下のrepo-fugaのrepoをSlack連携し、PRのみ配信する（うまくいかない）
/github subscribe owner-hoge/repo-fuga pulls
```
成功の通知が来たので、無事設定できてそうです。
![スクリーンショット 2024-10-08 12.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/33ae586b-6838-c08a-530b-0d1fe7e1b046.png)

しかし、PRを作ってもなぜか通知が来ないのです...

# まずはフィルターなしでsubscribeを行い、その後フィルター設定を行うと成功した
以下のように実行するとうまく行きました。

まず、unsubscribeを実行しました。
```
# ひとまずsubscribeを解除して最初からやり直す
/github unsubscribe owner-hoge/repo-fuga 
```

続いて、今度はフィルターなしでrepoごとsubscribeしました。
```
# フィルターを設定せずにrepoごとsubscribeする
/github subscribe owner-hoge/repo-fuga
```

最後にフィルター設定を行いました。
```
# pulls以外をunsubscribbeする
/github subscribe owner-hoge/repo-fuga pulls
```

# まとめ
ドキュメントを熟読してないので、なんとも言えないのですが...
「最初のコマンドを実行した時成功しているっぽいメッセージが表示されること」が全ての沼の原因の気がしています。

そもそも私の設定がおかしい可能性もあるので、その際は追記しようと思います。
【AWS】AWSコンソールを使用した構築手順１－１

## 全体像
![AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/ea559194-0fa4-49cf-5d42-b25acbd7c113.png)

## 必要なAWSリソース
・VPC　×　１　（ ap-northeast-1：東京リージョン）
・パブリックサブネット　×　１
・プライベートサブネット　×　１
・EC2インスタンス　×　１
・NATゲートウェイ　×　１
・インターネットゲートウェイ　×　１

## 出来るようになること
・上記のAWSリソースの作成ができる。
・プライベートサブネット内のEC2インスタンスからインターネットへ疎通確認ができる。
　（qiita.comへpingを打つ。）

## 構築手順
### １．AWSコンソールにIAMユーザとしてログインする。

### ２．ap-northeast-1：東京リージョンを選択

### ３．VPCの作成
#### ３－１．上記バーの検索に「vpc」と入力し、Enter押下
#### ３－２．画面左の「お使いのVPC」を押下
#### ３－３．画面右上の「VPCを作成」を押下
#### ３－４．「VPCの設定」において以下を選択
	・作成するリソース：VPCのみ
	・名前タグ：任意のタグ名（hirose-vpc-01など）
	・Ipv4 CIDRブロック：今回は、10.0.0.0/20
	・Ipv6 CIDRブロック：IPv6 CIDRブロックなしを選択
#### ３－５．「VPCを作成」を押下

### ４．サブネットの作成（パブリック）
#### ４－１．画面左の「サブネット」を押下
#### ４－２．画面右上の「サブネットを作成」を押下
#### ４－３．「VPC ID」に３で作成したVPCを選択する。
#### ４－４．「サブネットの設定」において以下を選択及び入力
    ・サブネット名：任意の名前（hirose-pubsub-01など）
    ・AZの選択：今回は、ap-northeast-1a
    ・IPv4 VPC CIDRブロック：10.0.0.0/20になっていることを確認
    ・IPv4 サブネットCIDRブロック：今回は、10.0.0.0/24
#### ４－５．「サブネットを作成」を押下

### ５．サブネットの作成（プライベート）
#### ５－１．画面左の「サブネット」を押下
#### ５－２．画面右上の「サブネットを作成」を押下
#### ５－３．「VPC ID」に３で作成したVPCを選択する。
#### ５－４．「サブネットの設定」において以下を選択及び入力
	・サブネット名：任意の名前（hirose-prisub-01など）
	・AZの選択：今回は、ap-northeast-1a
	・IPv4 VPC CIDRブロック：10.0.0.0/20になっていることを確認
	・IPv4 サブネットCIDRブロック：今回は、10.0.1.0/24
#### ５－５．「サブネットを作成」を押下

### ６．IGWの作成及びVPCへのアタッチ
#### ６－１．画面左の「VPCダッシュボード」内のインターネットゲートウェイを押下
#### ６－２．画面右上の「インターネットゲートウェイの作成」押下
#### ６－３．「名前タグ」にて任意の名前を入力（hirose-igw-01など）
#### ６－４．「インターネットゲートウェイの作成」押下
#### ６－５．上記で作成した自身のインターネットゲートウェイの左にあるチェックボックスにチェックをつける。
#### ６－６．画面右上の「アクション」押下　→「VPCにアタッチ」押下し、以下を設定
    ・「使用可能なVPC」：３で作成したVPCを選択
	・「インターネットゲートウェイのアタッチ」押下
### ７．NATゲートウェイの作成
#### ７－１．画面左の「VPCダッシュボード」内のNATゲートウェイを押下
#### ７－２．画面右上の「NATゲートウェイの作成」押下
#### ７－３．「NATゲートウェイの設定」にて以下を選択及び入力
    ・「名前」：任意の名前を入力（hirose-natgw-01など）
	・「サブネット」：４で作成したパブリックサブネットを選択
#### ７－４．「ElastinIPの割り当て」を押下
#### ７－５．「NATゲートウェイの作成」押下

### ８．EC2インスタンスの作成
#### ８－１．画面左上の検索バーにて、「EC2」と入力し、ENTERキーを押下
#### ８－２．画面左の「EC2ダッシュボード」のインスタンスを押下
#### ８－３．画面右上の「インスタンスを起動」押下
#### ８－４．「Launch an instance」において、以下を選択及び入力
	・「名前とタグ」：任意の名前を入力（hirose-ec2-01など）
	・「アプリケーションおよびOSイメージ」：AMIがAmazon Linux 2023 AMIを選択
	・「インスタンスタイプ」：t2.microを選択
	・「キーペア」：新しいキーペアを作成　
	　　「新しいキーペアを作成」における手順
	　　　「キーペア名」：任意の名前（hirose.key）
	　　　「キーペアのタイプ」：RSA
	　　　「プライベートキーファイル」：.pem
	　　　「キーペアを作成」を押下
	　　　＊ダウンロードしたキーペアはssh接続の時に使用する。
	・「ネットワーク設定」：「編集」を押下
	　　「編集」画面にての操作
        　「VPC」：３で作成したVPCを選択
	　　　「サブネット」：５で作成したプライベートサブネットを選択
	　　　「パブリックIPの自動割り当て」：有効化
	　　　「ファイアウォール（セキュリティグループ）」：セキュリティグループを作成を選択
	　　　「セキュリティグループ名」：デフォルトの値
	　　　「説明」：デフォルトの値
#### ８－５．「インスタンスを起動」押下

## 休　憩
### 文字起こししてみて、実際の操作からは、想定していなかった程、説明がとても長くなってしまいました。
### 手順の途中ではありますが、一旦ここで切りたいと思います。
### 次回、「AWSコンソールを使用した構築手順１－２」を作成しますので、引き続き参考にしてください。
Pythonを用いたプログラミング学習②｜値の表示・変数・ループ処理・条件分岐・関数・モジュール

# 値の表示
画面に文字や数字を表示するには **print** を用いて以下のように記述する。
```python:
print ( 値 )
```

# 変数
変数は以下のように記述する。
```python:
変数名 = 値
```

# ループ処理
ループ処理は **while** もしくは **for**, **in** を用いて以下のように記述する。
```python:
while 条件式:
    条件成立時に実行する処理

for 変数名 in シーケンス:
```
　シーケンスとは、例えば**リスト**を用いる場合は **for 変数名 in [1, 2, 3, …]** のようになり、**range関数**を用いる場合は **for 変数名 in range (開始値, 終了値+1)** となる。

# 条件分岐
条件分岐は以下のように記述する。
 ```python:
 if 条件文:
    条件成立時に実行する処理
else:
条件不成立時に実行する処理
```

# 関数
関数は以下のように記述する。
```python:
def 関数名 (引数1, 引数2, … ):
    実行する処理
```

#### スコープについて
　関数の内で定義した変数は**ローカルスコープ**となり、関数外からの影響を受けないと同時に、ローカルスコープの変数の値を変更したりしても関数外へ影響を及ぼすことがない。
　関数の外で定義した変数は**グローバルスコープ**となり、コードライン上のどこでも呼び出すことができ、新たな値の代入も任意のラインにて行える。

```python:
text = ABC

def function():
    text = XYZ
    print (text)
    return

print(text)
function()
```
　スコープの例として、上記コードでは変数textの値が関数function内（ローカルスコープ）でXYZに変更されているため、実行すると以下のようにprint(text)からはABCが出力され、function()からはXYZが出力される。
 ```python:
ABC
XYZ
 ```


# モジュール
モジュールは **import** を用いて以下のように記述して読み込む。
```python:
import モジュール名
```
また、**as** を用いてモジュール名を置き換えることもできる。
```python:
import モジュール名 as 略称
```
モジュールを実行する際は以下のように記述する。
```python:
モジュール名.関数名
```
<br>

次項：[Pythonを用いたプログラミング学習③｜数当てゲーム（ヒット＆ブロー）の作成](https://qiita.com/D_Sato_01/items/d46f6578f9c03b603948)

前項：[Pythonを用いたプログラミング学習①｜演算子](https://qiita.com/D_Sato_01/items/26a9ab000cb1b7f2a540)
hugoで作ったサイト(リポジトリがプライベート)をデプロイする

## hugoでブログを作った
hugoでブログを作りました。

https://blog.samenoko.xyz/

最終的にデプロイ先は[ロリポップ](https://lolipop.jp/)になりましたが、それまでの変遷です。

## 候補
Netlify

https://www.netlify.com/

Render

https://render.com/

## 前提
hugoで作ったサイトがgithub上にある
このときの公開状態は問わない。(今回はプライベート)

## Netlifyを使ってみた
これまで全然触ってこなかったのでシンプルに使ってみたかっただけではあるのですが、、
以下の設定でデプロイしました。

Build command : hugo --minify
Publish directory : public
※環境変数
HUGO_VERSION : 0.135.0

### 却下になった理由
- 帯域幅に制限がある(月100GB)
- ビルド時間に制限がある
- 遅い(無料枠だとRegionがUS)

以上の理由により却下されました

## Renderを使ってみた
これもherokuの代替として話題になってたから使ってみたかった
先程のNetlifyと同じような設定でいけます

Build Command : hugo --gc --minify
Publish directory : public

環境変数は無くていけた。

### 却下になった理由
Netlifyと同じ感じ。
- 帯域幅に制限がある(月100GB)
- ビルド時間に制限がある

## ロリポップに
最終的にはロリポップで公開するようにしました。
GithubActionsを使ってビルド→デプロイまでするように。
以下は書いたファイルです。
```yaml:.github/workflows/deploy.yml
name: lolipop

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2
      
      - name: checkout submodule
        shell: bash
        run: |
          auth_header="$(git config --local --get http.https://github.com/.extraheader)"
          git submodule sync --recursive
          git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
                    
      - name: setup hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: latest
          extended: true

      - name: Build
        run: hugo --minify

      - name: Deploy via FTP
        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
        with:
          server: ${{ secrets.FTP_HOST }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          server-dir: ${{ secrets.FTP_REMOTE_ROOT }}
          local-dir: public/
```

secretsは以下のように設定してね
secrets.FTP_HOST : ftp.lolipop.jp
secrets.FTP_USERNAME : アカウント情報>FTPアカウント
secrets.FTP_PASSWORD : 設定したパスワード
secrets.FTP_REMOTE_ROOT : 公開フォルダ(最後に/を付ける)

みたいな？
### 採用した理由
- 帯域幅に制限がない
- リージョンが日本

ビルド時間に関してはGithubActionsの無料枠ですけど、大丈夫だろうと。
普段使っていて速度に不満がなかったので。

## 以上
以上です。
Pagesは使わないの？という意見もあるかと思いますがそもそもプライベートだと公開できなかったり
Cloudflareの方だとsubmoduleがチェックアウトされないので不採用になっています。
UnityのWebGLでダウンロードしたAudioClipがUnloadedで再生できない問題

# 問題
Unityで音声ファイルをダウンロードして再生する手順はこのようなコードになります。

```c#:ChatGPTが書いたサンプルコード
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class AudioClipDownloader : MonoBehaviour
{
    public string audioUrl = "https://example.com/audiofile.mp3"; // 音声ファイルのURL
    public AudioSource audioSource;

    void Start()
    {
        if (audioSource == null)
        {
            audioSource = gameObject.AddComponent<AudioSource>();
        }

        StartCoroutine(DownloadAndPlayAudio());
    }

    IEnumerator DownloadAndPlayAudio()
    {
        using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(audioUrl, AudioType.MPEG))
        {
            yield return www.SendWebRequest();

            if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError(www.error);
            }
            else
            {
                AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
                audioSource.clip = clip;
                audioSource.Play();
            }
        }
    }
}
```

UnityEditor上ではこれで正常に再生できます。
しかし、WebGLでビルドし、ブラウザで実行したところ、エラーは発生しないが再生されないという問題が発生しました。
AudioClipの中身を出力したところ、loadStateがUnloadedになっていました。
これはローディングされていない状態を指しています。
https://docs.unity3d.com/jp/2019.1/ScriptReference/AudioDataLoadState.Unloaded.html
これでは再生できません。


# 解決策
ローディングされるまで待つ必要がありました。
下記を追加してloadStateが変わるまで待ちます。

```c#
while(clip.loadState == AudioDataLoadState.Unloaded) {
    yield return null;
}
```

```c#:ChatGPTが書いたサンプルコード(追記)
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class AudioClipDownloader : MonoBehaviour
{
    public string audioUrl = "https://example.com/audiofile.mp3"; // 音声ファイルのURL
    public AudioSource audioSource;

    void Start()
    {
        if (audioSource == null)
        {
            audioSource = gameObject.AddComponent<AudioSource>();
        }

        StartCoroutine(DownloadAndPlayAudio());
    }

    IEnumerator DownloadAndPlayAudio()
    {
        using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(audioUrl, AudioType.MPEG))
        {
            yield return www.SendWebRequest();

            if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError(www.error);
            }
            else
            {
                AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
                while(clip.loadState == AudioDataLoadState.Unloaded) {
                    yield return null;
                }
                audioSource.clip = clip;
                audioSource.Play();
            }
        }
    }
}
```
※ Unity2022.3.44f1を使用。
スーパーマーケットで商品探し？売り場のご案内はどの担当者でもお任せください！


## これからはデジタルが多能工の時代！ ## 
**すみませんこの商品ありませんか？この商品はどこに並んでいますか？**

スーパーで働く者100度は経験したお客さまからの問い合わせ。
上についてる案内板は目に入らぬか？と何度思ったことか。。
ただ、担当部門の従業員といえど全てを把握しているわけではありません。
魚屋の大将にこのお菓子はどこに並んでいるのでしょうか？こんなの日常茶飯事です！
そのたびに**○○さん事務所までお越しください！**　またか・・・・・・

**このシャトルランのような往復がなければ・・・**　
もっと心にゆとりができてお客さまに**笑顔**を届けられるのに・・

はい！ということで**家**にいても何番通路にあるのか？はたまた取り扱いがあるのか？わかる
LINEBotを作っていきましょう！
## 使用する材料はこちら ##
・[Make](https://www.make.com/en/ "Make")
・Googleスプレッドシート
・[LINE Developers](https://developers.line.biz/ja/?status=success)

## 完成図 ##

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/3fd9e620-3d1b-a23c-79f5-b750a5171245.png)

## 調理手順 ##
#### 1\. まずはGoogle Sheetsの作成 ####
下ごしらえに時間をかけるのがいいものを作る基本です！1番時間かかりました。
取り扱っている商品をA　通路番号をBに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/94510cac-89da-3605-3ecd-dd110b444196.png)


#### 2\.下ごしらえ済みのGoogle Sheetsの設定 ####
商品名を入力したら通路番号が出るように設定したいので
このように設定いたします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/d3b68b18-d14e-9c1e-12a5-82b5afd3a864.png)


#### 3\.もしも取扱商品がなかった時の対応 ####

もう少しこだわりたい部分ではあるのですがここでは、
別のところに誘導する案内文のみの設定にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/7bae76bf-9045-97d8-c79d-4419cf4c180b.png)


## できあがったものがこちら ##

https://x.com/ohashi198/status/1843280637882757237

## 今後の課題 ##

日々、商品の入れ替わりが激しいスーパーマーケットなのでスプレッドシートを
手動で更新していたらとても追いつけません。ここを自動化できることと、
実際に使ってみて、文字だけでなく写真投稿からでも対応できるようにすると
もっと便利になると思い　**Google　Cloud　Vision**　こちらの設定に今注目しています。
こういうものが作れる便利になった世の中ですが**セキュリティ**や**コンプライアンス**
こちらも比例して強固になっていくので関係各所に確認を取りつつ便利なものを
作成していこうと思います。
Vue.jsとSPA(シングルページアプリケーション)

# はじめに
以下はVue.jsを学習する過程でメモした備忘録になります

## Vue.jsとは
Vue.js（ビュー・ジェイエス）は、JavaScriptで作られたフロントエンドフレームワークであり、画面の一部だけをすばやく変えるような動きを作るのが得意なフレームワークです。例えばボタンを押したらすぐに情報が変わったり、動いたりするようなウェブサイトを作るのに役立ちます。

### フレームワークとは

``プログラムやアプリケーションを開発するための「基本的な枠組み」や「テンプレート」``です。よく使われる機能や構造があらかじめ組み込まれているため、開発者はゼロからすべてを作る必要がなくなります。

### Vue.jsの特徴
- **パーツを組み合わせた画面を作ることができる**
    - メニューの部分、ボタンの部分、画像の部分など、それぞれの部品を別々に作って組み合わた画面を作ることができます
- **リアルタイムで画面が変わる**
    - 画面全体を読み込み直さずに、一部分だけ変えることができるので、スムーズで素早い動きを実現できます

## SPA(シングルページアプリケーション)とは

ウェブサイトには大きく分けて2種類存在します
- **シングルページアプリケーション（SPA: Single-Page Application）**
    - リンクをクリックしてもページを再読み込みしない
    - 必要な部分だけをサーバーから取得して表示します
    - タスク管理アプリやSNSなど、ユーザーが頻繁に操作する必要がある画面に使われます


- **マルチページアプリケーション（MPA: Multi-Page Application）**
    - リンクをクリックするたびに毎回ページ全体が読み込まれる仕組み
    - 従来のウェブサイトの作り方です
    - ニュースサイトやブログなど、ページが多いウェブサイトに多く使われます