OmniAICreator/Qiita-1.07M huggingface dataset:
通常の投稿とカスタム投稿を一緒に一覧表示させる

お疲れ様です。今回はタイトル度通りのコードを紹介です。それもただの一覧ではなく、さらにタグで絞った一覧を表示させます。
先にコードから。
```php
<?php
$args = array(
  'post_type' =>  ['custom_post_', 'post'],
  'posts_per_page' => -1,
  'category__in' => array(1, 2), // こちらでカテゴリー別で分ける
  'tag__in' => array( 1, 6 ),    // こちらでタグ別で分ける
  'tax_query' => array(
    'relation' => 'OR',
    array(
      'taxonomy' => 'movie',
      'terms' => 'action',
      'field' => 'slug'
    ),
  ),
));
$the_query = new WP_Query($args);
if ($the_query->have_posts()) :
  while ($the_query->have_posts()) : $the_query->the_post();
    //　やりたいことを書く

  endwhile;
endif;
wp_reset_postdata();
?>
```
通常の投稿をさらに分けるには、`category__in`でカテゴリー別、`tag__in`でタグ別で分けます。

普通の投稿とカスタム投稿を混ぜた一覧なら、サンプルコードはたくさんありました。今回は、さらに通常の投稿をタグで絞り分けられた一覧表示をしたかったのですが、なかなかそのようなコードは見つからず、うまくいきませんでした。なので、自分で色々試行錯誤した結果、上記のコードを見つけました。
自分で見つけたコードなので、もしもっと良い方法がありましたら、ご教授くださいm(_ _)m
コンパイルとビルド

今回はコンパイルとビルトについてみていきたいと思います。
以下はJavaを例として作成してあります。

## コンパイルとは
![スクリーンショット 2023-04-15 17.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684074/e9d014d2-3af5-009e-b7fb-ea88b066cc7d.png)

コンパイルは、プログラムのソースコードをマシン語（.class File）に変換するプロセスです。コンパイルによって、ソースコードは機械語に変換され、その結果として、プログラムが実行可能な*バイナリファイル*になります。コンパイルプロセスは、コンパイラと呼ばれる専用のソフトウェアによって行われます。


## ビルドとは
![スクリーンショット 2023-04-15 17.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684074/59585913-a958-2470-66b8-e9e51265e4fe.png)

一方、ビルドは、プログラムを実行するために必要なすべてのコンポーネントを取り込むプロセスです。ビルドには、コンパイル、リンク、およびその他のタスクが含まれます。ビルドプロセスは、コンパイル、リンク、およびその他のタスクを実行するためにビルドツールと呼ばれる専用のソフトウェアによって実行されます。

例）Ant、Maven、Gradleがあります。

## 結果
つまり、コンパイルはソースコードを機械語（.class）に変換するプロセスであり、ビルドはプログラムを実行するために必要なすべてのコンポーネントを取り込むプロセスです。ビルドにはコンパイルが含まれますが、ビルドプロセスは、プログラムを実行するために必要なすべてのタスクを実行するために使用されます。
Powershell で .NET CLI のメッセージが文字化けする場合の対処

# はじめに

ググってもズバリの内容が出てこなくて、関係するところをいろいろ調べていた結果ようやく表示することができたので、同じ事象で困る人のために記載しておきます。

# 前提
- dotnet コマンドの出力で日本語が文字化け(?表示)になる。

# チェックするポイント
- `chcp 65001` を実行する(dotnet コマンドの出力はUTF-8のため)
- Windowsの設定アプリから、[時刻と言語(Time & Language)] - [言語と地域(Language & Region)] - [管理用の言語の設定(Administrative language settings)] を選択し、[システム ロケールの変更(Change system locale)] で、[ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(Beta: Use Unicode UTF-8 for worldwide language support)] にチェック

前者はググるとすぐ出てくるのですが、後者が全然ヒットしなかったのが本記事を書いた要因です。
新卒エンジニアのIT用語その1

# 初めに

23年新卒の駆け出しエンジニアです。

この記事は学んだIT用語について簡単にまとめ、本で学んだ内容を要約（アウトプット）することを目的としています。

間違っていることがあれば教えていただけると幸いです。


### 参考図書

https://www.shoeisha.co.jp/book/detail/9784798160016

#### ニュースがわかる用語

AI...学習によって進化するソフトウェア・コンピュータ

ロボット...決められた動作をする装置

RPA(Robotic Process Automation)... 事務などの決まった作業の自動化（アプリケーションを横断して自動化可能）

マクロ...作業の自動化(単一のアプリケーションのみ)

IoT（Internet of Things）...機器がインターネットにつながること

ビッグデータ...巨大で複雑なデータ

フィンテック...金融(finance)と技術(technology)を合わせた造語　金融サービスと情報技術を組み合わせたもの

ブロックチェーン...取引データをブロックにまとめ、鎖でつながるように保存したもの

仮想通貨...暗号技術で実現した、電子データで管理される通貨(暗号資産)

ドローン...遠隔操作が可能な小型の飛行物体

シェアリングエコノミー...他人と共有して資産を使うこと

アジャイル...フィードバックを貰いながら何度も作り直す手法

ウォーターフォール...工程を一つずつ終わらせ、戻らない手法

シンギュラリティ...AIが人を超えること(怖いです)

VR(Virtual Reality)...仮想現実

AR(Argument Reality)...拡張現実 コンピュータで現実のものに情報を与える

MR(Mixed Reality)...複合現実 現実を主に、投影されるのは仮想空間

ロングテール...あまり売れない商品も在庫を確保する戦略

機械学習...コンピュータ自身が学習する手法

ディープラーニング...人の脳を模倣したニューラルネットワークを複数使った機械学習の手法の一つ

POS（ポス）...売れた商品の情報を集計、分析するシステム

テレワーク...場所にとらわれず働くこと

BYOD(Bring your own device)...仕事に個人のデバイスを使うこと

シャドーIT...会社が把握していない従業員のIT利用

QRコード...二次元バーコード

テザリング...ある端末を利用して他の端末をインターネットに接続すること

ローミング...他の通信事業者でインターネットに接続すること

ベストエフォート...通信の最大速度

ストリーミング...ダウンロードしながら再生すること

ウェアラブル...端末を持ち運びではなく、身に着けること

データセンター...データを管理するのに特化した建物

仮想化...ハードウェアの機能をソフトウェアで実現すること

SCM(Supply Chain Management)...物を調達する際の一連のプロセスを
　　　　　　　　　　　　　　　　　まとめて管理すること

システムインテグレーター...構築から運用まで請け負う会社(SIer)

内部統制...組織内部の業務が適切かチェック

ユニバーサルデザイン...世界中の誰であっても利用可能なデザイン

オープンデータ...誰でも自由に使えるデータ

メインフレーム...大型のコンピュータ

GPS(Global Positioning System)...地球上のどこにいても位置情報を取得できるシステム

オフショア...コスト削減のために海外に拠点を移すこと


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

まとめるの難しいです！！

読みにくくなってしまう！！！
Dockerのチュートリアルをやってみる(はじめだけ)

# はじめに

