OmniAICreator/Qiita-1.07M huggingface dataset:
入金不要ボーナスの期待値を自動で計算するシミュレーション方法

## はじめに
カジノのプロモーションの一つである入金不要ボーナスは、プレイヤーに対してリスクなしでゲームを試す機会を提供します。このボーナスは、新規プレイヤーの獲得や既存プレイヤーの再活性化を目的として提供されることが多いです。本論文では、入金不要ボーナスの期待値を自動で計算するシミュレーション方法について説明します。

## 期待値の概念
期待値とは、あるランダムな変数の取りうる値にその確率を掛け合わせた総和を意味します。カジノにおける期待値計算では、プレイヤーが得られる平均的な収益を予測するために使用されます。具体的には、各ゲームの払い戻し率（RTP: Return to Player）やボーナスの賭け条件を考慮する必要があります。

## シミュレーションの基本原理
シミュレーションは、ランダムな変数を使用して実際のプレイ状況を再現する方法です。以下の手順でシミュレーションを構築します：

**初期設定：**

- ボーナス金額
- 賭け条件（例：ボーナス額の何倍を賭ける必要があるか）
- RTP（Return to Player: プレイヤーに戻る割合）
- プレイのシミュレーション：

**各スピンやゲームの結果をランダムに生成**

- 賭け金額と勝敗に基づいて残高を更新
- シミュレーションの反復：

**上記のプロセスを多数回繰り返し、期待値を計算**

## 入金不要ボーナスの期待値計算

**ステップ1：初期設定**
まず、シミュレーションの初期設定を行います。入金不要ボーナスが$10で、賭け条件が30倍であると仮定します。つまり、プレイヤーは$300を賭ける必要があります。さらに、RTPが96%であると仮定します。

**ステップ2：プレイのシミュレーション**
次に、各プレイのシミュレーションを行います。各スピンやゲームの結果は、RTPに基づいてランダムに生成されます。例えば、スロットゲームの場合、RTPが96%であれば、長期的にはプレイヤーは賭け金の96%を取り戻すことが期待されます。しかし、各スピンごとの結果はランダムです。

```ruby:プレイのシミュレーション
import random

def simulate_spin(rtp, bet_amount):
    return bet_amount * (random.random() < rtp)

# 設定
bonus_amount = 10
wagering_requirement = 30 * bonus_amount
rtp = 0.96
spin_cost = 1

# シミュレーション
balance = bonus_amount
spins = 0

while balance > 0 and spins < wagering_requirement:
    result = simulate_spin(rtp, spin_cost)
    balance += result - spin_cost
    spins += 1

```
**ステップ3：シミュレーションの反復**
このプロセスを多数回繰り返すことで、期待値を計算します。1000回のシミュレーションを行い、その平均結果を期待値として求めます。

```ruby:シミュレーションの反復
def simulate_n_times(n, rtp, bonus_amount, wagering_requirement):
    total_balance = 0
    for _ in range(n):
        balance = bonus_amount
        spins = 0
        while balance > 0 and spins < wagering_requirement:
            result = simulate_spin(rtp, spin_cost)
            balance += result - spin_cost
            spins += 1
        total_balance += max(balance, 0)
    return total_balance / n

# 1000回シミュレーション
expected_value = simulate_n_times(1000, rtp, bonus_amount, wagering_requirement)
print(f"Expected value: ${expected_value:.2f}")

```

## 結果の解釈
このシミュレーションを通じて、プレイヤーが入金不要ボーナスを使った場合の期待値を算出することができます。具体的な数値はボーナスの条件やゲームのRTPによりますが、シミュレーションによって得られた期待値は、プレイヤーが長期的にどの程度の収益を得られるかの指標となります。

## 結論
入金不要ボーナスの期待値を自動で計算するためのシミュレーション方法を紹介しました。この方法は、プレイヤーが得られる平均的な収益を予測するために有効であり、カジノのプロモーション効果を評価する際に有用です。今後の研究では、より複雑な賭け条件や多様なゲームタイプを含むシミュレーションを検討することが考えられます。

