tag 标签: 系统

相关博文
  • 2024-6-20 17:20
    0 个评论
    随着自动驾驶技术的成熟,对系统架构师的需求逐渐增加。自动驾驶系统架构师负责设计整个系统的结构、组件、接口和数据流;需要协调不同领域的专业知识,确保系统的可靠性、安全性和性能。总之,自动驾驶系统架构师是一个新兴且不断发展的职业。随着技术的进步,这一领域将继续吸引更多人才,推动自动驾驶技术的发展。 自动驾驶架构师在设计和开发自动驾驶系统时将面临一系列挑战,包括:安全关键的边缘情况、领域概括、模拟数据、多模态传感器和传感器融合、动态场景等。作为一名自动驾驶系统架构师,需要综合考虑技术、业务和人员方面的要素;需要具备广泛的知识和技能,以便设计和构建复杂的自动驾驶系统。 初级自动驾驶架构师应该掌握智能网联汽车概论;软件定义汽车;计算机网络;汽车电子电器架构;智能汽车关键技术概述;环境感知与车联网通讯技术;规划与控制;嵌入式软件开发简介;ADAS算法开发;ACC功能设计;HWA功能开发;APA功能开发;详细的学习课程可关注微信公众号【 自动驾驶测试验证技术创新论坛】 微信号GRCC_Auto获取详细信息。
  • 热度 13
    2023-4-4 16:54
    1111 次阅读|
    0 个评论
    为什么树莓派爱好者在谈论 USB 启动时会感到兴奋?因为它使树莓派明显更快。或者,更准确地说,内存随闪存 (ROM) 传输。RPi 启动速度更快,尤其是在 64 位操作系统中,因为它是一个未压缩的内核。或者将页面从缓存加载到 Chromium 中。因此,任何使用闪存传输大量数据的东西都会更快。但是,例如,深度学习应用程序不会运行得更快,因为它们主要使用 RAM。你也不会更好地传输YouTube流;这与您的互联网带宽有关,与您的闪存卡无关。 USB启动如此受欢迎的另一个原因是,使用过的SSD卡比较小的SD卡磨损得更少。 硬件 USB 启动需要专用硬件。一个简单的USB 3.0盘可以完成这项工作,但传输速度与SD卡相同,约为80-100MB / s。网络,它会更糟一些,因为在初始化RPi板上的USB控制器时大约有0.5秒的开销。 只有使用快速 SSD 驱动器(400 MB/s 或更高),您才能从 USB 启动中充分受益。这些 SSD 驱动器不作为 USB 设备提供。需要一个额外的USB 3.0适配器将其连接到树莓。确保使用适合 UASP 传输的适配器。它是USB 3.0支持的新的,最快的协议。最后要考虑的一点是功耗。相对较小的SSD驱动器可以通过USB端口供电。这是首选,因为否则,您还需要额外的电源。一个相对便宜的组合是金士顿240GB A400 SATA 3(32欧元)和Inateck 2.5硬盘盒(15欧元)。 树莓派 4 USB 启动 树莓派巧妙地启动。启动后,位于EEPROM中的小程序立即仅加载I/O的驱动程序。这就是为什么,例如,即使没有插入SD卡,您仍然会看到诊断屏幕。然后,该程序尝试在树莓派中加载操作软件。完成后,它将控制权转移到树莓派,并在其余时间保持空闲状态。 到目前为止,启用USB启动的最简单方法是使用Raspberry Pi Imager。从 1.6 版开始,您可以找到适用于 USB 启动的专用 EEPROM 设置。看看下面的幻灯片。 在PC中插入(小型)SD卡,然后烧录您选择的EEPROM镜像。可以使用启动顺序首先是SD卡,其次是USB,或者在幻灯片中选择的启动顺序,USB优先,SD卡其次。使用树莓派 4 和 EEPROM 更新中新闪存的 SD 卡启动。屏幕变为绿色后,您的EEPROM已准备就绪。您始终可以通过简单地使用不同的设置重复上述过程来更改启动顺序。 其余过程与第一段中所述的标准SD卡安装相同。使用imager在 USB 设备上烧录树莓派 64 操作系统,从树莓派 4 中取出 SD 卡,然后将 USB 设备插入(蓝色)USB 3.0 连接器。现在,按照通常的安装顺序进行操作。 密切关注 USB 设备的功耗。一个SSD卡没有问题,但更多的就需要一个单独的电源集线器。 故障 排除 最常见的故障原因是 USB 到 SATA(SSD 卡)适配器不支持 UASP 协议。UASP代表USBAttachedSCSIProtocol,Raspberry Pi使用的一种极快的数据传输协议。一些适配器,如流行的JMicron,在某些UASP命令上会有问题。您会看到性能缓慢、频繁断开连接或错误报告。即使连接到USB 2.0也无法解决问题,因为Linux内核在看到USB 3.0设备时仍然使用UAS命令。 唯一的解决方案是在启动后立即使用命令禁用 UASP 传输。在command.txt文件中,您需要提供 USB 驱动器的硬件 ID。您可以通过将SSD驱动器连接到仍在SD卡上工作的Raspberry Pi的USB来获得它。 # Get the verdor and product ID $ lsusb 找到的数字在命令usb-storage.quirks=xxxx:yyyy:u中作为参数给出 此命令必须设置为 /boot/cmdline.txt中找到的长行中的第一个参数。 在 USB 文件夹的启动部分找到该文件。请参阅下面的屏幕转储,从常规SD卡启动的RPi。启动后连接 USB 设备。 你也可以使用nano编辑器 Benchmark 经过所有的努力,大多数人只想知道一件事:值得吗?答案很简单是肯定的。 您不仅拥有更多的内存空间,而且具有分布式磨损的SSD卡的使用寿命也比SD卡长得多。 而且SSD卡要快得多。您可以在树莓菜单上找到Benchmark测试工具。 执行后,您可以请求报告。 我们研究了三种不同的选择。首先是标准的SD卡,当然是最慢的。 第二种选择是带有不支持 UASP 的 SATA 到 USB 转换器的 SSD 卡;进步很大。 第三个选项是相同的SSD卡,但现在具有支持UASP的转换器。显然是最快的。 不得不说,如果没有UASP,你仍然有很多速度增益。 最后两点意见 在树莓诊断报告中,您会看到 IOPS。它代表每秒的 I/O 操作数。如您所见,一次读取或写入传输为 4 KBYTE。您可以将这些数字相乘以获得以每秒(兆)字节为单位的传输速率。 这些令人印象深刻的传输速率仅反映从ROM读取或写入数据,而不是工作存储器(RAM)。最终,您的Raspberry Pi将运行得更快,但是,例如,使用SSD卡在RAM中具有模型的深度学习应用程序不会更快。 启动顺序 对于高级用户,有引导加载程序配置文件指示Raspberry Pi将如何启动。在rpi-eeprom-config文件中,您可以定义两个媒体(SD、USB、UART、网络)尝试引导 RPi。如果第一个(例如SD卡)出现故障,它将尝试从第二个(可以是您的USB)启动。这样,当SSD驱动器发生故障时,您的SD卡可以用作一种备份。 但是请注意,一旦启动,您将只能使用该设备。换句话说,如果由于功能不当,您从“旧”SD卡而不是“新”SSD驱动器启动,则由于加载了“旧”SD卡文件结构,您将丢失SSD驱动器上的所有工作。如果您的 SSD 驱动器仍在内部启动或其电源尚不可用,则可能会发生这种情况。您必须采取预防措施来解决此问题。一定次数的引导重试可能是解决方案。 在开始修改rpi-eeprom-config文件之前,请仔细阅读此页面上的说明。 $ sudo -E rpi-eeprom-config --edit # modify BOOT_ORDER=0xf41 # first SSD (USB), second SD card $ BOOT_ORDER= 0xf14 # save + , , $ sudo reboot 同样,这适用于高级用户。大多数人只需从Pi中取出SD卡即可享受改进的性能。 文章转自: https://qengineering.eu/install-raspberry-64-os.html
  • 热度 3
    2022-5-10 20:25
    2107 次阅读|
    1 个评论
    工程中经常会用到的控制算法想必就是PID了,现代控制理论为何陷入了迷思呢? 不去尝试,永远不知道新理论和算法能不能用。本文希望能给出一些控制算法研究中的工程哲学供大家参考。 先进控制算法为何给大家感觉不如PID呢? 一种可能,别人用上了,效果好,自己用不上,乃至说不知道怎么用,只能用PID,这说明自己落后。 另外一种可能,有很多所谓先进的理论和算法确实很难在实际中用,根本就是为了发论文而做的。 还有一种可能,大家都在用PID,但控制效果远不能令人满足,只是暂时找不到/发现不了更好的方法。 另外有个值得注意的,底层是PID,看中上层是不是PID。即虽然是PID,但是是结合比如自适应、模糊、容错等等。而且PID的调参是否用了比如频域分析、鲁棒等等。 如何区分这几者,是很重要的。 控制算法要能处理known known,known unknown,unknown known,unknown unknown。 只此一件的控制系统,在较为确定的环境里工作,参数可以专门针对硬件,调到很好。但也会跟温室一样,系统乃至环境的很多东西有明确的规定,甚至细到某个螺丝要拧几圈半,外界的干扰要可忽略,等等。如此的系统,有时可以应用上较为复杂的控制算法,也就没有什么好稀奇的:known known知道,unknown known能通过对系统不断加深理解变成known known,known unknown、unknown unknown则可以通过对系统和环境的控制减少到可忽略。 但商业化产品中的控制系统,上量之后件件之间有差距,加上使用环境不确定的话,known unknown、unknown unknown都会大,而控制算法要能鲁棒(不仅限于传统鲁棒控制中的鲁棒)到可以处理到这些,即使known known、unknown known处理到最好。 比如一个信号,近似等于个高斯白噪声,用过去数据,估算出均值与方差,是known known。但肯定不准的,因为现实中就不存在标准的高斯白噪声,于是做出一个误差区间,有各种做法,算是known unknown。但known known跟known unknown加起来,也还是与实际有差距,是unknown unknown,是there is nothing you can do about it的了。但常被忽视的是unknown known,比如这个信号里面,可以分离出一个周期信号(不一定是正弦),是一个干扰。知道之后,unknown known变成known known。如此等等。前面说了,可以从不同层面考虑,比如信号分成确定部分和随机部分,确定部分是known known。但确定部分与实际的确定部分有差别,是unknown known。随机部分,知道分布的话,是known unknown。随机部分也与实际的随机部分有差别,是unknown unknown。如是如是,不一而足。从这个层面分析,不如上一段中的分析对实际有指导意义。 当然还有系统。比如一个系统,有输入输出数据,建模、辨识出一个LTI模型,有参数,是known known。但这个模型肯定不是完全吻合数据,所以要给一定的不确定性,比如在参数上,可能有个区间,是known unknown。即使加上这个区间,也还是与实际有差别,是谓unknown unknown。但如果一分析,发现这个模型其实可以分离成一个LTI模型,加上一个比如Wiener模型,就是unknown known被发现了。 当然也可以在不同的层面分析。参数很多,花时间调,总能调出个鼻子乱舞的大象,特别是在仿真中更是如此。但物理学的历史告诉我们,这个时候,应该是存在更有结构化的理论框架。当然,这样的理论框架,如PID,如Kalman滤波,等等,也还是留有一定的参数让在实际中调,因为known unknown与unknown unknown,是另一个层面的问题了。
  • 热度 2
    2019-5-31 10:53
    3188 次阅读|
    1 个评论
    解决HP ProLiant DL380 G5的Centos 7安装与启动不能识别硬盘问题 默认进入安装页面选择 选中“Install Centos 7” 按下【Tab】键 键入“空格” 键入“hpsa.hpsa_simple_mode=1 hpsa.hpsa_allow_any=1”参数 按下【回车】键 开始安装 安装完毕重新启动时硬盘还是无法识别 2.2、启动界面硬盘识别方法 启动后选择第一项 ········································(core) 按下【e】进入编辑状态 找到“linux17”行 选择到这一行的行尾 同样键入“hpsa.hpsa_simple_mode=1 hpsa.hpsa_allow_any=1”参数 按下【Ctrl+X】可正常引导 2.3、重启测试 reboot 搜索 复制
