OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでReactの開発環境を構築する

# はじめに
試行錯誤したため、備忘録がわりに。
DockerでReact×TypeScriptの開発環境を構築します。

# 手順

## 手順１
任意のディレクトリにDockerfile と compose.yml を作成します。

■Dockerfile
```Dockerfile
FROM node:lts
WORKDIR /usr/src/app
```

■compose.yml
```yml
services:
  app:
    container_name: app
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
    - type: bind
      source: ./app
      target: /usr/src/app
    #"react-app"の部分がプロジェクト名になる
    command: sh -c "cd react-sample && yarn start" 
    ports:
      - 3000:3000
    stdin_open: true #標準入力をコンテナと紐付ける
```

## 手順２
volumesでsourceに指定したディレクトリを作成します。
```bash
mkdir app
```

この時点でのディレクトリはこんな感じ
```text
.
├── Dockerfile
├── app
└── compose.yml
```

## 手順３
Dockerイメージをbuildします。
```bash
docker compose build
```

## 手順４
コンテナを起動し、reactプロジェクトを作成します。
```bash
docker compose run --rm app sh -c 'npx create-react-app react-sample --template typescript'
```

■上記のコマンドを実行した結果
```bash
[+] Creating 1/0
 ✔ Network docker-react-practice_default  Created            0.0s 
Need to install the following packages:
create-react-app@5.0.1
Ok to proceed? (y) y

npm warn deprecated uid-number@0.0.6: This package is no longer supported.
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.

(中略)

We suggest that you begin by typing:

  cd react-sample
  npm start

Happy hacking!
npm notice
npm notice New minor version of npm available! 10.7.0 -> 10.8.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.8.2
npm notice To update run: npm install -g npm@10.8.2
npm notice
```

## 手順５
もう一度コンテナを起動します。
```bash
docker compose up -d
```

localhostに接続するとReactが起動していることを確認できます。
![スクリーンショット 2024-08-12 1.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457523/48aff681-3032-47b1-f605-78ab1665ac00.png)


# おわりに
数ヶ月後の自分のために書きましたが、誰か一人でも参考になれば幸いです。
UnityPhysicsとColliderに関する注意点

## StaticオブジェクトにRaycastがヒットしない

ECSでJobのスクリプトを書いているときにraycastを使いたい場面は沢山あると思いますが、MonoBehaviorで使っていたRaycastALLとかは残念ながら使えないので、CastRayを使うことになります。
※詳しくは、以下ページの「7. Queries/Query - Custom Collector.unity」を参照
https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/PhysicsSamples/README.md

しかしながら、CastRayを使ってもヒットしなくて直近ハマったので、備忘録として残します。

結論から言うと、原因はColliderがアタッチされていることでした。
以下のようにBoxColliderがついていると、なぜかそのEntityにはCastRayが反応しない。
※しかも非アクティブ状態なのに...！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715582/84e4651f-f181-db7a-e336-6395fcfded21.png)

~~とにかくECSを扱うとき、不要なColliderは全て除去しましょう。非アクティブ状態でもね。~~
2024/12/14
原因は、Colliderがついていると、Collider有無でEntityにLocaltransformのCompornentが付与されるかどうかが、変わってしまうためでした。
例えば通常PhysicsShapeがついていると、Localtransformも付与されますが、
BoxCollider（非アクティブ状態）が付与されていると、アクティブ状態のPhysicsShapeが付与されていても、LocaltransformがEntityにつきません。

恐らく今後のUnityのアップデートで修正されると思いますが、ひとまず要注意です。
備忘録: C言語の前置インクリメントと後置インクリメントについて

# インクリメントで実験
C言語のインクリメントについて、知らない部分があったので残しておく。

以下のコードをコンパイルして実行する
```c
#include <stdio.h>

int sum(int a, int b) {
	return a + b;
}

int main() {
	int a = 1;
	int b = 2;
	printf("sum: %d\n", sum(a++, b));
	printf("a: %d\n", a);
}
```

すると、出力は以下のようになる。
```
sum: 3
a: 2
```

表面上は、引数として、int型を渡す際に、インクリメントして渡すと、関数の処理が終わったあとに、インクリメントされているように見える。

次に、以下のコードをコンパイルして実行する。
```c
#include <stdio.h>

int sum(int a, int b) {
	return a + b;
}

int main() {
	int a = 1;
	int b = 2;
	printf("sum: %d\n", sum(++a, b));
	printf("a: %d\n", a);
}
```
実行結果は、以下のようになる。

```
sum: 4
a: 2
```
これも、表面上は`++a`のようにすることで、インクリメントが行われてから、引数として渡されているように見える。

# 前置インクリメントと、後置インクリメント
前項の実験の結果は以下のような仕様によってもたらされる。
```c
int a = 1;
int b = a++; // a+1 (すなわち 2) を a に格納し、
             // 以前の a の値 (すなわち 1) を返します。
             // この行の後、 b == 1、 a == 2 になります。
a = 1;
int c = ++a; // a+1 (すなわち 2) を a に格納し、
             // 新しい a の値 (すなわち 2) を返します。
             // この行の後、 c == 2、 a == 2 になります。
```

