OmniAICreator/Qiita-1.07M huggingface dataset:
ICOSへの通信に使われている暗号スイートの確認

# やりたいこと
クライアントPCからIBM Cloud Object Storage(以下ICOS)への接続に使われている暗号スイートを確認してみます。
# 背景
IBM Cloudで、1月にICOSへの接続に使われる暗号方式のうち以下の暗号方式を削除するという通知がありました。
```
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
```
```
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256  
```

そこで、クライアントが以下のGCM暗号でICOSに接続できることを確認する必要があります。
```
 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
 ```
 ```
 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
 ```

 記事執筆時点(2025/2/14)ではまだCBC暗号が使用可能になっているように見られました。まだCBC暗号を使って接続している可能性がないかご確認いただくことをお勧めします。
 
# ICOSへの通信に使える暗号スイートの一覧を調べる
nmapコマンドで、ICOSの東京リージョンのエンドポイントに接続する際に利用できる暗号スイートを確認します。

:::note info
Nmap(Network Mapper)とはオープンソースのネットワーク調査ツールのソフトウェアです。ポートスキャン機能やバージョンの検出機能、サービスおよびそのバージョンの検出機能など、多くの機能を兼ね備えています。
:::


(ICOS エンドポイント情報：https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-endpoints)
```
nmap --script ssl-enum-ciphers -p 443 s3.jp-tok.cloud-object-storage.appdomain.cloud
```
以下、実行結果です。
![スクリーンショット 2025-01-29 11.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/350859b6-b5b2-124d-1858-1faa080d5026.png)
6つの暗号スイートを利用できることがわかります。



# クライアントPCから通信する際に使える暗号スイートの一覧
続いて、クライアントPCからの通信について確認します。
クライアントPCにインストールされている、暗号ライブラリのOpenSSLで使用可能な暗号スイートの一覧を以下のコマンドで調べます。
```
openssl ciphers -v
```
以下、実行結果です。
![スクリーンショット 2025-01-29 11.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/2f6bd8ab-60d5-e822-d516-e49707c671a6.png)
私のPCが使用できる暗号スイートの一覧が出てきました。

# クライアントPCから通信しているICOSに対してどの暗号スイートが使われているのか、優先順位を確認
https://www.ssllabs.com/ssltest/index.html
こちらは、SSLで通信しているWebサーバーの分析ができるツールです。
調べたい通信先のホスト名を入れて分析を開始します。
![スクリーンショット 2025-02-14 10.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/6bd7d1d1-8c7a-425c-bce2-a18acb8a0a23.png)

2,3分くらいで分析が完了しました。
"Configuration"のうち"Cipher Suite"の欄にスクロールします。
"suites in server-preferred order"とあるように、私のPCからICOSへの通信に使われる暗号スイートが、優先順位の高い順に表示されます。

![スクリーンショット 2025-02-14 10.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/7e8bfd6e-f3b6-49dd-8504-614095b87b5a.png)
入力規則を設定しているセルに、ダブルクリックで指定した値を挿入するマクロ

作業をする際に、`時間`や`名前`、`チャックマークなど`入力することがちょこちょこありまして、マウスで対象セルを`ダブルクリックするだけ`で、値を入力したり、消したりしたいなーという思いで、作り始めました。

作りとしては、
ダブルクリックしたセルに入力規則が設定されている確認して、なければ何もせず。
入力規則が設定されている場合は、`Validation.Type`つまり`入力規則の種類`でIF分岐させる作りです。

`Validation.Type` を `xlValidateCustom`にしてかつ、`Target.Cells(1, 1).Validation.Formula1 = "任意の値"`でカスタム値の値を取得して、IF分岐させれば、理論上なんでも好きなようにできちゃいます。

ひとまず、入力規則を時刻に設定しているパターンで、時刻を挿入したり、消したりするマクロを下記に書き記しておきます。

```vb
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    '=================================================================================================================
    '①入力規則が設定されているか調べる機能
    Dim t As Long
    t = 0
    On Error Resume Next
    t = Selection.Item(1).Validation.Type
    On Error GoTo 0
    Debug.Print t
    If t > 0 Then '入力規則が設定されているときのみ、下記のマクロ実行
    '=================================================================================================================
        If Target.Cells(1, 1).Validation.Type = xlValidateTime Then  '②-① 入力規則が「時刻」である場合
             '【セルの値が空欄の時は現在時刻を代入し、それ以外の場合は値削除する】
            If Target.Cells(1, 1) = "" Then
                Target.Value = Now
            Else
                Target.ClearContents
            End If
    '=================================================================================================================
        Else  '②-END 入力規則が設定されているが条件に一致しなかった場合
            ' 何もしない
        End If
    End If
End Sub
```
3rd,円周率を「米粒を敷き詰めて計算」する方法【C言語】

前回の記事↓

https://qiita.com/bezonata/items/6097249095e2355bf25e


<h3>正方形を敷き詰めるやり方。
</h3>
このやり方では正解より必ず小さな値に成る。

```pai.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void now(void)
{
	time_t t = time(NULL);
	struct tm *local = localtime(&t);
/*
	printf("%04d/", local->tm_year + 1900);
	printf("%02d/", local->tm_mon + 1);
	printf("%02d", local->tm_mday);

	printf(" ");
*/
	printf("%02d:", local->tm_hour);
	printf("%02d:", local->tm_min);
	printf("%02d\n", local->tm_sec);
	fflush(stdout);
}

int main(int argc,char *argv[])
{
			double  n=1000.0f ;

	if(argc > 1 )
	{
		n=atof( argv[1] ) ;		
	}
    double x,y,xx,yy;
	long long i;

	now();
	//--- --- --- ---
		do{
				double hen = 2.0f / n ;
				double henf = hen / 2.0f ;
				double sum = hen * hen ; // 面積
				double len = 0.0f;
				for(x=henf ; x <= 1.0f -henf ; x+= hen)
				{
						xx = x + henf ;
						xx *= xx ;
						for(y=henf ; y <= 1.0f-henf ;y+=hen)
						{
								yy = y + henf ;
								yy *= yy ;
								if(xx + yy <= 1.0f) len += 1.0f ;
						}
				}
				printf("%1.15f log10(%.3f)分割 ",4.0f * len * sum ,log10(n));
				now();
				n *= 1.03f;
		}while(1);
	return 0;
}
```

---

```出力結果.
3.141512401600000 log10(5.000)分割 11:54:09
3.141514585306505 log10(5.013)分割 11:54:22
3.141516901724735 log10(5.026)分割 11:54:35
3.141519624956707 log10(5.039)分割 11:54:50
3.141521733419711 log10(5.051)分割 11:55:07
3.141523616809169 log10(5.064)分割 11:55:23
3.141525718581799 log10(5.077)分割 11:55:40
3.141527528977863 log10(5.090)分割 11:55:59
3.141529637102726 log10(5.103)分割 11:56:18
3.141531361794161 log10(5.116)分割 11:56:39
3.141532997960393 log10(5.128)分割 11:57:02
3.141534862594533 log10(5.141)分割 11:57:25
```
【Linux入門】ファイルのパーミッションの設定

## 基本トピック
### 所有者
ファイルやディレクトリを作成すると作成したユーザがその所有者に設定されます。所有者は下記のような`ls -l`を実行した結果から確認することができます。

```
-rw-rw-r-- 1 所有者 所有グループ  ファイルサイズ  作成日時 sample1.sh
-rw-rw-r-- 1 所有者 所有グループ ファイルサイズ  作成日時 sample2.sh
```


### アクセス権
ファイルやディレクトリにはアクセス権(パーミッション)が設定されます。パーミッション(permission)はどのユーザに対しどのような操作を許可するのかについて設定します。
実務でよく使うPyTorchの機能まとめ⑤｜torch.nn.functional.one_hot

## torch.nn.functional.one_hot
### 基本的な使い方
`torch.nn.functional.one_hot`を用いることでラベルから1-hotベクトルを作成することができます。`torch.nn.functional.one_hot`はたとえば下記のように用いることができます。

```python
import torch
import torch.nn.functional as F

x1 = torch.arange(0, 6)
x2 = torch.arange(0, 6) % 3
x2_one-hot = F.one_hot(x2)

print(x1)
print(x2)
print(x2_one-hot)
```

・実行結果
```
tensor([0, 1, 2, 3, 4, 5])
tensor([0, 1, 2, 0, 1, 2])
tensor([[1, 0, 0],
        [0, 1, 0],
        [0, 0, 1],
        [1, 0, 0],
        [0, 1, 0],
        [0, 0, 1]])
```


### num_classes
DeepLearningの`DataLoader`を用いてバッチを生成する場合など、バッチ単位で`one_hot`の挙動が変わる場合があります。このような際に用いると良いのが`num_classes`です。

```python
import torch
import torch.nn.functional as F

print(F.one_hot(torch.arange(0, 6) % 3, num_classes=5))
print(F.one_hot(torch.arange(0, 6)))
print(F.one_hot(torch.arange(0, 6), num_classes=10))
```

・実行結果
```
tensor([[1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0],
        [1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0]])
tensor([[1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 1]])
tensor([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]])
```

上記の実行例はどれも「`one_hot`関数に与える第一引数の最大値+1」以上の値を`num_classes`に与えていることに注意しておくと良いです。たとえば下記のようなコードはエラーになります。

