OmniAICreator/Qiita-1.07M huggingface dataset:
SQLServerでBulkInsertを簡単に行いたい

# 1. はじめに
* SQLServerにテーブル単位でレコードを洗い替えできるようにしたい
* Windowsバッチから簡単に実行できるようにしたい

# 2. 開発環境
* SQLServer
* BCP
* Windows 11

# 3. 事前準備
* BCPコマンドでテーブル単位にインポートデータを作成しておく
``` bcp [DB名].dbo.[テーブル名] in [出力ファイル名(物理テーブル名)].txt /T /c ```

# 4. バッチファイル
* バッチファイル内のフォルダのTEXTファイルを順次テーブルに取り込む
* 取り込み対象は拡張子がtxtのもので、ファイル名に物理テーブル名とする

```
@echo off

for %%i in (*.txt) do (
    sqlcmd -S [SQLサーバー名] -U XXX -P XXX -Q "TRUNCATE TABLE %%~ni"
    bcp [DB名].dbo.%%~ni in %%~ni.txt /T /c
)

pause
```

# 5. 参考文献

https://mr-star.hatenablog.com/entry/sqlserver/020

https://www.case-k.jp/entry/2020/11/06/171812

https://dwd.kiminoquest.com/article/297.php
LangSmithチュートリアルやってみた

### この記事の対象者
- Pythonがある程度わかる人
- 生成AIアプリ制作をしたい人
- LangSmithって聞いたことあるけど何ぞやって人

### LangSmithとは

> At LangChain, all of us have LangSmith’s tracing running in the background by default. On the Python side, this is achieved by setting environment variables, which we establish whenever we launch a virtual environment or open our bash shell and leave them set. The same principle applies to most JavaScript environments through process.env1.

>The benefit here is that all calls to LLMs, chains, agents, tools, and retrievers are logged to LangSmith. Around 90% of the time we don’t even look at the traces, but the 10% of the time that we do… it’s so helpful. We can use LangSmith to debug:

>An unexpected end result
Why an agent is looping
Why a chain was slower than expected
How many tokens an agent used

[公式サイト](https://docs.smith.langchain.com/overview)によると上記の説明がされています。
簡単にいうと90%の時間はログを見ないけど10%の時間はログを見るよね、だからLangSmithは役に立つんだよと
具体的には
- 予期せぬ処理結果
- エージェントがループしている
- chainの実行が想定より遅い
- どれくらいのトークンをエージェントは使用しているのか
と言ったことに役立つそう
**簡単にいうとLangchainのデバックツールとしてダッシュボードが用意されているみたいな感じなのかな**
確かにlangchainを触っていて上記について困ったことが多かったので役立ちそう。

### 1. とりあえずチュートリアルを初めてみる

```pip install -U langchain_openai```でlangchainをインストールします。
### 2. 続いてshellで以下のコマンドを実行し環境変数を設定します。
LangChanin_API_KEYは[LangSmithのダッシュボード](https://smith.langchain.com/)からcreate Api keyで作成したものを入れてください。
LANGCHAIN_PROJECTは特にこだわりがなければdefaultを設定してください。
```
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT=https://api.smith.langchain.com
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project>  # if not specified, defaults to "default"

# The below examples use the OpenAI API, so you will need
export OPENAI_API_KEY=<your-openai-api-key>
```
### 3.続いてpythonのコードに移ります。
```
from langchain_openai import ChatOpenAI

llm = ChatOpenAI()
llm.invoke("Hello, world!")
```
至ってシンプルなllmを使用したコードになります。
適当にファイル名をつけて保存し実行してください。
ダッシュボードに戻って確認すると行が増えています。
トークン数や実行時間、コストなどもわかるようになっています。

![スクリーンショット 2024-02-08 19.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/64f2977b-2e36-7e84-338a-0deac5d2557c.png)
----------------------
### 終わりに
以上で今回のチュートリアルは終わりになります。
今まではLangchainを使ったアプリケーションを作成する上でトークン数の計算を自前のコードで行う必要がありましたが、ちょっとした設定でトークン数やコスト以外の色々な情報にアクセスできるのは便利ですね！
しかし、Langchainのドキュメントはそれほど多くなく英語のものばかりで情報収集が大変ですが本番で扱えるレベルになるまでこちらの勉強は継続していこうと思います。


記事を読んでくださった方は、是非弊社開発課のXもフォローしてね:ぽっ:
毎日エンジニアに向けた情報発信を行っています


https://twitter.com/tech_cin
「曲線・グラフ総覧」に掲載されている曲線


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

```
x^4+y^4-2x(x^2-y^2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/23ab72c3-0a77-2280-df40-0e4071064df4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/174a8d77-9f86-9bf5-2388-e4ae45a59fb0.png)

---

```
x^4+y^4-2y^2-2x^2+1
```
(a=1, b=1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/18258be8-19be-1fa8-8ec6-a3572f7d216f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/110a823a-0047-48f4-e048-7afb8f7c72b7.png)

---

```
x^4+y^4-2y^2-0.5x^2+0.5^4をプロット，x=-1.4..1.4, y=-1.5..1.5
```
(a=1, b=0.5)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/b7b8c47b-c0cf-883c-18b2-8404f6b1b9bb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/061f4276-0b16-ae8b-215e-7dcc8a450d92.png)

---

```
x^4+y^4-0.5y^2-2x^2+1
```
(a=0.5, b=1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/03388df1-096a-de6c-57c9-a77cd193bb26.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/ab08ec96-4ea8-ad6a-9fad-201e9fedb724.png)

---

```
log|x^4+y^4-2y^2-2x^2+1|をプロット，x=-1.5..1.5, y=-1.5..1.5
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/c3d177b4-40ee-9aee-7d0b-050d8742b317.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/5019cffe-3044-b3ab-bb5a-8b7ce9d5b7c2.png)

---

# 表紙のグラフ
```math
y^3=x^3-x+c
```

---
```
-y^3+x^3-xをプロット，x=-2..2, y=-2..2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/7ccfa39c-8b75-1d69-d7aa-6ed13cad0f7f.png)

---
```
-y^3+x^3-x+2/(3(3^0.5))をプロット，x=-2..2, y=-2..2
-y^3+x^3-x-2/(3(3^0.5))をプロット，x=-2..2, y=-2..2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/4367690e-1900-070c-5469-1a3786afb1bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/ee02fd18-fd2f-6186-9be6-c07f3e068606.png)

---
```
-y^3+x^3-x+1をプロット，x=-2..2, y=-2..2
-y^3+x^3-x-1をプロット，x=-2..2, y=-2..2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/26f94c78-450f-fe3e-df65-b0657723ae63.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/3fa5efa5-326a-8862-b1cc-e455327b8b17.png)

---
```
-y^3+x^3-x+2をプロット，x=-2..2, y=-2..2
-y^3+x^3-x-2をプロット，x=-2..2, y=-2..2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/33070f89-a99c-9232-9918-5882f4698c19.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/1a83285a-e00b-684d-23a5-7df5aeaaf0ac.png)
SQLFluffで特定のファイルの特定のルールのチェックを無効化する方法

SQLFluffで特定のファイルで特定のルールのチェックを無効化する方法を記載します。

# 特定のファイル内で特定のルールだけ無効化する方法
SQLFluffでは、ファイル内のコメントでルールの無効化できます。
コメントした行から無効になります。

```SQL
-- noqa: disable={{ルールのCode文字列}}
```


```SQL
SELECT col_a a FROM foo -- noqa: disable=AL02
```


再び有効化したい場合は以下のコメントを挿入します。
```SQL
-- noqa: enable={{ルールのCode文字列}}
```

ファイル内のすべての行に対してルールを無効化したい場合は、コメントをファイルの冒頭に設定すれば良いです。

参考
https://docs.sqlfluff.com/en/stable/configuration/ignoring_configuration.html

# 例）キーワードの大文字小文字のルールを無効化したい場合

キーワードの大文字小文字に関するルールは、コード`CP02`なので以下のように設定します。


```sql
-- noqa: disable=CP02


SELECT 1 as SomeColumnName from some_table
```

# ルールのCodeを調べるには

こちらにルールの一覧があるので、無効化したいルールを探します。

https://docs.sqlfluff.com/en/stable/rules.html#rule-index

![スクリーンショット 2024-02-08 18.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/29a439f1-60cf-e3c1-2c0b-c2739cd66340.png)


:::note warn
注意点

