OmniAICreator/Qiita-1.07M huggingface dataset:
【WinAuth】スマホを使わずに2要素認証でログインする

## この記事は

WinAuthを使ってマイクロソフトのサイトにログインしてみた記録である

### 参考記事

なぜWinAuthを使うのか？（使いたいのか？）については、下記記事を参照のこと

https://qiita.com/tsukamoto/items/1019381984b8b4735515

### WinAuth

DownloadページからWinAuth.exeをダウンロードできる

2024年7月時点では、WinAuth Version 3.5が最新の安定版
GitHubのページはアーカイブされて読み取り専用になっているため
これ以上の更新は無いのかもしれない

https://winauth.github.io/winauth/index.html

## マイクロソフトのサイトで２要素認証を設定する

まずは普通に今できる方法でマイクロソフトにログインする
「セキュリティ」＞「サインイン方法の管理」＞「サインインまたは確認の新しい方法を追加」の順に進む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/945a6637-6c18-a217-84a2-5be874198f89.png)

「アプリを使う」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/61d50273-f9be-9157-9da9-21603b23c23c.png)

「別の認証アプリを設定します」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/0c34a0f7-d6d6-33fd-6326-cc34db681201.png)

「QRコードをスキャンできない場合」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/8e13015e-3f7b-3db2-ea63-5ae020804cb1.png)

秘密鍵をWinAuthに入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/32da755f-e60d-d48c-19ca-f334bb112c71.png)

## WinAuth側の設定

Addを押して、Authenticatorを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/ab7b862f-6477-b2c1-efcf-330521a0df49.png)

マイクロソフトのサイトに表示されていた秘密鍵をコピーしてWinAuthに入力する
「Verify Authenticator」を押して表示された６桁の数字をマイクロソフトのサイトに入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/0dbe953a-7a00-bd5f-4f11-5b88fb376cc6.png)

２要素認証の設定は以上
マイクロソフトのサイトには新たに「認証アプリからコードを入力する」が追加されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/043af1fd-28ad-f932-e001-61a5b9e7e03a.png)


### WinAuthの保護

２要素認証の設定が終わると、下記の画面が表示される
Authenticator自体をパスワードで保護したりできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/24f421c2-a5ab-e26e-bd62-2db86ec6efdc.png)

## マイクロソフトのサイトに２要素認証でログインする

WinAuthアプリにワンタイムパスワードが表示されるので、マイクロソフトのログイン画面の指示に従ってワンタイムパスワードを入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e20f3cb6-8440-f0e7-b8b3-26a8bde2e046.png)

## 糸冬了！！
【Python】for-else構文の使い方

## はじめに
Pythonには、他のプログラミング言語にはないfor-else構文があります。
本記事では、for-else構文の基本的な使い方と具体例を紹介します。

## 1. for-else構文とは？
for-else構文は、Python特有のループ構文です。
通常のforループに加えて、elseブロックを追加することで、ループが正常に完了した場合にのみ実行されるコードを指定することができます。

## 2. for-else構文の基本的な使い方
for-else構文の基本形は以下の通りです。

```python
for item in iterable:
    # ループ内の処理
else:
    # ループが正常に完了した場合の処理
```

forループが正常に完了するとelseブロックが実行されます。
break文でループが途中で終了した場合、elseブロックは実行されません。
## 3. for-else構文の具体例

##### 例1：ループ内で特定の条件が満たされた場合
以下の例では、リスト内に特定の値が存在するかをチェックし、見つかった場合にbreakでループを終了します。
見つからなかった場合にelseブロックが実行されます。
```python
numbers = [1, 2, 3, 4, 5]
target = 3

for num in numbers:
    print(f"Checking number: {num}")
    if num == target:
        print(f"{target} found!")
        break
else:
    print(f"{target} not found!")
```
出力例：
```
Checking number: 1
Checking number: 2
Checking number: 3
3 found!
```
##### 例2: ループが正常に完了した場合の処理
以下の例では、リスト内のすべての値をチェックし、特定の条件を満たさない場合にelseブロックが実行されます。
```python
numbers = [1, 2, 3, 4, 5]
target = 6

for num in numbers:
    print(f"Checking number: {num}")
    if num == target:
        print(f"{target} found!")
        break
else:
    print(f"{target} not found!")
```
出力例：
```
Checking number: 1
Checking number: 2
Checking number: 3
Checking number: 4
Checking number: 5
6 not found!
```

## 4. for-else構文の注意点
- elseブロックは、forループがbreak文で中断されずに完了した場合にのみ実行されます。
- elseブロックは、ループ内のすべての要素を処理した後に実行されるため、ループが一度も実行されなかった場合でも実行されます。

## 5. まとめ
Pythonのfor-else構文は、特定の条件に基づいてループの後に実行される処理を簡潔に記述するための便利な構文です。
今後のコードにぜひ活用してみてください。
【GitHub】プルリクエストのレビュー方法について


業務において、GitHubでソースコードのレビューをする機会が増えたため
備忘として記載します。

## 1. プルリクエストのレビューについて
GitHubでは、ソースコードの変更点をプルリクエストとして提出し、他のメンバーにレビューしてもらうことができます。
プルリクエストのレビューは、コードの品質を保つために非常に大切です。
- ファイルごとにレビュー
 　プルリクエストでは、変更された各ファイルを個別に確認できます。
- 特定の行にコメント
　コードの特定の行にコメントを追加することで、具体的なフィードバックをすることができます。

## 2. レビュー方法について

#### レビューのステップ
① リポジトリ名の下にある「Pull requests」をクリックします。
 　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/48eed507-7e7e-8771-5eb0-f82060166f01.png)

    
② プルリクエストのリストからレビューしたいプルリクエストをクリックします。

③ プルリクエスト内の「Files changed」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/ec52785a-42bd-0acb-afba-c7cc2d0dfdb5.png)

④ コメントを追加するコード行にカーソルを合わせ、青いアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/dab03fb5-85c1-acaa-67ce-4d93ace854e1.png)

⑤ 必要に応じてコメントを入力し、「Start a review」をクリックします。
※ この段階ではコメントは保留中で、自分にしか見えません。
　すべてのレビューが完了したら、後述「レビューの完了」の手順を行いましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/4da5d472-d75c-9488-6827-9ce8be370c41.png)

#### 参考：レビューのチェックポイント
私がレビュー時に確認するようにしているポイントは以下の通りです。
他にも確認すべき内容があると思いますが、未だ勉強中のため割愛させていただきます。
ご参考までに。。

##### 1.コードスタイル：コードが一貫したスタイルで書かれているか。
- インデント：
　インデントが統一されているか（スペースかタブかの一貫性）。
- 命名規則：
　変数名や関数名が一貫した命名規則に従っているか。
　例：camelCase、snake_caseなど。
- コメント：
　必要な場所にコメントが適切に追加されているか。

##### 2.一貫性：既存のコードとの一貫性が保たれているか。
- 既存のコードとの整合性：
　新しいコードが既存のコードベースと一貫しているか。
　例：同じ機能を実装する際に同じパターンを使っているか。
- ライブラリの使用：
　既存のライブラリや関数が再利用されているか、新しいライブラリが適切に導入されているか。
- アーキテクチャ：
　プロジェクトの設計に沿った構造になっているか。

##### 3.パフォーマンス：コードが効率的に実行されるか。
- 効率性：
　コードが効率的に実行されるか（無駄な計算やループがないか）。
- データ構造：
　適切なデータ構造が選ばれているか（例：リスト、セット、辞書）。

##### 4.セキュリティ：セキュリティ上のリスクがないか。
- 入力のバリデーション：
　ユーザーからの入力が適切にバリデートされているか。
- エラー処理：
　例外やエラーが適切に処理されているか。

#### レビューの完了
① レビューが完了したら「Finish your review」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/23fec899-bb79-71c5-5c2f-fb50c45996b7.png)

② 必要に応じてコメントを入力し、「Comment」、「Approve」、「Request changes」のいずれかを選択して「Submit review」をクリックします。
これで、保留中コメントすべてをレビュイーに提出することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/fa03f153-2493-2342-5856-38d1b49cf8d5.png)

- Comment：変更の提案やフィードバックを提供する。
　承認/非承認もしない場合は、Commentを選択しましょう。
- Approve：変更を承認する。
　この変更で問題ないと思ったら、Approveを選択しましょう。
- Request changes：修正が必要であることを示す。
　修正が必要であると思ったら、Request changeを選択しましょう。

