OmniAICreator/Qiita-1.07M huggingface dataset:
アノテーションの引数を設定ファイルから取り出したい

# やりたいこと

タイトルのままだが、SpringBootで使うアノテーションの引数に、設定ファイルで定義した値を代入したい。
しかし普通に代入するとエラーが出て、うまく実行できない。
具体的には以下のような状況。

```application.yml
config:
    cron: 0 0 0 * * *
```

```HogeConfig.kt
@Component
@ConfigurationProperties("config")
class HogeConfig() {
    var cron = ""
}
```

``` Foo.kt
@Component
class Foo(
    val hogeConfig: HogeConfig
) {
    @Scheduled(cron = hogeConfig.cron)
    fun bar(){
        
    }
}
```

関数の中などで使う場合は、DIコンテナからとってきた `HogeConfig` インスタンスをそのまま使えるのだが、アノテーションでは使うことができない。

出てくるエラーはこんな感じ。
`an annotation argument must be a compile-time constant`

アノテーションの引数はコンパイル時に定数である必要があるらしい。
`HogeConfig`インスタンスが作成されるのは `@ComponentScan` が付与されたクラスが実行されたタイミングであるため、上記の場合コンパイル時に存在しないのだ。（多分）

# 解決策

これを解決するためには `Foo.kt` を以下のように修正する。

```Foo.kt
@Component
class Foo() {
    @Scheduled(cron = "\${config.cron}")
    fun bar(){
    
    }
}
```

このようにすることでSpringBootがコンパイル時に設定ファイルから定数を引っ張ってきてくれるようになる。

また同じようなケースで、フォームバリデーションでエラーメッセージをmessage.propertiesから引っ張って来たい時がある。
この時は以下のようにすると代入できる。

```messages.properties
valid.NotBlank = 空白は許可されていません
valid.Size = 文字数を{max}以下にしてください
```

```Form.kt
data class Form (
    @field:NotBlank(message = "{valid.NotBlank}")
    @field:Size(max = 50, message = "{valid.Size}")
    val userName: String?
)
```
Gmailで特定の件名と添付ファイルの有無によってGASで自動返信する

# 背景
大学のTAの仕事で、Gmailで課題提出する授業がありました。そこで、複数の生徒から課題提出が完了したかの問い合せメールが殺到し、TAが課題を出した生徒一人一人に対して「提出確認しました」とメールを送るはめになった。このような同じ文を何十人もの生徒にメールを送るのは非効率的である。そこで、**課題を出した生徒に「提出完了」のメールを自動で送信する必要がある。**

# 目的
Gmaiの自動返信には以下の２つの条件を満たしていれば送る
1. Gmaiの件名に授業名（例えば工業力学とか）が入っていること
2. 添付ファイル(例：PDF)が入っていること

もし、**添付ファイルが含まれていない場合、「再度提出お願いします」メールを送る。**

# GASをのコード作成やり方
自分のGoogleDriveにアクセスし、マイドライブという所に行きます。ここで、マイドライブに「GAS」といったGAS用のフォルダを作ってそこにGASのコードをいれるといいんじゃないでしょうか。

適当なフォルダに行けたら、以下の写真のように、**左上にある「新規」ボタンをクリック→「その他」の順に「Google Apps Script」を選択**すると、GASのコード作成画面に行けます。
![driveからスクリプト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771189/f1bdc0ea-4e73-c5bb-d648-9d57126be28a.png)

# サンプルコード
「.gs」と書かれているコードに以下のコードをコピペしてください。
簡単に説明すると、**未読メールから該当する件名を探し**、その中で添付ファイルがあるなら「完了メール」を、なければ「再提出メール」を送る。返信メールを送ったものは既読にし、スター（重要）マークを付ける。スターを付ける理由は人間の眼で確認した時誰が出したかを把握しやすいようにするため。
また、特定の人だけ（担当教員には自動返信したくないとき）を除外する必要がある場合、excludedEmailの中のメアドを指定すれば、そのメアドには自動返信をしない。
```
function ResponseMail() {
  const subject = '自動返信';
  const sendMailBodyWithAttachment = '課題の提出確認しました！';
  const sendMailBodyWithoutAttachment = '申し訳ありませんが、添付ファイルが見つかりませんでした。再度提出をお願いします。';
  const excludedEmail = '除外したいメールアドレス'; // 除外したいメールアドレスを設定

  // 未読スレッド一覧を取得
  var unreadMailThreads = GmailApp.search("label:inbox is:unread");

  // 未読スレッド一覧をループ処理でスレッドを一つずつ取り出す
  unreadMailThreads.forEach(function(unreadMailThread) {
    // スレッドのメッセージの一つ目を取得する
    var message = unreadMailThread.getMessages()[0];
    var mailSubject = message.getSubject();
    var sender = message.getFrom(); // 送信者のメールアドレスを取得

    // 送信者が除外リストに含まれている場合は、処理をスキップ
    if (sender.indexOf(excludedEmail) !== -1) {
      return; // このメールをスキップ
    }

    // 取得した件名に特定の文字列が入っているか確認する
    if (mailSubject.indexOf(subject) != -1) {
      // メッセージに添付ファイルがあるかチェックする
      var attachments = message.getAttachments();
      var replyBody;

      if (attachments.length > 0) {
        // 添付ファイルがあれば、その旨を返信用本文に設定
        replyBody = sendMailBodyWithAttachment;
      } else {
        // 添付ファイルがなければ、その旨を返信用本文に設定
        replyBody = sendMailBodyWithoutAttachment;
      }

      // 差出人にリプライする
      message.reply(replyBody);

      // 処理したスレッドを既読にする
      GmailApp.markThreadRead(unreadMailThread);

      // 処理したメールにスターを付ける
      message.star();
    }
  });
}

```

## 注意点
このコードは先ほども言ったように、**未読メールから該当する件名を探しているので、** メールを一度でも既読すると自動返信ができないので、もし既読してしまったら未読にしてください。

# トリガーの設定
トリガーを設定することで、自動的にコード（今回はResponseMailという関数）が実行され、勝手に自動返信をしてくれるようになる。

やり方は以下の写真のように、時計マークの「トリガー」から実行する関数を「ResponseMail」にする。あとは写真の通りに行う。私は、トリガーのタイマーを１分に設定したので、みなさんもそれでいいんじゃないでしょうか。
![スクリーンショット (1906).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771189/6d2ed3ab-6f2e-cbca-1a6e-00d39f310574.png)

# 完成系
コードを実行すると、課題提出したメールのスレッド？に直接返信します。さらに返信したメールにはスターを付ける。以上終わり。
ネット検索をするときは "perplexity.ai" が有能だった件について

## この記事の対象者

- ChatGPT愛用している皆様
- ChatGPTだと最新情報が手に入れにくくもどかしさを感じている人
- ハルシネーションがあるのでソースも気にしながら調査したい人

このあたりが気になっている人が使ってみると良きなサービスを紹介したいと思います。

## 結論

