搭建Flutter Web开发调试环境

news2024/11/30 18:54:54

Setting up the Framework/Engine development environment

    • 背景
    • 搭建 framework 开发环境
      • 修改调试 framework 源码
      • 运行 framework 测试用例
      • 同步更新 framework 源码
    • 搭建 engine 开发环境
      • 准备 depot_tools
      • 部署 engine 源码
      • 编译 engine 源码
      • 修改调试 engine 源码
        • 指定 --local-engine
        • 修改源码调试示例
      • 运行 engine 测试用例
      • 同步更新 engine 源码
    • 协同联调 Framework 和 Engine

背景

关于参与 Flutter 项目的共建,从 framework 到 engine,本文提供了环境搭建到调试的主要流程说明,可以快速帮助你搭建起来。

由于侧重讲述 Flutter web 平台的建设,可以通过本文提供的官方文档链接获得其它平台更多指引。

搭建 framework 开发环境

参考官方文档:Setting up the Framework development environment。

需要具备这些条件搭建 framework 开发环境:

  • Linux,macOS 或 Windows。

  • git(代码版本管理)。

  • IDE:Android Studio、vscode 等主流IDE可安装插件支持 flutter/Dart 代码高亮。

  • Python( 一些工具需要使用)。

  • ssh 客户端(GitHub 身份验证)。


请先 参考 Connecting to GitHub with SSH,配置 Github 认证需要的 SSH Key

  1. 检查是否已经有 SSH 密钥:Reviewing your SSH keys
  2. 生成新的 SSH 密钥对(id_rsa,id_rsa.pub):Generating a new SSH key and adding it to the ssh-agent
  3. 将 SSH 公钥(id_rsa.pub)上传到 github:Adding a new SSH key to your GitHub account - Settings - SSH and GPG keys
  4. git clone 使用 SSH 地址替代 HTTPS 链接:Switching remote URLs from HTTPS to SSH

按照以下步骤搭建 Framework 开发环境:

  1. Fork https://github.com/flutter/flutter 到自己的 GitHub 账号。如果已经 frok 过了,可先更新 Sync Fork。

  2. git clone git@github.com:<github_username>/flutter.git (替换 <github_username> 为你的 GitHub 账户名)。如果是参与外部开源项目,可考虑执行 git config 命令配置个人开发者用户名和邮箱:

    • git config user.name <github_username>
    • git config user.email <github_useremail>
  3. cd flutter

  4. git remote add upstream git@github.com:flutter/flutter.git:添加跟踪官方上游源仓(fetch-merge同步)。

  5. 配置仓库的 flutter/bin 目录到环境变量,这样后续将使用本地编译出来的 SDK/Framework 工具链。

$ export PATH=/path/to/flutter/bin:$PATH
  • 执行 vim ~/.zhsrc 编辑 zsh 配置文件,将flutter仓库编译产物目录bin前插到环境变量 PATH(override fvm):
    • 为了后续脚本引用方便,可以将一些常用目录定义成环境变量。
# ~/.zhsrc

# fvm home
export FVM_HOME="$HOME/.fvm"
export PATH=$HOME/.fvm/default/bin:$PATH

# flutter project
export FLUTTER_PROJECT_DIR=$HOME/Projects/github/flutter
# framework(sdk)
export FLUTTER_SDK_PROJECT_DIR=$FLUTTER_PROJECT_DIR/flutter
# override fvm
export PATH=$FLUTTER_SDK_PROJECT_DIR/bin:$PATH
## packages/flutter
export FLUTTER_SDK_PACKAGES=$FLUTTER_SDK_PROJECT_DIR/packages
export FLUTTER_SDK_SRCROOT=$FLUTTER_SDK_PACKAGES/flutter
  1. flutter update-packages (拉取 Flutter 依赖的 Dart 包)。
  2. 执行 which flutterflutter --version 验证,flutter 工具链版本是否符合预期。

修改调试 framework 源码

用 IDE 打开 packages/flutter 目录(FLUTTER_SDK_SRCROOT)可以修改 framework 源码。


用 IDE 打开示例项目,确保已经安装了 Flutter/Dart 相关语言支持插件。
指定 Flutter SDK 目录(即上面第 3 步 clone 到本地的 SDK/Framework 目录),具体步骤如下:

  1. vscode 打开偏好设置(JSON),配置 “dart.flutterSdkPath”,指定 Flutter SDK 目录:

