OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドチートシート

# コマンドチートシート
## cat
```
# 行番号を表示させる
cat -n ファイル名

# 実用例
cat -n ファイル名 | grep -e "hoge"
->hogeを含む文字の行数を確認する

cat ファイル名 | grep -e "hoge"　| cat -n
->hogeを含む行数を確認
->件数のみ必要な場合は[cat -n]の代わりに[wc -l]
```
```
# すべての非表示文字を表示(利用頻度は少ない)
# オプション[-vET]と同じ（-vetの場合もあり)
# 改行コードやタブなど意図しないものが入っていないか確認するときに利用
cat -A ファイル名

# 実用例
cat -A ファイル名 | grep [-e または　-v] "¥$$"
->末尾がLFのものを確認(-e)
->末尾がLFではないものを確認(-v)

cat -A ファイル名 | grep [-e　または　-v] "\^M\$$"
->末尾がCRLFのものを確認（-e）
->末尾がCRLFではないものを確認(-v)

cat -A ファイル名 | grep [-e　または　-v] "\^I"
->タブを含む行を確認（-e）
->タブを含まない行を確認(-v)
```
```
複数ファイルをまとめて処理
cat ファイル1 ファイル2　ファイル3 # 単純に並べるだけ
cat hoge* # プレフィックスで指定したい場合（日付など決まった規則のファイル名のもの）
cat *hoge # 拡張子のみを指定したい場合（csvやjsonなど）など

実用例
cat hoge* > 結合したファイル
->複数ファイルを一つにまとめる　
->以下のように並行してコマンド実行し、一度それぞれのファイル名で出力した後に結合するなど
　　　　->for 変数 in 値のリスト; do コマンド > output_${変数}　&;done

cat hoge* | grep piyo | wc -l
cat hoge* | cut -d ',' -f 3 | sort -u | wc -l
cat hoge* | jq -c '.PIYO[]'
->上記のように他のコマンドと組み合わせることが多い
```
[Unity] 相性の良いAdmob と FAN のバージョン（Unity Preference)


Android ＆ iOS ビルド時に、エラーが起きなかった（ビルドが通った）広告周りのパッケージバージョンとUnity preference 項目を列挙します。


最新版👇
https://kaedeee.com/unity-admob-fan-unity-preference

# バージョン一覧
Unity 2019.4.36f1
Easy Mobile Pro (Version 2.18.0, Released: Feb 21, 2022)
Admob (GoogleMobileAds-v6.1.2)
FAN (GoogleMobileAdsFacebookMediation-3.3.0)


# Unity Preference の設定
## ① Gradle にカスタムのバージョンを利用する
Unity > preference > External Tools > Gradle

Unity Gradle Version (gradle-5.6.4)

## ② Custom Manifest を利用する
Project Setting > Player > Android > Publishing Settings > Build > 
Custom Main Manifest をチェック
Custom Launcher Manifest をチェック
Custom Base Gradle Template をチェック

## ③ .gradle のバージョンを変える
Project view ファイル内の baseProjectTemplate.gradle の以下を変更。
❌ classpath ‘com.android.tools.build:gradle:3.4.0’
⭕️ classpath ‘com.android.tools.build:gradle:3.4.3’

## ④ Android, iOS のキャッシュを削除
Android Resolver > Delete Resolved Libraries
Plugins > iOS 内のファイルを全て消去

## ⑤ Libraryを消去しながら再起動
再起動（この際、Library を消去する）

## ⑥ Force Resolve する
Package Manager Resolver > Migrate Package
Android Resolver > Force Resolve

最新版👇
https://kaedeee.com/unity-admob-fan-unity-preference
Javaでラブ注入してみた

# 発端

現在、部署に配属されてきた新入社員のトレーナーをしています。
開発未経験で、入社して初めてプログラミングを経験する方で現在絶賛Javaのキャッチアップ中。

曰く、1on1で「Twitterでこんなツイートを見かけたのでやってみました」とのこと。

https://twitter.com/Sheeeeepla/status/1554028833942441984

「そういうところから勉強の題材を自分で見つけてやってみる姿勢めっちゃ良いね！業務時間使っていいからこれからもどんどんやっていこう！」
と大絶賛したところで、~~先輩ぶってドヤ顔するため~~ 参考にしてもらうため解答例を書いてみました。

# コード

その場でめっちゃ雑に書いて新入社員に見せたものから、あまりに細かい説明用のコメントを抜いたり軽く手直しはしています。

```java:Dodosuko.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Dodosuko {

	@SuppressWarnings("boxing")
	public static void main(String[] args) {
		String[] ddsk = { "ドド", "スコ" };
		List<Integer> answer = Arrays.asList(0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1);
		Random rnd = new Random();
		List<Integer> history = new ArrayList<>();

		while (!history.equals(answer)) {
			int num = rnd.nextInt(ddsk.length);
			System.out.print(ddsk[num]);

			history.add(num);

			if (history.size() > answer.size()) {
				history.remove(0);
			}
		}

		System.out.println("ラブ注入♡");
	}
}
```

# 新人教育をするうえでの学び

実は入社4年目にして初めて新人教育に携わったのですが・・・

開発未経験で入社してくる新人は、入りたての時は基本的に何もかもわからないはずです。
成功体験がなかなか積めずに挫折してしまう方も多くいらっしゃることでしょう。

もちろん、我々が小さな成功体験をたくさん積めるような環境を用意することも重要です。
一方で、新人がやっていることにきちんと目を向け、学びの題材を自ら見つけてくる好奇心の芽？はしっかり見つけてあげて、伸ばしていくのが重要だなと感じました。

# 余談

リプライを見ると様々な正答・誤答やそれに混じってiOSショートカットやワンライナーで書いている狂人(誉め言葉)がたくさんいて面白かったです。
よくある誤答まとめみたいなツイートもリプライにありましたが、要件をきちんと理解するって大事な能力ですね。

同期の狂人(誉め言葉)に記事化の先を越された…
https://qiita.com/h53/items/2d62b16ce020f9c897bf
Pythonワンライナーで「ドドスコスコスコ」してみた

## はじめに

https://twitter.com/Sheeeeepla/status/1554028833942441984

>【問題】配列{"ドド","スコ"}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を3回繰り返したもの』に一致したときに「ラブ注入♡」と標準出力して終了するプログラムを作成せよ(配点:5点)

こちらのツイートが社内で話題になっていました。

そこで、試しにPythonワンライナーで書いてみました。
そんな遊びの記事です。

## コード

```python
__import__('sys').setrecursionlimit(10**6);print((lambda f: f('','',0,f))(lambda s,l,i,f: s+'ラブ注入♡' if i==3 else f(s,'',i+1,f) if l=='dsss' else f(s,'',0,f) if len(l)>=4 else f(s+'ドド', l+'d',i,f) if __import__('random').getrandbits(1) else f(s+'スコ', l+'s',i,f)))
```

## 実行結果

https://www.ideone.com/LyHCvY

## 解説

Pythonワンライナーではループや変数の代入がちょっと面倒なので、`lambda`を使用して再帰しています。
ただし、デフォルトでは再帰の深さが1000と圧倒的に足りないので、最初に`__import__('sys').setrecursionlimit(10**6)`を呼んで適当に深さを$10^6 = 1,000,000$に設定しています。

なお、手元のWSL2環境（Windows 11, Ubuntu 20.04 LTS, Python 3.8.10）ではそれなりの確率で`Segmentation fault`で落ちます。
また、Windows環境（Windows 11, Python 3.10.5）だと100%無言で落ちます。`3221225725 (0xc00000fd)`というエラーコードで終了するので、どうやらスタックオーバーフローしているようです。

## おわりに

業務終了後に深夜テンションで書いたので、もう少し改善できる余地があるかも知れません。
こういうちょっとしたプログラミングコンテスト的な問題は、色々な人の色々なコードを見られるので面白いですね。

~~書いた後で気付いたのですが、問題に「配列{"ドド","スコ"}から～」とあるのにそのような配列を使ってないので、厳密にはアウトかも知れません。~~

### 追記

社内でこのツイートが話題になるきっかけになった同期が、
新入社員の方向けにJavaコードで解答した記事を書いていました。
https://qiita.com/na0y/items/1f5ed3ce215297d70d3a

## 参考文献