[perplexity.ai](http://perplexity.ai) というサービスが結構有能でした。

## 最新の情報を調べてみた

完璧な答えが必ず返ってくるわけではないようですが、

試しにホットな話題を聞いてみました。

![Untitled](https://bitter-snowdrop-03e.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc1a7fda7-198a-466a-8dd2-0bad57d3f317%2Fb84ff84a-d97d-4c8b-a050-3204c8fef02e%2FUntitled.png?table=block&id=85b5e3e1-4349-40bd-8ee0-d30c218f3213&spaceId=c1a7fda7-198a-466a-8dd2-0bad57d3f317&width=1070&userId=&cache=v2)

質問を行ったのが、2024年5月7日の昼なのですが、その日の予定をしっかりと調べ出してくれました。

リソースも表示されているのと同時に、日程を質問しただけでイベントの概要や新製品の予想までまとめられていて、色々なサイトを調べながら情報をまとめる手間から解放されます。

広告まみれのサイトを閲覧しなくても良いですし、調べ物に関する効率化に寄与してくれると思います。

## 使い方

ユーザー登録しなくてもすぐに使えるので優秀です。

ユーザー登録をすると、今までの検索履歴が残ったりするので、過去に質問したことあったよなーという内容を探し出すことができるので、登録が嫌でなければ登録しちゃった方が便利かなと思います。

## 裏で動いているサービス

Bingによる検索と、GPT-3が動いているようです。

日本語で質問しても動くので使いやすいと思いますがたまに英語で回答が返ってくることがあるようなので、その時は日本語で回答して下さいと改めて質問をすれば日本語で回答が返ってくるようです。

## 余談

ChatGPTは最新の情報を取得して学習していないので、直近の情報を含めた検索を行う点が苦手(というよりできない)弱点がありました。

この弱点をカバーするサービスですし、iPhone用のアプリがあったり、サクサク検索できるので検索をしたいときはperplexityを使いつつ、複雑な質問やまとめ、GPT-4で画像生成するなどを行うときはChatGPTを使ってみたり、最近話題のClaudeを使ってみたりと、多種多様なAIを使い分けをすると良いかと思います。

一回、[perplexity.ai](http://perplexity.ai) を一度使ってみてくださいね！
要件定義の備忘録 (初心者) <フェルミ推定>

<h1>
開発業務に求められるOutputを説明するためのTips
</h1>

<h2>
前提
</h2>
<dl>
  <dt>フェルミ推定とは、実際に調査することが難しいような捉えどころのない量を、いくつかの手掛かりを元に論理的に推論し、短時間で概算することである</dt>
  <dd> 1. 仮定すること</dd>
  <dd> 2. 分解すること</dd>
  <dd> 3. 再構築すること</dd>
  <dd> 4. 計算すること</dd>
  <dd> --以下実業務--</dd>
  <dd> 5. 変化しうる要因とへんかしない要因に分ける</dd>
  <dd> 6. 開発業務でどの要因がどのように変化するか</dd>
  <dd> 7. その変化に対して工数を投下することが妥当か</dd>
  <dd> 8. 他のApproachはないか</dd>
</dl>



<h2>
例
</h2>

<dl>
  <dt>部門Aでは今までMailベースで確認していた依頼内容を開発業務を行うことで自動化することを検討している。  
  </dt>
  <dd> <h3>1. 仮定すること</h3>
  <dd>
  <p>
  部門Aは10人、依頼数は10件/日、確認作業は10分/件と仮定する。
  </p>
  </dd>
  </dt>
  <dd> <h3>2. 分解すること</h3>
  <p>
  業務工数(分/月) = {人数(人)×平均作業時間(分/件)×一人あたりの平均作業件数(件/人)}/{1/30(月/日)}
  </p>
  <p>
  ※分解した要素は算出しやすいものになっているか?
  </p>
  </dd>
  <dd> 
  <h3>3. 再構築すること</h3>
  <p>
  人数(人)×平均作業時間(分/件)×一人あたりの平均作業件数(件/人)　=　業務工数(分/月)
  </p>
  <p>
  ※単位は合っているか？
  </p>
  </dd>
  <dd>
  <h3>4. 計算すること</h3>
  業務工数(分/月)
   <p>= {10(人)×10(分/件)×10(件/人)}/{1/30(月/日)}</p>
   <p>= 30000分/月</p>
   <p>= 500時間/月</p>


:::note warn
  ただし、１ヶ月は確かに29~31日なのだが、稼働日数で言うと休日を勘案しなければいけない。
  <p>20日/月くらいが相場である。(有休消化など含めればもっと少ない。)</p>
  <p>以下参考</p>

https://www.mhlw.go.jp/web/t_doc?dataId=73022000&dataType=0&pageNo=1
https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/faq/faq_kijyunhou.html
:::

  <p>
  修正: 業務工数(分/月)
   <p>= {10(人)×10(分/件)×10(件/人)}/{1/20(月/日)}</p>
   <p>= 20000分/月</p>
   <p>= 333.33...時間/月</p>
  </p>
  </dd>
  <dd> <h3>5. 変化しうる要因とへんかしない要因に分ける</h3>
  <p>
  <dl>
  <dt>今回は下記の要因について考える</dt>
  <dd>A) 人数(人)
  <p>組織の人数を増やすためには人事と部長レベルの承認が必要である可能性が高い</p>
  <p>エンジニアが人数を増やすことは独力では不可能</p></dd>
  <dd>B) 平均作業時間(分/件)
  <p>作業内容とWorkflowが決まっているのであれば自動化が可能</p>
  <p>慣れ不慣れなど、経験による差がある可能性がある</p>
  <p>エンジニアが開発を行うことで短縮可能/p></dd>
  <dd>C) 一人あたりの平均作業件数(件/人)
  <p>RPAなどの自動化Systemを導入すれば一人あたりの処理件数を低減できる</p>
  <p>エンジニアが開発を行うことで短縮可能</p></dd>
</dl>

  </p>
  </dd>
  <dd>
  <h3>6. 開発業務でどの要因がどのように変化するか</h3>
  <p>
    <dl>
  <dt>今回は下記の要因について考える</dt>
  <dd>A) 人数(人)
  <p>変化なし: 10(人) -> 10(人)</p>
  <dd>B) 平均作業時間(分/件)
  <p>開発効果: 10(分/件) -> 1(分/件)</p>
  <dd>C) 一人あたりの平均作業件数(件/人)
  <p>開発効果: 10(件/人) -> 5(件/人)</p>
</dl>
  </p>
  </dd>
  <dd> <h3>7. その変化に対して工数を投下することが妥当か</h3>
  <dl>
  <dt>今回は下記の要因について考える</dt>
  <dd><p>現状: 333.33...(時間/月)</p></dd>
  <dd><p>開発後(予測): 15(時間/月)</p></dd>
  </dd>
  
  :::note info
これにより95%以上の業務効率化になる
:::

  <dd> <h3>8. 他のApproachはないか</h3>
  <p>
  <dl>
  <p><dt>下記の要因について考える</dt></p>
  <dd>A) 人数(人)
  <p>他部門との提携など</p>
  <dd>B) 平均作業時間(分/件)
  <p>ナレッジ化や教育機会の拡充など</p>
  <dd>C) 一人あたりの平均作業件数(件/人)
  <p>能力や処理件数による重み付けで自動割り振りなど</p>
</dl>
  </p>
  </dd>
</dl>

簡単ですが、上記のように数字を出して説明できると上司や同僚から喜ばれやすいです。
<p>一つのテクニックとしてぜひご活用してみてください。</p>


参考文献

https://www.kinokuniya.co.jp/f/dsg-01-9784492556542
Docker, PostgreSQL - "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory



## 1. 状況


`-h` を指定しないと NG

```
$ psql my-postgres my-postgres -p 5432
psql: error: connection to server on socket
      "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
$ 
```




## 2. 対策

`-h` を指定すると OK

```
$ psql my-postgres my-postgres -p 5432 -h localhost
Password for user my-postgres: 
...
$
```



## 3. 理由

ChatGPT 先生曰く...

