OmniAICreator/Qiita-1.07M huggingface dataset:
混合コンテンツ(mixed content)エラー？

## 混合コンテンツ(mixed content)エラー？

![error](https://github.com/yuminn-k/yuminn-k/assets/55650732/ce5304ab-c1f3-4f45-863d-b457181caeb7)

前の記事でも紹介した配布サービス、`cloudtype`で配布を進めながらcssが正常に適用されないことを確認し、ネットワークタブを確認したら、ファイルを正しくロードできないことを確認しました。Statusに`(blocked:mixed-content)`というエラーが発生していたので、これについて調べてみました。

### 君はどんなエラー？

"`(blocked:mixed-content)`" というメッセージは、WebページがHTTPSプロトコルを使用してロードされたが、その中でHTTPプロトコルを使用するリソース（CSSやJSファイルなど）をロードしようとしたときに発生するセキュリティエラーを示します。このような現象を「`混合コンテンツ(mixed content)`」と呼びます。

HTTPSプロトコルはウェブ通信を暗号化してセキュリティを強化しますが、HTTPプロトコルは暗号化されないため、セキュリティに脆弱です。 したがって、ウェブブラウザはHTTPSページでHTTPリソースをロードしようとすると、これをブロックしてユーザーのセキュリティを保護します。

この問題を解決するには、すべてのリソースをHTTPSで提供する必要があります。

### なぜ発生したのか？

![error01](https://github.com/yuminn-k/yuminn-k/assets/55650732/b6df13da-a1a1-41e3-9238-eef173d44ac1)

エラー内容を詳しく見てみると、httpsではなくhttpで呼び出していることが確認できました。

### どのように解決したか？

配布版の場合、すべてのURLにhttpsを適用させてくれるコードを追加しました。この他に配布環境にAPP_ENVを与えました。

```php
// web.php
if (env('APP_ENV') == 'production') {
    \Illuminate\Support\Facades\URL::forceScheme('https');
}
```

変更事項を適用し、デプロイしたらこのようにcssが適用され、使えるようになりました！

<img width="1225" alt="error02" src="https://github.com/yuminn-k/yuminn-k/assets/55650732/ebc600d5-ff0a-4d88-9694-e18f1798718b">

<br>

📌 `参考`
  [https://laravel.io/forum/12-26-2014-routing-with-https](https://laravel.io/forum/12-26-2014-routing-with-https)
Dockerイメージビルドの最適化：package.jsonファイルを先にコピーする理由


今日はドッカー(Docker)を使ってNode.jsアプリケーションをコンテナ化する時、効率性の問題について説明します。 特に、「`COPY package.json /app`」 コマンドを使ってpackage.jsonファイルを先にコピーする戦略について説明します。

## Dockerfileリマインダー

まず、Dockerfileについて簡単にリマインダーします。 Dockerfileはドッカーイメージを生成するためのスクリプトで、下記のコマンドが含まれています：

```docker
FROM node
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 80
CMD ["node", "server.js"]

```

ここで 「`COPY package.json /app`」 コマンドは package.json ファイルだけ先にコンテナの作業ディレクトリにコピーする役割をします。 その後 「`RUN npm install`」 コマンドで必要な全ての依存関係をインストールします。 そして残りのコードをコピーします。

## ドッカーキャッシングメカニズム

では、なぜ私たちはpackage.jsonファイルだけ先にコピーして必要なモジュールをインストールした後、残りのコードをコピーするのでしょうか？ 理由はドッカーのキャッシュメカニズムにあります。

Docker はイメージビルドの過程で各ステップをキャッシュします。以前のビルドから変更がなければ、Dockerはキャッシュされた結果を再利用します。 つまり、package.jsonファイルが変更されていなければ、「`RUN npm install`」ステップはキャッシュから取得できます。これは、毎回すべての依存関係を再インストールするよりもはるかに高速で効率的です。

一方、私たちが 「`COPY . /app`」 コマンドだけを使って全てのソースコードと package.json ファイルを一度にコピーする場合、ソースコードの一部が変更されると 「`RUN npm install`」 ステップも再実行しなければなりません。 これは不必要な時間を消費することになります。

したがって、「`COPY package.json /app`」 コマンドを使って package.json ファイルだけ先にコピーして、必要な依存関係をインストールした後、残りのコードをコピーするのが効率的です。 このようにすると、ソースコードの小さな変更でもドッカーのキャッシュを最大限に活用することができ、ビルド時間を大幅に短縮することができます。

## 概要

「`COPY package.json /app`」 コマンドを先に使うことで、ビルドプロセスを最適化し、ビルド時間を短縮することができます。これにより、開発者はより迅速かつ効率的にDockerイメージをビルドして配布することができます。
【selenium】コンテナにChrome version 115 以降に対応するChromedriverを入れる方法

# 目的
[selenium](https://www.selenium.dev/ja/)でChromeを使う場合、ChromeとChromedriverのバージョンを対応しているものにしないと不具合に繋がります。
今回はコンテナ内でChrome version 115 以降に対応したChromedriverの取得方法の備忘録になります。

# 仕様環境
Docker
Python 3.11
selenium 4.1.0
Chromeバージョン 120.0.6099.129



# Chrome version 115 以降でのChrimedriverの選択
Chrimedriverのダウンロード先は以下の公式サイトより確認できます。
version 114以前とは別のサイトになりました。
https://googlechromelabs.github.io/chrome-for-testing/

2024/01/01時点での対応状況は以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/e58a500f-fa47-b814-ab91-263f9b29b83d.png)

今回使用するChromeバージョンは「120.0.6099.129」ですが、まだ(**uncoming**)となっているため、時点で最新の「120.0.6099.109」を使います。

各プラットフォームに対応したドライバーがあるため、環境に合わせたものを選択してください。
今回はコンテナで環境を整えるため、以下の「**linux64**」を使います。
![スクリーンショット 2023-12-25 091511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/db12699b-4cce-4082-1616-0ace83a65a84.png)
```:chromedriver URL
https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.109/linux64/chromedriver-linux64.zip
```

# Dockerfile
ここまでで使用するChrimedriverが選択できました。
ということでseleniumを動かすための環境を定義したdockerfileをどんっ。

```dockerfile:dockerfile
FROM python:3.11

ARG FUNCTION_DIR="/my_function"

# ChromeとChromedriverのインストールに必要なパッケージをインストール
RUN apt-get update && apt-get install -y wget unzip

# Google Chromeの最新安定版をインストール
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb; apt-get -fy install

# Chromedriverをインストール
# 今回は「120.0.6099.109」を使用
RUN wget https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.109/linux64/chromedriver-linux64.zip
RUN unzip chromedriver-linux64.zip
RUN mv chromedriver-linux64/chromedriver /usr/bin/chromedriver
RUN chown root:root /usr/bin/chromedriver
RUN chmod +x /usr/bin/chromedriver

# requirements.txtを使用して関数の依存関係をインストールする。
COPY requirements.txt  .
RUN  pip3 install -r requirements.txt --target ${FUNCTION_DIR}

COPY src ${FUNCTION_DIR}/src
```

適宜ほしいドライバーに合わせてUドライバーのRLを書き換えてください。

```text:requirements.txt
selenium==4.1.0
```

# 【参考】Chrome version 114 以前の場合との違い
version 114以前であればChrimedriverのダウンロード先は[こちら](https://chromedriver.chromium.org/downloads)になります。

・注意点としてchromedriverファイルの配置場所がversion 115前後で変更されていました。
　こちらは適宜確認してみてください。
 
```dockerfile:dockerfile (version 114以前)
RUN mv chromedriver /usr/bin/chromedriver
```

```dockerfile:dockerfile (version 115以降)
RUN mv chromedriver-linux64/chromedriver /usr/bin/chromedriver
```

# まとめ
最初ChromeとChromedriverのバージョンが対応していないせいで予期せぬエラーで沼ってしまっていました。
Chrome version によってダウンロード先やdockerfileの書き方が異なるため、それを知っていればもっと早く解決できたかと思います。

同じように沼っている人がいたら参考にしてください。
アドカレに書ききれなかった「コンパイラを作ろう」の話を簡潔にしてみる

Howdy, みなさん、クリスマスぶりだね。
新年あけましておめでとうございます。

# ごあいさつ

本来は[2023年のアドベントカレンダー](https://qiita.com/advent-calendar/2023/create-any-nattyantv)で書くつもりだった記事の中に`「簡単な自作言語(自作コンパイラ)作ってみない？」`というものがありました。
書こうとは思ってたんですが、それよりほかの記事が長くなったり、新規で書きたい記事が出来ちゃったりしたので、結局書けなかったんですよね。
なのでそこら辺について初アウトプットと称して短めに書いてみようと思います。

# コンパイラを作ろう
みなさんそもそも、コンパイル・コンパイラという言葉。正しく意味を理解していますか？

まぁかくいう私も、高級言語大好きで、機械語とかには疎いです。

## 意味

コンパイルというのは、「ある言語からある言語に変換する」行為を指します。
これは大体、高級言語から機械語に変換することを指しますが、高級言語から高級言語に変換することもコンパイルと呼びます。
例えばTypeScriptからJavaScriptに変換することもコンパイルと呼びます。大体トランスパイルと呼ばれることが多いですが、コンパイルと呼ぶこともあります。

つまり...？

自作言語をそこら辺の言語に変換することもコンパイルと呼ぶ...つまり、「コンパイラ」と呼ばれる物自体はとても簡単に作れる...？

という、雑に言えば言葉遊び見たいなものがすべての始まりです。

## 作り方

初期は`TypeScript`でコンパイラを作ることを想定していましたが、結局Pythonで作ってた方が楽しくなっちゃったので最終的にはPythonで作りました。

まずは、ファイルを読み込みます。

```py
def open_file(filepath: str) -> str:
    with open(filepath, 'r') as f:
        return f.read()
```

そしたら行分割して行ごとに処理する構造を作りましょう。

```py
def compile(content: str):
    lines = content.split('\n')
    for line in lines:
        ...
```

例えば、prefixが`p`の場合は`print`するとかやってみますか。

```py
def compile(content: str):
    lines = content.split('\n')
    for line in lines:
        if line.startswith('p '):
            print(line[2:])
```

これで`p Hello, World!`とか書いたら`Hello, World!`と出力されるわけです。
（これじゃコンパイラというよりはエグゼキューターみたいな感じですねぇ...）

でもまぁ、これをうまいこと無限にやっていけばコンパイラになるわけです。

...っていう話をもうちょっと拡張していい感じにやりたかったんですよ！！！

# まとめ
今は1:30。眠いので新年アウトプットはここまでにします。
1月19日にQiita Advent Calendar 2023 Online Meetupが開催されますが、今年もちゃんとリアタイしていきたいと思ってます。

ﾃﾞﾊ-
冬休み読書感想文

明けましておめでとうございます！
今年の冬はエンジニアらしい冬休みにしよう！
と思い色々考えた結果自分に足りていない知識をつける期間にするために、技術書？の読破をしていこうと思ったので
その内容の備忘録として書いていこうと思います。

## オブジェクト指向でなぜつくるのか
今回の読書感想文の対象書籍です。
この書籍を選んだ理由は2つ。
- システム開発の根本であるオブジェクト指向について、なんとなくの理解しかできていないと自分自身でも感じているため。
- 自社のスーパーエンジニアからクリスマスプレゼントとして頂いたから。

ですｗ
では本題。というか読んでみて印象に残った内容まとめ。

## オブジェクト指向とは
- プログラミングでのオブジェクト指向
    - クラス、ポリモーフィズム、継承という要素を用いてシステムの中身を整理整頓する考え方。
        - クラスとは
            - ある特定の関連することの処理や変数をまとめておける仕組み。
        - ポリモーフィズムとは
            - 多態性
            - 関数を利用する側が使い分けしやすくすること。
        - 継承とは
            - extendsのこと
            - 親クラスがもつメソッドやプロパティを子クラスに引き継ぐこと。
- 要検定義、設計等の上流工程でのオブジェクト指向
    - 今現在、人が行なっている仕事をプログラムに置き換えるために用いる

そもそもオブジェクト指向自体が、様々な場面で用いられる考え方となっている。
今回はプログラミングでのオブジェクト指向に焦点を当てて、記載。
上記の
- クラス
- ポリモーフィズム
- 継承

が、プログラミングでのオブジェクト指向の中心であり大きなメリット。(だと思う)
まとまりをまとまりとして見やすくなり、コードの重複を防ぐことができる。
機能ごと(画面ごと)で大きくまとまりができるため、自分以外の人がソースを読む機会があった場合も、可読性の向上に繋がりそう。
次点として、プログラミングでのオブジェクト指向ではないですが、
クラス図やシーケンス図、『上流工程でのオブジェクト指向とは』という内容まで記載があったので、上流工程に携わった場合にこの書籍の内容を押さえておくと、クライアントとの会話や仕様書の作成に活きてきそう。

以上が今回の読書のまとめでした。
おそらくこの書籍は今後何度も読み返してその度に自分の理解力が上がっていれば、捉え方も変わってきそうなのでその都度更新していこうかと思っています。

ここまで目を通していただいた方がいれば、あなたの今年はすごく良い1年になること間違いなしですｗ
ありがとうございました！
ABC049 ARC065 の問題を解いてみました


## A問題
https://atcoder.jp/contests/abc049/tasks/abc049_a

if文で <code>a, i, u, e, o</code> かどうかを判定します。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  char ch;
  cin >> ch;
  
  if(ch == 'a' || ch == 'i' || ch == 'u' || ch == 'e' || ch == 'o'){
    //判定する
    cout << "vowel" << endl;
  }
  else{
    cout << "consonant" << endl;
  }
  
}
~~~

## B問題
https://atcoder.jp/contests/abc049/tasks/abc049_b

1行読み込んだら、その行を2回出力する という処理を行います。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int h, w;
  cin >> h >> w;
  char picture[h][w];
  
  for(int i = 0; i < h; i++){
    for(int j = 0; j < w; j++){
      cin >> picture[i][j];
      cout << picture[i][j]; // 一回目の出力
    }
    cout << endl; //改行
    for(int j = 0; j < w; j++){
      cout << picture[i][j]; // 二回目の出力
    }
    cout << endl; //改行
  }
}
~~~

## C問題
https://atcoder.jp/contests/abc049/tasks/arc065_a

そのまま作れるかを調べると、 <code>dreamerase</code> などの文字列には対応しづらいです。
文字列を反転させて 文字列$S$ を作れるかを調べましょう。

下の記事が詳しく解説してくれているので、見てみてください。

https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-9-%E5%95%8F--abc-049-c---daydream-300-%E7%82%B9

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

//maerd remaerd esare resare
int main(void){
  string s;
  cin >> s;
  reverse(s.begin(), s.end());
  string li[4] = {"maerd", "remaerd", "esare", "resare"};
  //反転させた文字列を用意する
  
  bool ok = true;
  for(int i = 0; i < s.size();){
    bool can = false;
    for(int j = 0; j < 4; j++){
      string a = li[j];
      if(s.substr(i, a.size()) == a){ //対応する文字列があるか
        can = true;
        i += a.size();
        break;
      }
    }
    if(!can){
      ok = false;
      break;
    }
  }
  
  if(ok) cout << "YES" << endl;
  else cout << "NO" << endl;
}
~~~


## D問題
https://atcoder.jp/contests/abc049/tasks/arc065_b

まず、都市$i$と都市$j$がつながっているかをすべて調べていると、$O(N^2)$でTLEしてしまいます。
なので、より高速な方法を考えます。

この問題は、2つの無向グラフどちらでも連結している都市の数を数えるというグラフ問題です。
このような無向グラフの問題では、UnionFindが使えます。
UnionFindでは、親の番号が同じならば、その2点は連結しているといえます。
つまり、2つのUnionFindどちらでも親の番号が一緒な都市を、pairを使ったmapなどで数えればよいです。

~~~C++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#include <atcoder/all>
using namespace atcoder;
//Created by karaju.


signed main(){
  int n, k, l;
  cin >> n >> k >> l;
  
  dsu road(n), rail(n); //用意
  
  for(int i = 0; i < k; i++){
    int p, q;
    cin >> p >> q;
    p--; q--;
    road.merge(p, q);
    //都市を道路でくっつける
  }
  for(int i = 0; i < l; i++){
    int r, s;
    cin >> r >> s;
    r--; s--;
    rail.merge(r, s);
    //都市を鉄道でくっつける
  }
  
  map<pair<int,int>,int> cnt;
  for(int i = 0; i < n; i++){
    cnt[{road.leader(i), rail.leader(i)}]++;
    //road.leader(i)で、道路でくっついていない都市をふるい落として
    //rail.leader(i)で、鉄道でくっついていない都市をふるい落として
    //最終的にどちらでも連結な都市の数を数えるイメージ
  }
  
  for(int i = 0; i < n; i++){
    cout << cnt[{road.leader(i), rail.leader(i)}] << " ";
  }
  
  cout << endl;
  
}
~~~
matplotlibで色の名前を追加する方法

# 概要
下記3行を実行することで, 任意の色をmatplotlibで指定できるようになります.  
(一例として`"#FF00FF"`という色を`"hogehoge"`という名前で追加しました.)
```python
from matplotlib import colors
colors._colors_full_map = {**dict(colors._colors_full_map), **{"hogehoge":"#FF00FF"}}
colors._colors_full_map = colors._ColorMapping(colors._colors_full_map)
```

```python
from matplotlib import pyplot as plt
plt.plot([0,1], c='hogehoge')
plt.show()
```

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193730/d8c129af-1b96-21b6-1c70-96511d7a130f.png)
Google Closure Compiler でエラーが出たときの対処法：This language feature is only supported for UNSTABLE mode 

2024年1月1日からエラーにハマりました。

このエラーにハマるケースは多くないと思いますが、気が付いてしまったのでメモしておきます。そもそも、JavaScriptでクラス宣言する人なんて、いないと思いますけどね。

# エラーになったソースコード
ブックマークレットにする前提のコードです。クラスを宣言し、クラスをnewしただけ。
Chrome Devtoolのコンソールに突っ込んだら動きますが、Closure Compilerではエラーになります。

```javascript
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level SIMPLE_OPTIMIZATIONS
// @language_out ECMASCRIPT_2019
// ==/ClosureCompiler==

javascript:(()=>{
  class A{
    b; //public field 宣言
    constructor(a) {
      this.a = a;  
    }
  }
  const a = new A(1);
  console.log(a.a);  // 1
  console.log(a.b);  // undefined
})()

```

# エラーメッセージ
Closure Compilerで出てきたエラーメッセージはこれです。

    JSC_LANGUAGE_FEATURE: This language feature is only supported for UNSTABLE mode or better: Public class fields. at line 3 character 4
      b;
      ^`

Google で検索したけどドンピシャな回答は出てきませんでした。エラーメッセージを読む限り、パブリックなクラスフィールドに問題があるようだけど、どう直したらいいのかは分からないですね

# エラーにならないコード

クラスのpublicなフィールドを表に出すなってことですね。Javaっぽくクラスのフィールドを書いてはいけないらしい。
コンストラクタの中で`this`付けて強引に代入してしまえばよい。コンストラクタから引数を受け取る必要もないらしい。


```javascript
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level SIMPLE_OPTIMIZATIONS
// @language_out ECMASCRIPT_2019
// ==/ClosureCompiler==


javascript:(()=>{
  class A{
    constructor(a) {
      this.a = a;
      
      //public フィールドはコンストラクタでthis.bと宣言する
      this.b = "bb";
    }
  }
  const a = new A(1);
  console.log(a.a); // a
  console.log(a.b); // bb
})()

```

JavaScript的に正しくてもClosureCompilerではだめでしたというお話でした。
nmcli con up ens224 で Error: Connection activation failed

RHEL9で `nmtui` で IPアドレスを変更後に、`nmcli con down ens224; nmcli con up ens224` あたりを実行していたらネットワークがおかしくなった。
その時の解決方法をメモ。

```shell
# nmcli con up ens224
Error: Connection activation failed: No suitable device found for this connection (device nic0 not available because device is strictly unmanaged).
```

解決方法

`nmcli` でネットワークを有効にします。
```shell
nmcli networking on
```

Root Cause

`nmcli network off` コマンドでネットワーク状態が無効にされていました。
`/var/lib/NetworkManager.state` ファイルの `NetworkingEnabled` パラメーターが `False` に設定されています。
```shell
# cat /var/lib/NetworkManager/NetworkManager.state
[main]
NetworkingEnabled=false   <<<<<
WirelessEnabled=true
WWANEnabled=true
```

Diagnostic Steps

NetworkingEnabled パラメーターが false に設定されている場合、次のログが /var/log/messages に報告されます。
```shell
Mar 23 10:14:07 hostname NetworkManager[594503]: <info>  [1616487247.0431] manager: Networking is disabled by state file
Mar 23 10:14:36 hostname NetworkManager[594614]: <info>  [1616487276.6813] manager: Networking is disabled by state file
```

以下からの抜粋（要ログイン）。

https://access.redhat.com/ja/solutions/7005064
半年間で基本情報技術者試験と応用情報技術者試験に合格した

# はじめに
2023年秋期試験(10月)で応用情報技術者試験に合格しました。
基本情報技術者試験を2023年7月に合格したので、勉強期間含め半年で基本・応用の両方に合格できました。
受験・合格体験記として記録を残します。

# スペック
- 通信業界の社会人2年目
- プリセールスだが、業務は提案や契約周り中心で技術的な部分はあまりやっていない
- 国立大学　修士卒
- 学部は情報系、修士は工学系出身（データサイエンス系の研究）

# 試験勉強
## 時間
初めて手をつけたときから考えると、トータル半年程。
正直なところ直前期以外はさぼりまくっていたので、ちゃんと取り組んだのは基本情報が2週間、応用情報が1か月程度。

7月 基本情報技術者試験⇒10月 応用情報技術者試験という風に段階を踏んだことで、内容もつながっていてやりやすかったです。

## 使用教材
1. 過去問道場（FE、APともに**圧倒的にこれ**）
2. 基本情報技術者試験　B試験　サンプル問題
3. 応用情報技術者試験　午後問題重点対策

## 勉強方法
どちらの試験も午前対策は過去問道場に尽きます。
### 午前対策
より短期間で、効率的に覚えるために以下のやり方で取り組みました。
- 過去3回分の試験を分野別に分けて少しずつ取り組む
    - 過去問道場で分野別で1,2個⇒回指定で最新から3回分を選択
    - 出題分野すべてに対して解き終わったら、過去問道場の「復習」から自分が間違えた問題だけを徹底的に解く
- 最新から3回分が完了したら、さらにそこから3回分に対して同じことをする
- 結果として計6回分の午前問題に触れる
    （自分は後半3回の復習はあまりできないまま本番を迎えたのが反省点です...）
:::note info
- 3回分ずつ解くことで、全く同じ問題が出題されていることが見えてくるので自動的に重要な問題を優先して覚えられる
- 同じ問題が出題される場合、間違えてもすぐに復習できるので重要なところを暗記しやすい
:::




### 午後対策
#### 基本情報技術者試験　B試験　サンプル問題
IPAのHPにあるこれです。試験前日に1周解く⇒解き直しをしました。
https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000oett-att/fe_kamoku_b_sample.pdf
APの午後重点対策本＋IPAのサンプル問題でFEの午後対策という感じでした。

プログラミング経験のおかげでアルゴリズム系の問題に苦手意識がなかったことが良かったのかなと思っています。


#### 応用情報技術者試験　午後問題重点対策
有名な緑色の午後対策本で下記6つを解いていました。
1. セキュリティ
1. 組み込み
1. ネットワーク
1. データベース
1. サービスマネジメント
1. システム監査

ネット情報で解きやすいといわれていたもの＋自分の仕事上勉強しないといけないネットワークとデータベースを含めた結果このようになりました。

試験当日までにセキュリティは3周、テクノロジ系の3つは2~3周、マネジメント系は1周できました。



# 結果
無事合格できてほっとしています。
### 2023年7月 基本情報技術者試験
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071812/6b01ad3e-23c1-bab5-3929-a9eedbf8232e.png">

午前（科目A）はテクノロジ系への苦手意識を残したまま試験当日となりましたが、他分野が補ってくれたおかげで基準点を超えることができました。
午後（科目B）は予想していたよりも手がつけやすかった印象です。

### 2023年10月 応用情報技術者試験
<img width="500"src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071812/e4d32d79-414a-8405-c7ac-a69fd18f96c9.png">

午前はテクノロジ系でこれまで聞いたことないような問題が多く出題されていたように感じ、解きながら焦っていました。得点率はマネジメント系とストラテジ系で8割、テクノロジ系で6割でした。やはりテクノロジ系はギリギリでしたね。


午後の選択はこんな感じです。
1. セキュリティ
2. ネットワーク
2. データベース
2. サービスマネジメント
2. システム監査

今回はデータベースがかなり易しく、全体の得点を押し上げてくれて助かりました。

# 感想
IPA試験の土台となる試験に合格できて嬉しいです。
自分では気づいていませんでしたが、仕事しているうちにマネジメント系の知識がついていたんだということにも気づかされました。大手企業の若手社員は、APの午後試験でマネジメント系の問題を選択することをおすすめします。

今よりも技術に触れられる業務をしたいと思っているので、今後は更にテクノロジ系の知識取得・実践経験を積めるように頑張っていきたいと思います。
博論の乗りで、制御工学を論文にするには。制御（８）

博論の乗りで、Youtube記事を論文にするには
https://qiita.com/kaizen_nagoya/items/05e4d2b121b6b80a5c6b

博論の乗りで、ラプラス変換を論文にするには
https://qiita.com/kaizen_nagoya/items/f02d48a611685390417b

技術系のYoutuberの学術的な価値の確認のため、
博論の乗りで、Youtube記事を論文にすることを検討している。

全世界の不登校の子供たち「博士論文」を書こう。世界子供博士論文遠隔実践中心
https://qiita.com/kaizen_nagoya/items/912d69032c012bcc84f2

という企画を考えている。

戦争地域、飢餓地域、疫病地域などには、計算機と通信環境を整備するための仕組みが考えられない。

それで、手をこまねいていてはいけないと思い、何か名案はないかと考えている。

Youtubeの題材が論文になっていけば、そのまま、上記行事の教材になるのではないかという発想である。

慶應大学講義　制御工学同演習第一回　力学系をフィードバック制御する
https://www.youtube.com/watch?v=I-xpqAeIIeI&list=PLBe_TIITFkIqHcwOToMYSMlOB2Pae_j9W

慶應大学講義　制御工学同演習第二回　制御系設計とは，複素数とラプラス変換
https://www.youtube.com/watch?v=RfTM4p54Ny0

慶應大学講義　制御工学同演習第三回　制御で用いるラプラス変換の重要な性質,LTIシステムの表現１(convolution と伝達関数)
https://www.youtube.com/watch?v=-sop7S0Dla8

# 参考資料
博論の乗りで、Youtube記事を論文にするには
https://qiita.com/kaizen_nagoya/items/05e4d2b121b6b80a5c6b

論の乗りで、ラプラス変換を論文にするには
https://qiita.com/kaizen_nagoya/items/f02d48a611685390417b

博論の乗りで、マクスウェル方程式を論文にするには
https://qiita.com/kaizen_nagoya/items/f1db6e9305dd2bf80287

博論の乗りで、電磁気学を論文にするには
https://qiita.com/kaizen_nagoya/items/fadfbd8febbfe861de14

博論の乗りで、複素関数を論文にするには
https://qiita.com/kaizen_nagoya/items/08123bc502e57b49f756

博論の乗りで、数理物理を論文にするには
https://qiita.com/kaizen_nagoya/items/8851cda52cc632780ef8

博論の乗りで、制御工学を論文にするには
https://qiita.com/kaizen_nagoya/items/feb4a70692e66d82076d

博論の乗りで、「にほんのうた」を論文にするには
https://qiita.com/kaizen_nagoya/items/4b40d8b8873aa7649a85

博論の乗りで、「電子ピアノ」を論文にするには
https://qiita.com/kaizen_nagoya/items/58113ac4b8e28ccbd16c
## 補足資料（Additions）

Youtube mentors and friends
https://qiita.com/kaizen_nagoya/items/7910adb6e445dba7871d

さいごまでおよみいただきありがとうございました。
https://qiita.com/kaizen_nagoya/items/3387ded65f55a8303817

IT業界に博士は必要か。仮説（6）
https://qiita.com/kaizen_nagoya/items/585bb9996413cb7f2747

「@nekonibox 博士ならではの就職活動のやり方」に付け加えたい一つのこと
https://qiita.com/kaizen_nagoya/items/f07f8ebdc917694dfe9e

卒業論文、修士論文、博士論文は　github/gitlab/bitbacketのprivate利用をお勧め
https://qiita.com/kaizen_nagoya/items/eb9945a2649f6f3eabd0

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 　20240101
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
certutilでpkcs#12（クライアント証明書＋秘密鍵）をTPMにインポートできない件

# はじめに
Windows11(23H2)の話です。pkcs#12形式のクライアント証明書＋秘密鍵をTPMにインポートしてみようと思ったのですが，どうもうまくいきません。未来の自分のための作業記録です。

# 試した手順
- オレオレ認証局を立てて，クライアント用の秘密鍵ファイルと証明書を作る
手順は以下を参考にしました。ubuntu2004用の手順ですが，2204でも同じ手順です。

https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a-certificate-authority-ca-on-ubuntu-20-04-ja

- PKCS#12ファイルを作る
秘密鍵ファイルとcrtファイルから，pkcs#12ファイルを作成します。手順は以下を参考にしました。出力ファイルはclient.p12にしました（拡張子がpfxではないですが気にしないでください）

https://knowledge.digicert.com/ja/jp/solution/SO23603


- Windows11にコピーする
client.p12をscpコマンドなどで物理Windows11(TPM2.0入り）にコピーします。
（ちなみに，proxmox上に仮想TPM付きでインストールしたWindows11も結果は同じでした）

- pkcs#12をインポートする
ユーザ権限でWindowsTerminalを起動し，以下のコマンドでインポートします。
```
PS C:\Users\***> certutil -user -csp TPM -p Password! -importPFX .\client.p12  NoExport
証明書 "client" がストアに追加されました。

CertUtil: -importPFX コマンドは正常に完了しました。
 ```
 "-csp TPM"がTPM指定のオプション（のはず・・・）です。

# 結果
レジストリに保管されてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/82af1805-6cfd-0e56-46f2-bd3bc43c1601.png)

管理者権限で certutil -TPMInfo を実行してみましたが，それらしき証明書はTPMの中には見当たりません。

# 他にも困っている人がいた？
https://github.com/glueckkanja-pki/TPMImport

ここのREADMEを見ると，やはりインポートができないようです。私と違って明確なエラーで失敗していました。ただこの方のすごいところは，TPMにインポートするためのコードを書いていらっしゃることです。すごい。

# 参考コマンド

CSP一覧を表示する。certutil -csplist

# 注意事項
 certutilコマンドは実運用で非推奨だそうです。公式に注意事項として記載がありました。
 
 https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/certutil
【自研究室向け】LaTeXにおける索引の作成方法

# はじめに
卒論・修論、学会論文など論文執筆にやはりLaTexは欠かせません(再々)。
以前、LaTeXにおける参考文献の作成方法を紹介しました。
本稿では、前回の続きとして索引の作成の仕方を備忘録として残します。
~~本稿でもやっぱりやっぱりOverleafは一旦スルーします~~

# LaTeXについて
LaTeXとは、簡単にいうと文書作成ツールです。
インストールの仕方や、VSCodeでの環境構築方法については以下の記事で紹介しているので参考にしてください。

https://qiita.com/fuku_uma/items/e5ad46125a9612320273

また、前回の参考文献の作成方法についての記事も以下に置いておきます。
本稿はこれの続きです。

https://qiita.com/fuku_uma/items/185c8694486db945f4f7

# 索引の作成方法
索引の作成には、```\index```を使用します。
LaTeXソースコード内での操作を順を追って説明します。

## LaTeXソースコード内での操作
まず最初に使用するパッケージを追加します。

```LaTeX
\usepackage{makeidx}
```

次に索引を作成することを明示するために以下を追加します。

```LaTeX
\makeindex
```

それでは、本文中の索引をつけたい部分に```\index```をつけていきます。
例えば、```nicter```という索引をつけたい場合は以下のようにします。

```LaTeX
\index{nicter}
```

また、もし読み方や先頭の文字列を指定したい場合は```@```を使用します。
例えば、```OpenFlow```の読み方を指定する場合は以下のようにします。

```LaTeX
\index{おーぷんふろー@OpenFlow}
```

最後に、索引を出力することを明示するために以下を追加します。
```LaTeX
\printindex
```

これでLaTeXソースコード内での操作は終了です。
最後に、サンプルのソースコード全体を以下に示しておきます。

```LaTeX:sample.tex
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{url}
\usepackage{makeidx}
\makeindex
\title{サンプルレポート}
\author{あなたの名前}
\date{\today}
\begin{document}
\maketitle
\section{はじめに}
これはLaTeXのサンプル文書です。文章を自由に追加・編集してください．
記事\index{nicter}を参照する例です。\cite{nicter}．
論文\index{おーぷんふろー@OpenFlow}を参照する例です。\cite{light}\cite{openflow}． % ここで文献を参照しています
\section{内容}
\LaTeX は文章やレポートの作成に便利です。数式も簡単に挿入できます．
\subsection{数式の例}
以下は二次方程式の解の公式です．
\[ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]
% \reference
\bibliography{bunken}
\bibliographystyle{cs2srt}

\clearpage
\printindex

\end{document}
```

## 実行してみよう
実際に索引を作成してみましょう。
まず、索引のフォーマットを指定します。
以下に今回使用するサンプルのistファイル```dot.ist```を示します。
このサンプルも含めて他の様式多くの様式は以下のサイトに記載されているので参考にしてください。


http://xyoshiki.web.fc2.com/tex/makeidx.html


```LaTeX:dot.ist
preamble
"\n\\begin{theindex}\n"
postamble
"\n\n \\end{theindex}\n"
item_x0   "\n\\item "
item_x1   "\n \\subitem "
item_x2   "\n  \\subsubitem "
delim_0   "\\dotfill "
delim_1   "\\dotfill "
delim_2   "\\dotfill "
%
% mendex
lethead_prefix
"\\hbox to \\linewidth{\\hfill\\sffamily\\bfseries\\gtfamily\\small "
lethead_suffix
"\\hfill}\\par\n\\nopagebreak\n"
lethead_flag       1
symbol             "‹L†^”Žš"
letter_head        2
% makeindex
heading_prefix
"{\\vbox{\\hbox to \\linewidth{\\sffamily\\bfseries\\gtfamily\\small "
heading_suffix
"\\ \\hskip\\fill}\\vskip1pt\\hrule}}\\nopagebreak\n"
headings_flag      1
```

次に作成した```dot.ist```を```sample.tex```と同じディレクトリに配置してください。
以前の記事で作成したレシピを利用していただいている方は、```mendix```のコメントアウトを外してVSCodeを再起動してください。
レシピ内に```mendix```を定義していない方は

```shell
mendex -r -c -g -s dot.ist -p any sample.idx
```
を実行する必要がありますが、idxファイルが必要なので自動で削除しないように注意してください。


それでは、実行してみましょう。
実際にビルドしてみると以下のような索引が作成されていることがわかります。
読み方を指定した```OpenFlow```はアルファベットではなく、指定した先頭文字で索引に追加されていることがわかります。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662341/872b3562-51df-e880-6864-8bcb66ac9192.png)


# おわりに
とりあえず索引についてはある程度これでできたかなと思います。
索引も自動で作ってくれるなんてやっぱりLaTeXは便利ですね。
論文やレポートを書く際はぜひ使ってみましょう。
~~(やっぱりやっぱりOverleafには最後まで言及しません)~~
典型90 【001 – Yokan Party（★4）】・格闘中①

AtCoderの練習問題に「[典型90](https://atcoder.jp/contests/typical90)」というものがあるのでトライしています。
個人的な試行錯誤の記録として投稿することにしました。
今回は第1問のYokan Partyという問題です。

# 問題「Yokan Party」
羊羹をk+1分割し、その中で最小の羊羹の大きさを最大化する、という問題です。


# 全探索で解いてみる

まずは、全パターンを洗い出して計算するアルゴリズムでコーディング。
n個中k個を選ぶ組み合わせを全パターン洗い出して最小値を配列に格納していき、最後にその中の最大値を求める、という処理です。
```
# 変数を取得
nl = list(map(int, input().split()))
n = nl[0]
l = nl[1]
k = int(input())
A = list(map(int, input().split()))

# N個中L個を選択
import itertools
length = list(range(n))

pair = []
pairs = []

if k != 1:
  pairs = list(itertools.combinations(length, k))
else:
  pair = length

# スコアを計算
score = []
score_arr = []
score_num = 0

# pairの場合
if k == 1:
  for i in range(len(pair)):
    num = pair[i]
    len_1 = A[i]
    len_2 = abs(l - A[num])
    score_arr.append(min(len_1, len_2))
  if len(score_arr) != 0:
    score_num = max(score_arr)

# pairsの場合
elif k != 1:
  for i in range(len(pairs)):
    score_arr = []
    tmp = pairs[i][0]
    score_arr.append(A[tmp])
    tmp = pairs[i][-1]
    score_arr.append(l-A[tmp])
    for j in range(len(pairs[i])):
      if j == 0:
        pass
      else:
        num_1 = pairs[i][j]
        num_2 = pairs[i][j-1]
        score_arr.append(abs(A[num_1]-A[num_2]))
    score.append(min(score_arr))
  if len(score_arr) != 0:
    score_num = max(score)
else:
  pass

print(score_num)
```
（現在整形中です……）

## 結果
入力例の問題はこれで全て解くことができたのですが……
いざ提出してみると、TLEとなってしまいます。

# 解決策
他のアルゴリズムで効率化する必要がありそう。
こういったものでは2分探索が有名らしいので、次はそちらで作成してみようと思います。
Goで機密情報の出力を簡単マスキング

突然ですが、コーディングをする時にマスキングしていますか？
本番運用の際、機密情報がログへ出力されてしまい、内容を知る必要のない人に知れ渡ってしまう...なんてことが無いように
情報漏えいのリスクは最小限に抑えたいところです。
この記事では、Goの`fmtパッケージ`の下記インタフェースを満たすことで、機密情報がログへ出力されることを防止する方法を紹介します。

```go
// %#v の時に使用される
type GoStringer interface {
	GoString() string
}

// %#v を除く、いかなる時にも使用される
type Stringer interface {
	String() string
}
```

実際のコードは以下のようになります。
サンプルでマイナンバーを機密情報に見立ててみました。

```go:main.go
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int
	Username string
	MyNumber MyNumber
}

// ！！機密情報（日本国内の全住民に付番される12桁の番号）!!
type MyNumber string

func (m MyNumber) GoString() string {
	return "XXXX XXXX XXXX"
}

func (m MyNumber) String() string {
	return "XXXX XXXX XXXX"
}

func main() {
	user := User{
		ID:       1,
		Username: "test",
		MyNumber: "1234 5678 9012",
	}

	fmt.Println(user)
	fmt.Printf("%v\n", user)
	fmt.Printf("%+v\n", user)
	fmt.Printf("%#v\n", user)

	// 以下のように表示される
    // {1 test XXXX XXXX XXXX}
    // {1 test XXXX XXXX XXXX}
    // {ID:1 Username:test MyNumber:XXXX XXXX XXXX}
    // main.User{ID:1, Username:"test", MyNumber:XXXX XXXX XXXX}

	//　プログラム本体には影響しない
	user.MyNumber = "9876 5432 1098"
	bytes, _ := json.Marshal(user)
	fmt.Println("JSON:", string(bytes))
	// 以下のように表示される
	// JSON: {"ID":1,"Username":"test","MyNumber":"9876 5432 1098"}
}

```

以上のように、fmtパッケージの２つにインターフェースを満たすことで、簡単にマスキングができました。
面倒臭さは少しありますが、機密情報を扱う場合などに使えるのではないか思います。
[Python][Julia]Project euler6 (プロジェクトオイラー6)

#### Project euler Ploblem 6 (プロジェクトオイラー6)
[Sum Square Difference](https://projecteuler.net/problem=6)

備忘のために残しておく。
この問題は、手計算可能でコードを書く必要がなかった。
（一応、コードは載せている）

## 問題
#### 問題文 (意訳)
100までの自然数の和の2乗と自然数の2乗の和の差を求めよ

#### 原文
The sum of the squares of the first ten natural numbers is,
```math
\begin{align}
1^2 + 2^2 + ... + 10^2 = 385
\end{align}

```
The square of the sum of the first ten natural numbers is,

```math
\begin{align}
(1 + 2 + ... + 10)^2 = 55^2 = 3025
\end{align}
```
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 
3025 - 385 = 2640.

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.


## 答え
<b>25164150</b>

#### 解答の方針

#### 1個目の解答方針
```math
\begin{align}
1^2 + 2^2 + ... + n^2 &= \frac{1}{6}n(n+1)(2n+1)\ \\
(1 + 2 + ... + n)^2 &= \bigl(\frac{1}{2}n(n+1)\bigr)^2\ \\

\end{align}
```
を使って
以下のように式変形し、手で計算する。
```math
\begin{align}

(1 + 2 + ... + n)^2  - (1^2 + 2^2 + ... + n^2) \\
\end{align}
```
```math
\begin{align}
&=(\frac{1}{2}n(n+1))^2\ -\frac{1}{6}n(n+1)(2n+1)\\
&= n(n+1)(\frac{1}{4}n(n+1) - \frac{1}{6}(2n+1)) \\
&= \frac{1}{12}(n-1)n(n+1)(3n+2) \\
\end{align}
```
100の場合だと 99×100×101×302÷12　となって手で計算できる

#### 2個目の解答方針
単純に計算する

#### Pythonのコード

```Python: Python Ploblem6
def sum_of_squares(limit: int) -> int:
    sum: int = 0
    for i in range(limit + 1):
       sum +=  i**2
    return sum
def sum_squared(limit: int) -> int:
    sum: int = 0
    for i in range(limit + 1):
        sum += i
    return sum**2

print(sum_squared(100)-sum_of_squares(100))
```

#### Juliaのコード
```Julia:Julia Ploblem6
function sum_of_squares(limit::Int64)::Int64
    sum::Int64 = 0
    for i in 1:limit
       sum +=  i^2
    end
    return sum
end

function sum_squared(limit::Int64)::Int64
    sum::Int64 = 0
    for i in 1:limit
        sum += i
    end
    return sum^2
end

println(sum_squared(100)-sum_of_squares(100))
```
【React】ひな形を自動で作成してくれる便利なショートカット

# 背景
コンポーネントを作成する際に、
毎度ひな形を作成するのは面倒な時もあります。
なるべく楽にひな形を作成したいです。
本記事では、Reactでコンポーネントのひな形を作成する方法を記載します。

# 環境
- Vite：5.0.8
- react：18.2.0
- typescript：5.2.2

上記に加えて、vscodeの拡張機能の`ES7+ React/Redux/React-Native snippets`を使用しています。

https://marketplace.visualstudio.com/items?itemName=dsznajder.es7-react-js-snippets


# ひな形の生成方法１（function型）

以下の文字列を入力し、変換候補に出てくる`reactFunctionalComponent`を選択。
```
rfc
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0fcc7758-f70f-cd72-2d85-0544f70251b7.png)


