OmniAICreator/Qiita-1.07M huggingface dataset:
転職おすすめサイト まとめ

# はじめに
転職活動を始めるにあたり、どの転職サイトを利用すれば良いか迷うことが多いと思います。
私自身も半年間転職活動を行い、その中でいろいろなサイトを利用してみました。
これまでの経験をもとに、おすすめ順にサイトをまとめました。
それぞれの特徴やメリット・デメリットを紹介しますので、参考にしていただければ幸いです。
(招待コードを登録してくれると泣いて喜びます。)

# バックグラウンド
私は新卒でWeb企業に入社し、新卒3年目です。(内定者インターン期間を含めると３年超です。)
今回が初めての転職活動で、主に自社開発企業のバックエンドエンジニアのポジションを中心に探していました。

基本的にオファー待ちのような形で転職活動をしていました。
双方の理解を高めるために、最初に面談をしてもらっていました。

# 特におすすめ
## [Findy ファインディ](https://findy-code.io/home)

https://findy-code.io/home

- サポートが手厚い
- 多くの質の高いオファーが来る
- 面談から始められる

私が最初に登録したサービスです。
専属のエージェントが付き、定期的な面談やアドバイスを提供してくれます。（エージェントとの相性はありますが、私の場合は非常に手厚いサポートを受けられました。）
学生時代に就職活動をすぐに終えてしまったため転職活動の進め方がわからなかった私にとって、全体的な流れやアドバイスが非常に参考になりました。

企業側は高額プランと低額プランで契約しているようです。
エージェントは高額プラン契約の企業を積極的に推薦する傾向がありますが、最終的な判断は自分で行う必要があります。
高額プラン契約企業は面談後や面接後にフォローアップしてくれる傾向がある一方、低額プラン契約企業からは主にオファーのみが届きます。

オファーの数自体はかなり多く、Findy自体がWeb系企業であることもあり、登録企業の質が全体的に高い印象です。（サイトの改善案を伝えたところ、迅速に対応してくれたことが何度かありました🙇）

### 招待コード
```
di_crtrCqphSV
```

## [転職ドラフト](https://job-draft.jp/)

https://job-draft.jp/

- 自分の市場価値がわかる
- オファーは少数精鋭
- 知名度の高い企業からオファーが来る
- エージェントサービスもあるが、サイトとは直接紐付いていない

このサービスは、自分が競売にかけられて値札付けされる形式のサイトです。
そのため、自分の市場価値を直接知ることができます。

ドラフトは月1回の開催で、参加企業も毎回変わるため、スピード感はやや欠けます。
しかし、年収が明示されるのは大きなメリットでした。

参加企業は大手が多い印象で、メガベンチャーや有名企業からも多くのオファーがありました。

エージェントサービスも提供されていますが、Findyとは異なり、サイトと直接紐付いていないため、若干の使いづらさがありました。（私自身は利用しませんでした）

(サイトとエージェントサービスを連携させれば良いのではと考えましたが、それによってドラフトの価値が低下する可能性があるため、現状の仕組みにも納得できました。)

### 招待コード
```
QWZM
```

# おすすめ
## [LAPRAS ラプラス](https://lapras.com/)

https://lapras.com/

- オファーの質がいい
- サポートはない

LAPRASは、GitHubやX（旧Twitter）、connpassなどのアカウントを連携すると、自分の市場価値をスコアで可視化してくれるサイトです。

オファーの質が非常に高いです。
以前はエージェントサービスがあったようですが、現在は提供されていません。
直接企業とマッチングする形式のため、自己管理が必要です。

とりあえずで登録すればいいと思います。

## [Forkwell フォークウェル](https://forkwell.com/)

https://forkwell.com/

- 職務経歴書の添削サポートが優秀
- オファー数は少ない
- エージェントのサポートは限定的

Forkwellは、職務経歴書の添削サポートが特に優れている転職サービスです。
文章力に自信がない私にとって、一言一句丁寧に添削してくれるこのサービスは非常に有益でした。
職務経歴書添削に関しては、利用した転職サービスの中で最も良かったと感じています。

一方で、オファーの数は比較的少なく、エージェントのサポートも限定的という印象を受けました。
実際に、エージェントの紹介で企業面談を経験しましたが、企業自体は魅力的だったものの、紹介された部署とのミスマッチがありました。
この点について事後アンケートでフィードバックを提供しましたが、特にフォローアップはありませんでした。このことから、サポートの深さには課題があると感じました。


### 招待コード
```
VNJXJK
```

# 登録はしてみてもいいかも
## [~~PayCareer ペイキャリア~~](https://pay-career.com/)

2025/6/10追記
サービス終了するそうです。南無

https://pay-career.com/

- ~~面談参加で報酬が得られる~~ (2025年4月1日から職安法により廃止されたそうです)
- 自己推薦は不可
- エージェント（1名）が付くが、エージェント経由では報酬なし
- オファーの質にばらつきがある（導入企業の質に課題か）
- 後半にはより魅力的なオファーも見られた

~~新しいコンセプトのサービスで、面談参加で報酬が得られます。~~
ただし、オファーの質には課題があり、知名度の低い企業やSES企業からの案件が目立ちました。
（サービス利用の終盤に著名企業からのオファーもあったため、今後改善の可能性あり）
自己推薦はできません。

エージェントについては、独自のコミュニティ内の企業を紹介している印象で、一般的なエージェントサービスとは異なる点があるようです（個人的には利用しませんでした）。
-> エージェント経由だと報酬はもらえないはずです。

### 招待コード
```
pcneYxpDANrRjxVD
```

# おすすめできない
## GREEN
- 主に未経験者や経験の浅い転職希望者向けのサイトという印象
- 経験豊富な専門職向けのコンテンツや求人が少ない

今の自分にはあっていませんでした。

## ギークリー
- いわゆる転職エージェントサイト
- 内定獲得を重視するあまり、候補者の適性や希望よりも応募数を優先している印象
- サイトのユーザビリティに改善の余地あり
- エージェントからの連絡頻度が高すぎる傾向がある

初手から面接でした。
自分にはあっていませんでした。

追記:退会しても定期的にDMや電話が来ます。

# おわりに
以上が、私が半年間の転職活動で実際に利用してみた転職サイトのおすすめ順になります。
転職活動は個々の状況や希望により異なりますので、自分に合ったサイトを見つけることが大切です。少しでも皆さんの転職活動のお役に立てれば幸いです。
転職が成功することを心より願っています。
Sequence Maker V1.60で追加された新機能

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。2024年6月にSequence MakerのV1.60がリリースされました。今回はV1.60で追加された新機能について解説したいと思います。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

## リリースノート
Sequence Makerのリリースノートは以下のサイトに公開されています。

https://www.hioki.co.jp/jp/support/versionup/detail/?downloadid=1438

それによると以下の機能が追加されています。

### V1.60 2024/6
- 専用コマンドの追加
- CONTEC USB GPIB通信ドライバ(API-GPIB(WDM))の対応
- 制御可能な計測器を最大12台に拡張
- その他軽微な修正

## 専用コマンドの追加
| コマンド | 解説 |
|:-|:-|
| #POLL?(コマンド,値, ...)	  | コマンドの応答が指定の値になるまで繰り返しチェックします。<br>値は最大8個まで指定可能です。<br>コマンドまたは値にコンマを含む場合はダブルクォーテーションで括ります。<br>コマンドとコマンドの間はコマンド送信前ウェイト時間分のウェイトが入ります。  |
|#INBIT?(ビット番号)|CONTECデジタル入出力ユニットの指定ビットからビットデータを入力します。<br>入力先は詳細設定のCONTECデバイス名に設定します。|
|#INBYTE?(ポート番号)|CONTECデジタル入出力ユニットの指定ポートからバイトデータを入力します。<br>入力先は詳細設定のCONTECデバイス名に設定します。|
|#OUTBIT(ビット番号,ビットデータ)|CONTECデジタル入出力ユニットの指定ビットへビットデータを出力します。<br>出力先は詳細設定のCONTECデバイス名に設定します。|
|#OUTBYTE(ポート番号,バイトデータ)|CONTECデジタル入出力ユニットの指定ポートへバイトデータを出力します。<br>出力先は詳細設定のCONTECデバイス名に設定します。|

（https://sequencemaker.hioki.com/manual/ja/#command　より引用）

CONTEC社のデジタル入出力USB/IOユニットに対応し、専用コマンドで入出力制御が可能になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/c5a8b56d-be4c-e3f6-4556-fc06f977bd63.png)

（https://www.contec.com/jp/products-services/daq-control/pc-helper/usb-module/dio-0808ly-usb/specification/ より引用）


## CONTEC USB GPIB通信ドライバ(API-GPIB(WDM))の対応
CONTEC社のGPIB通信ドライバには以下の2種類あります。

1. ドライバライブラリ API-GPIB(WDM) for USB GPIB通信ドライバ 開発環境(フルセット) Ver. 4.70
1. Windows版GPIB通信ドライバ API-GPIB(98/PC) 開発環境(フルセット) Ver. 7.80

これまではAPI-GPIB(98/PC)の方しか対応していませんでしたが、今回のバージョンアップでAPI-GPIB(WDM)にも対応しました。よって、どちらのドライバを入れても動作します。

## 制御可能な計測器を最大12台に拡張
これまでは最大6台までの計測器を制御可能でしたが、12台まで拡張されました。
インターフェイス #1 ～ インターフェイス #12 まで使用可能になり、12台の計測器を制御することができます。
（そんなにいる？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/86c86152-0019-3834-994f-8bf7f50d6127.png)

## バージョンアップ方法
Sequence Makerのバージョンアップ方法は以下の記事を参照してください。

https://qiita.com/sequencemaker/items/690c3b25186a208eda25

