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

Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)

在这里插入图片描述

概述

上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能.

目标平台:

CPUX2000
架构mips
内存128MB
存储256MB
LCD600*1024

MiniGUI 的三种运行模式

在编写第一个 MiniGUI 程序之前,需要了解如下事实:我们可将 MiniGUI 配置编译成三种具有不同体系架构的版本,我们称为运行模式:

  • MiniGUI-Threads。运行在 MiniGUI-Threads 上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运行模式非常适合于大多数传统意义上的嵌入式操作系统,比如 uC/OS-II、eCos、VxWorks、pSOS 等等。当然,在 Linux 和 uClinux 上,MiniGUI 也能以 MiniGUI-Threads 的模式运行。
  • MiniGUI-Processes。和 MiniGUI-Threads 相反,MiniGUI-Processes 上的每个程序是独立的进程,每个进程也可以建立多个窗口。MiniGUI-Processes 适合于具有完整 UNIX 特性的嵌入式操作系统,比如嵌入式 Linux。
  • MiniGUI-Standalone。这种运行模式下,MiniGUI 可以以独立进程的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用 uClinux 的嵌入式产品中,因为各种原因而缺少线程库支持,这时,就可以使用 MiniGUI-Standalone 来开发应用软件。

本文采用MiniGUI-Threads运行模式.

参考代码

minigui_hello.c

#include <stdio.h>//for X2000
#include <unistd.h>
#include <libhardware2/fb.h>#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>int fb_fd;
static struct fb_device_info fb;static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{HDC hdc;switch (message) {case MSG_PAINT:hdc = BeginPaint (hWnd);TextOut (hdc, 60, 60, "Hello world!");EndPaint (hWnd, hdc);//X2000平台, 用与刷新屏幕fb_pan_display(fb_fd, &fb, 0);return 0;case MSG_CLOSE:DestroyMainWindow (hWnd);PostQuitMessage (hWnd);fb_disable(fb_fd);close(fb_fd);return 0;}return DefaultMainWinProc (hWnd, message, wParam, lParam);
}int MiniGUIMain (int argc, const char* argv[])
{int ret;//X2000平台, 打开屏幕, 否则图像不会刷新到屏幕上fb_fd = fb_open("/dev/fb0", &fb);if (fb_fd == -1) {printf( "fb open device failed\n");ret = -ENODEV;exit(-6);}MSG Msg;HWND hMainWnd;MAINWINCREATE CreateInfo;#ifdef _MGRM_PROCESSESJoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);#endifCreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;CreateInfo.dwExStyle = WS_EX_NONE;CreateInfo.spCaption = "HelloWorld";CreateInfo.hMenu = 0;CreateInfo.hCursor = GetSystemCursor (0);CreateInfo.hIcon = 0;CreateInfo.MainWindowProc = HelloWinProc;CreateInfo.lx = 0;CreateInfo.ty = 0;CreateInfo.rx = 240;CreateInfo.by = 180;CreateInfo.iBkColor = COLOR_lightwhite;CreateInfo.dwAddData = 0;CreateInfo.hHosting = HWND_DESKTOP;hMainWnd = CreateMainWindow (&CreateInfo);if (hMainWnd == HWND_INVALID)return -1;ShowWindow (hMainWnd, SW_SHOWNORMAL);while (GetMessage (&Msg, hMainWnd)) {TranslateMessage (&Msg);DispatchMessage (&Msg);}MainWindowThreadCleanup (hMainWnd);return 0;
}#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(minigui_hello)# 君正X2000的SDK路径, 用于配置
# 1. 交叉编译器
# 2. 头文件, 君正的FrameBuffer 操作和MiniGUI的头文件
# 3. 依赖的动态库 FrameBuffer和MiniGUI的核心库
# PS: 也可以单独提取出对应的头文件和库放到指定目录编译
set(SRC_DIR /sdk/X2000)
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${SRC_DIR}/build/output)# 设置MIPS交叉编译工具链
set(CMAKE_C_COMPILER ${SRC_DIR}/tools/toolchains/mips-gcc720-glibc229/bin/mips-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${SRC_DIR}/tools/toolchains/mips-gcc720-glibc229/bin/mips-linux-gnu-g++)# 添加可执行文件
add_executable(minigui_hello minigui_hello.c)# 头文件
include_directories(${SRC_DIR}/buildroot/buildroot/output/staging/usr/include)
# 依赖库
target_link_directories(minigui_hello PRIVATE ${SRC_DIR}/buildroot/buildroot/output/target/usr/lib)
target_link_libraries(minigui_hello PRIVATE hardware2 pthread minigui_ths)