The location of the Flutter SDK to use. If blank, Dart Code will attempt to find it from the project directory, FLUTTER_ROOT environment variable and the PATH environment variable.

    "dart.flutterSdkPath": "/Users/fantasy/Projects/github/flutter/flutter", // FLUTTER_SDK_PROJECT_DIR
    // "dart.flutterSdkPaths": [
    //     "/Users/fantasy/.fvm/versions"
    // ],
  1. Android Studio 打开偏好设置,Languages & Frameworks | Flutter | Flutter SDK path: 指定 Flutter SDK 目录为 /Users/fantasy/Projects/github/flutter/flutter(FLUTTER_SDK_PROJECT_DIR)。

接下来,看看如何 修改和调试 SDK/Framework 源码

在 flutter web app 项目工程目录执行 flutter pub get,IDE 点击符号 MaterialApp 可跳转打开源码所在文件 flutter/packages/flutter/lib/src/material/app.dart。

也可使用 vscode 或 Android Studio 等 IDE,打开 FLUTTER_SDK_SRCROOT(flutter/packages/flutter)文件夹进行编辑修改。

修改打开的 packages/flutter/lib/src/material/app.dart 文件,添加调试日志:

class _MaterialAppState extends State<MaterialApp> {
  late HeroController _heroController;

  bool get _usesRouter => widget.routerDelegate != null;

  @override
  void initState() {
    super.initState();
    if (kDebugMode) {
      print('_MaterialAppState initState');
    }
    _heroController = MaterialApp.createMaterialHeroController();
  }

flutter web app 调试运行起来,查看 console 日志以验证 framework 代码修改效果,正常会有以下输出:
在这里插入图片描述
修改 SDK/Framework 源码,web app 项目支持热加载,可实时调试查看修改后的效果。

web app 打开 chrome 运行起来后,可使用浏览器调试工具(例如 Chrome DevTools )打开查看和调试 Framework 源码。

在 Chrome DevTools 的 Sources 标签面板下,可查找定位到对应文件 packages/flutter/src/material/app.dart,可以确认修改效果和断点调试。

http://localhost:8080/packages/flutter/src/material/app.dart

在这里插入图片描述

运行 framework 测试用例

flutter test 可以运行 framework 测试用例。

# 在 Chrome 上运行所有测试用例
flutter test -v --platform=chrome
# 在 Chrome 上运行测试用例,并指定渲染方式为移动端的 html 方式
flutter test -v --platform=chrome --web-renderer=html
# 在 Chrome 上运行指定测试用例,并指定渲染方式为移动端的 html 方式
flutter test -v --platform=chrome --web-renderer=html test/material/text_field_focus_test.dart

同步更新 framework 源码

在 Flutter SDK 目录下 master 分支,git pull 即可更新最新仓库代码。

如果需要同步上游官方源头仓库,可以参考 Configuring a remote for a fork & Syncing a fork。

  • 也可 cd $FLUTTER_SDK_PROJECT_DIR,执行 git checkout 命令切换源码到指定版本进行开发调试或验证。

搭建 engine 开发环境

参考官方文档:

  1. Setting up the Engine development environment
  2. Compiling the engine - Compiling for the Web
  3. Contributing to the Flutter engine

需要具备这些条件搭建 engine 开发环境:

  • git(代码版本管理)。

  • IDE:Android Studio、vscode 等主流IDE可安装插件支持 flutter/Dart 代码高亮。

  • Python( gclient 等工具依赖)。

  • ssh 客户端(GitHub 身份验证),请先 配置 Github 认证需要的 SSH Key。

  • chromium depot_tools 是基于 Python(封装 git 等工具)实现的用于代码迁出管理的工具,包含 gclientgnninja 等工具。

    • ninja 是 Google 推出的注重速度的构建工具,将编译任务并行组织,大大提高构建速度。
    • 在 macOS 和 Linux 中,gclient sync 命令依赖 curl 和 unzip (macOS 已自带)。
  • felt:flutter engine 内置的编译 web engine 的工具,支持 Linux、macOS 和 Windows。对于其它平台,下表展示了 Linux,macOS 或 Windows 跨平台产物编译支持情况。

    AndroidiOSFuchsia
    Linuxoxo
    Windowsxxx
    macOSooo
  • Windows 平台需要:

