OmniAICreator/Qiita-1.07M huggingface dataset:
初めてのneovimプラグイン制作

## モチベーション
neovimをはじめ、様々なOSSを利用させていただいています。  
ある時、 `このままでいいのか。使うだけの人なってはいけないのでは。。`と思い、  
自分なりに何か還元できないかと思い、ひとまずneovimのプラグインを作ってみようと
思い立ちました。

## プラグイン概要
[github](https://github.com/HaradaKazunari/nvim-zettelnote)
zettelkastenを用いたタグで管理するノート管理です。(タグ周りは今後実装予定)  
初期段階では、最小構成として以下の機能を実装しました。
- `;nn`で新規ノート作成  
- `;nf`でノートのディレクトリを表示

次段階で、タグ検索機能を実装します。


#### ノート作成
元々、obsidianで管理していたのもあって、デフォルト値をyaml形式で設定しました。
```yaml
---
id: YYYYmmddhhmmss
date:  YYYYmmdd
tags: 
    - ""
---
```

#### ディレクトリ表示
telescopeと拡張機能のfile_browserを使用して、ディレクトリを表示します。
![Screenshot 2024-06-19 at 16.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325526/caf49d20-f93d-5311-e867-b9a39f208c12.png)



## 作成してみて
weztermやneovimの設定でluaは触ったことあるのですが、今回初めてちゃんとluaを書きました。  
普段からアプリ開発はしているので、そんなに苦戦することはありませんでしたが、lua特有(?)の書き方はちょっと慣れが必要でした。
```lua
local M = {
  config = {
    vault = "$HOME/.config/note/",
    keymap = {
      new_file = ";nn",
      fazzy = ";nf"
    }
  }
}

local function create_new_file()
  local path = file.create_new_note_file(M.config.vault)
  file.open_new_file(path)
end

local function open_fazzy()
  fazzy.open_note_filer(M.config.vault)
end

function M.setup(config)
  if config ~= nil then
    M.config = vim.tbl_deep_extend('force', M.config, config)
  end

  vim.keymap.set("n", M.config.keymap.fazzy, function() open_fazzy() end)
  vim.keymap.set("n", M.config.keymap.new_file, function() create_new_file() end)
end

return M
```

`M`は、モジュールというみたいですね。  
JSのオブジェクトや、PHPの連想配列みたいなものだと思えば、受け入れ難いことはありませんでした。  


今回、とりあえず作ってみた状態なので、luaについてまだまだ潜る必要がありますね。
Terraform環境構築

# 概要
Terraform初学者向け

## Terafformとは
インフラストラクチャをコードとして定義し、任意のクラウドやオンプレミスのリソースを自動的にプロビジョニング、管理するためのツール。
これにより、インフラの設定が一貫性を持って再現可能になり、手動設定のミスを防ぐことができる。

複数のクラウドサービスに対応しており、オンプレミス環境にも対応している。

## 関連リンク
- [TerraformでEC2インスタンス起動](https://qiita.com/takehiro224/items/0deb40a637873bcdb05d)
- [Terraform基本構文](https://qiita.com/takehiro224/items/eb00f0770af5a7259cbd)
作成次第随時追加...

## 環境構築
### 1. AWS CLIインストール
#### Macの場合
インストールコマンド
`brew install awscli`
バージョン確認
`aws --version`


### 2. Terraform用IAMユーザー作成
- AWSコンソール上にIAMユーザーを作成する

「アクセスキー」「シークレットアクセスキー」をメモしておく

### 3. awsの初期設定
ターミナルでAWSの「アクセスキー」「シークレットアクセスキー」「リージョン名」「アウトプット」を入力する
```
aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### 4. ユーザー「terraform」作成
- AWSコンソール上にIAMユーザーを作成する

「アクセスキー」「シークレットアクセスキー」をメモしておく

### 5. ユーザー「terraform」のaws初期設定
ターミナルでAWSの「アクセスキー」「シークレットアクセスキー」「リージョン名」「アウトプット」を入力する
```
aws configure --profile terraform
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### 6. Terraformインストール
#### Macの場合
##### 6-1. tfenvインストール
インストールコマンド
`brew install tfenv`
インストール可能なバージョン確認
`tfenv list-remote`
バージョンを指定してterraformをインストールする*バージョンは任意
`tfenv install 1.8.3`
ローカルで利用するバージョンを指定


### 7. get-secretsインストール
#### インストール(Mac)
`brew install git-secrets`


#### git-secrets初期化
```
git secrets --register-aws --global
git secrets --install ~/.git-templates/git-secrets -f
git config --global init.templatedir ~/.git-templates/git-secrets
```
モジュールバンドラとは

# この記事は

モジュールバンドラに関してわかってるようで何もわかってなかったので基本的なことを整理してまとめたメモ。

# モジュールバンドラとは
モジュールバンドラとは文字通りモジュールをバンドルするもの。

## モジュールとは
変数や関数をまとめたもの。モジュールシステムが導入されたJavaScriptでは、処理内容に応じてファイルにモジュールを分けて管理することができ、１つのモジュールは１つのJavaScriptファイルに対応する。このモジュールシステムには、Node.js環境下のCommonJSにて組み込まれているモジュールシステムや、2015年にECMA Script2015のモジュールシステムであるES Modulesなどいくつかの形式がある。

## モジュールをバンドルするとは
複数のJavaScriptファイル（モジュール）を一つにまとめること。ただ単にまとめるわけではなく、モジュール構文を解析し依存関係を解決しながら一つにまとめて実行できる形にしてくれる。依存関係を解決するというのは、モジュール間の依存関係が正しく解決され、各モジュールが必要な順番で読み込まれるようにまとめること。
ちなみにモジュールバンドラには依存関係の解決意外にもMinify（コードないの不要な改行やインデントなどを削除し、軽量化する）、Tree Shaking（デッドコードの除去）、コード分割、キャッシュ管理... など様々な最適化とかも実施してくれる。

## モジュールシステムの歴史的な流れ
JavaScriptにモジュールシステムが導入される前は、ファイルを分割するとscriptタグで読み込み、読み込まれたものはグローバル空間に展開されていた。
2009年に開始されたServerJSプロジェクトで、サーバーサイド用のNode.JS環境で動くCommonJSが開発され、モジュールシステムが組み込まれることとなった。Node.jsはモジュールバンドラを持つため、JavaScriptでサーバーサイド開発をする際はファイルをモジュールとして扱えるようになり、コードの分割とともに名前空間を分離できるようになった。
しかしブラウザではJavaScriptはグローバルコンテキストで動作し、同じ名前の変数や関数が衝突するという問題があり、フロントエンドでもCommonJS（モジュールシステム）を使いたいというニーズが生まれた。これを解決するために、Webブラウザで実行されるコードの変数や関数などをモジュール単位で管理し、衝突を避けることができるモジュールバンドラとしてBrowserifyが活用されるようになっていった...

## 主なモジュールバンドラ

### Browserify
CommonJSモジュールをブラウザ用に変換するモジュールバンドラ。当初はNode.jsモジュールをブラウザで動作させることが主な用途だったが、次第にモジュール間の依存解決を行いながら複数のファイルをひとつにまとめる「モジュールバンドラ」としても広く使われるようになった。

### Webpack
Browserifyより後発のモジュールバンドラ。ES Modules、CommonJS、AMDなどさまざまなモジュール構文をサポートするモジュールバンドラで、異なるモジュール構文が混在していても自動で適切に解釈し、依存関係を解決してバンドルする。

### Vite
Vue.jsの開発者Evanさんによって2020年に開発されたモジュールバンドラ。ビルド、ホットリロードが早く開発時の待ち時間が短くなる。Nuxtのモジュールバンドラとして使用されている。

https://jsprimer.net/basic/module/

https://ics.media/entry/12140/

https://typescriptbook.jp/reference/modules

https://oukayuka.booth.pm/items/2368045

https://ja.wikipedia.org/wiki/CommonJS

https://zenn.dev/takiko/articles/827c182638eb3b
JavaScriptの実行環境とは

# この記事は

JavaScriptの実行環境に関してわかってるようで何もわかってなかったので基本的なことを整理してまとめたメモ。

# JavaScriptの実行環境
 JavaScriptには大きく分けて二つの実行環境がある。
 - Webブラウザ
 - OS上で実行されるランタイム環境 

 ## Webブラウザ
 Webブラウザは、クライアントサイドでJavaScriptコードを実行するための環境。
 JavaScriptで書かれたコードを解析・実行するエンジンが搭載されていれば（基本的に搭載されている）WebブラウザでJavaScriptを実行することができる。ブラウザ上で動作するものなので、後述のランタイム環境で実行されるもののようにOSの機能にはアクセスできない。
 
 ### 主なJavaScriptエンジン
 | Webブラウザ    | JavaScriptエンジン     | ひとこと                                                          | 
| -------------- | ---------------------- | ----------------------------------------------------------------- | 
| Google Chrome  | V8(Google)             | Googleがメンテナンスを行なっているOSSであるChromiumをベースに開発 | 
| Microsoft Edge | V8(Google) <- Chakra(Microsoft)    | 2020年にV8に変更された                                                         | 
|Internet Explorer | Chakra(Microsoft)  | Internet Explorerのサポートは2022年6月15日に終了                                       | 
| Firefox        | Spider Monkey(Mozilla) |  世界初のJavaScriptエンジン                                                                 | 
| Safari         | JavaScriptCore(Apple)  |  Safari向け、そのほか　WebKitベースのブラウザでも使用されている| 
 
 ## OS上で実行されるランタイム環境:
 ランタイム環境は、JavaScriptをサーバーサイドやスタンドアロンのアプリケーションとして実行するためのもの。
 ランタイム環境というのが具体的に何をしているかというと、JavaScriptを実行する時にJavaScriptエンジンを使って直接機械語に変換し、OS上で実行できる形にする。ブラウザ上の機能（DOM）などは使用できない。

 ### 主なJavaScriptランタイム環境
| ランタイム環境 | JavaScriptエンジン | ひとこと                                                     | 
| -------------- | ------------------ | ------------------------------------------------------------ | 
| Node.js        | V8                 | サーバーサイドJavaScriptのデファクト標準。                     | 
| Deno           | V8                 | Rustで開発され、セキュリティとTypeScriptをネイティブサポート。 | 
| Bun            | JavaScriptCore     | エンジンにJSC、開発にZigが採用されており高速に動作。実行環境としてのみでなく、パッケージ管理などさまざまな機能がある           | 

例えば一番シンプルにNode.js動かそうとするとこのように動作する。
 ```js:hello.js
console.log('hello world!');
```
🔽
```bash
node hello.js       // hello world!
```

### JavaScriptはどうしてバイナリファイルが生成されない？
コードを逐次解析しながら実行するインタープリター型言語として設計されたため。実行時に型が決まる動的型付け言語であるため、事前にコンパイルすることは難しい...

# 参考
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb

https://ja.wikipedia.org/wiki/JavaScript%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3

https://ja.wikipedia.org/wiki/Chromium

https://ja.wikipedia.org/wiki/SpiderMonkey

https://en.wikipedia.org/wiki/Chakra_(JScript_engine)

https://zenn.dev/antez/books/568dd4d86562a1/viewer/21602b

https://gihyo.jp/article/2023/01/tfen005-bun

https://zenn.dev/mryhryki/articles/2023-09-24-javascript-runtimes
GROWI TypeScript/JavaScript SDKの紹介（その1：ページのCRUD操作）

[オープンソースの社内WikiであるGROWI](https://growi.org/)ではREST APIが公開されています。このAPIをより簡単に使えるよう、TypeScript/JavaScript SDKを開発しています。まだ途中ですが、徐々に機能追加していきます。

今回はページのCRUD（Create, Read, Update, Delete）操作を行う方法を解説します。

## 注意点

こちらはコミュニティSDKになります。公式への問い合わせはご遠慮ください。

## ソースコード

GROWI TypeScript/JavaScript SDKのソースコードはGitHubにて公開しています。ライセンスはMITです。

[goofmint/growi-sdk-alpha](https://github.com/goofmint/growi-sdk-alpha)

## インストール

インストールはnpm/yarn経由で行います。

```bash
$ npm install @goofmint/growi-js
# または
$ yarn add @goofmint/growi-js
```

## 使い方

まずはSDKをインポートします。

```javascript
const { GROWI } = require('@goofmint/growi-js');
// または
import { GROWI } from '@goofmint/growi-js';
```

そして、初期化します。この時、GROWIのAPIトークンを指定します。

```javascript
const growi = new GROWI({ apiToken: 'your-api-token' });
```

この他、以下のパラメーターを用意しています。

- `url` : GROWIのURLを指定します。デフォルトは`http://localhost:3000`です。
- `path` : GROWIのページパスを指定します。デフォルトは `` です。サブディレクトリにインストールしている際に指定します。

## ページの取得

現在はルートからのページ取得に対応しています。返ってくるのは `Page` オブジェクトです。

```javascript
const page = await growi.root();
```

ページ本文は `contents` メソッドで取得します。

```javascript
const contents = await page.contents();
```

## 子ページの取得

子ページを取得するには `children` メソッドを使います。これは `Page` の配列です。

```javascript
const children = await page.children();
```

## 本文の更新

本文をアップデートする際には、 `contents` メソッドに本文を適用してください。そして、 `save` メソッドを呼び出します。

```javascript
page.contents('新しい本文');
await page.save();
```

## 新しいページの作成

新しいページを作成するには、 `create` メソッドを使います。

```javascript
const newPage = await growi.create({name: '新しいページ'});
```

作成時には、 `body` パラメーターで本文を、 `grant` パラメーターで公開範囲を指定できます。

```javascript
const newPage = await page.create({ name, grant: growi.Page.Grant.public });
```

## ページの削除

ページの削除は `remove` メソッドを使います。

```javascript
await page.remove();
```

オプションのパラメーターとして `isCompletely` を指定すると、ページを物理削除します。 `isRecursively` を指定すると、子ページも再帰的に削除します。

## まとめ

GROWIは社内Wikiとして、社内システムとのデータ連係ニーズが出やすいでしょう。ぜひ、Node.js SDKを使って、GROWIをシステムから操作してください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/)
Microsoft認定資格の模擬試験を利用する手順

# 1. はじめに
Microsoft認定資格の学習を進めるにあたって、公式の無料模擬試験はとても有効です。
模擬試験の利用方法が分からないという人もいると思いますので、今回はその方法を解説したいと思います。

# 2. 手順
- MicrosoftのLearnの資格一覧を表示

https://learn.microsoft.com/ja-jp/credentials/browse/?credential_types=certification

- 一覧から受験したい資格を選択
    - 一覧の数が多いので、初級・中級などの絞り込み条件を指定するのがおすすめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812370/db26cb2c-7441-cc7a-cc4d-26bf0957dd7e.png)

- 資格ページの中頃にある「練習評価を受ける」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812370/52e21f07-f3e9-b5ef-e9fb-c4e30dac72f3.png)

- 上記の操作後に模擬試験が開始されます。

# 3. 模擬試験結果の活用
模擬試験終了時にスコアが表示されますが、「自分の回答を表示する」を選択することで各問題の答えを確認する事が出来ます。
ここでは、正しい回答だけでなく、簡単な解説や対応するLearn学習ページのリンクも表示されるため、以下のような学習サイクルが回せます。

1. 模擬テスト
1. 自分の回答を確認
1. 間違った箇所に対応する学習ページのリンクを開く
1. 学習ページで再学習
1. 1から繰り返す

# 4. 最後に
模擬試験は便利ですが、私はいつも「どこから利用できたっけ？」と忘れてしまうため、記事に纏めてみました。
ブックマークなども利用して是非とも模擬試験を活用してみて下さい！！
【javascript】someメソッド,everyメソッドについて

## `some`メソッド


`some`メソッドは、配列の中の少なくとも1つの要素が条件を満たすかどうかをチェックします。条件を満たす要素が見つかると、`true`を返します。もし全ての要素が条件を満たさなければ、`false`を返します。

### 使用例
```javascript
const numbers = [1, 2, 3, 4, 5];

const hasEvenNumber = numbers.some(number => number % 2 === 0);
console.log(hasEvenNumber); // true （2や4などが条件を満たします）
```

上記の例では、配列`numbers`の中に少なくとも1つの偶数があるかどうかをチェックしています。`some`メソッドは、偶数が見つかると`true`を返します。

## `every`メソッド

`every`メソッドは、配列のすべての要素が条件を満たすかどうかをチェックします。すべての要素が条件を満たすと`true`を返し、1つでも条件を満たさない要素があると`false`を返します。

### 使用例
```javascript
const numbers = [2, 4, 6, 8, 10];

const allEvenNumbers = numbers.every(number => number % 2 === 0);
console.log(allEvenNumbers); // true （すべての要素が偶数です）
```

上記の例では、配列`numbers`のすべての要素が偶数であるかどうかをチェックしています。`every`メソッドは、すべての要素が条件を満たすため`true`を返します。

## `some`と`every`の違い

- `some`メソッドは、配列の中に1つでも条件を満たす要素があれば`true`を返します。
- `every`メソッドは、配列のすべての要素が条件を満たす場合に`true`を返します。
Keycloakをdocker composeで起動する

# 概要
Keycloakをdocker composeで動かすための手順を紹介します。  
手元の環境でサクッと動作確認したい場合に便利です。
KeycloakのDBには、MariaDB、Microsoft SQL Server、Oracle Database、MySQLなどが使えますが(利用可能なDBは[こちら](https://www.keycloak.org/server/db)を参照)、本記事ではPostgreSQLを利用する場合の手順を紹介します。

# 環境
以下の環境で試しています。  
Docker 24.0.5
Docker Compose v2.20.2
WSL2 Ubuntu 22.04 on Windows

なお、AWS EC2やAzure VMにて動作させ、インターネットからKeycloakに対してアクセスする場合は、HTTPではなくHTTPSでアクセスする必要があります。  
そうしないと、Keycloakのコンソール画面にアクセスすることができません。
localhost指定でKeycloakにアクセスすればSSL化は必要ないので手間がかかりません。
本記事ではlocalhostでアクセスする場合の手順を記載します。

# 手順
１．compose.yamlを任意のディレクトリに用意して下さい。  
compose.yamlの内容は次の通りです。バージョンは適宜変えてください。

```
services:
  keycloak:
    image: quay.io/keycloak/keycloak:16.1.1
    environment:
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycloak
      DB_USER: keycloak
      DB_PASSWORD: password
      KEYCLOAK_USER: test
      KEYCLOAK_PASSWORD: test
    ports:
      - "8080:8080"
    depends_on:
      - postgres

  postgres:
    image: postgres:15.7
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
```

２．次のコマンドを実施してください。

```
docker compose up -d
```

３．コンテナが2つ起動したことを確認して下さい。

```
$ docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                                                 NAMES
439f3987026d   quay.io/keycloak/keycloak:16.1.1   "/opt/jboss/tools/do…"   3 seconds ago   Up 2 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 8443/tcp   keycloak-postgresql-test-keycloak-1
ff665a3ec46c   postgres:15.7                      "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp             keycloak-postgresql-test-postgres-1  
```

４．ブラウザにて `http://localhost:8080` にアクセスし、Keycloakのコンソール画面が表示されることを確認して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/5750ac03-72b4-10f2-d2aa-6b6ae1fd0e68.png)



ログイン情報は、compose.yamlに記載してあるものです。  

ログインできれば、次のような画面になり、自由に触れるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/db607713-67d2-323e-7b69-227d336610a0.png)



# 参考
https://www.keycloak.org/server/db
rails永続的なセッション

# 概要
railsを勉強している時に永続的なセッションを作成するのに
便利なメソッドがあったので記録として残します。

# 実際のコード
```.rb
cookies[:remember_token] = { value:   remember_token,
                             expires: 20.years.from_now.utc }
```
上記は20年後期限切れになる記憶トークンです。
これをメゾットを使うことで
```.rb
cookies.permanent[:remember_token] = remember_token
```
のように書くことができます。
棒グラフでカテゴリをグループ化する(SPSS Modeler データ加工逆引き10-20)

# 棒グラフでカテゴリをグループ化する

![スクリーンショット 2024-06-13 22.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5ed3fdd8-532b-d36d-11ab-08b62e0ff430.png)

## 1.想定される利用目的

・分布を確認しながらカテゴリを再編成する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/bar_merge.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-06-13 22.31.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a6314cbf-86cc-5dfa-3595-0136e5854939.png)

a.入力するデータは次の通りです。
![スクリーンショット 2024-05-28 11.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/886d4bae-ba2b-c571-3bcb-a264269116a6.png)

b.[棒グラフ]ノードを編集します。
![スクリーンショット 2024-05-28 11.22.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bf601586-e9de-d5fe-1249-b8a7949a5880.png)

[実行]します。

![スクリーンショット 2024-06-13 22.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8f6ada42-3723-1aa8-15aa-3cb5f14d0633.png)

[デコポン]と[ブドウ]を選択し、メニューから[編集]＞[グループ化]を選びます。

![スクリーンショット 2024-06-13 22.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c98aecec-393e-0ca2-202e-d60a4f1b4708.png)

[グループ化1]にカテゴリが統合されているのを確認してメニューから[編集]＞[グループの編集]を選びます。

![スクリーンショット 2024-06-13 22.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f6b23bc1-67af-a521-49bf-0893d8464ad7.png)

以下の画面で任意のグループ名を作成します。[OK]ボタンを押します。

![スクリーンショット 2024-06-13 22.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d62c108d-d9cd-bdbf-a903-cbcc1bb2a04d.png)

メニューから[生成]＞[データ分類ノード（グループ）]を選びます。cが自動生成されます。

![スクリーンショット 2024-06-13 22.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/29ff8318-35d0-e00e-0261-15eb0741cdb1.png)

c.[データ分類]ノードを編集します。[データ分類先]を[既存のフィールド]に変更します。

![スクリーンショット 2024-06-13 22.36.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9896b865-bfab-d4c1-5948-6f075d1af315.png)

d.[棒グラフ]ノードを実行します。[グラフ]タブで表示しています。

![スクリーンショット 2024-06-13 22.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cf1ed16d-14aa-d6d8-3c08-97674d77761d.png)


#### 注意事項

cの[データ分類]ノードでは既存のカテゴリを上書きしていますが、オリジナルのグループを残す場合には[データ分類先]を[新規のフィールド]にして任意のフィールド名をつけます。

## 4.参考情報

#### 棒グラフのノードリファレンス

https://qiita.com/416nishimaki/items/8178b9565b8da1a794f1

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
GitHub Packagesへのdocker pushでハマった

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry

このドキュメントでGithub Packagesへの登録をしようとして、`docker push`コマンドを実行したら`permission denied`が出ました。
権限を適切に設定しても、なおエラーになるのでちょっとハマりました。
解決方法を記載します。

# TL;DR
今(2024/6現在)ではPackagesへのpushは`personal access tokens (classic)`しか使えない。Organizationの設定で`personal access tokens (classic)`を有効にする必要がある。

# エラー内容と解決方法

```text
denied: permission_denied: `OrgName` forbids access via a personal access token (classic). Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.
```

Github Packagesのpushで必要になる、個人アクセストークンが2種類あります。
推奨されているのは、新しく出たpersonal access token (fine-grained personal access token)になります。
しかし、このfine-grained personal access tokenはGithub Packagesのpushには使えません。
なので、今(2024/6現在)では`personal access tokens (classic)`しか使えません。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token

```text
denied: permission_denied: The token provided does not match expected scopes.
```

このエラーは、アクセストークンのスコープが足りない場合に出ます。
具体的に必要なスコープは以下の通りです。(repoは勝手に有効になります)
![スクリーンショット2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/bd1332ad-7b0a-fd9d-19c6-e8ebcf0fdf4e.png)

また、組織内で`personal access tokens (classic)`を使うためには、組織の設定で`Allow acess via personal access tokens (classic)`を有効にする必要があります。
(私はここが抜けていたので、エラーが出てハマりました。)

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/962b8126-3880-3c40-7b25-0b8e8e811a44.png)
vscode を 1.90 にアップデートすると git bash が遅くなるのを解決した

