OmniAICreator/Qiita-1.07M huggingface dataset:
マルチモーダルAIとは？身近な活用事例を解説

![マルチモーダルAIとは？身近な活用事例を解説.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3544821/1a586fb5-378f-10fe-fbc3-e4c8af472856.png)

<h2>はじめに

最新のAI技術として、マルチモーダルAIが注目を集めています。テキストや画像など複数の情報を同時に処理できるこの技術は、自動運転や生成AIなどさまざまな分野で活用されています。工場や会計、顔認証技術など、ビジネスでの利用が期待されています。この記事では、マルチモーダルAIの特徴やメリット、実際の事例について紹介します。

<h2>マルチモーダルAIとは

マルチモーダルAIは、テキストや画像・動画・自然言語など複数の種類のデータを同時に処理する技術です。ディープラーニングにより、複雑なデータを理解し、例えば、動画解析や画像とテキストの関連性分析などを実現します。音声とテキストを組み合わせて、高品質な音声出力を生成することも可能です。そのため、マルチモーダルAIは、情報の組み合わせによって高度なコンテンツを生成できます。

<h2>マルチモーダルAIが生まれた歴史

マルチモーダルAIは1986年に音声と唇の動きの画像を組み合わせて内容を読み取る検証から始まりました。人間は周囲の音が大きい環境で口の動きと音声を同時に読み取ることで、言語をより正確に処理しています。
2013年には楽しそうな表情から怒るなどの様々な表情で会話する研究が始まり、その後、画像に対する説明文を自動生成するモデルが開発され、リアルタイムで人間の感情をアバターなどに投影する研究が進んでいます。

<h2>マルチモーダルAIのメリット

マルチモーダルAIは、テキストや画像など複数のデータを処理し、生体認証やセキュリティで活用されています。高い認証精度やセキュリティレベルの向上が期待され、認証エラーを減らし侵入を拒否できる点が大きな利点です。

また、人間に近い判断力を持ち、製造現場や自動運転など様々な分野で活用されています。振動や温度の計測、異音の検知などにも役立ち、従業員の安全確保や製品品質の向上に寄与しています。

<h2>マルチモーダルAIのデメリット

マルチモーダルAIは、画像と音声データを組み合わせて様々な技術が可能ですが、プライバシー侵害やディープフェイクの拡散、仕事の減少などのデメリットも存在します。個人情報や企業情報の不正使用のリスクや、ディープフェイクによる誤情報の拡散、従来の仕事の自動化による雇用の減少などが挙げられます。これらのリスクに対処するためには、適切な管理と監視が必要です。

<h2>活用が進むマルチモーダルAIの実用例

マルチモーダルAIは、様々な業界で活用されています。その一例を以下に示します。

<b>医療分野では、

マルチモーダルAIが画像と数値を組み合わせて高精度な診断支援を行っています。例えば、内臓の超音波画像の解析や病変の早期発見などが挙げられます。AIを用いることで、医師の作業負担を軽減し、診断の正確性を高めることができます。

<b>自動運転技術では、

マルチモーダルAIが周囲の車両や障害物を検知し、適切な走行を行います。AIはリアルタイムの交通情報を分析し、運転者に代わって安全な運転を行うことが可能です。自動運転技術は、交通事故の防止や交通の効率化に貢献しています。

<b>セキュリティ分野では、

マルチモーダルAIが生体認証技術に応用されています。顔認証や指紋認証などの生体情報を組み合わせることで、高度なセキュリティを実現しています。また、AIはサイバー攻撃の検出にも活用されており、不正アクセスやマルウェアの検知に役立っています。

<b>産業用ロボットでは、

マルチモーダルAIが画像やセンサーデータを組み合わせて作業を行っています。工場の自動化や農業の効率化、物流業界での荷物の仕分けなど、様々な場面で活躍しています。マルチモーダルAIを搭載したロボットは、多様な情報を素早く処理し、人間の作業を支援しています。

<b>マーケティング分野では、

マルチモーダルAIが市場データや顧客の行動データを分析しています。AIは大量のデータを解析し、消費者の嗜好やトレンドを把握することができます。これにより、効果的なマーケティング戦略の策定や顧客サービスの向上が可能となります。

以上が、マルチモーダルAIが活用される実用例の一部です。AIの進化により、様々な分野での業務効率化や品質向上が期待されています。

<h2>まとめ

マルチモーダルAIは、テキストや音声情報、画像など複数の情報を統合的に処理する人工知能です。生体認証技術の進化により、様々な業界で導入されていますが、初期費用とソフトウェアの維持費用がかかります。セキュリティレベルの向上と共にコストも増加するため、費用面を十分に確認する必要があります。
詳しくは下記の記事もご参照ください。
➡ <a href="https://hblab.co.jp/blog/practical-examples-of-multimodal-ai/">活用が進むマルチモーダルAIの実用例</a>
SonarLintでワンランク上のコードを書こう

### はじめに

今どきのエンジニアの皆さんは、GitHub CopilotやChat GPTの支援を受けながら日々コードを書かれておられるかと思います。私も滅茶苦茶使っています。最高ですよね。

最高なんですが、必ずしも最高に品質が高いコードを書いてくれるわけではない…。
そう感じたなら、是非SonarLintを試してみてほしいです。

### SonarLintとは

SonarLintは、SonarSource社が開発した静的コード解析ツールで、主にコード品質の向上を目的としています。SonarLintは、Eclipse、IntelliJ IDEA、Visual Studioなどの主要なIDE向けにプラグイン形式で提供されており、SonarQubeのルールに基づいてリアルタイムでコードの問題を検出します。
https://www.sonarsource.com/products/sonarlint/

#### ESLintと何が違うの？
それぞれ以下のように得意分野が違います。

- **ESLint**
    - JavaScriptに特化した静的解析ツールで、コーディング標準の強制や潜在的な問題の特定を行います。
- **SonarLint**
    - 複数のプログラミング言語に対応しており、セキュリティ脆弱性やコードの重複、アーキテクチャの問題などを検出します。

ですので、私は両方入れています。
ちなみにSonarLintはエディタのプラグイン形式で提供されますので、ESLintのようにプロジェクトのpackage.jsonでは入ってきません。個人で導入する必要があります。
それでは、SoanrLintの何がいいのかを見ていきましょう。

### SonarLintが指摘してくれる内容の具体例（VSCodeの場合）

#### コードの認知的複雑性が高い箇所を指摘

こんな感じで、異常なネストが発生していたとします。
```ts
export function Test () {
 let flg1, flg2, flg3, flg4, flg5, flg6 = true;
 if(flg1) {
     if(flg2) {
         if(flg3) {
             if(flg4) {
                 if(flg5) {
                     if(flg6) {
                         return "test";
                     }
                 }
             }
         }
     }
 }
}
```

すると、お前のソースは読みづらいんじゃい！と指摘してくれます:kissing_heart:
![pasted-2024.02.14-16.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810012/34cabdcd-b2f0-7879-0ae9-67476700244c.png)

##### 修正例
```tsx
export function Test(){
 let flg1, flg2, flg3, flg4, flg5, flg6 = true;
 if(flg1 && flg2 && flg3 && flg4 && flg5 && flg6) {
     return "test";
 }
}
```

異常なネストが解消され、読みやすくなりました:v:

#### イミュータブルであるべき値はreadonlyにしろと叱ってくれる

こんな風にPropsを定義すると…
```tsx
inteface Props {
    userName: string;
}

export function TestComponent (props:Props) {
    // 以下略
}
```

componentのpropsはreadonlyであるべきやろがい！と叱ってくれます😂
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810012/5adc2536-f1c2-5978-9525-b4eef1143037.png)

##### 修正例
```tsx
inteface Props {
    readonly userName: string;
}

export function TestComponent (props:Props) {
    // 以下略
}
```
そもそもpropsはイミュータブルなのでは…[^1]とか、propsを上書きするコード書くなよとは思いますが…
私はこの指摘で、interface型にreadonlyが付与できることに気づきました。

[^1]: 完全なイミュータブルではない

#### その演算子で大丈夫か？と指摘してくれる

こんな感じで、値が無い場合は空文字を入れる処理を書いたとします。
```tsx
const userId = session?.userId || "";
```

すると、falsyな値で引っかけるのは危ないで！と駆けつけてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810012/015f0bb4-1d6a-1f44-f7b7-2771aceeb971.png)

##### 修正例
```tsx
const userId = session?.userId ?? "";
```

#### TODOコメントを残すな😡

そのまんまです。コード内にTODOコメントが残っていると、こんな風に指摘してくれます、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810012/e2b9ca9e-f284-7492-2a86-ee2af3e9d13c.png)


### いかがでしょうか？

これはほんの一例ですが、ESLintとは役割が違うということはお判りいただけたと思います。
正直、全部の指摘に従って書くのは厳しいときもありますが、「固い」コードを書きたいときは非常に参考になりますし、「なんとなく」で書いていたコードからワンランク上を目指したいときは、非常に心強いパートナーになってくれると思います。
生成AIとは？ビジネスで活用されている事例を解説

![生成AIとは？ビジネスで活用されている事例を解説.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3544821/dee8ab47-9e2d-eb86-e62b-cf2cb9c50e10.png)

<h2>はじめに

生成AIは、与えられたデータから新しいデータを生成する技術です。入力されたプロンプトの規則性や構造を学習し、わずか数秒でテキストや画像・動画などのコンテンツを生成できます。一方で、フェイクの情報を発信する可能性もあり、社会生活やビジネスに影響を与えています。

<h2>生成AIとは

