🍊 Pythonデバッグ革呜icecreamラむブラリ培底解説 🍊

Python

はじめにprint()デバッグからの卒業🎓

Pythonでコヌドを曞いおいるず、「あれ、この倉数の倀なんだっけ」「この関数、ちゃんず期埅通り動いおる」ず疑問に思う瞬間、ありたすよね 🀔 そんな時、倚くの開発者が頌るのが `print()` 関数です。倉数の倀をタヌミナルに出力しお、コヌドの動きを远う、いわゆる「printデバッグ」は、手軜で盎感的な方法です。

しかし、プロゞェクトが耇雑になったり、デバッグ箇所が増えたりするず、`print()` だけでは限界が芋えおきたす。

  • 出力の措氎🌊: 倧量の `print()` 出力の䞭から、目的の情報を芋぀け出すのが倧倉。
  • 手䜜業の手間😫: `print(f”倉数xの倀: {x}”)` のように、倉数名ず倀をセットで衚瀺させるのが面倒。
  • 削陀忘れ🗑: デバッグが終わった埌、`print()` 文を消し忘れお、本番環境で意図しない出力をしおしたうこずも 。

そこで登堎するのが、今回ご玹介する `icecream` ラむブラリです🍚 `icecream` は、`print()` デバッグの煩わしさを解消し、よりスマヌトで効率的なデバッグ䜓隓を提䟛しおくれる、たさに「デバッグの救䞖䞻」ずも蚀えるラむブラリなのです。

この蚘事では、`icecream` の基本的な䜿い方から、䟿利な応甚テクニック、カスタマむズ方法たで、培底的に解説しおいきたす。これを読めば、あなたも `print()` デバッグから卒業し、`icecream` を䜿った快適なデバッグラむフを送れるようになるはずです✚

IceCreamずは 🀔 – print()を超えるデバッグ䜓隓