## はじめに

表題の通り、vscode を 1.90 にアップデートして以降、git bash での操作がとても重くなってしまいました、、（コマンド 1 つ打つのに 10 秒以上かかる）
色々調べてみたところ、解決方法を発見したのでここで共有してみます！

## 結論

vscode の設定から`terminal.integrated.shellIntegration.enabled` をオフにすることで問題が解決します。

この設定は、vscode のターミナルシェル統合機能を有効または無効にするオプションらしく、これをオフにすることで、vscode が特定のターミナルシェルと連携する際に起こるパフォーマンスの問題が回避できたようです。

![スクリーンショット 2024-06-19 151146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/8e49abc6-15cb-f31a-d1ed-7a8edea48a8d.png)


## 詳細

日本語で検索してもなかなか、全然英語で事象を検索する（「vscode gitbash slow」と検索しました）と、github で解決している記事を見つけました！

https://github.com/microsoft/vscode/issues/214448#issuecomment-2152648696

解消方法の具体的な手順は以下になります。

1. **vscodeを開く**。
2. **設定（Settings）を開く**：
    - メニューバーから「ファイル（File）」 > 「基本設定（Preferences）」 > 「設定（Settings）」を選択するか、`Ctrl + ,` キーを押します。
3. **設定を検索**：
    - 設定ウィンドウの検索バーに「terminal.integrated.shellIntegration.enabled」と入力します。