Dockerをちゃんと触ったことがないので、[Dockerのチュートリアル](https://docs.docker.jp/get-started/toc.html)をやってみた。
ちなみに、環境はWindows 11
とりあえず、チュートリアルのJavaScriptを変更する前まで。

# インストール

[Windows に Docker Desktop をインストール](https://docs.docker.jp/desktop/install/windows-install.html)を見ながら実施。
Windows側の要件はすでに満たしていたので、Docker Desktopをインストールして終了。
Docker Desktopを起動したら何かエラーが出たが、OS再起動で回避。

# チュートリアルを始める
 
```
docker run -d -p 80:80 docker/getting-started
```
を実行したがApacheを起動していたので、80ポートがかぶってしまう。
なので、Apacheを止めて再度実行
ブラウザから、http://localhost にアクセスすると以下のように、英語のチュートリアルが表示された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/08a9d033-20e5-c67e-02dd-4fa9672408d7.png)

次にチュートリアルに従い、getting-started リポジトリ　を取得。
Zipでダウンロードしてもgit cloneでもOK。
私はc:\dat\dev\dockerにリポジトリから取得したものを入れています。
なので、上記のディレクトリにgitから取得したものを入れている。
実は、ちょっと勘違いがあってうまくいかないことがあって、git cloneでやり直している。
(勘違いは後述)

```
git clone https://github.com/docker/getting-started.git
```

その後、Dockerfile を作ります。
これは
gitから持ってきたリポジトリの中のappディレクトリ直下に作成します。
内容はチュートリアルの内容をコピペ

```dockerfile:Dockerfile
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
```

ここでビルドします。
ビルドはappディレクトリで行います。
私の環境でいうと
C:\data\dev\docker\getting-started\app

```
docker build -t getting-started .
```

ビルドが成功したら、そのままdocker runを実行

```
docker run -dp 3000:3000 getting-started
```

これでブラウザから以下のURLを開いてページが出れば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/6d525083-3eef-1b24-720b-75f175ce5feb.png)


間違って
C:\data\dev\docker\getting-started
でビルドして、docker runすると、チュートリアルのページが表示されるので注意。

というのも実は、やらかしてしまってました。
getting-startedがプロジェクト的なもので、ビルドはプロジェクトのルートなのかなと変に勘ぐってしまった結果ですｗ
(ダサすぎたｗ)

#最後に
自分がやらかしたので、戒めを込めて書きました。
まぁ、こんな凡ミスする人はあまりいないと思いますが・・・ｗ

さて、もう少しチュートリアルやって、Laravelの環境をDockerで作れるように調べよう
Ubuntuに任意のバージョンのNode.jsをインストールする

aptをアップデート
```
sudo apt update
```

aptでnodeとnpmをインストール
```
sudo apt install nodejs npm
```
nをインストールする（nodeのバージョンを切り替えられるパッケージ）
```
sudo npm install -g n
```

nodeの最新版を入れる
```
sudo n latest
```

`node -v`で最新版がインストールできていることを確認する
Node.js+Express+mySQLを使用してログイン・パスワード認証する

Node.js+Expressを使用し、mySQLのDBに格納されているログイン・パスワードを認証するJavaScriptコードを掲載します。

【前提バージョン】
```
・Windows 11
・Node.js 18.12.1
・Express 4.16.1
・mysql2@3.2.1
・mySQL 8.0.32
```
【ソースコード：server.js】
```
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const mysql = require("mysql2/promise");

const app = express();

const sess = {
  secret: 'secretsecretsecret',
  cookie: { maxAge: 60000 },
  resave: false,
  saveUninitialized: false,
}

if (app.get('env') === 'production') {
  app.set('trust proxy', 1)
  sess.cookie.secure = true
}

app.use(session(sess))

app.use(bodyParser.urlencoded({ extended: true }));

app.get('/login', (req, res) => {
  res
    .type('text/html')
    .send(
      `<form method="POST" action="/login">
         <div>username<input type="text" name="username"></div>
         <div>password<input type="password" name="password"></div>
         <div><input type="submit" name="login"></div>
       </form>`
    )
});

app.post('/login', (req, res) => {
  const username = req.body.username;
  const password = req.body.password;

  (async () => {
    try {

        //内容は各自の環境に合わせて変える
        const con = await mysql.createConnection({
            host: "localhost",
            user: "root",
            password: "root00",
            database: "mydb"
        });

        const [rows, fields] = await con.query("select * from customer where login=? and password=?",[username, password]);
        if (rows.length <= 0) {
            console.log('sql fail!');
            await con.end();
            res.redirect('/login')
        }
        else {
            console.log('sql successfull!');
            await con.end();
            req.session.loggedin = true;
            req.session.username = username;
            res.redirect('/');
        }
    } catch (e) {
        console.log(e);
    }

  })();

});

app.get('/logout', (req, res) => {
  console.log('logout');
  req.session.destroy((err) => {
    res.redirect('/login');
  });
});

app.use((req, res, next) => {
  if (req.session.username) {
    next();
  } else {
    res.redirect('/login');
  }
});

app.get('/', (req, res) => {
  res
  .type('text/html')
  .send(
    'Hello ' + req.session.username+'<br>'
    +'<a href=\'/logout\'>logout</a>'
  );
});

app.listen('3000', () => {
  console.log('Application started');
});
```
【server.jsの起動の仕方】
```
node server.js
```

【初期ページの閲覧方法】
```
http://localhost:3000/
```

以上、誰かのお役に立てれば幸いです。
Windows PowerShell（PS） のバージョン確認方法

# 環境
・windows11 home
・Windows PowerShell 7.3.3

# 確認
・Windows PowerShell（略：PS）のコンソールを起動。
・`$PSVersionTable` コマンドでバージョン表示。`PSVersion`の欄。
この例では、7.3.3

```powershell
PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.3.3
PSEdition                      Core
GitCommitId                    7.3.3
OS                             Microsoft Windows 10.0.22621
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```
golangでDockerを起動するとexit status 128のエラーが出る


Go言語のimageを使用したコンテナを起動する際にエラーが出た。

docker composeコマンドを使用した時に下記のエラーが出た。
```
error obtaining VCS status: exit status 128
  Use -buildvcs=false to disable VCS stamping.
```

Dockerfileのイメージをalpineに変更
```diff
-FROM golang:1.20 AS builder
+FROM golang:1.20.3-alpine
```

これでエラーが消えた。
参考までに
Httpie: GitHub で GraphQL を使う

こちらのプログラムを Httpie で書き換えました。
[Curl: GitHub で GraphQL を使う](https://qiita.com/ekzemplaro/items/35f37293cc49cdb09587)

## プログラム

```bash:http_name.sh
#! /bin/bash
#
#	http_name.sh
#
#							   Apr/15/2022
# 
ACCESS_TOKEN="ghp_*********"
#
URL="https://api.github.com/graphql"
#
http POST ${URL} "Authorization: Bearer "${ACCESS_TOKEN} @query.json
#
```

```json:query.json
{
 "query": "query { user(login: \"ekzemplaro\") {name location url}}"
}
```

## 実行結果

```text
$ ./http_name.sh 
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
Content-Encoding: gzip
Content-Security-Policy: default-src 'none'
Content-Type: application/json; charset=utf-8
Date: Sat, 15 Apr 2023 07:59:23 GMT
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Server: GitHub.com
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Transfer-Encoding: chunked
Vary: Accept-Encoding, Accept, X-Requested-With
X-Accepted-OAuth-Scopes: repo
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-GitHub-Media-Type: github.v4
X-GitHub-Request-Id: B3C2:17B3:23AEA8:267D93:643A595A
X-OAuth-Scopes: admin:org, admin:public_key, delete:packages, repo, workflow, write:packages
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4996
X-RateLimit-Reset: 1681548817
X-RateLimit-Resource: graphql
X-RateLimit-Used: 4
X-XSS-Protection: 0
github-authentication-token-expiration: 2023-04-25 04:59:46 UTC

{
    "data": {
        "user": {
            "location": "Tochigi,Japan",
            "name": "Uchida Masatomo",
            "url": "https://github.com/ekzemplaro"
        }
    }
}
```

## 確認したバージョン

```text
$ http --version
3.2.1
```
Miracle LinuxでIP Messengerを利用できるようする

本記事はMiracle LinuxでIP Messengerを利用したい方向けに作成しています。

IP MessengerはWindows向けに開発されたメッセンジャーソフトです。通常のテキストメッセージはもちろん、wordやpdfといったドキュメントファイルのやり取りも同じネットワーク上のPC間でできます。今回はこの万能なIP Messengerを、Miracle Linuxで利用できるようにしていきたいと思います。Miracle Linux以外にもRockyやAlmaなどのRHELクローンで、IP Messengerを利用したいという方の一助になれば幸いです。

大まかな作業としては以下の2つになります。
* Linux上でWindowsソフトを動かすためのWineのビルド
* IP Messengerの導入

# 環境情報
*  MIRACLE LINUX release 8.7 
*  Wineバージョン 7.0

# Wineをビルドするためのツールをインストール
```
$ sudo yum -y install make gcc
$ sudo yum install -y samba-winbind-clients
$ sudo yum groupinstall 'Development Tools' -y
$ sudo yum install -y libxslt-devel libpng-devel libX11-devel zlib-devel libtiff-devel freetype-devel libxcb-devel  libxml2-devel libgcrypt-devel dbus-devel libjpeg-turbo-devel  fontconfig-devel gnutls-devel gstreamer1-devel libXcursor-devel libXi-devel libXrandr-devel libXfixes-devel libXinerama-devel libXcomposite-devel mesa-libOSMesa-devel libpcap-devel libusb-devel libv4l-devel libgphoto2-devel gstreamer1-devel libgudev SDL2-devel gsm-devel libvkd3d-devel libudev-devel wget
$ sudo yum install -y glibc-devel.{i686,x86_64} libgcc.{i686,x86_64} libX11-devel.{i686,x86_64} freetype-devel.{i686,x86_64} gnutls-devel.{i686,x86_64} libxml2-devel.{i686,x86_64} libjpeg-turbo-devel.{i686,x86_64} libpng-devel.{i686,x86_64} libXrender-devel.{i686,x86_64} alsa-lib-devel.{i686,x86_64}
```

# Wineのソースをダウンロードして展開
今回は7.0を使用しています。

```
$ cd /usr/src
$ sudo wget https://dl.winehq.org/wine/source/7.0/wine-7.0.tar.xz
$ sudo tar xvf wine-*.tar.xz
```

# Wineソースをビルド

```
$ cd wine-*/
$ sudo mkdir -p wine32 wine64

64ビット版をビルド
$ cd wine64/
$ sudo ../configure --enable-win64
$ sudo make

32ビット版をビルド
$ cd ../wine32
$ sudo ../configure --with-wine64=../wine64
$ sudo make

32ビット版をインストール
$ sudo make install

64ビット版をインストール
$ cd ../wine64/
$ sudo make install
```

# Wineがインストールされたことを確認

```
$ winecfg
```

# 任意のディレクトリにIP Messengerをダウンロード

```
$ wget https://dforest.watch.impress.co.jp/library/i/ipmsg/10659/ipmsg5.6.1_installer.exe
```
# wineコマンドでIP Messengerをインストール

```
$ wine ipmsg5.6.1_installer.exe
```
[備忘録]　スペクトルデータの前処理

# はじめに

前の記事で{pls}のgasolineデータを使って多変量解析をやったみたので、今回はNIRスペクトルデータの前処理として、Standard Normal Variate (SNV)、Savitzky-Golay Filterによる平滑化(smoothing)および微分処理をやってみる。

https://qiita.com/MOONDAD/items/a1873008a46c2139adec


# SNV

SNV処理では、１本のスペクトルにおいて平均を0、分散を1にする処理で以下の式で表すことができる。

```math
SNV = \frac{(\mu - \bar\mu)}{\sigma}
```

$\mu$は平均、$\sigma$は標準偏差を示す。SNV処理は、スペクトル間でのベースラインの変動の影響を最小化するためによく利用される前処理の１つ。Rでは、{base}のscale()関数を利用してSNV処理することができる。なお、scale()関数では列方向のデータに対してSNV処理がされ、行方向に出力されることに注意する。

試しに{pls}パッケージのgasolineデータのNIRスペクトルデータを使ってSNV処理をしてプロットしてみる。

``` snv.R
library(pls)
NIR_snv <- scale(t(gasoline$NIR), center = T, scale = T)

wl <- seq(900, 1700, 2)
par(mfrow = c(2, 1), mar = c(4,4,1,1))
matplot(wl, t(gasoline$NIR), type = 'l', lty = 1, col = rainbow(60), xlab = 'Wavelength, nm', ylab = 'Intensity, Raw')
matplot(wl, NIR_snv, type = 'l', lty = 1, col = rainbow(60), xlab = 'Wavelength, nm', ylab = 'Intensity, SNV')
```

![Rplot_snv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983468/b496cc48-d48b-ed5e-4c9c-b2c12059d310.png)

元のデータにおけるベースラインの差があまりないのでそれほど大きな変化は見られないがスペクトル間のベースラインがより揃っていることがわかる。


# Savitzky-Golay Filterによる平滑化および微分処理

平滑化および微分処理することにより、スペクトル同士の細かな差異（ノイズ）の影響を低減することができる。また、微分処理ではスペクトルの中で変動が大きい特徴的な領域を強調したり、また、ベースラインを0に近づけることができる。

NIRやラマン、テラヘルツスペクトルなどのスペクトルは複雑な形状であるため、１本のスペクトル全体を１つの近似式で表現して微分することは現実的ではなく、その代わりにSavitzky-Golay Filterを使って微分処理をすることが多い。Savitzky-Golay Filterでは、スペクトル上の目的とする変数の前後何点かをとり、それに対する多項式近似式を求めてそれを微分することで目的とする変数の微分値を求める方法である。Rでは、{signal}パッケージのsgolayfilt()関数で実装されており、ハイパーパラメータ（関数の引数）は、微分の次数（m）、多項式近似式の次数（p）、近似に使用するデータ数（n）である。微分の次数を0とすることで平滑化処理することができる。nは、目的とする変数に対して前後同じ数の値をとった際の合計の数になるため$2n+1$ということで奇数になる。

SNVの時と同様にgasolineデータのNIRスペクトルデータを{signal}パッケージのsgolayfilt()関数を使って平滑化および微分処理を行い、プロットしてみる。sgolayfilt()関数は、データフレームを与えると1つのベクトルとして結果出力されてしまうため、appy()関数を使って、スペクトルごとに処理する。

``` SG.R
library(signal)

NIR_sg0 <- apply(gasoline$NIR, 1, sgolayfilt, p = 3, n = 11, m = 0)
NIR_sg1 <- apply(gasoline$NIR, 1, sgolayfilt, p = 3, n = 11, m = 1)
NIR_sg2 <- apply(gasoline$NIR, 1, sgolayfilt, p = 3, n = 11, m = 2)

par(mfrow = c(3, 1), mar = c(4,4,1,1))
matplot(wl, NIR_sg0, type = 'l', lty = 1, col = rainbow(60), xlab = 'Wavelength, nm', ylab = 'Intensity, sg0')
matplot(wl, NIR_sg1, type = 'l', lty = 1, col = rainbow(60), xlab = 'Wavelength, nm', ylab = 'Intensity, sg1')
matplot(wl, NIR_sg2, type = 'l', lty = 1, col = rainbow(60), xlab = 'Wavelength, nm', ylab = 'Intensity, sg2')
```

![Rplot_sg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983468/e5d1b407-28a1-75ca-f7de-d3a5370a4273.png)

# まとめ

今回は、スペクトルデータの前処理としてSNV処理と平滑化および微分処理をやってみた。実際に回帰モデルをつくるときには、SNVと平滑化、微分処理を組み合わせたり、Savitzky-Golay Filterのパラメータのチューニングなどをする必要がある。
v-bindの使い方（vue.js）

## 初めに
vue.jsのv-bindを使用して実装したので備忘録として残します。

__v-bind__ のポイントは、__一方通行__。
値を一方通行に渡すことができる機能です。
（vue側からHTML側の一方通行）

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__ | 8.2.3 |
| __vue.js__ | 3.2.47 |

## 実装
利用停止ボタンを実装しました。
Controller側から持ってきたデータが
　　　存在する場合は、ボタン押下可能、
　　　存在しない場合は、ボタン押下不可にします。

```php:HomeController.php
// ... 略

public function index(Request $request)
{
    // ... 略

    // 配列に格納する
    $param = [
        'set_info' => '渡したい値',
    ];

    return view('home')->with($param);
}
```

```php:home.blade.php
<div id="set-form">
    <component_a :already_set_info="{{ json_encode($set_info) }}"></component_a>
</div>
```

渡された値（set_info）が存在するかどうか判別した後に、disableのbooleanを設定します。
```vuejs:ConponentA.vue
<template>
    // ... 略

    <button
        type="button"
        class="btn btn-danger stop-button"
        v-bind:disabled="is_disabled"
    >
        <div class="body">利用停止する</div>
    </button>
</template>

<script>
    export default {
        props: ['already_set_info'],
        data() {
            return {
                is_disabled: true,
            };
        },
        mounted: function() {
            // 渡された情報が存在する場合
            if(this.already_set_info) {
                    this.is_disabled = false;
                }
            }
        },
    };
</script>
```
値の渡し方がわからなかった方は、こちらの記事にて解説しております。

https://qiita.com/fuku_rin/items/d307265512d405d0998d

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
Quarkus(Kotlin)で@ConfigPropertyを使って設定の読み込みができない

# はじめに

Quarkus(Kotlin)で`.properties`から値を読み取ろうとしたところうまくいかずに苦戦したのでまとめます

# 問題

以下を参考に`application.properties`の値を読み取ろうとしました

```properties:resurces/application.properties
api.host = localhost
api.port = 8000
```

```kotlin:UserApiDriver.kt
@ApplicationScoped
class UserApiDriver() {

    @ConfigProperty(name = "api.host", defaultValue = "localhost")
    private lateinit var host: String;

    @ConfigProperty(name = "api.port", defaultValue = "8080")
    private lateinit var port: String;
    

    private val baseUrl = "http://${host}:${port}"
```

しかしこれでは読み込みが行われませんでした

# 解決方法

Kotlinの場合、コンストラクターでインジェクションする必要がありました
(Kotlinではそれを推奨しているそうです)

```kotlin:UserApiDriver.kt
@ApplicationScoped
class UserApiDriver(
    @ConfigProperty(name = "api.host", defaultValue = "localhost") private val host: String,
    @ConfigProperty(name = "api.port", defaultValue = "8000") private val port: String
) {

    private val baseUrl = "http://${host}:${port}"

(省略)

```

# おわりに

ネットにほとんど情報がないなかで苦戦しましたがうまく行きました
いままではSpringでKonfigなどを使って読み込んでいましたが、デフォルト値が設定できないのでdotenv使ったりと議論することがありましたが、Quarkusはデフォルトが設定できるのでとても良いなと思いました


# 参考

https://ja.quarkus.io/guides/config-reference
laravel php で File not found. エラー

結論、nginxの書き方が間違っていた。
以下で、動作確認。

```default.conf
server {
    server_name your.club;

root  /var/www/html/your.club/public;
index index.php index.html index.htm;

location / {
       try_files $uri $uri/ /index.php$is_args$args;
}



location ~ \.php$ {

  fastcgi_max_temp_file_size 0;
  fastcgi_buffer_size 4K;
  fastcgi_buffers 64 4k;

  fastcgi_connect_timeout 300;
  fastcgi_read_timeout    300;


  fastcgi_pass unix:/var/run/php-fpm.sock;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
}




}

```

今回は、 laravel10をインスコ時に`File not found.`エラーが発生。
ブラウザにアクセスしても上記の文章のみで動かないのだ。

そこで、エラーの切り分け。


# index.html なら見れるか？

以下のフォルダに hoge.html を置いて、見れるか？

```
/var/www/html/your.club/public;
```

# では、index.phpを置いてみたら？

```index.php

echo "hogehoge";

```

に書き換えてみる。

見れない。`File not found.`エラー。


# ログ確認

php-fpm
nginx
```
tail /var/log/php-fpm/error.log
tail /var/log/nginx/error.log
```

# php設定確認

```
vim /etc/php-fpm.d/www.conf
```

# 再起動

```
sudo systemctl restart nginx
sudo systemctl restart php-fpm
```

って感じでデバッグしていく。
東京大学のAWS handsonがいい感じだった

# はじめに
クラウドを勉強しなきゃな〜、クラウドを用いたWebアプリケーションを作りたいな〜と思ったことはありますか？
令和の時代に生活している皆さんなら誰もが思うことだと思います。
そういった時にとりあえず手を動かしながら感覚を身につけたいと思いますよね。
そこで、東京大学の講義資料である『[コードで学ぶAWS入門](https://tomomano.github.io/learn-aws-by-coding/)』がかなり良かったので紹介します。

:::note warn
注意
このブログの筆者は大学生の小童ですのでお手柔らかに読んでください。
:::


https://tomomano.github.io/learn-aws-by-coding/

https://github.com/tomomano/learn-aws-by-coding

:::note warn
本もあります
自分は見てないですが、本もあるので紙媒体が良い人はこちらの方をお勧めします。
:::

https://www.amazon.co.jp/dp/4839977607/



# TL; DR
- 東京大学の良き講義資料が無料で見れるらしい
- 講義の概要、感想をまとめた
- これから進める人用に詰まったところをまとめた




# 目次
- はじめに
- TL; DR
- 講義の概要
    - 講義のいいとこ
    - 何ができるようになるか
    - 受けた方が良さそうな人
- 進めていく上で詰まったポイント
    - Hands-on2でインスタンスの上限申請を拒否されてキレた話
    - s3で若干詰まった話
- さいごに

# 講義の概要

まず初めに、この本は基本的にhandsonで構成されてます。
この本の何が良いって、理論に関して少し触れた時に、
> くどくど言ってもわからないと思うので、動かしながら確認しましょう

とすぐに実践に入ります。
なので、理論をしっかり学びたい、資格勉強のために勉強したいと言う方には向いていないかもしれません。

::: note info　
向いていないと書いたけど、、、
資格勉強の際でも、手を動かしながら学んだ後の座学はより頭に入ってくると思うので、個人的にはおすすめです
:::

講義の流れは簡単に言うと以下のようになっています。
1. クラウド、AWSとは
1. EC2を起動してみよう
1. AWSで機械学習をやってみよう
1. Dockerとは
1. AWSで機械学習をやってみよう2
1. サーバーレスアーキテクチャを使ってWebサービスを作ってみよう

と言う感じです。
だいぶざっくりまとめたので、気になる人は本物をみてくださいね。
ぱっと見長そうですが、時間がある人なら一週間もかからないと思います。

https://tomomano.github.io/learn-aws-by-coding/

## 講義のいいとこ
- とにかく手を動かす
- 環境構築の説明が非常に丁寧
- とにかく手を動かす
- 初心者でもついていける
- とにかく手を動かす

## 何ができるようになるか
なんとなく、クラウドを使ってできることや動かし方を理解できます。
あと、よく見る下図のような図の雰囲気を理解できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1343890/e4be2afb-6436-685b-952d-9130d2e9b4bc.png)

これをやったからアプリを簡単に作れるようになる、と言う感じではないですがはじめの一歩として非常に良い教材だと思います。


## 受けた方が良さそうな人
- クラウドを学びたいけど何をやったら良いかわからない人
- 手を動かして学びたい人
- 暇な人

ちなみにこの本はterminalでのコマンド操作を行いながら進んでいきます。
Pythonや機械学習の知識も出てきますが、必須ではありません。（あったほうが進みは速いと思います）
しかも今ではGPT-4君がいるのでわからない所は素直に聞きましょう。優秀ですよあの子。




# 進めていく上で詰まったポイント
::: note warn
注意
多くの人にとって役に立たない、今進めている人へのTipsです
:::

進めていく上で詰まったポイントとその解決策を書きます。
誰かの役に立てば嬉しいです。

## Hands-on2でインスタンスの上限申請を拒否されてキレた話
### 何の話？
hands-on2でディープラーニングを扱う際、インスタンスにg4dn.xlargeを使います。
ただ、GPU搭載型Gタイプのインスタンスの起動上限がOになっている。これを「上限を引き上げてくれー」と申請した結果拒否られた話です。
まず、g4dn.xlargeではvCPU数が以下のように4つ必要なので上限を4まで引き上げなければなりません。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1343890/41f34b7b-9895-da4c-31bf-e9ec64172f97.png">

### vCPU数上限引き上げ方法
以下の手順で引き上げます。
- EC2の画面を開く
- サイドメニューから*制限*を開く
- G4インスタンスを選択し、*制限緩和のリクエスト*をクリックし、以下の項目を選択
    - Service limit increase
    - Limit Type: EC2専用ホスト
    - Requests
        - Region:使いたいRegion
        - Limit: 4
        - プライマリインスタンスタイプ：All G instances
    - 詳細：何に使うかを記述

この内容でリクエストした結果、拒否られました。
何回やっても拒否られたので思い切って、「〇〇に使いたいのですが、なぜ拒否られるのですか？理由を教えてくれないと納得できません。」という感じの半ギレメールを送りました。
その結果、リクエストが承諾され使えるようになりました。
なぜ拒否られたかわかりませんが、拒否られたらそのままにせずに問い合わせましょう。



## s3で若干詰まった話

12.3.1のデプロイでエラーが出て詰まりました。
どうやらCloudFormationのCDKToolkitに古いものが残っていたためエラーが出たようです。
- コンソールからCloudFormationのCDKToolkitを削除
- cdk bootstrap
- cdk deploy

で解決です。

# さいごに

クラウド使える人の需要が高まっていると思うので、ぜひ皆さんやってみては？
自分もこの講義を応用して色々と作っていきたいと思います。
最後まで読んでいただき、ありがとうございました！
GitHubで毎回のアクセストークン入力を省略する

# はじめに

GitHubで会社でもプライベートでもpullやpushのときに毎度アクセストークンをいれています。そんなときペアプロをしているメンバーから私くらいしかアクセストークン入れている人がいないと言われて、他の人はどうしているのだろうか、そもそも省略ってどう設定するのだろうと思いまとめます

# 省略している人との違い

GitHubでリポジトリをクローンする際には大きく2つあり、`https`か`SSH`を使うかと思います

私は`SSH`を設定していなかったので毎回`Https`でクローンしていました
この場合は適切に設定をしていないと毎度アクセストークンを入力することになります

SSHならとくに求められることないはずです

# 解決方法

以下のコマンドで設定を行えます

```bash
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
$ git config --global credential.helper cache
```

ここで重要なのは最後の行です
この設定をしないとキャッシュが効かないので毎回アクセストークンを入れる羽目になります

# おわりに

なぜかVSCodeだとアクセストークンをいれずにpull/pushができていたのですが、それはキャッシュをいい感じに保持してくれたんだなと納得しました

調べても簡単に解決できなかったので参考になったら嬉しいです

# 参考

https://qiita.com/usamik26/items/c655abcaeee02ea59695
watchの使い方（vue.js）

## 初めに
vue.jsのwatch機能を使用して実装したので備忘録として残します。

__watch__ のポイントは __監視__ です。
動きがあったことをトリガーとして処理を実施することができます。

公式ドキュメント

https://v2.ja.vuejs.org/v2/guide/computed#%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%A3

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__ | 8.2.3 |
| __vue.js__ | 3.2.47 |

## 実装
言語を選択できる機能を実装しました。
言語が選択されるとwatchで監視されているため、選択された値を取得することができます。

```vuejs:vueConponent.vue
<template>
    <div class="input-section-setting-body">
        <dl class="input-group">
            <dt>
                <span class="require-mark">必須</span>
                <span>学びたい言語</span>
            </dt>
            <dd>
                <select
                    v-model="selectLanguage"
                    class="language-select"
                    id="language-select"
                >
                    <option disabled value="">言語を選択</option>
                    <option value="1">日本語</option>
                    <option value="2">英語</option>
                    <option value="3">中国語</option>
                    <option value="4">韓国語</option>
                </select>
            </dd>
        </dl>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                selectLanguage: "",
            };
        },
        watch: {
            selectLanguage: function (e) {
                this.selectLanguage = e;
                console.log(this.selectLanguage);
            },
        },
    };
</script>
```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
IntellijIdea PyCharm pleiades 起動できない

<a href="https://www.vector.co.jp/soft/screen/win95/game/se394828.html">ふぁんふぁんまっちんぐ<br><img src="https://deliver.vector.co.jp/screenshot/394/394828_01.jpg" width="50%"></a>

IntellijIdeaや、PyCharmなどをpleiadesで日本語化した際に、ソフトが起動できなくなることがある。
日本語化を無効化する方法

例:PyCharmの場合
下記ファイルをテキストエディターで開く
C:\Users\ユーザー名\AppData\Roaming\JetBrains\PyCharmCE2023.1\pycharm64.exe.vmoptions

下記行を削除するか、コメントアウトする(行頭に#を記述する)
```
#-javaagent:C:\Users\ユーザー名\AppData\Roaming\JetBrains\PyCharmCE2023.1\jp.sourceforge.mergedoc.pleiades\pleiades.jar
webview_flutter WEBサイトを表示するまで（webview_flutter 4.0以上対応版）

webview_flutterの公式パッケージにもサンプルが載ってるのですが、機能マシマシのサンプルで自分のやりたいことに比べてオーバースペックだな、と感じたため必要最低限のWEBサイト表示だけを実現する実装について紹介します。

開発環境：
Android Studio Electric Eel（flutterプラグインインストール済み）
flutter 3.7.8
webview_flutter 4.0.7


### プロジェクト作成
New Flutter Project押下
![スクリーンショット 2023-04-15 16.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310630/f79ef9e8-c467-982e-8e49-be99b6b20640.png)
Generatorsで「Flutter」選択してNEXT押下
![スクリーンショット 2023-04-15 16.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310630/f249a34b-30ac-73ee-670a-71f4786e14da.png)
適当なプロジェクト名を入力してCreate押下
![スクリーンショット 2023-04-15 16.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310630/0b8d81a1-bb60-7cdd-17ba-7bee824e1020.png)


### flutter_webview パッケージインストール
AndroidStudioのターミナルにて
```
flutter pub add webview_flutter
```

dependenciesに自動的に追記されます。
```pubspec.yaml
dependencies:
  webview_flutter: ^4.0.7
```
### 実装コード
では一気にWEBサイトを表示するコードです！
```main.dart
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: WebViewWidget(
        controller: WebViewController()
          ..loadRequest(Uri.parse("https://flutter.dev")),
      ),
    );
  }
}
```

はいー、表示されました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310630/dae60006-9df8-3194-0703-e0b7da80fcee.png" width="360">
flutter_webview 3.x系とは別物というレベルで破壊的変更が加わっているようです。ググって出てくる記事が3.x系が多かったのでうまくいかず結構焦りましたが、公式パッケージのサンプルを読み解きながら実装して見たらなんとかなりました。webviewのjavascriptからflutterのメソッドを実行する方法なども追って紹介していきたいと思います！
CDCテストってここまでで作成してきたE2Eテストと何が違うの？？

# はじめに

仕事でTDDをしながら開発をしている際に開発が一通り終わった際に、これは`CDC`したほうが良いなと先輩が言っており、CDCテストの内容について聞きました

そのときに、そのテストケースっていまあるテストで同じことしているし、なんのためにやってるんだろうと自分の中で理解するまでに時間がかかったので考え方についてまとめます

# CDCテストとは

CDCはConsumer Driven Contract Testの略で、マイクロサービス間の連携のテストをするものになります

マイクロサービスでは複数のサービスが連携して最終的なシステムを構成しているため、全体E2Eがやりづらいことがあります。全体E2Eをやる場合はそれに関わるすべてのサービスを起動してテストする必要があります。

そこで、CDCでは単体テストのデータ(モック)を同じにすることで連携が正しくできることを確かめます

以下に簡単な例を載せます
ここではサービスAのテストとサービスBのテストがあるとします
どちらも`id: 1`をリクエストに渡してテストをしています

この場合に、サービスA -> サービスB -> DB(モック)と考えることができ、サービスAとサービスBのCDCができたことになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/6e3ed2cb-001a-fe8f-9da0-83c8d377098c.png)

ここで注意が必要なのは、どちらもリクエストで`id: 1`を渡していることです。
CDCでは同じリクエストをすべてのサービスのテストでやらないと、正しく連携ができているかは保証できません

# 疑問

ここまで話を聞いてある疑問が浮かびました
先程の例ですでにサービスAはTDDで実装が終わっており、以下のテストがありました

サービスAのテスト項目
- id:1を渡すとユーザーwatanabeの名前が返ってくる
- id:2を渡すとユーザーyamadaが返ってくる
- idを渡さないとユーザーが返ってこない

サービスBのテスト項目
- id:1を渡すとユーザーwatanabeのJSONが返ってくる

この場合、サービスAでは`id:1を渡すとユーザーwatanabeが返ってくる`、サービスBでは`id:1を渡すとユーザーwatanabeのJSONが返ってくる`で連携できているので、CDCをやる必要はないのではないかと思いました

どちらも`id:1`をリクエストに渡しているので連携してそうなのに、なぜわざわざ同じようなテストをCDCとして書くのかがなかなか理解できませんでした

# CDCとしてテストを作成する理由

もしいまあるサービスAとサービスBのテストをCDCとする場合は、サービスBは

- id:2を渡すとユーザーyamadaが返ってくる
- idを渡さないとユーザーが返ってこない

に対応するテストを追加する必要があります。
そうしないと本当に連携したときに動く保証がありません

例えばサービスB --> DB(モック)のときにidがないときにそもそも例外エラーになるかもしれません

いまは2つのサービスですが、これがいくつかのサービスに連携していくと後ろに慣ればなるほどテストケースが膨大になっていきます

そこで、わざわざCDCテストとして別にディレクトリを作成してその中に、CDC用のテストを作成していました

# おわりに

今回は教えてもらったことを自分なりにまとめてみました
CDCもどこまでやるかというのが悩ましいポイントですが、考え方を理解すると実装自体はほとんど同じなので簡単にできました

# 参考

https://www.ogis-ri.co.jp/otc/hiroba/technical/microservices-test/part1.html
v-modelの使い方（vue.js）

## 初めに
vue.jsにてv-modelを使用したので備忘録としてメモに残します。
watchでの監視機能も使用しています。

__v-model__ のポイントは、__双方向__。
双方向にデータを行き来させることができる優れもの。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__ | 8.2.3 |
| __vue.js__ | 3.2.47 |

## 実装
言語を選択できる機能を実装しました。
選択した言語がデータとして取得することができるようになっています。

```vuejs:vueConponent.vue
<template>
    <div class="input-section-setting-body">
        <dl class="input-group">
            <dt>
                <span class="require-mark">必須</span>
                <span>学びたい言語</span>
            </dt>
            <dd>
                <select
                    v-model="selectLanguage"
                    class="language-select"
                    id="language-select"
                >
                    <option disabled value="">言語を選択</option>
                    <option value="1">日本語</option>
                    <option value="2">英語</option>
                    <option value="3">中国語</option>
                    <option value="4">韓国語</option>
                </select>
            </dd>
        </dl>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                selectLanguage: "",
            };
        },
        watch: {
            selectLanguage: function (e) {
                this.selectLanguage = e;
                console.log(this.selectLanguage);
            },
        },
    };