> 1. `-h` を指定した場合
>     - ネットワークを使用して、リモートのサーバに接続を試みます
> 2. `-h` を省略した場合
>     - [UNIXドメインソケット](https://www.google.com/search?q=UNIX+%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88)を使用して、ローカルのパソコンに接続を試みます
>
> UNIXドメインソケットは、同じマシン上のプロセス間通信に使用されます。この場合、`psql`は`/var/run/postgresql/.s.PGSQL.5432`というパスのソケットファイルを探します。
> 
> しかし、Dockerを使用してPostgreSQLサーバーを実行している場合、サーバーは別のコンテナ内にあり、UNIXドメインソケットは使用できません。そのため、`-h`オプションを使用してホスト名またはIPアドレス（この場合は`localhost`）を指定する必要があります。これにより、`psql`はTCP/IP接続を使用してサーバーに接続します。
> 
> したがって、`-h`オプションを省略すると、`psql`はUNIXドメインソケットを使用して接続を試み、その結果として上記のエラーが発生します。

- `-h localhost` を省略しても localhost と通信するんだけど、異なる通信方式を採用してしまうためこの問題が起こるというのがこの問題のポイント
- エラー文に `No such file or directory` とあったのでファイルのアクセス権の問題なのかなと思ったら全然違いました... Stackoverflow の記事にも気づけず解決にかなり時間を割いてしまいましたので Qiita にメモを残しました...orz
    - [Installing PostgreSQL within a docker container - Stackoverflow](https://stackoverflow.com/questions/23724713/installing-postgresql-within-a-docker-container)


https://qiita.com/domodomodomo/items/087404b3242688dffeac
laravel 11.xでのブロードキャストメモ


laravel10以前で使っていたlaravel websocketsがarchiveされた模様。

https://github.com/beyondcode/laravel-websockets

代替のLaravel Reverbを使えとのこと
ただしlaravel 11.xかつ2024/5/7時点でbeta版。

https://reverb.laravel.com/

laravel reverbのbetaかどうかより
laravelが10から11への変更でかなり構造が変わっているほうが影響が大きそう。
一応、後方互換は保たれているそうだが・・・。

以下変更点を纏めているサイト

https://zenn.dev/pcs_engineer/articles/laravel11-faq

https://zenn.dev/pcs_engineer/articles/laravel11-new-structure
コメント文//の後のスペースかタブかを後から簡単に統一する方法！

VisualStudio2022,ISOC++17標準を使用していますが、バージョン何でも問題ないと思います<br>

<h2>はじめに</h2>
僕はゲームプログラマ系の専門学生です。<br>そのため授業などで生徒同士コードレビューすることがあるのですが、<br>
その際各々一人で書いているはずなのに//の後がタブだったりスペースだったりしており<br>
かつそれを直すのに一々消して書き直したりする姿を見たので、割りと知らない人が多いのかと思い簡単に統一する方法を共有できたらという意図で書きました。

<h3>コメントでのアドバイスと反省</h3>
<a href= "https://learn.microsoft.com/ja-jp/visualstudio/ide/using-regular-expressions-in-visual-studio?view=vs-2022" ><font color="#33aacc">正規表現</font></a>についてコメントでアドバイスを頂いたので勉強したところ、<br>
　正規表現を用いればTAB,スペースのどちらかを指定する必要もなく僕が書いたものよりも<br>
 　慣れればとても早く便利であると思いました。<br>
なのでそれを用いた方法を記載させていただきます。<br>
<h3>実際にやってみる</h3>
<b>1,</b>CTRL+Hキーでコードの右上にコードを置換するためのウィンドウを出して、<br>
「正規表現を使用します」をONにしてください。(画像内の青く囲まれてる所。「.*」。)<br>

![コメント 2024-05-10 131048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772151/14b48870-9eec-9e41-95a7-3ddd23d91ec6.png)
上の「検索…」ボックスが置き換えたい文字列の検索欄、
下の「置換…」ボックスが置き換えた後の文字列入力欄となっています。
<b>2,</b>「置換…」の方に、今回直したい方を入力します(僕は、//タブに直したいのでそう入力)
<b>3,</b>「検索…」の方は、何が直したいのかというと、「//空白」ですよね。
<a href= "https://learn.microsoft.com/ja-jp/visualstudio/ide/using-regular-expressions-in-visual-studio?view=vs-2022" ><font color="#33aacc">正規表現についてのリンク</font></a>を見ると
　空白を検索してくれるのは\s(半角の￥s)となっていますので、
![コメント 2024-05-10 130241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772151/a61aaa32-ed88-8af4-0934-bb07eeb13ccc.png)
検索ボックスに(?<!/)//\s*(?!/)と入力すれば
　//の後の空白が半角スペースでも全角スペースでもタブ文字でも検索してくれます。
 （もともと//\s*で行っていましたが、///も含まれてしまうため修正しました。）
![コメント 2024-05-10 132648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772151/dcba6857-9958-12c8-1a2d-890dc7950c64.png)

↓画像内の青く光ってる所、「すべて置換」を選択。
![コメント 2024-05-10 132831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772151/4e5d9c9c-20f4-3ec6-75cb-e4ef4f5e40bf.png)

何個変わったか教えてくれます。
![コメント 2024-05-07 153229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772151/48705d8b-a49f-c363-6478-ee6cb1638d72.png)

これで全ての置き換えが完了しました！お疲れ様でした。
Google Driveの共有リンクを深掘り！

# Google Driveの共有リンクを深掘り！
こんにちは、京セラコミュニケーションシステム　立脇（@kccs_hiroshi-tatsuwaki）です。

皆さん、Google Driveを使用してファイルや文書を共有する際、共有リンクのURLの体系に種類があることに気づいておられますか？

共有リンクのURLを意識せずリンクを共有してしまうと、とくにMicrosoft Office（以降、Officeと表記）のファイルを共有した場合に、表記崩れなどが起こってしまいファイル共有運用に混乱が生じてしまいます。
（私の所感ですが、Google Driveの利用者が適切な使い方を意識していないため、ファイル共有運用で混乱が生じるケースが発生していると感じています。）

今回の記事では、共有リンクのURLの体系をご紹介し、Google Driveでの適切なファイル共有方法をご紹介します。

## この記事の対象者

- Officeでファイルを作成し、Google Driveでファイル共有をする方々

## 共有リンクの説明

2024年4月時点では以下の3種類の共有リンクの存在を確認しています。
これらを順を追ってご説明したいと思います。

### ①ドメイン名が「docs.google.com」のURL

![Q-0095_00_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/97522174-eaab-a06d-2781-4a8e5fd2b815.png)

### ②ドメイン名が「drive.google.com」かつコンテキストが「/file」のURL

![Q-0095_00_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/7eb5729f-eeaf-0aff-1c5e-4c42cc9f87b2.png)

### ③ドメイン名が「drive.google.com」かつコンテキストが「/open」のURL

![Q-0095_00_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/2d2766e9-4cc1-dbfc-470b-2be93cf2c356.png)

## URLの使い分け

上記の説明を見て「①～③のURLの体系がわかったけど、それが一体どうなるの？」と思った方は多いと思います。

ところが、Google DriveをOfficeファイルを含むファイルの共有サーバーとして使っている場合、これが結構大切になります。というのも、弊社はまさにこのパターンに合致しておりまして、下記の事故が起こりがちなのです・・。

### 事例：Officeで体裁を整えたファイルを共有しために体裁が崩れてしまう

弊社ではよくこんな事件が発生しております。

![Q-0095_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/efa0db66-326f-e153-2fd0-ee707d9c0ac5.png)

### Google Driveの履歴から戻せば良い

とはいえ、Google Driveで管理していると履歴機能で保存されているので、履歴から戻せば良いので特段大きな問題にはならないのですが、もっとスマートな方法はないのでしょうか。

## 私のURL使い分け

運用上の問題にならないようにするためには、「A.Google Workspaceでドキュメント作成した場合」と「B.Officeでドキュメント作成した場合」でそれぞれ共有リンクの渡し方を工夫する必要があります。
私は以下のような使い分けをしています。

![Q-0095_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/4db72870-7b56-99a1-4923-fd88f5ef2fbc.png)

Aは普通の話ですが、BはURLを変換する必要があり、やや面倒です。

私は昔ながらの知恵である③のテンプレート文字列「 https://drive.google.com/open?id= 」をIME辞書に登録しておき、すぐにテンプレートを引き出せるようにして使っております。（スマートな解決方法ではなく申し訳ありません。実は、以前「スマートな解決を！」と思ってGASで①のURLから文書IDを抜き出し、③の共有リンクを生成するプログラムを作りましたが、スプレッドシートシートをいちいち開くのが億劫で利用しなくなりました・・。スマートな解決方法募集中です・・。）

## まとめ

上記の問題は、OfficeとGoogle Driveが共存している企業だからこそ起こるのかも知れません。

ですが、OfficeとGoogle Driveの組み合わせで運用されている企業さんは多いのではないでしょうか。私たちと同じように困っておられる方々に向けて一助になれば幸いです。

ちなみに、OfficeとGoogle Driveの共存が必須であれば、[パソコン版ドライブ](https://support.google.com/drive/answer/10838124?hl=ja)の利用も検討した方が良いかも知れません。意外と知られていないこのツール、エクスプローラーライクにGoogle Driveを扱えるため、なかなか運用性に長けています。ぜひ一度お試しください。
Difyで作る独自知識ベース搭載のAIチャットボット開発

::: note info
[https://notebooklm.google.com/](https://notebooklm.google.com/)
こっちのがいい説あります笑　@2024/06/08
:::

DIFYは、チャットボットを簡単に作成できるプラットフォームです。本記事では、DIFYを使って独自知識を持ったチャットボットを構築する方法を解説します。
- pdfからテキストを抽出する
- URLからテキストを抽出する

https://cloud.dify.ai/

### 特定知識の応答
このアプリケーションの最大の特徴は、「KNOWLEDGE」という変数に注目すべき点です。ユーザーはここに、モデルが参照すべき知識ベースを記述することができます。これは、Retrieval Augmented Generation (RAG)のようにモデルの応答を特定の知識に根ざしたものにすることを示唆しています。

設定ファイル内の pre-prompt は、モデルに対して、提供された知識ベースを最大限に活用し、正確で関連性の高い回答を生成するよう指示しています。ユーザーが入力した質問に対して、モデルは知識ベースの中から関連する情報を抽出し、それを基に回答を生成します。

### モデル
`gemini-1.5-pro-latest`

### Variables
KNOWLEDGE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/e0fc88e1-fc67-cc91-973e-3206a25f36a7.png)
ユーザー入力フィールドに、ナレッジを平文でべた張りして下さい。
### Instructions
```markdown
あなたは優秀なアシスタントです。

以下の知識ベース<knowledge></knowledge>を使って、質問に答えてください。

<knowledge>
{{KNOWLEDGE}}
</knowledge>

知識ベースの中から、質問に関連する情報を注意深く探してください。関連情報が見つかった場合は、知識ベースの情報のみを使って、回答を記述してください。
関連情報が見つからない場合は、質問に答えるのに十分な情報がないと回答してください。
知識ベースに含まれていない情報は一切使用しないでください。知識ベースの情報のみを使って回答を組み立ててください。
```
### おまけ：colab用
```python
!pip install langchain
!pip install langchain_community
!pip install gradio
```
```python
import gradio as gr
from langchain.document_loaders import UnstructuredPDFLoader, WebBaseLoader

def process_input(url, file):
    """
    PDFファイルまたはURLを受け取り、その内容をテキストとして取得する関数。
    Parameters:
    - url: 入力されたURL
    - file: アップロードされたPDFファイル
    Returns:
    - PDFファイルまたはURLのテキスト内容
    Raises:
    - gr.Error: PDFまたはURLの読み込みに失敗した場合のエラー
    """
    try:
        if url:
            # URLが入力されている場合
            loader = WebBaseLoader(url)
            data = loader.load()
            return data[0].page_content
        elif file:
            # PDFファイルがアップロードされている場合
            loader = UnstructuredPDFLoader(file)
            data = loader.load()
            return data[0].page_content
        else:
            # 入力がない場合
            return "URLまたはPDFファイルを入力してください。"
    except Exception as e:
        raise gr.Error(str(e))

def main():
    # Gradioインターフェースの作成
    iface = gr.Interface(
        fn=process_input,
        inputs=[
            gr.Textbox(label="URL", placeholder="URLを入力してください"),
            gr.File(label="PDFファイルをアップロード", file_types=[".pdf"])
        ],
        outputs=gr.Textbox(label="ファイルの内容", show_copy_button=True),
        title="tregu0458/pdf_2_text_converter",
        description="PDFファイルまたはURLを入力すると、その内容がテキストとして表示されます。"
    )
    
    # インターフェースの起動
    iface.launch()

if __name__ == "__main__":
    main()
```

上記のテキストは[クリエイティブ・コモンズ 表示-継承ライセンス](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)のもとで利用できます。
OpenWrt 用の Tailscale 自動アップデートスクリプトを作成した件

### 2024/10/12 追記
@Bacalhau 氏がイチから作り直した良いスクリプトを公開しております。
圧倒的に参考になると思いますので、~~本記事の拙いスクリプトなんて見ずに、~~ ぜひご閲覧を。

https://qiita.com/Bacalhau/items/32fc9429e0a46d576cf5

**P.S.**
今になるまで気づきませんでしたが、本記事に頂いたコメントへ返信したつもりができておらず、長い沈黙を作ってしまいすみません。


---
---
## はじめに
元を辿れば[2022年に作成した話](https://gist.github.com/myurar1a/07d375ed4f41f9207956d7a882711b8c "古のgist")ですが、便利なものを共有しないのは勿体ないと思ったので記事にしておきます。

## 経緯
OpenWrtでTailscaleを使用する場合、`opkg`で取得できるパッケージではバージョンが古いため、バイナリを直接稼働させるかと思います。
バイナリの場合は、更新を手動で行う必要がありますが、Tailscaleはそこそこの頻度で更新があり、定期実行できるようにしたかったので作成しました。

## 使い方
下記にあるスクリプトのコードを保存して、アーキテクチャとTailscale起動オプションを環境に合わせて変更し、`cron`にて定期実行してください。

※`curl`**パッケージが必要なので、別途インストールしてください。**

### ソースコード
https://gist.github.com/myurar1a/e799de5fcc947414889388c48701a181

## 技術的な話
- OpenWrtの既定シェルはashなので、それに準拠するよう作成しました
- OpenWrtは多種多様な機種で動作し、バージョンによって仕様変更も大きいため、スクリプト冒頭においてアーキテクチャとTailscaleの起動オプションを設定できるようにしています
- 最新バージョンの確認には GitHub API を、バイナリのダウンロードは公式のパッケージ配布サイトより取得しています
    - たまに最新バージョンのバイナリは配布されてないことがあるので、ダウンロードが可能であるかの確認もしています

## あとがき
このスクリプトで約1年間は稼働しておりますが、問題なく自動更新できております。
何かございましたら、お気軽にコメントしてください。
Whisper のコスト削減したい

Voicy で SRE として昨年の6月に入社したので、もう少しで1年になります。
Voicy では音声データを扱っているので、文字起こしも裏ではやっています。
そのあたりのコスト削減（案）について本日は書いていきたいと思います。

## Whisper とは？
- OpenAI が開発している、音声認識のAI
- 68万時間の多国語音声でトレーニング

## Workers AI の Whisper とは？
- Cloudflare が提供しているサービス
- Workers AI の Model の一つ
- 10,000 Neurons/day は無料
- Whisper も安価に使用できる
OpenAI:$0.006/min
WorkersAI:$0.0022/min

## コスト削減は可能か？
- 同じ時間の音声であれば、料金は1/3程度

## 検証してみましょう
- 同じ音声を使い文字起こしを検証

### Workers AI Whisper
んん？？？

```
無天下のしゃぼん玉石圏ならもう安心天然の保湿成分が含まれるため
肌にうるおよあたえすこやかにたもちます お肌のことでお悩みの方は
ぜひ一度無天下しゃぼん玉石圏をお試しくださいおもとめは012005559号まで
```

### OpenAI Whisper AP（large-v2？？）
うむ

```
無添加のシャボン玉石鹸なら、もう安心! 天然の保湿成分が含まれるため、
肌に潤いを与え、健やかに保ちます。 お肌のことでお悩みの方は、ぜひ一度、
無添加シャボン玉石鹸をお試しください。 お求めは、0120-0055-95まで。
```

![スクリーンショット 2024-04-24 18.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618488/57c183b7-db14-9424-8683-e52a828f7fb7.png)

### Colab Whisper large-v2
```
無添加のシャボン玉石鹸なら、もう安心!天然の保湿成分が含まれるため、
肌に潤いを与え、健やかに保ちます。お肌のことでお悩みの方は、ぜひ一度、
無添加シャボン玉石鹸をお試しください。お求めは、0120-0055-95まで。
```

### Colab Whisper large-v3
```
無添加のシャボン玉石鹸ならもう安心!天然の保湿成分が含まれるため、
肌にうるおいを与え、健やかに保ちます。お肌のことでお悩みの方は、ぜひ一度、
無添加シャボン玉石鹸をお試しください。お求めは、0120-0055-95まで。
```

### Colab Whisper small
```
無天下のシャボン生石鹸ならもう安心!天然の保湿成分が含まれるため肌に潤いを与え、
少やかに保ちます。お肌のことでお悩みの方は是非一度無天下シャボン生石鹸をお試しください。
お求めは0120 0055 95まで
```

### Colab Whisper base
```
無天下のしゃぼん玉石圏なら もう安心天然の保湿成分が含まれるため 
肌にうるおよあたえすこやかにたもちますお肌のことでお悩みの方は 
ぜひ一度無天下しゃぼん玉石圏をお試しくださいおもとめは01,20,00,5,5,9,5まで
```

### Colab Whisper tiny
```
無店家の社本名ませっけんだら、もう安心。天年の星つせいぶが含まれるため、
肌に揺ろう弱いはたえ、少いやかにたもちます。お肌のことでお悩みの方は、ぜひ一度、
無店家社本名ませっけんをお試しください。お求めは、01にいゼロ、0.5号号、9号まで。
```

## まとめ
- 現状の Workers AI Whisper は、OpenAI Whisper の base 相当？
- Whisper large-v3 モデル相当のリリースが望まれるとこ
- 早くコスト削減させてくださいm(_ _)m

## 参照
https://openai.com/index/whisper
https://developers.cloudflare.com/workers-ai/models/whisper/
https://colab.research.google.com/

## We're hiring
絶賛、エンジニア（だけではなく）募集してます。
カジュアル面談もやっていますので、お待ちしています。

https://recruit.voicy.jp/
API Gateway でIAM認証を通してみた！Postman、AWS CDK

## きっかけ
とあるプロジェクトで使った別で作成された既存のAPIを実行するのにIAM認証が有効になっていたためIAMが必要だったのですが、これまでAPIキーでしか認証を通したことがなかったため実装するのに悪戦苦闘しました。
色々調べてうまく行ったのでここにまとめてみました。

##  やりたいこと
 1. CDKから作成しているラムダ関数から別で作成されたIAM認証を通してAPIを実行する
 2. postmanからAPIの動作確認をしたいためpostmanでのIAM認証設定

## ラムダ関数の設定
### CDKでの権限設定
ラムダはこのように定義しました⇩
```cdk/lib/lambda.ts
const lambda = new lambda.Function(
  this,
  `lambda-${props.envName}`,
  {
    runtime: Runtime.NODEJS_18_X,
    handler: 'index.handler',
    code: lambda.Code.fromAsset('lambda/'), // ラムダコードのパス
    environment: {　// ラムダの環境変数
      REGION: this.region,
      apiGatewayEndpoint: props.apiGatewayEndpoint,
    },
    timeout: Duration.seconds(900),
    layers: [lambdaLayer], // ラムダレイヤーの設定
  }
);
```

ラムダのIAMにAPIを実行可能にするポリシーをロールに追加する必要があるので、CDKでこのように取り付けました。
```cdk/lib/lambda.ts
lambda.role?.addManagedPolicy(
  iam.ManagedPolicy.fromAwsManagedPolicyName(
    'AmazonAPIGatewayInvokeFullAccess'
  )
);
```

**これでCDKの方で必要な権限まわりの設定は完了です！**


### ラムダのコードでIAM認証する方法
```lambda/credential.ts
import { SignatureV4 } from '@aws-sdk/signature-v4';
import { defaultProvider } from '@aws-sdk/credential-provider-node';
import { Sha256 } from '@aws-crypto/sha256-js';
import { HttpRequest } from '@aws-sdk/protocol-http';

export const getSignedHttpRequest = async (url: string, body: object) => {
  const serviceName = 'execute-api'; // APIを実行するため
  const parts = url.split('?');

  const host = parts[0].substring(8, parts[0].indexOf('/', 8));
  const path = parts[0].substring(parts[0].indexOf('/', 8));

  const req = new HttpRequest({
    headers: {
      host,
    },
    protocol: 'https:',
    hostname: host,
    method: 'POST', //実行したいAPIのメソッドに変える
    path: path,
    body: JSON.stringify(body),
  });

  const signer = new SignatureV4({
    credentials: defaultProvider(), //自動的にラムダのアクセスキーとシークレットキーを使って認証コードを発行してくれます
    region: process.env.envName
    service: serviceName,
    sha256: Sha256,
  });
  const signedHttpRequest = await signer.sign(req);

  return signedHttpRequest;
};
```

**これで設定完了です！ラムダからAPI実行できるようになると思います。**

:::note warn
注意点
cdkもしくはマネコンからラムダのロールにAPIを実行するポリシーを付与できていないと

"User: arn:aws:iam::*:user/api-unvalid is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api...."
というエラーが出てしまうので注意です。
:::


## Postmanの設定

1. ポストマンの`Authorization`タグをクリックします
2. Typeで`AWS Signature`を選択します。
3. コンソールから作成した`AccessKey`と`SecreteKey`を貼り付けます。（APIInvocationの権限を付与したもの）
4. AWS Regionを設定する。東京の場合は`ap-northeast-1`になります。
![スクリーンショット 2024-05-07 16.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786369/c7172579-a120-8c36-d28f-71b725011f24.png)

**これで設定完了です！PostmanからもAPI実行できるようになりました！**
Softbank Airを無線APとして利用する際の覚書

## softbankAirのipv4の第三オクテットを指定する方法と、DHCPを無効化する手順
「ネットワークの設定」 → 「IPアドレス/DHCPサーバの設定」に移動する。
開発者ツールで[js]→[ipaddress.js]を選択し、109行目を以下に書き換える。
reg2 = /^((\d)|(\d\d)|(1\d\d)|(2[0-4]\d)|25[0-5])$/;
開発者ツール上で保存、ブラウザをリロードしたのち、希望のIPアドレスを入力する。

開発者ツールにてソースタブでapi/dhcp/settingsを検索。
saveAjaxData()の一つ前の行にブレイクポイントを置く。
管理画面上で「設定を保存する」を押下するとブレイクポイントで処理が止まる。
コンソールにてdhcp_value.DhcpStatus = 0;と実行。
ブレイクポイントより先の処理を実行させる。
再起動後 /api/dhcp/settingsにアクセスしdhcpstatus: 0であれば成功。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194067/243ad923-fae8-c90c-2d50-0429840c7a17.png)





参考にしたサイト様

https://zenn.dev/takeaship/articles/softbank-air-terminal-as-pure-ap

https://mdoca.hatenablog.jp/entry/setup-sbair-as-ap
Laravelで文字数カウントを作成する場合の注意点

# はじめに
実務で文字数カウントを実装した際に、Laravelのmaxバリデーションと文字数カウントの上限が合わないことがあったため、Laravelで文字数カウントを作成する際の注意点を記したいと思います。


# 実装したコード
```use.blade.php
<textarea id="care_skill_text" class="text_count" data-count="count1" name="care_skill_text"></textarea>
<p id="count1"></p>
```

```UserController.php
    $request->validate([
            'memo' => 'numeric|max:100'
    ]);

```


```javascript
	const textCount = document.querySelectorAll('.text_count');
	textCount.forEach(function(e){
		const data = e.getAttribute('data-count');
		const count = document.getElementById(data);
		const num = count.getAttribute('data-num');
		const numInt = parseInt(num)
		count.textContent = e.value.trim().replace(/[\n]/g, "aa").length;
		e.addEventListener('input', () => {
			count.textContent = e.value.trim().replace(/[\n]/g, "aa").length;
			if(count.textContent > numInt){
				count.style.color = "red";
			}else{
				count.style.color = "#4F4849";
			}
		})
	})
```

laravelのmaxバリデーションは、改行は２文字カウントである。そのため、文字数カウントで表示させる数字もそれに合わせなければいけません。

```
.replace(/[\n]/g, "aa")
```

この部分で改行を２文字カウントとしています。


# 最後に
今回文字数カウントというシンプルな機能の実装でしたが、Laravelのバリデーションの文字数の仕組みについて知れるいい機会でした。

今後も色々な機能を実装していきたいと思います。
ITパスポート、直列と並列稼働率問題について

# はじめに

ITパスの勉強をしていて、分からない問題がありましたので、整理しました。

# 公式はこちら

https://www3.jitec.ipa.go.jp/JitesCbt/index.html


# 問題について

図1のように稼働率0.9の装置Aを2台並列に接続し、
稼働率0.8の装置Bをその後に直列に接続したシステムがある。
このシステムを図2のように装置Aを1台にした場合、
システムの稼働率は図1に比べて幾ら低下するか。
ここで、図1の装置Aはどちらか一方が稼働していれば正常稼働とみなす。
なお、稼働率は小数第3位を四捨五入した値とする。



ア	0.07
イ	0.09
ウ	0.10
エ	0.45

![IMG_3252.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/016d6558-e565-722c-9cbc-eb8c7cb727fb.jpeg)


# 問題の意味について

まず、問題の意味から確認していきましょう。

### 直接接続

直接接続とは、このような図の状態です。

![無題5933_20240507140738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/94d6e749-f341-4421-05ab-dd23ca4c68b3.png)


片方が壊れてしまうと、進めないため、稼働が出来ません。

計算は、Aの稼働率×Bの稼働率となります。

Aの稼働率は0.9で、Bは0.8とわかっているので、
0.9×0.8
=0.72


### 並列接続

並列接続とは、このような図の状態です。

![無題5934_20240507140729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/f48b14da-4cf1-3544-03bf-d7bb04fc3c08.png)

片方が壊れても、もう片方で稼働出来ます。

並列システムの稼働率
=1-(1－A1の稼働率)×(1－A2の稼働率)×Bの稼働率


1というのは、100%ですね。
全体を表しています。


=1-(1－0.9)×(1－0.9)×Bの稼働率
=1-(0.1×0.1)×Bの稼働率
=1-0.01×Bの稼働率
=0.99×Bの稼働率

Bの稼働率は0.8なので

0.99×0.8
=0.792

四捨五入して
0.79


# 比べないといけないので


0.79-0.72
=0.7


答えは0.7
マッキンゼーの記事を読み解いて、企業における「生成AI活用の現在の立ち位置」を評価する

このマッキンゼーの記事が、企業における「生成AI活用の現在の立ち位置」を評価するのにとても役に立ちます。
A generative AI reset: Rewiring to turn potential into value in 2024

https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights/a-generative-ai-reset-rewiring-to-turn-potential-into-value-in-2024#/

記事は英語ですが翻訳ツールを利用すれば簡単に日本語で読めることは言うまでもありません（私はEdgeの翻訳機能を使いました。）翻訳によるエラーを最小限にするため英語で２回ほど目を通し、最後に日本語で精読しながら概念図に起こしました。

記事の文章内容については重複になるし、生成AIでいくらでも要約が作れるので当記事では省略します。

以下はマッキンゼーの記事で取り上げられている戦略的レコメンデーションを概念図にしたものです。記事を読み解くうえでのヒントとしてお使いください。なお、概念図には私なりの解釈も含まれている場合もあるので、参照記事と多少内容が異なる場合もありますのがご了承ください。スライドショーのように眺めるだけでも良いかもしれません。

（なお、ダイアグラム中の「GenAI」は「生成AI」と同義です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/62f44c9c-f156-b278-6833-9980f1513ffb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/d82dd1d6-db5e-80ef-086d-a7d001a565e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/2f5b2a4f-26c3-f116-0f79-5eb7bb19c37b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/63b55ff7-03d7-7248-5e9a-9877851a75cc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/98f3b604-da56-9c2b-4007-d1407738b9c3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/b5851610-048d-b3ce-db8d-ef0ba98612d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/dce19dc9-d88e-fdbc-0b88-a7366758958e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/6b704609-f1d6-8788-52a9-12d30cbeb22e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/17526683-33f6-0123-4585-53cef98e803d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/69f021b8-0a7f-a38c-cd64-52cc4fa0a6fc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/a244936b-a660-89fa-a74e-30b6165b4409.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/51e895c0-d43c-b7ec-6098-ed622dc7b211.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/12ccacf9-870e-f43b-0e5d-cc44d2066740.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/5069d698-b282-55d7-ecb5-b6ccaf23eb17.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/b24b4047-3c4a-f3fe-5aad-e2dd221f3618.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/6a4559b1-8d2c-4351-15a8-4de1833e248e.png)
[合格体験記] JavaSilver 受験費用を抑えるコツ


はじめまして。文系新卒入社3年目の白田です。
JavaSilver試験を受験し、合格したので情報共有します。
私は「受験費用を抑えるコツ」についてご紹介します。
できるだけ安く受験したい方に向けての解説です。
試験対策については、他の方の合格体験記を参考にしてください。

# 結論
・再受験無料の期間内に申し込め！
・公式から購入するな！
　の2点です。順に解説します。

# 再受験無料の期間内に申し込め！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736349/41acd9a6-6c7e-c148-f300-e4d061e63481.png)

プロモコード「RETAKE24JP」を入力して受験すれば、一度不合格でも再受験の際に受験料を払う必要がなくなります。
一度不合格でも大丈夫、と思えるのは安心感が段違いです。力試し的な受験ができます。

キャンペーンは通年3月から5月の間に実施されることが多いようです。

https://www.pearsonvue.co.jp/Clients/Oracle/Special-Offers/Retake2024.aspx


# 公式から購入するな！
公式の受験料は37,730 円します(高い)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736349/2f0ee19e-86a6-66cf-1890-579725d94344.png)

対して、楽天市場のチケットの受験料は35,200 円でした（それでもまあ高い）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736349/c1b828ae-b75c-e0be-7b87-8345c0e6d420.png)

1500円ほど安く、楽天ポイントも付与されます
(買いまわりや5のつく日にチケットのみを飼っておくにも手)
試験の内容は全く同じですので、こちらで買わない手はありません。


楽天ルームのリンク貼っておきます
https://room.rakuten.co.jp/room_918c4e5a00/1700247847777393


# リンクまとめ
・楽天の試験チケット
https://room.rakuten.co.jp/room_918c4e5a00/1700247847777393
・ORACLE公式の試験チケット
https://www.oracle.com/jp/education/certification/1z0-815-jpn-48261-ja.html
・再受験無料の案内
https://www.pearsonvue.co.jp/Clients/Oracle/Special-Offers/Retake2024.aspx

# 余談
・受験方法のガイド（わかりやすかった）
https://manabiya-sakura.com/information_technology/id=1554/
・教材：黒本のみ
・勉強開始日：3/7
・受験日：5/3（テストセンター受験）
・勉強時間：50時間ほど
・点数65％（合格点は63％なので、ほんとにギリギリ！焦った！）
[Blender]リグとボーンが連動しない

## 何があった？

Rigifyで事前に用意されているサンプルだけを使ってボーンを設置したのに、いざGenerate Rigしてみるとボーンと独立した動きしか再現できませんでした。

<details>
  <summary>詳しい状況（長いので折りたたんでいます）</summary>
まずGenerate Rig直後はリグがボーンともメッシュとも連携されていませんでした。

ただしメッシュとリグは
`Armature Deform With Automatic Weights` で紐づけたところ想定通りの挙動をしました。

そしてボーンもメッシュに引き摺られて一緒に動くものだと予想していたのですが、そうならなかったです。
</details>




※悩んだ時のBlenderの様子（ツノのボーンがポージングに紐づいていない様子）
![スクリーンショット 2024-05-07 13.47.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/89c54ad0-0f11-aa7b-e739-c0afe4a5ebc8.png)

## 原因

リグ専用のボーンが複製されて非表示になっているのに気づいていなかっただけでした。

ちょっと見にくいのですが、非表示されていたものを表示にすると下記のようにオレンジ色のリグと連動しているボーンがあるのを確認いただけると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/fb7947ac-d39d-e772-495c-edb14bd39a30.png)