`reactFunctionalComponent`を選択すると、
以下のように自動でひな形が生成される。

```react
import React from 'react'

export default function hoge() {
  return (
    <div>hoge</div>
  )
}
```

# ひな形の生成方法２（アロー関数型）
以下の文字列を入力し、変換候補に出てくる`reactArrowFunctionExportComponent`を選択。
```
rafce
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0ceaf8f7-81b8-a9ee-149a-8d34b765c5e1.png)

`reactArrowFunctionExportComponent`を選択すると、
以下のように自動でひな形が生成される。

```react
import React from 'react'

const hoge = () => {
  return (
    <div>hoge</div>
  )
}

export default hoge
```
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.11.4／OTP24で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の22日目です

---

【本コラムは、5分で読め、5分でお試しいただけます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 24 [erts-12.3.2.15] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit]

Interactive Elixir (1.11.4) - press Ctrl+C to exit (type h() ENTER for help)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、Elixir 1.12.3／OTP24と同じくらいです

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=774
:ok
```

# 限界確認

25万プロセスは、Elixir 1.12.3／OTP24と同じくらいです

```diff_elixir
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=2126
:ok
```
【CSS】hoverに対応している場合にのみスタイルを適用する方法

以下のように記述すると入力デバイスの内１つでも`hover`できるものがあればスタイルが適用されます。

