実行中のPythonアプリケーションからのスタックトレースを表示する

344
Seb 2008-09-25 22:06.

私は時々立ち往生しているこのPythonアプリケーションを持っていて、どこにいるのかわかりません。

実行中の正確なコードを表示するようにPythonインタープリターに通知する方法はありますか?

ある種のオンザフライスタックトレース?

関連する質問:

  • Pythonコードのメソッドから現在の呼び出しスタックを出力する
  • 実行中のプロセスが実行していることを確認します。インストルメントされていないPythonプログラムのスタックトレースを出力します。

28 answers

321
Brian 2008-09-26 03:38.

私はこのような状況で使用するモジュールを持っています-プロセスは長時間実行されますが、未知の再現不可能な理由で時々スタックします。それは少しハッキーで、UNIXでのみ機能します(信号が必要です):

import code, traceback, signal

def debug(sig, frame):
    """Interrupt running process, and provide a python prompt for
    interactive debugging."""
    d={'_frame':frame}         # Allow access to frame object.
    d.update(frame.f_globals)  # Unless shadowed by global
    d.update(frame.f_locals)

    i = code.InteractiveConsole(d)
    message  = "Signal received : entering python shell.\nTraceback:\n"
    message += ''.join(traceback.format_stack(frame))
    i.interact(message)

def listen():
    signal.signal(signal.SIGUSR1, debug)  # Register handler

使用するには、プログラムの起動時にlisten()関数を呼び出し(site.pyに貼り付けて、すべてのPythonプログラムに使用させることもできます)、実行させます。いつでも、killを使用して、またはpythonでプロセスにSIGUSR1シグナルを送信します。

    os.kill(pid, signal.SIGUSR1)

これにより、プログラムは現在の時点でPythonコンソールに分割され、スタックトレースが表示され、変数を操作できるようになります。control-d(EOF)を使用して、実行を続行します(ただし、シグナルを送信した時点でI / Oなどを中断する可能性があるため、完全に邪魔にならないわけではありません。

パイプを介して実行中のプロセスと通信することを除いて、同じことを行う別のスクリプトがあります(バックグラウンドプロセスのデバッグなどを可能にするため)。ここに投稿するには少し大きいですが、Pythonクックブックレシピとして追加しました。

147
spiv 2008-09-29 14:44.

シグナルハンドラーをインストールするという提案は良いものであり、私はそれをよく使用します。たとえば、bzrはデフォルトでpdb.set_trace()、pdbプロンプトにすぐにドロップするために呼び出すSIGQUITハンドラーをインストールします。(正確な詳細については、bzrlib.breakinモジュールのソースを参照してください。)pdbを使用すると、((w)hereコマンドを使用して)現在のスタックトレースを取得できるだけでなく、変数などを検査することもできます。

ただし、シグナルハンドラーをインストールする先見の明がなかったプロセスをデバッグする必要がある場合があります。Linuxでは、gdbをプロセスにアタッチし、いくつかのgdbマクロを使用してPythonスタックトレースを取得できます。プットhttp://svn.python.org/projects/python/trunk/Misc/gdbinitで~/.gdbinit、その後:

  • gdbをアタッチします: gdb -p PID
  • Pythonスタックトレースを取得します。 pystack

残念ながら、完全に信頼できるわけではありませんが、ほとんどの場合は機能します。

最後に、アタッチstraceすることで、プロセスが何をしているのかがよくわかります。

76
haridsv 2010-04-03 13:23.

私はほとんど常に複数のスレッドを扱っており、メインスレッドは一般的にあまり機能していないので、最も興味深いのはすべてのスタックをダンプすることです(これはJavaのダンプに似ています)。これがこのブログに基づく実装です:

import threading, sys, traceback

def dumpstacks(signal, frame):
    id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
    code = []
    for threadId, stack in sys._current_frames().items():
        code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""), threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    print "\n".join(code)

import signal
signal.signal(signal.SIGQUIT, dumpstacks)
55
Nickolay 2015-04-27 08:22.

