OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi PicoでHDMI(DVI)出力する

# 経緯
マイコンでHDMI(DVI)出力がしたくなったので下記の部品を購入した。
[Adafruit DVI Breakout Board - For HDMI Source Devices](https://www.adafruit.com/product/4984)

RP2040専用なのでRaspberry Pi Picoで動作確認する。
音声は送れないので正確にはDVIらしい。

# 配線
[チュートリアル](https://learn.adafruit.com/adafruit-dvi-breakout-board/raspberry-pi-pico-demo-code) を参考に配線する。
![IMG_2933.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/4db64237-b767-a41f-ea60-91dbf4a11cea.jpeg)

# インストール
[ライブラリ](https://learn.adafruit.com/picodvi-arduino-library-video-out-for-rp2040-boards/installation) などをインストールする。

# コード
[サンプル](https://learn.adafruit.com/picodvi-arduino-library-video-out-for-rp2040-boards/16bit_hello) を参考にする。
```cpp:pico_dvi_test.ino
#include <PicoDVI.h>
DVIGFX16 display(DVI_RES_320x240p60, pico_sock_cfg);
//配線は「Pico DVI sock」と同じなのでdisplay()の第2引数をpico_sock_cfgにする
void setup() {
  display.begin();
}
#define PAUSE 2000
#define CORNER_RADIUS 0
void loop() {
  show_basic_text();
}

void show_basic_text() {
  display.fillScreen(0);
  display.setFont();
  display.setCursor(0, CORNER_RADIUS);
  display.setTextSize(1);
  display.println(F("Standard built-in font"));
  display.setTextSize(2);
  display.println(F("BIG TEXT"));
  display.setTextSize(3);
  display.println((display.width() >= 200) ? F("BIGGER TEXT") : F("BIGGER"));
  display.setTextSize(2, 4);
  display.println(F("TALL and"));
  display.setTextSize(4, 2);
  display.println(F("WIDE"));
  delay(PAUSE);
}
```

# 結果
![IMG_2932.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/631bd9b3-fb11-d15b-d3f6-651537577a77.jpeg)

めでたしめでたし😇

# 余談
漢字も表示したい。
Bizrobo　ビズロボで特定の位置のタグを選択したい場合

## Bizroboで特定の位置の値を取得するには

#### 特定の位置にあるテキストを取得する方法についてです。



Bizroboにはループ機能がありますが、
必ず2番目のタグを取得したいなどのケースもあります。

特定の位置にある値を取得する際に、
ファインダーのTag Number（タグ番号）を使用することができます。

今回は見出しを除いて３番目にあるタグを取得するように設定していきたいと思います。


下記の画像では０番目の見出し部分が選択されている状態になっていますね。



![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/d95cab42-4e44-7020-8dd0-ed75d0e55c75.png)



この状態から例えば、

必ず見出しから3個下を選択したいといった場合には、



画面右側に見えている
Finderの部分を参照してみます。


下のほうにスクロールをしてみると
Tag Numberという部分があります。
（日本語設定の方は、”タグ番号”と表示されているかと思います。）




![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/384ee739-4787-eafe-6443-0f409fa2b964.png)





From First（最初から）
0番目となっているため、
現在1番上のタグが選択されているということですね。


0になっている数字を3番目に変えてみます。


![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/fba77661-93be-b376-e6b8-a14ef4f290fd.png)



そうすると
3番目の値が選択されていることがわかります。





![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/51e6ce10-752f-14c0-088a-b841efd81612.png)


このようにして取得するタグ番号の指定を行うことができます。


ちなみにあまりないケースかとは思いますが、
From Firstの部分を
From Lastに変更すると
下から数えてという意味になりますので、
場合によっては下から指定することもできます。


![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/34a5ccb2-0ae5-3151-4f45-7f97748b00be.png)



↑の場合だと
From Last（最後から）
1番目となりますので、
0番目から数えて1番目の値が選択されていることがわかります。


## まとめ


このような形で、
Finderをつかって取得したいタグ番号から値を取得することができます。

特定の位置から取得する場合ではなくでも、
From Firstの0になっていれば一番上の値をとってくるなという形で、
ダブルチェックにもつながります。

特定の位置から取得しない場合などは、
ループ処理等を使って取得することになるかと思いますので、
適宜使い分けてみてください。
GitLAB と Netlify の連携

GitLAB に入れた　index.html を Netlify で表示させます。

## GitLAB のリポジトリー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/215c53d0-c870-2f5d-8ed0-6db26e028d62.png)

```text
$ tree netlify_test/
netlify_test/
├── README.md
├── go_upload.sh
└── index.html
```

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Good Evening</title>
</head>
<body>
<blockquote>
<h2>Good Evening</h2>
	<blockquote>
	<p>今晩は</p>
	<p>雨が降っています。</p>
	</blockquote>
<p>これは GitLab と連携させるテストです。</p>
</blockquote>
<hr />
Jun/22/2023 PM 17:47<br />
</body>
</html>
```

データの更新に使うスクリプト

```bash:go_upload.sh
git add --all
git commit -m "Commit on Jun/22/2023 PM 17:47"
git push
```

## Netlify の状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2475dd45-d4c2-16f4-d916-a56dbb7b08be.png)

```text
Settings for celebrated-muffin-e7679e
celebrated-muffin-e7679e.netlify.app

Deploys from GitLab.

Owned by ekzemplaro.

Last update at 5:48 PM (a few seconds ago)
```

## Web ページ

https://celebrated-muffin-e7679e.netlify.app/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9fa6bb7a-7259-f2aa-c216-00017feb37ad.png)
【AWS】Route53 + CF + S3 でフェイルオーバー設定する手順

## やりたいこと
APIのヘルスチェックに失敗した場合に、S3に保存した503ページをCDN経由で配信する方法を解説します。


### 必要な設定は大きく3つ
- S3に503ページを配置する
- CloudFrontで新しくディストリビューションを作成する
- Route53でヘルスチェックの作成と、レコードの設定を行う


## 実装

### S3

まずはバケットを作成します。

![p2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/2ebfef1e-712d-5fc6-5fbe-45d30f2b6414.png)

バケット名に任意の名前を設定し、「バケットを作成」を押します。
※その他は特に変更しなくてOKです。バケット名はドメイン名と合わせる必要は無いです。
作成されたバケットを選択し、「アップロード」します。

作成されたバケットを選択し、「アップロード」を押す
![p2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/4298960a-bb79-040e-a4c1-c1c2657554fc.png)

「ファイルを追加」から503ページのファイルを追加し、アップロードを押します。
![p2-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/618a670e-a33a-5976-d21a-bc9669e50485.png)

![p2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/550efa69-7aa9-a85f-d151-fb9c3471b64f.png)


また、静的ウェブサイトホスティングを有効化しておきます。
![cf-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/359530b7-4a60-3223-8650-6d32cae3f8de.png)


### CloudFront
「ディストリビューションを作成」します。
![cf-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/548e61f1-9a4b-4860-f860-f1a1c031fcc9.png)



オリジンドメインは、S3のバケットウェブサイトエンドポイントを設定してください。
![cf-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/59daae5c-9acf-7ace-34c8-3d41cc12447a.png)

ビューワーは「Redirect HTTP tto HTTPS」
![cf-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/d4ba7207-9112-39e6-9930-81639167ac61.png)


「セキュリティ保護を有効にする」をONにし、作成します。
![cf-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/f4cbf4d2-0032-bde2-edf7-729895b66890.png)

作成できたら、「エラーページ」⇒「カスタムエラーレスポンスを作成」します。
![cf-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/d1741277-7b0f-fc29-a085-d1048e451890.png)

エラーコードを設定し、レスポンスページのパスにはS3に追加したファイルのパスを設定してください。
![cf-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/5ef77a61-12f9-31ea-111f-75588905af24.png)

### Route53

最後です。「ヘルスチェックの作成」を行います。
![p2-r53-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/05eba59f-88c7-f0f4-59b0-7d1e6f1e74e8.png)

「ドメイン名」を設定します。「名前」は何でも良いです。
![p2-r53-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/ee2e75b3-c0f3-3db7-0f8e-b1dc14b4622b.png)


通知設定は今回は有効化せず、「ヘルスチェックの作成」
![p2-r53-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/b3c44648-06c7-9bdd-66bd-6133be123a65.png)

ヘルスチェックを作成できました。


正常サイトのAレコードを編集します。
![p2-r53-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/a1197034-2d4b-938f-2225-ae40bb191870.png)


ルーティングポリシー  ⇒　フェイルオーバー
レコードタイプ　⇒　プライマリ
ヘルスチェックID  ⇒  先程作成したヘルスチェックを指定

503ページのレコードを新たに作成する。

ルーティングポリシー　⇒　フェイルオーバー
レコードタイプ　⇒　セカンダリ
ヘルスチェックID ⇒　作成したヘルスチェックを指定![p2-r53-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/361c1284-e661-e638-e566-d21093840207.png)


以上で設定できました。ぜひ、参考にしていただけますと幸いです。
Mayaの起動時間を計る

なんとなくmayaの起動時間を計測したくなったので

こちらを参考にさせて頂いて
http://rikutoto.blogspot.com/2013/06/windows.html

結果出るまでにちょっと時間かかりますが、一応maya終了時に結果を表示してくれました。


これを　mayaTimer.bat とかにして保存して起動すれば使えますね。
ただ普段から batとかランチャーとか使って起動してる人はこのまま使うとすっぴんになるので注意してください。

```winbatch
@echo off

rem SET T=%TIME:/=%
SET T=%TIME: =0%
SET H=%T:~0,2%
SET M=%T:~3,2%
SET S=%T:~6,2%

set /a H=1%H%-100
set /a M=1%M%-100
set /a S=1%S%-100   
echo Maya-----Startup %T%

rem replace path maya.exe
"C:\Program Files\Autodesk\Maya2022\bin\maya.exe"

SET T1=%TIME: =0%
SET H1=%T1:~0,2%
SET M1=%T1:~3,2%
SET S1=%T1:~6,2%

set /a H1=1%H1%-100
set /a M1=1%M1%-100
set /a S1=1%S1%-100

SET /a H2=H1-H

SET /a M2=M1-M
if %M2% LSS 0 set /a H2=H2-1
if %M2% LSS 0 set /a M2=M2+60

SET /a S2=S1-S
if %S2% LSS 0 set /a M2=M2-1
if %S2% LSS 0 set /a S2=S2+60

echo Maya-----ShutDown %T1%
echo Maya-----WorkingTime%H2%:%M2%:%S2%

PAUSE
```
gitコマンドに別名をつける

# はじめに
そういえばふと、プログラミング始めたての初心者も初心者だった頃。
調べたくてもキーワードすら分からなくて、調べるに調べられなかったなぁと思い出して些細なことでも残しておこうと思った次第。

そのgitコマンド、別名つけて使い勝手よく(主に短く)できますよ！のお話です。

# git入ってる？
そもそもプログラムコードのバージョン管理を行うgit、インストールされてますかって話ですね。
これが無いとコマンドをどうのこうの以前のお話なので。
[こちらを参考にインストールしてください。](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

# 別名をつける
`.gitconfig` というコンフィグファイルを編集し、別名(エイリアス)を設定していきます。

## .gitconfig ファイルはどこにあるの？
ホーム直下に作成されます。
`C:\Users\<ユーザー名>` のフォルダを開くと、`.gitconfig` ファイルがいるはず。
最初は `[user]` の情報が書かれているだけだと思います。

## 設定
ファイルをメモ帳で開いて、直接編集してもいいですし、コマンドから設定することもできます。

### ファイルを直接編集する場合

こんな感じに記載して保存するだけ。
```
[alias]
	co = checkout
```
これだけで、`git checkout` と毎回打っていたコマンドを `git co` で呼び出せるようになります。

### コマンドから設定する場合
以下のコマンドをターミナルやBashからたたくだけで設定できます。
```
$ git config --global alias.co checkout
```
やってることはファイルの編集と同じ。

- `git` = gitコマンドを使うよ
- `config` = コンフィグを設定するよ
- `--global` = グローバル範囲の設定だよ
- `alias.co` = 別名は `co` だよ
- `checkout` = `checkout` コマンドの別名だよ

こんな感じの意味のコマンドです。

ちなみに「範囲」について。
「gitのコンフィグファイル」と一口に言っても、以下の3種類のコンフィグがあります。

- システム全体に対するコンフィグファイル
- 該当ユーザーの全リポジトリに対するコンフィグファイル
- 各リポジトリに対するコンフィグファイル

どの範囲に対しての設定なのかを指定します。
まぁコマンドなんて、その人が共通して勝手良く使いたいはずなので、ほぼほぼ `--global` だとは思いますが。

余談ですが、`push origin` など 2語以上を設定する場合はシングルクォートで囲うことで設定できます。

```
$ git config --global alias.po 'push origin'
```

[公式のドキュメントはこちらから。](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)

# さいごに
プログラミング始めてたての方の、何かのお役に立てますように。
Alembic で複数モデルを扱う

## はじめに
マイグレーション機能を提供してくれるAlembicで、複数モデル（複数テーブル）を扱った際に詰まったので簡単に残します。
というか、基本的にモデルは複数作りますよね。

## Alembicの基本的な使い方

まだAlembicを入れていないという方はこちらを参考にして入れましょう。
Userモデルのみで実装しているのでモデルは一つです。
ただし記事の最後のコメントにもあるように、env.pyの修正部分でモデルをインポートするようにします。（詳しくは下記）

https://zenn.dev/shimakaze_soft/articles/4c0784d9a87751

上記記事修正部分
~~~python:env.py
# 修正前
# from settings import Base

# target_metadata = Base.metadata

# 修正後
from models import User

target_metadata = User.metadata
~~~

## 複数モデルを使用

そして以下のような複数テーブルを想定します。
~~~python:models.py
from sqlalchemy import Column, Integer, String

from settings import Base

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    price = Column(String)
~~~

複数モデルの際に変更する点も先ほどの修正点と同じenv.pyです。

~~~python:env.py
from logging.config import fileConfig

from alembic import context
from sqlalchemy import MetaData, engine_from_config, pool

from models import Group, User

...

# target_metadataを定義する直前部分にこの関数を追加
def combine_metadata(*args):
    m = MetaData()
    for metadata in args:
        for t in metadata.tables.values():
            t.tometadata(m)
    return m

# 変更
target_metadata = combine_metadata(User.Base.metadata, Group.Base.metadata)
~~~

これでテーブルを複数同時にマイグレーションできます。

## 参考記事

http://liuhongjiang.github.io/hexotech/2015/10/14/alembic-support-multiple-model-files/
Svelteフォーカス時の動き（キーボードTab移動）

Svelte

```svelte
<div 
    on:focus={hoge}
    on:blur={fuga}
>
    <button>ボタン</button>
</div>
```

みたいな感じでキーボードのタブ動作でbuttonにフォーカスが当たった時、
`on:focus`　では子要素にフォーカスが当たっても発火してくれないため
関数`hoge‘が動かなくてはまってしまった。

```Svelte
<div 
    on:focusin={hoge}
    on:focusout={fuga}
>
    <button>ボタン</button>
</div>
```
とすれば子要素にフォーカスがあたったときも検知して発火してくれるようになった。


けど・・・ChatGPTなどでは
「Svelteでは、on:focusinという特定のディレクティブは提供されていません。」
との事。　ChatGPTが情報を拾い切れていないだけだといいけど・・・

ちなみに
safari
chrome
Edge
fireFox
ではちゃんと動作したので問題ない　　　と思いたい。（他のブラウザは確認してない）
[Rubocop] IdenticalConditionalBranches: Move (コード ) out of the conditional

<h5>実行したコマンド</h5>

```
rubocop -a
```


<h5>Rubocopに指摘された内容</h5>

```
C: [Correctable] IdenticalConditionalBranches: Move (Rubocopに指摘されているコードの箇所) out of the conditional.

    　　　　 Rubocopに指摘されているコード
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

<h5>解決</h5>
if文を用いて条件分岐をしていた且つ、各分岐の末尾に同じ表現を書いていたため、指摘された箇所をif文の外に置いた。




<br />
<br /><br />
<br />
参考
<p>
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/IdenticalConditionalBranches
</p>
[Rubocop]   [Correctable] Style/CaseLikeIf: Convert if-elsif to case-when.      

<h5>実行したコマンド</h5>

```
$ rubocop -a
```

<h5>rubocop からのご指摘</h5>

```
[Correctable] Style/CaseLikeIf: Convert if-elsif to case-when.

  指摘されたコード
 ^^^^^^^^^^^^^^^^^^
```


<h5>修正前</h5>

```
if hoge = a
    
    # 処理内容

elsif hoge = b

    # 処理内容

elsif hoge = c

    # 処理内容

end

```


<h5>修正後</h5>


```
case hoge 

    when a
    
    # 処理内容

    when b

    # 処理内容

    when c

    # 処理内容

end

```
【Xcode】Xcode内のフォントを変更する

# はじめに
Twitterでのこのやり取りを見てXcodeないのフォントを変更できることを知りました。

https://twitter.com/tobi462/status/1671714110508244993?s=20

フォントの変え方を調べたので記録しておきます。

# やりかた
① 「Xcode」を選択します
② 「Settings...」を選択します
![スクリーンショット 2023-06-22 16.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/cdb6e192-8169-9e50-487a-c48455dbf472.png)

③ 「Themes」を選択します
④ フォントを変更します
![スクリーンショット 2023-06-22 16.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f50f546f-b755-3483-b5dc-a43469dc5423.png)

こんな感じのウインドウが表示されるので好きなフォントに変更します
![スクリーンショット 2023-06-22 16.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9f48ad95-a602-9a37-6865-78d1b1e8ff9d.png)

# おわり
いい感じのフォントを探す旅に出ます
pythonのseleniumでウェブページ遷移時にレイテンシ(遅延)するように設定する

# 結論
webドライバーが持つ`set_network_conditions`関数を使用することでレイテンシを設定できます。

# 参考コード
```.py
# webdriverのimportやoptionのコードは割愛
with webdriver.Chrome("chromedriver", options = options) as driver:
    driver.set_network_conditions(
        latency = 10000, # 10秒遅延させる
        download_throughput = 500 * 1024,
        upload_throughput = 500 * 1024 #download_throughput, upload_throughputは引数に渡す必要がある。
    )
    # アクセス開始(レイテンシ分遅延発生)
    driver.get('https://www.yahoo.co.jp/')
    print(driver.page_source)
```

# 補足
`set_network_conditions`の`latency`以外の引数は、参考に挙げた記事に記載があります。また、この記事は他の言語でseleniumを使用している方も同様の関数で設定できるのではないかと思います。

以上です。

# 参考

https://zenn.dev/mima_ita/articles/11a00ef32af1bf

https://kurozumi.github.io/selenium-python/api.html#selenium.webdriver.chrome.webdriver.WebDriver.set_network_conditions
【AWS】CloudFormationでスケジュール起動するLambda関数を作る

# 目的
コンソール画面から設定もできますが、今回はCloudFormationでスケジュール起動するLambda関数を作ることです。

# EventBridge
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/AWS_Events.html

まずはEventBridgeです。
今回は[AWS::Events::Rule](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html)を使います。テンプレートは下記です。
```json
{
  "Type" : "AWS::Events::Rule",
  "Properties" : {
      "Description" : String,
      "EventBusName" : String,
      "EventPattern" : Json,
      "Name" : String,
      "RoleArn" : String,
      "ScheduleExpression" : String,
      "State" : String,
      "Targets" : [ Target, ... ]
    }
}
```
`ScheduleExpression`は下記ページをご参照ください。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-cloudwatchevents-expressions.html

# トリガー
次は作ったEventをLambdaのトリガーにします。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html

テンプレートは下記です。

```json
{
  "Type" : "AWS::Lambda::Permission",
  "Properties" : {
      "Action" : String,
      "EventSourceToken" : String,
      "FunctionName" : String,
      "FunctionUrlAuthType" : String,
      "Principal" : String,
      "PrincipalOrgID" : String,
      "SourceAccount" : String,
      "SourceArn" : String
    }
}
```


- Action
`Action`を`lambda:InvokeFunction`にすることで、スケジューラでLambdaを呼び出します。
- FunctionName
呼び出し対象のLambda Function名
- Principal
関数を呼び出す AWS サービスまたは AWS アカウント。サービスを指定する場合は、SourceArnまたはを使用してSourceAccount、そのサービスを通じて関数を呼び出せるユーザーを制限します。
- SourceArn
関数を呼び出す AWS リソースの ARN。ここではEventBridgeスケジュールをさします。

# サンプル
完成した`cloudformation`サンプルは下記です。
```json
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "{\"createdOn\":\"Windows\",\"createdBy\":\"Amplify\",\"createdWith\":\"7.6.23\",\"stackType\":\"function-Lambda\",\"metadata\":{}}",
  "Parameters": {},
  "LambdaFunction": {},
  "Resources": {
    "TestEventsRule": {
      "Type": "AWS::Events::Rule",
      "Properties": {
        "Name": "Test",
        "ScheduleExpression": "cron(0 18 ? * MON-SAT *)",
        "State": "ENABLED",
        "Targets": [
          {
              "Ref": "LambdaFunction"
          }
        ],
        "EventBusName": "default"
      }
    },
    "LambdaPermission": {
      "Type": "AWS::Lambda::Permission",
      "Properties": {
        "Action": "lambda:InvokeFunction",
        "FunctionName": {
          "Ref": "LambdaFunction"
        },
        "Principal": "events.amazonaws.com",
        "SourceArn": {
          "Fn::GetAtt": [
            "TestEventsRule",
            "Arn"
          ]
        }
      }
    }
  }
}
```
Pythonを使用して、スタイルとCSSを使用してPandasデータフレームのHTMLテーブル内のテキストの色を変更します

Pythonにおいて、スタイルとCSSを使用してpandasのデータフレームのHTMLテーブル内のテキストの色を変更するには、`applymap`メソッドを使用してデータフレームの全要素に関数を適用し、CSSを使用してスタイルを追加します。

以下にその例コードを示します。

```python
import pandas as pd

# サンプルデータフレームを作成する
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# テキストに色を適用する関数を定義する
def color_text(val):
    color = 'red' if val > 2 else 'black'
    return f'color: {color}'

# applymapを使って関数を各セルに適用し、CSSスタイルを追加する
styled_df = df.style.applymap(color_text)

# スタイルを適用したデータフレームをHTMLとして表示する
styled_df.render()
```

この例では、値に基づいてテキストの色を指定するCSSスタイルの文字列を返す`color_text`関数を定義しています。データフレームの`style`プロパティの`applymap`メソッドを使用して、この関数をデータフレームのすべてのセルに適用します。最後に、`render`メソッドを使用してスタイルが適用されたデータフレームをHTMLとして表示します。

結果として、値が2より大きいセルのテキストが赤色に、それ以外のテキストが黒色になるテーブルが表示されます。必要に応じて、`color_text`関数を他の基準に基づいて異なる色を適用するように変更することができます。

なお、`styled_df`オブジェクトは`pandas.io.formats.style.Styler`オブジェクトであり、他のメソッドを使用してフォントサイズ、背景色、境界線などの他のスタイルプロパティを適用することができます。また、`to_excel`メソッドまたは`to_html`メソッドを使用して、スタイルが適用されたデータフレームをファイルに保存することもできます。


from:https://soyata.co/detail/16
【Query Builder：Expression】Try using IsLike statement

[Sharperlight](https://sharperlight.com/) expression in the query builder allow you to use expressions like the **Like** operator in SQL statements.
I have a query that returns results like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ed950f0b-c713-bca7-0a79-03053ecf5e5a.png)
Let's define an expression that looks for records where the Customer Name contains a word **Corporation**.
Go back to your query definition and add the expression.
Select `Add Expression` from the right-click menu in the output area.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/84a7cbd7-d070-fa1f-f9ad-b89261c1cf3a.png)
Enter **like** in the Find field of the `Expression` tab.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6052c391-0de4-bc37-2559-ec31d25a5fab.png)
Select **Do SQL like wildcard \~** in the Functions list and double-click it.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0c5f9089-c04e-f5c4-2612-cdfca1cfe209.png)
The template is displayed in the `Expression Formula` text box.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7912e139-0215-8307-12af-f32579321ca8.png)
The first argument of the **IsLike** function is the search pattern. Here it is `"%Corpo%"`. In the second argument, specify the search target string. Here, we want to search for a string in the `Customer Name` field, so enter that reference name, `{%CustomerName}`.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/811fc070-47a2-e333-dad2-349dc8c5c913.png)
Finally set the `Data Type` to **Text**.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/db14ce56-6b17-8aba-a5d7-41da8f6cc9d8.png)
Now, let's run it with the `Preview` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2087c21c-d3ea-6446-6407-214a08e24847.png)
`Found match` is displayed where the Customer Name contains **Corpo**.

I think that it can be used in various ways in combination with other functions.

I hope this will help your work.
ターミナルのコピーコマンド

# 最初に
今回はターミナルでviなどを使わずに中身をコピーするためのコマンドを紹介していきます
### 本文
早速ですがコマンドは下記の通りになります
``` 
pbcopy < パス
```
### 最後に
今回は自分の備忘録のために記事を書きました
どなたかのお役に立てれば幸いです
AWS認定クラウドプラクティショナー試験 学習方法


## はじめに

AWS認定クラウドプラクティショナー試験の勉強方法をまとめる。



## AWSトレーニング

https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

資格取得へ向けて、次のトレーニングが用意されている。まずはこれらをやってみるのが良さそう。

#### AWS cloud practitioner essentials (second edition) Eラーニング

無料のデジタルトレーニング

#### AWS認定インストラクターによるクラスルームトレーニング

インストラクターによるハンズオントレーニング。

* AWS cloud practitoner essentials Classroom
* AWS technical essentials


## AWSホワイトペーパー

https://aws.amazon.com/jp/whitepapers

AWSを利用する上で参考にになるドキュメントがまとめられている。わからないことが出てきたら、ここでドキュメントを探す。

## AWS初心者向け資料

https://aws.amazon.com/jp/events/aws-event-resource/beginner/

AWS初心者向け資料がまとまっている。


## 10分間チュートリアル

https://aws.amazon.com/jp/getting-started/hands-on

シナリオがいくつか用意されていて、それに沿って実際にAWSを触ってみる。
useEffectのreturnには気をつけよう

## useEffectのreturn部分

前提：Reactで使われるuseEffectについて、第二引数に空配列`[]`を設定すると、useEffect内の処理はコンポーネントマウント時、returnにコールバックを設定するとコンポーネントアンマウント時にそれぞれ一度だけ実行される。

```
  useEffect(() => {
    // コンポーネントマウント時に実行
    return () => {
      // コンポーネントアンマウント時に実行
    };
  }, []);
```

アンマウント時に実行したいコールバック内で、例えばuseStateでセットした値を使おうとすると、うまくいかなかった。例えば、こんな感じ。

```
const [str, setStr] = useState<string>('initial string');
...

  useEffect(() => {
    setStr('updated string');
    return () => {
      console.log(str);  // initial string
    };
  }, []);

console.log(str); // updated string

```

useEffect外でのconsole.log()ではちゃんと'updated string'が出るのになぜだ...!?!?
setState()が非同期処理のためすぐにはセットされないことは知っていたのですが...

## 解決方法

```
const [str, setStr] = useState<string>('initial string');
...

  useEffect(() => {
    const outputString = 'updated string';
    setStr(outputString);
    return () => {
      console.log(outputString);  // updated string
    };
  }, []);

console.log(str); // updated string

```

returnのコールバックは、コールバックがセットされた時点での値を参照するようでした。
※ただの私の経験談なので実際は間違っている可能性があります
setState()は非同期であるためコールバックがセットされた時点ではまだstrに値が代入されていない可能性があります。
今回の実装ではsetState()するのはuseEffect()内だけだったので、

- outputStringに値を保持しておく
- setStr()する
- return文内ではstrではなく保持して置いた値(outputString)を使う

これで動きました。

じゃあ後から代入した値を使いたいときはどうするんだろう...という疑問は残りますが...

## 残ってしまった疑問
例えばuseEffect外で...というか、コンポーネントマウント後にsetStateした値をreturnのコールバック内で使う場合ってどうするんだろう...

```
const [str, setStr] = useState<string>('initial string');

  useEffect(() => {
    return () => {
      console.log(outputString);  // initial string　👈これを"updated string"にしたいときって...
    };
  }, []);

// useEffect外で
  setStr("updated string");
```


わかったら追記します。
【2023年06月版】Ubuntu22.04 に docker / docker compose をインストール

:::note info
更新しました。
[【2024年08月版】Ubuntu への Docker / DockerCompose インストールメモ](https://qiita.com/nouernet/items/7dfb11cd8c3c929821b1)
:::

# はじめに

せや、Ubuntu で Dokcer インストールしよ

公式ドキュメント [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/) を見ながら作業

# 前提条件

- 環境

```terminal
$ uname -a
Linux smb_host 5.15.0-75-generic #82-Ubuntu SMP Tue Jun 6 23:10:23 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
```

# 下準備

既存のDockerを削除する

- docker.io
- docker-compose
- docker-doc
- podman-docker

```terminal
$ for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

# リポジトリの設定

```terminal
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

# インストール

```terminal
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

# 動作確認

```terminal
$ sudo docker run hello-world
```

# さいごに

かんたんでしたね

# 参考資料

公式ドキュメント [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
【ChatGPT プロンプト付き！】 ChatGPTでQiita記事を書いてみた

## 1. はじめに
ChatGPTを使ってQiita記事を作成してみました！

最終的に公開した記事はこちらです。

https://qiita.com/hiroyuki-abe/items/47c11a4d8c9f15629087

<br/>

## 2. 前提

- 書きたい内容自体は前もって箇条書きレベルでまとまっていました。
- ChatGPTの生成結果をベースに修正・加筆する方法にしました。
- 私は文章が苦手で、修正に時間を費やしてしまうことが多いです。

<br/>


## 3. 結論

かなり助かる！

- 大事じゃないところに取られる労力を大幅軽減してくれて、大事なところに注力できる！
- 構成や文章の細部は ほぼChatGPTお任せで、書きたい内容の加筆・修正をするだけでした。
- 文章をこねくり回す時間が大幅削減！
- 頑張らなくても、雑なプロンプトで十分。
  ちょっと調べただけのプロンプトでも全然助かるレベルのものをアウトプットしてくれる。

<br/>

## 4. 実際に使ったプロンプト と ChatGPT出力

<details><summary>実際に使ったプロンプト</summary>

```
#命令書
あなたは技術ブログを書くプロフェッショナルです。以下の #制約条件 に従い、技術ブログ記事を書いてください。

#制約条件
・以下の #ブログ内容 の条件に忠実に従って技術ブログ記事を書く。
・極力、端的に書く。
・出力形式はマークダウン。


#ブログ内容
ターゲット:
・Power Apps 初心者
・Power Apps をこれから始めようとしている人
テーマ: 【超要約！ Power Apps入門】 3分で学ぶ！ Power Apps を始める前に抑えておくこと
目次:
・PowerAppsとは？
・主要な構成要素
  ・画面
  ・データソース
・その他の大事な要素
  ・PowerFx
  ・リレーション
・入門時に、まず抑えること
  ・主要な画面パーツと使い方
  ・主要なPowerFxと使い方
  ・変数
    ・グローバル変数
    ・コンテキスト変数
・その他
  ・一般公開用のページを作れる「ポータル」機能がある。  ※ 要ライセンス
  ・ユーザー一覧は、「AAD Userテーブル」 or 「ユーザーテーブル」から取得できる
```

</details>

<details><summary>ChatGPT出力</summary>

```
# 【超要約！ Power Apps入門】 3分で学ぶ！ Power Apps を始める前に抑えておくこと

Power Apps初心者やこれから始める方向けに、Power Appsの基礎を簡潔にご紹介します！

## PowerAppsとは？
ビジネス向けのアプリケーションを簡単に作成できるマイクロソフトのプラットフォームです。

## 主要な構成要素
- 画面：ユーザーが操作するインターフェースです。
- データソース：アプリケーションで使用するデータの元となる場所です。

## その他の重要な要素
- PowerFx：アプリケーションのロジックを作成するための式言語です。
- リレーション：複数のテーブル間の関連を定義し、データの参照を可能にします。

## 入門時に抑えるべきポイント
- 主要な画面パーツと使い方：フォーム、ギャラリー、ボタンなどの基本的な画面パーツを理解しましょう。
- 主要なPowerFxと使い方：条件分岐や計算など、PowerFxを使った基本的なロジックを学びましょう。
- 変数：グローバル変数とコンテキスト変数の違いや使い方を把握しましょう。

## その他の注目ポイント
- 一般公開用のページを作れる「ポータル」機能がありますが、ライセンスが必要です。
- ユーザー一覧は、「AAD Userテーブル」または「ユーザーテーブル」から取得できます。

以上が、Power Appsの入門前に知っておくべきポイントの要約です。Power Appsを始める前の基礎知識を3分で学んで、アプリケーション作成にスムーズに取り組みましょう！
```

</details>


## 5.おまけ


<details><summary>この記事を作成するのに使ったプロンプトの1つ</summary>

```
#命令書
あなたは技術ブログを書くプロフェッショナルです。以下の #制約条件 に従い、技術ブログ記事を書いてください。
構成、目次も考えてください。

#制約条件
・以下の #ブログ内容 の条件に忠実に従って技術ブログ記事を書く。
・出力形式はマークダウン。
・ポジティブで明るく親しみやすい文章で書く。
・極力、端的に書く。
・極力、長文は避け、箇条書き等を活用。
・Qiita記事の作成方法は不要
・プロンプト自体の説明は不要

#ブログ内容
ターゲット:
・ChatGPTに興味がある人
・ChatGPTを活用しようとしている人
タイトル: 【ChatGPT プロンプト付き！】 ChatGPTでQiita記事を書いてみた
概要: ChatGPTを使用してQiita記事(https://qiita.com/hiroyuki-abe/items/47c11a4d8c9f15629087)を書いてみた実験の紹介。
書きたい事:
・前提
  ・書きたいことは箇条書きレベルでは決まっていた
  ・私は、文章が下手。直そうとしても上手くいかず悪化することも多い。こねくり回して時間がかかる。
  ・ChatGPTに書いてもらったものをベースに修正するやり方をしました。
・最終的に公開した記事へのリンク
  https://qiita.com/hiroyuki-abe/items/47c11a4d8c9f15629087
・結論
  ・かなり助かる！
  ・特に枠組みや枝葉の部分が大幅削減でき、主に書きたい事の部分を修正、加筆するだけ。
  ・文章をこねくり回す時間が大幅削減
  ・構成や本筋以外の文章にかかる時間も大幅削減
・使ったプロンプトの紹介
・ChatGPTからのアウトプット
・人間が書いたところ
```

</details>

※ 少しずつプロンプトを変えて幾つか試し、いいとこ取りしました。
シェルスクリプト(bash)でfizzbazz書いてみたよ

今回はbashを使ってfizzbazz問題を解いていきたいと思います。
# FizzBuzzとは
3の倍数でFizz、5の倍数でBuzz、3の倍数かつ5の倍数でFizzBuzzを出力させるやつです。
## コード
```
#!/bin/bash

arr=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)

for i in "${arr[@]}"; do
    if [ "$i" -eq 15 ]; then
        echo 'fizzbazz'
    elif [ "$i" -eq 5 ]; then
        echo 'bazz'
    elif [ "$i" -eq 3 ]; then
        echo 'fizz'
    else "$i"
    fi
done
```
## 出力結果
```
$ ./text.txt
1
2
fizz
4
bazz
fizz
7
8
fizz
bazz
11
fizz
13
14
fizzbazz
```

# 応用編
追加要件として、1から100までの数字内で3の数字が含まれる場合もfizzと出力し、
5の数字を含む時はbazz、15を含む時もfizzbazzを出力する。
```
#!/bin/bash

for i in `seq 1 100`; do
    if [ $(($i % 15)) -eq 0 ] || [[ $i =~ 15 ]]; then
        echo 'fizzbazz'
    elif [ $(($i % 5)) -eq 0 ] || [[ $i =~ 5 ]]; then
        echo 'bazz'
    elif [ $(($i % 3)) -eq 0 ] || [[ $i =~ 3 ]]; then
        echo 'fizz'
    else
        echo $i
    fi
done
```
## 出力結果
```
1
2
fizz
4
bazz
fizz
7
8
fizz
bazz
...
89
fizzbazz
91
92
fizz
94
bazz
fizz
97
98
fizz
bazz
```

# 最後に
if文書く時にのスペースがあるかないかで、エラー出るのって初心者殺しだよね笑
間違えてたらぜひコメントで教えてください。
【Query Builder：Expression】Try using a string search with wildcards

[Sharperlight](https://sharperlight.com/) expression in the query builder allow you to use expressions like the **Like** operator in SQL statements.
I have a query that returns results like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ed950f0b-c713-bca7-0a79-03053ecf5e5a.png)
Let's define an expression that looks for records where the Customer Name contains a word **Corporation**.
Go back to your query definition and add the expression.
Select `Add Expression` from the right-click menu in the output area.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/84a7cbd7-d070-fa1f-f9ad-b89261c1cf3a.png)
Enter **like** in the Find field of the `Expression` tab.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6052c391-0de4-bc37-2559-ec31d25a5fab.png)
Select **Do SQL like wildcard \~** in the Functions list and double-click it.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0c5f9089-c04e-f5c4-2612-cdfca1cfe209.png)
The template is displayed in the `Expression Formula` text box.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7912e139-0215-8307-12af-f32579321ca8.png)
The first argument of the **IsLike** function is the search pattern. Here it is `"%Corpo%"`. In the second argument, specify the search target string. Here, we want to search for a string in the `Customer Name` field, so enter that reference name, `{%CustomerName}`.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/811fc070-47a2-e333-dad2-349dc8c5c913.png)
Finally set the `Data Type` to **Text**.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/db14ce56-6b17-8aba-a5d7-41da8f6cc9d8.png)
Now, let's run it with the `Preview` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2087c21c-d3ea-6446-6407-214a08e24847.png)
`Found match` is displayed where the Customer Name contains **Corpo**.