:::note warn
注意
Excelが起動していると、Sequence Makerのインストールができません。
Excelを終了してからインストールしましょう。
:::

## まとめ
今回追加された専用コマンド#POLL?とCONTEC社のデジタル入出力USB/IOユニットについては、別記事にて解説したいと思います。
powershellで配列＋ハッシュテーブルをいい感じでソートしたい。

``` powershell:hashtable sort.ps1
function Process-HashTables {
    param (
        [Parameter(Mandatory = $true)]
        [array]$hashTables,       # 処理対象のハッシュテーブルの配列
        [string[]]$duplicateKeys, # 重複を削除する列のキー名配列
        $sortKeysAndOrder         # ソートする列とその順序を定義したハッシュテーブル
    )
    # ソート処理
    if ($sortKeysAndOrder) {
        $hashTables = $hashTables | Sort-Object $sortKeysAndOrder
    }
    # 重複データ削除
    if ($duplicateKeys) {
        $seen = @{}
        $uniqueResult = @()

        foreach ($hashTable in $hashTables) {
            $keyValues = $duplicateKeys | ForEach-Object { $hashTable.$_ }
            $compositeKey = $keyValues -join '|'

            if (-not $seen.ContainsKey($compositeKey)) {
                $seen[$compositeKey] = $true
                $uniqueResult += $hashTable
            }
        }
        $hashTables = $uniqueResult
    }

    return $hashTables
}


# データセット
$data = @(
    [ordered]@{ key1 = "100" ; key2 = "65" ; key3 = "2024/04/05 20:50:14" ; key4 = "data~5" },
    [ordered]@{ key1 = "190" ; key2 = "45" ; key3 = "2024/04/05 20:50:14" ; key4 = "data~1" },
    [ordered]@{ key1 = "100" ; key2 = "55" ; key3 = "2024/04/05 20:50:14" ; key4 = "data~3" },
    [ordered]@{ key1 = "190" ; key2 = "35" ; key3 = "2024/04/05 20:50:11" ; key4 = "data~2" },
    [ordered]@{ key1 = "100" ; key2 = "25" ; key3 = "2024/04/05 20:50:11" ; key4 = "data~4" },
    [ordered]@{ key1 = "100" ; key2 = "15" ; key3 = "2024/04/05 20:50:11" ; key4 = "data~6" }
)


# 重複削除対象列
$duplicateColumns = @('key1')
# ソート対象列と順序
$sortColumnsAndOrder = @(
    @{ exp = { $_.key1 }; des = $true },
    @{ exp = { $_.key2 }; des = $true },
    @{ exp = { $_.key3 }; asc = $true }
)

# データ処理（ソートと重複削除）
$resultData = Process-HashTables -hashTables $data -duplicateKeys $duplicateColumns -sortKeysAndOrder $sortColumnsAndOrder

# 結果を1列ごとに表示
foreach ($hashTable in $resultData) {
    $hashTable.GetEnumerator() | Sort-Object Name | ForEach-Object {
        Write-Output "$($_.Name) = $($_.Value)"
    }
    Write-Output "-----"
}
```
[UX] ユーザーを "心理的に" 待たせない手法

# はじめに

UX デザインの法則の一つをご紹介した後に、
ユーザーを "心理的に" 待たせない手法についてご紹介します！

# 前提

![スクリーンショット 2024-06-27 22.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/fccbec6f-432d-c243-6df9-cf1d2f24b13e.png)

[UX デザインの法則](https://www.amazon.co.jp/UX%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87-%E2%80%95%E6%9C%80%E9%AB%98%E3%81%AE%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E5%BF%83%E7%90%86%E5%AD%A6-Jon-Yablonski/dp/4873119499)という本を読みました。

こちらの本に書いてあった法則の一つである "ドハティのしきい値" というものについてご紹介し、ユーザーを心理的に待たせない手法についてまとめました。 

# ドハティのしきい値について

### 説明：  
**0.4 秒以内だと生産性が劇的の向上するが、1 秒以上待たされるとユーザーはタスク以外のことを考え始め、生産性の低下につながる。**

説明のままですが、レスポンスが遅く待ち時間が長いとユーザーは違うことを考え始め、生産性が低下する、という法則です。

ただ、今の web サイトやシステムは複雑化しており、0.4 秒以内にレスポンスを返すのは難しいと思います。 

# 解決策

なので、バックグラウンドで処理が走っている間に何らかのフィードバックを返していくべし、ということで以下の手法が紹介されていました。

### スケルトンローディング

どんなページが表示されるか予想できるため、ロード時間が長くても心理的に短く感じられます。
SNS 系の画面でよく見られる手法です。

![スクリーンショット 2024-06-27 22.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/ecbae54d-5ec4-22a3-39d2-c269b354cf14.png)


<!-- ### ブラーアップ -->

### アニメーション

ロード画面にブランドのロゴやキャッチコピーを差し込むことで、単なる待機時間としてだけではなく、別の役割を果たすことができます。
企業・店舗サイト、プロモーションサイトなどでよく見られる手法です。

- サイト離脱率の低下
- ブランドイメージの醸成
- 期待感の高揚

https://demo.tcd-theme.com/tcd091/

### プログレスバー

「問題なく処理している」ことをユーザーに伝えられます。
業務アプリケーションでよく見られる手法です。

![スクリーンショット 2024-06-27 22.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/fdbc6e62-cf82-ea58-6a01-400a576eb07e.png)

### 他

他にはゲームでは Tips や操作方法等を表示しているというのもよく見ますね。

![スクリーンショット 2024-06-27 23.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/24959756-548d-25b1-612c-657618779f58.png)


これらの手法によって、処理が進んでいることをユーザーに伝えられ、**待っているという感覚を減らす（待ち時間が短く感じる）効果があり、体感性能が高くなり UX を改善できる** とのことです。

一方、私が実務で開発しているような業務アプリケーションでは、このような手法を取り入れている画面は少ない印象で、一般的なぐるぐるローディングが多い気がします。  

特に初期描画や検索に時間がかかっていそうなアプリケーションには、このようなフィードバックの返し方も取り入れていくのが良いのかなと思いました。

# 最後に

まだまだ UIUX については勉強中ですが、今後は **待ち時間などの "行間" の部分も考えていきたい** と思いました！

### 余談

この本は「[Laws of UX](https://lawsofux.com)」を元に構成されているようで、その中でも重要な原則をピックアップして紹介されていました。  
原則をすべて知りたい方は「[Laws of UX](https://lawsofux.com)」のページを読めば良いとのことでした。（英語読めないンゴ、、、）
擬似クラス`:focus`と`:focus-visible`について理解する

`:focus-visible`の擬似クラスについてご存知でしょうか？
恥ずかしながら私は最近知りました…。

:::note
アクセシビリティを意識するようになってから、キーボード操作によるフォーカスを考慮してスタイリングするようになったのをきっかけに知りました！
:::

アクセシビリティを意識した実装について理解を深めたい方に届くと嬉しいです！

## `:focus-visible`とは何か

ウェブページ上の要素がフォーカスされたときに適用されるCSSの擬似クラスです。
ユーザーがキーボードを使っているときなど、フォーカスを視覚的に表示すべき場合にのみ適用されます。

https://developer.mozilla.org/ja/docs/Web/CSS/:focus-visible

W3Cのサイトだと下記の箇所に記載があります！

https://drafts.csswg.org/selectors/#the-focus-visible-pseudo

各ブラウザの対応状況は下記の通りです！
IE以外のブラウザであればおおよそ動作してくれそうです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/0f1abb3f-862c-d28c-e1c4-0783cac0f085.png)

## `:focus`ではダメなのか？

`:focus`擬似クラスは、ホバー時以外にマウスでクリックしたときもフォーカスを表示していました。

:::note warn
見た目が良くないという理由でフォーカス表示を完全に削除した経験がある人もいるのではないでしょうか？
:::

その結果、キーボード操作のユーザーにとって使いづらいサイトになってしまう問題がありました。

## `:focus-visible`の必要性（利点）
クリック時には表示されずキーボード操作時に確実にフォーカスが表示されるため、アクセシビリティが向上します。

## `:focus-visible`の使い方

使い方は他の擬似クラスと同様です！

```css
.sample:focus-visible {
  outline: 2px solid blue;
}
```
:::note
少し前までoutlineには`border-radius`が適用されないためデザインしたフォーカスリングを実装する場合`box-shadow`を利用する方法で実装していたこともありました。

現在はoutlineにも`border-radius`が適用されるのでアクセシビリティを考慮するのであれば`box-shadow`よりも、`:focus-visible`で実装する方が良いと思います！
:::

## やっぱり古いブラウザーに対応したい時

`:focus`を使った代替スタイルを用意することで解決します。

```css
@supports not selector(:focus-visible) {
  .sample:focus {
    outline: 2px solid blue;
  }
}
```

## devツールでのデバッグ方法
ご存知の方も多いと思いますがブラウザでスタイルを調整する際のデバッグ方法も紹介しておきます！

1. 要素を検証→対象の要素を選択
1. スタイルタブを開き、フィルタ横にある「:hov」をクリック
1. 状態のチェックボックスが表示されるので確認したい箇所にチェックを入れる

### 要素を検証→対象の要素を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/5464d006-ea1b-e01e-b941-6655218f5122.png)

### 「:hov」をクリック
適応されているCSSプロパティを確認する「スタイル」タブを選択します。
フィルターの横にある「:hov」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/6bf06ab7-b908-2a47-0554-692e2edc395b.png)

### エミュレート
「:hov」をクリックすると要素の状態をエミュレートできる画面が開くので確認したい状態のところにチェックを入れてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/728199ab-dfe6-cc0e-aca1-51655703a23e.png)

## 【まとめ】擬似クラス`:focus`と`:focus-visible`について
これまでアクセシビリティをほとんど意識せずに実装してしまっていたことがわかりました…。