```css
@media (any-hover: hover) {
  a:hover {
     background-color: orange;
  }
}
```

`any-hover`の代わりに`hover`を使用するとデバイス自体が`hover`に対応している場合にのみスタイルが適用されます。
例えば、iPad に Magic Keyboard を取り付けて使用した場合でも`any-hover`ではなく`hover`を使用した場合にはスタイルは適用されません。

```css
@media (hover: hover) {
  a:hover {
     background-color: orange;
  }
}
```
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.12.3／OTP24で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の22日目です

---

【本コラムは、5分で読めます】　※各ライブラリをお試しいただく場合は各自次第で

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 24 [erts-12.3.2.15] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit]

Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、Elixir 1.13.4／OTP25と同じくらいです

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=787
:ok
```

# 限界確認

25万プロセスは、Elixir 1.13.4／OTP25より少し遅いようです

```diff_elixir
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=2150
:ok
```
ABC048 ARC064 の問題を解いてみました


## A問題
https://atcoder.jp/contests/abc048/tasks/abc048_a

素直に "A" と sの一文字目 と "C" を出力すればよいです。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  string a, s, c;
  cin >> a >> s >> c;
  
  printf("A%cC", s[0]);
}
~~~

## B問題
https://atcoder.jp/contests/abc048/tasks/abc048_b

制約が大きいので、愚直に実装していては TLE になってしまいます。
なので、高速に処理をする方法を考えましょう。

もし、$n$ が $x$ で割り切れる場合は、$x$ が 0から数えたときの約数の何番目かを返し、割り切れない場合は $x$ に最も近い、 $x$ 以下の約数が何番目かを返す 関数func を実装します。
つまりは、関数func は $0$以上$n$以下の整数のうち、$x$ で割り切れるものの個数を返します。

累積和のような考え方で、
$0$以上$b$以下の整数のうち、$x$ で割り切れるものの個数 から、
$0$以上$a - 1$以下の整数のうち、$x$ で割り切れるものの個数 を引くことによって、
$a$以上$b$以下の整数のうち、$x$ で割り切れるものの個数 を求められます。


~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
long long a, b, x;
long long func(long long n){
  if(n < 0) return 0; // n = -1 の場合に対応する
  return n / x + 1;
}

int main(void){
  cin >> a >> b >> x;
  
  cout << func(b) - func(a-1) << endl;
  // a = 0 のとき、 func(-1) が実行される
}
~~~



~~~C++:他の正答例
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  long long a, b, x;
  cin >> a >> b >> x;
  
  a = (a + x - 1) / x; // a 以上の x の約数
  b = b / x; //b 以下の x の約数
  
  cout << b - a + 1 << endl;
}
~~~

## C問題
https://atcoder.jp/contests/abc048/tasks/arc064_a

$a_i + a_{i+1} \leqq x$ が成り立つかどうかを判定して、成り立たない場合は 成り立つように $a_{i+1}$ の値を減らせば正解できます。
$a_{i+1}$ の値を減らすのは、その影響で $a_{i+2}$ の値を減らす回数を減らせる可能性があるからです。

また、$a_1$ の値が $x$ よりも大きい場合は、 $a_1$ の値を $x$ にする必要があるので、そこにも気をつけてください。


~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n, x;
  cin >> n >> x;
  int a[n];
  for(int i = 0; i < n; i++) cin >> a[i];
  long long ans = 0;
  
  if(a[0] > x){ // 最初の箱への処理
    ans += a[0] - x;
    a[0] = x;
  }
  for(int i = 0; i < n - 1; i++){ //それ以外の箱への処理
    if(a[i] + a[i+1] > x){
      ans += a[i] + a[i+1] - x; 
      a[i+1] -= a[i] + a[i+1] - x;
    }
  }
  cout << ans << endl;
}
~~~


## D問題
https://atcoder.jp/contests/abc048/tasks/arc064_b

このゲームが終了するときには、文字列の形は
* abababa
* ababab

のどちらかの形になります。
そして、文字列の両端は取り除けないので、両端が同じ文字なら上の形で、そうでなければ下の形 で終了するということがわかります。
そして、上の形なら 終了するときの文字列の長さは 奇数で、
下の形なら 終了するときの文字列の長さは 偶数 です。

消せる文字数は、$開始時の文字列の長さ - 終了時の文字列の長さ$ で求められます。

消せる文字の個数が奇数なら、先手が勝利して、 偶数なら 後手が勝利します。

引き算は、引く数と引かれる数 のどちらかが奇数ならば、答えも奇数になります。

元の文字列の長さが奇数なら、開始時の文字列の長さは奇数になります。(当たり前)
文字列の最初と最後の文字が同じなら、終了時の文字列の長さは奇数になります。
どちらかが成り立てば、計算結果が奇数になります。

つまり、
* $S$ の長さが偶数
* $S$ の最初と最後の文字が同じ

のどちらかが成り立つ場合は、後手が勝利して、そうでなければ先手が勝利します。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  string s;
  cin >> s;
  int ans = 0;
  
  if(s.size() % 2 == 0) ans++;
  // 文字列の長さを確かめる
  
  int last = s.size() - 1;
  if(s[0] == s[last]) ans++;
  //最初と最後の文字が同じか確かめる
  
  if(ans == 1){ //片方が成り立つなら
    cout << "Second" << endl;
  }
  else{
    cout << "First" << endl;
  }
}
~~~
OpenAI APIで検証したいこと(備忘録)

この記事は[OpenAI API Advent Calendar 2023](https://qiita.com/advent-calendar/2023/openai-api) 22日目の投稿です。

# 概要
この記事では、今後OpenAI APIを利用するにあたって検証したい内容について記載します。検証結果は今後投稿していこうと思います。

# 検証内容

## 検証1: TypeScriptで動作させたい
多くの書籍、資料、ドキュメントではPythonで利用する方法が採り上げられていますが、筆者はTypeScriptから実行したいと思い、資料を探していますが、なかなか良い資料が見つかりません。唯一書籍でJavaScript上から利用する方法を説明した書籍が以下の書籍です。この書籍を参考に研究してみようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/09a2aed7-6eb8-5738-b24a-2adfdd39ab3d.png)

https://amzn.asia/d/hOtqfq7

## 検証2: Azure上のAPIのバージョンと共用したい
Azure上のChat AI APIとバージョンが異なります。Azure上のバージョンが若干古いバージョンのAPIとなるため、謎のおまじないを書かなければ動作しないなど困ったことが多々有ります。しかし、社内版のAPIがAzure上のバージョンであるため、Open版と共用出来る様に何らかの方策を実装しなければならないなと考えています。

## 検証3: 5$でどれぐらいの期間使えるか
現在ユーザー登録後、5$まで無料で使える様です。これで一体全体どれぐらい使える物なのか？トークンという独自の数え方であるため、判然としません。。。これも実際試すより他有りません。。。

https://community.openai.com/t/usage-openai-api-5-dollar-free-gift/512163

https://www.goatman.co.jp/media/openai-api-pricing/#:~:text=OpenAI%20API%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

# まとめ
これまでカード請求額の増大を恐れて試せていなかった上記3つについて近日中に試してみようと思います。
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.13.4／OTP25で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の22日目です

---

【本コラムは、5分で読めます】　※各ライブラリをお試しいただく場合は各自次第で

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、Elixir 1.14.3／OTP25と同じくらいです

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=788
:ok
```

