OmniAICreator/Qiita-1.07M huggingface dataset:
リリースファイルの中身を確認するVBOを作りました。 #blueprism

# 用途
お出かけのときに「いま玄関の鍵閉めたよね？」と何度も戻って確認したくなっちゃう感じ。
リリースファイルを作ったけど、「中身ほんとに合ってる？」と確認したくなっちゃう人へ。
もしくは、「これ、いつの何のリリースファイルだっけ？」「リリースファイルが3個あるけど一番内容が新しいやつはどれ？」と確認したい場合など。

# 作り方
Blue Prism Communityの、BluePrint（開発や運用の事例を投稿するカテゴリ）の投稿から元になるVBOを拾ってきます。
[Making release management faster for a Centre of Excellence ](https://community.blueprism.com/t5/Blueprints/Making-release-management-faster-for-a-Centre-of-Excellence/ta-p/110729)

中身はとてもシンプル。リリースファイルのXMLをコレクションにして返すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/f435f795-9fda-48d8-b3e4-cf0fbedf564d.png)

このアクションで出力されたXMLコレクションは、こんな形になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/11f92eec-7faa-80a1-7509-98870ca1f14d.png)

アクションの中身も超シンプル。
「Read File」コードステージで、こうやってファイルを読んでテキスト型のデータアイテムに格納してから
```VB
XML = File.ReadAllText(Path)
```

「Get XML Tree View」コードステージで、そのテキストをコレクションに格納。
はーこんなシンプル綺麗にできるもんなのね。
```VB
Dim xmlDoc As New XmlDocument()
        xmlDoc.LoadXml(xmlData)

        ' Initialize DataTable and define columns
        'Dim dt As New DataTable("XMLStructure")
        dt.Columns.Add("HeadParent", GetType(String))
        dt.Columns.Add("HeadElement", GetType(String))
        dt.Columns.Add("NodeType", GetType(String))
        dt.Columns.Add("Value", GetType(String))
        dt.Columns.Add("Attributes", GetType(String))

        ' Populate DataTable with XML elements
        If ProcessXmlNode(xmlDoc.DocumentElement, dt) Then
            Console.WriteLine("XML processed successfully.")
        Else
            Console.WriteLine("XML processing failed.")
        End If
```

そして、このアクションを大改造したものがこちら。
一番左のブロックが、もともとあったコードステージです。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/63cf84bc-5acb-2c1f-ccb2-2e2cd5f9401e.png)

## リリースファイル情報
このXMLコレクションから「HeadParent」が「bpr:release」のものだけを抽出すると、リリースファイルの以下の情報が得られます。
- パッケージ名
- リリースファイル名
- リリースファイル作成日時（UTC）

## リリースファイル内容物一覧
「HeadParent」が「bpr:contents」のものだけを抽出します。
「Attribute」列には、各々の内容物の情報が入っています。
- id
- 名前（プロセス名、VBO名、環境変数名、など）
- 種類（プロセス、ワークキュー、認証情報、など）
※種類については、プロセスもVBOも「プロセス」となります

Attributesの値は、たとえばプロセスだとこんなかんじ
```
id = e77999df-1a17-9999-9b7e-33c999999956; name = サンプルプロセス001; published = true; xmlns = http://www.blueprism.co.uk/product/process;
```
これを、Utility - Strings の split text アクションでバラして得た情報を蓄積していけば、内容物の一覧を得られます。