生成AI（別名ジェネレーティブAI）は、文章や音声などのデータを学習し、新しい情報を生成するAIです。テキストや画像、動画などのコンテンツを数秒で学習し、人間が作ったかのようなデータを生成できます。例えば、画像生成では、テキストでイメージを入力するだけで自動生成できます。従来のAIと違い、構造化されていないデータから学習します。生成AIは定型文での回答がなくても自ら回答を生成できるため、業務にも活用できます。

<h2>生成AIを活用するメリット

生成AIの活用には以下のようなメリットがあります：

<h3>業務効率化と作業負担の軽減

生成AIを導入することで、定型業務を自動化し、労力と時間を節約できます。これにより、従業員はより重要な業務に集中することができます。

<h3>コストの削減

生成AIは人的なリソースの代替として機能するため、人件費の削減につながります。例えば、AIチャットボットを導入することで、コールセンターの従業員の負担を軽減し、コストを削減できます。

<h3>高度なデータ分析と予測

生成AIは大量のデータを高速で処理し、客観的な情報を提供します。これにより、データ駆動型の意思決定が可能になり、ビジネスの競争力を向上させることができます。
これらのメリットを活かすことで、企業は競争力を強化し、持続可能な成長を実現することができます。

<h2>生成AIを活用するデメリット

生成AIを活用する際のデメリットは以下の通りです：

<h3>情報漏洩のリスク

生成AIは企業の機密情報を学習するため、機密情報が出力結果に現れる可能性があります。これにより、情報漏洩が発生するリスクがあります。

<h3>フェイクコンテンツの増加

生成AIは本物にそっくりなコンテンツを作成するため、フェイクコンテンツの増加が懸念されます。これにより、誤った情報が拡散され、社会問題に発展する可能性があります。

<h3>品質のむら

生成AIが作成するコンテンツには品質のむらがあります。不自然な文章や誤情報が含まれることがあり、その内容が真実と誤解されることがあります。
これらのデメリットを把握し、生成AIを利用する際には注意が必要です。

<h2>ビジネスで使用される生成AIの活用例

ビジネスにおける生成AIの活用例は多岐にわたりますが、以下にその一部を紹介します。

<h3>企画書の作成

企画書の作成は、ビジネスにおいて重要な要素です。生成AIを活用することで、プレゼンや企画書のアイデア出しやフィードバックを効率的に行うことができます。生成AIを利用することで、アイデアの整理やポイントの抽出を自動化し、時間を節約することができます。

<h3>ソースコードの実装・デバッグ

システム開発においては、ソースコードの実装やデバッグ作業が欠かせません。生成AIを使用することで、HTMLやCSS、JavaScriptなどのソースコードを自動生成することができます。また、生成AIはエラー解析やバグの検出などの作業も行うことができるため、開発プロセスを効率化することができます。

<h3>チャットボットでの顧客対応

チャットボットは、顧客とのコミュニケーションを支援するためのプログラムです。生成AIを活用することで、チャットボットが自動で顧客対応を行うことができます。これにより、営業時間外や大量の問い合わせに対応することが可能になります。

<h3>AI-OCRで会計業務の自動化

AIを活用した光学文字認識（OCR）技術を組み合わせることで、手書き書類のデータ化や要約作業を自動化することができます。これにより、領収書や請求書などの書類をスキャンし、データを抽出して経理業務を効率化することができます。

<h3>音声生成

生成AIは、入力したテキストや音声をもとに新たな音声を生成する技術です。音声生成技術を活用することで、音声合成や音声解析の分野で利用されています。これにより、音声を自動生成して業務プロセスを効率化することが可能です。

以上のように、生成AIは様々な業務領域で活用されています。これらの技術を活用することで、業務の効率化や生産性の向上を実現することができます。

<h2>まとめ

生成AIは、テキストや画像・音声などのコンテンツを自動生成する人工知能です。深層学習を利用し、効率化やアイデアの創出に役立ちますが、フェイクニュースや情報漏洩のリスクもあります。ビジネスでの活用にはルールを設けることが重要です。
詳しくは下記の記事もご参照ください。
➡<a href="https://hblab.co.jp/blog/in-house-infrastructure-toha/">社内インフラとは？構築する手順やポイントについて解説</a>
PyTorch3D pip install error にハマった件

Colab: ERROR: No matching distribution found for pytorch3d

解決
```
import sys
import torch
pyt_version_str=torch.__version__.split("+")[0].replace(".", "")
version_str="".join([
    f"py3{sys.version_info.minor}_cu",
    torch.version.cuda.replace(".",""),
    f"_pyt{pyt_version_str}"
])
!pip install --no-index --no-cache-dir pytorch3d -f https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/{version_str}/download.html
```
oracleのif existsは23cから

create tableとかdrop tableとかでのif existsはOracle 23cから利用可能な機能となっている。

https://support.oracle.com/knowledge/Oracle%20Database%20Products/3002402_1.html

それ以前だと下記のようなエラーになる。

```sql
drop table IF EXISTS hogehoge;

ORA-00933: SQL command not properly ended
```
Dev ContainerでRuby on Railsの開発環境構築

# 概要
いつもHTMLやJavascriptばかりで
環境構築の必要な作業をやったことがなく
今回Ruby on Railsのチュートリアル用でDockerに
チャレンジしてみました。

# やったこと
## 拡張機能のインストール
本題はrailsの勉強なのでなるべく早く環境構築できるように
VSCodeの拡張機能であるDev Containerをインストール

## フォルダの作成
まずは作業用フォルダ
```
sample_app
```
を作成し移動します。
移動後
```
.devcontainer
```
フォルダを作成しそこにファイルを置いていきます。

## docker-compose.yml
チュートリアルで開発用のファイルは配布されているのですが
そこも今回は勉強を兼ねて自分で書いてみました。
その際色々調べてみたのですが
チュートリアルをするには過剰かなと思ったので必要そうな
ところだけピックアップしました。

```docker-compose.yml
version: '3'

services:
  web:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ..:/workspaces/sample_app:cached # sample_appとなっている場所は、好きなプロジェクト名に変更する
    command: sleep infinity # 開発コンテナが勝手にダウンしない為に設定する
    ports:
      - 3000:3000
```

## DockerFile
```Dockerfile
# Pull ruby image
FROM mcr.microsoft.com/devcontainers/ruby:1.1-3.3-bullseye

RUN apt update && \
  apt-get install --no-install-recommends -y \
  build-essential

RUN su vscode -c "gem install rails:7.1.3.4"

# sample_appとなっている場所は、好きなプロジェクト名に変更する
WORKDIR "/workspaces/sample_app"
RUN bundle config set --local path vendor/bundle
```

## devcontainer.json
```devcontainer.json
{
  "name": "rails-devcontainer",

  "dockerComposeFile": [
    "docker-compose.yml"
  ],

  "service": "web",

  // sample_appは好きなプロジェクト名に変更してください。
  "workspaceFolder": "/workspaces/sample_app",

  "customizations": {
    "vscode": {
      "extensions": [
        お好きな拡張機能
      ]
    }
  }
}
```

## 起動
エディター左下の「><」から
「**コンテナーで再度開く**」
を選択する。

# まとめ
もっと記述を削れるのかもしれませんが
これで起動できたのでチュートリアルを
進めていきたいと思います。
(メモ)VS Code : Code for iの IBM i NotebooksでCLP他を実行する

5250開発環境からの移行に関連してのご質問で、5250対話画面から開発時に色々なCLPやOSコマンドで環境設定やらテストデータのリセットやらをしています。
Code for i で効率的にやる方法は？というような主旨です。

## IBM i Notebooks の使い方

VSCで まずF1キーを押して、コマンド入力に移動した後Ctrl+Shift+pキーを押します。IBM i Notebooks が候補に出るので選択します。
IBM i Notebooks はCode for i の機能の一部です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/80d5614c-5c0a-82e1-9980-2bf0a9ee25c3.png)

下記のように△の単位でまとめて実行できるようになります。サンプルではGOMALIB/INIT1, INIT2, DSPFDコマンド等を呼び出しています（コマンドは適当です、すみません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e43b1576-c172-c4b4-df98-bb2eedaa8fc6.png)

この設定を .inbの拡張子で保管すると、再呼出しして実行できるようですが、私の現在は、エラーで保管したファイルが読み込めないです・・ちょっと確認してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7e336beb-fb4c-42c9-7e75-edb8a7cd436f.png)
【 JavaScript / TypeScript 】requireとimportの使い分け

## はじめに
JavaScriptやTypeScriptでモジュールをインポートする際に、**requireとimport**のどちらを使うべきか迷ったことはありませんか？

この記事では、それぞれの違いや使い分けについて詳しく説明します。

## requireとimportの違い

### require
:::note info
**使用方法**
const module = require('module-name');
:::

:::note info
**環境**
CommonJSモジュールシステムを使用しているNode.js環境で使用されます。
:::

:::note info
**動作**
モジュールを同期的に読み込みます。実行時にモジュールをインポートします。
:::

:::note info
**ファイルの種類**
通常、.jsファイルを読み込みますが、TypeScript（.ts）ファイルもコンパイル後の.jsファイルとして読み込むことができます。
:::

### import

:::note info
**使用方法**
import module from 'module-name'; 
または
import { specificExport } from 'module-name';
:::

:::note info
**環境**
ECMAScriptモジュールシステム（ESM）を使用する**モダンなJavaScript環境やTypeScript環境**で使用されます。
:::

:::note info
**動作**
モジュールを静的に読み込みます。
コンパイル時にモジュールをインポートします。
:::

:::note info
**ファイルの種類**
.js、.ts、その他のファイルをインポートできますが、**TypeScriptでは通常、importが推奨**されます。
:::