:::note
これまではスタイルを実現するためにアクセシビリティを犠牲にしてきた部分もあったと思いますが修正していけると良いですね！
:::

アクセシビリティを考慮した実装ができるように努めて参ります。
【Lefthook】pre-commitで自動修正されたコードをステージングする方法

`stage_fixed`を`true`に設定すると自動修正されたコードをステージングすることができます。

```lefthook.yml

pre-commit:
  parallel: true
  commands:
    eslint:
      glob: '*.{js,jsx,ts,tsx}'
      exclude: '^\.|/\.'
      run: yarn eslint --fix --max-warnings=0 {staged_files}
      stage_fixed: true
    prettier:
      run: yarn prettier --write --ignore-unknown {staged_files}
      stage_fixed: true

```

上記のように記述すると`eslint`や`prettier`で自動修正されたコードがコミット前にステージングされます。

https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md#stage_fixed
ブラウザタブの左上のアイコンを指定する

# はじめに
ポートフォリオ作成一旦終わりました！
ブラウザタブの左上のアイコンってどうやって指定するんだ？
となり実装まで漕ぎ着けたのでアウトプットしておきます✍️

# 完成図

![スクリーンショット 2024-06-27 23.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/2699962e-16fb-9407-d2e4-40665297cb2d.png)

# 簡単！

指定したい画像を用意し、拡張子.icoになるよう変換します（ico変換など検索すると変換サイトが出てきます）
適当な変換サイトでOK！

application.html.erbのhead内に以下を記述します

```application.html.erb
<head>
  <%= favicon_link_tag('GoOutPlanning.ico') %>
</head>
```

あとは該当の画像をapp/assets/imageに格納するだけ！

# さいごに
ぜひやってみてください！

ホーム画面追加のアイコンの指定方法はこちら

https://qiita.com/3rarara/items/7146ce43125318ab5e36
ホーム画面に追加でアイコンを指定する apple-touch-icon

# はじめに
ポートフォリオ作成一旦終わりました！
iphoneでホーム画面追加するときのアイコンってどうやって指定するんだ？
となり実装まで漕ぎ着けたのでアウトプットしておきます✍️

# 完成図

![IMG_6629.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/4586b9b3-5d0e-56a8-58b1-41cf71dff402.jpeg)

# 簡単！
指定したい画像を用意し、サイズを180x180にリサイズしておきます
適当な変換サイトでOK！

application.html.erbのhead内に以下を記述します

```application.html.erb
<head>
  <%= favicon_link_tag 'apple-touch-icon.png', rel: 'apple-touch-icon', type: 'image/png' %>
</head>
```

あとは該当の画像をapp/assets/imageに格納するだけ！

# さいごに
ぜひやってみてください！

ブラウザタブの左上のアイコンを指定はこちら

https://qiita.com/3rarara/items/b7c8bcdddef37f569976
【Laravel】【Vue.js】プロジェクト作成手順①

# はじめに
Laravel（バックエンド）とVue.js（フロントエンド）を組み合わせたシステムを構築する
手順を記述します。

# 事前準備
以下がインストール済み・環境構築済みであること。
手順は別記事でまとめておりますので、ご参考になれば幸いです。
- PHP
- Composer
- PHPデバッグ環境構築（Xdebug・PHP Debug）
- Node.js（npmコマンドを実行できるようにするために必要）

# Laravelアプリ作成手順
### ① プロジェクト用のディレクトリを作成
　※私は「C:\work\demo」のように作成しました。
### ② Laravelプロジェクト作成
**(1) VSCodeで①ディレクトリを開く**
![アプリ作成01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/898fef6d-389d-fa81-c152-e6d86331a4b3.png)
**(2) メニューバー[ターミナル] > [新しいターミナル] でターミナルを起動**
![アプリ作成02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/2d2f2f55-faa7-363a-e44e-09e5df883f64.png)
**(3) プロジェクト作成コマンドを実行**
　ターミナルで以下コマンドを実行します。
 　```laravelProject01```部分は任意のプロジェクト名に置き換えてください。
 ```
 composer create-project --prefer-dist laravel/laravel laravelProject01
 ```
　これにより、プロジェクトディレクトリ「laravelProject01」が作成されます。
 　※ここで「The zip extension and unzip/7z commands are both missing,skipping.」エラーが
　　　発生した場合は、```C:\xampp\php\php.ini```内の```extension=zip```のコメントを
　　　外しZIPアーカイブ操作を有効化して再度実行してください。
   ```php.ini
   extension=zip ;←コメント外す
   ```
### ③ Vue.jsの組み込み
**(1) ③(3)で作成したプロジェクトディレクトリへ移動**
```
cd ./laravelProject01
```
**(2) Composer経由で「laravel/ui」をインストール**
　```Laravel UI(laravel/ui)```とはComposerパッケージの1つで、Laravelのフロントエンド用
　スカフォールド（テンプレート）です。フロントエンドとしてBootstrap・Vue.js・Reactが
　利用できます。
 ```
composer require laravel/ui
```
　今回は複雑な認証機能は実装せず小規模アプリを作成するため```Laravel UI```を選択
　しましたが、他には```Laravel Breeze```や```Laravel Jetstream```があります。
　これらの違いについては参考文献の記事をご覧ください。

**(3) Vue.jsセットアップ**
　(2)Laravel UIを利用しLaravelプロジェクトにVue.jsの基本的なセットアップ（初期設定
　など）を行います。
　ArtisanはLaravelに組み込まれているCLIで、コマンドを提供するものです。
　Laravelのコマンドは基本的に```php artisan 〇〇```という形式で実行します。
```
php artisan ui vue
```
　これにより、以下のようなセットアップが行われます。
　**(A) Vue.js関連ファイルの作成**
　　・resources/js/app.js
　　・resources/js/components/ExampleComponent.vue
　　・ vite.config.js（ビルドツールViteの設定ファイル）
　　　※Laravel9.2以降：Vite推奨
　　　　Laravel9.2以前：laravel-mix
　**(B) Vue.js関連npmパッケージの追加（resources/js/app.js）**
　　→追加されたnpmパッケージをインストールするため、後ほど```npm install```を実行
　　　します。
　**(C) Bladeテンプレートファイルの作成**
　　・resources/views/welcome.blade.php
 
**(4) npmパッケージをインストールする**
　```package.json```に記述されたnpmパッケージをインストールします。
```
npm install
```
### 
# 参考
### 事前準備

https://qiita.com/moko_san/items/b3b7d6000db68735aa14

https://qiita.com/moko_san/items/6b69d408d2ba0eccdb88

https://qiita.com/moko_san/items/baee8f277eb29889a71c

https://qiita.com/moko_san/items/bcc071e8c950c7f54d6b

https://qiita.com/moko_san/items/0647a733a1786f52f93d

### Laravelスカフォールド
https://biz.addisteria.com/laravel_authentication/

https://qiita.com/mpyw/items/c944d4fcbb45c1a3924c

https://zenn.dev/localdisk/articles/a338175e913410

### アプリ作成手順
https://qiita.com/minato-naka/items/2d2def4d66ec88dc3ca2
Go言語でのEchoハンドラテストとContextのモック方法

以下では、UserHandler構造体のGetUserメソッドをテストする方法について説明します。特に、echo.Contextをどのようにしてモックするかに焦点を当てます。

UserHandler構造体とそのGetUserメソッドは以下のように定義されています。

```go
コードをコピーする
type UserHandler struct {
	userService service.UserServiceInterface
}

func (h *UserHandler) GetUser(c echo.Context) error {
	use, err := h.userService.GetUser()
	if (err != nil) {
		c.String(http.StatusInternalServerError, "error")
		return err
	}

	u := &user.User{
		Name: use,
	}
	c.JSON(http.StatusOK, u)
	return nil
}
```

このメソッドをテストするために、`c`としてecho.Contextを割り当てる必要があります。以下のように、簡単にecho.Contextを作成する方法があります。

```go
コードをコピーする
req := httptest.NewRequest(http.MethodGet, "/", nil)
rec := httptest.NewRecorder()
c := echo.New().NewContext(req, rec)
```

# NewContextを使う利点
NewContextを使うことで、以下の利点があります：

## シンプルなテスト環境の構築:
NewContextは、HTTPリクエストとレスポンスライターを元に新しいEchoコンテキストを作成します。これにより、テストで必要なコンテキストを簡単にセットアップできます。

## 現実に即したテスト:
実際のHTTPリクエストとレスポンスを使用してコンテキストを作成するため、本番環境に近い形でハンドラの動作をテストできます。これにより、テストの精度が向上します。

## 容易なモック化:
httptest.NewRequestとhttptest.NewRecorderを使用することで、リクエストとレスポンスのモックを簡単に作成できます。これにより、複雑なモックライブラリを使わずに、手軽にテスト環境を整えることができます。

# 実際のテストケース
以下に、実際のテストケースを示します。

```go
type MockUserService struct {
}

func (r MockUserService) GetUser() (string, error) {
	return "test", nil
}

func TestUserHandler_GetUser(t *testing.T) {
	req := httptest.NewRequest(http.MethodGet, "/", nil)
	rec := httptest.NewRecorder()

	type fields struct {
		userService service.UserServiceInterface
	}
	type args struct {
		c echo.Context
	}
	tests := []struct {
		name    string
		fields  fields
		args    args
		wantErr bool
	}{
		{
			name: "success",
			fields: fields{
				userService: &MockUserService{},
			},
			args: args{
				c: echo.New().NewContext(req, rec),
			},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			h := &UserHandler{
				userService: tt.fields.userService,
			}
			if err := h.GetUser(tt.args.c); (err != nil) != tt.wantErr {
				t.Errorf("UserHandler.GetUser() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}
```
【AWS】EC2とRDSが異なるAZにある場合、処理性能に影響はあるのか？