运行

重要:需要内置对应的资源文件和MinuGUI.cfg配置文件

  1. 尝试运行前面编译的程序:

    # ./minigui_hello 
    MISC: Can not locate your MiniGUI.cfg file or bad files!
    KERNEL>InitGUI: Initialization of misc things failure!
    

    这是由于在前面集成MiniGUI的过程中, 并没有把对应的资源包集成进文件系统中: MiniGUI Resource (V4.0.0), 缺少了MiniGUI.cfg文件
    在 Linux 系统中,默认配置下构建并安装 MiniGUI 后,MiniGUI 源代码目录中的文件 etc/MiniGUI.cfg 将会被安装到 /usr/local/etc/ 目录下。不过,你也可以在自己的主目录(home directory)中部署自己版本的 MiniGUI.cfg 配置文件,这个版本的配置文件将具有更高的优先级。

    事实上,当 MiniGUI 启动时,它会按照以下顺序尝试查找正确的 MiniGUI.cfg 文件:

    1. 在当前工作目录中查找 MiniGUI.cfg 文件。如果没有找到,
    2. 在当前用户的主目录中查找 .MiniGUI.cfg 文件(这是一个隐藏文件)。如果没有找到,
    3. /usr/local/etc/ 目录中查找 MiniGUI.cfg。如果没有找到,
    4. 最后在 /etc/ 目录中查找 MiniGUI.cfg
  2. 增加MiniGUI.cfg 参考MiniGUIUserManualRuntimeConfiguration.md