I think that it can be used in various ways in combination with other functions.

I hope this will help your work.
【Rails】1つのコントローラに2つ目のupdateの役割をするアクションを作る

<h2>Webアプリ作成中</h2>
・押すボタンによって、それぞれ別のカラムを変更し、上書きするアクションをつけた際の流れ

```routes.rb
resources :study_times, only: %i[new create index update] do
    member do
      patch :finish
    end
  end
```
・resources :study_timesに対してmemberメソッドを使用し、finishアクションを定義。
・これにより、個別のstudy_timeオブジェクトに対してfinishアクションを実行できる。
・patchメソッドを使用しているため、HTTPのPATCHリクエストがfinishアクションに対して送信される。

```study_times_controller.rb
class StudyTimesController < ApplicationController
  def update
    @study_time = StudyTime.find(params[:id])
    elapsed_time = (Time.now - @study_time.created_at) / 60
    @study_time.total_time = elapsed_time.to_i
    @study_time.touch(:updated_at)
    @study_time.save
    redirect_to study_times_path
  end

  def finish
    @study_time = StudyTime.find(params[:id])
    @study_time.status = 1
    @study_time.save
    redirect_to study_times_path
  end
```
・updateアクション、finishアクションは共に、study_timeインスタンスのカラムを変更し、上書きするアクション