4. **シェル統合設定をオフにする**：
    - 「terminal.integrated.shellIntegration.enabled」オプションを見つけ、チェックを外してオフにします。

この設定を無効にすると、vscode はターミナルシェルとの統合を試みなくなり、結果としてパフォーマンスの問題が解消される場合があります。

他には **vscode のバージョンを下げる** というのもありましたが、一旦これで問題なさそうです！

## 感想

ふと思いましたが、英語で検索するのは大事だなと思いました。
新しめの情報ならなおさらですね、、、
CompTIA Server+ Certification Training

detailed training program for the CompTIA Network Plus Certification Training, which is designed to provide participants with the foundational networking knowledge and skills required to design, manage, and troubleshoot wired and wireless networks.

Key Features:

Experienced Instructors:

Training is conducted by certified professionals with extensive experience in networking and teaching.
Comprehensive Curriculum:

The course covers all the essential topics required to pass the CompTIA Network+ certification exam, including network infrastructure, network operations, network security, and troubleshooting.
Hands-on Practice:

Practical labs and real-world scenarios provide hands-on experience with networking equipment and software.
Study Materials:

Participants receive study guides, practice exams, and other resources to aid in their preparation.
Flexible Learning Options:

Sprintzeal offers both online and in-person training options to accommodate different learning preferences and schedules.