# 終わりです
[Blue Prism Community](https://community.blueprism.com/) は、検索がアレだし、リニューアルされてどこに何があるかが変わっちゃったので、欲しい情報を探すのが骨なんですが、それでも公式なだけに情報量が圧倒的です。ほんとマジでマメに見といて損はない。
[日本語のコミュニティもあります](https://community.blueprism.com/t5/Japan-Community/bd-p/japan)。
Communityのアカウント登録はユーザでなくてもできて、メアド（企業アカウントじゃなくても、Gmailとかで大丈夫）さえあればOK。ちょっと覗いてみようくらいの感じでお試しください。
【Rails】aarch64で環境を立ち上げた時にNokogiriのインストールでエラーが発生した件

どうもこんにちは。

今回は、RailsをAWS Elastic Beanstalk環境へデプロイした時に失敗したので、その時の対処方法を備忘録として残します。

# 発生していたエラー

今回、デプロイに失敗した理由が、「**`nokogiri`** gemが正常にインストールできない」ことでした。

```ruby
An error occurred while installing nokogiri (1.16.7), and Bundler cannot continue.

In Gemfile:
  dropzonejs-rails was resolved to 0.8.5, which depends on
    rails was resolved to 7.0.5, which depends on
      actioncable was resolved to 7.0.5, which depends on
        actionpack was resolved to 7.0.5, which depends on
          actionview was resolved to 7.0.5, which depends on
            rails-dom-testing was resolved to 2.2.0, which depends on
              nokogiri
```

なんでだーと思って調べていると、`nokogiri`ってCのネイティブライブラリなんですね。
**Cのネイティブライブラリ**とは、Rubyのためのライブラリというわけではなく、他の言語でも使用されるC言語で開発されたライブラリという認識です。

つまり、「**`nokogiri`が動くために必要なCのライブラリが足りない**」かなと推測できます。

# 犯人だぁれ？

さらに、ちょっとGemfile.lockを確認してみてると、aarch64用の`nokogiri`がインストールされていました。

```lock:Gemfile.lock
nokogiri (1.16.5-aarch64-linux)
```

犯人はこいつでした。
EB環境は`linux/x86_64`環境で動作しているので、そりゃ失敗するわけだ。

# どう解決する？

ということで、`linux/x86_64`アーキテクチャでも動作するようにGemをインストールしなおしましょう。

## 1. ローカルのDockerfileで必要なライブラリをインストール

```Dockerfile
RUN apt-get update -qq && apt-get install -y build-essential libxml2-dev libxslt1-dev
```

## 2. ビルド

```sh
docker-compose build
```

## 3. 立ち上げ

```sh
docker-compose up
```

## 4. `--platform=ruby`を指定して`nokogiri`をインストール

```sh
docker-compose exec web gem install nokogiri --platform=ruby -- --use-system-libraries
```

## 5. `force_ruby_platform`をTRUEに設定

```sh
docker-compose exec web bundle config set force_ruby_platform true
```

## 6. bundle install

```sh
docker-compose exec web bundle install
```

# Gemfile.lock確認

```lock:Gemfile.lock
nokogiri (1.16.7)
```

マイナーバージョンあがっちゃったけどまぁOK！

これでEB環境にデプロイしてもエラーは消えました。

# まとめ

Mac使っている人は、アーキテクチャの違いに気をつけてデプロイしたり環境構築したりすると良いと思います。

以上
Roadmap.shで学ぶFlutter - StatelessWidget -

# 導入
[roadmap.shのFlutter](https://roadmap.sh/flutter)の2本目の記事になります。

Widget周りはまぁ理解しているつもりになっていますが、特に公式のサイトを読んで理解したというよりは、利用していく中で理解したことが多いので、今回もroadmap.shに従ってWidgetのStatelessWidgetについて勉強しましたのでそのまとめです。

元々のサイトはこちら。

https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html

# StatelessWidget
## 概要
StatelessWidgetとは、、、変更可能な状態を必要としないウィジェットです。
言わずもがな、ですが。

StatelessWidgetは、オブジェクト自体の設定情報やウィジェットが展開される BuildContext 以外のものに**依存しない**UIにおいて便利です。状態に依存して動的に変わる可能性のある構成については、**StatefulWidget** の使用を検討する必要があります。

## パフォーマンスの考慮事項
StatelessWidget の build メソッドが呼び出されるのは、以下3パターンある。

- ウィジェットがツリーに最初に挿入されたとき
- ウィジェットの親が設定を変更したとき (Element.rebuild を参照)
- ウィジェットが依存している InheritedWidget が変更されたときです。

2点目のように定期的に親ウィジェットが設定を変更する場合、または3点目のように頻繁に変更される InheritedWidget に依存している場合は、**ビルドメソッドのパフォーマンスを最適化**して、スムーズなレンダリングパフォーマンスを維持することが重要です。

### StatelessWidget の再ビルドの影響を最小限に抑えるテクニック
- ビルドメソッドによって生成されるノードの数を最小限に抑える
    - 例
        - 複雑な `Rows`、`Columns`、`Paddings`、`SizedBoxes` の配置を使用する代わりに、単に `Align` や `CustomSingleChildLayout` を使用することを検討する。
        - 複数の `Containers` と `Decorations` を使用する代わりに、単一の `CustomPaint` ウィジェットを検討する。
- `const` ウィジェットを使用する。
- StatelessWidget を StatefulWidget に変更して、StatefulWidget の例にあるような技術を使用できるようにします。
    - 例
        - サブツリーの共通部分のキャッシュ
        - ツリー構造を変更する際に GlobalKeys を使用する
- InheritedWidgets を使用してウィジェットが頻繁に再ビルドされる可能性がある場合には、StatelessWidget を複数のウィジェットにリファクタリングし、ツリーの変更がある部分をリーフに押し込む。
    - 例
        - 4 つのウィジェットで構成されたツリーについて、最も内側のウィジェットが Theme に依存している場合、そのウィジェットを構築するビルド関数の部分を**独自のウィジェットに切り出す**ことを検討する。
            - これにより、テーマが変更されたときに最も内側のウィジェットのみを再ビルドするだけで済む。
- 再利用可能な UI 部品には、ヘルパーメソッドよりもウィジェットを使用する。
    - 例
        - ウィジェット構築に使用する関数がある場合、`State.setState` の呼び出しは、返却されたラップウィジェット全体をFlutterが再ビルドする必要がある。
            - その代わりに**ウィジェット**を使用すると、更新が必要な部分のみを効率的に再レンダリングできる。
            - さらに、作成されたウィジェットが const であれば、よりパフォーマンス改善につながる

## StatelessWidgetの例

GreenFrog という StatelessWidget サブクラスのスケルトン
```dart
class GreenFrog extends StatelessWidget {
  const GreenFrog({ super.key });

  @override
  Widget build(BuildContext context) {
    return Container(color: const Color(0xFF2DBD3A));
  }
}

```

色と子ウィジェットを指定できるより一般的なウィジェット Frog
```dart
class Frog extends StatelessWidget {
  const Frog({
    super.key,
    this.color = const Color(0xFF2DBD3A),
    this.child,
  });

  final Color color;
  final Widget? child;

  @override
  Widget build(BuildContext context) {
    return ColoredBox(color: color, child: child);
  }
}

```

# 終わりに

今回StatelessWidgetについて、公式のサイトを読んでみました。
今回触れた技術や最適化の方法を活用し、FlutterアプリケーションのパフォーマンスとUXを向上させていきたいと思いました。Flutterのウィジェットシステムを深く理解し、最適な構成を模索していきたいです。
Jira Resolution Field設定

# 設定方法

1. Admin権限を取得
1. Project Settings から対応するWorkflowの編集へいく
1. TransitionにPost Functionを追加する

# 確認方法

Resolutionフィールドが適切かどうかの確認（以下のいずれかがあればおかしい可能性がある）：

1. `Done` なのに resolutionがついていないTicketがないかどうか → あったら設定がおかしい可能性

    ```
    statuscategory = Done and resolution is EMPTY
    ```

1. `Done` でないのに resolutionがついているTicketがないかどうか → あったら設定がおかしい可能性

    ```
    statuscategory != Done and resolution is not EMPTY
    ```

# 具体的な設定

## 画面

1. Workflowの画面に行って、右側のペンiconから編集を選択
1. 各Transitionに対して以下のPost Functionをつける
1. `Add post function`を選択
1. Actionに`Update Issue Field`を選び、次へ
1. Isusue Field: `Resolution` 
1. Field Value: `None` or `Done` を選択


Issue FieldとIssue Valeuを設定するところ:
![Screenshot 2024-07-29 at 17.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/dfdfda2c-6092-8978-5063-e15a7a93ecf3.png)

設定終わり or `Add post function` を押す画面
![Screenshot 2024-07-29 at 17.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/26bbb26f-4ed5-1261-7b92-a06925bee578.png)


Post Functionがちゃんとつくと以下が出てくる
![Screenshot 2024-07-29 at 17.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/4ac8f81e-0011-52d5-3c01-e2a4d334d242.png)

## 対象

今回設定したPost Functionの対象:

- Resolution is Doneをセット
    - Transition: DISMISS
    - Transition: Done
- Resolution is cleared (None)
    - Transition: Create
    - Transition: Backlog
    - Transition: In Progress

# 終わり

Resolution fieldが設定されているとQuarterの終わりに、そのQuarterにどんなチケットが終わったのかを簡単にとってこれるようになるので、正しく設定することが大事ですね。

# Ref

1. https://confluence.atlassian.com/cloudkb/best-practices-on-using-the-resolution-field-968660796.html
SharePointのファイルをアプリで開こうとしても開けない（「必要な情報をダウンロードできません。」エラーに対する対処法）

# エラー内容
ある日を境に、SharePointに保存しているファイルをアプリ（ExcelやPowerPoint、WordといったOffice365製品）で開こうとすると下記のようなエラーが発生するようになってしまった。
> 必要な情報をダウンロードできません。
> 申し訳ございません。ファイルを開くことが出来ませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/0b541b27-81a0-50bc-c8ed-12490c7d8b16.png)

# 対処法
ネットで調べただけだから原因まではわからないが、以下を実施すればひとまずエラーは発生しなくなった。

1. ネットワーク接続の表示を起動させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/08747395-0885-e575-8999-d2aa63a57afd.png)
2. Wi-Fiを右クリックしプロパティを開く
![１３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/33293c58-453d-eb65-c9e5-77131233113b.png)
3. インターネットプロトコルバージョン6（TCP/IPv6）のチェックを外す
![１２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/f569678d-3d4d-9d29-a824-8ef59f27aece.png)

# 所感
実は「インターネットプロトコルバージョン6（TCP/IPv6）」のチェックを外すだけで、他にも様々なエラー（会社が管理しているアプリ系のエラー）が解消されている。
何かもっと根本的な原因がありそうだが、ひとまずこれで業務に影響は無くなった。
LWCから画面フローに変数を渡せません



+ [LWCから画面フローに変数を渡せません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmRrp)

:::note
この値を格納するコンポーネントの詳細を開くと「手動で変数を割り当て」というチェックボックスはありませんか？これを有効にしてみてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2d871b9b-d190-14d9-61ce-c95f6d87d80f.png)

The only thing you missed is checking the 'Manually assign variables' in the Advanced section, which would allow you to assign the output of your LWC to a variable in the flow.

https://salesforce.stackexchange.com/questions/347767/pass-a-variable-out-of-lwc-and-up-to-screen-flow-dynamically

https://issues.salesforce.com/issue/a028c00000gAyKAAA0/flow-with-lightning-component-does-not-carry-the-changed-values-into-next-screen-when-toggling-between-previous-and-next-screens
:::
IBM i 出口プログラム (Exit Program)、出口点てなんですか？

## 出口プログラム (Exitプログラム）とは？

***出口プログラム (Exitプログラム）とは、IBM i のOS機能を実行する前後にユーザー作成プログラム（ユーザーが制御したい条件やロジック）を埋め込みできる機能を指します。***

正確には、
***出口点（Exit Point）：ユーザー作成プログラムを登録するエントリーポイント***
IBM i OS機能の実行する前（または後）に、呼び出すことが出来るユーザー作成プログラムを指定できます。

***出口プログラム（Exit Program）：出口点(Exit Point)に登録するユーザー作成プログラム***
以下の例ではIBM i のFTPサーバーにログインする際のユーザーID（ほか？）を判断してFTPセッション中で実行できるコマンドや機能を制限する事ができます。

※クライアントのIPアドレスを判断して制御、も実装できます。

下図のようにIBM i ではftpでIBM i にログイン時、ログイン後の操作時の挙動を制御するユーザー作成プログラム（RPG,COBOL,CLP,Java,etc.）が実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/825bef44-c6c5-4250-a21e-055be696fb5f.png)