「Aliases」ではなく「Code」の方で指定する必要があります。
たとえば、キーワードの大文字小文字のルールを指定したい場合、ルール名が「capitalisation.identifiers」なので、Code「CP02」を使います。
:::

以上、参考になりましたら幸いです。
PythonでPDFページを回転させ、ページの向きエラーを修正する

PDFページの向きエラーは、ドキュメントの読みや使用に不便をもたらすことがあります。この問題を解決するために、Pythonプログラミング言語を使用してPDFページを簡単に回転させ、その向きエラーを修正することができます。これにより、より良い読みや使用の体験が提供されます。PDFページを正しく回転させることで、ドキュメントのコンテンツの向きが私たちの読み方やデバイス上での表示方法と一致することが保証され、読みの負担と疲労が軽減されます。また、Pythonを使用してPDFページを回転させることで、特に大量のPDFドキュメントを扱う必要がある場合に作業効率が向上します。このプロセスを自動化することで、PDFページの向きエラーを迅速かつ正確に修正し、時間とエネルギーを節約することができます。

本記事では、Pythonコードを使用して**PDFページを回転する方法**を示します。以下に主な内容を示します：

- **[Pythonを使用して特定のページをPDFドキュメント内で回転する方法](#pythonを使用して特定のページをpdfドキュメント内で回転する方法)**
- **[Pythonを使用してPDFドキュメント内のすべてのページを回転する方法](#pythonを使用してPDFドキュメント内のすべてのページを回転する方法)**

本記事で使用する方法には、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)が必要です。公式ウェブサイトからダウンロードするか、PyPIを介してインストールできます（`pip install Spire.PDF`）。

## Pythonを使用して特定のページをPDFドキュメント内で回転する方法
回転は90度単位で行われます。0/90/180/270度でPDFページを回転することができます。PDFページを回転するための手順は以下のとおりです：

1. **PdfDocument** オブジェクトを作成します。
2. **PdfDocument.LoadFromFile()** メソッドを使用してPDFドキュメントを読み込みます。
3. **PdfDocument.Pages[pageIndex]** プロパティを使用して指定のページを取得します。
4. **PdfPageBase.Rotation.value** プロパティを使用してページの元の回転角度を取得します。
5. 元の回転角度に望ましい角度を加算します。
6. **PdfPageBase.Rotation** プロパティを使用して新しい回転角度をページに適用します。
7. **PdfDocument.SaveToFile()** メソッドを使用して結果のドキュメントを保存します。

**コードの例**
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocumentオブジェクトを作成します
pdf = PdfDocument()

# PDFドキュメントをロードします
pdf.LoadFromFile("サンプル.pdf")

# 最初のページを取得します
page = pdf.Pages[0]

# ページの元の回転角度を取得します
rotation = int(page.Rotation.value)

# 元の回転角度に基づいて、ページを時計回りに180度回転させます
rotation += int(PdfPageRotateAngle.RotateAngle180.value)
page.Rotation = PdfPageRotateAngle(rotation)

# 結果のドキュメントを保存します
pdf.SaveToFile("PDFのページを回転させる.pdf")
pdf.Close()
```

## Pythonを使用してPDFドキュメント内のすべてのページを回転する方法
APIはまた、PDFファイル内の各ページをループ処理し、それらをすべて回転することも可能です。以下に詳細な手順を示します。

1. **PdfDocument** オブジェクトを作成します。
2. **PdfDocument.LoadFromFile()** メソッドを使用してPDFドキュメントを読み込みます。
3. ドキュメント内の各ページをループ処理します。
4. **PdfPageBase.Rotation.value** プロパティを使用してページの元の回転角度を取得します。
5. 元の回転角度に望ましい角度を加算します。
6. **PdfPageBase.Rotation** プロパティを使用して新しい回転角度をページに適用します。
7. **PdfDocument.SaveToFile()** メソッドを使用して結果のドキュメントを保存します。

**コードの例**
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocumentオブジェクトを作成します
pdf = PdfDocument()

# PDFドキュメントをロードします
pdf.LoadFromFile("入力.pdf")

# ドキュメント内の各ページをループします
for i in range(pdf.Pages.Count):
    page = pdf.Pages.get_Item(i)

    # ページの元の回転角度を取得します
    rotation = int(page.Rotation.value)

    # 元の回転角度に基づいて、ページを時計回りに180度回転させます
    rotation += int(PdfPageRotateAngle.RotateAngle180.value)
    page.Rotation = PdfPageRotateAngle(rotation)

# 結果のドキュメントを保存します
pdf.SaveToFile("すべてのPDFページを回転させる.pdf")
pdf.Close()
```

## 結論
本記事では、特定のページまたはすべてのページをPDFドキュメント内で回転させる方法について、手順の詳細と完全なコード例を提供しました。このAPIの使用中に問題が発生した場合は、[Spire.PDFフォーラム](https://www.e-iceblue.com/forum/spire-pdf-f7.html)に技術サポートを求めてください。
【AWS】 パラメータストアの一覧をさくっと取得する【SSM】

# パラメータストアの一覧を取得したい！
アプリケーションの環境変数格納先等に活躍するAWS SSMパラメータストア。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html

コンソールから値を確認する際にはひとつひとつ、パラメータをクリックして中身を確認することになります。
数が多い場合は特に面倒で見落とすリスクが上がってしまいます。
AWS CLIでさくっと取得する事が出来たので共有です。


# 実行するコマンド
```
aws ssm get-parameters-by-path --path / --recursive --with-decryption --query 'Parameters[].{Name:Name,Value:Value}' --output json
```
NameとValueだけ出力したいので--queryオプションで絞っています。
視認性が向上して便利でした。

# 注意点
 - 例では階層の無いパラメータが対象になります　[※階層とは](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-paramstore-hierarchies.html)
 - パラメータストアはリージョンサービスなので複数または任意のリージョンを確認したい場合は `--region` オプションで指定が必要です

# おわりに
環境変数を更新する場合に、どこの環境変数だけを書き換えるべきかドキュメントがまとまっていない事もあるかと思います（体験談）
そのような場合に簡単に一覧を取得したいなと思い試してみました。
どなたかの参考になれば幸いです。
KotlinのElasticSearchでIndiciesからMappingのjsonが取り出せない

# はじめに

Elastic Search周りのテストを書いていた時につまづいたのでまとめておきます

# 問題

以下のような関数を作り、インデックスを取得してマッピングを返すようにしました

```kotlin
        fun getMapping(indexName: String): String {
            val request = GetIndexRequest("${indexName}*")
            val response = client.indices().get(request, RequestOptions.DEFAULT)
            return response.mappings.toString()
        }
```

しかし、MappingMetaDataが返ってきてしまい、MappingのJsonが手にはいりませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/247d60a3-8164-987c-d294-076694691d97.png)

中身をみると確かにからの配列は存在します(sourceにある)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0a40a9c4-ad72-ab5e-4ad6-edf785d5da82.png)

# 解決方法

以下のようにすることで取れました
Keyで取ってあげる必要があるみたいです

```kotlin
        fun getMapping(indexName: String): String {
            val request = GetIndexRequest("${indexName}*")
            val response = client.indices().get(request, RequestOptions.DEFAULT)
            return response.mappings[indexName]?.source().toString()
        }
```

# おわりに
1年前まではデバック起動をしたことなかったですが、いまは使いこなせるようになりました
成長を実感します

# 参考

https://devlog.atlas.jp/2021/10/13/4015
TypeScript の never 型について

# never 型は何も代入できない
公式ドキュメント
https://typescriptbook.jp/reference/statements/never

変数としてシンプルに定義した場合はその通りある。
もちろんこれは代入することができない
```ts
let a: never = 2
```

しかし、この型の使い道がよくわからないので
使い道を教えてもらった。

しかし、実際の場面で利用することは推奨されていないので極力使わないことを目標にしたい。

## 使い道：最後まで到達できない関数の戻り値として使う

何も代入できない、つまり戻り値として void を持つこともできない
故にこの関数 hoge 最後まで到達することができない関数を定義することができる

例えばエラーを発生させるための専用のメソッドなどだ。

```ts
// 戻り値が never の関数を呼ぶ場合は try catch をしようと人間がわかりやすい
function hoge(): never {
  // 最後まで関数が定義できてしまう場合エラーになる
  // never を戻り値にした場合コンパイラがこの関数を最後まで実行されないことを検知できる
}
```