- [【Python】lambdaで再帰](https://qiita.com/kzm4269/items/94ba1dfa2de2cf4bc78f)
- [[python] pythonの最大再帰処理回数(Maximum Recursion Depth)を変更する](https://qiita.com/wifecooky/items/348da636f456a00120db)
- [Get a random boolean in python?](https://stackoverflow.com/questions/6824681/get-a-random-boolean-in-python)
- [Process finished with exit code -1073741571 (0xC00000FD) in Python](https://stackoverflow.com/questions/62550606/process-finished-with-exit-code-1073741571-0xc00000fd-in-python)
ReactiveSwift 主要コンポーネントまとめ

## この記事について
この記事は今更ですが、ReactiveSwiftの主要コンポーネントについてとても簡単にまとめたメモをQiitaに移植したものです。

## ReactiveSwiftを構成する主なコンポーネント
ReactiveSwiftを構成する主なコンポーネントは以下の6つです。
```
　　　　- Signal
　　　　- SignalProducer
　　　　- Property　
　　　　- MutableProperty
　　　　- バインディング演算子（<~）
　　　　- Action
```
## Signal / SignalProducer
- **Signal**
    
    SignalはEventのストリームを流し続ける（Hot）
    
    Failed/Completed/Interrupted”のどれかが流れるとストリームを終了する
    
- **SignalProducer**
    
    SignalProducerは、購読されたらストリームを流す（Cold）
    
## Property / MutableProperty

- **MutableProperty**
    
    ・購読可能な値を保持している
    
    ・値の変更はもちろんSignal/SignalProducerから購読可能
    
    ・同期的に値を取得することができる
    
    ```swift
    let selectedArtist = MutableProperty<[Artist]>([])
    //Signalで購読
    selectedArtist.signal.observeValues { selectedArtist in
    	print(selectedArtist)
    }
    //値の変更と取得は'value'で可能
    selectedArtist.value = [
    	Artist(id: 123456, name: "hoge")
    ]
    ```
    
- Property
    
    ・**読み取り専用　←これがMutablePropertyとの違い**
    
    ・MutablePropertyとインターフェースはほぼ同じ
    
    ・外部に公開するときに便利
```swift
let mutableState = MutableProperty(State.notLoaded)
//↓これはMutablePropertyなので値の更新ができる
mutable.value = .loading
//↓MutablePropertyをPropertyに変換
let state = Property(caputuring: mutableState)
//↓これはPropertyなので値の更新はできないため、コンパイルエラー
state.value = .notLoaded　←これはエラー
```

**まとめると**

・Propertyは**読み取り専用**

・MutablePropertyは**読み書き可能**

・それ以外のできることはほぼ同じ

### Property / MutableProperty比較表
|  | Property | MutablePropety |
|:-:|:-:|:-:|
|読み取り|○|○|
|書き込み|×|○|
|map後の型|Property|Property|
### Tips💡 - Propertyのmapが便利

例 : Usernameが5文字以上の時に登録ボタンがアクティブになる画面
```swift
struct ViewModel {
	let username: MutableProperty<String>
	let isEnabled: Property<Bool>

	init() {
		self.username = MutableProperty("")
		self.isEnabled = userName.map { userName in
			userName.count >= 5
		}
	}
}
```

## バインディング演算子( <~ )

- 値のバインディングに使用する

例:↑Tipsの続き

```swift
viewModel.userName <~ textField.reactive.continuousTextValues.map { $o ?? "" }
registerButton.reactive.isEnabled <~ viewModel.isEnabled
```

💡***Points***

・左辺にバインドされる側を描く（MutableProperty）

・右辺に値を送る側を置く（Signal/SignalProducer、Property/MutableProperty）

・右辺がProperty/MutablePropertyの場合は**現在の値が流れてくる**

・disposeは省略が可能

## Action

- Input を与えてOutputもしくはErrorを流す

## まとめ
今回は簡易的にまとめたものなのでとてもざっくりですが、以下の記事がとてもわかりやすいです。
ほとんど記事のスライドに沿った簡易まとめになっています。

https://blog-rookery.com/posts/introduction-to-reactive-swift/

## 参考文献
「入門 ReactiveSwift 」という発表をした
https://blog-rookery.com/posts/introduction-to-reactive-swift/
ReactiveSwiftを克服する Part1 〜 Part5
https://qiita.com/taka1068/items/5d916f1e68cbcdce0121
【読書メモ】ドメイン駆動設計 モデリング/実装ガイド

「ドメイン駆動設計 モデリング/実装ガイド」の読書メモ
https://booth.pm/ja/items/1835632


## 第２章　モデリングから実装まで
- ドメイン知識はドメイン層の対応するオブジェクトに書く
- 常に正しいインスタンスしか存在させない
- 「アプリケーションとして何を行うのか」を定義するのが一番開発につなぎやすい

## 第４章　設計の基本原則
- 基本的に高凝集・低結合を目指す

## 第５章　アーキテクチャ
- よくある3層アーキテクチャ（プレゼンテーション層、ビジネスロジック層、データアクセス層）の問題は、ビジネスロジック層が低凝集になること
- レイヤードアーキテクチャ
    - プレゼンテーション層（クライアントとの入出力）
    - アプリケーション層（ユースケースの実現）
    - ドメイン層（ドメイン知識の表現）
    - インフラ層（データベースとの入出力）
- レイヤードアーキテクチャの問題はドメイン層にリポジトリを置く場合、インフラ層（特定のDBなど）に依存すること
- ドメイン層が特定のインフラ技術に依存しないことの解決策の1つがオニオンアーキテクチャ
- オニオンアーキテクチャでは、リポジトリはインターフェースをドメイン層に、実装クラスをインフラ層に定義する
- オニオンアーキテクチャでは、ドメイン層はほかの層への依存を持たせない

## 第６章　ドメイン層の実装
- リポジトリはListのように扱う。
- 「ユーザ登録する」「ユーザを退会状態にする」メソッドを持たせず、新規登録状態のユーザー、退会状態のユーザーをaddするという使い方
UnityからCognitoUserPool認証を使用してAppSyncに接続する

# はじめに
AppSyncで出回っている認証方法はデフォルト設定のAPI-KEYのものが大半だが、そこには罠があり最長1年で有効期限となってしまう。
その対策として自動更新の仕組みを入れる必要があるが、仕組みを入れたことを忘れそうなので認証期限の長いCognito認証の方法を調べてみました。

# 基本的なGraphQLへの接続方法

えどさんの記事が非常に参考になります。
以降はこの記事を補完する形で記載します。

https://edom18.hateblo.jp/entry/2021/12/11/105140

# Cognito設定
## 初期設定
### デフォルト設定でUserPoolを作成する
* アプリクライアントを作成する
    * トークンの期限を設定する（Max10年）
    * クライアントシークレットを生成のチェックを外す
         ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/72d9c2c5-2916-07ba-276c-c2e87696bd84.png)

### ユーザーを作成する
* 作成したUserPoolにUnityアプリがログインするためのユーザーを作成する。
    * パスワードは以後見れなくなるのでメモしておくこと
    * 作成直後は"FORCE_CHANGE_PASSWORD"ステータスになっており、このままではログインできないので注意。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/d8677bc5-32ea-6a8c-4459-2a8f76603ba6.png)

### ユーザーの"FORCE_CHANGE_PASSWORD"ステータスを解除する
* CLIで解除する方法とAppSyncから解除する方法がある
    * CLIの方はググるとすぐ出てくるので省略する
* AppSyncから解除する方法
    1. AppSyncで新規のAPIを作成する
    1. 設定の`デフォルトの認証モード`から`Amazon Cognito ユーザープール`及び、先ほど作成したUserPoolを選択して`保存`を押す
    1. 左側のメニューの`クエリ`を選択すると`ユーザープールでログイン`ボタンが表示されるようになっているので、先ほど作成したユーザーでログインする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/42400fce-d577-a31e-bb0c-9b80ce2447da.png)
    1. CognitoのUserPoolからユーザーの一覧を確認するとステータスが`CONFIRMED`に変わっていることを確認する。

### AppSync認証設定
* 実際にUnityアプリからアクセスしたいAPIを開く
* 設定の`デフォルトの認証モード`から`Amazon Cognito ユーザープール`及び、先ほど作成したUserPoolを選択して`保存`を押す

### 認証情報をメモする
* CognitoからPoolID,ClientAppIDと利用するユーザー名をメモしておく
    * ユーザーパスワードを忘れた場合は再度閲覧できないので新規でログイン用のユーザーを作成しておく
* AppSyncからAPI URLをメモしておく

### AWS接続用のパッケージを取得する
Nugetを利用してStandard2.0用の.dllを入手する。
.dllファイルは`Plugin`ディレクトリに入れないと動作しないので注意が必要

### Cognito認証

こちらのREADMEを参照し、`AuthFlowResponse.AuthenticationResult.AccessToken`を取得する。

https://github.com/aws/aws-sdk-net-extensions-cognito

### 認証を実行する
クライアントのHeaderにCognito認証時に取得したAccessTokenを付与する。
``` c#
    client.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(TOKEN);
```
Phoenix x Tailwind CSS x daisyUIでthemeChange

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/ff449a4f-90fc-4530-db05-beb5a24b7448.gif)

