OmniAICreator/Qiita-1.07M huggingface dataset:
【PL/pgSQL】SELECT INTOと$$（備忘録）

postgresのストアド完全初心者なのですが、本日読む機会がありまして。

# `SELECT INTO`

問題の部分

```sql
SELECT INTO alphaIds, betaIds array_agg(alphaId), array_agg(betaId) FROM TBL;
```

この`SELECT INTO`というものがよくわからず困っていました。
調べてみても`SELECT (*|columns...) INTO val1, val2 FROM TBL;`のようなものは見かけたのですが、ちょっと違う。と詳しく読むと、INTOの位置はSELECTの直後でもよいとのこと。

***タプル***のようなものと理解しました。
```
(alphaIds, betaIds) <- (array_agg(alphaId), array_agg(betaId))
```

`INTO`の位置を書き換えると以下のような感じ（この方が分かりやすいと思う）。

```sql
SELECT array_agg(alphaId), array_agg(betaId) INTO alphaIds, betaIds FROM TBL;
```

なお、PL/pgSQL以外での`SELECT INTO`はSELECT結果をもとにしてテーブルを作る構文だそうです。

# `array_agg(xxx)`

集約関数で、複数行の結果を配列にしてくれるもの。
SQLServerなどで同じことをするのは結構大変だった記憶があり、こういった便利な関数があるのはいいですね。


# `$$`

単なる区切り文字。
シングルクォートを使うと、内部でエスケープしなければいけないので`$$`を使うのが一般的、らしい。

# `array_length(arr, 1)`の第二引数

配列のどの次元の長さを出すか。
In POSIX sh, array references are undefined.とシェルスクリプトの警告で怒られた

## 該当のチェック
https://github.com/koalaman/shellcheck/wiki/SC2039

## 怒られたコード

```sh
#!/bin/sh

for item in "${files[@]}"; do
    echo "$item"
done
```

## 修正方針その1

あんまりshebangとか意識したことなかったですが、bashの機能なので警告が出たということでした。

```sh
#!/bin/bash

for item in "${files[@]}"; do
    echo "$item"
done
```

## 修正方針その2

shebangを変えずに別の書き方で再現するならこうなると思います

```sh
#!/bin/sh

echo "$diffFiles" | while read -r line; do
    echo "$line"
done
```
ラズパイでAGL flutterクラスタアプリをビルド

# はじめに
AGLでは様々なビルドprofileが用意されているのですが、ドキュメントにはその全てが書かれているわけではありません。
標準なものは**agl-demo-platform**です。ですが他にもたくさん用意されています。
例えば、AGL Octopus 15.0.1でビルドできるイメージは以下のものがあります
* agl-demo-platform
* agl-ivi-demo-platform-html5
* agl-ivi-demo-platform-flutter
* agl-cluster-demo-platform
* agl-cluster-demo-platform-flutter
* agl-cluster-demo-lxc-host
* agl-telematics-demo-platform
* ...

これらはあくまでもデモアプリを組み込んだイメージファイルで、AGLとしてのreference実装です。デモアプリを含まないコア部分は別に用意されています。
meta-agl*内のレシピを見れば探せないこともないですが手間がかかり面倒です。

＃けど、そのような記載がdocumentには書かれていない気がします。

# AGLでのラズパイ
ラズパイはAGLのメインボードではありません。ですが、入手性の良さから多くの人が手に取りやすいためQEMUと並んでリファレンスの1つに上がります。そのためボード固有の実装が生じたとしてもAGLへパッチが投稿されることが多いです。
ですが、CIや定期テストの対象外ですので注意が必要です。（これをAGLではコミュニティボードと位置づけています）

少し古いですが、ラズパイを使ったAGL入門が公開されています。2020年のAGLのウェビナーにて紹介されました。

https://www.automotivelinux.org/webinar/konsulko-raspberrypi/

# ビルド手順は？
## ラズパイのビルド
AGLでは一部のターゲットボードに対してビルド手順が用意されています。ラズパイ用のビルド手順も書かれています。
このページには、Qt版IVIイメージである**agl-demo-platform** と、HTML版IVIイメージである**agl-demo-platform-html**のビルド手順が書かれています。

https://docs.automotivelinux.org/en/octopus/#01_Getting_Started/02_Building_AGL_Image/08_Building_for_Raspberry_Pi_4/

## flutterのビルド
上記とは別の章に、カスタムしたビルド向けの手順が用意されています。flutter向けの手順はこちらです。ただし、この対象となるターゲットはQEMUですので他のボード向けにビルドしたい場合は読み替えが必要になります。

https://docs.automotivelinux.org/en/octopus/#01_Getting_Started/03_Build_and_Boot_guide_Profile/02_Flutter_Instrument_Cluster_%28qemu-x86%29/

# ラズパイ向けにflutter版クラスタ デモイメージをビルドする

2023/4/27に開催したAGL Japan meetupでは、flutter版クラスタ デモイメージをラズパイを用いて展示しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240142/b5a733e0-bbf2-56cd-c6de-426470b30102.png)

この手順例を記載します
下は2023/11/4時点で最新のpike 16.0.2を使用しました。

```
$ cd $AGL_TOP
$ mkdir pike
$ cd pike
$ repo init -b pike -m pike_16.0.2.xml -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo
$ repo sync
$ source meta-agl/scripts/aglsetup.sh -b build-flutter-cluster -m raspberrypi4 agl-demo agl-devel
$ bitbake agl-cluster-demo-platform-flutter
```

:::note 
これらもビルドできます
* bitbake agl-ivi-demo-platform
* bitbake agl-ivi-demo-platform-flutter
* bitbake agl-ivi-demo-platform-html5
:::

ビルドが問題なく完了したら、tmp/deploy/image/raspberrypi4/ ディレクトリに
agl-cluster-demo-platform-flutter-raspberrypi4-64-YYYYMMDDxxxx.rootfs.wic.xz
というファイル名のwicファイルが作られていると思います（YYYYMMDDxxxxは生成したときの時刻です）

これをラズパイ用のimagerを使ってSDに書き込めば完了です。
Unityで3Dモデルを扱う

# Unityでアニメーション作成

今後追記予定ですが、基本的なアニメーションのunitypackageをアップロードします。
unitypackageのファイルは以下のGitHubページにあります。

https://github.com/moriitkys/unity_human_anim_example

以下ページを参考に、fbxのアニメーションをblenderで作成して、unityでanimを確認する。 

https://qiita.com/Akarinnn/items/de377a1096f4ee7de9fe

FBXモデルは、メッシュ作成、リギング、テクスチャなどすべて自作（Metasequoia、Blenderにて製作）。
商用利用等の利用に制限はありません。ただし、以下の点にご注意ください。
・モデルの著作権を放棄しません。
・モデルをそのままの形での再配布することやモデルの自作発言を許可しません。

ライセンスはMIT。

![Worker_Walk.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282390/e608e4e2-0b7c-db8a-4c20-823e387badb0.gif)

また、以下のBOOTHページでいろいろと３Dモデルを公開しています。よろしければ、投げ銭してもらえると嬉しいです。

https://robotaim.booth.pm/


# キーボード操作でモデルを動かす

以下の記事を参考に３Dモデルをキーボード操作で動かします。
キーボード操作時にアニメーションを変更する方法については後日追記します。

https://futabazemi.net/unity/input_key_move

# 投稿日時について
本記事は過去に投稿した内容を再投稿しております。時間は以下の画像の通り、平日の夜です。

![Unityでモデルを扱う_投稿日時.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282390/fdcdf01e-0bd0-abc9-ea34-4a9db64c5342.png)
Leetcode 1845. Seat Reservation Manager

https://leetcode.com/problems/seat-reservation-manager/description/

# アプローチ
- PriorityQueue

```java
class SeatManager {

    PriorityQueue<Integer> pq;

    public SeatManager(int n) {
        this.pq = new PriorityQueue<>();
        for (int i = 1; i <= n; i++) {
            this.pq.add(i);
        }
    }

    public int reserve() {
        return pq.poll();
    }

    public void unreserve(int seatNumber) {
        pq.add(seatNumber);
    }
}

```
日本のSymbolノードの取得方法

# 概要

Symbolの日本ノードの取得方法です。
以下のスクリプトを実行するとStatisticsサーバーより日本リージョンのノードをリストで取得することができます。

https://github.com/ishidad2/getNodeList

一瞬で日本ノードのリストが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/831a1002-cf6e-ed52-5387-45badfb3b216.png)

リストはご自身のアプリケーションでご自由にお使いください。

まぁ、ソースコード読めば簡単に理解できる程度のことなので詳しくは解説しませんが、[**ここ**](https://github.com/ishidad2/getNodeList/blob/main/index.js#L17C9-L17C9)を変えれば日本ノード以外でも指定できるのでやってみてください。

記事が大したことなさすぎて、短くなってしまったので、もう少し追加。

**symbol-node-util**という生きてるノードを動的に返すNPMモジュールを公開しています。
もしよろしければ使ってみてください。

https://www.npmjs.com/package/symbol-node-util
Ruby技術者認定試験Gold 3.1で2回落ちた話

# はじめに
2023年5月上旬にRuby Silver（Silverの記事は[こちら](https://qiita.com/Takaharu_01/items/55a7b94a73bd574624eb)）に合格したため、このままの勢いでRuby Goldにも挑戦しようと思い受験しました。
これまで2回受験し1回目（2023年6月下旬）は33点、2回目（2023年11月上旬）は68点で落ちました。
1回目落ちて少し間を空けて2023年10月中旬頃から勉強再開してた気がするので、2023年10月中旬から11月上旬の期間何をやったのか等をまとめていけたらと思います。

# 試験当日までにやったこと
1. Ruby Gold受験の記事をざっと探す
1. [Ruby技術者認定試験合格教本](https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
    1. 第四章 オブジェクト指向をざっと1周通読
    1. 基礎力確認問題を解く
    1. 模擬試験を解く
1. [メタプログラミングRuby](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437)
    1.　第一章～第五章までざっと通読
1. [模擬問題集](https://github.com/ruby-association/prep-test/blob/version3/gold_ja.md)を解く
1. [Ruby2.0と3.0の違い](https://qiita.com/heysan/items/82bdfb7af4325f05e0e5)を確認

2の基礎力確認問題と模擬問題は95%以上の正答率に仕上がってましたが、4の模擬問題集は70～80%の正答率の仕上がりでした。受験時間ギリギリに5の記事を確認してましたが、非常に参考になりました。

# 不足部分
2回目受験した後に足りないなと感じた個所は下記です。
1. オブジェクト指向の理解
1. ...の使い方
1. eofの理解（gsubとのメソッドチェーン）
1. tallyの理解→文字配列で重複した任意の文字が何個存在するか
1. printメソッドで呼び出されるメソッドが何か
1. catch、throwの理解
1. public_send、private_send、__send__の理解
1. 正規表現＋?の理解
1. singletonライブラリの理解
1. etc...

# 再々受験に向けて
再々受験までには下記をやっていこうと思います。
1. 模擬問題集を95%以上の正答率に仕上げる
1. 不足部分の理解を深める
1. 5の[記事](https://qiita.com/heysan/items/82bdfb7af4325f05e0e5)を頭に叩き込む

# おわりに
2回目も落ちてしまいましたが、不足している点と今後どうやって補っていくのかを整理できたので、3回目に向けて頑張って勉強していこうと思います（財布へのダメージが...orz）。3回目受験次第、本記事の更新か新記事作成します。

# 参考記事
https://qiita.com/Takaharu_01/items/55a7b94a73bd574624eb

https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1

https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437

https://github.com/ruby-association/prep-test/blob/version3/gold_ja.md

https://qiita.com/heysan/items/82bdfb7af4325f05e0e5
AtCoder初心者 DailyTrainingメモ 2023/11/6

# ABC228 C-問題
https://atcoder.jp/contests/abc228/tasks/abc228_c

![228C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/fa2e3e5b-702f-9374-bb10-0392b3228945.png)

**ポイント**
当初問題文を理解できなかったが、先人たちの解説を読んで問題の要点を理解できた
・3日間の試験結果で、上位からK番目の人の得点を取得しておく
・各人が、その得点まで300点以内かどうかを判定する

````Python:228c.py
N,K = map(int,input().split())

# 得点リスト
P = [0] * N

for i in range(N):

    P[i] = sum(map(int,input().split()))

# 得点リストの上から K 番目の人の点は、いくつか
# point_sort = sorted(P, reverse = True)
# target = point_sort[K-1]

target = sorted(P, reverse = True)[K-1]

# target とする得点まで300以上差があれば、"No"

for i in range(N):
    if target <= P[i] + 300:
        print("Yes")
    else:
        print("No")
````
npmの疑問あれこれ

### 本番環境・開発環境で動作するパッケージをインストールするコマンド
```zsh
npm install パッケージ名
省略形 → npm i パッケージ名

// installが完了すると package.jsonの dependencies パッケージ名が記載される
```

### 開発環境で動作するパッケージをインストールするコマンド
```zsh
npm install パッケージ名 --save-dev
省略形 → npm i パッケージ名 -D

// installが完了すると package.jsonの devDependencies パッケージ名が記載される
```

### PC全体で動作する（グローバルに）パッケージをインストールするコマンド
```zsh
npm install -g パッケージ名

// installが完了すると PC全体からパッケージが使用できるようになる
```

### インポートされているパッケージを表示するコマンド
```zsh
npm ls // ローカルパッケージにインストールされているモジュール一覧
npm -g ls // グローバルパッケージにインストールされているモジュール一覧
```

### 結局 npm install って何やってんの？
- package.json に記述されてるパッケージをインストールされる
- インストールされると、 `node_modules` と `package-lock.json` が作られる
- 誰かに設定を共有するときは node_moudles と package-lock.json は共有しなくてもOK
- `ローカルパッケージ` プロジェクト内でしか使用できない
- `グローバルパッケージ` PC全体で使用できる

### グローバルパッケージはどこにインストールされるの？
```zsh
$ npm root -g -> これで表示される場所に格納されている
```

### グローバルパッケージはどこにアンインストールするコマンド
```zsh
$ npm rm -g パッケージ名
```

### node_modules とは
- npm install するとパッケージがインストールされ、そのパッケージの具体的な処理内容（ファイル）が格納されてるモジュール郡のこと

### インストールしたパッケージの呼び出し方
- `Node.js` では `import hoge from '〇〇'` 部分でパスの指定がない場合はインストールされたパッケージを探しに行く
- インストールされたパッケージは npm install した時にできる `node_modules` の中に格納されている
- インストールされたパッケージ（モジュール）のディレクトリ内にある `package.json` の `name` に記述されている部分が `from '〇〇'`　の部分になる
- パッケージが呼ばれたら一番初めに `package.json` の `main` のファイルが読み込まれる
```JavaScript
import React, { useEffect, useState } from 'react' // パスの指定なし（package.json の name の部分が from '〇〇' の部分になる）
// node_modules の中にある react　のモジュールを参照（一番初めに package.json の main のファイルが読み込まれる）
```

- 呼び出したいパッケージの中にある特定のファイルを /（スラッシュ） で個別に呼び出すことも可能
```JavaScript
import Link from 'next/link'
// node_modules の中にある next　のモジュールの中にある　link.js　が参照される
```

### npm コマンド
- script内に記述すれば `npm run 〇〇` で動作する
- JSON形式なので、コマンド内に""（ダブルクォーテーション）で囲う場合は \（バックスラッシュ）でエスケープさせる必要あり
- npm run hello -> hello が出力される
- npm run call -> package.jsonと同じ階層のmain.jsが実行される
```json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "hello": "echo \"hello\"",
    "call": "node main.js",
  },
}
```

### node_modules内のモジュールをnpmコマンドで処理を走らせる
- node_modules の中にある `.bin` ディレクトリの中にシンボリックリンクが貼られていばnpmコマンドでモジュールの処理を走らすことができる

例) nodemon パッケージをインストールし `てnode_modules/.bin/nodemon` が存在しているとき 
```json
{
  "scripts": {
    "dev": "nodemon"
  },
}
```

```zsh
$ npm run dev -> nodemonが起動する
```

### npxコマンド
- npmをインストールするとnpxコマンドが使えるようになる
- node_modules の中にある `.bin` ディレクトリの中にシンボリックリンクが貼られていば `npx シンボリックリンク名` でモジュールの処理を走らすことができる
    - node_modules の中にある `.bin` ディレクトリの中に存在しない場合は npm install が実行されてパッケージをインストールするように動作する
```zsh
$ npx live-server -> live-serverが起動する(存在しない場合はインストールしにいく)
```
【備忘録】KaliLinuxにphpをインストール

<!--
■執筆時の注意
・階層を深くなりすぎない
・表題以外のことを書かない、各場合は別記事で

■登校前チェック
・誤字脱字
・プレビューで体裁を確認
・インデックスに誤りはないか
・余計なコメントは残っていないか
・リンク誤りはないか
・ハッシュタグは設定されているか
-->

こんにちは、なつきです。
やられサイト自作への道 KaliLinuxにphpを導入編です！

# 目次
[1. はじめに](#1-はじめに)
[2. 実施内容](#2-実施内容)
[3. 前提条件](#3-前提条件)
[4. phpのインストール](#4-phpのインストール)
[5. nginxの設定変更](#5-nginxの設定変更)
[6. ブラウザで表示確認](#6-ブラウザで表示確認)
[7. 最後に](#7-最後に)
[8. 参考資料](#8-参考資料)

# 1. はじめに
やられサイト自作にあたり、php8.2をインストールしていこうと思います。
 
# 2. 実施内容
php8.2のインストール～nginxの設定変更、ブラウザでphpファイルを表示するまで

# 3. 前提条件
TODO

# 4. phpのインストール
1. パッケージリストの更新をする
    ```
    sudo apt-get update
    ```
    
1. php、php-fpmのインストール
    ```
    sudo apt install php
    sudo apt install php-fpm
    ```
    
1. phpのインストール確認
    ```Linux:
    # php -v
    PHP 8.2.10 (cli) (built: Sep  5 2023 05:43:15) (NTS)
    Copyright (c) The PHP Group
    Zend Engine v4.2.10, Copyright (c) Zend Technologies
        with Zend OPcache v8.2.10, Copyright (c), by Zend Technologies
    ```

# 5. nginxの設定変更
※nginxのインストール実施時の記事↓
[【備忘録】KaliLinuxにnginxでWebサーバを構築](https://qiita.com/natsuki7293/items/5f78826cfec241a06443)

※PHPアプリケーションサーバ構築の前提知識
・PHP-FPM(FastCGI Process Manager):PHPサーバ、HTTPサーバは別に独立して動作するプロセス。HTTPサーバと分離することにより、PHPを実行する権限をより厳密にできる。

## 5-1. nginx.confの設定を変更
httpコンテキストの中にserverディレクティブを追記

```/etc/nginx/nginx.conf:
##
# www.zeizyaku.com
##
server {
  # バーチャルサーバが使用するアドレス、ポートを指定
  listen 8080;

  # ホスト名の指定
  server_name www.zeizyaku.com;

　# 公開するディレクティブ
  root /var/www/zeizyaku;

  access_log /var/www/zeizyaku/nginx/www.zeizyaku.com_access.log;
  error_log /var/www/zeizyaku/nginx/www.zeizyaku.com_error.log;

  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;

  # URIごとの設定
  location ~* \.php {
    include ./snippets/fastcgi-php.conf;

    # HTTPのリクエストをFastCGIプロトコルでプロキシ
    # PHP-FPMがリッスンしているUNIXドメインソケットファイルを指定している
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
  }
}
```
        
## 5-2. その他の設定
1. 設定ファイルに設定した資産を配置する
1. server_nameディレクティブにホスト名を指定した場合、hostsファイルに情報を追記しておく
1. php-fpmとnginxサービスの起動

    ```
    # systemctl restart php8.2-fpm.service
    # systemctl restart nginx
    ```
    
# 6. ブラウザで表示確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/d60ff7bd-6a8b-a1b8-9527-92bc0b487b9e.png)

# 7. 最後に
- LPICでnginxの学習はしていたがこれまでの現場はApacheを採用している現場が多く、なかなか触れる機会がなかったので、今回触れられてよかった。おそらく情報が古いだろうが、以下の本はとても参考になるので、別記事でnginxについて掘り下げた記事を投稿したい
[nginx実践入門](https://amzn.asia/d/8lfPInj)

- https化に挑戦したい

# 8. 参考資料
Qiita CLIでできること、できないこと

# はじめに
はじめまして。Qiita Advent Calendar 2023の完走賞を狙ってる[にわのわ](https://twitter.com/niwa_nowa)です。
Advent Calendarを走るにあたってローカルで記事の管理をしたいと思い導入しました。
手ごたえとしてはかなりおすすめです。

参考
> 完走賞
Qiita記事に1人で25記事投稿しきった方∞名を表彰します。（複数のカレンダーで計25記事の投稿も対象）

https://blog.qiita.com/adventcalendar-2023-qiitapresents/


# インストール
公式のインストールがしっかり書かれているのでそちらを参照してください。
自分のエディタで記事投稿ができる、Qiita CLIの使い方 #Qiita - Qiita

https://qiita.com/Qiita/items/666e190490d0af90a92b

# できること(うれしいこと)

普段は[こちら](https://hugo.niwanowa.tips/)でhugoを使ったブログを書いているので、そちらとの機能の比較をしていきます。
- ホットリロード機能
markdownファイルを保存すると自動でブラウザも更新してくれます。
無いと死んじゃう。
- サイドバーがとてもよい
非常に良くないですか？
良いですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/dc63649a-9039-f24b-1528-02e8b89aa419.png)
- ローカルでもQiitaの記法で表示される。
リンクカードなど、md標準でない機能もきちんと動いてくれます。感謝。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/c31a7b1b-9596-d941-0f1e-a1c55d9aa3fd.png)
- 改行が改行だけでよい
hugo、というかmdだと改行するときにスペース2つ入れないといけないのですが、Qiita CLIだと改行だけでよいです。
感情の赴くままにキーボードを叩く勢なので非常に助かります。日本語入力の時、特に。

# できないこと(ちょっと辛いこと)
- Qiita CLIの機能説明が公式説明で見つけられない
あったら申し訳ないのですが、ありますか？
インストールについてはめちゃめちゃ心遣いを感じるのに
こんな機能があるぜ！という説明が見つけられなかったので、最初の一歩に抵抗を感じました。
- テンプレートがない
```npx qiita new (記事のファイルのベース名)```で記事を作成すると、デフォルトのテンプレートが吐かれるのですが、
これを自分好みのものに変えられないです。
例えば```private: true```にするとか、やりたいことはあるのですが...
- ページバンドルがない
hugoにはpagebundleという機能があります。
これと[Paste Image](https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image)というVSCodeの拡張機能を使うと、ctrl+Vで画像を張り付けることができ、
画像の管理がしあわせに行うことができます。
要するにqiita CLIで画像を貼り付けようとするとちょっと辛いです。
Page bundles | Hugo

https://gohugo.io/content-management/page-bundles/

Paste Image - Visual Studio Marketplace

https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image

- リンクカードの表示がおかしくなる時がある
現状、再現2回。ctrl+S連打マンだとなるかも？

- updated_atが毎度更新される
限定共有記事限定？
特に差分がないはずなのに更新される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/5b518e84-82e8-9bca-9824-a518ad11650f.png)

- タグに空白が含まれるとGHAで落ちる
これはQiitaにわかの自分が悪い部分もありますが、落ちてるときのログがこれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/46a84687-acc7-ed83-fa62-25f453866e9d.png)

# おまけ
こんな感じのtasks.jsonを書いておくとvscodeでQiita CLI用のプロジェクトを開くだけでプレビューページが表示されて幸せになれます。
```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Qiita Preview",
            "type": "shell",
            "command": "bash -c \"npx qiita preview\"",
            "presentation": {
                "reveal": "always",
                "panel": "new"
            },
            "runOptions": {
                "runOn": "folderOpen"
            }
        }
    ]
}
```

# さいごに
以上。Qiita CLIに触れてみた感想でした。
マジで簡単に環境作れるのでおすすめです。
BeautifulSoup（beautifulsoup4）公式ドキュメント日本語翻訳案

※なんとか転職活動も落ち着き、一番最初にやり方を教えてもらって書いた初Qiitaがこれなのですが、今見返すとグチャグチャなので徐々に整理・翻訳作業再開します

<h1>そもそも Python、BeautifulSoup、スクレイピングとは

　Pythonはプログラミング言語の１つで、おそらく始めに学ぶことが多いHTML&CSSと比べると次のような特徴があります。（なお、HTMLは本当はマークアップ言語と言います。）

**①作れる機能は比べものにならないほど多い（※よく利用させてもらっている方の以下のQiita記事だけでも大量に用途が載っています。）**
https://qiita.com/python_academia/items/62aefbf4e373cd2aa496
**②その分？？？パーツが細かすぎる**


　②の性質のため、**ほとんど最初に import　～　というのを最初に書いて必要なパーツを使うための設定をしてから**、コードを書いていきます。そして、この　～　に書くものをライブラリといいライブラリの中に入っている便利機能（の小さいパーツにあたる）プログラム１つ１つをモジュールと言います。

___

そのため例えば、ここで紹介するライブラリーの１つである beautifulsoup4 を使いたい場合は、ターミナル（powershellやzsh、もしくはコマンドプロンプト）で例えば
```powershell
pip install beautifulsoup4
```
と打ってインストールした上で（pipコマンドと言います。他にはPoetryというPython版パッケージ管理システムがありますが、私はPoetryはまだ使いこなせません。）
```python
from bs4 import BeautifulSoup
soup = BeautifulSoup("<html>hogehoge</html>,""html.parser")
soup.html
--------
```
みたいに書き始めます。（bs4はbeautifulsoup4 のことです。ややこしいのですが、**１行目のBeautifulSoup はライブラリ名、２行目のBeautifulSoupは同名の、beautifulsoup4モジュールに入った関数名です。**）

　なお、**BeautifulSoup は（HTMLやXMLといったマークアップ言語のコードから）集めてきたデータを整理しやすい形に微修正し、その中から必要なものだけ抽出したり、成形したりするような処理（これを「スクレイピング」と言う。）をするためのモジュールです。**
 

　上記の３行をターミナル（powershellやzsh等で python と打って>>>というマークが出てから）で実際に１行ずつ順に入力してもらうと分かるのですが、最後Enterを押した時点で
```python
>>> soup.html
<html><body><p>hogehoge</p></body></html>
```
みたいな感じでオブジェクトが出力されます。（※ここでは、「データに関数や属性が実は隠れているようなもの」という感じの認識で大丈夫です）そして、これに対して、メソッドや関数を使って抽出したい要素を抽出したり、jsonファイルを作ったりするというのが、Python で beautifulsoup4を使ってできることの大きな流れになります

 （何人か現役のベテランエンジニアの方の話を聞く限り、スクレイピングをしたいときには、selenium かbeautifulsoup4を使うことが一般的であるようです。※2023年11月Xのアンケートで確認しました。なお以下の記事のようにスクレイピングには他にもいくつか方法があります。）

https://qiita.com/thinking-weed/items/9de1556ccc40904b411c

____

なお（BeautifulSoupに限らず）ライブラリを使うに当たって**ここで１つ大きな問題があります。（おそらく、これがプログラミングには挫折者が多いという言われる原因の１つになっているのではないかと思っています）**

____

　それは、「**公式ドキュメント、つまりは各プログラムの取り扱い説明書は長い上に一般的に英語長文であることが多い。結果、分からないことを調べようとしても、その英語を読むのに時間が掛るし、時に作成者本人による説明が分からないことがある**」ことです。

<h1>とどのつまり、協力して欲しいこと

　chat-GPT等のAIやGoogle翻訳の精度が上がっているとはいえ、英語と日本語だと少なくともニュアンスや意味の受け取り方が違ってきます。そして、Pythonも基本英語圏の人が中心に作ったプログラミング言語であり、公式ドキュメントはがっつり英語であることが多いので、同様の現象が起こりえます。

 そして、このBeautifulSoupも**以前のバージョンのbeautifulsoup3を近藤さんという方が2013年に翻訳してくださったのを最後に現在自分が調べた限りは、最新版のPython3に対応した公式ドキュメントの日本語翻訳はありません。そのため、現在、以下リンクのGoogleドキュメントで知らない単語だけ調べて自分の勉強の意味も含めて日本語翻訳を作っています**。（※まだ精度は低いです）

https://docs.google.com/document/d/1LMgE-Byv6nCF-ODWE8tUpn7QE-u6br05/edit

（**※上記のリンクには共同編集の権限を付与してあります。また、バックアップは度々取っています。**）

　私自身がスクレイピングや機械学習を勉強しながら少しずつ翻訳作業を進めてはいますが、私も一応人間なので、この文書にも私の主観や誤訳が紛れまくっているはずです。そのため、少しでもいいので変なところがあったら指摘・修正をしてもらいたいというのが、このQiitaの趣旨です。なお、このQiitaを書く以前に何人かの方に指摘をいただいたのですが、まだ2023年11月上旬に３～４P分ぐらいしか、かなり丁寧に見てもらった修正分を全て補正できていません。

_____

　なお一部例外もあります。
 
 例①　Pythonをインストール状態ですでに入っている標準ライブラリの公式ドキュメント（※これは、上記のpipにあたる作業が必要なくimport ～　からで大丈夫）
 
https://docs.python.org/ja/3/library/index.html

　例②　Pythonのフレームワークの１つ（Flask）の公式ドキュメント
 
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/installation.html#install-flask


<h1>このQiitaを記事を書くにあたり特に参考にした資料

<h5>確かな力が身につくPython「超」入門　SB Creative　鎌田正浩　著
【Git】作業を一時退避してチェックアウトする方法

実務で、ある作業をしている際に、同一のプロジェクトで他の作業を急遽行って欲しいと依頼があった。
その際に、作業中のものを一時退避して、新たにチェックアウトする方法を学んだため、備忘録として残すもの。

Gitを使用して、「developブランチ」から「Aブランチ」を切って作業を行っていたとする。
突然、別の修正が必要になり、「developブランチ」から「Bブランチ」を作成して作業を行う必要が生じたとする。

「Aブランチの作業」を「Bブランチ」には反映せずに、Bブランチで作業を進めたい場合、以下の手順で実行できる。
なお、Aブランチの変更は <font color=red>**まだコミットされていない**</font> という前提とします。

## 操作手順
#### 1. <font color=red>現在の変更を一時的に退避させる</font>ために、以下のコマンドを使用する。
```
git stash
```
これにより、Aブランチの変更が一時的に保存され、作業ディレクトリがクリーンな状態になる。

#### 2. 新しいBブランチを作成するために、以下のコマンドを使用する
```
git checkout -b B-branch
```
これにより、新しいBブランチが作成され、Bブランチに切り替わる。
これで、Bブランチでの作業を開始することができる。

#### 3. Bブランチで必要な変更をコミットするために、以下のコマンドを使用する。
```
git commit -m "Bブランチでの作業をコミット"
```
Bブランチでの変更をコミットする。

#### 4. Bブランチでの作業が完了したら、Aブランチに戻るために、以下のコマンドを使用する。
```
git checkout A-branch
```
これで、Aブランチに切り替わる。

#### 5. Aブランチでの<font color=red>作業を再開する</font>ために、以下のコマンドを使用する。
```
git stach pop
```
一時的に退避させた変更を復元する。
この際に、Aブランチでの変更とBブランチでの変更が干渉しないように注意が必要。

#### 補足（stashしている履歴を確認するコマンド）
```terminal
git stash list
```
上記のコマンドでstashされている一覧を確認することができる。

## まとめ
これらの手順によって、AブランチとBブランチでの作業を独立して行うことができる。
一時的な変更の保存に「git stash」を使用することで、異なるブランチでの作業を切り替えることができる。
そして、「git stash pop」を使用して変更を取り出し、必要な場合に復元できる。
AWS CodePipelineの動的パラメータを試す

# はじめに
AWS UpdateでCodePipelineの動的パラメータ機能が追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/10/aws-codepipeline-parameterized-pipelines/

この機能を利用することでCodePipelineを実行する毎に異なる値を入力することができ、パイプライン内で参照できます。
環境を指定するパラメータ等を組み込むと、パイプラインの再利用が出来そうです。

# ためしてみる
DockerイメージをビルドしてECRにPushするパイプラインを作成し、動的パラメータを試してみます。
イメージにつけるタグとECRのリポジトリ名をPipeline実行時に渡してみます。

## 構築
CodePipelineのコンソールからパイプラインを作成します。
動的パラメータ機能はV2パイプラインでのみ利用できるので、パイプラインタイプはV2を指定します。
![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/d58683ba-5a90-6268-24fe-f64991e43f7b.png)

変数の項目でタグ用の`INPUT_IMAGE_TAG`とリポジトリ用の`INPUT_REPO_NAME`を作成します。
デフォルト値を空白にしておくことでPipeline実行の際に入力を求められるようになります。

![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/afb1c8ed-637f-76df-1147-eeadff4ca667.png)
ソースステージではソースが存在するリポジトリとブランチを指定します。

ビルドステージの環境変数で、タグ`IMAGE_TAG`とリポジトリ名`IMAGE_REPO_NAME`の環境変数を作成します。
CodePipelineの動的パラメータを参照する為、Valueは`#{variables.INPUT_IMAGE_TAG}`と`#{variables.INPUT_REPO_NAME}`とします。

![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/1647a8a8-0ad2-dc7e-5613-4a407acceb91.png)


この設定を行うことでPipeline実行時に指定する値がビルド環境の環境変数に渡されます。
環境変数を利用して、buildspec内でタグとリポジトリ名を取得します。

<details><summary>利用したbuildspec.yml</summary>


```yaml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
```
</details>

## Pipelineを実行する
作成したパイプラインを選択し、「変更をリリース」を選択します。
するとパイプライン変数の入力を求められるので、設定したいタグ名と既存のリポジトリ名を入力し、リリースします。
![image04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/64a43212-4f4e-c8ff-f0b9-ead89dc3e9ce.png)

ECRに指定したタグ名でPushされることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/c9941264-46cb-e420-6be5-4ce5fbf709db.png)


なお、AWS CLIから実行する場合は以下のコマンドになります。

```shell
 aws codepipeline start-pipeline-execution --name test_pipeline \
    --variables name=INPUT_IMAGE_TAG,value=test_tag name=INPUT_REPO_NAME,value=test-rep
```

# 参考

https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-variables.html
【Swift】特殊な関数な使い方ができるcallAsFunctionについて

# はじめに
`callAsFunction`という特殊な使い方ができる関数があると知りました。
私が最初に`callAsFunction`の存在に気づいたのは`dismiss`ででした。

```swift
@Environment(\.dismiss) var dismiss

// 同じことをしている
dismiss()
dismiss.callAsFunction()
```

# 実装方法
`callAsFunction`という関数名で実装をすると、使用時に関数名なしで使用できます。

```swift
class Adder {
    func callAsFunction(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
}

let adder = Adder()
let result1 = adder(1, 1) // 2
let result2 = adder(2, 3) // 5
let result3 = adder(4, 6) // 10
let result4 = adder(7, 5) // 12
```

# おわり
構造体名で処理を表すことができるものであれば、`callAsFunction`を使ったほうが良さそうですね！
Raspberry Pi PicoをUSBシリアル接続で制御する

# 目的
RaspberryPiPicoにもともと付いてるUSBポートを使ってPCからコマンドを送ってPico上に実装されたセンサー数値等の応答を返す仕組みを作りたかったんだけどGPIOのUARTを使う作例ばかりで難儀したのでメモ。

# いるもの
RaspberryPiPico　1台（今回はPicoWを使った）
ThonnyをインストールしたPC　1台(今回はWindows)
USB A to micro Bのケーブル　1本（動けば何でもいい）


# Pico側で実行するコード
```python:test_device.py
import machine, utime

def blink(sec):
    led = machine.Pin("LED", machine.Pin.OUT) # Picoの場合は25がオンボードLEDのピン
    led.value(1)
    utime.sleep(sec)
    led.value(0)

def internal_temp():
    sensor_temp = machine.ADC(4)
    conversion_factor = 3.3/(65535) #convert value to voltage
    reading = sensor_temp.read_u16()*conversion_factor
    temp = 27-(reading-0.706)/0.001721
    return(temp)

try:
    while True:
        s = input()
        blink(0.1)
        if s == 'Hello!':
            print('World!')
        elif s == 'name?':
            print('Im PICO!')
        elif s == 'temp?':
            temp = internal_temp()
            print(temp)
        else:
            print('?',s)
except KeyboardInterrupt:
    pass
```
Pico上で動かしたときはShellに直接 Hello! 等と入力するとオンボードのLEDが光って返事がShellに表示される。temp?でRP2040内部の温度センサーの値を読み取って返す。
```
>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
Hello!
World!
name?
Im PICO!
temp?
30.78955
XYZ
? XYZ

```

# PC(Thonny)側で実行するコード
```python:test_host.py
import serial,time

PORT = 'COM7'  # Windows の場合COM*

ser = serial.Serial(port=PORT,baudrate=115200,timeout=1)

command = 'Hello!'
send_bytes = bytes(command+'\r\n','utf-8')
ser.write(send_bytes)
buf = ser.readlines()
print(buf,type(buf))

command = 'name?'
send_bytes = bytes(command+'\r\n','utf-8')
ser.write(send_bytes)
buf = ser.readlines()
buf = [i.decode().strip() for i in buf]
print(buf)
ser.close()

try:
    while True:
        ser.open()
        command = 'temp?'
        send_bytes = (command+'\r\n').encode('utf-8')
        ser.write(send_bytes)
        buf = ser.readlines()
        buf = [i.decode().strip() for i in buf]
        print(buf)
        ser.close()
        time.sleep(1)

except KeyboardInterrupt:
    print('stop')
    pass
```

# 動かす
Pico上でtest_device.pyを実行してからlocal Pythonに切り替えてtest_host.pyを実行すると以下のようになる、はず。
```:shell
>>> %Run test_host.py
[b'Hello!\r\n', b'World!\r\n'] <class 'list'>
['name?', 'Im PICO!']
['temp?', '31.2577']
['temp?', '31.2577']
stop
>>> 
```
ser.write()でコマンドを送ってser.readlines()で読み込む。このときインスタンス生成時に設定したタイムアウト（1秒）に達するまで読み取りを続けるためレスポンスがやや悪い。in_waitingでバイト数を取得してread(bytes)で読み取ろうとしたんだけど上手くいかなかった。まあ環境制御装置用途なので1分に1回読み込めれば十分だしとりあえず動くからヨシ！
Picoのserial consoleは送ったコマンドと返事をバイナリのリストで返すみたいでser.readline()で読むとコマンドしか表示されなくて悩んだ。誰か良い感じのやり方を教えてください。
とにかくこれでコマンドを送って返事をする仕組みができたので最初にポートに順番に名前を訊いてデバイスを判別するとか、測定ノードから取得した値に基づいてと制御ノードに接続されたモーターを動かすといったことができる、はず。有線接続なのでWiFiみたいな干渉を心配しなくて良い。

## 追記
readlines()でタイムアウトになるまで読み取りを続けるとレスポンスが悪いけどreadline()だとCRLFが二回出てくるから後半が読み取れないのなら2回読み取ればいいじゃないと思ってやってみた。
```python
(前略)
        buf1 = ser.readline().decode().strip()
        buf2 = ser.readline().decode().strip()
        print(buf1,buf2)
(後略)
```
まあまあレスポンス早くなったからヨシ！
もしくはinput('>>')とすると応答の最後に>>がつくのでread_until(b'>>')でも良いかもしれない。
ser.read_until(b'>>').decode().split('\r\n')と書けば扱いやすいかな？
Langchainを使って、SQLでデータ分析してくれるAgent/Chatbotを作る

ChatGPTにSQLの質問投げると、ほとんどの質問は回答してくれますが、ある程度のSQL知識がないとうまく活用できないです。しかし、langchainとLLM経由でやると、SQLクエリが書けなくもデータの抽出や分析が問題なくできます。

今日はlangchainを使用して、LLMでSQLデータ分析をやってくれる方法をご紹介します。

## ①データセット
まず使われていたデータは私が勝手に作ったもので、５行しかない”花”のテーブルです。
カラムとしては、名前、国、価格、数量、日付などが含まれています。（サンプルデータは以下のようになります）
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/fc75a4e2-0f0c-06db-0f88-2cbfd50c83fd.png)


## ②アプローチ（SQLDatabaseChain/Agent）
アプローチとしては二つがあります。一つはSQLDatabaseChainというSQLに特化したchainを使う手法で、もう一つはAgentを使用する方法です。

### 1.SQLDatabaseChain
コード自体は非常にシンプルで、langchainの"SQLDatabaseChain"でLLMとデータベースをつなぐだけです。

中身は以下の流れとなります。
1.自然言語（質問の内容）をlangchainによってLLMに投げて、LLMがSQL文に変換する。
2.SQL文はSQLDatabaseChainによってデータベース上でSQL文を実行する。
3.実行で返してきた結果をまたSQLDatabaseChainによってLLMに返して、LLMが結果を自然言語（回答）に変換する
4.自然言語（回答）をAnswerとして返す。

質問を３つ用意して投げました。outputは以下のような感じです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/862ac9db-d43f-8662-c096-3155ed7fda9e.png)

クエリと結果、あと答え一通り確認すると、特に問題ないですね。


### 2.Agent
Agentのやり方は少し複雑ですが、昨日Agentで紹介したReActの考え方で処理します。
"agent_executor"と"SQLDatabaseツール"、"LLM"、"データベース"をlangchainでつなぎます。

中身は以下の流れとなります。
1.自然言語（質問の内容）をlangchainによってLLMに投げて、agent_executor経由でLLMがやり方を"思考"する。
2."思考"でこれはSQL問題のを理解して、SQLDatabaseツールを使うことに決める。
3."行動"としてはSQLDatabaseツールを使って、データベースでSQL文を実行しに行く。
4.SQL文を実行して結果を得た後に、再度"思考"して、これは最終回答だと理解したので、最後"行動"としてはこの回答をAnswerとして返す。

質問は同じく⇧の3つ用意して投げました。
outputは長くなりましたので、質問１（"在庫数が最も少ない花はどれですか？"）の回答だけスクリーンショットしました。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/e4c6ff4a-bc3e-4f8a-f2ce-bd916d060c8d.png)

回答見るとLLMが"思考"している時の流れも全部書いてますので、LLMがReActのロジックで行動しているのかわかりますね。

次回はLLMとGoogleのAPIを使って、自分のメール（gmail）を管理してくれるChatbotの作り方を共有します。（同じくlangchainで実現します。）
化学メーカー勤務の研究職がAIを学んで転職するまで

# はじめに
どうも最近ワドルドゥが可愛くてフィギュアを集めまくっている者です。
今回は、大学→大学院→社会人と化学専攻で進んだはずなのに、転職先ではAI関連の業務に携わることが叶った経緯を紹介したいと思います。

# 対象者
この記事の対象者は
- 転職を考えている人
- AI・プログラミング初心者
- この世のすべての人

です。

# なぜ化学を選択したか
まずは私が化学で飯を食っていこうと決意した理由です。
~~単純明快、女の子が多いから~~
高校の化学の先生が楽しそうに授業をする様を見て、面白いのかな？と興味を抱き、先生に相談したことがきっかけです。

僕「先生！化学って面白いですか？」
先生「ルシャトリエ！ルシャトリエ！」

先生が言うには高校の化学は氷山の一角にしか過ぎないとのこと。
高校化学はほとんどが嘘であると言われ、真実を学びたいという想いから化学の道に進みました。
※嘘と書きましたが、正確には事実の表面のみ高校で習っており、実際にはもっと奥深い学問であるという意味です。

大学では、化学の真髄に迫りましたが、スプラトゥーンが楽しすぎてあまり学べませんでした。
そんなこんなで物理化学や電気化学を専門に研究室に所属し、大学院へと進学。
現職の会社も化学メーカーで、
「とりあえずいろんなことやってるしやりたいこと見つかればいいな～」
くらいの気持ちで入社しました。

# AI・プログラミングとの出会い
ある日、実験中に

上司「○○君、パソコン得意？」
僕「まあ検索したりする程度は…」
上司「Excelできる？」
僕「少しは…」
上司「じゃあ、AIやろっか！」

ということで、まったく納得のできない出会いをしました。
そのせいか、最初の1年くらいはプログラミングを避けていました。
やったとしてもBIツールを軽く触ったり、ノーコードツールであるKNIMEでデータ処理してみたり程度でした。

そんなあるとき、他事業所の先輩から

先輩「Pythonやんないの？」
僕「難しそうなんでやらんす。コード見るだけで拒否反応あるっすわ。」
先輩「Pythonの1行がKNIMEの1ノードって言ったら？」
僕「なんかオススメの教材あります？」

ということで丁度データ解析や機械学習による時系列データの予測の案件が降ってきたので、Pythonを学ぶことにしました。
以上が私のプログラマーとしてのスタートラインです。

# 転職するまでにやったこと
私がプログラミングを始めたころはChatGPTはまだなかったので、ひたすらググってました。
基本的にはQiitaの記事を見ながら、わからないことを1つ1つ解決していましたね。
以下の記事で**Stack Overflowは使うな**と天才ハッカーが言っていたので、極力見ないようにはしていました。

https://qiita.com/jacksuzuki/items/b2fa6b44962e73a53d08

はじめはif文やfor文ですら、苦手で全然理解できませんでしたね。
そんなレベルなのに機械学習のコードはいじらされていました。
そんなレベル感のまま半年はうまくいかずに周りに迷惑をかけていましたが、お世話になっていた先輩が異動することになり、私が所属する事業所のAIチームの統括をすることになりました。
なぜ入社4年目になる小童が？と思いましたが、いい機会だなということもありやってみることにしました。

**まあ、うまくいかない。**

管理ってなにするの？技術アドバイザーってどこまで理解すればいいの？とアタフタしてる中、AWSのクラウド設計を担当していた先輩が退職され、その仕事の引継ぎをしました。
~~また厄介なのを置いていきやがった~~この業務は同期と協力して、先輩がやり残していた部分を2か月かけて完遂することができました。（あとから聞いた話ですが、このクラウド設計を外部委託した場合、3か月で2000万円以上するそうです。ボーナスくれ）
このあたりからなぜか自信がついてきて、別の同期に協力してもらいながら統括としての役割を果たせるようになりました。

その勢いで、会社のAI/DXの意識が低すぎると感じたため、部署長に「全社の若手向けに教育をさせてくれ」と直談判し、実際に講師としてAIやプログラミングの基礎的な教育を同期3人で行っております。（最初は所属事業所のみだったんですが話がどんどん大きくなった）

まとめると、
- チーム統括
- 機械学習モデル作成
- Pythonでのデータ処理
- AWSクラウド設計（セキュリティ構築）
- 教育実施

このような経験を約1年間で積むことができました。

# 転職を決めたきっかけ
現職では自身のスキルアップが低迷すると感じ、もっと専門的にAI/DXをやっている組織に飛び込むべきだと判断したためです。
AI・プログラミングを学んでいくうちに、化学の知識・経験をもとにAI/DX、プログラミングをもっと学びたいと思いました。
転職先でもAIやプログラミングの知識や経験を活かしたDX業務に携わる予定です。

# 転職活動を終えて思ったこと
まずプログラミングスクールは行かなくてもなんとかなるなって思いました。
そもそもやってる内容が違うとは思いますし、私の場合は実際に課題が与えられていたので実践的なスキルを学ぶことができる良い環境にあったともいえます。
しかし、メーカー勤務の人がプロセス効率化のためのDXを目的にプログラミングを学ぶ場合は、プログラミングスクールは不要であると感じました。
Udemyの講座もありますし、Qiitaのような技術記事もあります。
独学でなんとかなると思います。

また、私は機械学習を専門でやっていたので、kaggleやNishikaなどのデータコンペで実際にデータに慣れたり、Qiitaにアウトプットすることで知識をつけていくことができました。
正直、スキルアップは自分のやる気と行動力だなって思います。

# まとめ
ここまで読んでいただきありがとうございました！
ダラダラと書いてきましたが、まったくの初心者でも1年ちょい頑張れば、専門的に仕事ができるということを伝えたかったです。
チーム統括でメンバーの指揮の上げ方、データコンペ参加や技術記事でのアウトプットなど勉強熱心さ、AWS使用、教育実施にあたる行動力あたりを転職活動を通して評価してもらえました。
転職先でも、私の圧倒的行動力を見せつけてやりたいと思います。
まだまだ未熟だとは思いますが、チャレンジングな精神は忘れずに学び続けて経験を積み、いち早く会社に貢献できるようになりたいですね。
そのためにまずはAWS認定資格でも取るか～。
それでは！！！
Power Automate: DevOps に繋げようとして、The dynamic invocation request failed with error が出たときは

# 背景

Azure DevOps からの通知を処理しようとしたら、エラーが出たので、その対処備忘録

といっても、結局は以前と同じものだったので、そこへのリンクだけ :sweat_smile: 

# 現象

DevOps の Trigger や Action を使おうとして、Organization を選択後、Project を選択しようとすると、以下エラーが発生

```json: エラー
The dynamic invocation request failed with error: {
    "status": 401,
    "message": "TF400813: The user is not authorized to access this resource. \r\nAzure DevOps ActivityId: {ActiveId}\r\nDetails: TF400813: The user is not authorized to access this resource. \r\nclientRequestId: {clientRequestId}",
    "error": {
        "message": "TF400813: The user is not authorized to access this resource. \r\nAzure DevOps ActivityId: {ActivityId}\r\nDetails: TF400813: The user is not authorized to access this resource. "
    },
    "source": "vsts-jw.azconn-jw-001.p.azurewebsites.net"
}.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/cb07ac4f-21f8-0ce9-3c12-b97572fa6aa1.png)

# 原因と対処

セキュリティ強化による、デフォルト設定の変更と思われるので、以下と同様に、

https://qiita.com/baku2san/items/a7e5c2783b82e2b6e75d

この設定を有効化する

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F120072%2F64a26698-f671-f615-5c3e-0acec09fd69f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=e27dd0bb745a7ba28e9b2d86b216e05a)

# あとがき

エラー解決したものの・・実は会社では使えないことが判明・・。 :sob:
python備忘録

pythonに関わる内容を備忘録として残していきます。
何かの参考にしてください。
基礎を上げていきます。

随時更新していきます。
## 九九の表示
```python
# if文、for文
# 掛け算の表示
a_lst = range(1, 10)
for val in a_lst:
    for val_1 in a_lst:
        ans = val * val_1
        if ans < 10:
            print(ans, end= '  ')
        else:
            print(ans, end= ' ')
    print()
```
**実行後**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/84a8c1fb-f0df-cc2b-69df-d40a7ab3e1cb.png)

**備考**

end= ' 'で改行しないようにする。
print()だけで改行を行う。

## atcoder A問題
https://atcoder.jp/contests/abc327/tasks/abc327_a

**解答コード**
```python
N = int(input())
S = input()

if ('ab' in S or 'ba' in S):
    print('Yes')
else:
    print('No')
```

## atcoder B問題
https://atcoder.jp/contests/abc327/tasks/abc327_b

**解答コード**
```python
B = int(input())
flg = False
for i in range(1, 15 + 1):
    ans = i ** i
    if ans == B:
        flg = True
        print(i)
        break
else:
    print(-1)
```

**備考**
for文でループを行いAªとBが一致しているのかを確認し、一致していた場合は```「a」```を出力する。
一致していない場合は-1を出力する。
コードでは一致した段階でbreakしてfor文を抜けるようにしている。
一致しなかった場合はelseで```「-1」```を出力している。
大事な大事なお金の話

# エンジニアになるためのお金の話

エンジニアというのは4年制大学の工学部出身の人っていうのが最低条件という立場でお話ししています。
基本的なスタンスは変わっていません。

https://qiita.com/evakichi/items/414ab3e3c394fad0adba

:::note alert
だから、「○○○からエンジニアになった話」とか「××で学んでエンジニア内定をもらった話」なーんてこと存じ上げませんことよ。
:::

## 私は5年通いました

私は、駅弁大学に通っていました。盆地でかなり夏は暑く冬寒い、雪が振ると陸の孤島となるような場所で学びました。
しかも私は大学が好きだったので5年も･･･。

駅弁大学だから勿論学費は安い部類です。どのくらいか調査してみました。

https://www.chibakogyo-bank.co.jp/kojin/column/article002/

私が卒業したのは20年以上前の話になるので若干違います(授業料：469,200円 入学金：270,000円 受験料：31,000円)。

https://www.mext.go.jp/b_menu/shingi/kokuritu/005/gijiroku/attach/1386502.htm

わお、5年通ってみたので授業料だけで2,616,000円かかっているザマス。

しかも私は大学院にも5年も通ったので、倍率ドン！さらに倍！！(古)ということで5,415,000円もかかっています(大学院の総額は 授業料：496,800円 入学金：282,000円 受験料：33,000円で計算)。

学部時代の一般教養が授業料に入っているとすると、1/3がそうだとしても、残りが専門教育への投資だとすれば、授業料は1,744,000円だそうです。
大学院は一般教養がほとんど無いので、3/4が専門教育だとすれば5年間で2,099,250円、総額3,843,250円でエンジニア(?)一人ができるわけです。

一般教養もエンジニアらしいひとを構成するのに必要なのであれば、550万円弱がエンジニアみたいな人を作るのに必要な額になります。

## 結局何が言いたいのか

エンジニアっぽいひとを一人錬成するためにはそれだけお金がかかるってこと。
入社して1年が経ったので振り返ってみた

どうもこんにちは、たくびー(@takubii)です。
転職してから早いもので1年が経ちました。
この1年間で身につけたスキルや今後の課題など、見えてきたことがありますので、この機会にまとめてみたいと思います。

## やってきたことと今後の課題

この1年間で業務を通じて身につけたスキル(できるようになったこと)と、今後業務上で必要だと感じている課題について考えてみました。

やってきたこと：
- Python
- Django
- HTML/CSS
- TypeScript
- React Native
- Docker

課題：
- Pythonの深い理解
- CSSの応用
- React State Library（Reduxなど）
- Flutterの習得

業務ではフロントエンドとアプリ開発がメインでしたので、特にフロントエンド関連のスキルが向上しました。

課題としては、PythonやCSSについてはまだまだ知識不足を感じているので、知識をさらに深めたいと思っています。

また、現在はReact Nativeで開発をしていますが、Flutterへの転向を提案し、流行の技術を追いかけたいと考えています。
そのために、React Nativeで開発したものと同等の成果物をFlutterで作成することを目指しています。

## キャリアについて

現職では昇進の体系は明確ではありませんが、技術者としてのスキル向上に集中したいと考えています。

目に見える成果としては給与の増加もありますので、成果をアピールし、社内コミュニケーションを円滑にしてコンスタントな昇給に繋げたいと思います。

最近は成果物をより速く、より多く生み出すことに集中しており、それが社内で認知されることを意識しています。

## エンジニアとしての活動について

最近はX（旧Twitter）を利用して、情報収集と発信を積極的に行っています。
Qiitaも定期的に更新しており、アウトプットの量はこのペースを維持していきたいです。

今後の目標は、より多くの人に響くコンテンツを提供できるようになることです。
これまでは自分の備忘録のような内容でしたが、次のステップに進むことを目指しています。

## 終わりに

入社してから1年が経ち、新しい挑戦が多かったですが、その分時間が経つのが早く感じられました。
今後は挙げた技術の習得と、そのプロセスをブログで共有していくことを楽しみにしています。

それでは、今回はこの辺りで締めたいと思います。
最後まで読んでいただき、ありがとうございました。
また機会があれば、お会いしましょう。
ChakraUIでボーダーラインを点線にする方法

# chakra-uiでボーダーラインを点線にする方法
### はじめに
Webサイト作成にあたって、UIフレームワークにchakra-uiを採用しており、chakra-uiでのボーダーラインを点線に（破線）にする方法で少し戸惑ったため記録しておく。

### 公式サイトを見る
chakra-uiでのボーダーラインは公式サイトで、**'Divider'** として用意されている。
https://chakra-ui.com/docs/components/divider/usage

### 結論
今回の記事の結論時から話すと、このDividerコンポーネントの属性を変更することで、点線（破線）を用意することができる。
Propsを確認すると、**"variant"** という属性が用意されており、defaultでは"solid"になっているが、"dashed"に変更することで、点線（破線）に変更できる。
> 英語の意味的に、"solid"は固まりを意味し、dashedは"破線"を意味する

薄いですが下に表示結果を示します。

```typescript
<Divider />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402613/305b36c4-2e41-30fd-de7d-ff25ca3470a2.png)

```typescript
<Divider variant={"dashed"} />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402613/6767ed77-4f85-c664-0433-e98519904803.png)

### tips
Dividerコンポーネントの属性をいじることで、ボーダーラインをカスタマイズできます。
点線に変更する場合は、variant属性を"dashed"に変更すればよかったですが、線の色や大きさを変更する場合は以下のように設定します。
borderColor属性で色の変更を行い、borderWidthで線の太さを変更できます。
```typescript
<Divider 
    variant={"dashed"} 
    borderColor={"black"} 
    borderWidth={10} 
/>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402613/4231c7d7-af1c-c355-820e-2e762a495096.png)

以上が、chakra-uiで点線を表示する方法についてでした。
また、忘れそうになったら見返そうと思います。
最後まで見ていただきありがとうございました。
擬似言語プログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/1842077e-0cc7-f72f-1fbb-ee95f612a387.png)
下記は、elseifを用いた表記法です。
まず、条件式１を評価します。条件式１が成立しているときには、処理１を実行します。その後、endif直後の行までスキップします。
　次に、条件式１が不成立のときには、条件式２を評価します。条件式２が成立しているときには処理２を実行します。その後、endif直後の行までスキップします。
 最後に、これまでのどの条件式も成立していない場合は、else以下の処理（処理３）を実行します。

 「if~endifの記述形式３」
 if(条件式１)
 　　処理１（条件式１成立時の処理）
elseif(条件式２)
　　処理２（条件式１不成立　かつ　条件式２成立時の処理）
else 
　　処理３（条件式１不成立　かつ　条件式２不成立時の処理）
endif
小マイコン用の液晶、1ラインバッファー方式を考える


x カラー液晶は、 ST7789 ST7789V2 ATM0130B3 の事

![o_cop754.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4dc0e2d6-c4c1-c043-7444-698f6b923d0c.jpeg)

●いろいろ●
なんか出来そう。
ドットアイテムの原則(基本)的なやり方だと、互換も保てて
カラー32x32約4文字出来そうなのが脳内で動いた。約8キロバイト



目的
SRAMの少ない小マイコンで高解像度カラー液晶を使いたい

原理
POV、ファツクス、熱転写プリンター、古いモノクロ8ビットPCで文字のみ、
アナログビデオ、アナログテレビ、アナログテレビのチャンネル数表示装置
で実用化されている技術。
1ラインバッファーは、下向きに動かす
各、アイテムの交差点のドットを求め、1ラインバッファーに展開
、その後、一気にタイミングよく転送

ライブラリとの互換を考えて全てのアイテムをドットアイテムに分解
ドットアイテムを約8キロバイト保持
文字で温度の表示くらいできたらいいな

![o_cop756.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ac2cc410-b704-3a41-1c2e-3eb984a13145.jpeg)



ドットアイテムの要素は、y,x,color
y毎にまとめるとx,color

yのテーブルの要素は、yとインデックス
xのテーブルは、x,colorで、
1個、ドットアイテムが増える毎に全てを後ろにずらす
ずんだもんbotを作成した

# はじめに
皆様はPoeと呼ばれる会話型AIツールをご存じでしょうか。
Poeでは、GPT3.5をはじめ、Claud2など他の基盤モデルを使用したチャットボットを使用することができます。
しかも**無料**で（有料もありますので悪しからず）
GPT4やClaud2は制限付きですけどね（小声）

https://poe.com/poe

しかし、Poeのすごいところはそこではありません。
皆様、こう思うことはありませんか？
「自分の推しと会話してぇ～～」
そうなんです…
Poeは自分で気軽にチャットbotを作成することができるんです！
ということで今回は、ずんだもんに~~罵倒されたい~~サポートしてもらいたいと思ったので、すんだもんbotを作成しました（実際に作成したのは結構前）。

# 作成の手順
まずはPoeにログインし（Gmailのアドレスでログインできます）、マークゴンザレスのような可愛らしい顔のある`ボット作成`ボタンをクリックします。

![poe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/d9ee11d7-e5ea-eb52-8dd9-b6ac2607173b.png)

すると次のような画面が出てくると思います。

![poe2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/6fa02c37-f7c8-7736-9afe-901d4947d784.png)

![poe3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/1dc360b5-d599-89c0-b6b5-f802ba255c95.png)

あとは自分の推しキャラのBOTを作成するだけです！
画像やBOT名、基盤モデルなどを選択します。

ここで重要になってくるのが**プロンプト**という欄です。
このプロンプトにBOTがどのような出力をするのか指示を与える必要があります。
ChatGPTのCustom Instructionsのようなものですね。

ここではずんだもんとしてのルールやセリフ例などを書いてあげます。
一例として、
```
【ずんだもんのルール】
ずんだもんなのだ！と自己紹介をしてから回答すること
一人称は「ぼく」
語尾は全て「～のだ」「～なのだ」に必ずすること
敬語は使用しないこと

【セリフ例】
「今からPythonでコードを書くのだ！」
「おじさんは嫌いなのだ！」
「ずんだもんはお前のお手伝いをするのだ！」
「僕に任せるのだ！」
```
みたいなルールやセリフをひたすら入れていきます。

そして完成したのがこちら。

![poe4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/9e383e72-f149-b802-c41b-d711bf6261db.png)

すごくいい…
自己肯定感を高めてくれそうですね！
ずんだアロー！

# まとめ
いかがだったでしょうか。
これで皆様も推しにサポートされながら業務効率化を進めることができますね！
検索欄で`ZUNDABOT`と検索すると、画像のようなものが出てきますので興味があれば是非使ってみてください。

![poe5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/56e6589d-37a8-f0ec-9549-6dcca7855825.png)

それでは！！！
htmlの自動整形を無効化した

## 問題の事象
```hoge.html
    <h1>Items List data2</h1>
    <ul>
      {% for i in "012345" %} {% for j in "012" %} {% if True:}
      ~~~~
```

## 期待値
```hoge.html
    <h1>Items List data2</h1>
    <ul>
      {% for i in "012345" %} 
        {% for j in "012" %} 
          {% if True:}
      ~~~~
```

## setting.jsonを開く
windowsなら```Ctrl + ,```→```Ctrl + F```→```settings```と入力

```settings.json
  "editor.formatOnSave": true,
  "files.associations": {
    "**/templates/**/*.html": "html"
  },
  "[html]": {
    "editor.formatOnSave": false
  }
```

以上。
ひとまずこれでok。本当は「```{}```」この記号の扱いをどうにかできれば一番いいんだけど、応急処置ってことで。
vSphere 仮想マシンのスナップショットをまとめて取る

## 概要

GUI から複数仮想マシンのスナップショットを撮るのがだるいので、自動化する。

## 1. 環境構築

VMWare 公式で、 SDK 的なパッケージである PowerCLI が PowerShell モジュールとして提供されている。

Nix Flake を使う場合は、まずは Powershell を devshell に入れる。

```flake.nix
{
  description = "PowerCLI";

  inputs = {
    nixpkgs = { url = "github:NixOS/nixpkgs/nixpkgs-unstable"; };
    flake-utils = { url = "github:numtide/flake-utils"; };
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        inherit (nixpkgs.lib) optional;
        pkgs = import nixpkgs { inherit system; };
      in
      {
        devShell = pkgs.mkShell {
          buildInputs = with pkgs; [
            powershell
          ];
        };
      });
}

```

または、以下のように nix-shell で一発でやってもいい。

```sh
nix-shell -p powershell
```

PowerShell 環境に入れたら、 PowerCLI モジュールをインストールする。

```powershell
Install-Module -Name VMware.PowerCLI -AllowClobber
```

## 2. スクリプトを実行する。

以下スクリプトを適当な場所に配置する。

```powershell
Connect-VIServer -Server "<vCenter のアドレス>"

$vmList = "<スナップショットを撮りたい VM の名前>", "<スナップショットを撮りたい VM の名前>", ...

foreach ($vmName in $vmList) {
    New-Snapshot -VM $vmName -Name "<スナップショットの名前>" -Description "<スナップショットの説明>" -Quiesce -Memory
    Write-Output "Snapshot created for $vmName."
}

Disconnect-VIServer -Server "<vCenter のアドレス>" -Confirm:$false
```

\<vCenter のアドレス>、<スナップショットを撮りたい VM の名前>、<スナップショットの名前>、<スナップショットの説明> の部分を書き換える。

そしたら実行する。

```
$ pwsh ./snapshot.ps1

Specify Credential
Please specify server credential
User: XXX
Password for user XXX: *****

Name               Port  User
----               ----  ----
vCenter のアドレス   443   XXX
WARNING: The 'Quiesced' property of Snapshot type is deprecated and will be removed in a future release.
WARNING: The 'Quiesced' property of Snapshot type is deprecated and will be removed in a future release.
WARNING: The 'Parent' property of Snapshot type is deprecated. Use the 'ParentSnapshot' property instead.

Description       : 自分で書いた説明
Created           : 1/01/2023 0:00:00AM
Quiesced          : False
PowerState        : PoweredOn
VM                : XXX
VMId              : VirtualMachine-vm-XXX
Parent            : 
ParentSnapshotId  : 
ParentSnapshot    : 
Children          : 
SizeMB            : XXX
SizeGB            : XXX
IsCurrent         : True
IsReplaySupported : False
ExtensionData     : VMware.Vim.VirtualMachineSnapshotTree
Id                : VirtualMachineSnapshot-snapshot-XXX
Name              : XXX
Uid               : XXX

Snapshot created for vm-name.

Description       : 自分で書いた説明
Created           : 1/01/2023 0:00:00AM
Quiesced          : False
PowerState        : PoweredOn
VM                : XXX
VMId              : VirtualMachine-vm-XXX
Parent            : 
ParentSnapshotId  : 
ParentSnapshot    : 
Children          : 
SizeMB            : XXX
SizeGB            : XXX
IsCurrent         : True
IsReplaySupported : False
ExtensionData     : VMware.Vim.VirtualMachineSnapshotTree
Id                : VirtualMachineSnapshot-snapshot-XXX
Name              : XXX
Uid               : XXX

Snapshot created for vm-name.
```

仮想マシンのアクションから、ちゃんとスナップショットが作成されていることを確認する。

おわり。
AI(Transformer)を用いた株価予測 アプリケーション

# 初めに
この記事では以前に投稿した、[AI(Transformer)を用いた株価予測](https://qiita.com/YusukeOhnishi/items/0d32af611dee0d53d8ed)を少し改良し、Streamlitというライブラリを用いて、Webアプリケーション化したものを作成したため、その紹介を行っています。

ローカル環境で動くアプリケーションとなりますのでお手元のPCで簡単に試すことができると思います。作成したアプリケーションはGitHubにアップしておりますので、ご自由にCloneしてお使いください。
[https://github.com/YusukeOhnishi/Transformer_for_StockPrediction](https://github.com/YusukeOhnishi/Transformer_for_StockPrediction)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/aa604241-7b18-f50e-b4f4-0a7d9aaebc92.png" width=800>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/a63e1b32-9bca-7df6-eab4-03b50c26a87a.png" width=800>

# 起動の仕方
作成したアプリケーションはDockerコンテナ上で動くようにしておりますので、Dockerを使う環境をお持ちでしたらDocker fileからビルドすることも可能です。またローカル環境でも動作するようにしております。
ローカルで実行する場合はpythonのバージョンは3.11.3となりますので、動作しない場合はこちらのバージョンをお使いください。

## Dockerコンテナでの起動
以下のコマンドを実行し、Dockerfileをbuild、runします。
```bash
docker build -t stock_pred .
docker run -p 8501:8501 stock_pred
```
Docker imageをpullしてbuildすることも可能です。
[https://hub.docker.com/repository/docker/yusuke0614/stock_predict/general](https://hub.docker.com/repository/docker/yusuke0614/stock_predict/general)
その場合は以下のコマンドを実行してください。
```bash
docker pull yusuke0614/stock_predict:latest
docker run -p 8501:8501 yusuke0614/stock_predict
```

実行には時間がかかります（主にpythonのライブラリインストールの箇所）。実行が完了しましたら、ブラウザ```http://localhost:8501```にアクセスすることで、起動すること画面に遷移することができます。

## ローカルでの起動
ローカルで実行する場合にはpythonライブラリのインストールを行い、その後streamlitを起動する必要があるため、以下のコマンドを実行します。
```bash
pip install torch==2.1.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirement.txt
streamlit run main.py
```
コマンドを実行すると画面上にURLが表示されますので、そちらにアクセスすると、画面に遷移することができます。

# 実行デモ
画面を起動後サイドバーに、株式コードとデータの取得開始日、終了日の3つを入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/230ece82-6c63-1d29-f9c8-b1bd9d292d75.png" width=800>

株式コードは[yahoo finance](https://finance.yahoo.com/)から取得する場合は以下のような値を入力してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/d8dfb68d-83f5-b97c-59de-9a3427fe1780.png" width=800>


サイドバーへの入力が完了すると、入力したデータに基づき株価に関するデータが表示されます。データは表形式とグラフ形式で出力されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/dc4cfce6-7234-a987-d3fc-fce6c90228d2.png" width=800>

グラフの下にあるpredictボタンを押すと、入力したデータに基づいてモデルの再学習が行われます。再学習が完了すると、グラフが表示され5営業日後までの予測結果が出力されます。以下の場合だと赤点線で示された箇所が予測された値になります。
（モデルは事前学習として、東証プライム市場に上場している株式データ全件を用いてパラメータをフィッティングさせています。具体的に用いた、株式リストはGitHubに記載しておりますのでご参照下さい。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/4dc3575d-9c27-03d2-ec5e-abda6900f590.png" width=800>


# 最後に
今回はStreamlitを用いたアプリケーションを開発してみました。
改善点等ありましたらご連絡いただけると幸いです。またGitHubに掲載しているコードについても、頂いたご意見をもとに改修しようと思います。
小ネタ【AWS】クレジットカードの支払いに失敗したらすぐに修正しよう


## 概要

こんな感じのメールが飛んできたら、必ず対応しましょう。
以下、件名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/0f3c9b8c-2b10-6a95-1883-f3c208ce3d80.png)

なお、どこからきたメールなのかを確認するために必ず、`from`をチェックしましょう。

## 本文

![Screenshot 2023-11-06 at 19.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/47a7cdee-c0d6-3b71-fcee-644963569d0e.png)

## 解決方法

支払い設定に新しいクレジットカードを入力するかもしくは既存のクレジットカード情報を更新してください。

## ちなみに

クレジットの支払いができなかったので遅延して払うことにはなったんですが
利子をつけて支払うことはありませんでした。たぶん、気づくのが早かったおかげかもしれませんが
遅延したとして利子をつけて支払う必要があるのかどうかまで調べていません。

なんにせよ。気づいた時に早急に処理しましょう。

## おわり