## メリット
* 戻り値が never の関数を呼ぶ場合は try catch をしようと人間がわかりやすい
* 最後まで関数が定義できてしまう場合エラーになるためわかりやすい
* never を戻り値にした場合コンパイラがこの関数を最後まで実行されないことを検知できる


## 当然利用しようとしてもエラーになる

この様に利用した時も a = 3 は到達不可能なコードとしてエラーが表示される
```ts
hoge();
let a = 3

function hoge(): never {}
```

## 使い道模索中
ざっと学びのメモをした程度なので何かあればリンクなどを貼ってもらえればと思います。

## 型の絞り込み（エラーハンドリング？）
こちらも現実的では無い

```ts
type Success = {
  success: true;
  value: number;
};

type Error = {
  success: false;
  errorMessage: string;
};

function getResult(): Success | never {
  if (Math.random() > 0.5) {
    return { success: true, value: 42 };
  } else {
    // 実際にはここでエラーを投げるか、Error型のオブジェクトを返すべき
    throw new Error("Operation failed");
  }
}

try {
  const result = getResult();
  console.log(result.value); // Success型のプロパティに安全にアクセスできる
} catch (error) {
  console.error(error);
}

```


## 型の除外
```ts
type AllTypes = string | number | boolean;
type WithoutBoolean = Exclude<AllTypes, boolean>;

function processValue(value: WithoutBoolean) {
  console.log(value);
}

processValue("test"); // OK
processValue(123); // OK
// processValue(true); // エラー: 型 'boolean' の引数を型 'string | number' への割り当て不可
```


# 活用例（無理やり使うなら）


```ts

function filterArray<T>(items: T[], predicate: (item: T) => boolean): T[] | never[] {
  const result = items.filter(predicate);
  if (result.length > 0) {
    return result;
  } else {
    // 条件に一致する要素がない場合、空の配列を返す
    // この時点での型は `never[]` と推論されるが、関数の戻り値の型としては `T[] | never[]` を許容
    return [];
  }
}

// 使用例
const numbers = [1, 2, 3, 4, 5];
const filteredNumbers = filterArray(numbers, num => num > 3);

// この時点で filteredNumbers は `number[] | never[]` 型となる
if (filteredNumbers.length > 0) {
  // 型ガードにより、このブロック内では filteredNumbers は `number[]` 型として扱われる
  console.log(filteredNumbers);
} else {
  // 空の配列が返された場合、ここで処理を行う
  console.log('条件に一致する要素はありませんでした。');
}
```
【初心者向け】Javascriptのよくあるエラーと解決策

### 1.SyntaxError: Unexpected token
このエラーは、JavaScriptの構文が正しくない場合に発生します。例えば、カッコやクォーテーションの閉じ忘れ、不適切なコンマの使用などが原因で起こります。
例)
![スクリーンショット 2024-02-08 17.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/149d82d3-4f22-2354-5632-850791d49bd5.png)
上記のコードは閉じ括弧のつけ忘れです。

![スクリーンショット 2024-02-08 17.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/bbf3f67d-be1d-1308-712d-f6bf136d8d9d.png)
こちらはbとcの間に,がありません。

#### 解決策: エラーメッセージで指摘された行と列を確認し、構文が正しいかどうかを慎重にチェックします。ちょっとしたミスですが一番多く起こりうるエラーかなと思います。

### 2.ReferenceError: xxx is not defined

例）
![スクリーンショット 2024-02-08 17.42.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/62528b36-4281-8b28-8ca0-3a335c3b1b98.png)
このコードでは、blockScopedVariableはifブロック内でletを使って宣言されています。letおよびconstで宣言された変数はブロックスコープを持つため、ブロックの外からはアクセスできません。

#### 解決策: 変数が正しく宣言されているか確認し、スコープ内で利用可能かどうかをチェックします。

### 3.TypeError: Cannot read property 'xxx' of undefined

例)
![スクリーンショット 2024-02-08 17.46.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/2481fdd1-c74a-e6c4-2501-777aac3506f6.png)
未定義のオブジェクトからプロパティを読み取ろうとしたときにこのエラーが発生します。
myObjectに値が代入されていない状態で呼び出しているためmyObjectはundefinedになります。

#### 解決策: オブジェクトが適切に定義され、初期化されているかを確認します。また、オブジェクトが期待されるタイミングで利用可能かどうかもチェックします。

### 4.RangeError: Invalid array length

![スクリーンショット 2024-02-08 17.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/cc1cbe76-e62e-9940-55f9-4e3abfe9d699.png)
例)
配列の長さが無効な値に設定された場合にこのエラーが発生します。
負の数を配列の長さとして設定した場合や大きすぎる値プロパティの値が無効な場合にこのエラーが吐き出されます。

#### 解決策: 配列の長さを設定する際に、正の整数を使用しているか確認します。

### 5.TypeError: xxx is not a function
例)
![スクリーンショット 2024-02-08 17.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513156/bc646063-25ed-6159-00e8-45ed76dde988.png)
変数を関数として呼び出そうとしたが、その変数が関数ではない場合にこのエラーが発生します。
存在しないメソッドの呼び出し、タイプミスなどでもこのエラーは発生します。

#### 解決策: 変数が関数として正しく定義されているかを確認します。また、変数名が予約語や他の変数と衝突していないかもチェックします。

---------------
記事を読んでくださった方は、是非弊社開発課のXもフォローしてね:ぽっ:
毎日エンジニアに向けた情報発信を行っています:バンザイ::肌色-2:
https://twitter.com/tech_cin
PATHを:から改行にして表示→grepで該当行を抽出するワンライナー

自分用の覚え書きも兼ねて…
- 実行環境：Mac, Terminal, Zsh

## PATHの中身を見て色々チェックしたい欲求
今までに色々と導入してきていると、PATHがぐちゃぐちゃで数百文字を超えることもあります。

あれ設定していたっけ？と探すとき、echoしてgrepにパイプして…とやってもヒットすると結局1行なので、PATHの全てが表示されてしまいます。
そういうときは、`:`で分割して改行した後にgrepして抽出したいですよね。
ワンライナーでやりたいな…

ということで、まずは`:`を`\n`に置き換えるワンライナー。

2024/2/20 追記：[もっと短い例をコメントで教えていただきました！](https://qiita.com/midorizuki/items/211819e7294bdd05113d#comment-0134d52c95f8a16b98ff)
それがこちら↓
```shell
tr : '\n' <<<$PATH
```
```result.txt
/Users/username/.gem/ruby/3.2.2/bin
/Users/username/.rubies/ruby-3.2.2/lib/ruby/gems/3.2.0/bin
/Users/username/.rubies/ruby-3.2.2/bin
/Users/username/.docker/bin
/Users/username/Library/Python/3.9/bin
/Users/username/addon/chrome_driver
/opt/homebrew/opt/openjdk/bin
/opt/homebrew/bin
/opt/homebrew/sbin
/usr/local/bin
~ 以下略 ~
```
各実行ファイルのパスが改行付きになり、見やすくなりました。

他にも複数の例を挙げていただきました。こんなに多様なやり方があるんですね…！
> ```shell
> echo "$PATH" | awk -v RS=: 1
> awk -v RS=: 1 <<<$PATH
> echo "${PATH//:/$'\n'}"
> printf '%s\n' $path # zsh専用
> ```
<details><summary>追記前のコマンドを開く。</summary><div>

```shell:semicolon_to_newline.sh
echo $PATH | awk -v 'RS=:' -v 'ORS=\n' '{print$0}'
```
`awk`のオプションのRecord Separatorを`:`、Output Record Separatorを`\n`に設定すると置換できるので、あとは`print`で全部表示しています。
</div></details>

### 改行抽出ワンライナー
先程引用した例にgrepをパイプするだけ！
```shell
tr : '\n' <<<$PATH | grep local
```
```result.txt
/usr/local/bin
/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin
/usr/local/texlive/2023basic/bin/universal-darwin
```
この例だと、`local`が含まれているPATHを抽出しています。自由に置き換えてください。
これで万事解決しましたね！
<details><summary>追記前のコマンドを開く。</summary><div>

そして、grepでの抽出まで含めたのが次のワンライナー。
```shell:extract.sh
echo $PATH | awk -v 'RS=:' -v 'ORS=\n' '{print$0}' | grep local
```
</div></details>
Javaの文字列表記方法

# 始めに
Javaには他言語と同様に文字列を表記するための型が存在します。
それがString型です。

# String型
数値型と文字型のように、型が異なるものを表記する際の特徴があります。
それが""と+を用いた文字列の連結です。

例えば　私の戦闘力は53万です。　とString型で表記したい場合、
~~~
"私の戦闘力は" + 53 + "万です。";
~~~
と表記されます。
Node-REDでBluesky APIを使ってみた

# はじめに
BlueskyというSNSが流行ってるらしいので、今度こそ匿名でアカウントを作ろうと思いました。
で、SNSと言えばやっぱりAPIですね。自宅でPoC最強のNode-REDでAPI使ってみました。

# 前提環境
- Node-RED v3.0.2

# フロー作成
blueskyのAPIは以下に公式ドキュメントがあります。

https://www.docs.bsky.app/docs/get-started

簡単な感じですね。作成したフローはこんな感じです。

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/9708a9e0-451c-a59f-000f-88b0c3f7d024.png)