## TypeScriptファイルの読み込み
TypeScriptファイルをJavaScriptファイルでrequireを使って読み込む場合、以下のような方法があります。

### 1. コンパイルされたJavaScriptを読み込む
TypeScriptファイル（.ts）をJavaScriptファイル（.js）に**コンパイル**し、その後requireで読み込みます。

```
const module = require('./dist/module.js'); // TypeScriptをJavaScriptにコンパイル後
```

### 2. ts-nodeを使用する
ts-nodeを使用して、TypeScriptファイルを直接実行できます。

```
require('ts-node').register();
const module = require('./src/module.ts');
```

### 3. ESMとトランスパイル
TypeScriptで**ESM**（ES Modules）を使用し、import文を使用してモジュールをインポートするのが一般的です。

この場合、tscでコンパイルしてから実行するか、ts-nodeを使用して直接実行します。

```
import { colors } from './src/config/colors';
```

:::note warn
**ESM / ES Modules**
JavaScriptの公式なモジュールシステムで、ES6（ECMAScript 2015）で導入されました。ES Modulesは、コードの再利用性を高め、依存関係を明示的に管理しやすくするために設計です。
:::

## requireを使わないほうがいいのか？
requireを使うかどうかは、**プロジェクトの設定や使用しているモジュールシステムに依存**します。

### requireを使う場合

:::note info
CommonJSモジュールシステムを使用している場合
:::

:::note info
レガシーコードや既存のプロジェクトでrequireが広範に使用されている場合
:::

### importを使う場合

:::note info
ES6モジュールシステムを使用している場合
:::

:::note info
モダンなJavaScript開発環境やTypeScriptプロジェクト
:::

:::note info
ブラウザ環境やフロントエンド開発
:::

## 推奨事項

:::note info
**新しいプロジェクト**
可能な限りimportを使用しましょう。
:::

:::note info
**既存のプロジェクト**
requireが広範に使用されている場合は急いで変更する必要はありませんが、新しいコードではimportを使用することを検討してください。
:::

:::note info
**混在環境**
ES6モジュールの使用を優先し、徐々にコードベースをモダンな標準に移行させることを目指しましょう。
:::

## 具体例

TypeScriptファイル (colors.ts):
```typescript:colors.ts
export const colors = {
  primary: 'red',
  secondary: 'blue'
};
```

JavaScriptファイル (tailwind.config.js):

```javascript:tailwind.config.js
// ES6のimport文を使用
import { colors } from './src/config/colors';

/** @type {import('tailwindcss').Config} */
export default {
  content: ['./src/**/*.{jsx,tsx}'],
  theme: {
    extend: {
      colors: {
        primary: colors.primary,
        secondary: colors.secondary,
      },
    },
  },
  plugins: [],
};
```

## まとめ
requireは特定の状況では便利ですが、可能であればimportを使用することが望ましいです。

これにより、**モダンなJavaScriptの標準に従うことができ、将来的なメンテナンスや拡張が容易**になります。

## リンク

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules
【kubectl】pod内を確認するコマンド

## 概要
kubectlで対象のpod内へ向けてコマンドを叩くことができるので、備忘録として記す。

## 公式
公式には以下のような構文を提示している。

```
kubectl exec [POD] -- [COMMAND]
```

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_exec/

## 実践
これをそのまま、実行する。
事例は以下の通りである。`COMMAND`の箇所にはLinuxにて確認するような一般的なコマンドを入れる。

### 事例

```pwd.command

$ kubectl exec -it test-pod-123-456-789 -- pwd
```

```tail.command
$ kubectl exec -it test-pod-123-456-789 -- tail -n 20 logs
```

## まとめ
（公式のまんまやればいいだけ、といえばそれまでだが）備忘録としてまとめてみた。
いちいちpodにログインしなくても、対象の中身をコマンドで確認できるので、覚えておくと良さそう◎
【UiPath】新しいモデル学習体験「Active Learning」 - データ出力編

# はじめに

- 本記事では、Document Data オブジェクトからデータを取得する実装サンプルを紹介します。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.10 バージョンのもので構成しています。

# Document Data オブジェクトからデータを取得する

https://docs.uipath.com/ja/activities/other/latest/document-understanding/extract-document-data

https://docs.uipath.com/ja/activities/other/latest/document-understanding/document-data

## ドキュメントデータを抽出

1. 「パスの存在を確認」アクティビティでILocalResource型の入力ファイル（変数）を用意します。
1. DUのモダンプロジェクトで作成（デプロイ）した抽出器を選択します。
（インストールしたパッケージ情報："UiPath.DocumentUnderstanding.Activities": "[2.9.2]"）

![財務諸表15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/886f4c07-9441-11f0-25a6-4cd7c618aa95.jpeg)

## フィールドを指定して値を取得

標準フィールドの値は***Dataプロパティ***の中から対象フィールドを選択するだけ！

![財務諸表17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/210cabd0-ea3d-23c8-4f97-b0554825df90.jpeg)

明細フィールド（表データ）は「繰り返し（コレクションの各要素）」を配置し、
***ドキュメントデータ.Data.Items*** を入力します。

![財務諸表18.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d64ea643-d4b3-88cb-e821-40df8600655b.jpeg)

こうすることで currentItem のプロパティから対象フィールドを選択できます。

![財務諸表19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0401867f-748f-50d8-9731-8c55e431b71e.jpeg)

## とりあえずデータを全部出力したい

「繰り返し（コレクションの各要素）」を配置し、
***ドキュメントデータ.DocumentMetadata.ResultsAsDataTables を入力します。
（Argument Type は DataTable）***

![財務諸表20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f5dc4d2f-cf1b-1b79-8e21-2fd20d81f60a.jpeg)
![財務諸表21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e1d3f2fb-1496-0e08-bf4f-048f2bdbcd96.jpeg)

標準フィールドは「RootDocumentFields」、表データは「Items」というテーブル名の様です。

![財務諸表22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/940049df-1dc0-2be6-7ec2-f32d2ae8e3d5.jpeg)

（例：Item.csv の中身）
![財務諸表23.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/92dfbdd9-a1dc-c8d0-ac06-6db6ae73e828.jpeg)

# さいごに

いかがでしたでしょうか。Document Data オブジェクトから直接取得したいフィールドを選択できるため、直感的にわかりやすく助かります。
クラシックでは「抽出結果をエクスポート」アクティビティがありましたが、上述の通り、モダンでは ResultsAsDataTables プロパティで簡単にテーブル出力もできてしまいます。
これからDUをはじめる方は迷わずアクティブラーニングでいきましょう！
最後までお読みいただきありがとうございます(・ω・)ノ
[e2e]puppeteerでローカルストレージの操作をする方法

# 完全に備忘録
puppeteerでe2eのテストコード書いてて、処理の途中でローカルストレージに値入れたいなぁ的なことがあったので、実装メモがてらにここに残すよ！

```typescript:app.e2e.ts
import * as puppeteer from 'puppeteer';
const baseUrl = 'http://localhost:4200/';
let browser: puppeteer.Browser;
let page: puppeteer.Page;

describe('App test', function () {
  beforeAll(async () => {
    browser = await puppeteer.launch({
      headless: false,
      timeout: 10000,
      ignoreDefaultArgs: ['--disable-extensions'],
    });
  });

  beforeEach(async () => {
    page = await browser.newPage();
  });

  afterEach(async () => {
    await page?.close();
  });

  afterAll(async () => {
    await browser?.close();
  });

  it('テスト', async () => {
    await page.goto(`${baseUrl}`, {
      waitUntil: ['domcontentloaded', 'networkidle2'],
      timeout: 3000,
    });
    // ここで登録して、その値がちゃんと登録されているかを検証
    await expect(
      await page.evaluate(() => {
        localStorage.setItem("なんか適当なkey", "なんか適当な値")
        return localStorage.getItem('なんか適当なkey');
      }),
    ).toBe("なんか適当な値");
  });
});
```

expectでラップせずにpage.evaluateだけ呼び出すと、値がうまく入らなかったり・消えなかったりするような挙動をする不思議な現象があったため、
明示的に値を返してちゃんと登録されてる・消えてるよねをチェックすることでうまく動くようになったので、とりあえずメモがてらに残してみた。
ボルツマンマシン

今回は簡単なボルツマンマシンについて自分用にまとめます。

# Boltzmann machine
ボルツマンマシンは生成モデルの一種として使われています。例えば今、学習データが${\bf{X}}_1, {\bf{X}}_2, ..., {\bf{X}}_n$で与えられ、それぞれのデータは-1か+1という2値の値を持つベクトルであるとします。

この時、データの生成モデルを次のように構成します。

```math 
\begin{align*}
q_{\theta}({\bf{X}}) &= \frac{1}{Z_{\theta}}{\rm{exp}}\Big[\sum_{k\neq l}J_{kl}X_{k}X_{l}+\sum_{k=1}^{N}h_{k}X_{k}\Big] \\
Z_{\theta} &= \sum_{{\bf{X}}}{\rm{exp}}\Big[\sum_{k\neq l}J_{kl}X_{k}X_{l}+\sum_{k=1}^{N}h_{k}X_{k}\Big] \\
\theta &= \{J_{kl}, h_{k}\}
\end{align*}
```

ただし$X_k$という表記は、データ${\bf{X}}$のk番目の値であることに注意してください。このように構築したモデルのことをボルツマンマシンと言います。
次にボルツマンマシンを学習するために、KL情報量を最小化します。

