OmniAICreator/Qiita-1.07M huggingface dataset:
Initialize Configuration

[Previous << Decode a Transaction](https://qiita.com/flowcadence/items/21c86299c83f81933e49)
[Next >> Configuration](https://qiita.com/flowcadence/items/aa32f56e7469e8fbe5f4)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

Flow CLI は、設定（通常は`flow.json`ファイル）と呼ばれる状態(state)を使用して動作します。この設定を必要とするコマンドを使用する前に、initコマンドを使用してプロジェクトを初期化する必要があります。[状態(state)設定についてはこちら](https://qiita.com/flowcadence/items/aa32f56e7469e8fbe5f4)をご覧ください。
```ruby
flow init
```

<h1>Example Usage</h1>

```ruby
> flow init

Configuration initialized
Service account: 0xf8d6e0586b0a20c7

Start emulator by running: 'flow emulator' 
Reset configuration using: 'flow init --reset'
```

<h3>Error Handling</h3>

既存の設定がある場合、以下のエラーが発生します。あなたは空のフォルダの中で初期化するか、`--reset` フラグを使用、もしくは設定ファイルを最初に削除して、設定をリセットする必要があります。

```ruby
❌ Command Error: configuration already exists at: flow.json, if you want to reset configuration use the reset flag
```
<h1>Global Configuration</h1>

Flowはグローバル設定をサポートしており、これは`flow.json`ファイルをホームディレクトリに保存しておき、CLIコマンドを実行する場所に関わらず、それを最初の設定ファイルとして読み込むというものです。

グローバル設定は優先度が最も低く、他の設定ファイルが存在する場合は、そのファイルによって上書きされることにご注意ください。（`flow.json`がカレントディレクトリに存在する場合は、それはグローバル設定の重複するプロパティを上書きします。）

`--global` フラグを使用して、グローバル設定を生成することができます。

コマンドの例：`flow init --global`

グローバルFlow設定は以下のように保存されます。
* MacOs: `~/flow.json`
* Linux: `~/flow.json`
* Windows: `C:\Users\$USER\flow.json`

<h1>Flags</h1>

<h3>Reset</h3>

* Flag: `--reset`

このフラグを使用すると、既存の設定がリセットされ、新しい設定を作成します。

<h3>Global</h3>

* Flag: `--global`

このフラグを使用すると、グローバルなFlow設定が作成されます。
<h3>Service Private Key</h3>

* Flag: `--service-private-key`
* Valid inputs: a hex-encoded private key in raw form.

デフォルトのサービスアカウントに使用される秘密鍵。

<h3>Service Key Signature Algorithm</h3>

* Flag: `--service-sig-algo`
* Valid inputs: `"ECDSA_P256"`, `"ECDSA_secp256k1"`
* Default: `"ECDSA_P256"`

公開鍵のECDSA署名アルゴリズムを指定します。

secp256k1とP-256の曲線をサポートしています。

<h3>Service Key Hash Algorithm</h3>

* Flag: `--service-hash-algo`
* Valid inputs: `"SHA2_256"`, `"SHA3_256"`
* Default: `"SHA3_256"`

アカウント作成時に公開鍵とペアとなるハッシュアルゴリズムを指定します。

<h3>Log</h3>

* Flag: `--log`
* Short Flag: `-l`
* Valid inputs: `none`, `error`, `debug`
* Default: `info`

ログレベルを指定します。コマンド実行中に表示する出力を制御します。


*Last updated on **Nov 20, 2024** by **Chase Fleming***

翻訳元

https://developers.flow.com/tools/flow-cli/flow.json/initialize-configuration

***
<b>[Previous << Decode a Transaction](https://qiita.com/flowcadence/items/21c86299c83f81933e49)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Initialize Configuration)

<b>[Next >> Configuration](https://qiita.com/flowcadence/items/aa32f56e7469e8fbe5f4)</b>
分散並列Prolog（２）

# 並列の効果の測定
自作のN-Prologに分散並列の機能を追加しました。これを使うとどのような効果があるのか？Queens問題を解いてその性能を測定することとしました。

# 並列版のコード
１０Queensによることとしました。並列に分解するために１～10を先頭要素に持つようにコードを分解しました。[1,2...,10]のリストからN番目を取り除き、それについてQueens問題を解いたものにNを追加することで答えを得ています。比較のために逐次実行のコードも併記します。


```prolog
% 10-queens program in parallel  

%parallel 10queens
para :- dp_and([test1,test2]).

test1 :- queens1,queens2,queens3,queens4,queens5.
test2 :- queens6,queens7,queens8,queens9,queens10.  

queens1 :- pqueen(1,[2,3,4,5,6,7,8,9,10],X),fail.  
queens1.
queens2 :- pqueen(2,[1,3,4,5,6,7,8,9,10],X),fail.  
queens2.
queens3 :- pqueen(3,[1,2,4,5,6,7,8,9,10],X),fail.  
queens3.
queens4 :- pqueen(4,[1,2,3,5,6,7,8,9,10],X),fail.  
queens4.
queens5 :- pqueen(5,[1,2,3,4,6,7,8,9,10],X),fail.
queens5. 
queens6 :- pqueen(6,[1,2,3,4,5,7,8,9,10],X),fail.  
queens6.
queens7 :- pqueen(7,[1,2,3,4,5,6,8,9,10],X),fail.  
queens7.
queens8 :- pqueen(8,[1,2,3,4,5,6,7,9,10],X),fail.  
queens8.
queens9 :- pqueen(9,[1,2,3,4,5,6,7,8,10],X),fail.  
queens9.
queens10 :- pqueen(10,[1,2,3,4,5,6,7,8,9],X),fail.  
queens10.

pqueen(N, Data, [N|Out]) :-  
 pqueen_2(N, Data, [N], Out).  


 pqueen_2(_, [], _, []).  
 pqueen_2(N, [H|T], History, [Q|M]) :-  
  qdelete(Q, H, T, L1),  
  nodiag(History, Q, 1),  
  pqueen_2(N, L1, [Q|History], M).  
 
% sequential 10queens
seq :- queen([1,2,3,4,5,6,7,8,9,10],X),fail.

queen(Data, Out) :-
     queen_2(Data, [], Out).


queen_2([], _, []).
queen_2([H|T], History, [Q|M]) :-
        qdelete(Q, H, T, L1),
        nodiag(History, Q, 1),
        queen_2(L1, [Q|History], M).
    

qdelete(A, A, L, L).  
qdelete(X, A, [H|T], [A|R]) :-  
 qdelete(X, H, T, R).  


nodiag([], _, _).
nodiag([N|L], B, D) :-
    D =\= N - B,
    D =\= B - N,
    D1 is D + 1,
    nodiag(L, B, D1).

```

# 実行結果
3台のLinuxマシンを接続して実行しました。子機は1台は古いインテルi5、もう１台はAMD Ryzen、親機はインテルi7マシンです。

![bandicam 2024-12-02 16-16-15-213.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/d0465d63-08ec-7f77-57f3-34ff28dced25.jpeg)

並列実行の方が若干高速になっていますが2倍までには至っていません。上述のように子機のうちの1台は古いマシンでありこれが足を引っ張っていると思われます。TCP/IP通信などのオーバーヘッドがあるにしても同程度の子機をそろえればおおむね2倍の計算速度が期待されます。

# 並列とProlog
Prologはバックトラックがあります。これと並列とを同居させることはかなりの困難を伴います。第五世代コンピューター計画においては専用の並列PrologマシンとGHCなどを開発しました。私はPrologのバックトラックを活かしつつ並列の良さを取り入れたいと思いました。分散並列であればそれぞれのマシンにおいてバックトラックが制約無く行えます。Prologが深さ優先探索であることを考えると分散したマシンで各それぞれが探索する方が向いているように思います。

# ラズパイクラスタマシン
10台のラズパイをクラスタ接続したマシンを作ることを計画しています。これができると上述の10Queensはおおよそ10倍速で実行できるはずです。

https://github.com/sasagawa888/nprolog
【ネットワーク】３分間NetWorking 第23回 OSI参照モデル レイヤ3 サブネットマスク

# はじめに
この記事は、3分間NetWorkingを読んでインプットした知識をアウトプットするために執筆しています。
学習内容のまとめ、学習してみての所感や疑問などを記載しています。
記事を読んでみて、間違っていることへの指摘や感想などありましたら、ぜひコメントをいただければ幸いです。
3分間NetWorkingのリンクは以下の通り。
https://www5e.biglobe.ne.jp/aji/3min/

#### :bulb:記事のトピックス
・プライベートIPアドレス
・サブネット・サブネットマスク

# プライベートアドレス
インターネットに接続しないLAN、WANもしくは、内部ネットワークなどは、プライベートIPアドレスを使います。前回説明した、NICから割り当てられるインターネットで使えるアドレスは、グローバルIPアドレスと言います。
グローバルIPアドレスでは、予約済みアドレスとして、プライベートIPアドレスを割り振ってはいけないとされています。

＜プライベートIPアドレス＞
クラスＡ：10.0.0.0
クラスＢ：172.16.0.0～172.31.0.0
クラスＣ：192.168.0.0～192.168.255.0

これらのアドレスは、プライベート用に予約されているので、グローバルIPアドレスでも割り振りません。
プライベートIPアドレスは、インターネットに接続しない環境で使われるもので、万が一誤ってインターネットに接続してしまっても、ルータがインターネット上に流さないように止めます。
ルータが止めてくれるのはプライベートIPアドレスだけなので、プライベート環境だからと好き勝手にIPアドレスを付けると、インターネットに接続されてしまった時に大変なことになってしまいます。

# サブネット
インターネットは、巨大な一つのネットワークを複数の小さなネットワークに分けて管理されています。
この小さなネットワークをサブネットと言います。
ホストの数が多ければ多いほど、管理が煩雑になってしまうため、サブネットで小分けすることで管理しやすくします。

IPアドレスはネットワーク番号とホスト番号で成り立っていますが、サブネットに分割するために、以下のようにホスト番号を削って、サブネット番号というものを設けます。

**ネットワーク番号＋サブネット＋ホスト番号**

これまでのネットワーク番号＋ホスト番号の時は、電話機を例に取ると、
0123-45-6789（0123までがネットワーク番号、それ以降がホスト番号）でしたが、ここにサブネット番号を設けると、（0123までがネットワーク番号、45がサブネット番号、6789がホスト番号）になります。

では、サブネット番号に何ビット使うかをどのように決めているか、これはネットワーク管理者が任意の値を割り振ることができます。元はホスト番号なので、ネットワーク管理者が決めることが出来るのです。
一応、ネットワーク管理者が任意に決められるとは言っても、基準となるものが存在します。

サブネットは、ホストを削って成り立っているため、サブネットのビットが多くなればなるほど、ホストのビットは少なくなります。
ホストのないサブネットに意味はないため、ホストには最低2ビット残します。
つまり、サブネットに必要なビット数は、サブネットには最低2ビット残した上で、必要なサブネット数、ホスト数を考慮して決定されます。

# サブネットマスク
どのネットワークに所属しているかは、ネットワークの経路選択の際に非常に重要になります。
ルータがネットワーク番号を元に、経路選択を行うため、IPアドレスのうち、どこまでがネットワーク番号なのかを知る必要があります。

クラスフルアドレッシングを使えば、どこまでがネットワーク番号かは分かります。しかし、サブネット番号はネットワーク管理者が任意に付けた番号となるため、どこまでがサブネット番号なのかが分からないのです。
そこで、どこまでがサブネット番号なのかを示す、サブネットマスクというものが使われます。
サブネットマスクは、IPアドレスと同じ32ビットで、同じ表記法をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893135/c285ef2d-e551-316e-7eb3-368105f097b5.png)
※引用：https://www5e.biglobe.ne.jp/aji/3min/23.html

上図だと、一番下の「255.255.252.0」の部分がサブネットマスクです。
つまり、ネットワーク番号、サブネット番号のビットを全て1、ホスト番号のビットを全て0にしたものです。これにより、サブネットマスクの1の部分がネットワークということになります。
M5NanoC6で三角関数の計算し、ベンチマークする。(単精度浮動小数点)



参考


https://ichiken-engineering.com/arduino-uno-r4-minima_keisan/


https://qiita.com/caa45040/items/209d5cd9e5dacd9f4aaf



x 過去ログを見よ!!
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。


結果

![o_coq674.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/73957f81-0fd7-8bac-6551-8f1185f546f8.jpeg)


Arduino UNO 3と比べて12倍速い
--------------------------


約34300ms(34秒) Arduino UNO 3
約2924ms(3秒) M5NanoC6



プログラム


```c++


//度数で与えられた角度を弧度法に変換し、それをsin, arcsin, cos, arccos, tan, arctanの順で三角関数の計算を行い、それを0~359°まで反復する。
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500); //起動待ち
  }
  Serial.println();
}
float deg_to_rad(float deg) {
  float rad;
  rad = deg * (PI / 180);
  return rad;
}
float rad_to_deg(float rad) {
  float deg;
  deg = rad / (PI / 180);
  return deg;
}
void loop() {
  unsigned long start_time, end_time;
  unsigned long time;
  float rad, deg1, deg2, deg3, t_sum;
  t_sum = 0;
  unsigned int temp;
  int x;
  start_time = millis();
  for (x = 0; x < 100; x++) {
    for (int deg = 0; deg < 360; deg++) {
      rad = deg_to_rad((float)deg);
      deg1 = rad_to_deg(asin(sin(rad)));
      rad = deg_to_rad((float)deg1);
      deg2 = rad_to_deg(acos(cos(rad)));
      rad = deg_to_rad((float)deg2);
      deg3 = rad_to_deg(atan(tan(rad)));
      if( deg3 < 0.0f ) { deg3 = 0.0f - deg3;}
      t_sum = t_sum + deg3;
    }
  }
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x); //最後の値の出力
  Serial.print('-');
  Serial.print(t_sum); //最適化対策 1から90の足し算91*45=4095 (16380-180)*100
  Serial.print(" rad:");
  Serial.print(rad);
  Serial.print(" deg2:");
  Serial.print(deg2);
  Serial.print(" deg3:");
  Serial.print(deg3);
  Serial.print("\n");
  Serial.print("StartTime:");
  Serial.print(start_time);
  Serial.print(" EndTime:");
  Serial.print(end_time);
  Serial.print(" Time:");
  Serial.println(time);
  delay(3000);
}



```
【基本情報】独学マラソン SEO実践① Day 27

:::note worn
この記事は自分用の備忘録です。
:::

## SEOでまず最初にやること
タイトルと説明文をつけるらしい

htmlのheadにあるやつだ

## やってみる

```zsh
mkdir seo-try
cd seo-try
touch index.html
```

これでindex.htmlを開いて「！」ぽん

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```

discriptionのmetaタグがないので追加
ついでにタイトルも変える

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="SEO対策の初歩を学ぶため、実践の記録を残していきます。">
  <title>【実践】SEO対策！</title>
</head>
<body>
  <h1>トップページだよ</h1>
</body>
</html>
```

### ポイント
- タイトル
    - 「ページの内容 – サイト名」みたいにするといいらしい
    - 各ページごとに個別にタイトルが変わるようにしないといけないらしい
    - ページの内容の部分は、実際のコンテンツに含まれるキーワードを抽出するといいらしい
    - 40文字ぐらいがちょうどいいらしい

<br>

- 説明文
    - タイトルに書いた「ページの内容」をキーワードとして含めるといいらしい

## ポイントを参考にもっかいやってみる

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="SEOの基本を学ぶための備忘録です。
      このページではHTMLのタイトルや説明文の設定方法、最適化のポイントを
      わかりやすく解説しています。"
  >
  <title>SEOの基本を学ぶ！HTMLタイトルと説明文設定のコツ - WEB制作検定【5級】</title>
</head>
<body>
  <h1>SEO対策の基本を学ぶページ</h1>
  <p>このページでは、SEOの基本的な設定方法を記録しています。</p>
</body>
</html>
```

## 動的にする

全部個別ページに直接書くってあんまりないと思うので、動的にする

``` header.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <?php if (is_single() || is_page()) : ?>
    <meta name="description" content="SEOの基本を学ぶための備忘録です。このページではHTMLのタイトルや説明文の設定方法、最適化のポイントをわかりやすく解説しています。">
    <title><?php echo get_the_title(); ?> - WEB制作検定【5級】</title>
  <?php elseif (is_home()) : ?>
    <meta name="description" content="SEOの基本を学ぶための備忘録です。最新の記事一覧や更新情報をお届けします。">
    <title>SEOの基本を学ぶ！HTMLタイトルと説明文設定のコツ - WEB制作検定【5級】</title>
  <?php elseif (is_category()) : ?>
    <meta name="description" content="<?php single_cat_title(); ?>に関連する記事一覧です。HTMLやSEOに関する情報を中心にお届けします。">
    <title><?php single_cat_title(); ?> - WEB制作検定【5級】</title>
  <?php else : ?>
    <meta name="description" content="サイト全体の概要や情報を記載します。">
    <title>WEB制作検定【5級】</title>
  <?php endif; ?>
</head>
<body>
  <header>
    ナビゲーション
  </header>
```

一気にややこしくなった。
こういうのはエクセルとかできちんと管理した方が良さそう。

# 感想
SEO対策は、コーディングよりも言語化スキルの方が重要かもしれない。

# 参考

https://satori.marketing/marketing-blog/seo-measures/
Rails - presence と inclusion / format などのバリデーションで両方でモデルのバリデーションエラーが発生するのを防ぐ

# 解決

- presence を指定する
- 他のバリデーションでは `allow_nil: true` を設定する

と成り立つようだ

ちなみに `allow_nil` は「値がnilの場合に、そのバリデーションをスキップする」という動き

## 例

```rb
  validates :some_attribute, presence: true
  validates :some_attribute, inclusion: { in: [1,2,3] }, allow_nil: true
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Arduino UNO 3で三角関数の計算し、ベンチマークする。(単精度浮動小数点)



参考


https://ichiken-engineering.com/arduino-uno-r4-minima_keisan/



x 過去ログを見よ!!
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。


結果


![o_coq673.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/18adf435-410e-62fd-c4ea-b1b4cc8fb996.jpeg)



プログラム


```c++


//度数で与えられた角度を弧度法に変換し、それをsin, arcsin, cos, arccos, tan, arctanの順で三角関数の計算を行い、それを0~359°まで反復する。
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500); //起動待ち
  }
  Serial.println();
}
float deg_to_rad(float deg) {
  float rad;
  rad = deg * (PI / 180);
  return rad;
}
float rad_to_deg(float rad) {
  float deg;
  deg = rad / (PI / 180);
  return deg;
}
void loop() {
  unsigned long start_time, end_time;
  unsigned long time;
  float rad, deg1, deg2, deg3, t_sum;
  t_sum = 0;
  unsigned int temp;
  int x;
  start_time = millis();
  for (x = 0; x < 100; x++) {
    for (int deg = 0; deg < 360; deg++) {
      rad = deg_to_rad((float)deg);
      deg1 = rad_to_deg(asin(sin(rad)));
      rad = deg_to_rad((float)deg1);
      deg2 = rad_to_deg(acos(cos(rad)));
      rad = deg_to_rad((float)deg2);
      deg3 = rad_to_deg(atan(tan(rad)));
      if( deg3 < 0.0f ) { deg3 = 0.0f - deg3;}
      t_sum = t_sum + deg3;
    }
  }
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x); //最後の値の出力
  Serial.print('-');
  Serial.print(t_sum); //最適化対策 1から90の足し算91*45=4095 (16380-180)*100
  Serial.print(" rad:");
  Serial.print(rad);
  Serial.print(" deg2:");
  Serial.print(deg2);
  Serial.print(" deg3:");
  Serial.print(deg3);
  Serial.print("\n");
  Serial.print("StartTime:");
  Serial.print(start_time);
  Serial.print(" EndTime:");
  Serial.print(end_time);
  Serial.print(" Time:");
  Serial.println(time);
  delay(3000);
}



```
AWSのElastic IPアドレスの解放を忘れない！

# AWS Elastic IPアドレスの費用削減方法

AWSのElastic IPアドレスは、インターネット上で固定されたIPアドレスを使用する必要がある場合に便利ですが、管理が不適切だと不要な費用が発生することがあります。以下のポイントを確認して、コストを最小限に抑えましょう。

## 背景

試しに作成したVPCで「NATゲートウェイを削除」したため費用は発生しないだろうと思っていましたが、「Elastic IPアドレスの解放」を行わないと費用が発生することを知りました。初心者にとっては忘れがちな点かもしれませんので、メモ書きを残しておきます。

## 1. Elastic IPアドレス（EIP）の理解

- **Elastic IPアドレス**は、AWSが提供するPublic IPアドレスで、特定のインスタンスに固定的に関連付けることができます。
- 必要なときに関連付け、不要になったら解放することで費用を抑えることができます。

## 2. コスト発生の要因

- **関連付けのない状態での保持**：Elastic IPがどのリソースにも関連付けられていない場合、その状態で保持しておくと課金されます。
- **複数のEIPの保持**：1つのElastic IPアドレスは無料で使用できるケースがありますが、複数のアドレスを持つと費用が発生します。

## 3. 費用削減の対策

- **使用していないEIPを解放する**：Elastic IPがどのリソースにも関連付けられていない場合、AWSマネジメントコンソールまたはAWS CLIを使用して解放します。
- **リソースの定期的な見直し**：使用中のEIPが本当に必要かを定期的に見直し、必要ないものは削除します。

![Elastic IP解放画面の例](https://storage.googleapis.com/zenn-user-upload/ac1da23a39ec-20241202.png)

図：AWSマネジメントコンソールでのElastic IP解放操作の例

:::note info
Natゲートウェイを削除して、`Deleted`になってから3分後くらいに解放を押せるようになりました。少しタイムラグがありますね。
:::

AWS環境での無駄な費用を抑え、リソースを効率的に活用するために、これらを忘れないようにしましょう！

## 参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing-eips-releasing.html
ギャル「オタクくんのQiitaって白くてつまんないよね」

# てかさ～聞いて～！

ごめんなさい、↓の記事の~~パクリ~~オマージュです。 `m(_ _)m`
未見の方はぜひオリジナルもご覧ください！

https://qiita.com/moririn086/items/591c9de70368dc4c5333

それで、この記事が面白かったのと、ちょうど自分が書いてた

https://qiita.com/www-tacos/items/f8f0bffe3ac0cb816d11

という記事が応用できそうだったので、合わせ技で<font color="hotpink">**Qiitaをかわいくしてあげました！**</font>

# こんな感じでかわいいんだよ！🌟

Qiitaをかわいくしてやりました。アイデンティティの <font color="#55c500">**Qiita Gleen**</font> も <font color="tomato">**Qiita Tomato**</font> にしてやりました。

![図.Qiitaの色変更の比較](https://www-tacos.github.io/qiita-images/20241202_gal_qiita_pink/001.png)

# このテーマのこだわりポイント🎀

本家をリスペククトしてミスティローズやトマトなどの同じ色を使わせてもらってます。

個人的に気に入っているのは文字選択の色も変えたところですかね。青じゃないのは新鮮。

# 簡単に使える方法教えるね！

スタイルシートの反映方法については[こっちの記事](https://qiita.com/www-tacos/items/f8f0bffe3ac0cb816d11)で解説しているのでCSSだけ貼っておきます。
セレクタの指定が甘いのはご愛嬌ということで...

```css
/* 全体の背景 */
div.allWrapper,
main {
  background-color: pink !important;
}

/* 文字選択 */
::selection {
  background-color: lightpink !important;
}

/* Qiitaアイコン */
a[aria-label="Qiita"] {
  background-color: tomato !important;
}

/* 投稿するボタン */
header>div>div>div:last-child>button {
  background-color: tomato !important;
}

/* いいねボタンのハートの色 */
div>svg[height="32"] {
  fill: tomato !important;
}

/* いいねボタンのボーダーの色 */
div:has(svg[height="32"]) {
  border-color: tomato !important;
}

/* 記事・広告・コメントとかのエリアの背景 */
article,
section,
aside,
aside+section>div {
  background-color: mistyrose !important;
}

/* sectionのなかでも左側のボタンエリアと目次は除外 */
main>section,
section:has(nav) {
  background-color: initial !important;
}

/* 目次のホバー・フォーカスの色 */
section>nav a:hover,
section>nav a.focus {
  background-color: lightpink !important;
}
```

リスペクトをこめて、元記事だけピンクになるようにしてます。

```json
{
  "name": "js-css-apply",
  "version": "1.0",
  "manifest_version": 3,
  "description": "JS CSS Apply",
  "content_scripts": [
    {
      "matches": [
        "https://qiita.com/moririn086/items/591c9de70368dc4c5333"
      ],
      "css": [
        "css/qiita-pink.css"
      ]
    }
  ]
}
```
【AWS re:Invent2024】エクスカリバー↔︎マンダレイベイ間トラムに乗ってみた

# はじめに

日本とは比較にならない程の規模で開催されているre:Inventでは会場間の移動が大変なので、うまくシャトルバスを活用したいところですね。

今年宿泊しているルクソールはMGMとマンダレイベイの間にありどちらからも少し距離があります🚶

MGMでセッションを受けている途中で、忘れ物をしていることに気づきホテルへ戻ることにしました。

そこで、ルクソールに直接辿り着ける方法がないか調べるとエクスカリバーからトラムという電車が出てることを知りました👀しかも無料です！

これは試してみる価値あるなと思い、早速エクスカリバー🏰に向かいました！

# トラム情報

ホテル間のトラムは無人運転です🚆
無料で乗車でき、3-7分間隔くらいで来るようです。歩くより断然早いので待てます笑

ルクソールには7時から夜の12時まで利用できると張り紙がありました。

![IMG_3875.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/ba655e35-afa2-d37a-4322-122283bed78b.jpeg)

営業時間は変動する可能性がありますので都度確認することをお勧めします。


# 乗り場はわかりやすく、すぐ来るので快適

乗り場はエクスカリバーの乗り場にはこのような案内がありました、わかりやすいです。

![IMG_3865.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/81aad37a-1a9e-3f47-28a7-33e0c261aae2.jpeg)

ルクソールに到着したので、トラムを降りるとなんとスフィンクスのが目の前に！

この大きいスフィンクスはトラムの目印だったのかと初めて知りました笑

![IMG_3871.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/b980d56e-0841-7531-cb5c-3f406c106866.jpeg)

ピラミッドまでも近くこれは便利だなと思いましたので、ルクソールに泊まられてる方でまだ利用したことがない方はぜひ一度体験することをお勧めします！:v:

# さいごに

ルクソールからマンダレイベイまでもトラムで移動してみましたが会場まで比較的近くこちらも快適に感じました！

降車してすぐの大きな窓からはルクソールが綺麗に見えて少し疲れが和らぎました:flushed:


![IMG_3877.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/9a9f102a-018c-e75a-75a9-61a656a4f3dc.jpeg)
【競技プログラミング】AtCoder Beginner Contest 061_C問題

# 問題
https://atcoder.jp/contests/abc061/tasks/abc061_c

## 要約
1. 空の配列が1つある。
2. この配列に対して、N回の挿入操作を行う。
3. i回目の操作（1 ≦ i ≦ N）では、整数aiをbi個配列に挿入する。
4. N回の挿入操作が終わった後、配列の中でK番目に小さい数を求める。

変数情報：
- N: 挿入操作の回数
- ai: i回目の操作で挿入する整数
- bi: i回目の操作でaiを挿入する個数
- K: 求めるべき小さい順の位置

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)


# アプローチ
挿入操作を実際に行わず、各整数とその出現回数を記録し、ソートを利用してK番目に小さい数見つける。

# 解法手順

1. 入力からN（操作回数）とK（求める順位）を読み取る。
2. N回の挿入操作を読み取り、各操作で[ai, bi]のペアを配列に格納する。
3. 格納した配列をaiの値でソートする。これにより、小さい数から順に処理できるようになる。
4. ソートされた配列を先頭から順に走査し、以下の処理を行う：
   - 現在の要素のbi（出現回数）をKから引く。
   - Kが0以下になった場合、その要素のai（整数値）がK番目に小さい数となる。
5. K番目に小さい数が見つかったら、その値を出力して終了する。


# ACコード
```python:ac.py

# 1. 入力からN（操作回数）とK（求める順位）を読み取る
a = input().split()  # 入力を空白で分割
a = list(map(int, a))  # 文字列のリストを整数のリストに変換

# 2. N回の挿入操作を読み取り、各操作で[ai, bi]のペアを配列に格納する
l = []  # 挿入操作を格納するリストを初期化
k = a[1]  # K（求める順位）を取得
for c in range(a[0]):  # N回のループ
    b = input().split()  # 各挿入操作を読み取り
    b = list(map(int, b))  # 文字列のリストを整数のリストに変換
    l.append(b)  # [ai, bi]のペアをリストに追加

# 3. 格納した配列をaiの値でソートする
l.sort()  # リストをaiの値でソート

# 4. ソートされた配列を先頭から順に走査し、処理を行う
st = True  # ループ継続フラグ
c = 0  # インデックスカウンタ
while st == True:
    k -= l[c][1]  # 現在の要素のbi（出現回数）をKから引く
    if k <= 0:  # Kが0以下になった場合
        st = False  # ループを終了
        print(l[c][0])  # 5. K番目に小さい数（ai）を出力
    c += 1  # 次の要素へ


```


# 机上トレース

n = 7
k = 13
ab = [[4, 3], [1, 3], [8, 5], [9, 1], [11, 4], [11, 2], [11, 3]]

## N回の挿入操作を読み取り、各操作で[ai, bi]のペアを配列に格納する。
[[4, 3], [1, 3], [8, 5], [9, 1], [11, 4], [11, 2], [11, 3]]

## 格納した配列をaiの値でソートする。これにより、小さい数から順に処理できるようになる。
[[1, 3], [4, 3], [8, 5], [9, 1], [11, 2], [11, 3], [11, 4]]

## ソートされた配列を先頭から順に走査し、以下の処理を行う：
### 現在の要素のbi（出現回数）をKから引く。
k = 13-3 = 10 # [1, 3]
k = 10-3 = 7  # [4, 3]
k = 7-5 = 2   # [8, 5]
k = 2-1 = 1   # [9, 1]
k = 1-2 = -1  # [11, 2]

### Kが0以下になった場合、その要素のai（整数値）がK番目に小さい数となる。
ans = 11
Sass変数とCSS変数の特性と活用法

# はじめに
Sass変数とCSS変数。それぞれに特性があり、少し複雑に感じる方もいるかもしれません。この記事では、それぞれの特性を比較し、効率よく使い分ける方法を紹介します。

# Sass変数とCSS変数の違い
変数の違いについて、下の表を見て簡単に理解しましょう。


| 項目 | Sass変数 | CSS変数 |
|:-:|:-:|:-:|
| 定義場所 | Sassファイル内 | CSSファイル内 |
| 値の更新  | できない | できる |
| 継承 | なし | あり |

それぞれの変数には大きな特徴が二つあります。

:::note info
【特徴１．値の更新】
・Sass変数はコンパイル時に全ての値が決定され、動的な変更ができない。
※再定義は可能

・CSS変数はDOM操作や継承で後から変更することができる。
:::

:::note info
【特徴２．継承】
・Sass変数は静的であり、CSSの継承機能を使えない。

・CSS変数はDOM操作や継承で後から変更することができる。
:::

# Sass変数とCSS変数を使うメリット
#### 【Sass変数】
コンパイル時に決定された値を使うため、静的な値を使う場面でメリットを発揮します。特にテーマカラーなど、値が更新されることなく一貫性を保つ必要があるケースに適しています。

#### 【CSS変数】
CSS変数は、実行時に動的に値を切り替えたい場面で活躍します。例えば、JavaScriptを使ってテーマカラーやフォントサイズを変更するケースに適しています。また、CSSの継承機能を活用して、効率的にスタイルを記述することができます。

# Sass変数とCSS変数の活用例
<p class="codepen" data-height="300" data-default-tab="html" data-slug-hash="ZEggjQZ" data-pen-title="Sass変数とCSS変数の活用例(テーマ色変更)" data-user="iwdulmiq-the-builder" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/iwdulmiq-the-builder/pen/ZEggjQZ">
  Sass変数とCSS変数の活用例(テーマ色変更)</a> by 丸山悠希 (<a href="https://codepen.io/iwdulmiq-the-builder">@iwdulmiq-the-builder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
※ "Result"ボタンを押すとプレビューが表示されます。

上記コードは、それぞれの変数の特徴を活かして、Webサイトのテーマカラーを切り替える例になります。
・**Sass変数**は、デフォルトのテーマカラー(背景色や文字色)を設定するために使用しています。これにより、テーマカラーを一元管理でき、後々の変更やメンテナンスが容易になります。
・**CSS変数**は、JavaScriptを使って実行時にテーマカラーを柔軟に切り替えるために使用しています。これにより、ユーザーの操作に応じて、カラーを変更することができます。

# まとめ
今回は、Sass変数とCSS変数の特徴と使い分けについて紹介しました。最初は少し複雑に感じるかもしれませんが、使いこなせるようになると、コードの効率化が図れます。
ぜひ、皆さんも積極的に活用してみてください。


# 参考サイト

https://qiita.com/yukimaruyama/items/204e7cbb17f080ee166e#31%E5%A4%89%E6%95%B0

https://qiita.com/sabakan_umai/items/ac03a68d4a05f65ad385
プロトコルとは

## プロトコルとは
プロトコル（Protocol）とは、**通信を行う際の「約束事」や「ルール」のことを指します。** ネットワーク上で異なるデバイスやアプリケーションがデータをやり取りするためには、共通の規則に従う必要があります。この規則のセットがプロトコルです。

## プロトコルの概要
### プロトコルの役割
プロトコルは、以下のような役割を果たします。

1. 通信の標準化
異なるベンダーやデバイス間での互換性を確保。
2. データのフォーマット化
データの構造や形式を統一
3. エラー検出・修正
データ転送中のエラーを検知し、適切に修正
4. セッション管理
通信の開始、維持、終了を管理

宅急便を送る時は段ボールで、郵便は封筒で送りましょう
送る時は宛先と送り元を書きましょう…みたいなルールのイメージ

### OSI参照モデルとプロトコル
通信プロトコルは、OSI参照モデル（7階層モデル）に基づいて設計されることが多いです。各層で異なる役割を持つプロトコルが存在します。

|層|役割|例
|:-----------|:------------|:------------|
|アプリケーション層|ユーザーと直接やり取り|HTTP, FTP, SMTP|
|プレゼンテーション層|データ形式の変換|SSL/TLS|
|セッション層|通信の確立・維持・終了|NetBIOS, RPC|
|トランスポート層|データの信頼性を保証|TCP, UDP|
|ネットワーク層|データのルーティング|IP, ICMP|
|データリンク層|隣接ノード間のデータ転送|Ethernet, Wi-Fi|
|物理層|ハードウェアレベルの通信|USB, 光ファイバ|

## バックエンドエンジニアが押さえておくべきプロトコル
バックエンドエンジニアとして、以下のプロトコルは必須の知識かと思いますので押さえておきましょう

### HTTP/HTTPS
- 概要：Webアプリケーションの通信に使用されるプロトコル。
- HTTP：データを**暗号化せず**送信
- HTTPS：SSL/TLSを使用して**暗号化通信**を実現
- 関連技術：RESTful API、GraphQL

### TCP/IP
- 概要：インターネットの基盤となるプロトコルスイート
- TCP（信頼性の高い通信）
    - パケットの順序保証
    - 再送機能によるデータの完全性
- IP（ネットワーク層の通信）
    - データを適切な宛先にルーティング

### UDP
- 概要：軽量で高速な通信プロトコル
- 特徴
    - 順序保証や再送機能がない代わりに高速
    - 音声通話やストリーミングで使用

### DNS
- 概要：ドメイン名をIPアドレスに変換するプロトコル
- 重要性：アプリケーションが正しいサーバーに接続するためには必須

### SMTP/IMAP/POP3
- 概要：メール通信に使用されるプロトコル
- SMTP：メール送信
- IMAP/POP3：メール受信

### WebSocket
- 概要：双方向のリアルタイム通信を実現するプロトコル
- 利用例：チャットアプリ、リアルタイム更新（株価、ゲーム）

### SSL/TLS
- 概要：通信の暗号化とセキュリティを提供するプロトコル
- 重要性
    - HTTPSの基盤
    - クレジットカード情報やパスワードの安全な送信に不可欠

### gRPC
- 概要：Googleが開発したRPC（リモートプロシージャコール）プロトコル
- 特徴：高速で効率的。Protocol Buffersを使用した軽量なデータ形式

## プロトコルを理解すると何がいいのか
- 適切なプロトコルを選択することで、効率的で安全なシステムが構築可能
- トラブルシューティングの際に原因の切り分けで利用できる
- ネットワーク通信の問題を正確に特定し、解決できるようになる
- プロトコルの仕組みを理解することで、脆弱性を防ぐ設計が可能

## プロトコルを何で学ぶのがいいのか
まずは名著：『マスタリングTCP/IP 入門編』を読むことをオススメします！
個人的な感想ですが、初心者でもかなり分かりやすいかと思います！

## 余談
よくIPAの資格（基本情報、応用情報など）を取っても仕事に使わないのでは？と耳にします。
私も同じ質問を新卒時代に上司に投げかけたことがあって、上司は「IPAの試験範囲の知識はエンジニア同士が会話する上での最低限のプロトコルみたいなもんだよ」と言われてハッとしたのを覚えています。
他社のエンジニアと話す際にそれぞれの会社での専門用語の応酬みたいな感じになると会話にならないですもんね…


##  まとめ
昔MicroSoft社の方に「パケットは義務教育にした方がいい」と言われたのを思い出しました。
ネットワークを学ぶ方はWiresharkなどのツールで色んなパケットを解析してみるといいかもしれません。
誰かを輝かせる力✨プログラミングが教えてくれた素敵な仕事

こんにちは、aliceです。

この記事は女性エンジニア応援！エンジニアとしてやりがいを感じた経験談をシェアしよう！ by パナソニック コネクト Advent Calendar 2024　3日目の記事です。
https://qiita.com/advent-calendar/2024/panasonic_connect


本業はエンジニアではありませんが、日々の業務の中でプログラミングを活用することで「効率化」を実現し、職場に少しでも良い影響を与えられたらいいなと考えながら、コツコツとツールを作っています。
今日はそんな経験の一つを書いてみたいと思います。

### 毎日の売上集計を自動化してみた
私の職場では、毎日売上データを集計しています。手作業でExcelにデータを貼り付け、集計したものを別のExcelに貼り付けます。Excelが得意な人ならそんなに難しい作業ではないのですが、苦手意識がある方だとなかなか時間がかかります。
また、貼り付け用のExcelにはリンクが張られていて、データが少し変わるたびにそのリンクを修正する必要がありました。貼り付け作業が大変という言葉を聞いたり、そのリンクを調整したりするたびに、「この時間をもっと他のことに使えたらいいのに」と感じていました。

そこでPythonやExcelVBAを使って売上集計を自動化するプログラムを作りました。
FTPを使ってデータを取得しCSVに出力、別のExcelに貼り付ける作業はExcelVBAで行いました。その結果、1日の作業時間が5分で終わるようになり、空いた時間を別の業務や他の人とコミュニケーションをとることに使えるようになりました。


### みんなの反応が嬉しかった
このプログラムを公開したとき、一番嬉しかったのは同僚の反応でした。ある同僚が、「これで余裕ができたから、ずっとやりたかったことができる！」とキラキラした目で話してくれたんです。その姿を見て、プログラミングってただ効率を上げるだけじゃなくて、人のやりたいことを後押しする力があるんだと実感しました。

他の同僚からも「時間に余裕ができたので休暇を取得できる」や「やらないと思って4年経過した仕事に手をつけられる」といった声をもらいました。ちょっとしたプログラムでも、職場全体の雰囲気や働き方に良い影響を与えられるんですね。
仕事にゆとりができて、楽しそうにコミュニケーションをとりながら仕事をしていたり、それぞれの個性をどんどん発揮している同僚をみていると、とても幸せな気持ちになります。


### もっとたくさんの人が輝いたら嬉しいな
プログラミングってとても大きな可能性があるんですね。ただ業務を効率化するだけでなく、みんなが「やりたいこと」に集中できる環境を作る手助けができるんだと思います。
これからも、プログラミングを活用して職場のみんなが自分の個性を発揮できる環境を作っていきたいと思っています。みんながどんどん輝いてくれたら嬉しいなぁ。


### エンジニアって素敵な職業
そしてエンジニアってもっと多くの人を輝かせられるお仕事だなと思います。プログラミングのスキルを深めれば、今よりももっと大きな課題を解決できるし、より多くの人の可能性を広げるサポートができますよね。
こんな素敵なエンジニアとしてお仕事をしているみなさん、ありがとうございます！！
そしてこれからも応援しています！
Linked Pastsのシンポジウムが開催されるそうです。

購読しているヒストリーテックのメルマガから、国際シンポジウムの開催案内が届きました。

参加申し込みの締め切りが延長されたとのことですので、アドベントカレンダーで紹介したいと思います。
平日で複数日なので私は参加難しそうですが、オンライン部分もあるようなので、そちらは極力参加してみようかと思い現在調整中です。
以下、メルマガからイベント紹介部分引用:

==== 引用 ====

直前になりましたが、国際シンポジウムの開催案内です。

12月9日～12日にLinked Pastsのシンポジウムを開催いたします。

[Joint Symposium of Linked Pasts 10 and Linked Pasts Japan](http://codh.rois.ac.jp/conference/linked-pasts-10/)

事前登録締切を12/6に延長しましたので、参加をお考えの方は、至急申し込みをお願いします。

会場は国立情報学研究所／一橋講堂です。基本的にオンサイトのイベントですが、一部ハイブリッドのセッションもあります。ハイブリッドの方もお申込みをお願いいたします。

詳しい内容はウェブサイトをご覧ください。Linked Pastsに興味があるという方向けの、コミュニティ紹介も12/10に企画しております。

==== 引用 ====

Linked Pastsは知らなかったのですが、こちらの[コミュニティ](https://linkedpasts.hcommons.org/)のようです。
参加できる方は、ぜひ参加してみてください。
入力: 傾き

### 背景
メイン基板には傾きを検出するセンサが搭載されているようです。
（正確には加速度のベクトルから傾きを計算しているのかもしれません。）

傾きを検出するセンサを入力として扱うプログラミングを行いました。

### Scratch
傾きを検出するセンサは取得した値を変数として扱いになっているので、値を取得する命令をするブロックがあるわけではないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/737154fe-6c6d-3448-17eb-74de3f82fd70.png)

「起動後にFrontLEDが白く点灯する。
　そのとき後ろ方向に傾いていたらBackLEDが赤色に点灯し、前方向に傾いていたらBackLEDが水色に点灯する。」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/7d25653a-3c5b-3891-854a-e550cf442c71.png)

最初にスタビライゼーションオフを入れないと持ち上げたときにspheroが暴れました。
特に向き（yaw）が起動時から変化すると嫌がるようです。
プログラムの終了後にスタビライゼーションは自動的にオンになるようなので、
spheroの向きが変わらないように置いてあげましょう。

傾けた方向と光り方を対応させると、ピッチのオリエンテーションの正負は右ねじの方向になっていました。
例えば、spheroを左向きにおいたとき、右に傾けると正、左に傾けると負でした。

### spheroV2
testにあったBoltTest.pyのコメントアウトを参考に同様な動作をするスクリプトを作成しました。

```
import time

from spherov2 import scanner
from spherov2.sphero_edu import EventType, SpheroEduAPI
from spherov2.types import Color

print("Testing Starting...")
print("Connecting to Bolt...")
toy = scanner.find_BOLT()

if toy is not None:
    print("Connected.")
    with SpheroEduAPI(toy) as droid:
        print("Testing Start...")
        
        droid.reset_aim()

        droid.set_stabilization(False)
        droid.set_front_led(Color(r=255, g=255, b=255)) 

        time.sleep(1)

        orient = droid.get_orientation()
        pitch = orient['pitch']  # 辞書から値を取得
        print(f"pitch: {pitch:.1f}")

        if pitch > 0:
            droid.set_back_led(Color(r=255, g=0, b=0))
        else : 
            droid.set_back_led(Color(r=0, g=255, b=255))
        
        time.sleep(1)

        print("Testing End...")
```

実行結果はこちらのようになりました。

後ろ方向に傾けた（BackLEDが赤色に点灯）
```
git\spherov2.py\spherov2\test>python BoltTest_orientationSensor.py
Testing Starting...
Connecting to Bolt...
Connected.
Testing Start...
pitch: 31.1
Testing End...
```

前方向に傾けた（BackLEDが水色に点灯）
```
git\spherov2.py\spherov2\test>python BoltTest_orientationSensor.py
Testing Starting...
Connecting to Bolt...
Connected.
Testing Start...
pitch: -19.4
Testing End...
```

### まとめ
ジャイロセンサを入力に使ったプログラミングを実験しました。
spheroV2は傾きの値自体を表示する機能があるので、遊ぶ幅が広がりそうです。
ACDLを提唱します。その26

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
論理式は書かないで、全組み合わせを記述して、verilogを生成します。
高位合成です。テストベンチも生成します。
組み合わせ回路は、これで、全て対応できます。
サンプルは、3 の倍数検出器です。

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/208385d8-2474-498c-0ae6-7397702bb4b8.png)



# 成果物

https://embed.plnkr.co/plunk/dXHfvYyzxXR8Nx5U

以上。
ACDLを提唱します。その25

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
サンプルは、全加算器です。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5de14419-45e4-a11a-5ba3-8a63e064fe95.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d50ea07a-f800-544e-4481-1ff8b58d0118.png)


# 成果物

https://embed.plnkr.co/plunk/pSU5YIiA3nYeSDoJ

以上。
何をしても文句を言うユーザーに開発がどう向き合うか、開発論 というものを語り継ぐ勉強会をした話

今年を振り返る「なんかかく」アドベントカレンダー 3 日目です。まあまあ時系列で春のことです。2024 年、裏の仕事 (?) として引き受けたことの一つにこれがあります。

## 開発論 というやつ

[「パッケージ開発論」を題材に勉強会をした #設計 - Qiita](https://qiita.com/e99h2121/items/96617b041637e2bd7828)
関連: [製品哲学をDesign Systemsに記そう #ポエム - Qiita](https://qiita.com/e99h2121/items/a4fb8f4b2fa6bb20e3a7)

パッケージ開発論。開発論などというと大層な、宗教のような、怪しいにおいがしますが、書いてあることはロバと老夫婦の話に通じるもの。こういうやつです。

https://pictr.com/image/BjTOfZ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/117799b3-54ec-9767-7448-506920a1e1a3.png)

ロバを連れて老夫婦が歩いていたら、ロバの使い方を知らないやつだなーと笑われた。
ロバに乗っていたら、2 人でロバに乗るなんてひどいなーと言われた。
嫁さんがロバに乗っていたら、尻に敷かれてる旦那だな―と言われ、旦那さんがロバに乗ったらひどい旦那だなと (以下略)

つまり 何をしても文句を言う人 はどこにでもいるもんだという話が前提にあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3f72bfb0-778c-e614-509c-c72c2c7c9f30.png)


## 何をしても文句を言うユーザー 問題

### ごめんなさい を言いすぎると ごめんなさい が軽くなる

そういえば最近 (混んでいる日に) ディズニーランドに行ったんですが、ディズニー内のアナウンスって、混んでいることに対して「ごめんなさい」って言わないなー、とおもいました。

ごめんなさいではなくてどう言うかというと、ただ「〇〇は終了しました」とか事実を説明する。あとこういうことがこれからありますとか、できるだけ明るめのトーンの別の話をしていました。

これはディズニーがディズニーだからという部分もあると斜に構えつつですが、人間「ごめんなさい」ばかり聞いてると気持ちが萎えますね。人の気持ちを楽しませる、安心させる、ポジティブな方向に向きなおさせる工夫として必要以上に謝らない、というのは一つの鉄則で、そうでなくても、謝る気が無いならウソは付くべきではない。そういう向き合い方が開発論にはあった気がします。


```:例
会話 A:

「〇〇ってできますか？」
「ごめんなさい、できないんですよー」

「あ、そうなんですね、〇〇ってできますか？」
「ああ、ごめんなさい、できません」

「ああ、そうなんだ、じゃあ、こういう場合何ができますか？」
「〇〇です」

会話 B:

「〇〇ってできますか？」
「ごめんなさい、そうはできないんですが、こういう場合〇〇をお勧めしているんですがどうですか？」
```

会話 B のようなことを説明できる開発者でいたいわけです。

### Enter で送信したい人もいるし Ctrl + Enter で送信したい人もいる

こういう例もあります。

Teams の記事: [Teamsのチャットは改行できない!?Enterキーで誤送信しない操作方法｜@DIME アットダイム](https://dime.jp/genre/1729370/)
Skype のコミュニティ: [Enterを誤打して誤送信してしまうのを防ぐ方法 - Microsoft コミュニティ](https://answers.microsoft.com/ja-jp/skype/forum/all/enter%E3%82%92%E8%AA%A4%E6%89%93%E3%81%97%E3%81%A6/3f35240f-88c2-4f25-9872-3c51eb549297)
Slack の記事: [Slackで改行する時は誤送信に注意! Enterキーの設定方法を解説 | マイナビニュース](https://news.mynavi.jp/article/20220225-2251912/)

Enter で送信するか Ctrl + Enter で送信するか、初期値がアプリケーションにより異なる。どちらかが絶対的正義ならどちらかには文句は出ないはずですが、結局どちらにも文句は出る。結果設定できるようにするしかない。結局そうなら、100 回謝るより先に一言「こうすることならできますよ」と教えたいのです。


### Windows と Mac はマウススクロール方向が真逆

[Macのマウススクロール方向を逆にしたけど、すぐ元に戻した話 – Office01](https://www.bossraku.com/blog/365/)

私 Mac 全然慣れてなくてマウスが壊れたのかと驚いたんですが、これも、慣れるか慣れないか。怒る人はどんな仕様にも起こるし、戸惑う人はどんな仕様にも戸惑う。



##  何をしても文句を言うユーザー問題、つまり 開発者が決めるしかない という話

<script defer class="speakerdeck-embed" data-id="730be01bd6a04cee83fbbc878ec9cc9d" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

そういう学びをシェアする勉強会をスキマ時間でやったなあという話でした。これは SIer とか、オーダーメイドの開発作業をするときには全く響かない内容でもあるのですが、自社製品とか、自分で企画開発して物を作る仕事に関しては常に意識させられることかもしれません。

もちろん、言い方の問題は後からついてくるけどな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ba535784-495f-292e-3290-c768e508a059.png)



明日につづくー (AI はきのこの山とたけのこの里は知らないようだった)。
SQLパズル　36 １人２役 の 解法１の学習メモ

# 概要
SQLパズル　36 １人２役 の 解法１の学習メモです。

UNIONとHaving句使ってますね。


# 要件
・重役と役職持ちを取得したい。
・role='O'と'D'が１つの場合、'O','D'のいずれかを表示
・role='O'と'D'を２つ持っている場合、'B'とする。(BothのB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/5731c398-9cce-e36b-ba4e-cc809a2dce32.png)

# SQL

## DDL
```sql
DROP TABLE IF EXISTS Roles;
CREATE TABLE Roles(
 person VARCHAR(32), 
 role   VARCHAR(32), 
    PRIMARY KEY (person, role));

INSERT INTO Roles VALUES('Smith', 'O');
INSERT INTO Roles VALUES('Smith', 'D');
INSERT INTO Roles VALUES('Jones', 'O');
INSERT INTO Roles VALUES('White', 'D');
INSERT INTO Roles VALUES('Brown', 'X');

```

## 答えのSQL

```sql
-- 36 １人２役　その１
-- UNION
SELECT R1.person,MIN(R1.role)
FROM Roles AS R1
WHERE R1.role IN ('D','O')
GROUP BY R1.person
HAVING COUNT(DISTINCT R1.role) = 1
UNION
	SELECT R2.person,'B'
		FROM Roles AS R2
	WHERE R2.role IN('D','O')
	GROUP BY R2.person
	HAVING  COUNT(DISTINCT R2.role) = 2
;

-- Having句を外して、部分集合を確認する
-- この時点でrole='D' or 'O'を弾く
SELECT R1.person,MIN(R1.role) as first_role,MAX(R1.role) as second_role,COUNT(DISTINCT R1.role)
FROM Roles AS R1
WHERE R1.role IN ('D','O')
GROUP BY R1.person
;


-- UNION前のSQLを確認
-- roleを１つ持っている　Jones Whiteを取得する
-- distinct要らない？？？
SELECT R1.person,MIN(R1.role),COUNT(DISTINCT R1.role)
FROM Roles AS R1
WHERE R1.role IN ('D','O')
GROUP BY R1.person
HAVING COUNT(DISTINCT R1.role) = 1
;


-- UNION後のSQLを確認
-- roleを２つ持っているsmithを取得する
SELECT R2.person,'B',COUNT(R2.role)
	FROM Roles AS R2
WHERE R2.role IN('D','O')
GROUP BY R2.person
HAVING  COUNT(R2.role) = 2
;


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ac8a177e-97aa-32da-697f-7fb484de0d38.png)

# 参考

SQLパズル　p152

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p36

達人に学ぶSQL徹底指南書第２版

github 差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/335008f9af1ac90d8fb3366ce100c46c280555c3
2024/12/3主にITとかセキュリティの記事

LINE アルバム機能の不具合で他人のアルバムが閲覧可能に(12/1)
https://rocket-boys.co.jp/10980/

社内での情報持ち出しを防ぐには？増加する内部不正と暗号化の重要性
https://cybersecurity-park.com/3674/

個人情報保護委員会 中小規模事業者（従業員数100名以下）における個人情報等の安全管理措置に関する実態調査 (2024.11.29)(12/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-9801e4.html

県外部委託ＨＰ サイバー攻撃で４６００人余分個人情報流出か 熊本県(12/1)
https://www3.nhk.or.jp/lnews/kumamoto/20241201/5000023951.html

【サイバー攻撃】最大で4600件以上の個人情報が漏えいした可能性 くまもとグリーン農業(12/1)
https://news.ntv.co.jp/category/society/kk1ec4589344f64da99fe4e2c1405af7f5
https://news.ntv.co.jp/n/kkt/category/society/kk1ec4589344f64da99fe4e2c1405af7f5

【サイバー攻撃】最大で4600件以上の個人情報が漏えいした可能性(12/1)
https://news.yahoo.co.jp/articles/bc5834a8e57dda0a314bfe850d808a282a89c8c2?source=rss

くまもとグリーン農業ホームページ　サイバー攻撃受け個人情報漏えいか【熊本】(12/1)
https://nordot.app/1235794016853491966?c=1165586575134900434

米国とカナダのスターバックス1万1000店舗がランサムウェア攻撃に見舞われた。イギリスのスーパーマーケットも(11/30)
https://credo.asia/%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC/%E7%B1%B3%E5%9B%BD%E3%81%A8%E3%82%AB%E3%83%8A%E3%83%80%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B91%E4%B8%871000%E5%BA%97%E8%88%97%E3%81%8C%E3%83%A9%E3%83%B3%E3%82%B5/9036/

ギョーソル？ゲーソル？あなたはどうする？(12/1)
https://dev.classmethod.jp/articles/gamesol-businesssol-jouhokyoku-1/

「新たな核兵器になり得る」北朝鮮ハッカー部隊の実体…上位0.001％の“科学英才”を集中教育(12/1)
https://news.livedoor.com/article/detail/27672472/

LINE認証番号が届かない？入力方法からトラブル解決のポイントを解説(12/1)
https://dime.jp/genre/1885725/

トルコで開催された世界ロボットオリンピックでサウジアラビアチームがアラブ首位に輝く(12/1)
https://www.arabnews.jp/article/saudi-arabia/article_135173/

2025年の戦略的テクノロジのトップ・トレンド(12/1)
https://www.gartner.co.jp/ja/articles/top-technology-trends-2025

2024年最新のAIトレンド5選！特徴や具体的な活用場面を解説(12/1)
https://alt.ai/aiprojects/blog/development/gpt_blog-3565/

金融DXはなぜ必要？金融業界の現状と課題、取り組むべき施策や企業事例を解説(12/1)
https://alt.ai/aiprojects/blog/industry/gpt_blog-3574/

Cloud Storage の新機能 Bucket IP filtering で VPC と CIDR のアクセス制御を試してみた(12/1)
https://dev.classmethod.jp/articles/gcp-cloud-storage-bucket-ip-filtering-vpc-cidr/

備忘録 論文 法人としてのAI：過去、パターン、展望(12/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-f70402.html

欧州委員会 公共機関のAI導入に関する２つの報告書「どのような要因が公的管理者によるAI導入の認知に影響を与えるか？」「公共部門におけるAIのためのコンピテンシーとガバナンス慣行」 (2024.11.25)(12/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-6f37c3.html

内閣官房 サイバー安全保障分野での対応能力の向上に向けた提言 (2024.11.29)(12/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/12/index.html

プーチンの衝撃的な侵略：英国に対するロシアの戦争を明らかにする恐ろしい事件(11/30)
https://motorcyclesports.net/ja/putins-shocking-aggression-terrifying-incidents-revealing-russias-war-on-the-uk-ja/

『温湿度計が不正アクセスの被害に？』植物が物理的に『情報改ざん』する様子が凄すぎると304万表示「意思をもっている…」「奇跡」
https://mofutan.net/102658#goog_rewarded
【AWS re:Invent 2024】認定者ラウンジ 突入編

# はじめに
AWS re:Inventが現地時間2024/12/2(月)より始まりました！
AWS re:InventにはAWS認定者のみが入れる認定者ラウンジがあります。
昨日、弊社メンバーによる準備編の記事がアップされました。
https://qiita.com/masaki_seyama_POHD_CCoE/items/12b26bd573e8f23e6cd0
本記事では認定者ラウンジ 突入編をレポートします。

# 対象読者
- AWS re:Invent 2024参加者
- AWS re:Invent 2025以降参加予定で認定者ラウンジの情報を知りたい方
- AWS認定取得のモチベーションを上げたい方

# 場所はどこ？
ホテル:ヴェネチアン
AWSの黒板がある横ぐらいにあります
係の方が「Certification Lounge」のプラカードを持ってるので、そのまままっすぐ進んだ先にあります。
![IMG20241202111635.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/70155f0e-4b9e-c3d0-685a-5e7754d3ddbf.jpeg)


# 落ち着いて席に座れます
AWS re:Inventでは歩き回ることが多いため、意外と落ち着いて席に座ってPC作業などする場所が限られます。
AWS認定を取っておくと、AWS re:Invent中に自由に席に座れる認定者ラウンジを活用できます！
![IMG20241202091901.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/c5b048db-d7a2-6dda-f756-eaaf71e2f9c9.jpeg)

7割程度、席が埋まっていました。他の人との相席を気にしなければ、おそらく座れない事態にはならないかなと思います。

# Serverless Presso
「Serverless Presso」というコーナーがあり、コーヒーを注文できます。
注文はQRコードをスマホで読み込んでWebブラウザベースで完結します。英語で話しかける必要ないので、英語に自信がない人にも安心です！
ちなみに無料です。ホテル内だと飲み物はなんでも料金高いので、これだけでもAWS認定を取っておく価値があるのではないでしょうか。

QRコード(ぼかしてある部分にQRコードが存在します)
![1000001427.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/f808023b-d406-7234-117a-37149ab54304.jpeg)


気軽に注文できるとあって注文が殺到していました。

ちなみに店員さんですが「こちとら2人しかいなくて回んねえよ！」とボヤいていましたw
AWSさん、是非人数拡充してあげてください。

モカを頼むと文字を入れたラテアートを作ってくれていました。
![IMG20241202095117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/52b43850-21c2-6212-4f8e-b9874d85ecff.jpeg)

あまり、ラテアートの技術には明るくないですが、さすがにこれは機械がラテアートを作っているのか、、？(人が作ってるとしたら凄すぎる)

「Serverless Presso」という名前から裏ではAWSのサーバレスアーキテクチャが使用されていると思われますが、システム構成図的なものの表示はなかったです。(日本のAWS Summitで同様のコーナーがあったときは、システム構成図も公表されていたような記憶が、、)

# その他飲み物も無料
お茶、コーラ、ソーダなどが置かれており、無料です
![IMG20241202091915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/bee2fd60-931d-4cf4-2e59-cdef72230a26.jpeg)

# ヘッドフォンコーナー
Coolなヘッドフォンコーナーがありました。耳に当ててみると心地よい音楽が流れてきました。集中したいときにはめるとよさそうです。
![IMG20241202091952.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/6f1414b1-7751-5625-9908-6c6381f1abda.jpeg)

# フォトスポット
フォトスポットもあり、多くの方が並んでいました
![IMG20241202110515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/9ffdb668-8ce2-f519-04e8-04f080d999fc.jpeg)


# さいごに
AWS認定者の方はAWS re:Invent期間中、認定者ラウンジを活用すると、快適に過ごせそうです。
solidjsとurqlで実装

この記事は、[SolidJSアドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/solidjs) 3日目の記事です。

## はじめに

アドベントカレンダーに向けてsolidについて調べ始めてわかったことなのですが、solidjsのライブラリはドキュメントに書かれてないことがちょくちょくあります。(storybookとか)

urqlもそうで、ドキュメントにはないのですが、npmパッケージ自体は存在しました。

https://github.com/urql-graphql/urql/tree/main/packages/solid-urql

READMEすらないので導入方法を解説します。

使ってみたところ導入自体は問題なく使えそうです。

## 検証したこと

- 導入方法
- query呼び出し
- Suspense
- cacheExchange

## 導入方法
solidstartに導入してみました。
```bash
pnpm add @urql/solid
```

```tsx:src/app.tsx
export default function App() {
  const urqlClient = new UrqlClient({
    url: "http://localhost:3000/api/gql",
    exchanges: [cacheExchange, fetchExchange],
  });
  return (
    <UrqlProvider value={urqlClient}>
	    <Router ...
	  </UrqlProvider>
	)
}
```

reactと違ってclientをmemoで管理する必要がないのが便利です。

## Query呼び出し

普通にできます。(graphqlの型生成については[こちら](https://commerce.nearform.com/open-source/urql/docs/basics/typescript-integration/))

```tsx
import { Title } from "@solidjs/meta";
import { createQuery } from "@urql/solid";
import { createSignal, Index, Show } from "solid-js";
import { graphql } from "~/gql";

const PostQuery = graphql(`
	query PostQuery {
		posts {
			id
			title
			author {
				firstName
				lastName
			}
		}
	}`);

export default function Page() {
  const [result] = createQuery({ query: PostQuery, variables: {} });
  return (
    <main>
      <Title>GQL/URQL</Title>
      <h1>GQL/URQL</h1>
      <Show when={result.data}>
        {(d) => {
          return (
            <div>
              <Index
                each={d().posts?.filter((p) => p != null)}
                fallback={<div>Loading...</div>}
              >
                {(post) => (
                  <div>
                    <h2>{post().title}</h2>
                    <p>
                      {post().author?.firstName} {post().author?.lastName}
                    </p>
                  </div>
                )}
              </Index>
            </div>
          );
        }}
      </Show>
    </main>
  );
}

```

## Suspense

- Suspenseをtrueにするとサーバーサイドでフェッチが行われ、falseにするとクライアントサイドフェッチになる

設定方法

```tsx
// client作成時なら
  const urqlClient = new UrqlClient({
    url: "http://localhost:3000/api/gql",
    exchanges: [cacheExchange, fetchExchange],
    suspense: true,
  });
  
// query呼び出し時なら
const [result] = createQuery({ query: PostQuery, variables: {}, context:{suspense: true} })
```

## cacheExchange

問題なく動きました。

### 補足：cacheExchangeの役割

Mutationの結果に__typenameが含まれるとその__typenameを含むQueryを再フェッチする。

ちなみにgraphqlで取得するあらゆるデータに__typenameはデフォルトで含まれていて、jsonで構成されるレスポンスの各オブジェクトの型を判別するために使われている。（graphqlのレスポンスを見ると分かりやすいです。）
カレントディレクトリ下のヒストリーファイルを消去する

皆さん！ヒストリーファイルが邪魔だなーと思うことがありませんか（僕はいつも思います）
そんな方に一ついいコマンドを紹介します

`rm \.[a-z]*_history`

「.から始まり_historyで終わるaからzまでのファイル名を消去する」という内容になっています。

```zsh
alias rmhist="rm \.[a-z]*_history"
```
自分はこのコマンドを「.zshrc」にエイリアスとして保存してます。

参考にまでどうぞ！
ChatGPTにならう完璧なプラン

# ChatGPTを使いこなして差をつけろ！！！
　こんにちは。生成AIはもちろん知っていますよね。おそらく使ったことがある人も多いと思います。インターネット上の様々な情報を学習し、その膨大なデータ量で我々のあらゆるな悩みを解決してくれてとっても便利！もうこのAIの言うことを聞いていれば、間違いがないのではないかと思えるほどに。
 __そこで今回はAIに完全に頼って出かければ完璧なお出かけができるのではないかと思い検証してきました。__
 今回はアイデア出しに一番定評のあるChatGPTを使って検証しました。
  ## １　まずは身だしなみから
  　友達に約束を取り付けたらさっそく開始！！！
   　完璧なプランは準備から始まります。手始めに自分の現在の写真を撮りどのように身だしなみを整えたらよいかを質問しました。
    ![1000001588.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943859/d9228b07-53c5-f691-cc6f-2b6a5c13f974.png)
こんな感じでこのあともChatGPTからアドバイスをできる限り詳しくいただき、完璧な身だしなみにすることに成功しました。
## ２　トラブル発生
　準備を終えたのはいいものの忠実に指示を聞きすぎたあまり、集合時間から１時間遅れでついてしまいました。しかしこんな状況でも頼りになるのがChatGPTです。
 ![1000001590.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943859/3a9bb16b-aad7-7a49-fc42-04243f6ccb1e.png)
言われたとおりに __ミルクティー__ を用意したことで無事解決することができました。
## 3　ゲームセンター攻略
　今回ChatGPTから事前にプランを用意してもらったので忠実に実行していきます。
 そこで、まず最初に訪れたのがゲームセンターです。おすすめのゲームを順番にプレイしていきました。ここでChatGPTの本領発揮です。今回はプレイするすべてのゲームの攻略方法を叩き込んむことで完璧に攻略することができるか検証しました。
 - クレーンゲーム
 まずはクレーンゲームをプレイしました。
 提案された作戦をざっくりいうと一発でつかみにいかずに徐々に穴のほうに押していくという方法でした。友達と二人係で指示通りにプレイしていましたが２人続けて痛恨のミスお互いの１００円が底をつき無念の撤退をしました。
 __対戦__
 次に提案にあったゲーム対決をすることになり、３本勝負でまずはマリオカートで友達と対戦しました。このゲームはあまり得意ではありませんでしたが、だからこそアドバイスをしっかり頭に入れてプレイしました。
 その結果見事勝利を収めました。
 ![1000001593.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943859/dd7b39c6-72e3-8704-4af1-986a1fe561e6.png)
特にこのアドバイスがとても参考になりやはりAIのいうことは正しいのかと改めて思いました。
　ですが、そう思った矢先にアドバイスをもらったにもかかわらず１００円パチスロ対決とエアホッケー対決で敗北し、まさかの負け越しになりました。
 ![1000001597.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943859/d163c5e6-53e4-97dd-6bf6-d460baf7eae1.png)
👆アドバイスを受けている
## ４　その後
　その後はプラン通りに本屋で会話をしながら回ったり、軽食をとったり、最後にカラオケでしめるという感じで検証は終了しました。もちろんその行先ごとにChatGPTにアドバイスをもらって完璧なプランになるように行動しました。結果十分楽しめたと思いいます。
 ![1000001595.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943859/781aa8a5-d8ba-9382-9376-01ea5d284d04.png)
👆アドバイスを受けている
 ## ５　感想とまとめ
 　今回の検証の感想としては、お出かけプラン作成には使わなくてもいいかなと思いました。結果的に楽しくはあったけど、まあ意外性もとくにはなくという感じでした。
  まとめとしてはAIにばっか頼らないで自分で考えて動いたほうが楽しいことも、学べることも多いのできおつけよう！です。ですが、AIがもっと進化して人間とそん色ない思考能力を獲得したら今回の結果も変わるんじゃないかと思いました。
  あと時間がなくて書けませんでしたがAI活用カラオケはこのプランの中で一番面白かったので気が向いたら記事にしてもいいかなとおもっています。
  　こんなくだらない記事に最後まで付き合っていただきありがとうございました。
deviseを使ったtwitter認証でコケた話

## 環境
- ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [arm64-darwin20]
- Rails 6.1.4

## 内容
[[*Rails*] deviseの使い方（rails6版）](https://qiita.com/cigalecigales/items/16ce0a9a7e79b9c3974e)の記事を参考にdeviseを実装していたところTwitterで認証するところでコケた。

```console:terminal
D, [2021-07-17T13:20:36.167758 #35278] DEBUG -- omniauth: (twitter) Request phase initiated.
W, [2021-07-17T13:20:36.168254 #35278]  WARN -- omniauth: Attack prevented by OmniAuth::AuthenticityTokenProtection
E, [2021-07-17T13:20:36.168409 #35278] ERROR -- omniauth: (twitter) Authentication failure! authenticity_error: OmniAuth::AuthenticityError, Forbidden
```

ページの方でもエラーが発生（何書いてあるか忘れた）

## 解決
gemにomniauth-rails_csrf_protectionを追加する。

```ruby:gemfile
gem 'omniauth-rails_csrf_protection'
```

よくよく調べると`omniauth:2.0`から必要になるGemだそうです
RailsでCustom Fontを使う(Webpacker)

フォントをダウンロードして、app/javascript/src配下に置く

app/javascript/src/style.scssにフォントのパスを記入と使用

```scss
@font-face {
  font-family: "maru-gosic";
  src: url('./Corporate-Logo-Rounded.ttf') format('truetype');
}

html {
  font-family: "maru-gosic";
}
```

これで、OK!!

参考：　https://anthonybroadcrawford.com/2020/02/14/custom-fonts-rails-six.html