# 限界確認

25万プロセスも同じくらいです

```diff_elixir
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=2063
:ok
```
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.14.4／OTP25で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の22日目です

---

【本コラムは、5分で読めます】　※各ライブラリをお試しいただく場合は各自次第で

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.14.4) - press Ctrl+C to exit (type h() ENTER for help)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、Elixir 1.15.0／OTP25や、Elixir 1.16.0／OTP26より、少し重くなりました

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=782
:ok
```

# 限界確認

25万プロセスは明確に遅くなっています

```diff_elixir
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=2039
:ok
```
RCJ Rescue league マップ作成ツール配布

# マップ作成ツール配布
ロボカップジュニアのレスキューリーグ用 マップ作成ツールを配布します。
ライン、メイズの両方に対応しています。
運営や練習に使えます。
詳細はREADMEを確認ください。

(githubにexeファイル載らなかったので2種配布します。)
パッケージにはexe化したものが入っています。
起動が遅いので環境がある方はソースコードの使用を推奨します。

# パッケージ配布 googledrive

https://drive.google.com/drive/folders/1TipabzQy7uBpQbhWMtMhPr1tHYIX1LGV?usp=sharing


# ソースコード配布 GitHub

https://github.com/RakuseiRobotStudyClub/RCJ_mapMaker

# スクリーンショット

 <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515767/f752b7bd-53bd-9d4b-97fa-5e5b40b62040.png">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515767/2eddb197-6bab-b641-225d-8ea6de6aee91.png">

# 動作環境
win10 python 3.9  
(使用ライブラリ: pygame,openpyxl,json,tkinter,shutil)
必要に応じてライブラリをインストールしてください。
```
pip install pygame
pip install openpyxl
pip install json
pip install tkinter
pip install shutil
```

# デバッグ
なにか不具合が発生しましたら、エラー文や直前に行った操作を含めてにこの記事のコメントに報告していただけると幸いです。

# 更新記録
2023-12-31　　公開(v0.8)
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.15.7／OTP25で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の22日目です

---

【本コラムは、5分で読めます】　※各ライブラリをお試しいただく場合は各自次第で

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.15.4) - press Ctrl+C to exit (type h() ENTER for help)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、Elixir 1.16.0／OTP26より、少し軽いようです

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=639
:ok
```