</script>
```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
docker image rm でNo such image エラー：解決

# 環境
・Docker Desktop for windows 4.18.0
・Docker version 20.10.24
・windows11 home
・Windows PowerShell 7.3.3

# 前提
docker compose をやった後にdocker compose down でコンテナ等削除。
イメージとボリュームはdownで自動削除されないので、自分で削除しようとしたところ、イメージの削除でエラー発生。

# 現象
```powershell
> docker image ls
REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE
mysql                         5.7       3f3447deacaa   2 weeks ago    455MB
```
この状態で、mysqlイメージを消そうとすると、
No such image: mysql
エラー。ちなみに他のイメージは正常に削除できた。
```powershell
> docker image rm mysql
Error: No such image: mysql
```

そこで、lsコマンドで表示された`「IMAGE ID」`で指定すると削除できた。解決。
```powershell
> docker image rm 3f3447deacaa
Untagged: mysql:5.7
Untagged: mysql@sha256:bf18020f32cc5d8f5e2add516d52fbf3afc3de431457076340e938596c528171
Deleted: sha256:3f3447deacaa5bacab184fabbf821a785e13303b2e340465bdf7815b0284497b
Deleted: sha256:b51c74300d68b9b3950240d8603e4d36d317a9b142f321590cf63c3e0de54c8b
Deleted: sha256:4978400ffc88fb08ad9078f54b9c0b7bbdeb974eb47254bef400c3afcb1a5f64
Deleted: sha256:415ae5176ec060ee20567260329c59249ac0a14ace1231bd900b06160f1bf13a
Deleted: sha256:5ca10ce25add112849f8f21284987d8a979ec7da062bf19b4dec85eb2408223e
Deleted: sha256:56a19ae8978a0c01051769af8fdc0ddc3356f117b194e4c7db9d39d3e81a4b56
Deleted: sha256:0c03f32323e91eefa53c41b1fe030e2278dd7ce87cb854da695b03125e9db2cc
Deleted: sha256:38700ee823d5d82b695bb7d553973c0106384a6984b553e2af6d6fb9545d9636
Deleted: sha256:7cfca860605c4f16b1f255ebd51e2c801e00ac16997c7840428f88a2246cfebb
Deleted: sha256:0d8a62cb129e3cebaaef51f977b670282775d48a9cdaa021a0cb5ed73243a446
Deleted: sha256:66e6e199acb7395ac9a10b125841eafdfa3f80a1a3f710e0a0a9519da228bce2
Deleted: sha256:e74a57638021cebbbe0dda98a27675f9b53258050ee2c29c3e5fb7fb1f3ab533
```
SONY Spresense用フルカラーLED(WS2812C-2020)拡張ボード

Sony Spresense用のフルカラーLED(WS2812C-2020)拡張ボードを作りました。
少し前にLEDチューブ用の無拡張ボードを作りましたが、
今回はボード上にフルカラーLED(WS2812C-2020)を3個実装した基板です。

**今回作成した基板**
![DSC04639.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/35732f7c-6147-2f24-1b43-239856f2f9bf.jpeg)

**Spresenseにセットしたイメージ**
![DSC04638.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/38d2711a-4ba2-3a36-3981-b3e05874129f.jpeg)


**回路図**
![WS12C_Schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/e892c6a7-7cfd-f98b-9a21-c0fc7adb3922.png)

**テストプログラム**
今回も追加ライブラリとして
[adafruit/Adafruit_NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel)
[KotaMeiwa/nepils](https://github.com/KotaMeiwa/nepils)
を使用していますのでArduino IDEのライブラリに追加してください。
**KotaMeiwa/nepils** のサンプルとして付属している **example** の
const uint16_t PIN の 番号と
const uint16_t NUM_PIXELS の個数を基板に合わせて変更しています。

```example.ino
#include <SpresenseNeoPixel.h>