```_study_time.html.erb
<%= form_with(model: study_time, url: study_time_path(study_time)) do |f| %>
    <%= f.submit "更新", class: "btn btn-primary" %>
<% end %>
<%= form_with(model: study_time, url: finish_study_time_path(study_time)) do |f| %>
    <%= f.submit "終了", class: "btn btn-secondary" %>
<% end %>
```
・ちなみにviewはこのような形で、リクエストを飛ばす
Jekyllのレイアウトの種類

## Jekyllのレイアウトの種類

- **default**: デフォルトのレイアウト
全てのページで使用される基本的なレイアウト

- **post**: ブログ記事などの投稿用のレイアウト
ブログポストの個別のページで使用

- **page**: 一般的なコンテンツページ用のレイアウト
固定ページや追加のコンテンツページで使用

- **home**: サイトのホームページ用のレイアウト
トップページで使用

- **category**: カテゴリーページ用のレイアウト
特定のカテゴリーに関連するページで使用

- **tag**: タグページ用のレイアウト
特定のタグに関連するページで使用

- **カスタムレイアウト**: ユーザー独自のレイアウトも作成できる
特定のページやコンテンツに固有のデザインや構造を適用できる

:::note
レイアウトはHTMLとLiquidテンプレートエンジンを使用して作成
Jekyllのテーマや設定に基づいてページが生成される際に適用される
JavaScript変数にHTMLコードを格納する方法