フローの上段、下段に分けてノードの内容を開きます。

- 上段の処理 (changeノード、templateノード、http requestノード)
※ハンドル名とパスワードはご自身のものを設定してください
![タイトルなし2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/6d50b8b4-3bfa-db3a-28fc-71c3251197d2.png)


- 下段の処理 (changeノード、templateノード、http requestノード)
![タイトルなし3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/07b8c910-f4c5-2ed2-d415-b71abaaa49bd.png)

# 結果
やはりNode-REDはお手軽で最強ですね。(自宅での話)

![タイトルなし4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/fde69c2a-9729-e66e-434b-3b1cd470ae67.png)

# おわりに
非常に名前が似ている、「BlueSky API」というものがあって、こちらは天気予報のAPIのようです。

https://blueskyapi.io/docs/api

ええ、間違えてアカウント作りました😢
mogrifyコマンドが実行できない

ある業務で大量の画像を一括で同じ幅にしたくなりImageMagickをインストールした。

ImageMagickではターミナルやコマンドプロンプトで画像の横幅、縦幅をコマンド入力で変更できたりするツールだ。

その中でも「mogrify」コマンドを使用すると、一括で処理できるが、実行できず少しはまった。

実行すると下記のようなエラーが出たのである。

```
>mogrify -resize 540 *w540px.png
'mogrify' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

コマンドについて簡単に説明すると下記の通りだ。
mogrify:一括で画像の処理をするコマンド
-rsize:サイズの変更をするというオプション。数値が一つだけ記載されているとき、その数値は横幅として扱われる。

変更対象ファイルについてだが、今回対象のディレクトリの中にはファイル名の末尾が「w540px」となっているものが大量にあり、すべて処理してしまいたかったので、正規表現を使い「*w540px」としている。

```
mogrify -rsize 変更後の横幅 変更対象のファイル
```

# 解決策1 legacy utilitiesにチェックして再インストール
再インストールを行うが、赤線を引いた項目をチェックした状態にする必要がある。

![スクリーンショット 2024-02-08 173504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/c0277a1c-b7d0-5d5f-0e14-3a4b26a0b30b.png)

このとき既存のImageMagickの再インストールは不要で、ダウンロードしたImageMagickのexeファイルを実行すればよい。「install」を押した際に表示される下記のポップアップは前にインストールしたImageMagickのファイルが同名なので上書きしてよいかということを聞いているので、「Do this for the next conflicts」にチェックし、「Overwrite the existing file」をクリックすればよい。

![スクリーンショット 2024-02-08 173826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/03b2f3fd-9fb2-1451-1ed0-427e1c82fff1.png)

参考記事↓
https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=29620
# 解決策2 パスを通す

下記の記事に従ってパスを通そう。
https://blog.nyanco.me/imagemagick-command-image-process/#toc16
【ST言語ことはじめ】ワードデバイスのアドレス指定

## はじめに

本記事では、ワードデバイスのアドレス指定について解説します。ワードデバイスのアドレス指定は、プログラム内で特定のデータを指定する際に使用されます。

## 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けは[こちら](https://qiita.com/so2/items/0f0cab2e324179718b89)を参照してください。

## ワードデバイスのアドレス指定とは

ワードデバイスのアドレス指定は、プログラム内で特定のデータを指定するために使用されます。例えば、D1.3はD1の4つ目のビットを指します。桁指定は0から始まります。

## サンプルコード

```ST
IF SM402 THEN
    D1.0 := TRUE; (* 桁指定は0から始まる *)

    K1Y40 := D1; (* 1スキャンのみ実行で今後の値の変更に影響されないようにする *)
END_IF;

D1.3 := TRUE; 

K1Y44 := D1; (* 同じD2を出力するが、先の実行が1スキャンに限定されているため異なる値を渡すことができる *)

D2.4 := TRUE; (* 4は5桁目になるのでK1の範囲を超えてしまう。桁数には注意が必要 *)

K2Y48 := D2;
```

## ワードデバイスのアドレス指定の注意点

ワードデバイスのアドレス指定を行う際には、桁数に注意する必要があります。例えば、D3.4の場合、4は5桁目になるため、K1の範囲を超えてしまいます。これにより予期せぬデータ破壊などの危険があります。

## まとめ

ワードデバイスのアドレス指定は、PLCプログラムにおいて重要な役割を果たします。正確な指定と注意深い取り扱いが必要です。
【ST言語ことはじめ】特殊リレーを使ってみる

\## はじめに

この記事では、特殊リレーの利用法について解説します。特殊リレーは、プログラマブルロジックコントローラー（PLC）でさまざまな制御タスクを実行するための便利な機能です。特殊リレーの種類と利用方法について詳しく見ていきましょう。

## 使用機材

|   |機種など   |  
|:---:|------|  
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |  
|アプリ  |GX Works 2    |  

I/O割り付けは[こちら](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")を参照してください。

## 特殊リレー
MELSEC-Qシリーズのデバイス番号です。

| | 説明 | デバイス番号 |
|---|---|:-:|
| 常時ON | RUN中は常にONの状態 | SM 400 |
| 常時OFF | RUN中は常にONの状態 | SM401 |
| RUN後に１スキャンON | RUNの最初のスキャンのみ | SM402 |
| RUN後に１スキャンOFF | RUNの最初のスキャンのみ | SM403 |
| クロック | 0.01秒 | SM409 |
|  | 0.1秒 | SM410 |
|  | 0.2秒 | SM411 |
|  | 1秒 | SM412 |
|  | 2秒 | SM413 |
|  | 2n秒 n:SD414(sec) | SM414 |
|  | 2n(ms) n:SD415(ms) | SM415 |

## 特殊リレーの利用法

### SM400, SM401

```st
Y70 := SM400; (* 常時オン *)
Y71 := TRUE;  (* 常時オン *)

Y72 := SM401; (* 常時オフ *)
Y73 := FALSE; (* 常時オフ *)
```

SM400は常にオンの特殊リレーです。このリレーは、プログラムの実行中は常にオンの状態を保ちます。
ラダー図では常時点灯ランプなどの時に母線との間に何かをかまさないといけない都合上使うようですが、ST言語ではTRUEの代入で

### SM402を使った例（初期値設定）

以下のプログラムは、SM402を利用して初期値を設定する例です。

```st
IF SM402 THEN
    M0 := TRUE; 
    CN1 := 1;
    D1 := 500;
END_IF;
```

このプログラムでは、プログラムが最初に実行されるときに、M0をTRUEに設定し、CN1に1を、D1に500を初期値として設定します。
PLCでは電源投入時に内部デバイスなどは初期化されてFALSEや０の状態ですが、他の言語などで初期化の習慣がついていると、”宣言のない状態”が気持ち悪いので、SM402を利用して明示します。

### 1秒ごとに点灯するランプ

以下のプログラムは、SM412とSM413を利用してランプの点灯を制御する例です。
クロックの秒数は周期の長さなので1秒クロックの場合は0.5秒のONと0.5秒のOFFを繰り返します。

```st
IF SM412 THEN
    M0 := TRUE;
ELSE
    M0 := FALSE;
END_IF;

Y70 := M0;