# 限界確認

25万プロセスもElixir 1.16.0より、少し軽いようです

```diff_elixir
iex>  PassSupervisor.start_link(250000)
Spent Milliseconds=1727
:ok
```
TensorFlowの内部構造を理解するために必要なことを考える(備忘録)

この記事は[OSS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/open_source_software) 20日目の投稿です。

# 概要
TensorFlowの内部構造について理解したら仕事の幅が広がる現場に異動しました。なぜなら、新しい部署では次世代スーパーコンピュータ向けにTensorFlow、PyTorch、scikit-learnを移植するというミッションがあるからです。しかし、公式GitHubのソースコードを一度でも読もうと挑戦された方は気付くと思います。この膨大な量のソースコードをどうやって読めば良いのかと。。。ましてや内部構造を理解するなんて。。。筆者にも答えは有りません。有りませんが、無いなりに仮説を立てて、今後検証していこうと思います。

https://github.com/tensorflow/tensorflow

# 何をすべきか？
当然こう書けば、TensorFlowのソースコードを読むという結論に達するでしょう。しかし、いきなりは難しいでしょう。よって筆者はステップアップ方式で順番にやる方法が最適なのではと考えました。急がば回れ方式です。

:warning: 一応ステップアップ方式を想定しましたが、後半は順番通りにならない様な気もします。。。