CompTIA Server+ Certification is an internationally recognized vendor-neutral certification focused on offering a strong foundation of server skills and the latest server technologies. CompTIA Server+ Certification training program equips candidates with the skills necessary to create, handle, and support server technologies. CompTIA Server+ Training is majorly focused on virtualization, storage, troubleshooting, and storage.

https://sprintzeal.com/course/comptia-server-certification-training

![uploading...0]()
闘魂Elixir ーー AtCoder Beginner Contest 336(B)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 336](https://atcoder.jp/contests/abc336)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [B - CTZ](https://atcoder.jp/contests/abc336/tasks/abc336_b)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

整数をまず二進数で表す必要があります。[https://hexdocs.pm/elixir/Integer.html#to_string/2](Integer.to_string/2)の第2引数に、2を指定すると、整数を2進数表現の文字列にしてくれます。あとは末尾に0が何個ならんでいるのかを数えるだけです。いろいろやり方はあるとおもいます。私は逆順に並び替えて、`0`が続くまで再帰でカウントアップする方法を採りました。


```elixir
defmodule Main do
  def main do
    n = IO.read(:line) |> String.trim() |> String.to_integer()

    solve(n)
    |> IO.puts()
  end

  def solve(n) do
    charlist = Integer.to_string(n, 2) |> String.to_charlist() |> Enum.reverse()

    do_solve(charlist, 0)
  end

  defp do_solve([], acc), do: acc
  defp do_solve([?1 | _tail], acc), do: acc
  defp do_solve([?0 | tail], acc), do: do_solve(tail, acc + 1)
end


```




</details>




---

# さいごに

[AtCoder Beginner Contest 336](https://atcoder.jp/contests/abc336)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
Openpyxl: 背景色の変更

## プログラム

```py:set_bg_color.py
#! /usr/bin/python
#
#	set_bg_color.py
#
#					Jun/19/2024
# ---------------------------------------------------------------
import sys
import openpyxl
from openpyxl.styles import PatternFill

# ---------------------------------------------------------------
xlsx_in=sys.argv[1]
xlsx_out=sys.argv[2]
sys.stderr.write(xlsx_in + "\n")
sys.stderr.write(xlsx_out + "\n")
wb = openpyxl.load_workbook(xlsx_in)

ws = wb.worksheets[0]
print("ws.max_row = %d" % ws.max_row)

fill_solid_color = PatternFill(patternType='solid', fgColor='fff2cc')
ws['A1'].fill = fill_solid_color
ws['B1'].fill = fill_solid_color

for it in range(1,ws.max_row+1):
	ws.cell(it,4).fill = fill_solid_color
#
wb.save(xlsx_out)
# ---------------------------------------------------------------

実行方法

```bash
./set_bg_color.py in01.xlsx out01.xlsx
```
闘魂Elixir ーー AtCoder Beginner Contest 336(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 336](https://atcoder.jp/contests/abc336)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Long Loong](https://atcoder.jp/contests/abc336/tasks/abc336_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

連続する文字の生成には、[String.duplicate/2](https://hexdocs.pm/elixir/String.html#duplicate/2)を使うとよいでしょう。


```elixir
defmodule Main do
  def main do
    n = IO.read(:line) |> String.trim() |> String.to_integer()
    
    solve(n)
    |> IO.puts()
  end
  
  def solve(n) do
    "L#{String.duplicate("o", n)}ng"
  end
end


```




</details>




---

# さいごに

[AtCoder Beginner Contest 336](https://atcoder.jp/contests/abc336)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
python で int で値を入れつつ、json 化の際には文字列を使う Enum の作り方

```py
class Int2StrEnum(StrEnum):
    def __new__(cls, int_value, string_value):
        obj = str.__new__(cls, string_value)
        obj._value_ = string_value
        obj.int_value = int_value
        return obj

    @classmethod
    def from_int(cls, value: int):
        for member in cls:
            # noinspection PyUnresolvedReferences
            if member.int_value == value:
                return member
        raise ValueError(f"{value} is not a valid value for {cls.__name__}")


class A(Int2StrEnum):
   AAA = (1, "AAA(jsonで使う文字列)")
   BBB = (2, "BBB")
   CCC = (3, "CCC")
```

みたいに定義しておいて、

```py
# 値をセットするとき
assert A.from_int(1) is A.AAA

# json.dumps のとき
json.dump({'a': A.AAA})  # そのまま渡せばいい
```
Tigressで難読化するとコンパイルできない

# まえがき
研究でCode2Codeの難読化をする機会があった
難読化はの方法はいろいろあるが、Tigressと呼ばれる難読化プログラムを使用した
- [Tigress](https://tigress.wtf/index.html)

TigressはC言語用のCode2Codeな難読化ツールで豊富なオプションが特徴
どのようにコードを難読化するかをユーザーがかなり自由に選択できる
本記事ではTigress導入の方法や、導入に際して躓いたポイントを残しておく

## Debian上でしかうまく動作しない
以下のページからバイナリやpkgをインストールすることができる。
筆者は`tigress_3.3.3-1_any.deb`を選択した
![2024-06-19 14.12.57 tigress.wtf fd2d0bbca6a3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636992/16693532-1acf-169e-bd17-f1d415330b2d.png)



このパッケージを選択した場合、筆者の確認した限りにおいてはDebian上でしか正常に難読化が動作しない。
Ubuntu等、別のディストリビューションにインストールしてコードを難読化すると、難読化されるコードが`stdio`, `stdlib`をインクルードしている場合、難読化されたコードがコンパイルできない
具体的には以下のようなエラーが発生する
```
./obfuscated_code/test_tigress.c:1142:54: error: ‘fclose’ undeclared here (not in a function)
 1142 | extern FILE *tmpfile(void)  __attribute__((__malloc__(fclose,1), __malloc__)) ;
      |                                                      ^~~~~~
./obfuscated_code/test_tigress.c:3778:12: error: ‘reallocarray’ undeclared here (not in a function)
 3778 | __malloc__(reallocarray,1), __alloc_size__(2,3))) ;
      |            ^~~~~~~~~~~~
```

同様の問題が発生した場合はとりあえずDebianにインストールして試してみるとよいと思う。
筆者の環境では、以下のようなdockerfileを作成して、その上で試したところ、正常に動作した。

```dockerfile
FROM debian:bullseye

RUN apt-get update && \
  apt-get install -y \
  build-essential \
  gcc \
  sudo \
  python3


WORKDIR /app
RUN mkdir /app/original_code
RUN mkdir /app/obfuscated_code

COPY tigress_3.3.3-1_any.deb /app/
COPY obfuscate_programs_by_tigress.py /app/

RUN sudo dpkg --force-architecture -i  tigress_3.3.3-1_any.deb
```
写真から路面のひび割れ範囲を解析する

http://trianglelist.home.blog/2024/06/19/%e5%86%99%e7%9c%9f%e3%81%8b%e3%82%89%e8%b7%af%e9%9d%a2%e3%81%ae%e3%81%b2%e3%81%b3%e5%89%b2%e3%82%8c%e7%af%84%e5%9b%b2%e3%82%92%e8%a7%a3%e6%9e%90%e3%81%99%e3%82%8b/
eslint --initで `enforce code style`が選べなくなっていたことの調査メモ

# はじめに

ESLintはJavaScriptやTypeScriptのコード品質を保つためのツールですが、最近のアップデートで設定方法が変わり、一部のオプションが削除された。`npm eslint --init`コマンドを実行して選択肢が変わっており、変なハマり方をしたため、調査結果を備忘として記載します。

### 期待した選択肢
```bash
? How would you like to use ESLint? (Use arrow keys)
  To check syntax only
  To check syntax and find problems
❯ To check syntax, find problems, and enforce code style
```

### 最新の選択肢
```bash
? How would you like to use ESLint? (Use arrow keys)
  To check syntax only
❯ To check syntax and find problems
```

ESLintを8.0.0まで落としたところ、選択肢が復活。どこで変更が加えられたのか気になったため、調査しました。




## ESLintのフォーマットに関するルールの廃止について
フォーマットに関するルールがESLintから削除された様子。

- [Deprecation of formatting rules - ESLint Blog](https://eslint.org/blog/2023/10/deprecating-formatting-rules/)

メンテナンスの負荷軽減が主な理由。ただ、2023年10月以前のバージョンに戻しても`enforce code style`が選べない問題は解決しなかった。

## バージョンを特定

過去のバージョンで調査したところ、以下の状況。

- 8.6 → 適用されていない
- 8.7 → 適用されている

関連するコミットを確認したところ、以下の変更が行われていた。

- [Release v8.7.0 · eslint/eslint](https://github.com/eslint/eslint/releases/tag/v8.7.0)
- [feat: move `eslint --init` to @eslint/create-config (#15150)](https://github.com/eslint/eslint/commit/0d2b9a6dfa544f7ab084425eafc90a90aa14bcae)

initコマンドはversion 8.7でcreate-configに移管され、create-configの最新版が自動で呼ばれるようになった模様。

### create-configの変更

`enforce code style`の選択肢がなくなったのは以下のコミット。

- [feat: remove style guides (#108)](https://github.com/eslint/create-config/commit/de1d085e0c7f465492a352f577e14535cd745399)

2024年4月28日以降のようですが、8.7以降のESLintではcreate-configの最新版を使用するようになっている。ESLintのバージョンを8.6以前に戻せば古い選択肢（`enforce code style`がある）が表示され、8.7以降ならば新しい選択肢（`enforce code style`がない）が表示される、ということと理解しました。


## 最後に
このガイダンスに沿って作成されたファイルをそのまま使うわけではないかと思いますが、書籍や記事を参考にしていると、バージョンを揃えても異なるガイダンスが表示されるのは戸惑うだろうなと思い記事化しました。
フロントエンドについてはまだ勉強中のため、何か不備等があればコメントで指摘してもらえますと幸いです。
ChatGPTをブックマークマネージャーとして使用してみた

# 読んだ記事、後で読む記事をChatGPTに覚えてもらうのはどうか
記事を後でまた読み直したいときや、読む時間がないときに、記事の保管に悩みませんか？
ブラウザのブックマークは検索に難があり、たまってくるとどれがなんの記事かわからなくなりがちです
Notionなどにメモ形式でまとめようとすると、要約は結局のところ自分で書かなければなりません

ChatGPTに任せたところ、なかなか便利に管理できているので、セットアップ方法と使い方をご紹介します
- URLを渡したらいい感じに記事を要約
- 自然言語で記事を検索

## GPTs
細かい調整なしで使えるように、GPTsも用意しています
https://chatgpt.com/g/g-u02q65hud-hutukumakumanesiya

## 初回プロンプト
最初にこのプロンプトを指示します

```
ブックマークを管理してください
URLを提示した場合、そのページの情報を記憶してください
質問した場合、記憶したページの中から、URLとともに回答してください
想定される質問は以下のとおりですが、他にも増える可能性があります

ブックマークの中から、参考になりそうなページを返す
ページについての曖昧な質問から、どのページを指しているのか判断し、URLを返す
```

## ページを追加する
### URLを渡す
jujutsuというバージョン管理システムが気になったので、保存してもらいました
URLを入力するだけでOKです
![スクリーンショット 2024-06-25 8.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/5f92a09f-8b0e-093d-9f52-a93ae5ccdf1a.png)

### URLと本文を渡す（ChatGPTがアクセスできないページの場合）
Googleのブログは、ChatGPTでは開けないようでした
![スクリーンショット 2024-06-19 14.26.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/d3e45121-14d3-eb22-0429-fb093c20e407.png)

そういう場合は、本文のコピペを合わせて渡します
![スクリーンショット 2024-06-25 8.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/f9a87cac-c817-83d8-ad52-3efcbc8391a6.png)

## 検索
あとは、好きなように検索するだけです
![スクリーンショット 2024-06-19 14.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/ded8c650-d75a-8b41-0c9c-a29cbff75fd5.png)

追加に失敗しているURLの一覧も出せます
![スクリーンショット 2024-06-19 14.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/2d8fa6c7-2c7b-f3da-e64c-342aeeba9769.png)

## 削除
もちろん削除もできます
![スクリーンショット 2024-06-25 8.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/ed6d1aeb-7683-856b-5a70-711c048cd4c9.png)


## チャットログ
今回使用したチャットのリンクです
https://chatgpt.com/share/885e78df-9d33-4e68-9040-743c685749dd

## まとめ
ChatGPTをブックマークマネージャー化し、記事などを管理する方法のご紹介でした
最近はページを開いたら、読む前にこのチャットに投げてしまっています

皆様のお役に立てば幸いです
PukiwikiプラグインがPHP8で動かなくなった問題

# 産業で説明

- dump2html.inc.php （と、それに依存する2つのphpソース）は、PHP8では動きません。
- 直し方をご説明します。

あれ？二行じゃん。

# PHP8で、classのコンストラクタの書き方が変わりました。

- 以前のPHPは、class名と同名のメソッドを書くとそれがコンストラクタになっていましたが、PHP8ではその書き方は完全に廃止され、呼ばれません。（エラメも出ない）
- PHP8では __construct() というメソッドがコンストラクタになります。
- classを継承して、親クラスのコンストラクタを呼ぶときも、parent::class名() ではだめで、parent::__construct() で呼ばないとだめです。（当然ですね）

# その他

- あともういっこありました。
```
  $配列名{0} ---> $配列名[0]
```
- なんで {} で配列の添え字が表現されてるんだろう・・・このソース。

このプラグインとは無関係ですが・・・
- create_function() も廃止されています。
- function(){return ・・・・;} みたいに書き直します。
Active Jobとバックグラウンドジョブフレームワーク

## TLTR;
- Active Jobはバックグラウンドジョブを扱うためのフレームワークであり、一種のラッパーです。
- Active Jobは、様々なバックグラウンドジョブフレームワーク（例：Sidekiq、Delayed Job、Resque）をサポートするためにアダプターパターンを使用し、抽象化された統合API（例：enqueue）を提供します。
- Railsはサードパーティのバックグラウンドジョブフレームワークを使用しない場合、バックグラウンドジョブフレームワークの代わりにインメモリ方式を使用します。
- バックグラウンドジョブフレームワークは、ほとんどの場合、キューを使用してジョブを管理し、ワーカーがジョブを取得して処理する方式で動作します。
- ワーカーはバックグラウンドでキューに保存されたジョブを処理する独立したプロセスやスレッドです。ワーカーはジョブキューからジョブを取得して実行します。複数のワーカーを同時に実行できるため、並行してジョブを処理できます。
- 一部のバックグラウンドジョブフレームワークは優先順位を設定することができます。

## バックグラウンドジョブフレームワークの動作
1. ジョブの予約:
開発者は特定の時間に実行されるジョブを予約します。例えば、**perform_at**メソッドを使用してジョブを予約します。
予約されたジョブはRedisやデータベースに保存され、実行時間の情報も一緒に保存されます。
2. ジョブスケジューラー:
スケジューラーは定期的にストレージをチェックして、実行時間になったジョブを確認します。
実行時間になったジョブは予約ストレージから通常のジョブキューに移動されます。
3. ジョブの実行:
ワーカーは通常のジョブキューを監視し、キューにあるジョブを取得して実行します。
ジョブが完了すると、ワーカーは次のジョブを処理します。

## 参考
https://guides.rubyonrails.org/active_job_basics.html
営業職のためのAI活用・その1

# 営業職のためのAI活用

tags: AI, ChatGPT

## はじめに

営業職の皆さん、ChatGPTを活用していますか？AIを活用することで、業務の効率化や生産性の向上が期待できます。本記事では、営業職の方々に役立つChatGPTの活用方法を具体的に紹介します。（営業・ビジネスマン向けのAIの話をする機会があったのでちょっとメモを残しておきます）

## ChatGPTの簡単な説明

ChatGPTは、OpenAIが開発した大規模な言語モデルです。自然言語処理の分野で優れた性能を示し、対話形式でのコミュニケーションが可能です。カスタム指示やパラメータ調整など、様々な設定を行うことで、用途に応じた出力を得ることができます。

## 営業職におけるChatGPTの活用例

### 1. 顧客とのコミュニケーション支援

プロンプト例:

```prompt:sample
あなたは営業担当者です。顧客から以下のような質問が来ました。適切な回答を考えてください。

顧客: 御社の製品Xについて、他社製品との違いを教えてください。
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/442e41c9-c1f4-daa6-a979-61f0086fb0bb.png)