Y71 := NOT SM413;
```


## まとめ

特殊リレーは、PLCプログラミングでさまざまな制御タスクを柔軟に実現するための重要な要素です。適切に活用することで、効率的なプログラムの作成が可能となります。是非、プロジェクトに応じて特殊リレーを活用してみてください。
.NET 8におけるextern

externは、C#で外部のアセンブリに含まれる関数やメソッドを参照するために使用されるキーワードです。通常、externは非マネージコード（例えば、C/C++で書かれたDLL）との連携に用いられ、C#のコード内で非マネージコードの 関数を呼び出すために使用されます。

```csharp
MessageBox(IntPtr.Zero, "Hello, extern!", "Info", 0);
[DllImport("user32.dll")] static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
```

実行結果：
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBHbEsu6Vkc3hNCGuIGveE3vvT2h1ZTHX9ujalgvSs0ibQJjqhXDZz3uVoywYs0UbTspmBRfAQT1icA/640?wx_fmt=png)

.NET 8では、externの使用が拡張され、UnsafeAccessorを使って.NETで書かれたDLLを簡単に呼び出すことができます。

```csharp
using System.Runtime.CompilerServices; using System.Runtime.InteropServices;
var test = new TestClass();
Console.WriteLine(GetTime(test)); //プライベートメソッドの呼び出し
Console.WriteLine(GetNo(test)); //プライベートフィールドの読み込み
GetNo(test) = 20; //プライベートフィールドへの割り当て
Console.WriteLine(GetNo(test));
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "GetTime")] static extern DateTime GetTime(TestClass test);
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_no")] static extern ref int GetNo(TestClass test);
public class TestClass
{
    int _no = 10;
    DateTime GetTime()
    {
        return DateTime.Now;
    }
}
```

現在、UnsafeAccessorKindがサポートするタイプは以下の通りです：

```csharp
namespace System.Runtime.CompilerServices
{
    public enum UnsafeAccessorKind
    {
        Constructor = 0,
        Method = 1,
        StaticMethod = 2,
        Field = 3,
        StaticField = 4
    }
}
```

この機能は、一見するとリフレクションに似ていますが、リフレクションよりも単純で、シグネチャのマーキングだけでよいです。

```csharp
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static System.Net.Mime.MediaTypeNames;
BenchmarkRunner.Run<Test>();
public class Test
{
    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "GetTime")] public static extern DateTime GetTime(TestClass test);
    [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_no")] public static extern ref int GetNo(TestClass test);
    [Benchmark]
    public void UnsafeTest()
    {
        var test = new TestClass();
        var t = GetTime(test);
    }
    [Benchmark]
    public void RefTest()
    {
        var test = new TestClass();
        var type = test.GetType();
        var method = type.GetMethod("GetTime", BindingFlags.NonPublic | BindingFlags.Instance);
        var t = method?.Invoke(test, new object[0]);
    }
}
public class TestClass
{
    int _no = 10;
    DateTime GetTime()
    {
        return DateTime.Now;
    }
}
```

以下は、BechamrkDotNetを使用してリフレクションとUnsafeAccessorの方式の性能を比較したものです。やはり、性能はずっと優れています。

![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBHbEsu6Vkc3hNCGuIGveE3ozwia4cFUlKE9sDaiaTcI24iboA9n2MgQXgR3JekHttmxPQYSLsvlAgicQ/640?wx_fmt=png)

(Translated by GPT)
LambdaでPandasとMatplotlibを使う時の注意点

# はじめに

LambdaでPandasとMatplotlib(外部ライブラリ)を使おうとしたときにハマったので、備忘録として残しています。

# Lambdaの『250MB制限』の壁
>デプロイパッケージ (.zip ファイルアーカイブ) のサイズ
>50 MB (zip 圧縮済み、直接アップロード)
>250 MB (解凍後)
>このクォータは、レイヤーやカスタムランタイムなど、アップロードするすべてのファイルに適用されます。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html

# 外部ライブラリは『Layer』を用意する
**Pandas**
- AWSレイヤー(AWS が提供するレイヤー)
- ARN指定(arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p39-pandas:22)

**Matplotlib**
- ARN指定(arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p39-matplotlib:1)

:::note info
AWSレイヤーでPandasを利用すると、Matplotlibのレイヤーが追加できない(250MB制限があるため)
ARN指定でPandasとMatplotlibを利用すれば、250MBに収まるらしい
:::

## 参考

https://github.com/keithrozario/Klayers
Go言語での重複排除処理とカスタムマップ型の利用

## はじめに
配列やスライスから重複する要素を排除したい場面って、意外としばしば出くわしますよね。今回は、そんな時に役立つ`CustomMap`型を使った解決方法をご紹介します。


### `CustomMap`型の定義
まずはじめに、重複をスマートに管理し、すっきりと排除するための`CustomMap`型を定義してみましょう。この型は、`map[string]bool`をうまくラップして、文字列のキーに`true`を割り当てます。キーが自動的に一意になるので、これを使えば重複排除の土台がしっかりと築かれます。

```go
type CustomMap map[string]bool
```

### `NewCustomMap`関数の実装
重複排除の鍵となるのは、`NewCustomMap`関数です。この関数が、与えられた文字列リストから新しい`CustomMap`インスタンスを作り上げるんです。文字列をマップのキーとして使うことで、キーの一意性が保証されます。**Goのマップでは、各キーは一意でなければならず、同じキーに対して値を再度設定しようとしても、最初の値が上書きされるだけで、新しいエントリーは追加されません。** この性質を利用することで、与えられた文字列リストの中で重複している要素があっても、`CustomMap`にはそれぞれの要素が一度だけ格納され、結果として重複がないスッキリした状態が作り出されます。つまり、`NewCustomMap`関数内でリストの各要素を順に処理し、マップに追加する際、重複する要素が自動的に排除されるわけです。


```go
func NewCustomMap(items []string) CustomMap {
    m := make(CustomMap)
    for _, item := range items {
        m[item] = true
    }
    return m
}
```

### `GetKeys`メソッドの定義
そして、`CustomMap`に保管された一意なキーを取得するためのメソッドです。
```go
func (m CustomMap) GetKeys() []string {
    keys := make([]string, 0, len(m))
    for key := range m {
        keys = append(keys, key)
    }
    return keys
}
```

### 実際のコードと処理結果の表示
さて、実際に重複を含む文字列スライスを用意して、`CustomMap`を通じてどう変わるか見てみましょう。
```go
package main

import (
    "fmt"
)

type CustomMap map[string]bool

func NewCustomMap(items []string) CustomMap {
    m := make(CustomMap)
    for _, item := range items {
        m[item] = true
    }
    return m
}

func (m CustomMap) GetKeys() []string {
    keys := make([]string, 0, len(m))
    for key := range m {
        keys = append(keys, key)
    }
    return keys
}

func main() {
    // 重複を含む文字列スライス
    items := []string{"apple", "banana", "apple", "orange", "banana", "grape"}

    // CustomMapを利用して重複を排除し、一意なアイテムのスライスを取得
    uniqueItems := NewCustomMap(items).GetKeys()

    // 結果の表示
    fmt.Println("元のスライス:", items)
    fmt.Println("重複排除後のスライス:", uniqueItems)
}

// 元のスライス: [apple banana apple orange banana grape]
// 重複排除後のスライス: [apple banana orange grape]
```

### まとめ
`CustomMap`型を利用することで、`map[string]bool`のキーの一意性を上手く活用し、重複を効率的に取り除くことができます。このシンプルだけど強力な手法で、Goにおけるデータ処理をもっとスマートに進めましょう。

### 参考資料
https://go.dev/doc/effective_go#maps

https://gobyexample.com/maps

https://go.dev/blog/maps
mysqlのSQLをoracleで書く（一覧）

# concat
文字列を結合する。Oracleでは２つしか結合不可。
~~~
CONCAT(char1, char2)
~~~

Oracleで３つ以上の文字列を結合する場合は||を使用
~~~
char1||char2||char3
~~~
# format date_format　time_format
値を指定のフォーマットで整形した文字列を取得する。
~~~
FORMAT(string,format)
DATE_FORMAT(date,format)
TIME_FORMAT(time,format)
~~~
OracleではTO_CHARを用いる。
また、フォーマットに%Yや%hは使えない。（YYYY/MM/DDなどを使用）
~~~
TO_CHAR(date, 'YYYY/MM/DD')
~~~
# IFNULL
値がNULLか判別する。
~~~
IFNULL(カラム名, ‘置き換える値’)
~~~
OracleではNVLを用いる。
~~~
NVL(カラム名, ‘置き換える値’)
~~~
coalesceという関数もあるらしい。こちらはmysql,oracle両方で（標準SQLなので他DBでも）利用可能。
https://qiita.com/Qu4rtz_MC5/items/714c57030add17c7ab8d#comment-b3cdd790132a51d09637
~~~
COALESCE(カラム名, '置き換える値')
~~~
# テーブルに別名を付ける
Oracleではテーブルの別名を付ける際にASを使えない模様。ASの代わりに空白を入れる。
~~~
SELECT * FROM tbl tbl1
~~~
【JavaScript+SupaBase】データベースのレコードを削除する方法

# はじめに
現在JavaScriptとReactで学習内容＆学習時間を記録するアプリを作成中です。
DBはSupabaseを使用しています。
今回は **「ブラウザ上で削除ボタンを押下した時に、リストの要素に加えてSupabase上のレコードも削除する」処理**について説明します。
# 問題
公式のドキュメントに書き方を載せてくれています。（TypeScript版もある）

https://supabase.com/docs/reference/javascript/delete

ドキュメントの例文はこちらになります。
この場合「countoriesテーブルの中から、id=1のデータを消去する」という意味です。
**この.eq() メソッドは、特定のフィールドが特定の値と等しい条件を指定するために使用されます。**（今回の条件だと id=1 ですね）
**ですが、今回は指定した条件を満たす行を削除したいです。**
```
const { error } = await supabase
  .from('countries')
  .delete()
  .eq('id', 1)