## 1[system]
gal_engine=fbcon
defaultmode=600x1024-16bpp
ial_engine=dummy[fbcon]
device=/dev/fb0
defaultmode=600x1024-16bpp
dpi=96## 2
#  ./minigui_hello 
# init_or_term_specifical_fonts: can't find font_number in section rawbitmapfonts
# mg_InitGDI: Can not initialize fonts defined in section rawbitmapfonts![systemfont]
font_number=1
font0=rbf-fixed-rrncnn-8-16-ISO8859-1default=0
wchar_def=0
fixed=0
caption=0
menu=0
control=0[rawbitmapfonts]
font_number=1
name0=rbf-fixed-rrncnn-8-16-ISO8859-1
fontfile0=/usr/data/font/8x16-iso8859-1.bin[varbitmapfonts]
font_number=0[upf]
font_number=0
#name0=upf-unifont-rrncnn-16-16-ISO8859-1,ISO8859-15,GB2312,BIG5,GBK,UTF-8,UTF-16LE,UTF-16BE
#fontfile0=/usr/data/unifont_160_50.upf[qpf]
font_number=0[truetypefonts]
font_number=0[resinfo]
respath=/usr/data/## 3
# ./minigui_hello 
# KERNEL>InitGUI: Count not init mouse cursor!
# KERNEL>InitGUI: Init failure, please check your MiniGUI configuration or resource.[cursorinfo]
# Edit following line to specify cursor files path
# cursorpath=/usr/data/cursor/
cursornumber=23
cursor0=d_arrow.cur
cursor1=d_beam.cur
cursor2=d_pencil.cur
cursor3=d_cross.cur
cursor4=d_move.cur
cursor5=d_sizenwse.cur
cursor6=d_sizenesw.cur
cursor7=d_sizewe.cur
cursor8=d_sizens.cur
cursor9=d_uparrow.cur
cursor10=d_none.cur
cursor11=d_help.cur
cursor12=d_busy.cur
cursor13=d_wait.cur
cursor14=g_rarrow.cur
cursor15=g_col.cur
cursor16=g_row.cur
cursor17=g_drag.cur
cursor18=g_nodrop.cur
cursor19=h_point.cur
cursor20=h_select.cur
cursor21=ho_split.cur
cursor22=ve_split.cur# -------------------## 4
# InitRendererSystemIcon: SYSRES: can't get icon number for LFRDR classic.
# GUI>LFRDR: failed to initialize default renderer's private info.[classic]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico# default icons for new OpenFileDialogBox
dir=folder.ico
file=textfile.ico# default icons for TreeView control
treefold=fold.ico
treeunfold=unfold.ico# bitmap used by BUTTON control
radiobutton=classic_radio_button.bmp
checkbutton=classic_check_button.bmp# background picture, use your favirate photo
bgpicture=none
bgpicpos=center
# bgpicpos=upleft
# bgpicpos=downleft
# bgpicpos=upright
# bgpicpos=downright
# bgpicpos=upcenter
# bgpicpos=downcenter
# bgpicpos=vcenterleft
# bgpicpos=vcenterright
# bgpicpos=none#window element metrics
caption=20
menu=25
border=2
scrollbar=16#window element colors
fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFF6A240A
bgcb_active_caption=0xFF6A240Afgc_menu=0xFF000000
bgc_menu=0xFFCED3D6fgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFE7FFFFfgc_active_border=0xFFCED3D6
fgc_inactive_border=0xFFCED3D6fgc_inactive_caption=0xFFC8D0D4
bgca_inactive_caption=0xFF808080
bgcb_inactive_caption=0xFF808080fgc_window=0xFF000000
bgc_window=0xFFFFFFFFfgc_3dbox=0xFF000000
mainc_3dbox=0xFFCED3D6fgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFF6B2408
bgc_selected_lostfocus=0xFFBDA69Cfgc_disabled_item=0xFF848284
bgc_disabled_item=0xFFCED3D6fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFF6B2408fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFF6B2408bgc_desktop=0xFFC08000## 5
# InitRendererSystemIcon: SYSRES: can't get icon number for LFRDR flat.
# mg_InitLFManager: failed to initialize renderer[1]'s private info.
# InitRendererSystemIcon: SYSRES: can't get icon number for LFRDR skin.
# mg_InitLFManager: failed to initialize renderer[2]'s private info.#{{ifdef _MGLF_RDR_FLAT
[flat]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form-flat.ico
icon1=failed-flat.ico
icon2=help-flat.ico
icon3=warning-flat.ico
icon4=excalmatory-flat.ico# default icons for new OpenFileDialogBox
dir=folder-flat.ico
file=textfile-flat.ico# default icons for TreeView control
treefold=fold-flat.ico
treeunfold=unfold-flat.ico# bitmap used by BUTTON control
radiobutton=flat_radio_button.bmp
checkbutton=flat_check_button.bmp# background picture, use your favirate photo
bgpicture=none
bgpicpos=center#window element metrics
caption=20
menu=25
border=1
scrollbar=16#window element colors
fgc_active_caption=0xFFFFFFFFF
bgca_active_caption=0xFF000000
bgcb_active_caption=0xFF000000fgc_inactive_caption=0xFF000000
bgca_inactive_caption=0xFFFFFFFF
bgcb_inactive_caption=0xFFFFFFFFfgc_menu=0xFF000000
bgc_menu=0xFFD8D8D8fgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFE7FFFFfgc_active_border=0xFF000000
fgc_inactive_border=0xFF848284fgc_window=0xFF000000
bgc_window=0xFFFFFFFFfgc_3dbox=0xFF000000
mainc_3dbox=0xFFFFFFFFfgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFF000000
bgc_selected_lostfocus=0xFFBDA69Cfgc_disabled_item=0xFF848284
bgc_disabled_item=0xFF000000fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFF664E4Afgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFF000000bgc_desktop=0xFFC08000flat_tab_normal_color=0xFFC6D2CF
#}}#{{ifdef _MGLF_RDR_SKIN
[skin]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico# default icons for new OpenFileDialogBox
dir=folder.ico
file=textfile.ico# default icons for TreeView control
treefold=fold.ico
treeunfold=unfold.ico# background picture, use your favirate photo
bgpicture=none
bgpicpos=center#window element metrics
caption=25
menu=25
border=1
scrollbar=17fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFFE35400
bgcb_active_caption=0xFF686868fgc_menu=0xFF000000
bgc_menu=0xFFD4D6FFfgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFFFFFFFfgc_active_border=0xFFC8D0D4
fgc_inactive_border=0xFFC8D0D4fgc_inactive_caption=0xFFF8E4D8
bgca_inactive_caption=0xFFDF967A
bgcb_inactive_caption=0xFF686868fgc_window=0xFF000000
bgc_window=0xFFFFFFFFfgc_3dbox=0xFF000000
mainc_3dbox=0xFFD8E9ECfgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFFC56A31
bgc_selected_lostfocus=0xFFD8E9ECfgc_disabled_item=0xFF99A8AC
bgc_disabled_item=0xFFFFFFFFfgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFFC56A31fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFFC56A31bgc_desktop=0xFF984E00skin_bkgnd=skin_bkgnd.bmp
skin_caption=skin_caption.gif
skin_caption_btn=skin_cpn_btn.gif#for scrollbar
skin_scrollbar_hshaft=skin_sb_hshaft.bmp
skin_scrollbar_vshaft=skin_sb_vshaft.bmp
skin_scrollbar_hthumb=skin_sb_hthumb.bmp
skin_scrollbar_vthumb=skin_sb_vthumb.bmp
skin_scrollbar_arrows=skin_sb_arrows.bmp#for border
skin_tborder=skin_tborder.bmp
skin_bborder=skin_bborder.bmp
skin_lborder=skin_lborder.bmp
skin_rborder=skin_rborder.bmpskin_arrows=skin_arrows.gif
skin_arrows_shell=skin_arrows_shell.bmpskin_pushbtn=skin_pushbtn.gif
skin_radiobtn=skin_radiobtn.gif
skin_checkbtn=skin_checkbtn.bmp#for treeview
skin_tree=skin_tree.bmpskin_header=skin_header.bmp
skin_tab=skin_tab.gif#for trackbar
skin_tbslider_h=skin_tbslider_h.gif
skin_tbslider_v=skin_tbslider_v.gif
skin_trackbar_horz=skin_tb_horz.gif
skin_trackbar_vert=skin_tb_vert.gif#for progressbar
skin_progressbar_htrack=skin_pb_htrack.gif
skin_progressbar_vtrack=skin_pb_vtrack.gif
skin_progressbar_hchunk=skin_pb_htruck.bmp
skin_progressbar_vchunk=skin_pb_vtruck.bmp
#}}[fashion]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico# default icons for new OpenFileDialogBox
dir=folder.ico
file=textfile.ico# default icons for TreeView control
treefold=fold.ico
treeunfold=unfold.ico# bitmap used by BUTTON control
radiobutton=fashion_radio_btn.bmp
checkbutton=fashion_check_btn.bmp# background picture, use your favirate photo
bgpicture=none
bgpicpos=center#window element metrics
caption=25
menu=25
border=1
scrollbar=17fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFFE35400
bgcb_active_caption=0xFFFF953Dfgc_menu=0xFF000000
bgc_menu=0xFFFFE4BFfgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFFFFFFFfgc_active_border=0xFFC8D0D4
fgc_inactive_border=0xFFC8D0D4fgc_inactive_caption=0xFFF8E4D8
bgca_inactive_caption=0xFFDF967A
bgcb_inactive_caption=0xFFEBB99Dfgc_window=0xFF000000
bgc_window=0xFFEBB99Dfgc_3dbox=0xFF000000
mainc_3dbox=0xFFD8E9ECfgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFFC56A31
bgc_selected_lostfocus=0xFFD8E9ECfgc_disabled_item=0xFF99A8AC
bgc_disabled_item=0xFFFFFFFFfgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFFC56A31fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFFC56A31bgc_desktop=0xFF984E00