準備されていないPythonプログラムのスタックトレースを取得し、シンボルをデバッグせずにストックPythonで実行すると、pyrasiteを使用して実行できます。Ubuntu Trustyで私にとって魅力のように働いた:

$ sudo pip install pyrasite $ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
$ sudo pyrasite 16262 dump_stacks.py # dumps stacks to stdout/stderr of the python program

(@Albertへのハットチップ。その回答には、他のツールの中でも、これへのポインターが含まれていました。)

36
Torsten Marek 2008-09-25 22:29.
>>> import traceback
>>> def x():
>>>    print traceback.extract_stack()

>>> x()
[('<stdin>', 1, '<module>', None), ('<stdin>', 2, 'x', None)]

スタックトレースを適切にフォーマットすることもできます。ドキュメントを参照してください。

編集:@Douglas Leederによって提案されているように、Javaの動作をシミュレートするには、次を追加します。

import signal
import traceback

signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))

アプリケーションのスタートアップコードに。次にSIGUSR1、実行中のPythonプロセスに送信して、スタックを印刷できます。

29
gulgi 2008-09-25 22:27.

トレースバックモジュールは、それらの間で、いくつかの素晴らしい機能を持っていますprint_stackを:

import traceback

traceback.print_stack()
24
haypo 2013-04-27 12:18.

フォールトハンドラモジュールを試すことができます。を使用してインストールしpip install faulthandler、以下を追加します。

import faulthandler, signal
faulthandler.register(signal.SIGUSR1)

プログラムの開始時に。次に、SIGUSR1をプロセス(例:)に送信してkill -USR1 42、すべてのスレッドのPythonトレースバックを標準出力に表示します。その他のオプション(例:ファイルにログイン)およびトレースバックを表示するその他の方法については、ドキュメントをお読みください。

このモジュールはPython3.3の一部になりました。Python 2については、を参照してください。http://faulthandler.readthedocs.org/

20
Gunnlaugur Briem 2009-03-07 02:49.

ここで本当に助けになったのは、準備されていないPythonプロセスからスタックトレースを取得するためのspivのヒント(レピュテーションポイントがあれば投票してコメントする)です。gdbinitスクリプトを変更するまで機能しなかったことを除いて。そう:

  • ダウンロード http://svn.python.org/projects/python/trunk/Misc/gdbinit 入れて ~/.gdbinit

  • 編集して、に変更PyEval_EvalFrameしますPyEval_EvalFrameEx[編集:不要になりました; リンクされたファイルには、2010-01-14の時点ですでにこの変更があります]

  • gdbをアタッチします: gdb -p PID

  • Pythonスタックトレースを取得します。 pystack

12
Gustavo Rubio 2008-09-25 22:24.

python -dv yourscript.py

これにより、インタプリタがデバッグモードで実行され、インタプリタが実行していることのトレースが得られます。

コードをインタラクティブにデバッグする場合は、次のように実行する必要があります。

python -m pdb yourscript.py

これは、Pythonデバッガーであるモジュール「pdb」を使用してスクリプトを実行するようにPythonインタープリターに指示します。このように実行すると、インタープリターはGDBと同様にインタラクティブモードで実行されます。

12
Konstantin Tarashchanskiy 2011-04-01 06:30.

これをharidsvの応答へのコメントとして追加しますが、そうするという評判がありません。

私たちの何人かはまだ2.6より古いバージョンのPython(Thread.identに必要)で立ち往生しているので、Python 2.5でコードを動作させました(スレッド名は表示されていませんが):