## 出口点（Exit Point）の登録情報は WRKREGINFコマンドで確認できる

/WRKREGINF EXITPNT(*ALL) 

で全ての出口点のリストを取得できます。
- OUTPUT(*PRINT)を指定すればスプールに落とすことができます。
- EXITPNT(*REGISTERED) - 出口点に出口プログラムを登録しているものだけ
  ※ユーザーのExit Program登録だけでなく、システムで登録済みの出口点も表示されます。
- EXITPNT(*UNREGISTERED) - 出口プログラム登録がない出口点
を表示・出力もできます。

***WRKREGINFコマンドの実行例：出口点の一覧（例）です。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b315642b-6760-abaf-918a-bb5d3618fdad.png)


***WRKREGINFコマンドの実行例：上記画面からOPT.5で出口点の登録情報を表示できます。***
上記画面の一番上のFTPサーバーのログオンのExit Pointの登録情報を見てみますと、下図のように、出口プログラムの現在数は0だと分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9879b27e-5afc-7461-ac01-73f7901f70cd.png)

## 例）FTPサーバーログオンのExit Pointは3種類あります（出口点の形式）

上にあげたIBM i FTPサーバーの2種類のExit Pointのうち、ログイン時のExit Point　QIBM_QTMF_SVR_LOGONは3行あります。この3行は同一の処理（ftpサーバーにログインする際の挙動の制御）に対する処理ですが、それぞれのExit Pointで処理可能な内容が異なります。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/49bebd0d-5666-36ff-9adc-2a9229906ff4.png)