./minigui_hello
Aborted出现的情况:

  1. 配置[systemfont]
    font_number=0 需要大于0
  2. 配置了[cursorinfo] 没有配置[resinfo]
  1. 增加对应的资源文件, 如文件图标, 鼠标图标, 字体等等, 参考资源文件
    # ls -l /usr/data
    -rw-rw-rw-    1 root     root          8569 Mar  1 13:24 MiniGUI.cfg
    drwxrwxr-x    2 root     root          3000 Mar  1  2020 bmp
    drwxrwxr-x    2 root     root          3472 Mar  1  2020 cursor
    drwxrwxrwx    2 root     root          1040 Mar  1  2020 font
    drwxrwxr-x    2 root     root          1624 Mar  1  2020 icon
    -rwxrwxrwx    1 root     root         13820 May 15  2025 minigui_hello
    
  2. 再次运行

效果如图:
在这里插入图片描述

参考

  1. 开始 MiniGUI 编程

相关文章:

Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)

概述 上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能. 目标平台: 键值CPUX2000架构mips内存128MB存储256MBLCD600*1024 MiniGUI 的三种运行模式 在编写第一个 MiniGUI 程序之前&#xff0c;需要了解如下事实&#xff1…...

flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别

组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面&#xff08;如表单、静态内容&#xff09;❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表&#xff0c;自动滚动&#xff1b;适合展示大量数据✅ 支持✅ 是⭐⭐Li…...

