OmniAICreator/Qiita-1.07M huggingface dataset:
さくらレンタルサーバーでLaravel11のCron設定をする

## はじめに
Laravel11にアップデートされCron処理の記述方法が変わったので、サーバー側の設定を含め紹介する

## 手順
1. artisanコマンドの作成
2. スケジュール設定を行う
3. レンタルサーバー側でCron設定を行う

## artisanコマンドの作成
下記コマンドでコマンドクラスを作成する
```
php artisan make:command {クラス名}
```

app/Console/Commands配下にクラスが作成される。
```php:TestCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class TestCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:test-command';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        echo "テストコマンドが実行されました。";
    }
}
```

各変数と関数の説明は以下の通り

| 変数・関数 | 説明 |
|:-:|:-:|
| $signature | 実行する際のコマンド名 |
| $description | `php aritisan list` をした際に表示されるコマンドの説明。 |
| $handle | 実際に実行したい処理内容 |

上記で作成したコマンドを実行するとこんな感じ
```
php artisan app:test-command
// 結果
テストコマンドが実行されました。
```

## スケジュール設定を行う
作成したコマンドを指定した時間に実行するように、スケジュール設定を行う
以前は`Kernel.php`に記述していたが、Laravel11からは、`routes/console.php`に記述を行う。

```php:console.php
<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule; // Illuminate\Support\Facades配下のScheduleを使用

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();

// 追加
Schedule::command('app:test-command')->everyMinute();

```
上記コードでは、`everyMinute()`で１分毎に実行するよう設定している。
5分毎、30分毎等メソッドが用意されているので、こちらを確認。

https://readouble.com/laravel/11.x/ja/scheduling.html

※この後のサーバー側でのCron設定で適切な設定をしないと、設定した時間通りに実行されないので注意

## サーバー側でCron設定を行う
さくらインターネットにログイン後CRON設定の画面を開く

![13261bb8b06d3fc6928942796be9117d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565333/901a5431-eb09-4de5-8286-f7679b8994f2.png)

スケジュール追加を押すと下記画面が開くのでCRON設定を行う

![80bcc8a224d98a7556b2b12624897297.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565333/386b562a-9ac9-c79d-c7d7-a1aaa1d776cf.png)


実行コマンドには以下のコマンドを記述
```
cd /home/{ユーザー名}/www/{プロジェクト名}/; /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
```

実行日時には、`php artisan schedule:run`を実行したい感覚を設定する。
例: 月* 日* 時* 分*/30 曜日全て → 30分毎に実行

※レンタルサーバーによって、CRON設定の感覚が短すぎると、不可がかかるという理由から予告なく設定を消されてしまう可能性があるので注意する。さくらレンサバの場合は最低でも2分間隔でしか設定できない。

サーバー側のCRON設定を30分間隔、Laravel側のスケジュール設定を毎分にしても、30毎にしか指定したコマンドが実行されないので注意する。


## 参考
https://readouble.com/laravel/11.x/ja/scheduling.html

https://laravel.com/docs/11.x/scheduling
[CSS][React] テンプレートリテラルを用いた２つのクラスを付与する方法

# 目的
テンプレートリテラルを用いて、`className`に２つのクラスを付与する方法を記載

