bar chart

import pandas as pd
import plotly.express as px
from typing import Optional
from plotly.graph_objs import Figure

# src/visualization/dashboard.py

def create_missing_values_chart(
    dataset_path: str,
    title: str = "Missing Values per Column",
    height: int = 600,
    width: int = 1200,
) -> Optional[Figure]:
    """
    Reads a dataset from the given path and creates an interactive Plotly chart 
    showing missing values per column.

    Parameters
    ----------
   

pie chart

def analysis_pie(datapath):
    """
    Reads complaint data from a CSV file and generates pie charts:
    1. Complaints per Department
    2. Complaints per Year
    3. Closed vs Open Complaints (All Years Combined)
    Returns:
        BytesIO buffer containing PNG image
    """
    # --- Step 1: Load Data ---
    df = pd.read_csv(datapath)
    df['DATE'] = pd.to_datetime(df['DATE'])
    df['YEAR'] = df['DATE'].dt.year

    # --- Step 2: Summaries ---
    dept_summary = df.group

955. Delete Columns to Make Sorted II

You are given an array of n strings strs, all of the same length. We may choose any deletion indices, and we delete all the characters in those indices for each string. For example, if we have strs = ["abcdef","uvwxyz"] and deletion indices {0, 2, 3}, then the final array after deletions is ["bef", "vyz"]. Suppose we chose a set of deletion indices answer such that after deletions, the final array has its elements in lexicographic order (i.e., strs[0] <= strs[1] <= strs[2] <= ... <= strs[n - 1]). Return the minimum possible value of answer.length.
/**
 * @param {string[]} strs
 * @return {number}
 */
var minDeletionSize = function(strs) {
    const n = strs.length;
    const m = strs[0].length;

    // sorted[i] = true means strs[i] < strs[i+1] is already determined
    const sorted = Array(n - 1).fill(false);

    let deletions = 0;

    // Scan columns left to right
    for (let col = 0; col < m; col++) {

        // Check if keeping this column would break lexicographic order
        let mustDelete = false;

        for (let i = 0; i <

csvの書き方

# CSV形式の説明 - ECサイト商品データ例

## サンプルCSVデータ

```csv
商品id,商品名,価格,カテゴリー,タグ
1,ワイヤレスイヤホン,8980,オーディオ,Bluetooth|ワイヤレス|防水
2,スマートウォッチ,15800,ウェアラブル,健康管理|通知機能|防水
3,モバイルバッテリー,3280,アクセサリー,大容量|急速充電|軽量
4,USB-Cケーブル,980,アクセサリー,USB-C|1m|高耐久
5,ノイズキャンセリングヘッドホン,24800,オーディオ,ノイズキャンセリング|ワイヤレス|高音質
```

## このCSVの構造説明

### 1行目:ヘッダー行

```
商品id,商品名,価格,カテゴリー,タグ
```

- 各列が何のデータかを示す「列名」
- これがあることで、プログラムが自動的にデータをオブジェクトに変換できる

### 2行目以降:データ行

```
1,ワイヤレスイヤホン,8980,オーディオ,Bluetooth|ワイヤレス|防水
```

- 実際の商品データ
- 各値が**カンマ(,)で区切られている** ← これ

npmレジストリとプライベートパッケージの基礎

# npmレジストリとプライベートパッケージの基礎

## レジストリとは

npmパッケージが保管されているサーバー・リポジトリのこと。`npm install`や`pnpm install`を実行すると、このレジストリからパッケージをダウンロードする。

### 主なレジストリ

- **npmjs.org**: 公式のパブリックレジストリ(デフォルト)
- **GitHub Packages**: GitHubが提供するレジストリ
- **企業独自のレジストリ**: Verdaccio、JFrog Artifactoryなど

### 仕組み

```
pnpm install react
    ↓
レジストリに問い合わせ(デフォルト: https://registry.npmjs.org/)
    ↓
reactパッケージをダウンロード
    ↓
node_modulesにインストール
```

## プライベートレジストリとは

一般公開されていない、限られたユーザーのみがアクセスできるレジストリ。

### 用途

- 社内専用パッケージの配布
- セキュリティ上公開

TurboRepo導入

# Turborepo ドキュメント

## Turborepoとは

**Turborepo**は、JavaScriptおよびTypeScript向けの高性能ビルドシステム。Vercel社が開発し、monorepo(モノリポジトリ)構成に対応している。

### 開発背景

従来のmonorepo構成における課題:
- すべてのパッケージを毎回ビルドする必要があり、ビルド時間が増大
- CI環境での実行時間が長期化
- 同じ作業を繰り返すことによるリソースの無駄

Turborepoはこれらの課題に対処するために開発された。

## 解決する問題

### 1. ビルド時間の削減
- **キャッシング**: タスクの入力をハッシュ化し、同じ入力の場合は以前の出力を再利用
- **並列実行**: 依存関係のないタスクを同時実行
- **増分ビルド**: 変更されたパッケージとその依存関係のみを再ビルド

### 2. チーム全体での効率化
- **リモートキャッシング**: ビルド結果をチームメンバー間で共有
- **CI環境の高速化**: 過去のビルド結果を再利用

### 3. 依

OAuthアクセストークン検証時の注意点

# OAuth Cross API Vulnerability メモ

## NGとなる状況(作ってはいけない状態)

### システム構成上の前提
- 複数のサービス(例:サービスA、サービスB)が存在する
- 各サービスは別々のAPI(リソースサーバ)を持つ
- 認可基盤として同一のOAuth/OIDCプロバイダ(例:同一Auth0テナント)を使用している
- 各APIは Bearer Access Token(JWT)を受け取って認可を行う

### NGな状態の定義
- API(リソースサーバ)が以下の条件でアクセストークンを受理する状態
  - トークンの署名検証は行っている
  - トークンの発行元(issuer)が信頼できることのみを確認している
  - **aud(audience)が自API向けであることを検証していない**

---

## 問題が実際に発生する手順

1. ユーザがサービスBにログインする  
   - OAuth/OIDC認証フローにより、認可サーバから
     サービスBのAPI向けアクセストークンが発行される
   - このトークンには以下

BFF(Backend For Frontend)とは

# BFF(Backend For Frontend)とは

## 概要

BFF(Backend For Frontend)は、フロントエンドとバックエンドの間に配置される中間レイヤーで、バックエンドAPIから取得したデータをフロントエンド向けに最適化して提供するアーキテクチャパターン。

### 簡単に言うと
「フロントエンド専用のカスタムバックエンド」であり、複数のバックエンドサービスからデータを集約・加工して、フロントエンドが使いやすい形で提供する役割を担う。

## なぜBFFが必要なのか

従来のアーキテクチャでは、1つの汎用的なAPIで全てのクライアント(Web、モバイルなど)に対応していた。これには以下の問題があった:

- **データの過剰取得**: モバイルには不要なデータまで返してしまう
- **複数リクエストの必要性**: 1画面表示に複数のAPIコールが必要
- **フロントエンドの複雑化**: データ整形のロジックがフロントエンド側に散在
- **バックエンド側の肥大化**: 全クライアントの要求に応えようとしてAPIが複雑になる

## データの流れ:商品

SSG/SSR/CSR/ISRの使い分けガイド

# SSG/SSR/CSR/ISRの使い分けガイド

## 各レンダリング方式の概要

### SSG (Static Site Generation)
ビルド時に静的ファイルを生成する方式。

**特徴:**
- ビルド時にページごとのHTMLを生成
- CSS、JavaScriptはビルド成果物として出力
- リクエスト時のサーバーサイド処理が不要
- 検索エンジンがHTMLを直接読み取り可能

**適しているケース:**
- ブログ記事、マーケティングサイト、ドキュメントサイト、ランディングページ、企業サイト、ポートフォリオサイト
- コンテンツの更新頻度が低い場合
- 全ユーザーに同じコンテンツを表示する場合
- リクエスト時のサーバーリソースを消費したくない場合

**制約:**
- ページ数が多いとビルド時間が増加
- コンテンツ更新には再ビルドが必要

### SSR (Server-Side Rendering)
リクエストごとにサーバーでHTMLを生成する方式。

**特徴:**
- リクエスト時にサーバーでHTMLをレンダリング
- リクエストごとにサーバーリソース

物理削除・論理削除・削除フラグ・削除テーブルの使い分け

<?php
/**
 * データベース削除の4つのアプローチ
 * MySQL + PHP サンプルコード
 */

// ========================================
// 各アプローチの比較と使い分け
// ========================================

/**
 * 1. 論理削除(deleted_at)
 *    メリット: 復元が容易、削除履歴が残る、誤削除に強い、削除日時が分かる
 *    デメリット: データ量が増える、クエリが複雑になる
 *    用途: ユーザーアカウント、重要なマスターデータ、監査証跡が必要な場合
 * 
 * 2. 物理削除
 *    メリット: データベースがシンプル、ストレージ節約、完全にデータを消去できる
 *    デメリット: 復元不可、履歴が残らない
 *    用途: 一時データ、セッション情報、キャッシュ、個人情報の完全削除
 * 
 * 3. 削除フラグ(is_deleted)
 *    メリット: シンプル、高速、復元が容易、インデックスが効きやす

944. Delete Columns to Make Sorted

You are given an array of n strings strs, all of the same length. The strings can be arranged such that there is one on each line, making a grid. For example, strs = ["abc", "bce", "cae"] can be arranged as follows: abc bce cae You want to delete the columns that are not sorted lexicographically. In the above example (0-indexed), columns 0 ('a', 'b', 'c') and 2 ('c', 'e', 'e') are sorted, while column 1 ('b', 'c', 'a') is not, so you would delete column 1. Return the number of columns that you will delete.
/**
 * @param {string[]} strs
 * @return {number}
 */
var minDeletionSize = function(strs) {
    // Number of rows (strings)
    const n = strs.length;
    // Number of columns (length of each string)
    const m = strs[0].length;

    let deletions = 0;

    // We check each column independently
    for (let col = 0; col < m; col++) {
        // For each column, scan down the row
        for (let row = 1; row < n; row++) {
            // Compare current row with previous row
            // If s

Legit WU Transfer Bug MoneyGram Transfer CC Fullz PayPal Transfer CashApp Transfer Apple Pay Transfer Skrill Transfer..



Scattered Spider (and allied group Scattered LAPSUS$ Hunters) 🌎 


VERIFIED CARDER SELLING WU,BANK,PAYPAL,CASHAPP,SKRILL TRANSFER BANK LOGS,DUMPS+PIN,CLONED CARDS

Telegram: JeansonTooL SELL CCV CANADA FULLZ FRESH SSN DOB WITH DL LIVE MAIL PASSWORD OFFICE365 PAYPAL

Telegram: JeansonTooL CVV,Fullz,Dumps,PayPal Debit/Credit Card,CashApp, Western Union, Transfer,ATM Clone Cards!!

Telegram: JeansonTooL SELL CVV FULLZ INFO GOOD USA-UK-CA-AU-INTER,PASS VBV/BIN/DOB

Telegram: JeansonTooL : Sell Dum

FastAPI

@app.get("/dataset_info")
def get_dataset_info():
    """Get basic dataset information"""
    try:
        if not os.path.exists(dataset_path):
            raise HTTPException(status_code=404, detail="Dataset file not found")
        
        df = pd.read_excel(dataset_path)
        
        return {
            "dataset_path": dataset_path,
            "rows": int(df.shape[0]),
            "columns": int(df.shape[1]),
            "column_names": df.columns.tolist(),
            "d

2092. Find All People With Secret

You are given an integer n indicating there are n people numbered from 0 to n - 1. You are also given a 0-indexed 2D integer array meetings where meetings[i] = [xi, yi, timei] indicates that person xi and person yi have a meeting at timei. A person may attend multiple meetings at the same time. Finally, you are given an integer firstPerson. Person 0 has a secret and initially shares the secret with a person firstPerson at time 0. This secret is then shared every time a meeting takes place with a person that has the secret. More formally, for every meeting, if a person xi has the secret at timei, then they will share the secret with person yi, and vice versa. The secrets are shared instantaneously. That is, a person may receive the secret and share it with people in other meetings within the same time frame. Return a list of all the people that have the secret after all the meetings have taken place. You may return the answer in any order.
/**
 * @param {number} n
 * @param {number[][]} meetings
 * @param {number} firstPerson
 * @return {number[]}
 */
// Function to find all people connected to the first person
var findAllPeople = function(n, meetings, firstPerson) {
    // Initialize an array to keep track of connections
    const connected = new Array(n).fill(-1);

    // Function to find the parent of a person
    const find = (person) => connected[person] < 0 ? person : find(connected[person]);

    // Function to connect two 

Streamlit Components

# Show the dashboard title directly
st.title(dashboard_type)

# ---------------- Analysis Dashboard ----------------
if dashboard_type == "📈 Analysis Dashboard":
    st.markdown("### Dashboard Content")
    tab1, tab2, tab3 = st.tabs(["📈 Visualizations", "📋 Data Table", "📊 Summary"])

    with tab1:
        st.write("Charts and graphs will be displayed here")

    with tab2:
        st.write("Raw data table will be displayed here")

    with tab3:
        st.write("Summary statist