OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで簡単！マリオ風アイテムの実装ガイド


### マリオ風ゲームに必要なアイテムとは？

マリオ風ゲームをUnityで作りたい方にとって、アイテムは欠かせない要素です。コインを取ったり、キノコでキャラクターを成長させたりする仕組みは、ゲームの楽しさを大きく引き上げます。

本記事では、以下のポイントを中心にUnityでのアイテム実装方法を解説します。

- コインの収集機能の実装方法
- プレイヤーを成長させるキノコの作り方
- カメラ追従とアイテム配置のコツ

初心者でも簡単に取り組める内容ですので、ぜひ参考にしてください！

---

### コインの実装方法

#### 素材とセットアップ

1. **コイン画像のインポート**
   - Unityのアセットストアやフリー素材サイトでコイン画像をダウンロード。
   - Unityプロジェクトにドラッグ＆ドロップしてインポートします。

2. **ゲームオブジェクトの作成**
   - インポートしたスプライトをシーンビューに配置し、名前を「Coin」に設定。

3. **Colliderの追加**
   - コインに`Circle Collider 2D`を追加して衝突判定を設定。

4. **タグの設定**
   - コインに「Coin」というTagを付与。

#### コインのスクリプト例

以下のコードを使用して、プレイヤーと衝突した際にコインが消えるようにします。

<pre><code>
using UnityEngine;

public class Coin : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            // スコアを加算
            ScoreManager.instance.AddScore(10);

            // コインを消去
            Destroy(gameObject);
        }
    }
}
</code></pre>

#### エフェクトを追加して演出を強化

コインを取得した際にエフェクトを表示することで、プレイヤーの満足度を高められます。

<pre><code>
public GameObject pickupEffect;

void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Player"))
    {
        Instantiate(pickupEffect, transform.position, Quaternion.identity);
        Destroy(gameObject);
    }
}
</code></pre>

---

### キノコの実装方法

#### キノコの動作と設定

1. **アニメーションの設定**
   - キノコが移動するアニメーションを`Animator`で作成。
   - 左右に動くパターンを設定。

2. **ColliderとRigidbodyの追加**
   - `Box Collider 2D`と`Rigidbody 2D`を設定し、物理挙動を適用。

#### キノコのスクリプト例

キノコに触れるとプレイヤーが成長する仕組みを以下のコードで実装します。

<pre><code>
using UnityEngine;

public class Mushroom : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            Player player = other.GetComponent<Player>();
            if (player != null)
            {
                player.Grow();
            }

            Destroy(gameObject);
        }
    }
}
</code></pre>

---

### カメラ追従とアイテム配置のコツ

#### カメラ追従の実装

カメラをプレイヤーに追従させることで、ゲーム画面外にアイテムが隠れるのを防ぎます。

##### `Cinemachine`を使用する方法

1. UnityのパッケージマネージャーからCinemachineをインポート。
2. `Cinemachine Virtual Camera`をシーンに追加。
3. カメラのターゲットをプレイヤーに設定。

##### スクリプトで追従させる方法

<pre><code>
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform player;

    void LateUpdate()
    {
        if (player != null)
        {
            transform.position = new Vector3(player.position.x, player.position.y, transform.position.z);
        }
    }
}
</code></pre>

---

### まとめ

- Unityでのアイテム実装は初心者でも挑戦しやすい
- コインやキノコは、ゲームの面白さを大幅に向上させる要素
- カメラ追従やエフェクトでゲームのクオリティをさらに高められる

ぜひ、次のステップとして[Unity入門の森](https://feynman.co.jp/unityforest/)を活用してみてください！
UnrialEngine5：はじめの一歩

# 初めに
- ここでは、初めてUE5に触れるための敷居のイメージを記していきたい
- どんな使い方なのかを簡単に説明したい
- 画面スクショで何が起こるのかポイント的にみていく
- 細かい操作方法は特に記載しておらず、つかってみた感想をメインでのせています

# ここでできること、UE5の使い方
- 操作一覧
    - WASDとマウス移動
    - 画面に出てる物体をクリックすることで物体の編集が可能に
    - 画面Clickと物体Clickで操作が変わる
    - 物体を移動させることも可能。物体の矢印で変えられる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/321dcdb2-dc2d-99a3-cb60-e3793108cce0.png)
    - 新しい物体追加方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/6d22ba45-36d6-b652-33f9-9b4954f7e6a4.png)
    - 球の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/ee05e98e-2829-7167-c316-7b9d6635dba5.png)
    - 物理演算に関して有りか無しか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/0fd1d92e-6be3-ddc3-fbee-cde07a3ecd5a.png)
    - 無しだとボールを動かせない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/888b8361-8aa7-021e-a490-9705f11365ea.png)
    - これで動く動かないに関して、物理演算「Enable Gravity」にチェックを入れることはもちろんですが、その４つ上の「Simulate Physics」がチェックされていないとそもそも機能しないので注意です 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/37eeb013-9e94-0b6a-bd05-12e2ca3be009.png)
    - ここでキャラの変更をしてみた。詳細は別途記載予定。デフォルトキャラから変更するにはここを変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/34f54735-e1d9-e1bc-d4d0-531cd0515ab7.png)
    - キャラ変更した後のゲーム動き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310502/84a670a0-a3fc-1ae9-6933-95566a021dd2.png)
 
# おわり
- 今回はUE5の雰囲気も知っていただけたと思います
- 感想としてはUnityと似たような操作感覚かなといった感じでした
- 次回以降はプロトタイプ作成を目指していきます。ノーコードでプログラミングを実現するブループリントというものにも注目していきたいとおもいます
「湯豆腐をとりあげる一番のタイミングを教えて下さい。」AI先生に聞きました。

```
湯豆腐をとりあげる一番のタイミングを教えて下さい。
湯豆腐によって異なりますか。
```
・私の質問の仕方が悪いようです。
・ChatGPT先生の回答がそれらしい？かも
# ChatGPT先生へ
```
(抜粋)
・木綿豆腐: 少ししっかりしているため、加熱時間を長くしても崩れにくいです。中心までしっかり温まった頃（約3～5分）がベストです。
・絹ごし豆腐: 柔らかいので、長く加熱すると崩れやすくなります。表面が滑らかに温まり、湯の中で軽く動かせる状態になったら取り上げましょう（約2～3分）。
```

# Gemini先生へ
```
(抜粋)
ぜひ、色々な湯豆腐を試して、あなたにとって一番美味しい食べ方を見つけてください。
```

# Copilot先生へ
未
Elixir 1.18 のパラメータ化テストを試してみる

## はじめに

Elixir 1.18 のリリース候補（RC版）が出ました

https://github.com/elixir-lang/elixir/blob/v1.18/CHANGELOG.md

パラメータ化テストができるようになったとのことで試してみます

## Elixir 1.18.0-rc.0 のインストール

asdf で 1.18.0-rc.0 をインストールしました

```bash
asdf install elixir 1.18.0-rc.0
```

カレントディレクトリー配下で 1.18.0-rc.0 を使うように指定します

```bash
asdf local elixir 1.18.0-rc.0
```

## プロジェクトの作成

新しいプロジェクトを作成します

```bash
mix new main
```

Elixir プロジェクトに必要な最低限のディレクトリー構造とファイルが作成されます

ディレクトリー内に移動します

```bash
cd main
```

## テスト対象処理の実装

`lib/main.ex` を以下のように変更します

```elixir
defmodule Main do
  def hello(n) do
    case n do
      1 -> n + 1
      2 -> 0
      3 -> n * 2
      _ -> 99
    end
  end
end
```

## テストの実装

`lib/main_test.exs` を以下のように変更します

```elixir
defmodule MainTest do
  use ExUnit.Case,
    async: true,
    parameterize: [
      %{input: 1, output: 2},
      %{input: 2, output: 0},
      %{input: 3, output: 6},
      %{input: 4, output: 99}
    ]

  doctest Main

  test "hello", %{input: input, output: output} do
    assert Main.hello(input) == output
  end
end
```

`parameterize` にパラメータ化した変数のパターンを列挙します

`test "hello", %{input: input, output: output} do` のように、テストでパラメータを受けます

## テストの実行

テストを実行します

```bash
mix test
```

実行結果

```elixir
Compiling 1 file (.ex)
Generated main app
Running ExUnit with seed: 166756, max_cases: 16

....
Finished in 0.00 seconds (0.00s async, 0.00s sync)
4 tests, 0 failures
```

4 つのケースについてテストが実行されています

パラメータを書き換えて、わざとエラーを発生させます

```diff_elixir
defmodule MainTest do
  use ExUnit.Case,
    async: true,
    parameterize: [
      %{input: 1, output: 2},
-     %{input: 2, output: 0},
+     %{input: 2, output: 8},
      %{input: 3, output: 6},
      %{input: 4, output: 99}
    ]

  doctest Main

  test "hello", %{input: input, output: output} do
    assert Main.hello(input) == output
  end
end
```

実行結果

```elixir
Running ExUnit with seed: 595271, max_cases: 16

...

  1) test hello (MainTest)
     Parameters: %{input: 2, output: 8}
     test/main_test.exs:13
     Assertion with == failed
     code:  assert Main.hello(input) == output
     left:  0
     right: 8
     stacktrace:
       test/main_test.exs:14: (test)


Finished in 0.01 seconds (0.01s async, 0.00s sync)
4 tests, 1 failure
```