```
# 解決方法
.eq() メソッドの代わりに、 **.match() メソッド**を使用します。
**.match() メソッドは指定された条件に一致する行を削除するために使用されます。**

下記のように修正しました。
今回の流れとしては **「study-recordテーブルから、指定されたstudyContentとstudyTimeの値に一致するレコードを削除する」** 処理になります。
```js:supabaseFunctions.js
export const deleteRecords = async (studyContent, studyTime) => {
  await supabase
    .from('study-record')
    .delete()
    .match({studyContent, studyTime}); // .eq() の代わりに .match() を使用
};
```
# おわりに
以上が**特定のフィールド・値を消去する処理ではなく、特定の条件を満たすレコードを削除する方法**になります。
Vue勉強 算出プロパティ computed

(Vue.js 3.1.5を使用)
算出プロパティ computed

computedを使わない場合、
```html:html
    <div id="app">
        <p>{{message.toUpperCase().split('').reverse().join('')}}</p>        
    </div>
```
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/e03d9d19-87f5-02a8-495f-860f938b93a8.png)

computed を利用する場合、
```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        message: 'Good morning Vue.js!'
    }),
    computed:{
        upperCaseReversedMessage: function(){
            return this.message.toUpperCase().split('').reverse().join('')
        }

    }
})
app.mount('#app')
```

```html:html
    <div id="app">
        <p>{{message.toUpperCase().split('').reverse().join('')}}</p>
        <p>{{upperCaseReversedMessage}}</p>
        <p>{{upperCaseReversedMessage}}</p>
    </div>
```
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/c834f9b4-4e1c-bb4c-c8b5-281d9a55ec4b.png)

3つとも同じ文字列が表示される。

### methodsとの違い。

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        message: 'Good morning Vue.js!'
    }),
    computed:{
        upperCaseReversedMessage: function(){
            return this.message.toUpperCase().split('').reverse().join('')
        }
    },
    methods:{
        upperCaseReversedMessageMethod: function(){
            return this.message.toUpperCase().split('').reverse().join('')
        }
    }
})
app.mount('#app')
```

```html:html
    <div id="app">
        <p>{{upperCaseReversedMessage}}</p> 
        <p>{{upperCaseReversedMessageMethod()}}</p> 
    </div>
```
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/c309a9dd-9821-8b80-0729-942e5c0dbd98.png)

#### 1 呼び出し方
methodsの場合は、呼び出すときにかっこ()が必要。
`upperCaseReversedMessageMethod()`
computed は、プロパティなので、呼び出すときにかっこ()は不要。
`upperCaseReversedMessage`

以下、その他の違い。
#### 2 getter,setter
computed はプロパティなので、getter,setter両方ある。
methods はメソッドなので、getterだけ。

#### 3 キャッシュ
computed　キャッシュあり
methods　キャッシュなし
【Nessus】NessusのPluginsが更新できないときの対処

# 問題
脆弱性診断用の**Nessus Essential**（Windows PCにインストール）のPluginsが更新できなくなっていた。
バージョン：**10.6.4 (#5) WINDOWS**

画面から手動で更新しようとしても以下のエラーメッセージが表示されるし……
```
Error:Your Plugin feed hasn't been updated in XXX days.
```
CUIから更新しようとすると、以下エラーが表示された。ライセンスが無効になっているようだ。
```
PS C:\Program Files\Tenable\Nessus> .\nessuscli update --plugins-only
Refreshing Nessus license information... [error] Nessus License: The server returned an error: Invalid credentials
failed!
```

# 対処
(windows版で記載)
`C:\Program Files\Tenable\Nessus`にWindows版Nessusのフォルダがある。以下は管理者権限で実行。

##### ① Nessusを停止、リセット、起動する。
```
PS C:\Program Files\Tenable\Nessus> net stop "Tenable Nessus"
Tenable Nessus サービスを停止中です.
Tenable Nessus サービスは正常に停止されました。

PS C:\Program Files\Tenable\Nessus> .\nessuscli fix --reset
Resetting Nessus configuration will permanently erase all your settings and cause Nessus to become unregistered.
Do you want to proceed? (y/n) [n]: y
Successfully reset Nessus configuration.

PS C:\Program Files\Tenable\Nessus> net start "Tenable Nessus"
Tenable Nessus サービスを開始します.
Tenable Nessus サービスは正常に開始されました。
```
※ リセットするが、これまでの設置値や診断データは消えない.
##### ② Nessusにアクティベーションコードをセットすると、更新が始まる。
```
PS C:\Program Files\Tenable\Nessus> .\nessuscli fetch --register アクティベーションコード

Your Activation Code has been registered properly - thank you.
Refreshing Nessus license information... complete; continuing with updates.
```
アクティベーションコードは、Nessus Essential登録時の以下メールに記載されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431251/4c5a42e7-89c8-67ff-54ed-6daa3d5f6759.png)
PluginsやNessus自体の更新が完了すると、以下のメッセージが表示される。
```
* Nessus Plugins are now up-to-date and the changes will be automatically processed by Nessus.
* Nessus Core Components are now up-to-date and the changes will be automatically processed by Nessus.
```
※ 私はアクティベーションコードを登録するだけで更新が開始されたが、登録後、念のため以下コマンドでも更新できる。
```
PS C:\Program Files\Tenable\Nessus> .\nessuscli fetch --check
PS C:\Program Files\Tenable\Nessus> .\nessuscli update --all
```

##### ③ Nessusをリビルドする。
```
PS C:\Program Files\Tenable\Nessus\nessusd -R
```
私の場合、更新後にリビルドしないと、NessusのWeb画面にアクセスできなかった。
# 参考
LinuxやMacでも、以下手順を参考にすれば、おそらくOK
https://community.tenable.com/s/article/Nessus-feed-reset-to-fix-plugin-issues-or-error?language=en_US
(QA)IFSのオブジェクトをSAVFにバックアップできますか？

最近うちに若い技術者＠20代の若いほうが（しかもみんな技術者としてすごく前向きな！）が沢山はいってきました。
オヤジはこれまで考えたこと（やったこと）もない事を色々聞かれ、ああ、そうなんだ、とあらためて考え直す事がよくあります。これもその一つです。

## 質問：狭義のIFSのオブジェクトをSAVFにバックアップできますか？

実際の質問はこんなで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/344916af-8a30-be3d-59ff-1e6d52c47b90.png)

いやー、やったことなかったです。

## 回答：できます。ただし、、、

SAVLIB,SAVOBJではできません（狭義のIFSなので当然ですが）。
SAVコマンドを使ってバックアップができます。（できました）。

これはやったことなかったのでできると思うよ～、でしたのでやってみたのが以下です。

### SAVコマンドで装置パラメーターにSAVF を指定できます

こんな感じですね。
`SAV DEV('/QSYS.LIB/GOMALIB.LIB/GOMASV2.FILE') OBJ(('/HOME/GOMA'))  `

SAVFの名前を上記のようにふつうにIFS形式で XXX.FILEと記述するだけです。
SAV DEV('/QSYS.LIB/GOMALIB.LIB/GOMASV2.FILE') OBJ(('/HOME/GOMA'))  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/879d46b2-904b-90ad-ee93-97bc83f1918b.png)