## 解決方法

以下の手順でリグ専用のボーンを表示させるだけで解決します。
`プロパティ > Data > Bone Collectionsのプルダウンを開く > DEFの目のアイコンを開いた状態にする`

※下記図も参照いただけます
![スクリーンショット 2024-05-07 14.12.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/04c9b623-6a30-9e26-c2c9-fd13a2f282ec.png)



## まとめ

- リグとボーンが連動しないのは何か操作ミスしたからではなく、**Rigifyを使う場合は元となるボーンはポージングでは触らない**という仕組みによるものなので手違いではない

<div></div>

- Generate Rig はリグのためのボーンを`アウトライナー > Rig-Armature > Pose`の中に生成しているのでそちらを使ってアニメーションを作ることとなる

<div></div>

- リグとメッシュは自動で紐づかないので、`Armature Deform With Automatic Weights`などで紐づける必要がある

## 注意点

本記事はBlender4の場合のものとなっています。

原因は同じですが3.6未満の場合Bone Collectionsが存在せずにレイヤによる管理になっていて操作方法が異なるはずなのでご注意ください。
PDO接続の2002：対象のコンピューターによって拒否されたための対処法

# エラー内容
PHPでのPDOを用いたDB接続において下記で接続できますが、つまずいたので残しときます。
```
$dbh = new PDO('mysql:dbname="データベース名";localhost', 'ユーザ名', 'パスワード');
```
上記で接続を行うことができるはずですが画像の通り2002エラーがでました。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776357/43069d1c-7e03-e5e8-3226-b884ee854527.png)