### 2. 営業メールの作成

プロンプト例:

```
以下の情報を元に、新規顧客へのアプローチメールを作成してください。

- 製品: AI搭載のCRMシステム
- 顧客: 中堅企業の営業部長
- 提案内容: 営業活動の効率化と売上増加
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/8da54b3e-c8d9-ac96-ac16-76b3c09a6268.png)



### 3. 商談準備のための情報収集

プロンプト例:

```
次の商談に向けて、関連する業界動向や競合他社の情報を要約してください。

- 業界: 小売業界
- 商談相手: A社の営業企画部長
- 商談目的: 新商品の提案
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/0a9d1b82-a582-b0dd-348e-389e0ed01a57.png)


### 4. 営業日報の作成支援

プロンプト例:

```
本日の営業活動を元に、営業日報を作成してください。

- 訪問先: B社、C社
- 商談内容: B社との契約更新、C社への新商品提案
- 次のアクション: B社への見積り提出、C社とのフォローアップ
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/5c9fbb78-1d4d-be5e-f4c4-0fe31e713a19.png)

## まとめ(たてまえ)

営業職の皆さんは、ChatGPTを活用することで、顧客とのコミュニケーション、営業メールの作成、商談準備、営業日報の作成など、様々な場面で業務の効率化を図ることができます。ぜひ、自分の業務にあったプロンプトを工夫して、ChatGPTを有効活用してください。


## まとめ(本音)

まあ、正直全然使えねー、と思ったと思います。　営業職の皆さんは、ChatGPTを活用しても、俺の方がなかなか鋭いぜ。とか、こいつ顧客のこと全然わかってないジャンか、と思ったことでしょう。

次回、そのあたりを改善していこうと思います。
CloudFlareにデプロイするためのRemixプロジェクトでCloudFlare上のD1へマイグレーションやSeedの実行を行うコマンドを用意、デプロイして確認

## 概要

下記で追加したローカル用のマイグレーションやseed実行のコマンドの、CloudFare内のD1に対するマイグレーションやseed実行のコマンドを用意する

https://qiita.com/miriwo/items/bdac2da0394ab6a32657

https://qiita.com/miriwo/items/1cfb05c9501f9cb18b07

## 前提

下記の作業作業が終わっていないと、本作業ができないというわけではないが時系列的には下記が完了している必要がある。

https://qiita.com/miriwo/items/17508acb319b77496a53

## 方法

1. `execute_seeds.sh`を下記のように修正し、引数を受け取れるように変更

    ```execute_seeds.sh
    #!/bin/bash
    
    # SQLファイルのリスト
    sql_files=(
        # NOTE: seedファイルを追加したらこちらにも追加
        "./seeds/task_category_masters_seed.sql"
        "./seeds/tasks_seed.sql"
    )
    
    # 各SQLファイルを実行
    for file in "${sql_files[@]}"; do
        npx wrangler d1 execute todo-cloudflare-d1 $1 --file "$file"
    done
    ```

1. `package.json`のscriptの中身を下記のように記載

    ```package.json
    "scripts": {
      "build": "remix vite:build",
      "deploy": "npm run build && wrangler pages deploy",
      "dev": "remix vite:dev",
      "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .",
      "start": "wrangler pages dev ./build/client",
      "typecheck": "tsc",
      "typegen": "wrangler types",
      "preview": "npm run build && wrangler pages dev",
      "cf-typegen": "wrangler types",
      "local-seed": "./execute_seeds.sh --local",
      "local-migrate": "npx wrangler d1 migrations apply todo-cloudflare-d1 --local",
      "local-migrate-fresh": "npx wrangler d1 execute todo-cloudflare-d1 --local --file ./seeds/drop_tables.sql",
      "local-migrate-reset": "npm run local-migrate-fresh && npm run local-migrate",
      "local-migrate-reset-and-seed": "npm run local-migrate-reset && npm run local-seed",
      "remote-seed": "./execute_seeds.sh --remote",
      "remote-migrate": "npx wrangler d1 migrations apply todo-cloudflare-d1 --remote",
      "remote-migrate-fresh": "npx wrangler d1 execute todo-cloudflare-d1 --remote --file ./seeds/drop_tables.sql",
      "remote-migrate-reset": "npm run remote-migrate-fresh && npm run remote-migrate",
      "remote-migrate-reset-and-seed": "npm run remote-migrate-reset && npm run remote-seed"
    },
    ```

1. 下記の順番でマイグレーション → seed → デプロイを実行

    ```shell
    npm run remote-migrate
    npm run remote-seed
    npm run deploy
    ```

1. CloudFlare上の「サイトにアクセス」をクリックして、画面が開き、ローカルと同じように動作することを確認

    ![CleanShot 2024-06-19 at 14.37.46@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dcda4fca-3cd3-0a94-c848-34b67fada268.png)
[体験談] 短大から大学編入をした経験について ~ 大学編入試験

# はじめに
こんにちは，Umamusume22です．前回は高校~短大時代の記事を書きました．今回は大学編入試験について記事を書きます

# 編入とは？
はじめに編入とは短大や高専などを卒業した人(または卒業見込み)が出身校での単位取得が認められて4年制大学に2年次または3年次に入学する制度のことです[1]．
私は短大を卒業して大学の3年次に編入しました

# 大学編入試験の受験科目
大学の編入試験は大学によるのですが受験科目が3科目とかで受験することができます．この点は大学入試と異なります．情報工学部の編入試験では数学，英語(またはTOEIC)，プログラミング(大体C言語)，情報工学(論理回路とか)と面接，口頭試問が設けられています．大学によっては力学や電気回路が設けられています．旧帝大の場合だと化学があったりします．３科目中２科目を選択するケースもあります．口頭試問の有無も大学によって異なります
受験する科目は大学によって本当に違います．例えば，A大学の場合は受験科目が数学，英語，面接しかありません．一方，B大学だと英語がない代わりにプログラミングが試験科目に導入されているケースがあります．

# 大学編入試験の試験日
試験日も受験科目と同様に大学によって違います．しかし，国公立大の場合は大体5~9月ぐらいの夏に行われます．私大の場合，もう少し遅いです．(詳しくは各大学の編入試験の募集要項を確認してください)
編入試験は大学入試と違って国公立大学の併願が可能です．大学入試だと前期，中期，後期と受験する回数が決まっています．また，共通試験に失敗したら浪人して来年受験することになります


# 私の編入試験の結果
私は国公立大学を3校受験して2校に合格しました．
1校目に受験した国立大学はダメでした
3校とも地方国立大学です
 
# 1校目 (情報工学部 仮)　　共通試験のボーダー (前期:54% 後期：65%) [2]
受験日：５月でした
受験科目：数学(必須)，プログラミング(C言語)，情報工学，電気回路の３つのうち2つを選択
プログラミング(C言語)，情報工学を選びました
面接の有無：有
口頭試問の有無：無
志望理由書の有無：無
TOEICのスコアの有無：無

受験した感想：プログラミングと情報工学を選択したのですがあまり解けた手応えがありませんでした．再帰関数の問題がわかりませんでした．あと，ポインタあたりも解けませんでした．この点は短大の対策授業でもやったところですが苦手意識を持っていました．今でもポインタや再帰関数は好きじゃありません
情報工学は基本情報を所有している方であれば解けたと思います
論理回路は解けたと思います．
数学は微分方程式が出ました．対策授業でやったところです．しかし，体調不良で対策授業に参加することができませんでした．結局，当日は解けませんでした
面接では当たり障りのないことを聞かれました．2年次編入になるけど大丈夫？，どんなテクノロジーの社会問題に興味ある？短大でやったプロジェクトなどを聞かれました

反省点：体調管理に気をつけてもう少し専門科目の勉強をする．特に苦手な箇所を潰す

# 2校目 (情報工学部 仮) 共通試験のボーダー (前期:56% 後期：66%) [2]
地方国立大学です
受験日：6月でした
受験科目：数学(必須)，プログラミング(C言語)，力学，化学，電磁気，電解回路などの1つを選択
力学を選択しました
面接の有無：有
口頭試問の有無：無
志望理由書の有無：有
TOEICのスコアの有無：有 (555点で提出)

受験した感想：力学は短大でやっていない所が出題されて困りました．そこで，途中でプログラミングに変更したのですが割と難しくて解き終わらないことに気がつきました．再び力学を選択してそれらしい運動方程式を記入しました．数学は解けました．微分方程式は出題されませんでした
志望理由書の記入が一番大変でした．短大の先生に添削してもらったのですが何度もダメ出しされてしんどかったです．大学の研究室の研究内容をHPで見ても書いていることが分からないケースもありました．それでも何度も書き直して先生にこれ良いねと言われる志望理由書を書き上げることができました．

反省点：初めて国立大に合格しました．面接も好印象だったと思います．途中で笑いが起きたりしました．また，ロボコンについても聞かれました．面接は上手く行った可能性が高いです．ただ，プログラミングが解けなかった点や習っていない力学の内容は勉強が必要だと思いました

# 3校目 (情報工学部 仮)　　共通試験のボーダー (前期:54% 後期：59%) [2]
地方国立大学です
受験日：2校目の次の日だったと思います
受験科目：数学，英語(筆記)
面接の有無：有
口頭試問の有無：無 (電気回路，電磁気，情報工学のうち2つを選択)
志望理由書の有無：有
TOEICのスコアの有無：無

受験した感想：数学は早く解き終わって暇でした．英語は高校レベルでした．多分，英語に関しては大学入試の勉強に取り組んでいた人であれば楽勝だと思います．自由英作文がありました．英検２級のようなものです
面接は集団面接でした．なんで編入したいの？，卒業後はどうするの？，興味ある研究室は？の３つしか聞かれませんでした．その後の口頭試問では情報工学を選びました．内容は知っているソートのアルゴリズムを説明してくださいでした．バブルソートとかクイックソートなどの説明を黒板で説明しました

反省点：合格して初めて短大の実績ができました．英語が少し解けませんでした．日本語から英語に文章を作成する英作文ができませんでした．この大学は私が通っていた短大ではまだ実績がなかったため，面接の情報や口頭試問の出題内容が不明でした．


# さいごに
共通試験420点だった私が、2年間の短大生活を経て国立大学に編入合格することができました．合格した大学を浪人で目指していたら、共通試験であと150点は上げる必要があったと思います．浪人して150点上げるのは大変です．また，2次試験の勉強も必要です．1年では間に合わなかったです．

今回は記事の執筆をここまでにします．次は短大を卒業してから現在までの記事を書きます

# 参考文献
[1] "日本の大学 編入学制度のある大学検索"
https://www.gakkou.net/daigaku/search/hennyu.html

[2] "パスナビ"
https://passnavi.obunsha.co.jp/univ/1320/difficulty/
定数の値ってずっと固定なの？変わるの？

## おことわり

頭悪い人の「俺の 記憶力 or 知能 には問題があるのでは？」っていう日記です．

## 話

「C or C++ 言語はじめてみました！」から３日目あたりで，こんなコードを書いたりすると思う．

```C++
//こんなのがあって…
#define BUFF_SIZE (10)

