OmniAICreator/Qiita-1.07M huggingface dataset:
OCI無償資格取得プログラム Race to Certification（2023年11月1日～2024年1月末）開催

以前2回にわたって紹介したOracle Cloud Infrastructureの無料受験プログラムの「Free Certification for OCI」の日本版が開催される。<font color="blue">期間は2023年11月1日～2024年1月末まで</font>。

**今回発表されたイベント**

* [OCI無償資格取得プログラム Race to Certification](https://www.oracle.com/jp/education/race2cert_97206-ja.html#1)

**以前紹介した記事**

* [Free Certification for OCIが始まったよ（2023年9月末まで）](https://qiita.com/yamada-hakase/items/f7c9553637312d52ed70)
* [ラストチャンスFree Certification for OCI（2023年9月末まで）](https://qiita.com/yamada-hakase/items/ab7c9903b5c8cb46d164)

# イベント内容
ルールは英語のときと同じ。

![oci-cert01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/fa783fd6-f7ef-8b0e-bfa6-7903e80543d6.png)

# 受験科目

受験科目は以下の通り。英語版キャンペーンよりも対象資格は少ないけれど、これで十分だろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/aea16516-f74c-2400-d47e-c118200f25b9.png)

* [Japanese: Become A OCI Architect Professional (2023) 日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-a-oci-architect-professional-2023-/125257)
* [Japanese: Become A OCI Architect Associate (2023) 日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-a-oci-architect-associate-2023-/125270)
* [Japanese: Become A OCI Foundations Associate (2023) 日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-foundations-associate-2023-/124995)

# 参加手順

まずは [OCI無償資格取得プログラム Race to Certification](https://www.oracle.com/jp/education/race2cert_97206-ja.html#1)からエントリー。現時点（2023年10月26日）ではエントリーは始まっていないようだ。

あとは、次のことをするだけだ。

1. [My Learnのデジタルコースを受講](https://mylearn.oracle.com/ou/home)
2. [ライブセッションを受講](https://education.oracle.com/oci-promo-schedules)
3. 認定試験を受験して合格

# ヒント

前回少し焦ったのはOCIの試験官付きオンライン受験が初めてだったので、受験に戸惑ったこと。[認定試験（オラクル配信試験）の受験ガイド(PDF)](https://www.oracle.com/a/ocom/docs/dc/oracleexamregist-64179-ja.pdf)を事前に読んでおこう。

それと前回は試験予約枠が思いのほか少なかった。十分に余裕を持ったスケジュール予約をおすすめする。

難易度で言うとFoundations Associateは簡単だけれど、Architect Associate以上はそれなりに難しい。デジタルコースの各章末にあるスキルチェックを全部やり、練習問題をやっても、実際の問題はそれ以上に難しいかもしれない。以前Architect Professionalで、kubuctlコマンド問題が出たときは汗だった。

**Foundations Associateは必要はない人が多いと思うけれど、バッチ稼ぎのための受験はありだ。というか「事前予約不要」「チケット消費しない」ことを考えると、3つのFoundations Associateは積極的に受けるべきだろう。Foundations Associate×2を取ればチケットを消費することなくSECTOR 2達成が可能だ。**

# おまけ

ちなみに前回のキャンペーンではSector 2バッチを取得。
![oci_cert04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ae950644-e004-66ba-d8cf-4597a74f588c.png)

いつになったら特典の受験チケットがもらえるだろうと思ったら、最近2023年10月末に来ていた。

確認方法は、[My Lean](https://mylearn.oracle.com/ou/home)の右上のアイコンをクリックして「My Exam Wellet」を選択。
![oci_cert02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/65d47eb3-659a-b859-347e-04c207e9315c.png)

こちらが付与されたチケットだ。このチケットで受験できるのは英語版の試験だけ。日本語版のキャンペーンに参加して両方手に入れるべし。
![oci_cert03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/4286be2a-aaeb-b679-7f7f-89c99bb224db.png)
JavaScript 繰り返し処理

# 初学者の備忘録
初学者の備忘録です。今回は繰り返し処理基礎編でfor文を使用します。


## 繰り返し処理
条件式に一致するまで処理を繰り返すことです。for文を使用して基礎を記録していきます。


## for文基本形
```JavaScript
//　変数greetingを作成、変数の値を文字列の"Hello world"とする
let greeting = "Hello world";
//　変数iを作成し、初期値を０（let i = 0;）iが5より少ない場合は繰り返し処理を実行（i < 5;）iの値を１ずつプラスしていく(i++)
for (let i = 0; i < 5; i++) {
  console.log(greeting);
}
```

コメントが少し長くなりましたが、上記のコードが繰り返し処理の基本形となります。


## 最後
繰り返し処理も使用頻度、応用度ともに高いのでしっかり勉強して、基礎をしっかり学んでいきましょう。
今回は短いですが以上で繰り返し処理編、終了です。お疲れ様でした。
グリッドレイアウト JS ライブラリ「Muuri」の使い方まとめ（設定オプション一覧あり）

MIT ライセンスの[レイアウト JS ライブラリ「Murri」](https://muuri.dev/)の日本語の解説記事が（ほぼ）無かったので備忘録がてら書いておきます。

- [ドキュメント](https://docs.muuri.dev/)
- [GitHub リポジトリ](https://github.com/haltu/muuri)

# インストール
``` html
<script src="https://cdn.jsdelivr.net/npm/muuri@0.9.5/dist/muuri.min.js"></script>

<!-- アニメーションを使用する場合 -->
<script src="https://cdn.jsdelivr.net/npm/web-animations-js@2.3.2/web-animations.min.js"></script>
```
または ``` npm install muuri ```

# 使う
## 要素を作成
``` html
<div class="grid">
  <div class="item">
    <div class="item-content">
      <!-- ここに何でも書いてね -->
    </div>
  </div>
  <div class="item">
    <div class="item-content">
      <!-- ここに何でも書いてね -->
    </div>
  </div>
</div>
```

# CSS
こちらがドキュメントに記載されていますが、完全でなくても大丈夫みたいです。
``` css
.grid {
  position: relative;
}
.item {
  display: block;
  position: absolute;
  width: 100px;
  height: 100px;
  margin: 5px;
  z-index: 1;
  background: #000;
  color: #fff;
}
.item.muuri-item-dragging {
  z-index: 3;
}
.item.muuri-item-releasing {
  z-index: 2;
}
.item.muuri-item-hidden {
  z-index: 0;
}
.item-content {
  position: relative;
  width: 100%;
  height: 100%;
}
```

## JS
``` js
var grid = new Muuri('.grid');
```
オプションを指定する場合：
``` js
var grid = new Muuri(elem, {
  optionName: value,
  optionName2: value2,
  optionName3: value3,
  optionName4: value4
});
```
### オプション
| オプション名 | 説明 | 形式 | 既定値 |
| - | - | - | - |
| showDuration | 表示するアニメーションの継続時間（ミリ秒）<br>無効: ``0`` | 数値 | 300 |
| showEasing | 表示するアニメーションの[種類](https://developer.mozilla.org/en-US/docs/Web/API/KeyframeEffect/KeyframeEffect) | 文字列 | ease |
| hideDuration | 非表示にするアニメーションの継続時間（ミリ秒）<br>無効: ``0`` | 数値 | 300 |
| hideEasing | 非表示にするアニメーションの[種類](https://developer.mozilla.org/en-US/docs/Web/API/KeyframeEffect/KeyframeEffect) | 文字列 | ease |
| layout | レイアウト設定<br>・``fillGaps``：順番が変わってでも前が空いていたら詰める<br>・``horizontal``：水平モード（横にスクロールするページ用）<br>・``alignRight``：アイテムを右から並べる<br>・``alignBottom``：アイテムを下から並べる | オブジェクト | {<br>  fillGaps: false,<br>  horizontal: false,<br>  alignRight: false,<br>  alignBottom: false,<br>  rounding: false<br>} |
| layoutOnResize | ウィンドウサイズを変更したときに、もう一度整列するかどうか。数字にすると、変更されてから設定した時間（ミリ秒）経ったあとに整列 | 数値、ブール値(true/false) | 150 |
| dragEnabled | ドラッグして並べ替えられるようにする | ブール値(true/false) | false |
| dragContainer | ドラッグされたアイテムが追加される要素 | 要素、n​​ull | null |
| dragHandle | ドラッグ時の持ち手の CSS セクター（``.handle``など） | 文字列、null | null |

他にも沢山あります。[ドキュメント](https://docs.muuri.dev/grid-options.html)を参照してみてください。

# 参考
- https://docs.muuri.dev/
整列

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/e0f79bba-d558-d3a9-f65d-f9f824cdea2a.png)
　データを並べ替えるアルゴリズム（整列アルゴリズム）として、代表的なものに、交換法、選択法、挿入法、クイックソートがあります。
 
 　交換法、選択法、挿入法は１０行程度の簡単なプログラムで実現できますが、データ数が多くなると処理時間が極端に長くなります。クイックソートは、再帰処理を用いるため多少複雑なプログラムになりますが、高速に整列できます。
[CDGC] ソース・システムのリストおよび対応機能 - Catalog Source Configuration 

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDGC](https://www.informatica.com/jp/products/data-governance/cloud-data-governance-and-catalog.html)(データガバナンス＆カタログ)では、各種システムからメタデータを取得する(スキャンと言います)ために、予め接続が定義されています。
それらをソース・システムと呼んでおり、2023/10現在では、100種類近くにのぼります。
本ブログでは、それらを一括して確認できるマニュアルページを解説します。

手っ取り早くアクセスしたい場合は、[こちらのリンク](https://docs.informatica.com/data-governance-and-quality-cloud/metadata-command-center/current-version/catalog-source-configuration/source-systems.html)をクリックしてください。
 
<!-- 各チャプター -->
# Informatica Documentation
インフォマティカでは、[Informatica Documentation](https://docs.informatica.com/)と言うサイトで、マニュアルを提供しており、CDGCやCDMP(データマーケットプレイス)のドキュメント群の閲覧には、無償のユーザー登録(Sign Up)が必要となりますので、ご注意ください。

そこから、[Metadata Command Center](https://docs.informatica.com/data-governance-and-quality-cloud/metadata-command-center.html)を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/1a268754-7974-68b3-73a3-6e684c4f7d5d.png)

# Metadata Command Center
メタデータを取得するなど主に管理者が操作をするMetadata Command Centerですが、このページの①Help for Usersのボタンをクリックし、さらに[②Catalog Source Configuration](https://docs.informatica.com/data-governance-and-quality-cloud/metadata-command-center/current-version/catalog-source-configuration/preface.html)のリンクをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/7a5dd0b0-0878-c4c1-72f3-423f2915eb04.png)

 
# Catalog Source Configuration
そうすると、ソース・システムの設定を個別に確認できるにページ飛びますが、ここで[Source systems](https://docs.informatica.com/data-governance-and-quality-cloud/metadata-command-center/current-version/catalog-source-configuration/source-systems.html)のメニューを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/bdc5bfc4-358d-75f8-fe7c-8b44bc40d7ad.png)

ここでは一覧で、どんなソースの接続があり、それぞれどのような機能があるかをテーブル形式で見ることができ、確認と比較が実施しやすいです。
 
以下、それぞれの列にどのような意味があるかを記載します。
### Source System
ソース・システムの名称です。基本的にはDBやファイルシステム単位ですが、一部スクリプトの種類別になっています。

:::note info
それぞれの名称からリンクが貼られており、ソース・システムの詳細設定を解説するページに飛ぶことができます。
ポータル的な使い方をするのが便利だと考えます。
:::

### Connection
どの接続設定を使うかを確認できます。具体的にはIDMCの『管理画面 - 接続』で選択するものを提示しています。

### Serverless Runtime Environment
Secure Agentレス(インフォマティカ側のクラウドで提供するSecure Agent相当の機能を利用する形態をServerlessと呼んでいます)で、利用できるかを表しています。

### Data Profiling
データプロファイリング(実データの分布・パターン・値の頻度の確認)が実施できるかどうかを表しています。

### Data Classification
分類(自動タグ付け機能)が実施できるかどうかを表しています。

### Glossary Association
ビジネス用語の自動割当機能が実施できるかどうかを表しています。

### DQ Automation
DQ(Data Quality)の取得が実施できるかどうかを表しています。

### Advanced Programming Language Parsing
DBやDWHが内包するストアドプロシージャの取得が実施できるかどうかを表しています。

### Connection-aware scan
リネージュを取得できるかどうかを表しています。

:::note warn
ただし、BI系(Tableau、Power BI、Qlik)に関してリネージュは取得できるものの、データソースにて、ストアドプロシージャやエイリアスを使用している場合、詳細の情報を取れない制限があるため、このリスト上は『No』になっていますのでご注意ください。基本的にBI系のリネージュは取得可能です。
:::



### Relationship Discovery
ソース・システム内のテーブル間の類似カラム等を推論モデルからの発見する事が実施できるかどうかを表しています。
 

# 参考文献
<!-- ★URLをそれぞれのカタログソースに応じて変更する -->
- [**Source systemsに関するマニュアル** *ログインが必要](https://docs.informatica.com/data-governance-and-quality-cloud/metadata-command-center/current-version/catalog-source-configuration/source-systems.html)
JavaScript 条件分岐

# 初学者の備忘録
初学者の備忘録です。今回はJavaScriptの条件分岐編


##　条件分岐
条件式によって出力される値が変わるコードのことを言います。今回はif文を使用した条件分岐の基礎を記録していこうと思います。

## 基本
```JavaScript
// 変数linesという変数を作成
let lines = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
// 変数userNameという変数を作成し値は１行目に入力された内容を格納（lines[0]）
let userName = lines[0];

// userNameに格納されている値が文字列の"JavaScript"と同一か判断
if (userName == "JavaScript") {
　　　// 同一だった場合文字列で"Welcome"と出力
  console.log("Welcome");
// userNameに格納されている値が文字列の"JavaScript"でなく文字列の"Qiita"と同一か判断
}　else if (userName == "Qiita") {
　　　// 同一だった場合文字列で"Welcome back"と出力
  console.log("Welcome back")；
// userNameに格納されている値がそれ以外だった場合
} else {
　　　　// それ以外だった場合は文字列で"Bey"と出力
  console.log("Bey");
}
    
```

上記のコードが基本的なif文のコードになります。


## 比較演算子
条件式で比較演算子というものがあります。
比較演算子とは文字列・数値が一致しているか判定するものです。

- == 等しい。条件と値が等しい場合〜する。
- ＝！ 等しくない。条件と値が等しくない場合〜する。

上記２種類です。


### 数値の大小比較
言葉の通りで条件と値の大小を比較する条件式の場合に使用します。こちらも比較演算子の一つです。

- > 大なり    a > b   aはbより大きい。範囲にbを含みません。
- < 小なり    a < b   aはbより小さい。範囲にbを含みません。
- >= 以上     a >= b  aはb以上。範囲にbを含めます。
- <= 以下     a <= b  aはb以下。範囲にbを含めます。

上記４種類です。


## 最後
条件分岐、特にif文は様々な場面で使用したり、応用も効くのでしっかりと勉強していきたいです。そのためにもまず基礎はしっかり覚えていきましょう。
以上でJavaScriptの条件分岐基礎編終了です。お疲れ様でした。
Rails 7.1でlibディレクトリを自動読み込みするデフォルトプラクティスが決まった

libディレクトリの自動読み込み方法として、Rails 7.1で新たに、`config.autoload_lib`というメソッドが追加されました。

https://guides.rubyonrails.org/7_1_release_notes.html#introducing-config-autoload-lib-and-config-autoload-lib-once-for-enhanced-autoloading

https://railsguides.jp/v7.1/autoloading_and_reloading_constants.html#config-autoload-lib-ignore

今まで、

- libディレクトリ以下全てを`config.eager_load_paths`に追加していたり
- `app/lib`ディレクトリを作成したり

といった方法があり、Railsのデフォルトでlib配下を自動読み込みする方法を推奨していませんでしたが、Rails v7.1から`config/application.rb`に以下のように記述する方法がデフォルトとなりました。

```config/application.rb
  config.autoload_lib(ignore: %w(assets tasks))
```

v7.0 (やそれ以前のバージョン) でも、以下のように記述したものと同義となります。

```config/application.rb
    lib = root.join('lib')

    config.autoload_paths << lib
    config.eager_load_paths << lib

    Rails.autoloaders.main.ignore(
      lib.join('assets'),
      lib.join('tasks')
    )
```

詳しくはPull Requestを確認してください。

https://github.com/rails/rails/pull/48572

## libディレクトリすべてを自動読み込みしないほうがいい理由について

libディレクトリ全てを自動読み込みする設定は推奨されていませんでした。 [^3]
`autoload_lib`が追加されたPull Requestによると、

[^3]: https://github.com/rails/rails/issues/37835#issuecomment-977747318

https://github.com/rails/rails/pull/48572

> ### Some history
> The lib directory was in the autoload paths by default in the early versions of Rails. However, lib stores different kinds of files, and eager loading in production proved to be an issue. Some files in there are not meant to be autoloaded or eager loaded. Think generators, for example.
>
> Because of that, lib was removed from the default autoload paths in Rails 3.

とあるように、元々libディレクトリは自動読み込みの対象でしたが、Rails 3からはデフォルトの自動読み込みパスから除外されました。
その理由として、production環境でeager loadをしたときに問題が発生するケースがあったようです。また、generatorのように、自動読み込みをすることを意図していないものもlibディレクトリにあるため、それらが不必要に読み込まれることを防ぐ意図もありました。

## `app/lib` ディレクトリというアイディア

自動読み込みをする必要のある、アプリケーションに関わるコードは appディレクトリ配下に置くのが良いというアイディアがありました。 [^1]

しかし、いくつかの理由により、libディレクトリにあるものも自動読み込みしたいケースをサポートするため、今回のメソッドが追加されたようです。

https://github.com/rails/rails/pull/48572

[^1]: [rails 6 lib folder doesn't work #37835](https://github.com/rails/rails/issues/37835)
[Create an app/lib directory when generating a new Rails project #47843](https://github.com/rails/rails/pull/47843)

## eager loadingについて

production環境等では、アプリケーション起動時に事前に定数を読み込んでおくことで、実行時にファイルを読み込みに行く時間を省略しています。
`config.eager_load`が`true`になるとeager loadingが実行されるようになります。

https://railsguides.jp/v7.1/autoloading_and_reloading_constants.html#eager-loading

## 参考

- [Whatever you do, don't autoload Rails `lib/`](https://island94.org/2023/05/whatever-you-do-don-t-autoload-rails-lib)
- [Introduce config.autoload_lib #48572](https://github.com/rails/rails/pull/48572)
Unityでログ出力クラスを作成する

# はじめに

Unityでのゲーム開発にかかわらずプログラミングをやったことのある人は絶対に一度はやったことがあるであろうログ出力に関しての話です。

例えば自分の場合、自作ゲーム開発でよくDebug.Log(変数名)などと書いていますがこれは個人開発でかつ、リリースを特に考えていないからできるわけであって、それを仕事のリリースするゲームで行った時には...って感じらしいです。私はまだ大学院生なので早めに気づけて良かった...

ではなぜログ出力クラスを別で作成してそこからログを出力する必要があるのかを調べられた範囲で説明していきます。

# ログ出力クラスのメリット

主に以下の利点があります
* 制御性
* フィルタリング
* 拡張性

順番に説明していきます

【制御性】
* 一箇所でログの振る舞いを制御できる
* なのでデバッグ時とリリース時でのログの振る舞いを簡単に切り替えることが可能

【フィルタリング】
* 特定のログの種類やレベルだけを出力するようにフィルタリングすることが可能。
* デバッグ時には全てのログを、リリース時にはエラーログのみを出力する、といったことも可能になる
* センシティブな情報（パスワード、個人情報、APIキーなど）をログに記録することを避けることが可能

【拡張性】
* 何かしらの拡張機能を追加する場合に一箇所での変更が可能

大規模な開発になってきた場合、スクリプトの数も莫大に増え管理することも増えるためなるべく確認するところは少なくしようねっていう感じですね。あとはログから企業の情報などが漏れるということも考えて、というところですかね。

ログ出力の作成
---
では、どのようにログ出力クラスを作成するかというところですが、今自分が想定しているのは以下になります。

* シングルトンパターンで作成
* ログレベルの定義

【シングルトンパターンで作成】
たまに記事などでシングルトンパターンを使うな！っていうのを見たりしますが、今回に関しては様々なスクリプトから呼び出されて、かつそこから外部に変更を行ったり複雑な作業をするわけでもないのでシングルトンパターンで作成するのがよさそうです。

【ログレベルの定義】
Debug, Warning, Errorなどのログレベルを定義して、それぞれのレベルでの出力を制御できるようにするのがいいかなと思います。
例えば
```php
using UnityEngine;

public static class MyLogger
{
    public enum Level
    {
        Debug,
        Info,
        Warning,
        Error
    }

    public static MyLogger instance;

    private static Level logLevel = Level.Debug;

    private void Awake()
    {
        if (instance != null && instance != this)
        {
            Destroy(this.gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(this.gameObject);
    }
    
    public static void SetLevel(Level level)
    {
        logLevel = level;
    }

    public static void Debug(string msg)
    {
        if (logLevel <= Level.Debug)
        {
            UnityEngine.Debug.Log(msg);
        }
    }

    public static void Info(string msg)
    {
        if (logLevel <= Level.Info)
        {
            UnityEngine.Debug.Log(msg);
        }
    }

    public static void Warning(string msg)
    {
        if (logLevel <= Level.Warning)
        {
            UnityEngine.Debug.LogWarning(msg);
        }
    }

    public static void Error(string msg)
    {
        if (logLevel <= Level.Error)
        {
            UnityEngine.Debug.LogError(msg);
        }
    }
}


public class LoggerExample : MonoBehaviour
{
    void Start()
    {
        MyLogger.Instance.SetLevel(MyLogger.Level.Info);

        MyLogger.Instance.Debug("デバッグメッセージ");
        MyLogger.Instance.Info("情報メッセージ");
        MyLogger.Instance.Warning("警告メッセージ");
        MyLogger.Instance.Error("エラーメッセージ");
    }
}

```

上記に関して
【MyLoggerクラス】
* シングルトンパターンで作成されているためどこからでも呼び出せる
* レベルを定義、SetLevelによって表示するログのレベルを設定
* 設定されたレベル以下のログは表示しない

【LoggerExample】(playerクラスとかの一般的なクラス)
* SetLevelを呼んでレベルを設定（ここで呼び出す必要ないかもしれない）
* MyLoggerクラスのログを出力するメソッドを呼んでログを出力（もしlogLevelがInfoならDebugは呼ばれなくなる）

というクラスの説明になります。

# おわりに
こういった話は実際に企業に就職してから勉強するものだと思いますが情報セキュリティの観点から、個人開発だけの人も理解しておくべき必要性があるなと思います。
Apple Developer Agreement を Submit したら We are unable to process your request. になった時の話


xcodeをインストールしようとしたらエラーが出た
```
xcodes install 12.4
=>
...
 Received 403: Unauthorized. This can happen when either:
 1. Apple Developer Terms and Conditions were not accepted at https://developer.apple.com/
 2. Apple ID authorization was revoked for some other reason
```

https://developer.apple.com/ でログイン後、規約変更の承認画面（Apple Developer Agreement）が表示された
一通り眺めてSubmitしたら「We are unable to process your request.」が表示されて進めない

ググるも同じエラーで困ってますみたいな記事しかヒットしない

...

結論、使っているMacが Apple ID のデバイス認識されていなかった、、
Mac買い替えたんだった、、デバイス認識後問題なくSubmitできた

たまにあるけれど、「エラーが起きた」ことしかわからないメッセージ、ほんと困る
入力フォームのバリデーションで何がいけないのかわからないと困る、、
自分が何か実装する時には、こういうユーザの体験を思い出しながらやっていこう
dockerコンテナ内でファイルが作成できない

# 問題 #
コンテナ接続コマンド

`docker exec -it [コンテナ名] sh`
laravelプロジェクト
app/storage/logs/ 配下にlaravel.logが作成できない。
sudo コマンドも聞かない、、、

# 解決方法 #
rootユーザーログインすればいい。
`docker exec -u root -it [コンテナ名] sh`


参考資料
[Dockerコンテナ内での作業ユーザー作成方法](https://zenn.dev/aidemy/articles/3b34214b9aabf4 "Dockerコンテナ内での作業ユーザー作成方法")
【Java】Stream APIの終端操作（anyMatch、allMatch、noneMatch）の使い方

# Stream APIの終端操作（anyMatch、allMatch、noneMatch）の使い方

## 目次

- [Stream APIの終端操作（anyMatch、allMatch、noneMatch）の使い方](#stream-apiの終端操作anymatchallmatchnonematchの使い方)
  - [目次](#目次)
  - [はじめに](#はじめに)
  - [anyMatch](#anymatch)
  - [allMatch](#allmatch)
  - [noneMatch](#nonematch)
  - [おわりに](#おわりに)

## はじめに

Stream APIの終端操作、**anyMatch**, **allMatch**, **noneMatch**についてまとめてみました。  
いずれのメソッドも、引き数に[**Predicate**](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/function/Predicate.html)を指定して、条件に一致するか、しないかをbooleanで戻すメソッドです。  
どれがどうなるのか混乱してググることが多かったので整理しました。

## anyMatch

Streamの要素の**いずれか**が引き数に指定したPredicateに一致するかを戻します。  
空のStreamの場合は**false**を戻します。

```java:anyMatch.java
public static void main(String[] args) {
    List<Integer> list = List.of(1, 2, 3);
    List<Integer> empty = List.of();

    boolean a = list.stream().anyMatch(i -> i >= 1);
    boolean b = list.stream().anyMatch(i -> i == 1);
    boolean c = list.stream().anyMatch(i -> i == 4);
    boolean d = empty.stream().anyMatch(i -> i == 1);

    System.out.println("すべて一致: " + a);
    System.out.println("ひとつ一致: " + b);
    System.out.println("一致なし: " + c);
    System.out.println("要素なし: " + d);
}
```

```txt:実行結果
すべて一致: true
ひとつ一致: true
一致なし: false
要素なし: false
```

## allMatch

Streamの要素の**すべて**が引数に指定したPredicateに一致するかを戻します。  
空のStreamの場合は**true**を戻します。  
空の場合trueなのはなんで？と思いますがちゃんとした理由があるらしいです。  
[詳しくはこちら](https://summertree.hatenablog.com/entry/2022/04/16/132359)
[こんな記事もあります](https://qiita.com/saetegaljewp/items/60a3580d8f08a53679c6)

```java:allMatch.java
public static void main(String[] args) {
    List<Integer> list = List.of(1, 2, 3);
    List<Integer> empty = List.of();

    boolean a = list.stream().allMatch(i -> i >= 1);
    boolean b = list.stream().allMatch(i -> i == 1);
    boolean c = list.stream().allMatch(i -> i == 4);
    boolean d = empty.stream().allMatch(i -> i == 1);

    System.out.println("すべて一致: " + a);
    System.out.println("ひとつ一致: " + b);
    System.out.println("一致なし: " + c);
    System.out.println("要素なし: " + d);
}
```

```txt:実行結果
すべて一致: true
ひとつ一致: false
一致なし: false
要素なし: true
```

## noneMatch

引数で指定されたPredicateに一致する要素がStream内に**存在しない**かを戻します。  
空のStreamの場合は**true**を戻します。

```java:noneMatch.java
public static void main(String[] args) {
    List<Integer> list = List.of(1, 2, 3);
    List<Integer> empty = List.of();

    boolean a = list.stream().noneMatch(i -> i >= 1);
    boolean b = list.stream().noneMatch(i -> i == 1);
    boolean c = list.stream().noneMatch(i -> i == 4);
    boolean d = empty.stream().noneMatch(i -> i == 1);

    System.out.println("すべて一致: " + a);
    System.out.println("ひとつ一致: " + b);
    System.out.println("一致なし: " + c);
    System.out.println("要素なし: " + d);
}
```

```txt:実行結果
すべて一致: false
ひとつ一致: false
一致なし: true
要素なし: true
```

## おわりに

Stream APIの終端操作、**anyMatch**, **allMatch**, **noneMatch**を整理しました。  
整理してみたら意外とややこしくなかったです、空の時の挙動はしっかりと確認しておいたほうがいいですね。  
javadoc に詳しく書いてあるので暇なときにでも読んでみてください。
よく使われるメソッドなので、この記事を参考にして使ってみてください。

## 参考文献

https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html
JavaScript　変数

# 初学者の備忘録
初学者の備忘録です。今回はJavaScriptの変数の基礎知識編です。


## 変数とは
プログラミング言語には、文字列や数値などのデータに名前をつけることで、繰り返し利用できるようにする変数という機能があります。
- 変数：データの入れ物
- 変数名：入れ物の名前
- 変数名でデータを操作できる


## 変数の宣言
変数を使用するためには変数を宣言しなくてはいけません。JavaScriptの変数宣言にはvar,let,constの３種類があります。

- var(var 変数名;)
varは何度同じ変数名で変数宣言してもエラーになることがなく、再定義が可能でメインで使われてきていました。しかし、現在はletやconstが出てきたのであまり使用しなくなりました。
再宣言できるメリットはありますが、コードの可読性という点で考えた時、varで宣言していると他の場所でも使用しているのかもと思ってコードを確認しなくてはいけないので可読性があまり良くないです。

- let(let 変数名;)
letは再宣言はできませんが、変数の中身を変えることはできます。変数の中身が変わる可能性がある時はletを使用します。
for文などと相性がいいです。

- const(const 変数名　= 初期値)
constは再宣言できませんし、変数の中身を変える事もできません。（正確に言うと変数の中身を変えることはできるのですが、推奨されていません。）定数の考え方と一緒です。
なので値が絶対変わらないのであればconstを使用します。


## 最後
以上でJavaScriptの変数基礎編を終了します。まだまだJavaScriptを勉強始めたばかりなので間違っているところがあったり抜けている部分があるかもしれませんがご了承ください。
頑張っていきましょう！
インフラエンジニア未経験者の心構え

「実務経験を積むためには実務経験が必要」といった
「モンスターAに強い武器は、もっと強いモンスターBの素材が使われている」なんてことがゲームの世界ではなく現実世界でもあります。

では、どうしたら未経験が実務経験を積むことができるのでしょうか。

結論から言うと、「未経験者を育てることを面倒だと思う排他的な思考を持たない会社に入社すること」だと思います。

誰もが最初は未経験なのに、時間が経つとその頃の記憶がなくなってしまうのは何故なんですかね。忙しいからですかね…

未経験者を育てたくない風潮にも問題はありますが
未経験者が全く悪くないわけではありません。

経験者に「未経験者はめんどくせえ」と思わせてしまった未経験者にも問題があると思います。

この記事はインフラエンジニア未経験者の私が先輩に迷惑をかけながら経験者になる過程で感じた「未経験者がやらなくてはならないこと」をつらつら書いていきます。

○ネットワーク基礎知識
ネットワーク・サーバー・クラウドなど分野が分かれると思います。
「ネットワーク現場は分かるけどサーバー・クラウドでもネットワークの知識って必要なの？」
答えは「超必要」です。

何にも接続されていない機器を触るなら、ネットワークは必要ないと思うのですが
何にも接続されていない機器なんてほぼ存在しません。

みんな何かしらの機器に接続されていて、そこで通信が発生しているので、「接続できてるか確認して〜」など依頼されたときに1から説明させないように基礎知識は学んでおく必要があります。

☆具体的なキーワード
・IPアドレス
・サブネットマスク
・ルーティング
・ping


○ビジネス言葉遣い
いきなり重要な人とメールやチャットのやり取りさせられることは無いとは思いますが、お客さんと軽いやり取りなどは発生すると思います。

また、「問い合わせをしておいて」というのは多いと思います。
問い合わせの方法は教えてくれると思いますが、文章まで毎回聞いていたら流石に面倒と思われてしまうかもしれません。

私はめっちゃ文章も質問してたので、面倒くさがられてたと思います…反省してます。

私はしばらく時間が経って「お世話になっております」と「よろしくお願いいたします」をつければいいやろ！と吹っ切れてしまいましたが
ビジネス言葉遣いがしっかりしていると現場でのコミュニケーションが円滑に行えると思います。

時間があれば自分の勉強がてら表みたいなものを
作りたいですね…


○マイクロソフトOffice
言わずもがなですね。
特にWord、Excelだと思います。
PowerPointが必要な場面もありますが、最初は少ないと思います。

正直Officeのこれを勉強しろというのは難しい話題で、現場や人によっても当たり前だと思われる機能が違うと思います。
超絶勉強していってもめーちゃニッチな機能を「これできないの？ここでは当たり前だよ？」ってドヤ顔で言われる可能性もあります。

なので研修などの内容で基本的には問題ないと思いますが、使用する場面を想像して学習するのが重要です。


○まとめ
まとめると

・ネットワークの基礎知識
・ビジネス言葉遣い
・マイクロソフトOffice

以上の3つです。
想像よりは上手くまとまった気がします。
最初の投稿があまり技術的な内容でなくて申し訳ありませんが…


未経験からエンジニアに就職した私が、
「未経験者に分かりやすく」をモットーに色々書いていきますので、よろしくお願いいたします。
hpのパソコンを買って最初にすること

hpのパソコンを買って最初にすること

hp特有の不要なプログラムの自動実行を停止し、不要なアプリを削除する必要がある。

# service
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/aa5a7e7d-c7c5-ae35-18bd-effdfc1401af.png)

### HP Analytics service
何の機能か説明がないので、「手動」にした。
しかし、いつのまにか勝手に起動していた。
ネットで調べると、スパイウェアという噂がある。
「無効」に変更。

### HP App Helper HSA Service
何の機能か説明がないので、「手動」にした。

### HP Comm Recovery
Check and recover devicesと説明がある。
多分使わないので、「手動」にした。

### HP Diagnostics HSA Service
何の機能か説明がないので、「手動」にした。

### HP Network HSA Service
何の機能か説明がないので、「手動」にした。

### HP Print Scan Doctor Service
何の機能か説明がないので、「手動」にした。
しかし、いつのまにか勝手に起動していた。
ネットで調べると、公式サイトに「HP プリンタおよびスキャナーのサポート問題を自動的に解決する無料ソフトウェア」とあった。
Cannonのプリンターを使っているので、「無効」に変更。

# タスクマネージャー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/31a3246b-225d-2517-0d8b-4e9c943b41fd.png)

### HP System Event Utility
消したらダメというネット情報があり、保留とする。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10258023270

Fn キーとファンクションキーの組み合わせで、画面の明るさやボリュームを調整したり、外部モニターの接続設定や Wi-Fi の接続設定画面を開いたりできます。

# C:\Windows\Prefetch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/5491791b-c58b-6010-4346-dbc8dfec14c9.png)

一度全部消して再起動する
タスクマネージャーで残したやつが動いてるみたい。
※保留


# インストールされているアプリ
11個ある。あまりディスクを使用しているものはなく、放置して様子を見る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/49f08a3f-45ea-adc9-bb7d-9a5f72abfe5e.png)

# プログラムと機能（コントロールパネル）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/f7bea066-5139-d28a-9f80-7c6180abc940.png)

### HP Documentation
製品のマニュアル等が確認できるアプリ
再インストールができません。と脅してくるあたり、不要っぽい。
ネットには、英語が読めない人は削除すべし。とある。
※保留

### HP Connection Optimizer
動作を停止した通信デバイスのドライバーを自動的に復旧するアプリ
※保留

# タスクスケジューラ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/b7fdcf9f-c3b4-9972-869c-3973a845ec76.png)

### WarrantyChecker
来年から動き始めるように設定してある。
たぶん、延長サポートの広告なので、「無効」にした。

# Autoruns
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/736ca651-1d6e-fffa-5b8e-0af76a87ea5a.png)

### HP Support Assistant
ドライバーの更新や問題発生した場合のトラブルシューティングツールを提供しているアプリ
保留

# fnキーが逆になっているのを戻す
hpのロゴが出る前に ESC F2 F10 を交互に押して bios画面 を出す
そのとき、fnキーは押さなくてよい
biosで Action Keys Mode を無効にする。

# 参考サイト

https://support.hp.com/jp-ja/document/c03582964
UIとUXについて　簡単なまとめ

# はじめに
プログラミングを勉強して2か月半ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

私はスクールでプログラミングを学び、オリジナルアプリの作成をしました。
アプリを家族や友人に使ってもらったところ、使い方がわかりにくい、実装した機能をうまく使って貰えていないという結果になりました。

そこで、ユーザーにとって使いやすいアプリを目指すためにUIとUXの知識をつけようと思い、書籍で学んだ事を今回の投稿にまとめました。

`※参考にさせていただいた本
「UIデザイン必携 ユーザーインターフェースの設計と改善を成功させるために」
著者：原田秀司`

# Let's start!!!

## UIとは
`UI`とはユーザーインターフェース（User Interface）の略称です。
今回参考にさせていただいた本の中では、以下のようにまとめています。
`UI＝ユーザーがサービスや製品とやり取りするための全ての接点`
例えると、今私が触っているキーボードもインターフェースです。

UIだけがwebサイトやアプリなどのソフトウェアを間接的に操作することができます。
だからこそ、`UI`の重要性が高っまています。

## UXとは
`UX`とはユーザーエクスペリエンス（User Experience）の略称です。
`UX=サービスや製品とのやり取りでユーザーが得られる全ての体験`
今回参考にさせていただいた本の中では、Instagramを例にUXについて説明されています。
『観光地に行く』⇨『素敵な場所や瞬間を写真に撮る』⇨『インスタにアップする』⇨『いいね』をもらって嬉しくなる。
この一連の流れの体験が`UX`として紹介されています。


## UIとUXの違い
上記のUIとUXの説明を踏まえて、簡単にUIとUXの違いについて説明します。
`UI`とは目に見える客観的なもの。
`UX`とは目に見えない主観的なもの。
アプリなどを使用するユーザーそれぞれが感じる体験が`UX`であり、インターフェースの使いやすさや分かりやすさが`UI`になります。

# 終わりに
今回UIとUXについて学び、私がまず取り組むべきことはUIだと感じました。
UIが優れていないと、そもそもユーザーがアプリを使用しないため良いUXを提供できないからです。
次回は、優れたUIを目指すためにどうするべきか自分なりに考えてみたいと思います。
※優れたUIという表現が正しいのかわかりません笑

今回も最後まで読んでいただきありがとうございました！！！
EC2（Windows）でmsinfo32.exeを実行して、どのような情報が取得できるか確認してみる

msinfo32はWindowsコマンドのひとつで、コンピューター上のハードウェア、システム コンポーネント、ソフトウェア環境の包括的なビューを表示します。

EC2上のWindows Server 2022でmsinfo32を実行するとどのような情報が取得できるか確認してみます。

## ドキュメント

[msinfo32](https://learn.microsoft.com/ja-jp/assessments/)

## 今回確認する環境

- ami-0222cfd6a9c020197 | Windows_Server-2022-English-Full-Base-2023.07.12

## msinfo32を確認してみる

`msinfo32`はPATHが通っているのでそのまま実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d32cc61d-770a-41db-8d8a-9c77ccb477e3.png)

本記事では多々ある項目の中でも3つだけ確認してみます。

### System Summary

OS情報やCPU、メモリなどのインスタンス情報が記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7f94524c-28e0-1fdb-5ffb-7aa24a71ebdc.png)

### Components -> Network -> Adapter

ネットワークアダプターの情報が記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c7443152-b5d9-060e-7447-ae47430f0951.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e65ecd5d-1239-de7d-539b-4962842f25f4.png)

#### Components -> Storage -> Drives

アタッチされているドライブの情報が記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1f6b3d86-517e-89f4-ac1c-d7881f27eb27.png)

## 総評

AWSサポートで問い合わせをした際に、AWSサポートから`msinfo32`から取得した情報の提供を求められる事もありましたが、改めて取得できる情報を眺めてみると色々な情報がまとまって取得できる事がわかります。

どのような情報が取得できるかあらかじめ確認しておき、活用することができれば便利かと思います。
LabelImgで画像を開いた際のエラー落ちの対処法

## 問題
LabelImgを使っていると使い始めは問題なかったが，
しばらく使っていると突然クラッシュして画像を開くと必ず落ちるようになってしまった。

コマンドプロンプトには

IndexError: list index out of range

とだけエラーが表示されるが何の形式が間違っているのかが分からなかった。
解決できたので備忘録を残しておきます。

## 環境
Windows 11 Pro 22H2
Anaconda
LabelImgはpipでインストール（Anaconda PowerShellを使用）

## 問題の原因と対処法

IndexError: list index out of rangeとは，LabelImgでラベリングしていたクラスについてでした。

LabelImgが出力するclasses.txtにはアノテーションしたクラスの一覧が記載されています。
各ファイルのアノテーションデータには座標の前にクラスの番号が記されていますが，それがclasses.txtの一行目から0,1,2と対応しています。

ここまで記すと多くの方が察されると思いますが，各ファイルのアノテーションデータのクラス番号と，クラス一覧ファイルのクラスの数が一致していないと上記エラーのみ出力してクラッシュするようです。

正直に言うと，これについてはクラッシュしないでちゃんとエラー文を吐いてほしかったと思ってしまいます…

そのため，対処法は簡単で，一覧か各ファイルのクラス番号かのどちらかを修正することで起動するようになります。

しかし，厄介な仕様があるようで，クラス一覧ファイルを修正しても，ディレクトリの変更等があった場合は勝手に書き換えられてしまうようです。

そのため，根本的な解決としては，アノテーションデータを誤って記載していた場合などは，そちらをすべて修正するのが良いようです。

アノテーションデータの修正については行頭を変更するようなスクリプトを組んで一括で修正するのが良いかなと思います。

以上，参考にしていただければ幸いです。


### 参考サイト
https://github.com/HumanSignal/labelImg/issues/589
Python3エンジニア認定基礎試験合格体験記

先日、「Python3エンジニア認定基礎試験」に合格しました。忘れないうちに学習方法などを記録しておこうと思います。

## 1　自分のスペック
文系事務職で、仕事でプログラミングに関することを扱うことはありません。また、プログラミング学習の経験もありません。

## 2　学習期間・学習量
7月上旬に初めてUdemyの講座を購入し、その後、諸々学習を重ねて10月下旬に受けた試験で合格しました。
その間、学習を中断していた時期もありますので、期間としては概ね3ヶ月弱といったところです。
学習時間は記録していませんが、週7時間（平日計3時間・土日計4時間）×12週で84時間程度といったところでしょうか。
最初は学習方法が定まらなかったのですが、後述する方法で短期集中して学習すれば、もう少し短縮できたと思います。

## 3　大まかな学習の流れ
UdemyでPython初心者向けの動画をいくつか見ながら、「徹底攻略Python 3 エンジニア認定［基礎試験］問題集」を解きました。動画を見ている時点では十分な理解はできていませんでしたが、とりあえず早めに全体像を把握し、問題集に着手できるようにしました。
問題集を解く過程で、関数（定義・スコープの範囲・仮引数・デフォルト引数・実引数など）やオブジェクト指向（クラス・インスタンスなど）がよく理解できなかったので、この辺りについて動画や書籍などで重点的に確認しました。（関数のスコープのあたりは最後までよく理解できませんでした。）

## 4　主に使用した教材（良かったもの）

### 1.問題集・テキスト（書籍）
- 徹底攻略Python 3 エンジニア認定［基礎試験］問題集
https://book.impress.co.jp/books/1122101079
↑最初に購入した書籍（問題集）です。自分の場合はテキストよりも問題集の問題と解説で理解していった感じです。学習の最初から最後まで継続して使用しました。 


- Pythonエンジニア育成推進協会監修 Python 3スキルアップ教科書
https://gihyo.jp/book/2019/978-4-297-10756-7
↑数年前に出版された書籍ですが、内容が試験の傾向や先述の問題集と合っているところが良かったです。全部読むことはせず、問題集の解説で理解できなかった箇所を確認する際に使用しました。



### 2.講義（動画）
- TRAINOCAMPの「Python本格入門シリーズ① データ構造とアルゴリズム」の講座が非常にわかりやすかったのですが、サービスを終了するようです。
https://camp.trainocate.co.jp/map/python/

今後は以下のUdemyで（概ね）同じ内容の講座が受けられます。

- Python本格入門シリーズ データ構造とアルゴリズム
https://www.udemy.com/course/python-basic1/

<br>
また、オブジェクト指向（クラス・インスタンスなど）も苦手意識があったのですが、以下の講座がわかりやすかったです。

- Python本格入門シリーズ オブジェクト指向プログラミング
https://www.udemy.com/course/python-object/

### 3.問題（WEB）
模試はDIVE INTO CODEとプライム・ストラテジーのものを受けましたが、個人的な感想としてはDIVE INTO CODEの方だけでよかったかと思います。
DIVE INTO CODEは一ヶ月間だけ有料の受験対策プランに登録しました。

- diveintocode
https://diver.diveintocode.jp/python_basic/lp

- プライム・ストラテジー
https://study.prime-strategy.co.jp/

また、Udemyの模試も受けました。
【模擬試験・全3回分】Python3エンジニア認定基礎試験の模擬試験対策
https://www.udemy.com/course/python3_basic/

## 5　合格までの感想など。
自分の場合は先に記載した教材のほか、試験対策に特化していないものも含め、Udemyの初学者向けの講座をいくつか受講して学習しました。
講師の方によって使うエディタがVisual Studio CodeだったりPyCharmだったり、あるいはJupyter NotebookやGoogle Colaboratoryを使ったりしていて、様々なツールの使い方を知ることができました。
最終的に、試験対策だけ考えるのであればGoogle Colaboratoryが使えればいいのかなと思います。
そのほか、複雑なコードはpythontutorで順番に実行の流れを見たりしましたが、自分はそんなに使いこなすことはできませんでした。

- pythontutor
https://pythontutor.com/

## 6　まとめ
プログラミングの経験がなくても、一定期間学習すればそれなりの確度で合格できる試験だと思いました。
他のプログラミング言語はなかなか体系立てて学習できる資格試験が少ないような気がしますので、プログラミングに興味がある方のとっかかりとしては非常に良い試験だと思います。
B2C Commerce 参考となるリポジトリ

# はじめに
 B2C Commerce関連のGitHubにアクセスするには、二要素認証が必須となる。
 
 https://docs.github.com/ja/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication

# リポジトリ
## RefArch
最新のB2C Commerceのデモストア。
sitegenesisの後継にあたる。

https://github.com/SalesforceCommerceCloud/storefront-reference-architecture

## sitegenesis
初期のB2C Commerceのデモストア。
最新のデモストアにはない実装を確認する場合に確認する。

https://github.com/SalesforceCommerceCloud/sitegenesis

## lib_productlist
ユーザ毎の商品表示で使うモジュール。

https://github.com/SalesforceCommerceCloud/lib_productlist

## plugin_wishlists
商品をお気に入り登録で使うモジュール。

https://github.com/SalesforceCommerceCloud/plugin_wishlists
SPAおけるVS CodeのLive Serverでのカスタマイズ方法

Single Page Application（SPA）は、現代のWeb開発において非常に人気のあるアーキテクチャスタイルです。SPAは、ページの遷移を伴わずにユーザーとのインタラクションを動的に処理することができるため、ユーザーエクスペリエンスが向上します。しかし、SPAの開発には特有の課題があります。その一つが、ブラウザの直接URLアクセスやリフレッシュ時に404エラーが発生する問題です。

VS CodeのLive Server Extensionを使用してSPAを開発する際、上記の問題を解決するためには、SPAモードでの起動が必要です。このモードを有効にすることで、すべてのルートがデフォルトの`index.html`にリダイレクトされ、404エラーを回避することができます。

# SPAモードでのLive Serverの起動方法

1. `settings.json`を開きます。
2. 以下の設定を追加します。

```markdown
{
  "liveServer.settings.file": "index.html",
  "liveServer.settings.advancedCustomBrowserCmdline": "--spa"
}
```

この設定を追加することで、Live ServerはSPAモードで起動します。これにより、直接URLアクセスやリフレッシュ時にも`index.html`が正しく表示されるようになります。

# まとめ

SPAの開発は多くの利点を持っていますが、特有の課題も存在します。VS CodeのLive Server Extensionをカスタマイズすることで、これらの課題を簡単に解決することができます。SPAの開発を行う際には、是非ともこの設定を活用してください。
[Xcode + Unity]「Command PhaseScriptExecution failed with a nonzero exit code」というエラーの一番簡単なケースの解決方法

## この記事が役立つかもしれない人
* Unity を使用して iOS アプリを開発している人
* 今まではビルド出来ていたのにビルドできなくなってしまった人
* 直近に Xcode の Platforms をアップデートした心当たりがある人
    * 分からなければ最近下記のような画面を見たかで判断してみて下さい

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2038389/79147b90-3bb8-efbe-cf34-0f8222a9f41d.png)

## 解決方法
解決方法は至ってシンプルで Xcode と Unity の更新を行って下さい。

### Xcode の更新
Xcode の更新は 「App Store」のアップデートから行います。
他の記事などを参照すると Xcode の更新を済ませるだけでビルドが通るようになるケースもあるようです。更新後は一度ビルドが通るか試してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2038389/dc8dd9be-010b-0bb3-ee5c-10444ef3e5e0.png)

筆者は基本 Windows ユーザーなので「App Store」の存在を忘れていて Platforms の更新で Xcode の更新をしたつもりになっていました……。

### Unity の更新
「Unity Hub」のインストールから「エディターをインストール」を選択して、最新の LTS をインストールします。
![スクリーンショット 2023-10-26 19.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2038389/f77463f7-c305-44be-371d-6ca171855af4.png)


筆者と同様の状態でエラーに苦しまされていた人は、これでビルドが通るようになったと思います！

## それでも解決しなかった人へ
本件以外に同様のエラーを対処したことはないので記事の内容が有効か保証はできませんが、参考資料としていくつかの対処法についてリンクを貼っておきます。

* キーチェーンアクセス周辺の問題であるケース

https://qiita.com/darquro/items/ab749adef2ab5f47f466

https://patio.work/archives/1147#toc2

* 様々なエラーとその対処法についてのフォーラム

https://forum.unity.com/threads/project-wont-build-using-xode15-release-candidate.1491761/

---

`Command PhaseScriptExecution failed with a nonzero exit code` というエラーは Xcode でビルドしようとした際によく見られるエラーメッセージであり、何が原因であるか特定するのが難しいケースもあるようです。
今回は単純過ぎて検索してもあまり出てこない解決方法を紹介しました。

この記事が誰かの開発の一助になれば幸いです。
またその際は 🩷 をもらえると嬉しいです！
playdate by lua "CoreLibs/object.lua:65: field 'baseObject' is not callable (a nil value)"

## CoreLibs/object.lua:65: field 'baseObject' is not callable (a nil value)

躓いたので...
ゲームを作る上でまずはタイトル画面を作ろうと思いまして
Sceneを別クラスで実装した訳です。
しかし、以下のようなコードで仮作成してさて挙動を確認しようとしたら...

![スクリーンショット 2023-10-26 20.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166838/2f452209-34ee-3546-3800-fad322e81050.png)

```Lua
local pd <const> = playdate
local gfx <const> = pd.graphics

class('TitleScene').extends(gfx.sprite)

function TitleScene:init()
    print("TitleScene:init")
end

function TitleScene:update()
    print("TitleScene:update")
end
```

### 解決策

```Lua
import "CoreLibs/sprites"
```
はいｗ
classに関連してCoreLibs/spritesのimportが必要でした

明示的に記載あるわけではないけど、playdateでゲームを作る場合、main.luaなりなんなりに公式で記載のあるimportはしといた方がいいですね。

https://sdk.play.date/2.0.3/Inside%20Playdate.html#basic-playdate-game
![スクリーンショット 2023-10-26 20.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166838/6b9ec4ee-e2cd-6bf3-fee8-c8af66854a9a.png)

私の場合不要なimportはしないのがデフォルトなので、気づくのに時間かかりました。
「CoreLibs/object.lua:65」の中身見れたらもっといいんだけどな...
UnityでUIアニメーションを作成する(Titan)

# はじめに

UnityでUIアニメーションを作成する場合、よく考えられるのは以下の手法だと思います
* Animation
* Shader
* LearnTween
* DOTWeen

その中でもスマートフォンアプリ開発などではよくDOTweenが使われているとのことで私も最近勉強し始めましたが、なぜ今まで使っていなかったんだというレベルで使いやすいです（Proも購入しました）。

なぜDOTweenがよく使われるのかを調べたところ、
①使いやすい（短いコードで様々なアニメーションやトランジションを実装可能）
②パフォーマンス（パフォーマンス最適化が施されているため、リソースが限られた環境での動作を念頭に置いて設計されている　→　スムーズで効率的なアニメーションを実現可能）
③柔軟性（さまざまなアニメーションの種類をサポートしている）

これらが理由として挙げられそうです。しかし、こういったアニメーションは本来エンジニアではなくUIデザイナーの方が行うほうがいいと思います。そりゃUIデザイナーの方がまず考えて作って動かしているんだから...できたと思って提出したら全然違う！とか言われて修正を繰り返すなんてことも多そう...。

そんなこともあってUnityでUIアニメーションを作る専用のツールができたらしいです...すごい...

# Titan

https://gamemakers.jp/article/2023_09_06_48727/

こちらの記事で説明されていますが、TimeLine機能を拡張して、TimeLine上でUIアニメーションができるようになったツールのようです。TimeLineにTweenライブラリを搭載させたという感じでしょうか。

こちらのツールによって以下のメリットがあるといえます

* どういったアニメーションになるかすぐに確認（DOTweenではコードを書いて実行して確認しないといけないがその手間が省けてすぐに確認可能）

* アニメーションの動的変化ができる（TimeLineは基本的に静的なアニメーションやシーケンスを作成するものなので動的にする場合には制限がかかる）

* 再利用が可能かつパラメータなどを調整可能（コードが複雑になるのを避けられる）

ほかにもいろんなメリットがありますが、残りはぜひ記事を確認してみてください。

# まとめ

UIデザイナー向けといったツールの紹介でしたが、エンジニアの方でも慣れたらこっちのほうが使いやすいんじゃないかと感じましたね...すごい...。
今後に期待が高まります。
メソッド名を考えるときに意識すべき品詞の選び方

**1. はじめに：メソッド名の重要性**

メソッド名は、コードの可読性や保守性において非常に重要な役割を果たします。明確でわかりやすいメソッド名は、コードの意図を正確に伝えるキーとなります。

**2. 動詞を中心に: アクションの明示**

メソッドは行動やアクションを示すものです。そのため、メソッド名は動詞で始めるのが一般的です。例: `fetchData`, `calculateTotal` など。このようにアクションを明示的にすることで、メソッドの役割が直感的に理解できます。

**3. 目的と対象: 名詞と形容詞の効果的な使用**

動詞に続く名詞や形容詞は、その動作の目的や対象を示します。例: `saveUserData`, `convertStringToDate`。これにより、メソッドが何を対象にどのような操作を行うのかが明確になります。

**4. 簡潔さと明瞭性: 良いメソッド名の特徴**

長すぎるメソッド名は読みにくく、短すぎる名前は情報が不足しています。最も理想的なメソッド名は、必要な情報を簡潔に伝えるものです。

**5. 一貫性を保つ: プロジェクト内での統一感**

同じ動作や目的を示すメソッドには、同じような命名規則や用語を使うことで、プロジェクト全体の一貫性を保ち、コードの読みやすさを向上させることができます。

**6. 前置詞との関係: 複雑な操作を伝える**

前置詞を使用することで、より詳細な操作や関係性を伝えることができます。例: `convertToUpperCase`, `searchForUser`。

**7. 否定形の落とし穴**

メソッド名に否定形を使うと、混乱を生むことが多いです。例えば、`isNotAvailable` より `isAvailable` として、戻り値でのみ否定形を使う方が理解しやすいです。

**8. ドメイン知識との関係: 専門用語の使用**

特定のドメインや業界の専門用語を使うことで、その分野の知識を持つ人々に対して、より詳細な情報を伝えることができます。

**9. 略語の扱い: いつ、どう使うべきか？**

知らない略語は理解しづらくなるため、広く知られている略語のみを使用するか、全てを明示的に記述することが望ましいです。

**10. まとめ：品詞を意識したメソッド名の設計**

メソッド名を考える際には、品詞の選択やその配置がコードの品質や可読性に大きく影響します。品詞を意識して、効果的なメソッド名を設計することで、より質の高いソフトウェア開発を目指しましょう。
Java versionをサクッと切り替えてみた

# はじめに
複数のプロダクト開発を担当することになりました！
ただし、使用するJavaバージョンが異なります。
頻繁にバージョン切替が必要になりそうなので、サクッと切り替えられるように設定しました。
同じ境遇の方がいたら、ぜひ！


# 環境
- macOS Ventura
- Apple M1
- arm64
    - `uname -m`：アーキテクチャ確認コマンド

# 手順
## 1. バージョン確認

```terminal:使用中のJavaバージョン確認
$ java -version
```
```
java version "17.0.6" 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)
```

```terminal:インストール済のJavaバージョン確認
$ /usr/libexec/java_home -V
```
```
Matching Java Virtual Machines (3):
    17.0.6 (arm64) "Oracle Corporation" - "Java SE 17.0.6" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
    11.0.11 (arm64) "Oracle Corporation" - "Java SE 11.0.11" /Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
```

## 2. JAVA_HOME設定、PATH通し

```~/.zshrc
# 各バージョンのJAVA_HOMEを設定
export JAVA_17_HOME=$(/usr/libexec/java_home -v 17)
export JAVA_11_HOME=$(/usr/libexec/java_home -v 11)

# Version切替コマンドを簡単に呼び出せるよう、エイリアスを設定
alias java17="PATH=$JAVA_17_HOME/bin:$PATH;export JAVA_HOME=$JAVA_17_HOME"
alias java11="PATH=$JAVA_11_HOME/bin:$PATH;export JAVA_HOME=$JAVA_11_HOME"
```
※複数コマンドをエイリアス設定する際は、各コマンドを`;`で繋げる
※設定ファイル名はshell等により異なります

## 3. 設定反映
```terminal: 2で設定した内容を有効化する
$ source ~/.zshrc
```

## 4. バージョン切替、確認

```terminal:使用中のJavaバージョン確認
$ jav11
$ java -version
```
```
java version "11.0.11" 2021-04-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)
```

`java17` -> `java11` へ切替成功です！！
たった 1コマンドでサクッとできました！


# 参考
- [[Java] macでJDKのバージョンを切り替える方法 ~ JAVA_HOMEを設定する](https://amateur-engineer.com/mac-java-version/)
- [MacでマルチJavaバージョン(Temurin)の切替](https://zenn.dev/gekal/articles/switch-java-version-in-mac)

# さいごに
複数バージョンのJava JDKをインストールするなら、事前に設定して楽をするのはどうでしょう！
`~/.zshrc` を一度更新するだけです！
デプロイ後のアプリの編集方法

<h2>この記事について</h2>
開発環境で書き換えたものはすぐに本番環境に反映さえれると思っていたがそううまくういかないみたいなので、編集方法について後学のためにここに記述しようと思い立った。

<h2>そもそも開発環境がなぜ反映されない？</h2>
本番環境では何度も何度もコードを読み直しては負荷がかかるため、一回サーバー越しにデプロイしたコードは読み直さないようにしてるみたい<br>
（本当はもっと詳しい言い方とかあるかもだけど一旦この認識でOKだと思う）

<h2>実際に反映してみよう</h2>

さっき書いた通りサーバーを立ち上げた時に読み込まれるなら、一回サーバを切ればいい話だよね
<h5>nginxの停止</h5>

```ruby
$sudo systemctl stop nginx
```

<h5>unicornの停止</h5>

```ruby
$sudo kill -QUIT `cat tmp/pids/unicorn.pid`
```

<h5> nginxの起動<h5>

```ruby
$sudo systemctl start nginx
```

<h5>unicornの起動<h5>

```ruby
$bundle exec unicorn_rails -E development -c config/unicorn/development.rb -D 
```

もしかしたらnginxの再起動はいらないかも

<h5>追記</h5>
cssの変更やDBの変更はもう少しコマンド打たなきゃダメみたい
<h6>cssやjavaの場合</h6>

```ruby　
$bundle exec rails assets:precompile RAILS_ENV=production
```
<h6>DBの場合</h6>

```ruby　cssやjavaの場合
$bundle exec rails db:migrate RAILS_ENV=production
```

これらを実行した後に上記の実行すれば編集できる

<h2>他には</h2>

```ruby
$rails restart
```

でも反映されるらしいけど自分は反映されなかった
なぜだろう？将来の自分に丸投げしようと思う
jq "@" ワードが入ったプロパティ名を抽出する際に困った件

## 以下のようなJsonの形式のファイルに対して、プロパティ名に'@'キーワードが入った場合に困った。

```bash
$ cat sample.json | jq
{
  "@title": "is title.",
  "message": "is message."
}

$ cat sample.json | jq .@title
jq: error: syntax error, unexpected end of file, expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.@title 
jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:
.@title
jq: 2 compile errors
```

### 解決策
文字列として扱うために[]と”（ダブルクォート）で囲む

```bash
$ cat sample.json | jq .[\"@title\"]
"is title."
```
#### 複数項目の場合

```bash
$ cat sample.json | jq ".[\"@title\"],.message"
"is title."
"is message."

$ cat sample.json | jq "[.[\"@title\"],.message]|@csv"
"\"is title.\",\"is message.\""

$ cat sample.json | jq "[.[\"@title\"],.message]|@csv"
"\"is title.\",\"is message.\""

$ cat sample.json | jq "[.[\"@title\"],.message]|@csv" | sed -e 's/\"//g' | sed -e 's/\\//g'
is title.,is message.
```
Git LFS からDVC(Data Version Control) に移行した話

## 主旨
 従来、Git　LFSを用いて機械学習のデータを管理してきた。最近、その代わりにDVCを使うようになったので、その過程で感じたことを示す。DVCをどう使っていいのか、使い方に迷っている人の参考になれば幸いです。

 ## Git LFS の状況
 - 機械学習のデータを指定のフォルダ以下をファイル単位の粒度で管理できるツールである。
     - 変更があったファイル名を知ることができるし、テキストファイルの場合にはdiffを表示することもできる。
     - GithubなどでPRの差分をwebブラウザで表示させる場合には、画像ファイルの変更前と変更後とを表示させることもできる。
 - 「Git LFSは、リポジトリに実際のファイルではなく、ファイルへの参照を保存することで大きなファイルを扱います」
 - 通常のGitとの違いは、LFSで管理するファイルをファイルパターンで指定して、そのファイルについては、ファイルへの参照を保存するようになっています。
 - github などのgitのサービスでは、2 GBを超えるリポジトリを作ってはならない制限があります。
 - Git LFSを使うことで、例えば *.jpg のファイルは`git lfs track "*.jpg"` とすることで、LFSに対象にすることができます。
 - その結果、Git LFSを使うことで、大量なデータがあっても2GBの制約の範囲にリポジトリを留めることができます。（LFSで管理しているデータは、リポジトリとは別に容量を消費しているのは変わらない）
### 複数のデータセットからなるデータセットの場合
 - 複数のデータセットからなるデータセットの場合に、git submoduleで管理したことがある。
 - git submoduleの使い方はweb上に多数説明があるのでここでは省略する。
     - git のリポジトリの中に、他のリポジトリを含めて管理するやり方です。
#### git submodule, git lfs の併用は複雑さを高めすぎる。
- ある機械学習のデータセットをsubmodule で複数のリポジトリに分割すると、それぞれのsubmodule での管理と、submoduleとしての管理と、管理作業が格段に増える。
- 感想：
    - 一人で管理運用しているリポジトリだからできた作業
    - 複数名で分業して登録・改変作業をするには、おすすめしない。

## DVCの導入
- DVCのサイトの例題を[video](https://dvc.org/#use-cases)で見てどんなことができるのか、どのような手順で行うのかを見てみよう。
### DVC は何をどうするツールなのか
- 対象のフォルダをまとめて管理するツール。
- ある時点のスナップショットをリモートフォルダに保存する。
- そのスナップショットをフォルダに対するmd5sumで状態を覚えておく(*.dvc)。
- *.dvcファイル自体は、git で管理させる。
- *.dvcの値を元に、dvc pull でそのときのフォルダ構成を、リモートフォルダから再構築する。
- DVC自体は、ファイル保存のサービスを行っていない。既存のリモートフォルダサービスのどれかをユーザーが選択して利用する。（Google Drive, Google Cloud Storage, AWS(S3)など）
- ちなみに、どの時点のスナップショットでも再現できるようにしているリモートのフォルダは、DVCを介して扱えるようになっているので、DVCを介せずにアクセスしても、意味不明の状況になる。
#### DVCではしないこと
- ある時点でのdvc、git への登録内容と、別の時点のdvc, gitへの登録内容の比較
    - 知りうるのは、sizeとnfilesとhash値だ。
    - そのため、どのファイルが変更になったのかさえ知ることができない。

### DVCをデータ管理に利用する
- DVCのビデオとDVCの公式サイトのドキュメントをたどるように設定を行うことで、DVCを利用したデータ管理を導入できた。

### 個人的に割り切った使い方
- 変更は、subfolderの追加を基本としよう。
- subfolderへのファイルの追加はしない。
- DVC管理下のフォルダ構成の情報は、テキストファイルに自動で保存させる。そのファイルをgit で管理する。
- そうすれば、gitで見たときに、subfolder の状況の変化がGithub上などで確認できる。
- Github のPRの中で、変更点についてのヒントを記載し、gitの側で変更状況をたどれるようにする。

## DVC 以降の利点
- 参照するだけの利用者にとっての利点
```
$ git checkout main
$ git pull
$ dvc pull
```
これだけの作業で済む。
このため、git submodule, git LFS を使ったときの場合にくらべ手順が単純になる。

## DVC に移行する上で必要な発想の転換
- 全ての操作において、どこをどう変更したという差分を表示して、変更点を明示的に管理しようと考えを断念しよう。
- どういう手順で、元画像を加工して学習用の画像に変換したとか経緯とかは、DVCで管理するべきではない。
- あとは利用するだけになったデータだけをsubfolderで追加するだけという単純化をした。
- dvc add; dvc push とかをする時点での対象フォルダのファイル構成・ファイルがとにかく正しいとするものである、as-is（あるがまま）のデータ管理であるというのを受け止めること。
    - 不用意に意図しない変更を対象フォルダに対してしないこと。
    - subfolderやsubfolder中のファイルを削除・破壊していても、dvcは警告をしない。

## まとめ
- DVCを使うためには、Gitと発想が違うことを理解する必要がある。
- そのことを理解して運用すれば、運用の手順自体はgit submodule, git LFS を使うよりははるかに簡単である。
- git はローカルに履歴を持つので、git の管理対象が増えれば増えるほど、ローカルPCでの領域を圧迫してしまう。しかし、DVCでは*.dvcファイルをgit で登録させるだけなので、ローカルに持つ履歴が少なくなる。
- そのような違い方を理解すればDVCは使いやすい

## 関連記事
[DVC(Data Version Control) を使って画像データセットを管理する](https://qiita.com/nonbiri15/items/d1447a119cd06a12e026)

[DVCでのデータの登録を複数人で行う場合の注意　ー 手順を間違えるとデータを失える ー](https://qiita.com/nonbiri15/items/ed0c44e3d74d9a584c9f)
ch32v003funのexamples/i2c_oledで、8ピクセル右にズレて描画されることがある問題

# 症状

[ch32v003fun](https://github.com/cnlohr/ch32v003fun)を使ってOLEDに画像を表示しようと思い、examplesを参考にしました。i2c_oledという、ずばりのものがあります。最初は気が付かなかったのですが、左側の隙間がちょっと広いときがあります。よく調べてみると、`ssd1306_drawImage()`関数で画像を描画すると、8ピクセルだけ右にズレた位置から描画が始まってました。

# 対処方法

[examples/i2c_oled/ssd1306.h](https://github.com/cnlohr/ch32v003fun/blob/f1820f2995e146ce8be0e3a94cb34a53d8238061/examples/i2c_oled/ssd1306.h#L268C39-L268C39)を修正します。アドレス計算が間違っていました。

```diff_c
--- a/examples/i2c_oled/ssd1306.h
+++ b/examples/i2c_oled/ssd1306.h
@@ -265,7 +265,7 @@ void ssd1306_drawImage(uint8_t x, uint8_t y, const unsigned char* input, uint8_t
                        uint8_t input_byte = input[byte + line * bytes_to_draw];
 
                        for (pixel = 0; pixel < 8; pixel++) {
-                               x_absolute = x + 8 * (bytes_to_draw - byte) + pixel;
+                               x_absolute = x + 8 * (bytes_to_draw - 1 - byte) + pixel;
                                if (x_absolute >= SSD1306_W) {
                                        break;
                                }
```

# おわりに

Issueを出しましたが今のところ反応がないですね。
テスト 通知設定3

`PendingIntent`を使用して通知を送信し、その通知がタップされたときにブロードキャストレシーバーを継承したクラスの`onReceive`メソッドを呼び出す方法は、次の手順で行えます。

1. ブロードキャストレシーバーを継承したクラスを作成:

   まず、ブロードキャストレシーバーを継承した新しいクラスを作成します。このクラスはブロードキャストを受信する役割を担います。例えば、`MyReceiver`というクラスを作成しましょう。

   ```java
   public class MyReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent intent) {
           // ブロードキャストを受信したときの処理を記述
           String data = intent.getStringExtra("key");
           // 通知を作成または他のアクションを実行
       }
   }
   ```

2. マニフェストでブロードキャストレシーバーを宣言:

   AndroidManifest.xmlファイル内で、作成したブロードキャストレシーバーを宣言します。これにより、アプリがブロードキャストを受信できるようになります。

   ```xml
   <receiver
       android:name=".MyReceiver"
       android:enabled="true"
       android:exported="true">
       <intent-filter>
           <action android:name="com.example.MY_ACTION" />
       </intent-filter>
   </receiver>
   ```

   この例では、`MyReceiver`クラスが "com.example.MY_ACTION" アクションを受信するように宣言されています。

3. PendingIntentを使用して通知を送信:

   MainActivity内で`PendingIntent`を作成し、通知のコンテンツと一緒に設定します。通知のタップ時にブロードキャストを発信するために、`PendingIntent`を通知にセットします。

   ```java
   Intent intent = new Intent("com.example.MY_ACTION");
   intent.putExtra("key", "value");
   
   // ペンディングインテントをブロードキャストとして作成
   PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

   // 通知を作成
   NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
           .setSmallIcon(R.drawable.ic_notification)
           .setContentTitle("通知タイトル")
           .setContentText("通知本文")
           .setContentIntent(pendingIntent) // タップ時のアクション
           .setAutoCancel(true); // 通知をタップしたら自動的に消去

   // 通知を表示
   NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
   notificationManager.notify(notificationId, builder.build());
   ```

   このコードは、通知を送信するために`PendingIntent`を使用し、通知がタップされたときに指定されたアクション（ブロードキャスト）を発信します。ブロードキャストはマニフェストで宣言された`MyReceiver`クラスの`onReceive`メソッドを呼び出します。ブロードキャストアクション名は、マニフェストで宣言したものと一致している必要があります。

これにより、通知がタップされたときにブロードキャストレシーバー内の`onReceive`メソッドが呼び出され、指定したアクションに応じた処理を実行できます。
Pythonで「プログラムを保存するファイルで使用する文字コードを設定する」の動作を確認してみた

# 概要

Pythonで「プログラムを保存するファイルで使用する文字コードを設定する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/ini/index5.html

# 実装

以下のファイルを作成しました。
```sample5-2.py
# coding: utf_8
print("こんにちは")
```
以下のコマンドを実行しました。
```
$ python3 sample5-2.py 
こんにちは
```

# まとめ

何かの役に立てばと。