Pythonでwhile Trueなどの無限ループを記述したものの、キー入力でそのループを安全に終了する方法がわからず困った経験はないでしょうか。強制終了(Ctrl+C)以外の終了手段を知らないまま実装を進めると、プログラムが意図しない状態で終わるケースが生じます。
適切な終了処理を実装しないと、ループ中に蓄積したデータが保存されないまま失われたり、リソースリークが発生したりする恐れがあります。
この記事では、Pythonでキー入力によりループを抜ける処理を4つの方式に分けて解説します。ブロッキング型とノンブロッキング型の違いや用途別の選択基準も整理しているので、自分のケースに合った方法を選べます。
目次
- Pythonのキー入力でループを抜ける処理の全体像
- Pythonのinput関数でキー入力を受け取りループを抜ける方法
- while文とbreak文を組み合わせてループを抜ける
- 特定の文字列を入力してループを終了する
- Pythonのkeyboardモジュールでキーを検知してループを抜ける方法
- keyboard.is_pressed()でキー押下を検知する
- keyboard.on_press()でコールバックを登録してループを抜ける
- PythonのKeyboardInterrupt例外でCtrl+Cによりループを抜ける方法
- try-exceptでKeyboardInterruptを捕捉してループを抜ける
- try-except-finallyで後処理を含めてループを抜ける
- Pythonのthreadingモジュールで並行してキー入力を監視しループを抜ける方法
- threadingとinput()を組み合わせてループを抜ける
- threading.Eventで複数スレッドのループを同時に停止する
- Pythonのキー入力によるループ終了処理に関するよくある質問
- keyboardモジュールをインストールできない場合の対処法は?
- macOSやLinuxでキー入力を検知するにはどうすればよいですか?
- ループを抜けた後にリソースを確実に解放するにはどうすればよいですか?
Pythonのキー入力でループを抜ける処理の全体像
Pythonでキー入力によりループを抜ける処理は、大きく4つの方式に分類されます。ここでは、各方式の特性を比較しやすいよう「ブロッキング型」と「ノンブロッキング型」という2つの軸で整理します。
ブロッキング型とは入力が完了するまでプログラムの実行が停止する方式、ノンブロッキング型とは処理を止めずにキー入力の状態を確認できる方式のことです。
以下の比較表で、方式ごとの特徴を一覧で確認できます。
| 方式名 | 型 | インストール | OS対応 | 特徴 |
|---|---|---|---|---|
| input()関数 | ブロッキング型 | 不要(標準) | 全OS | Enter確定の行入力で処理が停止。対話式ループに適する |
| keyboardモジュール | ノンブロッキング型 | pip install keyboard | Win: 基本動作 / Linux: root必須 / macOS: 実験的+root必須 | キー押下をリアルタイム検知。ループを止めずにキー監視できる |
| KeyboardInterrupt例外 | 例外処理型 | 不要(標準) | 全OS | Ctrl+Cによる割り込み。try-finallyで後処理を実行できる |
| threadingモジュール | ノンブロッキング型 | 不要(標準) | 主要OS(Windows・macOS・Linux) | 別スレッドでキー入力を監視。メインループを止めずに並行処理できる |
ブロッキング型のinput()関数はEnter確定の行入力を待つ間ループ処理が停止するため、センサー監視のように処理を継続したい場面には向きません。そのような用途にはkeyboardモジュールやthreadingモジュールが適しています。
それぞれの方法について、以下で詳しく解説していきます。
Pythonのinput関数でキー入力を受け取りループを抜ける方法
input()関数は、Pythonの標準ライブラリに含まれる行入力関数です。キー1つずつの押下をリアルタイムに検知するのではなく、ユーザーがEnterキーを押して確定した時点で入力文字列をまとめて返します。
以下の2つのパターンを順に解説します。
- while文とbreak文を組み合わせてループを抜ける
- 特定の文字列を入力してループを終了する
それぞれ用途が異なり、単純な一時停止には1つ目のパターンが、コマンド入力式の終了制御には2つ目のパターンが適しています。それでは各パターンについて、詳しく解説していきます。
If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that.
出典:Python公式ドキュメント - Built-in Functions: input()
while文とbreak文を組み合わせてループを抜ける
while Trueで無限ループを作り、input()でユーザーの入力を受け取った後に条件判定でbreakするのが基本のパターンです。input()は前述の通りブロッキング型の関数であるため、Enterキーが押されるまで後続の処理が一切進みません。
以下のコードは、何も入力せずEnterを押した場合にループを終了し、何か文字を入力してEnterを押した場合はループを継続する実装例です。
count = 0
print("ループを開始します。空Enterでループを終了します。")
while True:
print(f"カウント: {count}")
count += 1
user_input = input("続けるには文字を入力してEnter、終了するにはそのままEnterを押してください: ")
if user_input == "":
print("ループを終了します。")
break
print(f"最終カウント: {count}")
このコードでは、何も入力せずEnterを押した場合(空文字列)にbreakが実行されます。それ以外のキーを入力してEnterを押した場合はループが継続するため、意図しない終了を防げます。
特定の文字列を入力してループを終了する
input()で受け取った文字列が特定のコマンド("quit"や"exit"等)と一致する場合にbreakするパターンは、コマンドラインツールや対話型プログラムで広く使われる実用的な手法です。文字列の比較には==演算子またはin演算子を使い、複数のコマンドをまとめて受け付けることもできます。
以下のコードは、"quit"または"exit"を入力した場合にループを終了する実装例です。大文字・小文字を区別しないよう.lower()で正規化しているため、"Quit"や"EXIT"でも終了できます。
print("繰り返し処理を開始します。終了するには 'quit' または 'exit' と入力してください。")
count = 0
while True:
count += 1
print(f"\n--- ループ {count}回目 ---")
print("何らかの処理を実行中...")
user_input = input("コマンドを入力してください (quit/exit で終了): ")
if user_input.lower() in ("quit", "exit"):
print("終了コマンドを受け付けました。ループを抜けます。")
break
else:
print(f"入力 '{user_input}' を受け付けました。ループを継続します。")
print(f"\nプログラムを終了しました。合計 {count} 回実行しました。")
上記のコードでは、user_input.lower()で入力文字列をすべて小文字に変換してからin演算子でタプルと照合しています。elseブロックで入力値をそのまま表示しているため、終了以外のコマンドを将来的に追加しやすい構成です。
以下の表は、終了コマンドのパターンを拡張する際の判断基準をまとめたものです。
| パターン | コード例 | 用途 |
|---|---|---|
| 1語一致 | user_input == "quit" |
終了コマンドが1種類のみ |
| 複数語一致 | user_input.lower() in ("quit", "exit", "q") |
略語・複数コマンドを受け付ける |
| 前方一致 | user_input.lower().startswith("q") |
"q"始まりの入力はすべて終了とみなす |
対話型プログラムの終了コマンドとしては"quit"と"exit"の両方を受け付けるのが慣例です。略語として"q"も追加しておくと、ユーザーの操作コストを下げられます。
Pythonのkeyboardモジュールでキーを検知してループを抜ける方法
keyboardモジュールは、Pythonでノンブロッキングのキー入力検知を実現する外部ライブラリです。ただし、本ライブラリは現在メンテナンスが停止(unmaintained)されており、GitHubリポジトリもアーカイブ済みのため、業務利用では代替手段(threadingモジュールや標準ライブラリのcursesモジュール等)も検討してください。
keyboardモジュールを使用するには、事前に以下のコマンドでインストールが必要です。
pip install keyboard
keyboardモジュールはOSごとに動作条件が異なります。Windowsでは多くの場合追加権限なしで動作しますが、保護されたプロセスへのフックには管理者権限が必要な場合があります。
Linuxではroot権限(sudoでの実行)が必須です。macOSでは公式READMEで「実験的サポート(experimental)」と記載されており、root権限が必要なうえに一部の機能が制限される場合があります。
このH2では、以下の2つの使い方を解説します。
- keyboard.is_pressed()でキー押下を検知する
- keyboard.on_press()でコールバックを登録してループを抜ける
それぞれ動作の仕組みが異なるため、用途に応じて使い分けてください。
keyboard.is_pressed()でキー押下を検知する
keyboard.is_pressed()は、引数に指定したキーが現在押されているかどうかをbool値で返す関数です。この関数は「押された瞬間」を検出するエッジ検出ではなく、「押されている状態」を返すため、ループの周期によっては同じ押下が複数回検出される点に注意してください。
以下のサンプルコードは、qキーが押されるまでループを継続し、qキーを押した時点でループを終了する実装例です。
import keyboard
import time
print("ループを開始します。'q'キーを押すと終了します。")
count = 0
while True:
print(f"処理中... count={count}")
count += 1
time.sleep(0.5)
if keyboard.is_pressed("q"):
print("'q'キーが押されました。ループを終了します。")
break
print("ループを抜けました。")
上記のコードでは、while Trueの無限ループ内で0.5秒ごとにカウントを表示し、keyboard.is_pressed("q")がTrueを返した時点でbreakが実行されます。
keyboard.is_pressed()の主な特徴と注意点は、以下の通りです。
| 項目 | 内容 |
|---|---|
| 動作方式 | ノンブロッキング(ループを止めずに検知) |
| 引数形式 | 文字列で指定(例:"q"、"esc"、"space") |
| 戻り値 | 押されていればTrue、押されていなければFalse |
| OS対応 | Win: 動作 / Linux: root必須 / macOS: 実験的+root必須 |
time.sleep()の待機時間を短くすると応答性が上がりますが、CPU使用率も上昇します。処理を継続せずキー押下だけを待つ場合は、keyboard.wait("q")でブロッキング待機する方法も選択肢です。
keyboard.on_press()でコールバックを登録してループを抜ける
keyboard.on_press()は、キーが押されたときに実行されるコールバック関数を登録するメソッドです。コールバック関数とは、ある事象(ここではキー押下)が発生したときに自動的に呼び出される関数のことです。
フラグ変数を使ってコールバック内でループ停止の意思を伝え、メインループ側でそのフラグを確認してbreakする設計が広く採用されています。
以下のサンプルコードは、escキーが押されたらフラグを立て、メインループを終了する実装例です。なお、keyboardモジュールは内部的に別スレッドでコールバックを呼び出します。
この例のような単純なboolフラグの更新は多くの場合問題なく動作しますが、より厳密にスレッド間の同期を管理したい場合はthreading.Eventの利用を推奨します。
import keyboard
import time
# ループ停止フラグ
stop_flag = False
def on_key_press(event):
"""キーが押されたときに呼ばれるコールバック関数"""
global stop_flag
if event.name == "esc":
print(f"\n'esc'キーが押されました。ループを終了します。")
stop_flag = True
# コールバックを登録する
keyboard.on_press(on_key_press)
print("ループを開始します。'esc'キーを押すと終了します。")
count = 0
while not stop_flag:
print(f"処理中... count={count}")
count += 1
time.sleep(0.5)
# コールバック登録を解除する
keyboard.unhook_all()
print("ループを抜けました。")
コールバック関数on_key_pressは、押されたキーの情報をevent.nameで取得できます。event.nameが"esc"と一致した場合にグローバル変数stop_flagをTrueに変え、メインループの継続条件while not stop_flagが偽となってループを抜けます。
ループ終了後はkeyboard.unhook_all()を呼び出してコールバック登録を解除することを推奨します。通常のスクリプト実行ではプロセス終了時にフックも解放されますが、対話型シェル(REPL)やJupyter Notebookなどの長期実行環境ではコールバックが残存する場合があるためです。
keyboard.is_pressed()とkeyboard.on_press()の使い分け基準は、以下の通りです。
| 方式 | 向いている場面 | 向いていない場面 |
|---|---|---|
| is_pressed() | シンプルなループで即座に停止したい | ループの処理間隔が長く応答性が必要な場面 |
| on_press() | 複数キーへの対応や複雑な条件が必要 | シンプルな1キー検知のみで済む場面 |
単純なqキーでの停止ならis_pressed()で十分ですが、複数キーの組み合わせや処理の優先度を細かく制御したい場合はon_press()のコールバック方式が適しています。なお、macOSやLinuxでroot権限を付与できない環境では、標準ライブラリのcursesモジュールがノンブロッキングのキー入力検知の代替として利用できます。
PythonのKeyboardInterrupt例外でCtrl+Cによりループを抜ける方法
KeyboardInterruptとは、ターミナルでCtrl+Cなどの割り込みキーを押下したときにPythonが発生させる例外です。Unix系ではSIGINTシグナル、WindowsではCTRL_C_EVENTとして扱われ、どちらもPythonインタプリタによってKeyboardInterruptに変換されます。
KeyboardInterruptは通常のExceptionではなくBaseExceptionを直接継承しているため、except Exceptionでは捕捉されません。except KeyboardInterruptと明示的に記述する必要があります。
Raised when the user hits the interrupt key (normally Control-C or Delete). During execution, a check for interrupts is made regularly.
出典:Python公式ドキュメント - Built-in Exceptions: KeyboardInterrupt
この方法はPython標準機能のみで実装できるため、追加のライブラリインストールは不要です。センサー監視や定期実行バッチなど、長時間動作するプログラムの停止処理として広く使われています。
本H2では以下の2つのパターンを解説します。
- try-exceptでKeyboardInterruptを捕捉してループを抜ける
- try-except-finallyで後処理を含めてループを抜ける
それぞれのパターンについて、コピペで動作するサンプルコードとともに解説していきます。
try-exceptでKeyboardInterruptを捕捉してループを抜ける
while Trueのループ全体をtryブロックで囲み、except KeyboardInterruptでCtrl+C押下を捕捉します。except節に終了メッセージの表示など、ループ停止後に実行したい処理を記述します。
import time
print("処理を開始します。Ctrl+C で停止できます。")
try:
count = 0
while True:
count += 1
print(f"実行回数: {count}")
time.sleep(1) # 1秒ごとに処理
except KeyboardInterrupt:
print("\nCtrl+C が押されました。ループを終了します。")
print("プログラムを終了しました。")
このコードを実行するとカウントを1秒ごとに表示し続け、Ctrl+Cを押した時点でexcept節のメッセージを表示してループを終了します。
KeyboardInterruptを捕捉せずにCtrl+Cを押した場合はトレースバックが表示されてプログラムが強制終了しますが、except KeyboardInterruptで捕捉することによって終了メッセージの表示など丁寧な終了処理を実装できます。
KeyboardInterruptは予測不能な地点で発生し得るため、捕捉は最小限に留め、必要な後処理のみを行って速やかに終了するのが望ましいです。
| 動作 | 捕捉なし | except捕捉あり |
|---|---|---|
| 終了方法 | 強制終了(エラー表示) | 正常終了(メッセージ表示) |
| トレースバック | 表示される | 表示されない |
| 後続コードの実行 | 実行されない(finally句がある場合を除く) | 実行される |
ループの後に続くコード(上記サンプルの「プログラムを終了しました。」の行)は、except KeyboardInterruptで捕捉した場合にのみ実行されます。
try-except-finallyで後処理を含めてループを抜ける
finally句は、tryブロック内の処理が正常終了・例外発生のどちらの場合でも実行されるブロックです。
ただし、os._exit()による強制終了やプロセスのkillなど、Pythonの例外処理機構が介入できないケースでは実行が保証されない点に注意してください。
ファイルのクローズやデータベース接続の解放など、プログラムの終了前に行うべきリソース解放処理をfinally句に記述します。なお、実務ではファイル操作にwith文(コンテキストマネージャ)を使うことで、例外の有無を問わずリソースを自動で解放できるため、try-finallyよりも推奨されます。
以下のサンプルではfinally句の動作を明示的に示すためにopen()とclose()を使用していますが、実務ではwith open(...) as f:の形式を使用してください。
import time
log_file = open("sensor_log.txt", "w")
print("センサー監視を開始します。Ctrl+C で停止できます。")
try:
count = 0
while True:
count += 1
log_line = f"計測 {count} 回目: 温度 25.{count % 10} ℃\n"
log_file.write(log_line)
print(log_line, end="")
time.sleep(1)
except KeyboardInterrupt:
print("\nCtrl+C が押されました。監視を停止します。")
finally:
log_file.close() # Ctrl+C でも正常終了でも必ず実行される
print("ログファイルをクローズしました。")
print("プログラムを終了しました。")
このコードはセンサーの計測値をsensor_log.txtに書き込み続け、Ctrl+Cを押すとexcept節で停止メッセージを表示し、finally節でファイルをクローズします。
finally句を使わずにファイルクローズをexcept節だけに書くと、KeyboardInterrupt以外の例外が発生した場合にファイルが閉じられないリスクがあります。finally句に後処理をまとめることによって、通常の例外処理が働く範囲ではリソースを解放できます。
| 句 | 実行タイミング | 主な用途 |
|---|---|---|
| try | 通常処理(ループ本体) | メインのループ処理 |
| except | Ctrl+C押下時のみ | 停止メッセージの表示 |
| finally | 通常終了・例外発生の両方で実行 | ファイル・接続のクローズ |
実務でのリソース管理にはtry-except-finallyの3句構成を採用することによって、KeyboardInterruptだけではなく予期しない例外が発生した場合でも後処理が実行されます。
Pythonのthreadingモジュールで並行してキー入力を監視しループを抜ける方法
threadingモジュールは、Pythonに標準搭載されているライブラリで、追加インストールなしに主要なデスクトップOS(Windows・macOS・Linux)で利用できます。
このモジュールを使うことによって、メインスレッドでループ処理を走らせながら、別のスレッドでキー入力を待ち受ける並行処理のプログラム構成が実現できます。
ここでは、以下の2つのパターンを解説します。
- threadingとinput()を組み合わせてループを抜ける
- threading.Eventで複数スレッドのループを同時に停止する
どちらのパターンも、前述の通りinput()関数がブロッキング型であるという性質を、スレッドの分離によって回避する設計です。それぞれについて、詳しく解説していきます。
threadingとinput()を組み合わせてループを抜ける
threadingモジュールのThreadクラスを使い、入力待ちのinput()を別スレッドで実行するパターンです。スレッドとは、1つのプログラム内で複数の処理を並行して実行するための仕組みのことです。
メインスレッドはループを継続し、デーモンスレッド(メインスレッドが終了すると自動で停止するバックグラウンドスレッド)がキー入力を待ち受けます。
入力が確認されると共有フラグ変数を更新し、メインスレッドのループがそのフラグをチェックして処理を抜ける仕組みです。前述のkeyboard.on_press()節で触れた通り、単純なboolフラグの更新は多くの場合問題なく動作しますが、より厳密にスレッド間の同期を管理したい場合は次節のthreading.Eventを推奨します。
import threading
import time
stop_flag = False
def wait_for_input():
global stop_flag
input("Enterキーを押すとループを終了します...\n")
stop_flag = True
# デーモンスレッドとして起動(メインスレッド終了時に自動停止)
t = threading.Thread(target=wait_for_input, daemon=True)
t.start()
count = 0
while not stop_flag:
count += 1
print(f"ループ実行中: {count}回目")
time.sleep(1)
print("ループを終了しました。")
上記のコードでは、daemon=Trueを指定することによって、メインスレッドが終了した際にサブスレッドも自動で停止します。ただし、デーモンスレッドではファイルのフラッシュやネットワーク接続のクローズなど、リソースの安全な解放が保証されない点に注意してください。
また、サブスレッドのinput()プロンプトとメインスレッドのprint()出力がターミナル上で混在し、表示が乱れる場合があります。
このパターンの用途と特徴をまとめると、以下の通りです。
| 項目 | 内容 |
|---|---|
| 入力方式 | Enterキー押下(標準入力) |
| ライブラリ | threading(標準ライブラリ、追加インストール不要) |
| ブロッキング | メインスレッドはノンブロッキングで継続 |
| OS依存性 | 主要デスクトップOS(Windows・macOS・Linux)で動作 |
メインスレッドのループが停止を待たずに処理を継続できる点が、単純なinput()によるブロッキング待ちとの最大の違いです。センサー監視やデータ収集など、ループを止めずにユーザーの停止操作を受け付けたい場面に適しています。
threading.Eventで複数スレッドのループを同時に停止する
threading.Eventは、スレッド間でシグナルを送受信するためのオブジェクトです。event.set()を呼び出すことによって停止シグナルを送り、各スレッドはevent.is_set()をチェックしてループを抜けます。
複数のスレッドで並行処理を行っている場合に、1回の操作で全スレッドを同時に停止できる点が特徴です。
共有フラグ変数と比較した場合、Eventはevent.wait(timeout)でブロッキング待機ができるため、ポーリングによるCPUリソースの浪費を防げます。また、複数スレッドへの一括通知や状態のリセットといった制御が標準メソッドで行える点もEventの利点です。
import threading
import time
stop_event = threading.Event()
def worker(name):
"""複数スレッドで並行して動作するループ処理"""
count = 0
while not stop_event.is_set():
count += 1
print(f"[{name}] ループ実行中: {count}回目")
time.sleep(1)
print(f"[{name}] ループを終了しました。")
def wait_for_input():
"""Enterキーを受け取ったら停止イベントをセットする"""
input("Enterキーを押すと全スレッドを停止します...\n")
stop_event.set()
# 2つのワーカースレッドを起動
t1 = threading.Thread(target=worker, args=("Worker-A",), daemon=True)
t2 = threading.Thread(target=worker, args=("Worker-B",), daemon=True)
t_input = threading.Thread(target=wait_for_input, daemon=True)
t1.start()
t2.start()
t_input.start()
# 全スレッドの終了を待機(タイムアウトは例示のため5秒に設定)
t1.join(timeout=5)
t2.join(timeout=5)
# タイムアウト後にスレッドが停止していない場合の確認
if t1.is_alive() or t2.is_alive():
print("一部のスレッドが停止を完了していません。")
else:
print("全スレッドを停止しました。")
上記のコードでは、worker関数を2つの独立したスレッドで実行しています。stop_event.is_set()がループの継続条件となっており、Enterキーが押されてstop_event.set()が呼ばれると、両スレッドが次のループチェックのタイミングで同時に停止します。
join(timeout=5)は、スレッドが終了するまで最大5秒待機するメソッドです。join()の戻り値は常にNoneのため、タイムアウト後にスレッドが停止したかどうかはis_alive()で確認する必要があります。
threading.Eventと共有フラグの違いをまとめると、以下の通りです。
| 比較項目 | 共有フラグ変数 | threading.Event |
|---|---|---|
| 安全性 | 単純なboolフラグの更新は多くの場合動作するが、厳密な同期にはEventを推奨 | 内部にロック機構を持ち、複雑な状態管理にも対応 |
| 複数スレッドへの通知 | 各スレッドが同じ変数を参照 | event.set()で一括通知 |
| ブロッキング待機 | 不可(ポーリング必須) | event.wait()で可能(CPU負荷を抑制) |
| リセット | 手動で変数を書き換え | event.clear()で再利用可能 |
複数のスレッドを協調して動作させる場合は、共有フラグ変数よりもthreading.Eventを使う方が設計上の意図が明確です。wait()によるブロッキング待機でCPU負荷を抑えられるほか、スレッド数が増えてもコードの構造を変えずに対応できるため、規模が大きくなる処理での採用が推奨されます。
Pythonのキー入力によるループ終了処理に関するよくある質問
keyboardモジュールをインストールできない場合の対処法は?
pip install keyboardが失敗する場合は、標準ライブラリのみで代替できます。入力待ちでよい場合はinput()関数とbreak文の組み合わせ、Ctrl+Cによる停止でよい場合はKeyboardInterrupt例外の捕捉を選択してください。
macOSやLinuxでキー入力を検知するにはどうすればよいですか?
keyboardモジュールはLinuxではroot権限(sudo実行)が必須で、macOSでもroot権限が必要なうえに公式READMEで「実験的サポート」と記載されています。権限を付与できない環境では、標準ライブラリのcursesモジュールが代替として利用できます。
cursesはmacOSやLinuxでノンブロッキングのキー入力を取得できますが、Windows標準環境では利用できないため、Windowsではmsvcrtモジュールが代替となります。
ループを抜けた後にリソースを確実に解放するにはどうすればよいですか?
with文(コンテキストマネージャ)を使うのが最も推奨される方法です。with文が使えないリソースに対しては、try-finallyブロックのfinally節にクリーンアップ処理を記述してください。
詳細は本文のKeyboardInterrupt節のtry-except-finallyパターンを参照してください。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
gitでブランチ(branch)を切り替える方法
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
サイボウズがkintone AIを正式提供、β版から約1年を経てクレジット制を導入
ロゼッタのラクヤクAIがCSRドラフト作成期間を90%以上短縮、従来4週間を約2日に
AI CROSSが不動産業界向け生成AI伴走支援を開始、アスコットの業務AI実装を実践サポート
日本情報クリエイトが「オーナー提案AIロボⅡ」売買査定を刷新、月1万円からW査定が回数無制限に
Wur株式会社がAI新規事業診断サービス「MVP事業診断レポート」をリリース、12の質問で事業構想を約10分で分析
バトンズがM&A専門家向け「AI概要書」β版を提供開始、企業概要書のドラフトを最速3分で自動生成
SCSKが観光DXサービス「Connexia」を開発、首里城公園でNFT活用の周遊促進が始動
Verdent AI発表、エンジニア不要でソフトウェアを構築する「AIエンジニアリングチーム」が登場
ゼネラルBREXAテクノロジーが外食・小売向けAIサービス「aimana」を開発、店長の意思決定をデータで支援
田中組がKencopa工程AIエージェント製品版を先行利用開始、建設現場の工程管理属人化を解消へ