# 概要
AWS AutoScalingGroup(EC2)のAZとRDSのAZが異なる場合、処理速度に影響がある？
ということで、こちらについて解説していきます。

# 結論
影響あることがわかりました。
具体的には、異なるAZ間の通信が発生すると、同じAZ間の通信よりも遅いです。

## 検証前提
今回、以下の内容で検証しました。

・EC2インスタンスのAutoScalingGroupのAZをap-northeast-1aとap-northeast-1cの二つにしている
・EC2インスタンスを二台起動している（それぞれ1aと1cに一台ずつ）
・それぞれのEC2にECSタスクを立ち上げ、タスク内で動くプログラム（API）が稼働している
・RDSインスタンスのAZはap-northeast-1aのみ（レプリカは無し）
・アプリはDB通信を行うプログラム

## 検証結果
APIを何回か投げていると、応答性能に幅が見られました。
これは、1aにあるECSタスクにAPIコールが投げられた時と、1cにあるECSタスクにAPIコールが投げられた時の差と考えられます。実際にコマンドを使って、EC2とRDSの間の応答性能を確認してみます。

`nping`というツールを使うとネットワークのレイテンシー測定ができます。
これはポートスキャンツールのパッケージ`nmap`の中に含まれているので、まずは以下をEC2にインストールします。

```
sudo yum install nmap
```

### 1aのEC2 <-> 1aのRDS で実施した場合

```
$ sudo nping -c 100 xxx.xxxx.ap-northeast-1.rds.amazonaws.com -p3306 --tcp
```

結果は以下(5パケット平均)

```
Max rtt: 0.149ms | Min rtt: 0.122ms | Avg rtt: 0.137ms
Raw packets sent: 5 (200B) | Rcvd: 5 (220B) | Lost: 0 (0.00%)
```


### 1cのEC2 <-> 1aのRDS で実施した場合

```
$ sudo nping -c 100 xxx.xxxx.ap-northeast-1.rds.amazonaws.com -p3306 --tcp
```

結果は以下(5パケット平均)

```
Max rtt: 1.736ms | Min rtt: 1.566ms | Avg rtt: 1.608ms
Raw packets sent: 5 (200B) | Rcvd: 5 (220B) | Lost: 0 (0.00%)
```

rttとは、Round Trip Timeの略称で、「応答が返ってくるまでにかかる時間」のことです。
二つを比べてみると、1a同士の場合は5回平均が0.137msであるのに対して、1cと1aの場合は5回平均で1.608msと差が出ていることがわかります。

やはり同じAZ間の方が早いですね。

## 補足
ちなみにEC2をマルチAZ構成にしたい場合、RDSもマルチAZ構成にするのが一般的だと思いますが、この場合はレプリカを作成しないといけないのでコストが増えてしまいます。そこまで求められていない場合は、シングルAZ構成にすると処理速度は向上します。ここはトレードオフですかね。

また、マルチAZ構成からシングルAZ構成に戻す際は、以下の手順が大事です。
以下であればECSコンテナが常に一つは稼働しています。

①AutoScalingGroupで台数を二台に設定する = EC2インスタンスが1aと1cに起動される
②ECSタスクがそれぞれ1aと1cのEC2インスタンスで稼働していることを確認する
　（もしどちらかに集中してしまっている場合は、一度ひとつのタスクを停止します。すると自動で新しいタスクがもうひとつのEC2の方で起動し始めます）
③AutoScalingGroupから1cを外す = 1cにあるEC2インスタンスがシャットダウンされる
④AutoScalingGroupの台数は二台のまま。1aにもう一台のEC2が起動し始める

これでシングルAZ構成でEC2インスタンスが二台立ち上がりました。
一台にしたい場合は、最後にAutoScalingGroupで台数を一台にすればOKです。



## 参考記事

https://tech.kurojica.com/archives/49660/
AWS DevOps Engineer Professional受験記

AWS DevOps Engineer Professional（DOP-C02）の受験記になります。

# 自己紹介
- 総合電気メーカー 入社3年目
- 業務内容は主にデータ分析
※データ分析とはいえデータを取得、加工するAWSのアーキテクチャなんかも考えたりするのでそれなりにAWSを業務でも利用している
- AWS歴 2年
- 好きなサービス Lambda
- 取得済みAWS資格 CLF、SAA、SOP、DVA

# 勉強方法
とにかく[Cloud Tech](https://kws-cloud-tech.com/)の問題集を解きまくる。
受験1か月前から勉強を始め、少しづつ問題を解き進めていた。
通勤に1時間ほどかかるため朝晩10問ずつ解いて、土日も5,60問解くようにしていた。
私のやり方としては
<dl>
<dt>1週目</dt>
<dd>とりあえず軽く解いて軽く解説を見る</dd>
<dt>2週目</dt><dd>各選択肢がなぜ正解か、なぜ間違いなのかを理解し、新しく学んだ内容はノートにまとめる</dd>
<dt>3,4週目</dt><dd>絶対に正解するように問く</dd>
</dl>

という感じで試験前日まで取り組んでいた。

あとは試験日前日や試験当日はまとめたノートを眺めたりギリギリまで問題を解いたりしていた。

# 受験本番
とにかく時間との勝負だと他の人の[受験記](https://kacfg.com/aws-dop/#i-6:~:text=%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,%E6%9C%AC%E7%95%AA%E8%A9%A6%E9%A8%93%E4%B8%AD%E3%81%AE%E6%99%82%E9%96%93%E9%85%8D%E5%88%86,-%E8%A9%A6%E9%A8%93%E6%99%82%E9%96%93180)で見たので、同じような戦略で挑んだ。

> - 試験中は全力で集中！まずは1周目を素早く終わらせることを常に意識する
> - 短文の問題はすぐに解く
> - 長文の問題はじっくり読み解く必要があるが、2分以上は時間をかけないようにする
> - 2分以内に正解が導き出せない問題は、消去法でもいいので「多分これかな？」と思う選択肢にチェック。「後で見直すフラグ」を立ててすぐに次の問題へ
> - 試験中は1問あたりにかかっている時間は確認できない。なので、20問ほど解くたびに回答済みの問題数 × 2 分として、試験の経過時間から順調に進んでいるかチェックする
> - もし遅れている場合は、取り返すために急いで残りの問題を解く。余裕がある場合でも、引き続き素早く解く

マジでこの戦略を見ていて良かったと思った。
この戦略通り頑張ったが、結局1週解くのにちょうど150分かかり、その時点でフラグ数は27個。
残り30分でフラグ全部の問題を見直せず終わってしまった。。。

「時間足りんしムズイって！」というのが感想でした。

# 結果
とは言いつつも何だかんだで合格できました。

![結果画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/78015748-6132-ad25-d3be-8996d2b2dc46.png)

DVAの時もそうでしたが、今回厳しいかもと思っても意外と点数あったりするんですよね。
受験は朝10時に受けて、結果は19時ごろバッチ獲得のメールがCledlyから届きました。

# 受験を振り返って
今回合格できましたが、以下のサービスをしっかり見ておけばよかったなぁと思ったので、もしこちらの記事を見ていただいた方はぜひ確認してみてください。現在のCloud Techだと以下の部分については問題があまりなかったと思います。
- AWS Control Tower（意外と出てくる）
- cfnスクリプト（直前で見てたため何とかなった。）
- コンテナの脆弱性スキャン（これに関連したところが2,3問あった）
- AWS Security Hub
- AWS Firewall Manager

誰かの助けになれば幸いです！！
mb_detect_encodingとmb_convert_encodingの不思議

# はじめに
これはPHP8.1を利用していて遭遇した```mb_detect_encoding```と```mb_convert_encoding```に関する不思議なお話です。

それでは行ってみましょう。

# 用意するプログラム

```php:test.php
<?php

echo 'ステップ1：文字列をそのままmb_detect_encodingしてみる' . PHP_EOL;
$str = 'テスト';
echo $str . PHP_EOL;
echo '文字コード:' . mb_detect_encoding($str) . PHP_EOL;
echo '' . PHP_EOL;

echo 'ステップ2：文字列をUTF-8からSJISに変換してみる' . PHP_EOL;
$str2 = mb_convert_encoding($str, "SJIS", "UTF-8");
echo $str2 . PHP_EOL;
echo '文字コード:' . mb_detect_encoding($str2) . PHP_EOL;
echo '' . PHP_EOL;

echo 'ステップ3：文字列をSJISからUTF-8に再度変換してみる' . PHP_EOL;
$str3 = mb_convert_encoding($str2, "UTF-8", "SJIS");
echo $str3 . PHP_EOL;
echo '文字コード:' . mb_detect_encoding($str3) . PHP_EOL;
echo '' . PHP_EOL;
```

# 実行結果
```
ステップ1：文字列をそのままmb_detect_encodingしてみる
テスト
文字コード:UTF-8

ステップ2：文字列をUTF-8からSJISに変換してみる
�e�X�g
文字コード:

ステップ3：文字列をSJISからUTF-8に再度変換してみる
テスト
文字コード:UTF-8
```

# 考察
ステップ1とステップ3は想定通りの結果ですが、ステップ2だけ文字コードの識別がおかしいですね。

下記の記事にも記載があるのですが、どうやらPHP8.0系からPHP8.1系になったタイミングで内部の仕組みが変わったことに起因しているっぽい感じがしますよね。

https://qiita.com/bosshawk/items/c5ed922fec4390bf926a


ステップ２で明示的に
```php
echo '文字コード:' . mb_detect_encoding($str2, 'SJIS') . PHP_EOL;
```
と記載した場合はちゃんと文字コードがSJISであると認識してくれるので、間違ってはいなさそうではあります。
他の文字コードを指定した場合、文字コードが空欄となりましたので、やはりそうなのでしょう。

皆さんの記事でも紹介されている通り、こういった変更がシステムに影響を及ぼすこともあるので、気をつけましょう。

:::note warn

```mb_convert_encoding```こちらも内部では```mb_detect_encoding```を使用しているので、やはり影響があります。
fromに```auto```を設定しても、おかしくなります。

:::
【UiPath】ファイルを展開 (Unzip) のプロパティについて

<b>「ファイルを展開 (Unzip) 」</b>アクティビティのプロパティの「専用フォルダーに展開」、「展開済みコンテンツのフォルダー」、「展開済みのファイル」等についてです。

https://docs.uipath.com/ja/activities/other/latest/workflow/extract-files

## 事前準備
今回検証では以下のZIPファイルを使用します。

- テキストファイルが一つ入ったフォルダを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/078f51ce-dd7d-b627-6e21-a817756ac0c8.png)

- 圧縮してZIPにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/d73dd8a4-dc5c-174c-a447-a22d40d0e5ea.png)

