当前位置: 首页 > article >正文

Dify源码学习

文章目录

  • 1 大模型基本原理
    • 1.1 model_context_tokens、max_tokens和prompt_tokens
      • 1.1.1 三者之间的关系
      • 1.1.2 总结对比
  • 2 Dify源代码
    • 2.0 前后端代码跑起来
      • 【0】准备开发环境
      • 【1】下载代码
      • 【2】运行后端
        • (1)Start the docker-compose stack
        • (2) Copy `.env.example` to `.env`
        • (3)Generate a `SECRET_KEY` in the `.env` file.
        • (4)Create environment.
        • (5)Install dependencies
        • (6)Run migrate
        • (7)Start backend
      • 【3 运行前端】
        • (0)环境要求
        • (1)安装前端依赖库
        • (2)创建一个配置文件
        • (3)跑起来
        • (4)看效果
    • 2.1 后端
    • 2.2 前端

1 大模型基本原理

1.1 model_context_tokens、max_tokens和prompt_tokens

  1. prompt_tokens
  • 含义:
    输入给模型的 ** 提示文本(Prompt)** 所包含的 token 数量。Token 是模型处理文本的基本单位(例如,一个英文单词可能被拆分为多个 tokens,中文可能按字符或词语拆分)。
  • 作用:
    计算费用:大多数 LLM 按 输入 token 数 + 输出 token 数 计费,prompt_tokens 直接影响成本。
    上下文长度限制:prompt_tokens 必须小于等于 model_context_tokens,否则会导致截断或错误。
  1. max_tokens
  • 含义:
    模型生成的最大输出 token 数量。例如,设置 max_tokens=200,则模型最多生成 200 个 tokens 的回复。
  • 作用:
    控制响应长度:避免生成过长的内容(如无限循环或冗余回答)。
    限制费用:减少不必要的 token 消耗。
  1. model_context_tokens
  • 含义:
    模型支持的最大上下文窗口大小,即输入(prompt_tokens)和输出(max_tokens)的总 token 数上限。
  • 示例:
    GPT-4 的 model_context_tokens 通常为 8192 或 32768(取决于版本)。
    如果 prompt_tokens = 4000,则 max_tokens 最大只能设置为 8192 - 4000 = 4192。

1.1.1 三者之间的关系

prompt_tokens + max_tokens ≤ model_context_tokens

如果``prompt_tokens + max_tokens > model_context_tokens ,请求会失败(例如报错 “上下文长度超出限制”)。

1.1.2 总结对比

参数含义示例(GPT-4 8K)
prompt_tokens输入提示的 token 数量例如:4000 tokens
max_tokens输出结果的最大 token数量设置为 ≤ 4192 tokens
model_context_tokens模型支持的总上下文长度上限固定值:8192 tokens

2 Dify源代码

2.0 前后端代码跑起来

【0】准备开发环境

【Windows开发】
1、 安装并启用WSL2.
2、 安装Docker Desktop
3、 安装python 3.12或者以上的版本, 这个是dify源码的要求,源码中大量使用了高版本的Python才支持的一些特性。 为pip配置清华的源。

【1】下载代码

gitee下载地址:https://gitee.com/dify_ai/dify

【2】运行后端

无他, 总体思路就是按照api目录中的readme进行操作。

(1)Start the docker-compose stack

The backend require some middleware, including PostgreSQL, Redis, and Weaviate, which can be started together using docker-compose.

   cd ../dockercp middleware.env.example middleware.env# change the profile to other vector database if you are not using weaviatedocker compose -f docker-compose.middleware.yaml --profile weaviate -p dify up -dcd ../api

这一步牵扯到docker,最容易出问题。 但是这里也牵扯到了docker的好处,正是因为用了docker,才会保持环境一直, 基本上也不用考虑这么多中间件的安装。

【第一个问题: docker环境问题(个人认为这个问题是最常见的,我自己几台电脑中都有这个问题,这个不可回避也不能回避)】
问题:

Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

解决办法:
《1》为 docker desktop配置镜像源。我这里给出我的配置文件(虽然也是从网上copy过来的)。