// const uint16_t PIN = 6;
const uint16_t PIN = 22;
const uint16_t NUM_PIXELS = 3;
SpresenseNeoPixel<PIN, NUM_PIXELS> neopixel;

void setup()
{
    Serial.begin(115200);
    neopixel.clear();
    neopixel.framerate(40); // default framerate is 40[fps]

    delay(1000);

    Serial.println("start");
}

void loop()
{
    static uint32_t prev_ms = millis();
    static uint8_t state = 0;
    if (millis() > prev_ms + 1000)
    {
        Serial.println("change color");

        switch (state)
        {
            case 0:
                neopixel.set(128, 0, 0);
                break;
            case 1:
                neopixel.set(255, 0, 0);
                break;
            case 2:
                neopixel.set(0, 128, 0);
                break;
            case 3:
                neopixel.set(0, 255, 0);
                break;
            case 4:
                neopixel.set(0, 0, 128);
                break;
            case 5:
                neopixel.set(0, 0, 255);
                break;
            case 6:
                neopixel.set(128);
                break;
            case 7:
                neopixel.set(255);
                break;
            case 8:
            default:
                neopixel.set(0, 0, 0);
                break;
        }
        state = (state + 1) % 9;
        prev_ms = millis();
    }

    neopixel.show(); // automatically control framerate to desired fps
}
```
<iframe width="560" height="315" src="https://www.youtube.com/embed/um_QcPB9FlA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

今回のフルカラーLED基板はメイン基板に取り付けるタイプとして制作しました。
これから販売するための準備進めていMFKyoto2023までには販売をスタート出来るようにしたいと思っています。
v-showの使いかた（vue.js）

## 初めに
vue.jsにて __v-hsow__ を用いて実装したので、
備忘録として残します。

公式ドキュメント

https://v2.ja.vuejs.org/v2/guide/conditional

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__ | 8.2.3 |
| __vue.js__ | 3.2.47 |

## 実装
__v-show__ は、display CSS プロパティを切り替えます。
表示/非表示 を切り替えることができるということ。

下の例だと、v-show="is_using"　が 
　　　　　　　　　true であれば 表示する。
　　　　　　　　　false であれば非表示にする。

何かしらのトリガーで true/false を切り替える。
```vuejs:vueConponent.vue
<template>

    <span class="use_status" v-show="is_using">利用中</span>    
    