```math 
\begin{align*}
min_{\theta} \ D_{KL}(p_0||q_{\theta}) &= min_{\theta}\Big[-\sum_{{\bf{X}}}p_{0}({\bf{X}})\Big(\sum_{k\neq l}J_{kl}X_{k}X_{l}+\sum_{k=1}^{N}h_{k}X_{k}\Big)+{\rm{log}}Z_{\theta}\Big] \\
&= min_{\theta}\Big[-\frac{1}{n}\sum_{i=1}^{n}\Big(\sum_{k\neq l}J_{kl}[X_{k}]_{i}[X_{l}]_{i}+\sum_{k=1}^{N}h_{k}[X_{k}]_{i}\Big)+{\rm{log}}Z_{\theta}\Big]
\end{align*}
```

$p_0$はデータの経験分布です。最小化するためのそれぞれのパラメータに対する偏微分を行います。まず、$h_k$による微分は、

```math 
\begin{align*}
-\frac{1}{n}\sum_{i=1}^{n}[X_{k}]_{i} \ + \frac{\partial}{\partial h_{k}}{\rm{log}}Z_{\theta} &= -\frac{1}{n}\sum_{i=1}^{n}[X_{k}]_{i} \ + \frac{1}{Z_{\theta}}\sum_{{\bf{X}}}X_{k}q_{\theta}({\bf{X}}) \\
\frac{1}{Z_{\theta}}\sum_{{\bf{X}}}X_{k}q_{\theta}({\bf{X}}) \ &= \ <X_{k}>_{\theta} \ とすると \\
\therefore \ <X_{k}>_{\theta} \ &= \ \frac{1}{n}\sum_{i=1}^{n}[X_{k}]_{i}
\end{align*}
```

一方で$J_{kl}$による微分も、全く同じように計算ができます。

```math 
\begin{align*}
<X_{k}X_{l}>_{\theta} \ &= \ \frac{1}{n}\sum_{i=1}^{n}[X_{k}]_{i}[X_{l}]_{i}
\end{align*}
```

さて、最適化に関する式が導けました。しかしこれは、学習データに対する平均や相関に合うように、パラメータを決めなさいという当たり前の式です。このようにパラメータの決め方に関して計算困難性が生じてまう時、勾配法などの最適化アルゴリズムを使って、パラメータを更新するのが一般的です。勾配法についてはまた今度書くことにします。

[参考動画]
生成モデルの数理情報学！【2022年度・情報基礎科学としての数理情報学・東北大学大学院情報科学研究科】 (大関真之)
SpringBootでよくあるエラー

# エラー内容
```
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
```

このエラーは、ポート番号がすでに使用中となっているときによく出てしまいます。

# 対処法
ターミナルで
```
lsof -i:8080
```
と入力した後、
```
kill 番号
```
と入力してください。
番号には一個目を実行した後に出てくるものです。

そしてもう一度Eclipseでプログラムを起動してみてください。

# 終わりに
これでも直らなかった場合は、application.propertiesやpom.xmlを見直してみてください。
Javaで「break文の使い方」の動作を確認してみた

# 概要

Javaで「break文の使い方」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/for/index9.html

# 実装

以下のファイルを作成しました。
```JSample9_1.java
class JSample9_1{
  public static void main(String[] args){
    int num = 1;

    for (int i = 0; i < 30; i++){
      num *= 5;
      System.out.println("num = " + num);

      if (num > 10000){
        System.out.println("Over 10000");
        break;
      }
    }
  }
}
```

以下のファイルを作成しました。
```JSample9_2.java
class JSample9_2{
  public static void main(String[] args){

    Outer:
    for (int i = 1; i < 5; i++){

      Inner:
      for (int j = 1; j < 5; j++){
        System.out.println("i * j = " + i * j);

        if (i * j > 10){
          break Outer;
        }
      }

      System.out.println("Next");
    }

    System.out.println("End");
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample9_1.java 
$ java JSample9_1 
num = 5
num = 25
num = 125
num = 625
num = 3125
num = 15625
Over 10000
```

```
$ javac JSample9_2.java 
$ java JSample9_2 
i * j = 1
i * j = 2
i * j = 3
i * j = 4
Next
i * j = 2
i * j = 4
i * j = 6
i * j = 8
Next
i * j = 3
i * j = 6
i * j = 9
i * j = 12
End
```

# まとめ

何かの役に立てばと。
Pandas入門ガイド：データ分析を始めよう

## はじめに
Pythonはデータ分析に非常に適した言語で、その中でも特に強力なライブラリの一つがpandasです。
pandasを使うことで、データの読み込み、操作、解析が簡単に行えます。

### pandasとは？
pandasは、データ操作や解析のための強力なPythonライブラリです。
特に以下のような場合に使用します。

1. **データの読み込みと保存**：
    - CSV、Excel、SQLデータベースなど、さまざまな形式のデータを簡単に読み込み、保存できます。
  
2. **データのクリーニング**：
    - 欠損値の処理やデータのフィルタリング、重複の削除など、データをクリーンにするための機能が豊富です。
  
3. **データの変換と操作**：
    - 列や行の追加・削除、データ型の変換、条件に基づくデータの選択など、多くのデータ操作が簡単に行えます。
  
4. **データの集計とグループ化**：
    - ピボットテーブルの作成や、特定の条件に基づくデータの集計、グループ化ができます。
  
5. **データの可視化**：
    - matplotlibやseabornなどのライブラリと組み合わせて、データの視覚化も容易に行えます。

この記事では、pandasの基本的な使い方を紹介します。

## pandasのインストール
まずはpandasをインストールしましょう。以下のコマンドをターミナルやコマンドプロンプトで実行します。

```bash
pip install pandas
```

## pandasの基本的な使い方
pandasは主に二つのデータ構造を使います：`Series`と`DataFrame`です。
`Series`は一連のデータを持つ一次元の配列、`DataFrame`は二次元のデータテーブルです。

### Seriesの作成
`Series`を作成するには、リストや辞書を使用します。

```python
import pandas as pd

# リストからSeriesを作成
s = pd.Series([1, 2, 3, 4, 5])
print(s)
```

#### 実行結果:
```
0    1
1    2
2    3
3    4
4    5
dtype: int64
```
---
### 辞書からSeriesを作成
```python
# 辞書からSeriesを作成
s = pd.Series({'a': 1, 'b': 2, 'c': 3})
print(s)
```

#### 実行結果:
```
a    1
b    2
c    3
dtype: int64
```

### DataFrameの作成
`DataFrame`を作成する方法はいくつかありますが、ここではリストと辞書を使った方法を紹介します。

```python
# 辞書からDataFrameを作成
data = {
    '名前': ['太郎', '花子', '次郎'],
    '年齢': [25, 30, 35],
    '職業': ['エンジニア', 'デザイナー', 'データサイエンティスト']
}
df = pd.DataFrame(data)
print(df)
```

#### 実行結果:
```{
    名前  年齢            職業
0   太郎  25       エンジニア
1   花子  30       デザイナー
2   次郎  35  データサイエンティスト
```

### CSVファイルの読み込み
pandasを使うとCSVファイルの読み書きも簡単です。
まずはCSVファイルを読み込んでみましょう。

```python
# CSVファイルの読み込み
df = pd.read_csv('data.csv')
print(df)
```

#### 実行結果:
`data.csv`の内容に依存します。
例えば、以下のようなCSVファイルがあると仮定します。

```plaintext
名前,年齢,職業
太郎,25,エンジニア
花子,30,デザイナー
次郎,35,データサイエンティスト
```

実行結果:
```
    名前  年齢            職業
0   太郎  25       エンジニア
1   花子  30       デザイナー
2   次郎  35  データサイエンティスト
```

### データの表示
データを表示するための基本的なメソッドには、`head()`と`tail()`があります。

```python
# 最初の5行を表示
print(df.head())
```

#### 実行結果:
```
    名前  年齢            職業
0   太郎  25       エンジニア
1   花子  30       デザイナー
2   次郎  35  データサイエンティスト
```
---
```python
# 最後の5行を表示
print(df.tail())
```

#### 実行結果:
```
    名前  年齢            職業
0   太郎  25       エンジニア
1   花子  30       デザイナー
2   次郎  35  データサイエンティスト
```

### 基本的なデータ操作
pandasを使うと、データのフィルタリングやソート、集計が簡単に行えます。

```python
# 特定の列を選択
print(df['名前'])
```

#### 実行結果:
```
0    太郎
1    花子
2    次郎
Name: 名前, dtype: object
```
---
```python
# フィルタリング
print(df[df['年齢'] > 30])
```

#### 実行結果:
```
    名前  年齢            職業
2   次郎  35  データサイエンティスト
```
---
```python
# ソート
print(df.sort_values(by='年齢'))
```

#### 実行結果:
```
    名前  年齢            職業
0   太郎  25       エンジニア
1   花子  30       デザイナー
2   次郎  35  データサイエンティスト
```
---
```python
# グループ化と集計
print(df.groupby('職業').mean())
```

#### 実行結果:
```
                年齢
職業                
エンジニア        25.0
デザイナー        30.0
データサイエンティスト  35.0
```
以上
SDK, API, Libraryの違い

# まとめ
### SDK（Software Development Kit）
SDKは、特定のプラットフォームやフレームワーク用にアプリケーションを開発するためのツールやリソースの集まりです。通常、以下のものが含まれます。
- **APIやLibrary：** 機能を利用するためのコードやインターフェース
- **開発ツール：** コンパイラ、デバッガ、エミュレータなど
- **ドキュメント：** 開発に必要なガイドやリファレンス
- **サンプルコード：** 実装例やテンプレート