入金不要ボーナスについては
[入金不要ボーナス転生！](https://www.pixiv.net/novel/show.php?id=22334655)-pixiv
[入金不要ボーナスの起源](https://note.com/coacjp/n/n56e3e4178869)-note
[AIを使った入金不要ボーナスの最適運用](https://zenn.dev/coac/articles/6770e232e583bd)-Zenn
[入金不要ボーナスの勝率を最大化する方法](https://anond.hatelabo.jp/20240609231621)-はてな匿名ダイアリー
[入金不要ボーナス](https://coac.jp/no-deposit-bonus/)-カジノガイド
[オンカジ入金不要ボーナス](https://www.mahou.co.jp/oncasi/no-deposit-bonus/)-魔法の教科書
で詳しく説明されています。
生成AIパスポート受験記

6月2日に「生成AIパスポート試験」を受験しましたので試験の振り返りを残しておきます:writing_hand:
私の体験がみなさまの学習の参考になれば幸いです:hatched_chick:
# :point_up:生成AIパスポートとは
生成AIパスポートとは　一般社団法人生成AI活用普及協会（GUGA）が発行する生成AIに関する基礎知識を習得するための認定試験です。

https://guga.or.jp/generativeaiexam/

### 試験の概要
- 名称：生成AIパスポート試験
- 開催形式：オンラインでの実施（IBT方式）
- 試験時間：60分
- 問題数：60問
- 出題方式：四肢択一方式
- 出題範囲：シラバスより出題
- 受験費用：11,000円（税込）※「学生」の場合は5,500円（税込）

第一回の生成AIパスポートの合格率は **73.7%** ということで比較的優しめという印象ですが、新しい試験のためあまり情報が無く油断はできないですね。
試験はIBT方式のため申込みをした試験期間内であれば好きなタイミングで自宅で受験することができました。

# :pencil2:勉強時間と勉強方法
試験1週間前からテキストを読み始め だいたい6時間ほど 勉強時間に費やしました。
勉強方法はすごくシンプルで3つのことを行いました。

- テキストをまず1周 疲れない程度に読む
- 問題集を解き間違えた問題に関する部分のテキストを読み返す（ここはしっかり頑張る）
- 試験1時間前にひたすらAIクイズアプリを周回

ありきたりですが、まずはテキストをなんとなく理解すること！そしてそのあとはひたすら詰め込む！という力技でした:muscle:
振り返ると結構効率よく勉強できたのではないかと思います。

### テキスト&問題集
短時間で かつストレスなく勉強ができたのは使用した教材がよかったからだと思っています。私が活用した推しテキスト、問題集はこの2つです。

**生成ＡＩパスポート テキスト&問題集** 
![生成AIパスポート問題集](https://pub.jmam.co.jp/images/book/638494.jpg)
[https://amzn.asia/d/5hG9oh2](https://amzn.asia/d/5hG9oh2)

こちらはテキストだけでなく模擬問題が60問ついているため試験の感覚をつかむことができ、テキストの内容もコンパクトにまとめてあるおかげで効率よく学ぶことができました。  

**生成AIパスポートAIクイズアプリ**
<img width="300" src="https://guga.or.jp/wp-content/uploads/2024/05/FIX_AI%E3%82%AF%E3%82%A4%E3%82%BA%E3%82%A2%E3%83%97%E3%83%AA_KV.png">

[https://lin.ee/5DcgWty](https://lin.ee/5DcgWty)
こちらは試験直前に発見し使用してみました。〇✕クイズになっていて完全に暗記用だなぁと舐めていましたが、60分60問というタイトな試験時間の中で **「このワードが出てきたらこう回答する」** と瞬間的に判断できるようになったのは試験中の心の余裕につながりました:star2:
# :lifter_tone3:試験を終えて
問題の内容としては、テキストに沿った基礎知識を問う問題で構成されていたように感じます。しかし結構見落としていた部分が出題されたので反省点が残りました。そんな私の反省点をこちらに残しておきます:writing_hand:

- 太字 はやっぱり大事だった
- 派生モデルはどのモデルからの派生か 流れと特徴をセットで把握する（**とっても大事**）
- 基本理念、社会原則、ガイドラインはなかなか覚えずらいが丸暗記でもなんでもするべき
# :ramen:　〆

試験勉強といえど、生成AIが生活の一部になりつつある中、コンプライアンスに関わる個人情報や、著作権侵害、商用利用可否などに関しては生活する中で必須ともいえる知識だと感じました。
まだ新しい試験のためなかなか情報が見つからず勉強法に不安を感じながらの受験になりましたのでこれから受験される方の参考になればと思います:sunny:
Rust のインストールを選択なしで行う

## これは何？

Rustのインストール時にYes/Noの選択やインストールタイプの選択を省略し、すべてデフォルトでインストールする方法を見つけたのでメモします。

## 対象とする読者

- Rustのインストールで一々選択肢を指定したくない人
- CIのジョブでにRustのインストールをヘッドレスに行いたい人

## 環境

- Ubuntu 22.04　
- Rust 1.75.0

## 解決方法

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y　-q
```

公式で案内されてるスクリプトの最後に```-s -- -y```を追加するだけ。

## 解説

[公式のインストールスクリプト](https://sh.rustup.rs)(rustup-int.sh)をダウンロードして読むと45行目辺りに以下のような事が書いてある

```
  -y
          Disable confirmation prompt.
      --default-host <default-host>
          Choose a default host triple
      --default-toolchain <default-toolchain>
          Choose a default toolchain to install. Use 'none' to not install any toolchains at all
      --profile <profile>
          [default: default] [possible values: minimal, default, complete]
```

どうやらオプションで-yを指定すれば、すべてデフォルトでインストールしてくれるらしい
あとはこれをshの引数に渡せば良いだけ。

以上
windows11にrubyをインストールしてVSCodeのターミナルに認識させる

## 初めに

後輩のwindowsPCにrubyを導入することになった。
元々macでしかrubyを触っていなかったのでサポートすることに。
意外と凡ミス箇所があったので備忘録に残す。

## rubyをインストール
Ruby Installerからrubyをインストール。
https://rubyinstaller.org/downloads/

WITH DEVKITの最新バージョンを選択。
（devkit、windowsの環境は必要らしい）

ダウウンロードしたものは基本
全てacceptかapproveを選択。ディレクトリもいじらなくていい。

進めていくとcmdに飛ぶ

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333537303132372f36646234313833302d336263622d386132322d383231342d6462623366383938323139322e6a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551561/c68709e8-11c9-26f4-4da1-cc3d0f2a369c.jpeg)

1か3の選択肢は1か3を入力しエンター。
それ以外は何も入力せずエンター。

んでcmdが閉じたら完了。

自身のPCのコマンドプロンプトを開いて
ruby -v
でバージョンが通ってたらOK

## VisualStudioCodeでruby-vが出なかった
さっそくvisualstudiocodeを立ち上げターミナルから
ruby -v
をすると

**rubyなんてないよ！**

と言われてしまった。
（rubyがVSCode内のターミナルで認識できなかったっぽい）

## 原因はPATHを指定していなかったから
PATH・・・どっからでも呼べるようにする設定。

普通にやってたら基本は起こらないことっぽいが自分の場合はPATHが入ってなかったっぽい。

windowsの環境設定から
**「システム」ー＞「バージョン情報」**
or
**「システムプロパティ」**
を選択

そして
**「システムの詳細設定」**
をクリック

![スクリーンショット 2024-06-07 000451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551561/bedec5f9-5d02-3116-5d65-577e5556787f.png)



![スクリーンショット 2024-06-07 000841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551561/cab15801-7a20-b3c7-fdd6-d92b0e50575f.png)

環境変数をクリックし、
ユーザー環境変数の
「編集」ボタンがあるからそこをクリックして
「新規」ボタンを押して自分のrubyがインストールされてるとこを指定する。

だいたいは
C:\Ruby33-x64\bin
でいいと思う。
（場合によってはシステム環境変数にも同じ感じで登録する必要あるかも。上記できなかったらこっちもしてみるといいかも）

これでVSCode側からも
ruby -v
が返ってくる。

## おまけ
環境変数でPATH設定したのに入らないという方、
VSCode含めたターミナル、コマンドプロンプト全部閉じてもっかい開いてみ。それで反映される。（これに気付かず30分さまよった）
Balanced Parentheses（括弧の対応検査）

## 問題

３種類の括弧 ( ),{ },[ ]からなる文字列について，以下の条件を満たすか否かを判定したい．

+ 同種の括弧同士が，必ず閉じている

+ 具体例
⭕️：()  ,([ ]) , { } [ ],　([ ] {[ ]} )
❌：( ,   [[[,   {),    ([{ ])

## 発想
+ かっこのペアを打ち消しあって，全てなくなったらOK
+ 左から順にスタックにpush➡️打ち消しあったらpopを繰り返し，スタックが空になればTrueを返す

## コード例（Python）
```python
from collections import deque

def judge_balance(S):

    stack=deque()
    
    for c in S:

        # スタックが空でなければ，整合性を検査
        if stack:                
            if stack[-1]=='(' and c==')' :
                stack.pop()
            elif stack[-1]=='[' and c==']' :
                stack.pop()
            elif stack[-1]=='{' and c=='}' :
                stack.pop()
            else:
                stack.append(c)
        # スタックが空ならば要素を追加
        else:
            stack.append(c)
        
        

    #　最終的にスタックが空でなければ，正しくない括弧列，空なら正しい括弧列
    if stack:
        return False
    else:
        return True


S=input()
if judge_balance(S):
    print("Yes")
else:
    print("No")
```
AsteriskにBluetoothでスマホを収容したけど片通話が直せなかった件

AsteriskとFreePBXでIP電話を構築して運用しているが、これにBluetoothでスマホが外線発信トランクとして登録できるよ、という記事を見かけたので早速マネしたが結局ダメだった顛末です。

〇環境

・Raspberry Pi 3B(RaspberryPi OS Bullseye)
・FreePBX16
・Asterisk 20.5.2
・IP電話機　CISCO IP PHONE SPA303
・iPhone SE(3rd generation)
・Bluetoothドングル　tp-link UB500

〇元記事

https://qiita.com/kmorimoto/items/3390c7c6565fcf249dfd

執筆者：kmorimotoさま


〇結論
元記事を参考にさせていただき、Asteriskにchan_mobileモジュールを組み込んだ。結果、発信自体は可能だったが、こちらの音声が相手に伝わらないいわゆる「片通話」状態となったが、直せなかった。


〇反省とメモ

・FreePBX環境の場合、直接configファイルを操作してはいけない。

・が、/etc/asteriskディレクトリにchan_mobile.configファイルがないと、Asterisk CLIで使用するmobile searchやmobile show devicesなどのコマンドが実行できないので、予めconfigファイルだけ作成し、アダプターの情報を入れておく必要があるようだ。
その後、FreePBXの管理ページに入り、[アドミン]→[Config Edit]から、chan_mobile_custom.confファイルを作成し、必要な情報を記述していくのが正しい……のか？

・sangomaのFreePBXフォーラムでもかーなり検索してみたが、類似の状況に遭遇している方はおられなかった。

お手上げとなったので、当面保留とする。
PHP の論理積 (&&) の短絡評価で null check しつつ bool を返す

# はじめに

PHP は `if` 文に `null` 入れると `false` を返してくる。
そんな中、null check して、`null` なら `false`、`null` じゃなかったら関数を実行するコードがあり、何も不思議に思わなかったが IDE がもっといい書き方あるぜって言ってきた。
```php
$is_smartphone = $client_type ? $client_type->isSmartphone() : false;
```

自動変換してもらったらこうなった。
```php
$is_smartphone = $client_type && $client_type->isSmartphone();
```
.....。
null check どこいった？`false` どうやって入る？って思ってちょっと調べた。

追記: 記事最下部に PHP 8.0 以降の書き方も紹介しています。


# PHP の論理積 (&&)

どうやら PHP では、左の評価をして否定されたら終わるという実行形式らしい。これ**短絡評価**っていうみたい。
PHP では `null` がきたら `false` で返してくれるので、左側に null check を置くことができる。

```PHP
$classVar = null;

// $classVar = null は false になるなので、
// 短絡評価により$classVar->isVar(); は実行されない。
$var = $classVar && $classVar->isVar();
// $var = false となる
```
```PHP
$classVar = new ClassVar(true);

// $classVar は true になるなので、
// 短絡評価は関係なく $classVar->isVar(); が実行される
$var = $classVar && $classVar->isVar();
// $var = true となる
```

つまり、左側に `null`、つまり `false` になると右が実行されないので、実質的に null check できるのである。

https://qiita.com/fujita-goq/items/9e115cd14adc1b3bd593#%E8%AB%96%E7%90%86%E7%A9%8D%E8%AB%96%E7%90%86%E5%92%8C%E3%81%AE%E8%A9%95%E4%BE%A1%E3%81%AE%E6%8C%99%E5%8B%95


# おわり
null check した上で関数などの bool 値を評価したいときは、短絡評価を上手く使ってやるときれいに書けそう！
```php
// before
$is_smartphone = $client_type ? $client_type->isSmartphone() : false;

// after
$is_smartphone = $client_type && $client_type->isSmartphone();
```

# 追記 (24/06/07)
PHP 8.0 以降であればこのような書き方ができるので、合わせて抑えておきましょう！
(@dgcdsbsd2 , @YuneKichi, @haikara さんありがとうございます！( \*･ω･)*_ _)))
```PHP
$is_smartphone = $client_type?->isSmartphone() ?? false;
```

<details>
<summary>検証してみたのでコードも合わせて置いておきます。</summary>

```PHP
<?php
class ClassVar {
	private bool $isVar;
	public function __construct(bool $isVar){
		$this->isVar = $isVar;
	}
	public function isVar(): bool {
		return $this->isVar;
	}
}

function println(string $str, string $type, mixed $bl): void {
	print_r("$str ($type): ");
	if ($bl === true) {
		print_r("true");
	} else {
		print_r("false");
	}
	print_r("\n");
}

// --
// 1: 短絡評価 (エラーなく true/false が入る) (?int だとバグる可能性あり)
// 2: PHP 7.0~ の ?? のみ (2 行必要になりそう (null check → メソッド実行))
// 3: PHP 8.x~ の ?-> のみ (null のとき NULL 型が入る)
// 4: ?-> と ?? をあわせる (PHP 8.0 以降なら一番良いかも？)
// --
$classVar = null;
$res = $classVar && $classVar->isVar();
println("null 1", gettype($res), $res);
// null 1 (boolean): false

$res = $classVar->isVar() ?? false;
println("null 2", gettype($res), $res);
// Fatal error: Uncaught Error: Call to a member function isVar() on null

$res = $classVar?->isVar();
println("null 3", gettype($res), $res);
// null 3 (NULL): false

$res = $classVar?->isVar() ?? false;
println("null 4", gettype($res), $res);
// null 4 (boolean): false


$classVar = new ClassVar(true);
$res = $classVar && $classVar->isVar();
println("new 1", gettype($res), $res);
// new 1 (boolean): true

$res = $classVar->isVar() ?? false;
println("new 2", gettype($res), $res);
// new 2 (boolean): true

$res = $classVar?->isVar();
println("new 3", gettype($res), $res);
// new 3 (boolean): true

$res = $classVar?->isVar() ?? false;
println("new 4", gettype($res), $res);
// new 4 (boolean): true
```
</details>
【Python】「Swiftのアレ、Pythonだとどうだっけ」を自分なりに

# 誰？
基本的にpythonを書いているものです。
SwiftでiOSアプリ開発の経験も少しあります。
元からpythonメインだったのですが、仕事の関係でSwiftメインになり、またpythonに戻ってきました。

# 何を思ってこの記事を？
長いことpythonを離れてSwiftを書いていたら、Swiftチックな考えが残ったままPythonを書くことになっています。
戻ってきてすぐは、Swiftの文法は思いつくのにpythonの書き方が思いつかなかったりしました。
そんな自分が、「Swiftのアレ、Pythonだとどうだっけ」と思って自分なりに出した答えを書いておこうと思います。
全部は網羅しきれないので、思いついたものを書いていきます。思いつかなくなったらそこで筆は止まります。
また、これが本当に正しいとは限りません。


:::note warn
基本的には、Swift→pythonに書きなおすので、逆はしません。
独断と偏見と深夜テンションです。
間違っていたり、内容が薄っぺらい可能性があります。
こんなもん、何をいまさら偉そうに語っとんねん。的なことは怖いので言わないでください。
:::

- - -
### 1. if let x = ~~
**swift**
```swift
// self.getResult() -> String?

if let result = self.getResult() {
    // ここではresultが非Optional
}
```

**python**
```py
if result := self.get_result():
    # ここではbool(result)=True
```
Swiftでは結果がOptionalかどうかを見て、PythonではFalseになるかどうかで見る。
注意としては、こんなケースがある。
・DBがNULL許容のVARCHARで、その値がNULLでなければhoge処理をしたい
　-> 空文字列のときにhoge処理をしてもいいか？を考えないといけない


### 2. guard let (条件) else ~~
**swift**
```swift
guard let isAvailable else {
    // 現在までの状態をStateに反映しておく
    self.setState(currentState)
    return
}
```

**python**
```py
if not is_available:
    self.set_state(current_state)
    return
```
それはそう。

### 3. if let (変数) = (型不明な変数) as? (型) ~~
**swift**
```swift
struct MainModel: BaseModel
struct DetailModel: BaseModel
struct RelationModel: BaseModel

if let state = state as? MainModel {
    // stateをMainModelとして扱う
}

if let state = state as? BaseModel {
    // stateをBaseModelとして扱う
}

```

**python**
```py
class MainModel: BaseModel
class DetailModel: BaseModel
class RelationModel: BaseModel

if type(state) == MainModel:
    # stateはMainModelを継承している

if isinstance(state, BaseModel):
    # stateはBaseModelを継承している、もしくは継承したクラスを継承している
```
pythonに慣れてたら「そうだね」ってなるけど、Swiftに慣れてると「めんどう」ってなる。
他に良い書き方があるかもしれないけど、パッと思いつくのはこの様な形。


### 4. let (変数) = (Optional変数) ?? (変わりの値)
**swift**
```swift
let number = getNumber() ?? Int64(-1)
```

**python**
```py
number = get_number() or -1

number = -1 if (_number := get_number()) == None else _number
```

pythonコードの上の方はboolキャスト時にFalseになる値が返ってきたら対応できない。
Noneが返って来るとか、空リストが返って来るとか、そもそもFalseになる値が返ってこないとか、
そういうのが分かってなければ下のを使った方が良い。

- - - 
## おわり？
意外と思いつきませんでした。
なにか思い出したら追記しようと思います。
書き換えとは違うんですが、delegateとかDispatchQueueとかProtocolとか、あんまりPythonで使われない概念をPythonではどうしてるか、みたいなのも書こうと思いました。
でも~~めんどくさくなった~~うまく書ける自信が無かったのでやめておきます。
そもそも非同期苦手だし・・・。
ラベル名対応したclassification_report

以前にclassification_reportをデータフレーム化する記事を書きました。

https://qiita.com/murasaki1994/items/ee229b7abc0e1b4a7d1f

今回はこの記事で作った関数をさらに改良したものを作ったので書いてみようと思います。
改善点としてはラベル(文字列)に対応する内容になっています。具体的な内容は使用例をご覧ください。

# 関数
```Python3
import pandas as pd
def classification_report_dataframe(y, y_pred, label=None):
    rep = classification_report(y, y_pred, output_dict=True)
    dst = []
    index = []
    for col in rep:
        if col == "accuracy":
            index.append(col)
            dst.append(["", "", rep["accuracy"], rep["weighted avg"]["support"]])
        elif col != "accuracy":
            dst.append([rep[col]["precision"], rep[col]["recall"], rep[col]["f1-score"],rep[col]["support"]])
            if label == None:
                index.append(col)
            elif label != None:
                try:
                    index.append(label[col])
                except:
                    index.append(col)
        
    df_rep = pd.DataFrame(dst)
    df_rep.index = index
    df_rep.columns = ["precision", "recall", "f1-score", "support"]
    return df_rep, index[0:-3]
```

## 使用例
ここではScikit-Learnにある実データで顔認識のデータを使います。元々目的変数は数値ですが、他にもその顔の人の名前も載っています。
```Python3
from sklearn.datasets import fetch_lfw_people
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix

faces = fetch_lfw_people(min_faces_per_person=60)
x = faces.data
y = faces.target

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

model = LGBMClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)

y_list = list(set(y))
lists = {}
for i in y_list:
    lists[str(i)] = faces.target_names[i]
df_rep, index = classification_report_dataframe(y_test, y_pred, label=lists)
df_rep
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/4ce2d12d-598b-9603-b979-ac87f5b59b39.png)
まずこんな感じに名前が反映されます。
```Python3
df_cm = pd.DataFrame(confusion_matrix(y_test, y_pred))
df_cm.index = index
df_cm.columns = index
df_cm
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/e7718246-a6b2-bbe8-82e2-4aadfbdb12b5.png)
混合行列を作る際に必要なインデックスとカラムも関数で作られますのでそのまま使えます。
【Jaspersoft Studio】マイナス値が発生した場合に文字色を自動的に赤文字にする方法。

## 使用環境
Windows 10 Pro (64bit)
Jaspersoft® Studio 6.21.2 

## はじめに

![00001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/4aae1986-fb94-b4f6-040b-3e27d4d1d37d.png)

財務や売上の帳票を作る際に、特に数字に関しては下記の2パターンで印字させるのが一般的です。

- プラス値は黒文字
- マイナス値は赤文字

Jaspersoft Studioで、これらを自動的に切り替え印字する方法をご紹介します。

上表のデザイン画面は、下図のようになります。


![0000111.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/7548bd6b-3d9a-f531-84b6-960225c8823f.png)

---

### 参考資料

How To Change Negative Values Font Color in Jasper Report | iReport | Jaspersoft Studio
https://www.youtube.com/watch?v=UH3aXsE77ZY

---

### StyleとConditionalの作成

①　デザイン画面の「アウトライン」のタブで、Styleを右クリックし「Create Style」を選択します。

ここでは「Style1」という名前で定義します。 （Style1はすべてデフォルトのままでOKです。）
 
![00002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/1d1709c1-0c5d-66eb-58c5-b038b847a8e5.png)
---

②　さらに「Style1」を右クリックし、「Create Conditional Style」を選択します。

![00003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/bd31ff58-6ce0-e2fe-9601-a648f2d9a5b1.png)

---
③　Conditional Styleは「Appearance」「Border」「Style」「Advanced」の4つのタブがあります。
「Advanced」は今回スルーします。

下図のようにタブごとの設定を行います。

![00004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/70cee38f-ccea-cd4a-d8bf-59fea99aa6b8.png)

「Appearance」で、赤色を選択した場合、「Border」も追随して赤色に変更されてしまうので、黒を必ず指定します。

「Style」で設定するポイントは、赤文字に変更するための条件式を定義します。
今回のターゲットは、フィールド「`$F{売り上げ}`」ですので、「`$F{売り上げ}`」が負の場合の条件式を入れるだけです。

---
### Styleとフィールドとの紐づけ

④　フィールド「`$F{売り上げ}`」のプロパティで、Style欄のプルダウンで、上記②で作成した「Style1」を適用して完了です。

![00009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/1f1a46e0-a9e6-70f5-0a52-7642f2e8662b.png)



---

### 設定後のプレビュー

![00010.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877807/f4928a3c-debd-518b-2d11-81f5d0f6079c.png)



---
以上
MAMPの初期設定時にphpMyAdminのパスワードなしに設定して入れなくなってしまった話

こんにちは、プログラミングが楽しくてハマっている KoenigWolf です。
まず初めに、このページを訪れてくれてありがとうございます。

この記事を読むあなたがこのページを読んでいるということは、上記のErrorにつまづいてしまったんではないでしょうか？

今回はMAMPを使っていて遭遇したphpMyAdminへのアクセスErrorの解決方法をシェアしたいと思います。

最初はどうしようもないと思っていたのですが、試行錯誤の末に解決できたので、同じような問題に直面している方の参考になれば幸いです。

# Error内容
:::note alert
mysql_upgrade: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) while connecting to the MySQL server
Upgrade process encountered error and will not continue.
:::

アンインストールしてインストールしなおしたほうが早いのではないかと思いました。
しかし、諦めずに一箇所一箇所ファイルを確認した結果、全体構造を理解できました。
努力して解決できて本当に良かったなと思いました。
では、何が起こったのかを流れに沿ってお話ししていきますね。

# 1. phpMyAdminでの設定変更
まず、MAMPのWebページにアクセスし、phpMyAdminに入りました。UI上でパスワードを「なし」に変更したのですが、これが問題を引き起こしました。アクセスできないエラーが発生したのです。調べたところ、新たにphpMyAdmin5というフォルダが作成されていることに気づきました。

# 2. config.inc.phpファイルの編集
”/Applications/MAMP/bin/phpMyAdmin5/config.inc.php”をVS Codeで開き、次のような項目が見つかりました。

```
$cfg['Servers'][$i]['password'] = ''; // MySQL password (only needed
```

パスワードを「なし」に設定したため、アクセス時にパスワードの入力が必要だったことがエラーの原因でした。

そこで、次の行を追加してパスワードなしでのアクセスを許可しました。

```
$cfg['Servers'][$i]['AllowNoPassword'] = true; // パスワード無しを許可
```

合わせると以下のようになります。

:::note info
$cfg['Servers'][$i]['auth_type']     = 'config';    // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user']          = 'root';      // MySQL user
$cfg['Servers'][$i]['password']      = '';          // MySQL password (only needed
$cfg['Servers'][$i]['AllowNoPassword'] = true;      // パスワード無しを許可
:::

# 3. MAMPの再起動
この変更を行った後、MAMPを再起動しました。
すると、無事にphpMyAdminにアクセスできるようになりました。

これで設定は完了です。

MAMP → OpenWebSitePage → Tools → phpMyAdminで、データベースにアクセスできます。

# まとめ
このエラーの解決には約3時間かかりましたが、無事に問題を解決することができました。
また、この経験を通じてエラーを解消できたことに大きな達成感を感じました。
エンジニアとしての重要な視点も学ぶことができ、どんな問題でも解決の糸口さえ見つかれば、それが学びに繋がることを実感しました。

今回の経験を通して、問題解決能力だけでなく、自分自身のスキルも向上したと感じています。
同じような問題に直面した方が、この情報を参考にして解決できることを願っています。
【VSCode】絵文字が正しく表示されない場合の対処法

VSCodeで以下のように一部の絵文字が意図したとおりに表示されませんでした。

![スクリーンショット 2024-06-06 23.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/7fdf1c92-ad3e-1830-2da7-e85dcc76a7bb.png)

`editor.fontFamily` に `Apple Color Emoji` を追加したところ正常に表示されるようになりました。

```settings.json
  "editor.fontFamily": "'Moralerspace Argon JPDOC', 'Apple Color Emoji'",
```

![スクリーンショット 2024-06-06 23.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/126ceeee-8106-f336-0123-f60a5d364cdc.png)

## 参考

https://qiita.com/wraith13/items/7d8072ef7a5e57de6f5a
ルーティングテーブルの確認

# はじめに
ルーティングテーブルとは、パケットを宛先IPアドレスに到達させるために用いられる対応表である。今回はネットワークの勉強をしている際に、デフォルトルートについて気になったので、ルーティングテーブルを確認してみようと思いました。

# デフォルトルート
デフォルトルートとは、ルータやホストがルーティングテーブルに存在しない宛先のIPアドレスを転送するときのための経路です。つまり、家庭用のルータを使ってPCをインターネットに接続しているとき、ホストマシンのデフォルトルートには家庭用ルータのIPアドレスが指定されているはず。。。それを今回は確認したいのです。

# ルーティングテーブル確認コマンド
以下コマンドでホストマシンの経路制御表を確認できます。
```
netstat -r
```

# 結果
結果は以下のようになっていて、家庭用のルータが指定されていました。予想通り。。以上です。

![スクリーンショット 2024-06-06 23.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/febc5505-7b59-58b9-be72-a8f09773fd45.png)


# 参考文献
* [Netstatコマンドとは。その概要やオプション、使える場面は？](https://www.winserver.ne.jp/column/about_netstat/)
powershell

共通関数などを格納しておくファイル
```Powershell:MyClass.psm1:ps1

class MyClass {
    [bool]$initialized = $false

    MyClass() {
        # 初期化処理
        if (-not $this.initialized) {
            Write-Output "Initializing..."
            Start-Sleep -Seconds 2 # Simulate some initialization work
            $this.initialized = $true
        }
    }

    [void] RunTask1() {
        if (-not $this.initialized) {
            throw "Instance not initialized. Call the constructor first."
        }
        Write-Output "Running Task 1"
        # 実行処理1
    }

    [void] RunTask2() {
        if (-not $this.initialized) {
            throw "Instance not initialized. Call the constructor first."
        }
        Write-Output "Running Task 2"
        # 実行処理2
    }
}

# インスタンスを保持する変数を定義
$script:myClassInstance = $null

function Get-MyClassInstance {
    if (-not $script:myClassInstance) {
        $script:myClassInstance = [MyClass]::new()
    }
    return $script:myClassInstance
}
```

呼び出し方

```powershell:main.ps1

# モジュールをインポートします
Import-Module .\MyClass.psm1

# クラスのインスタンスを取得します
$instance = Get-MyClassInstance

# 実行処理を呼び出します
$instance.RunTask1()
$instance.RunTask2()

```
【Mac】コードを置くディレクトリはCaseSencitiveにしよう！

# CaseSencitiveとは？
CaseSencitiveとはアルファベットの大文字・小文字を区別することです。
逆に、大文字・小文字を区別しないことをCaseInsentiveと言います。

# なぜCaseSencitiveにすべきなのか？
実は、MacOs上ではアルファベットの大文字・小文字はデフォルトでは区別されず、「example.txt」と「Example.txt」が同一ファイルとして扱われます。
ほとんどの本番環境ではLinuxOsが動いている事が多く、LinuxOsでは大文字・小文字が区別されるため、区別されない環境で開発を行うとエラーの一因になってしまいます。
ローカルだときちんと動くのに本番だとエラーになるとか、その逆もまた然りです。
上記のことを踏まえて、プロジェクトを配置するディレクトリはCaseSencitiveで作成すべきかと思います。

# CaseSencitiveディレクトリの作り方
- Launchpad>その他>ディスクユーティリティを選択
- 右上の「ボリューム」項目で「＋」を押下
- 「APFSボリュームをコンテナに追加しますか?」と聞かれるのでお好みの名前を入力
- 「フォーマット」で「APFS（大文字/小文字を区別）」を選択して追加

# 最後に
誤り等ありましたらご指摘いただけますと幸いです！
【AWS】ECR に Docker Image をプッシュするとき認証エラーが発生したら


## 概要

`Amazon ECR` に `Docker Image` をプッシュするとき、
以下のような認証エラーが発生しました。

```
denied: Your authorization token has expired. Reauthenticate and try again.
```

この記事では、このエラーの原因と対処法について説明します。

## 原因

このエラーは、`Amazon ECR` への認証トークンが有効期限切れになっているために発生します。`AWS CLI` を使用して取得する認証トークンは、12時間の有効期限があります。長時間セッションを開いたままにしていると、このトークンが期限切れになり、`ECR` にアクセスできなくなります。

## 対処法

認証トークンを再取得して、`Docker` に再ログインすることでこの問題を解決できます。以下の手順を実行します。

１. 認証トークンの再取得

`AWS CLI` を使用して、新しい認証トークンを取得します。

```
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com
```


２. `Docker` にログイン

上記コマンドにより、`Docker` に再ログインされます。これで、`ECR` へのプッシュ操作を再試行することができます。


## まとめ

`Amazon ECR` への `Docker Image` のプッシュ時に発生する認証エラーは、認証トークンの期限切れが主な原因です。`AWS CLI` を使用して新しい認証トークンを取得し、`Docker` に再ログインすることで解決できます。
Arcブラウザ：Macユーザー必見！ChatGPT並みの衝撃。フリーランスの作業効率を爆上げする6つの理由

# Macユーザーのフリーランスよ、ChatGPT級の衝撃に備えよ！Arcブラウザで作業効率爆上げの6つの理由


## はじめに

こんにちは！フリーランスの皆さん、Macで快適に作業できていますか？今回は、ChatGPT並みに衝撃的で、フリーランスの作業効率を爆上げしてくれるWebブラウザ「Arc」をご紹介します。

「え、また新しいブラウザ？」と思ったそこのあなた！Arcはただのブラウザじゃないんです。まるでMacのために作られたかのような使い心地、直感的な操作性、そして豊富な機能で、あなたのワークフローを劇的に変えてくれること間違いなし。

今回は、Arcの6つの魅力的な機能に焦点を当てて、その実力を徹底解説します。

## Arcブラウザの6つの魅力的な機能

### 1. スペース：作業効率を最大化する、自分だけの仮想デスクトップ

[Image of Arc Browser's Spaces feature]

Arcの「スペース」機能は、複数のプロジェクトを同時進行するフリーランスにとって、まさに救世主。クライアントワーク、個人プロジェクト、情報収集など、用途に合わせてスペースを作成し、瞬時に切り替えることができます。まるで複数のMacを使っているかのような感覚で、作業に集中できること間違いなしです。

### 2. イーゼル：アイデアを逃さない、万能キャプチャ＆注釈ツール

[Image of Arc Browser's Easel feature]

「イーゼル」は、Webページをキャプチャして、自由に注釈や図形を追加できる機能です。クライアントからのフィードバックを書き込んだり、デザインのアイデアをスケッチしたり、アイデア出しのブレインストーミングにも最適です。キャプチャした画像は、PNGやPDFとして保存したり、チームメンバーと共有することもできます。

### 3. スプリットビュー：2つの情報を同時に確認、作業効率アップ！

[Image of Arc Browser's Split View feature, showing two web pages side-by-side]

「スプリットビュー」は、2つのWebページを左右に並べて表示できる機能です。

例えば、

- 左側にクライアントのWebサイト、右側に競合サイトを表示して比較
- 左側に仕様書、右側にコーディング画面を表示して作業

など、マルチタスクを効率的にこなすことができます。

### 4. ブースト：自分好みのWebページで、快適な作業環境を

[Image of Arc Browser's Boost feature, with customized font and colors]

「ブースト」は、Webページの表示をカスタマイズできる機能です。フォント、文字サイズ、行間隔、背景色などを変更して、自分にとって見やすい、快適な環境を作ることができます。

### 5. プロファイル：複数のアカウントを簡単に管理

フリーランスとして複数のアカウントを使い分けるのは、意外と面倒なもの。Arcの「プロファイル」機能を使えば、複数のGoogleアカウントなどを登録しておき、ワンクリックで切り替えることができます。

### 6. ショートカット：作業効率をさらに加速させる

Arcには、作業効率をさらに高めるためのショートカットが豊富に用意されています。

例えば、

- <kbd>⌘</kbd> + <kbd>T</kbd> ：新しいタブを開く
- <kbd>⌘</kbd> + <kbd>W</kbd> ：現在のタブを閉じる
- <kbd>⌘</kbd> + <kbd>L</kbd> ：アドレスバーにフォーカス

などの基本的なショートカットに加え、Arc独自のショートカットも多数あります。

これらのショートカットをマスターすれば、マウス操作を減らし、よりスムーズに作業を進めることができます。

## まとめ

Arcは、Macユーザーのフリーランスにとって、まさに「最終兵器」と呼ぶにふさわしいWebブラウザです。直感的な操作性、美しいデザイン、豊富な機能、そしてMacとの親和性の高さ。これらの要素が組み合わさることで、あなたのワークフローを劇的に改善し、生産性を飛躍的に向上させることができるでしょう。

ChatGPTがあなたの言葉を操るように、Arcはあなたのデジタルワークスペースを操ります。その衝撃を、ぜひあなた自身で体感してみてください。
scpコマンド

# はじめに
Linuxマシン1からLinuxマシン2へとファイルを転送したい時が時々あります。そんなときのための備忘録です。

# コマンド例
以下かコマンドを実行すれば送信できます。
```
sudo scp <送信ファイル> <ユーザ>@<linuxマシン2IPアドレス>:<保存したいパス>
```

# 参考
* [【Linux】scpコマンドの使い方 - Qiita](https://qiita.com/Jazuma/items/30e78b61fe7e1661f089)
Terraformのインストール方法メモ(Windows)

## はじめに
これから個人的な勉強としてTerraformを使っていこうとしていまして、まずはTerraformのインストールする方法をメモしておこうと思って記載します。

::: note warn
2024年6月6日時点の情報です。
PCはwindows11で実施しています。
:::

## ダウンロード
* 以下URLから「Download Terraform」をクリックします

https://www.terraform.io/

* 遷移すると、以下画像のような、Windows用のBinary downloadリンクがあるので、クリックしてzipファイルをダウンロードしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25162/d15c2022-4d9d-49c0-cdc8-3c6d92688624.png)

## インストール
* ダウンロードしたzipファイルを解凍してくだされば使える状態になっています
::: note info
参考までに…
上記でもう使える状態ですが、以下使いやすくします。
ただパスを通すだけなのでご存じの方は飛ばしてください。
:::
* 中にある「terraform.exe」を任意の場所に配置してください
(ここでは例として「C:\app」とします。)
* 「システムのプロパティ」から「環境変数」を開きます
    参考：システムのプロパティおよび環境変数の開き方
    * 「Windowsキー」+「R」で「ファイル名を指定して実行画面」を開きます
    * 名前のところに「sysdm.cpl」と入力して「OK」をクリックします
    * 「詳細設定」のタブをクリックし、「環境変数」をクリックします
* 「システム環境変数」の「Path」をクリックし、「編集」をクリックします
* 「新規」のボタンをクリックし、「C:\app」と入力します
* 「OK」ボタンをクリックして閉じます
* パスが通ってることを確認しますので、コマンドプロンプトを起動します
    参考：コマンドプロンプトの起動方法
    * 「Windowsキー」+「R」で「ファイル名を指定して実行画面」を開きます
    * 名前のところに「cmd」と入力して「OK」をクリックします
* 以下コマンドを入力してTerraformのバージョン情報が出れば完成です
```
terraform --version
```
CVSSスコアで脆弱性のチェックしよう

## はじめに
プロジェクトで作成するシステムはお客様にとって安心、安全でないといけません。
今回はプロジェクトにおける脆弱性の評価システムについてメモしていきます。

## プロジェクトの脆弱性に関連するCVSS

CVSS（Common Vulnerability Scoring System） とは、共通脆弱性評価システムと呼ばれる、
ソフトウェアやシステム上の脆弱性の深刻度を評価する国際的な指標です。
脆弱性が高いほどシステムが外部からの攻撃を受けやすくなり、データの損失や漏洩、システムのダウンタイム、金銭的損失などのリスクが高まります。

CVSSは以下のような目的で使用されます。
* 脆弱性の重要度を判断する
* 脆弱性対策の優先順位を決める
* セキュリティリスクを評価する
* セキュリティ対策の効果を測定する

CVSSにはメリットとして中立性、定量性、国際基準があります。
中立性では、ベンダや製品によって依存しない中立的な基準に基づいています。
定量性では、0.0～100.0の範囲で表されるスコアを用いることで、脆弱性の深刻度を定量的に表現することができます。

国際基準の点では世界中の組織で共通して利用できるため、異なる組織間で脆弱性情報を共有したり、セキュリティ対策を連携したりする際に役立ちます。

CVSSは「基本評価基準、現状評価基準、環境評価基準」の3つの基準で評価します。

### 基本評価基準
脆弱性の固有の特性を評価する項目です。具体的には、攻撃の難易度、影響を受けるコンポーネント、影響を受ける機密性、完全性、可用性などが評価されます。

### 現状評価基準
脆弱性が悪用される可能性や、悪用された場合の影響の大きさを評価する項目です。具体的には、公開されている期間、修正プログラムの入手可能性、エクスプロイトの成熟度などが評価されます。

### 環境評価基準
組織の環境やシステム構成によって脆弱性の深刻度がどのように変化するかを評価する項目です。具体的には、攻撃対象のネットワーク環境、影響を受けるユーザーの特権レベル、組織の依存関係などが評価されます。

### さいごに
IT製品において発見された脆弱性について[脆弱性対策情報データベース](https://jvndb.jvn.jp/)ではCVSSでの評価を掲示しています。

脆弱性の代表的な攻撃はSQLインジェクション、クロスサイトスクリプティング（XSS）、ゼロデイ攻撃があります。
組織全体でセキュリティ意識を高め、適切な教育や訓練を実施することも重要になってきます。
HTML　課題進捗

初めての投稿です:bow_tone1:

HTML、CSS、JavaScriptを細々と勉強し始め、いろんなアプリ、サイトへ登録していった後、現在は侍テラコヤさんへお世話になっております。


今回から、htmlの教材にある課題を1つずつ取り組み、その進捗など自分用ではありますが投稿していきます。
まずは以下のようなページ作成が課題となっているため、作成していきます。
![2024-06-06 224624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/75228949-d5d3-1fd8-2724-33bb161a18a8.png)

:point_up:ページタイトルの指定や文字コード指定がありますので、それを守りつつVS Codeで書いていきます。

![2024-06-06 225547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/31b5ec7d-d427-27f5-0006-86d892584447.png)

赤線部分は忘れていた箇所ですね！
毎日のように書かなければ忘れてしまい、いつも手元のノートをめくって確認してしまいます…

![2024-06-06 225842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/bbce3ee7-d3df-6c04-7026-6d395a974ca5.png)

descriptionやコードの書き方をchatGPT先生に聞き、完成形を見ながら大体1.5時間でここまで来ました。



しかし、指定の画像をダウンロードし貼り付けても画像が表示されない問題が発生。
![2024-06-06 230204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/6498eb94-f74d-0a5d-901b-414d1343f3b5.png)
![2024-06-06 224411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/3eb50a06-bbb3-edac-034c-ea53a0493201.png)

コンソールを見てもやはりエラーが…
再ダウンロードしてみて、貼りなおしてもエラーは消えずでした。
とにかく上記の件も書き、提出を完了させてきたのですが合格となるのか…

忘れていた箇所などの注意点を確認しつつ結果を待ちたいと思います:cry:
エンジニア以外でもSQLを使いこなす社内勉強会の取り組み

## 概要
CBcloudでは、各部署のKPIをモニターし、業務改善に必要なデータを可視化するために、Metabaseを活用しています。データに基づいた意思決定を迅速に行い、業務効率を高めることができます。
しかし、データの抽出や可視化においては、エンジニアのサポートが必要とされる場面が多く、迅速に対応することが難しい場面も多々あります。そこで、私たちはエンジニア以外の社員が自ら必要なデータを抽出できるようになることを目指し社内でSQL勉強会を開催したいな〜と思っていたところ、社内からGASやSQL学びたい！という声が！！！
ということでSQL勉強会を @aipacommander と共に開催する事になりました！開催は発起人のパートナーズサクセス本部I.A氏を中心に進めてもらっています。いつもありがとうございます！

## 前提
CBcloudは物流ラストワンマイルの配送プラットフォーム「ピックゴー」を運用しており、荷物を送りたい方、荷物を届けてくれる方を24時間365日、サービスを通してつなげています。

そんなプラットフォームをサポートする社員の方々がデータを元に日々業務改善を行っています。例えば１つ例を挙げると、

https://prtimes.jp/main/html/rd/p/000000011.000016726.html

ピックゴーは業界で初めて配送完了後に即日入金を実現しました。即日入金を実現するため、運行完了後に「報酬金額の確定」という業務を行っています。
> ※報酬金額の確定後、平日（銀行営業日）14時半までの申請で当日入金、14時半以降の申請は翌銀行営業日の入金となります。

「運行完了〜報酬金額の確定」までの時間の可視化し、ドライバーさんのためにその時間を短縮する改善などをおこなっています。

## 勉強会開催！！
![勉強会開催のお知らせ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88756/af664820-199b-65ad-a648-fc239aa5fbb6.png)

- **事前告知と参加募集**： 事前に告知を行い、参加者を募りました。
- **コンセプト**： 初学者が自分でデータを抽出できるようになることを目指し、学習を進められるように支援しています。
- **録画とアーカイブ**：勉強会は毎回録画し、当日参加できなかった人のためにアーカイブを提供しています。
- **ハイブリッド開催**：沖縄での開催ですが、東京からの参加者もGoogle Meetを通じてリモート参加できるようにしています。

### やったこと
普段サポート管理画面で見ているデータをどのように抽出するかを、ハンズオン形式で実施しました。これにより、学んだ内容が実際の業務に直結するよう工夫しています。

![スクリーンショット_2024-06-06_22_42_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88756/69c25be1-1dba-21f1-00a0-01c65b4f5cd7.png)


## 成果も出ている
### エンジニアへの依頼が減った
ちょっとした変更でエンジニアに依頼が来ていたものが、運用メンバーが自力で対応できるようになりました。
既存のクエリに意図などの説明をいれてコメントを残していたら、運用メンバーから「コメントが残されていてわかりやすい」とフィードバックもらったときは嬉しくなった！

### クエリを自作する社員が現れた
自力でクエリを書き、つまずいた時に相談するようになりました。これにより、問題解決のスピードが上がり、エンジニアの負担も軽減されています。


## 終わり
社内SQL勉強会は、エンジニア以外の社員がデータを効果的に活用できるようにするための重要な取り組みです。今後も継続して開催し、データドリブンな企業文化を一層強化していきたいと考えています。
【OutSystems】LifeTime Services APIを使ってみよう

OutSystemsのITユーザーやチームを簡単に管理したいな～と思ったとき
LifeTimeのAPIなるものがあったので、その使い方をまとめてみました

今回は[LifeTime Services API](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_apis/lifetime_services_api/#UserManagementService)の使い方になります
# 環境
Personal Environment
Service Studio

# 手順
### 1. URL取得
LifeTimeにログインして、図の赤枠部分をコピーして置いておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/895c13a2-0738-84e5-ffa9-375baadcc707.png)
### 2. セッショントークンの取得
**1. Consume SOAP Web Serviceで[AuthenticationService](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_apis/lifetime_services_api/#AuthenticationService)にアクセスします**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/3e4c9c70-e45b-f99d-7d28-e8c7c17076ab.png)

**2. URLは`http://<手順1で取得したLifeTimeのURL>/LifeTimeServices/AuthenticationService.asmx?WSDL`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/b80f21e2-a7ad-40fd-e8c9-8c3eb6660a4c.png)**
**3. AuthenticationServiceSopeを選択**
:::note warn
AuthenticationServiceSope12だと、なぜかヘッダーが大きすぎるのエラーが出ます
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/192e82e0-0bd5-3186-186f-424f87bf2693.png)
**4. 作成されたアクションを呼びだします**
引数のUserName/PasswordにはITユーザーの値を渡してください
戻り値のTokenを取得してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/afdeb1dc-a56d-8e17-73f7-1b0872b8305a.png)


### 3. セッショントークンを使用してみましょう
今回は[UserManagementService](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_apis/lifetime_services_api/#UserManagementService)を使用して、ITユーザのリストを取得してみます
**1. AuthenticationServiceと同じようにConsume SOAP Web Serviceでアクセスします**
URLは`http://<手順1で取得したLifeTimeのURL>/LifeTimeServices/UserManagementService.asmx?WSDL`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/e2ce5ae8-115a-76cf-5c57-60c7c72b4e6a.png)
**2. User_Listのアクションを呼びます**
引数のUserName/Passwordにはセッショントークンを取得したITユーザーの値を渡してください
引数のTokenにはAuthenticationServiceから取得したセッショントークンを渡してください
それ以外の引数は公式ドキュメントに従って任意の値を渡してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775282/d1ea8da0-bc1a-4576-8c4e-bdf1fef36634.png)

**3. PlatformUsersを取得できれば完了です**

# まとめ
LifeTime Services APIの使い方は以上になります
これらを使って、何をするのか、それとも何もしないのか
心にしたがって決めてみてください

# 関連記事
[LifeTime API v2を使ってみよう](https://qiita.com/syouhisya/items/ed96946e3a93e829fd3c)
チェックボックスのテキストが同じじゃなかったらボタン2が非表示になりツールチップが出る

```
    <!-- チェックボックスグループ -->
    <div>
      <input type="checkbox" id="option1" name="options" value="option1" />
      <label for="option1">オプション</label>
      <input type="checkbox" id="option2" name="options" value="option2" />
      <label for="option2">オプション</label>
      <input type="checkbox" id="option3" name="options" value="option3" />
      <label for="option3">オプション3</label>
      <input type="checkbox" id="option4" name="options" value="option4" />
      <label for="option4">オプション</label>
      <input type="checkbox" id="option5" name="options" value="option5" />
      <label for="option5">オプション</label>
    </div>

    <!-- ボタン --><!-- ボタン -->
    <div>
      <button name="button1">ボタン1</button>
      <div class="button2-wrapper">
        <button name="button2">ボタン2</button>
        <span class="tooltip"></span>
      </div>
    </div>

    <style>
      button {
        transition: opacity 0.3s;
      }

      button[disabled] {
        opacity: 0.5;
        cursor: not-allowed;
      }

      .button2-wrapper {
        position: relative;
        display: inline-block;
      }

      .tooltip {
        opacity: 0;
        visibility: hidden;
        max-height: 0;
        padding: 0;
        overflow: hidden;
        background-color: #333;
        color: #fff;
        text-align: center;
        border-radius: 4px;
        position: absolute;
        z-index: 1;
        bottom: 100%;
        left: 50%;
        transform: translateX(-50%);
        white-space: nowrap;
      }

      /* button2にホバーしたときだけツールチップを表示 */
      button[name="button1"]:enabled
        + .button2-wrapper
        button[name="button2"]:disabled:hover
        + .tooltip {
        visibility: visible;
        opacity: 1;
        max-height: 1000px; /* 適切な高さに設定 */
        padding: 0.25em 0.5em;
      }
    </style>

    <script>
      // チェックボックスの要素を取得
      const checkboxes = document.querySelectorAll('input[type="checkbox"]');

      // ボタンの要素を取得
      const button1 = document.querySelector('button[name="button1"]');
      const button2 = document.querySelector('button[name="button2"]');
      const tooltip = document.querySelector(".tooltip");

      // チェックボックスの変更イベントを監視
      checkboxes.forEach((checkbox) => {
        checkbox.addEventListener("change", toggleButtons);
      });

      // ボタンの有効/無効を切り替える関数
      function toggleButtons() {
        const checkedCheckboxes = Array.from(checkboxes).filter(
          (checkbox) => checkbox.checked
        );
        const checkedTexts = checkedCheckboxes.map(
          (checkbox) => checkbox.nextElementSibling.textContent
        );
        const areAllTextsTheSame = checkedTexts.every(
          (text) => text === checkedTexts[0]
        );

        button1.disabled = !checkedCheckboxes.length;
        button2.disabled = !areAllTextsTheSame || !checkedCheckboxes.length;

        // ツールチップのテキストを設定
        tooltip.textContent = button2.disabled ? "button2は無効です" : "";
      }

      toggleButtons();
    </script>
```
いい感じのヘッダー(Spyder)

# templateファイル
完全に自分用。
普段Spyderを使ってコーディングしており、PCによってテンプレートが統一されていないのでここらでいい感じのヘッダーをメモっておく。

テンプレートファイルは基本的に`C:\Users\***\.spyder-py3\template.py`に保存されている。

Spyderなら`%(date)s`が`Thu Jun  6 22:09:00 2024`のような日付に、`%(username)s`はユーザー名になる。
`%(username)s`の部分はベタ打ちでもいいと思う。

```python
# -*- coding: utf-8 -*-
# =============================================================================
#                                  HEADER
# =============================================================================
__version__ = "1.0.0"
# Author: %(username)s
# Created on %(date)s
# Description: 
# =============================================================================
#                                  HISTORY
# =============================================================================
# __version__ = "x.y.z"
# Date:                 Updater: 
# Modifications: 
# -----------------------------------------------------------------------------
# __version__ = "x.y.z"
# Date:                 Updater: 
# Modifications: 
# -----------------------------------------------------------------------------


def main():
    return


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

# 使い方
新規作成時にHEADERを記入、アップデートするたびにHISTORYをしたに追加していく。
最新の`__version__`をアンコメントしておくことでバージョン表示ができる。

```python
# -*- coding: utf-8 -*-
# =============================================================================
#                                  HEADER
# =============================================================================
# __version__ = "1.0.0"
# Author: Yulily
# Created on Thu Jun  1 22:19:54 2024
# Description: ここに説明を書く
# =============================================================================
#                                  HISTORY
# =============================================================================
# __version__ = "1.0.1"
# Date: 20240603        Updater: Yulily
# Modifications: パッチバージョンアップ、バグの修正や誤字の訂正
# -----------------------------------------------------------------------------
# __version__ = "1.1.0"
# Date: 20240606        Updater: Yulily
# Modifications: マイナーバージョンアップ、細かな機能向上や部分的な修正
# -----------------------------------------------------------------------------
__version__ = "2.0.0"
# Date: 20240607        Updater: Yulily
# Modifications: メジャーバージョンアップ、見た目や操作に大きく影響を及ぼすような変更
# -----------------------------------------------------------------------------
# __version__ = "x.y.z"
# Date:                 Updater: 
# Modifications: 
# -----------------------------------------------------------------------------


def main():
    return


if __name__ == "__main__":
    main()
```
【SQL】相関サブクエリ


### サブクエリと相関サブクエリの違いは？
もし、ある商品が全体の売り上げの平均値より上かどうかを見たい場合には通常のサブクエリを使うことができるが、「同じ商品分類の中で」平均値より上かどうかといったデータの一部のグループ内での集計をしたいときには相関サブクエリを使が使える。

#### 具体例
例えば、下記のような売上データがあったとする。

|商品分類|商品名|売上|
|--|--|--|
|コーヒー|エスプレッソ|5000|
|コーヒー|ラテ|8000|
|コーヒー|カプチーノ|6000|
|コーヒー|フラペチーノ|4000|
|お茶|レモンティー|3000|
|お茶|緑茶|4000|
|お茶|紅茶|2000|
|お茶|ジャスミンティー|3500|

### 通常のサブクエリ

全体の売上の平均を超えている商品を出したいとする。
そこでまずはいったん、全体の平均を確認。

```sql
SELECT AVG(売上) AS 平均売上
FROM 売上テーブル
```
結果
|平均売上|
|--|
|4437|


次にサブクエリエを使用し、平均売上（4,437円)を超える商品を抽出してみる。
```sql
SELECT 商品名,売上
FROM 売上テーブル AS t1
WHERE 売上 >= (SELECT AVG(売上) 
                FROM 売上テーブル AS t2)
```
結果を見ると、4,437円を超えているエスプレッソ、ラテ、カプチーノが返ってくる。

|商品名|売上|
|--|--|
|エスプレッソ|5000|
|ラテ|8000|
|カプチーノ|6000|

### 相関サブクエリ

次に、全体ではなく、商品分類の中だけで平均売上額を出し、その金額以上の商品をとってきたい場合がある。その場合、相関サブクエリが使える。

まず、商品分類毎の売り上げを見てみる。

```sql
SELECT 商品分類,AVG(売上) AS 平均売上
FROM 売上テーブル
GROUP BY 商品分類
```
結果
|商品分類|平均売上|
|--|--|
|コーヒー|5750|
|お茶|3125|

次に、相関サブクエリを使用し、商品分類毎に平均値より売上が上の商品を抽出してみる。つまり、コーヒーでは5750円以上、お茶では3125円以上の商品を取ってきたい。

```sql
SELECT 商品分類.商品名,売上
FROM 売上テーブル AS t1
WHERE 売上 >= (SELECT AVG(売上) 
                FROM 売上テーブル AS t2
                WHERE t1.商品分類 = t2.商品分類
                GROUP BY 商品分類
                )
```
                
|商品分類|商品名|売上|
|--|--|--|
|コーヒー|ラテ|8000|
|コーヒー|カプチーノ|6000|
|お茶|緑茶|4000|
|お茶|ジャスミンティー|3500|

これでコーヒー類の中ではラテとカプチーノが平均以上、お茶類の中では緑茶とジャスミンティーが平均以上というデータが取ってこれた。
【Python】変数と型

# 変数
Pythonでは変数を使ってデータを格納することができます。変数には以下の特徴があります。

**変数名の命名規則**
- 変数名は文字(アルファベットまたはアンダースコア_)で始まる必要があります
- 変数名には文字、数字、アンダースコアを含めることができます
- 大文字と小文字は区別されます(name, Nameは別の変数)
- 予約語(print, if, forなど)は変数名に使えません
### 代入
```python
x = 5       # 整数値を代入
y = 3.14    # 浮動小数点数を代入
name = "John" # 文字列を代入
is_student = True # 真理値(Boolean)を代入
```
### 型
- Pythonは動的型付け言語なので、変数の型は値によって決まります
- 同じ変数に異なる型のデータを代入することができます
### スコープ
- 変数のスコープは、その変数が定義された場所によって決まります
- 関数の外で定義された変数はグローバルスコープ
- 関数の中で定義された変数はローカルスコープ
```python
x = 10 # グローバル変数

def foo():
    y = 5 # ローカル変数
    print(x) # グローバル変数xは参照できる
    print(y) 

foo() # xの値10、yの値5が出力される
print(y) # エラー、yはローカル変数でグローバルスコープからはアクセスできない
```
変数は任意の値を格納でき、コードの実行過程で値を変更することもできます。変数を上手く活用することで、プログラムのデータの流れをコントロールできます。
# 型
Pythonは動的型付け言語なので、変数に値を代入する際に型を明示する必要はありません。主な型は以下の通りです。

### 数値型

- 整数型(int): `x = 5`
- 浮動小数点数型(float): `y = 3.14`
- 複素数型(complex): `z = 2 + 3j`

### ブール型

- 真理値(True/False): `bool_value = True`

### シーケンス型

- 文字列型(str): `s = "Hello"`
- リスト型(list): `lst = [1, 2, 3]`
- タプル型(tuple): `tup = (4, 5, 6)`

### マッピング型

- 辞書型(dict): `d = {"apple": 2, "banana": 3}`

### セット型

- セット(set): `st = {1, 2, 3}`

型に合わせた演算や操作ができます。例えば:
```python
x = 5
y = 2.5
z = x + y     # 7.5 (数値の加算)

s1 = "Hello"
s2 = "World"
s3 = s1 + s2  # "HelloWorld" (文字列の連結)

lst = [1, 2, 3]
lst.append(4) # lst は [1, 2, 3, 4] になる (リストへの値の追加)
```
データ型を取得するには `type()` 関数を使います。
```python
print(type(5))     # <class 'int'>
print(type(3.14))  # <class 'float'>
print(type("Hi"))  # <class 'str'>
```
型変換もできます。`int()`、`float()`、`str()`などの関数で明示的に別の型に変換できます。

Pythonでは動的に型が決まるので、プログラマは型について気をつける必要がありますが、柔軟な型システムがPythonの利点の一つでもあります。

######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)

https://qiita.com/Akuuuun/items/8951f06c3d88048fba2e
image_tag が本番環境で使えない

# はじめてのデプロイ
いよいよフェーズ１のデプロイ！
コマンドをちょこちょこ打って終わった！と思ったらエラーが起きた！
けど解決したのでまとめます。

# image_tagは使えない？
<%= image_tag %>を使用して画像を表示させていたものの、本番環境ではエラーが起きました。
問題の記述はこちら↓
```top.html.erb
<%= image_tag "go_out_planning_logo.png", size: "250x250", class: "rounded-circle mx-auto mb-3 d-block" %>
```
これを本番環境用に修正すると…
```top.html.erb
<%= image_tag asset_path('go_out_planning_logo.png', :alt => '画像'), class: "rounded-circle mx-auto mb-3 d-block" %>
```

となり、無事に表示させることに成功しました！

# 参照記事
こちらを参考にさせていただきました。

https://t-salad.com/rails-image-show/
Swiper.jsのナビゲーションの色を変える

検索しても解決方法が見つからなかったので､メモ

ナビゲーションの色とナビゲーションボタンのサイズを変更しています｡

```css
.swiper-button-prev {
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' viewBox='0 0 27 44'%3E%3Cpath d='M0,22L22,0l2.1,2.1L4.2,22l19.9,19.9L22,44L0,22L0,22L0,22z' fill='%233f3f3f'%2F%3E%3C%2Fsvg%3E");
    background-size: 13.5px 22px;
}

@media (max-width: 600px) {
    .swiper-button-prev {
        background-size: 22px 44px;
    }
}

.swiper-button-next {
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' viewBox='0 0 27 44'%3E%3Cpath d='M27,22L27,22L5,44l-2.1-2.1L22.8,22L2.9,2.1L5,0L27,22L27,22z' fill='%233f3f3f'%2F%3E%3C%2Fsvg%3E");
    background-size: 13.5px 22px;
}

@media (max-width: 600px) {
    .swiper-button-next {
        background-size: 22px 44px;
    }
}
```


```
fill='%233f3f3f'
```
3f3f3fは16進数カラーコードです。これをデコードすると、#3f3f3fとなります。このカラーコードは暗い灰色（ダークグレー）となります｡
とりあえず､ここでカラー指定すれば変更できました｡

## 参考
https://qiita.com/morioka1206/items/95985b1f2db3ea43991c
Vue.js環境構築


## 1. Node.jsをインストール
 1.Node.js公式サイトにアクセスし、インストーラをダウンロードする。
 https://nodejs.org/en/
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/d966e1da-f233-122d-af9a-759474837f37.png)


2.ダウンロードできたら、ダブルクリックしてインストーラを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/6b82e4e8-9fa1-f0b0-ee0a-1393de3312e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/433a452a-49f1-3fff-fb46-56b9e8e2ab43.png)

基本的には「Next」で進めていけば問題ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/c88b8fc9-15d2-f611-9e89-a19cb3c2dbff.png)
ここまで問題なければ、「Install」を選択する。
下記画面になればインストール完了！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/71a6ee4f-8e3b-a8c8-3957-434e6a74bc7d.png)

3.インストールが完了したら、コマンドプロンプトを起動し、Node.jsがインストールされていることを確認する。
↓実行コマンドと想定結果
```
>　node -v
v20.14.0
```

このようにバージョンが表示されたらインストール成功！！

## 2.Vueファイルを作成する

1.コマンドプロンプトで以下のコマンドを実行する。
```
> npm create vue@latest
```


以下のようにオプションを設定する項目が表示されるので、必要に応じて選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/7bcadfcd-968a-b3ee-f76f-2755cf951c86.png)
すべて選択したら以下のように開発フォルダ内にProject nameで設定した名称（今回はVue_project）のフォルダが追加される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/c3ae68fb-12e7-429c-6bfa-e3ef5467a1e8.png)





## 3.npmをインストール

1.下記コマンドを実行する。
```
> npm install
```
2.npmがインストールされているか確認する。
↓実行コマンドと想定結果
```
>　npm -v
10.7.0
```






## 4.ローカルサーバーを起動する

```
> npm run dev
```

コマンドを入力したら以下のようにターミナルに表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/e928f425-ebb3-6171-4b1e-5dbec0f8d650.png)
このhttp://localhost:○○○○/というのがローカルサーバーにアクセスできるURL
下記のようにVueのページが表示されれば、環境構築完了～！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673845/39c444d4-94a9-57f8-5e45-8a5249ee067b.png)
Azureマスターへの道　シリーズリンク

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Azureマスターへの道の目次として使用します。

今後ここにリンクを増やしていく予定です。


# 目次

[Azure Virtual Machines](https://qiita.com/keitaMax/items/0a037e2bdd2c5906a04b)

[Azure Virtual Desktop](https://qiita.com/keitaMax/items/3a50893c17552b6e4499)