- ZIPの名前を変えます。これで準備は終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/c32c8b97-90ff-a8e4-1bc6-323004c7ec82.png)

## 「専用フォルダーに展開」
入力プロパティの「専用フォルダーに展開」についてです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/df18c7cb-1fef-73f1-c8fd-0a6ca382737a.png)

これのチェックがオンだと以下のように
`【展開先のフォルダー】\【専用フォルダー（ZIPの名前のフォルダ）】\【ZIPの中身】`
の形で展開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/272225e2-5df0-94ae-d6d5-c438597e11d9.png)

オフだとZIPの名前の専用フォルダーが省かれて展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/cd75f933-29c3-9265-69b8-685f64a42b94.png)

## 「展開済みコンテンツのフォルダー」
出力プロパティの「展開済みコンテンツのフォルダー」についてです。
`DirectoryInfo`型の変数で出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/ce9f5fb8-4b0b-3fdd-4af4-f201bac5b6ff.png)

`DirectoryInfo`型の変数では`.Name`でフォルダの名前、`.FullName`で絶対パスが取得できます。その他の使い道に関してはMSのページをご確認ください。

https://learn.microsoft.com/ja-jp/dotnet/api/system.io.directoryinfo?view=net-8.0

専用フォルダー有りで展開した場合は<b>展開先のフォルダー＋専用フォルダーのディレクトリ</b>、専用フォルダー無しの場合は<b>展開先のフォルダーと同じディレクトリー</b>が変数に格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/ad6edda7-e60c-bcd8-68b3-335120357435.png)



## 「展開済みのファイル」
出力プロパティの「展開済みコンテンツのフォルダー」についてです。
`ILocalResource`型のコレクションの変数で出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/fa7006a3-6250-fcfd-3ffa-c847e60feb95.png)

`ILocalResource`型の変数では`.FullName`でファイルの名前、`.LocalPath`で絶対パスが取得できます。ここではコレクションで出力されるため、「繰り返し (コレクションの各要素) 」等を使って変数を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/bbd9d38e-8ceb-3a66-0bd4-d9e5d42c7824.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/d5744223-52e2-59a0-d92e-957b77b16a48.png)

変数にはZIPに格納された全てのファイルが格納されます。
今回の例ではテキストファイル一つでしたが、複数ファイルある場合やサブフォルダが含まれる場合でも全てのファイルの情報を取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/72046725-d8b2-36c2-9362-62985bd791fb.png)


## 動作環境
UiPath.System.Activities 24.5.0-Preview
スクリーンログのススメ

## はじめに
私はMac上で毎時にスクリーンログを記録しています。
あの時こんなことをしたなど、後から振り返るときに便利です。
あと単純に見返して楽しいです。

このように画像で保存されます
![Screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/79373ce4-a1e8-442a-02d9-e735d211890c.png)
![Screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/9567960c-2589-3fa9-73b9-e3795885cb53.png)

## どうやって記録するか
Macの標準機能であるcron機能を使ってスクリプトを実行し、毎時スクリーンログを記録しています。

crontabというコマンドを使ってcronの設定を行います。
設定についてはこちらを参考にしてください。
https://spreadsheep.net/%E3%80%90crontab%E3%80%91mac-book%E3%81%A7%E5%87%A6%E7%90%86%E3%82%92%E5%AE%9A%E6%9C%9F%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%80%90%E8%B6%85%E7%B0%A1%E5%8D%98%E3%80%91/

```shell:auto_capture.sh

FOLDERDIR=`date +%Y年%m月%d日`
DSTDIR=/Users/<ユーザ名>/ScreenLogs/$FOLDERDIR

if [ ! -d $DSTDIR ]; then
  # 存在しない場合は作成（本処理へ)
  mkdir $DSTDIR
fi

/usr/sbin/screencapture -m -C -T0 -x $DSTDIR/capture_`date +%Y年%m月%d日%H時%M分`.png
```

```shell:crontab設定
00 * * * * /Users/<ユーザ名>/apps/auto_capture.sh
```

このスクリプトを`/Users/<ユーザ名>/apps/auto_capture.sh`に保存してcrontabで設定することで、毎時スクリーンログを記録することができます。
もちろん、記録するタイミングや頻度は自由に設定できます。


保存された画像がデスクトップになる場合はこちらをお試しください。

https://stackoverflow.com/questions/59239485/screencapture-over-cron-shown-background-instead-window-content

## まとめ
スクリーンログを記録することで、後から振り返ることができます。
みなさんも是非試してみてください。
Sequence Makerで1秒以下の時間を指定する

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerにはタイムアウト時間や送信前ウェイトなどの時間を設定する機能がありますが、今回は1秒以下の時間を指定する方法を解説したいと思います。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## Sequence Makerの時間設定について
Sequence Makerの時間設定としては以下のようなものがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/5c08c36c-f11b-cb32-a22b-9554f1488dd3.png)

| 設定 | 内容 |
|:-|:-|
| タイムアウト（秒）  | コマンドを受信する際のタイムアウト時間を設定します。タイムアウト時間は1～9999（秒）まで設定できます。測定に時間がかかる時は長くしてください。  |
| 送信前ウェイト（秒）  | コマンドの送信前に待機するウェイト時間を設定します。ウェイト時間は0～9999（秒）まで設定できます。  |
|#SLP(数値)|指定された時間処理を一時停止します。数値の単位は秒です。|

(https://sequencemaker.hioki.com/manual/ja/#control より引用)

## 1秒以下の設定について
さて、上記の設定は（秒）で記載されているため、最小分解能が1秒かと思われがちですが、実は1秒以下も設定できます。
**1秒以下を設定する場合は、小数で入れればOKです。**
例えば、500msにしたい場合は、0.5と入れます。
70msにしたい場合は、0.07と入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/122a32eb-9af6-f410-83f3-4eb86a5c108d.png)

ただし注意点があります。

:::note warn
注意
あまり時間を短くしてもパソコンのタイマー精度がいまいちなので、正確な時間にはなりません。
:::

体感的には、最小で50msあたりが限界かなと思います。数百ms程度であれば、まずまずな精度がでます。いずれにしてもあまり厳密な時間管理はできないつもりでいた方が良いでしょう。