JavaScript変数にHTMLコードを格納したかったのですが、PHPコードが含まれているとシングルクォーテーション("")で囲う方法ではできなかったので、PHPコードが含まれている場合の方法を調べました。

バッククオート（`）を使ってテンプレートリテラルを作成することで、変数にHTMLコードを格納できます。
CakePHPの場合、ビューファイル上であれば、$this->Form->buttonの部分も問題なく動作しました。
```
var template = `
            <div>
                    <?=
                        $this->Form->button(
                            '追加',
                            [
                                'type' => 'button',
                                'class' => 'btn',
                                'id' => 'add',
                            ]
                        );
                    ?>
               </div>
            `;
```
使用例
```
$('#test').append(template);
```
permalinkってなに

## permalink
:::note
Jekyllの設定オプションの1つ
**生成されるページのURLの形式を指定するために使用**
:::


JekyllはコンテンツファイルからHTMLページを生成する際、パーマリンク（永続的なリンク）の形式を設定できる

permalinkオプションにはいくつかの値を指定できる

## permalinkオプションの値とその意味

- **date**: パーマリンクに作成日付を含める
*EX)*
/:year/:month/:day/:title.htmlのような形式で生成

- **pretty**: エクステンションなしでわかりやすいURLを生成
*EX)*
/:year/:month/:day/:titleのような形式で生成

- **none**: 拡張子なしでシンプルなURLを生成
*EX)*
/:categories/:titleのような形式で生成

- **カスタムパターン**: permalinkオプションにはカスタムパターンも指定できる
*EX)*
/blog/:title/:year/:month/:day/のような独自のパーマリンク形式を作成できる
Aerospike Go Clientで複数条件を設定したい

# はじめに

Aerospike Go Clientを利用している箇所で改修をする際につまづいたところがあるのでまとめます

# 問題

Aerospikeで日付でフィルタリングをしていたのですが、そこから別の条件をANDで検索したレコードすべてをほしいなと思ったのですが、なかなかできずに困りました

```go
	// クエリのステートメントを設定します。
	stmt := as.NewStatement("namespace", "set")

	// 時間範囲をUnixタイムスタンプに変換します。
	fromTimestamp := time.Date(2023, 6, 1, 0, 0, 0, 0, time.UTC).Unix()
	toTimestamp := time.Date(2023, 6, 30, 0, 0, 0, 0, time.UTC).Unix()

	// タイムスタンプの範囲フィルタを設定します。
	stmt.SetFilters(as.NewRangeFilter("timestamp", fromTimestamp, toTimestamp))

    // ここで、別の条件も追加したい

	// クエリを実行し、結果のレコードを取得します。
	recordSet, err := client.Query(nil, stmt)
	if err != nil {
```

`stmt.SetFilters`をもう一つ用意しようとしましたが、上書きされてしまうので実現しませんでした

# わかったこと

ChatGPTにきいたところ以下のことがわかりました

>Aerospikeのクエリエンジンは、1つのインデックスに対して1つの範囲フィルターしか許容しないため、複数フィールドのAND条件を直接適用することはできません

そもそも複数条件で検索することが機能的にできませんでした

# 回避策1

AerospikeのUser-Defined Function (UDF) という機能を利用することで複数条件のようなことができます

https://hatappi.blog/entry/2017/11/20/201357

```lua:filter_by_application.lua
function filter_by_application(rec)
    if rec['application'] == 'app' then
        return true
    else
        return false
    end
end
```

このような`lua`を書いてサーバーに登録して使います

```go
stmt.SetAggregateFunction("application_filter", "filter_by_application", nil, true)
```

サーバーに追加しないといけないので動いているサーバーに追加するというのは大変です

# 回避策2

Goで制御する

```go
		if appVal, exists := res.Record.Bins["application"]; exists {
			if appVal == "app" {
				fmt.Println(res.Record)
			}
		}
```

大規模なデータでは時間がかかるのがネックです

# おわりに

今回はGo側に制御コードをいれることで回避しました

# 参考

https://hatappi.blog/entry/2017/11/20/201357
BCCでのメール配信がNGな理由

CCやBCCを利用した一斉メール配信は複数人へ情報共有をするにあたり非常に便利な方法です。

その便利さゆえに使い方は本来の用途を飛び越え、メルマガ配信に活用されるケースが散見されます。

しかし、そんなBCC（CC）にも意外な落とし穴があるのをご存知でしょうか。気軽に使っていたBCCでの一斉メール配信によって大きな問題が発生し企業や個人の信頼を失ってしまう危険性もあります。

今回は、そんなBCC一斉送信のリスクについて詳しく解説し、その対策方法をご紹介します。

BCCでの一斉送信が推奨されない具体的な理由は主に以下の5つです。

1\. ブラックリストに載ってしまう
2\. 個人情報漏洩リスク
3\. メール送信上限数と配信遅延
4\. メールの効果を検証しにくい
5\. 受信者が悪い印象を抱く可能性がある

それぞれのお詳しい解説はこちらの記事で解説していますので参考にしてください。

[▶BCCで一斉送信する前に知っておきたいリスクと対策を徹底解説](https://bmb.jp/maildeliver/bcc-broadcast "BCCで一斉送信する前に知っておきたいリスクと対策を徹底解説")
初めてのVue.js_まずはドキュメントを読んでいくぅ！

# はじめに
+ Vue3の勉強記録です。
+ まじでVueの勉強を今日はじめたので、間違いがあっても優しく指摘してください。お願いします。

# Vue.jsとは
+ WebアプリケーションのUIを構築する為の、オープンソースのJavaScriptフレームワーク。
+ Evan You氏によって提唱された「プログレッシブ・フレームワーク」の概念もと、設計されている。

## 開発者を知る
+ Google社で働いていた Evan You 氏が2013年に開発。2014年にGithubに公開。
+ 在社中にVueを開発し、2年数か月で退社。

参考: [Vueフレームワーク創始者、Evan You（エヴァン・ヨー）。アジア出身の天才肌ITエンジニアについて、生い立ちや経歴をまとめてみた](https://asianonanika.com/evan-you/)

## プログレッシブ・フレームワークを知る
どんなWebアプリケーションでも作れるように、どんな規模にも対応できるように、
柔軟性を提供する設計のこと。そして段階的に適用できる設計のこと。

参考: [公式_プログレッシブフレームワーク](https://ja.vuejs.org/guide/introduction.html#the-progressive-framework)
参考: [Vue.jsについて学習してみた ＜基礎編＞](https://tech-blog.rakus.co.jp/entry/20190621/javascript/vue-js/beginner#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%AC%E3%83%83%E3%82%B7%E3%83%96%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF)

# 単一ファイルコンポーネント(SFC)
+ Single File Component。略してSFC
+ ロジック(JavaScript), テンプレート(HTML), スタイル(CSS)を単一ファイル(.vue)にカプセル化したもの
+ ビルドが必要
+ Vueプロジェクトでよく利用されるコンポーネント
>SFC利用シーン
>・シングルページアプリケーション (SPA)
>・静的サイトジェネレーション (SSG)
>・より良い開発体験（DX）のためにビルドステップを正当化できるあらゆる重要なフロントエンド
>
>引用: [なぜ SFC なのか](https://ja.vuejs.org/guide/scaling-up/sfc.html#why-sfc)
+ 公式が言ってる利点たち。


**SFCの利点1**
>・使い慣れた HTML、CSS と JavaScript 構文を使用したモジュール化されたコンポーネントの作成


**SFCの利点2**
>・本質的に結合された関心の連結

どゆこと～。読み進めるとこんな記事がありました↓
>現代の UI 開発では、コードベースを互いに織り交ぜる 3 つの巨大なレイヤーに分割するのではなく、それらを疎結合なコンポーネントに分割して構成する方がはるかに理にかなっていることが分かっています。コンポーネント内では、そのテンプレート、ロジック、およびスタイルが本質的に結合されており、それらを連結することで、実際にコンポーネントがよりまとまり、保守しやすくなります。
単一ファイルコンポーネントのアイデアが好まない場合でも、src でのインポート を使用して JavaScript と CSS を別々のファイルに分割することで、ホットリロードと事前コンパイル機能を活用できることに注意してください。
https://ja.vuejs.org/guide/scaling-up/sfc.html#what-about-separation-of-concerns

何言っているの。。。
「3ファイルに分けるんじゃなくて、.vueに纏めたら保守しやすいよ」ってことかなあ。
![2_slide01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322523/04fb8eed-5353-7da9-6c0a-044b4a94ae0f.jpeg)
違ったら教えてください。


**SFCの利点3**
>・ランタイムのコンパイルコストがかからない事前コンパイルされたテンプレート

コンパイルにかかる時間が短くて済むってことかなーっと理解。


**SFCの利点4**
>・コンポーネントスコープのCSS

AコンポーネントにBコンポーネントを読み込んだ時に(やり方はまだ知らない)、
Aコンポーネント側に\<style scoped> と書けば、
Bコンポーネント側のexampleクラスを持つ要素には影響しない、というものらしい。

```vue:A.vue
<style scoped>
    .example {
        color: red;
    }
</style>

<template>
    <div class="example">あはははは</div>
</template>

```
だが、.example:deep とすれば子コンポーネントに継承することもできるって書いてある。これは追々勉強します。


**SFCの利点5**
>・Composition API を使用する場合のより人間工学的な構文

ワケワカメで諦めかけたそのとき、こちらの記事に救われました。
参考: [なぜ、Vue Composition APIを使うのか、理解する【メリット/デメリットまとめ】](https://qiita.com/karamage/items/7721c8cac149d60d4c4a)
参考: [Composition APIを使って感じた「これどうなの？」](https://zenn.dev/844/articles/facd083b7df63e)

Vue学習1日目なので全然深いところは分かりませんが、
ロジック(script)をコンポーネントから切り離して、ロジックを再利用可能にするAPIらしいです。


**SFCの利点6**
>・テンプレートとスクリプトを相互分析することによるコンパイル時の最適化の強化

いい感じにコンパイルされるってことかなーっと理解。


**SFCの利点7**
>・テンプレート内の式のオートコンプリートと型チェックによるIDE のサポート

VSCodeにVolar拡張機能を入れると、シンタックスハイライトとかをサポートしてくれる。


**SFCの利点8**
>・すぐに使用できるホットモジュールリプレイスメント（HMR）のサポート

:::note info
**ホットモジュールリプレイスメント**
ページ全体を更新しなくても、実行時にブラウザ内のモジュールを自動的に更新することで開発者体験を向上させる仕組み
:::

# 頭がパンクしそうなので一旦休憩
え、凡人には難しすぎる。。。
世の中のWebエンジニアってこんな難しい技術を使えるんだ～っと尊敬します。
もっと若いうちに勉強しときゃよかった。ドドリアこれからも頑張るぴょん♪
Jekyll　config.ymlで使えるオプション15個

## config.ymlで使えるオプション15個

- **title**: サイトのタイトルを設定

- **description**: サイトの説明を設定

- **url**: サイトのベースURLを設定

- **baseurl**: サイトのベースURLのパスを設定

- **theme**: 使用するテーマを指定

- **permalink**: パーマリンクの形式を指定

- **exclude**: サイトのビルド時に除外するファイルやディレクトリを指定

- **include**: サイトのビルド時に含めるファイルやディレクトリを指定

- **markdown**: Markdownの処理に関するオプションを指定

- **paginate**: ページネーションの設定

- **plugins**: 使用するプラグインを指定

- **collections**: コレクションの設定

- **defaults**: 特定のタイプのファイルに対してデフォルトのフロントマターを指定

- **include**: ビルド時に追加で含めるファイルやディレクトリを指定

- **exclude**: ビルド時に除外するファイルやディレクトリを指定

:::note
config.ymlで設定できるオプションの一部
config.ymlファイルはJekyllプロジェクトの設定をカスタマイズするために使用されるファイル
Teradata Vantage にてマニュアルデータを SELECT 文で表示する方法

## 概要

関数の検証時などにマニュアルで用意したデータを SELECT 文で表示する方法（どういう名称で呼ぶべきものなのかが不明）を、Teradata Vantage で実施する方法を共有します。Oracle Database では DUAL テーブルを主に利用して実施したり、その他のデータベースであれば FROM 句にてテーブルを指定せずに SELECT 句を記載することで実施したりします。Teradata Vantage では、複数カラムを生成する際には、ダミーの FROM 句を用意することで想定通りに動作するようです。

## コードと実行結果

```sql
WITH SRC AS (
    SELECT 'A' AS NAME,
        CAST(100 AS INT) AS AMOUNT,
        CAST('2020-01-01' AS DATE) AS TRANSCATION_DATE
        FROM (
        SELECT 1 AS DUMMY) AS "DUAL"
    UNION ALL
    SELECT 'B',
        200 AS AMOUNT,
        CAST('2020-02-01' AS DATE) AS TRANSCATION_DATE
        FROM (
        SELECT 1 AS DUMMY) AS "DUAL"
    UNION ALL
    SELECT 'C',
        300 AS AMOUNT,
        CAST('2020-02-01' AS DATE) AS TRANSCATION_DATE
        FROM (
        SELECT 1 AS DUMMY) AS "DUAL"
    )
    SELECT
        *
        FROM 
        SRC;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/62eb58ff-6fa6-76dd-4b08-9d85093ced44.png)