## 3.まとめ

レビュアーになる機会が増え、コードは書くよりも読む方が大変なことに気付きました。 
特になるべく早くマージしたいからという理由で適当にレビューをしてしまうと、後から修正することになり結果的に手間が増えてしまいます。

私も初めはレビューに時間をかけることが面倒だと感じていましたが、後からバグを修正するよりも、最初からしっかりレビューする方がはるかに効率的だと学びました。

しっかりとしたレビューを行うことで、コードの品質を保ち、後々の手戻りを減らすことができます。この記事が、誰かのコードレビューの助けになれば嬉しいです。
コマンドプロンプトでタイムスタンプを付ける

# ユースケース

Python等で作成した`.exe`コマンドラインソフトウェアに対して、非ITエンジニアが利用すると想定してバッチファイルでインターフェースを作ります。（入力ファイルをドラッグアンドドロップすれば動くようになる）

このバッチファイルと`.exe`を通じてさらにファイル出力をする際に、タイムスタンプが必要です。タイムスタンプをコマンドプロンプト上で取得する方法を以下で書いていきます。

## 登場するコマンド
以下、コマンドプロンプトの事例を記載します。

|コマンド|説明|
|:---|:---|
|`time`|時刻を取得|
|`date`|日付を取得|

## コマンド

```CMD
>For /f "tokens=1-3 delims=/ " %a in ('date /t') do (set mydate=%a-%b-%c)
>(set mydate=2024-07-21 )
>For /f "tokens=1-2 delims=:" %a in ('time /t') do (set mytime=%a-%b)
>(set mytime=16-29 )
>echo %mydate%_%mytime%
2024-07-21_16-29
```

## 説明

コマンドプロンプトのfor文にて、/f オプションを使って文字列のフォーマットが可能です。`tokens`で取得する文字列のインデックスを指定します。`delims`で文字列を分割する文字を指定します。`2024/07/21`であれば`/`をdelimsに指定することで、文字列`2024`, `07`, `21`を受け取ります。for文なので、`do ()`で変数に代入すればタイムスタンプの変数を保持することができます。

for文の `%a` ですが、開始するアルファベットを明示する意味があります。for directiveは勝手にアルファベット順に変数をマップします。上記のコマンドの例だと、`%a`で開始して、`%b`や`%c`が勝手に使われています。

なお、バッチファイルに記入する際はfor文のローカルパラメータ %aなどにもう一つパーセントを付けて`%%a`などとします。

# 参考文献

