最新文�? 转载 : C++中常用的四种类型转换方式:static_cast、const_cast、dynamic_cast 和 reinterpret_cast 原创 : GB 9706.1-2020新标准新法规下载与讨论 原创 : 《CPU设计实战》——学习之路(一) 原创 : 不同方法构建PetaLinux系统 原创 : 无损检测技术之医用超声基础
\n\n\n\nWhen (a \ne 0), there are two solutions to (ax^2 + bx + c = 0) and they are\n$$x = {-b pm sqrt{b^2-4ac} over 2a}.$$\n\n\n```\n\nlatex语法参考:\nhttps://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference\n注意在mardown插件中只有```$$ $$```之间的内容才会被识别成latex。\n例子\n$$sum_{i=0}^n i^2 = frac{(n^2+n)(2n+1)}{6}$$\n\n') document.getElementById('render_57').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('开源软件协议主要有一下几种:\n1. GPL\n2. LGPL\n3. Apache License 2 Apache License是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似。\n4. Artistic License/GPL 使作者保持对进一步开发的控制。\n5. Eclipse Public License 1.0 \n6. GNU GPL v3 我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache License等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。\n7. GNU Lesser GPL\n8. MIT License\n9. Mozilla Public License 1.1\n10. New BSD License\n\n|协议|修改相同代码需要使用相同的许可证|所有相同代码使用或者兼容许可|阻止DRM,锁定固件|所有文件必须包含版权,改变和专利的信息|阻止使用作者姓名宣传|\n|-|-|-|-|-|-|\n|GPLV2|content2|content3|-|-|\n|GPLV2|content2|content3|-|-|\n|GPLV2|content2|content3|-|-|\n|GPLV2|content2|content3|-|-|\n|GPLV2|content2|content3|-|-|\n|GPLV2|content2|content3|-|-|\n|GPLV2|content2|content3|-|-|\n\n\n![0_1306296079vEDZ.gif](https://www.testingcloud.club/sapi/api/image_download/857234bf-e59f-11e9-82a1-5254009f44c8)\n') document.getElementById('render_58').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('- You must have following programs in your PATH environment variable:\n```\nVisual Studio >= 2015 IMPORTANT: due to modern C++11 features, VS2015 is the minimum supported version. Visual Studio 2015 Community will be enough to build QtWebkit.\nQt >= 5.6 - http://www.qt.io/developers (older Qt versions may work as well, but you will need to build Qt yourself)\nCMake >= 2.8.12\nRuby >= 1.9 - you can download convenient installer here\nPerl (5.22 or 5.20) - ActivePerl by ActiveState will be enough.\nPython - we heavily advise to use 2.7 version. Python 3 is not officially supported\n```') document.getElementById('render_60').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('#### 1.首先启动IE,安全设置要设置允许未注册的ActiveX控件执行。\n2.调用ActiveX控件,例如:\n```\n\n\n\n\n\n\n```\n最关键的是CLASSID,位于工程目录下的idl文件可以查找到classID,比如\n```\n[ uuid(2E4CE520-0000-4941-B489-B6C0BEB39979), version(1.0),\n control ]\nlibrary VedioActiveXLib\n{\n importlib(STDOLE_TLB);\n\n // CVedioActiveXCtrl 的主调度接口\n [ \n uuid(20892A64-4ED4-4110-B9F7-459259BC1965) \n ]\n dispinterface _DVedioActiveX\n {\n properties:\n methods:\n\n [id(DISPID_ABOUTBOX)] void AboutBox();\n };\n\n // CVedioActiveXCtrl 的事件调度接口\n\n [ \n uuid(54E3C1FC-72BA-4DA5-ABB2-4E90854B700E) \n ]\n dispinterface _DVedioActiveXEvents\n {\n properties:\n // 事件接口没有任何属性\n\n methods:\n };\n\n // CVedioActiveXCtrl 的类信息\n [\n uuid(E2D028E6-3039-4F89-8B37-1B913AEC515C) ##这个是classid,也就是上面obejct里面的字段\n ]\n coclass VedioActiveX\n {\n [default] dispinterface _DVedioActiveX;\n [default, source] dispinterface _DVedioActiveXEvents;\n };\n};\n```\n1. 注册acticeX控件,regsvr32 D:projectc++VedioActiveXDebugVedioActiveX.ocx\n2. 打开IE打开包含控件的文件。\n3. VS调试选项->附加到进程,注意可以选择的进程有三个,选择没有标题的那个,否则没断点。\n![df.jpg](https://www.testingcloud.club/sapi/api/image_download/86bc2b26-eddc-11e9-b932-5254009f44c8)\n') document.getElementById('render_61').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('DirectShow属于微软DirectX的一员,是非常早期的多媒体框架,该平台在2000年左右就已经推出,因为推出的时间早,在工程上有成熟的优点,因此一些项目可以采用DirectShow实现,比如多媒体ActiveX组件。 \n\n### COM组件\nCOM组件是微软的一套编程规范,COM是一个类,类中包含了很多虚函数接口,COM组件都是从IUnkown接口派生来的,IUnkown定义了三个非常重要的接口,QueryInterface,AddRef,Release这三个接口,COM主要用于解决对象生命周期的问题。 \n还有另一个重要的接口IClassFactory,COM规定,每一个组件都必须有一个相对应的类工厂函数IClassFactory,类工厂本身也是COM组件,它实现了IClassFactory库接口,在IClassFactoryde的CreateInstance中再去new客户的COM组件。\n#### COM组件的创建过程\n![com.jpg](https://www.testingcloud.club/sapi/api/image_download/cb6201c5-ee57-11e9-b932-5254009f44c8)\n\n每个COM组件都有一个唯一的GUID CLASSID 来标识,当创建一个COM组件对象时候,总是通过这个GUID调用CoGetClassObject来获得创建这个COM组件的类工厂,然后调用工厂类的CreateInstance去创建一个对象。\n例如下面是一个创建COM组件的例子(directX的IGraphBuilder): \n```\n hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, \n IID_IGraphBuilder, (void **)&m_pGB);\n```\n\n下面是DirectShow的技术架构图: \n![directshow.jpg](https://www.testingcloud.club/sapi/api/image_download/58bec564-ee56-11e9-b932-5254009f44c8)\n\nDirectShow位于应用层中。它使用一种叫Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫Filter;各个Filter 在Filter Graph中按一定的顺序连接成一条\"流水线\"协同工作。 \n按照功能来分,Filter大致分为三类:Source Filters、Transform Filters和Rendering Filters。\n\nSource Filters主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;\n\nTransform Fitlers主要负责数据的格式转换、传输;\n\nRendering Filtes主要负责数据的最终去向,我们可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。\n\n在DirectShow系统之上,我们看到的,即是我们的应用程序(Application)。应用程序要按照一定的意图建立起相应的Filter Graph,然后通过Filter Graph Manager来控制整个的数据处理过程。DirectShow能在Filter Graph运行的时候接收到各种事件,并通过消息的方式发送到我们的应用程序。这样,就实现了应用程序与DirectShow系统之间的交互。\n\n2) Filter概述以及连接\n\n过滤器(Filter)是DirectShow中最基本的概念。DirectShow是通过Filter Graph来管理Filter的。Filter Graph是Filter的\"容器\",而Filter是Filter Graph中的最小功能模块。\n\nFilter是一种COM组件,对于每个Filter,都有其自己的Pin,它是由Filter创建的COM对象。 Filter通过Pin来进行他们之间的连接。\n\nPin分为两种:输出Pin和输入Pin。输出的Pin把Filter处理后的数据传送到Filter的外 部,而输入Pin则是把Filter外部的数据接收到Filter中,以便Filter对这些数据进行处理。\n\n对于三种类型的Filter(Source Filter,Transform Filter,Rendering Filter)的连接图如下:\n\n图2 Filter的连接\n\n可以根据Filter所包含的输入Pin和输出Pin的熟练来判断Filter的类型:\n\n只有输出Pin,没有输入pin,为Source Filter\n\n既有输出Pin,又有输入pin,为Transform Filter\n\n没有输出Pin,只有输入pin,为Rendering Filter\n\n3)DirectShow 的重要接口\n\nDirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。下面就列举一些重要的DirectShow的接口。\n\n(1) IGraphBuilder接口\n\n用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。\n\n(2) IMediaControl接口\n\n用于控制多媒体流在Filter Graph中的流动,如流的启动和停止。\n\n(3) IMediaEvent接口\n\n用于捕获播放过程中发生的事件,并通知应用程序,如EC_COMPLETE等。\n\n(4) IVideoWindow接口\n\n用于控制视频窗口的属性。\n\n(5) IMeadiaSeeking接口\n\n用于查找媒体的接口,定位流媒体,控制多媒体数据播放提供精确控制。\n\n(6) IBaseFilter接口\n\n从ImediaFilter接口继承,用来定义一个具体的过滤器指针,并对多媒体数据进行处理。\n\n(7) IPin接口\n\n用于管理两个过滤器之间的Pin,从而连接过滤器。\n\n(8) IsampleGrabberCB接口\n\n是Sample Grabber过滤器的一个接口,用于当流媒体数据通过过滤器时进行采样以获得帧图象。\n\n') document.getElementById('render_62').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('### 简介\n  IOCP模型属于一种通讯模型,适用于Windows平台下高负载服务器的一个技术。在处理大量用户并发请求时,如果采用一个用户一个线程的方式那将造成CPU在这成千上万的线程间进行切换,后果是不可想象的。而IOCP完成端口模型则完全不会如此处理,它的理论是并行的线程数量必须有一个上限-也就是说同时发出500个客户请求,不应该允许出现500个可运行的线程。目前来说,IOCP完成端口是Windows下性能最好的I/O模型,同时它也是最复杂的内核对象。它避免了大量用户并发时原有模型采用的方式,极大的提高了程序的并行处理能力。\n![111786520180703145148312249212875.jpg](https://www.testingcloud.club/sapi/api/image_download/4f20c1e0-0145-11ea-b932-5254009f44c8)\n### 原理\n一共包括三部分:完成端口(存放重叠的I/O请求),客户端请求的处理,等待者线程队列(一定数量的工作者线程,一般采用CPU*2个)\n\n  完成端口中所谓的[端口]并不是我们在TCP/IP中所提到的端口,可以说是完全没有关系。**它其实就是一个通知队列,由操作系统把已经完成的重叠I/O请求的通知放入其中。当某项I/O操作一旦完成,某个可以对该操作结果进行处理的工作者线程就会收到一则通知。**\n\n  通常情况下,我们会在创建一定数量的工作者线程来处理这些通知,也就是线程池的方法。线程数量取决于应用程序的特定需要。理想的情况是,线程数量等于处理器的数量,不过这也要求任何线程都不应该执行诸如同步读写、等待事件通知等阻塞型的操作,以免线程阻塞。每个线程都将分到一定的CPU时间,在此期间该线程可以运行,然后另一个线程将分到一个时间片并开始执行。如果某个线程执行了阻塞型的操作,操作系统将剥夺其未使用的剩余时间片并让其它线程开始执行。**也就是说,前一个线程没有充分使用其时间片,当发生这样的情况时,应用程序应该准备其它线程来充分利用这些时间片。**\n\n### 主要接口:\n#### 创建完成端口\n```\n//功能:创建完成端口和关联完成端口\n HANDLE WINAPI CreateIoCompletionPort(\n * __in HANDLE FileHandle, // 已经打开的文件句柄或者空句柄,一般是客户端的句柄\n * __in HANDLE ExistingCompletionPort, // 已经存在的IOCP句柄\n * __in ULONG_PTR CompletionKey, // 完成键,包含了指定I/O完成包的指定文件\n * __in DWORD NumberOfConcurrentThreads // 真正并发同时执行最大线程数,一般推介是CPU核心数*2\n * );\nHANDLE completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);\n```\n#### 与socket进行关联\n```\ntypedef struct{\n SOCKET socket;//客户端socket\n SOCKADDR_STORAGE ClientAddr;//客户端地址\n}PER_HANDLE_DATA, *LPPER_HANDLE_DATA;\n//与socket进行关联\nCreateIoCompletionPort((HANDLE)(PerHandleData -> socket), \n          completionPort, (DWORD)PerHandleData, 0);\n```\n#### 获取队列完成状态\n```\n//功能:获取队列完成状态\n/*\n返回值:\n调用成功,则返回非零数值,相关数据存于lpNumberOfBytes、lpCompletionKey、\nlpoverlapped变量中。失败则返回零值。\n*/\nBOOL GetQueuedCompletionStatus(\n HANDLE CompletionPort, //完成端口句柄\n LPDWORD lpNumberOfBytes, //一次I/O操作所传送的字节数\n PULONG_PTR lpCompletionKey, //当文件I/O操作完成后,用于存放与之关联的CK\n LPOVERLAPPED *lpOverlapped, //IOCP特定的结构体\n DWORD dwMilliseconds); //调用者的等待时间\n/*\n```\n#### 投递一个队列完成状态\n```\n//功能:投递一个队列完成状态\nBOOL PostQueuedCompletionStatus( \n  HANDLE CompletlonPort, //指定想向其发送一个完成数据包的完成端口对象\n  DW0RD dwNumberOfBytesTrlansferred, //指定—个值,直接传递给GetQueuedCompletionStatus\n                        函数中对应的参数 \n  DWORD dwCompletlonKey, //指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数\n  LPOVERLAPPED lpoverlapped, ); //指定—个值,直接传递给GetQueuedCompletionStatus\n                    函数中对应的参数\n```\noverlapped结构\n```\ntypedef struct _OVERLAPPED {\n ULONG_PTR Internal;\n ULONG_PTR InternalHigh;\n union {\n struct {\n DWORD Offset;\n DWORD OffsetHigh;\n } DUMMYSTRUCTNAME;\n PVOID Pointer;\n } DUMMYUNIONNAME;\n\n HANDLE hEvent;\n} OVERLAPPED, *LPOVERLAPPED;\n```\n#### 例子\n```\n#include \n#include \n#include \n#include \nusing namespace std;\n\n#pragma comment(lib,\"ws2_32.lib\")\n#pragma comment(lib,\"kernel32.lib\")\n\nHANDLE g_hIOCP;\n\nenum IO_OPERATION{IO_READ,IO_WRITE};\n\nstruct IO_DATA{\n OVERLAPPED Overlapped;\n WSABUF wsabuf;\n int nBytes;\n IO_OPERATION opCode;\n SOCKET client;\n};\n\nchar buffer[1024];\n\nDWORD WINAPI WorkerThread (LPVOID WorkThreadContext) {\n IO_DATA *lpIOContext = NULL; \n DWORD nBytes = 0;\n DWORD dwFlags = 0; \n int nRet = 0;\n\n DWORD dwIoSize = 0; \n void * lpCompletionKey = NULL;\n LPOVERLAPPED lpOverlapped = NULL;\n\n while(1){\n GetQueuedCompletionStatus(g_hIOCP, &dwIoSize,(LPDWORD)&lpCompletionKey,(LPOVERLAPPED *)&lpOverlapped, INFINITE);\n\n lpIOContext = (IO_DATA *)lpOverlapped;\n if(dwIoSize == 0)\n {\n cout << \"Client disconnect\" << endl;\n closesocket(lpIOContext->client);\n delete lpIOContext;\n continue;\n }\n\n if(lpIOContext->opCode == IO_READ) // a read operation complete\n {\n ZeroMemory(&lpIOContext->Overlapped, sizeof(lpIOContext->Overlapped));\n lpIOContext->wsabuf.buf = buffer;\n lpIOContext->wsabuf.len = strlen(buffer)+1;\n lpIOContext->opCode = IO_WRITE;\n lpIOContext->nBytes = strlen(buffer)+1;\n dwFlags = 0;\n nBytes = strlen(buffer)+1;\n //post a send operation\n nRet = WSASend(\n lpIOContext->client,\n &lpIOContext->wsabuf, 1, &nBytes,\n dwFlags,\n &(lpIOContext->Overlapped), NULL);\n if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {\n cout << \"WASSend Failed::Reason Code::\"<< WSAGetLastError() << endl;\n closesocket(lpIOContext->client);\n delete lpIOContext;\n continue;\n }\n memset(buffer, NULL, sizeof(buffer));\n }\n else if(lpIOContext->opCode == IO_WRITE) //a write operation complete\n {\n // Write operation completed, so post Read operation.\n lpIOContext->opCode = IO_READ; \n nBytes = 1024;\n dwFlags = 0;\n lpIOContext->wsabuf.buf = buffer;\n lpIOContext->wsabuf.len = nBytes;\n lpIOContext->nBytes = nBytes;\n ZeroMemory(&lpIOContext->Overlapped, sizeof(lpIOContext->Overlapped));\n //post a request \n nRet = WSARecv(\n lpIOContext->client,\n &lpIOContext->wsabuf, 1, &nBytes,\n &dwFlags,\n &lpIOContext->Overlapped, NULL);\n if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {\n cout << \"WASRecv Failed::Reason Code1::\"<< WSAGetLastError() << endl;\n closesocket(lpIOContext->client);\n delete lpIOContext;\n continue;\n } \n cout<wsabuf.buf<Overlapped, 0 , sizeof(data->Overlapped));\n data->opCode = IO_READ;\n data->nBytes = 0;\n data->wsabuf.buf = buffer;\n data->wsabuf.len = sizeof(buffer);\n data->client = client;\n DWORD nBytes= 1024 ,dwFlags=0;\n int nRet = WSARecv(client,&data->wsabuf, 1, &nBytes,\n &dwFlags,\n &data->Overlapped, NULL);\n if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())){\n cout << \"WASRecv Failed::Reason Code::\"<< WSAGetLastError() << endl;\n closesocket(client);\n delete data;\n }\n cout<wsabuf.buf<\n![o4YBAFq96tOAMIw5AABkD5zmZEA702.jpg](https://www.testingcloud.club/sapi/api/image_download/95972eb0-39bc-11ea-bf6d-5254009f44c8.jpg)
\nPS-ON短接到地,3.3V,5V,12V才有功率输出。
\n另外还有CPU 8P也是12V输出
\n') document.getElementById('render_96').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('#### 个人找工作投递简历流程\n![image.png](https://www.testingcloud.club/sapi/api/image_download/e1a5102a-88ee-11ea-aabd-525400dc6cec.png)
') document.getElementById('render_153').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('```\nCREATE DEFINER = CURRENT_USER PROCEDURE `rangedoc`()\nBEGIN \ndeclare testrangeid BIGINT; \ndeclare versionid BIGINT; \ndeclare done int; \n##创建游标,并存储数据 \ndeclare cur_test CURSOR for \n select id as testrangeid,version_id as versionid from tp_testrange; \n#游标中的内容执行完后将done设置为1 \n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; \n#打开游标 \nopen cur_test; \n#执行循环 \n posLoop:LOOP \n#判断是否结束循环 \n IF done=1 THEN \n LEAVE posLoop; \n END IF; \n#取游标中的值 \n FETCH cur_test into testrangeid,versionid; \n#执行更新操作 \n update tp_data_execute set version_id=versionid where testrange_id = testrangeid; \n END LOOP posLoop; \n#释放游标 \nCLOSE cur_test;\n```') document.getElementById('render_191').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('#### 问题描述\n编译提示multiple definition of `_wassert\',具体是libmingwex.a这个库文件的lib32_libmingwex_a-wassert.o段多了该文件的定义,和libucrtbase.a中的`_wassert\'起了冲突。\n#### 解决方法\n使用ar\n```\nar d libmingwex.a lib32_libmingwex_a-wassert.o\n```\n直接删除这个段,不建议这么做,可以直接删除特定的符号\n```\nobjcopy -N _wassert libmingwex.a\n```\n#### 思考\nmingw作为开源库,兼容性并不好,这类重复定义问题,经常让开发者以为自己少链接库,或者链接错库了。') document.getElementById('render_196').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('#### 需求何来\n在服务端软件中,将设计好的软件目标搬移到目标环境,并且使之生效,这个流程就是部署。\n\n#### 变量\n- 目标环境\n软件运行的环境,主要分为:
\n操作系统:linux;windows。
\n虚拟环境: docker等。
\n应用层环境: 比如单纯的文件系统。
\n环境类型: 根据用途划分为测试环境,灰度环境,生产环境等等。\n\n- 目标\n目标根据用途可以分为很多种:\n1. 脚本文件: html文件,js,php等,特点是热更新,无需其他操作就可以生效。\n2. 系统原生应用: 就是系统应用,特点就是需要重新启动,这就意味着需要关闭旧的应用。\n3. 虚拟机: 根据层级不同,应用层虚拟比如docker,底层的像是xen等技术,跟原生应用类似,也需要重启。\n\n- 部署方法\n根据不同的目标和环境来说明:
\n\n\n1. 目标环境是linux操作系统,目标是二进制的运行文件,使用ssh bash脚本来部署\n远程连接上目标环境->关闭旧的运行文件->上传新的运行文件->运行新的运行文件。
\n参考的部署脚本如下
\n```\nssh -t -i ./id_rsa ubuntu@{hostip} /usr/bin/pkill userapi\nscp -i ./id_rsa background ubuntu@{hostip}:/home/ubuntu/api/bin/userapi\nscp -i ./id_rsa user.yaml ubuntu@{hostip}:/home/ubuntu/api/bin/user.yaml\nscp -i ./id_rsa pem/ca.pem ubuntu@{hostip}:/home/ubuntu/api/bin/pem/ca.pem\nscp -i ./id_rsa pem/client-cert.pem ubuntu@{hostip}:/home/ubuntu/api/bin/pem/client-cert.pem\nscp -i ./id_rsa pem/client-key.pem ubuntu@{hostip}:/home/ubuntu/api/bin/pem/client-key.pem\nssh -t -i ./id_rsa ubuntu@{hostip} /home/ubuntu/api/bin/userapi \n```\n注意了ssh -t -i ./id_rsa ubuntu@{hostip} /home/ubuntu/api/bin/userapi 调用了新的程序,一般情况下,如果ssh agent连接断开,那么这个程序就会自动退出,这里却可以使用,这是因为程序本身内部做了守护进程的机制。\n\n2. 目标环境是linux操作系统,目标是二进制的运行文件,使用ssh + docker镜像来部署脚本来部署\n编辑Dockerfile
\n```\nFROM alpine:latest\nMAINTAINER caiyu \"a7458969@gmail.com\"\nWORKDIR /bin\nADD userapi /bin/userapi\nADD docker.yaml /bin/user.yaml\nRUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2\nEXPOSE 4596\nEXPOSE 8989\nENTRYPOINT [\"./userapi\"]\n```\n编辑部署脚本\n```\nssh -t -i ./id_rsa ubuntu@{hostip} /usr/bin/pkill userapi\nscp -i ./id_rsa webserver ubuntu@{hostip}:/home/zcy/api/bin/userapi\nscp -i ./id_rsa docker.yaml ubuntu@{hostip}:/home/zcy/api/bin/docker.yaml\nscp -i ./id_rsa config.yaml ubuntu@{hostip}:/home/zcy/api/bin/user.yaml\nscp -i ./id_rsa Dockerfile ubuntu@{hostip}:/home/zcy/api/bin/Dockerfile\nssh -i ./id_rsa ubuntu@{hostip} docker rm -f webapi\nssh -i ./id_rsa ubuntu@{hostip} docker rmi -f webapi:v1\nssh -i ./id_rsa ubuntu@{hostip} cd /home/zcy/api/bin;docker build -t webapi:v1 .\nssh -i ./id_rsa ubuntu@{hostip} docker run -it -d -p 4596:4596 -p 8989:8989 --name=\"webapi\" --restart=unless-stopped webapi:v1\n```\n比较下同种环境下上面两种部署方法优缺点
\n- bash脚本部署\n优点:
\n直观。
\n简单,不用配置docker。
\n缺点:
\n不安全,需要额外的监视程序程序监视程序的运行。
\n移植性较差,需要配置额外的环境。
\n- docker部署\n优点:
\n安全健壮,功能性强,可以定义重启策略。
\n和宿主机解耦,容易迁移。
\n功能全面: 自动实现daemonize,重启等。
\n缺点:
\n额外占用空间大。
\n配置繁琐。
') document.getElementById('render_223').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('### 使用crontab + mysqldump\n#### 备份脚本如下\n```\n#!/bin/sh\ndb_user=\"root\"\ndb_passwd=\"\"\ndb_name=\"background\"\nname=\"$(date +\"%Y%m%d%H%M%S\")\"\n/usr/bin/mysqldump -u$db_user -p$db_passwd $db_name >>~/$name.sql\n```\n#### crontab设置该脚本每天10点执行一次\n```\n0 10 * * * backup.sh //每天10点执行\n````\n\n### 拓展\n这样备份是全量备份,在数据量很大时,每天进行全量备份很耗资源,可以考虑增量备份,全量备份适用于时间跨度较长的备份。\n\n[基于binlog的备份](https://baijiahao.baidu.com/s?id=1613768750660586517&wfr=spider&for=pc)') document.getElementById('render_225').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('sitemap.xml对于一个大型网站可能没有多重要,但对于一个小型的网站来说,是相当的重要,因为百度蜘蛛的爬取策略叫较保守,似乎只能爬取静态页面,对于前端渲染的网站,比如vue等框架制作的网站,因为大部分爬虫都无法爬取动态站。sitemap.xml是必须的。sitemap.xml这个文件能够让搜索引擎蜘蛛更多的爬取网站内容,简单来说就是方便蜘蛛爬取,方便了蜘蛛,就有加速收录的过程。所以对于一个小型网站来说,制作sitemap.xml是非常有必须的。
\nsitemap.xml仅仅是一个放置于域名根目录下的xml文件,该文件记录了网站下希望被浏览器蜘蛛爬取到的所有url信息。形式如:\n```\n\n\nhttp://www.zhuoweifeng.com\n2021-01-20T11:31:30+00:00\ndaily\n1.0\n\n\nhttp://www.zhuoweifeng.com/archives/3539\n2021-01-13T17:09:15+00:00\nmonthly\n0.6\n\n\nhttp://www.zhuoweifeng.com/archives/3536\n2021-01-11T18:00:30+00:00\nmonthly\n0.6\n\n\nhttp://www.zhuoweifeng.com/archives/3531\n2021-01-05T16:22:22+00:00\nmonthly\n0.6\n\n\nhttp://www.zhuoweifeng.com/archives/3528\n2021-01-04T13:19:27+00:00\nmonthly\n0.6\n\n\n```\n') document.getElementById('render_351').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('类图是一切面向对象方法的核心建模工具。类图描述了系统中对象的类型以及它们之间存在的各种静态关系。
\n用来表示类、接口以及它们之间的静态结构和关系。\n
\n\n#### 泛化(Generalization)\n【泛化关系】是一种继承关系,表示子类继承父类的所有特征和行为。\n【箭头指向】带三角箭头的实线,箭头指向父类。
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/f887f16a-3180-11ec-83cc-525400dc6cec.png)\n\n#### 实现(Realization)\n【实现关系】是一种类与接口的关系,表示类是接口所有特征和行为的实现。
\n【箭头指向】带三角箭头的虚线,箭头指向接口。
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/49004455-3181-11ec-83cc-525400dc6cec.png)\n\n
\n\n#### 关联(Association)\n【关联关系】是一种拥有关系,它使得一个类知道另一个类的属性和方法。
\n【代码体现】成员变量
\n【箭头指向】带普通箭头的实线,指向被拥有者。双向的关联可以有两个箭头,或者没有箭头。单向的关联有一个箭头。
\n![image.png](https://www.testingcloud.club/sapi/api/image_download/545d69bf-3181-11ec-83cc-525400dc6cec.png)\n\n#### 聚合(Aggregation)\n【聚合关系】是一种整体与部分的关系。且部分可以离开整体而单独存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
\n【代码体现】成员变量
\n【箭头指向】带空心菱形的实线,空心菱形指向整体。
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/5c488d7c-3181-11ec-83cc-525400dc6cec.png)\n\n\n#### 组合(Composition)\n【组合关系】是一种整体与部分的关系。但部分不能离开整体而单独存在,组合关系是关联关系的一种,是比聚合关系还要强的关系。
\n【代码体现】成员变量
\n【箭头指向】带实心菱形的实线,实心菱形指向整体。
\n![image.png](https://www.testingcloud.club/sapi/api/image_download/e13a9d03-3184-11ec-83cc-525400dc6cec.png)\n\n#### 依赖(Dependency)\n【依赖关系】是一种使用关系,即一个类的实现需要另一个类的协助。
\n【箭头指向】带普通箭头的虚线,普通箭头指向被使用者。
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/eed3fc89-3184-11ec-83cc-525400dc6cec.png)\n') document.getElementById('render_509').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('ubuntu laptop 无法休眠强制解决方法
\n编辑文件
\n\n```\nsudo -H gedit /lib/systemd/system-sleep/custom-xhci_hcd\n```\n\n
\n\n```\n\n# Original script was using /bin/sh but shellcheck reporting warnings.\n\n# NAME: custom-xhci_hcd\n# PATH: /lib/systemd/system-sleep\n# CALL: Called from SystemD automatically\n# DESC: Suspend broken for USB3.0 as of Oct 25/2018 various kernels all at once\n\n# DATE: Oct 28 2018.\n\n# NOTE: From comment #61 at: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/522998\n\nTMPLIST=/tmp/xhci-dev-list\n\n# Original script was: case \"${1}\" in hibernate|suspend)\n\ncase $1/$2 in\n pre/*)\n echo \"$0: Going to $2...\"\n echo -n \'\' > $TMPLIST\n for i in `ls /sys/bus/pci/drivers/xhci_hcd/ | egrep \'[0-9a-z]+:[0-9a-z]+:.*$\'`; do\n # Unbind xhci_hcd for first device XXXX:XX:XX.X:\n echo -n \"$i\" | tee /sys/bus/pci/drivers/xhci_hcd/unbind\n echo \"$i\" >> $TMPLIST\n done\n ;;\n post/*)\n echo \"$0: Waking up from $2...\"\n for i in `cat $TMPLIST`; do\n # Bind xhci_hcd for first device XXXX:XX:XX.X:\n echo -n \"$i\" | tee /sys/bus/pci/drivers/xhci_hcd/bind\n done\n rm $TMPLIST\n ;;\nesac\n```\n添加执行权限
\n\n```\nsudo chmod a+x /lib/systemd/system-sleep/custom-xhci_hcd\n```') document.getElementById('render_787').innerHTML = htmlText setTimeout( ()=>{ console.log("delay render mathjax",MathJax) MathJax.Hub.Config({ tex2jax: { inlineMath: [['$', '$'], ['\\(', '\\)']] } }); // entry-content是文章页的内容div的class console.log(589) var math = document.getElementById('render_589')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(51) var math = document.getElementById('render_51')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(53) var math = document.getElementById('render_53')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(55) var math = document.getElementById('render_55')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(56) var math = document.getElementById('render_56')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(57) var math = document.getElementById('render_57')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(58) var math = document.getElementById('render_58')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(60) var math = document.getElementById('render_60')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(61) var math = document.getElementById('render_61')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(62) var math = document.getElementById('render_62')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(67) var math = document.getElementById('render_67')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(68) var math = document.getElementById('render_68')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(81) var math = document.getElementById('render_81')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(96) var math = document.getElementById('render_96')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(153) var math = document.getElementById('render_153')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(191) var math = document.getElementById('render_191')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(196) var math = document.getElementById('render_196')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(223) var math = document.getElementById('render_223')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(225) var math = document.getElementById('render_225')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(351) var math = document.getElementById('render_351')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(509) var math = document.getElementById('render_509')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(787) var math = document.getElementById('render_787')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); },2000 ) });
默认分类 历史版本:
上次修改时间:
mingw和cygwin的本质区别 历史版本:
上次修改时间: 2019-10-07 14:20:18
base64编解码原理 历史版本:
上次修改时间: 2019-10-07 14:20:18
makefile中的自动依赖规则 历史版本:
上次修改时间: 2021-11-11 16:46:29
matlab学习 历史版本:
上次修改时间: 2019-10-07 14:20:18
浏览器显示数学公式的方案 历史版本:
上次修改时间: 2019-10-07 14:20:18
开源软件协议比较 历史版本:
上次修改时间: 2019-10-07 14:20:18
QT WINDOWS编译Webkit和webengine 历史版本:
上次修改时间: 2021-01-21 00:54:49
ActiveX控件调试 历史版本:
上次修改时间: 2021-01-21 00:54:49
DirectShow 学习笔记 历史版本:
上次修改时间: 2021-01-21 00:54:49
windows 下iocp网络编程模型 历史版本:
上次修改时间: 2021-01-21 00:54:49
各种型号单片机的IO口输入阻抗测试 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++工程构建指南 历史版本:
上次修改时间: 2021-01-21 00:54:49
ATX电源接口说明 历史版本:
上次修改时间: 2021-01-21 00:54:49
找工作投递简历流程 历史版本:
上次修改时间: 2021-01-21 00:54:49
mysql 存储过程进行模糊搜索 历史版本:
上次修改时间: 2021-01-21 00:54:49
mingw下库multi defination冲突的解决方法 历史版本:
上次修改时间: 2021-01-21 00:54:49
简单服务器的部署方法 历史版本:
上次修改时间: 2021-01-21 00:54:49
mysql 的简单备份策略 历史版本:
上次修改时间: 2021-01-21 00:54:49
sitemap.xml 历史版本:
上次修改时间: 2021-01-21 15:55:35
UML类图 历史版本:
上次修改时间: 2021-10-20 17:06:20
ubuntu laptop无法休眠的解决方式 历史版本:
上次修改时间: 2023-02-28 21:27:25
0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image