## まとめ
今回はSequence Makerで1秒以下の時間を指定する方法について解説してみました。#SLPコマンドなどは、ちょびっとウェイトを入れたいときとかに便利ですが、1秒だとちょっと長いなぁ…というときに、今回の方法をお試しください。
AtCoder 勉強記録 その3

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Longest Segment
[B - Longest Segment](https://atcoder.jp/contests/abc234/tasks/abc234_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vec x(n);
  vec y(n);
  rep(i,n) cin >> x[i] >> y[i];
  double res = 0;
  for(int i=0;i<n-1;i++){
    for(int j=i;j<n;j++){
      ll X = abs(x[i]-x[j]);
      ll Y = abs(y[i]-y[j]);
      double tmp = X*X + Y*Y;
      tmp = sqrt(tmp);
      res = max(res, tmp);
    }
  }
  cout << fixed << setprecision(15) <<  res << endl;
}
```
### 解法
すべての座標間の距離を求めて最大値を出力する。

## B - Caesar Cipher
[B - Caesar Cipher](https://atcoder.jp/contests/abc232/tasks/abc232_b)
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
  string s,t;
  cin >> s >> t;
  for(int i = 0; i < 26;i++){
    for(int j = 0; j < s.size();j++){
      s[j]++;
      int com = s[j] - 'a';
      if(com == 26) s[j] = 'a';
    }
    if(s == t) {
      cout << "Yes" << endl;
      exit(0);
    }
  }
  cout << "No" << endl;
}
```
### 解法
アルファベットと文字型の変換を行い全文字25回次のアルファベットに変える。変えている中でSとTが一致したらYesを出力。一致せずループを抜けたらNoを出力する。
## B - A Reverse
[B - A Reverse](https://atcoder.jp/contests/abc233/tasks/abc233_b)
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
  ll l,r;
  cin >> l >> r;
  string s, res;
  cin >> s;
  for(int i = 0; i < l-1; i++) res += s[i];
  for(int i = r-1; i >= l-1; i--) res += s[i];
  for(int i = r; i < s.size(); i++) res += s[i];
  cout << res << endl;
}
```
### 解法
解答用の文字列を用意しておきL-1までSの文字を追加し、LからRまではRからLの降順ループしてSの文字を追加する。その後Sの文字を追加する。
xsltテンプレート内でxmlを値をjavascriptの変数に入れる方法

個人的「質はともかく継続する」20日目です
すごくニッチな技術です。

# xsltテンプレート内でxmlを値をjavascriptの変数に入れる方法

```js
var items = '<xsl:value-of select="/domroots/domroot2/title" />;'
```

これだけです。
意外とハマりました。
Zypperメモ

Zypperは、openSUSEおよびSUSE Linux Enterprise向けのパッケージ管理ツールです。以下に、Zypperの基本的な使用方法と一般的なコマンドをいくつか紹介します。

### 基本的なZypperコマンド

1. **リポジトリの更新:**
   ```sh
   sudo zypper refresh
   ```
   すべてのリポジトリのメタデータを更新します。これにより、最新のパッケージ情報が取得されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/9065c707-0cfa-9f80-b845-54f71ca7e420.png)

2. **パッケージの検索:**
   ```sh
   zypper search <パッケージ名>
   ```
   指定したパッケージ名に一致するパッケージを検索します。部分一致や正規表現も使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/eb526a57-bd26-ef3d-0769-57fde14348fd.png)

3. **パッケージのインストール:**
   ```sh
   sudo zypper install <パッケージ名>
   ```
   指定したパッケージをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/7b3e447c-b3dc-a594-5c8f-b25476ebdd90.png)


4. **パッケージの削除:**
   ```sh
   sudo zypper remove <パッケージ名>
   ```
   インストールされているパッケージを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/9e52f803-f920-060b-88cd-f385a15aa600.png)

5. **パッケージの情報表示:**
   ```sh
   zypper info <パッケージ名>
   ```
   指定したパッケージの詳細情報を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/714c8021-0d11-e712-c485-2b4abff9fe1a.png)

6. **システムの更新:**
   ```sh
   sudo zypper update
   ```
   インストールされているすべてのパッケージを最新版に更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/a6883e04-91e3-56ba-d7b9-dd1ceacfbfd2.png)


7. **リポジトリの追加:**
   ```sh
   sudo zypper addrepo <リポジトリURL> <リポジトリ名>
   ```
   新しいリポジトリを追加します。`<リポジトリURL>`はリポジトリのURL、`<リポジトリ名>`はリポジトリの名前です。

8. **リポジトリの削除:**
   ```sh
   sudo zypper removerepo <リポジトリ名>
   ```
   指定したリポジトリを削除します。

9. **リポジトリのリスト表示:**
   ```sh
   zypper repos
   ```
   登録されているリポジトリの一覧を表示します。

### 例:
1. **Apache HTTPサーバーをインストール:**
   ```sh
   sudo zypper install apache2
   ```

2. **インストールされているパッケージの更新:**
   ```sh
   sudo zypper update
   ```

3. **特定のパッケージの検索:**
   ```sh
   zypper search vim
   ```

Zypperは、パッケージの管理だけでなく、リポジトリの操作やシステムの更新など、多くの便利な機能を提供します。これらのコマンドを使用して、OpenSUSEやSUSE Linux Enterpriseでのパッケージ管理を効率的に行うことができます。
ts-patternのP.notパターン

## はじめに
`ts-pattern`の`P.not`を完全に理解しよう

## P.not はどんなときに使うのか

任意のインプットに対し、複数の型定義を許容する場合
特定の型定義に対して異なるアウトプットを表現する関数を定義することができる。

＊ 以下は公式の例
`boolean`または`number`の型定義を持った`Input`に対して、
`Input`が`boolean`でないときは`Input`でやってきた`number`を返す。
`Input`が`boolean`のときは`true`であれば`１`, `false`のときは`０`を返す。

以下の例では
数値の型に返す関数だが、関数の型定義を行っていないためそれ以外の値を返すことも可能。

```typescript
import { match, P } from 'ts-pattern';

type Input = boolean | number;

const toNumber = (input: Input) =>
  match(input)
    .with(P.not(P.boolean), (n) => n) // n: number
    .with(true, () => 1)
    .with(false, () => 0)
    .exhaustive();

console.log(toNumber(2));
// => 2
console.log(toNumber(true));
// => 1
```

## さいごに
自分は`ts-pattern`を基本`enum`のインプットに対してしか使う場面がなかったので、
出会うことがなかったが、型定義を超越して扱えるということがわかったので、
`typeScript`の意義を履き違えないようにしながら上手く活用していきたい。
引き出しの少なさにあぐらを書いていた過去の自分をぶん殴りたい

# はじめに

現在の会社に入社してからありがたいことに社内のエンジニアの方だけではなく、
業務委託の方など外部のエンジニアの方とも開発させていただく機会が増えました。

そんな中で自分がいかに自分のスキルを過信し、あぐらをかいて過ごしてきていたかが身にしみて実感することがありました。

今回、「**しくじりエンジニア！私みたいになるな！**」というテーマを見つけ、
自分への戒めとして羞恥心を捨ててこの記事に残しておこうと思います...。

# 自分の力を過信しすぎていた自分

まずは一番頭を抱えたいあの頃の自分を振り返ることから始めます。

私はエンジニアになって今年で7年目になりました。
7年エンジニアとして開発をしてきたので、
それなりにはコードも書けるし、プロジェクトの管理も人並みにはできている方だと思ってました。

また、歴で言うと今の社内のエンジニアメンバーの中でも長く開発をしている方ということもあり、
どちらかというとレビューしたり、教えたりすることのほうが多かったです。

そんな経緯もあり、自分からキャッチアップしなくても今の自分の知識で十分戦ってこれたので、
割と自分の意見を通してしまうことが多かったです。

レビューする時もレビューされる側のことは考えず
「●●●しましょう」
と自分の言った内容で確定にしてしまうことが多かった気がしてます。

まとめると当時の私はこんな感じ

- 現在の会社に入社してから周りのエンジニアメンバーに比べると開発歴が少し長い
- 今持ってる知識で割となんとかなってくる開発しかしてこなかった。今の自分の状態がmaxだと思ってた
- ↑もあり、我を通すことが多かった。相手の気持ちも考えようとしてこなかった

（正直もう目を背けたい）

# 引き出しの少なさを実感した出来事

そんな中今の会社で勤め始めて2年がすぎ、
自分の無力であぐらを書いていたなあと思う出来事がいくつかあったのですが、
その中でも2つ大きく印象に残ることがありました。

## episode1: 業務委託の方と開発
ある案件で人手が足りず、業務委託の方と開発させていただく機会がありました。

直接的には私は2人の業務委託の方と開発させていただく機会をいただいたのですが、
お二人とも開発経験でいうと私と同じくらいかそれよりも上くらいの方々でした。

すごい強いエンジニアの方々だし、めちゃくちゃ厳しいんだろうなと心して開発を始めたのですが、私が設計した仕様について「どうしてこの設計にしたのか」を聞いて、私の意見も生かした上でFBをくれたり、言い方が悪いかもしれないのですが、すごい腰が低いというか威圧感が本当にない方々でした。

おかげですごい相談もしやすかったです。

このお二人との開発経験のおかげで、私はいかに他の人の意見を聞かずに、我を通していたか痛感しました...。
時に意見を通すことも必要だと思いますが、
他の人の意見も聞かずにやってしまうのは相手もきっと気分が良くなかったろうなとこの時、思いました。


## episode2: 業務以外でのエンジニア交流
今年に入ってからデザインにも興味が出てきて、社内でデザインに興味がある人たちで週１集まって
お題を決めてバナーとかを作ってみるみたいなことをしてみました。

作ったことはなかったけど開発する中でいくつかバナーとかもみてきたし、それなりのものは作れると思っていたのですが、
本当に作れなかったです。

なんとか作ってみていざみんなでFBしあおうという場合も、他のメンバーの完成度が本当にすごくて
あーデザインってこんなに難しいんだと思いました。

FBし合う中でフォントの話やデザインのテクニック、参考にした本とかの話もしたりしました。
どの話も初めて聞くことばかりで、いかに私がデザインのこと何も知らないのかを痛感しました。

そして、デザインに限らず今まで逃げ続けたインフラ、触ってこなかった言語もきっと同じように
何も知らない状態なんだろうなと悟りました。

# 引き出しの少なさを実感した後の自分

↑のエピソード+その他諸々を経験し、「あー私は本当に引き出しが少ないな。無力だな。」とつくづく思いました。
だからと言ってすぐに何か新しい引き出しが増えることはありません。
なので、自分の行動から見直すようになりました。

## 見直し1. レビューする時は相手がなんでそうしたのかを聞いてからコメントする
今まではPRとか設計書のレビュー依頼がきたら確認して、ただコメントを入れていたのですが、必ず口頭で意図を聞くようにしてみました。
聞いてみると「あー確かにそういう視点もあるのか」と私もすごい勉強になりました。

もちろん、聞いた上でやっぱりこうしたほうが良さそうと思うこともあったので私なりの案も提案して、どっちがいいかなと一緒に考えるようになりました。
効果的かみたいなことは正直わからないですが、少なくとも意見をぶった斬られるよりはお互いに気持ちがいい開発環境になっていてくれたらなとは思ってます。

## 見直し2. いろんな知識に対してアンテナを高くする
いかに引き出しが少なかったかを痛感したのでまずはSNSで最新の情報をキャッチアップすることを意識的に行うようにしました。

具体でいうと、自分が興味あることだけではなく、Xのフォロワーがリツイートしているものに目を通してみたり、有名なエンジニアの方をフォローしてみてできるだけポストを見るようにしました。

まだ自分の身になっている実感はあまりないですが、何か設計・デザインする時とか自分の作ったものを見ると
あーあのポストのデザインに似てるなーとかがちょっと増えてきた気がします。

（余談ですが、いいねが非公開になったので、他の人の興味があるものをキャッチアップできる機会が少なくなったことが残念だなとは思ってます...）

## 見直し3. 本や動画を見る（場合によってはハンズオン開発してみる）
見直し2の延長にはなると思うのですが、本や動画で新しい知識をインプットする機会を増やしてみました。
私はもともと本を読むのが得意ではないので、何冊か気になる本を買って、目次で気になるところだけをさらっと読んでみたりちょっとつまんで読む感じで本を読んでいます。

動画派、youtubeでハンズオンの開発の動画を流しながら一緒に開発してみたりしてます。
言語が変われば設計も全然違うし、構成も違うし色々学びが多くてすごい楽しいなと思ってます。

# 最後に
おそらく今の会社に入社しなければ、引き出しが少ないことにも気づかず、過ごしていたんだろうなと思います。
そう思うと今の環境で開発できるようになって、少なくとも私はエンジニアとして成長する機会を頂けているんだろうなとつくづく思いました。

これからもいっぱい学ぶし、常にその気持ちを忘れず開発していきたいなと思いました！
【Ruby】オライリー本の備忘① ~rubyプログラムの構造と実行

## 概要
[プログラミング言語Ruby](https://www.oreilly.co.jp/books/9784873113944/)を読んでの備忘録
本の中の章ごとに分けることとする

## 識別子の記号
- ?

booleanを返すメソッド名の末尾には疑問符をつける
```ruby:example
def empty?(str)
  # booleanを返す処理