SAVFの保管結果もバッチリ見ることができました。（あたりまえ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7fa368ea-7103-0431-8736-ccba6de161be.png)


温故知新といいますが、若い人と一緒するのは楽しいですね♪
BlueskyにAPIを使ってPythonから投稿してみる

Bblueskyが招待なしで使えるようになったとのことでドキュメント読み始めてみました。
まずはAPIを使ってPythonから投稿してみます。

# 環境
OS macOS 14.2.1
Python 3.12.1
pip 24.0

Pythonで開発する環境は整い済み、Blueskyもアカウント作成済みとして始めます。

# atprotoのインストール
まずはBlueskyが使っているAT Protoclを扱うためのライブラリをインストールします。

```
% pip install atproto
```

```
Collecting atproto
  Downloading atproto-0.0.40-py3-none-any.whl.metadata (14 kB)
Collecting click<9,>=8.1.3 (from atproto)
  Downloading click-8.1.7-py3-none-any.whl.metadata (3.0 kB)
Collecting cryptography<42,>=41.0.7 (from atproto)
  Downloading cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl.metadata (5.2 kB)
Collecting dnspython<3,>=2.3.0 (from atproto)
  Downloading dnspython-2.5.0-py3-none-any.whl.metadata (5.8 kB)

 ~~~（省略）~~~

Installing collected packages: websockets, typing-extensions, sniffio, pycparser, libipld, idna, h11, dnspython, click, certifi, annotated-types, pydantic-core, httpcore, cffi, anyio, pydantic, httpx, cryptography, atproto
Successfully installed annotated-types-0.6.0 anyio-4.2.0 atproto-0.0.40 certifi-2024.2.2 cffi-1.16.0 click-8.1.7 cryptography-41.0.7 dnspython-2.5.0 h11-0.14.0 httpcore-1.0.2 httpx-0.25.2 idna-3.6 libipld-1.1.0 pycparser-2.21 pydantic-2.6.1 pydantic-core-2.16.2 sniffio-1.3.0 typing-extensions-4.9.0 websockets-12.0
```
以上でインストール完了です。
エラーが出たらPythonだったりpipのバージョンが古いかもしれません。
Pythonは3.7.1以上が必要なので、そのあたりを確認してみてください。

# ソースコード
早速ソースコードを書いてみます。
今回はbskyPost.pyという名前でファイルを作成します。
```:bskyPost.py
from atproto import Client

client = Client()
client.login('ユーザ名orメールアドレス', 'パスワード')

client.send_post(text='APIからポストしてみた')
```
これだけです。
各行を見ていきます

 _**from atproto import Client**_