```python
print(F.one_hot(torch.arange(1, 6), num_classes=5))
```

```
    print(F.one_hot(torch.arange(1, 6), num_classes=5))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Class values must be smaller than num_classes.
```


### 要素の型
`one_hot`関数の引数に与えるテンソルのそれぞれの要素は`float`型ではなく`int`型である必要があります。たとえば下記のように要素が`float`型であるテンソルを引数に与えるとエラーが出力されます。

```python
import torch
import torch.nn.functional as F

x = torch.arange(0., 6.)

print(x.dtype)
print(F.one_hot(x))
```

・実行結果
```
torch.float32

...

    print(F.one_hot(x))
          ^^^^^^^^^^^^
RuntimeError: one_hot is only applicable to index tensor of type LongTensor.
```

上記のようなエラーが出る場合は下記のように`long()`メソッドを用いることで`one_hot`関数を実行できるようになります。

```python
import torch
import torch.nn.functional as F

x = torch.arange(0., 6.)

print(x.dtype)
x = x.long()
print(x.dtype)
print(F.one_hot(x))
print(F.one_hot(x).dtype)
```

・実行結果
```
torch.float32
torch.int64
tensor([[1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 1]])
torch.int64
```
Azure のアクショングループに紐づいているメトリクスアラートを列挙する

Azure のアクショングループが無邪気にたくさん作られてしまっていて整理したいのだが、Azure Portal の UI からは「このアクショングループがどこで使われているか」を見ることができない。

そういうときは Azure Resource Graph Explorer から KQL クエリを実行することで紐づいているリソースを列挙することができる。

``` kql
resources
| where type =~ 'microsoft.insights/actiongroups'
| project actionGroupId = tolower(id), actionGroupName = name
| join kind=leftouter (
    resources
    | where type =~ 'microsoft.insights/metricalerts'
    | mv-expand properties['actions']
    | project actionGroupId = tolower(tostring(properties_actions['actionGroupId'])), metricAlertId = id, metricAlertName = name
) on actionGroupId
| project actionGroupId, actionGroupName, metricAlertId, metricAlertName
```

上記例ではアクショングループに紐づいているメトリクスアラート一覧を列挙したが、メトリクスアラート以外でアクショングループが使用されている場合は表示されないので注意されたい。
【Rails】コールバック

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在 Railsチュートリアルを使用して勉強していますが、そこでコールバックを学びました。
本記事ではコールバックについてまとめました。

## コールバックとは何か？
コールバックは、モデルの状態が変化するタイミング（保存、更新、削除など）に特定の処理を自動的に実行する仕組みです。Railsでは、以下のようなイベントに対応するコールバックが用意されています。
* **before_validation / after_validation**
バリデーションの前後に処理を実行

* **before_save / after_save**
オブジェクトの保存前後に処理を実行

* **before_create / after_create**
新規作成時の前後に処理を実行

* **before_update / after_update**
更新時の前後に処理を実行

* **before_destroy / after_destroy**
削除時の前後に処理を実行

これらのコールバックを適切に利用することで、共通の処理（例：データの整形、ログの記録、関連レコードの操作など）を一元化し、コードの再利用性や一貫性を高めることができます。

## コールバックの実装例
以下の例は、ユーザーのメールアドレスを保存する前に小文字に変換する処理を実装したものです。

```ruby
class User < ApplicationRecord
  before_save { self.email = email.downcase }
  
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
end
```

## コールバックを使うメリット
### 一貫性の確保
コールバックを利用することで、データベースに保存される前に必ず実行される処理を定義でき、入力データの一貫性を保つことができます。

### コードの再利用
共通の前処理や後処理をモデル内に集約することで、同じ処理を複数箇所で記述する必要がなくなり、メンテナンス性が向上します。

### 自動化による効率化
モデルのライフサイクルに沿って自動的に処理を実行できるため、開発者はビジネスロジックに集中できる環境が整います。

## コールバックを使用する上での注意点
### 過度な依存を避ける
コールバックは強力な反面、過度に複雑なロジックを隠蔽してしまう危険性があります。処理が複雑になりすぎると、デバッグやテストが困難になり、コードの可読性が低下する可能性があるため、責務を明確に分割することが重要です。

### テストの重要性
コールバックによって実際のデータが変更されるため、テストコードで意図した動作が正しく実行されているかを確認する必要があります。例えば、保存後に値が変化しているかを確認する際には、reloadを利用してデータベースの最新状態を取得することが推奨されます。
```ruby
test 'email addresses should be saved as lowercase' do
  mixed_case_email = 'Foo@ExAMPle.CoM'
  @user.email = mixed_case_email
  @user.save
  assert_equal mixed_case_email.downcase, @user.reload.email
end
```

## まとめ
Railsのコールバックは、モデルのライフサイクルに沿った自動処理を実現するための非常に有用な仕組みです。適切に利用することで、コードの一貫性、再利用性、そして開発効率を大幅に向上させることができます。一方で、過度な依存や複雑な処理の隠蔽はデバッグやパフォーマンスの低下を招く可能性があるため、設計とテストには十分な注意が必要です。
bash_profile・bashrcを用いた環境変数・エイリアス・関数の定義

## 基本トピック
### bash_profile・bashrcの概要
シェル(shell)環境は環境変数やエイリアス、関数などを設定することでカスタマイズすることが可能です。また、この設定をスクリプト形式で保存しておくことでbashにログインする度に同じ環境で作業することが可能になります。この際に用いるのがbash_profileやbashrcです。

| ファイル名 | 説明 |
| --- | --- |
| `/etc/profile` | ログイン時に実行され、全ユーザから参照される |
| `~/.bash_profile` | ログイン時に実行される |
| `~/.bashrc` | bash起動時に実行される |

bashの設定にあたっては主に上記のファイルを抑えておくと良いです。ユーザレベルでよく使うのが``~/.bash_profile`と``~/.bashrc`であり、設定を書き込んだ直後に`source`コマンドを用いて読み込む場合もあります。


### 環境変数とシェル変数
シェルで用いる変数には環境変数とシェル変数があり、それぞれ下記のような特徴を持ちます。

```
環境変数：	シェル自身とシェルから起動される全てのプロセス(コマンドや別のシェル)で有効となる変数を環境変数という。代表的な環境変数にはコマンドを検索するディレクトリリストを格納する`PATH`やユーザのホームディレクトリのフルパスを表す`HOME`などがある。
シェル変数：	そのシェル内のみで有効となる変数をシェル変数という。シェル変数は`export`コマンドでエクスポートすることによって環境変数となり、他のシェルでも使えるようになる。
```

たとえばコマンドライン(CLI)で`echo $HOME`を実行すると下記のような出力が得られます。

```
/home/user_name
```


### シェルのオプション
シェルには様々なオプションがあり、`set`コマンドを用いることでオンとオフを切り替えることができます。実行にあたってはたとえば`set -o emacs`を実行すると`emacs`のオプションがオンになり、`set +o emacs`を実行すると`emacs`のオプションがオフになります。

| オプション名 | 説明 |
| --- | --- |
| `allexport` | 作成した変数を自動的にエクスポートする |
| `emacs` | emacs風のキーバインドにする |
| `ignoreof` | Ctrl+`D`によってログアウトしないようにする |
| `noclobber` | 出力リダイレクトによる上書きの禁止 |
| `noglob` | メタキャラクタを使ったファイル名展開を無効にする |
| `vi` | vi風のキーバインドにする |

たとえば`set -o noglob`によって`noglob`オプションを有効にすると`ls *.py`のようなコマンドが全ての`.py`ファイルではなく`*.py`というファイルに対応するようになります。

また、`set -o`を実行することで全てのオプションを確認することができます。

```sh
$ set -o
```

・実行結果
```
allexport      	off
braceexpand    	on
emacs          	on
errexit        	off
errtrace       	off
functrace      	off
hashall        	on
histexpand     	on
history        	on
ignoreeof      	off
interactive-comments	on
keyword        	off
monitor        	on
noclobber      	off
noexec         	off
noglob         	off
nolog          	off
notify         	off
nounset        	off
onecmd         	off
physical       	off
pipefail       	off
posix          	off
privileged     	off
verbose        	off
vi             	off
xtrace         	off
```


### エイリアス
bashではエイリアス機能を利用することで下記のようなことができるようになります。

・コマンドに別名をつける
・コマンドとオプションをまとめて新しいコマンドのようにする
・一連のコマンドを簡単に呼び出す

エイリアスの設定は下記のように`alias`コマンドを用いることで行えます。

```
$ ls
sample1.sh  sample2.sh
$ alias ls='ls -l'
$ ls
-rw-rw-r-- 1 user_name user_name  27  mm月   dd hh:mm sample1.sh
-rw-rw-r-- 1 user_name user_name 115  mm月   dd hh:mm sample2.sh
$ unalias ls
sample1.sh  sample2.sh
```

### 関数
bashの組み込みコマンドの`function`コマンドを用いることでbashシェル上で利用できる独自の関数を定義することができます。

```
$ function lsl() { ls -l; }
$ lsl
```

・実行結果
```
-rw-rw-r-- 1 user_name user_name  27  mm月   dd hh:mm sample1.sh
-rw-rw-r-- 1 user_name user_name 115  mm月   dd hh:mm sample2.sh
```



## bash_profile・bashrcファイルの編集
servicenow ログイン情報取得