[Phoenix](https://www.phoenixframework.org/)のアプリを[作ります](https://hexdocs.pm/phoenix/up_and_running.html)。

https://hexdocs.pm/phoenix/up_and_running.html

---

次に
[Tailwind CSS](https://tailwindcss.com/)と[daisyUI](https://daisyui.com/)の設定をします。

https://tailwindcss.com/docs/guides/phoenix

https://daisyui.com/docs/install/

上記が公式の案内です。
@nako_9h_sleep さんの記事が詳しいです :tada::tada::tada: 

https://qiita.com/nako_9h_sleep/items/9cd2343d19abee7a59e9

---

さらに以下の変更を加えます。

コマンドで
```
cd assets
npm i theme-change
```
を行います。
`package.json`と`package-lock.json`が書き換わります。

---
さらにさらに編集を続けます。
チョ〜　楽しい！！！


```js:hello/assets/tailwind.config.js
module.exports = {

  daisyui: {
    themes: ["light", "dark", "cupcake", "bumblebee", "emerald", "corporate", "synthwave", "retro", "cyberpunk", "valentine", "halloween", "garden", "forest", "aqua", "lofi", "pastel", "fantasy", "wireframe", "black", "luxury", "dracula", "cmyk", "autumn", "business", "acid", "lemonade", "night", "coffee", "winter"],
  },
}
```

```js:assets/js/app.js
import { themeChange } from "theme-change";
console.log("themeChange")
themeChange();
```

```html:lib/hello_web/templates/page/index.html.heex
<div class="container w-full">
  <div class="flex justify-center">
    <div class="badge mx-3">neutral</div>
    <div class="badge badge-primary mx-3">primary</div>
    <div class="badge badge-secondary mx-3">secondary</div>
    <div class="badge badge-accent mx-3">accent</div>
    <div class="badge badge-ghost mx-3">ghost</div>
  </div>

  <div class="flex justify-center mt-6">
  <div class="form-control">
    <select data-choose-theme class="input input-bordered">
      <%= options_for_select(theme_options(), "cupcake") %>
    </select>
  </div>
  </div>
</div>
```

```elixir:lib/hello_web/views/page_view.ex
defmodule HelloWeb.PageView do
  use HelloWeb, :view

  def theme_options() do
    [
      "light",
      "dark",
      "cupcake",
      "bumblebee",
      "emerald",
      "corporate",
      "synthwave",
      "retro",
      "cyberpunk",
      "valentine",
      "halloween",
      "garden",
      "forest",
      "aqua",
      "lofi",
      "pastel",
      "fantasy",
      "wireframe",
      "black",
      "luxury",
      "dracula",
      "cmyk",
      "autumn",
      "business",
      "acid",
      "lemonade",
      "night",
      "coffee",
      "winter"
    ]
    |> Enum.map(fn theme -> {String.capitalize(theme) |> String.to_atom(), theme} end)
  end
end
```

---

できあがり。
たぶんこれでイケるとおもいます。

この通りにやって、できなかったらそれは君への宿題だ！
編集リクエストをお待ちしております。
どうぞ編集リクエストをお送りください。
そして私の承認にて、[Contibution数 1](https://help.qiita.com/ja/articles/qiita-contribution)を獲得してください！
Unity2DゲームでCamera SizeとPixels per Unit(PPU)の決める

# はじめに
Unityで2Dゲームの開発を行っています。
Camera SizeとPixels per Unitの選定方法をまとめました。

# 選定の流れ
1. Tilemapの画像サイズの決定
2. **Pixels per Unit**の計算
3. 縦のタイル数の決定
4. **Camera Size**の計算

# 1. Tilemapの画像サイズの決定
グラフィッカーと相談し、1タイル当たりの画像サイズを決めましょう。
あまり大きいサイズだと疲れてしまうので、今回は16pxとします。

# 2. Pixels per Unitの計算
次にPixels per Unitを求めましょう。
```math
1[unit] = 1つのタイルの大きさ[px]
```
とするのが良さそうです。
今回の場合、タイルの大きさは16pxなので、Pixels per Unitは
```math
PPU=16[Pixels/Unit]
```
となりますね。

# 3. 縦のタイル数の決定
ゲームに応じて決めましょう。
今回は、縦に18個タイルを置けるようにします。(結構広め)
```math
Height = 18[unit]
```

# 4. Camera Sizeの計算
最後にCamera Sizeを求めましょう。
Camera Sizeは、以下の計算式で求められます。
```math
Camera Size = \frac{Height}{2}[unit]
```

上記で求めた数値を使って計算すると、
```math
Camera Size =9[unit]
```
となりました。
Konvaを使った画像が、スマートフォンでタッチに反応せずにスクロールを阻害していた件の対応メモ

## 概要
Konvaを使った画像を並べて表示していたが、スマートフォンで見た時にスクロールできない問題があった。
解決までに時間がかかったのでメモをしておく。

結論から言うと、Konvaのイベントにデフォルトの挙動が上書きされ、何もしない状態となっていた。
今回は、Konvaのイベントを使用しないため、下記のように`listening={false}`を指定することで解決した。

```tsx
    <Stage width={canvasWidth} height={canvasHight}>
      <Layer ref={canvasRef} listening={false}>
        <OutLine width={canvasWidth} height={canvasHight} />
        {children}
      </Layer>
    </Stage>
```

[konva listening](https://konvajs.org/docs/performance/Listening_False.html#sidebar)
Kotlinのwhen式で正規表現を使う

以外とすぐ見つけられなかったので備忘のため
```kotlin
val testWord = "Kotlin is good!"
when {
    Regex(""".*Kotlin.*""").matches(testWord) -> "Contains Kotlin"
    Regex(""".*Scala.*""").matches(testWord)  -> "Contains Scala"
    testWord == "Java"                        -> "Java!"
    else                                      -> "no word"
}
```
C++でドドスコスコスコ

Twitterで以下のツイートがバズっていました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【問題】配列{&quot;ドド&quot;,&quot;スコ&quot;}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を3回繰り返したもの』に一致したときに「ラブ注入♡」と標準出力して終了するプログラムを作成せよ(配点:5点)</p>&mdash; ((🐑++)) (@Sheeeeepla) <a href="https://twitter.com/Sheeeeepla/status/1554028833942441984?ref_src=twsrc%5Etfw">August 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
見た瞬間に思いついたC++のコードを書き殴ったので記録しておきます。

# コード
```c++
#include <iostream>
#include <random>
#include <string>

const std::string kmessage[] = {"ドド", "スコ"};
const std::string klove_message = "ラブ注入♡ ";
const int ktarget = 0b111011101110;

int main()
{
  std::random_device seed_gen;
  std::mt19937 engine(seed_gen());
  int consume = ktarget;

  while (consume) {
    int rand = engine() % 2;
    std::cout << kmessage[rand];
    consume = (consume % 2 == rand) ? consume / 2 : ktarget / (!rand + 1);
  }

  std::cout << klove_message << '\n';
  return 0;
}
```

# 解説
1.乱数生成器で0か1を生成
2.期待している数値であれば進める 期待した数値でなければリセット
3.klove_messageを出力して終了

乱数はメルセンヌツイスタを使用して生成します。詳しくは[こちら](https://cpprefjp.github.io/reference/random/mt19937.html)をご覧ください。

"ドド"を0に、"スコ"を１に対応させると011101110111が期待する数列です。判定のためにこの数列から一桁ずつ取り出したいので順番を逆にした111011101110を変数tkargetに格納しています。consumeはktargetで初期化した値です。これにより、変数consumeを2で割ったあまりと、生成された乱数を比較すれば、生成された乱数が期待している値なのかを判定できます。期待している値であればconsumeを2で割り、右シフトします。期待している値でなければconsumeをktargetでリセットします。(追記)ここで"スコ"が期待されている時に"ドド"で間違えた場合、"ドドスコスコスコ〜"ではなく"スコスコス〜"を期待すれば良いことになります。そのため、"スコ"を期待している時に"ドド"で間違えた場合は、consumeを ktarget/２ つまり、111011101110ではなく11101110111で初期化します(@fujitanozomu さんにご指摘いただきました。ありがとうございました))

# 具体例
1.乱数生成により0が生成される
2."ドド"を出力
3.111011101110を2で割ったあまり、つまり111011101110の1の位と生成された乱数を比較
4.期待している値であるため111011101110を2で割り11101110111を得る
5.乱数生成により1が生成される
6."スコ"を出力
7.11101110111を2で割ったあまり、つまり11101110111の1の位と生成された乱数を比較
8.期待している値であるため11101110111を2で割り1110111011を得る
9.乱数生成により0が生成される
6."ドド"を出力
7.1110111011を2で割ったあまり、つまり1110111011の1の位と生成された乱数を比較
8.期待している値ではないため"ドド"の次の"スコ"からやり直し

これを乱数が011101110111の順で生成されるまで、つまり"ドドスコスコスコドドスコスコスコドドスコスコスコ"が出力されるまで繰り返し、最後に"ラブ注入♡"を出力する。

# 最後に
元ツイートを見るとめちゃくちゃ短いコードで実現されている方もいるみたいなので真似したいです。
もっといいアルゴリズムあるよ！という方はぜひコメントで教えてください。
【Swift5】NavigationBarのBackボタンを画像にする

## NavigationBarの< Backボタンを画像にする
これを
![スクリーンショット 2022-08-03 23.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161345/5e585a22-6109-79cd-7836-c90c8cdcdcaf.png)
これにする
![スクリーンショット 2022-08-03 23.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161345/342a5062-ffd9-4a79-b6bf-3397c3415ada.png)

## コード
```swift: ViewController.swift
    private func setNaviBackButton() {
        let backImage = UIImage(named: "backIcon")?.withRenderingMode(.alwaysOriginal)
        navigationItem.leftBarButtonItem = UIBarButtonItem.init(image: backImage, style: .plain, target: self, action: #selector(tappedBackButton))
    }

    @objc func tappedBackButton() {
        self.navigationController?.popViewController(animated: true)
    }
```
Next.jsで作ったnext exportしたアプリをNginxで静的配信するための設定

## TL;DR

- `next export`は他のウェブフレームワークと違い、単一のhtmlではなく`pages`単位でhtmlを書き出す
- そのため、一般的なSPA向けのサーバー設定では、ブラウザの更新時に404が発生してしまう
- これを回避するには、`/`というパスへのリクエスト時に`/index.html`、`/hoge`なら`/hoge.html`を探しに行く設定がwebサーバーに必要。下記はNginxの設定例。

```
location / {
    root /hoge/fuga/html;
    index index.html;
    try_files $uri $uri.html $uri/ /404.html;
}
```

## はじめに

これまでは一番経験があり安定して開発できる技術としてVue2を使ってきたのですが、EoLも見えてきてそろそろ乗り換え…ということで、Next.jsを使い始めました。このとき静的にアプリケーションを配信するためのコマンド`next export`が、これまで触ってきたSPA（たとえばVue）の挙動と違い、そのためwebサーバーの設定で少し困ったので、メモしておきます。

## Vueのビルドと違うところ

Vueの場合index.htmlはひとつですが、`next export`は`pages`に配置されているコンポーネントの数だけhtmlが作成されます。SSG用のコマンドなので事前に全ページのHTMLを作成しておく、という思想なのでしょう。

たとえば

```
pages
├── _app.tsx
├── sample.tsx
└── index.tsx
```

こんな構造だと、`next export`の結果は

```
dist
├── 404.html
├── _next
├── sample.html
└── index.html
```

こんな感じになるはずです。

## 困ったこと

上記でも、ローカルで開発している限りは、特に困ることがありません。しかしこのビルド結果をVueだとかと同じ感覚でデプロイすると（＝単なるwebサーバーでの配信＋index.htmlへのフォールバック）、<b>ページリロード時に404となったり、トップページが表示されたりと、期待した挙動になりません。</b>

### 期待した挙動にならない理屈

1. CSRで`/sample`を表示しているとする
2. 更新すると、webサーバーは`sample`というファイルを探しに行く（が、存在しない）
3. 存在しないのでindex.htmlにフォールバックする（<b>が、ページが`/sample`としてレンダリングされない！</b>）

2まではVueのルーティングでも起こる問題ですが、3はNext.jsで発生する問題です。
Next.jsでは、`/sample`を更新する際は`/sample.html`を見に行かせる設定が必要となります。

## Nginxの設定

下記のように設定することで、`/hoge`というURLをリクエストして`/hoge`が存在しなければ、`/hoge.html`を探しに行かせることができます。また、`/`へのリクエストは`/index.html`に流す、という設定も必要です。下記が設定ファイルの例です（冒頭と同じ）。

```
location / {
    root /hoge/fuga/html;
    index index.html;
    try_files $uri $uri.html $uri/ /404.html;
}
```

## 終わりに

インターネッツを探しても、あんまり記事が見つからなかったのですが、next exportをNginxで運用…というのはあんまりやるべきじゃないのでしょうか？
それとももっと良い方法がある？webサーバー+CSRがもう流行っていない？CRAを使うべき？
知見のある方はコメント頂けるとうれしいです。。。
javaScript_基本データ型とコンストラクタ

```js
// undefined nullの違い
typeof undefined    // undefined
typeof null         // object
null === undefined  // false
null == undefined   // true

// javaScriptよく使うデータ型
typeof "John"                 // string
typeof 3.14                   // number
typeof NaN                    // number
typeof false                  // boolean
typeof [1,2,3,4]              // object
typeof {name:'John', age:34}  // object
typeof new Date()             // object
typeof function () {}         // function
typeof myCar                  // undefined 
typeof null                   // object

// コンストラクタconstructor
例：
<body>
 <p id="test"></p>
 <script>
  var pTest = document.getElementById("test");
  pTest.innerHTML = 
   "john".constructor + "<br>" +
    (3.14).constructor + "<br>" +
    false.constructor + "<br>" +
    [1,2,3,4].constructor + "<br>" +
    {name:'john', age:34}.constructor + "<br>" +
    new Date().constructor + "<br>" +
    function () {}.constructor;
 </script>
</body>

// 上記<p id="test"></p>内容
function String() { [native code] }
function Number() { [native code] }
function Boolean() { [native code] }
function Array() { [native code] }
function Object() { [native code] }
function Date() { [native code] }
function Function() { [native code] }
```
[GIMP]XCFファイルを一括保存する

# 概要
GIMPで `Python-fu` を使用した一括保存を行う

# 環境
* Windows 10
* GIMP 2.10.32
  * [公式ページ](https://www.gimp.org/) のexeでインストール
  * Microsoft Store は不使用

# 前提
GIMPでインポートしたファイルを全て `xcf` ファイルとして保存したい
* 画像を数百枚単位で保存するときが面倒になる
* 一括保存ができない
  * GIMPのインターフェースとしては、アクティブなファイルを一つ一つ保存する必要がある
  * 一括処理を行う `BIMP` にも `xcf` ファイルの保存がない

# 動機
* GIMPではjpegなどの画像ファイルを開くが、このままでは未保存のステータスになる
* 編集結果をそのまま保存したい場合は GIMP独自の `xcf` ファイルで保存する必要がある
* GIMPはクラッシュしがちなので、`xcf` ファイルでこまめに保存したい
* 保存結果は `BIMP` でjpegなど保存形式を指定して一括エクスポートできる
  * `xcf` ファイルとして保存しない場合、未保存の編集結果でエクスポートできない

# 作成したファイル

```python:save.py
#!/usr/bin/python

from gimpfu import *
import os

def plugin_main(timg, tdrawable):
    path = "C:\\path\\to"
    for img in gimp.image_list():
        # extract filename
        basename = os.path.basename(img.filename)
        name = os.path.splitext(basename)[0]
        # e.g. 0001.jpg -> 0001.xcf
        filepath = os.path.join(path, name + ".xcf")
        pdb.gimp_xcf_save(0, img, img.active_layer, filepath, filepath)

register(
        "python_fu_xcf",
        "Saves xcf files from active layer",
        "Saves xcf files from active layer",
        "pldb",
        "pldb",
        "2021",
        "<Image>/Image/saves xcf...",
        "RGB*, GRAY*",
        [],
        [],
        plugin_main)

main()

```
ベースとなるコードは下記サイトを参考にした

http://xn--u9j207iixgbigp2p.xn--tckwe/archives/3396

`plugin_main` 内が保存処理となる

コード中の `path = "C:\\path\\to"` の左辺は保存先となるので、存在するディレクトリに変更する

これを次のディレクトリに配置する
```
C:\Users\<ユーザー名>\AppData\Roaming\GIMP\2.10\plug-ins
```
`plug-ins` フォルダはインストール方法やバージョンによって相違する可能性がある

# 実行

まずは画像をインポートする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579184/a2f60dca-4760-6d2f-5234-ffee475f5e5a.png" width="600px">

\[画像(I)\]メニューに追加された `saves xcf...` を選択する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579184/d298406f-30bd-7348-35e2-0686eac9dd20.png" width="600px">

保存先のフォルダに `xcf` ファイルが存在することを確認する

![手順3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579184/6f4ed8a6-1643-d40f-62e2-41a18c0239b2.png)

この `xcf` ファイルをGIMPで開いて作業する
【Oracle】設定すべきインデックスと設定すべきではないインデックス

※まだ勉強し始めたばかりなので基礎的な内容になります。

# インデックスについて
パフォーマンスを改善したい！そんな時、何でもかんでもインデックスを設定すればよいわけではありません。
インデックスを設定すべき項目、設定すべきではない項目があるのでまとめます。
また、インデックスを設定していても働かないパターンがあるので併せて記載します。

前提としてレコード数は十分に多く、統計情報は更新されているものとします。

# インデックスを設定すべき項目
### カーディナリティの高い項目
カーディナリティはデータのばらつきを表す指標です。
これが高いほど一意性が高いことを表しており、インデックスが有効に働きます。


### 選択率の低い項目
選択率とはwhere句に使用した際に、どのくらいデータが絞られるかを表す指標です。
これが低いほど有効に働きます。

大体5~10%が目安になってくるようです。

### 結合条件としての使用頻度が高い項目
上記2条件を満たす使用頻度の高い項目にインデックスを張ると大きなパフォーマンス改善が見込めます。

### Json内項目
便利なJsonですが、SQLで使用するとなると大きなコストがかかるそうです。
Json内項目にインデックスを設定することでパフォーマンスの改善が見込めるようです。

※Json関してはそもそも使用しない方が良いと思っています。

# インデックスを設定すべきではない項目
### SQL実行時のパラメータによって選択率が変動する項目
パラメータAでは選択率が低く有効に働くものの、パラメータBではほとんど絞ることができない場合に逆にパフォーマンスを悪化させる可能性があります。

例えば日付項目(date)に、各レコードで十分にバラバラな日付が設定されていたとします。
これだけを聞くとインデックスを設定すべき項目だと思いますが、
where句で以下のような条件での使用頻度が高く、多くのデータがヒットしてしまう場合は設定すべきではないと思います。

```sql
select *
from test t
where t.date < :paramDate
```

### 更新が頻繁に行われる項目
検索のパフォーマンスは向上するかもしれませんが、更新時のパフォーマンス低下に繋がる
恐れがあります。


# そもそも効かないインデックス
### 中間一致、後方一致のlike検索
インデックスが効くのは前方一致のときです。

### 左辺での演算・関数
左辺はインデックスを使用する部分なので、基本的に右辺を使いましょう。
どうしても左辺で関数をする必要のある場合は、関数インデックスを使用しましょう。

### is null
nullにインデックスは適用できません。

### 否定
<>やnot in、not existsを使用するとインデックスが効かなくなります。

# おわりに
不要なインデックスは削除して整理しましょう。
複合インデックスについてはまたの機会に勉強してまとめます。

# 参考
[SQL実践入門──高速でわかりやすいクエリの書き方](https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-PRESS-plus/dp/4774173010/ref=asc_df_4774173010/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=10431550059102687882&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009050&hvtargid=pla-527639605151&psc=1&th=1&psc=1)
[JSONデータの索引](https://docs.oracle.com/cd/E96517_01/adjsn/indexes-for-json-data.html#GUID-8A1B098E-D4FE-436E-A715-D8B465655C0D)
[[Oracle Cloud] Oracle Database で JSON データに Index を設定する](https://qiita.com/sugimount/items/880207b250e95dcca951)
Raspberry Pi Zero WHのkernel panicを回避


```console:コンソール抜粋
Code: bad PC value

Kernel panic - not syncing : Fatal exception in interrupt
```

# Kernel panic

数年前に購入し今も使用しているRaspberry Pi Zero WHを別な目的に転用しようとして、新品のSDカードにOSを入れてRaspberry Pi Zeroを起動。問題なく普通に起動したが、ここからOSのアップデートを行なっている途中で「Kernel panic」で突然死。

SDカードの相性問題かと考え、別なSDカードにOSを入れ直して再度起動。OSのアップデートは無事にできたので<i>よしよし</i>と思っていたら、その先のpipでインストール中に再び「Kernel panic」発生。

またもSDカードの相性？と3枚目のSDカードで最初からやり直し・・・。三度「Kernel panic」発生。

さすがに、SDカードの相性問題では無いなと思い、`Kernel panic not syncing`でネットをググった。

SDカードが壊れている可能性があるから「fsck」でファイルシステムの修復を試みる。しかし、特にエラーは起きていない・・・。が、「Kernel panic」は発生する。

困った・・・

# bad PC value

「Kernel panic」の少し上に「bad PC value」とある。この**PC**とは`Program Counter`のことだろう。CPUかメモリが死んだのか？　これをキーワードにネットをググる。

すると、下記のURLがヒット。まさしくこのタイトル通りの現象だ。

https://forums.raspberrypi.com/viewtopic.php?t=297001

<i>『bootパーティションの config.txt でクロック速度を950に設定することで、この問題を修正しました。』</i>（Google翻訳）との投稿。


Raspberry Pi ZeroのCPUは1GHzだから、きっとこれを950MHzに落とすということだろうと、config.txtのコメントアウトされている`#arm_freq=800`を`arm_freq=950`に書き換えて再起動。

以降、「Kernel panic」は発生しなくなり元気に働いている。

上記のパラメタは、オーバクロックのためにあると思うが、アンダークロックで使うとは・・・。これに気付いた人はすごいな。どうもありがとう。

**以上**

# 追伸

この夏の猛暑で熱暴走した可能性がある。それなら、クロック数を落として発熱を下げる対策は納得できるが、その前にサーマルスロットリングが働くのでは？？
映像に文字を重ねるサイネージプログラム

### 式場のプロジェクター再生　静止画＆動画に　スクロール文字など表示　
2009-2010　ImageCastサイネージプログラムをVC#開発しました
![ImageCast v1.1056 ffdshow のおかげでgood.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/ec8a0097-0810-cc65-347d-86c922282819.jpeg)
キーボードレスのレストラン向け自動再生機能付きバージョンも製作しました
![ic_ver2.00'100701.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/b7e9e831-cdea-8985-e355-28d38d86f6cc.jpeg)
![ic_ver2.00'100627-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/cbc82e5e-f243-eec8-2dcd-286a369a8c09.jpeg)

##### 取扱説明
![ImageCast取扱説明書ｖ2.0806pdf_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/fb5e47fe-06be-d7fb-6f6a-6dd627ea45d3.jpeg)
![ImageCast取扱説明書ｖ2.0806pdf_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/e0a5dd5c-43d7-eaf1-8c0f-e078ac8a6991.jpeg)
![ImageCast取扱説明書ｖ2.0806pdf_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/ba3529fa-73f2-78c4-3c9c-fed8745f4103.jpeg)
![ImageCast取扱説明書ｖ2.0806pdf_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/d0a1a44a-88bc-9d4f-368e-06b86ace2de6.jpeg)
![ImageCast取扱説明書ｖ2.0806pdf_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/11d218ca-9983-7a9b-5474-a2725cfb31df.jpeg)


### 10年ぶりにVSで起動してみました。
![2022-08-03 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/b761a7c6-8e1e-cdd3-e727-4536b20d1f75.png)
いいからコメントを書け、話はそれからだ

巷では「コメントを書いた方が良い」「いや書かなくて良い」という話を見かけますが、コメントは書きましょうという話をします。

## まずはコメントを書く練習をしよう

良いコメントを書くためには当然コメントを沢山書く経験が必要です。通常のコードやテストコード、ドキュメントなどと同じです。
ところがあまりコメントを書いたことが無い人が「～ならコメントは要らない」という話をしているように見えます。
テストコードをほとんど書いたことが無い人が「～ならテストコードは要らない」と言っているのと同じで全く信用できません。
コメントは書きましょう。

次に、よく以下のようなコメントは意味が無いから書かなくて良いという話があります。
```java
list.add(user); // ユーザをリストに加える
```
実際、このようなコメントは無意味な場合が多いです。
しかしコード同様、初めてコメントを書く人のコメントの質が低いのは当然のことです。
気にせずどんどん書きましょう。次第に良いコメントが書けるようになります。

言い訳の一つにコメントとコードが一致しないことがあるからコメントは無い方がマシという話を見かけます。
レビューの無いチームで開発しているならそうかもしれませんが、普通はレビューで指摘されるでしょう。
見逃してしまった場合も、バグやtypo同様に気づいたときに直せばよいだけの話です。
また、コメントに限らず仕様書や設計、構成図もコードと乖離することがあります。
しかし乖離する可能性があるから仕様も構成図もありませんとするのは個人開発でない限りあり得ない態度ではないでしょうか。


## ドキュメントコメントは必ず書こう

> このリストに要素がない場合にtrueを返します。
[ArrayList#isEmpty](https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html#isEmpty--)

明らかに関数名で分かるし誤解のしようがない関数であっても、ドキュメントコメントは書くのが当然です。書きましょう。
公開ライブラリではないから不要と思うかもしれません。しかし各プログラマが要・不要を考えるくらいだったら全部書きましょう。「関数名から分かる」などと考え始めると次第にサボるようになります。

ドキュメントコメントを書こうとするとうまく説明することができず、結果として関数自体が複雑な事に気づくこともあります。

## コメントはやや過剰に書こう

コメントを書いていると「まあコード見ればわかるな」と感じることはよくあると思います。
しかし、今一番仕様に詳しい実装者のあなたが見ればわかるからと言って、初見のレビューアや次にコードを修正する人がすぐにわかるとは限りません。
「AをするためにはBというコードを書く必要がある」というところまで理解しているとまるでAというコメントは冗長に思えてきますが、
実際はその理解するまでの時間がかかります。他の人のその時間を減らしましょう。
dxf、dwgファイルのバージョンダウン

旧いバージョンのCADソフトを使っている事業所とやりとりしたので。

メモ帳などのテキストエディタで.dxfまたは.dwgを開く。
上のほうにAC1032やAC1027のような表記があります。ここがバージョン情報。
[AutoCAD の図面形式のバージョン コード](https://knowledge.autodesk.com/ja/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/drawing-version-codes-for-autocad.html)を参照して対応していそうなバージョンコードに書き換え。

よっぽど新機能を使っていない限り崩れずそのまま使える。
1998年相当のAC1014あたりから全角文字が化けるが、そこまで下げることはまずないはず。

図脳rapid15がAC1021まで対応。
OP-87564とFD-HCB2ピンアサイン比較

A-code 8Pin　メス(レセプタクル)
キーエンス製OP-87564とFD-HCB2は同じ嵌合だがピンアサインのみ異なる。
予備はOP-87564だけ、どうせならハーティング製72T17000099とかをもっとけばいい。ピンアサイン同じ。

対応表
| ピン | FD-HCB2 | OP-87564 | FD-Hのピン |
| ---- | ---- | ---- | ---- |
| 1 | 空き | 白 | |
| 2 | 空き | 黒 | |
| 3 | 黒 | 緑 | CH1 |
| 4 | 灰 | 黄 | CH3 |
| 5 | 茶 | 灰 | 24V |
| 6 | 白 | 桃 | CH2 |
| 7 | 青 | 青 | 0V |
| 8 | 桃 | 赤 | CH4 |
Next.js, typescript, chakra-ui のプロジェクトの作成の仕方

## まずはnextjs+typescriptのプロジェクトを作成

```
npx create-next-app@latest --ts
```

アプリ名を何にするか聞かれるので任意の名前を入力


## chakra-uiのインストール

```
npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6
```


## pages/_app.tsx を編集

```
import '../styles/globals.css'
import type { AppProps } from 'next/app'
import { ChakraProvider } from '@chakra-ui/react'    // 追加

function MyApp({ Component, pageProps }: AppProps) {
    return (
        <ChakraProvider>  // 追加
            <Component {...pageProps} />
        </ChakraProvider>  // 追加
    )
}

export default MyApp
```

ChakraProviderをimportして、 `<Component {...pageProps} />` を囲う。


一応これでNext.js+typescriptで、chakra-uiが適用されているはず。
Tkinterのスクロールバーを使用する方法

# 初めに
最近Tkinterのスクロールバーをよく使う機会があったので、メモ程度に残しておきます。
他に良い方法がありましたらご教授いただけると幸いです。


# 例：画像を複数表示しスクロールバーを使用する
```Python:show_img.py
from tkinter import *
from tkinter import ttk
import glob
from PIL import Image, ImageTk

class Application():
    def __init__(self) -> None:
        self.root = Tk()
        self.root.resizable(0, 0)
        self.root.title("Scrollbar")

        self.setup()

        self.root.mainloop()
    
    def setup(self):
        self.canvas = Canvas(self.root, bg="white", bd=0, highlightthickness=0, width=300, height=300) # Canvasの表示
        self.canvas.grid(row=0, column=0, padx=5, pady=5)

        self.frame = Frame(self.canvas, bg='white') # Canvas上に載せるFrameの指定
        self.canvas.create_window((0,0),window=self.frame,anchor=NW,width=self.canvas.cget('width'))
        
        self.vbar = ttk.Scrollbar(self.root,orient=VERTICAL) # スクロールバーの指定
        self.vbar.grid(row=0, column=1, sticky=N+S)
        self.vbar.config(command=self.canvas.yview)
        
        self.canvas.config(yscrollcommand=self.vbar.set)
        
        # ------------------- 画像の表示 -------------------
        self.imgs = []

        for index, file in enumerate(glob.glob('./img/*.png')): # ./imgフォルダ内のpngファイルを読み込む
            if index == 50:
                break
            img = Image.open(file)
            img = img.resize((300, int(img.height*300/img.width)))
            img_tk = ImageTk.PhotoImage(img)
            self.imgs.append(img_tk)

            canvas = Canvas(self.frame, bg="white", width=img.width, height=img.height)
            canvas.create_image(int(img.width/2), int(img.height/2), image=img_tk)
            canvas.grid(row=index, column=0, pady=2)

        # -------------------------------------------------
        
        self.frame.update() # Frameの高さを取得するため、Frameの状態をアップデートする

        self.canvas.config(scrollregion=(0,0,500,self.frame.winfo_height())) # self.frame.winfo_height() -> Frameの高さを取得する
        self.frame.bind_all("<MouseWheel>", self._on_mousewheel) # マウスのスクロールイベントを対応付ける
    
    def _on_mousewheel(self, event):
        self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")

if __name__=="__main__":
    Application()
```

例として、画像を複数表示するウィンドウを作成しました。

スクロールバーを使用する方法として、サイズを指定した**Canvas**上にサイズを指定しない**Frame**を載せて、その**Frame**に**widget**を載せ、そして**Frame**の高さを取得し**Canvas**にスクロールバーを対応づけるというものがあります。

# 最後に
なにか間違いなどありましたら、ぜひコメントをよろしくお願いいたします。
Google Meet のチャット欄を Slack に自動で流す拡張機能のご紹介

# はじめに
みなさん、Google Meet は使っていますか？ リモートワークが増えオンラインミーティングサービスを使用する頻度が多くなった人も多いと思います。

Google Meet はオンラインミーティングサービスの中でも有名ですが、ミーティングが終了するとチャット欄の内容が失われてしまいます。

最近のアップデートで、ミーティングを録画するとチャット欄の内容も記録されるようになりましたが、毎回録画するのはめんどうだと思います。

そこで今回は Google Meet のチャット欄を自動的に Slack に共有する Chrome 拡張機能 **[Cuckoo](https://github.com/noraworld/cuckoo)** を紹介します。



# インストール
[Cuckoo - Google Meet チャットメッセージ記録ツール](https://chrome.google.com/webstore/detail/jgkpnadfdhhglgkimejpibhfiniemhhf?hl=ja)



# 使いかた
使いかたは簡単です。以下の手順に沿って設定を行ってください。

1. [Chrome ウェブストアから Cuckoo をインストールします](https://chrome.google.com/webstore/detail/jgkpnadfdhhglgkimejpibhfiniemhhf?hl=ja)
2. 拡張機能のオプションページまたはポップアップメニューを開き、拡張機能を有効にします。
3. Slack のボットを作成し、トークンを生成します
    * ボットの作成方法は [ワークスペースで利用するボットの作成](https://slack.com/intl/ja-jp/help/articles/115005265703-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90) を参照してください
4. 生成したトークンをコピーし、先ほどの設定ページの該当欄にペーストします
5. Google Meet のチャット欄の共有先 Slack チャンネルを指定します
    * 先頭の `#` は不要です

これで動作するようになりました。[meet.google.com](https://meet.google.com) にアクセスして部屋を作るか、カレンダーの予定にある Google Meet のリンクからミーティングのページにアクセスすると、チャット欄のメッセージが Slack に共有されるようになります。



# オプション
[使いかた](#使いかた) の項で説明した設定は最低限必要なものです。他にもいろいろな設定があります。

* 通知機能
    * Slack のユーザ名を設定することにより、チャット欄のメッセージが Slack に投稿されるたびに通知を受け取ることができます
    * ミーティングで画面共有をしているときなどに、チャット欄のメッセージを確認するのに便利です
* Google Meet の URL を含める機能
    * あとから遅れてミーティングに参加する人が、Slack のメッセージからミーティングに参加することができます
* Google Meet のタイトルを含める機能
    * しばらく時間が経ってからミーティングのチャット欄を振り返る際に、ミーティングのタイトルが含まれていると検索しやすくなります
* 参加前に設定の変更をリマインドする機能
    * ミーティングごとに共有する Slack チャンネルを切り替えたい場合に、チャンネルの切替を忘れないようにすることができます

これらはオプションなので用途に併せてオン・オフを切り替えることができます。また、設定を切り替える際にページのリロードは不要です。設定を変更した瞬間からリアルタイムで反映されます。



# 注意点
* ミーティングのページにアクセスすると数秒後に自動的にチャット欄が開かれますが、そのチャット欄の上部が青く変わるまでは動作しません
* ミーティングのページに行く前の待機ページに長時間滞在してからミーティングのページにアクセスすると動作しないことがあります



# さいごに
この拡張機能は 2021 年 10 月に開催された社内のハッカソンで作ったもので、リリースも翌月ごろに行いましたが、社外ではどこにも紹介していなかったので今回紹介することにしました。

筆者自身もリリースしてから今もずっと会社で使用しています。ミーティングのテキストのログを残したいためだけに Google Meet の画面と Slack を両方同時に開いておく必要がないのでとても便利です。



# 関連リンク
* [Cuckoo - GitHub](https://github.com/noraworld/cuckoo)
* [Cuckoo - Google ウェブストア](https://chrome.google.com/webstore/detail/jgkpnadfdhhglgkimejpibhfiniemhhf?hl=ja)
SMCオートスイッチ形状

古い設備は有接点、赤ランプのみのオートスイッチが多いが場合によっては置き換える。

有接点:500～1000万回程度の動作で寿命。1000円くらい。リレー盤やマイコンでも動く。
無接点:機械的な寿命なし。2000円くらい。入力インピーダンスの都合でPLC入力向け。
よく動くノッカー等は無接点がいい。

赤緑2色ランプは400円くらいアップ。

|  形状 |  無接点|無接点2色 |有接点|有接点2色|
| ---- | ---- | ---- | ---- | ---- |
|φ4円溝横引出|D-M9B | D-M9BW |D-A93|
|φ4円溝縦引出|D-M9BV| D-M9BWV|D-A93V|
|6×5mm角溝|D-Y59B|D-Y7BW|D-Z73|
|M3-8mバンド|D-H7B|D-H7BW|D-C73||	BJ2-06～016 BM2-020～040
|M4-9.5mm	|D-K59|D-K59W|D-B54|D-B59W|		BA2-
|レール横引出|D-J79|D-J79W|D-A73H|
|レール縦引出|D-J79C|D-F7BWV|D-A73|D-A79W|		BQ-1(φ12～25) BQ-2(φ32～100)
|タイロッド|D-J59|D-J59W|D-A54|	D-A59W|

3線式はBの代わりにNになる。
|  形状 |  無接点 |
| ---- | ---- |
|φ4円溝横引出| D-M9NW |
|φ4円溝縦引出| D-M9NWV|
|6×5mm角溝|D-Y7NW|
|M3-8mバンド|D-H7NW|	BJ2-06～016 BM2-020～040
|M4-9.5mm	|D-G59W|		BA2-
|レール縦引出|D-F79W|		BQ-1(φ12～25) BQ-2(φ32～100)
|レール横引出|D-F7NWV|
|タイロッド|D-F59W|

末尾線長　無記号:0.5m M:1m L:3m Z:5m
PowerQueryとM言語(PowerQuery M)について

`PowerQuery`とエディタ上で利用するM言語(PowerQuery M)について調べた際にだいぶ混乱したのでまとめ。

## PowerQueryとはなんぞや

そもそも`PowerQuery`がなんなのか調べはじめると理解しづらい気がします。（検索するとPowerBIやExcelが色々と引っかかる）

自分なりに読み込んで要約すると、

`PowerQuery`はデータソースからデータを抽出、加工、接続を行う機能を提供する基盤。

検索結果に`PowerBI`や`Excel`が出てくるのは。

- `PowerBI`ではデータ操作を行う基盤として`PowerQuery`を使って動作している。
- `Excel`は`Excel 2016`からデータの抽出部分として`PowerQuery`が標準機能となっている。（それ以前はPowerQueryアドインとして提供されていた）

それぞれ`PowerBI`や`Excel 2016以降`で`PowerQuery`を利用する事ができます。

長年`Excel`をさわっている人は`Excel 2016以降`になってデータ取込が変わった？　という部分で少し意識していたかもしれません。

余談ですが以前の`Excel`でファイルをインポートするときに利用されていたインポートウィザードについては。 オプションでレガシデータインポートウィザードとして残っており。 このオプションを有効にすれば今現在も使えるようになりますが、基本わざわざ選択する用途はなさそう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/53044402-33a7-7aec-0f67-2d4a660e0ede.png)

## M言語(PowerQuery M)とはなんぞや

`PowerQuery`で調べていると`M言語`というキーワードが目につきます。

検索するとJIS規格にもなっているMUMPS(Massachusetts general hospital Utility Multi-Programming System)という言語がひっかかったりしますがこれは関係ない。

[wikipedia - MUMPS](https://ja.wikipedia.org/wiki/MUMPS)をみると1960年代末にアメリカのマサチューセッツ総合病院で医療情報処理用のアプリケーションを開発し実行するために開発された、プログラミング言語とその環境である。とか書いてありますが関係なし。

`PowerQuery M`はもともとは`PowerQuery`とは関係ないプラットフォームのデータモデリング言語の言語コードネームだったらしい。

歴史的経緯や紆余曲折やらいろいろあって今現在は`PowerQuery M`として存在しているらしい。
(Microsoft “OSLO”プラットフォームのデータモデリング言語でMというコードネームで登場したのが初出のようです）

`PowerQuery M`は`Power Query Formula Language`とも呼ばれてたりして、歴的な経緯からなのかいろいろな呼ばれ方があり理解しにくい気がします。

ともかく`PowerQuery`のエディタで、詳細ビューにかかれている式が`M言語`のようです。

`PowerQuery`やら`PowerBI`は便利ですが、最初ここらへん調べ始めると混乱するのがツライ。

そんな`M言語`ですが、基本的にはPowerQueryエディターでGUIを操作する事で、裏でその操作がM言語で記述されていくため、ちょっと込み入った事をPowerQueryでやりたいときには触れる必要がでてくるかと思います。

## ドキュメント

ここまで色々と記載してみましたが。2022年現在は`MS Docs`にM言語のドキュメント・リファレンスがあります。

- [Power Query のドキュメント](https://docs.microsoft.com/ja-jp/power-query/)

- [Power Query M 言語仕様](https://docs.microsoft.com/ja-jp/powerquery-m/power-query-m-language-specification)

PowerQUery、M言語を知るにはここを参照するのがわかりやすいです。

## 総評

`PowerQuery`はすごい便利ですが、最初のとっかりとして検索するとちょっと混乱するといった感じが自分はあったのでまとめてみました。
【PHP初級㊴】配列応用5～複数変数のループ～

[問題]　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)

{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、最初は参照する要素番号を0とする。この参照する要素番号の配列要素の値から次の要素番号の配列要素の値を引いた値を表示し、参照する要素番号を1増やす。この手順を9回繰り返すプログラムを作成せよ。


# コード
```php
$a = [3,7,0,8,4,1,9,6,5,2];
for($i = 1,$k = 0; $i <= 9; $i++,$k++){
    echo $a[$k]-$a[$k+1],PHP_EOL;
}
```


# 結果
```
-4
7
-8
4
3
-8
3
1
3
```

★問題㊳と同様に、複数の変数を変化させるfor文を用いる。
GAS (Google Apps Script) でスタンドアロンなライブラリを作るメモ

## はじめに

GAS (Google Apps Script) でライブラリをデプロイしたときの手順をメモします。

## 参考サイト

https://developers.google.com/apps-script/guides/standalone

https://qiita.com/shikumiya_hata/items/0aed6d0c67ee365d9161

https://admin-it.xyz/gas/library-use-ownlibrary-attentions/

## 作業

### Google Drive での操作

Google Drive から Google Apps Script のプロジェクトを作成する。

<a href="https://gyazo.com/bbcdccef2b6a582aaae275f767a8fdea"><img src="https://i.gyazo.com/bbcdccef2b6a582aaae275f767a8fdea.png" alt="Image from Gyazo" width="803"/></a>

### Apps Script での操作

#### コードを変更する

今回はシンプルにログを出力するだけのコードにします。

```js
function myFunction() {
  console.log('myFunction');
}
```

#### デプロイする

<a href="https://gyazo.com/c5f8654f9420b5d009e193cfae5ccf85"><img src="https://i.gyazo.com/c5f8654f9420b5d009e193cfae5ccf85.png" alt="Image from Gyazo" width="1905"/></a>

<a href="https://gyazo.com/c6ceacaae84caf7bfc7f1dfe9f76098a"><img src="https://i.gyazo.com/c6ceacaae84caf7bfc7f1dfe9f76098a.png" alt="Image from Gyazo" width="1904"/></a>

<a href="https://gyazo.com/622835cbeb1ac87abd339b79db20777f"><img src="https://i.gyazo.com/622835cbeb1ac87abd339b79db20777f.png" alt="Image from Gyazo" width="1905"/></a>

<a href="https://gyazo.com/e2d545d922b2122d28b83ecc19caecf7"><img src="https://i.gyazo.com/e2d545d922b2122d28b83ecc19caecf7.png" alt="Image from Gyazo" width="1902"/></a>

デプロイできた。

#### プロジェクトを公開する

<a href="https://gyazo.com/11f988258e0a08acc6e533a40cb557f9"><img src="https://i.gyazo.com/11f988258e0a08acc6e533a40cb557f9.png" alt="Image from Gyazo" width="1903"/></a>

#### スクリプトIDを公開する

GitHub の README.md に記載する。

<a href="https://gyazo.com/c4f1a5bc80ddc888e2878dc44961430e"><img src="https://i.gyazo.com/c4f1a5bc80ddc888e2878dc44961430e.png" alt="Image from Gyazo" width="1903"/></a>

## おわりに

GAS でスタンドアローンなライブラリを作成しました。

ライブラリを利用する際は、スクリプト ID で検索するようです。
また別記事に記載します。
GitHub備忘録[初心編]

# はじめに
　明日野郎は馬鹿野郎とはよく言ったもので、GitHubはエンジニアになるんだったら触れた方がいいと言われても、明日やれば明日やればと引きずってきて何十年(嘘)、ついにGitHubに触ってみようとするとなんとエラーの連続で心が折れそう。
　そんなわけでこの記事では最初のpushまでに必要なコマンド群を紹介します。
　また、この記事は2022年/08月/03日に作られていることに注意してください。
　GitHubには過去、pushのためのセキュリティプロトコルが変更された事例があり、今後あるかは知らないけど注意した方がいいと思います。謎のエラーが出たらこの記事は間違っていると考えてください。

# コマンド

```
git init
git add -A
git commit -m "first commit"
git remote add origin 自分のGitHubのリポジトリURL
git branch -M main
git push -u origin main
```

　最後にpushをして、その時にusernameとpasswordを要求されます。
　usernameの方は自身のGitHub URLの中にも書いてあるので分かるとは思いますが、passwordの方はどうやら昔とは違うようなので要注意です。

https://github.com/settings/tokens

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/5ec71bc3-18ef-c0aa-3e33-3d54ad0710ba.png)

　Generate new tokenのボタンがあると思うのでそこからトークンを作成し、表示されたパスワードをpushに要求されたpasswordに入力してください。
import と from

importとfrom
```
import <module>
from <module> import <method or 変数 or classobj>
```

class内の変数について
class変数とインスタンス変数がある。

他
インスタンス化しても、しなくても、クラス内のメソッドは使える。
インスタンス名.メソッド(引数)
クラス名.メソッド(引数)
【PHP初級㊳】配列応用4～複数変数のループ～

[問題]　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)

{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、最初は参照する要素番号を0とし、この参照する要素番号の配列要素の値を表示し、次にその配列要素の値を次の参照する要素番号とし、この次の参照する要素番号の配列要素の値を表示し、さらにその配列要素の値を次の参照する要素番号とし、……を10回繰り返すプログラムを作成せよ。

# コード
```php
$a = [3,7,0,8,4,1,9,6,5,2];
for($i = 1,$k = 0; $i <= 10; $i++,$k = $a[$k]){
   echo $a[$k],PHP_EOL;
}
```


# 結果
```
3
8
5
1
7
6
9
2
0
3
```

★複数の変数を変化させるfor文を用いる。
has_oneで追加される関連メソッド

## はじめに
ポートフォリオ作成中、has_one(1対1)の関連付けが必要になりました。
公式ドキュメントなど読んで、「これは頻繁に使いそうだな」と思ったメソッドを紹介します。

## サンプルモデル
ユーザー(User)がプロフィール(Profile)を作成できると考えます。

```rb:app/models/user.rb
class User < ApplicationRecord
  has_one :profile
end
```

```rb:app/models/profile.rb
class Profile < ApplicationRecord
  belongs_to :user
end
```

## 関連メソッド

```rb
#関連付けされたオブジェクトを返す
@user.profile

#関連付けされた新しいオブジェクトを返す
@user.build_profile(self_introduction: "I am a beginner")

#関連付けされたオブジェクトを作成する
@user.create_profile(self_introduction: "I am a beginner")
```

### あとがき
今回紹介したメソッドが全てではありません。また、has_manyで追加される関連メソッドと似ている部分があるのでご注意を。

### 参考
Active Record の関連付け
https://railsguides.jp/association_basics.html#has-one%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89
Cordovaでクロスプラットフォームのアプリ開発をする①

主にWindowsの小型ノートPCを使用して、隙間時間で
クロスプラットフォームアプリケーションを開発するためのメモ（備忘録）

### 【前提条件】
- 開発環境はWindows10(11)
- Androidアプリを中心にiOSアプリも配布予定

### 【アプリの条件】
- オフラインで使用できること
- ユーザーの情報を保存できること（ローカルかサーバーかは要検討）
- iOSでも配布可能であること
- 開発原資を得る為に、最低限の課金要素（出来れば、広告でユーザーからは徴収しない）
- バージョンアップしてもデータは継続されること

### 【作りたいもの】
1. マンホールカードコレクション用アプリ
1. 御城印コレクション用アプリ
1. ビックリマンコレクション用アプリ

### 【環境構築（Windows）】
https://qiita.com/yama-take/items/8c6434efbcd4bece6310
基本情報（汎用コンピュータにおけるファイル）

汎用コンピュータと言われても何かわかりませんでしたが、昔主流だった、集中管理型の大型コンピュータシステムのことを指しているようです。
![220px-IBM_System_Z9_(type_2094_inside).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/48aee533-2afc-bde9-4021-821cf79ec92e.jpeg)
メインフレームとも呼ばれています。

汎用コンピュータにおけるファイルは、一連のデータをまとめたもので、**レコード**の集合が**ファイル**となります。
データベースではなくてファイルという概念のようです。

## ファイルへのアクセス方法

![スクリーンショット 2022-08-03 15.31.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/11625e19-09fc-a52e-99fb-4124545a66f0.png)
まず上記がファイルとなります。

その中で 200000 太郎　営業　埼玉という一個の行がレコードです。

### 順次アクセス
200000、200001のように先頭レコードから順番にアクセスしていくことを順次アクセスといいます。シーケンシャルアクセスとも呼ばれます。

### 直接アクセス
任意のレコードに直接アクセスする方法です。例えば200001のレコードを直接指定します。

### 動的アクセス
順次アクセスと直接アクセスを組み合わせた方法で、任意のレコードに直接アクセスした後、それ以降は順次アクセスで順番に処理します。例えば200001のレコードにアクセスした後は順番に200002、200003のような動きになります。

## 順編成ファイル
頭から順番にレコードを記録していく順編成ファイル。最も単純な編成法で順次アクセスのみが可能です。先頭から詰め込んでいくので、記憶領域に無駄がない。一連のデータを大量に処理する用途に向く特徴があります。

## 直接編成ファイル
レコードの中のキーとなる値を利用することで、任意のレコードを指定したアクセス。つまり直接アクセスを可能とする編成法が、直接編成ファイルです。
**直接アドレス方式**と**間接アドレス方式**があり、それぞれキー値から格納アドレスを求める方法が異なります。
※キー値というのはそのファイルの中で重複しない一意となる値です。

### 直接アドレス方式
```
01 田中　営業　→　01 田中　営業
02 山本　開発　→　02 山本　開発
03 田代　経理　→　03 田代　経理
```
キー値の内容がそのまま格納されるアドレスを示します。

### 間接アドレス方式
**ハッシュ関数**という計算式により、キー値から格納アドレスを算出して用いる方式です。

```
1101 田中　→ 07 1301 山本
1201 田代　→ 08 1101 田中
1301 山本　→ 09 1201 田代
```
ハッシュ関数による計算の結果が重複することで、異なるレコードが同じアドレスで衝突してしまう場合があります。
これを**シノニム**と言います。シノニムが発生すると、求めた値を別の式で再計算して違う場所に納めないといけないので多発するほどアクセス速度が落ちることになります。

## 索引編成ファイル
索引を格納する**索引域**と、レコードを格納する**基本データ域**、そこから溢れたレコードを格納する**あふれ域**という3つの領域から構成され、索引による直接アクセスと、先頭からの順次アクセスの両方の特性を備える編成法です。

```
索引データ(索引域)

1101 田中
1201 田代
1301 山本
.....（基本データ域）

あふれたレコード（あふれ域）
```

## 区分編成ファイル
**メンバ**と呼ばれる順編成ファイルを複数持ち、それらを格納する**メンバ域**と、各メンバへのアドレスを管理する**ディレクトリ域**とで構成される編成法です。
この編成法は、主にプログラムやライブラリを保存する用途に使われています。

```
メンバA アドレス　メンバB アドレス　メンバC アドレス　（ディレクトリ域）

メンバA メンバB メンバC　　（メンバ域）
...    ...    ...
...    ...    ...
...    ...    ...
```

## まとめ
汎用コンピュターたとRDBは違うのを理解しました。
DoCoMoと020の携帯電話の契約ができなかった。

DoCoMoのホームルータの契約にあたり、携帯電話番号の指定をされる意味がわからんと思って記事にしてみました。

# ユニバーサル料
ユニバーサル料とは、110番,119番の電話代金等を使用者から等しく請求する料金である。
この中には、公衆電話代金も含まれている。
なので、先月のauの大規模障害以降、電話ができなくなる自体になってしまったときのために
障害発生時には公衆電話の解放という議論になり、結局のところ解放されるらしい情報は聞いている。
そんなユニバーサル料なんだが、料金の対象に含まれる番号と含まれない番号の2つの番号が存在する。（携帯電話において）

# ユニバーサル料が取られてしまう携帯電話番号
070,080,090に関してはユニバーサル料が強制徴収されてしまう。
ただ、povoにおいては、ユニバーサル料をau側が負担する場合がある。（請求料金0円の場合）

# ユニバーサル料が取られない携帯電話番号
020-0(M2M)等に関してはユニバーサル料がとれない回線になっている。
最近では、格安SIMのデータ通信専用(SMS不可)の回線へ割り振られている場合がある。（携帯電話番号枯渇のため）
なので、こちらの電話番号にて契約をし、ユニバーサル料が取られない契約を。結びたかった。

# DoCoMoで買った商品
携帯電話の契約と同時に、HR-01という機種を契約している、
ホームルータであり、明らかに電話はできない、
しかし、なぜか、080の電話番号が付番されている。
家電量販店の店員レベルの回答では拉致が明かないと、
DoCoMo本体のお客様センターにクレームとして上記の内容を提起したのにもかかわらず、
解答としては、下4桁のみ指定ができる。としか解答しない。はっきりいって、そういうお門違いのお話をしているわけではない。
君は僕が取られているユニバーサル料を支払うのかねといいたい。
まあ、別に取られているユニバーサル料なんて月2円でしかないから払えと言われれば払いますよ。
だけど、払わなくていいものを払わされているのには意味がわからないといいたい。

# 総務省へも問題提起
総務省へも上記の内容に関して調査するように問題提起したわけだが、意見としてでしか受け入れない。
DoCoMo側としても何らかの事情があるのでしょうとしかいわれない。
DoCoMoの事情だけを聞いていたら、過去のように代理店が変なことしますっていいたい。
Jenkins 用語の｢マスター / スレーブ｣は｢コントローラー / エージェント｣になった

｢マスター｣｢スレーブ｣といったプログラミング用語の置き換えに関して、Jenkins での用語の変化について調べた。

チーム内や社内での用語統一をしたい。

# 用語の定義と変化

記事下に参考資料載せています。文でざっくりまとめると以下です。

Jenkins をインストールしているサーバは master と呼ばれていたが、今のドキュメントでは Jenkins controller か単に Jenkins と記載されるようになっている。

Jenkins のビルドマシンは slave と呼ばれていたが、agent に改名された。マシン単位としては node も使われる。

# まとめ

- Jenkins サーバ
  - マスター => コントローラー
- ビルドマシン
  - スレーブ => エージェント（「ノード」）

## 余談

社内では「スレーブ」=>「エージェント」は浸透している気がするが、「マスター」=>「コントローラー」は浸透していない。
自分も「コントローラー」は覚えにくくて困っている。

# 参考資料

## 攻撃的な用語についてのブログ記事

https://www.jenkins.io/blog/2020/06/18/terminology-update/

- slave は agent に変えた。
- Master, Black List, White List はまだ git 用語として使われている。
- これからも攻撃的な用語排除していく。

## 参考ドキュメント

用語の定義のようなページがないか探したが見つからなかったのでドキュメントの一部を抜き出します。
ほかに適切そうなページがあれば教えてほしいです。

https://www.jenkins.io/doc/book/using/using-agents/

> The Jenkins controller is the original node in the Jenkins installation. The Jenkins controller administers the Jenkins agents and orchestrates their work, including scheduling jobs on agents and monitoring agents. Agents may be connected to the Jenkins controller using either local or cloud computers.

機械翻訳 / DeepL

> Jenkinsコントローラは、Jenkinsのインストールにおけるオリジナルのノードです。Jenkinsコントローラは、Jenkinsエージェントを管理し、エージェント上のジョブのスケジューリングやエージェントの監視など、エージェントの作業をオーケストレーションします。エージェントは、ローカルまたはクラウドコンピュータのいずれかを使用してJenkinsコントローラに接続することができます。

Jenkins サーバはコントローラ、ビルドマシンはエージェントと記載されている。


# 追記

ページ追加

https://www.jenkins.io/doc/book/managing/built-in-node-migration/

> As part of the terminology cleanup effort, the built-in node was renamed from "master node" to "built-in node" in Jenkins 2.307 and in Jenkins 2.319.1.