OmniAICreator/Qiita-1.07M huggingface dataset:
H2Databaseの組み込みに必要な手順まとめ

H2Databaseの組み込みに必要な手順まとめ

# 手順
1. Jarの配置
2. APサーバーの再起動
3. 組み込み用のプログラムの作成

# JDBCドライバをアプリケーションサーバーに配置

JDBCドライバをApache Tomcat内の「lib」に配置します 。Pleiadesを使用している場合、Apache Tomcatは「<Pleiadesをインストールしたディレクトリ>¥tomcat¥X（Xはバージョン番号）」にインストールされてます。例えば、 PleiadesをC:¥pleiadesにインストールしており、使用しているアプリケーションサーバがApache Tomacat v9の場合は、「C:¥pleiades¥tomcat¥9¥lib」に、JDBCドライバ（h2-x.x.x.jar）を配置してください。



# アプリケーションサーバの再起動

pache Tomcatを再起動して、JDBCドライバを有効にします。サーバービューでサーバーを選択して、「開始」または「再開」を選択します。（アプリケーションサーバーの起動または再起動の詳しい手順は「アプリケーションサーバーの開始/停止/再起動」を参照してください）

[組み込みサンプルコードの記事](https://qiita.com/cappyzawa/items/4ea376e9187f19bd6f59)

https://qiita.com/cappyzawa/items/4ea376e9187f19bd6f59


QiitaのリンクはただURLで記載するだけで見た目いい感じになるの初めて知った。

以上
【受験体験記②】テクニカルコミュニケーション技術検定試験（TC技術検定）「3級 テクニカルライティング試験」

**はじめに**

【受験体験記①】では、試験概要についてまとめました。
今回はテキストの内容や試験対策について書きたいと思います。

**テキスト**

- テキスト:『日本語スタイルガイド（第3版）』　価格：2,860円（税込・送料別）
→HPよりメールまたはFAXでの申込み、または、Amazonにて購入(Amazonの方が送料無料だったためAmazonにて購入しました。)


- データ版:日本語スタイルガイド第3版対応ATOK・JustRight!データ集(筆者はデータ版は使いませんでした)

**試験範囲のウェイトとレベル**
テキストに試験範囲について記載したページがあります。


その中にウェイトとレベルを記載した表があるのですが、その中でも、


- 日本語スタイルガイド(文法、用字・用語、表記、読みやすいライティング、誤解されないライティング)


- テクニカルライティング技術の要点(対象理解に基づくコンテキストの組み立て、読み手のことを考えたライティング、文書の完成度を高める技術)

上記が、レベルは低く、ウェイトは高い分野となります。

筆者は、この範囲を重点的に勉強することにしました。

翻訳しやすく表現する方法について、テキストに載ってはいるものの、試験範囲外でした。

※巻末の練習問題は過去問や模擬試験ではなくあくまで参考、かつ、選択式問題のみのため、記述式の練習はできませんでした。

記述の量がどのくらいかわからないまま試験に挑むという不安。

試験対策セミナーはありますが、手のひらで転がされている感じが気に食わないため受講せずです。（笑）

**勉強時間**

- 練習問題 1〜2時間
はじめに現状把握のため、一旦全部解いてみました。→7割程度の正答率。
文章校正(である調⇔ですます調、丁寧語、受動態⇔能動態)などは平常業務のメール作成レベル。座学的な部分(品詞の区別など)は復習が必要か。

- テキストの読み込み 5時間

- テキスト復習 3時間

- 試験直前に練習問題の再チャレンジと復習 2時間


対策材料が少なくかなり不安しかありませんが、とりあえず受けてみます。


〜〜次回、【受験体験記③】では、試験当日の雰囲気や対策とのギャップについて書きたいと思います〜〜
【Rails】routes.rbで出来る事あれこれ

# ど忘れ防止に、rails routesの備忘録

## 目次
* [Routesとは](#routesとは)
* [Routes.rbでできること](#routesrbでできること)
* [コツや裏技](#コツや裏技)
    * [名前付きルートの活用](#名前付きルートの活用)
    * [オプション](#オプション)
    * [制約条件の活用](#制約条件の活用)
* [最後に](#最後に)

# Routesとは
RailsのRoutesは、アプリケーション内のURLとアクションを関連付けるための仕組みです。RESTful(「 REpresentational State Transfer 」の略)なルーティングを提供し、アクションへのリクエストを適切なコントローラーとアクションにルーティングします。

# Routes.rbでできること
#### CRUD操作の設定
CRUD操作は、RailsのRoutesを使用して簡単に設定できます。以下は、postsリソースに対するCRUD操作の例です。

```config.routes.rb
resources :posts
```

このコードによって、以下のようなURLが生成されます。
 * Create: POST /posts
 * Read: GET /posts/:id
 * Update: PUT /posts/:id
 * Delete: DELETE /posts/:id

#### カスタムルート
RESTfulなルート以外にも、カスタムのURLパターンとアクションを指定できます。
特定のアクションに対するカスタムルートの例は、以下の通りです。
```config.routes.rb
get '/about', to: 'pages#about'
```
このコードによって、`/about`へのGETリクエストがPagesControllerの`about`アクションにルーティングされます。

#### リソース間の関連付け
リソース間の親子関係を表現するために、ルートをネストすることができます。
以下は、authorsとその下にあるbooksというリソースの関連付けの例です。

```config.routes.rb
resources :authors do
  resources :books
end
```

このコードによって、以下のようなURLが生成されます。
* 親: GET `/authors/:author_id`
* 子の一覧: GET `/authors/:author_id/books`
* 子の詳細: GET `/authors/:author_id/books/:id`

これらのコード例を使って、CRUD操作の設定、カスタムルートの作成、リソース間の関連付けを行うことができます。これにより、柔軟で効率的なルーティング設計を実現できます。

# コツや裏技
#### 名前付きルートの活用
名前付きルートを使用することで、URLを生成する際にコード内でエイリアスを使用できます。これにより、URLの変更に柔軟に対応できます。
以下は、名前付きルートの例です。

```config.routes.rb
resources :posts
```
```.haml
= link_to "詳細を見る", post_path(@post) 
```

#### オプション
Railsのroutesでは、リソースやカスタムルートを定義する際に、特定のオプションを指定することで挙動や設定をカスタマイズできます。これにより、より柔軟なルーティング設計が可能になります。

##### `on: :collection`オプション
`on: :collection`は、特定のリソース全体に関連するアクションを設定する際に使用します。
インスタンスに対するものではなく、リソース全体に適用されるアクションを定義します。例えば、全ての投稿を検索するためのアクションなどです。

```config.routes.rb
resources :posts do
  collection do
    get 'search'
  end
end
```

##### `only`オプション
`only`は、特定のアクションのみを有効にする際に使用します。
これにより、不要なアクションを除外してルートを定義できます。
```config.routes.rb
resources :posts, only: [:index, :show]
```

##### `as`オプション
`as`は、名前付きルートの名前をカスタマイズする際に使用します。
これにより、自分のプロジェクトに合ったわかりやすい名前を使用できます。
```config.routes.rb
resources :posts, as: 'articles'
```

これらのオプションを活用することで、ルーティング設計をより柔軟にカスタマイズできます。

#### 制約条件の活用
特定の条件を満たす場合にのみルートを有効化するために、制約条件を使用できます。
以下は、特定のサブドメインに対してルートを有効化する例です。
```config.routes.rb
constraints(subdomain: 'api') do
  namespace :api do
    resources :posts
  end
end
```

これらのコツや裏技を活用することで、より柔軟で効率的なルーティング設計が可能になります。

# 最後に
この記事では、RailsのRoutesについて基本から応用まで解説しました。
適切なルーティング設計はアプリケーションの保守性や拡張性に影響を与える重要な要素です。ぜひこれらのコツやサンプルコードを活用して、効果的なルーティング設計を行ってくださいね！
UWP101:メッセージボックスのようなもの

# tl;dr

```msgbox.xaml.cs
        private void btnDialog_Click(object sender, RoutedEventArgs e)
        {
            _ = hogeAsync();
        }

        private async Task hogeAsync()
        {
            ContentDialog contentDialog = new ContentDialog
            {
                Title = "ダイアログタイトル",
                Content = "コンテンツ（メッセージ内容）",
                CloseButtonText = "ボタンに表示するテキスト"
            };

            ContentDialogResult result = await contentDialog.ShowAsync();
        }
```

# 表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67318/0bfcf775-6a09-32f0-006a-9f90495da32f.png)
これから世の中に求められるITエンジニアとは

昨日読んだ、『2040年の未来予測』の著者の成毛眞さんが、
エンジニアの将来について記事にまとめていたので紹介です。

感想としては、今のままの延長線上で技術を身に付けていくだけじゃ、頭打ちになってしまうエンジニアが増えるのではないかという事。

※タイトルの「食えなくなる」というのは少し大げさな気もしないではないですが。。。 😅

少し前のIT人材白書でも、これからは、ビジネスを創出出来たり、課題解決が出来るITエンジニアが求められるという記述を見たことがあります。

単純なコーディングやシステム保守はどんどん自動化されてしまう。
非常に皮肉な話ですが、労働人口がどんどん減っていく中、開発現場やシステム保守のDXは必然の流れですが、その流れがエンジニアの仕事を奪っていく事にもなりかねないという事ですね。

でも私は、あまり悲観はしていないです。

今まで、

「言われたことだけただこなしていて、やっている内容が、果たしてエンドユーザーの役に立ててているのか分からない。」

そういう理由で、モチベーションを下げてしまっていた多くのエンジニアが、より本質的なところで開発が出来て、ユーザー視点で物事を考えながら、ワクワクしながら仕事ができている将来が来るのではないかと思います。

でも、これはエンジニアに限った話では無いですね。
全てのビジネスパーソンが、少子高齢化、労働人口不足、テクノロジーの進化の影響はこれからどんどん受けていくと思います。

大事な事は働きながら学び続ける事。
毎日少しでも、学んで成長していければ、未来は明るいと、あえて楽観的に考える様にしています 😊

今日も変化と学びを楽しみながら、頑張っていきましょう！

https://type.jp/et/feature/16106/

------------------------------------------------------------------

★下記セミナーも是非ご参加ください！

▼市場価値1,000万円超エンジニアの“課題解決力”
　～エンジニアリング×コンサルティング～
《8/24（木）19:30～20:30 ウェビナー》
https://akkodis-co-jp.zoom.us/webinar/register/WN_AlghgX65T26S2V_m0CsWtA#/registration

▼「エンジニアとして目指すキャリアプランを実現する」 
　キャリアアドバイザー×エンジニア　オンライン座談会
《8/30（水）20:00～21:00 ウェビナー》
https://akkodis-co-jp.zoom.us/webinar/register/WN_ZCARrPJVRK-GgzMIQodvxw#/registration

------------------------------------------------------------------
[ServiceNow] ListのExportメニューをRole別Table別で表示・非表示を制御する

# はじめに

ServiceNowのListでは、Context MenuのExportから、レコードリストの情報を各種のファイル形式で出力することができます。
しかし、Userのような機微な情報は、Exportを禁止したいという要望もあるかもしれません。
ここでは、sys_userテーブルを対象に、admin以外は、Context MenuのExportを非表示にする方法を取り上げます。

# UI Context Menuの設定

FormのコンテキストメニューはUI Macroで制御されています。
All > System UI > UI Context Menusから、「Export」を開きます。

Conditionを次のように変更して、「admin以外はsys_userのListのExportを表示しない」という要件を実現しています。

```Javascript:Condition
!ListProperties.isRelatedList() && !ListProperties.isRefList() && (gs.hasRole('admin') || ListProperties.getTable() != 'sys_user')
```
AWS ECS の blue/greenデプロイ実行でエラー 

# エラー内容

ECSでサービスを更新してblue/greenデプロイが開始した直後のエラー

>A deployment group associated with an application that uses the ECS compute platform must contain a valid pair of target groups that identify a load balancer. The target ECS service must be configured using one of those two target groups.

## 解決

- blue/greenデプロイに使うターゲットグループ2個両方をECSで利用しているALBに関連付ける
- ターゲットグループの片方をECSサービスに関連付ける

で解決した

片方がECSサービスに紐づいていればデプロイによってもう片方は勝手にECSに紐づいてくれるみたいだ

# Listnerのエラー

これもデプロイ実行直後のエラー

```
The ELB could not be updated due to the following error: Primary taskset target group must be behind listener ***.
```

Listenerの優先順位がおかしかったらしい。
blue/greenデプロイに使う2個のターゲットグループを両方Listenerのルールに含めてしまっていた。

## リスナールールはどうする？

試行錯誤時の疑問は

- blueとgreenを同じ優先順位にすることは出来ないがどうするのか
- そもそもgreenをリスナールールに含めて良いのか

というものだった。だが挙動を見てみると、blue/greenデプロイが成功するとリスナールールに紐づくターゲットグループ自体が変わるようだ。

blue/greenデプロイ用にターゲットグループA/Bを用意している場合、デプロイのたびに

- AからBへ
- BからAへ

と変わるようだ。
つまりターゲットグループにはどちらがgreen用でどちらがblue用かの違いはなさそう。

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Function calling でリスト(配列)のパラメータを定義する

# 概要
Function calling が OpenAI や Azure で利用できる。
サンプルで Function のパラメータを定義していたがリスト(配列)の扱い方が分からなかったので調べた。
List, Array

# 結論
JSON Schema を利用しているらしい。
以下を参考にして設定可能
https://json-schema.org/understanding-json-schema/reference/array.html

# サンプルスクリプト
properties で type を `array` にしている
```python
import openai

functions = [
    {
        "name": "search_recipe",
        "description": "指定された材料でレシピを検索する",
        "parameters": {
            "type": "object",
            "properties": {
                "ingredients": {"type": "array", "items": {"type": "string"}},
            },
            "required": ["ingredients"],
        },
    }
]

response = openai.ChatCompletion.create(
    deployment_id="gpt-35-turbo",
    messages=[{"role": "user", "content": "次の食材でレシピを考えて\n玉ねぎ\n人参\nじゃがいも"}],
    functions=functions,
    function_call="auto",
)

print(response["choices"][0]["message"]["function_call"]["name"])
print(response["choices"][0]["message"]["function_call"]["arguments"])
```

実行結果。パラメータをリストで受け取れている。
```
search_recipe
{
  "ingredients": ["玉ねぎ", "人参", "じゃがいも"]
}
```
Railsでjqueryのajaxを使ってCSVインポート・エクスポートを実装

## 概要
※初投稿なので読みづらかったらすみません
RailsにてCSVインポートエクスポートをしたかったのですが、
リクエストをjqueryのajaxで行い、json形式でレスポンスを返す必要があり、form_tagなどのヘルパーメソッドで完結できませんでした。
また、エクスポートに関しては、一度CSVファイルを作成し、それをエクスポートする必要がありました。（既存のCSVファイルのエクスポート
実装に時間がかかったので、まとめることにしました。

## コード（CSVインポート）
```ruby:index.html.erb
<%=form_tag'', method: 'post', multipart: true, id:"importForm" do %>
  <input id="importCsv" name="csv" multiple=""  accept=".csv" type="file" autocomplete="off">
<% end %>
```

```javascript:import.js
// インポートボタン押下時の処理
let param1 = "param1";
const body = new FormData($("#importForm").get(0));
body.append("param1", param1);

$.ajax({
  url: "import-csv",
  type: "POST",
  data: body,
  dataType: "json",
  timeout: 30000,
  processData: false,
  contentType: false,
})
  .done(function (data) {
  })
  .fail(function () {
  })
  .always(function () {
  });
```

```ruby:csvContoller.rb
csv = CSV.table(params[:csv].path, encoding: "UTF-8")
```
## コード（CSVエクスポート）
```ruby:csvContoller.rb
table = CSV.table("./csv/hoge.csv")
csv = table.to_csv
exportResult[:csv] = csv
exportResult[:filename] = "User1.csv"
render json: exportResult
return
```
```javascript:export.js
// エクスポートボタン押下時の処理
$.ajax({
  url: "export-csv",
  type: "POST",
  data: {
    param1: "param1",
  },
  dataType: "json",
  timeout: 30000,
})
  .done(function (data) {
    var downloadData = new Blob([data.csv], { type: "text/csv" });
    var filename = data.filename;
    var downloadUrl = (window.URL || window.webkitURL).createObjectURL(
      downloadData
    );
    var link = document.createElement("a");
    link.href = downloadUrl;
    link.download = filename;
    link.click();
    (window.URL || window.webkitURL).revokeObjectURL(downloadUrl);
  })
  .fail(function () {
  })
  .always(function () {
  });
```
## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [【jQuery】配列をCSVファイルにして、ダウンロードする方法](https://qiita.com/tsukahara-akito/items/976690c099f8f3316a7d)
プリザンターでPDF出力したい時の方法

# プリザンターでPDF出力がしたくなったのでスクリプトを追加した
公式マニュアル見る限りPDF機能は無いようなのでスクリプトを追加しました。  
js自体が分からないので、とても苦労した。。。。。。


## 必要なライブラリ
外部ライブラリを使用しています。
どちらもMIT Licenseのようです。
- jsPDF
https://github.com/parallax/jsPDF
- html2canvas
https://github.com/niklasvh/html2canvas

これらをダウンロードして保存します。
...Implem.Pleasanter\wwwroot\scripts
ここにpdfといフォルダを作って、保存するのは以下の2つだけで大丈夫なはず。
- jspdf.umd.js
- html2canvas.min.js

## 拡張htmlへの設定
...Implem.Pleasanter\App_Data\Parameters\ExtendedHtmls
へファイルを追加します。
ファイル名は「HtmlBodyBottom.html」としました。
ファイル名の説明などは公式マニュアルにあります。
https://pleasanter.org/manual/extended-html

```HtmlBodyBottom.html
<script type="text/javascript" src="/scripts/pdf/jspdf.umd.js"></script>
<script type="text/javascript" src="/scripts/pdf/html2canvas.min.js"></script>
```

これを保存したら反映させるために、IISを再起動します。
これで外部ライブラリを使う準備はOK！

## 追加したスクリプト
この内容を「編集」画面でだけ出るように設定。  
「PDF」というボタンが増えるので、それを押すと画面そのままでPDFとして保存できた！！！
画面がそのまま一枚のPDFになるだけなので使い勝手がいいわけではないですが、とりあえずできたのでOK！！！

```js
$p.events.on_editor_load = function(){
    $("#MainCommands button:last-child").after($('<button onclick="$p.ex.exportPDF();">PDF出力</button>').button({icon:'ui-icon-arrowthickstop-1-s'}))
    }
    $p.ex.exportPDF = function() {

    var doc = document.getElementById('MainCommandsContainer')
    doc.setAttribute('data-html2canvas-ignore', 'true')

    const source = document.getElementById('Application')
    html2canvas(source).then(capture => {
        const imgData = capture.toDataURL('image/png')
        const doc = new jspdf.jsPDF()
        const width = doc.internal.pageSize.width
        doc.addImage(imgData, 'PNG', 10, 10, width * 0.9, 0)
        doc.save("出力.pdf")
    })
}
```

### 内容について
`var doc = document.getElementById('MainCommandsContainer')
doc.setAttribute('data-html2canvas-ignore', 'true')`
これは、画面そのままPDFにすると「戻る　更新　メール、、、」とかのバーが表示している部分にそのまま残ってじゃまなので消すために入れてます。
`const source = document.getElementById('Application')`
このIDを変えればPDFにする範囲も変えられる。


# プリザンターは頻繁に更新されててすごい！
バージョンアップが頻繁にされてて色々機能追加されるし、合わせて公式のユーザーマニュアルも更新される！
https://pleasanter.org/manual
他にも、プリザンターの会社の方々？が、Qiitaとかで機能の使い方を解説されてる！
git stashパッと確認

# はじめに
ズバッとgit stashに関して、自分が欲しいと思った情報だけを残します！
詳しい説明などほしい場合は、他の方の記事を参考にしてください！

# 手順

## 保存

### 名前つけて
```
git stash push -m "名前"
```

### 名前なし
```
git stash
```

## 戻す

### 戻す & 消す
```
git stash pop stash@{0}
```

### 戻すのみ
```
git stash apply stash@{0}
```
Laravelのmigrationで複合主キーが設定できない(Syntax error or access violation: 1068 Multiple primary key defined)

# 事象
Laravelの migrationで複合主キー(id, fuga_datetime)を設定しようとすると以下エラーが発生。
(idとfuga_dateteimeを複合主キーにすることの妥当性については無視...)

```sql:エラー
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined (SQL: alter table `hoge` add primary key `tbl_hoge_id_fuga_datetime_primary`(`id`, `fuga_datetime`))
```


```php:migration
public function up()
    {
        Schema::create('tbl_hoge', function (Blueprint $table) {
            $table->bigIncrements('id');
            // 省略
            $table->dateTime('fuga_datetime');
            $table->timestamps();

            $table->primary(['id', 'fuga_datetime']);
        });
    }
```

# 原因
自動インクリメントのカラムがあると、そこが勝手に主キーになるとのこと。
idカラム( `$table->bigIncrements('id');` )で主キーが設定されているのに、さらに複合主キー( `$table->primary(['id', 'fuga_datetime']);` )を作成しようとしているのでエラーが出ていた。


# 対処法
一旦自動インクリメントを指定せずにidを作成し、複合主キーを設定した後にidに自動インクリメントを設定する。
```php:migration
public function up()
    {
        Schema::create('tbl_hoge', function (Blueprint $table) {
            $table->unsignedBigInteger('id');
            // 省略
            $table->dateTime('fuga_datetime');
            $table->timestamps();

            $table->primary(['id', 'fuga_datetime']);
        });
        Schema::table('tbl_hoge', function (Blueprint $table) {
            $table->unsignedBigInteger('id', true)->change();
        });
    }
```

参考：[github:Multiple primary keys with one auto increment #17204](https://github.com/laravel/framework/issues/17204#issuecomment-271249669)

# integer('id', true, true)について
参考にしたgithub issuesに載っていたこの記述法、integerに第二、第三引数を指定したことがなかったので調べてみた
(公式ドキュメント内では使い方は見つけられず、、)

ソースを見てみると
第二引数：autoIncrementの指定
第三引数：unsignedの指定
のようでした。
```php:src/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php
    /**
     * Create a new integer (4-byte) column on the table.
     *
     * @param  string  $column
     * @param  bool  $autoIncrement
     * @param  bool  $unsigned
     * @return \Illuminate\Database\Schema\ColumnDefinition
     */
    public function integer($column, $autoIncrement = false, $unsigned = false)
    {
        return $this->addColumn('integer', $column, compact('autoIncrement', 'unsigned'));
    }

```
[ServiceNow] Client ScriptのonChangeイベントで変更直前の値を取得する

# はじめに

ServiceNowのClient Scriptでは、onChangeイベントを捉えて、Formの値を取得することができますが、onChange FunctionのoldValue変数は、Formを読み込んだ時の値を保持しているだけで、Submitするまでに複数回、値を変更した場合は、直前の値を取ることはできません。
今回は、Incident FormのChannel Fieldを例に、Client Scriptで、Global変数を定義して、直前の値や変更履歴を取得する方法を取り上げます。

# Client Scriptの設定

IncidentのClient Scriptを次のように作成します。

:::note info
ここでポイントは、Isolate scriptをFalseに設定することです。これによりfunctionネストの外側で、Global変数を定義して、参照することができるようになります。
ただし、この変数は、他のScriptからも参照できてしまうので、名前が衝突しないように、命名を工夫する必要があります。
:::

![IncidentChannelOnChange.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/d84361c7-bb54-99d9-976d-00c7d61f17c2.png)

```Javascript:Script
var strIncidentChannelPreviousValue = "";
var arrIncidentChannelHistory = [];

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        strIncidentChannelPreviousValue = oldValue;
        arrIncidentChannelHistory.push(oldValue);
        return;
    }

    //Type appropriate comment here, and begin script below
    alert("Initail value: " + oldValue + "\n" +
        "Previous value: " + strIncidentChannelPreviousValue + "\n" +
        "Currnt value: " + newValue + "\n" +
        "Change history: " + arrIncidentChannelHistory.join(" > ") + " > " + newValue
    );
    strIncidentChannelPreviousValue = newValue;
    arrIncidentChannelHistory.push(newValue);

}
```

# 実行結果の確認

IncidentのFormから、Channelの値を変更します。
初期値はEmailでした。それを、適当に複数回変更します。
最初の値がEmailで、Phoneに変更した後、Self-Serviceに変更したことが取得できています。

![OnChangeHistory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/0f9741bc-b33a-69a9-2eeb-0de399caf113.png)
はじめまして。（ネットワークエンジニア時代の失敗談振り返り①）

はじめまして。
今後、たびたびエンジニアブログを書こうかと思います。

今回、初回ということでVLANとport-channelの設定削除の順番・方法を間違えたことでport-channel自体がリンクダウンさせてしまう失態を犯したときのこと

そもそも、設定時はport-channelの各インターフェイスおよびport-channelのコンフィグの設定を入れるだけで問題ない。

しかしながら、設定削除時はport-channelのvlanコンフィグを削除するだけで紐づけられているインターフェイスの設定削除不要で設定が自動で反映されます。

ここで、先に各インターフェイスから先にvlanを削除してしまうとどうなるのか？port-channel自体disableになり関連するインターフェイスすべてがdisableになってしまうという。（シスコの機種によっては回避される。）

皆様もお気を付けを。ではでは。
エンジニアがアウトプットするのは人類の遺伝子レベルで合理的なのかも？

# アウトプットはいいぞ

ご存知、ITエンジニアは自分の学んだ技術知見を「アウトプット」としてブログや登壇という形で対外発信する文化があります。

インターネット上の叡智として学習者の助けになることも多く非常にありがたいことなのですが、一方で発信者側にとってはそれなりに労力がかかる作業となります。
業務時間中の実施が憚られてしまい業後や休日の貴重な時間を使ってアウトプットしているエンジニアもかなり多いのではないでしょうか。


# なぜ大変なのに皆アウトプットしてくれるの？

もちろん発信者側にもメリットは多く、それがあるからこそアウトプットを継続しているエンジニアは多いのですが、世の中に存在するエンジニア人口に対して自発的な発信を行う人口割合は相当に少数です。
あなたの職場にもたくさんいる優秀なエンジニアを思い浮かべてみていただくと、そのうち何名が対外的なアウトプットを実施しているでしょうか？

実は今回フォーカスしたいのは「なぜ発信しないのか」ではなく、逆に **「なぜわざわざ労力をかけてアウトプットするのか？」** という点です。冷静に考えてこんな人たちが一定数いて、継続して活動し続けているのは結構すごいことではないでしょうか？


# 遺伝子レベルでアウトプット奨励されてた…ってコト!?

最近たまたま雑学を漁っているなかで気付いたのですが、これってもしかすると人類の遺伝子レベルで理にかなった行為なのかも知れません。

「利己的遺伝子論」という進化生物学の学説を聞いたことがあるでしょうか？

https://ja.wikipedia.org/wiki/%E5%88%A9%E5%B7%B1%E7%9A%84%E9%81%BA%E4%BC%9D%E5%AD%90

タイトルが若干ミスリーディングなのですが、一言でいうと **「生物がわざわざ他者に親切な行為をするのは、種全体としての遺伝子を残すうえで合理的だからである。なぜなら生物とは遺伝子の乗り物にすぎないのだ」** という考え方です。

とっつきやすいものだと、カジュアルに解説してくれている動画コンテンツも多数あります。

https://youtu.be/NS3HSoD8MOQ

※もし専門分野上、本記載およびリンク先のコンテンツについて看過できない不備等があればお知らせくださいますと幸いです。


# つまり？

私たちエンジニアがモチベーションと使命感に駆られて大変なアウトプットを続けてしまうのは、「これがきっと将来まで末長く僕ら種族を繁栄させるためにきっと良いことなのだ…成さねばならぬ！」という本能に突き動かされているのかも？

こう考えると非常に面白いですね。
実際、私も例えば業務でAWSを利用していて困ったとき、Google検索して出てきたクラスメソッドさんのブログ記事等に救われて困難を乗り越えた経験などいくつもあります。こういったアウトプットが廻り回って社会に及ぼしている良い影響はきっと計り知れないですよね。

ともあれ私自身はこれからも「楽しいから」「勉強になるから」というシンプルな理由でアウトプットを継続していこうと思います。


# こちらもどうぞ

関連記事です。

https://qiita.com/minorun365/items/d97197d7fcc15793741a
VSCodeのC#拡張で、omnisharp使用を継続する

# はじめに

[VSCode](https://code.visualstudio.com/)の[C#拡張(ms-dotnettools.csharp)](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)が、[2.0.320](https://github.com/dotnet/vscode-csharp/releases/tag/v2.0.320)から補完等の動作が変わっているので、従来動作(1.26.0以前)と近い形に戻す方法を書く

# 設定

vscodeのsettings.jsonに"dotnet.server.useOmnisharp"という設定項目が追加されているので、これをtrueにする。

```json:settings.json
"dotnet.server.useOmnisharp": true
```

設定後、vscodeを再起動すれば、設定が反映される。

## 注意点

これは **[C# DevKit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit)の挙動と競合するものなので、該当モジュールを入れている場合はtrueにしないこと。**
C# DevKitかomnisharpのどちらかを選択する必要がある。

## 設定しなかった場合

これを設定せず、かつC# DevKitを入れてない場合、筆者の場合は"dotnet buildした場合は正常にビルドできるプロジェクトが、ソースジェネレーターが生成したクラスが補完で出なくなり、コンパイルエラーとして表示されるようになった"という症状が出た。
他にもあるかもしれないが、今の所確認できたのはこれ。

# 終わりに

拡張提供元としては、C# DevKitと挙動が競合するものをどう扱うかという所で出てきた苦肉の策かもしれないが、自分は戸惑ったのであんまりやらないで欲しいなというのが正直な所。

omnisharp自体は他エディタでも使われていることもあるし、そうそう無くなる事は無いとは思う。
vscodeの拡張の方はその内"legacy"とか言って切り捨てる可能性も無くはないけど。
XAML101：フルスクリーンにする

# 目的
フルスクリーンでウインドウを表示したい

# サンプルコード
```sample.xaml.cs
        private void btnFullScreen_Click(object sender, RoutedEventArgs e)
        {
            Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().TryEnterFullScreenMode();
        }

        private void btnFullScreenReset_Click(object sender, RoutedEventArgs e)
        {
            Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().ExitFullScreenMode();
        }
```

# 画面例

- 通常状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67318/7f84b213-6918-0c47-3e84-e9969bc865e7.png)

- フルスクリーン化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67318/7ba99c80-238b-0910-7e1d-eeca6e50fc15.png)

- マウスポインタを一番上まで持ってくると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67318/443f27f9-1018-e9a6-c772-06291ee23401.png)
Julia ライブラリ呼び出し

## 概要
Julia (windows版)からライブラリを呼び出す方法の技術メモです。

### 想定するアプリケーションと実行環境

想定するアプリケーション：指定なし
実行環境：julia, windows10, (libiio.dllなど)

### 実行環境の準備
特にありません。
### 参考文献
- 本家,[Calling C and Fortran Code](https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/), Julia Documentation
- inzkykさん,[C と Fortran コードの呼び出し](https://inzkyk.xyz/julia_doc/manual/calling-c-and-fortran-code/), Julia 1.5.4 ドキュメント
## 解説
### 基本
ccallで呼び出します。
`ret = ccall((:関数名, "library名"),戻り値の型,引数の型のタプル,実引数)`
実引数が「引数の型のタプル」に従って変換されて、ライブラリの関数が呼ばれ、戻り値が「戻り値の型」に従ってjuliaの型に変換されて戻ってきます。「引数の型のタプル」の指定のところで、最後のカンマを忘れないことに注意してください。

例　WindowsのAPIで名ボックスを表示する。
```Julia:メッセージボックスを表示する
MB_YESNOCANCEL=0x3
MB_ICONINFORMATION=0x40
MB_TOPMOST=0x40000
ccall((:MessageBeep,"User32.dll"),Int32,(Int32,),0x10)
ccall((:MessageBoxA, "User32.dll"),Int32,(Int32,Cstring,Cstring,Int32,),0,"Test:MessageBox","Message",MB_YESNOCANCEL|MB_ICONINFORMATION | MB_TOPMOST)
```

## libiioの呼び出し例
libiioを用いてデバイスを操作する例を示します。
juliaから直接コンテクストやデバイス構造体の中身を操作する必要がなければ、中身が空の構造体を定義するだけでもよい。ライブラリとのデータの受け渡しはこれらへのポインタを経由する。

```Julia:libiioを呼び出す例
mutable struct iio_context
end
mutable struct iio_device
end
devUri="ip:pluto.local"
devPhyName="ad9361-phy"
#コンテクストを作成
ctx    = ccall((:iio_create_context_from_uri,"libiio.dll"),Ptr{iio_context},(Cstring,),devUri)
#戻り値確認ののち
devPhy = ccall((:iio_context_find_device,"libiio.dll"),Ptr{iio_device},(Ptr{iio_context},Cstring,),ctx,devName)
#デバイスに諸々操作
...
#コンテクストを破壊
ccall((:iio_context_destroy,"libiio.dll"),Cvoid,(Ptr{iio_context},),ctx)
```
## 注意点など
ヌル終端文字列やメモリ管理などか。
Leetcode 1046. Last Stone Weight

# Problem
この問題では、Stoneの重さのリストが与えられます。各ターンで最も重い2つの石を選び、それらを互いに衝突させます。2つの石の重さがxとy（x <= y）であるとすると、衝突後の結果は次のようになります：

- xとyが等しい場合、両方の石が破壊されます。
- xとyが等しくない場合、重さxの石が破壊され、重さyの石は新たに重さy - xとなります。
ゲームの終わりには、最大1つの石が残ります。この最後に残った石の重さを返すように求められています。もし石が残らない場合は0を返します。

InputとOutputの例は次になります。
```
Input: stones = [2,7,4,1,8,1]
Output: 1
Explanation: 
We combine 7 and 8 to get 1 so the array converts to [2,4,1,1,1] then,
we combine 2 and 4 to get 2 so the array converts to [2,1,1,1] then,
we combine 2 and 1 to get 1 so the array converts to [1,1,1] then,
we combine 1 and 1 to get 0 so the array converts to [1] then that's the value of the last stone.
```
https://leetcode.com/problems/last-stone-weight/description/


## Key Idea
直感的に考えると、問題の指示どおりに、毎回最も重い２つの石を探し、それらを削除もしくはその差となる数字を追加する作業を繰り返すことで問題を解くこと自体は可能です。しかし、この方法は効率が非常に悪いという欠点があります。(Time complexity : O(N^2))


最大ヒープ（最大値が常にトップにあるヒープ）を使うと、最も重い2つの石を効率的に取り出すことができます。ヒープから最大値を取り出す操作（heap pop）はO(log n)のTime complexityで、新たな石をヒープに追加する操作（heap push）もO(log n)のTime complexityですみます。



## Implementation
最大ヒープを用いた実装は、下記のようになります。Pythonの`heapq`モジュールは、デフォルトでは最小ヒープしか提供していません。したがって、最大ヒープを作成するには、値をネガティブにして扱う必要があります。

アルゴリズムは次の通りです：
1. すべての石を最大ヒープに追加します。
2. ヒープに2つ以上の石がある限り、最も重い2つの石を取り出し、その差をヒープに戻します（差が0でない場合）。
3. 最後に残った石の重さを返します。石がなければ0を返します。

```python
import heapq

def lastStoneWeight(stones):
    # Pythonのheapqは最小ヒープなので、全ての要素を負にして最大ヒープを作成
    stones = [-stone for stone in stones]
    heapq.heapify(stones)

    while len(stones) > 1:
        # 最も重い2つの石を取り出す
        stone1 = heapq.heappop(stones)
        stone2 = heapq.heappop(stones)
        # 2つの石が同じ重さでなければ、その差をヒープに追加
        if stone1 != stone2:
            heapq.heappush(stones, stone1 - stone2)

    # ヒープが空でなければ、最後に残った石の重さを返す（値は負になっているので符号を反転）
    # ヒープが空なら0を返す
    return -stones[0] if stones else 0
```

![IMG_9176.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99549/b2195f08-8fdd-ef01-3638-eacee0759d9a.jpeg)


## Complexity Analysis

- Time complexity: O(N log N)
  - 最初にヒープを構築するには O(N)
  - 最悪の場合 N - 1回の石を衝突を繰り返す可能性があります。また、それぞれの衝突で、2回 Pop (O(log N)) と1回のPush (O (log N))が必要です。
  - つまり、O(N) + (N-1) x 3 x(O (log N) で、すなわち O(N log N) となります。
- Space complexity: O(N)。
  - ヒープに格納されるすべての石は元の配列から来ており、その数はn個なので、Space complexityはO(n)となります。 
  - Pythonでは、リストからヒープへの変換はインプレースで行われるため、O(1)しか必要としません。


## Reference
https://www.youtube.com/watch?v=B-QCq79-Vfw
【Java•学習ログ⑤】メソッド呼び出しと引数

教本に沿ってやってみたシリーズ、『第５章』です。

≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ

## ■メソッドとは

数千〜数万行にも及ぶプログラムを複数の部品に仕分けるしくみ。この一つの単位のことを**メソッド**という。

メソッドは繰り返し使用することができるので、同じ処理を何度も書く必要がなくなる。


なお、メソッドを作成することを**定義**といい、再利用することを**呼び出す**という。

![スクリーンショット 2023-08-10 235917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/3ced047a-6643-37e6-b4af-cb426c337a02.png)
【実行】
![スクリーンショット 2023-08-11 000821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/56acf901-8c0b-1330-fc41-aa83e845501d.png)

mainメソッド外に作成したメソッドも呼び出し可能。起点はmainになるので、一番上に書いたメソッドが1番初めに実行される訳ではない。

## ■引数(ひきすう)について
呼び出し元から呼び出したメソッドに値を渡せる方法。
```java
 hallo() //何も渡さないメソッド
 hallo('奏') //値を一つ渡すメソッド
 methodA(20,"abc") //値を複数渡すメソッド
```
渡す値のことを**実引数**、受け取る変数のことを**仮引数**という。

※宣言した変数は同ブロック内でしか使用できない(スコープ：ログ③参照)ことが前提にあるため、メソッド外の変数に同値を代入する際には引数を用いる。

![スクリーンショット 2023-08-11 004845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/c8738f2f-e089-2290-189f-7f55c1499920.png)

## ■戻り値について

* 戻り値
呼び出したメソッドから元のメソッドへ返す値のこと。
値を元のメソッドに戻すには「return文」を使う。
![スクリーンショット 2023-08-11 041543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/e215c1de-b260-166c-554c-476a56d44cb6.png)

また、波線の引かれた部分には戻したい値の型を指定する。

## ■オーバーロードについて
「オーバーロード（多重定義）」とは、同じ名前のメソッドを複数定義すること。
下記のように、仮引数の型が異なれば呼び出せる。
```java
public static int method(int x)  //１つ目
public static double method(double x) //２つ目
public static String method(String x) //３つ目
```
## ■引数と配列
引数には変数だけでなく配列も使える！
![スクリーンショット 2023-08-11 114717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/edc6ca25-0d4b-ae91-cb13-5fc19bf5f90a.png)

* 値渡し
引数として通常の変数を指定し、変数に入っている値そのものを呼び出しメソッドに渡すこと。
```java
int x = 100; //変数に値を代入
method(x); //引数に変数を指定してメソッド呼び出し
public static void method(int x) //100が渡される
```

* 参照渡し
引数として配列変数を指定すること。
```java
int[] array = {10,20,30}; //配列を作成
method(array); //引数に配列変数を指定してメソッド呼び出し
public static void method(int[] array) //配列の先頭要素のアドレスが参照される
```
呼び出し先で変更を加えると呼び出し元にも影響する。

## ■コマンドライン引数
```java
java Main 勇者 村人 魔王
public static void main(String[] args){
```
meinメソッドでは、「コマンドライン引数」を用いてプログラム起動時の追加情報を指定することができる。
上記のように**java プログラム名　引数リスト**と記すことで、mainメソッドに値を渡した状態で起動できる。この例ではargs.lenfth(要素数)は「３」となる。

以上、雑備忘録。
Leetcode 104. Maximum Depth of Binary Tree

# Problem
与えられた二分木の最大深度（根から最も遠い葉ノードまでのノード数）を求めるというものです。
> Given the root of a binary tree, return its maximum depth.

InputとOutputの例は次になります。
```
Input: root = [3,9,20,null,null,15,7]
Output: 3
```

X![image](https://assets.leetcode.com/uploads/2020/11/26/tmp-tree.jpg)


https://leetcode.com/problems/maximum-depth-of-binary-tree/description/

## Key Idea
深さ優先探索 (DFS) または幅優先探索 (BFS) を用いて解くことができます。

## Approach #1 Depth-First Search (DFS) using Recursion

DFS の特性を利用した解法で、各パスを深く探索し、それぞれの深度を比較します。再帰を利用して実装することができます。

```python
class Solution:
    def maxDepth(self, root):

        if root is None: 
            return 0 
        else: 
            left_height = self.maxDepth(root.left) 
            right_height = self.maxDepth(root.right) 
            return max(left_height, right_height) + 1 
```

## Approach #2 Depth-First Search (DFS) using Stack
深さ優先探索 (DFS) は再帰を使わずにスタックを使用することでも実装することができます。Pythonではスタックは、`collections.deque`を利用することもできますが、ここではシンプルにlistを利用しています。
```python
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        
        stack = [[root, 1]]
        depth = 0

        while stack:
            node, current_depth = stack.pop()

            if node:
                depth = max(depth, current_depth)
                stack.append([node.left, current_depth + 1])
                stack.append([node.right, current_depth + 1])

           
        return depth
```

## Approach #3 Breadth-First Search (BFS) 

幅優先探索 (BFS) の場合、各レベル（深度）を順に探索していき、最後に探索したレベルが最大深度となります。キューを用いて各レベルのノードを順に探索し、新たにノードが見つからなくなった時点での深度が最大深度です。

```python
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        
        queue = collections.deque([(root, 1)])


        while queue:
            node, depth = queue.popleft()
        
            if node.left:
                queue.append((node.left, depth+1))
            
            if node.right:
                queue.append((node.right, depth+1))
           
        return depth
```



## Complexity

Time complexityは、上記解法の全ての場合で、O(n)となります。ここで、nはノード数です。全てのノードを一度だけ訪問するためです。

Space complexityは、どのパターンでも最悪計算量はO(n)ですが、それぞれ得意・不得意な木の形があります。

Approach #1, #2 :Depth-First Search (DFS)
- 最も都合が良い場合：O(log n)。完全に平衡している二分木の場合、最大のスタックの深さが考慮されるため、平衡した木ではスタックの深さが最小化され、その結果としてO(log n)となります。
- 最も都合が悪い場合：O(n)。木がほとんど一直線（リストのよう）になっている場合、最大の再帰スタックの深さが考慮されるため、非常に偏った木では再帰スタックの深さが最大となり、その結果としてO(n)となります。
- 再帰を使ってもスタックを使っても同じ計算量になりますが、違いとしてはスタックオーバーフローの対処になります。再帰DFSはシステムスタックを使用し、スタックの最大サイズは実行環境によります。したがって、深いツリーを探索するとスタックオーバーフローが起こる可能性があります。スタックDFSは手動でスタックを作成して管理するため、再帰DFSに比べてスタックオーバーフローのリスクを減らすことができます。ただし、スタックの管理が必要なため、コードが少し複雑になる可能性があります。

Approach #3 : Breadth-First Search (BFS) 
- 最も都合が良い場合：O(log n)。二分木がほとんど一直線（リストのよう）になっている場合。各レベルに1つのノードしかないため、キューには常に1つのノードしか存在しません。
- 最も都合が悪い場合：O(n)。平衡二分木の場合、各レベルでノードの数が倍になるため、最深レベルではn/2のノードが存在し、これがBFSのキューに全て格納される場合があるため、スペース計算量はO(n)となります。


## Reference
https://www.youtube.com/watch?v=hTM3phVI6YQ
nmcliまとめ

# メモ
ssh ユーザー名@ipアドレス

接続解除はexit


# はじめに
<!-- 発端や概要を記載 -->
ubuntuでnmcliコマンドによる操作でwifi周りを設定する際に必要なコマンドまとめ。

環境
os:ubuntu22.04
wifiアダプター：rtl88x2bu

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# そもそもnmcliって何?
nmcliはlinuxで使われているネットワークマネージャー的なもの。Network Manager Command Line Interfaceだと思われる。そこまで難しくなくネットワーク設定をできるのでおすすめ。標準だったから気づいたら使っている場合も多い。

今回はubuntuでwifiアクセスポイントを自作したときのコマンドを中心に紹介していく。

<a id="#Chapter2"></a>
# コマンド
```
nmcli connection
```
nmcliで設定されているネットワーク設定の一覧を表示する。ネットワーク設定がされていれば接続されていなかったりそもそも生きていなくても表示される。生きていないネットワーク設定は混乱のもとになりやすいので不要なものは削除していくのがいいかと。

```
nmcli connection delete <connection>  
```
ネットワーク設定を削除する。
```
nmcli connection add  <connection>  <optinons>
```
ネットワーク設定を追加する。connection名はかぶらせないほうがいい。optionsに関しては多すぎるのでここでは省略します。
```
nmcli connection up/down <connection>
```
指定したconnectionの接続を開始/終了する。自動で接続開始するように設定しているならあまり使わないかも。

```
nmcli device
```
接続しているネットワーク機器を一覧で表示する。それらの接続状態も表示される。wifiアダプターなどが表示されない場合、そもそもubuntu側で認識しているかをlsusbなどで調べたほうがいい。ドライバーの入れ直しが必要な場合もある。ただ厄介なのがnmcli deviceで認識されていてもドライバーがうまく使えてなくてwifiアダプターを使えないこともある。

<a id="#Chapter1"></a>
# nmtui
nmcliを少しGUIで使えるようにしたようなもの。設定は色々できるけど細かいことをやるならnmcliのほうがやりやすかったりもするので使い分けは必要かと。基本sudo権限が必要になる。
PICAXE奮闘記02 I2CタイプのLCDでアナログ電圧表示

BASIC言語でワンチップマイコンのプログラムが書けるPICAXEを購入しお盆休み中の自由研究。
簡単なロジック制御なら使えそうです。
液晶表示器が扱えると用途も広がりそうなので挑戦してみました。
こちらの記事も参考にさせて頂き2日間かかってアナログ電圧を表示させる事に成功!!
http://airvariable.asablo.jp/blog/2013/05/25/6825184

ワンチップマイコンだけあって変数や計算の制約も多いですネ;;;
何度も何度もエラー出ました;;;
でも意外と簡単に液晶が扱える事も判りました。
これからやってみる人にとって、実際に動くサンプルプログラムが何よりの助けになる事を知っているので公開します。
3番ピン(C.4)の電圧を測定して表示するプログラムです。
液晶表示器 秋月電子通商 AE-AQM1602A(KIT)　のプルアップ抵抗を有効にするためSCL,SDA の2カ所のはんだブリッジをしておく必要があります。
液晶表示器の電源は3.1V to 3.5V
PICAXE 08M2は5V、シリアルケーブルも5Vレベルのようですが外部電源で3.5V加えて動作しました。
電圧仕様外だと思うので壊れても知りません。
みなさんの助けになれば幸いです。

```vb
'**************************************
'     I2C LCD test Display test 
'	AE-AQM1602A(KIT)
'     *3.1V to 3.5V!! Not use AA battry*3=4.5V
'     (I2C LCD 16 x 2 lines)
'	 for PICAXE 08M2
'**************************************
'	Information of Connection
'		pin1 VCC
'		pin2 serial in
'		pin3 analog in
'		pin4 n.c
'	----
'		pin8 GND
'		pin7 serial out
'		pin6 SCL(10kohm pull up by lcdkit)
'		pin5 SDA(10kohm pull up by lcdkit)
'**************************************

#PICAXE 08M2
#NO_DATA
'I2C initialize
hi2csetup i2cmaster,$7C, i2cfast, i2cbyte 'AKIDUKI LCD
hi2cout ($00,$01)	'Clear display
pause 50
hi2cout ($00,$38)	'拡張コマンドOFF
pause 50		'Wait
hi2cout ($00,$0C)	'ディスプレイON カーソルOFF
pause 50		'Wait
hi2cout ($00,$06)	'エントリーモードセット
pause 300		'Wait
hi2cout ($00,$39)	'コントラスト設定を行うため拡張命令ON
pause 50		'Wait
symbol Contrast = 30	'0 - 32 - 63 $00 - $3f 液晶のコントラスト設定値
'定数同士の計算は予め計算されるため、プログラムサイズに影響無し。
symbol ContrastL1 = Contrast // 16
symbol ContrastL2 = ContrastL1 or $70
hi2cout 0,(ContrastL2)	'液晶コントラスト下位指定
pause 50
symbol ContrastH1 = Contrast / 16
symbol ContrastH2 = ContrastH1 or $54
hi2cout 0,(ContrastH2)	'液晶コントラスト上位指定
pause 50
hi2cout ($00,$6C)	'フォロワー制御設定
pause 50
hi2cout ($00,$38)	'拡張命令OFF
pause 50
hi2cout ($00,$01)	'Clear display
pause 50
hi2cout ($00,$80)	'Set DDR Address
pause 50		'Wait

'Displaying Hello world

hi2cout ($40,"Volt meter")

main:
	READADC10  C.4,w0
	'スケーリング　$3ff(1023)が3500となるようにスケーリング
	let w0 = w0 * 16	'4bit shift(max $3ff0)
	'スケーリング後の値をhigh word　で取得するので 3500($dac) が $dac00000 を $3ff0 で割ってスケーリング定数を得る。
	'1word(16bit) * 1word(16bit)=2word(32bit)
	'** 演算子は計算結果のhigh wordが帰ってくる。
	' $dac0000 = $3ff0 * x
	' x = $dac0000/$3ff0 = $36bd
	let w0 = w0 ** $36BD	'high word return
	'これで$3ffの時に$dac(3500)となる。正確には3499
	bintoascii w0,b6,b5,b4,b3,b2	' convert to ascii
	hi2cout ($00,$c5)	'Set DDR Address
	debug			' debug values for testing
	'最上位桁のゼロサプレス処理
	if b6 = "0" then
		b6 = " "
'		if b5 = "0" then
'			b5 = " "
'		endif
	endif
	hi2cout ($40,b6,b5,".",b4,b3,b2,"V")
	pause 200		'wait 0.2sec
	goto main
end
```

![IMG_0142.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/fa14093d-d60f-bf6a-1d5f-fa5a23cb5dcb.jpeg)
![IMG_0140.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/0ca429e0-bc45-fb5c-cfbd-7b3294e6249e.jpeg)
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/12be920f-8570-e224-c2b9-222e09cc19e5.jpeg)
XAML101:ボタンを配置する

# 目的
UWPのUI開発が全く分からないので XAMLデザイナをいろいろ触ってみたい

# XAML
```sample.xaml
<Page
    x:Class="UWPApp1.UI.BlankPage2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWPApp1.UI"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <Button Content="HELLO" />
    </Grid>
</Page>

```

# デザイナ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67318/05395700-f9ec-2a5b-c7d9-00b1cf5d0044.png)

# 関連
- UWP101:イベントプロシージャ（ボタンがクリックされた）
PICAXE奮闘記01 プログラム中で日本語コメントを入れられるようにする。

プログラム中に日本語コメントを入れても保存して開くと文字化けしてました。
File　→　Options → File type をASCIIからUnicode(UTF8)に変更することで解決しました。

ASCII
![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/51977d89-4e39-29ec-b38d-9cf6ffb2e883.jpeg)

UTF8
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/86a3f90c-ada9-16cd-089e-55ca5697cf9d.jpeg)
【ChatGPTとMicrosoftBing】の見た目が変わりました。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　まずは、昨日、気付いたのですが、
　　Microsoft Bing Chatの
　　　GPT4切替スイッチが
　　　　また、三つのモードに
　　　　　戻っています。

　どっちかに
　　統一するというよりも、
　　　一緒にして、
　　　　GPT4使用にしたら
　　　　　三つのモードを
　　　　　　使えるようにすれば
　　　　　　　いいと思う。

　どう思います？
***
　さて、次は、
　　Web版ChatGPTに
　　　ログインした最初の画面。

　Example
　　とかがある画面です。

　変わっていました。

>Compare design principles
for mobile apps and desktop software
>
>Show me a code snippet
of a website's sticky header

　上記のふたつがあり、
　　選択すると、
　　　送信ボタンが現れます。

　DeepLに翻訳してもらうと

>設計原則を比較する
モバイルアプリとデスクトップソフトウェアのデザイン原則を比較する
>
>コード・スニペット
ウェブサイトのスティッキーヘッダー

　となります。

　上を選択して送信すると
　　（日本語にしてもらった）
***
もちろんです。モバイルアプリとデスクトップソフトウェアのデザイン原則の簡潔な比較表を以下に示します：

| デザイン原則        | モバイルアプリ                | デスクトップソフトウェア       |
|-------------------|-------------------------------|------------------------------|
| 画面サイズ         | 小さく、限られたスペース        | 大きく、画面領域が広い          |
| タッチ操作         | 主要な入力方法                 | マウスとキーボード操作           |
| ナビゲーション      | シンプルでジェスチャーベース     | メニュー指向、階層構造           |
| レイアウト          | 縦方向のスクロール              | 複数のカラム、複雑なレイアウト     |
| パフォーマンス      | リソース制約あり、最適化が必要  | より多くのリソースが利用可能      |
| コンテキスト        | 移動中での使用、コンテキストに敏感 | 静止した環境での使用、集中的な環境 |
| ユーザーの焦点      | タスク指向、焦点を絞った機能     | 多機能で幅広い機能                 |
| 通知               | プッシュ通知が一般的             | 通常は少ない通知                   |

これらの原則は、特定のアプリやソフトウェアの要件によって異なる場合があり、トレンドも時間とともに変化する可能性があります。
***

　下を選択して送信すると、
***
- 海辺の町シーデールに、シャーキーというユニークなスーパーヒーローが海中の通りを泳ぎ回っていました。
- 片手に歯ブラシ、もう片手に歯磨き粉を持って、シャーキーは歯の腐敗や歯垢が潜む場所で戦いました。
- 彼の強力なブラッシングで、他の海の生物たちの歯をきれいにすることができました。
- シャーキーの秘密の武器は、歯の健康への情熱で、みんなを定期的な歯磨きやフロスの実践に鼓舞しました。
- シーデールの夕日の中、シャーキーは水平線に向かって泳ぎ去りました。笑顔を明るくし、歯を輝かせる使命は永遠です。
***
　となります。

　NewChatしてみると、
　　違うことを出してきます。

　どうやら、
　　Exampleと同じみたいですね。
***
　Androidアプリの方も
　　チェックしますね。

　こっちは変わっていません。
***
　そのアプリで、
　　Settingsに
　　　Custom Interactionsが
　　　　ありました。

　まぁ、
　　少し前から
　　　気付いていましたけど。

　次の画面に遷移すると、
　　説明が出てきます。
　　　（コピー不可なので未翻訳）

　手元が狂って、
　　説明が上にズレたら
　　　Continueボタンが。

　隠れてたか。

　ボタンをタップすると、
　　Custom Interactionsの画面に。

　切替スイッチ、
　　入力枠がふたつ。

　うん、間違いない。

　すでに、Web版で、
　　入力してあるので、
　　　それが表示されています。

　つまり、
　　利用可能だったわけですね。

　ちなみに、
　　メインメニューに戻り、
　　　再度、Custom Interactionsに
　　　　遷移すると、
　　　　　説明をスルーして、
　　　　　　直接入力画面に。

　説明を出したい場合は、
　　画面の一番下の文言

Custom Interactions will be applifid to all new chats Learn more.

　の「Learn more」に
　　下線があるので、
　　　そこをタップ。

　それで説明が出てきます。
***
　Bingさん、
　　画面を安定させて欲しいです。

　ChatGPTさんは、
　　注意事項だけを
　　　出せば、いいような気が。

　ちなみに、GoogleBardさんは、
　　変化してはいないみたいです。

　以上。
PostgreSQLのarray_lengthが微妙な動きをするのでラップする関数を作る

# 目的
PostgreSQLで配列の長さを返す関数がちょっと直感と反する動きをします。

```sql
test=# select array_length(ARRAY[1]::BIGINT[], 1);
 array_length 
--------------
            1
(1 行)
```

```sql
test=# select array_length(ARRAY[]::BIGINT[], 1);
 array_length 
--------------
(1 行)
```

```sql
test=# select array_length(NULL::BIGINT[], 1);
 array_length 
--------------
(1 行)
```

空配列もNULLも0を返してほしいです。
ちなみにこうするとうまくいきます。

```sql
test=# select coalesce(array_length(ARRAY[]::BIGINT[], 1), 0);
 coalesce 
----------
        0
(1 行)
```

これ全部書くと長いのでストアードプロシージャを作ってラップします。

# コード

```sql
CREATE OR REPLACE FUNCTION uv_array_length(
  p_target_array ANYARRAY
  ,p_dimension INT DEFAULT 1 
) RETURNS BIGINT AS $FUNCTION$
DECLARE
BEGIN
  RETURN COALESCE(array_length(p_target_array, p_dimension), 0);
END;
$FUNCTION$ LANGUAGE plpgsql STABLE;
```

```sql
test=# select uv_array_length(ARRAY[]::BIGINT[]);
 uv_array_length 
-----------------
               0
(1 行)
```
備忘録：WSL2（Ubuntu）のちょっとした設定・コマンド集

# Ubuntu の root を無効にし、ログインユーザーを変更する
WSL2 の Ubuntu 22.04 を導入したところ、WSLにログインすると「root」でログインするようになっていました。以前のバージョンでは、初回起動時にユーザー作成をもとめられ、その時のユーザーがデフォルトユーザーになっていたと思うのですが・・・。

基本「root」は利用しないようにしたいので、以下のように対応します。


1. 「root」でログインしてユーザーを作成
1. 作成したユーザーに「sudo」権限付与
1. WSL2 のデフォルトユーザーを変更
1. rootを無効化

以下、手順詳細です。

### 「root」でログインしてユーザーを作成
```
# adduser newuser
```
※Ubuntuでは「useradd」ではホームディレクトリが作成されないそうです。

### 作成したユーザーに「sudo」権限付与
```
# gpasswd -a newuser sudo
```

### WSL2 のデフォルトユーザーを変更
この手順のみ、Windows PowerShellで実行します。
この手順を実行すると、ログイン済みの WSL2 は自動的に切断します。
```
> <Directory Name> config --default-user newuser
```
※「Directory Name」は、エクスプローラーで「\\\wsl$」を開いたときに表示されるディレクトリ名になります。

### rootを無効化
```
# sudo passwd -l root
```

【参考にしたサイト】
・ユーザー作成
https://ex1.m-yabe.com/archives/3259
・sudo の許可
https://www.server-memo.net/ubuntu/ubuntu_add_sudo.html
・WSL2 のデフォルトユーザー変更
https://zenn.dev/gaku1234/articles/article-00010-ubuntu
・root 無効化
https://kledgeb.blogspot.com/2012/10/ubuntu-root.html
Dockerコンテナの起動方法メモ

よく忘れるのと詰まったことがあったのでメモ

## フォルダ構成
```
├── build
│   └── Dockerfile
└── docker-compose.yml
```

## コマンド
Dockerコンテナの起動
`docker-compose up -d`

Dockerコンテナへ入る
`docker exec -it hoge-app /bin/bash`

## トラブルメモ
`docker-compose up -d`を実行してもコンテナが起動しない

`failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount2182286999/Dockerfile: no such file or directory`

→docker-compose.ymlの設定を見直す
今回の場合は`dockerfile:`でDockerfileのPathの指定が必要だった。

```docker-compose.yml
version: '3'
services:
  hoge-app: # サービス名
    container_name: hoge-app
    build: # ビルドに使うDockerファイルのパス
      context: .
      dockerfile: ./build/Dockerfile ## フォルダ構成でbuildフォルダ配下にDockerfileを配置している場合はこの記載が必要、同じ階層に配置していればいらない。
    ports:
      - 8083:8080
    volumes: # マウントディレクトリ
      - ./:/app
    tty: true # コンテナの永続化
    environment:
      - TZ=Asia/Tokyo
```
PhpStormでnoop.phpを除外する【WorldPress】

`noop.php`があると関数定義が重複するので、除外しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/f1885ded-4866-e07d-7c2f-becbb8511e45.png)

https://wordpress.stackexchange.com/a/367659


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/576e9209-314e-566d-1490-b6c5366d1b81.png)
MathJaxで \bm を使う

$\def\bm#1{{\boldsymbol #1}}$
MathJaxはデフォルトで `\bm` に対応していないので、`\bf` を使って $\bf a$ とするか、`\boldsymbol` を使って $\boldsymbol a$ とする場合が多い。

# やりたいこと

以下のコードで

```LaTeX
\bm y = \bm X \bm w
```

以下を出力する。

$$
\bm y = \bm X \bm w
$$

# 方法1

MathJaxを埋め込んだページの任意の箇所 (個人的にはできるだけ上部がよいと思う) に以下のコマンドを埋め込む。

```LaTeX
\def\bm#1{{\boldsymbol #1}}
```

# 方法2

MathJaxを埋め込んだサイトの`<head>`タグ内の、MathJax埋め込みに用いている`<script>`内に、以下のコードを適切に追記する。

```javascript
tex: {
    macros: {
        bm: ["\\boldsymbol{#1}", 1],
    },
},
```

たとえば以下のようにすると*いい感じ*になる。

```HTML
<script>
    MathJax = {
        tex: {
            inlineMath: [                 // start/end delimiter pairs for in-line math
                ['$', '$'],
                ['\\(', '\\)'],
            ],
            displayMath: [                // start/end delimiter pairs for display math
                ['$$', '$$'],
                ['\\[', '\\]']
            ],
            processEscapes: true,
            macros: {
                bm: ["\\boldsymbol{#1}", 1],
            },
        }
    };
</script>
```

# 免責並びに参考文献

本記事を適用したこと・適用できないことによって生じる損害には一切責任を負うことができません。予めご了承ください。

1. https://docs.mathjax.org/en/latest/options/input/tex.html
1. https://docs.mathjax.org/en/latest/input/tex/extensions/newcommand.html
【Drupal】RESTファイル削除がうまくいかない

※動作保証は個人で行ってください。

Drupal8で開発してRESTServiceで不要なファイルを反映後、
物理削除を実施したケースで管理画面がエラーになり操作を受け付けなくなるケースがあったので調べてみた

既知の不具合っぽい空気マジか。
https://www.drupal.org/project/drupal/issues/3134080
    
以下テーブルにデータが入っている様子
```sql
select collection,CONVERT(value USING utf8) from  key_value where collection = 'config.entity.key_store.rest_resource_config' limit 0,1; 
select collection,name, CONVERT(data USING utf8) from config limit 0,1;
```

思い切って物理削除
以下がエラーにならなければOK・・・かな

/admin/modules
/admin/config/services/rest
【Flutter】ContainerにImageを載せた時にRadiusが効かず闘った話

Flutterの書き方をだいぶ覚えてきた頃のことです。
画像にRadiusをつけた状態で表示したかったため、BorderRadiusをつけたContaierに画像を載せました。
その時に実装したコードはこちらです。

```dart
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('画像表示'),
      ),
      body: Center(
        child: Container(
          height: 300,
          width: 180,
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(6.0),
          ),
          child: Image.asset(
            'assets/image_sample.jpeg',
            fit: BoxFit.cover,
          ),
        ),
      ),
    );
  }
```

この状態で表示するとこうなりました。

<img width="300" alt="スクリーンショット 2023-08-16 10.28.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/b2abe229-a2fe-e9a3-3a5c-0597a7bcc918.png">

「あれ、なんか思ってたのと違う。」
試しに子要素の画像を外して、Containerの形を確かめたらこう。

<img width="300" alt="スクリーンショット 2023-08-16 10.30.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/2160e564-7fb4-484d-edf5-ef7af66c8d93.png">

「Radiusはついてるな。fitもboxfit.coverにしているし。これじゃダメなのか？」

なんてことが起き、当時の自分はこれっぽっちのために複数のサイトを経由しました。
その結果たどり着いたのが以下のコード。

```dart
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('画像表示'),
      ),
      body: Center(
        child: SizedBox(
          height: 300,
          width: 180,
          child: ClipRRect(
            borderRadius: BorderRadius.circular(6.0),
            child: Image.asset(
              'assets/image_sample.jpeg',
              fit: BoxFit.cover,
            ),
          ),
        ),
      ),
    );
  }
```
表示結果がこちら。

<img width="300" alt="スクリーンショット 2023-08-16 11.01.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/61b6e29c-7e3a-84a5-22e8-df0e024750a6.png">

「ClipRRectを使えばいいのね！」
当時はこれでことなきを得ました。

それから時間が経って、もう一度このコードを記載した。
「そういえば、あの時なんでContainerにRadiusつけただけじゃできなかったんだろう。」
って思って調べてみたら、あった。

冷静に考えた時に、画像を角丸にできなかった時のコードでは、Containerに対してのみRadiusを指定していました。そりゃ画像も変わらないわなって感じなんですけど、どうやら子要素がContaierの領域をはみ出したら、はみ出した分を切り取ってくれるという指定ができるみたい！

というわけで、以下を試してみると。

```dart
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('画像表示'),
      ),
      body: Center(
        child: Container(
          height: 300,
          width: 180,
          clipBehavior: Clip.antiAlias, // ここを1行追加するだけ！
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(6.0),
          ),
          child: Image.asset(
            'assets/image_sample.jpeg',
            fit: BoxFit.cover,
          ),
        ),
      ),
    );
  }
```

最初にうまくいかなかったコードから1行追加するだけで、画像を角丸にできたんです！
`clipBehavior：antiAlias`を追記することで、Containerの領域からはみ出した部分を切り取ってくれるみたいです！
さらに、元々`fit: BoxFit.cover`にしていたので、Containerのサイズに合わせて画像が引き伸ばされていたって感じですね！

ClipRRectを使用する方法も、Container内でclipBehaviorのパラメータを指定する方法も、どちらも間違いではないですが、2通りの書き方を知っておくことで、仕様に合わせて出しわけできそうですよね！

以上！ありがとうございました！
C#windows formの画面遷移

# c#のwindows form applicationで画面遷移を行う方法
applicationの開発エディタはVisual Studio 2022です
windowsフォームアプリケーション(.NET Framework)を選択してください
# 画面遷移
ツールボックスから、Panelを選択し、Form1にドロップ、
ユーザーコントロールを追加したらプロパティのDockを中央(Fill)にしてください

プロジェクト(P)からユーザーコントロールの追加(windowsfarm)(U)...をクリック
作ったユーザーコントロールはツールボックスに追加される。
ユーザーコントロールをPanelにドロップしDockをFillにする

画面遷移はVisibleをTrueとFalseにすることにより操作する
デザイン名がpanel1ならば、panel1.visible = True or Falseで画面切り替えができる

処理をユーザーコントロールごとに分けるときは
ユーザーコントロールのデザインをダブルクリックすると
処理を書く画面に移る
# おわり
おわり