`Parameters: %{input: 2, output: 8}` というように、どのパラメータでテストに失敗したか分かるようになっています

## まとめ

パラメータ化テストにより、テストケースが効率的に書けそうですね
AWS Certified AI Practitioner（AIF）対策：ビニング

# ビ二ング（Binning）

***<font color="MediumVioletRed">『データを一定の範囲や区間に分割してグループ化する手法』</font>***

であり、 大量のデータを簡素化　して扱いやすくします。

これにより、データのばらつきを抑え、データのパターンや傾向をより明確に把握できるようになります。

特にセンサーデータのように膨大で連続的なデータを扱う場合、ビ二ングを用いることでデータの処理効率を高めることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/fa4d7c6d-261b-6e87-8df2-b60650cda76b.jpeg" width="700">
社長になって小口決済財布持たされたので、サクッとアプリとBIレポートを作ったお話

皆さんこんにちわ、りなたむです。

Power BI Advent Calendar 2024 の記事として、ちょっとこんなん作ってみましたよっていう事例をご紹介したいと思います。

というのも、昨年11月に起業しまして、ある程度余裕ができたある日、CFO からこんなこと言われたんです。

「出張先とかで現金が必要な時に個人の財布から出されるのも色々管理とか大変なので、会社の財布作ってください」

なるほど・・・確かにそうだなぁ。
というわけで、ちょうど財布を変えたいなとも思ってたこともあり、個人の財布を新しく買いまして、これまで使っていた財布を会社の財布にしたんですよ。

ただですね、毎回毎回２つ持ってると、個人だっけ？会社のだっけ？って迷ったりして、毎回領収書から今の財布のお金が合ってるの確認するの、めちゃくちゃめんどくさいんすよ笑

というわけでなんかいい方法ないかなーと考えたら、こういうのを思いついたんですよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/280cbcc5-3e56-8656-baa8-a179f412b7b6.png)

基本的にスマホで入力したいけど、Dataverse 使うってなるとモデル駆動型のが楽でいいよなぁ
んでもって、現在の財布にいくら入っているべきかはすぐ見れるようにしたいし、CFOもどれぐらい入っているかリアルタイムで見れるようにしたいから・・・
ってなると、Direct Query だよなぁ

ということでこういう構成にしました。

# Dataverse

## テーブル構造

超シンプルにしたかったのでこんな感じにしました。

|列名|プライマリ列|データ型|備考|
|:--|:--|:--|:--|
|用途|✓|1行テキスト|
|金額||通貨|
|入出金||選択肢|出金・入金|
|決済日||日付のみ|

科目とか本当は入れたほうがいいんでしょうが、その辺は会計側に取り込んでもらうときに合わせてセットしてもらうのと、こっちとしては「誰に、何のために使った」みたいな情報が大事なので、用途という列名ですべて完結するようにしています。

領収書を取り込むような機能は入れていません。
基本的に直接会ったときにまとめて渡していて、今のところそれで問題ないですね。
必要になったらそん時は入れます。

## フォーム

こんな感じにしてみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/d93245a5-25c2-860c-a922-8cbe3587b2e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/3a208fb6-2f83-a097-fd96-056293b2472b.png)

モデル駆動型アプリの強みは、レスポンシブ対応にもともとなっているところが大きいですね。
入力もシンプルなので、キャンバスアプリで作るより、こっちのほうが使いやすいです。

# Power BI

とりあえず、直近の用途をリストアップし、現在財布に入っている（であろう）金額を表示することに留めています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/1f9f8be9-9773-66b9-6e73-cbceb7012e56.png)

## 現在の金額の出し方

単純に入出金列を元に入金ならそのまま、出金なら -1 をかけて、マイナス値にして、合計値を表示しているだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/84d2243f-cc70-528e-affe-fe837018bf00.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/cff87624-e608-b3a6-a5b8-21102ab557bf.png)

多分もっといい方法は絶対にあると思いますし、件数が増えれば増えるほどダメになりそうな気はガンガンしていますが、とりあえずサクッとつくるという感じだったので、いったんこれで笑

あとは、これをCFOと私だけが見れるワークスペースに発行することで、Webや Power BI アプリから今の所持金が把握できるようになりました。

# まとめ

というわけで、日々のちょっとした困りごとも、ちょっとしたアイデアで簡単に具現化できるという実例でした。

実際に経営者をやってみると、いろいろめんどくさい業務っていうのは結構あるので、こういうちょっとしたものも、経営者自らが解決していけば、社内のＤＸも推進されていくのではないかと思います。
C# 浦島太郎な私が Visual Studio 2022 で Minimal API を試したら手軽だった

## はじめに

この記事では、ASP.NET Core の Minimal API を使用して、簡潔で迅速に開発できる Web API の作成方法を紹介します。

4 年ほど前（2020 年ごろ）まで C# でバックエンド API の開発をしていた私ですが、下記の記事の執筆時に、そもそも Mock を使わずに動作するのかを検証しようとしました。

https://qiita.com/pokapu/items/bb4d6bd7645ca4820235

呼び出し先の API は慣れた言語で書きたいと思い、C# で記述することは決めていたものの、いつもの WeatherForecast を加工するのも手間だなと思っていたら、Minimal API という存在に気づきました。

https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/minimal-apis/overview?view=aspnetcore-8.0

手軽に始められるので、簡単な手順と共にご紹介します。

## 4 年前（2020 年ごろ）の私の知識

Visual Studio で 以前から知っている構成で ASP.NET Core Web API のプロジェクトを新規作成すると、下記のような Controller が生成されます。

```csharp
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
```

これはこれで、様々な C# のメリットを享受できる実装なのですが、縦にも横にも長いです。
動作検証用の API をサクっと作りたいときには冗長な感じがありますし、久しぶりに C# に触れた私は、API のパス指定方法を思い出せませんでした。

## Minimal API を利用したコードの生成

Minimal API を利用する際は、ASP.NET Core Web API のプロジェクトの作成時、下記の赤枠の 2 つのチェックを外してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/cf6c7f3a-1aaa-596d-7697-36eb7935a096.png)

すると、とてもシンプルなコードが生成されます。
Controller に相当する部分は下記で、直感的で必要最低限の情報量になった印象です。

```csharp
var summaries = new[]
{
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

app.MapGet("/weatherforecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();
```

コードの各部位の役割が推測しやすいので、すぐに調整できそうです。
例えば記事執筆時に実装が必要となったコードは抜粋すると下記のようになり、非常に効率的に開発を進めることができました。

```csharp
app.MapGet("/users/1", () =>
{
    return new
    {
        id    = 1,
        name  = "User A",
        email = "a@example.com"
    };
})
.WithName("GetUser")
.WithOpenApi();
```

※ `WithName()` や `WithOpenApi()` が無くても動きます

デバッグ実行すると、いつもの Swagger UI も立ち上がるので、動作確認もすぐできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/91c528e0-63c9-2499-626d-bf5be1722cb7.png)
ssh Permission denied (publickey)エラー

# はじめに
今回は，Xserverで仮想環境を構築し，SSH接続を試みたところ，Permission denied (publickey) というエラーが発生した．この問題の解決方法を備忘録として記録する．
# 仮想環境の概要
* OS: Ubuntu 22.04
* サーバ：Xserver
# エラー原因
原因は，sshのconfigファイルに誤りがあったからである．ubuntuにはubuntuユーザがいるのが前提と思い込んでおり，configファイルのuserにubuntuと書いてしまっていた．実際にXserverにおける仮想環境のubuntuにはrootユーザしか登録されていなかった．
rootユーザでのssh接続はセキュリティの面であまりよろしくないらしい．なので一般ユーザを追加することにした．
# 追加方法・その他設定
これを参考に，一般ユーザを作成することで無事一般ユーザでssh接続できた．
https://www.harataka.com/xserver-vps-ssh-setting/
FlutterでTimerを使用した定期処理を実装したことについて

# はじめに
入道雲サーチアプリを作成する中で、現在の情報が欲しいため定期的にapiを取得して画面に表示させたいと考えました。そこで調べたところTimerというクラスがあることを知り、使ってみたところ上手く行ったため、ここに記そうと思いました。

### Timerとは
指定した時間が経過した後に、一度だけ、または繰り返し特定の処理を実行するために使用する。

## 今回使用したコード
```
import 'dart:async';


  @override
  void initState() {

    //ここから
    Timer.periodic(
      const Duration(seconds: 5),
      (Timer timer){
      fetchWeatherForCities();
      },
    );
    //ここまで

    super.initState();
  }
```

## 解説
```
import 'dart:async';
```
Timerは`dart:async`ライブラリで定義されているクラスのため、これをインポートする必要があります。

```
Timer.periodic(
      const Duration(seconds: 5),
```
`Timer.periodic`：繰り返し起動するTimerを使用するときに使う。
`const Duration(seconds: 5)`：5秒に一度実行する。

```
      (Timer timer){
      fetchWeatherForCities();
      },
);
```
`fetchWeatherForCities();`：ここに動作させたい処理(今回はメソッドの呼び出し)をかく。
Jupyterでpd.DataFrameの出力をスクロール可能にする

以下のプログラムをjupyterのセルで実行すると，セルの出力がスクロールが可能になる．