</template>

<script>
    export default {
        data() {
            return {
                is_using: false,
            };
        },
    };
</script>
```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
ChatGPTで図を書いてもらう方法（誰にでもできます）

# はじめに

 ChatGPTで図を書いてもらい、感動しているので共有します。

# 手順

1. キーワード+ 「mermaidJSで図解して」をつける
2. MermaidJSのエディターで確認orNotionのコードブロックで確認

## 1. キーワード+ 「MermaidJSで図解して」をつける
※ChatGPT3.5は文法ミスがたまにあるので、その場合は自分直したりします。
今回は,ChatGPT4.0で試しました

例：Facade デザインパターンをMermaidJSで図解して教えて
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/285db7c4-59a7-afc3-f3e6-efc8837287d8.png)

Qiitaのコードブロックだと以下のように表示されます。
usersの部分が文字化けしてますね、
```mermaid
    classDiagram
      class Facade{
        +operation(): void
      }
      class Subsystem1{
        +operation1(): void
      }
      class Subsystem2{
        +operation2(): void
      }
      Facade --> Subsystem1: <<uses>>
      Facade --> Subsystem2: <<uses>>
```    

## 2. MermaidJSのエディターあるいはNotionのコードブロックで確認

Qiitaやzennでも利用できるはずです
![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/d21005c8-2757-3fe0-674c-b1da66d97c44.png)

![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/33473045-e406-52ac-d70e-7ed17d83d364.png)

[MermaidJS Editer](https://mermaid-js.github.io/mermaid-live-editor/)

# さいごに

正直、Excelやパワポで絵を書くのはだるいです。
コンポーネント、図形の大きさを一括で変更するのも手間なので。
markdownで資料を管理する流れができますように。。

>[MermaidJS Editer](https://mermaid-js.github.io/mermaid-live-editor/)

>[ChatGPT4.0](https://openai.com/)
-----
English Translator

# How to have a diagram drawn in ChatGPT (anyone can do it)

# Introduction

I'm impressed by the diagram drawn on ChatGPT, so I'll share it.

# Procedure

1. Add keyword + "illustrated with mermaidJS"
2. Check in the MermaidJS editor or check with the code block of Notion

## 1. Keyword + "illustrated with MermaidJS"

* ChatGPT3.5 sometimes has grammar mistakes, so in that case, I will correct myself.

This time, I tried it with ChatGPT 4.0.

Example: Illustrating Facade design patterns in MermaidJS


## 2. Check in the MermaidJS editor

It should work with Notion's code block, or even in Qiita or zenn.



[MermaidJS Editer](https://mermaid-js.github.io/mermaid-live-editor/)

# Finally

To be honest, it's lazy to draw pictures in Excel or PowerPoint.
It is also troublesome to change the size of components and shapes all at once.
I hope you can manage materials in Markdown.
サービスクラスを利用するには

・サービスクラスとは
コントローラー内のコードの可読性を高めるために用いる概念で、モデルとは別に処理を記述するファイルのこと。

・サービスクラスを使用する目的
モデルの記述は肥大化しやすいため、複雑な処理はサービスクラスに切り出すことで可読性を保つことができる。

・サービスクラスの使用方法
例えばすでに下記のようにモデル内に記述している処理をサービスクラスに切り出そうとするときを例にあげて説明する。

```ruby app/models/モデル名.rb
class モデル名 < ApplicationRecord
 validates :text, presence: true
  belongs_to :user
  has_many :comments

  def self.search(search)
    if search != ""
      Tweet.where('text LIKE(?)', "%#{search}%")
    else
      Tweet.all
    end
  end