## 参考リンク

- [sql - What is Teradata's equivalent for Oracle's DUAL - Stack Overflow](https://stackoverflow.com/questions/49901803/what-is-teradatas-equivalent-for-oracles-dual)
鍵のお話

# AWS KMS(Key Management Service)
データの暗号化に利用する暗号化キーの作成・管理を行うためのマネージドサービス。AZをまたいだ冗長化により高可用性を担保することし、CMK(マスターキー)の耐久性は99.999999999％(イレブンナイン)

![kms](https://docs.aws.amazon.com/crypto/latest/userguide/images/key-hierarchy-cmk.png)

## 特徴
+ IAMと連携して鍵のアクセス管理を実施
+ CMKの無効化・有効化・削除を実施し、1年ごとの自動キーローテーションすることが可能
+ 外部から持ち込んで管理できる
+ CloudTrailと統合されており、全てのキーの使用ログを表示
+ EBSと統合することで低レイテンシーとスループットを高め、リアルタイムでの暗号化/復号化が可能
+ **リージョンごとに設定し利用する**

## 鍵の種類
| 名前 | 内容 |
|:-:|:-:|
| CMK(カスタマーマスターキー)  | 暗号化を実行する上で最初に作成されるマスターキーで**紛失するとデータにアクセスできなくなる**。暗号化キーを暗号化し、ローテーションされる。  |
| 暗号化キー(カスタマーデータキー)  | 実際のデータの暗号化に利用されるキー。KMSで生成されてCMKで暗号化される  |
| エンベロープ暗号化  | CMKで暗号化せずに、暗号化キーを利用して暗号化する暗号化方式。データが4KB以上の場合に利用する  |
|  Customer managed keys  | KMSで作成したキー。ユーザーが所有、管理を行う。ユーザー自身が暗号化キーを運用する  |
|  AWS managed keys  | KMSがキーの作成、管理を行う。**CloudTrailによって監査を行える**。管理やアクセス許可の変更はできない|
|  AWS owned keys  | デフォルトの暗号化タイプで、AWSが所有、管理を行う。表示、管理、監視することはできない。**料金発生なし**




### キーローテーション
有効にすることで新しい暗号化マテリアル(素材)を**毎年生成**する。古い暗号化マテリアルは全て永続的に保存・復号化可能。

::: note info
新しいKMSキーを作成して1つのKMSキーを別のものと置き換える**手動ローテーション**も可能
:::


### マルチリージョンキー
複数のリージョンで同じキーのように相互で使用できる。1つのリージョンで暗号化し。再暗号化やKMSへのクロスリージョン呼び出しを行うことなく異なるリージョンで復号が可能。



# Cloud HSM
不正使用防止策がとられている専用ハードウェアモジュール。国際標準に遵守した暗号化キー管理を実施。

+ AWSが提供する業界標準「FIPS140-2 Level3」のセキュリティに準拠した暗号化ハードウェア
+ 複数AZに分散したCloudHSMクラスターを利用
+ 暗号化キーの管理はユーザーが実施。SSE-Cを強化

![HSM](https://d1.awsstatic.com/whiteboard-graphics/products/CloudHSM/product-page-diagram_AWS-
CloudHSM_HIW_jp.023bae592aefc5ea501c34b63922af07af990547.png)

### ユースケース
+ **webサーバのSSL/TLS処理をオフロードする**
SSL/TLSパブリックキー証明書を使用して、各クライアントとのHTTPSセッションを確立する際webサーバにとって多くの計算を必要とする。計算の一部をオフロードすることで、webサーバの計算負荷が軽減されサーバーのプライベートキーをHSMに保存することでセキュリティが強化される

+ **発信元の認証機関(CA)の秘密キーを保護する**
+ **Oracle データベースの透過的なデータ暗号化 (TDE) を有効にする**






# AWS Encryption SDK
業界標準とベストプラクティスに従って、誰もが簡単にデータの暗号化と復号を行うことができるように設計されたクライアント側の暗号化ライブラリ。Apache 2.0ライセンスに基づいて、無償で提供される。
利用することで、暗号化の制限を超過しないようなリクエスト処理の仕組みを構成して修正することも可能

# 参考

https://aws.amazon.com/jp/builders-flash/202210/awsgeek-kms/?awsf.filter-name=*all
Xcode CloudのビルドでTestFlightのテストノートを自動記載する

待ってた

詳細はこちら
[Including notes for testers with a beta release of your app](https://developer.apple.com/documentation/xcode/including-notes-for-testers-with-a-beta-release-of-your-app)
動画はこちら
[What’s new in Xcode 15](https://developer.apple.com/videos/play/wwdc2023/10165?time=1117)

## 以前はどうだった
XcodeCloudによるTestFlightビルド作成時は
↓こんな感じで空白となっており、利用者に通知するテストノートは自力で記載する必要がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/f5750dc9-ba6f-f627-405e-4eb3cf36e8dd.png)

[How can I set TestFlight test notes for XCode Cloud builds?](https://developer.apple.com/forums/thread/711208)などでXcodeCloudでテストノートの自動記載は出来ないの？みたいなディスカッションがちらほらあったりなかったりしましたが、結局今は無理そうだねって感じでした。

## どうなった
WWDC2023で今回の機能が新しく追加されたようです。

プロジェクトにTestFlightグループを追加し、その中に変更内容を記載したファイルを追加することでXcodeCloudによるTestFlightビルド作成時に自動でテストノートを記載してくれるようになったようです。

### スクリーンショット
プロジェクトフォルダ
![スクリーンショット 2023-06-22 14.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/6a78938a-35b3-984d-d555-e06ed8f96563.png)

ファイルに記載する本文（日本語が混ざっていてOKっぽい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/92bd9f70-1531-fb52-64b4-55d6b0cbe341.png)

テストノート（2024.02.22追記：審査通っていないと自動反映されない…？もしくはApp Store Connectのバグ？※TestFlightアプリではテストノートが正常に表示されている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/e5922591-b019-c278-c421-48e6e0a8013c.png)

TestFlightアプリ
![IMG_DDD1920B0784-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/c7c366f8-10e0-8d57-2316-1c876f1bc812.jpeg)



## その他
日本語で指定したい場合はファイル名どうすんだろう。
WhatToTest.JP.txtで良いのだろうか…？

-追記-
~~`WhatToTest.ja-JP.txt`はだめだった。~~
→`WhatToTest.en-US.txt`で日本語表記があっても問題なかったです。

## - 2024/11/05追記 -
[コメント](https://qiita.com/chitosws/items/ef9f54946bcab4219a41#comment-58d543c00eef57bd08ec)で↑の`WhatToTest.ja-JP.txt`で上手くいかない場合の解決方法をご教授いただいたので追記します。コメントありがとうございます🙏

解決方法は`WhatToTest.ja-JP.txt`ではなく、`WhatToTest.ja.txt`を生成することでApp Store Connect上でも日本語で確認することができるようになります。
![App_Store_Connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/db93d2b4-089f-81c1-b53a-04680f837000.png)
aerospike-serverでCREATE INDEXが起動時に実行されない

# はじめに

最近Aerospikeを触ることがあり、その中で起きた問題について簡単にまとめます

# 問題

以下のファイルを用意しました

```aql:insert
INSERT INTO test.log (PK, user, timestamp) VALUES ('12', 'user1', 1554516055000)
CREATE INDEX timestamp_index ON test.log (timestamp) NUMERIC
```

そしてaerospike-serverのコンテナの中で以下のコマンドを実行します

```
$ aql -f /data/config/aerospike/log-as/insert
```

ここでインサートはしっかり実行されるのですが、INDEXは作成されませんでした

```
$ SHOW INDEXES
// 何も表示されない
```

# 解決方法

insertファイルの最後に1行空白行を追加するとうまくいきました

```aql:insert
INSERT INTO test.log (PK, user, timestamp) VALUES ('12', 'user1', 1554516055000)
CREATE INDEX timestamp_index ON test.log (timestamp) NUMERIC

```

# おわりに

なぜ1行追加して動くのは謎ですが、こういう事象が以前にもあったとお話を聞きました
【2023年06月版】Ubuntu22.04 で Samba で Windowsとファイル共有

# はじめに

Ubuntu側でファイル共有サーバを作りたいな。。。

そうだ、Samba しよう

# 前提条件

- 環境

```terminal
$ uname -a
Linux smb_host 5.15.0-75-generic #82-Ubuntu SMP Tue Jun 6 23:10:23 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
```

- 共有するフォルダ
  `/export/smb_share`

- UbuntuのサーバのIPアドレスは、`192.168.100.100`

# インストール

```terminal
$ sudo apt update
$ sudo apt install samba
$ samba --version
Version 4.15.13-Ubuntu
```

# 設定

- samba の設定ファイルを編集する

```terminal
$ sudo vim /etc/samba/smb.conf
  :
  :
; printers セクションをコメントアウト
;[printers]
;   comment = All Printers
;   browseable = no
;   path = /var/spool/samba
;   printable = yes
;   guest ok = no
;   read only = yes
;   create mask = 0700
  :
  :
; print$ セクションをコメントアウト
;[print$]
;   comment = Printer Drivers
;   path = /var/lib/samba/printers
;   browseable = yes
;   read only = yes
;   guest ok = no
  :
  :
[shared]
   comment = ubuntu22.04 share
   path = /export/smb_share
   available = yes
   read only = no
   browsable = yes
   public = yes
   writable = yes
   guest ok = yes
```

- samba の設定ファイルの編集内容をチェックする

```terminal
$ testparm
```

- 設定ファイルの修正にミスって、デフォルトに戻したいときは `/usr/share/samba/smb.conf` からコピーすれば良い

```terminal
$ sudo cp /usr/share/samba/smb.conf /etc/samba/smb.conf
```

- フォルダの権限を設定する

```terminal
$ sudo chmod 777 /export/smb_share
$ ls -alt /export/smb_share
total 16
drwxr-xr-x 1 root root  0 Jun 22 14:29 .
drwxr-xr-x 1 root root 18 Jun 21 19:47 ..
```

- 必要であれば、ufw の 139 と 445 を開ける

```terminal
$ sudo ufw allow 139/tcp
$ sudo ufw allow 445/tcp
```

# サービスの再起動

```terminal
$ sudo systemctl restart smbd
```

# サービスの自動起動の設定

```terminal
$ sudo systemctl enable smbd
$ sudo systemctl enable nmbd
```

# 動作確認

Windows端末から、`//192.168.100.100/shared` で共有を開く

# さいごに

かんたんでしたね