```python
import pandas as pd

def custom_dataframe_display(df):
    return df.style.set_table_styles([
        {'selector': '', 
         'props': [('max-height', '500px'), # スクロールの縦幅
                  ('overflow-y', 'scroll'),
                  ('display', 'block')]
        },
        {'selector': 'thead th', 
         'props': [('position', 'sticky'),
                  ('top', '0'),
                  ('background', '#303030'),  # ヘッダーの背景色
                  ('z-index', '1')]  # 他の要素より前面に表示
        }
    ])

# DataFrameの表示形式をカスタマイズ
pd.DataFrame._repr_html_ = lambda self: custom_dataframe_display(self)._repr_html_()
```
Asanaフル活用で引継ぎ準備軽減！もう慌てないスムーズな引継ぎを実現する方法

引継ぎ、それは社会人にとって避けては通れない道。担当変更や異動など、様々な場面で発生し、準備不足だと大きな負担になってしまいます。今回は、ワークマネジメントツールAsanaをフル活用することで、引継ぎ準備の手間を劇的に削減した事例をご紹介します。

### 1. 理想の引継ぎとは？Asanaで目指す姿:sparkles:
理想の引継ぎとは、"事前に準備に追われることなく、スムーズに業務を引き渡せる状態"です。Asanaを導入することで、日々の業務内容を記録・蓄積し、誰でも必要な情報にアクセスできるようにすることで、この理想を実現しました。

### 2. Asanaに何を記録する？具体的な活用例:writing_hand:
Asanaには、タスクの説明欄にタスクの概要、関連資料へのリンク、会議の議事録や検討経緯など、あらゆる情報を記載しました。これにより、情報がAsana上に一元化され、必要な情報をすぐに探し出せるようになりました。

### 3. Asana導入前と導入後で何が変わった？:eyes:
以前は、Excelで引継ぎ資料を作成し、担当者との打ち合わせで口頭で説明する、という煩雑な方法を取っていました。Asana導入後は、これらの作業が不要になり、大幅な時間短縮を実現。必要な情報はAsana上ですべて確認できるため、打ち合わせもスムーズに進み、引継ぎにかかる時間を大幅に削減できました。

### 4. Asana導入時の苦労と工夫:ghost::angel:
Asana導入にあたっては、チームメンバー全員にAsanaの使い方を理解してもらうことが課題でした。そこで、チーム会などでAsanaの画面を共有し、議事録をリアルタイムでタスクに書き込んでいく様子を見せることで、Asana活用の模範を示しました。この工夫により、チーム全体でAsanaに情報を集約する習慣が自然と身につきました。

### 5. Asanaで引継ぎ準備を始める人へのアドバイス:santa:
Asanaを使った引継ぎ準備を始めるにあたって最も重要なのは、「情報を蓄積する」という意識を持つことです。日々の業務内容をAsanaに記録していくことで、リアルタイムでタスクの進捗状況を共有できるだけでなく、急な休暇発生時のフォロー体制も整います。結果として、引継ぎ準備の負担軽減にも繋がるのです。まずは簡単なタスクからAsanaに登録し、徐々に活用範囲を広げていくことをおすすめします。

Asanaを導入することで、引継ぎ準備の負担を軽減し、スムーズな業務の引き継ぎを実現できるだけでなく、チーム全体の業務効率化にも貢献します。ぜひ、Asanaを活用して、スマートな働き方を実現しましょう！
Git　基礎

## Gitとは
バージョン管理システム　変更履歴記録
ファイルの共有・同期・バックアップの機能

- Git
プログラム
- GitHub
Gitを用いた操作サービス
リモートリポジトリを置くサーバーを用意してくれる（ホスティングサービス）
- Source Tree(GUI)
ファイル管理ソフトウェア

## バージョン管理システム
- 中央集中型　リポジトリは１つ
専用サーバー（リポジトリ）でファイルバージョンを一元管理
→同じファイルを複数人が扱う
ユーザーはPCにリポジトリをコピーし、サーバーリポジトリと常に同期

- 分散型　リポジトリは各々　ex.)Git
各PCの独立したリポジトリとサーバーリポジトリを同期
使用時
ファイル更新→PC内のローカルリポジトリに記録→サーバーのリモートリポジトリに反映

## Git基本単語
#### リポジトリ
フォルダ。データ保存場所。
リモートリポジトリに対してローカルリポジトリ

#### コミット　
ローカルリポジトリに記録すること
前回コミットからの差分が記録。時系列で保存

#### ブランチ　
プロジェクトから分岐し、影響を与えずに開発できる
枝分かれ作業で使用
Gitではメインブランチから自分専用ブランチを作成する
→作業完了後、メインブランチに反映

- 統合ブランチ　
masterブランチ。分岐元
- トピックブランチ
課題解決のために作成。作業完了後、統合ブランチに取り込む

### 統合
#### マージ
複数ブランチを結合。履歴が残るので複雑
#### リベース
統合ブランチに続いて結合。履歴は１本
統合ブランチからトピックブランチをマージして先頭移動
戻れない

### アップロード
#### プッシュ
ローカルリポジトリがリモートリポジトリをプッシュして変更を反映、履歴を同じにする。
#### クローン　
リモートリポジトリの複製
リモートリポジトリ内容をダウンロードし、別PCにローカルリポジトリ作成。履歴も。
#### プル
作業中、他の人のプッシュ内容を取得するため、前回クローンから最新にすること。自動マージ
#### フェッチ
マージしたくない時のプル。取得コミットは名無し
#### フォーク
他リモートリポジトリをGitHub内にコピー
#### チェックアウト
作業ブランチ切り替え
#### プルリクエスト
ローカルリポジトリの変更を他開発者に通知
変更箇所分かりやすく＆コミュニケーションの場を提供


#### 競合
複数masterブランチがマージ出来ずぶつかる
複数人が同じ行を変更した時。手動で解決
　

## ブランチの種類
####  master
メインブランチ。マージする用。本番環境
#### develop（トピックブランチ）
developブランチからさらに切って(feature)使用
#### feature
 developブランチから分岐。トピックブランチ。
#### release
 リリース用。最終調整。完了後masterにマージ
#### hotfix
 リリース後の緊急修正。masterから分岐
　→修正後、masterとdevelopにマージし、リリースタグを打つ
　→削除
#### support
 旧バージョンのサポート

## 初めの手順
対象ソースをクローン/フォーク
作業用ブランチ作成
作業
コミット
プッシュ
プルリクエスト作成
↓
確認しレビュー
問題ない場合マージ
プルリクエスト不要な場合、クローズ
cpanmでモジュールを現在の場所にインストールする

cpanmでレンタルサーバーにモジュールをインストールしたいときに、ユーザーのデフォルトの場所にモジュールをインストールするんじゃなくて、そのアプリケーションがあるフォルダの中にインストールしたいときのやり方。

    cpanm -L cpanlib install ThisModule

という感じで `-L` でインストールしたいディレクトリ名を指定できる。上述のコマンドだと `cpanlib` という名前のディレクトリにインストールする（なかったらそのディレクトリをつくる）。
Node.js で deprecation warning を無視する

# あまりやらない方がいいとは思う

けど，理由があって，deprecation warning を無視したかった

- 短期的なもの
- 自分でコントロールしていないものの内部
    - fork して何かする程がんばる何かではない

```
$ node -e 'new Buffer("")'
(node:59511) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
$ node --no-deprecation -e 'new Buffer("")'
$ NODE_OPTIONS=--no-deprecation node -e 'new Buffer("")'
```

## Refs

https://nodejs.org/api/deprecations.html#DEP0005

https://efcl.info/2024/02/04/emitwarning/
ここがだめだよ、Boxくん！！

Boxを使ってて残念な仕様や、よく陥る罠について書ければと思います。
Box、使いやすいのでこれを機により良くなってくれることを祈りつつ…。

## 使用ライセンス
Business Plus

## 実際にあったこわい話

### Box DriveとWeb版問題：Web版のほうが有能説
Boxを使っていると、BoxDriveやWeb版を使うことになると思いますが、
Web版でできることと比べて、BoxDriveでできることの少なさや使いにくさが目立ちます。。