end
```

1.サービスクラスを定義する
まずは以下のような配置になるように必要なディレクトリとファイルを作成する。
```ruby
app
 L sevices
     L search_tweets_service.rb　# 好きな名前
```
2.作成したファイルに処理を記述する

```ruby search_tweets_service.rb
class SearchTweetsService
  def self.search(search)
    if search != ""
      Tweet.where('text LIKE(?)', "%#{search}%")
    else
      Tweet.all
    end
  end
end
```
SearchTweetsServiceというクラスを定義した後は、すでにモデルに記述していた処理をそのまま書くだけで終わり。

3.コントローラーで呼び出し
```ruby controllers/コントローラー名.rb
class コントローラー名 < ApplicationController
~省略~

  def search
    @tweets = SearchTweetsService.search(params[:keyword])
  end

~省略~
end

```
モデルに書いていた時の呼び出しは以下
```ruby コントローラー名.rb
  def search
    @tweets = Tweet.search(params[:keyword])
  end
```
比べるとクラス名が違うだけで記述は一緒です。

読みにくくなりそうな複雑な処理は最初からサービスクラスを使って読みやすることが大切。
また、メンテナンス時のことを考えるとサービスクラスを使用していた方がわかりやすい。
vueに値を渡す（Laravel10, vue.js）

## 初めに
laravelのControllerの値をvue側に渡す処理を実装しました。
備忘録として残します。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__ | 8.2.3 |
| __vue.js__ | 3.2.47 |

## 実装
```php:HomeController.php
// ... 略