相关资源
  • 所需E币: 0
    时间: 2024-8-26 12:23
    大小: 3.46KB
    上传者: huangyasir1990
    一、什么是流媒体流媒体是一种以流的形式在网络上进行数字媒体(音频、视频)传输的技术。它将频、音视频之类的连续媒体经压缩编码、数据打包后按照一定的时间间隔要求连续地发送给接收方,接收方在后续数据不断到达的同时对接收到的数据进行重组、解码和播放。如果你对流媒体感兴趣的话,可以看一下Live555,一个更流行且更专业的流媒体库。它支持了各种标准流媒体传输协议,如RTP/RTCP、RTSP、SIP,实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持。播放VLC和MPlayer都是基于它来实现流媒体播放的功能,并且非常适合嵌入式领域。二、视频编码 是指压缩编码。在计算机的世界中,一切都是0和1组成的,音视频的数据量庞大,如果按照裸流数据存储的话,那将需要耗费非常大的存储空间,也不利于传送。而音视频中,其实包含了大量0和1的重复数据,因此可以通过一定的算法来压缩这些0和1的数据。特别在视频中,由于画面是逐渐过渡的,因此整个视频中,包含了大量画面/像素的重复,这正好提供了非常大的压缩空间。因此,编码可以大大减小音视频数据的大小,让音视频更容易存储和传送。三、simple-rtmp-server[多种类型直播]一个简单高效的实时视频服务器,使用C++开发,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。SRS提供了丰富的接入方案将RTMP流接入SRS,包括推送RTMP到SRS、推送RTSP/UDP/FLV到SRS、拉取流到SRS。SRS还支持将接入的RTMP流进行各种变换,譬如将RTMP流转码、流截图、转发给其他服务器、转封装成HTTP-FLV流、转封装成HLS、转封装成HDS、录制成FLV四、音视频处理框架1.OpenCVOpenCV全称是OpenSourceComputerVisionLibrary,是一个跨平台的计算机视觉库,是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。可用于开发实时的图像处理、计算机视觉以及模式识别程序。OpenCV用C++语言编写,有大量的Python,JavaandMATLAB(版本2.5)的接口。2.GstreamerGStreamer是一个基于管道的多媒体框架,基于GObject,以C语言写成。可以很容易地创建各种多媒体功能组件,包括简单的音频回放,音频和视频播放,录音,流媒体和音频编辑。适用于所有主要操作系统,例如Linux、Android、Windows、MaxOSX、iOS,以及大多数BSD、商业Unix、Solaris和Symbian。GStreamers功能可以通过新插件进行扩展。3.FFmpeg一套开源的音视频处理的框架,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec(用于多个项目中音频和视频的解码器库)以及libavformat(音频与视频格式转换库)五、多媒体处理功能  多媒体视频处理工具FFmpeg有非常强大的功能[1]包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。视频采集功能    FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由FabriceBellard发起的,现在由MichaelNiedermayer主持。    ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。    ffmpeg在Linux下的视频采集    在Linux平台上,ffmpeg对V4L2的视频设备提高了很好的支持,如:    ./ffmpeg-t10-fvideo4linux2-s176*144-r8-i/dev/video0-vcodech263-frtprtp://192.168.1.105:5060>/tmp/ffmpeg.sdp    以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为h263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了。六、视频会议传输模块的开发选择视频会议主要是开发音视频、数据的传输的软件,在这些开发过程中,最核心的模块是传输模块,传输模块的性能直接影响到视频会议的最终质量,因此传输模块的选择在视频会议开发当中尤其重要。传输模块在开发过程中,由于考虑到QOS的影响,一般都会使用数据重发的技术,因此传输模块以及成为视频会议底层开发的一个重点,我们开发的传输模块,可以选择用TCP、UDP直接进行开发或者利用开源的传输库,因为一些开源传输库以及比较成熟,直接拿来用就可以,如果自己开发传输模块,估计也是一个巨大工程。现在我们介绍一下传输模块的开发选择。七、商用流媒体软件的选用如果项目在稳定性、安全性和责任约束上比较苛刻,还是建议选用商用产品。商用流媒体服务器软件的选择范围不大,基本上是国内外几家专业的公司在做,可选产品包括:Wowza、AdobeFlashMediaServer和国内NTVMediaServerG3等。Wowza是一个美国WowzaMediaSystems公司的产品,也是目前应用最广泛的一款流媒体服务器产品,在国内也有它的代理商。通过发放软件授权证书进行授权,可以按月、按年度购买使用授权,官网上有明确的报价。国内代理商加上自己的包装和技术支持费用,价格不一。AdobeFlashMediaServer是早些年使用最广泛的一款产品,产品成熟,价格相对高昂,随着Adobe公司退出中国市场,技术支持也主要有一些国内代理商负责。和Wowza一样,由于由国内厂商支持,加上语言、技术能力和时差等问题,在技术支持上并不尽人意。
  • 所需E币: 0
    时间: 2024-5-29 11:05
    大小: 3.26KB
    上传者: 开心就很好了
    一、什么是OpenCVOpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库。它由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV提供了大量的计算机视觉、图像处理和模式识别的算法,包括实时图像处理、视频分析、特征检测、目标跟踪、人脸识别、物体识别、图像分割、光流法、立体视觉、运动估计、机器学习和深度学习等。OpenCV是一个跨平台的库,支持多种操作系统,包括Linux、Windows、Android、MacOS和iOS等。它使用C++编写,同时也提供了Python、Java、MATLAB等语言的接口,方便不同编程语言的开发者使用。由于OpenCV的开源性和跨平台性,它已经成为计算机视觉领域最受欢迎的库之一,广泛应用于工业检测、医学影像处理、智能交通系统、安防监控系统、机器人视觉、游戏开发等领域。OpenCV的设计初衷是实现计算机视觉的自动化,帮助计算机去理解我们的世界,以便自动完成一些基本的任务。它提供了一系列的算法和工具,使得开发者可以更加便捷地实现各种计算机视觉应用。同时,OpenCV也支持多种硬件加速技术,如Intel的IPP和GPU加速,使得计算机视觉应用的性能得到了极大的提升。二、OpenCV4软件特性OpenCV4官方版是一款开源的跨平台计算机视觉库。OpenCV4最新版软件兼容性强,支持Linux、Windows、MacOS等多种操作系统,适用于机互动、物体识别、运动跟踪、图像分割等领域。OpenCV4软件内置了Python、MATLAB、Ruby等语言的接口,用户能够轻松的使用和修改代码。三、opencv主要模块calib3d:该模块由相机校准(calibration)和三维重建(3d)两个部分组成,主要用于相机标定与三维视觉等;core:OpenCV的内核模块,定义了基础数据结构与基础计算;dnn:该模块主要用于深度学习推理部署,不支持模型训练;features2d:该模块主要用于特征点处理,例如特征点检测与匹配等;flann:FLANN为快速最近邻算法(FastLibraryforApproximateNearestNeighbors)的缩写,该模块包含快速近似最近邻搜索和聚类等功能;gapi:该模块对图像处理算法做了加速处理,不属于OpenCV的功能模块;highgui:该模块用于创建图像化界面操作,例如创建和操作图像显示窗口、鼠标与键盘事件处理,进度条等图像化交互操作;imgcodecs:该模块负责图像文件读写,如图像读取与保存;imgproc:该模块是OpenCV图像处理最重要的模块,主要功能如图像滤波、图像几何变换、直方图操作等;ml:该模块为机器学习模块,包含常见的机器学习算法,如支持向量机和随机森林等;objdetect:该模块主要用于图像目标检测,例如Haar特征检测等;photo:该模块主要负责照片处理,如照片修复和去噪等;stitching:该模块负责图像拼接,功能包括图像特征点寻找与匹配等图像拼接技术;video:该模块用于视频分析,如运动估计、背景分离等;videoio:该模块负责视频读写,主要视频文件的读取和写入。四、opencv4比opencv3多了哪些OpenCV4相较于OpenCV3,主要增加了对SIFT与SURF的支持、改进了DNN模块、增加了对特定网络结构的支持、新增了DNN例程、以及功能提升。对SIFT与SURF的支持:在OpenCV3中,SIFT与SURF的API调用文件是包含在扩展模块中的。而在OpenCV4中,如果想要使用SIFT与SURF,需要从源代码中通过CMake编译生成Python版本的安装包。DNN模块的改进:OpenCV4对DNN模块进行了改进,包括:增加了对ONNX中LSTM、Broadcasting、Algebraoverconstants、Slicewithmultipleinputs的支持。增加了对DarkNet中groupedconvolutions、sigmoid、swish、scale_channels的支持。新增了对MobileNetV3-SSD目标检测网络的支持。改进了对TensorFlow、Darknet和ONNX模型导入的功能。新增的DNN例程:人体解析(服饰分割)例程Clothespartssegmentation。DaSiamRPN目标跟踪例程,该算法出自中科院和商汤科技ECCV2018的论文Distractor-awareSiameseNetworksforVisualObjectTracking。功能提升:imgproc模块中的霍夫变换进行圆检测的HoughCircles()函数新增了HOUGH_GRADIENT_ALT实现,显著提高了圆检测的召回率和精度。这些改进和新增功能使得OpenCV4在计算机视觉领域的应用更加广泛和高效。五、opencv配置配置OpenCV环境主要涉及下载、安装、环境变量设置、以及在VisualStudio中添加必要的目录和依赖项。以下是详细的步骤:1、下载和安装OpenCV:访问OpenCV官网,下载适合Windows版本的OpenCV。运行下载的exe文件进行安装2、环境变量设置:在系统属性的高级设置中,进入环境变量设置。在系统变量中,找到并编辑Path变量,添加OpenCV的路径。对于64位系统,通常需要添加的路径是opencv\build\x64\vc16\bin和opencv\build\bin。3、VisualStudio中添加目录和依赖项:打开VisualStudio,创建一个新的C++项目。在项目属性中,添加包含目录(IncludeDirectories),库目录(LibraryDirectories),以及必要的静态和动态链接库。4、测试配置:创建一个C++源文件,编写简单的代码来测试摄像头读取或图像显示功能。如果程序能够正确运行并显示图像或视频流,则说明OpenCV环境配置成功。这些步骤涵盖了从下载安装到环境配置的整个过程,确保在配置时注意区分Debug和Release模式下的不同设置,以及根据具体的OpenCV版本调整路径和文件名。
  • 所需E币: 0
    时间: 2024-3-12 10:43
    大小: 7.6MB
    上传者: htwdb
    随着计算机技术的飞速发展和生物识别技术的广泛应用,人们越来越多地关注身份认证的安全,指纹识别因其隐私性和便捷性,已经成为当前发展最成熟的身份认证技术,在各个行业领域中都得到了广泛应用.除了有着重要的理论意义和应用价值之外,指纹识别技术也是一门能广泛应用在信息安全、网络安全、犯罪处理等多个领域的综合性技术.本文以本人在校外实习期间参与完成的高性能指纹识别芯片课题为基础,详细介绍了指纹组成、特征及指纹识别算法流程,并对各个步骤的原理和算法具体实现过程做出了详细描述,并结合C语言指纹识别算法,针对PC端对系统时间、系统空间以及函数代码这三个方面提出了一些优化策略和方法.然后详细介绍了用MFC图形化界面设计指纹预处理图形交互界面的流程,通过对C语言各个模块函数的调用展示了指纹录入、指纹预处理的功能,并对界面进行优化,增强了软件界面的灵活性.   本文将研究设计分为"C语言算法描述与优化"和"MFC图形化界面设计"这两个主要部分:(1)C语言算法描述与优化:对指纹识别算法中指纹图像采集、指纹图像预处理、指纹特征提取这三个关键步骤的原理进行了介绍,并结合C语言指纹识别算法,详细描述了各个步骤的原理和算法实现过程.针对PC端系统时间、系统空间的一些优化方案的原理和具体实现进行了说明和概述.主要内容包括系统时间优化的方案如Gabor滤波模块优化、算法数据浮点转定点,系统空间优化的方案如选择合适的数据结构和尽量小的数据类型,并概括了一些实习工作中总结的函数代码优化的方法.(2)MFC图形化界面设计:着重介绍用MFC中的C++类库设计一个指纹预处理系统界面,这个系统界面的目的是评估指纹预处理算法,在MFC对话框类的基础上添加不同的控件,通过对C语言的算法调用,在PC端展示从文件中选择指纹图像、指纹预处理图像显示、各模块阈值自定义设定等功能,并对界面进行优化,实现了界面与控件自适应、界面尺寸控制等功能,增强了软件界面的灵活性.最后,本文对研究工作进行总结,并在本论文的工作基础上提出了一些进一步的优化方案,对课题未来进行展望.
  • 所需E币: 5
    时间: 2024-3-1 10:10
    大小: 4.52MB
    上传者: htwdb
    本文中介绍了基于嵌入式的智能协议转换器工作原理、硬件设计及其软件设计。该协议转换器成功了解决了多种不同的控制网络之间的通信问题。
  • 所需E币: 0
    时间: 2024-3-5 11:09
    大小: 557.33KB
    上传者: 随遇而安1992
    这是一个系统测试报告的模板,可以根据个人实际工作内容进行填充,形成自己的系统测试报告
  • 所需E币: 0
    时间: 2024-2-26 10:46
    大小: 2.97KB
    上传者: 开心就很好了
    一、Spark3.0.0运行环境安装Spark常见部署模式:Local模式:在本地部署单个Spark服务所谓的Local模式,就是不需要其他任何节点资源就可以在本地执行Spark代码的环境,一般用于教学,调试,演示等。在IDEA中运行代码的环境称之为开发环境,和Local模式还是有区别的。Standalone模式:Spark自带的任务调度模式。(国内常用)YARN模式:Spark使用Hadoop的YARN组件进行资源与任务调度。(国内常用)Windows模式:为了方便在学习测试spark程序,Spark提供了可以在windows系统下启动本地集群的方式,这样,在不使用虚拟机或服务器的情况下,也能满足Spark的基本使用。Mesos&K8S模式:(了解)。Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核,在Twitter得到广泛使用,管理着Twitter超过30,0000台服务器上的应用部署,但是在国内,依然使用着传统的Hadoop大数据框架,所以国内使用Mesos框架的并不多,但是原理都差不多。容器化部署是目前业界很流行的一项技术,基于Docker镜像运行能够让用户更加方便地对应用进行管理和运维。容器管理工具中最为流行的就是Kubernetes(k8s),而Spark也在最近的版本中支持了k8s部署模式。1、配置javajdk1.8环境变量配置路径:电脑→属性→高级系统设置→环境变量path中加入:%JAVA_HOME%/bin。注:jdk版本不宜过高。2、配置scala2.12.0下载scala安装包,选择对应版本,这里我选择的是scala2.12.0版本。3、配置scala环境环境变量配置路径:此电脑→属性→高级系统设置→环境变量path中加入:%SCALA_HOME%/bin。验证配置cmd验证配置:scala-version4、配置Hadoop3.1.0Hadoop下载从Apache官网下载Hadoop,官网下载速度较慢,也可使用国内镜像下载。Hadoop环境变量配置,配置步骤同Scala配置。注意:需要把%HADOOP_HOME%\bin与%HADOOP_HOME%\sbin一同加入path中。5、配置Spark3.0.3Spark下载Spark环境配置,配置步骤同scala配置。注意:需要把%SPARK_HOME%\bin与%SPARK_HOME%\sbin一同加入path中。配置验证cmd命令:spark-shellSpark配置成功。二、spark实战Spark是用于大规模数据处理的统一分析引擎,也可以说是目前用于可伸缩计算的最广泛的引擎,成千上万的公司包括财富500强中的80%都在使用。Spark生态系统集成了丰富的数据科学、机器学习、SQL分析和BI、存储和基础设施等框架,并将这个生态使用可以扩展到数千台机器大规模数据使用。Spark提供了Java、Scala、Python和R的高级api,以及支持通用执行图的优化引擎。Spark支持一系列丰富的高级工具,包括用于SQL和结构化数据处理的SparkSQL,用于pandas工作负载的Spark上的pandasAPI,用于机器学习的MLlib,用于图形处理的GraphX,以及用于增量计算和流处理的StructuredStreaming。Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式,Spark的Standalone模式体现了经典的master-slave模式。#拷贝一个部署spark-standalone目录cp-rspark-3.3.0-bin-hadoop3spark-standalone#进入目录cdspark-standalone/cdconf#准备workers配置文件mvworkers.templateworkers#修改workers内容为viworkershadoop1hadoop2hadoop3#准备spark-env.sh配置文件mvspark-env.sh.templatespark-env.sh#spark-env.sh添加如下内容vispark-env.sexportJAVA_HOME=/home/commons/jdk8SPARK_MASTER_HOST=hadoop1SPARK_MASTER_PORT=7077#分发到其他两台上scp-r/home/commons/spark-standalonehadoop2:/home/commons/scp-r/home/commons/spark-standalonehadoop3:/home/commons/#进入根目录下sbin执行目录和启动cdsbin/./start-all.sh由于spark-shell停止掉后,集群监控页面就看不到历史任务的运行情况,所以开发时都配置历史服务器记录任务运行情况。#先停止前面启动的集群./stop-all.sh#准备spark-defaults.confcd../confmvspark-defaults.conf.templatespark-defaults.conf#修改spark-defaults.confvimspark-defaults.confspark.eventLog.enabled     truespark.eventLog.dir       hdfs://myns:8020/sparkhis#需要启动Hadoop集群,HDFS上的目录需要提前存在hadoopfs-mkdir/sparkhis#修改spark-env.sh文件,添加如下配置:vispark-env.shexportSPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://myns:8020/sparkhis-Dspark.history.retainedApplications=30"#参数1含义:WEBUI访问的端口号为18080#参数2含义:指定历史服务器日志存储路径(读)#参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。由于hadoop是HA模式因此配置为hdfs-site.xml下的dfs.nameservices的value值  <property>    <name>dfs.nameservices</name>    <value>myns</value><!--core-site.xml的fs.defaultFS使用该属性值-->  </property>#分发配置到另外两台上scpspark-defaults.confspark-env.shhadoop2:/home/commons/spark-standalone/conf/scpspark-defaults.confspark-env.shhadoop3:/home/commons/spark-standalone/conf/#启动集群./start-all.sh#启动历史服务./start-history-server.sh
  • 所需E币: 0
    时间: 2024-2-20 14:51
    大小: 2.59KB
    一、《flink实时规则营销系统》项目背景传统的“精准营销平台”由营销人员基于画像标签数据去圈选人群,进行营销推送,存在不足;这种传统手段,往往无法抓住那些“转瞬即逝的营销机会”;如:一个促销狂热型用户,正在浏览包包时,及时推送出正在做促销活动的包包信息,是最有效的;如:一个价格敏感型用户,正在犹豫不决反复查看他购物车中的某目标商品时,适时推送优惠券,是最有效的;这些场景,显然无法通过营销人员通过人工手段去发现,需要用软件系统自动、实时监控用户的行为,并实时做出判断,并进而驱动营销消息推送系统推送相关营销内容;总之,在应对这一类的需求时,以前的传统的“基于用户画像标签库的精准营销平台”显得力不从心;因而,擅长用键鼠改变世界的攻城狮们,决定为公司的推广、运营部门开发一个应对上述场景的自动化、智能的、实时、规则动态可变的营销利器——《实时动态规则智能运营系统》二、需求分析2.1营销规则举例-搜索兴趣词包含“商务休闲”的用户,如果浏览包含“商务休闲”的商品页面,则触发一个优惠券推送消息;-活跃度等级为C的用户,且在规则发布前的3天内,发生过“搜索雀巢”AND“加购”,当他再次上线时,触发一个app弹窗消息;-活跃度等级为C的用户,规则发布前2天内,发生过A事件3次以上,规则上线后发生了B事件,且之后间隔1天再次发生B事件,则触发;-规则运行时,检测到用户发生了下单事件,而在随后的15分钟内没有支付,则触发;-规则运行时,一个用户如果搜索的关键词符合某正则表达式,则触发;-宝妈用户,在2022-08-07开始,做过A行为3+次,做过(B行为,E行为)序列2+次,则触发;2.2规则营销需求的宏观抽象-营销规则有多样化的灵活的定义(不光参数可以支持自定义,且运算模型也可以自定义);-营销规则通常针对满足某画像的人群,也可没有针对性-营销规则通常都有有效期(也有可能是无限期的),要求系统能够支持动态增加、停用运营计划(规则)-营销规则根据需求的变化,需要能够方便地进行在线管理,如新增、停用、修改三、行为判断的逻辑分析1)行为判断:行为事件的类型及属性的判断判断用户的某个行为事件,是否是规则条件中要求的事件-简单的,可能就是 event_id="X"   ANDproperties["p1"]=/>/!=/<"v1"-稍微复杂的,可能就是  event_id="X"   AND  properties["p1"] 包含"kw1"-再复杂点的,可能就是  event_id="X"   AND properties["p1"] +properties["p2"]>100   ANDproperties["p3"]满足正则表达式 [1,10]*?a2)行为序列的判断判断用户的一系列行为事件中,是否满足规则条件所要求的依次发生的序列,比如A  B  E行为序列判断,是上述“行为判断”的衍生本质上,就是在判断事件的基础上,加上时间先后的序列关系这个逻辑,可以用正则匹配进行计算(全窗口运算); 也可以用滚动聚合的方式计算;3)事件(序列)发生次数的判断判断要求的事件或事件序列,发生了多少次是上述“行为判断”、“行为序列判断”的衍生本质上,就是在判断事件(或序列)的基础上,进行次数累计四、画像条件判断的实现难点初略考虑,应该就是查询用户画像标签库即可;站在系统的角度来考虑时:什么时机去查询? 去哪里查?比如: 查询时机: 当一个人的某个行为触发了某个规则,此时去查询该用户的画像标签是否满足规则的人群画像条件查询的目标: 用户画像标签数据库如果画像数据库在hbase中,可以用如下伪代码来快速判断##如果条件是:活跃等级=C  AND   首单时间<"2022-06-01"get=newGet(guid)get.addColumn("活跃等级")get.addColumn("首单时间")result=table.get(Get)activeLevel=result.getValue("活跃等级")firstOrderDate=result.getValue("首单时间")if(activeLevel='C' && firstOrderDate<"2022-06-01") returntrue;##如果条件是:兴趣词:包含"速溶咖啡"##这种条件,用hbase的支撑就不太好处理了//favroitWords:[海底捞,咖啡伴侣,小罐速溶咖啡,乔丹,篮球]favroitWords=result.getValue("兴趣词")  
  • 所需E币: 0
    时间: 2024-2-20 10:28
    大小: 3.01KB
    上传者: 开心就很好了
    flink实时规则营销系统(39期,2023版)——简单来说,本系统核心是一个基于事件驱动且可进行动态规则计算的实时系统,在技术上它是通用的;本套架构及系统内核,不仅可以用于“实时运营”,也可以用于“实时风控”,“实时推荐”,“实时交通监控”等场景。运营场景举例:下单促付款,新品发布信息精准送达。本系统,在核心规则引擎之外,也集成了大量metric及跟踪数据输出,能在系统中及系统外进行多维度数据分析,以深度掌握各类市场运营活动的效果,以及系统运行的各类状态什么是flink?flink是一个分布式,高性能,随时可用的以及准确的流处理计算框架,flink可以对无界数据(流处理)和有界数据(批处理)进行有状态计算(flink天生支持状态计算)的分布式,高性能的计算框架。flink的基石flink的四大基石:checkpoint,state,time,windowcheckpoint:基于chandy-lamport算法实现分布式计算任务的一致性语义;state:flink中的状态机制,flink天生支持state,state可以认为程序的中间计算结果或者是历史计算结果;time:flink中支持基于事件时间和处理时间进行计算,sparkstreaming只能按照processtime进行处理;基于事件时间的计算我们可以解决数据迟到和乱序等问题。window:flink提供了更多丰富的window,基于时间,基于数量,sessionwindow,同样支持滚动和滑动窗口的计算。Flink的应用Flink是一个大数据流处理引擎,它可以为不同的行业提供大数据实时处理的解决方案。随着Flink的快速发展完善,如今在世界范围许多公司都可以见到Flink的身影。目前在全球范围内,北美、欧洲和金砖国家均是Flink的应用热门区域。当然,这些地区其实也就是IT、互联网行业较发达的地区。Flink在国内热度尤其高,一方面是因为阿里的贡献和带头效应,另一方面也跟中国的应用场景密切相关。中国的人口规模与互联网使用普及程度,决定了对大数据处理的速度要求越来越高,也迫使中国的互联网企业去追逐更高的数据处理效率。试想在中国,一个网站可能要面对数亿的日活用户、每秒数亿次的计算峰值,这对很多国外的公司来说是无法想象的。而Flink恰好给我们高速准确的处理海量流式数据提供了可能。Flink环境部署:要了解一个系统,一般都是从架构开始。我们关心的问题是:系统部署成功后各个节点都启动了哪些服务,各个服务之间又是怎么交互和协调的。当Flink集群启动后,首先会启动一个JobManger和一个或多个的TaskManager。由Client提交任务给JobManager,JobManager再调度任务到各个TaskManager去执行,然后TaskManager将心跳和统计信息汇报给JobManager。TaskManager之间以流的形式进行数据的传输。上述三者均为独立的JVM进程。Client为提交Job的客户端,可以是运行在任何机器上(与JobManager环境连通即可)。提交Job后,Client可以结束进程(Streaming的任务),也可以不结束并等待结果返回。JobManager主要负责调度Job并协调Task做checkpoint,职责上很像Storm的Nimbus。从Client处接收到Job和JAR包等资源后,会生成优化后的执行计划,并以Task的单元调度到各个TaskManager去执行。TaskManager在启动的时候就设置好了槽位数(Slot),每个slot能启动一个Task,Task为线程。从JobManager处接收需要部署的Task,部署启动后,与自己的上游建立Netty连接,接收数据并处理。本地模式环境部署步骤如下:#1.下载安装包并上传到/usr/local/src目录#2.解压安装包并重命名为flink[root@nodesrc]$tar-zxfflink-1.14.4-bin-scala_2.12.tgz[root@nodesrc]$tar-zxfjdk-8u111-linux-x64.tar.gz#3.修改安装包所属用户和用户组权限[root@nodesrc]$chown-Rroot.rootflink-1.14.5#4.配置Flink环境变量并重新加载使其生效[root@nodesrc]$vim~/.bash_profileexportJAVA_HOME=/usr/local/src/jdk1.8.0_111/exportFLINK_HOME=/usr/local/src/flink-1.14.5/exportPATH=$PATH:$JAVA_HOME/bin:$FLINK_HOME/bin[root@nodesrc]$source~/.bash_profile#4.启动"集群"[root@nodesrc]$start-cluster.shStartingcluster.Startingstandalonesessiondaemononhostnode.Startingtaskexecutordaemononhostnode.[root@nodesrc]$jps17186Jps17078TaskManagerRunner16809StandaloneSessionClusterEntrypoint#5.访问WebUI界面8081端口查看运行情况分发Flink安装包配置到另外两个节点使用Linuxscp命令把node01节点的配置分发到另外两个节点上。#使用scp分发[root@node01conf]$cd/usr/local[root@node01local]$scp-rflinknode02:/usr/local/[root@node01local]$scp-rflinknode03:/usr/local/启动Flink集群#批量统一启动[root@node01bin]$start-cluster.shStartingcluster.Startingstandalonesessiondaemononhostnode01.Startingtaskexecutordaemononhostnode01.Startingtaskexecutordaemononhostnode02.Startingtaskexecutordaemononhostnode03. #单独启动[root@node01bin]$ jobmanager.shstart/stop[root@node01bin]$ taskmanager.shstart/stop #使用脚本查看服务进程[root@node01bin]$jps
  • 所需E币: 0
    时间: 2023-12-21 11:36
    大小: 3.66KB
    一个完整的在线办公系统具备哪些功能:1、线下会议管理功能2、审批会议申请功能3、TRTC在线视频会议功能4、罚款模块5、请假管理6、报销管理那么,如何去开发这样一个在线办公的系统,这样的系统用到哪些技术才能实现?接下来,我将带着大家一步步来开发这样的办公系统。这个项目我用的技术有:SpringBoot2.4.1,SpringMVC5.3.1,MyBatis3.5.7,VUE3.0.3,ElementUIplus1.0.2。第一步,环境搭建数据库mysql我用的是8.0版本,使用Navicat作为MySQL的客户端,大家可以到网上下载Navicat安装文件。另外,强烈建议大家的操作系统要用Win10,不建议大家使用Win7或者Win11系统。安装客户端程序(RedisDesktopManager),如果是MacOS的用户,可以到软件商店中查找免费的Redis客户端软件。MongoDB的客户端,我们使用Navicat就可以,写上正确的连接信息就能连接上MongoDB。我们不需要向MongoDB导入数据,将来使用的过程中,MongoDB会积累业务数据。安装JDK,大家本地的JDK尽量使用1.8+的版本吧安装Maven环境,后端Java项目使用Maven构建,所以大家要在本地建立Maven环境第二步就是最关键的代码实战部分:用上了GROUP_CONCAT()函数,我们的SQL语句变成了下面的样子SELECTu.username,    d.dept_nameASdeptName,( SELECTGROUP_CONCAT(role_nameseparator",") FROMtb_role WHEREJSON_CONTAINS(u.role,CONVERT(id,CHAR)) )ASrolesFROMtb_useruJOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))LEFTJOINtb_deptdONu.dept_id=d.idWHERE r.role_name="超级管理员" 了解过SQL语句的各种语法之后,下面才是我们正式要写的SQL语句。<selectid="searchUserByPage"parameterType="HashMap"resultType="HashMap">  SELECT    DISTINCTu.id,    u.name,    u.sex,    u.tel,    u.email,    d.dept_nameASdept,    u.hiredate,    u.root,    u.status,    (SELECTGROUP_CONCAT(role_nameseparator",")FROMtb_roleWHEREJSON_CONTAINS(u.role,CONVERT(id,CHAR)))ASroles  FROMtb_useru  JOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))  LEFTJOINtb_deptdONu.dept_id=d.id  WHERE1=1  <iftest="name!=null">    ANDu.nameLIKE"%${name}%"  </if>  <iftest="sex!=null">    ANDu.sex=#{sex}  </if>  <iftest="role!=null">    ANDr.role_name=#{role}  </if>  <iftest="deptId!=null">    ANDd.id=#{deptId}  </if>  <iftest="status!=null">    ANDu.status=#{status}  </if>  LIMIT#{start},#{length}</select><selectid="searchUserCount"parameterType="HashMap"resultType="long">  SELECT     COUNT(DISTINCTu.id)  FROMtb_useru  JOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))  WHERE1=1  <iftest="name!=null">    ANDu.nameLIKE"%${name}%"  </if>  <iftest="sex!=null">    ANDu.sex=#{sex}  </if>  <iftest="role!=null">    ANDr.role_name=#{role}  </if>  <iftest="deptId!=null">    ANDu.dept_id=#{deptId}  </if>  <iftest="status!=null">    ANDu.status=#{status}  </if></select>在UserServiceImpl.java类中实现抽象方法。publicclassUserServiceImplimplementsUserService{  ……  @Override  publicPageUtilssearchUserByPage(HashMapparam){    ArrayList<HashMap>list=userDao.searchUserByPage(param);    longcount=userDao.searchUserCount(param);    intstart=(Integer)param.get("start");    intlength=(Integer)param.get("length");    PageUtilspageUtils=newPageUtils(list,count,start,length);    returnpageUtils;  }}在Vue的声明周期回调函数created()中调用了loadRoleList()和loadDeptList()函数,所以可以保证用户管理页面显示的时候,部门列表和角色列表的数据都是从数据库中查询得来的。<el-table  :data="dataList"  border  v-loading="dataListLoading"  @selection-change="selectionChangeHandle"  cell-style="padding:4px0"  style="width:100%;"  size="medium">  <el-table-columntype="selection"header-align="center"align="center"width="50"/>  <el-table-columntype="index"header-align="center"align="center"width="100"label="序号">    <template#default="scope">      <span>{{(pageIndex-1)*pageSize+scope.$index+1}}</span>    </template>  </el-table-column>  <el-table-columnprop="name"header-align="center"align="center"min-width="100"label="姓名"/>  <el-table-columnprop="sex"header-align="center"align="center"min-width="60"label="性别"/>  <el-table-columnprop="tel"header-align="center"align="center"min-width="130"label="电话"/>  <el-table-column    prop="email"    header-align="center"    align="center"    min-width="240"    label="邮箱"    :show-overflow-tooltip="true"  />  <el-table-columnprop="hiredate"header-align="center"align="center"min-width="130"label="入职日期"/>  <el-table-column    prop="roles"    header-align="center"    align="center"    min-width="150"    label="角色"    :show-overflow-tooltip="true"  />  <el-table-columnprop="dept"header-align="center"align="center"min-width="120"label="部门"/>  <el-table-columnprop="status"header-align="center"align="center"min-width="100"label="状态"/>  <el-table-columnheader-align="center"align="center"width="150"label="操作">    <template#default="scope">      <el-button        type="text"        size="medium"        v-if="isAuth(['ROOT','USER:UPDATE'])"        @click="updateHandle(scope.row.id)"      >        修改      </el-button>      <el-button        type="text"        size="medium"        v-if="isAuth(['ROOT','USER:UPDATE'])"        :disabled="scope.row.status=='离职'||scope.row.root"        @click="dimissHandle(scope.row.id)"      >        离职      </el-button>      <el-button        type="text"        size="medium"        :disabled="scope.row.root"        v-if="isAuth(['ROOT','USER:DELETE'])"        @click="deleteHandle(scope.row.id)"      >        删除      </el-button>    </template>  </el-table-column></el-table>在TbRoleDao.xml文件中,定义SQL用于查询角色分页数据。看上面的截图可知,在角色管理页面上,只有按照角色名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个角色拥有的权限数量,而且tb_role表的permissions字段是JSON数组格式,所以我们统计数组的元素数量,就是该角色拥有的权限数量。恰好JSON_LENGTH()函数能获取JSON数组的长度,所以我就用在SQL语句中了。@Data@Schema(description="查询角色分页表单")publicclassSearchRoleByPageForm{  @Pattern(regexp="^[0-9a-zA-Z\\u4e00-\\u9fa5]{1,10}$",message="roleName内容不正确")  @Schema(description="角色名称")  privateStringroleName;  @NotNull(message="page不能为空")  @Min(value=1,message="page不能小于1")  @Schema(description="页数")  privateIntegerpage;  @NotNull(message="length不能为空")  @Range(min=10,max=50,message="length必须在10~50之间")  @Schema(description="每页记录数")  privateIntegerlength;}在TbDeptDao.xml文件中,定义SQL用于查询部门分页数据。看上面的截图可知,在部门管理页面上,只有按照部门名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个部门拥有的员工数量,所以用了COUNT()汇总函数。publicclassDeptServiceImplimplementsDeptService{  ……  @Override  publicPageUtilssearchDeptByPage(HashMapparam){    ArrayList<HashMap>list=deptDao.searchDeptByPage(param);    longcount=deptDao.searchDeptCount(param);    intstart=(Integer)param.get("start");    intlength=(Integer)param.get("length");    PageUtilspageUtils=newPageUtils(list,count,start,length);    returnpageUtils;  }}在DeptController.java类中,定义Web方法,然后大家就可以在Swagger页面测试Web方法了。publicclassDeptController{……  @PostMapping("/searchDeptByPage")  @Operation(summary="查询部门分页数据")  @SaCheckPermission(value={"ROOT","DEPT:SELECT"},mode=SaMode.OR)  publicRsearchDeptByPage(@Valid@RequestBodySearchDeptByPageFormform){    intpage=form.getPage();    intlength=form.getLength();    intstart=(page-1)*length;    HashMapparam=JSONUtil.parse(form).toBean(HashMap.class);    param.put("start",start);    PageUtilspageUtils=deptService.searchDeptByPage(param);    returnR.ok().put("page",pageUtils);  }}本文到此告一段落,感谢大家的观看!
  • 所需E币: 1
    时间: 2023-12-21 17:37
    大小: 44.95MB
    上传者: 魏治亮
    GB∕T40134-2021航天系统电磁兼容性要求.pdf
  • 所需E币: 1
    时间: 2023-12-23 13:44
    大小: 1.14MB
    上传者: 魏治亮
    GB∕T38909-2020民用轻小型无人机系统电磁兼容性要求与试验方法.pdf
  • 所需E币: 2
    时间: 2023-12-22 14:55
    大小: 137.14MB
    上传者: 浩瀚星蓝
    这本书应当是市面上最好的模电书籍,相比于国内教材的晦涩难懂,这本书讲解的十分透彻,对于小白来说,十分容易理解。
  • 所需E币: 0
    时间: 2023-12-1 16:19
    大小: 3.49KB
    实际搭建流程:下载鸿蒙源码→docker拉取镜像→创建容器→进入容器→下载hb编译工具(也可使用build.sh、build.py脚本编译,但是不如hb辅助工具指令好用)→编译(内核、芯片厂商的uboot、系统镜像...)1.准备开发环境:首先,您需要设置用于鸿蒙应用程序开发的开发环境。2.学习鸿蒙应用程序开发:了解鸿蒙应用程序开发的基础知识,包括鸿蒙应用程序的架构、UI设计和鸿蒙系统的特性。3.开发应用程序:使用鸿蒙开发工具,开始编写您的应用程序代码。您可以创建各种类型的应用程序,包括手机应用、平板电脑应用、电视应用、手表应用等。4.设计用户界面:使用鸿蒙的UI组件和工具,设计用户界面。鸿蒙提供了一套UI框架,可以帮助您创建吸引人的用户界面。5.数据处理和功能开发:根据您的应用程序需求,编写数据处理逻辑和应用程序功能。鸿蒙支持多种编程语言,包括Java、C、C++和JS。6.测试和调试:在真机或模拟器上测试您的应用程序,以确保它正常运行。鸿蒙提供了调试工具,以帮助您发现和解决问题。7.发布应用程序:一旦应用程序准备就绪,您可以将其发布到鸿蒙应用程序商店或其他应用程序分发渠道。8.更新和维护:定期更新和维护您的应用程序,以确保它与鸿蒙系统的最新版本兼容,并提供新功能和修复问题。使用store.commit方法来调用:store.commit('事件类型/函数名'),代码片段如下所示:1)在Vue中调用mutations:exportconststore=createStore({   //...   mutations:{   setCount(state,payload){   state.count+=payload   returnstate.count   }   }   //...  })action中可以通过提交**mutation**来修改状态,不直接修改状态action中可以做一些异步操作提供一个上下文,可以直接使用commit、state、getters等,代码片段如下所示:exportconststore=createStore({   //...   actions:{   fetchCount({commit,state,getters},payload){//{commit,state,getters}为上下文   setTimeout(()=>{   commit('setCount',5)   console.log(state.count)   console.log(getters.getCount)   },3000);   }   }  })getter类似与Vue中的computed计算属性,它的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算getters里可以处理一些array、object的查询、过滤、遍历、重构或者做一些字符拼接的操作,方便直接生成一些可以直接使用的数据。如下代码片段展示了如何在getter中进行过滤查询:exportconststore=createStore({   state:{   todos:[  //定义一个对象数组   {   id:1,   done:true   },   {   id:2,   done:false   }   ]   }   getters:{   doneTodosCount(){ //查询已完成的个数   returnstore.state.todos.filter(todo=>todo.done).length //返回值:1   }   }  })首先使用Typescript的interface为store中的所有state声明类型,然后将interface放置在InjectionKeyd的泛型类型中,代码片段如下://src/store/index.tsimport{createStore,Store}from'vuex'import{InjectionKey}from'vue'//为storestate声明类型exportinterfaceAllStateTypes{ count:number, locale:any, userStatus:Number}//定义injectionkeyexportconstkey:InjectionKey<Store<AllStateTypes>>=Symbol('storeKey')exportconststore=createStore<AllStateTypes>({ //...})我们使用Nodejs框架Express来快速搭建一个后端服务,首选需要安装一下Express,在终端运行npminstallexpress--save-dev,Vite官方提供一个基于服务端渲染的NodeServer模板,代码片段如下://server.jsconstfs=require('fs')constpath=require('path')constexpress=require('express')const{createServer:createViteServer}=require('vite')asyncfunctioncreateServer(){ constapp=express() //以中间件模式创建Vite应用,这将禁用Vite自身的HTML服务逻辑 //并让上级服务器接管控制 // //如果你想使用Vite自己的HTML服务逻辑(将Vite作为 //一个开发中间件来使用),那么这里请用'html' constvite=awaitcreateViteServer({  server:{middlewareMode:'ssr'} }) //使用vite的Connect实例作为中间件 app.use(vite.middlewares) app.use('*',async(req,res)=>{  consturl=req.originalUrl  try{   //1.读取index.html   lettemplate=fs.readFileSync(    path.resolve(__dirname,'index.html'),    'utf-8'   )   //2.应用ViteHTML转换。这将会注入ViteHMR客户端,   //  同时也会从Vite插件应用HTML转换。   //  例如:@vitejs/plugin-react-refresh中的globalpreambles   template=awaitvite.transformIndexHtml(url,template)   //3.加载服务器入口。vite.ssrLoadModule将自动转换   //  你的ESM源码使之可以在Node.js中运行!无需打包   //  并提供类似HMR的根据情况随时失效。   const{render}=awaitvite.ssrLoadModule('/src/entry-server.ts')   //4.渲染应用的HTML。这假设entry-server.ts导出的`render`   //  函数调用了适当的SSR框架API。   //  例如ReactDOMServer.renderToString()   constappHtml=awaitrender(url)   //5.注入渲染后的应用程序HTML到模板中。   consthtml=template.replace('<!--ssr-outlet-->',appHtml)   //6.返回渲染后的HTML。   res.status(200).set({'Content-Type':'text/html'}).end(html)  }catch(e){   //如果捕获到了一个错误,让Vite来修复该堆栈,这样它就可以映射回   //你的实际源码中。   vite.ssrFixStacktrace(e)   console.error(e)   res.status(500).end(e.message)  } }) app.listen(3000)}createServer()在终端执行命令:npminstall-Dunplugin-vue-componentsunplugin-auto-import,接着在vite.config.ts中做如下配置://vite.config.tsimportAutoImportfrom'unplugin-auto-import/vite'importComponentsfrom'unplugin-vue-components/vite'import{ElementPlusResolver}from'unplugin-vue-components/resolvers'exportdefault{ plugins:[  //...  AutoImport({   resolvers:[ElementPlusResolver()],  }),  Components({   resolvers:[ElementPlusResolver()],  }), ],}
  • 所需E币: 0
    时间: 2023-12-4 13:41
    大小: 3.08KB
    什么是风控系统?风控系统是指一系列的完整的风险控制,以保证事情向好的方向发展,而免受不可预估的经济和财产损失而措手不及。风控类型风控类型一般分为事前、事中、事后三种。事前风控是指在交易指令发送到交易所前,对交易指令进行风险检测,通过检测的交易指令则提交到交易模块进行报单,未通过检测的交易指令将直接予以拒绝。对于追求低延时的交易策略,事前风控需要在极短的时间内完成。事中风控主要是指在交易过程中,交易团队对策略的信号生成、执行情况进行监控以及盘中对策略的风险度进行实时监控。事后风控是对交易数据在盘后进行分析,比如策略算法是否存在错误、策略的回撤是否可控、是否有计划外的持仓出现等,从而制定更严谨的业务风控预案和优化代码算法调整策略表现。在src文件夹中创建一个新文件,文件命名为“AppState.tsx”,我们将会在这个文件中创建全局state和上下文组件contexcomponent。首先,引入我们需要的react框架。interfaceAppStateValue{username:string,shoppingCart:{items:{id:number;name:string}[];};}然后,打开Header.tsx,在这个文件中我们创建一个新的函数式react组件,顺便引入我们的css样式文件importReactfrom"react";importstylesfrom"./Header.module.css";exportconstHeader:React.FC=()=>{return()}那么接下来,我们来把signin页面从路径JSX代码中挪出去,以页面组件的形式渲染出来。既然是页面,那么我们在pages文件夹中创建signin的相关页面吧。在pages文件夹中创建子文件夹signin,然后创建我们的三大金刚,index.ts,SignInPage.tsx,以及SignInPage.module.css。请同学们先打开SignInPage.tsx,我们先为页面创建一个最简单的函数式组件,组件内渲染一个H1标题,标题名称登陆页面。importReactfrom"react";exportconstSignInPage:React.FC=()=>{  return<h1>SignIn</h1>;};打开DetailPage.tsx,我们先引入react框架,创建一个最基本的函数式组件importReactfrom"react";exportconstDetailPage:React.FC=(props)=>{return(<div><h1>旅游路线详情页面</h1></div>);};这个get的返回值是一个promise。我们需要使用.then函数来处理,函数的参数是个lamda表达式,而我们关心的是响应的主体数据,也就是reponse.data,可以简单使用花括号在参数中直接展开reponse,取得data。理论上来说,响应数据data的类型应该与postman中的输出结果是一摸一样的,所以,我们把数据添加到组件state的产品列表1、2、3中。componentDidMount(){axios.get('http://123.56.149.216:8080/api/productCollections',{headers:{'x-icode':'FB80558A73FA658E',},}).then(({data})=>{this.setState({productList1:data});})}函数体内使用async,这个函数本身也必须是async,所以我们给componentDidMount加上async关键词。因为axios.get的返回值本来就是一个promise,所以我们可以给它加上await,等待get请求的执行,并取得响应数据response,而我们需要的是响应的主体数据data,可以使用花括号直接展开。于是,我们就获得了与postman一样的数据,接下来的代码就和promisethen一样了,稍微整理一下。asynccomponentDidMount(){const{data}=awaitaxios.get("http://123.56.149.216:8080/api/productCollections",{headers:{"x-icode":"FB80558A73FA658E",},});this.setState({loading:false,productList:data});}但是如果api访问错误。我们就需要使用trycatch来捕获error了,出错的时候我们同样要吧loading设置为false,但是这个时候error就要被切换为错误信息了,e.message.interfaceStateProps{loading:boolean,productList:any[],}constructor(props){super(props)this.state={loading:true,error:null,productList:[],};}asynccomponentDidMount(){try{const{data}=awaitaxios.get("http://123.56.149.216:8080/api/productCollections");this.setState({loading:false,error:null,productList1:data,});}catch(e){this.setState({loading:false,error:e.message,});}}Ok,转菊花的控制状态配置完成,接下来就要在jsx代码中转菊花了,从组件state中展开loading和error。我们依旧使用最简单的方法,直接暴力使用一个if语句,当loading为ture的时候输出转菊花,就是渲染Spin组件,设置size大小为最大,“large”。然后定义一些inlinestyleif(loading){return(<Spinsize="large"style={{marginTop:200,marginBottom:200,marginLeft:"auto",marginRight:"auto",width:"100%",}}/>);}接下来,我们来复制粘题一下代码。请同学们打开DetailPage。我们把useEffect中所有的数据请求代码全部剪切出来。复制到getProductDetail的callback函数中去。接着给dispatch加上thunkAPI。然后还有一个报错,我们需要引用axiosimport axios from "axios";  export const getProductDetail=createAsyncThunk("productDetail/getProductDetail",async(touristRouteId:string,thunkAPI)=>{thunkAPI.dispatch(productDetailSlice.actions.fetchStart());try{const{data}=await axios.get(`http://123.56.149.216:8080/api/touristRoutes/${touristRouteId}`);thunkAPI.dispatch(productDetailSlice.actions.fetchSuccess(data));}catch(error){thunkAPI.dispatch(productDetailSlice.actions.fetchFail(error.message));}});在callback函数中去掉所有的dispatch,然后也删掉trycatch,因为我们将会返回promise,让promise自己来处理。所以retun的应该是data这个对象。export const getProductDetail=createAsyncThunk("productDetail/getProductDetail",async(touristRouteId:string,thunkAPI)=>{const{data}=await axios.get(`http://123.56.149.216:8080/api/touristRoutes/${touristRouteId}`);return data;});
  • 所需E币: 0
    时间: 2023-11-29 14:22
    大小: 4.78KB
    大家好,今天我将给大家分享关于如何开发一个数据库系统的知识,将从0到1手把手带着一步步去开发这个项目,希望我的分享对大家的学习和工作有所帮助,如果有不足的地方还请大家多多指正。一、什么是数据库系统数据库系统一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成 二、数据库管理系统的主要功能包括数据定义功能:DBMS提供数据定义语言(DataDefinitionLanguage,DDL),用户通过它可以方便地对数据库中的对象进行定义数据组织、存储和管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存取路径等。数据操纵功能:DBMS提-供数据操纵语言(DataManipulationLanguage,DML),用户可以使用DML操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等数据库的事务管理和运行管理:数据库在建立、运用和维护时由数据管理系统统一管理、统一控制,以保证数据的安全性、完整性、多用户对数据的并发使用以及发生故障后的系统恢复数据库建立和维护功能:数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。三、数据库系统结构1.1模式(概念模式或逻辑模式)定义:数据库中全体数据的逻辑结构特征的描述,是所有用户的公用数据库结构。特性:一个数据库只有一个模式模式与应用程序无关,只是数据的一个框架1.2子模式(外模式或用户模式)定义:数据库用户所见和使用的局部数据的逻辑结构和特征的描述,是用户所用的数据库结构特性:子模式是模式的子集一个数据库有多个子模式,每个用户至少使用一个子模式同一个用户可以使用不同的子模式,每个子模式可为不同的用户所用1.3内模式(存储模式)定义:是数据物理结构和存储方法的描述。它是整个数据库的最低层结构的表示。特性:一个数据库只有一个内模式,内模式对用户透明一个数据库由多种文件组成,如用户数据文件,索引文件及系统文件内模式设计直接影响数据库的性能以下是开发流程:在idea中构建如下几个子模块工程:@PostMapping("/doLogin")@ApiOperation(value="一键注册登录接口",notes="一键注册登录接口",httpMethod="POST")publicGraceJSONResultdoLogin(HttpServletRequestrequest,                HttpServletResponseresponse,                @RequestBody@ValidRegisterLoginBOregisterLoginBO,                BindingResultresult);验证的字段上方可以写一些相关的注解,系统识别后会自动检查RegisterLoginBO.javapublicclassRegisterLoginBO{  @NotBlank(message="手机号不能为空")  privateStringmobile;  @NotBlank(message="短信验证码不能为空")  privateStringsmsCode;  publicStringgetMobile(){    returnmobile;  }  publicvoidsetMobile(Stringmobile){    this.mobile=mobile;  }  publicStringgetSmsCode(){    returnsmsCode;  }  publicvoidsetSmsCode(StringsmsCode){    this.smsCode=smsCode;  }  @Override  publicStringtoString(){    return"RegisterLoginBO{"+        "mobile='"+mobile+'\''+        ",smsCode='"+smsCode+'\''+        '}';  }}如果校验有问题,那么可以直接获得并且放回给前端即可。BaseController.java/** *验证beanBO中的字段错误信息 *@paramresult *@return */publicMap<String,String>getErrors(BindingResultresult){  Map<String,String>map=newHashMap<>();  List<FieldError>errorList=result.getFieldErrors();  for(FieldErrorerror:errorList){    //发生验证错误所对应的某一个属性    StringerrorField=error.getField();    //验证错误的信息    StringerrorMsg=error.getDefaultMessage();    map.put(errorField,errorMsg);  }  returnmap;}一般来说,admin系统不会有主动注册功能,账号都是分配的,那么默认就会存在一个基本账户,这也是预先通过代码生成用户名和密码的。直接手动生成即可:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>同理,查询操作也是类似JPA的操作,再继承Repository后直接使用其内置api即可:FriendLinkMngControllerApi.java@PostMapping("getFriendLinkList")@ApiOperation(value="查询友情链接列表",notes="查询友情链接列表",httpMethod="POST")publicGraceJSONResultgetFriendLinkList();首先可以在数据库通过写sql脚本实现查询SELECTc.idascommentId,c.father_idasfatherId,c.article_idasarticleId,c.comment_user_idascommentUserId,c.comment_user_nicknameascommentUserNickname,c.contentascontent,c.create_timeascreateTime,f.comment_user_nicknameasquoteUserNickname,f.contentasquoteContentFROMcommentscLEFTJOINcommentsfonc.father_id=f.idWHEREc.article_id='2006117B57WRZGHH'orderbyc.create_timedesc目前我们所搭建的eureka是单机单实例的注册中心,如果挂了,那么整个微服务体系完全不可以,这是不应该的,所以为了实现eureka的高可用,我们可以搭建集群。在进行集群构建之前,大家先参照目前的eureka再去构建一个一模一样的工程,可以取名为springcloud-eureka-cluster。为集群中各个eureka节点配置hosteureka: instance:  hostname:eureka-cluster-${port:7001}  #集群中每个eureka的名字都要唯一 #自定义eureka集群中另外的两个端口号 other-node-port2:${p2:7002} other-node-port3:${p3:7003} client:#  register-with-eureka:false#  fetch-registry:false  service-url:   #集群中的每个eureka单实例,都需要相互注册到其他的节点,在此填入集群中其他eureka的地址进行相互注册   defaultZone:http://eureka-cluster-${eureka.other-node-port2}:${eureka.other-node-port2}/eureka/,http://eureka-cluster-${eureka.other-node-port3}:${eureka.other-node-port3}/eureka/我们自己测试的时候时间可以设置为10秒内有10次,我认定非法请求,直接限制这个ip访问15秒,15秒后释放。(像有的网站会出现二维码让你扫描通过,或者手机验证码或者人机交互判断你当前是否是人还是机器,因为有可能是爬虫请求)开发步骤:首先在yml中设置基本参数:@OverridepublicObjectrun()throwsZuulException{  System.out.println("执行【IP黑名单】Zuul过滤器...");  //获得上下文对象requestContext  RequestContextrequestContext=RequestContext.getCurrentContext();  HttpServletRequestrequest=requestContext.getRequest();  //获得ip  Stringip=IPUtil.getRequestIp(request);  /**   *需求:   *判断ip在10秒内请求的次数是否超过10次,   *如果超过,则限制访问15秒,15秒过后再放行   */  finalStringipRedisKey="zuul-ip:"+ip;  finalStringipRedisLimitKey="zuul-ip-limit:"+ip;  //获得剩余的限制时间  longlimitLeftTime=redis.ttl(ipRedisLimitKey);  //如果剩余时间还存在,说明这个ip不能访问,继续等待  if(limitLeftTime>0){    stopRequest(requestContext);    returnnull;  }  //在redis中累加ip的请求访问次数  longrequestCounts=redis.increment(ipRedisKey,1);  //从0开始计算请求次数,初期访问为1,则设置过期时间,也就是连续请求的间隔时间  if(requestCounts==1){    redis.expire(ipRedisKey,timeInterval);  }  //如果还能取得到请求次数,说明用户连续请求的次数落在10秒内  //一旦请求次数超过了连续访问的次数,则需要限制这个ip了  if(requestCounts>continueCounts){    //限制ip访问一段时间    redis.set(ipRedisLimitKey,ipRedisLimitKey,limitTimes);    stopRequest(requestContext);  }  returnnull;}privatevoidstopRequest(RequestContextrequestContext){  //停止继续向下路由,禁止请求通信  requestContext.setSendZuulResponse(false);  requestContext.setResponseStatusCode(200);  Stringresult=JsonUtils.objectToJson(      GraceJSONResult.errorCustom(          ResponseStatusEnum.SYSTEM_ERROR_BLACK_IP));  requestContext.setResponseBody(result);  requestContext.getResponse().setCharacterEncoding("utf-8");  requestContext.getResponse().setContentType(MediaType.APPLICATION_JSON_VALUE);}上面这些都是通过不同key要执行多次才能得到结果,一般来说我们会使用es的aggs功能做聚合统计,会更好。通过一个脚本来统计男女数量:POSThttp://192.168.1.203:9200/fans/_doc/_search{  "size":0,  "query":{    "match":{      "writerId":"201116760SMSZT2W"    }  },  "aggs":{    "counts":{      "terms":{        "field":"sex"      }    }  }}以下就是数据库系统开发的整个流程讲解,感谢大家的阅读
  • 所需E币: 0
    时间: 2023-11-22 15:26
    大小: 3.92KB
    如何使用SpringBoot开发一款关于双11商品服务的系统?今天就给大家说道说道,希望对大家的学习有所帮助!1.什么是SpringBoot?Spring的诞⽣是为了简化Java程序的开发的,⽽SpringBoot的诞⽣是为了简化Spring程序开发的。SpringBoot是由Pivotal团队提供的基于Spring的框架,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。SpringBoot集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,SpringBoot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。2.SpringBoot的优点快速集成框架,SpringBoot提供了启动添加依赖的功能,⽤于秒级集成各种框架。内置运⾏容器,⽆需配置Tomcat等Web容器,直接运⾏和部署程序。快速部署项⽬,⽆需外部容器即可启动并运⾏项⽬。可以完全抛弃繁琐的XML,使⽤注解和配置的⽅式进⾏开发。⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况后端配置1.1创建Springboot工程打开idea->file->new->project选择springInitializer进行配置,java版本选择8,点击next-internal应用代码  -controllers控制器模块   -admin后端控制器   -front前端控制器  -listenredis监听器  -models模型模块  -service服务模块   -product_serive商品服务   -wechat_menu_serive微信公众号菜单服务   ......-conf公共配置 -config.ymlyml配置文件 -config.go配置解析,转化成对应的结构体  -middleware中间件  -AuthCheck.go jwt接口权限校验-cors.go跨域处理......-pkg程序应用包 -app -base -casbin -jwt -qrcode -wechat .....-routere路由-logs日志存放-runtime资源目录首先,我仔细分析了需求,并且根据业务逻辑设计了合适的接口。对于多表关联查询,我使用了MyBatis的注解来编写SQL语句,并通过@One和@Many等注解来实现结果集的映射。对于数据分页,我使用了MyBatis-Plus提供的Page对象,并结合相关方法来实现数据分页查询。2.上课中的优秀项目在课堂上,我完成了一个优秀的项目,主要是学生实体类的增删改查功能。通过这个项目,我巩固了对SpringBoot框架的理解和掌握。具体实现如下://初始化rediserr:=cache.InitRedis(cache.DefaultRedisClient,&redis.Options{Addr:    global.CONFIG.Redis.Host,Password:  global.CONFIG.Redis.Password,IdleTimeout:global.CONFIG.Redis.IdleTimeout,},nil)iferr!=nil{iferr!=nil{global.LOG.Error("InitRediserror",err,"client",cache.DefaultRedisClient)panic(err)}panic(err)}//初始化mysqlerr=db.InitMysqlClient(db.DefaultClient,global.CONFIG.Database.User,global.CONFIG.Database.Password,global.CONFIG.Database.Host,global.CONFIG.Database.Name)iferr!=nil{global.LOG.Error("InitMysqlClienterror",err,"client",db.DefaultClient)panic(err)}global.Db=db.GetMysqlClient(db.DefaultClient).DB开发步骤SpringBoot开发起来特别简单,分为如下几步:创建新模块,选择Spring初始化,并配置模块相关基础信息选择当前模块需要使用的技术集开发控制器类运行自动生成的Application类知道了SpringBoot的开发步骤后,接下来我们进行具体的操作shutdown.NewHook().Close(//关闭httpserverfunc(){ctx,cancel:=context.WithTimeout(context.Background(),time.Second*10)defercancel()iferr:=server.Shutdown(ctx);err!=nil{logging.Error("httpservershutdownerr",err)}},func(){//关闭kafkaproducer(特别是异步生产者,强制关闭会导致丢消息)iferr:=mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close();err!=nil{logging.Error("kafkashutdownerr",err)}},func(){//关闭mysqliferr:=db.CloseMysqlClient(db.DefaultClient);err!=nil{logging.Error("mysqlshutdownerr",err)}},func(){//关闭redisiferr:=cache.GetRedisClient(cache.DefaultRedisClient).Close();err!=nil{logging.Error("redisshutdownerr",err)}},)//也可以自己实现优雅关闭//signals:=make(chanos.Signal,0)//signal.Notify(signals,syscall.SIGHUP,syscall.SIGINT,syscall.SIGTERM,syscall.SIGQUIT)//s:=<-signals//global.LOG.Warn("shopreceivesystemsignal:",s)//ctx,cancel:=context.WithTimeout(context.Background(),3*time.Second)//defercancel()//err:=server.Shutdown(ctx)//iferr!=nil{//global.LOG.Error("httpservererror",err)//}//mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close()选择SpringInitializr,用来创建SpringBoot工程以前我们选择的是Maven,今天选择SpringInitializr来快速构建SpringBoot工程。而在ModuleSDK这一项选择我们安装的JDK版本。typeStoreProductstruct{Image    string     `json:"image"valid:"Required;"`SliderImage string     `json:"slider_image"valid:"Required;"`StoreName  string     `json:"store_name"valid:"Required;"`StoreInfo  string     `json:"store_info"valid:"Required;"`Keyword   string     `json:"keyword"valid:"Required;"`CateId    int      `json:"cate_id"valid:"Required;"`ProductCate *StoreCategory`json:"product_cate"gorm:"foreignKey:CateId;association_autoupdate:false;association_autocreate:false"`Price    float64    `json:"price"valid:"Required;"`VipPrice   float64    `json:"vip_price"valid:"Required;"`OtPrice   float64    `json:"ot_price"valid:"Required;"`Postage   float64    `json:"postage"valid:"Required;"`UnitName   string     `json:"unit_name"valid:"Required;"`Sort     int16     `json:"sort"valid:"Required;"`Sales    int      `json:"sales"valid:"Required;"`Stock    int      `json:"stock"valid:"Required;"`IsShow    *int8     `json:"is_show"valid:"Required;"`IsHot    *int8     `json:"is_hot"valid:"Required;"`IsBenefit  *int8     `json:"is_benefit"valid:"Required;"`IsBest    *int8     `json:"is_best"valid:"Required;"`IsNew    *int8     `json:"is_new"valid:"Required;"`Description string     `json:"description"valid:"Required;"`IsPostage  *int8     `json:"is_postage"valid:"Required;"`GiveIntegralint      `json:"give_integral"valid:"Required;"`Cost     float64    `json:"cost"valid:"Required;"`IsGood    *int8     `json:"is_good"valid:"Required;"`Ficti    int      `json:"ficti"valid:"Required;"`Browse    int      `json:"browse"valid:"Required;"`IsSub    *int8     `json:"is_sub"valid:"Required;"`TempId    int64     `json:"temp_id"valid:"Required;"`SpecType   int8      `json:"spec_type"valid:"Required;"`IsIntegral  *int8     `json:"isIntegral"valid:"Required;"`Integral   int32     `json:"integral"valid:"Required;"`BaseModel}//定义商品消息结构typeProductMsgstruct{Operationstring`json:"operation"`*StoreProduct}切换web服务器现在我们启动工程使用的是tomcat服务器,那能不能不使用tomcat而使用jetty服务器,jetty在我们maven高级时讲maven私服使用的服务器。而要切换web服务器就需要将默认的tomcat服务器给排除掉,怎么排除呢?使用exclusion标签func(e*StoreProductController)Post(c*gin.Context){var(dto dto2.StoreProductappG=app.Gin{C:c})httpCode,errCode:=app.BindAndValid(c,&dto)iferrCode!=constant.SUCCESS{appG.Response(httpCode,errCode,nil)return}productService:=product_service.Product{Dto:dto,}model,err:=productService.AddOrSaveProduct()iferr!=nil{appG.Response(http.StatusInternalServerError,constant.FAIL_ADD_DATA,nil)return}//发消息队列deferfunc(){operation:=product.OperationCreateifdto.Id>0{operation=product.OperationUpdate}productMsg:=models.ProductMsg{operation,&model,}msg,_:=json.Marshal(productMsg)p,o,e:=mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Send(&sarama.ProducerMessage{Topic:product.Topic,Key:  mq.KafkaMsgValueStrEncoder(strconv.FormatInt(dto.Id,10)),Value:mq.KafkaMsgValueEncoder(msg),},)ife!=nil{global.LOG.Error("sendproductmsgerror",e,"partition:",p,"offset:",o,"id:",dto.Id)}}()appG.Response(http.StatusOK,constant.SUCCESS,nil)}
  • 所需E币: 0
    时间: 2023-11-22 14:45
    大小: 3.21KB
    上传者: 开心就很好了
    今天给大家分享一下关于SpringBoot开发双11商品服务系统的整个流程,我将深度还原大厂实习期技术成长全流程,让你收获大厂项目开发全流程与实战经验,具备应对大流量场景问题的解决能力,全面助力提升实习/转正/跳槽表现力与成功率。SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapidapplicationdevelopment)成为领导者。目的让大家更容易使用spring,更容易集成各种常用的中间件、开源软件。SpringBoot基于Spring开发,SpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。SpringBoot不是用来替代spring的解决方案,而是和spring框架紧密结合提升spring开发者体验的工具。准备测试数据我们先导入准备好的测试数据,这个测试数据是一份商品数据。字段包含商品id,name(商品名)last_month_sales(最近一个月的销量)favorites(收藏数)这几个字段,我们主要是通过商品名来搜索。首先我先先创建一个商品索引PUTgoods{ "settings":{  "number_of_shards":1,  "number_of_replicas":0 }, "mappings":{  "properties":{   "id":{    "type":"keyword",    "doc_values":false,    "norms":false,    "similarity":"boolean"   },   "name":{    "type":"text"   },    "price":{    "type":"double"   },   "last_month_sales":{    "type":"long"   },   "favorites":{    "type":"long"   },   "year":{    "type":"short"   }  } }}千里之行,始于足下。想要舒舒服服地使用Spring框架,就要把它的开发环境配置好,这对它好,也对我好。1.jdk的配置    使用IDEA进行开发,在IDEA中配置jdk的方式很简单,打开File->ProjectStructure选择SDKs。在JDKhomepath中选择本地jdk的安装目录。在Name中为jdk自定义名字通过以上三步骤,即可导入本地安装的jdk。如果是使用STS或者eclipse可以通过两步骤添加:window->preference->java->InstralledJRES来添加本地jdk。window-->preference-->java-->Compiler选择jre,和jdk保持一致。PUTtest_index/_doc/1{ "string_field":"imooc", "int_field":100, "float_field":3.14, "bool_field":true, "date_field":"2022/03/16", "obj_field":{"key1":"value1","key2":100}, "array_field1":[100,3.14], "array_field2":[100,"200"], "array_field3":["2022/03/16","100"], "array_field4":["100","2022/03/16"], "null_field":null } 创建SpringBoot项目后需要进行maven配置。打开File->settings,搜索maven,配置一下本地的maven信息。在Mavenhomedirectory中选择本地Maven的安装路径;在Usersettingsfile中选择本地Maven的配置文件所在路径。在配置文件中配置一下国内阿里的镜像,这样在下载maven依赖时,速度会变得很快。{ "test_index":{  "mappings":{   "properties":{    "array_field":{     "type":"text",     "fields":{      "keyword":{       "type":"keyword",       "ignore_above":256      }     }    },    "bool_field":{     "type":"boolean"    },    "date_field":{     "type":"date",     "format":"yyyy/MM/ddHH:mm:ss||yyyy/MM/dd||epoch_millis"    },    "float_field":{     "type":"float"    },    "int_field":{     "type":"long"    },    "obj_field":{     "properties":{      "key1":{       "type":"text",       "fields":{        "keyword":{         "type":"keyword",         "ignore_above":256        }       }      },      "key2":{       "type":"long"      }     }    },    "string_field":{     "type":"text",     "fields":{      "keyword":{       "type":"keyword",       "ignore_above":256      }     }    }   }  } }}从以上结果中,我们可以看到SpringBoot通过MVN方式自动为项目配置了对应的springframework、logging、jackson以及Tomcat等依赖,而这些正是我们在开发Web项目时所需要的。那么细心的同学可能会发现一个问题,即在以上pom.xml的配置中,引入依赖spring-boot-starter-web时,并没有指明其版本(version),但在依赖列表中,我们却看到所有的依赖都具有版本信息,那么这些版本信息是在哪里控制的呢? { "_index":"test_index", "_id":"1", "_version":1, "_seq_no":0, "_primary_term":1, "found":true, "_source":{  "string_field":"Chan",  "int_field":100,  "int_string_field":"100",  "float_field":3.14,  "bool_field":true,  "date_field":"2022/03/16",  "obj_field":{   "key1":"value1",   "key2":100  },  "array_field":[   "value1",   "100"  ],  "null_field":null }}spring-boot-starter-parent是所有SpringBoot项目的父级依赖,它被称为SpringBoot的版本管理中心,可以对项目内的部分常用依赖进行统一管理。<parent>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-parent</artifactId>       <version>2.5.6</version>       <relativePath/> </parent>SpringBoot项目可以通过继承spring-boot-starter-parent来获得一些缺省的配置内容,它主要提供了以下特性:默认JDK版本(Java8)默认字符集(UTF-8)依赖管理功能资源过滤默认插件配置识别 application.properties或application.yml类型的配置文件DELETEtest_indexPUTtest_index{ "mappings":{  "dynamic":false  }}GETtest_index/_search{ "query":{  "term":{   "field1.field2":{    "value":"imoocES"   }  } }}GETtest_index/_doc/4DELETEtest_indexPUTtest_index{ "mappings":{  "dynamic":"strict"  }}POSTtest_index/_doc/2{ "field1":{  "field2":"imoocES"  }}GETtest_index/_search{ "query":{  "term":{   "field1.field2":{    "value":"imoocES"   }  } }}GETtest_index/_doc/4以下就是本文的全部内容,感谢大家观看
  • 所需E币: 0
    时间: 2023-11-10 15:43
    大小: 1010.5KB
    上传者: Argent
    第1讲正点原子官方系统镜像烧写实验
  • 所需E币: 0
    时间: 2023-10-26 10:01
    大小: 1.67KB
    无论你是数据库内核研发、DBA、还是后端研发,能够手写一套自己的数据库系统,都是你突破技术发展瓶颈的有效途径。[11章]技术大牛成长课,从0到1带你手写一个数据库系统课程将带你从架构设计,原理剖析,再到源码的实现,手把手带你构建一套完整的数据库系统,让你深度掌握数据库底层,及更多数据库高端技术,具备解决大量生产级数据库问题的能力,助力成为高端技术人才!从数据库架构设计到功能实现,吃透底层原理,解决大量生产级问题具备从0到1数据库系统的架构设计能力从需求分析,系统分析,到系统架构设计,以及面向未知故障场景防御式编程,灵活运用设计模式,全面深入理解数据库系统架构深度掌握数据库底层原理及系统性方法论掌握SQL语法解析、语义解析原理,数据库如何生成执行计划,数据库底层存储机制、事务管理机制,C/S架构网络服务,综合性提升数据库运维、调优能力提升大量生产级数据库问题高效解决能力深入掌握数据库索引调优思路、瓶颈点,如何快速定位线上问题,深入挖掘针对数据库的面试题,知其然更知其所以然,有效突破你的疑难杂症问题解决能力理论结合实际场景综合性落地,轻松吃透核心技术底层原理应用场景复用到日常开发场景中,如何运用高级数据结构、算法和设计模式,如何正确面对高并发进行编程,如何进行数据库的优化,如何理解数据库的执行计划分析慢SQL的原因等。原理剖析深度剖析数据库系统原理,将数据库几十年发展精髓拆解并呈现,端到端解析数据库系统中的各种工程trick,结合具体实现案例(MySQL/PostgreSQL/SQLite)展现系统级实现方案源码实战手把手实现每一行代码,掌握每行代码的原理,实现代码规模巨大的数据库系统原型,开发、debug过程演示真实传授解bug的核心方法论,探讨各种工程技巧、可优化的空间,引发深层思考多场景数据库解决方案,灵活解决大量生产级问题数据库性能及扩展评估数据库性能、扩展数据库功能特性、数据库扩展的方法和机制数据库优化分析数据库性能瓶颈、配置数据库索引、执行计划分析、分析系统硬件瓶颈大数据量存储如何进行数据存储、设计端到端大数据量存储方案、评估大数据量对数据库的影响数据库高可用数据库高可用的挑战、数据库WAL机制、WAL机制在数据库高可用中的应用数据库网络规划OS的网络模型、高效实现网络编程、数据库如何面对高并发挑战数据库故障定位定位数据库中故障的来源、如何对故障进行响应、进行数据库系统的高效运维
  • 所需E币: 0
    时间: 2023-10-18 10:44
    大小: 1.86KB
    上传者: 开心就很好了
    [38章]Three.js可视化系统课程WebGL(23年10月最新版+700多课时),视频+源码+课件,全网最全系列!WebGL是一个JavaScriptAPI,用于在任何兼容的Web浏览器中呈现交互式3D图形,而无需使用插件。WebGL应用程序由用JavaScript编写的控制代码和在计算机GPU上执行的特殊效果代码组成。WebGL元素可以与其他HTML元素混合,并与页面或页面背景的其他部分组合。WebGL浏览器报告检查Web浏览器中的WebGL支持,生成WebGL设备指纹识别,并显示其他WebGL和GPU功能或多或少相关的Web浏览器标识。WebGL在使用图片上有着比Canvas2D更强的限制,就是说WebGL不能随意使用网络获图像,还有一点需要注意的是WebGL读取本地数据的速度很快。WebGL1可以看成是OpenGLES2的javascript移植,类似的,WebGL2可以看做是OpenGLES3的javascript移植。所以大部分的特性可以去对应到OpenGLES3中的特性,当然有些细节上会有出入(比如textureswizzle是不支持)。这些新特性除了可以从WebGL2spec中找到,也可以去寻找OpenGLES3的书籍来大略了解。当然我非常推荐到我们的WebGL2SamplesPack去直接寻找新的特性及其用法,一般每个特性都有对应的sample。比较重要的特性有:uniformbufferobjectvertexarrayobjecttransformfeedbackmultisamplefbomultiplerendertargets一系列texture相关:texturelod,texture2darray,texture3d,压缩格式texture等等。WebGL是什么GPU≠WebGL≠2DWebGL是浏览器上的OpenGL需要一定计算机图形学基础和线性代数基础WebGL(全写WebGraphicsLibrary)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGLES2.0结合在一起,通过增加OpenGLES2.0的一个JavaScript绑定,WebGL可以为HTML5Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。和传统的3D方案相比,WebGL具有如下一些优点。WebGL是内嵌在浏览器中的,无需安装插件和库就可以直接使用。可以在多平台上运行WebGL程序。让海量数据的二维可视化成为了可能。开发环境简单,仅需文本编辑器和浏览器就可以编写三维图形程序