## ステップ1: TensorFlowを利用する機会を増やす
TensorFlowの内部構造を理解する前に、TensorFlowが使えなくては内部構造も理解出来ません。しかし、内部構造を理解したいと欲する段階で、ある程度は利用経験が有るように思います。筆者もTensorFlowは学生時代も含めれば何かとご縁が有ります。しかし、頻繁に自分で0からモデルを実装して検証しているかと言えば、0からモデルを実装することは少ない様に思います。公式の認定試験を受験したり、論文に出ているモデルを自分なりに実装してみるなど、利用する機会を増やすことがまずは必要だと思いました。

https://www.tensorflow.org/certificate?hl=ja

## ステップ2: NSight Systemsとの組み合わせでの利用
NVIDIAが開発したプロファイラーNSight Systemsを利用して実際にGPUモードのTensorFlowで実装した簡単なモデルを実行し測定を行ってみます。NSight Systemsは優れ物で実行時にどの様なイベントが発生しているか詳細に分析できます。本来はTensorFlow Profilerというツールが実装されているのですが、現在全く動作しない状況です。。。

## ステップ3: まずはKerasのソースコードから読んでみる
KerasはTensorFlowと密接に関係しています。と言うよりも、TensorFlowはVersion 1.7からTF KerasとしてKerasを飲み込みました。しかし、Kerasのコアの部分はPythonで実装されており、コア部分は殆どC言語で実装されているTensorFlowと比較して読みやすいのではと思いました。よって、まずはKerasでソースコードを読むのに慣れることから始めるべきではと思います。