```ruby:qiita.rb
##クライアントスクリプト

g_user.userName	ログインユーザ名	
g_user.firstName	苗字	
g_user.lastName	姓	
g_user.userID	ログインユーザのsys_id	
g_user.hasRole(＜ロール名＞)	ログインユーザに指定されたロールが付与されている場合はtrue（継承されたロールも含む）。それ以外はfalse。ユーザがadminロールをもつ場合は何時もtrueが返される	g_user.userID('client_script_admin');
g_user.hasRoleExactly(＜ロール名＞)	ログインユーザに指定したロールが不要されている場合はtrue（継承したロールは含めない）。その以外の場合はfalse。ユーザがadminロールをもつ場合は何時もtrueが返される	g_user.userID('client_script_admin');
g_user.hasRoles(＜コンマ区切りのロール名＞)	ログインユーザが指定されたロールの一つが付与されている場合はtrue。それ以外の場合はfalse	g_user.hasRoles('itil','admin')
```

```ruby:qiita.rb
##サーバスクリプト
gs.getUser()	ログインユーザのオブジェクトへのポインタを返す	var userObject = gs.getUser();
gs.getUserByID(＜ユーザID＞)	指定されたユーザオブジェクトのポインタを返す	var userObject = gs.getUser().getUserByID('employee');
gs.getUserDisplayName()	ログインユーザの表示名を返す。例：'ozawa hitoshi'	var userDisplay = gs.getUserDisplayName();
gs.getUserID()	ログインユーザのsys_idを返す	var userID = gs.getUserID();
gs.getUserName()	ログインユーザの名前を返す。例：'ozawa'	var user_name = gs.getUserName();
gs.hasRole(＜ロール名＞)	グインユーザに指定されたロールが付与されている場合はtrue（継承されたロールも含む）。それ以外はfalse。ユーザがadminロールをもつ場合は何時もtrueが返される	if (gs.hasRole('itil')) {
//処理...
}
gs.hasRole(＜コンマ区切りのロール名＞)	ログインユーザが指定されたロールの一つが付与されている場合はtrue。それ以外の場合はfalse	if (gs.hasRole('itil,admin')){
//ユーザがロール'itil'又は'admin'をもつ...
}
getCompanyID()	ログインユーザの会社のsys_idを返す	var companyID = gs.getUser().getCompanyID();
getCompanyRecord()	ログインユーザの会社のGlideRecordを返す	var company =
getDepartmentID()	ログインユーザが所属している部のsys_idを返す	var deptID = gs.getUser().getDepartmentID();
getDomainID()	ログインユーザがいるドメインのsys_idを返す（ドメインが有効の場合のみ）	var domainID = gs.getUser().getDomainID();
getDomainDisplayValue()	ログインユーザがいるドメインの名前を返す（ドメインが有効の場合のみ）	var domainName = gs.getUser().getDomainDisplayValue();
getEmail()	ログインユーザのメールアドレスを返す	var email = gs.getUser().getEmail();
getFirstName()	ログインユーザの苗字をkぁエス	var firstName = gs.getUser().getFirstName();
getLanguage()	ログインユーザが選択されている言語を返す	var language = gs.getUser().getLanguage();
getLastName()	ログインユーザの姓を返す	var lastName = gs.getUser().getLastName();
getLocation()	ログインユーザの現在位置を返す	var location = gs.getUser().getLocation();
getManagerID()	ログインユーザのマネージャのsys_idを返す	var managerID = gs.getUser().getManagerID();
getMyGroups()	ログインユーザが所属しているすべてのグループを返す	var groups = gs.getUser().getMyGroups();
hasRoles()	ユーザに１つでもロールが付与されている場合はtrue。それ以外はfalse(ESSユーザの場合)	if (!gs.getUser().hasRoles()) {
//ESSユーザの処理...
}
isMemberOf(＜グループのsys_id又は名前＞)	ユーザがグループに所属している場合はtrueを返す。それ以外はfalse。	if(gs.getUser().isMemberOf(current.assignment_group)){
  //処理...
}
var isMember = gs.getUser().isMemberOf('Hardware');
  //ログインユーザ以外...
var user = 'admin';
var group = "Hardware";
if (gs.getUser().getUserByID(user).isMemberOf(group)){
  gs.log( gr.user_name + " is a member of " + group);
}
else{
  gs.log( gr.user_name + " is NOT a member of " + group);
}
```
tomcat 11 InvalidParameterExceptionのエラーについて

長年間稼働するシステムのOS移行とともに、tomcatを9から11にもバージョンアップしようとします。javaxとjakartaの切り替えの対応をやって、リリースしましたが、初日エラーが発生して大騒ぎになりました。

エラー内容をローカルで再現して以下のようなのものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/791192c5-8173-43ec-867e-ca7cacf3d276.png)

内容からみると、URLのパラメータに不備があって、ディコード時エラーが発生しているようです。確かに特別な事情のためエンコード後のURLを切断する加工がありますが、そのパラーメータはシステムに利用していないです。昔もjavaxのプログラムにもこのようなエラーが発生しません。同じjakartaのプログラムですが、tomcat10だったらエラーが発生しません。ちょっと不思議です。

apache-tomcat-10.1.35とapache-tomcat-11.0.0のソース比較をしてみました。org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:350)の場所に、InvalidParameterExceptionを追加されているとわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/fdf20237-e555-404a-ae70-c264eb56bcc9.png)

つまり、<b>不備項目を持つURL</b>から何かのパラメータを取得する場合、tomcat10以前の場合、なにもエラーが発生しませんが、<b>tomcat11からエラーが発生する</b>ようになります。
個人的備忘録：Dockerのネットワーク（bridge, host, none）の違いについて言語化が怪しかったので、体系的にまとめてみた

## はじめに  
Docker のネットワーク機能は、コンテナ間やホストとの通信を管理するために提供されています。

:::note info
**用途に応じたネットワークモードを選択することで、安全かつ効率的な通信を実現できます。**
:::

本記事では、Docker のネットワークタイプや管理方法について解説します。  

## 書こうと思ったきっかけ  
Docker を使う中で、コンテナ間の通信がうまくいかないことがありました。

:::note warn
***また、ネットワーク設定によって動作が変わることを知り、理解を深める必要があると感じました。***
:::

そこで、Docker のネットワークの種類や管理方法を整理しておくことにしました。  

## Dockerのネットワークタイプ
Dockerには以下の主要なネットワークモードがあります。

### ① bridge（デフォルト）
- コンテナは仮想ブリッジ（`docker0`）を介して通信する。
- コンテナ同士は同じブリッジネットワーク内で通信可能。
- 外部ネットワークと通信するには、ポートフォワードが必要（`-p`オプション）。

**使用例:**
```bash
docker network create my_bridge
docker run -d --name container1 --network my_bridge nginx
docker run -d --name container2 --network my_bridge alpine ping container1
```

### ② host
- コンテナがホストのネットワークを直接使用する。
- `localhost` でコンテナのサービスにアクセス可能。
- コンテナ間の分離がないため、セキュリティ上のリスクがある。

**使用例:**
```bash
docker run --rm --network host nginx
```

### ③ none
- ネットワークを完全に無効化し、外部との通信を遮断する。

**使用例:**
```bash
docker run --rm --network none alpine
```

## Dockerネットワークの管理コマンド
Dockerネットワークを操作するための主なコマンドを紹介します。

### ネットワークの一覧表示
```bash
docker network ls
```

### ネットワークの詳細情報
```bash
docker network inspect <network_name>
```

### ネットワークの作成
```bash
docker network create <network_name>
```

### ネットワークの削除
```bash
docker network rm <network_name>
```

### コンテナをネットワークに接続
```bash
docker network connect <network_name> <container_name>
```

### コンテナをネットワークから切断
```bash
docker network disconnect <network_name> <container_name>
```

## Docker Compose でのネットワーク設定
Docker Compose を使うと、複数のコンテナを簡単にネットワークで接続できます。

**`docker-compose.yml` の例:**
```yaml
version: '3'
services:
  web:
    image: nginx
    networks:
      - my_network
  app:
    image: my_app
    networks:
      - my_network
networks:
  my_network:
    driver: bridge
```

## ネットワークのトラブルシューティング

### コンテナ間で通信できない
- `docker network inspect <network_name>` でコンテナが適切なネットワークに接続されているか確認。
- `iptables` の設定を確認 (`sudo iptables -L -n`)

### ホストからコンテナに接続できない
- `docker run -p 8080:80 nginx` のようにポートフォワード設定が正しいか確認。
- `docker ps` で実行中のコンテナのポートを確認。

### DNS 解決ができない
- `docker run --rm busybox nslookup google.com` で外部DNSが解決できるかテスト。
- `--dns` オプションを使って手動で設定可能:
```bash
docker run --rm --dns 8.8.8.8 busybox nslookup google.com
```

## まとめ

Dockerのネットワークは用途に応じて適切なものを選ぶことが重要です。特に、`bridge` は一般的に使われるモードですが、`host` はパフォーマンスの面で有利な場合もあります。


| ネットワークモード | 特徴 |
|----------------|--------------------------------|
| `bridge` | デフォルト、コンテナ同士の通信可、ポートマッピング必要 |
| `host` | ホストのネットワークを使用、ポートマッピング不要 |
| `none` | ネットワークなし、完全に孤立 |