OpenCV透视变换

概念 OpenCV 透视变换是将图像从一个视平面投影到另一个视平面的过程&#xff0c;也叫投影映射 &#xff0c;属于空间立体三维变换。它基于透视原理&#xff0c;通过 33 的变换矩阵作用于图像像素坐标来实现映射转换 &#xff0c;能模拟人眼或相机镜头观看三维空间物体时的透视…...

Node.js 实战四:数据库集成最佳实践

你写了个登录接口&#xff0c;用上了 JWT&#xff1b;然后&#xff0c;产品来了句&#xff1a; “用户数据能分页查吗&#xff1f;能关联公司信息吗&#xff1f;我们这边还有多语言字段…” 你发现&#xff1a;SQL 写得越来越长&#xff0c;关联越来越绕&#xff0c;字段越来越…...

【JDBC】JDBC概述、历史版本及特征

1_JDBC概述 什么是JDBC JDBC&#xff08;Java DataBase Connectivity, Java数据库连接&#xff09; ,是一种用于执行SQL语句的Java API&#xff0c;为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 有了JDBC&#xff0c;程序员只需用JDBC API写一个程序…...

redis的pipline使用结合线程池优化实战

文章目录 代码讲解与事务 (MULTI/EXEC) 的区别在你这段代码里的价值可能的坑实战建议 代码 /*** 批量根据用户 ID 查询用户信息** param findUsersByIdsReqDTO* return*/Overridepublic Response<List<FindUserByIdRspDTO>> findByIds(FindUsersByIdsReqDTO findUs…...

【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式

文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…...

MySQL初阶:sql事务和索引

索引&#xff08;index&#xff09; 可以类似理解为一本书的目录&#xff0c;一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过&#xff1a; 1.先遍历表 2.将条件带入每行记录中进行判断&#xff0c;看是否符合 3.不符合就跳过 但当表中的…...

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线

以下通过点亮LED进行基本使用流程演示&#xff0c;实际可以连接复杂外设&#xff08;SPI、CAN、ADC等&#xff09; 单模块使用 RX、TX、5V和GND接到串口模块&#xff1b;X5接5V&#xff1b;Y2接LED;LED-接GND 串口模块插上电脑后&#xff0c;LED没有亮&#xff1b;因为此时模…...

很啰嗦,再次总结 DOM

DOM (文档对象模型) 详解 一、DOM 基础概念 1. 定义与作用 DOM&#xff08;Document Object Model&#xff09;即文档对象模型&#xff0c;是一种用于 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构&#xff0c;允许程序和脚本动态访问、修改文…...

文件读取漏洞路径与防御总结

文件读取漏洞路径与防御总结 文件读取漏洞允许攻击者通过路径遍历等手段访问未授权的文件。以下是Linux和Windows系统中常见敏感路径的归纳及防御建议&#xff1a; Linux 系统常见敏感路径 系统关键文件&#xff1a; /etc/passwd&#xff1a;用户账户信息&#xff08;可被用来…...

电池的充放电电流中C的含义

充电电池的充放电电流标注为 -0.2C、1C、2C 等参数时&#xff0c;其含义与电池的容量和充放电速率直接相关。以下是详细解释&#xff1a; 1. 什么是 “C” 值&#xff1f; • C 是电池的 额定容量&#xff08;Capacity&#xff09; 的缩写&#xff0c;单位为 Ah&#xff08;安时…...

文章记单词 | 第91篇(六级)

一&#xff0c;单词释义 stride /straɪd/- v. 大步走&#xff1b;跨越&#xff1b;迈进 /n. 大步&#xff1b;进展&#xff1b;步幅diplomatic /ˌdɪpləˈmtɪk/- adj. 外交的&#xff1b;有手腕的conquer /ˈkɒŋkə(r)/- v. 征服&#xff1b;战胜&#xff1b;克服geogra…...

Nginx应用场景详解与配置指南

1. 什么是Nginx&#xff1f; Nginx&#xff08;发音为"engine-x"&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它以高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 2. Nginx的主要应用场景 2.1 …...

【Ubuntu】Waydroid-Linux安卓模拟器安装

✅ 1. 安装 Waydroid sudo apt update sudo apt install curl ca-certificates gnupg git -y curl -s https://repo.waydro.id | sudo bash sudo apt install waydroid -y sudo apt install dbus-x11✅ 2. 初始化 Waydroid 使用普通system版本&#xff1a; sudo waydroid in…...

设计模式 - 单例模式 - Tips

为什么双重检查会带来空指针异常问题&#xff1f; if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } …...

设计模式7大原则与UML类图详解

设计模式7大原则与UML类图详解 引言 &#x1f31f; 在软件工程领域&#xff0c;设计模式和UML&#xff08;统一建模语言&#xff09;是提高代码质量、增强系统可维护性的重要工具。设计模式提供了解决软件设计中常见问题的通用方案&#xff0c;而UML则为我们提供了一种可视化的…...

如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践

这篇博客涉及两个知识点&#xff0c;一个是动态采样&#xff0c;另一个是 DAS 执行。 用户的问题和相关结论 我们看看用户在OceanBase 社区论坛发帖中提出的疑问及其所得出的结论。 问题&#xff1a;收集统计信息之前&#xff0c;为什么会出现计划不稳定的情况&#xff1f; …...

NY321NY322美光闪存芯片NY323NY336

NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天&#xff0c;美光科技的闪存芯片凭借其创新架构与高性能表现&#xff0c;已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度&#xff0c;深入探讨…...

HMDB51数据集划分

生成训练集、验证集和测试集 每个split文件应该包含&#xff1a; 训练集(id1): 70个视频测试集(id2): 30个视频未使用(id0): 剩余视频 这是一个70/30的训练/测试分割比例。标记为0的视频被排除在当前实验之外。实际上训练集&#xff08;id1&#xff09;&#xff0c;验证集&am…...

25、DeepSeek-R1论文笔记

DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链&#xff08;Chain of Thought&#xff09;6、强化学习算法&#xff08;GRPO&#xff09;7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…...

CodeBuddy 打造响应式测试平台:ScreenLab 的诞生记

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 开发工具&#xff1a;CodeBuddy&#xff08;AI 代码伙伴&#xff09; 技术栈&#xff1a;Vue3 Vite 原生 CSS…...

STM32实战指南:SG90舵机控制原理与代码详解

知识点1【SG90的简述】 SG90是一款微型舵机&#xff08;Micro Servo&#xff09;&#xff0c;由TowerPro等厂商提供&#xff0c;广泛用于机器人&#xff0c;舵机云台&#xff0c;舵机控制教学等项目中。 1、基本参数 2、工作原理 SG90内部有电机&#xff0c;齿轮组&#xff…...

基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)

