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

使用 Winscope 跟踪窗口转换

Winscope 是一款 Web 工具,可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文件的 Winscope 界面,您可以通过重放、单步执行和调试过渡来针对每个动画帧检查这些服务的状态(无论是否有屏幕录制)。

支持的跟踪记录

Winscope 可用于收集和直观呈现各种跟踪记录或系统服务状态序列。您可以根据特定用例配置这些跟踪记录,从低开销到高详细程度。Winscope 支持以下跟踪记录:

  • EventLog:使用 EventLog 收集系统诊断事件记录。在 Winscope 中,此信息仅用于识别和显示 CUJ 标记。
  • IME:来自输入法 (IME) 管道的跟踪事件,包括 IMS、IMMS 和 IME 客户端。
  • 输入:跟踪输入事件管道的各个部分中的输入事件。
  • ProtoLog:收集来自系统服务的 ProtoLog 消息以及在客户端进程中运行的系统服务的代码。
  • 屏幕录制:收集跟踪记录和屏幕录制。
  • Shell 过渡:记录窗口和 activity 过渡系统详情。
  • SurfaceFlinger:收集包含有关 surface(图层)的信息的 SurfaceFlinger 跟踪记录,例如位置、缓冲区和组合。
  • 事务:使用 SurfaceControl 跟踪 SurfaceFlinger 收到的用于组合的一系列原子更改。
  • ViewCapture:捕获支持 ViewCapture 的系统窗口(例如系统界面和启动器)中所有视图的一系列属性。
  • 窗口管理器:跟踪窗口管理器状态,其中包含与窗口相关的详细信息,包括输入和聚焦事件、屏幕方向、过渡、动画、定位和转换。

提示:只有在至少有一条跟踪记录时,Winscope 中才会显示导航时间轴。每个跟踪记录都由单独的一行表示,而该行中的每个点都表示一个快照(状态)。

支持的转储

Winscope 可以收集和显示状态转储,即在用户定义的特定时刻拍摄的设备状态快照。跟踪记录在设备使用期间持续收集,可能会影响性能,而转储仅在这些用户定义的时刻收集,从而确保性能和详细程度不会受到影响。这样可以更有针对性地高效分析设备在特定时间点的状态。Winscope 支持以下转储:

  • 窗口管理器:转储单个窗口管理器状态。
  • SurfaceFlinger:转储单个 SurfaceFlinger 快照。
  • 屏幕截图:收集屏幕截图以及转储文件。

提示:只有在至少有一条跟踪记录时,Winscope 中才会显示导航时间轴。如果存在跟踪记录和转储的组合,时间轴将显示包含单个条目(点)的行,以表示转储。此外,包含转储的标签页的后缀为 Dump,例如 SurfaceFlinger Dump

资源

如需了解如何构建和运行 Winscope,请参阅运行 Winscope。

如需了解如何收集跟踪记录,请参阅捕获跟踪记录。

如需了解如何使用 Winscope 网页界面加载跟踪记录,请参阅加载跟踪记录。

如需了解如何分析跟踪记录,请参阅分析跟踪记录。

示例

以下示例介绍了如何调试闪烁测试失败问题和用户报告的 bug。

闪烁测试失败

此示例演示了如何使用 Winscope 调试闪烁测试失败问题。

检查测试失败情况

请按照以下步骤确定问题类型并检查测试失败消息。

  1. 通过检查测试和类名称来确定问题类型。

    测试和类名称:

    FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
    

    问题类型:

    • CUJ 是指通过锁屏通知启动应用 (OpenAppFromLockscreenNotificationColdTest)。
    • 测试预计应用会变为可见 (#appLayerBecomesVisible)。
  2. 检查测试失败消息,其中包含有关失败的全面信息,包括:

    • 预期结果与实际可见结果之间的比较
    • 时间戳,可帮助您查明发生失败问题的时间
    • 与失败相关的制品或文件的名称
    • 与理解和调试失败问题相关的其他背景信息
    android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visibleWhere?Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns)What?Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty]Other informationArtifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zipCheck the test run artifacts for trace filesat android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187)at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151)at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150)at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32)at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42)at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79)at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59)at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46)at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43)at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33)at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35)at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29)at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36)at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59)at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89)at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51)at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)
    

    此输出示例表明:

    • 问题发生在 2024-05-10T11:04:14.227572545
    • 预计 NotificationActivity 可见,但实际上不可见。
    • 包含用于调试的跟踪记录的制品文件的名称为 FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV

调试

请按以下步骤确定闪烁的原因:

  1. 下载跟踪记录文件,并在 Winscope 中加载这些文件。Winscope 会打开,并自动选择 SurfaceFlinger:

    包含 SurfaceFlinger 视图的 Winscope 着陆页

    图 1. 包含 SurfaceFlinger 视图的 Winscope 着陆页。

  2. 将异常消息中的时间戳复制并粘贴到时间戳字段中,以找到问题发生时的时间戳。您可以复制人类可读格式 (2024-05-10T11:04:14.227572545) 的时间戳并粘贴到第一个字段,也可以复制纳秒级时间戳 (1715339054227572545ns) 并粘贴到第二个字段。

    时间戳对话框

    图 2. 时间戳对话框。

  3. 按向左键可前往上一个帧。在此状态下,NotificationActivity 应用会在视频中正确显示,并且应用和启动画面 surface 均可见,这由 3D 视图中的绿色矩形以及其层次结构元素上的 V 条状标签所指示。

    应用和启动画面 surface 名称如下:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`Splash Screen com.android.server.wm.flicker.testapp#3453
    

    这表示应用在屏幕变黑时启动,并且此事件发生在应用启动期间,因为启动画面仍可见:

    在应用启动时

    图 3. 在应用启动时。

  4. 按向右键可返回到下一个闪烁的帧。在矩形视图中,屏幕上显示的是 NotificationShade,而不是应用。此帧中显示以下 surface:

    • 屏幕装饰叠加层(顶部和底部)

    • 导航栏

    • 指针位置(来自屏幕录制)

      闪烁 activity

      图 4. 闪烁 activity。

  5. 在层次结构视图中选择应用 activity。如果找不到,请取消选中 Show only V。然后,检查属性视图。

    应用 surface 名称为:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    

    应用属性

    图 5. 应用属性。

    虽然应用 activity 已设置为可见和不透明,但由于 Invisible due to: null visible region 错误,surface 未显示。之所以会出现这种情况,是因为在组合过程中,另一个不透明的 surface 被放置在它前面。此假设源于 3D 视图中 NotificationShade 矩形位于 NotificationActivity 矩形前面,并且可见的(绿色)NotificationShade 可能是所选图层。

  6. 为了验证这一假设,请选择当前帧上的可见 NotificationShade surface 并检查其属性。标志设置为 OPAQUE|ENABLE_BACKPRESSURE (0x102)NotificationShade surface 名称为 NotificationShade#3447。接下来,按左箭头返回到上一个画面(闪烁之前),然后再次检查 NotificationShade surface 的属性。请注意,surface 仅具有 ENABLE_BACKPRESSURE (0x100) 标志,而不是 OPAQUE。这可以确认 NotificationShade 在应用启动完全结束之前变为不透明。由于 NotificationShade 位于 NotificationActivity 前面,因此应用不会显示。NotificationShade 为黑色,因此屏幕会短暂变黑,从而导致闪烁。

  7. 在代码中找出 NotificationShade 过早变暗的原因。

用户报告的 bug

用户报告的 bug 通常缺少详细信息,因此很难进行调试。不同于闪烁测试失败(提供特定时间戳、元素详情和屏幕录制内容),用户报告的 bug 通常只包含问题的简要说明。

在我们的案例研究中,唯一提供的信息是标题“Screen flickered when reopening app from split screen” 和大致时间戳“Apr 18, 2024 3:51 PM GMT-04:00”。

请按以下步骤对用户报告的 bug 进行调试:

  1. 在 Winscope 中加载跟踪文件。Winscope 打开时会自动选择 SurfaceFlinger。

    包含 SurfaceFlinger 视图的 Winscope 着陆页

    图 6. 包含 SurfaceFlinger 视图的 Winscope 着陆页。

  2. 在人类可读的时间戳字段中输入 15:50:00,以找到用户报告的大致时间戳(在本例中为 3:50 PM GMT-04:00)。

    时间戳对话框

    图 7. 时间戳对话框。

  3. 使用矩形视图可识别屏幕上绘制的内容。如需获得更好的视图,请使用“旋转”滑块更改矩形视角。在层次结构视图中标记 Show only VFlat 后,壁纸、屏幕装饰叠加层、信箱、启动器、联系人和拨号器 surface 会显示出来。

    软件包名称如下:

    • 启动器:com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602
    • 联系人:com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565
    • 拨号器:com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    除了可见 surface(绿色矩形)之外,还会显示一个灰色矩形,该矩形代表名为“Unknown display”的显示区域 surface。如需提高可见度,请点击 ScreenDecorHwcOverlay#64 surface 旁边的 (可见性图标) 以隐藏其对应的矩形,并显示后面的 surface。我们移除了分析的叠加层,因为它对用户不可见,也不会被报告为闪烁动画。

    用户报告

    图 8. 用户报告。

  4. 确定分屏视图中涉及哪些 surface 后,请使用“过渡”跟踪记录来逐步执行各种用户操作并查找闪烁。点击 Winscope 中的过渡标签页,以直观呈现已播放的过渡的列表:

    过渡

    图 9. 过渡。

    在此帧中播放的过渡以蓝色突出显示。在本例中,过渡标志包括 TRANSIT_FLAG_IS_RECENTS,表示用户正在进入最近使用的界面。

  5. 点击 Dispatch Time 列(在本例中为 2024-04-18, 15:50:57.205)上的链接,前往相应时间点,然后在 Surface Flinger 标签页中验证矩形。通过使用向右箭头键逐步过渡并观察矩形,确认设备在过渡期间的状态是否正确。

    启动器在 15:50:57.278 时出现,但动画不会在该时间开始。壁纸已经可见,因为在分屏应用(分隔线)之间没有绘制任何内容。在前一个帧 (15:50:57.212) 中,壁纸不可见,并且显示了分隔线,这是未进行动画处理时分屏的显示效果。

    闪烁事件发生前的屏幕

    图 10. 闪烁事件发生前的屏幕。

  6. 如需查看下一个过渡,请直接点击时间轴。SurfaceFlinger 状态由一行浅蓝色块表示。过渡由一行粉色块表示。

    第一个过渡结束

    图 11. 第一个过渡结束。

    点击下一个过渡的起始位置处的 SurfaceFlinger 行。在图 11 中,光标的垂直位置由蓝色细线表示。SurfaceFlinger 行浅蓝色背景显示了其水平位置。使用向右键逐个查看过渡,看看是否会出现闪烁。确认设备在进行此过渡时看起来正确无误。

    注意:点击跟踪记录的时间轴行会使其处于活动状态,也就是说,只有该跟踪记录中的条目可以通过向左或向右键访问。在此处,点击 SurfaceFlinger 行以继续逐步浏览 SurfaceFlinger 状态。

  7. 跳过下一个过渡,因为其持续时间很短,不太可能包含闪烁。改为点击 SurfaceFlinger 行内下一个较长过渡的起始位置处的时间轴,如下图中的光标所示。

    第二个过渡结束

    图 12. 第二个过渡结束。

    在此过渡期间,在 15:51:13.239 时,请注意两个应用(通讯录和拨号器)的 Splash Screen 层位于屏幕的同一侧:

    启动画面

    图 13. 启动画面。

  8. 明确哪个应用在错误的一侧。点击 ns 输入字段旁边的标志图标,为当前位置添加书签,以便日后返回到此帧。

    添加书签

    图 14. 添加书签。

  9. 直接点击时间轴,例如点击 15:51:13.859,以跳至过渡结束时的某个帧。此时,这两个应用已位于最终位置,左侧是拨号器,右侧是通讯录:

    最终分屏

    图 15. 最终分屏。

  10. 点击时间轴中的书签标志,返回到闪烁的帧。

    书签时间轴

    图 16. 书签时间轴。

    这两个应用都在右侧,这表明拨号器处于错误位置。

  11. 点击拨号器的启动画面可查看其属性。请在精选的属性视图中特别注意其转换属性。

    转换属性

    图 17. 转换属性。

    计算出的转换会应用于此 surface,但不会设置为此级别。计算的列和请求的列具有不同的值,这表明转换是从父 surface 继承的。

  12. 取消选择层次结构视图中的 Flat,以显示整个层次结构树,然后导航到应用 surface 的父级节点,直到 CalculatedRequested 转换都相同,并显示 Surface(name=Task=7934)/@0x1941191_transition-leash#40670 surface 上正在请求的转换。

  13. 确认转换的首次设置时间以及设置的值。点击标题旁边的图标,以收起精选属性:

    收起精选属性

    图 18. 收起精选属性。

  14. Proto Dump 视图中选择 Show diff,以突出显示在此帧中更改的属性。在文本搜索字段中输入 transform,以过滤属性:

    Show diff

    图 19. Show diff。

    此帧中的 transition-leash 的转换从 IDENTITY 改设为 SCALE|TRANSLATE|ROT_270

    此信息显示,在将转换应用于拨号器分屏应用的动画机制时会发生闪烁。

    确定闪烁

    图 20. 确定闪烁。

  15. 在代码中确定此转换为何设置为分屏过渡机制。

相关文章:

使用 Winscope 跟踪窗口转换

Winscope 是一款 Web 工具,可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文件的 Winscope 界面,您可以通过重放、单步执行和调试过渡来针对每个动画帧检查这些服务的状态(无论…...

25/9/12(补)

做了下19csps初试,60多分,记不清了,反正能过,写完后改一道暑假没过的题,没改完就下课了...

深入解析:“纳米总管”——Arduino Nano 的趣味生活

深入解析:“纳米总管”——Arduino Nano 的趣味生活pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

洛谷题目难度系统优化

以下为优化后的难度系统:优化后难度 对应KaTex数学公式\(\color{FE4C61}{{入门}}\) \color{FE4C61}{{入门}}\(\color{F39C11}{{普及-}}\) \color{F39C11}{{普及-}}\(\color{FFC116}{{普及}}\) \color{FFC116}{{普及}}\(\color{FFD700}{{普及+}}\) \color{FFD700}{{普及+}}\(\c…...

202112_摆烂杯_WhatAHack!

流量分析Tags:流量分析,CTFSHOW 0x00. 题目 这是你沐师傅的站的流量,最近你沐师傅去跟着某讯搭了一个WP平台后发了一篇文章再测试了一下自己的网站就再也没去管过平台了。结果被某位名字貌似大概可能叫g4_simon的大黑阔给hack掉了网站,并进行了一些操作拿到了沐师傅放在平台里…...

少儿 500 常用汉字 字帖

500 常用汉字 每个字加入拼音 每个字加入笔画笔顺 少儿楷书练习下载链接如下 1-4画 5画 6画 7画 8画 9画 10画 11-16画...

Ubuntu 安装 gcc

命令 gcc --version 或者 gcc -v 能查看 gcc 版本。 未安装:安装命令: sudo apt update # 更新软件包源 sudo apt-get install build-essential gdb这样,GCC 就安装完成了。...

Redis常见性能问题

常见性能问题和解决方案?Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。 尽量避…...

3 线性模型

目录P22 P22 复习一下: 假设同类别之间的数据是比较相似的,所以在空间里,同类别的数据是挨在一起的。那么假设现在有一个超平面去进行二分类,由于一个类别的数量多得多而且两个类别的权重是一样的,于是超平面就可以把很多少数类分为正数类而且损失函数的值要下降(看P12,…...

详细介绍:七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线

详细介绍:七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...

P3522 [POI 2011] TEM-Temperature

题目描述 给出 \(n\) 个数所在区间,求最长可能不降区间。 思路 首先,我们要解决不降的问题,如何才能保证两个相邻区间选数可能不降,不难发现,只要前一个数的最大值大于等于后一个数的最小值即可,即 \(r_{i-1} \ge l_i\)。 然后,因为我们要求的是一段一段连续的区间,所以…...

202105_风二西_SQL基于时间盲注

流量分析,SQL注入,基于时间盲注,蚁剑AntSwordTags:流量分析,SQL注入,基于时间盲注,蚁剑AntSword 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202105_风二西_SQL基于时间盲注.zip 0x01. WP 1. 浏览流量包,…...

实用指南:【C++】list容器的模拟实现

实用指南:【C++】list容器的模拟实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…...

windows系统缺失DLL库文件下载方法

https://cn.dll-files.com/ windows系统缺失DLL文件下载方法_dll文件下载官网-CSDN博客...

更为通用的决策单调性

学习自 在线决策单调性地皮还能单老哥分治做? - 洛谷专栏 决策单调性最为常用的为分治和二分队列,前者要求离线,后者必须快速处理两个位置的转移,都有一定的局限性,其他算法大部分码量较长,很难应用。 但我们还有一种好写且能维护复杂转移的写法, 简易版 LARSCH 算法,一…...

一文读懂 PHP PSR 接口 PSR-3、PSR-7、PSR-11、PSR-15 完整指南

一文读懂 PHP PSR 接口 PSR-3、PSR-7、PSR-11、PSR-15 完整指南 现代 PHP 的选择很多。这本来是好事,但一到升级框架、替换 Logger,或在团队间统一服务时,你会发现:看不见的耦合(类型、方法签名、约定)会把小改动变成大手术。 本文用通俗的话讲清四个关键标准——PSR-3(…...

2025模拟赛Round9

T1 T2 T3 T4 T5 T6\({\color{#F39C11} 普及− }\) \({\color{#FFC116} 普及/提高− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\)参赛网址:https://boyacoding.cn…...

NOIP2025模拟赛19

T1 T2 T3 T4\({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#9D3DCF} 省选/NOI− }\) \({\color{#3498DB} 提高+/省选− }\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68919c89c5d9c2f14c1a537f T2,T4搭建未完成 T1 人才计数【NOIP2…...

Qt/C++开发监控GB28181系统/公网对讲/代码实现28181语音对讲/采集本地麦克风数据/支持udp和tcp模式

一、前言说明 按照国标的文档,语音对讲这块,并没有强制要求支持公网对讲,所以当初设备厂家做的都是支持的udp对讲,而且按照国标协议要求,对讲是先发一个语音对讲广播到设备,设备收到后,主动发起对讲到服务端,和视频点播是反着来的,这样的话数据的传输模式只能设备控制…...

P3195 [HNOI2008] 玩具装箱 (斜率优化)

题目描述 一道不限段数的分段问题,要求给出 \(n\) 个元素,求出分任意组所产生的最小代价。 思路 我们可以分为两步来求解这个问题,暴力转移与优化。 The First Step 暴力转移 考虑暴力DP,根据题目描述,每个容器之中玩具的编号都是连续的,并且不限容器数量,状态就很好定义…...

DBeaver使用指南

概述 由于众所周知的原因,公司不容许使用非授权正版软件。datagrip本身挺不错的,但是要倒腾激活码之类的,比较麻烦。只能从开源社区寻找好用的DBMS GUI工具。 发现DBeaver挺不错,功能很全,但是默认的配置不够好用、字体、样式等都不友好,需要打磨一番才行。 下文重点关注…...

sh-2025模拟赛

CSP-J 模拟(九)题目解答 一、单项选择题(每题2分,共30分) 1. 进制转换计算 答案:C 解析:先将八进制数\((2025)_8\)转换为十进制: \(2\times8^3 + 0\times8^2 + 2\times8^1 + 5\times8^0 = 2\times512 + 0 + 16 + 5 = 1024 + 21 = 1045\)。 将十六进制数\((2025)_{16}\)…...

C++ day7 - 指南

C++ day7 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !i…...

读人形机器人11娱乐领域

读人形机器人11娱乐领域1. 机器人表演者与艺术家 1.1. 在人类历史的宏大画卷中,艺术与娱乐一直是我们内心欲望、恐惧和抱负的映照 1.2. 音乐、舞蹈和戏剧表演中的机器人不再是科幻的虚构,而是正在重塑艺术表现形式的崭新现实 1.3. 机器人表演者和艺术家正在通过引入新的表现形…...

Java 注解机制全解析:原理、用途与框架中的实战

注解(Annotation)作为 Java 语言自 JDK5 引入以来的一项重要元编程特性,已经成为现代 Java 开发不可或缺的一部分。无论是 Spring 框架中的依赖注入、事务控制,还是 Hibernate 的对象关系映射,抑或是 Lombok 对代码生成的辅助,注解几乎贯穿于 Java 的开发全过程。 本文将…...

模板集

考虑到作为一名 Oier 有很多需要掌握的模板,所以整合了一下以前的专栏,就变成现在这样了! 有问题请加 qq 3848603482。可以帮你讲解。 给萌新的代码建议 尽量不要写全局变量,容易弄混不方便调试,要用了再创建。没有必要手写栈之类的,STL要了解多一点。不要写#define int …...

暑假

P2569 https://www.luogu.com.cn/problem/P2569 参考这篇。 /*单调队列优化dp买入股票的转移方程j是顺序枚举的,因为是买入股票,手中的股票应该是越来越多的, 当前的决策有可能在后面(j更大)的时候用到,所以你需要先求出来, 同理,卖出股票时,你手中的股票是越来越少的…...

做题记录

P1248 加工生产调度 比较妙的一道题,这里我们可以直接把 A 与 B 的最小值碾一遍,注意 B 操作时间要与 A 操作时间取最大值。...

课程助教工作总结

在上学期,我有幸担任了《数字电路与逻辑设计》课程的助教。这是一次极其宝贵和充实的经历,不仅巩固和深化了我的专业知识,更锻炼了我的沟通、组织和解决问题的能力。现将本学期的工作情况总结如下: 一、 助教工作的具体职责和任务 我的工作核心是成为连接主讲教师与学生的桥…...

6G 驱动的智慧城市新格局

引言随着科技的不断进步,6G 驱动的智慧城市新格局 正逐渐走向应用前沿。它不仅推动了相关产业的发展,也在改变人类社会的运作方式。本文将从背景、核心技术、应用案例、挑战与趋势、总结几个方面对其进行系统分析。 背景 📊6G 驱动的智慧城市新格局 的出现,是社会需求、政…...

SHA-1 证书淘汰警告:网站管理员需紧急验证TLS安全性

微软宣布自2017年5月9日起,Edge和IE11浏览器将逐步阻止SHA-1签名的TLS服务器证书。本文详细解析三阶段淘汰计划、受影响证书类型验证方法及企业应对方案,涉及证书链验证和弱签名日志收集技术。こんにちは、村木ゆりかです。 以前よりマイクロソフト セキュリティ アドバイザリ…...

数字孪生在制造业中的应用

引言在当前快速发展的科技环境中,数字孪生在制造业中的应用 已经成为学术界与产业界广泛关注的主题。本文将通过背景、核心技术、应用案例、挑战与趋势、总结六个部分进行系统性分析。 背景 📊数字孪生在制造业中的应用 的兴起与社会发展需求密切相关。随着数字化转型的加速…...

device第一周个人作业

一. 自我介绍 回顾我的学习经历,虽然没有什么惊天动地的大成就,但也没有一些值得骄傲的小闪光点。兴趣爱好是科幻和军事读物,以前喜欢跟朋友一起打比赛,现在发现朋友在打假赛…… 二.现状、经验与计划 (1)当前技能树与技术偏好 当前技能树: 我可以使用基础的C语言和java…...

Java 在移动开发与跨平台应用中的应用

随着智能手机的普及,移动应用已经成为数字化转型的重要载体。移动端承载着用户的核心交互,而跨平台开发趋势也不断兴起, 旨在减少多端重复开发成本。在这一过程中,Java 一直是移动开发的核心语言, 尤其在 Android 生态中占据主导地位,并通过跨平台技术、移动后端服务、混…...

5G 技术与远程教育

引言在当前快速发展的科技环境中,5G 技术与远程教育 已经成为学术界与产业界广泛关注的主题。本文将通过背景、核心技术、应用案例、挑战与趋势、总结六个部分进行系统性分析。 背景 📊5G 技术与远程教育 的兴起与社会发展需求密切相关。随着数字化转型的加速,全球化的扩展…...

5G 技术在工业互联网的应用

引言在当前社会与科技的双重推动下,5G 技术在工业互联网的应用 已成为一个举世瞩目的议题。它不仅仅是技术层面的创新,更代表着社会运行模式的转型。本文将从背景、核心技术、应用案例、挑战与趋势、总结几个方面进行深入探讨。 背景 📊5G 技术在工业互联网的应用 的发展源…...

一键部署ftp脚本

在 Ubuntu(root) 上搭建标准 FTP(vsftpd)服务器,带被动模式端口、用户创建、目录与权限配置,可直接落地执行。一、部署脚本(保存为 setup_ftp.sh,root 执行) #!/usr/bin/env bash set -euo pipefail### ====== 可按需修改的变量 ====== FTP_USER="ftpuser" …...

PySimpleGUI安装4.60.5老版本安装教程!

PySimpleGUI安装4.60.5老版本安装教程! ━━━━━━━━━━━━━━━━━━━━━━ https://download.csdn.net/download/mzl_18353516147/89506033?utm_medium=distribute.pc_relevant_download.none-task-download-2defaultBlogCommendFromBaiduRate-2-89506033-downlo…...

PySimpleGUI-免注册版本

PySimpleGUI 开始注册了,怎样能免注册使用早期版本? 若需免注册使用 PySimpleGUI 早期版本,可通过以下两种方法实现,具体操作及原理如下: 方法一:通过 pip 指定版本安装(推荐) 操作步骤:卸载现有版本(若已安装新版):pip uninstall PySimpleGUI安装指定旧版本(如 4…...

高三闲话 #1

APJ 三个银牌高考 699,我一个银牌考个 233 不过分吧高三生活还是如期而至了,写点高三闲话感觉太有道理了。不过我得先说明这篇文章的目的不是传播负能量,事实上我最近还是蛮积极的,只不过我无法回避这些我内心里的真实想法,而且感觉写出来很有意思,所以写一写。如果让我用…...

三大免费CDN推荐:安全防护强、稳定性卓越、加载飞速,长期使用超安心

三大免费CDN推荐:安全防护强、稳定性卓越、加载飞速,长期使用超安心1. 将盾CDN:防御与速度双卓越,建站首选利器 将盾CDN是一款专注于安全与性能的CDN服务,其免费版本在防御强度、国内访问速度及功能实用性上表现亮眼,无论是企业官网还是个人站点,都能提供可靠保障,是当…...

PySimpleGUI 开始注册了,怎样能免注册使用早期版本?

若需免注册使用 PySimpleGUI 早期版本,可通过以下两种方法实现,具体操作及原理如下: 方法一:通过 pip 指定版本安装(推荐) 操作步骤:卸载现有版本(若已安装新版):pip uninstall PySimpleGUI安装指定旧版本(如 4.60.5):pip install PySimpleGUI==4.60.5该版本在官方…...

全屏与退出全屏功能

全屏与退出全屏功能 📄 Fullscreen API 使用说明 通过浏览器提供的 Fullscreen API,你可以实现在任意 HTML 元素上的全屏展示与退出全屏效果,适用于视频播放器、看图模式、报表展示等场景。🧩 功能说明支持进入全屏 支持退出全屏 支持检测当前是否处于全屏状态 兼容多浏览…...

二十多年.NET老兵重返技术博客

缘起:博客园,我们的技术家园 自2005年入驻博客园,2006年开始撰写技术博客,直至2013年,我将博客园视为.NET技术交流的圣地。这里纯净、专注的技术氛围,以及众多技术精英的真诚分享,使其成为我们共同的网上家园。然而,由于工作性质的变化,我在2013年后逐渐淡出了技术博客…...

5月杂题

一点骨灰?臭不要脸的回到了机房,感觉大家越来越强了,膜拜。 想到什么写什么。多校清北营训练「清华场」B. 绕口令/gym100162B题意:定义一个字符串为好的当且仅当其中没有两个相邻字符相同,问你对 \(k\in[1,n]\),能否删去原字符串中连续 \(k\) 个字符得到一个好的字符串。…...

uv,下一代Python包管理工具

uv,下一代Python包管理工具 https://segmentfault.com/a/1190000047202911 什么是uv uv(Universal Virtual)是由Astral团队(知名Python工具Ruff的开发者)推出的下一代Python包管理工具,使用Rust编写。它集成了包管理、虚拟环境、依赖解析、Python版本控制等功能,它聚焦于…...

阅读 |《虚空》观后感以及一些想法——万物简史

保持学习,保持记录,保持思考—————— 啊啊啊,真的有好多想要去做的事情,好多想要体验的事情,真的没法同时去学习所有的事物,那是多么的令人感到幸福 这篇文主要就记下看完《虚空》之后的想法以及之后和AI的讨论 首先呢我初读这本书感觉很枯燥,但一整篇看下来之后还是…...

Python进阶必看:深入解析yield的强大功能

https://segmentfault.com/a/1190000045317342?utm_source=sf-similar-article Python进阶必看:深入解析yield的强大功能 头像 涛哥聊Python 2024-10-22 四川 阅读 3 分钟 头图 大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。 更多Python学习内容:http://ip…...

polyglot,一个有趣的 Python 库!

https://segmentfault.com/a/1190000045317129 polyglot,一个有趣的 Python 库! 头像 涛哥聊Python 2024-10-02 四川 阅读 4 分钟 头图 大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。 更多Python学习内容:http://ipengtao.com 今天为大家分享一个有趣的 Py…...

个人介绍与博客初建

大家好!我是 李祺,很高兴能通过博客园这个平台和大家交流。我是一名计算机相关专业的学生,在平时生活里,音乐、旅途和美食是三大支柱。耳机里永远循环着不同语言的旋律:华语流行的细腻歌词、K-pop 的强劲节奏、英文歌的叙事感,都能让我在忙碌时快速切换状态。 旅游是我探…...