:::note info
**`none` は完全にネットワークを遮断したい場合に便利です。**
:::

この違いを使いこなせるようになるまで時間がかかるかもしれませんが、私も積極的にアウトプットしながら、体系的にまとめていきます！
windows版 ghostscript で pdf を結合するときの覚書

# windows 版は gs ではなく gswin64.exe

32bit 環境だと gswin32.exe なのかも

# 出力ファイル・入力ファイル問わずフルパスで指定する

``` 例
gswin64.exe -q -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=C:\path\to\dir\output.pdf  -dBATCH C:\path\to\dir\input1.pdf C:\path\to\dir\input2.pdf
```


# フルパスで指定しないと次の様なエラーが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570185/28273f1d-6bd9-42b2-8f53-4025051b5a2a.png)

```
Error: /undefinedfilename in (.pdf)
```
LangsmithでRAGの精度を評価する

今回は、Langsmithを使ってRAGの精度を評価する手法をご紹介します。

# 1. 評価方法概要
評価方法自体は、以前紹介したragasとほぼ同じ内容ですが、評価指標は以下の4点となっています。

* Answer relevance （ユーザーの質問にどれだけ的確に答えているか）
* Retrieval relevance（クエリに対して取得された検索結果がどれだけ関連性が高いか）
* Correctness（正解の回答と比較して、RAGの回答がどれだけ正確か）
* Groundedness （取得したコンテキストにどれだけ基づいているか）


![屏幕截图 2025-02-14 104315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/a58ccef4-2e6f-4299-a466-ad3de84dbffe.png)


これらの評価は、**質問**、**関連する参考ドキュメント（検索で取得したテキスト）**、および**回答**が揃えば算出可能です。評価の流れとしては、いわゆる「LLM as a judge」（LLMに評価させる）という考え方に基づき、LLMが結果をどの程度要求を満たしているかを判断する仕組みになっています。

# 2. 試した結果

提供されているテストデータを使って、最も基本的なRAGシステムを構築し、Langsmithで評価してみました。実行後、結果確認用のURLが自動で立ち上がり、3件の質問に対する評価が約37秒で完了（GPT-4oを使用）しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/8bc7118f-b338-4bc8-b598-b50cb0d2460c.png)

上記のURLを開くと、Langsmithの画面で結果を詳細に確認できます。画面左から順に、**質問、参考チャンク、最終出力結果、各評価指標のスコア、使用トークン数、費用**が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/246abbf7-baf8-4a54-81a9-8dd6de14a603.png)

さらに、各項目をクリックすると詳細が拡大表示され、より深く内容を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/fcc5d2a0-48cf-4e70-981b-c1c78972299f.png)

全体として、評価手法はragasとほぼ同様ですが、Langsmithはその運用を大幅に簡略化・パッケージ化しているため、RAGの評価だけを行うのであれば、Langsmithをワンクリックで実行するだけで十分に対応可能だと感じました。

**興味ある方：**

https://docs.ragas.io/en/stable/getstarted/rag_eval/

https://docs.smith.langchain.com/evaluation/tutorials/rag
はじめてでもわかる！Autifyの使い方

こんにちは！株式会社ラフールでテスターをしているlafool_ynです:raising_hand_tone1:

今回はAutifyの使い方について書いてみようと思います。
入社した当時はすでにAutifyが導入されていましたが、私自身、テスト自動化ツールを使用したことがなく手探りの日々でした:sweat_drops:
この記事は、これからAutifyを使ってみるぞ！導入検討中でどんな感じか見てみたい！本当にノーコードでできるの？といった方向けにおすすめです:sparkles:

# そもそもAutifyってなに？
オーティファイ株式会社が提供している、ノーコードでテスト自動化を実現するためのサービスです。
弊社ではテスターが私1人なのですが、自社サービスのリグレッションテストを行いたいけど時間も人手も足りないよ〜:sob:という場合に非常に便利です。
また、私はコーディングが全くできません！そんなテスターでも自動テストを作成することができるという点で強い味方になってくれます:muscle_tone2:

# 実際に使ってみよう！
さっそく「テストしたい対象サービスにログインをする」といった簡単なテストを作成してみます:pick:
※弊社で使用している画面のため、画像の一部に加工をしております。

1. まず、Autifyのサイドメニュー＞シナリオから「新規シナリオ」を押下します。
![IMG_0216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953615/cf8970de-64ab-dc8f-c154-f5a82e446d18.png)

2. 新規シナリオ作成画面の開始URL部分にテストしたい対象ページのURLを入力します（今回はログインなので、ログインページを入力しています）。入力したら、「レコーディングを開始」を押下します。
![IMG_0217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953615/f0e1f756-8fa8-3754-058b-84b6598ae90a.png)

3. シークレットウィンドウが開き、レコーディングが開始されます。レコーディングの開始後は、普段通り操作します（ログインならメールアドレスやパスワードの入力）。
なお、レコーディングにはChrome拡張機能が必要になるため、公式指定のものをインストールしてください。
レコーディングしたい操作が一通り終了したら、左下の「保存」ボタンを押下します。
![スクリーンショット 2025-01-24 19.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953615/bc6d4b37-9047-5066-8acd-aac36a34078a.png)

4. レコーディング終了後は、操作した動作が表示されたシナリオ詳細画面に遷移します。ここで内容がテストしたい内容が合っているか確認します。
![IMG_0213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953615/b5506fb5-95b4-e635-a463-a55a65e73702.png)

ここまでが「テストしたい対象サービスにログインをする」テストのレコーディング方法です。
次回からは「今すぐ実行」を押下することで、ログインのテストが自動で行われます:clap_tone2:

# 結果確認はどうするの？
実行したテストシナリオがOKでもNGでも結果画面で詳細を確認することができます:point_up_tone2:

NGの場合はどこで収録内容と相違があるかを知ることができます。
例えば、以下はログイン後に500エラーになってしまったときのものですが、期待値と結果を載せてくれているのですぐに違いに気づくことができますね◎
![IMG_0325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953615/4828eb2a-a6fb-e239-1198-000202df7731.png)

また、テスト実行後30日以内であれば、ビデオログで実際に動いている動画を見ながら結果を確認することも可能です:video_camera:
NGでもう少し詳しく確認したい時はもちろん、OKの場合でもここは自分の目でも見ておきたい！なんか怪しい感じがする！いう時に使うようにしています。
※ビデオログ提供は契約プランによって異なるため公式サイトをご確認ください。

# JavaScriptを使うこともできます
Autifyではブラウザの「更新」や「戻る」は現時点では収録ができないのですが、シナリオに含めたい場合は、以下のようにJavaScriptを直接入力して操作を実行させることができます:arrow_forward:
![IMG_0329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953615/d5efb273-64c1-a54a-737a-d37979758932.png)
収録できない操作はもちろんこと、収録はできるけどなぜかうまくいかない…という時に利用しています！
ただ、冒頭でも書きましたが私はコーディングができないので、社内開発メンバーに聞いたり、Autifyの画面右下に常に表示されているチャットでAutifyの方たちに助けてもらいながら作成しています:pray_tone2:

# 最後に
今回はテスト自動化ツールAutifyの基本的な使い方についてご紹介しました！
・テスト自動化ツールでAutifyを検討している方
・はじめてAutifyを使ってみるという方
・コーディングができなくても使いこなせるの？と疑問に思っていた方
などなど・・・
こちらの記事が少しでも参考になればと幸いです:blush:
EclipseでTomcatサーバが始動失敗し、廃止ファイルをサーバーから除去中の解決方法

# 背景
1. EclipseのTomcatでJavaservlet を開発中、ディスク容量がいっぱいになり、デバッグ中のプログラムが停止した
1. ディスク容量を確保し、再度サーバーの実行を行ったが下記のエラーが出て、「何もしてないのに壊れた」状態となった

# 廃止ファイルをサーバーから除去中... 廃止ファイル 途中でファイルの末尾に達しました。 のサーバーをクリーンできませんでした 途中でファイルの末尾に達しました。
Eclipse のコンソールログを見ると、外部Jar ライブラリをインポートしているクラスのロードで止まっていた。
必要なライブラリのパスは正しく設定されているし、ファイルも存在している。
Tomcat のサーバで実行しているApache Tomcat のクラスパスを見ると、依然消したはずのライブラリパスが残っていた。
また、実行に必要なライブラリのパスが存在しなかった。

# 解決策
1. Eclipse の実行環境で存在しないファイルパスをインポートしようとしていたため、その記述を消した
1. 保険として、Javaのビルド・パスのライブラリーで設定しているライブラリのパスを、Apache Tomcat の設定でもクラスパスを追加した
1. ![スクリーンショット 2025-02-14 104914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900930/73938494-eac6-456b-925b-6fc9e6491431.png)
【初心者向け】スタンプカードアプリを作るためにはどうしたらいいかのメモ①

急遽(？)スタンプカードアプリを作りたくなったので
どうしたら作れるようになるかなぁというのを調べてみました。

まだ初心者なのでクオリティの高いものは作れませんが
なんとなくそれっぽいものをどうにかして作ろうと思います。

 
＜目標＞
1週間くらいで作りたい！

とりあえずこんなのが作りたいなぁと思ったんですが、
![スタンプカード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674173/494b7749-b3b8-4838-8314-61a5e20ab4c5.png)