- [How do I get current date/time on the Windows command line in a suitable format for usage in a file/folder name?](https://stackoverflow.com/questions/203090/how-do-i-get-current-date-time-on-the-windows-command-line-in-a-suitable-format#answer-203116)
Railsのデータベースマイグレーションファイルで適切にロールバックするためのupとdownの設定方法

## 経緯
業務の中で、rails db:rollbackを実行した際に適切にロールバックができないというエラーが発生しました。

この問題を解決するために、マイグレーションファイルのupメソッドとdownメソッドを調べて適切に設定する方法を見つけ、実装することで問題を解決しました。本記事では、その実装方法を紹介します。

## データベースマイグレーションとは
データベースマイグレーションとは、データベースのスキーマ（構造）をバージョン管理し、変更を適用したり取り消したりする仕組みのことです。これにより、データベースの変更履歴を管理し、開発と運用を円滑に行うことができます。

## upメソッドとdownメソッドの重要性
upメソッドはデータベースに変更を加える処理を記述します。対して、downメソッドはその変更を取り消す処理を記述します。これにより、変更の適用とロールバックが容易になり、バグや問題が発生した場合に迅速に対応できます。

## 実装方法
#### upメソッドの実装方法
upメソッドには、テーブルの作成やカラムの追加、インデックスの作成などの処理を記述します。
```
class AddColumnsToMultipleTables < ActiveRecord::Migration[6.0]
  def up
    add_column :table1, :new_column1, :string
    add_column :table2, :new_column2, :integer
    add_column :table3, :new_column3, :boolean
  end
end
```
もし、downメソッドが適切に設定されていない場合、rails db:rollbackを実行するとエラーが発生しますので注意しましょう。

#### downメソッドの実装方法

downメソッドには、upメソッドで行った変更を元に戻す処理を記述します。このとき、他のテーブルとの依存関係により、カラムを削除する順番に注意する必要があります。
```
class AddColumnsToMultipleTables < ActiveRecord::Migration[6.0]
  def down
    remove_column :table3, :new_column3
    remove_column :table2, :new_column2
    remove_column :table1, :new_column1
  end
end
```

#### upとdownを用いたマイグレーションファイルの例
```
class AddColumnsToMultipleTables < ActiveRecord::Migration[6.0]
  def up
    add_column :table1, :new_column1, :string
    add_column :table2, :new_column2, :integer
    add_column :table3, :new_column3, :boolean
  end

  def down
    remove_column :table3, :new_column3
    remove_column :table2, :new_column2
    remove_column :table1, :new_column1
  end
end
```

## まとめ
データベースマイグレーションにおいて、upメソッドとdownメソッドを適切に設定することでロールバックを適切に行うことができるようになります！
使いやすく、正確なAI PDF翻訳ツールをお探しですか？

　Doclingoが最適です。DoclingoのPDF翻訳ツールは迅速かつ正確なドキュメント翻訳を提供します。その特徴は以下です。
 
## 1．正しさ
最先端のAI技術を使い、文章の細かなニュアンスや文脈を捉え、意味と完全性を保ちながら翻訳します。

## 2．フォーマットの保持
Doclingoは翻訳時に原文のフォーマットを保持します。PDFファイルにビジュアル要素やカスタムフォントが少ない場合、翻訳効果はさらによくなります。

## 3．データの安全性
すべてのファイルは翻訳後24時間に削除されます。あなたのファイルは絶対に安全で、第三者がアクセスすることはありません。安心してください。

## 4．多プラットフォーム対応
オンラインでPDF翻訳ツールにアクセスできるだけでなく、デスクトップやスマホアプリからも利用可能です。どこにいても、どのデバイスを使用しても、Doclingoはサービスを提供します。

　[Doclingo](https://doclingo.ai/ja/)にアクセスして、試してみましょう。
新卒が初めての現場で学んだこと

目的
-


はじめまして！！

私は初現場に配属されてそろそろ2ヶ月が経つかなという<font color="orange">**新人エンジニア**</font>です。
今回はそんな私が**現場で学んだこと**について書き留めていこうかなと思います。

1.結論を先に 
-
まずは私の失敗例を見てみましょう。

:::note alert
私　「○○さん、今お時間よろしいですか？」
上長「いいですよ。」
私　「変換をしていたんですが、××といったエラーが出てしまい問い合わせ台帳で
　　似たようなものが見つからなくて。なので.....していて」
上長「まず、なんのタスクしてたんですか。結局何が言いたいの？」
:::

といった報告としては完全にNGなことをしてしまいました。
報告の仕方は新卒研修でも学んでいたことです。ここで改めてまとめていきます。

:::note
**報告の仕方～３ステップ法～**
①何に関する報告なのか
②結論としてどうなったのか
③今後の展開を伝える
:::
<br>
報告される側はどうなったのかということが知りたい。
また忙しい現場なら尚更、報告に何分も時間をかけていると作業の手が止まってしまいます。
<br><br>
仕事の場なので自分が良ければいいというのは通用しないのです。
完璧でなくても<br>
<font color="Red">自分主義にならないように</font>
というのは意識しておくといいかもしれないです。

2.自分で考える
-
これは私が現場で経験して学んだことです。
こちらも私の失敗例を見てみましょう。
<br>

:::note alert
上長「このデータの登録作業をしてほしいんだけど、
　　登録作業までの手順書が変わっているかもしれないから確認してほしい。
　　確認し終わったら報告してください。」
私「承知いたしました。」
～確認後～
私「確認しました。まずデータの変換の作業についてですが.....でした。
　　また登録用データの作成については.....で、」
上長「うん、うん、…〇〇さん確認しといて。」
:::


上長の考えは
<font color ="red">***手順書の変更点を確認したうえで登録作業をしていいかどうかを判断して報告***</font>
でした。
<br>
何でもかんでも「どうしたらいいですか？」と相手に意見を委ねるばかりでは、忙しい人にとっては時間を取られてしまいます。それに自分のためにもなりません。

自分で考えて、わからなかったら相談してを繰り返して自分の成長につなげていきたいですね。

終わりに
-
今の現場では、ITでの技術面というより、**社会人としての経験**がとても多くできている気がします。IT技術面はまだまだ学習中なので、また知識がついたりしたらQiitaを書いてみたいと思います。
【Laravel】一括キャッシュクリアコマンド

# はじめに
- 一括で実行できるコマンドについて調べたのでまとめてみました。

# 前提
- Laravel10

# 一括でキャッシュクリア

```
php artisan optimize:clear
```

- Laravelによるキャッシュクリアが全て実行されていることが確認できる

![スクリーンショット 2024-07-21 15.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/04bb5c0a-12ee-6ee4-c301-7cf2011ee025.png)

-ファイル中確認すると下記のようになっている。

```vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeClearCommand.php

<?php

namespace Illuminate\Foundation\Console;

use Illuminate\Console\Command;
use Symfony\Component\Console\Attribute\AsCommand;

#[AsCommand(name: 'optimize:clear')]
class OptimizeClearCommand extends Command
{
    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'optimize:clear';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Remove the cached bootstrap files';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        $this->components->info('Clearing cached bootstrap files.');

        collect([
            'events' => fn () => $this->callSilent('event:clear') == 0,
            'views' => fn () => $this->callSilent('view:clear') == 0,
            'cache' => fn () => $this->callSilent('cache:clear') == 0,
            'route' => fn () => $this->callSilent('route:clear') == 0,
            'config' => fn () => $this->callSilent('config:clear') == 0,
            'compiled' => fn () => $this->callSilent('clear-compiled') == 0,
        ])->each(fn ($task, $description) => $this->components->task($description, $task));

        $this->newLine();
    }
}

```

# 各コマンドを調べてみる

## event
- イベントとリスナーの紐付けキャッシュを削除している

```
php artisan event:clear
```

## views
- resources/views/* に存在するviewテンプレートのキャッシュを削除している

```
php artisan view:clear
```

## cache

- cacheクラスを使用したキャッシングを削除している。参考記事によると`Cache::flush();`と同じ処理が走るらしい。

```
php artisan cache:clear
```

- 公式ドキュメントに記載があったけど、keyに関係なく全て消されるので注意が必要そう
>キャッシュをフラッシュすると、設定されたキャッシュの「プレフィックス」は考慮されず、キャッシュからすべてのエントリが削除されます。他のアプリケーションによって共有されているキャッシュをクリアする場合は、この点を慎重に考慮してください。

## route

- routes/* に存在するルーティングに関する記述のキャッシングを削除している

```
php artisan route:clear
```

## config

- config/* に存在する複数のファイルを1つのファイルにキャッシングしているものを削除している

```
php artisan config:clear
```

## clear-compiled

- Laravelアプリケーションのコンパイル済みファイルとキャッシュを削除している。

```
php artisan clear-compiled
```

# まとめ
- 一括でキャッシュクリアできるのは便利な一方で消す必要のないキャッシュまで削除しているので、便利だけど考えて使った方が良さそう。調べるきっかけになったので勉強になった。

# 参考
- [Deployment
](https://laravel.com/docs/10.x/deployment#optimization)
- [Laravel 10.x イベント
](https://readouble.com/laravel/10.x/ja/events.html)
- [View](https://laravel.com/docs/10.x/views#optimizing-views)
- [Cache](https://laravel.com/docs/10.x/cache#removing-items-from-the-cache)
- [Route](https://laravel.com/docs/10.x/routing#route-caching)
- [Configuration](https://arc.net/l/quote/ruzxjuab)
- [Laravel 10.x Artisanコンソール](https://arc.net/l/quote/cdctlpma)
- [【一括クリア】Laravelキャッシュクリア – 基本から応用まで徹底解説](https://arc.net/l/quote/cnezdwzy)
TypeScript初心者必見！ゼロから学べる実践入門

はじめに
---
TypeScriptはJavaScriptに型付けを加えた強力な言語で、より堅牢で保守性の高いコードを書くのに役立ちます。

TypeScriptとは？
---
Microsoftが開発したJavaScriptのスーパーセットで、静的型付けを提供します。
コンパイル時に型のエラーを検出しやすくなり、コードの品質向上とバグの発見が容易になります。

関数と型
---
関数の引数や戻り値に型を指定することもできます。これにより、関数の使い方がより明確になり、エラーの予防になります。
```
function greet(name: string): string {
    return `Hello, ${name}!`;
}
```
クラスとインターフェース
---
TypeScriptでは、オブジェクト指向プログラミングのためのクラスやインターフェースもサポートしています。
``` .クラスの例
class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    greet(): string {
        return `Hello, my name is ${this.name}.`;
    }
}
```

``` .インターフェースの例
interface Address {
    street: string;
    city: string;
}

const address: Address = {
    street: "123 Main St",
    city: "Springfield"
};
```

型推論と型ガード
---
ypeScriptは型推論を行い、変数の型を自動的に推測します。また、型ガードを使うことで、より詳細な型チェックが可能です。
```
function isString(value: any): value is string {
    return typeof value === 'string';
}

let unknownValue: any = "This is a string";

if (isString(unknownValue)) {
    console.log(unknownValue.toUpperCase());
}
```

ESLintとPrettier
---
コードの品質とフォーマットを保つために、ESLintとPrettierを使用するのが一般的です。
`ESLint`:コードの静的解析ツール
`Prettier`:コードフォーマッター
``` .ESLintの設定
npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
```
``` .eslintrc.jsonの設定例
{
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "rules": {
    "semi": ["error", "always"],
    "quotes": ["error", "single"]
  }
}
```

```Prettierの設定
npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier
```
```.prettierrcの設定例:
{
  "semi": false,
  "singleQuote": true
}
```

まとめ
---
TypeScriptを使うことでJavaScriptの動的型付けの欠点を補い、より堅牢でエラーの少ないコードを書くことができます。
DroidKaigi2024で気になる登壇まとめ：前半

# はじめに
今年もDroidKaigi2024が開催されますね！
毎年とても楽しみにしているイベントの一つですが、今回も大変有益な情報に溢れていそうです！
そんな中で個人的に気になる登壇をまとめたいと思います、12、13と記事を分ける形でまとめていきます！

# その1：Android ViewからJetpack Composeへ 〜Jetpack Compose移行のすゝめ〜

https://2024.droidkaigi.jp/timetable/689254/

すでにフルComposeで実装しているプロジェクトなどは優先度が下がると思いますが、現状AndroidViewを採用しているプロジェクトからしたら大変有益な情報だと思います。
また、今回の登壇の内容は実際に現場で試行錯誤の末たどり着いた方法とのことで、今後移行を検討しているプロジェクトにはとても参考になる内容になっていそうです。

# その2：Kotlin 2.0が与えるAndroid開発の進化

https://2024.droidkaigi.jp/timetable/687445/

まさに現在注目の的となっているKotlin2.0、今後このバージョンが標準化していく上で知っておくべき新機能やコンパイルシステムの変化、Gradleに関する変更点などその変化に関してピンポイントでご紹介していただけるようで、この登壇を視聴するだけで網羅的に理解できそうです。
2.0へ上げる際に困ることがないよう、視聴しておきたいですね。

# その3：いまあるAndroidスキルでフルスタックデベロッパーになる💙

https://2024.droidkaigi.jp/timetable/687445/

弊社ではエンジニアのキャリアに非常に力を入れている為、こういったキャリアに関係する登壇は視聴必須です！
現在のKotlinはバックエンドやWebなどクロスプラットフォームに対応しており、フルスタックへの道を加速させます。
まさにその内容を凝縮した登壇となっているようです、当日の視聴がとても楽しみです！

# その5：海外就職というキャリアの選択肢

https://2024.droidkaigi.jp/timetable/691330/

今回のDroidKaigiにおいて最も注目しているといっても過言ではない登壇がこちらです。
エンジニアの海外進出はまさに弊社の課題であり、日本のエンジニアが海外で活躍できるステージを作ることこそ、私が次に解決すべき課題です！
こちらの登壇では実際の失敗談や経験からキャリアへの意識など網羅的に解説いただけるようで、何度も繰り返し聴きたい内容となっています！

# さいごに
今回のDroidKaigiはキャリアに関するお話が多く、吸収すべき登壇が多くてとても楽しみです！
暗号資産ライトコイン(LTC)のフルノードを構築する方法

## 要　旨
暗号資産ライトコイン(LTC)のフルノードを構築する方法(CLI)について記述します。
## 実行環境等
VPS:KAGOYA VPS
OS:Ubuntu22.04LTS
CPU/メモリ:4コア/4GB
ストレージ:600GB SSD
料金　95円/日、2,640円/月(2024.7.21時点)
同期開始:2024.7.21(日)06:00
同期完了:2024.7.21(日)16:00
同期に要した時間:10時間00分
使用ストレージ容量:377GB
## 実施要領
アップデート
```linux
apt update
```
ウォレットのインストール
```linux
wget https://github.com/litecoin-project/litecoin/releases/download/v0.21.3/litecoin-0.21.3-x86_64-linux-gnu.tar.gz
```
展開する。
```linux
tar -xzvf litecoin-0.21.3-x86_64-linux-gnu.tar.gz
```
不要になったファイルの削除
```linux
rm litecoin-0.21.3-x86_64-linux-gnu.tar.gz
```
ディレクトリの移動
```linux
cd litecoin-0.21.3/bin
```
コマンドをインストールする
```linux
install -m 0755 -o root -g root -t /usr/local/bin *
```
litecoindの起動
```linux
litecoind
```
起動を確認したら(1分経過したら)、一旦停止させる。
ctr + C
~/.litecoin/litecoin.confを編集する。
```linux
vi ~/.litecoin/litecoin.conf
```
以下を記述して、保存する。
```linux
mainnet=1
daemon=1
server=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcport=9332
gen=1
genproclimit=-1
```
再度litecoindを起動させて、同期させる。
```linux
litecoind
```
同期状態の確認。
```linux
tail -f ~/.litecoin/debug.log
```
## 結　言
今回は、暗号資産ライトコイン(LTC)のフルノードを構築する方法(CLI)について記述しました。
JUMAN++をPythonでDocker内で動かす

## はじめに
[Media of Langue](https://www.media-of-langue.org/)を開発する過程でJUMAN++をDocker内で動かしたくなったのでメモ。
ちなみにJUMAN++はバージョン2系列の方が早いのでこちらを使っていきます。

## Dockerfile
今回使ったDockerfileをもとにしているので適時変更してください。
(srcディレクトリがないとエラーが出ます)
```Dockerfile
FROM nvidia/cuda:11.6.2-base-ubuntu20.04
ARG SRCDIR=/src
RUN export LC_ALL=C.UTF-8
RUN export LANG=C.UTF-8
RUN apt-get update -y && \
    apt-get upgrade -y && \
    apt-get install -y \
    locales \
    locales-all \
    g++ \
    wget \
    clang \
    cmake \
    xz-utils && \
    locale-gen ja_JP.UTF-8 && \
    echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc 
RUN apt-get install -y python3 python3-pip
RUN pip3 install --upgrade pip
RUN pip3 install pyknp
RUN wget https://github.com/ku-nlp/jumanpp/releases/download/v2.0.0-rc3/jumanpp-2.0.0-rc3.tar.xz 
RUN tar xvf jumanpp-2.0.0-rc3.tar.xz 
WORKDIR jumanpp-2.0.0-rc3 
RUN mkdir bld 
WORKDIR bld 
RUN cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local 
RUN make install -j 4
WORKDIR ${SRCDIR}
COPY .${SRCDIR} /root/src/

CMD [ "/bin/bash" ]
```
## docker-compose.yml
```docker-compose.yml
version: '3'
services:
    jumanpp:
        image: jumanpp
        container_name: jumanpp
        command:
            - /bin/bash
        build:
            context: .
            dockerfile: ./Dockerfile
        working_dir: /root/
        tty: true
        restart: always
        env_file:
            - ./.env
        environment:
            - LANG=${LANG}
            - LANGUAGE=${LANGUAGE}
            - LC_ALL=${LC_ALL}
            - TZ=${TZ}
            - TERM=${TERM}
```
## 最後に
誰かが詰まった時の助けになれば幸いです。
Media of Langueプロジェクトでも私が代表をしているEngineeでもエンジニアを探しています。
torch2trt, torch_tensorrt の速度比較

どれが速いのか。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7549bc69-cb1d-1ddd-a4ef-a26ecfe9787f.png width=200>

**torch2trt**
はPyTorchからTensorRTへのコンバーター。NVidiaがリリースしている。

https://github.com/NVIDIA-AI-IOT/torch2trt?tab=readme-ov-file

**torch_tensorrt**
はtorchモデルをtensorrtにコンパイルできるライブラリ。torchがリリースしている。

両方tensorrtを使って高速化する。
どちらも簡単に使える。さて、速いのはどちらか。

# 結論

**１、torch2trt、torch_tensorrtはtorchと比べて5倍以上速い。torchscriptよりも速い。
２、torch2trt、torch_tensorrtどちらが速いかはモデルによる。大差はない。
３、torch_tensorrtでしか変換できないモデルもある。VisionTransformerなど。**

以上から、
**僕はtorch_tensorrtを使います。**

【EfficientNet】
||sec|
|---|---|
|torch| 0.01614|
|torchscript| 0.00689|
|**tensorrt**|0.00164|
|**torch_tensorrt**| 0.00200|

【Resnet】
||sec|
|---|---|
|torch| 0.01101|
|torchscript| 0.00646|
|**tensorrt**|0.00165|
|**torch_tensorrt**|0.00112|

# torch2trt

### インストール

```shell
pip install tensorrt
git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
python setup.py install
```

### 変換

```python
import torch
from torch2trt import torch2trt
from torchvision import models
# create some regular pytorch model...
weights = models.ResNet50_Weights.IMAGENET1K_V1

model = models.resnet50(weights=weights).eval().cuda()

# create example data
x = torch.ones((1, 3, 224, 224)).cuda()

# convert to TensorRT feeding sample data as input
model_trt = torch2trt(model, [x])
```

### 推論

```python
with torch.no_grad():
  y_trt = model_trt(x)
```

# torch_tensorrt

### インストール

```shell
pip install torch-tensorrt
```

### 変換

```python
import torch_tensorrt
model_torch_trt = torch.compile(model, backend="tensorrt")
with torch.no_grad():
  y_torch_trt = model_torch_trt(x) # dry run
```

### 推論

```python
with torch.no_grad():
  y_torch_trt = model_torch_trt(x)
```

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
AWK（gawk）でシンプルな自作言語のコンパイラを書いた（移転済み）

引っ越しました。

[https://zenn.dev/sonota88/articles/e108476b2fb75d](https://zenn.dev/sonota88/articles/e108476b2fb75d)

https://zenn.dev/sonota88/articles/e108476b2fb75d
C#でExcelファイルを作る

# C#でExcelファイルを作る
業務でExcel出力を実装する機会がありそうなので、先に試しておこうと思って調べた。
C#からExcelファイルを作る記事は結構あったので、2シート出力してみた。

## 環境
- VisualStudio2022
- .NET Framework4.7.2

```C#
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace ExcelSample
{
	  class ExcelControl
    {
        // 2シートのExcelを新規作成する
        public void CreateExcel()
        {
            Excel.Application excelApp = default;
            Excel.Workbooks workbooks = default;
            Excel.Workbook workbook = default;


            try
            {
                excelApp = new Excel.Application();
                workbooks = excelApp.Workbooks;
                workbook = workbooks.Add();

                // MEMO:1つ目のシートは自動で作られる
                workbook.Sheets[1].Select(Type.Missing);

                // 1シート目
                Excel.Range range = workbook.Sheets[1].Cells;
                Excel.Range cell = range[1, 1];
                try
                {
                    cell.Value2 = "テスト１";
                }
                finally
                {
                    Marshal.ReleaseComObject(range);
                    Marshal.ReleaseComObject(cell);
                }

                // 2シート目
                workbook.Sheets.Add(After: workbook.Sheets[workbook.Sheets.Count]);
                Excel.Range range2 = workbook.Sheets[2].Cells;
                Excel.Range cell2 = range2[1, 1];
                try
                {
                    cell2.Value2 = "テスト２";
                }
                finally
                {
                    Marshal.ReleaseComObject(range2);
                    Marshal.ReleaseComObject(cell2);
                }

                // ファイルの保存
                workbook.SaveAs(@"D:ExcelSampleOutput\sample.xlsx");
                workbook.Close();
                excelApp.Quit();
            }
            finally
            {
				// 必ず解放する
                Marshal.ReleaseComObject(workbook);
                Marshal.ReleaseComObject(workbooks);
                Marshal.ReleaseComObject(excelApp);
            }
        }
    }
}
```

思ったよりも簡潔に書けそうだけど、プロパティも多くあったので調べておいた方がいいのかなぁ。
オブジェクトの解放は忘れずに！


参考
- https://hironimo.com/prog/c-sharp/c-excel-book/
- https://qiita.com/hakuaneko/items/332cf7dd9fcd70ccc052#comments
- https://stackoverflow.com/questions/12156302/excel-interop-add-a-new-worksheet-after-all-of-the-others
Laravel + React + TypeScript

# はじめに

今回はTypeScirptベースのLaravel + React環境の作成方法をまとめたいと思います。

# Laravel + React + TypeScript 環境設定

## Laravel のセットアップ

```terminal:terminal
composer create-project laravel/laravel laravel_react_project
cd laravel_react_project
```

## 必要なモジュールのインストール

```terminal:terminal
npm i
npm i -D typescript \
    react @types/react \
    react-dom @types/react-dom \
    @vitejs/plugin-react \
    sass
npx tsc --init --jsx react-jsx
```

## Vite の設定

```terminal:terminal
mv vite.config.js vite.config.ts
```

```ts:vite.config.ts
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react';

export default defineConfig({
    plugins: [
        react(),
        laravel({
            input: ['resources/scss/app.scss', 'resources/ts/index.tsx'],
            refresh: true,
        }),
    ],
});
```

## resources 以下の設定

```terminal:terminal
rm -rf resources/css resources/js resources/views/welcome.blade.php
mkdir resources/scss resources/ts
touch resources/scss/app.scss resources/ts/index.tsx \
    resources/views/index.blade.php
```

```tsx:resources/ts/index.tsx
import { createRoot } from 'react-dom/client';

const container = document.getElementById('app');
const root = createRoot(container!);

root.render(
    <div className="red">
        Laravel + React + TypeScript
    </div>
);
```

```scss:resources/scss/app.scss
.red {
    color: red;
}
```

```php:index.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel Vite</title>
        @viteReactRefresh
        @vite(["resources/scss/app.scss", "resources/ts/index.tsx"])
    </head>
    <body>
        <div id="app"></div>
    </body>
</html>
```

## route の設定

```php:routes/web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/{any}', function () {
    return view('index');
})->where('any', '.*');
```

## 起動テスト

```terminal:terminal
npm run dev
```

```terminal:terminal
php artisan serve
```

`http://localhost:8000/` にアクセスすると以下のような画面が表示されれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65508/a6cf5092-f0fd-11db-397d-053c8be2f2a9.png)


# まとめ

今回は簡単に Laravel + React + TypeScript の環境を作成する方法をまとめました。この上にAPIのなどを生やして実際のSPAサイトなどを作成してみてください。
GASでDriveにファイル作成できない

# はじめに
こんにちは、ユーゴです。今回は、久しぶりにGASについて紹介します。
GASのコードをChatGPTに書かせたのですが、そのときに遭遇したエラーについて紹介します。

# 課題
GASでドライブにスプシを作成しようとした。

```js
Drive.File.insert(file,blob)
```

このとき、以下のエラーが出る

```
TypeError: Drive.File.insert is not a function.
```

# 解決
Drive.File.insertは、(おそらく)廃止されました。
新しく以下のメソッドを使用してください。

```js
Drive.File.create(file,blob)
```

参考：[App Script 拡張ドライブサービス](https://developers.google.com/apps-script/advanced/drive?hl=ja)

# まとめ
いかがだったでしょうか。今回は、GASのエラーと修正を紹介しました。本件ではネットで調べてもすぐに出てこなかったので、リファレンスを直接見に行きました。余談ですが、最近は量子コンピュータにハマっており、論文やqiskitのリファレンスを足軽く見に行く癖がつきました。

このように、GASのエラーと対処方法から、Unity, AWS, 量子コンピュータなど様々なトピックを紹介していきます。
お役に立てましたら、いいね, フォローなどよろしくお願いします！
[Ruby]代表的な例外クラスとその説明を洗い出してみた

Rubyに定義されている例外クラスを調べてみました。

## Exception
https://docs.ruby-lang.org/ja/latest/class/Exception.html

- 全ての例外の祖先のクラス

## StandardError
https://docs.ruby-lang.org/ja/latest/class/StandardError.html

```
継承リスト
StandardError < Exception 
```
- 通常のプログラムで発生する可能性の高い例外クラスを束ねるためのクラス
- StandardError とそのサブクラスは、 rescue 節でクラスを省略したときにも捕捉できる

### 主なStandardErrorのサブクラス
#### ArgumentError
https://docs.ruby-lang.org/ja/latest/class/ArgumentError.html

- 引数の数があっていないときや、数は合っていて、期待される振る舞いを持ってはいるが、期待される値ではないときに発生

```
Time.at       # => wrong number of arguments (given 0, expected 1..2) (ArgumentError)
Array.new(-1) # => negative array size (ArgumentError)
```

#### NameError
https://docs.ruby-lang.org/ja/latest/class/NameError.html

- 未定義のローカル変数や定数を使用したときに発生

```
bar
# => NameError: undefined local variable or method `bar' for main:Object
```

##### NoMethodError(NameErrorのサブクラス)
https://docs.ruby-lang.org/ja/latest/class/NoMethodError.html

- 定義されていないメソッドの呼び出しが行われたときに発生

```
self.bar
# => -:1: undefined method `bar' for #<Object:0x401a6c40> (NoMethodError)
```


#### IndexError
https://docs.ruby-lang.org/ja/latest/class/IndexError.html

- 添字が範囲外のときに発生

#### RangeError
https://docs.ruby-lang.org/ja/latest/class/RangeError.html

```
1000000.chr
```
#### RuntimeError
https://docs.ruby-lang.org/ja/latest/class/RuntimeError.html

- 特定の例外クラスには該当しないエラーが起こったときに発生
- また Kernel.#raise で例外クラスを指定しなかった場合も RuntimeError が発生


#### SystemCallError
https://docs.ruby-lang.org/ja/latest/class/SystemCallError.html

https://docs.ruby-lang.org/ja/latest/class/Errno=3a=3aEXXX.html

- Ruby の実装に用いられているシステムコールまたは一部の C 言語関数が失敗した時に発生する例外
- システムコールの失敗した原因を表すエラーコードを保持する
- 多くの場合、実際には SystemCallError そのものではなくサブクラスである Errno::EXXX (XXX はエラーコードの値によって異なる。システム定義のエラー名と同じ名前) が発生する

``` ruby
# Errno::EACCES 許可されていない操作を試みたときに発生
begin
  File.open("/root/secret_file.txt")
rescue Errno::EACCES => e
  puts "Error: #{e.message}"
end

# Errno::ENOENT 指定されたファイルやディレクトリが存在しないときに発生
begin
  File.open("non_existent_file.txt")
rescue Errno::ENOENT => e
  puts "Error: #{e.message}"
end
```

#### TypeError
https://docs.ruby-lang.org/ja/latest/class/TypeError.html

- メソッドの引数に期待される型ではないオブジェクトや、期待される振る舞いを持たないオブジェクトが渡された時に発生


#### ZeroDivisionError
https://docs.ruby-lang.org/ja/latest/class/ZeroDivisionError.html

整数に対して整数の 0 で除算を行ったときに発生

## NoMemoryError
https://docs.ruby-lang.org/ja/latest/class/NoMemoryError.html

- メモリの確保に失敗すると発生

## ScriptError
https://docs.ruby-lang.org/ja/latest/class/ScriptError.html

- スクリプトのエラーを表す例外

### LoadError(ScriptErrorサブクラス)
https://chatgpt.com/c/0fe0c998-fb7a-4492-9f99-136ec64d2c66

- require または load メソッドでファイルの読み込みに失敗したときに発生

### SyntaxError(ScriptErrorサブクラス)
https://docs.ruby-lang.org/ja/latest/class/SyntaxError.html

- ソースコードに文法エラーがあったときに発生

## SecurityError
https://docs.ruby-lang.org/ja/latest/class/SecurityError.html

セキュリティ上の問題が起きたときに発生

## SystemExit
https://docs.ruby-lang.org/ja/latest/class/SystemExit.html

- Ruby インタプリタを終了させるときに発生
- exit メソッドが呼び出されたときに発生します。このエラーはプログラムの終了を示す

## SignalException
https://docs.ruby-lang.org/ja/latest/class/SignalException.html

- 捕捉していないシグナルを受け取ったときに発生
robloxでassistant その139

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
pluginで、scriptを消して、scriptを作れ。

# サンプルコード
```

local PluginBar = plugin:CreateToolbar("creator")
local Button1 = PluginBar:CreateButton("creator", "Create new script", "rbxassetid://4458901886", "Create")

Button1.Click:Connect(function()
	if game:GetService("ReplicatedFirst"):FindFirstChild("helloscript") then
		game.ReplicatedFirst.helloscript:Destroy();
	end
	local helloScript = Instance.new("LocalScript")
	helloScript.Name = "helloscript"
	helloScript.Parent = game.ReplicatedFirst
	helloScript.Source = "print(\"hello\")"
	print("ok")
end)


```

以上。
VerifyのWriteup

### [Verify](https://play.picoctf.org/practice/challenge/450)

zipファイルが提供されるのでダウンロードして解凍すると

checksum.txt、decrypt.sh、files

の3つが入っている

checksum.txtが与えられているのでfiles内のファイルのハッシュ値が一致するファイルを探してみる

```bash
$ sha256sum files/* | grep -f checksum.txt 

467a10447deb3d4e17634cacc2a68ba6c2bb62a6637dad9145ea673bf0be5e02  files/c6c8b911
```

これがアタリのファイルらしい。

ちなみにfilesの中身を見てみると明らかに1ファイルだけ毛色の違うファイルがあるがこれがfiles/c6c8b911

なので適当にファイルを見てもアタリはつけられる

```bash
$ cat files/*

qFWOwLhiimnyYn6COcXm5MmMZ2V3prEFP2rYyoIeeFRPoyoBqSVktgjGr9Invmk
Azku3NqB8gPGqCUbEveMHdoEZzxly7ZADayBSPBZ4YcDo7TBHZ4xokpeD8WKHx6
2NmUMzI9JSDcP2XevS6CsIZeMMuAlmxEll29H6ZU4OUQRVGqCGDtPshgvh7c75G
nYEYyvBCt3hNGemj19hnhrSjdguZoFJncium0oEwx95Vu9MRpP2Y4WfzlOu91zP
（中略）
Salted__05.Q+P&pE?B{M:eWma4Wual5yU!NAViSCr9iVgyscowZ5avaSOOzfThOsgiVz8Vtjcs8jOcPsRCifFnQ3LKD77f8aRsW
（中略）
FiPLb6VwSpmeFSuBpFgyZqpYmlrtsmyro2R59TpAUEoSITAuLMb5Xpy8xYNT2MY
md12cCWKpxrP4BAUxUhEkacIOvpLu2lUxScPv6lebtCm0rDxQ9OBuldF32l6XPl
H5FA4lwmaLHpFwvGqHZ5pHVDjWBiMTiznPA7x6SSw8FwyVtXcRL1D6hwsYOwlkN
```

上記ファイルをdecrypt.shに掛けてみるがエラーになってしまうので

opensslで直接復号してみるとフラグが手にはいる

---
## sha256sumについて

sha256sumは、ファイルの整合性を確認するためのコマンドラインツール

主な特徴と用途は以下：
- ハッシュ値の計算:
SHA-256アルゴリズムを使用して、ファイルの内容に基づいて256ビット（64文字の16進数）のハッシュ値を生成する

- ファイルの検証:
ダウンロードしたファイルが破損していないか、または改ざんされていないかを確認するのに使用される
    - 使用方法:
        - ファイルのハッシュ値を計算する場合: sha256sum filename
        - 複数のファイルを検証する場合: sha256sum -c checksumfile

- セキュリティ:
SHA-256は現在のところ安全とされており、衝突耐性が高い


- 他のバリエーション:
同様のコマンドにmd5sumやsha1sumがあるが、sha256sumはより安全なアルゴリズムを使用している

- 参考:
    - https://manpages.ubuntu.com/manpages/lunar/ja/man1/sha256sum.1.html
    - https://hana-shin.hatenablog.com/entry/2022/01/04/221001
tagメソッドを使ってビューのコードを簡潔にする方法

Railsのviewテンプレートで条件分岐が多くなると、コードが複雑になりがちです。ここでは、ユーザーのステータスごとに「テキストと色」を変更するコードを例に、tagメソッドを使用してシンプルにする方法を紹介します。

## 従来のコード
以下は、ユーザーのステータスに応じて異なるスタイルのバッジを表示する従来のコードです。

```
- case user.status 
- when "approved"
  span.badge.badge-outline-success.badge-lg = "Approved"
- when "denied"
  span.badge.badge-outline-danger.badge-lg = "Denied"
- when "pending"
  span.badge.badge-outline-info.badge-lg = "Pending"
- when "partial_denial"
  span.badge.badge-outline-warning.badge-lg = "Partial Denial"
- when "unauthorized"
  span.badge.badge-outline-dark.badge-lg = "Unauthorized"
- when "standby"
  span.badge.badge-outline-dark.badge-lg = "Standby"
- when "test"
  span.badge.badge-outline-secondary.badge-lg = "Test"
  ```

viewにこれだけの条件分岐を書と可読性も低下します。

単純にステータスのテキストを変更するだけであれば、enumメソッドで対応できます。しかし、デザインを変更する際にはHTMLのクラス名を変える必要があります。

そこでtagメソッドを使用することでシンプルにコードを記述することができます。


  ## 実装手順
  まず、app/helpers/application_helper.rbファイルに以下のメソッドを追加します。

```
module ApplicationHelper
  def status_badge(user_status)
    case user_status
    when "approved"
      'span.badge.badge-outline-success.badge-lg Approved'.html_safe
    when "denied"
      'span.badge.badge-outline-danger.badge-lg Denied'.html_safe
    when "pending"
      'span.badge.badge-outline-info.badge-lg Pending'.html_safe
    when "partial_denial"
      'span.badge.badge-outline-warning.badge-lg Partial Denial'.html_safe
    when "unauthorized"
      'span.badge.badge-outline-dark.badge-lg Unauthorized'.html_safe
    when "standby"
      'span.badge.badge-outline-dark.badge-lg Standby'.html_safe
    when "test"
      'span.badge.badge-outline-secondary.badge-lg Test'.html_safe
    else
      'span.badge.badge-outline-secondary.badge-lg Unknown Status'.html_safe
    end
  end
end
```

次に、SLIM形式のviewでこのヘルパーメソッドを使用します。例えば、app/views/users/show.html.slimファイルでユーザーのステータスを表示する場合は、以下のように記述します。

```
= status_badge(user.status)
```

## まとめ
Railsのviewテンプレートでの条件分岐を簡素化するには、tagメソッドを使うと便利です。ステータスごとに異なるバッジを表示する際、tagメソッドを使用してコードをシンプルかつ保守しやすくしましょう。
プロジェクト運営・設計から運用まで学ぶための個人開発に挑戦！～設計～

## はじめに
　この記事は、以下の記事の続編です。まだ読んでいない方は、ぜひ先にこちらの記事をご覧ください。
 
[プロジェクト運営・設計から運用まで学ぶための個人開発に挑戦！ ～企画～](https://qiita.com/CatLogic_Blue/items/0f3048af85afb117828c)

この記事では、前回の内容を引き継ぎ、設計のまとめを記載します。

#### 今回の目標
　前回の内容でいくつかの目標を掲げました。
 
 　 [前の記事を読む](https://qiita.com/CatLogic_Blue/items/0f3048af85afb117828c)

　今回の目標（フェーズ）は、
 「   ①とりあえず、小さく素早く作成　
　→第一ステップで、企画・設計、開発をがんばるフェーズ」

　今回は技術にこだわらず、とりあえず作ることに重きを置きました。
  上記の目標から、今回の開発では、迅速に開発を進めることを重視したため、設計書にこだわらずに進めました。
  
## 設計
#### 技術選定
　・WordPress
　・サクラのレンタルサーバー

 　技術選定の理由は、前回の記事にて記載しております。こちらの記事をご覧ください。

   　 [前の記事を読む](https://qiita.com/CatLogic_Blue/items/0f3048af85afb117828c)
     
  
#### 今回作成したいシステム
　①TOPページ
　②着物についてのＱ＆Ａページ
　③着物作家さん紹介ページ
　④おすすめのお店ページ
　⑤記事（プログ）

#### 画面遷移もどき
　トップページから、各ページへ遷移する。
 　簡単な遷移方法にしました。
  
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646863/6b9fecce-93df-ac7c-142e-b82f94d008e0.png)

#### ワイヤーフレームの作成
　書籍で、WEBデザインを考える際にワイヤーフレームというものを作成する必要があることを学びました。

##### ワイヤーフレームとは
　最低限、ページに含める「画像」、「コピー」、「見出し」、「本文」などいの情報をまとめるもの。

##### ルール
　　・色使いはグレースケールで
　　・テキストの大部分はダミーで
　　・画像は「このくらい」というエリア指定

##### 制作ツール
　Figmaでワイヤーフレームを制作してみました。

【トップページ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646863/50daa566-3f93-be6c-af67-3aaee5434446.png)

【トップページ２】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646863/2a2698a3-aaa7-3793-34f3-b6820270f835.png)

【着物作家さん紹介ページ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646863/0c6fc970-b92c-fe8d-bb39-c0e1eca8d012.png)

【他の画面のデザイン】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646863/4af1add1-8105-b6c5-960b-099934dc4b4f.png)

## サーバーサイドエンジニアが挑戦するWEBサイトデザインの基礎
　正直なところ、仕事ではサーバーサイドを中心に担当してきたため、WEBサイトの画面デザインや構造については知識が不足していました。趣味やボランティア、友人の開発プロジェクトを手伝う際も、他のサイトのデザインを真似る程度で済ませていました。

そこで、今回は書籍で学んだWEBサイトデザインの基本をアウトプットしてみます。

#### 基本のWEBサイト構造
##### ヘッダー

・サイトの象徴となるロゴ
・ナビゲーションメニュー
・検索フォーム

　ヘッダーは、サイトの第一印象を決める重要な部分です。ユーザーがサイト内をスムーズに移動できるよう、ナビゲーションメニューをわかりやすく配置します。

##### サイドコンテンツ

・お知らせ
・メインコンテンツの補助情報

　サイドコンテンツには、ユーザーにとって有益な情報やサイトの更新情報を配置します。これにより、メインコンテンツを補完し、ユーザーの興味を引き続けることができます。

##### フッター

・お知らせやコピーライト情報
・アクセスマップ

　フッターには、サイト全体に関する情報や連絡先、アクセスマップを配置します。また、コピーライト情報を明記することで、サイトの著作権を保護します。

これらの基本構造を理解し、実際のWEBサイト作成に活かしていきます。

##### 重要な考え方
　導線まで意味づけされたレイアウトを作ることが大切
  ユーザに体験してほしいストーリを考えてレイアウトをしていく


## 実際設計を考えてみて
　導線までの意味づけ、ユーザに体験してほしいストーリを考えてレイアウトとありますが、実際にWEBデザイン知識が乏しい。何を作りたいのかはしっかりあるけど、これでよいのか？ということがあります。まだまだ難しいことだらけです。

 　余談ですが、私が好きなWEBデザインは、以下のサイト様です。
   目指すところは以下のサイト様のように、遊び心があるデザインのサイトを作成できるようになりたいです。

[高浜市やきものの里　かわら美術館・図書館](https://www.takahama-kawara-museum.com/)


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
　設計は以上になります。
　設計時期は5月半ば～5月末まで実施しました。
　5月半ばは少し企画を考えていた時期とかぶります。企画を考えながら、できるかを設計で考えてました。

　次回、[プロジェクト運営・設計から運用まで学ぶための個人開発に挑戦！～さくらのレンタルサーバー～](https://qiita.com/CatLogic_Blue/items/5e0584c0ba9559f9c316)

  ##### 参考文献
  [いちばんよくわかるWebデザインの基本きちんと入門](https://amzn.asia/d/04uBKJki)
g++のオプション(-I, -l)、includeの仕方

# option
I did not understand the following command, so I decided to look up the options of g++.

`g++ ソースファイル -std=c++11 -I/usr/include/python3.11 -l/usr/lib/python3.11`

## option -I
### how to use?
`-I[/path/to/header-files]`
Add search path to header files (.h) or (.hpp) when we include header files.

## option -l
### how to use?
`-l[/path/to/link-files]`
link some static library.

具体的には、"-l"オプションはリンクのときに使われるオプションで、"-l"の後に続く文字列に"lib"、後方に".a"をつけたライブラリを検索します。

# include
<> → search for files form include path. 通常は/usr/include ディレクトリにあるヘッダーファイルを検索。

" "→search for files from current directory

e.g.
`#include "matplotlib-cpp/matplotlibcpp.h"`
【groovy】Gradle+Groovyの開発環境に悩んだ話

# Groovyの開発環境について

　最近JavaのGradleプロジェクト（以降、親プロジェクト）に組み込むツール作りでGroovyのGradleプロジェクト（以降、子＠プロジェクト）を作成した。やりたいこととしては親プロジェクトのGradleタスクにこプロジェクトのタスクを組み込むことで、その機構自体はすぐにできた。ただ子プロジェクトのレビュー、およびリファクタリングをするにあたり便利なIDEが決まらず悩んでしまったのでそれについて記載する。

 # 結論何を採用したのか？

　結論IntelliJ Communityを採用した。ただ親プロジェクトではVSCodeを使用しているため、可能であればVSCodeを使用したかった。

 # なぜVSCodeが不採用だったのか？

 　結論、既存の拡張機能を使ってimport予測ができないからである。
 　分かる人は分かるが、VSCodeでEclipseやIntelliJのようなimport予測をVSCodeで実現させるには「Language Server」なるものが必要になる。VSCodeの拡張機能でGroovyの「Language Server」は存在しないのである。これを組み込んでいないプロジェクトではimport予測ができない。

　もちろん考えている人がいないわけではない。例えば、以下のリポジトリではマーケットプレイスには出していないが、VSCodeの拡張機能として使用できるよう試験的に設定ファイルが存在するようだ。どうしてもVSCodeで組み込みたい方はこちらを使用すると良い。今回は管理の都合上、子プロジェクトの開発環境からは不採用となってしまったが、拡張機能の作成には非常に労力を使うため、言語普及への多大な貢献としてここに敬意を示したい。

https://github.com/GroovyLanguageServer/groovy-language-server

またMoonshine IDEであれば上記の拡張機能が使用できるそうなので、こちらを採用するのも一つかもしれない。

https://moonshine-ide.com/

# まとめ

　Gradle+Groovyの開発環境はIntelliJを使うと良いというお話しでした。ただ私は拡張機能を全て網羅しているわけではないので、もしVSCodeの拡張機能でGradle Language Serverに該当する、もしくは代替するものがあればぜひ教えていただけるとありがたい。
Nucleo F303K8のADCのチャンネルを切り替える

# ADCのシングルモード（仮称:スキャンしないモード)

F303K8のADCは、変換結果を出力するレジスタが一つしかないです。

そのため、スキャンモードで複数チャンネルを取得する場合、各チャンネルの変換終了時に、結果をDMAとか割込でメモリに待避しないと、以前のチャンネルの結果が上書きされてしまいます。スキャンモードを使う場合はDMAか割込を使え、ということだと思います。

一方、シングルモードで一回ごとにチャンネルを切り替えてデータを取得する方法もあります。チャンネル決め撃ちシングルショットの設定はCubeMXが吐いてくれますが、どうも後からチャンネルだけ変更するHAL関数は用意されていないように見えます。

## シングルモードでサンプリングチャンネルを切り替える

電力削減とかテストの都合で、シングルモードでチャンネルだけ切り替えて再サンプリングしたいケースはあるかと思います。自分は下記の手順でチャンネルを切り替えることができました。

### ADC レギュラシーケンスレジスタ 1

![スクリーンショット 2024-07-21 13.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188685/6258130b-e506-d8b3-2c41-a91b20bf7811.png)


SQR1レジスタの一番目に、変換したいチャンネルを書きます(下記はch2の場合）。

```
  WRITE_REG(hadc->Instance->SQR1, ADC_SQR1_RK(2,1) );
```

### ADCサンプル時間レジスタを指定する。

![スクリーンショット 2024-07-21 13.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188685/b1490523-c36b-89ad-8b45-66a34c778d2d.png)


サンプル時間レジスタ"SMPRｘ"は、チャンネルの範囲によって1（1〜9）または2（10〜16）を指定します。サンプリング周期はCubeMXで指定した値を使うのがいいと思います。この値はCubeMXが生成したMX_ADC1_Init()の中で

```
sConfig.SamplingTime = ADC_SAMPLETIME_601CYCLES_5;
```

と指定されています。601.5サイクルを指定した場合は、

```
 WRITE_REG(hadc->Instance->SMPR1,ADC_SMPR1(ADC_SAMPLETIME_601CYCLES_5, 2) );
```
となります。


## 取得

以上のWRITE_REG()2行で、CubeMXが生成した初期化処理のうちチャンネルだけこっそり変更できるので、

```
// CH1
WRITE_REG(hadc->Instance->SQR1, ADC_SQR1_RK(1,1) );
WRITE_REG(hadc->Instance->SMPR1,ADC_SMPR1(ADC_SAMPLETIME_601CYCLES_5, 1) );
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,1000);
lvdt1_a = (float) HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);

// CH2
WRITE_REG(hadc->Instance->SQR1, ADC_SQR1_RK(2,1) );
WRITE_REG(hadc->Instance->SMPR1,ADC_SMPR1(ADC_SAMPLETIME_601CYCLES_5, 2) );
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,1000);
lvdt1_b = (float) HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
```

とかすると、シングルモードでチャンネルを切り替えてデータが取得できます。チャンネル10以上のサンプリング周期はSMPR2に指定しないといけないので、実際はべた書きより関数にしたほうがいいと思います。

## 補足：使っているマクロについて

SQR1用のマクロはstm32f3xx_hal_adc_ex.hで定義されていて、サンプリング時間をレジスタの指定位置に詰め込むのが役目です。
```
 #define ADC_SQR1_RK(_CHANNELNB_, _RANKNB_) ((_CHANNELNB_) << (6U * (_RANKNB_)))
```
ADC_SQR1_RKの二番目の引数は変換する数なので、今回は1で固定になります。

複数チャンネルをスキャンする場合は、SQR1のLの部分にスキャンしたい数を書いて、
SRR1~SQR4にチャンネルを書いていくことになりますが、1チャンネルだけ変換するに場合はSQR1だけで足ります。

SMPRx用のマクロもstm32f3xx_hal_adc_ex.hで定義されていて、シーケンスの順番(Rank)の位置にチャンネル番号を押し込むのが役目です。
```
#define ADC_SMPR1(_SAMPLETIME_, _CHANNELNB_) ((_SAMPLETIME_) << (3U * (_CHANNELNB_)))
```
【Laravel】CSVファイルの中身にバリデーション（maatwebsite/excel）

以前にCSVファイルをインポートする記事を書きましたが、今回はCSVファイルの中身にバリデーションチェックをかける方法について書きたいと思います。

前回のCSVファイルインポートの記事はこちらです。

https://qiita.com/programmer502/items/1c624d494392d2e37083

## やりたいこと

前回と同様に、下記のようなCSVデータをアップロードします。

```
企業名,郵便番号,住所,電話番号,代表者名,担当者名,備考
テスト02株式会社,2203456,埼玉県上尾市井戸木,090-4736-0924,佐藤,中島,テストです
```

- 備考以外はすべて必須項目
- 企業名は一意な値としたい

## Importクラスの作成

- インターフェイスにwithValidationを追加（useで読み込みを忘れずに）
- rulesメソッドでバリデーションのルールを設定
- customValidationMessagesメソッドでメッセージをカスタマイズする

以上を反映させたコードが下記です。

app/Imports/CompaniesImport.php

```php
use App\Models\Company;
use Illuminate\Validation\Rule;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithValidation;

class CompaniesImport implements ToModel, WithHeadingRow, WithValidation
{
    use Importable;

    public function model(array $row)
    {
        return new Company([
            'name' => $row['企業名'],
            'post_code' => $row['郵便番号'],
            'address' => $row['住所'],
            'tel' => $row['電話番号'],
            'ceo_name' => $row['代表者名'],
            'responsible_person_name' => $row['担当者名'],
            'note' => $row['備考'],
        ]);
    }

    public function rules(): array
    {
        return [
            '企業名' => ['required', Rule::unique('companies', 'name')],
            '郵便番号' => ['required'],
            '住所' => ['required'],
            '電話番号' => ['required'],
            '代表者名' => ['required'],
            '担当者名' => ['required'],
        ];
    }

    public function customValidationMessages(): array
    {
        return [
            '企業名.required' => '企業名は必須項目です。',
            '企業名.unique' => 'すでに登録されている企業名があります。',
            '郵便番号.required' => '郵便番号は必須項目です。',
            '住所.required' => '住所は必須項目です。',
            '電話番号.required' => '電話番号は必須項目です。',
            '代表者名.required' => '代表者名は必須項目です。',
            '担当者名.required' => '担当者名は必須項目です。',
        ];
    }
}
```
## 注意点
rulesメソッドやcustomValidationMessagesメソッドのフィールド名は、CSVのヘッダー行と一致している必要があります。
例えば「企業名」の場合、
`'name' => ['required', Rule::unique('companies', 'name')],`
と書くと、うまくいきません。
modelメソッドで`$row['企業名]`とヘッダー設定しているので、それに対応するルール定義も同じ日本語のフィールド名である必要があります。

## Controllerの作成

app/Http/Controllers/CompanyController.php
```php
    public function import(ImportCsvRequest $request)
    {
        $file = $request->file('file');
        try {
            Excel::import(new CompaniesImport, $file);
            return redirect()
                ->route('company.index')
                ->with('message', 'データが正常にインポートされました');
        } catch (\Exception $ex) {
            return redirect()
                ->route('company.create')
                ->with('error', 'データのインポート中にエラーが発生しました: ' . $ex->getMessage());
        }
    }
```

前回と違うところは、try,catchでエラーハンドリングを追加しました。
これでエラーメッセージも表示されるようになりました。

以上、誰かの参考になれば幸いです。
DB設計におけるテーブルごとの個性

# はじめに
DB設計をする時にどのような粒度でテーブルを作っていけばいいかわからなかった時、先輩から教えてもらったことがとても役に立ったので共有します。なお、超シンプルにまとめてますので詳細は各自でお願いします🙇

# 全体のDB設計
**リストデータ（親）** のテーブルと、**詳細データ（子）** のテーブルがある。
例えば「雑学を極めるための練習問題」のようなアプリがあるとした場合、

・リストテーブル（親）...　雑学を学ぶためのレッスン一覧を格納する「レッスン一覧テーブル」
・詳細データ（子）...　レッスン単体ごとに内包されたタスク一覧を格納する「タスク一覧テーブル」

というような親子関係でテーブル構成を作る、という概念です。
これは雑学を極めるためのアプリなのでレッスンが用意されており、その中にレッスンをクリアするためのタスク（例えば勉強時間を1時間以上など）が内包されているイメージです。タスクをクリアすることでレッスンもクリアしたと判定される仕様ですね。

# テーブルの分け方
テーブルを分ける時の目安として **マスターデータ（固定）** と**変動データ（動的）** があります。
さっきのレッスンテーブルを例に考えてみます。

・マスターデータ（固定）... これは先程の「レッスン一覧テーブル」にあたります
・変動データ（動的）... これはレッスンの進捗状況を管理するため「レッスン進捗管理テーブル」のような動的に変化する値を扱うテーブルを指します。


「レッスン進捗管理テーブル」はレッスン一覧から、どれだけのレッスンをクリアしているかを表すため、変動データとなります。
つまり、**作成後にテーブル内のカラム（フィールド）の値が変わるものを扱う場合はマスターデータを扱うテーブルと分離すると良いでしょう**

# 終わりに
ありがとうございました。走り書きした記事なので修正、補足等指摘していただけると助かります🙇
画像の類似度を高速計算 imagehash

画像の類似度を計算します。

```python
from PIL import Image
import imagehash
import time

hash = imagehash.average_hash(Image.open('man1.jpg'),hash_size=16)
otherhash = imagehash.average_hash(Image.open('man2.jpg'),hash_size=16)
print(hash - otherhash)  # hamming distance
```
>>51

例えば、
この基準画像と
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/064636b7-9a19-d930-f94e-b1d26eaff86d.jpeg width=400>
この画像では、
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/17299435-a1c8-76c2-4d2f-0b7a9d0b5511.jpeg width=400>
**hash値の差が51です。**

基準画像と
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/064636b7-9a19-d930-f94e-b1d26eaff86d.jpeg width=400>
この画像では、
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/539e006e-c720-d3c6-dd0b-5e5da12b9ae9.jpeg width=400>
**hash値の差が56です。**

類似度が高いほど、差が小さくなります。

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)