//なんか↑のBUFF_SIZEを使った実装
int Buff[ BUFF_SIZE ];
...
```

最近のC++だと `#define` の部分を
`constexpr size_t BUFF_SIZE = 10;`
とか何とか書くのがおしゃれ(?)らしいけども，そこはどうでもいい．

とにかく何かこのような場合，「BUFF_SIZEを使った実装」は，後から `BUFF_SIZE` の値を変えてコンパイルしても動くように書くよね．
（まぁ「ある程度常識的な値の範囲に関して」という話にはなるとしても）

**それは何故なのか？**

「`BUFF_SIZE` の値が `10` であること」に依存した（`10`じゃないと困るような）実装をしてしまわない理由とは何か？
まぁそれはもちろん，「自分自身がそういう意味合いの物として `#define BUFF_SIZE (10)` とか書いたから」だ．
目的に反したコードを書いて自分自身で「ウボァー」とか言う必要はあるまい．

それじゃあ，この `#define BUFF_SIZE (10)` を他人が書いた場合にはどうなのか？
それでも「`BUFF_SIZE` の値を変えてコンパイルしても動くように書く」のだとしたら，どうのようにしてそういう忖度(?)をするに至ったのか？
`BUFF_SIZE` という命名の雰囲気から「まぁそういうことだよね」と察することができたから…？