源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构&#xff0c;后端基于成熟稳定的Spring Boot框架&#xff0c;负责数据处理…...

开源RTOS(实时操作系统):nuttx 编译

开源RTOS&#xff08;实时操作系统&#xff09;&#xff1a;nuttx 编译 手册&#xff1a;Installing — NuttX latest documentation 源码&#xff1a;GitHub - apache/nuttx: Apache NuttX is a mature, real-time embedded operating system (RTOS) Installing The fir…...

C++学习:六个月从基础到就业——C++11/14:decltype关键字

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;decltype关键字 本文是我C学习之旅系列的第四十二篇技术文章&#xff0c;也是第三阶段"现代C特性"的第四篇&#xff0c;主要介绍C11/14中的decltype关键字。查看完整系列目录了解更多内容。 引言 在现代C…...

【51】快速获取数码管段选表(含小数点)及字母表的工具(分享)

1 介绍 1.1 画面 1.2 用法 输入IO口和段码字母的映射关系&#xff0c;比如这里e4d5dp2&#xff0c;指的是bit4是e段&#xff0c;bit5是d段&#xff0c;bit2是小数点dp段。 然后选择有效电平&#xff08;1表示亮 or 0表示亮&#xff09;。 点击生成段码配置&#xff0c;即可得到…...

高频面试题(含笔试高频算法整理)基本总结回顾120

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

5月17日

这几天不知道为啥没更新。可能是玩得太疯了。或者是考试有点集中&#xff1f;&#xff1f; 线性代数开课了&#xff0c;英语昨天完成了debate 昨天中午debate结束我们就出去玩了&#xff0c;去的那里时光民俗&#xff0c;别墅很好&#xff0c;770平米&#xff0c;但是缺点是可…...

摩方 12 代 N200 迷你主机(Ubuntu 系统)WiFi 抓包环境配置教程

摩方12代N200迷你主机标配 Intel AX201无线网卡&#xff0c;支持 WiFi 6 协议&#xff08;802.11ax&#xff09;及蓝牙5.2。此网卡兼容主流抓包工具&#xff0c;但需注意&#xff1a; 驱动兼容性&#xff1a;Ubuntu 20.04及以上内核版本&#xff08;5.4&#xff09;默认支持AX2…...

从零开始:使用 PyTorch 构建深度学习网络

从零开始&#xff1a;使用 PyTorch 构建深度学习网络 目录 PyTorch 简介环境配置PyTorch 基础构建神经网络训练模型评估与测试案例实战&#xff1a;手写数字识别进阶技巧常见问题解答 PyTorch 简介 PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook&#xff08;现…...

应用层自定义协议与序列化

应用层自定义协议与序列化 应用层协议网络版计算器序列化和反序列化序列化反序列化 重新理解read、write、recv、send和TCP为什么支持全双工代码结构Jsoncpp特性安装序列化使用Json::Value的toStyledString方法使用Json::StreamWriter使用Json::FastWriter 反序列化使用Json::R…...

2025春训第二十场

问题 B: 狗是啥呀 题目描述 在神秘的地狱深处&#xff0c;有着一种神秘的犬类生物&#xff0c;据传这种生物长了x个脑袋&#xff0c;并且具有强大的生命力。由于见过它的人全都下落不明&#xff0c;至今没有人知道它的真面目。 一位勇士为了斩杀这奇怪的生物&#xff0c;来到地…...

分糖果--思维+while判断

1.从左到右只考虑右边一遍&#xff0c;再从右到左考虑左边一遍&#xff0c;相当于左右考虑了 2.然后关键是1遍不一定行&#xff0c;while循环直到成功 https://www.luogu.com.cn/problem/B4091 #include<bits/stdc.h> using namespace std; #define N 100011 typedef …...

[system-design] ByteByteGo_Note Summary

目录 通信协议 REST API 与 GraphQL gRPC 如何工作&#xff1f; 什么是Webhook&#xff1f; 如何提高应用程序接口的性能&#xff1f; HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC) SOAP vs REST vs GraphQL vs RPC 代码优先与应用程序接口优先 HTT…...

Flask项目实践:构建功能完善的博客系统(含评论与标签功能)

引言 在Python Web开发领域&#xff0c;Flask以其轻量级、灵活性和易用性赢得了众多开发者的青睐。本文将带您从零开始构建一个功能完善的博客系统&#xff0c;包含文章发布、评论互动和标签分类等核心功能。通过这个实战项目&#xff0c;您不仅能掌握Flask的核心技术&#xf…...

Python爬虫实战:获取1688商品信息

在电商领域&#xff0c;获取1688商品信息对于市场分析、竞品研究、用户体验优化等至关重要。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品资源。通过Python爬虫技术&#xff0c;我们可以高效地获取1688商品的详细信息&#xff0c;包括商品名称、价格、图片、描述…...

Canva 推出自有应用生成器以与 Bolt 和 Lovable 竞争

AI 目前是一个巨大的市场,每个人都想从中分一杯羹。 即使是 Canva,这个以拖放图形设计而闻名的流行设计平台,也在其 Canva Create 2025 活动中发布了自己版本的代码生成器,加入了 AI 竞赛。 但为什么一个以设计为先的平台会提供代码生成工具呢? 乍看之下,这似乎有些不…...

多平台屏幕江湖生存指南

UniApp 屏幕适配大师:多平台屏幕江湖生存指南 屏幕江湖:尺寸混战 屏幕适配就像是应对不同体型的客人:从迷你的手机屏,到标准的平板,再到巨大的电视屏幕,你的应用必须有如武林高手般的适应力。 ┌──────────────────────────────────…...

BootCDN介绍(Bootstrap主导的前端开源项目免费CDN加速服务)

