OmniAICreator/Qiita-1.07M huggingface dataset:
🔰アプリを公開までやりたい

## 簡単に自己紹介
・22卒 SE 男 24
・飽きっぽい
・眠い

## なぜやりたいと思ったのか？
・自分の知識が乏しいと感じる
・自信にしたい
・アウトプットする習慣をつけたい
・自分のアイデアを形にすることに魅力を感じた

## やりたいこと
一段階
・アプリ作成
・公開

二段階
・改良を重ねる
・FB

## 方針・意気込み
・使用するサービス・技術の理解をしながら進める
・分からないけど何となく動いたは、NG
・諦めない・・！！
仕事のポリシー

# はじめに
私が常日頃考えている仕事のポリシーについて、以下のようにカテゴライズして言語化してみました。個人的な考えですが、参考になれば幸いです。ご指摘やコメントなどあれば是非いただければと思います。

* [業務/技術](https://qiita.com/kotacky/items/85f8081cc588dd9d9b03#%E6%A5%AD%E5%8B%99%E6%8A%80%E8%A1%93)
* [育成](https://qiita.com/kotacky/items/85f8081cc588dd9d9b03#%E8%82%B2%E6%88%90)
* [営業](https://qiita.com/kotacky/items/85f8081cc588dd9d9b03#%E5%96%B6%E6%A5%AD)
* [会議、ミーティング](https://qiita.com/kotacky/items/85f8081cc588dd9d9b03#%E4%BC%9A%E8%AD%B0%E3%83%9F%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)
* [メール、チャット](https://qiita.com/kotacky/items/85f8081cc588dd9d9b03#%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%81%E3%83%A3%E3%83%83%E3%83%88)

※随時、改善アップデートしていく予定です。

# 業務/技術
* 定期的に本屋の技術書、ビジネス書コーナーを巡る。
* [カラーバス効果](https://makitani.net/shimauma/color-bath)を期待してアンテナを張る。
* 業務や技術に強い人と仲良くなる。
* 新しく知ったことを自分の言葉に変換して誰かに伝える。
* トレンドの技術やツールはとりあえず試してみる。

若手のうちは、まずは自信のある業務や技術を身につけることが大事ですが、そのうち刀は錆びるので、インプットする習慣をつけておき、**刀が自然と研がれた状態**にしておくことが肝要かなと考えています。学習は「努力」ではなく「習慣」だと思います。

# 育成
* 人に教えるときは、まずは相手が何をわからないのかを自分が理解する。
* 難しい用語や横文字は避け、相手のレベルに応じた言葉を使う。
* 失敗から学ばせる。失敗は責めない。
* 説明するときは図示して解説する。

# 営業
* 契約に関係なくプロジェクトに関わる人と仲良くなる。
* 名刺交換をした人には御礼のメールを送る。
* 名刺は捨てない。ファイリングする。
* 人の名前を間違えない。「斉藤」「斎藤」等の変換にも気をつける。
* お酒、麻雀等のプライベートな付き合いも仕事と捉える。

# 会議、ミーティング
* アジェンダを準備する。
* 時間通りに開始して、予定より早く終わる。
* 2時間以上やらない。長丁場の時は90分程度で休憩を挟む。
* 発言しない人は参加不要。無駄に人を集めない。
* 儀式的にやらない。開催意義を毎回考える。
* 定例であっても議題や開催意義がないときはスキップする。
* 聞いてるだけだと眠くなるので進行の妨げにならない程度に「へぇ」「なるほど」等、何かしゃべるようにする。
* 積極的に自らファシリテートする。
* ボケられるときは隙をみてボケる。ツッコミも同様。
* 出来る限り質問する。自分なりに解釈したことを自分の言葉にする。
* 相手を不快にしない枕詞
    * 「的外れだったらすみません」
    * 「認識違ってるかもしれないのですが」
    * 「聞き洩らしたかもしれないのですが」

# メール、チャット
* 即レスポンスする。悩んだら負け。
* ボールはすぐに打ち返して手元に持たない。
* 後回しにする目的でToDoフラグやピン留めを使わない。
* 見たら何かしらリアクションする。既読スルーしない。

以上、何かの参考になれば幸いです。
[bootstrap5] modalが画面からはみ出すサイズなのにスクロールしない場合

# 

# 原因
modalの中でformタグなど既定のdisplay属性がblockであるタグを使ったり指定したりしていませんか？

# 対策
### 1: formは.modalの外に設置する
```html:
<div class="modal" ... >
    <div class="moda-dialog modal-dialog-scrollable" ... >
        <div class="modal-content">
            <form> ←こういう場所に設置するのはあまり良くない
                <div class="modal-body"> 
                ：
                </div>
            </form>
```
↓↓↓↓
```html:
<form> ←ここの方が良い
    <div class="modal" ... >
        <div class="moda-dialog modal-dialog-scrollable" ... >
            <div class="modal-content">
                <div class="modal-body"> 
                :

</form>
```


### 2: modal内部のformはdisplayをcontentsに変更
今更formの場所を動かせないならこの方法で。
display:contentsはタグ自身でボックスを作らず子要素にまかせるというもの。こうするとmodal側で正常にスクロール出来るようになります。
あまりおすすめしませんが、cssで.moda-dialog内のformに呼応するようにすれば最小限の修正で対応可能。

```css:
.modal-dialog form {
	display: contents;
}
```
Webアナリスト検定受験記録

今回は過去自社内で受けたGoogle Analytics研修の復習・マーケティングの基礎知識を身につけるという目的で、「Webアナリスト検定」を受験してきました。

# 受験前時点でのスキル
私は現在データアナリストとして仕事をしており、Webアナリスト検定の対象であるGoogleアナリティクスについてはGAIQに合格しているレベルになります。なので、ある程度のマーケティングスキルを身に着けている状態で受験しました。

# 試験概要

試験概要は以下になります。
問題数：70問（7セクション構成で各10問）
試験方法：CBT方式
試験時間：80分
合格ライン：100点満点中75点以上かつ、各セクション正答率が40％以上
受験料：開催企業によって異なる
        東京の場合→株式会社Too、講座＋試験＝22,325円、試験のみ＝17,600円

合格率は約80％とかなり高いです。基本的には語句問題が選択式で出題され、全体で6,7問ほど計算問題が出題されるような問題形式となります。試験結果は受験後すぐ確認でき、各セクションごとの正答率をチェックできたり合格証明書もその場で獲得できます。

# 使用教材
★[**Webアナリスト検定公式テキスト**](https://www.amazon.co.jp/JWA%E5%85%AC%E8%AA%8D-Web%E3%82%A2%E3%83%8A%E3%83%AA%E3%82%B9%E3%83%88%E6%A4%9C%E5%AE%9A-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E3%83%97%E3%83%AC%E3%83%9F%E3%82%A2%E3%83%A0%E3%83%96%E3%83%83%E3%82%AF%E3%82%B9%E7%89%88-%E6%97%A5%E6%9C%ACWeb%E5%8D%94%E4%BC%9A/dp/4839956197)

全体の勉強時間の7割はこのテキストを使用しました。主催であるJWA日本Web協会が推奨している公式テキストですが、ここから問題が穴埋め形式で出題されます。極論このテキストを全て覚えば満点を取れます。ですが効率は悪いので試験前に公式で開催している講座を受講するのをおすすめします。

★**自社内で共有された問題集**
こちらは私が所属する会社の社員さんが作成してくださった対策問題集になります。講座を受講すれば要点をまとめた資料をもらえるらしくそれを覚えれば余裕で合格できると言われていますが、私は問題集を信じ受講せず試験のみ申し込みました笑

自習時間はほぼ1日程度の時間で、問題集を解きながらテキストを確認して覚えていく流れで進めました。（正直もっと時間を確保してじっくり勉強すれば満点取れたかもしれません）

# 試験結果

試験結果は....無事「**合格**」！
最初の20分で解き終わり20分ほど見直しの時間にしたので約40分で試験を終了しました。点数の比率はこんな感じでした。

合格　　76 / 100点満点
１．Webアナリストとは　　　　　　　　　　13点　　　正答数：9 / 10
２．目標設定・ボトルネックの特定　　　　　14点　　　正答数：10 / 10
３．集客・流入　　　　　　　　　　　　　　10点　　　正答数：7 / 10
４．回遊　　　　　　　　　　　　　　　　　10点　　　正答数：7 / 10
５．コンバージョン　　　　　　　　　　　　13点　　　正答数：9 / 10
６．リテンション　　　　　　　　　　　　　6点　　　 正答数：6 / 10
７．デジタルマーケティング概論　　　　　　10点　　　正答数：7 / 10

こうやってみると結構危ない点数でした...
各セクションごとで4割の正答率を確保している必要があるので、最低でも各4問ずつは正解しないといけません。そこから全体で75点以上が合格ラインなのであと1,2問不正解かリテンションの項目で1問落としていれば不合格でした。（冷や汗もの....）
今回はかなり短時間での学習となってしまい、暗記が浅い状態で試験に臨みましたが選択式の問題だったこともありある程度は感覚で解くことが出来ました。また、もともとマーケティングの知識を多少なりとも持っている人であればより楽に解けるのではないかと思います。
「ログイン成功後に毎回XXXを実行したい」をSpring Securityで実装する

## ログイン成功後にXXXを実行したい
- ログイン成功後、ユーザー情報のログを出力したい
- ログイン成功後、〇〇を満たすユーザーはXXにリダイレクトしたい

こうした要望をSpring Securityを使って実装するための方法を紹介します。

私の調べた限り、`AuthenticationSuccessHandler`と`AuthenticationSuccessEvent`の2種類の実装方法が存在しました。

## versions
- Spring Boot 3.2.3
- Spring Security 6.2.2

## AuthenticationSuccessHandler
まずは`AuthenticationSuccessHandler`を継承したカスタムのハンドラクラスを作成します。
```java:CustomLoginSuccessHandler
@Component
public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response,
        final Authentication authentication) throws IOException, ServletException {
        response.sendRedirect("/");
    }
}
```

そして、Spring Securityでおなじみの`SecurityConfig`の`securityFilterChain`の中で`successHandler`メソッドを使って先ほどのハンドラをセットします。

```java:SecurityConfig.java
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final CustomLoginSuccessHandler customLoginSuccessHandler;

    @Bean
    public SecurityFilterChain securityFilterChain(final HttpSecurity http) throws Exception {
        http //
            .oauth2Login(oauth2Login -> oauth2Login//
                .loginPage("/oauth2/authorization") //
                .successHandler(customLoginSuccessHandler)//
            );
        return http.build();
    }
}
```

こうすることで、Spring Securityによる認証が成功した後に`successHandler`で指定した`customLoginSuccessHandler`の処理が呼び出されることになります。


## AuthenticationSuccessEvent
`AuthenticationSuccessEvent`はアプリケーションでの認証成功を検知し起動するイベントです。
認証失敗を検知する`AuthenticationFailureEvent`も存在します。


```java:AuthenticationEvents.java
@Component
@Slf4j
public class AuthenticationEvents {
    @EventListener
    public void onSuccess(AuthenticationSuccessEvent success) {
        log.info("Authentication is succeeded.");
    }
}
```

注意点として、`onSuccess`メソッドの中では`SecurityContextHolder.getContext().getAuthentication()`がnullを返します。
これは、SecurityContextHolderに認証オブジェクト（Authentication object）がセットされる前に`onSuccess`が呼ばれていることを意味しています。

また、`AuthenticationEvents`ではリダイレクトなどのHTTPレスポンスを直接いじるような処理は実装できず、そうした処理は`AuthenticationSuccessHandler`で実装するのがbetterです。

#### 参考

https://spring.pleiades.io/spring-security/reference/servlet/authentication/events.html
[sshdump] Remote capture command で sudo -S するときは Remote capture command selection を Other にする

# 結論

Remote capture command で `echo [password] | sudo -S tcpdump [filter]` するときは、 `Remote capture command selection` を `Other` にする

![Wireshark sshdump settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429472/da4ad8fc-c38c-b7bc-a7b2-133eb7901061.png)

# sshdumpについて
sshdumpは、SSH接続先のホストでパケットキャプチャをし、WiresharkのGUI画面で表示できるコンポーネントです。

接続先ホストでのtcpdumpの実行にroot権限とパスワード入力が必要な場合、sshdumpの設定画面でRemote Capture Commandに `echo [password] | sudo -S tcpdump [filter]` という形式でコマンドを入力します。

https://qiita.com/fkshom/items/c461f62f02e7451a1e13

# エラー内容

`Wireshark4.2.3` on `macOS Sonoma 14.3.1` で上記記事の通りの設定を行ったところ、以下のエラーが出ました。

> Error from extcap pipe: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
> sudo: a password is required

![Error Message from Wireshark](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429472/e57205cc-e450-0de2-37ca-6f6f9f7f0644.png)

# 解決方法

エラー発生時、上記記事のスクリーンショットには存在しなかったオプションである `Remote capture command selection` が `tcpdump` になっていました。
`Remote capture command selection` を `Other` にすると、エラーが表示されず、キャプチャに成功しました。

# 参考：CLIコマンドとの対応

sshdumpにはCLI版があり、 `Remote capture command selection` と `Remote capture command` はそれぞれ `--remote-capture-command-select` オプションと `--remote-capture-command` オプションに対応するものと思われます。

[sshdumpのドキュメント](https://www.wireshark.org/docs/man-pages/sshdump.html)の `--remote-capture-command-select` の説明には、以下の記載があります。

> The selection of the build-in support for remote capture commands. Either dumpcap for a remote capture command using dumpcap, tcpdump for a remote capture command using tcpdump, or other, where the remote capture command is to be given with the --remote-capture-command option.

`--remote-capture-command-select` で `tcpdump` を選択すると、ビルドインのtcpdumpが使用され、 `--remote-capture-command` でのコマンド指定が無視されてしまうようです。今回のエラーは、同様のことがWireshark上のsshdumpでも起きたものと考えられます。
TeraTerm5でgetpasswordを利用してパスワードを読み込めない

# 事象

TeraTerm 5.0 ～ 5.2 で `getpassword` を使用すると、パスワードファイルのパスに日本語を含む場合はパスワードを読み込めない。

# 対応策

パスワードファイルの保存場所のパスに日本語を含まないようにする。
もしくは2024年3月17日に対応されているので**バージョン 5.3 からは本事象は起きないはず**。

# 詳細

TeraTerm でパスワード認証の ssh 接続する際に毎回パスワード入力するのは面倒くさいのでマクロにしている。
その際、パスワードをベタ打ちするのは避けたかったので以下のように [getpassword](https://teratermproject.github.io/manual/5/ja/macro/command/getpassword.html) コマンドを利用している。

```:sample.ttl
username = 'ユーザ名'
hostname = 'IPアドレス'
port = ポート番号
passwdfile = 'password.dat'

; password.dat からパスワードを読み込む
; 見つからなければ入力ボックスを開く
getpassword passwdfile username userpasswd

sprintf2 msg '%s:%d /ssh /auth=password' hostname port
sprintf2 msg '%s /user=%s /passwd=%s' msg username userpasswd

connect msg
```

これにより初回のみパスワードの入力が求められ、指定のファイルに暗号化した状態で保存される。
次回からはファイルから読み取られるのでパスワード入力は不要となり、パスワードファイルを開いても暗号化されているので平文で見えることが無くなる。
しかしこのマクロを**バージョン 5.2** で動作させたところ、パスワードファイルが存在していてパスワードが保存されているにも関わらず**毎回パスワードの入力が求められる**ようになってしまった。

# 原因

パスワードファイルが Unicode 対応しておらず、これによりパスに日本語を含む場合に正常に読み取れなくなっていたとのこと。

issue (解決済み)：https://github.com/TeraTermProject/teraterm/issues/161

私の場合はマクロを `C:\～略～\TeraTerm接続マクロ` 配下に置いていたので不具合が発生した。
対応としては前述の通りパスから日本語を消せばよい。
もしくは上記 issue の対応が2024年3月17日時点でマージされているので、バージョン 5.3 からは解決しているはず。
Spotify のアルバムをランダムに聴くためのPWAを作成

# はじめに

SpotifyのAPIを用いてランダムなアルバムを再生するためのPWAを開発しました。（現在はまだBeta版）
[Phonograph](https://phonograph.vercel.app/)
利用にはSpotifyアカウントが必要です。
GitHub Repository: https://github.com/kenjiwilkins/phonograph

## 背景

音楽のストリーミングサービスが始まってシングル楽曲をプレイリストでシャッフルして聴くことが一番多いと思います。
CDをアルバム単位で聴いていた世代としては、たまに何でもいいからアルバム単位で音楽を聴きたくなる時があります。しかし、**LIKE**したアルバムの中から適当なアルバムを再生する機能がなく、自分で作ってみました。

現在の機能としては、

* ユーザーのLIKEしたアルバム一覧から任意・ランダムなアルバムを再生する
* ユーザーの作成したプレイリストから任意・ランダムな楽曲の収録されているアルバムを再生する

上記のふたつの機能を搭載しています。
SpotifyはWeb Playerも提供しているので再生も考えましたが、音楽体験はNativeアプリなどの方が良いため、このアプリはあくまで再生までのブリッジとするスコープにしました。

## Tech Stack

* Build&Dev server - [Vite](https://vitejs.dev/)
* Frontend framework - [Vue](https://vuejs.org/)
* State Management - [pinia](https://pinia.vuejs.org/)
* Styling - [Tailwind CSS](https://tailwindcss.com/)
* Code Formatter - [Prettier](https://prettier.io/)
* Unit Test - [Vitest](https://vitest.dev/) + [Testing-library/vue](https://testing-library.com/docs/vue-testing-library/intro)
* CI - [GitHub Actions](https://github.com/features/actions)
* PWA - [Vite PWA](https://vite-pwa-org.netlify.app/)

## 開発上で気にした部分

最低限の機能とかは早々に開発できたんですが、期限切れのトークンの扱いや、認証に失敗した場合の処理などに時間がかかった形でした。
またアルバムやアーティスト画像の形を変えたり、一部隠すようなアイコンをつけるデザインなどはSpotify APIの規約で禁止されているので、エフェクトやスタイルではその辺り気をつけました。

## 現在の課題・今後の機能

### Lintの導入

Lintを導入してCIに組み込みたかったのですが、最新のeslintが開発環境でエラーを吐いており、原因を見つけるのに時間がかかりそうだったのでCIから見送りました。

### Unit testの充実

とりあえず導入しただけなのでカバレッジはまだまだ低い、`/src` 配下のファイルだけでも全項目80%以上のカバレッジを目指したいです。

### プレイリスト一覧の充実

現在のプレイリストの一覧はAPIのエンドポイントが違うため、ユーザーが作成したプレイリストのみになっていてLIKEしたプレイリストは入っていません。どちらも取得できるようにしたいですね

### 再生履歴

再生履歴からアルバムを選択できる機能があっても良いかと思います。

### Transition APIの導入

折角のPWAなので[Transition API](https://whatpwacando.today/view-transitions)を用いてNative-likeな挙動を実装したいですね。

### コンポーネントの共通化

いくつかまとめられそうなコンポーネントを今のうちに分けておけるようにリファクタリングしておかないと、後から地獄になりそうです。

### Figma設定

デザインをfigmaで作成して確認できるようにしたいです。ついでにtailwindとfigmaのdev modeが噛み合うか模索したいですね。

# 最後に

なんとなく作ってみてオープンに新機能やFixしていきたいので、なにかのレポジトリにコミットしてみたいという方ウェルカムです。
下から上まで指定した範囲で空白行を挿入

```vb
Sub InsertBlankRowsAtIntervals()
    Dim ws As Worksheet
    Dim lastRow As Long, n As Long, i As Long
    Dim colC As Long, lastCol As Long
    
    ' カスタマイズ可能な変数
    n = 5 ' ここでnの値を設定します。n行ごとに空白行を挿入
    
    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' C列での最後の行を取得
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' 最後の列を取得
    
    ' 最後の行から始めて、n行ごとに繰り返し
    For i = lastRow To 2 Step -n
        ws.Rows(i + 1 & ":" & i + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        ' 挿入した空白行のC列から右端までの範囲を選択
        ws.Range(ws.Cells(i + 1, 3), ws.Cells(i + 1, lastCol)).Select
    Next i
End Sub
```
LLMメッシュに加わったLLMコストガードの紹介

[大規模言語モデル（LLM）](https://blog.dataiku.com/large-language-model-chatgpt)に関して言えば、多くのITチームリーダーは「全体のコストはどれくらいになるのか」という問いに対処しようとしています。

LLMを使った実験が日常的に実施される中、多くのチームが使用に関するポリシーや内部手続きを開発し始めると、予期せぬ請求に直面する話を聞くことがあります。企業全体でさらに多くのチーム、ユースケース、アプリケーションが登場するにつれて、ITチームは、企業が投資から最大限の利益を得ていることを保証し、収益に大きな影響を与える前に使用パターンの問題を特定できるように、パフォーマンスとコストを簡単に監視する方法が必要です。

## LLM使用に関連するコスト
一般的に、LLMに関連するコストは、組織によって次の２つのうちいずれかに分類されます：
1: OpenAI、Meta、MistralなどのプロバイダーからAPIを介して商用モデルにアクセスする
2: HuggingFaceのようなハブからダウンロードしたオープンソースモデルをセルフホスティングする

### API経由で商用モデルにアクセスする
コストが大きく異なる理由の一部は、商用モデル間で標準化された価格設定がないためです。データチームが最適なパフォーマンスを測定するために異なるモデルで実験を試みる際、財務への影響を十分に注意していないかもしれません。

これらのタイプのモデルの価格設定は、通常、トークンに基づいており、これはおおよそクエリと応答の両方の単語数と一致しています。簡単に言うと、LLMに入力した各単語と、LLMが返す各単語に対して支払います。

### セルフホスティングされたLLM
セルフホスティングされたLLMは、時としてコストが低い代替手段と見なされます。しかし、独自のインフラストラクチャ上でモデルをホスティングすることで、サーバー費用と、特定の目的のためにモデルをカスタマイズし、時間とともに更新するための高度にスキルを持つ人々のコストを直接支払うことになります。大規模なGPUやその他のハードウェアコンポーネントのコストは言うまでもありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/3cccc8ef-42f3-4464-0312-3ef63790c57e.png)

## Dataiku LLMコストガードとLLMメッシュがどのように役立つか
LLM使用に関連するさまざまなコストがある中で、ITチームと管理者は、財務への影響を積極的に予測し管理できるように、LLMのコストとパフォーマンスを簡単に監視する方法が必要です。LLMコストガードは、チームがコストを監視し管理する手段を提供します（アプリケーション、サービス、ユーザー、またはプロジェクトごと）および問題を診断します。

### 監査ログ
[以前のブログ記事](https://blog.dataiku.com/protecting-sensitive-data)でほのめかしたように、Dataikuは、管理者が「誰が何をしているか」を簡単に特定できる包括的な監査ログを提供します。LLMコストガードは、誰がどのLLMをどのサービスで、どの目的で使用しているかを完全に監査可能なログを提供し、コスト追跡（および内部再請求）とこれらの時によって予測不可能なモデルへのリクエストと応答の完全な追跡性を可能にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/8b116a8d-d58c-2435-41a8-561494627fbb.png)

### パフォーマンス監視
Dataiku LLMコストガードには、管理者がLLMサービスおよびプロバイダーの使用とコストを追跡できるようにする、事前構築されたパフォーマンス監視ダッシュボードが含まれています。このようにして、チームは問題を診断し、アプリケーションのニーズに基づいて最適なサービスを選択できます。

### キャッシング
LLMメッシュを使用して共通のクエリへの応答をキャッシュするオプションは、応答を再生成する必要を回避し、コスト削減とパフォーマンスの向上の両方を提供します。さらに、自己ホスティングする場合は、インフラストラクチャへのコストを削減するために、ローカルのhugging faceモデルをキャッシュする機能を持っています。


### コストとリソース使用レポート
LLMコストガードでコスト監視と使用レポートを簡単に読めるダッシュボードで探索し、最も多くの支出がある箇所を特定できます。コスト見積もりは、完了したプロンプトと応答のサンプルに適用された、ホステッドサービスの公開されている「ステッカー」価格に基づいています。ユーザー、接続、LLMタイプ、キャッシュ状態、コンテキストタイプ、プロジェクトキーなどを切り替えることができるため、問題を簡単に診断し、積極的に対応可能です。

これらの機能により、ITチームはLLMOpsを理解し、成功に向けた設定をし、最適なコストとパフォーマンスを保証できます。見ての通り、プロジェクトごとに選択するモデル、方法、または技術的アプローチに関係なく、DataikuのLLMメッシュは、企業全体での設定でこれらのソリューションを安全かつ効率的に提供する能力を持つ、あなたのすべてのアプリケーションに共通するレイヤーとして機能します。

## さらに進む LLMコストに関するWebinar
[Generative AI Bootcampシリーズの最新ウェビナー](https://events.dataiku.com/llm-cost)では、Dataiku CTOのClément StenacとTitanML CEOのMeryem Arikが、企業のユースケースにLLMを使用する際のテクニカル・トークを行い、コストとLLMの詳細について掘り下げます。

原文：[Introducing LLM Cost Guard, the Newest Addition to the LLM Mesh](https://blog.dataiku.com/llm-cost-guard)
いまさらだけどCakeEmailでGmailにメール送信できないときの対処法

まだCakePHP2を使っているサービスがあって、2024年2月中旬からGmailにメール送信しても届かなくなった。

サーバー：さくらインターネット
ドメイン管理：Value Domain

Gmailに送るとpostmaster@初期ドメインにエラーメールが届く

DKIM = did not pass
SPF [hoge@hoge.sakura.ne.jp] with ip: [xx.xx.xx.xx] = did not pass

さくらのページを見たらどうやらSPFを設定しないといけないらしい
-

https://help.sakura.ad.jp/gmail-troubleshooting/

https://help.sakura.ad.jp/notification/n-2636/

Googleのページを見てもSPFを設定しないといけないらしい
-
https://support.google.com/a/answer/81126

さくらのページに書いている通りValue DomainのDNS設定に
```
txt @ v=spf1 a:ホスト名 mx ~all
```
を入力してみる。

しかしGmailに届かない‥

届いていたころのGmailのメールソースを見ると
-
SPF NONE（IP: xx.xxx.xxx.x）

NONEだけど2024年2月まで届いていたらしい。

さくらに問い合わせる
---
「SMTP認証してくだいとのこと」

え、SPFの設定とかじゃないの？？？

Cakeの設定を見直してみる
-

こちらを参考

http://kwski.net/cakephp-2-x/1017/

```
/app/Config/email.php

class EmailConfig {
    // さくらインターネットを例
    public $sakura = array(
        'host' => '______.sakura.ne.jp',  // 初期ドメイン
        'port' => 587,
        'username' => 'username@______.sakura.ne.jp', // ユーザ名：
        // 初期ドメインのメールアドレスもしくは、独自ドメインのメールアドレス
        'password' => 'password',           // メールパスワード
        'transport' => 'Smtp',
    );
}
```
```

    $email = new CakeEmail( 'sakura');                        // インスタンス化
    $email->from( array( 'sender@domain.com' => 'Sender'));  // 送信元
    $email->to( 'reciever@domain.com');                      // 送信先
    $email->subject( 'メールタイトル');                      // メールタイトル
    $email->send( 'メール本文');  
```
いままでSMTP認証しないで送れていただけだった‥

Gmail側で受信できた！
-

再度、Gmailのメールソースを見ると

SPF:	PASS（IP: xx.xxx.xxx.x）

やったー！

そろそろCakePHP5にしないと‥
Windows Server 2022 セットアップ(備忘メモ)

### 基本情報の設定
(NW関連)
* 静的IPアドレスの変更
* デフォルトゲートウェイの設定
* DNSサーバ1,2の設定

(その他)
* コンピュータ名の設定
* ワークグループの設定
* ライセンス認証
※インストール時にプロダクトキーを入力しなかった場合のみ
 
### Windows Serverの管理ツール
**[サーバーマネージャー]**
Windows Serverをローカルで管理・運用できるツール


**[Windows Admin Center]**
Webブラウザ経由でwindows Serverを管理・運用できるツール
リモートでよく使う

**[Microsoft管理コンソール(MMC)]**
いわゆる「コンピュータの管理」

**[windowsの設定]**
いわゆるシステム
[Win]+[x] -> [y] で開くやつ

**[コントロールパネル]**
.NET8 Blazor Identity WebApp では対話型的なコンポーネントをメイン レイアウトに追加

# .NET8 Blazor Identity WebApp では対話型的なコンポーネントを`MainLayout.razor`に追加
Radzen レイアウトコンポーネントを **Blazor WebApp** のメイン レイアウトに追加したかったが、ヘッダーには対話型コンポーネントであるユーザー メニューが含まれていたため、`MainLayout.razor`のレンダー モードを対話型にする必要がありました。

## 第１問題
1. 最初の問題は、`@rendermode InteractiveServer` ディレクティブを単に Blazor レイアウトに追加することはできず、以下のように `Components\App.razor` ファイル内の `<HeadOutlet />` タグと `<Routes />` タグに属性として追加する必要があることです：
    ```HTML
        <HeadOutlet rendermode="InteractiveServer" />
    </head>
    <body>
        <Routes rendermode="InteractiveServer" />
    ```

## 第２問題
2. 次の問題は、アプリケーションを起動すると、ログイン ページのレンダリングが何度もループすることでした。
3. 解決策は、認証ルートを除くすべてのルートにグローバル「InteractiveServer」レンダリング モードを条件付きで設定するコードを追加することでした：
    ```html
        <HeadOutlet @rendermode="RenderModeForPage" />
    </head>  
    <body>
        <Routes @rendermode="RenderModeForPage" />
        <script src="_framework/blazor.web.js"></script>
        <script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script>
    </body>
    
    </html>
    
    @code {
        [CascadingParameter]
        private HttpContext HttpContext { get; set; } = default!;
    
        private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/Account") ? null : InteractiveServer;
    }
    ```
## メインレイアウト
3. `Components\Layout\MainLayout.razor` ファイルに `<RadzenComponents />` などを移します：
    ```html
    @inherits LayoutComponentBase
    @using Microsoft.AspNetCore.Authorization
    @using Microsoft.AspNetCore.Components.Sections
    @using Microsoft.AspNetCore.Identity
    @using System.Diagnostics
    @using System.Security.Claims
    
    @inject AuthenticationStateProvider GetAuthenticationStateAsync
    @inject NavigationManager NavigationManager
    @inject IJSRuntime JsRuntime

    <RadzenComponents />

    <RadzenLayout>
        // ...
    ```
## 参考

- [レンダリング モードをレイアウトに追加できません問題について](https://github.com/dotnet/aspnetcore/discussions/51491)
- [認証ページで無限にループする問題について](https://stackoverflow.com/questions/77599233/blazor-net-8-and-global-interactivity-issue-with-identity?rq=1)
- [グローバル レンダー モードを使用した Blazor Identity](https://github.com/dotnet/aspnetcore/issues/51476)
ARPコマンド（Windowsコマンドプロンプト）

■ ARP（Address Resolution Protocol）：　インターネット上のアドレス解決プロトコル。IPアドレスをMACアドレスに変換するプロトコル。通信を行える機器にはMACアドレスという機器固有のアドレスがあります。そのMACアドレスを知るためにARPコマンドを使います。インターネット層（IPアドレス）とリンク層（MACアドレス）の違いはあれど、IPアドレスも通信する相手を特定するために利用されるという意味ではMACアドレスと同義と考えます。IPアドレスが住所ならばMACアドレスはそこに住んでいる人の名札の様なモノと考えます。
■ ARPとは何ぞや？　![スクリーンショット 2024-03-08 222059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/38d70b2b-3ec3-30c6-97e5-b5afcf0d9d41.png)
■ Wikipediaより「ARPとは？」（リンクURL）https://ja.wikipedia.org/wiki/Address_Resolution_Protocol#:~:text=Address%20Resolution%20Protocol%20(%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E8%A7%A3%E6%B1%BA,%E3%82%8B%E9%80%9A%E4%BF%A1%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82　
■ （Wikipediaの画像）![スクリーンショット 2024-03-22 131917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/8ab5b72a-2699-35f1-95c0-7203f77edf27.png)
■ コマンドヘルプを見ると、![スクリーンショット 2024-03-22 132441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/38d10a17-91b4-3514-5430-c74c084773bd.png)
■ ARPテーブル（インターネットアドレスと物理アドレスの対応表）を表示します。（「 -a 」オプション）![スクリーンショット 2024-03-08 223434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/e948aa72-4516-2814-025a-a2daabff62ea.png)
■ 「-s」オプションは、ホストを追加してIPアドレスを物理アドレスに関連付けます（ここでは実施しません。）　コマンドシンタックスは「　ARP -s inet_addr eth_addr [if_addr]　」　![スクリーンショット 2024-03-22 135046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/6f94f033-0f82-811d-0880-3f0f1c20acae.png)
■ 「-d」オプションは、指定されたホストを、ARPテーブルから削除します（ここでは実施しません）![スクリーンショット 2024-03-22 140256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/f8119e19-38c7-c0fb-6526-ecc41a4ab1c9.png)
■ 以上の様にARPコマンドはIPアドレスとMACアドレスの対応を表示、追加、削除など行います。
■ 「なりたい自分の、その先へ」エンジニアファーストの会社、助け合いの共同体、ワークスタイルは多様、集まり帰る場所のある会社⇒　株式会社CRE-COエンジニアリングサービス　伊藤 俊広　（会社リンクURL）https://www.cre-co.jp/
Docker環境でLetter Openerの限界と対策

### 問題
Ruby on Railsの開発プロセスでは、メール機能のテストが不可欠です。Letter Opener gemは、開発環境でメールを実際に送信せずに、すぐに確認できる便利なツールです。しかし、Letter OpenerがLaunchyを介してメールをウェブブラウザで開くため、ローカルの開発マシン以外の環境（ステージングサーバー、VM、Dockerコンテナなど）では、ウェブブラウザを見つけることができず、次のような警告メッセージが表示される問題が発生します。

```
WARN: Launchy::CommandNotFoundError: Unable to find a browser command. If this is unexpected, please rerun with environment variable LAUNCHY_DEBUG=true or the '-d' commandline option and file a bug at https://github.com/copiousfreetime/launchy/issues/new
```

この問題に対する解決策として、3つの主要な代替案が提案されています。

### 代替案1：環境変数の設定とログの活用
このアプローチでは、2つの環境変数を設定することで問題を解決します：

- **`LAUNCHY_DRY_RUN=true`**：Launchyの「ドライラン」モードを有効にし、実際のブラウザを開こうとする試みを停止します。
- **`BROWSER=/dev/null`**：システムのウェブブラウザ呼び出しを防ぎます。Letter Openerによって生成されたメール内容は無視されます。

この設定を適用した後、メールが実際に送信されないにもかかわらず、Railsのログを通じて送信されたメールの履歴を確認することができます。Letter Openerはメール送信の試みをログファイルに記録するため、開発者はこのログを検討して、メール送信ロジックが予想どおりに動作しているかを確認することができます。例えば、**`log/development.log`** ファイルでメール送信に関連するログを探すことができます。

### 代替案2：代替的なメールテストサービスの活用
Letter Openerの制限を回避するもう一つの方法は、MailtrapやMailCatcherなどのサービスを使用することです。これらのサービスは、実際のメールサーバーにメールを送信せずに、メールを効果的にテストできる仮想のメールボックスを提供します。

- Mailtrap：安全な環境でメールをキャッチし、実際に送信せずにテストできるサービスです。
- MailCatcher：ローカルSMTPサーバーとして動作し、すべてのメールをキャッチしてウェブインターフェースを通じて確認できるようにします

### 代替案3：Letter Opener Webの使用
Letter Opener Webは、Docker環境でもメールテストを容易にする別の解決策です。これはLetter OpenerのWeb版であり、メールを保存し、Webインターフェースを通じてブラウザで直接開くことができます。したがって、Dockerコンテナ内で実行されるアプリケーションでも、別途ブラウザなしでメールを確認することができます。

### 参考
https://github.com/ryanb/letter_opener
【体験記】コツコツAtCoderやっていたら４ヶ月で茶→緑になれた話

# はじめに
昨年の12月頭にAtCoderのアルゴリズムで茶色コーダにりました。それからおよそ4ヶ月後の2024年3月、緑コーダーになることができたので、ここまでの取り組みの振り返りをしていきたいと思います。
完全にポエム的な内容なので、お時間のある方だけ読んでいただけると幸いです😀
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/3cf9a1f2-39c8-e600-b6f4-7bcf4ab4b3a9.png)

# 目次
| 目次 |
| --- |
| [振り返り](#振り返り) | 
| [習得したアルゴリズム](#習得したアルゴリズム) |
| [今後の目標](#今後の目標) |
| [最後に](#最後に) |


# 振り返り
[入茶したときに書いた記事](https://qiita.com/Yu_unI1/items/f546498dce9ab41c3d22)で「今後やること」を書いていたので、これをもとに振り返りを行います。

> - 鉄壁本が進められていないので計画立てて進める
> - ABCになるべく参加できるように日程調整する
> - ABCの過去問やAtCoder Problemsの過去問を解く
> - 競プロやってる人のコミュニティに入る

当時建てた目標は上記の４つでした
これらの達成度合いは以下の表の通りです。

| 目標 | 達成度| 
| --- | --- | 
| 鉄壁本が進められていないので計画立てて進める | ❌ | 
| ABCになるべく参加できるように日程調整する| ⭕️ | 
| ABCの過去問やAtCoder Problemsの過去問を解く| 🔺| 
| 競プロやってる人のコミュニティに入る| ❌ |

一つずつ詳しく振り返っていきたいと思います。

## 1. 鉄壁本が進められていないので計画立てて進める
まずは鉄壁本の進捗についてです。

**前回の入茶記事を書いて以降１度も開いていません** 

## 2. ABCになるべく参加できるように日程調整する
この目標は概ね達成することができたと言えます。
ほぼ毎週ABCに参加することができました。また、参加できない回も後日にバーチャル参加で問題を解く機会を作り学習を進めることができました。


## 3. ABCの過去問やAtCoder Problemsの過去問を解く
この目標は半分ほど達成できました。
ABCで自分が参加した回の問題はA ~ D/E問題までは必ず復習するようにしました。
また、過去に参加したことがあったコンテストを解き直してみたり、[paiza](paiza.jp)や[techful](https://techful-programming.com/)の問題をとくことで様々な問題に触れることができました.

## 4. 競プロやってる人のコミュニティに入る
コミュニティに入るのはできていませんが、Xなどで競プロやっている人をフォローするようにはしています

# 習得したアルゴリズム
入緑するまでに習得したアルゴリズムは以下のとおりです。
- DFS/BFS
- 累積和
- 二分探索
- 全探索
- dp
- 線形リスト

意外と少ないですが、ここら辺ができればA~Cは基本的に解くことができて、Dまで解けることもあるイメージです。

# 今後の目標
これを踏まえて今後の目標を立てていきたいと思います。
ゴールは **「夏休み終わるまでに入水することと」**
そのための目標として
- [ ] ABCにはなるべく参加する
- [ ] AtCoder problemsで過去問を解く
- [ ] 精進を継続する
とします。

# 最後に
最後まで読んでくださりありがとうございました！
次は入水したときにまたこの振り返りを書きたいと思います〜〜！


それでは、またねーー
Makefile - make コマンドに環境変数を利用し、値がない場合には初期値を代入する

# Makefileの例

`?=` で環境変数に値がない場合に代入できるようだ

```mk
SOME_ENV ?= foo

echo:
	@echo $(SOME_ENV)

```

# 実行例

```
$ make echo
foo
```

```
$ SOME_ENV=bar make echo
bar
```


# 参考

https://weblog.grimoh.net/entry/2020/06/01/000000

# チャットメンバー募集


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

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


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
PowerAppsでポープアップを作成する方法

# 手順
1,App 
OnStart:
　Set(varBackgroudFlg,true);
  Set(varPopupFlg,true);
  ※Sharepointの場合は、OnNew(),OnEdit,OnViewのところで追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/72e48a06-1bd6-21e1-7914-78ebe059ab7a.png)

2,画面と同じサイズの四角を追加
  Fill:RGBA(149, 149, 149, 0.7)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/77c8241f-764e-6c36-e117-a34006ac953c.png)

3,ポープアップを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/b3155ef1-79b7-00fd-1818-44d1078e59dc.png)
Buttonのonselect:
 　Set(varBackgroudFlg,false);
   Set(varPopupFlg,false);

# 参考サイト
https://tech-blog.cloud-config.jp/2021-06-25-power-apps-popup
vue3-carousel-nuxt の使用について

# vue3-carousel-nuxt の使用について

Nuxt.js に vue3-carousel-nuxt を導入した事例

## ドキュメント

- [Vue3 Carousel Nuxt Module](https://nuxt.com/modules/vue3-carousel-nuxt)
  - Nuxt.js での導入について
- [Vue3-Carousel](https://ismail9k.github.io/vue3-carousel/)
  - 具体的な使用例や API などのドキュメント

## ポイント

### prefix

<https://nuxt.com/modules/vue3-carousel-nuxt#usage>

`nuxt.config` でのプレフィクスを `Vcn` などとして事例のタグ名にプレフィクスを付けるなどをしておいたほうがよさそう

```vue
<vcn-carousel>
  ・・・
</vcn-carousel>
```

### style

<https://nuxt.com/modules/vue3-carousel-nuxt#styling>

スタイルの調整は以下のような形式にて

```vue
<style lang="scss" scoped>
:deep(.carousel__pagination) {
  // スタイルを記述 (指定されているスタイルは上書きされる模様)
}
</style>
```

#### コンテンツ間の調整

レイアウトは `display: flex;` が使用されているが `gap` を使用すると崩れが発生するため、
表示数を維持するには `padding` を使用したほうがよさそう

```vue
<style lang="scss" scoped>
// 格納要素に gap を使用すると表示個数が期待されないものになる可能性が
// :deep(.carousel__track) {
//   gap: 30px;
// }

:deep(.carousel__slide) {
  // 上記のように 30px の gap と合わせたいのであれば半分の値を padding に指定
  padding: 0 15px;
}
</style>
```

### methods などの使用

<https://ismail9k.github.io/vue3-carousel/api/methods.html>

#### 型定義

`ref` の値に該当する型定義が見当たらないため独自の定義が必要か

```ts:types/vue3-carousel-nuxt.d.ts
/**
 * @see https://ismail9k.github.io/vue3-carousel/api/methods.html
 */
export type VcnCarousel = {
  /** 前へ */
  prev(): void
  /** 後へ */
  next(): void
  // 使用するメソッドなど必要に応じて定義
}
```

#### `ref` の使用

ドキュメントの `ref` 指定の記述は `:ref=` となっていないが正しい指定となっている。

```vue
<!-- `:ref="myCarousel"` であると動作しない -->
<Carousel ref="myCarousel"> ... </Carousel>
```

`ref()` に格納した値を使用する場合は通常通り `.value` によりアクセスする。

- ドキュメントでは `.value` でのアクセスを行っていない

```ts
// 初期値の null は特に必要なし
const myCarousel = ref<VcnCarousel>()

myCarousel.value?.next()
```
kotomamba-2.8B-CL-v1.0-hfは『雪国』の続きをどう生成するのか

transformers 4.39.0が[mambaをサポートした](https://github.com/huggingface/transformers/issues/28086)ので、[kotomamba-2.8B-CL-v1.0-hf](https://huggingface.co/misdelivery/kotomamba-2.8B-CL-v1.0-hf) ([kotomamba-2.8B-CL-v1.0](https://huggingface.co/kotoba-tech/kotomamba-2.8B-CL-v1.0)のtransformers対応版)をGoogle Colaboratoryで動かしてみた。

```
!pip install -U transformers
from transformers import pipeline
tgn=pipeline("text-generation","misdelivery/kotomamba-2.8B-CL-v1.0-hf",max_new_tokens=128)
nlp=lambda txt:tgn(txt)[0]["generated_text"]
print(nlp("国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。"))
```

『雪国』冒頭部の続きを生成させてみたところ、私(安岡孝一)の手元では以下の結果が出力された。

> 国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。
>
> 「ああ、ここはどこだろう」と言った。
>
> 「ここは、あなたが見たことのない世界だ」と言った。
>
> 「あなたは、どこにいるのだ」と言った。
>
> 「あなたは、どこにいるのだ」と言った。
>
> 「あなたは、どこにいるのだ」と言った。
>
> 「あなたは、どこにいるのだ」と言った。
>
> 「あな

さて、このモデル、継続学習で本当に賢くなるんだろうか。
(ChatGPT3.5)MathMLの表示のバグ修正？ "s2level"と"s1level"

・MathMLの行頭のスペースが揃っていません。
　見たところ、特に問題はありません...。そうです。

# "s2level"と"s1level"の表示の違いの認識
```
　　(ⅰ)...
(ⅱ)...
```
参考）2024 慶応義塾大学　薬学部MathJax【１】(2) ＜　大学入試数学問題集成 様
（i)(ii)の行頭のスペース幅が異なって見える。？修正済みかもです。
https://mathexamtest.web.fc2.com/2024/202413338/2024133380100mj.html#top-0102

ChatGPT-3.5先生へ　聞いてみました。
最終行に、1行追加しました。
```
<p class="s2level">(&#8560;)　<math>
しょうりゃく
<p class="s1level">(&#8561;)　<math>
しょうりゃく
MathMLの表示におかしいところはありますか。
```
与えられたMathMLは、日本語を含む数学表現を記述しています。**見たところ、特に問題はありませんが、...**
```
You
<p class="s2level">(&#8560;)<math>
...
<p class="s1level">(&#8561;)<math>
...
MathMLの表示におかしいところはありますか。

CharGPT
...与えられたMathMLは、日本語を含む数学表現を記述しています。見たところ、特に問題はありません
```
EC2インスタンスに作業用ユーザーを追加

まずはユーザー追加。wheelグループに追加してsudo権限
```
[prompt] $ su -
[prompt] # useradd username
[prompt] # usermod -G wheel username
```
パスワード無しでsudo出来るように
visudoを編集
```
[prompt] # visudo
%wheel  ALL=(ALL)       NOPASSWD: ALL
```
追加ユーザーのsshキー作成
```
[prompt] # su - username
[prompt] # ssh-keygen -t rsa
```
公開鍵を調整
```
[prompt] # cd .~/.ssh
[prompt] # cat id_rsa.pub >> authorized_keys
[prompt] # chmod 600 authorized_keys
```

秘密鍵をローカルにダウンロード
```
[prompt] # cd .~/.ssh
[prompt] less id_rsa
```
ローカルから秘密鍵「id_rsa」を使用してsshでログインする
絶対パスと相対パスについて



## 絶対パスとは

絶対パスとは、ルートディレクトリと呼ばれる階層構造の頂点（最上位階層）から目的のフォルダまでの経路を表したものです。
またフルパスとも呼ばれており、ユーザが現在どのフォルダで作業中であっても、常に同じスタート地点から、常に同じ経路の表示になります。

<blockquote>
    <p><font size="5">"</font></p>
<img src="
https://images.prismic.io/and-engineer/c03139e6-7806-463d-81c5-5e95b8385c6f_img_soutaizettaipath_03.png?auto=compress%2Cformat&w=768" width=600>
    <p><a href="https://and-engineer.com/articles/Y1fGpxAAAAt07ZlQ">
        参照：絶対パスと相対パスの違いは？メリット・デメリット、使い分け方を解説
       </a>
    </p>
</blockquote>

### メリット・デメリット

| メリット | デメリット |
|:-:|:-:|
| 絶対パスはファイルやディレクトリの場所を完全に指定するため、実行環境や作業ディレクトリに依存しない。他の人が同じパスを使用しても同じ場所を参照することができる。  |  絶対パスは完全なパスを指定するため、相対パスよりも文字数が長くなる。これは、コマンドやスクリプトの入力時に入力量が多くなる可能性がある。 |
| 絶対パスは、ファイルやディレクトリの位置が変更されても正確に指定することができる。他のファイルやプログラムから参照される場合、相対パスよりも安定性が高い。 |  絶対パスは特定のファイルシステムやオペレーティングシステムに依存する場合がある。異なる環境やファイルシステムで絶対パスを使用する場合、パスの書式やルートディレクトリの位置が異なる可能性がある。 |
| 絶対パスは、異なる作業ディレクトリで作業する場合に特に便利。作業ディレクトリが変更されても、絶対パスを使用して必要なファイルやディレクトリにアクセスすることができる。  |  プロジェクト内のファイルやディレクトリの位置が変更される場合、絶対パスを使用していると他の場所にあるすべての参照を更新する必要がある。これは手作業で行う必要があり、手間がかかる場合がある。 |


## 相対パスとは

相対パスとは、ユーザが現在作業しているフォルダから目的のフォルダまでの経路を表したものです。作業中のフォルダが異なると、当然この経路も異なります。

<blockquote>
    <p><font size="5">"</font></p>
<img src="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660506/86f9cbd7-304d-a7e9-d730-936cdcedbd0e.png" width=600>
    <p><a href="https://and-engineer.com/articles/Y1fGpxAAAAt07ZlQ">
        参照：絶対パスと相対パスの違いは？メリット・デメリット、使い分け方を解説
       </a>
    </p>
</blockquote>

### メリット・デメリット

| メリット | デメリット |
|:-:|:-:|
| 相対パスは現在の作業ディレクトリを基準にして位置を指定するため、ディレクトリ構造の変更や異なる環境での使用においても、パスの修正が容易。他のユーザーが同じコードやファイルを異なる環境で使用する場合にも移植性が高まる。  |  相対パスは現在の作業ディレクトリを基準にしているため、他のファイルやディレクトリとの相対的な位置関係が重要。特定のファイルやディレクトリが他の場所に移動した場合、相対パスの指定が正しくなくなる可能性がある。 |
| 相対パスは、現在の作業ディレクトリを基準にしてファイルやディレクトリの位置を指定するため、パスが短くなる。また、相対パスは特定のディレクトリ構造に依存せず、コードやファイルの可読性を向上させる。  |  相対パスを使用する場合、作業ディレクトリの位置が変わるとパスの解釈が変わることに注意が必要。異なるディレクトリでコードを実行する場合や、異なる環境でプロジェクトを実行する場合には、意図しない結果を招く可能性がある。 |
| 相対パスを使用すると、ファイルやディレクトリの位置を変更する際に、修正する必要がある場所が少なくなる。特にプロジェクトが成長してファイルやディレクトリの数が増える場合や、ディレクトリの階層が深い場合には、メンテナンスの容易さが向上させる。  |  相対パスは現在の作業ディレクトリを基準にしているため、他の人がコードやファイルを理解する際に、作業ディレクトリの位置を把握する必要がある。コードを共有したり、他の開発者がプロジェクトに参加したりする場合には、相対パスの使用による非明示性が問題になる。 |

## まとめ

絶対パスは、特定の環境やシステムでのファイルやディレクトリの参照に便利ですが、可搬性の低下やメンテナンスの困難さなどのデメリットも考慮する必要があります。特定の使用ケースや要件に応じて、絶対パスと相対パスを使い分けると良い。
「**./**」は自分が今いるディレクトリ(フォルダ)、「**../**」は自分が今いるところの1つ上のディレクトリ(フォルダ)と覚えておこう。ただし「**./**」は省略することができる。


使用する環境によってパスの書き方は異なる場合があるため注意が必要。[【初心者向け】絶対パスと相対パスの違いについて解説  ３.環境別、パスの書き方](https://proengineer.internous.co.jp/content/columnfeature/5229) を参照していただきたい。


## 参考

+ [IT用語辞典 e-Words](https://e-words.jp/)
+ [【イラストで簡単理解！】絶対パスと相対パスの書き方](https://www.ycomps.co.jp/staffblog/16101#:~:text=%E7%B5%B6%E5%AF%BE%E3%83%91%E3%82%B9%E3%81%AF%E3%80%81%E3%80%8C%E3%81%A9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
+ [絶対パスと相対パスの違いは？メリット・デメリット、使い分け方を解説](https://and-engineer.com/articles/Y1fGpxAAAAt07ZlQ)

<br>
著者: E.R (株式会社ウィズツーワン)
reactの動的にネストされたフォームで少し苦戦している話

今個人開発しているサービスで、プロジェクトの関与者を投稿するための動的でネストされたフォームを作っています。そのフォームをもっと自由な感じにしたく、useFieldArrayを使い、setStateで更新するのではなくてuseFormContextを使おうとして苦戦している状況について記載したいと思います。

## こんなフォームを作りたい
下記のようにカテゴリに「関わった人」や「関わったチーム」を紐づけ、「関わったチーム」には「関わった人」を紐づけ、カテゴリに「サブカテゴリ」も紐づけてカテゴリと同様のことが出来るようにしたいと思っています。
```
Caregory Member
Category Team
Category Team [Member....]
Category Team [Member...] SubCategory Team
Category Team [Member...] SubCategory Team [Member...]
Category Team SubCategory Team [Member...]
Category Member SubCategory Team
Category Member SubCategory Team [Member...]
Category Member SubCategory [Member]
...
```

## 現状の実装

- 与えられた配列データをバケツリレーで親から子、子から孫、孫からひ孫に渡す
- ひ孫でreact-hook-formのuseFormを使い配列要素の追加/更新/削除。
- ひ孫でデータが変更されたら、サーバー側にPOST、親までバケツリレーをして、親はsetStateして画面を更新

### 現在の実装の画面イメージ
![](https://storage.googleapis.com/zenn-user-upload/a716f9e76406-20240322.png)

### 現在の実装の課題
フォームを理想状態に近づけようとするときに、実装を変更するのが面倒くさい。


## 新実装案
- 与えられた配列データはFormProviderのdefaultValuesに渡す
- 親・子・孫・ひ孫コンポーネントはuseFormContextでそのデータを参照
- useFieldArrayにその参照を渡し動的に新しい配列要素を追加できるようにする
- 配列要素が追加/更新/削除はuseFieldArrayを使って行う


### 新実装案に近い実装
https://zenn.dev/maro12/articles/7d011d3dfed5d4
https://github.com/karthickthankyou/deeply-nested-form/

### 試した実装
新実装案を試した実装はこんな感じです。
https://github.com/placeof/creators-dynamic-nested-form

## 新実装案を捨てた理由
- 新実装案に近い実装だとForm全体をsubmitしなければならない。Formのフィールドが数百になる可能性があるため、フィールドごとに追加/更新/削除をsubmit出来るようにしたい。　そのときに、useFieldArrayでappendしたコンポーネント内でuseFormを使う実装しか思いつかなかった。そのコンポーネント内で定義したuseFormを使いデータを追加/更新/削除すると、useFormContextに反映出来ない。問題はなさそうだが、何となく気持ち悪い。
- useFieldArrayで再帰的に書こうとすると型情報とインデックス情報が上手く書けないので冗長的になる。結局今の実装でフォームを追加する方が簡単。多分黒魔術を使えばどうにかなるが、メンテが面倒くさそう。
- 子要素が存在するときは、親要素は削除出来ないようにしたい。useWatchで子要素の数を判定するみたいな実装が面倒くさそう。useFieldArrayのfields.lengthではその判定が出来ない。
- 完全に満足する実装にならないときに、Server Actionsを使ったやり方も出てくるかもしれないので一旦pendingした方が良い気がした。

# おわりに
良ければ良い実装教えて下さい。。。
縦一列に任意の指揮を入れる方法

```vb
Sub FillColumnWithFormula()
    Dim ws As Worksheet
    Dim lastRow As Long
    
    Set ws = ActiveSheet '現在アクティブなシートを使用。必要に応じて変更してください。
    
    '指定した列の最終行を取得。ここではA列を例にしています。
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    '最終行までの範囲に式を設定。"=YOUR_FORMULA_HERE"を必要な式に置き換えてください。
    ws.Range("A1:A" & lastRow).Formula = "=YOUR_FORMULA_HERE"
End Sub
```
VercelサーバーにUpした静的ページにBasic認証を設ける方法


# Vercel使ってますか！？

セットアップも便利でGithubとの連携も容易な[Vercel](https://vercel.com/)ですが、Basic認証の方法を忘れそうなので、備忘録のために残しておきます。

https://vercel.com/


## ソースファイルをGithubに連携


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/e5246d19-fead-194e-8b72-83f023cdf821.png)

このサンプルのプロジェクトをGithubに連携します。
Githubの連携は割愛します。

## middleware.jsを作成

src/middleware.jsを作成します。
package.jsonにBasic認証の関連するパッケージも追加しておく必要があるのでお忘れなく。

```
# ターミナル or bashで
yarn add @vercel/edge basic-auth static-auth
```

```js:src/middleware.js
import { next } from "@vercel/edge";

export const config = {
  matcher: '/(.*)', // 兄弟および配下のディレクトリに認証処理を設ける
};

export default function middleware(request) {
  const authorizationHeader = request.headers.get("authorization");

  if (authorizationHeader) {
    const basicAuth = authorizationHeader.split(" ")[1];
    const [user, password] = atob(basicAuth).toString().split(":");

    if (user === process.env.BASIC_AUTH_USER && password === process.env.BASIC_AUTH_PASSWORD) {
      return next();
      // 認証通過後の処理。静的ページを読み込みます
    }
  }

  // 失敗時の処理
  return new Response("Basic Auth required", {
    status: 401,
    headers: {
      "WWW-Authenticate": 'Basic realm="Secure Area"',
    },
  });
}
```



## VercelとGithubを連携

Pushなどの作業が終わったらdashboardからProjectを新規作成。
連携の際に作成したプロジェクトをVercelにImportします。


## Rootを変更

Vercelはルートにあるmiddleware.jsをBasic認証のファイルとして読み込むので
RootDirectoryをsrcに変更します。
（Frameworkは今回使用しないので、OtherでOK。FWが変わると設定方法も異なるので注意が必要です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/881b41bc-dc62-b3e5-f83f-e19ba749d405.png)


## 環境変数を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/806596fb-1610-ac15-a16f-27f31d4cf7c5.png)

`src/middleware.js`で使用する環境変数をVercel上で設定します。
この場合のKey名は`BASIC_AUTH_USER`と`BASIC_AUTH_PASSWORD`ですね。
Valueは適時安全なものに変えてください。

## デプロイ実行

deployボタンをクリックします。

![スクリーンショット 2024-03-18 113539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/861edd9f-039a-03e2-5b94-df7f63a1ef9b.png)

こんな感じでデプロイが走ります。

## デプロイ成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/44682879-be10-c481-16dd-37eff4f4e5c1.png)

こんな感じでデプロイの成功の画面に遷移します。
Continue to Dashboardをクリック。


## ページの確認


![スクリーンショット 2024-03-18 113754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/c6f55764-fad6-cf97-e5aa-06b006b4198a.png)

Domainsをクリックしてもらうと自動的に発行されたURLが見れると思います。

## 成功！

![スクリーンショット 2024-03-18 114022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/9b0f0c7f-0b8f-686f-5862-ea86dc540f0f.png)

Basic認証がちゃんとかかってると思います！
ここで誤ったパスワードやユーザー名を入力するとエラー画面に遷移できることも確認してください。


## 余談

Basic認証を掛けたサイトでSPの動作確認がめんどくさい時は


```
https://[ユーザー名]:[パスワード]@サイトドメイン/パス
```

と入力すると初回のダイアログが表示されなくて楽です。
ただパスワードの情報の取り扱いにはご注意ください！

## まとめ

Vercelは神
ピポットテーブルで小計を先頭に表示させる方法

小計を表示させたいピボットテーブルを選択し、「ピボットテーブルツール」の「設計」タブ（または「レイアウト」タブ）を開きます。ここで「小計」のオプションを「グループごとに小計を表示しない」に変更します。これにより、標準の小計が表示されなくなります。

小計として表示したい値に対して、ピボットテーブル内で計算フィールドを追加します。計算フィールドを追加するには、ピボットテーブルの任意の場所を右クリックし、「ピボットテーブル分析」タブの「計算」グループ内の「計算フィールド」を選択します。計算フィールドのダイアログボックスが表示されたら、「追加」を選択し、小計として表示させたい計算式を入力します。

計算項目を先頭に表示**: 計算フィールドを追加した後、それを行ラベルの先頭に移動させることで、行の先頭に小計が表示されるようになります。ピボットテーブルフィールドリストで、計算フィールド（小計として使用しているフィールド）をドラッグして、行ラベルエリアの一番上に配置します。

必要に応じて、ピボットテーブルのスタイルやフォントを調整して、計算フィールドが小計として明確に識別できるようにします。
2024の約数「2024 慶応義塾大学 理工学部【１】(1)」をChatGPTとsympyでやってみたい。穴埋め (ア)(イ)のMathMLの対応。

・穴埋め (ア)(イ)のMathMLの対応。

# オリジナル
大学入試数学問題集成 様＞【１】(1) テキスト

https://mathexamtest.web.fc2.com/2024/202413338/2024133380300mj.html

公式ホームページ
解答例の公表
https://www.keio.ac.jp/ja/admissions/news/files/2024/3/6/2024_st_math.pdf
https://www.keio.ac.jp/ja/admissions/ippan_kaitou/

# google検索で
```
2024の約数と個数
「2024」という数の特徴
正の約数が全部で16個（1, 2, 4, 8, 11, 22, 23, 44, 46, 88, 92, 184, 253, 506, 1012, 2024）もある。2024/01/01
```
# ChatGPT-3.5先生へ
・大学入試数学問題集成 様のMathMLを抜粋。Pから/Pまで。
```
<p class="s1level"><a name="q-0301" 
id="q-0301"></a><span 
class="qnum">【１】</span><a 
name="s-0301" id="s-0301"></a><span 
class="shomon1">(1)</span>　<math>

しょうりゃく

<mtext>(イ)</mtext><mspace width="1em"></mspace></mrow><mspace width=".2em"></mspace>
</math>である．
</p>
```
回答しょうりゃく
ここで、(ア)と(イ)の部分は問題の解答を表しています。
```
sympyで
```
回答しょうりゃく
```Python
from sympy import divisors, Integer, root

# 2024の約数を見つける
divs = divisors(2024)

# アの値を計算する
a_value = sorted(divs)[5]  # 6番目の要素

# イの値を計算する
sixth_root = root(2024, 6)
closest_integer = Integer(sixth_root).round()

print("アの値:", a_value)
print("イの値:", closest_integer)
```

・SymPy Liveで

https://live.sympy.org/

？？？
```
アの値: 22
イの値: 3
```
(私)ChatGPT先生の計算間違いです。
```
sympyで　最も近い自然数の関数
```
・ChatGPT-3.5先生に教えてもらったので、以下追加修正。

# sympyで

```python
from sympy import divisors, root, Integer
from sympy import *

def nearest_integer(x):
    """
    Return the nearest integer to the given number x.
    """
    return int(round(x))

# 使用例
# x = 3.7

# 2024の約数のリストを取得
divisor_list = list(divisors(2024))

# 6番目に大きい約数を取得
sixth_largest_divisor = divisor_list[-6]

# 2024の6乗根を計算
sixth_root_of_2024 = root(2024, 6)

# 最も近い自然数を取得
nearest_integer_to_sixth_root = Integer(sixth_root_of_2024)

# 結果を出力
print("2024の6番目に大きい約数は`   :", sixth_largest_divisor)
print("2024の6乗根に最も近い自然数は:", nearest_integer(sixth_root_of_2024))
# 2024の6番目に大きい約数は`   : 92
# 2024の6乗根に最も近い自然数は: 4
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)
AWS Elastic IPの個数上限を引き上げる方法

## 概要

AWSのElastic IP取得上限数はリージョンごとに５個である。とある作業でElastic IPを6個取得する必要があったため、インフラエンジニアさんに相談し、個数上限を引き上げる方法を教わった。実際に体験してみたのでメモ的にまとめる。

## 方法

1. AWSマネジメントコンソールにて Service Quotasを開く。
1. サイドバーの「AWSのサービス」をクリックする。
1. AWSのサービスで`Amazon Elastic Compute Cloud`と入力し、検索する。
1. サービスクォータで`EC2-VPC Elastic IPs`と検索し、ヒットした「クォータの名称」をクリックする。

    ![CleanShot 2024-03-22 at 12.46.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/73265930-29d8-76a5-0ce9-cf7c1156d1f5.jpeg)

1. 「アカウントレベルでの引き上げをリクエスト」をクリックする。

    ![CleanShot 2024-03-22 at 12.48.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/49d63318-577c-869b-989d-3b58722e931d.jpeg)

1. 5以上の値（Elastic IPの上限数）を指定して「リクエスト」をクリックする。

    ![CleanShot 2024-03-22 at 12.52.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3e0ba95f-0363-72ed-6d32-6b1a9ecab9ae.jpeg)

1. すぐに上限が上がるわけではなく、一時的にステータスが保留中になったことを確認し、暫く待つ。
1. ステータスが「承認済み」になれば上限が上がっている。
rustdesk server install ubuntu, how to install rustdesk on ubuntu

To install RustDesk on Ubuntu and provide a description, you can refer to the following comprehensive guide:
Installing RustDesk on Ubuntu:
Step 1: Update System Packages
Ensure your system is up to date by running the following commands in the terminal:

bash

sudo apt update
sudo apt upgrade
Step 2: Install Dependencies
Install necessary tools like git, curl, and build-essential:

bash

sudo apt install git curl build-essential
Step 3: Install Rust Programming Language
Use Rustup, the Rust installer, to install Rust on your system:

bash

curl --proto '=https' --tlsv1.2 -Sf https://sh.rustup.rs | sh
source $HOME/.cargo/env
Step 4: Clone RustDesk Repository
Navigate to the desired directory and clone the RustDesk repository:

bash

cd /opt
git clone https://github.com/rustdesk/rustdesk.git
cd rustdesk
Step 5: Build and Install RustDesk
Build RustDesk using Cargo:

bash

cargo build --release
Step 6: Create a Desktop Shortcut (Optional)
Create a .desktop file for RustDesk:

plaintext

[Desktop Entry]
Name=RustDesk
Exec=/opt/rustdesk/target/release/rustdesk
Type=Application
Icon=/opt/rustdesk/rustdesk.png
Categories=Network;
Move the file to /usr/share/applications/:

bash

sudo mv rustdesk.desktop /usr/share/applications/
Step 7: Start Using RustDesk
Launch RustDesk from the application menu or command line:

bash

/opt/rustdesk/target/release/rustdesk
RustDesk Description:
RustDesk is a secure and easy-to-use remote desktop application built with the Rust programming language. It offers reliable and efficient remote access solutions, allowing users to connect to their devices from anywhere securely. With RustDesk, users can remotely manage servers, provide remote support, and collaborate effectively in real-time.

By following these steps, you can successfully install RustDesk on your Ubuntu server and leverage its robust features for seamless remote desktop connectivity. If you encounter any difficulties during the installation process, feel free to seek additional assistance or clarification.

visit : https://docs.vultr.com/how-to-install-rustdesk-remote-desktop-server-on-ubuntu
[2024年版] X（旧Twitter）のカード（OGP）をキャッシュクリアしたい

かつてはTwitter Card Validatorから削除できたけど、2022年の夏頃にプレビュー機能がなくなって、それに伴いValidatorからのキャッシュ削除もできなくなっていたと思う。

じゃあどうすればTwitter（X）から古いカードのキャッシュをクリアして、最新のカードを表示できるのかというと...実はTwitter(X)のDeveloper Platformで解説がある。

https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/troubleshooting-cards#refreshing

詳しくは読めば分かると思うけど、ざっくりやり方を書くならこう。

1. キャッシュクリアしたいURLの、短縮URLを何らかのサービスを用いて作る
2. 短縮URLをツイートする（試した感じからして、ツイートする直前...つまり短縮URLが載ったツイート本文を書いたところまででも大丈夫そう）
3. 完了! 短縮URL経由で元のサイトにTwitterのクローラーが再訪することで、元のURLでも最新のカードを得られる

さらに、これは自分の経験談だけど、それでも最新化されないなら、次のアプローチも試すといいと思う。

1. キャッシュクリアしたいURLにタイムスタンプ等の適当なパラメータをつけた状態で、短縮URLを生成
2. 前述と同じく、生成した短縮URLでサイト再訪
3. これで「 **パラメータ付きの** 元サイトのURL」がキャッシュクリアされたはずなので、そのパラメータ付きのURLで投稿

これは例えば、 `https://revisnote.com/stories/blog/ready` を `https://revisnote.com/stories/blog/ready?1711079822944` に変えた上で短縮URLを生成して…という感じ。

後者のアプローチが必要になるのは、試して見たところ、短時間で連続して元サイトのURLの短縮URLを利用したキャッシュクリアを複数回行った場合のような気がする。一度キャッシュクリアしたいだけなら、前者の方法だけでなんとかなるケースが多そう。

## 余談

ちなみにQiitaのカード情報は短縮URLでクローラに再訪させて...といったことは必要なく、単にタイムスタンプ等のクエリパラメータを付与すれば新しいOGPを取得してくれる模様。

...という話を少し前にこちらも備忘録として書きました。

https://qiita.com/faable01/items/0b23353914dee325a8bc

### 著者プロフィール

いつもはAWSのサーバレスアーキテクチャ界隈をよくいじっています。日報SaaSも作っていて、開発ブログのようなものも公開してます。個人開発仲間が欲しいので、興味のある方声かけてください〜！

https://revisnote.com/stories/blog/ready?1711079822944
Git – 現在ブランチの最新コミットハッシュを別ブランチにCherry-pickしてすぐにpushするワンライナーのコマンド例

# コマンド例

- `some_branch` に cherry-pick & push する例

```
current_commit_hash=$(git show --format='%H' --no-patch) && git switch some_branch; git fetch && git reset --hard origin/some_branch && git checkout -b some_branch-$(date +%s) && git cherry-pick $current_commit_hash && git push
```


# チャットメンバー募集


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

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


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura