OmniAICreator/Qiita-1.07M huggingface dataset:
SESで45歳目前にして危機感①

SESで45歳を目前に危機感を感じています。
今までは、仕事が途切れたことはありませんでしたが、
今仕事が途切れています。
私はC++、C#系の技術者としてずっと仕事をしてきて、
マネジメントやリーダーは一切していません。

そんな私ですが、最近はリモートで仕事をしたいと思っており、
会社にWEB系の仕事はないか会社に聞いていました。

でも、業界経験は長いがWEB系は未経験のため仕事が見つかりません。
未経験なので、それは仕方がないかなと思っていたのですが、
C#であれば何か仕事があるだろうと思っていましたが、未だ見つからずです。

かなり危機感を感じています。
面談する客先からすると、リーダー、PM経験がなく、
かつ、C++、C#でしかも組み込み系の経験しかない。
しかも40代なので単価も高い。厳しいに決まっています。
入れるとすれば、運よく私の経験にマッチし、
かつ、人が見つからずどうしようもないという状況でないと難しいです。

今はSES営業さんからの連絡を待ちつつ、
WEB系のプログラミングとかを勉強していたのですが、
それは暢気過ぎる気がしてきました。
寝惚けていました。

ちょっと、真剣になんとかしなければと思っています。
nrf52840のSerial通信で64バイト以上のデータを受信する方法

# はじめに
<!-- 発端や概要を記載 -->
こんにちは、mmiiiiiです。
大学の研究で、nrf52840を用いてデータの送受信を行っていたのですが、バッファサイズの上限で少しはまったことがあったので、記事にしました。
大学ではIoTの研究を行っていますが、特別詳しいわけではないので、間違っている部分があったら指摘していただけるとありがたいです。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [バッファサイズの変え方](#Chapter1)
1. [おわりに](#end)
1. [参考文献](#reference)


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# バッファサイズの変え方
## Serial通信の問題
まず、Serial通信はデフォルトの設定で64バイトまでしか、データを送受信することができません。（まあ、IoTなので少量のデータ通信で問題ないからあたりまえ）
64バイト以上のデータを処理するにはSerial通信のバッファ上限を変える必要があります！
そこで、[Arduinoシリアル通信の上限(バッファサイズ)を4倍にする話](https://blog.revetronique.com/arduino_serial/)この記事を参考にArduinoのバッファサイズを変えるものの...

### <font color=Red>Buffer_sizeが変わらない！！！</font>

この記事の設定はArduinoのバッファサイズを変更してしまいます。
今回変えたいのは、nrf52840のバッファサイズ！
なので、nrf52840のlibraryのバッファサイズを変更する必要があるのです！
私のPCのパスだと
\AppData\Local\Arduino15\packages\Seeeduino\hardware\nrf52\1.1.4\cores\nRF5\RingBuffer.h
このファイルになります！
このファイルのBUFFER_SIZEの部分を128に変更するとSerial通信で64バイト以上のデータ受信を行えるようになります。

<a id="end"></a>
# おわりに
今回はnrf52840のSerial通信で64バイト以上のデータを受信する方法を記事にさせていただきました。
文章だけではイメージがわかないと思うので、コードや実際の写真を今後、追加していこうと考えています！

<a id="#reference"></a>
# 参考文献
- [Arduinoシリアル通信の上限(バッファサイズ)を4倍にする話](https://blog.revetronique.com/arduino_serial/)
2023年 資格取得計画 lpicレベル1 101 DVA合格目指す

# はじめに
**今年の12月までにLPICレベル1 101とDVAを受験して合格したいです。**
そのために毎日の勉強計画を作成しました。

平日は毎日2H勉強する 7時に起きる
linux  朝 1時間 　8時～9時
AWS    夜 1時間　 21時～22時

運用保守メインで10年目のため、DVA周りの知識はないため苦戦しています。

## DVA
**ポケットスタディを一通り読む 3日で一章のペースで読む**
https://www.amazon.co.jp/dp/4798063401

理解不足なサービスはネットで検索やブラックベルトを見る
ポケットスタディを一通り読んだらWEB問題集を解く

## 資格試験 LPICレベル1 101

### ping-tを解く　毎日 30問以上解く
https://ping-t.com/user.php

知識不足な部分は本とUdemyを見る
#### 小豆本を読む
https://www.amazon.co.jp/dp/4798160490

#### Udemy
【短時間でサクッとわかる】LPICレベル1 101試験講座＋問題集 Version 5.0対応
https://www.udemy.com/course/lpic1-101-version-50/learn/lecture/39092078?start=135#overview

# まとめ
日々の継続が大事です。コツコツ頑張ります。
[Python] pathlibとosモジュールの対応

# pathlibとは

- ファイルやディレクトリを操作するPython標準パッケージ
- os.pathより高水準
    - 連続して操作するときに可読性が上がる
    - 末尾の / の有無を意識する必要がない
    - 拡張子やファイル名の置き換えが簡単
    - ワイルドカード検索が可能

# pathlibとosモジュールの対応表

| 内容 | os | pathlib |
| --- | --- | --- |
| シンボリックリンクを解決せずに絶対パス化 | os.path.abspath() | Path.absolute() |
| シンボリックリンクを解決して絶対パス化 | os.path.realpath() | Path.resolve() |
| ファイルのモードとアクセス権限を変更 | os.chmod() | Path.chmod() |
| ディレクトリ作成 | os.mkdir() | Path.mkdir() |
| 再帰的にディレクトリ作成 | os.makedirs() | Path.mkdir() |
| 名前変更 | os.rename() | Path.rename() |
| 名前変更 | os.replace() | Path.replace() |
| ディレクトリ削除 | os.rmdir() | Path.rmdir() |
| ファイル削除 | os.remove(), os.unlink() | Path.unlink() |
| 現在の作業ディレクトリ | os.getcwd() | Path.cwd() |
| ファイル、ディレクトリの存在確認 | os.path.exists() | Path.exists() |
| ホームディレクトリの取得 | os.path.expanduser() | Path.expanduser() および Path.home() |
| ディレクトリ内のパスを取得 | os.listdir() | Path.iterdir() |
| ディレクトリ判定 | os.path.isdir() | Path.is_dir() |
| ファイル判定 | os.path.isfile() | Path.is_file() |
| シンボリックリンク判定 | os.path.islink() | Path.is_symlink() |
| ハードリンクの作成 | os.link() | Path.hardlink_to() |
| シンボリックリンクの作成 | os.symlink() | Path.symlink_to() |
| シンボリックリンクが指すパスを取得 | os.readlink() | Path.readlink() |
| 指定パスから現在のパスへの相対パスを取得 | os.path.relpath() | PurePath.relative_to() |
| ファイルまたはファイルディスクリプタの状態を取得 | os.stat() | Path.stat(), Path.owner(), Path.group() |
| 絶対パス判定 | os.path.isabs() | PurePath.is_absolute() |
| パス結合 | os.path.join() | PurePath.joinpath() |
| パス要素の末尾 | os.path.basename() | Purepath.name |
| パスの論理的な上位パス | os.path.dirname() | PurePath.parent |
| パス比較 | os.path.samefile() | Path.samefile() |
| 末尾の要素の拡張子の扱い | os.path.splitext() | PurePath.stem and PurePath.suffix |

# 演算子によるPathの結合

```python
>>> from pathlib import Path
>>> path = Path("hoge") / "test" / "a.txt"
>>> print(path)
hoge/test/a.txt
```

# シンボリックリンクを解決せずに絶対パス化

| シンボリック | シンボリック先 |
| --- | --- |
| hoge | /Users/ikegami/Applications |

```python
>>> import os
>>> os.path.abspath("hoge")
'/Users/ikegami/Desktop/hoge'
>>> from pathlib import Path
>>> Path("hoge").absolute()
PosixPath('/Users/ikegami/Desktop/hoge')
```

# シンボリックリンクを解決して絶対パス化

| シンボリック | シンボリック先 |
| --- | --- |
| hoge | /Users/ikegami/Applications |

```python
>>> import os
>>> os.path.realpath("hoge")
'/Users/ikegami/Applications'
>>> from pathlib import Path
>>> Path("hoge").resolve()
PosixPath('/Users/ikegami/Applications')
```

# ファイルのモードとアクセス権限を変更

## 実行前

| ディレクトリ名 | 権限 |
| --- | --- |
| hoge | d-w--w--w- |

## 実行後

| ディレクトリ名 | 権限 |
| --- | --- |
| hoge | drwxrwxrwx |

```python
>>> import os
>>> os.chmod("hoge", 0o777)
>>> from pathlib import Path
>>> Path("hoge").chmod(0o777)
```

# 参考

- [pathlib --- オブジェクト指向のファイルシステムパス](https://docs.python.org/ja/3/library/pathlib.html)
- [python pathlibの使い方メモ](https://qiita.com/studio_haneya/items/11c9e825bd8068af7e87)
Eslint - .eslintrc の書き方が分からない ( rules とプラグイン単位の設定 )

# EslintプラグインのREADMEを見る

例えばプラグインのRulesの説明にこんな風に書かれている (一部省略)

https://github.com/francoismassart/eslint-plugin-tailwindcss/blob/master/docs/rules/no-custom-classname.md

```js
...
"tailwindcss/no-custom-classname": [<enabled>, {
  "config": <string>|<object>,
  "whitelist": Array<string>,
}]
...
```

でなにをどこに書けば良いのか？と。

この場合、

- 配列の1個目 -> 文字列で  `enabled` -> `off` `warn` `error` のどれかを指定する
- 配列の2個目 -> オブジェクトで他のプロパティを指定する。たとえば  whitelist であれば文字列の配列を指定する。

ということのようだ。
rulesの構造はプラグインによって割と自由っぽい。



## 具体例

これを設定に適用すると以下の通り
( rules 以外のプロパティはここでは省略 )

```js
module.exports = {
  rules: {
    "tailwindcss/no-custom-classname": [
      "error",
      {
        config: 'tailwind.config.js',
        whitelist: ["xxx", "yyy"],
      },
    ],
  },
};
```

# プラグインの全体設定

かと思えばルール単位ではなくプラグイン全体の設定が用意されていることもあるようだ。
突然として現れた settings tailwindcss という階層。

eslint-plugin-tailwindcss の例:

```js
{
  settings: {
    tailwindcss: {
      config: "tailwind.config.js",
      whitelist: [],
    },
  },
}
```

https://github.com/francoismassart/eslint-plugin-tailwindcss

## 具体例

この場合の適用例は以下の通り
( settings 以外のプロパティはここでは省略 )

```js
module.exports = {
  settings: {
    tailwindcss: {
      config: "tailwind.config.js",
      whitelist: ['xxx', 'yyy'],
    },
  },
}
```




# Note

- まだまだドキュメントから具体的な書き方を読み取ることが難しい。抽象ではなくお願いなので何か1個でも具体例を書いてくれないだろうか。



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
RX-8025NB　microPythonで備忘録

RX8025NBを秋月で買いました。
https://akizukidenshi.com/catalog/g/gK-08585/
まだ使いこなせませんが備忘録です。

## 1,I2Cのアドレス
32h　です。

## 2,ESP32のI2Cの設定
i2cの設定はソフトi2cで行う。（あっちこっちのサイトで見るとまだ不具合かどうかうまく動かない）
↓の例の通り　RX8025はこうなった。
```pyton:main.py
>>> import machine
>>> i2c = machine.I2C(1,scl=machine.Pin(19), sda=machine.Pin(23), freq=40000)
```
## 3,読み出し方
### (1)3パターンあるが、一番簡単なアドレスFhからだらだら取り出しはこれが一番簡単

    device_address = 0x32
    data = i2c.readfrom(device_address, 16)

### (2)アドレスを指定する。

    i2c.readfrom_mem(0x32,0xF4, 1)


これでアドレスFを1バイト読み出し。
Fの後ろの４が味噌

## 4,電源ONして最初に見るところ
    RX8025NBのアドレスFhを見てbit4に1が立ってたら初期化が必要。

## 5,書き込み

    i2c.writeto_mem(0x32,0xF0, b'\x00')

↑↑でアドレスFに00を書き込んで初期化している。


## 6,割り込みの設定
アドレスEで設定。
アドレスFのbit2でくるくる0→1と変わるはずだが。。。
まだ、うまく動かない。。。。

## その他
↓↓読み出すとこんな風にいろんな文字が出てくるのはなんでだろう？
b'\x04F\t\t\x04\x07\x10#\x00\x7f?\x7f\x7f?\x00$'
※レベル低すぎるのばっかりでごめんなさい。
【SwiftUI】カメラを使いたい

# はじめに
SwiftUIでカメラを使いたいと思ってもUIKitをコネコネしないと使えず、
めんどくさいのでコピペで使えるコードを記事にしておきます

# 準備
Info.plistに以下の設定が必要です。

|Key|Value|
|-|-|
|Privacy - Camera Usage Description|任意の文字列|

![スクリーンショット 2023-10-07 19.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dd195715-fec9-45d9-693c-44aca5ac91fe.png)

# 実装
```swift
import SwiftUI

public struct CameraView: UIViewControllerRepresentable {
    @Binding private var image: UIImage?

    @Environment(\.dismiss) private var dismiss

    public init(image: Binding<UIImage?>) {
        self._image = image
    }

    public func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    public func makeUIViewController(context: Context) -> UIImagePickerController {
        let viewController = UIImagePickerController()
        viewController.delegate = context.coordinator
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            viewController.sourceType = .camera
        }

        return viewController
    }

    public func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
}

extension CameraView {
    public class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        let parent: CameraView

        init(_ parent: CameraView) {
            self.parent = parent
        }

        public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
            if let uiImage = info[.originalImage] as? UIImage {
                self.parent.image = uiImage
            }
            self.parent.dismiss()
        }

        public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            self.parent.dismiss()
        }
    }
}
```

# 使い方
```swift
import SwiftUI

struct ContentView: View {
    @State private var isPresentedCameraView = false
    
    @State private var image: UIImage?

    var body: some View {
        VStack {
            Button {
                isPresentedCameraView = true
            } label: {
                Text("カメラ表示")
            }
            
            if let image {
                Image(uiImage: image)
                    .resizable()
                    .scaledToFit()
                    .frame(width: 300)
            }
        }
        .fullScreenCover(isPresented: $isPresentedCameraView) {
            CameraView(image: $image).ignoresSafeArea()
        }
    }
}
```

# おわり
これで簡単にカメラが使えます！
Eslint - .eslintrc のファイル形式・拡張子

# ファイル形式

色々なファイル形式に対応している

- .eslintrc.js / .eslintrc.cjs - Javascipt形式 ( 値を動的に生成する場合はこれを選ぶ )
- .eslintrc.json - JSON形式
- .eslintrc.yml - YAML形式
- .eslintrc - コメントの入れられるJSON形式のようだが非推奨のようだ

どの形式でもプロパティの構成は同じ

# .eslintrc の生成

コマンドを使うと対話形式で作成してくれる。(選択肢が多い)

```
 npm create @eslint/config
```

ファイル形式を聞かれるステップがあるのでここで好きな形式を答えると良い

```
? What format do you want your config file to be in? …
❯ JavaScript
  YAML
  JSON
```

# Javascriptファイル の例

```cjs
module.exports = {
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/recommended"
    ],
    "overrides": [
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
    }
}
```

# JSONの例

```json
{
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/recommended"
    ],
    "overrides": [
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
    }
}
```

# YAML の例

```yaml
env:
  browser: true
  es2021: true
extends:
  - eslint:recommended
  - plugin:@typescript-eslint/recommended
overrides: []
parser: '@typescript-eslint/parser'
parserOptions:
  ecmaVersion: latest
  sourceType: module
plugins:
  - '@typescript-eslint'
rules: {}
```


# 参考

- [ESLintのルールを全部手動で設定するのは大変だからやめて ...](https://qiita.com/khsk/items/0f200fc3a4a3542efa90)
- [ESLint 設定を作成する技術](https://zenn.dev/januswel/articles/402774d76424e71ac906)
ONU を交換したら MAP-E の固定 IPv4 が固定されなくなってしまった話

かなりニッチな問題に悩まされたログ。

## 背景
- NTT フレッツ光
- プロバイダは OCN の IPoE + OCNバーチャルコネクト + 固定IP1 の契約をしていた
- YAMAHA ルータから IPoE + OCNバーチャルコネクト 設定

## 発生した問題
諸事情あり、フレッツの ONU が交換となった。

開通確認は問題なく完了し、特に何も設定を変えていない YAMAHA ルータを起動したところ、、、

**「IPv4 アドレス変わってね？？？」**

IPv4 アドレスは固定のはずなのに固定されていない、設定をいくら見直しても何を試しても直らない。。。(半日以上費やした)

## 原因
- MAP-E では、プロバイダ側で (？)「IPv6 Prefix」と「IPv4 アドレス」が紐づけされており、接続時には紐付けられている IPv4 アドレスが割り当てられる仕組みになっている
- ONU の交換で IPv6 Prefix が変わったことにより、IPv4 アドレスと紐づかなくなり、いつもとは異なる IPv4 アドレスが割り当てられた

## 対処
OCN のサポートによると「ほっておけばそのうち紐づいて元の IPv4 アドレスに戻る」らしいが、それが何日かかるかはわからない。

早く紐づけしたい場合には「アドレス解決サーバー」に IPv6 Prefix を通知することで紐付けさせることができるらしい。

http://www.rtpro.yamaha.co.jp/RT/docs/ocn_map_e/index.html#setting3

> 以下の場合にLAN1側IPv6アドレスをアドレス解決サーバーへ通知することで、トンネル経由の通信の再開を早めることができます。

この YAMAHA のドキュメントに記載の Lue スクリプトを読んでみると、要はアドレス解決サーバに HTTP リクエストを投げてやればよいらしい。

当該ネットワーク配下に接続した PC の Web ブラウザから `{アドレス解決システムのURL}?hostname={アドレス解決システムのホスト名}` という URL のページにアクセスすると、Basic 認証を求められるのでアドレス解決システムのユーザ名とパスワードを入れる。

すると `Good` と表示されたので、よくわからないけどうまくいったらしい。

ルータ側でネットワークの再接続が必要だったかどうかはわからないが、10分くらいで IPv4 アドレスが以前の固定 IP に戻っていた。
<storybook>ReferenceError: process is not defined

storybook v7.4.6(vite)
next.js v13.4
pnpm v8

storybook に aliasを追加した時に出たエラー。

```ts:main.ts
// ...
async viteFinal(config) {
    config.resolve = {
      // alias 追加
      alias: [
        {
          find: '@/components',
          replacement: path.resolve(__dirname, '../components'),
        },
        {
          find: '@/lib',
          replacement: path.resolve(__dirname, '../lib'),
        },
        {
          find: '@',
          replacement: path.resolve(__dirname, '../app'),
        },
      ],
    }
    return config
}

```

```bash
ReferenceError: process is not defined
    at node_modules/.pnpm/util@0.12.5/node_modules/util/util.js (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-VYSMOPAB.js?v=c5b7c852:3666:5)
    at __require2 (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-AUZ3RYOM.js?v=c5b7c852:18:50)
    at node_modules/.pnpm/assert@2.1.0/node_modules/assert/build/internal/assert/assertion_error.js (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-VYSMOPAB.js?v=c5b7c852:4593:20)
    at __require2 (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-AUZ3RYOM.js?v=c5b7c852:18:50)
    at node_modules/.pnpm/assert@2.1.0/node_modules/assert/build/assert.js (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-VYSMOPAB.js?v=c5b7c852:6054:26)
    at __require2 (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-AUZ3RYOM.js?v=c5b7c852:18:50)
    at http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-VYSMOPAB.js?v=c5b7c852:6567:24
    at node_modules/.pnpm/doctrine@3.0.0/node_modules/doctrine/lib/utility.js (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-VYSMOPAB.js?v=c5b7c852:6568:7)
    at __require2 (http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-AUZ3RYOM.js?v=c5b7c852:18:50)
    at http://localhost:6006/node_modules/.cache/sb-vite/deps/chunk-VYSMOPAB.js?v=c5b7c852:6579:17
```


# 解決策
vite が `process` をサポートしていないため Next.js の環境変数の解決周りの噛み合わせで起きているらしい。
process.env を適当に定義してあげると解消。
```ts:main.ts
// ...
async viteFinal(config) {
    config.define = { 'process.env': {} }, // 追加
    config.resolve = {
      // ...
}
```

一時的な対応なのであまり良くないかも。
Next.js が webpack なら storybookも webpack の方が良い気がする。。


# 参考
https://github.com/storybookjs/storybook/issues/18920
Google日本語入力キーバインディング設定の状態とコマンド一覧

# 状態
| 状態 | 日本語名 |
| --- | --- |
|  DirectInput | 直接入力 |
| Precomposition | 入力文字なし |
| Composition    | 変換前入力中 |
| Suggestion | サジェスト表示中 |
| Prediction | サジェスト選択中 |
| Coversion | 変換中 |

# コマンド
### 基本操作
| コマンド | 日本語名 |
| --- | --- |
| Backspace | 左の文字を削除 | 
| Delete | 右の文字を削除 | 
| MoveCursorLeft | カーソルを左に移動 | 
| MoveCursorRight | カーソルを右に移動 | 
| MoveCursorToBeginning | カーソルを左端に移動 | 
| MoveCursorToEnd | カーソルを右端に移動 | 
| Cancel | キャンセル | 
| Undo | 確定取り消し | 
| Commit | 確定 | 

### 文字入力
| コマンド | 日本語名 |
| --- | --- |
| InsertAlternateSpace | 代替空白文字を入力 | 
| InsertFullSpace | 全角空白を入力 | 
| InsertHalfSpace | 半角空白を入力 | 
| InsertSpace | 空白を入力 | 
| InsertCharacter | 不明(入力文字を出力？) | 

### 変換操作
| コマンド | 日本語名 |
| --- | --- |
| Convert | 変換 | 
| ConvertWithoutHistory | 学習を使わずに変換 | 
| CommitFirstSuggestion | 最初の予測候補を確定 | 
| ConvertNext | 次候補を選択 | 
| ConvertNextPage | 次候補ページを選択 | 
| ConvertPrev | 前候補を選択 | 
| ConvertPrevPage | 前候補ページを選択 | 
| DeleteSelectedCandidate | 選択候補を履歴から削除 | 
| PredictAndConvert | 予測変換 | 
| Reconvert | 再変換 | 
| Revert | 最後の学習をキャンセル | 

### 文節操作
| コマンド | 日本語名 |
| --- | --- |
| CommitOnlyFirstSegment | 最初の文節のみを確定 | 
| SegmentFocusFirst | 文節を左端に移動 | 
| SegmentFocusLast | 文節を右端に移動 | 
| SegmentFocusLeft | 文節を左に移動 | 
| SegmentFocusRight | 文節を右に移動 | 
| SegmentWidthExpand | 文節を伸ばす | 
| SegmentWidthShrink | 文節を縮める | 

### 文字種変換
| コマンド | 日本語名 |
| --- | --- |
| ConvertToFullAlphanumeric | 全角英数に変換 | 
| ConvertToFullKatakana | 全角カタカナに変換 | 
| ConvertToHalfAlphanumeric | 半角英数に変換 | 
| ConvertToHalfKatakana | 半角カタカナに変換 | 
| ConvertToHalfWidth | 半角に変換 | 
| ConvertToHiragana | ひらがなに変換 | 

### 状態遷移基本
| コマンド | 日本語名 |
| --- | --- |
| CancelAndIMEOff | キャンセル後 IME を無効化 | 
| IMEOff | IME を無効化 | 
| IMEOn | IME を有効化 | 

### 表示切替
| コマンド | 日本語名 |
| --- | --- |
| DisplayAsFullAlphanumeric | 全角英数に表示切替 | 
| DisplayAsFullKatakana | 全角カタカナに表示切替 | 
| DisplayAsHalfAlphanumeric | 半角英数に表示切替 | 
| DisplayAsHalfKatakana | 半角カタカナに表示切替 | 
| DisplayAsHalfWidth | 半角に表示切替 | 
| DisplayAsHiragana | ひらがなに表示切替 | 

### 入力切替
| コマンド | 日本語名 |
| --- | --- |
| InputModeFullAlphanumeric | 全角英数に入力切替 | 
| InputModeFullKatakana | 全角カタカナに入力切替 | 
| InputModeHalfAlphanumeric | 半角英数に入力切替 | 
| InputModeHalfKatakana | 半角カタカナに入力切替 | 
| InputModeHiragana | ひらがなに入力切替 | 
| InputModeSwitchKanaType | 次のかな文字種に入力切替 | 
| SwitchKanaType | ひらがな・カタカナを切替 | 
| ToggleAlphanumericMode | 英数入力切り替え | 

### IME機能
| コマンド | 日本語名 |
| --- | --- |
| LaunchConfigDialog | プロパティを起動 | 
| LaunchDictionaryTool | 辞書ツールを起動 | 
| LaunchWordRegisterDialog | 単語登録を起動 | 

#### メモ
Altキー等、ショートカットに使用できないキーがあることに注意
修飾キー無しのアルファキーは設定ファイルを手書きすることで使用可能
Databricksマーケットプレイスでunerryのショッパーみえーるサンプルを試す

こちらのニュースを見てからまだ試していませんでした。

https://www.unerry.co.jp/news/databricks-marketplace/

マーケットプレイスで`unerry`と検索します。
![Screenshot 2023-10-07 at 17.34.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3ff3af8a-6455-5b1a-b815-647e22430dba.png)

(当たり前ですが)日本語での説明文でわかりやすいです。
![Screenshot 2023-10-07 at 17.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2326e681-0f8c-b369-676c-fe6cf6fd80fe.png)

**即時アクセス**を取得をクリックします。そのまま取り込んでも大丈夫ですが、**その他のオプション**を展開して、取り込み先のカタログ名を変更します。
![Screenshot 2023-10-07 at 17.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/834bf8fe-4f1e-dd15-1b38-cee5983c57d5.png)

カタログにデータが取り込まれました。
![Screenshot 2023-10-07 at 17.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef4ae90a-a7a0-1f07-e591-6971e50671d7.png)

サンプルノートブックが添付されているので、これもインポートします。
![Screenshot 2023-10-07 at 17.36.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9cd6fa31-c9ce-9f6a-7f76-aea119925842.png)

こちらもコメントが日本語なので助かります。
![Screenshot 2023-10-07 at 17.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71d121fa-3096-219d-0cb7-5dc8b8e820dd.png)

ノートブックを実行していきます。途中のカタログ名は適宜変更します。

```py
spark_df = spark.sql("select * from `unerry_catalog`.default.sample_st_daily_visitor order by date")
spark_df.display()
```
![Screenshot 2023-10-07 at 17.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/89496437-4bac-4a0c-e39e-45044aafd1e1.png)

日本の店舗名なのでリアリティが増します。
![Screenshot 2023-10-07 at 18.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6b41d53d-2cdf-5613-b06e-0a850aef4fc0.png)
![Screenshot 2023-10-07 at 18.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/da73fb59-5973-b84c-cea9-a82bce132144.png)
![Screenshot 2023-10-07 at 18.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/47ef4a45-f897-59b4-4e4c-66bc88015d51.png)

なお、データ自体は[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)で管理されていますので、[Lakeview](https://qiita.com/taka_yayoi/items/4175cac499b5629de5a3)などその他のDatabricksの機能でも活用できます。
![Screenshot 2023-10-07 at 18.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fb74c2eb-01b3-d94a-9baa-8278c1d1b87f.png)


プロバイダー募集中なので、興味がある方はこちらをご覧ください！

https://docs.databricks.com/ja/marketplace/get-started-provider.html


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
csv を1行ずつ struct に読み込むやつ

# モチベーション

csv を1行ずつ読んで struct にパースして yield みたいなのがやりたかった。
csvutil の中では1行ずつ読み出してるので巨大な csv でもいけるはず。

サンプルデータは titanic で。
https://github.com/datasciencedojo/datasets/blob/master/titanic.csv


# コード

```go
package main

import (
	"encoding/csv"
	"flag"
	"fmt"
	"io"
	"os"

	"github.com/jszwec/csvutil"
)

type Titanic struct {
	C1  int32   `csv:"PassengerId"`
	C2  int32   `csv:"Survived"`
	C3  int32   `csv:"Pclass"`
	C4  string  `csv:"Name"`
	C5  string  `csv:"Sex"`
	C6  string  `csv:"Age"`
	C7  string  `csv:"SibSp"`
	C8  string  `csv:"Parch"`
	C9  string  `csv:"Ticket"`
	C10 float32 `csv:"Fare"`
	C11 string  `csv:"Cabin"`
	C12 string  `csv:"Embarked"`
}

func eachLineCsv[T any](filename string, ch chan T) error {
	defer close(ch)

	var r io.Reader
	switch filename {
	case "", "-":
		r = os.Stdin
	default:
		// fmt.Println("OPEN FILE: " + filename)
		f, err := os.Open(filename)
		if err != nil {
			return err
		}
		defer func() {
			// fmt.Println("CLOSE FILE: " + filename)
			f.Close()
		}()
		r = f
	}

	csvReader := csv.NewReader(r)
	csvReader.Comma = ','

	dec, err := csvutil.NewDecoder(csvReader)
	if err != nil {
		return err
	}

	for {
		var u T
		err := dec.Decode(&u)
		if err == io.EOF {
			break
		} else if err != nil {
			return err
		}
		ch <- u
	}

	// fmt.Println("END OF DATA")
	return nil
}

func main() {
	inputfile := flag.String("input", "", "入力ファイル(tsv)")
	flag.Parse()

	ch := make(chan Titanic)
	go eachLineCsv(*inputfile, ch)
	for v := range ch {
		fmt.Printf("%+v\n", v)
	}
}
```

## 確認


```bash
$ go run main.go <train.csv | wc -l
891

$ go run main.go <train.csv | tail
{C1:882 C2:0 C3:3 C4:Markun, Mr. Johann C5:male C6:33 C7:0 C8:0 C9:349257 C10:7.8958 C11: C12:S}
{C1:883 C2:0 C3:3 C4:Dahlberg, Miss. Gerda Ulrika C5:female C6:22 C7:0 C8:0 C9:7552 C10:10.5167 C11: C12:S}
{C1:884 C2:0 C3:2 C4:Banfield, Mr. Frederick James C5:male C6:28 C7:0 C8:0 C9:C.A./SOTON 34068 C10:10.5 C11: C12:S}
{C1:885 C2:0 C3:3 C4:Sutehall, Mr. Henry Jr C5:male C6:25 C7:0 C8:0 C9:SOTON/OQ 392076 C10:7.05 C11: C12:S}
{C1:886 C2:0 C3:3 C4:Rice, Mrs. William (Margaret Norton) C5:female C6:39 C7:0 C8:5 C9:382652 C10:29.125 C11: C12:Q}
{C1:887 C2:0 C3:2 C4:Montvila, Rev. Juozas C5:male C6:27 C7:0 C8:0 C9:211536 C10:13 C11: C12:S}
{C1:888 C2:1 C3:1 C4:Graham, Miss. Margaret Edith C5:female C6:19 C7:0 C8:0 C9:112053 C10:30 C11:B42 C12:S}
{C1:889 C2:0 C3:3 C4:Johnston, Miss. Catherine Helen "Carrie" C5:female C6: C7:1 C8:2 C9:W./C. 6607 C10:23.45 C11: C12:S}
{C1:890 C2:1 C3:1 C4:Behr, Mr. Karl Howell C5:male C6:26 C7:0 C8:0 C9:111369 C10:30 C11:C148 C12:C}
{C1:891 C2:0 C3:3 C4:Dooley, Mr. Patrick C5:male C6:32 C7:0 C8:0 C9:370376 C10:7.75 C11: C12:Q}
```

## cf.

https://github.com/jszwec/csvutil

https://medium.com/eureka-engineering/go-read-from-stdin-or-file-bb7a9197b904
AtCoder入水記事！！

# はじめに
皆さんこんにちは。[@Toncochan](https://twitter.com/RamSeiya1021)です。
AtCoderで入水したので、振り返りをしたいと思います。
※テスト後で少々落ち込んでます。
# おまえ誰？
Twitterで自己紹介してないので、知らなかった人が多いと思います。
```tex
学年：高1(学校はAJLでばれてしまう...)
得意科目：数学
趣味：ピアノ、プログラミング、バスケ
好きな音楽：Beatles
好きなご飯：親のご飯
```
# 写真集
嬉しくて何度も見返した
![EDAF83E4-BF6C-4899-A4F8-792B183B243E_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863676/373f9ee6-75fe-e6e3-3702-986dd7aa8f43.jpeg)
![Screenshot 2023-10-07 at 17.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863676/ea1a8805-8167-38dc-37ef-e2d1373cb4a7.png)
# 振り返り
緑の期間が長くてしんどい...その分今回の入水は達成感が半端なかったです。僕は競プロ界隈の天才高校生に比べると圧倒的に頭が悪いので、競プロを始めた当初は、レートが1000超えたら本当にすごいと思っていました。そんな僕でも水色になれたので今灰、茶、緑の人たちは自信を持ってほしいと思います！
# 何やったん？
とりあえずABC埋めをしました。「ABC()色バチャ」みたいなバチャに参加するといいと思います。
# 精進の仕方
20分ぐらい考えて分かんない〜〜〜ってなったときは、解説や解説動画を見て、後回しにせず理解することに専念しました。競プロは問題を(丁寧に)解けば解くほど強くなると信じているので、一生懸命考えた問題はその場で自分の物にするべきだと思います。
# 終わりに
青色になれるよう、焦らず確実に精進します！
青ストリークをしたいです！
# 終わりに 2
ダンクしたい〜〜〜
Nuxt + tailwind + Eslint – template の style タグ指定でエラー ( Classname 'foo' is not a Tailwind CSS class! )

# コード例

style でクラスを指定しても Tailwind のクラスを使っていないとエラーで怒られる

```vue
<template>
  <div class="foo"></div>
</template>

<style scoped>
.foo {
  color: red;
}
</style>
```

# 解決 -A

Eslintの設定 ( 例 `eslintrc.js` ) でクラス名をホワイトリスト指定する


`eslintrc.js` の例

```js
module.exports = {
  settings: {
    tailwindcss: {
      whitelist: ['foo'],
    },
  },
}
```

正規表現も指定できるようなので
命名規則を決めておくと楽かもしれない

 ( 例 `foo-.+` をホワイトリスト指定すれば `foo-xxx` も `foo-yyy` も許容される )



https://github.com/francoismassart/eslint-plugin-tailwindcss/tree/master#optional-shared-settings

https://github.com/francoismassart/eslint-plugin-tailwindcss/blob/master/docs/rules/no-custom-classname.md

# 解決 - B

Tailwindの設定 ( 例: `tailwind.config.js`  ) でカスタムのクラス名 ( `thema` > `extend`  )を作って style タグでの指定はしない

https://tailwindcss.com/docs/configuration

# 感想

「Tailwind入れたら全部Tailwindのクラス名で指定をしなさい」っていう方向性なのかもしれない

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
[メモ]Text generation web UI(1.6.1)でLLMと会話する


# はじめに

https://qiita.com/umauma-hagihagi/items/1f0351d6afa6fc14b2d1

前回、Text generation web UIの導入ができました。
今回は実際にモデルをダウンロードして利用していきます。

# 環境

OS: windows11 pro
CPU: Core(TM) i7-13700K
メモリ: DDR4 128GB
GPU:GEFORCE 4070ti
仮想化:Docker

ただしwsl2を使ってUbuntu 22.04.3 LTSにて実行します。
Text generation web UIのバージョンは1.6.1です。

どのような設定か詳しく知りたい場合は以下から。

https://qiita.com/umauma-hagihagi/items/130804c14ba09f716bfd


# モデルのダウンロード

以下を参考にモデルをダウンロードします。
手順がスクショつきなのでわかりやすくて助かります。

https://www.kkaneko.jp/ai/win/textgen.html

```cyberagent/open-calm-3b```をダウンロードして使ってみましたが、なんか勝手にお話されて困る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/449e60b6-8985-832d-6da3-85242831d5ae.png)

GPUがちゃんと使われているか気になったのでタスクマネージャを確認。
ちゃんと利用しているようで安心しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/905ca3a2-0d73-ce9c-300f-71648a1326d9.png)

ダウンロードしたモデルは
```\text-generation-webui-docker\config\models```
の階層に配置されてました。
ここに直接置いても利用できるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/60ed8b68-1bd2-cc86-709a-9ed07aa47a92.png)

# あとがき

上記では最低限の

- モデルをダウンロードする
- ダウンロードしたモデルで会話する

しかしていないですが、色々な設定項目があるので調査する必要がありそうです。
AWS でドル円の為替レートを確認する

# 為替レートを知りたい

AWS では支払い通貨を指定して、その通貨で AWS の請求金額を支払うことが出来ます。このとき、ドルでの請求金額が確定したあとに、指定した通貨に金額が換算されます。制限事項がいくつかあり、MarketPlace 経由で利用したサービスの支払い方法は対象外です。また、支払い方法が Visa や MasterCard に限定されている点はご留意ください。詳細は[こちらのドキュメント](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/billing-what-is.html)をご参照ください。

AWS を試算するときに、ドルと円の為替レートを知りたいです。為替レートは毎日更新されます。

現時点の、為替レートを確認は AWS マネジメントコンソールで確認が可能です。



# 確認方法

まず、支払い通貨を一度設定すると、Billing の Home にある 「JPY」の部分をクリックすれば、為替レートを確認可能です。この画像の例では、1 USD あたり、149.95773 JPY のレートを確認できます。(円安...)

![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b7883875-acc1-95ad-c235-58c80b9144a5.png)



設定していない場合は、次の画面でレートが表示されます。Payment preferences で Edit を押します。

![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5b06b628-0c7f-c836-67fb-8e664350998e.png)



Default payment currency を JPY に指定すると、Exchange rate が表示されます。(設定変更はしなくても良いです。)

![image12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/17bc3ef1-ef56-2b89-ca67-fc0311ec77a7.png)



# 参考 URL

https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-what-is.html
SQLの基本その２（サブクエリ）

# サブクエリ
SQL文の中に別のSQL文を埋め込む手法がある。この埋め込まれたサブのSQLがサブクエリである。
studentsテーブルに五教科の点数が格納されているとする。例えば数学の点数が平均点より高い生徒の名前を表示したい場合は、下記のようになる。
```sql
select name from students where math > ( select avg(math) from students );
```

# サブクエリの種類
サブクエリの内容によって取得できるデータの形態が異なる。
４パターンのサンプルを示す。
## 単一行×単一列
一意のレコードから単一の値を取得した場合。
```sql
-- 使用例（可読性のため改行）
select id, name where math >= 
  (select avg(math) from students where gender = 'm' group by gender);
```
## 単一行×複数列
１レコードだけのテーブルの代わりとして使うことが多い。
```sql
-- 使用例（可読性のため改行）
select name, math from students where (name, math) = 
  (select name, math from students where id = 1);
```

## 複数行×単一列
複数レコードから単一カラムの値を取得する。in演算子の右項として使用する。
```sql
-- 複数のレコードから単一の値を取得
select id, name from students where id in (select id from students where gender = 'm');
```

## 複数行×複数列
```sql
-- 複数のレコードから複数の値を取得。要するにテーブルを取得するイメージ。
-- from句の右項として使用する。このときサブクエリにaliasが必要（今回は t とした）。
select t.gender, t.avg(math)
  from (select gender, avg(math) from students group by gender) t;
```
多重共線性の留意点

# 目次
[1.多重共線性とは](#1-多重共線性とは)
[2.重回帰分析のケース](#2-重回帰分析のケース)
[3.因子分析のケース](#3-因子分析のケース)
[4.多重共線性の問題を軽減する](#4-多重共線性の問題を軽減する)
[5.おわりに](#5-おわりに)

:::note info
分析の際、「多重共線性」を考慮することは重要です。
自分の備忘録として、留意点をまとめてみました。
:::

# 1. 多重共線性とは

**多重共線性**（Multicollinearity）は、統計学や回帰分析における重要な問題の一つです。これは、回帰モデルにおいて、独立変数間に高い相関が存在する場合に起こります。

以下のような状況を考えてみましょう。
想定する回帰式：$ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \ldots + \beta_nX_n + \epsilon $

ここで、$X_1$と$X_2$が相関が高い場合、例えば$X_1$が増えると$X_2$も増える傾向があるとします。この場合、どちらの変数が$Y$に影響を与えているのかを区別するのが難しくなります。


# 2. 重回帰分析のケース
**重回帰分析**では、複数の独立変数（説明変数）を使って目的変数（依存変数）を予測するモデルを構築します。多重共線性は、このような場合に起こる問題で、具体的な例を通じて説明します。

例えば、不動産価格を予測するモデルを考えます。この場合、独立変数として、以下のような要素を考えることとします。

1. 家の広さ
2. 地下室の広さ
3．駅から距離
4. 築年数

これらの変数が相互に関連していない場合、それぞれが独立に価格に影響を与えると考えられます。

しかし、もし「家の広さ」と「地下室の広さ」が強い相関を持っている場合、例えば家が広い場合に地下室も広い傾向があるなど、これらの変数間に多重共線性が存在する可能性があります。

この場合、多重共線性の問題が発生すると、以下のような問題が起こります：

1. **係数の不安定性**: 例えば、「家の広さ」と「地下室の広さ」が強い相関を持っている場合、どちらか一方の係数が正確に推定されにくくなります。

2. **変数の効果の解釈が難しい**: どの変数が価格に影響を与えているのかを正確に解釈することが難しくなります。

3. **予測の精度が低下する**: 多重共線性がある場合、モデルの予測精度が低下する可能性が高まります。

このように、多重共線性がある場合、モデルの解釈や予測に対する信頼性が低下する可能性があります。そのため、重回帰分析を行う際には、多重共線性の存在を確認し、適切な対処法を考える必要があります。

# 3. 因子分析のケース

因子分析において多重共線性が問題となる具体的なケースとして、例えば、以下のような状況を考えてみましょう。

仮想的なデータセットがあり、3つの変数A、B、Cがあります。これらの変数は正の相関を持っており、相互に強い関係があるとします。

- 変数A: 数学の理解度を示す指標
- 変数B: 物理の理解度を示す指標
- 変数C: 科学全般の理解度を示す指標

この場合、A、B、Cの間には強い相関があるため、多重共線性が発生します。ここで因子分析を行うと、以下のような問題が起こります：

1. **因子の解釈が難しくなる**: 多重共線性がある場合、因子分析の結果から因子を解釈することが難しくなります。例えば、因子がA、B、Cのすべてに影響を与える場合、それぞれの因子が示す内容が明確ではありません。

2. **因子の信頼性が低下する**: 多重共線性がある場合、因子の信頼性が低下し、因子が示す情報が不安定になります。

3. **因子得点の解釈が困難**: 多重共線性があると、因子得点を解釈することが難しくなります。それぞれの因子がA、B、Cにどれだけ影響を与えているのかを正確に理解するのが困難です。

上記のような例は、基本的にはレアケースで、そもそも、因子分析を行う意義がないのかもしれません。

# 4. 多重共線性の問題を軽減する

因子分析や主成分分析を重回帰分析の前処理として行うアプローチは、多重共線性の問題を軽減するために一般的に用いられます。利点と注意点は、以下の通りです。

利点:

1. **多重共線性の軽減**: 因子分析や主成分分析は、変数間の相関を考慮に入れて新たな変数（因子や主成分）を作成します。これにより、元の変数間の相関が低減し、多重共線性の影響を軽減できます。

2. **変数の次元削減**: 因子分析や主成分分析は、元の変数をより少ない数の因子や主成分にまとめる効果があります。これにより、モデルの複雑さが削減され、過剰適合のリスクが低減します。

3. **解釈が容易に**: 因子や主成分は、元の変数を組み合わせて作成されるため、相関の高い変数がまとめられます。これにより、因子や主成分の解釈が容易になります。

注意点:

1. **因子や主成分の解釈**: 因子や主成分が具体的に何を示しているのかを理解することが重要です。これらは元の変数の組み合わせであり、具体的な意味を持つ場合がありますが、持たない場合もあります。

2. **情報の損失**: 因子分析や主成分分析によって、元の変数の一部が失われる可能性があります。これにより、重要な情報が失われる場合があります。

3. **前処理の順序**: 因子分析や主成分分析を行う際には、適切な前処理の順序を考慮する必要があります。例えば、標準化や欠損値の処理などが重要です。

# 5. おわりに
多重共線性、マルチコの問題は、面倒ですが、考慮が必要です。
以前、重回帰分析で痛い目に遭いました（笑）
もう二度と、痛い目には遭いたくないです。

:::note info
英語で「多重共線性」を表現するときは "multicollinearity" と言います。
多重共線性のは「**マルチコ**」と呼ばれることが多いです。
:::
Ubuntu上でDockerを使用してNext.jsアプリケーションを起動する

## Ubuntu 22.04.2 LTS での Next.js アプリケーションセットアップ

### バージョン
- Ubuntu: 22.04.2 LTS
- Node.js: v18.18.0
- npm(npx): 9.8.1

### 手順

1. Ubuntu 22.04.2 LTS を Microsoft Store からインストールします。

2. Node.js と npm をインストールします。
    ~~~
     $ sudo apt install -y nodejs npm
3. ｎをインストール
    ~~~
    $ sudo npm install n -g
4. 最新のnode.jsとnpmのインストール
    ~~~
    $ sudo n stable
5. 最初に入れたとりあえずの node.js と　npm をアンインストール
    ~~~
    $ sudo apt purge -y nodejs npm
    $ sudo apt autoremove -y
6. 残った node.js と npm が最新であることを確認
    ~~~
    $ node -v
    $ npm -v
7. PCの再起動
8. プロジェクトのディレクトリを作成
9. ディレクトリへ移動
10. Next.js アプリケーション [test-app] 作成
    ~~~
    npx create-next-app test-app
11. [test-app] ディレクトリへ移動
12. VScodeでの起動
    ~~~
    code .
13. 「dockerfile」と「compose.yml」をVScodeで新規作成
    ~~~dockerfile.
        FROM node:18.12-alpine
        WORKDIR /app/
        COPY ./package.json ./
        RUN npm install
    ~~~
    ~~~docker-compose.yml
    services:
      app:
        build:
          context: .
        ports:
          - "3000:3000"
        volumes:
          - .:/app
          - node_modules:/app/node_modules
        command: sh -c "npm run dev"
    volumes:
      node_modules:
    networks:
      snowboard_default:
        external: true
    ~~~
14. Dockerイメージのビルド
    ~~~
    docker-compose build
15. Dockerコンテナの起動
    ~~~
    docker-compose up

これで http://localhost:3000 にアクセスするとNext.jsが起動されている
PythonでWordに透かしを挿入する方法

透かしは、文書の内容の上に重ねられる半透明のテキストや画像であり、文書に追加情報を提供したり、文書のセキュリティを保護したりすることができます。Pythonプログラムを使用してWord文書に透かしを追加したい場合は、専門のWord文書処理ライブラリをインストールしてインポートすることができます。以下に、[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/word-for-net-introduce.html)ライブラリを使用してこの機能を実現する具体的な方法が示されています。
## ツール
* Visual Studio Code
* [Spire.Doc for Python](https://www.e-iceblue.com/Introduce/word-for-net-introduce.html)
このプロフェッショナル ライブラリは、[Word ドキュメントの作成](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Document-Operation/Python-Create-Read-or-Update-a-Word-Document.html)、[Word から PDF への変換](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Conversion/Python-Convert-Word-to-PDF.html)など、Python プラットフォームでの Word ドキュメントの処理をサポートします。
## インストール方法
* [Python](https://www.python.org/downloads/)をダウンロードしてインストールします。
* VS Code で「Extensions」をクリックし、「Python」を検索してインストールします。
* 「Explorer」-「NO FOLRDER OPENED」-「Open Folder」をクリックします。
* 既存のフォルダーをワークスペースとして選択するか、新しいフォルダーを作成することもできます。
* そのフォルダーに「.py」 ファイルを追加し、任意の名前を付けます。
* 「Terminal」-「New Terminal」をクリックします。
* 次のコマンドを入力して、Spire.Doc for Python と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.Doc
```
## テキスト透かしの挿入
```python
from spire.doc import *
from spire.doc.common import *

#Documentオブジェクトの作成
document = Document()

#Wordドキュメントのロード
document.LoadFromFile("sample.docx")

#TextWatermarkオブジェクトの作成
txtWatermark = TextWatermark()

#透かしの書式設定
txtWatermark.Text = "Confidential"
txtWatermark.FontSize = 50
txtWatermark.Color = Color.get_Blue()
txtWatermark.Layout = WatermarkLayout.Diagonal

#文書へのテキスト透かしの追加
document.Watermark = txtWatermark

#結果文書の保存
document.SaveToFile("TextWatermark.docx", FileFormat.Docx)
document.Close()
```
以上のコードでは、TextWatermarkクラスのオブジェクトを作成し、Document.Watermarkプロパティを設定することで、Word文書にテキスト透かしを挿入することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/1e8467a8-f4a8-d234-2fc1-8df3cf699d10.png)
## 画像透かしの挿入
```python
from spire.doc import *
from spire.doc.common import *

#Documentオブジェクトの作成
document = Document()

#Wordドキュメントのロード
document.LoadFromFile("sample.docx")

#PictureWatermarkオブジェクトの作成
picture = PictureWatermark()

#透かしの書式設定
picture.SetPicture("image.png")
picture.Scaling = 60
picture.IsWashout = False

#文書に画像透かしの追加
document.Watermark = picture

#結果文書の保存
document.SaveToFile("ImageWatermark.docx", FileFormat.Docx)
document.Close()
```
同様に、PictureWatermarkクラスのオブジェクトを作成し、Document.Watermarkプロパティを設定することで、Word文書に画像透かしを挿入することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/0318cb2c-74b1-0665-580f-aafe3af8ee78.png)
jQueryでドラッグイベントを簡単に実装する方法

ウェブアプリケーションの開発において、ユーザーの操作に応じた動的な動作を実装することは一般的です。中でも、ドラッグ操作はユーザーエクスペリエンスを向上させるための重要な要素です。今回は、初心者の方でも簡単にドラッグイベントを実装できるjQueryのプラグインを紹介します。

# このプラグインの特徴

以下のコードを、`simpleDrag`という名前で保存します。このプラグインは、jQueryプラグインで指定された要素にドラッグイベントを追加する機能を提供します。

```javascript:simpleDrag.js
(function($) {
    $.fn.simpleDrag = function() {
        return this.each(function() {
            var $element = $(this);
            var is_drag = false;

            $element.on('mousedown', function() {
                is_drag = true;
                $element.trigger('dragstart');
            });

            $(document).on('mouseup mouseleave', function() {
                if (is_drag) {
                    is_drag = false;
                    $element.trigger('dragend');
                }
            });

            $element.on('mousemove', function(e) {
                if (is_drag) {
                    $element.trigger('dragging', e);
                }
            });
        });
    };
})(jQuery);
```

# プラグインの使用方法

1. HTMLファイル内で、以下のようにjQueryと`simpleDrag.js`を読み込みます。

    ```html
    <script src="path_to_jquery/jquery.min.js"></script>
    <script src="path_to_your_js_folder/simpleDrag.js"></script>
    ```

2. JavaScriptで、以下のコードを使用してドラッグイベントを実装します。

    ```javascript
    $('#mymap').simpleDrag();
    
    $(document).on('dragstart', '#mymap', function() {
        console.log('ドラッグ開始');
    });
    
    $(document).on('dragging', '#mymap', function() {
        console.log('ドラッグ中');
    });
    
    $(document).on('dragend', '#mymap', function() {
        console.log('ドラッグ終了');
    });
    ```

# まとめ

このプラグインを使用することで、簡単にドラッグイベントをウェブアプリケーションに追加することができます。初心者の方でも手軽に導入できるため、ウェブ開発の効率を向上させることが期待できます。ぜひ、このプラグインを試してみてください。
testing QiitaCLI: artuicue2023_01

# QiitaCLIのテスト用記事

## 兼 Markdownテスト

### QiitaやGitHub独自記法の確認

/#### Markdownのエスケープ

*hoge* _hoge_ **hoge** __hoge__ ***hoge***
~~fuga~~

#### 非対応っぽい記法[^1] :face_with_rolling_eyes:
==piyo== (※背景の黄色いハイライト)
h~2~SO~4~ (下付き文字)
sinθ^2^ + cosθ^2^ = 1 （上付き文字）
👇
`piyo` (代用)  
$h_2SO_4$
$sinθ^2 + cosθ^2 = 1$

---
#### 折りたたみ
<details>
<summary>audio contents:</summary>
  
- [ゆるコンピュータ科学ラジオ](https://www.youtube.com/@yurucom)
- [ひまじんプログラマーの週末エンジニアリングレッスン](https://open.spotify.com/show/2uv9mONog0nr9q5YJJsvIt?si=e79fc99f3ecd4b8f)
- [エンジニアストーリー by Qiita](https://pitpa.jp/playlist/engineerstory)
- [PIVOT Growth Drivers](https://open.spotify.com/episode/4XoYSjNDuDrM8EMC1RqbPo)
</details>

#### 画像
![ビスカッチャ](https://livedoor.sp.blogimg.jp/karapaia_zaeega/imgs/c/6/c6fd2293.jpg "とろ〜ん")

#### リンク
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d "Qiita Markdown")

##### リンクカード

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

#### コードブロック(Syntax highlight)

```ruby:qiita.rb
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
```

```diff_javascript:hogefuga.js
function fancyAlert(arg) {
  if(arg) {
-   console.log('fuga')
+   console.log('hoge')
    $.facebox({div:'#foo'})
  }
}
```

#### 表(テーブル)
※Qiita上で直接編集するバヤイは3x2とかで簡易入力可能
| hoge | fuga | piyo |
|:----:|:----:|:----:|
|  1   |  2   |  3   |
|  4   |  5   |  6   |

#### 引用
> これは引用です
> > これは二重引用です
> * これは引用です

- 箇条書き1
  - 箇条書き1-1
  - 箇条書き1-2
- 箇条書き2

1. 番号付き箇条書き1
   1. 番号付き箇条書き1-1
   2. 番号付き箇条書き1-2
3. 番号付き箇条書き2

- [ ] チェックボックス1
- [x] チェックボックス2

#### Note(補足説明)

:::note info
インフォメーション
infoは省略可能です。
:::

:::note warn
警告
○○に注意してください。
:::

:::note alert
より強い警告
○○しないでください。
:::

#### 注釈と注釈文[^2]

---
#### その他
##### 数式
```math
\frac{1}{n} \sum_{i=1}^{n} x_{i}^{2}
```

$fibo = \\{0, 1, 1, 2, 3, 5, 8\\}$

##### カラー
`#ffce44`
`rgb(255,0,0)`
`rgba(0,255,0,0.4)`
`hsl(100, 10%, 10%)`
`hsla(100, 24%, 40%, 0.5)`

##### ダダダダダイアグラーム！[^3]

```plantuml
Bob->Alice : Hello!
```
```mermaid
graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-->D;
```
```mermaid
flowchart LR
   a --> b & c--> d
```
### Next article
Flutter1 > 3バージョンアップで躓いたCocoaPodsアップデートについて書く

[^1]: ハイライトは未対応っぽいが、$x^2^ + y^2 = 1$ 等とすると背景が黄色くハイライトされはする。
[^2]: 注釈文はどこに書いても自動で最下部に表示される模様。また、自動で水平線が入る。
[^3]: ばよえ〜ん
Ktorの通信をFiddlerでパケットキャプチャする

## 前提
- Fiddlerの導入及び設定を完了
- FiddlerのKeyStoreファイルを生成済み

## やり方
### Proxyの設定
```kotlin
HttpClient {
    engine{
        proxy = ProxyBuilder.http("http://localhost:8888")
    }
}
```
### 証明書の設定
```kotlin
System.setProperty("javax.net.ssl.trustStore", "C:/anywhere/FiddlerKeystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
```

以上の処理を実装し、Fiddlerを起動した状態でコードを実行することでパケットがキャプチャされる。
[忘備録]Dockerが「Hyper-V使えないよ」エラーになったときの対処

# 経緯

Docker Desktopを起動したら以下のようなエラーが出た。
昨日まで使えていたのになぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/dc5a2c28-853a-464b-32c3-69b55bcc261a.png)

# 対処

エラーにあるマニュアル
https://docs.docker.com/desktop/troubleshoot/topics/#virtualization
にアクセスして原因確認。

ざっくり読んで、設定には問題ないように思えたので、
マニュアルにある「Hypervisor enabled at Windows startup（Windows 起動時にハイパーバイザーが有効になる）」の章を参考に対処。

コマンドプロンプトを管理者権限で立ち上げて

```
bcdedit /set hypervisorlaunchtype auto
```

を実行。
PC再起動してDockerを起動させたら解消してた。

「一部のツール (古いバージョンの Virtual Box など) とビデオ ゲーム インストーラーは、起動時にハイパーバイザーをオフにします」
ということだったので、今後も高頻度で発生するようならPC起動時に自動でバッチ叩いて設定変更するようにするかなぁ。

こちらの記事にやりかたあったので、やることになったら参考にしようと思います。

https://qiita.com/dodonki1223/items/75bd5171e2f2193c9977
【DBeaver】CSVインポート時の「JDBCドライバの内部エラー Java heap space」の原因と解決方法

# エラー概要
Dbeaverで、3GBくらいあるCSVファイルをインポートしていたら、以下のエラーになりました。

```
SQLエラー: JDBCドライバの内部エラー
    Java heap space
```

# 原因
エラーは、Java仮想マシン（JVM）のヒープメモリが不足しているよ、ということを示しています。
CSVファイルの大きさやデータベースへのインポート操作がメモリを多く消費する場合に発生することがあるらしい。

JDBC（Java Database Connectivity）ドライバというのは、Javaプログラムからデータベースに接続し、データベースとの対話を可能にするJavaライブラリ。DBeaverはこちらを使用するデータベースツールなんですね。

# 対策
CSVファイルを単純に分割してインポートする、という方法もありますが、面倒なので、他に手はないかなと調べていたら以下記事にも同じエラー対応がありました。

参考：[[Mac]DBeaverでJava heap spaceが出た時の対処法](https://qiita.com/minngk/items/57e7980cd9030ba0346c)

ということで、メモリの割り当てを増やすことにしました。

```
cd /Applications/DBeaver.app/Contents/Eclipse/
vi dbeaver.ini
```

ここで、`-Xmx1024m`というデフォルトの数値を`-Xmx4096m`に変更してあげます。
十分なメモリが確保されたので、エラーが表示されなくなり、インポートプロセスがスムーズに実行できました。

ちなみに`-Xmx`はJVMの最大ヒープメモリサイズを設定するオプション。
`-Xms64m`はヒープメモリの最小値（最小割り当て量）。
[MySQL] "the user specified as a definer ('mysql.infoschema'@'localhost') does not exist" エラー解決法



# 概要

MySQL 5.7 のサービスを
今回 MySQL 8.0.xに移行したが
wordpressを動かしてみると、一応connectはできるものの いろいろエラーが出る..

```
[07-Oct-2023 05:23:46 UTC] WordPress database error View 'information_schema.COLUMNS' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them for query SHOW FULL COLUMNS FROM `wp_options` made by require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/biz-vektor-master/index.php'), get_sidebar, locate_template, load_template, require_once('/themes/biz-vektor-master/sidebar-page.php'), dynamic_sidebar, WP_Widget->display_callback, Top_Ten_Widget->widget, tptn_pop_posts, set_transient, wp_cache_set, W3TC\ObjectCache_WpObjectCache->set, W3TC\ObjectCache_WpObjectCache_Regular->set, W3TC\ObjectCache_WpObjectCache_Regular->_transient_fallback_set, update_option, W3TC\DbCache_WpdbNew->update, W3TC\DbCache_WpdbInjection_QueryCaching->update, W3TC\_CallUnderlying->update, W3TC\DbCache_WpdbNew->update, W3TC\DbCache_WpdbInjection->update, W3TC\DbCache_WpdbNew->default_update, W3TC\DbCache_WpdbNew->query, W3TC\DbCache_WpdbInjection->query, W3TC\DbCache_WpdbNew->default_query

```

# 原因

MySQL upgrade の対応をしなくてはならない..
https://dev.mysql.com/doc/refman/8.0/ja/upgrading-what-is-upgraded.html

# 解決法

```
$ sudo systemctl stop mysql # 停止..
$ sudo mysqld --upgrade=FORCE & # 起動コマンド upgradeを実行してくれるよう -> そのままプロセスが立ち上がるため、以下のログで connection readyとなっていれば killして service restart
tail -f /var/log/mysqld.log # or /var/log/mysql.mysqld.log

$ sudo systemctl restart mysql # 再起動
```

> --upgrade=FORCE では、サーバーは必要に応じてデータディクショナリ、パフォーマンススキーマおよび INFORMATION_SCHEMA をアップグレードし (ステップ 1)、他のすべてのものを強制的にアップグレードします (ステップ 2)。 サーバーはすべてのスキーマ内のすべてのオブジェクトをチェックするため、このオプションではサーバーの起動に時間がかかります。
FORCE は、必要ないとサーバーが判断した場合に、ステップ 2 のアクションを強制的に実行する場合に役立ちます。 FORCE と AUTO の違いの 1 つは、FORCE では、ヘルプテーブルやタイムゾーンテーブルが欠落している場合は、サーバーによってシステムテーブル (ヘルプテーブルやタイムゾーンテーブルなど) が再作成されることです。

->
これでエラーは出なくなった

# 参考

https://stackoverflow.com/a/69709362/12070353

https://qiita.com/26love/items/88fd505cd85167676556
LambdaのコンテナのイメージをECRのlatestへ更新する

## 作成済みLambdaのコンテナの更新
マネジメントコンソールからLambdaコンテナを更新しに行くと、
イメージの登録が完了するまでにそれなりに時間がかかる。
CLIで楽にやりたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/6bd8f28f-27fe-d6d1-062b-1ffd42eb6c02.png)

Lambdaのマネコンから登録されているイメージURIを見に行くと、
`レジストリURI@sha256`のURIとなっている。
この部分をCLIで更新する。

### 手段1. ハッシュ値による更新
`aws ecr describe-images`を使ってハッシュを取得し、URIを生成する。
生成したURLで`aws lambda update-function-code`する。
```bash:ecr_deploy.bash
accountID="アカウントID";
ecrRepoName="ECRイメージ名";
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $accountID.dkr.ecr.ap-northeast-1.amazonaws.com
docker build -t $ecrRepoName .
docker tag $ecrRepoName:latest $accountID.dkr.ecr.ap-northeast-1.amazonaws.com/$ecrRepoName:latest
docker push $accountID.dkr.ecr.ap-northeast-1.amazonaws.com/$ecrRepoName:latest

digest=`aws ecr describe-images --repository-name $ecrRepoName | jq -r '.imageDetails[] | select(.imageTags==["latest"]) | .imageDigest'`
ECR_URI=$accountID.dkr.ecr.ap-northeast-1.amazonaws.com/$ecrRepoName@$digest;

#lambda更新
aws lambda update-function-code --function-name s3EventECR --image-uri $ECR_URI
```

#### 結果
無事Lambdaのコンテナイメージが更新された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/101f54d4-61a4-daf4-e756-233a19c704b6.png)


### 手段2. latestタグで更新
`:latest`タグだけでも更新可能な様子。やってみる。

```bash:
＜省略＞
ECR_URI=$accountID.dkr.ecr.ap-northeast-1.amazonaws.com/$ecrRepoName:latest;

#lambda更新
aws lambda update-function-code --function-name s3EventECR --image-uri $ECR_URI;
```

#### 結果
無事Lambdaのコンテナイメージが更新された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/ca7e2517-abb7-90df-8755-75d8e38e01fa.png)
latest表示だが、デプロイしたタイミングでのlatestイメージでしかない。
これだと、いつのイメージなのか見分けられない。
1つ目のハッシュ付きURIの方法の方が運用上はよさそう。
[リサーチ・メモ] TypeScriptを用いてVueでバリデーションの実装

## 型宣言の方法
### interfaceで定義する場合
```
<script setup lang="ts">
import { reactive } from 'vue';

interface MemberInfo {
    email: string;
    phoneNumber: string;
}

const memberInfo = reactive<MemberInfo>({
    email: '',
    phoneNumber: ''
});
</script>
```
### interfaceを定義しない場合
```
<script setup lang="ts">
const memberInfo = reactive<{
    email: string;
    phoneNumber: string;
}>({
    email: '',
    phoneNumber: ''
});
</script>
```
## バリデーションの方法
### バリデーションのルールを作成する
```
const emailRules = [
    (v: string) => !!v || "Eメールは必須です",
    (v: string) => v.match(/.+@.+\..+/) !== null || "メールアドレスの形式で入力してください",
];
```

### 作成したルールを:rulesにバインドする
```
<v-text-field v-model="memberInfo.email" :rules="emailRules" label="Eメール" required></v-text-field>
```

## 動的なバリデーションのルールを作成する
### ルールのinterfaceを作成
```
const createNameRules = (fieldName: string) => [
    (v: string) => !!v || `${fieldName}は必須です`,
    (v: string) => (v && v.length <= 10) || `${fieldName}は10文字以下で入力してください`
];
```

### interfaceを実装したルールを作成し:rulesにバインドする
```
const lastNameRules = createNameRules("姓");
const firstNameRules = createNameRules("名");
```