友達に相談したら、画像を使うのは難しいかもしれないと言われたので、
急いで作ったこの画像のことは
一回忘れようと思います。
　

趣味で作りたいのでXIBファイルのこともまだ勉強中でわからないところがあるので
XIBファイルのことも一回置いといて
Main.storyboradを使おうと思います。

　
 
そして調べてみたところ

＜UICollectionViewCell とは・・・＞


UICollectionViewCell は UICollectionView（コレクションビュー） で 表示するアイテム（セル） を管理するためのクラスです。
リスト表示 (UITableViewCell) ではなく、グリッドレイアウトや自由なレイアウトでアイテムを表示できます。

＜主な特徴＞
	•	UICollectionView に表示される1つ1つのセル
	•	再利用（reuseIdentifier） できる
	•	カスタムデザイン可能（画像・ラベル・ボタンを追加できる）
	•	セルのサイズを自由に変更できる（グリッド・リストなど）

＜UICollectionViewCell の実装方法＞

Storyboard でカスタムセルを作成
	1.	UICollectionView を配置
	2.	UICollectionViewCell を追加
	3.	Identifier（再利用ID）を設定 → 例: "StampCell"
	4.	カスタムセルに UILabel や UIImageView を配置
	5.	セルのレイアウトを設定


スタンプカードアプリを作るなら
これは使えるのでは！となりました。

まだ初心者でUICollectionViewというのは触ったことがないので
使えるようになるまで
練習してみようと思います！
Cursor 0.4.5の新機能：Project Rulesの使い方

Project RulesはCursorのv0.45で導入された機能で、Chat/Composerでの対話において必要なコンテキストを与えるための機能です。

特筆すべき点は：

- ルールは`.cursor/rules/`ディレクトリ下に`.mdc`ファイルとして保存
- Chat/Composerが自動でルールを判断して適用
- globsによる実行条件の指定が可能（オプション）

### **基本的な記述方法**

```markdown
## ルールのタイトル
globs:**/*.{js,ts}  # 適用するファイルパターン（オプション）
description: ルールの説明

# ルールの説明や指示
- ルール1
- ルール2

# コマンドなどの実行例
---
command example
---
```

### **機能の紹介**

1. **テキストとシンボルの使用**
    - プロジェクト内のファイルを正確に指定可能
    - コードベースの文脈を理解しやすい形で提供
2. **条件付き適用**
    - globsによってファイルの種類、場所、名前などで適用条件を指定可能
    - 条件指定がなくてもComposerが文脈に応じて適切に利用

### **設定方法**

1. `Cursor Settings > General > Project Rules > Add new rule`


### **まとめ**

Project Rulesは、プロジェクト固有のコンテキストをAIに効率的に伝える強力な機能です。自動判断による適用と柔軟な条件指定により、開発効率を大幅に向上させることができます。

### **参考**