{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.m.daocloud.io/","https://docker.mirrors.ustc.edu.cn","https://huecker.io/","https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","https://dockerhub.timeweb.cloud","https://noohub.ru/","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://xx4bwyg2.mirror.aliyuncs.com","http://f1361db2.m.daocloud.io","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"]}

《2》增加请求超时时间:可以尝试增加 Docker 的默认超时时间。例如在 WSL 的 Ubuntu 环境下,可以增加 Docker 的客户端超时时间. 进入虚拟出来的Ubuntu系统(我这里是Ubuntu系统,因人而异,可能是Debian系统等), 执行如下命令:

export DOCKER_CLIENT_TIMEOUT=600
export COMPOSE_HTTP_TIMEOUT=600

参考:
https://www.cnblogs.com/OneSeting/p/18532166

(2) Copy .env.example to .env

注意,这一步的执行是在api目录下面。 不是在docker目录下执行的。 否则会遇到问题,非常坎坷,还有一些些问题。

   cp .env.example .env 
(3)Generate a SECRET_KEY in the .env file.

bash for Linux

   sed -i "/^SECRET_KEY=/c\SECRET_KEY=$(openssl rand -base64 42)" .env

bash for Mac

   secret_key=$(openssl rand -base64 42)sed -i '' "/^SECRET_KEY=/c\\SECRET_KEY=${secret_key}" .env

如果是Windows系统的话,可以利用Git Bash,git bash里面是可以执行Linux命令的,直接执行上述的Linux命令即可。

(4)Create environment.

Dify API service uses UV to manage dependencies.
First, you need to add the uv package manager, if you don’t have it already.

   pip install uv# Or on macOSbrew install uv

这里需要注意, 最好为pip配置一下清华的源。 否则会很慢很慢。

(5)Install dependencies
   uv sync --dev

这一步也最容易出错,因为要安装好多好多的第三方的依赖库,很容易出问题。
【第一个问题:本地需要VC++的环境】

 [stderr]error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/hint: This usually indicates a problem with the package or the build environment.help: `chroma-hnswlib` (v0.7.6) was included because `dify-api:vdb` depends on `chromadb` (v0.5.20) which depends on `chroma-hnswlib`

解决办法:
就是下载相应的VC库。 我这里和参考文件中不一样的是,除了文档中说明的两个库之外,.net开发和C++桌面开发常用的开发库全部安装到位。(因为我本身有可能还是需要进行一些C#或者C++开发, 最起码是要看一些源代码的,需要这个环境,要方便一些)

参考:
https://zhuanlan.zhihu.com/p/165008313

(6)Run migrate

Before the first launch, migrate the database to the latest version.

   uv run flask db upgrade

这一步我也是遇到了问题的。 不确定是什么原因(不知道是不是gitee的代码还是不太行,应该用github的。还是我追求了比较新的版本)。
【第一个问题:访问数据库的url路径没有密码】
问题:

Traceback (most recent call last):File "<frozen runpy>", line 198, in _run_module_as_mainFile "<frozen runpy>", line 88, in _run_codeFile "E:\dify\api\.venv\Scripts\flask.exe\__main__.py", line 10, in <module>File "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 1129, in maincli.main()File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1363, in mainrv = self.invoke(ctx)^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1830, in invokereturn _process_result(sub_ctx.command.invoke(sub_ctx))^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1830, in invokereturn _process_result(sub_ctx.command.invoke(sub_ctx))^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1226, in invokereturn ctx.invoke(self.callback, **ctx.params)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 794, in invokereturn callback(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\decorators.py", line 34, in new_funcreturn f(get_current_context(), *args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 400, in decoratorreturn ctx.invoke(f, *args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 794, in invokereturn callback(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\flask_migrate\cli.py", line 154, in upgrade_upgrade(directory, revision, sql, tag, x_arg)File "E:\dify\api\.venv\Lib\site-packages\flask_migrate\__init__.py", line 111, in wrappedf(*args, **kwargs)File "E:\dify\api\.venv\Lib\site-packages\flask_migrate\__init__.py", line 200, in upgradecommand.upgrade(config, revision, sql=sql, tag=tag)File "E:\dify\api\.venv\Lib\site-packages\alembic\command.py", line 408, in upgradescript.run_env()File "E:\dify\api\.venv\Lib\site-packages\alembic\script\base.py", line 586, in run_envutil.load_python_file(self.dir, "env.py")File "E:\dify\api\.venv\Lib\site-packages\alembic\util\pyfiles.py", line 95, in load_python_filemodule = load_module_py(module_id, path)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\alembic\util\pyfiles.py", line 113, in load_module_pyspec.loader.exec_module(module)  # type: ignore^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "<frozen importlib._bootstrap_external>", line 994, in exec_moduleFile "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removedFile "E:\dify\api\migrations\env.py", line 109, in <module>run_migrations_online()File "E:\dify\api\migrations\env.py", line 93, in run_migrations_onlinewith connectable.connect() as connection:^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3278, in connectreturn self._connection_cls(self)^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 148, in __init__Connection._handle_dbapi_exception_noconnection(File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2442, in _handle_dbapi_exception_noconnectionraise sqlalchemy_exception.with_traceback(exc_info[2]) from eFile "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__self._dbapi_connection = engine.raw_connection()^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3302, in raw_connectionreturn self.pool.connect()^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 449, in connectreturn _ConnectionFairy._checkout(self)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1263, in _checkoutfairy = _ConnectionRecord.checkout(pool)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkoutrec = pool._do_get()^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 179, in _do_getwith util.safe_reraise():File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in __exit__raise exc_value.with_traceback(exc_tb)File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 177, in _do_getreturn self._create_connection()^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 390, in _create_connectionreturn _ConnectionRecord(self)^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__self.__connect()File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connectwith util.safe_reraise():File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in __exit__raise exc_value.with_traceback(exc_tb)File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connectself.dbapi_connection = connection = pool._invoke_creator(self)^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 643, in connectreturn dialect.connect(*cargs, **cparams)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 621, in connectreturn self.loaded_dbapi.connect(*cargs, **cparams)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\psycopg2\__init__.py", line 122, in connectconn = _connect(dsn, connection_factory=connection_factory, **kwasync)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password supplied(Background on this error at: https://sqlalche.me/e/20/e3q8)

解决办法:
我没有定位到原因, 但是我可以提供一个简单的规避方案:
api/configs/middleware/__init__.py文件中的数据库相关的配置类中,直接设置数据库的密码,这个密码就是.env文件里面的。

class DatabaseConfig(BaseSettings):DB_HOST: str = Field(description="Hostname or IP address of the database server.",default="localhost",)DB_PORT: PositiveInt = Field(description="Port number for database connection.",default=5432,)DB_USERNAME: str = Field(description="Username for database authentication.",default="postgres",)DB_PASSWORD: str = Field(description="Password for database authentication.",# 这里就是我修改的内容default="difyai123456",)
(7)Start backend
   uv run flask run --host 0.0.0.0 --port=5001 --debug

这里我也是遇到了问题的,不知道是不是下载的代码的问题,还是windows的原因还是我本地环境的原因, 这些不可考。
【第一个问题:】
问题现象:

(.venv) PS E:\dify\api> uv run flask run --host 0.0.0.0 --port=5001 --debug
warning: `VIRTUAL_ENV=E:\dify\.venv` does not match the project environment path `.venv` and will be ignored; use `--active` to target the active environment instead
2025-05-24 07:25:11,817.817 INFO [MainThread] [utils.py:149] - Note: NumExpr detected 22 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 16.
2025-05-24 07:25:11,817.817 INFO [MainThread] [utils.py:162] - NumExpr defaulting to 16 threads.
Traceback (most recent call last):File "<frozen runpy>", line 198, in _run_module_as_mainFile "<frozen runpy>", line 88, in _run_codeFile "E:\dify\api\.venv\Scripts\flask.exe\__main__.py", line 10, in <module>File "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 1129, in maincli.main()File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1363, in mainrv = self.invoke(ctx)^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1830, in invokereturn _process_result(sub_ctx.command.invoke(sub_ctx))^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 1226, in invokereturn ctx.invoke(self.callback, **ctx.params)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 794, in invokereturn callback(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\decorators.py", line 93, in new_funcreturn ctx.invoke(f, obj, *args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\click\core.py", line 794, in invokereturn callback(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 977, in run_commandraise e from NoneFile "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 961, in run_commandapp: WSGIApplication = info.load_app()  # pyright: ignore^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 353, in load_appapp = locate_app(import_name, None, raise_if_not_found=False)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\.venv\Lib\site-packages\flask\cli.py", line 245, in locate_app__import__(module_name)File "E:\dify\api\app.py", line 37, in <module>app = create_app()^^^^^^^^^^^^File "E:\dify\api\app_factory.py", line 32, in create_appinitialize_extensions(app)File "E:\dify\api\app_factory.py", line 96, in initialize_extensionsext.init_app(app)File "E:\dify\api\extensions\ext_storage.py", line 113, in init_appstorage.init_app(app)File "E:\dify\api\extensions\ext_storage.py", line 19, in init_appself.storage_runner = storage_factory()^^^^^^^^^^^^^^^^^File "E:\dify\api\extensions\ext_storage.py", line 31, in <lambda>return lambda: OpenDALStorage(dify_config.OPENDAL_SCHEME)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "E:\dify\api\extensions\storage\opendal_storage.py", line 37, in __init__self.op = opendal.Operator(scheme=scheme, **kwargs)  # type: ignore^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
opendal.exceptions.ConfigInvalid: ConfigInvalid (permanent) at  => root is not specified

解决办法:
我也不是很了解, 我目前能给出一个规避办法,先让程序能run起来。在api/extensions/ext_storage.py文件中,在创建OpenDALStorage实例的时候,直接指定root。

    @staticmethoddef get_storage_factory(storage_type: str) -> Callable[[], BaseStorage]:match storage_type:case StorageType.S3:from extensions.storage.aws_s3_storage import AwsS3Storagereturn AwsS3Storagecase StorageType.OPENDAL:from extensions.storage.opendal_storage import OpenDALStorage# 指定名为shankai的目录作为根目录return lambda: OpenDALStorage(scheme = dify_config.OPENDAL_SCHEME, root = "shankai")

至此,终于运行起来了。 效果如下:

(.venv) PS E:\dify\api> uv run flask run --host 0.0.0.0 --port=5001 --debug
warning: `VIRTUAL_ENV=E:\dify\.venv` does not match the project environment path `.venv` and will be ignored; use `--active` to target the active environment instead
2025-05-24 07:39:49,895.895 INFO [MainThread] [utils.py:149] - Note: NumExpr detected 22 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 16.
2025-05-24 07:39:49,895.895 INFO [MainThread] [utils.py:162] - NumExpr defaulting to 16 threads.
E:\dify\api\controllers\web\remote_files.py:7: UserWarning: To use python-magic guess MIMETYPE, you need to run `pip install python-magic-bin`from controllers.common import helpers* Debug mode: on
2025-05-24 07:39:56,383.383 INFO [MainThread] [_internal.py:97] - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:5001* Running on http://192.168.31.176:5001
2025-05-24 07:39:56,383.383 INFO [MainThread] [_internal.py:97] - Press CTRL+C to quit
2025-05-24 07:39:56,392.392 INFO [MainThread] [_internal.py:97] -  * Restarting with stat
2025-05-24 07:39:58,569.569 INFO [MainThread] [utils.py:149] - Note: NumExpr detected 22 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 16.
2025-05-24 07:39:58,569.569 INFO [MainThread] [utils.py:162] - NumExpr defaulting to 16 threads.
E:\dify\api\controllers\web\remote_files.py:7: UserWarning: To use python-magic guess MIMETYPE, you need to run `pip install python-magic-bin`from controllers.common import helpers
2025-05-24 07:40:00,606.606 WARNING [MainThread] [_internal.py:97] -  * Debugger is active!
2025-05-24 07:40:00,629.629 INFO [MainThread] [_internal.py:97] -  * Debugger PIN: 797-179-235

【3 运行前端】

(0)环境要求

Before starting the web frontend service, please make sure the following environment is ready.

  • Node.js >= v22.11.x
  • pnpm v10.x
(1)安装前端依赖库

First, install the dependencies:

pnpm install
(2)创建一个配置文件

Then, configure the environment variables. Create a file named .env.local in the current directory and copy the contents from .env.example. Modify the values of these environment variables according to your requirements:

cp .env.example .env.local

配置文件中一些比较关键的配置项

# For production release, change this to PRODUCTION
NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
# The deployment edition, SELF_HOSTED
NEXT_PUBLIC_EDITION=SELF_HOSTED
# The base URL of console application, refers to the Console base URL of WEB service if console domain is
# different from api or web app domain.
# example: http://cloud.dify.ai/console/api
NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
NEXT_PUBLIC_WEB_PREFIX=http://localhost:3000
# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from
# console or api domain.
# example: http://udify.app/api
NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api
NEXT_PUBLIC_PUBLIC_WEB_PREFIX=http://localhost:3000# SENTRY
NEXT_PUBLIC_SENTRY_DSN=
(3)跑起来

Finally, run the development server:

pnpm run dev
(4)看效果

Open http://localhost:3000 with your browser to see the result.

You can start editing the file under folder app. The page auto-updates as you edit the file.
在这里插入图片描述
很明显的,有一个开发环境的标志。

2.1 后端

2.2 前端

相关文章:

Dify源码学习

文章目录 1 大模型基本原理1.1 model_context_tokens、max_tokens和prompt_tokens1.1.1 三者之间的关系1.1.2 总结对比 2 Dify源代码2.0 前后端代码跑起来【0】准备开发环境【1】下载代码【2】运行后端&#xff08;1&#xff09;Start the docker-compose stack&#xff08;2&a…...

静态网站部署:如何通过GitHub免费部署一个静态网站

GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤&#xff0c;本篇文章中将一步步解如何通过GitHub免费部署一个静态网站&#xff0c;帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...

【拯救小狗】2022-1-3

缘由c学校练习试题&#xff0c;求解决-编程语言-CSDN问答 void 拯救小狗() {//缘由https://ask.csdn.net/questions/7622294?spm1005.2025.3001.5141int d 0, g 0, tfh[100][3]{}, x 0, c 10, dd d;std::cin >> d >> g; dd d;while (x < g && d…...

PS2025 v26.7 Photoshop2025+AI生图扩充版,支持AI画图

软件下载 【名称】&#xff1a;PS2025 v26.7 Photoshop2025AI生图扩充版 【大小】&#xff1a;4.9G 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win10/Win11 【网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; https://pan.quark.cn/s/51f5…...

怎么开发一个网络协议模块(C语言框架)之(三) 全局实例

1. gVrrpInstance 是什么? 这是 VRRP 全局控制结构体,命名为 vrrpGlbInstance_t,定义了整个协议运行时的 内核资源、全局状态、各类对象池、AVL 树、计时器、套接字等。 它本质上是一个单例(singleton),用于全局访问 VRRP 实例、资源、统计、socket 等。 vrrpGlbInsta…...

ShenNiusModularity项目源码学习(30:ShenNius.Admin.Mvc项目分析-15)

广告管理页面用于新建、维护及删除系统CMS管理模块的广告信息&#xff0c;其后台控制器类AdvListController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内&#xff0c;页面文件位于同项目的Areas\Cms\Views\AdvList内&#xff0c;其中Index.cshtml页面为主页面&#xf…...

香港维尔利健康科技集团全面推进AI医疗落地,构建智慧健康管理新模式

在人工智能重塑全球医疗格局的新浪潮中&#xff0c;香港维尔利健康科技集团再次抢占技术高地&#xff0c;宣布正式启动“AI医疗健康场景融合工程”&#xff0c;将人工智能深度嵌入健康管理的全链条服务之中。该计划不仅涵盖设备智能化、诊疗辅助算法、用户健康行为建模等核心环…...

在 .NET 环境下实现跨进程高频率读写数据

目录 ✅ 技术选型说明 &#x1f4e6; 示例场景 &#x1f9e9; 数据结构定义 &#x1f6a6; 核心同步机制 &#x1f9d1;‍&#x1f4bb; 消费者实现 ⚡ 性能优化技巧 &#x1f6e0; 部署注意事项 &#x1f4c8; 性能基准&#xff08;理论值&#xff09; 在 .NET 环境下…...

Arduino和STM32的区别详解

在嵌入式开发领域&#xff0c;Arduino和STM32是两类非常常见的微控制器平台。它们各有优缺点&#xff0c;适用于不同的开发需求。本文将从硬件架构、开发环境、易用性、性能、应用场景等方面对比两者的区别。 ## 一、硬件架构 ### Arduino - **核心芯片**&#xff1a;大多数Ar…...

选择合适的Azure数据库监控工具

Azure云为组织提供了众多服务&#xff0c;使其能够无缝运行应用程序、Web服务和服务器部署&#xff0c;其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成&#xff0c;具备可靠、易扩展和易管理的特性&#xff0c;不仅能提升数据库可用性与性能&#xff0c;同时…...

bi软件是什么?bi软件是做什么用的?

目录 一、BI 软件是什么 1. 基本概念 2. 工作原理 二、BI 软件是做什么用的&#xff1f; 1. 精准洞察市场趋势 2. 优化企业战略规划 3. 辅助投资决策 三、如何选择合适的 BI 软件 1.功能匹配度 2.易用性和可扩展性 3.数据安全和稳定性 4.技术支持和服务 总结 生产…...

DeepSeek 赋能智能电网:从技术革新到全场景应用实践

目录 一、智能电网的发展现状与挑战二、DeepSeek 技术解析2.1 DeepSeek 技术原理2.2 DeepSeek 技术优势 三、DeepSeek 在智能电网中的具体应用3.1 设备管理智能化3.2 电网运行优化3.3 客户服务提升3.4 规划建设智能化3.5 经营管理高效化3.6 办公辅助便捷化 四、DeepSeek 在智能…...

xdvipdfmx:fatal: File ended prematurely. No output PDF file written.

今天忽然遇到&#xff1a;使用xelatex或lualatex编译&#xff0c;一直卡住&#xff0c;不报错&#xff0c;也无法生成PDF&#xff0c;主动停止编译后就报错 xdvipdfmx:fatal: File ended prematurely. No output PDF file written. 然后&#xff0c;之前能正常编译的一些文件…...

python进行while遍历的常见错误解析

Python中使用while循环进行遍历时&#xff0c;常见的错误类型及解析如下&#xff1a; 一、循环条件错误 错误示例&#xff1a; i 0 lst [1,2,3] while i < len(lst): # 实际索引范围应为[0,2]print(lst[i])i 1错误分析&#xff1a; 当 i 3 i3 i3时&#xff0c;条件 …...

锐化算子构建方法(机翻)

为了充分利用 GIP&#xff08;通用图像处理单元&#xff09;的并行处理能力&#xff0c;像素组的规模保持较小。每组像素数量的最小化可最大化可并行实现的独立内核数量。理想情况下&#xff0c;若处理单元可获取给定邻域的每个像素值&#xff0c;则内核可完全通用&#xff08;…...

GO语言学习(七)

GO语言学习&#xff08;七&#xff09; 上一期我们简单地带大家手把手实践一下利用GO来构建服务器&#xff0c;大家是不是很不接里面为啥是这样操作的&#xff0c;所以这一期我们就来带领大家一起学习这些是如何实现web的工作&#xff0c;了解其底层实现方式&#xff0c;任何语…...

算法中的数学:费马小定理

1.同余式 定义&#xff1a;如果两个整数a,b模p的余数相同&#xff0c;那么a,b就是模p的同余式 记作&#xff1a; 性质&#xff1a; 1.同加性&#xff1a;若a和b同时加一个整数&#xff0c;那么他们加完之后的两个数模p仍为同余式 2.同乘性&#xff1a;若a和b同时乘一个整数&…...

【TypeScript】知识点梳理(四)

#没事去翻翻官网文档&#xff0c;其实有很多用法是我们还不知道的&#xff0c;官方资料总是最权威的&#xff0c;也推荐大家无聊看看各个官网hhh&#xff0c;不一定是记忆&#xff0c;但在某种场景下我们或许能想到还有多一种解决方式# noImplicitAny 当我们没有表明类型时&…...

【Python 算法零基础 4.排序 ③ 插入排序】

目录 一、引言 二、算法思想 三、算法分析 1.时间复杂度 2.空间复杂度 3.算法的优点和缺点 ① 算法的优点 ② 算法的缺点 四、实战练习 1491. 去掉最低工资和最高工资后的工资平均值 思路与算法 ① 插入排序算法 (insertSort 方法) Ⅰ、初始化 Ⅱ、遍历未排序元素 Ⅲ、元素后移…...

LangGraph实现多智能体的方法

生活中我们常常需要同时处理多个任务&#xff0c;比如预订旅行时&#xff0c;既要订机票&#xff0c;又要订酒店。如果有一个智能助手能同时帮你搞定这些事情&#xff0c;那该有多方便啊&#xff01;LangGraph的多智能体系统就能做到这一点。它就像一个超级助手团队&#xff0c…...

wordpress主题开发中常用的12个模板文件

在WordPress主题开发中&#xff0c;有多种常用的模板文件&#xff0c;它们负责控制网站不同部分的显示内容和布局&#xff0c;以下是一些常见的模板文件&#xff1a; 1.index.php 这是WordPress主题的核心模板文件。当没有其他更具体的模板文件匹配当前页面时&#xff0c;Wor…...

聚铭安全管家平台2.0重磅发布——大模型智驱高效降本新方向

【聚铭安全管家平台2.0正式发布】在数字化安全威胁日益严峻的背景下&#xff0c;聚铭网络创新推出安全管家平台2.0&#xff0c;首创"云端智能区域中台本地终端"三级协同架构&#xff0c;深度融合AI安全大模型技术&#xff0c;实现威胁智能研判与自动化响应。该平台通…...

Android singleTop启动模式开启新页面

在Android开发中,Activity的启动模式(Launch Mode)对应用的行为和用户体验影响非常大。其中,singleTop是一种常见的启动模式,但它常常让开发者困惑:当一个Activity设置为singleTop时,如何才能重新打开一个新的页面(实例)? 本文将详细解析singleTop启动模式的机制,为…...

使用注解动态映射:根据实体List列表动态生成Excel文件

我们一般通过POI来生成对应的Excel文件&#xff0c;绝大多数情况是需要手动编写单元格内容&#xff0c;然后顺序填充值&#xff0c;今天我们将动态根据实体来生成Excel表头&#xff0c;同时自动填充内容。 文章目录 1. 定义注解2. 实体类应用注解3. 动态导出工具类 1. 定义注解…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

【循环位运算——uint32,DP】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using uint unsigned;const int N 1010;ll f[N][N]; uint a[N]; int n, m;int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)cin …...

贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和

贪心介绍 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 eg: 有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的钱。每次拿最大的就…...

算法学习笔记·数学·快速幂

题目:(AcWing) 给定 n 组 ai,bi,pi&#xff0c;对于每组数据&#xff0c;求出 aibimodpi 的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含三个整数 ai,bi,pi。 输出格式 对于每组数据&#xff0c;输出一个结果&#xff0c;表示 abiimodpi 的值。 每…...

Postgresql 数据库体系架构

1 postgresql 软件目录 rootu24-pg-110:~# tree -L 1 /usr/local/postgresql-17/ /usr/local/postgresql-17/ ├── bin #可执行二进制文件 ├── include ├── lib └── share 2 数据库目录及文件 #目录结构 base --每个数据库的子目录 global --数据库集簇范…...

[创业之路-377]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之社会发展趋势:数字化、智能化、个性化的趋势对初创公司的战略机会

数字化、智能化、个性化趋势为初创公司带来了捕捉长尾需求、提升运营效率、创新商业模式等战略机会&#xff0c;具体分析如下&#xff1a; 一、数字化趋势带来的战略机会 捕捉长尾需求&#xff1a;数字化技术能够帮助初创公司更好地捕捉市场中的长尾需求&#xff0c;满足那些…...