# 目次
- [基本構文(CSSファイル)](#基本構文(CSSファイル))
- [基本構文(JSXファイル)](#基本構文(JSXファイル))
- [活用例](#活用例)
 
# 基本構文（CSSファイル）
~~~CSS:Example.css
.container {
  background-color: lightblue;
  padding: 20px;
  border-radius: 8px;
}

.highlight {
  border: 2px solid red;
}
~~~

### 解説
- `container`クラスは背景色、パディング、および角丸のスタイルを定義しています。
- `highlight`クラスは赤いボーダーを定義しています。

# 基本構文(JSXファイル)
~~~JS:Example.jsx
import React from 'react';
import './Example.css';

const MyComponent = ({ isHighlighted }) => {
  return (
    <div className={`container${isHighlighted ? 'highlight' : ''}`}>
      This is a styled component.
    </div>
  );
};

export default MyComponent;
~~~

### 解説
- `xstyles.css`をインポートします。
- `isHighlighted`というプロパティに基づいて、コンポーネントに`highlight`クラスを追加するかどうかを決定します。
- テンプレートリテラルを使用して、`container`クラスに`highlight`クラスを動的に追加しています。

### ※テンプレートリテラルを使用しない場合
~~~JS:Example.jsx
import React from 'react';
import './Example.css';

const MyComponent = ({ isHighlighted }) => {
  return (
    <div className={isHighlighted ? 'container　highlight' : 'container'}>
      This is a styled component.
    </div>
  );
};

export default MyComponent;
~~~

# 活用例
上記の`jsx`ファイルの活用例を示します。

~~~JS:JavaScript
import React from 'react';
import ReactDOM from 'react-dom';
import MyComponent from './Example.jsx';

const App = () => {
  return (
    <div>
      <MyComponent isHighlighted={true} />
      <MyComponent isHighlighted={false} />
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById('root'));
~~~

### 解説
- コンポーネントを使用すると、`isHighlighted`が`true`の場合、`highlight`クラスが追加されます。
- つまり、`isHighlighted`が`true`の時に赤いボーダーが表示され、`false`の時にはボーダーが表示されません。

# 参考リンク
- [【2024年最新】React(v18)完全入門ガイド｜Hooks、Next14、Redux、TypeScript
_セクション4:まずはxx_26.★重要★本コースでxx](https://www.udemy.com/)
pythonのモジュールがインストールしたはずなのに使えない

# 手順
1. インストール

```python:PythonShell
pip install モジュール名

2. インストールされたか確認
pip list | grep モジュール名

3. 保存された場所を確認
pip show モジュール名

4. パスが通っているか確認
>> import sys
>> sys.path

5. パスを通す
>> import sys
>> sys.append('モジュールのパス')

```
タスク管理シートを雑に貼り付けて内容を把握・評価するプロンプト文

## 1. 概要
自分以外が書いたタスク管理シートは、なかなか読みづらいものです。

このプロンプト文は、タスク管理シートや課題管理シートを雑に貼り付けて、内容を瞬時に把握し、対応方法を評価するためのものです。特にプロジェクトマネージャーやPMOが効率的に作業を進めるために設計されています。

以下の右側のように、今後の対応のアドバイスと、
信号機の色とともに記載の評価をしてくれます。
これにより、今の対応の良し悪しを瞬時に把握することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/a36182c2-7170-94ca-8fb0-12347b9ab9ab.png)


## 2. 特徴や使い方
以下のプロンプト文を使用して、シートの内容をチャット形式で入力してください。
その後、HTMLエディタで開くと、見やすい表形式で表示されます。

### 手順：
1. プロンプト文を貼り付ける
2. 次のチャットで課題管理シートなどを貼り付ける
3. HTMLエディタで開く

## 3. プロンプト文

```markdown
要件：
1. タスク管理シートの入力文を基に管理報告書を作成。
   - 書き間違いや不明点は文脈から補記。

2. 報告書は日本語で、新社会人でも読みやすく記載。

3. すべてのタスクについて内容を漏れなく記載。
   - 指定の出力形式（Excel表形式）に従って出力。
   - 不明な場合は --- と記載。

4. HTML出力のデザイン
   - フォント：Yu Gothic UI
   - 空港の電光掲示板風のデザイン
   - 行の背景色は評価アイコンとリンクした薄い色
   - 列名は紺色の白文字、中央寄せ
   - 2行目以降は左寄せ

5. 各項目の要件
- Number：ユニークな番号
- 件名：他の項目を理解しやすいように記載
- 内容：背景、問題点、対応を明確に記載
- 作成日：MM-DD、わからない場合は ---
- 更新日[ 未対応日 ]：MM-DD [ DD ]
- 対応期日：MM-DD、わからない場合は ---
- ステータス：記載がなければ誰が対応しているか
- 対応状況の箇条書き：MM-DD | 対応者 | 対応内容
- 今後の対応アドバイス：ステップバイステップの計画
- 評価/点数：100点満点、適切に評価
  - 🔴 {{点数}}：緊急性高い、記入内容に不備（30-59）
  - 🟡 {{点数}}：緊急性中程度、記入内容に少々不備（60-79）
  - 🟢 {{点数}}：緊急性低い、対応適切、記入内容充実（80-100）
- 評価コメント：点数の理由、タスク内容とシート記入方法の評価

処理内容：
1. タスクを1行ずつ読み込み、もれなく処理。
2. 指示に従い評価。
3. 入力文と件数を比較し、出力漏れがないことを確認。
4. 出力後、対応漏れがないことを再確認。
5. すべての行に対して出力、途中で止めない。
6. 空欄や改行は調整、セル内改行は<BR>を使用。

出力形式：HTMLコードの表形式
　HTMLエディタのリンク：https://htmledit.squarefree.com/
　タスク管理表　出力日：{{当日日付: YYYY-MM-DD (曜) }}
| Number | 件名 | 内容 | 作成日 | 更新日[ 未対応日 ] | 対応者 | 対応期日 | ステータス | 対応状況の箇条書き | 今後の対応アドバイス | 評価/点数 | 評価コメント |


入力文：
（入力文は次のチャットでお伝えします。お待ちください。）


```

## 4. 入力文の例
以下は、ServiceNowのサンプルインシデント一覧です。
こちらをプロンプト文の次のチャットで貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/1be6d9c8-a866-8f55-6601-72fa94cdb5aa.png)


## 5. 出力例
以下のようにHTMLコードが出てきます。
それをエディタに貼り付けます
https://htmledit.squarefree.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/48b14064-8762-572b-ce05-58729800d4d1.png)

以下のような見やすい形式で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/b7da0401-4412-9575-6f48-a6e61bfee2d0.png)



## 6. さいごに
このプロンプト文を活用することで、タスク管理の効率が飛躍的に向上します。ぜひ、プロジェクト管理の一環として活用し、チームの生産性を高めてください。また、この記事をシェアして、多くの人に役立ててもらえると嬉しいです。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
出来ないとヤバい！タイピング能力を鍛える

# 「タイピングってどのくらい出来る？」

突然なんだ？と思われるかも知れないですが、実は分かっているようで分かっていない、でもめちゃくちゃ大事な基本、それがタイピング力です。

「タイピングってどのくらい出来る？」面接とかでもあまり聞かれない印象です。なぜならある程度出来て当たり前だからです。プログラミング学習をしてきた！っとなれば余計に出来て当たり前と思われがちですよね？

言うなれば小学校入学の時に「1人でトイレ出来る？」と言われないことと同じです。なぜなら出来て当たり前だからです。（残念ながら昨今トイレトレーニング済んでいない子も増えているようですが・・）

でもこれと同じように、この辺すっ飛ばしてろくにタイピングも出来ないままプログラミング学習入る人もいます。ブラインドタッチも出来ないまま一所懸命コードが書いていてもかなり効率が悪いです。さらに学習や実務では分からず悩むことが多い上に遅い！となると挫折の原因です。

なのでプログラミングに関わらずパソコンを使って仕事をする、でもブラインドタッチが出来ない、入力が遅いという人は是非とも参照して欲しいです。


## この記事を読んで欲しい人

* パソコンを使って仕事をしたい！でもキーボードあまり使ったことが無い、という人
* ブラインドタッチが出来ない人
* キーボード入力が遅い人（1分間で150未満の人）

## どのくらい出来るようになれば良いの？

具体的な目安は曖昧ですが、最低でも1分間に150文字、出来れば200文字~250文字以上が理想ですし、それ以上出来れば最高です。

## 毎日どのくらい練習すれば良いの？
幸いなことにタイピングの練習は慣れと練習量で個人差はあれど誰でも上達します。必要な才能もスキルも必要も無く、とにかく数をこなすことが重要です。時間としては1日10分程度で良いのでキーボードに触れて練習することを心掛けましょう

## オススメの練習法

本格的にタイピングが出来るようになりたいと考えているのであれば、下記のサイトを使用しましょう

https://www.e-typing.ne.jp/roma/check/

イータイピングには以下のメリットがあります

* 全くの初心者から上級者まで幅広くタイピングの能力を上げることが出来る
* 個人カルテが作成される。ランクやグラフなどで日々のタイピングスピードを表すことができ、成長が見えるので楽しい
* 有料でタイピング技能検定が受けられる。合格すればタイピングの能力が認められ就職や転職で証明できる（私はタイピング技能検定3級取得しました）

なおイータイピングを利用する際には会員登録するのがオススメです
登録することで基礎練習や毎日のカルテが作成されます。無料なので登録しておきましょう




全くの初心者なのであればまずは基礎練習をしながら少しずつブラインドタッチが出来るようにし、アルファベットがどこにあるのか身体で覚えていくと良いでしょう。最初は100文字未満でも、練習を重ねることにより150～200文字と打てるようになります

ある程度ブラインドタッチが出来るようになったら日々腕試しチェックにチャレンジしてみましょう。自分のスコア、レベル、どの指が苦手なのかを分析してくれます

![スクリーンショット 2024-06-16 171503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/99d7ba40-ce82-3aea-f2ea-49262237c1f2.png)


また、検定は受けなくても良いので模擬試験は受けてみると良いでしょう。自分がどのくらいのタイピングが出来るか分かりやすいです
個人的に履歴書に書けるレベルとしては3級以降なら実力としてはある程度評価される可能性はあると思います。検定自体は有料なのでせっかく受けるなら3級取得相当の実力になってからが望ましいですね


### おわりに
いかがだったでしょうか？タイピングの練習をするサイトはまだまだたくさんありますが、今回はオススメの1つを紹介させて頂きました

タイピングは毎日少しずつの練習でもどんどん能力を向上させることが出来る素晴らしいスキルです。タイピングに自信が無い！もっとタイピングの能力を上げていきたい！と思って頂けたのであれば、是非挑戦してみましょう
闘魂Elixir ーー AtCoder Beginner Contest 342(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 342](https://atcoder.jp/contests/abc342)を[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 - Yay!](https://atcoder.jp/contests/abc342/tasks/abc342_a)

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


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

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

文字列中の文字の個数を調べればよいので、文字列をCharlistにして、[Enum.frequencies/1](https://hexdocs.pm/elixir/Enum.html#frequencies/1)関数で出現回数を調べます。得られたマップのキーと値を反転させたマップを作り、キー`1`に該当する値を取得します。取得した値が文字列中の何番目にあるのかは、[https://hexdocs.pm/elixir/Enum.html#find_index/2](Enum.find_index/2)関数で得られます。0オリジンのため、最後に`+1`して正解を得るという寸法です。


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

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

  def solve(s) do
    c = s
    |> String.to_charlist()
    |> Enum.frequencies()
    |> Enum.map(fn {c, f} -> {f, c} end)
    |> Map.new()
    |> Map.get(1)

    s |> String.to_charlist() |> Enum.find_index(& &1 == c) |> Kernel.+(1)
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 342](https://atcoder.jp/contests/abc342)を[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>
Excel VBA テキストボックスをループする

## ユーザーフォームのテキストボックスのオブジェクト名をループしてコードを省略

複数のテキストボックス内のテキストを同時に動かしたいとき

オブジェクト名を TextBox1, TextBox2, TextBox3, TextBox4 のように連番にしておくと、For next でまとめて動かせます。

ユーザーフォームのオブジェクト名.Controls(String で宣言した変数) 
を For Next ステートメントの中に入れてループ
```vb
Private Sub Image1_Click()
  
  Dim i As Long
  Dim p As String
  Dim ws As Worksheet
  Set ws = Sheets("Sheet3")
  
  For i = 1 To 4
  
    p = "TextBox" & i
    ws.Cells(i + 1, 2) = UserForm1.Controls(p)
  
  Next i
```
ws.Cells(i + 1, 2) = UserForm1.Controls(p)
転記先のセルは2行目から始まっているため、Cells(i + 1, 2) として2行目から入るよう調整

イメージオブジェクトで作成した Qiitan をクリックして実行

![テキストボックスをループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/3626a932-4e4c-2f10-2881-01486dcb97ec.png)
ウラノスエコシステムとは

# 背景

https://www.meti.go.jp/press/2024/05/20240524005/20240524005.html

経済産業省から「モビリティDX戦略」が策定されたと2024年5月24日に発表があった。
その中でよくわからない単語「ウラノスエコシステム」があったので調べてみた。
第一印象としては、FFに出てくる敵が使うクリスタルから悪いエネルギーを抽出するシステムの名前みたいだな、と思った。

# Ouranos Ecosystem（ウラノス エコシステム）

ウラノスとは、ギリシア神話に登場する天空神であり、全宇宙を最初に統べた原初の神々の王らしい。

https://ja.wikipedia.org/wiki/ウーラノス

そこから経済産業省が命名したものらしい。


https://www.meti.go.jp/press/2023/04/20230429002/20230429002.html


https://www.meti.go.jp/policy/mono_info_service/digital_architecture/ouranos.html

目指すべき「Society5.0」実現のため、
企業や業界、国境を越えて、データを共有して活用し人流・物流DX及び商流・金流DX化が必要。
産学官の専門家が集ってプロジェクトを組成し、企業や業界、国境を越えて、データを共有して活用するための仕組みについて、アーキテクチャの設計、研究開発・実証、社会実装・普及を行う取組を総称して、「Ouranos Ecosystem（ウラノス エコシステム）」と命名。

# 感想
ギリシャ神話に出てくる神様をモチーフにすると、すごそうな雰囲気が出て良いなと思ったので、何か名前をつけるときには真似したいと思った。犬の名前をガイアにするとか？

日本はDX化が進んでいるとは言えない状況だと思うので、モチベーションとしてガラパゴス化の防止というのが記載されていたのは納得した。

自前ですべてのシステムを作るのではなく、各プラットフォームを組み合わせて利用するといった考え方が大事で、
いま私は自動車関係の仕事をしているが、いまやっている仕事が自動車以外にも適用可能な標準になれば、私はウラノスエコシステムに欠かせない人材になるのではないか、そういった仕事を選んでいけたら良いかと考えるきっかけになった。
【Salesforce認定アドミニストレータ試験】公式模擬試験の英日翻訳と図解解説 (6)

この試験を受けるための勉強をした際に思わぬ苦戦をしたので、英語公式模擬問題を翻訳しながら図解解説として整理しています。

第4回・5回は「ケース割り当てルール」に関する問題と解説でした。今回（第6回）は「ケースエスカレーション」に関するものです。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/d6e1677b-6914-e16d-d70a-607a65a640cd.jpeg)
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/4c018e34-2f46-e623-4ac0-b8558051d8c7.jpeg)
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/a8c1f7c9-f34b-db9f-9337-2d693b966161.jpeg)


■ これまでの投稿

① 出題分野2：Object Manager & Lightning App Builder（オブジェクトマネージャとLightning アプリケーションビルダー）[出題率 20%]

　＜レコードタイプに関する問題＞

　　第1回の投稿　～レコードタイプと営業プロセスに関する問題～
　　https://qiita.com/Aungz/items/204d20c5c2c72a52c9df

　　第2回の投稿　～営業プロセスと選択リスト値に関する問題～
　　https://qiita.com/Aungz/items/5ecaa907ff6500924420

　　第3回の投稿 ～レコードタイプとページレイアウトに関する問題～
　　https://qiita.com/Aungz/items/37058a7e6cb4d59025c1

② 出題分野4：Service and Support Applications（サービス＆サポートアプリケーション）」[出題率 11%]

　＜ケースに関する問題＞

　　第4回の投稿 ～ケース割り当てルールに関する問題～
　　https://qiita.com/Aungz/items/f95c61038770a2445f93

　　第5回の投稿 ～ケース割り当てルールに関する問題～ 
　　https://qiita.com/Aungz/items/6cab00af3ca680d3cead

　　第6回の投稿 ～ケースエスカレーションに関する問題～ （今回）
Visual Studio Codeの韓国語（漢字）言語パック

![スクリーンショット 2024-06-16 16.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301047/7ba9f124-5087-65a6-8781-5e127e14cd48.png)

最近ほとんどコードを書くことがないのですが韓国語の勉強がてらに作りました。
ハングルと漢字を混ぜて書く表記は美しいと感じています。

https://marketplace.visualstudio.com/items?itemName=Minorin.vscode-language-pack-ko-hanja

https://github.com/minorin22/vscode-language-pack-ko-hanja

変換ミスや漏れがあったら気軽にプルリクくださいな

`付託합니디!`
そもそもNode.jsってなに？

JavascriptをPC内で動かすためには
node.jsをinstallする必要があります。

そうすることで`npm run start`を使えば
Webサーバーが立ちあがるという。

...**Webサーバーが立ち上がる**って冷静にどういう意味？
意味は分かっているつもりでも、
ざっくり「こんな感じか」で今まで澄ましていたので
今回GPT先生と一緒に深堀していこうかと思います。

#  Node.jsってなに？

### Node.js
...JavaScriptをサーバーサイドで実行するためのランタイム環境

### 主な特徴
- 非同期I/O:
    - 多くのリクエストを同時に処理することができる
- イベント駆動
    - イベントが発生すると対応するコールバック関数が実行される。
    - リアクティブでレスポンスの良いアプリケーションを構築することができる
- シングルスレッド
    - ？
- npm
    - 豊富なパッケージ管理システムnpm


# なんでWebサーバーが立ち上がるの？

Webサーバーが立ち上がる理由は、プログラムが特定のネットワークポートをリッスンし、
クライアント（例えばWebブラウザ）からのHTTPリクエストを受け取るように設定されているからです。

https://qiita.com/DQNEO/items/7027fda87a1ecf44b9f2

# リッスンってなに？

特定のネットワークポート上で外部からの接続要求を待ち受けること

具体的には、
サーバーアプリケーションがクライアントからの接続を
受け入れるために、そのポートを「リッスン（待ち受け）」します。

## リッスンの仕組み

ソケットの作成:
- サーバーアプリケーションはまず、ソケットを作成します。ソケットは、ネットワーク通信のエンドポイントです。

ポートのバインド:
- ソケットを特定のポートにバインドします。
ポートは、ネットワーク上の通信を識別するための番号です。
例えば、HTTPサーバーは通常ポート80を使用し、HTTPSサーバーはポート443を使用します。
Google サイバーセキュリティプロフェッショナル認定書を一週間で取得してみた

## この記事について
Google サイバーセキュリティ プロフェッショナル認定書を取得したいが、7日間の無料枠後にはUS$49/月が発生することに加え、公式によると7時間/週で約6ヶ月かかるという。
この情報が正しいとすると

$49 ✖️ 6ヶ月 = $294(約46,277円)かかることになるが、認定資格にそこまでの時間とお金を使うことはとてもコスパがいいとは言い難い。

ならば一週間の無料枠で取得するまでだ。

本記事は認定書を6日で取得した筆者がそのチップスを解説します。
本資格を最短で取得したい方や取得を検討している方に参考になれば嬉しい。

※費用や為替レートは本記事を執筆している2024年6月時点となります。
※本記事はあくまで一例であり、一週間での認定証取得を保証するものではありません。
※プログラムの詳細全てをじっくり学習したい方にはおすすめいたしません。
## Google サイバーセキュリティ プロフェッショナル認定書とは
[GoogleCareerCertificates](https://grow.google/intl/ALL_jp/certificates/?tab=google-career-certificates)監修の認定資格プログラムで、一般的なリスク、脅威、脆弱性を特定する方法やそれらを軽減するテクニックなど、成長著しいサイバーセキュリティ分野で即戦力として活躍するためのスキルを身につけられるプログラムとなっています。
本資格は[Coursera](https://www.coursera.org/professional-certificates/google-cybersecurity-jp?utm_source=google&utm_medium=institutions&utm_campaign=gwgsite-ALL_jp-cybersecurity)というプラットフォーム上で完全オンラインでの受講が可能となっておりPCやスマホからいつでもどこからでも講義、学習用教材、課題にアクセスすることができることも魅力です。

## 認定証を一週間で取得するには
筆者が行った効率的に認定証を取得できる方法は結論１つ
「ウィークリーチャレンジから始める」
これだけだ。

本プログラムの構成としては1~8のプログラムが用意され、さらにそのプログラム内に1~5のモジュールがある。
各モジュールには動画やテキスト形式の学習教材とウィークリーチャレンジ(以下wc)というテストが存在するがこのテストをすべてパスしなければならない。
テストは約10問あり正答率80%で合格となる。順当に進めれば講義動画や練習問題をすべて確認してからwcを行うが、、、、一旦全部スルーしいきないりwcから始めて欲しい。

そんなことをしては問題を全て、これまでの知識・経験、そして大いなる直感のみで回答しなければならないのかと思われるかもしれないが安心して欲しい。
このwcはテスト開始後も学習教材を見ることが許可されている。テスト中であっても学習を進めることができるのだ。

テストで出題された問題のキーとなる内容を講義動画で確認する⇨選択肢を答える⇨次の問題に進む・・・
のループを高速で回すことである程度の問題はクリアすることができる。
※とはいえ動画をさらっと眺めた程度で答えさせてくれる簡単な問題ばかりではないので一発合格できないことは覚悟する。

もし間違えてしまった問題があればテスト実施後に、その分野の講義動画へのリンクをフィードバックとしてもらうことができるのでそこでじっくり理解し次に受ける時は内容を把握した上でテストをすることができる。

## 最後に
筆者はこの方法を用い１コース約3~5時間程度で最終的には6日間でプログラムを終了することができた。
本記事も最短で取得するということに重きを置いてきたが、このプログラムが想定しているのはもちろんそんなことではないということを忘れず、ここで取得した知識をより深めて、実務の経験を持って活かしていきたいと思う。
AI事業者ガイドライン（第 1.0版）まとめ

2024年4月に、総務省と経済産業省が出したAI事業者ガイドラインについて、簡単にまとめてみるよ。

# AIの事業活動を行うもの

このガイドラインではガイドラインの対象読者としてAIの事業活動を行うものを以下の3つに分類しています。

* AI開発者
  AIシステムを開発する事業者
* AI提供者
  AIシステムをAI利用者や業務外利用者に提供する事業者
* AI利用者
  AIを利用する事業者

# 基本理念

2019 年に内閣府の統合イノベーション戦略推進会議が決定した「人間中心の AI 社会原則」では、
AIが Society 5.0 の実現に貢献することが期待され、人類の公共財として活用し、社会の在り方の質的変化や真のイノベーションを通じて、地球規模の持続可能性へとつなげていくことが重要だと述べられています。
そこで、以下の 3 つの価値観を基本理念として尊重し、その実現を追求する社会を構築していくべきだとしています。

## 1) 人間の尊厳が尊重される社会 (Diginity)

人間が AI に過度に依存したり、人間の行動をコントロールすることにAIが利用される社会を構築するようなことがあってはなりません。
人間がAIを道具として活用することによって、人間のさまざまな能力の発揮を可能とし、やりがいのある仕事に従事できるようにします。
物質的にも精神的にも豊かな生活を送ることができるような、人間の尊厳が尊重される社会を構築する必要があります。

## 2) 多様な背景を持つ人々が多様な幸せを追求できる社会 (Diversity and Inclusion)

多様な背景と価値観、考え方を持つ人が多様な幸せを追求し、それらを柔軟に包摂したうえで新たな価値を想像できる社会は、現代における一つの理想であり、大きなチャレンジになります。
AIはこの理想に我々を近づける有力な道具となりえて、適切な開発と展開によって社会のありかたを変革していく必要があります。

## 3) 持続可能な社会 (Sustainability)

AIの活用によりビジネスやソリューションを次々と生み出し、社会格差の解消や地球規模の環境問題や気候変動などにも対応可能な持続性のある社会を構築する方向へと展開させる必要があります。
科学的・技術的蓄積をAIによって強化し、そのような社会を作ることに貢献する責務があります。

# 共通の指針

第2部では、AIにより目指すべき社会と、各主体が取り組む事項について述べられていますが、その中で、共通の指針が整理さています。

## 1) 人間中心

各主体は、憲法が保証し国際的に認められている人権を侵害することがないようにするべきです。
また、多様な人々の多様な幸せの追求が可能となるように行動を取ることが重要です。

①人間の尊厳及び個人の自律
②AIによる意思決定・感情の操作等への留意
③偽情報への対策
④多様性・包摂性
⑤利用者支援
⑥持続可能性の確保

## 2) 安全性

各主体は、ステークホルダーの生命・身体・財産に危害をおよぼさないようにするべきです。さらに、精神及び環境に危害をおよぼさないようにすることが重要です。

①人間の生命・身体・財産、精神及び環境への配慮
②適正利用
③適正学習

## 3) 公平性

各主体は不当で有害な偏見と差別をなくすよう務めることが重要です。それでも回避できないバイアスについて、許容可能かどうかの評価をした上でAIシステムやAIサービスの開発・提供・利用を行います。

①AIモデルの各構成技術に含まれるバイアスへの拝領
②人間の判断の介在

## 4) プライバシー保護

各主体は、プライバシーを尊重し、保護することが重要です。その時、関連法令を遵守するべきです。

①AIシステム・サービス全般におけるプライバシーの保護

## 5) セキュリティ確保

各主体は、AIの振る舞いに意図せぬ変更や停止が起こることがないように、セキュリティを確保することが重要です。

①AIシステム・サービスに影響するセキュリティ対策
②最新動向への留意

## 6) 透明性

各主体は、社会的文脈を踏まえ、検証可能性を確保しつつ技術的に可能な範囲で、ステークホルダーに合理的な範囲で情報を提供することが重要です。

①検証可能性の確保
②関連するステークホルダーへの情報提供
③合理的かつ誠実な対応
④関連するステークホルダーへの説明可能性・解釈可能性の向上

## 7) アカウンタビリティ

各主体は、トレーサビリティの確保や「共通の指針」の対応状況などについて、合理的な範囲で説明責任を果たすことが重要です。

①トレーサビリティの向上
②「共通の指針」の対応状況の説明
③責任の明示
④関係者の責任の分配
⑤ステークホルダーへの具体的な対応
⑥文書化

## 8) 教育・リテラシー

各主体には、AIの正しい理解と社会的に正しい利用
ができる知識やリテラシー、倫理観を持つために、必要な教育を行うことが求められます。また、ステークホルダーに対しても教育を行うことが求められます。

①AIリテラシーの確保
②教育・リスキリング
③ステークホルダーへのフォローアップ

## 9) 公正競争確保

各主体は、持続的な経済成長の維持と社会課題の解決策の提示がなされるように、公正な競争環境の維持に務めることが期待されます。

## 10) イノベーション

各主体は、社会全体のイノベーションに貢献するように務めることが求められます。

①オープンイノベーション等の推進
②相互接続性・相互運用性への留意
③適切な情報提供

# 参考

* [AI事業者ガイドライン（第 1.0版）](https://www.meti.go.jp/press/2024/04/20240419004/20240419004.html)
* [AI事業者ガイドライン（第 1.0版）をとりまとめました](https://www.meti.go.jp/press/2024/04/20240419004/20240419004-1.pdf)
* [人間中心のAI社会原則](https://www8.cao.go.jp/cstp/aigensoku.pdf)
GitHub Copilotを使ってVS Codeで生産性を向上させる方法

## はじめに
以前、私のチームでGitHub Copilotの導入のデモ試みましたが、操作に慣れていなかったため、その魅力を十分に伝えられませんでした。しかし、最近非常に参考になるデモ動画を見つけたので、その内容を紹介したいと思います。この動画にはGitHub Copilotの本質が詰まっており、その真価を理解するのに非常に役立ちました。

## デモ動画の紹介
このデモ動画では、GitHub Copilotを使ってVS Codeでどれだけ生産性が向上するかを実感できます。英語の動画ですが、右下のキャプション設定で日本語を選べますので、どなたでも安心してご覧いただけます。

[Get to know GitHub Copilot in VS Code and be productive immediately](https://learn.microsoft.com/ja-jp/shows/visual-studio-code/get-to-know-github-copilot-in-vs-code-and-be-productive-immediately)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/2faa3aa3-ae50-91f4-242d-1226f2dafc6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c9a48450-0d6b-2bad-0cfa-17cd51206047.png)


このビデオでは、エディターで GitHub Copilot を見つけるすべての場所と、それを操作する方法、およびほぼ即座に生産性を大幅に向上させる Copilot に関する最高の秘密を紹介します。

## 動画の内容と注目ポイント
1. **自動補完機能の精度**
    - GitHub Copilotは、コードの自動補完機能が非常に高精度であり、短時間で正確なコードを書くことができます。
2. **自然言語からのコード生成**
    - 自然言語での説明からコードを生成できるため、ドキュメント作成やコメントの付加が容易になります。
3. **様々な言語対応**
    - 多くのプログラミング言語に対応しており、幅広いプロジェクトで活用できます。

この動画には、GitHub Copilotの利用方法や利点が具体的に示されており、短時間でその本質を理解することができます。特に、操作方法や効率の良さについて非常に印象が良く、誰でも簡単に使いこなせることが分かります。

## 私たちのチームでの体験
私たちのチームでもこのデモ動画を参考にして、GitHub Copilotの操作方法とその効率の良さを学びました。まだ具体的な実績はこれからですが、以下のような効果が期待できると感じています。

- **コードレビューの効率化が期待できる**
- **新人エンジニアの学習サポートとして役立ちそう**
- **プロジェクトの迅速な立ち上げが可能になりそう**

動画を見て、「これなら私たちの開発プロセスがもっと効率的になるはずだ」とチーム全員が感じました。今後、このツールを積極的に活用していこうと考えています。

## まとめ

GitHub Copilotは、開発効率を飛躍的に向上させるツールです。もし導入を検討されているなら、このデモ動画は必見です。この動画にはGitHub Copilotの本質が詰まっており、操作方法と効率の良さを知ってもらうための最高の参考資料となります。ご自身がツールを展開する必要があるとき、この動画を見て本質を理解したり、メンバーに参考情報として提示するのはどうでしょうか。ぜひチェックしてみてください！
Google Cloud Vision APIを使用して、Node.jsで手書きの文字を認識する

# はじめに
皆さんはOCRと聞いてどのようなイメージをお持ちでしょうか？
自分はOCRについて知識がなく、活字はある程度読めるが、手書きには弱いというイメージでした。

しかし、業務でGoogleのCloud Visionに触れて現在のOCRの性能に驚かされました。
以下URLからデモ版を試すことが可能です。

https://cloud.google.com/vision/docs/drag-and-drop?hl=ja

今回はAPIを使用して文字を認識し、テキストファイルに出力するまでの記事になります。

# 認識結果

### Input
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717745/304b4c2e-2533-2d05-5120-37760bbe779f.jpeg)

### Output
```2024-06-16 12-41-34.txt
覆水盆に返らず
猫に小判
雨降って地固まる
明日は明日の風が吹く
虎穴に入らずんば虎子を得
```

4、5行目はあえて汚く書きましたが、ほぼ認識できています。

# リポジトリ

https://github.com/takm333/ocr_test

# 手順

## 前提
* Node.js、npmがインストールされていること

Node.jsのインストールは以下から

https://nodejs.org/en/download/package-manager

## 1.環境構築
以下は、Google公式の手順です。

https://cloud.google.com/vision/docs/ocr?hl=ja

自分は公式の手順だけだと難しかったので、他のサイトも見ながら進めました。
### APIの有効化

https://dev.classmethod.jp/articles/google-cloud_vision-api/

### gcloud CLI関連

https://cloud.google.com/sdk/docs/install?hl=ja#windows

https://fujiya228.com/gcp-install-gcloud-cli/

## 2.実装
公式のコードを参考に、少しカスタマイズして実装しました。
```inputFileName```のパスは各環境のパスに合わせていただくか、```test.jpg```というファイル名の画像ファイルを用意してください。

https://cloud.google.com/vision/docs/ocr?hl=ja

```ocr.js
import { ImageAnnotatorClient } from "@google-cloud/vision";
import fs from 'fs';
import moment from 'moment';

const client = new ImageAnnotatorClient();
const inputFileName = './test.jpg';

// 画像内の文字を解析
async function detectText() {
    try {
        const [result] = await client.textDetection(inputFileName);
        const detections = result.textAnnotations;
        return detections[0].description;
    } catch (error) {
        console.error('画像解析でエラーが発生しました。',error);
    }
}

// テキストファイルに出力
async function outputTextToFile(text) {
    try {
        const now = moment().format('YYYY-MM-DD HH-mm-ss');
        const outputFileName = now + '.txt';
        await fs.promises.writeFile(outputFileName, text);
    } catch (error) {
        console.error('テキストファイルに出力中にエラーが発生しました。',error);
    }
}

async function main() {
    try {
        const text = await detectText();
        await outputTextToFile(text);
    } catch (error) {
        console.error(error);
    }
};

main();

```

```package.json
{
  "dependencies": {
    "@google-cloud/vision": "^4.3.0",
    "moment": "^2.30.1"
  },
  "type": "module"
}

```

## 3.実行
**ディレクトリ構成**
```
.
├── package.json
├── ocr.js
└── test.jpg
```


* package.jsonに記載されているライブラリをインストール（初回のみ）
```npm install```
* ocr.jsがあるディレクトリで以下コマンドを実行
```node ocr.js```

正常に実行できれば、ディレクトリ内にファイル名が実行日時のテキストファイルが出力されます。

# 料金
毎月、最初の1000ユニットは無料です。
今回は1枚の画像に対し、1回のテキスト検出を行っています。
個人利用であれば、ほぼ無料で利用できそうです。
https://cloud.google.com/vision/pricing?hl=ja

# 終わりに
Google Cloud Vision APIを使用して、手書きの文字をほぼ認識することができました。
次はOCRで読み込んだ文字をもとに、処理を行うアプリケーションを作ってみたいと考えています。
Rialsについてのまとめ

# はじめに
こんにちは、jjj0331です。
Rialsの学習を始めて3か月ほど経過したので、
これまで学習してきたことをまとめようと思います。

## 環境構築について
RailsをローカルPCで準備するためには
・Rubyのインストール
・SQLiteのインストール
・Railsのインストール(gem install rails)
 　→Railsのインストールが成功すれば：「rails -v」でVersion確認
  
## Appの作成方法と、サーバー起動方法

```
rails new myapp
myappというファルダーが作成されていれば成功
```
```
rails server
ブラウザで http://localhost:3000 にアクセスし、Railsのウェルカムページが表示されれば、環境構築は成功です。
```

## myappの各フォルダーの役割
・app：「Controller」,「view」ファルダーが存在し、アプリの中心になるフォルダー
・config：「router.rb」というファイルが重要な役割があり、Appのルーティングを設定する
・db:データベースのデータとmigrateファイルが保存されており、これも重量なファイルとなる

## config/router.rbについて
改めて、RailsはWebアプリケーションを開発するためのフレームワークであり、ルーティング設定が必要です。例えば、「http://google.com/」
というURLをブラウザに打ち込むとGoogleの検索画面に遷移するように、開発するアプリケーションでも特定のURLに対して特定の画面に遷移する設計が必要です。この設計を担っているのが「routes.rb」です。

```routes.rb
Rails.application.routes.draw do
  get "/jjj0331", to: "test#index"
end
```

解説：「http://localhost:3000/jjj0331」
というURLに対してGetリクエストが来た場合、「test」コントローラクラスのindexメソッドを実行する。

## 　準備編：「test」コントローラクラスとは
コントローラクラスを説明する前に、実際にコントローラクラスを作成してみましょう。

以下の手順で
appファルダーの直下のcontrollerに「test_controller.rb」が作成されます。

```
cd myappでmyappファルダーに移動済みであることを想定
rails generate controller Test index
```
以下のようなLogが出力されれば成功です

```
create  app/controllers/test_controller.rb
invoke  erb
create    app/views/test
create    app/views/test/index.html.erb
....(省略)
```

ここで重要なのが、
「test_controller.rb」とは別に「app/views/test/index.html.erb」が作成されていることです。


## 解説編：「test」コントローラクラスとは

では、app/controllers/test_controller.rbを開いてみましょう
```test_controller.rb
class TestController < ApplicationController
  def index
  end
end
```
ApplicationControllerクラスを継承している「TestController」には、
indexメソッドがあるがこのメソッドの役割こそが画面の遷移先を指定するメソッドとなる。

まとめると
router.rbで「http://localhost:3000/jjj0331」
というURLが来た際に、testにあるindexメソッドを実行してと決める。

testコントローラクラスのindexメソッドでは、表示する画面を決める(レンダリング先を決める)。
```
http://localhost:3000/jjj0331にリクエストがあった場合、
indexメソッドが実行されて
  def index
      (本来であれば様々な処理が実行され)
      render　'AAA'
      (→すべての処理が終了後、AAAという画面を表示してという意味)
  end
```


では、
```
  def index
  end
```

は何も記載されていないが「表示する画面」っていうのは？と疑問が生じると思うが、
これはRailsのデフォルトの処理で、
「app/views/test/index.html.erb」がレンダリング先となる。

つまり
```app/views/test/index.html.erb
<h1>Hello, Rails!</h1>
```
みたいに、「index.html.erb」に追記すると

Railsが起動した状態(rails server)後にブラウザに対して、
「http://localhost:3000/jjj0331」を入力すると
Hello,Railsが表示されるようになる。

# まとめ

今回はRailsの環境構築から、静的アプリの作成方法について解説しました。次回はモデルしようしてDBにデータを保存する方法などを記事にしたいと思います。
Azure マスターへの道 ~Azure コンテナー~

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Azure初心者がAzureマスターを目指してAzureのLearnなどを進めていくための記録として書いています。

今回は前回に引き続き、Learnの「**Azure コンピューティングおよびネットワーク サービスについて説明する**」をやっていきます。

https://learn.microsoft.com/ja-jp/training/modules/describe-azure-compute-networking-services/


# コンテナーとは

仮想化環境で、ホストOSのカーネルを共有しながら、各アプリケーションを独立した環境で実行することができます。

コンテナーは軽量で、動的に作成、スケールアウト、停止されるように設計されているそうです。

また、コンテナー関連のサービスは以下のようなものがあります。
・Azure Container Instances
・Azure Container Apps
・Azure Kubernetes Service

## Azure Container Instances
Azureでコンテナーを迅速に実行できるサービスです。シンプルな単一コンテナのデプロイに適しています。

## Azure Container Apps
Azure Container Instancesの機能に加えて、負荷分散やスケーリングなどの機能が組み込まれたサービスです。サーバーレスのコンテナアプリケーション環境を提供します。

## Azure Kubernetes Service
コンテナーオーケストレーションサービスです。Azure Container Appsに比べて、Kubernetesのフル機能を利用でき、高度なカスタマイズが可能です。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# まとめ

https://qiita.com/keitaMax/items/1eda90987f21cabd3659
海外で働く際の語学力について

海外でCS学位を取りたい
香港に来てからもう８年が経ちました。紆余曲折はありながらも、４４才でプログラマーに転身しました。超遅咲きどころか、今にもしぼんでしまいそうな花に肥料と水をやりながら、毎日勉強に勤しんでいます。独学で勉強を始めて以来、３歩進んで２歩下がる程度のペースで将来は海外でCS学位を取りたいという計画を立てています。学位を取得するのに年齢制限はありませんが、仕事と生活の両立という点においては昔の学生のようにはいかないですね。

語学力は必要か？
香港では主に広東語と英語が話されていますが、職場では広東語オンリーか広東語と英語、広東語と英語に加えて北京語を話せる同僚がいます。私のチームは広東語か英語でコミュニケーションをとりますが、私の場合、広東語は話せないので英語でのコミュニケーションになります。現地の日本企業では日本語を話せるスタッフが何人かいると思いますが、私は香港企業に勤めているので毎日、広東語が飛び交っています。
個人的な意見ですが、香港（または海外）で就職先を探すためには英語力が必須だと考えています。過去にも海外の日本企業や英国企業で働いてきましたが、英語を不要とする職場は一つもありませんでした。リクルーターとの面接でも日本語と英語があります。企業面接はもちろん、英語です。同僚との会話も英語なので、英語が話せなければ会話は成り立たないだろうと考えています。（海外に拠点を置く日本企業はカルチャーが違うと思いますが）

自分なりの英語力向上の方法
香港に来た当時は、Meetupやオンライン英語を受講して自分の英語力を慣らしていました。もちろん、TOEICも勉強していましたが、こちらではあまり重要視されていないイメージです。リクルーターにとっては紹介案件の目安になると思いますが、全員英語を話せることが前提になっているので、英語面接でどれだけ話せるかがポイントになってくると思います。
ある程度の英語力は必要だと思いますが、CourseraやUdemyなどの英語での講座は字幕を見ながら、教材は自分で翻訳をしながら勉強していくと英語やIT知識も身に付きます。どうしてもわからなければ、日本語の講座を見つけて日本語で理解を深めてから再度英語の講座を視聴し直してみると理解度が深まります。結果的に聞く力も養っているので、海外でも同僚との会話でストレスに感じる必要はなくなります。


初めての投稿でしたが、海外での転職を希望する日本在住のエンジニアの皆さんにお伝えできることがあれば、改めて筆を執りたいと思います。
【Java】ABC049C_Daydream #AtCoder

自分用にAtCoderの解答をまとめていきます。誤った情報があったら、申し訳ございません。

## 覚えること

- StringBuilderクラス
StringクラスはImmutable(不変)なクラスであるため、変更ができない。そのため、StrigBuilderで変更できるようにする。今回の例だと、reverseメソッドで逆順にする。toString()でString型に戻すこともできる。

- startWithメソッド
Stringクラスのメソッド。文字列が指定された部分文字列で始まるかどうかを判定することができる。
- 逆から考える
今回の例だと、前から考えるとprefixな関係になってしまう。そのため、逆から考えると、楽に処理することができる。

## コード
```java:ABC049C_Daydream
import java.util.Scanner;

public class ABC049C_Daydream {
    public static void main(String[] args) {

        try (Scanner sc = new Scanner(System.in)) {
            String S = sc.nextLine();

            String[] divide = { "dream", "dreamer", "erase", "eraser" };

            S = new StringBuilder(S).reverse().toString();
            for (int i = 0; i < 4; i++) {
                divide[i] = new StringBuilder(divide[i]).reverse().toString();
            }

            boolean can = true;
            for (int i = 0; i < S.length();) {
                boolean canDivide = false;
                for (int j = 0; j < 4; j++) {
                    String d = divide[j];
                    if (S.startsWith(d, i)) {
                        canDivide = true;
                        i += d.length();
                    }
                }
                if (!canDivide) {
                    can = false;
                    break;
                }
            }

            if (can) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }

        }

    }

}

```

## 参考にしたサイト

https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/StringBuilder.html

https://qiita.com/drken/items/fd4e5e3630d0f5859067

https://qiita.com/atsuk0r0/items/1208b5fead98676bc3c7

https://qiita.com/hiroki-harada/items/b9bd3c6c7d6acdd734e0
データベーススペシャリスト学習ノート2

## 正規化理論

### 正規化とは

RDBにおいて、一定のルールに従って、関係を分解する変形を行うこと。

#### 正規化の目的

タプル更新時に起こる更新時異状を排除すること。
また、正規化を行うことで1 fact in 1 place（１か所１事実）が実現できる。

#### 正規化をしない場合

正規化を行う＝テーブルを分解することであるため、データを扱う場合にはテーブルの結合が必要になる。
したがって、処理速度が遅くなる可能性があるためデータの更新を必要としない場合などにはあえて正規化を行わないこともある。

以下は正規化を行わない例：

- データの更新を行わないテーブル
- 履歴を残すテーブル
- 高速化が特別に必要なテーブル

### 正規化の種類

正規化には、第1正規形から第5正規形まで、さらにボイスコッド正規形が含まれる六種類がある。
一般的には、データベース設計では第3正規形までを適用することが多い。

- **第1正規形 (1NF)**: すべてのドメインが原子値のみを持つようする。
- **第2正規形 (2NF)**: 1NFを満たし、すべての非キー属性が各候補キーに完全に関数従属するようする。
- **第3正規形 (3NF)**: 2NFを満たし、非キー属性が他の非キー属性に依存しないようにする。
- **ボイスコッド正規形 (BCNF)**: 3NFを満たし、すべての依存が候補キーに対するものであることを保証する。
- **第4正規形 (4NF)**: BCNFを満たし、マルチバリュード依存を排除する。
- **第5正規形 (5NF)**: 4NFを満たし、すべての結合依存がキー制約によって導かれるものであることを保証する。

### 関数従属性

ある属性Xが決まれば、別の属性Yの値が一意に決まるという性質。
この関係は、X→Yのように表す。
上記の関係において、Xを決定項、Ｙを従属項という。

### 導出属性の排除

導出属性とは、他の属性からの演算結果で導くことができる属性。
導出属性は残したままにしておくと更新のたびに演算の必要があり、更新時異状が起こる可能性があるため、
一般的には正規化とともに排除していくが、上記の正規化を行わない場合と同様の理由で排除しない場合もある。

### 情報無損失分解

正規化を行う際に分解した関係を、自然結合した際にもとに戻せる分解の仕方のこと。
更新時異状を避けるためだけに適当に分解すると、もとあった情報が失われる可能性があるため、
情報無損失分解をするためには、第1正規形から順に正規化していく必要がある。

## 第1正規形

### 第1正規形の定義

> 関係スキーマRが第1正規形であるとは、Rを定義するすべてのドメインがシンプルであるときをいう。

つまり、ドメインの属性がすべての単一値をとるということ。
ドメインに直積集合やべき集合がある場合にはそれを排除する。

### 候補キー

関係のタプルを一意に識別できる属性または属性の組のうち極小のもの。

### 主キー

候補キーの中から一つ選んだもの。
どの候補キーを選択するかは、データベースの目的などによって決定される。

主キーには以下の制約がある。

- 主キーはタプルの一意識別能力を備えていること
- 主キーを構成する属性は空値をとらないこと

### 関係スキーマの表記ルール

関係スキーマは以下のように表記される。

関係名（<u>属性1</u>, <u>属性2</u>, <span style="border-bottom: 1px dotted;">属性3</span>, 属性4）

主キーには実践の下線をつけ、外部キーには破線の下線をつける。
二つのファイルを比較し、両者に共通するデータのみを抽出していただくお仕事

powershell.ps1と対象のデータは同じフォルダにあるものとする。

```powershell:poewrshell.ps1
# 現在のスクリプトのディレクトリを取得
$scriptDir = $PSScriptRoot

# データファイルのパスを指定（スクリプトと同じディレクトリにあると仮定）
$file1Path = Join-Path -Path $scriptDir -ChildPath "file1.csv"
$file2Path = Join-Path -Path $scriptDir -ChildPath "file2.csv"
$outputFilePath = Join-Path -Path $scriptDir -ChildPath "output.csv"

# ファイル1を読み込む
$file1Data = Import-Csv -Path $file1Path -Header Group, Value

# ファイル2を読み込む
$file2Data = Import-Csv -Path $file2Path -Header Group, StartValue, EndValue, Info1, Info2

# 出力用の配列を初期化
$results = @()

# ファイル1の各行をループ
foreach ($row1 in $file1Data) {
    $group1 = $row1.Group
    $value1 = $row1.Value

    # ファイル2の各行をループ
    foreach ($row2 in $file2Data) {
        $group2 = $row2.Group
        $startValue = $row2.StartValue
        $endValue = $row2.EndValue

        # グループが一致し、値が範囲内にある場合
        if ($group1 -eq $group2 -and $value1 -ge $startValue -and $value1 -le $endValue) {
            # 結果に追加
            $results += [pscustomobject]@{
                Group = $group2
                StartValue = $startValue
                EndValue = $endValue
                Info1 = $row2.Info1
                Info2 = $row2.Info2
            }
        }
    }
}

# 結果をCSVファイルに出力
$results | Export-Csv -Path $outputFilePath -NoTypeInformation

Write-Output "処理が完了しました。結果は $outputFilePath に保存されました。"
```

```powershelll:file1.csv
Group,Value
GroupA,236
GroupA,487
GroupA,745
GroupA,500
GroupB,888
GroupB,1000
GroupC,123
GroupC,678
GroupD,345
GroupD,567
GroupE,910
GroupE,432
```


```powershell:file2.csv
Group,StartValue,EndValue,Info1,Info2
GroupA,234,239,xxx,bbbb
GroupA,497,546,yyy,cccc
GroupA,645,889,ddd,ggg
GroupA,400,600,mmm,nnn
GroupB,233,654,eee,ffff
GroupB,786,999,www,zzz
GroupB,900,1100,ooo,ppp
GroupC,100,200,qqq,rrr
GroupC,600,700,sss,ttt
GroupD,300,350,uuu,vvv
GroupD,500,600,www,xxx
GroupE,400,450,yyy,zzz
GroupE,900,920,aaa,bbb
```


```powershell:output.csv
"Group","StartValue","EndValue","Info1","Info2"
"GroupA","234","239","xxx","bbbb"
"GroupA","400","600","mmm","nnn"
"GroupA","645","889","ddd","ggg"
"GroupA","497","546","yyy","cccc"
"GroupA","400","600","mmm","nnn"
"GroupB","786","999","www","zzz"
"GroupC","100","200","qqq","rrr"
"GroupC","600","700","sss","ttt"
"GroupD","300","350","uuu","vvv"
"GroupD","500","600","www","xxx"
"GroupE","900","920","aaa","bbb"
"GroupE","400","450","yyy","zzz"
```
Stable Diffusion 3 mediumをローカルで動かすまで

# ComfyUIで「Stable Diffusion 3 medium」を使用する

## 概要
2024/6/13にStable Diffusion 3 mediumが一般公開されたので使ってみた。
現状、動かす方法が限られており、親切な日本語の解説もネット上に見当たらなかったため、自分が実施した際の手順を記す。


## 環境
OS : Windows10
CPU : Intel i7-8700
GPU : GeForce 3060RTX(12GB)
Mem : 16GB


## 事前準備
以下のソフト群はインストール済の前提

+ Git/Git LFS
+ python(今回は3.10.8を使用）
コマンド類はGit for Windowsに付属するGit Bashを利用して実行する。

以下のアカウントは作成済の前提
https://huggingface.co/

ディスク容量は100GBは必要。
可能ならSSDが良い。（HDDだと読み込みが遅すぎる！！）

## 1.ComfyUIのインストール
https://github.com/comfyanonymous/ComfyUI

今回はWindowsのポータブルスタンドアローン版を使用。
Installing →　Windows　→　Direct link to download
を選択してダウンロードする。（デカい。解凍前1.4GB、解凍後5.3GB程度）
　※7z形式なので適当な回答ソフトを使って解凍すること

展開後、「run_nvidia_gpu.bat」を実行する。
自動的にブラウザが立ち上がるはず。
　※立ち上がらない場合はコンソールに表示されたURL(http://127.0.0.1:8188など）からアクセス



## 2.モデルデータの入手

### モデル利用の同意
まずモデル利用の同意が必要
https://huggingface.co/stabilityai/stable-diffusion-3-medium
必要情報を入力してAgreeする。

### トークン発行
事前にトークンを発行する必要があるので、
https://huggingface.co/
にアクセス。

右上の自分のアイコン　→　Setting　→Access Tokens　→ New token
を選択し、適当な名前を入れ、権限は「READ」を選択する。
表示されたトークンを保存しておく

### リポジトリのclone
※モデルデータは超巨大
Git Bashにて
```
cd [作業用フォルダ]
git lfs install
git clone https://[ユーザ名]:[トークン]@huggingface.co/stabilityai/stable-diffusion-3-medium
cd stable-diffusion-3-medium
git lfs pull
```
※ファイルサイズが巨大なため、かなり長い時間がかかる。
```
Unpacking objects: 100% (63/63), 278.62 KiB | 260.00 KiB/s, done.
```
の表示のあと、固まったように見えるが裏でダウンロードが進んでいるので、根気強く待つ。

```
Encountered 1 file(s) that may not have been copied correctly on Windows:
        sd3_medium_incl_clips_t5xxlfp16.safetensors
```
と出て、何か失敗したようなので、
```
git lsf pull
```
を実行するが、相当時間かかる。（数十分から数時間）
　※「sd3_medium_incl_clips_t5xxlfp16.safetensors」を削除してからpullした方がよさそう


### モデルの配置

stable-diffusion-3-medium/text_encodersのファイルを、ComfyUI/models/clipにコピー。
stable-diffusion-3-medium/*.safetensorsファイルを、ComfyUI/models/checkpointsにコピー
　※いくつかファイルがあるが、t5xxlfp8を使えばよさそう。自分の環境ではt5xxlfp16は破損していた・・・


### 実行
stable-diffusion-3-medium\comfy_example_workflows
に、サンプルファイルがあるのでこれを画面にドラッグアンドドロップする。

とりあえず以下の順で実施。

+ sd3_medium_example_workflow_basic.jsonを放り込む。
+ 左上「Load Checkpoint」でt5xxlfp8を選択
+ あとはデフォルトのままで「Queue Prompt」をクリック

※スペックに応じてWidth,Heightは変更した方がよいかも
※初回は１０分以上かかった
コンソールに文字が色々表示され、（結構時間かかって）UI上の右のほう「Output」に画像が表示される。
二度目以後は数十秒で生成可能だった。

### 作りたい画像を作る
左下の窓のうち関係するもの

Seed　→　毎回違う画像を作りたい場合はrandomizeを選択。同じ画像を微調整する場合はfixedを選べばよい
width/height　→　サイズの調整
CLIP text Encode　→　テキストを入力
jupyterのDockerfile

ubuntu ベースでJupyterでnumpyやpandasなどを実行できる最低限の環境を作る。

特筆すべきことはあまりないが、pipでjupyterをシステムPythonに追加するとおこられるので `--break-system-package` フラグをつけて強行している。

`CMD` に `--allow-root` をつけないと、ルートで起動できない。また `--ip=0.0.0.0` をつけないとデフォルトでlocalhost しかlistenしないので、外部からアクセスできなくなる。


``` Docker
FROM ubuntu:latest

RUN apt update
RUN apt -y upgrade
RUN apt install -y tzdata
ENV TZ=Asia/Tokyo
RUN echo "$TZ" > /etc/timezone \
  && rm /etc/localtime \
  && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
  && dpkg-reconfigure -f noninteractive tzdata

RUN apt install -y python3 python3-pip
RUN apt install -y python3-numpy
RUN apt install -y python3-matplotlib
RUN apt install -y python3-pandas 

RUN pip3 install --break-system-package jupyter

CMD ["jupyter", "notebook", "--allow-root", "--ip=0.0.0.0"]
```

## ビルド
ビルドはごく普通に行う。
``` bash
> docker build -f Dockerfile . -t pythonenv   
```

## 起動
jupyter は普通ランダムに生成したトークンを画面に表示して起動し、それを入力しないとログインできないようになっている。パスワードを設定することもできるが、実は環境変数でトークンを外から与えられるようになっている。これを使うとDocker起動時にトークンを指定できる。

``` bash
> docker run -p 8000:8888 -e JUPYTER_TOKEN="token" pythonenv
```
このようにして、ホストの8000にアクセスするとトークンを要求するプロンプトが出るので、起動時に指定したトークン`token`を入力すると、jupyterが使える。すばらしい。
GoとRustの文字列周りのデータ型

筆者は普段Goを使って開発していてデータ型に関して馴染があった。

最近はRustを勉強し始めて文字列周りのデータ型について気になったことがあったのでまとめていく。

## Go

Goの文字列にまつわるデータ型は以下の通り。

- string
- byte
- rune

### string

一般的に文字列を扱うためのデータ型。

特に補足はいらないと思うがコードで例を見てみる。

```go
s := "Hello, World!"
fmt.Println(s)

// "Hello, World!"
```

ダブルクオーテーションで囲まれた文字列がstring型として扱われる。

### byte

byteはuint8のエイリアスであり、バイトデータを扱うためのデータ型。

コードで例を見てみる。

```go

b := []byte("Hello, World!")
fmt.Println(b)

// [72 101 108 108 111 44 32 87 111 114 108 100 33]
```

このように文字列をbyte型に変換することでその文字のASCIIコードが出力される。

### rune

runeはint32のエイリアスであり、Unicode文字を扱うためのデータ型。

コードで例を見てみる。

```go

r := 'a'

fmt.Println(r)


// 97
```

Goではシングルクオーテーションで囲まれた文字がrune型として扱われる。

このようにUnicode文字をrune型に変換することでその文字のUnicodeコードポイントが出力される。

### それぞれの関係

string, rune, byteの関係を簡単に見るためにサンプルコードを書いた。

```go
package main

import (
	"fmt"
)

func main() {
	s := "a"
	fmt.Printf("s type is %T\n\n", s)

	r := 'a'
	fmt.Printf("r type id %T\n\n", r)

	fmt.Println("---for loop over string---")
	for i, c := range s {
		fmt.Printf("s[i] type is %T\n\n", s[i])
		fmt.Printf("c type is %T\n\n", c)
	}
}
```

実行すると以下のようになる。
```
str type is string

str[0] type is uint8

r type id int32

---for loop over string---
str[i] type is uint8

c type is int32
```

ここからわかることは以下の通り

- stringはuint8のスライスであり、その要素（インデックスでアクセスしたとき）はuint8型となっている
- rangeでstringをループすると、その要素はrune型となっている

## Rust

Rustの文字列にまつわるデータ型は以下の通り。

- str
- String
- char

### str

Rustの文字列リテラルはstr型として扱われる。

str型は不変であり、固定長の文字列を表す。

コードで例を見てみる。

```rust
fn main() {
    let s: &str = "Hello, World!";
    println!("{}", s);
}
```

ダブルクオーテーションで囲まれた文字列がstr型として扱われる。

### String

Stringは可変であり、ヒープ上に確保される可変長の文字列を表す。

Stringのstructはu8のバイトのベクタを持っている。

コードで例を見てみる。

```rust

fn main() {
    let s: String = String::from("Hello, World!");
    println!("{}", s);
}
```

String型はString::from関数を使って生成する。

### char

charはUnicodeスカラー値を表す。

コードで例を見てみる。

```rust

fn main() {
    let c: char = 'a';
    println!("{}", c);
}
```

シングルクオーテーションで囲まれた文字がchar型として扱われる。

## 最後に

文字に関するデータ型も複数あるのでその違いを理解しておくとプログラムを書くときに意識しましょう。
Dartのアロー関数ってどうなってたんだっけ？

Dart復習シリーズ。アロー関数、短くて良いのかもしれないが、なんか直感的にわかりづらいから、普通に書いてくれと思っちゃう。
```
bool isDone(String str) => str == 'done';

void main() {
  final done = isDone('done');
  print(done);// true
}
```

自分はカッコ（）で処理内容を括ってくれた方が直感的に理解しやすいと思っちゃう人なのだけれど、まあ無駄っちゃ無駄。まあ慣れ次第よな。
```
bool isDone(String str) => (str == 'done');

void main() {
  final done = isDone('done');
  print(done);// true
}
```
【Vue.js】OptionAPIとCompositionAPIの違い

## はじめに
Vue.jsチュートリアルで学んだことをアウトプットしていきます。

## 概要
Vueコンポーネントの作成方法として、OptionsAPIとCompositionAPIの２種類のAPIスタイルがあります。

## OptionsAPI
Vueコンポーネントを構築する従来の方法です。これまでVue2で採用されてきました。
data,methods,computed,watchといった複数のオプションから構成される1つのオブジェクトによって、コンポーネントのロジックを定義します。

```vuejs
<script>
export default {
  // data() で返すプロパティはリアクティブな状態になり、
  // `this` 経由でアクセスすることができます。
  data() {
    return {
      count: 0
    }
  },

  // メソッドの中身は、状態を変化させ、更新をトリガーさせる関数です。
  // 各メソッドは、テンプレート内のイベントハンドラーにバインドすることができます。
  methods: {
    increment() {
      this.count++
    }
  },

  // ライフサイクルフックは、コンポーネントのライフサイクルの
  // 特定のステージで呼び出されます。
  // 以下の関数は、コンポーネントが「マウント」されたときに呼び出されます。
  mounted() {
    console.log(`The initial count is ${this.count}.`)
  }
}
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>
```

### OptionsAPIのメリット
- オプションを分けて定義するため、コードの構造が明確で読みやすい
- 従来のVueで採用されていたこともあり、ドキュメントが豊富で学習しやすい

### OptionsAPIのデメリット
- コンポーネントのロジックを再利用することが難しい
（リアクティブな値へアクセスするためにthisを経由する必要があるため、viewからロジックを切り離すことができないため）

## CompositionAPI
ロジックを合成関数（composition function）としてカプセル化することで、コンポーネント間でのロジックの再利用を可能にした方法。

```vuejs
<script setup>
import { ref, onMounted } from 'vue'

// リアクティブな状態
const count = ref(0)

// 状態を変更し、更新をトリガーする関数。
function increment() {
  count.value++
}

// ライフサイクルフック
onMounted(() => {
  console.log(`The initial count is ${count.value}.`)
})
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>
```

### CompositionAPIのメリット
- 複数のコンポーネント間でロジックや状態を抽出し、外部で再利用しやすい
→Vue2（OptionsAPI）では難しかった、[「viewからロジックを切り離す」](#optionsapiのデメリット)ことができるようになる。

### CompositionAPIのデメリット
- 自由にロジックを切り出せる反面、これまでのVueのルールから外れるためにコードが複雑化しやすくなる
- 関心の分離を意識したコンポーネントの設計力（ロジックとデザインをどう分離するかなど）が求められる

## まとめ
- OptionsAPIは様々なオプションによりロジックを定義する従来の方法
- CompositionAPIは自由度が高く、ロジックを分離して再利用がしやすい新たな方法

## 参考記事
[2つのAPIスタイル](https://ja.vuejs.org/guide/introduction.html#api-styles)
[なぜ、Vue Composition APIを使うのか、理解する【メリット/デメリットまとめ】](https://qiita.com/karamage/items/7721c8cac149d60d4c4a)
Dartの非同期関数ってどんな感じなん？

Dart思い出しシリーズ

void greet(String name) {
  print('Hello, $name');
}

Future<void> asyncFunction() async {
  await Future.delayed(Duration(seconds: 1));
  print('Done');
}
 void main(){
   greet('Sapphire'); //Hello, Sapphire
   asyncFunction();//実行して1秒後にDone
 }
Dartのクロージャ

Dartのクロージャはこんな感じらしい。

```
Function makeAdder(num addBy) {

  return (num i) => addBy + i;
}

void main() {
  //addByの引数2を指定したものを変数として格納すると、入れた引数の値を記憶している。
  var add2 = makeAdder(2);
  //addByの引数4を指定したものを変数として格納すると、入れた引数の値を記憶している。
  var add4 = makeAdder(4);

  print(add2(3) == 5);// true
  print(add4(4) == 7);// false
  print(add2(7) == 9);// true
}
```
ターミナルにコピペ(中間ファイルなし)でハッシュサムを文字単位で比較する(shasum)

# ハッシュ値をクリップボードから確認したかった
ファイルをDLしたときに、いちいちハッシュファイルを用意するのが面倒だったのでコピペでなんとかならないかと思っていた。
調べたところ、`echo`からパイプで繋いで`md5sum -c -`に投げる方法も見つかったが、`shasum`だとフォーマットが違うのかうまくチェックしてくれなかった。
普通の`diff`だと行単位なのであまり意味がなく困っていたが、`git diff`で柔軟に比較単位を決められるとわかったのでメモ。
```shell:コマンド
#もしまだgitをインストールしていなければ先に`brew install git`する
git diff —-word-diff-regex=. -—no-index <(shasum -a 256 FILENAME) <(echo “HASHSUM”)
```
`FILENAME`はDLしたファイル名、`HASHSUM`にDL元のハッシュ値をコピペする。
## 説明
* `--word-diff-regex=.`が差分を表示する単位になる。
正規表現を使って`.`を指定し1文字単位でチェック
* `--no-index`をつけることで、gitの管理下にないファイルも扱えるようになる。
* `<(hoge)`で計算したハッシュ値と元サイトのハッシュ値を渡す。

## 実行結果
```diff
git diff --word-diff-regex=. --no-index <(shasum -a 256 HOGEHOGE.txt) <(echo "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
diff --git a/dev/fd/11 b/dev/fd/12
--- a/dev/fd/11
+++ b/dev/fd/12
@@ -1 +1 @@
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855[-  HOGEHOGE.txt-]
```
とこんな感じで、shasumで出力された内の後半部分`[- HOGEHOGE.txt-]`だけが差異として表示され、前方のハッシュ値自体は同一であることがわかる。
実際にターミナル上で実行すると色がついてわかりやすいんだけど、Qiita上でのシンタックスハイライトよくわからんかったのでご自身でやってみてください
## 環境
masOS 13.6.7
zsh
git version 2.45.0

# 参考文献
↓汎用性の高い手軽な方法が数パターン記載されている

https://qiita.com/tatsubey/items/9a0d55c5a80919256514

↓gitのコマンドエイリアスに登録して、より手軽に呼び出す方法もまとめられています

http://zat.ifdef.jp/html/2008/01-16.html

↓`<(hoge)`についての使い方詳細。複数の引数にそれぞれ処理した内容を渡せるので便利

https://qiita.com/wingedtw/items/2f05c5d0c37d71f209f4

↓gitの`--word-diff-regex`についての公式ドキュメント

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---word-diff-regexltregexgt
ORA-12154に苦しんだ話

こんにちは小林です。
OracleDBにリモート接続する際の定番のエラー「ORA-12154」の原因が分からず苦労しました。初歩的なミスなんですが皆さんが同じミスをしないように自分の失敗談を記載します。

# 前提
DBサーバ：RDS for Oracle
クライアント：PC(Windows11）
状況：簡易接続はできるがローカルネーミング接続

# ORA-12154とは？
以下の記述がORACLE公式のエラー説明文です。接続識別子が間違っているか、認識できていない。ということはtnsnames.oraあたりが怪しい、というのは理解できました。
    

>　接続識別子を解決できない
データ・ストアに接続しようとすると、ORA-12154「TNS: 指定された接続識別子を解決できませんでした」が表示されることがあります。
>この問題は、Cache ConnectとOracleを同じマシン上で使用するときに、TNS_ADMIN環境変数がOracleの正しいTNSNAMES.ORAファイルを指していない場合に発生することがあります。たとえば、ラップトップでOracleデータベースの複数のインスタンスが稼働している場合に、この問題が発生することがあります。

https://docs.oracle.com/cd/F25597_01/document/products/timesten/html/E05173-02/Troubleshooting_Guide-5-05.htm

# tnsnames.ora(間違った書き方）
さっそくtnsnames.oraの確認をしてみました。以下がエラーが発生する書き方です。間違っている箇所は分かりますか？
（HOSTの箇所は※で伏せています）

```ruby:uniq.rb
ORCL = 
(DESCRIPTION = 
    (ADDRESS = (PROTOCOL = tcp)(HOST = database-oracle.※※※.rds.amazonaws.com)(PORT = 1521))
    (CONNECT_DATA = 
      (SID = ORCL) 
    )
)
```

２行目にインデント（字下げ）が入っていないのが原因みたいです。。。
以下がOracle公式の説明です。
リンクにtnsnames.oraの記述ルールが記載されているのでインデントを修正しても直らない場合は参考にしてみてください。

>　インデントによって、キーワード値ペアの親または所有者がどのキーワードであるかわかるように、構成ファイルを設定します。次のようにファイルにインデントを選択しない場合、折り返した行を少なくとも1つの空白でインデントする必要があります。インデントされていないと、その行は新しいパラメータとして誤って読み込まれます。次の構文を使用できます。

https://docs.oracle.com/cd/E16338_01/network.112/b56287/syntax.htm

# tnsnames.ora(正しい書き方）
以下が修正したtnsnames.oraです。目視ではわかりづらいかもしれませんんが二行目にインデントを追記しています。
自分の個人環境なので問題ありませんでしたが、原因に気付くのに二日ぐらいかかりました
みなさんは私みたいになるな！(笑)

```ruby:uniq.rb
ORCL = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = tcp)(HOST = database-oracle.※※※.rds.amazonaws.com)(PORT = 1521))
    (CONNECT_DATA = (SID = ORCL) 
    )
  )
```
農作業工程管理を効率化する取り組み：JIRAとChatGPTの活用

こんにちは、kamokobuです！

初投稿で、なおかつ本業が農家ですので、今回の投稿もかなりためらいましたが、
コミュニティの皆様がたとの交流をきっかけに、自身のスキルを向上させたいと思い
思い切って投稿させていただきました。

今回は、農作業の工程管理をもっと楽にできないかとの思いから工夫をしてみました

課題の背景

農作業の工程管理は手間がかかります。天候であったり、突然の病虫害で作業の前倒しが必要になったりなど。
これまでは、下記の画像にあるようにエクセルで作成した工程管理表を使って、毎週の予定を見直し、メモを取って把握し頭の中でその時の優先順位付けなどをしていました。しかし、毎回同じ作業を繰り返すのは面倒で、ミスも発生しやすいのが現実です。

![koutei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3732306/c577e792-b3d1-2da9-447d-e6b6b2ad69ac.png)

解決の糸口：JIRAとChatGPTの活用

そこで今回は、工程管理を効率化するためにJIRAとChatGPTを活用する方法を試してみました。具体的には、JIRAのタイムライン機能を使って作成した工程データをChatGPTに読み込ませ、必要な期間の作業予定をリストアップさせる方法です。

JIRAのタイムライン機能

まず、JIRAのタイムライン機能を使って、農作業の工程データを可視化しました。JIRAはプロジェクト管理ツールとして、ガントチャートを検索していたときに出会ったものですが、農業の工程管理にも応用できました。以下の画像のように、タイムラインを使えば各作業の進捗状況や予定を一目で確認できます。

![jira.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3732306/cced10b4-b462-54d3-954f-5a4c08d1917e.png)

ChatGPTによる予定リストの自動生成

次に、この工程データをChatGPTに読み込ませ、プロンプトを工夫して今後2週間の作業予定をリストアップさせました。これにより、毎回同じ作業を繰り返す手間が省け、効率的に予定を把握できるようになりました。下記の画像は、プロンプトの例と出力結果のスクリーンショットです。

![prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3732306/d70269da-1cd6-3983-fe98-6cfc3a0b8fbf.png)



ChatGPTの出力結果：

![gpt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3732306/b40fc7cf-a5a8-f1ec-bfa2-9394d79321cf.png)


まとめ

今回の改善により、農作業の工程管理のために毎回行っていた単調な作業がなくなる可能性が高まりました。JIRAとChatGPTの組み合わせは、農業の効率化に大いに役立つと感じています。今後も、このようなツールを活用して、日々の農作業をよりスムーズに進めていきたいと思います。

ちなみに、これよりもっとこの方が簡単だよなどの案があればどんどんコメントいただきたいです。

最後まで読んでいただきありがとうございました