例えば、[Box公式:ウェブだからこそのメリットとは](https://support.box.com/hc/ja/articles/7677764666003-Box%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E7%89%88%E3%81%A8Box-Drive-%E3%82%A6%E3%82%A7%E3%83%96%E3%81%A0%E3%81%8B%E3%82%89%E3%81%93%E3%81%9D%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF-%E7%AE%A1%E7%90%86%E8%80%85%E5%90%91%E3%81%91%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96)であげられているこの表を見ると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/e6a837dd-68b8-f08e-27b2-f2502a74906e.png)




BoxDriveでは  「ごみ箱から復元ができない」 という致命的なポイントに気づくはずです。
なので、誤ってフォルダやファイルをBoxDriveから削除してしまうと復元できず、管理側がログ等を見て突き止めないといけません。

また、Boxの「すべてのファイル」に出るファイル、フォルダが自分自身がコラボレーター招待されたものも含まれているので、ごちゃごちゃになり、ユーザーは分からず勝手に自分には関係ないファイルだと思い、削除する人が後を絶たずということになってしまいます。

解決するために、お気に入りやコレクション機能などありますが、正直設定が面倒&わかりにくい。

また、BoxDriveを制御する方法もわからない･･･。
しかし、マクロを使うなら、Driveのほうが使いやすい･･･。

負のスパイラルへ･･･。

### よくある問い合わせ

👤：利用者
👦：情シス

----------------------------------------------------------------------------------------
👤＜ファイルのアップロードをBoxDriveからできません！
👦＜Cドライブの空き容量がアップロードファイルよりも少ないみたいです！
　　Cドライブの空き容量を減らしてください！

👤＜Boxからファイルを開けません／編集できません！（Web版）
👦＜右上にある「開く」ボタンからExcelOnlineを開いてください！

👤＜アイテムが見つかりません！！（Web版）
👦＜すべてのファイルでは、コラボレータ招待されたものも表示されます。
　　上に「ファイルおよびフォルダを検索」から検索してみてください。

👤＜権限（共同編集者→ビューワーなど）を誤って変更しちゃいました！！
👦＜同じフォルダに共同編集者がいれば、その方にコラボレータ招待してもらってください。
　　もし、いない場合は情シスで割り当てします！
  　（割り当て方法は、管理アカウント＞対象のフォルダを検索＞コラボレータ管理からユーザ追加）

などなど･･･

ちなみに公式からは、[さまざまなBox Driveエラー通知](https://support.box.com/hc/ja/articles/360043697614-%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AABox-Drive%E3%82%A8%E3%83%A9%E3%83%BC%E9%80%9A%E7%9F%A5)というトラブルシューティングが公開されています。

別途参照：[FAQ、トラブルシューティング](https://support.box.com/hc/ja/categories/21356672484115-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8FAQ)


## アカン仕様

- 全文検索の1万バイト制限の使用

Boxの検索機能には全文検索（ファイルの中身すべてから検索する機能）における「1万バイトの仕様」が存在します。

1万バイトはだいたいワード2,3ページ分くらい･･･。
4ページ以降の1万バイトが超えた分は検索できないことになります。。
これでは全文検索できるとは言えないですよね･･･。

- ごみ箱問題

ごみ箱へ捨てたファイルを復元できるのは、
①所有者　②ごみ箱に捨てた人　だけになります。

しかし、コラボレータ招待されているフォルダをごみ箱へユーザーが捨てると、コラボレータ権限がはく奪されてしまい、ごみ箱から復元できなくなってしまいます･･･。
なので、復元できるのが所有者になります。
管理アカウントで対象のフォルダへもう一度ごみ箱に捨てた人をコラボレータ招待することでごみ箱から復元はできるのですが、面倒くさすぎる･･･！！！

----------------------------------------------------------------------------------------
最後に、
他にも色々アカン仕様はありますが、割愛させていただきます･･･。

こき下ろしてしまいましたが今後のBoxに期待です！！！
実際に使ってみてわかった！テスト自動化ツールMagicPodの良かったことろ・良くなかったところ

# はじめに
スマホアプリのリグレッションテストとしてMagicPodを2年ほど使っています。その中でMagicPodを使って良かったことろ、良くなかったところを正直に書いてみました。

# 良かったところ
### ノーコードなので簡単に作れる・動かせられる
やはり、MagicPodを導入した1番の理由がノーコードです。
過去にAppiumを用いてテスト自動化に取り組んだことがあるのですが、知識を持った人があまりおらず道半ばで挫折した背景もあり、テストを動かすためのインフラが不要・直感的に操作してテストを作れる・すぐにテストを動かせることのできるノーコードだったから2年間継続して使ってこれたのだと思っています。

### 料金が良心的
自動テストの導入を検討していたころに別のノーコードツールといくつか比較をしていたのですが、それらに比べ料金はとても安かった印象です。この点も自動テスト導入におけるハードルが下がった1つの要因だと思います。

### どの料金プランでもテスト実行回数無制限
別のノーコードツールではテストの実行回数に制限があったり従量課金だったりするのに対し、MagicPodはどのプランでもテストの実行回数に制限がありません。MagicPodを導入してテストを作り始めた時に制限に達したのでテストが作りきれなかった・たくさんテストを実行したから料金が増えた、、なんてことがありません。

https://magicpod.com/pricing/

### サポートが手厚いので失敗したテスト分析が捗る

なぜこのテストが失敗してしまったか、自分たちの力だけでは原因分析ができないケースもあると思います。その時は、MagicPodのテスト実行結果ページから、そのテストが失敗した内容について簡単にサポートに問合せすることができます。必要に応じて内容を追記しボタンを押すだけです。
またその返信も内容によってはすぐ返していただけたりととても助かっています。

https://support.magic-pod.com/hc/ja/articles/4411400402585

# 良くなかったところ
### テストレポートやダッシュボード機能がない
例えば、ここ1週間に実行したテストのうち成功したテストの割合は？たくさん失敗しているテストはどれ？テストの実行時間の推移は？など、自動テストをメンテナンスしていくにはこういった情報がまとまったレポートやダッシュボードがあると嬉しいですよね。
MagicPodにはそういった機能がないので、ぜひ作っていただきたいです笑

そのため、私達のチームではダッシュボードを自作しています。詳しくはこちらの記事をご参照ください。

https://qiita.com/yoda_naan/items/6ae1db87ffa44ed788df

### ブランチ機能
テストケースを変更する際に、メイン（マスター）のテストケースは変えずにやりたい時って結構あると思います。そういったことが可能になるブランチ機能は、~~現在開発中とのことでした~~。

（2025/1/9追記）ベータ版がリリースされました！！まだ使ってはいないのですが、良さそうです！

https://support.magic-pod.com/hc/ja/articles/40981471377817

~~ブランチ機能がないので、複数の人がテストケースを変更したいときに調整したりうまく運用できるようルールを定めたりしないといけなく、それにかかるコストやリスクがある状態です。~~

### iOSの実行時間が長くなる時がある（基本的にAndroidに比べ長い）
iOSのテスト実行時間は基本的にAndroidに比べて長くなる傾向があり、時には2倍近くの時間になることもあります。
こちらも改善中とのことで、今後に期待です。

https://support.magic-pod.com/hc/ja/articles/20127503942425-iOS%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%8CAndroid%E3%82%88%E3%82%8A%E3%82%82%E9%81%85%E3%81%84

### クラウド端末の同時実行数がデフォルト（※スタンダードプラン）2台と少ない
同時に実行できるテストが2つまでということなので、早くテストを終えるために3台以上並行してテストを動かすことができません。オプションで数を増やせるのでお金で解決するしかないのがちょっとつらいところですね。。

# おわりに
総じてMagicPodは使い勝手が良くユーザーフレンドリーなツールだと思っています。良くなかったところもほとんどが改善中・開発中とのことなので、今後良くなることを期待しています！
ubuntu パスのコピーができない時の対処法

# はじめに
こんにちは！
仮想環境ぶっ壊しマンのBaNanaです！
この現象は仮想環境をぶっ壊して前世を捨て、Second Periodに旅立った(新しく環境構築した)時に発生しました。
備忘録的な何かとして残しておきます。

# 現象と解決
### 環境
* Windows 10 Pro 22H2
* Oracle VM VirtualBox 7.0
* ubuntu 20.04.6

### 現象
ubuntuの任意のフォルダ上で右クリックコピーをし、テキストエディタなどにペースとしてもディレクトリのフルパスではなく以下のようになってしまう。
(今回は例として `/home/user` 上で右クリックコピーしたとする)
```
x-spesial/nautilus-clipboard
copy
file:///home/user
```

### 解決方法
ターミナルを開き、以下のコマンドを実行する。
``` bash
sudo apt install nautilus
```

### 結果
ubuntuの任意のフォルダうえで右クリックコピー後テキストエディタにペーストすると
```
/home/user
```
のようにディレクトリのフルパスのみ出るようになる。

# おわりに
原因はまだ調べ中です。
とりあえずこれで解決できるのでお試しください。
キャリアブレイク中にやっている勉強⑧ 読書

今日もキャリアブレイク中に具体的にやっている勉強について書きます。勉強は今日でラストです。その⑧は「読書」です。

# 読書
読書は1日3回、時間を取っていて、朝の読書30分、夜の読書30分、それと寝る直前に読んでいます。朝は割と高頻度、夜は低頻度、寝る前は（酔っぱらってない限り）ほぼ毎日読んでいます。

# 朝の読書
朝の読書は実はイベントです。[朝の読書30分一本勝負](https://asadoku30.connpass.com/)というグループがあって、そこのイベントとして始めたものです。イベントと言っても朝オンラインで集まって30分読書するだけです。出欠も最初に「〇〇の本を読みますー」とツイートして、「読みましたー」とツイートするだけです。実はツイートすら特に強制ではなく、やらなくても構いません。

# ゼロじゃない
読んだと発信するだけでも、もしその時自分がやっていない場合、次やろうかなという気持ちになります。この気持ちになることが重要です。もしグループに入っていなかったらこの気持ちは起きません。ゼロとイチの差は言わずもがな大きいのです。このグループの目的はまさにここがポイントです。

# さらに実況中継
さらに僕に関しては、もう一方進めて、本の内容を30分実況中継的にツイートしています。もともとツイート読みは手間だと思いつつ、なんとはなしに始めたのですが、実際やってみると手を動かすことでより深く読める気がしています。自分にとって[クリティカルに集中する方法](https://note.com/binnmti/n/n3e15323052ab)だったようで、実際この習慣を続けてから今までよりずっと集中して本が読めるようになりました。

# 今読んでいる本
今読んでいる本は[DIの原理・原則とパターン](https://amzn.to/3VBFZ5t)で、なんとP.600越えです。キャリアブレイクより前の7月から読み始め、10月は18回、11月は20回読んでいましたが、まだ50%に至っていませんでした。この本で[読書会](https://cs-reading.connpass.com/event/338843/)もやっているですが、今のペースだと100回超える可能性がありますｗ。

# 夜の読書
夜の読書はこのイベントとは別で自分のためだけにやっています。とはいえ実況中継もしていてツイートだけを見ると朝とやることは変わっていません。単に1日2冊読もうかなと思ってやっただけです。こちらは朝に比べると内容が濃くないので安心して読めます。ただ何かと寝る前はやることがあって、1週間に1回ぐらいしか読めていません。

# 寝る前読書
朝と夜のツイート読みする場合は必ず技術書ですが、寝る前に読んでいる本は決まっていません。紙の本を図書館で借りてきて読んでいます。これは読んでいて眠くなったらそこで眠るための睡眠導入剤の効果もありますｗ。


# 実際読んでいる本
今、読んでいる本は栄養学、仏教、英語が多いです。英語は1冊5分ぐらいで読める簡単な本なので、先ずこれを声を出して読んでいます。その後、仏教か栄養学を読むことが多いです。仏教は特に睡眠導入効果が高く、あまりページ数を読めないですが、しっかりした睡眠をとるにはおススメですｗ。正直この読み方でどれだけ頭に入っているか疑問なので、最近は仏教はマンガちっくな簡単な本を好んで借りるようになってきています。

# まとめ
というわけで、読書も必ずしています。特に朝起きてすぐ読書するのは良い習慣にもなっているので、働きながら出来るか分からないけれど、これは続けたいと思っています。余談ですが、このライフスタイルになって読書量が増えた半面、マンガを読む量がかなり減りました（ゼロではない）。何度か減らそうと思ったことはあったのですが、気づくとすぐにリバウンドするので、人生でマンガの量を減らすことは諦めていたぐらいです。にもかかわらずキャリアブレイクしたら自然に量が減ったので、結論としては禁マンガにはキャリアブレイクをおススメします（つまり働けばまた再開するという示唆でもあります）。
クライアントとDBのタイムゾーン差異について

# はじめに
フロントエンドからパラメータとして受け取るタイムゾーンがバックエンド側、DBとどのような関係であるのかを理解し、思い出せるために、備忘録としてこの記事を作成する。
この記事は、著者がクライアントからあるデータを更新するEndpointの作成のための仕様書を作成するにあたって、疑問に思ったことを記している。
# 結論
仕様書のリクエストパラメータのsampletime
このタイムゾーンは、UTCと表記するべきである。(プロジェクトや仕様によって異なる)

## 前提
DB(PostgreSQL)でのタイムゾーンはUTCである。
ここでは、あるdatime型のパラメータをsampletimeとする。(実際の中身はコンプライアンスに反するので省略)
# 課題
フロントエンドから送られてくるリクエストパラメータの中身の**sampletime**
このパラメータのタイムゾーンは、何が基準なのかが明確でなかった。(UTCなのかJST,GMT)

これらを明確にしないと以下のような誤った処理の例が生まれてしまう。

## 誤った日時処理の例
**① フロントエンドからの入力**
ユーザーが日時を入力: 2024-12-11 00:00:00
フロントエンドでは、これを JST（日本標準時） として意図して送信。
**② データベースに保存**
サーバー側で特にタイムゾーン変換をせず、そのままデータベースに保存。
データベースではUTCとして保存される前提のため、この値は 2024-12-11 00:00:00 (UTC) として解釈される。
**③ データを利用する**
ユーザーに日時を表示するとき、DBに保存されている 2024-12-11 00:00:00 (UTC) をJSTに変換。
UTC→JSTの変換で+9時間され、結果的に 2024-12-11 09:00:00 (JST) として表示される。
**④ 結果**
本来ユーザーが意図した2024-12-11 00:00:00 (JST) ではなく、誤った日時（2024-12-11 09:00:00 JST） が表示される。

# 解決策
自身が開発しているプロダクトでは、ユーザーから受け取った値をフロントエンドでUTCに統一しているケースが大半であるので、リクエストパラメータの**sampletime**
このタイムゾーンは、UTCで送られてくる。
そのため、仕様書のパラメータのvalueのタイムゾーンはUTCとするべきである。

# 参考文献

https://buildersbox.corp-sansan.com/entry/2022/02/01/110000
https://qiita.com/kazuho39/items/58986109a705c82380d6
Workato：IDP by Workatoで文字認識を行う際の注意事項

:::note  info
本記事と併せて以下の記事もご覧ください。

[Workato：WorkatoのAI OCR機能「IDP by Workato」を試してみる](https://qiita.com/tabimoba/items/e1cdc12256dfad7e5da0)

[Workato：IDP by Workatoでフィールドを認識させるために必要な手順](https://qiita.com/tabimoba/items/54ffc285cd3cddd9e55c)

:::

IDP by Workatoは、生成AIをベースとしたOCR機能で、従来のパターンマッチングによるOCRとはアプローチが異なります。

https://docs.workato.com/connectors/idp-by-workato.html

https://www.workato.com/platform/idp

:::note warn 
OCRはOptical Character Recognition（光学文字認識）の略称ですので、IDP by WorkatoをOCRと呼ぶことは適切ではありませんが（ICR=Intelligent Character Recognition インテリジェント文字認識と呼称するのが本来は適切ですが）、便宜上OCRと呼ぶことにします。
::: 

これまでOCRを利用された経験のある方であれば、数字の「1」とアルファベットの「I」（アイ）あるいは「l」（エル）、数字の「0」とアルファベットの「O」（オー）、漢数字の「１」と記号の「－」（ハイフン）など、似た文字を誤認識するということは、経験上あると思います。

IDP by Workatoにおいても、同様の誤認識を行う場合もありますが、これに加えてハルシネーション（異なる情報を生成する事象）を引き起こす場合もあります。この点は、従来型のOCRには見られない事象と言えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fb9b6ae4-7da5-088f-46ea-6f6f7a4c4079.png)

※以下の「履歴書の書き方」をサンプルに利用

https://www.r-agent.com/guide/article2846/

なお、幸いなことに、IDP by Workatoでは認識結果に対するスコア（Confidence scores）が出力され、この結果をもとに認識精度を判断することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8bb1a5c9-da6b-da89-13ea-e88a60cbf872.png)

目安として、Confidence scoresが9割を下回るフィールドについては、誤認識あるいはハルシネーションが生じている可能性があります。

よって、IDP by Workatoの利用にあたっては、認識結果をそのままシステムへセットするのではなく（認識結果を鵜呑みにするのではなく）、認識結果とシステムへの値セットの間に人による意思決定や修正のプロセスを挟む（例えば、SlackやTeamsへ認識結果を連携し、各コミュニケーションツール上のUIで修正を行う）、あるいはシステムへセット後に担当者へ内容の確認と修正を指示する仕組みの運用を行う等、何らかの段階において人が介在する仕組みとすることを推奨します。

また、IDP by Workatoのような生成AIをベースとしたOCRを利用する際は、従来のOCRの常識を捨てて利用する必要があるでしょう。例えば、AI OCRにおいてはハルシネーションが生じる可能性は常にあり、それはAI OCRにおける常識になります。「OCRはこうあるべき」という考えがある場合は、ハルシネーションが起こる事象についてなかなか納得いかないところもあるかもしれませんが、技術は常に変化するもの、進化するものとして理解いただけましたらと思います。
[React] メモ：BunでReact + Vite環境を構築する

# はじめに

https://qiita.com/grhg/items/4b18f735bc865a1de137

で、Svelteの環境を構築しましたが、Reactもよく使うので構築のメモを残しておきます。

# 手順

以下に沿ってやれば簡単に構築できます。

https://bun.sh/guides/ecosystem/vite

## プロジェクトの作成

以下のコマンドを実行します。
```bash
bun create vite bun-vite-react-sample
```

すると対話形式で作成を進められます。
「React」、「TypeScript + SWC」を選択します。

```bash
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC

Scaffolding project in ./bun-vite-react-sample...

Done. Now run:

  cd bun-vite-react-sample
  bun install
  bun run dev
```

## 起動してみる

以下のコマンドを順に実行します。

```bash
cd bun-vite-react-sample
bun install
bunx --bun vite
```

`bunx --bun vite` 実行後に、以下のような結果が出力されます。

```bash
  VITE v6.0.3  ready in 139 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h + enter to show help
```

出力されたURLにアクセスすると無事に起動していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/b629c193-93f0-eec0-f37c-bb5281e6abd6.png)


## package.jsonの修正

公式サイトに沿って、`bunx --bun vite` をシンプルに起動できるように修正します。

`package.json` の `scripts` を以下のように修正します。
公式サイトには `dev` の修正しか書かれてませんが、`build` と `preview` も一緒に修正してしまいましょう。

```diff_json
// ...
"scripts": {
- "dev": "vite",
+ "dev": "bunx --bun vite",
- "build": "tsc -b && vite build",
+ "build": "tsc -b && bunx --bun vite build",
  "lint": "eslint .",
- "preview": "vite preview"
+ "preview": "bunx --bun vite preview"
},
// ...
```

これで、以下のコマンドで起動できるようになりました。

```bash
bun run dev
```


## ビルド

以下のコマンドを実行します。

```bash
bun run build
```

正常にビルドされました。
```
$ tsc -b && bunx --bun vite build
vite v6.0.3 building for production...
✓ 30 modules transformed.
dist/index.html                   0.46 kB │ gzip:  0.30 kB
dist/assets/react-CHdo91hT.svg    4.13 kB │ gzip:  2.05 kB
dist/assets/index-n_ryQ3BS.css    1.39 kB │ gzip:  0.71 kB
dist/assets/index-DMBE2hB0.js   143.90 kB │ gzip: 46.34 kB
✓ built in 265ms
```


起動してみます。
```bash
bun run preview
$ vite preview
  ➜  Local:   http://localhost:4173/
  ➜  Network: use --host to expose
  ➜  press h + enter to show help
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/00f4b719-24f1-adca-de23-8b7a97157c63.png)

無事に起動していますね。

# 終わり

Svelte+SvelteKit に続いて、React+Vite 環境を構築しました。
しばらく、プライベートでは bun を使っていきたいと思います！
【OpenAI ChatGPTクリスマスイベント第５日目】Appleデバイスとの統合です。


　どうも、カーブミラーです。

　今回は、OpenAIのクリスマスイベント。今日は第５日目。Appleデバイスとの統合です。

:::note info
本記事は、ChatGPTについての
記事です。　　　　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　今日（2024/12/12）の
　　8:40くらいから
　　　障害が発生しているようですね。

　全ステータスが、赤一色。

　Appleとの連携が
　　原因かと疑ったけど、
　　　別の要因の気がします。

　ChatGPT Proプランに
　　課金した方々、御愁傷様。
　　　いや、課金してる
　　　　全員なんだけどね😅

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1867000372826607627?t=IGMOdt8uCf871oJrvMbnww&s=19)
>（DeepL翻訳）
>現在、障害が発生しています。 現在、問題を特定し、修正プログラムを配布しています。
>
>申し訳ありません！　引き続き、情報を流します。

　PS.
　　11:30ころ、復旧しましたね。
　　　良かった良かった。
***
　とりあえず、路線を戻します。

　まずは、ニュースです。

　GoogleのGeminiが、
　　バージョンアップしました。

　Gemini 2.0です。

　Web版で
　　「2.0 Flash Experimental」を
　　　選択可能です。

　モバイルアプリ版の対応も
　　近日実施予定。

　詳細は、こちらを参照してください。
　　[ChatGPT研究所さんポスト](https://x.com/ctgptlb/status/1866887699115938113?t=LTvs-QfrSEu70hfnWj7hZA&s=19)
***
　次は、記事の追加情報です。

　昨日（2024/12/11）、
　　Canvas機能のアイコンである
　　　ツールボックスが出てこないと
　　　　書きました。

　どうやら、
　　スマホブラウザを
　　　PC版サイトにしてないと、
　　　　Web版ではアイコンが
　　　　　出てこないようです。

　通常の場合、
　　操作するには、
　　　“/”を入力して、
　　　　機能メニューの選択を
　　　　　する必要があります。

　スマホアプリ版では
　　“/”が反応してくれません。
　　　今後に期待しましょう。
***
　さて、【本題】です。

　OpenAIの
　　クリスマスイベントの第５日。
　　　まずはごあいさつ。
　　　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1866903595628761176?t=F2MNBt1TOzjcdgLKCg0wkA&s=19)
　　　　　中身は、OpenAIの
　　　　　　イベントページへの誘導。

　イベントのようす。
　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1866943282795938013?t=DEKTtwiNyH-eN2L29nRkgA&s=19)

　今回は？

　ChatGPT in Apple Intelligence。

　Appleデバイスとの
　　ChatGPT統合を本格展開、
　　　だそうです。

　対象デバイスは、
　　iPhone 16シリーズ、
　　iPhone 15 Proシリーズ、
　　A17 Pro/M1以降のiPad、
　　M1以降のMac　で利用可

　ただし、
　　日本語対応は、
　　　2025年4月以降になります。
　　　　それまでは英語設定ですね。
***
　Siriから
　　ChatGPTが呼び出される模様。
　　　Siriがタスクを判断するか、
　　　　ユーザーがSiriに呼び出しを
　　　　　依頼する形になる。

　このときに
　　ChatGPTアカウントは必要なく、
　　　そのまま利用可能。

　これはたぶん、
　　すでにAppleアカウントで
　　　入っているから、かも？

　ChatGPTアカウントで
　　利用すれば、さらなる機能を
　　　利用可能らしい。

　Siriとのやり取りから
　　ChatGPTアプリに移動するのも
　　　下部のボタンをタップするだけ。
***
　iPhone 16／16 Proシリーズに搭載の
　　「カメラコントロールボタン」から
　　　カメラが映した被写体に
　　　　ついて聞ける
　　　「ビジュアルインテリジェンス」
　　　　　機能も利用可能。
***
　ただし、
　　以下のことに❗注意❗。

　iPhoneには、
　　「iOS 18.2」への
　　　アップデートが必要。

　設定は、
　　ユーザー自身で
　　　行なう必要がある。
***
　Apple Intelligenceとの連携は、
　　同日より配信が始まった
　　　「macOS Sequoia 15.2」にて
　　　　対応する、そうです。

　詳細は、
　　こちらを参照してください。

　　[ChatGPT研究所さんポスト](https://x.com/ctgptlb/status/1866918263676162368?t=--3s_5HIPgYZiTXoDfy5EQ&s=19)

　　[ITmedia NEWSポスト](https://x.com/itmedia_news/status/1866936011340779791?t=k4rRa-GDEJl2SeGxotpikw&s=19)

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ふりかえりの紹介 - 定着した振り返り文化が拓く、チームの持続的改善

# はじめに
私は株式会社スタンバイで、求人取込・配信システム領域のプロダクトオーナーを務めています。

今回は、私が所属するチームで行っている「ふりかえり」活動について、振り返ってみようと思います。

# ふりかえりの種類
「ふりかえり」と一口に言っても、様々な観点や目的があります。ここでは、主に以下の3つに分類します。

1. スクラムのイベントとして行うふりかえり
2. 定期的なチーム活動のふりかえり
3. テーマを限定したアドホックなふりかえり

それぞれについて順に見ていきます。

# スクラムのイベントとして行うふりかえり

チームはスクラムを採用しており、1週間を1スプリントとして開発を進めています。その中で、ふりかえりを行う主なタイミングは以下の3つです。

- スプリントレトロスペクティブ
- デイリースクラム (Daily Scrum)
- スプリントレビュー

ここからは、それぞれのふりかえりの変遷や工夫について振り返ります。

## スプリントレトロスペクティブ

この1年間、スプリントレトロスペクティブ（以下、レトロ）の手法自体は大きく変えずに実施してきました。

![スクリーンショット 2024-12-12 11.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65620/d4496428-3006-ec45-b00a-e638b036ba9a.png)

主な内容は次のとおりです。

- スプリント完了作業とベロシティの記録・確認
- スプリントゴールに対する Sailboat 形式での振り返り
- 日常で生じた論点の確認・議論

途中からはチームを2つに分割し、一方はスプリントゴール達成、もう一方は保守・運用を中心にする構成としました。その際、後者チームには KPT 形式の振り返りを導入しています。

新たなメンバーにとっては Sailboat 形式が初めてでしたが、「ゴールにフォーカスしたプロセス検証、リスク可視化、称賛事項の共有ができる」などの肯定的なフィードバックがありました。

一方で、「ゴール非直結のトピックが扱いづらい」「中長期的な観点で振り返りにくい」という課題も出ました。これらは、月1回の定例的なふりかえりや別の KPT 枠を活用してある程度カバーできていると感じています。

特に、ゴール志向の振り返りから生まれた PrePlanning（スプリント前に行う計画見直しプロセス）など、新たな改善活動が生まれた点は大きな収穫でした。

## デイリースクラム (Daily Scrum)
デイリースクラム（通称：朝会）では、毎日の開発計画を事前に可視化し、その日の進捗や課題を共有・検証する場にしています。

![スクリーンショット 2024-12-12 11.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65620/db7f3c43-5c96-31c5-5be7-79f232d28a82.png)

この1年で大きく変わったのは、日々の開発計画を明示的に可視化して、毎日検証できるようにしたことです。画面中央部のチケットは「いつからいつまで作業するか」をベースに配置し、計画と実績の乖離を毎日チェックできるようにしています。

これにより、レトロでも計画精度の改善や計画未達時の軌道修正の検討が容易になり、チームの改善活動が進めやすくなりました。

## スプリントレビュー
スプリントレビューはインクリメント（完成した成果物）をデモする場で、主目的は振り返りではありません。しかし、結果的に「うまくいったこと」や「つまづいたこと」を共有するコーナーを設けることで、振り返り的な機能も果たしています。

![スクリーンショット 2024-12-12 11.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65620/8b03cd68-e1e6-d417-16c3-36025c2f7a3f.png)

ここで得たフィードバックや改善点を、バックログ反映やプロセス見直しにつなげられるため、間接的ではありますが、振り返り機会としても有用です。

![スクリーンショット 2024-12-12 11.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65620/35122f2b-054b-ee66-ff9f-31274d50ac66.png)

# テーマを限定したアドホックなふりかえり
定期的な振り返り以外にも、必要に応じてテーマを限定したアドホックな振り返りを行っています。ここでは2つ紹介します。

- チーム方針に関する振り返り
- 開発ロードマップと開発手法に関する振り返り

## チーム方針に関する振り返り
大規模なリアーキテクチャを進める中で、四半期や半期ごとに方針を見直す機会を設けています。当初はトップダウン気味に始めた方針も、振り返りによってチーム全員で再検討し、継続・変更の判断を行っています。

![スクリーンショット 2024-12-12 11.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65620/32c680ce-d9b2-b8a4-edbf-5f6aa479e192.png)

課題設定が正しかったか、課題解決後に新たな課題が生じていないかなどをゼロベースで見直すことで、チーム全体で改善策をブラッシュアップできます。これにより、属人化解消の再定義や、フロー効率・リソース効率バランスの見直し、チーム体制変更など、具体的なアクションにつなげられました。

ただし、一度に多くの論点を扱うため、出たアイデアが活用しきれないケースもあり、意見の活かし方には今後の課題が残っています。

## 開発ロードマップと開発手法に関するふりかえり
最後に、開発ロードマップを起点としたふりかえり事例です。

![スクリーンショット 2024-12-12 11.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65620/7fef487a-9afe-7da2-0932-d35696eea406.png)

ロードマップ上のタスク実行順や関連タスクのまとめ方を変えれば、スピード向上が得られるのではという仮説を検証するため、一部施策を実行し、結果を振り返りました。しかし、期待した効果は得られず、リソース圧迫やリスク増加なども判明。

一方で、「なぜ続けないのか」を明確化でき、その認識をチームで共有できたことはナレッジ蓄積や情報連携という面で有益でした。ふりかえりはこうした仮説検証プロセスにも有効だと感じました。

# おわりに
以上が私たちのチームで取り組んできたふりかえり活動の紹介です。この1年で、ふりかえりがさまざまな局面で活用できることを実感し、チーム活動を改善する上で欠かせない手法であると改めて感じています。
Linux 基礎知識

使用端末：Mac

## MacOS基礎知識
UNIXベース

| LinuxOS | MacOS |WindowsOS |
|:-:|:-:|:-:|
|  CUI | GUI  | GUI  |
| OSS  |   |   |

### ターミナル
Linuxコマンドを用いてPCを制御する。
主に出来ること
- PC操作
- プログラム実行
- DBアクセス

## Linux基礎知識
OSである。
OSSのため、独自開発が普及している。
無料・カスタマイズしやすい・動作が軽い→サーバー構築で使用

### Linuxカーネルとは
#### カーネルとは
OSの基本制御を行う。
アプリケーションとハードウェアの仲介。

### Linuxディストリビューション
＝Linuxカーネル＋アプリケーション
代表的なもの
- Linux Mint
 動作軽い
- Lubuntu
 人気LinuxディストリビューションのUbuntuの軽量版
 GUIが充実
- CentOS
 動作が安定している。

### Linux基礎用語
- パッケージ
Linuxアプリケーションの配布形態(Windowsではインストーラー)
- シェル
Linuxコマンドを入力するためのアプリケーション
代表シェル：bash
- ディレクトリ
フォルダの入れ物(Windowsではフォルダ)
- パス
ファイルを指定するもの
相対パス：現在ディレクトリから
絶対パス：ホームディレクトリから

## Linuxコマンド基礎

プロンプト(英語で動機の意)

「yusaがMacbookの~(ホーム)ディレクトリ」に「$(一般)ユーザーで」ログインしている状態を示す。
- ユーザー状態
 $：sh,bashの一般ユーザー
 %：csh,zshの一般ユーザー
 　(シェルによって異なる)
 #：管理ユーザー(操作注意)

## Linux頻出コマンド
- echo
出力
- pwd
今いるディレクトリ
- cd 
ディレクトリ移動。パス指定
 .. 1つ上の階層
 (-) 直前の階層
 cdのみ　ホームディレクトリ
 - ls （ディレクトリ名）
  ディレクトリの中のディレクトリやファイルを表示する
- mkdir　ディレクトリ名
  ディレクトリを作成する
   -p 1/2 ペア。1の中に2を作る。（複数ディレクトリを同時に）
- cp　コピー先 コピー元
　-r ディレクトリをコピーする場合、ディレクトリの中身を再帰コピーする
- mv 移動元　移動先
ディレクトリ移動。階層間の移動も可能
名前の変更
- rmdir ディレクトリ名
中身が空のディレクトリの削除
remove directorの略
- rm ファイル名ofディレクトリ名、ディレクトリ名/ファイル名
ファイルの削除
- rm -r
中身があるディレクトリの削除
:::note warn
ゴミ箱機能はないため、復元不可
:::
- clear(Ctrl+L)
画面クリア
- cat(less)　ファイル名
ファイルの中身を表示する。違いは省略
- history
コマンド履歴。
列を!で指定すると同じコマンド使用可能。
!!：直前コマンド
!-3：3個前のコマンド
- コマンド名 --help
使い方
- man コマンド名 
マニュアル
「　」1画面先へ
g 画面先頭
Shift+g 画面最後へ
q 終了
n 次ページ
Shift+n 前ページ
/文字　文字が含まれる部分を検索
- touch　ファイル名
ファイル作成
- vi ファイル名
エディターvimを使用してファイルを編集する
コマンドモード→(i)編集モード→(esc)コマンドモード
:wq:保存終了
:w:保存
:q:終了
保存せず終了:q!
- grep '文字列' ファイル名
文字列がある行を抽出
- wc
ファイル内の行数等
- diff
複数ファイルの差異点を出力
diff ファイル1 ファイル2
出力結果:
5c5:差異対象行は、ファイル1もファイル2も5行目
(<):ファイル1の差異点
(>):ファイル2の差異点

## シンボリックリンク
フォルダやディレクトリへ中継するファイル
呼び方の違い
| Linux| Mac | Windows |
|:-:|:-:|:-:|
| シンボリックリンク  |エイリアス|  ショートカット |

- ln -s ファイル名 リンク名
シンボリックリンク作成
- unlink シンボリックリンク名
- シンボリックリンク削除

## パーミッション(許可)
ファイル・ディレクトリ,ユーザーごとの権限
-rwxrwxrwx 所有者 所有グループ ファイルサイズ 最終更新日時 ファイル名
(3つごとに)所有者・グループ・その他
- ls -l(ll)
ファイル属性確認

r: 読み取り
w:書き込み
x:実行,中への移動

一文字目
d:ディレクトリ
-:ファイル
l:シンボリックリンク
- chmod
権限変更
g+w:グループに書き込み権限プラス
g-r:グループに読み取り権限マイナス
a±x:すべてに権限付与/削除

3つそれぞれ所有者・グループ・その他ごとに権限を和で示す。
ex.)775,371
ｒ＝4 ｗ＝2 ｘ＝1

数値	権限	内容
0	---	権限無し
1	--x	実行
2	-w-	書き込み
3	-wx	書込・実行
4	r--	読み込み
5	r-x	読込・実行
6	rw-	読込・書込
7	rwx	読込・書込・実行

## PATH(環境変数)
コマンドはディレクトリに収納されており、検索対象ディレクトリは決まっている。
- echo $PATH
今の検索対象ディレクトリ
(lsでディレクトリ内コマンド一覧表示)
- export PATH="A(コマンドがあるディレクトリ名)の絶対パス"
ディレクトリAをパスに加える=対象ディレクトリに無いコマンド使用時はディレクトリを指定する＝PATHを通す
   
## リダイレクション(英語:re方向)
- echo 文字列 > ファイル名
(>):コマンド結果で上書き
(>>):コマンド結果を追加
(<):ファイル内容をコマンドに
- シェル名<ファイル名1>ファイル名2
ファイル1をファイル2に書き込み

## |(パイプ)
複数コマンドを掛け合わせる
(引数)コマンド1(標準出力)→パイプ→(標準入力)コマンド2

## /(ワイルドカード)
条件で検索
- etc/.txt
etcフォルダの中から.txtのものを表示する
*:なんでも
?:一文字

## ブレース{}(補助)展開
連続を自動出力
{1..10}:1から10
{1..10}{a..g}:1aから10g
- mkdir test_{1..5}
ディレクトリtest1からディレクトリtest5までを作成
- touch test_{1..5}/hjg{1..3}{.txt,.gif}
test1〜test5それぞれに6ファイル、計30ファイルが作成。

## Linuxショートカットキー
- tab
補完
- Ctrl+C
コマンド途中で安全終了
- 上下キー
履歴
- Ctrl+R
直近コマンド
- esc
辞める
- Ctrl+A
カーソル先頭
- Ctrl+E
カーソル最後
- Ctrl+W
カーソル左の単語を削除
Rollup・webpackを使っている方へ、esbuildを使おう！！！！！！

この記事ははじめてのアドベントカレンダー2024の10日目の記事です。
多くの人の目に入って作業を効率化してほしいと思って登録しました。
よろしくお願いします。
# はじめに
JavaScript・TypeScriptでサイトやライブラリを作っているみなさん。
バンドラーは何を使っているでしょうか。
Rollup？webpack？それともVite？
私は完璧な物を見つけました。esbuildです。

ということで今回はesbuildの個人的なメリット・デメリットを紹介します。
# メリット
## 速い
とにかく速いです。Rollupでは1~2秒かかっていたのが
esbuildでは0.数秒でした。本当に一瞬でした。
GitHub Actionsでビルドして公開する方なら無料枠の節約になるのではないでしょうか。
## TypeScript対応
`typescript`や`rollup-plugin-typescript`のようなプラグインを入れずとも
デフォルトでTypeScriptに対応しています！！！！！
## ミニファイも可
これもTypeScriptと同じくプラグイン無しでミニファイが可能です！！！！！
## コマンド・JavaScriptどちらからもバンドルが可能
例えばこのように
```bash
$ esbuild --bundle entry_point.js --outdir=dist --minify
```
というようにコマンドラインでバンドルすることも出来れば、
```js
import esbuild from "esbuild";
esbuild.build({ //Promiseを返します。これなら並行処理が可能なので便利ですね
    entryPoints: ["src/entry.ts"],
    bundle: true,
    outfile: "dist/main.js",
    minify: false,
    sourcemap: false,
    format: "esm"
})
```
というようにJavaScriptからバンドルも可能です。
このような特性から、**設定ファイルが不要**というのもありますね。

## バンドル時にファイル名も出力する
バンドル時にファイル名が以下のように出力されます。
```js
// node_modules/bge-compiler/dist/compiler.js
var n = [];
....
// src/utils/sutil.ts
var sutil = N();
var isEqual = g("isequal", (addr00, addr01, addr10, addr11, val0, val1) => {
....
```
しかしnode_modulesがファイルパスそのままなのがちょっとわかりずらいかもしれません。

# デメリット
## バンドルの出力形式が少ない(?)
esbuildがデフォルトで対応しているバンドル形式は
esモジュール・Commonjs・即時関数の3つのみで、
AMDやSystemJSやUMDは対応していません。十分すぎる気がしますが。

あとAMDで出力するプラグインはあったりするようです。

https://github.com/tomsjansons/esbuild-plugin-amd

## 変数名等が短縮される
Rollupではterserを使わなければ変数名はほぼソースコードのままにすることが可能ですが、
esbuildではminifyオプションを有効にしていなくても変数名が短縮されてしまいます。

# 終わりに
esbuildのメリット・デメリットを(独断で)紹介しましたが、
やはりTypeScript対応でバンドルが速く、ミニファイも速いため、
開発パフォーマンスの向上やGitHub actionsの無料枠の温存のためにもぜひ使ってみてください。
Rails の環境を Docker で作る

# Rails の環境が欲しくなった

- ちょうどいいので，8 で環境を作ってみることにした

## 準備

### rails-new コマンドが打ちたい

`rails-new` コマンドがあるらしい．これは，どこか(`/usr/local/bin` とか)に入れてしまっていいのかもしれない．
そのうち Homebrew とかに入るだろう

```
$ mkdir sample_rails
$ cd sample_rails

# https://github.com/rails/rails-new/releases
$ curl -LO https://github.com/rails/rails-new/releases/download/v0.4.1/rails-new-x86_64-apple-darwin.tar.gz
$ tar xf rails-new-x86_64-apple-darwin.tar.gz
$ rm rails-new-x86_64-apple-darwin.tar.gz
$ ./rails-new --version
rails-new 0.4.1
```

いつのまにか，`rails new` 時に `Dockerfile` とか 作ってくれるようになってた．

```
$ ./rails-new --ruby-version 3.3.6 --rails-version 8.0.0 . --database=mysql --devcontainer
```

## サーバーを起動する

- devcontainer をインストールして起動する

```
$ npm install -g @devcontainers/cli
$ devcontainer --version
0.72.0
$ devcontainer up --workspace-folder .
$ devcontainer exec --workspace-folder . bundle install
$ devcontainer exec --workspace-folder . bundle exec rails server -b 0.0.0.0
^C

$ docker compose -f .devcontainer/compose.yaml stop
```

## とりあえず

とりあえず動いてそうだけど，時間空けちゃったのでよく覚えてない……

## Refs

- https://edgeguides.rubyonrails.org/getting_started_with_devcontainer.html
DatabricksのGitフォルダーでDBSQLクエリーをサポートしました！

ホームページの新着情報で気づきました。

![Screenshot 2024-12-12 at 11.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/03eafda4-f95e-4058-6357-62a84fc43183.png)

個人的には待ち望んでいた機能。クエリーのバージョン管理が容易になります。お待たせしました。マニュアルを見てみます。

https://docs.databricks.com/ja/repos/limits.html#asset-types-supported-in-git-folders

これまでサポートされていたのは、ファイル、ノートブック、フォルダのみでしたが、**DBSQLクエリ**が追加されています！

![Screenshot 2024-12-12 at 11.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d41c0e9b-09cb-fdcb-76cc-7a6089530d02.png)

試してみます。

Gitフォルダーを作成し、アクセス権のあるリポジトリと同期しておきます。
![Screenshot 2024-12-12 at 11.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6a4aa106-ea62-2fb9-f034-a7f660caac6a.png)

SQLエディタでクエリーを作成します。エディタで**New SQL editor**がオンになっていることを確認しておきます。

![Screenshot 2024-12-12 at 11.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7574721d-576d-cfbb-f4fa-d0f634108629.png)

Gitフォルダーにクエリーを保存します。

![Screenshot 2024-12-12 at 11.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/339ad7ac-a4b5-b6b7-b350-fcd444042c6e.png)

初回コミットを行います。`ipynb`ファイルとしてコミットされます。

![Screenshot 2024-12-12 at 11.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e793b8ea-9b97-4c29-aac0-0966e9cc99f6.png)


ちなみに、右上の**未加工ファイル**タブをクリックすると生のファイルを参照できます。

![Screenshot 2024-12-12 at 11.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/94184181-5bdc-ee29-4364-adcb37eb99df.png)

Githubを確認すると、ファイルが作成されています！

![Screenshot 2024-12-12 at 11.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ffa4d80c-8ca3-935b-942d-a425bfb68983.png)
![Screenshot 2024-12-12 at 11.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fc58fc27-ffd8-dae6-46c7-8a183507602a.png)

クエリーを変更します。

![Screenshot 2024-12-12 at 11.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/46aca23a-bcbe-9f85-7060-8de772f55d97.png)

再度コミットしようとすると、きちんと差分が表示されています。嬉しい。

![Screenshot 2024-12-12 at 11.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c6c4e0bd-daa8-46e0-a886-20e662332f47.png)

Githubで変更履歴も確認できます。

![Screenshot 2024-12-12 at 11.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7aba7929-a9d7-ce94-8b16-b13b7522feaf.png)
![Screenshot 2024-12-12 at 11.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/136e36da-99f6-0b81-529a-dd9af892632a.png)

開発効率を改善する機能ですので是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Django】静的ファイルの考え方について

# Djangoの静的ファイル設定について (`STATIC_URL`, `STATICFILES_DIRS`, `STATIC_ROOT`)

Django における `STATIC_URL`, `STATICFILES_DIRS`, `STATIC_ROOT` の役割がよく分からなかったため、内容をまとめます。

## 1. `STATIC_URL`

`STATIC_URL` は、静的ファイルへの **URLパスのプレフィックス** を指定します。

### **目的**
- ブラウザが静的ファイル（CSS, JS, 画像など）を取得するためのURLを定義します。
- 必ずURL形式で指定します（例: `/static/`）。

### **設定例**
```python
STATIC_URL = '/static/'
```

## 2. STATICFILES_DIRS

### **目的**
- STATICFILES_DIRS は、開発環境で Django が静的ファイルを探すディレクトリを指定するものです。

- 開発サーバーが静的ファイルを提供する際、どのディレクトリからファイルを探すか指定します。
複数のディレクトリをリスト形式で指定できます。

### **設定例**
```python
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),       # プロジェクト全体の静的ファイル
    os.path.join(BASE_DIR, 'application/static'),  # アプリ固有の静的ファイル
]
```

### **ディレクトリ構造の例**
```
project/
├── static/
│   ├── css/
│   │   ├── style.css
│   ├── js/
│   │   ├── script.js
├── application/
│   ├── static/
│   │   ├── images/
│   │   │   ├── logo.png
```

## 3. STATIC_ROOT

### **目的**
STATIC_ROOT は、本番環境で collectstatic コマンドによって、すべての静的ファイルが収集されるディレクトリを指定します。
- 本番環境で Nginx や Apache などの Web サーバーが、静的ファイルを1箇所にまとめて提供するために使用します。

### **設定例**
```python
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
```

### **ディレクトリ構造（collectstatic 実行後）**
```
project/
├── staticfiles/
│   ├── css/
│   │   ├── style.css
│   ├── js/
│   │   ├── script.js
│   ├── images/
│   │   ├── logo.png
```


### Nginx 設定例
```
location /static/ {
    root /path/to/project/staticfiles;
}
```


## 動作の流れ

## 1. 開発環境
- Django の開発サーバー（python manage.py runserver）は、STATICFILES_DIRS に指定されたディレクトリから直接静的ファイルを提供します。

## 2. 本番環境
- collectstatic を実行すると、すべての静的ファイルが STATIC_ROOT にまとめられます。
- Web サーバー（Nginx や Apache）が STATIC_ROOT にあるファイルを提供します。
本番環境では Django 自体が静的ファイルを提供しません。

## まとめ

- 開発環境ではSTATICFILES_DIRS を使って静的ファイルを直接提供する。

- 本番環境ではcollectstaticを用いて静的ファイルを集め、STATIC_ROOT を使用して静的ファイルを間接的に提供する。