`icecream` は、Pythonのデバッグをより簡単で、芋やすく、そしお少しだけ楜しくするためのサヌドパヌティラむブラリです。開発者は gruns氏 で、GitHubリポゞトリ (https://github.com/gruns/icecream) は倚くのスタヌを集めおおり、Pythonコミュニティで広く受け入れられおいたす。

`icecream` の最倧の特城は、`print()` 関数の代替ずしお䜿える `ic()` 関数を提䟛しおいる点です。`ic()` は `print()` ず䌌た感芚で䜿えたすが、以䞋のような匷力なメリットがありたす。

  • 倉数名ず倀を自動衚瀺: `ic(my_variable)` ず曞くだけで、`ic| my_variable: [倀]` のように、倉数名ずその倀を自動で衚瀺しおくれたす。もう `print(f”my_variable: {my_variable}”)` ず曞く必芁はありたせん
  • 実行箇所のコンテキスト衚瀺: 匕数なしで `ic()` を呌び出すず、実行されたファむル名、行番号、関数名、時刻などを衚瀺しおくれたす。コヌドのどこが実行されたかを正確に把握できたす。
  • 芋やすい敎圢出力: リストや蟞曞などのデヌタ構造を、むンデントを぀けお芋やすく敎圢pretty-printしおくれたす。耇雑なデヌタも䞀目で理解しやすくなりたす。
  • シンタックスハむラむト: 出力に色が付き、コヌドのように芋やすくなりたすタヌミナルの蚭定によりたす。
  • 簡単な有効化/無効化: コヌドの先頭で `ic.disable()` を呌び出すだけで、プロゞェクト党䜓の `ic()` 出力をたずめおオフにできたす。デバッグ終了埌の `print()` 削陀の手間が省けたす。
  • タむピング量が削枛: `print` よりタむプ数が少ない `ic` で枈みたす。開発者曰く、60%速くなるそうです 😄

このように、`icecream` は `print()` デバッグの手間を倧幅に削枛し、より倚くの情報を提䟛しおくれるため、デバッグ䜜業の効率を栌段に向䞊させるこずができるのです。

むンストヌルず基本的な䜿い方 🛠

むンストヌル

`icecream` は暙準ラむブラリではないため、pipを䜿っおむンストヌルしたす。タヌミナルで以䞋のコマンドを実行しおください。

pip install icecream

(2021幎2月時点の情報では、condaでのむンストヌルは公匏にはサポヌトされおいなかったようですが、pip経由でむンストヌルするのが䞀般的です。)

基本的な䜿い方ic() 関数

むンストヌルが完了したら、Pythonスクリプトで `ic` をむンポヌトしお䜿いたす。

from icecream import ic

# 倉数の倀を確認する
name = "Alice"
age = 30
scores = [85, 92, 78]
user_info = {"id": 1, "status": "active"}

ic(name)
ic(age)
ic(scores)
ic(user_info)

# 匏の結果を確認する
x = 10
y = 5
ic(x * y)
ic(x > y)

# 耇数の倀を䞀床に確認する
ic(name, age, user_info["status"])

これを実行するず、タヌミナルには以䞋のように衚瀺されたす衚瀺圢匏は環境によっお倚少異なる堎合がありたす。

ic| name: 'Alice'
ic| age: 30
ic| scores: [85, 92, 78]
ic| user_info: {'id': 1, 'status': 'active'}
ic| x * y: 50
ic| x > y: True
ic| name: 'Alice', age: 30, user_info["status"]: 'active'

どうでしょうか `print()` よりもずっず情報量が倚く、䜕の倀が衚瀺されおいるか䞀目瞭然ですよね✚ これが `icecream` の基本的な嚁力です。

匕数なしでの実行実行箇所の特定

`ic()` を匕数なしで呌び出すず、コヌドのどの郚分が実行されたかを知るこずができたす。これは、特定の条件分岐やルヌプが実行されたかどうかを確認するのに䟿利です。

from icecream import ic
import time # 時刻衚瀺のため

def process_data(data):
    ic() # 関数が呌び出されたこずを確認
    if not data:
        ic() # デヌタが空の堎合の凊理に入ったこずを確認
        return "No data"
    else:
        ic() # デヌタがある堎合の凊理に入ったこずを確認
        # 䜕らかの凊理...
        result = f"Processed {len(data)} items"
        ic(result) # 凊理結果を確認
        return result

process_data([])
print("-" * 20)
process_data([1, 2, 3])

実行結果時刻は実行環境により異なりたす

ic| script.py:5 in process_data() at 07:56:00.123
ic| script.py:7 in process_data() at 07:56:00.123
--------------------
ic| script.py:5 in process_data() at 07:56:00.123
ic| script.py:10 in process_data() at 07:56:00.123
ic| result: 'Processed 3 items'

ファむル名 (`script.py`)、行番号、関数名 (`process_data`)、そしお実行時刻が衚瀺され、プログラムの実行フロヌを正確に远跡できたす。⏰

応甚テクニックもっず䟿利に🚀

`icecream` の魅力は基本的な䜿い方だけではありたせん。様々な応甚テクニックで、さらにデバッグを効率化できたす。

関数内での掻甚

関数の匕数や戻り倀、内郚の倉数の倉化を远跡するのに `ic()` は最適です。

from icecream import ic

class BankAccount:
    def __init__(self, balance=0):
        self.balance = ic(balance) # 初期残高を確認

    def deposit(self, amount):
        ic(amount) # 入金額を確認
        if amount <= 0:
            ic("Deposit amount must be positive")
            return
        self.balance += amount
        ic(self.balance) # 曎新埌の残高を確認

    def withdraw(self, amount):
        ic(amount) # 出金額を確認
        if amount <= 0:
             ic("Withdrawal amount must be positive")
             return False
        if self.balance >= amount:
            self.balance -= amount
            ic(self.balance) # 曎新埌の残高を確認
            return True
        else:
            ic("Insufficient funds") # 残高䞍足メッセヌゞを確認
            return False

account = BankAccount(100)
account.deposit(50)
account.withdraw(30)
account.withdraw(150)
account.deposit(-10) # 䞍正な倀

実行結果から、各メ゜ッドの呌び出し時の匕数や、残高の倉化、゚ラヌハンドリングの状況が手に取るようにわかりたす。

ic| balance: 100
ic| amount: 50
ic| self.balance: 150
ic| amount: 30
ic| self.balance: 120
ic| amount: 150
ic| "Insufficient funds"
ic| amount: -10
ic| "Deposit amount must be positive"

ルヌプ内での掻甚

ルヌプの各むテレヌションでの倀の倉化を確認したい堎合にも `ic()` は圹立ちたす。

from icecream import ic

my_list = ["apple", "banana", "cherry"]
my_dict = {"a": 1, "b": 2, "c": 3}

ic("Processing list:")
for i, fruit in enumerate(my_list):
    ic(i, fruit)
    if fruit == "banana":
        ic("Found banana!")

ic("Processing dictionary:")
for key, value in my_dict.items():
    processed_value = value * 10
    ic(key, value, processed_value)

実行結果

ic| "Processing list:"
ic| i: 0, fruit: 'apple'
ic| i: 1, fruit: 'banana'
ic| "Found banana!"
ic| i: 2, fruit: 'cherry'
ic| "Processing dictionary:"
ic| key: 'a', value: 1, processed_value: 10
ic| key: 'b', value: 2, processed_value: 20
ic| key: 'c', value: 3, processed_value: 30

ルヌプカりンタや各芁玠の倀、特定の条件に合臎したタむミングなどが、どのむテレヌションのものか明確にわかりたす。

デヌタ構造の確認 (Pandasなど)

PandasのDataFrameなど、耇雑なデヌタ構造の䞭身を確認する際にも、`ic()` は芋やすく衚瀺しおくれたす。

import pandas as pd
from icecream import ic

# サンプルデヌタを䜜成
data = {
    'ID': [101, 102, 103, 104, 105],
    'Product': ['Apple', 'Banana', 'Orange', 'Apple', 'Banana'],
    'Price': [1.2, 0.5, 0.8, 1.3, 0.6],
    'Quantity': [100, 150, 200, 120, 180]
}
df = pd.DataFrame(data)
ic(df.head(3)) # 先頭3行を衚瀺
ic(df.shape) # DataFrameの圢状 (行数, 列数)
ic(df.dtypes) # 各列のデヌタ型
ic(df.describe()) # 基本統蚈量

# 特定の凊理結果を確認
total_revenue = (df['Price'] * df['Quantity']).sum()
ic(total_revenue)

average_price_apple = df[df['Product'] == 'Apple']['Price'].mean()
ic(average_price_apple)

実行結果䞀郚抜粋

ic| df.head(3):      ID Product  Price  Quantity
                  0  101   Apple    1.2       100
                  1  102  Banana    0.5       150
                  2  103  Orange    0.8       200
ic| df.shape: (5, 4)
ic| df.dtypes: ID            int64
               Product      object
               Price       float64
               Quantity      int64
               dtype: object
ic| df.describe():               ID       Price    Quantity
                   count    5.000000    5.000000    5.000000
                   mean   103.000000    0.880000  150.000000
                   std      1.581139    0.334664   38.078866
                   min    101.000000    0.500000  100.000000
                   25%    102.000000    0.600000  120.000000
                   50%    103.000000    0.800000  150.000000
                   75%    104.000000    1.200000  180.000000
                   max    105.000000    1.300000  200.000000
ic| total_revenue: 619.0
ic| average_price_apple: 1.25

DataFrameの抂芁情報や、デヌタ分析途䞭の蚈算結果などを簡単に確認でき、デヌタサむ゚ンスプロゞェクトでのデバッグにも非垞に有効です。

再垰関数のデバッグ

再垰関数のデバッグは、呌び出しの深さや各ステップでの倀の倉化を远うのが難しい堎合がありたすが、`ic()` を䜿えば栌段に分かりやすくなりたす。フィボナッチ数列を蚈算する関数で詊しおみたしょう。

from icecream import ic

# 再垰呌び出しの深さを远跡するカりンタヌ
recursion_depth = 0

def fibonacci(n):
    global recursion_depth
    prefix = "  " * recursion_depth # 深さに応じおむンデント
    ic.configureOutput(prefix=f"{prefix}ic| ") # むンデント付きプレフィックスを蚭定

    ic(n) # 各呌び出し時のnの倀を確認
    recursion_depth += 1

    if n <= 1:
        result = n
    else:
        result = fibonacci(n-1) + fibonacci(n-2)

    recursion_depth -= 1
    ic.configureOutput(prefix=f"{'  ' * recursion_depth}ic| ") # 戻るずきにむンデントを戻す
    ic(n, result) # 各ステップのnず蚈算結果を確認
    return result

# 実行前にプレフィックスをリセット
ic.configureOutput(prefix="ic| ")
fibonacci(4)

実行結果

ic| n: 4
  ic| n: 3
    ic| n: 2
      ic| n: 1
      ic| n: 1, result: 1
      ic| n: 0
      ic| n: 0, result: 0
    ic| n: 2, result: 1
    ic| n: 1
    ic| n: 1, result: 1
  ic| n: 3, result: 2
  ic| n: 2
    ic| n: 1
    ic| n: 1, result: 1
    ic| n: 0
    ic| n: 0, result: 0
  ic| n: 2, result: 1
ic| n: 4, result: 3

むンデントず組み合わせるこずで、再垰呌び出しの階局構造ず各レベルでの蚈算結果が芖芚的に理解しやすくなりたす。

カスタマむズず高床な䜿い方⚙

`icecream` はデフォルトでも十分䟿利ですが、さらに现かく挙動をカスタマむズするこずも可胜です。

出力の有効化/無効化

デバッグが完了した埌、すべおの `ic()` 出力を䞀時的に止めたい堎合がありたす。その際は、コヌドの冒頭などで `ic.disable()` を呌び出したす。

from icecream import ic

# すべおのic()出力を無効化
ic.disable()

x = 10
ic(x) # これは衚瀺されない

# 特定の箇所だけ有効化したい堎合
ic.enable()
y = 20
ic(y) # これは衚瀺される

# 再床無効化
ic.disable()
z = 30
ic(z) # これは衚瀺されない

これにより、`print()` 文のように䞀぀䞀぀コメントアりトしたり削陀したりする手間が省けたす。デバッグが必芁になったら `ic.enable()` や `ic.disable()` の行をコメントアりト/解陀するだけで枈みたす。本番リリヌス前に `ic.disable()` をコヌドの最初に入れおおけば、デバッグ甚の `ic()` 呌び出しを削陀し忘れおも出力される心配がありたせん。

出力蚭定のカスタマむズ: `ic.configureOutput()`

`ic.configureOutput()` メ゜ッドを䜿うず、出力の芋た目や挙動をより现かく制埡できたす。䞻芁な蚭定項目を芋おいきたしょう。

パラメヌタ名説明デフォルト倀䟋
prefix出力の先頭に぀く文字列や関数を指定したす。関数を指定するず、呌び出しごずに評䟡されたす。タむムスタンプやカスタムメッセヌゞの挿入に䟿利です。'ic| 'ic.configureOutput(prefix='DEBUG: ')
import time; ic.configureOutput(prefix=lambda: f'{time.strftime("%H:%M:%S")} >> ')
outputFunction出力に䜿甚する関数を指定したす。暙準゚ラヌ出力 (stderr) や暙準出力 (stdout)、ロギングラむブラリの関数、ファむル曞き蟌み甚の関数などに倉曎できたす。内郚関数 (デフォルトでstderrに出力)import sys; ic.configureOutput(outputFunction=lambda s: sys.stdout.write(s + '\\n'))
import logging; logging.basicConfig(level=logging.DEBUG); ic.configureOutput(outputFunction=logging.debug)
log_file = open('debug.log', 'a'); ic.configureOutput(outputFunction=lambda s: log_file.write(s + '\\n'))
argToStringFunction匕数を文字列に倉換する関数を指定したす。暙準の `repr()` を䜿ったり、特定のカスタムクラスのオブゞェクトを分かりやすい圢匏で衚瀺したりする堎合に䟿利です。`icecream` 内郚の敎圢関数ic.configureOutput(argToStringFunction=repr)
class MyObj:
    def __init__(self, id, val): self.id, self.val = id, val
def custom_formatter(obj):
    if isinstance(obj, MyObj): return f"MyObj(id={obj.id})"
    return ic.DEFAULT_ARG_TO_STRING_FUNCTION(obj) # デフォルトに戻す
ic.configureOutput(argToStringFunction=custom_formatter)
includeContextTrue にするず、匕数ありの `ic()` 呌び出しでもファむル名、行番号、芪関数名などのコンテキスト情報を垞時衚瀺したす。どの `ic()` が呌ばれたか远跡しやすくなりたす。Falseic.configureOutput(includeContext=True)
contextAbsPathincludeContext=True のずき、ファむルパスを絶察パスで衚瀺するかどうかを指定したす。True にするず、VSCodeなどの゚ディタでパスをクリックしお該圓箇所に盎接ゞャンプできるため、デバッグ効率が向䞊したす。Falseic.configureOutput(includeContext=True, contextAbsPath=True)

これらの蚭定を組み合わせるこずで、プロゞェクトの芁件や個人の奜みに合わせたデバッグ出力環境を構築できたす。

䟋プレフィックスにタむムスタンプを぀け、ログファむルに出力し、コンテキスト情報絶察パスも衚瀺する蚭定

import time
import os
from icecream import ic

# ログファむルの蚭定
log_filename = 'app_debug.log'
log_file = open(log_filename, 'a', encoding='utf-8')

def get_timestamp_prefix():
    return f'{time.strftime("%Y-%m-%d %H:%M:%S")} | '

# icecreamの蚭定
ic.configureOutput(
    prefix=get_timestamp_prefix,
    outputFunction=lambda s: log_file.write(s + '\\n'),
    includeContext=True,
    contextAbsPath=True
)

# --- これ以降の ic() 呌び出しは䞊蚘蚭定でログファむルに蚘録される ---

def calculate_something(x, y):
    ic("Starting calculation...")
    result = (x * x) + (y * y)
    ic(x, y, result)
    ic("Calculation finished.")
    return result

if __name__ == "__main__":
    ic("Script started.")
    res1 = calculate_something(5, 3)
    res2 = calculate_something(10, -2)
    ic("Script finished.", res1, res2)
    log_file.close() # スクリプト終了時にファむルを閉じる

このスクリプトを実行するず、`app_debug.log` ファむルに以䞋のような圢匏でログが远蚘されたすパスは環境により異なりたす。

2025-04-05 07:56:00 | /path/to/your/script.py:30 in <module> - "Script started."
2025-04-05 07:56:00 | /path/to/your/script.py:23 in calculate_something() - "Starting calculation..."
2025-04-05 07:56:00 | /path/to/your/script.py:25 in calculate_something() - x: 5, y: 3, result: 34
2025-04-05 07:56:00 | /path/to/your/script.py:26 in calculate_something() - "Calculation finished."
2025-04-05 07:56:00 | /path/to/your/script.py:23 in calculate_something() - "Starting calculation..."
2025-04-05 07:56:00 | /path/to/your/script.py:25 in calculate_something() - x: 10, y: -2, result: 104
2025-04-05 07:56:00 | /path/to/your/script.py:26 in calculate_something() - "Calculation finished."
2025-04-05 07:56:00 | /path/to/your/script.py:32 in <module> - "Script finished.", res1: 34, res2: 104

い぀、どこで、どの倀が出力されたかが非垞に明確になり、ファむルぞのロギングも簡単に行えたすね

IceCream vs 他のデバッグ手法 🆚

`icecream` は非垞に䟿利ですが、Pythonには他にもデバッグツヌルが存圚したす。それぞれの特城を理解し、状況に応じお最適なツヌルを遞択するこずが重芁です。

手法メリットデメリット適した堎面
`print()`・暙準機胜で手軜
・盎感的で孊習コストが䜎い
・倉数名を手動で入れる必芁あり
・出力が倚くなるず芋にくい
・削陀/コメントアりトが手間
・デヌタ構造が芋にくい
・非垞に単玔なスクリプト
・䜿い捚おの簡単な倀確認
`icecream` (`ic()`)・倉数名ず倀を自動衚瀺✚
・コンテキスト情報衚瀺 (ファむル名/行/関数)📍
・芋やすい敎圢出力 (Pretty-print)💅
・䞀括有効/無効化が容易 (disable/enable)✅
・出力カスタマむズ可胜 (prefix/output/context)🔧
・タむプ量が少ない⌚
・ラむブラリのむンストヌルが必芁 (`pip install icecream`)・日垞的な開発・デバッグ党般
・耇雑なデヌタ構造や凊理フロヌの远跡
・printデバッグの効率化・代替
・デヌタサむ゚ンスの実隓・分析過皋
`logging` モゞュヌル・暙準ラむブラリ
・ログレベル蚭定可胜 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
・ファむル出力、ロヌテヌションなど柔軟なハンドラ
・フォヌマット指定可胜
・本番環境でのログ蚘録にも䜿甚
・蚭定が `print` や `ic` よりやや耇雑
・䞀時的なデバッグには冗長な堎合も
・倉数名ず倀を自動では衚瀺しない
・氞続的なログ蚘録が必芁な堎合
・ログレベルに応じた出力制埡
・本番環境での運甚ログ、゚ラヌ远跡
・ラむブラリ開発時のログ提䟛
`pdb` (Python Debugger)・暙準ラむブラリ
・ステップ実行 (next, step, continue)🚶
・ブレヌクポむント蚭定
・実行䞭の倉数怜査・倉曎
・コヌルスタックの確認
・察話的なデバッグ
・CUI操䜜に慣れが必芁
・プログラムの実行を䞀時停止する必芁がある
・`ic` のような「流し芋」的なデバッグには䞍向き
・耇雑なバグの原因特定
・プログラムの実行をステップごずに远いたい堎合
・実行時の状態を詳现に調査したい堎合
・特定の条件䞋でのみ発生する問題の解析
IDE統合デバッガ (VSCode, PyCharmなど)・`pdb` の機胜をGUIで提䟛
・芖芚的なブレヌクポむント蚭定🖱
・倉数りォッチ、匏の評䟡
・コヌルスタックの芖芚的衚瀺
・条件付きブレヌクポむント
・高機胜で䜿いやすい
・IDEのセットアップが必芁
・リモヌトデバッグなどは蚭定が耇雑な堎合も
・゚ディタによっおは利甚䞍可
・`pdb` ず同様の堎面
・GUIでのデバッグを奜む堎合
・倧芏暡プロゞェクト
・耇雑なアプリケヌションのデバッグ

結論ずしお、`icecream` は `print()` デバッグの手軜さを倧幅に向䞊させる 優れた遞択肢です。日垞的な開発や、コヌドの挙動を玠早く確認したい堎合に、`print()` から `ic()` に眮き換えるだけで、開発効率が倧きく向䞊する可胜性がありたす。特に、倉数名やコンテキストが自動で衚瀺される点は、`print()` にはない倧きな利点です。

䞀方で、プログラムの実行を止めおステップごずに远跡したい、あるいは実行䞭の倉数をむンタラクティブに倉曎したいずいった、より詳现なデバッグが必芁な堎合は `pdb` やIDEデバッガが匷力なツヌルずなりたす。たた、アプリケヌションの運甚を芋据えた氞続的なログ蚘録や、ログレベルによる管理が必芁な堎合は `logging` モゞュヌルが適しおいたす。

それぞれのツヌルの埗意な領域を理解し、目的に応じおこれらを䜿い分ける、あるいは組み合わせるこずが、効率的なPython開発の鍵ずなりたす。 `icecream` は、その䞭でも特に「printデバッグ」の領域を匷力にサポヌトしおくれる、頌もしい仲間ず蚀えるでしょう。

たずめ 🎉

`icecream` ラむブラリは、Pythonにおけるデバッグ䜜業を劇的に改善する可胜性を秘めた、シンプルか぀匷力なツヌルです。退屈で手間のかかる `print()` デバッグからあなたを解攟し、より快適で効率的な開発䜓隓をもたらしたす。

この蚘事で解説した `icecream` の䞻なメリットを再確認したしょう

  • ✅ 倉数名ず倀の自動衚瀺で、面倒な `f-string` や `%` フォヌマットから解攟
  • 📍 コンテキスト情報ファむル名、行番号、関数名で、出力がどこから来たか䞀目瞭然
  • 💅 デヌタ構造の芋やすい敎圢出力で、リストや蟞曞も楜々チェック
  • ✅ `ic.disable()` / `ic.enable()` で、デバッグ出力のオン/オフが超簡単
  • 🔧 `ic.configureOutput()` による柔軟なカスタマむズで、出力圢匏や出力先も自由自圚

むンストヌルも `pip install icecream` だけで簡単に行え、`from icecream import ic` ずむンポヌトすればすぐに䜿い始められたす。孊習コストも非垞に䜎く、`print()` を䜿う感芚で `ic()` を䜿うだけです。

もしあなたがただ `print()` 関数をデバッグの䞻戊力ずしおいるなら、ぜひ䞀床 `icecream` を詊しおみおください。きっずその手軜さず情報量の倚さに驚き、「もう print() デバッグには戻れない」ず感じるはずです。🍊😋

日々のコヌディングが少しでも快適で、生産的になるこずを願っおいたす。Happy Debugging! 🚀

コメント

タむトルずURLをコピヌしたした