文章目录 BootCDN前端开源项目CDN加速服务全解析什么是BootCDN技术原理与架构CDN技术基础BootCDN架构特点1. 全球分布式节点网络2. 智能DNS解析系统3. 高效缓存管理机制4. 自动同步更新机制5. HTTPS和HTTP/2协议支持 BootCDN的核心优势速度与稳定性开源免费资源丰富度技术规范遵…...

LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析

文章目录 问题描述算法思路&#xff1a;二分查找法关键步骤 代码实现代码解释高频疑问解答1. 为什么循环条件是 left < right 而不是 left < right&#xff1f;2. 为什么比较 nums[mid] > nums[right] 而不是 nums[left] < nums[mid]&#xff1f;3. 为什么 right …...

刷leetcodehot100返航版--二叉树

二叉树理论基础 二叉树的种类 满二叉树和完全二叉树&#xff0c;二叉树搜索树 满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 节点个数2^n-1【n为树的深度】 完全二叉树 在完全二叉树…...

「Mac畅玩AIGC与多模态41」开发篇36 - 用 ArkTS 构建聚合搜索前端页面

一、概述 本篇基于上一节 Python 实现的双通道搜索服务&#xff08;聚合 SearxNG 本地知识库&#xff09;&#xff0c;构建一个完整的 HarmonyOS ArkTS 前端页面。用户可在输入框中输入关键词&#xff0c;实时查询本地服务 http://localhost:5001/search?q...&#xff0c;返…...

【LINUX操作系统】生产者消费者模型(下):封装、信号量与环形队列

1.封装、完善基于阻塞队列的productor-consumer module 前文中我们封装了自己的Mutex 【LINUX操作系统】线程同步与互斥-CSDN博客 按照老规矩&#xff0c;现在我们对同步与互斥的理解更进一步了&#xff0c;现在把这种面向过程的语言封装成面向对象的写法 1.1 封装条件变量 #p…...

项目管理学习-CSPM-4考试总结

前言 经过两个月左右时间的学习&#xff0c;今天&#xff08;2025年5月17日&#xff09;参加了CSPM-4的考试&#xff0c;仿佛回到了2011年参加软考高项的时候。中午12点考完出来后&#xff0c;手都是酸酸的。不过整体感觉还可以&#xff0c;和预想的差不多。CSPM-4的考试一共有…...

自己手写tomcat项目

一&#xff1a;Servlet的原理 在Servlet(接口中)有&#xff1a; 1.init():初始化servlet 2.getServletConfig()&#xff1a;获取当前servlet的配置信息 3.service():服务器&#xff08;在HttpServlet中实现&#xff0c;目的是为了更好的匹配http的请求方式&#xff09; 4.g…...

C语言—再学习(结构体)

一、建立结构体 用户自己建立由不同类型数据组成的组合型的数据结构&#xff0c;它称为结构体。 struct Student { int num; //学号char name[20]; //名字为字符串char sex; //性别int age; //年纪float score; //分数char addr[30]; 地址为字符…...

SpringBoot--自动配置原理详解

为什么要学习自动配置原理&#xff1f; 原因&#xff1a;在实际开发中&#xff0c;我们经常会定义一些公共的组件&#xff0c;提供各个团队来使用&#xff0c;为了使用方便&#xff0c;我们经常会将公共的组件自定义成starter&#xff0c;如果想自定义starter&#xff0c;必须…...

MiInsertPageInFreeList函数分析和MmFreePagesByColor数组的关系

第一部分&#xff1a; Color MI_GET_COLOR_FROM_LIST_ENTRY(PageFrameIndex, Pfn1); ColorHead &MmFreePagesByColor[ListName][Color]; 第二部分&#xff1a; #define MI_GET_COLOR_FROM_LIST_ENTRY(index,pfn) \ ((ULONG)(((pfn)->…...

Windows/MacOS WebStorm/IDEA 中开发 Uni-App 配置

文章目录 前言1. 安装 HBuilder X2. WebStorm/IDEA 安装 Uniapp Tool 插件3. 配置 Uniapp Tool 插件4. 运行 Uni-App 项目 前言 前端开发人员对 WebStorm 一定不陌生&#xff0c;但有时需要开发 Uni-App 的需求&#xff0c;就必须要采用 HBuilder X&#xff0c;如果不习惯 HBu…...