こういうの↓とかはどうなのか．

```C++
//何かわからんけども J, Q, K の３つの種類があるっぽい
enum SomeTypes{ J, Q, K };  //特に値には言及されていないようにも見えるが…？　果たして？
```

最近のC++だと `enum class` とか書くのがおしゃれ(?)らしいけども，そこはどうでもいい．

この場合，{ `J`, `Q`, `K` } の値は今のところ { `0`, `1`, `2` } になってるわけだけども，
これって，`J`, `Q`, `K` という３つの定数をその値まできっちりと決めているのだと捉えて良いのだろうか？
もしそうならば，0から始まる連番であることを利用したようなコードを書いたりとかできるよね．（配列のindexに用いてみたりとか？）

でも，もしもこのenumの書き手が「３つの種類があります」以上の事を言っているつもりが無いならば，このenumの定義が後から

```C++
//何かわからんけど順番が気に入らなかったので直した，とか
enum SomeType{ K, Q, J };  //KとJの値が入れ替わっちゃったよ

//変なところに増やしちゃった，とか
enum SomeType{ A, J, Q, K };	//先頭に A が追加されたよ！

//ごめん，（何らかの未知の都合で）こういう値にするからよろしくね，とか
enum SomeType{ J=1100, Q=1200, K=1300 };
```

とか何とか変更され得る気もする．
そんな話だとしたら，値に依存してたらまずいよね．

…
…
…

…っていうのを，実際には「他人」なんて存在がいない世界で「これはどうなん？」とかなったりするのだけど，自分の頭が悪いからですか？

ちょっと前に書いたコードに存在する定数が「この値は未来永劫コレですぞ！」っていう確固たる定義なのか，それとも「この値はビルドごとに変わり得るパラメタ」みたいなやつなのか，わかんなくなるんですけど？？

---

「俺の中には　定数　ってのは２種類存在して…　区別が……　？　？？　？？？？」などと意味不明な供述をしており……
ESP32のブートモード時にメッセージが出てこない問題調査

# 1.ESP32のブートが出来ない。
今回はソフト担当会社様から打ちあがった課題でした。
ESP32-WROOM-32Eを使ったIoT機器の基板で通常の立ち上げはするがBOOTモードに入っても書き込みができないという相談でした。
ESP32はブートモードに入る際にIO0(25pin）をGNDに落とした状態でリセット解除を行うと遷移しますが、その対応をしても起動せず困っている状況でした。


# 2.Arudino IDEにて書き込み確認。
まず初めに現象確認のためArudino IDEで書き込みを実施します。その結果、以下のエラーメッセージが出る事を確認しました。

A fatal error occurred: Failed to connect to ESP32: No serial data received.
＜直訳：致命的なエラーが発生しました: ESP32 への接続に失敗しました: シリアル データを受信できませんでした。＞

確かに何らかの原因でESP32にアクセスできない現象が起きているようです。そのためシリアルデータのモニタ場にも
rst:0x1 (POWERON_RESET),boot:0x2 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_FEO_V2))
waiting for download
とBoot時にESP32から送信されるメッセージが届かない状況の用です。


# 3.周辺回路の確認。
次にESP32の周辺回路を確認します。
今回のモデルはI2C、UARTやGPIOを利用して外部機器と繋がっていました。回路図を見て各ブロック調査。
基本的にはBOOT出来ないという事は何らかの入力ラインが邪魔をしているケースが有りますので立ち上げ時に入力ポートが問題ないかの調査になります。

基板上にはESP32とセンサーモジュールが繋がっており、そのセンサーモジュールを確認したところ、I2C制御ピンの他にGPIOがプルアップされている状況でした。
具体的にはIO2（24ピン）及びIO4（26ピン）がプルアップされていました。
センサーモジュールとの配線を切ると無事ブートする事を確認しました。


# 4.まとめ
今回の基板では簡単にセンサーが使えるモジュールとして購入したものを繋げてしまったことが原因だったかもしれません。モジュール内の抵抗を外してとりあえずは動作する環境にしました。

IoTのハードウェアについてお困りごとがありましたらお問い合わせください。弊社モジュールも以下サイトにて販売中です。

https://iotpartsshopjp.shop-pro.jp/
DX（デジタルトランスフォーメーション）の概要について

#### はじめに
DX（デジタルトランスフォーメーション）についての概要を大まかに把握するための内容です。

#### DTではないの？
デジタルトランスフォーメーションはDXと表記されています。
**Digital Transformation**
なのですが、**trans**という単語がラテン語由来で意味としては「変える」「超える」を含み、**cross**＝**X**という「横切る」「交差する」意味を含む単語と同義としてされているようです。
そのため[ DT ]ではなく、[ **DX** ]と表記されています。