3つの出口点の処理内容は下記です。
参考：[FTPサーバー・ログオン出口点](https://www.ibm.com/docs/ja/i/7.5?topic=programs-ftp-server-logon-exit-point)

***TCPL0100*** : FTPサーバーへのログオン可否、ログインするIBM i ユーザープロフィール・パスワード、現行ライブラリーの制御
***TCPL0200*** : 上記に加え、作業ディレクトリの指定、アプリケーションのリターンコードを返す、ftpクライアントとの暗号化制御が可能です。
***TCPL0300*** : 上記2つに加え、パスワード・ディレクトリーのCCSID処理、クライアント認証されたユーザー情報の受取りが可能です。

Exit Point QIBM_QTMF_SVR_LOGON に登録可能なExit Programは上記3つのうち1つだけです。当然ですが登録するExit Programに実装するロジックやパラメーターは3つのExit Pointの形式毎に異なります。

## Exit Programを作成・追加してみる

・・・記憶では20世紀にやった記憶がありますがあまりに遠すぎて・・(^^;　…改めてやってみたいと思います・・

FTPサーバーログオンの出口点のサンプルがこちらにあります。。

[例: CL コードで作成された FTP サーバー・ログオン出口プログラム](https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-cl-code)
[例: ILE RPG コードで作成された FTP サーバー・ログオン出口プログラム](https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-ile-rpg-code)
[例: C コードで作成された FTP サーバー・ログオン出口プログラム](https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-c-code)

つづき・・・
[実際に書いてみました](https://qiita.com/gomAnomalocaris/items/853b64979b9605e707ff)
MuleSoft Composer　学習、資格

[MuleSoft Composerまとめに戻る](https://qiita.com/Keiji_otsubo/items/ef2fdd213551168c360b)

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

# 学習、資格

+ [Mulesoft Developer 1 のセルフペース トレーニング リソースはどこにありますか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clIKn)

:::note
マイペースコースのリストはこちらからご覧ください。

https://trailhead.salesforce.com/help?article=MuleSoft-Self-paced-Course-FAQ

https://trailhead.salesforce.com/help?article=Salesforce-Certified-MuleSoft-Developer-I-Exam-Guide
:::

+ [ MuleSoft Certified Developer - Level 1試験のスケジュールを設定するためのバウチャーを取得しましたが、現在から 5 月 6 日までの間に利用可能な枠がありません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLX5k)
+ [Login issue for mulesoft](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoSap)

:::note
MuleSoft Self-paced learning is now available via Trailhead. To provide a more centralized learning experience, we retired the training.mulesoft.com website in May 2024.

MuleSoft の自習学習が Trailhead 経由で利用できるようになりました。より一元化された学習体験を提供するために、2024 年 5 月に training.mulesoft.com Web サイトを廃止しました。
:::

+ [Is Anypoint Platform Development: Fundamentals still free to learn?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoTQp)

:::note
Yes, the course is no longer free. Please refer to the following link for more information: 
[Anypoint Platform Development: Fundamentals](https://trailheadacademy.salesforce.com/classes/DEX401-mulesoft-development-fundamentals)
:::

+ [PDF content for part 2 is not opening for the course: DEX401](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cleh6)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cldVxSAI
:::

+ [MuleSoft RPA のトライアルエディションはありますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLSlh)

:::note
1. Unlike Anypoint studio which is available for a 30days of free trial , Mulesoft RPA and Mulesoft Composer are not free and you as a customer needs to purchase additional licenses.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KYf5nSAD

https://help.mulesoft.com/s/question/0D52T00005yLRspSAG/does-mulesoft-rpa-available-for-evaluation-free-trail-like-we-have-for-any-point-platform-30-days
:::

+ [mulesoft certified developer - level 1の資格を取得したく勉強を開始しようと思うのですが、無料で学習できるサイトなどはございませんか。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmSpG)

:::note
英語ですが演習ガイドというのがあるみたいです。478ページの英語... 私には無理でした。

https://tandcorg.my.salesforce.com/sfc/p/#3000000075Dm/a/4V0000003A4e/IMgl0E4WnmtvLon43NSC13i1vHttpnXoEMzII_rTt0I

無料のトライアル環境（特別版のDE環境）はないみたいですね。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KYf5nSAD
:::

+ [DEX401 コース パート 1」リンクが機能しません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clSiC)

:::note
欠落」リンクについて質問している皆さん。これらの「タスク」は区切りとして使用され、欠落しているリンクはありません。MuleSoft チームはコースを更新し、タスクが不要であることを示すメモを追加しました。お役に立てば幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a97dbc68-221c-38df-b1a1-aa15458427e7.png)
:::
paizaラーニングレベルアップ問題集の「名刺バインダー管理」をやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[名刺バインダー管理](https://paiza.jp/works/mondai/b_rank_skillcheck_archive/name_card)をやってみました（というより、解き方を書いてみました）。
- - -
一枚のファイルには、$n$個のポケットが横に並んでおり、
一つのポケットには、表裏2枚の名刺が背中合わせに入っているので、
一枚のファイルには表裏合わせて$2n$個のポケットがあります。

$1$枚目のファイルの表には$1$番から$n$番の名刺が左詰めに並んでおり、
$1$枚目のファイルの裏には$n+1$番から$2n$番の名刺が左詰めに並んでおり、
$2$枚目以降のファイルにも同様に名刺が並んでいることから、
$i$枚目のファイルの表には$2n(i-1)+1$番から$2n(i-1)+n$番の名刺が左詰めに、
$i$枚目のファイルの裏には$2n(i-1)+(n+1)$番から$2n$番の名刺が左詰めに
並んでいることが分かります。

さて、$i$枚目の表の左から$j$番目の裏には、$i$枚目の裏の右から$j$番目、即ち左から$n-j+1$番目の名刺があることになります。
$i$枚目の表の左から$j$番目の名刺の番号は$2n(i-1)+j$、
その裏は$2n(i-1)+n+(n-j+1)=2ni-j+1$の番号の名刺があります。
表裏の名刺の番号を足すと
```math
4ni-2n+1
```
となります。

では、番号$m$の名刺は何枚目のファイルにあるでしょうか。
一枚のファイルには表裏合わせて$2n$枚の名刺がありますので、
```math
\left\lceil\frac{m}{2n}\right\rceil
```
枚目になります。これをプログラムの整数除算（端数切捨）では
```math
\left\lfloor\frac{m+2n-1}{2n}\right\rfloor
```
を各言語で実装することになります。
これを上の式の$i$に代入して
```math
4n\left\lfloor\frac{m+2n-1}{2n}\right\rfloor-2n+1
```
が、番号$m$の名刺と裏の名刺の番号を合わせた数となります。
したがって、裏の名刺の番号は
```math
4n\left\lfloor\frac{m+2n-1}{2n}\right\rfloor-2n+1-m
```
或いは
```math
2n\left(2\left\lfloor\frac{m+2n-1}{2n}\right\rfloor-1\right)+1-m
```
となります。

「$n$,$m$を標準入力から受け取って、上式の計算結果を出力する」
これを自分の得意な言語で実装すれば答えになります。

以上、ノーコード記事でした。
【Laravel】QRコードを生成する方法

## はじめに
Laravelでは簡単にQRコードを生成できるとのことでその記録です。

### 動作環境・使用するツールや言語

- OS バージョン
    - Windows11
- ツール
    - VSCode
- 言語
    - HTML&CSS
- フレームワーク
    - Laravel8
- 環境
    - docker v4.32.0

## 前提
- Laravelのセットアップは済んでいるものとする
- web.phpは特段変わるとこないので省く


## 手順
1．パッケージのインストール
2. サービスプロバイダーとエイリアスの設定
3. コントローラーでQRコードを生成
4. ビューでQRコードを表示

## 1．パッケージのインストール
```:PHPコンテナ内
composer require simplesoftwareio/simple-qrcode
```
- このコマンドでインストール完了
インストールされたかどうか確認する方法はいくつかあるが、一番簡単だなぁ～と思ったのが、``composer.json``で確認する方法。
```JavaScript:src\composer.json
{
    ~
    "require": {
        ~
        "simplesoftwareio/simple-qrcode": "^2.0"
        // 上記のように"simplesoftwareio/simple-qrcode": "^2.0"があればOK
    },
    ~
}
```

## 2. サービスプロバイダーとエイリアスの設定
```PHP:config\app\php
'providers' => [
    ~
    SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class,
    // 色々書いてあるが、一番下に記述
]

'aliases' => [
    ~
    'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class,
    // 色々書いてあるが、一番下に記述
]
```

## 3. コントローラーでQRコードを生成
```PHP:QrCodeController.php
use SimpleSoftwareIO\QrCode\Facades\QrCode;

public function test()
{
    $qrCode = QrCode::size(200)->generate("Hello World");
    return view('test', compact('qrCode'));
}

```
**コントローラーではなく、ビューでQRコードを生成する場合は下記 ↓**
```PHP:QrCodeController.php
public function test()
{
    return view('test');
}
```


## 4. ビューでQRコードを表示
```HTML:test.blade.php
<body>
    <div>{!! $qrCode !!}</div>
</body>
```
**コントローラーではなく、ビューでQRコードを生成する場合は下記 ↓**
```HTML:test.blade.php
<body>
    {!! QrCode::generate('Hello World')) !!}
    <!-- generate()でQRコードの内容を指定 -->
</body>
```

## 主要なつまずいた所
１．上記「4. ビューでQRコードを表示」まで行き、ブラウザで確認したところ、``「クラス 'SimpleSoftwareIO\QrCode \ QrCodeServiceProvider'が見つかりません」``とエラーが出現。


### 考えたこと・実行したこと
- サービスプロバイダーとエイリアスの記述が正しくない？
    - 問題なし
- ``composer require simplesoftwareio/simple-qrcode``をインストールした時のPHPコンテナ内のメッセージを確認
    - ``Cannot use simplesoftwareio/simple-qrcode's latest version 4.2.0 as it requires ext-gd * which is missing from your platform.``を確認。
    - ext-gd 拡張モジュールが不足しているため、最新バージョンの simple-qrcode をインストールできなかったとのこと

### 解決策
Dockerコンテナ内でPHPのgd拡張モジュールをインストールと設定を追記
```:Dockerfile
RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd
```

改めて、dockerビルドからやり直すとうまく表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669894/c50371bf-bd07-89f4-0a6b-a50c66fa5b9a.png)






## 参考資料

https://www.yui-web-beginner.net/laravel-qrcode/
CronJobとIstio同時に使うとPodが永遠に終了しない問題

## 問題

アプリケーションコンテナが意図的にexitすると（特にJobの場合など）、Istioコンテナは実行され続けてしまう。

> If an application container intentionally exits (typically from usage in a Job), Istio’s container will still run and keep the pod running indefinitely. This is also a [top GitHub issue](https://github.com/istio/istio/issues/11659).

## 根本解決

k8s 1.29以降のsidecar containers
1. https://istio.io/latest/blog/2023/native-sidecars/
2. https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/

## Workaround


[Using Istio with CronJobs](https://github.com/istio/istio/issues/11659)

```
            command: ["/bin/bash", "-c"]
            args:
              - |
                trap "curl --max-time 2 -s -f -XPOST http://127.0.0.1:15000/quitquitquit" EXIT
                while ! curl -s -f http://127.0.0.1:15020/healthz/ready; do sleep 1; done
                sleep 2
                {{ $.Values.cron.command }}
```

`curl -fsI -X POST http://localhost:15020/quitquitquit` が必要
[備忘録] Go CloudFunctionsでChain Middlewareを利用する

# Go CloudFunctionsでChain Middlewareを利用する

経緯

フト思った時に変態っぽいコードの書き方をしていたので、備忘録。

###### TL;DR

呼び出し元のfunctionsで、http.HandlerFunc(handler).ServeHttp(w, r)で実施する。

```middleware.go
package middleware

import "net/http"

type Middleware func(http.Handler) http.Handler

func ChainMiddleware(h http.Handler, m ...Middleware) http.Handler {
	if len(m) < 1 {
		return h
	}

	wrapped := h

	for i := len(m) - 1; i >= 0; i-- {
		wrapped = m[i](wrapped)
	}

	return wrapped
}

func LoggerMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		slog.Info("call http")
		next.ServeHTTP(w, r)
	})
}

```

```function.go
package function

func init() {
  ms := []middleware.Middleware{
		middleware.LoggerMiddleware,
	}
	funcframework.RegisterHTTPFunction(functionName,
		func(w http.ResponseWriter, r *http.Request) {
			middleware.ChainMiddleware(http.HandlerFunc(HelloHandler), ms...).ServeHTTP(w, r)
		},
	)

}
```
【Xcode/Firebase/Swift】自動ログインの方法

備忘録
firebaseのセットアップおよびユーザー登録機能の開発は完了している前提

# AppDelegate
変数`window`を追加し、`func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool`を下記のように修正する。
```
 var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        
        // 現在のユーザーを取得
        if Auth.auth().currentUser != nil {
            // ログインしている場合は、メイン画面に遷移
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let mainViewController = storyboard.instantiateViewController(withIdentifier: "MainView")
            window?.rootViewController = mainViewController
        } else {
            // ログインしていない場合は、ログイン画面に遷移
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let loginViewController = storyboard.instantiateViewController(withIdentifier: "LoginViewController")
            window?.rootViewController = loginViewController
        }
        
        return true
    }
```

# SceneDelegate
変数`window`を追加し、`func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)`を下記のように修正する。
```
var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
        
        // 現在のユーザーを取得
        if Auth.auth().currentUser != nil {
            // ログインしている場合は、メイン画面に遷移
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let mainViewController = storyboard.instantiateViewController(withIdentifier: "MainView")
            window?.rootViewController = mainViewController
        } else {
            // ログインしていない場合は、ログイン画面に遷移
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let loginViewController = storyboard.instantiateViewController(withIdentifier: "LoginViewController")
            window?.rootViewController = loginViewController
        }
```
AnsibleでCiscoのIOSへの設定サンプル

### AnsibleでCiscoのIOSへの設定サンプル

### 必要なもの

- Ansibleがインストールされている管理サーバ（ここではubuntu）
- ネットワーク接続が可能なCisco IOS機器
- SSH経由でCisco機器にアクセスするための認証情報

### Cisco機器の設定（SSHパスワード認証の場合）

#### Cisco機器にAnsibleユーザを追加/確認

```
TestRouter(config)#username miwapinn privilege 15 secret miwapinn
TestRouter(config)#line vty 0 15
TestRouter(config-line)#transport input ssh    

TestRouter#sh run | i user
 miwapinn privilege 15 secret 5 $1$xxxxxx5z9FrlrhBLHCxxxxxxxxx
TestRouter#
```

### Ansible管理ノードの設定

**インベントリファイルの作成**: Cisco機器のIPアドレスや接続情報を記載したインベントリファイルを作成する。


   ``` ini:inventory.ini
   [cisco_devices]
   cisco_router ansible_host=192.168.0.150 ansible_user=miwapinn ansible_ssh_pass=xxxx ansible_network_os=ios ansible_connection=network_cli
   ```

**Playbookの作成**: Cisco機器の設定バックアップを取得し、特定の設定を変更するためのPlaybookを作成する。

   ``` yaml:cisco_backup_and_configure.yml
   ---
   - name: Backup and Configure Cisco IOS
     hosts: cisco_devices
     gather_facts: no
   
     tasks:
     - name: Backup Cisco Config
       ios_config:
         backup: yes
       register: backup_cisco_config
   
     - name: Print the backup file location
       debug:
         msg: "The backup file is located at {{ backup_cisco_config.backup_path }}"
   
     - name: Configure Cisco device
       ios_config:
         lines:
           - no ip http server
           - no ip http secure-server
         save_when: changed
   ```

   このPlaybookは、最初にCisco機器の現在の設定をバックアップし、次にHTTPサーバーとHTTPSサーバーを無効にする設定を適用するシナリオ。変更があった場合には設定を保存する。

### Playbookの実行

``` sh:Playbookを実行
ansible-playbook -i inventory.ini cisco_backup_and_configure.yml
```

このコマンドは、`inventory.ini`に記載されたCisco機器に対して`cisco_backup_and_configure.yml` Playbookを実行する。

### Ansibleノードディレクトリ構成の例

ガイドラインによると、一般的に以下のような構成で作成することで拡張性を保つ

``` txt:ディレクトリ構成例
ansible-project/
├── inventory/
│   ├── production.ini
│   └── staging.ini
├── group_vars/
│   ├── group1.yml
│   └── group2.yml
├── host_vars/
│   ├── hostname1.yml
│   └── hostname2.yml
├── roles/
│   ├── common/
│   │   ├── tasks/
│   │   ├── handlers/
│   │   ├── templates/
│   │   ├── files/
│   │   ├── vars/
│   │   └── defaults/
│   ├── role1/
│   └── role2/
├── playbooks/
│   ├── setup.yml
│   └── deploy.yml
└── ansible.cfg
```

- **inventory/**: 環境ごとのインベントリファイル、例えば`production.ini`や`staging.ini`など、異なる環境でのデプロイを区別するために使用

- **group_vars/**: グループごとの変数を定義するファイル

- **host_vars/**: ホストごとの変数を定義するファイル

- **roles/**: 再利用可能な単位である役割。各ロールは特定のタスクを実行

  - **tasks/**: ロールによって実行されるタスク
  - **handlers/**: タスクの実行によってトリガーされるハンドラー（例: サービスの再起動など）
  - **templates/**: Jinja2テンプレートファイルを保持、設定ファイルなどを動的に生成する。
  - **files/**: タスクで使用される静的ファイル
  - **vars/**: ロール内で使用される変数を定義
  - **defaults/**: ロールのデフォルト変数を定義

- **playbooks/**: 実行ファイル

- **ansible.cfg**: Ansibleの設定ファイルで、デフォルトの設定を上書きし、固有の設定を定義する
【備忘録】Git Config値を削除する方法

# はじめに
Git Config値を削除する方法を下記に記載します。
コード①にたどり着く前に消えないかなと思いコード②を試しましたが、0桁が設定されてしまい、設定値を削除することはできませんでした。

コード①：表題のコードです。
コード②：リネームコードです。


## コード
```ruby:コード①
git config --global --unset user.name
git config --global --unset user.email
```

```ruby:コード②
git config --global user.name ""
git config --global user.email ""
```
AVR:乗算器をかんがえる(計算コスト


目的
AVRの乗算器の性能を調べてみる

符号のありなしやビット長が増えると処理量が増えます

AVRの乗算器は、8x8です。

Arduinoで一般的な符号あり16x16の16は、9です。



図

https://avr.jp/user/AN/PDF/AVR201.pdf


![o_coq261.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7c1f0e77-ec80-f79e-1ba4-ace3efc309f4.jpeg)


![o_coq262.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ccdd335b-b1f5-0b1b-3b58-2dd18651187b.jpeg)
3年目エンジニアが相手の工数を奪わないために気をつけていること7つ

## はじめに

どうすれば相手の工数を使わず業務を進められるのかを
本やネットで調べ、実践してきました。

まだまだ足りないところもありますが、
現時点で気をつけていることを共有します。

## 相手の工数を奪わないために気をつけていること7つ

1. 結論から書く
2. 早めに質問・確認
3. 聞きたい要点はいくつあるのか？を記載
4. 質問が複数ある時は、番号をつける
5. あらかじめ自分の考えを用意した上で提案
6. できる限り、Yes or No で回答できるように。
7. 改行/記号を用いて見やすく

## 1.結論から書く

```
お疲れ様です。
○○の件について、報告がございます。

結論として、〇〇でした。

詳細は以下に記載しておりますので、ご確認をお願いいたします。

```

・質問で、相手が回答する必要があるか
・報告で、確認だけすればいいのか
を明確にするよう心がけています。

また、報告の場合には結論を先に書くことで、
相手にとって重要な情報をすぐに把握できるようにしています。

## 2.早めに質問・確認

認識のずれがあると、後々工数がかかってしまうことがあります。
2年の実務経験を経てようやく
聞かないとわからないことが山ほどあることに気づきました。

忙しいかな、など考えず、
お互いのために早めに質問・確認をするようにしています。

## 3.報告や質問の要点はいくつあるのか？を記載

```
お疲れ様です。
○○の件について、3点質問があります。

```

質問が複数ある場合、上記のように要点がいくつあるかを明記しています。
こうすることで、パッとメッセージを見た時に
返信にどれくらいの工数がかかるかがわかるかなぁと思っています。

## 4.質問が複数ある時は、番号をつける

```
お疲れ様です。
○○の件について、3点質問があります。

1. 〇〇について

2. △△について

3. □□について

```

質問が複数ある場合、上記のように番号をつけています。
こうすることで、相手が回答する際に番号で回答してもらうことができ、
回答が返ってきた時も自身がどの質問に対して回答が返ってきたのかがわかりやすいです。

## 5.あらかじめ自分の考えを用意した上で提案

「とりあえず答えてねー」みたいな質問だと、
質問者はなんとなく考えがある状態ですが
質問された側は1から考えていく必要があります。

どんな提案があるのかを記載することで
相手はして欲しいことを選ぶだけとなりかなり楽になります。

## 6.できる限り、Yes or No で回答できるように。

「5.あらかじめ自分の考えを用意した上で提案」とも被る部分がありますが、
できる限りYes or Noで回答できるようにしています。

その上で、「問題があればお知らせください」
のように、相手の意見も聞き入れたい旨も記載するようにしています。

## 7.改行/記号を用いて見やすく

```
お疲れ様です。
○○の件について、3点質問があります。

1. 〇〇について
質問内容

▼メリット

▼デメリット

```

- まとまりごとで改行を入れる
- 「▼」などの記号を用いて見出しをつける
こうすることで、相手から見やすいのはもちろんのこと、
自身で後から何を報告/質問したのかを振り返りやすくなります。

## まとめ

相手の工数を奪わないために気をつけていることを7つ共有しました。
参考になれば幸いです。

そして、私自身もまだまだ工夫を重ね、
周りの方々とスムーズに業務を進められるようにしていきたいと思います！
AVR:アクセスモード:インデックスアクセスリードをかんがえる(読み出しコスト


目的
インデックスリードの仕組みを知る


AVRは、8ビット機の為にintの配列のアクセスの為には、
最低2回のインデックスレジスターによる
インデックスアクセスリードが必要です。

インデクスアクセスの命令当たりのサイクル数は、2

図

http://edu.net.c.dendai.ac.jp/micom/2019/4/

![o_coq260.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/69a663b2-6542-d6a7-37c7-c2854058198b.jpeg)

x マイコン毎に微妙に違うのでマニュアル参照の事　これは、これで合っている。
(一般的に小ピン系や多ピン系が注意、特に網羅は、しない)

https://www.cs.shinshu-u.ac.jp/~haeiwa/m-com/instruction.html

![o_coq263.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a84e4d10-ede9-53fe-c909-777debf3efe0.jpeg)
Javaで「Javaでの正規表現の利用方法」の動作を確認してみた

# 概要

Javaで「Javaでの正規表現の利用方法」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java
import java.util.regex.*;

class JSample1_1{
    public static void main(String args[]){
	Pattern p = Pattern.compile("g..d");
	Matcher m = p.matcher("good");

	System.out.println(m.matches());  // true
    }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
true
```

# まとめ

何かの役に立てばと。
2024/7/30主にITとかセキュリティの記事

脅威インテリジェンスとは？概要と重要性をまとめてみた！
https://cybersecurity-park.com/2148/

クラウドセキュリティアライアンス セキュリティガイダンス バージョン5 (2024.07.15)(7/28)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/07/post-a02b46.html

クラウドセキュリティアライアンス AIモデルのリスクマネジメントフレームワーク (2024.07.23)(7/28)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/07/post-7d79b2.html

デジタル時代の子どもたちを守るAI、その実例と展望(7/28)
https://forbesjapan.com/articles/detail/72645

内部監査人協会 グローバル内部監査基準（日本語版）(2024.07.05)(7/28)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/07/post-109bdf.html

サイバー、日米でインフラ防護　在日米軍の機能を強化(7/28)
https://www.nikkei.com/article/DGXZQOUA281EH0Y4A720C2000000/

ロシアの軍人らが戦地での「スマホ禁令」案に憤激している理由(7/28)
https://forbesjapan.com/articles/detail/72711

総合職で採用された新卒が未経験からエンジニアになったハナシ(7/28)
https://zenn.dev/neinc_tech/articles/99e2a6f1a175bf

「最後の紙の保険証」に嘆く高齢者　マイナカードと一体化まで4カ月　「紛失したら…」「申請すら行けず」(7/28)
https://www.tokyo-np.co.jp/article/343148

マイナカードによる「独身証明」　婚活中の男女352人の受け止めは？(7/28)
https://news.yahoo.co.jp/articles/8f453c7571dd21e83130216204fa93b571e6c833

「ステーブルコイン」普及に弾みが付くか、野村とGMOがタッグ(7/29)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/09573/

［未来編］全ての決済、資産、業務がデジタル化
100th Special FinTechの未来(7/29)
https://xtech.nikkei.com/atcl/nxt/mag/nft/21/040100002/071900045/

［過去・現在編］FinTechがもたらした社会・行動変容
100th Special FinTechの未来(7/29)
https://xtech.nikkei.com/atcl/nxt/mag/nft/21/040100002/071900044/

どうする「脱VMware」
主な移行先は3種類　求められる「仮想化プラットフォーム」の観点(7/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/071700255/

改めて備えるDDoS攻撃 日本での被害が増加中(7/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800013/071700079/

「企業価値1兆円」を掲げたBIPROGY、齊藤新社長が語る成長施策(7/29)
https://xtech.nikkei.com/atcl/nxt/column/18/02893/071900003/
【JavaScript】ダークモードの判定

# はじめに

CSSでメディアクエリを用いてダークモードを判別するというのはよく知られた手法ですね。
この記事ではJavaScriptでそれをする方法を紹介します。

## この記事の対象者

- ある程度HTML, CSS, JavaScript(要するにWebフロントエンド)の基本的な知識があり、JavaScriptでダークモードを判別したい。

## 前提知識

- JavaScriptの基礎的な文法と仕様を理解している

# 実装

`window`に生えている`matchMedia`を用いることでメディアクエリを評価することができます。この場合はCSSのメディアクエリと同様`prefers-color-scheme`でテーマを判定します。

## ダークモードかどうか判定するだけ

```javascript
function isDarkMode() {
  return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
}
```
この`isDarkmode`関数は表示環境がダークモードかどうかを`true`か`false`のブール値で返します。

### 使用例

```javascript
if (isDarkMode()) {
  console.log('ダークモードです');
} else {
  console.log('ライトモードです');
}
```

## ダークモードの変更を検知する

`window.matchMedia`の変更をイベントリスナーで検知できます。

```javascript
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {});
```

### 使用例

```javascript
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
  if (event.matches) {
    console.log('ダークモードに変更されました');
  } else {
    console.log('ライトモードに変更されました');
  }
});
```

# 終わりに

最後まで読んで頂きありがとうございます。不備があれば是非コメントで指摘して下さい。
Issue Metrics Action を使って issues/pull requests/discussions の activity を集計する


## はじめに

Issue Metrics Action は GitHub の Open Source Program Office (OSPO) がメンテナンスしているツールです。

https://github.com/github/issue-metrics

Issue Metrics Action 以外にも様々なツールが提供されています。

https://github.com/github/github-ospo

Open Source Program Office (OSPO)

https://qiita.com/utisam/items/dec6419352c226eb6af9

## 設定する

今回は、Issue Metrics Action の README.md に記載されている Yml をベースに一部検索の条件を変更して設定しました。

検索の条件は GitHub Docs に記載されているオプションを指定可能です。

https://docs.github.com/en/issues/tracking-your-work-with-issues/filtering-and-searching-issues-and-pull-requests

今回は、「私がオーナーである」「Public repository である」等の条件を追加しています。  
そのままでは利用できませんが、参考までに作成した Yaml を貼っておきます。

```yaml
name: Monthly issue metrics
on:
  workflow_dispatch:

permissions:
  contents: read

jobs:
  build:
    name: issue metrics
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: read
    steps:
      - name: Get dates for last month
        shell: bash
        run: |
          # Calculate the first day of the previous month
          first_day=$(date -d "last month" +%Y-%m-01)
          # Calculate the last day of the previous month
          last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d)
          #Set an environment variable with the date range
          echo "$first_day..$last_day"
          echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV"
      - name: Run issue-metrics tool
        uses: github/issue-metrics@v3
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SEARCH_QUERY: '-reason:"not planned" owner:mziyut is:public created:${{ env.last_month }}'

      - name: Create issue
        uses: peter-evans/create-issue-from-file@v5
        with:
          title: Monthly issue metrics report
          token: ${{ secrets.GITHUB_TOKEN }}
          content-filepath: ./issue_metrics.md
```

実際に動かしてみた結果はこちらです。

https://github.com/mziyut/mziyut/issues/5

## さいごに

今回は記事を作成するために簡単かつわかりやすい条件で Metrics を生成しましたが、 対象を Issue や Pull request だけに絞ったりと活用の幅は広いのではないでしょうか。

## Ref

https://github.com/github/issue-metrics

https://github.com/github/github-ospo

https://github.com/mziyut/mziyut/commit/a6a41f3e544ca11f62b940f40720422fc76a60a8
5.0.2 Cannot find module '@rollup/rollup-linux-arm64-gnu' on multi platform build

メモ用
 "pnpm": {
    "overrides": {
      "rollup": "npm:@rollup/wasm-node"
    }
  }

  overrudesするだけです。pnpmのとこはそれぞれのドキュメント見て当てはまるやつで書く！！

  ちなみにnpmは
"overrides": {
      "rollup": "npm:@rollup/wasm-node"
  }だけ

etc,
  "devDependencies": {
    "@types/compression": "^1.7.5",
    "@types/express": "^4.17.21",
    "@types/react": "^18.3.3",
    "@types/react-dom": "^18.3.0",
    "@typescript-eslint/eslint-plugin": "^7.15.0",
    "@typescript-eslint/parser": "^7.15.0",
    "@vitejs/plugin-react": "^4.3.1",
    "eslint": "^8.57.0",
    "eslint-plugin-react-hooks": "^4.6.2",
    "eslint-plugin-react-refresh": "^0.4.7",
    "typescript": "^5.2.2",
    "vite": "^5.3.4"
  },
  "optionalDependencies": {
    "@rollup/rollup-linux-x64-gnu": "4.9.5"
  },
    "overrides": {
      "rollup": "npm:@rollup/wasm-node"
  }
C++でしりとりを作ってみよう

## まず初めに
自分はC++4か月目でQiitaも触れるのは初なので拙いところもあったりしますがミス等があったら指摘してくれると幸いです。
## コード
```
#include<iostream>

int main()
{
	//定義
	std::wstring oldword= L"しりとり" ;
	wchar_t oldendword = L'り';
	std::wstring newword;
	wchar_t newendword;

	//日本語を出したいためロケールを渡す
	std::wcout.imbue(std::locale(""));
	std::wcin.imbue(std::locale(""));
	//ループ
	while (true)
	{
		std::wcout << L"現在は「" << oldword << L"」です。入力↓" << std::endl;
		std::wcin >> newword;
		//今入力した文字の一文字目と前回の最後の文字が一緒なら
		if (newword[0]==oldendword)
		{
			//何文字かを抽出
			int len = newword.length();
			newendword = newword[len-1];
			//今入力した文字の最後の文字が「ん」なら
			if (newendword == L'ん')
			{
				std::wcout << L"最後が「ん」なのでしりとりを終了します" << std::endl;
				//ループを抜ける
				break;
			}
			//違うなら
			else
			{
				//今入力した文字を上書き
				oldword = newword;
				oldendword = newendword;
			}
		}
		//違うなら
		else
		{
			std::wcout << L"先頭が「" << oldendword << L"」ではありません。入力↓" << std::endl;
		}
	}
	return 0;
}

```

## ちょこっと解説
#### wstring
#### wchar_t
↑日本語の一文字一文字を入れてくれる。stringやcharだと英数字一文字一文字しか入ってくれないためこれを使用。

#### imbue(std::locale(""))
↑これ無いと正しく日本語が適用されない。

#### break
↑これでループを抜けている。
## 最後に
このコードはまだ改良点がたくさんある(例,同じ単語の判定 ターンの交代)と思うので皆さん色々改造しちゃってください!!
7days to die「サーバーIDが見つかりません」に苦戦した話

# はじめに
7月26日に正式版がリリースされた「7days to die」のマルチサーバーをたてるのに友人と超苦戦した
目が節穴すぎる初歩的なミスで悲しくなったので日記を書いておく

# 今回起きたこと
サーバーの公開設定は合っているはずなのに
なぜかエラーがでて接続できないと友人から相談があった

>「サーバー情報が取得できませんでした」
「サーバーIDが見つかりません」

がずっと表示される；；

いやいやFirewallとかルーターの設定とかどっか忘れてるんでしょ～！！！
<br/>
- 7Days To Die Dedicated Serverのインストール
- serverconfig.xmlの設定
- Firewallの設定
- ルーターの設定
... etc
<br/>
・・・いやできてそうだな🤔

設定できてるのになんで～！？

# 原因
！！！

**指定ポートを使っていない**じゃん😨😨😨
<br/>

```serverconfig.xml
<!--  Port you want the server to listen on. Keep it in the ranges 26900 to 26905 or 27015 to 27020 if you want PCs on the same LAN to find it as a LAN server.  -->
```

> the ranges 26900 to 26905 or 27015 to 27020

がっつり書いてあるぅ～

友人に「設定ファイル全部送ってよ！」と送ってもらって見たところで発覚
<br/>


# 解決方法
`port=26900`にしたら秒で直りました

接続したら「EAC認証中」とloading...始まって大歓喜🙌
めでたしめでたし

# まとめ
**公式ドキュメントや設定ファイルのコメントを読むのはだいじ**

私自身かなり節穴なので、ちゃんとドキュメント読むのだいじやなと改めて思いました。
（わかんないな～とか言いながら読み飛ばしがち）


# さいごに
ちなみに友人曰く正式版がリリースされる前のベータ版だったときは
指定ポート以外の別ポートでも普通にマルチサーバーが公開できて遊べていたらしい。

というのもあり、今回ポートには特に問題ないだろうという思い込みをしていた。

ベータ版から正式版に移行した人たちで、
エラーが出てる人は指定ポートになっているか確認しよう👀

<br/>

なお、私は7dtdをやったことがないので「正式版リリースされたしやってみようかな～」と思った。
夏はみんなでゾンビと戦おう！！
paiza Bランク問題「神経衰弱」を Elixir で解いてみた

## はじめに

paiza の C ランクまでは特に問題なく解けました

https://qiita.com/RyoWakabayashi/private/9fd213d417ac54728fbd

B ランクから各問題を解いてみます

## 神経衰弱

ルールに従って神経衰弱を実施し、各プレイヤーの取得カード枚数を出力します

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/concentration

```elixir
defmodule Paiza do
  def main do
    [h_w_n | others] =
      :stdio
      |> IO.read(:all)
      |> String.trim()
      |> String.split("\n")

    [h, _w, n] =
      h_w_n
      |> String.split(" ")
      |> Enum.map(&String.to_integer(&1))

    {cards, [_l | hands]} = Enum.split(others, h)

    # カードの配置をマップ化
    cards =
      cards
      |> Enum.with_index()
      |> Enum.flat_map(fn {row, row_index} ->
        row
        |> String.split(" ")
        |> Enum.with_index()
        |> Enum.map(fn {card, col_index} ->
          {
            {row_index + 1, col_index + 1},
            card
          }
        end)
      end)
      |> Enum.into(%{})

    # 各ターンで開いたカードの組み合わせ
    hands =
      hands
      |> Enum.map(fn hand ->
        [a_r, a_c, b_r, b_c] =
          hand
          |> String.split(" ")
          |> Enum.map(&String.to_integer(&1))
        
        {{a_r, a_c}, {b_r, b_c}}
      end)

    # 初期値は全プレイヤー0枚、 `:player` に現在のプレイヤー番号を保持
    initial_points =
      0..n-1
      |> Enum.map(fn index -> {index, 0} end)
      |> Enum.into(%{})
      |> Map.put(:player, 0)

    results =
      hands
      |> Enum.reduce(initial_points, fn {hand_a, hand_b}, acc ->
        current_player = acc.player
        a = Map.get(cards, hand_a)
        b = Map.get(cards, hand_b)
    
        current_point = Map.get(acc, current_player, 0)
        {point, next_player} = judge(a, b, current_player, n)
        
        acc
        |> Map.put(current_player, current_point + point)
        |> Map.put(:player, next_player)
      end)

    results
    |> Map.drop([:player])
    |> Enum.map(fn {_p, num} -> IO.puts(num) end)
  end
  
  defp judge(a, a, p, _n), do: {2, p}
  defp judge(_a, _b, p, n) when p >= n - 1, do: {0, 0}
  defp judge(_a, _b, p, _n), do: {0, p + 1}
end

Paiza.main()
```

## 解説

カードの配置を `{行, 列} => 数字` というマップにしました

各ターンで開いたカードの組み合わせも `{1枚目の{行, 列}, 2枚目の{行, 列}}` としています

これにより、各ターンで開いた1枚目と2枚目の数字をマップから取得し、一致していればカード取得というロジックが作れます

reduce で現在のプレイヤー番号と各プレイヤーの取得カード枚数を保持しつつループします

## まとめ

B ランクになると結構ややこしくなってきました

reduce で保持する値を何にするか、というのをよく考えないといけません
Github Copilotを使う ソースコードを学習させない設定と公式ドキュメントのリンク

## 記事にした動機

チームでcopilot chatの使用するにあたってソースが学習に使用されないかを確認する必要があったので公式ドキュメントでの記載を探したのですが，意外と見つからなかったので記事にしました。
お役に立てば幸いです。

## 個人用リポジトリの場合
[公式ドキュメント](https://docs.github.com/en/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/managing-copilot-policies-as-an-individual-subscriber)

> allow or prevent GitHub using your data, select or deselect Allow GitHub to use my code snippets from the code editor for product improvements.

### やりかた
https://github.com/settings/copilot
自分のCopilotの設定で`Allow GitHub to use my code snippets from the code editor for product improvements *`のチェックを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/05770554-3c1e-bacf-51ac-ad74d59dfa52.png)

## Copilot for businessを使用している場合

[公式ドキュメント](https://github.blog/news-insights/policy-news-and-insights/how-to-responsibly-adopt-github-copilot-with-the-github-copilot-trust-center/)

> What personal data is used by GitHub Copilot for Business and how? Copilot for Business collects three kinds of personal data: user engagement data, prompts, and suggestions. User engagement data is information about events that are generated when iterating with a code editor. A prompt is a compilation of IDE code and relevant context (IDE comments and code in open files) that the GitHub Copilot extension sends to the AI model to generate suggestions. A suggestion is one or more lines of proposed code and other output returned to the GitHub Copilot extension after a prompt is received and processed by the GitHub Copilot model.
Copilot for Business uses the source code in your IDE only to generate a suggestion. It also performs several scans to identify and remove certain information within a prompt. Prompts are only transmitted to the AI model to generate suggestions in real-time and are deleted once the suggestions are generated. Copilot for Business also does not use your code to train the Azure OpenAI model. GitHub Copilot for Individual users, however, can opt in and explicitly provide consent for their code to be used as training data. User engagement data is used to improve the performance of the Copilot Service; specifically, it’s used to fine-tune ranking, sort algorithms, and craft prompts.

### 個人用リポジトリとの違い

- copilotに適用するポリシーをorganaizationsメンバーにまとめて適用できる
- `デフォルトでコードが学習に使用されない`ので特に設定の必要はない。
Service Portalにゲーム追加してみた

みなさまご存じサービスポータル画面に...
ゲームを追加しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/309905c8-21ec-bc77-da10-952383fa4920.png)

ServiceNowでマリオカートができます！
すごい！！！！
すごい！！！！

### やり方
Service Portalのウィジェットのiframeを利用します。
具体的には以下の画面キャプチャをご参考ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ca39a25a-f402-a13c-10bd-dcc8ce38078b.png)

iframeはHTMLを埋め込み表示可能なので、以下のサイト[FunHTML5](https://funhtml5games.com/)に存在するゲームをService Portalに埋め込んでいるだけです。

簡単にServiceNowで遊べますね、
The world works with ServiceNow！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/e245a3da-2d3e-9073-0526-cc844d99574e.png)
【JavaSilver】API

# API			
			
* powメソッド・・・累乗		
* sqrtメソッド・・・平方根		
			
* isAlphabeticメソッド		
引数で受け取った文字がアルファベットどうか調べる	
			
* isDigitメソッド		
引数で受け取った文字が数字かどうか調べる	
			
* isLowerCaseメソッド		
引数で受け取った文字が小文字どうか調べる	
			
* LocalDate		
インスタンスは不変であるため、値を変更した場合は、	
戻り値として受け取る必要がある。	
※LocalDateの月は1から始まる。
```java
LocalDate.of(2015,5,1); // 数値を日付に変更する	
LocalDate.parse("2015-01-01"); // 文字列を日付に変更する	
with(DayOfWeek.MONDAY); // その週の指定された曜日に変更する
```

* indexOfメソッド		
引数で指定した文字が文字列の最初に出現する位置を返す。	
指定した文字列が出現しない場合は-1を返す。	
※先頭は1から始まる。	
			
* forEachメソッド		
default void forEach (Consumer < ? super T > action) 	
			
* Mathクラスのceil()メソッド		
小数部を「切り上げ」て、double型で戻り値を返す。	
double d1 = 3.87;  →4.0	
			
* Mathクラスのfloor()メソッド		
小数部を「切り捨て」て、double型で戻り値を返す。	
double d1 = 3.87;  →3.0	
 
* Mathクラスのround()メソッド		
・小数部を「四捨五入」して、long型で戻り値を返す。	
・引数がNaNの場合は、結果は0を返します。	
double d1 = 3.87;  →4	
			
* mismatchメソッド		
引数で渡された2つの配列の要素を先頭から順番に比較し、
 一致しない要素の添字を戻す。	
※先頭は0から	
			
* compareメソッド		
引数で受け取った2つの配列が等しい場合は0を戻します。	
第1引数が辞書順で先なら負の値(-1)を、	
第2引数が先なら正の値(1)を戻す。	
			
* compareToメソッド		
・Unicode値の差を計算して戻り値をとして返します。	
変数1.compareTo(変数2)	
・文字列の場合	
引数で受け取った2つの文字列が等しい場合は0を戻す。
変数1が辞書順で先なら負の値(-1)を、
変数1のほうが後なら正の値(1)を戻す。
・数値の場合	
引数で受け取った2つの数値が等しい場合は0を戻します。
変数1が大きい場合、正の値(1)を、
変数2が大きい場合、負の値(-1)を戻す。
正数：左の値が後ろにいく
負数：左の値が前にいく
			
* sortメソッド		
-1を戻すと第1引数を前にする。	
1を戻すと第2引数を前にする。	
			
* StringBuilderクラス		
文字列操作を行うためのクラス。	
デフォルトで16文字分のバッファを持っている。	

* substringメソッド		
| a | b | c | d | e | f |	
0  1  2  3  4  5  6	
・string.substring(x); はインデックスから最後までの部分を切り出す	
			
* charAtメソッド		
文字列から指定した場所の文字を取り出す	
※スペースも1字に数える
※先頭は0から
			
* StringBuilderクラスのdeleteCharAtメソッド		
引数に文字列を渡すとint型に変換されて、削除される	
(例) deleteCharAt(‘S’) →Sはint型に変換すると83となり、83文字目が削除される。	
			
* StringBuilderクラスのreplaceメソッド		
replace(int start, int end, String str) → 引数が3つ	
・置換対象はstart～end-1	
・第2引数に該当する文字番号「以降」の文字番号を指定しても実行時エラーは発生しない。
			
* Stringクラスのメソッドは、メソッド呼出し後、変数で受け取る必要がある。	
　(例)concat、replace...	
			
* concatメソッドはStringクラスに用意されており、文字列の連結。
* List.of()メソッド		
・1度決めた値を変更できない。	
・nullを許容しない。	
・要素を追加、削除できない。	

```java:例題
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    static List<String> keys = List.of("A", "B", "C");
    public static void main(String[] args) {		
        // 要素を削除できない
        keys.clear();	
    }
}
```

```:実行結果
実行時エラー
```

```java:例題
import java.util.List;

public class Main {
    public static void main(String[] args) {		
        List<String> list = List.of();
        // 要素を追加できない
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
    }
}
```

```:実行結果
実行時エラー
```



* ArraysクラスのasListメソッド		
配列に格納した要素をリストにも要素として格納したい場合や、リストとして表示したい場合	
・1度決めた値を変更できる。	
・nullを許容する。	
・要素を追加、削除できない。
 
```java
List<Stirng> city = new ArrayList<>( Arrays.asList(ary)); // →要素の追加できる
List<Stirng> city = Arrays.asList(ary); // →要素の追加できない
```
			
* list.set(0,”B”)は値を上書きする。	
* cloneメソッドは、新しい配列を作り、その配列に同じ要素への参照をコピー。