## ステップ4: 新バージョンが出る毎にChange Logを読んでみる
新バージョンのリリース毎に追いかけていくのも結構大変です。これを読んで理解するだけでも内部理解の一助になる様な。。。

## ステップ5: GitHub Issueから手頃なバグを修正してみる
ここまではTensorFlowの内部、つまりソースコードは読まずに、外から使うというステップでした。ステップ3では実際に内部を見るために、GitHub Issueから手頃なバグ(例えば、good first issue)の修正に挑戦してみることで、ソースコードを読む機会を増やすことになり、理解が進むのではないかと考えています。

## ステップ6: 興味の有るモジュールのソースコードから読む
興味の有るところから攻めるのが最適解？

## ステップ6.5: PyTorchのソースコードも読んでみる
二大巨頭と言えば、TensorFlowとPyTorch。設計思想は丸っきり違うと言われますが、PyTorchのソースコードを読むことで逆にDeep Neural Networkについて理解が深まり。。。(今後検証)

## ステップ7: 他の人とも情報共有
他の有識者と情報共有することで、知らなかったことが知れたり、誤謬が正されたり、良いことずくめ。

# まとめ
現在取り組んでいるステップ、未到達のステップ混在していますが、2024年はこの記事のステップを一巡できる様にしたいなと思います。
【DDIA 読破】3日目の記事（準備中）

この記事は、[気合いで DDIA 読破 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ddia) 1日目の記事です。

# この記事のステータス

🚧 この記事は準備中です。アドベントカレンダーの枠を保持するために、一旦公開しています。