### <font color="Red">DXとは？</font>
2018年に経済産業省が推進提言
「企業がビジネス環境の激しい変化に対応し、データとデジタル技術を活用して顧客や社会のニーズを基に、製品やサービス,ビジネスモデルを変革するとともに、業務そのものや組織,プロセス,企業文化,風土を変革し、競争上の優位性を確立すること」
としています。

「社会の激しい変化に対応していくために、デジタル技術を使って変革を起こしていくこと」
と捉えると少し把握しやすいのではないでしょうか。

https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/20180907_report.html

### <font color="Red">なぜDXを進める必要が？</font>
推進提言する理由は「**2025年の壁**」といわれるものがあります。
DXを進められないと、2025年以降に大きな経済損失が発生することが予測されるため。
長年稼働しているシステムのサポート期間の終了時期等がこの年に該当。
・ITシステムの老朽化をはじめ
・サイバー攻撃のリスクの増大
・レガシーシステムのブラックボックス化(限られた人しか業務プロセスを把握していない)
・IT人材不足など、様々です。

DXにおける大きな影響を及ぼした一例として、
・***LINEアプリ***
・***YouTube***
・***Ubereats***
・***リモートワーク***
・***ペーパーレス化***
・ECサイト(有名なものですとAmazonや楽天等)
がイメージがつきやすいでしょうか。
コロナの影響も大きく関係したことで進んだ背景もあります。

DX要素の技術では「A・B・C・D」のカテゴリ分けをして捉えていることもあるようです。
・**AI(人工知能)**
・**ビッグデータ**
・**クラウド**
・**データ統合**

引用元サイト↓

https://www.teldevice.co.jp/ted_real_iot/column/dx_abcd/

#### 最後に
他にもたくさん技術や要素などはありますが、少しでもDXの全体像,大枠が捉えられるような内容であればと思いまとめてみました。
UiPath AI-Powered Automation Summit Tokyoまとめ(その1)

※は筆者の追記、私見です

# 講演内容
講演名：Autopilot による日々の生産性向上
発表者：夏目 健（UiPath株式会社　プロダクトマーケティング部 部長）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/8715f12e-1553-6ba4-6835-382cd5f36037.png)

# AutoPilotについて
- Developers
- Testers
- Business Analysts
- Everyone
からなるAIアシスタント、うちDeveloperとTestersが日本語対応
 
## Developers(開発者向けアシスタント）
主な機能は以下の通り
- **テキストからワークフローを作成**
作成したいワークフローを自然言語で説明すると、指示に沿ったワークフローを自動作成
Automation Hub上に配置しているコネクタは自動で入力されるため、細かい部分の手入力のみで作成可能
- **テキストから式を作成**
「今日の日付をyyyyMMdd形式で表示する」といった、やりたいことを自然言語で指示すると、指示に沿った式を自動作成
- **文書とテキストからアプリを作成**
ワークフローと同様、作成したいアプリを自然言語で説明すると、自動で作成する
- **画面キャプチャからアプリを作成**
操作対象のシステムの入力フォームをキャプチャし、投入することでシステムの入力フォームへ投入するデータを収集するための入力用アプリが自動作成される
	
開発リソース・コストが課題となっている中、開発期間が長期化するとさらに深刻なものになっていく
　⇒開発の際に発生する「調べる手間」や、質問された相手の「答える手間」が省けるため、上記課題の解決に役立つ
	
## Testers（テスター支援アシスタント）
※詳細な説明はなし
主にテストの準備・分析・実施時に活用できる機能とのこと
	
## Business Analysts（業務分析支援アシスタント）
※詳細な説明なし
	
## Everyone（一般ユーザー向けアシスタント）
UiPath Assistant上より利用可能な、UiPath独自の生成AI
- **コンテキストグラウンディング**
UiPath Automation Cloud上にアップロードされた情報（社内資料等、ユニークな情報）をソースとして、ユーザーからの質問への回答を行う
（リファレンスとしてソースとなる資料の情報も併記する）
	
- **文書・画像をAutoPilotに渡して分析**
様々な言語でも読み取り・自動翻訳が可能
	
- **会話内容から自動化やコネクションでの処理を提案**
様々なアプリとの連携が可能
　＜一例＞
　　・Outlook
　　・Salesforce
　　・Slack&Teams
　　・Jira
　　・自社開発システム
	※UiPathで操作できるものならどれでも？
<br>

- Microsoft社の生成AI(Copilot)との連携も可能
※具体的な連携方法については説明なし
	
## ガバナンスやセキュリティ面について
- **AI Trusy Layer**
AutoPilotへ渡した情報は外部へ流出したり、再利用されることはない
※詳細については下記の公式ブログで説明されていました
[製品ブログ(英語):Announcing the UiPath AI Trust Layer: Responsibly manage Generative AI](https://www.uipath.com/blog/product-and-updates/announcing-uipath-ai-trust-layer)
	
# リリース時期について
'24/7月を予定
なお、AutoPilotの利用に関しては、UiPath Automation Cloudの導入が必須
	
# ※参考ページ
[製品紹介(日本語)：Automation Cloud](https://www.uipath.com/ja/product/automation-cloud)
	
[製品紹介(日本語)：AutoPilot](https://www.uipath.com/ja/product/autopilot)

# ※参考資料（会場展示ボード）
![展示ブースボード(3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/14b4c71a-c493-2478-0524-2efe9f7b9202.jpeg)
![展示ブースボード(5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/ca2ee718-7363-f26e-7e21-bbd0dc544822.jpeg)
【さくらサーバー】公開ディレクトリの変更

＜＜　問題　＞＞
サイトリニューアルでWordPressを導入するために『WordPress簡単インストール』の機能を使ってサブディレクトリにWordPressをインストールしたところ、ルートディレクトリの旧サイトが表示できなくなった。


■ 実現したいこと　
<ul>
<li>公開まではルートディレクトリにアップしている旧サイトを表示したい</li>
<li>
    公開まではWordPressは下記アドレスで表示したい<br>
    <b>https://ドメイン/WordPressのインストールディレクトリ/</b>
</li>
</ul>


■ その他情報
<ul>
<li>使用サーバー ： さくらのレンタルサーバ</li>
</ul>

---
＜＜ 原因 ＞＞
<ul>
    <li>公開ディレクトリが変わってしまっていた</li>
    <li>『WordPress簡単インストール』の際に「WEB公開フォルダを変更する」を選択してしまっていた</li>
</ul>



＜＜　解決　＞＞
コントロールパネルからドメインの公開ディレクトリを変更
参考）<a href="https://help.sakura.ad.jp/domain/2149/">https://help.sakura.ad.jp/domain/2149/</a>
</dl>
ライントレースロボットの制御を調べてみた

# ライントレースロボットの制御の調査（メモ）
ライントレースロボットの制御方法についてちょっと興味があったので調べてみました。とりあえず、後で検索するためのキーワードだけ並べています。

## PID制御
ライントレースの制御といえば、まずはこれ。比例・積分・微分値で制御する方式。若干職人芸なチューニングが必要。実際のライントレースでは、センサーからのライン位置情報を基に、目標位置との差を比例（P）、積分（I）、微分（D）の各成分で補正しながら制御する。

## ファジィ制御
昔流行したファジィ制御。比例値、積分値、微分値を入力としたメンバシップ関数で制御値を出力する感じで実装すれば、PID＋ファジィ？特に環境の変動が大きい場合や、精密なチューニングが難しい場合に有効。経験や直感に基づいたルールを活用して、より柔軟な制御が可能。

## カルマンフィルタ
予測しながら制御する方式。センサーのノイズを低減し、より正確なライン位置の推定を行うために使われる。連続的な状態推定を行いながら、動的な環境でも安定した制御が可能になる。

## LQR/iLQR
線形二次レギュレーター（LQR）とその拡張版である反復LQR（iLQR）。最適制御理論に基づく手法で、特定のコスト関数を最小化するように制御する。iLQRは、非線形システムに対しても適用可能なため、より複雑なライントレースロボットの制御に向いている。

## DQN
ディープ強化学習（Deep Q-Network）。学習がネックかもしれないが、環境に適応しながら最適な行動を学習する能力がある。トレーニングデータの収集や学習プロセスが大規模になりがちだが、成功すれば非常に柔軟で高度な制御が可能。

## MPC（モデル予測制御）
モデル予測制御。未来の入力や出力を予測しながら最適な制御入力を決定する手法。制約条件を考慮しながら制御できるため、リアルタイムでの応答性が高く、複雑な動的システムにも適用可能。ただし、計算量が課題となる場合もある。

上記の組み合わせ
上記の手法は組み合わせ可能なので、組み合わせることも可能。とりあえず、PID＋ファジィ＋カルマンあたりは簡単そう。あと、周回させる場合はマッピングなども有効そう。

以上が、ライントレースロボットの制御方法に関する調査結果。実際に考える時に見直す予定。