### API（Application Programming Interface）
APIは、ソフトウェア同士が相互に通信し、機能を利用するためのインターフェースです。特定の機能を提供するためのメソッドや関数の集合であり、外部のアプリケーションがその機能を利用できるようにします。

### Library
Libraryは、特定の機能やタスクを実行するための再利用可能なコードの集合です。Libraryはアプリケーションに組み込まれ、開発者がその機能を利用することができます。


# 目次
- [SDK](#SDK)
- [API](#API)
- [Lirary](#Lirary)
- [活用例](#活用例)
 
# SDK
- **Android SDK:** Androidアプリ開発のためのツールやライブラリが含まれています。
- **iOS SDK:** iOSアプリ開発に必要なツールやライブラリが提供されています。

# API
- **Google Maps API:** 地図表示や地理情報を取得するためのインターフェース。
- **Twitter API:** Twitterのデータを取得したり、投稿するためのインターフェース。

# Library
- **jQuery:** JavaScriptのライブラリで、DOM操作やAjaxリクエストを簡素化する。
- **NumPy:** Pythonで数値計算を行うためのライブラリ。

# 活用例
## インターネットを通じてステージを追加したり、ハイスコアを他プレイヤーと競うブロック崩しゲーム
- ゲームエンジン：`Unity`
- SDK：`Android SDK`
- API：`Web API`（ランキング登録・取得APIなど）
- Lirary：`Zipライブラリ`、`HTTP通信ライブラリ`

## 詳細
### `Unity`
**統合開発環境（IDE）を内蔵するゲームエンジン**
- **ゲーム開発環境:** ゲームのロジック、物理演算、グラフィックス、サウンド、UIなど、ゲームを構築するためのツールと機能を提供します。
- **クロスプラットフォーム対応:** 一度開発したゲームを、Androidを含む複数のプラットフォーム向けにビルドできます。

### `Android SDK`
- **プラットフォームのAPIとツール:** Android OSの機能を利用するためのAPIやライブラリ、ツールが含まれています。これにより、アプリがAndroidデバイス上で動作するための基盤を提供します。
- **開発ツール:** コンパイラ、デバッガ、エミュレータなど、開発・テストを支援するツールが含まれています。

### `Web API`
- **データ通信:** ゲームとサーバ間のデータ通信を行います。例えば、プレイヤーのスコアをサーバに送信したり、他のプレイヤーのスコアを取得したりします。
- **ランキング管理:** プレイヤーのハイスコアをサーバ上に保存し、ランキング表示のためのデータを提供します。

### `Zipライブラリ`
- **ステージの管理:** プレイヤーが作成したステージをzipファイルとして圧縮・解凍する機能を提供します。これにより、ゲーム内で新しいステージを簡単に追加・読み込むことができます。

### `HTTP通信ライブラリ`
- **ネットワーク通信:** サーバとのデータ通信を容易にします。Unityでは通常、UnityWebRequestなどを使用してHTTP通信を行います。
- **データ送受信:** スコアの送信やランキングデータの取得など、サーバとのやりとりを行います。

# 参考リンク
- [SDK とは](https://www.redhat.com/ja/topics/cloud-native-apps/what-is-SDK)
- [API, SDK, Libraryの違い | DAFTCRAFT ENGINEER BLOG](https://daftcraft.co.jp/archives/3354)
- [Unityを理解する！初心者でも分かる特徴やゲーム開発で出来ることなどを簡単に解説！](https://anken-hyouban.com/blog/2020/06/13/unity/)
- [Web APIとは？初心者にもわかる基本的な仕組みと活用方法](https://blog.hubspot.jp/website/api-web)
Vue.js Tailwindと相性がいいTransitionのクラス指定方法

Transitionタグによるアニメーションクラスの指定方法がVue3で増えていた。
Tailwindとの親和性が高そう。

## Transition

https://vuejs.org/guide/built-ins/transition

`v-if`や`v-show`によって要素が追加・削除される際にアニメーションを付ける方法として、Transitionタグがあり（`v-for`による複数要素にはTransitionGroupタグ）、その中の要素に対してクラスを付与してくれる機能がある。そのクラス名に対してCSSアニメーションのスタイルをあてることで、アニメーションの挙動を指定できる。

Vue3でのTransitionに関するクラスは以下の6つ。(Vue2では一部違うので注意)

- `v-enter-from`
- `v-enter-active`
- `v-enter-to`
- `v-leave-from`
- `v-leave-active`
- `v-leave-to`

デフォルトではクラス名は上記の通りで、`v`の部分をTransitionタグのname属性で変更できる。

## カスタムクラス名

しかしVue3では、それに加えてTransitionタグに`enter-active-class`などの属性が増え、そこに直接クラス名を指定できるようになっていた。

https://vuejs.org/guide/built-ins/transition#custom-transition-classes

つまり、`-enter-from`などの命名ルールに縛られず、自由にクラス名が指定できる。

## Tailwindとの相性

この新しい指定方法により、Tailwindを使っている場合はTailwindのデフォルトのクラスがそのまま使える。

Vue2でTransitionとTailwindを併用する際には`@apply`を使って各クラスにスタイルをあてる必要があり、style内の記述が必須。

```vue
<template>
  <transition name="fade">
    <div v-if="showText">Test</div>
  </transition>
</template>

<style>
.fade-enter-active,
.fade-leave-active {
  @apply transition-opacity duration-300;
}
.fade-enter-from,
.fade-leave-to {
  @apply opacity-0;
}
</style>
```

Vue3では、以下の様に書ける。（styleタグが不要）

```vue
<template>
  <transition
    enter-active-class="transition-opacity duration-300"
    leave-active-class="transition-opacity duration-300"
    enter-from-class="opacity-0"
    leave-to-class="opacity-0"
  >
    <div v-if="showText">Test</div>
  </transition>
</template>
```

記述量が減っているかと言われると、そこまで減っていない気もする。同じスタイルの重複もあるし。

ただ、スタイルとHTML要素が一か所に記述されるので、Tailwindを使うメリットである「HTMLとCSSを行き来することなく開発できる」点を活かすことができる。

※Vue2でTailwindを使ったことが無いので詳しくないですが、もし他の書き方ができ場合はコメントで教えてください。
ローカル環境でLlama2を日本語で動かす

ローカル環境でLlama2を動かすの日本語対応です

下記の記事が動作する前提です

https://qiita.com/t-yamanashi/items/10cdf6863da2e5a43755

# 変更ポイント

```diff_elixir
- repo = {:hf, "meta-llama/Llama-2-7b-chat-hf", auth_token: hf_token}
+ repo = {:hf, "elyza/ELYZA-japanese-Llama-2-7b", auth_token: hf_token}
```

elyza/ELYZA-japanese-Llama-2-7bというモデルがあります

https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b

# 実行結果

Llama2の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/42e8890a-8d71-369e-0cd5-56909ca32d55.png)

んｗ（ノーコメント）

なので、Gemini先生に模範回答してもらいました
　└外部サービスの利用（ISDNはじめちゃん）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/351afc2d-55c2-3eeb-a258-31e346a26912.png)


というオチです

# 番外編　他のLLM
Gemini先生回答により明確な質問に変更しました
Mistralをローカル実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/0b7589b7-5121-32d0-af61-54cdea147eb3.png)
ん?(確かにオープンカーはある)


みんな大好きChatGPT（正解）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/1e18024a-f7cf-f4cb-3772-89b53a1eaeba.png)

# 余談
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/826c687e-636e-4c8e-286d-08c4ff493393.png)

草
Llama2が求めていた世界はエモかった


ローカル環境のStable Diffusion (v1.4)で作ってみた
期待通り！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/97dc9fe7-d184-701c-a07e-e19e95b1afcc.png)
【アジャイル】デイリースクラムのメモ

毎日決まった時間に進捗状況・課題の確認、連絡事項の共有をする、デイリースクラムなるものがアジャイル開発にはあります。（ウォーターフォール開発でも普通にある）

長くても15分ほどで終わらせる必要があるので、フォーマットを用意して連携したほうが早いのです。
これを事前にメンバーに記載してもらって、定例で確認するフローでプロジェクトを回していました。口頭ベースでなくてフォーマットを残す理由は、会社員あるあるな感じです。

フォーマット
------------------------------
名前：
日付：yyyy/mm/dd

本日の予定・実績：
①
②

明日の予定：
①
②

課題・困っていること：
①

連絡事項：
①


デイリースクラムでは、進捗確認、連絡事項の確認、連絡事項の周知程度にとどめたほうがより意義のあるミーティングが開けると思いますので、課題・困りごとはすぐ解決できればその場で解決し、時間がかかるなら同日のスクラム後に別途時間を取ればいいと思います。

あと、目的を見失わないようにしましょう。
日々のサイクルを回してリズムを作るために毎日同じ時間にやって、いい雰囲気作りのために絶対否定的なこと言わないこととか、

大事です。

以上、自分用のメモでした。
社内インフラとは？構築する手順やポイントについて解説

![社内インフラとは？構築する手順やポイントについて解説.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3544821/9d0590ba-4d7b-b01e-716e-fa5756d6534d.png)

「社内インフラの構築方法が分からない」「専門企業に依頼したい」とお悩みではありませんか？外部に依頼することで、従業員が快適に働ける環境を整えられます。本記事では、社内インフラの定義や構築手順・ポイントについて解説します。

<h2>社内インフラとは？

社内インフラとは、従業員が仕事をするために必要な環境のことです。特にIT関連のものをITインフラと呼びます。本記事ではITインフラについて説明します。パソコンやインターネットの利用が当たり前になった今、ITインフラの整備は必須です。これは業務効率を上げ、他企業との差別化にも繋がります。自社で構築することもできますが、専門企業に外注することで、より快適な環境を構築しやすくなります。専門企業は自社の業務に合ったサーバーやネットワーク機器を選定してくれます。

<h2>そもそもインフラとは？

インフラとは、水道、ガス、電気など、生活に必要不可欠なサービスや仕組みを指します。これらは「意識せずに当たり前に使える」ことが重要です。同様に、社内インフラも「従業員が当たり前に使える」ことを意識して構築することが大切です。

<h2>社内インフラを構築するために必要なもの

社内インフラを構築するには次の3つを用意する必要があります。
・サーバー
・ネットワーク
・ソフトウェア各種
1つ1つの必要なものについて詳しく解説していきます。

<h3>1.サーバー

サーバーは他のパソコンにサービスを提供するコンピューターです。専用のソフトをインストールすることで機能させられます。WebサーバーはWebページのデータを提供し、メールサーバーやデータベースサーバーなどもあります。クラウドサーバーの利用が増え、ランニングコストを削減できます。

<h3>2.ネットワーク

パソコンが正常にネットワークに接続できる環境を整えることも重要です。社内のほとんどの業務がネットワークに依存しているため、快適なネットワーク環境を確保することが必要です。しかし、遅延する社内ネットワークの問題は多く、無線LANの干渉や配線の複雑さが原因となっています。これにより、Web閲覧やメールの送受信が滞り、業務効率が低下します。問題があれば、開発企業に相談しましょう。

<h3>3.ソフトウェア各種

ソフトウェアはパソコンにインストールして利用するシステムです。ExcelやWordなどの業務アプリやWindowsやMacなどのOSが代表的です。社内インフラを整える際には、業務に利用するソフトウェアを統一することが重要です。異なるソフトウェアを使用すると情報共有が難しくなります。ソフトウェア選定時には信頼性やセキュリティーを重視し、業務との相性や保守費用も考慮する必要があります。

<h2>社内インフラを構築する流れ

社内インフラを構築する基本的な流れは次の通りです。
<h3>1. 計画立案

インフラ導入計画を策定します。業務効率向上などの目的を明確にし、自社サーバーかクラウドサーバーなどの選定、管理環境の考慮を行います。

<h3>2. 設計

具体的なインフラ設計を行います。必要な機器やセキュリティ対策を検討し、コスト算出と設定書の作成を行います。

<h3>3. 構築

設定書に基づいて機器の購入から初期設定、ソフトウェア導入まで構築を進めます。トラブル対策も行います。

<h3>4. 動作確認

構築した環境でシステムの動作確認を行います。機器単体から全体まで順次テストし、不具合があれば修正します。

<h3>5. 運用・保守

インフラの運用・保守を行い、安定稼働を維持します。ログ監視や定期メンテナンスなどを行います。

<h2>社内インフラを構築するポイント

社内インフラを構築する際の重要ポイントは次の3つです。

<h3>1. セキュリティー対策

インフラ構築時にはセキュリティーを重視します。常時インターネット接続のシステムはハッキングなどのリスクがあります。個人情報の漏洩や損害を防ぐため、適切なセキュリティー対策が必要です。社内ルールの策定も重要です。

<h3>2. 快適なネットワーク環境

インフラ構築後も従業員の作業環境を向上させることが重要です。社内アンケートやネットワークの不具合の確認を通じて、ネットワーク環境の改善を行います。快適な環境は生産性向上に繋がります。

<h3>3. BCP対策

事業継続計画（BCP）を考慮します。災害時にも業務を継続できるよう、データのバックアップや災害対策の導入を行います。BCP対策は会社の損失を最小限に抑える重要な手段です。

<h2>社内インフラの構築を外注するポイント

社内インフラの構築を外注する際のポイントは次の3つです。

<h3>実績豊富な企業を選択

インフラ構築の実績が豊富な企業を選びます。優れたサーバーエンジニアやデータベースエンジニアを有する企業が望ましいです。実績豊富な企業は自社のニーズにマッチしたインフラを提供してくれるでしょう。

<h3>自社の規模や業種と適合する企業を選定

自社の規模や業種にマッチした企業を選びます。同様の企業を支援した実績がある会社は、自社の課題を理解しやすく、要望に応じたインフラを提供してくれる可能性が高いです。

<h3>運用支援の確認

インフラ構築後の運用支援も重要です。運用やメンテナンスが必要なため、外部の企業がどの程度手厚く支援してくれるかを確認します。構築だけでなく、運用面でも信頼できるパートナーを選定することが大切です。

<h2>まとめ

社内インフラ構築は面倒な作業が多く、時間とコストがかかります。そのため、専門企業に外注することをおすすめします。株式会社エイチビーラボは、ベトナムに特化したオフショア開発サービスを提供し、豊富な実績を持っています。社内インフラ構築でお困りの方は、お気軽にご相談ください。

詳しくは下記の記事もご参照ください。
➡ <a href="https://hblab.co.jp/blog/in-house-infrastructure-toha/">社内インフラとは？構築する手順やポイントについて解説 - HBLAB JSC</a>
学生（生徒）フォルダをまとめて作成する

## コマンドプロンプトを使用する

例えば、現在のディレクトリにフォルダを作成したいとき、コマンドプロンプトに次のように打ち込んでEnterを押下すればフォルダが作成できます。

```ruby:
C:\Users\user> mkdir student01
```
つまり、この部分を自動化すれば１度に大量のフォルダを作成することができます。
具体的には.bat形式のバッチファイルを作成（テキストエディタで作れる）します。

## 下準備　エクセルでテキストを作成する
エクセルでこんな感じの表をオートフィルをうまく使って作成し、&などでABC列を結合します。
mkdirの後には半角のスペースを忘れずに。
その後、E2:D11部分をコピーし、メモ帳などに貼り付けします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/2c80aa24-5447-96ce-eb05-873dd3679f5f.png)

## まとめ
あとは.bat形式で保存し、フォルダを作成したいディレクトリ上でバッチファイルを開けばフォルダを作成する処理が実行されます。

デスクトップ上で実行するとデスクトップにディレクトリが作成されます。
実行する場所に注意してください。

これでstudent01-student11のようなフォルダをまとめて作成することができます。
cd等を使って処理中にディレクトリを移動すれば、さらに深い階層のディレクトリもまとめて作成できますね。

```ruby:sample.bat
mkdir student01
mkdir student02
mkdir student03
mkdir student04
mkdir student05
mkdir student06
mkdir student07
mkdir student08
mkdir student09
mkdir student10
```
CentOSでDocumentAIを使う

# はじめに
DocumentAIをLinux上に実装するのは三回目なのに未だに慣れないので記事に
GooGle Cloud STK側でプロジェクトを作っていない人は先に調べて作ってくること

# Google Cloud SDK
pythonはさすがにもう入れてる前提です
リポジトリ追加
```
sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM
```
インストール

    sudo yum install google-cloud-sdk
初期化

    gcloud init

道中プロジェクト選択させられるから使うやつを選択

# 認証情報
IAMの管理→サービスアカウント
サービスアカウントを作成するか、あるなら選んでjsonをダウンロードする、ダウンロードしたjsonを`your-service-account-file.json`という名前に変えておく(見やすくするため9
ホームディレクトリにjsonのパスを置く

    mkdir -p ~/google_cloud_keys
    mv ~/Downloads/your-service-account-file.json ~/google_cloud_keys/


その後ターミナルへ行き環境変数設定

    echo 'export GOOGLE_APPLICATION_CREDENTIALS="$HOME/google_cloud_keys/your-service-account-file.json"' >> ~/.bashrc
    source ~/.bashrc
    
環境変数が正しいかチェック

    echo $GOOGLE_APPLICATION_CREDENTIALS
`/home/your-username/google_cloud_keys/your-service-account-file.json`と出たらいい


pythonで動かすためにpip

    pip install google-cloud-documentai
スプレッドシートでSUM関数を使う

SUM関数は、データの合計を計算するのに使う、とっても便利な関数です。

例えば、商品売上データの合計を計算したい場合、SUM関数を使うと簡単に計算できます。

**SUM関数の使い方**

1. **合計を計算したいデータ範囲を選択します。**
2. 入力欄に「=SUM(データ範囲) 」と入力します。
3. **Enterキーを押します。**

これで、選択した範囲のデータの合計が表示されます。

**例**

| A | B | C |
|---|---|---|
|| 商品名 | 売上額 |
|1| A商品 | 1000 |
|2| B商品 | 2000 |
|3| C商品 | 3000 |

**合計を計算するには、以下の手順で行います。**

1. B2:B4のセル範囲を選択します。
2. 入力欄に「=SUM(B2:B4)」と入力します。
3. Enterキーを押します。

すると、セルに「6000」と表示されます。

**補足**

* SUM関数は、複数の範囲の合計を計算することもできます。例えば、
 ```=SUM(A1:A5,C2:C6)```
 のように入力すると、A1:A5とC2:C6の合計が計算されます。
* SUM関数を使用する際は、データ範囲を正しく指定することが重要です。間違えると、正しい合計が計算されないことがあります。

SUM関数を使いこなして、データ分析をもっと楽しく、効率的にしましょう！ 😄
PowerVSのUsage情報にConsumer IDが入り、内訳を判別しやすくなりました

PowerVSの利用量（費用）は、Usageの画面で確認できます。
これまでは、ワークスペース単位の合計の利用量として表示されていましたが、`Consumer ID`というリソース毎に一意の文字列が入るようになり、利用内訳を判別しやすくなりました。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-pricing-virtual-server-on-cloud#consumer-id

下記がUsage画面の例です。
https://cloud.ibm.com/billing/usage
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c4f26897-d182-bfa1-bb5f-a2be57ad5284.png)


Consumer IDは、GUIもしくはCLIで確認できる各リソースのIDに紐づいています。
以下、CLIを使ってIDを確認する例です。
```
Workspaceをリストし、対象WorkspaceのCRNを取得
$ ibmcloud pi ws list|grep -i dal10b
Listing workspaces under account xxx as user xxxxxxxxx...
crn:v1:bluemix:public:power-iaas:dal10:a/039dbe6794084c7cb514a276dd2345da:d3bf8a93-bd2e-4997-9ddb-c335c125f151::      d3bf8a93-bd2e-4997-9ddb-c335c125f151   Power Systems Virtual Server-DAL10b
$

上記で取得したCRNを指定し、操作対象のWorkspaceを指定
$ ibmcloud pi ws target crn:v1:bluemix:public:power-iaas:dal10:a/039dbe6794084c7cb514a276dd2345da:d3bf8a93-bd2e-4997-9ddb-c335c125f151::
Targeting service crn:v1:bluemix:public:power-iaas:dal10:a/039dbe6794084c7cb514a276dd2345da:d3bf8a93-bd2e-4997-9ddb-c335c125f151::...
$

ボリューム一覧。 IDがUsage画面のConsumer IDと紐づいています。
$ ibmcloud pi vol list
Listing volumes under account xxx as user xxxxxxxxxxx...
ID                                     Name                                     Address
4b5d1141-d582-4344-a2db-d0e2fd0b2641   tmgw-dal10b-a-8115dc79-0000fcfb-boot-0   /pcloud/v1/cloud-instances/d3bf8a93-bd2e-4997-9ddb-c335c125f151/volumes/4b5d1141-d582-4344-a2db-d0e2fd0b2641
26af7ce3-a896-4201-8dc5-3b59e402211f   tmgw-                                    /pcloud/v1/cloud-instances/d3bf8a93-bd2e-4997-9ddb-c335c125f151/volumes/26af7ce3-a896-4201-8dc5-3b59e402211f
2c098468-a5b5-42cd-bc0d-3f1fac15c687   tmgw-i-b0951cc5-0000ae6b-boot-0          /pcloud/v1/cloud-instances/d3bf8a93-bd2e-4997-9ddb-c335c125f151/volumes/2c098468-a5b5-42cd-bc0d-3f1fac15c687
$

サーバー（LPAR）一覧。 IDがUsage画面のConsumer IDと紐づいています。
$ ibmcloud pi ins list
Listing instances under account xxx as user xxxxxxxxxxxxx...
ID                                     Name              Path
8115dc79-a1b5-4357-9c79-6f04561ce180   tmgw-dal10b-aix   /pcloud/v1/cloud-instances/04cd666cd4c145338e6b82d45be394dd/pvm-instances/8115dc79-a1b5-4357-9c79-6f04561ce180
$ 

```

以上
`Set<string>` と `string[]` の違いについて

## はじめに
JavaScriptやTypeScriptでデータを管理する際に、`Set<string>` と `string[]` という二つの選択肢があります。それぞれの違いと使用方法について詳しく解説します。

## `Set<string>`

### 特徴

- **重複を許さない**: `Set`は重複する値を持つことができません。同じ値が追加されると、元の値がそのまま保持され、新しい値は追加されません。
- **順序が保証されない**: `Set`は要素の挿入順序を保証しません。
- **メソッド**: `Set`は`add`, `delete`, `has`, `clear`などのメソッドを持ちます。

### 使用例

重複する可能性があるデータを一意に保ちたい場合に便利です。

```typescript
const userUids = new Set<string>();

// 値を追加
userUids.add('uid1');
userUids.add('uid2');
userUids.add('uid1'); // 重複は無視される

// 値の存在をチェック
if (userUids.has('uid1')) {
  console.log('uid1 exists');
}

// 値を削除
userUids.delete('uid1');

// 全ての値をループ
for (const uid of userUids) {
  console.log(uid);
}
```

## `string[]`
### 特徴

- **重複を許す**: 配列は重複する値を持つことができます。同じ値が複数回追加されると、すべての値が保持されます。
- **順序が保証される**: 配列は要素の挿入順序を保持します。
- **メソッド**: 配列はpush, pop, shift, unshift, splice, indexOfなどのメソッドを持ちます。

### 使用例
順序が重要である場合や、重複するデータを保持する必要がある場合に便利です。

```typescript
const userUids: string[] = [];

// 値を追加
userUids.push('uid1');
userUids.push('uid2');
userUids.push('uid1'); // 重複が許される

// 値の存在をチェック
if (userUids.indexOf('uid1') !== -1) {
  console.log('uid1 exists');
}

// 値を削除
const index = userUids.indexOf('uid1');
if (index !== -1) {
  userUids.splice(index, 1);
}

// 全ての値をループ
for (const uid of userUids) {
  console.log(uid);
}
```

### 選択の基準
- **重複を避けたい**: `Set<string>`
- **順序を保持したい**: `string[]`
- **重複する値を保持したい**: `string[]`

これらの点を考慮して、データの性質や要件に応じて適切なデータ構造を選択しましょう。
【永久保存版】laravelでファイルを新規作成する時はartisanコマンドを使おう

# 非常に便利だと感じたので記載
### コントローラー生成【make:controller】
```
php artisan make:controller [ファイル名]
おすすめ例）php artisan make:controller TestController --model Test
```
| オプション名 | 概要 |
|:-:|:-:|
|--api| コントローラーからcreate,editメソッドを除外する  |
|--model|  リソースコントローラーを生成する<br>（※モデルが存在しない場合生成するか選べる） |

### モデル生成【make:model】
```
php artisan make:model [ファイル名]
```
| オプション名 | 概要 |
|:-:|:-:|
|  -c | モデル用のコントローラーを生成  |

### リクエスト生成【make:request】
```
php artisan make:request [ファイル名]
```

### マイグレーションファイル生成【make:migration】
```
php artisan make:migration
おすすめ例）php artisan make:migration test --create test
```
| オプション名 | 概要 |
|:-:|:-:|
|  --create | 指定したテーブル名のマイグレーションファイルが作成される  |

### マイグレーションファイル読み込み【migrate】
```
php artisan migrate
```

### storageフォルダへのシンボリックリンクを作成する【storage:link】
```
php artisan storage:link
```
UATとは？テストを成功するための実施手順をご紹介

![UATとは？テストを成功するための実施手順をご紹介.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3544821/6f5a2c0d-bd86-f634-8074-1f7d4204b833.png)

<h2>初めに

UAT（User Acceptance Test）は、ソフトウェアが仕様要件を満たし、本番環境で問題なく動作するかを検証するテストです。システム開発にはコンポーネントテスト、結合テスト、システムテスト、受け入れテストの4段階があります。
受け入れテストの目的は、開発者側のテストをレビューするだけでなく、実際の利用環境で問題なく動作するか確認することです。システム完成から稼動までのスケジュールを立て、検証すべき機能の優先度を決める必要があります。本記事では、UATの特徴と実施手順を紹介します。

<h2>UATとは

UAT（User Acceptance Test）は、システムやソフトウェアがユーザーのニーズを満たしているか確認する受け入れテストです。顧客がシステムの要件やビジネスプロセス・バグをリリース前に確認します。
テストは計画、テスト環境の構築、テスト実施の流れで行われ、本番環境に近い環境で使用・検証するため、不具合を見つけやすいのが特徴です。自社でUATを行うノウハウがない場合は、第三者機関を利用すると信頼性の高い検証が可能です。

<h2>UATテストの種類

開発工程の最終段階で行うUAT（ユーザー受け入れテスト）は、ユーザーのニーズに沿った機能要件を検証するテストです。ソフトウェアの規模や特徴に応じてテスト手法が異なり、適切な手法を選ぶことが重要です。ここではUATの種類について説明します。

<h3>単体テスト 

モジュールごとの機能を確認し、不具合を早期に発見します。ソースコードやデータモデル、コンポーネント仕様を検証します。

<h3>結合テスト

単体テスト後に各モジュールを組み合わせて動作を確認します。データやモジュールのやり取りを検証し、システムの品質を確保します。

<h3>ブラックボックステスト

内部構造に注目せず、システムの入力と出力を検証します。ユーザー視点で行われ、第三者でも実行可能です。

<h3>システムテスト

本番環境での正しい動作を確認します。システム全体の性能や安定性を検証し、問題を早期に発見します。

<h3>回帰テスト

修正や変更後に既存機能への影響を確認します。新しい変更による影響を確認し、システムの品質を向上させます。

<h2>UATを実施する流れ

UATを実施する流れについて説明します。質の高いソフトウェアを提供するためには、優先的にテストすべき機能を絞ることが重要です。全ての機能をテストするのは時間がかかるため、特に仕様変更や重要な機能を優先します。

<h3>テスト計画の作成

最初にテスト対象のスケジュールや連絡ルートを整理し、テスト開始日と終了日、業務範囲を明確にします。重要な業務を優先的に決め、スムーズな実施を目指します。

<h3>環境の構築 

テストシナリオ作成に基づき、テスト環境を準備し事前確認を行います。本番と同じ環境で動作を検証し、管理表を用意してスムーズに作業を進めます。必要最低限のポイントに焦点を当てます。

<h3>テストの実施 

シナリオ通りにテストを実施し、バグや不具合を修正します。全てのシナリオを実行し、問題がなければテストは終了です。その後、システムをクライアントに引き渡します。重要度の高い機能からテストを行い、ソフトウェアの全体的な仕様を把握することが重要です。

<h2>まとめ

本記事では、UATの特徴と実施手順について詳しく説明しました。UATはユーザーが実際に近い環境でシステムを使用し、動作確認を行うテストです。ユーザー目線で業務観点の不具合を確認することで、開発者が見落とした問題を発見できます。ユーザーが満足するソフトウェアを提供するためには、テスト計画からシナリオ作成、テスト実施までの抜け漏れを防ぐことが重要です。リリース後の不具合を防ぐため、状況に合った方法でUATを実施しましょう。

詳しくは下記の記事もご参照ください。
➡ <a href="https://hblab.co.jp/blog/what-is-uat/">UATとは？テストを成功するための実施手順をご紹介</a>
はじめての \\あんけんめんだん//



今回は初めての現場案件面談についての感想をアウトプットします。
研修中に模擬面談はしましたが、実際の面談ってどんな感じなんだろう？って方向けにふわっとした表現で書いていこうかなと思います。

### 1.前提として
---<font color="Red">対面 or Web</font>---
実際に案件先の方とお会いして面談する方法と、Web面談(オンライン)での面談があります。
今回は私が経験したWeb面談について書いていこうと思います。
今後「初めての面談で緊張するな...」って方の助けになれば幸いです。

※一般的な「面接」と今回の「面談」は似て非なるものです。
　堅苦しい「面接」とラフな「面談」の違いを書いていきます。

### 2.緊張の10分前...
---<font color="Blue">リラックスして大丈夫！</font>:clap:---
結論から言ってしまえば大したことないです。
決して調子こいてるとかではなく、単純に緊張しすぎなくても大丈夫。

基本的にみなさま「面接」を受けたことがあると思います。私も何度も受けました。
「面接」前に何度も質疑応答の練習をして、あいさつや返事ははっきりと！を意識して
にこやかな印象を意識して、志望動機はうんたら自己PRはかんたら...
練習めっちゃしたのに本番では全部忘れて頭真っ白になったりして...:scream:
などを経験したと思います。

#### 「面談」はそんな堅苦しくないです！！
案件先や営業の方、そのほか何名かで今回面談を受けさせていただきましたが、基本は
面接のような堅苦しい内容ではなく
##### 「自己紹介」「案件説明」「質問タイム」
という感じでした。
面談によっては内容の前後や差異はあるかもしれませんが面接よりよっぽど楽です。:hugging:
基本的には社交性の部分を見て、技術に関しては参画してからといった印象でした。
コミュニケーションが取れる、これが大事だなと感じます。


### 3.まとめ
---<font color="green">ド緊張しなくていい！！</font>---
所属企業によってそれぞれ規定などがあるので一概には言えないかもしれませんが
「面接」と違って「落ちたら無職」って話ではないのでラフな気持ちでいいと思います。
**真剣に取り組む**という気概は**絶対に必要**なので、そこははき違えないように！！

### 落ちても面談をした経験は次に活きる！！:ok_hand:
【永久保存版】MySQLをコマンドで操作する。

# はじめに
データベース操作をIDEやA5M2といったアプリケーションはデータベース参照には便利だが、DB作成等の高度な処理には限界があると感じたため、コマンドで操作できるようにメモ書きする。

## DBにログイン
```
mysql -u [ユーザ名] -p
```
| オプション名 | 概要 |
|:-:|:-:|
| -h  | ホスト名を指定  |
| -u  | ユーザ名を指定  |
| -p  | パスワードを指定  |
| -D  | 使用するDBを指定  |

## データベース一覧を表示
```
SHOW DATABASES;
```

## データベース作成
```
CREATE DATABASE [データベース名];
```

## データベース削除
```
DROP DATABASE [データベース名];
```

## データベース選択
```
USE [データベース名];
```

## テーブル一覧を表示
```
SHOW TABLES;
```

## テーブル作成
```
CREATE TABLE [テーブル名] (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id)) DEFAULT CHARSET=utf8;
```

## テーブル削除
```
DROP TABLE [テーブル名];
```

## テーブル構造確認
```
DESCRIBE [テーブル名];
```

## カラム定義を変更
```
ALTER TABLE [テーブル名] modify [カラム名] varchar(256) NOT NULL DEFAULT 'test';
```

## データベースのダンプを取得する
```
mysqldump -h localhost -u root -p[パスワード] [データベース名] > [ダンプファイル名].sql;
（※ダンプファイル出力先はカレントディレクトリになります。
```

## ダンプをリストアする
```
$ mysql -h localhost -u root -p[パスワード]

$ CREATE DATABASE [リストア先データベース]

$ USE [リストア先データベース]

$ source [ダンプファイル保存先の絶対パス]
例）source /User/user/dump.sql
```
スーパーマーケットの陳列って誰でもできる

![スーパーマーケットの陳列って.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727864/400abe41-31bf-d173-5dea-069c34663666.png)

## 労働力の多様性
多様な働き方が出来るようになった近頃、労働力確保も多様化しています。
スーパーマーケットで人事関係の役割を担っています、kon66です。

### スキマバイトの働き方:eye:
最近は、「スキマバイト」って言葉をよく耳にしませんか。
ＣＭでも流れています。

https://newsdig.tbs.co.jp/articles/-/1039342?display=1

私たち小売業においては、レジなどは機械化が進んでいますが、まだまだ手作業（＝人に頼る）仕事が沢山あります。

その一つに陳列業務があります。
通常は、店が混雑していない時間を設定し、商品の入荷・陳列が行われています。多くの店は、開店前や閉店近くの時間帯に設定しています。

### 商品を並べるのは手作業:pensive:
しかしながら、ここ最近は、人員確保に苦労することが多く、各お店は頭を抱えています。品物が並ばなければ、店は成り立ちません。
そこで、登場したのが、前述の「スキマバイト」。`Uber`のスキームをヒントに、発展してきました。

![ゴンドラ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727864/78c364fc-9297-9807-64a2-51e8b082fe6a.png)


## 並べるだけなら誰でもできる❓
スーパーマーケットの棚に商品を**並べるだけなら簡単**って思うかもしれませんが、これが意外と**難しい**。
はじめてだとなおさらです。💦
何万点の沢山の商品が並べられている店内で商品を探すのもひと苦労です。**誰でも出来そうに見えても難しいんです**。

### 置き場所は明確:smiley:
陳列するには、住所（＝宛先）が分れば届けやすいですよね。そこで、今回は、商品レイアウトマスターを作成し、`バーコード`で検索、陳列場所を指示するアプリにトライしました。

### フローはシンプルです。
![スクリーンショット (52).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727864/109880be-52ea-7041-92b2-5fbd18f3c577.png)

`AppSheet`で、パパっと作りました。商品レイアウトマスターの登録は、現場の棚からスキャンして作成。１ゴンドラの登録に１０分程度の時間がかかりました。
![スクリーンショット (53).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727864/66258ed8-407f-080e-f2e3-6e125ef7c553.png)


### 使用者の想定:point_up_2:
1. スキマバイトで当日はじめて陳列作業をするアルバイトさん
2. 一人作業
3. おおよその通路への仕分けを行ったの後、各アルバイトさんが店内に向けてフライトする。
4. 陳列情報供給は、タブレットから収集

## 検証
パパっと出来た、アプリをもって、お店でお菓子を管轄をしている**Ｋさん**に披露。
同じ部署や店で仕事をしたことはないですが、店の状況など情報収集には頼りになる存在です。
反応は上々です。バーコードの読み取り速度に驚き。
今までは、私が店舗に出向く時は、人員体制の相談でしたので、本音は、「アプリより増員してくれ」って感じですが、アプリには、まずまずの反応。

### フィードバックたっぷり:sweat_drops:
:::note warn
指摘1
住所が数字ので示してあるけど、わかりづらいのでビジュアル化して欲しい。
:::
:::note warn
指摘2
商品登録をもっと楽にして欲しい。手打ち作業を無くして欲しい。
:::
:::note warn
指摘3
商品在庫情報や２か所陳列のアラートがあればいい。
:::

### ビジュアル化:sweat_drops:
マップ機能を追加すればいいのかって思いながら、トボトボと帰りましたが、店舗独自のレイアウトマップが必要になる。しかし、通路番号の情報は、店内にあるので、長くつながっているゴンドラのどの辺？が分れば、商品の近くに行けるはず。

### 商品登録はOCR機能で:desktop:
棚全体の写真から一気に登録が出来れば、もっと早くすることが出来るが、ハードルが高い(-_-;)
でも、ここはイチバン解決しないとならない問題だと思います。これこそ、パパっとがイイです。

### 商品マスターとの連携:robot:
セキュリティーは置いておいて、情報収集先の連携は可能性がありそうだが、更にハードルが高い:joy:

## プロトタイプ作成:rocket:
スタートラインに立ったって感じです。
オペレーションは、このような感じです。
場所がわからない商品の`バーコード`をスキャンすると、通路・棚・段数・フェイス数を表示し、探す時間を短縮したり、
そもそも新規商品で棚に無い未登録の商品を抽出できます。

https://x.com/gonchichi21/status/1798899332282007749

## AppSheetの可能性:writing_hand:
まだまだ、ホンのさわりでしたが、AppSheetの可能性を感じた取り組みでした。もっと活用方法を高めていくといろいろな取り組みが出来そうな予感です。GooleWorkSpaceの環境下で使えることも広げやすいツールだと思います。

## スキマ時間に「パパっと仕事にきて、パパっと仕事して」:grinning:
気軽に仕事できる環境もアリかもしれません。スーパーマーケットで陳列バイトしたら、新たな商品に出会い、「今度、買ってみよう」なんて思ってもらえたら、みんながハッピーになる気がします。