public function index(Request $request)
{
    // ... 略

    // 配列に格納する
    $param = [
        'set_info' => '渡したい値',
    ];

    return view('home')->with($param);
}
```

```php:index.blade.php
<div id="set-form">
    <component_a :already_set_info="{{ json_encode($set_info) }}"></component_a>
</div>

```

```vuejs:CmponentA.vue
<template>
    // ... 略
</template>

<script>
    export default {
        props: ['already_set_info'],
    
        // スクリプト内では、「this.already_set_info」 で利用可能です！
    };
</script>

```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
ChatGPTボットはふわふわなファイルを届けてくる

ChatGPTボットのラスクにはコマンドを投げつけるとサーバ上のデータベースからエクセルファイルを生成してSlackに貼り付けてもらっています。そのときに気の利いた言葉を言ってもらってるのだけど、、、

![2023-04-14_20h41_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/ecb3fbc7-141c-68d1-072b-1cf9656bf6ac.png)

ふわふわのファイルってなんだよ！

むだなツッコミを入れてしまった
Azure サンドボックス環境のIPアドレスを調べてみた

Azure AutomationのRunbook実行は、**Azure実行基盤であるサンドボックス環境**が使用されます。

今回は、サンドボックス環境のIPを調べたい方や、NSGやFWでガチガチに環境固めていて、必要最低限のIPのみ許可したい方向けに、サンドボックス環境のIP調査方法について説明します。

# はじめに
なぜ、サンドボックス環境のIPを調べることになったか、簡単に経緯をお話しします。

あるプロジェクトで、ACR（Azure Container Registry）のリポジトリ登録されているイメージを、Azure Automationを使用して週次でバックアップ用ACRにコピーする、というバックアップ環境の整備を実施していた際に、スクリプトのGetコマンドが動作しないという問題が発生しました。

ACRの診断ログから、Runbookを実行した際に**138.91.14.162**というIPがACRに対して通信している形跡がありました。このアドレスは、リソースやVMで用いられているものではなかったので、MSに問い合わせてみたところ。。。

本IPは東日本のAzure実行基盤(サンドボックス環境)のWindowsサーバーインスタンスIPとのことでした。どうやら、Runbookを使用する場合、本サンドボックス環境が使用されるようです。

https://docs.microsoft.com/ja-jp/azure/automation/automation-runbook-execution

### サンドボックス環境のIPアドレスは、定期的に変更する
上記MSに行った質問には、実は続きがあり。。
**サンドボックス環境のIPは、[東日本公開IP](https://www.microsoft.com/en-us/download/details.aspx?id=56519)に含まれるものから不定期に変更して決まる**とのことでした。

では、「東日本公開IP」を全部許可すればいいのか。。
という訳にもいかないのです！
この公開されているIPアドレス一覧は、定期的にこうしんされているようでした。。
（試しに、2週間前後の差分をチェックすると、2件アドレスレンジが追加されていました。。）

ということで、Automationを実行するサンドボックス環境のIPアドレスを知る必要が発生したという経緯があり、アドレスを取得するスクリプトの開発を行いました。

# サンドボックス環境のIPアドレスを取得
今回は、サンドボックス環境のIPアドレスを取得する、PowerShellスクリプトを準備しました。

スクリプト実行時のサンドボックス環境のIPアドレスを取得してきて、現在NSGで許可されているIPアドレスと比較し、IPが不足していたら連絡する、という内容になっています。
```powershell
try {
    $srcAcrId = Get-AutomationVariable -Name "acr_id_from"
    Write-Output "以下のACRのネットワーク情報を取得します:" $srcAcrId
    $reg = Get-AzContainerRegistry -ResourceId $srcAcrId
    $currentallowIp = $reg.NetworkRuleSet.IpRules.IPAddressOrRange
    Write-Output "現在許可されているIPアドレスは以下の通りです" $currentallowIp
}
catch {
    Write-Output "エラー:現在のACR情報の取得に失敗しました"
    $returncode = 1
    Write-Output $returncode
    Write-Error
}
 
 
try {
    $latestIp = (Invoke-RestMethod 'https://api.ipify.org?format=json').ip
    Write-Output "許可する必要がある最新のIPアドレスは以下の通りです" $latestIp
}
catch {
    Write-Output "最新のIP情報の取得に失敗しました。"
    $returncode = 1
    Write-Output $returncode
    Write-Error
}
 