インストールしたatprotoライブラリからClientクラスを使用するためにインポートしています。
Clientクラスについて詳しくはこちら
[atproto_client.Clientクラス](https://atproto.blue/en/latest/atproto_client/index.html#atproto_client.Client)

_**client = Client()**_
Clientクラスを初期化して変数に代入しています。
この初期化で使用するサーバを指定します。
デフォルトではbsky.appを使用するので、
client = Client()とclient = Client('https://bsky.app ')
と同義になります

_**client.login('ユーザ名orメールアドレス', 'パスワード')**_
Blueskyに登録しているアカウントとパスワードです。
アカウントはユーザ名、メールアドレスどちらでも可

_**client.send_post(text='APIからポストしてみた')**_
text=''の箇所に投稿したい文章を入力します。

# 実行
最後にbskyPost.pyを実行します。
```
% python3 bslyPost.py
```

以下のようにポストされると思います
<img width="70%" alt="スクリーンショット 2024-02-08 15.58.57.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/e817cbd1-19dd-3f2c-3e33-dd2bd20608b6.jpeg">


# 参考
・[The AT Protocol SDK ( Getting Start | Introduction)](https://atproto.blue/en/latest/readme.content.html)
・[Bluesky Documentation](https://www.docs.bsky.app)

#
X(旧teitter)が色々と残念な状況になっているので、今回のBluesky招待制終了により、一般ユーザの開発が進んで利便性が増していけばXからの大移動もあるのかもしれないですね。
遅延初期化

# 遅延初期化を使うメリット
アプリケーションの起動時に多くの初期化作業を行うと、ユーザーがアプリの起動を遅く感じる可能性があります。しかし、遅延初期化を使うことで、実際に使用される時までオブジェクトの初期化を遅らせることができ、起動時間を短縮できます。また、実際に必要になるまで初期化を遅らせることで、リソースの無駄遣いを避けることができます。

# 使い方

```swift
class Hoge {
    init() {
        print("Hoge is being initialized")
    }

    func method() {
        何かしらの処理
    }
}

class Fuga {
    lazy var hoge = Hoge()
    
    init() {
        print("Fuga is being initialized")
    }

    func method() {
        hoge.method()
    }
}
```
上記のような2つのクラスを考えます。

```swift
let fuga = Fuga()
// Fuga is being initialized
```
まず、```Fuga```クラスをインスタンス化し, ```fuga```は初期化されます。
この段階で、```Hoge```クラスのインスタンスは作られていますが、初期化はされていません。

```swift
fuga.method()
//Hoge is being initialized
```
次に、```fuga```の```method```を呼び出します。
ここで、```hoge```の```method```にアクセスするので、```hoge```が初期化されます。
```Hoge```クラスにプロパティが存在し、そのプロパティにアクセスした時も同様です。
vscode shortcuts and settings.json


```
// Place your key bindings in this file to override the defaultsauto[]
[
  {
    "key": "cmd+l",
    "command": "workbench.action.terminal.focus",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "workbench.action.previousEditor"
  },
  {
    "key": "shift+cmd+[",
    "command": "-workbench.action.previousEditor"
  },
  {
    "key": "ctrl+tab",
    "command": "workbench.action.nextEditor"
  },
  {
    "key": "shift+cmd+]",
    "command": "-workbench.action.nextEditor"
  },
  {
    "key": "cmd+l",
    "command": "workbench.action.focusActiveEditorGroup",
    "when": "terminalFocus"
  },
  {
    "key": "cmd+l",
    "command": "-expandLineSelection",
    "when": "textInputFocus"
  },
  {
    "key": "ctrl+cmd+v",
    "command": "markdown.showPreview",
    "when": "!notebookEditorFocused && editorLangId == 'markdown'"
  },
  {
    "key": "shift+cmd+v",
    "command": "-markdown.showPreview",
    "when": "!notebookEditorFocused && editorLangId == 'markdown'"
  },
  {
    "key": "alt+cmd+c",
    "command": "copyRelativeFilePath",
    "when": "!editorFocus"
  },
  {
    "key": "shift+alt+cmd+c",
    "command": "-copyRelativeFilePath",
    "when": "!editorFocus"
  },
  {
    "key": "alt+cmd+c",
    "command": "copyRelativeFilePath",
    "when": "editorFocus"
  },
  {
    "key": "cmd+k shift+alt+cmd+c",
    "command": "-copyRelativeFilePath",
    "when": "editorFocus"
  },
  {
    "key": "shift+alt+l",
    "command": "editor.action.insertCursorAtEndOfEachLineSelected",
    "when": "editorTextFocus"
  },
  {
    "key": "shift+alt+i",
    "command": "-editor.action.insertCursorAtEndOfEachLineSelected",
    "when": "editorTextFocus"
  },
  {
    "key": "shift+alt+cmd+right",
    "command": "workbench.action.editorLayoutTwoColumns"
  }
]
```


## settings.json
```json
{
  // 前回のウィンドウを開かない
  "window.restoreWindows": "none",
  "hediet.vscode-drawio.resizeImages": null,
  // 右下の通知を消す
  "csharp.suppressDotnetInstallWarning": false,
  "git.enableSmartCommit": true,
  "git.confirmSync": false,
  "explorer.confirmDragAndDrop": false,
  "editor.wordWrap": "on",
  "diffEditor.wordWrap": "on",
  "chat.editor.wordWrap": "on",
  "files.exclude": {
    "**/.git": false,
    "**/.hg": false,
    "**/.svn": false,
    "**/CVS": false,
    "**/Thumbs.db": false
  },
  "intelephense.files.exclude": [
    "**/.DS_Store/**"
  ],
  "workbench.startupEditor": "none",
  "editor.tabSize": 2,
  "window.zoomLevel": -1,
  "terminal.integrated.enableMultiLinePasteWarning": false,
  "workbench.tree.enableStickyScroll": false,
  "notebook.stickyScroll.enabled": true,
  "editor.stickyScroll.enabled": false,
  "pasteImage.basePath": "${currentFileDir}/images",
  "search.useIgnoreFiles": false,
}
```


font-famiky
```
Menlo, Monaco, 'Courier New', monospace
```
[React] iPad用WEBアプリ開発でのCSS調整！

# はじめに

iPad用のWEBアプリに便利なCSSの調整方法について紹介します！
今回は、ダミーとしてラジオボタンの調整も行います！

# 1. iPad用フィールドの作成

まず、元となるフィールドを作成します！
CSSの為に、各要素にclassを設定しています！


```jsx

import React, { useState } from "react";
import styles from "../styles/MyComponent.module.css";

const MyComponent = () => {
  const [selectedOption, setSelectedOption] = useState("option1");

  const handleOptionChange = (event) => {
    setSelectedOption(event.target.value);
  };
  return (
    <div class={styles.content}>
      <div class={styles.box}>
        <h1>Radio Buttons in Next.js</h1>

        <label class={styles.radioLabel}>
          <input
            type="radio"
            value="option1"
            checked={selectedOption === "option1"}
            onChange={handleOptionChange}
          />
          Option 1
        </label>

        <label class={styles.radioLabel}>
          <input
            type="radio"
            value="option2"
            checked={selectedOption === "option2"}
            onChange={handleOptionChange}
          />
          Option 2
        </label>

        <label class={styles.radioLabel}>
          <input
            type="radio"
            value="option3"
            checked={selectedOption === "option3"}
            onChange={handleOptionChange}
          />
          Option 3
        </label>

        <p>Selected Option: {selectedOption}</p>
      </div>
    </div>
  );
};

export default MyComponent;

```
# 2. CSSファイルを調整
次に、CSSを設定していきます！
iPad用に、820×1180pxで調整しています！

```jsx
/* MyComponent.module.css */
.box {
    background: #eee;
    width: 820px;
    height: 1180px;
  }
  
  .content {
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .radioLabel {
    display: block;
    margin-bottom: 10px;
    margin-left: 5%;
  }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570986/2c462058-0daf-0c59-e8a0-0dc2d5a48833.png)
# まとめ
このように設定することで、boxの領域が、iPad用のスペースとなりました！
今回の記事を参考に、iPad用のwebアプリ開発を行ってみてください！
これからプログラミングで飯を食っていきたい人に入れて欲しいものMac編

最近人にプログラミングを教える機会が増えてきたのですが、その際毎回PCにこれ入れてあれ入れてと指示するのが面倒なので、「とりあえず意味もわからずこれ入れとけ」というものを備忘録的な感じで書いていきたいと思います。

中には有料だったり導入が難しかったり別に初心者はいらなくね？ってものもあるので、本当の初心者の方が何かの間違いでこの記事に来てしまった人は絶対いれるところ以外は無視してもいいかもしれません

# 絶対入れるもの

これからプログラミング始めますの人も絶対に入れてほしい物です。

## VSCode

エディタはよっぽどことがない限りVSCode一択でいいと思う。
HTML/CSSから入る前提でエクステンションは下記を入れておけばとりあえずいいと思う


 - formulahendry.auto-close-tag
 - formulahendry.auto-rename-tag
 - usernamehw.errorlens
 - donjayamanne.githistory
 - ecmel.vscode-html-css
 - mosapride.zenkaku

ちょっと考えたけど本当の初心者の人はVSCodeさえ入っていれば何とかなると思う。
（プロゲートとかから入るならVSCodeすらいらないかも、、、）


# ある程度勉強進めた人が絶対入れてほしい物

HTML/CSSある程度理解できてきて、クラウドワークスとかでLP作る仕事とかできるんじゃね？でももうちょいレベルアップしないと不安、、、みたいな人は絶対に入れてほしいものです


## Github Desktop
どれだけコードを書く知識があっても、Gitが使えない人は「大丈夫かな・・？」と思ってしまうくらいGitは大事で、特にフリーランスで仕事をする上では絶対使えるようにならないといけないです。

CLIのGitは辛すぎるのと、別に経験者でも普通にGUIのほうが見やすいので、GUIで差分などを見れるようになるGithub Desktopはできる限り入れた方がいいのかなと思っています。

https://desktop.github.com/



## MySQL Workbench

DBの中身をGUIで確認するために使います。

以外と世の中無料のものがなくて長い間悩んでいたけど、結局オフィシャルなツールであるMySQL Workbenchが無料で一番使いやすかったです。

見た目が怖いのとあんまり説明がないので初心者はもしかしたらTable Plusを無料で使うとかの方がいいのかもだけど、結局色々不便なのでMySQL Workbenchかなという気がしています。

https://www.mysql.com/jp/products/workbench/




# ある程度勉強進めた人ができれば入れて欲しいもの



## Github Copilot

初心者だろうが何だろうが絶対入れたほうがいい。入れてないやつはすぐ入れろ。 個人的にはChatGPT有料プランよりも全然大事な気がしている。

慣れてきたら「ここまでコメント書けば後はタブ押しマシーンでいいな」とかが分かってくると思うので、さっさと使い始めて早めにGithub Copilotがあるコーディングの感覚を身につけた方がいいと思います。


## Docker Desktop
最近の開発ではほぼ必須になりつつあるDocker。どうせいつか入れることになると思うからさっさと入れておけばいいかなと思い上げました。

https://www.docker.com/ja-jp/products/docker-desktop/


## zsh-autosuggestions

ターミナルの入力補完してくれる。めっっっちゃ便利。

https://zenn.dev/luvmini511/articles/8d427e1faa089f

```
# インストール
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
```

`vi ~/.zshrc`で./zshrcを編集して下記行を一番下に追加（ない場合は新規作成）
```
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
```



# 思い出したら書く

その他いろいろ思い出したら書いていきます。

あとこれも絶対入れたほうがいいというものがあればどんどんコメントしてもらえると非常に嬉しいです
Copilot Studio の会話履歴へのアクセス権限について

こんにちは。日本マイクロソフトの向井です。

Copilot Studio の会話履歴へのアクセス権限がどうなっているか調べてみたので共有します。

:::note warn
非公式情報となりますので、必ずご自身でも最新情報をご確認ください。
:::

# 1. 前提知識
Copilot Studio の会話履歴は、Microsoft Dataverse の Conversation Transcript というテーブルに格納されます。

内容という列にjson形式で会話のトランスクリプト全体が保存されますが、実際の会話の内容はUnicode エスケープシーケンス形式で保存されるため、一般のユーザーの方が見てもぱっと見は分からないようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/fa423951-d4cb-302e-9fd4-4c486dba1035.png)
参考：[会話トランスクリプトを使って作業する](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/analytics-sessions-transcripts)

また、Dataverseへのアクセス権限はセキュリティロールで制御されます。
そのため、どのセキュリティロールにConversation Transcript テーブルへのアクセス権限があるかを調べました。
セキュリティロールについては以下の記事が参考になります。
[Power Platformのセキュリティロールについて](https://qiita.com/skuramoto/items/fe305aac24273c7cccbf)

# 2. 使用したツール
[XrmToolBox](https://www.xrmtoolbox.com/)というフリーソフトを使用しました。
XrmToolBoxについての詳細はこちらの記事では割愛します。

XrmToolBoxには様々な機能が含まれていますが、その中の１つにAccess Security Roles という機能があります。
Access Security Roles を使用すると、画像のように各テーブルへの各セキュリティロールのアクセス権限を調べることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/cdebef6a-c655-5bb0-bc6f-9f5dab508d0a.png)

このままだとわかりづらいので、結果をExcelにエクスポートし、整理しました。

# 3. 結果
全く権限のないロールを除外し、何かしらの権限があるロールだけを抽出すると以下のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/861c00b6-0d41-2b0c-4bd2-0cb88fafb91a.png)

※特に権限を変更等していないため、こちらがデフォルトの設定かと思われます。

実際に運用される際は、[代表的な定義済みロール](https://learn.microsoft.com/ja-jp/power-platform/admin/database-security#environments-with-a-dataverse-database
)やCopilot Studio に関するセキュリティロール、新規に作成したセキュリティロールなどの権限もご確認いただき、適切なロールを割り当てるようにしてください。