    • Visual Studio 2017 或更高版本。
    • Windows 10 SDK。
      • 确保安装了 Debugging Tools for Windows。
  • macOS 平台需要最新版本的 Xcode。

准备 depot_tools

Linux / Mac

Clone depot_tools 仓库到本地 /path/to/depot_tools(例如 $HOME/Library/Developer/chromium/tools/depot_tools):

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

将 git clone 下来的 depot_tools 本地仓库目录添加到环境变量 PATH,以使命令行可以找到相关工具链。

# ~/.bashrc 或 ~/.zshrc
$ export PATH=/path/to/depot_tools:$PATH

Windows

参考 depot_tools_tutorial 介绍。


确认 depot_tools 是否安装成功:

  • 执行 gclient --versiongclient help 可以查看 gclient 版本及帮助。
  • 执行 ninja --version 查看 ninja 版本;执行 ninja -h 查看 ninja 帮助。
$ gclient --version
Updating depot_tools...
gclient.py 0.7

$ ninja --version
1.8.2

部署 engine 源码

不需要提前安装 Dart,也不需要手动 clone engine 到本地,gclient 会将 engine 相关工具链和依赖库拉取到本地。

按照下面的步骤部署:

  1. Fork https://github.com/flutter/engine 到自己的 GitHub 账号。如果已经 frok 过了,可先更新 Sync Fork。
  2. 本地创建一个约定俗成的空目录 engine ,用来保存 engine 项目相关工具链和依赖库。
  3. cd engine,创建 .gclient 配置文件,填入以下内容,替换 <your_name_here> 为你的 GitHub 账户名。
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:<your_name_here>/engine.git",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]
  1. 在 engine 目录下执行 gclient sync,将自动创建 engine/src 目录。

    • 其中 src/flutter 才是真正的 flutter engine 代码所在地。
    • 此外,src 目录下包括第三方依赖库 third_party、工具链(build、tools)以及 fuchsia sdk 等。
  2. 添加跟踪官方 flutter engine 上游源仓:

$ cd src/flutter
$ git remote add upstream git@github.com:flutter/engine.git
$ cd -
  1. 如果是参与外部开源项目,可考虑执行 git config 命令配置个人开发者用户名和邮箱:

    • git config user.name <github_username>
    • git config user.email <github_useremail>

编译 engine 源码

src/flutter 才是真正的 flutter engine 代码所在地,其中包括 sky、runtime、flutter_frontend_server、common(/graphics)、vulkan、shell(platform,vmservice) 等。lib 目录下包括 SDK/Framework 端 ui 和 web_ui 的实现代码:

src/flutter/lib/web_ui 为 Flutter Web Engine 代码目录。

$ tree -L 1 lib
lib
├── io
├── snapshot
├── spirv
├── ui
└── web_ui

编译 web engine 源码需要使用 felt(Flutter Engine Local Tester) 这个命令行工具,目标是让开发 Flutter web engine 更高效。

felt 内置于 flutter engine 仓库中的 lib/web_ui/dev 中,将 FLUTTER_ENGINE_SRCWEBUI/dev 配置到环境变量,以使命令行可以找到相关工具链:

可执行 felt help(或 felt help build)验证 felt 命令是否安装成功。

# flutter project
export FLUTTER_PROJECT_DIR=$HOME/Projects/github/flutter
# engine
export FLUTTER_ENGINE_PROJECT_DIR=$FLUTTER_PROJECT_DIR/engine
export FLUTTER_ENGINE_PROJECT_SRCROOT=$FLUTTER_ENGINE_PROJECT_DIR/src
export FLUTTER_ENGINE_SRCROOT=$FLUTTER_ENGINE_PROJECT_SRCROOT/flutter
## lib/web_ui
export FLUTTER_ENGINE_SRCWEBUI=$FLUTTER_ENGINE_SRCROOT/lib/web_ui
export PATH=$FLUTTER_ENGINE_SRCWEBUI/dev:$PATH

在存放 .gclient 配置的 engine 目录(FLUTTER_ENGINE_PROJECT_DIR),执行 felt build 命令编译 flutter web 引擎,把 dart 转换成 js。

如果在其他目录执行 felt build,可能会报错 Error: client not configured; see 'gclient config'
默认的产物输出目录为 src/out/host_debug_unopt。

# 编译引擎
$ felt build
……
Done. Made 905 targets from 280 files in 1152ms
Running autoninja...
ninja: Entering directory `/Users/fantasy/Projects/github/flutter/engine/src/out/host_debug_unopt'
ninja: no work to do.

每次修改 web engine 后,在 FLUTTER_ENGINE_PROJECT_DIR 目录执行 felt build 即可重编引擎。


felt build 可能会遇到以下报错:

$ felt build
Running on MacOS. Will check the file and user limits.
File limits too low increasing the file limits
Can't load Kernel binary: Invalid kernel binary format version.

一般是因为flutter内核修改后无法识别,参考 Unable to build web flutter engine locally #70372,执行以下命令清除 felt.snapshot 可解决。

# rm $FLUTTER_SDK_ROOT/bin/cache/flutter_tools.stamp
rm $FLUTTER_ENGINE_SRCWEBUI/.dart_tool/felt.snapshot*

修改调试 engine 源码

请确保指定了 Engine 对应的 Flutter SDK/Framework 目录,具体参见 指定 Flutter SDK 目录。

用 IDE 打开 engine/src/flutter/lib/web_ui 目录(FLUTTER_ENGINE_SRCWEBUI),修改 web engine 源码后,执行 flet build 编译 engine。
那么,本地 flutter web app 运行时,如何指定使用本地修改编译的 flutter web engine 进行联调呢

指定 --local-engine

Compiling the engine - Compiling for the Web:

To test Flutter with a local build of the Web engine, add --local-engine=host_debug_unopt to your flutter command.

Contributing to the Flutter engine:

Most developers will use the flutter tool in the main Flutter repository for interacting with their built flutter/engine. To do so, the flutter tool accepts two global parameters local-engine-src-path and local-engine, a typical invocation would be: --local-engine-src-path /path/to/engine/src --local-engine=android_debug_unopt.

根据以上文档,flutter 全局命令选项 --local-engine=host_debug_unopt,支持指定本地引擎(如果已经指定本地引擎目录到环境变量)。

针对 web 指定为 host_debug_unopt,具体参考 felt build 日志中的 ninja: Entering directory
--local-engine 针对终端开发时,其值可能为 ios_debug_unopt、android_debug_unopt。

通过以下方法运行 flutter web app 项目,就可以看到 flutter web engine 源码修改的效果。

$ cd /path/to/web/app
# 指定本地引擎,编译(链接)运行调试 Flutter Web 应用
$ flutter --local-engine=host_debug_unopt run -d chrome

如果未指定本地引擎目录到环境变量,则需要通过 --local-engine-src-path 选项指定(推荐)。

# 指定本地引擎,编译(链接)运行调试 Flutter Web 应用
$ flutter --local-engine=host_debug_unopt --local-engine-src-path=$FLUTTER_ENGINE_PROJECT_SRCROOT run -d chrome

可以在 flutter web app 的 vscode 启动配置 .vscode/launch.json 中的 toolArgs 添加 --local-engine 和 --local-engine-src-path 这两个选项参数:
在这里插入图片描述
也可在 Android Studio Run/Debug Configurations 的 Additional run args 开头指定 --local-engine 和 --local-engine-src-path 这两个选项参数:
在这里插入图片描述

修改源码调试示例

接下来以 PR 31718 修改的 engine/src/flutter/lib/web_ui/lib/src/engine/text_editing/text_editing.dart 为例,我们在 IOSTextEditingStrategy.addEventHandlers 监听的 onBlur 事件中加一句日志。

// text_editing.dart
class IOSTextEditingStrategy extends GloballyPositionedTextEditingStrategy {
  IOSTextEditingStrategy(HybridTextEditing owner) : super(owner);

  @override
  void addEventHandlers() {

    subscriptions.add(activeDomElement.onBlur.listen((_) {
      if (windowHasFocus) {
        print('IOSTextEditingStrategy addEventHandlers onBlur event');
        activeDomElement.focus();
      } else {
        owner.sendTextConnectionClosedToFrameworkIfAny();
      }
    }));
  }

}
  1. flutter web app(coding-app)项目下执行 ./scripts/proxy/launch_shelf.sh -P 启动 shelf_proxy 代理,日志输出 ✅ proxy listening on http://10.20.89.64:8010。
  2. 执行以下命令,通过指定全局选项 --local-engine 和 --local-engine-src-path 指定本地 web engine 产物和源码目录,run -d web-server 启动 web 服务监听 8080 端口。
# 客户端模式,直接拉起 chrome 运行调试
# flutter --local-engine=host_debug_unopt --local-engine-src-path=$FLUTTER_ENGINE_PROJECT_SRCROOT run -d chrome --web-renderer=html --web-port=8080 --dart-define=API_BASE_URL=10.20.89.64:8010 --dart-define=AUTH_TOKEN=$DEBUG_AUTH_TOKEN

# server模式,可供局域网通过 LAN IP 访问
$ flutter --local-engine=host_debug_unopt --local-engine-src-path=$FLUTTER_ENGINE_PROJECT_SRCROOT run -d web-server --web-renderer=html --web-port=8080 --web-hostname=0.0.0.0 --dart-define=API_BASE_URL=10.20.89.64:8010 --dart-define=AUTH_TOKEN=$DEBUG_AUTH_TOKEN

lib/main.dart is being served at http://0.0.0.0:8080
  1. 执行 open -a Simulator 命令打开 iOS 模拟器,在safari浏览器地址栏输入 http://0.0.0.0:8080 访问 coding-app 页面。
  2. 打开 macOS Safari,Develop 菜单点击 Simulator - 0.0.0.0,将打开 Web Inspector。

在这里插入图片描述

  1. 在 Web Inspector 的 Sources 标签面板下,在 dart_sdk.js/lib/_engine/engine 下定位到 text_editing 目录,点击打开 text_editing.dart,查找到修改的地方,点击行号Gutter添加断点。点击搜索栏,调起键盘输入,聚焦或点击键盘 Done 按钮,应该会命中断点:

在这里插入图片描述

  1. 同时切换到 Web Inspector 的 Console 标签面板,应该可以看到 onBlur 日志输出。

在这里插入图片描述


macOS 桌面端 Chrome 访问 http://10.20.89.64:8080,可打开调试工具 DevTools 查看和调试 Engine 源码。在 DevTools 的 Sources 标签面板下,在 lib/_engine/engine 下定位到 text_editing 目录,点击打开 text_editing.dart,可以确认修改是否生效和进行断点调试。
由于修改的示例代码 IOSTextEditingStrategy 仅针对 iOS 设备,可以给 DefaultTextEditingStrategy.setEditingState 加个断点调试验证。点击搜索栏,聚焦输入框,就会命中断点:

在这里插入图片描述

运行 engine 测试用例

felt test 可以运行 web engine 测试用例,默认情况下使用 Chromium 作为平台。

# 运行所有 Chromium 测试用例
felt test
# 运行特定的测试用例
felt test test/engine/util_test.dart
# 在 iOS Safari 上运行测试用例
felt test --browser=ios-safari

更多命令运行 felt help [SUBCOMMAND] 查询。

同步更新 engine 源码

更新远程的官方 engine 仓库,只需要在本地 engine 目录(FLUTTER_ENGINE_PROJECT_DIR)执行 gclient sync 即可。

协同联调 Framework 和 Engine

如果要同时调试 Engine 和 SDK/Framework(FLUTTER_SDK_ROOT),需要先导出工具链到环境变量,并在 IDE 指定好配套的 Flutter SDK 目录(flutterSdkPath)。

最新 fvm global stable 为最新的 2.10.5,执行 flutter --version 可以查看 SDK/Framework 和 Engine 的搭配版本:

$ flutter --version
Flutter 2.10.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 5464c5bac7 (4 days ago) • 2022-04-18 09:55:37 -0700
Engine • revision 57d3bac3dd
Tools • Dart 2.16.2 • DevTools 2.9.2

如果在 SDK/Framework 仓库执行 git checkout 切换到了 2.10.5,也可将 Flutter Engine 切换到对应版本 57d3bac3dd。
这样搭配进行开发调试或验证,避免出现一些由于 SDK 和 Engine 版本不协同,造成的接口和工具链兼容性问题。

# engine/src/flutter
$ cd $FLUTTER_ENGINE_SRCROOT
$ git checkout 57d3bac3dd

注意

切换 Flutter Engine 仓库版本后,需要在 FLUTTER_ENGINE_PROJECT_DIR 目录重新执行 gclient sync 命令同步工具链。
否则,可能会报以下错误:

Running gn...
GOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA.
Using prebuilt Dart SDK binary. If you are editing Dart sources and wish to compile the Dart SDK, set `--no-prebuilt-dart-sdk`.
Generating GN files in: out/host_debug_unopt
ERROR at //BUILD.gn:28:7: Can't load input file.
      "//flutter/build/archives:artifacts"
      ^-----------------------------------
Unable to load:
  /Users/fantasy/Projects/github/flutter/engine/src/flutter/build/archives/BUILD.gn
I also checked in the secondary tree for:
  /Users/fantasy/Projects/github/flutter/engine/src/build/secondary/flutter/build/archives/BUILD.gn
description: Sub-process failed.executable: /Users/fantasy/Projects/github/flutter/engine/src/flutter/tools/gn arguments: [--unopt, --xcode-symlinks, --full-dart-sdk] exit code: 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​极氪汽车被曝拟美股上市:最高募资10亿 李书福接连收获IPO

雷递网 雷建平 12月13日极氪汽车日前被曝出已“秘密递交申请”&#xff0c;准备在美股上市&#xff0c;此次拟募资10亿美元&#xff0c;估值可能高达100亿美元。有分析认为&#xff0c;极氪汽车秘密递交招股书&#xff0c;是为尽可能向其他竞争对手隐藏招股书细节&#xff0c;以…

十二、对象继承深入、call_apply、※圣杯模式、※构造函数和闭包、※企业模块化

十二、对象继承深入、call_apply、※圣杯模式、※构造函数和闭包、※企业模块化 对象继承深入 原型链继承 原型链定义 ​ 对象沿着__proto__在原型上寻找属性形成一种链条式的继承关系&#xff0c;这种继承关系就叫做原型链。 例如&#xff1a; Professor.prototype {na…

Linux(二)vim编辑器,gcc,库

vim 简介 vi是“visual interface”的简称。 类似于Windows下的记事本。 vim可以视为vi的高级版本 按下vimtutor进入帮助文档&#xff0c;以下内容在其中都有 vim的三种模式 Vi有三种基本工作模式&#xff1a;命令模式、文本输入模式、末行模式 基本操作 命令模式下的操作…

迷宫--dfs解法以及迷宫问题要不要回溯

文章目录题意题解思路&#xff1a;问题&#xff1a; 迷宫问题dfs要不要回溯&#xff1f;题意 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗n 的格点组成&#xff0c;每个格点只有2种状态&#xff0c;.和#&#xff0c;前者表示可以通行…

装载问题 ——分支限界法(Java)

装载问题 ——分支限界法&#xff08;Java&#xff09; 文章目录装载问题 ——分支限界法&#xff08;Java&#xff09;1、 问题描述2、算法设计3、算法的改进4、程序代码5、参考资料1、 问题描述 有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船&#xff0c;其中集 装箱…

数图互通高校房产管理——教职工住宅方案

数图互通房产管理系统在这方面做得比较全面&#xff1b; 1、住房管理 1.1 住房档案 住房模块的管理主要是针对学校的承租住宅和已售住宅的管理&#xff0c;用于登记已售住宅的产权人信息&#xff0c;记录承租住宅的租赁起止日期、月租金等基本信息。 支持住房的坐落信息、楼栋…

Cas:146368-11-8(水溶)|Sulfo CY5-羧酸|Cyanine5 Carboxylic Acidic acid

Cas:146368-11-8(水溶)|Sulfo CY5-羧酸|Cyanine5 Carboxylic Acidic acid Sulfo CY5-羧酸这种分子可以被认为是非活性染料&#xff0c;用于控制样品和仪器校准。为了与胺和蛋白质标记偶联&#xff0c; 中文名&#xff1a;Sulfo CY5-羧酸 英文名&#xff1a;Cyanine5 Carboxy…

rate-limit 一款 java 开源渐进式分布式限流框架使用介绍

项目简介 rate-limit 是一个为 java 设计的渐进式限流工具。 目的是为了深入学习和使用限流&#xff0c;后续将会持续迭代。 特性 渐进式实现 支持独立于 spring 使用 支持整合 spring 支持整合 spring-boot 内置多种限流策略 快速开始 需求 jdk 1.7 maven 3.x mav…

ARM S5PV210 时钟系统与时钟体系框图

前言 This chapter describes the clock management unit (CMU) supported by S5PV210. The system controller (SYSCON) manages CMU and power management unit (PMU) in S5PV210. 本章介绍 S5PV210 支持的时钟管理单元&#xff08;CMU&#xff09;。系统控制器&#xff08…

【软考】系统集成项目管理工程师(十一)项目人力资源管理

一、项目人力资源管理概述二、激励理论1. 马斯洛需求层次理论2. 赫茨伯格的双因素理论3. X 理论/ Y 理论4. 期望理论三、人力资源管理子过程1. 规划人力资源管理2. 组建项目团队3. 建设项目团队4. 管理项目团队一、项目人力资源管理概述 在了解人力资源管理之前,我们先来认识…

从局部到全局:语义相似度的测地线距离

©PaperWeekly 原创 作者 | 苏剑林单位 | 追一科技研究方向 | NLP、神经网络前段时间在最近的一篇论文《Unsupervised Opinion Summarization Using Approximate Geodesics》[1] 中学到了一个新的概念&#xff0c;叫做“测地线距离&#xff08;Geodesic Distance&#xff…

.net开发安卓入门 - Service (服务)

.net开发安卓入门 - Service Android Service 概述Service VS Thread &#xff08;服务和线程之间进行选择&#xff09;前台服务代码启动前台服务方法运行效果后台服务代码启动代码绑定服务AIDL同系列文章推荐Android Service 概述 移动应用不像桌面应用。 桌面具有大量资源&a…

基于51单片机的正弦波发生器设计

程序运行图&#xff1a; 仿真原理图&#xff1a; 部分程序&#xff1a; #include <reg52.h> //接口定义 sbit DA P1^1; sbit CK P1^2; sbit CS P1^4; //10bit取样&#xff0c;1024点正弦查表数据 unsigned int code sine_dot[1024] { 0x200,0x203,0x206,0x209,…

可视化编排的数据集成和分发开源框架Nifi轻松入门-上

文章目录概述定义dataflow面临挑战特性核心概念架构高级概述安装部署常见处理器入门示例概述 定义 Nifi 官网地址 https://nifi.apache.org/ Nifi 官网文档 https://nifi.apache.org/docs.html Nifi GitHub源码地址 https://github.com/apache/nifi Apache NiFi是一个易于使用…

NetInside助力IT提高业务性能管理能力(二)

​​需求简介 某外高桥公司的OA系统是其重要的业务系统&#xff0c;OA系统负责人表示&#xff0c;部分用户反馈&#xff0c;访问OA系统时比较慢。需要通过分析系统看一下实际情况。 本次分析重点针对OA系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及…

关于推特隐私设置的一些小窍门

大家在使用推特进行引流的时候&#xff0c;在使用的时候难免会遇到一些功能模糊不清&#xff0c;这里twitter群推王给大家总结了一些偏门功能应该如何去设置&#xff0c;让你使用起来更加得心应手。 一、推特怎么设置自动放声音 1、首先打开推特APP并登陆。 2、其次在推特主…

CPDA认证|数据分析能给企业带来哪些好处?

数据分析的核心并不在于数据本身&#xff0c;而在于设计有意义、有价值的数据分析主题与指标体系&#xff0c;通过科学有效的手段去分析&#xff0c;进而发现问题优化迭代。 无论分析给出的结果是积极的还是负面的&#xff0c;都是价值承载体&#xff0c;必须以客观的态度面对。…

Enum枚举

枚举一般是针对常量需求,优化代码,.使代码看起来简洁 看下下面这个工具类 说有问题,那就是是看起来代码不够简洁 我看着倒还行,也许也是枚举不怎么实用的原因 下面就用枚举来优化这个代码,首先看下枚举介绍 java中对常量数据的配置可以使用枚举类型实现,,枚举类型是面向对象…

3小时!开发ChatGPT微信小程序

导读 | 上周OpenAI发布了对话语言模型 ChatGPT&#xff0c;相关讨论引爆全网。你是否也迫不及待体验一番&#xff1f;本文特邀作者腾讯云开发者社区作者戴传友从开发环境准备、开发过程、服务器接口、腾讯API网关接入到部署&#xff0c;详细教你如何动手开发一个chatGPT微信小程…

2022年华中杯数学建模挑战赛A题分拣系统优化问题

2022年华中杯数学建模 A 题 分拣系统优化问题 真的有想占便宜的 醉了 几十元让我写论文这是什么选手 想占便宜想疯了么 还要求查重率在10% 一开始说想看看你的A题论文 想学习一下 然后谈完价(几十块钱)之后 需要改成现做一篇独一无二的论文 然后想套路我占便宜 套路是真的深啊…