end
```

- !

オブジェクト自身を破壊的に変更する場合につける
```ruby:example
def sort!(arr)
  # 破壊的処理
end
```

## 改行
rubyでは四季が不完全な場合に解析が次の行に続く
```ruby:example
total = x +  # 式が不完全なため解析が次の行に続く
  y

total = x  # 式が完全なため解析がここで終了する
  + y
```
:::note info
行の中で最初に現れた空白以外の文字がピリオドである場合、
その行は前の行からの後続だと見なされる
:::

```ruby:example
animals = Array.new
  .push('dog')
  .push('cat')
```

## メソッド呼び出し
rubyではメソッド呼び出しの()を省略することができる
```ruby
# 以下二つは同義
f(3)
f 3
```
ただし、このやり方では動作が変わることがある
```ruby
f(3+2)+1  # f(3+2)の実行結果に1を足す
f (3+2)+1  # fの引数に3+2+1を渡す
```

上記のようなことを防ぐために以下の二点をルール化する
- メソッド名と()の間にはスペースを入れない
- メソッド名の第一引数が()で始まる場合には、必ずメソッドの呼び出しには()を使う

:::note warn
ただ、引数がない場合のみ()を省略するというルールの方がわかりやすいような気がする
:::
PCの歴史と操作の変容４

# OSの定着と通信黎明期
PCがフロッピーディスクで起動するようになってくるとMS-DOS等のOSが使えるようになり小型のHDD(20Mや40M程度)のHDDが使用できるようになってきました。

するとデータ交換を行うため1Mのフロッピーディスクでは小さいため、PC同士を通信線(シリアルやパラレルインターフェイス)で接続しファイルの送受信を行う方法が使われ始め、PCユーザー同士がモデムという装置を使い電話回線で接続して使うBBSという掲示板が登場しました。

# 日本のインターネットJUNET登場
この頃からモデムをUNIXで動作するワークステーションと呼ばれる少し大きめのコンピュータに接続しUUCPというプロトコルを使ってデータ交換を行う広域ネットワークが使われ始めました。

この頃から電子メールが使われ始めましたが、当時のメールはツリー状につながったワークステーション同士がバケツリレー方式でデータの交換を行うためにすぐには届かずに数時間から数日かかりました。

# 当時のワークステーション
ワークステーションといえばSun Microsystemsでした。
お世話になったのはSun-3でX-Windowではなく独自Windowシステムが搭載されておりましたが。
複数ウインドウを開いてソース編集できる環境がありました。
また、マルチユーザーであったためPC-9801をRS-232Cで接続しターミナルプログラムから使用することも可能でした。

# 現在のPCでローカルメール配信システムを作る。
古くなったPCにLinuxをいれて、Postfix(SMTP)とDovecot(POP/IMAP)としてローカルネットワーク内で建てると社内メールの配信システムが出来上がる。
テストメールの発信などのテスト環境としても使える
死にかけHDDのデータ移行にPythonを使った話

# 背景
10年目のHDDが急にパフォーマンスがガタ落ちし、PC操作にも支障が出始めたので、クローン化を試したが、開始するたびに「フォーマットが必要です」と出てきてエラー終了するので、無理やり移行することにした。
てか、フォーマットが必要って言うからやったのに、それで再度クローン化を試したらまた言われるとか何？
ちゃんとやってくれよ。

なお、手作業でコピーしようとすると、ある程度のファイル数・フォルダ数を超えるとなぜかコピーそのものができなくなる。（エラーどころか、コピー中のあのウィンドウも出ない）
少しずつやることはできるが、めんどくさいのでプログラム組むことにした。

# 注意事項
更新日時などは引き継がれないので、そこだけ注意。
クローン化じゃないよ。
コピペを自動化したようなもの。

# プログラム
Pythonの`shutil.copy`を使って移植するだけ。
ただし、ファイルアクセスの権限を考慮して、PythonIDLEを管理者モードで実行して作業を行う。

プログラムは以下の通り。DドライブからFドライブに移行する。

```Python
import os, sys
import shutil
from glob import glob
from pathlib import Path

def f(path):
    print(path)
    newPath = list(path)
    newPath[0] = "F"
    newPath = "".join(newPath)
    if not os.path.exists(newPath):
        print(newPath)
        os.makedirs(newPath, exist_ok=True)

    items = glob(f"{path}/*")
    for item in items:
        try:
            if Path(item).is_dir():
                f(item)
            else:
                newPath = list(item)
                newPath[0] = "F"
                newPath = "".join(newPath)
                if os.path.exists(newPath):
                    continue
                shutil.copy(item, newPath)
        except PermissionError:
            with open("error_files.txt", "a", encoding="utf-8") as fp:
                fp.write(f"{item}\n")
            print("PermissionError:", item)
        except OSError:
            with open("error_files.txt", "a", encoding="utf-8") as fp:
                fp.write(f"{item}\n")
            print("OSError:", item)

fp = open("error_files.txt", "w", encoding="utf-8")
fp.close()

f(r"D:\\")
```

追記。
一部のファイルは謎に権限を要求されたり、破損してたりして処理が上手く行かない時があるので、それらはパスを記録してスキップするように変更。
あとで手作業で移行すれば良いでしょ判断。

# あとがき
これで万事OKだわ。

てか、ホント何なの？
SSDのメーカーに合わせてSamsung Data Migrationとかいうソフト入れたのに、クローン元もSamsung限定なので今回は使えないし。
検索して出てきたEaseUSはクローン化が有料だし、MiniToolとかいうのは冒頭の状態になるし。
クローン化のハードウェアを買うのも考えたが、安く済むならそれに越したことはないし。（数年に一度しか使わないので）

今後、更新日時などの情報の引き継ぎは必要になれば追記する。
amazon linux2023にphp5.6を入れたい

## 背景
既存のシステムがamazon linux2だったがもうそろそろサービスが終了するということで、amazon linux 2023に移行しますのでとりあえず既存システム同じ環境を用意してください～となり見てみたところPHP5.6が使われてるじゃないですか～～～

ほなじゃあphp入れるのにまずepel君入れますか～
```
sudo amazon-linux-extras install epel
```
すると
```
amazon-linux-extras command not found
```
amazon-linux-extras君はいないって怒られた(´・ω・`)

なななんとamazon linux 2023には搭載してないらしい…

## やったこと
epelが入れられないのでremiリポジトリからインストールを断念してソースコードを入れてビルドする方針に変えてやります
まずビルドに必要なパッケージを入れるとこから始めよう
```
sudo yum install -y gcc gcc-c++ make automake autoconf kernel-devel libxml2-devel libcurl-devel openssl-devel bzip2-devel libjpeg-devel libpng-devel freetype-devel readline-devel libxslt-devel libmcrypt-devel libmcrypt
```
そしたらlibmcrypt-devel libmcryptこの2つがないらしいので以下を参考に別から入れることにした
https://repost.aws/questions/QUQFr6C5zeQMyXHG6kz6WO9w/need-detailed-steps-to-install-mcrypt-1-0-6-or-1-0-7-for-php8-2-on-amazon-linux-2023

```/etc/yum.repos.d/fedora.repo
[fedora]
name=Fedora 36 - $basearch
#baseurl=http://download.example/pub/fedora/linux/releases/36/Everything/$basearch/os/
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-36&arch=$basearch
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
type=rpm
gpgcheck=0
gpgkey=https://getfedora.org/static/fedora.gpg
skip_if_unavailable=False
```
Fedoraリポジトリからmcryptライブラリをインストールする
```
sudo dnf clean all
sudo dnf install libmcrypt-devel libmcrypt -y
```
Fedoraリポジトリを無効にする
```
sudo dnf config-manager --disable fedora
sudo dnf clean all
```
その他の必要ライブラリを入れる
```
sudo yum install -y gcc gcc-c++ make automake autoconf kernel-devel libxml2-devel  libjpeg-devel libpng-devel freetype-devel readline-devel libxslt-devel
```
phpのソースコードをダウンロード
```
mkdir ~/php5.6
cd ~/php5.6
wget https://www.php.net/distributions/php-5.6.40.tar.gz
tar -xzf php-5.6.40.tar.gz
cd php-5.6.40
```
ビルド(必要な拡張機能を設定する)
```
bash configure --prefix=/usr/local/php-5.6 --with-config-file-path=/usr/local/php-5.6/etc --enable-mbstring
make
sudo make install
```
phpの設定(パスなど)
```
sudo cp php.ini-production /usr/local/php-5.6/etc/php.ini
echo "export PATH=/usr/local/php-5.6/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
```
これでPFP5.6が使えるようになった！！
## おわり
ぶっちゃけdockerとか使った方が鬼楽
なんかの縛りプレイかなって思うくらいamazon linux2との差があり、amazon linux2023からなくなったモジュールとか多いから参考資料探すのも大変だった…