$dif = $currentallowIp | Select-String -SimpleMatch -Pattern $latestIp -Quiet
 
if ($dif -eq $true) {
    Write-Output "現在許可されているIPアドレスは最新です"
}
else {
    Write-Output "サンドボックス環境のIPアドレスに変更があります。各ACRの許可設定から下記IPアドレスを追加してください。"
    Write-Output $latestIp
    $returncode = 1
    Write-Output "終了コード:" $returncode
    Write-Error
}
```
試しに、このスクリプトを1ヶ月実行してみたところ、1日だけ別のIPに変更し、翌日元のIPに戻ることが数回発生することが確認できました。

閉域環境で必要最低限のIPを許可する必要がある方などの参考になれば幸いです。
jQueryで選択したチェックボックスの項目のみを表示する絞り込み機能を実装してみた

# 概要

jQueryを使用して、選択されたチェックボックスの項目のみをリスト表示する、絞り込み機能を実装する例を紹介します。チェックボックスは２種類（例：ブランド、メーカー）を用意し、アンド検索できるようにします。チェックボックスを未選択の場合は全件表示するようにします。

## HTMLの準備

まず、以下のようなHTMLを準備します。

チェックボックスにはbrand-filterとmaker-filterのクラスを設定します。
リストにはブランドとメーカーのパラメーターとしてdata-brandとdata-makerを挿入します。
チェックボックスの値とリストのパラメーターの値は絞り込みたいもので揃えてください。

```html:index.html
<html lang="en">
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="app.js"></script>
</head>
<body>
    <h3>ブランド</h3>
    <label><input type="checkbox" class="brand-filter" value="brand1"> Brand 1</label>
    <label><input type="checkbox" class="brand-filter" value="brand2"> Brand 2</label>
    <label><input type="checkbox" class="brand-filter" value="brand3"> Brand 3</label>

    <h3>メーカー</h3>
    <label><input type="checkbox" class="maker-filter" value="maker1"> Maker 1</label>
    <label><input type="checkbox" class="maker-filter" value="maker2"> Maker 2</label>
    <label><input type="checkbox" class="maker-filter" value="maker3"> Maker 3</label>

    <ul id="item-list">
        <li data-brand="brand1" data-maker="maker1">アイテム 1 - Brand 1 - Maker 1</li>
        <li data-brand="brand2" data-maker="maker1">アイテム 2 - Brand 2 - Maker 1</li>
        <li data-brand="brand3" data-maker="maker2">アイテム 3 - Brand 3 - Maker 2</li>
        <li data-brand="brand1" data-maker="maker3">アイテム 4 - Brand 1 - Maker 3</li>
        <li data-brand="brand2" data-maker="maker2">アイテム 5 - Brand 2 - Maker 2</li>
    </ul>
</body>
</html>
```

## jQueryによる処理の実装

次に、jQueryを準備します。

チェックボックスがチェックされた場合のみ、絞り込みの関数filterItemsが動作するようif文で場合分します。未選択の場合はリストを全件表示するようにします。

絞り込みの関数filterItemsではブランドとメーカーそれぞれのチェックボックスにチェックされている項目の値を取得し、selectedBrandsとselectedMakersに値をpushします。

チェックボックスにチェックした値と該当するリストを抽出し、ブランドとメーカーを論理積（and演算）を用いて掛け合わせ、toggle関数で表示/非表示を切り替えさせるようにします。

```javascript:app.js
function filterItems() {
    var selectedBrands = [];
    var selectedMakers = [];

    $(".brand-filter:checked").each(function () {
        selectedBrands.push($(this).val());
    });

    $(".maker-filter:checked").each(function () {
        selectedMakers.push($(this).val());
    });

    $("#item-list li").each(function () {
        var itemBrand = $(this).data("brand");
        var itemMaker = $(this).data("maker");

        var isBrandMatched = !selectedBrands.length || selectedBrands.includes(itemBrand);
        var isMakerMatched = !selectedMakers.length || selectedMakers.includes(itemMaker);

        $(this).toggle(isBrandMatched && isMakerMatched);
    });
}

$(".brand-filter:checkbox, .maker-filter:checkbox").on("click", function() {
    if ($(this).is(":checked")) {
        filterItems();
    } else {
        $(".js-filter-item").show();
    }
});
```

## 動作確認

上記のHTMLとjQueryを組み合わせた処理を実行すると、チェックボックスにチェックを入れることで、該当するリスト項目が表示されるようになります。以下は、動作確認のために作成したサンプルです。

[サンプルページ](https://codepen.io/ootom20002000/pen/RweapbM)

## まとめ

このように、jQueryを選択したチェックボックスの項目のみを表示する絞り込み機能を実装することができます。

複数の項目に対して絞り込みを行いたい場合は、パラメーターを増やすことができます。例えば、色やサイズなどの複数の条件で絞り込んだり、価格帯や在庫状況など、複数のパラメーターを組み合わせて絞り込むことができます。

以上の内容が、お役に立てば幸いです。絞り込み機能を実装して、ユーザーにとってより使いやすいサイトを作りましょう。
Matlabで相関係数を計算する --複数のデータセットがある場合--

いま$N$回観測された２変量のデータを考える。これを1セットと呼ぶ。Matlabで1セットデータから2変量間の相関係数の計算を考える。さらに複数セットのデータを考え、セット毎の相関係数の計算を考える。この計算をMatlabでは以下のコンパクトなコードで行える。

以下のコードは、行列xx,yyの対応する列の間の相関係数を計算する。
計算結果は変数rxxyyに入る。
```Matlab
    N = size( xx, 1 );

    mxx = sum( xx )/(N); %平均値
    myy = sum( yy )/(N);

    nxx = xx - mxx; % 平均値を差し引く
    nyy = yy - myy;

    cxxyy = sum( nxx.*nyy ); % 各列ごとの共分散x(N-1)
    sxx = sqrt( sum(nxx.*nxx) ); % 各列ごとのsqrt(分散 x(N-1))
    syy = sqrt( sum(nyy.*nyy) );
    rxxyy = cxxyy ./( sxx.*syy); % 相関係数
```
上記の手順は、Matlabの相関係数行列を計算するcorrcoefに比べて数倍早い。どの程度早いかはデータの大きさに依存して変わる。
上記の手順は、様々な統計量の計算に応用でき、ブートストラップ法を効率的に行うのに有用である。すなわちブートストラップ標本を複数個取得し、統計量を計算するのに使える。

以上
LINE メッセージ送信（Laravel）

## 初めに
Laravelを用いてLINEにてメッセージ送信を実装しました。
備忘録として残します。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__ | 8.2.3 |

## 環境構築
SDKをインストールします。
```
composer require linecorp/line-bot-sdk
```

## 実装
```php:LineController.php
use LINE\LINEBot;
use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\Event\MessageEvent\TextMessage;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;

// ... 略

/**
* LINE送信する
*/
public function LineSend()
{
    Log::debug(__FUNCTION__);

    $http_client = new CurlHTTPClient('channel_access_token'));
    $line_bot    = new LINEBot($http_client, 'channel_secret');
    $line_id     = 'line_id'; // またはchannel_id
    $message     = ''; 

    // メッセージを作成する
    $message = new TextMessageBuilder('LINE通知成功しました');

    // メッセージを送信する
    $line_bot->pushMessage($line_id, $message);

}
```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
第０回学習備忘録発進

・自己紹介
はじめまして、ゲーマーのえむてんです。
現在サーバーサイドのエンジニアとして働いています。
学んだことの備忘録としてはじめました。

・学習方法
何かを実装した記事などを参考に真似していき、詰まったところなどメモしていけたらいいなと思ってます。