[cppreference](https://ja.cppreference.com/w/c/language/operator_incdec)より引用


つまり、直感的に想像していた処理とは異なり、関数の呼び出し前後の順序が問題となっているわけではない。

`++x`といった書き方を前置インクリメントと呼び、`x++`といった書き方を後置インクリメントと呼ぶ。

恥ずかしながら、両者の違いをあまり意識しておらず、バグを生んでいたため、備忘録として残しておく。

# 参考文献
インクリメント/デクリメント演算子, cppreference.com, https://ja.cppreference.com/w/c/language/operator_incdec
フェードインをCSSのみで実装する

## フェードインをCSSのみで実装する

CSSのみでフェードインなどのアニメーションを実装できる機能があると知ったので試してみました。

サンプルコード
```html:fade-in.html
  <body>
    <div id="animation">
      <p>フェードイン</p>
    </div>
  </body>
```

```css:fade-in.css
#animation {
  animation: fade-in 3s;
  animation-fill-mode: forwards;
}
@keyframes fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

```

## cssについて解説
今回はid = animationにアニメーションを付けていきました。
使っているcssについて説明していきます。

`animation`
アニメーションのキーフレームを示す @keyframes アットルールの名前を指定し、変化にかかる時間も指定しました。
animationで多くの設定をまとめて指定できるようです。

`animation-fill-mode`
アニメーションの実行前後に、指定したスタイルを適用するかを設定します。
今回はforwardsとなっているのでアニメーション再生後は、最後のキーフレーム（to）のスタイルが適用されます。(animation-delayプロパティを指定している場合、再生までの時間は元のスタイルが適用されます。)

### キーフレームについて
キーフレームとは、アニメーションの始点と終点を指定して、その間を編集する作業のことです。
CSSでは`@keyframes`を使用します。
fromでアニメーション前の状態、toでアニメーション後の状態を表します。
ここでは、opacity: 0; とすることで、最初は見えなく、toでopacity: 1;を指定することで、完全に見えるようになります。




参考にした記事

https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_animations/Using_CSS_animations

https://coco-factory.jp/ugokuweb/css02/
<progress>タグを用いたシークバーの書き方

# TL;DR
備忘録。<progress>タグを用いて進捗を表現するのは楽

# Introduction

<progress> タグはタスクの進捗状況を表すためのHTMLタグです。[<progress>: 進捗インジケーター要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/progress)

たとえば数ページに渡るフォームなどでの入力進捗を出したり、ファイルなどがアップロード中であることを表示したり、いろいろな進捗に関わる目的に利用できるタグだと思います。
そういった多様な目的のなかで例えば任意のポイントの進捗を得たい場合があるのではないかと思います。端的にはメディアのプレイバックの位置をシークしたりとか、一連のプロセスの任意の場所に再度移動したい場合があると思います。
そういった目的を`<progress>`タグを用いたクリック＆ドラッグで操作できるような実装を備忘録として乗せたいと思います。
ReactやVueでの書き方とかは追記しますが一旦Vanillaで書いておきます

## `<progress>`タグ

Progressはタグのみで`value`属性がないと単純にプロセス中であることを示すUIとなり、値があることで進捗を表現することができます

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

このUIはブラウザのスタイルシートによって表現されているので、`reset.css`やTailwindなどデフォルトで余計なCSSを剥がすようなライブラリなどを利用していると思ったようなUIにならないので注意しましょう

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

まあ、むしろProgressをそのままのUIで使うケースのほうが少ないと思いますが。

## ドラッグしてみる

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="QWXqmKE" data-pen-title="Progress Tag - example 3" data-user="kenjiwilkins" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kenjiwilkins/pen/QWXqmKE">
  Progress Tag - example 3</a> by kenjiwilkins (<a href="https://codepen.io/kenjiwilkins">@kenjiwilkins</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# Conclusion

Progressタグを使わずに`<div>`の`width`を更新したりよりはるかに楽に実装できると思います。

## 追記 

- mouse, touch両方に対応できるように[PointerEvent - Web API | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events)を使うように例を修正しました。
QAエンジニアは社内の開発者から発掘するのも選択肢の一つ

## 1. はじめに
QAエンジニアは採用が難しいという話がありますが、開発者からQAエンジニアへスイッチした筆者の経験でいうと社内の開発者から発掘するのも選択肢の一つと思います。

## 2. 筆者の例
筆者はもともとは組込み系のプログラマでしたがQA部門に異動する前はアプリ設計部門に所属して設計支援やQA業務を担当していました。その一部を以下に挙げます。

- 設計やテストのよろず相談
- 設計やテストに使用する機材の選定、調達
- テストツールの設計、実装とそれを用いたテストの自動化
- 品質メトリクスの設計、収集、収集の自動化
- 法令対応

その後QA部門の打診があり設計部門へ置いていった業務もありますが次のような理由で異動しました。

- 担当していた業務を組込み系などほかの機種へ展開しやすくなる
- QAの知識やスキルが活かせる

これまでいくつかの部署を経て要件定義、仕様設計、実装、テスト、試作立ち合い、量産立ち合い、リリース後の市場対応など経験したのがQA業務に役立っています。

また、顧客に限らず非顧客への価値提供でもある法令対応は社内の事務局の偉い人に相談したり業界団体のセミナーに参加したりもして顧客価値だけでなく社会的価値もQAのスコープのうちという認識を持つようになりました。

## 3. 開発者から発掘するメリット
筆者が考える開発者から発掘するメリットを以下に挙げます。

### 3.1 ドメインや事業と親和性がある
開発者はたんにソフトウェアを作れるだけでなく、（部外者と比べて）開発しているプロダクトや事業のことをよく知っています。ドメイン知識でいえばその分野に固有の用語といったものもあれば市場や顧客のこともよくわかっています。

### 3.2 ものづくりのプロセスを把握している
QAエンジニアの業務の一つにプロセス規程の改善があり規程に則った開発経験は役立ちます。実装に限らず上流から下流まで、リリース後の市場対応含めなるべく広い経験があるとなお良いです。

また、社内用語だったり新しいツールを導入するならいつごろまでに来期の予算に積んでおくといった社内ルールを把握しているのもメリットです。

### 3.3 さまざまな部門のメンバーを知っている
開発者は同僚の開発者だけでなく、企画、テスト、ハードウェアのエンジニア、生技、品証、品技、営業、カスタマサポートなどさまざまなメンバーを知っています。また、開発環境やテスト環境の構築に情シス部門が関われば情シスメンバーも、法令対応で法務部門が関われば法務メンバーも知り合いになります。

QAエンジニアはさまざまな部門に横串を通して回ったりするためさまざまな部門のメンバーと知り合いなのは有利です。

## 4. QA部門に必要なこと
筆者が考えるQA部門に必要なことを以下に挙げます。

### 4.1 QA部門を知ってもらう
一言でいうと開発者からQAにスイッチしたくなる魅力が必要です。

QAエンジニアはさまざまな部門のメンバーと協働する機会が多いですがそういう場に参加する開発者がリーダーばかりだと担当レベルの開発者からQAの活動が見えないおそれがあります。また、QAの業務は裏方仕事なところがあって放っておくと目立たないです。そこで意識的に露出するようにします。例えば新たに開発した品質技術を社内の技術発表会でアピールするのは良いアイデアです。

### 4.2 マッチング
QAエンジニアを社内の開発者から発掘するといってもQA部門と開発者・設計部門の双方にメリットがないと成り立ちません。設計部門にとって開発者は貴重なリソースであり設計部門からQA部門へ異動すると組織全体にとってメリットが大きくなることを示す必要があるかもしれません。

### 4.3 QAエンジニアに必要な教育、サポート体制
固有技術のエンジニアとしてプロダクトを作る業務から管理技術のエンジニアとしてプロダクトづくりの仕組みを作る業務に変わります。開発経験が大いに役立つとはいえQAエンジニアとして身につけるべき知識やスキルはたくさんあります。

読み物の例を以下に挙げます。

- [第一世代のQAエンジニア（拙著）](https://techbookfest.org/product/9rxL2BNsWTXAFYBdK18m0G)
- [本日から、品質部門配属になりました（超ISO企業研究会・メルマガバックナンバー）](https://www.tqm9000.com/news/category/%e3%83%a1%e3%83%ab%e3%83%9e%e3%82%ac%e2%91%a8%e3%80%80%e6%9c%ac%e6%97%a5%e3%81%8b%e3%82%89%e3%80%81%e5%93%81%e8%b3%aa%e9%83%a8%e9%96%80%e9%85%8d%e5%b1%9e%e3%81%ab%e3%81%aa%e3%82%8a%e3%81%be%e3%81%97/)

## 5. おわりに
設計部門の中でプロダクトを担当していると部門外、担当外のプロダクトの業務はなかなかやりづらいものですが、QA部門へ異動して設計部門の外に出たことで設計部門のどこの課にも出入りしやすくなりQAサービスを提供しやすくなりました。また、インプロセスQAからスプリットQA+αに守備範囲が広がったことでQAエンジニアとしてのスキルも上がったように思います。

あくまでも筆者の例、n=1の話ですが、設計支援やQA的な業務をしている開発者がいれば話を振ってみるとよいかもしれません。

QAエンジニアを社内の開発者から発掘するのはうまくはまると開発者、設計部門、QA部門、組織全体のそれぞれにメリットとなり選択肢の一つに加えると良いと思います。
【Shell】grepでファイル名も表示する方法

`grep`の結果にファイル名を表示するには`-H`オプションを使用します。

```terminal
$ cat sample.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff

$ grep -H aaa sample.txt
sample.txt:aaa

```
Laravel10でページネーションの実装＆カスタマイズ

:::note
laravelにはデフォルトでページネーションを簡単に実装する機能が備わっています。
ページネーション機能を自作するのは大変なので予め用意されている機能を使って実装していきます。
:::

### データの取得
まずコントローラでデータを取得する処理に`paginate()` を追加するだけでページネーション機能を使うことが出来ます。

```UserController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;

class UserController extends Controller
{
    /**
     * アプリケーションのすべてのユーザーを表示
     */
    public function index(): View
    {
        return view('user.index', [
            'users' => DB::table('users')->paginate(15)
        ]);
    }
}
```

`paginate()`の括弧内に、1ページに表示したいアイテムの数を指定できます。

### bladeにページネートした結果を表示
コントローラで`paginate()`を使用しただけでは、まだページネーションを表示できません。view側でもコードを追記します。

```user.blade.php
<div class="container">
    @foreach ($users as $user)
        {{ $user->name }}
    @endforeach
</div>

{{ $users->links() }}
```

`{{ $users->links() }}`
のように`@foreach`で展開する前の変数を指定し、使います。

### スタイルのカスタマイズ
今のままでもページネーション機能は使えますが、アプリケーションによってデザインをかえたい場合もあります。

その場合は、`vendor:publish`コマンドを使用してresources/views/vendorディレクトリにコピーしてカスタマイズしていきます。

``` 
php artisan vendor:publish --tag=laravel-pagination
```
コマンドを実行するとresources/views/vendorディレクトリに予め用意されているテンプレートファイルが7つ程コピーされます。

tailwind用、bootstrap用、シンプルな奴などいろんなテンプレートがありますが、自分のプロジェクトに合うテンプレートを使います。

使わないテンプレートは消してOKです。

今回は、tailwind用のテンプレートファイルの`tailwind.blade.php`を`user.blade.php`にリネームして使います。

### カスタマイズしたテンプレートを呼び出す
スタイルをカスタマイズしたら、最後にbladeファイルの`{{ $users->links() }}`にカスタマイズしたファイルを指定して完成です。

呼び出し方はシンプルに、引数に指定すれば指定したテンプレートファイルを読み込んでくれます。

```
{{ $users->links('pagination::user') }}
```

### 参考記事
https://readouble.com/laravel/10.x/ja/pagination.html
【Swift】guard文の使い方

最近Swiftを触り始めてから、guard文というものを見るようになりました。
私がこれまで触れてきた言語（pythonやJavaScriptなど）では見かけない文法だったので、自分用の備忘録として、どんな処理を行う文法なのか記載します。

# guard文とは？
guard文とは、「条件不成立時に早期退出を行うための条件分岐文」です。

guard文は、条件式がfalseを返す場合にのみ { } 内の分を実行し、条件式がtrueを返す場合は { } 内の文の実行をスキップします。 
逆に言うと、条件式がfalseである場合に { } 内の処理を実行します。

{ } 内の文では、guard文が記述されているスコープの外に退出する処理を記載する必要があります。

### 基本的な使用方法

```
guard 条件式 else {
    条件式がfalseの場合に実行される文

    //guard文の記述されているスコープ外に退出する処理
    return xxxx
}
```

### 処理例
例として、String型の引数nameがTaroでなければ、NameIsTaro関数から退出する処理を記載してみます。

```
func NameIsTaro(name: String) {
    guard name === "Taro" else {
        print("彼の名前は\(name)です。Taroではありません。")
        return
    }

    // 彼の名前はTaroであることが保証される。
    print("彼の名前は\(Taro)です。")
}

NameIsTaro("Jiro")
// 結果
彼の名前はJiroです。Taroではありません。

NameIsTaro("Taro")
// 結果
彼の名前はTaroです。
```

上記のように、nameがJiroである場合にはelse内の処理を実行しスコープの処理外に退出します。対して、nameがTaroである場合にはelse内の処理をスキップし、後続処理が実行されることとなります。

## まとめ
guard文はif文と同様に条件分岐文ですが、条件式がfalseの場合にelse内の処理が実行される構文と理解しました。

まだまだguard文には慣れていないのでif文を多用してしまっているのですが、今後はguard文も使用していきます。

また、今回は記載していませんが、guard-let文の構文理解もまだまだできていないので、こちらについても引き続き学習を進めていきます。
AtCoder 勉強記録[C++] その59

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
本日はAtCoder Beginner Contest 369に参加した。しばらくコンテストに参加できていなかったが集中して取り組むことができ、C問題まで解くことができた。また、勉強した尺取り法を使用してコーディングできたので勉強の成果を感じた。
## A - 369
[A - 369](https://atcoder.jp/contests/abc369/tasks/abc369_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll a, b;
  cin >> a >> b;
  ll res = 0;
  for(int i = -1000; i <= 1000; i++){
    if(b-a==i-b) res++;
    else if(i-b==a-i) res++;
    else if(a-i==b-a) res++;
  }
  cout << res << endl;
}
```
### 解法
`1<=A,B<=100`であるため、-1000から1000までの整数iを考える。`A`、`B`、`i`の3種類の並び方において、問題の条件が成り立つかを確認する。
## B - Piano 3
[B - Piano 3](https://atcoder.jp/contests/abc369/tasks/abc369_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vector<ll> a(n);
  vector<char> s(n);
  rep(i, n) cin >> a[i] >> s[i];
  ll le = 0, ri = 0;
  ll res = 0;
  rep(i, n) if(s[i] == 'L') {
    le = a[i];
    break;
  }
  rep(i, n) if(s[i] == 'R') {
    ri = a[i];
    break;
  }
  for(int i = 0; i < n; i++){
    if(s[i] == 'L') {
      res += abs(le - a[i]);
      le = a[i];
    } else if(s[i] == 'R'){
      res += abs(ri - a[i]);
      ri = a[i];
    }
  }
  cout << res << endl;
}
```
### 解法
右手と左手の位置を記憶しておく変数`ri`、`le`を用意する。両手の初めの位置を記録しておく。初めの位置からどれだけ動いたかを`res`に加算していき、現在の位置を更新する。
## C - Count Arithmetic Subarrays
[C - Count Arithmetic Subarrays](https://atcoder.jp/contests/abc369/tasks/abc369_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vector<ll> a(n);
  rep(i, n) cin >> a[i];
  vector<ll> dif(n-1);
  for(int i = 0; i < n-1; i++){
    dif[i] = a[i+1] - a[i];
  }
  ll res = n;
  ll ri = 0;
  for(int le = 0; le < n-1; le++){
    ll cnt = 1;
    while(ri < n-1){
      if(dif[le] == dif[ri]) {
        res+=cnt;
        cnt++;
        ri++;
      }else {
        break;
      }
    }
    if(ri==le) ri++;
  }
  cout << res << endl;
}
```
### 解法
`A[i+1]-A[i]`を記憶しておく配列`dif`を用意する。`r,l`が同値の場合は必ず等差数列になるため、答えにあらかじめ`N`を加算しておく。その後、尺取り法を用いてdifの要素の0から`N-1`までの間で`dif[i+1]=dif[i]`となる場合をカウントする。カウントした値を毎回答えに加算することで結果が求まる。
初めてのインターンシップで学習したこと、反省

お疲れ様です。Steveです。過去の投稿から一カ月以上投稿が空いてしまいました
この期間に、豊かなエンジニアとしての経験をすることができたと思います。
・本を数冊を読破
・初めてのフルリモートインターンを獲得
・出社型インターンに参加
これからは、
・（英語の勉強）
・サポーターズのイベントへの積極的な参加
・毎日atcoder(過去問)
をやりたいと思っています。

その中でも、出社型インターンでは、実際の業務に参加してエンジニアたちの生のコードを見ることが出来ただけでなく、エンジニアとして会社にいなければ知ることが出来ない、タスクの工程、チーム開発のイロハを知ることが出来ました。

今回は、この自分自身初めてとなる出社型インターンの経験を、備忘録形式で残していきたいと思います

仙台市内でのインターン業務

今回、自分は仙台のIT企業で業務に当たりました。
（業務のくわしい内容は守秘義務があるため言えません）

自分が担当したのは、某有名企業の社内WEBアプリケーションの開発でした
(マジで誰でも知っている超有名企業でした、こんな大きな企業の開発に携われたのは誇りだったりします笑）

その中でも自分が担当したのは、一言で言うと　テスト　です
テストといってもいろんなテストがあるんですね、不勉強を自覚する限りです汗
（E2Eテスト、UNITテスト、結合テスト・・・・・）
この中でも、自分自身が担当させていただいたのは、単体テスト・ホワイトボックステストの実装とその設計書の作成です。

環境

言語:TypeScript 
フレームワーク：Angular

それぞれ、画面のコンポーネントに対して、機能的に働くserviceが用意されておりそれに対するテストを記述するのが僕のメインの業務でした

流れとしては、先輩たちが機能や関数、バックエンド的なところを作りあげ（バックエンドではないけどね）それらを機能設計書としてまとめる。

それを、Excel形式でまとめ上げ、テストを記述する人が読みやすいテスト設計書に変換

そのテスト設計書をもとに、テストを実装

自分はこのうち、テスト設計書の作成と、テストの実装をさせて頂きました。

ありがたいことに、一つの画面を丸々任せていただき、同じ画面のテスト設計書を作り、自分で作った設計書をもとにさらに自分で実装するといった流れでした。

そのため、テストの流れを体系的に知ることが出来たと感じています。

その時同時に、名著：webを支える技術を読んでいた段階であったこともあり、APIのマスタデータの知識も、同時に吸収することが出来ました。

ただ、反省としては、
・最初、何もわからない時に自分で調べようとしすぎていた。
・他人が読みやすいコードを書けていなかった

特に二つ目は、チーム開発をしている上で改善しないといけない反省点でしょう。
特に、ネストの位置、変数名の統一性、は後から振替えたときに大きな反省点だったと残っています。

これらの経験は、次に繋げるものですね
101日後に自主開発をリリースするウニ

# 1日目

とりあえず、何をつくるか考えた。

関心のある領域でアイデアを出す。
メモアプリ(workflowy)の過去のメモを見てアイデアをメモっていないか探す。以外と無かった。

・服の組み合わせを提案するアプリ（自分の持っている服から思わぬいい感じの組み合わせを見つける）
・ランダムにポエムを読むアプリ（読み上げつき）



# 2日目

chat gpt に聞いて、既存のgithubレポジトリで公開されていないか探す。

>服のコーディネートを提案するようなアプリはgithub上に存在しますか？

>Yes, there are several GitHub repositories that feature clothing coordination and outfit recommendation apps. Here are a few examples:

>    Fashion AI Recommendation System: This app uses deep learning to provide personalized outfit recommendations. It allows users to upload images of clothing items, detects the items using object detection, and recommends outfits based on weather, season, and occasion​(GitHub
    ).

 >   Outfit Recommendation App: This app provides personalized outfit suggestions based on user-uploaded clothing photos. It uses algorithms to analyze style, body measurements, and preferences​(GitHub
    ).

>    Fashion Recommender System: This app recommends similar items from an inventory based on user-uploaded images. It uses a deep learning model to generate image embeddings and applies K-Nearest Neighbor to find similar fashion items​(GitHub
    ).

>    Outfit Recommendation Project: This local app recommends daily outfits (tops, bottoms, and shoes) based on the user's stored wardrobe. It categorizes clothes by type, color, season, and usage, and generates recommendations accordingly​(GitHub
    ).

>    Virtualrobe: This app suggests outfits from the user's wardrobe using AI. It includes a virtual wardrobe, closet management system, and features like trending outfits and in-app messaging​(GitHub
    ).

>These projects offer a range of features, from basic random outfit suggestions to more advanced AI-driven personalization. You can explore these repositories on GitHub to find the one that best suits your needs.

結構ある。自主開発やってる人たち。服好きそうな感じだと、プロフィールを見て思った。

virtual robe
https://github.com/Seunkola/Virtualrobe

Outfir recommendator
https://github.com/KefanPing/Outfit_Recommendation_Project

Fashion recommendator
https://github.com/harsh1399/Fashion-Recommender-System


# 3日目

Vue.jsの練習がてらアプリを作る。

ランダムに画像を組み合わせて表示させるアプリをつくりたい。

割とあっさりできた。

フロントエンドだけ。

tops,bottoms,shoesの画像をランダムに組み合わせて表示させる。



# 4日目

バックエンドの練習
djangoの勉強をする。

まずざっくり作る→教材的なのをやる
のプロセス。

まずざっくりやる、のフェーズ。

poemのapiをchatgptに聞きつつざっくり作った。
natureや、animalなどタグ付けしたポエムを呼び出すのが割とあっさりできた。

# 5日目

ざっくりやったので知識をつける。
Meta社が出してる、API講座をやるとめっちゃわかった。
djangoを材料にしてAPIを学ぶという講座。

serializerとかいう概念を理解するなどした。


# 100日後

まだまだ先は長い。つづく。
#てくぴ YOUはどうしてエンジニアに!? 参加しました！

## イベント参加の経緯
https://connpass.com/event/325074/

Xを眺めていたらイベント案内がアップされていたため、間髪入れず参加申し込みしました。
LT登壇者は未経験スタートの方が多く、様々な動機が聞けそうで当日までワクワクでした。

## イベント内容
### 元新米警官が気づいたらCTOに転生していた

ノンキャリアスタート

- 警察学校時代は、軍隊生活
大卒６ヶ月
高卒１０ヶ月

その後、交番へ配属
- 仕事自体はやりがいがあり楽しかった
しかし仮眠時間が４時間もなく、通報があると仮眠なし。
次の日の夕方まで勤務すること・短期間睡眠が耐えられず、２年後退職。

退職後は米国サンディエゴに２ヶ月短期留学。
- 留学経験を活かすべく、英語 x ITというキーワードにひかれSES会社入社
留学経験はあまり活かせず、シェルスクリプト１００連発やインフラ関連を経験。

### 大学在学中に早期入社した人の話

エンジニアになったきっかけは、人事異動

- 在学中に早期入社(もちろん、正社員です)
２年生で就職支援課に内定報告をして、職員が混乱していた。

情報システム部セキュリティ対策課のCSIRTを担当

- 入社１日目に全社員を騙す（フィッシングメール）送信業務につく
その後、ITイノベーション課につきエンジニアになる。

- 大学はどうしたのか
出社後の空き時間を利用して大学の講義を受けて、また会社に戻り業務再開。
多忙にもかかわらず留年なく、無事卒業しました。

```
特に何が起こるかわからない人生ですが、積極的に何か行動すれば結果が出る
```

### PC9821 V13との出会い
エンジニアになったきっかけ
- 好きより、深く知ったから

PC9821 V13を愛用
- 根っからの引きこもりの私
- PCの高速化やダイヤルアップ接続でインターネット閲覧
高速化のために、レジストリの編集方法を覚えた

### 未経験＆３０歳正社員歴なしから正社員エンジニアになるまで

プログラミング実務は未経験
- 学歴：高卒
３０歳まで正社員経験なし
当時は派遣社員　コールセンター業務

エレキギターサイトの閲覧が趣味
- ギターの様々な音色をネットで聞けたら便利なのに・・・
だったら自分で作るしかない

嫁が職業訓練校でWEBサイト制作の勉強をしていた

- クリックしたら音が出る高度な機能は作れなかった
行けたら行くわーみたいなノリ

- JavaScriptを使って、１日で作ることができた

http://xn--yckccv7m2a3p.jp/

ほしい体験は作れる！

プログラミングたのしー
これを仕事にするしかない

- ドットインストールで勉強

コールセンター退職
- ３０歳実務未経験の採用は厳しい
- ５０社から落選
御祈りメールばかり
俺は神か
活躍を祈るなら御社が雇えよ！

なんとか時給１０００円のHTMLエンジニアコーダーへ

- 無限残業編、開始！
その会社で頑張って、正社員登用成功！

### ゲーム制作やWEBエンジアなど多々経験された方の話

一部抜粋（集中しすぎて、メモあまり取れませんでした...）

```
いわゆるエンジニアのキャリアパスでなくても生きていける
疑問や興味が沸いたところには突破口がある
与えられた環境や状況でベストを尽くそう
未開の土地、新雪、青い海に乗り出そう
エンジニアを目指すなら、まずは「コード・システム」を作って世界を変えましょう！
```

### ガチニートからエンジニアになるまで
理由：消去法

ガチニート
- 家に居づらいので外に出る
お金ないけど時間はあるので、街を徘徊

クレジット不正検知のコールセンター業務

- 同僚で気になる女性が現れ、お付き合い打診するも
「派遣はちょっと・・・」

高収入な転職先はこの２つだった
- 不動産系飛び込み営業
頑張り次第で１年めでも年収１５００万円

- ITエンジニア
未経験でも研修があるので大丈夫

ぶっちゃけ両方ヤバい　笑

SESに入社。生き延びるのに必死
- 情シス　契約や予算管理を学ぶ　＝＞　やや調整・管理が疲れた　＝＞　AWSと出会った
- その後転職し、良い仲間と出会う　＝＞　管理職やって悩む

これまでを振り返って
- 直近２、３年が一番楽しく、モチベーションが高い
- たとえ立派な動機がなくても、それはそれで良いのかなと
やっているうちに、良い仲間に出会えたり、面白いことが見つかり、楽しくなった

皆様が、自分だけのストーリーを思い切って楽しんでください！
その後、気になった女性とゴールインしました♪

## あとがき

エンジニアになるまでの経緯やプロセスが参考になりました。
限られた時間でしたが全員が素晴らしく、かっこよかったです。
私自身もエンジニアになって、このような場で登壇できるように頑張ります！
プロジェクトリーダーをやる上でのポイント

いくつかのプロジェクト（以降PJ）のリーダー（以降PL）をやってみて大事だなと思ったことを書いてみる。

## 前提
個人の感想です。
職場環境やPJ規模や人に依っても違うし、そもそも間違ったことを書いている可能性もなくはない。
心に刺さる内容があればくらいに。
小規模PJのPLしかやったことがないので、大規模PJのPLの大事なこととは違うかも。

## PLとは
PJをゴールに導く（リードする）役割の人。
PJのゴールは何かというと、依頼主の目的達成のために作る成果物である。
PJ成功の指標としては、QCD（品質・コスト・納期）がある。

## PLのお仕事
PJをゴールさせるには、ゴールとタスクが明確になっている必要がある。
タスクには不確実性（できるかどうかわからない）がないことが重要。
現実は最初の計画で不確実性がゼロになることはないでしょうが・・・

PLのお仕事は以下になります。
- ゴールを明確にする
- ゴールするためのタスクを明確にする
- ゴールするためのスケジュールを明確にする
- ゴールするための体制を明確にする
- 不確実なことを明確化していく
- 計画（ゴール、タスク、スケジュール、体制）を作り、関係者の合意を取り付ける
- 決まったことをメンバー（自分含めて）に実行してもらう

## PLをやる上でのポイント

- ゴールを正しく定義する
- ゴールまでの段取りを正しく定義する
- ゴールが変わらない（増えたりしない）ように管理する
- メンバーは何のために入ってもらうのか考えてアサインする
- 途中のメンバー変更を極力しない（コミュニケーションコストがかかる）
- 知見者をがっつりアサインできなくても、相談メンバーとして計画に入れておく
- タスクの実現性を確認しておく（実現性確認フェーズをとる/リスクとしてバッファを積む）
- 実現性確認したときの実装は整理して置いておく
- 毎日状況を確認する
- いろんな状況になる可能性を想像し進め方を考えておく
- 自PJ外の状況も把握しておく（影響することが多い）
- PJが完了するまで気を抜かない（タスクが１個でも残っているとPJは終わらない）
- PJの成功に責任を持つモチベーションを持つ

こんな感じかな。
Salesforce 認定Platformアプリケーションビルダー 受験レポート

## 1. 受験の経緯
Salesforceアプリケーションの開発プロジェクトに参画するにあたって知識の習得のため受験しました。
元々はSalesforceの利用や開発経験はありませんでしたが、今年の6月から自社内の業務効率化のため小規模なアプリケーションの開発をはじめているところです。

## 2. 学習方法
### ①Trailhead 
[【Salesforce公式】認定 Platform アプリケーションビルダー資格 対策
](https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/prepare-for-your-salesforce-platform-app-builder "Trailhead")

　Playgroundという学習用の開発環境を使って実際のSalesforce上で学習を進めることができます。
　各モジュール(学習テーマ)では与えられたユースケースに対してPlayground上でソリューションを学習する流れになっています。
　実際の画面を使って学習できるため効率良く知識の定着ができると思います。
 　一通り学習して4～5日程度かかりました。

### ②過去問 
[【Salesforce 認定Platformアプリケーションビルダー】試験対策 215問（TysonBlog）
](https://tysonblog-whitelabel.com/category/salesforce/salesforce-appbuilder "TysonBlog")
　おすすめしている合格者の方が多かったのでこちらを選択しました。
　設問についての解説とすべての選択肢についての説明があって理解し易かったです。
　学習時間の都合で1～70問までしかできませんでしたが、
　実際の試験の出題形式、出題内容と似ていたためやっておいて良かったです。
　
## 3. 試験結果

　受験日　：2024年8月31日(土)
　所要時間：55分（105分）
　結果　　：合格

| セクション  | 正答率 |
|:-----------|:------------:|
| Salesforce Fundamentals（Salesforce の基本）| 71%        |
| Data Modeling and Management（データモデリングおよび管理）| 69%        |
| Business Logic and Process Automation（ビジネスロジックとプロセスの自動化）| 82%        |
| User Interface（ユーザインターフェース）| 70%        |
| App Deployment（アプリケーションのリリース）| 83%        |

## 4. まとめ
試験対策の時間が十分に確保できなかったためとても不安な状態での受験となりましたが、
事前に小規模アプリケーションを開発していたこともあって試験には十分対応することができました。

試験の内容を振り返ると学習方法としてはTrailheadと過去問で十分だと思いますが、
過去問は数をこなせば正答率の向上につながると思います。
試験時間も設問数に対しては十分に設定されていて焦ることはありませんでした。

次回は近々Platform デベロッパーを受験しようと思います。
Next.js  ReferenceError: window is not definedというエラーが出てハッカソン最終日前日の深夜に泣きそうになった件

## 解決策　

とりあえず**全てのコンポーネントをnext式の「ダイナミックインポート」する（❷が正しい）**

❶BAD
```test.tsx
import Meeting from "@/features/meeting/Meeting";
```
❷OK
```test.tsx
import dynamic from "next/dynamic";
const Meeting = dynamic(() => import("@/features/meeting/Meeting"));
```




## next式のダイナミックインポートとは
サーバーでコンポーネントを実行させないようにする、という意味かなと思います（ドキュメントしっかり読んでないので微妙ですが）
自分はサーバーで動作しない記述をコンポーネント内でかなり書いていたようで、デプロイ時（ビルド時）にエラーが出ていました。

ハッカソン中はみなさん時間ないと思うので、next.js利用時に「ReferenceError: window is not defined」エラーが出たらとりあえずダイナミックインポートすると解決するかもです。

もしハッカソン中に遭遇したら片っ端からインポート文をGPTに投げて「ダイナミックインポートして」とお願いしましょう。

## このエラーの意味
windowオブジェクトへの接触はサーバーではできない、というものだと思います。
（DOMはサーバーにないので当然）

ただ自分はwindowオブジェクト触ってないんだよな〜という感じで焦ったのですが、サーバーで動作しないものがあると同様にこのエラーが出るみたいです。
（Next.js難しい😭）
本来、Next.jsのssrを最大限活かすため、全てダイナミックインポートするのはご法度なのでハッカソンオンリーの対処法でした
【Python3エンジニア認定基礎試験】14. 対話入力編集と履歴置換

はじめに
---
Pythonインタプリタでは、KornシェルやGNU Bashシェルのように、入力行の編集や履歴置換が可能です。
これらの機能はGNU Readlineライブラリを使って実装されています。

14.1. タブ補完と履歴編集
---
インタプリタ起動時に自動的にタブ補完が有効になります。
Tabキーを押すと、変数名やモジュール名の補完が行われます。ドットで区切られた式についても、適切なオブジェクト属性が補完されます。
履歴はデフォルトでユーザーディレクトリの `.python_history` ファイルに保存され、次回のセッションでも利用可能です。

14.2. 対話的インタープリタの代替
---
IPythonやbpythonなど、より高度なインタラクティブ環境があります。
これらはタブ補完、オブジェクト探索、先進的な履歴管理など、標準のPythonインタプリタを超える機能を提供します。

※13は出題率0%のため無し
【Python3エンジニア認定基礎試験】12. 仮想環境とパッケージ

12.1 はじめに
---
Pythonアプリケーションは、特定のバージョンのライブラリやモジュールを必要とすることがあります。
たとえば、アプリケーションAがバージョン1.0、アプリケーションBがバージョン2.0を要求する場合、同じPython環境では両者の依存関係が衝突します。
これを解決するために仮想環境を使い、各アプリケーションに独自のPython環境を設定することで、それぞれ異なるバージョンのモジュールを利用できるようにします。

12.2 仮想環境の作成
---
仮想環境はvenvモジュールを使用して作成します。具体的な手順は以下の通りです：

任意のディレクトリで仮想環境を作成するには、次のコマンドを実行します：

```
python -m venv tutorial-env
```
これにより、tutorial-envというディレクトリが作成され、その中にPythonインタプリタと関連ファイルが配置されます。

仮想環境を有効化
---

Windowsの場合：
```
tutorial-env\Scripts\activate
```

UnixまたはMac OSの場合：
```
source tutorial-env/bin/activate
```
有効化すると、シェルのプロンプトに仮想環境の名前が表示され、
その仮想環境内のPythonが利用されるようになります。

仮想環境を無効化するには、`deactivate`コマンドを実行します：

```
deactivate
```

12.3 pipを使ったパッケージ管理
---
pipは、Pythonのパッケージ管理ツールで、以下の操作を行えます：

パッケージのインストール: パッケージをインストールするには、以下のコマンドを使用します：
```
python -m pip install パッケージ名
```
例：novasというパッケージをインストールするには：

```
python -m pip install novas
```
特定のバージョンをインストール: 特定のバージョンのパッケージをインストールする場合、次のようにバージョン番号を指定します：

```
python -m pip install requests==2.6.0
```
パッケージのアップグレード: パッケージを最新バージョンにアップグレードするには、以下のコマンドを使用します：

```
python -m pip install --upgrade requests
```
パッケージのアンインストール: パッケージを削除するには、以下のコマンドを使用します：

```
python -m pip uninstall パッケージ名
```
インストール済みパッケージの一覧表示: 現在の仮想環境にインストールされている全てのパッケージを表示するには、次のコマンドを使用します：

```
python -m pip list
```
requirements.txtの作成: インストールされたパッケージの一覧をrequirements.txtファイルに保存して、他の環境で再現できるようにします：

```
python -m pip freeze > requirements.txt
```
このファイルを使って、他のユーザーが同じ環境をセットアップする際は、次のコマンドを使用します：

```
python -m pip install -r requirements.txt
```
このようにして、pipを使ってパッケージのインストール、管理、そして共有を簡単に行うことができます。

https://qiita.com/FT_log/items/8869a4e71484d821ec74
ERB を使う場合は filename と lineno を指定するとデバッグで便利

ERB オブジェクトには `filename` と `lineno` という attribute がある。

https://gist.github.com/tomoasleep/068ad35e91567acdb5515ade870bca37

これに設定した値はエラー時の Stack Trace で表示される。

```console
$ ruby run_erb_with_error.rb
run_erb_with_error.rb:6:in `<main>': undefined local variable or method `unknown_variable' for main (NameError)
        from ~/.anyenv/envs/rbenv/versions/3.3.1/lib/ruby/3.3.0/erb.rb:429:in `eval'
        from ~/.anyenv/envs/rbenv/versions/3.3.1/lib/ruby/3.3.0/erb.rb:429:in `result'
        from ~/.anyenv/envs/rbenv/versions/3.3.1/lib/ruby/3.3.0/erb.rb:414:in `run'
        from run_erb_with_error.rb:12:in `<main>'
```

別ファイルの ERB を参照する場合はそのファイル名を、インラインで ERB を記述する場合は、 `__FILE__`, `__LINE__` を活用して設定しておくと便利。

## References

* https://www.rubydoc.info/stdlib/erb/ERB
  * ※ [るりま](https://docs.ruby-lang.org/ja/latest/class/ERB.html) には lineno などの項目がないが、 rubydoc.info 上のドキュメントには記載されている。
【Python3エンジニア認定基礎試験】11. 標準ライブラリ

出力フォーマット:
---
`reprlib`: 大きなコンテナを省略して表示するためのモジュールです。
`pprint`: データ構造を読みやすい形式で整形して表示します。
`textwrap`: テキストを指定した幅に整形します。
`locale`: ロケールに基づく数値や通貨のフォーマットを提供します。

文字列テンプレート:
---
`string.Template`: 簡単にカスタマイズ可能な文字列テンプレートを提供し、
ユーザーがアプリケーションの出力を変更できるようにします。

バイナリデータの操作:
---
`struct`: バイナリデータのパックやアンパックを行うための関数を提供します。

マルチスレッディング:
---
`threading`: プログラムの応答性を向上させるための並行タスク処理が可能です。
スレッド間の調整には queue モジュールが推奨されます。

ログ記録:
---
`logging`: 柔軟なログ記録システムを提供し、さまざまな出力先やログレベルを設定できます。

弱参照:
---
`weakref`: オブジェクトへの参照を維持しない弱参照を提供し、メモリ管理を効率化します。

リスト操作ツール:
---
`array`: コンパクトな配列を提供し、collections.deque は効率的なキュー操作を可能にします。
`bisect`: ソート済みリストの操作、heapq はヒープデータ構造をサポートします。

10進浮動小数演算:
---
`decimal`: 精度の高い10進浮動小数演算をサポートし、特に財務計算に適しています。
これらのモジュールは、高度で専門的なPythonプログラムの開発に役立ちます。

https://qiita.com/FT_log/items/f670097720dadbae8b33
東証上場銘柄の一覧を作ってみる。

# はじめに
Pythonのyfinanceで東証上場銘柄の欲しい情報をカスタマイズした一覧を作ってみる。

# 目次
+ [東証の上場銘柄一覧を取得する](#東証の上場銘柄一覧を取得する)
+ [yfinanceを使って、上場株式の一覧を作る](#yfinanceを使って上場株式の一覧を作る)
## 東証の上場銘柄一覧を取得する
東証の上場銘柄は下記から取得できる。

https://www.jpx.co.jp/markets/statistics-equities/misc/01.html

このページから一覧をエクセル形式でデータ取得できる。下記のようなデータ。
「コード」列の後ろに ```.T```を付ければシンボル名になる。上場の株式に絞りたい場合は 「市場・商品区分」で「プライム(内国株式)、スタンダード(内国株式)、グロース(内国株式)」で絞ればよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/fbc3c428-f7c4-d8f5-8f55-1491492435e8.png)



[戻る](#目次)

## yfinanceを使って、上場株式の一覧を作る
yfinanceを使えば、Yahoo! ファイナンスの株価情報を取得できる。yfinanceの使い方は下記記事にまとめる。

https://qiita.com/tapitapi/items/9459362d8aee25137647

本記事の例では、Ticker、会社名、現在価格、時価総額、配当金をリスト化した。その他、欲しい情報を追加すれば、自分専用カスタマイズでスクリーニングができる。会社によって存在しないデータがあり、KeyErrorが出ることもある。try-exceptを使ってデータがない場合は'-'を値として回避した。
数量が多いので、15分程度かかる。

パラメータ|意味
---|---
Ticker|info['underlyingSymbol']
会社名|info['shortName']
現在価格|info['currentPrice']
時価総額|info['marketCap']
配当金|info['trailingAnnualDividendRate']

```python:example.py
import yfinance as yf
import pandas as pd
from tqdm import tqdm

df = pd.read_excel('data_j.xls')

# 市場・商品区分 の下記3つを抜き出し
# ・プライム（内国株式）
# ・グロース（内国株式）
# ・スタンダード（内国株式）
df_filter = df[df['市場・商品区分'].str.contains('内国株式')]

# コードの値をとる
dic_stock={'コード':[],'会社名':[],'現在価格':[],'時価総額':[],'配当金':[]}
for code in  tqdm(df_filter['コード']):

	# コードに.Tを付ける
	code =f"{code}.T"

	#yfinanceより企業シンボル、会社名を取得する
	stock = yf.Ticker(code).info
	
	# シンボルと会社名を追加していく
	try:
		dic_stock['コード'].append(stock['underlyingSymbol']) 
	except:
		dic_stock['コード'].append('-')
	try:
		dic_stock['会社名'].append(stock['shortName'])
	except:
		dic_stock['会社名'].append('-')
	try:
		dic_stock['現在価格'].append(stock['currentPrice'])
	except:
		dic_stock['現在価格'].append('-')
	try:
		dic_stock['時価総額'].append(stock['marketCap'])
	except:
		dic_stock['時価総額'].append('-')
	try:
		dic_stock['配当金'].append(stock['trailingAnnualDividendRate'])
	except:
		dic_stock['配当金'].append('-')

#DataFrame化
df_stock = pd.DataFrame(dic_stock)

#Excel出力
df_stock.to_excel('東証株一覧.xlsx',sheet_name='株価',encoding='cp932',header=True,index=False)
```
結果を時価総額でソートすると下記のような結果になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/34a36f79-6917-5cf0-30ee-a6243d1efba8.png)



[戻る](#目次)
【Python3エンジニア認定基礎試験】10. 標準ライブラリ

10.1. OSとのインターフェース
---
`os`: ファイルやディレクトリ操作、システムコマンドの実行が可能。os.getcwd() で現在のディレクトリを取得し、os.chdir() でディレクトリを変更できます。
`shutil`: ファイルコピーやディレクトリ移動など、高水準なファイル操作が可能。

10.2. ファイルのワイルドカード表記
---
`glob`: ワイルドカードを使用して、特定のパターンに一致するファイルをリストアップできます。

10.3. コマンドライン引数
---
`sys`: sys.argv でコマンドライン引数をリストとして取得可能。
`argparse`: コマンドライン引数の解析を簡単に行える。

10.4. エラー出力とプログラムの終了
---
`sys`: sys.stderr でエラー出力、sys.exit() でプログラムを終了させることができます。

10.5. 文字列のパターンマッチング
---
`re`: 正規表現を使った高度な文字列検索や置換が可能。

10.6. 数学
---
`math`: 三角関数や対数などの数学関数を提供。
`random`: 乱数の生成やリストからの無作為な要素選択が可能。
`statistics`: 平均や分散などの統計計算をサポート。

10.7. インターネットへのアクセス
---
`urllib.request`: URLからデータを取得できます。
`smtplib`: メール送信をサポート。

10.8. 日付と時刻
---
`datetime`: 日付や時刻の操作、フォーマットが可能。

10.9. データ圧縮
---
`zlib、gzip、bz2、lzma、zipfile、tarfile`: データ圧縮やアーカイブ操作をサポート。

10.10. パフォーマンスの計測
---
`timeit`: 小さなコードの実行時間を測定し、効率を比較可能。
`profile、pstats`: 大規模なコードのパフォーマンス分析が可能。

10.11. 品質管理
---
`doctest`: Docstringに埋め込まれたテストを実行し、コードの正当性を確認可能。
`unittest`: より大規模なテストセットを管理可能。

10.12. バッテリー同梱
---
Pythonは「バッテリー同梱」の哲学に基づき、xmlrpc、email、json、csv、sqlite3、gettext、locale、codecsなど、多くの便利なを標準で提供しています。

https://qiita.com/FT_log/items/f7ecefc005e08cfca665
ABC369をPythonで（A~D）

AtCoder Beginner Contest 369 の解答等の速報的まとめ

https://atcoder.jp/contests/abc369

# A問題
https://atcoder.jp/contests/abc369/tasks/abc369_a

条件を満たす数を求めて数える
```python:A
a, b = sorted(map(int, input().split()))

s = set()
diff = b - a

s.add(a - diff)
if diff % 2 == 0:
    s.add(a + diff // 2)
s.add(b + diff)

print(len(s))
```
# B問題
https://atcoder.jp/contests/abc369/tasks/abc369_b

左右それぞれで最初に押す場所の移動コストを０として計算する
```python:B
l, r, = -1, -1
ans = 0

for _ in range(int(input())):
    a, s = input().split()
    a = int(a)
    if s == "L":
        if l == -1:
            l = a
        else:
            ans += abs(l - a)
            l = a
    else:
        if r == -1:
            r = a
        else:
            ans += abs(r - a)
            r = a

print(ans)
```
# C問題
https://atcoder.jp/contests/abc369/tasks/abc369_c

1. 差を計算する
1. 同じ値が連続する組み合わせを計算する
```python:C
n = int(input())
a = list(map(int, input().split()))

diff = [a_j - a_i for a_i, a_j in zip(a, a[1:])]

ans = 0
d = float("inf")
cnt = 0
for d_i in diff:
    if d_i == d:
        cnt += 1
    else:
        cnt = 1
        d = d_i

    ans += cnt

print(ans + n)
```
# D問題
https://atcoder.jp/contests/abc369/tasks/abc369_d

DはdpのD
倒した数の偶奇でdpを計算する
```python:D
n = int(input())
a = map(int, input().split())

INF = float("inf")
dp = [0, -INF]
for a_i in a:
    new_dp = dp.copy()
    new_dp[0] = max(new_dp[0], dp[1] + a_i * 2)
    new_dp[1] = max(new_dp[1], dp[0] + a_i)

    dp = new_dp

print(max(dp))
```
FreeCADでURDFを組み立ててエクスポートする（後編）

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) これはちょっとつらいかも

## やること

[前回のつづき](https://qiita.com/Ninagawa123/items/45f5e3ef11e419c471b4)です。
手持ちの3D素材から制御できるロボットのファイル形式であるURDFを出力するのがゴールです。

そのために、
① フリーCADソフトであるFreeCADを使えるようにします。
② FreeCADの拡張機能であるfreecad.overcrossを導入します。
③ 制御できるロボットのファイル形式であるURDFを組み立てます。
④ URDFを出力します。

上記のうち①②については、前編の記事をご参照ください。
今回は③④にチャレンジします。

## 使用環境

- Mac M1 (たぶんウィンドウズでもLinuxでもOK！)
- Freecad v0.21.2

## ③ URDFを組み立てる

どうにかしてURDFを組み立てていきます。
内容を理解してわかりやすい記事にしようと思いましたが、なかなか大変だったので取り急ぎ記事のご紹介だけしておきます。

### 海外のチュートリアルを使う

こちらが本家のチュートリアルです。

https://github.com/drfenixion/freecad.overcross/wiki

...がしかし、ヒントが少なすぎてさっぱりわかりません。

チュートリアルをよくみると下の方にロシア語の記事が貼ってありまして、そこに四輪ロボットのURDF作成についての詳細が記されています。
スクリーンショット豊富でとても丁寧な説明になっています。全部で３ページあります。

当方の手抜き記事となってしまいすみませんが、ぜひ以下のサイトを参考にテストをしてみてください。

https://vk.com/@robotforge-robotelezhka-po-shagam-chast-1-rukovodstvo-po-robotcad-pod

ところどころ操作面でわかりにくい箇所もありますが、なんとか最後まで到達できました。

ROS2の環境を求められますが、ROSやROS2をインストールしていなくてもURDFを出力できることが確認できています。


## ④ URDFを出力する

すべての準備が整ったら、モデルビューで「Robot」を選択し、その状態で右上にあるURDF出力ボタンを押します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/036c84be-2bb1-a635-e1bd-b4c35ede87d6.png" width=500>

この時、ROS2のワークスペースをダイアログボックスで聞かれますが、無視して空欄でも先進めることができます。
その後、ファイルを出力するディレクトリを問われますが、その時の指定が有効なのかどうかは、不明です。
自分の場合では指定ディレクトリは無視され、デスクトップ上に「Desktop」というフォルダが作成されました。その中にURDFやメッシュのデータが入っていました。
デスクトップにはもう一つ「overcross」というフォルダが生成されており、その中には「robot_meta.xml」が入っていました。
URDFのデータにはコリジョンやイナーシャも入っており、便利に使えそうな感じです。

## 出力したURDFをUnityにインポートしてみる

[URDF-Importer](https://qiita.com/Ninagawa123/items/b24ceee29755e09b4d73)をつかってUnityにインポートしてみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/6d0a91b7-fa7e-8370-4784-3e4b263187fc.png" width=400>

meshへのパスの書き換えなどが必要でしたが、なんとかインポートできました。
ただし、実行するとモデルが画面からパッと消えてしまったので、瞬時にどこかに吹っ飛んでいるものと思われます。パラメーターや設定については、もうすこしよくみておく必要がありそうです。

<hr>

[前回記事](https://qiita.com/Ninagawa123/items/45f5e3ef11e419c471b4
)

https://qiita.com/Ninagawa123/items/45f5e3ef11e419c471b4
自然数の交換法則の証明

# 問

$a,b$を任意の自然数とする。このとき、

```math
a + b = b + a
```

が成り立つ。

# 定義

## ペアノの公理

集合 $N$ が次の性質を満たすとき、その要素を自然数と呼び、$N$を自然数の集合と呼ぶ。

### 性質1：N は空集合でない。

$N$は特別な要素$0$を含む。

```math
0 \in N
```

```mermaid
graph LR;
    Zero((0))
```

### 性質2：鎖のように連なっている。

$N$から$N$への射 $S$が存在する。

```math
S: N \rightarrow N
```

```mermaid
graph LR;
    A((a)) --> B(("S(a)")) --> C(("S(S(a))")) --> D((…))
```

$N$の要素$a$に対し、$S(a)$を$a$の「後者」と呼ぶ。

### 性質3：鎖には端がある。

$S(a) = 0$ となるような$N$の要素$a$は存在しない。

```mermaid
graph LR;
    X((?)) -->|×| Zero((0)) --> A(("S(0)")) --> B(("S(S(0))")) --> C((…))
```


### 性質4：鎖は合流しない。

$N$の任意の要素$a,b$について、次が成り立つ。

```math
a \neq b \implies S(a) \neq S(b)
```

```mermaid
graph LR;
    E((…)) --> A((a)) --> C(("S(a)")) --> D((…))
    F((…)) --> B((b)) -->|×| C
```

### 性質5：0から始まる鎖以外に要素がない。

$N$の部分集合$E$が次の性質を満たすならば、$E = N$ である。

```math
\displaylines {
0 \in E \\
\forall a \in N, a \in E \rightarrow S(a) \in E
}
```

```mermaid
graph LR;
    Zero((0)) --> A(("S(0)")) --> B(("S(S(0))")) --> C((…))
```

※ 性質5が無いと、0から始まる鎖とは別にグー→チョキ→パー→グーのようなループを含むような集合が考えられるが、これは自然数の集合とは呼ばない。

```mermaid
graph LR
    subgraph N
        subgraph E
            Zero((0)) --> A(("S(0)")) --> B(("S(S(0))")) --> C((…))
        end

        subgraph "N - E"
            Z --> X
            X((グー)) --> Y((チョキ))
            Y --> Z((パー))
        end
    end
```

※ 以下の証明で数学的帰納法を用いる。数学的帰納法は「集合$N$の要素にまつわる命題」と「命題が真となるような$N$の要素全体を集めた部分集合」を同一視することで、実質的に性質5を利用している。

以下、自然数の集合を $\mathbb{N}$と書く。

## 自然数同士の和

自然数同士の和$+$を次のようにして再帰的に定義する。

```math
\displaylines {
\forall a \in \mathbb{N}, a + 0 = a \\
\forall a, b \in \mathbb{N}, a + S(b) = S(a + b)
}
```

# 証明

## a + 0 = 0 + a の証明

$a$ に関する数学的帰納法を用いて証明する。

### a = 0 のとき

```math
a + 0 = 0 + 0 = 0 + a
```

より成り立つ。

### a のときに成り立つと仮定

$a \in \mathbb{N}$ について交換法則 $a + 0 = 0 + a$ が成り立つと仮定する。

このとき、

```math
\displaylines {
0 + S(a) & = & S(0 + a) & \because 和の定義 \\
& = & S(a + 0) & \because 数学的帰納法の仮定 \\
& = & S(a) & \because 和の定義 \\
& = & S(a) + 0 & \because 和の定義
}
```

より $S(a)$ についても成り立つ。
数学的帰納法により、任意の $a$ について$a + 0 = 0 + a$ が成り立つ。

## a + b = b + a の証明

$b$ に関する数学的帰納法を用いて証明する。
以下、 $a \in \mathbb{N}$ を任意とする。

### b = 0 のとき

前述の通り、 $a + 0 = 0 + a$ が成り立つ。

### b のときに成り立つと仮定

$b \in \mathbb{N}$ について交換法則 $a + b = b + a$ が成り立つと仮定する。

このとき、$S(b)$についても交換法則が成り立つことを証明したい。
そのために、$a$に関する数学的帰納法を用いる。
以下で、$S(b)$は固定されている。

#### a = 0 のとき

前述の通り、 $0 + S(b) = S(b) + 0$ が成り立つ。

#### a のときに成り立つと家庭

$a \in \mathbb{N} $ について交換法則 $a + S(b) = S(b) + a$ が成り立つと仮定する。
このとき、

```math
\displaylines {
S(a) + S(b) & = & S(S(a) + b) & \because 和の定義 \\
& = & S(b + S(a)) & \because b に関する数学的帰納法の仮定 \\
& = & S(S(b + a)) & \because 和の定義 \\
& = & S(S(a + b)) & \because b に関する数学的帰納法の仮定 \\
& = & S(a + S(b)) & \because 和の定義 \\
& = & S(S(b) + a) & \because a に関する数学的帰納法の仮定 \\
& = & S(b) + S(a) & \because 和の定義
}
```

より、 $S(a)$についても成り立つ。

したがって、数学的帰納法により、任意の $a$ について $a + S(b) = S(b) + a$ が成り立つ。

つまり、 $S(b)$ についても交換法則が成り立つ。
今、 $b$について交換法則が成り立つと仮定して$S(b)$について交換法則が成り立つことを確認できた。
したがって再び数学的帰納法により、任意の$b$について交換法則が成り立つ。
$a$は任意であったから、題意は示された。
Go言語(Golang) ポインタとアドレス演算子について

### `*`（ポインタ）

- **意味**: `*`はポインタ型を示します。ポインタは、変数のメモリアドレスを指し示すための型です。
- **使い方**: 変数のポインタを取得したり、ポインタを使ってデータにアクセスしたりします。

#### 例
```go
var x int = 10
var p *int = &x // xのポインタを取得
```
ここで、`p`は`x`のメモリアドレスを持つポインタです。

### `&`（アドレス演算子）

- **意味**: `&`は変数のアドレスを取得するための演算子です。変数のメモリアドレスを返します。
- **使い方**: 変数のアドレスを取得してポインタに代入する際に使用します。

#### 例
```go
var x int = 10
var p *int = &x // xのアドレスを取得
```
ここで、`p`は`x`のアドレスを持つポインタです。

### コード内での使用

あなたのコード内での`*`と`&`の使用に関して具体的に見てみましょう。

```go
return &UserNotFound{Username: "mike"}
```
- `&UserNotFound{...}`: `UserNotFound`のインスタンスを生成し、そのポインタを返しています。この場合、`UserNotFound`のポインタを返すことで、エラーを呼び出した側でそのインスタンスにアクセスできるようにしています。

```go
func (e *UserNotFound) Error() string {
	return e.Username
}
```
- `(e *UserNotFound)`: `UserNotFound`のポインタ型を受け取るメソッドです。ポインタを使うことで、メソッド内で構造体のフィールドを変更することができ、またメモリ効率も良くなります。

### まとめ

- `*`はポインタ型を示し、ポインタを使用することでメモリアドレスにアクセスします。
- `&`は変数のアドレスを取得するために使用され、そのアドレスをポインタに格納します。
AWS Lightsailのはじめかた２～静的IPのアタッチ～

※以下の内容は[前回](https://qiita.com/powneco/items/68a7ac191e94c6e33132 "AWS Lightsailのはじめかた～インスタンスの作成とSSH接続～")の続きになります。

# やったこと
Lightsailのインスタンスに静的IPをアタッチしてみました。

# 環境
* Amazon Lightsail
* Ubuntu 22.04 LTS

# ちょっとその前にやってみた
インスタンスを停止→開始するとIPアドレスが変更されるのか試してみました。
1. 右上の「停止」ボタンをクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/acaf9d16-e950-7ff5-43e4-8b6ddb8f89b1.png)
1. インスタンスステータスが停止中になります
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/20509b0e-11e4-354d-00c9-1c12ff04a8f3.png)
1. インスタンスステータスが停止になりました
右上の「開始」ボタンをクリック
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/e45cd604-c573-c54c-42ff-db6ab2c73c39.png)
1. インスタンスステータスが開始中になります
パブリックIPv4アドレスが消えました
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/daca6bca-8ae4-744d-af66-3bd8c89241b3.png)
1. インスタンスステータスが実行中になりました
新しいパブリックIPv4アドレスが割り当てられています
※パブリックIPv6アドレスは変わらないみたいです
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/88656557-d135-f0cf-ac56-092745b0ba20.png)

# 手順
1. ネットワーキングを表示し、「静的IPをアタッチする」をクリック
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/e737d2e8-cd2b-ae20-6d5d-2d0e963f1bad.png)
1. リソース名を入力し、「作成およびアタッチ」ボタンをクリック
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/fdcb54f6-9a42-1576-bf5b-6250abf0d6b3.png)
1. 「続行する」ボタンをクリック
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/921556e7-f301-6092-62de-91b41113dbbd.png)
1. 静的IPをアタッチするとIPアドレスは変更されます
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/513d14e8-99cc-44d7-fea2-85bc9f56c818.png)


# まとめ
これでインスタンスを停止→開始しても、IPアドレスが変更されないようになりました。とっても簡単ですね。
カラムの追加、削除

## 1. カラムの追加
`$ rails g migration`でmigrationファイルを作成する。
例えば、`users`テーブルに`age`カラムを追加する場合、以下のようにコマンドを実行する。

```
$ rails g migration AddAgeToUsers age:integer
```

生成されたmigrationファイルは以下のようになる。

```ruby
class AddAgeToUsers < ActiveRecord::Migration
  def change
    add_column :users, :age, :integer
  end
end
```

データベースに反映。

```bash
$ rails db:migrate
```

## 2. カラムの削除
不要になったカラムを削除する場合も、同様にmigrationファイルを作成する。
例えば、`users`テーブルから`age`カラムを削除するには、以下のコマンドを実行する。

```bash
rails g migration RemoveAgeFromUsers age:integer
```

生成されたmigrationファイルは以下のようになる。

```ruby
class RemoveAgeFromUsers < ActiveRecord::Migration
  def change
    remove_column :users, :age, :integer
  end
end
```

カラム追加時と同様に`$ rails db:migrate`コマンドを実行して変更を反映させる。
【Laravel】ファイル拡張子のバリデーションを実装する際の注意点

# はじめに
Laravelでアップロードされたファイルの拡張子をバリデーションする`mimes`ルールに
ついて、誤った認識をしていたため忘れないよう記事にしました。

# 結論
`mimes`ルールは拡張子をみているわけではなくファイルの内容を読み取って取得したMIMEタイプをみているため注意が必要。

(ドキュメントをしっかり確認するべきでした。。)
>ファイルは、リストする拡張子のいずれかに対応するMIMEタイプを持っていることをバリデートします。


# 実験
.txtファイルを許可するバリデーションに、SQLが書かれた`hoge.sql`をアップロードして`$validator->errors()->first('file')`にエラーメッセージが入っているか確認します。

```php:TestRequest.php
class TestRequest extends FormRequest
{
    public function rules()
    {
        return [
            'file' => [
                'mimes:txt',
            ],
        ];
    }
    
    public function after(): array
    {
        return [
            function (Validator $validator) {
                dd($validator->errors()->first('file'));
            }
        ];
    }
}
```

```sql:hoge.sql
SELECT * FROM users;
```

# 結果
バリデーションエラーにならず通った。
`$validator->errors()->first('file')`は空でした。

# どうしてバリデーションエラーにならずに通ったのか
ドキュメントに理由が記載されていました。

>拡張子を指定するだけでもよいのですが、このルールは実際には、ファイルの内容を読み取ってそのMIMEタイプを推測することにより、ファイルのMIMEタイプをバリデーションします。
このバリデーションルールは、MIMEタイプとユーザーがファイルに割り当てた拡張子との一致をバリデートするものではありません。例えば、mimes:pngバリデーションルールは、ファイル名がphoto.txtであっても、有効なPNGコンテンツを含むファイルを有効なPNG画像とみなします。

このことから.txtファイルをアップロードしたとしても、中身が空ならMIMEタイプは`null`となり、`'mimes:txt'`ルールに弾かれてバリデーションエラーとなります。

https://readouble.com/laravel/11.x/ja/validation.html#rule-mimes

# ファイルの拡張子でバリデーションするには？
`extensions`ルールを使用します。
>ユーザーがファイルへ割り当てた拡張子をバリデートしたい場合は、extensionsルールを使用してください。

今回の場合はこのようにすると、ファイルの内容を読み取って取得したMIMEタイプと
拡張子が.txtのファイルのみを許可することになり、`hoge.sql`を通さなくなります。
```php:TestRequest.php
'file' => [
    'mimes:txt',
    'extensions:txt',
],
```
注意点として`extensions`だけだとファイルの中身はチェックされないため、`mimes`または`mimetypes`と組み合わせて使う必要があります。

※バージョン9以前のドキュメントには`extensions`ルールの記載がなかったので使用できないかもしれません。

https://readouble.com/laravel/11.x/ja/validation.html#rule-extensions

# ちなみに
ファイルの拡張子を取得する`getClientOriginalExtension()`がありますが、こちらは`extensions`ルールと同じくファイルの内容はチェックしていません。
ファイルの内容を見て拡張子を取得するには`extension()`を使用する必要があります。
ドキュメントに以下の記載がありました。
>悪意のあるユーザーによりファイル名や拡張子が改竄される可能性があるため，getClientOriginalNameとgetClientOriginalExtensionメソッドは安全であると考えられないことに注意してください。そのため，アップロードされたファイルの名前と拡張子を取得するには，通常，hashNameメソッドとextensionメソッドを使用するべきです。

```php:TestRequest.php
dd($this->file('file')->getClientOriginalExtension());
// 'sql'

dd($this->file('file')->extension());
// 'txt'
```

https://readouble.com/laravel/11.x/ja/filesystem.html#other-uploaded-file-information

## 最後に
ドキュメントをちゃんと読みましょう。
機械学習や制御工学に関するPythonやRのスクリプト

# 目的
機械学習や制御工学に関するPythonやRのスクリプトを紹介する記事を投稿しています。
投稿した記事がたまってきたので整理するためにこの目次を作成しました。

# 機械学習 ( モデルの作成方法 )
<a href="https://qiita.com/drafts/5f30f420b84364c4d0b1/edit">[R]線形回帰の信頼区間と予測区間を計算するスクリプト </a>
<a href="https://qiita.com/akahoshi51/items/52bb776002dcd5fd842f">[Python]システム同定用入力信号の生成</a>
<a href="https://qiita.com/akahoshi51/items/281c20c53c8a759547c7">[Python]伝達関数モデルの同定</a>
<a href="https://qiita.com/akahoshi51/items/54994ee1529a69353613">[Python]状態空間モデルの同定</a>
<a href="https://qiita.com/akahoshi51/items/8982d62cb88ed909346c">[Pytorch]DatasetとDataloaderのイメージ図（MNIST版）</a>
<a href="https://qiita.com/akahoshi51/items/ed5f42d908b2882f9cff">[Pytorch]DatasetとDataloaderのイメージ図（自作Dataset版）</a>
<a href="https://qiita.com/akahoshi51/items/abcb265887fcde8b8e38">[PyTorch] MLPを用いた単純な回帰問題</a>
<a href="https://qiita.com/akahoshi51/items/b39301240f58cba02671">[PyTorch] MLPを用いた時系列回帰</a>
<a href="https://qiita.com/akahoshi51/items/ce072f8f59ece37ced06">[PyTorch] MLP,RNN,LSTMの時系列予測精度比較</a>
<a href="https://qiita.com/akahoshi51/items/c5a4d28fdd220ff756ad">[PyTorch] LSTMのシーケンス長による時系列予測精度の影響調査</a>
<a href="https://qiita.com/akahoshi51/items/1fb3de244610349370a0">[PyTorch] LSTMの学習用データの種類による時系列予測精度への影響</a>
<a href="https://qiita.com/akahoshi51/items/6be3ac4708d29e98ee41">[PyTorch] CNNの学習用データの種類による時系列予測精度への影響</a>

# 最適化
<a href="https://qiita.com/akahoshi51/items/118ae680f7d4c38bf49e">[Python]SciPyを用いた凸最適化スクリプト</a>

# 制御工学
<a href="https://qiita.com/akahoshi51/items/8eca11328be3328b4fe6">[Python]伝達関数の時間応答を計算するスクリプト</a>
<a href="https://qiita.com/akahoshi51/items/9bdbdbe1bddae78f8466">[Python]状態空間の時間応答を計算するスクリプト（２入力系）</a>
<a href="https://qiita.com/akahoshi51/items/459f924037d603a0f682">[Python]限界感度法で調整されたPIDコントローラの目標値追従性能が低いことを示すスクリプト</a>
<a href="https://qiita.com/akahoshi51/items/a042f08c3c6fe5a93a0d">[Python]最適化を用いたモデルマッチング(PIDゲインの調整方法)</a>

# 機械学習 (モデルの作成以外)
<a href="https://qiita.com/akahoshi51/items/7966bab0e085de029355">[R]主成分分析</a>
<a href="https://qiita.com/akahoshi51/items/a8677728e432ea734124">[R]決定木分析</a>

# その他
<a href="https://qiita.com/akahoshi51/items/67c950038f743de40e67">Qiitaに投稿するとき用のメモ</a>
<a href="https://qiita.com/akahoshi51/items/92d012c451df75d9eda9">Pythonに関するメモ</a>
python tkinter スライダーとスピンボックスの値連携


python tkinter スライダーとスピンボックスの値連携

spinboxの値は　spinbox1.get()　で取得する

scale1の値は var_scale 変数を用意しておき、
tk.scale1 = ttk.Scale で　variable=　のオプションで設定する

self.var_scale1 = tk.IntVar(self.root)
self.scale1 = tk.Scale(self.frame03, from_=0, to=255, orient=tk.HORIZONTAL, resolution=1, variable=self.var_scale_1, length=200, showvalue=False, command=self.func_scale_1_scrolled)  # resolution=ステップ値, length=GUIフォームのサイズ：横幅 label=記述なしでラベル表示しない、showvalue=Falseで値表示させない

```
import tkinter as tk
from tkinter import ttk

def on_spinbox_change():
    # Spinboxの値を取得してScaleに反映
    scale1.set(float(spinbox1.get()))

def on_scale_change(val):
    # Scaleの値を取得してSpinboxに反映
    spinbox1.delete(0, tk.END)
    spinbox1.insert(0, f"{float(val):.3f}")

root = tk.Tk()
root.title("Spinbox and Scale Example")

# Spinboxを作成
spinbox1 = ttk.Spinbox(
    root, from_=0.001, to=10.000, increment=0.001, format="%.3f", command=on_spinbox_change)
spinbox1.pack(pady=10)

# Scaleを作成
scale1 = ttk.Scale(
    root, from_=0.001, to=10.000, orient="horizontal", command=on_scale_change)
scale1.pack(pady=10)

# 初期値設定
spinbox1.set(0.001)
scale1.set(0.001)

root.mainloop()
```