- [Changelog - Jan 23, 2025 | Cursor - The AI Code Editor | Cursor - The AI Code Editor](https://www.cursor.com/ja/changelog/-cursor-rules-better-codebase-understanding-new-tab-model)
DeNA南場会長が生成AIツールを使い倒している件について

# AIイベント「DeNA×AI Day」の基調講演が話題に
DeNAの南場智子代表取締役会長は「現在の事業はだいたい3000人で運営している。非常にモデスト（謙虚）な目標だが、これを半分にする。半分で現業を成長させながら、残りのもう半分で新規事業をやっていく。DeNAはAIにオールインする」と意思表明。

:eyes:1500人でAI事業に取り組む。凄い。

# DeNA南場会長は使用している生成AIツール一覧
簡単に表にまとめました。こちらです↓
![スクリーンショット 2025-02-13 204724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951071/f70c0eb0-af77-4e80-b5a1-50cd314accda.png)
### Perplexity AI
Perplexity AIは、2022年8月に設立された AI駆動の検索エンジンです。大規模言語モデル（LLM）を活用して、質問に対して会話形式の回答を生成し、信頼性を確保するために情報源を引用します。
主な特徴は以下の通りです。
- スマート検索（画像やファイルのアップロード機能付き）
- 直接的な回答を提供（リンクのリストではなく）
- 複数の言語モデルから選択可能
- カスタム検索機能
- リアルタイム情報の提供

https://www.perplexity.ai/



### NotebookLM
NotebookLMは、Googleが開発した高度なAI駆動ツールで、ユーザーが情報を理解し活用する方法を変革することを目的としています.
主な特徴は以下の通りです。
- 多様な文書インポートオプション（Google Drive、PDF、テキストファイル、ウェブURL、YouTube動画、音声ファイル）
- Google Driveとの連携による大量の文書の簡単な共有

https://g.co/kgs/tSscAX6

### Circleback
Circleback は、会議の生産性と効率を向上させるためのAI駆動ツールです。100以上のチームに信頼されており、TIMEによってトップAIノート取りアプリケーションとして推奨されています。
主な特徴は以下の通りです。
- 自動会議ノート作成
- アクションアイテムの追跡
- 高度な文字起こしサービス（100以上の言語に対応）
- プラットフォーム統合（CRM、Notion、Slack等）
- セキュアなデータ暗号化
- AI駆動の検索と自動化機能

https://circleback.ai/

### Google Deep Research
Google Deep Researchは、Geminiに追加された新機能で、ユーザーに代わってウェブを閲覧するAI研究アシスタントとして機能します。
主な特徴は以下の通りです。
- 研究戦略の立案
- インターネット上の関連データの収集
- クリック可能な引用付きの結果表示
- フォローアップクエリや修正リクエストの対応
- Google Docsへのレポートエクスポート機能

https://gemini.google/advanced/?hl=ja

### OpenAI Deep Research
OpenAIのDeep Researchは、ChatGPT内の新しいエージェントで、ウェブ全体にわたる詳細な多段階調査を行うように設計されています。
主な特徴は以下の通りです。
- 5〜30分間独立して操作
- ウェブの閲覧、コンテンツの解釈、引用付きレポートの作成
- OpenAIの次世代o3モデルの特殊バージョンを使用
- 複雑なトピックに関する包括的な洞察を提供

https://openai.com/index/introducing-deep-research/

### ChatGPT 「o1」
OpenAIが発表した新しい言語モデルで、Sam Altmanによって「世界で最もスマートな言語モデル」と称されています。
主な特徴は以下の通りです。
- より高度な分析と問題解決能力
- マルチモーダリティ機能
- ChatGPT Proプラン（月額200ドル）でほぼ無制限のアクセスが可能
- API経由でも利用可能（予定）

https://chatgpt.com/

### Create XYZ
Create XYZは、プロジェクトを無料でホスティングするプラットフォームで、created.appドメインを使用します。
主な特徴は以下の通りです。
- クイックパブリッシュ機能
- カスタムサブドメインの選択
- ページとファンクションの公開管理
- ルーティング設定
- 高トラフィックの処理が可能

https://www.create.xyz/

### Cursor
Cursorは、CSSのプロパティの一つで、ウェブページ上でマウスポインタの外観を制御します。
主な特徴は以下の通りです。
- キーワード値やURL値を使用してカーソルの外観を指定
- 複数の画像URLとフォールバックオプションをサポート
- ホットスポット座標の設定が可能
- アニメーション対応

https://www.cursor.com/

### Devin
Devinは、主にプログラミングやシステム構築をサポートするAIエージェントです。具体的には、コード生成やデバッグ支援、システム開発の補助を目的としたツールです。
主な特徴は以下の通りです。
- 開発者向けに効率的なコードを書けるよう支援
- システム構築やアプリ開発の全体構成をサポート
- プログラミングの学習にも使える

https://devin.ai/

# まとめ
DeNAの取り組みは、今後AIを活用した新しい働き方のモデルケースとなるでしょう。「AIにオールインする」という言葉通り、今後のDeNAの成長がどのような形で実現していくのか、非常に楽しみです。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！

# 参考文献
https://www.itmedia.co.jp/aiplus/articles/2502/05/news150.html

https://www.itmedia.co.jp/aiplus/articles/2502/05/news130.html
Excelで使えるPython: Microsoft 365の新機能


## はじめに

Microsoft 365の最新機能、「Python in Excel」が登場しました。この革新的な機能により、Excelユーザーはスプレッドシート内で直接Pythonコードを実行できるようになりました。データ分析や可視化の可能性が大きく広がり、ビジネスアナリストやデータサイエンティストにとって強力なツールとなります。この記事では、「Python in Excel」の概要から使用方法まで、7の章に分けて詳しく解説します。

## 第1章: Python in Excelとは

Python in Excelは、Microsoft Excelにプログラミング言語Pythonの機能を統合した新しい機能です。これにより、ユーザーはExcelのセル内で直接Pythonコードを書き、実行することができます。データ分析、機械学習、グラフ作成など、Pythonの豊富なライブラリを活用しながら、Excelの使い慣れたインターフェースで作業できるようになりました。`CTRL+ALT+SHIFT+P`でPythonが実行できます(実行するときは`CTRL+ENTER`)

## 第2章: Python in Excelの利点

この機能の主な利点は、Excelの使いやすさとPythonの強力な機能を組み合わせられることです。複雑なデータ分析や可視化が、プログラミングの専門知識がなくても可能になります。また、Pythonのライブラリを使用することで、Excelだけでは難しかった高度な統計分析や機械学習のタスクも実行できるようになります。

## 第3章: セットアップと準備

Python in Excelを使用するには、Microsoft 365のサブスクリプションが必要です。現在はWindows版のExcelでのみ利用可能です。機能を有効にするには、Microsoft 365 Insiderプログラムに参加し、Betaチャネルを選択する必要があります。セットアップが完了すると、Excelの数式バーに新しい「PY」関数が表示されます。

## 第4章: 基本的な使い方

Python in Excelの基本的な使い方は簡単です。セルに「=PY()」と入力し、括弧内にPythonコードを記述します。例えば、簡単な計算を行うには以下のようにします：

```python
=PY("2 + 3")
```

この結果、セルには5が表示されます。より複雑な計算や処理も同様に行えます。

## 第5章: データの操作

Python in Excelを使用すると、Excelのデータを簡単にPythonで操作できます。例えば、特定の範囲のデータを合計するには次のようにします：

```python
=PY("
import pandas as pd
data = xl('A1:A10')
total = data.sum()
return total
")
```

このコードは、A1からA10までのセルの合計を計算します。

## 第6章: グラフと可視化

Pythonの強力な可視化ライブラリを使用して、Excelでより高度なグラフを作成できます。例えば、MatplotlibやSeabornを使用して、ヒートマップや散布図を作成できます：

```python
=PY("
import matplotlib.pyplot as plt
import seaborn as sns
data = xl('A1:B10')
sns.heatmap(data)
plt.show()
")
```

このコードは、A1からB10のデータを使用してヒートマップを作成します。

## 第7章: セキュリティと制限事項

Python in Excelは、Microsoftのクラウド上で実行されるため、ローカル環境に影響を与えません。しかし、セキュリティ上の理由から、一部の機能に制限があります。例えば、ファイルシステムへの直接アクセスはできません。また、現在はWindows版のExcelでのみ利用可能で、他のプラットフォームでの利用には制限があります。

Python in Excelは、ExcelユーザーにPythonの強力な機能を提供する革新的なツールです。データ分析や可視化の可能性を大きく広げ、ビジネスアナリストやデータサイエンティストの作業効率を飛躍的に向上させる可能性を秘めています。今後のアップデートや機能拡張に期待が高まります。
Crystalコンパイラはライブラリとして使える

## はじめに

昨年から[Crystalのコンパイラが簡単にライブラリとして利用できるようになっていた](https://forum.crystal-lang.org/t/how-can-i-use-crystal-compiler-as-a-library/6162)ことに気がついたので、その手順を共有したいと思います。

## プロジェクトの作成

まず、Crystalの新しいプロジェクトを作成します。

```sh
crystal init app duck_egg
cd duck_egg
```

### `shard.yml` の編集

作成した `shard.yml` に以下のように設定を追加します。
ここでは `dependencies` に `markd` と `reply` を追加します。

```yaml
name: duck_egg
version: 0.1.0

targets:
  🥚:
    main: src/duck_egg.cr

dependencies:
  markd:
    github: icyleaf/markd
  reply:
    github: I3oris/reply
```

## `duck_egg.cr` の作成

次に、`src/duck_egg.cr` を作成し、以下のコードを記述します。

```crystal
require "compiler/requires"

BIRDS = [
  { "🐔", "cluck!" },
  { "🐓", "cock-a-doodle-doo" },
  { "🦃", "gobble" },
  { "🦆", "quack" },
  { "🦉", "hoot" },
  { "🦜", "squawk" },
  { "🕊", "coo" },
  { "🦢", "honk" },
  { "🦩", "brrrrt" },
  { "🐧", "honk honk" },
  { "🦤", "boop" },
  { "🦕", "Bwooooon!!" },
  { "🦖", "Raaaaawr!!" }
]

bird, sound = BIRDS.sample

compiler = Crystal::Compiler.new
source = Crystal::Compiler::Source.new(bird, %Q(puts "#{bird}  < #{sound}"))
compiler.compile source, bird
```

Crystalコンパイラを 🥚 に組み込みます。
🥚 を実行すると、ランダムに鳥が選ばれ、鳥と鳴き声を表示するバイナリファイルが(組み込まれたコンパイラによって)生成されます。

## ビルドと実行

まず `shards build` でビルドします。

```sh
shards build
```

次に環境変数 `CRYSTAL_PATH` を確認して、Crystalの標準ライブラリがどこにインストールされているかチェックします。

```sh
crystal env # 環境変数の確認
```

今回生成する実行ファイル 🥚 にはCrystalのコンパイラが組み込まれています。

Crystalコンパイラは、`puts 0` のような単純なコードであっても、それだけでコンパイルすることはできません。標準ライブラリを読み込む必要があるため、標準ライブラリのパスを指定する必要があります。これが `CRYSTAL_PATH` 環境変数の設定が必要な理由です。

```
export CRYSTAL_PATH=lib:/usr/local/bin/../share/crystal/src
```

実行してみましょう。

```sh
bin/🥚
```

例えば、次のような出力が得られます。

```
🦖
```

実行してみましょう

```
./🦖
```

🦖  < Raaaaawr!!


## まとめ

Crystalのコンパイラをライブラリとして使用することで、動的にコードを生成しコンパイルすることが可能になりました。おもしろい応用があるといいですね。

すぐに試したくなるのは、共有ファイルを作成し、それを動的に呼び出すようなツールですが、[ここには重大な制約がある](https://qiita.com/kojix2/items/79a6b1ae775c96dd9e6d)ため、実現するためにはもう一歩工夫が必要でしょう。

この記事は以上です。
グローバルホットキーの設定とホットキーとして割り当てるキーの設定方法

# グローバルホットキー
一般的なアプリケーションは自分自身がアクティブな時のみキー入力を受け付けます。
しかし他のアプリケーションの補助を行う場合や、Windows自身の操作を拡張するときに**自分自身がアクティブでは無いがキー入力を受け取りたい**という場合があります。

そういうときに使用するのが**グローバルホットキー**です

## 開始方法
```
RegisterHotKey(ハンドル, 重複しない番号, CtrlやShift状態を示す値, キーコード);
```
## 終了方法
```
UnregisterHotKey(ハンドル, 開始時に使用した番号);
```
## 処理の受け取り方
```sample.pas
procedure TFormMain.WndProc(var Message: TMessage);
  inherited WndProc(Message);                 // 他のプロセスへも処理を回す
  if Message.Msg <> WM_HOTKEY then exit;      // ホットキー以外は処理しない
  if Message.WParam <> 開始時に使用した番号 then exit;   
  // ここに処理を書く
```

# ホットキーに使うショートカットキーの設定
あらかじめホットキーに使用するキーが決まっている場合は固定値でも良いのですが、折角ですからユーザーで設定出来るようにします。
Delphiにはあらかじめ**THotKey**という便利なコンポーネントがありますのでこれを使います。
ただしこのコンポーネントに癖があるため使うために工夫が必要になります。

## ショートカットキーの値とは？
ショートカットキーが設定できるTHotKeyというコンポーネントがあることを説明しましたが、ではショートカットキーを値として保存しておくには何を保存すれば良いと思いますか？

キー部分はキーコードを覚えておけば良さそうですがShiftやCtrlを押しながらという設定もあるので設定値が増える気はします。
しかし実は**WORD**型の値を1つ覚えておくだけでグローバルホットキーの指定もショートカットキーの設定も可能です。

## THotKeyをWORD値による取得設定に対応させる
THotKeyに何故かまともな設定と取得方法が存在しません。これはかなり謎の部分です
published節に取得設定方法が用意されていないのでウインドウメッセージを使って自力で作る必要があります。

### THotKeyの設定状態を取得
```
取得した値 = SendMessage(HotKey1.Handle, HKM_GETHOTKEY, 0, 0);
```
### THotKeyの設定状態を設定
```
SendMessage(HotKey1.Handle, HKM_SETHOTKEY, 設定する値, 0);
```

# THotKeyで指定したショートカットキーをホットキーとして設定
```sample.pas
procedure TFormMain.HotkeyStart(HotKey : WORD);
var
  mKey : Cardinal;
  b,hKey : Integer;
begin
  if HotKey = 0 then exit;                         // 未設定時未処理
  FHotkeyUsed := True;                                     // ホットキー設定済みとする

  hKey := FConfig.HotKey;                                  // ホットキー取得
  b := hKey shr 8;                                         // Shit,Ctrl部分を取得

  mKey := 0;                                               // Shift,Ctrlの指定値初期化
  if (b and $01) <> 0 then mKey := mKey + MOD_SHIFT;       // Shift指定時の演算
  if (b and $02) <> 0 then mKey := mKey + MOD_CONTROL;     // Ctrl指定時の演算
  if (b and $04) <> 0 then mKey := mKey + MOD_ALT;         // Alt指定時の演算

  RegisterHotKey(Handle, 1, mKey, hKey and $ff);           // ホットキー設定
end;
```

# 最後に
これでTHotKeyを利用したグローバルホットキーを使うことが出来るようになります。

慣れればとても便利ですが、それ以前にどうしてこんな構造にしたのか謎が残ります。
Linuxスタートアップルーティン

## update.sh の作成，実行

```bash
echo "sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y" > ~/update.sh
source ~/update.sh
```

アプデのScript[^mise-update]を毎回叩くのが面倒，という魂胆．

https://qiita.com/aratasss/items/1f5b588c1f37efaf75ec

https://qiita.com/ydah/items/528aefd1a1cab51285c3

## Python環境構築

:::note warn
わからなくなったら公式HPを確認すること
:::

https://mise.jdx.dev/getting-started.html

### 1. mise

```bash
curl https://mise.run | sh # Install Linux/MacOS
~/.local/bin/mise --version # 動作確認
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc # mise PATH
source ~/.bashrc
```

[^mise-update]: miseのアプデコマンドを追加するなら`echo "mise self-update" >> ~/update.sh`も実行

### 2. Python plugin

```bash
mise use --global python@3
```

### 他の言語

https://qiita.com/QiitaTakenoko/items/df577e1d97bc94b8e221

## LaTeX環境構築

https://qiita.com/QiitaTakenoko/items/26d495842968fa37e203

```bash
sudo apt install texlive \
texlive-luatex texlive-lang-japanese texlive-latex-extra \
latexmk
```

## pandoc環境構築

```shell
sudo apt install pandoc make
```

```makefile
SOURCES := $(wildcard *.md)
PDF := $(SOURCES:.md=.pdf)
DOCX := $(SOURCES:.md=.docx)
TEX := $(SOURCES:.md=.tex)

all: $(DOCX) $(TEX) $(PDF)

%.pdf: %.md
	pandoc $< -o $@ --pdf-engine=lualatex -V documentclass=ltjsarticle

%.docx: %.md
	pandoc $< -o $@

%.tex: %.md
	pandoc $< -o $@

clean:
	rm -f $(DOCX) $(TEX) $(PDF)

.PHONY: all clean
```
## Git環境設定

```bash
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
```
グローバルコミュニケーションの未来: AIによるローカリゼーション

グローバルコミュニケーションの未来: AIによるローカリゼーション
現代のデジタル時代において、企業やコンテンツクリエイターは常にグローバルなオーディエンスとつながる方法を模索しています。しかし、言語の壁や文化の違いを克服することは大きな課題です。ここで活躍するのが、AI-powered localization ソフトウェアです。この革新的な技術が、世界中のブランドコミュニケーションを変革しています。

AIローカリゼーションが重要な理由
従来の翻訳方法では、言語ごとの微妙なニュアンスを捉えることが難しく、誤解や伝達ミスが発生することがあります。しかし、AIを活用したローカリゼーションツールは、機械学習と自然言語処理を駆使し、より正確でコンテキストに沿った翻訳を提供します。その結果、各国の文化や価値観に適した効果的なメッセージを発信できるようになります。

Raiverb: スマートなローカリゼーションソリューション
この分野で注目を集めているのが、Raiverb です。この AI-powered localization ツールは、最新のAIアルゴリズムを活用し、コンテンツを多言語・多文化に適応させることが可能です。ウェブサイトやモバイルアプリ、マルチメディアコンテンツなど、あらゆるメディアに対応し、オリジナルの意図やトーンを維持したままスムーズなローカリゼーションを実現します。

まとめ
グローバル市場への進出が進む中、AIによるローカリゼーション は企業にとって重要な鍵となっています。時間とコストを節約できるだけでなく、ターゲットユーザーに適したコンテンツを提供することで、エンゲージメントを高めることができます。

世界水準のローカリゼーションを体験してみませんか？ Raiverb をぜひお試しください！https://www.bouncerock.com/raiverb/
【Go】簡単なStrategyパターンのサンプルコード


## 概要


Goで簡単Strategyパターンを実装。


内容はポケモンの攻撃方法をStrategyパターンを用いて動的に変更できるようなもの。


## サンプルコード


```go
package main

import "fmt"

// このインターフェースを使って異なる攻撃方法を実装する
// ポケモンの攻撃方法はこのインターフェースを実装した内容によって決まる
type AttackStrategy interface {
	Attack() string
}

// 物理攻撃(AttackStrategyインターフェースを実装)
type PhysicalAttack struct{}
func (pa *PhysicalAttack) Attack() string {
	return "Physical Attack!"
}

// 特殊攻撃(AttackStrategyインターフェースを実装)
type SpecialAttack struct{}
func (sa *SpecialAttack) Attack() string {
	return "Special Attack!"
}

// ポケモン構造体
// AttackStrategy を差し替えることで、攻撃方法を動的に変更できる
type Pokemon struct {
	name   string
	attack AttackStrategy
}

// ポケモンを生成するコンストラクタ
func NewPokemon(name string, attack AttackStrategy) *Pokemon {
	return &Pokemon{
		name:   name,
		attack: attack,
	}
}

// ポケモンの攻撃を表示
func (p *Pokemon) PerformAttack() {
	fmt.Printf("%s uses: %s\n", p.name, p.attack.Attack())
}

// ポケモンの攻撃方法を変更
func (p *Pokemon) ChangeStrategy(newStrategy AttackStrategy) {
	p.attack = newStrategy
}

func main() {
	// 物理攻撃を持つポケモン「ピカチュウ」を作成
	pikachu := NewPokemon("Pikachu", &PhysicalAttack{})
	pikachu.PerformAttack()

	// 特殊攻撃に変更
	pikachu.ChangeStrategy(&SpecialAttack{})
	pikachu.PerformAttack()
}

// 出力
// Pikachu uses: Physical Attack!
// Pikachu uses: Special Attack!
```
GitHubのHTTPSとSSH通信の認証方法の違い


GitHub でリポジトリにアクセスする際、コマンドライン認証には **HTTPS** と **SSH** の二つの方式がある。
GUIの場合、以下の方法でログイン可能だが、詳細は割愛。
1. ブラウザ
   - ユーザー名/パスワード
   - 二要素認証 (2FA)
   - パスキー
   - SAML 認証
2. GitHub Desktop
3. API (OAuth, Personal Access Token, GitHub Apps)

## 1. HTTPS 認証
- 認証方式: PAT (Personal Access Token)
- 通信の暗号化: TLS/SSL
- 初回のみPATを使用
- 一般ユーザー向けでセットアップが簡単
- 企業ネットワーク環境などでファイアウォールの制約を受けにくい
- GitHub CLI で統合可能 (`gh auth login` で PAT を自動管理できる)
  - `gh auth login` を使えば、PAT を手入力する必要がなくなる
- デメリット
  - PATをURLに直接含めると、CI/CD のログなどに記録される危険性がある
  - PAT を毎回入力する必要がある（Git の credential-store を利用すれば回避可能）
  - PAT の管理が必要（定期的な更新が必要）

### HTTPS の認証手順
1. GitHub CLI でログイン (推奨)
   `gh auth login`
2. 手動で HTTPS の認証を行う場合
   `git clone https://github.com/<OWNER>/<REPO>.git`
   - `git push` や `git pull` の際に、ユーザー名を入力し、パスワードの代わりに PAT を入力する
3. PAT を環境変数で管理 (セキュリティ対策)
   `export GITHUB_TOKEN="ghp_xxxxxx"`
   `git clone https://$GITHUB_TOKEN@github.com/<OWNER>/<REPO>.git`

## 2. SSH 認証
- 認証方式: 公開鍵暗号化方式
- 通信の暗号化: SSH
- GitHubに初回登録すれば認証の手間がなくなる
- 秘密鍵が流出しない限り安全
- SSH Agentを使用すると、CI/CD などのリモート環境でもGitが使用可能
- デメリット
  - 初回セットアップが必要（SSH キーペアを生成し、GitHub に登録する）
  - ポート22 のため、ファイアウォールの影響を受ける可能性がある
    - GitHubのSSHはポート443でも利用可能
      `ssh -T -p 443 git@ssh.github.com`を試すことで回避できる場合がある

### SSH のセットアップ手順
1. SSH キーペアの生成
   `ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`
2. SSH Agent を起動
   `eval "$(ssh-agent -s)"`
   `ssh-add ~/.ssh/id_rsa`
3. 公開鍵 (`~/.ssh/id_rsa.pub`) を GitHub に登録
4. SSH 接続テスト
   `ssh -T git@github.com`

   成功すると以下のメッセージが表示される：
   `Hi <USERNAME>! You've successfully authenticated, but GitHub does not provide shell access.`

## 3. HTTPS と SSH の比較表

| 項目 | HTTPS | SSH |
|------|--------|------|
| 認証方式 | Personal Access Token (PAT) | 公開鍵認証 |
| 通信の暗号化 | TLS/SSL (HTTPS) | SSH プロトコル |
| 認証の手間 | `gh auth login` で簡単に管理できるが、PAT の定期更新が必要 | 一度設定すればその後は不要 |
| セキュリティ | PAT の管理が必要 | 秘密鍵が安全なら高セキュリティ |
| CI/CD の対応 | PAT を環境変数に持たせるなどの管理が必要 | SSH Agent を利用可能 |
| ファイアウォールの影響 | ほぼ受けない（ポート 443） | 企業ネットワークではポート 22 がブロックされる可能性あり |
| 利用対象 | 一般ユーザー向け、セットアップが簡単 | 開発者・CI/CD向け、セキュリティ重視 |

## 4. どちらを使うべきか？

| 用途 | おすすめの認証方式 |
|----------|------------------|
| セットアップを簡単に済ませたい | HTTPS |
| セキュリティを重視したい | SSH |
| CI/CD 環境での認証を簡単にしたい | SSH |
| 企業ネットワークで使用する | HTTPS (SSHはブロックされる可能性あり) |
| 2要素認証を有効化している | SSH |
| 一度セットアップして、以降楽に使いたい | SSH |

## 5. まとめ

- HTTPS のメリット
  - 簡単にセットアップ可能
  - 企業のネットワークでも制約を受けにくい
  - `gh auth login` を使えば、認証を自動化できる

- HTTPS のデメリット
  - PAT の管理が必要（定期的な更新）
  - セキュリティ面で SSH に劣る

- SSH のメリット
  - 一度セットアップすれば、その後の認証が不要
  - セキュリティが高く、CI/CD での管理が楽

- SSH のデメリット
  - 初回セットアップが必要
  - 企業のファイアウォールでポート22がブロックされる可能性がある（ポート443でも利用可能）

### 参考

https://zenn.dev/nameless_sn/articles/the_differences_between_https_and_ssh

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/about-authentication-to-github

https://cli.github.com/manual/gh_auth_login

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
フリーランス・副業・起業時に気をつけるべきエージェントや直接契約での競業避止条項契約書

`この記事は、毎日記事を書くという全く達成できない目標をたまに達成するために書いております`

最近契約書じゃないけど、承諾書でこういう話見たので、フリーランスの契約書も気をつけるべきだなと記事にしました。

同じ経験をされた方いらっしゃったら、いいね❤とコメントお待ちしております。


起業と企業と混在していますが、起業時の方も、起業後軌道に乗った企業の意味も含んでいる点、ご理解頂けると助かります。

https://togetter.com/li/2511064

案件を紹介してくるエージェントや、直接契約の顧客であっても、競業避止項目を盛り込んできます。

## 競業避止とは

競業避止条項は、わかりやすく言うと、システム開発していたエンジニアが、競合他社のSIer企業に転職する事を10年間禁止する代わりに、退職金を５割増で支払いますとかいう例です。

システム開発系ではあまり聞かず、割と、金融関係の企業で多いと聞きます。

一般的には、社員が転職するときに締結され、競業避止させるなら、割増でお金を支払う事が一般的です。

なぜ、割増支払いが一般的かというと、なんのメリットもないのに、競合に転職できないというのは、労働者の権利を阻害するからです。


https://www.check-roudou.mhlw.go.jp/hanrei/kyougyou/kyougyou.html

フリーランスや企業や副業ではなく、一般の労働者の割増支払いがない場合の転職に関する雇用主との競業避止条項は、裁判した方が良い感じです。

しかし、フリーランスや企業や副業の競業避止についてはサインするには注意が必要です。

## フリーランスや企業の競業避止

エージェントや、直接契約の顧客が、競業避止を契約書に記載してくることが多々あります。

Qiitaを使用しているエンジニアといえば開発者だと思うので、開発者が競業避止項目に同意することがどういうことかを考えてみましょう。

## 開発者が競業避止に同意する

次の競業避止条項は、ChatGPTに生成してもらいましたが、実際にこれまで受け取ったことがある契約書の競業避止もこういうものです。

甲は相手事業者。
乙は自分。

```
乙は、本契約期間及び本契約終了後1年間は、以下の行為を行わない。
甲の顧客企業と競合関係にある事業者への就職、役員就任、役務の提供、関連企業への就職又は役員への就任、自らの営業、新規事業への役務の提供、その他甲及び甲の顧客企業の利益に反する業務
```

`自らの営業` ができないということは、１ヶ月でも副業で、システム開発を請け負ったら、その１年間は本業であってもシステム開発を行うことができません。

これまでの経験上、その競業避止条項を御社も同様に締結してくださいとお願いすると、「基本契約書なので、完全に脳死状態ですべての契約者と締結する」という法務回答を返され、契約不可となり終了します。

御社も同様に、競業避止条項を締結するというのは、相手方に相手方が本業としている業務をこの先1年間営業不可にさせるという意味ですので、当然契約するわけがないでしょう。

## 意味わからない人へ

ここで、「みんな契約してるんなら黙って契約しろよ、お前何いってんだ？」みたいな事を思われた方もいらっしゃると思います。

実際、規模が大きいエージェントからはそういうお返事をいただくこともございます。

規模が小さいエージェントは、「すいません」って言って修正してくれますので、業界としても良くない契約書だということはわかっているんだと思います。

規模が大きいエージェントが修正してくれたことは無いので、大きければ大きいほど気をつけた方が良いとかんじていま

もう一度言うと、１ヶ月でも副業でシステム開発したら、本業のシステム開発も転職も企業も、システム開発関連の仕事ができない（実際には損害賠償請求されても文句言えない）契約書にサインすることになります。

しかも、その報酬は普通に募集されている案件の対価なので、1年間休業することに見合うものでは到底無いという注意喚起をしたいという意図です。

なお、1年間ではなく、「今後一切」競業避止条項が記載されている契約書も見たことがあります。

そもそも、厳密にはできるから、考えすぎというご指摘もあるかと思いますが、そこは自由だと思います。

## 競業避止条項に同意しても良い場合


例えば、フリーランスの方が、週５の半年契約のシステム開発業務を請け負う場合、 `契約期間内に限定された競業避止条項` に同意することは問題ないと思います。

## まとめ

現在でもエージェント経由、直接契約の顧客、どちらであっても競業避止条項が入っている契約書はあります。

副業の場合は、本業の社員としての仕事に対して、競業避止違反が発生するため損害賠償請求されます。

会社の場合は、仕事を受けた担当者は週５で入っていても、他の社員は他の案件を対応しているので、こちらも競業避止違反になり、損害賠償請求されます。

状況が該当される方は、端的に言うと、そういう契約書が来た時点でお付き合いを辞めるのが良いかと思います。

もちろん、みんなで声を上げるという選択肢もありますが、無くならないのは、契約する側も契約書をちゃんと読んでないからだと感じるので、やっぱ無くならないと思います。

著作権に関しても、契約後問題の声を上げる方もいらっしゃいますが、根深い話だと思います。


## [PR]起業・転職・フリーランス・プログラミング研修・エンジニア採用コンサルティングのご相談


https://park.jp/service_menu/2491


- 60分の人生相談を行っております。
- 企業の方は初回限定割引はご利用できません。
- 企業向けDXコンサルティングは年間契約でお受けしております。
[備忘録] Docker + Postgres環境での共有メモリ不足によるエラー

:::note warn
こんなことがあったよという自分への備忘録なので、雑です。
:::


## 結論
Dockerのコンテナはデフォルトでは共有メモリサイズが64mbしか割り当てられない。
コンテナ立ち上げ時に`--shm-size`オプションで割り当てる必要があった。

## 経緯
Dockerを使い、Pythonコンテナ、Postgresコンテナ、Grafanaコンテナをそれぞれ立ち上げ、Pythonで処理したデータをPostgresへ格納し、Grafanaで表示させていた。

100msecデータであったため、Grafanaで表示する際に時間幅を広くとるなどを行うと、グラフ表示まで時間がかかるというような課題があった。

パフォーマンスチューニングに関する記事を見つつPostgresの設定値を変えるも、特に効果が無く見えた。
（この時点で感づくべきだった）

そして、チューニング後から、１日に３～５回程度ではあるが`could not resize shared memory segment <中略> No space left on device`といったエラーが確認されるようになった。

## 推測
深追いしていないので推測にはなるが、64mbしか割り当てられていないに関わらず、Postgresの設定値変更により、デフォルト設定値よりも多くのメモリ確保を行うようになっていたため。
キューブサットミッション開発に使える！Raspberry PI + Python 組込 S/W入門

千葉工業大学Gardensももう気が付けば5回目のシーズン
RPI + Pythonの取り掛かりとして、思い付きで渡していた課題をまとめました。
ミッションに使用するAPIは最低限これでできてます。あとはアルゴリズムとシステムとのいんたふぇー
まずはお題から、使用するコードなどはこれから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/e554b7b5-3769-4187-8c1f-7dd4c288816b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/19257dba-b230-46b1-a0c7-9b5d24c250f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/ba17a440-01b9-42c7-a513-2b2022f567c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/ba29338d-dffa-47c8-a213-82f962bea59b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/c0ffcf74-9aec-491a-b345-9a2ddbbcd66c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/4af6559f-0da7-4a12-85e1-755e5197f8ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/815ea17f-07e7-4378-8f02-7581db28ff32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940627/8f3e6c28-ed8e-4694-a12b-6508ed4e164c.png)
UnrealEngineで選択したアセットを右クリックメニュー1発でマップに配置する

UnrealEngineのコンテントブラウザにおいて以下のようにアセットを選択して右クリックメニューから選択すると所定のマップにアセットを配置（位置は原点）できるようにしてみたのでやったことをメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/2f1452b9-f565-4a2d-a699-84204f0c8d3b.png)

# 環境
UE5.3.2

# 参照サイト

EditorScriptingUtility系の機能一覧があるのでどのような機能があるか確認しています。

https://kinnaji.com/2022/03/14/deprecated-esup/

AssetDataからSpawnActorFromClassのためのClassを取得する方法を参照しました。

https://forums.unrealengine.com/t/spawnactor-from-asset/747279/17

# やったこと

AssetActionUtilityを継承したBPクラスを作成して以下のような関数を作成しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/4ea5e761-d7dc-bf67-2291-4430b40368bc.png)