# 対処法
```
xmapp\phpMyAdmin\config.inc.php
```
上記の場所にconfig.inc.phpというファイルがあるので探してください。
このファイルにポート番号があるので確認していきます。
```
$cfg['Servers'][$i]['host'] = 'localhost:3305';
```
このように記述された点を探すと、ポート番号が"3305"になっていることが分かります。
ポート番号はデフォルトでは"3306"となっているはずなのでPDO接続の際にlocalhostという記述のみでは接続ができなかったということです。
```
$dbh = new PDO('mysql:dbname=データベース名;host=localhost:3305', 'ユーザ名', 'パスワード');
```
以上で接続が完了です。

# それでも接続できない場合
データベース名、ユーザ名、パスワードが一致しているか確認してみましょう。
ユーザ名、パスワードはphpMyAdminにログインするもので大丈夫です。
確認の仕方は
```
xmapp\phpMyAdmin\config.inc.php
```
先程使ったconfig.inc.phpの中にユーザ名とパスワードを確認できるのでもし忘れた方がいたらぜひ。
【AWS】Amazon Redshiftクラスターの作成手順

# はじめに
今回はAmazon Redshiftクラスターの作成手順を、備忘も兼ねて、実画面とともに記載します。

Amazon Redshiftの概要については先日まとめたため、必要に応じてご確認ください。