import traceback
import sys
def dumpstacks(signal, frame):
    code = []
    for threadId, stack in sys._current_frames().items():
            code.append("\n# Thread: %d" % (threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    print "\n".join(code)

import signal
signal.signal(signal.SIGQUIT, dumpstacks)
11
Matt Joiner 2012-01-27 03:57.

Python3.3のfaulthandler新機能であるモジュールを見てください。faulthandlerPython2で使用するためのバックポートはPyPIで利用できます。

7
Tim Foster 2011-08-29 11:30.

Solarisでは、pstack(1)を使用できます。Pythonコードを変更する必要はありません。例えば。

# pstack 16000 | grep : | head
16000: /usr/bin/python2.6 /usr/lib/pkg.depotd --cfg svc:/application/pkg/serv
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:282 (_wait) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:295 (wait) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:242 (block) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/_init_.py:249 (quickstart) ]
[ /usr/lib/pkg.depotd:890 (<module>) ]
[ /usr/lib/python2.6/threading.py:256 (wait) ]
[ /usr/lib/python2.6/Queue.py:177 (get) ]
[ /usr/lib/python2.6/vendor-packages/pkg/server/depot.py:2142 (run) ]
[ /usr/lib/python2.6/threading.py:477 (run)
etc.
6
anatoly techtonik 2013-06-24 22:03.

Linuxシステムを使用している場合はgdb、Pythonデバッグ拡張機能(python-dbgまたはpython-debuginfoパッケージに含めることができます)の素晴らしさを使用してください。また、マルチスレッドアプリケーション、GUIアプリケーション、およびCモジュールにも役立ちます。

次のコマンドでプログラムを実行します。

$ gdb -ex r --args python <programname>.py [arguments]

これはgdb、それを準備python <programname>.py <arguments>して元にr戻すように指示します。

プログラムがハングした場合は、gdbコンソールに切り替えて、を押しCtr+Cて実行します。

(gdb) thread apply all py-list

参照してください。例セッションと詳細情報をこことここ。

6
Stefan 2012-04-16 10:28.

私は自分のスレッドをデバッグするための解決策をしばらく探していましたが、haridsvのおかげでここで見つけました。traceback.print_stack()を使用した少し簡略化されたバージョンを使用します。

import sys, traceback, signal
import threading
import os

def dumpstacks(signal, frame):
  id2name = dict((th.ident, th.name) for th in threading.enumerate())
  for threadId, stack in sys._current_frames().items():
    print(id2name[threadId])
    traceback.print_stack(f=stack)

signal.signal(signal.SIGQUIT, dumpstacks)

os.killpg(os.getpgid(0), signal.SIGQUIT)

必要に応じて、スレッドを名前でフィルタリングします。

4
saaj 2020-04-02 06:07.

それは優れたpy-spyで行うことができます。これはPythonプログラムのサンプリングプロファイラーであるため、その仕事はPythonプロセスにアタッチし、それらの呼び出しスタックをサンプリングすることです。したがって、プロセスpy-spy dump --pid $SOME_PID内のすべてのスレッドの呼び出しスタックをダンプするために必要なのはこれだけです$SOME_PID。通常、(ターゲットプロセスのメモリを読み取るために)昇格された特権が必要です。

スレッド化されたPythonアプリケーションの場合の例を次に示します。

$ sudo py-spy dump --pid 31080
Process 31080: python3.7 -m chronologer -e production serve -u www-data -m
Python v3.7.1 (/usr/local/bin/python3.7)

Thread 0x7FEF5E410400 (active): "MainThread"
    _wait (cherrypy/process/wspbus.py:370)
    wait (cherrypy/process/wspbus.py:384)
    block (cherrypy/process/wspbus.py:321)
    start (cherrypy/daemon.py:72)
    serve (chronologer/cli.py:27)
    main (chronologer/cli.py:84)
    <module> (chronologer/__main__.py:5)
    _run_code (runpy.py:85)
    _run_module_as_main (runpy.py:193)
Thread 0x7FEF55636700 (active): "_TimeoutMonitor"
    run (cherrypy/process/plugins.py:518)
    _bootstrap_inner (threading.py:917)
    _bootstrap (threading.py:885)
Thread 0x7FEF54B35700 (active): "HTTPServer Thread-2"
    accept (socket.py:212)
    tick (cherrypy/wsgiserver/__init__.py:2075)
    start (cherrypy/wsgiserver/__init__.py:2021)
    _start_http_thread (cherrypy/process/servers.py:217)
    run (threading.py:865)
    _bootstrap_inner (threading.py:917)
    _bootstrap (threading.py:885)
...
Thread 0x7FEF2BFFF700 (idle): "CP Server Thread-10"
    wait (threading.py:296)
    get (queue.py:170)
    run (cherrypy/wsgiserver/__init__.py:1586)
    _bootstrap_inner (threading.py:917)
    _bootstrap (threading.py:885)  
3
rcoup 2009-01-29 15:28.

Pydb、「gdbコマンドセットに大まかに基づいたPythonデバッガーの拡張バージョン」を見る価値があります。これには、指定されたシグナルが送信されたときにデバッガーの起動を処理できるシグナルマネージャーが含まれています。

2006年夏のコードのプロジェクトと呼ばれるモジュールにpydbにリモートデバッグ機能を追加して見mpdb。

3
Albert 2012-04-07 08:49.

実行中のPythonプロセスにアタッチし、Pythonシェルを取得するためにコードを挿入するツールを一緒にハッキングしました。

ここを参照してください: https://github.com/albertz/pydbattach

2
Dan Lecocq 2014-05-01 23:40.

pyringeは、事前に設定しなくても、実行中のpythonプロセス、出力スタックトレース、変数などと対話できるデバッガーです。

私は過去にシグナルハンドラソリューションを頻繁に使用しましたが、特定の環境では問題を再現するのが難しい場合があります。

1
Armin Ronacher 2008-09-25 23:09.

実行中のPythonプロセスにフックして、妥当な結果を得る方法はありません。プロセスがロックアップした場合に私が行うことは、straceをフックして、何が起こっているのかを正確に把握しようとすることです。

残念ながら、多くの場合、straceは競合状態を「修正」して、出力がそこでも役に立たないようにするオブザーバーです。

1
asmeurer 2013-04-27 14:54.

これを行うには、cursesインターフェースを備えたPythonデバッガーであるPuDBを使用できます。追加するだけです

from pudb import set_interrupt_handler; set_interrupt_handler()

コードに追加し、中断したい場合はCtrl-Cを使用します。c失敗して再試行したい場合は、続行して何度も中断することができます。

1
user7610 2018-04-19 02:31.

私はPython拡張機能を備えたGDBキャンプにいます。フォローするhttps://wiki.python.org/moin/DebuggingWithGdb、つまり

  1. dnf install gdb python-debuginfo または sudo apt-get install gdb python2.7-dbg
  2. gdb python <pid of running process>
  3. py-bt

また、とを検討info threadsしてくださいthread apply all py-bt

1
jakvb 2019-01-17 10:47.

コンソールで関数をデバッグする方法:

pdb.set_trace()使用する関数を作成してから、デバッグする関数を作成します

>>> import pdb
>>> import my_function

>>> def f():
...     pdb.set_trace()
...     my_function()
... 

次に、作成した関数を呼び出します。

>>> f()
> <stdin>(3)f()
(Pdb) s
--Call--
> <stdin>(1)my_function()
(Pdb) 

ハッピーデバッグ:)

1
kmaork 2020-08-08 02:41.

次のように、hypnoパッケージを使用できます。

hypno <pid> "import traceback; traceback.print_stack()"

これにより、スタックトレースがプログラムの標準出力に出力されます。

または、stdoutに何も出力したくない場合、またはそれにアクセスできない場合(デーモンなど)、実行中のファイルにアタッチできるPythonデバッガーであるmadbgパッケージを使用できます。 Pythonプログラムを作成し、現在のターミナルでデバッグします。それはに類似しているpyrasitepyringe、より新しい、GDBを必要とせず、用途IPython(色や自動補完を意味する)デバッガのために。

実行中のプログラムのスタックトレースを確認するには、次のコマンドを実行します。

madbg attach <pid>

そして、デバッガシェルに次のように入力します。 bt

免責事項-私は両方のパッケージを書きました

0
Douglas Leeder 2008-09-25 23:06.

SIGQUITに対するJavaの応答に似たものは何も知らないので、アプリケーションに組み込む必要があるかもしれません。ある種のメッセージへの応答でスタックトレースを取得できるサーバーを別のスレッドで作成できるかもしれません。

0
Noname 2009-09-16 20:44.

検査モジュールを使用します。

import inspect help(inspect.stack)モジュールinspectの関数スタックに関するヘルプ:

stack(context = 1)呼び出し元のフレームの上のスタックのレコードのリストを返します。

本当に参考になりました。

0
jtatum 2014-12-14 16:16.

Python 3では、デバッガーで初めてc(ont(inue))を使用すると、pdbはシグナルハンドラーを自動的にインストールします。その後、Control-Cを押すと、すぐにそこに戻ります。Python 2では、これは比較的古いバージョンでも機能するはずのワンライナーです(2.7でテストされましたが、Pythonソースを2.4に戻したところ、問題ないように見えました)。

import pdb, signal
signal.signal(signal.SIGINT, lambda sig, frame: pdb.Pdb().set_trace(frame))

Pythonのデバッグに時間を費やす場合、pdbは学ぶ価値があります。インターフェイスは少し鈍いですが、gdbなどの同様のツールを使用したことのある人なら誰でも知っているはずです。

0
Michal Čihař 2015-04-28 20:15.

uWSGIでこれを行う必要がある場合は、Python Tracebackerが組み込まれており、構成で有効にするだけです(各ワーカーの名前に番号が付けられます)。

py-tracebacker=/var/run/uwsgi/pytrace

これを実行すると、ソケットに接続するだけでバックトレースを出力できます。

uwsgi --connect-and-read /var/run/uwsgi/pytrace1
0
Wayne Lambert 2020-05-24 06:59.

コードが実行された時点で、この小さなスニペットを挿入して、適切にフォーマットされた印刷されたスタックトレースを確認できます。logsプロジェクトのルートディレクトリにというフォルダがあることを前提としています。

# DEBUG: START DEBUG -->
import traceback

with open('logs/stack-trace.log', 'w') as file:
    traceback.print_stack(file=file)
# DEBUG: END DEBUG --!

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

HMSプリンスオブウェールズの橋はスターウォーズからまっすぐです

HMSプリンスオブウェールズの橋はスターウォーズからまっすぐです

BAE Systems Maritimeは昨日、英国海軍の2番目のクイーンエリザベスクラスの空母であるHMSプリンスオブウェールズのブリッジモジュールを展開しました。公海を航海するよりも、アウターリムの惑星を周回してタイファイターを発射する必要があるようです。70,000の排水量のトン運搬船は、2020年に就役し、姉のエリザベス女王と同様に、約40機の航空機を運ぶ予定です。

ルイビルはサヨナラゲームでウェイクフォレストを倒すために家を盗んだ

ルイビルはサヨナラゲームでウェイクフォレストを倒すために家を盗んだ

ルイビルは、通常の大学野球の強みであるピッチング、ディフェンス、スマートベースランニングを通じて、全国ランキングのトップ5と19-2の会議記録への道を歩みました。昨夜、彼らは野球の最もエキサイティングなプレーの1つである盗塁を使用して、ウェイクフォレストのスイープを完了しました。

おいしいツイストのためにコーンブレッドであなたの次のサンドイッチを作りましょう

おいしいツイストのためにコーンブレッドであなたの次のサンドイッチを作りましょう

粗いパン粉とふわふわの食感のコーンブレッドは、唐辛子を吸い上げるのに理想的な乗り物です。しかし、それだけではありません。

別の驚くべきマーベルヒーローがキャプテンアメリカに参加します:シビルウォー!

別の驚くべきマーベルヒーローがキャプテンアメリカに参加します:シビルウォー!

ニール・ブロムカンプが、チャッピーが第10地区をどのように遅らせたのかについて話します。フォースの覚醒の噂は、次の予告編に何を期待するかについてのいじめを提供します。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language