余談ですが、最近ブログとか書くのが楽しくなってきたので、技術系メモ以外でも書いてみたいなって思ってきたｗ
そのうち会話風のブログとかも書きたいね

最後まで読んでいただきありがとうございました。今回の記事が皆さんのお役に立てましたら幸いです。またのご訪問をお待ちしております！
「経験のない仕事」を始める前にやっておくこと

## はじめに

◆この記事は何？
経験のない仕事を始める前にやっておくと効果的な対策について紹介する記事です。

◆対象は？
経験のない領域にアサインされる人
またはアサインする立場の人

◆この記事のねらい
経験のない仕事に取り組む際の負担を軽減すること

## 先に結論
- とにかくLLMで予習する
- ヘルプを出す準備を事前に整える
- 見通しを立て続ける

## 経験のない領域へのアサインは辛い

経験のない領域で仕事をするのは、心理的にも体力的にも負荷が大きくなる場合があります。

「経験のない仕事のやり方」が分かるまでには時間がかかります。

しかし、準備と心構えで負担を軽減できます。

## 対策①LLMで予習する

経験のない仕事について、昔は先輩に聞いていましたが、今はChatGPTなどのLLM（大規模言語モデル）に質問できます。効率的に予習を進めることができます。

効果的なプロンプトの例を紹介します。
```
初めてXXに取り組むときに、初心者が気をつけることを教えてください。
```
```
初めてXXに取り組むときのタスクを一覧化してください。
```

## 対策②ヘルプを出す事前準備

経験のない仕事に取り組んでいるとき、ヘルプを求める可能性があります。

そのため、ヘルプを出す前提で、先に準備をしておきます。

具体的には、
- ヘルプ先の相手を見つけておく
- いつ相談すればいいか、認識を合わせておく
- 自分がどうなったらヘルプを出すか、認識を合わせておく

などがあります。


## 対策③見通しを立て続ける

見通しが立たない状況は、心理的な負担が大きくなりやすいです。

そのため、見通しを立て続けることを意識します。

具体的には、
- 全体像を可視化する
- マイルストーンを確認する
- 明日は何をするか？来週は何をするか？を確認し続ける

などが有効です。

具体的なタスクの理解や分解については先述のLLM活用が有効です。

## おわりに

この記事では、経験のない仕事を始める前にやっておくと効果的なことを紹介しました。

少しでも参考になれば幸いです。
Grok-1 を使ってみる

あのイーロンマスク氏が率いる xAI社 が公開している生成AI "Grok-1" が凄いらしい。  
**あのイーロンマスク氏が率いる xAI社 が公開している生成AI "Grok-1" が凄いらしい。**  
***あのイーロンマスク氏が率いる xAI社 が公開している生成AI "Grok-1" が凄いらしい。***  

  
半年ほど前、
個性的な発言でたびたびメディアを賑わせている彼は、
ウィットにと呼んだ個性的な返答をしてくれる AI を公開したと話題になった。


そんな Grok-1 を **無料で使ってみたい！**

そんな欲望を持ちながら、[GitHub](https://github.com/xai-org/grok-1/tree/main)で公開されている情報を基にコードを書いてみることにした。


# 1.Grok-1 とは  

Grok-1 とは、xAI社によって開発された 3140億パラメータ を持つ **Mixture-of-Expertsモデル(MoEモデル)** である。  

**MoEモデル**とは、特定のタスクに応じて複数の「エキスパート」モデルを使い分けるように構築されたモデルである。 

……人間の五感と大脳の関係に似ているイメージ？？？  


# 2.Grok-1 の特徴  

- 大規模なパラメータ数: 3140億パラメータ
- 高度な自然言語処理能力
- テキスト生成、質問応答、翻訳などのタスクに優れた性能
- **Apache 2.0 ライセンス**の下で提供されている、オープンなモデルである。
  

# 3.Apache 2.0 ライセンスとは？  

Apache 2.0は、非常に寛容なオープンソースライセンスで、自由な利用、変更、配布が許可されています。主な特徴は以下の通りです。

- **自由な利用と改変**: 商用利用も含め、自由にソフトウェアを使用、改変可能。
- **配布条件**: 改変したソフトウェアの配布時には変更内容を明示する必要があります。
- **特許ライセンス**: 開発者が提供する特許技術を使用する権利が与えられます。
- **無保証**: ソフトウェアは「現状のまま」提供され、開発者は問題に対して責任を負いません。


# 4.Grok-1 を使っていこう！  

```python
# Grok-1 リポジトリのクローンをダウンロード
!git clone https://github.com/xai-org/grok-1.git
%cd grok-1

# 依存関係のインストール
!pip install -r requirements.txt

# モデルウェイトのダウンロード
!huggingface-cli download xai-org/grok-1 --repo-type model --include ckpt-0/* --local-dir checkpoints --local-dir-use-symlinks False

```

・・・  

割と簡単に行けると思いきや、  
**ハプニング発生!!!**  

重みのファイルが **296GB** もありローカル環境でも Google CoLab 上でも全くダウンロードできず、、、
調べてみると、一個人が自分のPCで Glock-1 を遊ぶのには金銭的な投資が必要でした。。。  


# 5.まとめ  

Grok-1 を実行する試みは、モデルの重みの大きさによって実現困難であることが判明しました。  
しかし、この経験を通じて、巨大なAIモデルを扱う際の課題と、それに対処するための戦略について多くの教訓を得ることができました。

やはり、何事も時間かけて体験してみるということが大切なのですね。。
自己紹介ページ　進捗

お疲れ様です。

今日は課題ではなく、転職に向けて今まで学んだことをアウトプットしながら、自己紹介ページを作成していましたので、その進捗メモを残します。

![スクリーンショット 2024-06-27 133405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/4fe55de0-2928-1ad2-e90e-e5503f84c652.png)
![スクリーンショット 2024-06-27 221839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/0b5b2931-2901-5790-b437-6daf38ca2ed9.png)

昨日から始め、シングルカラムのレイアウトで作ろうと決めましたが、なかなか配置などが決まらずぐだぐだとしてしまいました。
2枚目の画像の自己紹介の下には職歴を箇条書きにしたものが続いています。

![スクリーンショット 2024-06-27 221908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/29474785-06ec-6ab7-052d-d1f99273d1ff.png)
![スクリーンショット 2024-06-27 221942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/aaccc871-17bb-a67e-3dc7-c7c3ab20766a.png)
1時間半ほどの作業でしたが、調べたりコードを試したりしつつ、進められましたが、まだシンプルすぎるので、明日からは背景色をつけたり、下線を引いてみたりして見た目を整えたいと思います。

また、動きがありませんので、 transform要素を実装するなどして、自身の学びも掘り下げていきたいです。
【2024マラソン09】エラーが出てないのにimmersedが繋がらない時に確認する設定

# 何の記事？
immersedを接続する際、PCがデュアルディスプレイだと繋がらないことがあり、再接続までに難航したので、やったことを残します。

# 接続環境
- ゲーミングじゃないPC
- 平常時はデュアルディスプレイで使用
- quest2

# あらすじ
immersedを使った初回は何も問題なく初期設定を終えることができ、接続ができました。
ですが、2回目に接続しようとした時、何もエラーが出ていないのにもかかわらず、繋がりませんでした。

# 起こったこと
通常であれば、PCでimmersedを立ち上げた後、 quest2でimmersedアプリを立ち上げると自動でPCのデスクトップが表示されます。
ですが、この時はPC側で接続認識音がなった後、ずっと読み込み中の状態になってしまい、一向に接続できませんでした。
また何らかのエラー表示が出てくれれば良いのですが、 quest側もPC側も読み込み中で進まず、何もエラーが起きていないと言う状態だったので、原因を突き止めるのにだいぶ難航しました……。

# やったこと
#### 1. ディスプレイを単体認識に切り替える

そもそも、デュアルディスプレイの状態だとimmersedは使えないので、まずデスクトップ上で右クリックをしてディスプレイ設定を開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/95fb6be6-8f66-aa80-7631-df78da60d019.png" width=300>


下までスクロールすると、マルチディスプレイの項目があるので、「1のみに表示する」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/6d328f55-3258-5376-01f4-cef4863f7e54.png" width=300>

クリックしただけでは変更が適用されないので「変更の維持」をクリックして確定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/ab54331e-9784-b984-1e8f-c9f5e83e910f.png" width=300>

#### 2. 物理ディスプレイの接続端子を抜く

無事、ディスプレイが単体表示になったところで、サブディスプレイの電源コードを抜きます。


#### 3. PCでimmersedを起動

抜いた後で、パソコン側でimmersedのアプリを立ち上げます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/120d1da7-c75d-8dff-30dc-04a0faa1c751.png" width=300>

#### 4. ディスプレイ設定を確認

マウスのアプリが立ち上がり、ウインドウのテキストが緑色であれば、エラーが出ていない状態です。
この状態で、「Virtual Displays」を選択し「Enable Virtual Display 1」のみにチェックが入っている状態にします。
immersedをよく使っている設定だと2~4にチェックが入ってしまっていることが多いので、これを一度外します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/2b633e4a-e640-6924-328e-871e8f86283d.png" width=300>

#### 5. quest側でimmersedを起動

これでPC側の設定変更は完了したので、quest側でimmersedを起動します。
問題なければ、起動直後にPCのディスプレイ画面が表示されるので、これで問題なく使うことができます。

# おそらくの原因
おそらく、複数ディスプレイを認識可能な状態だと、表面上はエラーがなくても、裏で不具合があるのではないかと思います。
一先ず、物理的にディスプレイを1つしか認識しない状態にすると繋がるようになった為、普段はデュアルディスプレイでPCを利用していてimmersedが繋がずに困っている方は試してみてください。