https://qiita.com/rm_zeal/items/b77818daff6f92fc5cd3

# 目次
・Amazon Redshiftクラスター作成手順
　①Redshiftで「クラスター」を選択し、「クラスターを作成」を押下
　②クラスター設定を実施
　③サンプルデータ
　④データベース設定
　⑤クラスターの許可
　⑥追加設定
　⑦「クラスターを作成」を押下
・注意
・おわりに
・参考

# Amazon Redshiftクラスター作成手順
#### ①Redshiftで「クラスター」を選択し、「クラスターを作成」を押下
・この際、リージョンの指定が適切に行えているかを確認（今回は東京リージョンを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/c9a57b99-3634-c6a2-55bc-e3575d143b74.png)

#### ②クラスター設定を実施
**クラスター識別子**
・クラスターの名称を決める
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/9dbdf0a7-18d6-6cb5-18a5-8424373edd58.png)

**クラスターのサイズを選択する**
・クラスターのサイズについて、「自分で選択します」「選択のヘルプ」のどちらかを選択する

①「自分で選択します」を選択した場合
・要件を満たすノードの種類・AZ設定・ノード数を自分で選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/19e65b70-6407-5b51-47dd-1e8af93b52d0.png)

②「選択のヘルプ」を選択した場合
・要件を設定していき、その要件を満たすノードの種類が見積もりされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/c88f8a3d-93ec-d2fb-5a9b-552a70bc56c0.png)


#### ③サンプルデータ
**サンプルデータをロードするかどうかを選択**
・選択した場合、Redshiftクラスターにサンプルデータをロードすることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/c0bf3347-e0d0-24d2-465e-98dc70acccb2.png)

#### ④データベース設定
**管理者ユーザー名**
・DBインスタンスの管理者ユーザーのログインIDを入力
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/cc540c87-5697-ad5e-2d34-bd8a5f01723a.png)
 
**管理者パスワード**
・管理者パスワードを管理するオプションを選択
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/552a219b-e5ba-4201-9d5c-ffec4942abff.png)
 
**管理者パスワードのオプション**
 ①「AWS Secrets Manager で管理者認証情報を管理する」
・AWSが所有・管理するキーで暗号化される
・「暗号化設定をカスタマイズする(高度)」を選択すると、任意のキーの選択、または新規作成を行うことができる

②パスワードの生成
・Redshiftが管理者パスワードを生成する

③管理者パスワードを手動で追加する
・任意のパスワードを手動で入力し設定することができる


#### ⑤クラスターの許可
・必要に応じてIAMロールの設定・作成を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/a70339bc-7a3b-c0b1-1265-13219ef1fe2e.png)



#### ⑥追加設定
・ネットワーク・バックアップ・セキュリティ等、追加の設定を実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/ee21ed5c-5ad1-8ec8-6253-2885e0a9fba5.png)


#### ⑦「クラスターを作成」を押下
・押下後、作成完了までは数分かかる


# 注意
:::note alert
クラスター作成完了後、デフォルトで **「Available」** となります。
**作成後すぐ使用しない場合は、必ず起動停止を行いましょう。**



**状態が「Paused」になっていればOK**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/f919ffa0-cb4b-8300-582f-c1bc4581d1c3.png)
:::

# おわりに
今回はAmazon Redshiftクラスターの作成手順を記載いたしました。
注意としても記載していますが、作成後は自動で起動状態となるため、作成の際は注意してください！

# 参考
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/managing-clusters-console.html#create-cluster



---------------------------------------------------

 株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：

https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
RailsアプリケーションにBulletを導入してN+1問題を発見する

## はじめに

RailsのN+1クエリ問題は、データベースのパフォーマンスを大きく低下させる原因となります。この問題を解決するために、`bullet` ジェムを導入し、効率的に問題を特定し、解決する方法を紹介します。

## BulletGemの導入

1. **Gemfileに追加**

   開発環境でのみ`bullet`を使用するように設定します。

   ```ruby
   group :development do
     gem 'bullet'
   end
   ```

2. **インストール**

   変更を加えたら、コマンドラインで以下を実行して、gemをインストールします。

   ```bash
   bundle
   ```

### Bulletの設定

`config/environments/development.rb`にBulletの設定を追加します。

```ruby
config.after_initialize do
  Bullet.enable = true                  # Bulletを有効にする
  Bullet.alert = true                   # ブラウザのJavaScriptアラートとして警告を表示
  Bullet.bullet_logger = true           # Rails.root/log/bullet.logにログを記録
  Bullet.console = true                 # ブラウザのコンソールに警告を出力
  Bullet.rails_logger = true            # Railsのログに警告を出力
  Bullet.add_footer = true              # 画面の下部に詳細を表示
end
```

### N+1問題を意図的に発生させてテスト

`Bullet`の設定が機能しているかをテストするために、意図的にN+1問題を発生させます。

```ruby
# 例えば、UsersControllerで
def index
  @users = User.all
  @users.each do |user|
    puts user.profile.name
  end
end
```

このコードは、ユーザーのプロフィールを取得する際にN+1問題を引き起こします。

### N+1問題の具体例と解決策

**Bulletからの警告:**
```
USE eager loading detected
Reservation => [:company]
Add to your query: .includes([:company])
```

**修正前のコード:**
```ruby
def index
  @reservations = Reservation.all
end
```

**修正後のコード:**
```ruby
def index
  @reservations = Reservation.includes(:company).all
end
```

この修正により、予約データをロードする際に関連する会社情報も一度に取得するため、ページのレスポンスタイムが大幅に改善されます。

## まとめ

Bulletは、開発過程でのN+1クエリ問題の特定と解決を助ける強力なツールです。適切に設定と使用を行うことで、アプリケーションのパフォーマンスを向上させ、より効率的なデータベースアクセスを実現することができます。
Linuxで音量を100%以上にあげる方法

#  音量をpavucontrolで操作する
音量を100%にしても相手の声が聞こえない場合、pavucontrolというtoolを使って100%を超える事が出来る。

```
sudo apt install pavucontrol
pavucontrol
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/636e93ae-b8cd-a74f-6e50-bd86f308bcdc.png)

# Reference
[How to Boost Sound Volume Above 100% in Linux](https://www.baeldung.com/linux/boost-sound-volume-above-max#:~:text=Using%20the%20PulseAudio%20Volume%20Control&text=Below%20the%20Port%20option%20is,to%20a%20maximum%20of%20153%25.
)
TensorFlow Keras Layerにおける行列の積:MatMul (Self-Attention)

```python
width = 32
inputs = keras.Input(shape=(width, ))
v = layers.Dense(width)(inputs)
k = layers.Dense(width)(inputs)
q = layers.Dense(width)(inputs)
v = keras.layers.Reshape((-1, 1))(v) # shape: [batch, 32, 1]
k = keras.layers.Reshape((-1, 1))(k) # shape: [batch, 32, 1]
q = keras.layers.Reshape((1, -1))(q) # shape: [batch, 1, 32]
kq = layers.Lambda(lambda x: tf.matmul(x[0], x[1]))([k, q]) # shape: [batch, 32, 32]
kq = layers.Softmax()(kq)
outputs = layers.Lambda(lambda x: tf.matmul(x[0], x[1]))([kq, v]) # shape: [batch, 32, 1]

model = models.Model(inputs, outputs)
```

間違ってたらコメントください。

## 参考文献

https://www.tensorflow.org/api_docs/python/tf/linalg/matmul

https://www.tensorflow.org/api_docs/python/tf/keras/layers/Reshape
React始めてみたいあなたへ。CodePenでかんたん世界時計！

## 冒頭
:::note warn
Aさん:「まずは公式Tutorial見ましょうね。」
Bさん:「動画学習しましょうね。」

あなた: 「はい！がんばります！」
:::
って飲み込むの疲れますよね。

今回は、「ちょっとReact気になってるよ。」という人向けの記事です。
簡単に試せる（遊べる）方法を紹介したいと思います。

題して、**「Reactで世界時計やってみよう ~ with CodePen」** です。
ハードルめちゃくちゃ低いです。

## 前提
- [CodePen]()のアカウント登録（もしかすると登録せずにできたかも。）
- 時差の概念を知っている

## サンプルコード
とりあえず動くものをお見せします。4カ国の世界時計です。
デジタルです。

<p class="codepen" data-height="300" data-theme-id="light" data-default-tab="html,result" data-slug-hash="xxeNbwW" data-user="qykyopig-the-sans" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/qykyopig-the-sans/pen/xxeNbwW">
  World Clock</a> by Kazuya Umeki (<a href="https://codepen.io/qykyopig-the-sans">@qykyopig-the-sans</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 手順（解説込み）
### 1. CodePenにログイン。新しくPenを追加。
![Penの追加画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/36640de9-7b68-58e7-68d9-05b10f04c63c.png)

### 2. React環境のSetup。
ReactのPackageを使用できるように環境をセットアップします。
#### 1. まずは歯車マークを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/27a95e91-5956-b75c-6035-85c00dfa2b36.png)

#### 2. JSタブ内で必要な設定を行う。
1. ``JavaScript Preprocessor``という項目があります。
``Babel``を選択してください。
2. ``Add External Scripts/Pens``の検索窓から``react``と``react-dom``を入力。
    それぞれサジェストがでてきますのでクリック。

画像のようになればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/67511a5f-6772-62e0-06b1-89937f5e5d15.png)

これでReact環境のセットアップが完了です。

### 3. HTMLとCSSを書きます。

#### 1. HTML
ID属性だけ指定します。
```html:index.html
<div id="root"></div>
```
#### 2. CSS
好みに合わせてCSSを設定します。
```css:index.css
body {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #f0f0f0;
}

h2 {
  text-align: center;
  font-size: 16px;
}

```
### 4. JavaScriptを書きます。
ここではあまり詳しく解説しません。あくまでもサンプルコードとして参考にしてください。


もちろんDebugもできます。エディタやブラウザで開発する時同様に``console``等で確認できますよ。
```js:index.js
console.log(zone);
```

### 遊びポイント
[#2. React環境のSetup。](#2-react%E7%92%B0%E5%A2%83%E3%81%AEsetup)で紹介した方法を使って、npmやCDNが提供するライブラリを導入することができます。
コーディングやフロントエンドの実装を始める前に、簡単な概念実証（Proof of Concept）に使えそうですよね。

### まとめ
今回はCodePenを利用してReact環境を構築し、簡単な世界時計を作成してみました。
List<T>に対するループを高速にする

## 参考
この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

https://youtu.be/0iTMIxZeyXg?si=MJMJGYedspSyZM1W

## CollectionsMarshal.AsSpan

`List<T>`から、`CollectionsMarshal.AsSpan`メソッドを使って`Span<T>`を取り出すことができる。
取り出した`Span<T>`に対してループすれば、配列`T[]`に対するループと同程度まで速くなる。


```C#
using System.Runtime.InteropServices;

public void Method(List<string> list)
{
    var span = CollectionsMarshal.AsSpan(list);
    foreach (var item in span) // for文でも同程度の効果
    {
        // itemに対する処理
    }
}
```

（手元の例では、`Span<T>`に対してループを実行すると、`List<T>`に比べて実行時間が約半分になりました）

### 注意
`Span<T>`を取り出した後に、元の`List<T>`に対して要素の追加・削除を行わないこと。
位相と振幅をプロットしたい！

## はじめに
毎回忘れて調べるので備忘録兼コピペ用として書きます．
Python を用いて，複素数のデータを入力として，位相及び振幅をプロットします．

## 環境
* Python 3.11
* numpy 1.26.3
* matplotlib 3.8.3

## 方法
複素正弦波`z` を生成して，プロットする．
必要そうなラベルなどはすでに設定済みなので，適宜変更してください．
```Python
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,4*np.pi,100)
z = np.exp(1j*x)
r = np.abs(z)
theta = np.angle(z)

fig, ax = plt.subplots(2, 1)
ax[0].plot(r)
ax[0].set_xlabel("time")
ax[0].set_ylabel("amplitude")
_, y_max = ax[0].get_ylim()
ax[0].set_ylim(0,y_max)
ax[1].plot(theta)
ax[1].set_xlabel("time")
ax[1].set_ylabel("angle")
ax[1].set_ylim([-np.pi-0.1,np.pi+0.1])
ax[1].set_yticks([-np.pi, 0, np.pi])
ax[1].set_yticklabels(['-π', '0', 'π'])
plt.tight_layout()
plt.show()
```
出力結果は以下の通り．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642842/14e0f461-5cd2-19f9-5d21-74c52495334e.png)

## Appendix
位相の連続性に着目したい場合には， `np.unwrap()` が便利．
```Python
x = np.linspace(0,4*np.pi,100)
z = np.exp(1j*x)
r = np.abs(z)
theta = np.angle(z)
theta_unwrapped = np.unwrap(theta)

fig, ax = plt.subplots(2, 1)
ax[0].plot(r)
ax[0].set_xlabel("time")
ax[0].set_ylabel("amplitude")
_, y_max = ax[0].get_ylim()
ax[0].set_ylim(0,y_max)
ax[1].plot(theta_unwrapped)
ax[1].set_xlabel("time")
ax[1].set_ylabel("angle")
# ax[1].set_ylim([-np.pi-0.1,np.pi+0.1])
# ax[1].set_yticks([-np.pi, 0, np.pi])
# ax[1].set_yticklabels(['-π', '0', 'π'])
plt.tight_layout()
plt.show()
```
出力結果は以下の通り．
位相の連続性が保たれたままプロットできている．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642842/388a1d3d-86ba-e9b2-8c5f-9e527d7c112b.png)

## 参考文献
* np.unwrap https://numpy.org/doc/stable/reference/generated/numpy.unwrap.html
【CakePHP】MissingViewExceptionの対応方法

## はじめに
CakePHPでAPIを作成していてMissingViewExceptionが発生するため調べてみました。

## 結論
下記のコードを対象のメソッドに追加すると解決しました！
```PHP
$this->autoRender = false;
$this->autoLayout = false;
```

## ChatGPT曰く
>ビューの自動レンダリングが有効な場合: $this->autoRender がデフォルトの値である true のままだと、アクションメソッドがビューファイルを自動的にレンダリングしようとします。そのため、アクションメソッドに対応するビューファイルが存在しない場合、ファイルが見つからないというエラーが発生します。

>レイアウトの自動適用が有効な場合: $this->autoLayout がデフォルトの値である true のままだと、アクションメソッドがレイアウトを自動的に適用しようとします。そのため、レイアウトファイルが存在しない場合、またはレイアウトの設定に問題がある場合、レイアウトが見つからないというエラーが発生します。

とのことでした。

## まとめ
この記事が誰かのお役に立てば幸いです！

## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/
VisualStudioでRuntimeLibraryマクロ

## はじめに

:::note warn
備忘録なので雑に書いています。
:::

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660536/444bf87c-4da4-c855-0daa-1aefcbf3d7a2.png)

これが欲しい時がありました。通常は存在しません。
(Includeの方では謎の`%(RuntimeLibrary)`が出てくる。)

## 追加方法

```diff_xml
<PropertyGroup Label="Globals">
  <VCProjectVersion>16.0</VCProjectVersion>
  <Keyword>Win32Proj</Keyword>
  ...
    
+  <RegexRuntimeLibrary><![CDATA[<ItemDefinitionGroup Condition=".*']]>$(Configuration)\|$(Platform)<![CDATA['">(?:.*\n)*?.*<RuntimeLibrary>(.*)</RuntimeLibrary>(?:.*\n)*?.*</ItemDefinitionGroup>]]></RegexRuntimeLibrary>
+  <RuntimeLibrary>$([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText($(MSBuildProjectFullPath))), $(RegexRuntimeLibrary)).Result('$1'))</RuntimeLibrary>
</PropertyGroup>
```

`*.vcxproj`にこれを追加する。以上。

## おわりに

*.vcxproj内では`PowerShell`が使えることを知りました。
雑ですが備忘録として。
【JS】ラベル

# ラベルの概要

「ラベル」はJavaScriptにおける「`goto`文」のようなものです。

## `break`

```js
for() {
  for() {
    break;
  }
  //breakした後の処理
}
```

この例は、ネストされた `for` の `break` は、上位の `for` を `break` できないことを示しています。

<details><summary> break とは</summary>


https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/break

> break 文は現在のループや switch 文を終了し、プログラムの制御を終了した文の次の文に移します。ラベル付きの文の中で使用された場合は、ラベル付きの文を飛び越えるためにも使われます。
</details>

この時に使用するのが「ラベル」です。

```js
loop: for() {
        for() {
          break loop;
        }
      }
  //breakした後の処理
```

## `continue`

「ラベル」のもう一つの使用例は `continue` です。

<details><summary>`continue` とは</summary>


https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/continue

> continue 文は、現在のループまたはラベル付きループの現在反復処理中の文の実行を終了し、次の反復処理としてループの実行を続けます。
</details>

```js
for() {
  for() {
    if(condition) {
      continue;
    }
  }
  //conticueした後の処理
}
```

```js
loop: for() {
        //continueした後の処理（次のループ）
        for() {
          if(condition) {continue loop}
        }
      }
```
# 使用例

使用例は考えてみたのですが、
「ラベルを使うより良い方法があるなあ」となる例ばかりでした。
そもそも2重`for`が可読性悪いですし。
`goto`文自体が古の構文ですしね。

個人的な経験としては、アルゴリズム問題を手早く解くために使用したケースのみです。
実装においては使わないほうが良いかなと。


良い例をお持ちの方はコメントいただけると幸いです。

JavaScriptは後方互換性を保持する傾向が強いため、
使用することはなくとも、仕様の一つとして知っておくことは良いかもしれません。
仕様書や、古いコードで目にするかも。

https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#prod-IdentifierReference:~:text=await-,LabelIdentifier,-%5BYield%2C%20Await%5D
【JSTQB FL】JSTQB Foundation Level試験の勉強方法をまとめてみた

皆さんは今年のGWに何をしましたか？
私はJSTQBの試験を受験したのでその勉強についてまとめたいと思います。
受験後ホヤホヤでこの記事を執筆しているので結果につながったかはわかりませんが、紹介していきたいと思います。
※結果を確認したところ無事合格していました。


# 学習に使用したもの
- シラバス
    - 以下から入手
    - https://jstqb.jp/syllabus.html
- テス友
    - https://www.qbook.jp/info-testomo/
- youtube
    - GTM【プログラミング講座】の動画
    - https://www.youtube.com/@gtm2711

# 学習手順
### 各章ごとに以下の手順を実施
1. まずはyoutubeの動画を見てざっくり全体像を把握
1. シラバスを覚える
    1. 大事だと思った項目は見ないで言えるくらいにする
        1. シラバスを見て覚えたい項目を覚える
        1. 覚えたと思ったら何も見ないで覚えた事項を思い出す
        1. 覚えられていない部分があれば確認する
        1. 翌日また同じことを思い出す
1. 学んだ章に絞ってテス友で問題を解く
    1. 間違った部分を覚え直す

以上でシラバスの内容はほぼ覚えられるのではないかと思います。
この手順で重要なのはシラバスを覚える部分で、何も見ないで思い出すということをサボらずにできると記憶に残ります。


### 上記の手順が終わったら実施
以上の手順が最後の章まで終わったら次の段階です。
1. テス友の全章ランダムで解く
    1. 毎回90%以上の正答率になるまで

# 受けてみて振り返り
全く自信のなかった問題が、40問中11問でした。
今回短期集中で記憶し、受けたのにしてはまずまずな結果かと思っています。
選択肢はどれもそれっぽくて迷うので、シラバスの文言を丁寧に覚えておくと対応できるのではないかと思います。

前日までにシラバスの６割ぐらいしか記憶できていなかった気がします。
当日はテストセンター近くの喫茶店に朝8時半からこもって勉強し、16時に受験をしました。
高校の定期テスト前のような感覚になったのは言うまでもありません。
朝から脳をフルに使い、テストを受ける直前はさもテストが終わったかのような疲労感だったのであまりおすすめできません。
私は長期間集中するのが苦手なのでこのような強行手段をとりましたが個々の学習のタイプに合わせた選択をするのが大事だと思います。

# 終わりに
あくまで私の勉強方法なのでそれぞれにいいなと思ったエッセンスがあれば取り入れる程度が良いと思います。
この記事を読んで試験を受ける方の合格につながると幸いです。
読んでいただきありがとうございます。
CSSの変数

# はじめに
CSSでも変数を使うことができるのでどのように実装するのかメモ

# やり方
全体で値を再利用するために、css変数を利用することができる
rootで宣言することが一般的

```.css
:root {
	--color-warning: red;
	--color-danger: yellow;
}

.danger {
    /* 背景 */
    background-color: var(--color-danger);
    /* 文字色 */
    color: white;
    /* 文字の太さ */
    font-weight: 700;
    /* 文字の位置 */
    text-align: center;
    /* 文字の大きさ */
    font-size: xx-large;
}
```